PHP_VERSION, 'version_id' => PHP_VERSION_ID, 'sapi' => PHP_SAPI])); } if (PHP_VERSION_ID < 80100) { Phar::mapPhar('contao-manager.phar'); @include 'phar://contao-manager.phar/downgrade.php'; die(''); } if (function_exists('date_default_timezone_set') && function_exists('date_default_timezone_get')) { date_default_timezone_set(@date_default_timezone_get()); } if ('cli' === PHP_SAPI || !isset($_SERVER['REQUEST_URI'])) { Phar::mapPhar('contao-manager.phar'); require 'phar://contao-manager.phar/api/console'; } else { function rewrites() { // The function argument is unreliable across servers, Nginx for example is always empty list(,$url) = explode(basename(__FILE__), $_SERVER['REQUEST_URI'], 2); if (strpos($url, '..')) { return false; } if ('' === $url) { header('Location: /'.basename(__FILE__).'/'); exit; } if (0 === strpos($url, '/api/')) { return '/dist/api.php'.$url; } if (!empty($url) && is_file('phar://'.__FILE__.'/dist'.$url)) { return '/dist'.$url; } return '/dist/index.html'; } Phar::webPhar( null, 'index.html', null, array( 'log' => 'text/plain', 'txt' => 'text/plain', 'php' => Phar::PHP, // parse as PHP 'css' => 'text/css', 'gif' => 'image/gif', 'html' => 'text/html', 'ico' => 'image/x-ico', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'js' => 'application/x-javascript', 'png' => 'image/png', 'svg' => 'image/svg+xml', 'json' => 'application/json' ), 'rewrites' ); } __HALT_COMPILER(); ?> -'À.box/bin/check-requirements.phpëyKAhë^ʨ¤.box/.requirements.phpfyKAhf[X’¤.box/vendor/autoload.php²yKAh²s¯¤ ¤,.box/vendor/composer/autoload_namespaces.php•yKAh•tÛ!פ.box/vendor/composer/LICENSE.yKAh. Õ¤$.box/vendor/composer/ClassLoader.phpÄ>yKAhÄ>Æ5Ky¤&.box/vendor/composer/autoload_psr4.php6yKAh60Ó¤*.box/vendor/composer/autoload_classmap.php, yKAh, ¹Ó½Ç¤(.box/vendor/composer/autoload_static.phpKyKAhK ¥¡?¤&.box/vendor/composer/autoload_real.phpyKAhÁyi\¤..box/vendor/composer/semver/src/Comparator.phpuyKAhu 74¤*.box/vendor/composer/semver/src/Semver.php„yKAh„¹×¯®¤1.box/vendor/composer/semver/src/VersionParser.phpÄ9yKAhÄ9ÑWz ¤B.box/vendor/composer/semver/src/Constraint/ConstraintInterface.php‰yKAh‰޽wQ¤>.box/vendor/composer/semver/src/Constraint/MultiConstraint.php~yKAh~5[çe¤9.box/vendor/composer/semver/src/Constraint/Constraint.php'&yKAh'&ÜØ`â¤.box/src/Terminal.php¸ yKAh¸ %V‰â¤.box/src/IO.php yKAh ™[l%¤!.box/src/IsExtensionFulfilled.phpvyKAhv'0§Ò¤.box/src/Checker.phpÄyKAhć)W>¤".box/src/IsPhpVersionFulfilled.phpúyKAhúî!83¤".box/src/RequirementCollection.phpÂyKAhÂWbÈ?¤.box/src/Printer.phpÉ yKAhÉ )8AV¤.box/src/IsFulfilled.phpvyKAhvº%*H¤.box/src/Requirement.phpmyKAhmÀ€B¤LICENSEãyKAhãpä¤dist/index.htmlH'yKAhH'à?ì¤dist/api.php--ÚyKAhÚãL|R¤dist/css/367.25211792.csslyKAhlAޤdist/css/522.44f2aba0.cssOyKAhOo­¤dist/css/app.78aea309.cssUÎyKAhUÎÄÇõ¤dist/css/909.2589534e.css yKAh ¤dist/css/782.eb3ccfd5.cssi?yKAhi?WqŽŽ¤dist/css/335.e18cb2b2.css—yKAh—26&©¤dist/css/826.11002f25.css–yKAh–+ޤdist/css/380.93b3a21a.css0yKAh0Á G¤dist/css/904.3a60e65a.cssØyKAhØi_ûÓ¤#dist/css/chunk-vendors.4e650cae.cssïsyKAhïs -¤dist/js/523.024d09d8.jsyKAhÄ ’¤dist/js/28.ec57a4f8.js­wyKAh­wIg‘0¤dist/js/60.63bbe8ae.jsI"yKAhI"ÔH[¤dist/js/477.5046f228.js§yKAh§|¶ô¤dist/js/553.7da028f7.jsgœyKAhgœ N^¤dist/js/551.f5fd138e.js·ÅyKAh·ÅZ±î¤dist/js/194.520ccb65.jsyKAhÁøÛΤdist/js/638.ebc81223.jsa¥yKAha¥aþ¡¤dist/js/851.de2537b9.jsˆ¨yKAhˆ¨´¯Qª¤dist/js/120.75250efe.jsÇyKAhÇvä"½¤dist/js/540.7447dfbb.jsÌ«yKAhÌ«££…¤dist/js/904.dbbbfcc5.js6yKAh6¦V¤dist/js/560.d7cbad40.js¤yKAh¤¹ú/Ò¤dist/js/335.5446ec61.jso yKAho LÜÞ¤dist/js/367.5add6572.js_ yKAh_ {†¤dist/js/542.2a7ece7e.jsN yKAhN EJˤdist/js/874.fcb753e0.jscyKAhcj5ͤdist/js/180.03013187.js&yKAh&Üɤdist/js/716.2fcdd2df.js˜yKAh˜­1¸¤dist/js/474.01393a50.jsùMyKAhùMù’¾­¤dist/js/643.b4e0291b.js¢yKAh¢žôZ0¤dist/js/557.32851d13.jsæyKAhæ<d¤dist/js/826.3d9d8358.jsÏ,yKAhÏ,Vê[ø¤dist/js/139.aa9cf5f9.js¦UyKAh¦Ux0L6¤!dist/js/chunk-vendors.65173aa8.js¿PyKAh¿PB¹¤(dist/img/button-maintenance.93830369.svgEyKAhEOæÀ¤$dist/img/create-project.b22522ee.svg«yKAh«Õ÷Ê…¤)dist/img/button-incompatible.3eb2b686.svgÅyKAhÅ/$¤#dist/img/document-root.0e6dd2e4.svgÝyKAh݃÷D¤'dist/img/search-by-algolia.72f0ac9a.svgôyKAhô¶‘Фdist/img/boot.92149bf5.svgyKAhSoè¤#dist/img/button-search.44ce1d4b.svgLyKAhLw¤dist/img/oauth.1243e742.svg.yKAh.@” ¤dist/img/private.a1c65662.svgyKAh_50w¤%dist/img/button-download.e1ba6f25.svg1yKAh1ÄåO#¤dist/img/person.00d78897.svgòyKAhòÊw–*¤)dist/img/widget-checkbox--on.8b830157.svgÿyKAhÿÈ#ƒ;¤!dist/img/button-lock.98988f08.svgcyKAhc5=6z¤"dist/img/button-check.7a3b5ada.svg³yKAh³­]ÆR¤dist/img/user.129e863d.svgïyKAhïÑcǤdist/img/offline.0c23d1ce.svgçyKAhçУ-š¤$dist/img/button-passkey.3806f98a.svg=yKAh=É}þ¤(dist/img/symfony-logo--dark.ea265042.svg yKAh ˜æº¤#dist/img/private--dark.41b90022.svgyKAhbæþö¤&dist/img/button-cloud-off.dd8ba18e.svgäyKAhäÁÜ¡<¤"dist/img/button-power.298a8072.svg6yKAh6KbÙê¤%dist/img/downloads--dark.034bf7a3.svg-yKAh-‰ã Ǥ"dist/img/button-trash.855f57fa.svgtyKAhtï2¥}¤ dist/img/link-blank.eb57b3fa.svgÞyKAhÞf½Ë^¤&dist/img/button-clipboard.9ef63d39.svgJyKAhJ£v,N¤'dist/img/widget-radio--off.4e93f443.svgyKAhùà¤dist/img/task.e9e5333f.svg{yKAh{J‚l“¤#dist/img/button-update.ad79c617.svg\yKAh\§øÄ®¤dist/img/hint.ba2ac97e.svg!yKAh!©ô¤!dist/img/button-hide.d23f6533.svg¢yKAh¢mè3(¤dist/img/database.7f0a8c49.svgƒyKAhƒ<ÁÛ ¤dist/img/updated.3b47bebb.svgHyKAhHʦý¤$dist/img/language--dark.a24e849e.svgxyKAhxG7‚?¤!dist/img/button-save.3b5224de.svg yKAh ±™ð¤dist/img/lock.3c42a55f.svgfyKAhfgGæ¤$dist/img/button-details.8ce780e9.svg†yKAh†¼`¾¤dist/img/downloads.c1db2a9e.svg0yKAh0‰æ¤"dist/img/color_scheme.d527d153.svgÝyKAhÝt¶šé¤dist/img/recovery.70ee118a.svg´yKAh´OTM`¤#dist/img/button-upload.ca8e9cfc.svg3yKAh30UËä¤!dist/img/button-edit.40a4be06.svgyKAh!›.¤&dist/img/link-blank--dark.07eeaee6.svgÛyKAhÛB¨¤|¤dist/img/funding.cf78a0a0.svgJyKAhJ’`1_¤#dist/img/button-unlock.51b76e07.svgiyKAhiŠ †¤dist/img/php-logo.7376e212.svgš yKAhš k9q¶¤#dist/img/updated--dark.c21fdd5b.svgEyKAhEéEy¤"dist/img/button-cloud.bc42f267.svg”yKAh”I[®¤"dist/img/favers--dark.4765f7d4.svgEyKAhE±Êä¤!dist/img/button-more.e3eb2622.svgyKAh°þv¤dist/img/language.582b2920.svg{yKAh{ÙtWþ¤&dist/img/widget-radio--on.181461b6.svg:yKAh:j Mº¤$dist/img/button-console.05dcdfc4.svgÞyKAhÞ>y÷¤(dist/img/color_scheme--dark.ef0f0aed.svg:yKAh:<ž›¤!dist/img/button-gear.a2dc1f09.svgyKAh«0õ¤dist/img/sad.c7de6e95.svg5yKAh5âh´í¤ dist/img/button-run.b6310c5a.svgyKAh¤¤Ý¤dist/img/close.8b27dbcb.svgêyKAhê½e¤"dist/img/link-funding.b25cd92d.svgyKAhPÀÔ¤*dist/img/widget-checkbox--off.73856538.svgßyKAhßæž~¤(dist/icons/task-active/favicon-16x16.png3yKAh3Kº¤"dist/icons/task-active/favicon.icoî:yKAhî:ó¦¶8¤(dist/icons/task-active/favicon-32x32.pngFyKAhFè)fx¤'dist/icons/task-error/favicon-16x16.png;yKAh;‚ºö¤!dist/icons/task-error/favicon.icoî:yKAhî:Ôuœ®¤'dist/icons/task-error/favicon-32x32.pngByKAhBû’¤)dist/icons/task-success/favicon-16x16.pngUyKAhU{¬´Ø¤#dist/icons/task-success/favicon.icoî:yKAhî:TI‚m¤)dist/icons/task-success/favicon-32x32.pngqyKAhq?.¤ dist/api.phpyKAhC쾤dist/assets/favicon-16x16.png•yKAh•éÓ ¤dist/assets/mstile-310x310.png%yKAh%ŸxÂH¤&dist/assets/android-chrome-384x384.png¯%yKAh¯%1| &¤3dist/assets/apple-touch-startup-image-1125x2436.png¸¬yKAh¸¬õøï5¤2dist/assets/apple-touch-startup-image-1792x828.pngåŒyKAh匜8QÀ¤2dist/assets/apple-touch-startup-image-1334x750.png}yyKAh}yÔ´¾—¤dist/assets/mstile-144x144.png yKAh Ê‹¢¤3dist/assets/apple-touch-startup-image-1290x2796.pnguÊyKAhuÊâ^v¤dist/assets/favicon.ico‚yKAh‚}*~¤(dist/assets/apple-touch-icon-120x120.png yKAh À¤3dist/assets/apple-touch-startup-image-2732x2048.pngƒyKAhƒ.uøE¤&dist/assets/android-chrome-192x192.png3yKAh3®'\²¤ dist/assets/apple-touch-icon.pngùyKAhù:Ð5¨¤3dist/assets/apple-touch-startup-image-1242x2688.png&ÆyKAh&Æ€:Pg¤&dist/assets/android-chrome-256x256.pnghyKAhhjÇ't¤3dist/assets/apple-touch-startup-image-2436x1125.png©ÌyKAh©Ì£ÿ5x¤dist/assets/mstile-70x70.png¿yKAh¿eݺ=¤2dist/assets/apple-touch-startup-image-640x1136.pngÔPyKAhÔPŸnå¤3dist/assets/apple-touch-startup-image-1170x2532.png@¶yKAh@¶ á˨¤*dist/assets/apple-touch-icon-1024x1024.pngr|yKAhr|±ÏT¤(dist/assets/apple-touch-icon-152x152.pngÅ yKAhÅ Áo¤3dist/assets/apple-touch-startup-image-1620x2160.pngbéyKAhbéREž…¤3dist/assets/apple-touch-startup-image-1668x2388.pngÞøyKAhÞø£êôI¤2dist/assets/apple-touch-startup-image-828x1792.pngvyKAhvè‰>H¤3dist/assets/apple-touch-startup-image-2048x1536.pngnyKAhnxEy¶¤(dist/assets/apple-touch-icon-180x180.pngùyKAhù:Ð5¨¤(dist/assets/yandex-browser-manifest.json€yKAh€ºp#Ȥ3dist/assets/apple-touch-startup-image-1640x2160.pngvíyKAhvíâapi/Resources/cache/ContainerLaZhPOO/getEnvironmentService.phpíyKAhíHS3¤Tapi/Resources/cache/ContainerLaZhPOO/getSecurity_Listener_UserChecker_ApiService.phpyKAhaQ¤Capi/Resources/cache/ContainerLaZhPOO/getServicesResetterService.php~yKAh~Êä~¤eapi/Resources/cache/ContainerLaZhPOO/getCache_SecurityIsGrantedAttributeExpressionLanguageService.php‘yKAh‘W$$º¤Dapi/Resources/cache/ContainerLaZhPOO/getOpcacheControllerService.php·yKAh·!2ì¤Papi/Resources/cache/ContainerLaZhPOO/getConsole_Command_AssetsInstallService.phpµyKAhµÙ+î¤Qapi/Resources/cache/ContainerLaZhPOO/getSerializer_Mapping_CacheWarmerService.phpyKAhª¯b¤Eapi/Resources/cache/ContainerLaZhPOO/getLoginAuthenticatorService.php´yKAh´á´yB¤Oapi/Resources/cache/ContainerLaZhPOO/getSecurity_EventDispatcher_ApiService.php&yKAh&€Ôü˜¤?api/Resources/cache/ContainerLaZhPOO/getCache_SystemService.phpyKAh¢Nþ1¤Aapi/Resources/cache/ContainerLaZhPOO/getMonolog_LoggerService.phpÕyKAhÕ>l¿¤Xapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_CachePoolDelete_LazyService.php+yKAh+âš ’¤Japi/Resources/cache/ContainerLaZhPOO/getMonolog_Logger_SecurityService.phpÁyKAhÁáB‹ç¤@api/Resources/cache/ContainerLaZhPOO/getUpdateCommandService.php‘yKAh‘4÷µª¤Qapi/Resources/cache/ContainerLaZhPOO/getDebug_ErrorHandlerConfiguratorService.php\yKAh\vX7©¤Iapi/Resources/cache/ContainerLaZhPOO/getTaskDeleteCommand_LazyService.phpøyKAhøÜäþ¤Uapi/Resources/cache/ContainerLaZhPOO/getSecurity_Access_AuthenticatedVoterService.phpLyKAhL½º¤?api/Resources/cache/ContainerLaZhPOO/getProcessCheckService.php yKAh „žÃ!¤Dapi/Resources/cache/ContainerLaZhPOO/getSessionControllerService.php¼yKAh¼‹¾Y¤Vapi/Resources/cache/ContainerLaZhPOO/getSecurity_Listener_PasswordMigratingService.php$yKAh$¤Aapi/Resources/cache/ContainerLaZhPOO/getSelfUpdateTaskService.php*yKAh*X•D­¤Xapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_SerializerDebug_LazyService.phpyKAh£Ûð¤Fapi/Resources/cache/ContainerLaZhPOO/getCache_GlobalClearerService.phpnyKAhn!™¹ ¤>api/Resources/cache/ContainerLaZhPOO/getTaskManagerService.php· yKAh· ç ÏN¤Hapi/Resources/cache/ContainerLaZhPOO/getConsole_ErrorListenerService.phpyKAh­µö¤Kapi/Resources/cache/ContainerLaZhPOO/getUploadPackagesControllerService.phpÂyKAh‘¼¤<api/Resources/cache/ContainerLaZhPOO/getContaoApiService.php^yKAh^îºÄî¤Capi/Resources/cache/ContainerLaZhPOO/getMemoryLimitCheckService.phpyKAhcY«w¤Wapi/Resources/cache/ContainerLaZhPOO/get_Security_Command_DebugFirewall_LazyService.php+yKAh+ pí¤Bapi/Resources/cache/ContainerLaZhPOO/getSysTempDirCheckService.phpyKAhż°i¤Vapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_SecretsRemove_LazyService.phpyKAhD"·`¤_api/Resources/cache/ContainerLaZhPOO/getArgumentResolver_QueryParameterValueResolverService.phpéyKAhé‹qp¤Iapi/Resources/cache/ContainerLaZhPOO/getTaskUpdateCommand_LazyService.phpyKAh’QLj¤Capi/Resources/cache/ContainerLaZhPOO/getConfigControllerService.php¨yKAh¨µk/¤=api/Resources/cache/ContainerLaZhPOO/getSelfUpdateService.phpyKAhâÄ`Á¤Capi/Resources/cache/ContainerLaZhPOO/getTaskAbortCommandService.php®yKAh®‹Nø¤@api/Resources/cache/ContainerLaZhPOO/getCloudResolverService.php”yKAh”̺Š~¤^api/Resources/cache/ContainerLaZhPOO/get_Console_Command_SecretsDecryptToLocal_LazyService.php|yKAh|Ptµú¤Fapi/Resources/cache/ContainerLaZhPOO/getAccessKeyControllerService.php:yKAh:Ú#û¤Sapi/Resources/cache/ContainerLaZhPOO/getPropertyInfo_SerializerExtractorService.php$yKAh$€jÞ`¤?api/Resources/cache/ContainerLaZhPOO/getUserProviderService.phpòyKAhò†ú*e¤Capi/Resources/cache/ContainerLaZhPOO/getPhpWebControllerService.phpJyKAhJËæ̤Dapi/Resources/cache/ContainerLaZhPOO/getAboutCommand_LazyService.phpâyKAhâ"¤Papi/Resources/cache/ContainerLaZhPOO/getConsole_Command_ContainerLintService.php<yKAh<Ïr¨©¤Napi/Resources/cache/ContainerLaZhPOO/get_Console_Command_About_LazyService.phpÔyKAhÔܪoÛ¤Tapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_RouterMatch_LazyService.phpyKAh.Œš\¤=api/Resources/cache/ContainerLaZhPOO/getTranslatorService.phpÌyKAḣé¤Gapi/Resources/cache/ContainerLaZhPOO/getSelfUpdateControllerService.phpÆyKAhÆldgµ¤Kapi/Resources/cache/ContainerLaZhPOO/getSecurity_ChannelListenerService.phpÑyKAhѧ¤Lapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_VariadicService.phpžyKAhž+=<[¤Dapi/Resources/cache/ContainerLaZhPOO/getManagerControllerService.php7yKAh7cNr¤Capi/Resources/cache/ContainerLaZhPOO/getBackupControllerService.phpÆyKAhÆ¢?¤Bapi/Resources/cache/ContainerLaZhPOO/getSecurity_HelperService.php;yKAh;r·‹L¤Qapi/Resources/cache/ContainerLaZhPOO/getSecurity_Listener_UserProviderService.phpyKAhß³8¤Qapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_YamlLint_LazyService.phpöyKAhö‘aÈ+¤@api/Resources/cache/ContainerLaZhPOO/getSecrets_VaultService.phpEyKAhEi:šÇ¤Vapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_ConfigDumpReferenceService.phpNyKAhNbµGɤNapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_CacheWarmupService.phpSyKAhSX# ¤Uapi/Resources/cache/ContainerLaZhPOO/getSecurity_Access_RoleHierarchyVoterService.php*yKAh*äD¤Tapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_RequestAttributeService.phpÈyKAhÈêä4¤Capi/Resources/cache/ContainerLaZhPOO/getBackupCreateTaskService.phpGyKAhG.ì—þ¤Lapi/Resources/cache/ContainerLaZhPOO/getProcessRunnerCommand_LazyService.phpyKAhRž|³¤Rapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_CachePoolDeleteService.phptyKAht—‘œ¤Bapi/Resources/cache/ContainerLaZhPOO/getCloudControllerService.phpÒ yKAhÒ M$_ˆ¤<api/Resources/cache/ContainerLaZhPOO/getSetupTaskService.phpXyKAhX ñ;¤Sapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_SecretsSet_LazyService.phpòyKAhò ÅPº¤Eapi/Resources/cache/ContainerLaZhPOO/getTemplateControllerService.php¾yKAh¾nYaI¤Zapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_CachePoolInvalidateTagsService.php§yKAh§VcÓ¤]api/Resources/cache/ContainerLaZhPOO/get_Console_Command_EventDispatcherDebug_LazyService.phpgyKAhgìÊ!k¤Vapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_CachePoolList_LazyService.phpyKAh&²œÊ¤Wapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_EventDispatcherDebugService.php½yKAh½`‡¤Kapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_ServiceService.phpÏyKAhÏDü-¤`api/Resources/cache/ContainerLaZhPOO/get_Console_Command_CachePoolInvalidateTags_LazyService.phpˆyKAhˆ#RS¤Tapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_CacheWarmup_LazyService.phpøyKAhøÆçÆÖ¤Fapi/Resources/cache/ContainerLaZhPOO/getCache_SystemClearerService.phpyKAhº÷•©¤Japi/Resources/cache/ContainerLaZhPOO/get_ServiceLocator_BvkMlPlService.phpPyKAhP÷æ:«¤Gapi/Resources/cache/ContainerLaZhPOO/getMonolog_Logger_TasksService.phpµyKAhµ¯E¾Š¤Fapi/Resources/cache/ContainerLaZhPOO/getAdminUserControllerService.phpByKAhBnYì ¤Hapi/Resources/cache/ContainerLaZhPOO/getIntegrityCheckCommandService.phpÞyKAhÞ¸mY¤Vapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_AssetsInstall_LazyService.php)yKAh).z¶3¤[api/Resources/cache/ContainerLaZhPOO/getSecurity_Firewall_EventDispatcherLocatorService.php¡yKAh¡¶“H©¤Rapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_SerializerDebugService.php¬yKAh¬ä#©—¤Eapi/Resources/cache/ContainerLaZhPOO/getPhpExtensionsCheckService.php(yKAh(oÑ]¤Kapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_DefaultService.php™yKAh™X5ù•¤Aapi/Resources/cache/ContainerLaZhPOO/getAuthControllerService.php…yKAh…µUdð¤Lapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_DatetimeService.phpÑyKAhÑ9’½ ¤Gapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_UidService.php…yKAh…Ùbƒ¤Lapi/Resources/cache/ContainerLaZhPOO/getInstallToolLockControllerService.phpyKAh83¤Eapi/Resources/cache/ContainerLaZhPOO/getUpdateCommand_LazyService.phpÛyKAhÛ.rF¤Eapi/Resources/cache/ContainerLaZhPOO/getComposerControllerService.php>yKAh>´G)¤Kapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_SessionService.php™yKAh™ ¤>api/Resources/cache/ContainerLaZhPOO/getCacheWarmerService.php€yKAh€q †¤Eapi/Resources/cache/ContainerLaZhPOO/getRedirectControllerService.php—yKAh—MÜØ’¤@api/Resources/cache/ContainerLaZhPOO/getUploadsConfigService.phpyKAhú7ƒV¤Napi/Resources/cache/ContainerLaZhPOO/getDatabaseMigrationControllerService.php=yKAh=´«Rê¤Kapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_YamlLintService.php yKAh xBYJ¤Gapi/Resources/cache/ContainerLaZhPOO/getConfigBuilder_WarmerService.phpyKAhf­ƒ¤Lapi/Resources/cache/ContainerLaZhPOO/getPasswordlessAuthenticatorService.php×yKAh×Þì"¤Aapi/Resources/cache/ContainerLaZhPOO/getClearCacheTaskService.phpEyKAhEûr²Î¤Hapi/Resources/cache/ContainerLaZhPOO/getRootPackageControllerService.phpQyKAhQq€[ê¤Eapi/Resources/cache/ContainerLaZhPOO/getCache_App_TaggableService.php•yKAh•c&o¤@api/Resources/cache/ContainerLaZhPOO/getContaoConsoleService.php yKAh [{á¤@api/Resources/cache/ContainerLaZhPOO/getManagerConfigService.phpyKAhW¾ç%¤Mapi/Resources/cache/ContainerLaZhPOO/getSecurity_UserValueResolverService.phpyKAhÒÓ#¤Xapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_DebugAutowiring_LazyService.php8yKAh8™¿api/Resources/cache/ContainerLaZhPOO/getInstallTaskService.php#yKAh#¾2¿b¤Tapi/Resources/cache/ContainerLaZhPOO/getContainer_EnvVarProcessorsLocatorService.php yKAh 3tv8¤Dapi/Resources/cache/ContainerLaZhPOO/getExceptionListenerService.phpyKAhgÎÊ®¤?api/Resources/cache/ContainerLaZhPOO/getSymlinkCheckService.php°yKAh°ìCIÙ¤:api/Resources/cache/ContainerLaZhPOO/getRequestService.php¯yKAh¯tXy.¤?api/Resources/cache/ContainerLaZhPOO/getSessionCheckService.php yKAh §Iòs¤Lapi/Resources/cache/ContainerLaZhPOO/getMissingPackagesControllerService.phpeyKAhe,¥Çb¤Uapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_SecretsGenerateKeyService.php8yKAh8/ç¤=api/Resources/cache/ContainerLaZhPOO/getUpdateTaskService.phpàyKAhଦö¤Tapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_SecretsList_LazyService.phpòyKAhò}€ O¤Aapi/Resources/cache/ContainerLaZhPOO/getComposerConfigService.php yKAh =pçï¤Zapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_SecretsEncryptFromLocalService.php`yKAh`}ƒû¤Japi/Resources/cache/ContainerLaZhPOO/getSecurity_AccessListenerService.phpÞyKAhÞŠŠû!¤Qapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_CachePoolPruneService.phpÆyKAhÆORyé¤Zapi/Resources/cache/ContainerLaZhPOO/get_Security_Command_UserPasswordHash_LazyService.php6yKAh6[Çè¤Napi/Resources/cache/ContainerLaZhPOO/getSecurity_RouteLoader_LogoutService.phpyKAh⩪o¤Tapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_ConfigDebug_LazyService.phpyKAhB™xޤEapi/Resources/cache/ContainerLaZhPOO/getDatabaseControllerService.php¸yKAh¸:|RV¤Xapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_SecretsDecryptToLocalService.phpdyKAhdšÈ¸¤Japi/Resources/cache/ContainerLaZhPOO/getLocalPackagesControllerService.php[yKAh[«–ä2¤?api/Resources/cache/ContainerLaZhPOO/getAboutCommandService.phpÚyKAhÚÁ†,Á¤Hapi/Resources/cache/ContainerLaZhPOO/getTaskAbortCommand_LazyService.phpþyKAhþAž‘(¤Vapi/Resources/cache/ContainerLaZhPOO/getSecurity_SecurityTokenValueResolverService.php@yKAh@ŒSÀ¤Eapi/Resources/cache/ContainerLaZhPOO/getTokenAuthenticatorService.php’yKAh’€èx¤Rapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_DebugAutowiringService.phpÊyKAhÊŠ€u¤=api/Resources/cache/ContainerLaZhPOO/getServerInfoService.phpƒyKAhƒ¡R•=¤Napi/Resources/cache/ContainerLaZhPOO/getConsole_Command_RouterMatchService.php›yKAh›?ú7¤Mapi/Resources/cache/ContainerLaZhPOO/getIntegrityCheckCommand_LazyService.phpyKAh#»3¤Japi/Resources/cache/ContainerLaZhPOO/get_ServiceLocator_AH5O6SdService.phphyKAhh…s¤Bapi/Resources/cache/ContainerLaZhPOO/getErrorControllerService.phpäyKAh䡨ÿϤJapi/Resources/cache/ContainerLaZhPOO/get_ServiceLocator_EZsc_DOService.phpbyKAhb$þh"¤Sapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_CacheClear_LazyService.phpèyKAhè\’5¤Kapi/Resources/cache/ContainerLaZhPOO/getArgumentResolver_RequestService.php™yKAh™ÌF¤Papi/Resources/cache/ContainerLaZhPOO/RequestPayloadValueResolverGhost8d82153.phpXyKAhXŠè¬­¤Hapi/Resources/cache/ContainerLaZhPOO/getConsole_Command_AboutService.phpòyKAhòÀÊ.M¤Capi/Resources/cache/ContainerLaZhPOO/getDumpAutoloadTaskService.phpOyKAhOdÖ¸¤Vapi/Resources/cache/ContainerLaZhPOO/get_Console_Command_ContainerLint_LazyService.php8yKAh8u+D®¤Napi/Resources/cache/ContainerLaZhPOO/getConsole_Command_ConfigDebugService.phpyKAhZêy/¤@api/Resources/cache/Symfony/Config/Framework/HttpCacheConfig.php #yKAh # 1·¤Fapi/Resources/cache/Symfony/Config/Framework/Webhook/RoutingConfig.phpvyKAhvj3Ææ¤<api/Resources/cache/Symfony/Config/Framework/CacheConfig.php$yKAh$ˆÜ"¤@api/Resources/cache/Symfony/Config/Framework/FragmentsConfig.php› yKAh› [b¤Japi/Resources/cache/Symfony/Config/Framework/Form/CsrfProtectionConfig.phpºyKAhº7eG‹¤Papi/Resources/cache/Symfony/Config/Framework/HttpClient/DefaultOptionsConfig.phpxEyKAhxE^Me¤iapi/Resources/cache/Symfony/Config/Framework/HttpClient/ScopedClientConfig/RetryFailed/HttpCodeConfig.php¶yKAh¶ˆºŒ“¤dapi/Resources/cache/Symfony/Config/Framework/HttpClient/ScopedClientConfig/PeerFingerprintConfig.php yKAh ’êEú¤`api/Resources/cache/Symfony/Config/Framework/HttpClient/ScopedClientConfig/RetryFailedConfig.phpÐyKAhРÛÖ#¤Napi/Resources/cache/Symfony/Config/Framework/HttpClient/ScopedClientConfig.php4SyKAh4SS¤eapi/Resources/cache/Symfony/Config/Framework/HttpClient/DefaultOptions/RetryFailed/HttpCodeConfig.php²yKAh²„,@Ϥ`api/Resources/cache/Symfony/Config/Framework/HttpClient/DefaultOptions/PeerFingerprintConfig.phpþ yKAhþ !j¤\api/Resources/cache/Symfony/Config/Framework/HttpClient/DefaultOptions/RetryFailedConfig.php°yKAh°•=q¤Iapi/Resources/cache/Symfony/Config/Framework/Serializer/MappingConfig.phpFyKAhF§$¶v¤Aapi/Resources/cache/Symfony/Config/Framework/ValidationConfig.phpº(yKAhº(iù¤Bapi/Resources/cache/Symfony/Config/Framework/RateLimiterConfig.phpø yKAhø ã¥Ô¤Uapi/Resources/cache/Symfony/Config/Framework/RateLimiter/LimiterConfig/RateConfig.phpmyKAhm$†S¤¤Japi/Resources/cache/Symfony/Config/Framework/RateLimiter/LimiterConfig.phpÝyKAh݃9§¤Aapi/Resources/cache/Symfony/Config/Framework/Cache/PoolConfig.phpyKAh-.-í¤Aapi/Resources/cache/Symfony/Config/Framework/SerializerConfig.phpÜyKAhÜ`o„”¤Eapi/Resources/cache/Symfony/Config/Framework/CsrfProtectionConfig.php7yKAh7gµ ¤=api/Resources/cache/Symfony/Config/Framework/AssetsConfig.php+yKAh+(ã¤Napi/Resources/cache/Symfony/Config/Framework/Notifier/AdminRecipientConfig.phpZyKAhZ´•¾¤@api/Resources/cache/Symfony/Config/Framework/MessengerConfig.phpe*yKAhe*½Âÿ]¤>api/Resources/cache/Symfony/Config/Framework/WebhookConfig.php yKAh &‡J¤=api/Resources/cache/Symfony/Config/Framework/RouterConfig.php­yKAh­¯Ç™w¤Aapi/Resources/cache/Symfony/Config/Framework/TranslatorConfig.php"yKAh"à f¤@api/Resources/cache/Symfony/Config/Framework/WorkflowsConfig.php‡ yKAh‡ ¤Ö ¤Japi/Resources/cache/Symfony/Config/Framework/Workflows/WorkflowsConfig.php~+yKAh~+”þó7¤[api/Resources/cache/Symfony/Config/Framework/Workflows/WorkflowsConfig/AuditTrailConfig.phpNyKAhNVü¥N¤]api/Resources/cache/Symfony/Config/Framework/Workflows/WorkflowsConfig/MarkingStoreConfig.php÷ yKAh÷ h”4¤[api/Resources/cache/Symfony/Config/Framework/Workflows/WorkflowsConfig/TransitionConfig.php]yKAh]Eg:¤Vapi/Resources/cache/Symfony/Config/Framework/Workflows/WorkflowsConfig/PlaceConfig.php±yKAh±’i:¨¤:api/Resources/cache/Symfony/Config/Framework/EsiConfig.php-yKAh- °5è¤>api/Resources/cache/Symfony/Config/Framework/WebLinkConfig.php1yKAh1çë¤Fapi/Resources/cache/Symfony/Config/Framework/Mailer/EnvelopeConfig.phpÑyKAhÑ“RÍò¤Dapi/Resources/cache/Symfony/Config/Framework/Mailer/HeaderConfig.php,yKAh,¸—lu¤:api/Resources/cache/Symfony/Config/Framework/SsiConfig.php-yKAh-Ä(æ ¤Tapi/Resources/cache/Symfony/Config/Framework/Translator/PseudoLocalizationConfig.php¨yKAh¨|ÿЊ¤Japi/Resources/cache/Symfony/Config/Framework/Translator/ProviderConfig.php yKAh ô„ܤ?api/Resources/cache/Symfony/Config/Framework/ProfilerConfig.phpÞyKAhÞpé¤@api/Resources/cache/Symfony/Config/Framework/SemaphoreConfig.phpyKAhR8¤>api/Resources/cache/Symfony/Config/Framework/SecretsConfig.phpyKAh|Ö1¤Eapi/Resources/cache/Symfony/Config/Framework/PropertyAccessConfig.php¶yKAh¶Sç½(¤Japi/Resources/cache/Symfony/Config/Framework/Messenger/TransportConfig.php‹yKAh‹ Û ž¤]api/Resources/cache/Symfony/Config/Framework/Messenger/Serializer/SymfonySerializerConfig.phpÿyKAhÿ+¸ì]¤Kapi/Resources/cache/Symfony/Config/Framework/Messenger/SerializerConfig.php­ yKAh­ OÙt¤^api/Resources/cache/Symfony/Config/Framework/Messenger/TransportConfig/RetryStrategyConfig.php?yKAh?[Tº¤Hapi/Resources/cache/Symfony/Config/Framework/Messenger/RoutingConfig.php]yKAh]ÂzT¤Uapi/Resources/cache/Symfony/Config/Framework/Messenger/BusConfig/MiddlewareConfig.php¤yKAh¤º•i¤\api/Resources/cache/Symfony/Config/Framework/Messenger/BusConfig/DefaultMiddlewareConfig.phpÍ yKAhÍ ãˆÔ¤Dapi/Resources/cache/Symfony/Config/Framework/Messenger/BusConfig.phpÛyKAhÛ˜ˆû¤Capi/Resources/cache/Symfony/Config/Framework/PropertyInfoConfig.php5yKAh5ƒÐ¤=api/Resources/cache/Symfony/Config/Framework/MailerConfig.php2yKAh2çÈßæ¤:api/Resources/cache/Symfony/Config/Framework/UidConfig.phpyKAhÕ¥æû¤Bapi/Resources/cache/Symfony/Config/Framework/RemoteeventConfig.php5yKAh5¬`¤Bapi/Resources/cache/Symfony/Config/Framework/AssetMapperConfig.phpY(yKAhY(Pm¤Dapi/Resources/cache/Symfony/Config/Framework/HtmlSanitizerConfig.php* yKAh* ?Ùý¤@api/Resources/cache/Symfony/Config/Framework/ExceptionConfig.phpOyKAhO¤×ì¤>api/Resources/cache/Symfony/Config/Framework/SessionConfig.php`2yKAh`2ÒÏó¤Napi/Resources/cache/Symfony/Config/Framework/HtmlSanitizer/SanitizerConfig.php9yKAh9®,—‹¤Aapi/Resources/cache/Symfony/Config/Framework/HttpClientConfig.phpmyKAhmÚï«â¤@api/Resources/cache/Symfony/Config/Framework/PhpErrorsConfig.php•yKAh•‹.m¤?api/Resources/cache/Symfony/Config/Framework/NotifierConfig.phpSyKAhS6 S2¤>api/Resources/cache/Symfony/Config/Framework/RequestConfig.phpgyKAhg›Ϊ¤Bapi/Resources/cache/Symfony/Config/Framework/AnnotationsConfig.phpš yKAhš c:¡Ä¤Eapi/Resources/cache/Symfony/Config/Framework/Assets/PackageConfig.php!yKAh!§óò`¤Xapi/Resources/cache/Symfony/Config/Framework/Validation/NotCompromisedPasswordConfig.php9yKAh9r9`ø¤Iapi/Resources/cache/Symfony/Config/Framework/Validation/MappingConfig.phpFyKAhFÒºå¤Mapi/Resources/cache/Symfony/Config/Framework/Validation/AutoMappingConfig.phpnyKAhnä}¤;api/Resources/cache/Symfony/Config/Framework/LockConfig.php•yKAh•ö$¤@api/Resources/cache/Symfony/Config/Framework/SchedulerConfig.php3yKAh3¬ëËä¤;api/Resources/cache/Symfony/Config/Framework/FormConfig.php– yKAh– Ü¥ì;¤Papi/Resources/cache/Symfony/Config/Security/ProviderConfig/Memory/UserConfig.phpÅyKAhÅ›ÜûK¤Iapi/Resources/cache/Symfony/Config/Security/ProviderConfig/LdapConfig.phpÜyKAhÜOÛK÷¤Kapi/Resources/cache/Symfony/Config/Security/ProviderConfig/MemoryConfig.phpOyKAhOÀ>¬]¤Japi/Resources/cache/Symfony/Config/Security/ProviderConfig/ChainConfig.php…yKAh…„y4¤Dapi/Resources/cache/Symfony/Config/Security/PasswordHasherConfig.phpªyKAhªj{쾤>api/Resources/cache/Symfony/Config/Security/ProviderConfig.php¸yKAh¸73ü¤>api/Resources/cache/Symfony/Config/Security/FirewallConfig.php&nyKAh&nöÛ ¤Papi/Resources/cache/Symfony/Config/Security/FirewallConfig/AccessTokenConfig.phpyKAh?Ç3õ¤Oapi/Resources/cache/Symfony/Config/Security/FirewallConfig/RememberMeConfig.php‰1yKAh‰1›ÚФNapi/Resources/cache/Symfony/Config/Security/FirewallConfig/FormLoginConfig.phpãAyKAhãAÇŒ¤Rapi/Resources/cache/Symfony/Config/Security/FirewallConfig/JsonLoginLdapConfig.php,*yKAh,*Exƒ¤Napi/Resources/cache/Symfony/Config/Security/FirewallConfig/HttpBasicConfig.phpyKAh¸jö£¤]api/Resources/cache/Symfony/Config/Security/FirewallConfig/AccessToken/TokenHandlerConfig.phpÖyKAhÖJ¤japi/Resources/cache/Symfony/Config/Security/FirewallConfig/AccessToken/TokenHandler/OidcUserInfoConfig.php½ yKAh½ ´öš¤bapi/Resources/cache/Symfony/Config/Security/FirewallConfig/AccessToken/TokenHandler/OidcConfig.phpÀyKAhÀ.}e¤Napi/Resources/cache/Symfony/Config/Security/FirewallConfig/JsonLoginConfig.phpÁyKAhÁ\¯ë¤Xapi/Resources/cache/Symfony/Config/Security/FirewallConfig/Logout/DeleteCookieConfig.phpÅyKAhÅ8xû¤Oapi/Resources/cache/Symfony/Config/Security/FirewallConfig/SwitchUserConfig.php® yKAh® j «a¤Tapi/Resources/cache/Symfony/Config/Security/FirewallConfig/LoginThrottlingConfig.php© yKAh© Ëø…>¤Napi/Resources/cache/Symfony/Config/Security/FirewallConfig/LoginLinkConfig.phpž3yKAhž3ï~1¤fapi/Resources/cache/Symfony/Config/Security/FirewallConfig/RememberMe/TokenProvider/DoctrineConfig.phpÛyKAhÛ…‹=¤]api/Resources/cache/Symfony/Config/Security/FirewallConfig/RememberMe/TokenProviderConfig.phpƒ yKAhƒ Èú¤Rapi/Resources/cache/Symfony/Config/Security/FirewallConfig/FormLoginLdapConfig.phpNNyKAhNNjïNö¤Rapi/Resources/cache/Symfony/Config/Security/FirewallConfig/HttpBasicLdapConfig.phpyKAhþB¤Iapi/Resources/cache/Symfony/Config/Security/FirewallConfig/X509Config.phpð yKAhð „I—è¤Oapi/Resources/cache/Symfony/Config/Security/FirewallConfig/RemoteUserConfig.php‘yKAh‘¸U8½¤Kapi/Resources/cache/Symfony/Config/Security/FirewallConfig/LogoutConfig.php#yKAh#°ß¤Kapi/Resources/cache/Symfony/Config/Security/AccessDecisionManagerConfig.php¼yKAh¼O´Ø^¤Capi/Resources/cache/Symfony/Config/Security/AccessControlConfig.php£yKAh£XºAL¤5api/Resources/cache/Symfony/Config/SecurityConfig.php 1yKAh 1Yð~ï¤4api/Resources/cache/Symfony/Config/MonologConfig.phpµyKAhµFŒF¤<api/Resources/cache/Symfony/Config/Monolog/HandlerConfig.phpÍ*yKAhÍ*šÌJ´¤Vapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/ProcessPsr3MessagesConfig.php÷ yKAh÷ å«ÞU¤Lapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/PublisherConfig.php" yKAh" ÓÏ-ý¤Hapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/RedisConfig.php±yKAh±Š×¢¤Papi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/ElasticsearchConfig.php—yKAh—!Ža¤Qapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/EmailPrototypeConfig.phpZyKAhZq:_¤Hapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/MongoConfig.phpÛyKAhÛí˜=o¤Rapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/VerbosityLevelsConfig.phpöyKAhö=1Þ¤Iapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/PredisConfig.php:yKAh:fý ɤSapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/ExcludedHttpCodeConfig.php~yKAh~µ4:T¤Kapi/Resources/cache/Symfony/Config/Monolog/HandlerConfig/ChannelsConfig.php¦yKAh¦ÿу˜¤6api/Resources/cache/Symfony/Config/FrameworkConfig.phpê'yKAhê'ÕoAþ¤#api/Resources/cache/annotations.map±yKAh±Ór³'¤"api/Resources/config/services.yamlx yKAhx K~I¤$api/Resources/config/config_dev.yamléyKAh麡Æó¤%api/Resources/config/config_prod.yamlÖyKAhÖH½ ¤ api/Resources/config/config.yaml*yKAh*¤"H‘¤api/Resources/i18n/cs.ymlžyKAhžýõfž¤api/Resources/i18n/br.ymlûyKAhû·Ãð­¤api/Resources/i18n/es.ymlPyKAhPóeͺ¤api/Resources/i18n/pt.ymlýyKAhýh“ÆÇ¤api/Resources/i18n/de.ymlòyKAhòÓV=ì¤api/Resources/i18n/it.ymlÝyKAhÝ`ø¿¤api/Resources/i18n/pl.yml3yKAh3­f°i¤api/Resources/i18n/fa.yml; yKAh; 1ô˜,¤api/Resources/i18n/sv.yml6yKAh6kM4Ťapi/Resources/i18n/en.ymlmyKAhmhDh>¤api/Resources/i18n/ja.yml½yKAh½Í8E~¤api/Resources/i18n/ru.ymlÐyKAhÐ2 ©š¤api/Resources/i18n/sr.ymlÿyKAhÿj—U¤api/Resources/i18n/fr.yml7yKAh7Å …¼¤api/Resources/i18n/lv.ymlªyKAhªÜϤapi/Resources/i18n/tr.ymljyKAhjá;Ù¤api/Resources/i18n/nl.ymlyKAhøöÕ¤api/Resources/i18n/zh.ymlô yKAhô œ^”a¤api/ApiApplication.phpñ yKAhñ -r¾¤#api/Tests/Composer/CloudJobTest.phpØyKAhØ•!L¤'api/Tests/Controller/LogPatternTest.phpÂ0yKAhÂ0Ly·¤!api/Controller/FileController.phpéyKAhéºÿ¥þ¤!api/Controller/UserController.php>yKAh>ÕÈ"¤ api/Controller/LogController.php‘yKAh‘'Ü%•¤(api/Controller/Config/AuthController.phpgyKAhg€rI6¤2api/Controller/Config/AbstractConfigController.php»yKAh»À¤*api/Controller/Contao/BackupController.php,yKAh,>]6¤3api/Controller/Contao/MaintenanceModeController.phpyKAh$iW¤-api/Controller/Contao/JwtCookieController.phpž yKAhž Ábõˤapi/ApiKernel.php>&yKAh>&ë©M®¤api/System/ServerInfo.phpqyKAhqƾqî¤api/System/Request.php[yKAh[y9[<¤api/System/SelfUpdate.phpDyKAhDÝqׂ¤api/Task/TaskStatus.php=yKAh=%s§ø¤&api/Task/Composer/DumpAutoloadTask.phpyKAh¹W›j¤$api/Task/Composer/ClearCacheTask.phpõyKAhõƒÀÁž¤#api/Task/Manager/SelfUpdateTask.php¶yKAh¶ @?&¤api/Task/AbstractTask.phpyKAh›ßªO¤api/Task/Packages/SetupTask.phpÍ yKAhÍ …×ýf¤ api/Task/Packages/UpdateTask.phpF+yKAhF+.“½¡¤!api/Task/Packages/InstallTask.php- yKAh- }~BC¤*api/Task/Packages/AbstractPackagesTask.phpï yKAhï #»c¤$api/Task/Contao/BackupCreateTask.phpùyKAhù½E¢î¤%api/Task/Contao/BackupRestoreTask.phpäyKAhäUÚF¤$api/Task/Contao/RebuildCacheTask.php½ yKAh½ lKœ¤api/Task/TaskManager.phpCyKAhC¸²ÎW¤api/Task/TaskInterface.phpyKAhrßϤapi/Task/TaskConfig.php× yKAh× /ʤ%api/Command/IntegrityCheckCommand.php’ yKAh’ Ñ徤api/Command/UpdateCommand.phpˆyKAhˆï½î%¤ api/Command/TaskAbortCommand.phpJyKAhJ{P峤!api/Command/TaskUpdateCommand.phpzyKAhzÐÒk¤$api/Command/ProcessRunnerCommand.phpyyKAhy`݃y¤api/Command/AboutCommand.php’yKAh’ÄpSe¤!api/Command/TaskDeleteCommand.phpayKAha W·½¤api/I18n/Translator.phpÔ yKAhÔ q¶ ¤%api/Exception/ApiProblemException.php5yKAh5Wï{¤(api/Exception/ProcessOutputException.phpÂyKAhÂð¶èo¤&api/Exception/InvalidTotpException.phpŠyKAhŠˆ±™Ê¤&api/Exception/InvalidJsonException.php yKAh ˆÞ8Y¤"api/Exception/RequestException.php¦yKAh¦µÅ°å¤)api/IntegrityCheck/AllowUrlFopenCheck.php%yKAh%z2•Ť'api/IntegrityCheck/GraphicsLibCheck.php³yKAh³kp¤api/IntegrityCheck/ZipCheck.php‘yKAh‘k"€¹¤&api/IntegrityCheck/SysTempDirCheck.php¿yKAh¿á‚Ƥ.api/IntegrityCheck/IntegrityCheckInterface.php~yKAh~–ô’ò¤#api/IntegrityCheck/ProcessCheck.php¯yKAh¯\.sg¤#api/IntegrityCheck/SymlinkCheck.php¬yKAh¬ƒ;¦W¤#api/IntegrityCheck/SessionCheck.phpyKAhË­ôK¤'api/IntegrityCheck/MemoryLimitCheck.phpKyKAhKý^§¤)api/IntegrityCheck/PhpExtensionsCheck.phpÈyKAhÈ ¿:¤-api/IntegrityCheck/AbstractIntegrityCheck.php‚yKAh‚´áÂê¤,api/IntegrityCheck/IntegrityCheckFactory.php©yKAh© R½,¤api/Process/ContaoApi.phpFyKAhFŠ¥ðB¤!api/Process/ProcessController.php»yKAh»Ù§¶e¤%api/Process/Forker/AbstractForker.phpà yKAhà üÈ®H¤&api/Process/Forker/ForkerInterface.phpnyKAhn|5oq¤#api/Process/Forker/DisownForker.php¬yKAh¬w4hì¤"api/Process/Forker/NohupForker.php¢yKAh¢ZŒA¤)api/Process/Forker/WindowsStartForker.phpêyKAhêa\ƒ"¤#api/Process/Forker/InlineForker.phpÐyKAhÐÜѶ#¤api/Process/Utf8Process.php…yKAh…ßxè¤api/Process/ProcessRunner.phpyKAh|‹E¤¤api/Process/AbstractProcess.phpãyKAhã6?=¤api/Process/ContaoConsole.phpö yKAhö v)1æ¤#api/Process/PhpExecutableFinder.phpùyKAhùèr¤%api/Process/ConsoleProcessFactory.php¤yKAh¤ôkµ¤ api/console8 yKAh8 iÅ.¤$api/EventListener/LocaleListener.php.yKAh.«Å¤'api/EventListener/ExceptionListener.php~ yKAh~ ¶… ¤&api/EventListener/SecurityListener.php¾yKAh¾øOð¤'api/EventListener/CheckTotpListener.phpyKAh5%T¤)api/EventListener/JsonRequestListener.phpMyKAhMÚõÝä downgrade.phpÏ0yKAhÏ08-ˤ$vendor/seld/phar-utils/composer.lock/yKAh/cÖ‚(¤vendor/seld/phar-utils/LICENSE"yKAh"ˆñ?e¤ vendor/seld/phar-utils/README.mdeyKAhe:“N¤$vendor/seld/phar-utils/composer.json;yKAh;º=¤%vendor/seld/phar-utils/src/Linter.phpé yKAhé å#: ¤)vendor/seld/phar-utils/src/Timestamps.phpkyKAhkF˜¤vendor/seld/jsonlint/LICENSE"yKAh"aƒsy¤!vendor/seld/jsonlint/bin/jsonlint yKAh ý¤!vendor/seld/jsonlint/CHANGELOG.mdÇ yKAhÇ ݣʤvendor/seld/jsonlint/README.md² yKAh² ÃÌf¤"vendor/seld/jsonlint/composer.jsonUyKAhUÛTR£¤@vendor/seld/jsonlint/src/Seld/JsonLint/DuplicateKeyException.php¼yKAh¼ArQ¤;vendor/seld/jsonlint/src/Seld/JsonLint/ParsingException.php£yKAh£ûm2;¤0vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.phpª"yKAhª"ëÞ; ¤4vendor/seld/jsonlint/src/Seld/JsonLint/Undefined.php*yKAh*’œ÷õ¤5vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php,_yKAh,_ÅÍßv¤"vendor/seld/signal-handler/LICENSE"yKAh"ˆñ?e¤(vendor/seld/signal-handler/composer.jsonçyKAhç¬cÖø¤0vendor/seld/signal-handler/src/SignalHandler.phpÒOyKAhÒOÈ,ŒC¤vendor/autoload.phpÂyKAh‡{ ^¤$vendor/phpstan/phpdoc-parser/LICENSEQyKAhQ¶öÔw¤&vendor/phpstan/phpdoc-parser/README.md¡yKAh¡0 h¸¤)vendor/phpstan/phpdoc-parser/UPGRADING.md#yKAh#&~g¤*vendor/phpstan/phpdoc-parser/composer.json¨yKAh¨RŠ ¤0vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.phpyKAh&eo¤5vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php»yKAh»¿ £ô¤3vendor/phpstan/phpdoc-parser/src/Printer/Differ.phpjyKAhj£yTæ¤4vendor/phpstan/phpdoc-parser/src/Printer/Printer.phpG’yKAhG’|"&v¤;vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php yKAh ò2Ф8vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.phpÞ­yKAhÞ­¨a¤;vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.phpÿ!yKAhÿ!˜HH›¤;vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php\ yKAh\ k'#¤6vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php_“yKAh_“YeG¤9vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php8)yKAh8)\jÔ¤1vendor/phpstan/phpdoc-parser/src/ParserConfig.php`yKAh`ÙKäVvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php¦yKAh¦®;°¤Avendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php£yKAh£0õòž¤Dvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.phpyKAhß¿¡¤Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php:yKAh: f²ç¤Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php¤yKAh¤Ú}½¤Uvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php¥yKAh¥ÉOS^¤Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php¼yKAh¼ckû¤Jvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php©yKAh©û¼-¤Mvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php¯yKAh¯£Zò3¤Fvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php½yKAh½å^ÖĤ>vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php¦yKAh¦¼h%¥¤:vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.phpI)yKAhI)ÇÑã¤Lvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php-yKAh-=ïH¦¤Cvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.phpÙyKAhÙªÂ~T¤Evendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.phpcyKAhcº¡û¤Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php¤yKAh¤^ßT¤@vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php·yKAh·Z!K‘¤Kvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php4yKAh4ü¤Ü¤Ivendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.phpÔyKAhÔ–…=¤Kvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.phpüyKAhü;’ºk¤Mvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.phpíyKAhíj¾$ѤJvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.phpµyKAhµþK˜ƒ¤Fvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php‡yKAh‡Ã(ÝÒ¤Cvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.phpyKAh^Èߤ?vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.phpLyKAhL†KHx¤=vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.phpóyKAhó¬‰É¿¤Dvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php%yKAh%ÚâÚ¤Ivendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.phpÌyKAhÌm#²w¤Hvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.phpŸyKAhŸ{ÀÖ¤Kvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.phpyKAhjá†W¤Dvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php yKAh 7bô!¤[vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php«yKAh«'D¤?vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php¹yKAh¹)5Q¤Cvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.phpºyKAhºýåݤAvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.phpUyKAhU¯~,¤Bvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.phpÅyKAhÅÿä7ǤCvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php§yKAh§ÖÚL~¤Fvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.phpyKAhK]ÚC¤Jvendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php¬yKAh¬é>Á¤Avendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.phpÆyKAhÆ"iTº¤Evendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.phpFyKAhFYÝè7¤@vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.phpºyKAhºÕÿ‘¤Fvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php yKAh &mû¤Dvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php5yKAh5Ñ#6€¤Gvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php²yKAh²û80¤Evendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php7yKAh7c󷯤Ivendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php§yKAh§Û‹´¤Dvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php5yKAh5¶ì"¤Nvendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.phptyKAhtõ<†¤Evendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php°yKAh°÷—Gʤ4vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.phpª yKAhª Ò»cõ¤Cvendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php yKAh ÎÀ¤2vendor/phpstan/phpdoc-parser/src/Ast/Attribute.phppyKAhpBĤ-vendor/phpstan/phpdoc-parser/src/Ast/Node.php†yKAh†¹I ¤;vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.phpyKAh¦'¤Bvendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php yKAh ¨Ím™¤@vendor/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php¡yKAh¡z2©1¤@vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php–yKAh–¦o=ë¤;vendor/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.phpyKAhV0û ¤Gvendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.phpŒyKAhŒ½Åü’¤>vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.phpzyKAhzzØ"¤6vendor/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php°yKAh°¸Éë9¤Avendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.phpyKAhð[Zò¤:vendor/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php'yKAh'È|„„¤=vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.phpRyKAhR…7Nf¤=vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.phpgyKAhgÏL¤¤Bvendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.phpÂyKAh±4–¤Avendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.phpyKAh®RפHvendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.phpóyKAhó©tà¤Mvendor/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php“yKAh“ê+ $¤>vendor/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php©yKAh©q•o¤<vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.phpyKAh¸\鿤=vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php.yKAh.¬ 3¤;vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.phpiyKAhi<±Ÿp¤<vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php†yKAh†}ù$¤0vendor/phpstan/phpdoc-parser/src/Ast/Comment.phpüyKAhücÍ軤7vendor/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php+yKAh+ÝÀ®ê¤6vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php*yKAh*ÝÏù¤vendor/lcobucci/clock/LICENSE.yKAh.>µ˜z¤#vendor/lcobucci/clock/renovate.json†yKAh†]õG(¤#vendor/lcobucci/clock/composer.json,yKAh,¡š;¤#vendor/lcobucci/clock/src/Clock.phpéyKAhé*¬ ‡¤)vendor/lcobucci/clock/src/FrozenClock.php*yKAh*ª8o¤)vendor/lcobucci/clock/src/SystemClock.php‹yKAh‹Óé¤vendor/bin/yaml-lint yKAh 8<áh¤"vendor/bin/patch-type-declarations` yKAh` ó+•Õ¤vendor/bin/validate-json0 yKAh0 •Ž¶Ì¤vendor/bin/composer yKAh k?Û¤vendor/bin/var-dump-server? yKAh? Ü&jê¤vendor/bin/jsonlintý yKAhý ×ÖX¤$vendor/web-auth/webauthn-lib/LICENSE1yKAh1¯¥Ù2¤*vendor/web-auth/webauthn-lib/composer.jsonÖ yKAhÖ =–K¤<vendor/web-auth/webauthn-lib/src/FakeCredentialGenerator.php1yKAh1cF,Ȥ1vendor/web-auth/webauthn-lib/src/StringStream.php'yKAh'ÍK1Û¤@vendor/web-auth/webauthn-lib/src/CeremonyStep/CheckAlgorithm.php$ yKAh$ ¯²©$¤Dvendor/web-auth/webauthn-lib/src/CeremonyStep/TopOriginValidator.php«yKAh«Qøç¤Avendor/web-auth/webauthn-lib/src/CeremonyStep/CheckUserHandle.php‚yKAh‚Íê ¤Pvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckHasAttestedCredentialData.phpCyKAhC$èQþ¤Evendor/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStepManager.phpyKAh\TP„¤Gvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckUserVerification.php3yKAh3PXµ,¤Lvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckAllowedCredentialList.php¦yKAh¦ô©¤Cvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckCredentialId.phpyKAh\Š ¤Wvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckAttestationFormatIsKnownAndValid.phpHyKAhHÅ$@s¤@vendor/web-auth/webauthn-lib/src/CeremonyStep/CheckSignature.php˜yKAh˜!ëǤHvendor/web-auth/webauthn-lib/src/CeremonyStep/HostTopOriginValidator.php yKAh þ#o¤Kvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckRelyingPartyIdIdHash.phpŽ yKAhŽ ˜Oû¤Nvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckBackupBitsAreConsistent.phpýyKAhýè·Îa¤Evendor/web-auth/webauthn-lib/src/CeremonyStep/CheckUserWasPresent.php‚yKAh‚àƒwœ¤Nvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckClientDataCollectorType.phpyKAh=&¤@vendor/web-auth/webauthn-lib/src/CeremonyStep/CheckChallenge.php™yKAh™è¤g¤>vendor/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStep.phpÔyKAhÔ»ujv¤>vendor/web-auth/webauthn-lib/src/CeremonyStep/CheckCounter.php‘yKAh‘Ã×Úʤ@vendor/web-auth/webauthn-lib/src/CeremonyStep/CheckTopOrigin.phpÔyKAhÔ°"¤=vendor/web-auth/webauthn-lib/src/CeremonyStep/CheckOrigin.php yKAh ïüÚŤAvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckExtensions.phptyKAhtõ¥Ñ=¤Hvendor/web-auth/webauthn-lib/src/CeremonyStep/CheckMetadataStatement.php yKAh å`¬¤Lvendor/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStepManagerFactory.phpyKAh^fr¤Bvendor/web-auth/webauthn-lib/src/PublicKeyCredentialUserEntity.php² yKAh² ÓyP¤7vendor/web-auth/webauthn-lib/src/CertificateToolbox.php‰yKAh‰µ¤Vvendor/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensions.phpyKAh;k¤[vendor/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputCheckerHandler.php}yKAh}Ç%}h¤bvendor/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientInputs.phpyKAh`i¤Rvendor/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputError.php‹yKAh‹H'Š’¤Uvendor/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtension.phpyKAhÀRþ¤Tvendor/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputChecker.phpêyKAhêD±A¤cvendor/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputs.phpyKAh QûT¤ivendor/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputsLoader.phpÖyKAhÖÓöD+¤evendor/web-auth/webauthn-lib/src/AttestationStatement/AndroidSafetyNetAttestationStatementSupport.php66yKAh66‚éÀv¤\vendor/web-auth/webauthn-lib/src/AttestationStatement/FidoU2FAttestationStatementSupport.phpZyKAhZT›†¤Zvendor/web-auth/webauthn-lib/src/AttestationStatement/AppleAttestationStatementSupport.phpRyKAhR³9Ïö¤Yvendor/web-auth/webauthn-lib/src/AttestationStatement/NoneAttestationStatementSupport.phpzyKAhz|… ’¤Uvendor/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupport.phpïyKAhï0H“äQvendor/web-auth/webauthn-lib/src/AttestationStatement/AttestationObjectLoader.phpýyKAhýÕÇaª¤[vendor/web-auth/webauthn-lib/src/AttestationStatement/PackedAttestationStatementSupport.php¶+yKAh¶+½¿É¯¤Kvendor/web-auth/webauthn-lib/src/AttestationStatement/AttestationObject.phpyKAh™_fð¤_vendor/web-auth/webauthn-lib/src/AttestationStatement/AndroidKeyAttestationStatementSupport.phpM"yKAhM"O~åO¤\vendor/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupportManager.phpéyKAhéoâè¤Xvendor/web-auth/webauthn-lib/src/AttestationStatement/TPMAttestationStatementSupport.php±=yKAh±=$3Yþ¤Nvendor/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatement.php¡yKAh¡ª„é*¤>vendor/web-auth/webauthn-lib/src/PublicKeyCredentialLoader.php¢yKAh¢x&²¯¤Bvendor/web-auth/webauthn-lib/src/SimpleFakeCredentialGenerator.phpöyKAhöŸAôݤ>vendor/web-auth/webauthn-lib/src/TokenBinding/TokenBinding.phpáyKAhá¢jhÕ¤Hvendor/web-auth/webauthn-lib/src/TokenBinding/SecTokenBindingHandler.phpýyKAhýºŠ¤Kvendor/web-auth/webauthn-lib/src/TokenBinding/IgnoreTokenBindingHandler.phpyKAhÉ—CÚ¤Qvendor/web-auth/webauthn-lib/src/TokenBinding/TokenBindingNotSupportedHandler.phpÖyKAhÖßÂW¤Evendor/web-auth/webauthn-lib/src/TokenBinding/TokenBindingHandler.phphyKAhhŽ ¤<vendor/web-auth/webauthn-lib/src/Util/CoseSignatureFixer.php`yKAh`_nW˜¤0vendor/web-auth/webauthn-lib/src/Util/Base64.phpsyKAhs÷Ãݤ;vendor/web-auth/webauthn-lib/src/AttestedCredentialData.php¼ yKAh¼ ¬sr¯¤/vendor/web-auth/webauthn-lib/src/Credential.phpšyKAhšý…h¤Nvendor/web-auth/webauthn-lib/src/AuthenticatorAttestationResponseValidator.phpd2yKAhd2Ís¤Bvendor/web-auth/webauthn-lib/src/PublicKeyCredentialParameters.php yKAh #æ8r¤Bvendor/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptor.php yKAh 9®\o¤@vendor/web-auth/webauthn-lib/src/PublicKeyCredentialRpEntity.phpXyKAhX{±šB¤Evendor/web-auth/webauthn-lib/src/AuthenticatorAttestationResponse.phpyKAh¶ƒJ¤?vendor/web-auth/webauthn-lib/src/PublicKeyCredentialOptions.phpyKAh^ê½9¤6vendor/web-auth/webauthn-lib/src/AuthenticatorData.phpo yKAho ÇWo¤Lvendor/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptorCollection.phpyKAhÈ ?Ò¤:vendor/web-auth/webauthn-lib/src/AuthenticatorResponse.phpôyKAhôJå¤Lvendor/web-auth/webauthn-lib/src/AuthenticatorAssertionResponseValidator.php«0yKAh«0D ³ß¤Cvendor/web-auth/webauthn-lib/src/AuthenticatorAssertionResponse.php=yKAh=Ȫ¤Wvendor/web-auth/webauthn-lib/src/CertificateChainChecker/PhpCertificateChainChecker.php¥yKAh¥{ÛϤTvendor/web-auth/webauthn-lib/src/CertificateChainChecker/CertificateChainChecker.php—yKAh—ç2ׯ¤Fvendor/web-auth/webauthn-lib/src/PublicKeyCredentialRequestOptions.php.yKAh.Dg˜¤<vendor/web-auth/webauthn-lib/src/AuthenticatorDataLoader.phpyKAh°ÒLÚ¤Hvendor/web-auth/webauthn-lib/src/PublicKeyCredentialSourceRepository.php yKAh z­ò°¤>vendor/web-auth/webauthn-lib/src/TrustPath/TrustPathLoader.php¶yKAh¶@bï¤Bvendor/web-auth/webauthn-lib/src/TrustPath/EcdaaKeyIdTrustPath.php×yKAh×½,q¤8vendor/web-auth/webauthn-lib/src/TrustPath/TrustPath.php¦yKAh¦"ߣ¤=vendor/web-auth/webauthn-lib/src/TrustPath/EmptyTrustPath.phpyKAhäb_¹¤Cvendor/web-auth/webauthn-lib/src/TrustPath/CertificateTrustPath.phpžyKAhžÙAß#¤>vendor/web-auth/webauthn-lib/src/PublicKeyCredentialEntity.phpyKAhü ¤Lvendor/web-auth/webauthn-lib/src/ClientDataCollector/ClientDataCollector.phpAyKAhA¨Ð£²¤Svendor/web-auth/webauthn-lib/src/ClientDataCollector/ClientDataCollectorManager.phpÔyKAhÔ[6Ú¤Xvendor/web-auth/webauthn-lib/src/ClientDataCollector/WebauthnAuthenticationCollector.phpüyKAhü=mï¤Dvendor/web-auth/webauthn-lib/src/Counter/ThrowExceptionIfInvalid.phpwyKAhwõ¤Qvendor/web-auth/webauthn-lib/src/MetadataService/Statement/AbstractDescriptor.phpCyKAhCe»0@¤Ovendor/web-auth/webauthn-lib/src/MetadataService/Statement/EcdaaTrustAnchor.php0 yKAh0 Ò¨Þ¤Kvendor/web-auth/webauthn-lib/src/MetadataService/Statement/StatusReport.php7yKAh7PÆ ³¤[vendor/web-auth/webauthn-lib/src/MetadataService/Statement/VerificationMethodDescriptor.php!yKAh! +9ú¤Vvendor/web-auth/webauthn-lib/src/MetadataService/Statement/AlternativeDescriptions.php+yKAh+±þc„¤Zvendor/web-auth/webauthn-lib/src/MetadataService/Statement/BiometricAccuracyDescriptor.php yKAh nX}}¤Fvendor/web-auth/webauthn-lib/src/MetadataService/Statement/Version.phpV yKAhV ’ïñ¤Nvendor/web-auth/webauthn-lib/src/MetadataService/Statement/RgbPaletteEntry.php\ yKAh\ Pnu¤Mvendor/web-auth/webauthn-lib/src/MetadataService/Statement/RogueListEntry.phpÚyKAhÚx"#¤bvendor/web-auth/webauthn-lib/src/MetadataService/Statement/DisplayPNGCharacteristicsDescriptor.php¬yKAh¬ê ¼î¤@vendor/web-auth/webauthn-lib/src/MetadataService/ValueFilter.phpoyKAhojPOϤavendor/web-auth/webauthn-lib/src/MetadataService/Denormalizer/ExtensionDescriptorDenormalizer.php²yKAh²Ћz ¤dvendor/web-auth/webauthn-lib/src/MetadataService/Denormalizer/MetadataStatementSerializerFactory.php yKAh yÏàx¤avendor/web-auth/webauthn-lib/src/MetadataService/Service/FidoAllianceCompliantMetadataService.phpÙ'yKAhÙ'+X5Õ¤Pvendor/web-auth/webauthn-lib/src/MetadataService/Service/JsonMetadataService.php÷ yKAh÷ ¬ÓK¤Rvendor/web-auth/webauthn-lib/src/MetadataService/Service/StringMetadataService.phpñyKAhñ:Á)ĤUvendor/web-auth/webauthn-lib/src/MetadataService/Service/MetadataBLOBPayloadEntry.php¼yKAh¼ã7Ť[vendor/web-auth/webauthn-lib/src/MetadataService/Service/DistantResourceMetadataService.phpƒyKAhƒfB¤Pvendor/web-auth/webauthn-lib/src/MetadataService/Service/MetadataBLOBPayload.php©yKAh©4 n¤Lvendor/web-auth/webauthn-lib/src/MetadataService/Service/MetadataService.php¬yKAh¬ŠœŽ¢¤Yvendor/web-auth/webauthn-lib/src/MetadataService/Service/LocalResourceMetadataService.php yKAh iµ§¤Tvendor/web-auth/webauthn-lib/src/MetadataService/Service/ChainedMetadataServices.php yKAh ‡”¤Zvendor/web-auth/webauthn-lib/src/MetadataService/Service/FolderResourceMetadataService.php yKAh -NZ¤Tvendor/web-auth/webauthn-lib/src/MetadataService/Service/InMemoryMetadataService.phpAyKAhATî¤Zvendor/web-auth/webauthn-lib/src/MetadataService/Exception/InvalidCertificateException.php•yKAh•z]ò¤Wvendor/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataServiceException.php€yKAh€Y1ص¤Zvendor/web-auth/webauthn-lib/src/MetadataService/Exception/ExpiredCertificateException.php•yKAh•g/–¤Svendor/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateException.phpqyKAhqhÁƤ`vendor/web-auth/webauthn-lib/src/MetadataService/Exception/MissingMetadataStatementException.php³yKAh³m%¤Zvendor/web-auth/webauthn-lib/src/MetadataService/Exception/RevokedCertificateException.php•yKAh•†²“/¤`vendor/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataStatementLoadingException.php³yKAh³/¦V¤Yvendor/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataStatementException.phpŠyKAhŠc ‚ñ¤Xvendor/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateChainException.php…yKAh…]öཤavendor/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateRevocationListException.php¸yKAh¸è²[¿¤Lvendor/web-auth/webauthn-lib/src/MetadataService/Event/CanDispatchEvents.phpUyKAhU³¤xò¤Hvendor/web-auth/webauthn-lib/src/MetadataService/Event/WebauthnEvent.phpAyKAhAÆo¤[vendor/web-auth/webauthn-lib/src/MetadataService/Event/BeforeCertificateChainValidation.php¢yKAh¢yKAh>Œ ò¤Jvendor/web-auth/webauthn-lib/src/Exception/ExpiredCertificateException.phpyKAhp¾ƒ¤Jvendor/web-auth/webauthn-lib/src/Exception/UnsupportedFeatureException.php5yKAh5ÓG¤Cvendor/web-auth/webauthn-lib/src/Exception/CertificateException.phpOyKAhOZøl¤Pvendor/web-auth/webauthn-lib/src/Exception/MissingMetadataStatementException.php;yKAh;)<•Ô¤Jvendor/web-auth/webauthn-lib/src/Exception/RevokedCertificateException.php¤yKAh¤‹cO¤Lvendor/web-auth/webauthn-lib/src/Exception/AttestationStatementException.php‘yKAh‘¹ýnö¤Pvendor/web-auth/webauthn-lib/src/Exception/MetadataStatementLoadingException.phpzyKAhz$¿BC¤?vendor/web-auth/webauthn-lib/src/Exception/CounterException.phpLyKAhL–¤•¤Ivendor/web-auth/webauthn-lib/src/Exception/MetadataStatementException.php•yKAh•nŽg´¤Hvendor/web-auth/webauthn-lib/src/Exception/CertificateChainException.php˜yKAh˜¿[4Û¤Svendor/web-auth/webauthn-lib/src/Exception/AttestationStatementLoadingException.php»yKAh»’ê¤Cvendor/web-auth/webauthn-lib/src/Exception/InvalidDataException.phpëyKAhëÞ˜‘+¤Qvendor/web-auth/webauthn-lib/src/Exception/CertificateRevocationListException.phpyKAhÀ¨q9¤Ivendor/web-auth/webauthn-lib/src/Exception/InvalidUserHandleException.phpeyKAhe±©|¤1vendor/web-auth/webauthn-lib/src/U2FPublicKey.phpàyKAhàÓT¤<vendor/web-auth/webauthn-lib/src/Event/CanDispatchEvents.phpyKAh‘'û:¤cvendor/web-auth/webauthn-lib/src/Event/AuthenticatorAttestationResponseValidationSucceededEvent.php7yKAh7¤\€Z¤8vendor/web-auth/webauthn-lib/src/Event/WebauthnEvent.phpgyKAhg>ÐGú¤Bvendor/web-auth/webauthn-lib/src/Event/AttestationObjectLoaded.php´yKAh´žo‡b¤avendor/web-auth/webauthn-lib/src/Event/AuthenticatorAssertionResponseValidationSucceededEvent.php yKAh ž«ò¤^vendor/web-auth/webauthn-lib/src/Event/AuthenticatorAssertionResponseValidationFailedEvent.phpÍ yKAhÍ ”o~Ö¤Kvendor/web-auth/webauthn-lib/src/Event/BeforeCertificateChainValidation.phpXyKAhX/Õôå¤Kvendor/web-auth/webauthn-lib/src/Event/CertificateChainValidationFailed.phpXyKAhXpÍ¡¤Nvendor/web-auth/webauthn-lib/src/Event/CertificateChainValidationSucceeded.php[yKAh[(ú¹É¤Avendor/web-auth/webauthn-lib/src/Event/MetadataStatementFound.phpÊyKAhÊø ŽŒ¤>vendor/web-auth/webauthn-lib/src/Event/NullEventDispatcher.php8yKAh8}o¢¤`vendor/web-auth/webauthn-lib/src/Event/AuthenticatorAttestationResponseValidationFailedEvent.php¼yKAh¼û<—?¤Evendor/web-auth/webauthn-lib/src/Event/AttestationStatementLoaded.phpÉyKAhÉï|7¤>vendor/web-auth/webauthn-lib/src/PublicKeyCredentialSource.php"yKAh"I˜k¤Gvendor/web-auth/webauthn-lib/src/PublicKeyCredentialCreationOptions.phpo)yKAho)í¤8vendor/web-auth/webauthn-lib/src/CollectedClientData.phpryKAhrö+Ĥ vendor/web-auth/cose-lib/LICENSE,yKAh,Cʬ¤"vendor/web-auth/cose-lib/README.md¥yKAh¥Ŭ©¶¤&vendor/web-auth/cose-lib/composer.json§yKAh§B:+j¤$vendor/web-auth/cose-lib/SECURITY.mdÈyKAhȺYü{¤%vendor/web-auth/cose-lib/src/Hash.php´yKAh´8pȤ(vendor/web-auth/cose-lib/src/Key/Key.php yKAh úöo¤+vendor/web-auth/cose-lib/src/Key/RsaKey.php yKAh ZáΤ1vendor/web-auth/cose-lib/src/Key/SymmetricKey.phpÆyKAhÆ‹•f¤+vendor/web-auth/cose-lib/src/Key/Ec2Key.phpyKAhêÂʤ+vendor/web-auth/cose-lib/src/Key/OkpKey.phpù yKAhù çŸ?¤9vendor/web-auth/cose-lib/src/Algorithm/ManagerFactory.phpªyKAhª‚éE¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256.phpyKAhð€U0¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECDSA.phpßyKAhßAæf¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES384.phpŽyKAhŽ«"8¤Fvendor/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECSignature.phpyKAh3y›¤Avendor/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256K.phpyKAh®8¿¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES512.phpyKAh­ø€Ë¤<vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS1.php·yKAh·]ˆ2Á¤<vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/RSA.phpyKAh#2Ť>vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS384.php»yKAh» üf¤>vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS256.php¸yKAh¸ÆæŽ¤>vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS384.php¸yKAh¸ {¤>vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS256.php»yKAh»Èõ‚¾¤>vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS512.php»yKAh»*(óz¤?vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/PSSRSA.php\yKAh\i"ü¤>vendor/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS512.php¸yKAh¸ÑÝkJ¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed512.phpØyKAhØÆ©K¢¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/EdDSA.phpyKAhì~e0¤@vendor/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed256.phpØyKAhØXðñy¤Bvendor/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed25519.php@yKAh@Œ¬ ¤>vendor/web-auth/cose-lib/src/Algorithm/Signature/Signature.phpVyKAhVÎã;¤4vendor/web-auth/cose-lib/src/Algorithm/Algorithm.php’yKAh’=Í h¤4vendor/web-auth/cose-lib/src/Algorithm/Mac/HS512.phpÚyKAhÚ4X e¤3vendor/web-auth/cose-lib/src/Algorithm/Mac/Hmac.phpÜyKAhÜJdޤ2vendor/web-auth/cose-lib/src/Algorithm/Mac/Mac.phpJyKAhJlô'¤4vendor/web-auth/cose-lib/src/Algorithm/Mac/HS384.phpÚyKAhÚ5YÑF¤?vendor/web-auth/cose-lib/src/Algorithm/Mac/HS256Truncated64.phpäyKAhäÞyü¤4vendor/web-auth/cose-lib/src/Algorithm/Mac/HS256.phpÚyKAhÚ¬öá¤2vendor/web-auth/cose-lib/src/Algorithm/Manager.phpÑyKAhÑ,‹œø¤+vendor/web-auth/cose-lib/src/BigInteger.php“yKAh“Yy¤+vendor/web-auth/cose-lib/src/Algorithms.phpXyKAhXÁ¬S@¤'vendor/composer/autoload_namespaces.php‹yKAh‹Š/t¤&vendor/composer/xdebug-handler/LICENSE)yKAh)#Ô;^¤+vendor/composer/xdebug-handler/CHANGELOG.md¼yKAh¼!YsK¤(vendor/composer/xdebug-handler/README.md“4yKAh“4SÂþ%¤,vendor/composer/xdebug-handler/composer.jsonyyKAhy€-¤0vendor/composer/xdebug-handler/src/PhpConfig.php¶yKAh¶Ü]±ò¤-vendor/composer/xdebug-handler/src/Status.phpzyKAhzƒÁµ"¤4vendor/composer/xdebug-handler/src/XdebugHandler.phpKVyKAhKVEéb¤.vendor/composer/xdebug-handler/src/Process.phpH yKAhH öçGë¤+vendor/composer/class-map-generator/LICENSEyKAhDâÓ¤-vendor/composer/class-map-generator/README.mdNyKAhN¦K…(¤1vendor/composer/class-map-generator/composer.jsonÞyKAhÞ|(†~¤=vendor/composer/class-map-generator/src/ClassMapGenerator.phpk6yKAhk62Bgn¤:vendor/composer/class-map-generator/src/PhpFileCleaner.php?yKAh?“þs›¤4vendor/composer/class-map-generator/src/FileList.phpcyKAhcrì¤5¤9vendor/composer/class-map-generator/src/PhpFileParser.phpûyKAhûÓ ·½¤4vendor/composer/class-map-generator/src/ClassMap.phpyKAhŠâ¤vendor/composer/LICENSE.yKAh. Õ¤vendor/composer/ClassLoader.phpú?yKAhú?2@u¤+vendor/composer/composer/phpstan/rules.neonÖyKAhÖ~d¤1vendor/composer/composer/res/composer-schema.json‹ßyKAh‹ß-Zy¤6vendor/composer/composer/res/composer-lock-schema.json¯ yKAh¯ ·Ærf¤<vendor/composer/composer/res/composer-repository-schema.jsonø yKAhø ×븂¤&vendor/composer/composer/composer.lockÉKyKAhÉKêÞR¤ vendor/composer/composer/LICENSE,yKAh,V†g‚¤%vendor/composer/composer/bin/composer yKAh Ÿ-0~¤$vendor/composer/composer/bin/compileèyKAhè\ò0¤&vendor/composer/composer/composer.json‰yKAh‰Sðv'¤Svendor/composer/composer/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.phpÏ yKAhÏ ô Âö¤Kvendor/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.phpL"yKAhL"ŸW¤1vendor/composer/composer/src/Composer/Factory.phpšyKAhšãz‰0¤Hvendor/composer/composer/src/Composer/Repository/RepositoryInterface.phpƒyKAhƒйîç¤Rvendor/composer/composer/src/Composer/Repository/InstalledFilesystemRepository.phpyKAhJŽž=¤Fvendor/composer/composer/src/Composer/Repository/PackageRepository.phplyKAhl+ËZ%¤Hvendor/composer/composer/src/Composer/Repository/LockArrayRepository.phpÙyKAhÙƒȤGvendor/composer/composer/src/Composer/Repository/PlatformRepository.phpŒŠyKAhŒŠ•,+ô¤Fvendor/composer/composer/src/Composer/Repository/RepositoryFactory.php$ yKAh$ 8àºl¤Qvendor/composer/composer/src/Composer/Repository/InstalledRepositoryInterface.php‘yKAh‘Ò+ä¤Pvendor/composer/composer/src/Composer/Repository/WritableRepositoryInterface.php@yKAh@eùÞk¤Dvendor/composer/composer/src/Composer/Repository/RepositoryUtils.phpª yKAhª ²ñƒ¤Pvendor/composer/composer/src/Composer/Repository/RepositorySecurityException.phpûyKAhûl ÝФHvendor/composer/composer/src/Composer/Repository/CompositeRepository.phpyKAh‘$ )¤Dvendor/composer/composer/src/Composer/Repository/ArrayRepository.phpw(yKAhw(x)âò¤Lvendor/composer/composer/src/Composer/Repository/WritableArrayRepository.php yKAh X¾ ¤Bvendor/composer/composer/src/Composer/Repository/VcsRepository.php¼RyKAh¼RB¬“q¤Gvendor/composer/composer/src/Composer/Repository/ComposerRepository.php1yKAh1h)³¤Cvendor/composer/composer/src/Composer/Repository/PearRepository.php`yKAh`ʤBvendor/composer/composer/src/Composer/Repository/RepositorySet.phpöAyKAhöA—°_O¤Gvendor/composer/composer/src/Composer/Repository/ArtifactRepository.php‰yKAh‰è¢åe¤Jvendor/composer/composer/src/Composer/Repository/RootPackageRepository.php:yKAh:ÚV‘>¤Fvendor/composer/composer/src/Composer/Repository/RepositoryManager.phpåyKAhånÛHé¤Evendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.phpóZyKAhóZUês¤Bvendor/composer/composer/src/Composer/Repository/Vcs/VcsDriver.phpÍyKAhÍr„ôO¤Bvendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.phpµ3yKAhµ3ÊE¤Avendor/composer/composer/src/Composer/Repository/Vcs/HgDriver.php6yKAh6ü¦Û ¤Gvendor/composer/composer/src/Composer/Repository/Vcs/PerforceDriver.php„yKAh„%6ɤKvendor/composer/composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php“8yKAh“8þMn»¤Bvendor/composer/composer/src/Composer/Repository/Vcs/GitDriver.phpÂ!yKAhÂ!Z·fû¤Evendor/composer/composer/src/Composer/Repository/Vcs/GitLabDriver.php4RyKAh4R¯\6L¤Kvendor/composer/composer/src/Composer/Repository/Vcs/VcsDriverInterface.php yKAh O 4Û¤Evendor/composer/composer/src/Composer/Repository/Vcs/FossilDriver.php\yKAh\ÏbÇ:¤Cvendor/composer/composer/src/Composer/Repository/PathRepository.phpK"yKAhK"¬ý-ƤJvendor/composer/composer/src/Composer/Repository/VersionCacheInterface.phpdyKAhdóë~â¤Kvendor/composer/composer/src/Composer/Repository/CanonicalPackagesTrait.phpÂyKAhÂÀé=§¤Evendor/composer/composer/src/Composer/Repository/FilterRepository.phpöyKAhö–¾X§¤Hvendor/composer/composer/src/Composer/Repository/InstalledRepository.phpI3yKAhI3²—‡Ì¤Nvendor/composer/composer/src/Composer/Repository/AdvisoryProviderInterface.phpÀyKAhÀXD@“¤Ivendor/composer/composer/src/Composer/Repository/FilesystemRepository.php??yKAh??ß W½¤Mvendor/composer/composer/src/Composer/Repository/InstalledArrayRepository.phpyKAhfŒ~¤Tvendor/composer/composer/src/Composer/Repository/ConfigurableRepositoryInterface.phpyKAhF*û'¤Ovendor/composer/composer/src/Composer/Repository/InvalidRepositoryException.phpøyKAhøfø=¤<vendor/composer/composer/src/Composer/Util/PackageSorter.phpNyKAhN8 ¤>vendor/composer/composer/src/Composer/Util/ConfigValidator.php[$yKAh[$ëzf¤2vendor/composer/composer/src/Composer/Util/Git.phpqiyKAhqi³¾¤2vendor/composer/composer/src/Composer/Util/Svn.php&yKAh&ÌsH«¤=vendor/composer/composer/src/Composer/Util/NoProxyPattern.phpì)yKAhì)òôx²¤=vendor/composer/composer/src/Composer/Util/ComposerMirror.phpW yKAhW ú~÷w¤:vendor/composer/composer/src/Composer/Util/PackageInfo.phpAyKAhAê#Rÿ¤9vendor/composer/composer/src/Composer/Util/AuthHelper.php8yKAh8¬¸“¤2vendor/composer/composer/src/Composer/Util/Zip.phpR yKAhR ¼A†Ã¤7vendor/composer/composer/src/Composer/Util/Silencer.php/yKAh/§ê<é¤9vendor/composer/composer/src/Composer/Util/Filesystem.phpd{yKAhd{d}É`¤2vendor/composer/composer/src/Composer/Util/Tar.phpûyKAhûÒÜ Ç¤5vendor/composer/composer/src/Composer/Util/GitHub.php !yKAh !j\ v¤5vendor/composer/composer/src/Composer/Util/GitLab.phpî/yKAhî/|ò!û¤8vendor/composer/composer/src/Composer/Util/Bitbucket.php9&yKAh9& ǽ ¤=vendor/composer/composer/src/Composer/Util/HttpDownloader.php)HyKAh)Hs%G¤8vendor/composer/composer/src/Composer/Util/IniHelper.phpmyKAhm€7r·¤7vendor/composer/composer/src/Composer/Util/Platform.phpã*yKAhã*Òh«P¤Cvendor/composer/composer/src/Composer/Util/StreamContextFactory.phpÓ"yKAhÓ"Â?x¤8vendor/composer/composer/src/Composer/Util/TlsHelper.phpÉyKAhÉÈ5FϤ2vendor/composer/composer/src/Composer/Util/Url.php÷yKAh÷ʉ٤7vendor/composer/composer/src/Composer/Util/Perforce.php2LyKAh2L óǤ@vendor/composer/composer/src/Composer/Util/Http/ProxyManager.phpñyKAhñewYç¤<vendor/composer/composer/src/Composer/Util/Http/Response.phpa yKAha ^ÿ‰²¤@vendor/composer/composer/src/Composer/Util/Http/RequestProxy.php’yKAh’‚Mg¤Bvendor/composer/composer/src/Composer/Util/Http/CurlDownloader.phpyyKAhyøƒ'B¤@vendor/composer/composer/src/Composer/Util/Http/CurlResponse.phpõyKAhõ1'ɤ=vendor/composer/composer/src/Composer/Util/Http/ProxyItem.phpyKAh=eY°¤?vendor/composer/composer/src/Composer/Util/MetadataMinifier.phpyKAh¤#`¤>vendor/composer/composer/src/Composer/Util/ProcessExecutor.phpíEyKAhíE5œUõ¤1vendor/composer/composer/src/Composer/Util/Hg.php»yKAh»Q´Š5¤?vendor/composer/composer/src/Composer/Util/RemoteFilesystem.php?lyKAh?l¨qæ'¤;vendor/composer/composer/src/Composer/Util/ErrorHandler.php, yKAh, JCš¤9vendor/composer/composer/src/Composer/Util/SyncHelper.phpò yKAhò Þ¬pQ¤3vendor/composer/composer/src/Composer/Util/Loop.php2yKAh2¨’¤Avendor/composer/composer/src/Composer/Config/JsonConfigSource.phpv)yKAhv)ƒ‘¤Fvendor/composer/composer/src/Composer/Config/ConfigSourceInterface.phpfyKAhf(Çø×¤=vendor/composer/composer/src/Composer/SelfUpdate/Versions.phpÊyKAhÊ.]!¤9vendor/composer/composer/src/Composer/SelfUpdate/Keys.php¿yKAh¿-ç*ÿ¤/vendor/composer/composer/src/Composer/Cache.phpÂ+yKAhÂ+@U…¤?vendor/composer/composer/src/Composer/EventDispatcher/Event.php¬yKAh¬¢~k¤Rvendor/composer/composer/src/Composer/EventDispatcher/ScriptExecutionException.phpyKAh;í;¤Ivendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php4yKAh4DìçפRvendor/composer/composer/src/Composer/EventDispatcher/EventSubscriberInterface.phpuyKAhuh_}¿¤9vendor/composer/composer/src/Composer/PartialComposer.php' yKAh' èëc¤:vendor/composer/composer/src/Composer/Platform/Runtime.php yKAh :K(¤?vendor/composer/composer/src/Composer/Platform/HhvmDetector.php¡yKAh¡H껥¤:vendor/composer/composer/src/Composer/Platform/Version.phpÞ yKAhÞ –\ ¤¤5vendor/composer/composer/src/Composer/IO/BufferIO.phpÜ yKAhÜ ‹'Ë„¤6vendor/composer/composer/src/Composer/IO/ConsoleIO.phpK)yKAhK)5¹1 ¤3vendor/composer/composer/src/Composer/IO/BaseIO.phpX#yKAhX#’¤3vendor/composer/composer/src/Composer/IO/NullIO.php‘ yKAh‘ Éû{õ¤8vendor/composer/composer/src/Composer/IO/IOInterface.phpZ yKAhZ Š ¤=vendor/composer/composer/src/Composer/Plugin/PluginEvents.phpeyKAhe®1+ˤCvendor/composer/composer/src/Composer/Plugin/PreCommandRunEvent.php2yKAh2:q@¤Kvendor/composer/composer/src/Composer/Plugin/Capability/CommandProvider.php”yKAh”dÇ,¤Fvendor/composer/composer/src/Composer/Plugin/Capability/Capability.phpþyKAhþ…L k¤Gvendor/composer/composer/src/Composer/Plugin/PluginBlockedException.php¢yKAh¢œNu¤=vendor/composer/composer/src/Composer/Plugin/CommandEvent.phpyyKAhy¼/À¤@vendor/composer/composer/src/Composer/Plugin/PluginInterface.php?yKAh?#?"¤>vendor/composer/composer/src/Composer/Plugin/PluginManager.phpP†yKAhP†.ïr¤Evendor/composer/composer/src/Composer/Plugin/PreFileDownloadEvent.php9yKAh9Ê̳¤Fvendor/composer/composer/src/Composer/Plugin/PostFileDownloadEvent.php¢ yKAh¢ Ƥ8vendor/composer/composer/src/Composer/Plugin/Capable.php´yKAh´Ðu¤Cvendor/composer/composer/src/Composer/Plugin/PrePoolCreateEvent.phpêyKAhêH¡¾¤Bvendor/composer/composer/src/Composer/Downloader/RarDownloader.phpÒ yKAhÒ Ý"°Ä¤Rvendor/composer/composer/src/Composer/Downloader/VcsCapableDownloaderInterface.phpCyKAhCŸÈH¤Bvendor/composer/composer/src/Composer/Downloader/VcsDownloader.php4yKAh4þ\4=¤Hvendor/composer/composer/src/Composer/Downloader/FilesystemException.phpÇyKAhÇÆ™J¤Dvendor/composer/composer/src/Composer/Downloader/DownloadManager.phpR<yKAhR<Hš„¤Bvendor/composer/composer/src/Composer/Downloader/TarDownloader.phpšyKAhšK7J¤Evendor/composer/composer/src/Composer/Downloader/FossilDownloader.phpÉyKAhÉWÜÇΤQvendor/composer/composer/src/Composer/Downloader/MaxFileSizeExceededException.phpyKAh½`ܤHvendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php¥yKAh¥¬x—¤Avendor/composer/composer/src/Composer/Downloader/XzDownloader.phpQyKAhQaYŤAvendor/composer/composer/src/Composer/Downloader/HgDownloader.php»yKAh»À’p¿¤Bvendor/composer/composer/src/Composer/Downloader/SvnDownloader.phpŒ"yKAhŒ"r®vœ¤Cvendor/composer/composer/src/Composer/Downloader/FileDownloader.phpCSyKAhCSRµ¤Jvendor/composer/composer/src/Composer/Downloader/ChangeReportInterface.php'yKAh'}sÞ$¤Gvendor/composer/composer/src/Composer/Downloader/TransportException.phpyKAhá‘ʤFvendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.phpÌ!yKAhÌ!Ïø{Z¤Lvendor/composer/composer/src/Composer/Downloader/DvcsDownloaderInterface.php6yKAh61N}„¤Cvendor/composer/composer/src/Composer/Downloader/PharDownloader.phpŠyKAhŠ®/&Ö¤Cvendor/composer/composer/src/Composer/Downloader/PathDownloader.php›6yKAh›6À,½_¤Gvendor/composer/composer/src/Composer/Downloader/PerforceDownloader.php‚ yKAh‚ Rõ.¤Bvendor/composer/composer/src/Composer/Downloader/GitDownloader.phpºayKAhºa5ȤBvendor/composer/composer/src/Composer/Downloader/ZipDownloader.phpL9yKAhL9æ0‰”¤Cvendor/composer/composer/src/Composer/Downloader/GzipDownloader.php¬yKAh¬ŒœâS¤0vendor/composer/composer/src/Composer/Config.phpCayKAhCaà~s¤6vendor/composer/composer/src/Composer/Script/Event.php yKAh D¡]¤=vendor/composer/composer/src/Composer/Script/ScriptEvents.php‰yKAh‰KGꮤMvendor/composer/composer/src/Composer/Question/StrictConfirmationQuestion.php yKAh `œa”¤2vendor/composer/composer/src/Composer/Composer.php–yKAh–o]–ƤFvendor/composer/composer/src/Composer/Json/JsonValidationException.phplyKAhlex‡Ë¤<vendor/composer/composer/src/Composer/Json/JsonFormatter.phpeyKAhe롤7vendor/composer/composer/src/Composer/Json/JsonFile.phpÞ3yKAhÞ3Nó¤>vendor/composer/composer/src/Composer/Json/JsonManipulator.php8SyKAh8Sž«WT¤;vendor/composer/composer/src/Composer/InstalledVersions.phpIByKAhIB ¼"¤Wvendor/composer/composer/src/Composer/DependencyResolver/Operation/InstallOperation.phpzyKAhzŒ=~i¤bvendor/composer/composer/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.phpxyKAhxÞnÒ¤Yvendor/composer/composer/src/Composer/DependencyResolver/Operation/OperationInterface.php¯yKAh¯}|(̤Vvendor/composer/composer/src/Composer/DependencyResolver/Operation/UpdateOperation.phpw yKAhw cÌ;¤Vvendor/composer/composer/src/Composer/DependencyResolver/Operation/SolverOperation.phpŒyKAhŒIwËý¤Yvendor/composer/composer/src/Composer/DependencyResolver/Operation/UninstallOperation.phpbyKAhb&ßYl¤dvendor/composer/composer/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php~yKAh~ñÇ ¤Hvendor/composer/composer/src/Composer/DependencyResolver/Transaction.php8yKAh8|Ô¤Lvendor/composer/composer/src/Composer/DependencyResolver/PolicyInterface.php”yKAh”ÓÖÿ¤Qvendor/composer/composer/src/Composer/DependencyResolver/LocalRepoTransaction.php(yKAh(tʺ¤Kvendor/composer/composer/src/Composer/DependencyResolver/RuleWatchGraph.phpAyKAhAÈë>¤Hvendor/composer/composer/src/Composer/DependencyResolver/GenericRule.phpšyKAhš>>MV¤Lvendor/composer/composer/src/Composer/DependencyResolver/LockTransaction.phpyKAh²­h¤Cvendor/composer/composer/src/Composer/DependencyResolver/Solver.phphyKAhhõ‰æs¤Avendor/composer/composer/src/Composer/DependencyResolver/Rule.phpùNyKAhùNd âÛ¤Jvendor/composer/composer/src/Composer/DependencyResolver/Rule2Literals.php´ yKAh´ dײ¤Tvendor/composer/composer/src/Composer/DependencyResolver/SolverProblemsException.phpŒyKAhŒ18M¯¤Ovendor/composer/composer/src/Composer/DependencyResolver/SolverBugException.phpÿyKAhÿ/d¹¤Jvendor/composer/composer/src/Composer/DependencyResolver/DefaultPolicy.php(yKAh(ýå 8¤Jvendor/composer/composer/src/Composer/DependencyResolver/RuleWatchNode.phpÚ yKAhÚ ¤'¤Dvendor/composer/composer/src/Composer/DependencyResolver/RuleSet.phpXyKAhXÛqÖ¤Avendor/composer/composer/src/Composer/DependencyResolver/Pool.phpÏ yKAhÏ ?6lJ¤Nvendor/composer/composer/src/Composer/DependencyResolver/MultiConflictRule.phpq yKAhq S8™e¤Dvendor/composer/composer/src/Composer/DependencyResolver/Request.php¢!yKAh¢!°ŸÊ1¤Jvendor/composer/composer/src/Composer/DependencyResolver/PoolOptimizer.phpMyKAhM zA¤Mvendor/composer/composer/src/Composer/DependencyResolver/RuleSetGenerator.phpµ6yKAhµ6„«Ûw¤Fvendor/composer/composer/src/Composer/DependencyResolver/Decisions.phpþyKAhþQµñš¤Hvendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php‹yKAh‹ dA"¤Dvendor/composer/composer/src/Composer/DependencyResolver/Problem.php-‡yKAh-‡æ3C¤Lvendor/composer/composer/src/Composer/DependencyResolver/RuleSetIterator.phpC yKAhC r¿ž¤Kvendor/composer/composer/src/Composer/DependencyResolver/RuleWatchChain.phpÃyKAhÃ]âŸè¤Dvendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.phpMËyKAhMËÓpNì¤>vendor/composer/composer/src/Composer/Autoload/ClassLoader.phpg>yKAhg>v½ò²¤Dvendor/composer/composer/src/Composer/Autoload/ClassMapGenerator.php—yKAh—I%c ¤Avendor/composer/composer/src/Composer/Command/SuggestsCommand.php;yKAh;:&|º¤?vendor/composer/composer/src/Composer/Command/SearchCommand.phpyKAhk^¯¤=vendor/composer/composer/src/Composer/Command/BumpCommand.php³&yKAh³&´rÀÀ¤@vendor/composer/composer/src/Composer/Command/ArchiveCommand.php*!yKAh*!³s’M¤>vendor/composer/composer/src/Composer/Command/AuditCommand.php3yKAh3‹àjl¤Avendor/composer/composer/src/Composer/Command/ValidateCommand.phpm$yKAhm$æ’Œr¤=vendor/composer/composer/src/Composer/Command/FundCommand.phpíyKAhí¼â{‚¤Gvendor/composer/composer/src/Composer/Command/PackageDiscoveryTrait.phpÏOyKAhÏOG:ù¤Dvendor/composer/composer/src/Composer/Command/ScriptAliasCommand.phpî yKAhî \ü ¤Fvendor/composer/composer/src/Composer/Command/CreateProjectCommand.php„^yKAh„^š4ûѤ=vendor/composer/composer/src/Composer/Command/BaseCommand.phpByKAhB?aöú¤Avendor/composer/composer/src/Composer/Command/OutdatedCommand.phpByKAhBG¾ˆœ¤Evendor/composer/composer/src/Composer/Command/DumpAutoloadCommand.phpyKAhŸ‘Šú¤=vendor/composer/composer/src/Composer/Command/HomeCommand.phpCyKAhCƒrÍj¤Bvendor/composer/composer/src/Composer/Command/ReinstallCommand.php©#yKAh©#" Þ¤?vendor/composer/composer/src/Composer/Command/RemoveCommand.php”;yKAh”;§„ù¤=vendor/composer/composer/src/Composer/Command/ShowCommand.php%yKAh% E¸O¤@vendor/composer/composer/src/Composer/Command/InstallCommand.php¿yKAh¿¢ q¤=vendor/composer/composer/src/Composer/Command/InitCommand.php([yKAh([(!#ͤBvendor/composer/composer/src/Composer/Command/RunScriptCommand.phpyKAh©r®m¤?vendor/composer/composer/src/Composer/Command/ConfigCommand.phpÈœyKAhÈœJŠç‘¤Avendor/composer/composer/src/Composer/Command/LicensesCommand.phpÃyKAhÃ8$䂤?vendor/composer/composer/src/Composer/Command/UpdateCommand.phpeNyKAheNJ¹Á(¤?vendor/composer/composer/src/Composer/Command/StatusCommand.php{ yKAh{ CФGvendor/composer/composer/src/Composer/Command/BaseDependencyCommand.php3yKAh3–낤@vendor/composer/composer/src/Composer/Command/DependsCommand.phpyKAhŽvN‚¤Bvendor/composer/composer/src/Composer/Command/ProhibitsCommand.php´yKAh´Ë &¤Jvendor/composer/composer/src/Composer/Command/CheckPlatformReqsCommand.php»yKAh»ˆYj¤Cvendor/composer/composer/src/Composer/Command/SelfUpdateCommand.phpiyKAhiŠåÚ¤@vendor/composer/composer/src/Composer/Command/RequireCommand.phpžsyKAhžsí^“;¤Avendor/composer/composer/src/Composer/Command/CompletionTrait.php¹#yKAh¹#"i¤Cvendor/composer/composer/src/Composer/Command/ClearCacheCommand.phpX yKAhX Íéð(¤Avendor/composer/composer/src/Composer/Command/DiagnoseCommand.phpFŒyKAhFŒÞ¤?vendor/composer/composer/src/Composer/Command/GlobalCommand.php‚yKAh‚~iÀ¤>vendor/composer/composer/src/Composer/Command/AboutCommand.phpéyKAhé…î ²¤=vendor/composer/composer/src/Composer/Command/ExecCommand.php>yKAh>Ƙ‰i¤3vendor/composer/composer/src/Composer/Installer.php™áyKAh™á³MÀI¤mvendor/composer/composer/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.phpýyKAhýÁ°„¤mvendor/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.phpýyKAhýçu¡ÿ¤nvendor/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php¿ yKAh¿ Ìêf ¤qvendor/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.phpêyKAhêÔuž¤kvendor/composer/composer/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.phpyKAh$¶À¤Avendor/composer/composer/src/Composer/Installer/PackageEvents.php"yKAh"]m¤Cvendor/composer/composer/src/Composer/Installer/BinaryInstaller.phpô8yKAhô8bÝÿ>¤Cvendor/composer/composer/src/Composer/Installer/PluginInstaller.phpwyKAhwáƒ0\¤Kvendor/composer/composer/src/Composer/Installer/BinaryPresenceInterface.phpyKAh­¤Dvendor/composer/composer/src/Composer/Installer/LibraryInstaller.php&,yKAh&,€Œüî¤Fvendor/composer/composer/src/Composer/Installer/InstallerInterface.php1yKAh1K•;¤Hvendor/composer/composer/src/Composer/Installer/MetapackageInstaller.phpñ yKAhñ Õ¶ÞÙ¤Dvendor/composer/composer/src/Composer/Installer/ProjectInstaller.phpñ yKAhñ ¶ªŒ¤Mvendor/composer/composer/src/Composer/Installer/SuggestedPackagesReporter.phpØyKAhØãvÓ¤Gvendor/composer/composer/src/Composer/Installer/InstallationManager.php`yKAh`@ë!ñ¤Avendor/composer/composer/src/Composer/Installer/NoopInstaller.phpY yKAhY ^.ö°¤Cvendor/composer/composer/src/Composer/Advisory/SecurityAdvisory.phpÃyKAhۉݭ¤Jvendor/composer/composer/src/Composer/Advisory/PartialSecurityAdvisory.phpÄyKAhÄu÷ñޤ:vendor/composer/composer/src/Composer/Advisory/Auditor.phpæ=yKAhæ=̶¯Ò¤Jvendor/composer/composer/src/Composer/Advisory/IgnoredSecurityAdvisory.phpkyKAhk‡K`•¤Rvendor/composer/composer/src/Composer/Exception/IrrecoverableDownloadException.php¿yKAh¿¿´¬¤Bvendor/composer/composer/src/Composer/Exception/NoSslException.phpóyKAhóÆ;P¤2vendor/composer/composer/src/Composer/Compiler.phpî-yKAhî-½™zq¤9vendor/composer/composer/src/Composer/Package/Package.phpÞDyKAhÞDi?fì¤6vendor/composer/composer/src/Composer/Package/Link.phpÿ yKAhÿ ¶+H¤Jvendor/composer/composer/src/Composer/Package/CompletePackageInterface.phpøyKAhø}ž{+¤Ivendor/composer/composer/src/Composer/Package/Archiver/ArchiveManager.phpò$yKAhò$ƒ²ï¤Pvendor/composer/composer/src/Composer/Package/Archiver/ArchivableFilesFinder.phpq yKAhq ß¶‚q¤Gvendor/composer/composer/src/Composer/Package/Archiver/PharArchiver.phpÕ yKAhÕ ÇMó¤Lvendor/composer/composer/src/Composer/Package/Archiver/BaseExcludeFilter.phpµyKAhµß@íݤPvendor/composer/composer/src/Composer/Package/Archiver/ArchivableFilesFilter.phpœyKAhœòßµð¤Kvendor/composer/composer/src/Composer/Package/Archiver/GitExcludeFilter.php€yKAh€^’¤Pvendor/composer/composer/src/Composer/Package/Archiver/ComposerExcludeFilter.php•yKAh•Þ£‰î¤Lvendor/composer/composer/src/Composer/Package/Archiver/ArchiverInterface.php¸yKAh¸ÊØ;w¤Fvendor/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php† yKAh† ÕL¼¤Fvendor/composer/composer/src/Composer/Package/CompleteAliasPackage.phpyKAhlN(¤>vendor/composer/composer/src/Composer/Package/AliasPackage.phpe'yKAhe' ¬»Ò¤8vendor/composer/composer/src/Composer/Package/Locker.php/XyKAh/Xö¿¦ö¤Bvendor/composer/composer/src/Composer/Package/PackageInterface.php00yKAh00¤"ë'¤Gvendor/composer/composer/src/Composer/Package/Version/VersionBumper.phpSyKAhSùp¿¤Ivendor/composer/composer/src/Composer/Package/Version/StabilityFilter.php‚yKAh‚³5¤Hvendor/composer/composer/src/Composer/Package/Version/VersionGuesser.phpWHyKAhWHkS¤Ivendor/composer/composer/src/Composer/Package/Version/VersionSelector.php0yKAh0÷ Þó¤Gvendor/composer/composer/src/Composer/Package/Version/VersionParser.php’ yKAh’  À?¤Nvendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php¦uyKAh¦u_Uä¤Pvendor/composer/composer/src/Composer/Package/Loader/InvalidPackageException.phpoyKAho,ëÞÒ¤Dvendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php‡FyKAh‡FW ‹¤Hvendor/composer/composer/src/Composer/Package/Loader/LoaderInterface.phpjyKAhj®®ä7¤Jvendor/composer/composer/src/Composer/Package/Loader/RootPackageLoader.phpO.yKAhO.†pk¤Cvendor/composer/composer/src/Composer/Package/Loader/JsonLoader.phpcyKAhcÜ@ ¤=vendor/composer/composer/src/Composer/Package/BasePackage.phpœyKAhœŸ‚$8¤Cvendor/composer/composer/src/Composer/Package/Comparer/Comparer.php¡yKAh¡f¾É‹¤Bvendor/composer/composer/src/Composer/Package/RootAliasPackage.phpÚyKAhÚ®r»è¤Avendor/composer/composer/src/Composer/Package/CompletePackage.php@yKAh@þÛew¤Fvendor/composer/composer/src/Composer/Package/RootPackageInterface.phpyKAh‰‘ S¤=vendor/composer/composer/src/Composer/Package/RootPackage.phpZ yKAhZ ðýk¶¤Dvendor/composer/composer/src/Composer/Package/Dumper/ArrayDumper.phpÞyKAhÞ¨«)=¤=vendor/composer/composer/src/Composer/Console/Application.php$yKAh$çd¤Cvendor/composer/composer/src/Composer/Console/GithubActionError.phplyKAhlÈg`+¤Evendor/composer/composer/src/Composer/Console/Input/InputArgument.phpå yKAhå & oà¤Cvendor/composer/composer/src/Composer/Console/Input/InputOption.php yKAh (¡C¤Evendor/composer/composer/src/Composer/Console/HtmlOutputFormatter.php1 yKAh1 ìg?Ѥ*vendor/composer/composer/src/bootstrap.php7yKAh7tߤ(vendor/composer/ca-bundle/res/cacert.pemûfyKAhûf7ù n¤!vendor/composer/ca-bundle/LICENSEyKAh*!^`¤#vendor/composer/ca-bundle/README.md1yKAh1>VuĤ'vendor/composer/ca-bundle/composer.json5yKAh5yÍ:¤*vendor/composer/ca-bundle/src/CaBundle.phpE+yKAhE+š&ÕV¤!vendor/composer/autoload_psr4.php™yKAh™ê§´¤%vendor/composer/autoload_classmap.phpõýyKAhõý—7¤"vendor/composer/platform_check.phpyKAh ò±¤#vendor/composer/autoload_static.phpÓÁyKAhÓÁrP]¤!vendor/composer/autoload_real.php¹yKAh¹ëå—¤vendor/composer/semver/LICENSEyKAhBhí¤#vendor/composer/semver/CHANGELOG.mdi'yKAhi'[ÖL¤ vendor/composer/semver/README.mdH yKAhH }Τ$vendor/composer/semver/composer.jsonùyKAhùz×)´¤/vendor/composer/semver/src/CompilingMatcher.phpï yKAhï FÀ®ÿ¤'vendor/composer/semver/src/Interval.phpuyKAhu“µ™¤)vendor/composer/semver/src/Comparator.php< yKAh< Í­ñ^¤:vendor/phpdocumentor/type-resolver/src/Types/Iterable_.phpFyKAhF Ž'y¤Bvendor/phpdocumentor/type-resolver/src/Types/CallableParameter.php³yKAh³¥/ó•¤9vendor/phpdocumentor/type-resolver/src/Types/ArrayKey.php±yKAh±?n)¤7vendor/phpdocumentor/type-resolver/src/Types/Never_.phpyKAh '˜†¤8vendor/phpdocumentor/type-resolver/src/Types/Static_.phpyKAh{6õ@¤<vendor/phpdocumentor/type-resolver/src/Types/ClassString.php_yKAh_õÝg¤8vendor/phpdocumentor/type-resolver/src/Types/Parent_.phpòyKAhòá¼ip¤7vendor/phpdocumentor/type-resolver/src/Types/Scalar.phpÂyKAh€ؤ8vendor/phpdocumentor/type-resolver/src/Types/Context.phpÓ yKAhÓ fYK¤=vendor/phpdocumentor/type-resolver/src/Types/AbstractList.phpƒyKAhƒí&¤;vendor/phpdocumentor/type-resolver/src/Types/Collection.phpµyKAhµä…â¤=vendor/phpdocumentor/type-resolver/src/Types/Intersection.php$yKAh$¼ÿŸÀ¤?vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php7yKAh7ÃÍv#¤?vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.phpã yKAhã ÁC`¤9vendor/phpdocumentor/type-resolver/src/Types/Compound.phpyKAh˲¤5vendor/phpdocumentor/type-resolver/src/Types/This.phpgyKAhg~¹+6¤7vendor/phpdocumentor/type-resolver/src/Types/Array_.phpÜyKAhÜ‚ NK¤7vendor/phpdocumentor/type-resolver/src/Types/Mixed_.phpŽyKAhŽ ÿà¤/vendor/phpdocumentor/type-resolver/src/Type.phpãyKAhãqé4ñ¤8vendor/phpdocumentor/type-resolver/src/FqsenResolver.php yKAh “€Í¢¤Bvendor/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.phpÉyKAhÉFÝóI¤<vendor/phpdocumentor/type-resolver/src/PseudoTypes/List_.phpÆyKAhÆæ­O¤Evendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php}yKAh}i¥¤@vendor/phpdocumentor/type-resolver/src/PseudoTypes/ShapeItem.php+yKAh+¢NG¤Cvendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.phpAyKAhAÖ­Z$¤Evendor/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php|yKAh|裤Dvendor/phpdocumentor/type-resolver/src/PseudoTypes/ListShapeItem.php–yKAh–Û곤?vendor/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php(yKAh(^6¹¤=vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.phpžyKAhžëÊë/¤Fvendor/phpdocumentor/type-resolver/src/PseudoTypes/ObjectShapeItem.php“yKAh“IC3þ¤Bvendor/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.phpvyKAhv›ç{¤Avendor/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php¥yKAh¥4AY‘¤Dvendor/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.phpzyKAhz*½ð÷¤Hvendor/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.phpƒyKAhƒìy"ѤCvendor/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php©yKAh©R4ç¤Dvendor/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.phpzyKAhzÛ†í¤Cvendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php yKAh I²Ÿ¤Fvendor/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php±yKAh±oe4¤Avendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php«yKAh«fr°d¤Nvendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.phpyKAh–‘¼¤Dvendor/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyArray.phpÖyKAhÖµ,¤Fvendor/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php~yKAh~Ìkçc¤<vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.phpšyKAhšWö¤@vendor/phpdocumentor/type-resolver/src/PseudoTypes/ListShape.php3yKAh3p¢à›¤Fvendor/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.phpwyKAhwâôp¤Evendor/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.phpeyKAhe€7¦¤Bvendor/phpdocumentor/type-resolver/src/PseudoTypes/ObjectShape.phpMyKAhM”*9¤Fvendor/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.phpwyKAhwï.½¤5vendor/phpdocumentor/type-resolver/src/PseudoType.php|yKAh|þÝ}¤0vendor/phpdocumentor/reflection-docblock/LICENSE8yKAh8á‰Ê¤2vendor/phpdocumentor/reflection-docblock/README.md[ yKAh[ ©\S¤6vendor/phpdocumentor/reflection-docblock/composer.json¯yKAh¯Þü¢á¤@vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php0yKAh0¼O?&¤Dvendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.phpHyKAhHÕg‹Õ¤Gvendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.phpIyKAhIŒ Tˆ¤=vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php¯yKAh¯¶ãῤDvendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php yKAh RO¨J¤Lvendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php<yKAh<FœJ¸¤Dvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php” yKAh” ,«¤Lvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.phpÜyKAhÜÖ»¯ú¤Nvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/MethodParameter.php´yKAh´K銤Cvendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.phpyKAhj® —¤Ivendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.phpyKAh_¤=vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.phpm yKAhm WÄ}¤9vendor/paragonie/constant_time_encoding/src/Base32Hex.php9 yKAh9 f…mޤ>vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php» yKAh» %o¤8vendor/paragonie/constant_time_encoding/src/Encoding.php,yKAh,RÊ2~¤@vendor/paragonie/constant_time_encoding/src/EncoderInterface.phpÒyKAhÒs¶:›¤6vendor/paragonie/constant_time_encoding/src/Base32.php˜<yKAh˜<$HC´¤3vendor/paragonie/constant_time_encoding/src/Hex.php‹yKAh‹bFǤEvendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.phpÊ yKAhÊ ?Na¤6vendor/paragonie/constant_time_encoding/src/Binary.phpÏ yKAhÏ ¤ÞŒ¤7vendor/paragonie/constant_time_encoding/src/RFC4648.phpÐyKAhй¤6vendor/paragonie/constant_time_encoding/src/Base64.phpc$yKAhc$õè‘K¤#vendor/spomky-labs/cbor-php/LICENSE,yKAh,Cʬ¤%vendor/spomky-labs/cbor-php/README.md[+yKAh[+𦌤)vendor/spomky-labs/cbor-php/composer.json'yKAh'-¨k³¤'vendor/spomky-labs/cbor-php/SECURITY.md›yKAh›§ÀǤ0vendor/spomky-labs/cbor-php/src/StringStream.phpeyKAhe&o¤:vendor/spomky-labs/cbor-php/src/OtherObject/TrueObject.phpÜyKAhÜb1F¤;vendor/spomky-labs/cbor-php/src/OtherObject/BreakObject.phpXyKAhX•&c„¤Dvendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectInterface.phptyKAhtаȤJvendor/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.phpQyKAhQt’ ¤=vendor/spomky-labs/cbor-php/src/OtherObject/GenericObject.php†yKAh†ku—5¤;vendor/spomky-labs/cbor-php/src/OtherObject/FalseObject.phpàyKAhà“= ¤?vendor/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.phpdyKAhdIM(¤Jvendor/spomky-labs/cbor-php/src/OtherObject/DoublePrecisionFloatObject.phpœyKAhœàã]¸¤Kvendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.phpÓyKAhÓšI•¤Hvendor/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.phpqyKAhqWF¯¤<vendor/spomky-labs/cbor-php/src/OtherObject/SimpleObject.php• yKAh• ¤:çj¤:vendor/spomky-labs/cbor-php/src/OtherObject/NullObject.phpÞyKAhÞ„Ï.¤Bvendor/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php~yKAh~=*ŸF¤4vendor/spomky-labs/cbor-php/src/DecoderInterface.php™yKAh™Œó\f¤4vendor/spomky-labs/cbor-php/src/ByteStringObject.php¦yKAh¦BÅlù¤Dvendor/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php*yKAh*ä`ê°¤'vendor/spomky-labs/cbor-php/src/Tag.phpcyKAhc}ø©¤+vendor/spomky-labs/cbor-php/src/Decoder.phpÖ#yKAhÖ#"Iû¤9vendor/spomky-labs/cbor-php/src/UnsignedIntegerObject.phpÏ yKAhÏ ò½©œ¤6vendor/spomky-labs/cbor-php/src/AbstractCBORObject.phpYyKAhYò@z>¤0vendor/spomky-labs/cbor-php/src/Normalizable.php§yKAh§ªxØÓ¤4vendor/spomky-labs/cbor-php/src/LengthCalculator.php|yKAh|N“`÷¤/vendor/spomky-labs/cbor-php/src/OtherObject.phpÔyKAhÔ?Ô73¤*vendor/spomky-labs/cbor-php/src/Stream.php†yKAh†$Öc¤4vendor/spomky-labs/cbor-php/src/TextStringObject.php—yKAh—1aMí¤Dvendor/spomky-labs/cbor-php/src/IndefiniteLengthByteStringObject.php3yKAh3‚»Qñ¤>vendor/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php¬ yKAh¬ cRâ¤=vendor/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php‰yKAh‰ëy—8¤+vendor/spomky-labs/cbor-php/src/MapItem.phpÙyKAhÙô»Ú¤)vendor/spomky-labs/cbor-php/src/Utils.phpvyKAhvpá#¤.vendor/spomky-labs/cbor-php/src/ListObject.php’yKAh’í¾0S¤-vendor/spomky-labs/cbor-php/src/MapObject.phpgyKAhg/©Þk¤.vendor/spomky-labs/cbor-php/src/CBORObject.php~yKAh~ºæ4¤.vendor/spomky-labs/cbor-php/src/Tag/UriTag.php†yKAh†Ì)øù¤<vendor/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php¤yKAh¤ö‘ܤ=vendor/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php_yKAh_[Ø d¤:vendor/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.phpÆ yKAhÆ «ê³¤;vendor/spomky-labs/cbor-php/src/Tag/TagManagerInterface.phpyKAh†cþG¤4vendor/spomky-labs/cbor-php/src/Tag/TagInterface.phphyKAhh„™¾¤4vendor/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php“yKAh“}Òç¤3vendor/spomky-labs/cbor-php/src/Tag/BigFloatTag.php¯ yKAh¯ Mà@Ǥ/vendor/spomky-labs/cbor-php/src/Tag/CBORTag.php}yKAh}%Ƥ/vendor/spomky-labs/cbor-php/src/Tag/MimeTag.php´yKAh´<Ý,¤3vendor/spomky-labs/cbor-php/src/Tag/DatetimeTag.php¿yKAh¿Éb¿Ê¤7vendor/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.phpšyKAhš êlM¤1vendor/spomky-labs/cbor-php/src/Tag/Base64Tag.phpˆyKAhˆ|–㨤9vendor/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php™yKAh™Múá9¤=vendor/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.phpâyKAhâ°|}¤2vendor/spomky-labs/cbor-php/src/Tag/TagManager.phpEyKAhEƒa¤4vendor/spomky-labs/cbor-php/src/Tag/TimestampTag.phpã yKAhã qJÿ¤2vendor/spomky-labs/cbor-php/src/Tag/GenericTag.phpºyKAhº¥22•¤9vendor/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php™yKAh™ k¤9vendor/spomky-labs/cbor-php/src/NegativeIntegerObject.php yKAh €bx7¤(vendor/spomky-labs/pki-framework/LICENSESyKAhSÔt¶™¤*vendor/spomky-labs/pki-framework/README.mdàyKAhà7/Vç¤.vendor/spomky-labs/pki-framework/composer.jsonó yKAhó ±Â;¤,vendor/spomky-labs/pki-framework/SECURITY.mdIyKAhI,)¤5vendor/spomky-labs/pki-framework/src/ASN1/Element.phpŠ<yKAhŠ<š9t¤9vendor/spomky-labs/pki-framework/src/ASN1/Util/BigInt.php» yKAh» »‹`}¤8vendor/spomky-labs/pki-framework/src/ASN1/Util/Flags.phpyKAh ¡ó¤Bvendor/spomky-labs/pki-framework/src/ASN1/Component/Identifier.phpyKAhJ=ñ¤>vendor/spomky-labs/pki-framework/src/ASN1/Component/Length.phpáyKAhárài ¤@vendor/spomky-labs/pki-framework/src/ASN1/Type/PrimitiveType.php,yKAh,SZe2¤=vendor/spomky-labs/pki-framework/src/ASN1/Type/BaseString.phpÏyKAhÏM"ä~¤Fvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/BMPString.php_yKAh_íñ.¤Dvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Boolean.php9yKAh9áp@¤Dvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Integer.phpa yKAha Ã@ín¤Hvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/RelativeOID.php£yKAh£lbò¤Jvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/VisibleString.php¿yKAh¿ì†wn¤Cvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Number.phpŽyKAhŽzÚ¡¤Gvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UTF8String.phpèyKAhè•Æbù¤Fvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/BitString.phpyKAh+ú±¤Fvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/IA5String.php³yKAh³cÏ&k¤Lvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UniversalString.php„yKAh„Ál0Þ¤Jvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GraphicString.php²yKAh²W½ñï¤Mvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/ObjectDescriptor.phpØyKAhØY1¿€¤Avendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Real.php¾QyKAh¾Q¶~^¤Lvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/PrintableString.phpyKAhiTȘ¤@vendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/EOC.phpyKAh!¤Evendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/NullType.phpyKAhŒõ·o¤Mvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/ObjectIdentifier.phpÑyKAhÑz½‡&¤Gvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Enumerated.php:yKAh:âÀ÷N¤Jvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/NumericString.php¸yKAh¸œy{¤Hvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/OctetString.php2yKAh2ØÞáy¤Lvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GeneralizedTime.php7yKAh7€l ¾¤Dvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UTCTime.php: yKAh: 3W-N¤Kvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/VideotexString.phpµyKAhµý=Ä‘¤Lvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/CharacterString.php>yKAh>ƒƒà¤Fvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/T61String.phpyKAhÉìÙ_¤Jvendor/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GeneralString.php²yKAh²‰wÓº¤;vendor/spomky-labs/pki-framework/src/ASN1/Type/TimeType.php;yKAh;-R ý¤Ivendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ImplicitTagging.phpyKAhÎÌWq¤Mvendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ContextSpecificType.phpàyKAhà£Xþ—¤Nvendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ExplicitlyTaggedType.php&yKAh&×ßÝû¤Evendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/PrivateType.phpÙyKAhÙÜ4eY¤Ivendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ApplicationType.phpãyKAhãCàFþ¤Nvendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ImplicitlyTaggedType.php@yKAh@Œ€¤Gvendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/DERTaggedType.phpyKAh}LØV¤Hvendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/TaggedTypeWrap.php'yKAh'êÐ:ñ¤Ivendor/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ExplicitTagging.php´yKAh´ƒÇ\¤Gvendor/spomky-labs/pki-framework/src/ASN1/Type/Constructed/Sequence.php[ yKAh[ ï x¤Bvendor/spomky-labs/pki-framework/src/ASN1/Type/Constructed/Set.php$yKAh$~…¤Pvendor/spomky-labs/pki-framework/src/ASN1/Type/Constructed/ConstructedString.phpyKAh2L:¤Bvendor/spomky-labs/pki-framework/src/ASN1/Type/PrimitiveString.phpÄyKAhÄ @$ˆ¤<vendor/spomky-labs/pki-framework/src/ASN1/Type/Structure.phpMyKAhM­Ÿf<¤;vendor/spomky-labs/pki-framework/src/ASN1/Type/BaseTime.phpŸyKAhŸCLÓb¤Bvendor/spomky-labs/pki-framework/src/ASN1/Type/UnspecifiedType.php/?yKAh/??ðqФ=vendor/spomky-labs/pki-framework/src/ASN1/Type/TaggedType.php yKAh mú¤=vendor/spomky-labs/pki-framework/src/ASN1/Type/StringType.php•yKAh•ÿ&²ñ¤Avendor/spomky-labs/pki-framework/src/ASN1/Type/UniversalClass.phpyKAh³o³¤5vendor/spomky-labs/pki-framework/src/ASN1/DERData.phpùyKAhù($ĤAvendor/spomky-labs/pki-framework/src/ASN1/Feature/ElementBase.php¯yKAh¯}<Ðt¤@vendor/spomky-labs/pki-framework/src/ASN1/Feature/Stringable.phpsyKAhs€FM¤?vendor/spomky-labs/pki-framework/src/ASN1/Feature/Encodable.phpyKAhÜ´ï;¤Gvendor/spomky-labs/pki-framework/src/ASN1/Exception/DecodeException.phpÙyKAhÙ—}¨Ó¤;vendor/spomky-labs/pki-framework/src/CryptoEncoding/PEM.phpû yKAhû |f"ˤAvendor/spomky-labs/pki-framework/src/CryptoEncoding/PEMBundle.phpyKAhLüÐa¤Jvendor/spomky-labs/pki-framework/src/CryptoBridge/Crypto/OpenSSLCrypto.php•yKAh•ºóøž¤<vendor/spomky-labs/pki-framework/src/CryptoBridge/Crypto.php¤ yKAh¤ é§@¤>vendor/spomky-labs/pki-framework/src/X509/Certificate/Time.php¼ yKAh¼ Œ¤n¤bvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CRLDistributionPointsExtension.phpå yKAhå X—ºø¤gvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectDirectoryAttributesExtension.php& yKAh& K+Y¤nvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/SubjectAccessDescription.phpwyKAhwðøe\¤gvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/AccessDescription.php»yKAh»ëÛü¤pvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/AuthorityAccessDescription.phpJyKAhJ(~s¤bvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/NoRevocationAvailableExtension.php€yKAh€±‘—¤^vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyConstraintsExtension.phpÉ yKAhÉ Ößv!¤gvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/AuthorityInformationAccessExtension.php yKAh Ãܤevendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectInformationAccessExtension.php' yKAh' .î¤^vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/TargetInformationExtension.phpN yKAhN tc(¤Uvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/KeyUsageExtension.phpÅ yKAhÅ W).õ¤Uvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/TargetName.phpËyKAhËHAïú¤Rvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/Targets.phpÔ yKAhÔ µâ`%¤Qvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/Target.phpsyKAhsG]b¥¤Vvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/TargetGroup.phpõyKAhõ1*¬¤`vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyMappings/PolicyMapping.phphyKAhh‡äŤ\vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraintsExtension.phpp yKAhp ÿi¤Xvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/FreshestCRLExtension.phpUyKAhUÚE ¼¤Tvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/UnknownExtension.phpyKAhêømê¤bvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/IssuerAlternativeNameExtension.phpƒyKAhƒ7@A^¤`vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePoliciesExtension.phpx yKAhx á°õí¤]vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/InhibitAnyPolicyExtension.phpfyKAhfá¹UP¤bvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/RelativeName.phpeyKAheiÃwX¤gvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/DistributionPoint.phpñyKAhñp—Ó¿¤^vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/FullName.php±yKAh±»Í4¤avendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/ReasonFlags.php¼ yKAh¼ ­dŤkvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/DistributionPointName.phpÒyKAhÒT¥Q¤cvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraints/GeneralSubtrees.phpÓyKAhÓhL«\¤bvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraints/GeneralSubtree.php yKAh ˆK¤]vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/ExtendedKeyUsageExtension.phpyKAh¢W½L¤Wvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/AAControlsExtension.phpyKAherà¤evendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/NoticeReference.phpayKAhaœ© ¤ivendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/PolicyQualifierInfo.phpÚyKAhÚDr¤ivendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/UserNoticeQualifier.phpÎ yKAhÎ 4sµû¤gvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/PolicyInformation.phptyKAhtÒ«ð¤avendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/DisplayText.php6yKAh6ߍbvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/CPSQualifier.phpKyKAhK¢$vu¤[vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyMappingsExtension.phpyKAhp'i¤Mvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/Extension.php'yKAh'÷b¤cvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/AuthorityKeyIdentifierExtension.php¡yKAh¡p±úT¤cvendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectAlternativeNameExtension.php†yKAh† 6«+¤]vendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/BasicConstraintsExtension.php yKAh ¹?Úz¤avendor/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectKeyIdentifierExtension.phpÓyKAhÓ)ÿVS¤Evendor/spomky-labs/pki-framework/src/X509/Certificate/Certificate.phpµyKAhµ˜7;º¤Jvendor/spomky-labs/pki-framework/src/X509/Certificate/UniqueIdentifier.phpÁyKAhÁòúq¸¤Jvendor/spomky-labs/pki-framework/src/X509/Certificate/CertificateChain.phpæ yKAhæ íNƒ8¤Bvendor/spomky-labs/pki-framework/src/X509/Certificate/Validity.phpxyKAhxÛÙ$Ò¤Kvendor/spomky-labs/pki-framework/src/X509/Certificate/CertificateBundle.phpCyKAhCþ¤Ž¤Hvendor/spomky-labs/pki-framework/src/X509/Certificate/TBSCertificate.phpÃ8yKAhÃ8bò^¤Dvendor/spomky-labs/pki-framework/src/X509/Certificate/Extensions.php¢$yKAh¢$ó[«¤Fvendor/spomky-labs/pki-framework/src/X509/GeneralName/RegisteredID.php…yKAh…¸—Z3¤Gvendor/spomky-labs/pki-framework/src/X509/GeneralName/DirectoryName.php]yKAh]ô^¿¤Fvendor/spomky-labs/pki-framework/src/X509/GeneralName/EDIPartyName.phpñyKAhñN½oߤCvendor/spomky-labs/pki-framework/src/X509/GeneralName/OtherName.phpªyKAhªV$dó¤Cvendor/spomky-labs/pki-framework/src/X509/GeneralName/IPAddress.phpyKAh?U®¤Evendor/spomky-labs/pki-framework/src/X509/GeneralName/X400Address.phpÈyKAhÈãTù‘¤Evendor/spomky-labs/pki-framework/src/X509/GeneralName/IPv4Address.php!yKAh!µ#ø¤Fvendor/spomky-labs/pki-framework/src/X509/GeneralName/GeneralNames.phpyKAhÚ\³Ö¤Svendor/spomky-labs/pki-framework/src/X509/GeneralName/UniformResourceIdentifier.phpäyKAhäÅïeþ¤Dvendor/spomky-labs/pki-framework/src/X509/GeneralName/RFC822Name.phpÜyKAhÜßMpn¤Evendor/spomky-labs/pki-framework/src/X509/GeneralName/GeneralName.phpD yKAhD …ÉEvendor/spomky-labs/pki-framework/src/X509/GeneralName/IPv6Address.phpžyKAhžÜ Ip¤Avendor/spomky-labs/pki-framework/src/X509/GeneralName/DNSName.php(yKAh(Yº£j¤Dvendor/spomky-labs/pki-framework/src/X509/Feature/DateTimeHelper.php‹yKAh‹ù$u¤cvendor/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidationConfig.phpüyKAhü ÒU\¤cvendor/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidationResult.php\ yKAh\ cœ[¤]vendor/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/ValidatorState.php)yKAh)0ƒpˆ¤\vendor/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidator.php ByKAh B~°Ài¤evendor/spomky-labs/pki-framework/src/X509/CertificationPath/PathBuilding/CertificationPathBuilder.php½yKAh½õhÿ‡¤_vendor/spomky-labs/pki-framework/src/X509/CertificationPath/Exception/PathBuildingException.phpyKAhv‹¤avendor/spomky-labs/pki-framework/src/X509/CertificationPath/Exception/PathValidationException.phpCyKAhCWb'½¤Qvendor/spomky-labs/pki-framework/src/X509/CertificationPath/Policy/PolicyNode.phpTyKAhTR¯¹n¤Qvendor/spomky-labs/pki-framework/src/X509/CertificationPath/Policy/PolicyTree.php+5yKAh+5°1ûؤQvendor/spomky-labs/pki-framework/src/X509/CertificationPath/CertificationPath.phpyKAhÿæs¢¤Ovendor/spomky-labs/pki-framework/src/X509/Exception/X509ValidationException.php«yKAh«ˆ?Ü$¤ivendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/AccessIdentityAttributeValue.php5yKAh5§Ó3c¤Zvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/IetfAttrValue.php” yKAh” f¿# ¤Yvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/SvceAuthInfo.php yKAh ‚G•h¤mvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/AuthenticationInfoAttributeValue.phpNyKAhN˯Ťkvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/ChargingIdentityAttributeValue.phpãyKAhã–Ÿd¤`vendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/GroupAttributeValue.phpÌyKAhÌvRæè¤[vendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/IetfAttrSyntax.phpúyKAhúä¤_vendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/RoleAttributeValue.phpžyKAhžÁq1‡¤Mvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attributes.phpyKAh¤pr¤Ovendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/IssuerSerial.phpûyKAhû±hU¿¤Ivendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Holder.phpÂyKAhÂpSƒž¤Ivendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/V2Form.phpÞ yKAhÞ ´ê~¤[vendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttributeCertificateInfo.phpK&yKAhK&ûlz¨¤Svendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/ObjectDigestInfo.php™ yKAh™ ù>ó•¤Pvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttCertIssuer.phpByKAhBy0’¤Wvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttributeCertificate.phpyKAhƒŸ‘ÿ¤Xvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttCertValidityPeriod.php$yKAh$t´¡¤Yvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/ACValidator.phpÈyKAhÈ‹Åʤmvendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/Exception/ACValidationException.php yKAh ÄK‡„¤`vendor/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/ACValidationConfig.phpÎyKAhιü6¤Wvendor/spomky-labs/pki-framework/src/X509/CertificationRequest/CertificationRequest.phpyKAhõž`ø¤bvendor/spomky-labs/pki-framework/src/X509/CertificationRequest/Attribute/ExtensionRequestValue.phpDyKAhD ¤Mvendor/spomky-labs/pki-framework/src/X509/CertificationRequest/Attributes.phpÈyKAhÈ›©å¤[vendor/spomky-labs/pki-framework/src/X509/CertificationRequest/CertificationRequestInfo.phpÃyKAhÃæXФ6vendor/spomky-labs/pki-framework/src/X501/ASN1/RDN.php£yKAh£u©æ™¤@vendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeType.phpê@yKAhê@ª7êP¤Rvendor/spomky-labs/pki-framework/src/X501/ASN1/Collection/SequenceOfAttributes.phpyKAhxÀDc¤Mvendor/spomky-labs/pki-framework/src/X501/ASN1/Collection/SetOfAttributes.php2yKAh2%·Ž¤Qvendor/spomky-labs/pki-framework/src/X501/ASN1/Collection/AttributeCollection.php"yKAh",ËL¡¤<vendor/spomky-labs/pki-framework/src/X501/ASN1/Attribute.php#yKAh#9Âôÿ¤Svendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/LocalityNameValue.php yKAh ïî–`¤Pvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/GivenNameValue.php”yKAh”g¨¤Wvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/OrganizationNameValue.php°yKAh°¦09¤Lvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/TitleValue.phpƒyKAhƒfŽ÷2¤Svendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/SerialNumberValue.phpÖyKAhÖ ºG¤Pvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/AttributeValue.php¢yKAh¢Sg&¤Rvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/DescriptionValue.php›yKAh›GäϤRvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/CountryNameValue.phpÒyKAhÒêÞk¤Qvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/CommonNameValue.php˜yKAh˜40L¤Nvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/SurnameValue.php‹yKAh‹làù¤Pvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/PseudonymValue.php“yKAh“ÖÈó™¤Zvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/StateOrProvinceNameValue.php¾yKAh¾ Þˤ^vendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/Feature/PrintableStringValue.php«yKAh«ÑRpâ¤Yvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/Feature/DirectoryString.phpùyKAhùW¥¤Wvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/UnknownAttributeValue.php< yKAh< %U¤]vendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/OrganizationalUnitNameValue.phpÉyKAhÉ6‘Ûº¤Kvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/NameValue.phpyKAh¶ëñ¤Hvendor/spomky-labs/pki-framework/src/X501/ASN1/AttributeTypeAndValue.phpe yKAhe z\¥¤7vendor/spomky-labs/pki-framework/src/X501/ASN1/Name.phpPyKAhP:šº¥¤9vendor/spomky-labs/pki-framework/src/X501/DN/DNParser.phpd(yKAhd(õ«¤Gvendor/spomky-labs/pki-framework/src/X501/MatchingRule/MatchingRule.phpPyKAhP~j2™¤Jvendor/spomky-labs/pki-framework/src/X501/MatchingRule/CaseIgnoreMatch.php¢yKAh¢EʤIvendor/spomky-labs/pki-framework/src/X501/MatchingRule/CaseExactMatch.php‡yKAh‡Š–}¤Qvendor/spomky-labs/pki-framework/src/X501/MatchingRule/StringPrepMatchingRule.php{yKAh{峿æ¤Fvendor/spomky-labs/pki-framework/src/X501/MatchingRule/BinaryMatch.phpƒyKAhƒ r¤@vendor/spomky-labs/pki-framework/src/X501/StringPrep/MapStep.phpnyKAhnT›“¤Fvendor/spomky-labs/pki-framework/src/X501/StringPrep/NormalizeStep.php yKAh ¯éqƒ¤Dvendor/spomky-labs/pki-framework/src/X501/StringPrep/PrepareStep.phpöyKAhöo* ¤Fvendor/spomky-labs/pki-framework/src/X501/StringPrep/TranscodeStep.phpA yKAhA B —ˆ¤Fvendor/spomky-labs/pki-framework/src/X501/StringPrep/CheckBidiStep.phpíyKAhítI¶d¤Gvendor/spomky-labs/pki-framework/src/X501/StringPrep/StringPreparer.php•yKAh•o< I¤Evendor/spomky-labs/pki-framework/src/X501/StringPrep/ProhibitStep.phpêyKAhêÙã™÷¤[vendor/spomky-labs/pki-framework/src/X501/StringPrep/InsignificantNonSubstringSpaceStep.php!yKAh!Q6|¤¤Ovendor/spomky-labs/pki-framework/src/CryptoTypes/Signature/Ed25519Signature.phpÅyKAhņɤMvendor/spomky-labs/pki-framework/src/CryptoTypes/Signature/Ed448Signature.phpÁyKAhÁPb§¤Ovendor/spomky-labs/pki-framework/src/CryptoTypes/Signature/GenericSignature.phpByKAhB¢~¤Jvendor/spomky-labs/pki-framework/src/CryptoTypes/Signature/ECSignature.phpÆyKAhƦ¿¤Kvendor/spomky-labs/pki-framework/src/CryptoTypes/Signature/RSASignature.phpYyKAhYÞŠ -¤Hvendor/spomky-labs/pki-framework/src/CryptoTypes/Signature/Signature.phpÐyKAhÐUì(¤Pvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/OneAsymmetricKey.phpÝ)yKAhÝ)œNM@¤dvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/Attribute/OneAsymmetricKeyAttributes.phpyKAh¤HÀ¤Pvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSAPublicKey.php yKAh 3ÇÄ:¤Qvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSAPrivateKey.phpOyKAhOôøÁU¤Wvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSASSAPSSPrivateKey.phpjyKAhjf*¤Nvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECPublicKey.phpmyKAhmž©¿Ò¤Ovendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECPrivateKey.php*yKAh*QOM2¤Ovendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECConversion.php• yKAh• Ò’¤Ivendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PublicKey.php3yKAh3ZÄh¶¤Nvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PrivateKeyInfo.phpþyKAhþLn+ÿ¤Yvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/RFC8410PrivateKey.phpj yKAhj ö"áã¤Xvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/RFC8410PublicKey.phpÄyKAhÄ;.¤^vendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/X448PublicKey.php¤yKAh¤O€«¤_vendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/Ed448PublicKey.php©yKAh©+/¤_vendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/X448PrivateKey.phpêyKAhêãŸQª¤`vendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/Ed448PrivateKey.phpñyKAhñž ²¤bvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/X25519PublicKey.phpåyKAhå.)¸¥¤fvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Curve25519PublicKey.phpyKAh›4I¤cvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/X25519PrivateKey.phpyKAhvV’¤gvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Curve25519PrivateKey.php3yKAh3ôD3¤cvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Ed25519PublicKey.phpéyKAhé—ŠÊ™¤dvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Ed25519PrivateKey.phpyKAh.Î:¤Mvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PublicKeyInfo.php´yKAh´Ì3ÖD¤Jvendor/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PrivateKey.php0yKAh0I§x¤dvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/SpecificAlgorithmIdentifier.phpWyKAhWy ¨“¤\vendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifier.phppyKAhp %¡H¤}vendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA384WithRSAEncryptionAlgorithmIdentifier.phpìyKAhìøO +¤zvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD2WithRSAEncryptionAlgorithmIdentifier.php¬yKAh¬Qߕޤuvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA256AlgorithmIdentifier.php¨yKAh¨Ø÷-¤uvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA224AlgorithmIdentifier.php¨yKAh¨  ¿¤zvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD5WithRSAEncryptionAlgorithmIdentifier.php¬yKAh¬+æ¤yvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RFC3279RSASignatureAlgorithmIdentifier.phpyKAh)¡af¤zvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD4WithRSAEncryptionAlgorithmIdentifier.php©yKAh©wlœû¤yvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RFC4055RSASignatureAlgorithmIdentifier.phplyKAhl_esÔ¤uvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA512AlgorithmIdentifier.php¨yKAh¨6 f{¤rvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RSASignatureAlgorithmIdentifier.phpäyKAhäâ|îǤ}vendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA256WithRSAEncryptionAlgorithmIdentifier.phpêyKAhêçÛ`%¤svendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA1AlgorithmIdentifier.php¢yKAh¢bÂd ¤uvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA384AlgorithmIdentifier.php¨yKAh¨Ò,Pú¤qvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECSignatureAlgorithmIdentifier.phpíyKAhí‰_<¢¤}vendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA512WithRSAEncryptionAlgorithmIdentifier.phpêyKAhêùŠñ¤{vendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA1WithRSAEncryptionAlgorithmIdentifier.phpÎyKAhΰ1¤}vendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA224WithRSAEncryptionAlgorithmIdentifier.phpêyKAhêÒ&nŸ¤ovendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA224AlgorithmIdentifier.php÷yKAh÷ÌФgvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA224AlgorithmIdentifier.phpºyKAhºŸ1]̤ovendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA256AlgorithmIdentifier.php÷yKAh÷L˜À¤gvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA256AlgorithmIdentifier.php„yKAh„FýÁ¤lvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/RFC4231HMACAlgorithmIdentifier.phpsyKAhsT½E¤ovendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA512AlgorithmIdentifier.php÷yKAh÷N…¤gvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA512AlgorithmIdentifier.php„yKAh„I¥ûˤmvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA1AlgorithmIdentifier.phpÌyKAh̆l d¤evendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA2AlgorithmIdentifier.phpÓyKAhÓ‘¢ Ÿ¤dvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/MD5AlgorithmIdentifier.php¬yKAh¬Îî:„¤evendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA1AlgorithmIdentifier.phpyyKAhyÝ×òˆ¤ovendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA384AlgorithmIdentifier.phpóyKAhó/ú4¤gvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA384AlgorithmIdentifier.php„yKAh„MaA4¤ivendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/RC2CBCAlgorithmIdentifier.phpüyKAhüÊô¼¤¤mvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/DESEDE3CBCAlgorithmIdentifier.phpgyKAhgàåp¤lvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES192CBCAlgorithmIdentifier.php“yKAh“áüò ¤ivendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AESCBCAlgorithmIdentifier.phpéyKAhéq¾z“¤ivendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/CipherAlgorithmIdentifier.php8yKAh8­ "¤ivendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/DESCBCAlgorithmIdentifier.phpyKAhH­Yµ¤nvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/BlockCipherAlgorithmIdentifier.phpdyKAhdé~…¤lvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES128CBCAlgorithmIdentifier.php|yKAh|W½Ï¸¤lvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES256CBCAlgorithmIdentifier.php‘yKAh‘æ| Ĥrvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/ECPublicKeyAlgorithmIdentifier.php/yKAh/îD¤mvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/X25519AlgorithmIdentifier.php+yKAh+0Å”ã¤kvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/X448AlgorithmIdentifier.php#yKAh#oÅ“#¤pvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RFC8410EdAlgorithmIdentifier.phpùyKAhùØ ßŽ¤tvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RSAEncryptionAlgorithmIdentifier.php‹yKAh‹seRú¤lvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/Ed448AlgorithmIdentifier.php¹yKAh¹Ö°¤ovendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RFC8410XAlgorithmIdentifier.php¹yKAh¹L~.¥¤zvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RSAPSSSSAEncryptionAlgorithmIdentifier.php¡yKAh¡óòZ¤nvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/Ed25519AlgorithmIdentifier.phpÃyKAhÃóÿ¤cvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifierFactory.php$yKAh$#ꨤmvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/SignatureAlgorithmIdentifier.phpòyKAhò3Ò!¡¤gvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/PRFAlgorithmIdentifier.phpôyKAhôà!$¤tvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/AsymmetricCryptoAlgorithmIdentifier.php yKAh š…C¤hvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/HashAlgorithmIdentifier.phpíyKAhí&-®§¤nvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/EncryptionAlgorithmIdentifier.phpúyKAhúŸbO½¤hvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/AlgorithmIdentifierType.phpyyKAhylñ̤dvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifierProvider.php½yKAh½k\d¤cvendor/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/GenericAlgorithmIdentifier.phpýyKAhýCI ¤ vendor/spomky-labs/otphp/LICENSE@yKAh@xi×á¤"vendor/spomky-labs/otphp/README.md%yKAh%z¼@¤&vendor/spomky-labs/otphp/composer.json®yKAh®; Öô¤$vendor/spomky-labs/otphp/SECURITY.mdyKAh?Í m¤%vendor/spomky-labs/otphp/src/TOTP.phpžyKAhž>ôs?¤(vendor/spomky-labs/otphp/src/Factory.php+ yKAh+ »0$…¤-vendor/spomky-labs/otphp/src/OTPInterface.phpØ yKAhØ z™¶r¤.vendor/spomky-labs/otphp/src/TOTPInterface.php½yKAh½š*»´¤$vendor/spomky-labs/otphp/src/OTP.php×yKAh×óB˜½¤%vendor/spomky-labs/otphp/src/HOTP.php= yKAh= hct¡¤.vendor/spomky-labs/otphp/src/HOTPInterface.php=yKAh=ð…ߤ1vendor/spomky-labs/otphp/src/FactoryInterface.phpryKAhr‘ç…¤/vendor/spomky-labs/otphp/src/ParameterTrait.php¥yKAh¥šda&¤$vendor/spomky-labs/otphp/src/Url.php# yKAh# >졤.vendor/spomky-labs/otphp/src/InternalClock.php5yKAh5G¤ÇƤ$vendor/doctrine/deprecations/LICENSE)yKAh)"¿ê0¤&vendor/doctrine/deprecations/README.md yKAh {›¬¤*vendor/doctrine/deprecations/composer.json yKAh ¸¤?vendor/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php©yKAh©äÙjϤ0vendor/doctrine/deprecations/src/Deprecation.phpƒ$yKAhƒ$Ãõ)¤vendor/firebase/php-jwt/LICENSEùyKAhù³â#¤$vendor/firebase/php-jwt/CHANGELOG.mdØ(yKAhØ(¹D¤!vendor/firebase/php-jwt/README.md¾4yKAh¾4!Ukµ¤%vendor/firebase/php-jwt/composer.json¤yKAh¤Åëܤ9vendor/firebase/php-jwt/src/SignatureInvalidException.phpuyKAhuϽ²¤4vendor/firebase/php-jwt/src/BeforeValidException.phptyKAht±uÉ0¤,vendor/firebase/php-jwt/src/CachedKeySet.phpðyKAhðØ Ø¤#vendor/firebase/php-jwt/src/Key.phpìyKAhìlx+¤#vendor/firebase/php-jwt/src/JWK.phpA,yKAhA,ª–ö¤@vendor/firebase/php-jwt/src/JWTExceptionWithPayloadInterface.phpyKAhkÇy¤0vendor/firebase/php-jwt/src/ExpiredException.phppyKAhpç¶Õ7¤#vendor/firebase/php-jwt/src/JWT.phpË\yKAhË\2בµ¤vendor/brick/math/LICENSEAyKAhA¸Ý¸L¤vendor/brick/math/CHANGELOG.md—LyKAh—LK/%¤$vendor/brick/math/psalm-baseline.xmlô yKAhô ±Öš¤vendor/brick/math/composer.jsonRyKAhRÁ¼IG¤&vendor/brick/math/src/RoundingMode.phpü yKAhü ££º”¤;vendor/brick/math/src/Internal/Calculator/GmpCalculator.php' yKAh' ‚;0¤>vendor/brick/math/src/Internal/Calculator/BcMathCalculator.phpÂyKAhÂä­,1¤>vendor/brick/math/src/Internal/Calculator/NativeCalculator.phpÕ7yKAhÕ7ã#.¤-vendor/brick/math/src/Internal/Calculator.php¼IyKAh¼I¯}…—¤$vendor/brick/math/src/BigInteger.php0€yKAh0€ºdß2¤#vendor/brick/math/src/BigNumber.php¬>yKAh¬>¢Eä$vendor/brick/math/src/BigDecimal.phpVyKAhVMê@Ƥ1vendor/brick/math/src/Exception/MathException.php«yKAh«E‰:•¤9vendor/brick/math/src/Exception/NumberFormatException.php±yKAh±ojQ˜¤;vendor/brick/math/src/Exception/NegativeNumberException.phpyKAh +;ƒ¤;vendor/brick/math/src/Exception/DivisionByZeroException.phpíyKAhíÆÆj¤<vendor/brick/math/src/Exception/IntegerOverflowException.php,yKAh,1C>*¤>vendor/brick/math/src/Exception/RoundingNecessaryException.phpÚyKAhÚìAüœ¤%vendor/brick/math/src/BigRational.phpÅ.yKAhÅ.Šþ2h¤(vendor/justinrainbow/json-schema/LICENSE yKAh ºç©¤2vendor/justinrainbow/json-schema/bin/validate-json¡yKAh¡ò¤Fvendor/justinrainbow/json-schema/dist/schema/json-schema-draft-03.jsonyKAh-aߤFvendor/justinrainbow/json-schema/dist/schema/json-schema-draft-04.jsonyKAhN›ß¤*vendor/justinrainbow/json-schema/README.mdzyKAhzË±Š€¤.vendor/justinrainbow/json-schema/composer.json¢yKAh¢7©•¤;vendor/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php‘yKAh‘«ù™Ì¤=vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php¬ yKAh¬ Å ®¤Ivendor/justinrainbow/json-schema/src/JsonSchema/UriRetrieverInterface.phpyKAhïhJ¤Pvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php{yKAh{=6¤Gvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php×yKAh×ÐÀߤPvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php— yKAh— ™½Uj¤Nvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php¾yKAh¾M’Y¾¤Nvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php yKAh ó¼õÖ¤Nvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.phpyKAhl$М¤Pvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.phpyKAhî¢^ ¤Svendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php3yKAh3Í9ŸÂ¤Tvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.phpÕyKAhÕâ5q¤Jvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php¼yKAh¼d5­¤Pvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php.#yKAh.#¡Ê'†¤\vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php«yKAh«æyȤYvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php:yKAh:š*é9¤Xvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.phpûyKAhû¬r(¤Svendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.phpº<yKAhº<ÝU¸>¤Pvendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php!yKAh!ëºó¤Fvendor/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php4 yKAh4 îíöª¤Hvendor/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php yKAh «ï"¤Kvendor/justinrainbow/json-schema/src/JsonSchema/Iterator/ObjectIterator.phpê yKAhê h‘l¤Avendor/justinrainbow/json-schema/src/JsonSchema/SchemaStorage.phpùyKAhù¦Nêq¤Xvendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php÷yKAh÷º-ì,¤Tvendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php€yKAh€_›Ç¤Gvendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.phpÀyKAhÀ®x(¤Rvendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php^ yKAh^ ‚ɤRvendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php yKAh ‹/8¤Dvendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php$yKAh$¦Aq¤Cvendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.phpæyKAhæÛ_9<¤Wvendor/justinrainbow/json-schema/src/JsonSchema/Exception/ResourceNotFoundException.phpbyKAhb©`Á¤Pvendor/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.phpXyKAhX[®¥±¤Nvendor/justinrainbow/json-schema/src/JsonSchema/Exception/RuntimeException.phpoyKAhoCör¤Wvendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSourceUriException.phpjyKAhj*5¤Vvendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php‡yKAh‡ÍNŽ¢¤^vendor/justinrainbow/json-schema/src/JsonSchema/Exception/UnresolvableJsonPointerException.php˜yKAh˜ZüHe¤Qvendor/justinrainbow/json-schema/src/JsonSchema/Exception/ValidationException.php'yKAh'AŠj¤Tvendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidConfigException.php_yKAh_Ô÷P¤Svendor/justinrainbow/json-schema/src/JsonSchema/Exception/JsonDecodingException.phpðyKAhðnÊáW¤Tvendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaException.php\yKAh\µ@S6¤Rvendor/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.phpXyKAhXÝÓ”¤]vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaMediaTypeException.phpeyKAheU3Ð$¤Jvendor/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php.yKAh.VÔ g¤1vendor/crell/api-problem/docker/php/81/DockerfileÙyKAhÙ…D1ý¤1vendor/crell/api-problem/docker/php/81/xdebug.inilyKAhlb“Ì0¤>vendor/crell/api-problem/docker/php/conf.d/error_reporting.iniÎyKAhΩlc¤!vendor/crell/api-problem/Makefile]yKAh]Zib¤*vendor/crell/api-problem/phpstan.neon.dist0yKAh0³Üçb¤+vendor/crell/api-problem/docker-compose.ymlbyKAhbR’uv¤&vendor/crell/api-problem/composer.json”yKAh”VÔN+¤$vendor/crell/api-problem/SECURITY.mdw yKAhw _yùU¤%vendor/crell/api-problem/default-.env–yKAh–]h Q¤4vendor/crell/api-problem/src/JsonEncodeException.phpyKAhe·wF¤.vendor/crell/api-problem/src/HttpConverter.php6 yKAh6 1B¾¤3vendor/crell/api-problem/src/JsonParseException.phpHyKAhH%P“(¤.vendor/crell/api-problem/src/JsonException.php¾ yKAh¾ ÷5ë-¤+vendor/crell/api-problem/src/ApiProblem.phpdHyKAhdH¾'ÙM¤vendor/psr/cache/CHANGELOG.mdêyKAhê- ªG¤vendor/psr/cache/README.md"yKAh"(AcÓ¤vendor/psr/cache/LICENSE.txt8yKAh8D©f¼¤vendor/psr/cache/composer.json4yKAh4¶ÉC¤/vendor/psr/cache/src/CacheItemPoolInterface.php‡yKAh‡ÖéY¤+vendor/psr/cache/src/CacheItemInterface.php&yKAh&=bФ1vendor/psr/cache/src/InvalidArgumentException.php:yKAh:MòY¯¤'vendor/psr/cache/src/CacheException.php±yKAh±B…Jµ¤#vendor/psr/event-dispatcher/LICENSE(yKAh(Í}]¤%vendor/psr/event-dispatcher/README.mdEyKAhEúS±¤)vendor/psr/event-dispatcher/composer.jsonbyKAhbq—è¤=vendor/psr/event-dispatcher/src/ListenerProviderInterface.phpyKAh‰bh¤<vendor/psr/event-dispatcher/src/EventDispatcherInterface.php¿yKAh¿¶¤;vendor/psr/event-dispatcher/src/StoppableEventInterface.php!yKAh!T>qš¤vendor/psr/http-message/LICENSE=yKAh=Úçê¤$vendor/psr/http-message/CHANGELOG.md3yKAh3æ:\Y¤!vendor/psr/http-message/README.mdüyKAhü¨Œ‰¤%vendor/psr/http-message/composer.jsonÁyKAhÁ½7â¤6vendor/psr/http-message/src/ServerRequestInterface.phpH(yKAhH(…Ý#¤,vendor/psr/http-message/src/UriInterface.php/2yKAh/2Ë×§Y¤/vendor/psr/http-message/src/StreamInterface.php yKAh ÍÀ¤5vendor/psr/http-message/src/UploadedFileInterface.phpŒyKAhŒšÒ »¤0vendor/psr/http-message/src/RequestInterface.phpGyKAhGiŠr¤1vendor/psr/http-message/src/ResponseInterface.phpZ yKAhZ aG¿¤0vendor/psr/http-message/src/MessageInterface.phpÎyKAhÎ|Cƒ¤vendor/psr/container/LICENSEyyKAhyÊO“p¤vendor/psr/container/README.mdByKAhBg?¤"vendor/psr/container/composer.jsonÕyKAhÕ¶nY—¤7vendor/psr/container/src/NotFoundExceptionInterface.php­yKAh­ä¿B@¤/vendor/psr/container/src/ContainerInterface.php%yKAh%Þ)¤8vendor/psr/container/src/ContainerExceptionInterface.phpÆyKAhÆ ¿Š¤vendor/psr/http-client/LICENSE=yKAh=ÅS¸¤#vendor/psr/http-client/CHANGELOG.mdùyKAhùzòªŒ¤ vendor/psr/http-client/README.md%yKAh%‹F’¤$vendor/psr/http-client/composer.jsonyKAhÃbÄϤ8vendor/psr/http-client/src/NetworkExceptionInterface.php°yKAh°6SB¤8vendor/psr/http-client/src/RequestExceptionInterface.phphyKAhh*c=¤.vendor/psr/http-client/src/ClientInterface.php!yKAh!{0»·¤7vendor/psr/http-client/src/ClientExceptionInterface.phpºyKAhºxÔÎz¤vendor/psr/log/LICENSE=yKAh=p±ŽO¤vendor/psr/log/README.mdByKAhBúò'©¤vendor/psr/log/composer.json`yKAh`],¤+vendor/psr/log/src/LoggerAwareInterface.php÷yKAh÷»®ow¤vendor/psr/log/src/LogLevel.phpHyKAhHuÁ¼¤'vendor/psr/log/src/LoggerAwareTrait.phpjyKAhjdßz¤/vendor/psr/log/src/InvalidArgumentException.phpoyKAhoMWd¤!vendor/psr/log/src/NullLogger.php“yKAh“¢<ÿ¤&vendor/psr/log/src/LoggerInterface.phpâ yKAhâ c=…Á¤"vendor/psr/log/src/LoggerTrait.phpÓ yKAhÓ ÿ ñ¤%vendor/psr/log/src/AbstractLogger.php­yKAh­q¿Ûá¤vendor/psr/clock/LICENSE8yKAh8õ•Ól¤vendor/psr/clock/CHANGELOG.mdÎyKAhÎïå<¤vendor/psr/clock/README.mdäyKAhäGôL[¤vendor/psr/clock/composer.json2yKAh2$DCM¤'vendor/psr/clock/src/ClockInterface.phpÝyKAhÝHã%À¤vendor/psr/http-factory/LICENSE(yKAh(Í}]¤!vendor/psr/http-factory/README.md,yKAh,zwf¤%vendor/psr/http-factory/composer.json8yKAh8ꓤ8vendor/psr/http-factory/src/ResponseFactoryInterface.php2yKAh2Õ±Œ}¤6vendor/psr/http-factory/src/StreamFactoryInterface.phpšyKAhš„œÿe¤<vendor/psr/http-factory/src/UploadedFileFactoryInterface.phpJyKAhJànʉ¤3vendor/psr/http-factory/src/UriFactoryInterface.phpUyKAhUçƒù™¤=vendor/psr/http-factory/src/ServerRequestFactoryInterface.php¯yKAh¯wëü9¤7vendor/psr/http-factory/src/RequestFactoryInterface.phpyKAh›4ß(¤vendor/monolog/monolog/LICENSE'yKAh'òôõ¤#vendor/monolog/monolog/CHANGELOG.mdÎÁyKAhÎÁn¢r⤠vendor/monolog/monolog/README.mdAyKAhAo®¤$vendor/monolog/monolog/composer.json3 yKAh3 ­°î¤>vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.phpÏ yKAhÏ  FϤ@vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php€yKAh€&¦‹ ¤:vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php²yKAh²)ßBs¤;vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.phpÛyKAhÛpÃs°¤Hvendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.phpyKAh£cJ¤<vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.phpY/yKAhY/ðq]ú¤Cvendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.phpJyKAhJ¢œH¤:vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php¬yKAh¬ó³:¤<vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.phpyyKAhyè,Z̤<vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.phpÇyKAhÇκ~¤=vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.phpÔ yKAhÔ  kVʤDvendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.phpz yKAhz U6èX¤>vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.phpðyKAhð˜ÝÌ8¤=vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.phpO yKAhO ­‘Àƒ¤Yvendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php§yKAh§z¹í.¤Zvendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php„yKAh„ܸ„¤\vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.phpÎ yKAhÎ ü;ÝÓ¤;vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.phpû yKAhû ”Yëî¤Cvendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.phpyKAh¢¤>vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.phpzyKAhz–Eñ^¤6vendor/monolog/monolog/src/Monolog/Handler/Handler.phpæyKAhæ¢ö|´¤>vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.phpÊ yKAhÊ ÓË7m¤>vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.phpG yKAhG ¥B¤>vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.phpJyKAhJ1ëæð¤Jvendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.phpÎyKAhÎ'ÉW±¤Hvendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.phpèyKAhè€ l¤Dvendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php´ yKAh´ $¤?vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php4yKAh4²¥¦¤¤Dvendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php$yKAh$ ™Aߤ<vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.phpyKAh¾š¤9vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.phpùyKAhù- M‹¤Bvendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php>yKAh>³–^n¤Cvendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.phpÕyKAhÕÃüú<¤Bvendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php€yKAh€øô.t¤=vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php¤ yKAh¤ ünDÁ¤=vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.phpUyKAhUù…Ù¤Fvendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.phpyKAhN'x~¤:vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.phpyKAhµca¤Avendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php† yKAh† áÀ§¤@vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.phpQ0yKAhQ0Év¼Ö¤>vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php° yKAh° µ*rʤ@vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.phpäyKAhä·Dç¤>vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.phpÊ yKAhÊ ›ógo¤Cvendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.phpYyKAhYŽh¤=vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.phpyKAhþ¸½¤8vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.phpyKAh™íA¤Evendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.phpÙyKAhÙO!ÚÖ¤>vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.phpàyKAhà«%Tg¤Jvendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.phpyKAh¦¥ÿñ¤Avendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.phpëyKAhëë†Þ¤:vendor/monolog/monolog/src/Monolog/Handler/MailHandler.phpýyKAhýNÜv¤<vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php5 yKAh5 EòW¤<vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.phpayKAhaÙÓ¤Bvendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.phpyKAhKdﮤ>vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.phpÀyKAhÀŠˆ»ý¤Fvendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php“yKAh“Ú ³f¤?vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php/yKAh/§m™¤@vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php—'yKAh—'¤“ޤ9vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php» yKAh» |cUì¤>vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php)yKAh)ê̤Fvendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.phpŒyKAhŒPK¤?vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.phpù yKAhù õä2¤;vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.phpyKAh’¡ç'¤?vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.phpI yKAhI èŒT¤:vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php|yKAh|©Wœb¤:vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php%yKAh%p‡aĤAvendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php$yKAh$ª39¸¤>vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php yKAh Ý\+w¤Hvendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.phpõyKAhõc°l¤=vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php³ yKAh³ æ(ÙŒ¤;vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.phpÒ yKAhÒ µªªþ¤:vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.phpFyKAhF!fB¤Bvendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.phpÔyKAhÔbØH¤Hvendor/monolog/monolog/src/Monolog/JsonSerializableDateTimeImmutable.phpòyKAhòÏkܤ-vendor/monolog/monolog/src/Monolog/Logger.php;YyKAh;YýÜ{ý¤Cvendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php‘yKAh‘“bê¤Cvendor/monolog/monolog/src/Monolog/Attribute/WithMonologChannel.phpyKAhêG‘L¤8vendor/monolog/monolog/src/Monolog/DateTimeImmutable.phphyKAhhx\G¤;vendor/monolog/monolog/src/Monolog/Test/MonologTestCase.php@yKAh@ª(-ý¤4vendor/monolog/monolog/src/Monolog/Test/TestCase.phpyKAh>7˜)¤/vendor/monolog/monolog/src/Monolog/Registry.phpÇyKAhÇ=ìƒá¤Bvendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.phpüyKAhü '1¤Gvendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.phpI yKAhI •­ƒ¤=vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.phpU yKAhU •ô8¤Ivendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php|yKAh|_`x¤Cvendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php™yKAh™+éæ@¤Evendor/monolog/monolog/src/Monolog/Processor/LoadAverageProcessor.php\yKAh\s¶¤Hvendor/monolog/monolog/src/Monolog/Processor/ClosureContextProcessor.phpÈyKAhÈ:Eúg¤Cvendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.phpyKAhî§O¤=vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.phpÊyKAhÊG?o¤=vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.phpÛyKAhÛ\à@ï¤@vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.phpyKAhÛÔ)ð¤Gvendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php\yKAh\hù•¤=vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.phpyKAhHòÑz¤Cvendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php]yKAh]Ål(¤Evendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.phpiyKAhiÀ3;w¤:vendor/monolog/monolog/src/Monolog/ResettableInterface.phpÞyKAhÞÓZṳ̂4vendor/monolog/monolog/src/Monolog/SignalHandler.phpZyKAhZN–”¤,vendor/monolog/monolog/src/Monolog/Level.php\yKAh\$رn¤Bvendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php;yKAh; ר¤Bvendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.phpšyKAhšq*åë¤>vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.phph&yKAhh&‰؃¤>vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.phpmyKAhmlÐ S¤Bvendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.phpC yKAhC ömÓ¼¤Cvendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php‚yKAh‚ÌQ¤Bvendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.phpQ yKAhQ n@ùޤ@vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.phpyKAh‰×¤Gvendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.phpFyKAhFpzþï¤@vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.phpyKAh’ÐPa¤Avendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.phpûyKAhûþÑÕ¤Cvendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php´yKAh´‹éè¤Avendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.phpyKAh(QÐG¤Evendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.phpYyKAhY9PÜi¤Bvendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.phpyKAhŽŒ:¤Lvendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php¶yKAh¶ÈÛÙ¤@vendor/monolog/monolog/src/Monolog/Formatter/SyslogFormatter.phpyKAhæ°‚°¤Dvendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.phpÁ'yKAhÁ'»6xq¤>vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.phpyKAh‚x© ¤0vendor/monolog/monolog/src/Monolog/LogRecord.php yKAh „ñà ¤3vendor/monolog/monolog/src/Monolog/ErrorHandler.php„'yKAh„'±4_¤,vendor/monolog/monolog/src/Monolog/Utils.phpr"yKAhr"c„¤!vendor/studio24/rotate/LICENSE.md>yKAh>¤3ä"vendor/studio24/rotate/phpunit.xmlöyKAhög·§E¤ vendor/studio24/rotate/README.md¿yKAh¿?¹þ/¤$vendor/studio24/rotate/composer.jsonàyKAhà¢WîѤ.vendor/studio24/rotate/src/RotateException.php_yKAh_éæ ;¤%vendor/studio24/rotate/src/Rotate.php#yKAh#š·j¤-vendor/studio24/rotate/src/FilenameFormat.php±yKAh±£ò=D¤-vendor/studio24/rotate/src/RotateAbstract.php„yKAh„DÁÚ¤6vendor/studio24/rotate/src/FilenameFormatException.phpgyKAhgˆÜ™í¤%vendor/studio24/rotate/src/Delete.php|#yKAh|#…ؤ0vendor/studio24/rotate/src/DirectoryIterator.phpkyKAhkçmÛA¤Gvendor/symfony/framework-bundle/DataCollector/AbstractDataCollector.phpÚyKAhÚØxϤEvendor/symfony/framework-bundle/DataCollector/RouterDataCollector.phpDyKAhD}àüޤUvendor/symfony/framework-bundle/DataCollector/TemplateAwareDataCollectorInterface.phpUyKAhU~suܤ'vendor/symfony/framework-bundle/LICENSE,yKAh,„©»U¤7vendor/symfony/framework-bundle/Test/KernelTestCase.phpAyKAhA“ËRó¤Bvendor/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.phpÊyKAhÊì3¤>vendor/symfony/framework-bundle/Test/MailerAssertionsTrait.phpeyKAhe}¡‹w¤Dvendor/symfony/framework-bundle/Test/NotificationAssertionsTrait.php%yKAh%†*û¤Bvendor/symfony/framework-bundle/Test/HttpClientAssertionsTrait.php‘yKAh‘Ú~sô¤Bvendor/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.phpã!yKAhã!ëð탤9vendor/symfony/framework-bundle/Test/TestBrowserToken.php€yKAh€¤4vendor/symfony/framework-bundle/Test/WebTestCase.php²yKAh²¨Þ5¤?vendor/symfony/framework-bundle/Test/WebTestAssertionsTrait.php¶yKAh¶Ù*¤6vendor/symfony/framework-bundle/Test/TestContainer.phpPyKAhPÔ”q¤,vendor/symfony/framework-bundle/CHANGELOG.md¥yKAh¥Ä·õ¤:vendor/symfony/framework-bundle/Translation/Translator.phpRyKAhR ±H¤7vendor/symfony/framework-bundle/Secrets/SodiumVault.phpK#yKAhK#¿?£/¤7vendor/symfony/framework-bundle/Secrets/DotenvVault.php8 yKAh8 U:›¤9vendor/symfony/framework-bundle/Secrets/AbstractVault.phpïyKAhï¢~´p¤Ivendor/symfony/framework-bundle/Resources/bin/check-unused-known-tags.phpŠyKAhŠó®1©¤Avendor/symfony/framework-bundle/Resources/config/asset_mapper.php$yKAh$™ƒO)¤8vendor/symfony/framework-bundle/Resources/config/esi.php¿yKAh¿ßý¯¤@vendor/symfony/framework-bundle/Resources/config/translation.phpM yKAhM ¯êTפ?vendor/symfony/framework-bundle/Resources/config/serializer.phpy'yKAhy'PÂF¤?vendor/symfony/framework-bundle/Resources/config/form_debug.php·yKAh·’‚þ"¤>vendor/symfony/framework-bundle/Resources/config/validator.php¿yKAh¿iL6Ǥ>vendor/symfony/framework-bundle/Resources/config/semaphore.php³yKAh³4ò.²¤@vendor/symfony/framework-bundle/Resources/config/annotations.php› yKAh› ›Ý‹\¤>vendor/symfony/framework-bundle/Resources/config/profiling.php=yKAh=+Êö¤;vendor/symfony/framework-bundle/Resources/config/mailer.php yKAh óÄ븤Fvendor/symfony/framework-bundle/Resources/config/fragment_listener.phpwyKAhwVÖýg¤Fvendor/symfony/framework-bundle/Resources/config/translation_debug.php©yKAh©ø‡$¤Cvendor/symfony/framework-bundle/Resources/config/notifier_debug.phpØyKAhØ“w0¤Avendor/symfony/framework-bundle/Resources/config/rate_limiter.php›yKAh›”|s¤9vendor/symfony/framework-bundle/Resources/config/lock.phpêyKAhêz̬¤Hvendor/symfony/framework-bundle/Resources/config/identity_translator.php¾yKAh¾ãWµ¤@vendor/symfony/framework-bundle/Resources/config/http_client.phpx yKAhx ^?”ϤAvendor/symfony/framework-bundle/Resources/config/mailer_debug.php¿yKAh¿`Ü„ ¤=vendor/symfony/framework-bundle/Resources/config/services.php]#yKAh]#âkâ¤:vendor/symfony/framework-bundle/Resources/config/cache.php"yKAh"à-l7¤<vendor/symfony/framework-bundle/Resources/config/session.phpðyKAhðwrÔ¤Fvendor/symfony/framework-bundle/Resources/config/mailer_transports.php yKAh i? ¤Jvendor/symfony/framework-bundle/Resources/config/translation_providers.phpÀ yKAhÀ ±?ÕH¤:vendor/symfony/framework-bundle/Resources/config/debug.php¯yKAh¯Lµ_¤Evendor/symfony/framework-bundle/Resources/config/notifier_webhook.phpyKAhŠŒ,ç¤Fvendor/symfony/framework-bundle/Resources/config/fragment_renderer.php¶ yKAh¶ ô¾¡¤=vendor/symfony/framework-bundle/Resources/config/web_link.phpZyKAhZOjÀ¤<vendor/symfony/framework-bundle/Resources/config/routing.phpyKAhAü¤Gvendor/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsdg¿yKAhg¿™#`R¤=vendor/symfony/framework-bundle/Resources/config/notifier.php–yKAh–¡öEc¤Fvendor/symfony/framework-bundle/Resources/config/http_client_debug.php¸yKAh¸³"5$¤<vendor/symfony/framework-bundle/Resources/config/request.php†yKAh†këP?¤9vendor/symfony/framework-bundle/Resources/config/test.php‰yKAh‰†Á«§¤<vendor/symfony/framework-bundle/Resources/config/webhook.php³yKAh³P쌤Dvendor/symfony/framework-bundle/Resources/config/validator_debug.phpËyKAhËG¨Uˆ¤Cvendor/symfony/framework-bundle/Resources/config/error_renderer.php/yKAh/†¼£¤>vendor/symfony/framework-bundle/Resources/config/mime_type.php yKAh ‡øH̤>vendor/symfony/framework-bundle/Resources/config/messenger.php?#yKAh?#öY„è¤<vendor/symfony/framework-bundle/Resources/config/console.php3yKAh3çuÒ¤8vendor/symfony/framework-bundle/Resources/config/uid.php=yKAh=”ÖSœ¤Bvendor/symfony/framework-bundle/Resources/config/property_info.php§ yKAh§ j©¤>vendor/symfony/framework-bundle/Resources/config/scheduler.phpÒyKAhÒ1æ@w¤8vendor/symfony/framework-bundle/Resources/config/ssi.php¿yKAh¿ý5{¤8vendor/symfony/framework-bundle/Resources/config/web.phpyKAhk?Ö“¤Dvendor/symfony/framework-bundle/Resources/config/messenger_debug.php¯yKAh¯Äoç¤?vendor/symfony/framework-bundle/Resources/config/collectors.phpqyKAhq¡%”(¤Cvendor/symfony/framework-bundle/Resources/config/routing/errors.xmlüyKAhüÞ>¯¤Dvendor/symfony/framework-bundle/Resources/config/routing/webhook.xmlÉyKAhÉÞVcë¤Cvendor/symfony/framework-bundle/Resources/config/html_sanitizer.phpóyKAhó£PÝÕ¤<vendor/symfony/framework-bundle/Resources/config/secrets.phpÝyKAhÝ*®Ån¤9vendor/symfony/framework-bundle/Resources/config/form.php°yKAh°m17¤Evendor/symfony/framework-bundle/Resources/config/serializer_debug.php‹yKAh‹Ú÷Ÿå¤Cvendor/symfony/framework-bundle/Resources/config/workflow_debug.phpyKAhRÄRT¤Cvendor/symfony/framework-bundle/Resources/config/mailer_webhook.php¨ yKAh¨ îdea¤>vendor/symfony/framework-bundle/Resources/config/form_csrf.phpDyKAhDA3U¤=vendor/symfony/framework-bundle/Resources/config/workflow.phpËyKAhË#m7Y¤Bvendor/symfony/framework-bundle/Resources/config/security_csrf.phpyKAh~ÍܤHvendor/symfony/framework-bundle/Resources/config/notifier_transports.php^3yKAh^3|¿›õ¤?vendor/symfony/framework-bundle/Resources/config/debug_prod.php‹yKAh‹_ÝQ¤Dvendor/symfony/framework-bundle/Resources/config/property_access.phpØyKAhØŒìBʤ;vendor/symfony/framework-bundle/Resources/config/assets.phpÕyKAhÕòv'»¤@vendor/symfony/framework-bundle/Resources/config/cache_debug.phpÊyKAhÊá¨%]¤Avendor/symfony/framework-bundle/Resources/config/remote_event.php›yKAh›ª ›Ã¤<vendor/symfony/framework-bundle/Resources/config/process.phpcyKAhcÃ÷¤1vendor/symfony/framework-bundle/KernelBrowser.phpyKAhéû‡¤Dvendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php^ yKAh^ óhr¤Hvendor/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.phpcyKAhcgºíp¤Jvendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.phpß yKAhß $bΤAvendor/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.phpyKAh)ððï¤Gvendor/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.phpyKAh2e÷—¤Evendor/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php yKAh Ü^M¤Kvendor/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php‰yKAh‰ìÒ§ì¤Fvendor/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php”yKAh”÷…lå¤Avendor/symfony/framework-bundle/Controller/AbstractController.php·HyKAh·HŽç¸¤Avendor/symfony/framework-bundle/Controller/TemplateController.php™ yKAh™ k†¤Avendor/symfony/framework-bundle/Controller/ControllerResolver.php3yKAh3”0ª¤Avendor/symfony/framework-bundle/Controller/RedirectController.phpÑyKAhÑH°ðǤ)vendor/symfony/framework-bundle/README.md!yKAh!qí¤7vendor/symfony/framework-bundle/HttpCache/HttpCache.phpù yKAhù ìÅR ¤3vendor/symfony/framework-bundle/FrameworkBundle.phpÓ3yKAhÓ3ŒØ¨ ¤>vendor/symfony/framework-bundle/Command/SecretsListCommand.php° yKAh° cc4ƒ¤Jvendor/symfony/framework-bundle/Command/CachePoolInvalidateTagsCommand.phpKyKAhKüÜ,ؤ@vendor/symfony/framework-bundle/Command/SecretsRemoveCommand.phpw yKAhw ¬¼‘A¤=vendor/symfony/framework-bundle/Command/CacheClearCommand.php(yKAh(ÈÉ~¤<vendor/symfony/framework-bundle/Command/XliffLintCommand.php‡yKAh‡vtc¤Hvendor/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php yKAh Ã’¤Avendor/symfony/framework-bundle/Command/AbstractConfigCommand.phpiyKAhi­ðVP¤>vendor/symfony/framework-bundle/Command/RouterDebugCommand.phpìyKAhìs`ùi¤Dvendor/symfony/framework-bundle/Command/TranslationUpdateCommand.php/DyKAh/D͉z ¤Fvendor/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php8yKAh8”!¤@vendor/symfony/framework-bundle/Command/AssetsInstallCommand.phpü'yKAhü']3ø%¤Avendor/symfony/framework-bundle/Command/CachePoolPruneCommand.phpúyKAhú~’T}¤Avendor/symfony/framework-bundle/Command/CachePoolClearCommand.phpµyKAhµZ Q~¤@vendor/symfony/framework-bundle/Command/ContainerLintCommand.php\yKAh\]š6¤Jvendor/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php1 yKAh1 dƃ|¤Bvendor/symfony/framework-bundle/Command/DebugAutowiringCommand.php…yKAh…éâ\ý¤>vendor/symfony/framework-bundle/Command/CacheWarmupCommand.php´ yKAh´ :5Τ?vendor/symfony/framework-bundle/Command/WorkflowDumpCommand.phpDyKAhDõ&»¤Gvendor/symfony/framework-bundle/Command/EventDispatcherDebugCommand.phpyKAh Ù‘Y¤Avendor/symfony/framework-bundle/Command/ContainerDebugCommand.phps<yKAhs<_q¤Cvendor/symfony/framework-bundle/Command/TranslationDebugCommand.phpa<yKAha<Î1g§¤;vendor/symfony/framework-bundle/Command/YamlLintCommand.phpAyKAhAFˆùs¤@vendor/symfony/framework-bundle/Command/CachePoolListCommand.phpyKAh;qšš¤Fvendor/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php²yKAh²¤ƒÖ¤Bvendor/symfony/framework-bundle/Command/CachePoolDeleteCommand.phpŒ yKAhŒ yUðɤDvendor/symfony/framework-bundle/Command/BuildDebugContainerTrait.php€ yKAh€ œÒ¥¤8vendor/symfony/framework-bundle/Command/AboutCommand.php«yKAh«n™Ù¤>vendor/symfony/framework-bundle/Command/RouterMatchCommand.php7yKAh7}ãS¤=vendor/symfony/framework-bundle/Command/SecretsSetCommand.php:yKAh:ûê¤>vendor/symfony/framework-bundle/Command/ConfigDebugCommand.php4)yKAh4)E^%¤Jvendor/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php!yKAh!„)ª\¤Jvendor/symfony/framework-bundle/Routing/AttributeRouteControllerLoader.php­yKAh­Üv1)¤Ovendor/symfony/framework-bundle/Routing/Attribute/AsRoutingConditionService.phpÖyKAhÖny¤@vendor/symfony/framework-bundle/Routing/RouteLoaderInterface.php‰yKAh‰ïb× ¤2vendor/symfony/framework-bundle/Routing/Router.phpÁyKAhÁ~Un¤<vendor/symfony/framework-bundle/Routing/DelegatingLoader.phpÎ yKAhÎ õ§Õ¤Jvendor/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php yKAh yˆ,à¤Evendor/symfony/framework-bundle/DependencyInjection/Configuration.php¶AyKAh¶A~ÝÎå¤Jvendor/symfony/framework-bundle/DependencyInjection/FrameworkExtension.phpȃyKAhȃ‚én¤Ovendor/symfony/framework-bundle/DependencyInjection/VirtualRequestStackPass.php´yKAh´Ïç w¤^vendor/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.phpSyKAhSn>.¾¤`vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php  yKAh  j(Šv¤cvendor/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.phpWyKAhWW*ðͤOvendor/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.phptyKAht…bî"¤Rvendor/symfony/framework-bundle/DependencyInjection/Compiler/AssetsContextPass.phpôyKAhô¾¥Æo¤Xvendor/symfony/framework-bundle/DependencyInjection/Compiler/ErrorLoggerCompilerPass.php×yKAhײ9/§¤]vendor/symfony/framework-bundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.phpyKAh¿Óì¤Zvendor/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php#yKAh#â¬,¤Zvendor/symfony/framework-bundle/DependencyInjection/Compiler/EnableLoggerDebugModePass.phpÚyKAhÚ}§Vï¤`vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php@ yKAh@ yÜ`1¤Vvendor/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.phpY yKAhY Nˆx¤\vendor/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.phpVyKAhV0›#¤_vendor/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php«yKAh«‡~•Y¤Mvendor/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php yKAh £&1¬¤jvendor/symfony/framework-bundle/DependencyInjection/Compiler/RemoveUnusedSessionMarshallingHandlerPass.php yKAh Æk)̤Yvendor/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php¬yKAh¬Ã`:W¤-vendor/symfony/framework-bundle/composer.jsonÙyKAhÙcFD ¤;vendor/symfony/framework-bundle/Kernel/MicroKernelTrait.phpd yKAhd ÙŸ¬O¤7vendor/symfony/framework-bundle/Console/Application.phpE yKAhE '23¤Evendor/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php¶myKAh¶mêÐJL¤Dvendor/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.phpÓjyKAhÓjksnU¤Avendor/symfony/framework-bundle/Console/Descriptor/Descriptor.php¯6yKAh¯6 äøº¤Evendor/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.phpDyKAhD˜vFú¤Ivendor/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php8IyKAh8Ih–šã¤Cvendor/symfony/framework-bundle/Console/Helper/DescriptorHelper.phpìyKAhì*øá¤Ivendor/symfony/framework-bundle/EventListener/ConsoleProfilerListener.php²yKAh²³c®¤Qvendor/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.phpË yKAhË SòÓu¤%vendor/symfony/monolog-bundle/LICENSE)yKAh)àÅÿǤ*vendor/symfony/monolog-bundle/CHANGELOG.mdÎyKAhο:L¤¤:vendor/symfony/monolog-bundle/Resources/config/monolog.xml. yKAh. 0yK¤Evendor/symfony/monolog-bundle/Resources/config/schema/monolog-1.0.xsd¤'yKAh¤')Xç¤<vendor/symfony/monolog-bundle/SwiftMailer/MessageFactory.phpyKAh×êÉû¤'vendor/symfony/monolog-bundle/README.mdYyKAhY°¸ù¤/vendor/symfony/monolog-bundle/MonologBundle.phpŸyKAhŸ¨@gФFvendor/symfony/monolog-bundle/DependencyInjection/MonologExtension.phpi¡yKAhi¡veó¨¤Cvendor/symfony/monolog-bundle/DependencyInjection/Configuration.phpó¦yKAhó¦çvr¤Pvendor/symfony/monolog-bundle/DependencyInjection/Compiler/AddProcessorsPass.php¶ yKAh¶ ÂR÷¤Pvendor/symfony/monolog-bundle/DependencyInjection/Compiler/LoggerChannelPass.php™yKAh™Æþƒ¶¤Ovendor/symfony/monolog-bundle/DependencyInjection/Compiler/DebugHandlerPass.php yKAh HS¤Qvendor/symfony/monolog-bundle/DependencyInjection/Compiler/FixEmptyLoggerPass.phpïyKAhï³DNî¤Zvendor/symfony/monolog-bundle/DependencyInjection/Compiler/AddSwiftMailerTransportPass.phpËyKAhË*Q ¤+vendor/symfony/monolog-bundle/composer.jsonyKAhàºÇ‡¤%vendor/symfony/polyfill-php73/LICENSE,yKAh,é¤ý¤'vendor/symfony/polyfill-php73/Php73.phpsyKAhsD\…µ¤?vendor/symfony/polyfill-php73/Resources/stubs/JsonException.phpEyKAhE8S–ì¤+vendor/symfony/polyfill-php73/bootstrap.phpóyKAhó€Ò|¤'vendor/symfony/polyfill-php73/README.md/yKAh/ƒm¿¤+vendor/symfony/polyfill-php73/composer.jsonyKAh æ­t¤Cvendor/symfony/serializer/DataCollector/SerializerDataCollector.php?yKAh?8´ÿ¤(vendor/symfony/serializer/Serializer.phpÝGyKAhÝG=у¤Ivendor/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.phpu yKAhu ³ 5¤<vendor/symfony/serializer/Mapping/ClassMetadataInterface.php3yKAh3é—™¤3vendor/symfony/serializer/Mapping/ClassMetadata.phpV yKAhV øÅ=¤<vendor/symfony/serializer/Mapping/Loader/AttributeLoader.php+5yKAh+5yÑì¤7vendor/symfony/serializer/Mapping/Loader/FileLoader.phpFyKAhFh‹ºÕ¤<vendor/symfony/serializer/Mapping/Loader/LoaderInterface.phpYyKAhY ¥lÞ¤;vendor/symfony/serializer/Mapping/Loader/YamlFileLoader.phpÚyKAhÚßr¿F¤avendor/symfony/serializer/Mapping/Loader/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd™yKAh™‘7ð¤:vendor/symfony/serializer/Mapping/Loader/XmlFileLoader.php¼yKAh¼ñW–ø¤8vendor/symfony/serializer/Mapping/Loader/LoaderChain.php“yKAh“¤S*¤=vendor/symfony/serializer/Mapping/Loader/AnnotationLoader.php±yKAh±ša¤Ivendor/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.phpêyKAhêô2‚¤@vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php­ yKAh­ v5ޤ?vendor/symfony/serializer/Mapping/ClassDiscriminatorMapping.php¢yKAh¢Ä2q’¤Jvendor/symfony/serializer/Mapping/Factory/ClassMetadataFactoryCompiler.phppyKAhpˆAŒ ¤@vendor/symfony/serializer/Mapping/Factory/ClassResolverTrait.php+yKAh+ué¤Bvendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.phpÎyKAhÎ5Œ¤Gvendor/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.phpyKAh¡Âõ¤Jvendor/symfony/serializer/Mapping/Factory/CompiledClassMetadataFactory.php7 yKAh7 @IP¤Kvendor/symfony/serializer/Mapping/Factory/ClassMetadataFactoryInterface.phpyKAhóº”/¤7vendor/symfony/serializer/Mapping/AttributeMetadata.phpÛyKAhÛÔj¨\¤1vendor/symfony/serializer/SerializerInterface.php}yKAh}w¥p¤Fvendor/symfony/serializer/Context/Encoder/CsvEncoderContextBuilder.phpçyKAhç¬ÀH¾¤Fvendor/symfony/serializer/Context/Encoder/XmlEncoderContextBuilder.php_yKAh_g°dr¤Gvendor/symfony/serializer/Context/Encoder/YamlEncoderContextBuilder.phpÔyKAhÔÇð\™¤Gvendor/symfony/serializer/Context/Encoder/JsonEncoderContextBuilder.phpyKAh 8œ¤9vendor/symfony/serializer/Context/ContextBuilderTrait.php×yKAh×êWÑ6¤>vendor/symfony/serializer/Context/SerializerContextBuilder.phpÈyKAhÈÞµR¤=vendor/symfony/serializer/Context/ContextBuilderInterface.phpÉyKAhÉn ¤Ovendor/symfony/serializer/Context/Normalizer/ObjectNormalizerContextBuilder.php#yKAh#Dݲ¤Qvendor/symfony/serializer/Context/Normalizer/DateTimeNormalizerContextBuilder.phpïyKAhï,ÈçP¤Rvendor/symfony/serializer/Context/Normalizer/FormErrorNormalizerContextBuilder.php‚yKAh‚sÚ¤Uvendor/symfony/serializer/Context/Normalizer/GetSetMethodNormalizerContextBuilder.php/yKAh/¨géB¤Yvendor/symfony/serializer/Context/Normalizer/JsonSerializableNormalizerContextBuilder.php1yKAh1ì®ðz¤Pvendor/symfony/serializer/Context/Normalizer/ProblemNormalizerContextBuilder.phpˆyKAhˆ\oœq¤Wvendor/symfony/serializer/Context/Normalizer/AbstractObjectNormalizerContextBuilder.phpQyKAhQÈ2¤Svendor/symfony/serializer/Context/Normalizer/BackedEnumNormalizerContextBuilder.phpgyKAhg¹ýÖS¤`vendor/symfony/serializer/Context/Normalizer/ConstraintViolationListNormalizerContextBuilder.php7yKAh7€gO¤Uvendor/symfony/serializer/Context/Normalizer/UnwrappingDenormalizerContextBuilder.php!yKAh!út;9¤Qvendor/symfony/serializer/Context/Normalizer/AbstractNormalizerContextBuilder.php“yKAh“ûr㽤Lvendor/symfony/serializer/Context/Normalizer/UidNormalizerContextBuilder.phpŸyKAhŸB½4¤Qvendor/symfony/serializer/Context/Normalizer/PropertyNormalizerContextBuilder.php„yKAh„Žà8³¤Uvendor/symfony/serializer/Context/Normalizer/DateIntervalNormalizerContextBuilder.phpByKAhBº´Ñ¤6vendor/symfony/serializer/Attribute/SerializedName.phpòyKAhòކpl¤.vendor/symfony/serializer/Attribute/Ignore.phpçyKAhç„û×õ¤/vendor/symfony/serializer/Attribute/Context.php yKAh Oq'¤8vendor/symfony/serializer/Attribute/DiscriminatorMap.phpàyKAhàªËåÓ¤6vendor/symfony/serializer/Attribute/SerializedPath.phpyKAh°<‰¤0vendor/symfony/serializer/Attribute/MaxDepth.phpÇyKAhÇ[v¼¤.vendor/symfony/serializer/Attribute/Groups.php”yKAh”!xâ ¤!vendor/symfony/serializer/LICENSE,yKAh,„©»U¤&vendor/symfony/serializer/CHANGELOG.md6<yKAh6<qSx¤0vendor/symfony/serializer/Encoder/CsvEncoder.php'yKAh'8”zÚ¤Bvendor/symfony/serializer/Encoder/ContextAwareDecoderInterface.php¢yKAh¢o×û¤2vendor/symfony/serializer/Encoder/ChainEncoder.phpg yKAhg áAû0¤6vendor/symfony/serializer/Encoder/DecoderInterface.php/yKAh/ µ¤Bvendor/symfony/serializer/Encoder/ContextAwareEncoderInterface.php¢yKAh¢Q€{N¤Avendor/symfony/serializer/Encoder/NormalizationAwareInterface.phpvyKAhv /g¤6vendor/symfony/serializer/Encoder/EncoderInterface.phpyKAh_ J¤2vendor/symfony/serializer/Encoder/ChainDecoder.phpÍyKAhÍ}…Æ[¤0vendor/symfony/serializer/Encoder/JsonEncode.phpžyKAhžúÖôÛ¤1vendor/symfony/serializer/Encoder/JsonEncoder.php³yKAh³ÕÜw¯¤0vendor/symfony/serializer/Encoder/JsonDecode.php<yKAh<D¨h$¤1vendor/symfony/serializer/Encoder/YamlEncoder.phpq yKAhq !y]€¤0vendor/symfony/serializer/Encoder/XmlEncoder.phpÀHyKAhÀHpbR¤Jvendor/symfony/serializer/CacheWarmer/CompiledClassMetadataCacheWarmer.php7yKAh7ÛÆ¬c¤7vendor/symfony/serializer/Annotation/SerializedName.php[yKAh[PRð¤/vendor/symfony/serializer/Annotation/Ignore.phpCyKAhC 𽩤0vendor/symfony/serializer/Annotation/Context.phpìyKAhì;i*¤9vendor/symfony/serializer/Annotation/DiscriminatorMap.phpByKAhBR?ý¤7vendor/symfony/serializer/Annotation/SerializedPath.php[yKAh[Þ¢6X¤1vendor/symfony/serializer/Annotation/MaxDepth.phpIyKAhI ÿBY¤/vendor/symfony/serializer/Annotation/Groups.php^yKAh^wLN¤Lvendor/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php^yKAh^$Ù7¤Cvendor/symfony/serializer/Extractor/ObjectPropertyListExtractor.php{yKAh{Ežè¤6vendor/symfony/serializer/SerializerAwareInterface.phpyKAhÉMî¤#vendor/symfony/serializer/README.mdJyKAhJÔMc%¤Bvendor/symfony/serializer/NameConverter/NameConverterInterface.phpÚyKAhÚpvEq¤Jvendor/symfony/serializer/NameConverter/AdvancedNameConverterInterface.phpyKAhÜ¢6¤Fvendor/symfony/serializer/NameConverter/MetadataAwareNameConverter.phpòyKAhòüç.]¤Mvendor/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php8yKAh8Ö\Ѥ2vendor/symfony/serializer/Command/DebugCommand.phpyyKAhy†2 3¤;vendor/symfony/serializer/Normalizer/DateTimeNormalizer.phpÊyKAhÊa‡Z¤>vendor/symfony/serializer/Normalizer/MimeMessageNormalizer.phpDyKAhDBrÍŒ¤@vendor/symfony/serializer/Normalizer/DenormalizableInterface.phpvyKAhv‰¼’¤:vendor/symfony/serializer/Normalizer/ProblemNormalizer.phpÜyKAhÜK¤Ivendor/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php"yKAh"JgÂɤ>vendor/symfony/serializer/Normalizer/ObjectToPopulateTrait.php-yKAh-Ò~}¤<vendor/symfony/serializer/Normalizer/FormErrorNormalizer.phpÎ yKAhÎ cÿ±I¤Jvendor/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php7yKAh7òë#¤:vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php yKAh £ã¤Avendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.phpוyKAhוŒÉX¤?vendor/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php yKAh 6¿„Ǥ?vendor/symfony/serializer/Normalizer/UnwrappingDenormalizer.php} yKAh} ÜÉ/)¤=vendor/symfony/serializer/Normalizer/NormalizerAwareTrait.phpkyKAhk©#¤Avendor/symfony/serializer/Normalizer/NormalizerAwareInterface.php%yKAh%º:]R¤Cvendor/symfony/serializer/Normalizer/JsonSerializableNormalizer.php1 yKAh1 P±C¤:vendor/symfony/serializer/Normalizer/DataUriNormalizer.phpÛyKAhÛØŒ%¤Hvendor/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.phpyKAh+©¤9vendor/symfony/serializer/Normalizer/CustomNormalizer.phpB yKAhB Oî(„¤Cvendor/symfony/serializer/Normalizer/DenormalizerAwareInterface.php/yKAh/<†Ç–¤?vendor/symfony/serializer/Normalizer/DateIntervalNormalizer.php–yKAh–z«Ô‹¤;vendor/symfony/serializer/Normalizer/PropertyNormalizer.php• yKAh• ¨Ò:í¤9vendor/symfony/serializer/Normalizer/ObjectNormalizer.php6'yKAh6'ЯOQ¤;vendor/symfony/serializer/Normalizer/AbstractNormalizer.php¸ayKAh¸aPtº€¤?vendor/symfony/serializer/Normalizer/TranslatableNormalizer.php–yKAh–Z7(G¤6vendor/symfony/serializer/Normalizer/UidNormalizer.php¨yKAh¨Àru¤>vendor/symfony/serializer/Normalizer/DenormalizerInterface.php× yKAh× Vi3¤>vendor/symfony/serializer/Normalizer/NormalizableInterface.php¿yKAh¿ö¤?vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.phpáyKAhá5ª8m¤=vendor/symfony/serializer/Normalizer/BackedEnumNormalizer.php,yKAh,ígº¤Jvendor/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.phpñyKAhñ’o©¤<vendor/symfony/serializer/Normalizer/NormalizerInterface.php yKAh ìe¤?vendor/symfony/serializer/Normalizer/DenormalizerAwareTrait.php{yKAh{‚o·¤2vendor/symfony/serializer/SerializerAwareTrait.php`yKAh`Ä|ˆ¤@vendor/symfony/serializer/DependencyInjection/SerializerPass.phpš yKAhš »…¤6vendor/symfony/serializer/Exception/LogicException.phpÐyKAhЋˆA¤:vendor/symfony/serializer/Exception/ExceptionInterface.phpÁyKAhÁZúaã¤Lvendor/symfony/serializer/Exception/MissingConstructorArgumentsException.phpyKAh‹aÛô¤@vendor/symfony/serializer/Exception/UnexpectedValueException.phpîyKAhîròÂǤ8vendor/symfony/serializer/Exception/RuntimeException.phpØyKAhØVXš¤Evendor/symfony/serializer/Exception/NotNormalizableValueException.phpcyKAhcNÍœð¤@vendor/symfony/serializer/Exception/InvalidArgumentException.phpðyKAhð›Çn ¤Bvendor/symfony/serializer/Exception/CircularReferenceException.phpÅyKAhÅs5ï¤>vendor/symfony/serializer/Exception/BadMethodCallException.phpŽyKAhŽ‘} ¨¤8vendor/symfony/serializer/Exception/MappingException.php±yKAh±Ç ÞÛ¤<vendor/symfony/serializer/Exception/UnsupportedException.phpÉyKAhÉ®Âî¤Bvendor/symfony/serializer/Exception/NotEncodableValueException.phpÀyKAhÀ\Ó53¤Gvendor/symfony/serializer/Exception/PartialDenormalizationException.phpMyKAhMÜDˆ¤Bvendor/symfony/serializer/Exception/UnsupportedFormatException.phpµyKAhµG`k¤@vendor/symfony/serializer/Exception/ExtraAttributesException.php®yKAh®3ÙŒª¤'vendor/symfony/serializer/composer.jsonŒ yKAhŒ ŸÉ®Š¤4vendor/symfony/serializer/Debug/TraceableEncoder.php'yKAh'´hͤ7vendor/symfony/serializer/Debug/TraceableSerializer.phpŽyKAh޳&Ix¤7vendor/symfony/serializer/Debug/TraceableNormalizer.phpayKAha ;ݤ*vendor/symfony/polyfill-php80/PhpToken.phpÍyKAhÍdÿF¤%vendor/symfony/polyfill-php80/LICENSE,yKAh, KîÀ¤:vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.phpwyKAhw=7T8¤<vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php>yKAh>g¦Žó¤;vendor/symfony/polyfill-php80/Resources/stubs/Attribute.phpðyKAhðMKÜ<¤Evendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.phpGyKAhGÖˆ+¤<vendor/symfony/polyfill-php80/Resources/stubs/Stringable.phpŒyKAhŒt]\Ú¤+vendor/symfony/polyfill-php80/bootstrap.phpüyKAhüø.Ĥ'vendor/symfony/polyfill-php80/README.md—yKAh—"t°F¤'vendor/symfony/polyfill-php80/Php80.php‰yKAh‰H¤+vendor/symfony/polyfill-php80/composer.jsonbyKAhbF¥¤7vendor/symfony/monolog-bridge/Handler/MailerHandler.phpõyKAhõä1àd¤Hvendor/symfony/monolog-bridge/Handler/CompatibilityProcessingHandler.phpyKAh¸‰¢¤8vendor/symfony/monolog-bridge/Handler/ConsoleHandler.php±yKAh±£Ñº ¤Svendor/symfony/monolog-bridge/Handler/FingersCrossed/HttpCodeActivationStrategy.php»yKAh»Øcï¤Svendor/symfony/monolog-bridge/Handler/FingersCrossed/NotFoundActivationStrategy.phpTyKAhTËÑs¤:vendor/symfony/monolog-bridge/Handler/ServerLogHandler.php yKAh \~›ÿ¤>vendor/symfony/monolog-bridge/Handler/CompatibilityHandler.phpûyKAhû!ç’E¤9vendor/symfony/monolog-bridge/Handler/NotifierHandler.php´ yKAh´ %¢þˤ8vendor/symfony/monolog-bridge/Handler/FirePHPHandler.phpyKAhJ˜Âà¤:vendor/symfony/monolog-bridge/Handler/ChromePhpHandler.php0yKAh0öõÚݤFvendor/symfony/monolog-bridge/Handler/ElasticsearchLogstashHandler.phpyKAhIà6¤(vendor/symfony/monolog-bridge/Logger.php- yKAh- ô‰y¤%vendor/symfony/monolog-bridge/LICENSE,yKAh,„©»U¤*vendor/symfony/monolog-bridge/CHANGELOG.md€ yKAh€ `s¤:vendor/symfony/monolog-bridge/Processor/TokenProcessor.php<yKAh<ø]þޤDvendor/symfony/monolog-bridge/Processor/SwitchUserTokenProcessor.phpùyKAhùA ÜŠ¤8vendor/symfony/monolog-bridge/Processor/WebProcessor.php†yKAh†¼¤Bvendor/symfony/monolog-bridge/Processor/CompatibilityProcessor.php!yKAh!6$’ñ¤:vendor/symfony/monolog-bridge/Processor/RouteProcessor.phpˆ yKAhˆ ½é<¤Cvendor/symfony/monolog-bridge/Processor/ConsoleCommandProcessor.phpJyKAhJZ¬·U¤Bvendor/symfony/monolog-bridge/Processor/AbstractTokenProcessor.php¼yKAh¼“þdC¤:vendor/symfony/monolog-bridge/Processor/DebugProcessor.phpì yKAhì °Èc4¤'vendor/symfony/monolog-bridge/README.mdÇyKAhÇ=–¬~¤<vendor/symfony/monolog-bridge/Formatter/ConsoleFormatter.phpÍyKAhÍPÂÞp¤>vendor/symfony/monolog-bridge/Formatter/VarDumperFormatter.php0yKAh0rµ~ݤBvendor/symfony/monolog-bridge/Formatter/CompatibilityFormatter.phpyKAhžË¦k¤:vendor/symfony/monolog-bridge/Command/ServerLogCommand.phpŸyKAhŸøµ»î¤+vendor/symfony/monolog-bridge/composer.json²yKAh²-}Öb¤9vendor/symfony/cache/DataCollector/CacheDataCollector.php yKAh ¡²¤"vendor/symfony/cache/CacheItem.phpÄyKAhÄ‹=g†¤#vendor/symfony/cache/Psr16Cache.php=yKAh=8`c¤vendor/symfony/cache/LICENSE,yKAh,ÀX¤+vendor/symfony/cache/PruneableInterface.phpÖyKAhÖ¥aù]¤!vendor/symfony/cache/CHANGELOG.mdoyKAhoÊ—XJ¤5vendor/symfony/cache/Traits/RedisClusterNodeProxy.phpÎyKAhÎ&yõF¤/vendor/symfony/cache/Traits/RelayProxyTrait.phpyKAhÈRÑô¤*vendor/symfony/cache/Traits/RedisTrait.phpBuyKAhBuºpU¾¤+vendor/symfony/cache/Traits/Redis5Proxy.php×·yKAh×·äÆ\Ù¤2vendor/symfony/cache/Traits/RedisCluster6Proxy.phps¿yKAhs¿®„Qñ¤*vendor/symfony/cache/Traits/ProxyTrait.php%yKAh%‡ŽP¾¤5vendor/symfony/cache/Traits/FilesystemCommonTrait.php9yKAh9ùç¤1vendor/symfony/cache/Traits/RedisClusterProxy.phpyKAh`"½¤*vendor/symfony/cache/Traits/RedisProxy.phpøyKAhøGŠ.r¤.vendor/symfony/cache/Traits/ContractsTrait.php&yKAh&.»M=¤*vendor/symfony/cache/Traits/RelayProxy.phpÚyKAhÚVz"¤0vendor/symfony/cache/Traits/Redis6ProxyTrait.phpŠ yKAhŠ …©Pý¤,vendor/symfony/cache/Traits/ValueWrapper.phpEyKAhEi7º¢¤2vendor/symfony/cache/Traits/RedisCluster5Proxy.php\“yKAh\“ùUÒ¤/vendor/symfony/cache/Traits/FilesystemTrait.phpë yKAhë ÿ›ß7¤+vendor/symfony/cache/Traits/Redis6Proxy.phpÐyKAhÐïX¤4vendor/symfony/cache/Traits/Relay/GeosearchTrait.php'yKAh'å˜7²¤/vendor/symfony/cache/Traits/Relay/MoveTrait.phpãyKAhãÊÑb¤2vendor/symfony/cache/Traits/Relay/PfcountTrait.phpÓyKAhÓ¼DÞû¤/vendor/symfony/cache/Traits/Relay/CopyTrait.phpâyKAhâãѽŒ¤9vendor/symfony/cache/Traits/Relay/NullableReturnTrait.phpZyKAhZ*zʤ/vendor/symfony/cache/Traits/Relay/HsetTrait.phpãyKAh㊠Eö¤3vendor/symfony/cache/Traits/Relay/GetrangeTrait.phpÐyKAhÐÅXÔ–¤4vendor/symfony/cache/Traits/AbstractAdapterTrait.php\0yKAh\0è1Ť7vendor/symfony/cache/Traits/RedisCluster6ProxyTrait.phpÈyKAhÈÕÅXm¤-vendor/symfony/cache/Adapter/ProxyAdapter.php_yKAh_<å˜ã¤,vendor/symfony/cache/Adapter/ApcuAdapter.php? yKAh? â[Ä/¤;vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php¶yKAh¶ÜÆ«}¤1vendor/symfony/cache/Adapter/TraceableAdapter.phpƒyKAhƒ bJ6¤+vendor/symfony/cache/Adapter/PdoAdapter.phpAyKAhAô™¤-vendor/symfony/cache/Adapter/ArrayAdapter.phpø,yKAhø,ß ™¤5vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php¢0yKAh¢0ö‰Á1¤7vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.phpÕyKAhÕÜÈ<^¤,vendor/symfony/cache/Adapter/NullAdapter.phpÈyKAhÈ:•@¤4vendor/symfony/cache/Adapter/ParameterNormalizer.phpžyKAhžñ÷™+¤0vendor/symfony/cache/Adapter/TagAwareAdapter.php¼,yKAh¼,ˆ«mX¤0vendor/symfony/cache/Adapter/PhpFilesAdapter.php(yKAh( »Ï&¤4vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php’AyKAh’AnƬq¤9vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php yKAh ø¬Ÿ?¤1vendor/symfony/cache/Adapter/MemcachedAdapter.php¯4yKAh¯4ºl9 ¤-vendor/symfony/cache/Adapter/RedisAdapter.php/yKAh/-U=$¤1vendor/symfony/cache/Adapter/AdapterInterface.php‰yKAh‰$üB­¤:vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.phpî#yKAhî#Âàˤ9vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.phpyKAh6–s:¤-vendor/symfony/cache/Adapter/Psr16Adapter.php*yKAh*$ÝÀ\¤-vendor/symfony/cache/Adapter/ChainAdapter.php]"yKAh]"òñx¸¤2vendor/symfony/cache/Adapter/FilesystemAdapter.phpïyKAhï(Acb¤0vendor/symfony/cache/Adapter/AbstractAdapter.php2yKAh2@“ê2¤8vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.phpø1yKAhø1ûÌ;,¤0vendor/symfony/cache/Adapter/PhpArrayAdapter.phpÑ/yKAhÑ/äŤ%vendor/symfony/cache/LockRegistry.php¥yKAh¥)?ÍÓ¤,vendor/symfony/cache/ResettableInterface.php¾yKAh¾NRõ¤vendor/symfony/cache/README.md®yKAh®`ñt:¤9vendor/symfony/cache/Messenger/EarlyExpirationHandler.php7 yKAh7 Œ‘r²¤9vendor/symfony/cache/Messenger/EarlyExpirationMessage.phpÁ yKAhÁ %›ñ¤<vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.phpØ yKAhØ €”§q¤5vendor/symfony/cache/Marshaller/DefaultMarshaller.phpKyKAhKÊh&¤5vendor/symfony/cache/Marshaller/DeflateMarshaller.phpÄyKAhÄC¤µ¤7vendor/symfony/cache/Marshaller/MarshallerInterface.php3yKAh3‡ÃÇ™¤6vendor/symfony/cache/Marshaller/TagAwareMarshaller.php÷ yKAh÷ €t‚¤4vendor/symfony/cache/Marshaller/SodiumMarshaller.php` yKAh` F‚Éå¤:vendor/symfony/cache/DependencyInjection/CachePoolPass.php,'yKAh,'VìM¤@vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.phpyKAhmûÖ}¤?vendor/symfony/cache/DependencyInjection/CacheCollectorPass.phpî yKAhî ”tð¤Avendor/symfony/cache/DependencyInjection/CachePoolClearerPass.phpôyKAhôöÅ:¤1vendor/symfony/cache/Exception/LogicException.phpÅyKAhÅ9d«¤;vendor/symfony/cache/Exception/InvalidArgumentException.phpyKAh…Ýj¤1vendor/symfony/cache/Exception/CacheException.php»yKAh»¹Qõ4¤"vendor/symfony/cache/composer.jsonŒyKAhŒÝFw¤-vendor/symfony/polyfill-ctype/bootstrap80.phpryKAhrßF)ƒ¤%vendor/symfony/polyfill-ctype/LICENSE,yKAh,é¤ý¤+vendor/symfony/polyfill-ctype/bootstrap.php@yKAh@j×Q9¤'vendor/symfony/polyfill-ctype/README.md^yKAh^lH¸k¤'vendor/symfony/polyfill-ctype/Ctype.php¶yKAh¶¦ ê/¤+vendor/symfony/polyfill-ctype/composer.jsonyKAh9¬¾¤%vendor/symfony/polyfill-php81/LICENSE,yKAh,0ðò¤Fvendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php¥yKAh¥5‡+¤@vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php›yKAh›ûèJT¤+vendor/symfony/polyfill-php81/bootstrap.phpâyKAhâ<P¤'vendor/symfony/polyfill-php81/README.md¡yKAh¡¡Á¤'vendor/symfony/polyfill-php81/Php81.phpÇyKAhÇ 3ýE¤+vendor/symfony/polyfill-php81/composer.jsonyKAh«Ú#@¤Fvendor/symfony/security-bundle/DataCollector/SecurityDataCollector.php>.yKAh>.Ínº ¤&vendor/symfony/security-bundle/LICENSE,yKAh,„©»U¤+vendor/symfony/security-bundle/CHANGELOG.mdCDyKAhCDý ª;¤?vendor/symfony/security-bundle/Security/LazyFirewallContext.php÷ yKAh÷ Ó‡¤=vendor/symfony/security-bundle/Security/UserAuthenticator.php>yKAh>Ç@á¤;vendor/symfony/security-bundle/Security/FirewallContext.phpCyKAhC7{çȤ7vendor/symfony/security-bundle/Security/FirewallMap.php; yKAh; 5r\¤:vendor/symfony/security-bundle/Security/FirewallConfig.php¿ yKAh¿ `9p¤>vendor/symfony/security-bundle/Security/FirewallAwareTrait.phpœyKAhœ²àás¤Wvendor/symfony/security-bundle/Resources/config/security_authenticator_access_token.phpyKAh43MU¤Cvendor/symfony/security-bundle/Resources/config/templating_twig.php…yKAh…@']¤Fvendor/symfony/security-bundle/Resources/config/security_listeners.php´yKAh´¢æNe¤Uvendor/symfony/security-bundle/Resources/config/security_authenticator_login_link.php yKAh ÆËÙ+¤Bvendor/symfony/security-bundle/Resources/config/security_debug.php3yKAh36!H!¤Avendor/symfony/security-bundle/Resources/config/debug_console.phpyKAhé§ޤGvendor/symfony/security-bundle/Resources/config/schema/security-1.0.xsdÏXyKAhÏXf#°¤;vendor/symfony/security-bundle/Resources/config/console.php±yKAh± Å,è¤Cvendor/symfony/security-bundle/Resources/config/password_hasher.php±yKAh±J¾âã¤>vendor/symfony/security-bundle/Resources/config/collectors.php°yKAh°uœ|¤Jvendor/symfony/security-bundle/Resources/config/security_authenticator.phpyKAhØVÅQ¤<vendor/symfony/security-bundle/Resources/config/security.php .yKAh .អ¤Vvendor/symfony/security-bundle/Resources/config/security_authenticator_remember_me.php× yKAh× K ç ¤Avendor/symfony/security-bundle/Resources/views/Collector/icon.svg²yKAh²’0צ¤Kvendor/symfony/security-bundle/Resources/views/Collector/security.html.twigÖeyKAhÖeYËî¤Dvendor/symfony/security-bundle/CacheWarmer/ExpressionCacheWarmer.phpqyKAhq5í0ä¤1vendor/symfony/security-bundle/SecurityBundle.php®yKAh®‡7-X¤(vendor/symfony/security-bundle/README.md¹yKAh¹[ÚA¤Hvendor/symfony/security-bundle/RememberMe/DecoratedRememberMeHandler.php^yKAh^H:íy¤Lvendor/symfony/security-bundle/RememberMe/FirewallAwareRememberMeHandler.php@yKAh@ÚGÙ¤?vendor/symfony/security-bundle/Command/DebugFirewallCommand.php"yKAh"ž&x¤<vendor/symfony/security-bundle/Routing/LogoutRouteLoader.php=yKAh=Žˆìפ+vendor/symfony/security-bundle/Security.php1&yKAh1&~,¤Jvendor/symfony/security-bundle/LoginLink/FirewallAwareLoginLinkHandler.php yKAh ƒß¡¤Hvendor/symfony/security-bundle/DependencyInjection/MainConfiguration.phpS9yKAhS9²—|¤cvendor/symfony/security-bundle/DependencyInjection/Security/AccessToken/OidcTokenHandlerFactory.php3 yKAh3 ßéV¤kvendor/symfony/security-bundle/DependencyInjection/Security/AccessToken/OidcUserInfoTokenHandlerFactory.php yKAh ›~åG¤fvendor/symfony/security-bundle/DependencyInjection/Security/AccessToken/ServiceTokenHandlerFactory.phpšyKAhšC®Wߤhvendor/symfony/security-bundle/DependencyInjection/Security/AccessToken/TokenHandlerFactoryInterface.phpÜyKAhÜwö(¤Xvendor/symfony/security-bundle/DependencyInjection/Security/UserProvider/LdapFactory.php  yKAh  ÚHX¤\vendor/symfony/security-bundle/DependencyInjection/Security/UserProvider/InMemoryFactory.phpùyKAhùbøHq¤ivendor/symfony/security-bundle/DependencyInjection/Security/UserProvider/UserProviderFactoryInterface.phpðyKAhðvßýi¤Xvendor/symfony/security-bundle/DependencyInjection/Security/Factory/LoginLinkFactory.phpmyKAhmµpSʤ\vendor/symfony/security-bundle/DependencyInjection/Security/Factory/HttpBasicLdapFactory.phpŸ yKAhŸ (è…Š¤\vendor/symfony/security-bundle/DependencyInjection/Security/Factory/JsonLoginLdapFactory.phpçyKAhçRßz¤Zvendor/symfony/security-bundle/DependencyInjection/Security/Factory/AccessTokenFactory.php³yKAh³ãAöY¤Xvendor/symfony/security-bundle/DependencyInjection/Security/Factory/FormLoginFactory.phpv yKAhv zä\vendor/symfony/security-bundle/DependencyInjection/Security/Factory/FormLoginLdapFactory.phpKyKAhKpR¹¤bvendor/symfony/security-bundle/DependencyInjection/Security/Factory/CustomAuthenticatorFactory.phpÚyKAhÚÛXi¤Yvendor/symfony/security-bundle/DependencyInjection/Security/Factory/RemoteUserFactory.phpyKAh:PÊÕ¤evendor/symfony/security-bundle/DependencyInjection/Security/Factory/AuthenticatorFactoryInterface.phpGyKAhG3Sý–¤Yvendor/symfony/security-bundle/DependencyInjection/Security/Factory/RememberMeFactory.php*yKAh*“Ö隤Wvendor/symfony/security-bundle/DependencyInjection/Security/Factory/AbstractFactory.phpÚyKAhÚˆ×pú¤Svendor/symfony/security-bundle/DependencyInjection/Security/Factory/X509Factory.phpœyKAhœýVr@¤avendor/symfony/security-bundle/DependencyInjection/Security/Factory/SignatureAlgorithmFactory.phpfyKAhfP œ¤hvendor/symfony/security-bundle/DependencyInjection/Security/Factory/FirewallListenerFactoryInterface.php£yKAh£}”Á/¤Xvendor/symfony/security-bundle/DependencyInjection/Security/Factory/JsonLoginFactory.phpíyKAhíœ Ô÷¤nvendor/symfony/security-bundle/DependencyInjection/Security/Factory/StatelessAuthenticatorFactoryInterface.php yKAh 9 ̤Xvendor/symfony/security-bundle/DependencyInjection/Security/Factory/HttpBasicFactory.php¥yKAh¥soF¤Xvendor/symfony/security-bundle/DependencyInjection/Security/Factory/LdapFactoryTrait.phpm yKAhm Ã盤^vendor/symfony/security-bundle/DependencyInjection/Security/Factory/LoginThrottlingFactory.php¶yKAh¶Û.bí¤Hvendor/symfony/security-bundle/DependencyInjection/SecurityExtension.phpËÃyKAhËÃ=2W[¤bvendor/symfony/security-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.phpÉyKAhÉß*7¤^vendor/symfony/security-bundle/DependencyInjection/Compiler/RegisterTokenUsageTrackingPass.php yKAh І…;¤Wvendor/symfony/security-bundle/DependencyInjection/Compiler/RegisterLdapLocatorPass.phpWyKAhWÝ9k¤hvendor/symfony/security-bundle/DependencyInjection/Compiler/RegisterGlobalSecurityEventListenersPass.php yKAh ½Ç“°¤Yvendor/symfony/security-bundle/DependencyInjection/Compiler/SortFirewallListenersPass.phpO yKAhO  ‘«Õ¤evendor/symfony/security-bundle/DependencyInjection/Compiler/ReplaceDecoratedRememberMeHandlerPass.phpŒ yKAhŒ >¿y¤^vendor/symfony/security-bundle/DependencyInjection/Compiler/AddSessionDomainConstraintPass.php§yKAh§Õ x£¤Uvendor/symfony/security-bundle/DependencyInjection/Compiler/AddSecurityVotersPass.php° yKAh° ˆrÐÒ¤Vvendor/symfony/security-bundle/DependencyInjection/Compiler/RegisterEntryPointPass.phpyKAhd­% ¤ivendor/symfony/security-bundle/DependencyInjection/Compiler/MakeFirewallsEventDispatcherTraceablePass.php` yKAh` U p3¤[vendor/symfony/security-bundle/DependencyInjection/Compiler/CleanRememberMeVerifierPass.php¡yKAh¡"*A¤Xvendor/symfony/security-bundle/DependencyInjection/Compiler/RegisterCsrfFeaturesPass.php‚ yKAh‚ 8I¤,vendor/symfony/security-bundle/composer.jsonâ yKAhâ Ö›¸¤Bvendor/symfony/security-bundle/Debug/TraceableFirewallListener.phpNyKAhNª©Z.¤8vendor/symfony/security-bundle/Debug/WrappedListener.phpËyKAhËýÉD¤?vendor/symfony/security-bundle/Debug/TraceableListenerTrait.phpjyKAhjçqU¤<vendor/symfony/security-bundle/Debug/WrappedLazyListener.phpyKAh  Õ9¤Avendor/symfony/security-bundle/EventListener/FirewallListener.phpìyKAhìó+C®¤=vendor/symfony/security-bundle/EventListener/VoteListener.phpByKAhB<ˊϤ4vendor/symfony/config/ResourceCheckerConfigCache.php~yKAh~pƒÅÀ¤vendor/symfony/config/LICENSE,yKAh,„©»U¤'vendor/symfony/config/Util/XmlUtils.php¯$yKAh¯$U6°€¤<vendor/symfony/config/Util/Exception/XmlParsingException.phpàyKAhà…䢗¤<vendor/symfony/config/Util/Exception/InvalidXmlException.php4yKAh4ô¤"vendor/symfony/config/CHANGELOG.mdeyKAhe´(ž,¤.vendor/symfony/config/ConfigCacheInterface.phpyKAh á1¤.vendor/symfony/config/FileLocatorInterface.phpƒyKAhƒ®ˆ¬ ¤%vendor/symfony/config/ConfigCache.phpyKAhÂSä5vendor/symfony/config/ConfigCacheFactoryInterface.php¸yKAh¸ø^&ë¤%vendor/symfony/config/FileLocator.php4 yKAh4 ”îð=¤2vendor/symfony/config/ResourceCheckerInterface.phpéyKAhéÃ¥ÅØ¤vendor/symfony/config/README.mdTyKAhTÏ ¤'vendor/symfony/config/Loader/Loader.phpºyKAhºI¼ýѤ>vendor/symfony/config/Loader/DirectoryAwareLoaderInterface.phpyKAhj¼=¤+vendor/symfony/config/Loader/FileLoader.phpèyKAhèÿbUL¤2vendor/symfony/config/Loader/ParamConfigurator.phpqyKAhqånݤ0vendor/symfony/config/Loader/LoaderInterface.phpyyKAhyঽõ¤8vendor/symfony/config/Loader/LoaderResolverInterface.php·yKAh·G/3ñ¤/vendor/symfony/config/Loader/LoaderResolver.phpFyKAhF)%ç%¤1vendor/symfony/config/Loader/DelegatingLoader.phpðyKAhðòΚ%¤/vendor/symfony/config/Loader/GlobFileLoader.php¸yKAh¸ÇÌó[¤.vendor/symfony/config/Definition/FloatNode.phpÞyKAhÞÅÛØÅ¤-vendor/symfony/config/Definition/BaseNode.phpó:yKAhó:ôqY6¤0vendor/symfony/config/Definition/NumericNode.php)yKAh) žËä:vendor/symfony/config/Definition/ConfigurableInterface.phpoyKAhojש,¤0vendor/symfony/config/Definition/IntegerNode.phpVyKAhVêò(¤;vendor/symfony/config/Definition/PrototypeNodeInterface.phppyKAhp<5Ã@¤2vendor/symfony/config/Definition/Configuration.php•yKAh• jê¤8vendor/symfony/config/Definition/PrototypedArrayNode.php,yKAh,d#Ÿ¤.vendor/symfony/config/Definition/Processor.phpò yKAhò ‡\¤@vendor/symfony/config/Definition/Loader/DefinitionFileLoader.phpµ yKAhµ ¼Ú "¤2vendor/symfony/config/Definition/NodeInterface.phpLyKAhL¤ëŒQ¤-vendor/symfony/config/Definition/EnumNode.phpî yKAhî ­|„¤0vendor/symfony/config/Definition/BooleanNode.phpÝyKAhÝ ŸBë¤Hvendor/symfony/config/Definition/Configurator/DefinitionConfigurator.phpyyKAhy×±=¤.vendor/symfony/config/Definition/ArrayNode.phpì.yKAhì.öòͤ/vendor/symfony/config/Definition/ScalarNode.php}yKAh}Gr»I¤;vendor/symfony/config/Definition/ConfigurationInterface.phpyKAh_+®¤8vendor/symfony/config/Definition/Builder/ExprBuilder.phpLyKAhLå:^•¤?vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php¼yKAh¼ø<ó…¤9vendor/symfony/config/Definition/Builder/MergeBuilder.phpÛyKAhÛå|–î¤Bvendor/symfony/config/Definition/Builder/NumericNodeDefinition.phpmyKAhmMãg–¤8vendor/symfony/config/Definition/Builder/NodeBuilder.phpÒyKAhÒŸ|פCvendor/symfony/config/Definition/Builder/VariableNodeDefinition.phpgyKAhgô°?¤@vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php®=yKAh®=£M€}¤Bvendor/symfony/config/Definition/Builder/BuilderAwareInterface.phplyKAhlä%¤>vendor/symfony/config/Definition/Builder/ValidationBuilder.phpåyKAhå]Î —¤8vendor/symfony/config/Definition/Builder/TreeBuilder.phpEyKAhE…®Ož¤Bvendor/symfony/config/Definition/Builder/IntegerNodeDefinition.phpyKAh\+F}¤@vendor/symfony/config/Definition/Builder/NodeParentInterface.phpÍyKAhÍùõ ʤAvendor/symfony/config/Definition/Builder/NormalizationBuilder.phpäyKAhäX™ãäBvendor/symfony/config/Definition/Builder/BooleanNodeDefinition.phpèyKAhèYœDq¤Jvendor/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php¡yKAh¡ì³Î£¤Avendor/symfony/config/Definition/Builder/ScalarNodeDefinition.phpóyKAhó*@¤@vendor/symfony/config/Definition/Builder/FloatNodeDefinition.phpyKAhíÑŽþ¤;vendor/symfony/config/Definition/Builder/NodeDefinition.phpfyKAhf3‘êÔ¤Dvendor/symfony/config/Definition/Exception/DuplicateKeyException.phpSyKAhSÑg¹…¤Ivendor/symfony/config/Definition/Exception/InvalidDefinitionException.phpèyKAhèªreë¤Cvendor/symfony/config/Definition/Exception/InvalidTypeException.phpûyKAhû¿2ûú¤@vendor/symfony/config/Definition/Exception/UnsetKeyException.php*yKAh*“%2d¤Lvendor/symfony/config/Definition/Exception/InvalidConfigurationException.php¬yKAh¬i¶üޤJvendor/symfony/config/Definition/Exception/ForbiddenOverwriteException.php_yKAh_ÛÂ:¬¤8vendor/symfony/config/Definition/Exception/Exception.phpÙyKAhÙR†rO¤1vendor/symfony/config/Definition/VariableNode.php yKAh oðŤ?vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php€ yKAh€ í0…–¤>vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.phpÏ'yKAhÏ'²ƒ—¤@vendor/symfony/config/Resource/SelfCheckingResourceInterface.phpyKAh†Œ2Ф/vendor/symfony/config/Resource/FileResource.phpËyKAh˸üóa¤:vendor/symfony/config/Resource/ReflectionClassResource.phpøyKAhøhˆ[¤>vendor/symfony/config/Resource/SelfCheckingResourceChecker.php}yKAh}‡×r•¤3vendor/symfony/config/Resource/ComposerResource.php2yKAh2‹3Pu¤8vendor/symfony/config/Resource/FileExistenceResource.phpáyKAhá‘w÷}¤4vendor/symfony/config/Resource/ResourceInterface.phpçyKAhç8÷ØI¤9vendor/symfony/config/Resource/ClassExistenceResource.phpyKAhT˜æ$¤4vendor/symfony/config/Resource/DirectoryResource.phpÐ yKAhÐ C«¤/vendor/symfony/config/Resource/GlobResource.phpW!yKAhW!Ú×3¤8vendor/symfony/config/Builder/ConfigBuilderInterface.phpÍyKAhÍ{O´”¤(vendor/symfony/config/Builder/Method.phpˆyKAhˆ@ŠÖ¤.vendor/symfony/config/Builder/ClassBuilder.php›yKAh›¸£»¢¤*vendor/symfony/config/Builder/Property.php,yKAh,_Š™ò¤Avendor/symfony/config/Builder/ConfigBuilderGeneratorInterface.php¹yKAh¹˜³ß¤8vendor/symfony/config/Builder/ConfigBuilderGenerator.phpÌRyKAhÌR±˜ý9¤7vendor/symfony/config/Exception/LoaderLoadException.phpñyKAhñ/èz¤Nvendor/symfony/config/Exception/FileLoaderImportCircularReferenceException.php[yKAh[á`¤Ü¤Dvendor/symfony/config/Exception/FileLocatorFileNotFoundException.phpKyKAhK•f°å¤#vendor/symfony/config/composer.jsonyKAh¢M–¤,vendor/symfony/config/ConfigCacheFactory.phpSyKAhScÄ¡½¤;vendor/symfony/config/ResourceCheckerConfigCacheFactory.php5yKAh5þYb¤Dvendor/symfony/security-http/RateLimiter/DefaultLoginRateLimiter.php¼yKAh¼b‰£¤4vendor/symfony/security-http/Attribute/IsGranted.phpÌyKAhÌ`A’¤6vendor/symfony/security-http/Attribute/CurrentUser.php!yKAh!…ü³C¤$vendor/symfony/security-http/LICENSE,yKAh,„©»U¤5vendor/symfony/security-http/Util/TargetPathTrait.phpbyKAhb6=Y•¤)vendor/symfony/security-http/CHANGELOG.md« yKAh« ÇkȤ,vendor/symfony/security-http/FirewallMap.phpfyKAhfr¢”¤)vendor/symfony/security-http/Firewall.php]yKAh]£ý¾þ¤Jvendor/symfony/security-http/AccessToken/AccessTokenExtractorInterface.phpfyKAhf­}ÎP¤Hvendor/symfony/security-http/AccessToken/AccessTokenHandlerInterface.phpËyKAhËmsl¤Gvendor/symfony/security-http/AccessToken/HeaderAccessTokenExtractor.php8yKAh8‰±Íh¤Fvendor/symfony/security-http/AccessToken/ChainAccessTokenExtractor.php'yKAh'g¯è ¤Jvendor/symfony/security-http/AccessToken/Oidc/OidcUserInfoTokenHandler.phpc yKAhc ¬ëª¤;vendor/symfony/security-http/AccessToken/Oidc/OidcTrait.phpÿyKAhÿ̤‘¤Bvendor/symfony/security-http/AccessToken/Oidc/OidcTokenHandler.php yKAh ûµ²ð¤Uvendor/symfony/security-http/AccessToken/Oidc/Exception/InvalidSignatureException.phpŠyKAhЏ+FL¤Qvendor/symfony/security-http/AccessToken/Oidc/Exception/MissingClaimException.php±yKAh±æ½ñ ¤Evendor/symfony/security-http/AccessToken/FormEncodedBodyExtractor.phpmyKAhm³·}¤Fvendor/symfony/security-http/AccessToken/QueryAccessTokenExtractor.phpúyKAhú£w’¤:vendor/symfony/security-http/Logout/LogoutUrlGenerator.phpvyKAhv+ƒ¡À¤/vendor/symfony/security-http/SecurityEvents.phpÇyKAhÇ7¥¤8vendor/symfony/security-http/Firewall/AccessListener.php yKAh ÿÎ8ä9vendor/symfony/security-http/Firewall/ContextListener.php„5yKAh„5¾d`Û¤:vendor/symfony/security-http/Firewall/AbstractListener.phpqyKAhq›ÚÈä¤Fvendor/symfony/security-http/Firewall/AuthenticatorManagerListener.phpjyKAhjÕʯ½¤;vendor/symfony/security-http/Firewall/ExceptionListener.phpf(yKAhf(ti˜ï¤Cvendor/symfony/security-http/Firewall/FirewallListenerInterface.php=yKAh=Œ9´¢¤9vendor/symfony/security-http/Firewall/ChannelListener.php˜ yKAh˜ 2ûü§¤<vendor/symfony/security-http/Firewall/SwitchUserListener.phpE$yKAhE$hÞ°£¤8vendor/symfony/security-http/Firewall/LogoutListener.phpÚyKAhÚ(3›\¤Fvendor/symfony/security-http/Controller/SecurityTokenValueResolver.php®yKAh®J;Y¤¤=vendor/symfony/security-http/Controller/UserValueResolver.phpÞ yKAhÞ ؉M¤&vendor/symfony/security-http/README.mdŸyKAhŸk”¤<vendor/symfony/security-http/RememberMe/ResponseListener.php¾yKAh¾˜¤Gvendor/symfony/security-http/RememberMe/PersistentRememberMeHandler.php yKAh äV¤Fvendor/symfony/security-http/RememberMe/RememberMeHandlerInterface.php yKAh  ~žÂ¤=vendor/symfony/security-http/RememberMe/RememberMeDetails.phpQ yKAhQ Gk<[¤Evendor/symfony/security-http/RememberMe/AbstractRememberMeHandler.phpXyKAhXa*£¦¤Fvendor/symfony/security-http/RememberMe/SignatureRememberMeHandler.php yKAh xo$f¤Mvendor/symfony/security-http/EntryPoint/AuthenticationEntryPointInterface.phpÙyKAhÙ3ˆi¤Nvendor/symfony/security-http/EntryPoint/Exception/NotAnEntryPointException.phpÍyKAhÍÉç(6¤*vendor/symfony/security-http/HttpUtils.php¿yKAh¿e–õ¤5vendor/symfony/security-http/FirewallMapInterface.phpßyKAhß™Ø9J¤Lvendor/symfony/security-http/Authenticator/Token/PostAuthenticationToken.phpTyKAhTH‘¥¤Pvendor/symfony/security-http/Authenticator/InteractiveAuthenticatorInterface.phpjyKAhjšã9¤Mvendor/symfony/security-http/Authenticator/AbstractLoginFormAuthenticator.php« yKAh« e´§¤Evendor/symfony/security-http/Authenticator/AuthenticatorInterface.phpS yKAhS v ‰Œ¤Avendor/symfony/security-http/Authenticator/FallbackUserLoader.phpòyKAhòæÑÚÙ¤Dvendor/symfony/security-http/Authenticator/AbstractAuthenticator.phpyKAh ÏêR¤Evendor/symfony/security-http/Authenticator/HttpBasicAuthenticator.phpeyKAheã£Z¤Evendor/symfony/security-http/Authenticator/LoginLinkAuthenticator.php?yKAh?!ÿ6¤Evendor/symfony/security-http/Authenticator/JsonLoginAuthenticator.phpøyKAhø7$;â¤Nvendor/symfony/security-http/Authenticator/Passport/SelfValidatingPassport.phpÖyKAhÖYWŸW¤@vendor/symfony/security-http/Authenticator/Passport/Passport.php$yKAh$;!2¤Xvendor/symfony/security-http/Authenticator/Passport/Credentials/CredentialsInterface.php†yKAh†èP¤Uvendor/symfony/security-http/Authenticator/Passport/Credentials/CustomCredentials.phpyKAh@å1¤Wvendor/symfony/security-http/Authenticator/Passport/Credentials/PasswordCredentials.phpVyKAhVRŸæ¤Wvendor/symfony/security-http/Authenticator/Passport/Badge/PreAuthenticatedUserBadge.phpyKAh†ÞyΤLvendor/symfony/security-http/Authenticator/Passport/Badge/CsrfTokenBadge.phpiyKAhiï$Á¤Rvendor/symfony/security-http/Authenticator/Passport/Badge/PasswordUpgradeBadge.phpVyKAhV‹âĤGvendor/symfony/security-http/Authenticator/Passport/Badge/UserBadge.phpàyKAhàV«5פMvendor/symfony/security-http/Authenticator/Passport/Badge/RememberMeBadge.phpKyKAhKp€"¤Lvendor/symfony/security-http/Authenticator/Passport/Badge/BadgeInterface.phpìyKAhìË™Au¤@vendor/symfony/security-http/Authenticator/X509Authenticator.php yKAh }•¾¤Gvendor/symfony/security-http/Authenticator/AccessTokenAuthenticator.phpyKAhéYTS¤Fvendor/symfony/security-http/Authenticator/RemoteUserAuthenticator.php“yKAh“_]èz¤Evendor/symfony/security-http/Authenticator/FormLoginAuthenticator.phpSyKAhSÞeQ8¤Tvendor/symfony/security-http/Authenticator/AbstractPreAuthenticatedAuthenticator.phpyKAhhʆ`¤Kvendor/symfony/security-http/Authenticator/Debug/TraceableAuthenticator.phpOyKAhOÕÓŠ2¤Zvendor/symfony/security-http/Authenticator/Debug/TraceableAuthenticatorManagerListener.phpg yKAhg ÷⮤Fvendor/symfony/security-http/Authenticator/RememberMeAuthenticator.phpyKAhãÈAu¤Kvendor/symfony/security-http/Authorization/AccessDeniedHandlerInterface.phpzyKAhzƒÉ(¤3vendor/symfony/security-http/AccessMapInterface.phpiyKAhiHY%¤;vendor/symfony/security-http/LoginLink/LoginLinkDetails.phpeyKAheËZ¨/¤;vendor/symfony/security-http/LoginLink/LoginLinkHandler.phpyKAh¬ã¨ì¤@vendor/symfony/security-http/LoginLink/LoginLinkNotification.phpÿ yKAhÿ Ö½¸Á¤Dvendor/symfony/security-http/LoginLink/LoginLinkHandlerInterface.phpyKAh\¯S¤Wvendor/symfony/security-http/LoginLink/Exception/InvalidLoginLinkExceptionInterface.php·yKAh·£ôHF¤Nvendor/symfony/security-http/LoginLink/Exception/InvalidLoginLinkException.phpßyKAhßãî¤\vendor/symfony/security-http/LoginLink/Exception/InvalidLoginLinkAuthenticationException.php°yKAh°yKAh>³¤Cvendor/symfony/security-http/Authentication/AuthenticationUtils.php“ yKAh“ جÿž¤Rvendor/symfony/security-http/Authentication/CustomAuthenticationFailureHandler.php yKAh ác¤Uvendor/symfony/security-http/Authentication/AuthenticationSuccessHandlerInterface.phpIyKAhIÃ&4Q¤Jvendor/symfony/security-http/Authentication/UserAuthenticatorInterface.php“yKAh“ –>÷¤Dvendor/symfony/security-http/Authentication/AuthenticatorManager.phpá6yKAhá6c 9¤Svendor/symfony/security-http/Authentication/DefaultAuthenticationSuccessHandler.php¼yKAh¼N"Îñ¤*vendor/symfony/security-http/AccessMap.php~yKAh~tÈZ¤vendor/symfony/uid/MaxUuid.php¬yKAh¬S¦w4¤vendor/symfony/uid/README.md\yKAh\½ºï¤2vendor/symfony/uid/Command/GenerateUuidCommand.php(yKAh(vFØ@¤2vendor/symfony/uid/Command/GenerateUlidCommand.phpyKAhº-¨>¤1vendor/symfony/uid/Command/InspectUuidCommand.phpé yKAhé +}æ¤1vendor/symfony/uid/Command/InspectUlidCommand.php¶yKAh¶0>Ȉ¤vendor/symfony/uid/UuidV1.phpVyKAhVǧʤvendor/symfony/uid/UuidV3.php^yKAh^ó(©L¤vendor/symfony/uid/UuidV6.phpNyKAhN¡³Í¤vendor/symfony/uid/UuidV7.phpºyKAhº, aä3vendor/symfony/uid/Factory/TimeBasedUuidFactory.php-yKAh-i`mU¤*vendor/symfony/uid/Factory/UuidFactory.php> yKAh> Xöw¤5vendor/symfony/uid/Factory/RandomBasedUuidFactory.php[yKAh[\Ê(R¤*vendor/symfony/uid/Factory/UlidFactory.phpyKAh)Ý¿»¤3vendor/symfony/uid/Factory/NameBasedUuidFactory.php­yKAh­Ö0 A¤ vendor/symfony/uid/composer.jsonéyKAhés› Û¤,vendor/symfony/uid/TimeBasedUidInterface.phpyKAhQš¤vendor/symfony/uid/UuidV5.php^yKAh^üÔAˆ¤vendor/symfony/uid/UuidV4.phpÂyKAhÂõ<…‹¤<vendor/symfony/event-dispatcher/EventDispatcherInterface.phpáyKAhá­aý¤=vendor/symfony/event-dispatcher/Attribute/AsEventListener.php¿yKAh¿$‹¤'vendor/symfony/event-dispatcher/LICENSE,yKAh,„©»U¤,vendor/symfony/event-dispatcher/CHANGELOG.md] yKAh] uE~¤3vendor/symfony/event-dispatcher/EventDispatcher.php9#yKAh9#Îή&¤)vendor/symfony/event-dispatcher/README.mdWyKAhW,ªfB¤<vendor/symfony/event-dispatcher/EventSubscriberInterface.phpòyKAhò«A{)¤<vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php†yKAh†áwðó¤0vendor/symfony/event-dispatcher/GenericEvent.phpï yKAhï dû ¤Mvendor/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.phpØ yKAhØ i­«Ù¤Kvendor/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.phpƒyKAhƒ&{Ò¤-vendor/symfony/event-dispatcher/composer.jsonyKAh®R¤Bvendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.phpé0yKAhé0U*u«¤9vendor/symfony/event-dispatcher/Debug/WrappedListener.phpyKAhoökŤ+vendor/symfony/var-dumper/Cloner/Cursor.phpHyKAhHùcq¤¤.vendor/symfony/var-dumper/Cloner/VarCloner.phpœ)yKAhœ) ïÄ ¤4vendor/symfony/var-dumper/Cloner/ClonerInterface.phpÚyKAhÚze”â¤7vendor/symfony/var-dumper/Cloner/Internal/NoDefault.php4yKAh4è’ßž¤4vendor/symfony/var-dumper/Cloner/DumperInterface.phpoyKAho÷‹‡k¤3vendor/symfony/var-dumper/Cloner/AbstractCloner.phpÉ]yKAhÉ]$†^¤)vendor/symfony/var-dumper/Cloner/Data.php°5yKAh°5ýG…¤)vendor/symfony/var-dumper/Cloner/Stub.phpkyKAhkàXܤ!vendor/symfony/var-dumper/LICENSE,yKAh,¸.æz¤5vendor/symfony/var-dumper/Test/VarDumperTestTrait.phpV yKAhV ÏF¤&vendor/symfony/var-dumper/CHANGELOG.mdþ yKAhþ "ØD¤.vendor/symfony/var-dumper/Caster/GmpCaster.php yKAh " î¤5vendor/symfony/var-dumper/Caster/ReflectionCaster.php„;yKAh„;þ¤-,¤/vendor/symfony/var-dumper/Caster/StubCaster.phpü yKAhü @Åv¤2vendor/symfony/var-dumper/Caster/SymfonyCaster.php yKAh ¼ Ò¤.vendor/symfony/var-dumper/Caster/FrameStub.phpóyKAhóaÒaü¤7vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php#yKAh#DèJ¤.vendor/symfony/var-dumper/Caster/FFICaster.php„yKAh„ÑŒè¤/vendor/symfony/var-dumper/Caster/DateCaster.php;yKAh;C7>¤.vendor/symfony/var-dumper/Caster/PdoCaster.phpÑ yKAhÑ œØÉ¤6vendor/symfony/var-dumper/Caster/XmlResourceCaster.php| yKAh| Ç›µ¤3vendor/symfony/var-dumper/Caster/ResourceCaster.phpû yKAhû ¶Â~¤4vendor/symfony/var-dumper/Caster/ExceptionCaster.phpmAyKAhmA÷SÇL¤6vendor/symfony/var-dumper/Caster/UninitializedStub.phpyyKAhy0:î¤-vendor/symfony/var-dumper/Caster/DsCaster.phpSyKAhSšþc¤-vendor/symfony/var-dumper/Caster/LinkStub.phpH yKAhH ϼËù¤4vendor/symfony/var-dumper/Caster/MemcachedCaster.phpìyKAhìY#g ¤3vendor/symfony/var-dumper/Caster/DoctrineCaster.phpGyKAhG55 ó¤2vendor/symfony/var-dumper/Caster/RdKafkaCaster.php³yKAh³9#¤1vendor/symfony/var-dumper/Caster/MysqliCaster.phpÓyKAhÓõ†æ¤,vendor/symfony/var-dumper/Caster/ImgStub.php‹yKAh‹ƒØÍ¤.vendor/symfony/var-dumper/Caster/ClassStub.php?yKAh?7ûV¤.vendor/symfony/var-dumper/Caster/TraceStub.phpàyKAhà_´¡¤1vendor/symfony/var-dumper/Caster/CutArrayStub.phpÆyKAhÆQÝG›¤0vendor/symfony/var-dumper/Caster/PgSqlCaster.phpjyKAhj'K4¤+vendor/symfony/var-dumper/Caster/Caster.php*yKAh*änå¤.vendor/symfony/var-dumper/Caster/SplCaster.php]yKAh]4DÓ»¤.vendor/symfony/var-dumper/Caster/ConstStub.phpyKAh3Ôk¤/vendor/symfony/var-dumper/Caster/ScalarStub.phpFyKAhFfAý¤/vendor/symfony/var-dumper/Caster/DsPairStub.phpnyKAhn0ÏÐ ¤/vendor/symfony/var-dumper/Caster/IntlCaster.phpâyKAhâÛߤ0vendor/symfony/var-dumper/Caster/RedisCaster.phpyKAh$ÈOP¤0vendor/symfony/var-dumper/Caster/FiberCaster.phpfyKAhfK€Ææ¤2vendor/symfony/var-dumper/Caster/ImagineCaster.php¦yKAh¦|gdߤ/vendor/symfony/var-dumper/Caster/AmqpCaster.phpHyKAhH¦öæ¤.vendor/symfony/var-dumper/Caster/DOMCaster.phpNyKAhNÊt±¤/vendor/symfony/var-dumper/Caster/UuidCaster.php²yKAh²·E7î¤4vendor/symfony/var-dumper/Caster/XmlReaderCaster.php¤ yKAh¤ ©5£¤-vendor/symfony/var-dumper/Caster/ArgsStub.php yKAh ùõO˜¤-vendor/symfony/var-dumper/Caster/EnumStub.phpšyKAhšŠ`"¤,vendor/symfony/var-dumper/Caster/CutStub.php°yKAh°²’Ž–¤7vendor/symfony/var-dumper/Resources/bin/var-dump-server×yKAh×'Œ£¤:vendor/symfony/var-dumper/Resources/css/htmlDescriptor.css yKAh Dva¤8vendor/symfony/var-dumper/Resources/js/htmlDescriptor.jsbyKAhbhõÍ|¤6vendor/symfony/var-dumper/Resources/functions/dump.phpUyKAhU<œ¤/vendor/symfony/var-dumper/Server/Connection.php¦ yKAh¦ ¥“xΤ/vendor/symfony/var-dumper/Server/DumpServer.php yKAh U¿é§¤#vendor/symfony/var-dumper/README.md_yKAh_FqÊå¤7vendor/symfony/var-dumper/Command/ServerDumpCommand.phpòyKAhòS+¤Hvendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.phpŽyKAhŽŒa²*¤>vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php¿ yKAh¿ ád¤?vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php¨yKAh¨£ ðž¤?vendor/symfony/var-dumper/Exception/ThrowingCasterException.phpžyKAhžä¡Ã¤1vendor/symfony/var-dumper/Dumper/ServerDumper.phpÀyKAhÀDZ³À¤8vendor/symfony/var-dumper/Dumper/DataDumperInterface.php@yKAh@ož/¤Mvendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php(yKAh(EFf¤Kvendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php×yKAh×¼oê­¤Gvendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.phpyKAhy9.L¤Jvendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php“yKAh“±§uª¤3vendor/symfony/var-dumper/Dumper/AbstractDumper.php0yKAh0Ь©¤.vendor/symfony/var-dumper/Dumper/CliDumper.phpëZyKAhëZ'´¤9vendor/symfony/var-dumper/Dumper/ContextualizedDumper.phpyKAhUÎî¤/vendor/symfony/var-dumper/Dumper/HtmlDumper.php<…yKAh<…Ü F ¤'vendor/symfony/var-dumper/composer.jsonwyKAhw%ð¡E¤'vendor/symfony/var-dumper/VarDumper.php³yKAh³òë±Ï¤!vendor/symfony/filesystem/LICENSE,yKAh,„©»U¤&vendor/symfony/filesystem/CHANGELOG.mdyKAhI¡­’¤(vendor/symfony/filesystem/Filesystem.php”tyKAh”tÕçÅ1¤"vendor/symfony/filesystem/Path.php fyKAh f×€s¶¤#vendor/symfony/filesystem/README.mdíyKAhížöìã¤<vendor/symfony/filesystem/Exception/IOExceptionInterface.php“yKAh“ ƒ¤:vendor/symfony/filesystem/Exception/ExceptionInterface.phpÞyKAhÞ(l`Ф8vendor/symfony/filesystem/Exception/RuntimeException.php¸yKAh¸»¤‹A¤3vendor/symfony/filesystem/Exception/IOException.php¶yKAh¶êÝ0¤@vendor/symfony/filesystem/Exception/InvalidArgumentException.phpÝyKAhÝ$ §å¤=vendor/symfony/filesystem/Exception/FileNotFoundException.phpÚyKAhÚ[ä:¤'vendor/symfony/filesystem/composer.json{yKAh{Ëz•q¤Gvendor/symfony/security-csrf/TokenStorage/NativeSessionTokenStorage.phpÇ yKAhÇ ù.פAvendor/symfony/security-csrf/TokenStorage/SessionTokenStorage.phpK yKAhK ”<_¤Lvendor/symfony/security-csrf/TokenStorage/ClearableTokenStorageInterface.php3yKAh3°¸µì¤Cvendor/symfony/security-csrf/TokenStorage/TokenStorageInterface.phpŽyKAhŽº7ä­¤$vendor/symfony/security-csrf/LICENSE,yKAh,„©»U¤)vendor/symfony/security-csrf/CHANGELOG.mdÀyKAhÀ>*˜¤*vendor/symfony/security-csrf/CsrfToken.phpûyKAhû3€¤&vendor/symfony/security-csrf/README.mdîyKAhî¢Ú¤:vendor/symfony/security-csrf/CsrfTokenManagerInterface.phpÙyKAhÙ—µyɤEvendor/symfony/security-csrf/TokenGenerator/UriSafeTokenGenerator.phpØyKAhØýá1÷¤Gvendor/symfony/security-csrf/TokenGenerator/TokenGeneratorInterface.phpyKAhœ¤vendor/symfony/finder/LICENSE,yKAh,„©»U¤"vendor/symfony/finder/CHANGELOG.md yKAh Š3g¤vendor/symfony/finder/Glob.php2yKAh2A´Û¤vendor/symfony/finder/README.mdïyKAhïÊC¤/vendor/symfony/finder/Iterator/LazyIterator.php»yKAh»ºWÄ‘¤;vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php'yKAh'n–!´¤<vendor/symfony/finder/Iterator/FilecontentFilterIterator.php«yKAh«\v:c¤=vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php« yKAh« ÞïN†¤:vendor/symfony/finder/Iterator/SizeRangeFilterIterator.phpkyKAhk4-¤9vendor/symfony/finder/Iterator/FilenameFilterIterator.phpnyKAhnMNâQ¤:vendor/symfony/finder/Iterator/DateRangeFilterIterator.php”yKAh”9zªÖ¤7vendor/symfony/finder/Iterator/CustomFilterIterator.phpyKAhÀ« ʤ=vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.phpOyKAhOÝ ¤Avendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php5 yKAh5 ¤ `¤3vendor/symfony/finder/Iterator/SortableIterator.php3yKAh3뛽¤;vendor/symfony/finder/Iterator/DepthRangeFilterIterator.phpnyKAhnô€O¤9vendor/symfony/finder/Iterator/FileTypeFilterIterator.php|yKAh|ˆA½j¤5vendor/symfony/finder/Iterator/PathFilterIterator.php°yKAh°åÇ(¤#vendor/symfony/finder/Gitignore.phpü yKAhü Q)±¤9vendor/symfony/finder/Exception/AccessDeniedException.php¹yKAh¹Œ„ò¤>vendor/symfony/finder/Exception/DirectoryNotFoundException.php±yKAh±ìŸ)¤#vendor/symfony/finder/composer.json*yKAh*ú›_¤-vendor/symfony/polyfill-php83/bootstrap81.phpºyKAhºÂŽp$¤%vendor/symfony/polyfill-php83/LICENSE,yKAh,t=¥¤Bvendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.phpHyKAhH<ÜŽ¤;vendor/symfony/polyfill-php83/Resources/stubs/DateError.php=yKAh=ûˤ:vendor/symfony/polyfill-php83/Resources/stubs/Override.php™yKAh™NsÀE¤?vendor/symfony/polyfill-php83/Resources/stubs/DateException.phpEyKAhE¼ •¤Ovendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.phpYyKAhYMÏߤAvendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.phpGyKAhG .I¤Tvendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php^yKAh^Køü¤Nvendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.phpXyKAhXýWÅߤ@vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.phpFyKAhFÓL;¿¤Nvendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.phpXyKAhXÇìg¤Vvendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php`yKAh`6€¿ø¤+vendor/symfony/polyfill-php83/bootstrap.php¶yKAh¶{Jcâ¤'vendor/symfony/polyfill-php83/README.mdÿyKAhÿÂ}’½¤'vendor/symfony/polyfill-php83/Php83.php yKAh \9>¢¤+vendor/symfony/polyfill-php83/composer.jsonyKAhç{V¤>vendor/symfony/http-kernel/DataCollector/DumpDataCollector.php%+yKAh%+pü q¤@vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.phpëyKAh럾]%¤Gvendor/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php/yKAh/Þ÷D ¤@vendor/symfony/http-kernel/DataCollector/RouterDataCollector.php yKAh W}}ÿ¤>vendor/symfony/http-kernel/DataCollector/TimeDataCollector.php‹ yKAh‹ „R ¤Cvendor/symfony/http-kernel/DataCollector/DataCollectorInterface.phpºyKAhº¬¾¯¤Avendor/symfony/http-kernel/DataCollector/RequestDataCollector.phpo>yKAho>ïse¤>vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.phplyKAhlkD¤:vendor/symfony/http-kernel/DataCollector/DataCollector.phpB yKAhB rö¤@vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.phpV)yKAhV)>W ¤@vendor/symfony/http-kernel/DataCollector/ConfigDataCollector.php<yKAh<¸­·¤?vendor/symfony/http-kernel/DataCollector/EventDataCollector.phpGyKAhGJù„ݤCvendor/symfony/http-kernel/DataCollector/ExceptionDataCollector.phpUyKAhU ›¤5vendor/symfony/http-kernel/Attribute/AsController.php«yKAh«UT·¤@vendor/symfony/http-kernel/Attribute/AsTargetedValueResolver.php yKAh ‚·—w¤.vendor/symfony/http-kernel/Attribute/Cache.phpX yKAhX LâÒŒ¤7vendor/symfony/http-kernel/Attribute/MapQueryString.phpïyKAhïuõ~¤7vendor/symfony/http-kernel/Attribute/WithHttpStatus.php^yKAh^ à¤4vendor/symfony/http-kernel/Attribute/MapDateTime.phpyKAhàØj¤:vendor/symfony/http-kernel/Attribute/MapRequestPayload.php)yKAh)-†"y¤5vendor/symfony/http-kernel/Attribute/WithLogLevel.phpyKAhFøñH¤6vendor/symfony/http-kernel/Attribute/ValueResolver.php›yKAh› õ\ˆ¤:vendor/symfony/http-kernel/Attribute/MapQueryParameter.php\yKAh\¹ì%¤"vendor/symfony/http-kernel/LICENSE,yKAh,„©»U¤Rvendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php‹yKAh‹Íž1¤Bvendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.phpçyKAhç†óS¤Ivendor/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php»yKAh»D{\Ǥ'vendor/symfony/http-kernel/CHANGELOG.md°QyKAh°Qþ‘¤1vendor/symfony/http-kernel/Config/FileLocator.phpwyKAhwî’«¤/vendor/symfony/http-kernel/HttpClientKernel.phpêyKAhê‹u*D¤2vendor/symfony/http-kernel/TerminableInterface.phpÔyKAhÔ¨ø§ ¤Avendor/symfony/http-kernel/CacheClearer/CacheClearerInterface.php*yKAh*é›—¤=vendor/symfony/http-kernel/CacheClearer/ChainCacheClearer.phpJyKAhJ€Ç7¤<vendor/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php“yKAh“Ÿr2 ¤5vendor/symfony/http-kernel/Resources/welcome.html.phpòyKAhòÕÿi­¤)vendor/symfony/http-kernel/HttpKernel.php‹-yKAh‹-¯Á¹Â¤?vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.phpºyKAhº Q™ ¤6vendor/symfony/http-kernel/CacheWarmer/CacheWarmer.php¦yKAh¦Q½îĤ<vendor/symfony/http-kernel/CacheWarmer/WarmableInterface.php3yKAh3Pç@ˤ?vendor/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.phpyKAh{w]b¤,vendor/symfony/http-kernel/Bundle/Bundle.php‘yKAh‘~oü¤5vendor/symfony/http-kernel/Bundle/BundleInterface.phpŠyKAhŠ"ôz¤4vendor/symfony/http-kernel/Bundle/AbstractBundle.phpîyKAhîÈ|`è¤5vendor/symfony/http-kernel/Bundle/BundleExtension.php yKAh Y]=¹¤.vendor/symfony/http-kernel/KernelInterface.php¶yKAh¶J:¤:vendor/symfony/http-kernel/Controller/ArgumentResolver.php yKAh <«n¤=vendor/symfony/http-kernel/Controller/ControllerReference.php5yKAh5’Ulœ¤9vendor/symfony/http-kernel/Controller/ErrorController.php>yKAh>BŒ¤Evendor/symfony/http-kernel/Controller/ContainerControllerResolver.phpáyKAháfÓñ«¤Pvendor/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php@yKAh@Êê¼S¤Ovendor/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php|yKAh|w S¿¤Ovendor/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php–yKAh–^(2§¤Vvendor/symfony/http-kernel/Controller/ArgumentResolver/QueryParameterValueResolver.phpyKAhg¤Ž,¤Kvendor/symfony/http-kernel/Controller/ArgumentResolver/UidValueResolver.php¼yKAh¼ybÞ¤Rvendor/symfony/http-kernel/Controller/ArgumentResolver/BackedEnumValueResolver.php0yKAh0†N„s¤Vvendor/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.phpD"yKAhD"…rn¤Pvendor/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php¾ yKAh¾ £ù7¤Ovendor/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.phpæyKAhæÜÿ05¤Ovendor/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php—yKAh—ão¤Xvendor/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.phpóyKAhóq?柤[vendor/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php: yKAh: ¢½Í<¤Qvendor/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php3yKAh38?€¡¤Cvendor/symfony/http-kernel/Controller/ArgumentResolverInterface.phptyKAhtq/Öm¤Evendor/symfony/http-kernel/Controller/ControllerResolverInterface.phpyyKAhy5ݰʤCvendor/symfony/http-kernel/Controller/TraceableArgumentResolver.phpöyKAhöD–„¤¤@vendor/symfony/http-kernel/Controller/ValueResolverInterface.phpõyKAhõ@9«†¤<vendor/symfony/http-kernel/Controller/ControllerResolver.php0(yKAh0(7€nl¤Evendor/symfony/http-kernel/Controller/TraceableControllerResolver.phpJyKAhJ#Ü@¤Hvendor/symfony/http-kernel/Controller/ArgumentValueResolverInterface.phpyKAhœ%Ȥ$vendor/symfony/http-kernel/README.md¤yKAh¤¥Å7œ¤Evendor/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php:yKAh:Ze¸¤>vendor/symfony/http-kernel/Fragment/InlineFragmentRenderer.php¼yKAh¼Äb^b¤;vendor/symfony/http-kernel/Fragment/SsiFragmentRenderer.php%yKAh% ‡¤Ivendor/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.phpÒyKAhÒú,›J¤Avendor/symfony/http-kernel/Fragment/FragmentRendererInterface.php§yKAh§™Ç›<¤<vendor/symfony/http-kernel/Fragment/FragmentUriGenerator.php$yKAh$¨˜¤;vendor/symfony/http-kernel/Fragment/EsiFragmentRenderer.php%yKAh%„ïëp¤@vendor/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php/ yKAh/ Œr0¤7vendor/symfony/http-kernel/Fragment/FragmentHandler.php¹yKAh¹<ŽÂ̤@vendor/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php+yKAh+r¼¶T¤+vendor/symfony/http-kernel/KernelEvents.phpdyKAhdZ$³Ÿ¤,vendor/symfony/http-kernel/HttpCache/Esi.php yKAh ŽK\¤2vendor/symfony/http-kernel/HttpCache/HttpCache.phpûkyKAhûkäJñ¤.vendor/symfony/http-kernel/HttpCache/Store.phpÞ9yKAhÞ9Ëj=‹¤;vendor/symfony/http-kernel/HttpCache/SurrogateInterface.php™yKAh™ˆrº¤Gvendor/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php:yKAh:)OÊu¤>vendor/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php™!yKAh™!Фt¤7vendor/symfony/http-kernel/HttpCache/StoreInterface.phpÞyKAhÞ+¤,vendor/symfony/http-kernel/HttpCache/Ssi.phpR yKAhR ÁYî¤:vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.phpËyKAhËÚ„‘‰¤:vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php1yKAh1µÉイ2vendor/symfony/http-kernel/HttpKernelInterface.phpåyKAhåÂÔZ¤)vendor/symfony/http-kernel/Log/Logger.php2yKAh2Y8óX¤7vendor/symfony/http-kernel/Log/DebugLoggerInterface.phpDyKAhD'Vö‘¤:vendor/symfony/http-kernel/Log/DebugLoggerConfigurator.phpHyKAhH,„¦¤;vendor/symfony/http-kernel/Profiler/FileProfilerStorage.phpŠ(yKAhŠ(|§rë¤/vendor/symfony/http-kernel/Profiler/Profile.phpoyKAhoë#µ¤0vendor/symfony/http-kernel/Profiler/Profiler.phpóyKAhó27ya¤@vendor/symfony/http-kernel/Profiler/ProfilerStorageInterface.phpœyKAhœ¼0ĤGvendor/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php©yKAh©÷P²¤Cvendor/symfony/http-kernel/DependencyInjection/ServicesResetter.phpyKAh—/vâ¤Rvendor/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php¯yKAh¯ÌÞ2@¤Hvendor/symfony/http-kernel/DependencyInjection/ResettableServicePass.phpÆyKAhÆ&ÂˤRvendor/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.phpÊyKAhÊÂT ¤Qvendor/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.phpÇyKAhÇ:äHvendor/symfony/http-kernel/DependencyInjection/ConfigurableExtension.phpyKAh6v«¤=vendor/symfony/http-kernel/DependencyInjection/LoggerPass.php)yKAh)Qð*¤<vendor/symfony/http-kernel/DependencyInjection/Extension.php_yKAh_æÊ/¤Vvendor/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.phpY yKAhY FT¤Yvendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.phpÂ.yKAhÂ.„è¬8¤\vendor/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php yKAh 5ü Õ¤Mvendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.phpyKAh¢—º¤Evendor/symfony/http-kernel/Exception/TooManyRequestsHttpException.php˜yKAh˜<‚þ ¤>vendor/symfony/http-kernel/Exception/ConflictHttpException.phpcyKAhcŸ¤6vendor/symfony/http-kernel/Exception/HttpException.phpNyKAhN–ބդBvendor/symfony/http-kernel/Exception/UnauthorizedHttpException.phpÿyKAhÿâ8«¤Avendor/symfony/http-kernel/Exception/InvalidMetadataException.phpjyKAhj;ë…¤Dvendor/symfony/http-kernel/Exception/LengthRequiredHttpException.phpiyKAhi ®l¤Ivendor/symfony/http-kernel/Exception/UnprocessableEntityHttpException.phpwyKAhwÀ3æ¤Hvendor/symfony/http-kernel/Exception/PreconditionFailedHttpException.phpmyKAhmmª%¤:vendor/symfony/http-kernel/Exception/GoneHttpException.php_yKAh_eyž¤Jvendor/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.phpoyKAhoaM}«¤Hvendor/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php®yKAh®Zi‘s¤<vendor/symfony/http-kernel/Exception/LockedHttpException.phpeyKAhepîeh¤Hvendor/symfony/http-kernel/Exception/ServiceUnavailableHttpException.phpmyKAhm=Ó¤?vendor/symfony/http-kernel/Exception/HttpExceptionInterface.php}yKAh}Öš5¤Bvendor/symfony/http-kernel/Exception/AccessDeniedHttpException.phpœyKAhœ6HHg¤@vendor/symfony/http-kernel/Exception/BadRequestHttpException.phpeyKAheÕ‘¤Qvendor/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.phpyKAht< e¤Cvendor/symfony/http-kernel/Exception/NotAcceptableHttpException.phphyKAhh(Þ¤Jvendor/symfony/http-kernel/Exception/PreconditionRequiredHttpException.phpyKAhc„¨Ô¤>vendor/symfony/http-kernel/Exception/NotFoundHttpException.phpjyKAhjæVz¤Fvendor/symfony/http-kernel/Exception/MethodNotAllowedHttpException.phpyKAhi× ¤Bvendor/symfony/http-kernel/Exception/ResolverNotFoundException.phpŒyKAhŒy ð+¤4vendor/symfony/http-kernel/Event/ControllerEvent.phpjyKAhj®w.Ƥ3vendor/symfony/http-kernel/Event/ExceptionEvent.php©yKAh©ÀpÑ-¤7vendor/symfony/http-kernel/Event/FinishRequestEvent.phpÓyKAhÓ©T÷Y¤2vendor/symfony/http-kernel/Event/ResponseEvent.phpêyKAhêžû,7¤3vendor/symfony/http-kernel/Event/TerminateEvent.php†yKAh†VC¤=vendor/symfony/http-kernel/Event/ControllerArgumentsEvent.phpý yKAhý nðéT¤0vendor/symfony/http-kernel/Event/KernelEvent.phpÒyKAhÒD´Bc¤1vendor/symfony/http-kernel/Event/RequestEvent.phpÞyKAhÞ Üפ.vendor/symfony/http-kernel/Event/ViewEvent.phpßyKAhß¹èæ¤(vendor/symfony/http-kernel/composer.jsonm yKAhm -Ým¤2vendor/symfony/http-kernel/RebootableInterface.php<yKAh<pLX1¤%vendor/symfony/http-kernel/Kernel.phpÓwyKAhÓw׆ à¤(vendor/symfony/http-kernel/UriSigner.phpyKAh2[{¤8vendor/symfony/http-kernel/Debug/VirtualRequestStack.phpIyKAhIUïÌ&¤=vendor/symfony/http-kernel/Debug/ErrorHandlerConfigurator.phpºyKAhº˜øP’¤=vendor/symfony/http-kernel/Debug/TraceableEventDispatcher.phpyKAh]`>¤6vendor/symfony/http-kernel/Debug/FileLinkFormatter.phpÙyKAhÙ›á¤0vendor/symfony/http-kernel/HttpKernelBrowser.php—yKAh—i\¤Evendor/symfony/http-kernel/EventListener/StreamedResponseListener.php¢yKAh¢}>®Å¤=vendor/symfony/http-kernel/EventListener/ResponseListener.php†yKAh†PUȤ;vendor/symfony/http-kernel/EventListener/LocaleListener.phpØ yKAhØ 7)<¤=vendor/symfony/http-kernel/EventListener/FragmentListener.php8 yKAh8 ´îv¤Cvendor/symfony/http-kernel/EventListener/CacheAttributeListener.php1yKAh1¯ÅÛ¤Dvendor/symfony/http-kernel/EventListener/AbstractSessionListener.phpd0yKAhd0oç!¤Dvendor/symfony/http-kernel/EventListener/ValidateRequestListener.php˜yKAh˜£ãËx¤Kvendor/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.phpoyKAho>JȤFvendor/symfony/http-kernel/EventListener/AddRequestFormatsListener.phpéyKAhéq­Å ¤=vendor/symfony/http-kernel/EventListener/ProfilerListener.php<yKAh<<3W¤>vendor/symfony/http-kernel/EventListener/SurrogateListener.phpUyKAhUåMæ¤Bvendor/symfony/http-kernel/EventListener/DebugHandlersListener.php¹yKAh¹n×ì¤@vendor/symfony/http-kernel/EventListener/LocaleAwareListener.php÷ yKAh÷ Äõ…¨¤9vendor/symfony/http-kernel/EventListener/DumpListener.php%yKAh%åÛ¤:vendor/symfony/http-kernel/EventListener/ErrorListener.phpª!yKAhª!ú” O¤<vendor/symfony/http-kernel/EventListener/SessionListener.phpyKAh· »¤;vendor/symfony/http-kernel/EventListener/RouterListener.phpûyKAhûÅG]9¤vendor/symfony/yaml/LICENSE,yKAh,„©»U¤vendor/symfony/yaml/Parser.phpŒÆyKAhŒÆþ¦i¤ vendor/symfony/yaml/CHANGELOG.mdÐyKAhÐì¹ÿĤvendor/symfony/yaml/Escaper.php¦ yKAh¦ õ ÷€¤+vendor/symfony/yaml/Resources/bin/yaml-lintyKAh3VÔˆ¤vendor/symfony/yaml/README.mdÄyKAhđـT¤!vendor/symfony/yaml/Unescaper.phpK yKAhK 脱¤vendor/symfony/yaml/Dumper.phpyKAhhá¤vendor/symfony/yaml/Inline.php‰ŒyKAh‰ŒXwtù¤vendor/symfony/yaml/Yaml.phpš yKAhš LïϽ¤+vendor/symfony/yaml/Command/LintCommand.phpè'yKAhè'tÐe¤/vendor/symfony/yaml/Exception/DumpException.phpÕyKAhÕ?<Ç̤4vendor/symfony/yaml/Exception/ExceptionInterface.phpÜyKAhÜ”,P¤2vendor/symfony/yaml/Exception/RuntimeException.phpóyKAhó#OU¤0vendor/symfony/yaml/Exception/ParseException.php¨ yKAh¨ m FB¤'vendor/symfony/yaml/Tag/TaggedValue.phpìyKAhìºsÔ$¤!vendor/symfony/yaml/composer.jsonÙyKAhÙZܦ¤)vendor/symfony/string/CodePointString.phpNyKAhNJ…£¤vendor/symfony/string/LICENSE,yKAh,Õ¦_Ϥ"vendor/symfony/string/CHANGELOG.mdzyKAhzuÃbà¤(vendor/symfony/string/AbstractString.phpßIyKAhßIƒ©k¤-vendor/symfony/string/Resources/functions.phpcyKAhc’øãȤ<vendor/symfony/string/Resources/data/wcswidth_table_zero.phpFyKAhFÀØMI¤<vendor/symfony/string/Resources/data/wcswidth_table_wide.phpkyKAhkêÆ/¤3vendor/symfony/string/Inflector/FrenchInflector.php¾yKAh¾Q·¤6vendor/symfony/string/Inflector/InflectorInterface.phpRyKAhR˜Ÿ_¤4vendor/symfony/string/Inflector/EnglishInflector.phpòCyKAhòC'€X<¤vendor/symfony/string/README.md+yKAh+¹L–˜¤/vendor/symfony/string/AbstractUnicodeString.phpxcyKAhxc7qî¤$vendor/symfony/string/LazyString.php€yKAh€¼¹Š¤$vendor/symfony/string/ByteString.phpv9yKAhv9·}¤'vendor/symfony/string/UnicodeString.php…1yKAh…1û¶¤6vendor/symfony/string/Exception/ExceptionInterface.php_yKAh_œ æ:¤4vendor/symfony/string/Exception/RuntimeException.php~yKAh~)É„¤<vendor/symfony/string/Exception/InvalidArgumentException.phpŽyKAhŽB;8“¤#vendor/symfony/string/composer.jsonçyKAhçåÏ#¤2vendor/symfony/string/Slugger/SluggerInterface.phpéyKAhéñФ.vendor/symfony/string/Slugger/AsciiSlugger.phpyKAhÊ[=M¤4vendor/symfony/security-core/Role/SwitchUserRole.phpÑyKAhÑ„'v¤<vendor/symfony/security-core/Role/RoleHierarchyInterface.php]yKAh]Ô²'¤*vendor/symfony/security-core/Role/Role.phpyKAhãiÖœ¤3vendor/symfony/security-core/Role/RoleHierarchy.phpñyKAhñUÕˆ­¤Cvendor/symfony/security-core/Validator/Constraints/UserPassword.php"yKAh"<0´î¤Lvendor/symfony/security-core/Validator/Constraints/UserPasswordValidator.php~ yKAh~ ^½¤$vendor/symfony/security-core/LICENSE,yKAh,„©»U¤Dvendor/symfony/security-core/Test/AccessDecisionStrategyTestCase.php÷ yKAh÷ ÿA¾¤Bvendor/symfony/security-core/Signature/ExpiredSignatureStorage.phpÁyKAhÁ`5¨¤Nvendor/symfony/security-core/Signature/Exception/InvalidSignatureException.phpþyKAhþÖ[.ܤNvendor/symfony/security-core/Signature/Exception/ExpiredSignatureException.phpþyKAhþ(:¶¤:vendor/symfony/security-core/Signature/SignatureHasher.php¥yKAh¥d5ÅA¤)vendor/symfony/security-core/CHANGELOG.md£ yKAh£ ’í&³¤Cvendor/symfony/security-core/Resources/translations/security.sq.xlfSyKAhSBÂ&^¤Cvendor/symfony/security-core/Resources/translations/security.ru.xlfÎyKAhÎm»˜¤Cvendor/symfony/security-core/Resources/translations/security.hy.xlfúyKAhú¯üB¤Cvendor/symfony/security-core/Resources/translations/security.fr.xlfUyKAhU$Øá¤Cvendor/symfony/security-core/Resources/translations/security.fa.xlfÄyKAhÄËIúѤCvendor/symfony/security-core/Resources/translations/security.pl.xlf“yKAh“êu¤Cvendor/symfony/security-core/Resources/translations/security.sv.xlfåyKAhåcn¤ˆ¤Cvendor/symfony/security-core/Resources/translations/security.el.xlf8yKAh8yv³a¤Hvendor/symfony/security-core/Resources/translations/security.sr_Cyrl.xlfyKAh’Óè¤Cvendor/symfony/security-core/Resources/translations/security.en.xlflyKAhlûgBZ¤Cvendor/symfony/security-core/Resources/translations/security.ja.xlfÖyKAhÖâH»¤Fvendor/symfony/security-core/Resources/translations/security.pt_BR.xlfyKAhiH! ¤Cvendor/symfony/security-core/Resources/translations/security.no.xlfñyKAhñÚ~RÒ¤Cvendor/symfony/security-core/Resources/translations/security.vi.xlf,yKAh,ùa¤Cvendor/symfony/security-core/Resources/translations/security.ur.xlfÒyKAhÒáÇg¤Cvendor/symfony/security-core/Resources/translations/security.nn.xlfyKAh÷»l¤Cvendor/symfony/security-core/Resources/translations/security.nl.xlfìyKAhìŠí"Ö¤Cvendor/symfony/security-core/Resources/translations/security.cy.xlfvyKAhvñF¥Å¤Cvendor/symfony/security-core/Resources/translations/security.af.xlfyKAhojo¤Cvendor/symfony/security-core/Resources/translations/security.lv.xlfcyKAhc@æÛ¤Cvendor/symfony/security-core/Resources/translations/security.ar.xlfÐyKAhПODº¤Cvendor/symfony/security-core/Resources/translations/security.lb.xlf)yKAh)z7™­¤Cvendor/symfony/security-core/Resources/translations/security.tr.xlfìyKAhì0˵ó¤Cvendor/symfony/security-core/Resources/translations/security.lt.xlfvyKAhv¨@ȤFvendor/symfony/security-core/Resources/translations/security.zh_CN.xlfyKAh¤‚ÛD¤Cvendor/symfony/security-core/Resources/translations/security.ca.xlfyKAhã ¤Cvendor/symfony/security-core/Resources/translations/security.be.xlfXyKAhX\¥äCvendor/symfony/security-core/Resources/translations/security.th.xlfyKAhx=øÝ¤Cvendor/symfony/security-core/Resources/translations/security.uz.xlflyKAhlùM¤Cvendor/symfony/security-core/Resources/translations/security.mk.xlf¿yKAh¿Úžúï¤Cvendor/symfony/security-core/Resources/translations/security.bs.xlf¦yKAh¦·%}o¤Cvendor/symfony/security-core/Resources/translations/security.bg.xlf€yKAh€dþ캤Hvendor/symfony/security-core/Resources/translations/security.sr_Latn.xlf6yKAh6dÖξ¤Cvendor/symfony/security-core/Resources/translations/security.uk.xlf±yKAh±6›V¤Fvendor/symfony/security-core/Resources/translations/security.zh_TW.xlfyKAhóȈf¤Cvendor/symfony/security-core/Resources/translations/security.cs.xlf×yKAh×S0k3¤Cvendor/symfony/security-core/Resources/translations/security.tl.xlfWyKAhW­Ôü¤Cvendor/symfony/security-core/Resources/translations/security.my.xlfyKAh[¼úv¤Cvendor/symfony/security-core/Resources/translations/security.nb.xlfñyKAhñÚ~RÒ¤Cvendor/symfony/security-core/Resources/translations/security.mn.xlf¶yKAh¶Þ‡ïñ¤Cvendor/symfony/security-core/Resources/translations/security.az.xlf^yKAh^9˜ñ¤Cvendor/symfony/security-core/Resources/translations/security.eu.xlfÕyKAhÕb•s`¤Cvendor/symfony/security-core/Resources/translations/security.he.xlfhyKAhhuÿ¨ç¤Cvendor/symfony/security-core/Resources/translations/security.hr.xlf[yKAh[ôö°¤Cvendor/symfony/security-core/Resources/translations/security.pt.xlfØyKAhØ5Ö>¤Cvendor/symfony/security-core/Resources/translations/security.et.xlfÏyKAhÏê„s¼¤Cvendor/symfony/security-core/Resources/translations/security.de.xlfVyKAhV€:ؤCvendor/symfony/security-core/Resources/translations/security.sl.xlf”yKAh”Aœ¤Cvendor/symfony/security-core/Resources/translations/security.it.xlf«yKAh«a÷ƒ¤Cvendor/symfony/security-core/Resources/translations/security.gl.xlf8yKAh8øÏÿ¤Cvendor/symfony/security-core/Resources/translations/security.es.xlfQyKAhQécP)¤Cvendor/symfony/security-core/Resources/translations/security.hu.xlf:yKAh:KøY¤Cvendor/symfony/security-core/Resources/translations/security.da.xlfÂyKAhÂÝm”m¤Cvendor/symfony/security-core/Resources/translations/security.fi.xlfyKAh úÍT¤Cvendor/symfony/security-core/Resources/translations/security.id.xlf³yKAh³xƒË"¤Cvendor/symfony/security-core/Resources/translations/security.sk.xlf¾yKAh¾^Pƒ¤Cvendor/symfony/security-core/Resources/translations/security.ro.xlfyyKAhyA»ze¤Jvendor/symfony/security-core/User/AttributesBasedUserProviderInterface.phpNyKAhN„¯âu¤.vendor/symfony/security-core/User/OidcUser.phpyKAhŽ•¨æ¤9vendor/symfony/security-core/User/InMemoryUserChecker.phpîyKAhîl£¼¤3vendor/symfony/security-core/User/UserInterface.php<yKAh<ël¤;vendor/symfony/security-core/User/UserProviderInterface.phpI yKAhI ¹—¤Ì¤9vendor/symfony/security-core/User/MissingUserProvider.php·yKAh·EŸó­¤6vendor/symfony/security-core/User/ChainUserChecker.phpdyKAhdó‡OϤNvendor/symfony/security-core/User/LegacyPasswordAuthenticatedUserInterface.php1yKAh1,ð«ò¤?vendor/symfony/security-core/User/PasswordUpgraderInterface.php–yKAh–Ý}àm¤2vendor/symfony/security-core/User/InMemoryUser.phpX yKAhX „‹H¢¤:vendor/symfony/security-core/User/InMemoryUserProvider.phpÜyKAhÜ,aR¤8vendor/symfony/security-core/User/EquatableInterface.phpmyKAhmæC´¢¤Hvendor/symfony/security-core/User/PasswordAuthenticatedUserInterface.phpßyKAhßøh˜Î¤:vendor/symfony/security-core/User/UserCheckerInterface.phpbyKAhb˜§Pè¤7vendor/symfony/security-core/User/ChainUserProvider.php yKAh ªÞú¤&vendor/symfony/security-core/README.md›yKAh›{u!å¤Lvendor/symfony/security-core/Authorization/AuthorizationCheckerInterface.php2yKAh2Íá¡O¤Ivendor/symfony/security-core/Authorization/ExpressionLanguageProvider.phpVyKAhV@)5¤Mvendor/symfony/security-core/Authorization/TraceableAccessDecisionManager.php yKAh ÜT(¤Dvendor/symfony/security-core/Authorization/AccessDecisionManager.phplyKAhl0Õ¸ ¤Mvendor/symfony/security-core/Authorization/AccessDecisionManagerInterface.php}yKAh},tŸ¤Cvendor/symfony/security-core/Authorization/Voter/VoterInterface.php÷yKAh÷])°¤Lvendor/symfony/security-core/Authorization/Voter/CacheableVoterInterface.php~yKAh~šŽ9ÿ¤Dvendor/symfony/security-core/Authorization/Voter/ExpressionVoter.php3 yKAh3 ¥Ôë¤Gvendor/symfony/security-core/Authorization/Voter/RoleHierarchyVoter.phplyKAhlH¨??¤Cvendor/symfony/security-core/Authorization/Voter/TraceableVoter.php)yKAh)‡¤'J¤:vendor/symfony/security-core/Authorization/Voter/Voter.phpf yKAhf 5~î¤>vendor/symfony/security-core/Authorization/Voter/RoleVoter.phpÀyKAhÀÂPj^¤Gvendor/symfony/security-core/Authorization/Voter/AuthenticatedVoter.phpCyKAhC½A¤Avendor/symfony/security-core/Authorization/ExpressionLanguage.phpyKAh8Cªy¤Cvendor/symfony/security-core/Authorization/AuthorizationChecker.phpÉyKAhÉŠ”w¤Hvendor/symfony/security-core/Authorization/Strategy/PriorityStrategy.phpyKAh 7^¤Ivendor/symfony/security-core/Authorization/Strategy/UnanimousStrategy.php/yKAh/œ£ì¤Kvendor/symfony/security-core/Authorization/Strategy/AffirmativeStrategy.phpyKAhç Ù…¤Ivendor/symfony/security-core/Authorization/Strategy/ConsensusStrategy.phpÜyKAhÜÆÕ¤Wvendor/symfony/security-core/Authorization/Strategy/AccessDecisionStrategyInterface.php]yKAh]pf©¤)vendor/symfony/security-core/Security.php yKAh ¦´¤@vendor/symfony/security-core/Exception/AccessDeniedException.phpZyKAhZØpth¤Dvendor/symfony/security-core/Exception/InvalidCsrfTokenException.php}yKAh}ˆO§¤:vendor/symfony/security-core/Exception/LogoutException.phpˆyKAhˆƒy'פ9vendor/symfony/security-core/Exception/LogicException.phpðyKAhð„®$2¤@vendor/symfony/security-core/Exception/LazyResponseException.phpyKAhô.Á'¤Svendor/symfony/security-core/Exception/CustomUserMessageAuthenticationException.php yKAh ÃqHV¤=vendor/symfony/security-core/Exception/ExceptionInterface.phpÛyKAhÛ¨^ ¸¤Bvendor/symfony/security-core/Exception/BadCredentialsException.php‡yKAh‡hÖ —¤;vendor/symfony/security-core/Exception/RuntimeException.phpøyKAhø> ¤<vendor/symfony/security-core/Exception/DisabledException.phpvyKAhvϤֽ¤Avendor/symfony/security-core/Exception/TokenNotFoundException.phpƒyKAhƒã(» ¤Dvendor/symfony/security-core/Exception/ProviderNotFoundException.phpëyKAhëÐRˤFvendor/symfony/security-core/Exception/SessionUnavailableException.phpzyKAhz{º„Y¤Cvendor/symfony/security-core/Exception/InvalidArgumentException.phpyKAh¶‚W.¤Bvendor/symfony/security-core/Exception/AccountExpiredException.php‚yKAh‚O ¦ë¤Ivendor/symfony/security-core/Exception/AuthenticationExpiredException.phpGyKAhGÛ%.D¤Vvendor/symfony/security-core/Exception/TooManyLoginAttemptsAuthenticationException.php}yKAh}jµð‰¤?vendor/symfony/security-core/Exception/CookieTheftException.phpçyKAhçm ޤIvendor/symfony/security-core/Exception/AuthenticationServiceException.phpïyKAhït¥×%¤Cvendor/symfony/security-core/Exception/UnsupportedUserException.phpJyKAhJŒjÎÛ¤Avendor/symfony/security-core/Exception/AccountStatusException.phpyKAhc„ç%¤Rvendor/symfony/security-core/Exception/CustomUserMessageAccountStatusException.phpÜyKAhÜË* ¤Nvendor/symfony/security-core/Exception/InsufficientAuthenticationException.php&yKAh&µ[d¤:vendor/symfony/security-core/Exception/LockedException.phplyKAhl0믤Bvendor/symfony/security-core/Exception/AuthenticationException.php+ yKAh+ lªÄæ¤@vendor/symfony/security-core/Exception/UserNotFoundException.php@yKAh@ò¼“¤Uvendor/symfony/security-core/Exception/AuthenticationCredentialsNotFoundException.phpåyKAhåç´bb¤Fvendor/symfony/security-core/Exception/CredentialsExpiredException.phpœyKAhœ½¯8h¤Cvendor/symfony/security-core/Authentication/Token/AbstractToken.phpbyKAhbߤ7 ¤?vendor/symfony/security-core/Authentication/Token/NullToken.php yKAh ÁáiƤWvendor/symfony/security-core/Authentication/Token/Storage/UsageTrackingTokenStorage.phpƒ yKAhƒ ðlñ ¤Jvendor/symfony/security-core/Authentication/Token/Storage/TokenStorage.php4yKAh4gˤSvendor/symfony/security-core/Authentication/Token/Storage/TokenStorageInterface.phpžyKAhžÜ%†N¤Evendor/symfony/security-core/Authentication/Token/RememberMeToken.php´yKAh´ 5Lq¤Evendor/symfony/security-core/Authentication/Token/SwitchUserToken.phpmyKAhm8±¤Kvendor/symfony/security-core/Authentication/Token/PreAuthenticatedToken.php·yKAh·€Ã.½¤Dvendor/symfony/security-core/Authentication/Token/TokenInterface.php1 yKAh1 =N*ݤKvendor/symfony/security-core/Authentication/Token/UsernamePasswordToken.phpyKAhzÀ¤Tvendor/symfony/security-core/Authentication/AuthenticationTrustResolverInterface.php`yKAh`¬«J¤Kvendor/symfony/security-core/Authentication/AuthenticationTrustResolver.phpwyKAhwÆ4’ ¤Svendor/symfony/security-core/Authentication/RememberMe/PersistentTokenInterface.phpyKAhøñÿ¤Pvendor/symfony/security-core/Authentication/RememberMe/InMemoryTokenProvider.php'yKAh'ô=Ÿ¡¤Mvendor/symfony/security-core/Authentication/RememberMe/CacheTokenVerifier.php¤ yKAh¤ ö-Lu¤Jvendor/symfony/security-core/Authentication/RememberMe/PersistentToken.phpÛyKAhÛ·Ij¤Qvendor/symfony/security-core/Authentication/RememberMe/TokenVerifierInterface.phpyKAhçâÒ¤Qvendor/symfony/security-core/Authentication/RememberMe/TokenProviderInterface.php¬yKAh¬¦Þܪ¤Avendor/symfony/security-core/Event/AuthenticationSuccessEvent.phpuyKAhu®Ëû©¤:vendor/symfony/security-core/Event/AuthenticationEvent.php•yKAh•:7xª¤0vendor/symfony/security-core/Event/VoteEvent.php-yKAh-°åý¤*vendor/symfony/security-core/composer.json yKAh x¸±4¤5vendor/symfony/security-core/AuthenticationEvents.php‰yKAh‰"a䚤,vendor/symfony/deprecation-contracts/LICENSE,yKAh, KîÀ¤1vendor/symfony/deprecation-contracts/CHANGELOG.mdyKAhh{#¤1vendor/symfony/deprecation-contracts/function.phpöyKAhö•Oݤ.vendor/symfony/deprecation-contracts/README.md¨yKAh¨Xç¤2vendor/symfony/deprecation-contracts/composer.jsonSyKAhS¥×No¤(vendor/symfony/routing/CompiledRoute.php6yKAh6kæ ¤*vendor/symfony/routing/Attribute/Route.phpªyKAhªMT|¤vendor/symfony/routing/LICENSE,yKAh,„©»U¤(vendor/symfony/routing/RouteCompiler.phpê8yKAhê8 ºu¤#vendor/symfony/routing/CHANGELOG.md6yKAh6VÎ^¤)vendor/symfony/routing/RequestContext.php`yKAh`ª)-ͤ+vendor/symfony/routing/Annotation/Route.php¿yKAh¿mÐÚ\¤:vendor/symfony/routing/Matcher/RequestMatcherInterface.php+yKAh+¼<«¤=vendor/symfony/routing/Matcher/ExpressionLanguageProvider.phpyKAhòÍÍ~¤-vendor/symfony/routing/Matcher/UrlMatcher.php'yKAh' ø#ФBvendor/symfony/routing/Matcher/RedirectableUrlMatcherInterface.phpoyKAho0 ¾H¤6vendor/symfony/routing/Matcher/UrlMatcherInterface.php¤yKAh¤P-2Ȥ5vendor/symfony/routing/Matcher/CompiledUrlMatcher.php‡yKAh‡¡*g´¤6vendor/symfony/routing/Matcher/TraceableUrlMatcher.phpJyKAhJ@¡×¤Bvendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php™JyKAh™J ÿ3I¤7vendor/symfony/routing/Matcher/Dumper/MatcherDumper.phpyKAhæ\Pܤ@vendor/symfony/routing/Matcher/Dumper/MatcherDumperInterface.phpgyKAhgxI{$¤Avendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.phpÓyKAhÓk©ÅR¤@vendor/symfony/routing/Matcher/Dumper/StaticPrefixCollection.phpòyKAhòË¥¯¤9vendor/symfony/routing/Matcher/RedirectableUrlMatcher.php<yKAh<ðKʤ vendor/symfony/routing/README.md¸yKAh¸ïèrɤ9vendor/symfony/routing/Generator/CompiledUrlGenerator.php yKAh XA~¤1vendor/symfony/routing/Generator/UrlGenerator.php×;yKAh×;Yn'ü¤Fvendor/symfony/routing/Generator/ConfigurableRequirementsInterface.phpÍyKAhÍdf€Ð¤:vendor/symfony/routing/Generator/UrlGeneratorInterface.phpÒ yKAhÒ Y3 8¤Dvendor/symfony/routing/Generator/Dumper/GeneratorDumperInterface.phpiyKAhiîÚfE¤Fvendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php±yKAh±¥Â¤;vendor/symfony/routing/Generator/Dumper/GeneratorDumper.php$yKAh$αÛh¤*vendor/symfony/routing/RouteCollection.phpO+yKAhO+€u¤6vendor/symfony/routing/Requirement/EnumRequirement.phpŒyKAhŒñ—»¤2vendor/symfony/routing/Requirement/Requirement.phpRyKAhRý1·$¤7vendor/symfony/routing/RequestContextAwareInterface.php6yKAh6tÍù‘¤7vendor/symfony/routing/Loader/AnnotationClassLoader.phpÊyKAhÊtD±0¤:vendor/symfony/routing/Loader/AttributeDirectoryLoader.phpŸ yKAhŸ Tstþ¤5vendor/symfony/routing/Loader/AttributeFileLoader.phpýyKAhýMŒKI¤0vendor/symfony/routing/Loader/YamlFileLoader.php¡/yKAh¡/14%¤6vendor/symfony/routing/Loader/AnnotationFileLoader.php»yKAh»ÚŸò¤<vendor/symfony/routing/Loader/schema/routing/routing-1.0.xsd9yKAh9¯*§#¤/vendor/symfony/routing/Loader/PhpFileLoader.php»yKAh»@˜€ž¤5vendor/symfony/routing/Loader/Psr4DirectoryLoader.phpÕ yKAhÕ ø*Ò>¤/vendor/symfony/routing/Loader/XmlFileLoader.phpÏFyKAhÏF=ðkú¤.vendor/symfony/routing/Loader/ObjectLoader.phpq yKAhq ™!v|¤?vendor/symfony/routing/Loader/Configurator/Traits/HostTrait.php!yKAh!Öò¤Avendor/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php yKAh ‰(–¸¤Ivendor/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php3 yKAh3 }2 ¿¤@vendor/symfony/routing/Loader/Configurator/Traits/RouteTrait.php9yKAh9,—s¤>vendor/symfony/routing/Loader/Configurator/Traits/AddTrait.phpSyKAhSÓ¤@vendor/symfony/routing/Loader/Configurator/RouteConfigurator.phpyKAh{žª ¤Evendor/symfony/routing/Loader/Configurator/CollectionConfigurator.phpÙyKAhÙÖ Pä¤@vendor/symfony/routing/Loader/Configurator/AliasConfigurator.phpéyKAhéí…Óã¤Bvendor/symfony/routing/Loader/Configurator/RoutingConfigurator.phpéyKAhéÃa¡¤Avendor/symfony/routing/Loader/Configurator/ImportConfigurator.php yKAh ÷žêO¤6vendor/symfony/routing/Loader/AttributeClassLoader.phpÞ>yKAhÞ> ŸK¤1vendor/symfony/routing/Loader/ContainerLoader.phpôyKAhô½Íÿ:¤1vendor/symfony/routing/Loader/DirectoryLoader.phpöyKAhö] /¤0vendor/symfony/routing/Loader/GlobFileLoader.phpyKAh.]í¸¤/vendor/symfony/routing/Loader/ClosureLoader.phpÃyKAhÓ ¤;vendor/symfony/routing/Loader/AnnotationDirectoryLoader.phpÙyKAhÙ7 h¤ vendor/symfony/routing/Route.php‚/yKAh‚/“ñ_š¤*vendor/symfony/routing/RouterInterface.php"yKAh"šWF†¤!vendor/symfony/routing/Router.phpt/yKAht/-°ÁX¤1vendor/symfony/routing/RouteCompilerInterface.phpìyKAhìT§™’¤ vendor/symfony/routing/Alias.phpÀ yKAhÀ œÛÐäQvendor/symfony/routing/DependencyInjection/AddExpressionLanguageProvidersPass.php›yKAh›Tw¥¤Bvendor/symfony/routing/DependencyInjection/RoutingResolverPass.php"yKAh"K˶¢¤>vendor/symfony/routing/Exception/ResourceNotFoundException.php2yKAh2FL"1¤7vendor/symfony/routing/Exception/ExceptionInterface.php¼yKAh¼Ò&µ¶¤;vendor/symfony/routing/Exception/RouteNotFoundException.phpyKAh¹ Cå¤5vendor/symfony/routing/Exception/RuntimeException.phpyKAh$>G¦¤Hvendor/symfony/routing/Exception/MissingMandatoryParametersException.phpCyKAhCjYKФ=vendor/symfony/routing/Exception/InvalidArgumentException.phpyKAh›™‡Ö¤>vendor/symfony/routing/Exception/MethodNotAllowedException.phppyKAhp.Ö´á¤=vendor/symfony/routing/Exception/NoConfigurationException.phpßyKAhßÃr¥¨¤Dvendor/symfony/routing/Exception/RouteCircularReferenceException.php>yKAh>®\T¼¤>vendor/symfony/routing/Exception/InvalidParameterException.phpyKAhêÙ!N¤$vendor/symfony/routing/composer.jsonyyKAhyPÿ¯ó¤?vendor/symfony/service-contracts/ServiceSubscriberInterface.phpÛ yKAhÛ ×}uP¤?vendor/symfony/service-contracts/ServiceCollectionInterface.php€yKAh€ê}äV¤@vendor/symfony/service-contracts/Attribute/SubscribedService.phpÙyKAhÙiôÁ¤7vendor/symfony/service-contracts/Attribute/Required.phpŸyKAhŸ`¶¸e¤(vendor/symfony/service-contracts/LICENSE,yKAh,é¤ý¤@vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.phpI yKAhI RisY¤<vendor/symfony/service-contracts/Test/ServiceLocatorTest.phpÝyKAhÝ]—1C¤-vendor/symfony/service-contracts/CHANGELOG.mdyKAhh{#¤*vendor/symfony/service-contracts/README.mdJyKAhJï¯Ð“¤3vendor/symfony/service-contracts/ResetInterface.phpyKAhBÿ4¤=vendor/symfony/service-contracts/ServiceProviderInterface.phpƒyKAhƒB쯇¤;vendor/symfony/service-contracts/ServiceSubscriberTrait.php( yKAh( —½Ž˜¤Bvendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php> yKAh> Û³¼N¤8vendor/symfony/service-contracts/ServiceLocatorTrait.phpGyKAhGÂm•:¤.vendor/symfony/service-contracts/composer.jsonÞyKAhÞ«0Î_¤9vendor/symfony/property-info/PhpStan/NameScopeFactory.phpàyKAhàrÚËæ¤2vendor/symfony/property-info/PhpStan/NameScope.phpyKAhd)ݤ?vendor/symfony/property-info/PropertyInfoExtractorInterface.phpŒyKAhŒU-Rƒ¤%vendor/symfony/property-info/Type.phpüyKAhü®¬1ɤ$vendor/symfony/property-info/LICENSE,yKAh,„•H¤6vendor/symfony/property-info/Util/PhpDocTypeHelper.php¹yKAh¹0䯤7vendor/symfony/property-info/Util/PhpStanTypeHelper.php#yKAh#> ¤)vendor/symfony/property-info/CHANGELOG.md¦yKAh¦Ø.¤;vendor/symfony/property-info/PropertyInfoCacheExtractor.phpE yKAhE ±ˆØ¤Dvendor/symfony/property-info/PropertyWriteInfoExtractorInterface.phpŒyKAhŒxBy\¤Avendor/symfony/property-info/PropertyAccessExtractorInterface.phpyKAhî2$C¤?vendor/symfony/property-info/PropertyTypeExtractorInterface.phpQyKAhQþ‚¤1vendor/symfony/property-info/PropertyReadInfo.phpûyKAhû  ¯¤;vendor/symfony/property-info/Extractor/PhpStanExtractor.php.yKAh.ƒˆG¤>vendor/symfony/property-info/Extractor/SerializerExtractor.phpÇyKAhÇÕ ™¤?vendor/symfony/property-info/Extractor/ConstructorExtractor.phpŽyKAhމñ-U¤Tvendor/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.phpìyKAhìjv¿\¤>vendor/symfony/property-info/Extractor/ReflectionExtractor.phpíƒyKAh탘ˆøõ¤:vendor/symfony/property-info/Extractor/PhpDocExtractor.php&0yKAh&0dd¤Fvendor/symfony/property-info/PropertyDescriptionExtractorInterface.php yKAh  8¤2vendor/symfony/property-info/PropertyWriteInfo.phpß yKAhß CÛë¤&vendor/symfony/property-info/README.mdyKAh'ÿÏ7¤Cvendor/symfony/property-info/PropertyReadInfoExtractorInterface.php‡yKAh‡:|`Õ¤Hvendor/symfony/property-info/PropertyInitializableExtractorInterface.phpÁyKAhÁºOóW¤6vendor/symfony/property-info/PropertyInfoExtractor.phpà yKAhà yhФ?vendor/symfony/property-info/PropertyListExtractorInterface.phpŒyKAhŒðJ$¤Pvendor/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.phpYyKAhY[ì—c¤Evendor/symfony/property-info/DependencyInjection/PropertyInfoPass.php)yKAh)Æ ™¤*vendor/symfony/property-info/composer.jsonyKAh£¹j„¤3vendor/symfony/http-foundation/StreamedResponse.phpê yKAhê ÖÊ<¤:vendor/symfony/http-foundation/RequestMatcherInterface.php|yKAh|3åQ£¤5vendor/symfony/http-foundation/BinaryFileResponse.php°2yKAh°2Îy¤+vendor/symfony/http-foundation/InputBag.php7yKAh7s÷ĤIvendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.phpÏ yKAhÏ -3‡¤Jvendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php yKAh éŠÂ¤Rvendor/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php‹yKAh‹Uܤ&vendor/symfony/http-foundation/LICENSE,yKAh,„©»U¤Jvendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.phpLyKAhLfä_¤Dvendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.phpJyKAhJÇZ^¤Mvendor/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.phpyKAhUö¤Ivendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.phpàyKAhàI[x`¤Gvendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php.yKAh.PÒë¤Jvendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.phpEyKAhEKù¤Gvendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php,yKAh,™¹ý¤Dvendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php<yKAh<& Þó¤Lvendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php•yKAh•'`„7¤Evendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.phpùyKAhù^)Žž¤Evendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.phpëyKAhë<Ù¾J¤,vendor/symfony/http-foundation/ServerBag.phpÁyKAhÁó¤+vendor/symfony/http-foundation/CHANGELOG.mduLyKAhuLMü–¤,vendor/symfony/http-foundation/File/File.phpÂyKAh¡ޯԤ.vendor/symfony/http-foundation/File/Stream.phpïyKAhïø±x¤4vendor/symfony/http-foundation/File/UploadedFile.php^'yKAh^'b[Á¤Gvendor/symfony/http-foundation/File/Exception/AccessDeniedException.phpiyKAhiˆYµú¤Avendor/symfony/http-foundation/File/Exception/NoFileException.phpêyKAhê-ÐAº¤Fvendor/symfony/http-foundation/File/Exception/IniSizeFileException.phpðyKAhðè ÔI¤Jvendor/symfony/http-foundation/File/Exception/CannotWriteFileException.phpöyKAhö¶ :ݤHvendor/symfony/http-foundation/File/Exception/ExtensionFileException.phpóyKAhó)¤?vendor/symfony/http-foundation/File/Exception/FileException.phpàyKAhà‡j2¤Avendor/symfony/http-foundation/File/Exception/UploadException.phpÛyKAhÛƒSˆ¤Ivendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php9yKAh9dÚ-¤Gvendor/symfony/http-foundation/File/Exception/FormSizeFileException.phpòyKAhò‹äm;¤Gvendor/symfony/http-foundation/File/Exception/FileNotFoundException.phpYyKAhY{WɈ¤Fvendor/symfony/http-foundation/File/Exception/PartialFileException.phpïyKAhï±*¤Gvendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.phpóyKAhón‰ ³¤+vendor/symfony/http-foundation/Response.php›yKAh›”u‰¤)vendor/symfony/http-foundation/Cookie.phpJ/yKAhJ/é"«f¤/vendor/symfony/http-foundation/AcceptHeader.php{ yKAh{ ’Gñ‡¤1vendor/symfony/http-foundation/RequestMatcher.phpïyKAhïÕµnÒ¤4vendor/symfony/http-foundation/ResponseHeaderBag.phpªyKAhª4ºÖ­¤.vendor/symfony/http-foundation/HeaderUtils.php˜$yKAh˜$÷è4¤Fvendor/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php>yKAh>´Œ¤Dvendor/symfony/http-foundation/RequestMatcher/PathRequestMatcher.phpdyKAhd›w|¤Fvendor/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.phpäyKAhäTK’¤Dvendor/symfony/http-foundation/RequestMatcher/PortRequestMatcher.phpyKAh2ä¤Dvendor/symfony/http-foundation/RequestMatcher/HostRequestMatcher.phpRyKAhRåÓ÷s¤Jvendor/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.phpžyKAhžë…d¤Jvendor/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.phpéyKAhé¬Q§Ì¤Fvendor/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php,yKAh,s>M¤Cvendor/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php2yKAh2ti„±¤/vendor/symfony/http-foundation/RequestStack.php¥ yKAh¥ Ô´J¤3vendor/symfony/http-foundation/RedirectResponse.php9 yKAh9 ¤VÜï¤/vendor/symfony/http-foundation/JsonResponse.phpjyKAhjOÍP/¤(vendor/symfony/http-foundation/README.mdyKAh&¤*vendor/symfony/http-foundation/Request.phpyKAhBFF¥¤;vendor/symfony/http-foundation/ExpressionRequestMatcher.php¢yKAh¢|‚*¤/vendor/symfony/http-foundation/ParameterBag.phpûyKAhû6«¤*vendor/symfony/http-foundation/IpUtils.php yKAh Rz^¤3vendor/symfony/http-foundation/AcceptHeaderItem.phpÎ yKAhÎ å:Ô6¤7vendor/symfony/http-foundation/StreamedJsonResponse.phpyKAhØ•SÒ¤,vendor/symfony/http-foundation/UrlHelper.phpq yKAhq ž`Kl¤6vendor/symfony/http-foundation/ChainRequestMatcher.phpxyKAhx™X!²¤,vendor/symfony/http-foundation/HeaderBag.phpyKAhZ×dL¤*vendor/symfony/http-foundation/FileBag.php±yKAh±"4ϤHvendor/symfony/http-foundation/Exception/ConflictingHeadersException.phpyKAh·,ҤEvendor/symfony/http-foundation/Exception/UnexpectedValueException.phpxyKAhxš È•¤Fvendor/symfony/http-foundation/Exception/RequestExceptionInterface.phpòyKAhò½Rè¤@vendor/symfony/http-foundation/Exception/BadRequestException.phpÐyKAhД¢UÚ¤Ivendor/symfony/http-foundation/Exception/SuspiciousOperationException.phpyKAhï'¿€¤:vendor/symfony/http-foundation/Exception/JsonException.phpyKAhÂÏ®¤Evendor/symfony/http-foundation/Exception/SessionNotFoundException.phpYyKAhY•¶ö1¤,vendor/symfony/http-foundation/composer.jsonvyKAhv–’^D¤,vendor/symfony/http-foundation/UriSigner.php! yKAh! åÀ¤Jvendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.phpÜyKAhÜG¡f=¤Avendor/symfony/http-foundation/Session/Attribute/AttributeBag.phpñ yKAhñ Åðð¤Hvendor/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php4yKAh4»½É¤Bvendor/symfony/http-foundation/Session/SessionFactoryInterface.phpÃyKAhÃÔÃf*¤2vendor/symfony/http-foundation/Session/Session.phpÝyKAhÝ<)Ìð¤7vendor/symfony/http-foundation/Session/SessionUtils.php‹yKAh‹'èû¤Mvendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.phpùyKAhù—r@þ¤Qvendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.phpyKAh´ê±Õ¤Pvendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php)yKAh)°oˆ„¤Lvendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.phpšyKAhšìþAS¤Tvendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php~yKAh~|Ø%ô¤Svendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.phpšyKAhšwúáb¤Rvendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.phpø yKAhø Dt|©¤Mvendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.phpŸyKAhŸGÒ­q¤Pvendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.phpGyKAhG$ް¶¤Nvendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.phpå yKAhå Gâÿ¤Ovendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.phpô yKAhô mÔI¤Rvendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.phpè yKAhè oŽÚ¤Gvendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.phpó7yKAhó7wÀ`¤Jvendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php/yKAh/Œ{÷µ¤Pvendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.phpyKAhYPZ‰¤Lvendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.phpB yKAhB ‚Œ­ò¤Fvendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php½yKAh½ÕÒ<ë¤Nvendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php!yKAh! šË ¤Jvendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php¦yKAh¦‡©àf¤Qvendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.phpwyKAhw]n²¤Ivendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php yKAh *µƒ8¤Qvendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.phpˆyKAhˆç”ɤ>vendor/symfony/http-foundation/Session/Storage/MetadataBag.phpð yKAhð îá¤Jvendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php yKAh Q3çU¤;vendor/symfony/http-foundation/Session/SessionInterface.phpyKAhOY>—¤Cvendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.phpà yKAhà Ô–Þ¤Bvendor/symfony/http-foundation/Session/Flash/FlashBagInterface.phpyKAhu1Ф9vendor/symfony/http-foundation/Session/Flash/FlashBag.phpó yKAhó vÉ…¤9vendor/symfony/http-foundation/Session/SessionFactory.phpGyKAhG Ò¤:vendor/symfony/http-foundation/Session/SessionBagProxy.phpõyKAhõÝ ‚¤>vendor/symfony/http-foundation/Session/SessionBagInterface.phpWyKAhW#9¶‹¤,vendor/symfony/var-exporter/Instantiator.php¤ yKAh¤ ¨ ¿ø¤+vendor/symfony/var-exporter/ProxyHelper.phpJ^yKAhJ^Â:w¤#vendor/symfony/var-exporter/LICENSE,yKAh,é¤ý¤(vendor/symfony/var-exporter/CHANGELOG.mdãyKAhãt•–?¤(vendor/symfony/var-exporter/Hydrator.phpÖ yKAhÖ –LÑ„¤8vendor/symfony/var-exporter/Internal/LazyObjectState.php(yKAh(P˜Èþ¤;vendor/symfony/var-exporter/Internal/LazyObjectRegistry.phpTyKAhT” x¤/vendor/symfony/var-exporter/Internal/Values.phpòyKAhò`Ç¿â¤8vendor/symfony/var-exporter/Internal/LazyObjectTrait.php)yKAh)Ý;Þ£¤1vendor/symfony/var-exporter/Internal/Hydrator.php(.yKAh(.L˜\-¤1vendor/symfony/var-exporter/Internal/Registry.php@yKAh@#¤2vendor/symfony/var-exporter/Internal/Reference.php yKAh #Jn¤1vendor/symfony/var-exporter/Internal/Exporter.phpUByKAhUBE¦¸G¤.vendor/symfony/var-exporter/LazyGhostTrait.phpü;yKAhü;—Y²¤%vendor/symfony/var-exporter/README.md-yKAh-"ª¤.vendor/symfony/var-exporter/LazyProxyTrait.php2yKAh2üjÈˤ+vendor/symfony/var-exporter/VarExporter.phpRyKAhR§eHõ¤3vendor/symfony/var-exporter/LazyObjectInterface.phpayKAhaê@#¤8vendor/symfony/var-exporter/Exception/LogicException.phpyKAhþ-ʤ<vendor/symfony/var-exporter/Exception/ExceptionInterface.phpdyKAhdë¤ú¤@vendor/symfony/var-exporter/Exception/ClassNotFoundException.php1yKAh1w’w¤Fvendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php>yKAh>ƒ}æ¤)vendor/symfony/var-exporter/composer.jsonryKAhrÔ~×j¤Evendor/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php yKAh Þºô†¤Ivendor/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.phpRyKAhRâþ¤Mvendor/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php* yKAh* ^ßz¤Kvendor/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.phpyKAh1'¿¤$vendor/symfony/error-handler/LICENSE,yKAh,Õ¦_Ϥ)vendor/symfony/error-handler/CHANGELOG.md¨yKAh¨DŠ9á¤Bvendor/symfony/error-handler/Resources/bin/patch-type-declarationsó yKAhó d‘"m¤Mvendor/symfony/error-handler/Resources/bin/extract-tentative-return-types.phpyKAh·ªmE¤?vendor/symfony/error-handler/Resources/views/exception.html.php/yKAh/úËý¤<vendor/symfony/error-handler/Resources/views/traces.html.phpé yKAhé n–ΤAvendor/symfony/error-handler/Resources/views/traces_text.html.phpÈyKAhÈj+2“¤:vendor/symfony/error-handler/Resources/views/logs.html.php) yKAh) _&ò¶¤;vendor/symfony/error-handler/Resources/views/trace.html.php` yKAh` 3¡Á9¤;vendor/symfony/error-handler/Resources/views/error.html.phpdyKAhd»º¸x¤Dvendor/symfony/error-handler/Resources/views/exception_full.html.phpÛyKAhÛ‚EÞ¤?vendor/symfony/error-handler/Resources/assets/css/exception.css ByKAh BÀ°ŸR¤Dvendor/symfony/error-handler/Resources/assets/css/exception_full.cssÀ yKAhÀ *ñbc¤;vendor/symfony/error-handler/Resources/assets/css/error.cssyKAh§%7¤Jvendor/symfony/error-handler/Resources/assets/images/icon-minus-square.svgQyKAhQ£pª¤Bvendor/symfony/error-handler/Resources/assets/images/icon-book.svg‘yKAh‘û§ô¤Evendor/symfony/error-handler/Resources/assets/images/icon-support.svgzyKAhzS„¨Ì¤Fvendor/symfony/error-handler/Resources/assets/images/chevron-right.svgyKAh¾ ¤Jvendor/symfony/error-handler/Resources/assets/images/symfony-ghost.svg.php yKAh 9‚ê’¤Ivendor/symfony/error-handler/Resources/assets/images/icon-plus-square.svgºyKAhºÓþU¤Evendor/symfony/error-handler/Resources/assets/images/symfony-logo.svg®yKAh®%0ÿɤBvendor/symfony/error-handler/Resources/assets/images/icon-copy.svg yKAh "ÃÈ–¤Gvendor/symfony/error-handler/Resources/assets/images/favicon.png.base64×yKAh׫"i^¤Kvendor/symfony/error-handler/Resources/assets/images/icon-plus-square-o.svgyKAh-ÝÀ´¤Lvendor/symfony/error-handler/Resources/assets/images/icon-minus-square-o.svg°yKAh°Ús0¤=vendor/symfony/error-handler/Resources/assets/js/exception.jsî4yKAhî4C#¤¬¤8vendor/symfony/error-handler/Internal/TentativeTypes.php‘yKAh‘âù¤&vendor/symfony/error-handler/Debug.phpHyKAhHþs ߤFvendor/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php yKAh ¿«<¤?vendor/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php„yKAh„ +Ü2¤Evendor/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.phpyKAh¶sßÛ¤@vendor/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php'^yKAh'^ZËO¤@vendor/symfony/error-handler/ErrorRenderer/FileLinkFormatter.phpPyKAhPY™¤&vendor/symfony/error-handler/README.md=yKAh=ñüØ\¤1vendor/symfony/error-handler/DebugClassLoader.phpˆ¿yKAhˆ¿m_ˤ0vendor/symfony/error-handler/BufferingLogger.phpAyKAhAüZ¤-vendor/symfony/error-handler/ErrorHandler.phpukyKAhukw€¡)¤/vendor/symfony/error-handler/ThrowableUtils.php{yKAh{-øF¨¤7vendor/symfony/error-handler/Error/OutOfMemoryError.php[yKAh[N¿¤¤;vendor/symfony/error-handler/Error/UndefinedMethodError.phpyKAh•V[±¤1vendor/symfony/error-handler/Error/FatalError.phpÈ yKAhÈ ®Fùf¤=vendor/symfony/error-handler/Error/UndefinedFunctionError.phpyKAhlnB¤¤9vendor/symfony/error-handler/Error/ClassNotFoundError.phpyKAh¡Ep¤;vendor/symfony/error-handler/Exception/FlattenException.phpI.yKAhI.ޱњ¤?vendor/symfony/error-handler/Exception/SilencedErrorContext.phpryKAhr+ò÷¤*vendor/symfony/error-handler/composer.json¥yKAh¥ny& ¤4vendor/symfony/cache-contracts/CallbackInterface.php]yKAh]oW$«¤0vendor/symfony/cache-contracts/ItemInterface.php6yKAh6#à ¤&vendor/symfony/cache-contracts/LICENSE,yKAh,é¤ý¤+vendor/symfony/cache-contracts/CHANGELOG.mdyKAhh{#¤1vendor/symfony/cache-contracts/CacheInterface.php2 yKAh2 Ü5 ³¤:vendor/symfony/cache-contracts/NamespacedPoolInterface.php‡yKAh‡Nˆž¬¤(vendor/symfony/cache-contracts/README.mdFyKAhF±™_¤-vendor/symfony/cache-contracts/CacheTrait.phpÆ yKAhÆ ¯iÂW¤9vendor/symfony/cache-contracts/TagAwareCacheInterface.phpyKAh1swc¤,vendor/symfony/cache-contracts/composer.jsonyKAh³/¤7vendor/symfony/dependency-injection/EnvVarProcessor.php£2yKAh£2sÙF—¤;vendor/symfony/dependency-injection/ContainerAwareTrait.phpOyKAhO4ˆrS¤Bvendor/symfony/dependency-injection/ExpressionLanguageProvider.php\yKAh\lËD¤1vendor/symfony/dependency-injection/Container.php·6yKAh·6ŸØS¤8vendor/symfony/dependency-injection/ReverseContainer.phpË yKAhË 4)·È¤0vendor/symfony/dependency-injection/Variable.phpÁyKAhÁöhpž¤Pvendor/symfony/dependency-injection/Extension/ConfigurableExtensionInterface.php#yKAh#á…‹~¤Dvendor/symfony/dependency-injection/Extension/ExtensionInterface.php`yKAh`^ N‰¤Cvendor/symfony/dependency-injection/Extension/AbstractExtension.phpÚyKAhÚW‚$â¤@vendor/symfony/dependency-injection/Extension/ExtensionTrait.phpè yKAhè VÕ²¤;vendor/symfony/dependency-injection/Extension/Extension.phpyKAh¨0Bê¤Kvendor/symfony/dependency-injection/Extension/PrependExtensionInterface.phpSyKAhSªNC6¤Qvendor/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.phpSyKAhSû²Å)¤?vendor/symfony/dependency-injection/Attribute/Autoconfigure.php€yKAh€œZÆÓ¤Bvendor/symfony/dependency-injection/Attribute/AutowireIterator.phpyKAh·o‹¤=vendor/symfony/dependency-injection/Attribute/AsDecorator.phpoyKAhoÏY–|¤Hvendor/symfony/dependency-injection/Attribute/AutowireServiceClosure.phpyKAhô^#5¤>vendor/symfony/dependency-injection/Attribute/AsTaggedItem.php‰yKAh‰kÏŒ¤8vendor/symfony/dependency-injection/Attribute/Target.phpüyKAhüšA¤6vendor/symfony/dependency-injection/Attribute/When.php˜yKAh˜ýXÌˤCvendor/symfony/dependency-injection/Attribute/AutowireDecorated.php€yKAh€+þh¤@vendor/symfony/dependency-injection/Attribute/TaggedIterator.phpyKAhþ‘´u¤Avendor/symfony/dependency-injection/Attribute/AutowireLocator.phpe yKAhe ±€¤Bvendor/symfony/dependency-injection/Attribute/AutowireCallable.phpTyKAhT鼎`¤:vendor/symfony/dependency-injection/Attribute/Autowire.php] yKAh] êsO¤Bvendor/symfony/dependency-injection/Attribute/AutoconfigureTag.php¸yKAh¸ ²¤?vendor/symfony/dependency-injection/Attribute/TaggedLocator.phpyKAh†é±ž¤>vendor/symfony/dependency-injection/Attribute/MapDecorated.phpbyKAhbÊ\¼¤9vendor/symfony/dependency-injection/Attribute/Exclude.phpõyKAhõ—a)¤9vendor/symfony/dependency-injection/Attribute/AsAlias.php¼yKAh¼œ®ó†¤+vendor/symfony/dependency-injection/LICENSE,yKAh,„©»U¤0vendor/symfony/dependency-injection/CHANGELOG.mdhIyKAhhIZ[¤Qvendor/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php)yKAh)}û~­¤Jvendor/symfony/dependency-injection/Config/ContainerParametersResource.phpùyKAhùàË5¤Jvendor/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php yKAh ñ/€½¤Avendor/symfony/dependency-injection/Argument/AbstractArgument.phpÆyKAhÆÎ1·i¤Dvendor/symfony/dependency-injection/Argument/RewindableGenerator.php±yKAh±›s²¤Gvendor/symfony/dependency-injection/Argument/ServiceLocatorArgument.phpžyKAhž/Úc=¤>vendor/symfony/dependency-injection/Argument/BoundArgument.phpçyKAhç>))¤Avendor/symfony/dependency-injection/Argument/IteratorArgument.php6yKAh6ä2©Ò¤<vendor/symfony/dependency-injection/Argument/LazyClosure.php_ yKAh_ a¶5ѤGvendor/symfony/dependency-injection/Argument/TaggedIteratorArgument.phpu yKAhu ’ÊÁ¤Bvendor/symfony/dependency-injection/Argument/ArgumentInterface.phpNyKAhNò¹¤?vendor/symfony/dependency-injection/Argument/ServiceLocator.php#yKAh#Ä›s@¤Gvendor/symfony/dependency-injection/Argument/ServiceClosureArgument.php*yKAh*k”à¤8vendor/symfony/dependency-injection/ContainerBuilder.php§íyKAh§íÏAcZ¤7vendor/symfony/dependency-injection/ChildDefinition.phpp yKAhp /oœ³¤1vendor/symfony/dependency-injection/Reference.php¾yKAh¾’žÍ¯¤Jvendor/symfony/dependency-injection/ParameterBag/ParameterBagInterface.phpí yKAhí U]­¤Ovendor/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.phpÊyKAhÊ®µ!¤Avendor/symfony/dependency-injection/ParameterBag/ParameterBag.phpÿ$yKAhÿ$ƒ¢AÒ¤Jvendor/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php¯yKAh¯’‰®—¤Avendor/symfony/dependency-injection/ParameterBag/ContainerBag.phpüyKAhü#µO¤Gvendor/symfony/dependency-injection/ParameterBag/FrozenParameterBag.phpŒyKAhŒõ„0P¤2vendor/symfony/dependency-injection/Definition.phpPyKAhPD¬š¤@vendor/symfony/dependency-injection/EnvVarProcessorInterface.phpyKAh9‘0”¤-vendor/symfony/dependency-injection/README.mdCyKAhCš<¤:vendor/symfony/dependency-injection/ContainerInterface.phpd yKAhd ùçúʤ9vendor/symfony/dependency-injection/Loader/FileLoader.php<yKAh<(Ù¤=vendor/symfony/dependency-injection/Loader/YamlFileLoader.php ¦yKAh ¦Qd2ð¤Ovendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsdByKAhBÃo¤<vendor/symfony/dependency-injection/Loader/PhpFileLoader.php“!yKAh“!gÒ¤<vendor/symfony/dependency-injection/Loader/XmlFileLoader.phpžšyKAhžšBdü¤<vendor/symfony/dependency-injection/Loader/IniFileLoader.php yKAh j}÷¤Pvendor/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php4yKAh4ð gФPvendor/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php9 yKAh9 Caõ¹¤Qvendor/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php®yKAh®úwå¤Tvendor/symfony/dependency-injection/Loader/Configurator/FromCallableConfigurator.phpçyKAhç6n¹à¤Mvendor/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php1yKAh1¸ž·D¤Lvendor/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.phpNyKAhNƒX_^¤Qvendor/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php¨yKAh¨Ï¶.¤Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.phplyKAhl s«_¤Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php»yKAh»È ç¤Tvendor/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.phpyKAhMÎù¤Nvendor/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.phpàyKAhà(¹„À¤Ovendor/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.phpdyKAhd'áD¤Kvendor/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.phpñyKAhññðp¤Nvendor/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php¡yKAh¡ŽØñ¤Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php{yKAh{³2ŸÑ¤Uvendor/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.phpEyKAhE^Øæ7¤Tvendor/symfony/dependency-injection/Loader/Configurator/Traits/FromCallableTrait.php¸ yKAh¸ ð\ ¤Qvendor/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.phpbyKAhb–*'ѤLvendor/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php[yKAh[Bîf¤Lvendor/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.phpDyKAhD5R¬ê¤Lvendor/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.phpGyKAhGÆF8¤Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.phpšyKAhšºöge¤Mvendor/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.phpLyKAhLÝ«b¤Pvendor/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.phpMyKAhMüP—á¤Svendor/symfony/dependency-injection/Loader/Configurator/Traits/ConstructorTrait.phpUyKAhU86¼$¤Pvendor/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.phpŸyKAhŸÔÿ)¤Xvendor/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php‡yKAh‡«#Ëy¤Kvendor/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.phpjyKAhjÉ鮤Wvendor/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.phpÛ yKAhÛ ëf½Û¤Rvendor/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.phpyKAhÑ!R¤Qvendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php³yKAh³’4¤Mvendor/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.phpðyKAhðRF,b¤Uvendor/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.phpRyKAhRöË<¤Qvendor/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.phpÆ yKAhÆ oÿ¤Rvendor/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php‘yKAh‘â"¤Ovendor/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.phpyKAhA[_v¤>vendor/symfony/dependency-injection/Loader/DirectoryLoader.php2yKAh2æµ ¤=vendor/symfony/dependency-injection/Loader/GlobFileLoader.php`yKAh`À¤ó¾¤<vendor/symfony/dependency-injection/Loader/ClosureLoader.php„yKAh„5ÖÙï¤=vendor/symfony/dependency-injection/LazyProxy/ProxyHelper.phpù yKAhù Äž}¤Kvendor/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.phpyKAh5ç=†¤Mvendor/symfony/dependency-injection/LazyProxy/PhpDumper/LazyServiceDumper.phpàyKAhàpí’<¤Fvendor/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.phpùyKAhùv‰OΤVvendor/symfony/dependency-injection/LazyProxy/Instantiator/LazyServiceInstantiator.phpÌyKAhÌô(d¤Vvendor/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.phpdyKAhdç¿“à¤Tvendor/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php~yKAh~0¹ND¤:vendor/symfony/dependency-injection/ExpressionLanguage.phpbyKAhb!ÞUO¤6vendor/symfony/dependency-injection/ServiceLocator.phpÇyKAhÇ9x"D¤6vendor/symfony/dependency-injection/TypedReference.php3yKAh3aèdt¤-vendor/symfony/dependency-injection/Alias.php‡ yKAh‡ nZÒÔ¤Uvendor/symfony/dependency-injection/Exception/ParameterCircularReferenceException.phpßyKAhßðŸt9¤@vendor/symfony/dependency-injection/Exception/LogicException.phpÊyKAhÊ}É|ȤFvendor/symfony/dependency-injection/Exception/EnvNotFoundException.phpôyKAhô˜¦&¤Lvendor/symfony/dependency-injection/Exception/ParameterNotFoundException.php"yKAh"Ò ¢®¤Dvendor/symfony/dependency-injection/Exception/ExceptionInterface.php~yKAh~ë¥ã¤Fvendor/symfony/dependency-injection/Exception/OutOfBoundsException.phpÜyKAhÜOnú¤Svendor/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php_yKAh_Ke&¤Jvendor/symfony/dependency-injection/Exception/ServiceNotFoundException.php¯yKAh¯ùФBvendor/symfony/dependency-injection/Exception/RuntimeException.php yKAh  œìê¤Jvendor/symfony/dependency-injection/Exception/InvalidArgumentException.php'yKAh'ÿÿ»¤Hvendor/symfony/dependency-injection/Exception/BadMethodCallException.phpâyKAhâ,wð¤Kvendor/symfony/dependency-injection/Exception/AutowiringFailedException.phpyKAhïM¤Ovendor/symfony/dependency-injection/Exception/InvalidParameterTypeException.php0yKAh0ö™ÓI¤Gvendor/symfony/dependency-injection/Exception/EnvParameterException.phpyKAhË=&)¤@vendor/symfony/dependency-injection/TaggedContainerInterface.php¿yKAh¿J.ƒþ¤1vendor/symfony/dependency-injection/Parameter.phpfyKAhfs²D¤Evendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php¯yKAh¯¼'½f¤Mvendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.phpòyKAhò°Â]‘¤Lvendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.phpóyKAhóõ·¤Mvendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php@ yKAh@ Îp脤Tvendor/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php yKAh 呱¤Lvendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php!yKAh!g PK¤;vendor/symfony/dependency-injection/Compiler/PassConfig.phpmyKAhm1Õ&¹¤Fvendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php¤ yKAh¤ üj¤Evendor/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.phpK yKAhK ë7¶É¤Jvendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.phpóyKAhóüÒ¤Jvendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php°1yKAh°1Wë¤Mvendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.phpÖyKAhÖ¤ç׿¤Hvendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.phpyKAh%dîê¤Dvendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php$*yKAh$* B¤Hvendor/symfony/dependency-injection/Compiler/AutowireAsDecoratorPass.phpžyKAhž3¦¡Ÿ¤Kvendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.phpßyKAhß®v3¤Mvendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php–yKAh–€½QY¤Fvendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php8*yKAh8*à‚c3¤Rvendor/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.phpÐyKAhДHl¤Rvendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php8yKAh8y탤Ovendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php yKAh c÷÷W¤Kvendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php3yKAh3Š÷ì·¤Ovendor/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.phpæyKAhæ1xö¾¤Ovendor/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php- yKAh- zÃÛh¤Jvendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php'yKAh'Á$°ô¤Ivendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php‘yKAh‘×XB¤Pvendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php¡!yKAh¡!?ó ¤Jvendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.phpiyKAhi^žn¤Mvendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.phpœ yKAhœ »ÚB¤Lvendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php‡ yKAh‡ xp¤=vendor/symfony/dependency-injection/Compiler/AutowirePass.php8{yKAh8{an+‚¤Fvendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.phpyKAhÅÑJ¤Rvendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.phpqyKAhq?ú¤Kvendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php¥yKAh¥†ü]¤Lvendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.phpÖ yKAhÖ ©g—G¤]vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.phpÖyKAhÖËLÓפJvendor/symfony/dependency-injection/Compiler/RemoveBuildParametersPass.phpÉyKAhÉÅvg¤Evendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.phpéyKAhézÊp ¤Qvendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php­ yKAh­ õëF0¤Avendor/symfony/dependency-injection/Compiler/ResolveClassPass.php]yKAh]v`¤Nvendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.phpÄyKAhÄòý‘Q¤Kvendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php6yKAh6YBŠ ¤Ovendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php‘yKAh‘a%’¤Cvendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php< yKAh< ‰sY[¤Jvendor/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.phpyKAhl”D¤Nvendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.phpñyKAhñƒÙ­v¤Fvendor/symfony/dependency-injection/Compiler/CompilerPassInterface.phpÓyKAhÓæöñ&¤Svendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.phpayKAhaÄp§6¤Lvendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php&yKAh&«ÒWì¤9vendor/symfony/dependency-injection/Compiler/Compiler.phpà yKAhà ð–üˤFvendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php–yKAh–¬ ¤Mvendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php‘yKAh‘^¶0¤Lvendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.phpšyKAhš`ê#{¤=vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php÷#yKAh÷#Þs“O¤9vendor/symfony/dependency-injection/Dumper/YamlDumper.php"8yKAh"8O”Àˤ8vendor/symfony/dependency-injection/Dumper/Preloader.phpçyKAhçvÅ{û¤8vendor/symfony/dependency-injection/Dumper/XmlDumper.phpÜHyKAhÜH]߸¤>vendor/symfony/dependency-injection/Dumper/DumperInterface.phpVyKAhVs¹ç#¤5vendor/symfony/dependency-injection/Dumper/Dumper.phpµyKAhµU;êa¤8vendor/symfony/dependency-injection/Dumper/PhpDumper.php…yKAh…øÂŸ6¤1vendor/symfony/dependency-injection/composer.jsonÛyKAhÛXÿ~¤=vendor/symfony/dependency-injection/EnvVarLoaderInterface.phpyKAhbkr¸¤?vendor/symfony/dependency-injection/ContainerAwareInterface.php·yKAh·=>¸¤vendor/symfony/clock/LICENSE,yKAh,t=¥¤1vendor/symfony/clock/Test/ClockSensitiveTrait.phpšyKAhšIÚ¤!vendor/symfony/clock/CHANGELOG.md yKAh æŽCJ¤&vendor/symfony/clock/Resources/now.phpºyKAhºî5ä¤(vendor/symfony/clock/ClockAwareTrait.phpÙyKAhÙ3±‡¤vendor/symfony/clock/README.md©yKAh©I–ž¤"vendor/symfony/clock/MockClock.php¸ yKAh¸ $i¬Œ¤vendor/symfony/clock/Clock.phpS yKAhS *Rˆ'¤'vendor/symfony/clock/MonotonicClock.php¤ yKAh¤ }ÛZ¤'vendor/symfony/clock/ClockInterface.phpLyKAhLzÖš&¤"vendor/symfony/clock/DatePoint.phpyKAh‰¦Ð¤"vendor/symfony/clock/composer.jsonËyKAhË GPÒ¤$vendor/symfony/clock/NativeClock.php/yKAh/uró+¤:vendor/symfony/password-hasher/PasswordHasherInterface.php¹yKAh¹-<£¤>vendor/symfony/password-hasher/Hasher/SodiumPasswordHasher.phpáyKAháî¸^~¤Bvendor/symfony/password-hasher/Hasher/CheckPasswordLengthTrait.phpŽyKAhŽ‹B+.¤<vendor/symfony/password-hasher/Hasher/UserPasswordHasher.phpKyKAhKr’,Ф>vendor/symfony/password-hasher/Hasher/Pbkdf2PasswordHasher.phpð yKAhð SÊÈ8¤Fvendor/symfony/password-hasher/Hasher/PasswordHasherAwareInterface.php—yKAh—Ï¡*¤>vendor/symfony/password-hasher/Hasher/NativePasswordHasher.php‘yKAh‘¥Qã¤Evendor/symfony/password-hasher/Hasher/MessageDigestPasswordHasher.php yKAh r6k ¤Evendor/symfony/password-hasher/Hasher/UserPasswordHasherInterface.phpryKAhr4’ΤAvendor/symfony/password-hasher/Hasher/PlaintextPasswordHasher.php[ yKAh[ ¬ðˆ¤Hvendor/symfony/password-hasher/Hasher/PasswordHasherFactoryInterface.phpyKAhª©@¤Avendor/symfony/password-hasher/Hasher/MigratingPasswordHasher.php˜yKAh˜r¨êG¤?vendor/symfony/password-hasher/Hasher/PasswordHasherFactory.php&!yKAh&!ÚÛFA¤&vendor/symfony/password-hasher/LICENSE,yKAh,„©»U¤+vendor/symfony/password-hasher/CHANGELOG.mdÌyKAh̵ûÚ°¤@vendor/symfony/password-hasher/LegacyPasswordHasherInterface.php¤yKAh¤të¯ú¤(vendor/symfony/password-hasher/README.mdÜyKAhÜ!ü”»¤Bvendor/symfony/password-hasher/Command/UserPasswordHashCommand.php'yKAh'8 ‡–¤;vendor/symfony/password-hasher/Exception/LogicException.php»yKAh»Š×A·¤?vendor/symfony/password-hasher/Exception/ExceptionInterface.phpèyKAhè¶EWL¤Evendor/symfony/password-hasher/Exception/InvalidPasswordException.php€yKAh€Lª¤,vendor/symfony/password-hasher/composer.jsonÄyKAhĪ®¤vendor/symfony/process/LICENSE,yKAh,„©»U¤+vendor/symfony/process/ExecutableFinder.php• yKAh• wtÏä¤#vendor/symfony/process/CHANGELOG.md€yKAh€%8¤ vendor/symfony/process/README.mdØyKAhØ\3$Ϥ*vendor/symfony/process/Pipes/UnixPipes.phpyKAh¯þ6ø¤-vendor/symfony/process/Pipes/WindowsPipes.php¶yKAh¶ŸÿQ¤.vendor/symfony/process/Pipes/AbstractPipes.phpÊyKAhÊeó»¤/vendor/symfony/process/Pipes/PipesInterface.phpíyKAhí·ù¤Ÿ¤&vendor/symfony/process/InputStream.phpÅ yKAhÅ 6eÌe¤6vendor/symfony/process/Messenger/RunProcessContext.php|yKAh|É”ª¤6vendor/symfony/process/Messenger/RunProcessMessage.phpÙyKAhÙ2$°¤=vendor/symfony/process/Messenger/RunProcessMessageHandler.php%yKAh%¢å0¤%vendor/symfony/process/PhpProcess.php¼ yKAh¼ ¼3x¤(vendor/symfony/process/PhpSubprocess.phpóyKAhóÿ°:1¤.vendor/symfony/process/PhpExecutableFinder.php% yKAh% Þxë¤=vendor/symfony/process/Exception/ProcessSignaledException.phpÔyKAhÔ-n _¤3vendor/symfony/process/Exception/LogicException.phpàyKAhài»UQ¤7vendor/symfony/process/Exception/ExceptionInterface.phpÐyKAhÐ j%W¤;vendor/symfony/process/Exception/ProcessFailedException.phppyKAhpÛ‹¤5vendor/symfony/process/Exception/RuntimeException.phpïyKAhïPè¤=vendor/symfony/process/Exception/ProcessTimedOutException.php½yKAh½õ8^Q¤=vendor/symfony/process/Exception/InvalidArgumentException.phpþyKAhþœÚ´¤>vendor/symfony/process/Exception/RunProcessFailedException.php¶yKAh¶Öؤ$vendor/symfony/process/composer.jsonÊyKAhÊS.t¾¤'vendor/symfony/process/ProcessUtils.phpóyKAhó€aé¤"vendor/symfony/process/Process.phpìËyKAhìËê8 ¤=vendor/symfony/console/DataCollector/CommandDataCollector.phpØyKAhØ&È ¤(vendor/symfony/console/ConsoleEvents.phpœyKAhœ. ¤!vendor/symfony/console/Cursor.phpÃyKAhÃ\FÅä&vendor/symfony/console/Application.phpë¹yKAhë¹å!É(¤/vendor/symfony/console/Logger/ConsoleLogger.phpYyKAhYĠ™¤.vendor/symfony/console/Attribute/AsCommand.phpJyKAhJc󸳤vendor/symfony/console/LICENSE,yKAh,„©»U¤#vendor/symfony/console/CHANGELOG.md¦)yKAh¦)b_e¤9vendor/symfony/console/Input/StreamableInputInterface.php‘yKAh‘ú3y-¤+vendor/symfony/console/Input/ArrayInput.phpHyKAhHůÌx¤*vendor/symfony/console/Input/ArgvInput.phpé0yKAhé0ÚÝ#¤.vendor/symfony/console/Input/InputArgument.php:yKAh: È›¤4vendor/symfony/console/Input/InputAwareInterface.phpcyKAhcQ˜«¤,vendor/symfony/console/Input/InputOption.php„!yKAh„!!1g=¤0vendor/symfony/console/Input/InputDefinition.phpU.yKAhU.)ôˆÍ¤,vendor/symfony/console/Input/StringInput.phpî yKAhî ÏÌGª¤&vendor/symfony/console/Input/Input.phplyKAhl˜ë±;¤/vendor/symfony/console/Input/InputInterface.php|yKAh|kxÌ'¤#vendor/symfony/console/Terminal.php‡yKAh‡`HÊN¤2vendor/symfony/console/CI/GithubActionReporter.php+ yKAh+ ¹–@…¤0vendor/symfony/console/Resources/completion.bashü yKAhü Õ%}ñ¤4vendor/symfony/console/Resources/bin/hiddeninput.exe$yKAh$•¥v¤/vendor/symfony/console/Resources/completion.zsh yKAh æÖʤ0vendor/symfony/console/Resources/completion.fishÓyKAhÓ‘KeÕ¤5vendor/symfony/console/Output/TrimmedBufferOutput.phpYyKAhYGÅ>d¤8vendor/symfony/console/Output/ConsoleOutputInterface.php=yKAh=¿BÒ:¤0vendor/symfony/console/Output/BufferedOutput.phpQyKAhQ*AS¤1vendor/symfony/console/Output/OutputInterface.php6 yKAh6 j8q®¤/vendor/symfony/console/Output/AnsiColorMode.php» yKAh» oiÇ+¤(vendor/symfony/console/Output/Output.phpïyKAhïÌ÷\Τ6vendor/symfony/console/Output/ConsoleSectionOutput.php9!yKAh9!¸Í §¤/vendor/symfony/console/Output/ConsoleOutput.phpøyKAhøøÂ:*¤,vendor/symfony/console/Output/NullOutput.phpOyKAhOp Á¤.vendor/symfony/console/Output/StreamOutput.phpðyKAhð+%¢Ø¤Avendor/symfony/console/Completion/Output/FishCompletionOutput.phpyKAh`„³Ž¤Avendor/symfony/console/Completion/Output/BashCompletionOutput.php yKAh Q2«‚¤Fvendor/symfony/console/Completion/Output/CompletionOutputInterface.phpìyKAhìÇ:]þ¤@vendor/symfony/console/Completion/Output/ZshCompletionOutput.php1yKAh1ø¶°¤0vendor/symfony/console/Completion/Suggestion.php7yKAh7/) Ϥ;vendor/symfony/console/Completion/CompletionSuggestions.php^yKAh^÷õlx¤5vendor/symfony/console/Completion/CompletionInput.php yKAh jüfO¤,vendor/symfony/console/Style/OutputStyle.phpµ yKAhµ Vy ¤-vendor/symfony/console/Style/SymfonyStyle.phpª;yKAhª;¼ &ˤ/vendor/symfony/console/Style/StyleInterface.phpœ yKAhœ .¿÷ޤ2vendor/symfony/console/Question/ChoiceQuestion.php1yKAh1ÃJY·¤,vendor/symfony/console/Question/Question.php>yKAh>ož[Õ¤8vendor/symfony/console/Question/ConfirmationQuestion.php,yKAh,%¤ vendor/symfony/console/README.mdÒyKAhÒÆ”f¤9vendor/symfony/console/Formatter/OutputFormatterStyle.phpï yKAhï yÊM¦¤Bvendor/symfony/console/Formatter/OutputFormatterStyleInterface.phpÊyKAhʃǡæ¤=vendor/symfony/console/Formatter/NullOutputFormatterStyle.phplyKAhlúÿ¤=vendor/symfony/console/Formatter/OutputFormatterInterface.php"yKAh"7V6_¤4vendor/symfony/console/Formatter/OutputFormatter.phpM yKAhM ã=bî¤8vendor/symfony/console/Formatter/NullOutputFormatter.php–yKAh–èB„[¤Fvendor/symfony/console/Formatter/WrappableOutputFormatterInterface.phpØyKAhØ*‘ý ¤>vendor/symfony/console/Formatter/OutputFormatterStyleStack.php? yKAh? :;ä¤6vendor/symfony/console/Messenger/RunCommandMessage.php°yKAh° M²¤6vendor/symfony/console/Messenger/RunCommandContext.phpyKAh!âBž¤=vendor/symfony/console/Messenger/RunCommandMessageHandler.php€yKAh€yz•o¤ vendor/symfony/console/Color.php(yKAh(âî-¤8vendor/symfony/console/SignalRegistry/SignalRegistry.phpyKAhG,eͤ3vendor/symfony/console/SignalRegistry/SignalMap.php­yKAh­N+QѤ3vendor/symfony/console/SingleCommandApplication.php>yKAh>·O­A¤?vendor/symfony/console/CommandLoader/CommandLoaderInterface.phpVyKAhVX®ù2¤?vendor/symfony/console/CommandLoader/ContainerCommandLoader.php yKAh ¼ŽÆ’¤=vendor/symfony/console/CommandLoader/FactoryCommandLoader.phpKyKAhK€š<¤4vendor/symfony/console/Descriptor/TextDescriptor.phpž0yKAhž0f —ü¤<vendor/symfony/console/Descriptor/ApplicationDescription.php(yKAh(#Ë1¤3vendor/symfony/console/Descriptor/XmlDescriptor.phpŽ&yKAhŽ&,èEb¤9vendor/symfony/console/Descriptor/DescriptorInterface.phpmyKAhmðB¤0vendor/symfony/console/Descriptor/Descriptor.phpÙ yKAhÙ Ôø j¤@vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php')yKAh')Ǿƒ4¤4vendor/symfony/console/Descriptor/JsonDescriptor.php%yKAh%× Ö¤8vendor/symfony/console/Descriptor/MarkdownDescriptor.php¡yKAh¡4QŠj¤/vendor/symfony/console/Tester/CommandTester.phpL yKAhL 5Ykؤ-vendor/symfony/console/Tester/TesterTrait.phpryKAhrƒèƤ3vendor/symfony/console/Tester/ApplicationTester.php˜ yKAh˜ óûZ3¤9vendor/symfony/console/Tester/CommandCompletionTester.phpDyKAhDTùÏî¤@vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php+yKAh+‡1¶¤3vendor/symfony/console/Command/TraceableCommand.php](yKAh](Ç ã¤.vendor/symfony/console/Command/LazyCommand.php¹yKAh¹Îoíͤ0vendor/symfony/console/Command/LockableTrait.php3yKAh3ù¼ä¤.vendor/symfony/console/Command/HelpCommand.php£ yKAh£ 6_3¤2vendor/symfony/console/Command/CompleteCommand.php©#yKAh©#sJ!Œ¤.vendor/symfony/console/Command/ListCommand.phpª yKAhª e\Û{¤8vendor/symfony/console/Command/DumpCompletionCommand.phpÃyKAhÃ+CQ¤=vendor/symfony/console/Command/SignalableCommandInterface.phpEyKAhEbO¤*vendor/symfony/console/Command/Command.php!ZyKAh!Za 啤,vendor/symfony/console/Helper/TableStyle.php!1yKAh!1÷'p,¤+vendor/symfony/console/Helper/TableRows.php[yKAh[{m­Ö¤7vendor/symfony/console/Helper/SymfonyQuestionHelper.php) yKAh) ¯†7N¤1vendor/symfony/console/Helper/HelperInterface.phpVyKAhVÌŠ™¤+vendor/symfony/console/Helper/TableCell.phpÞyKAhÞe9S¤/vendor/symfony/console/Helper/ProcessHelper.phpÖyKAhÖeàý®¤0vendor/symfony/console/Helper/TableSeparator.php!yKAh!nÑ2¤/vendor/symfony/console/Helper/OutputWrapper.phpâ yKAhâ lüÆØ¤1vendor/symfony/console/Helper/FormatterHelper.phpßyKAhßÎ0†É¤0vendor/symfony/console/Helper/TableCellStyle.php)yKAh)ÅKÓ˜¤-vendor/symfony/console/Helper/ProgressBar.phpKNyKAhKNF@{¤6vendor/symfony/console/Helper/DebugFormatterHelper.php yKAh —ý«&¤+vendor/symfony/console/Helper/HelperSet.phpcyKAhcšVÁ.¤(vendor/symfony/console/Helper/Dumper.phpzyKAhz›ú`¤2vendor/symfony/console/Helper/InputAwareHelper.phpyKAhÜpc¤0vendor/symfony/console/Helper/QuestionHelper.phpXLyKAhXLʱbܤ(vendor/symfony/console/Helper/Helper.php‘yKAh‘+Ñu¡¤'vendor/symfony/console/Helper/Table.php6{yKAh6{ÅDÅe¤3vendor/symfony/console/Helper/ProgressIndicator.phpýyKAhý‡bN&¤2vendor/symfony/console/Helper/DescriptorHelper.phpd yKAhd ýžœ¤Dvendor/symfony/console/DependencyInjection/AddConsoleCommandPass.phpÔyKAhÔé4ê¤3vendor/symfony/console/Exception/LogicException.php¸yKAh¸í€5¤;vendor/symfony/console/Exception/InvalidOptionException.phpyKAh‰%:¦¤>vendor/symfony/console/Exception/RunCommandFailedException.php>yKAh>†~ˆü¤7vendor/symfony/console/Exception/ExceptionInterface.php·yKAh·oOÁȤ5vendor/symfony/console/Exception/RuntimeException.php¼yKAh¼ìŠ ‘¤?vendor/symfony/console/Exception/NamespaceNotFoundException.phpèyKAhèµxêD¤=vendor/symfony/console/Exception/InvalidArgumentException.phpÌyKAhÌx¤ Τ:vendor/symfony/console/Exception/MissingInputException.phpüyKAhüâÅÚL¤=vendor/symfony/console/Exception/CommandNotFoundException.phpÙyKAhÙ͆èŤ6vendor/symfony/console/Event/ConsoleTerminateEvent.phpìyKAhì[5Ť2vendor/symfony/console/Event/ConsoleErrorEvent.phpÿyKAhÿzƤ4vendor/symfony/console/Event/ConsoleCommandEvent.php>yKAh>Ÿ¡øy¤-vendor/symfony/console/Event/ConsoleEvent.php—yKAh—8÷(M¤3vendor/symfony/console/Event/ConsoleSignalEvent.phpÕyKAhÕ=|Ñ®¤$vendor/symfony/console/composer.jsonHyKAhH¯å+¤+vendor/symfony/console/Debug/CliRequest.phpqyKAhqÐekX¤6vendor/symfony/console/EventListener/ErrorListener.php yKAh hüõ ¤0vendor/symfony/polyfill-mbstring/bootstrap80.php'yKAh' ~Ý ¤(vendor/symfony/polyfill-mbstring/LICENSE,yKAh,„•H¤Bvendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php­yKAh­]SCæ¤@vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.phpUyKAhUD׎¤Fvendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.phpyKAhoÁቤ@vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.phpO[yKAhO[¾(Á¤-vendor/symfony/polyfill-mbstring/Mbstring.php³‹yKAh³‹º†ò¤.vendor/symfony/polyfill-mbstring/bootstrap.php!yKAh!ÌîÎd¤*vendor/symfony/polyfill-mbstring/README.mdryKAhr¾A`¤.vendor/symfony/polyfill-mbstring/composer.jsonRyKAhR€`P ¤5vendor/symfony/polyfill-intl-grapheme/bootstrap80.phpg yKAhg ™¾E{¤-vendor/symfony/polyfill-intl-grapheme/LICENSE,yKAh,„•H¤2vendor/symfony/polyfill-intl-grapheme/Grapheme.php &yKAh &ä8¤3vendor/symfony/polyfill-intl-grapheme/bootstrap.phpåyKAhåúâ¤/vendor/symfony/polyfill-intl-grapheme/README.mdKyKAhKC§>¤3vendor/symfony/polyfill-intl-grapheme/composer.json yKAh +¬¤ vendor/ramsey/collection/LICENSE7yKAh7ŸԤ"vendor/ramsey/collection/README.md yKAh 3 Ó¤¤&vendor/ramsey/collection/composer.json|yKAh|vÂÖ¤$vendor/ramsey/collection/SECURITY.mdyKAhбû¤1vendor/ramsey/collection/src/DoubleEndedQueue.phpŒyKAhŒû¤Öe¤,vendor/ramsey/collection/src/AbstractSet.php¥yKAh¥<’!¤/vendor/ramsey/collection/src/QueueInterface.phpúyKAhú¢*í¤3vendor/ramsey/collection/src/AbstractCollection.phpa+yKAha+Ðd‡?¤.vendor/ramsey/collection/src/AbstractArray.phpyKAhØzP¤&vendor/ramsey/collection/src/Queue.php3yKAh3èåD¤$vendor/ramsey/collection/src/Set.php0yKAh0H€¤:vendor/ramsey/collection/src/DoubleEndedQueueInterface.php–(yKAh–(Í6'&¤6vendor/ramsey/collection/src/Map/TypedMapInterface.php2yKAh2zí¤5vendor/ramsey/collection/src/Map/AbstractTypedMap.phpcyKAhccÑÿͤ1vendor/ramsey/collection/src/Map/MapInterface.phpàyKAhàŠOAõ¤-vendor/ramsey/collection/src/Map/TypedMap.phpë yKAhë >)°¤8vendor/ramsey/collection/src/Map/AssociativeArrayMap.php0yKAh0Pº…Ǥ6vendor/ramsey/collection/src/Map/NamedParameterMap.php yKAh `@Qá¤0vendor/ramsey/collection/src/Map/AbstractMap.php¬yKAh¬Iý?é¤-vendor/ramsey/collection/src/GenericArray.phpyKAhÈÿŸ“¤/vendor/ramsey/collection/src/ArrayInterface.php'yKAh'5a¤%vendor/ramsey/collection/src/Sort.php{yKAh{Œì¡È¤+vendor/ramsey/collection/src/Collection.php yKAh ô0Æ ¤4vendor/ramsey/collection/src/CollectionInterface.php$yKAh$œÅ±Ê¤Hvendor/ramsey/collection/src/Exception/UnsupportedOperationException.phpLyKAhLf³f¤?vendor/ramsey/collection/src/Exception/OutOfBoundsException.phpwyKAhw¯´ˆ¤>vendor/ramsey/collection/src/Exception/CollectionException.phpÌyKAhÌÄ´@‹¤Cvendor/ramsey/collection/src/Exception/InvalidArgumentException.phpsyKAhsòÊÚ¤Avendor/ramsey/collection/src/Exception/NoSuchElementException.phpDyKAhD LŽn¤Bvendor/ramsey/collection/src/Exception/InvalidPropertyOrMethod.php¨yKAh¨ ú…¤Fvendor/ramsey/collection/src/Exception/CollectionMismatchException.phpMyKAhM\õć¤8vendor/ramsey/collection/src/Tool/ValueToStringTrait.php yKAh ë;ã5¤/vendor/ramsey/collection/src/Tool/TypeTrait.phpDyKAhDçŸe¤9vendor/ramsey/collection/src/Tool/ValueExtractorTrait.phpÌ yKAhÌ q ¶¤vendor/ramsey/uuid/LICENSE7yKAh7Þ<ö[¤vendor/ramsey/uuid/README.md.yKAh.œ™ç¤ vendor/ramsey/uuid/composer.jsonyKAh}²¶¤$vendor/ramsey/uuid/src/functions.phpgyKAhgƒM9¤5vendor/ramsey/uuid/src/Validator/GenericValidator.php³yKAh³* =¤7vendor/ramsey/uuid/src/Validator/ValidatorInterface.phpÖyKAhÖ5%Ф>vendor/ramsey/uuid/src/Converter/Time/GenericTimeConverter.phpk yKAhk ¥QÃ+¤;vendor/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php‹ yKAh‹ îgV‚¤:vendor/ramsey/uuid/src/Converter/Time/PhpTimeConverter.phpryKAhr­t³¤?vendor/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.phpvyKAhv ÿפ@vendor/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.phpuyKAhuϪ24¤Cvendor/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php}yKAh}Y{ßø¤>vendor/ramsey/uuid/src/Converter/Number/BigNumberConverter.phpÅyKAhŪ9ޤBvendor/ramsey/uuid/src/Converter/Number/GenericNumberConverter.phpËyKAhËqôH¤;vendor/ramsey/uuid/src/Converter/TimeConverterInterface.phpÝyKAh݈ÍJ¤¤=vendor/ramsey/uuid/src/Converter/NumberConverterInterface.php±yKAh±kLŒ¤5vendor/ramsey/uuid/src/DeprecatedUuidMethodsTrait.phpž3yKAhž3hû†€¤8vendor/ramsey/uuid/src/Codec/TimestampFirstCombCodec.phpù yKAhù ÔÑ”d¤1vendor/ramsey/uuid/src/Codec/OrderedTimeCodec.php yKAh IÈÿ¤/vendor/ramsey/uuid/src/Codec/CodecInterface.php¡yKAh¡ñ§¤0vendor/ramsey/uuid/src/Codec/GuidStringCodec.phpôyKAhô3YÆe¤,vendor/ramsey/uuid/src/Codec/StringCodec.phpà yKAhà 9æÔí¤7vendor/ramsey/uuid/src/Codec/TimestampLastCombCodec.phpyKAhÝeÆ8¤vendor/ramsey/uuid/src/Uuid.phpzZyKAhzZó×§<¤@vendor/ramsey/uuid/src/Provider/DceSecurityProviderInterface.phpyKAhjfµ¤Avendor/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php0yKAh0»M_=¤9vendor/ramsey/uuid/src/Provider/NodeProviderInterface.php©yKAh© ª"ƒ¤;vendor/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php yKAh âña¤:vendor/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php¶yKAh¶„eˤ9vendor/ramsey/uuid/src/Provider/TimeProviderInterface.phpSyKAhSm+ˆ¤;vendor/ramsey/uuid/src/Provider/Node/RandomNodeProvider.phpoyKAhoƒL¼_¤=vendor/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.phpwyKAhw¸©“¤;vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.phpÂyKAhÂré犤?vendor/ramsey/uuid/src/Provider/Node/NodeProviderCollection.phpEyKAhEøŽ7¤;vendor/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php4yKAh4²]q¤%vendor/ramsey/uuid/src/FeatureSet.php2yKAh2rI|Ф2vendor/ramsey/uuid/src/Rfc4122/FieldsInterface.phpØyKAhØBè^´¤)vendor/ramsey/uuid/src/Rfc4122/UuidV8.php yKAh ‡R–E¤,vendor/ramsey/uuid/src/Rfc4122/Validator.phpåyKAhå^l[…¤+vendor/ramsey/uuid/src/Rfc4122/MaxTrait.php/yKAh/t ¤/vendor/ramsey/uuid/src/Rfc4122/VersionTrait.php“yKAh“Þ¥ðd¤+vendor/ramsey/uuid/src/Rfc4122/NilTrait.php/yKAh/\væe¤)vendor/ramsey/uuid/src/Rfc4122/Fields.phpûyKAhûÂ݀ͤ*vendor/ramsey/uuid/src/Rfc4122/NilUuid.php yKAh ë¹ ¤*vendor/ramsey/uuid/src/Rfc4122/MaxUuid.php¡yKAh¡ào†Þ¤0vendor/ramsey/uuid/src/Rfc4122/UuidInterface.phpŸyKAhŸŸ:J}¤,vendor/ramsey/uuid/src/Rfc4122/TimeTrait.phpAyKAhAP€*¤/vendor/ramsey/uuid/src/Rfc4122/VariantTrait.php! yKAh! ŠÛ˜¤.vendor/ramsey/uuid/src/Rfc4122/UuidBuilder.php1yKAh1ÊžĤ)vendor/ramsey/uuid/src/Rfc4122/UuidV1.phpyKAh)]Êߤ)vendor/ramsey/uuid/src/Rfc4122/UuidV3.php>yKAh>Hì™<¤)vendor/ramsey/uuid/src/Rfc4122/UuidV2.phpyKAh…•O¶¤)vendor/ramsey/uuid/src/Rfc4122/UuidV6.phpyKAhe`‚¤)vendor/ramsey/uuid/src/Rfc4122/UuidV7.phpyKAhágE¤)vendor/ramsey/uuid/src/Rfc4122/UuidV5.phpCyKAhCXüç¤)vendor/ramsey/uuid/src/Rfc4122/UuidV4.phpÓyKAhÓãâ̤(vendor/ramsey/uuid/src/UuidInterface.phpS yKAhS te<Ò¤,vendor/ramsey/uuid/src/Math/RoundingMode.php1yKAh1á{k3¤3vendor/ramsey/uuid/src/Math/CalculatorInterface.php‚yKAh‚E¾Ó)¤3vendor/ramsey/uuid/src/Math/BrickMathCalculator.php²yKAh² ’~¤/vendor/ramsey/uuid/src/UuidFactoryInterface.phpdyKAhdŠÿÚ¤9vendor/ramsey/uuid/src/Generator/RandomBytesGenerator.phpUyKAhUŸ7¤9vendor/ramsey/uuid/src/Generator/NameGeneratorFactory.phpÆyKAhÆÒzݤ6vendor/ramsey/uuid/src/Generator/UnixTimeGenerator.phpÄyKAhÄ´ãê=¤;vendor/ramsey/uuid/src/Generator/NameGeneratorInterface.php&yKAh&äRš¤;vendor/ramsey/uuid/src/Generator/RandomGeneratorFactory.phpÐyKAhÐ,Óq‚¤9vendor/ramsey/uuid/src/Generator/DceSecurityGenerator.php yKAh Pæ~f¤Bvendor/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.phpÁyKAhÁ8¹×ÿ¤9vendor/ramsey/uuid/src/Generator/TimeGeneratorFactory.phpxyKAhxÅ76i¤9vendor/ramsey/uuid/src/Generator/DefaultNameGenerator.php8yKAh8°G4o¤9vendor/ramsey/uuid/src/Generator/DefaultTimeGenerator.php¦yKAh¦YOï¤5vendor/ramsey/uuid/src/Generator/RandomLibAdapter.php7yKAh7°×ÑŽ¤;vendor/ramsey/uuid/src/Generator/TimeGeneratorInterface.php’yKAh’…CkO¤2vendor/ramsey/uuid/src/Generator/CombGenerator.phpZ yKAhZ ó©¤=vendor/ramsey/uuid/src/Generator/RandomGeneratorInterface.phpîyKAhîëIl¤<vendor/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php<yKAh<1Æß8¤:vendor/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php yKAh P\§Ì¤:vendor/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php{yKAh{ðæûÒ¤&vendor/ramsey/uuid/src/BinaryUtils.phpýyKAhýYß{¤&vendor/ramsey/uuid/src/UuidFactory.php0;yKAh0;3¯¶©¤'vendor/ramsey/uuid/src/Type/Integer.php#yKAh#“M ¯¤$vendor/ramsey/uuid/src/Type/Time.phpì yKAhì «€V¤+vendor/ramsey/uuid/src/Type/Hexadecimal.php› yKAh› Þ®~C¤/vendor/ramsey/uuid/src/Type/NumberInterface.php„yKAh„B—1¤-vendor/ramsey/uuid/src/Type/TypeInterface.phpyKAhwË<¤'vendor/ramsey/uuid/src/Type/Decimal.phpÕ yKAhÕ ’±¤$vendor/ramsey/uuid/src/Guid/Guid.php yKAh ›·M¤&vendor/ramsey/uuid/src/Guid/Fields.php yKAh 8mF›¤+vendor/ramsey/uuid/src/Guid/GuidBuilder.phpeyKAheõtÜˤ2vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php—5yKAh—5´©F¤'vendor/ramsey/uuid/src/DegradedUuid.php[yKAh[ƒá?^¤1vendor/ramsey/uuid/src/Fields/FieldsInterface.phpëyKAhë)=¤9vendor/ramsey/uuid/src/Fields/SerializableFieldsTrait.phpzyKAhzPÕ ¤2vendor/ramsey/uuid/src/DeprecatedUuidInterface.phpªyKAhªŠ>Ϥ6vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.phpJyKAhJ#âYà¤7vendor/ramsey/uuid/src/Builder/UuidBuilderInterface.phpyKAh J¯B¤4vendor/ramsey/uuid/src/Builder/BuilderCollection.phpš yKAhš ö=¤2vendor/ramsey/uuid/src/Builder/FallbackBuilder.php[yKAh[(€=¨¤5vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.phpUyKAhU"‘¤:vendor/ramsey/uuid/src/Exception/RandomSourceException.phpÿyKAhÿ•ëä¤2vendor/ramsey/uuid/src/Exception/NodeException.php`yKAh`]”“¤6vendor/ramsey/uuid/src/Exception/DateTimeException.phpayKAhaŽ·ý\¤8vendor/ramsey/uuid/src/Exception/TimeSourceException.phpQyKAhQ¦·¤Bvendor/ramsey/uuid/src/Exception/UnsupportedOperationException.phpVyKAhVJµ—N¤:vendor/ramsey/uuid/src/Exception/InvalidBytesException.php_yKAh_ô/Ù¤9vendor/ramsey/uuid/src/Exception/DceSecurityException.phpmyKAhmIýC¤2vendor/ramsey/uuid/src/Exception/NameException.phpcyKAhcsOS¤=vendor/ramsey/uuid/src/Exception/InvalidArgumentException.phpiyKAhiv'ä=vendor/ramsey/uuid/src/Exception/BuilderNotFoundException.phpQyKAhQ@þc¤?vendor/ramsey/uuid/src/Exception/UnableToBuildUuidException.phpOyKAhORo»¤;vendor/ramsey/uuid/src/Exception/UuidExceptionInterface.phpÃyKAhÃîK;Ò¤?vendor/ramsey/uuid/src/Exception/InvalidUuidStringException.phpÅyKAhÅ<é1i¤-vendor/ramsey/uuid/src/Nonstandard/Fields.php2 yKAh2 ÜŽó¤+vendor/ramsey/uuid/src/Nonstandard/Uuid.phpðyKAhð$R¤2vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.phpŽyKAhŽw, ¤-vendor/ramsey/uuid/src/Nonstandard/UuidV6.php£ yKAh£ !b¤vendor/webmozart/assert/LICENSE<yKAh<tØ}õ¤$vendor/webmozart/assert/CHANGELOG.md“yKAh“°“³Š¤!vendor/webmozart/assert/README.mdÎ>yKAhÎ>|ßÊϤ%vendor/webmozart/assert/composer.jsonóyKAhó–3‘p¤%vendor/webmozart/assert/src/Mixin.php5ÕyKAh5Õ9ò(­¤8vendor/webmozart/assert/src/InvalidArgumentException.phpiyKAhi{Lä&vendor/webmozart/assert/src/Assert.phpºÉyKAhºÉ=¬¤vendor/react/promise/LICENSEgyKAhgŸFâ¤!vendor/react/promise/CHANGELOG.md9yKAh9O³T:¤vendor/react/promise/README.mdQYyKAhQY1 ¤"vendor/react/promise/composer.jsonyKAhNÅjB¤-vendor/react/promise/src/PromiseInterface.php¥yKAh¥MFx8¤&vendor/react/promise/src/functions.php1-yKAh1-…t¤.vendor/react/promise/src/functions_include.php€yKAh€dxñ\¤$vendor/react/promise/src/Promise.phpÀ(yKAhÀ(sæ;6¤%vendor/react/promise/src/Deferred.php0yKAh0”Õ¤5vendor/react/promise/src/Internal/RejectedPromise.php  yKAh  å¸|¤6vendor/react/promise/src/Internal/FulfilledPromise.php3 yKAh3 *òÙô¤7vendor/react/promise/src/Internal/CancellationQueue.phpyKAhÎrÒ2¤6vendor/react/promise/src/Exception/LengthException.php^yKAh^?q¤9vendor/react/promise/src/Exception/CompositeException.phpayKAha§†…'¤vendor/sebastian/diff/LICENSEûyKAhûƒÜ¡7¤"vendor/sebastian/diff/ChangeLog.mdyKAhæ‚ÐA¤vendor/sebastian/diff/README.mdx yKAhx ì­Z¤#vendor/sebastian/diff/composer.jsonñyKAhñHùï¤!vendor/sebastian/diff/SECURITY.mduyKAhuKJ¦¤"vendor/sebastian/diff/src/Diff.php^yKAh^D1“Ѥ$vendor/sebastian/diff/src/Parser.php÷ yKAh÷ ßõÕ©¤Mvendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php5 yKAh5 0OÔ¤:vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php‡yKAh‡©µðÿ¤?vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.phpyKAh­›¤=vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.phpÞyKAhÞ™ªŸ¤Cvendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.phpm(yKAhm(ÐËŒ¤?vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.phpýyKAhýJ÷5|¤@vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.phpøyKAhø!J9„¤#vendor/sebastian/diff/src/Chunk.php³ yKAh³ †¥÷8¤$vendor/sebastian/diff/src/Differ.phpyKAhÆÔ•L¤"vendor/sebastian/diff/src/Line.phpyKAh˜Ï>º¤>vendor/sebastian/diff/src/Exception/ConfigurationException.php)yKAh)2ܤ@vendor/sebastian/diff/src/Exception/InvalidArgumentException.php’yKAh’+U/ܤ1vendor/sebastian/diff/src/Exception/Exception.phpqyKAhq¢äZ¤Ovendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php+ yKAh+ ÜÉÙ¤3vendor/terminal42/composer-lock-validator/README.mdöyKAhö z·ð¤7vendor/terminal42/composer-lock-validator/composer.json#yKAh#ÑBˆ¤;vendor/terminal42/composer-lock-validator/src/Validator.php¼yKAh¼à,å¤Evendor/terminal42/composer-lock-validator/src/ValidationException.php²yKAh²Ið<¤ array ( 'type' => 'php', 'condition' => '^8.1', 'message' => 'The application requires the version "^8.1" or greater.', 'helpMessage' => 'The application requires the version "^8.1" or greater.', ), 1 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The application requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "json".', ), 2 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The package "ramsey/uuid" requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The package "ramsey/uuid" requires the extension "json".', ), 3 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The package "web-auth/cose-lib" requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The package "web-auth/cose-lib" requires the extension "json".', ), 4 => array ( 'type' => 'extension', 'condition' => 'json', 'message' => 'The package "web-auth/webauthn-lib" requires the extension "json". Enable it or install a polyfill.', 'helpMessage' => 'The package "web-auth/webauthn-lib" requires the extension "json".', ), 5 => array ( 'type' => 'extension', 'condition' => 'session', 'message' => 'The application requires the extension "session". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "session".', ), 6 => array ( 'type' => 'extension', 'condition' => 'zip', 'message' => 'The application requires the extension "zip". Enable it or install a polyfill.', 'helpMessage' => 'The application requires the extension "zip".', ), 7 => array ( 'type' => 'extension', 'condition' => 'openssl', 'message' => 'The package "composer/ca-bundle" requires the extension "openssl". Enable it or install a polyfill.', 'helpMessage' => 'The package "composer/ca-bundle" requires the extension "openssl".', ), 8 => array ( 'type' => 'extension', 'condition' => 'openssl', 'message' => 'The package "web-auth/cose-lib" requires the extension "openssl". Enable it or install a polyfill.', 'helpMessage' => 'The package "web-auth/cose-lib" requires the extension "openssl".', ), 9 => array ( 'type' => 'extension', 'condition' => 'openssl', 'message' => 'The package "web-auth/webauthn-lib" requires the extension "openssl". Enable it or install a polyfill.', 'helpMessage' => 'The package "web-auth/webauthn-lib" requires the extension "openssl".', ), 10 => array ( 'type' => 'extension', 'condition' => 'pcre', 'message' => 'The package "composer/ca-bundle" requires the extension "pcre". Enable it or install a polyfill.', 'helpMessage' => 'The package "composer/ca-bundle" requires the extension "pcre".', ), 11 => array ( 'type' => 'extension', 'condition' => 'filter', 'message' => 'The package "phpdocumentor/reflection-docblock" requires the extension "filter". Enable it or install a polyfill.', 'helpMessage' => 'The package "phpdocumentor/reflection-docblock" requires the extension "filter".', ), 12 => array ( 'type' => 'extension', 'condition' => 'xml', 'message' => 'The package "symfony/framework-bundle" requires the extension "xml". Enable it or install a polyfill.', 'helpMessage' => 'The package "symfony/framework-bundle" requires the extension "xml".', ), 13 => array ( 'type' => 'extension', 'condition' => 'xml', 'message' => 'The package "symfony/security-bundle" requires the extension "xml". Enable it or install a polyfill.', 'helpMessage' => 'The package "symfony/security-bundle" requires the extension "xml".', ), 14 => array ( 'type' => 'extension', 'condition' => 'iconv', 'message' => 'The package "symfony/polyfill-mbstring" requires the extension "iconv". Enable it or install a polyfill.', 'helpMessage' => 'The package "symfony/polyfill-mbstring" requires the extension "iconv".', ), ); * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var ?string */ private $vendorDir; // PSR-4 /** * @var array[] * @psalm-var array> */ private $prefixLengthsPsr4 = array(); /** * @var array[] * @psalm-var array> */ private $prefixDirsPsr4 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * @var array[] * @psalm-var array> */ private $prefixesPsr0 = array(); /** * @var array[] * @psalm-var array */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var string[] * @psalm-var array */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var bool[] * @psalm-var array */ private $missingClasses = array(); /** @var ?string */ private $apcuPrefix; /** * @var self[] */ private static $registeredLoaders = array(); /** * @param ?string $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } /** * @return string[] */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array[] * @psalm-return array> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return array[] * @psalm-return array */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return array[] * @psalm-return array */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return string[] Array of classname => path * @psalm-return array */ public function getClassMap() { return $this->classMap; } /** * @param string[] $classMap Class to filename map * @psalm-param array $classMap * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void * @private */ function includeFile($file) { include $file; } array($baseDir . '/src'), 'HumbugBox3150\\Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), ); $vendorDir . '/composer/InstalledVersions.php', 'HumbugBox3150\\Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', 'HumbugBox3150\\Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', 'HumbugBox3150\\Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', 'HumbugBox3150\\Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', 'HumbugBox3150\\Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', 'HumbugBox3150\\Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Checker' => $baseDir . '/src/Checker.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IO' => $baseDir . '/src/IO.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IsExtensionFulfilled' => $baseDir . '/src/IsExtensionFulfilled.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IsFulfilled' => $baseDir . '/src/IsFulfilled.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IsPhpVersionFulfilled' => $baseDir . '/src/IsPhpVersionFulfilled.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Printer' => $baseDir . '/src/Printer.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Requirement' => $baseDir . '/src/Requirement.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\RequirementCollection' => $baseDir . '/src/RequirementCollection.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Terminal' => $baseDir . '/src/Terminal.php', ); array ( 'HumbugBox3150\\KevinGH\\RequirementChecker\\' => 41, 'HumbugBox3150\\Composer\\Semver\\' => 30, ), ); public static $prefixDirsPsr4 = array ( 'HumbugBox3150\\KevinGH\\RequirementChecker\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), 'HumbugBox3150\\Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'HumbugBox3150\\Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', 'HumbugBox3150\\Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', 'HumbugBox3150\\Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', 'HumbugBox3150\\Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', 'HumbugBox3150\\Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', 'HumbugBox3150\\Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', 'HumbugBox3150\\Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Checker' => __DIR__ . '/../..' . '/src/Checker.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IO' => __DIR__ . '/../..' . '/src/IO.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IsExtensionFulfilled' => __DIR__ . '/../..' . '/src/IsExtensionFulfilled.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IsFulfilled' => __DIR__ . '/../..' . '/src/IsFulfilled.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\IsPhpVersionFulfilled' => __DIR__ . '/../..' . '/src/IsPhpVersionFulfilled.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Printer' => __DIR__ . '/../..' . '/src/Printer.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Requirement' => __DIR__ . '/../..' . '/src/Requirement.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\RequirementCollection' => __DIR__ . '/../..' . '/src/RequirementCollection.php', 'HumbugBox3150\\KevinGH\\RequirementChecker\\Terminal' => __DIR__ . '/../..' . '/src/Terminal.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit7b1918d23e69dc64db20ca1f98396893::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit7b1918d23e69dc64db20ca1f98396893::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit7b1918d23e69dc64db20ca1f98396893::$classMap; }, null, ClassLoader::class); } } = 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit7b1918d23e69dc64db20ca1f98396893::getInitializer($loader)); } else { $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->setClassMapAuthoritative(true); $loader->register(true); return $loader; } } ', $version2); } public static function greaterThanOrEqualTo($version1, $version2) { return self::compare($version1, '>=', $version2); } public static function lessThan($version1, $version2) { return self::compare($version1, '<', $version2); } public static function lessThanOrEqualTo($version1, $version2) { return self::compare($version1, '<=', $version2); } public static function equalTo($version1, $version2) { return self::compare($version1, '==', $version2); } public static function notEqualTo($version1, $version2) { return self::compare($version1, '!=', $version2); } public static function compare($version1, $operator, $version2) { $constraint = new Constraint($operator, $version2); return $constraint->matchSpecific(new Constraint('==', $version1), \true); } } normalize($version)); $parsedConstraints = $versionParser->parseConstraints($constraints); return $parsedConstraints->matches($provider); } public static function satisfiedBy(array $versions, $constraints) { $versions = \array_filter($versions, function ($version) use($constraints) { return Semver::satisfies($version, $constraints); }); return \array_values($versions); } public static function sort(array $versions) { return self::usort($versions, self::SORT_ASC); } public static function rsort(array $versions) { return self::usort($versions, self::SORT_DESC); } private static function usort(array $versions, $direction) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $normalized = array(); foreach ($versions as $key => $version) { $normalizedVersion = $versionParser->normalize($version); $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); $normalized[] = array($normalizedVersion, $key); } \usort($normalized, function (array $left, array $right) use($direction) { if ($left[0] === $right[0]) { return 0; } if (Comparator::lessThan($left[0], $right[0])) { return -$direction; } return $direction; }); $sorted = array(); foreach ($normalized as $item) { $sorted[] = $versions[$item[1]]; } return $sorted; } } expandStability($matches[$index]) . (!empty($matches[$index + 1]) ? \ltrim($matches[$index + 1], '.-') : ''); } if (!empty($matches[$index + 2])) { $version .= '-dev'; } return $version; } if (\preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { try { $normalized = $this->normalizeBranch($match[1]); if (\strpos($normalized, 'dev-') === \false) { return $normalized; } } catch (\Exception $e) { } } $extraMessage = ''; if (\preg_match('{ +as +' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))?$}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; } elseif (\preg_match('{^' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))? +as +}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; } throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); } public function parseNumericAliasPrefix($branch) { if (\preg_match('{^(?P(\\d++\\.)*\\d++)(?:\\.x)?-dev$}i', $branch, $matches)) { return $matches['version'] . '.'; } return \false; } public function normalizeBranch($name) { $name = \trim($name); if (\preg_match('{^v?(\\d++)(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?$}i', $name, $matches)) { $version = ''; for ($i = 1; $i < 5; ++$i) { $version .= isset($matches[$i]) ? \str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; } return \str_replace('x', '9999999', $version) . '-dev'; } return 'dev-' . $name; } public function normalizeDefaultBranch($name) { if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { return '9999999-dev'; } return $name; } public function parseConstraints($constraints) { $prettyConstraint = $constraints; $orConstraints = \preg_split('{\\s*\\|\\|?\\s*}', \trim($constraints)); $orGroups = array(); foreach ($orConstraints as $constraints) { $andConstraints = \preg_split('{(?< ,]) *(? 1) { $constraintObjects = array(); foreach ($andConstraints as $constraint) { foreach ($this->parseConstraint($constraint) as $parsedConstraint) { $constraintObjects[] = $parsedConstraint; } } } else { $constraintObjects = $this->parseConstraint($andConstraints[0]); } if (1 === \count($constraintObjects)) { $constraint = $constraintObjects[0]; } else { $constraint = new MultiConstraint($constraintObjects); } $orGroups[] = $constraint; } $constraint = MultiConstraint::create($orGroups, \false); $constraint->setPrettyString($prettyConstraint); return $constraint; } private function parseConstraint($constraint) { if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $constraint, $match)) { $constraint = $match[1]; } if (\preg_match('{^([^,\\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { $constraint = '' !== $match[1] ? $match[1] : '*'; if ($match[2] !== 'stable') { $stabilityModifier = $match[2]; } } if (\preg_match('{^(dev-[^,\\s@]+?|[^,\\s@]+?\\.x-dev)#.+$}i', $constraint, $match)) { $constraint = $match[1]; } if (\preg_match('{^(v)?[xX*](\\.[xX*])*$}i', $constraint, $match)) { if (!empty($match[1]) || !empty($match[2])) { return array(new Constraint('>=', '0.0.0.0-dev')); } return array(new MatchAllConstraint()); } $versionRegex = 'v?(\\d++)(?:\\.(\\d++|[xX*]))?(?:\\.(\\d++|[xX*]))?(?:\\.(\\d++|[xX*]))?' . self::$modifierRegex . '(?:\\+[^\\s]+)?'; if (\preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { if (\strpos($constraint, '~>') === 0) { throw new \UnexpectedValueException('Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator'); } if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { $position = 4; } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } for ($i = $position; $i >= 0; $i--) { if ($matches[$i] === 'x' || $matches[$i] === 'X' || $matches[$i] === '*') { $matches[$i] = '9999999'; } } $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); $highPosition = \max(1, $position - 1); $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } if (\preg_match('{^\\^' . $versionRegex . '($)}i', $constraint, $matches)) { if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { $position = 1; } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { $position = 2; } else { $position = 3; } if ($position === 2 && ($matches[2] === 'x' || $matches[2] === 'X' || $matches[2] === '*')) { $position = 1; } $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } if (\preg_match('{^v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.[xX*])++$}', $constraint, $matches)) { if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; if ($lowVersion === '0.0.0.0-dev') { return array(new Constraint('<', $highVersion)); } return array(new Constraint('>=', $lowVersion), new Constraint('<', $highVersion)); } if (\preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { $lowStabilitySuffix = ''; if (empty($matches[6]) && empty($matches[8])) { $lowStabilitySuffix = '-dev'; } $lowVersion = $this->normalize($matches['from']); $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); $empty = function ($x) { return $x === 0 || $x === '0' ? \false : empty($x); }; if (!$empty($matches[11]) && !$empty($matches[12]) || !empty($matches[14]) || !empty($matches[16])) { $highVersion = $this->normalize($matches['to']); $upperBound = new Constraint('<=', $highVersion); } else { $highMatch = array('', $matches[10], $matches[11], $matches[12], $matches[13]); $this->normalize($matches['to']); $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[11]) ? 1 : 2, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); } return array($lowerBound, $upperBound); } if (\preg_match('{^(<>|!=|>=?|<=?|==?)?\\s*(.*)}', $constraint, $matches)) { try { try { $version = $this->normalize($matches[2]); } catch (\UnexpectedValueException $e) { if (\substr($matches[2], -4) === '-dev') { $version = $this->normalize('dev-' . \substr($matches[2], 0, -4)); } else { throw $e; } } $op = $matches[1] ?: '='; if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { $version .= '-' . $stabilityModifier; } elseif ('<' === $op || '>=' === $op) { if (!\preg_match('/-' . self::$modifierRegex . '$/', \strtolower($matches[2]))) { if (\strpos($matches[2], 'dev-') !== 0) { $version .= '-dev'; } } } return array(new Constraint($matches[1] ?: '=', $version)); } catch (\Exception $e) { } } $message = 'Could not parse version constraint ' . $constraint; if (isset($e)) { $message .= ': ' . $e->getMessage(); } throw new \UnexpectedValueException($message); } private function manipulateVersionString($matches, $position, $increment = 0, $pad = '0') { for ($i = 4; $i > 0; --$i) { if ($i > $position) { $matches[$i] = $pad; } elseif ($i === $position && $increment) { $matches[$i] += $increment; if ($matches[$i] < 0) { $matches[$i] = $pad; --$position; if ($i === 1) { return null; } } } } return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; } private function expandStability($stability) { $stability = \strtolower($stability); switch ($stability) { case 'a': return 'alpha'; case 'b': return 'beta'; case 'p': case 'pl': return 'patch'; case 'rc': return 'RC'; default: return $stability; } } } constraints = $constraints; $this->conjunctive = $conjunctive; } public function getConstraints() { return $this->constraints; } public function isConjunctive() { return $this->conjunctive; } public function isDisjunctive() { return !$this->conjunctive; } public function compile($otherOperator) { $parts = array(); foreach ($this->constraints as $constraint) { $code = $constraint->compile($otherOperator); if ($code === 'true') { if (!$this->conjunctive) { return 'true'; } } elseif ($code === 'false') { if ($this->conjunctive) { return 'false'; } } else { $parts[] = '(' . $code . ')'; } } if (!$parts) { return $this->conjunctive ? 'true' : 'false'; } return $this->conjunctive ? \implode('&&', $parts) : \implode('||', $parts); } public function matches(ConstraintInterface $provider) { if (\false === $this->conjunctive) { foreach ($this->constraints as $constraint) { if ($provider->matches($constraint)) { return \true; } } return \false; } foreach ($this->constraints as $constraint) { if (!$provider->matches($constraint)) { return \false; } } return \true; } public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } public function __toString() { if ($this->string !== null) { return $this->string; } $constraints = array(); foreach ($this->constraints as $constraint) { $constraints[] = (string) $constraint; } return $this->string = '[' . \implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; } public function getLowerBound() { $this->extractBounds(); return $this->lowerBound; } public function getUpperBound() { $this->extractBounds(); return $this->upperBound; } public static function create(array $constraints, $conjunctive = \true) { if (0 === \count($constraints)) { return new MatchAllConstraint(); } if (1 === \count($constraints)) { return $constraints[0]; } $optimized = self::optimizeConstraints($constraints, $conjunctive); if ($optimized !== null) { list($constraints, $conjunctive) = $optimized; if (\count($constraints) === 1) { return $constraints[0]; } } return new self($constraints, $conjunctive); } private static function optimizeConstraints(array $constraints, $conjunctive) { if (!$conjunctive) { $left = $constraints[0]; $mergedConstraints = array(); $optimized = \false; for ($i = 1, $l = \count($constraints); $i < $l; $i++) { $right = $constraints[$i]; if ($left instanceof MultiConstraint && $left->conjunctive && $right instanceof MultiConstraint && $right->conjunctive && ($left0 = (string) $left->constraints[0]) && $left0[0] === '>' && $left0[1] === '=' && ($left1 = (string) $left->constraints[1]) && $left1[0] === '<' && ($right0 = (string) $right->constraints[0]) && $right0[0] === '>' && $right0[1] === '=' && ($right1 = (string) $right->constraints[1]) && $right1[0] === '<' && \substr($left1, 2) === \substr($right0, 3)) { $optimized = \true; $left = new MultiConstraint(\array_merge(array($left->constraints[0], $right->constraints[1]), \array_slice($left->constraints, 2), \array_slice($right->constraints, 2)), \true); } else { $mergedConstraints[] = $left; $left = $right; } } if ($optimized) { $mergedConstraints[] = $left; return array($mergedConstraints, \false); } } return null; } private function extractBounds() { if (null !== $this->lowerBound) { return; } foreach ($this->constraints as $constraint) { if (null === $this->lowerBound && null === $this->upperBound) { $this->lowerBound = $constraint->getLowerBound(); $this->upperBound = $constraint->getUpperBound(); continue; } if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { $this->lowerBound = $constraint->getLowerBound(); } if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { $this->upperBound = $constraint->getUpperBound(); } } } } self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE); /** @phpstan-var */ private static $transOpInt = array(self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!='); /** @phpstan-var */ protected $operator; protected $version; protected $prettyString; protected $lowerBound; protected $upperBound; public function __construct($operator, $version) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $this->operator = self::$transOpStr[$operator]; $this->version = $version; } public function getVersion() { return $this->version; } public function getOperator() { return self::$transOpInt[$this->operator]; } public function matches(ConstraintInterface $provider) { if ($provider instanceof self) { return $this->matchSpecific($provider); } return $provider->matches($this); } public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } public static function getSupportedOperators() { return \array_keys(self::$transOpStr); } /** @phpstan-return */ public static function getOperatorConstant($operator) { return self::$transOpStr[$operator]; } public function versionCompare($a, $b, $operator, $compareBranches = \false) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $aIsBranch = 'dev-' === \substr($a, 0, 4); $bIsBranch = 'dev-' === \substr($b, 0, 4); if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { return $a !== $b; } if ($aIsBranch && $bIsBranch) { return $operator === '==' && $a === $b; } if (!$compareBranches && ($aIsBranch || $bIsBranch)) { return \false; } return \version_compare($a, $b, $operator); } public function compile($otherOperator) { if ($this->version[0] === 'd' && 'dev-' === \substr($this->version, 0, 4)) { if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b && $v === %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } return 'false'; } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } return 'false'; } if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('\\version_compare($v, %s, \'==\')', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('$b || \\version_compare($v, %s, \'!=\')', \var_export($this->version, \true)); } return \sprintf('!$b && \\version_compare(%s, $v, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$otherOperator]); } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b || (!$b && \\version_compare($v, %s, \'!=\'))', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { return '!$b'; } } elseif (self::OP_GT === $this->operator || self::OP_GE === $this->operator) { if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { return '!$b'; } } if (self::OP_NE === $otherOperator) { return 'true'; } $codeComparison = \sprintf('\\version_compare($v, %s, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$this->operator]); if ($this->operator === self::OP_LE) { if ($otherOperator === self::OP_GT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } elseif ($this->operator === self::OP_GE) { if ($otherOperator === self::OP_LT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } return \sprintf('!$b && %s', $codeComparison); } public function matchSpecific(Constraint $provider, $compareBranches = \false) { $noEqualOp = \str_replace('=', '', self::$transOpInt[$this->operator]); $providerNoEqualOp = \str_replace('=', '', self::$transOpInt[$provider->operator]); $isEqualOp = self::OP_EQ === $this->operator; $isNonEqualOp = self::OP_NE === $this->operator; $isProviderEqualOp = self::OP_EQ === $provider->operator; $isProviderNonEqualOp = self::OP_NE === $provider->operator; if ($isNonEqualOp || $isProviderNonEqualOp) { if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && 'dev-' === \substr($provider->version, 0, 4)) { return \false; } if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && 'dev-' === \substr($this->version, 0, 4)) { return \false; } if (!$isEqualOp && !$isProviderEqualOp) { return \true; } return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); } if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { if ('dev-' === \substr($this->version, 0, 4) || 'dev-' === \substr($provider->version, 0, 4)) { return \false; } return \true; } $version1 = $isEqualOp ? $this->version : $provider->version; $version2 = $isEqualOp ? $provider->version : $this->version; $operator = $isEqualOp ? $provider->operator : $this->operator; if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp && \version_compare($provider->version, $this->version, '==')); } return \false; } public function __toString() { return self::$transOpInt[$this->operator] . ' ' . $this->version; } public function getLowerBound() { $this->extractBounds(); return $this->lowerBound; } public function getUpperBound() { $this->extractBounds(); return $this->upperBound; } private function extractBounds() { if (null !== $this->lowerBound) { return; } if (\strpos($this->version, 'dev-') === 0) { $this->lowerBound = Bound::zero(); $this->upperBound = Bound::positiveInfinity(); return; } switch ($this->operator) { case self::OP_EQ: $this->lowerBound = new Bound($this->version, \true); $this->upperBound = new Bound($this->version, \true); break; case self::OP_LT: $this->lowerBound = Bound::zero(); $this->upperBound = new Bound($this->version, \false); break; case self::OP_LE: $this->lowerBound = Bound::zero(); $this->upperBound = new Bound($this->version, \true); break; case self::OP_GT: $this->lowerBound = new Bound($this->version, \false); $this->upperBound = Bound::positiveInfinity(); break; case self::OP_GE: $this->lowerBound = new Bound($this->version, \true); $this->upperBound = Bound::positiveInfinity(); break; case self::OP_NE: $this->lowerBound = Bound::zero(); $this->upperBound = Bound::positiveInfinity(); break; } } } &1', $output, $exitcode); return self::$stty = 0 === $exitcode; } private static function initDimensions() { if ('\\' === \DIRECTORY_SEPARATOR) { if (\preg_match('/^(\\d+)x(\\d+)(?: \\((\\d+)x(\\d+)\\))?$/', \trim(\getenv('ANSICON')), $matches)) { self::$width = (int) $matches[1]; self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2]; } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) { self::initDimensionsUsingStty(); } elseif (null !== ($dimensions = self::getConsoleMode())) { self::$width = (int) $dimensions[0]; self::$height = (int) $dimensions[1]; } } else { self::initDimensionsUsingStty(); } } private static function hasVt100Support() { return \function_exists('sapi_windows_vt100_support') && \sapi_windows_vt100_support(\fopen('php://stdout', 'wb')); } private static function initDimensionsUsingStty() { if ($sttyString = self::getSttyColumns()) { if (\preg_match('/rows.(\\d+);.columns.(\\d+);/i', $sttyString, $matches)) { self::$width = (int) $matches[2]; self::$height = (int) $matches[1]; } elseif (\preg_match('/;.(\\d+).rows;.(\\d+).columns/i', $sttyString, $matches)) { self::$width = (int) $matches[2]; self::$height = (int) $matches[1]; } } } private static function getConsoleMode() { $info = self::readFromProcess('mode CON'); if (null === $info || !\preg_match('/--------+\\r?\\n.+?(\\d+)\\r?\\n.+?(\\d+)\\r?\\n/', $info, $matches)) { return null; } return array((int) $matches[2], (int) $matches[1]); } private static function getSttyColumns() { return self::readFromProcess('stty -a | grep columns'); } private static function readFromProcess($command) { if (!\function_exists('proc_open')) { return null; } $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')); $process = \proc_open($command, $descriptorspec, $pipes, null, null, array('suppress_errors' => \true)); if (!\is_resource($process)) { return null; } $info = \stream_get_contents($pipes[1]); \fclose($pipes[1]); \fclose($pipes[2]); \proc_close($process); return $info; } } options = \implode(' ', $_SERVER['argv']); $shellVerbosity = $this->configureVerbosity(); $this->interactive = $this->checkInteractivity($shellVerbosity); $this->colorSupport = $this->checkColorSupport(); } public function isInteractive() { return $this->interactive; } public function getVerbosity() { return $this->verbosity; } public function hasColorSupport() { return $this->colorSupport; } public function hasParameter($values) { $values = (array) $values; foreach ($values as $value) { $regexp = \sprintf('/\\s%s\\b/', \str_replace(' ', '\\s+', \preg_quote($value, '/'))); if (1 === \preg_match($regexp, $this->options)) { return \true; } } return \false; } private function checkInteractivity($shellVerbosity) { if (-1 === $shellVerbosity) { return \false; } if (\true === $this->hasParameter(array('--no-interaction', '-n'))) { return \false; } if (\function_exists('posix_isatty') && !@\posix_isatty(\STDOUT) && \false === \getenv('SHELL_INTERACTIVE')) { return \false; } return \true; } private function configureVerbosity() { switch ($shellVerbosity = (int) \getenv('SHELL_VERBOSITY')) { case -1: $this->verbosity = self::VERBOSITY_QUIET; break; case 1: $this->verbosity = self::VERBOSITY_VERBOSE; break; case 2: $this->verbosity = self::VERBOSITY_VERY_VERBOSE; break; case 3: $this->verbosity = self::VERBOSITY_DEBUG; break; default: $shellVerbosity = 0; break; } if ($this->hasParameter(array('--quiet', '-q'))) { $this->verbosity = self::VERBOSITY_QUIET; $shellVerbosity = -1; } elseif ($this->hasParameter(array('-vvv', '--verbose=3', '--verbose 3'))) { $this->verbosity = self::VERBOSITY_DEBUG; $shellVerbosity = 3; } elseif ($this->hasParameter(array('-vv', '--verbose=2', '--verbose 2'))) { $this->verbosity = self::VERBOSITY_VERY_VERBOSE; $shellVerbosity = 2; } elseif ($this->hasParameter(array('-v', '--verbose=1', '--verbose 1', '--verbose'))) { $this->verbosity = self::VERBOSITY_VERBOSE; $shellVerbosity = 1; } return $shellVerbosity; } private function checkColorSupport() { if ($this->hasParameter(array('--ansi'))) { return \true; } if ($this->hasParameter(array('--no-ansi'))) { return \false; } if (\DIRECTORY_SEPARATOR === '\\') { return \function_exists('sapi_windows_vt100_support') && \sapi_windows_vt100_support(\STDOUT) || \false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM'); } if (\function_exists('stream_isatty')) { return \stream_isatty(\STDOUT); } if (\function_exists('posix_isatty')) { return \posix_isatty(\STDOUT); } $stat = \fstat(\STDOUT); return $stat ? 020000 === ($stat['mode'] & 0170000) : \false; } } requiredExtension = $requiredExtension; } public function __invoke() { return \extension_loaded($this->requiredExtension); } } evaluateRequirements(); $io = new IO(); self::printCheck($checkPassed, new Printer($io->getVerbosity(), $io->hasColorSupport()), $requirements); return $checkPassed; } public static function printCheck($checkPassed, Printer $printer, RequirementCollection $requirements) { if (\false === $checkPassed && IO::VERBOSITY_VERY_VERBOSE > $printer->getVerbosity()) { $printer->setVerbosity(IO::VERBOSITY_VERY_VERBOSE); } $verbosity = IO::VERBOSITY_VERY_VERBOSE; $iniPath = $requirements->getPhpIniPath(); $printer->title('Box Requirements Checker', $verbosity); $printer->printv('> Using PHP ', $verbosity); $printer->printvln(\PHP_VERSION, $verbosity, 'green'); $printer->printvln('> PHP is using the following php.ini file:', $verbosity); if ($iniPath) { $printer->printvln(' ' . $iniPath, $verbosity, 'green'); } else { $printer->printvln(' WARNING: No configuration file (php.ini) used by PHP!', $verbosity, 'yellow'); } $printer->printvln('', $verbosity); if (\count($requirements) > 0) { $printer->printvln('> Checking Box requirements:', $verbosity); $printer->printv(' ', $verbosity); } else { $printer->printvln('> No requirements found.', $verbosity); } $errorMessages = array(); foreach ($requirements->getRequirements() as $requirement) { if ($errorMessage = $printer->getRequirementErrorMessage($requirement)) { if (IO::VERBOSITY_DEBUG === $printer->getVerbosity()) { $printer->printvln('✘ ' . $requirement->getTestMessage(), IO::VERBOSITY_DEBUG, 'red'); $printer->printv(' ', IO::VERBOSITY_DEBUG); $errorMessages[] = $errorMessage; } else { $printer->printv('E', $verbosity, 'red'); $errorMessages[] = $errorMessage; } continue; } if (IO::VERBOSITY_DEBUG === $printer->getVerbosity()) { $printer->printvln('✔ ' . $requirement->getHelpText(), IO::VERBOSITY_DEBUG, 'green'); $printer->printv(' ', IO::VERBOSITY_DEBUG); } else { $printer->printv('.', $verbosity, 'green'); } } if (IO::VERBOSITY_DEBUG !== $printer->getVerbosity() && \count($requirements) > 0) { $printer->printvln('', $verbosity); } if ($requirements->evaluateRequirements()) { $printer->block('OK', 'Your system is ready to run the application.', $verbosity, 'success'); } else { $printer->block('ERROR', 'Your system is not ready to run the application.', $verbosity, 'error'); $printer->title('Fix the following mandatory requirements:', $verbosity, 'red'); foreach ($errorMessages as $errorMessage) { $printer->printv(' * ' . $errorMessage, $verbosity); } } $printer->printvln('', $verbosity); } private static function retrieveRequirements() { if (null === self::$requirementsConfig) { self::$requirementsConfig = __DIR__ . '/../.requirements.php'; } $config = (require self::$requirementsConfig); $requirements = new RequirementCollection(); foreach ($config as $constraint) { $requirements->addRequirement('php' === $constraint['type'] ? new IsPhpVersionFulfilled($constraint['condition']) : new IsExtensionFulfilled($constraint['condition']), $constraint['message'], $constraint['helpMessage']); } return $requirements; } } requiredPhpVersion = $requiredPhpVersion; } public function __invoke() { return Semver::satisfies(\sprintf('%d.%d.%d', \PHP_MAJOR_VERSION, \PHP_MINOR_VERSION, \PHP_RELEASE_VERSION), $this->requiredPhpVersion); } } requirements); } #[\ReturnTypeWillChange] public function count() { return \count($this->requirements); } public function add(Requirement $requirement) { $this->requirements[] = $requirement; } public function addRequirement($checkIsFulfilled, $testMessage, $helpText) { $this->add(new Requirement($checkIsFulfilled, $testMessage, $helpText)); } public function getRequirements() { return $this->requirements; } public function getPhpIniPath() { return \get_cfg_var('cfg_file_path'); } public function evaluateRequirements() { return \array_reduce($this->requirements, function ($checkPassed, Requirement $requirement) { return $checkPassed && $requirement->isFulfilled(); }, \true); } } "\x1b[0m", 'red' => "\x1b[31m", 'green' => "\x1b[32m", 'yellow' => "\x1b[33m", 'title' => "\x1b[33m", 'error' => "\x1b[37;41m", 'success' => "\x1b[30;42m"); private $verbosity; private $supportColors; private $width; public function __construct($verbosity, $supportColors, $width = null) { if (null === $width) { $terminal = new Terminal(); $width = $terminal->getWidth(); } $this->verbosity = $verbosity; $this->supportColors = $supportColors; $this->width = $width ?: 80; } public function getVerbosity() { return $this->verbosity; } public function setVerbosity($verbosity) { $this->verbosity = $verbosity; } public function title($title, $verbosity, $style = null) { if (null === $style) { $style = 'title'; } $this->printvln('', $verbosity, $style); $this->printvln($title, $verbosity, $style); $this->printvln(\str_repeat('=', \min(\strlen($title), $this->width)), $verbosity, $style); $this->printvln('', $verbosity, $style); } public function getRequirementErrorMessage(Requirement $requirement) { if ($requirement->isFulfilled()) { return null; } $errorMessage = \wordwrap($requirement->getTestMessage(), $this->width - 3, \PHP_EOL . ' ') . \PHP_EOL; return $errorMessage; } public function block($title, $message, $verbosity, $style = null) { $prefix = ' [' . $title . '] '; $lineLength = $this->width - \strlen($prefix) - 1; if ($lineLength < 0) { $lineLength = 0; } $message = $prefix . \trim($message); $lines = array(); $remainingMessage = $message; $wrapped = \wordwrap($remainingMessage, $lineLength, '¬'); $wrapped = \explode('¬', $wrapped); do { $line = \array_shift($wrapped); if ($lines && $lineLength > 0) { $line = \str_repeat(' ', \strlen($prefix)) . \ltrim($line); } $lines[] = \str_pad($line, $this->width, ' ', \STR_PAD_RIGHT); } while (\count($wrapped)); $this->printvln('', $verbosity); $this->printvln(\str_repeat(' ', $this->width), $verbosity, $style); foreach ($lines as $line) { $this->printvln($line, $verbosity, $style); } $this->printv(\str_repeat(' ', $this->width), $verbosity, $style); $this->printvln('', $verbosity); } public function printvln($message, $verbosity, $style = null) { $this->printv($message, $verbosity, $style); $this->printv(\PHP_EOL, $verbosity, null); } public function printv($message, $verbosity, $style = null) { if ($verbosity > $this->verbosity) { return; } $message = \wordwrap($message, $this->width); $message = \sprintf('%s%s%s', $this->supportColors && isset($this->styles[$style]) ? $this->styles[$style] : '', $message, $this->supportColors ? $this->styles['reset'] : ''); echo $message; } } checkIsFulfilled = $checkIsFulfilled; $this->testMessage = $testMessage; $this->helpText = $helpText; } public function isFulfilled() { if (null === $this->fulfilled) { $this->fulfilled = $this->checkIsFulfilled->__invoke(); } return (bool) $this->fulfilled; } public function getIsFullfilledChecker() { return $this->checkIsFulfilled; } public function getTestMessage() { return $this->testMessage; } public function getHelpText() { return $this->helpText; } } GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. Contao Managerhandle($request); $response->send(); $kernel->terminate($request, $response); } catch (Throwable $throwable) { ApiProblemResponse::createFromException($throwable, '@symfony_env@' !== 'prod')->send(); } .view-recovery__header{max-width:280px;margin-left:auto;margin-right:auto;padding:40px 0 10px;text-align:center}.view-recovery__icon{background:var(--contao);border-radius:10px;padding:10px}.view-recovery__headline{margin-top:15px;font-size:36px;font-weight:100;line-height:1}.view-recovery__content{margin:0 30px 50px}@media(min-width:960px){.view-recovery__content{margin-left:50px;margin-right:50px}}.view-recovery__description{font-weight:600;max-width:600px;margin:0 auto;text-align:center}.view-recovery__console{margin:30px 0 60px}.view-recovery__option{margin:50px 0 0;padding:20px 20px 30px;background:var(--table-odd-bg);text-align:center}.view-recovery__option h3{position:relative;top:-40px;margin-bottom:-25px;font-size:2em;font-weight:300}.view-recovery__option button{margin-top:1.5em}.view-recovery__failed{margin:10px 0;color:var(--btn-alert);font-weight:600}.boot-check{padding:10px}.boot-check:after{display:table;clear:both;content:""}.boot-check__icon{float:left}.boot-check__icon .sk-circle{width:34px;height:34px;margin:3px}.boot-check__icon svg{display:block;width:40px;height:40px}.boot-check__icon--success svg{fill:var(--btn-primary)}.boot-check__icon--info svg,.boot-check__icon--warning svg{fill:var(--btn-warning)}.boot-check__icon--error svg{fill:var(--btn-alert)}.boot-check__label{margin-left:50px}.boot-check__description,.boot-check__detail,.boot-check__title{margin:0;line-height:inherit;overflow:hidden;text-overflow:ellipsis}.boot-check__detail{margin-top:5px;font-size:12px}.boot-check__action{margin-left:50px}.boot-check__action button{margin:15px 0 10px;height:33px;line-height:33px}@media(min-width:960px){.boot-check__label{float:left;width:540px;margin-left:10px}.boot-check__action{float:right;margin:0 0 0 10px;width:140px;text-align:center}.boot-check__action button{margin:3px 0}.boot-check__action a[target=_blank]{display:inline-block;margin:10px 0;padding-left:20px;background:var(--svg--link-blank) left center no-repeat;background-size:16px 16px}}.view-boot__header{margin-left:auto;margin-right:auto;padding:40px 0;text-align:center}.view-boot__icon{background:var(--contao);border-radius:10px;padding:10px}.view-boot__headline{margin-top:15px;font-size:36px;font-weight:100;line-height:1}.view-boot__description{margin:0;font-weight:600}.view-boot__loading{width:30px;margin:0 auto 40px}.view-boot__loading .sk-circle{width:30px;height:30px}.view-boot__checks{margin:0 16px 50px}.view-boot__checks .boot-check:nth-child(odd){border-radius:var(--border-radius);background:var(--table-odd-bg)}.view-boot__summary{margin:50px 0 0}.view-boot__summary--error svg{width:100%;height:40px;fill:var(--btn-alert)}.view-boot__issue{max-width:60%;margin:10px auto;text-align:center;color:var(--btn-alert);line-height:1.2em}.view-boot__safeMode{margin:2em auto 0}.view-boot__continue,.view-boot__safeMode{clear:both;display:block!important;width:220px!important}.view-boot__continue{margin:0 auto}@media(min-width:960px){.view-boot__checks{margin:0 80px 50px}}body.nav-active{overflow:hidden!important}#app{transition:transform .4s cubic-bezier(.55,0,.1,1)}.nav-active #app{overflow-y:visible;transform:translateX(-280px)}.nav-active #app .navigation__group--main{visibility:visible}@media(min-width:1024px){.nav-active #app{transform:none}}.navigation__toggle{display:block;float:right;position:relative;margin:5px 15px;padding:0;width:30px;height:30px;background:none;border:none;cursor:pointer;z-index:20}.navigation__toggle span,.navigation__toggle span:after,.navigation__toggle span:before{content:"";display:block;width:100%;height:4px;background:var(--text);border-radius:4px;position:absolute}.navigation__toggle span{transition-duration:75ms;transition-timing-function:cubic-bezier(.215,.61,.355,1);top:50%;margin-top:-2px}.navigation__toggle span:before{top:-10px;transition:top 75ms ease .12s,opacity 75ms ease}.navigation__toggle span:after{bottom:-10px;transition:bottom 75ms ease .12s,transform 75ms cubic-bezier(.55,.055,.675,.19)}.nav-active .navigation__toggle span{transform:rotate(45deg);transition-delay:.12s;transition-timing-function:cubic-bezier(.215,.61,.355,1)}.nav-active .navigation__toggle span:before{top:0;opacity:0;transition:top 75ms ease,opacity 75ms ease .12s}.nav-active .navigation__toggle span:after{transition:bottom 75ms ease,transform 75ms cubic-bezier(.215,.61,.355,1) .12s;bottom:0;transform:rotate(-90deg)}.navigation__group,.navigation__item{list-style-type:none;margin:0;padding:0}.navigation__group--main{position:fixed;top:0;bottom:0;right:-280px;width:280px;visibility:hidden;padding:20px;overflow-y:auto;overflow-scrolling:touch;background:var(--header-main-bg);border-left:1px solid var(--header-bdr);z-index:10}.navigation__item a,.navigation__item button{display:block;margin:0;padding:12px 10px;font-size:16px;color:var(--text);white-space:pre;background:none;border:none}.navigation__item a:hover,.navigation__item button:hover{text-decoration:none}.navigation__item a[href]:hover,.navigation__item button[href]:hover{color:var(--link)}.navigation__item--main>a,.navigation__item--main>button{text-transform:uppercase}.navigation__item--sub>a{margin-left:15px}.navigation__item--icon svg{display:none}.navigation__item-badge{position:relative;top:-2px;margin-left:8px;padding:2px 5px;font-size:10px;color:var(--clr-btn);font-weight:600;background:var(--contao);border-radius:40%}@media(min-width:1024px){.navigation__toggle{display:none}.navigation__group--main{display:flex;visibility:visible;position:inherit;inset:auto;width:auto;padding:0;overflow:visible;background:none;border:none;box-shadow:none;transform:none;transition:none}.navigation__group--sub{position:absolute;left:50%;min-width:180px;margin-top:-3px;text-align:center;background:var(--form-bg);border-top:3px solid var(--link);border-radius:5px;transform:translateX(-50%);z-index:100;box-shadow:0 0 2px var(--shadow);transition:opacity var(--am-close-transition-duration) ease}.navigation__group--sub:before{position:absolute;left:50%;top:-7px;width:0;height:0;margin-left:-4px;border-style:solid;border-width:0 3.5px 4px 3.5px;border-color:transparent transparent var(--link) transparent;content:""}.navigation__group--sub.hide{display:none!important}.navigation__group--sub.transitioning{display:block!important;opacity:0}.navigation__group--sub.show{display:block!important;opacity:1;transition:opacity var(--am-open-transition-duration) ease}.navigation__group--right{left:auto;right:7px;transform:translateX(0)}.navigation__group--right:before{left:auto;right:18px}.navigation__item{position:relative;padding:0 8px}.navigation__item.router-link-active>a,.navigation__item:hover>a{color:var(--link)!important;border-bottom:3px solid var(--link)}.navigation__item:hover>.navigation__group--sub{display:block}.navigation__item--sub{display:block;margin:calc(var(--border-radius)/2) 0;padding:0 2px;border-radius:var(--border-radius)}.navigation__item--sub a{margin:0;border:none!important}.navigation__item--sub.router-link-active,.navigation__item--sub:hover{background:var(--focus)}.navigation__item--sub.router-link-active a,.navigation__item--sub:hover a{color:var(--text)!important}.navigation__item--icon>button{padding-top:7px}.navigation__item--icon>button svg{display:inline;position:relative;top:4px;width:22px;height:22px;fill:var(--text)}.navigation__item--icon>button:hover svg{fill:var(--link)}.navigation__item--icon>button span{display:none}.navigation:hover li>a{border:none}.navigation:hover li:hover>a{border-bottom:3px solid var(--link)}.navigation:hover li:hover>a svg{fill:var(--link)}}.logout-warning{text-align:center}.logout-warning__countdown{margin:20px 0;font:600 4em/1.6 SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:var(--btn-warning)}.fragment-footer{width:280px;margin:10px auto 0;padding:15px 0 25px;font-size:12px;text-align:center;border-top:1px solid var(--footer-bdr)}.fragment-footer--main{width:auto;margin-top:52px!important;padding:20px 0}.fragment-footer--boxed{border-color:var(--footer-fragment-bdr)}.fragment-footer__product{font-weight:300}.fragment-footer__links{margin:5px 0 0;padding:0;list-style-type:none}.fragment-footer__links li{display:inline-block}.fragment-footer__links li:not(:first-child):before{content:"|";padding:0 10px 0 8px}.fragment-footer__links a{display:inline!important;color:var(--link-footer)}.fragment-footer__settings{margin-top:10px;display:flex;flex-flow:column;justify-content:center;gap:10px}@media(min-width:960px){.fragment-footer{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:16px;align-content:center}.fragment-footer--boxed .fragment-footer__product,.fragment-footer--main .fragment-footer__product{margin-right:auto}.fragment-footer--boxed .fragment-footer__links,.fragment-footer--main .fragment-footer__links{order:15;margin:0 0 0 auto}.fragment-footer--boxed .fragment-footer__settings,.fragment-footer--main .fragment-footer__settings{flex-flow:row;margin-top:0}.fragment-footer--boxed{width:840px}}.layout-main{overflow:hidden;min-height:100vh}.layout-main__header{display:flex;justify-content:space-between;height:56px;padding:8px;background:var(--header-main-bg)}.layout-main__header--margin{margin-bottom:30px}.layout-main__badge-title{background:var(--border);color:var(--text);padding:2px 5px;position:relative;top:-5px;border-radius:8px;font-size:.75rem;font-weight:600;line-height:1;display:-webkit-box;-webkit-line-clamp:1;line-clamp:1;-webkit-box-orient:vertical;word-break:break-word;overflow:hidden;text-overflow:ellipsis}.layout-main__subheader{margin:0 0 45px;padding:20px 0;background:var(--header-bg);border-bottom:1px solid var(--header-bdr)}.layout-main__subheader-inside{display:flex;justify-content:center;align-items:center;flex-direction:column}.layout-main__news{width:320px;height:50px;margin-bottom:20px}.layout-main__news a,.layout-main__news img{display:block}.layout-main .search-bar{width:100%;margin:0}.layout-main__logo{display:inline;color:var(--text);text-decoration:none;font-weight:100;font-size:27px;line-height:40px}.layout-main__logo img{float:left;margin:0 10px 0 12px}@media(min-width:1024px){.layout-main__logo img{margin-left:0}}.layout-main footer,.layout-main__content,.layout-main__subheader-inside{position:relative;margin:0 20px}.layout-main__has-badge-title{display:flex;justify-content:space-between}.layout-main__has-badge-title .layout-main__logo{display:flex}.layout-main__has-badge-title .layout-main__title{display:flex;flex-wrap:wrap;align-items:center;line-height:1;column-gap:10px;row-gap:5px}@media(max-width:600px){.layout-main__badge-title{max-width:220px}}@media(min-width:700px){.layout-main__subheader-inside{flex-direction:row}.layout-main__news{margin:0 20px 0 0}}@media(min-width:1024px){.layout-main__has-badge-title .navigation__group--main{display:flex}.layout-main footer,.layout-main__content,.layout-main__subheader-inside{max-width:960px;margin:0 auto}}@media(min-width:1200px){.layout-main footer,.layout-main__content,.layout-main__subheader-inside{max-width:1180px}}.confirm-button{position:relative}.confirm-button__icon{display:none;position:absolute;opacity:0;z-index:100}.confirm-button__icon--confirm{display:block;animation:confirm_button .5s ease-out 0s}.confirm-button__icon svg{fill:var(--btn-primary);width:100%;height:100%}@keyframes confirm_button{0%{opacity:1;height:10px;width:10px;left:calc(50% - 5px);top:calc(50% - 5px)}to{opacity:0;height:150px;width:150px;left:calc(50% - 75px);top:calc(50% - 75px)}}.package-tools{position:relative;clear:both;text-align:center}@media(min-width:800px){.package-tools{margin-bottom:40px}}.package-tools__button.widget-button{margin-bottom:10px}@media(min-width:800px){.package-tools{display:flex;justify-content:center;align-items:center}.package-tools__button.widget-button{width:auto;margin:0 15px;padding:0 15px}}.package-actions{position:fixed;left:0;right:0;bottom:0;max-height:0;background:#000;background:rgba(0,0,0,.8);color:#fff;transition:max-height .4s ease;z-index:100}.package-actions--active{max-height:200px}.package-actions__inner{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;margin:0;padding:12px;text-align:right}@media(min-width:1024px){.package-actions__inner{max-width:976px;margin:0 auto;padding-left:0;padding-right:0}}@media(min-width:1200px){.package-actions__inner{max-width:1196px}}.package-actions__text{flex-grow:1;display:initial;margin:0 8px;font-weight:600}.package-actions__button{display:block;padding:0 15px!important;margin:8px}.package-actions__button--dryRun{width:auto!important;flex-grow:1}@media(min-width:600px){.package-actions__button{width:auto!important}.package-actions__button--dryRun{flex-grow:0}}.package-actions__button-group{display:block;width:100%;margin:8px}.package-actions__button-group>.button-group__primary{padding:0 15px!important}@media(min-width:600px){.package-actions__button-group{width:auto!important}}.package{position:relative;margin-bottom:20px;background:var(--tiles-bg);border:1px solid var(--tiles-bdr);border-radius:14px}.package.is--hint{border-color:var(--btn-alert)}.package--contao:not(:last-child){margin-bottom:5em}.package__hint{position:relative;background:var(--hint-bg);padding:8px 16px;font-weight:400;font-size:12px;line-height:1.8;border-radius:14px 14px 0 0;z-index:1}.package__hint p a{display:inline-block;padding-right:10px}.package__hint p a:first-child{margin-left:10px}.package__hint p a:not(:first-child):before{padding-right:10px;content:"|"}.package__hint-close{float:right;padding-left:18px;color:var(--hint-link);background:url(../img/close.8b27dbcb.svg) 0 no-repeat;background-size:14px 14px}.package__inside{position:relative;padding:16px}.package__inside:after{display:table;clear:both;content:""}.package__badge{display:inline-block;margin-bottom:.5em;padding:2px 5px;color:#fff;font-size:12px;font-weight:600;background:var(--btn-alert);border-radius:var(--border-radius);cursor:help}.package__icon{border-radius:6px;height:60px;width:60px;background:#f7f7f7;margin:0 auto 10px;position:absolute;right:16px}.package__icon>figure{display:flex;align-items:center;justify-content:center;height:100%}.package__icon img,.package__icon svg{border-radius:4px;width:50px;height:50px;max-height:100%;object-fit:contain}.package__details{min-height:96px}.package__about{margin-bottom:20px}.package__headline{position:relative;margin-bottom:.2em;line-height:1;overflow-wrap:break-word;margin-right:70px}.package__headline em{background-color:var(--highlight-bg);color:var(--highlight-color);font-style:normal}.package__title{display:block;margin-right:10px}.package__description{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1em;margin-right:70px}.package__description em{background-color:var(--highlight-bg);color:var(--highlight-color);font-style:normal}.package__additional{margin-top:-5px}.package .package__release{text-align:right;margin-bottom:5px}.package__version--additional{margin-bottom:5px}.package__version--additional strong{margin-right:10px}.package__version--release{display:none}.package__version--release time{display:block}.package__version--missing{padding:4px 8px;background:var(--btn-alert);border-radius:var(--border-radius);color:#fff;font-weight:700}.package__version-update{display:inline-block;margin:0 0 2px;padding:1px 8px;color:#fff;border-radius:var(--border-radius)}.package__version-update--available{background:var(--btn-primary)}.package__version-update--error{background:var(--btn-alert)}.package__version-update--none{background:var(--border)}.package__version-latest{float:right;position:relative;right:-7px;width:24px;height:20px;background:var(--btn-primary) url(../img/button-update.ad79c617.svg) center center/20px 20px no-repeat}.package__actions{display:flex;flex-flow:column;gap:5px}.package__actions .button-group button{margin-bottom:0!important}@media(min-width:600px){.package__description,.package__title{margin-right:0}.package__hint{padding-left:52px;background:rgba(var(--hint-rgb),.9) url(../img/hint.ba2ac97e.svg) 12px 5px no-repeat;background-size:28px 28px}.package__inside{display:flex;align-items:stretch;padding:0}.package__headline--badge{display:flex;gap:6px;align-items:flex-start}.package__headline{margin:0 0 8px}.package__badge{order:1;margin:0 0 0 2px}.package__icon{width:130px;height:auto;min-height:130px;margin:0;border-radius:12px 0 0 12px;position:revert;right:revert}.package__icon img,.package__icon svg{width:110px;height:110px}.is--hint .package__icon{border-top-left-radius:0}.package--contao{overflow:hidden}.package--contao .package__icon{border-radius:0}.package__details{padding:16px;height:100%;min-height:90px;max-width:calc(100% - 130px);flex:1}.package.is--hint .package__icon{border-top-left-radius:0}}@media(min-width:680px){.package .package__release{display:block;float:left;width:33%}.package__actions{float:right;width:64%;flex-flow:row;gap:4%;text-align:right}.package__actions>*{flex:1}}@media(min-width:1024px){.package__version--additional{display:none}.package__version--release{display:block;margin-top:15px;text-align:center}.package__version-update{display:block;margin:2px 0 0}.package__about{float:left;width:396px;margin-bottom:0}.package .package__release{width:180px;margin-left:20px;margin-bottom:0}.package__actions{flex-flow:column;gap:10px;width:180px;margin-left:20px}.package__details{display:flex;align-self:center;align-items:flex-start}}@media(min-width:1200px){.package__about{width:616px}}.progress-bar{position:relative;width:100%;height:30px;background:var(--clr-btn);border:2px solid var(--btn-warning);color:#000;font-weight:600;text-align:center;line-height:26px}.progress-bar__bar{position:absolute;overflow:hidden;left:0;right:0;top:0;bottom:0;background:var(--btn-warning)}.progress-bar__bar span{display:block;color:var(--clr-btn);text-align:center}.feature-package{display:flex;flex-wrap:wrap;padding:6px 16px;border-top:1px solid var(--border--light)}.feature-package__name{font-weight:600;white-space:nowrap}.feature-package__name:after{content:": "}.feature-package__text{flex-grow:1;display:-webkit-box;overflow:hidden;-webkit-line-clamp:1;line-clamp:1;-webkit-box-orient:vertical;margin-right:.5em;padding:4px 0;line-height:20px}.feature-package__text--hint{display:inline;-webkit-line-clamp:none;line-clamp:none}.feature-package__badge{margin-left:5px;padding:2px 8px;background:var(--btn-alert);border-radius:var(--border-radius);font-size:12px;font-weight:600;line-height:19px;color:#fff;cursor:help}.feature-package__hint{line-height:1.2;padding:2px 5px;background:var(--hint-bg);font-size:12px}.feature-package__actions{flex-grow:1;display:flex;justify-content:flex-end;margin:0 -4px 0 0}.feature-package__actions>*{margin:0 4px}.feature-package__restore{padding-left:18px;font-size:12px;color:var(--hint-link);background:url(../img/close.8b27dbcb.svg) 0 no-repeat;background-size:14px 14px;border:none;cursor:pointer}.feature-package__restore:hover{text-decoration:underline}@media(min-width:800px){.feature-package{flex-wrap:nowrap}}@media(min-width:1024px){.feature-package__hint{padding:8px 10px 8px 36px;background:var(--hint-bg) url(../img/hint.ba2ac97e.svg) 10px 5px no-repeat;background-size:20px 20px}.feature-package__actions{margin:0 -4px 0 0}}.package-constraint input[type=text][data-v-45700166]{margin-right:2px;background:#fff;border:2px solid var(--btn-warning);color:var(--black);font-weight:600;text-align:center;border-top-right-radius:0;border-bottom-right-radius:0}.package-constraint input[type=text][data-v-45700166]::placeholder{color:#fff;-webkit-text-fill-color:#fff;opacity:1}.package-constraint input[type=text][data-v-45700166]:disabled{color:var(--clr-btn);opacity:1;background:var(--btn-warning);-webkit-text-fill-color:var(--clr-btn)}.package-constraint input[type=text].disabled[data-v-45700166]{background:var(--border);border-color:var(--border)}.package-constraint input[type=text].error[data-v-45700166]{animation:input-error .15s linear 3}.package-constraint>input[type=text][data-v-45700166],.package-constraint>input[type=text][data-v-45700166]:disabled{float:left;width:calc(100% - 32px)}.package-constraint button[data-v-45700166]{position:relative;width:30px;background:var(--btn-warning);line-height:20px;text-indent:-999em;border-top-left-radius:0;border-bottom-left-radius:0}.package-constraint button[data-v-45700166]:hover{background:var(--btn-warning-active);border-color:var(--btn-warning-active)}.package-constraint button[data-v-45700166]:before{position:absolute;left:50%;top:50%;margin:-10px 0 0 -10px}.package-constraint button.rotate[data-v-45700166]:before{animation:release-validating-45700166 2s linear infinite}@keyframes release-validating-45700166{to{transform:rotate(1turn)}}@media(min-width:1024px){.package-constraint button[data-v-45700166],.package-constraint input[type=text][data-v-45700166]{height:30px}}.button-group{display:flex;gap:1px;position:relative}.button-group__primary.widget-button{flex-grow:1;border-top-right-radius:0;border-bottom-right-radius:0}.button-group__more.widget-button{flex-shrink:0;width:38px;padding:7px;border-top-left-radius:0;border-bottom-left-radius:0}.button-group__more.widget-button svg{width:24px;height:24px}.button-group__group{position:absolute;top:39px;width:100%;padding-top:3px;z-index:100}.button-group__group:focus{outline:none}.button-group__group .widget-button{margin-top:1px}.button-group__group .link-menu{margin-top:3px}.button-group__group--top{top:auto;bottom:39px}.button-group__group--top .link-menu{margin-top:0;margin-bottom:3px}.composer-package__stats{display:inline-block;margin-right:15px;padding-left:18px;font-size:13px;background-position:0 50%;background-repeat:no-repeat;background-size:13px 13px}.composer-package__stats--license{padding-left:0}.composer-package__stats--versions{display:inline-flex;flex-wrap:wrap;gap:5px;list-style:none;margin:0 15px 0 0;padding:0}.composer-package__stats--version{padding:3px 5px;line-height:1;border:1px solid var(--border);border-radius:4px}.composer-package__stats--funding{width:16px;background-image:url(../img/funding.cf78a0a0.svg);background-size:16px 16px;background-repeat:no-repeat;text-decoration:none!important}.package-uploads__overlay{top:0;bottom:0;right:0;left:0;position:fixed;z-index:9999;opacity:.6;text-align:center;background:#000}.package-uploads__overlay div{margin:-.5em 0 0;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%);font-size:40px;color:#fff;padding:0}.cloud-status{margin-left:8px;position:relative}.cloud-status__button{margin-left:0;margin-right:0;padding-left:8px;cursor:help!important}.cloud-status__popup{position:absolute;text-align:center;left:0;bottom:54px;margin:0;padding:0 0 15px;outline:none;background:var(--form-bg);color:var(--text);border-bottom:3px solid var(--contao);border-radius:5px;box-shadow:0 0 2px var(--shadow);z-index:100}.cloud-status__popup:after{position:absolute;left:38px;bottom:-6px;width:0;height:0;margin-left:-4px;border-style:solid;border-width:4px 3.5px 0 3.5px;border-color:var(--contao) transparent transparent transparent;content:""}.cloud-status__popup--error{color:var(--clr-btn);background-color:var(--btn-alert);border-color:var(--btn-alert)}.cloud-status__popup--error:after{left:27px;border-color:var(--btn-alert) transparent transparent transparent}.cloud-status__headline{padding:15px 20px 0;font-size:16px;white-space:pre}.cloud-status__version{margin:0 0 8px;font-size:12px}.cloud-status__link{display:inline-block;margin:15px 10px 0}.cloud-status__error{padding:8px 20px 8px;hyphens:auto}.cloud-status table{width:100%;margin-top:12px;text-align:left;border-spacing:0;border-collapse:collapse}.cloud-status th{padding:3px 5px 3px 20px}.cloud-status td{padding:3px 20px 3px 0}.cloud-status tr:nth-child(odd){background:var(--table-odd-bg)}.package-list{position:relative}.package-list__status{margin:100px 0;text-align:center;font-size:20px;line-height:1.5em}.package-list__status .sk-circle{width:100px;height:100px;margin:0 auto 40px}.package-list__headline{font-size:18px;font-weight:300;margin:30px 0 10px}.animate-blur-in,.animate-blur-out,.layout-boxed{display:table;width:100%;height:100%}.layout-boxed__cell{display:table-cell;overflow:hidden;vertical-align:middle;padding:10px}.layout-boxed__container{position:relative;max-width:380px;margin:0 auto;background:var(--popup-bg);border-radius:8px}@media(min-width:960px){.layout-boxed__container{margin-top:20px;margin-bottom:20px}.layout-boxed__container--wide{max-width:940px}}.widget-checkbox input{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.widget-checkbox label{position:relative;display:block;padding-left:25px;text-align:left}.widget-checkbox label:before{content:"";position:absolute;left:0;width:20px;height:20px;background:url(../img/widget-checkbox--off.73856538.svg) 0 0 no-repeat;background-size:20px 20px}.widget-checkbox input:checked+label:before{background-image:url(../img/widget-checkbox--on.8b830157.svg)}.widget-checkbox input:focus-visible+label{outline:5px auto Highlight;outline:5px auto -webkit-focus-ring-color}.widget-checkbox input:disabled+label{opacity:.5}.widget-checkbox .widget__description{padding-left:25px}.widget-checkbox .widget__description--disabled{opacity:.5}.user-scope__label{margin:0;padding:0}.user-scope__item{padding:5px 0 0}.user-scope__item--required label{opacity:1!important}.user-scope__item--required label:before{opacity:.5}.view-oauth__header{max-width:280px;margin:0 auto 40px;padding-top:40px;text-align:center}.view-oauth__icon{background:var(--contao);border-radius:10px;padding:10px}.view-oauth__product{margin-top:15px;font-size:36px;font-weight:100;line-height:1}.view-oauth__form{position:relative;max-width:280px;margin:0 auto 60px;text-align:center}.view-oauth__form input,.view-oauth__form select{margin:5px 0 10px}.view-oauth__description{margin-top:.5em;margin-bottom:.5em}.view-oauth__client{margin:1em 0;font-size:32px}.view-oauth__scopes{text-align:left}.view-oauth__warning{color:var(--btn-alert);margin-top:2em;margin-bottom:2em}.view-oauth__button{margin-top:1em}.view-oauth__button .sk-circle{color:#fff;text-align:center}.message-overlay{position:relative}.message-overlay__blur{opacity:.75;filter:blur(2px);transition:opacity .5s,filter .5s}.message-overlay__overlay{position:absolute;display:flex;justify-content:center;align-items:center;left:0;right:0;top:0;bottom:0}.message-overlay__message{padding:10px;font-size:2em;font-weight:400;text-align:center}.maintenance{margin-bottom:14px;background:var(--tiles-bg);border-radius:var(--border-radius)}.maintenance__inside{padding:10px 20px 20px}@media(min-width:1024px){.maintenance__inside{display:grid;grid-template:auto/90px auto 300px;column-gap:20px;padding:25px 20px}}.maintenance__image{display:none}.maintenance__image img{width:100%;border-radius:var(--border-radius);overflow:hidden;aspect-ratio:1;object-fit:contain}@media(min-width:1024px){.maintenance__image{display:flex;align-items:center}}.maintenance__about{margin-bottom:20px}@media(min-width:1024px){.maintenance__about{margin-bottom:0}}.maintenance__about h1{position:relative;margin-bottom:5px;display:flex;flex-wrap:wrap;column-gap:.5em;align-items:baseline}.maintenance__about p{margin:0 0 1em;display:inline}.maintenance__error,.maintenance__warning{position:relative;top:-2px;padding:4px 8px;font-size:14px;line-height:1em;font-weight:300;background:var(--btn-warning);color:var(--clr-btn);border-radius:var(--border-radius)}.maintenance__error{background:var(--btn-alert)}.maintenance__actions{display:flex;flex-direction:column;row-gap:10px;column-gap:20px}@media(min-width:600px){.maintenance__actions{flex-direction:row-reverse}}@media(min-width:1024px){.maintenance__actions{flex-direction:column;margin-left:20px}}.maintenance__actions>.button-group,.maintenance__actions>button{width:100%}@media(min-width:600px){.maintenance__actions>.button-group,.maintenance__actions>button{width:calc(50% - 10px)}}@media(min-width:1024px){.maintenance__actions>.button-group,.maintenance__actions>button{width:100%}}.maintenance__loader{width:50px;margin:0 auto}.maintenance__loader .sk-circle{width:50px;height:50px}.log-viewer__status{margin:100px 0;text-align:center;font-size:20px;line-height:1.5em}.log-viewer__status--empty{padding-top:140px;background:url(../img/warning.9a7cd776.svg) top no-repeat;background-size:100px 100px}.log-viewer__status--loader .sk-circle{width:100px;height:100px;margin:0 auto 40px}.log-viewer__status button{margin-top:2em}.log-viewer__loading{width:30px;margin:40px auto}.log-viewer__loading .sk-circle{width:30px;height:30px}.log-viewer__filters{display:flex;justify-content:space-between;flex-wrap:wrap;gap:20px}.log-viewer__filters>div{display:flex;align-items:flex-end;gap:20px}.log-viewer__filters a{flex-shrink:0}.log-viewer__file{flex-shrink:1;display:flex;align-items:flex-end}.log-viewer__file select{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.log-viewer__file button{border-top-left-radius:0;border-bottom-left-radius:0}.log-viewer__list{margin-top:2em;padding-bottom:1px;background:var(--form-bg);border-radius:var(--border-radius)}@media(min-width:600px){.log-viewer__list{overflow-y:scroll;max-height:calc(100vh - 300px)}}.log-viewer__line{position:relative;padding:10px 0;border-bottom:1px solid var(--border--light)}@media(min-width:600px){.log-viewer__line{display:flex}}.log-viewer__line:hover{background:var(--focus)}.log-viewer__line:last-child{border-bottom:none}.log-viewer__line--header{display:none}@media(min-width:600px){.log-viewer__line--header{display:flex;position:sticky;top:0;z-index:1;font-weight:600;background:var(--log-header-bg)!important;color:#fff;border-top-left-radius:2px;border-top-right-radius:2px;border-bottom-color:var(--border)}}.log-viewer__line--alert:before,.log-viewer__line--critical:before,.log-viewer__line--emergency:before,.log-viewer__line--error:before,.log-viewer__line--warning:before{content:"";position:absolute;left:0;top:-1px;bottom:-1px;width:4px;background:var(--btn-alert)}.log-viewer__line--warning:before{background:var(--btn-warning)}.log-viewer__line--raw{padding:5px 10px;background:#24292e;border-bottom:none;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:#f6f8fa;font-size:.8em;line-height:1.5;white-space:pre-wrap}.log-viewer__line--raw:hover{background:#2f363d}.log-viewer__more{display:flex;justify-content:center;padding:20px}.log-viewer__content,.log-viewer__meta{padding:10px 20px}.log-viewer__content--header,.log-viewer__meta--header{padding:0 20px!important}.log-viewer__meta{padding-bottom:0;flex-shrink:0;font-style:italic}.log-viewer__meta--header{font-style:normal}@media(min-width:600px){.log-viewer__meta{width:220px;padding-bottom:10px}}.log-viewer__content{flex-grow:1}.log-viewer__datetime{display:block}@media(min-width:600px){.log-viewer__datetime{margin-bottom:1em}}.log-viewer__badge{display:inline-block;margin-right:10px;padding:1px 4px;background:var(--border);border-radius:var(--border-radius);font-size:.9em;font-weight:400;text-transform:lowercase}.log-viewer__badge--desktop{display:none}@media(min-width:600px){.log-viewer__badge--desktop{display:inline-block}.log-viewer__badge--mobile{display:none}}.log-viewer__badge--channel{padding-top:0;padding-bottom:0;border:1px solid var(--border);background:var(--white)}.log-viewer__badge--level-warning{background:var(--btn-warning);color:#fff}.log-viewer__badge--level-alert,.log-viewer__badge--level-critical,.log-viewer__badge--level-emergency,.log-viewer__badge--level-error{background:var(--btn-alert);color:#fff}.log-viewer__message span:nth-child(2n){font-weight:600;color:var(--black)}.log-viewer__details{display:flex;align-items:center;margin-top:1em}.log-viewer__toggle{margin-right:10px;padding:0;border:none;background:none;color:var(--link);text-decoration:none;cursor:pointer}.log-viewer__toggle:hover{text-decoration:underline}.log-viewer__json{margin:10px 0 0}.invite-user__check{text-align:center}.invite-user__check svg{width:60px;height:60px;fill:var(--btn-primary)}.invite-user__check,.invite-user__text{margin-bottom:1em}.invite-user__url{display:block;margin-top:2em}.invite-user__help{display:block;margin-top:1em;font-size:12px}.invite-user__clipboard{margin:1em 0}.widget-text input::-webkit-inner-spin-button,.widget-text input::-webkit-outer-spin-button{display:none}.widget-text input[type=number]{appearance:textfield!important}.widget-text--password input{padding-right:40px!important}.widget__password-toggle{position:absolute;right:8px;bottom:2px;padding:0;margin:0;background:none;border:none;cursor:pointer}.widget__password-toggle--hidden svg{fill:var(--btn-primary)}.widget__password-toggle--visible svg{fill:var(--btn)}.setup-totp__qr{margin:2em;text-align:center}.setup-totp__qr svg{width:200px;height:200px}.setup-totp__uri{display:block;margin:1em 0;word-break:break-all}.setup-totp .sk-circle{margin:20px auto}.disable-totp__text{margin-bottom:1em}.change-password .widget{margin:1em 0 0}.user-manager__loading{margin:100px 0;text-align:center;font-size:20px;line-height:1.5em}.user-manager__loading .sk-circle{width:100px;height:100px;margin:0 auto 40px}.user-manager__list{display:grid;grid-template:1fr/1fr;gap:20px}@media(min-width:600px){.user-manager__list{grid-template:1fr/repeat(2,1fr)}}@media(min-width:800px){.user-manager__list{grid-template:1fr/repeat(3,1fr)}}@media(min-width:1200px){.user-manager__list{grid-template:1fr/repeat(4,1fr)}}.user-manager__item{position:relative;overflow:hidden;display:flex;flex-direction:column;padding:16px;background:var(--tiles-bg);border:1px solid 1px solid var(--tiles-bdr);border-radius:14px}.user-manager__ribbon{position:absolute;top:18px;right:-22px;width:100px;font-size:12px;color:#fff;font-weight:600;line-height:1.5;text-align:center;background:var(--btn-info);transform-origin:center center;transform:rotate(45deg)}.user-manager__ribbon--hint{cursor:help}.user-manager__ribbon--primary{background:var(--btn-primary)}.user-manager__ribbon--warning{background:var(--btn-warning)}.user-manager__ribbon--alert{background:var(--btn-alert)}.user-manager__new{margin-top:60px;text-align:center}.user-manager__spacer{flex-grow:1;min-height:1em}.user-manager__username{font-size:18px;font-weight:600}.user-manager__scope{margin-top:1em}.user-manager .widget-button{margin-top:5px}.view-error{position:fixed;left:0;right:0;top:0;bottom:0;padding:10px;color:#e8e8e8;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px;line-height:1.2;background-color:rgba(0,0,0,.851);background-position:0 0;background-repeat:repeat;z-index:9998}.view-error,.view-error__close{display:flex;justify-content:center;align-items:center}.view-error__close{position:absolute;top:15px;right:10px;width:35px;height:35px;background:none;border:none;cursor:pointer;z-index:10}.view-error__close:hover{border:1px solid #fff}.view-error__content{display:flex;flex-direction:column;align-items:center;max-width:800px;max-height:100vh;line-height:1.5;text-align:center}.view-error__icon{display:block;height:100px;margin:2em 0;fill:#fff}.view-error__status{margin-bottom:1em;padding:2px 4px;background-color:#e36049;border-radius:var(--border-radius)}.view-error__headline{margin:0;font-size:1em;line-height:1.5}.view-error__status a{color:#e8e8e8;text-decoration:underline}.view-error__details{display:block;margin-top:2em;white-space:pre-line}.view-error__debug{align-self:flex-start;max-height:60vh;overflow-y:auto;margin-top:2em;text-align:left;white-space:pre-line}.view-error__actions{margin:4em 0;text-align:center}.view-error__link{margin:10px;padding:10px 20px;border:1px solid #fff;border-radius:4px;color:#fff}.button-menu{position:relative}.button-menu__primary.widget-button{float:left;width:calc(100% - 39px);border-top-right-radius:0;border-bottom-right-radius:0}.button-menu__more.widget-button{float:right;width:38px;padding:7px;border-top-left-radius:0;border-bottom-left-radius:0}.button-menu__more.widget-button svg{width:24px;height:24px}.button-menu__menu{display:flex;flex-direction:column;position:absolute;top:38px;right:0;width:auto;z-index:100;background:var(--form-bg);border-radius:var(--border-radius)}.button-menu__menu:before{content:"";position:absolute;top:-5px;right:15px;width:0;height:0;border-right:none;border-bottom:none;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid var(--form-bg)}.button-menu__menu:focus{outline:none}.button-menu__menu button{padding:8px 16px;background:none;border:none;text-align:left;white-space:nowrap;border-bottom:1px solid var(--border);cursor:pointer}.button-menu__menu button:hover{color:var(--text);background:var(--focus)}.button-menu__menu button:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.button-menu__menu button:last-child{border-bottom:none;border-bottom-left-radius:2px;border-bottom-right-radius:2px}.button-menu__menu .link-menu{margin-top:3px}.console-operation{position:relative;padding:0 16px;text-align:left;font-size:12px;color:#959da5}.console-operation__summary{margin-left:13px;padding:8px;box-sizing:border-box}.console-operation__summary--console{margin-left:0}.console-operation summary{cursor:pointer}.console-operation__status{display:inline-block;position:relative;box-sizing:border-box;padding-right:8px;width:24px;height:18px;text-align:center;vertical-align:middle}.console-operation__icon{position:absolute;left:0;top:0}.console-operation__icon--skipped{fill:#666b71}.console-operation__icon--pending{fill:#dbab0a}.console-operation__icon--active{fill:#dbab0a;animation:console-active 1s linear infinite}@keyframes console-active{0%{transform:rotate(0deg)}50%{transform:rotate(180deg)}to{transform:rotate(359deg)}}.console-operation__icon--success{fill:var(--btn-primary)}.console-operation__icon--error{fill:var(--btn-alert)}.console-operation__label{display:inline-block;overflow:hidden;max-width:750px;vertical-align:top}.console-operation__title{display:inline;margin:0;color:#fff}.console-operation__title--disabled{text-decoration:line-through}.console-operation__description{display:inline;margin:0 0 0 10px}.console-operation__console{position:relative;overflow-y:auto;max-height:280px}.console-operation__lines{padding:8px 0 16px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:#f6f8fa;line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word}.console-operation__line{display:flex}.console-operation__line:hover{background-color:#2f363d}.console-operation__line-number{display:inline-block;overflow:hidden;width:48px;min-width:48px;color:#959da5;text-align:right;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;user-select:none}.console-operation__line-content{display:inline-block;margin-left:16px;vertical-align:middle}.console-operation__scroll{position:sticky;left:0;right:0;display:flex;justify-content:center;align-items:flex-end;width:100%;height:30px;padding:0;border:none;cursor:pointer}.console-operation__scroll svg{fill:#fff;width:16px;height:16px}.console-operation__scroll--top{top:0;background:linear-gradient(#24292e,rgba(36,41,46,.502) 50%)}.console-operation__scroll--top svg{transform:rotate(180deg)}.console-operation__scroll--bottom{bottom:0;background:linear-gradient(rgba(36,41,46,.502),#24292e 50%)}.console-operation__scroll--bottom svg{transform:rotate(0deg)}.console{background:#24292e;border-radius:8px}.console__header{display:flex;flex-wrap:nowrap;justify-content:space-between;align-items:center;padding:12px 12px 12px 24px;border-bottom:1px solid #444d56}.console__headline{margin:0;font-size:inherit;line-height:1.5;color:#fff}.console__description{color:#959da5;font-size:12px}.console__actions{display:flex;flex-wrap:nowrap;align-items:center}.console__action,.console__action>button{height:30px!important;line-height:30px!important;width:auto!important;min-width:0;margin:0 2px;padding:0 5px!important;border:none!important}.console__action:hover,.console__action>button:hover{background-color:#2f363d!important}.console__action--active,.console__action>button--active{background-color:#586069!important}.console__operations{padding:20px 0}.view-task__header{margin-left:auto;margin-right:auto;padding:40px 20px;text-align:center}.view-task__icon{background:var(--contao);border-radius:10px;padding:10px}.view-task__headline{margin-top:15px;font-size:36px;font-weight:100;line-height:1}.view-task__description{margin:0;font-weight:600}.view-task__actions{display:flex;flex-direction:column;justify-content:center;align-items:center;margin-top:2em}@media(min-width:960px){.view-task__actions{flex-direction:row}}.view-task .widget-button{width:280px;height:35px;margin:5px;padding:0 30px;line-height:35px}@media(min-width:960px){.view-task .widget-button{width:auto}}.view-task__main{margin:0 50px 50px}.view-task__loading{width:30px;margin:40px auto}.view-task__loading .sk-circle{width:30px;height:30px}.view-task__sponsor{margin:-30px 50px 50px;text-align:center}@media(min-width:960px){.view-task__sponsor br{display:none}}.view-task__donate{position:relative;top:5px;margin-left:.5em;line-height:0}:root{--text:#535353;--link:#f47c00;--placeholder:#a9a9a9;--body-bg:#ebe6db;--link-footer:#2a7887;--tiles-bg:#fff;--tiles-bdr:#ddd3bc;--popup-hl-bg:#f47c00;--popup-bg:#fff;--popup-header:#fff;--popup-overlay-bg:hsla(41,29%,89%,.35);--tab-content:#f8f9fb;--highlight-bg:#ff0;--highlight-color:#535353;--shadow:#ccbfa2;--contao:#f47c00;--badge-bg:var(--contao);--ad-shadow:0 1px 5px 1px rgba(0,0,0,.2);--black:#000;--funding:#ea4aaa;--funding-rgb:234,74,170;--form-bg:#fff;--border:#ccc;--border--light:#e9eef1;--focus:#f9f9f9;--clr-btn:#fff;--btn:#737373;--btn-active:#666;--btn-primary:#31a64b;--btn-primary-active:#2b9242;--btn-warning:#db8c41;--btn-warning-active:#d77f2c;--btn-alert:#db5041;--btn-alert-active:#d73c2c;--btn-info:#6a8ca6;--btn-info-active:#5c7f9a;--btn-funding:#ea4aaa;--btn-funding-active:#e7339f;--btn-disabled:#ccc;--hint-bg:#e8c8bc;--hint-rgb:232,200,188;--hint-link:#bd2e20;--header-bg:#e5dfcf;--header-bdr:#dcd8cc;--footer-bdr:#bbb;--svg--link-blank:url(../img/link-blank.eb57b3fa.svg);--svg--private:url(../img/private.a1c65662.svg);--svg--updated:url(../img/updated.3b47bebb.svg);--svg--downloads:url(../img/downloads.c1db2a9e.svg);--svg--favers:url(../img/favers.056e2836.svg);--svg--language:url(../img/language.582b2920.svg);--svg--color-scheme:url(../img/color_scheme.d527d153.svg)}html[data-color-scheme=dark]{color-scheme:dark;--text:#ddd;--link:#f47c00;--body-bg:#0f0f11;--tiles-bg:#212227;--tiles-bdr:#303236;--popup-hl-bg:#292c32;--popup-bg:#1b1d21;--popup-overlay-bg:rgba(0,0,0,.35);--tab-content:#212227;--highlight-bg:#f47c00;--highlight-color:#fff;--shadow:transparent;--badge-bg:var(--border--light);--ad-shadow:none;--btn:#3c3f4c;--btn-active:#25272f;--black:#fff;--form-bg:#151619;--border:#44464b;--border--light:#2e2e34;--focus:#1e2024;--btn-info:#25455f;--btn-info-active:#253846;--btn-disabled:#151517;--opacity-disabled:0.5;--hint-rgb:57,9,20;--header-bg:#1b1d21;--header-bdr:#1b1d21;--footer-bdr:#414448;--svg--link-blank:url(../img/link-blank--dark.07eeaee6.svg);--svg--private:url(../img/private--dark.41b90022.svg);--svg--updated:url(../img/updated--dark.c21fdd5b.svg);--svg--downloads:url(../img/downloads--dark.034bf7a3.svg);--svg--favers:url(../img/favers--dark.4765f7d4.svg);--svg--language:url(../img/language--dark.a24e849e.svg);--svg--color-scheme:url(../img/color_scheme--dark.ef0f0aed.svg)}html[data-color-scheme=dark] #contao-network{background:#292c32!important;color:#ddd!important}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}#app,body,html{height:100%}blockquote,body,figure,form,p{margin:0;padding:0}article,aside,figcaption,figure,footer,header,main,nav,section{display:block}body,div,fieldset,form,h1,h2,h3,h4,h5,h6,html,p{text-size-adjust:none}body{background:var(--body-bg);overflow-y:hidden}#app{overflow-y:scroll}fieldset{border:none;margin:0;padding:0}legend{-webkit-padding-start:0;-webkit-padding-end:0}figure{line-height:0}body,button,input,textarea{font:300 14px/1.4 -apple-system,system-ui,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;color:var(--text)}strong{font-weight:600}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}input,select,textarea{font-size:99%}input:disabled,select:disabled,textarea:disabled{color:var(--text);-webkit-text-fill-color:var(--text);cursor:text}input::-ms-clear,input::-ms-reveal,select::-ms-clear,select::-ms-reveal,textarea::-ms-clear,textarea::-ms-reveal{display:none}input::placeholder,select::placeholder,textarea::placeholder{color:var(--placeholder);-webkit-text-fill-color:var(--placeholder)}.invisible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}h1,h2,h3,h4,h5,h6{font-size:inherit;line-height:inherit;font-weight:600;margin:0}a{color:var(--link);text-decoration:none}a:hover{text-decoration:underline}h1{font-size:18px;line-height:30px;margin-bottom:10px}@keyframes input-error{0%{left:0}25%{left:-5px}75%{left:5px}to{left:0}}.widget{position:relative}.widget__error{display:none;position:absolute;left:0;right:0;margin:0;padding:4px 10px;color:var(--clr-btn);background:var(--btn-alert);border-radius:2px;transform:translateY(6px);z-index:10;white-space:pre-line}.widget__error:after,.widget__error:before{bottom:100%;left:30px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.widget__error:after{border-bottom-color:var(--btn-alert);border-width:3px;margin-left:-3px}.widget__error:before{border-bottom-color:var(--btn-alert);border-width:5px;margin-left:-5px}input:focus+*+.widget__error,input:focus+.widget__error,input:hover+*+.widget__error,input:hover+.widget__error,select:hover+.widget__error{display:block}.widget__description{margin-top:2px;font-size:12px}input:not([type=checkbox]):not([type=radio]),select{position:relative;width:100%;height:38px;padding:0 20px;background:var(--form-bg);border:1px solid var(--border);border-radius:6px;color:var(--text);appearance:none}input:not([type=checkbox]):not([type=radio]):focus,select:focus{outline:none;background-color:var(--focus)}.widget--validate input:not([type=checkbox]):not([type=radio]):not(:placeholder-shown):valid,.widget--validate select:not(:placeholder-shown):valid{border-color:var(--btn-primary)}.widget--validate input:not([type=checkbox]):not([type=radio]):not(:placeholder-shown):invalid,.widget--validate select:not(:placeholder-shown):invalid{border-color:var(--btn-alert)}.widget--error input:not([type=checkbox]):not([type=radio]),.widget--error select{border-color:var(--btn-alert);animation:input-error .15s linear 3}select{padding-right:30px}.widget-select:after{position:absolute;right:12px;bottom:16px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid var(--border);content:"";pointer-events:none}.widget-button{display:inline-block;width:100%;height:38px;padding:0;border:none;background-color:var(--btn);color:var(--clr-btn);font-weight:600;line-height:38px;text-decoration:none;text-align:center;white-space:nowrap;cursor:pointer;border-radius:5px}.widget-button:active,.widget-button:hover{background-color:var(--btn-active)}.widget-button--inline{width:auto!important;min-width:100px;padding:0 20px}.widget-button--transparent{background:transparent}.widget-button--small{height:28px;width:auto!important;min-width:0;padding:0 15px;font-size:13px;line-height:28px;font-weight:300}.widget-button--small:before,.widget-button--small>:before{top:3px!important;width:15px!important;height:15px!important;margin-right:6px!important;background-size:15px 15px!important}.widget-button--primary{--btn:var(--btn-primary);--btn-active:var(--btn-primary-active)}.widget-button--warning{--btn:var(--btn-warning);--btn-active:var(--btn-warning-active)}.widget-button--alert{--btn:var(--btn-alert);--btn-active:var(--btn-alert-active)}.widget-button--info{--btn:var(--btn-info);--btn-active:var(--btn-info-active)}.widget-button--funding{--btn:var(--btn-funding);--btn-active:var(--btn-funding-active)}.widget-button:empty{min-width:auto;padding:0 10px}.widget-button:empty:before{margin-right:0!important}.widget-button:hover{text-decoration:none}.widget-button.disabled,.widget-button:disabled{background-color:var(--btn-disabled)!important;border-color:var(--btn-disabled)!important;cursor:not-allowed;opacity:var(--opacity-disabled,1)}.widget-button.disabled{pointer-events:none}.widget-button--anchor{height:auto;background:none!important;line-height:inherit;font-weight:inherit;color:var(--link);text-decoration:none;cursor:pointer}.widget-button--anchor:hover{text-decoration:underline!important}.widget-button--anchor.disabled,.widget-button--anchor:disabled{background:none!important}label{padding:0}.widget--required label:after{margin-left:2px;content:"*";color:var(--btn-alert)}input:-webkit-autofill,select:-webkit-autofill{-webkit-text-fill-color:var(--text);-webkit-box-shadow:inset 0 0 0 1000px hsla(0,0%,100%,0);transition:background-color 5000s ease-in-out 0s}.widget-button--details:before{background-image:url(../img/button-details.8ce780e9.svg)}.widget-button--link:before{background-image:url(../img/button-link.dd42e161.svg)}.widget-button--search:before{background-image:url(../img/button-search.44ce1d4b.svg)}.widget-button--add:before,.widget-button--check:before,.widget-button--clipboard:before,.widget-button--cloud-off:before,.widget-button--cloud:before,.widget-button--console:before,.widget-button--database:before,.widget-button--details:before,.widget-button--download:before,.widget-button--edit:before,.widget-button--gear:before,.widget-button--hide:before,.widget-button--link:before,.widget-button--lock:before,.widget-button--maintenance:before,.widget-button--more:before,.widget-button--passkey:before,.widget-button--power:before,.widget-button--run:before,.widget-button--save:before,.widget-button--search:before,.widget-button--show:before,.widget-button--trash:before,.widget-button--unlock:before,.widget-button--update:before,.widget-button--upload:before{position:relative;display:inline-block;top:5px;width:20px;height:20px;margin-right:8px;background-position:50%;background-repeat:no-repeat;background-size:18px 18px;content:""}.widget-button--add:empty:before,.widget-button--check:empty:before,.widget-button--clipboard:empty:before,.widget-button--cloud-off:empty:before,.widget-button--cloud:empty:before,.widget-button--console:empty:before,.widget-button--database:empty:before,.widget-button--details:empty:before,.widget-button--download:empty:before,.widget-button--edit:empty:before,.widget-button--gear:empty:before,.widget-button--hide:empty:before,.widget-button--link:empty:before,.widget-button--lock:empty:before,.widget-button--maintenance:empty:before,.widget-button--more:empty:before,.widget-button--passkey:empty:before,.widget-button--power:empty:before,.widget-button--run:empty:before,.widget-button--save:empty:before,.widget-button--search:empty:before,.widget-button--show:empty:before,.widget-button--trash:empty:before,.widget-button--unlock:empty:before,.widget-button--update:empty:before,.widget-button--upload:empty:before{margin-right:0!important}.animate-initializing{animation:initializing 1s linear infinite}@keyframes initializing{0%{opacity:.5}50%{opacity:1}to{opacity:.5}}.animate-blur-in{z-index:-1;opacity:.5;filter:blur(4px);transition:opacity .35s,filter .5s}.animate-blur-out{opacity:1;transition:opacity .35s}.animate-fade-enter-active,.animate-fade-leave-active{transition-duration:.2s;transition-property:opacity;transition-timing-function:ease}.animate-fade-enter,.animate-fade-leave-active{opacity:0}.animate-flip-enter-active,.animate-flip-leave-active{transform-style:preserve-3d;backface-visibility:hidden;transition-duration:.5s;transition-property:transform,opacity}.animate-flip-leave-active{transform:perspective(600px) rotateY(0deg);opacity:1}.animate-flip-leave-to{transform:perspective(600px) rotateY(90deg);transition-timing-function:ease-in;opacity:0}.animate-flip-enter-active{transform:perspective(400px) rotateY(270deg);opacity:0}.animate-flip-enter-to{transform:perspective(400px) rotateY(1turn);transition-timing-function:ease-out;opacity:1}:root{--header-main-bg:#fff;--footer-fragment-bdr:#eee;--table-odd-bg:#f5f9fa;--border-radius:6px;--log-header-bg:var(--shadow)}html[data-color-scheme=dark]{--header-main-bg:#292c32;--footer-fragment-bdr:var(--footer-bdr);--table-odd-bg:var(--tiles-bg);--link-footer:#fff;--hint-bg:#151619;--hint-rgb:21,22,25;--log-header-bg:var(--btn)}html[data-color-scheme=dark] .vjs-tree-node:hover{background-color:#2b3439}.color-scheme--light,html[data-color-scheme=dark] .color-scheme--dark{display:initial}.color-scheme--dark,html[data-color-scheme=dark] .color-scheme--light{display:none}.app-hint{position:absolute;top:0;left:0;right:0;height:27px;padding:4px 8px;background:var(--btn-info);color:#fff;text-align:center;z-index:100}.app-hint--warning{background:var(--btn-warning)}.app-hint--alert{background:var(--btn-alert)}.app-hint__description{display:none}@media(min-width:600px){.app-hint__description{display:inline}}.app-hint__link{margin:0;padding:0;background:none;border:none;color:#fff;text-decoration:underline;cursor:pointer}.app-hint+div{padding-top:25px}.view-init{display:table;width:100%;height:100%}.view-init__cell{display:table-cell;font-size:1.5em;text-align:center;vertical-align:middle}.widget-button--add:before{background-image:url(../img/button-add.759df12e.svg)}.widget-button--check:before{background-image:url(../img/button-check.7a3b5ada.svg)}.widget-button--clipboard:before{background-image:url(../img/button-clipboard.9ef63d39.svg)}.widget-button--cloud:before{background-image:url(../img/button-cloud.bc42f267.svg)}.widget-button--cloud-off:before{background-image:url(../img/button-cloud-off.dd8ba18e.svg)}.widget-button--console:before{background-image:url(../img/button-console.05dcdfc4.svg)}.widget-button--database:before{background-image:url(../img/button-database.5282fc7e.svg)}.widget-button--download:before{background-image:url(../img/button-download.e1ba6f25.svg)}.widget-button--edit:before{background-image:url(../img/button-edit.40a4be06.svg)}.widget-button--gear:before{background-image:url(../img/button-gear.a2dc1f09.svg)}.widget-button--hide:before{background-image:url(../img/button-hide.d23f6533.svg)}.widget-button--lock:before{background-image:url(../img/button-lock.98988f08.svg)}.widget-button--maintenance:before{background-image:url(../img/button-maintenance.93830369.svg)}.widget-button--more:before{background-image:url(../img/button-more.e3eb2622.svg)}.widget-button--passkey:before{background-image:url(../img/button-passkey.3806f98a.svg)}.widget-button--power:before{background-image:url(../img/button-power.298a8072.svg)}.widget-button--run:before{background-image:url(../img/button-run.b6310c5a.svg)}.widget-button--save:before{background-image:url(../img/button-save.3b5224de.svg)}.widget-button--show:before{background-image:url(../img/button-show.2336e1d9.svg)}.widget-button--trash:before{background-image:url(../img/button-trash.855f57fa.svg)}.widget-button--unlock:before{background-image:url(../img/button-unlock.51b76e07.svg)}.widget-button--update:before{background-image:url(../img/button-update.ad79c617.svg)}.widget-button--upload:before{background-image:url(../img/button-upload.ca8e9cfc.svg)}.view-login__header{max-width:280px;margin:0 auto 60px;padding-top:40px;text-align:center}.view-login__product{margin-top:15px;font-size:38px;font-weight:100;line-height:1}.view-login__form{position:relative;max-width:280px;margin:0 auto 60px}.view-login__form input{padding-right:30px;margin:5px 0 10px}.view-login__locked{max-width:290px;margin:-20px auto 60px;padding:20px;background:var(--btn-alert);color:#fff;text-align:center}.view-login__locked strong{white-space:pre}.view-login__headline{margin-bottom:0}.view-login__description{margin-top:.5em;margin-bottom:20px}.view-login label{position:absolute;text-indent:-999em;pointer-events:none}.view-login label[for=ctrl_username]{top:0;bottom:0;margin:auto;right:13px;width:16px;height:16px;background:url(../img/person.00d78897.svg) 0 0 no-repeat;background-size:16px 16px;z-index:10}.view-login label[for=ctrl_password]{top:0;bottom:0;margin:auto;right:12px;width:16px;height:16px;background:url(../img/lock.3c42a55f.svg) 0 0 no-repeat;background-size:14px 14px;z-index:10}.view-login__password input,.view-login__user input{margin:0}.view-login__user input{border-radius:var(--border-radius) var(--border-radius) 0 0!important}.view-login__password{margin-top:-1px;margin-bottom:10px}.view-login__password input{border-radius:0 0 var(--border-radius) var(--border-radius)!important}.view-login .widget-text--password button{opacity:0}.view-login__link{display:block;margin-top:2em;font-size:12px;text-align:center}.view-login__button{margin:3px 0}.view-login__button .sk-circle{color:#fff;text-align:center}.view-login__or{display:grid;gap:15px;grid-template-columns:1fr auto 1fr;padding:12px}.view-login__or:after,.view-login__or:before{align-self:center;border-top:1px solid var(--border);content:""}.view-login .fragment-footer{display:block}.widget-radio-button legend{margin-bottom:2px}.widget-radio-button>div{position:relative;margin:.25em 0}.widget-radio-button input{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.widget-radio-button label{display:block;padding-left:25px;background:url(../img/widget-radio--off.4e93f443.svg) 0 -1px no-repeat;background-size:20px 20px}.widget-radio-button input:checked+label{background-image:url(../img/widget-radio--on.181461b6.svg)}.widget-radio-button input:focus-visible+label{outline:5px auto Highlight;outline:5px auto -webkit-focus-ring-color}.widget-radio-button input:disabled+label{opacity:.5}.setup__directories{margin-top:2em}.setup__directories>dt{margin-top:1em;font-weight:600}.setup__directories>dd{margin:0;word-break:break-all}.setup__directories>dd span{background-color:var(--highlight-bg);color:var(--highlight-color);font-weight:400}.link-more{position:relative;display:inline-block}p:empty+.link-more{margin-left:0}.link-more button{width:auto;height:auto;padding:0 0 5px;background:transparent;color:var(--link);font-size:13px;font-weight:300;line-height:inherit;border:none;cursor:pointer}.link-more button:hover{text-decoration:underline}.link-more__menu{outline:none}.link-more ul{transform:translateX(-50%)}.package-link{display:flex;column-gap:8px;justify-content:space-between;width:100%;padding-bottom:4px;margin-bottom:4px;border-bottom:1px solid var(--border--light)}.package-link:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.package-link__details{padding:5px 0;line-height:18px}.package-link__name{display:inline;font-weight:600}.package-link__name:after{content:": "}.package-link__text{display:inline}.package-link__actions{display:flex;margin-left:20px;margin:0 -4px}.package-link__actions>*{margin:0 4px}.package-link--limit .package-link__details{display:flex}.package-link--limit .package-link__name{white-space:nowrap}.package-link--limit .package-link__text{display:-webkit-box;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical;padding:0 10px 0 5px}.package-funding[data-v-5a8fd14b]{padding:10px 20px 10px 50px;font-weight:400;font-size:12px;line-height:1.8;background:rgba(var(--funding-rgb),.025) url(../img/funding.cf78a0a0.svg) 15px 50% no-repeat;background-size:23px 23px;border:1px solid rgba(var(--funding-rgb),.5);border-radius:6px}.package-funding>div[data-v-5a8fd14b]{overflow:hidden}.package-funding span[data-v-5a8fd14b]{margin-right:15px}.package-funding a[data-v-5a8fd14b]{position:relative;display:inline-block;margin:0 20px 0 0;padding-left:16px;color:var(--funding);background:url(../img/link-funding.b25cd92d.svg) 0 50% no-repeat;background-size:13px 13px}.package-funding a[data-v-5a8fd14b]:before{content:"|";position:absolute;left:-12px}.package-funding a[data-v-5a8fd14b]:nth-child(2):before{content:none}.package-popup{position:fixed;display:flex;flex-direction:column;justify-content:flex-start;width:100%;max-width:none;height:100%;background:var(--popup-bg);z-index:10;opacity:1}.package-popup>*{flex-basis:auto;flex-grow:1}.package-popup__loader{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:50px 0}.package-popup__loader p{margin:1em}.package-popup__headline{position:relative;flex-grow:0;flex-shrink:1;padding:7px 30px 6px;background:var(--popup-hl-bg);color:#fff;font-size:18px;font-weight:300;line-height:1.5;text-align:center}.package-popup__button{display:block;float:right;position:absolute;top:0;margin:4px 0;padding:4px;background:none;border:1px solid transparent;border-radius:5px;cursor:pointer}.package-popup__button--previous{left:4px}.package-popup__button--close{right:4px}.package-popup__button svg{display:block;width:22px;height:22px}.package-popup__button:hover{background-color:#db6f00}.package-popup__summary{flex-grow:0;padding:25px 35px}@media(min-width:600px){.package-popup__summary{display:flex}}.package-popup__logo{border-radius:6px;float:right;height:60px;width:60px;margin-left:1em;background:#f7f7f7}@media(min-width:600px){.package-popup__logo{display:block;float:left;width:110px;height:110px;margin:-10px 16px 0 -10px}}.package-popup__icon{display:flex;align-items:center;justify-content:center;height:100%}.package-popup__icon--fallback{display:none}.package-popup__icon img{width:50px;height:50px;max-height:100%;object-fit:contain}@media(min-width:600px){.package-popup__icon img{width:90px;height:90px}}.package-popup__text{display:flex;flex-direction:column;flex-grow:1}@media(min-width:600px){.package-popup__text{width:200px}}.package-popup__title{margin:0;line-height:1.4;overflow-wrap:break-word}.package-popup__authors{flex-grow:1;font-size:13px;margin-bottom:.5em}.package-popup__author{display:inline-block;margin-right:2px}.package-popup__author:after{color:var(--text);content:", "}.package-popup__author:last-child:after{content:none}.package-popup__stats{display:inline-block;margin-right:15px;margin-top:.5em;padding-left:18px;font-size:13px;background-position:0 50%;background-repeat:no-repeat;background-size:13px 13px}.package-popup__stats--private{padding-left:20px;background-image:var(--svg--private);background-size:15px 15px}.package-popup__stats--updated{background-image:var(--svg--updated)}.package-popup__stats--downloads{background-image:var(--svg--downloads)}.package-popup__stats--favers{background-image:var(--svg--favers)}.package-popup__actions{display:flex;flex-direction:column;gap:10px;margin-top:1em}@media(min-width:600px){.package-popup__actions{justify-content:space-between;margin:0 0 0 25px;width:200px}}.package-popup__installed{margin-top:1em}.package-popup__abandoned{margin:0 0 20px;padding:10px 20px 10px 50px;font-weight:400;font-size:12px;line-height:1.8;background:rgba(var(--hint-rgb),.3) url(../img/hint.ba2ac97e.svg) 15px 50% no-repeat;background-size:23px 23px;border:1px solid var(--hint-link);border-radius:6px}.package-popup__funding{margin:0 0 20px}.package-popup__tabs{position:relative;flex-grow:revert}.package-popup__tabs:after,.package-popup__tabs:before{content:"";display:block;position:absolute;top:0;bottom:1px;width:7px;background:linear-gradient(-90deg,transparent 0,var(--popup-bg) 50%);z-index:1;pointer-events:none}.package-popup__tabs:after{background:linear-gradient(90deg,transparent 0,var(--popup-bg) 50%);right:0}.package-popup__tabs-list{flex-shrink:0;flex-grow:0;display:flex;column-gap:4px;height:40px;min-width:100%;overflow-x:auto;scrollbar-width:none;overflow-y:hidden;margin:0;padding:0 7px;list-style-type:none}.package-popup__tabs-list:after{content:"";position:absolute;inset:auto 0 0;height:1px;background:var(--border--light);z-index:-1}.package-popup__tab{position:relative;top:1px;flex-grow:1;padding:0;height:39px;line-height:39px;text-align:center;border:1px solid var(--border--light);border-top-left-radius:6px;border-top-right-radius:6px}.package-popup__tab--active{background:var(--tab-content);border-bottom:1px solid var(--tab-content)}.package-popup__tab button{display:flex;justify-content:center;align-items:center;width:100%;height:100%;margin:0;padding:0 10px;border:none;background:transparent;cursor:pointer}.package-popup__tab button:disabled{color:var(--border)!important;cursor:not-allowed}.package-popup__pill{position:relative;top:-2px;display:inline-block;margin-left:5px;padding:2px 5px;font-size:10px;font-weight:400;background:var(--border--light);border-radius:40%}.package-popup__pill--highlight{color:var(--clr-btn);background:var(--btn-primary)}.package-popup__tabcontent{position:relative;padding:25px 35px;overflow-y:auto;background:var(--tab-content);outline:0}@media(min-width:960px)and (min-height:700px){.package-popup__tabcontent{height:450px}}.package-popup__description{margin:1em 0;white-space:pre-wrap}@media(min-width:960px){.package-popup{position:relative;display:block;top:0;left:50%;width:750px;margin-left:-375px;height:auto;border-radius:8px;transform:none}.package-popup__headline{border-radius:8px 8px 0 0}.package-popup__tabcontent{border-radius:0 0 8px 8px}}@media(min-width:960px)and (min-height:700px){.package-popup{position:absolute;top:50%;transform:translateY(-50%)}}.package-popup__installed strong{margin-right:5px}@media(min-width:600px){.package-popup__installed{display:flex;flex-direction:column;justify-content:flex-end;text-align:center}.package-popup__installed strong{display:block;margin:0}}.package-popup__update{background:var(--btn-primary) url(../img/button-update.ad79c617.svg) 15px 50% no-repeat;background-size:23px 23px}.package-popup__incompatible,.package-popup__update{margin:0 0 20px;padding:10px 20px 10px 50px;color:var(--clr-btn);border-radius:var(--border-radius)}.package-popup__incompatible{background:var(--contao) url(../img/button-incompatible.3eb2b686.svg) 15px 50% no-repeat;background-size:23px 23px}.package-popup__funding+.package-popup__update{margin-top:-10px}.theme-details__constraint{flex-grow:1}.file-tree{margin:0;padding:0;list-style:none}.file-tree__folder{position:relative;padding-left:20px}.file-tree__folder:before{content:"";position:absolute;left:10px;top:6px;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid var(--text);transition:transform .1s ease-in-out}.file-tree__folder--open:before{transform:rotate(90deg)}.file-tree__file{padding-left:20px}.file-tree button{background:none;border:none;font-weight:400;cursor:pointer}.setup__versions{margin:0;padding:0 0 0 15px}.setup__version{margin:.5em 0;text-align:left}.setup__version--warning{color:var(--btn-alert)}.setup__releaseplan{margin-top:1.5em}.setup__fielddesc--version{margin-bottom:-1em!important}.setup__core-features{margin:5px 0 0 5px;font-size:12px}.setup__theme-image{max-width:100%;height:auto;border:1px solid var(--border)}.setup__theme p{margin:1em 0}.setup__themes{padding:0 14px}.setup__themes-results{display:grid;gap:14px}@media(min-width:1024px){.setup__themes-results{grid-template-columns:repeat(2,1fr)}.setup__themes-results-item{flex-basis:calc(50% - 16px);margin-left:8px;margin-right:8px}}.setup__themes-item{border:1px solid var(--tiles-bdr)}.setup__themes-more{margin-top:20px;text-align:center}.setup__theme-search{margin:20px 0 0;text-align:center}.setup__theme-search--empty{padding-top:60px;background:url(../img/sad.c7de6e95.svg) top no-repeat;background-size:50px 50px}.setup__theme-search--offline{padding-top:60px;background:url(../img/offline.0c23d1ce.svg) top no-repeat;background-size:50px 50px}.setup__theme-search--loader .sk-circle{width:50px;height:50px;margin:0 auto 20px}.setup__theme-search button{margin-top:2em}.setup__fielddesc--warning{padding:10px 10px 10px 40px;background:var(--hint-bg) url(../img/hint.ba2ac97e.svg) 10px 10px no-repeat}.setup__tabs{margin:1em 0}.setup__tab-controls{display:flex}.setup__tab-control{flex-grow:1;padding:4px 10px;border:none;border-top:1px solid var(--border);border-left:1px solid var(--border);background:none;cursor:pointer}.setup__tab-control:last-child{border-right:1px solid var(--border)}.setup__tab-control--active{border-color:var(--btn);background:var(--btn);color:#fff}.setup__tab{border:1px solid var(--border)}.setup__tab--files{white-space:pre;overflow:scroll;height:200px}.setup__requires{width:100%;border-collapse:collapse}.setup__requires td,.setup__requires th{margin:0;padding:3px 10px;text-align:start;vertical-align:top}.setup__requires th{background:var(--btn);color:#fff}.setup__requires td{border-bottom:1px solid var(--border)}.setup__requires tr:last-child td{border-bottom:none}.setup__requires tr:nth-child(odd) td{background:var(--table-odd-bg)}.setup__theme-upload{padding:0 50px;text-align:center}@media(min-width:960px){.setup__theme-upload{padding:0 150px}}.setup__or{position:relative;overflow:hidden;margin:1em 0;text-align:center}.setup__or:before{content:"";position:absolute;top:.8em;left:0;right:0;display:block;height:1px;background:var(--border);z-index:1}.setup__or span{position:relative;padding:0 10px;background:var(--popup-bg);z-index:2}.view-setup{padding-top:40px}.view-setup footer{margin-top:40px}.view-setup__steps{padding:0 0 50px 0}.view-setup__steps ul{display:flex;margin:0;padding:0;list-style-type:none}.view-setup__steps li{display:flex;justify-content:center;align-items:center;flex-grow:1;position:relative;height:6px;margin:0;padding:0}.view-setup__steps li:before{content:"";position:absolute;left:-50%;right:50%;background:var(--border);height:5px}.view-setup__steps li:after{content:"";position:absolute;top:-18px;left:50%;margin-left:-21px;width:42px;height:42px;color:#fff;text-indent:0;text-align:center;line-height:35px;background:var(--border);border-radius:50%;z-index:1}.view-setup__steps li:first-child:before{content:none}.view-setup__steps li.active:after,.view-setup__steps li.active:before{background:var(--contao)}.view-setup__steps button{display:flex;justify-content:center;align-items:center;background:transparent;border:none;z-index:10;cursor:pointer}.view-setup__steps button:disabled{cursor:default}.view-setup__steps svg{fill:#fff}.view-setup__main{text-align:center}.view-setup__party{font-size:64px}.view-setup__headline{margin:10px 0 20px;padding:15px 0;font-size:42px;font-weight:100}.view-setup__description{max-width:500px;margin:1em 25px}.view-setup__start.widget-button{height:50px;margin:30px 10px 0;padding:0 50px;font-size:1.2em;line-height:50px}.view-setup__continue.widget-button{width:80%!important;margin:10px 0 0}.view-setup__funding{width:80%;margin:50px auto 0;padding:20px 25px;border:2px solid var(--funding);border-radius:var(--border-radius);background:rgba(var(--funding-rgb),.025);font-weight:400}.view-setup__funding figure{margin-bottom:1em}.view-setup__funding p{margin:0 0 .5em 0}.view-setup__funding-link{margin:1em 0 0}@media(min-width:960px){.view-setup{padding-top:80px}.view-setup footer{margin-top:80px}.view-setup__steps{padding-bottom:80px}.view-setup__headline{margin:20px 0 40px;font-size:64px}.view-setup__continue.widget-button{width:auto!important;margin:25px 10px 0;padding:0 20px}.view-setup__description{max-width:550px;margin:1em auto;font-size:1.2em}.view-setup__funding{display:flex;margin:60px auto -20px;text-align:left}.view-setup__funding figure{margin-right:25px}}.setup__header{max-width:280px;margin-left:auto;margin-right:auto;padding:40px 0;text-align:center}.setup__header .widget-button{margin-top:1em}.setup__icon{background:var(--contao);border-radius:10px;padding:10px}.setup__headline{margin-top:20px;margin-bottom:25px;font-size:36px;font-weight:100;line-height:1}.setup__description,.setup__warning{margin:1em 0;text-align:justify}.setup__warning{color:var(--btn-alert);font-weight:600}.setup__form{position:relative;max-width:280px;margin:0 auto 50px;opacity:1}.setup__form svg.setup__check{display:block;width:80px;height:80px;margin:0 auto 2em;fill:var(--btn-primary)}.setup__form .widget-select,.setup__form .widget-text{margin-top:10px}.setup__form .widget-select label,.setup__form .widget-text label{display:block;margin-bottom:5px;font-weight:400}.setup__form .widget-checkbox{margin-top:20px;font-weight:400}.setup__form .widget-radio-button{margin-top:20px}.setup__fields{margin-bottom:2em}.setup__fields--center{text-align:center}.setup__fields .button-group .widget-button{margin-bottom:1px}.setup__fieldtitle{margin-bottom:.5em;font-size:18px;font-weight:600;line-height:30px}.setup__fielddesc{margin-bottom:1em;text-align:left}.setup__fielddesc code{word-break:break-word}.setup__actions{display:flex;flex-wrap:wrap;gap:10px}.setup__actions--center{justify-content:center}.setup__actions .button-group,.setup__actions .widget-button{flex-grow:1}.setup__actions .button-group--inline,.setup__actions .widget-button--inline{flex-grow:0}@media(min-width:960px){.setup{padding-top:100px}.setup__header{float:left;width:470px;max-width:none;padding:0 60px 50px}.setup__form{float:left;width:370px;max-width:none;margin:0 50px 50px}.setup__form .widget-select label,.setup__form .widget-text label{display:block;float:left;width:120px;padding-top:10px;font-weight:400}.setup__form .widget-select input,.setup__form .widget-select select,.setup__form .widget-text input,.setup__form .widget-text select{width:250px!important}}.config-check__header{max-width:280px;margin-left:auto;margin-right:auto;padding:40px 0;text-align:center}.config-check__icon{background:var(--contao);border-radius:10px;padding:10px}.config-check__headline{margin-top:20px;margin-bottom:25px;font-size:36px;font-weight:100;line-height:1}.config-check__description{text-align:justify}.config-check__form{position:relative;max-width:280px;margin:0 auto 50px}.config-check__form .widget-select,.config-check__form .widget-text{margin-top:20px}.config-check__form .widget-select label,.config-check__form .widget-text label{display:block;margin-bottom:5px;font-weight:400}.config-check__fields{margin-bottom:2em}.config-check__fieldtitle{margin-bottom:.5em;font-size:18px;font-weight:600;line-height:30px}.config-check__fielddesc{margin-bottom:1em}.config-check__issues{margin-bottom:1em;color:var(--btn-alert)}.config-check__issues p{font-weight:600}.config-check__issues ul{margin:0;padding:0}.config-check__issues li{margin:.5em 0 0 25px;padding:0}.config-check .widget-button{margin-bottom:.5em}@media(min-width:960px){.config-check{padding-top:100px}.config-check__header{float:left;width:470px;max-width:none;padding:0 60px 100px}.config-check__form{float:left;width:370px;max-width:none;margin:20px 50px 0;padding-bottom:100px}.config-check__form .widget-select label,.config-check__form .widget-text label{display:block;float:left;width:120px;padding-top:10px;font-weight:400}}.database-migration__header{margin-left:auto;margin-right:auto;padding:40px 0;text-align:center}.database-migration__icon{background:var(--contao);border-radius:10px;padding:10px}.database-migration__headline{margin-top:.5em;margin-bottom:.5em;font-size:36px;font-weight:100;line-height:1}.database-migration__description{margin:0 50px;font-weight:600}.database-migration__actions{display:flex;flex-direction:column;justify-content:center;align-items:center;margin-top:2em;padding:0 50px}@media(min-width:960px){.database-migration__actions{flex-direction:row}}.database-migration .widget-button{width:280px;height:35px;margin:5px;padding:0 30px;line-height:35px}@media(min-width:960px){.database-migration .widget-button{width:auto}}.database-migration__main{margin:0 50px 50px;background:#24292e}.database-migration__loading{width:30px;margin:40px auto}.database-migration__loading .sk-circle{width:30px;height:30px}.link-more{position:relative;display:inline-block}p:empty+.link-more{margin-left:0}.link-more button{width:auto;height:auto;padding:0 0 5px;background:transparent;color:var(--link);font-size:13px;font-weight:300;line-height:inherit;border:none;cursor:pointer}.link-more button:hover{text-decoration:underline}.link-more__menu{outline:none}.link-more ul{transform:translateX(-50%)}.package-link{display:flex;column-gap:8px;justify-content:space-between;width:100%;padding-bottom:4px;margin-bottom:4px;border-bottom:1px solid var(--border--light)}.package-link:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.package-link__details{padding:5px 0;line-height:18px}.package-link__name{display:inline;font-weight:600}.package-link__name:after{content:": "}.package-link__text{display:inline}.package-link__actions{display:flex;margin-left:20px;margin:0 -4px}.package-link__actions>*{margin:0 4px}.package-link--limit .package-link__details{display:flex}.package-link--limit .package-link__name{white-space:nowrap}.package-link--limit .package-link__text{display:-webkit-box;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical;padding:0 10px 0 5px}.package-funding[data-v-5a8fd14b]{padding:10px 20px 10px 50px;font-weight:400;font-size:12px;line-height:1.8;background:rgba(var(--funding-rgb),.025) url(../img/funding.cf78a0a0.svg) 15px 50% no-repeat;background-size:23px 23px;border:1px solid rgba(var(--funding-rgb),.5);border-radius:6px}.package-funding>div[data-v-5a8fd14b]{overflow:hidden}.package-funding span[data-v-5a8fd14b]{margin-right:15px}.package-funding a[data-v-5a8fd14b]{position:relative;display:inline-block;margin:0 20px 0 0;padding-left:16px;color:var(--funding);background:url(../img/link-funding.b25cd92d.svg) 0 50% no-repeat;background-size:13px 13px}.package-funding a[data-v-5a8fd14b]:before{content:"|";position:absolute;left:-12px}.package-funding a[data-v-5a8fd14b]:nth-child(2):before{content:none}.package-popup{position:fixed;display:flex;flex-direction:column;justify-content:flex-start;width:100%;max-width:none;height:100%;background:var(--popup-bg);z-index:10;opacity:1}.package-popup>*{flex-basis:auto;flex-grow:1}.package-popup__loader{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:50px 0}.package-popup__loader p{margin:1em}.package-popup__headline{position:relative;flex-grow:0;flex-shrink:1;padding:7px 30px 6px;background:var(--popup-hl-bg);color:#fff;font-size:18px;font-weight:300;line-height:1.5;text-align:center}.package-popup__button{display:block;float:right;position:absolute;top:0;margin:4px 0;padding:4px;background:none;border:1px solid transparent;border-radius:5px;cursor:pointer}.package-popup__button--previous{left:4px}.package-popup__button--close{right:4px}.package-popup__button svg{display:block;width:22px;height:22px}.package-popup__button:hover{background-color:#db6f00}.package-popup__summary{flex-grow:0;padding:25px 35px}@media(min-width:600px){.package-popup__summary{display:flex}}.package-popup__logo{border-radius:6px;float:right;height:60px;width:60px;margin-left:1em;background:#f7f7f7}@media(min-width:600px){.package-popup__logo{display:block;float:left;width:110px;height:110px;margin:-10px 16px 0 -10px}}.package-popup__icon{display:flex;align-items:center;justify-content:center;height:100%}.package-popup__icon--fallback{display:none}.package-popup__icon img{width:50px;height:50px;max-height:100%;object-fit:contain}@media(min-width:600px){.package-popup__icon img{width:90px;height:90px}}.package-popup__text{display:flex;flex-direction:column;flex-grow:1}@media(min-width:600px){.package-popup__text{width:200px}}.package-popup__title{margin:0;line-height:1.4;overflow-wrap:break-word}.package-popup__authors{flex-grow:1;font-size:13px;margin-bottom:.5em}.package-popup__author{display:inline-block;margin-right:2px}.package-popup__author:after{color:var(--text);content:", "}.package-popup__author:last-child:after{content:none}.package-popup__stats{display:inline-block;margin-right:15px;margin-top:.5em;padding-left:18px;font-size:13px;background-position:0 50%;background-repeat:no-repeat;background-size:13px 13px}.package-popup__stats--private{padding-left:20px;background-image:var(--svg--private);background-size:15px 15px}.package-popup__stats--updated{background-image:var(--svg--updated)}.package-popup__stats--downloads{background-image:var(--svg--downloads)}.package-popup__stats--favers{background-image:var(--svg--favers)}.package-popup__actions{display:flex;flex-direction:column;gap:10px;margin-top:1em}@media(min-width:600px){.package-popup__actions{justify-content:space-between;margin:0 0 0 25px;width:200px}}.package-popup__installed{margin-top:1em}.package-popup__abandoned{margin:0 0 20px;padding:10px 20px 10px 50px;font-weight:400;font-size:12px;line-height:1.8;background:rgba(var(--hint-rgb),.3) url(../img/hint.ba2ac97e.svg) 15px 50% no-repeat;background-size:23px 23px;border:1px solid var(--hint-link);border-radius:6px}.package-popup__funding{margin:0 0 20px}.package-popup__tabs{position:relative;flex-grow:revert}.package-popup__tabs:after,.package-popup__tabs:before{content:"";display:block;position:absolute;top:0;bottom:1px;width:7px;background:linear-gradient(-90deg,transparent 0,var(--popup-bg) 50%);z-index:1;pointer-events:none}.package-popup__tabs:after{background:linear-gradient(90deg,transparent 0,var(--popup-bg) 50%);right:0}.package-popup__tabs-list{flex-shrink:0;flex-grow:0;display:flex;column-gap:4px;height:40px;min-width:100%;overflow-x:auto;scrollbar-width:none;overflow-y:hidden;margin:0;padding:0 7px;list-style-type:none}.package-popup__tabs-list:after{content:"";position:absolute;inset:auto 0 0;height:1px;background:var(--border--light);z-index:-1}.package-popup__tab{position:relative;top:1px;flex-grow:1;padding:0;height:39px;line-height:39px;text-align:center;border:1px solid var(--border--light);border-top-left-radius:6px;border-top-right-radius:6px}.package-popup__tab--active{background:var(--tab-content);border-bottom:1px solid var(--tab-content)}.package-popup__tab button{display:flex;justify-content:center;align-items:center;width:100%;height:100%;margin:0;padding:0 10px;border:none;background:transparent;cursor:pointer}.package-popup__tab button:disabled{color:var(--border)!important;cursor:not-allowed}.package-popup__pill{position:relative;top:-2px;display:inline-block;margin-left:5px;padding:2px 5px;font-size:10px;font-weight:400;background:var(--border--light);border-radius:40%}.package-popup__pill--highlight{color:var(--clr-btn);background:var(--btn-primary)}.package-popup__tabcontent{position:relative;padding:25px 35px;overflow-y:auto;background:var(--tab-content);outline:0}@media(min-width:960px)and (min-height:700px){.package-popup__tabcontent{height:450px}}.package-popup__description{margin:1em 0;white-space:pre-wrap}@media(min-width:960px){.package-popup{position:relative;display:block;top:0;left:50%;width:750px;margin-left:-375px;height:auto;border-radius:8px;transform:none}.package-popup__headline{border-radius:8px 8px 0 0}.package-popup__tabcontent{border-radius:0 0 8px 8px}}@media(min-width:960px)and (min-height:700px){.package-popup{position:absolute;top:50%;transform:translateY(-50%)}}.package-popup__installed strong{margin-right:5px}@media(min-width:600px){.package-popup__installed{display:flex;flex-direction:column;justify-content:flex-end;text-align:center}.package-popup__installed strong{display:block;margin:0}}.package-popup__update{background:var(--btn-primary) url(../img/button-update.ad79c617.svg) 15px 50% no-repeat;background-size:23px 23px}.package-popup__incompatible,.package-popup__update{margin:0 0 20px;padding:10px 20px 10px 50px;color:var(--clr-btn);border-radius:var(--border-radius)}.package-popup__incompatible{background:var(--contao) url(../img/button-incompatible.3eb2b686.svg) 15px 50% no-repeat;background-size:23px 23px}.package-popup__funding+.package-popup__update{margin-top:-10px}.view-account__header{max-width:280px;margin-left:auto;margin-right:auto;padding:40px 0;text-align:center}.view-account__product{margin-top:15px;margin-bottom:40px;font-weight:600}.view-account__product strong{display:block;margin-bottom:10px;font-size:54px;font-weight:100;line-height:1}.view-account__headline{margin-bottom:.5em;font-size:18px;font-weight:600;line-height:30px}.view-account__description{margin-bottom:1em;text-align:justify}.view-account__form,.view-account__totp{position:relative;max-width:280px;margin:0 auto}.view-account__form .widget-button,.view-account__totp .widget-button{margin-top:1.5em}.view-account__form .widget-text{margin-top:10px}.view-account__form .widget-text label{display:block;padding-bottom:5px}.view-account__contribute{max-width:280px;margin:60px auto 0;font-size:12px;text-align:center}.view-account__contribute br{display:none}@media(min-width:960px){.view-account{display:flex;flex-flow:row wrap;align-items:center;padding-top:50px}.view-account__form,.view-account__header,.view-account__totp{padding:50px;width:50%;max-width:none}.view-account__form .widget-text label{float:left;width:120px;padding-top:10px;font-weight:400}.view-account__form input[type=password],.view-account__form input[type=text],.view-account__form select{width:250px!important}.view-account__form .button-group,.view-account__form .widget-button--anchor{width:250px;margin-left:120px}.view-account__contribute{max-width:840px}.view-account__contribute br{display:block}}.popup-overlay{position:fixed;inset:0;z-index:1000;background:var(--popup-overlay-bg)}@media(min-width:960px){.popup-overlay{padding:20px 0;overflow-y:auto}}.popup-overlay__popup{position:fixed;display:block;top:50%;left:50%;width:500px;max-width:90%;background:var(--popup-bg);z-index:10;opacity:1;transform:translate(-50%,-50%);border-radius:var(--border-radius);overflow:hidden}.popup-overlay__headline{position:relative;margin-bottom:0;padding:7px 30px 6px;background:var(--popup-hl-bg);font-size:18px;color:#fff;font-weight:300;line-height:1.5em;text-align:center}.popup-overlay__headline--primary{background-color:var(--btn-primary)}.popup-overlay__headline--alert{background-color:var(--btn-alert)}.popup-overlay__content{padding:2em 20px}.popup-overlay__actions{display:flex;justify-content:center;gap:10px;flex-wrap:wrap;padding:0 20px 2em}.popup-overlay__actions .widget-button{width:auto;height:35px;padding:0 30px;line-height:35px}@media(min-width:550px){.popup-overlay__actions,.popup-overlay__content{padding-left:40px;padding-right:40px}}.loader__item{float:left;width:16px;height:16px;margin-right:1px;background-color:var(--contao);animation:loading 1.4s ease-in-out infinite both}.loader__item--20{animation-delay:-.64s}.loader__item--40{animation-delay:-.48s}.loader__item--60{animation-delay:-.32s}.loader__item--80{animation-delay:-.16s}@keyframes loading{0%,90%,to{opacity:0}20%{opacity:1}}.loader__text{float:left;width:40px}.sk-circle{width:25px;height:25px;position:relative}.sk-circle .sk-child{width:100%;height:100%;position:absolute;left:0;top:0}.sk-circle .sk-child:before{content:"";display:block;margin:0 auto;width:15%;height:15%;background-color:var(--text);border-radius:100%;animation:sk-circleBounceDelay 1.2s ease-in-out infinite both}.sk-circle .sk-circle2{transform:rotate(30deg)}.sk-circle .sk-circle3{transform:rotate(60deg)}.sk-circle .sk-circle4{transform:rotate(90deg)}.sk-circle .sk-circle5{transform:rotate(120deg)}.sk-circle .sk-circle6{transform:rotate(150deg)}.sk-circle .sk-circle7{transform:rotate(180deg)}.sk-circle .sk-circle8{transform:rotate(210deg)}.sk-circle .sk-circle9{transform:rotate(240deg)}.sk-circle .sk-circle10{transform:rotate(270deg)}.sk-circle .sk-circle11{transform:rotate(300deg)}.sk-circle .sk-circle12{transform:rotate(330deg)}.sk-circle .sk-circle2:before{animation-delay:-1.1s}.sk-circle .sk-circle3:before{animation-delay:-1s}.sk-circle .sk-circle4:before{animation-delay:-.9s}.sk-circle .sk-circle5:before{animation-delay:-.8s}.sk-circle .sk-circle6:before{animation-delay:-.7s}.sk-circle .sk-circle7:before{animation-delay:-.6s}.sk-circle .sk-circle8:before{animation-delay:-.5s}.sk-circle .sk-circle9:before{animation-delay:-.4s}.sk-circle .sk-circle10:before{animation-delay:-.3s}.sk-circle .sk-circle11:before{animation-delay:-.2s}.sk-circle .sk-circle12:before{animation-delay:-.1s}@keyframes sk-circleBounceDelay{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.widget-button .loader{width:25px;margin:0 auto}.widget-button .sk-circle .sk-child:before{background-color:#fff}.loading-button{position:relative}.loading-button>.loader{position:absolute;left:calc(50% - 12.5px);top:calc(50% - 12.5px)}.loading-button>.loading{visibility:hidden}.link-menu{position:absolute;display:grid;grid-template:1fr/1fr;left:50%;gap:2px;margin:0;padding:2px;text-align:center;list-style-type:none;white-space:nowrap;background:var(--form-bg);border-top:3px solid var(--text);border-radius:5px;z-index:100;box-shadow:0 0 1px var(--shadow);outline:none}.link-menu:before{position:absolute;left:50%;top:-7px;width:0;height:0;margin-left:-4px;border-style:solid;border-width:0 3.5px 4px 3.5px;border-color:transparent transparent var(--text) transparent;content:""}.link-menu--align-left{left:0;right:auto}.link-menu--align-left:before{left:17px;right:auto}.link-menu--align-right{left:auto;right:0}.link-menu--align-right:before{left:auto;right:17px}.link-menu--valign-top{bottom:0;border-top:none;border-bottom:3px solid var(--text);box-shadow:0 0 2px var(--shadow)}.link-menu--valign-top:before{top:auto;bottom:-7px;border-width:4px 3.5px 0 3.5px;border-color:var(--text) transparent transparent transparent}.link-menu--contao{border-color:var(--contao)}.link-menu--contao:before{border-bottom-color:var(--contao)}.link-menu--contao.link-menu--valign-top:before{border-bottom-color:transparent;border-top-color:var(--contao)}.link-menu--primary{border-color:var(--btn-primary)}.link-menu--primary:before{border-bottom-color:var(--btn-primary)}.link-menu--primary.link-menu--valign-top:before{border-bottom-color:transparent;border-top-color:var(--btn-primary)}.link-menu--warning{border-color:var(--btn-warning)}.link-menu--warning:before{border-bottom-color:var(--btn-warning)}.link-menu--warning.link-menu--valign-top:before{border-bottom-color:transparent;border-top-color:var(--btn-warning)}.link-menu--alert{border-color:var(--btn-alert)}.link-menu--alert:before{border-bottom-color:var(--btn-alert)}.link-menu--alert.link-menu--valign-top:before{border-bottom-color:transparent;border-top-color:var(--btn-alert)}.link-menu__item{margin:0;padding:0;display:block}.link-menu__action{display:block;width:100%;border-radius:5px;padding:8px 16px;color:var(--text);font-size:inherit;text-align:center;background:none;border:none;cursor:pointer}.link-menu__action:hover{color:var(--text);background:var(--focus);text-decoration:none}.link-menu__action--active{font-weight:600;background:var(--focus)}.footer-languages{position:relative;display:inline-block}.footer-languages__toggle{width:auto;height:auto;padding:0 0 0 25px;background:transparent;color:var(--text);font-size:12px;font-weight:300;line-height:20px;background:var(--svg--language) left center no-repeat;background-size:20px 20px;border:none;cursor:pointer}.footer-languages__toggle:hover{color:var(--black)}.footer-languages__menu{display:grid;grid-template:auto/1fr 1fr;bottom:25px;white-space:nowrap;transform:translateX(-50%)}.footer-languages__menu button{margin:0;padding:6px;text-align:left;font-size:inherit}.theme-switch{position:relative;display:inline-block}.theme-switch button{width:auto;height:auto;padding:0 0 0 24px;background:transparent;color:var(--text);font-size:12px;font-weight:300;line-height:20px;background:var(--svg--color-scheme) left center no-repeat;background-size:20px 20px;border:none;cursor:pointer}.theme-switch button:hover{color:var(--black)}.package-logo--fallback[data-v-9c1c5f6c]{display:flex;justify-content:center;align-items:center}svg[data-v-9c1c5f6c]{width:80px;height:80px;fill:#ccc}.discover-package{display:flex;flex-direction:column;position:relative;overflow:hidden;background:var(--tiles-bg);border:1px solid var(--tiles-bdr);border-radius:14px}.discover-package.is--hint{border-color:var(--border--light)}.discover-package.is--hint .discover-package__inside>*{opacity:.65}.discover-package__hint{position:relative;background:var(--border--light);padding:8px 16px;font-weight:400;font-size:12px;line-height:1.2;z-index:1}.discover-package__hint p a{display:inline-block;padding-right:10px}.discover-package__hint p a:first-child{margin-left:10px}.discover-package__hint p a:not(:first-child):before{padding-right:10px;content:"|"}.discover-package__inside{flex-grow:1;padding:16px}.discover-package__abandoned{display:inline-block;margin-bottom:1em;padding:2px 5px;color:#fff;font-size:12px;font-weight:600;background:var(--btn-alert);cursor:help;z-index:10}@media(min-width:600px){.discover-package__abandoned{position:absolute;top:20px;left:-25px;padding:2px 30px;border-top:1px solid var(--btn-alert-active);transform:rotate(-45deg)}}.discover-package__icon{border-radius:6px;height:60px;width:60px;background:#f7f7f7;margin:0 auto 10px;position:absolute;right:16px}.discover-package__icon>figure{display:flex;align-items:center;justify-content:center;height:100%;max-height:140px}.discover-package__icon img,.discover-package__icon svg{border-radius:4px;width:50px;height:50px;max-height:100%;object-fit:contain}.discover-package__details{display:flex;flex-direction:column;justify-content:space-between;min-height:96px}.discover-package__headline{margin-bottom:.2em;line-height:1;overflow-wrap:break-word;margin-right:70px}.discover-package__headline em{background-color:var(--highlight-bg);color:var(--highlight-color);font-style:normal}.discover-package__versions{display:flex;flex-wrap:wrap;gap:5px;list-style:none;margin:5px 0;padding:0}.discover-package__version{display:inline-flex;justify-content:center;padding:3px 5px;border-radius:4px;line-height:1;min-width:40px;font-size:13px;color:#fff;background:var(--badge-bg);pointer-events:none}.discover-package__description{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:1em;margin-right:70px}.discover-package__description em{background-color:var(--highlight-bg);color:var(--highlight-color);font-style:normal}.discover-package__more{display:flex;flex-flow:row wrap;align-items:flex-end;flex-grow:1;gap:4px;line-height:28px}.discover-package__counts{flex-grow:1;justify-content:flex-start}.discover-package__count{display:inline-block;margin-right:15px;padding-left:18px;font-size:13px;background-position:0 50%;background-repeat:no-repeat;background-size:13px 13px}.discover-package__count--private{background-image:var(--svg--private)}.discover-package__count--updated{background-image:var(--svg--updated)}.discover-package__count--downloads{background-image:var(--svg--downloads)}.discover-package__count--favers{background-image:var(--svg--favers)}.discover-package__actions{flex-grow:1;display:flex;justify-content:flex-end;gap:8px}@media(max-width:599.98px){.discover-package__headline-container{display:flex;flex-direction:column-reverse}}@media(min-width:600px){.discover-package__inside{text-align:initial;display:flex;padding:0}.discover-package__icon{width:130px;height:100%;min-height:130px;margin:0;border-radius:0;position:revert;right:revert}.discover-package__icon img{width:100px;height:100px}.discover-package__icon svg{width:90px;height:90px}.discover-package__details{padding:16px;height:100%;min-height:90px;max-width:calc(100% - 130px);flex:1}.discover-package__versions{float:right;margin:-3px 0 0 16px}.discover-package__description,.discover-package__headline{margin-right:0}.discover-package__more{flex-direction:row}.discover-package__actions{justify-content:end}}.vueperslide{white-space:normal;background-size:cover;flex-shrink:0;display:block;width:100%;position:relative}.vueperslide--clone-1{position:absolute;top:0;bottom:0;right:100%}.vueperslides--rtl .vueperslide--clone-1{right:auto;left:100%}.vueperslide[href]{-webkit-user-drag:none}.vueperslide__image{background-size:cover}.vueperslide__image,.vueperslide__loader{position:absolute;top:0;left:0;right:0;bottom:0}.vueperslide__loader{display:flex;flex-direction:column;align-items:center;justify-content:center}.vueperslide__content-wrapper:not(.vueperslide__content-wrapper--outside-top):not(.vueperslide__content-wrapper--outside-bottom){height:100%;margin:auto}.vueperslides--fade .vueperslide{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;transition:opacity ease-in-out;transition-duration:inherit}.vueperslides--fade .vueperslide--active,.vueperslides--fade .vueperslide--visible{z-index:1;opacity:1}.vueperslides--slide-image-inside .vueperslide{overflow:hidden}.vueperslides--3d .vueperslide{position:absolute;z-index:-1;height:100%}.vueperslides--3d .vueperslide--active,.vueperslides--3d .vueperslide--next-slide,.vueperslides--3d .vueperslide--previous-slide{z-index:0}.vueperslides--3d .vueperslide--active{z-index:1}.vueperslides--3d .vueperslide[face=front]{transform:rotateY(90deg) translate(-50%) rotateY(-90deg)}.vueperslides--3d .vueperslide[face=right]{transform:rotateY(90deg) translate(50%);transform-origin:100% 0}.vueperslides--3d .vueperslide[face=back]{transform:rotateY(270deg) translate(-50%) rotateY(-90deg)}.vueperslides--3d .vueperslide[face=left]{transform:rotateY(270deg) translate(-50%);transform-origin:0 0}.vueperslides:not(.no-shadow):not(.vueperslides--3d) .vueperslides__parallax-wrapper:after,.vueperslides:not(.no-shadow):not(.vueperslides--3d) .vueperslides__parallax-wrapper:before{content:"";position:absolute;bottom:100%;left:-1em;right:-1em;height:2em;box-shadow:0 0 20px #00000040;z-index:2}.vueperslides:not(.no-shadow):not(.vueperslides--3d) .vueperslides__parallax-wrapper:after{top:100%;bottom:auto}.vueperslides__arrows{color:#fff}.vueperslides__arrows--outside{color:currentColor}.vueperslides__arrow{top:50%;background-color:transparent;border:none;opacity:.7}.vueperslides--rtl .vueperslides__arrow--next,.vueperslides__arrow--prev{right:auto;left:.5em}.vueperslides--rtl .vueperslides__arrow--prev,.vueperslides__arrow--next{left:auto;right:.5em}.vueperslides__arrow:hover{opacity:1}.vueperslides--rtl .vueperslides__arrows--outside .vueperslides__arrow--next,.vueperslides__arrows--outside .vueperslides__arrow--prev{right:auto;left:-3.5em}.vueperslides--rtl .vueperslides__arrows--outside .vueperslides__arrow--prev,.vueperslides__arrows--outside .vueperslides__arrow--next{left:auto;right:-3.5em}.vueperslides__paused{top:.7em;right:.7em;opacity:0;text-shadow:0 0 3px rgba(0,0,0,.4);z-index:1}.vueperslides:hover .vueperslides__paused{opacity:1}.vueperslides__bullets:not(.vueperslides__bullets--outside){color:#fff}.vueperslides__bullet{margin:1.5em .6em;padding:0;border:none;background:none}.vueperslides__bullet .default{width:12px;height:12px;border-radius:12px;border:1px solid currentColor;background-color:transparent;box-shadow:0 0 1px #00000080,0 0 3px #0000004d;transition:.4s ease-in-out;box-sizing:border-box}.vueperslides__bullet .default span{display:none}.vueperslides__bullet--active .default{border-width:6px}.vueperslide,.vueperslide__image{background-position:50%}.vueperslide__video{outline:none}.vueperslide--no-pointer-events:before{content:"";position:absolute;top:0;bottom:0;left:0;right:0}.vueperslide__content-wrapper:not(.vueperslide__content-wrapper--outside-top):not(.vueperslide__content-wrapper--outside-bottom){display:flex;flex:1 1 auto;flex-direction:column;align-items:center;justify-content:center;text-align:center}.vueperslide--has-image-inside .vueperslide__content-wrapper,.vueperslide--has-video .vueperslide__content-wrapper,.vueperslide__content-wrapper.parallax-fixed-content{position:absolute;z-index:2;top:0;bottom:0;left:0;right:0;display:flex;flex-direction:column;justify-content:center;align-items:center;pointer-events:none}.vueperslides{position:relative}.vueperslides--fixed-height .vueperslide,.vueperslides--fixed-height .vueperslides__inner,.vueperslides--fixed-height .vueperslides__parallax-wrapper{height:inherit}.vueperslides--fixed-height .vueperslides__parallax-wrapper{padding-bottom:0!important}.vueperslides--fixed-height.vueperslides--bullets-outside{margin-bottom:4em}.vueperslides__inner{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vueperslides__parallax-wrapper{position:relative;overflow:hidden}.vueperslides--3d .vueperslides__parallax-wrapper{overflow:visible}.vueperslides__track{position:absolute;top:0;height:100%;left:0;right:0;overflow:hidden;z-index:1}.vueperslides--parallax .vueperslides__track{height:200%;transform:translateY(0)}.vueperslides--touchable .vueperslides__track{cursor:ew-resize;cursor:grab}.vueperslides--touchable .vueperslides__track--dragging,.vueperslides--touchable .vueperslides__track--mousedown{cursor:grabbing}.vueperslides--3d .vueperslides__track{overflow:visible;perspective:100em}.vueperslides__track-inner{white-space:nowrap;transition:transform .5s ease-in-out;height:100%;display:flex}.vueperslides--no-animation .vueperslides__track-inner{transition-duration:0s!important}.vueperslides--fade .vueperslides__track-inner{white-space:normal;transition:none}.vueperslides--3d .vueperslides__track-inner{transform-style:preserve-3d}.vueperslides__track--mousedown .vueperslides__track-inner{transition:transform .25s ease-in-out!important}.vueperslides__track--dragging .vueperslides__track-inner{transition:none}.vueperslides__arrow{position:absolute;font-size:inherit;color:inherit;text-align:center;transform:translateY(-50%);transition:.3s ease-in-out;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;outline:none;z-index:2;line-height:1}.vueperslides__arrow svg{vertical-align:middle;stroke:currentColor;fill:none;width:3.5em;padding:1em;stroke-width:1;transition:.3s ease-in-out;box-sizing:border-box}.vueperslides__arrow svg:hover{stroke-width:1.3}.vueperslides__paused{position:absolute;transition:.3s ease-in-out}.vueperslides__bullets{display:flex;justify-content:center;position:absolute;bottom:0;left:0;right:0}.vueperslides__bullets--outside{position:relative}.vueperslides__bullet,.vueperslides__bullets button{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;outline:none;z-index:2;display:flex;justify-content:center;align-items:center;color:inherit}.vueperslides__bullet::-moz-focus-inner,.vueperslides__bullets button::-moz-focus-inner{border:0}.vueperslides__fractions{position:absolute;top:.8em;left:.5em;z-index:2;padding:.2em 1em;border:1px solid hsla(0,0%,100%,.5);border-radius:2em;background:#fff3;color:#fff}.vueperslides__progress{position:absolute;top:0;left:0;right:0;z-index:2;height:6px;color:#000000b3}.vueperslides__progress>*{position:absolute;top:0;bottom:0;left:0;background:currentColor;transition:.3s ease-in-out}@media(min-width:1200px){.ads{margin:59px 0 69px}}.ads .link{padding-top:5px;text-align:right}.ads .link a{padding-left:16px;font-size:.8em;color:inherit;background:var(--svg--link-blank) left center no-repeat;background-size:13px 13px}.ads .container{position:relative;background:var(--popup-bg);box-shadow:var(--ad-shadow);border-radius:14px;overflow:hidden}.ads .container a,.ads .container img{display:block}.ads .container img{width:100%;aspect-ratio:2}.vueperslides__arrow:focus-visible{outline:5px auto Highlight!important;outline:5px auto -webkit-focus-ring-color!important}.package-sorting{margin:20px 0 15px;text-align:right}.package-sorting__label{display:inline-block;text-transform:uppercase}.package-sorting__label:after{content:":"}.package-sorting__group{position:relative;display:inline-flex;flex-direction:column;margin:0;padding:0 15px 0 0;list-style-type:none;text-align:left}.package-sorting__group:after{content:"";position:absolute;top:.8em;right:0;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #777}.package-sorting__item{display:none;margin:0 0 0 10px;padding:3px 0;border-bottom:2px solid transparent}.package-sorting__item:hover{color:var(--link)}.package-sorting__item--open{display:inline}.package-sorting__item--active{display:inline;color:var(--link);border-bottom:2px solid var(--link)}.package-sorting__item button{margin:0;padding:0;background:none;border:none;text-transform:uppercase;cursor:pointer}@media(min-width:600px){.package-sorting__group{flex-direction:row;justify-content:flex-end;padding:0}.package-sorting__group:after{content:none}.package-sorting__item{display:inline}}.search-bar{position:relative}.search-bar__input{height:50px!important;padding-right:45px!important;border-radius:50px!important}.search-bar__button{position:absolute;top:5px;right:5px;display:flex;align-items:center;width:38px;height:40px;margin:0;padding:7px;line-height:36px;border:none;border-radius:0 50px 50px 0;background:none}.package-search{position:relative}.package-search__input{max-width:400px;margin:0 20px}@media(min-width:1024px){.package-search__input{margin-right:0}}.package-search__headline{font-size:18px;font-weight:300;margin:30px 0 10px}.package-search__results{display:grid;gap:20px;margin-bottom:20px}@media(min-width:1024px){.package-search__results{grid-template-columns:repeat(2,1fr)}}.package-search__status{margin:100px 0;text-align:center;font-size:20px;line-height:1.5em}.package-search__status--empty{padding-top:140px;background:url(../img/sad.c7de6e95.svg) top no-repeat;background-size:100px 100px}.package-search__status--offline{padding-top:140px;background:url(../img/offline.0c23d1ce.svg) top no-repeat;background-size:100px 100px}.package-search__status--loader .sk-circle{width:100px;height:100px;margin:0 auto 40px}.package-search__status button{margin-top:2em}.package-search__explain{font-size:16px}.package-search__more{margin:10px 0 30px;text-align:center}.package-search__more-button{display:inline-block;margin:0 auto;padding:0;text-transform:uppercase;background:none;border:none;cursor:pointer}.package-search__more-button:hover{text-decoration:underline}.package-search__algolia{display:block;width:200px;margin:50px auto 0}.vjs-tree-brackets{cursor:pointer}.vjs-tree-brackets:hover{color:#1890ff}.vjs-check-controller{position:absolute;left:0}.vjs-check-controller.is-checked .vjs-check-controller-inner{background-color:#1890ff;border-color:#0076e4}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-checkbox:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-radio:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.vjs-check-controller .vjs-check-controller-inner{display:inline-block;position:relative;border:1px solid #bfcbd9;border-radius:2px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;width:16px;height:16px;background-color:#fff;z-index:1;cursor:pointer;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.vjs-check-controller .vjs-check-controller-inner:after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:2px solid #fff;border-left:0;border-top:0;height:8px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:4px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;-webkit-transform-origin:center;transform-origin:center}.vjs-check-controller .vjs-check-controller-inner.is-radio{border-radius:100%}.vjs-check-controller .vjs-check-controller-inner.is-radio:after{border-radius:100%;height:4px;background-color:#fff;left:50%;top:50%}.vjs-check-controller .vjs-check-controller-original{opacity:0;outline:none;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.vjs-carets{position:absolute;right:0;cursor:pointer}.vjs-carets svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.vjs-carets:hover{color:#1890ff}.vjs-carets-close{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.vjs-tree-node{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;line-height:20px}.vjs-tree-node.has-carets{padding-left:15px}.vjs-tree-node.has-carets.has-selector,.vjs-tree-node.has-selector{padding-left:30px}.vjs-tree-node.is-highlight,.vjs-tree-node:hover{background-color:#e6f7ff}.vjs-tree-node .vjs-indent{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.vjs-tree-node .vjs-indent-unit{width:1em}.vjs-tree-node .vjs-indent-unit.has-line{border-left:1px dashed #bfcbd9}.vjs-tree-node.dark.is-highlight,.vjs-tree-node.dark:hover{background-color:#2e4558}.vjs-node-index{position:absolute;right:100%;margin-right:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vjs-colon{white-space:pre}.vjs-comment{color:#bfcbd9}.vjs-value{word-break:break-word}.vjs-value-null,.vjs-value-undefined{color:#d55fde}.vjs-value-boolean,.vjs-value-number{color:#1d8ce0}.vjs-value-string{color:#13ce66}.vjs-tree{font-family:Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace;font-size:14px;text-align:left}.vjs-tree.is-virtual{overflow:auto}.vjs-tree.is-virtual .vjs-tree-node{white-space:nowrap}[data-notivue=promise-resolve],[data-notivue=success]{--nv-bg:var(--nv-success-bg);--nv-fg:var(--nv-success-fg);--nv-accent:var(--nv-success-accent,var(--nv-global-accent));--nv-border:var(--nv-success-border)}[data-notivue=error],[data-notivue=promise-reject]{--nv-bg:var(--nv-error-bg);--nv-fg:var(--nv-error-fg);--nv-accent:var(--nv-error-accent,var(--nv-global-accent));--nv-border:var(--nv-error-border)}[data-notivue=warning]{--nv-bg:var(--nv-warning-bg);--nv-fg:var(--nv-warning-fg);--nv-accent:var(--nv-warning-accent,var(--nv-global-accent));--nv-border:var(--nv-warning-border)}[data-notivue=info]{--nv-bg:var(--nv-info-bg);--nv-fg:var(--nv-info-fg);--nv-accent:var(--nv-info-accent,var(--nv-global-accent));--nv-border:var(--nv-info-border)}[data-notivue=promise]{--nv-bg:var(--nv-promise-bg);--nv-fg:var(--nv-promise-fg);--nv-accent:var(--nv-promise-accent,var(--nv-global-accent));--nv-border:var(--nv-promise-border)}.Notivue__notification{--tip-width:calc(var(--tip-width-fx, 1)*var(--nv-tip-width, 0px));box-sizing:border-box;position:relative;width:var(--nv-min-width,auto);max-width:var(--nv-width,100%);background-color:var(--nv-bg,var(--nv-global-bg));display:flex;align-items:var(--nv-y-align);border-radius:var(--nv-radius,0);border:var(--nv-border-width,0) solid var(--nv-border,var(--nv-global-border));box-shadow:var(--nv-shadow,0 0 transparent),inset var(--tip-width) 0 0 var(--nv-accent)}.Notivue__notification *{box-sizing:border-box;touch-action:manipulation}.Notivue__notification[data-notivue-has-title=true]{align-items:var(--nv-y-align-has-title,var(--nv-y-align))}.Notivue__icon{display:flex;justify-content:center;align-items:center;overflow:visible;min-width:var(--nv-icon-size);width:var(--nv-icon-size);height:var(--nv-icon-size);margin:var(--nv-spacing) 0 var(--nv-spacing) var(--nv-spacing);color:var(--nv-accent)}.Notivue__content{--nv-content-space:calc(var(--nv-spacing) + var(--nv-spacing)*0.15);display:flex;flex-direction:column;flex-grow:1;text-align:inherit;padding:var(--nv-content-space)}.Notivue__content-title{line-height:1.15;font-weight:700;color:var(--nv-fg,var(--nv-global-fg));font-size:var(--nv-title-size);margin:0 0 .33em;padding:0}.Notivue__transition-enter-active{--dur-easing:.5s cubic-bezier(.16,1,.3,1);transition:opacity var(--dur-easing),transform var(--dur-easing)}@media (prefers-reduced-motion:reduce){.Notivue__transition-enter-active{transition:none}}.Notivue__transition-enter-from{opacity:0;transform:scale(.8)}.Notivue__transition-enter-to{opacity:1;transform:scale(1)}.Notivue__transition-leave-active{transition:opacity 0ms ease}.Notivue__transition-leave-from,.Notivue__transition-leave-to{opacity:0}.Notivue__content-message{max-height:250px;overflow:auto;line-height:1.375;margin:0;padding:0;white-space:pre-line}.Notivue__close,.Notivue__content-message{color:var(--nv-fg,var(--nv-global-fg));font-size:var(--nv-message-size)}.Notivue__close{position:relative;cursor:pointer;padding:calc(var(--nv-spacing)/2);margin:var(--nv-spacing) var(--nv-spacing) var(--nv-spacing) 0;font-weight:700;border:none;background:none;line-height:1;-webkit-tap-highlight-color:rgba(0,0,0,0)}.Notivue__close:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:var(--nv-fg,var(--nv-global-fg));opacity:0;border-radius:calc(var(--nv-radius)/2);transition:opacity .1s ease-out}@media (hover:hover){.Notivue__close:hover{opacity:1}.Notivue__close:hover:after{opacity:.1}.Notivue__close:hover .Notivue__close-icon{opacity:1}}.Notivue__close-icon{width:var(--nv-icon-size);height:var(--nv-icon-size);display:flex;color:var(--nv-fg,var(--nv-global-fg));pointer-events:none;opacity:.65}.Notivue__spinner{transform-origin:center;animation:Notivue__spinner-kf .75s linear infinite}@keyframes Notivue__spinner-kf{to{transform:rotate(1turn)}}@media (prefers-reduced-motion:reduce){.Notivue__duplicate,.Notivue__spinner{animation:none}}[dir=rtl] .Notivue__notification{--tip-width-fx:-1}[dir=rtl] .Notivue__icon{margin:var(--nv-spacing) var(--nv-spacing) var(--nv-spacing) 0}[dir=rtl] .Notivue__content-message{font-size:calc(var(--nv-message-size) + .1em)}[dir=rtl] .Notivue__content-title{font-size:calc(var(--nv-title-size) + .1em)}[dir=rtl] .Notivue__close{margin:var(--nv-spacing) 0 var(--nv-spacing) var(--nv-spacing)}.Notivue__duplicate{animation:Notivue__duplicate-kf .3s cubic-bezier(.16,1,.3,1) forwards}@keyframes Notivue__duplicate-kf{0%{transform:scale(1);opacity:1}50%{transform:scale(1.035);opacity:.8}to{transform:scale(1);opacity:1}}[data-notivue-align=top] .Notivue__enter,[data-notivue-align=top] .Notivue__leave{--notivue-ty:-200%}[data-notivue-align=bottom] .Notivue__enter,[data-notivue-align=bottom] .Notivue__leave{--notivue-ty:200%}.Notivue__enter{animation:Notivue__enter-kf .35s cubic-bezier(.5,1,.25,1)}.Notivue__leave{animation:Notivue__leave-kf .35s ease}.Notivue__clearAll{animation:Notivue__clearAll-kf .5s cubic-bezier(.22,1,.36,1)}@keyframes Notivue__enter-kf{0%{transform:translate3d(0,var(--notivue-ty),0) scale(.25);opacity:0}to{transform:translateZ(0) scale(1);opacity:1}}@keyframes Notivue__leave-kf{0%{transform:translateZ(0) scale(1);opacity:.7}to{transform:translate3d(0,var(--notivue-ty),0) scale(0);opacity:0}}@keyframes Notivue__clearAll-kf{0%{opacity:1}to{opacity:0}}"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[523],{523:function(e){e.exports=JSON.parse('{"ui.app.title":"Contao Erweiterungen","ui.app.loading":"Lade Erweiterungsliste …","ui.app.language":"Sprache für den Contao Manager wechseln","ui.app.colorDark":"Dunkles Design","ui.app.colorDarkTitle":"Farbschema auf dunkel umstellen","ui.app.colorLight":"Helles Design","ui.app.colorLightTitle":"Farbschema auf hell umstellen","ui.discover.advertisement":"Anzeigen in der Erweiterungsliste","ui.discover.loading":"Laden …","ui.discover.offline":"Konnte keine Ergebnisse laden.","ui.discover.offlineExplain":"Prüfe deine Internet-Verbindung und deaktiviere alle JavaScript-Blocker.","ui.discover.offlineButton":"Erneut versuchen","ui.discover.searchPlaceholder":"{count} Erweiterungen durchsuchen …","ui.discover.empty":"Keine Ergebnisse für {query}","ui.discover.more":"Mehr Resultate","ui.discover.sortBy":"Sortieren nach","ui.discover.sortReleased":"Veröffentlicht","ui.discover.sortReleasedTitle":"Ergebnisse nach der Veröffentlichung sortieren","ui.discover.sortLatest":"Aktualisiert","ui.discover.sortLatestTitle":"Ergebnisse nach der letzten Aktualisierung sortieren","ui.discover.sortDownloads":"Downloads","ui.discover.sortDownloadsTitle":"Ergebnisse nach Anzahl Downloads sortieren","ui.discover.sortFavers":"Bewertung","ui.discover.sortFaversTitle":"Ergebnisse nach Bewertung sortieren","ui.discover.detailsButton":"Details","ui.discover.latestPackages":"Neuste und aktualisierte Erweiterungen","ui.discover.faversPackages":"Bestbewertete Erweiterungen","ui.discover.downloadsPackages":"Meistgeladene Erweiterungen","ui.discover.exactHit":"Exakte Übereinstimmung der Suchanfrage","ui.discover.results":"Weitere Suchergebnisse","ui.package.homepage":"Projektwebseite","ui.package.private":"Privates Paket","ui.package.privateTitle":"Private Pakete sind nur vom jeweiligen Hersteller verfügbar (z.B. als ZIP-Download). Besuche die Webseite für weitere Informationen.","ui.package.abandoned":"verwaist","ui.package.abandonedText":"Diese Erweiterung ist verwaist und wird nicht mehr gepflegt.","ui.package.abandonedReplace":"Diese Erweiterung ist verwaist und wird nicht mehr gepflegt. Der Autor empfiehlt stattdessen das Paket {replacement} zu verwenden.","ui.package.contaoVersion":"Verfügbar für Contao","ui.package-details.previous":"Details der vorherigen Erweiterung","ui.package-details.close":"Details der Erweiterung schließen","ui.package-details.loading":"Laden …","ui.package-details.tabDescription":"Beschreibung","ui.package-details.tabRequire":"Abhängigkeiten","ui.package-details.tabFeatures":"Funktionen","ui.package-details.tabSuggest":"Empfehlungen","ui.package-details.tabConflict":"Konflikte","ui.package-details.tabDependents":"Abhängige","ui.package-details.linkRequires":"benötigt","ui.package-details.linkReplaces":"ersetzt","ui.package-details.linkProvides":"liefert","ui.package-details.linkConflicts":"inkompatibel mit","ui.package-details.funding":"Weiterentwicklung finanzieren!","ui.package-details.contaoVersions":"Unterstützte Contao-Version(en)","ui.package-details.latest":"Neuste Version","ui.package-details.released":"veröffentlicht am","ui.package-details.license":"Lizenz(en)","ui.package-details.authors":"von","ui.package-details.more":"Mehr","ui.package-details.packagist":"Paketdetails","ui.package-details.metadata":"Metadaten bearbeiten","ui.package-details.support_docs":"Dokumentation","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Support-Forum","ui.package-details.support_issues":"Fehler melden","ui.package-details.support_source":"Quellcode","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Support E-Mail","ui.package-details.support_rss":"RSS-Feed"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[28],{4028:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! ä¸å®‰å…¨è¿žæŽ¥ !!","ui.app.httpsDescription":"没有HTTPS情况下,机密数æ®å°†ä¼šæœªåŠ å¯†ä¼ è¾“ã€‚","ui.app.httpsLink":"更多信æ¯","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Safe Mode enabled !!","ui.app.safeModeDescription":"Some features of the Contao Manager are not available.","ui.app.safeModeExit":"Exit Safe Mode","ui.app.loading":"加载 Contao 管ç†å™¨ …","ui.app.apiError":"æ„外的API状æ€","ui.app.configSecurity1":"安全警报 !!! 检测到未å—ä¿æŠ¤çš„é…置目录","ui.app.configSecurity2":"Contao管ç†å™¨æ£€æµ‹åˆ°å…¶é…置文件å¯ä»¥å…¬å¼€è®¿é—®ã€‚目录å—åˆ°ä¿æŠ¤ä¹‹å‰ä¼šç¦æ­¢æ‰€æœ‰æ“作,å¦åˆ™æ”»å‡»è€…å¯ä»¥è®¿é—®å®‰è£…çš„æ•æ„Ÿæ•°æ®ã€‚\\n\\n为了修å¤è¿™ä¸ªé—®é¢˜ï¼Œè¯·ç¡®ä¿é˜»æ­¢è®¿é—®æœåŠ¡å™¨ä¸Šçš„\\"contao-manager\\"目录。è¦äº†è§£å¦‚何执行此æ“作,请å‚阅您的网络æœåŠ¡å™¨æ‰‹å†Œæˆ–è”系您的托管æœåŠ¡æä¾›å•†ã€‚","ui.account.welcome":"欢迎","ui.account.intro1":"Welcome to the Contao Manager, a universal tool to install and manage Contao Open Source CMS. If you are new to it, please {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} to get started","ui.account.introManual":"read the manual","ui.account.intro2":"If you encounter any problems, check {ourGithubIssues} and feel free to create new one for anything that has not been reported yet.","ui.account.introIssues":"our GitHub issues","ui.account.headline":"用户账户","ui.account.description":"为了管ç†å®‰è£…,请为Contao管ç†å™¨åˆ›å»ºä¸€ä¸ªè´¦å·ã€‚请注æ„该账å·å’ŒContaoåŽå°å’Œå‰ç«¯æ²¡æœ‰å…³è”。","ui.account.username":"用户å","ui.account.password":"密ç ","ui.account.passwordPlaceholder":"最少8个字符","ui.account.passwordLength":"请输入最少8个字符","ui.account.submit":"创建账å·","ui.account.contribute1":"Contao and the Contao Manager are sponsored by the non-profit Contao Association.","ui.account.contribute2":"Please consider contributing to open source by {donate}.","ui.account.contributeDonate":"making a donation","ui.login.headline":"登录","ui.login.description":"登录æ¥ç®¡ç†å®‰è£…。","ui.login.username":"用户å","ui.login.password":"密ç ","ui.login.forgotPassword":"忘记密ç ","ui.login.button":"登录","ui.login.locked":"Access has been denied because the Contao Manager is locked. To unlock, delete the {lockFile} file in your Contao root directory.","ui.logout.headline":"会è¯è¶…æ—¶","ui.logout.warning":"超过25分钟没有活动。安全原因您的会è¯å°†å¾ˆå¿«è¢«ç»ˆæ­¢ã€‚","ui.logout.expired":"由于超过30分钟没有活动,您的会è¯å·²è‡ªåŠ¨ç»ˆæ­¢ã€‚","ui.logout.renew":"ä¿æŒç™»å…¥","ui.logout.logout":"注销","ui.logout.login":"返回登录","ui.oauth.error":"无效的OAuthå°è¯•ã€‚æ£€æŸ¥è¯·æ±‚å‚æ•°ã€‚","ui.oauth.https":"The redirect URI MUST use a secure protocol (https:) to prevent the authentication token from being transmitted in clear-text.","ui.oauth.headline":"Remote Authentication","ui.oauth.description":"ä»¥ä¸‹åº”ç”¨ç¨‹åºæˆ–者æœåŠ¡æ­£åœ¨è¯·æ±‚å¯¹æ‚¨çš„Contao Manager实例远程访问。","ui.oauth.domain":"Before allowing access, make sure you know this URL and trust its owner!","ui.oauth.allow":"å…许访问","ui.oauth.deny":"æ‹’ç»è®¿é—®","ui.boot.headline":"系统检查","ui.boot.description":"请ç¨ç­‰ï¼Œæ­£åœ¨åˆ†æžæ‚¨çš„æœåŠ¡å™¨ …","ui.boot.issue1":"监测到安装问题","ui.boot.issue2":"Your installation has issues that have to be fixed before the Contao Manager can be used.","ui.boot.run":"è¿è¡ŒContao管ç†å™¨","ui.boot.safeMode":"安全模å¼ä¸‹è¿è¡Œ","ui.recovery.headline":"系统æ¢å¤","ui.recovery.description":"The Contao Manager detected files that look like Contao, but the Command Line Interface does not work as expected.","ui.recovery.console":"Console Output","ui.recovery.repairOptions":"Please choose an option to repair your installation.","ui.recovery.repairHeadline":"自动修å¤","ui.recovery.repairDescription":"å°è¯•通过é‡å»ºåº”ç”¨ç¼“å­˜å¹¶é‡æ–°å®‰è£…Composer包æ¥è‡ªåŠ¨ä¿®å¤å®‰è£…。","ui.recovery.repairWarning":"此过程å¯èƒ½ä¼šåˆ é™¤vendor中文件的任何修改!","ui.recovery.repairFailed":"è‡ªåŠ¨ä¿®å¤æ²¡æœ‰æˆåŠŸã€‚è¯·å°è¯•å®‰å…¨æ¨¡å¼æ‰‹åŠ¨ä¿®å¤å®‰è£…。","ui.recovery.repairButton":"è¿è¡Œç³»ç»Ÿä¿®å¤","ui.recovery.safeModeHeadline":"安全模å¼","ui.recovery.safeModeDescription":"安全模å¼ä¸‹è¿è¡ŒContao管ç†å™¨å…许管ç†åŒ…å¹¶è¿è¡ŒæŸäº›ç»´æŠ¤ä»»åŠ¡ï¼Œä½†ä¾èµ–于正在è¿è¡Œçš„Contao安装的功能将ä¸å¯ç”¨ã€‚","ui.recovery.safeModeButton":"安全模å¼ä¸‹è¿è¡Œ","ui.server.pending":"等待 …","ui.server.running":"分æžä¸­ …","ui.server.error":"由于æœåŠ¡å™¨çš„æ„外å“应,检查失败。","ui.server.details":"详情","ui.server.prerequisite":"由于缺少必è¦çš„æ¡ä»¶ï¼Œæ£€æŸ¥å·²å–æ¶ˆã€‚","ui.server.selfUpdate.title":"Contao管ç†å™¨æ›´æ–°","ui.server.selfUpdate.update":"æ–°çš„Contao管ç†å™¨ç‰ˆæœ¬ {latest} .","ui.server.selfUpdate.manualUpdate":"新版本的Contao管ç†å™¨ {latest} å¯ç”¨ã€‚æœåС噍䏿”¯æŒè‡ªåŠ¨æ›´æ–°ï¼Œè¯·ä»Ž{download}下载新版本。","ui.server.selfUpdate.latest":"正在使用最新版本 {current}。","ui.server.selfUpdate.dev":"å¼€å‘ç‰ˆä¸æ”¯æŒè‡ªåŠ¨æ›´æ–°ã€‚","ui.server.selfUpdate.unsupported":"有新版本,但您的PHPç‰ˆæœ¬ä¸æ”¯æŒã€‚","ui.server.selfUpdate.button":"è¿è¡Œè‡ªæ›´æ–°","ui.server.selfUpdate.continue":"ç»§ç»­","ui.server.config.title":"æœåС噍é…ç½®","ui.server.config.setup":"é…ç½®","ui.server.config.change":"更改","ui.server.config.save":"ä¿å­˜","ui.server.config.cancel":"å–æ¶ˆ","ui.server.config.customOption":"å…¶ä»– …","ui.server.config.description":"To correctly run background tasks, the Contao Manager needs to know where to find the PHP command line binary and how to run commands separated from the web process.","ui.server.config.formTitle":"æœåС噍é…ç½®","ui.server.config.formText":"请输入PHP二进制文件ä½ç½®ã€‚确认二进制文件和æœåС噍web进程是相åŒçš„PHP版本。","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud å…许安装Composerä¾èµ–å³ä½¿æœåŠ¡å™¨æ— æ³•æä¾›è¶³å¤Ÿçš„内存。您的包信æ¯å°†è¢«ä¼ è¾“到由Contao Associationè¿è¥çš„云æœåŠ¡å™¨ã€‚","ui.server.config.cloud":"使用Composer Resolver Cloud","ui.server.config.cli":"PHP二进制","ui.server.config.stateErrorCli":"æœåŠ¡å™¨ä¸­æ²¡æœ‰å‘现有效的PHP二进制文件。","ui.server.config.stateErrorCloud":"䏿”¯æŒComposer Resolver Cloud。","ui.server.config.stateSuccess":"PHP 二进制文件在 {php_cli}.","ui.server.php_web.title":"PHP Web 进程","ui.server.php_web.below7":"å‘现 PHP 版本 {version}。请尽快切æ¢åˆ°PHP 7!","ui.server.php_web.success":"å‘现PHP版本 {version}, 没有å‘现已知问题。","ui.server.php_cli.title":"PHP命令行接å£","ui.server.php_cli.success":"å‘现PHP版本 {version}, 没有å‘现已知问题。","ui.server.composer.title":"Composer环境","ui.server.composer.success":"没有å‘现已知问题","ui.server.composer.install":"没有安装Composerä¾èµ–。","ui.server.composer.button":"Install","ui.server.contao.title":"Contao 安装","ui.server.contao.setup":"安装","ui.server.contao.check":"Check database","ui.server.contao.empty":"没有å‘现安装Contao。","ui.server.contao.old":"Contao版本 {version}ä¸å…¼å®¹Contao Manager,请手动更新当å‰å®‰è£…的系统。","ui.server.contao.found":"å‘现Contao {version} (API 版本 {api}).","ui.server.contao.connectionError":"Unable to connect to the database server.","ui.server.contao.connectionProblem":"Database problem found.","ui.server.contao.missingUser":"Admin account not found.","ui.setup.continue":"ç»§ç»­","ui.setup.manager":"è¿è¡ŒContao管ç†å™¨","ui.setup.cancel":"å–æ¶ˆ","ui.setup.welcome":"欢迎","ui.setup.welcome1":"This wizard will take you through the necessary steps to set up your Contao Open Source CMS installation.","ui.setup.welcome2":"If you have any questions, please find documentation, forums, a Slack channel and more on the {support} page.","ui.setup.support":"community support","ui.setup.start":"Get started","ui.setup.complete":"Congratulations!","ui.setup.complete1":"Contao {version} has been installed successfully.","ui.setup.complete2":"To finish the setup process, please open the install tool to configure the database connection and create a back end user.","ui.setup.complete3":"You can now start to create your website in the Contao back end. If you need additional extensions, continue to the Contao Manager.","ui.setup.installTool":"Open the Install Tool","ui.setup.login":"Login to Contao","ui.setup.funding":"Free software is \\"free\\" as in \\"free speech\\", not as in \\"free beer\\". An Open Source project like Contao requires amounts of money that can\'t be raised by a single person or company.\\nIf you have a website or sell websites built with Contao, we would love to see you contribute back financially to the product your business relies upon.","ui.setup.fundingLink":"Learn more","ui.setup.document-root.headline":"Webserver Setup","ui.setup.document-root.warning":"To install Contao through the Contao Manager, you have to fix the document root on the web server.","ui.setup.document-root.description1":"Contao uses a separate folder for public files, application files are installed in its parent folder. Contao cannot be installed if the folder structure is not correct or the folders are not empty.","ui.setup.document-root.description2":"If you don\'t know how to configure your document root, please read the Contao documentation or contact your hosting provider.","ui.setup.document-root.documentation":"Read the Documentation","ui.setup.document-root.conflictsTitle":"Installation directory not empty","ui.setup.document-root.conflictsDirectory":"The root directory of your future Contao installation is not empty, we have found {count} file(s) that might be overwritten by the installation process. It is recommended to create an empty directory structure for Contao, but you can also remove the following files and check again if you are sure they are unused.","ui.setup.document-root.ignoreConflicts":"I want to install Contao into the non-empty directory. I understand that this might overwrite any existing files on my webspace.","ui.setup.document-root.check":"Check again","ui.setup.document-root.create":"Create directories","ui.setup.document-root.change":"Change directories","ui.setup.document-root.formTitle":"Directory Setup","ui.setup.document-root.formText1":"The Contao Manager can automatically create a new directory structure on the server.","ui.setup.document-root.formText2":"You will need to manually configure the new document root (e.g. through a hosting admin panel).","ui.setup.document-root.autoconfig":"I understand that I have to change my server configuration. Not configuring the document root will break the Contao Manager and expose configuration files (including account details and passwords)!","ui.setup.document-root.directory":"New Directory","ui.setup.document-root.currentRoot":"Current Document Root","ui.setup.document-root.newRoot":"New Document Root","ui.setup.document-root.finish":"Setup Directories","ui.setup.document-root.publicDir":"Use {dir} for public files (for Contao {version})","ui.setup.document-root.directoryInvalid":"Please enter a valid directory name.","ui.setup.document-root.directoryExists":"The target directory already exists. Please enter a different name.","ui.setup.document-root.confirmation":"The Contao Manager has successfully created the necessary directory for your Contao installation. You now have to configure the document root on your web server. Do not reload this page until then.","ui.setup.document-root.reload":"Reload Page","ui.setup.document-root.success":"The directory structure on your web server is set up correctly!","ui.setup.document-root.installingProjectDir":"Application files will be installed to {dir}.","ui.setup.document-root.installingPublicDir":"Public files will be installed to {dir}.","ui.setup.document-root.installedProjectDir":"Application files are installed in {dir}.","ui.setup.document-root.installedPublicDir":"Public files are installed in {dir}.","ui.setup.create-project.headline":"Contao 安装","ui.setup.create-project.description":"Contao development follows the principle of {semver}, a new minor version is released every six months. The currently supported releases are:","ui.setup.create-project.semver":"Semantic Versioning","ui.setup.create-project.latestTitle":"最新","ui.setup.create-project.ltsTitle":"长期支æŒ","ui.setup.create-project.latestQ1":"Our latest version, offers the most features with support until February {year}.","ui.setup.create-project.latestQ3":"Our latest version, offers the most features with support until August {year}.","ui.setup.create-project.ltsText":"Our current LTS version, if you focus on stability. Offers long term support until February {year}.","ui.setup.create-project.pltsText":"The previous LTS version, still has long term support until February {year}.","ui.setup.create-project.requiresPHP":"Requires at least PHP {version}, you have PHP {current}.","ui.setup.create-project.requiresDocroot":"The document root must be \\"{folder}\\".","ui.setup.create-project.releaseplan":"See the {contaoReleasePlan} for detailed information.","ui.setup.create-project.releaseplanLink":"Contao Release Plan","ui.setup.create-project.formTitle":"Select a distribution","ui.setup.create-project.formText":"Please choose which version should be installed.","ui.setup.create-project.version":"版本","ui.setup.create-project.coreOnly":"åˆå§‹åŒ–安装","ui.setup.create-project.coreOnlyNo":"全部安装 (æ–°é—», 日历, ç­‰.)","ui.setup.create-project.coreOnlyYes":"最å°åŒ–安装 (仅核心)","ui.setup.create-project.coreOnlyFeatures":"What\'s the difference?","ui.setup.create-project.noUpdate":"跳过安装 (ä»…é™ä¸“å®¶!)","ui.setup.create-project.install":"Install","ui.setup.database-connection.headline":"Database Connection","ui.setup.database-connection.description":"Contao requires a MySQL database (or a compatible fork like MariaDB) to store pages, content, users and other relational data. Connection parameters are stored in the {env} file in the project root of your Contao installation.","ui.setup.database-connection.formTitle":"Connection Parameters","ui.setup.database-connection.formText":"Enter a database URL or fill in the username, password, server and database fields separately.","ui.setup.database-connection.url":"Database URL","ui.setup.database-connection.validUrl":"Database URL is invalid or connection to server failed.","ui.setup.database-connection.or":"or","ui.setup.database-connection.user":"用户å","ui.setup.database-connection.password":"密ç ","ui.setup.database-connection.server":"Server (:Port)","ui.setup.database-connection.database":"Database Name","ui.setup.database-connection.serverVersion":"Server Version","ui.setup.database-connection.oldVersion":"Older MySQL or MariaDB","ui.setup.database-connection.connected":"Successfully connected to database {database} on {server} {version}.","ui.setup.database-connection.error":"Error connecting to the database.","ui.setup.database-connection.problem":"Contao has detected a problem with your database server.","ui.setup.database-connection.migration":"There is one pending migration. | There are {count} pending migrations.","ui.setup.database-connection.schema":"There is one pending schema update. | There are {count} pending schema updates.","ui.setup.database-connection.noChanges":"Your database schema is up to date.","ui.setup.database-connection.check":"Check database","ui.setup.database-connection.save":"ä¿å­˜","ui.setup.database-connection.change":"Change credentials","ui.setup.backend-user.success":"An admin account for the Contao back end was found in your database. Use the Contao back end to add more users.","ui.setup.backend-user.error":"Unable to retrieve user list. Check the console output for details.","ui.setup.backend-user.headline":"Backend Account","ui.setup.backend-user.description":"To manage your website, you need to have at least one admin account for the Contao back end. Be aware that this account is not related to the Contao Manager.","ui.setup.backend-user.formTitle":"创建账å·","ui.setup.backend-user.formText":"Please enter the details for the new back end account.","ui.setup.backend-user.username":"用户å","ui.setup.backend-user.name":"Name","ui.setup.backend-user.email":"E-mail address","ui.setup.backend-user.emailInvalid":"Please enter a valid e-mail address","ui.setup.backend-user.password":"密ç ","ui.setup.backend-user.passwordPlaceholder":"最少8个字符","ui.setup.backend-user.passwordLength":"请输入最少8个字符","ui.setup.backend-user.create":"Add account","ui.task.headline":"Background Task","ui.task.loading":"Loading details …","ui.task.created":"Loading details …","ui.task.active":"Please wait while the Contao Manager is running task operations in the background.","ui.task.complete":"All operations are completed successfully. Check the console output for details.","ui.task.aborting":"Please wait while the background operations are being cancelled.","ui.task.stopped":"Some background operations were cancelled. Please check the console output.","ui.task.error":"A background operation stopped unexpectedly. Please check the console output.","ui.task.failed":"The Contao Manager failed to start a background task!","ui.task.failedDescription1":"Something went wrong while trying to execute operations in the background.","ui.task.failedDescription2":"If this happens again, your server might not be supported.","ui.task.reportProblem":"报告问题","ui.task.sponsor":"Composer Cloud sponsored by {sponsor}","ui.task.buttonAudit":"æ›´æ–°æ•°æ®åº“","ui.task.buttonClose":"关闭","ui.task.buttonConfirm":"确认 & 关闭","ui.task.buttonCancel":"å–æ¶ˆ","ui.task.confirmCancel":"ç¡®è®¤å–æ¶ˆæ­¤ä»»åŠ¡? 将会使Contao安装处于æŸå状æ€!","ui.task.autoclose":"Close task details on success","ui.console.toggle":"显示/éšè—命令行输出","ui.console.showLog":"Show full console log","ui.console.copyLog":"Copy log to clipboard","ui.migrate.headline":"Database Updates","ui.migrate.migrationsOnly":"(migrations only)","ui.migrate.schemaOnly":"(schema only)","ui.migrate.loading":"Please wait, we are checking your database …","ui.migrate.empty":"No pending migrations or schema updates found. Your database is up to date.","ui.migrate.emptyMigrations":"No pending migrations found. Make sure to also check for schema updates.","ui.migrate.emptySchema":"No pending schema updates found. Make sure to also check for migrations.","ui.migrate.pending":"Your database is not up to date. Please review the console output below and execute the changes.","ui.migrate.previousChanges":"A previous database migration was not confirmed.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.previousComplete":"A previous database migration was not confirmed, please review the console output below.\\nThere are no more pending changes.","ui.migrate.appliedChanges":"Database updates have been applied.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.appliedComplete":"Database updates have been applied.\\nThere are no more pending migrations or schema updates. Your database is up to date.","ui.migrate.problem":"Contao has detected a problem with your database server.\\nPlease review the console output below to find out what needs to be fixed. | Contao has detected problems with your database server.\\nPlease review the console output below to find out what needs to be fixed.","ui.migrate.warning":"Contao has detected a misconfiguration of your database server.\\nWarnings can be skipped temporarily, but should be fixed for optimal performance and data integrity.","ui.migrate.error":"The changes could not be applied. Your database might have been changed, please check again to retry.","ui.migrate.execute":"Execute","ui.migrate.close":"关闭","ui.migrate.confirm":"确认 & 关闭","ui.migrate.cancel":"å–æ¶ˆ","ui.migrate.continue":"ç»§ç»­","ui.migrate.setup":"安装","ui.migrate.skip":"Skip","ui.migrate.retry":"Check again","ui.migrate.retryAll":"Check all","ui.migrate.withDeletes":"Execute all database changes including DROP queries.","ui.migrate.migrationTitle":"Database Migrations","ui.migrate.schemaTitle":"Schema Updates","ui.migrate.problemTitle":"Database Problems","ui.migrate.warningTitle":"Database Warnings","ui.migrate.addTable":"Add table {table}","ui.migrate.dropTable":"Drop table {table}","ui.migrate.addField":"Add field {table}.{field}","ui.migrate.changeField":"Change field {table}.{field}","ui.migrate.dropField":"Drop field {table}.{field}","ui.migrate.createIndex":"Create index \\"{name}\\" on {table}","ui.migrate.dropIndex":"Drop index \\"{name}\\" on {table}","ui.widget.mandatory":"该字段ä¸èƒ½ä¸ºç©ºã€‚","ui.widget.blankOption":"请选择 …","ui.widget.showPassword":"Show password","ui.widget.hidePassword":"Hide password","ui.error.title":"HTTP request for \\"{method} {url}\\" failed.","ui.error.server500":"Looks like an unexpected error happened on your server. Please check the log files of your web server (Apache/Nginx) and the Contao Manager logs at \\"contao-manager/logs\\".","ui.error.response":"The server returned a response with status code {status}.","ui.error.moreLink":"更多信æ¯","ui.error.support":"Contao Support","ui.footer.help":"帮助","ui.footer.reportProblem":"报告问题","ui.navigation.discover":"å‘现","ui.navigation.packages":"包","ui.navigation.tools":"工具","ui.navigation.installTool":"安装工具","ui.navigation.backend":"Contao åŽå°","ui.navigation.debug":"Contao调试模å¼","ui.navigation.logViewer":"Log Viewer","ui.navigation.phpinfo":"PHPä¿¡æ¯","ui.navigation.phpinfoLoading":"Loading PHP Information…","ui.navigation.maintenance":"维护","ui.navigation.rebuildCache":"é‡å»ºç¼“å­˜","ui.navigation.systemCheck":"系统检查","ui.navigation.advanced":"高级","ui.navigation.logout":"注销","ui.maintenance.databaseMigration.title":"Database Migrations","ui.maintenance.databaseMigration.description":"Database migrations ensure consistent data and table schemas.","ui.maintenance.databaseMigration.migrations":"One pending database migration | {count} pending database migrations","ui.maintenance.databaseMigration.schemaUpdates":"One pending schema update | {count} pending schema updates","ui.maintenance.databaseMigration.error":"Database problem found.","ui.maintenance.databaseMigration.warning":"Database warnings found.","ui.maintenance.databaseMigration.button":"Check database","ui.maintenance.databaseMigration.migrationOnly":"Check migrations only","ui.maintenance.databaseMigration.schemaOnly":"Check schema only","ui.maintenance.databaseMigration.installTool":"Open Install Tool","ui.maintenance.rebuildCache.title":"应用缓存","ui.maintenance.rebuildCache.description":"修改任何é…置文件åŽï¼Œå¿…é¡»é‡å»ºåº”用程åºç¼“存。","ui.maintenance.rebuildCache.rebuildProd":"é‡å»ºç”Ÿäº§çŽ¯å¢ƒç¼“å­˜","ui.maintenance.rebuildCache.rebuildDev":"é‡å»ºå¼€å‘环境缓存","ui.maintenance.rebuildCache.clearProd":"清除生产环境缓存","ui.maintenance.rebuildCache.clearDev":"清除开å‘环境缓存","ui.maintenance.installTool.title":"Contao安装工具","ui.maintenance.installTool.description":"连续输入3次错误密ç ä¼šè‡ªåЍé”定Contao安装工具。","ui.maintenance.installTool.unlock":"è§£é”安装工具","ui.maintenance.installTool.lock":"é”定安装工具","ui.maintenance.dumpAutoload.title":"Composer类加载器","ui.maintenance.dumpAutoload.description":"Composer的自动加载器负责PHP类加载。添加自定义命å空间到根下的composer.jsonåŽå¿…须转储自动加载器。","ui.maintenance.dumpAutoload.button":"打å°Autoloader","ui.maintenance.composerInstall.title":"Composerä¾èµ–","ui.maintenance.composerInstall.description":"Composer dependencies are located in the {vendor} folder in your application root. Reinstalling the dependencies can be necessary after manipulation or manually uploading the {composerLock} file.","ui.maintenance.composerInstall.button":"è¿è¡Œå®‰è£…器","ui.maintenance.composerInstall.update":"è¿è¡ŒComposeræ›´æ–°","ui.maintenance.composerCache.title":"Composer缓存","ui.maintenance.composerCache.description":"Composer缓存下载的软件包以æé«˜æ€§èƒ½ã€‚ 如果您é‡åˆ°æ–‡ä»¶æŸå等问题,请å°è¯•删除Composer缓存以强制进行新的下载。","ui.maintenance.composerCache.button":"清楚缓存","ui.maintenance.maintenanceMode.title":"Maintenance Mode","ui.maintenance.maintenanceMode.description":"Putting Contao in maintenance mode will display a \\"503 Service Unavailable\\" template for the website.","ui.maintenance.maintenanceMode.enable":"Enable","ui.maintenance.maintenanceMode.disable":"Disable","ui.maintenance.debugMode.title":"调试模å¼","ui.maintenance.debugMode.description":"Activate the debug mode by setting a user and password for the {appDevPhp} entry point.","ui.maintenance.debugMode.descriptionJwt":"通过对于当å‰åŸŸå设置调试cookieæ¥æ¿€æ´»è°ƒè¯•模å¼ã€‚","ui.maintenance.debugMode.activate":"激活","ui.maintenance.debugMode.deactivate":"未激活","ui.maintenance.debugMode.credentials":"è¯ä¹¦","ui.maintenance.debugMode.user":"请输入用于调试模å¼çš„用户å。","ui.maintenance.debugMode.password":"请输入用于调试模å¼çš„密ç ã€‚","ui.maintenance.opcodeCache.title":"Opcode缓存","ui.maintenance.opcodeCache.description":"Opcode在Web进程上缓存PHP文件以加快执行速度。 å¦‚æžœæ–‡ä»¶åœ¨æ›´æ”¹åŽæ— æ³•识别,则在æŸäº›æƒ…况下必须将其删除。","ui.maintenance.opcodeCache.button":"清除缓存","ui.maintenance.safeMode":"安装模å¼ä¸‹æ— æ•ˆ","ui.maintenance.unsupported":"您的Contaoç‰ˆæœ¬ä¸æ”¯æŒ","ui.packages.updateButton":"更新包","ui.packages.searchButton":"æœç´¢åŒ…","ui.packages.searchPlaceholder":"æœç´¢åŒ…","ui.packages.uploadOverlay":"拖拽文件上传","ui.packages.uploadButton":"上传包","ui.packages.uploadMessage":"You have one unconfirmed upload. | You have {count} unconfirmed uploads.","ui.packages.uploadApply":"确认上传","ui.packages.uploadReset":"删除上传","ui.packages.uploadIncomplete":"此文件未完全上传。 请将其删除,然åŽé‡è¯•。","ui.packages.uploadDuplicate":"此文件似乎多次上传。 请删除é‡å¤é¡¹ã€‚","ui.packages.uploadInstalled":"此文件已安装。请移除é‡å¤é¡¹ã€‚","ui.packages.uploadUnsupported":"Uploads are not supported in your installation. Please make sure that the PHP ZIP extension is installed and update your dependencies.","ui.packages.changesMessage":"You have one unconfirmed change. | You have {count} unconfirmed changes.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"应用更改","ui.packages.changesApplyAll":"Update all packages","ui.packages.changesDryrunAll":"Dry run all packages","ui.packages.changesReset":"é‡ç½®æ›´æ”¹","ui.packages.changesReview":"预览更改","ui.packagelist.loading":"加载 …","ui.packagelist.uploads":"上传","ui.packagelist.added":"新包","ui.packagelist.installed":"已安装的包","ui.package.hintRevert":"æ¢å¤æ›´æ”¹","ui.package.hintNoupdate":"ä¸è¦æ›´æ–°","ui.package.hintConstraint":"åº”ç”¨æ›´æ”¹æ—¶ï¼Œæ­¤åŒ…å°†ä¼šå¸¦çº¦æŸ {constraint} 安装。","ui.package.hintConstraintBest":"应用更改时,此包将会安装最佳版本。","ui.package.hintConstraintChange":"应用更改时,此包的约æŸå°†ä»Ž\\"{from}\\"更改为\\"{to}\\"。","ui.package.hintConstraintUpdate":"åº”ç”¨æ›´æ”¹åŽæ­¤åŒ…会被更新","ui.package.hintAdded":"åº”ç”¨æ›´æ”¹åŽæ­¤åŒ…会被安装","ui.package.hintRemoved":"应用更改时,该程åºåŒ…将被移除。","ui.package.requiredTitle":"手动添加","ui.package.requiredText":"composer.jsonä¸­éœ€è¦æ­¤åŒ…,但是没有安装","ui.package.removedTitle":"手动移除","ui.package.removedText":"此包已从composer.json移除。","ui.package.installed":"当å‰å·²å®‰è£…:","ui.package.version":"版本 {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Star | {count} Stars","ui.package.editConstraint":"编辑","ui.package.uploadConstraint":"此约æŸç”±ä¸Šä¼ çš„包定义。","ui.package.updateButton":"æ›´æ–°","ui.package.removeButton":"移除","ui.package.installButton":"添加包","ui.package.installButtonShort":"添加","ui.package.detailsButton":"详情","ui.package.latestConstraint":"最新版","ui.package.update":"Update available","ui.package.updateLatest":"最新版","ui.package.updateAvailable":"{version} available","ui.package.updateUnknown":"unknown version","ui.package.updateConstraint":"A newer version outside your version constraint is available.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"版本 {version}","ui.cloudStatus.waitingTime":"等待时间","ui.cloudStatus.jobs":"当å‰å·¥ä½œ","ui.cloudStatus.workers":"工作者","ui.cloudStatus.approx":"{minutes} 分钟","ui.cloudStatus.none":"æ— ","ui.cloudStatus.short":"ca. {minutes} 分钟","ui.cloudStatus.long":"ca. {minutes} 分钟 {seconds} ç§’","ui.cloudStatus.error":"Unable to fetch the status of the Composer Resolver Cloud. It might be down for maintenance or experience issues.","ui.cloudStatus.button":"Cloud Status","ui.cloudStatus.refresh":"Refresh Cloud Status","ui.log-viewer.loading":"加载 …","ui.log-viewer.empty":"There are no log files on your server.","ui.log-viewer.reload":"Reload","ui.log-viewer.file":"Log file","ui.log-viewer.channel":"Channel","ui.log-viewer.channelTitle":"The channel this message was logged to.","ui.log-viewer.level":"Level","ui.log-viewer.levelTitle":"Severity of the log message.","ui.log-viewer.timeHeader":"Time","ui.log-viewer.messageHeader":"Message","ui.log-viewer.showContext":"Show Context","ui.log-viewer.hideContext":"Hide Context","ui.log-viewer.showExtra":"Show Extra","ui.log-viewer.hideExtra":"Hide Extra","ui.log-viewer.more":"Load more …","ui.log-viewer.download":"Download","ui.log-viewer.downloadTitle":"Download file \\"{file}\\"","ui.log-viewer.prodEnvironment":"Production Environment","ui.log-viewer.devEnvironment":"Development Environment (Debug Mode)"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[60],{60:function(e,t,r){function n(e){const t=new Uint8Array(e);let r="";for(const o of t)r+=String.fromCharCode(o);const n=btoa(r);return n.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function o(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),r=(4-t.length%4)%4,n=t.padEnd(t.length+r,"="),o=atob(n),i=new ArrayBuffer(o.length),a=new Uint8Array(i);for(let s=0;se};function s(e){const{id:t}=e;return{...e,id:o(t),transports:e.transports}}function c(e){return"localhost"===e||/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i.test(e)}class l extends Error{constructor({message:e,code:t,cause:r,name:n}){super(e,{cause:r}),Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.name=n??r.name,this.code=t}}function u({error:e,options:t}){const{publicKey:r}=t;if(!r)throw Error("options was missing required publicKey property");if("AbortError"===e.name){if(t.signal instanceof AbortSignal)return new l({message:"Registration ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else if("ConstraintError"===e.name){if(!0===r.authenticatorSelection?.requireResidentKey)return new l({message:"Discoverable credentials were required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_DISCOVERABLE_CREDENTIAL_SUPPORT",cause:e});if("conditional"===t.mediation&&"required"===r.authenticatorSelection?.userVerification)return new l({message:"User verification was required during automatic registration but it could not be performed",code:"ERROR_AUTO_REGISTER_USER_VERIFICATION_FAILURE",cause:e});if("required"===r.authenticatorSelection?.userVerification)return new l({message:"User verification was required but no available authenticator supported it",code:"ERROR_AUTHENTICATOR_MISSING_USER_VERIFICATION_SUPPORT",cause:e})}else{if("InvalidStateError"===e.name)return new l({message:"The authenticator was previously registered",code:"ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED",cause:e});if("NotAllowedError"===e.name)return new l({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if("NotSupportedError"===e.name){const t=r.pubKeyCredParams.filter((e=>"public-key"===e.type));return 0===t.length?new l({message:'No entry in pubKeyCredParams was of type "public-key"',code:"ERROR_MALFORMED_PUBKEYCREDPARAMS",cause:e}):new l({message:"No available authenticator supported any of the specified pubKeyCredParams algorithms",code:"ERROR_AUTHENTICATOR_NO_SUPPORTED_PUBKEYCREDPARAMS_ALG",cause:e})}if("SecurityError"===e.name){const t=globalThis.location.hostname;if(!c(t))return new l({message:`${globalThis.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e});if(r.rp.id!==t)return new l({message:`The RP ID "${r.rp.id}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else if("TypeError"===e.name){if(r.user.id.byteLength<1||r.user.id.byteLength>64)return new l({message:"User ID was not between 1 and 64 characters",code:"ERROR_INVALID_USER_ID_LENGTH",cause:e})}else if("UnknownError"===e.name)return new l({message:"The authenticator was unable to process the specified options, or could not create a new credential",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return e}class d{constructor(){Object.defineProperty(this,"controller",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}createNewAbortSignal(){if(this.controller){const e=new Error("Cancelling existing WebAuthn API call for new one");e.name="AbortError",this.controller.abort(e)}const e=new AbortController;return this.controller=e,e.signal}cancelCeremony(){if(this.controller){const e=new Error("Manually cancelling existing WebAuthn API call");e.name="AbortError",this.controller.abort(e),this.controller=void 0}}}const h=new d,p=["cross-platform","platform"];function f(e){if(e&&!(p.indexOf(e)<0))return e}async function R(e){!e.optionsJSON&&e.challenge&&(console.warn("startRegistration() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information."),e={optionsJSON:e});const{optionsJSON:t,useAutoRegister:r=!1}=e;if(!i())throw new Error("WebAuthn is not supported in this browser");const a={...t,challenge:o(t.challenge),user:{...t.user,id:o(t.user.id)},excludeCredentials:t.excludeCredentials?.map(s)},c={};let l;r&&(c.mediation="conditional"),c.publicKey=a,c.signal=h.createNewAbortSignal();try{l=await navigator.credentials.create(c)}catch(y){throw u({error:y,options:c})}if(!l)throw new Error("Registration was not completed");const{id:d,rawId:p,response:R,type:w}=l;let b,E,m,A;if("function"===typeof R.getTransports&&(b=R.getTransports()),"function"===typeof R.getPublicKeyAlgorithm)try{E=R.getPublicKeyAlgorithm()}catch(_){g("getPublicKeyAlgorithm()",_)}if("function"===typeof R.getPublicKey)try{const e=R.getPublicKey();null!==e&&(m=n(e))}catch(_){g("getPublicKey()",_)}if("function"===typeof R.getAuthenticatorData)try{A=n(R.getAuthenticatorData())}catch(_){g("getAuthenticatorData()",_)}return{id:d,rawId:n(p),response:{attestationObject:n(R.attestationObject),clientDataJSON:n(R.clientDataJSON),transports:b,publicKeyAlgorithm:E,publicKey:m,authenticatorData:A},type:w,clientExtensionResults:l.getClientExtensionResults(),authenticatorAttachment:f(l.authenticatorAttachment)}}function g(e,t){console.warn(`The browser extension that intercepted this WebAuthn API call incorrectly implemented ${e}. You should report this error to them.\n`,t)}function w(){if(!i())return b.stubThis(new Promise((e=>e(!1))));const e=globalThis.PublicKeyCredential;return void 0===e?.isConditionalMediationAvailable?b.stubThis(new Promise((e=>e(!1)))):b.stubThis(e.isConditionalMediationAvailable())}const b={stubThis:e=>e};function E({error:e,options:t}){const{publicKey:r}=t;if(!r)throw Error("options was missing required publicKey property");if("AbortError"===e.name){if(t.signal instanceof AbortSignal)return new l({message:"Authentication ceremony was sent an abort signal",code:"ERROR_CEREMONY_ABORTED",cause:e})}else{if("NotAllowedError"===e.name)return new l({message:e.message,code:"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY",cause:e});if("SecurityError"===e.name){const t=globalThis.location.hostname;if(!c(t))return new l({message:`${globalThis.location.hostname} is an invalid domain`,code:"ERROR_INVALID_DOMAIN",cause:e});if(r.rpId!==t)return new l({message:`The RP ID "${r.rpId}" is invalid for this domain`,code:"ERROR_INVALID_RP_ID",cause:e})}else if("UnknownError"===e.name)return new l({message:"The authenticator was unable to process the specified options, or could not create a new assertion signature",code:"ERROR_AUTHENTICATOR_GENERAL_ERROR",cause:e})}return e}async function m(e){!e.optionsJSON&&e.challenge&&(console.warn("startAuthentication() was not called correctly. It will try to continue with the provided options, but this call should be refactored to use the expected call structure instead. See https://simplewebauthn.dev/docs/packages/browser#typeerror-cannot-read-properties-of-undefined-reading-challenge for more information."),e={optionsJSON:e});const{optionsJSON:t,useBrowserAutofill:r=!1,verifyBrowserAutofillInput:a=!0}=e;if(!i())throw new Error("WebAuthn is not supported in this browser");let c;0!==t.allowCredentials?.length&&(c=t.allowCredentials?.map(s));const l={...t,challenge:o(t.challenge),allowCredentials:c},u={};if(r){if(!await w())throw Error("Browser does not support WebAuthn autofill");const e=document.querySelectorAll("input[autocomplete$='webauthn']");if(e.length<1&&a)throw Error('No with "webauthn" as the only or last value in its `autocomplete` attribute was detected');u.mediation="conditional",l.allowCredentials=[]}let d;u.publicKey=l,u.signal=h.createNewAbortSignal();try{d=await navigator.credentials.get(u)}catch(A){throw E({error:A,options:u})}if(!d)throw new Error("Authentication was not completed");const{id:p,rawId:R,response:g,type:b}=d;let m;return g.userHandle&&(m=n(g.userHandle)),{id:p,rawId:n(R),response:{authenticatorData:n(g.authenticatorData),clientDataJSON:n(g.clientDataJSON),signature:n(g.signature),userHandle:m},type:b,clientExtensionResults:d.getClientExtensionResults(),authenticatorAttachment:f(d.authenticatorAttachment)}}}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[477],{6477:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Unsichere Verbindung !!","ui.app.httpsDescription":"Ohne HTTPS werden deine vertraulichen Daten unverschlüsselt übertragen.","ui.app.httpsLink":"Weitere Informationen","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Abgesicherter Modus !!","ui.app.safeModeDescription":"Einige Funktionen des Contao Managers sind nicht verfügbar.","ui.app.safeModeExit":"Beenden","ui.app.limitedHeadline":"Remote-Anmeldung","ui.app.limitedDescription":"Du hast eingeschränkte Berechtigungen wegen automatischer Anmeldung.","ui.app.limitedLogout":"Neu anmelden","ui.app.totpHeadline":"Sicherheitshinweis","ui.app.totpDescription":"Konfiguriere jetzt die Zwei-Faktor-Anmeldung, um dein Konto sicherer zu machen.","ui.app.totpSetup":"Einrichtung","ui.app.loading":"Contao Manager wird geladen …","ui.app.apiError":"Unerwarteter API-Status","ui.app.configSecurity1":"SICHERHEITSWARNUNG !!! Das Konfigurationsverzeichnis ist ungeschützt","ui.app.configSecurity2":"Der Contao Manager hat erkannt, dass seine Konfigurationsdateien öffentlich erreichbar sind. Du musst diese Dateien schützen, bevor der Manager verwendet werden kann, da ein Angreifer sonst auf sensible Daten zugreifen könnte.\\n\\nUm dieses Problem zu beheben, schütze das Verzeichnis \\"contao-manager\\" auf deinem Server. Bei Fragen lies das Handbuch deines Webservers oder wende dich an deinen Hosting-Anbieter.","ui.account.welcome":"Willkommen","ui.account.intro1":"Willkommen zum Contao Manager, einem universellen Werkzeug, um das Contao Open Source CMS zu installieren, zu konfigurieren und zu warten. Wenn du den Manager zum ersten Mal einsetzt, {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} bevor du beginnst","ui.account.introManual":"lies die Dokumentation","ui.account.intro2":"Sollten Probleme auftreten, dann prüfe {ourGithubIssues}. Falls für dein Anliegen noch kein Ticket existiert, kannst du gern ein Neues erstellen.","ui.account.introIssues":"die Tickets auf GitHub","ui.account.headline":"Benutzerkonto","ui.account.description":"Erstelle ein Benutzerkonto, um deine Installation zu verwalten. Beachte, dass dieses Konto in keinem Zusammenhang mit dem Contao Backend oder Frontend steht.","ui.account.username":"Benutzername","ui.account.password":"Passwort","ui.account.passwordPlaceholder":"min. 8 Zeichen","ui.account.passwordLength":"Bitte gib mindestens 8 Zeichen ein.","ui.account.loginInvalid":"Beim erstellen des Konto ist ein Fehler aufgetreten. Bitte versuche einen anderen Benutzernamen.","ui.account.submit":"Benutzerkonto erstellen","ui.account.usePassword":"Mit Passwort anmelden","ui.account.usePasskey":"Mit Passkey anmelden","ui.account.totpHeadline":"Zwei-Faktor Anmeldung","ui.account.totpDescription":"Bitte aktivieren die Zwei-Faktor-Anmeldung, welche dein Konto sicherer macht. Zusätzlich zu deinem Benutzernamen und Passwort musst du einen Sicherheitscode eingeben, welcher von einer Zwei-Faktor-App wie 1Password, Authy, Google Authenticator, Microsoft Authenticator, LassPass Authenticator oder einer beliebigen anderen TOTP-App erzeugt wird.","ui.account.totpSetup":"Jetzt einrichten","ui.account.totpSkip":"Später einrichten","ui.account.login":"Einladung ablehnen","ui.account.contribute1":"Contao und der Contao Manager werden durch die Contao Association gefördert.","ui.account.contribute2":"{donate} und leiste deinen Beitrag zu Open Source!","ui.account.contributeDonate":"Mach eine Spende","ui.login.headline":"Anmeldung","ui.login.description":"Melde dich an, um deine Installation zu verwalten.","ui.login.username":"Benutzername","ui.login.password":"Passwort","ui.login.totpHeadline":"Zwei-Faktor Anmeldung","ui.login.totpDescription":"Bitte gibt den Sicherheitscode ein, um die Anmeldung abzuschliessen.","ui.login.totp":"Sicherheitscode","ui.login.forgotPassword":"Passwort vergessen?","ui.login.button":"Anmelden","ui.login.passkey":"Mit Passkey anmelden","ui.login.cancel":"Abbrechen","ui.login.or":"oder","ui.login.locked":"Der Zugriff wurde verweigert, da der Contao Manager gesperrt ist. Zum Entsperren lösche die Datei {lockFile} in deinem Contao Hauptverzeichnis.","ui.logout.headline":"Session-Timeout","ui.logout.warning":"Du warst mehr als 25 Minuten inaktiv. Aus Sicherheitsgründen wird deine Sitzung in Kürze beendet.","ui.logout.expired":"Deine Sitzung wurde automatisch beendet, da du mehr als 30 Minuten inaktiv warst.","ui.logout.renew":"Angemeldet bleiben","ui.logout.logout":"Abmelden","ui.logout.login":"Zurück zum Login","ui.oauth.error":"Ungültiger OAuth-Versuch. Bitte überprüfe die Request-Parameter.","ui.oauth.https":"Die Rückleitungs-URL MUSS eine sichere Verbindung (https:) nutzen, um die Übertragung der Anmeldedaten im Klartext zu verhindern.","ui.oauth.headline":"Remote-Anmeldung","ui.oauth.description":"Die folgende Anwendung oder der folgende Dienst fordert den Fernzugriff auf deine Contao Manager-Instanz an.","ui.oauth.domain":"Bevor du diesen Zugriff erlaubst, stelle sicher, dass du die URL kennst und ihr vertraust!","ui.oauth.outOfScope":"Du hast leider nicht genügend Berechtigungen um diesen Zugriff zu gewähren.","ui.oauth.allow":"Zugriff erlauben","ui.oauth.deny":"Zugriff verweigern","ui.oauth.switchUser":"Benutzer wechseln","ui.scope.admin":"Admin-Zugriff inkl. Benutzerverwaltung","ui.scope.install":"Pakete installieren und Contao-Konfiguration ändern","ui.scope.update":"Pakete aktualisieren und Wartungsaufgaben ausführen","ui.scope.read":"Pakete und Konfiguration sehen","ui.boot.headline":"Systemprüfung","ui.boot.description":"Bitte warten, dein Server wird überprüft …","ui.boot.issue1":"Installationsprobleme erkannt","ui.boot.issue2":"Du musst die Installationsprobleme beheben, bevor der Contao Manager verwendet werden kann.","ui.boot.run":"Contao Manager starten","ui.boot.safeMode":"Abgesicherten Modus starten","ui.recovery.headline":"Systemwiederherstellung","ui.recovery.description":"Es wurden Dateien erkannt, die nach einer Contao-Installation aussehen, aber die Kommandozeile scheint nicht korrekt zu funktionieren.","ui.recovery.console":"Konsolenausgabe","ui.recovery.repairOptions":"Wähle eine Option, um das System zu reparieren.","ui.recovery.repairHeadline":"Automatische Reparatur","ui.recovery.repairDescription":"Versucht eine automatische Systemreparatur, indem der Cache neu aufgebaut und die Composer-Pakete neu installiert werden.","ui.recovery.repairWarning":"Manuelle Änderungen an den vendor-Dateien können dabei verloren gehen!","ui.recovery.repairFailed":"Die automatische Reparatur ist fehlgeschlagen. Versuche den abgesicherten Modus, um die Installation von Hand zu reparieren.","ui.recovery.repairButton":"Reparatur ausführen","ui.recovery.safeModeHeadline":"Abgesicherter Modus","ui.recovery.safeModeDescription":"Der abgesicherte Modus erlaubt die Paketverwaltung und gewisse Wartungsaufgaben, aber Funktionen, welche ein funktionierendes Contao benötigen, sind nicht verfügbar.","ui.recovery.safeModeButton":"Abgesicherten Modus starten","ui.server.pending":"Warten …","ui.server.running":"Analysiere …","ui.server.error":"Die Prüfung ist aufgrund einer unerwarteten Server-Antwort fehlgeschlagen.","ui.server.details":"Details","ui.server.prerequisite":"Prüfung aufgrund fehlender Abhängigkeiten abgebrochen.","ui.server.selfUpdate.title":"Updates für den Contao Manager","ui.server.selfUpdate.update":"Die neue Version {latest} des Contao Managers ist verfügbar.","ui.server.selfUpdate.manualUpdate":"Eine neue Version {latest} des Contao Manager ist verfügbar. Dein Server unterstützt keine automatischen Updates, bitte lade die neue Version von {download} herunter.","ui.server.selfUpdate.latest":"Du verwendest die aktuelle Version {current}.","ui.server.selfUpdate.dev":"Entwicklungs-Versionen können nicht automatisch aktualisiert werden.","ui.server.selfUpdate.unsupported":"Eine neue Version ist verfügbar, aber diese funktioniert nicht mit deiner PHP-Version.","ui.server.selfUpdate.button":"Aktualisieren","ui.server.selfUpdate.continue":"Weiter","ui.server.config.title":"Serverkonfiguration","ui.server.config.setup":"Konfigurieren","ui.server.config.change":"Ändern","ui.server.config.save":"Speichern","ui.server.config.cancel":"Abbrechen","ui.server.config.customOption":"Andere …","ui.server.config.description":"Der Contao Manager benötigt den Pfad zum PHP-Binary und weitere Server-Informationen, um Hintergrund-Prozesse korrekt auszuführen.","ui.server.config.formTitle":"Serverkonfiguration","ui.server.config.formText":"Bitte gib den Pfad zu deinem PHP-Binary ein. Das Binary muss dieselbe PHP-Version sein wie der Webprozess.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Die Composer Resolver Cloud erlaubt die Installation von Composer-Abhängigkeiten, selbst wenn der lokale Server nicht über genug Arbeitsspeicher verfügt. Beachte, dass deine Paketinformationen an einen Cloud-Dienst der Contao Association übermittelt werden.","ui.server.config.cloud":"Die Composer Resolver Cloud verwenden","ui.server.config.cli":"PHP-Binary","ui.server.config.stateErrorCli":"Es wurde kein valides PHP-Programm auf dem Server gefunden.","ui.server.config.stateErrorCloud":"Die Composer Resolver Cloud wird nicht unterstützt.","ui.server.config.stateSuccess":"PHP-Binary in {php_cli}.","ui.server.php_web.title":"PHP-Webprozess","ui.server.php_web.below7":"PHP Version {version} gefunden. Bitte wechsle baldmöglichst auf PHP 7!","ui.server.php_web.success":"PHP Version {version}, keine bekannten Probleme gefunden.","ui.server.php_cli.title":"PHP Kommandozeilen-Programm","ui.server.php_cli.success":"PHP Version {version}, keine bekannten Probleme gefunden.","ui.server.composer.title":"Composer-Umgebung","ui.server.composer.success":"Keine bekannten Probleme gefunden.","ui.server.composer.install":"Composer-Abhängigkeiten sind nicht installiert.","ui.server.composer.button":"Installieren","ui.server.contao.title":"Contao-Installation","ui.server.contao.setup":"Einrichtung","ui.server.contao.check":"Datenbank prüfen","ui.server.contao.empty":"Es wurde keine Contao-Installation gefunden.","ui.server.contao.old":"Contao {version} ist nicht kompatibel mit dem Contao Manager; bitte aktualisiere deine Installation manuell.","ui.server.contao.found":"Contao {version} (API-Version {api}) gefunden.","ui.server.contao.connectionError":"Verbindung zum Datenbank-Server fehlgeschlagen.","ui.server.contao.connectionProblem":"Datenbank-Problem gefunden.","ui.server.contao.missingUser":"Administratorkonto nicht gefunden.","ui.setup.continue":"Weiter","ui.setup.manager":"Contao Manager starten","ui.setup.cancel":"Abbrechen","ui.setup.welcome":"Willkommen","ui.setup.welcome1":"Dieser Assistent führt dich durch die Installation und Einrichtung deines Contao Open Source CMS.","ui.setup.welcome2":"Solltest du Fragen haben, findest du die Dokumentation, das Forum, den Slack Kanal und weiteres auf der {support}-Seite.","ui.setup.support":"Contao-Support","ui.setup.start":"Los geht\'s","ui.setup.complete":"Geschafft!","ui.setup.complete1":"Contao {version} wurde erfolgreich installiert.","ui.setup.complete2":"Um die Installation fertig zu stellen, öffne bitte das Install-Tool um die Datenbank zu verbinden und ein Backend-Konto hinzuzufügen.","ui.setup.complete3":"Du kannst nun deine Webseite im Contao Backend einrichten. Willst du Erweiterungen installieren, fahre mit dem Contao Manager fort.","ui.setup.installTool":"Install-Tool öffnen","ui.setup.login":"Contao Login","ui.setup.funding":"Ohne seine Community wäre Contao nicht das, was es heute ist. Wenn du professionell Webseiten mit Contao erstellst, sind wir auf deine Unterstützung angewiesen. Mit einer Investition in das Projekt sicherst du die Entwicklung für die Zukunft, damit dein Unternehmen weiterhin von Contao profitieren kann.","ui.setup.fundingLink":"Weitere Informationen","ui.setup.document-root.headline":"Webserver-Einrichtung","ui.setup.document-root.warning":"Um Contao über den Contao Manager zu installieren, muss das Wurzelverzeichnis des Webservers angepasst werden.","ui.setup.document-root.description1":"Contao verwendet einen Unterordner für öffentliche Dateien, die Systemdaten werden im übergeordneten Ordner installiert. Contao kann nicht installiert werden, wenn die Struktur nicht stimmt oder die Ordner nicht leer sind.","ui.setup.document-root.description2":"Falls du nicht weisst, wie dein Wurzelverzeichnis konfiguriert werden kann, lies die Contao Dokumentation oder kontaktiere deinen Hosting-Anbieter.","ui.setup.document-root.documentation":"Dokumentation lesen","ui.setup.document-root.conflictsTitle":"Installationsverzeichnis nicht leer","ui.setup.document-root.conflictsDirectory":"Das Wurzelverzeichnis deiner zukünftigen Contao-Installation ist nicht leer, es wurden {count} Datei(en) gefunden, die bei der Installation überschrieben werden könnten. Es wird empfohlen Contao in ein leeres Verzeichnis zu installieren, aber du kannst auch die Dateien löschen und erneut prüfen lassen, wenn du sicher bist, dass diese nicht benötigt werden.","ui.setup.document-root.ignoreConflicts":"Ich will Contao in ein nicht-leeres Verzeichnis installieren. Ich verstehe, dass dadurch bestehende Dateien auf meinem Server möglicherweise überschrieben werden.","ui.setup.document-root.check":"Erneut prüfen","ui.setup.document-root.create":"Verzeichnisse erstellen","ui.setup.document-root.change":"Verzeichnisse ändern","ui.setup.document-root.formTitle":"Verzeichnisstruktur einrichten","ui.setup.document-root.formText1":"Der Contao Manager kann automatisch eine neue Verzeichnisstruktur auf dem Server einrichten.","ui.setup.document-root.formText2":"Du musst das Wurzelverzeichnis danach manuell umkonfigurieren (z. B. über die Hosting-Administration).","ui.setup.document-root.autoconfig":"Ich habe verstanden, dass meine Server-Konfiguration geändert werden muss. Wenn ich dies nicht tue, funktioniert der Contao Manager nicht mehr und meine Konfigurationsdateien (inklusive Benutzer & Passwörter) werden öffentlich erreichbar!","ui.setup.document-root.directory":"Neuer Ordner","ui.setup.document-root.currentRoot":"Aktuelles Wurzelverzeichnis","ui.setup.document-root.newRoot":"Neues Wurzelverzeichnis","ui.setup.document-root.finish":"Ordner erstellen","ui.setup.document-root.publicDir":"{dir} für öffentliche Dateien nutzen (Contao {version})","ui.setup.document-root.directoryInvalid":"Bitte gib einen gültigen Ordnernamen ein.","ui.setup.document-root.directoryExists":"Das Zielverzeichnis ist bereits vorhanden. Bitte gibt einen anderen Namen ein.","ui.setup.document-root.confirmation":"Der Contao Manager hat die benötigten Verzeichnisse erfolgreich angelegt. Nun musst du dein Wurzelverzeichnis anpassen. Lade die Seite nicht neu, bis dies erledigt ist.","ui.setup.document-root.reload":"Neu laden","ui.setup.document-root.success":"Die Verzeichnisstruktur auf deinem Server ist korrekt eingerichtet!","ui.setup.document-root.installingProjectDir":"Systemdateien werden nach {dir} installiert.","ui.setup.document-root.installingPublicDir":"Öffentliche Dateien werden nach {dir} installiert.","ui.setup.document-root.installedProjectDir":"Systemdateien sind in {dir} installiert.","ui.setup.document-root.installedPublicDir":"Öffentliche Dateien sind in {dir} installiert.","ui.setup.create-project.headline":"Contao-Installation","ui.setup.create-project.description":"Die Contao-Entwicklung folgt dem Prinzip von {semver}, eine neue Minor-Version wird alle sechs Monate veröffentlicht. Die aktuell unterstützten Versionen sind:","ui.setup.create-project.semver":"Semantic Versioning","ui.setup.create-project.latestTitle":"Neuste","ui.setup.create-project.ltsTitle":"Langzeit-Support","ui.setup.create-project.latestQ1":"Unsere neuste Version mit den meisten Funktionen, wird bis Februar {year} unterstützt.","ui.setup.create-project.latestQ3":"Unsere neuste Version mit den meisten Funktionen, wird bis August {year} unterstützt.","ui.setup.create-project.ltsText":"Unsere aktuelle LTS-Version mit Fokus auf Stabilität. Bietet einen verlängerten Supportzeitraum bis Februar {year}.","ui.setup.create-project.pltsText":"Die vorherige LTS-Version, hat einen verlängerten Supportzeitraum bis Februar {year}","ui.setup.create-project.requiresPHP":"Benötigt mindestens PHP {version}, du hast PHP {current}.","ui.setup.create-project.releaseplan":"Weitere Details findest du im {contaoReleasePlan}.","ui.setup.create-project.releaseplanLink":"Contao Release-Plan","ui.setup.create-project.installed":"Contao {version} wurde erfolgreich auf dem Server installiert. Fahre weiter, um die Datenbank einzurichten, oder gehe zum Contao Manager um eine andere Version zu installieren.","ui.setup.create-project.formTitle":"Wähle eine Distribution","ui.setup.create-project.formText":"Bitte wähle die zu installierende Version.","ui.setup.create-project.version":"Version","ui.setup.create-project.demo":"Beispiel-Webseite installieren","ui.setup.create-project.demoDescription":"Die Beispiel-Webseite von Contao hilft dir dabei, dich mit dem System und seinen Hauptfunktionen vertraut zu machen. Weitere Themes findest du im {store}.","ui.setup.create-project.coreOnly":"Minimale Installation (nur Core)","ui.setup.create-project.noUpdate":"Installation überspringen (Expertenmodus!)","ui.setup.create-project.theme":"Theme für Contao","ui.setup.create-project.themeInstall":"Um ein Theme für Contao zu installieren, benutze die Sucheingabe oder lade eine Theme-Datei (.cto/.zip) hoch, die den Contao Manager unterstützt.","ui.setup.create-project.themeBuy":"Besuche auch den {store}.","ui.setup.create-project.themeStore":"Contao Themes-Store","ui.setup.create-project.themeUpload":"Theme-Datei (.cto/.zip) hochladen","ui.setup.create-project.themeInvalid":"Die hochgeladene Datei ist kein Theme für Contao oder unterstützt die Installation im Contao Manager nicht.","ui.setup.create-project.themeWarning":"Der Contao Manager kann nicht beurteilen, ob dieses Theme mit deinem Server kompatibel ist. Wende dich bei Fragen bitte direkt an den Theme-Hersteller.","ui.setup.create-project.themeTitle":"Theme-Details überprüfen","ui.setup.create-project.themeDetails":"Die nachfolgenden Abhängigkeiten und Dateien werden mit diesem Theme installiert.","ui.setup.create-project.themeRequire":"{count} Abhängigkeit | {count} Abhängigkeiten","ui.setup.create-project.themeFiles":"{count} Datei | {count} Dateien","ui.setup.create-project.theme.or":"oder suche öffentliche Themes","ui.setup.create-project.theme.search":"Themes durchsuchen","ui.setup.create-project.theme.more":"Weitere Themes","ui.setup.create-project.theme.empty":"Keine Theme für {query} gefunden","ui.setup.create-project.theme.uploaded":"Die Theme-Datei wurde erfolgreich hochgeladen.","ui.setup.create-project.theme.packageName":"Paketname","ui.setup.create-project.theme.version":"Version","ui.setup.create-project.theme.authors":"Autor(en)","ui.setup.create-project.theme.upload":"{name} ({size}) wird hochgeladen","ui.setup.create-project.install":"Installieren","ui.setup.create-project.cancel":"Abbrechen","ui.setup.database-connection.headline":"Datenbank-Verbindung","ui.setup.database-connection.description":"Contao benötigt eine MySQL Datenbank (oder ein kompatibler Fork wie MariaDB), um Seiten, Inhalte und andere Daten zu speichern. Die Verbindungsdaten werden in der Datei {env} im Systemverzeichnis von Contao gespeichert werden.","ui.setup.database-connection.formTitle":"Verbindungs-Parameter","ui.setup.database-connection.formText":"Gib eine Datenbank-URL ein, oder fülle die Felder für Benutzername, Passwort, Server und Datenbank separat aus.","ui.setup.database-connection.url":"Datenbank-URL","ui.setup.database-connection.validUrl":"Datenbank-URL ungültig oder Verbindung zum Server fehlgeschlagen.","ui.setup.database-connection.or":"oder","ui.setup.database-connection.user":"Benutzername","ui.setup.database-connection.password":"Passwort","ui.setup.database-connection.server":"Server (:Port)","ui.setup.database-connection.database":"Datenbankname","ui.setup.database-connection.connected":"Erfolgreich verbunden mit Datenbank {database} auf {server}.","ui.setup.database-connection.error":"Fehler beim Verbinden mit der Datenbank.","ui.setup.database-connection.problem":"Contao hat ein Problem mit dem Datenbank-Server gefunden.","ui.setup.database-connection.schemaTitle":"Datenbank-Schema","ui.setup.database-connection.migration":"Es gibt eine ausstehende Migration. | Es gibt {count} ausstehende Migrationen.","ui.setup.database-connection.schema":"Es gibt eine ausstehende Schema-Änderung. | Es gibt {count} ausstehende Schema-Änderungen.","ui.setup.database-connection.noChanges":"Dein Datenbank-Schema ist aktuell.","ui.setup.database-connection.check":"Datenbank prüfen","ui.setup.database-connection.skip":"Überspringen","ui.setup.database-connection.save":"Speichern","ui.setup.database-connection.change":"Zugangsdaten ändern","ui.setup.database-connection.restoreTitle":"Datenbank-Import","ui.setup.database-connection.restoreText":"Das soeben installierte Theme enthält ein Datenbank-Backup. Du kannst diese Theme-Daten in die Datenbank importieren oder diesen Schritt überspringen und mit einem leeren Contao beginnen. | Das soeben installierte Theme enthält mehrere Datenbank-Backups. Wähle eine Backup-Datei für den Import oder überspringe diesen Schritt, um mit einem leeren Contao zu beginnen.","ui.setup.database-connection.backup":"Datenbank vor dem Import sichern","ui.setup.database-connection.backupWarning":"Alle Daten in der Datenbank werden beim Import überschrieben! Erstelle zuerst ein Backup, falls die Datenbank nicht leer ist.","ui.setup.database-connection.restore":"Theme importieren","ui.setup.database-connection.restoreOption":"Backup vom {date} ({size})","ui.setup.database-connection.restored":"Die Theme-Datenbank wurde erfolgreich importiert. Fahre fort, um das Datenbank-Schema zu überprüfen.","ui.setup.backend-user.success":"Es ist bereits ein Benutzerkonto in der Datenbank vorhanden. Weitere Konten können über das Backend hinzugefügt werden.","ui.setup.backend-user.error":"Die Benutzerliste konnte nicht gelesen werden. Weitere Details findest du in der Konsolen-Ausgabe.","ui.setup.backend-user.headline":"Backend-Konto","ui.setup.backend-user.description":"Um deine Webseite zu verwalten, benötigst du mindestens ein Administratorkonto für das Contao Backend. Beachte, dass dieses Konto nicht mit dem Contao Manager zusammenhängt.","ui.setup.backend-user.formTitle":"Benutzerkonto erstellen","ui.setup.backend-user.formText":"Bitte gib die Details für das neue Backend-Konto ein.","ui.setup.backend-user.username":"Benutzername","ui.setup.backend-user.name":"Name","ui.setup.backend-user.email":"E-Mail-Adresse","ui.setup.backend-user.emailInvalid":"Bitte gib eine gültige E-Mail-Adresse ein","ui.setup.backend-user.password":"Passwort","ui.setup.backend-user.passwordPlaceholder":"min. 8 Zeichen","ui.setup.backend-user.passwordLength":"Bitte gib mindestens 8 Zeichen ein.","ui.setup.backend-user.create":"Konto hinzufügen","ui.task.headline":"Hintergrund-Prozess","ui.task.loading":"Lade Details …","ui.task.created":"Lade Details …","ui.task.active":"Bitte warte, während der Contao Manager die nötigen Operationen im Hintergrund ausführt.","ui.task.complete":"Alle Operationen erfolgreich abgeschlossen. Weitere Details findest du in der Konsolen-Ausgabe.","ui.task.paused":"Ein Hintergrund-Prozess wurde unerwartet beendet. Bitte prüfe die Konsolen-Ausgabe.","ui.task.aborting":"Bitte warte, während der Hintergrund-Prozess abgebrochen wird.","ui.task.stopped":"Einige Operationen wurden abgebrochen. Bitte prüfe die Konsolen-Ausgabe.","ui.task.error":"Ein Hintergrund-Prozess wurde unerwartet beendet. Bitte prüfe die Konsolen-Ausgabe.","ui.task.failed":"Der Contao Manager konnte den Hintergrund-Prozess nicht starten.","ui.task.failedDescription1":"Die Ausführung der Aufgabe ist fehlgeschlagen.","ui.task.failedDescription2":"Sollte dies wiederholt geschehen, wird dein Server möglicherweise nicht unterstützt.","ui.task.reportProblem":"Probleme melden","ui.task.pausedDescription":"Klick auf \\"Weiter\\", um den Fehler zu ignorieren und die verbleibenden Aufgaben auszuführen.","ui.task.sponsor":"Composer Cloud gesponsert von {sponsor}","ui.task.buttonAudit":"Datenbank aktualisieren","ui.task.buttonClose":"Schließen","ui.task.buttonConfirm":"Bestätigen & Schließen","ui.task.buttonContinue":"Weiter","ui.task.buttonCancel":"Abbrechen","ui.task.confirmCancel":"Möchtest du diesen Prozess wirklich abbrechen? Deine Contao-Installation könnte in einem defekten Zustand zurückbleiben!","ui.task.autoclose":"Fenster bei Erfolg schließen","ui.console.toggle":"Konsolenausgabe anzeigen/verstecken","ui.console.showLog":"Vollständige Konsole anzeigen","ui.console.copyLog":"Konsole in Zwischenablage kopieren","ui.migrate.headline":"Datenbank-Änderungen","ui.migrate.migrationsOnly":"(nur Migrationen)","ui.migrate.schemaOnly":"(nur Schema)","ui.migrate.loading":"Bitte warten, die Datenbank wird überprüft …","ui.migrate.empty":"Keine ausstehenden Migrationen oder Schema-Änderungen gefunden. Deine Datenbank ist auf dem aktuellsten Stand.","ui.migrate.emptyMigrations":"Keine ausstehenden Migrationen gefunden. Bitte prüfe auch die Schema-Änderungen.","ui.migrate.emptySchema":"Keine ausstehenden Schema-Änderungen gefunden. Bitte prüfe auch die Migrationen.","ui.migrate.pending":"Die Datenbank ist nicht aktuell. Bitte prüfe die untenstehende Konsolenausgabe und führe die Änderungen aus.","ui.migrate.previousChanges":"Eine vorherige Datenbankmigration wurde nicht bestätigt.\\nBitte prüfen die untenstehende Konsolenausgabe und klicke weiter, um die nächsten Änderungen zu sehen.","ui.migrate.previousComplete":"Eine vorherige Datenbankmigration wurde nicht bestätigt, bitte prüfe die untenstehende Konsolenausgabe.\\nEs gibt keine weiteren ausstehenden Änderungen.","ui.migrate.appliedChanges":"Die Datenbankänderungen wurden übernommen.\\nBitte prüfe die untenstehende Konsolenausgabe, dann klicke weiter, um die nächsten Änderungen zu sehen.","ui.migrate.appliedComplete":"Die Datenbankänderungen wurden übernommen.\\nEs gibt keine weiteren Migrationen oder Schema-Änderungen. Deine Datenbank ist auf dem aktuellen Stand.","ui.migrate.problem":"Contao hat ein Problem mit dem Datenbank-Server gefunden.\\nBitte prüfe die Konsolen-Ausgabe unten, um zu sehen was angepasst werden muss. | Contao hat Probleme mit dem Datenbank-Server gefunden.\\nBitte prüfe die Konsolen-Ausgabe unten, um zu sehen was angepasst werden muss.","ui.migrate.warning":"Contao hat eine Fehlkonfiguration des Datenbank-Servers gefunden.\\nDie unten stehenden Warnungen sollten für optimalen Betrieb und Datensicherheit behoben werden.","ui.migrate.error":"Die Änderungen konnten nicht angewendet werden. Möglicherweise wurde die Datenbank geändert, bitte prüfe nochmals und versuche es erneut.","ui.migrate.execute":"Ausführen","ui.migrate.close":"Schließen","ui.migrate.confirm":"Bestätigen & Schließen","ui.migrate.cancel":"Abbrechen","ui.migrate.continue":"Weiter","ui.migrate.setup":"Einrichtung","ui.migrate.skip":"Überspringen","ui.migrate.retry":"Erneut prüfen","ui.migrate.retryAll":"Alles überprüfen","ui.migrate.withDeletes":"Alle Änderungen inklusive Löschungen anwenden.","ui.migrate.migrationTitle":"Datenbank-Migrationen","ui.migrate.schemaTitle":"Schema-Änderungen","ui.migrate.problemTitle":"Datenbank-Probleme","ui.migrate.warningTitle":"Datenbank-Warnungen","ui.migrate.addTable":"Tabelle {table} hinzufügen","ui.migrate.dropTable":"Tabelle {table} löschen","ui.migrate.addField":"Feld {table}.{field} hinzufügen","ui.migrate.changeField":"Feld {table}.{field} ändern","ui.migrate.dropField":"Feld {table}.{field} löschen","ui.migrate.createIndex":"Index \\"{name}\\" zu {table} hinzufügen","ui.migrate.dropIndex":"Index \\"{name}\\" aus {table} löschen","ui.widget.mandatory":"Dieses Feld darf nicht leer sein.","ui.widget.blankOption":"Bitte wählen …","ui.widget.showPassword":"Passwort anzeigen","ui.widget.hidePassword":"Passwort ausblenden","ui.error.title":"HTTP-Anfrage für \\"{method} {url}\\" fehlgeschlagen.","ui.error.server500":"Es scheint ein unbekannter Fehler aufgetreten zu sein. Prüfe die Log-Dateien deines Webservers (Apache/Nginx) und des Contao Managers im Ordner \\"contao-manager/logs\\".","ui.error.response":"Der Server hat eine Antwort mit Status-Code {status} gesendet.","ui.error.moreLink":"Weitere Informationen","ui.error.support":"Contao Support","ui.error.permission":"Du hast keine Berechtigung für diese Funktion.","ui.footer.help":"Hilfe","ui.footer.reportProblem":"Probleme melden","ui.navigation.discover":"Entdecken","ui.navigation.packages":"Pakete","ui.navigation.tools":"Tools","ui.navigation.installTool":"Installtool","ui.navigation.backend":"Contao-Backend","ui.navigation.debug":"Contao-Debug-Modus","ui.navigation.logViewer":"System-Log","ui.navigation.phpinfo":"PHP-Informationen","ui.navigation.phpinfoLoading":"Lade PHP-Informationen…","ui.navigation.maintenance":"Systemwartung","ui.navigation.rebuildCache":"Cache erneuern","ui.navigation.users":"Konten","ui.navigation.systemCheck":"Systemprüfung","ui.navigation.advanced":"Fortgeschritten","ui.navigation.logout":"Abmelden","ui.maintenance.database.title":"Datenbank-Migrationen und -Backups","ui.maintenance.database.description":"Datenbankmigrationen stellen konsistente Daten und Tabellenschemas sicher.","ui.maintenance.database.migrations":"Eine ausstehende Datenbank-Migration | {count} ausstehende Datenbank-Migrationen","ui.maintenance.database.schemaUpdates":"Eine ausstehende Schema-Änderung | {count} ausstehende Schema-Änderungen","ui.maintenance.database.error":"Datenbank-Problem gefunden.","ui.maintenance.database.warning":"Datenbank-Warnung gefunden.","ui.maintenance.database.button":"Datenbank prüfen","ui.maintenance.database.migrationOnly":"Nur Migrationen prüfen","ui.maintenance.database.schemaOnly":"Nur Schema prüfen","ui.maintenance.database.installTool":"Install-Tool öffnen","ui.maintenance.database.createBackup":"Backup erstellen","ui.maintenance.database.backupUnsupported":"Datenbank-Backups werden von deiner Contao-Version nicht unterstützt.","ui.maintenance.database.backupList":"Du hast ein Datenbank-Backup, erstellt am {date}. | Du hast {count} Datenbank-Backups, das neuste wurde am {date} erstellt.","ui.maintenance.database.backupEmpty":"Du hast noch keine Datenbank-Backups.","ui.maintenance.rebuildCache.title":"Anwendungs-Cache","ui.maintenance.rebuildCache.description":"Nach dem Ändern einer der Konfigurationsdateien muss der Anwendungs-Cache neu aufgebaut werden.","ui.maintenance.rebuildCache.rebuildProd":"Prod.-Cache erneuern","ui.maintenance.rebuildCache.rebuildDev":"Dev.-Cache erneuern","ui.maintenance.rebuildCache.clearProd":"Prod.-Cache leeren","ui.maintenance.rebuildCache.clearDev":"Dev.-Cache leeren","ui.maintenance.installTool.title":"Contao-Installtool","ui.maintenance.installTool.description":"Das Contao-Installtool wird automatisch gesperrt, wenn das Passwort drei Mal falsch eingegeben wird.","ui.maintenance.installTool.unlock":"Installtool entsperren","ui.maintenance.installTool.lock":"Installtool sperren","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"Der Composer-Autoloader ist für das Laden der PHP-Klassen verantwortlich. Der Autoloader muss nach dem Hinzufügen von eigenen Namespaces in die composer.json neu geschrieben werden.","ui.maintenance.dumpAutoload.button":"Datei aktualisieren","ui.maintenance.composerInstall.title":"Composer-Abhängigkeiten","ui.maintenance.composerInstall.description":"Composer-Abhängigkeiten befinden sich im Ordner {vendor} im Hauptverzeichnis deiner Anwendung. Eine Neuinstallation der Abhängigkeiten kann nach der Bearbeitung oder dem manuellen Hochladen der Datei {composerLock} notwendig sein.","ui.maintenance.composerInstall.button":"Installer ausführen","ui.maintenance.composerInstall.update":"Composer Update ausführen","ui.maintenance.composerCache.title":"Composer-Cache","ui.maintenance.composerCache.description":"Composer speichert heruntergeladene Pakete im Cache, um die Performance zu verbessern. Wenn Du z. B. Probleme mit korrupten Dateien hast, kannst du den Composer-Cache leeren, um einen neuen Download zu erzwingen.","ui.maintenance.composerCache.button":"Cache leeren","ui.maintenance.maintenanceMode.title":"Wartungsmodus","ui.maintenance.maintenanceMode.description":"Im Wartungsmodus zeigt Contao das \\"503 Dienst nicht verfügbar\\"-Template anstelle der Webseite an.","ui.maintenance.maintenanceMode.enable":"Aktivieren","ui.maintenance.maintenanceMode.disable":"Deaktivieren","ui.maintenance.debugMode.title":"Debug-Modus","ui.maintenance.debugMode.description":"Aktiviere den Debug-Modus, indem du einen Benutzer und ein Passwort für den Einstiegspunkt {appDevPhp} festlegen.","ui.maintenance.debugMode.descriptionJwt":"Aktiviert den Debug-Modus, indem für die aktuelle Domain ein entsprechendes Cookie gesetzt wird.","ui.maintenance.debugMode.activate":"Aktivieren","ui.maintenance.debugMode.deactivate":"Deaktivieren","ui.maintenance.debugMode.credentials":"Anmeldedaten","ui.maintenance.debugMode.user":"Bitte gib einen Benutzernamen für den Debug-Modus ein.","ui.maintenance.debugMode.password":"Bitte gib ein Passwort für den Debug-Modus ein.","ui.maintenance.opcodeCache.title":"Opcode-Cache","ui.maintenance.opcodeCache.description":"Der Opcode-Cache speichert PHP-Dateien im Webprozess für eine schnellere Ausführung. Er muss unter Umständen gelöscht werden, wenn Dateien nach dem Ändern nicht erkannt werden.","ui.maintenance.opcodeCache.button":"Cache leeren","ui.maintenance.safeMode":"Deaktiviert im abgesicherten Modus","ui.maintenance.unsupported":"Von deiner Contao-Version nicht unterstützt","ui.packages.updateButton":"Pakete aktualisieren","ui.packages.searchButton":"Pakete suchen","ui.packages.searchPlaceholder":"Pakete suchen …","ui.packages.uploadOverlay":"Lege Dateien hier ab, um sie hochzuladen","ui.packages.uploadButton":"Pakete hochladen","ui.packages.uploadMessage":"Du hast einen unbestätigten Upload. | Du hast {count} unbestätigte Uploads.","ui.packages.uploadApply":"Uploads bestätigen","ui.packages.uploadReset":"Uploads löschen","ui.packages.uploadIncomplete":"Diese Datei wurde nicht vollständig hochgeladen. Bitte entferne sie und versuchen es noch einmal.","ui.packages.uploadDuplicate":"Diese Datei scheint mehrfach hochgeladen worden zu sein. Bitte entferne die Duplikate.","ui.packages.uploadInstalled":"Diese Datei ist bereits installiert. Bitte entferne die Duplikate.","ui.packages.uploadUnsupported":"Uploads werden in deiner Installation nicht unterstützt. Stelle sicher, dass die PHP ZIP-Erweiterung installiert ist und aktualisiere die Abhängigkeiten.","ui.packages.changesMessage":"Du hast eine unbestätigte Änderung. | Du hast {count} unbestätigte Änderungen.","ui.packages.changesDryrun":"Testlauf","ui.packages.changesApply":"Änderungen anwenden","ui.packages.changesApplyAll":"Alle Pakete aktualisieren","ui.packages.changesDryrunAll":"Testlauf mit allen Paketen","ui.packages.changesReset":"Änderungen verwerfen","ui.packages.changesReview":"Änderungen prüfen","ui.packagelist.loading":"Laden …","ui.packagelist.uploads":"Uploads","ui.packagelist.added":"Neue Pakete","ui.packagelist.installed":"Installierte Pakete","ui.package.hintRevert":"Änderung verwerfen","ui.package.hintNoupdate":"Nicht aktualisieren","ui.package.hintConstraint":"Dieses Paket wird mit der Versionsbedingung {constraint} installiert, wenn du die Änderungen anwendest.","ui.package.hintConstraintBest":"Dieses Paket wird in der besten verfügbaren Version installiert, wenn du die Änderungen anwendest.","ui.package.hintConstraintChange":"Die Versionsbedingung dieses Pakets wird von \\"{from}\\" in \\"{to}\\" geändert, wenn du die Änderungen anwendest.","ui.package.hintConstraintUpdate":"Dieses Paket wird aktualisiert, wenn du die Änderungen anwendest.","ui.package.hintAdded":"Dieses Paket wird installiert, wenn du die Änderungen anwendest.","ui.package.hintRemoved":"Dieses Paket wird entfernt, wenn du die Änderungen anwendest.","ui.package.requiredTitle":"manuell hinzugefügt","ui.package.requiredText":"Dieses Paket wurde in der composer.json hinzugefügt, ist aber nicht installiert.","ui.package.removedTitle":"manuell entfernt","ui.package.removedText":"Dieses Paket wurde aus der composer.json entfernt.","ui.package.installed":"Aktuell installiert:","ui.package.version":"Version {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Stern | {count} Sterne","ui.package.editConstraint":"Bearbeiten","ui.package.uploadConstraint":"Diese Versionsbedingung wird von dem hochgeladenen Paket definiert.","ui.package.updateButton":"Aktualisieren","ui.package.removeButton":"Entfernen","ui.package.installButton":"Paket hinzufügen","ui.package.installButtonShort":"Hinzufügen","ui.package.detailsButton":"Details","ui.package.latestConstraint":"neuste Version","ui.package.update":"Update verfügbar","ui.package.updateLatest":"neuste Version","ui.package.updateAvailable":"{version} verfügbar","ui.package.updateUnknown":"unbekannte Version","ui.package.updateConstraint":"Es ist eine neuere Version ausserhalb der Versionsbedingung verfügbar.","ui.package.incompatible":"{package} funktioniert nicht mit Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Version {version}","ui.cloudStatus.waitingTime":"Wartezeit","ui.cloudStatus.jobs":"Aktive Aufgaben","ui.cloudStatus.workers":"Server","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"keine","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ca. {minutes} min {seconds} sek","ui.cloudStatus.error":"Status der Composer Resolver Cloud konnte nicht abgerufen werden. Möglicherweise gibt es ein Wartungsfenster oder Systemprobleme.","ui.cloudStatus.button":"Cloud-Status","ui.cloudStatus.refresh":"Cloud-Status aktualisieren","ui.log-viewer.loading":"Laden …","ui.log-viewer.empty":"Auf dem Server sind keine Logdateien vorhanden.","ui.log-viewer.reload":"Neu laden","ui.log-viewer.file":"Logdatei","ui.log-viewer.channel":"Kanal","ui.log-viewer.channelTitle":"Kanal in welcher die Nachricht geschrieben wurde.","ui.log-viewer.level":"Stufe","ui.log-viewer.levelTitle":"Wichtigkeit der Log-Nachricht.","ui.log-viewer.timeHeader":"Uhrzeit","ui.log-viewer.messageHeader":"Nachricht","ui.log-viewer.showContext":"Kontext anzeigen","ui.log-viewer.hideContext":"Kontext ausblenden","ui.log-viewer.showExtra":"Extras anzeigen","ui.log-viewer.hideExtra":"Extras ausblenden","ui.log-viewer.more":"Mehr laden …","ui.log-viewer.download":"Herunterladen","ui.log-viewer.downloadTitle":"Datei \\"{file}\\" herunterladen","ui.log-viewer.prodEnvironment":"Produktivumgebung","ui.log-viewer.devEnvironment":"Entwicklungsumgebung (Debug Modus)","ui.user-manager.loading":"Lade Benutzer:innen …","ui.user-manager.changePassword":"Passwort ändern","ui.user-manager.setupTotp":"Zwei-Faktor konfigurieren","ui.user-manager.disableTotp":"Zwei-Faktor deaktivieren","ui.user-manager.invite":"Benutzer:in einladen","ui.user-manager.delete":"Löschen","ui.user-manager.deleteConfirm":"Möchtest du das Konto von \\"{username}\\" wirklich löschen?","ui.user-manager.deleted":"Das Konto für {username} wurde gelöscht.","ui.user-manager.passwordHeadline":"Passwort ändern","ui.user-manager.passwordText":"Um dein Passwort zu ändern, gibt dein bestehendes und ein neues Passwort in den entsprechenden Feldern ein.","ui.user-manager.currentPassword":"Aktuelles Passwort","ui.user-manager.newPassword":"Neues Passwort","ui.user-manager.passwordPlaceholder":"min. 8 Zeichen","ui.user-manager.submitPassword":"Absenden","ui.user-manager.passwordChanged":"Dein Passwort wurde erfolgreich geändert.","ui.user-manager.passwordError":"Dieses Passwort stimmt nicht.","ui.user-manager.inviteHeadline":"Benutzer:in einladen","ui.user-manager.inviteText":"Falls du mehrere Logins zum Contao Manager benötigst, kannst du hier einen Einladungs-Link erstellen. Teile diesen Link mit jemandem oder benutze ihn auf einem anderen Gerät, um ein neues Konto mit den entsprechenden Berechtigungen zu erstellen.","ui.user-manager.inviteSuccess1":"Ein Einladungs-Link wurde erstellt. Mit der untenstehenden URL kann ein neues Konto für diesen Contao Manager erstellt werden. Die Einladung läuft ab am {expires} (eine Woche ab jetzt).","ui.user-manager.inviteSuccess2":"Kopiere den Link in deine Zwischenablage. Er funktioniert nur einmal, und du kannst ihn nach dem Schliessen dieses Fensterns nicht mehr sehen.","ui.user-manager.createInvitation":"Einladungs-Link erstellen","ui.user-manager.clipboard":"In Zwischenablage kopieren","ui.user-manager.permissions":"Mehr über Berechtigungen","ui.user-manager.cancel":"Abbrechen","ui.user-manager.close":"Schließen","ui.user-manager.you":"Du","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"Dieses Konto ist duch Zwei-Faktor-Anmeldung abgesichert.","ui.user-manager.2faDisabled":"Dieses Konto ist unsicher, da keine Zwei-Faktor-Anmeldung konfiguriert wurde.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"Dieses Konto ist durch einen Passkey abgesichert.","ui.totp.headline":"Zwei-Faktor Anmeldung","ui.totp.setupQr":"Scanne den QR-Code mit deiner 2FA/TOTP-Applikation.","ui.totp.setupCode":"Falls du den QR-Code nicht scannen kannst, gibt folgenden Schlüssel ein:","ui.totp.codeLabel":"Sicherheitscode","ui.totp.codeDescription":"Bitte gibt den Sicherheitscode ein, welcher von deiner 2FA/TOTP-Applikation generiert wurde.","ui.totp.disableText":"Gib den Sicherheitscode ein, um die Zwei-Faktor-Anmeldung zu deaktivieren.","ui.totp.invalid":"Der Sicherheitscode ist ungültig.","ui.totp.enable":"Aktivieren","ui.totp.disable":"Deaktivieren","ui.totp.cancel":"Abbrechen","ui.totp.enabled":"Die Zwei-Faktor-Anmeldung wurde erfolgreich aktiviert.","ui.totp.disabled":"Die Zwei-Faktor-Anmeldung wurde erfolgreich deaktiviert.","ui.totp.setup":"Zwei-Faktor-Anmeldung konfigurieren","ui.totp.skip":"Zwei-Faktor-Anmeldung überspringen"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[553],{5553:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Insecure Connection !!","ui.app.httpsDescription":"Without HTTPS your confidential data will be transferred unencrypted.","ui.app.httpsLink":"More Info","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Safe Mode enabled !!","ui.app.safeModeDescription":"Some features of the Contao Manager are not available.","ui.app.safeModeExit":"Exit Safe Mode","ui.app.limitedHeadline":"Remote Authentication","ui.app.limitedDescription":"You have limited permissions due to passwordless login.","ui.app.limitedLogout":"Re-authenticate","ui.app.totpHeadline":"Security Notice","ui.app.totpDescription":"Configure two-factor authentication now to secure your account.","ui.app.totpSetup":"Setup","ui.app.loading":"Loading Contao Manager …","ui.app.apiError":"Unexpected API status","ui.app.configSecurity1":"SECURITY ALERT !!! Unprotected config directory detected","ui.app.configSecurity2":"The Contao Manager has detected that its config files are publicly accessible. All operations are disabled until the directory is secured, otherwise an attacker could access sensitive data of your installation.\\n\\nTo fix this issue, make sure to prevent access to the \\"contao-manager\\" directory on your server. To learn how to do this, please refer to the manual of your webserver or contact your hosting provider.","ui.account.welcome":"Welcome","ui.account.intro1":"Welcome to the Contao Manager, a universal tool to install and manage Contao Open Source CMS. If you are new to it, please {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} to get started","ui.account.introManual":"read the manual","ui.account.intro2":"If you encounter any problems, check {ourGithubIssues} and feel free to create new one for anything that has not been reported yet.","ui.account.introIssues":"our GitHub issues","ui.account.headline":"User Account","ui.account.description":"To manage your installation, please create an account for the Contao Manager. Be aware that this account is not related to the Contao back end or front end.","ui.account.username":"Username","ui.account.password":"Password","ui.account.passwordPlaceholder":"min. 8 characters","ui.account.passwordLength":"Please enter at least 8 characters.","ui.account.loginInvalid":"There was an error when creating the account. Please try a different username.","ui.account.submit":"Create Account","ui.account.usePassword":"Use password for login","ui.account.usePasskey":"Use Passkey for login","ui.account.totpHeadline":"Two-factor authentication","ui.account.totpDescription":"Please enable two-factor authentication, which adds an extra layer of security to your account. In addition to your username and password, you will need to enter a verification code generated by a two-factor app such as 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator or any other TOTP app.","ui.account.totpSetup":"Configure now","ui.account.totpSkip":"Configure later","ui.account.login":"Decline Invitation","ui.account.contribute1":"Contao and the Contao Manager are sponsored by the non-profit Contao Association.","ui.account.contribute2":"Please consider contributing to open source by {donate}.","ui.account.contributeDonate":"making a donation","ui.login.headline":"Sign In","ui.login.description":"Login to manage your installation.","ui.login.username":"Username","ui.login.password":"Password","ui.login.totpHeadline":"Two-factor authentication","ui.login.totpDescription":"Please enter your verification code to complete the login process.","ui.login.totp":"Verification code","ui.login.forgotPassword":"Forgot your password?","ui.login.button":"Sign In","ui.login.passkey":"Sign In with Passkey","ui.login.cancel":"Cancel","ui.login.or":"or","ui.login.locked":"Access has been denied because the Contao Manager is locked. To unlock, delete the {lockFile} file in your Contao root directory.","ui.logout.headline":"Session Timeout","ui.logout.warning":"Your have been inactive for more than 25 minutes. For security reasons your session will be terminated shortly.","ui.logout.expired":"Your session was automatically terminated because you have been inactive for more than 30 minutes.","ui.logout.renew":"Keep Logged In","ui.logout.logout":"Logout","ui.logout.login":"Back To Login","ui.oauth.error":"Invalid OAuth attempt. Check the request parameters.","ui.oauth.https":"The redirect URI MUST use a secure protocol (https:) to prevent the authentication token from being transmitted in clear-text.","ui.oauth.headline":"Remote Authentication","ui.oauth.description":"The following application or service is requesting remote access to your Contao Manager instance.","ui.oauth.domain":"Before allowing access, make sure you know this URL and trust its owner!","ui.oauth.outOfScope":"Unfortunately, you do not have the necessary permissions to grant this access.","ui.oauth.allow":"Allow Access","ui.oauth.deny":"Deny Access","ui.oauth.switchUser":"Switch User","ui.scope.admin":"Admin access including user management","ui.scope.install":"Install new packages and change Contao configuration","ui.scope.update":"Update packages and execute maintenance tasks","ui.scope.read":"Read packages and configuration","ui.boot.headline":"System Check","ui.boot.description":"Please wait, we are analyzing your server …","ui.boot.issue1":"Installation Issues Detected","ui.boot.issue2":"Your installation has issues that have to be fixed before the Contao Manager can be used.","ui.boot.run":"Launch Contao Manager","ui.boot.safeMode":"Launch in Safe Mode","ui.recovery.headline":"System Recovery","ui.recovery.description":"The Contao Manager detected files that look like Contao, but the Command Line Interface does not work as expected.","ui.recovery.console":"Console Output","ui.recovery.repairOptions":"Please choose an option to repair your installation.","ui.recovery.repairHeadline":"Automatic Repair","ui.recovery.repairDescription":"Attempts to automatically repair the installation by rebuilding the application cache and re-installing the Composer packages.","ui.recovery.repairWarning":"Any modifications to the vendor files might be deleted in the process!","ui.recovery.repairFailed":"Automatic repair was not successful. Try the Safe Mode to manually repair the installation.","ui.recovery.repairButton":"Run System Repair","ui.recovery.safeModeHeadline":"Safe Mode","ui.recovery.safeModeDescription":"Launching the Contao Manager in Safe Mode allows to manage packages and run certain maintenance tasks, but features that rely on a working Contao installation will not be available.","ui.recovery.safeModeButton":"Launch in Safe Mode","ui.server.pending":"Waiting …","ui.server.running":"Analyzing …","ui.server.error":"Check failed due to an unexpected response from the server.","ui.server.details":"Details","ui.server.prerequisite":"Check cancelled due to a missing prerequisite.","ui.server.selfUpdate.title":"Updates of Contao Manager","ui.server.selfUpdate.update":"A new Contao Manager version {latest} is available.","ui.server.selfUpdate.manualUpdate":"A new Contao Manager version {latest} is available. Your server does not support automatic updates, please download the new version from {download}.","ui.server.selfUpdate.latest":"You are using the latest version {current}.","ui.server.selfUpdate.dev":"Development builds do not support automatic updates.","ui.server.selfUpdate.unsupported":"A new version is available but it does not support your PHP version.","ui.server.selfUpdate.button":"Run Self-Update","ui.server.selfUpdate.continue":"Continue","ui.server.config.title":"Server Configuration","ui.server.config.setup":"Configure","ui.server.config.change":"Change","ui.server.config.save":"Save","ui.server.config.cancel":"Cancel","ui.server.config.customOption":"Other …","ui.server.config.description":"To correctly run background tasks, the Contao Manager needs to know where to find the PHP command line binary and how to run commands separated from the web process.","ui.server.config.formTitle":"Server Configuration","ui.server.config.formText":"Please enter the path to your PHP binary. Make sure the binary is the same PHP version as your web process.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"The Composer Resolver Cloud allows to install Composer dependencies even if your server does not provide enough local memory. Please be aware that your package information will be transmitted to a cloud server operated by the Contao Association.","ui.server.config.cloud":"Use the Composer Resolver Cloud","ui.server.config.cli":"PHP Binary","ui.server.config.stateErrorCli":"No valid PHP binary was found on the server.","ui.server.config.stateErrorCloud":"The Composer Resolver Cloud is not supported.","ui.server.config.stateSuccess":"PHP binary at {php_cli}.","ui.server.php_web.title":"PHP Web Process","ui.server.php_web.below7":"Found PHP version {version}. Please switch to PHP 7 as soon as possible!","ui.server.php_web.success":"Found PHP version {version}, no known issues found.","ui.server.php_cli.title":"PHP Command Line Interface","ui.server.php_cli.success":"Found PHP version {version}, no known issues found.","ui.server.composer.title":"Composer Environment","ui.server.composer.success":"No known issues found.","ui.server.composer.install":"Composer dependencies are not installed.","ui.server.composer.button":"Install","ui.server.contao.title":"Contao Installation","ui.server.contao.setup":"Setup","ui.server.contao.check":"Check database","ui.server.contao.empty":"No Contao installation has been found.","ui.server.contao.old":"Contao version {version} is not compatible with the Contao Manager, please update your installation manually.","ui.server.contao.found":"Found Contao {version} (API version {api}).","ui.server.contao.connectionError":"Unable to connect to the database server.","ui.server.contao.connectionProblem":"Database problem found.","ui.server.contao.missingUser":"Admin account not found.","ui.setup.continue":"Continue","ui.setup.manager":"Launch Contao Manager","ui.setup.cancel":"Cancel","ui.setup.welcome":"Welcome","ui.setup.welcome1":"This wizard will take you through the necessary steps to set up your Contao Open Source CMS installation.","ui.setup.welcome2":"If you have any questions, please find documentation, forums, a Slack channel and more on the {support} page.","ui.setup.support":"community support","ui.setup.start":"Get started","ui.setup.complete":"Congratulations!","ui.setup.complete1":"Contao {version} has been installed successfully.","ui.setup.complete2":"To finish the setup process, please open the install tool to configure the database connection and create a back end user.","ui.setup.complete3":"You can now start to create your website in the Contao back end. If you need additional extensions, continue to the Contao Manager.","ui.setup.installTool":"Open the Install Tool","ui.setup.login":"Login to Contao","ui.setup.funding":"Free software is \\"free\\" as in \\"free speech\\", not as in \\"free beer\\". An Open Source project like Contao requires amounts of money that can\'t be raised by a single person or company.\\nIf you have a website or sell websites built with Contao, we would love to see you contribute back financially to the product your business relies upon.","ui.setup.fundingLink":"Learn more","ui.setup.document-root.headline":"Webserver Setup","ui.setup.document-root.warning":"To install Contao through the Contao Manager, you have to fix the document root on the web server.","ui.setup.document-root.description1":"Contao uses a separate folder for public files, application files are installed in its parent folder. Contao cannot be installed if the folder structure is not correct or the folders are not empty.","ui.setup.document-root.description2":"If you don\'t know how to configure your document root, please read the Contao documentation or contact your hosting provider.","ui.setup.document-root.documentation":"Read the Documentation","ui.setup.document-root.conflictsTitle":"Installation directory not empty","ui.setup.document-root.conflictsDirectory":"The root directory of your future Contao installation is not empty, we have found {count} file(s) that might be overwritten by the installation process. It is recommended to create an empty directory structure for Contao, but you can also remove the following files and check again if you are sure they are unused.","ui.setup.document-root.ignoreConflicts":"I want to install Contao into the non-empty directory. I understand that this might overwrite any existing files on my webspace.","ui.setup.document-root.check":"Check again","ui.setup.document-root.create":"Create directories","ui.setup.document-root.change":"Change directories","ui.setup.document-root.formTitle":"Directory Setup","ui.setup.document-root.formText1":"The Contao Manager can automatically create a new directory structure on the server.","ui.setup.document-root.formText2":"You will need to manually configure the new document root (e.g. through a hosting admin panel).","ui.setup.document-root.autoconfig":"I understand that I have to change my server configuration. Not configuring the document root will break the Contao Manager and expose configuration files (including account details and passwords)!","ui.setup.document-root.directory":"New Directory","ui.setup.document-root.currentRoot":"Current Document Root","ui.setup.document-root.newRoot":"New Document Root","ui.setup.document-root.finish":"Setup Directories","ui.setup.document-root.publicDir":"Use {dir} for public files (for Contao {version})","ui.setup.document-root.directoryInvalid":"Please enter a valid directory name.","ui.setup.document-root.directoryExists":"The target directory already exists. Please enter a different name.","ui.setup.document-root.confirmation":"The Contao Manager has successfully created the necessary directory for your Contao installation. You now have to configure the document root on your web server. Do not reload this page until then.","ui.setup.document-root.reload":"Reload Page","ui.setup.document-root.success":"The directory structure on your web server is set up correctly!","ui.setup.document-root.installingProjectDir":"Application files will be installed to {dir}.","ui.setup.document-root.installingPublicDir":"Public files will be installed to {dir}.","ui.setup.document-root.installedProjectDir":"Application files are installed in {dir}.","ui.setup.document-root.installedPublicDir":"Public files are installed in {dir}.","ui.setup.create-project.headline":"Contao Installation","ui.setup.create-project.description":"Contao development follows the principle of {semver}, a new minor version is released every six months. The currently supported releases are:","ui.setup.create-project.semver":"Semantic Versioning","ui.setup.create-project.latestTitle":"Latest","ui.setup.create-project.ltsTitle":"Long Term Support","ui.setup.create-project.latestQ1":"Our latest version, offers the most features with support until February {year}.","ui.setup.create-project.latestQ3":"Our latest version, offers the most features with support until August {year}.","ui.setup.create-project.ltsText":"Our current LTS version, if you focus on stability. Offers long term support until February {year}.","ui.setup.create-project.pltsText":"The previous LTS version, still has long term support until February {year}.","ui.setup.create-project.requiresPHP":"Requires at least PHP {version}, you have PHP {current}.","ui.setup.create-project.releaseplan":"See the {contaoReleasePlan} for detailed information.","ui.setup.create-project.releaseplanLink":"Contao Release Plan","ui.setup.create-project.installed":"Contao {version} is successfully installed on the server. Continue to set up your database or launch the Contao Manager to install a different version.","ui.setup.create-project.formTitle":"Select a distribution","ui.setup.create-project.formText":"Please choose which version should be installed.","ui.setup.create-project.version":"Version","ui.setup.create-project.demo":"Install the Contao demo website","ui.setup.create-project.demoDescription":"The demo website helps you to get familiar with Contao and all of its core features. More themes can be found in the {store}.","ui.setup.create-project.coreOnly":"Minimal Installation (Core only)","ui.setup.create-project.noUpdate":"Skip Installation (Expert Only!)","ui.setup.create-project.theme":"Contao Theme","ui.setup.create-project.themeInstall":"To install a Contao theme, use the search input or upload a theme file (.cto/.zip) that supports installation through the Contao Manager.","ui.setup.create-project.themeBuy":"Make sure to visit the official {store}.","ui.setup.create-project.themeStore":"Contao Themes Store","ui.setup.create-project.themeUpload":"Upload theme file (.cto/.zip)","ui.setup.create-project.themeInvalid":"The uploaded file is not a Contao theme or does not support the Contao Manager.","ui.setup.create-project.themeWarning":"The Contao Manager cannot tell whether this theme is compatible with your server. Please check with the theme vendor if you have any questions.","ui.setup.create-project.themeTitle":"Review theme details","ui.setup.create-project.themeDetails":"The following dependencies and files will be installed with this theme.","ui.setup.create-project.themeRequire":"{count} Dependencies | {count} Dependencies","ui.setup.create-project.themeFiles":"{count} File | {count} Files","ui.setup.create-project.theme.or":"or search public themes","ui.setup.create-project.theme.search":"Search themes","ui.setup.create-project.theme.more":"More themes","ui.setup.create-project.theme.empty":"No themes matching {query}","ui.setup.create-project.theme.uploaded":"The theme file was uploaded successfully.","ui.setup.create-project.theme.packageName":"Package name","ui.setup.create-project.theme.version":"Version","ui.setup.create-project.theme.authors":"Author(s)","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"Install","ui.setup.create-project.cancel":"Cancel","ui.setup.database-connection.headline":"Database Connection","ui.setup.database-connection.description":"Contao requires a MySQL database (or a compatible fork like MariaDB) to store pages, content, users and other relational data. Connection parameters are stored in the {env} file in the project root of your Contao installation.","ui.setup.database-connection.formTitle":"Connection Parameters","ui.setup.database-connection.formText":"Enter a database URL or fill in the username, password, server and database fields separately.","ui.setup.database-connection.url":"Database URL","ui.setup.database-connection.validUrl":"Database URL is invalid or connection to server failed.","ui.setup.database-connection.or":"or","ui.setup.database-connection.user":"Username","ui.setup.database-connection.password":"Password","ui.setup.database-connection.server":"Server (:Port)","ui.setup.database-connection.database":"Database Name","ui.setup.database-connection.connected":"Successfully connected to database {database} on {server}.","ui.setup.database-connection.error":"Error connecting to the database.","ui.setup.database-connection.problem":"Contao has detected a problem with your database server.","ui.setup.database-connection.schemaTitle":"Database Schema","ui.setup.database-connection.migration":"There is one pending migration. | There are {count} pending migrations.","ui.setup.database-connection.schema":"There is one pending schema update. | There are {count} pending schema updates.","ui.setup.database-connection.noChanges":"Your database schema is up to date.","ui.setup.database-connection.check":"Check database","ui.setup.database-connection.skip":"Skip","ui.setup.database-connection.save":"Save","ui.setup.database-connection.change":"Change credentials","ui.setup.database-connection.restoreTitle":"Database Import","ui.setup.database-connection.restoreText":"The theme you just installed contains a database backup. Restore the database to import theme data or skip this step to start with a blank Contao installation. | The theme you just installed contains multiple database backups. Select a backup file to import theme data or skip this step to start with a blank Contao installation.","ui.setup.database-connection.backup":"Backup current database before import","ui.setup.database-connection.backupWarning":"All data in database will be overwritten on import! Create a backup first if the database is not empty.","ui.setup.database-connection.restore":"Import theme database","ui.setup.database-connection.restoreOption":"Backup from {date} ({size})","ui.setup.database-connection.restored":"Your theme database was successfully imported. Continue to validate your database schema.","ui.setup.backend-user.success":"An admin account for the Contao back end was found in your database. Use the Contao back end to add more users.","ui.setup.backend-user.error":"Unable to retrieve user list. Check the console output for details.","ui.setup.backend-user.headline":"Backend Account","ui.setup.backend-user.description":"To manage your website, you need to have at least one admin account for the Contao back end. Be aware that this account is not related to the Contao Manager.","ui.setup.backend-user.formTitle":"Create Account","ui.setup.backend-user.formText":"Please enter the details for the new back end account.","ui.setup.backend-user.username":"Username","ui.setup.backend-user.name":"Name","ui.setup.backend-user.email":"E-mail address","ui.setup.backend-user.emailInvalid":"Please enter a valid e-mail address","ui.setup.backend-user.password":"Password","ui.setup.backend-user.passwordPlaceholder":"min. 8 characters","ui.setup.backend-user.passwordLength":"Please enter at least 8 characters.","ui.setup.backend-user.create":"Add account","ui.task.headline":"Background Task","ui.task.loading":"Loading details …","ui.task.created":"Loading details …","ui.task.active":"Please wait while the Contao Manager is running task operations in the background.","ui.task.complete":"All operations are completed successfully. Check the console output for details.","ui.task.paused":"A background operation stopped unexpectedly. Please check the console output.","ui.task.aborting":"Please wait while the background operations are being cancelled.","ui.task.stopped":"Some background operations were cancelled. Please check the console output.","ui.task.error":"A background operation stopped unexpectedly. Please check the console output.","ui.task.failed":"The Contao Manager failed to start a background task!","ui.task.failedDescription1":"Something went wrong while trying to execute operations in the background.","ui.task.failedDescription2":"If this happens again, your server might not be supported.","ui.task.reportProblem":"Report a Problem","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud sponsored by {sponsor}","ui.task.buttonAudit":"Update Database","ui.task.buttonClose":"Close","ui.task.buttonConfirm":"Confirm & Close","ui.task.buttonContinue":"Continue","ui.task.buttonCancel":"Cancel","ui.task.confirmCancel":"Are you sure to cancel this task? This might leave your Contao installation in a broken state!","ui.task.autoclose":"Close task details on success","ui.console.toggle":"Show/Hide Console Output","ui.console.showLog":"Show full console log","ui.console.copyLog":"Copy log to clipboard","ui.migrate.headline":"Database Updates","ui.migrate.migrationsOnly":"(migrations only)","ui.migrate.schemaOnly":"(schema only)","ui.migrate.loading":"Please wait, we are checking your database …","ui.migrate.empty":"No pending migrations or schema updates found. Your database is up to date.","ui.migrate.emptyMigrations":"No pending migrations found. Make sure to also check for schema updates.","ui.migrate.emptySchema":"No pending schema updates found. Make sure to also check for migrations.","ui.migrate.pending":"Your database is not up to date. Please review the console output below and execute the changes.","ui.migrate.previousChanges":"A previous database migration was not confirmed.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.previousComplete":"A previous database migration was not confirmed, please review the console output below.\\nThere are no more pending changes.","ui.migrate.appliedChanges":"Database updates have been applied.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.appliedComplete":"Database updates have been applied.\\nThere are no more pending migrations or schema updates. Your database is up to date.","ui.migrate.problem":"Contao has detected a problem with your database server.\\nPlease review the console output below to find out what needs to be fixed. | Contao has detected problems with your database server.\\nPlease review the console output below to find out what needs to be fixed.","ui.migrate.warning":"Contao has detected a misconfiguration of your database server.\\nWarnings can be skipped temporarily, but should be fixed for optimal performance and data integrity.","ui.migrate.error":"The changes could not be applied. Your database might have been changed, please check again to retry.","ui.migrate.execute":"Execute","ui.migrate.close":"Close","ui.migrate.confirm":"Confirm & Close","ui.migrate.cancel":"Cancel","ui.migrate.continue":"Continue","ui.migrate.setup":"Setup","ui.migrate.skip":"Skip","ui.migrate.retry":"Check again","ui.migrate.retryAll":"Check all","ui.migrate.withDeletes":"Execute all database changes including DROP queries.","ui.migrate.migrationTitle":"Database Migrations","ui.migrate.schemaTitle":"Schema Updates","ui.migrate.problemTitle":"Database Problems","ui.migrate.warningTitle":"Database Warnings","ui.migrate.addTable":"Add table {table}","ui.migrate.dropTable":"Drop table {table}","ui.migrate.addField":"Add field {table}.{field}","ui.migrate.changeField":"Change field {table}.{field}","ui.migrate.dropField":"Drop field {table}.{field}","ui.migrate.createIndex":"Create index \\"{name}\\" on {table}","ui.migrate.dropIndex":"Drop index \\"{name}\\" on {table}","ui.widget.mandatory":"This field must not be empty.","ui.widget.blankOption":"Please select …","ui.widget.showPassword":"Show password","ui.widget.hidePassword":"Hide password","ui.error.title":"HTTP request for \\"{method} {url}\\" failed.","ui.error.server500":"Looks like an unexpected error happened on your server. Please check the log files of your web server (Apache/Nginx) and the Contao Manager logs at \\"contao-manager/logs\\".","ui.error.response":"The server returned a response with status code {status}.","ui.error.moreLink":"More Information","ui.error.support":"Contao Support","ui.error.permission":"You do not have permission to use this feature.","ui.footer.help":"Help","ui.footer.reportProblem":"Report a Problem","ui.navigation.discover":"Discover","ui.navigation.packages":"Packages","ui.navigation.tools":"Tools","ui.navigation.installTool":"Install Tool","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Contao Debug Mode","ui.navigation.logViewer":"Log Viewer","ui.navigation.phpinfo":"PHP Information","ui.navigation.phpinfoLoading":"Loading PHP Information…","ui.navigation.maintenance":"Maintenance","ui.navigation.rebuildCache":"Rebuild Cache","ui.navigation.users":"Accounts","ui.navigation.systemCheck":"System Check","ui.navigation.advanced":"Advanced","ui.navigation.logout":"Logout","ui.maintenance.database.title":"Database Migrations and Backups","ui.maintenance.database.description":"Database migrations ensure consistent data and table schemas.","ui.maintenance.database.migrations":"One pending database migration | {count} pending database migrations","ui.maintenance.database.schemaUpdates":"One pending schema update | {count} pending schema updates","ui.maintenance.database.error":"Database problem found.","ui.maintenance.database.warning":"Database warnings found.","ui.maintenance.database.button":"Check database","ui.maintenance.database.migrationOnly":"Check migrations only","ui.maintenance.database.schemaOnly":"Check schema only","ui.maintenance.database.installTool":"Open Install Tool","ui.maintenance.database.createBackup":"Create Backup","ui.maintenance.database.backupUnsupported":"Database backups are not supported by your Contao version.","ui.maintenance.database.backupList":"You have one database backup, created on {date}. | You have {count} database backups, the latest one was created on {date}.","ui.maintenance.database.backupEmpty":"You currently have no database backups.","ui.maintenance.rebuildCache.title":"Application Cache","ui.maintenance.rebuildCache.description":"Rebuilding the application cache is required after modifying any of the configuration files.","ui.maintenance.rebuildCache.rebuildProd":"Rebuild Production Cache","ui.maintenance.rebuildCache.rebuildDev":"Rebuild Development Cache","ui.maintenance.rebuildCache.clearProd":"Clear Production Cache","ui.maintenance.rebuildCache.clearDev":"Clear Development Cache","ui.maintenance.installTool.title":"Contao Install Tool","ui.maintenance.installTool.description":"The Contao Install Tool is automatically locked if you enter a wrong password three times in a row.","ui.maintenance.installTool.unlock":"Unlock Install Tool","ui.maintenance.installTool.lock":"Lock Install Tool","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"The Composer autoloader is responsible for PHP class loading. The autoloader must be dumped after adding custom namespaces to the root composer.json.","ui.maintenance.dumpAutoload.button":"Dump Autoloader","ui.maintenance.composerInstall.title":"Composer Dependencies","ui.maintenance.composerInstall.description":"Composer dependencies are located in the {vendor} folder in your application root. Reinstalling the dependencies can be necessary after manipulation or manually uploading the {composerLock} file.","ui.maintenance.composerInstall.button":"Run Installer","ui.maintenance.composerInstall.update":"Run Composer Update","ui.maintenance.composerCache.title":"Composer Cache","ui.maintenance.composerCache.description":"Composer caches downloaded packages for improved performance. If you have issues like broken files, try to delete the Composer cache to force a new download.","ui.maintenance.composerCache.button":"Clear Cache","ui.maintenance.maintenanceMode.title":"Maintenance Mode","ui.maintenance.maintenanceMode.description":"Putting Contao in maintenance mode will display a \\"503 Service Unavailable\\" template for the website.","ui.maintenance.maintenanceMode.enable":"Enable","ui.maintenance.maintenanceMode.disable":"Disable","ui.maintenance.debugMode.title":"Debug Mode","ui.maintenance.debugMode.description":"Activate the debug mode by setting a user and password for the {appDevPhp} entry point.","ui.maintenance.debugMode.descriptionJwt":"Activate the debug mode by setting the debug cookie for the current domain.","ui.maintenance.debugMode.activate":"Activate","ui.maintenance.debugMode.deactivate":"Deactivate","ui.maintenance.debugMode.credentials":"Credentials","ui.maintenance.debugMode.user":"Please enter a username for the debug mode.","ui.maintenance.debugMode.password":"Please enter a password for the debug mode.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode caches PHP files on the web process for faster execution. It must be deleted under certain circumstances if files are not recognized after changing.","ui.maintenance.opcodeCache.button":"Truncate Cache","ui.maintenance.safeMode":"Not available in Safe Mode","ui.maintenance.unsupported":"Not supported by your Contao version","ui.packages.updateButton":"Update Packages","ui.packages.searchButton":"Search Packages","ui.packages.searchPlaceholder":"Search Packages …","ui.packages.uploadOverlay":"Drag & drop files to upload","ui.packages.uploadButton":"Upload Packages","ui.packages.uploadMessage":"You have one unconfirmed upload. | You have {count} unconfirmed uploads.","ui.packages.uploadApply":"Confirm Uploads","ui.packages.uploadReset":"Delete Uploads","ui.packages.uploadIncomplete":"This file was not uploaded completely. Please remove it and try again.","ui.packages.uploadDuplicate":"This file seems to be uploaded multiple times. Please remove the duplicates.","ui.packages.uploadInstalled":"This file is already installed. Please remove the duplicates.","ui.packages.uploadUnsupported":"Uploads are not supported in your installation. Please make sure that the PHP ZIP extension is installed and update your dependencies.","ui.packages.changesMessage":"You have one unconfirmed change. | You have {count} unconfirmed changes.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"Apply Changes","ui.packages.changesApplyAll":"Update all packages","ui.packages.changesDryrunAll":"Dry run all packages","ui.packages.changesReset":"Reset Changes","ui.packages.changesReview":"Review Changes","ui.packagelist.loading":"Loading …","ui.packagelist.uploads":"Uploads","ui.packagelist.added":"New packages","ui.packagelist.installed":"Installed packages","ui.package.hintRevert":"Revert Changes","ui.package.hintNoupdate":"Do not update","ui.package.hintConstraint":"This package will be installed with constraint {constraint} when you apply the changes.","ui.package.hintConstraintBest":"This package will be installed in the best available version when you apply the changes.","ui.package.hintConstraintChange":"The constraint for this package will be changed from \\"{from}\\" to \\"{to}\\" when you apply the changes.","ui.package.hintConstraintUpdate":"This package will be updated when you apply the changes.","ui.package.hintAdded":"This package will be installed when you apply the changes.","ui.package.hintRemoved":"This package will be removed when you apply the changes.","ui.package.requiredTitle":"manually added","ui.package.requiredText":"This package is required in your composer.json but not installed.","ui.package.removedTitle":"manually removed","ui.package.removedText":"This package was removed from your composer.json.","ui.package.installed":"Currently installed:","ui.package.version":"Version {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Star | {count} Stars","ui.package.editConstraint":"Edit","ui.package.uploadConstraint":"This constraint is defined by the uploaded package.","ui.package.updateButton":"Update","ui.package.removeButton":"Remove","ui.package.installButton":"Add Package","ui.package.installButtonShort":"Add","ui.package.detailsButton":"Details","ui.package.latestConstraint":"latest version","ui.package.update":"Update available","ui.package.updateLatest":"latest version","ui.package.updateAvailable":"{version} available","ui.package.updateUnknown":"unknown version","ui.package.updateConstraint":"A newer version outside your version constraint is available.","ui.package.incompatible":"{package} does not work with Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Version {version}","ui.cloudStatus.waitingTime":"Waiting Time","ui.cloudStatus.jobs":"Current Jobs","ui.cloudStatus.workers":"Workers","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"none","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ca. {minutes} min {seconds} sec","ui.cloudStatus.error":"Unable to fetch the status of the Composer Resolver Cloud. It might be down for maintenance or experience issues.","ui.cloudStatus.button":"Cloud Status","ui.cloudStatus.refresh":"Refresh Cloud Status","ui.log-viewer.loading":"Loading …","ui.log-viewer.empty":"There are no log files on your server.","ui.log-viewer.reload":"Reload","ui.log-viewer.file":"Log file","ui.log-viewer.channel":"Channel","ui.log-viewer.channelTitle":"The channel this message was logged to.","ui.log-viewer.level":"Level","ui.log-viewer.levelTitle":"Severity of the log message.","ui.log-viewer.timeHeader":"Time","ui.log-viewer.messageHeader":"Message","ui.log-viewer.showContext":"Show Context","ui.log-viewer.hideContext":"Hide Context","ui.log-viewer.showExtra":"Show Extra","ui.log-viewer.hideExtra":"Hide Extra","ui.log-viewer.more":"Load more …","ui.log-viewer.download":"Download","ui.log-viewer.downloadTitle":"Download file \\"{file}\\"","ui.log-viewer.prodEnvironment":"Production Environment","ui.log-viewer.devEnvironment":"Development Environment (Debug Mode)","ui.user-manager.loading":"Loading users …","ui.user-manager.changePassword":"Change Password","ui.user-manager.setupTotp":"Setup Two-Factor Authentication","ui.user-manager.disableTotp":"Disable Two-Factor Authentication","ui.user-manager.invite":"Invite User","ui.user-manager.delete":"Delete","ui.user-manager.deleteConfirm":"Do you really want to delete user \\"{username}\\"?","ui.user-manager.deleted":"User {username} deleted successfully","ui.user-manager.passwordHeadline":"Change Password","ui.user-manager.passwordText":"To change your password, please enter the current and a new password in the respective fields.","ui.user-manager.currentPassword":"Current password","ui.user-manager.newPassword":"New password","ui.user-manager.passwordPlaceholder":"min. 8 characters","ui.user-manager.submitPassword":"Submit","ui.user-manager.passwordChanged":"Your password has been changed successfully.","ui.user-manager.passwordError":"This password is incorrect.","ui.user-manager.inviteHeadline":"Invite User","ui.user-manager.inviteText":"If you need multiple logins for the Contao Manager, you can create an invitation link here. Share this link with someone or use it on another device to create a new account with the given permissions.","ui.user-manager.inviteSuccess1":"A new invitation link was created. The URL below can be used to create a new user account for this Contao Manager. The invitation expires on {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Please copy the link to your clipboard. It will only work once and you will not be able to see it again after closing this dialog.","ui.user-manager.createInvitation":"Create Invitation Link","ui.user-manager.clipboard":"Copy to clipboard","ui.user-manager.permissions":"Learn about permissions","ui.user-manager.cancel":"Cancel","ui.user-manager.close":"Close","ui.user-manager.you":"You","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Two-Factor Authentication","ui.totp.setupQr":"Please scan the QR code with your 2FA/TOTP app.","ui.totp.setupCode":"If you cannot scan the QR code, enter this key instead:","ui.totp.codeLabel":"Verification code","ui.totp.codeDescription":"Please enter the verification code generated by your 2FA/TOTP app.","ui.totp.disableText":"Please enter the verification code to disable two-factor authentication.","ui.totp.invalid":"The verification code is invalid.","ui.totp.enable":"Enable","ui.totp.disable":"Disable","ui.totp.cancel":"Cancel","ui.totp.enabled":"Two-factor authentication was enabled successfully.","ui.totp.disabled":"Two-factor authentication was disabled successfully.","ui.totp.setup":"Setup Two-Factor Authentication","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[551],{2551:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! ã“ã®æŽ¥ç¶šã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“ !!","ui.app.httpsDescription":"HTTPSã§ãªã„ã¨ç§˜å¯†ã®ãƒ‡ãƒ¼ã‚¿ã‚‚æš—å·åŒ–ã—ãªã„ã§é€ä¿¡ã—ã¦ã—ã¾ã„ã¾ã™ã€‚","ui.app.httpsLink":"è©³ç´°ãªæƒ…å ±","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! ã‚»ãƒ¼ãƒ•ãƒ¢ãƒ¼ãƒ‰ãŒæœ‰åйã§ã™ !!","ui.app.safeModeDescription":"Contao Managerã®ä¸€éƒ¨ã®æ©Ÿèƒ½ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。","ui.app.safeModeExit":"セーフモードを終了","ui.app.limitedHeadline":"リモートèªè¨¼","ui.app.limitedDescription":"パスワードãªã—ã®ãƒ­ã‚°ã‚¤ãƒ³ã®ãŸã‚é™ã‚ŒãŸæ¨©é™ã«ãªã£ã¦ã„ã¾ã™ã€‚","ui.app.limitedLogout":"å†èªè¨¼","ui.app.totpHeadline":"ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã®æ³¨æ„","ui.app.totpDescription":"ã™ãã«2ファクタèªè¨¼ã‚’æ§‹æˆã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’安全ã«ã—ã¾ã™ã€‚","ui.app.totpSetup":"セットアップ","ui.app.loading":"Contao Managerを読ã¿è¾¼ã¿ä¸­â€¦","ui.app.apiError":"予期ã—ãªã„APIã®çŠ¶æ…‹","ui.app.configSecurity1":"セキュリティ警告!!! ä¿è­·ã—ã¦ã„ãªã„設定ディレクトリを検出","ui.app.configSecurity2":"Contao Managerã¯è¨­å®šãƒ•ァイルãŒå…¬é–‹ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã§ãる状態を検出ã—ã¾ã—ãŸã€‚ディレクトリを安全ãªçŠ¶æ…‹ã«ã™ã‚‹ã¾ã§ã€ã™ã¹ã¦ã®æ“作ã¯å‹•作ã—ã¾ã›ã‚“ã€ãã†ã—ãªã„ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å«ã¾ã‚Œã¦ã„る極秘データを攻撃者ãŒã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã§ã™ã€‚\\n\\nã“れを修正ã™ã‚‹ã«ã¯\\"contao-manager\\"ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢ã—ã¦ãã ã•ã„。ã“ã®æ–¹æ³•ã‚’å­¦ã¶ã«ã¯ã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’å‚ç…§ã™ã‚‹ã‹ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°æä¾›è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。","ui.account.welcome":"よã†ã“ã","ui.account.intro1":"Contao Managerã«ã‚ˆã†ã“ã。Contao Managerã¯ContaoオープンソースCMSã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¨ç®¡ç†ã‚’行ã†å¤šæ‰ãªãƒ„ールã§ã™ã€‚Contao Managerã‚’åˆã‚ã¦åˆ©ç”¨ã™ã‚‹å ´åˆã¯{readTheManualToGetStarted}","ui.account.introGetStarted":"最åˆã«{readTheManual} ","ui.account.introManual":"マニュアルを読んã§ãã ã•ã„","ui.account.intro2":"何ã‹å•題ãŒã‚ã£ãŸå ´åˆã¯ã€{ourGithubIssues} を確èªã—ã¦ã€ã¾ã å ±å‘Šã•れã¦ã„ãªã„æ–°ã—ã„ã©ã®æ§˜ãªå•題ã¯è‡ªç”±ã«æ–°ã—ã„Issueを作æˆã—ã¦ãã ã•ã„。","ui.account.introIssues":"GitHubã®Issue","ui.account.headline":"ユーザーアカウント","ui.account.description":"インストールã—ãŸContaoを管ç†ã™ã‚‹ã«ã¯æ–°ã—ã„アカウントを作æˆã—ã¦ãã ã•ã„。ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯Contaoã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã‚„フロントエンドã¨ã¯ã¾ã£ãŸã関係ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。","ui.account.username":"ユーザーå","ui.account.password":"パスワード","ui.account.passwordPlaceholder":"最å°ã§8文字","ui.account.passwordLength":"å°‘ãªãã¨ã‚‚8文字を入力ã—ã¦ãã ã•ã„。","ui.account.loginInvalid":"アカウントã®ä½œæˆã§ã‚¨ãƒ©ãƒ¼ã¨ãªã‚Šã¾ã—ãŸã€‚ç•°ãªã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§è©¦ã—ã¦ãã ã•ã„。","ui.account.submit":"アカウントを作æˆ","ui.account.usePassword":"ログインã«ãƒ‘スワードを使用","ui.account.usePasskey":"パスキーをログインã«ä½¿ç”¨","ui.account.totpHeadline":"2ファクターèªè¨¼","ui.account.totpDescription":"2ファクターèªè¨¼ã‚’有効ã«ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¬ãƒ™ãƒ«ã‚’高ã‚ã¦ãã ã•ã„。ユーザーåã¨ãƒ‘スワードã«åŠ ãˆã¦ã€1Passwordã€Authyã€Google Authenticatorã€LastPass Authenticatorã‚„ä»–ã®TOTP(Time-based One-Time Password)アプリã®ç¢ºèªã‚³ãƒ¼ãƒ‰ã®å…¥åŠ›ãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚","ui.account.totpSetup":"ã™ãã«è¨­å®š","ui.account.totpSkip":"後ã§è¨­å®š","ui.account.login":"申ã—出を拒å¦","ui.account.contribute1":"Contaoã¨Contao Managerã¯éžå–¶åˆ©ã®Contao AssociationãŒæ”¯æ´ã—ã¦ã„ã¾ã™ã€‚","ui.account.contribute2":"{donate}ã§ã‚ªãƒ¼ãƒ—ンソースã«è²¢çŒ®ã™ã‚‹ã“ã¨ã‚’ã”æ¤œè¨Žãã ã•ã„。","ui.account.contributeDonate":"寄付をã™ã‚‹","ui.login.headline":"サインイン","ui.login.description":"インストールを管ç†ã™ã‚‹ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ã—ã¾ã™ã€‚","ui.login.username":"ユーザーå","ui.login.password":"パスワード","ui.login.totpHeadline":"2ファクターèªè¨¼","ui.login.totpDescription":"確èªã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãƒ­ã‚°ã‚¤ãƒ³å‡¦ç†ã‚’完了ã—ã¦ãã ã•ã„。","ui.login.totp":"確èªã‚³ãƒ¼ãƒ‰","ui.login.forgotPassword":"パスワードを忘れã¾ã—ãŸã‹?","ui.login.button":"サインイン","ui.login.passkey":"パスキーã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³","ui.login.cancel":"å–り止ã‚","ui.login.or":"ã¾ãŸã¯","ui.login.locked":"Contao Managerã¯ãƒ­ãƒƒã‚¯çŠ¶æ…‹ã®ãŸã‚アクセスを拒å¦ã—ã¾ã—ãŸã€‚ロックを解除ã™ã‚‹ã«ã¯ã€Contaoã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚るファイル: {lockFile}を削除ã—ã¦ãã ã•ã„。","ui.logout.headline":"セッションタイムアウト","ui.logout.warning":"25分以上アクセスãŒã‚りã¾ã›ã‚“。セキュリティ上ã®ç†ç”±ã‹ã‚‰ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–“ã‚‚ãªã終了ã—ã¾ã™ã€‚","ui.logout.expired":"30分以上アクセスãŒãªã‹ã£ãŸãŸã‚自動的ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã—ãŸã€‚","ui.logout.renew":"ログインを維æŒ","ui.logout.logout":"ログアウト","ui.logout.login":"ログイン画é¢ã«æˆ»ã‚‹","ui.oauth.error":"䏿­£ãªOAuthã®è©¦ã¿ã§ã™ã€‚リクエストã®ãƒ‘ラメーターを確èªã—ã¦ãã ã•ã„。","ui.oauth.https":"平文ã§èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ãŒè»¢é€ã•れるã“ã¨ã‚’防ããŸã‚ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã®URIã¯å®‰å…¨ãªãƒ—ロトコル(https:)ã‚’*使用*ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。","ui.oauth.headline":"リモートèªè¨¼","ui.oauth.description":"以下ã®ã‚¢ãƒ—リケーションやサービスãŒã€ã“ã®Contao Managerã¸ã®ãƒªãƒ¢ãƒ¼ãƒˆã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™ã€‚","ui.oauth.domain":"アクセスを許å¯ã™ã‚‹å‰ã«ã€ã“ã®URLã®ã“ã¨ã‚’知ã£ã¦ã„ã¦æ‰€æœ‰è€…ã‚’ä¿¡é ¼ã§ãã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„!","ui.oauth.outOfScope":"残念ã§ã™ãŒã€ã“ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹ã®ã«ååˆ†ãªæ¨©é™ãŒã‚りã¾ã›ã‚“。","ui.oauth.allow":"アクセスを許å¯","ui.oauth.deny":"アクセスを拒å¦","ui.oauth.switchUser":"ユーザーを切り替ãˆ","ui.scope.admin":"ユーザー管ç†ã‚’å«ã‚“ã ç®¡ç†è€…アクセス","ui.scope.install":"æ–°ã—ã„パッケージã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¨Contaoã®æ§‹æˆã®å¤‰æ›´","ui.scope.update":"ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®æ›´æ–°ã¨ä¿å®ˆã®ä½œæ¥­ã®å®Ÿè¡Œ","ui.scope.read":"ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã¨æ§‹æˆã®èª­ã¿å–り","ui.boot.headline":"システム検査","ui.boot.description":"ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„ã€ã‚µãƒ¼ãƒãƒ¼ã‚’è§£æžä¸­ã§ã™...","ui.boot.issue1":"インストール上ã®å•題を検出","ui.boot.issue2":"Contao Managerを使用ã§ãるよã†ã«ã™ã‚‹å‰ã«ä¿®æ­£ã—ãªã‘れã°ãªã‚‰ãªã„å•題ãŒã‚りã¾ã™ã€‚","ui.boot.run":"Contao Managerã‚’é–‹å§‹","ui.boot.safeMode":"セーフモードã§é–‹å§‹","ui.recovery.headline":"システム回復","ui.recovery.description":"Contao Managerã¯Contaoã¨æ€ã‚れるファイルを検出ã—ã¾ã—ãŸãŒã€ã‚³ãƒžãƒ³ãƒ‰è¡Œã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¯æœŸå¾…ã—ãŸæ§˜ã«å‹•作ã—ã¾ã›ã‚“ã§ã—ãŸã€‚","ui.recovery.console":"コンソール出力","ui.recovery.repairOptions":"インストールã—ãŸContaoを修正ã™ã‚‹æ–¹æ³•ã‚’é¸æŠžã—ã¦ãã ã•ã„。","ui.recovery.repairHeadline":"自動修復","ui.recovery.repairDescription":"アプリケーションキャッシュã®å†æ§‹ç¯‰ã¨Composerパッケージをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã“ã¨ã§ã€è‡ªå‹•çš„ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®ä¿®å¾©ã‚’試ã¿ã¾ã™ã€‚","ui.recovery.repairWarning":"ã“ã®å‡¦ç†ã§ãƒ™ãƒ³ãƒ€ãƒ¼ã®ãƒ•ァイルã«è¡Œã£ãŸå¤‰æ›´ã¯å–り消ã•れるã‹ã‚‚ã—れã¾ã›ã‚“!","ui.recovery.repairFailed":"自動修復ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã‚»ãƒ¼ãƒ•ãƒ¢ãƒ¼ãƒ‰ã§æ‰‹ä½œæ¥­ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’修復ã—ã¦ã¿ã¦ãã ã•ã„。","ui.recovery.repairButton":"システム修復を実行","ui.recovery.safeModeHeadline":"セーフモード","ui.recovery.safeModeDescription":"Contao Managerをセーフモードã§é–‹å§‹ã™ã‚‹ã¨ãƒ‘ッケージã®ç®¡ç†ã¨ç‰¹å®šã®ä¿å®ˆã®ã‚¿ã‚¹ã‚¯ã‚’実行ã§ãã¾ã™ã€‚ã—ã‹ã—ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸContaoã®å‹•作ã«ä¾å­˜ã—ãŸæ©Ÿèƒ½ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。","ui.recovery.safeModeButton":"セーフモードã§é–‹å§‹","ui.server.pending":"待機中...","ui.server.running":"è§£æžä¸­â€¦","ui.server.error":"サーãƒãƒ¼ã‹ã‚‰ã®äºˆæœŸã—ãªã„応答ã®ãŸã‚検査ã«å¤±æ•—ã—ã¾ã—ãŸã€‚","ui.server.details":"詳細","ui.server.prerequisite":"剿æ¡ä»¶ã‚’満ãŸã›ã¦ã„ãªã„ãŸã‚検査をå–り止ã‚ã¾ã—ãŸã€‚","ui.server.selfUpdate.title":"Contao Managerã‚’æ›´æ–°","ui.server.selfUpdate.update":"æ–°ã—ã„Contao Managerã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {latest} を利用ã§ãã¾ã™ã€‚","ui.server.selfUpdate.manualUpdate":"æ–°ã—ã„Contao Managerãƒãƒ¼ã‚¸ãƒ§ãƒ³{latest}を利用ã§ãã¾ã™ã€‚使用ã—ã¦ã„るサーãƒãƒ¼ã¯è‡ªå‹•çš„ãªæ›´æ–°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ã€æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ {download} ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。","ui.server.selfUpdate.latest":"最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: {current}を使用ã—ã¦ã„ã¾ã™ã€‚","ui.server.selfUpdate.dev":"開発版ã¯è‡ªå‹•çš„ãªæ›´æ–°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。","ui.server.selfUpdate.unsupported":"æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’利用ã§ãã¾ã™ãŒã€ä½¿ç”¨ã—ã¦ã„ã‚‹PHPã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。","ui.server.selfUpdate.button":"自己更新を実行","ui.server.selfUpdate.continue":"ç¶šã‘ã‚‹","ui.server.config.title":"サーãƒãƒ¼ã®æ§‹æˆ","ui.server.config.setup":"æ§‹æˆ","ui.server.config.change":"変更","ui.server.config.save":"ä¿å­˜","ui.server.config.cancel":"å–り止ã‚","ui.server.config.customOption":"ãã®ä»–…","ui.server.config.description":"ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã®ã‚¿ã‚¹ã‚¯ã‚’æ­£ã—ã実行ã™ã‚‹ãŸã‚ã€Contao Managerã¯PHPã®ã‚³ãƒžãƒ³ãƒ‰è¡Œã®å®Ÿè¡Œãƒ•ァイルãŒã‚る場所ã¨ã€ã‚¦ã‚§ãƒ–ã®ãƒ—ロセスã‹ã‚‰åˆ‡ã‚Šé›¢ã—ã¦ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹æ–¹æ³•を知る必è¦ãŒã‚りã¾ã™ã€‚","ui.server.config.formTitle":"サーãƒãƒ¼ã®æ§‹æˆ","ui.server.config.formText":"PHPã®å®Ÿè¡Œãƒ•ァイルã®ãƒ‘スを入力ã—ã¦ãã ã•ã„。Webã®ãƒ—ロセスã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®PHPã§ã‚ã‚‹ã“ã¨ã‚’忘れãšã«ç¢ºèªã—ã¦ãã ã•ã„。","ui.server.config.cloudTitle":"Composerリゾルãƒãƒ¼ã‚¯ãƒ©ã‚¦ãƒ‰","ui.server.config.cloudText":"Composerリゾルãƒãƒ¼ã‚¯ãƒ©ã‚¦ãƒ‰ã«ã‚ˆã£ã¦ã€ã‚µãƒ¼ãƒãƒ¼ãŒå分ãªãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ¡ãƒ¢ãƒªã‚’æä¾›ã—ãªã„å ´åˆã§ã‚‚Composerã®ä¾å­˜é–¢ä¿‚ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®æƒ…å ±ãŒContao AssociationãŒé‹ç”¨ã™ã‚‹ã‚¯ãƒ©ã‚¦ãƒ‰ã«é€ä¿¡ã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。","ui.server.config.cloud":"Composerリゾルãƒãƒ¼ã‚¯ãƒ©ã‚¦ãƒ‰ã‚’使用","ui.server.config.cli":"PHPã®å®Ÿè¡Œãƒ•ァイル","ui.server.config.stateErrorCli":"有効ãªPHPã®å®Ÿè¡Œãƒ•ァイルをサーãƒãƒ¼ä¸Šã«è¦‹ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚","ui.server.config.stateErrorCloud":"Composerリゾルãƒãƒ¼ã‚¯ãƒ©ã‚¦ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。","ui.server.config.stateSuccess":"PHPã®å®Ÿè¡Œãƒ•ァイルã¯{php_cli}ã§ã™ã€‚","ui.server.php_web.title":"PHPã®Webプロセス","ui.server.php_web.below7":"PHPã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {version} を検出ã—ã¾ã—ãŸã€‚å¯èƒ½ãªé™ã‚ŠPHP 7ã«åˆ‡ã‚Šæ›¿ãˆã¦ãã ã•ã„!","ui.server.php_web.success":"PHPã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {version} を検出ã—ã¾ã—ãŸã€æ—¢çŸ¥ã®å•題ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚","ui.server.php_cli.title":"PHPコマンド行インターフェイス","ui.server.php_cli.success":"PHPã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {version} を検出ã—ã¾ã—ãŸã€æ—¢çŸ¥ã®å•題ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚","ui.server.composer.title":"Composer環境","ui.server.composer.success":"既知ã®å•題ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚","ui.server.composer.install":"Composerã®ä¾å­˜é–¢ä¿‚ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã„ã¾ã›ã‚“。","ui.server.composer.button":"インストール","ui.server.contao.title":"Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«","ui.server.contao.setup":"セットアップ","ui.server.contao.check":"データベースを検査","ui.server.contao.empty":"インストールã—ã¦ã„ã‚‹Contaoã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚","ui.server.contao.old":"Contaoã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³{version}ã¯Contao Managerã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。インストールã—ã¦ã„ã‚‹Contaoã‚’æ‰‹ä½œæ¥­ã§æ›´æ–°ã—ã¦ãã ã•ã„。","ui.server.contao.found":"Contao {version} (APIãƒãƒ¼ã‚¸ãƒ§ãƒ³ {api})を検出ã—ã¾ã—ãŸã€‚","ui.server.contao.connectionError":"データベースサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。","ui.server.contao.connectionProblem":"データベースã®å•題ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚","ui.server.contao.missingUser":"管ç†è€…ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒã‚りã¾ã›ã‚“。","ui.setup.continue":"ç¶šã‘ã‚‹","ui.setup.manager":"Contao Managerã‚’é–‹å§‹","ui.setup.cancel":"å–り止ã‚","ui.setup.welcome":"よã†ã“ã","ui.setup.welcome1":"ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯ContaoオープンソースCMSを設定ã™ã‚‹ã®ã«å¿…è¦ãªæ®µéšŽã‚’案内ã—ã¾ã™ã€‚","ui.setup.welcome2":"ã‚‚ã—質å•ãŒã‚りã¾ã—ãŸã‚‰ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã€ãƒ•ォーラムã€Slackã®ãƒãƒ£ãƒ³ãƒãƒ«ã€ã•らã«å¤šãã®æƒ…報を{support}ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æŽ¢ã—ã¦ãã ã•ã„。","ui.setup.support":"コミュニティサãƒãƒ¼ãƒˆ","ui.setup.start":"å§‹ã‚ã‚‹","ui.setup.complete":"ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™!","ui.setup.complete1":"Contao {version}ã‚’ã†ã¾ãインストールã—ã¾ã—ãŸã€‚","ui.setup.complete2":"設定ã®å‡¦ç†ã‚’終ãˆã‚‹ã«ã¯ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ„ールを開ã„ã¦ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šã‚’æ§‹æˆã—ã€ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’作æˆã—ã¦ãã ã•ã„。","ui.setup.complete3":"Contaoã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§ã‚¦ã‚§ãƒ–サイトを作æˆã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚è¿½åŠ ã®æ©Ÿèƒ½æ‹¡å¼µãŒå¿…è¦ãªå ´åˆã¯ã€Contao Managerã‚’ç¶šã‘ã¦ãã ã•ã„。","ui.setup.installTool":"インストールツールを開ã","ui.setup.login":"Contaoã«ãƒ­ã‚°ã‚¤ãƒ³","ui.setup.funding":"フリーソフトウェアã®ã€Œãƒ•リーã€ã¯ã€Œè¨€è«–ã®è‡ªç”±ã€ã®è‡ªç”±ã§ã‚ã£ã¦ã€ã€Œç„¡æ–™ã®ãƒ“ールã€ã®ã€Œç„¡æ–™ã€ã§ã¯ã‚りã¾ã›ã‚“。Contaoã®ã‚ˆã†ãªã‚ªãƒ¼ãƒ—ンソースã®ãƒ—ロジェクトã¯ä¸€äººã®å€‹äººã‚„1ã¤ã®ä¼šç¤¾ã§ã¯é›†ã‚られãªã„資金を必è¦ã¨ã—ã¾ã™ã€‚\\nContaoã§ã‚¦ã‚§ãƒ–サイトを構築ã—ãŸã‚Šã€æ§‹ç¯‰ã—ãŸã‚¦ã‚§ãƒ–サイトを販売ã•れる場åˆã¯ã€ãƒ“ジãƒã‚¹ãŒä¾å­˜ã™ã‚‹è£½å“ã«é‡‘銭的ã«è²¢çŒ®ã•れるã“ã¨ã‚’期待ã—ã¦ã„ã¾ã™ã€‚","ui.setup.fundingLink":"ã•らã«å­¦ã¶","ui.setup.document-root.headline":"Webサーãƒãƒ¼ã®è¨­å®š","ui.setup.document-root.warning":"Contao Managerã‹ã‚‰Contaoをインストールã™ã‚‹ã«ã¯ã€Webサーãƒãƒ¼ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆãƒ«ãƒ¼ãƒˆã‚’修正ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。","ui.setup.document-root.description1":"Contaoã¯å…¬é–‹ã™ã‚‹ãƒ•ァイルã«åˆ¥ã®ãƒ•ォルダーを使用ã—ã€ãã®è¦ªã®ãƒ•ォルダーã«ã‚¢ãƒ—リケーションã®ãƒ•ァイルをインストールã—ã¾ã™ã€‚ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã®æ§‹é€ ãŒæ­£ã—ããªã„ã‹ã€ã¾ãŸã¯ãƒ•ォルダーãŒç©ºã§ãªã„å ´åˆã¯Contaoをインストールã§ãã¾ã›ã‚“。","ui.setup.document-root.description2":"ドキュメントルートを構æˆã™ã‚‹æ–¹æ³•を知らãªã„å ´åˆã¯ã€Contaoã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’読むã‹ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。","ui.setup.document-root.documentation":"ドキュメントを読む","ui.setup.document-root.conflictsTitle":"インストール先ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒç©ºã§ã¯ã‚りã¾ã›ã‚“","ui.setup.document-root.conflictsDirectory":"Contaoをインストールã—よã†ã¨ã—ã¦ã„るルートã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒç©ºã§ã¯ã‚りã¾ã›ã‚“ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®å‡¦ç†ã§{count}個ã®ãƒ•ァイルを上書ãã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。Contaoã®ãŸã‚ã«ç©ºã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹é€ ã®ä½œæˆã‚’推奨ã—ã¾ã™ãŒã€ä»¥ä¸‹ã®ãƒ•ァイルを使用ã—ã¦ã„ãªã„ã“ã¨ãŒç¢ºã‹ãªå ´åˆã¯ã€ã“れらを削除ã—ã¦å†æ¤œæŸ»ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚","ui.setup.document-root.ignoreConflicts":"空ã§ãªã„ディレクトリã«Contaoをインストールã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚Webé ˜åŸŸã®æ—¢å­˜ã®ãƒ•ァイルを上書ãã™ã‚‹å¯èƒ½æ€§ã‚’ç†è§£ã—ã¦ã„ã¾ã™ã€‚","ui.setup.document-root.check":"冿¤œæŸ»","ui.setup.document-root.create":"ディレクトリを作æˆ","ui.setup.document-root.change":"ディレクトリを変更","ui.setup.document-root.formTitle":"ディレクトリ設定","ui.setup.document-root.formText1":"Contao Managerã¯ã‚µãƒ¼ãƒãƒ¼ä¸Šã«æ–°ã—ã„ディレクトリ構æˆã‚’自動的ã«ä½œæˆã§ãã¾ã™ã€‚","ui.setup.document-root.formText2":"手作業ã§(例ãˆã°ã€ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°ã®ç®¡ç†ãƒ‘ãƒãƒ«ã‹ã‚‰)æ–°ã—ã„ドキュメントルートを構æˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚","ui.setup.document-root.autoconfig":"サーãƒãƒ¼ã®æ§‹æˆã‚’変更ã—ãªã‘れã°ãªã‚‰ãªã„ã“ã¨ã‚’ç†è§£ã—ã¾ã—ãŸã€‚ドキュメントルートを構æˆã—ãªã„ã¨Contao Managerã¯å£Šã‚Œã€(アカウントã®è©³ç´°ã¨ãƒ‘スワードをå«ã‚“ã )æ§‹æˆãƒ•ァイルを剥ã出ã—ã®çŠ¶æ…‹ã«ã—ã¦ã—ã¾ã„ã¾ã™ã€‚","ui.setup.document-root.directory":"æ–°ã—ã„ディレクトリ","ui.setup.document-root.currentRoot":"ç¾åœ¨ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆãƒ«ãƒ¼ãƒˆ","ui.setup.document-root.newRoot":"æ–°ã—ã„ドキュメントルート","ui.setup.document-root.finish":"ディレクトリã®è¨­å®š","ui.setup.document-root.publicDir":"{dir}ã‚’(Contao {version}ã®)公開ファイルã®å ´æ‰€ã¨ã—ã¦ä½¿ç”¨","ui.setup.document-root.directoryInvalid":"有効ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã‚’入力ã—ã¦ãã ã•ã„。","ui.setup.document-root.directoryExists":"目的ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚ç•°ãªã‚‹åå‰ã‚’入力ã—ã¦ãã ã•ã„。","ui.setup.document-root.confirmation":"Contao Managerã¯Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¿…è¦ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆã—ã¾ã—ãŸã€‚次ã«ã‚¦ã‚§ãƒ–サーãƒãƒ¼ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆãƒ«ãƒ¼ãƒˆã‚’æ§‹æˆã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。ã“ã®ãƒšãƒ¼ã‚¸ã‚’ãれã¾ã§å†èª­ã¿è¾¼ã¿ã—ãªã„ã§ãã ã•ã„。","ui.setup.document-root.reload":"ページをå†èª­ã¿è¾¼ã¿","ui.setup.document-root.success":"ウェブサーãƒãƒ¼ã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹é€ ã‚’æ­£ã—ã設定ã§ãã¾ã—ãŸ!","ui.setup.document-root.installingProjectDir":"{dir}ã«ã‚¢ãƒ—リケーションã®ãƒ•ァイルをインストールã—ã¾ã™ã€‚","ui.setup.document-root.installingPublicDir":"{dir}ã«å…¬é–‹ã™ã‚‹ãƒ•ァイルをインストールã—ã¾ã™ã€‚","ui.setup.document-root.installedProjectDir":"{dir}ã«ã‚¢ãƒ—リケーションã®ãƒ•ァイルをインストールã—ã¾ã—ãŸã€‚","ui.setup.document-root.installedPublicDir":"{dir}ã«å…¬é–‹ã™ã‚‹ãƒ•ァイルをインストールã—ã¾ã—ãŸã€‚","ui.setup.create-project.headline":"Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«","ui.setup.create-project.description":"Contaoã®é–‹ç™ºã¯{semver}ã®æ¦‚念ã«ã—ãŸãŒã£ã¦ã„ã¦ã€æ–°ã—ã„マイナーãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’6ã‹æœˆæ¯Žã«ãƒªãƒªãƒ¼ã‚¹ã—ã¾ã™ã€‚ç¾åœ¨ã‚µãƒãƒ¼ãƒˆã—ã¦ã„るリリース:","ui.setup.create-project.semver":"セマンティックãƒãƒ¼ã‚¸ãƒ§ãƒ‹ãƒ³ã‚°","ui.setup.create-project.latestTitle":"最新","ui.setup.create-project.ltsTitle":"長期サãƒãƒ¼ãƒˆç‰ˆ","ui.setup.create-project.latestQ1":"最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€ã‚‚ã£ã¨ã‚‚多ãã®æ©Ÿèƒ½ã‚’æä¾›ã—ã¦{year}å¹´2月ã¾ã§ã‚µãƒãƒ¼ãƒˆã—ã¾ã™ã€‚","ui.setup.create-project.latestQ3":"最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€ã‚‚ã£ã¨ã‚‚多ãã®æ˜¨æ—¥ã‚’æä¾›ã—ã¦{year}å¹´8月ã¾ã§ã‚µãƒãƒ¼ãƒˆã—ã¾ã™ã€‚","ui.setup.create-project.ltsText":"ç¾åœ¨ã®LTSãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€å®‰å®šæ€§ã‚’é‡è¦–ã™ã‚‹å ´åˆã«é¸ã‚“ã§ãã ã•ã„。ã•らã«{year}å¹´2月ã¾ã§ã®é•·æœŸã‚µãƒãƒ¼ãƒˆã‚’æä¾›ã—ã¾ã™ã€‚","ui.setup.create-project.pltsText":"以å‰ã®LTSãƒãƒ¼ã‚¸ãƒ§ãƒ³ã€ã•らã«{year}å¹´2月ã¾ã§ã®é•·æœŸã‚µãƒãƒ¼ãƒˆã‚’æä¾›ã—ã¾ã™ã€‚","ui.setup.create-project.requiresPHP":"å°‘ãªãã¨ã‚‚PHP {version}ãŒå¿…è¦ã§ã™ã€ç¾åœ¨ã¯PHP {current}ã§ã™ã€‚","ui.setup.create-project.releaseplan":"è©³ç´°ãªæƒ…å ±ã¯{contaoReleasePlan}ã‚’å‚ç…§ã—ã¦ãã ã•ã„。","ui.setup.create-project.releaseplanLink":"Contaoã®ãƒªãƒªãƒ¼ã‚¹è¨ˆç”»","ui.setup.create-project.installed":"サーãƒãƒ¼ã«Contao {version}ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚データベースã®è¨­å®šã‚’ç¶šã‘ã‚‹ã‹ã€ç•°ãªã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’インストールã™ã‚‹ã«ã¯Contao Managerã‚’èµ·å‹•ã—ã¦ãã ã•ã„。","ui.setup.create-project.formTitle":"é…布ã®é¸æŠž","ui.setup.create-project.formText":"インストールã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。","ui.setup.create-project.version":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³","ui.setup.create-project.demo":"Contaoã®ãƒ‡ãƒ¢ç‰ˆã®Webサイトをインストール","ui.setup.create-project.demoDescription":"デモ版ã®Webサイトã¯Contaoã¨ã€ãã®åŸºæœ¬çš„ãªç‰¹å¾´ã‚’知る助ã‘ã¨ãªã‚Šã¾ã™ã€‚テーマã¯ã•らã«{store}ã§å…¥æ‰‹ã§ãã¾ã™ã€‚","ui.setup.create-project.coreOnly":"最å°ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«(コアã ã‘)","ui.setup.create-project.noUpdate":"インストールをçœã(専門家ã ã‘!)","ui.setup.create-project.theme":"Contaoã®ãƒ†ãƒ¼ãƒž","ui.setup.create-project.themeInstall":"Contaoã®ãƒ†ãƒ¼ãƒžã‚’インストールã™ã‚‹ã«ã¯ã€æ¤œç´¢å…¥åŠ›ã‚’ä½¿ç”¨ã™ã‚‹ã‹ã€Contao Managerã‹ã‚‰ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’サãƒãƒ¼ãƒˆã—ãŸãƒ†ãƒ¼ãƒžã®ãƒ•ァイル(.ctoã¾ãŸã¯.zip)をアップロードã—ã¦ãã ã•ã„。","ui.setup.create-project.themeBuy":"å¿…ãšå…¬å¼ã®{store}ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„。","ui.setup.create-project.themeStore":"Contaoã®ãƒ†ãƒ¼ãƒžã®ã‚¹ãƒˆã‚¢","ui.setup.create-project.themeUpload":"テーマã®ãƒ•ァイル(.cto/.zip)をアップロード","ui.setup.create-project.themeInvalid":"アップロードã—ãŸãƒ•ァイルã¯Contaoã®ãƒ†ãƒ¼ãƒžã§ã¯ãªã„ã‹ã€Contao Managerをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。","ui.setup.create-project.themeWarning":"ã“ã®ãƒ†ãƒ¼ãƒžãŒã‚µãƒ¼ãƒãƒ¼ã¨äº’æ›æ€§ãŒã‚ã‚‹ã‹ã©ã†ã‹ã€COntao Managerã¯åˆ¤æ–­ã§ãã¾ã›ã‚“。何ã‹ç–‘å•ãŒã‚ã‚‹å ´åˆã¯ãƒ†ãƒ¼ãƒžã®ãƒ™ãƒ³ãƒ€ãƒ¼ã«ç›¸è«‡ã—ã¦ãã ã•ã„。","ui.setup.create-project.themeTitle":"テーマã®è©³ç´°ã‚’調査","ui.setup.create-project.themeDetails":"ã“ã®ãƒ†ãƒ¼ãƒžã¯ä»¥ä¸‹ã®ä¾å­˜é–¢ä¿‚ã¨ãƒ•ァイルもインストールã—ã¾ã™ã€‚","ui.setup.create-project.themeRequire":"{count} ä¾å­˜é–¢ä¿‚ | {count} ä¾å­˜é–¢ä¿‚","ui.setup.create-project.themeFiles":"{count} ファイル | {count} ファイル","ui.setup.create-project.theme.or":"ã¾ãŸã¯å…¬é–‹ãƒ†ãƒ¼ãƒžã‚’検索","ui.setup.create-project.theme.search":"テーマを検索","ui.setup.create-project.theme.more":"ã•らã«ãƒ†ãƒ¼ãƒž","ui.setup.create-project.theme.empty":"{query}ã«ä¸€è‡´ã™ã‚‹ãƒ†ãƒ¼ãƒžãŒã‚りã¾ã›ã‚“。","ui.setup.create-project.theme.uploaded":"テーマã®ãƒ•ァイルã®ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã«æˆåŠŸã—ã¾ã—ãŸã€‚","ui.setup.create-project.theme.packageName":"パッケージå","ui.setup.create-project.theme.version":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³","ui.setup.create-project.theme.authors":"作æˆè€…","ui.setup.create-project.theme.upload":"{name} ({size})をアップロード中","ui.setup.create-project.install":"インストール","ui.setup.create-project.cancel":"å–り止ã‚","ui.setup.database-connection.headline":"データベース接続","ui.setup.database-connection.description":"Contaoã¯ãƒšãƒ¼ã‚¸ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã€ä»–ã®é–¢ä¿‚ã®ã‚るデータをä¿ç®¡ã™ã‚‹ãŸã‚ã«MySQLデータベース(ã¾ãŸã¯MariaDBã®æ§˜ãªäº’æ›æ€§ã®ã‚る分å²)ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚接続ã®ãƒ‘ラメーターã¯ã€Contaoをインストールã—ãŸãƒ—ロジェクトã®ãƒ«ãƒ¼ãƒˆã«ã‚ã‚‹{env}ファイルã«ä¿å­˜ã—ã¾ã™ã€‚","ui.setup.database-connection.formTitle":"接続パラメーター","ui.setup.database-connection.formText":"データベースã®URLを入力ã™ã‚‹ã‹ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã€ãƒ‘スワードã€ã‚µãƒ¼ãƒãƒ¼ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ¬„を別々ã«å…¥åŠ›ã—ã¦ãã ã•ã„。","ui.setup.database-connection.url":"データベースã®URL","ui.setup.database-connection.validUrl":"データベースã®URLãŒæ­£ã—ããªã„ã‹ã€ã‚µãƒ¼ãƒãƒ¼ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚","ui.setup.database-connection.or":"ã¾ãŸã¯","ui.setup.database-connection.user":"ユーザーå","ui.setup.database-connection.password":"パスワード","ui.setup.database-connection.server":"サーãƒãƒ¼(:ãƒãƒ¼ãƒˆ)","ui.setup.database-connection.database":"データベースå","ui.setup.database-connection.connected":"{server}ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹{database}ã«æŽ¥ç¶šã—ã¾ã—ãŸã€‚","ui.setup.database-connection.error":"ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æŽ¥ç¶šã®ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚","ui.setup.database-connection.problem":"Contaoã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã®å•題を検出ã—ã¾ã—ãŸã€‚","ui.setup.database-connection.schemaTitle":"データベーススキーマ","ui.setup.database-connection.migration":"未解決ã®ç§»è¡ŒãŒ1ä»¶ã‚りã¾ã™ã€‚ | 未解決ã®ç§»è¡ŒãŒ{count}ä»¶ã‚りã¾ã™ã€‚","ui.setup.database-connection.schema":"未解決ã®ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ãŒ1ä»¶ã‚りã¾ã™ã€‚ | 未解決ã®ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ãŒ{count}ä»¶ã‚りã¾ã™ã€‚","ui.setup.database-connection.noChanges":"データベースã®ã‚¹ã‚­ãƒ¼ãƒžã¯æœ€æ–°ã§ã™ã€‚","ui.setup.database-connection.check":"データベースを検査","ui.setup.database-connection.skip":"飛ã°ã™","ui.setup.database-connection.save":"ä¿å­˜","ui.setup.database-connection.change":"èªè¨¼æƒ…報を変更","ui.setup.database-connection.restoreTitle":"データベースをインãƒãƒ¼ãƒˆ","ui.setup.database-connection.restoreText":"å…ˆã»ã©ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸãƒ†ãƒ¼ãƒžã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚データベースを復元ã—ã¦ãƒ†ãƒ¼ãƒžã®ãƒ‡ãƒ¼ã‚¿ã‚’å–り込むã‹ã€ç©ºã®Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‹ã‚‰å§‹ã‚ã‚‹å ´åˆã¯ã“ã®æ®µéšŽã‚’飛ã°ã—ã¦ãã ã•ã„。 | å…ˆã»ã©ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ãŸãƒ†ãƒ¼ãƒžã¯è¤‡æ•°ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãƒ†ãƒ¼ãƒžã®ãƒ‡ãƒ¼ã‚¿ã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã‹ã€ç©ºã®Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‹ã‚‰å§‹ã‚ã‚‹å ´åˆã¯ã“ã®æ®µéšŽã‚’飛ã°ã—ã¦ãã ã•ã„。","ui.setup.database-connection.backup":"インãƒãƒ¼ãƒˆå‰ã«ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—","ui.setup.database-connection.backupWarning":"データベースã®ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’上書ãã—ã¾ã™ã€‚データベースãŒç©ºã§ãªã„å ´åˆã¯æœ€åˆã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を作æˆã—ã¦ãã ã•ã„。","ui.setup.database-connection.restore":"テーマã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’インãƒãƒ¼ãƒˆ","ui.setup.database-connection.restoreOption":"{date} ({size})ã‹ã‚‰ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—","ui.setup.database-connection.restored":"テーマã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚データベースã®ã‚¹ã‚­ãƒ¼ãƒžã®æ¤œè¨¼ã«é€²ã‚“ã§ãã ã•ã„。","ui.setup.backend-user.success":"データベースã«Contaoã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ç®¡ç†è€…ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒã‚りã¾ã™ã€‚ã•らã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã«ã¯Contaoã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã‚’使用ã—ã¦ãã ã•ã„。","ui.setup.backend-user.error":"ユーザーã®ãƒªã‚¹ãƒˆã‚’å–り出ã›ã¾ã›ã‚“。詳細ã¯ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®å‡ºåŠ›ã‚’ç¢ºèªã—ã¦ãã ã•ã„。","ui.setup.backend-user.headline":"ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ","ui.setup.backend-user.description":"ウェブサイトを管ç†ã™ã‚‹ã«ã¯ã€å°‘ãªãã¨ã‚‚Contaoã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ç®¡ç†è€…ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒ1ã¤å¿…è¦ã§ã™ã€‚ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯Contao Managerã¨ç„¡é–¢ä¿‚ãªã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。","ui.setup.backend-user.formTitle":"アカウントを作æˆ","ui.setup.backend-user.formText":"æ–°ã—ã„ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è©³ç´°ã‚’入力ã—ã¦ãã ã•ã„。","ui.setup.backend-user.username":"ユーザーå","ui.setup.backend-user.name":"åå‰","ui.setup.backend-user.email":"é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹","ui.setup.backend-user.emailInvalid":"有効ãªé›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。","ui.setup.backend-user.password":"パスワード","ui.setup.backend-user.passwordPlaceholder":"最å°ã§8文字","ui.setup.backend-user.passwordLength":"å°‘ãªãã¨ã‚‚8文字を入力ã—ã¦ãã ã•ã„。","ui.setup.backend-user.create":"アカウントを追加","ui.task.headline":"ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ã®ã‚¿ã‚¹ã‚¯","ui.task.loading":"詳細を読ã¿è¾¼ã¿ä¸­...","ui.task.created":"詳細を読ã¿è¾¼ã¿ä¸­...","ui.task.active":"Contao ManagerãŒãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ã‚¿ã‚¹ã‚¯ã®å‡¦ç†ã‚’実行を開始ã™ã‚‹ã¾ã§ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。","ui.task.complete":"ã™ã¹ã¦ã®å‡¦ç†ã‚’正常ã«å®Œäº†ã—ã¾ã—ãŸã€‚詳細ã¯ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®å‡ºåŠ›ã‚’ç¢ºèªã—ã¦ãã ã•ã„。","ui.task.paused":"ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã®å‡¦ç†ãŒäºˆæœŸã›ãšåœæ­¢ã—ã¾ã—ãŸã€‚コンソールã®å‡ºåŠ›ã‚’ç¢ºèªã—ã¦ãã ã•ã„。","ui.task.aborting":"ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã®å‡¦ç†ã‚’å–り消ã™ã¾ã§ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。","ui.task.stopped":"ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã®å‡¦ç†ã®ä¸€éƒ¨ã‚’å–り消ã—ã¾ã—ãŸã€‚コンソールã®å‡ºåŠ›ã‚’ç¢ºèªã—ã¦ãã ã•ã„。","ui.task.error":"ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã®å‡¦ç†ãŒäºˆæœŸã›ãšåœæ­¢ã—ã¾ã—ãŸã€‚コンソールã®å‡ºåŠ›ã‚’ç¢ºèªã—ã¦ãã ã•ã„。","ui.task.failed":"Contao Managerã¯ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã®ã‚¿ã‚¹ã‚¯ã‚’é–‹å§‹ã§ãã¾ã›ã‚“ã§ã—ãŸ!","ui.task.failedDescription1":"ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å‡¦ç†ã‚’実行ã—よã†ã¨ã™ã‚‹ã¨ãã«ä½•ã‹å•題ãŒã‚りã¾ã—ãŸã€‚","ui.task.failedDescription2":"ã“れãŒå†åº¦èµ·ãã‚‹å ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。","ui.task.reportProblem":"å•題を報告","ui.task.pausedDescription":"エラーを無視ã—ã¦æ®‹ã‚‹ä½œæ¥­ã‚’実行ã—ãŸã„å ´åˆã¯ã€Œç¶šã‘ã‚‹ã€ã‚’クリックã—ã¦ãã ã•ã„。","ui.task.sponsor":"{sponsor}ãŒå¾Œæ´ã®Composer Cloud","ui.task.buttonAudit":"データベースを更新","ui.task.buttonClose":"é–‰ã˜ã‚‹","ui.task.buttonConfirm":"確èªã—ã¦é–‰ã˜ã‚‹","ui.task.buttonContinue":"ç¶šã‘ã‚‹","ui.task.buttonCancel":"å–り止ã‚","ui.task.confirmCancel":"ã“ã®ã‚¿ã‚¹ã‚¯ã‚’本当ã«å–り止ã‚ã¦è‰¯ã„ã§ã™ã‹? å–り止ã‚ã‚‹ã¨Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’壊れãŸçŠ¶æ…‹ã®ã¾ã¾ã«ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。","ui.task.autoclose":"正常ã«çµ‚了ã—ãŸã¨ãã«ã‚¿ã‚¹ã‚¯ã®è©³ç´°ã‚’é–‰ã˜ã‚‹","ui.console.toggle":"コンソールã®å‡ºåŠ›ã‚’è¡¨ç¤ºãƒ»éžè¡¨ç¤º","ui.console.showLog":"完全ãªã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®ãƒ­ã‚°ã‚’表示","ui.console.copyLog":"ログをクリップボードã«ã‚³ãƒ”ー","ui.migrate.headline":"ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›´æ–°","ui.migrate.migrationsOnly":"(移行ã ã‘)","ui.migrate.schemaOnly":"(スキーマã ã‘)","ui.migrate.loading":"ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査中ã§ã™...","ui.migrate.empty":"未解決ãªç§»è¡Œã‚„ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ã¯ã‚りã¾ã›ã‚“ã€‚ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯æœ€æ–°ã§ã™ã€‚","ui.migrate.emptyMigrations":"未解決ãªç§»è¡Œã¯ã‚りã¾ã›ã‚“ã€‚ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ã‚‚忘れãšã«ã—ã¦ãã ã•ã„。","ui.migrate.emptySchema":"未解決ãªã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ã¯ã‚りã¾ã›ã‚“。移行ã®ç¢ºèªã‚‚忘れãšã«ã—ã¦ãã ã•ã„。","ui.migrate.pending":"ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæœ€æ–°ã§ã¯ã‚りã¾ã›ã‚“。以下ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«å‡ºåŠ›ã‚’å†ç¢ºèªã—ã¦å¤‰æ›´ã‚’実行ã—ã¦ãã ã•ã„。","ui.migrate.previousChanges":"以å‰ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡Œã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\\n以下ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«å‡ºåŠ›ã‚’å†ç¢ºèªã—ã¦ã€æ¬¡ã®å¤‰æ›´ã®ç¢ºèªã«é€²ã‚“ã§ãã ã•ã„。","ui.migrate.previousComplete":"以å‰ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡Œã‚’確èªã§ãã¾ã›ã‚“ã§ã—ãŸã®ã§ã€ä»¥ä¸‹ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«å‡ºåŠ›ã‚’å†ç¢ºèªã—ã¦ãã ã•ã„。\\nã“ã‚Œä»¥ä¸Šã®æœªè§£æ±ºãªå¤‰æ›´ã¯ã‚りã¾ã›ã‚“。","ui.migrate.appliedChanges":"ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›´æ–°ã‚’é©ç”¨ã—ã¾ã—ãŸã€‚\\n以下ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«å‡ºåŠ›ã‚’å†ç¢ºèªã—ã¦ã€æ¬¡ã®å¤‰æ›´ã®ç¢ºèªã«é€²ã‚“ã§ãã ã•ã„。","ui.migrate.appliedComplete":"ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›´æ–°ã‚’é©ç”¨ã—ã¾ã—ãŸã€‚\\n未確èªã®ç§»è¡Œã‚„ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ã¯ã‚りã¾ã›ã‚“ã€‚ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯æœ€æ–°ã®çŠ¶æ…‹ã§ã™ã€‚","ui.migrate.problem":"Contaoã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã®å•題を検出ã—ã¾ã—ãŸã€‚\\n下ã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«å‡ºåŠ›ã‚’å†ç¢ºèªã—ã¦ä¿®æ­£ã—ãªã‘れã°ãªã‚‰ãªã„事項を調査ã—ã¦ãã ã•ã„!","ui.migrate.warning":"Contaoã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã®èª¤ã£ãŸè¨­å®šã‚’検出ã—ã¾ã—ãŸã€‚\\n一時的ã«è­¦å‘Šã¯ç„¡è¦–ã§ãã¾ã™ãŒã€æœ€é©ãªæ€§èƒ½ã¨ãƒ‡ãƒ¼ã‚¿ã®ä¸€è²«æ€§ã®ãŸã‚ã«ã¯ä¿®æ­£ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。","ui.migrate.error":"変更をé©ç”¨ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚データベースã¯å¤‰æ›´ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ã€å†ç¢ºèªã—ã¦å†å®Ÿè¡Œã—ã¦ãã ã•ã„。","ui.migrate.execute":"実行","ui.migrate.close":"é–‰ã˜ã‚‹","ui.migrate.confirm":"確èªã—ã¦é–‰ã˜ã‚‹","ui.migrate.cancel":"å–り止ã‚","ui.migrate.continue":"ç¶šã‘ã‚‹","ui.migrate.setup":"セットアップ","ui.migrate.skip":"飛ã°ã™","ui.migrate.retry":"冿¤œæŸ»","ui.migrate.retryAll":"ã™ã¹ã¦æ¤œæŸ»","ui.migrate.withDeletes":"DROPã®å‡¦ç†ã‚’å«ã‚€ã€ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®å¤‰æ›´ã‚’実行ã—ã¾ã™ã€‚","ui.migrate.migrationTitle":"データベースã®ç§»è¡Œ","ui.migrate.schemaTitle":"ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°","ui.migrate.problemTitle":"データベースã®å•題","ui.migrate.warningTitle":"データベースã®è­¦å‘Š","ui.migrate.addTable":"テーブルを追加","ui.migrate.dropTable":"テーブルを削除","ui.migrate.addField":"é …ç›®{table}.{field}を追加","ui.migrate.changeField":"é …ç›®{table}.{field}を変更","ui.migrate.dropField":"é …ç›®{table}.{field}を削除","ui.migrate.createIndex":"{table}ã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\\"{name}\\"を作æˆ","ui.migrate.dropIndex":"{table}ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\\"{name}\\"を削除","ui.widget.mandatory":"ã“ã®æ¬„ã®å…¥åŠ›ã¯å¿…é ˆã§ã™ã€‚","ui.widget.blankOption":"é¸æŠžã—ã¦ãã ã•ã„…","ui.widget.showPassword":"パスワードを表示","ui.widget.hidePassword":"パスワードをéžè¡¨ç¤º","ui.error.title":"\\"{method} {url}\\"ã¨ã„ã†HTTPã®è¦æ±‚ã«å¤±æ•—ã—ã¾ã—ãŸã€‚","ui.error.server500":"予期ã—ãªã„エラーãŒã‚µãƒ¼ãƒãƒ¼ã§ç™ºç”Ÿã—ãŸã‚ˆã†ã§ã™ã€‚Webサーãƒãƒ¼(Apache/Nginx)ã®ãƒ­ã‚°ãƒ•ァイルã¨ã€Contao Managerã®\\"contao-manager/logs\\"ã¸ã®ãƒ­ã‚°ã‚’確èªã—ã¦ãã ã•ã„。","ui.error.response":"サーãƒãƒ¼ã¯{status}ã¨ã„ã†å¿œç­”コードを返ã—ã¾ã—ãŸã€‚","ui.error.moreLink":"è©³ç´°ãªæƒ…å ±","ui.error.support":"Contaoサãƒãƒ¼ãƒˆ","ui.error.permission":"ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。","ui.footer.help":"ヘルプ","ui.footer.reportProblem":"å•題を報告","ui.navigation.discover":"発見","ui.navigation.packages":"パッケージ","ui.navigation.tools":"ツール","ui.navigation.installTool":"インストールツール","ui.navigation.backend":"Contaoã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰","ui.navigation.debug":"Contaoã®ãƒ‡ãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰","ui.navigation.logViewer":"ログ表示","ui.navigation.phpinfo":"PHPã®æƒ…å ±","ui.navigation.phpinfoLoading":"PHPã®æƒ…報を読ã¿è¾¼ã¿ä¸­...","ui.navigation.maintenance":"ä¿å®ˆ","ui.navigation.rebuildCache":"キャッシュをå†ä½œæˆ","ui.navigation.users":"アカウント","ui.navigation.systemCheck":"システム検査","ui.navigation.advanced":"詳細","ui.navigation.logout":"ログアウト","ui.maintenance.database.title":"データベースã®ç§»è¡Œã¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—","ui.maintenance.database.description":"データベースã®ç§»è¡Œã¯ãƒ‡ãƒ¼ã‚¿ã¨ãƒ†ãƒ¼ãƒ–ルã®ã‚¹ã‚­ãƒ¼ãƒžã®ä¸€è²«æ€§ã‚’確ä¿ã—ã¾ã™ã€‚","ui.maintenance.database.migrations":"未解決ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡ŒãŒ1ä»¶ | 未解決ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç§»è¡ŒãŒ{count}ä»¶","ui.maintenance.database.schemaUpdates":"未解決ã®ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ãŒ1ä»¶ | 未解決ã®ã‚¹ã‚­ãƒ¼ãƒžã®æ›´æ–°ãŒ{count}ä»¶","ui.maintenance.database.error":"データベースã®å•題ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚","ui.maintenance.database.warning":"データベースã®è­¦å‘ŠãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚","ui.maintenance.database.button":"データベースを検査","ui.maintenance.database.migrationOnly":"移行ã ã‘を検査","ui.maintenance.database.schemaOnly":"スキーマã ã‘を検査","ui.maintenance.database.installTool":"インストールツールを開ã","ui.maintenance.database.createBackup":"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を作æˆ","ui.maintenance.database.backupUnsupported":"ã“ã®Contaoã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。","ui.maintenance.database.backupList":"データベースã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒ1個ã‚ã£ã¦ã€{date}ã«ä½œæˆã•れã¦ã„ã¾ã™ã€‚ | データベースã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒ{count}個ã‚ã£ã¦ã€æœ€æ–°ã®ã‚‚ã®ã¯{date}ã«ä½œæˆã•れã¦ã„ã¾ã™ã€‚","ui.maintenance.database.backupEmpty":"ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ã‚りã¾ã›ã‚“。","ui.maintenance.rebuildCache.title":"アプリケーションキャッシュ","ui.maintenance.rebuildCache.description":"æ§‹æˆãƒ•ァイルã®ã„ãšã‚Œã‹ã‚’修正ã—ãŸå¾Œã¯ã‚¢ãƒ—リケーションキャッシュã®å†æ§‹ç¯‰ãŒå¿…è¦ã§ã™ã€‚","ui.maintenance.rebuildCache.rebuildProd":"実稼åƒç”¨ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’冿§‹ç¯‰","ui.maintenance.rebuildCache.rebuildDev":"開発用ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’冿§‹ç¯‰","ui.maintenance.rebuildCache.clearProd":"実稼åƒç”¨ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去","ui.maintenance.rebuildCache.clearDev":"開発用ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去","ui.maintenance.installTool.title":"Contaoインストールツール","ui.maintenance.installTool.description":"連続ã—ã¦3回誤ã£ãŸãƒ‘スワードを入力ã™ã‚‹ã¨ã€Contaoã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ„ールã¯è‡ªå‹•çš„ã«ãƒ­ãƒƒã‚¯çŠ¶æ…‹ã¨ãªã‚Šã¾ã™ã€‚","ui.maintenance.installTool.unlock":"インストールツールã®ãƒ­ãƒƒã‚¯ã‚’解除","ui.maintenance.installTool.lock":"インストールツールをロック","ui.maintenance.dumpAutoload.title":"Composerクラスローダー","ui.maintenance.dumpAutoload.description":"Composerã®ã‚ªãƒ¼ãƒˆãƒ­ãƒ¼ãƒ€ãƒ¼ãŒPHPã®ã‚¯ãƒ©ã‚¹ã®èª­ã¿è¾¼ã¿æ‹…当ã—ã¾ã™ã€‚rootã®composer.jsonã«ç‹¬è‡ªã®ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹ã‚’追加ã—ãŸå¾Œã¯ã€ã‚ªãƒ¼ãƒˆãƒ­ãƒ¼ãƒ€ãƒ¼ã‚’書ã出ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。","ui.maintenance.dumpAutoload.button":"オートローダーを書ã出ã—","ui.maintenance.composerInstall.title":"Composerã®ä¾å­˜é–¢ä¿‚","ui.maintenance.composerInstall.description":"Composerã®ä¾å­˜é–¢ä¿‚ã¯ã‚¢ãƒ—リケーションã®ãƒ«ãƒ¼ãƒˆã®{vendor}フォルダーã«é…ç½®ã•れã¦ã„ã¾ã™ã€‚{composerLock}ファイルをæ“作や手動ã§ã‚¢ãƒƒãƒ—ロードã—ãŸå¾Œã¯ä¾å­˜é–¢ä¿‚ã®å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå¿…è¦ãªå ´åˆãŒã‚りã¾ã™ã€‚","ui.maintenance.composerInstall.button":"インストーラーを実行","ui.maintenance.composerInstall.update":"Composerã§æ›´æ–°ã‚’実行","ui.maintenance.composerCache.title":"Composerキャッシュ","ui.maintenance.composerCache.description":"Composerã¯æ€§èƒ½å‘上ã®ãŸã‚ã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ‘ッケージをキャッシュã—ã¾ã™ã€‚壊れãŸãƒ•ァイルã®ã‚ˆã†ãªå•題ãŒã‚ã‚‹å ´åˆã¯ã€Composerキャッシュを削除ã—ã¦å¼·åˆ¶çš„ã«æ–°ã—ã„ダウンロードを行ã£ã¦ã¿ã¦ãã ã•ã„。","ui.maintenance.composerCache.button":"キャッシュを消去","ui.maintenance.maintenanceMode.title":"ä¿å®ˆãƒ¢ãƒ¼ãƒ‰","ui.maintenance.maintenanceMode.description":"Contaoã‚’ä¿å®ˆãƒ¢ãƒ¼ãƒ‰ã«ã™ã‚‹ã¨ã‚¦ã‚§ãƒ–サイトã§ã¯\\"503 Service Unavailable\\"ã®ãƒ†ãƒ³ãƒ—レートを表示ã—ã¾ã™ã€‚","ui.maintenance.maintenanceMode.enable":"有効","ui.maintenance.maintenanceMode.disable":"無効","ui.maintenance.debugMode.title":"デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰","ui.maintenance.debugMode.description":"{appDevPhp}ã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ãƒã‚¤ãƒ³ãƒˆã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ãƒ‘スワードを設定ã—ã¦ãƒ‡ãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã—ã¾ã™ã€‚","ui.maintenance.debugMode.descriptionJwt":"ç¾åœ¨ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã«ãƒ‡ãƒãƒƒã‚°ç”¨ã®ã‚¯ãƒƒã‚­ãƒ¼ã‚’設定ã—ã¦ãƒ‡ãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã—ã¾ã™ã€‚","ui.maintenance.debugMode.activate":"有効化","ui.maintenance.debugMode.deactivate":"無効化","ui.maintenance.debugMode.credentials":"èªè¨¼æƒ…å ±","ui.maintenance.debugMode.user":"デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。","ui.maintenance.debugMode.password":"デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。","ui.maintenance.opcodeCache.title":"Opcodeキャッシュ","ui.maintenance.opcodeCache.description":"Opcodeã¯é«˜é€Ÿãªå®Ÿè¡Œã®ãŸã‚ã«PHPã®ãƒ•ァイルをウェブプロセス常ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã—ã¾ã™ã€‚変更後ã«ãƒ•ァイルã®å¤‰åŒ–ã‚’èªè­˜ã—ã¦ã„ãªã„ã¨ã„ã£ãŸã€ç‰¹å®šã®çжæ³ã§ã¯å‰Šé™¤ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。","ui.maintenance.opcodeCache.button":"キャッシュを切り詰ã‚","ui.maintenance.safeMode":"セーフモードã§ã¯åˆ©ç”¨ä¸å¯","ui.maintenance.unsupported":"ã“ã®Contaoã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯éžã‚µãƒãƒ¼ãƒˆ","ui.packages.updateButton":"パッケージを更新","ui.packages.searchButton":"パッケージを検索","ui.packages.searchPlaceholder":"パッケージを検索中…","ui.packages.uploadOverlay":"アップロードã™ã‚‹ãƒ•ァイルをドラッグアンドドロップ","ui.packages.uploadButton":"パッケージをアップロード","ui.packages.uploadMessage":"未確èªã®1個ã®ã‚¢ãƒƒãƒ—ロードãŒã‚りã¾ã™ã€‚ | 未確èªã®{count}個ã®ã‚¢ãƒƒãƒ—ロードãŒã‚りã¾ã™ã€‚","ui.packages.uploadApply":"アップロードを実行","ui.packages.uploadReset":"アップロードを削除","ui.packages.uploadIncomplete":"ã“ã®ãƒ•ァイルã¯å®Œå…¨ã«ã‚¢ãƒƒãƒ—ロードã§ãã¦ã„ã¾ã›ã‚“。一旦削除削除ã—ã¦ã‚‚ã†ä¸€åº¦ã‚¢ãƒƒãƒ—ロードã—ã¦ãã ã•ã„。","ui.packages.uploadDuplicate":"ã“ã®ãƒ•ァイルを複数回アップロードã—ãŸæ§˜ã§ã™ã€‚é‡è¤‡ã—ã¦ã„るファイルを削除ã—ã¦ãã ã•ã„。","ui.packages.uploadInstalled":"ã“ã®ãƒ•ァイルを既ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ã„ã¾ã™ã€‚é‡è¤‡ã—ã¦ã„るファイルを削除ã—ã¦ãã ã•ã„。","ui.packages.uploadUnsupported":"インストールã—ãŸContaoã¯ã‚¢ãƒƒãƒ—ロードをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。PHPã®zipæ‹¡å¼µã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¨ä¾å­˜é–¢ä¿‚ã®æ›´æ–°ã‚’確èªã—ã¦ãã ã•ã„。","ui.packages.changesMessage":"未確èªã®1個ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚ | 未確èªã®{count}個ã®å¤‰æ›´ãŒã‚りã¾ã™ã€‚","ui.packages.changesDryrun":"変更を試行","ui.packages.changesApply":"変更をé©ç”¨","ui.packages.changesApplyAll":"ã™ã¹ã¦ã®ãƒ‘ッケージを更新","ui.packages.changesDryrunAll":"ã™ã¹ã¦ã®ãƒ‘ッケージã®å¤‰æ›´ã‚’試行","ui.packages.changesReset":"変更をリセット","ui.packages.changesReview":"変更を見直ã—","ui.packagelist.loading":"読ã¿è¾¼ã¿ä¸­...","ui.packagelist.uploads":"アップロード","ui.packagelist.added":"æ–°ã—ã„パッケージ","ui.packagelist.installed":"インストール済ã¿ã®ãƒ‘ッケージ","ui.package.hintRevert":"変更をå–り消ã™","ui.package.hintNoupdate":"æ›´æ–°ã—ãªã„","ui.package.hintConstraint":"ã“ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ッケージを{constraint}ã®åˆ¶ç´„ã«ã‚ˆã‚Šã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¾ã™ã€‚","ui.package.hintConstraintBest":"変更をé©ç”¨ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ッケージã®åˆ©ç”¨ã§ãる一番良ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’インストールã—ã¾ã™ã€‚","ui.package.hintConstraintChange":"変更をé©ç”¨ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ッケージã¸ã®åˆ¶ç´„ã¯\\"{from}\\"ã‹ã‚‰\\"{to}\\"ã«å¤‰æ›´ã—ã¾ã™ã€‚","ui.package.hintConstraintUpdate":"変更をé©ç”¨ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ッケージを更新ã—ã¾ã™ã€‚","ui.package.hintAdded":"変更をé©ç”¨ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ッケージをインストールã—ã¾ã™ã€‚","ui.package.hintRemoved":"変更をé©ç”¨ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ッケージを削除ã—ã¾ã™ã€‚","ui.package.requiredTitle":"手作業ã§è¿½åŠ æ¸ˆã¿","ui.package.requiredText":"ã“ã®ãƒ‘ッケージã¯composer.jsonã§å¿…è¦ã¨ã—ã¦ã„ã¾ã™ãŒã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“。","ui.package.removedTitle":"手作業ã§å‰Šé™¤æ¸ˆã¿","ui.package.removedText":"ã“ã®ãƒ‘ッケージã¯composer.jsonã‹ã‚‰å‰Šé™¤ã•れã¦ã„ã¾ã™ã€‚","ui.package.installed":"インストール済ã¿:","ui.package.version":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³{version}","ui.package.additionalDownloads":"{count}個ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ | {count}個ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰","ui.package.additionalStars":"{count}ã®ã‚¹ã‚¿ãƒ¼ | {count}ã®ã‚¹ã‚¿ãƒ¼","ui.package.editConstraint":"編集","ui.package.uploadConstraint":"ã“ã®å®šæ•°ã¯ã‚¢ãƒƒãƒ—ロードã—ãŸãƒ‘ッケージã§å®šç¾©ã•れã¦ã„ã¾ã™ã€‚","ui.package.updateButton":"æ›´æ–°","ui.package.removeButton":"削除","ui.package.installButton":"パッケージを追加","ui.package.installButtonShort":"追加","ui.package.detailsButton":"詳細","ui.package.latestConstraint":"最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³","ui.package.update":"更新を利用å¯èƒ½","ui.package.updateLatest":"最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³","ui.package.updateAvailable":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³{version}を利用å¯èƒ½","ui.package.updateUnknown":"䏿˜Žãªãƒãƒ¼ã‚¸ãƒ§ãƒ³","ui.package.updateConstraint":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®åˆ¶ç´„外ã«åˆ©ç”¨ã§ãã‚‹æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚りã¾ã™ã€‚","ui.package.incompatible":"{package}ã¯Contao {constraint}ã§ã¯å‹•作ã—ã¾ã›ã‚“。","ui.cloudStatus.headline":"Composerリゾルãƒãƒ¼ã‚¯ãƒ©ã‚¦ãƒ‰","ui.cloudStatus.version":"ãƒãƒ¼ã‚¸ãƒ§ãƒ³{version}","ui.cloudStatus.waitingTime":"å¾…ã¡æ™‚é–“","ui.cloudStatus.jobs":"ç¾åœ¨ã®ã‚¸ãƒ§ãƒ–","ui.cloudStatus.workers":"ワーカー","ui.cloudStatus.approx":"{minutes}分","ui.cloudStatus.none":"ãªã—","ui.cloudStatus.short":"ca. {minutes}分","ui.cloudStatus.long":"ca. {minutes}分{seconds}ç§’","ui.cloudStatus.error":"Composerリゾルãƒãƒ¼ã‚¯ãƒ©ã‚¦ãƒ‰ã®çŠ¶æ…‹ã‚’å–å¾—ã§ãã¾ã›ã‚“。ä¿å®ˆã¾ãŸã¯æŠ€è¡“çš„ãªå•題ã®ãŸã‚åœæ­¢ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。","ui.cloudStatus.button":"クラウドã®çŠ¶æ…‹","ui.cloudStatus.refresh":"クラウドã®çŠ¶æ…‹ã‚’æ›´æ–°","ui.log-viewer.loading":"読ã¿è¾¼ã¿ä¸­...","ui.log-viewer.empty":"サーãƒãƒ¼ã«ãƒ­ã‚°ãƒ•ァイルã¯ã‚りã¾ã›ã‚“。","ui.log-viewer.reload":"際読ã¿è¾¼ã¿","ui.log-viewer.file":"ログファイル","ui.log-viewer.channel":"ãƒãƒ£ãƒãƒ«","ui.log-viewer.channelTitle":"ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’記録ã™ã‚‹å…ˆã®ãƒãƒ£ãƒãƒ«ã§ã™ã€‚","ui.log-viewer.level":"レベル","ui.log-viewer.levelTitle":"ãƒ­ã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ·±åˆ»ã•ã§ã™ã€‚","ui.log-viewer.timeHeader":"時刻","ui.log-viewer.messageHeader":"メッセージ","ui.log-viewer.showContext":"コンテキストを表示","ui.log-viewer.hideContext":"コンテキストをéžè¡¨ç¤º","ui.log-viewer.showExtra":"追加を表示","ui.log-viewer.hideExtra":"追加をéžè¡¨ç¤º","ui.log-viewer.more":" ã•らã«èª­ã¿è¾¼ã‚€...","ui.log-viewer.download":"ダウンロード","ui.log-viewer.downloadTitle":"\\"{file}\\"をダウンロード","ui.log-viewer.prodEnvironment":"実é‹ç”¨ç’°å¢ƒ","ui.log-viewer.devEnvironment":"開発環境(デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰)","ui.user-manager.loading":"ユーザーを読ã¿è¾¼ã¿ä¸­...","ui.user-manager.changePassword":"パスワードを変更","ui.user-manager.setupTotp":"2ファクターèªè¨¼ã‚’設定","ui.user-manager.disableTotp":"2ファクターèªè¨¼ã‚’無効","ui.user-manager.invite":"ユーザーを招待","ui.user-manager.delete":"削除","ui.user-manager.deleteConfirm":"ã»ã‚“ã¨ã†ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼: \\"{username}\\"を削除ã—ã¾ã™ã‹?","ui.user-manager.deleted":"ユーザー: {username}を削除ã—ã¾ã—ãŸã€‚","ui.user-manager.passwordHeadline":"パスワードを変更","ui.user-manager.passwordText":"パスワードを変更ã™ã‚‹ã«ã¯ã€ç¾åœ¨ã®ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã¨æ–°ã—ã„パスワードをãれãžã‚Œã®æ¬„ã«å…¥åŠ›ã—ã¦ãã ã•ã„。","ui.user-manager.currentPassword":"ç¾åœ¨ã®ãƒ‘スワード","ui.user-manager.newPassword":"æ–°ã—ã„パスワード","ui.user-manager.passwordPlaceholder":"最å°ã§8文字","ui.user-manager.submitPassword":"é€ä¿¡","ui.user-manager.passwordChanged":"パスワードを変更ã—ã¾ã—ãŸã€‚","ui.user-manager.passwordError":"ã“ã®ãƒ‘スワードã¯é–“é•ã£ã¦ã„ã¾ã™ã€‚","ui.user-manager.inviteHeadline":"ユーザーを招待","ui.user-manager.inviteText":"Contao Managerã«è¤‡æ•°ã®ãƒ­ã‚°ã‚¤ãƒ³æƒ…å ±ãŒå¿…è¦ãªå ´åˆã€ã“ã“ã§æ‹›å¾…ã®ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã™ã€‚ã“ã®ãƒªãƒ³ã‚¯ã‚’誰ã‹ã€ã¾ãŸã¯ä»–ã®æ©Ÿå™¨ã§ä½¿ç”¨ã—ã¦ã€æŒ‡å®šã—ãŸæ¨©é™ã®æ–°ã—ã„アカウントを作æˆã—ã¦ãã ã•ã„。","ui.user-manager.inviteSuccess1":"æ–°ã—ã„æ‹›å¾…ã®ãƒªãƒ³ã‚¯ã‚’作æˆã—ã¾ã—ãŸã€‚以下ã®URLを使用ã—ã¦ã€ã“ã®Contao Managerã®æ–°ã—ã„ユーザーを作æˆã§ãã¾ã™ã€‚ã“ã®æ‹›å¾…ã¯(今ã‹ã‚‰1週間後ã®){expires}ã«æœŸé™ãŒåˆ‡ã‚Œã¾ã™ã€‚","ui.user-manager.inviteSuccess2":"リンクをクリップボードã«ã‚³ãƒ”ーã—ã¦ãã ã•ã„。一度ã ã‘動作ã—ã€ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’é–‰ã˜ãŸå¾Œã«å†ã³è¦‹ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。","ui.user-manager.createInvitation":"招待ã®ãƒªãƒ³ã‚¯ã‚’作æˆ","ui.user-manager.clipboard":"クリップボードã«ã‚³ãƒ”ー","ui.user-manager.permissions":"権é™ã«ã¤ã„ã¦å­¦ã¶","ui.user-manager.cancel":"å–り止ã‚","ui.user-manager.close":"é–‰ã˜ã‚‹","ui.user-manager.you":"ã‚ãªãŸ","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯2ファクターèªè¨¼ã«ã‚ˆã‚Šå®‰å…¨ã§ã™ã€‚","ui.user-manager.2faDisabled":"ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ã«2ファクターèªè¨¼ãŒè¨­å®šã•れã¦ã„ãªã„ãŸã‚安全ã§ã¯ã‚りã¾ã›ã‚“。","ui.user-manager.passkey":"パスキー","ui.user-manager.passkeyTitle":"ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ãƒ‘スキーã«ã‚ˆã‚Šå®‰å…¨ã§ã™ã€‚","ui.totp.headline":"2ファクターèªè¨¼","ui.totp.setupQr":"2FA/TOTPアプリã§QRコードを読ã¿å–ã£ã¦ãã ã•ã„。","ui.totp.setupCode":"QRコードを読ã¿å–れãªã„å ´åˆã¯ã€ã“ã®ã‚­ãƒ¼ã‚’代ã‚りã«å…¥åŠ›ã—ã¦ãã ã•ã„: ","ui.totp.codeLabel":"確èªã‚³ãƒ¼ãƒ‰","ui.totp.codeDescription":"2FA/TOTPアプリãŒç”Ÿæˆã—ãŸç¢ºèªã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。","ui.totp.disableText":"2ファクターèªè¨¼ã‚’無効ã«ã™ã‚‹ã«ã¯ç¢ºèªã‚³ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。","ui.totp.invalid":"確èªã‚³ãƒ¼ãƒ‰ãŒç„¡åйã§ã™ã€‚","ui.totp.enable":"有効","ui.totp.disable":"無効","ui.totp.cancel":"å–り止ã‚","ui.totp.enabled":"2ファクターèªè¨¼ã‚’有効ã«ã—ã¾ã—ãŸã€‚","ui.totp.disabled":"2ファクターèªè¨¼ã‚’無効ã«ã—ã¾ã—ãŸã€‚","ui.totp.setup":"2ファクターèªè¨¼ã‚’設定","ui.totp.skip":"2ファクターèªè¨¼ã‚’飛ã°ã™"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[194],{194:function(a){a.exports=JSON.parse('{"ui.app.title":"Contao paplaÅ¡inÄjumi","ui.app.loading":"IelÄdÄ“ paplaÅ¡inÄjumu sarakstu ...","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"ReklÄma paplaÅ¡inÄjumu sarakstÄ","ui.discover.loading":"IelÄdÄ“ ...","ui.discover.offline":"NevarÄ“ja iegÅ«t nekÄdus rezultÄtus.","ui.discover.offlineExplain":"PÄrbaudiet savu interneta savienojumu un atspÄ“jojiet JavaScript bloÄ·Ä“tÄjus savÄ pÄrlÅ«kprogrammÄ.","ui.discover.offlineButton":"Mēģini vÄ“lreiz","ui.discover.searchPlaceholder":"MeklÄ“t {count} paplaÅ¡inÄjumos ...","ui.discover.empty":"Nav rezultÄtu {query}","ui.discover.more":"VairÄk rezultÄtu","ui.discover.sortBy":"KÄrtot pÄ“c","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"AtjauninÄts","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"LejupielÄdes","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"VÄ“rtÄ“jums","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"SÄ«kÄka informÄcija","ui.discover.latestPackages":"JaunÄkie un atjauninÄtie paplaÅ¡inÄjumi","ui.discover.faversPackages":"VisaugstÄk novÄ“rtÄ“tie paplaÅ¡inÄjumi","ui.discover.downloadsPackages":"VisvairÄk lejupielÄdÄ“tie paplaÅ¡inÄjumi","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Projekta mÄjaslapa","ui.package.private":"PrivÄta pakotne","ui.package.privateTitle":"PrivÄtÄs pakotnes ir pieejamas tikai pie pÄrdevÄ“ja (piem., kÄ ZIP lejupielÄdes). LÅ«dzu, apmeklÄ“jiet vietni, lai iegÅ«tu papildinformÄciju.","ui.package.abandoned":"pamests","ui.package.abandonedText":"Å Ä« pakotne ir pamesta un vairs netiek uzturÄ“ta.","ui.package.abandonedReplace":"Å Ä« pakotne ir pamesta un vairs netiek uzturÄ“ta. Autors iesaka tÄs vietÄ izmantot pakotni {replacement}.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"IepriekšējÄ paplaÅ¡inÄjuma informÄcija","ui.package-details.close":"AizvÄ“rt paplaÅ¡inÄjuma informÄciju","ui.package-details.loading":"IelÄdÄ“ ...","ui.package-details.tabDescription":"Apraksts","ui.package-details.tabRequire":"PrasÄ«bas","ui.package-details.tabFeatures":"IespÄ“jas","ui.package-details.tabSuggest":"Ieteikumi","ui.package-details.tabConflict":"Konflikti","ui.package-details.tabDependents":"AtkarÄ«gie","ui.package-details.linkRequires":"nepiecieÅ¡ams","ui.package-details.linkReplaces":"aizstÄj","ui.package-details.linkProvides":"nodroÅ¡ina","ui.package-details.linkConflicts":"konflikti","ui.package-details.funding":"FinansÄ“jiet paketes uzturēšanu!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"JaunÄkÄ versija","ui.package-details.released":"izlaists","ui.package-details.license":"Licence(s)","ui.package-details.authors":"no","ui.package-details.more":"VairÄk","ui.package-details.packagist":"Pakotnes informÄcija","ui.package-details.metadata":"Rediģēt metadatus","ui.package-details.support_docs":"DokumentÄcija","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Atbalsta forums","ui.package-details.support_issues":"ProblÄ“mas / Kļūdu ziņojums","ui.package-details.support_source":"Avota kods","ui.package-details.support_irc":"IRC / TÄ“rzēšana","ui.package-details.support_email":"Atbalsta e-pasts","ui.package-details.support_rss":"RSS barotne"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[638],{3638:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Niebezpieczne połączenie !!","ui.app.httpsDescription":"Bez HTTPS twoje poufne dane bÄ™dÄ… wysyÅ‚ane bez szyfrowania.","ui.app.httpsLink":"WiÄ™cej informacji","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Bezpieczny Tryb włączony !!","ui.app.safeModeDescription":"Niektóre funkcje Contao Manager nie sÄ… dostÄ™pne.","ui.app.safeModeExit":"Wyłącz Bezpieczny Tryb","ui.app.limitedHeadline":"Zdalne PoÅ›wiadczenie","ui.app.limitedDescription":"You have limited permissions due to passwordless login.","ui.app.limitedLogout":"Re-authenticate","ui.app.totpHeadline":"Security Notice","ui.app.totpDescription":"Configure two-factor authentication now to secure your account.","ui.app.totpSetup":"Instalacja","ui.app.loading":"Åadowanie Contao Manager …","ui.app.apiError":"Nieoczekiwany status API","ui.app.configSecurity1":"ALERT BEZPIECZEŃSTWA !!! Wykryto niezabezpieczony folder konfiguracji","ui.app.configSecurity2":"Contao Manager wykryÅ‚, że pliki konfiguracji sÄ… dostÄ™pne publicznie. Wszystkie operacje zostaÅ‚y zablokowane do czasu, aż folder zostanie zabezpieczony. W przeciwnym wypadku atakujÄ…cy mógÅ‚by uzyskać dostÄ™p do wrażliwych danych twojej instalacji.\\n\\nAby naprawić ten problem, zabezpiecz dostÄ™p do katalogu \\"contao-manager\\" na serwerze. JeÅ›li nie wiesz jak to zrobić, odwoÅ‚aj siÄ™ dokumentacji twojego serwera lub skontaktuj z dostawcÄ… usÅ‚ug.","ui.account.welcome":"Witaj","ui.account.intro1":"Witaj w Contao Manager, uniwersalnym narzÄ™dziu do instalacji i zarzÄ…dzania Contao Open Source CMS. JeÅ›li jesteÅ› tu nowy, proszÄ™ {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual}, żeby zacząć","ui.account.introManual":"przeczytaj instrukcjÄ™","ui.account.intro2":"JeÅ›li masz jakiekolwiek problemy, sprawdź {ourGithubIssues} i utwórz nowe zgÅ‚oszenie na dowolny temat, który nie byÅ‚ jeszcze raportowany.","ui.account.introIssues":"naszÄ… listÄ™ problemów na GitHub","ui.account.headline":"Konto użytkownika","ui.account.description":"Aby zarzÄ…dzać twojÄ… instalacjÄ…, utwórz konto w Contao Manager. Uwaga – to konto nie jest powiÄ…zane z kontem w backendzie ani frontendzie Contao!","ui.account.username":"Nazwa użytkownika","ui.account.password":"HasÅ‚o","ui.account.passwordPlaceholder":"min 8 znaków","ui.account.passwordLength":"Wprowadź przynajmniej 8 znaków.","ui.account.loginInvalid":"There was an error when creating the account. Please try a different username.","ui.account.submit":"Utwórz konto","ui.account.usePassword":"Use password for login","ui.account.usePasskey":"Use Passkey for login","ui.account.totpHeadline":"Two-factor authentication","ui.account.totpDescription":"Please enable two-factor authentication, which adds an extra layer of security to your account. In addition to your username and password, you will need to enter a verification code generated by a two-factor app such as 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator or any other TOTP app.","ui.account.totpSetup":"Configure now","ui.account.totpSkip":"Configure later","ui.account.login":"Decline Invitation","ui.account.contribute1":"Contao i Contao Manager sÄ… sponsorowane przez charytatywnÄ… organizacjÄ™ Contao Association.","ui.account.contribute2":"Rozważ uczestnictwo w projektach open source poprzez {donate}.","ui.account.contributeDonate":"przekazanie darowizny","ui.login.headline":"Zaloguj siÄ™","ui.login.description":"Zaloguj siÄ™, aby zarzÄ…dzać instalacjÄ….","ui.login.username":"Nazwa użytkownika","ui.login.password":"HasÅ‚o","ui.login.totpHeadline":"Two-factor authentication","ui.login.totpDescription":"Please enter your verification code to complete the login process.","ui.login.totp":"Verification code","ui.login.forgotPassword":"ZapomniaÅ‚eÅ› hasÅ‚a?","ui.login.button":"Zaloguj siÄ™","ui.login.passkey":"Sign In with Passkey","ui.login.cancel":"Anuluj","ui.login.or":"lub","ui.login.locked":"Odmówiono dostÄ™pu, ponieważ Contao Manager jest zablokowany. Aby odblokować, usuÅ„ plik {lockFile} w folderze głównym instalacji Contao.","ui.logout.headline":"Limit czasu sesji","ui.logout.warning":"ByÅ‚eÅ› nieaktywny przez wiÄ™cej niż 25 minut. Z powodu bezpieczeÅ„stwa twoja sesja zostanie wkrótce zakoÅ„czona.","ui.logout.expired":"Twoja sesja zostaÅ‚a zakoÅ„czona, ponieważ byÅ‚eÅ› nieaktywny przez wiÄ™cej niż 30 minut.","ui.logout.renew":"Nie wylogowuj siÄ™","ui.logout.logout":"Wyloguj","ui.logout.login":"Powrót do logowania","ui.oauth.error":"Nieudana próba OAuth. Sprawdź parametry żądania.","ui.oauth.https":"URI przekierowania MUSI używać bezpiecznego protokoÅ‚u (https:), aby nie przesyÅ‚ać tokena poÅ›wiadczenia otwartym tekstem.","ui.oauth.headline":"Zdalne PoÅ›wiadczenie","ui.oauth.description":"NastÄ™pujÄ…ca aplikacja lub usÅ‚uga żąda zdalnego dostÄ™pu do twojej instancji Contao Manager.","ui.oauth.domain":"Zanim zezwolisz na dostÄ™p, upewnij siÄ™, że znasz ten adres URL i ufasz jego wÅ‚aÅ›cicielowi!","ui.oauth.outOfScope":"Unfortunately, you do not have the necessary permissions to grant this access.","ui.oauth.allow":"Zezwól na dostÄ™p","ui.oauth.deny":"Odmów dostÄ™pu","ui.oauth.switchUser":"Switch User","ui.scope.admin":"Admin access including user management","ui.scope.install":"Install new packages and change Contao configuration","ui.scope.update":"Update packages and execute maintenance tasks","ui.scope.read":"Read packages and configuration","ui.boot.headline":"Sprawdzenie Systemu","ui.boot.description":"ProszÄ™ czekać, analizujemy twój serwer …","ui.boot.issue1":"Wykryto nieprawidÅ‚owoÅ›ci instalacji","ui.boot.issue2":"Twoja instalacja zawiera błędy, które muszÄ… być rozwiÄ…zane, zanim zaczniesz używać Contao Manager.","ui.boot.run":"Otwórz Contao Manager","ui.boot.safeMode":"Uruchom w Bezpiecznym Trybie","ui.recovery.headline":"Odzyskiwanie Systemu","ui.recovery.description":"Contao Manager wykryÅ‚ pliki, które wyglÄ…dajÄ… jak z Contao, ale interfejs linii komend (CLI) nie dziaÅ‚a tak jak powinien.","ui.recovery.console":"WyjÅ›cie Konsolie","ui.recovery.repairOptions":"Wybierz opcjÄ™ naprawy twojej instalacji.","ui.recovery.repairHeadline":"Automatyczna Naprawa","ui.recovery.repairDescription":"Próba automatycznego naprawienia instalacji poprzez przebudowanie pamiÄ™ci cache aplikacji i ponownej instalacji pakietów Composera.","ui.recovery.repairWarning":"Jakakolwiek modyfikacja plików vendor może zostać skasowana podczas tego procesu!","ui.recovery.repairFailed":"Automatyczna naprawa nie zakoÅ„czyÅ‚a siÄ™ sukcesem. Spróbuj Bezpiecznego Trybu w celu naprawy instalacji.","ui.recovery.repairButton":"Uruchom naprawÄ™ systemu","ui.recovery.safeModeHeadline":"Bezpieczny Tryb","ui.recovery.safeModeDescription":"Uruchamianie Contao Managera w Bezpiecznym Trybie pozwala na zarzÄ…dzanie pakietami i wykonywanie okreÅ›lonych czynnoÅ›ci konserwacyjnych, ale funkcje, które wymagajÄ… dziaÅ‚ajÄ…cego Contao bÄ™dÄ… niedostÄ™pne.","ui.recovery.safeModeButton":"Uruchom w Bezpiecznym Trybie","ui.server.pending":"Czekam …","ui.server.running":"AnalizujÄ™ …","ui.server.error":"Sprawdzenie nie powiodÅ‚o siÄ™ z powodu niespodziewanej odpowiedzi serwera.","ui.server.details":"Szczegóły","ui.server.prerequisite":"Sprawdzenie anulowane z powodu brakujÄ…cego warunku wstÄ™pnego.","ui.server.selfUpdate.title":"Aktualizacje Contao Managera","ui.server.selfUpdate.update":"Nowa wersja Contao Managera {latest} jest dostÄ™pna.","ui.server.selfUpdate.manualUpdate":"Nowa wersja Contao Managera {latest} jest dostÄ™pna. Twój serwer nie wspiera automatycznych aktualizacji, nowÄ… wersjÄ™ możesz pobrać z {download}.","ui.server.selfUpdate.latest":"Używasz najnowszej wersji {current}.","ui.server.selfUpdate.dev":"Buildy deweloperskie nie wspierajÄ… automatycznych aktualizacji.","ui.server.selfUpdate.unsupported":"Nowa wersja jest dostÄ™pna, ale nie wspiera ona twojej wersji PHP.","ui.server.selfUpdate.button":"Uruchom AktualizacjÄ™","ui.server.selfUpdate.continue":"Kontynuuj","ui.server.config.title":"Konfiguracja Serwera","ui.server.config.setup":"Konfiguruj","ui.server.config.change":"ZmieÅ„","ui.server.config.save":"Zapisz","ui.server.config.cancel":"Anuluj","ui.server.config.customOption":"Inne …","ui.server.config.description":"Aby zadania w tle poprawnie dziaÅ‚aÅ‚y, Contao Manager musi wiedzieć, gdzie znaleźć wykonywalny plik PHP linii komend i jak uruchamiać dziaÅ‚ania niezależnie od procesów serwera www.","ui.server.config.formTitle":"Konfiguracja Serwera","ui.server.config.formText":"Wprowadź Å›cieżkÄ™ do PHP binary. Upewnij siÄ™, że wersja PHP binary jest taka sama jak w procesie web.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud pozwala na instalowanie pakietów Composera nawet jeÅ›li twój serwer nie posiada wystarczajÄ…cej iloÅ›ci pamiÄ™ci. Informacja o twoich pakietach bÄ™dzie przesÅ‚ana na serwer operowany przez Contao Association.","ui.server.config.cloud":"Użyj Composer Resolver Cloud","ui.server.config.cli":"Plik binarny PHP","ui.server.config.stateErrorCli":"Nie znaleziono poprawnego pliku binarnego PHP na serwerze.","ui.server.config.stateErrorCloud":"Composer Resolver Cloud jest niewspierany.","ui.server.config.stateSuccess":"Plik binarny PHP pod {php_cli}.","ui.server.php_web.title":"PHP Web Process","ui.server.php_web.below7":"Znaleziono wersjÄ™ PHP {version}. Zaktualizuj jÄ… do PHP 7 tak szybko, jak to możliwe!","ui.server.php_web.success":"Znaleziono wersjÄ™ PHP {version}, brak nieprawidÅ‚owoÅ›ci.","ui.server.php_cli.title":"PHP Command Line Interface","ui.server.php_cli.success":"Znaleziono wersjÄ™ PHP {version}, brak nieprawidÅ‚owoÅ›ci.","ui.server.composer.title":"Åšrodowisko Composera","ui.server.composer.success":"Brak nieprawidÅ‚owoÅ›ci.","ui.server.composer.install":"Pakiety Composera nie sÄ… zainstalowane.","ui.server.composer.button":"Instalacja","ui.server.contao.title":"Instalacja Contao","ui.server.contao.setup":"Instalacja","ui.server.contao.check":"Sprawdź bazÄ™ danych","ui.server.contao.empty":"Nie znaleziono instalacji Contao.","ui.server.contao.old":"Wersja Contao {version} jest niekompatybilna z Contao Manager, aktualizuj swojÄ… instalacjÄ™ rÄ™cznie.","ui.server.contao.found":"Znaleziono Contao {version} (wersja API {api}).","ui.server.contao.connectionError":"Brak połączenia z serwerem bazy danych.","ui.server.contao.connectionProblem":"Problem z bazÄ… danych zostaÅ‚ znaleziony.","ui.server.contao.missingUser":"Nie znaleziono konta administratora.","ui.setup.continue":"Kontynuuj","ui.setup.manager":"Otwórz Contao Manager","ui.setup.cancel":"Anuluj","ui.setup.welcome":"Witaj","ui.setup.welcome1":"Ten kreator przeprowadzi CiÄ™ przez niezbÄ™dne kroki, aby skonfigurować instalacjÄ™ Contao Open Source CMS.","ui.setup.welcome2":"JeÅ›li masz jakieÅ› pytania, odwiedź dokumentacjÄ™, fora, kanaÅ‚ Slack i wiÄ™cej na stronie {support}.","ui.setup.support":"wsparcie spoÅ‚ecznoÅ›ci","ui.setup.start":"Rozpocznij","ui.setup.complete":"Gratulacje!","ui.setup.complete1":"Contao {version} zostaÅ‚o zainstalowane pomyÅ›lnie.","ui.setup.complete2":"Aby zakoÅ„czyć proces konfiguracji, otwórz narzÄ™dzie instalacyjne, aby skonfigurować połączenie z bazÄ… danych i utworzyć użytkownika.","ui.setup.complete3":"Możesz teraz rozpocząć tworzenie swojej strony internetowej w Contao. JeÅ›li potrzebujesz dodatkowych rozszerzeÅ„, przejdź dalej do Contao Manager.","ui.setup.installTool":"Otwórz instalator","ui.setup.login":"Zaloguj siÄ™ do Contao","ui.setup.funding":"Free software is \\"free\\" as in \\"free speech\\", not as in \\"free beer\\". An Open Source project like Contao requires amounts of money that can\'t be raised by a single person or company.\\nIf you have a website or sell websites built with Contao, we would love to see you contribute back financially to the product your business relies upon.","ui.setup.fundingLink":"Dowiedz siÄ™ wiÄ™cej","ui.setup.document-root.headline":"Konfiguracja serwera www","ui.setup.document-root.warning":"Aby zainstalować Contao przez Contao Manager, musisz poprawić ustawienie katalogu głównego - document root - w konfiguracji serwera www.","ui.setup.document-root.description1":"Contao używa osobnego folderu dla plików publicznych, a pliki aplikacji sÄ… instalowane w folderze nadrzÄ™dnym. Contao nie może być zainstalowany, jeÅ›li struktura folderów nie jest poprawna lub foldery nie sÄ… puste.","ui.setup.document-root.description2":"JeÅ›li wiesz, jak skonfigurować katalog główny - document root, zapoznaj siÄ™ z dokumentacjÄ… Contao lub skontaktuj siÄ™ z administratorem serwera.","ui.setup.document-root.documentation":"Przeczytaj DokumentacjÄ™","ui.setup.document-root.conflictsTitle":"Katalog instalacyjny nie jest pusty","ui.setup.document-root.conflictsDirectory":"Katalog główny Twojej przyszÅ‚ej instalacji Contao nie jest pusty, znaleźliÅ›my {count} plik(i), które mogÄ… zostać nadpisane przez proces instalacji. Zaleca siÄ™ utworzenie pustej struktury katalogów dla Contao, ale możesz również usunąć nastÄ™pujÄ…ce pliki i sprawdzić ponownie, jeÅ›li jesteÅ› pewien, że sÄ… one nieużywane.","ui.setup.document-root.ignoreConflicts":"ChcÄ™ zainstalować Contao w katalogu, który nie jest pusty. Rozumiem, że może to spowodować nadpisanie wszelkich istniejÄ…cych plików na mojej przestrzeni dyskowej.","ui.setup.document-root.check":"Sprawdź ponownie","ui.setup.document-root.create":"Utwórz katalogi","ui.setup.document-root.change":"ZmieÅ„ katalogi","ui.setup.document-root.formTitle":"Konfiguracja Katalogu","ui.setup.document-root.formText1":"Contao Manager może automatycznie utworzyć nowÄ… strukturÄ™ katalogów na serwerze.","ui.setup.document-root.formText2":"BÄ™dziesz musiaÅ‚ rÄ™cznie skonfigurować nowy katalog główny - document root (np. przez panel administracyjny serwera).","ui.setup.document-root.autoconfig":"Rozumiem, że muszÄ™ zmienić konfiguracjÄ™ mojego serwera. Niepoprawne ustawienie katalogu głównego może uniemożliwić dziaÅ‚anie Contao Manager i uwidocznić publicznie pliki konfiguracyjne (włącznie ze szczegółami konta i hasÅ‚ami)!","ui.setup.document-root.directory":"Nowy Katalog","ui.setup.document-root.currentRoot":"Aktualny Katalog Główny","ui.setup.document-root.newRoot":"Nowy Katalog Główny","ui.setup.document-root.finish":"Ustawienia Katalogów","ui.setup.document-root.publicDir":"Użyj {dir} dla plików publicznych (dla Contao {version})","ui.setup.document-root.directoryInvalid":"Wprowadź prawidÅ‚owÄ… nazwÄ™ katalogu.","ui.setup.document-root.directoryExists":"Docelowy katalog już istnieje. Podaj innÄ… nazwÄ™.","ui.setup.document-root.confirmation":"Contao Manager utworzyÅ‚ potrzebne katalogi dla twojej instalacji Contao. Teraz powinieneÅ› skonfigurować główny katalog serwera www - document root. Nie przeÅ‚adowuj wczeÅ›niej tej strony.","ui.setup.document-root.reload":"PrzeÅ‚aduj StronÄ™","ui.setup.document-root.success":"Struktura katalogów na Twoim serwerze jest ustawiona prawidÅ‚owo!","ui.setup.document-root.installingProjectDir":"Pliki aplikacji zostanÄ… zainstalowane w {dir}.","ui.setup.document-root.installingPublicDir":"Pliki publiczne zostanÄ… zainstalowane do {dir}.","ui.setup.document-root.installedProjectDir":"Pliki aplikacji sÄ… zainstalowane w {dir}.","ui.setup.document-root.installedPublicDir":"Pliki publiczne sÄ… instalowane w {dir}.","ui.setup.create-project.headline":"Instalacja Contao","ui.setup.create-project.description":"Rozwój Contao odbywa siÄ™ zgodnie z zasadÄ… {semver}, co pół roku wydawana jest nowa wersja minor. Obecnie wspierane wydania to:","ui.setup.create-project.semver":"Wersjonowanie semantyczne","ui.setup.create-project.latestTitle":"Najnowsza","ui.setup.create-project.ltsTitle":"Long Term Support","ui.setup.create-project.latestQ1":"Nasza najnowsza wersja, oferuje najwiÄ™cej funkcji ze wsparciem do lutego {year}.","ui.setup.create-project.latestQ3":"Nasza najnowsza wersja oferuje najwiÄ™cej funkcji z wsparciem do sierpnia {year}.","ui.setup.create-project.ltsText":"Nasza aktualna wersja LTS, jeÅ›li stawiasz na stabilność. Oferuje dÅ‚ugoterminowe wsparcie do lutego {year}.","ui.setup.create-project.pltsText":"Poprzednia wersja LTS, nadal posiada dÅ‚ugoterminowe wsparcie do lutego {year}.","ui.setup.create-project.requiresPHP":"Wymaga co najmniej PHP {version}, ty masz PHP {current}.","ui.setup.create-project.releaseplan":"Zobacz {contaoReleasePlan}, aby uzyskać szczegółowe informacje.","ui.setup.create-project.releaseplanLink":"Plan Rozwoju Contao","ui.setup.create-project.installed":"Contao {version} zostaÅ‚o pomyÅ›lnie zainstalowane na serwerze. Kontynuuj konfiguracjÄ™ bazy danych lub uruchom Contao Manager, aby zainstalować innÄ… wersjÄ™.","ui.setup.create-project.formTitle":"Wybierz dystrybucjÄ™","ui.setup.create-project.formText":"Wybierz, która wersja ma być zainstalowana.","ui.setup.create-project.version":"Wersja","ui.setup.create-project.demo":"Zainstaluj witrynÄ™ demonstracyjnÄ… Contao","ui.setup.create-project.demoDescription":"Strona demonstracyjna pomaga Ci zapoznać siÄ™ z Contao i wszystkimi jego podstawowymi funkcjami. WiÄ™cej motywów można znaleźć w {store}.","ui.setup.create-project.coreOnly":"Minimalna Instalacja (tylko Core)","ui.setup.create-project.noUpdate":"PomiÅ„ InstalacjÄ™ (tylko dla ekspertów!)","ui.setup.create-project.theme":"Motyw Contao","ui.setup.create-project.themeInstall":"Aby zainstalować motyw Contao, użyj pola wyszukiwania lub zaÅ‚aduj plik motywu (.cto/.zip), który obsÅ‚uguje instalacjÄ™ za poÅ›rednictwem menedżera Contao.","ui.setup.create-project.themeBuy":"Upewnij siÄ™, że odwiedzisz oficjalny {sklep}.","ui.setup.create-project.themeStore":"Sklep z motywami Contao","ui.setup.create-project.themeUpload":"PrzeÅ›lij plik motywu (.cto/.zip)","ui.setup.create-project.themeInvalid":"PrzesÅ‚any plik nie jest motywem Contao lub nie obsÅ‚uguje Contao Managera.","ui.setup.create-project.themeWarning":"Contao Manager nie może stwierdzić, czy ten motyw jest kompatybilny z Twoim serwerem. Prosimy skontaktować siÄ™ z dostawcÄ… motywu, jeÅ›li masz jakiekolwiek pytania.","ui.setup.create-project.themeTitle":"Przejrzyj szczegóły motywu","ui.setup.create-project.themeDetails":"NastÄ™pujÄ…ce zależnoÅ›ci i pliki zostanÄ… zainstalowane wraz z tym motywem.","ui.setup.create-project.themeRequire":"{count} ZależnoÅ›ci | {count} ZależnoÅ›ci","ui.setup.create-project.themeFiles":"{count} Plik | {count} Pliki","ui.setup.create-project.theme.or":"lub wyszukaj publiczne motywy","ui.setup.create-project.theme.search":"Wyszukiwanie motywów","ui.setup.create-project.theme.more":"WiÄ™cej motywów","ui.setup.create-project.theme.empty":"Brak motywów pasujÄ…cych do {query}","ui.setup.create-project.theme.uploaded":"Plik motywu zostaÅ‚ pomyÅ›lnie przesÅ‚any.","ui.setup.create-project.theme.packageName":"Nazwa pakietu","ui.setup.create-project.theme.version":"Wersja","ui.setup.create-project.theme.authors":"Autor(zy)","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"Instalacja","ui.setup.create-project.cancel":"Anuluj","ui.setup.database-connection.headline":"Połączenie z bazÄ… danych","ui.setup.database-connection.description":"Contao wymaga bazy danych MySQL (lub kompatybilnego forka jak MariaDB) do przechowywania stron, treÅ›ci, użytkowników i innych danych relacyjnych. Parametry połączenia sÄ… przechowywane w pliku {env} w katalogu głównym twojej instalacji Contao.","ui.setup.database-connection.formTitle":"Parametry połączenia","ui.setup.database-connection.formText":"Podaj adres URL bazy danych lub wypeÅ‚nij osobno pola nazwa użytkownika, hasÅ‚o, serwer i baza danych.","ui.setup.database-connection.url":"URL bazy danych","ui.setup.database-connection.validUrl":"URL bazy danych jest nieprawidÅ‚owy lub połączenie z serwerem nie powiodÅ‚o siÄ™.","ui.setup.database-connection.or":"lub","ui.setup.database-connection.user":"Nazwa użytkownika","ui.setup.database-connection.password":"HasÅ‚o","ui.setup.database-connection.server":"Serwer (:Port)","ui.setup.database-connection.database":"Nazwa bazy danych","ui.setup.database-connection.connected":"PomyÅ›lnie połączono z bazÄ… danych {database} na {server}.","ui.setup.database-connection.error":"Błąd połączenia z bazÄ… danych.","ui.setup.database-connection.problem":"Contao wykryÅ‚ problem z serwerem bazy danych.","ui.setup.database-connection.schemaTitle":"Schemat bazy danych","ui.setup.database-connection.migration":"Jest jedna oczekujÄ…ca migracja. | Jest {count} oczekujÄ…cych migracji.","ui.setup.database-connection.schema":"Istnieje jedna oczekujÄ…ca aktualizacja schematu. | Istnieje {count} oczekujÄ…cych aktualizacji schematu.","ui.setup.database-connection.noChanges":"Schemat Twojej bazy danych jest aktualny.","ui.setup.database-connection.check":"Sprawdź bazÄ™ danych","ui.setup.database-connection.skip":"PomiÅ„","ui.setup.database-connection.save":"Zapisz","ui.setup.database-connection.change":"ZmieÅ„ dane dostÄ™powe","ui.setup.database-connection.restoreTitle":"Import bazy danych","ui.setup.database-connection.restoreText":"Temat, który wÅ‚aÅ›nie zainstalowaÅ‚eÅ›, zawiera kopiÄ™ zapasowÄ… bazy danych. Przywróć bazÄ™ danych, aby zaimportować dane motywu, lub pomini ten krok, aby rozpocząć instalacjÄ™ Contao od nowa. | Temat, który wÅ‚aÅ›nie zainstalowaÅ‚eÅ›, zawiera wiele kopii zapasowych bazy danych. Wybierz plik kopii zapasowej do zaimportowania danych motywu lub pomiÅ„ ten krok, aby rozpocząć instalacjÄ™ Contao od nowa.","ui.setup.database-connection.backup":"Zrób kopiÄ™ zapasowÄ… bieżącej bazy danych przed importem","ui.setup.database-connection.backupWarning":"Wszystkie dane w bazie danych zostanÄ… nadpisane podczas importu! JeÅ›li baza danych nie jest pusta, utwórz najpierw kopiÄ™ zapasowÄ….","ui.setup.database-connection.restore":"Importuj bazÄ™ danych motywu","ui.setup.database-connection.restoreOption":"Kopia zapasowa z {date} ({size})","ui.setup.database-connection.restored":"Twoja baza danych motywu zostaÅ‚a pomyÅ›lnie zaimportowana. Kontynuuj walidacjÄ™ schematu bazy danych.","ui.setup.backend-user.success":"W Twojej bazie danych znaleziono konto administratora Contao. Użyj Contao, aby dodać wiÄ™cej użytkowników.","ui.setup.backend-user.error":"Nie można pobrać listy użytkowników. Sprawdź wynik konsoli w celu uzyskania szczegółów.","ui.setup.backend-user.headline":"Konto użytkownika","ui.setup.backend-user.description":"Aby zarzÄ…dzać swojÄ… stronÄ… internetowÄ…, musisz mieć co najmniej jedno konto administratora w Contao. Należy pamiÄ™tać, że to konto nie jest powiÄ…zane z Contao Manager.","ui.setup.backend-user.formTitle":"Utwórz konto","ui.setup.backend-user.formText":"ProszÄ™ wprowadzić dane dla nowego konta backend.","ui.setup.backend-user.username":"Nazwa użytkownika","ui.setup.backend-user.name":"Nazwa","ui.setup.backend-user.email":"Adres e-mail","ui.setup.backend-user.emailInvalid":"Wprowadź prawidÅ‚owy adres e-mail","ui.setup.backend-user.password":"HasÅ‚o","ui.setup.backend-user.passwordPlaceholder":"min 8 znaków","ui.setup.backend-user.passwordLength":"Wprowadź przynajmniej 8 znaków.","ui.setup.backend-user.create":"Dodaj konto","ui.task.headline":"Zadanie w Tle","ui.task.loading":"Åadowanie szczegółów ...","ui.task.created":"Åadowanie szczegółów ...","ui.task.active":"Czekaj, dopóki trwa wykonywanie zadaÅ„ w tle przez Contao Manager.","ui.task.complete":"Wszystkie operacje wykonane poprawnie. Sprawdź szczegóły w treÅ›ci konsoli.","ui.task.paused":"Operacja w tle niespodziewanie przestaÅ‚a pracować. Sprawdź szczegóły w konsoli.","ui.task.aborting":"Czekaj, dopóki trwa anulowanie operacji w tle.","ui.task.stopped":"Niektóre operacje w tle zostaÅ‚y anulowane. Zobacz szczegóły w konsoli.","ui.task.error":"Operacja w tle niespodziewanie przestaÅ‚a pracować. Sprawdź szczegóły w konsoli.","ui.task.failed":"Contao Manager nie mógÅ‚ uruchomić zadania w tle!","ui.task.failedDescription1":"CoÅ› poszÅ‚o źle podczas próby wykonania operacji w tle.","ui.task.failedDescription2":"JeÅ›li sytuacja siÄ™ powtórzy, być może twój serwer nie ma wsparcia.","ui.task.reportProblem":"ZgÅ‚oÅ› problem","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud sponsorowane przez {sponsor}","ui.task.buttonAudit":"Aktualizacja Bazy Danych","ui.task.buttonClose":"Zamknij","ui.task.buttonConfirm":"Potwierdź i zamknij","ui.task.buttonContinue":"Kontynuuj","ui.task.buttonCancel":"Anuluj","ui.task.confirmCancel":"Czy na pewno chcesz anulować to zadanie? To może pozostawić twojÄ… instalację w nieznanym stanie.","ui.task.autoclose":"Zamknij szczegóły zadania, gdy udane","ui.console.toggle":"Pokaż/Ukryj KonsolÄ™","ui.console.showLog":"Pokaż peÅ‚ny dziennik konsoli","ui.console.copyLog":"Skopiuj dziennik do schowka","ui.migrate.headline":"Aktualizacje bazy danych","ui.migrate.migrationsOnly":"(tylko migracje)","ui.migrate.schemaOnly":"(tylko struktura)","ui.migrate.loading":"ProszÄ™ czekać, sprawdzamy twojÄ… bazÄ™ danych …","ui.migrate.empty":"Nie znaleziono żadnych oczekujÄ…cych migracji ani aktualizacji schematów. Twoja baza danych jest aktualna.","ui.migrate.emptyMigrations":"Nie znaleziono żadnych oczekujÄ…cych migracji. Upewnij siÄ™, że sprawdziÅ‚eÅ› również aktualizacje schematu.","ui.migrate.emptySchema":"Nie znaleziono oczekujÄ…cych aktualizacji schematu. Upewnij siÄ™, że sprawdzisz również migracje.","ui.migrate.pending":"Twoja baza danych nie jest aktualna. ProszÄ™ przejrzyj poniższe wyjÅ›cie konsoli i wykonaj zmiany.","ui.migrate.previousChanges":"Poprzednia migracja bazy danych nie zostaÅ‚a potwierdzona.\\nProszÄ™ przejrzeć poniższe wyniki konsoli, a nastÄ™pnie kontynuować, aby zobaczyć kolejne zmiany.","ui.migrate.previousComplete":"Poprzednia migracja bazy danych nie zostaÅ‚a potwierdzona, proszÄ™ sprawdzić poniższe wyniki konsoli.\\nNie ma wiÄ™cej oczekujÄ…cych zmian.","ui.migrate.appliedChanges":"Aktualizacje bazy danych zostaÅ‚y zastosowane.\\nProszÄ™ przejrzeć poniższe wyjÅ›cie konsoli, a nastÄ™pnie kontynuować, aby zobaczyć kolejne zmiany.","ui.migrate.appliedComplete":"Baza danych zostaÅ‚a zaktualizowana.\\nNie ma wiÄ™cej oczekujÄ…cych migracji ani aktualizacji schematu. Twoja baza danych jest aktualna.","ui.migrate.problem":"Contao wykryÅ‚ problem z serwerem bazy danych.\\nProszÄ™ przejrzyj poniżej wynik konsoli, aby dowiedzieć siÄ™, co należy naprawić. | Contao wykryÅ‚ problemy z serwerem bazy danych.\\nProszÄ™ przejrzyj poniżej wynik konsoli, aby dowiedzieć siÄ™, co należy naprawić.","ui.migrate.warning":"Contao wykryÅ‚ błędnÄ… konfiguracjÄ™ serwera bazy danych.\\nOstrzeżenia można tymczasowo pominąć, ale należy je naprawić dla optymalnej wydajnoÅ›ci i integralnoÅ›ci danych.","ui.migrate.error":"Zmiany nie mogÅ‚y zostać zastosowane. Twoja baza danych mogÅ‚a zostać zmieniona, sprawdź ponownie, aby ponowić próbÄ™.","ui.migrate.execute":"Wykonaj","ui.migrate.close":"Zamknij","ui.migrate.confirm":"Potwierdź i zamknij","ui.migrate.cancel":"Anuluj","ui.migrate.continue":"Kontynuuj","ui.migrate.setup":"Instalacja","ui.migrate.skip":"PomiÅ„","ui.migrate.retry":"Sprawdź ponownie","ui.migrate.retryAll":"Sprawdź wszystkie","ui.migrate.withDeletes":"Wykonaj wszystkie zmiany w bazie danych, włączajÄ…c zapytania DROP.","ui.migrate.migrationTitle":"Migracje baz danych","ui.migrate.schemaTitle":"Aktualizacje schematu","ui.migrate.problemTitle":"Problemy z bazÄ… danych","ui.migrate.warningTitle":"Ostrzeżenia bazy danych","ui.migrate.addTable":"Dodaj tabelÄ™ {table}","ui.migrate.dropTable":"UsuÅ„ tabelÄ™ {table}","ui.migrate.addField":"Dodaj pole {table}.{field}","ui.migrate.changeField":"ZmieÅ„ pole {table}.{field}","ui.migrate.dropField":"UsuÅ„ pole {table}.{field}","ui.migrate.createIndex":"Utwórz indeks \\"{name}\\" w {table}","ui.migrate.dropIndex":"UsuÅ„ indeks \\"{name}\\" w {table}","ui.widget.mandatory":"To pole nie może być puste.","ui.widget.blankOption":"ProszÄ™ wybrać …","ui.widget.showPassword":"Pokaż hasÅ‚o","ui.widget.hidePassword":"Ukryj hasÅ‚o","ui.error.title":"Żądanie HTTP dla \\"{method}{url}\\" nie powiodÅ‚o siÄ™.","ui.error.server500":"WyglÄ…da na to, że wystÄ…piÅ‚ nieoczekiwany błąd na twoim serwerze. Sprawdź dziennik zdarzeÅ„ serwera www (Apache/Nginx) oraz dziennik Contao Manager w \\"contao-manager/logs\\".","ui.error.response":"Serwer zwróciÅ‚ odpowiedź z kodem {status}.","ui.error.moreLink":"WiÄ™cej informacji","ui.error.support":"Wsparcie Contao","ui.error.permission":"You do not have permission to use this feature.","ui.footer.help":"Pomoc","ui.footer.reportProblem":"ZgÅ‚oÅ› problem","ui.navigation.discover":"Odkrywaj","ui.navigation.packages":"Pakiety","ui.navigation.tools":"NarzÄ™dzia","ui.navigation.installTool":"Instalator","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Contao Tryb Debug","ui.navigation.logViewer":"Czytnik logów","ui.navigation.phpinfo":"Informacja PHP","ui.navigation.phpinfoLoading":"Åadowanie informacji PHP…","ui.navigation.maintenance":"Konserwacja","ui.navigation.rebuildCache":"Przebuduj cache","ui.navigation.users":"Accounts","ui.navigation.systemCheck":"Sprawdzenie Systemu","ui.navigation.advanced":"Zaawansowane","ui.navigation.logout":"Wyloguj","ui.maintenance.database.title":"Bazy danych Migracje i Kopie Zapasowe","ui.maintenance.database.description":"Migracje baz danych zapewniajÄ… spójność danych i schematów tabel.","ui.maintenance.database.migrations":"Jedna oczekujÄ…ca migracja bazy danych | {count} oczekujÄ…cych migracji bazy danych","ui.maintenance.database.schemaUpdates":"Jedna oczekujÄ…ca aktualizacja schematu | {count} oczekujÄ…ce aktualizacje schematu","ui.maintenance.database.error":"Problem z bazÄ… danych zostaÅ‚ znaleziony.","ui.maintenance.database.warning":"Wykryto ostrzeżenia w bazie danych.","ui.maintenance.database.button":"Sprawdź bazÄ™ danych","ui.maintenance.database.migrationOnly":"Sprawdź tylko migracje","ui.maintenance.database.schemaOnly":"Sprawdź tylko strukturÄ™","ui.maintenance.database.installTool":"Otwórz instalator","ui.maintenance.database.createBackup":"Utwórz kopiÄ™ zapasowÄ…","ui.maintenance.database.backupUnsupported":"Kopie zapasowe bazy danych nie sÄ… obsÅ‚ugiwane przez TwojÄ… wersjÄ™ Contao.","ui.maintenance.database.backupList":"Masz jedno kopiÄ™ zapasowÄ… bazy danych, utworzonÄ… {date}. | Masz {count} kopii zapasowych bazy danych, najnowsza zostaÅ‚a utworzona {date}.","ui.maintenance.database.backupEmpty":"Nie masz obecnie żadnych kopii zapasowych bazy danych.","ui.maintenance.rebuildCache.title":"Cache Aplikacji","ui.maintenance.rebuildCache.description":"Przebudowanie cache\'u aplikacji jest wymagane po jakichkolwiek modyfikacjach plików konfiguracyjnych.","ui.maintenance.rebuildCache.rebuildProd":"Przebuduj Cache Production","ui.maintenance.rebuildCache.rebuildDev":"Przebuduj Cache Development","ui.maintenance.rebuildCache.clearProd":"Wyczyść Cache Production","ui.maintenance.rebuildCache.clearDev":"Wyczyść Cache Development","ui.maintenance.installTool.title":"Instalator Contao","ui.maintenance.installTool.description":"Instalator Contao jest automatycznie blokowany jeÅ›li wprowadzisz błędne hasÅ‚o trzy razy z rzÄ™du.","ui.maintenance.installTool.unlock":"Odblokuj instalator","ui.maintenance.installTool.lock":"Zablokuj instalator","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"Autoloader Composera jest odpowiedzialny za Å‚adowanie klas PHP. Autoloader musi być odÅ›wieżony po dodaniu wÅ‚asnych namespace\'ów do pliku composer.json.","ui.maintenance.dumpAutoload.button":"OdÅ›wież Autoloader","ui.maintenance.composerInstall.title":"Pakiety Composera","ui.maintenance.composerInstall.description":"ZależnoÅ›ci Composer\'a sÄ… umieszczone w folderze {vendor} w głównym katalogu aplikacji. Przeinstalowanie zależnoÅ›ci może być konieczne po zmianach lub rÄ™cznym wgraniu pliku {composerLock}.","ui.maintenance.composerInstall.button":"Uruchom Instalator","ui.maintenance.composerInstall.update":"Uruchom Composer Update","ui.maintenance.composerCache.title":"Cache Composera","ui.maintenance.composerCache.description":"Composer cache\'uje pobrane pakiety w celu lepszej wydajnoÅ›ci. JeÅ›li masz problemy z zepsutymi plikami, spróbuj usunąć cache Composera, aby wymusić nowe pobranie plików.","ui.maintenance.composerCache.button":"Wyczyść Cache","ui.maintenance.maintenanceMode.title":"Tryb konserwacji","ui.maintenance.maintenanceMode.description":"Przełączenie Contao w tryb konserwacji spowoduje wyÅ›wietlenie szablonu \\"503 Service Unavailable\\" dla strony internetowej.","ui.maintenance.maintenanceMode.enable":"Włącz","ui.maintenance.maintenanceMode.disable":"Wyłącz","ui.maintenance.debugMode.title":"Tryb Debug","ui.maintenance.debugMode.description":"Aktywuj tryb diagnostyczny podajÄ…c nazwÄ™ użytkownika i hasÅ‚o do {appDevPhp} punktu dostÄ™powego.","ui.maintenance.debugMode.descriptionJwt":"Aktywuj tryb debug poprzez ustawienie ciasteczka debug dla obecnej domeny.","ui.maintenance.debugMode.activate":"Aktywuj","ui.maintenance.debugMode.deactivate":"Deaktywuj","ui.maintenance.debugMode.credentials":"Uwierzytelnianie","ui.maintenance.debugMode.user":"ProszÄ™ wprowadzić nazwÄ™ użytkownika dla trybu debug.","ui.maintenance.debugMode.password":"ProszÄ™ wprowadzić hasÅ‚o dla trybu debug.","ui.maintenance.opcodeCache.title":"Cache Opcode","ui.maintenance.opcodeCache.description":"Opcode cache\'uje pliki PHP procesu web w celu szybszego ich wykonywania. Cache musi zostać usuniÄ™ty w pewnych okolicznoÅ›ciach, jeÅ›li pliki nie sÄ… rozpoznawane po ich zmianie.","ui.maintenance.opcodeCache.button":"Wyczyść Cache","ui.maintenance.safeMode":"NiedostÄ™pne w Bezpiecznym Trybie","ui.maintenance.unsupported":"Niewspierane przez twojÄ… wersjÄ™ Contao","ui.packages.updateButton":"Zaktualizuj pakiety","ui.packages.searchButton":"Szukaj Pakietów","ui.packages.searchPlaceholder":"Szukaj pakietów …","ui.packages.uploadOverlay":"PrzeciÄ…gnij i upuść pliki","ui.packages.uploadButton":"Wgraj pakiety","ui.packages.uploadMessage":"Masz jednÄ… niepotwierdzonÄ… wysyÅ‚kÄ™. | Masz {count} niepotwierdzonych wysyÅ‚ek.","ui.packages.uploadApply":"Potwierdź pliki","ui.packages.uploadReset":"UsuÅ„ pliki","ui.packages.uploadIncomplete":"Ten plik nie zostaÅ‚ wgrany caÅ‚kowicie. UsuÅ„ go i spróbuj ponownie.","ui.packages.uploadDuplicate":"Ten plik wyglÄ…da na wgrany kilka razy. UsuÅ„ duplikaty.","ui.packages.uploadInstalled":"Ten plik jest już zainstalowany. UsuÅ„ duplikaty.","ui.packages.uploadUnsupported":"PrzesyÅ‚ki nie sÄ… obsÅ‚ugiwane w Twojej instalacji. Upewnij siÄ™, że rozszerzenie PHP ZIP jest zainstalowane i zaktualizuj swoje zależnoÅ›ci.","ui.packages.changesMessage":"Masz jednÄ… niepotwierdzonÄ… zmianÄ™. | Masz {count} niepotwierdzonych zmian.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"Zapisz zmiany","ui.packages.changesApplyAll":"Zaktualizuj wszystkie pakiety","ui.packages.changesDryrunAll":"Próbnie zaktualizuj wszystkie pakiety","ui.packages.changesReset":"Zresetuj zmiany","ui.packages.changesReview":"Zapisz Zmiany","ui.packagelist.loading":"Åadowanie …","ui.packagelist.uploads":"Wgrane pliki","ui.packagelist.added":"Nowe pakiety","ui.packagelist.installed":"Zainstalowane pakiety","ui.package.hintRevert":"Cofnij zmiany","ui.package.hintNoupdate":"Nie aktualizuj","ui.package.hintConstraint":"Ten pakiet zostanie zainstalowany z wymogiem {constraint} kiedy zapiszesz zmiany.","ui.package.hintConstraintBest":"Ten pakiet zostanie zainstalowany w najlepszej możliwej wersji kiedy zapiszesz zmiany.","ui.package.hintConstraintChange":"Wymóg dla tego pakietu zostanie zmieniony z \\"{from}\\" do \\"{to}\\" kiedy zapiszesz zmiany.","ui.package.hintConstraintUpdate":"Ten pakiet zostanie zaktualizowany, kiedy zapiszesz zmiany.","ui.package.hintAdded":"Ten pakiet zostanie zainstalowana, kiedy zapiszesz zmiany.","ui.package.hintRemoved":"Ten pakiet zostanie usuniÄ™ty kiedy zapiszesz zmiany.","ui.package.requiredTitle":"dodane rÄ™cznie","ui.package.requiredText":"Ten pakiet jest jako wymagany w pliku composer.json, ale nie jest zainstalowany.","ui.package.removedTitle":"usuniÄ™te rÄ™cznie","ui.package.removedText":"Ten pakiet zostaÅ‚ usuniÄ™ty z twojego composer.json.","ui.package.installed":"Obecnie zainstalowane:","ui.package.version":"Wersja {version}","ui.package.additionalDownloads":"{count} Pobranie | {count} Pobrania","ui.package.additionalStars":"{count} Gwiazdka | {count} Gwiazdki","ui.package.editConstraint":"Edytuj","ui.package.uploadConstraint":"To ograniczenie zdefiniowane jest przez przesÅ‚any pakiet.","ui.package.updateButton":"Aktualizuj","ui.package.removeButton":"UsuÅ„","ui.package.installButton":"Dodaj Pakiet","ui.package.installButtonShort":"Dodaj","ui.package.detailsButton":"Szczegóły","ui.package.latestConstraint":"ostatnia wersja","ui.package.update":"DostÄ™pna aktualizacja","ui.package.updateLatest":"ostatnia wersja","ui.package.updateAvailable":"{version} dostÄ™pna","ui.package.updateUnknown":"nieznana wersja","ui.package.updateConstraint":"DostÄ™pna jest nowsza wersja spoza ograniczenia wersji Twojego oprogramowania.","ui.package.incompatible":"{package} does not work with Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Wersja {version}","ui.cloudStatus.waitingTime":"Czas Oczekiwania","ui.cloudStatus.jobs":"Aktualne Zadania","ui.cloudStatus.workers":"Workers","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"żaden","ui.cloudStatus.short":"ok. {minutes} min","ui.cloudStatus.long":"ok. {minutes} min {seconds} sek","ui.cloudStatus.error":"Nie udaÅ‚o siÄ™ uzyskać stanu Composer Resolver Cloud. Może być w trakcie serwisowania lub ma awariÄ™.","ui.cloudStatus.button":"Status Chmury","ui.cloudStatus.refresh":"OdÅ›wież Status Chmury","ui.log-viewer.loading":"Åadowanie …","ui.log-viewer.empty":"Nie ma plików dziennika na Twoim serwerze.","ui.log-viewer.reload":"OdÅ›wież","ui.log-viewer.file":"Plik logów","ui.log-viewer.channel":"KanaÅ‚","ui.log-viewer.channelTitle":"KanaÅ‚, do którego zostaÅ‚a zapisana ta wiadomość.","ui.log-viewer.level":"Poziom","ui.log-viewer.levelTitle":"Ważność wiadomoÅ›ci log.","ui.log-viewer.timeHeader":"Czas","ui.log-viewer.messageHeader":"Wiadomość","ui.log-viewer.showContext":"Pokaż kontekst","ui.log-viewer.hideContext":"Ukryj kontekst","ui.log-viewer.showExtra":"Pokaż Dodatkowe","ui.log-viewer.hideExtra":"Ukryj Dodatkowe","ui.log-viewer.more":"Wczytaj wiÄ™cej ...","ui.log-viewer.download":"Pobierz","ui.log-viewer.downloadTitle":"Pobierz plik \\"{file}\\"","ui.log-viewer.prodEnvironment":"Åšrodowisko produkcyjne","ui.log-viewer.devEnvironment":"Åšrodowisko deweloperskie (tryb debugowania)","ui.user-manager.loading":"Loading users …","ui.user-manager.changePassword":"Change Password","ui.user-manager.setupTotp":"Setup Two-Factor Authentication","ui.user-manager.disableTotp":"Disable Two-Factor Authentication","ui.user-manager.invite":"Invite User","ui.user-manager.delete":"Delete","ui.user-manager.deleteConfirm":"Do you really want to delete user \\"{username}\\"?","ui.user-manager.deleted":"User {username} deleted successfully","ui.user-manager.passwordHeadline":"Change Password","ui.user-manager.passwordText":"To change your password, please enter the current and a new password in the respective fields.","ui.user-manager.currentPassword":"Current password","ui.user-manager.newPassword":"New password","ui.user-manager.passwordPlaceholder":"min 8 znaków","ui.user-manager.submitPassword":"Submit","ui.user-manager.passwordChanged":"Your password has been changed successfully.","ui.user-manager.passwordError":"This password is incorrect.","ui.user-manager.inviteHeadline":"Invite User","ui.user-manager.inviteText":"If you need multiple logins for the Contao Manager, you can create an invitation link here. Share this link with someone or use it on another device to create a new account with the given permissions.","ui.user-manager.inviteSuccess1":"A new invitation link was created. The URL below can be used to create a new user account for this Contao Manager. The invitation expires on {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Please copy the link to your clipboard. It will only work once and you will not be able to see it again after closing this dialog.","ui.user-manager.createInvitation":"Create Invitation Link","ui.user-manager.clipboard":"Copy to clipboard","ui.user-manager.permissions":"Learn about permissions","ui.user-manager.cancel":"Anuluj","ui.user-manager.close":"Zamknij","ui.user-manager.you":"You","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Two-Factor Authentication","ui.totp.setupQr":"Please scan the QR code with your 2FA/TOTP app.","ui.totp.setupCode":"If you cannot scan the QR code, enter this key instead:","ui.totp.codeLabel":"Verification code","ui.totp.codeDescription":"Please enter the verification code generated by your 2FA/TOTP app.","ui.totp.disableText":"Please enter the verification code to disable two-factor authentication.","ui.totp.invalid":"The verification code is invalid.","ui.totp.enable":"Włącz","ui.totp.disable":"Wyłącz","ui.totp.cancel":"Anuluj","ui.totp.enabled":"Two-factor authentication was enabled successfully.","ui.totp.disabled":"Two-factor authentication was disabled successfully.","ui.totp.setup":"Setup Two-Factor Authentication","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[851],{6851:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Connessione non sicura !!","ui.app.httpsDescription":"Senza protocollo HTTPS i tuoi dati riservati saranno trasferiti in chiaro.","ui.app.httpsLink":"Maggiori informazioni","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Safe Mode abilitato!!","ui.app.safeModeDescription":"Alcune funzionalità di Contao Manager non sono disponibili.","ui.app.safeModeExit":"Esci da Safe Mode","ui.app.limitedHeadline":"Autenticazione remota","ui.app.limitedDescription":"You have limited permissions due to passwordless login.","ui.app.limitedLogout":"Re-authenticate","ui.app.totpHeadline":"Security Notice","ui.app.totpDescription":"Configure two-factor authentication now to secure your account.","ui.app.totpSetup":"Setup","ui.app.loading":"Caricamento Contao Manager ....","ui.app.apiError":"Stato API inaspettato","ui.app.configSecurity1":"ALLARME DI SICUREZZA! La cartella di configurazione non è protetta","ui.app.configSecurity2":"Contao Manager ha rilevato che i tuoi file di configurazione sono accessibili al pubblico. Tutte le operazioni sono disabilitate fino a quando la cartella non viene protetta e messa in sicurezza, altrimenti un malintenzionato potrebbe accedere ai dati sensibili della tua installazione.\\n\\nPer risolvere questo problema, assicurati di impedire l\'accesso alla cartella \\"contao-manager\\" sul tuo server. Per sapere come farlo, fai riferimento al manuale del tuo webserver o contatta il tuo fornitore di hosting.","ui.account.welcome":"Benvenuto","ui.account.intro1":"Benvenuto in Contao Manager, uno strumento universale per installare e gestire CMS Open Source di Contao 4. Se sei nuovo, per favore {leggiTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} per iniziare","ui.account.introManual":"leggi il manuale","ui.account.intro2":"In caso di problemi, controlla {ourGithubIssues}. Nel caso sentiti libero di creare un nuovo problema per tutto ciò che non è stato ancora segnalato.","ui.account.introIssues":"segnalazioni in GitHub","ui.account.headline":"Account utente","ui.account.description":"Per gestire l\'installazione, crea un account specifico per Contao Manager. Tieni presente che questo account non è correlato al back end o al front end di Contao.","ui.account.username":"Nome utente","ui.account.password":"Password","ui.account.passwordPlaceholder":"min. 8 caratteri","ui.account.passwordLength":"Inserisci almeno 8 caratteri.","ui.account.loginInvalid":"There was an error when creating the account. Please try a different username.","ui.account.submit":"Crea account","ui.account.usePassword":"Use password for login","ui.account.usePasskey":"Use Passkey for login","ui.account.totpHeadline":"Two-factor authentication","ui.account.totpDescription":"Please enable two-factor authentication, which adds an extra layer of security to your account. In addition to your username and password, you will need to enter a verification code generated by a two-factor app such as 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator or any other TOTP app.","ui.account.totpSetup":"Configure now","ui.account.totpSkip":"Configure later","ui.account.login":"Decline Invitation","ui.account.contribute1":"Contao e il Contao Manager sono sponsorizzati dalla Contao Association senza scopo di lucro.","ui.account.contribute2":"Si prega di considerare di contribuire all\'open source con {donate}.","ui.account.contributeDonate":"Fare una donazione","ui.login.headline":"Registrati","ui.login.description":"Accedi per gestire la tua installazione","ui.login.username":"Nome utente","ui.login.password":"Password","ui.login.totpHeadline":"Two-factor authentication","ui.login.totpDescription":"Please enter your verification code to complete the login process.","ui.login.totp":"Verification code","ui.login.forgotPassword":"Password dimenticata?","ui.login.button":"Registrati","ui.login.passkey":"Sign In with Passkey","ui.login.cancel":"Annulla","ui.login.or":"oppure","ui.login.locked":"L\'accesso è stato negato perché il Contao Manager è bloccato. Per sbloccare, cancella il file {lockFile} nella directory principale di Contao.","ui.logout.headline":"Timeout sessione","ui.logout.warning":"Sei stato inattivo per più di 25 minuti. Per motivi di sicurezza, la sessione verrà chiusa a breve.","ui.logout.expired":"La sessione è stata chiusa automaticamente perché sei stato inattivo per più di 30 minuti.","ui.logout.renew":"Mantieni il login","ui.logout.logout":"Logout","ui.logout.login":"Torna al login","ui.oauth.error":"Tentativo di OAuth non valido. Controllare i parametri della richiesta.","ui.oauth.https":"L\'URI di reindirizzamento DEVE usare un protocollo sicuro (https:) per evitare che il token di autenticazione sia trasmesso in chiaro.","ui.oauth.headline":"Autenticazione remota","ui.oauth.description":"La seguente applicazione o servizio richiede l\'accesso remoto all\'istanza di Contao Manager.","ui.oauth.domain":"Prima di permettere l\'accesso, assicurati di conoscere questo URL e di fidarti del suo proprietario!","ui.oauth.outOfScope":"Unfortunately, you do not have the necessary permissions to grant this access.","ui.oauth.allow":"Consenti accesso","ui.oauth.deny":"Accesso negato","ui.oauth.switchUser":"Switch User","ui.scope.admin":"Admin access including user management","ui.scope.install":"Install new packages and change Contao configuration","ui.scope.update":"Update packages and execute maintenance tasks","ui.scope.read":"Read packages and configuration","ui.boot.headline":"Verifica del sistema","ui.boot.description":"Per favore attendi, stiamo analizzando il tuo server...","ui.boot.issue1":"Problemi di installazione rilevati","ui.boot.issue2":"L\'installazione presenta problemi che devono essere risolti prima di poter utilizzare Contao Manager.","ui.boot.run":"Avvia Contao Manager","ui.boot.safeMode":"Avvio in modalità sicura","ui.recovery.headline":"Sistema di recupero","ui.recovery.description":"Contao Manager ha rilevato file che assomigliano a Contao, ma l\'interfaccia della riga di comando non funziona come previsto.","ui.recovery.console":"Uscita console","ui.recovery.repairOptions":"Scegliere un\'opzione per riparare l\'installazione.","ui.recovery.repairHeadline":"Riparazione automatica","ui.recovery.repairDescription":"Tentativi di riparare automaticamente l\'installazione ricostruendo la cache dell\'applicazione e reinstallando i pacchetti Composer.","ui.recovery.repairWarning":"Qualsiasi modifica ai file del fornitore potrebbe essere cancellata durante il processo!","ui.recovery.repairFailed":"La riparazione automatica non ha avuto successo. Provare la modalità provvisoria per riparare manualmente l\'installazione.","ui.recovery.repairButton":"Esegui la riparazione del sistema","ui.recovery.safeModeHeadline":"Modalità Sicura","ui.recovery.safeModeDescription":"L\'avvio di Contao Manager in modalità provvisoria consente di gestire i pacchetti ed eseguire alcune operazioni di manutenzione, ma le funzioni che si basano su un\'installazione di Contao funzionante non saranno disponibili.","ui.recovery.safeModeButton":"Avvio in modalità sicura","ui.server.pending":"In attesa ...","ui.server.running":"Analizzando ...","ui.server.error":"Verifica non riuscita a causa di una risposta imprevista dal server.","ui.server.details":"Dettagli","ui.server.prerequisite":"Verifica annullata a causa di un prerequisito mancante.","ui.server.selfUpdate.title":"Aggiornamenti di Contao Manager","ui.server.selfUpdate.update":"È disponibile una nuova versione, la {latest} di Contao Manager.","ui.server.selfUpdate.manualUpdate":"È disponibile una nuova versione di Contao Manager {latest}. Il tuo server non supporta gli aggiornamenti automatici, scarica la nuova versione da {download}.","ui.server.selfUpdate.latest":"Stai usando l\'ultima versione disponibile {current}.","ui.server.selfUpdate.dev":"Il build di sviluppo non supportano gli aggiornamenti automatici.","ui.server.selfUpdate.unsupported":"Una nuova versione è disponibile ma non supporta la versione di PHP.","ui.server.selfUpdate.button":"Eseguire l\'auto-aggiornamento","ui.server.selfUpdate.continue":"Continuare","ui.server.config.title":"Configurazione del server","ui.server.config.setup":"Configura","ui.server.config.change":"Cambiamento","ui.server.config.save":"Salva","ui.server.config.cancel":"Annulla","ui.server.config.customOption":"Altri ...","ui.server.config.description":"Per eseguire correttamente le attività in background, Contao Manager deve sapere dove trovare il binario della riga di comando PHP e come eseguire i comandi separati dal processo web.","ui.server.config.formTitle":"Configurazione del server","ui.server.config.formText":"Inserisci il percorso del file binario PHP. Assicurati che il file binario PHP sia la stessa versione del processo del web server.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud consente di installare le dipendenze di Composer anche se il server non fornisce memoria locale sufficiente. Si noti che le informazioni del pacchetto verranno trasmesse a un server cloud gestito dalla Contao Association.","ui.server.config.cloud":"Utilizza Composer Resolver Cloud","ui.server.config.cli":"PHP binario","ui.server.config.stateErrorCli":"Nessun binario PHP valido è stato trovato sul server.","ui.server.config.stateErrorCloud":"Composer Resolver Cloud non è supportato.","ui.server.config.stateSuccess":"Binario PHP in {php_cli}.","ui.server.php_web.title":"Processo Web PHP","ui.server.php_web.below7":"Trovata la versione di PHP {version}. Si prega di passare a PHP 7 il più presto possibile!","ui.server.php_web.success":"Trovata la versione di PHP {version}, non sono stati trovati problemi noti.","ui.server.php_cli.title":"Interfaccia a riga di comando PHP","ui.server.php_cli.success":"Trovata la versione di PHP {version}, non sono stati trovati problemi noti.","ui.server.composer.title":"Ambiente Composer","ui.server.composer.success":"Non sono stati trovati problemi noti.","ui.server.composer.install":"Le dipendenze del Composer non sono installate.","ui.server.composer.button":"Installa","ui.server.contao.title":"Installazione Contao","ui.server.contao.setup":"Setup","ui.server.contao.check":"Verifica il database","ui.server.contao.empty":"Non è stata trovata alcuna installazione di Contao.","ui.server.contao.old":"La versione {version} di Contao non è compatibile con Contao Manager, aggiorna manualmente l\'installazione.","ui.server.contao.found":"Trovato Contao {version} (versione API {api}).","ui.server.contao.connectionError":"Impossibile connettersi al server del database.","ui.server.contao.connectionProblem":"È stato trovato problema con il database.","ui.server.contao.missingUser":"Account amministratore non trovato.","ui.setup.continue":"Continuare","ui.setup.manager":"Avvia Contao Manager","ui.setup.cancel":"Annulla","ui.setup.welcome":"Benvenuto","ui.setup.welcome1":"Questa procedura guidata ti guiderà attraverso i passaggi necessari per configurare l\'installazione del tuo Contao CMS Open Source.","ui.setup.welcome2":"In caso di domande, puoi consultare la documentazione, forum, un canale Slack e altro nella pagina {support}.","ui.setup.support":"Supporto dalla comunità","ui.setup.start":"Iniziamo","ui.setup.complete":"Congratulazioni!","ui.setup.complete1":"Contao {version} è stato installato correttamente.","ui.setup.complete2":"Per completare il processo d\'installazione, apri lo strumento di installazione per configurare la connessione al database e creare un utente back-end.","ui.setup.complete3":"Ora puoi iniziare a creare il tuo sito web nel back-end di Contao. Se hai bisogno di ulteriori estensioni, vai su Contao Manager.","ui.setup.installTool":"Apri l\'Install Tool","ui.setup.login":"Effettua il login in Contao","ui.setup.funding":"Il software libero è \\"libero\\" come in \\"libertà di parola\\", non come in \\"birra gratis\\". Un progetto Open Source come Contao richiede somme di denaro che non possono essere raccolte da una singola persona o azienda.\\nSe hai un sito web o vendi siti web realizzati con Contao, ci piacerebbe vederti contribuire finanziariamente al prodotto su cui fa affidamento la tua attività.","ui.setup.fundingLink":"Scopri di più","ui.setup.document-root.headline":"Setup Webserver ","ui.setup.document-root.warning":"Per installare Contao tramite Contao Manager, è necessario correggere la document root sul server Web.","ui.setup.document-root.description1":"Contao utilizza una cartella separata per i file pubblici, i file dell\'applicazione vengono installati nella sua cartella principale. Contao non può essere installato se la struttura delle cartelle non è corretta o le cartelle non sono vuote.","ui.setup.document-root.description2":"Se non sai come configurare la document root, leggi la documentazione Contao o contatta il tuo provider di hosting.","ui.setup.document-root.documentation":"Leggi la documentazione","ui.setup.document-root.conflictsTitle":"La directory di installazione non è vuota","ui.setup.document-root.conflictsDirectory":"La directory principale della tua futura installazione di Contao non è vuota, abbiamo trovato {count} files che potrebbero essere sovrascritti dal processo di installazione. Si consiglia di creare una struttura di directory vuota per Contao, ma puoi anche rimuovere i seguenti file e ricontrollare se sei sicuro che non siano utilizzati.","ui.setup.document-root.ignoreConflicts":"Voglio installare Contao nella directory non vuota. Capisco che questo potrebbe sovrascrivere qualsiasi file esistente sul mio spazio web.","ui.setup.document-root.check":"Controlla nuovamente","ui.setup.document-root.create":"Creare elenchi","ui.setup.document-root.change":"Cambia directory","ui.setup.document-root.formTitle":"Setup cartella","ui.setup.document-root.formText1":"Contao Manager può creare automaticamente una nuova struttura di directory sul server.","ui.setup.document-root.formText2":"Dovrai configurare manualmente la nuova root document (ad es. Tramite un pannello di amministrazione di hosting).","ui.setup.document-root.autoconfig":"Comprendo che devo modificare la configurazione del mio server. La mancata configurazione della document root interromperà Contao Manager ed esporrà i file di configurazione (inclusi i dettagli dell\'account e le password)!","ui.setup.document-root.directory":"Nuova directory","ui.setup.document-root.currentRoot":"Document root corrente","ui.setup.document-root.newRoot":"Nuova document root","ui.setup.document-root.finish":"Cartella di installazione","ui.setup.document-root.publicDir":"Usare {dir} per i file pubblici (per Contao {versione})","ui.setup.document-root.directoryInvalid":"Inserisci un nome di directory valido.","ui.setup.document-root.directoryExists":"La cartella di destinazione esiste già. Per favore, inserisci un nome diverso.","ui.setup.document-root.confirmation":"Contao Manager ha creato correttamente la cartella necessaria per l\'installazione di Contao. Ora devi configurare la radice del documento sul tuo server web. Non ricaricare questa pagina fino ad allora.","ui.setup.document-root.reload":"Ricarica pagina","ui.setup.document-root.success":"La struttura delle directory sul tuo server web è impostata correttamente!","ui.setup.document-root.installingProjectDir":"I file dell\'applicazione verranno installati in {dir}.","ui.setup.document-root.installingPublicDir":"I file pubblici verranno installati in {dir}.","ui.setup.document-root.installedProjectDir":"I file dell\'applicazione vengono installati in {dir}.","ui.setup.document-root.installedPublicDir":"I file pubblici vengono installati in {dir}.","ui.setup.create-project.headline":"Installazione Contao","ui.setup.create-project.description":"Lo sviluppo di Contao segue il principio di {semver}, una nuova versione minore viene rilasciata ogni sei mesi. Le versioni attualmente supportate sono:","ui.setup.create-project.semver":"Versione semantica","ui.setup.create-project.latestTitle":"Più recente","ui.setup.create-project.ltsTitle":"Long Term Support","ui.setup.create-project.latestQ1":"La nostra ultima versione offre la maggior parte delle funzionalità con supporto fino a febbraio {anno}.","ui.setup.create-project.latestQ3":"La nostra ultima versione offre la maggior parte delle funzionalità con supporto fino ad agosto {year}.","ui.setup.create-project.ltsText":"La nostra attuale versione LTS, è focalizzata al mantenimento della stabilità. Offre supporto a lungo termine fino a febbraio {year}.","ui.setup.create-project.pltsText":"La precedente versione LTS ha ancora il supporto a lungo termine fino a febbraio {year}.","ui.setup.create-project.requiresPHP":"Richiede almeno PHP {version}, tu hai PHP {current}.","ui.setup.create-project.releaseplan":"Vedi {contaoReleasePlan} per informazioni dettagliate.","ui.setup.create-project.releaseplanLink":"Piano di rilascio Contao","ui.setup.create-project.installed":"Contao {version} è stato installato correttamente sul server. Continua a configurare il tuo database o avvia Contao Manager per installare una versione diversa.","ui.setup.create-project.formTitle":"Seleziona una distribuzione","ui.setup.create-project.formText":"Scegliere quale versione deve essere installata.","ui.setup.create-project.version":"Versione","ui.setup.create-project.demo":"Installa il sito Web demo di Contao","ui.setup.create-project.demoDescription":"Il sito Web demo ti aiuta a familiarizzare con Contao e tutte le sue funzionalità principali. Altri temi possono essere trovati in {store}.","ui.setup.create-project.coreOnly":"Installazione minima (solo core)","ui.setup.create-project.noUpdate":"Salta l\'installazione (soltanto per esperti!)","ui.setup.create-project.theme":"Contao Theme","ui.setup.create-project.themeInstall":"Per installare un tema Contao, utilizza l\'input di ricerca o carica un file del tema (.cto/.zip) che supporti l\'installazione tramite Contao Manager.","ui.setup.create-project.themeBuy":"Assicurati di visitare lo {store} ufficiale.","ui.setup.create-project.themeStore":"Contao Themes Store","ui.setup.create-project.themeUpload":"Upload theme file (.cto/.zip)","ui.setup.create-project.themeInvalid":"Il file caricato non è un tema Contao o non supporta Contao Manager.","ui.setup.create-project.themeWarning":"Contao Manager non è in grado di stabilire se questo tema è compatibile con il tuo server. Per eventuali domande, contatta il fornitore del tema.","ui.setup.create-project.themeTitle":"Esamina i dettagli del tema","ui.setup.create-project.themeDetails":"Con questo tema verranno installati le seguenti dipendenze e file.","ui.setup.create-project.themeRequire":"{count} Dipendenze | {count} Dipendenze","ui.setup.create-project.themeFiles":"{count} File | {count} Files","ui.setup.create-project.theme.or":"oppure cerca dei temi pubblici","ui.setup.create-project.theme.search":"Cerca un tema","ui.setup.create-project.theme.more":"Più temi","ui.setup.create-project.theme.empty":"Nessun tema corrispondente {query}","ui.setup.create-project.theme.uploaded":"Il file del tema è stato caricato correttamente.","ui.setup.create-project.theme.packageName":"Nome Package","ui.setup.create-project.theme.version":"Versione","ui.setup.create-project.theme.authors":"Autore/i","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"Installa","ui.setup.create-project.cancel":"Annulla","ui.setup.database-connection.headline":"Connessione al database","ui.setup.database-connection.description":"Contao richiede un database MySQL (o un fork compatibile come MariaDB) per memorizzare pagine, contenuti, utenti e altri dati relazionali. I parametri di connessione sono memorizzati nel file {env} nella radice del progetto dell\'installazione di Contao.","ui.setup.database-connection.formTitle":"Parametri connessione","ui.setup.database-connection.formText":"Immettere l\'URL di un database o compilare separatamente i campi nome utente, password, server e database.","ui.setup.database-connection.url":"URL Database","ui.setup.database-connection.validUrl":"URL Database non valido o connessione al server fallita.","ui.setup.database-connection.or":"oppure","ui.setup.database-connection.user":"Nome utente","ui.setup.database-connection.password":"Password","ui.setup.database-connection.server":"Server (:Port)","ui.setup.database-connection.database":"Nome del database","ui.setup.database-connection.connected":"Connessione riuscita al database {database} sul {server}.","ui.setup.database-connection.error":"Errore di connessione al database","ui.setup.database-connection.problem":"Contao ha rilevato un problema con il database server.","ui.setup.database-connection.schemaTitle":"Schema Database ","ui.setup.database-connection.migration":"C\'è una migrazione in sospeso. | Ci sono {count} migrazioni in sospeso.","ui.setup.database-connection.schema":"È presente un aggiornamento dello schema in sospeso. | Ci sono {count} aggiornamenti dello schema in sospeso.","ui.setup.database-connection.noChanges":"Lo schema del database è aggiornato.","ui.setup.database-connection.check":"Verifica il database","ui.setup.database-connection.skip":"Salta","ui.setup.database-connection.save":"Salva","ui.setup.database-connection.change":"Modifica le credenziali","ui.setup.database-connection.restoreTitle":"Importazione del database","ui.setup.database-connection.restoreText":"Il tema che hai appena installato contiene un backup del database. Ripristina il database per importare i dati del tema o salta questo passaggio per iniziare con un\'installazione vuota di Contao. | Il tema che hai appena installato contiene più backup di database. Seleziona un file di backup per importare i dati del tema o salta questo passaggio per iniziare con un\'installazione vuota di Contao.","ui.setup.database-connection.backup":"Eseguire il backup del database corrente prima dell\'importazione","ui.setup.database-connection.backupWarning":"Tutti i dati nel database verranno sovrascritti durante l\'importazione! Creare prima un backup se il database non è vuoto.","ui.setup.database-connection.restore":"Importa il database dei temi","ui.setup.database-connection.restoreOption":"Backup del {date} ({size})","ui.setup.database-connection.restored":"Il database del tuo tema è stato importato con successo. Continua con la convalida dello schema del database.","ui.setup.backend-user.success":"Nel tuo database è stato trovato un account amministratore per il back-end Contao. Usa il back-end Contao per aggiungere più utenti.","ui.setup.backend-user.error":"Impossibile recuperare l\'elenco degli utenti. Controlla l\'output della console per i dettagli.","ui.setup.backend-user.headline":"Utente di backend ","ui.setup.backend-user.description":"Per gestire il tuo sito web, devi avere almeno un account amministratore per il back-end di Contao. Tieni presente che questo account non è correlato a Contao Manager.","ui.setup.backend-user.formTitle":"Crea account","ui.setup.backend-user.formText":"Inserisci i dettagli per il nuovo account back-end.","ui.setup.backend-user.username":"Nome utente","ui.setup.backend-user.name":"Nome","ui.setup.backend-user.email":"Indirizzo e-mail","ui.setup.backend-user.emailInvalid":"Inserisci un indirizzo email valido","ui.setup.backend-user.password":"Password","ui.setup.backend-user.passwordPlaceholder":"min. 8 caratteri","ui.setup.backend-user.passwordLength":"Inserisci almeno 8 caratteri.","ui.setup.backend-user.create":"Aggiungi account","ui.task.headline":"Task in background ","ui.task.loading":"Caricamento dettagli…","ui.task.created":"Caricamento dettagli…","ui.task.active":"Attendere che Contao Manager esegua operazioni in background.","ui.task.complete":"Tutte le operazioni sono state completate correttamente. Controllare l\'output della console per i dettagli.","ui.task.paused":"Un\'operazione in background si è interrotta inaspettatamente. Controlla l\'output della console.","ui.task.aborting":"Attendi mentre le operazioni in background vengono annullate.","ui.task.stopped":"Alcune operazioni in background sono state annullate. Controlla l\'output della console.","ui.task.error":"Un\'operazione in background si è interrotta inaspettatamente. Controlla l\'output della console.","ui.task.failed":"Il Contao Manager non è riuscito ad avviare un\'attività in background!","ui.task.failedDescription1":"Qualcosa è andato storto durante il tentativo di eseguire operazioni in background.","ui.task.failedDescription2":"In questo caso, il tuo server potrebbe non essere supportato.","ui.task.reportProblem":"Segnala un problema","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud sponsorizzato da {sponsor}","ui.task.buttonAudit":"Aggiorna il database","ui.task.buttonClose":"Chiudi","ui.task.buttonConfirm":"Conferma e chiudi","ui.task.buttonContinue":"Continuare","ui.task.buttonCancel":"Annulla","ui.task.confirmCancel":"Sei sicuro di annullare questo compito? Questo potrebbe lasciare l\'installazione di Contao in uno stato danneggiato!","ui.task.autoclose":"Chiudi i dettagli dell\'attività in caso di successo","ui.console.toggle":"Visualizza/nasconde l\'uscita console","ui.console.showLog":"Mostra il registro completo della console","ui.console.copyLog":"Copia il registro negli appunti","ui.migrate.headline":"Aggiornamenti del database","ui.migrate.migrationsOnly":"(solo migrazioni)","ui.migrate.schemaOnly":"(solo schema)","ui.migrate.loading":"Attendi, stiamo controllando il database...","ui.migrate.empty":"Non è stato trovato nessuna migrazione in sospeso o aggiornamento dello schema. Il tuo database è aggiornato.","ui.migrate.emptyMigrations":"Non è stata trovata nessuna migrazione in sospeso. Controlla anche gli aggiornamenti dello schema.","ui.migrate.emptySchema":"Non è stato trovato nessun aggiornamento dello schema in sospeso. Assicurati di controllare anche le migrazioni.","ui.migrate.pending":"Il tuo database non è aggiornato. Si prega di rivedere l\'output della console di seguito ed eseguire le modifiche.","ui.migrate.previousChanges":"Una precedente migrazione del database non è stata confermata.\\nRivedi l\'output della console di seguito, quindi continua per vedere le modifiche successive.","ui.migrate.previousComplete":"Una precedente migrazione del database non è stata confermata, controlla l\'output della console di seguito.\\nNon ci sono più modifiche in sospeso.","ui.migrate.appliedChanges":"Database updates have been applied.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.appliedComplete":"Gli aggiornamenti del database sono stati applicati.\\nNon ci sono più migrazioni in sospeso o aggiornamenti dello schema. Il tuo database è aggiornato.","ui.migrate.problem":"Contao ha rilevato un problema con il database server.\\nSi prega di rivedere l\'output della console di seguito per scoprire cosa deve essere risolto. | Contao ha rilevato problemi con il database server.\\nSi prega di rivedere l\'output della console di seguito per scoprire cosa deve essere risolto.","ui.migrate.warning":"Contao ha rilevato una configurazione errata del database server.\\nGli avvisi possono essere ignorati temporaneamente, ma dovrebbero essere corretti per prestazioni e integrità dei dati ottimali.","ui.migrate.error":"Impossibile applicare le modifiche. Il tuo database potrebbe essere stato modificato, controlla di nuovo per riprovare.","ui.migrate.execute":"Esegui","ui.migrate.close":"Chiudi","ui.migrate.confirm":"Conferma e chiudi","ui.migrate.cancel":"Annulla","ui.migrate.continue":"Continuare","ui.migrate.setup":"Setup","ui.migrate.skip":"Salta","ui.migrate.retry":"Controlla nuovamente","ui.migrate.retryAll":"Seleziona tutto","ui.migrate.withDeletes":"Esegui tutte le modifiche al database comprese le query DROP.","ui.migrate.migrationTitle":"Migrazioni del database","ui.migrate.schemaTitle":"Aggiornamenti dello schema","ui.migrate.problemTitle":"Problemi al database","ui.migrate.warningTitle":"Avvisi sul database","ui.migrate.addTable":"Aggiungi tabella {table}","ui.migrate.dropTable":"Drop table {table}","ui.migrate.addField":"Aggiungi campo {table}.{field}","ui.migrate.changeField":"Cambia campo {table}.{field}","ui.migrate.dropField":"Elimina campo {table}.{field}","ui.migrate.createIndex":"Crea indice \\"{name}\\" in {table}","ui.migrate.dropIndex":"Drop index \\"{name}\\" in {table}","ui.widget.mandatory":"Questo campo non deve essere vuoto.","ui.widget.blankOption":"Selezionare ...","ui.widget.showPassword":"Mostra password","ui.widget.hidePassword":"Nascondi password","ui.error.title":"Richiesta HTTP per \\"{metodo} {url}\\" fallita.","ui.error.server500":"Sembra che si sia verificato un errore imprevisto sul server. Controllare i file di log del proprio server web (Apache/Nginx) e i log di Contao Manager in \\"contao-manager/logs\\".","ui.error.response":"Il server ha restituito una risposta con il codice di stato {status}.","ui.error.moreLink":"Maggiori informazioni","ui.error.support":"Supporto Contao ","ui.error.permission":"You do not have permission to use this feature.","ui.footer.help":"Supporto","ui.footer.reportProblem":"Segnala un problema","ui.navigation.discover":"Scopri","ui.navigation.packages":"Pacchetti","ui.navigation.tools":"Strumenti","ui.navigation.installTool":"Strumento di installazione","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Modalità Debug Contao","ui.navigation.logViewer":"Log Viewer","ui.navigation.phpinfo":"Informazioni PHP","ui.navigation.phpinfoLoading":"Caricamento informazioni PHP","ui.navigation.maintenance":"Manutenzione","ui.navigation.rebuildCache":"Ricostruisci la cache","ui.navigation.users":"Accounts","ui.navigation.systemCheck":"Verifica del sistema","ui.navigation.advanced":"Avanzato","ui.navigation.logout":"Logout","ui.maintenance.database.title":"Database Migrations e Backups","ui.maintenance.database.description":"Database migrations ensure consistent data and table schemas.","ui.maintenance.database.migrations":"Una migrazione del database in sospeso | {count} migrazioni database in sospeso","ui.maintenance.database.schemaUpdates":"Un aggiornamento dello schema in sospeso | {count} aggiornamenti dello schema in attesa","ui.maintenance.database.error":"È stato trovato problema con il database.","ui.maintenance.database.warning":"Sono stati trovati degli avvisi del database","ui.maintenance.database.button":"Verifica il database","ui.maintenance.database.migrationOnly":"Controlla solo le migrazioni","ui.maintenance.database.schemaOnly":"Controlla solo lo schema","ui.maintenance.database.installTool":"Apri l\'Install Tool","ui.maintenance.database.createBackup":"Creare il backup","ui.maintenance.database.backupUnsupported":"I backup del database non sono supportati dalla tua versione di Contao.","ui.maintenance.database.backupList":"Hai un backup del database, creato il {date}. | Hai {count} backup del database, l\'ultimo è stato creato il {date}.","ui.maintenance.database.backupEmpty":"Al momento non hai backup del database.","ui.maintenance.rebuildCache.title":"Cache applicazione ","ui.maintenance.rebuildCache.description":"La ricostruzione della cache dell\'applicazione è necessaria dopo aver modificato uno qualsiasi dei file di configurazione.","ui.maintenance.rebuildCache.rebuildProd":"Ricostruire la cache di produzione","ui.maintenance.rebuildCache.rebuildDev":"Ricostruire la cache di sviluppo","ui.maintenance.rebuildCache.clearProd":"Cancella cache di produzione","ui.maintenance.rebuildCache.clearDev":"Cancella cache di sviluppo","ui.maintenance.installTool.title":"Contao Install Tool","ui.maintenance.installTool.description":"Lo strumento di installazione Contao viene bloccato automaticamente se si immette una password errata per tre volte di seguito.","ui.maintenance.installTool.unlock":"Sblocca Install Tool","ui.maintenance.installTool.lock":"Blocca Install Tool","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"Il Composer autoloader è responsabile del caricamento della classe PHP. L\'autoloader deve essere scaricato solo dopo aver aggiunto i namespaces personalizzati nella root del composer.json.","ui.maintenance.dumpAutoload.button":"Dump Autoloader","ui.maintenance.composerInstall.title":"Dipendenze Composer","ui.maintenance.composerInstall.description":"Le dipendenze del Composer si trovano nella cartella {vendor} nella radice dell\'applicazione. La reinstallazione delle dipendenze può essere necessaria dopo la modifica o il caricamento manuale del file {composerLock}.","ui.maintenance.composerInstall.button":"Esegui Installer","ui.maintenance.composerInstall.update":"Esegui l\'aggiornamento Composer","ui.maintenance.composerCache.title":"Composer Cache","ui.maintenance.composerCache.description":"Composer mette in cache i pacchetti scaricati per migliorare le prestazioni. Se hai problemi con i file rotti, prova a cancellare la cache del Composer per forzare un nuovo download.","ui.maintenance.composerCache.button":"Cancella cache","ui.maintenance.maintenanceMode.title":"Modalità di manutenzione","ui.maintenance.maintenanceMode.description":"Mettendo Contao in modalità manutenzione, verrà visualizzato un modello \\"503 Service Unavailable\\" per il sito web.","ui.maintenance.maintenanceMode.enable":"Attiva","ui.maintenance.maintenanceMode.disable":"Disattiva","ui.maintenance.debugMode.title":"Debug Mode","ui.maintenance.debugMode.description":"Attiva la modalità debug impostando un utente e una password per il punto di ingresso {appDevPhp}.","ui.maintenance.debugMode.descriptionJwt":"Attiva la modalità debug impostando il cookie di debug per il dominio corrente.","ui.maintenance.debugMode.activate":"Attivare","ui.maintenance.debugMode.deactivate":"Disattiva","ui.maintenance.debugMode.credentials":"Credenziali","ui.maintenance.debugMode.user":"Inserisci un nome utente per la modalità di debug.","ui.maintenance.debugMode.password":"Inserisci una password per la modalità di debug.","ui.maintenance.opcodeCache.title":"Cache Opcode","ui.maintenance.opcodeCache.description":"Opcode mette in cache i file PHP sul processo web per un\'esecuzione più veloce. Deve essere cancellato in determinate circostanze se i file non vengono riconosciuti dopo la modifica.","ui.maintenance.opcodeCache.button":"Troncare la cache","ui.maintenance.safeMode":"Non disponibile in modalità Safe Mode","ui.maintenance.unsupported":"Non supportato dalla tua versione di Contao","ui.packages.updateButton":"Aggiorna pacchetti","ui.packages.searchButton":"Cerca pacchetti","ui.packages.searchPlaceholder":"Cerca pacchetti...","ui.packages.uploadOverlay":"Drag & drop files per caricarli","ui.packages.uploadButton":"Carica pacchetti","ui.packages.uploadMessage":"Hai una modifica non confermata. | Hai {count} modifiche non confermate.","ui.packages.uploadApply":"Conferma uploads","ui.packages.uploadReset":"Elimina Uploads","ui.packages.uploadIncomplete":"Questo file non è stato caricato completamente. Rimuovilo e riprova.","ui.packages.uploadDuplicate":"Questo file sembra essere caricato più volte. Rimuovi i duplicati.","ui.packages.uploadInstalled":"Questo file è già installato. Rimuovi i duplicati.","ui.packages.uploadUnsupported":"I caricamenti non sono supportati nella tua installazione. Assicurati che l\'estensione PHP ZIP sia installata e aggiorna le dipendenze.","ui.packages.changesMessage":"Hai una modifica non confermata. | Hai {count} modifiche non confermate.","ui.packages.changesDryrun":"Esecuzione a prova","ui.packages.changesApply":"Applicare le modifiche","ui.packages.changesApplyAll":"Aggiornare tutti i pacchetti","ui.packages.changesDryrunAll":"Esecuzione a prova di tutti i pacchetti","ui.packages.changesReset":"Ripristina modifiche","ui.packages.changesReview":"Revisione dei cambiamenti","ui.packagelist.loading":"Caricamento in corso ...","ui.packagelist.uploads":"Uploads","ui.packagelist.added":"Pacchetti nuovi","ui.packagelist.installed":"Pacchetti installati","ui.package.hintRevert":"Ripristina le modifiche","ui.package.hintNoupdate":"Non aggiornare","ui.package.hintConstraint":"Questo pacchetto sarà installato con vincolo {constraint} quando si applicano le modifiche.","ui.package.hintConstraintBest":"Questo pacchetto sarà installato nella migliore versione disponibile quando si applicano le modifiche.","ui.package.hintConstraintChange":"Il vincolo per questo pacchetto sarà cambiato da \\"{from}\\" a \\"{to}\\" quando si applicano le modifiche.","ui.package.hintConstraintUpdate":"Questo pacchetto sarà aggiornato quando si applicano le modifiche.","ui.package.hintAdded":"Questo pacchetto sarà aggiornato quando si applicano le modifiche.","ui.package.hintRemoved":"Questo pacchetto verrà rimosso quando si applicano le modifiche. ","ui.package.requiredTitle":"aggiunto manualmente","ui.package.requiredText":"Questo pacchetto è richiesto nel tuo composer.json ma non è installato.","ui.package.removedTitle":"rimosso manualmente","ui.package.removedText":"Questo pacchetto è stato rimosso dal tuo composer.json.","ui.package.installed":"Attualmente installato:","ui.package.version":"Versione {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Stella | {count} Stelle","ui.package.editConstraint":"Modifica","ui.package.uploadConstraint":"Questo vincolo è definito dal pacchetto caricato.","ui.package.updateButton":"Aggiorna","ui.package.removeButton":"Rimuovi","ui.package.installButton":"Aggiungi pacchetto","ui.package.installButtonShort":"Aggiungi","ui.package.detailsButton":"Dettagli","ui.package.latestConstraint":"ultima versione","ui.package.update":"Aggiornamento disponibile","ui.package.updateLatest":"ultima versione","ui.package.updateAvailable":"{versione} disponibile","ui.package.updateUnknown":"versione sconosciuta","ui.package.updateConstraint":"È disponibile una versione più recente al di fuori del vincolo di versione.","ui.package.incompatible":"{package} does not work with Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Versione {version}","ui.cloudStatus.waitingTime":"Tempo di attesa","ui.cloudStatus.jobs":"Lavori correnti","ui.cloudStatus.workers":"Lavoratori","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"nessuna","ui.cloudStatus.short":"circa {minutes} min","ui.cloudStatus.long":"circa {minutes} min {seconds} sec","ui.cloudStatus.error":"Impossibile ottenere lo stato del Composer Resolver Cloud. Potrebbe essere inattivo per problemi di manutenzione o di esercizio.","ui.cloudStatus.button":"Stato Cloud","ui.cloudStatus.refresh":"Aggiorna lo stato del cloud","ui.log-viewer.loading":"Caricamento in corso ...","ui.log-viewer.empty":"Non ci sono file di registro sul tuo server.","ui.log-viewer.reload":"Ricarica","ui.log-viewer.file":"Log file","ui.log-viewer.channel":"Canale","ui.log-viewer.channelTitle":"Il canale su cui è stato registrato questo messaggio.","ui.log-viewer.level":"Livello","ui.log-viewer.levelTitle":"Gravità del messaggio di log.","ui.log-viewer.timeHeader":"Tempo","ui.log-viewer.messageHeader":"Messaggio","ui.log-viewer.showContext":"Mostra contesto","ui.log-viewer.hideContext":"Nascondi contesto","ui.log-viewer.showExtra":"Mostra extra","ui.log-viewer.hideExtra":"Nascondi extra","ui.log-viewer.more":"Carica di più…","ui.log-viewer.download":"Download","ui.log-viewer.downloadTitle":"Download file \\"{file}\\"","ui.log-viewer.prodEnvironment":"Ambiente di produzione","ui.log-viewer.devEnvironment":"Ambiente di sviluppo (Modalità Debug)","ui.user-manager.loading":"Loading users …","ui.user-manager.changePassword":"Change Password","ui.user-manager.setupTotp":"Setup Two-Factor Authentication","ui.user-manager.disableTotp":"Disable Two-Factor Authentication","ui.user-manager.invite":"Invite User","ui.user-manager.delete":"Delete","ui.user-manager.deleteConfirm":"Do you really want to delete user \\"{username}\\"?","ui.user-manager.deleted":"User {username} deleted successfully","ui.user-manager.passwordHeadline":"Change Password","ui.user-manager.passwordText":"To change your password, please enter the current and a new password in the respective fields.","ui.user-manager.currentPassword":"Current password","ui.user-manager.newPassword":"New password","ui.user-manager.passwordPlaceholder":"min. 8 caratteri","ui.user-manager.submitPassword":"Submit","ui.user-manager.passwordChanged":"Your password has been changed successfully.","ui.user-manager.passwordError":"This password is incorrect.","ui.user-manager.inviteHeadline":"Invite User","ui.user-manager.inviteText":"If you need multiple logins for the Contao Manager, you can create an invitation link here. Share this link with someone or use it on another device to create a new account with the given permissions.","ui.user-manager.inviteSuccess1":"A new invitation link was created. The URL below can be used to create a new user account for this Contao Manager. The invitation expires on {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Please copy the link to your clipboard. It will only work once and you will not be able to see it again after closing this dialog.","ui.user-manager.createInvitation":"Create Invitation Link","ui.user-manager.clipboard":"Copy to clipboard","ui.user-manager.permissions":"Learn about permissions","ui.user-manager.cancel":"Annulla","ui.user-manager.close":"Chiudi","ui.user-manager.you":"You","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Two-Factor Authentication","ui.totp.setupQr":"Please scan the QR code with your 2FA/TOTP app.","ui.totp.setupCode":"If you cannot scan the QR code, enter this key instead:","ui.totp.codeLabel":"Verification code","ui.totp.codeDescription":"Please enter the verification code generated by your 2FA/TOTP app.","ui.totp.disableText":"Please enter the verification code to disable two-factor authentication.","ui.totp.invalid":"The verification code is invalid.","ui.totp.enable":"Attiva","ui.totp.disable":"Disattiva","ui.totp.cancel":"Annulla","ui.totp.enabled":"Two-factor authentication was enabled successfully.","ui.totp.disabled":"Two-factor authentication was disabled successfully.","ui.totp.setup":"Setup Two-Factor Authentication","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[120],{8120:function(e){e.exports=JSON.parse('{"ui.app.title":"Extensions Contao","ui.app.loading":"Chargement de la liste des extensions…","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Publicité dans la liste des extensions","ui.discover.loading":"Chargement…","ui.discover.offline":"Impossible de récupérer des résultats.","ui.discover.offlineExplain":"Vérifiez votre connexion Internet et désactivez les bloqueurs JavaScript dans votre navigateur.","ui.discover.offlineButton":"Réessayer","ui.discover.searchPlaceholder":"Search in {count} extensions …","ui.discover.empty":"Pas de résultats pour {query}","ui.discover.more":"Plus de résulats","ui.discover.sortBy":"Trier par","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"Mis à jour","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"Téléchargements","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"Note","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"Détails","ui.discover.latestPackages":"Extensions les plus récentes et mises à jour","ui.discover.faversPackages":"Extensions les mieux notées","ui.discover.downloadsPackages":"Extensions les plus téléchargées","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Site web du projet","ui.package.private":"Package privé","ui.package.privateTitle":"Les packages privés ne sont disponibles que chez le fournisseur (par exemple sous forme de téléchargement ZIP). Veuillez visiter le site Web pour plus d\'informations","ui.package.abandoned":"abandonné","ui.package.abandonedText":"Ce package est abandonné et n\'est plus maintenu.","ui.package.abandonedReplace":"Ce package est abandonné et n\'est plus maintenu. L\'auteur suggère d\'utiliser le package {replacement} à la place.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"Extension précédente","ui.package-details.close":"Fermer les détails","ui.package-details.loading":"Chargement…","ui.package-details.tabDescription":"Description","ui.package-details.tabRequire":"Prérequis","ui.package-details.tabFeatures":"Fonctionnalités","ui.package-details.tabSuggest":"Suggestions","ui.package-details.tabConflict":"Conflits","ui.package-details.tabDependents":"Dépendants","ui.package-details.linkRequires":"nécessite","ui.package-details.linkReplaces":"remplaces","ui.package-details.linkProvides":"fournis","ui.package-details.linkConflicts":"conflits","ui.package-details.funding":"Fund package maintenance!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"Dernière version","ui.package-details.released":"Publié le","ui.package-details.license":"License(s)","ui.package-details.authors":"de","ui.package-details.more":"Plus","ui.package-details.packagist":"Détails du Package","ui.package-details.metadata":"Editer les Metadata","ui.package-details.support_docs":"Documentation","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Support","ui.package-details.support_issues":"Issues / Bug Report","ui.package-details.support_source":"Code source","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Support E-Mail","ui.package-details.support_rss":"RSS Feed"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[540],{4540:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! NezabezpeÄené pÅ™ipojení !!","ui.app.httpsDescription":"Bez HTTPS budou citlivá data pÅ™enášena nezabezpeÄenÄ›.","ui.app.httpsLink":"Více informací","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Je zapnutý bezpeÄnostní režim !!","ui.app.safeModeDescription":"NÄ›které funkce nejsou k dispozici ve Správci Contaa.","ui.app.safeModeExit":"UkonÄit bezpeÄnostní režim","ui.app.limitedHeadline":"Smazat autorizaci","ui.app.limitedDescription":"Máte omezená přístupová práva kvůli pÅ™ihlášení bez hesla.","ui.app.limitedLogout":"OpÄ›tovné ověření","ui.app.totpHeadline":"BezpeÄnostní poznámka","ui.app.totpDescription":"Nastavte si dvoufaktorové ověření pro vyšší zabezpeÄení vaÅ¡eho úÄtu. ","ui.app.totpSetup":"Nastavení","ui.app.loading":"Nahrávání Správce Contaa","ui.app.apiError":"NeÄekaný status API","ui.app.configSecurity1":"BEZPEÄŒNOSTNà UPOZORNÄšNÃ!!! Byla objevená nechránÄ›ná konfiguraÄní složka ","ui.app.configSecurity2":"Správce Contaa zjistil, že jsou veÅ™ejnÄ› dostupné jeho konfiguraÄní soubory. VÅ¡echny operace byly pozastavené, dokud nebude daná složka chránÄ›ná, jinak může dojít k útoku na choulostivá data Vaší instalace.\\n\\nPro opravení této potíže zajistÄ›te omezený přístup ke složce \\"contao-manager\\" na VaÅ¡em serveru. Jak to lze provést, se dozvíte od VaÅ¡eho hostingového poskytovatele nebo v příruÄce ke správÄ› serveru.","ui.account.welcome":"Vítejte","ui.account.intro1":"Vítejte ve Správci Contaa, univerzálním nástroji k instalaci a správÄ› Contaa Open Source CMS. Pokud jste tu poprvé, pÅ™eÄtÄ›te si prosím návod {readTheManualToGetStarted}.","ui.account.introGetStarted":"ZaÄínáme {readTheManual}.","ui.account.introManual":"pÅ™eÄíst návod","ui.account.intro2":"Pokud si vÅ¡imnete jakýchkoli nesrovnalostí, podívejte se na seznam nahlášených chyb {ourGithubIssues}  a případnÄ› nahlaste novou, kterou jeÅ¡tÄ› nikdo nenahlásil. ","ui.account.introIssues":"Chyby na GitHubu","ui.account.headline":"Uživatelský úÄet","ui.account.description":"Abyste mohli spravovat instalaci, vytvoÅ™te prosím uživatelský úÄet. UvÄ›domte si prosím, že tento úÄet není stejný pro pÅ™ihlášení do Contaa. ","ui.account.username":"Uživatelské jméno","ui.account.password":"Heslo","ui.account.passwordPlaceholder":"min. 8 znaků","ui.account.passwordLength":"Zadejte prosím nejménÄ› 8 znaků.","ui.account.loginInvalid":"DoÅ¡lo k chybÄ› pÅ™i vytváření úÄtu. Zkuste jiné úživatelské jméno. ","ui.account.submit":"VytvoÅ™it úÄet","ui.account.usePassword":"Použít heslo pro příhlášení","ui.account.usePasskey":"Použít passkey pro pÅ™ihlášení","ui.account.totpHeadline":"Dvoufaktorové ověření","ui.account.totpDescription":"Aktivujte prosím dvoufaktorové ověření, které pÅ™idá vaÅ¡emu uživatelskému úÄtu další bezpeÄnostní úroveň. To znamená, že budete muset navíc zadat ověřovací kód generovaný dvoufaktorovými aplikacemi jako 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator nebo jakoukoli jinou TOTP aplilkací.","ui.account.totpSetup":"Nastavit nyní","ui.account.totpSkip":"Nastavit pozdÄ›ji","ui.account.login":"Odmítnout pozvání","ui.account.contribute1":"Contao a Správce Contaa je podporovaný neziskovou Contao Association.","ui.account.contribute2":"Prosím zvažte, zda se chcete stát Älenem a spolupracovníkem tohoto open source projektu {becomingAMember}.","ui.account.contributeDonate":"Staňte se dárcem","ui.login.headline":"PÅ™ihlásit se","ui.login.description":"PÅ™ihlaste se, abyste mohli spravovat VaÅ¡i instalaci.","ui.login.username":"Uživatelské jméno","ui.login.password":"Heslo","ui.login.totpHeadline":"Dvoufaktorové ověření","ui.login.totpDescription":"Zadejte prosím doufaktorový kód, abyste dokonÄili pÅ™ihlášení.","ui.login.totp":"Ověřovací kód","ui.login.forgotPassword":"ZapomnÄ›li jste heslo?","ui.login.button":"PÅ™ihlásit se","ui.login.passkey":"PÅ™ihlásit se pomocí passkey","ui.login.cancel":"ZruÅ¡it","ui.login.or":"nebo","ui.login.locked":"Přístup byl zamítnut, protože je Správce Contaa uzamÄen. Pro odemknutí smažte soubor {lockFile} na VaÅ¡em serveru v koÅ™enové složce Contaa.","ui.logout.headline":"VyprÅ¡ení sezení","ui.logout.warning":"Byli jste neaktivní po dobu 25 minut. Z bezpeÄnostních důvodů bude VaÅ¡e sezení zakrátko ukonÄené. ","ui.logout.expired":"VaÅ¡e sezení bylo automaticky ukonÄeno, protože jste byli neaktivní více než 30 minut.","ui.logout.renew":"Zůstat pÅ™ihlášený/á","ui.logout.logout":"Odhlásit","ui.logout.login":"Zpátky k pÅ™ihlášení","ui.oauth.error":"Neplatný pokus o ověření totožnosti. Zkontrolujte požadované parametry.","ui.oauth.https":"PÅ™eposílací URL musí používat zabezpeÄený protokol (https), aby nedoÅ¡lo k pÅ™enosu autorizaÄního kódu v Äirém textu.","ui.oauth.headline":"Smazat autorizaci","ui.oauth.description":"Následující aplikace nebo servis požadují vzdálený přístup k VaÅ¡emu Správci Contaa. ","ui.oauth.domain":"JeÅ¡tÄ› než povolíte přístup, ujistÄ›te se, že znáte tuto URL a důvěřujete jejímu majiteli!","ui.oauth.outOfScope":"Bohužel nemáte potÅ™ebné pÅ™ihlaÅ¡ovací práva, abyste se mohl(a) pÅ™ihlásit.","ui.oauth.allow":"Povolit přístup","ui.oauth.deny":"Odmítnout přístup","ui.oauth.switchUser":"PÅ™ejít na jiného uživatele","ui.scope.admin":"Přístup správce vÄetnÄ› správy uživatelů","ui.scope.install":"Nainstalovat nové balíÄky a zmÄ›nit konfiguraci Contaa","ui.scope.update":"Aktualizovat balíÄky a provést úkoly údržby","ui.scope.read":"NaÄíst balíÄky a nastavení","ui.boot.headline":"Kontrola systému","ui.boot.description":"Prosím poÄkejte, analyzujeme Váš server...","ui.boot.issue1":"Byly zjiÅ¡tÄ›ny chyby","ui.boot.issue2":"VaÅ¡e instalace obsahuje nÄ›kolik chyb a je ji tÅ™eba opravit, než se bude moct použít Správce Contaa.","ui.boot.run":"Spustit Správce Contaa","ui.boot.safeMode":"Spustit v BezpeÄnostním módu","ui.recovery.headline":"Záchrana systému","ui.recovery.description":"Správce Contaa naÅ¡el soubory, které vypadají jako soubory Contaa, ale Příkazový řádek nepracuje tak, jak by mÄ›l.","ui.recovery.console":"Výstup konzoly","ui.recovery.repairOptions":"Vyberte prosím jednu z možností pro zotavení Vaší instalace.","ui.recovery.repairHeadline":"Automatická oprava","ui.recovery.repairDescription":"Bude provedené automatické opravení instalace tím, že se pÅ™estaví meziúložiÅ¡tÄ› a pÅ™einstalují se balíÄky závislé na Composeru.","ui.recovery.repairWarning":"VeÅ¡keré úpravy provedené na souborech ve složce vendor budou ztraceny!","ui.recovery.repairFailed":"Automatická oprava neprobÄ›hla úspěšnÄ›. Pro opravení instalace se pokuste se použít BezpeÄnostní mód.","ui.recovery.repairButton":"Spustit opravu systému","ui.recovery.safeModeHeadline":"BezpeÄnostní mód","ui.recovery.safeModeDescription":"SpuÅ¡tÄ›ním Správce Contaa v BezpeÄnostním módu lze spravovat balíÄky a spouÅ¡tÄ›t základní příkazy/úlohy, nejsou ovÅ¡em dostupné funkce závislé na instalaci Contaa.","ui.recovery.safeModeButton":"Spustit v BezpeÄnostním módu","ui.server.pending":"ÄŒekám…","ui.server.running":"Analyzování…","ui.server.error":"Kontrola selhala kvůli neoÄekávané odezvÄ› ze strany serveru.","ui.server.details":"Podrobnosti","ui.server.prerequisite":"Kontrola zruÅ¡ena kvůli chybÄ›jící podmínce.","ui.server.selfUpdate.title":"Aktualizace Správce Contaa","ui.server.selfUpdate.update":"Je k dispozici nová verze Správce Contaa {latest}.","ui.server.selfUpdate.manualUpdate":"Je dostupná nová verze Správce Contaa {latest}. Váš server nepodporuje automatické instalace. StáhnÄ›te si proto prosím novou verzi {download}.","ui.server.selfUpdate.latest":"Používáte poslední verzi {current}.","ui.server.selfUpdate.dev":"Vývojové verze nepodporují automatické aktualizace.","ui.server.selfUpdate.unsupported":"Je dostupná novÄ›jší verze, ale ta nepodporuje VaÅ¡i verzi PHP.","ui.server.selfUpdate.button":"Spustit automatické aktualizace","ui.server.selfUpdate.continue":"PokraÄovat","ui.server.config.title":"Nastavení serveru","ui.server.config.setup":"Nastavit","ui.server.config.change":"ZmÄ›nit","ui.server.config.save":"Uložit","ui.server.config.cancel":"ZruÅ¡it","ui.server.config.customOption":"Jíné…","ui.server.config.description":"Pro správný bÄ›h úloh na pozadí potÅ™ebuje Správce Contaa vÄ›dÄ›t, kde může najít binární příkazový řádek PHP a jak spouÅ¡tÄ›t příkazy oddÄ›lenÄ› od webové stránky. ","ui.server.config.formTitle":"Nastavení serveru","ui.server.config.formText":"Zadejte prosím cestu k binární PHP. UjistÄ›te se, že je binární soubor stejný jako Vámi používaná verze PHP. ","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud umožňuje nainstalovat na Composeru závislých rozšířeních, i když Váš server nemá dostatek pamÄ›ti. MÄ›jte na pamÄ›ti, že informaci o VaÅ¡i balíÄcích budou odeslané na cloudový server vlastnÄ›ný Asociací Contaa.","ui.server.config.cloud":"Použít Composer Resolver Cloud","ui.server.config.cli":"Binární PHP","ui.server.config.stateErrorCli":"Na VaÅ¡em serveru nebyla nalezena žádná platná binární PHP.","ui.server.config.stateErrorCloud":"Composer Resolver Cloud není podporován.","ui.server.config.stateSuccess":"Binární PHP na {php_cli}.","ui.server.php_web.title":"Webový proces PHP","ui.server.php_web.below7":"Byla nalezena následující verze PHP {version}. Prosím pÅ™ejdÄ›te co nejdříve na PHP 7. ","ui.server.php_web.success":"Byla nalezena následující verze PHP {version}, nejsou známé žádné chyby.","ui.server.php_cli.title":"Rozhraní příkazového řádku PHP","ui.server.php_cli.success":"Byla nalezena následující verze PHP {version}, nejsou známé žádné chyby.","ui.server.composer.title":"ProstÅ™edí Composeru","ui.server.composer.success":"Nebyly nalezeny žádné chyby.","ui.server.composer.install":"VÄ›ci závislé na Composorovi nejsou nainstalované.","ui.server.composer.button":"Nainstalovat","ui.server.contao.title":"Instalace Contaa","ui.server.contao.setup":"Nastavení","ui.server.contao.check":"Zkontrolovat databázi","ui.server.contao.empty":"Nebyla nalezena žádná instalace Contaa.","ui.server.contao.old":"Verze Contaa {version} není kompatabilní se Správcem Contaa. Zaktualizujte prosím VaÅ¡i instalaci manuálnÄ›.","ui.server.contao.found":"Nalezeno Contao {version} (verze API {api})","ui.server.contao.connectionError":"NepodaÅ™ilo se pÅ™ipojit k serveru databáze.","ui.server.contao.connectionProblem":"Nalezen problém s databází.","ui.server.contao.missingUser":"Nebyl nalezen žádný administraÄní úÄet.","ui.setup.continue":"PokraÄovat","ui.setup.manager":"Spustit Správce Contaa","ui.setup.cancel":"ZruÅ¡it","ui.setup.welcome":"Vítejte","ui.setup.welcome1":"Tento průvodce Vás provede důležitými kroky pro nastavení instalace CMS Contao.","ui.setup.welcome2":"Pokud máte jakýkoli dotaz, prohlédnÄ›te si prosím dokumentaci, fóra, kanál Slacku nebo se obraÅ¥te na stránku {podpory}.  ","ui.setup.support":"podpora komunity","ui.setup.start":"ZaÄít","ui.setup.complete":"BlahopÅ™ejeme!","ui.setup.complete1":"Úspěšně byla nainstalována {version} Contaa.","ui.setup.complete2":"Pro ukonÄení tohoto procesu otevÅ™ete prosím instalaÄní nástroj, abyste nastavili pÅ™ipojení k databázi a vytvoÅ™ili úÄet administrátora.","ui.setup.complete3":"Nyní můžete zaÄít vytvářet VaÅ¡i webovou stránku v backendu Contaa. PotÅ™ebujete-li dodateÄná rozšíření, vraÅ¥te se do Správce Contaa.","ui.setup.installTool":"Otevřít instalaÄní nástroj","ui.setup.login":"PÅ™ihlásit se do Contaa","ui.setup.funding":"Volný software je \\"volný\\" jako \\"volný projev\\", ale ne jako \\"pivo zdarma\\". Open source projekt jako Contaa vyžaduje Å™adu penÄ›z a nedá se ho uskuteÄnit bez jediné osoby nebo firmy. \\nPokud máte vytvoÅ™enou webovou stránku pomocí Contaa nebo je prodáváte, potěšilo by nás, kdybyste nás finanÄnÄ› podpoÅ™ili pomÄ›rnÄ› k VaÅ¡emu obchodu.","ui.setup.fundingLink":"DozvÄ›dÄ›t se víc","ui.setup.document-root.headline":"Nastavení webového serveru","ui.setup.document-root.warning":"Abyste mohli nainstalovat Contao prostÅ™ednictvím Správce Contaa, musíte opravit koÅ™enový dokument na webovém serveru.","ui.setup.document-root.description1":"Contao používá zvláštní složku pro veÅ™ejné soubory. AplikaÄní soubory jsou nainstalované v rodiÄovské složce. Contao právÄ› nelze nainstalovat, protože VaÅ¡e složková struktura není správná nebo složky nejsou prázdné.","ui.setup.document-root.description2":"Pokud nevíte, jak nastavit koÅ™enový dokument, pÅ™eÄtÄ›te si prosím dokumentaci Contaa nebo se obraÅ¥te na svého poskytovatele webových služeb.","ui.setup.document-root.documentation":"PÅ™eÄíst si dokumentaci","ui.setup.document-root.conflictsTitle":"InstalaÄní složka není prázdná","ui.setup.document-root.conflictsDirectory":"KoÅ™enová složka Vaší budoucí instalace Contaa není prázdná. NaÅ¡li jsem následující poÄet souborů {count}, které se musí pÅ™epsat bÄ›hem instalace. DoporuÄujeme vytvoÅ™it prázdnou složku pro instalaci Contaa, nebo můžete také smazat veÅ¡keré vÄ›ci, které se právÄ› nachází ve vybrané složce, pokud jste si jistí, že je již nepotÅ™ebujete. ","ui.setup.document-root.ignoreConflicts":"Chci nainstalova Contao do nevyprázdÄ›né složky. Souhlasím s tím, že budou dané soubory pÅ™epsány. ","ui.setup.document-root.check":"Znovu zkontrolovat","ui.setup.document-root.create":"VytvoÅ™it složky","ui.setup.document-root.change":"ZmÄ›nit složky","ui.setup.document-root.formTitle":"Nastavení adresáře","ui.setup.document-root.formText1":"Správce Contaa může automaticky vytvoÅ™it novou adresářovou strukturu na tomto webovém serveru.","ui.setup.document-root.formText2":"Budete muset nastavit nový koÅ™enový dokument (napÅ™. pomocí správního panelu ve VaÅ¡em úÄtu webových služeb).","ui.setup.document-root.autoconfig":"Rozumím tomu, že musím zmÄ›nit nastavení serveru. Pokud se tak nestane, může dojít k poruÅ¡e Správce Contaa a poniÄení souborů nastavení (vÄetnÄ› podrobností k úÄtu a heslu)!","ui.setup.document-root.directory":"Nový adresář","ui.setup.document-root.currentRoot":"SouÄasný koÅ™enový dokument","ui.setup.document-root.newRoot":"Nový koÅ™enový dokument","ui.setup.document-root.finish":"Nastavení adresářů","ui.setup.document-root.publicDir":"Použijte {dir} pro veÅ™ejné soubory (pro Contao {version})","ui.setup.document-root.directoryInvalid":"Zadejte prosím platný název adresáře","ui.setup.document-root.directoryExists":"Cílový adresář již existuje. Zadejte prosím jiný název.","ui.setup.document-root.confirmation":"Správce Contaa úspěšnÄ› vytvoÅ™il potÅ™ebný adresář pro instalaci Contaa. Nyní musíte nastavit koÅ™enový dokument na svém webovém serveru. NenaÄítejte tuto stránku do té doby.","ui.setup.document-root.reload":"NaÄíst stránku znovu","ui.setup.document-root.success":"Struktura složek je nastavená na VaÅ¡em serveru správnÄ›!","ui.setup.document-root.installingProjectDir":"AplikaÄní soubory se nainstalují do {dir}.","ui.setup.document-root.installingPublicDir":"VeÅ™ejné soubory se nainstalují do {dir}.","ui.setup.document-root.installedProjectDir":"AplikaÄní soubory jsou nainstalované v {dir}.","ui.setup.document-root.installedPublicDir":"VeÅ™ejné soubory jsou nainstalované v {dir}.","ui.setup.create-project.headline":"Instalace Contaa","ui.setup.create-project.description":"Vývoj Contaa se drží principů {semver}, nová menší verze vychází každých Å¡est mÄ›síců. SouÄasná verze, která se udržuje, je:","ui.setup.create-project.semver":"Sémantické Äíslování verzí","ui.setup.create-project.latestTitle":"Poslední","ui.setup.create-project.ltsTitle":"NÄ›kolikaletá podpora - Long Term Support","ui.setup.create-project.latestQ1":"NaÅ¡e poslední verze nabízí nejnovÄ›jší funkce s podporou do února {year}.","ui.setup.create-project.latestQ3":"NaÅ¡e poslední verze nabízí nejnovÄ›jší funkce s podporou do srpna {year}.","ui.setup.create-project.ltsText":"NaÅ¡e souÄasná verze LTS, chcete-li se zaměřit na stabilitu. Nabízí dlouhodobou podporu do února {year}.","ui.setup.create-project.pltsText":"NaÅ¡e pÅ™edeÅ¡lá verze LTS má podporu do února {year}.","ui.setup.create-project.requiresPHP":"Vyžaduje pÅ™inejmenším PHP {version}, používáte PHP {current}.","ui.setup.create-project.releaseplan":"Více informací: {contaoReleasePlan} ","ui.setup.create-project.releaseplanLink":"Plán vydávání nových verzí Contaa","ui.setup.create-project.installed":"Contao {version} je úspěšnÄ› nainstalována na vaÅ¡em serveru. PokraÄujte, abyste nastavili vaÅ¡i databázi nebo spustili Správce Contaa pro nainstalování jiné verze.","ui.setup.create-project.formTitle":"Vyberte distribuci","ui.setup.create-project.formText":"Vyberte prosím verzi, kterou chcete nainstalovat.","ui.setup.create-project.version":"Verze","ui.setup.create-project.demo":"Nainstalovat demoverzi Contaa","ui.setup.create-project.demoDescription":"Demoverze vám pomůže se seznámit s Contaa a pochopit jeho základní fukce. Více pÅ™edloh můžete najít v {store}.","ui.setup.create-project.coreOnly":"Minimální instalace (pouze jádro)","ui.setup.create-project.noUpdate":"PÅ™eskoÄit instalaci (pouze pro pokroÄilé!)","ui.setup.create-project.theme":"PÅ™edloha Contaa","ui.setup.create-project.themeInstall":"Abyste nainstalovali pÅ™edlohu Contaa, použijte vyhledávací políÄko nebo naÄtete soubor (.cto/.zip), který podporuje instalace pomocí Správce Contaa.","ui.setup.create-project.themeBuy":"Podívejte se na další pÅ™edlohy v obchodÄ› {store}.","ui.setup.create-project.themeStore":"Obchod pÅ™edloh Contaa","ui.setup.create-project.themeUpload":"NaÄíst soubor pÅ™edlohy (.cto/.zip)","ui.setup.create-project.themeInvalid":"NaÄtený soubor není pÅ™edloha Contaa nebo ho Správce Contaa nepodporuje.","ui.setup.create-project.themeWarning":"Správce Contaa nemůže říct, jestli je tato pÅ™edloha kompatibilní s vaším serverem. Podívejte se prosím na informace pÅ™edlohy pro získání dalších informací.","ui.setup.create-project.themeTitle":"Podívat se na hodnocení pÅ™edlohy","ui.setup.create-project.themeDetails":"Následující závislosti a soubory se nainstalují spolu s vybranou pÅ™edlohou.","ui.setup.create-project.themeRequire":"{count} závilostí | {count} závislostí","ui.setup.create-project.themeFiles":"{count} soubor | {count} souborů","ui.setup.create-project.theme.or":"nebo prohledejte veÅ™ejnÄ› dostupné pÅ™edlohy","ui.setup.create-project.theme.search":"Prohledat pÅ™edlohy","ui.setup.create-project.theme.more":"Více pÅ™edloh","ui.setup.create-project.theme.empty":"Nenalezeny žádné pÅ™edlohy pro {query}","ui.setup.create-project.theme.uploaded":"Soubory pÅ™edlohy byly úspěšnÄ› nahrány.","ui.setup.create-project.theme.packageName":"Název balíÄku","ui.setup.create-project.theme.version":"Verze","ui.setup.create-project.theme.authors":"Autor/AutoÅ™i","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"Nainstalovat","ui.setup.create-project.cancel":"ZruÅ¡it","ui.setup.database-connection.headline":"PÅ™ipojení k databázi","ui.setup.database-connection.description":"Contao vyžaduje pÅ™inejmenším jednu databázi MySQL (nebo kompatibilní druh jako MariaDB) pro ukládání stránek, obsahu, uživatelů a přísluÅ¡ných dat. PÅ™ihlaÅ¡ovací údaje jsou uložené v souboru {env} v koÅ™enové složce instalace Contaa.","ui.setup.database-connection.formTitle":"PÅ™ipojovací údaje","ui.setup.database-connection.formText":"Zadejte prosím cestu k databázi nebo vyplňte zvlášť uživatelské jméno, heslo, server a pole databáze.","ui.setup.database-connection.url":"Cesta k databázi","ui.setup.database-connection.validUrl":"Cesta k databázi je neplatná nebo selhalo spojit se se serverem.","ui.setup.database-connection.or":"nebo","ui.setup.database-connection.user":"Uživatelské jméno","ui.setup.database-connection.password":"Heslo","ui.setup.database-connection.server":"Server (:Port)","ui.setup.database-connection.database":"Jméno databáze","ui.setup.database-connection.connected":"DoÅ¡lo k úspěšnému pÅ™ipojení k {database} na {server}.","ui.setup.database-connection.error":"PÅ™i pÅ™ipojení k databázi doÅ¡lo k chybÄ›.","ui.setup.database-connection.problem":"Contao zjistil problém s Vaší serverovou databází.","ui.setup.database-connection.schemaTitle":"Databázové schéma","ui.setup.database-connection.migration":"Existuje jedna nedokonÄená migrace. | Existují následující nedokonÄené migrace: {count}.","ui.setup.database-connection.schema":"Existuje jedna nedokonÄená schematická aktualizace. | Existují následující nedokonÄené schematické aktualizace: {count}.","ui.setup.database-connection.noChanges":"VaÅ¡e databáze je aktuální. ","ui.setup.database-connection.check":"Zkontrolovat databázi","ui.setup.database-connection.skip":"PÅ™eskoÄit","ui.setup.database-connection.save":"Uložit","ui.setup.database-connection.change":"ZmÄ›nit pověření","ui.setup.database-connection.restoreTitle":"Import databáze","ui.setup.database-connection.restoreText":"PÅ™edlohu, kterou jste právÄ› nainstalovali, obsahuje již pÅ™ipravenou databázi s definovaným obsahem. Pokud ji chcete nahrát a zaÄít tak používat Contao s již definovaným obsahem, nahrajte danou databázi, nebo pÅ™eskoÄte tento krok. | PÅ™edlohu, kterou jste právÄ› nainstalovali, obsahuje nÄ›kolik pÅ™ipravených databází s již definovaným obsahem. Pokud je chcete nahrát a zaÄít tak používat Contao s již definovaným obsahem, nahrajte dané databázi, nebo pÅ™eskoÄte tento krok","ui.setup.database-connection.backup":"Uložit souÄasnou databázi pÅ™ed importem.","ui.setup.database-connection.backupWarning":"VeÅ¡kerá data budou v databázi pÅ™epsána! Ponejprv si uložte souÄasnou databázi, pokud již není prázdná.","ui.setup.database-connection.restore":"Importovat pÅ™edlohu databáze","ui.setup.database-connection.restoreOption":"Uložená databáze {date} ({size})","ui.setup.database-connection.restored":"VaÅ¡e databáze byla úspěšnÄ› importovaná. PokraÄujte prosím, abyste provedli aktualizaci schématu databáze.","ui.setup.backend-user.success":"Ve vaší databázi byl nalezen jeden administrátorský úÄet pro backend Contaa. Pokud si pÅ™ejete pÅ™idat další úÄty, pÅ™ihlaÅ¡te se do backendu Contaa a vytvoÅ™te je v sekci Uživatelé.","ui.setup.backend-user.error":"Nebylo možné najít jakýkoli seznam uživatelů. Zkontrolujete prosím výstup příkazového řádku.","ui.setup.backend-user.headline":"ÚÄet backendu","ui.setup.backend-user.description":"Abyste mohli spravovat VaÅ¡i webovou stránku, musíte vytvoÅ™it alespoň jeden administrativní úÄet. UvÄ›domte si prosím, že tento úÄet není stejný pro pÅ™ihlášení do Správce Contaa. ","ui.setup.backend-user.formTitle":"VytvoÅ™it úÄet","ui.setup.backend-user.formText":"Zadejte prosím údaje pro nový úÄet backendu.","ui.setup.backend-user.username":"Uživatelské jméno","ui.setup.backend-user.name":"Jméno","ui.setup.backend-user.email":"Mailová adresa","ui.setup.backend-user.emailInvalid":"Zadejte prosím platnou mailovou adresu","ui.setup.backend-user.password":"Heslo","ui.setup.backend-user.passwordPlaceholder":"min. 8 znaků","ui.setup.backend-user.passwordLength":"Zadejte prosím nejménÄ› 8 znaků.","ui.setup.backend-user.create":"PÅ™idat úÄet","ui.task.headline":"Úloha na pozadí","ui.task.loading":"NaÄítání podrobností...","ui.task.created":"NaÄítání podrobností...","ui.task.active":"PoÄkejte prosím, zatímco Spráce Contaa na pozadí vyÅ™izuje operaÄní úlohy.","ui.task.complete":"VÅ¡echny operace byly úspěšnÄ› provedené. Další podrobnosti získáte v protokolu konzoly.","ui.task.paused":"Příkaz na pozadí byl znenadání zastaven. Zkontrolujte prosím protokol konzoly.","ui.task.aborting":"PoÄkejte prosím, zatímco se na pozadí zastavují operace.","ui.task.stopped":"NÄ›které z operaÄních úloh byly zruÅ¡ené. Zkontrolujte prosím protokol konzoly.","ui.task.error":"Příkaz na pozadí byl znenadání zastaven. Zkontrolujte prosím protokol konzoly.","ui.task.failed":"Správci Contaa se nepodaÅ™ilo spustit úlohu!","ui.task.failedDescription1":"NÄ›co se pokazilo, zatímco probíhaly úlohy na pozadí.","ui.task.failedDescription2":"Pokud se to bude opakovat, nejspíš není Váš server podporovaný.","ui.task.reportProblem":"Oznámit problém","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Cloud Composeru spozorován: {sponsor}","ui.task.buttonAudit":"Zaktualizovat dabázi","ui.task.buttonClose":"Zavřít","ui.task.buttonConfirm":"Potvrdit a zavřít","ui.task.buttonContinue":"PokraÄovat","ui.task.buttonCancel":"ZruÅ¡it","ui.task.confirmCancel":"Jste si jistí, že chcete zruÅ¡it tuto úlohu? To může zanechat instalaci Contaa v Å¡patném stavu!","ui.task.autoclose":"Zavřít podrobnosti o úloze po úspěšném dokonÄení","ui.console.toggle":"Zobrazit/skrýt výstup příkazového řádku","ui.console.showLog":"Zobrazit celý protokol konzoly","ui.console.copyLog":"Zkopírovat protokol do schránky.","ui.migrate.headline":"Aktualizace databáze","ui.migrate.migrationsOnly":"(pouze migrace)","ui.migrate.schemaOnly":"(pouze schémata)","ui.migrate.loading":"Prosím poÄkejte, analyzujeme VaÅ¡i databázi...","ui.migrate.empty":"Nebyl nalezené žádné aktualizace pro migraci nebo schémata. VaÅ¡i databáze je aktuální.","ui.migrate.emptyMigrations":"Nebyla nalezené žádné nedokonÄené migrace. UjistÄ›te se prosím, zda není potÅ™eba také zaktualizovat schémata.","ui.migrate.emptySchema":"Nebyla nalezené žádné nedokonÄené schémata. UjistÄ›te se prosím, zda není potÅ™eba také zaktualizovat migrace.","ui.migrate.pending":"VaÅ¡e databáze není aktuální. ProhlídnÄ›te si prosím níže konzolu a zaktualizujte VaÅ¡i databázi.","ui.migrate.previousChanges":"PÅ™edeÅ¡lá migrace nebyla potvrzená.\\nProhlédnÄ›te si prosím níže výsledky v konzole a pak proveÄte potÅ™ebné zmÄ›ny.","ui.migrate.previousComplete":"PÅ™edeÅ¡lá migrace nebyla potvrzená. ProhlédnÄ›te si prosím níže výsledky v konzole.\\nExistuje nÄ›kolik nedokonÄených zmÄ›n.","ui.migrate.appliedChanges":"Databáze byla zaktualizovaná. \\nProhlédnÄ›te si prosím níže výsledky v konzole, pak pokraÄujte dalšími kroky, abyste provedli další zmÄ›ny. ","ui.migrate.appliedComplete":"Databáze byla zaktualizovaná. \\nNeexistují žádné další nedokonÄené migrace nebo schémata. VaÅ¡e databáze je aktuální. ","ui.migrate.problem":"Contao zjistil problém s Vaším databázovým serverem. \\nProhlédnÄ›te si prosím níže výsledky v konzole, abyste se dozvÄ›dÄ›li více o tom, co je potÅ™eba opravit. | Contao zjistil problém s Vaším databázovým serverem. \\nProhlédnÄ›te si prosím níže výsledky v konzole, abyste se dozvÄ›dÄ›li více o tom, co je potÅ™eba opravit. ","ui.migrate.warning":"Contao zjistil nesprávné nastavení VaÅ¡eho databázového serveru. \\nVarování lze doÄasnÄ› pÅ™eskoÄit, mÄ›ly by se ale opravit, aby docházelo k dobrému výkonu a zacházení s daty. ","ui.migrate.error":"ZmÄ›ny nelze provést. VaÅ¡e databáze se možná zmÄ›nila. Zkontrolujte to prosím jeÅ¡tÄ› jednou a proveÄte daný krok jeÅ¡tÄ› jednou.","ui.migrate.execute":"Provést","ui.migrate.close":"Zavřít","ui.migrate.confirm":"Potvrdit a zavřít","ui.migrate.cancel":"ZruÅ¡it","ui.migrate.continue":"PokraÄovat","ui.migrate.setup":"Nastavení","ui.migrate.skip":"PÅ™eskoÄit","ui.migrate.retry":"Znovu zkontrolovat","ui.migrate.retryAll":"Vybrat vÅ¡e","ui.migrate.withDeletes":"Provést vÅ¡echny zmÄ›ny databáze vÄetnÄ› příkazu ke smazání. ","ui.migrate.migrationTitle":"Migrace databáze","ui.migrate.schemaTitle":"Schématická aktualizace","ui.migrate.problemTitle":"Problémy databáze","ui.migrate.warningTitle":"Varování databáze","ui.migrate.addTable":"PÅ™idat tabulku {table}","ui.migrate.dropTable":"Odstranit tabulku {table}","ui.migrate.addField":"PÅ™idat pole {table}. {field}","ui.migrate.changeField":"ZmÄ›nit pole {table}.{field}","ui.migrate.dropField":"Odstranit pole {table}.{field}","ui.migrate.createIndex":"VytvoÅ™it index \\"{name}\\" v {table}","ui.migrate.dropIndex":"Odstranit index \\"{name}\\" v {table}","ui.widget.mandatory":"Toto pole nesmí být prázdné.","ui.widget.blankOption":"Vyberte prosím…","ui.widget.showPassword":"Zobrazit heslo","ui.widget.hidePassword":"Skrýt heslo","ui.error.title":"Požadavek HTTP pro \\"{method} {url}\\" selhal.","ui.error.server500":"Vypadá to, že doÅ¡lo k neÄekané chybÄ› na VaÅ¡em webovém serveru. Zkontrolujte prosím protokolové soubory na serveru (Apache/Nginx) a protokol Správce Contaa v \\"contao-manager/logs\\".","ui.error.response":"Server odpovÄ›dÄ›l statusovým kódem {status}.","ui.error.moreLink":"Více informací","ui.error.support":"Podpora Contaa","ui.error.permission":"Nemáte povolení pro použití této funkce.","ui.footer.help":"NápovÄ›da","ui.footer.reportProblem":"Oznámit problém","ui.navigation.discover":"Prohlédnout","ui.navigation.packages":"BalíÄky","ui.navigation.tools":"Nástroje","ui.navigation.installTool":"InstalaÄní nástroj","ui.navigation.backend":"Backend Contaa","ui.navigation.debug":"Debugový mód Contaa","ui.navigation.logViewer":"ProhlížeÄ protokolu","ui.navigation.phpinfo":"Informace o PHP","ui.navigation.phpinfoLoading":"NaÄítání informací o PHP…","ui.navigation.maintenance":"Údržba","ui.navigation.rebuildCache":"PÅ™etvoÅ™ení meziúložiÅ¡tÄ›","ui.navigation.users":"ÚÄty","ui.navigation.systemCheck":"Kontrola systému","ui.navigation.advanced":"Rozšířené","ui.navigation.logout":"Odhlásit","ui.maintenance.database.title":"Migrace databáze","ui.maintenance.database.description":"Migrace databáze zajišťuje konzistentní data a tabulková schémata.","ui.maintenance.database.migrations":"Jedna nedokonÄená migrace databáze | PoÄet nedokonÄených migrací databáze {count} ","ui.maintenance.database.schemaUpdates":"Jedna nedokonÄená schématická aktualizace | PoÄet nedokonÄených schematických aktualizací {count} ","ui.maintenance.database.error":"Nalezen problém s databází.","ui.maintenance.database.warning":"Byly nalezená varování databáze.","ui.maintenance.database.button":"Zkontrolovat databázi","ui.maintenance.database.migrationOnly":"Vybrat pouze migrace","ui.maintenance.database.schemaOnly":"Vybrat pouze schémata","ui.maintenance.database.installTool":"Otevřít instalaÄní nástroj","ui.maintenance.database.createBackup":"VytvoÅ™it uložení databáze","ui.maintenance.database.backupUnsupported":"Ukládání databází není vaší verzí Contaa podporováno.","ui.maintenance.database.backupList":"Máte pouze jednou uloženou vaší databázi, a sice {date}. | PoÄet uložených databází {count}. Naposledy byla uložená {date}.","ui.maintenance.database.backupEmpty":"MomentálnÄ› nemáte žádné uložené databáze.","ui.maintenance.rebuildCache.title":"MeziúložiÅ¡tÄ› aplikace","ui.maintenance.rebuildCache.description":"PÅ™etvoÅ™ení meziúložiÅ¡tÄ› aplikace je nutné provést po každé zmÄ›nÄ› konfiguraÄních souborů. ","ui.maintenance.rebuildCache.rebuildProd":"PÅ™etvoÅ™it produktivní meziúložiÅ¡tÄ› ","ui.maintenance.rebuildCache.rebuildDev":"PÅ™etvoÅ™it vývojářské meziúložiÅ¡tÄ› ","ui.maintenance.rebuildCache.clearProd":"Vyprázdnit produktivní meziúložiÅ¡tÄ› ","ui.maintenance.rebuildCache.clearDev":"Vyprázdnit vývojářské meziúložiÅ¡tÄ› ","ui.maintenance.installTool.title":"InstalaÄní nástroj Contaa","ui.maintenance.installTool.description":"InstalaÄní nástroj Contaa se automaticky uzamkne, pokud nesprávnÄ› zadáte heslo tÅ™ikrát po sobÄ›. ","ui.maintenance.installTool.unlock":"Odemknout InstalaÄní nástroj","ui.maintenance.installTool.lock":"Uzamknout InstalaÄní nástroj","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"Composer autoloader je zodpovÄ›dný za naÄítání tříd PHP. Autoloader musí být spuÅ¡tÄ›ný po pÅ™idání vlastních namespace do koÅ™enové composer.json.","ui.maintenance.dumpAutoload.button":"Spustit Autoloadera","ui.maintenance.composerInstall.title":"Na Compseru závislá rozšíření","ui.maintenance.composerInstall.description":"Na Composeru závislá rozšíření se nachází ve složce {vendor} Vaší instalace. PÅ™einstalování tÄ›chto závislostí může být důležité po manipulaci nebo manuálnímu pÅ™enosu souboru {composerLock}.","ui.maintenance.composerInstall.button":"Spustit instalátor","ui.maintenance.composerInstall.update":"Spustit aktualizaci Composeru","ui.maintenance.composerCache.title":"MeziúložiÅ¡tÄ› Composeru","ui.maintenance.composerCache.description":"MeziúložiÅ¡tÄ› Composeru stáhla balíÄky, aby zlepÅ¡ily výkonost. Pokud máte potíže jako poniÄené soubory, pokuste se smazat meziúložiÅ¡tÄ› Composeru, abyste vyvolali nové stáhnutí. ","ui.maintenance.composerCache.button":"Smazat meziúložiÅ¡tÄ›","ui.maintenance.maintenanceMode.title":"Mód údržby","ui.maintenance.maintenanceMode.description":"Když se spustí mód údržby, zobrazí se pÅ™edloha pro \\"503 service Unavailable\\".","ui.maintenance.maintenanceMode.enable":"Aktivovat","ui.maintenance.maintenanceMode.disable":"Deaktivovat","ui.maintenance.debugMode.title":"Vývojářský mód","ui.maintenance.debugMode.description":"Aktivujte vývojářský mód zadáním uživatele a hesla pro {appDevPhp}.","ui.maintenance.debugMode.descriptionJwt":"Aktivujte vývojářský mód nastavením vývojářské cookie pro danou doménu.","ui.maintenance.debugMode.activate":"Aktivovat","ui.maintenance.debugMode.deactivate":"Deaktivovat","ui.maintenance.debugMode.credentials":"Uživatelské informace","ui.maintenance.debugMode.user":"Zadejte prosím uživatelské jméno pro vývojářský mód.","ui.maintenance.debugMode.password":"Zadejte prosím heslo pro uživatele vývojářského módu.","ui.maintenance.opcodeCache.title":"OperaÄní kód mezinúložiÅ¡tÄ›","ui.maintenance.opcodeCache.description":"OperaÄní kód meziúložiÅ¡tÄ› souborů PHP dokáže rychleji zpracovat data. Musí být smazán za urÄitých podmínek, pokud se nepodaÅ™ilo rozpoznat soubory po jejich zmÄ›nÄ›.","ui.maintenance.opcodeCache.button":"Zkrátit meziúložiÅ¡tÄ›","ui.maintenance.safeMode":"Není to dostupné v BezpeÄnostním módu","ui.maintenance.unsupported":"Nepodporované Vaší verzí Contaa. ","ui.packages.updateButton":"Zaktualizovat balíÄky","ui.packages.searchButton":"Vyhledat balíÄky","ui.packages.searchPlaceholder":"Hledají se balíÄky…","ui.packages.uploadOverlay":"PÅ™etáhnÄ›te a pusÅ¥te soubory, které chcete nahrát","ui.packages.uploadButton":"Nahrát balíÄky","ui.packages.uploadMessage":"Máte jeden nepotvrzený pÅ™enos. | Máte celkem {count} nepotvrzených pÅ™enosů.","ui.packages.uploadApply":"Potvrdit nahrání","ui.packages.uploadReset":"Smazat nahráné soubory","ui.packages.uploadIncomplete":"Tyto soubory nebyly zcela nahrány. Smažte je prosím a zkuste to znovu.","ui.packages.uploadDuplicate":"Zdá se, že byly tyto soubory nahrány nÄ›kolikrát. Smažte prosím dané duplikáty.","ui.packages.uploadInstalled":"Tento soubor je již nainstalovaný. Smažte prosím daný duplikát.","ui.packages.uploadUnsupported":"Nahrávání souborů není ve Vaší instalaci podporováno. UjistÄ›te se prosím, zda je funkce PHP ZIP nainstalovaná a zaktualizujte veÅ¡keré závislosti.","ui.packages.changesMessage":"Máte jednu nepotvrzenou zmÄ›nu. | Máte celkem {count} nepotvrzených zmÄ›n.","ui.packages.changesDryrun":"ZkouÅ¡ka naneÄisto","ui.packages.changesApply":"Provést zmÄ›ny","ui.packages.changesApplyAll":"Zaktualizovat vÅ¡echny balíÄky","ui.packages.changesDryrunAll":"VyzkouÅ¡et vÅ¡echny balíÄky naneÄisto","ui.packages.changesReset":"Vrátit zmÄ›ny","ui.packages.changesReview":"Ukázat zmÄ›ny","ui.packagelist.loading":"SpouÅ¡tÄ›ní…","ui.packagelist.uploads":"Nahrání/pÅ™enos souborů","ui.packagelist.added":"Nové balíÄky","ui.packagelist.installed":"Nainstalované balíÄky","ui.package.hintRevert":"Vrátit zmÄ›ny","ui.package.hintNoupdate":"Neaktualizovat","ui.package.hintConstraint":"Tento balíÄek bude nainstalovaný s omezením {constraint}, pokud provedete zmÄ›ny.","ui.package.hintConstraintBest":"Tento balíÄek bude nainstalovaný v nejnovÄ›ji dostupné verzi, pokud provedete zmÄ›ny.","ui.package.hintConstraintChange":"Toto omezení pro tento balíÄek bude zmÄ›nÄ›no z \\"{from}\\" na \\"{to}\\", pokud provedete zmÄ›ny.","ui.package.hintConstraintUpdate":"Tento balíÄek bude zaktualizovaný, pokud aplikujete tyto zmÄ›ny.","ui.package.hintAdded":"Tento balíÄek bude nainstalovaný, když aplikujete tyto zmÄ›ny.","ui.package.hintRemoved":"Tento balíÄek bude smazaný, pokud provedete zmÄ›ny.","ui.package.requiredTitle":"pÅ™idáno manuálnÄ›","ui.package.requiredText":"Tento balíÄek je už sice uvedený ve VaÅ¡em souboru composer.json, ale jeÅ¡tÄ› není nainstalovaný.","ui.package.removedTitle":"odstanÄ›no manuálnÄ›","ui.package.removedText":"Tento balíÄek byl odstranÄ›n z VaÅ¡eho souboru composer.json.","ui.package.installed":"MomentálnÄ› nainstalováno:","ui.package.version":"Verze {version}","ui.package.additionalDownloads":"{count} Stažení | {count} Stažení","ui.package.additionalStars":"{count} HvÄ›zda | {count} hvÄ›zd","ui.package.editConstraint":"Upravit","ui.package.uploadConstraint":"Toto omezení je nadefinováno nahraným balíÄkem.","ui.package.updateButton":"Zaktualizovat","ui.package.removeButton":"Smazat","ui.package.installButton":"PÅ™idat balíÄek","ui.package.installButtonShort":"PÅ™idat","ui.package.detailsButton":"Podrobnosti","ui.package.latestConstraint":"poslední verze","ui.package.update":"Existuje nová aktualizace","ui.package.updateLatest":"poslední verze","ui.package.updateAvailable":"{version}","ui.package.updateUnknown":"neznámá verze","ui.package.updateConstraint":"Je k dispozici nová verze než ta, kterou právÄ› používáte.","ui.package.incompatible":"{package} nefunguje s Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Verze {version}","ui.cloudStatus.waitingTime":"Doba Äekání","ui.cloudStatus.jobs":"SouÄasné úlohy","ui.cloudStatus.workers":"ÚÄastníků","ui.cloudStatus.approx":"{minutes} min.","ui.cloudStatus.none":"ne","ui.cloudStatus.short":"ca. {minutes} min.","ui.cloudStatus.long":"ca. {minutes} min. {seconds} sek.","ui.cloudStatus.error":"Nebylo možné získat status Composer Resolver Cloud. Může být zrovna neaktivní nebo má nÄ›jaké problémy.","ui.cloudStatus.button":"Status Cloudu","ui.cloudStatus.refresh":"Znovu naÄíst status Cloudu","ui.log-viewer.loading":"SpouÅ¡tÄ›ní…","ui.log-viewer.empty":"Na VaÅ¡em serveru se nenacházejí žádné protokolové soubory.","ui.log-viewer.reload":"NaÄíst znovu","ui.log-viewer.file":"Protokolový soubor","ui.log-viewer.channel":"Kanál","ui.log-viewer.channelTitle":"Kanál zpráv byl pÅ™ihlášen.","ui.log-viewer.level":"Úroveň","ui.log-viewer.levelTitle":"Vážnost protokolované zprávy.","ui.log-viewer.timeHeader":"ÄŒas","ui.log-viewer.messageHeader":"Zpráva","ui.log-viewer.showContext":"Zobrazit kontext","ui.log-viewer.hideContext":"Skrýt kontext","ui.log-viewer.showExtra":"Zobrazit extra","ui.log-viewer.hideExtra":"Smazat extra","ui.log-viewer.more":"DozvÄ›dÄ›t se víc...","ui.log-viewer.download":"Stáhnout","ui.log-viewer.downloadTitle":"Stáhnout soubor \\"{file}\\"","ui.log-viewer.prodEnvironment":"Produktivní prostÅ™edí","ui.log-viewer.devEnvironment":"Vývojářské prostÅ™edí (vychytávací mód)","ui.user-manager.loading":"NaÄítám uživatele...","ui.user-manager.changePassword":"ZmÄ›nit heslo","ui.user-manager.setupTotp":"Nastavení dvoufaktorového ověření","ui.user-manager.disableTotp":"Deaktivovat dvoufaktorové ověření","ui.user-manager.invite":"Pozvat uživatele","ui.user-manager.delete":"Smazat","ui.user-manager.deleteConfirm":"Opravdu chcete smazat \\"{username}\\"?","ui.user-manager.deleted":"ÚspěšnÄ› doÅ¡lo ke smazání {username}","ui.user-manager.passwordHeadline":"ZmÄ›nit heslo","ui.user-manager.passwordText":"Abyste mohli zmÄ›nit heslo, zadajte nejdřív vaÅ¡e stávající a pak vaÅ¡e nové v odpovídajících polích. ","ui.user-manager.currentPassword":"SouÄasné heslo","ui.user-manager.newPassword":"Nové heslo","ui.user-manager.passwordPlaceholder":"min. 8 znaků","ui.user-manager.submitPassword":"Odeslat","ui.user-manager.passwordChanged":"VaÅ¡e heslo bylo úspěšnÄ› zmÄ›nÄ›no.","ui.user-manager.passwordError":"Heslo není správné.","ui.user-manager.inviteHeadline":"Pozvat uživatele","ui.user-manager.inviteText":"Pokud potÅ™ebujete více pÅ™ihlášení pro Správce Contaa, můžete zde vytvoÅ™it odkaz na pozvání. Sdílejte tento odkaz s nÄ›kým nebo jej použijte na jiném zařízení k vytvoÅ™ení nového úÄtu s danými oprávnÄ›ními.","ui.user-manager.inviteSuccess1":"Byl vytvoÅ™en nový odkaz na pozvání. Níže uvedenou adresu lze použít k vytvoÅ™ení nového uživatelského úÄtu pro Správce Contaa. Pozvánka vyprší na {expires} (za týden od nynÄ›jÅ¡ka).","ui.user-manager.inviteSuccess2":"Zkopírujte prosím tento odkaz do vaší schránky. Platí jen jednou a již se nezobrazí po zavÅ™ení tohoto dialogu.","ui.user-manager.createInvitation":"VytvoÅ™it odkaz na pozvání","ui.user-manager.clipboard":"Zkopírovat do schránky","ui.user-manager.permissions":"DozvÄ›dÄ›t se víc o povolení","ui.user-manager.cancel":"ZruÅ¡it","ui.user-manager.close":"Zavřít","ui.user-manager.you":"Vy","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Dvoufaktorové ověření","ui.totp.setupQr":"Naskenujte prosím QR kód pomocí vaší 2FA/TOTP aplikace.","ui.totp.setupCode":"Nemůžete-li naskenovat QR kód, zadejte místo toho následující klíÄ:","ui.totp.codeLabel":"Ověřovací kód","ui.totp.codeDescription":"Zadejte prosím ověřovací kód vygenerovaný vaší 2FA/TOTP aplikací.","ui.totp.disableText":"Zadejte prosím ověřovací kód, abyste deaktivovali dvoufaktorové ověření. ","ui.totp.invalid":"Ověřovací kód není platný.","ui.totp.enable":"Aktivovat","ui.totp.disable":"Deaktivovat","ui.totp.cancel":"ZruÅ¡it","ui.totp.enabled":"Dvoufaktorové ověření bylo úspěšnÄ› aktivováno.","ui.totp.disabled":"Dvoufaktorové ověření bylo úspěšnÄ› deaktivováno.","ui.totp.setup":"Nastavení dvoufaktorového ověření","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[904],{5523:function(t,e,o){o.r(e),o.d(e,{default:function(){return I}});var s=o(641),a=o(33),i=o(3751),n=o(6894);const u={class:"view-account__header"},r={class:"view-account__product"},l=["href"],c={href:"https://github.com/contao/contao-manager/issues",target:"_blank"},d={key:0,class:"view-account__totp"},p={class:"view-account__headline"},h={class:"view-account__description"},g={key:1,class:"view-account__form"},m={class:"view-account__headline"},b={class:"view-account__description"},w={class:"view-account__fields"},k=["disabled"],_={class:"view-account__contribute"},v={href:"https://to.contao.org/donate",target:"_blank"};function $(t,e,o,$,f,L){const y=(0,s.g2)("i18n-t"),A=(0,s.g2)("text-field"),T=(0,s.g2)("button-group"),C=(0,s.g2)("loading-button"),P=(0,s.g2)("boxed-layout");return(0,s.uX)(),(0,s.Wv)(P,{wide:!0,slotClass:"view-account"},{default:(0,s.k6)((()=>[(0,s.Lk)("header",u,[e[11]||(e[11]=(0,s.Lk)("img",{src:n,width:"100",height:"100",alt:"Contao Logo"},null,-1)),(0,s.Lk)("p",r,[(0,s.Lk)("strong",null,(0,a.v_)(t.$t("ui.account.welcome")),1),e[8]||(e[8]=(0,s.eW)(" Contao Manager 1.10.3 "))]),(0,s.Lk)("p",null,[(0,s.bF)(y,{keypath:"ui.account.intro1"},{readTheManualToGetStarted:(0,s.k6)((()=>[(0,s.bF)(y,{tag:"strong",keypath:"ui.account.introGetStarted"},{readTheManual:(0,s.k6)((()=>[(0,s.Lk)("a",{href:`https://to.contao.org/docs/contao-manager?lang=${t.$i18n.locale}`,target:"_blank"},(0,a.v_)(t.$t("ui.account.introManual")),9,l)])),_:1})])),_:1}),e[9]||(e[9]=(0,s.Lk)("br",null,null,-1)),e[10]||(e[10]=(0,s.Lk)("br",null,null,-1)),(0,s.bF)(y,{keypath:"ui.account.intro2"},{ourGithubIssues:(0,s.k6)((()=>[(0,s.Lk)("a",c,(0,a.v_)(t.$t("ui.account.introIssues")),1)])),_:1})])]),(0,s.bF)(i.eB,{name:"animate-flip",type:"transition",mode:"out-in"},{default:(0,s.k6)((()=>[t.currentUser&&!t.hasTotp?((0,s.uX)(),(0,s.CE)("main",d,[(0,s.Lk)("h1",p,(0,a.v_)(t.$t("ui.account.totpHeadline")),1),(0,s.Lk)("p",h,(0,a.v_)(t.$t("ui.account.totpDescription")),1),(0,s.Lk)("button",{class:"widget-button widget-button--primary",onClick:e[0]||(e[0]=(...t)=>L.setupTotp&&L.setupTotp(...t))},(0,a.v_)(t.$t("ui.totp.setup")),1),(0,s.Lk)("button",{class:"widget-button widget-button--alert",onClick:e[1]||(e[1]=(...t)=>L.skipTotp&&L.skipTotp(...t))},(0,a.v_)(t.$t("ui.totp.skip")),1)])):((0,s.uX)(),(0,s.CE)("main",g,[(0,s.Lk)("form",{onSubmit:e[7]||(e[7]=(0,i.D$)(((...t)=>L.createAccount&&L.createAccount(...t)),["prevent"]))},[(0,s.Lk)("h1",m,(0,a.v_)(t.$t("ui.account.headline")),1),(0,s.Lk)("p",b,(0,a.v_)(t.$t("ui.account.description")),1),(0,s.Lk)("fieldset",w,[(0,s.bF)(A,{ref:"username",name:"username",label:t.$t("ui.account.username"),disabled:t.logging_in,required:"",error:t.errors.username,onBlur:e[2]||(e[2]=e=>t.errors.username=""),modelValue:t.username,"onUpdate:modelValue":e[3]||(e[3]=e=>t.username=e)},null,8,["label","disabled","error","modelValue"]),t.usePassword?((0,s.uX)(),(0,s.Wv)(A,{key:0,ref:"password",name:"password",type:"password",label:t.$t("ui.account.password"),placeholder:t.$t("ui.account.passwordPlaceholder"),disabled:t.logging_in,required:"",pattern:".{8,}",error:t.errors.password,onBlur:L.validatePassword,modelValue:t.password,"onUpdate:modelValue":e[4]||(e[4]=e=>t.password=e)},null,8,["label","placeholder","disabled","error","onBlur","modelValue"])):(0,s.Q3)("",!0),t.supportsWebAuthn?((0,s.uX)(),(0,s.Wv)(T,{key:1,submit:"",color:"primary",disabled:!t.valid,loading:t.logging_in,label:t.$t("ui.account.submit")},{default:(0,s.k6)((()=>[(0,s.Lk)("button",{type:"button",class:"widget-button",disabled:t.logging_in,onClick:e[5]||(e[5]=e=>t.usePassword=!t.usePassword)},(0,a.v_)(t.$t("ui.account."+(t.usePassword?"usePasskey":"usePassword"))),9,k)])),_:1},8,["disabled","loading","label"])):((0,s.uX)(),(0,s.Wv)(C,{key:2,submit:"",color:"primary",disabled:!t.valid,loading:t.logging_in},{default:(0,s.k6)((()=>[(0,s.eW)((0,a.v_)(t.$t("ui.account.submit")),1)])),_:1},8,["disabled","loading"])),L.isInvitation?((0,s.uX)(),(0,s.CE)("button",{key:3,type:"button",class:"widget-button widget-button--anchor",onClick:e[6]||(e[6]=(...t)=>L.gotoLogin&&L.gotoLogin(...t))},(0,a.v_)(t.$t("ui.account.login")),1)):(0,s.Q3)("",!0)])],32)]))])),_:1}),(0,s.Lk)("aside",_,[(0,s.Lk)("p",null,[(0,s.eW)((0,a.v_)(t.$t("ui.account.contribute1")),1),e[12]||(e[12]=(0,s.Lk)("br",null,null,-1)),(0,s.bF)(y,{keypath:"ui.account.contribute2"},{donate:(0,s.k6)((()=>[(0,s.Lk)("a",v,(0,a.v_)(t.$t("ui.account.contributeDonate")),1)])),_:1})])])])),_:1})}var f=o(6278),L=o(60),y=o(707),A=o(728),T=o(9757),C=o(85),P=o(4676),V=o(9473),W={components:{BoxedLayout:A.A,TextField:T.A,LoadingButton:C.A,ButtonGroup:P.A},data:()=>({username:"",password:"",errors:{username:"",password:""},valid:!1,logging_in:!1,usePassword:!1,supportsWebAuthn:!0}),computed:{...(0,f.aH)("auth",{currentUser:"username",hasTotp:"totpEnabled"}),isInvitation:t=>!!t.$route.query.invitation},methods:{validate(){this.valid=this.$refs.username.checkValidity()&&(!this.usePassword||this.$refs.password.checkValidity())},validatePassword(){this.errors.password=null,""!==this.password&&this.password.length<8&&(this.errors.password=this.$t("ui.account.passwordLength"))},async createAccount(){if(!this.valid)return;this.logging_in=!0;const t={username:this.username};if(this.isInvitation&&(t.invitation=this.$route.query.invitation),this.usePassword)t.password=this.password;else{const o=(await this.$request.post("api/session/options",t)).data;let s;try{s=await(0,L.Ct)({optionsJSON:o})}catch(e){return void(this.logging_in=!1)}if(!s)return void(this.logging_in=!1);t.passkey=JSON.stringify(s)}201!==(await this.$store.dispatch("auth/login",t)).status&&(this.logging_in=!1,this.errors.username=this.$t("ui.account.loginInvalid"),setTimeout((()=>{this.$refs.username.focus()}),0))},setupTotp(){this.$store.commit("modals/open",{id:"setup-totp",component:V.A})},skipTotp(){this.$store.commit("setView",y.A.BOOT)},gotoLogin(){this.$router.replace({name:this.$route.name,query:null}),this.$store.commit("setView",y.A.LOGIN)}},watch:{username(){this.validate()},password(){this.validate()},hasTotp(){this.$store.commit("setView",y.A.BOOT)}},mounted(){this.supportsWebAuthn="https:"===location.protocol&&(0,L.zZ)(),this.usePassword=!this.supportsWebAuthn,this.$refs.username&&this.$refs.username.focus()}},B=o(6262);const F=(0,B.A)(W,[["render",$]]);var I=F}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[560],{1560:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! NedroÅ¡s savienojums !!","ui.app.httpsDescription":"Bez HTTPS jÅ«su konfidenciÄlie dati tiks pÄrsÅ«tÄ«ti neÅ¡ifrÄ“ti.","ui.app.httpsLink":"VairÄk informÄcijas","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! IeslÄ“gts droÅ¡ais režīms !!","ui.app.safeModeDescription":"Dažas Contao Manager funkcijas nav pieejamas.","ui.app.safeModeExit":"Iziet no droÅ¡Ä režīma","ui.app.limitedHeadline":"AttÄlÄ autentifikÄcija","ui.app.limitedDescription":"Jums ir ierobežotas atļaujas, jo pieslÄ“gÅ¡anÄs notiek bez paroles.","ui.app.limitedLogout":"AtkÄrtoti autentificÄ“ties","ui.app.totpHeadline":"Drošības paziņojums","ui.app.totpDescription":"KonfigurÄ“jiet divfaktoru autentifikÄciju, lai aizsargÄtu savu kontu.","ui.app.totpSetup":"UzstÄdÄ«t","ui.app.loading":"IelÄdÄ“ Contao pÄrvaldnieku ...","ui.app.apiError":"NegaidÄ«ts API statuss","ui.app.configSecurity1":"DROŠĪBAS BRĪDINÄ€JUMS !!! KonstatÄ“ts neaizsargÄts konfigurÄcijas direktorijs","ui.app.configSecurity2":"The Contao Manager has detected that its config files are publicly accessible. All operations are disabled until the directory is secured, otherwise an attacker could access sensitive data of your installation.\\n\\nTo fix this issue, make sure to prevent access to the \\"contao-manager\\" directory on your server. To learn how to do this, please refer to the manual of your webserver or contact your hosting provider.","ui.account.welcome":"Laipni lÅ«dzam","ui.account.intro1":"Laipni lÅ«gti Contao pÄrvaldniekÄ, kas ir universÄls rÄ«ks Contao atvÄ“rtÄ koda CMS instalēšanai un pÄrvaldÄ«bai. Ja esat jauns lietotÄjs, lÅ«dzu, {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual}, lai sÄktu","ui.account.introManual":"izlasiet rokasgrÄmatu","ui.account.intro2":"Ja jums rodas kÄdas problÄ“mas, pÄrbaudiet {ourGithubIssues} un nekautrÄ“jieties izveidot jaunu problÄ“mu, ja par to vÄ“l nav ziņots.","ui.account.introIssues":"mÅ«su GitHub problÄ“mas","ui.account.headline":"LietotÄja konts","ui.account.description":"Lai pÄrvaldÄ«tu savu instalÄciju, lÅ«dzu, izveidojiet Contao pÄrvaldnieka kontu. Å…emiet vÄ“rÄ, ka Å¡is konts nav saistÄ«ts ar Contao aizmuguri vai priekÅ¡u.","ui.account.username":"LietotÄjvÄrds","ui.account.password":"Parole","ui.account.passwordPlaceholder":"min. 8 rakstzÄ«mes","ui.account.passwordLength":"LÅ«dzu, ievadiet vismaz 8 rakstzÄ«mes.","ui.account.loginInvalid":"There was an error when creating the account. Please try a different username.","ui.account.submit":"Izveidot kontu","ui.account.usePassword":"Izmantot paroli, lai pieslÄ“gtos","ui.account.usePasskey":"PieslÄ“dzoties izmantot Passkey","ui.account.totpHeadline":"Divu faktoru autentifikÄcija","ui.account.totpDescription":"Please enable two-factor authentication, which adds an extra layer of security to your account. In addition to your username and password, you will need to enter a verification code generated by a two-factor app such as 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator or any other TOTP app.","ui.account.totpSetup":"KonfigurÄ“t tagad","ui.account.totpSkip":"KonfigurÄ“t vÄ“lÄk","ui.account.login":"NoraidÄ«t ielÅ«gumu","ui.account.contribute1":"Contao un Contao Manager sponsorÄ“ bezpeļņas organizÄcija Contao Association.","ui.account.contribute2":"LÅ«dzu, apsveriet iespÄ“ju sniegt ieguldÄ«jumu atvÄ“rtajÄ pirmkodÄ {donate}.","ui.account.contributeDonate":"ziedojuma veikÅ¡ana","ui.login.headline":"PierakstÄ«ties","ui.login.description":"PierakstÄ«ties, lai pÄrvaldÄ«tu savu instalÄciju.","ui.login.username":"LietotÄjvÄrds","ui.login.password":"Parole","ui.login.totpHeadline":"Divu faktoru autentifikÄcija","ui.login.totpDescription":"LÅ«dzu, ievadiet verifikÄcijas kodu, lai pabeigtu pieslÄ“gÅ¡anÄs procesu.","ui.login.totp":"VerifikÄcijas kods","ui.login.forgotPassword":"AizmirsÄt paroli?","ui.login.button":"PierakstÄ«ties","ui.login.passkey":"PieslÄ“gties ar Passkey","ui.login.cancel":"Atcelt","ui.login.or":"vai","ui.login.locked":"Piekļuve ir liegta, jo Contao Manager ir bloÄ·Ä“ts. Lai atbloÄ·Ä“tu, izdzÄ“siet {lockFile} datni Contao galvenajÄ direktorijÄ.","ui.logout.headline":"Sesijas laika limits","ui.logout.warning":"JÅ«s esat bijis neaktÄ«vs ilgÄk par 25 minÅ«tÄ“m. Drošības apsvÄ“rumu dēļ jÅ«su sesija drÄ«z tiks pÄrtraukta.","ui.logout.expired":"JÅ«su sesija tika automÄtiski pÄrtraukta, jo esat bijis neaktÄ«vs ilgÄk par 30 minÅ«tÄ“m.","ui.logout.renew":"Palikt pieteikuÅ¡amies","ui.logout.logout":"IzrakstÄ«ties","ui.logout.login":"Atpakaļ uz pieteikÅ¡anos","ui.oauth.error":"NederÄ«gs OAuth mēģinÄjums. PÄrbaudiet pieprasÄ«juma parametrus.","ui.oauth.https":"The redirect URI MUST use a secure protocol (https:) to prevent the authentication token from being transmitted in clear-text.","ui.oauth.headline":"AttÄlÄ autentifikÄcija","ui.oauth.description":"Å Äda lietojumprogramma vai pakalpojums pieprasa attÄlo piekļuvi jÅ«su Contao Manager instancei.","ui.oauth.domain":"Pirms atļaujat piekļuvi, pÄrliecinieties, ka zinÄt Å¡o URL un uzticaties tÄ Ä«paÅ¡niekam!","ui.oauth.outOfScope":"Unfortunately, you do not have the necessary permissions to grant this access.","ui.oauth.allow":"Atļaut piekļuvi","ui.oauth.deny":"Liegt piekļuvi","ui.oauth.switchUser":"PÄrslÄ“gt lietotÄju","ui.scope.admin":"Admin access including user management","ui.scope.install":"Install new packages and change Contao configuration","ui.scope.update":"Update packages and execute maintenance tasks","ui.scope.read":"Read packages and configuration","ui.boot.headline":"SistÄ“mas pÄrbaude","ui.boot.description":"LÅ«dzu, uzgaidiet, mÄ“s analizÄ“jam jÅ«su serveri ...","ui.boot.issue1":"KonstatÄ“tÄs instalēšanas problÄ“mas","ui.boot.issue2":"JÅ«su instalÄcijÄ ir problÄ“mas, kas jÄnovÄ“rÅ¡, pirms var izmantot Contao Manager.","ui.boot.run":"Palaist Contao pÄrvaldnieku","ui.boot.safeMode":"Palaist droÅ¡ajÄ režīmÄ","ui.recovery.headline":"SistÄ“mas atkopÅ¡ana","ui.recovery.description":"Contao Manager atklÄja datnes, kas izskatÄs kÄ Contao, bet komandrindas saskarne nedarbojas, kÄ paredzÄ“ts.","ui.recovery.console":"Konsoles izvade","ui.recovery.repairOptions":"LÅ«dzu, izvÄ“lieties iespÄ“ju, lai salabotu instalÄciju.","ui.recovery.repairHeadline":"AutomÄtiskÄ izlaboÅ¡ana","ui.recovery.repairDescription":"Mēģina automÄtiski labot instalÄciju, atjaunojot lietojumprogrammu keÅ¡atmiņu un atkÄrtoti instalÄ“jot Composer paketes.","ui.recovery.repairWarning":"Procesa laikÄ var tikt dzÄ“stas visas piegÄdÄtÄja datņu izmaiņas!","ui.recovery.repairFailed":"AutomÄtiskÄ laboÅ¡ana nebija veiksmÄ«ga. Izmēģiniet instalÄciju labot manuÄli droÅ¡ajÄ režīmÄ.","ui.recovery.repairButton":"Palaist sistÄ“mas izlaboÅ¡anu","ui.recovery.safeModeHeadline":"DroÅ¡ais režīms","ui.recovery.safeModeDescription":"Programmas Contao Manager palaiÅ¡ana droÅ¡ajÄ režīmÄ Ä¼auj pÄrvaldÄ«t paketes un veikt dažus uzturēšanas uzdevumus, taÄu funkcijas, kas ir atkarÄ«gas no darbojoÅ¡Äs Contao instalÄcijas, nebÅ«s pieejamas.","ui.recovery.safeModeButton":"Palaist droÅ¡ajÄ režīmÄ","ui.server.pending":"Gaida ...","ui.server.running":"AnalizÄ“ ...","ui.server.error":"PÄrbaude neizdevÄs, jo no servera saņemta neparedzÄ“ta atbilde.","ui.server.details":"SÄ«kÄka informÄcija","ui.server.prerequisite":"PÄrbaude atcelta trÅ«kstoÅ¡Ä priekÅ¡nosacÄ«juma dēļ.","ui.server.selfUpdate.title":"Contao pÄrvaldnieka atjauninÄjumi","ui.server.selfUpdate.update":"Ir pieejama jauna Contao pÄrvaldnieka versija {latest}.","ui.server.selfUpdate.manualUpdate":"Ir pieejama jauna Contao Manager versija {latest}. JÅ«su serveris neatbalsta automÄtiskus atjauninÄjumus, lÅ«dzu, lejupielÄdÄ“jiet jauno versiju no {download}.","ui.server.selfUpdate.latest":"JÅ«s izmantojat jaunÄko versiju {current}.","ui.server.selfUpdate.dev":"IzstrÄdes bÅ«ves neatbalsta automÄtiskus atjauninÄjumus.","ui.server.selfUpdate.unsupported":"Ir pieejama jauna versija, taÄu tÄ neatbalsta jÅ«su PHP versiju.","ui.server.selfUpdate.button":"Palaist paÅ¡atjauninÄjumu","ui.server.selfUpdate.continue":"TurpinÄt","ui.server.config.title":"Servera konfigurÄcija","ui.server.config.setup":"KonfigurÄ“t","ui.server.config.change":"MainÄ«t","ui.server.config.save":"SaglabÄt","ui.server.config.cancel":"Atcelt","ui.server.config.customOption":"Cits ...","ui.server.config.description":"To correctly run background tasks, the Contao Manager needs to know where to find the PHP command line binary and how to run commands separated from the web process.","ui.server.config.formTitle":"Servera konfigurÄcija","ui.server.config.formText":"Please enter the path to your PHP binary. Make sure the binary is the same PHP version as your web process.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"The Composer Resolver Cloud allows to install Composer dependencies even if your server does not provide enough local memory. Please be aware that your package information will be transmitted to a cloud server operated by the Contao Association.","ui.server.config.cloud":"Izmantot Composer Resolver Cloud","ui.server.config.cli":"PHP binÄrs","ui.server.config.stateErrorCli":"ServerÄ« netika atrasts derÄ«gs PHP binÄrs.","ui.server.config.stateErrorCloud":"Composer Resolver Cloud netiek atbalstÄ«ts.","ui.server.config.stateSuccess":"PHP binÄrais kodols {php_cli}.","ui.server.php_web.title":"PHP Web process","ui.server.php_web.below7":"Atrasta PHP versija {versija}. LÅ«dzu, pÄ“c iespÄ“jas ÄtrÄk pÄrejiet uz PHP 7!","ui.server.php_web.success":"Atrasta PHP versija {versija}, neviena zinÄma problÄ“ma nav atrasta.","ui.server.php_cli.title":"PHP komandrindas saskarne","ui.server.php_cli.success":"Atrasta PHP versija {versija}, neviena zinÄma problÄ“ma nav atrasta.","ui.server.composer.title":"Composer vide","ui.server.composer.success":"Netika atrastas zinÄmas problÄ“mas.","ui.server.composer.install":"Composer dependencies are not installed.","ui.server.composer.button":"UzstÄdÄ«t","ui.server.contao.title":"Contao instalÄcija","ui.server.contao.setup":"UzstÄdÄ«t","ui.server.contao.check":"PÄrbaudÄ«t datubÄzi","ui.server.contao.empty":"Neviena Contao instalÄcija nav atrasta.","ui.server.contao.old":"Contao versija {versija} nav savietojama ar Contao pÄrvaldnieku, lÅ«dzu, manuÄli atjauniniet instalÄciju.","ui.server.contao.found":"Atrasts Contao {versija} (API versija {api}).","ui.server.contao.connectionError":"Nevar izveidot savienojumu ar datubÄzes serveri.","ui.server.contao.connectionProblem":"Atrasta datubÄzes problÄ“ma.","ui.server.contao.missingUser":"Administratora konts nav atrasts.","ui.setup.continue":"TurpinÄt","ui.setup.manager":"Palaist Contao pÄrvaldnieku","ui.setup.cancel":"Atcelt","ui.setup.welcome":"Laipni lÅ«dzam","ui.setup.welcome1":"This wizard will take you through the necessary steps to set up your Contao Open Source CMS installation.","ui.setup.welcome2":"If you have any questions, please find documentation, forums, a Slack channel and more on the {support} page.","ui.setup.support":"kopienas atbalsts","ui.setup.start":"SÄkt","ui.setup.complete":"Apsveicam!","ui.setup.complete1":"Contao {versija} ir veiksmÄ«gi instalÄ“ta.","ui.setup.complete2":"To finish the setup process, please open the install tool to configure the database connection and create a back end user.","ui.setup.complete3":"You can now start to create your website in the Contao back end. If you need additional extensions, continue to the Contao Manager.","ui.setup.installTool":"Atveriet instalēšanas rÄ«ku","ui.setup.login":"PieslÄ“gties Contao","ui.setup.funding":"Free software is \\"free\\" as in \\"free speech\\", not as in \\"free beer\\". An Open Source project like Contao requires amounts of money that can\'t be raised by a single person or company.\\nIf you have a website or sell websites built with Contao, we would love to see you contribute back financially to the product your business relies upon.","ui.setup.fundingLink":"UzzinÄt vairÄk","ui.setup.document-root.headline":"TÄ«mekļa servera iestatīšana","ui.setup.document-root.warning":"Lai instalÄ“tu Contao, izmantojot Contao Manager, tÄ«mekļa serverÄ« ir jÄnosaka dokumenta sakne.","ui.setup.document-root.description1":"Contao uses a separate folder for public files, application files are installed in its parent folder. Contao cannot be installed if the folder structure is not correct or the folders are not empty.","ui.setup.document-root.description2":"Ja nezinÄt, kÄ konfigurÄ“t dokumentu sakni, izlasiet Contao dokumentÄciju vai sazinieties ar savu hostinga pakalpojumu sniedzÄ“ju.","ui.setup.document-root.documentation":"Izlasiet dokumentÄciju","ui.setup.document-root.conflictsTitle":"InstalÄcijas direktorijs nav tukÅ¡s","ui.setup.document-root.conflictsDirectory":"The root directory of your future Contao installation is not empty, we have found {count} file(s) that might be overwritten by the installation process. It is recommended to create an empty directory structure for Contao, but you can also remove the following files and check again if you are sure they are unused.","ui.setup.document-root.ignoreConflicts":"I want to install Contao into the non-empty directory. I understand that this might overwrite any existing files on my webspace.","ui.setup.document-root.check":"PÄrbaudiet vÄ“lreiz","ui.setup.document-root.create":"Izveidot direktorijus","ui.setup.document-root.change":"MainÄ«t direktorijus","ui.setup.document-root.formTitle":"Direktoriju iestatīšana","ui.setup.document-root.formText1":"Contao Manager var automÄtiski izveidot jaunu direktoriju struktÅ«ru serverÄ«.","ui.setup.document-root.formText2":"Jums bÅ«s manuÄli jÄkonfigurÄ“ jaunÄ dokumenta sakne (piemÄ“ram, izmantojot hostinga administratora paneli).","ui.setup.document-root.autoconfig":"Es saprotu, ka man ir jÄmaina servera konfigurÄcija. Dokumenta saknes nekonfigurēšana sabojÄs Contao Manager un atklÄs konfigurÄcijas failus (tostarp konta informÄciju un paroles)!","ui.setup.document-root.directory":"Jauns direktorijs","ui.setup.document-root.currentRoot":"PaÅ¡reizÄ“jÄ dokumenta sakne","ui.setup.document-root.newRoot":"Jauna dokumenta sakne","ui.setup.document-root.finish":"Direktoriju iestatīšana","ui.setup.document-root.publicDir":"Izmantojiet {dir} publiskajÄm datnÄ“m (Contao {version})","ui.setup.document-root.directoryInvalid":"LÅ«dzu, ievadiet derÄ«gu direktorija nosaukumu.","ui.setup.document-root.directoryExists":"MÄ“rÄ·a direktorijs jau pastÄv. LÅ«dzu, ievadiet citu nosaukumu.","ui.setup.document-root.confirmation":"Contao pÄrvaldnieks ir veiksmÄ«gi izveidojis nepiecieÅ¡amo direktoriju jÅ«su Contao instalÄcijai. Tagad jums ir jÄkonfigurÄ“ dokumenta sakne tÄ«mekļa serverÄ«. LÄ«dz tam nepÄrlÄdÄ“jiet Å¡o lapu no jauna.","ui.setup.document-root.reload":"PÄrlÄdÄ“t lapu","ui.setup.document-root.success":"The directory structure on your web server is set up correctly!","ui.setup.document-root.installingProjectDir":"Lietojumprogrammas datnes tiks instalÄ“tas {dir}.","ui.setup.document-root.installingPublicDir":"PubliskÄs datnes tiks instalÄ“tas {dir}.","ui.setup.document-root.installedProjectDir":"Lietojumprogrammas datnes ir instalÄ“tas {dir}.","ui.setup.document-root.installedPublicDir":"PubliskÄs datnes ir instalÄ“tas {dir}.","ui.setup.create-project.headline":"Contao instalÄcija","ui.setup.create-project.description":"Contao development follows the principle of {semver}, a new minor version is released every six months. The currently supported releases are:","ui.setup.create-project.semver":"Semantic Versioning","ui.setup.create-project.latestTitle":"JaunÄkais","ui.setup.create-project.ltsTitle":"Ilgtermiņa atbalsts","ui.setup.create-project.latestQ1":"Our latest version, offers the most features with support until February {year}.","ui.setup.create-project.latestQ3":"Our latest version, offers the most features with support until August {year}.","ui.setup.create-project.ltsText":"Our current LTS version, if you focus on stability. Offers long term support until February {year}.","ui.setup.create-project.pltsText":"The previous LTS version, still has long term support until February {year}.","ui.setup.create-project.requiresPHP":"Requires at least PHP {version}, you have PHP {current}.","ui.setup.create-project.releaseplan":"SÄ«kÄku informÄciju skatiet {contaoReleasePlan}.","ui.setup.create-project.releaseplanLink":"Contao izlaiÅ¡anas plÄns","ui.setup.create-project.installed":"Contao {version} is successfully installed on the server. Continue to set up your database or launch the Contao Manager to install a different version.","ui.setup.create-project.formTitle":"IzvÄ“lÄ“ties distribÅ«ciju","ui.setup.create-project.formText":"LÅ«dzu, izvÄ“lieties, kura versija jÄuzstÄda.","ui.setup.create-project.version":"Versija","ui.setup.create-project.demo":"InstalÄ“t Contao demo vietni","ui.setup.create-project.demoDescription":"The demo website helps you to get familiar with Contao and all of its core features. More themes can be found in the {store}.","ui.setup.create-project.coreOnly":"MinimÄla instalÄcija (tikai Core)","ui.setup.create-project.noUpdate":"Izlaist instalÄciju (tikai eksperts!)","ui.setup.create-project.theme":"Contao tÄ“ma","ui.setup.create-project.themeInstall":"To install a Contao theme, use the search input or upload a theme file (.cto/.zip) that supports installation through the Contao Manager.","ui.setup.create-project.themeBuy":"Noteikti apmeklÄ“jiet oficiÄlo {store}.","ui.setup.create-project.themeStore":"Contao tÄ“mu veikals","ui.setup.create-project.themeUpload":"AugÅ¡upielÄdÄ“t tÄ“mas datni (.cto/.zip)","ui.setup.create-project.themeInvalid":"The uploaded file is not a Contao theme or does not support the Contao Manager.","ui.setup.create-project.themeWarning":"The Contao Manager cannot tell whether this theme is compatible with your server. Please check with the theme vendor if you have any questions.","ui.setup.create-project.themeTitle":"Review theme details","ui.setup.create-project.themeDetails":"The following dependencies and files will be installed with this theme.","ui.setup.create-project.themeRequire":"{count} Dependencies | {count} Dependencies","ui.setup.create-project.themeFiles":"{count} File | {count} Files","ui.setup.create-project.theme.or":"or search public themes","ui.setup.create-project.theme.search":"MeklÄ“t tÄ“mas","ui.setup.create-project.theme.more":"VairÄk tÄ“mas","ui.setup.create-project.theme.empty":"No themes matching {query}","ui.setup.create-project.theme.uploaded":"TÄ“mas datne tika veiksmÄ«gi augÅ¡upielÄdÄ“ta.","ui.setup.create-project.theme.packageName":"Package name","ui.setup.create-project.theme.version":"Versija","ui.setup.create-project.theme.authors":"Autors(i)","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"UzstÄdÄ«t","ui.setup.create-project.cancel":"Atcelt","ui.setup.database-connection.headline":"DatubÄzes savienojums","ui.setup.database-connection.description":"Contao requires a MySQL database (or a compatible fork like MariaDB) to store pages, content, users and other relational data. Connection parameters are stored in the {env} file in the project root of your Contao installation.","ui.setup.database-connection.formTitle":"Savienojuma parametri","ui.setup.database-connection.formText":"Ievadiet datubÄzes URL vai atsevišķi aizpildiet lietotÄjvÄrdu, paroli, serveri un datubÄzes laukus.","ui.setup.database-connection.url":"DatubÄzes URL","ui.setup.database-connection.validUrl":"DatubÄzes URL ir nederÄ«gs vai neizdevÄs izveidot savienojumu ar serveri.","ui.setup.database-connection.or":"vai","ui.setup.database-connection.user":"LietotÄjvÄrds","ui.setup.database-connection.password":"Parole","ui.setup.database-connection.server":"Serveris (:ports)","ui.setup.database-connection.database":"DatubÄzes nosaukums","ui.setup.database-connection.connected":"Successfully connected to database {database} on {server}.","ui.setup.database-connection.error":"Kļūda, savienojoties ar datubÄzi.","ui.setup.database-connection.problem":"Contao ir atklÄjis problÄ“mu ar jÅ«su datubÄzes serveri.","ui.setup.database-connection.schemaTitle":"Database Schema","ui.setup.database-connection.migration":"There is one pending migration. | There are {count} pending migrations.","ui.setup.database-connection.schema":"There is one pending schema update. | There are {count} pending schema updates.","ui.setup.database-connection.noChanges":"JÅ«su datubÄzes shÄ“ma ir aktuÄla.","ui.setup.database-connection.check":"PÄrbaudÄ«t datubÄzi","ui.setup.database-connection.skip":"Izlaist","ui.setup.database-connection.save":"SaglabÄt","ui.setup.database-connection.change":"MainÄ«t akreditÄcijas datus","ui.setup.database-connection.restoreTitle":"DatubÄzes imports","ui.setup.database-connection.restoreText":"The theme you just installed contains a database backup. Restore the database to import theme data or skip this step to start with a blank Contao installation. | The theme you just installed contains multiple database backups. Select a backup file to import theme data or skip this step to start with a blank Contao installation.","ui.setup.database-connection.backup":"DublÄ“jiet paÅ¡reizÄ“jo datu bÄzi pirms importēšanas","ui.setup.database-connection.backupWarning":"All data in database will be overwritten on import! Create a backup first if the database is not empty.","ui.setup.database-connection.restore":"ImportÄ“t tÄ“mas datubÄzi","ui.setup.database-connection.restoreOption":"Backup from {date} ({size})","ui.setup.database-connection.restored":"Your theme database was successfully imported. Continue to validate your database schema.","ui.setup.backend-user.success":"An admin account for the Contao back end was found in your database. Use the Contao back end to add more users.","ui.setup.backend-user.error":"Unable to retrieve user list. Check the console output for details.","ui.setup.backend-user.headline":"Aizmugures konts","ui.setup.backend-user.description":"To manage your website, you need to have at least one admin account for the Contao back end. Be aware that this account is not related to the Contao Manager.","ui.setup.backend-user.formTitle":"Izveidot kontu","ui.setup.backend-user.formText":"Please enter the details for the new back end account.","ui.setup.backend-user.username":"LietotÄjvÄrds","ui.setup.backend-user.name":"VÄrds","ui.setup.backend-user.email":"E-pasta adrese","ui.setup.backend-user.emailInvalid":"LÅ«dzu, ievadiet derÄ«gu e-pasta adresi","ui.setup.backend-user.password":"Parole","ui.setup.backend-user.passwordPlaceholder":"min. 8 rakstzÄ«mes","ui.setup.backend-user.passwordLength":"LÅ«dzu, ievadiet vismaz 8 rakstzÄ«mes.","ui.setup.backend-user.create":"Pievienot kontu","ui.task.headline":"Fona uzdevums","ui.task.loading":"IelÄdÄ“ informÄciju ...","ui.task.created":"IelÄdÄ“ informÄciju ...","ui.task.active":"LÅ«dzu, pagaidiet, kamÄ“r Contao Manager fona režīmÄ tiek veiktas uzdevumu operÄcijas.","ui.task.complete":"Visas operÄcijas ir veiksmÄ«gi pabeigtas. SÄ«kÄku informÄciju skatiet konsoles izvades failÄ.","ui.task.paused":"Fona operÄcija negaidÄ«ti apstÄjÄs. LÅ«dzu, pÄrbaudiet konsoles izvadi.","ui.task.aborting":"LÅ«dzu, uzgaidiet, kamÄ“r tiek atceltas fona operÄcijas.","ui.task.stopped":"Dažas fona darbÄ«bas tika atceltas. LÅ«dzu, pÄrbaudiet konsoles izvadi.","ui.task.error":"Fona operÄcija negaidÄ«ti apstÄjÄs. LÅ«dzu, pÄrbaudiet konsoles izvadi.","ui.task.failed":"Contao pÄrvaldniekam neizdevÄs palaist fona uzdevumu!","ui.task.failedDescription1":"Mēģinot izpildÄ«t operÄcijas fonÄ, kaut kas notika nepareizi.","ui.task.failedDescription2":"Ja tas atkÄrtojas, iespÄ“jams, ka jÅ«su serveris netiek atbalstÄ«ts.","ui.task.reportProblem":"Ziņot par problÄ“mu","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud sponsored by {sponsor}","ui.task.buttonAudit":"AtjauninÄt datubÄzi","ui.task.buttonClose":"AizvÄ“rt","ui.task.buttonConfirm":"ApstiprinÄt & aizvÄ“rt","ui.task.buttonContinue":"TurpinÄt","ui.task.buttonCancel":"Atcelt","ui.task.confirmCancel":"Vai noteikti vÄ“laties atcelt Å¡o uzdevumu? Tas var atstÄt jÅ«su Contao instalÄciju bojÄtÄ stÄvoklÄ«!","ui.task.autoclose":"AizvÄ“rt uzdevuma informÄciju pÄ“c izdoÅ¡anÄs","ui.console.toggle":"RÄdÄ«t/slÄ“pt konsoles izvadi","ui.console.showLog":"RÄdÄ«t pilnu konsoles žurnÄlu","ui.console.copyLog":"KopÄ“t žurnÄlu uz starpliktuvi","ui.migrate.headline":"DatubÄzes atjauninÄjumi","ui.migrate.migrationsOnly":"(migrations only)","ui.migrate.schemaOnly":"(schema only)","ui.migrate.loading":"LÅ«dzu, uzgaidiet, mÄ“s pÄrbaudÄm jÅ«su datubÄzi...","ui.migrate.empty":"No pending migrations or schema updates found. Your database is up to date.","ui.migrate.emptyMigrations":"No pending migrations found. Make sure to also check for schema updates.","ui.migrate.emptySchema":"No pending schema updates found. Make sure to also check for migrations.","ui.migrate.pending":"Your database is not up to date. Please review the console output below and execute the changes.","ui.migrate.previousChanges":"A previous database migration was not confirmed.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.previousComplete":"A previous database migration was not confirmed, please review the console output below.\\nThere are no more pending changes.","ui.migrate.appliedChanges":"Database updates have been applied.\\nPlease review the console output below, then continue to see the next changes.","ui.migrate.appliedComplete":"Database updates have been applied.\\nThere are no more pending migrations or schema updates. Your database is up to date.","ui.migrate.problem":"Contao has detected a problem with your database server.\\nPlease review the console output below to find out what needs to be fixed. | Contao has detected problems with your database server.\\nPlease review the console output below to find out what needs to be fixed.","ui.migrate.warning":"Contao has detected a misconfiguration of your database server.\\nWarnings can be skipped temporarily, but should be fixed for optimal performance and data integrity.","ui.migrate.error":"The changes could not be applied. Your database might have been changed, please check again to retry.","ui.migrate.execute":"IzpildÄ«t","ui.migrate.close":"AizvÄ“rt","ui.migrate.confirm":"ApstiprinÄt & aizvÄ“rt","ui.migrate.cancel":"Atcelt","ui.migrate.continue":"TurpinÄt","ui.migrate.setup":"UzstÄdÄ«t","ui.migrate.skip":"Izlaist","ui.migrate.retry":"PÄrbaudiet vÄ“lreiz","ui.migrate.retryAll":"AtzÄ«mÄ“t visus","ui.migrate.withDeletes":"IzpildÄ«t visas datubÄzes izmaiņas, tostarp DROP vaicÄjumus.","ui.migrate.migrationTitle":"DatubÄzu migrÄcija","ui.migrate.schemaTitle":"ShÄ“mas atjauninÄjumi","ui.migrate.problemTitle":"DatubÄzes problÄ“mas","ui.migrate.warningTitle":"DatubÄzes brÄ«dinÄjumi","ui.migrate.addTable":"Pievienot tabulu {table}","ui.migrate.dropTable":"Nomest tabulu {table}","ui.migrate.addField":"Pievienot lauku {table}.{field}","ui.migrate.changeField":"MainÄ«t lauku {table}.{field}","ui.migrate.dropField":"Nomest lauku {table}.{field}","ui.migrate.createIndex":"Izveidot indeksu \\"{name}\\" uz {table}","ui.migrate.dropIndex":"Nomest indeksu \\"{name}\\" uz {table}","ui.widget.mandatory":"Å is lauks nedrÄ«kst bÅ«t tukÅ¡s.","ui.widget.blankOption":"LÅ«dzu, izvÄ“lieties ...","ui.widget.showPassword":"RÄdÄ«t paroli","ui.widget.hidePassword":"SlÄ“pt paroli","ui.error.title":"HTTP pieprasÄ«jums \\"{metod} {url}\\" neizdevÄs.","ui.error.server500":"Looks like an unexpected error happened on your server. Please check the log files of your web server (Apache/Nginx) and the Contao Manager logs at \\"contao-manager/logs\\".","ui.error.response":"Serveris atbildÄ“ja ar statusa kodu {status}.","ui.error.moreLink":"VairÄk informÄcijas","ui.error.support":"Contao atbalsts","ui.error.permission":"You do not have permission to use this feature.","ui.footer.help":"PalÄ«dzÄ«ba","ui.footer.reportProblem":"Ziņot par problÄ“mu","ui.navigation.discover":"AtklÄt","ui.navigation.packages":"Pakotnes","ui.navigation.tools":"RÄ«ki","ui.navigation.installTool":"Instalēšanas rÄ«ks","ui.navigation.backend":"Contao aizmugure","ui.navigation.debug":"Contao atkļūdoÅ¡anas režīms","ui.navigation.logViewer":"ŽurnÄla skatÄ«tÄjs","ui.navigation.phpinfo":"PHP informÄcija","ui.navigation.phpinfoLoading":"PHP informÄcijas ielÄde...","ui.navigation.maintenance":"Uzturēšana","ui.navigation.rebuildCache":"PÄrbÅ«vÄ“t keÅ¡atmiņu","ui.navigation.users":"Konti","ui.navigation.systemCheck":"SistÄ“mas pÄrbaude","ui.navigation.advanced":"Papildu","ui.navigation.logout":"IzrakstÄ«ties","ui.maintenance.database.title":"DatubÄžu migrÄcija un dublÄ“jumi","ui.maintenance.database.description":"Database migrations ensure consistent data and table schemas.","ui.maintenance.database.migrations":"One pending database migration | {count} pending database migrations","ui.maintenance.database.schemaUpdates":"One pending schema update | {count} pending schema updates","ui.maintenance.database.error":"Atrasta datubÄzes problÄ“ma.","ui.maintenance.database.warning":"Atrasti datubÄzes brÄ«dinÄjumi.","ui.maintenance.database.button":"PÄrbaudÄ«t datubÄzi","ui.maintenance.database.migrationOnly":"PÄrbaudÄ«t tikai migrÄcijas","ui.maintenance.database.schemaOnly":"PÄrbaudÄ«t tikai shÄ“mu","ui.maintenance.database.installTool":"AtvÄ“rt instalēšanas rÄ«ku","ui.maintenance.database.createBackup":"Izveidot dublÄ“jumu","ui.maintenance.database.backupUnsupported":"Database backups are not supported by your Contao version.","ui.maintenance.database.backupList":"You have one database backup, created on {date}. | You have {count} database backups, the latest one was created on {date}.","ui.maintenance.database.backupEmpty":"You currently have no database backups.","ui.maintenance.rebuildCache.title":"Lietojumprogrammas keÅ¡atmiņa","ui.maintenance.rebuildCache.description":"Rebuilding the application cache is required after modifying any of the configuration files.","ui.maintenance.rebuildCache.rebuildProd":"RažoÅ¡anas keÅ¡atmiņas pÄrbÅ«ve","ui.maintenance.rebuildCache.rebuildDev":"IzstrÄdes keÅ¡atmiņas pÄrbÅ«ve","ui.maintenance.rebuildCache.clearProd":"NotÄ«rÄ«t ražoÅ¡anas keÅ¡atmiņu","ui.maintenance.rebuildCache.clearDev":"NotÄ«rÄ«t izstrÄdes keÅ¡atmiņu","ui.maintenance.installTool.title":"Contao instalēšanas rÄ«ks","ui.maintenance.installTool.description":"Contao instalēšanas rÄ«ks tiek automÄtiski bloÄ·Ä“ts, ja trÄ«s reizes pÄ“c kÄrtas ievadÄt nepareizu paroli.","ui.maintenance.installTool.unlock":"AtbloÄ·Ä“t instalēšanas rÄ«ku","ui.maintenance.installTool.lock":"BloÄ·Ä“t instalēšanas rÄ«ku","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"The Composer autoloader is responsible for PHP class loading. The autoloader must be dumped after adding custom namespaces to the root composer.json.","ui.maintenance.dumpAutoload.button":"Dump Autoloader","ui.maintenance.composerInstall.title":"Composer Dependencies","ui.maintenance.composerInstall.description":"Composer dependencies are located in the {vendor} folder in your application root. Reinstalling the dependencies can be necessary after manipulation or manually uploading the {composerLock} file.","ui.maintenance.composerInstall.button":"Palaist instalÄ“tÄju","ui.maintenance.composerInstall.update":"Palaist Composer jauninÄjumu","ui.maintenance.composerCache.title":"Composer keÅ¡atmiņa","ui.maintenance.composerCache.description":"Composer caches downloaded packages for improved performance. If you have issues like broken files, try to delete the Composer cache to force a new download.","ui.maintenance.composerCache.button":"IztÄ«rÄ«t keÅ¡atmiņu","ui.maintenance.maintenanceMode.title":"Uzturēšanas režīms","ui.maintenance.maintenanceMode.description":"Putting Contao in maintenance mode will display a \\"503 Service Unavailable\\" template for the website.","ui.maintenance.maintenanceMode.enable":"IespÄ“jot","ui.maintenance.maintenanceMode.disable":"AtspÄ“jot","ui.maintenance.debugMode.title":"AtkļūdoÅ¡anas režīms","ui.maintenance.debugMode.description":"Activate the debug mode by setting a user and password for the {appDevPhp} entry point.","ui.maintenance.debugMode.descriptionJwt":"Activate the debug mode by setting the debug cookie for the current domain.","ui.maintenance.debugMode.activate":"AktivizÄ“t","ui.maintenance.debugMode.deactivate":"DeaktivizÄ“t","ui.maintenance.debugMode.credentials":"AkreditÄcijas dati","ui.maintenance.debugMode.user":"LÅ«dzu, ievadiet atkļūdoÅ¡anas režīma lietotÄjvÄrdu.","ui.maintenance.debugMode.password":"LÅ«dzu, ievadiet paroli atkļūdoÅ¡anas režīmam.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode caches PHP files on the web process for faster execution. It must be deleted under certain circumstances if files are not recognized after changing.","ui.maintenance.opcodeCache.button":"SaÄ«sinÄt keÅ¡atmiņu","ui.maintenance.safeMode":"Nav pieejams droÅ¡ajÄ režīmÄ","ui.maintenance.unsupported":"Neatbalsta jÅ«su Contao versija","ui.packages.updateButton":"AtjauninÄt pakotnes","ui.packages.searchButton":"MeklÄ“t pakotnes","ui.packages.searchPlaceholder":"MeklÄ“t pakotnes ...","ui.packages.uploadOverlay":"Lai augÅ¡upielÄdÄ“tu, velciet un nometiet failus","ui.packages.uploadButton":"AugÅ¡upielÄdÄ“t pakotnes","ui.packages.uploadMessage":"Jums ir viena neapstiprinÄta augÅ¡upielÄde. | Jums ir {count} neapstiprinÄta/u augÅ¡upielÄde/žu.","ui.packages.uploadApply":"ApstiprinÄt augÅ¡upielÄdi","ui.packages.uploadReset":"DzÄ“st augÅ¡upielÄdes","ui.packages.uploadIncomplete":"Å is datne netika augÅ¡upielÄdÄ“ts pilnÄ«bÄ. LÅ«dzu, noņemiet to un mēģiniet vÄ“lreiz.","ui.packages.uploadDuplicate":"Å Ä·iet, ka šī datne ir augÅ¡upielÄdÄ“ts vairÄkas reizes. LÅ«dzu, izdzÄ“siet dublikÄtus.","ui.packages.uploadInstalled":"Å is datne jau ir instalÄ“ta. LÅ«dzu, izdzÄ“siet dublikÄtus.","ui.packages.uploadUnsupported":"Uploads are not supported in your installation. Please make sure that the PHP ZIP extension is installed and update your dependencies.","ui.packages.changesMessage":"You have one unconfirmed change. | You have {count} unconfirmed changes.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"Pielietot izmaiņas","ui.packages.changesApplyAll":"AtjauninÄt visas pakotnes","ui.packages.changesDryrunAll":"Dry run all packages","ui.packages.changesReset":"AtiestatÄ«t izmaiņas","ui.packages.changesReview":"PÄrskatÄ«t izmaiņas","ui.packagelist.loading":"IelÄdÄ“ ...","ui.packagelist.uploads":"AugÅ¡upielÄdes","ui.packagelist.added":"Jaunas pakotnes","ui.packagelist.installed":"InstalÄ“tÄs pakotnes","ui.package.hintRevert":"Atgriezt izmaiņas","ui.package.hintNoupdate":"NeatjauninÄt","ui.package.hintConstraint":"This package will be installed with constraint {constraint} when you apply the changes.","ui.package.hintConstraintBest":"This package will be installed in the best available version when you apply the changes.","ui.package.hintConstraintChange":"The constraint for this package will be changed from \\"{from}\\" to \\"{to}\\" when you apply the changes.","ui.package.hintConstraintUpdate":"Å Ä« pakotne tiks atjauninÄta, kad piemÄ“rosiet izmaiņas.","ui.package.hintAdded":"Å Ä« pakotne tiks instalÄ“ta, kad piemÄ“rosiet izmaiņas.","ui.package.hintRemoved":"Å Ä« pakotne tiks noņemta, kad piemÄ“rosiet izmaiņas.","ui.package.requiredTitle":"manuÄli pievienots","ui.package.requiredText":"Å Ä« pakotne ir nepiecieÅ¡ama jÅ«su composer.json, bet nav instalÄ“ta.","ui.package.removedTitle":"manuÄli noņemts","ui.package.removedText":"Å Ä« pakotne tika noņemta no jÅ«su composer.json.","ui.package.installed":"PaÅ¡laik instalÄ“ts:","ui.package.version":"Versija {version}","ui.package.additionalDownloads":"{count} LejupielÄde | {count} LejupielÄdes","ui.package.additionalStars":"{count} Star | {count} Stars","ui.package.editConstraint":"Rediģēt","ui.package.uploadConstraint":"This constraint is defined by the uploaded package.","ui.package.updateButton":"JauninÄt","ui.package.removeButton":"Noņemt","ui.package.installButton":"Pievienot pakotni","ui.package.installButtonShort":"Pievienot","ui.package.detailsButton":"SÄ«kÄka informÄcija","ui.package.latestConstraint":"jaunÄkÄ versija","ui.package.update":"Pieejams atjauninÄjums","ui.package.updateLatest":"jaunÄkÄ versija","ui.package.updateAvailable":"Pieejama {versija}","ui.package.updateUnknown":"nezinÄma versija","ui.package.updateConstraint":"A newer version outside your version constraint is available.","ui.package.incompatible":"{package} does not work with Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Versija {version}","ui.cloudStatus.waitingTime":"Gaidīšanas laiks","ui.cloudStatus.jobs":"PaÅ¡reizÄ“jie darbi","ui.cloudStatus.workers":"StrÄdnieki","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"nav","ui.cloudStatus.short":"apt. {minutes} min","ui.cloudStatus.long":"apt. {minutes} min {seconds} sek","ui.cloudStatus.error":"Unable to fetch the status of the Composer Resolver Cloud. It might be down for maintenance or experience issues.","ui.cloudStatus.button":"MÄkoņa statuss","ui.cloudStatus.refresh":"AtjauninÄt mÄkoņa statusu","ui.log-viewer.loading":"IelÄdÄ“ ...","ui.log-viewer.empty":"There are no log files on your server.","ui.log-viewer.reload":"PÄrlÄdÄ“t","ui.log-viewer.file":"ŽurnÄla datne","ui.log-viewer.channel":"KanÄls","ui.log-viewer.channelTitle":"The channel this message was logged to.","ui.log-viewer.level":"LÄ«menis","ui.log-viewer.levelTitle":"Severity of the log message.","ui.log-viewer.timeHeader":"Laiks","ui.log-viewer.messageHeader":"Ziņa","ui.log-viewer.showContext":"RÄdÄ«t kontekstu","ui.log-viewer.hideContext":"SlÄ“pt kontekstu","ui.log-viewer.showExtra":"Show Extra","ui.log-viewer.hideExtra":"Hide Extra","ui.log-viewer.more":"Load more …","ui.log-viewer.download":"LejupielÄdÄ“t","ui.log-viewer.downloadTitle":"LejupielÄdÄ“t datni \\"{file}\\"","ui.log-viewer.prodEnvironment":"Production Environment","ui.log-viewer.devEnvironment":"Development Environment (Debug Mode)","ui.user-manager.loading":"Loading users …","ui.user-manager.changePassword":"MainÄ«t paroli","ui.user-manager.setupTotp":"Divfaktoru autentifikÄcijas iestatīšana","ui.user-manager.disableTotp":"AtspÄ“jot divfaktoru autentifikÄciju","ui.user-manager.invite":"UzaicinÄt lietotÄju","ui.user-manager.delete":"DzÄ“st","ui.user-manager.deleteConfirm":"Vai tieÅ¡Äm vÄ“laties dzÄ“st lietotÄju “{username}â€?","ui.user-manager.deleted":"LietotÄjs {username} veiksmÄ«gi dzÄ“sts","ui.user-manager.passwordHeadline":"MainÄ«t paroli","ui.user-manager.passwordText":"To change your password, please enter the current and a new password in the respective fields.","ui.user-manager.currentPassword":"PaÅ¡reizÄ“jÄ parole","ui.user-manager.newPassword":"Jauna parole","ui.user-manager.passwordPlaceholder":"min. 8 rakstzÄ«mes","ui.user-manager.submitPassword":"Iesniegt","ui.user-manager.passwordChanged":"JÅ«su parole ir veiksmÄ«gi nomainÄ«ta.","ui.user-manager.passwordError":"Å Ä« parole ir nepareiza.","ui.user-manager.inviteHeadline":"UzaicinÄt lietotÄju","ui.user-manager.inviteText":"If you need multiple logins for the Contao Manager, you can create an invitation link here. Share this link with someone or use it on another device to create a new account with the given permissions.","ui.user-manager.inviteSuccess1":"A new invitation link was created. The URL below can be used to create a new user account for this Contao Manager. The invitation expires on {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Please copy the link to your clipboard. It will only work once and you will not be able to see it again after closing this dialog.","ui.user-manager.createInvitation":"Izveidot ielÅ«guma saiti","ui.user-manager.clipboard":"KopÄ“t uz starpliktuvi","ui.user-manager.permissions":"UzzinÄt par atļaujÄm","ui.user-manager.cancel":"Atcelt","ui.user-manager.close":"AizvÄ“rt","ui.user-manager.you":"JÅ«s","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Divfaktoru autentifikÄcija","ui.totp.setupQr":"Please scan the QR code with your 2FA/TOTP app.","ui.totp.setupCode":"If you cannot scan the QR code, enter this key instead:","ui.totp.codeLabel":"VerifikÄcijas kods","ui.totp.codeDescription":"Please enter the verification code generated by your 2FA/TOTP app.","ui.totp.disableText":"Please enter the verification code to disable two-factor authentication.","ui.totp.invalid":"VerifikÄcijas kods ir nederÄ«gs.","ui.totp.enable":"IespÄ“jot","ui.totp.disable":"AtspÄ“jot","ui.totp.cancel":"Atcelt","ui.totp.enabled":"Two-factor authentication was enabled successfully.","ui.totp.disabled":"Two-factor authentication was disabled successfully.","ui.totp.setup":"IestatÄ«t divfaktoru autentifikÄciju","ui.totp.skip":"Izlaist divfaktoru autentifikÄciju"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[335],{1035:function(e,s,c){c.r(s),c.d(s,{default:function(){return V}});var i=c(641),l=c(33),o=c(3751),t=c.p+"img/server-config.1a2d0888.svg";const n={class:"config-check__header"},r={class:"config-check__headline"},a={class:"config-check__description"},d={class:"config-check__form"},u={class:"config-check__fields"},g={class:"config-check__fieldtitle"},h={class:"config-check__fielddesc"},f={class:"config-check__fields"},_={class:"config-check__fieldtitle"},p={class:"config-check__fielddesc"},k={key:0,class:"config-check__issues"},v=["disabled"];function b(e,s,c,b,m,L){const $=(0,i.g2)("text-field"),w=(0,i.g2)("check-box"),C=(0,i.g2)("loading-button"),x=(0,i.g2)("boxed-layout");return(0,i.uX)(),(0,i.Wv)(x,{wide:!0,slotClass:"config-check"},{default:(0,i.k6)((()=>[(0,i.Lk)("header",n,[s[4]||(s[4]=(0,i.Lk)("img",{src:t,width:"80",height:"80",class:"config-check__icon",alt:""},null,-1)),(0,i.Lk)("h1",r,(0,l.v_)(e.$t("ui.server.config.title")),1),(0,i.Lk)("p",a,(0,l.v_)(e.$t("ui.server.config.description")),1)]),(0,i.Lk)("main",d,[(0,i.Lk)("form",{onSubmit:s[3]||(s[3]=(0,o.D$)(((...e)=>L.save&&L.save(...e)),["prevent"]))},[(0,i.Lk)("fieldset",u,[(0,i.Lk)("legend",g,(0,l.v_)(e.$t("ui.server.config.formTitle")),1),(0,i.Lk)("p",h,(0,l.v_)(e.$t("ui.server.config.formText")),1),(0,i.bF)($,{ref:"cli",name:"php_cli",label:e.$t("ui.server.config.cli"),required:"",disabled:e.processing,error:e.error,modelValue:e.php_cli,"onUpdate:modelValue":s[0]||(s[0]=s=>e.php_cli=s)},null,8,["label","disabled","error","modelValue"])]),(0,i.Lk)("fieldset",f,[(0,i.Lk)("legend",_,(0,l.v_)(e.$t("ui.server.config.cloudTitle")),1),(0,i.Lk)("p",p,(0,l.v_)(e.$t("ui.server.config.cloudText")),1),e.cloudIssues&&e.cloudIssues.length?((0,i.uX)(),(0,i.CE)("div",k,[(0,i.Lk)("p",null,(0,l.v_)(e.$t("ui.server.config.stateErrorCloud")),1),(0,i.Lk)("ul",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.cloudIssues,((e,s)=>((0,i.uX)(),(0,i.CE)("li",{key:s},(0,l.v_)(e),1)))),128))])])):(0,i.Q3)("",!0),(0,i.bF)(w,{name:"cloud",label:e.$t("ui.server.config.cloud"),disabled:e.processing,modelValue:e.cloud,"onUpdate:modelValue":s[1]||(s[1]=s=>e.cloud=s)},null,8,["label","disabled","modelValue"])]),(0,i.bF)(C,{submit:"",color:"primary",disabled:!e.php_cli,loading:e.processing},{default:(0,i.k6)((()=>[(0,i.eW)((0,l.v_)(e.$t("ui.server.config.save")),1)])),_:1},8,["disabled","loading"]),(0,i.Lk)("button",{type:"button",class:"widget-button",disabled:e.processing,onClick:s[2]||(s[2]=(...e)=>L.cancel&&L.cancel(...e))},(0,l.v_)(e.$t("ui.server.config.cancel")),9,v)],32)])])),_:1})}var m=c(728),L=c(9757),$=c(3480),w=c(85),C=c(707),x={components:{BoxedLayout:m.A,TextField:L.A,CheckBox:$.A,LoadingButton:w.A},data:()=>({processing:!0,error:"",php_cli:"",cloud:!0,cloudIssues:[]}),methods:{async save(){this.processing=!0,this.error="";const e={php_cli:this.php_cli,cloud:this.cloud},s=await this.$store.dispatch("server/config/set",e);400===s.status&&s.detail?(this.error=s.detail,this.processing=!1,setTimeout((()=>{this.$refs.cli.focus()}),0)):window.location.reload(!0)},cancel(){this.$store.commit("setView",C.A.BOOT)}},async mounted(){const e=await this.$store.dispatch("server/config/get");this.php_cli=e.php_cli,this.cloud=e.cloud.enabled,this.cloudIssues=e.cloud.issues,this.processing=!1}},y=c(6262);const T=(0,y.A)(x,[["render",b]]);var V=T}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[367],{7390:function(e,r,t){t.r(r),t.d(r,{default:function(){return b}});var o=t(641),i=t(33),a=t.p+"img/recovery.70ee118a.svg";const s={class:"view-recovery__header"},n={class:"view-recovery__headline"},c={class:"view-recovery__content"},l={class:"view-recovery__description"},d={class:"view-recovery__description"},u={class:"view-recovery__option"},v={key:0,class:"view-recovery__failed"},p={class:"view-recovery__option"},h=["disabled"];function _(e,r,t,_,k,y){const w=(0,o.g2)("console-output"),m=(0,o.g2)("loading-button"),f=(0,o.g2)("boxed-layout");return(0,o.uX)(),(0,o.Wv)(f,{wide:!0,slotClass:"view-recovery"},{default:(0,o.k6)((()=>[(0,o.Lk)("header",s,[r[1]||(r[1]=(0,o.Lk)("img",{src:a,width:"80",height:"80",alt:"",class:"view-recovery__icon"},null,-1)),(0,o.Lk)("h1",n,(0,i.v_)(e.$t("ui.recovery.headline")),1)]),(0,o.Lk)("main",c,[(0,o.Lk)("p",l,(0,i.v_)(e.$t("ui.recovery.description")),1),console?((0,o.uX)(),(0,o.Wv)(w,{key:0,class:"view-recovery__console",title:e.$t("ui.recovery.console"),operations:[{status:"error",summary:"vendor/bin/contao-console list",console:this.error}],"console-output":e.error,"show-console":"","force-console":""},null,8,["title","operations","console-output"])):(0,o.Q3)("",!0),(0,o.Lk)("p",d,(0,i.v_)(e.$t("ui.recovery.repairOptions")),1),(0,o.Lk)("div",u,[(0,o.Lk)("h3",null,(0,i.v_)(e.$t("ui.recovery.repairHeadline")),1),(0,o.Lk)("p",null,(0,i.v_)(e.$t("ui.recovery.repairDescription")),1),(0,o.Lk)("p",null,[(0,o.Lk)("strong",null,(0,i.v_)(e.$t("ui.recovery.repairWarning")),1)]),e.repairFailed?((0,o.uX)(),(0,o.CE)("p",v,(0,i.v_)(e.$t("ui.recovery.repairFailed")),1)):(0,o.Q3)("",!0),(0,o.bF)(m,{inline:"",color:"alert",icon:"run",disabled:e.repairFailed,loading:e.repairStarted&&!e.repairFailed,onClick:y.runRepair},{default:(0,o.k6)((()=>[(0,o.eW)((0,i.v_)(e.$t("ui.recovery.repairButton")),1)])),_:1},8,["disabled","loading","onClick"])]),(0,o.Lk)("div",p,[(0,o.Lk)("h3",null,(0,i.v_)(e.$t("ui.recovery.safeModeHeadline")),1),(0,o.Lk)("p",null,(0,i.v_)(e.$t("ui.recovery.safeModeDescription")),1),(0,o.Lk)("button",{class:"widget-button widget-button--inline widget-button--primary",disabled:e.repairStarted&&!e.repairFailed,onClick:r[0]||(r[0]=(...e)=>y.runSafeMode&&y.runSafeMode(...e))},(0,i.v_)(e.$t("ui.recovery.safeModeButton")),9,h)])])])),_:1})}var k=t(6278),y=t(707),w=t(728),m=t(85),f=t(2864),g={components:{BoxedLayout:w.A,LoadingButton:m.A,ConsoleOutput:f.A},data:()=>({repairStarted:!1,repairFailed:!1,error:""}),computed:{...(0,k.aH)("tasks",{taskStatus:"status"})},methods:{async runRepair(){let e;this.repairStarted=!0;const r=[{name:"contao/rebuild-cache"},{name:"composer/install"},{name:"composer/install",config:{"remove-vendor":!0}}];while(void 0!==(e=r.shift()))try{return await this.$store.dispatch("tasks/execute",e),await this.$store.dispatch("tasks/deleteCurrent"),void window.location.reload(!0)}catch(t){if("failed"===this.taskStatus){await this.$store.dispatch("tasks/deleteCurrent");break}await this.$store.dispatch("tasks/deleteCurrent")}this.repairFailed=!0},runSafeMode(){this.$store.commit("setSafeMode",!0),this.$store.commit("setView",y.A.READY)}},async mounted(){const e=await this.$store.dispatch("server/contao/get");502===e.status&&e.data.error&&(this.error=e.data.error)}},$=t(6262);const L=(0,$.A)(g,[["render",_]]);var b=L}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[542],{7542:function(e){e.exports=JSON.parse('{"ui.app.title":"Contao 扩展","ui.app.loading":"扩展列表加载中 …","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Advertisement in the extension list","ui.discover.loading":"加载 …","ui.discover.offline":"无法获å–任何结果","ui.discover.offlineExplain":"检查网络连接并在æµè§ˆå™¨ä¸­ç¦ç”¨JavaScript拦截器。","ui.discover.offlineButton":"é‡è¯•","ui.discover.searchPlaceholder":"Search in {count} extensions …","ui.discover.empty":"No results for {query}","ui.discover.more":"更多","ui.discover.sortBy":"排åº","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"已更新","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"下载","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"评级","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"详情","ui.discover.latestPackages":"最新和已更新扩展","ui.discover.faversPackages":"最高评级扩展","ui.discover.downloadsPackages":"下载最多扩展","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"项目网站","ui.package.private":"ç§æœ‰åŒ…","ui.package.privateTitle":"ç§æœ‰åŒ…ä»…å¯ä»Žæä¾›å•†èŽ·å– (e.g. ZIP 下载)ã€‚è¯·è®¿é—®ç½‘ç«™èŽ·å–æ›´å¤šä¿¡æ¯ã€‚","ui.package.abandoned":"放弃","ui.package.abandonedText":"该程åºåŒ…已放弃ä¸å†ç»´æŠ¤ã€‚","ui.package.abandonedReplace":"该程åºåŒ…已放弃ä¸å†ç»´æŠ¤ã€‚作者建议使用 {replacement} 包替代.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"以å‰çš„æ‰©å±•详细信æ¯","ui.package-details.close":"关闭扩展详情","ui.package-details.loading":"加载 …","ui.package-details.tabDescription":"æè¿°","ui.package-details.tabRequire":"需求","ui.package-details.tabFeatures":"特å¾","ui.package-details.tabSuggest":"建议","ui.package-details.tabConflict":"冲çª","ui.package-details.tabDependents":"ä¾èµ–","ui.package-details.linkRequires":"需è¦","ui.package-details.linkReplaces":"替æ¢","ui.package-details.linkProvides":"æä¾›","ui.package-details.linkConflicts":"冲çª","ui.package-details.funding":"Fund package maintenance!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"最新版","ui.package-details.released":"å‘布于","ui.package-details.license":"许å¯(s)","ui.package-details.authors":"from","ui.package-details.more":"更多","ui.package-details.packagist":"包详情","ui.package-details.metadata":"编辑元数æ®","ui.package-details.support_docs":"文档","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"支æŒè®ºå›","ui.package-details.support_issues":"问题 / 错误 报告","ui.package-details.support_source":"æºä»£ç ","ui.package-details.support_irc":"IRC / èŠå¤©","ui.package-details.support_email":"æ”¯æŒ E-Mail","ui.package-details.support_rss":"RSS"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[874],{2874:function(e){e.exports=JSON.parse('{"ui.app.title":"Rozšíření Contaa","ui.app.loading":"NaÄítání seznamu rozšíření...","ui.app.language":"ZmÄ›nit jazyk Správce Contaa","ui.app.colorDark":"Tmavé zobrazení","ui.app.colorDarkTitle":"ZmÄ›nit na tmavé prostÅ™edí","ui.app.colorLight":"SvÄ›tlé zobrazení","ui.app.colorLightTitle":"ZmÄ›nit na svÄ›tlé prostÅ™edí","ui.discover.advertisement":"Reklama v seznamu rozšíření","ui.discover.loading":"SpouÅ¡tÄ›ní…","ui.discover.offline":"Nemůžu naÄíst žádné výsledky.","ui.discover.offlineExplain":"Zkontrolujte prosím VaÅ¡e internetové pÅ™ipojení a deaktivujte blokování JavaScriptu ve VaÅ¡em prohlížeÄi.","ui.discover.offlineButton":"Zkusit znovu","ui.discover.searchPlaceholder":"Prohledat {count} rozšíření...","ui.discover.empty":"Žádné výsledky pro {query}","ui.discover.more":"Více výsledků","ui.discover.sortBy":"SeÅ™adit podle","ui.discover.sortReleased":"ZveÅ™ejnÄ›no","ui.discover.sortReleasedTitle":"SeÅ™adit výsledky podle zveÅ™ejnÄ›ní","ui.discover.sortLatest":"Zaktualizované","ui.discover.sortLatestTitle":"SeÅ™adit výsledky podle naposledy zaktualizovaných","ui.discover.sortDownloads":"Stažení","ui.discover.sortDownloadsTitle":"SeÅ™adit výsledky podle poÄtu stažení","ui.discover.sortFavers":"Hodnocení","ui.discover.sortFaversTitle":"SeÅ™adit výsledky podle hodnocení","ui.discover.detailsButton":"Podrobnosti","ui.discover.latestPackages":"Poslední a naposledy zaktualizovaná rozšíření","ui.discover.faversPackages":"Nejlépe hodnocená rozšíření","ui.discover.downloadsPackages":"Nejvíce stahovaná rozšíření","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Stránka projektu","ui.package.private":"Soukromý balíÄek","ui.package.privateTitle":"Soukromé balíÄky jsou dostupné pouze z vendoru (napÅ™. jako soubor ZIP). Více informací získáte na následujícím webu. ","ui.package.abandoned":"nepÅ™ijatý","ui.package.abandonedText":"Tento balíÄek je oznaÄený jako nepÅ™ijatý a již se dál vyvíjí.","ui.package.abandonedReplace":"Tento balíÄek je oznaÄený jako nepÅ™ijatý a již se dál vyvíjí. Autor místo nÄ›ho doporuÄuje použít {replacement}. ","ui.package.contaoVersion":"Dostupné pro Contao","ui.package-details.previous":"PÅ™edeÅ¡lé podrobné informace k rozšíření","ui.package-details.close":"Zavřít podrobné informace k rozšíření","ui.package-details.loading":"SpouÅ¡tÄ›ní…","ui.package-details.tabDescription":"Popis","ui.package-details.tabRequire":"Požadavky","ui.package-details.tabFeatures":"Funkce","ui.package-details.tabSuggest":"DoporuÄení","ui.package-details.tabConflict":"Konflikty","ui.package-details.tabDependents":"Závislosti","ui.package-details.linkRequires":"vyžaduje","ui.package-details.linkReplaces":"nahrazuje","ui.package-details.linkProvides":"poskytuje","ui.package-details.linkConflicts":"konflikty","ui.package-details.funding":"Nalezen vyvíjený balíÄek!","ui.package-details.contaoVersions":"Podporováno verzí Contaa","ui.package-details.latest":"Poslední verze","ui.package-details.released":"ZveÅ™ejnÄ›no","ui.package-details.license":"Licence","ui.package-details.authors":"od","ui.package-details.more":"Více","ui.package-details.packagist":"Podrobnosti k balíÄku","ui.package-details.metadata":"Upravit meta informace","ui.package-details.support_docs":"Dokumentace","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Podpora ve fóru","ui.package-details.support_issues":"Chyby / nahlášení chyb","ui.package-details.support_source":"Zdrojový kód","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Mail podpory","ui.package-details.support_rss":"Kanál RSS"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[180],{2180:function(e){e.exports=JSON.parse('{"ui.app.title":"Extensiones Contao","ui.app.loading":"Cargando lista de extensiones ...","ui.app.language":"Cambiar idioma para el Contao Manager","ui.app.colorDark":"Modo oscuro","ui.app.colorDarkTitle":"Cambiar el esquema de color a oscuro","ui.app.colorLight":"Modo claro","ui.app.colorLightTitle":"Cambiar el esquema de color a claro","ui.discover.advertisement":"Aviso en la lista de extensiones","ui.discover.loading":"Cargando ...","ui.discover.offline":"No se pudo obtener ningún resultado.","ui.discover.offlineExplain":"Verifique su conexión a Internet y desactive los bloqueadores de JavaScript en su navegador.","ui.discover.offlineButton":"Inténtelo de nuevo","ui.discover.searchPlaceholder":"Buscar en {count} extensiones…","ui.discover.empty":"No hay resultados para {query}","ui.discover.more":"Más resultados","ui.discover.sortBy":"Ordenar por","ui.discover.sortReleased":"Publicado","ui.discover.sortReleasedTitle":"Ordenar resultados por fecha de lanzamiento","ui.discover.sortLatest":"Actualizado","ui.discover.sortLatestTitle":"Ordenar resultados por última actualización","ui.discover.sortDownloads":"Descargas","ui.discover.sortDownloadsTitle":"Ordenar resultados por número de descargas","ui.discover.sortFavers":"Clasificación","ui.discover.sortFaversTitle":"Ordenar resultados por calificación","ui.discover.detailsButton":"Detalles","ui.discover.latestPackages":"Extensiones más recientes y actualizadas","ui.discover.faversPackages":"Extensiones mejor calificadas","ui.discover.downloadsPackages":"Extensiones más descargadas","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Sitio web del proyecto","ui.package.private":"Paquete privado","ui.package.privateTitle":"Los paquetes privados solo están disponibles por parte del proveedor (por ejemplo, como descarga ZIP). Por favor, visite el sitio web para más información.","ui.package.abandoned":"abandonado","ui.package.abandonedText":"Este paquete está abandonado y ya no se mantiene.","ui.package.abandonedReplace":"su paquete es abandonado y ya no se mantiene. El autor sugiere usar el paquete {replacement} en su lugar.","ui.package.contaoVersion":"Disponible para Contao","ui.package-details.previous":"Detalles de extensiones anteriores","ui.package-details.close":"Cerrar detalles de extensión","ui.package-details.loading":"Cargando ...","ui.package-details.tabDescription":"Descripción","ui.package-details.tabRequire":"Requisitos","ui.package-details.tabFeatures":"Caracteristicas","ui.package-details.tabSuggest":"Sugerencias","ui.package-details.tabConflict":"Conflictos","ui.package-details.tabDependents":"Dependientes","ui.package-details.linkRequires":"requiere","ui.package-details.linkReplaces":"reemplaza","ui.package-details.linkProvides":"provee","ui.package-details.linkConflicts":"conflictos","ui.package-details.funding":"Mantenimiento del Fund Package!","ui.package-details.contaoVersions":"Version(es) compatible(s) de Contao","ui.package-details.latest":"Última versión","ui.package-details.released":"publicado el","ui.package-details.license":"Licencia(s)","ui.package-details.authors":"de","ui.package-details.more":"Más","ui.package-details.packagist":"Detalles del paquete","ui.package-details.metadata":"Editar metadatos","ui.package-details.support_docs":"Documentación","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Foro de sopporte","ui.package-details.support_issues":"Problemas / Informe de error","ui.package-details.support_source":"Código fuente","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Email del soporte ","ui.package-details.support_rss":"RSS Feed"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[716],{3716:function(e){e.exports=JSON.parse('{"ui.app.title":"Rozszerzenia Contao","ui.app.loading":"Åadowanie listy rozszerzeÅ„ …","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Reklama w liÅ›cie rozszerzeÅ„","ui.discover.loading":"Åadowanie …","ui.discover.offline":"Nie znaleziono żadnych wyników.","ui.discover.offlineExplain":"Sprawdź swoje połączenie internetowe i wyłącz narzÄ™dzia blokujÄ…ce JavaScript w przeglÄ…darce.","ui.discover.offlineButton":"Spróbuj ponownie","ui.discover.searchPlaceholder":"Szukaj w {count} rozszerzeniach ...","ui.discover.empty":"Brak wyników dla {query}","ui.discover.more":"WiÄ™cej Wyników","ui.discover.sortBy":"Sortuj wedÅ‚ug","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"Data aktualizacji","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"Pobrania","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"Ocena","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"Szczegóły","ui.discover.latestPackages":"Najnowsze i zaktualizowane rozszerzenia","ui.discover.faversPackages":"Najwyżej oceniane rozszerzenia","ui.discover.downloadsPackages":"Najczęściej pobierane rozszerzenia","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Strona Projektu","ui.package.private":"Prywatny Pakiet","ui.package.privateTitle":"Prywatne pakiety sÄ… dostÄ™pne tylko bezpoÅ›rednio od dostawcy (np. jako plik ZIP). Odwiedź stronÄ™ po wiÄ™cej informacji.","ui.package.abandoned":"porzucony","ui.package.abandonedText":"Ten pakiet jest porzucony i nie jest już wspierany.","ui.package.abandonedReplace":"Ten pakiet jest porzucony i nie jest już wspierany. Autor sugeruje użycie pakietu {replacement} zamiast niego.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"Szczegóły poprzedniego rozszerzenia","ui.package-details.close":"Zamknij szczegóły rozszerzenia","ui.package-details.loading":"Åadowanie …","ui.package-details.tabDescription":"Opis","ui.package-details.tabRequire":"Wymagania","ui.package-details.tabFeatures":"FunkcjonalnoÅ›ci","ui.package-details.tabSuggest":"Sugestie","ui.package-details.tabConflict":"Konflikty","ui.package-details.tabDependents":"ZależnoÅ›ci","ui.package-details.linkRequires":"wymaga","ui.package-details.linkReplaces":"zastÄ™puje","ui.package-details.linkProvides":"dostarcza","ui.package-details.linkConflicts":"koliduje","ui.package-details.funding":"Finansuj rozwój pakietu!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"Ostatnia wersja","ui.package-details.released":"data wydania","ui.package-details.license":"Licencje","ui.package-details.authors":"od","ui.package-details.more":"WiÄ™cej","ui.package-details.packagist":"Szczegóły Pakietu","ui.package-details.metadata":"Edytuj metadane","ui.package-details.support_docs":"Dokumentacja","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Forum","ui.package-details.support_issues":"Issues / Bug Report","ui.package-details.support_source":"Kod źródÅ‚owy","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Wsparcie E-mail","ui.package-details.support_rss":"KanaÅ‚ RSS"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[474],{1474:function(a,e,t){t.r(e),t.d(e,{default:function(){return Ba}});var s=t(641),n=t(33);const i={class:"package-popup__installed"},l=["dateTime","title"],o=["href"],p={key:3},c={class:"package-popup__update"},r={class:"package-popup__incompatible"};function u(a,e,t,u,d,k){const g=(0,s.g2)("package-constraint"),m=(0,s.g2)("install-button"),h=(0,s.g2)("package-details",!0);return(0,s.uX)(),(0,s.Wv)(h,{local:k.data,dependents:k.dependents},(0,s.eX)({"package-actions":(0,s.k6)((()=>[(0,s.RG)(a.$slots,"package-actions",{},(()=>[a.isInstalled?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[!a.isFeature&&a.isVisible?((0,s.uX)(),(0,s.Wv)(g,{key:0,data:k.data},null,8,["data"])):(0,s.Q3)("",!0),(0,s.Lk)("p",i,[(0,s.Lk)("strong",null,(0,n.v_)(a.$t("ui.package.installed")),1),a.installedTime?((0,s.uX)(),(0,s.CE)("time",{key:0,dateTime:a.installedTime,title:k.datimFormat(a.installedTime)},(0,n.v_)(a.$t("ui.package.version",{version:a.installedVersion})),9,l)):((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.eW)((0,n.v_)(a.$t("ui.package.version",{version:a.installedVersion})),1)],64))])],64)):a.canBeInstalled||a.isRequired?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.bF)(m,{data:k.data},null,8,["data"]),a.isAdded||a.isRequired?((0,s.uX)(),(0,s.Wv)(g,{key:0,data:k.data},null,8,["data"])):(0,s.Q3)("",!0)],64)):a.isPrivate?((0,s.uX)(),(0,s.CE)("a",{key:2,class:"widget-button widget-button--primary widget-button--link",target:"_blank",href:a.metadata.homepage},(0,n.v_)(a.$t("ui.package.homepage")),9,o)):((0,s.uX)(),(0,s.CE)("div",p))]))])),"suggest-actions":(0,s.k6)((({name:e})=>[a.packageSuggested(e)?((0,s.uX)(),(0,s.Wv)(m,{key:0,inline:"",small:"",data:{name:e}},null,8,["data"])):(0,s.Q3)("",!0)])),"features-actions":(0,s.k6)((({name:e})=>[!a.hasRoot||a.packageInstalled(e)||a.packageRoot(e)?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.Wv)(m,{key:0,inline:"",small:"",data:{name:e}},null,8,["data"]))])),_:2},[a.metadata.update&&a.metadata.update.valid&&!a.metadata.update.latest?{name:"package-update",fn:(0,s.k6)((()=>[(0,s.Lk)("p",c,[(0,s.Lk)("strong",null,(0,n.v_)(a.$t("ui.package.update"))+":",1),(0,s.eW)(" "+(0,n.v_)(a.$t("ui.package.version",{version:a.metadata.update.version}))+" ("+(0,n.v_)(a.$t("ui.package-details.released"))+" "+(0,n.v_)(k.datimFormat(a.metadata.update.time,"short","long"))+") ",1)])])),key:"0"}:a.isCompatible?void 0:{name:"package-update",fn:(0,s.k6)((()=>[(0,s.Lk)("p",r,(0,n.v_)(a.$t("ui.package.incompatible",{package:k.data.name,constraint:a.packageConstraint("contao/manager-bundle")})),1)])),key:"1"}]),1032,["local","dependents"])}t(8111),t(7588);var d=t(6278),k=t(4210),g=t(8200);const m={class:"package-popup__headline"},h=["title"],_=["title"],v={key:0,class:"package-popup__loader"},b={class:"package-popup__summary"},f={class:"package-popup__text"},y={class:"package-popup__title"},$={key:0,class:"package-popup__authors"},C=["href"],X={class:"package-popup__statistics"},E=["title"],L={key:1,class:"package-popup__stats package-popup__stats--updated"},w={key:2,class:"package-popup__stats package-popup__stats--downloads"},F={key:3,class:"package-popup__stats package-popup__stats--favers"},A={class:"package-popup__actions"},W=["href"],Q=["href"],T={class:"package-popup__tabs"},x={class:"package-popup__tabs-list"},P={key:0,class:"package-popup__abandoned"},R={key:2},q={key:3},B={key:4},I={class:"package-popup__description"};function G(a,e,t,i,l,o){const p=(0,s.g2)("loading-spinner"),c=(0,s.g2)("package-logo"),r=(0,s.g2)("more-links"),u=(0,s.g2)("details-tab"),d=(0,s.g2)("router-link"),k=(0,s.g2)("i18n-t"),g=(0,s.g2)("package-funding"),G=(0,s.g2)("details-content"),O=(0,s.g2)("popup-overlay");return(0,s.uX)(),(0,s.Wv)(O,{fixed:!0,"popup-class":"package-popup",tabindex:"-1",onClear:e[8]||(e[8]=e=>a.clearCurrent())},{content:(0,s.k6)((()=>[(0,s.Lk)("div",m,[a.hasPrevious?((0,s.uX)(),(0,s.CE)("button",{key:0,class:"package-popup__button package-popup__button--previous",title:a.$t("ui.package-details.previous"),onClick:e[0]||(e[0]=e=>a.$router.go(-1))},e[9]||(e[9]=[(0,s.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"#fff",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,s.Lk)("path",{d:"M21 11H6.83l3.58-3.59L9 6l-6 6 6 6 1.41-1.41L6.83 13H21z"})],-1)]),8,h)):(0,s.Q3)("",!0),(0,s.eW)(" "+(0,n.v_)(o.data.name)+" ",1),(0,s.Lk)("button",{class:"package-popup__button package-popup__button--close",title:a.$t("ui.package-details.close"),onClick:e[1]||(e[1]=e=>a.clearCurrent())},e[10]||(e[10]=[(0,s.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",fill:"#fff",xmlns:"http://www.w3.org/2000/svg"},[(0,s.Lk)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"})],-1)]),8,_)]),a.metadata&&a.metadata.hasOwnProperty("name")?((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.Lk)("div",b,[(0,s.bF)(c,{class:"package-popup__logo","component-class":"package-popup__icon",src:a.metadata.logo},null,8,["src"]),(0,s.Lk)("div",f,[(0,s.Lk)("h1",y,(0,n.v_)(a.metadata.title||o.data.name),1),o.authors?((0,s.uX)(),(0,s.CE)("p",$,[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.authors"))+" ",1),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(o.authors,((a,e)=>((0,s.uX)(),(0,s.CE)(s.FK,null,[a.homepage?((0,s.uX)(),(0,s.CE)("a",{class:"package-popup__author",key:e,href:a.homepage,target:"_blank",rel:"noreferrer noopener"},(0,n.v_)(a.name),9,C)):((0,s.uX)(),(0,s.CE)("span",{class:"package-popup__author",key:e},(0,n.v_)(a.name),1))],64)))),256))])):(0,s.Q3)("",!0),(0,s.Lk)("p",X,[a.metadata.private?((0,s.uX)(),(0,s.CE)("span",{key:0,class:"package-popup__stats package-popup__stats--private",title:a.$t("ui.package.privateTitle")},(0,n.v_)(a.$t("ui.package.private")),9,E)):(0,s.Q3)("",!0),a.metadata.updated?((0,s.uX)(),(0,s.CE)("span",L,(0,n.v_)(o.datimFormat(a.metadata.updated,!1)),1)):(0,s.Q3)("",!0),a.metadata.downloads>0?((0,s.uX)(),(0,s.CE)("span",w,(0,n.v_)(o.numberFormat(a.metadata.downloads)),1)):(0,s.Q3)("",!0),a.metadata.favers>0?((0,s.uX)(),(0,s.CE)("span",F,(0,n.v_)(o.numberFormat(a.metadata.favers)),1)):(0,s.Q3)("",!0),(0,s.bF)(r,{name:a.metadata.name,homepage:a.metadata.homepage,support:Object.assign({},a.metadata.support),metadata:a.metadata.metadata,"hide-packagist":a.metadata.private},null,8,["name","homepage","support","metadata","hide-packagist"])])]),(0,s.Lk)("div",A,[(0,s.RG)(a.$slots,"package-actions",(0,n._B)((0,s.Ng)({data:a.metadata})),(()=>[a.metadata&&a.metadata.homepage?((0,s.uX)(),(0,s.CE)("a",{key:0,class:"widget-button widget-button--primary widget-button--link",target:"_blank",href:a.metadata.homepage},(0,n.v_)(a.$t("ui.package.homepage")),9,W)):a.metadata.private?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("a",{key:1,class:"widget-button widget-button--primary widget-button--link",target:"_blank",href:`https://packagist.org/packages/${o.data.name}`},(0,n.v_)(a.$t("ui.package-details.packagist")),9,Q))]))])]),(0,s.Lk)("div",T,[(0,s.Lk)("ul",x,[(0,s.bF)(u,{"show-empty":"",links:!1,active:""===o.tab,onClick:e[2]||(e[2]=a=>o.setTab(""))},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.tabDescription")),1)])),_:1},8,["active"]),a.metadata.features?((0,s.uX)(),(0,s.Wv)(u,{key:0,highlight:"",links:a.metadata.features,active:"features"===o.tab,onClick:e[3]||(e[3]=a=>o.setTab("features"))},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.tabFeatures")),1)])),_:1},8,["links","active"])):(0,s.Q3)("",!0),(0,s.bF)(u,{highlight:"",active:"suggest"===o.tab,links:a.metadata.suggest,onClick:e[4]||(e[4]=a=>o.setTab("suggest"))},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.tabSuggest")),1)])),_:1},8,["active","links"]),(0,s.bF)(u,{"show-empty":"",active:"require"===o.tab,links:a.metadata.require,onClick:e[5]||(e[5]=a=>o.setTab("require"))},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.tabRequire")),1)])),_:1},8,["active","links"]),(0,s.bF)(u,{"show-empty":"",active:"conflict"===o.tab,links:a.metadata.conflict,onClick:e[6]||(e[6]=a=>o.setTab("conflict"))},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.tabConflict")),1)])),_:1},8,["active","links"]),t.dependents?((0,s.uX)(),(0,s.Wv)(u,{key:1,active:"dependents"===o.tab,links:t.dependents,onClick:e[7]||(e[7]=a=>o.setTab("dependents"))},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.$t("ui.package-details.tabDependents")),1)])),_:1},8,["active","links"])):(0,s.Q3)("",!0)])]),(0,s.bF)(G,{active:""===o.tab},{default:(0,s.k6)((()=>[a.metadata.abandoned?((0,s.uX)(),(0,s.CE)("div",P,[!0===a.metadata.abandoned?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.eW)((0,n.v_)(a.$t("ui.package.abandonedText")),1)],64)):((0,s.uX)(),(0,s.Wv)(k,{key:1,keypath:"ui.package.abandonedReplace"},{replacement:(0,s.k6)((()=>[(0,s.bF)(d,{to:{query:{p:a.metadata.abandoned}}},{default:(0,s.k6)((()=>[(0,s.eW)((0,n.v_)(a.metadata.abandoned),1)])),_:1},8,["to"])])),_:1}))])):(0,s.Q3)("",!0),a.metadata.funding?((0,s.uX)(),(0,s.Wv)(g,{key:1,class:"package-popup__funding",items:a.metadata.funding},null,8,["items"])):(0,s.Q3)("",!0),(0,s.RG)(a.$slots,"package-update"),a.metadata.contaoVersions?((0,s.uX)(),(0,s.CE)("p",R,[(0,s.Lk)("strong",null,(0,n.v_)(a.$t("ui.package-details.contaoVersions"))+":",1),(0,s.eW)(" "+(0,n.v_)(a.metadata.contaoVersions.join(", ")),1)])):(0,s.Q3)("",!0),a.metadata.latest?((0,s.uX)(),(0,s.CE)("p",q,[(0,s.Lk)("strong",null,(0,n.v_)(a.$t("ui.package-details.latest"))+":",1),(0,s.eW)(" "+(0,n.v_)(a.metadata.latest.version)+" ("+(0,n.v_)(a.$t("ui.package-details.released"))+" "+(0,n.v_)(o.datimFormat(a.metadata.latest.time,"short","long"))+")",1)])):(0,s.Q3)("",!0),a.metadata.license?((0,s.uX)(),(0,s.CE)("p",B,[(0,s.Lk)("strong",null,(0,n.v_)(a.$t("ui.package-details.license"))+":",1),(0,s.eW)(" "+(0,n.v_)(o.license),1)])):(0,s.Q3)("",!0),(0,s.Lk)("p",I,(0,n.v_)(a.metadata.description),1)])),_:3},8,["active"]),a.metadata.features?((0,s.uX)(),(0,s.Wv)(G,{key:0,active:"features"===o.tab,links:a.metadata.features},{actions:(0,s.k6)((({name:e})=>[(0,s.RG)(a.$slots,"features-actions",(0,n._B)((0,s.Ng)({name:e})))])),_:3},8,["active","links"])):(0,s.Q3)("",!0),(0,s.bF)(G,{active:"suggest"===o.tab,links:a.metadata.suggest},{actions:(0,s.k6)((({name:e})=>[(0,s.RG)(a.$slots,"suggest-actions",(0,n._B)((0,s.Ng)({name:e})))])),_:3},8,["active","links"]),(0,s.bF)(G,{active:"require"===o.tab,links:a.metadata.require},{actions:(0,s.k6)((({name:e})=>[(0,s.RG)(a.$slots,"require-actions",(0,n._B)((0,s.Ng)({name:e})))])),_:3},8,["active","links"]),(0,s.bF)(G,{active:"conflict"===o.tab,links:a.metadata.conflict},{actions:(0,s.k6)((({name:e})=>[(0,s.RG)(a.$slots,"conflict-actions",(0,n._B)((0,s.Ng)({name:e})))])),_:3},8,["active","links"]),t.dependents?((0,s.uX)(),(0,s.Wv)(G,{key:1,active:"dependents"===o.tab,links:t.dependents},{actions:(0,s.k6)((({name:e})=>[(0,s.RG)(a.$slots,"dependents-actions",(0,n._B)((0,s.Ng)({name:e})))])),_:3},8,["active","links"])):(0,s.Q3)("",!0)],64)):((0,s.uX)(),(0,s.CE)("div",v,[(0,s.bF)(p,{horizontal:""}),(0,s.Lk)("p",null,(0,n.v_)(a.$t("ui.package-details.loading")),1)]))])),_:3})}var O=t(9376),S=t(416),j=t(266),K=t(7423),V=t(9045);const D={key:0,class:"link-more"};function H(a,e,t,i,l,o){const p=(0,s.g2)("link-menu");return o.linkItems.length?((0,s.uX)(),(0,s.CE)("div",D,[(0,s.Lk)("button",{onClick:e[0]||(e[0]=(...a)=>o.toggle&&o.toggle(...a))},(0,n.v_)(a.$t("ui.package-details.more")),1),a.visible?((0,s.uX)(),(0,s.CE)("div",{key:0,ref:"menu",class:"link-more__menu",tabindex:"-1",onFocusout:e[1]||(e[1]=(...a)=>o.close&&o.close(...a)),onClick:e[2]||(e[2]=(...a)=>o.close&&o.close(...a))},[(0,s.bF)(p,{items:o.linkItems,color:"contao"},null,8,["items"])],544)):(0,s.Q3)("",!0)])):(0,s.Q3)("",!0)}var M=t(4758),N={components:{LinkMenu:M.A},props:{name:String,homepage:String,support:Object,metadata:String,hidePackagist:Boolean},data:()=>({visible:!1}),computed:{linkItems(){const a=[];return this.homepage&&a.push({label:this.$t("ui.package.homepage"),href:this.homepage,target:"_blank"}),this.name&&!this.hidePackagist&&a.push({label:this.$t("ui.package-details.packagist"),href:`https://packagist.org/packages/${this.name}`,target:"_blank"}),this.support&&Object.keys(this.support).forEach((e=>{const t=`ui.package-details.support_${e}`;let s=this.$t(`ui.package-details.support_${e}`);s===t&&(s=e),"email"===e?a.push({label:s,href:`mailto:${this.support[e]}`}):a.push({label:s,href:this.support[e],target:"_blank"})})),this.metadata&&a.push({label:this.$t("ui.package-details.metadata"),href:this.metadata,target:"_blank"}),a}},methods:{open(){this.visible=!0,setTimeout((()=>this.$refs.menu?.focus()),0)},close(a){a&&this.$refs.menu?.contains(a.relatedTarget)||(this.$refs.menu.blur(),setTimeout((()=>{this.visible=!1}),100))},toggle(){this.visible?this.close():this.open()}}},z=t(6262);const U=(0,z.A)(N,[["render",H]]);var Y=U;const J=["disabled"];function Z(a,e,t,i,l,o){return t.showEmpty||o.count>0?((0,s.uX)(),(0,s.CE)("li",{key:0,class:(0,n.C4)(["package-popup__tab",{"package-popup__tab--active":t.active}])},[(0,s.Lk)("button",{onClick:e[0]||(e[0]=e=>a.$emit("click")),disabled:0===o.count&&!1!==t.links},[(0,s.RG)(a.$slots,"default"),!1!==t.links?((0,s.uX)(),(0,s.CE)("span",{key:0,class:(0,n.C4)({"package-popup__pill":!0,"package-popup__pill--highlight":t.highlight&&o.count>0})},(0,n.v_)(o.count),3)):(0,s.Q3)("",!0)],8,J)],2)):(0,s.Q3)("",!0)}var aa={emits:["click"],props:{active:Boolean,showEmpty:Boolean,highlight:Boolean,links:[Object,Array,Boolean]},computed:{count(){return this.links?this.links instanceof Array?this.links.length:Object.values(this.links).length:0}}};const ea=(0,z.A)(aa,[["render",Z]]);var ta=ea,sa=t(3751);const na={class:"package-popup__tabcontent",tabindex:"-1"},ia={key:0,class:"package-popup__packagelist"};function la(a,e,t,n,i,l){const o=(0,s.g2)("package-link");return(0,s.bo)(((0,s.uX)(),(0,s.CE)("div",na,[(0,s.RG)(a.$slots,"default",{},(()=>[t.links?((0,s.uX)(),(0,s.CE)("div",ia,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.iterableLinks,((e,t)=>(0,s.RG)(a.$slots,"links",(0,s.v6)({ref_for:!0},{name:t,text:e}),(()=>[((0,s.uX)(),(0,s.Wv)(o,{name:t,key:t,text:e},{default:(0,s.k6)((()=>[(0,s.RG)(a.$slots,"actions",(0,s.v6)({ref_for:!0},{name:t}))])),_:2},1032,["name","text"]))])))),256))])):(0,s.Q3)("",!0)]))],512)),[[sa.aG,t.active]])}const oa={class:"package-link__details"},pa=["title"],ca={class:"package-link__text"},ra={class:"package-link__actions"};function ua(a,e,t,i,l,o){const p=(0,s.g2)("details-button");return(0,s.uX)(),(0,s.CE)("article",{class:(0,n.C4)(["package-link",{"package-link--limit":!t.text}])},[(0,s.Lk)("div",oa,[(0,s.Lk)("p",{class:"package-link__name",title:t.name},(0,n.v_)(a.metadata&&a.metadata.title||t.name),9,pa),(0,s.Lk)("p",ca,(0,n.v_)(t.text||a.metadata&&a.metadata.description),1)]),(0,s.Lk)("div",ra,[(0,s.RG)(a.$slots,"default"),(0,s.bF)(p,{small:"",name:t.name},null,8,["name"])])],2)}var da=t(9071),ka={mixins:[S.A],components:{DetailsButton:da.A},props:{name:String,text:String},computed:{data:a=>({name:a.name})}};const ga=(0,z.A)(ka,[["render",ua]]);var ma=ga,ha={components:{PackageLink:ma},props:{active:Boolean,links:[Object,Array]},computed:{iterableLinks(){if(this.links instanceof Array){const a={};return this.links.forEach((e=>{a[e]=null})),a}return this.links}},watch:{active(){setTimeout((()=>{this.$el.focus()}),0)}}};const _a=(0,z.A)(ha,[["render",la]]);var va=_a,ba=t(1687);const fa={key:0,class:"package-funding"},ya=["href"],$a=["href"],Ca=["href"],Xa=["href"],Ea=["href"];function La(a,e,t,i,l,o){return t.items&&t.items.length?((0,s.uX)(),(0,s.CE)("div",fa,[(0,s.Lk)("div",null,[(0,s.Lk)("span",null,(0,n.v_)(a.$t("ui.package-details.funding")),1),((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(t.items,((a,e)=>((0,s.uX)(),(0,s.CE)(s.FK,null,["github"===a.type?((0,s.uX)(),(0,s.CE)("a",{href:o.githubUrl(a),target:"_blank",rel:"noreferrer noopener",key:e},"GitHub",8,ya)):"tidelift"===a.type?((0,s.uX)(),(0,s.CE)("a",{href:a.url,target:"_blank",rel:"noreferrer noopener",key:e},"Tidelift",8,$a)):"patreon"===a.type?((0,s.uX)(),(0,s.CE)("a",{href:a.url,target:"_blank",rel:"noreferrer noopener",key:e},"Patreon",8,Ca)):"opencollective"===a.type?((0,s.uX)(),(0,s.CE)("a",{href:a.url,target:"_blank",rel:"noreferrer noopener",key:e},"OpenCollective",8,Xa)):((0,s.uX)(),(0,s.CE)("a",{href:a.url,target:"_blank",rel:"noreferrer noopener",key:e},(0,n.v_)(a.url.replace(/^https?:\/\/(www.)?([^/]+).*$/,"$2")),9,Ea))],64)))),256))])])):(0,s.Q3)("",!0)}var wa={name:"PackageFunding",props:{items:{type:Array,required:!0}},computed:{githubUrl:()=>a=>a.url.replace(/^https:\/\/github.com\/([^/]+)$/,"https://github.com/sponsors/$1")}};const Fa=(0,z.A)(wa,[["render",La],["__scopeId","data-v-5a8fd14b"]]);var Aa=Fa,Wa={mixins:[S.A],components:{PopupOverlay:ba.A,MoreLinks:Y,LoadingSpinner:V.A,PackageLogo:K.A,PackageFunding:Aa,DetailsTab:ta,DetailsContent:va},props:{local:{type:Object},dependents:{type:Object}},data:()=>({appTitle:"",links:[],hasPrevious:!1}),computed:{current:a=>a.$route.query.p,tab:a=>String(a.$route.hash).substring(1),exists:a=>a.metadata,data:a=>a.local||{name:a.current},authors:a=>a.metadata.authors&&a.metadata.authors.length?a.metadata.authors.filter((a=>!!a.name)):null,license:a=>a.metadata.license?a.metadata.license instanceof Array?a.metadata.license.join(", "):a.metadata.license:"–",contaoVersions:a=>a.metadata.contaoVersions||null},methods:{datimFormat:k.A,numberFormat:j.A,...(0,d.PY)("packages/details",["clearCurrent"]),setTab(a){this.$router.replace({query:this.$route.query,hash:`#${a}`,append:!0})},updatePage(){let a=`${this.current} - ${this.appTitle}`,e="";this.metadata&&(this.metadata.title&&(a=`${this.metadata.title} (${this.current}) - ${this.appTitle}`),e=this.metadata.description||""),document.title=a,document.head.querySelector('meta[name="description"]').setAttribute("content",e)},addLink(a,e,t=null){const s=new URL(location.pathname,location);s.search=a;const n=document.createElement("link");n.setAttribute("rel",e),n.setAttribute("href",s.toString()),t&&n.setAttribute("hrefLang",t),document.head.appendChild(n),this.links.push(n)}},watch:{current(){this.updatePage(),this.hasPrevious=/[?&]p=/.test(window.history.state?.back)},exists(a){a||this.clearCurrent()},metadata(){this.updatePage()}},created(){this.appTitle=document.title},mounted(){document.head.querySelector('meta[name="robots"]').setAttribute("content","index,follow"),this.updatePage(),this.addLink(`?p=${this.current}&_locale=${this.$i18n.locale}`,"canonical"),Object.keys(O.A).forEach((a=>{this.addLink(`?p=${this.current}&_locale=${a}`,"alternate",a)}))},beforeUnmount(){document.title=this.appTitle,document.head.querySelector('meta[name="description"]').setAttribute("content",""),this.links.forEach((a=>{document.head.removeChild(a)}))}};const Qa=(0,z.A)(Wa,[["render",G]]);var Ta=Qa,xa=t(5761),Pa=t(5062),Ra={mixins:[g.A],components:{PackageConstraint:Pa.A,PackageDetails:Ta,InstallButton:xa.A},computed:{...(0,d.aH)("packages",{allInstalled:"installed"}),...(0,d.L8)("packages",["packageConstraint"]),current:a=>a.$route.query.p,data:a=>a.add[a.current]||a.allInstalled&&a.allInstalled[a.current]||{name:a.current},dependents(){if(!this.allInstalled||!this.allInstalled[this.data.name]?.dependents)return null;const a={},e=["requires","replaces","provides","conflicts"];return Object.values(this.allInstalled[this.data.name].dependents).forEach((t=>{if("__root__"===t.source||!e.includes(t.description)||t.source===this.data.name&&"replaces"===t.description)return;const s=this.$t(`ui.package-details.link${t.description[0].toUpperCase()}${t.description.slice(1)}`);let n=t.target;n===this.data.name&&this.metadata&&this.metadata.title&&(n=this.metadata.title),a[t.source]=`${s} ${n} ${t.constraint}`})),a}},methods:{datimFormat:k.A}};const qa=(0,z.A)(Ra,[["render",u]]);var Ba=qa}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[643],{6643:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Osäker anslutning !!","ui.app.httpsDescription":"Utan HTTPS kommer din konfidentiella data att överföras okrypterad.","ui.app.httpsLink":"Mer information","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Säkert läge aktiverat !!","ui.app.safeModeDescription":"Vissa funktioner i Contao Manager är inte tillgängliga.","ui.app.safeModeExit":"Avsluta felsäkert läge","ui.app.limitedHeadline":"Fjärrautentisering","ui.app.limitedDescription":"Du har begränsade behörigheter pÃ¥ grund av lösenordslös inloggning.","ui.app.limitedLogout":"Autentisera pÃ¥ nytt","ui.app.totpHeadline":"Säkerhetsmeddelande","ui.app.totpDescription":"Konfigurera tvÃ¥faktorsautentisering nu för att säkra ditt konto.","ui.app.totpSetup":"Setup","ui.app.loading":"Laddar Contao Manager …","ui.app.apiError":"Oväntad API-status","ui.app.configSecurity1":"SÄKERHETSVARNING !!! Oskyddad konfigurationskatalog upptäcktes","ui.app.configSecurity2":"Contao Manager har upptäckt att dess konfigurationsfiler är offentligt tillgängliga. Alla operationer är inaktiverade tills katalogen är säker, annars kan en angripare komma Ã¥t känsliga data frÃ¥n din installation.\\n\\nFör att Ã¥tgärda det här problemet, se till att förhindra Ã¥tkomst till \\"contao-manager\\"-katalogen pÃ¥ din server. För att lära dig hur du gör detta, se manualen för din webbserver eller kontakta din värdleverantör.","ui.account.welcome":"Välkommen","ui.account.intro1":"Välkommen till Contao Manager, ett universellt verktyg för att installera och hantera Contao Open Source CMS. Om du är ny pÃ¥ det, vänligen {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} för att komma igÃ¥ng","ui.account.introManual":"läs manualen","ui.account.intro2":"Om du stöter pÃ¥ nÃ¥gra problem, kolla {ourGithubIssues} och skapa gärna ett nytt för allt som inte har rapporterats ännu.","ui.account.introIssues":"vÃ¥ra GitHub-problem","ui.account.headline":"Användarkonto","ui.account.description":"För att hantera din installation, skapa ett konto för Contao Manager. Var medveten om att det här kontot inte är relaterat till Contao backend eller frontend.","ui.account.username":"Användarnamn","ui.account.password":"Lösenord","ui.account.passwordPlaceholder":"min. 8 tecken","ui.account.passwordLength":"Ange minst 8 tecken.","ui.account.loginInvalid":"Det uppstod ett fel när du skapade kontot. Vänligen försök med ett annat användarnamn.","ui.account.submit":"Skapa konto","ui.account.usePassword":"Använd lösenord för inloggning","ui.account.usePasskey":"Använd Passkey för inloggning","ui.account.totpHeadline":"TvÃ¥faktorsautentisering","ui.account.totpDescription":"Vänligen aktivera tvÃ¥faktorsautentisering, vilket ger ditt konto ett extra säkerhetslager. Förutom ditt användarnamn och lösenord mÃ¥ste du ange en verifieringskod som genereras av en tvÃ¥faktorsapp som 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator eller nÃ¥gon annan TOTP-app.","ui.account.totpSetup":"Konfigurera nu","ui.account.totpSkip":"Konfigureras senare","ui.account.login":"Avvisa inbjudan","ui.account.contribute1":"Contao och Contao Manager är sponsrade av den ideella Contao Association.","ui.account.contribute2":"Vänligen överväg att bidra till öppen källkod genom att {donate}.","ui.account.contributeDonate":"göra en donation","ui.login.headline":"Logga in","ui.login.description":"Logga in för att hantera din installation.","ui.login.username":"Användarnamn","ui.login.password":"Lösenord","ui.login.totpHeadline":"TvÃ¥faktorsautentisering","ui.login.totpDescription":"Ange din verifieringskod för att slutföra inloggningsprocessen.","ui.login.totp":"Verifieringskod","ui.login.forgotPassword":"Glömt ditt lösenord?","ui.login.button":"Logga in","ui.login.passkey":"Logga in med Passkey","ui.login.cancel":"Avbryt","ui.login.or":"eller","ui.login.locked":"Ã…tkomst har nekats eftersom Contao Manager är lÃ¥st. För att lÃ¥sa upp, radera {lockFile}-filen i din Contao-rotkatalog.","ui.logout.headline":"Sessionen har gÃ¥tt ut","ui.logout.warning":"Du har varit inaktiv i mer än 25 minuter. Av säkerhetsskäl kommer din session att avslutas inom kort.","ui.logout.expired":"Din session avslutades automatiskt eftersom du har varit inaktiv i mer än 30 minuter.","ui.logout.renew":"HÃ¥ll inloggad","ui.logout.logout":"Logga ut","ui.logout.login":"Tillbaka till login","ui.oauth.error":"Ogiltigt OAuth-försök. Kontrollera request-parametrarna.","ui.oauth.https":"Omdirigerings-URI:n MÃ…STE använda ett säkert protokoll (https:) för att förhindra att autentiseringstoken sänds i klartext.","ui.oauth.headline":"Fjärrautentisering","ui.oauth.description":"Följande applikation eller tjänst begär fjärrÃ¥tkomst till din Contao Manager-instans.","ui.oauth.domain":"Innan du tillÃ¥ter Ã¥tkomst, se till att du känner till den här webbadressen och litar pÃ¥ dess ägare!","ui.oauth.outOfScope":"Tyvärr har du inte de nödvändiga behörigheterna för att bevilja denna Ã¥tkomst.","ui.oauth.allow":"TillÃ¥ta Ã¥tkomst","ui.oauth.deny":"Neka Ã¥tkomst","ui.oauth.switchUser":"Växla användare","ui.scope.admin":"Admin-Ã¥tkomst inklusive användarhantering","ui.scope.install":"Installera nya paket och ändra Contao-konfigurationen","ui.scope.update":"Uppdatera paket och utföra underhÃ¥llsÃ¥tgärder","ui.scope.read":"Läs paket och konfiguration","ui.boot.headline":"Systemkontroll","ui.boot.description":"Vänta, vi analyserar din server...","ui.boot.issue1":"Installationsproblem upptäcktes","ui.boot.issue2":"Din installation har problem som mÃ¥ste Ã¥tgärdas innan Contao Manager kan användas.","ui.boot.run":"Starta Contao Manager","ui.boot.safeMode":"Starta i felsäkert läge Safe Mode","ui.recovery.headline":"SystemÃ¥terställning","ui.recovery.description":"Contao Manager upptäckte filer som ser ut som Contao, men kommandoradsgränssnittet fungerar inte som förväntat.","ui.recovery.console":"KonsolutgÃ¥ng","ui.recovery.repairOptions":"Välj ett alternativ för att reparera din installation.","ui.recovery.repairHeadline":"Automatisk reparation","ui.recovery.repairDescription":"Försöker att automatiskt reparera installationen genom att bygga om programcachen och installera om Composer-paketen.","ui.recovery.repairWarning":"Eventuella ändringar av vendor-filerna kan raderas under processen!","ui.recovery.repairFailed":"Den automatiska reparationen lyckades inte. Prova felsäkert läge Safe Mode för att manuellt reparera installationen.","ui.recovery.repairButton":"Kör systemreparation","ui.recovery.safeModeHeadline":"Säkert läge Safe Mode","ui.recovery.safeModeDescription":"Att starta Contao Manager i felsäkert läge gör det möjligt att hantera paket och köra vissa underhÃ¥llsuppgifter, men funktioner som förlitar sig pÃ¥ en fungerande Contao-installation kommer inte att vara tillgängliga.","ui.recovery.safeModeButton":"Starta i felsäkert läge Safe Mode","ui.server.pending":"Väntar …","ui.server.running":"Analyserar …","ui.server.error":"Kontrollen misslyckades pÃ¥ grund av ett oväntat svar frÃ¥n servern.","ui.server.details":"Detaljer","ui.server.prerequisite":"Checken annullerad pÃ¥ grund av att förutsättning saknas.","ui.server.selfUpdate.title":"Uppdateringar av Contao Manager","ui.server.selfUpdate.update":"En ny version av Contao Manager {latest} är tillgänglig.","ui.server.selfUpdate.manualUpdate":"En ny version av Contao Manager {latest} är tillgänglig. Din server stöder inte automatiska uppdateringar, ladda ner den nya versionen frÃ¥n {download}.","ui.server.selfUpdate.latest":"Du använder den senaste versionen {current}.","ui.server.selfUpdate.dev":"Utvecklingsbyggen stöder inte automatiska uppdateringar.","ui.server.selfUpdate.unsupported":"En ny version är tillgänglig men den stöder inte din PHP-version.","ui.server.selfUpdate.button":"Kör självuppdatering","ui.server.selfUpdate.continue":"Fortsätta","ui.server.config.title":"Serverkonfiguration","ui.server.config.setup":"Konfigurera","ui.server.config.change":"Förändra","ui.server.config.save":"Spara","ui.server.config.cancel":"Avbryt","ui.server.config.customOption":"Övrig …","ui.server.config.description":"För att köra bakgrundsuppgifter korrekt mÃ¥ste Contao Manager veta var man hittar PHP-kommandoradens binära filer och hur man kör kommandon separerade frÃ¥n webbprocessen.","ui.server.config.formTitle":"Serverkonfiguration","ui.server.config.formText":"Ange sökvägen till din PHP-binär. Se till att binären är samma PHP-version som din webbprocess.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud gör det möjligt att installera Composer-beroenden även om din server inte tillhandahÃ¥ller tillräckligt med lokalt minne. Var medveten om att din paketinformation kommer att överföras till en molnserver som drivs av Contao Association.","ui.server.config.cloud":"Använd Composer Resolver Cloud","ui.server.config.cli":"PHP binär","ui.server.config.stateErrorCli":"Ingen giltig PHP-binär hittades pÃ¥ servern.","ui.server.config.stateErrorCloud":"Composer Resolver Cloud stöds inte.","ui.server.config.stateSuccess":"PHP binär pÃ¥ {php_cli}.","ui.server.php_web.title":"PHP webbprocess","ui.server.php_web.below7":"Hittade PHP-versionen {version}. Byt till PHP 7 sÃ¥ snart som möjligt!","ui.server.php_web.success":"Hittade PHP-versionen {version}, inga kända problem hittades.","ui.server.php_cli.title":"PHP kommandoradsgränssnitt","ui.server.php_cli.success":"Hittade PHP-versionen {version}, inga kända problem hittades.","ui.server.composer.title":"Composer-Miljö","ui.server.composer.success":"Inga kända problem hittades.","ui.server.composer.install":"Composer-beroenden är inte installerade.","ui.server.composer.button":"Installera","ui.server.contao.title":"Contao installation","ui.server.contao.setup":"Setup","ui.server.contao.check":"Kontrollera databasen","ui.server.contao.empty":"Ingen Contao-installation har hittats.","ui.server.contao.old":"Contao version {version} är inte kompatibel med Contao Manager, uppdatera din installation manuellt.","ui.server.contao.found":"Hittade Contao {version} (API-version {api}).","ui.server.contao.connectionError":"Det gÃ¥r inte att ansluta till databasservern.","ui.server.contao.connectionProblem":"Databasproblem hittades.","ui.server.contao.missingUser":"Administratörskonto hittades inte.","ui.setup.continue":"Fortsätta","ui.setup.manager":"Starta Contao Manager","ui.setup.cancel":"Avbryt","ui.setup.welcome":"Välkommen","ui.setup.welcome1":"Den här guiden tar dig igenom de nödvändiga stegen för att konfigurera din Contao Open Source CMS-installation.","ui.setup.welcome2":"Om du har nÃ¥gra frÃ¥gor kan du hitta dokumentation, forum, en Slack-kanal och mer pÃ¥ sidan {support}.","ui.setup.support":"community support","ui.setup.start":"Komma igÃ¥ng","ui.setup.complete":"Grattis!","ui.setup.complete1":"Contao {version} har installerats.","ui.setup.complete2":"För att avsluta installationsprocessen, öppna installationsverktyget för att konfigurera databasanslutningen och skapa en backend-användare.","ui.setup.complete3":"Du kan nu börja skapa din webbplats i Contaos back end. Om du behöver ytterligare tillägg, fortsätt till Contao Manager.","ui.setup.installTool":"Öppna installationsverktyget","ui.setup.login":"Logga in pÃ¥ Contao","ui.setup.funding":"Fri programvara är \\"fri\\" som i \\"yttrandefritt\\", inte som i \\"gratis öl\\". Ett Open Source-projekt som Contao kräver summor pengar som inte kan samlas in av en enda person eller företag.\\nOm du har en webbplats eller säljer webbplatser byggda med Contao, skulle vi gärna se att du bidrar ekonomiskt till den produkt som ditt företag är beroende av.","ui.setup.fundingLink":"Läs mer","ui.setup.document-root.headline":"Webserverinstallation","ui.setup.document-root.warning":"För att installera Contao via Contao Manager mÃ¥ste du fixa dokumentroten pÃ¥ webbservern.","ui.setup.document-root.description1":"Contao använder en separat mapp för offentliga filer, programfiler installeras i dess överordnade mapp. Contao kan inte installeras om mappstrukturen inte är korrekt eller om mapparna inte är tomma.","ui.setup.document-root.description2":"Om du inte vet hur du konfigurerar din dokumentrot, läs Contao-dokumentationen eller kontakta din värdleverantör.","ui.setup.document-root.documentation":"Läs dokumentationen","ui.setup.document-root.conflictsTitle":"Installationskatalogen är inte tom","ui.setup.document-root.conflictsDirectory":"Rotkatalogen för din framtida Contao-installation är inte tom, vi har hittat {count} fil(er) som kan skrivas över av installationsprocessen. Det rekommenderas att skapa en tom katalogstruktur för Contao, men du kan ocksÃ¥ ta bort följande filer och kontrollera igen om du är säker pÃ¥ att de är oanvända.","ui.setup.document-root.ignoreConflicts":"Jag vill installera Contao i den icke-tomma katalogen. Jag förstÃ¥r att detta kan skriva över alla befintliga filer pÃ¥ mitt webbutrymme.","ui.setup.document-root.check":"Kolla igen","ui.setup.document-root.create":"Skapa kataloger","ui.setup.document-root.change":"Byt kataloger","ui.setup.document-root.formTitle":"Kataloginställningar","ui.setup.document-root.formText1":"Contao Manager kan automatiskt skapa en ny katalogstruktur pÃ¥ servern.","ui.setup.document-root.formText2":"Du mÃ¥ste konfigurera den nya dokumentroten manuellt (t.ex. via en värdadministratörspanel).","ui.setup.document-root.autoconfig":"Jag förstÃ¥r att jag mÃ¥ste ändra min serverkonfiguration. Att inte konfigurera dokumentroten kommer att bryta Contao Manager och exponera konfigurationsfiler (inklusive kontodetaljer och lösenord)!","ui.setup.document-root.directory":"Ny katalog","ui.setup.document-root.currentRoot":"Aktuell dokumentrot","ui.setup.document-root.newRoot":"Ny dokumentrot","ui.setup.document-root.finish":"Installera kataloger","ui.setup.document-root.publicDir":"Använd {dir} för offentliga filer (för Contao {version})","ui.setup.document-root.directoryInvalid":"Vänligen ange ett giltigt katalognamn.","ui.setup.document-root.directoryExists":"Vänligen ange ett giltigt katalognamn.","ui.setup.document-root.confirmation":"Contao Manager har skapat den nödvändiga katalogen för din Contao-installation. Du mÃ¥ste nu konfigurera dokumentroten pÃ¥ din webbserver. Ladda inte om den här sidan förrän dÃ¥.","ui.setup.document-root.reload":"Ladda om sidan","ui.setup.document-root.success":"Katalogstrukturen pÃ¥ din webbserver är korrekt inställd!","ui.setup.document-root.installingProjectDir":"Programfiler kommer att installeras i {dir}.","ui.setup.document-root.installingPublicDir":"Offentliga filer kommer att installeras i {dir}.","ui.setup.document-root.installedProjectDir":"Programfiler installeras i {dir}.","ui.setup.document-root.installedPublicDir":"Offentliga filer installeras i {dir}.","ui.setup.create-project.headline":"Contao installation","ui.setup.create-project.description":"Contao-utvecklingen följer principen för {semver}, en ny minor version släpps var sjätte mÃ¥nad. De utgÃ¥vor som för närvarande stöds är:","ui.setup.create-project.semver":"Semantisk versionering","ui.setup.create-project.latestTitle":"Senast","ui.setup.create-project.ltsTitle":"LÃ¥ngtidssupport","ui.setup.create-project.latestQ1":"VÃ¥r senaste version erbjuder de flesta funktionerna med support fram till februari {year}.","ui.setup.create-project.latestQ3":"VÃ¥r senaste version erbjuder de flesta funktionerna med support fram till augusti {year}.","ui.setup.create-project.ltsText":"VÃ¥r nuvarande LTS-version, om du fokuserar pÃ¥ stabilitet. Erbjuder lÃ¥ngsiktig support till februari {year}.","ui.setup.create-project.pltsText":"Den tidigare LTS-versionen har fortfarande lÃ¥ngtidssupport fram till februari {year}.","ui.setup.create-project.requiresPHP":"Kräver minst PHP {version}, du har PHP {current}.","ui.setup.create-project.releaseplan":"Se {contaoReleasePlan} för detaljerad information.","ui.setup.create-project.releaseplanLink":"Contao Release Plan","ui.setup.create-project.installed":"Contao {version} har installerats pÃ¥ servern. Fortsätt att ställa in din databas eller starta Contao Manager för att installera en annan version.","ui.setup.create-project.formTitle":"Välj en distribution","ui.setup.create-project.formText":"Välj vilken version som ska installeras.","ui.setup.create-project.version":"Version","ui.setup.create-project.demo":"Installera Contaos demowebbplats","ui.setup.create-project.demoDescription":"Demowebbplatsen hjälper dig att bli bekant med Contao och alla dess kärnfunktioner. Fler teman finns i {butiken}.","ui.setup.create-project.coreOnly":"Minimal installation (endast kärna core)","ui.setup.create-project.noUpdate":"Hoppa över installationen (endast experter!)","ui.setup.create-project.theme":"Contao Theme","ui.setup.create-project.themeInstall":"För att installera ett Contao-tema, använd sökingÃ¥ngen eller ladda upp en temafil (.cto/.zip) som stöder installation via Contao Manager.","ui.setup.create-project.themeBuy":"Se till att besöka den officiella {butiken}.","ui.setup.create-project.themeStore":"Contao Themes Store","ui.setup.create-project.themeUpload":"Ladda upp temafil (.cto/.zip)","ui.setup.create-project.themeInvalid":"Den uppladdade filen är inte ett Contao-tema eller stöder inte Contao Manager.","ui.setup.create-project.themeWarning":"Contao Manager kan inte avgöra om detta tema är kompatibelt med din server. Kontrollera med temaleverantören om du har nÃ¥gra frÃ¥gor.","ui.setup.create-project.themeTitle":"Granska temadetaljer","ui.setup.create-project.themeDetails":"Följande beroenden och filer kommer att installeras med detta tema.","ui.setup.create-project.themeRequire":"{count} beroenden | {count} beroenden","ui.setup.create-project.themeFiles":"{count} Fil | {count} filer","ui.setup.create-project.theme.or":"eller sök efter offentliga teman","ui.setup.create-project.theme.search":"Sök teman","ui.setup.create-project.theme.more":"Fler teman","ui.setup.create-project.theme.empty":"Inga teman matchar {query}","ui.setup.create-project.theme.uploaded":"Temafilen laddades upp.","ui.setup.create-project.theme.packageName":"Paketnamn","ui.setup.create-project.theme.version":"Version","ui.setup.create-project.theme.authors":"Författare","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"Installera","ui.setup.create-project.cancel":"Avbryt","ui.setup.database-connection.headline":"Databasanslutning","ui.setup.database-connection.description":"Contao kräver en MySQL-databas (eller en kompatibel databas som MariaDB) för att lagra sidor, innehÃ¥ll, användare och annan relationsdata. Anslutningsparametrar lagras i filen {env} i projektroten för din Contao-installation.","ui.setup.database-connection.formTitle":"Anslutningsparametrar","ui.setup.database-connection.formText":"Ange en databas-URL eller fyll i användarnamn, lösenord, server och databasfält separat.","ui.setup.database-connection.url":"Databas URL","ui.setup.database-connection.validUrl":"Databas-URL är ogiltig eller anslutningen till servern misslyckades.","ui.setup.database-connection.or":"eller","ui.setup.database-connection.user":"Användarnamn","ui.setup.database-connection.password":"Lösenord","ui.setup.database-connection.server":"Server (:Port)","ui.setup.database-connection.database":"Databas namn","ui.setup.database-connection.connected":"Ansluten till databasen {database} pÃ¥ {server}.","ui.setup.database-connection.error":"Fel vid anslutning till databasen.","ui.setup.database-connection.problem":"Contao har upptäckt ett problem med din databasserver.","ui.setup.database-connection.schemaTitle":"Databasschema","ui.setup.database-connection.migration":"Det finns en väntande migrering. | Det finns {count} väntande migreringar.","ui.setup.database-connection.schema":"Det finns en väntande schemauppdatering. | Det finns {count} väntande schemauppdateringar.","ui.setup.database-connection.noChanges":"Ditt databasschema är uppdaterat.","ui.setup.database-connection.check":"Kontrollera databasen","ui.setup.database-connection.skip":"Hoppa över","ui.setup.database-connection.save":"Spara","ui.setup.database-connection.change":"Ändra autentiseringsuppgifter","ui.setup.database-connection.restoreTitle":"Databasimport","ui.setup.database-connection.restoreText":"Temat du just installerade innehÃ¥ller en databassäkerhetskopiering. Ã…terställ databasen för att importera temadata eller hoppa över detta steg för att börja med en tom Contao-installation. | Temat du just installerade innehÃ¥ller flera säkerhetskopior av databaser. Välj en säkerhetskopia för att importera temadata eller hoppa över det här steget för att börja med en tom Contao-installation.","ui.setup.database-connection.backup":"Säkerhetskopiera aktuell databas före import","ui.setup.database-connection.backupWarning":"All data i databasen kommer att skrivas över vid import! Skapa en säkerhetskopia först om databasen inte är tom.","ui.setup.database-connection.restore":"Importera temadatabas","ui.setup.database-connection.restoreOption":"Säkerhetskopiering frÃ¥n {date} ({size})","ui.setup.database-connection.restored":"Din temadatabas har importerats. Fortsätt att validera ditt databasschema.","ui.setup.backend-user.success":"Ett administratörskonto för Contao backend hittades i din databas. Använd Contaos backend för att lägga till fler användare.","ui.setup.backend-user.error":"Det gick inte att hämta användarlistan. Kontrollera konsolutgÃ¥ngen för detaljer.","ui.setup.backend-user.headline":"Backend-konto","ui.setup.backend-user.description":"För att hantera din webbplats mÃ¥ste du ha minst ett administratörskonto för Contaos backend. Var medveten om att detta konto inte är relaterat till Contao Manager.","ui.setup.backend-user.formTitle":"Skapa konto","ui.setup.backend-user.formText":"Vänligen ange detaljerna för det nya backend-kontot.","ui.setup.backend-user.username":"Användarnamn","ui.setup.backend-user.name":"namn","ui.setup.backend-user.email":"E-postadress","ui.setup.backend-user.emailInvalid":"Vänligen ange en giltig e-postadress","ui.setup.backend-user.password":"Lösenord","ui.setup.backend-user.passwordPlaceholder":"min. 8 tecken","ui.setup.backend-user.passwordLength":"Ange minst 8 tecken.","ui.setup.backend-user.create":"Lägg till konto","ui.task.headline":"Bakgrundsuppgift","ui.task.loading":"Läser in detaljer...","ui.task.created":"Läser in detaljer...","ui.task.active":"Vänta medan Contao Manager kör uppgiftsoperationer i bakgrunden.","ui.task.complete":"Alla operationer har slutförts framgÃ¥ngsrikt. Kontrollera konsolutgÃ¥ngen för detaljer.","ui.task.paused":"En bakgrundsÃ¥tgärd avbröts oväntat. Kontrollera konsolutgÃ¥ngen.","ui.task.aborting":"Vänta medan bakgrundsÃ¥tgärderna avbryts.","ui.task.stopped":"Vissa bakgrundsoperationer avbröts. Kontrollera konsolutgÃ¥ngen.","ui.task.error":"En bakgrundsÃ¥tgärd avbröts oväntat. Kontrollera konsolutgÃ¥ngen.","ui.task.failed":"Contao Manager kunde inte starta en bakgrundsuppgift!","ui.task.failedDescription1":"NÃ¥got gick fel när man försökte utföra Ã¥tgärder i bakgrunden.","ui.task.failedDescription2":"Om detta händer igen kanske din server inte stöds.","ui.task.reportProblem":"Rapportera ett problem","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud sponsras av {sponsor}","ui.task.buttonAudit":"Uppdatera databas","ui.task.buttonClose":"Stänga","ui.task.buttonConfirm":"Bekräfta och stäng","ui.task.buttonContinue":"Fortsätta","ui.task.buttonCancel":"Avbryt","ui.task.confirmCancel":"Är du säker pÃ¥ att du avbryter den här uppgiften? Detta kan lämna din Contao-installation i ett trasigt tillstÃ¥nd!","ui.task.autoclose":"Stäng uppgiftsinformation om framgÃ¥ng","ui.console.toggle":"Visa/dölj konsol-output","ui.console.showLog":"Visa hela konsolloggen","ui.console.copyLog":"Kopiera loggen till urklipp","ui.migrate.headline":"Databasuppdateringar","ui.migrate.migrationsOnly":"(endast migrering)","ui.migrate.schemaOnly":"(endast schema)","ui.migrate.loading":"Vänta, vi kontrollerar din databas...","ui.migrate.empty":"Inga pÃ¥gÃ¥ende migreringar eller schemauppdateringar hittades. Din databas är uppdaterad.","ui.migrate.emptyMigrations":"Inga väntande migrering hittades. Se till att även leta efter schemauppdateringar.","ui.migrate.emptySchema":"Inga väntande schemauppdateringar hittades. Se till att även kontrollera migrering.","ui.migrate.pending":"Din databas är inte uppdaterad. Granska konsolutgÃ¥ngen nedan och verkställ ändringarna.","ui.migrate.previousChanges":"En tidigare databasmigrering har inte bekräftats.\\nGranska konsolutgÃ¥ngen nedan och fortsätt sedan för att se nästa ändringar.","ui.migrate.previousComplete":"En tidigare databasmigrering har inte bekräftats, vänligen granska konsolutdata nedan.\\nDet finns inga fler väntande ändringar.","ui.migrate.appliedChanges":"Databasuppdateringar har tillämpats.\\nGranska konsolutgÃ¥ngen nedan och fortsätt sedan för att se nästa ändringar.","ui.migrate.appliedComplete":"Databasuppdateringar har tillämpats.\\nDet finns inga fler väntande migreringar eller schemauppdateringar. Din databas är uppdaterad.","ui.migrate.problem":"Contao har upptäckt ett problem med din databasserver.\\nGranska konsolutgÃ¥ngen nedan för att ta reda pÃ¥ vad som behöver Ã¥tgärdas. | Contao har upptäckt problem med din databasserver.\\nGranska konsolutgÃ¥ngen nedan för att ta reda pÃ¥ vad som behöver Ã¥tgärdas.","ui.migrate.warning":"Contao har upptäckt en felaktig konfiguration av din databasserver.\\nVarningar kan hoppas över tillfälligt, men bör Ã¥tgärdas för optimal prestanda och dataintegritet.","ui.migrate.error":"Ändringarna kunde inte tillämpas. Din databas kan ha ändrats, kontrollera igen för att försöka igen.","ui.migrate.execute":"Kör","ui.migrate.close":"Stänga","ui.migrate.confirm":"Bekräfta och stäng","ui.migrate.cancel":"Avbryt","ui.migrate.continue":"Fortsätta","ui.migrate.setup":"Setup","ui.migrate.skip":"Hoppa över","ui.migrate.retry":"Kolla igen","ui.migrate.retryAll":"Kontrollera alla","ui.migrate.withDeletes":"Utför alla databasändringar inklusive DROP-queries.","ui.migrate.migrationTitle":"Databasmigreringar","ui.migrate.schemaTitle":"Schemauppdateringar","ui.migrate.problemTitle":"Databasproblem","ui.migrate.warningTitle":"Databasvarningar","ui.migrate.addTable":"Lägg till tabell {table}","ui.migrate.dropTable":"Släpp tabell {table}","ui.migrate.addField":"Lägg till fält {table}.{field}","ui.migrate.changeField":"Ändra fält {table}.{field}","ui.migrate.dropField":"Släpp fältet {table}.{field}","ui.migrate.createIndex":"Skapa index \\"{name}\\" pÃ¥ {table}","ui.migrate.dropIndex":"Släpp index \\"{name}\\" pÃ¥ {table}","ui.widget.mandatory":"Detta fält fÃ¥r inte vara tomt.","ui.widget.blankOption":"Vänligen välj …","ui.widget.showPassword":"Visa lösenord","ui.widget.hidePassword":"Dölj lösenord","ui.error.title":"HTTP-begäran för \\"{method} {url}\\" misslyckades.","ui.error.server500":"Det verkar som att ett oväntat fel inträffade pÃ¥ din server. Kontrollera loggfilerna för din webbserver (Apache/Nginx) och Contao Manager-loggarna pÃ¥ \\"contao-manager/logs\\".","ui.error.response":"Servern returnerade ett svar med statuskoden {status}.","ui.error.moreLink":"Mer information","ui.error.support":"Contao Support","ui.error.permission":"Du har inte tillstÃ¥nd att använda den här funktionen.","ui.footer.help":"Hjälp","ui.footer.reportProblem":"Rapportera ett problem","ui.navigation.discover":"Upptäck","ui.navigation.packages":"Paket","ui.navigation.tools":"Verktyg","ui.navigation.installTool":"Installera verktyg","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Contao Debug Mode Felsökningsläge","ui.navigation.logViewer":"Logg visare","ui.navigation.phpinfo":"PHP-information","ui.navigation.phpinfoLoading":"Laddar PHP-information...","ui.navigation.maintenance":"UnderhÃ¥ll","ui.navigation.rebuildCache":"Bygg om cachen","ui.navigation.users":"Konton","ui.navigation.systemCheck":"Systemkontroll","ui.navigation.advanced":"Avancerad","ui.navigation.logout":"Logga ut","ui.maintenance.database.title":"Databasmigreringar och säkerhetskopieringar","ui.maintenance.database.description":"Databasmigreringar säkerställer konsekventa data och tabellscheman.","ui.maintenance.database.migrations":"En väntande databasmigrering | {count} väntande databasmigreringar","ui.maintenance.database.schemaUpdates":"En väntande schemauppdatering | {count} väntande schemauppdateringar","ui.maintenance.database.error":"Databasproblem hittades.","ui.maintenance.database.warning":"Databasvarningar hittades.","ui.maintenance.database.button":"Kontrollera databasen","ui.maintenance.database.migrationOnly":"Kontrollera endast migrering","ui.maintenance.database.schemaOnly":"Kontrollera endast schemat","ui.maintenance.database.installTool":"Öppna installationsverktyget","ui.maintenance.database.createBackup":"Skapa backup","ui.maintenance.database.backupUnsupported":"Databassäkerhetskopior stöds inte av din Contao-version.","ui.maintenance.database.backupList":"Du har en databassäkerhetskopia, skapad den {date}. | Du har {count} databassäkerhetskopior, den senaste skapades den {date}.","ui.maintenance.database.backupEmpty":"Du har för närvarande inga säkerhetskopior av databasen.","ui.maintenance.rebuildCache.title":"Applikationscache","ui.maintenance.rebuildCache.description":"Att bygga om applikationscachen krävs efter att ha ändrat nÃ¥gon av konfigurationsfilerna.","ui.maintenance.rebuildCache.rebuildProd":"Bygg om produktionscachen","ui.maintenance.rebuildCache.rebuildDev":"Bygg om utvecklingscachen","ui.maintenance.rebuildCache.clearProd":"Rensa produktionscache","ui.maintenance.rebuildCache.clearDev":"Rensa utvecklingscache","ui.maintenance.installTool.title":"Contao installationsverktyg","ui.maintenance.installTool.description":"Contao Install Tool lÃ¥ses automatiskt om du anger fel lösenord tre gÃ¥nger i rad.","ui.maintenance.installTool.unlock":"LÃ¥s upp installationsverktyget","ui.maintenance.installTool.lock":"LÃ¥s installationsverktyg","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"Composer autoloader ansvarar för PHP-klassladdning. Autoloadern mÃ¥ste dumpas efter att anpassade namnomrÃ¥den har lagts till i roten composer.json.","ui.maintenance.dumpAutoload.button":"Dumpa Autoloader","ui.maintenance.composerInstall.title":"Composer beroenden","ui.maintenance.composerInstall.description":"Composer-beroenden finns i mappen {vendor} i din programrot. Att installera om beroenden kan vara nödvändigt efter manipulering eller manuell uppladdning av {composerLock}-filen.","ui.maintenance.composerInstall.button":"Kör installationsprogrammet","ui.maintenance.composerInstall.update":"Kör Composer Update","ui.maintenance.composerCache.title":"Composer Cache","ui.maintenance.composerCache.description":"Composer cachar nedladdade paket för förbättrad prestanda. Om du har problem som trasiga filer, försök att ta bort Composer-cachen för att tvinga fram en ny nedladdning.","ui.maintenance.composerCache.button":"Rensa cache","ui.maintenance.maintenanceMode.title":"UnderhÃ¥llsläge","ui.maintenance.maintenanceMode.description":"Om du sätter Contao i underhÃ¥llsläge visas en \\"503 Service Unavailable\\"-mall för webbplatsen.","ui.maintenance.maintenanceMode.enable":"Aktivera","ui.maintenance.maintenanceMode.disable":"Inaktivera","ui.maintenance.debugMode.title":"Felsökningsläge Debug Mode","ui.maintenance.debugMode.description":"Aktivera felsökningsläget genom att ställa in en användare och lösenord för ingÃ¥ngspunkten för {appDevPhp}.","ui.maintenance.debugMode.descriptionJwt":"Aktivera felsökningsläget genom att ställa in felsökningscookien för den aktuella domänen.","ui.maintenance.debugMode.activate":"Aktivera","ui.maintenance.debugMode.deactivate":"Avaktivera","ui.maintenance.debugMode.credentials":"Referenser","ui.maintenance.debugMode.user":"Ange ett användarnamn för felsökningsläget.","ui.maintenance.debugMode.password":"Ange ett lösenord för felsökningsläget.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode cachar PHP-filer pÃ¥ webbprocessen för snabbare exekvering. Det mÃ¥ste tas bort under vissa omständigheter om filer inte känns igen efter ändring.","ui.maintenance.opcodeCache.button":"Stympa Cache","ui.maintenance.safeMode":"Ej tillgängligt i felsäkert läge Safe Mode","ui.maintenance.unsupported":"Stöds inte av din Contao-version","ui.packages.updateButton":"Uppdatera paket","ui.packages.searchButton":"Sök paket","ui.packages.searchPlaceholder":"Sök paket …","ui.packages.uploadOverlay":"Dra och släpp filer för att ladda upp","ui.packages.uploadButton":"Ladda upp paket","ui.packages.uploadMessage":"Du har en obekräftad uppladdning. | Du har {count} obekräftade uppladdningar.","ui.packages.uploadApply":"Bekräfta uppladdningar","ui.packages.uploadReset":"Ta bort uppladdningar","ui.packages.uploadIncomplete":"Den här filen laddades inte upp helt. Ta bort den och försök igen.","ui.packages.uploadDuplicate":"Den här filen verkar ha laddats upp flera gÃ¥nger. Ta bort dubbletterna.","ui.packages.uploadInstalled":"Den här filen är redan installerad. Ta bort dubbletterna.","ui.packages.uploadUnsupported":"Uppladdningar stöds inte i din installation. Se till att PHP ZIP-tillägget är installerat och uppdatera dina beroenden.","ui.packages.changesMessage":"Du har en obekräftad förändring. | Du har {count} obekräftade ändringar.","ui.packages.changesDryrun":"Testkörning","ui.packages.changesApply":"Applicera förändringar","ui.packages.changesApplyAll":"Uppdatera alla paket","ui.packages.changesDryrunAll":"Testkör alla paket","ui.packages.changesReset":"Ã…terställ ändringar","ui.packages.changesReview":"Granska ändringar","ui.packagelist.loading":"Laddning ...","ui.packagelist.uploads":"Uppladdningar","ui.packagelist.added":"Nya paket","ui.packagelist.installed":"Installerade paket","ui.package.hintRevert":"Ã…terställ ändringar","ui.package.hintNoupdate":"Uppdatera inte","ui.package.hintConstraint":"Det här paketet kommer att installeras med begränsningen {constraint} när du tillämpar ändringarna.","ui.package.hintConstraintBest":"Det här paketet kommer att installeras i den bästa tillgängliga versionen när du tillämpar ändringarna.","ui.package.hintConstraintChange":"Begränsningen för detta paket kommer att ändras frÃ¥n \\"{from}\\" till \\"{to}\\" när du tillämpar ändringarna.","ui.package.hintConstraintUpdate":"Detta paket kommer att uppdateras när du tillämpar ändringarna.","ui.package.hintAdded":"Det här paketet kommer att installeras när du tillämpar ändringarna.","ui.package.hintRemoved":"Detta paket kommer att tas bort när du tillämpar ändringarna.","ui.package.requiredTitle":"manuellt lagt till","ui.package.requiredText":"Det här paketet krävs i din composer.json men är inte installerat.","ui.package.removedTitle":"tas bort manuellt","ui.package.removedText":"Det här paketet togs bort frÃ¥n din composer.json.","ui.package.installed":"För närvarande installerad:","ui.package.version":"Version {version}","ui.package.additionalDownloads":"{count} Nedladdning | {count} nedladdningar","ui.package.additionalStars":"{count} stjärna | {count} stjärnor","ui.package.editConstraint":"Redigera","ui.package.uploadConstraint":"Denna begränsning definieras av det uppladdade paketet.","ui.package.updateButton":"Uppdatering","ui.package.removeButton":"Ta bort","ui.package.installButton":"Lägg till paket","ui.package.installButtonShort":"Lägg till","ui.package.detailsButton":"Detaljer","ui.package.latestConstraint":"senaste versionen","ui.package.update":"Uppdatering tillgänglig","ui.package.updateLatest":"senaste versionen","ui.package.updateAvailable":"{version} tillgänglig","ui.package.updateUnknown":"okänd version","ui.package.updateConstraint":"En nyare version utanför din versionsbegränsning är tillgänglig.","ui.package.incompatible":"{package} fungerar inte med Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Version {version}","ui.cloudStatus.waitingTime":"Väntetid","ui.cloudStatus.jobs":"Aktuella jobb","ui.cloudStatus.workers":"Arbetare","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"ingen","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ca. {minutes} min {seconds} sek","ui.cloudStatus.error":"Det gÃ¥r inte att hämta status för Composer Resolver Cloud. Det kan vara nere pÃ¥ grund av underhÃ¥ll eller upplevelseproblem.","ui.cloudStatus.button":"Molnstatus","ui.cloudStatus.refresh":"Uppdatera molnstatus","ui.log-viewer.loading":"Laddning ...","ui.log-viewer.empty":"Det finns inga loggfiler pÃ¥ din server.","ui.log-viewer.reload":"Ladda om","ui.log-viewer.file":"Loggfil","ui.log-viewer.channel":"Kanal","ui.log-viewer.channelTitle":"Kanalen som detta meddelande loggades pÃ¥.","ui.log-viewer.level":"NivÃ¥","ui.log-viewer.levelTitle":"Allvaret i loggmeddelandet.","ui.log-viewer.timeHeader":"Tid","ui.log-viewer.messageHeader":"Meddelande","ui.log-viewer.showContext":"Visa sammanhang","ui.log-viewer.hideContext":"Dölj sammanhang","ui.log-viewer.showExtra":"Visa extra","ui.log-viewer.hideExtra":"Dölj extra","ui.log-viewer.more":"Ladda mer …","ui.log-viewer.download":"Ladda ner","ui.log-viewer.downloadTitle":"Nedladdning fil \\"{file}\\"","ui.log-viewer.prodEnvironment":"Produktionsmiljö","ui.log-viewer.devEnvironment":"Utvecklingsmiljö (felsökningsläge)","ui.user-manager.loading":"Laddar användare ...","ui.user-manager.changePassword":"Ändra lösenord","ui.user-manager.setupTotp":"Konfigurera tvÃ¥faktorsautentisering","ui.user-manager.disableTotp":"Inaktivera tvÃ¥faktorsautentisering","ui.user-manager.invite":"Bjud in användare","ui.user-manager.delete":"Radera","ui.user-manager.deleteConfirm":"Vill du verkligen ta bort användaren â€{användarnamn}â€?","ui.user-manager.deleted":"Användaren {användarnamn} raderades framgÃ¥ngsrikt","ui.user-manager.passwordHeadline":"Ändra lösenord","ui.user-manager.passwordText":"Om du vill ändra ditt lösenord anger du det nuvarande och ett nytt lösenord i respektive fält.","ui.user-manager.currentPassword":"Aktuellt lösenord","ui.user-manager.newPassword":"Nytt lösenord","ui.user-manager.passwordPlaceholder":"min. 8 tecken","ui.user-manager.submitPassword":"Skicka","ui.user-manager.passwordChanged":"Ditt lösenord har ändrats framgÃ¥ngsrikt.","ui.user-manager.passwordError":"Det här lösenordet är felaktigt.","ui.user-manager.inviteHeadline":"Bjud in användare","ui.user-manager.inviteText":"Om du behöver flera inloggningar för Contao Manager kan du skapa en inbjudningslänk här. Dela den här länken med nÃ¥gon eller använd den pÃ¥ en annan enhet för att skapa ett nytt konto med de angivna behörigheterna.","ui.user-manager.inviteSuccess1":"En ny inbjudningslänk har skapats. URL:en nedan kan användas för att skapa ett nytt användarkonto för denna Contao Manager. Inbjudan löper ut den {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Kopiera länken till ditt urklipp. Den fungerar bara en gÃ¥ng och du kommer inte att kunna se den igen efter att du har stängt den här dialogen.","ui.user-manager.createInvitation":"Skapa länk till inbjudan","ui.user-manager.clipboard":"Kopiera till urklipp","ui.user-manager.permissions":"Läs mer om behörigheter","ui.user-manager.cancel":"Avbryt","ui.user-manager.close":"Stänga","ui.user-manager.you":"Du","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"TvÃ¥faktorsautentisering","ui.totp.setupQr":"Vänligen skanna QR-koden med din 2FA/TOTP-app.","ui.totp.setupCode":"Om du inte kan skanna QR-koden, ange den här nyckeln istället:","ui.totp.codeLabel":"Verifieringskod","ui.totp.codeDescription":"Ange verifieringskoden som genereras av din 2FA/TOTP-app.","ui.totp.disableText":"Ange verifieringskoden för att inaktivera tvÃ¥faktorsautentisering.","ui.totp.invalid":"Verifieringskoden är ogiltig.","ui.totp.enable":"Aktivera","ui.totp.disable":"Inaktivera","ui.totp.cancel":"Avbryt","ui.totp.enabled":"TvÃ¥faktorsautentisering aktiverades framgÃ¥ngsrikt.","ui.totp.disabled":"TvÃ¥faktorsautentisering avaktiverades framgÃ¥ngsrikt.","ui.totp.setup":"Konfigurera tvÃ¥faktorsautentisering","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[557],{1557:function(a){a.exports=JSON.parse('{"ui.app.title":"РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Contao","ui.app.loading":"Загрузка ÑпиÑка раÑширений...","ui.app.language":"Переключить Ñзык Contao Manager","ui.app.colorDark":"Темный режим","ui.app.colorDarkTitle":"Переключить цветовую Ñхему на темную","ui.app.colorLight":"Светлый режим","ui.app.colorLightTitle":"Переключить цветовую Ñхему на Ñветлую","ui.discover.advertisement":"Реклама в ÑпиÑке раÑширений","ui.discover.loading":"Загрузка...","ui.discover.offline":"Ðе удалоÑÑŒ получить результаты.","ui.discover.offlineExplain":"Проверьте подключение к Ñети Интернет и отключите блокировку JavaScript в Ñвоем браузере.","ui.discover.offlineButton":"Попробовать еще раз","ui.discover.searchPlaceholder":"ПоиÑк в {count} раÑширениÑÑ…...","ui.discover.empty":"Ðет результатов Ð´Ð»Ñ {query}","ui.discover.more":"Другие результаты","ui.discover.sortBy":"Сортировать по","ui.discover.sortReleased":"ВыпуÑк","ui.discover.sortReleasedTitle":"Сортировать результаты по дате выпуÑка","ui.discover.sortLatest":"Обновлено","ui.discover.sortLatestTitle":"Сортировать результаты по поÑледнему обновлению","ui.discover.sortDownloads":"Загрузки","ui.discover.sortDownloadsTitle":"Сортировать результаты по количеÑтву загрузок","ui.discover.sortFavers":"Рейтинг","ui.discover.sortFaversTitle":"Сортировать результаты по рейтингу","ui.discover.detailsButton":"СведениÑ","ui.discover.latestPackages":"ПоÑледние и обновленные раÑширениÑ","ui.discover.faversPackages":"РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ Ð²Ñ‹Ñоким рейтингом","ui.discover.downloadsPackages":"Самые загружаемые раÑширениÑ","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Веб-Ñайт проекта","ui.package.private":"ЧаÑтный пакет","ui.package.privateTitle":"ЧаÑтные пакеты доÑтупны только у поÑтавщика (наприм., в виде загрузки ZIP-файла). ПоÑетите веб-Ñайт Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации.","ui.package.abandoned":"Заброшенный","ui.package.abandonedText":"Этот пакет отмечен как заброшенный и больше не поддерживаетÑÑ.","ui.package.abandonedReplace":"Этот пакет имеет ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð±Ñ€Ð¾ÑˆÐµÐ½Ð½Ð¾Ð³Ð¾ и больше не поддерживаетÑÑ. Ðвтор предлагает вмеÑто него иÑпользовать пакет {replacement}.","ui.package.contaoVersion":"ДоÑтупно Ð´Ð»Ñ Contao","ui.package-details.previous":"Детали предыдущего раÑширениÑ","ui.package-details.close":"Закрыть детали раÑширениÑ","ui.package-details.loading":"Загрузка...","ui.package-details.tabDescription":"ОпиÑание","ui.package-details.tabRequire":"ТребованиÑ","ui.package-details.tabFeatures":"ОÑобенноÑти","ui.package-details.tabSuggest":"ПредложениÑ","ui.package-details.tabConflict":"Конфликты","ui.package-details.tabDependents":"ЗавиÑимые","ui.package-details.linkRequires":"требует","ui.package-details.linkReplaces":"заменÑет","ui.package-details.linkProvides":"обеÑпечивает","ui.package-details.linkConflicts":"конфликты","ui.package-details.funding":"ФинанÑировать дальнейшее развитие!","ui.package-details.contaoVersions":"Поддерживаемые верÑии Contao","ui.package-details.latest":"ПоÑледнÑÑ Ð²ÐµÑ€ÑиÑ","ui.package-details.released":"выпуÑк от","ui.package-details.license":"ЛицензиÑ(и)","ui.package-details.authors":"из","ui.package-details.more":"Еще","ui.package-details.packagist":"Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ пакете","ui.package-details.metadata":"Редактировать метаданные","ui.package-details.support_docs":"ДокументациÑ","ui.package-details.support_wiki":"Вики","ui.package-details.support_forum":"Форум поддержки","ui.package-details.support_issues":"Проблемы / Отчет об ошибках","ui.package-details.support_source":"ИÑходный код","ui.package-details.support_irc":"IRC / Чат","ui.package-details.support_email":"E-Mail поддержки","ui.package-details.support_rss":"RSS-канал"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[826],{9472:function(t,e,s){t.exports=s.p+"img/database.7f0a8c49.svg"},9826:function(t,e,s){s.r(e),s.d(e,{default:function(){return K}});var a=s(641),i=s(33),n=s(9472);const o={class:"database-migration__header"},l={class:"database-migration__headline"},r={key:0,class:"database-migration__text"},c={key:1,class:"database-migration__text"},u={class:"database-migration__description"},h={class:"database-migration__loading"},g={key:0,class:"database-migration__description"},m={key:1,class:"database-migration__description"},d={key:2,class:"database-migration__description"},p={class:"database-migration__actions"},b=["disabled"],y={class:"database-migration__actions"},k=["disabled"],_=["disabled"],w=["disabled"],$=["disabled"],v=["disabled"],C={class:"database-migration__description"},E={class:"database-migration__actions"},f={key:0,class:"database-migration__actions"};function x(t,e,s,x,A,D){const L=(0,a.g2)("loading-spinner"),T=(0,a.g2)("loading-button"),X=(0,a.g2)("check-box"),R=(0,a.g2)("console-output"),F=(0,a.g2)("boxed-layout");return(0,a.uX)(),(0,a.Wv)(F,{wide:!0,slotClass:"database-migration"},{default:(0,a.k6)((()=>[(0,a.Lk)("header",o,[e[7]||(e[7]=(0,a.Lk)("img",{src:n,width:"80",height:"80",alt:"",class:"database-migration__icon"},null,-1)),(0,a.Lk)("h1",l,(0,i.v_)(t.$t("ui.migrate.headline")),1),"migrations-only"===t.type?((0,a.uX)(),(0,a.CE)("p",r,(0,i.v_)(t.$t("ui.migrate.migrationsOnly")),1)):(0,a.Q3)("",!0),"schema-only"===t.type?((0,a.uX)(),(0,a.CE)("p",c,(0,i.v_)(t.$t("ui.migrate.schemaOnly")),1)):(0,a.Q3)("",!0),t.checking?((0,a.uX)(),(0,a.CE)(a.FK,{key:2},[(0,a.Lk)("p",u,(0,i.v_)(t.$t("ui.migrate.loading")),1),(0,a.Lk)("div",h,[(0,a.bF)(L)])],64)):D.isEmpty?((0,a.uX)(),(0,a.CE)(a.FK,{key:3},["migrations-only"===t.type?((0,a.uX)(),(0,a.CE)("p",g,(0,i.v_)(t.$t("ui.migrate.emptyMigrations")),1)):"schema-only"===t.type?((0,a.uX)(),(0,a.CE)("p",m,(0,i.v_)(t.$t("ui.migrate.emptySchema")),1)):((0,a.uX)(),(0,a.CE)("p",d,(0,i.v_)(t.$t("ui.migrate.empty")),1)),(0,a.Lk)("div",p,["migrations-only"===t.type||"schema-only"===t.type?((0,a.uX)(),(0,a.CE)("button",{key:0,class:"widget-button widget-button--primary",disabled:t.closing,onClick:e[0]||(e[0]=t=>D.checkAll())},(0,i.v_)(t.$t("ui.migrate.retryAll")),9,b)):(0,a.Q3)("",!0),(0,a.bF)(T,{loading:t.closing,onClick:D.close},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.close")),1)])),_:1},8,["loading","onClick"])])],64)):!t.executing&&(D.isComplete||D.hasError||D.hasProblem)?((0,a.uX)(),(0,a.CE)(a.FK,{key:4},[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(D.description.split("\n"),((t,e)=>((0,a.uX)(),(0,a.CE)("p",{class:"database-migration__description",key:e},(0,i.v_)(t),1)))),128)),(0,a.Lk)("div",y,["problem"===t.type?((0,a.uX)(),(0,a.CE)(a.FK,{key:0},[(0,a.bF)(T,{loading:t.closing,onClick:D.close},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.cancel")),1)])),_:1},8,["loading","onClick"]),(0,a.Lk)("button",{class:"widget-button",disabled:t.closing,onClick:e[1]||(e[1]=(...t)=>D.setup&&D.setup(...t))},(0,i.v_)(t.$t("ui.migrate.setup")),9,k),(0,a.Lk)("button",{class:"widget-button widget-button--primary",disabled:t.closing,onClick:e[2]||(e[2]=t=>D.checkAll())},(0,i.v_)(t.$t("ui.migrate.retry")),9,_)],64)):"warning"===t.type?((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.bF)(T,{loading:t.closing,onClick:D.close},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.cancel")),1)])),_:1},8,["loading","onClick"]),(0,a.Lk)("button",{class:"widget-button widget-button",disabled:t.closing,onClick:e[3]||(e[3]=t=>D.checkAll())},(0,i.v_)(t.$t("ui.migrate.retry")),9,w),(0,a.Lk)("button",{class:"widget-button widget-button--primary",disabled:t.closing,onClick:e[4]||(e[4]=t=>D.checkAll(!0))},(0,i.v_)(t.$t("ui.migrate.skip")),9,$)],64)):t.hasChanges?((0,a.uX)(),(0,a.CE)(a.FK,{key:2},[(0,a.bF)(T,{loading:t.closing,onClick:D.close},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.cancel")),1)])),_:1},8,["loading","onClick"]),(0,a.Lk)("button",{class:"widget-button widget-button--primary",disabled:t.closing,onClick:e[5]||(e[5]=t=>D.check())},(0,i.v_)(t.$t("ui.migrate.continue")),9,v)],64)):((0,a.uX)(),(0,a.Wv)(T,{key:3,loading:t.closing,onClick:D.close},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.confirm")),1)])),_:1},8,["loading","onClick"]))])],64)):((0,a.uX)(),(0,a.CE)(a.FK,{key:5},[(0,a.Lk)("p",C,(0,i.v_)(t.$t("ui.migrate.pending")),1),(0,a.Lk)("div",E,[(0,a.bF)(T,{class:"database-migration__action",loading:t.closing,disabled:t.executing,onClick:D.close},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.cancel")),1)])),_:1},8,["loading","disabled","onClick"]),(0,a.bF)(T,{class:"database-migration__action",color:"primary",loading:t.executing,disabled:t.closing,onClick:D.execute},{default:(0,a.k6)((()=>[(0,a.eW)((0,i.v_)(t.$t("ui.migrate.execute")),1)])),_:1},8,["loading","disabled","onClick"])]),t.hasDeletes?((0,a.uX)(),(0,a.CE)("div",f,[(0,a.bF)(X,{name:"withDeletes",label:t.$t("ui.migrate.withDeletes"),disabled:t.executing,modelValue:t.withDeletes,"onUpdate:modelValue":e[6]||(e[6]=e=>t.withDeletes=e)},null,8,["label","disabled","modelValue"])])):(0,a.Q3)("",!0)],64))]),!t.checking&&t.operations&&t.operations.length?((0,a.uX)(),(0,a.Wv)(R,{key:0,class:"database-migration__main",title:D.consoleTitle,operations:t.operations,"console-output":D.console,"force-console":D.hasProblem},null,8,["title","operations","console-output","force-console"])):(0,a.Q3)("",!0)])),_:1})}s(4114),s(8111),s(7588),s(1701);var A=s(6278),D=s(4335),L=s(707),T=s(728),X=s(9045),R=s(85),F=s(2864),O=s(3480),W={components:{BoxedLayout:T.A,LoadingSpinner:X.A,LoadingButton:R.A,ConsoleOutput:F.A,CheckBox:O.A},data:()=>({type:null,status:"",changes:null,hasDeletes:!1,operations:null,hash:null,withDeletes:!1,previousResult:!0,checking:!0,executing:!1,closing:!1}),computed:{...(0,A.aH)("server/database",["supported"]),...(0,A.aH)(["setupStep"]),...(0,A.L8)("server/database",["hasChanges"]),isEmpty:t=>"active"!==t.status&&t.operations&&!t.operations.length,isComplete:t=>"complete"===t.status,hasError:t=>"error"===t.status,hasProblem:t=>"problem"===t.type||"warning"===t.type,description(){return"problem"===this.type?this.$tc("ui.migrate.problem",this.operations?.length||0):"warning"===this.type?this.$t("ui.migrate.warning"):this.previousResult&&this.hasChanges?this.$t("ui.migrate.previousChanges"):this.previousResult?this.$t("ui.migrate.previousComplete"):this.isComplete&&this.hasChanges?this.$t("ui.migrate.appliedChanges"):this.isComplete?this.$t("ui.migrate.appliedComplete"):this.$t("ui.migrate.error")},consoleTitle(){switch(this.type){case"migrations":case"migrations-only":return this.$t("ui.migrate.migrationTitle");case"schema":case"schema-only":return this.$t("ui.migrate.schemaTitle");case"problem":return this.$t("ui.migrate.problemTitle");case"warning":return this.$t("ui.migrate.warningTitle")}return""},console(){if(!this.changes||!this.changes.length)return"";let t="";return this.changes.forEach((e=>{t+=`${e.name}\n`})),t}},methods:{async poll(t){if(201===t.status)return new Promise((t=>{setTimeout((async()=>{await this.poll(await D.A.get("api/contao/database-migration")),t()}),1e3)}));const e=t.data;return this.changes&&!e.status||(this.type=e.type,this.status=e.status,this.hash=e.hash,this.changes=e.operations),e.status&&"active"!==e.status?void 0:new Promise((t=>{setTimeout((async()=>{await this.poll(await D.A.get("api/contao/database-migration")),t()}),1e3)}))},async execute(){this.executing=!0,await D.A.put("api/contao/database-migration",{type:this.type,hash:this.hash,withDeletes:this.withDeletes&&this.hasDeletes}),setTimeout((async()=>{await this.poll(await D.A.get("api/contao/database-migration")),await this.$store.dispatch("server/database/get",!1),this.executing=!1}),1e3)},async check(t=!1){this.checking=!0;const e=this.type||this.$store.state.migrationsType;this.status&&(this.type=null,this.status="",this.changes=null,this.hash=null,await D.A.delete("api/contao/database-migration"));let s=await D.A.get("api/contao/database-migration");204===s.status&&(this.previousResult=!1,s=await D.A.put("api/contao/database-migration",{type:e,skipWarnings:t})),await this.poll(s),await D.A.delete("api/contao/database-migration"),this.checking=!1},checkAll(t=!1){this.type=null,this.check(t)},generateStatus(t,e){return e?`~${t}~`:t},async close(){this.closing=!0,await D.A.delete("api/contao/database-migration"),await this.$store.dispatch("server/database/get",!1),this.setupStep>0?(await this.$store.dispatch("server/adminUser/get",!1),this.$store.commit("setView",L.A.SETUP)):this.$store.commit("setView",L.A.READY),this.closing=!1},async setup(){this.$store.commit("setup",3)},updateOperations(){if(this.hasDeletes=!1,this.operations=null,!this.changes)return;if(this.hasProblem)return void(this.operations=this.changes.map((t=>({status:t.status,summary:t.name,details:t.message,console:t.trace}))));if("migrations"===this.type||"migrations-only"===this.type)return void(this.operations=this.changes.map((t=>({status:t.status,summary:t.name,details:t.message}))));const t=[];this.changes.forEach((e=>{let s;if(s=new RegExp("^CREATE TABLE ([^ ]+) .+$").exec(e.name),s)t.push({status:e.status,summary:this.$t("ui.migrate.addTable",{table:s[1]}),details:e.message,console:e.name});else{if(s=new RegExp("^DROP TABLE (.+)$").exec(e.name),s)return t.push({status:this.withDeletes?e.status:"skipped",summary:this.generateStatus(this.$t("ui.migrate.dropTable",{table:s[1]}),!this.withDeletes),details:e.message,console:e.name}),void(this.hasDeletes=!0);if(s=new RegExp("^CREATE INDEX ([^ ]+) ON ([^ ]+) \\(([^)]+)\\)$").exec(e.name),s)t.push({status:e.status,summary:this.$t("ui.migrate.createIndex",{name:s[1],table:s[2]}),details:e.message||s[3],console:e.name});else{if(s=new RegExp("^DROP INDEX ([^ ]+) ON ([^ ]+)$").exec(e.name),s)return t.push({status:this.withDeletes?e.status:"skipped",summary:this.generateStatus(this.$t("ui.migrate.dropIndex",{name:s[1],table:s[2]}),!this.withDeletes),details:e.message,console:e.name}),void(this.hasDeletes=!0);if(s=new RegExp("^ALTER TABLE ([^ ]+) (.+)$").exec(e.name),s){const a=s[1],i={status:e.status,summary:[],details:[],console:e.name};e.message&&i.details.push(e.message);let n="";s[2].split("'").forEach(((t,e)=>{n=e%2?`${n}'${t.replace(",","%comma%")}'`:`${n}${t}`}));const o=n.split(",").map((t=>t.trim().replace("%comma%",",")));let l=0;return o.forEach((t=>{let s;return s=new RegExp("^ADD ([^ ]+) (.+)$").exec(t),s?(i.summary.push(this.$t("ui.migrate.addField",{table:a,field:s[1]})),void(e.message||i.details.push(s[2]))):(s=new RegExp("^CHANGE ([^ ]+) ([^ ]+) (.+)$").exec(t),s?(i.summary.push(this.$t("ui.migrate.changeField",{table:a,field:s[1]})),void(e.message||i.details.push(s[3]))):(s=new RegExp("^DROP (.+)$").exec(t),s?(i.summary.push(this.generateStatus(this.$t("ui.migrate.dropField",{table:a,field:s[1]}),!this.withDeletes)),i.details.push(""),this.hasDeletes=!0,void l++):(i.summary.push(`ALTER TABLE ${a} ${t}`),void i.details.push(""))))})),l===o.length&&(i.status=this.withDeletes?e.status:"skipped"),void t.push(i)}t.push({status:e.status,summary:e.name,details:e.message,console:e.name}),this.hasDeletes=!0}}})),this.operations=t}},watch:{changes(){this.updateOperations()},withDeletes(){this.updateOperations()}},mounted(){this.check()}},P=s(6262);const S=(0,P.A)(W,[["render",x]]);var K=S}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[139],{4139:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! اتصال ناامن !!","ui.app.httpsDescription":"Without HTTPS your confidential data will be transferred unencrypted.","ui.app.httpsLink":"اطلاعات بیشتر","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.loading":"Loading Contao Manager …","ui.app.apiError":"وضعیت API غیرمنتظره","ui.app.configSecurity1":"SECURITY ALERT !!! Unprotected config directory detected","ui.app.configSecurity2":"The Contao Manager has detected that its config files are publicly accessible. All operations are disabled until the directory is secured, otherwise an attacker could access sensitive data of your installation.\\n\\nTo fix this issue, make sure to prevent access to the \\"contao-manager\\" directory on your server. To learn how to do this, please refer to the manual of your webserver or contact your hosting provider.","ui.account.welcome":"Welcome","ui.account.intro1":"Welcome to the Contao Manager, a universal tool to install and manage Contao Open Source CMS. If you are new to it, please {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} to get started","ui.account.introManual":"read the manual","ui.account.intro2":"If you encounter any problems, check {ourGithubIssues} and feel free to create new one for anything that has not been reported yet.","ui.account.introIssues":"our GitHub issues","ui.account.headline":"حساب کاربری","ui.account.description":"To manage your installation, please create an account for the Contao Manager. Be aware that this account is not related to the Contao back end or front end.","ui.account.username":"نام کاربری","ui.account.password":"گذرواژه","ui.account.passwordConfirm":"تایپ مجدد گذرواژه","ui.account.passwordPlaceholder":"حداقل Û¸ نویسه","ui.account.passwortLength":"Ù„Ø·ÙØ§ حداقل Û¸ نویسه وارد نمایید.","ui.account.passwortDifferent":"The password does not match the confirmation.","ui.account.submit":"ایجاد حساب","ui.account.contribute1":"Contao and the Contao Manager are sponsored by the non-profit Contao Association.","ui.account.contribute2":"Please consider contributing to open source by {donate}.","ui.account.contributeDonate":"making a donation","ui.login.headline":"ورود","ui.login.description":"برای مدیریت نصب‌تان وارد شوید.","ui.login.username":"نام کاربری","ui.login.password":"گذرواژه","ui.login.forgotPassword":"گذرواژه‌ی خود را ÙØ±Ø§Ù…وش کرده‌اید؟","ui.login.button":"ورود","ui.login.locked":"Access has been denied because the Contao Manager is locked. To unlock, delete the {lockFile} file in your Contao root directory.","ui.logout.headline":"Session Timeout","ui.logout.warning":"Your have been inactive for more than 25 minutes. For security reasons your session will be terminated shortly.","ui.logout.expired":"Your session was automatically terminated because you have been inactive for more than 30 minutes.","ui.logout.renew":"Keep Logged In","ui.logout.logout":"خروج","ui.logout.login":"Back To Login","ui.oauth.error":"Invalid OAuth attempt. Check the request parameters.","ui.oauth.https":"The redirect URI MUST use a secure protocol (https:) to prevent the authentication token from being transmitted in clear-text.","ui.oauth.headline":"Remote Authentication","ui.oauth.description":"The following application or service is requesting remote access to your Contao Manager instance.","ui.oauth.domain":"Before allowing access, make sure you know this URL and trust its owner!","ui.oauth.allow":"Allow Access","ui.oauth.deny":"Deny Access","ui.boot.headline":"System Check","ui.boot.description":"Please wait, we are analyzing your server …","ui.boot.issue1":"Installation Issues Detected","ui.boot.issue2":"Your installation has issues that have to be fixed before the Contao Manager can be used.","ui.boot.run":"Launch Contao Manager","ui.recovery.headline":"System Recovery","ui.recovery.description":"The Contao Manager detected files that look like Contao, but the Command Line Interface does not work as expected.","ui.recovery.console":"Console Output","ui.recovery.repairOptions":"Please choose an option to repair your installation.","ui.recovery.repairHeadline":"Automatic Repair","ui.recovery.repairDescription":"Attempts to automatically repair the installation by rebuilding the application cache and re-installing the Composer packages.","ui.recovery.repairWarning":"Any modifications to the vendor files might be deleted in the process!","ui.recovery.repairFailed":"Automatic repair was not successful. Try the Safe Mode to manually repair the installation.","ui.recovery.repairButton":"Run System Repair","ui.recovery.safeModeHeadline":"Safe Mode","ui.recovery.safeModeDescription":"Launching the Contao Manager in Safe Mode allows to manage packages and run certain maintenance tasks, but features that rely on a working Contao installation will not be available.","ui.recovery.safeModeButton":"Launch in Safe Mode","ui.server.pending":"Waiting …","ui.server.running":"Analyzing …","ui.server.error":"Check failed due to an unexpected response from the server.","ui.server.details":"جزئیات","ui.server.prerequisite":"Check cancelled due to a missing prerequisite.","ui.server.selfUpdate.title":"Updates of Contao Manager","ui.server.selfUpdate.update":"A new Contao Manager version {latest} is available.","ui.server.selfUpdate.manualUpdate":"A new Contao Manager version {latest} is available. Your server does not support automatic updates, please download the new version from {download}.","ui.server.selfUpdate.latest":"You are using the latest version {current}.","ui.server.selfUpdate.dev":"Development builds do not support automatic updates.","ui.server.selfUpdate.unsupported":"A new version is available but it does not support your PHP version.","ui.server.selfUpdate.button":"Run Self-Update","ui.server.selfUpdate.continue":"Continue","ui.server.config.title":"Server Configuration","ui.server.config.setup":"Configure","ui.server.config.change":"Change","ui.server.config.save":"Save","ui.server.config.blankOption":"Please select …","ui.server.config.customOption":"Other …","ui.server.config.description":"To correctly run background tasks, the Contao Manager needs to know where to find the PHP command line binary and how to run commands separated from the web process.","ui.server.config.formTitle":"Server Configuration","ui.server.config.formText":"Ù„Ø·ÙØ§ مسیر باینری PHP‌ تان را وارد نمایید. مطمئن شوید Ú©Ù‡ باینری همان نسخه‌ی PHP روند وب‌تان باشد.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"The Composer Resolver Cloud allows to install Composer dependencies even if your server does not provide enough local memory. Please be aware that your package information will be transmitted to a cloud server operated by the Contao Association.","ui.server.config.cloud":"Use the Composer Resolver Cloud","ui.server.config.cli":"PHP Binary","ui.server.config.stateErrorCli":"No valid PHP binary was found on the server.","ui.server.config.stateErrorCloud":"The Composer Resolver Cloud is not supported.","ui.server.config.stateSuccess":"PHP binary at {php_cli}.","ui.server.php_web.title":"PHP Web Process","ui.server.php_web.below7":"Found PHP version {version}. Please switch to PHP 7 as soon as possible!","ui.server.php_web.success":"Found PHP version {version}, no known issues found.","ui.server.php_cli.title":"PHP Command Line Interface","ui.server.php_cli.success":"Found PHP version {version}, no known issues found.","ui.server.composer.title":"Composer Environment","ui.server.composer.success":"No known issues found.","ui.server.composer.install":"Composer dependencies are not installed.","ui.server.composer.button":"Run Composer","ui.server.composer.safeMode":"Run Safe Mode","ui.server.contao.title":"نصب کانتائو","ui.server.contao.setup":"Setup","ui.server.contao.empty":"No Contao installation has been found.","ui.server.contao.old":"Contao version {version} is not compatible with the Contao Manager, please update your installation manually.","ui.server.contao.found":"Found Contao {version} (API version {api}).","ui.server.contao.headline":"Contao Setup","ui.server.contao.description":"Welcome to the setup process of your Contao Open Source CMS. You can choose between two versions to install.","ui.server.contao.publicDir":"Use {dir} for public files (for Contao {version})","ui.server.contao.ltsTitle":"Long Term Support","ui.server.contao.ltsText":"The LTS version has an extended support period of up to four years.","ui.server.contao.latestTitle":"Latest","ui.server.contao.latestText":"A new latest version is released every six months in February and August.","ui.server.contao.noLatest":"Requires at least PHP {version}.","ui.server.contao.releaseplan":"See the {contaoReleasePlan} for detailed information.","ui.server.contao.releaseplanLink":"Contao Release Plan","ui.server.contao.formTitle":"نصب کانتائو","ui.server.contao.formText":"نسخه‌ی کانتائو برای نصب را انتخاب کنید.","ui.server.contao.version":"نسخه","ui.server.contao.coreOnly":"Initial Setup","ui.server.contao.coreOnlyNo":"Full Installation (News, Calendar, etc.)","ui.server.contao.coreOnlyYes":"Minimal Installation (Core only)","ui.server.contao.coreOnlyFeatures":"What\'s the difference?","ui.server.contao.noUpdate":"Skip Installation (Expert Only!)","ui.server.contao.install":"Finish","ui.server.docroot.headline":"Webserver Setup","ui.server.docroot.warning":"To install Contao through the Contao Manager, you have to fix the document root on the web server.","ui.server.docroot.description1":"Contao uses a separate folder for public files, application files are installed in its parent folder. Contao cannot be installed right now, because your folder structure is not correct or the folders are not empty.","ui.server.docroot.description2":"If you don\'t know how to configure your document root, please read the Contao documentation or contact your hosting provider.","ui.server.docroot.documentation":"Read the Documentation","ui.server.docroot.conflictsTitle":"Installation directory not empty","ui.server.docroot.conflictsDirectory":"The root directory of your future Contao installation is not empty, we have found {count} file(s) that might be overwritten by the installation process. It is recommended to create an empty directory structure for Contao, but you can also remove the following files and reload the page if you are sure they are unused.","ui.server.docroot.ignoreConflicts":"I want to install Contao into the non-empty directory. I understand that this might overwrite any existing files on my webspace.","ui.server.docroot.create":"Create directories","ui.server.docroot.formTitle":"Directory Setup","ui.server.docroot.formText1":"The Contao Manager can automatically create a new directory structure on the server.","ui.server.docroot.formText2":"You will need to manually configure the new document root (e.g. through a hosting admin panel).","ui.server.docroot.autoconfig":"I understand that I have to change my server configuration. Not configuring the document root will break the Contao Manager and expose configuration files (including account details and passwords)!","ui.server.docroot.directory":"New Directory","ui.server.docroot.currentRoot":"Current Document Root","ui.server.docroot.newRoot":"New Document Root","ui.server.docroot.finish":"Setup Directories","ui.server.docroot.directoryInvalid":"Please enter a valid directory name.","ui.server.docroot.directoryExists":"The target directory already exists. Please enter a different name.","ui.server.docroot.confirmation":"The Contao Manager has successfully created the necessary directory for your Contao installation. You now have to configure the document root on your web server. Do not reload this page until then.","ui.server.docroot.reload":"Reload Page","ui.task.headline":"Background Task","ui.task.loading":"Loading details …","ui.task.created":"Loading details …","ui.task.active":"Please wait while the Contao Manager is running task operations in the background.","ui.task.complete":"All operations are completed successfully. Check the console output for details.","ui.task.aborting":"Please wait while the background operations are being cancelled.","ui.task.stopped":"Some background operations were cancelled. Please check the console output.","ui.task.error":"A background operation stopped unexpectedly. Please check the console output.","ui.task.failed":"The Contao Manager failed to start a background task!","ui.task.failedDescription1":"Something went wrong while trying to execute operations in the background.","ui.task.failedDescription2":"If this happens again, your server might not be supported.","ui.task.reportProblem":"گزارش یک مشکل","ui.task.buttonAudit":"Update Database","ui.task.buttonClose":"بستن","ui.task.buttonConfirm":"تایید Ùˆ بستن","ui.task.buttonCancel":"لغو","ui.task.confirmCancel":"Are you sure to cancel this task? This might leave your Contao installation in a broken state!","ui.task.autoclose":"Close task details on success","ui.console.toggle":"Show/Hide Console Output","ui.console.showLog":"Show full console log","ui.console.copyLog":"Copy log to clipboard","ui.widget.mandatory":"این Ùیلد نباید خالی باشد.","ui.error.title":"HTTP request for \\"{method} {url}\\" failed.","ui.error.server500":"Looks like an unexpected error happened on your server. Please check the log files of your web server (Apache/Nginx) and the Contao Manager logs at \\"contao-manager/logs\\".","ui.error.response":"The server returned a response with status code {status}.","ui.error.moreLink":"اطلاعات بیشتر","ui.error.support":"Contao Support","ui.footer.help":"Ú©Ù…Ú©","ui.footer.reportProblem":"گزارش یک مشکل","ui.navigation.discover":"Discover","ui.navigation.packages":"بسته‌ها","ui.navigation.tools":"ابزارها","ui.navigation.installTool":"ابزار نصب","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Contao Debug Mode","ui.navigation.phpinfo":"PHP Information","ui.navigation.maintenance":"نگهداشت","ui.navigation.rebuildCache":"بازسازی نهان‌گاه","ui.navigation.systemCheck":"System Check","ui.navigation.advanced":"Ù¾ÛŒØ´Ø±ÙØªÙ‡","ui.navigation.logout":"خروج","ui.maintenance.rebuildCache.title":"Application Cache","ui.maintenance.rebuildCache.description":"Rebuilding the application cache is required after modifying any of the configuration files.","ui.maintenance.rebuildCache.rebuildProd":"Rebuild Production Cache","ui.maintenance.rebuildCache.rebuildDev":"Rebuild Development Cache","ui.maintenance.rebuildCache.clearProd":"Clear Production Cache","ui.maintenance.rebuildCache.clearDev":"Clear Development Cache","ui.maintenance.installTool.title":"Contao Install Tool","ui.maintenance.installTool.description":"The Contao Install Tool is automatically locked if you enter a wrong password three times in a row.","ui.maintenance.installTool.unlock":"Unlock Install Tool","ui.maintenance.installTool.lock":"Lock Install Tool","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"The Composer autoloader is responsible for PHP class loading. The autoloader must be dumped after adding custom namespaces to the root composer.json.","ui.maintenance.dumpAutoload.button":"Dump Autoloader","ui.maintenance.composerInstall.title":"Composer Dependencies","ui.maintenance.composerInstall.description":"Composer dependencies are located in the {vendor} folder in your application root. Reinstalling the dependencies can be necessary after manipulation or manually uploading the {composerLock} file.","ui.maintenance.composerInstall.button":"Run Installer","ui.maintenance.composerInstall.update":"Run Composer Update","ui.maintenance.composerCache.title":"Composer Cache","ui.maintenance.composerCache.description":"Composer caches downloaded packages for improved performance. If you have issues like broken files, try to delete the Composer cache to force a new download.","ui.maintenance.composerCache.button":"Clear Cache","ui.maintenance.maintenanceMode.title":"Maintenance Mode","ui.maintenance.maintenanceMode.description":"Putting Contao in maintenance mode will display a \\"503 Service Unavailable\\" template for the website.","ui.maintenance.maintenanceMode.enable":"Enable","ui.maintenance.maintenanceMode.disable":"Disable","ui.maintenance.debugMode.title":"Debug Mode","ui.maintenance.debugMode.description":"Activate the debug mode by setting a user and password for the {appDevPhp} entry point.","ui.maintenance.debugMode.descriptionJwt":"Activate the debug mode by setting the debug cookie for the current domain.","ui.maintenance.debugMode.activate":"Activate","ui.maintenance.debugMode.deactivate":"Deactivate","ui.maintenance.debugMode.credentials":"Credentials","ui.maintenance.debugMode.user":"Please enter a username for the debug mode.","ui.maintenance.debugMode.password":"Please enter a password for the debug mode.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode caches PHP files on the web process for faster execution. It must be deleted under certain circumstances if files are not recognized after changing.","ui.maintenance.opcodeCache.button":"Truncate Cache","ui.maintenance.safeMode":"Not available in Safe Mode","ui.maintenance.unsupported":"Not supported by your Contao version","ui.packages.updateButton":"بروزرسانی بسته‌ها","ui.packages.searchButton":"Search Packages","ui.packages.searchPlaceholder":"Search Packages …","ui.packages.uploadOverlay":"Drag & drop files to upload","ui.packages.uploadButton":"Upload Packages","ui.packages.uploadMessage":"You have one unconfirmed upload. | You have {count} unconfirmed uploads.","ui.packages.uploadApply":"Confirm Uploads","ui.packages.uploadReset":"Delete Uploads","ui.packages.uploadIncomplete":"This file was not uploaded completely. Please remove it and try again.","ui.packages.uploadDuplicate":"This file seems to be uploaded multiple times. Please remove the duplicates.","ui.packages.uploadInstalled":"This file is already installed. Please remove the duplicates.","ui.packages.uploadUnsupported":"Uploads are not supported in your installation. Please make sure to update your dependencies.","ui.packages.changesMessage":"You have one unconfirmed change. | You have {count} unconfirmed changes.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"Apply Changes","ui.packages.changesApplyAll":"Update all packages","ui.packages.changesDryrunAll":"Dry run all packages","ui.packages.changesReset":"Reset Changes","ui.packages.changesReview":"Review Changes","ui.packagelist.loading":"بارگذاری ...","ui.packagelist.uploads":"Uploads","ui.packagelist.added":"New packages","ui.packagelist.installed":"Installed packages","ui.package.hintRevert":"بازگرداندن تغییرات","ui.package.hintNoupdate":"Do not update","ui.package.hintConstraint":"این بسته با محدودیت بهترین {constraint} نصب خواهد شد وقتی شما تغییرات را اعمال کنید.","ui.package.hintConstraintBest":"این بسته در بهترین نسخه‌ی موجود نصب خواهد شد وقتی شما تغییرات را اعمال کنید.","ui.package.hintConstraintChange":"محدودیت برای این بسته از «{from}» به «{to}» وقتی شما تغییرات را اعمال کنید تغییر داده خواهد شد.","ui.package.hintConstraintUpdate":"This package will be updated when you apply the changes.","ui.package.hintAdded":"This package will be installed when you apply the changes.","ui.package.hintRemoved":"این بسته حذ٠خواهد وقتی شما تغییرات را اعمال کنید.","ui.package.requiredTitle":"manually added","ui.package.requiredText":"This package is required in your composer.json but not installed.","ui.package.removedTitle":"manually removed","ui.package.removedText":"This package was removed from your composer.json.","ui.package.installed":"Currently installed:","ui.package.version":"نسخه {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Star | {count} Stars","ui.package.editConstraint":"ویرایش","ui.package.uploadConstraint":"This constraint is defined by the uploaded package.","ui.package.updateButton":"Update","ui.package.removeButton":"حذÙ","ui.package.installButton":"Add Package","ui.package.installButtonShort":"Add","ui.package.detailsButton":"جزئیات","ui.package.latestConstraint":"آخرین نسخه","ui.package.update":"Update available","ui.package.updateLatest":"آخرین نسخه","ui.package.updateAvailable":"{version} available","ui.package.updateUnknown":"unknown version","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"نسخه {version}","ui.cloudStatus.waitingTime":"Waiting Time","ui.cloudStatus.jobs":"Current Jobs","ui.cloudStatus.workers":"Workers","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"none","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ca. {minutes} min {seconds} sec","ui.cloudStatus.error":"Unable to fetch the status of the Composer Resolver Cloud. It might be down for maintenance or experience issues.","ui.cloudStatus.button":"Cloud Status","ui.cloudStatus.refresh":"Refresh Cloud Status"}')}}]);(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[504],{33:function(e,t,n){"use strict"; /** * @vue/shared v3.5.16 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ /*! #__NO_SIDE_EFFECTS__ */ function r(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return e=>e in t}n.d(t,{$3:function(){return h},$H:function(){return F},BH:function(){return G},BX:function(){return re},Bm:function(){return E},C4:function(){return Q},CE:function(){return m},CP:function(){return u},DY:function(){return $},Gv:function(){return w},J$:function(){return ee},Kg:function(){return _},MZ:function(){return o},Mp:function(){return l},NO:function(){return a},Oj:function(){return i},PT:function(){return N},Qd:function(){return O},Ro:function(){return B},SU:function(){return R},TF:function(){return d},Tg:function(){return P},Tn:function(){return b},Tr:function(){return X},We:function(){return H},X$:function(){return c},Y2:function(){return te},ZH:function(){return M},Zf:function(){return k},_B:function(){return J},bB:function(){return U},cy:function(){return p},gd:function(){return y},pD:function(){return r},rU:function(){return D},tE:function(){return s},u3:function(){return oe},vM:function(){return v},v_:function(){return se},yI:function(){return A},yL:function(){return S},yQ:function(){return j}});const o={},i=[],s=()=>{},a=()=>!1,l=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),u=e=>e.startsWith("onUpdate:"),c=Object.assign,d=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},f=Object.prototype.hasOwnProperty,h=(e,t)=>f.call(e,t),p=Array.isArray,m=e=>"[object Map]"===C(e),v=e=>"[object Set]"===C(e),g=e=>"[object Date]"===C(e),y=e=>"[object RegExp]"===C(e),b=e=>"function"===typeof e,_=e=>"string"===typeof e,E=e=>"symbol"===typeof e,w=e=>null!==e&&"object"===typeof e,S=e=>(w(e)||b(e))&&b(e.then)&&b(e.catch),T=Object.prototype.toString,C=e=>T.call(e),k=e=>C(e).slice(8,-1),O=e=>"[object Object]"===C(e),A=e=>_(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,R=r(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),I=e=>{const t=Object.create(null);return n=>{const r=t[n];return r||(t[n]=e(n))}},L=/-(\w)/g,N=I((e=>e.replace(L,((e,t)=>t?t.toUpperCase():"")))),x=/\B([A-Z])/g,P=I((e=>e.replace(x,"-$1").toLowerCase())),M=I((e=>e.charAt(0).toUpperCase()+e.slice(1))),D=I((e=>{const t=e?`on${M(e)}`:"";return t})),F=(e,t)=>!Object.is(e,t),$=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},U=e=>{const t=parseFloat(e);return isNaN(t)?e:t},B=e=>{const t=_(e)?Number(e):NaN;return isNaN(t)?e:t};let V;const H=()=>V||(V="undefined"!==typeof globalThis?globalThis:"undefined"!==typeof self?self:"undefined"!==typeof window?window:"undefined"!==typeof n.g?n.g:{});const W="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",G=r(W);function X(e){if(p(e)){const t={};for(let n=0;n{if(e){const n=e.split(q);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function Q(e){let t="";if(_(e))t=e;else if(p(e))for(let n=0;nre(e,t)))}const ie=e=>!(!e||!0!==e["__v_isRef"]),se=e=>_(e)?e:null==e?"":p(e)||w(e)&&(e.toString===T||!b(e.toString))?ie(e)?se(e.value):JSON.stringify(e,ae,2):String(e),ae=(e,t)=>ie(t)?ae(e,t.value):m(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],r)=>(e[le(t,r)+" =>"]=n,e)),{})}:v(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>le(e)))}:E(t)?le(t):!w(t)||p(t)||O(t)?t:String(t),le=(e,t="")=>{var n;return E(e)?`Symbol(${null!=(n=e.description)?n:t})`:e}},34:function(e,t,n){"use strict";var r=n(4901);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},81:function(e,t,n){"use strict";var r=n(9565),o=n(9306),i=n(8551),s=n(6823),a=n(851),l=TypeError;e.exports=function(e,t){var n=arguments.length<2?a(e):t;if(o(n))return i(r(n,e));throw new l(s(e)+" is not iterable")}},85:function(e,t,n){"use strict";n.d(t,{A:function(){return d}});var r=n(641),o=n(33),i=n(3751);function s(e,t,n,s,a,l){const u=(0,r.g2)("loading-spinner");return(0,r.uX)(),(0,r.Wv)((0,r.$y)(l.link?"a":"button"),{type:l.link?null:n.submit?"submit":"button",href:l.link,class:(0,o.C4)(l.buttonClass),disabled:n.disabled||n.loading,onClick:l.click,onMouseover:t[0]||(t[0]=t=>e.$emit("mouseover",t)),onMouseout:t[1]||(t[1]=t=>e.$emit("mouseout",t))},{default:(0,r.k6)((()=>[(0,r.Lk)("span",{class:(0,o.C4)(l.slotClass)},[(0,r.RG)(e.$slots,"default")],2),(0,r.bo)((0,r.bF)(u,null,null,512),[[i.aG,n.loading]])])),_:3},40,["type","href","class","disabled","onClick"])}var a=n(9045),l={components:{LoadingSpinner:a.A},emits:["click","mouseover","mouseout"],props:{href:String,to:[String,Object],color:String,icon:String,inline:Boolean,loading:Boolean,disabled:Boolean,submit:Boolean},computed:{buttonClass:e=>({"loading-button":!0,"widget-button":!0,"widget-button--inline":e.inline,[`widget-button--${e.color}`]:e.color,disabled:e.link&&(e.loading||e.disabled)}),slotClass:e=>({loading:e.loading,[`widget-button--${e.icon}`]:e.icon}),link:e=>e.href||e.to&&e.$router.resolve(e.to).href||null},methods:{click(e){this.submit||this.link||(e.preventDefault(),this.$emit("click",e))}}},u=n(6262);const c=(0,u.A)(l,[["render",s]]);var d=c},116:function(e,t,n){"use strict";var r=n(6518),o=n(9565),i=n(2652),s=n(9306),a=n(8551),l=n(1767),u=n(9539),c=n(4549),d=c("find",TypeError);r({target:"Iterator",proto:!0,real:!0,forced:d},{find:function(e){a(this);try{s(e)}catch(r){u(this,"throw",r)}if(d)return o(d,this,e);var t=l(this),n=0;return i(t,(function(t,r){if(e(t,n++))return r(t)}),{IS_RECORD:!0,INTERRUPTED:!0}).result}})},144:function(e,t,n){"use strict";const r=n(3908),o=(e,t,n=!1)=>{if(e instanceof r)return e;try{return new r(e,t)}catch(o){if(!n)return null;throw o}};e.exports=o},156:function(e,t,n){"use strict";var r=n(953);t.A={namespaced:!0,state:{modals:{}},getters:{hasModal:e=>Object.values(e.modals).reduce(((e,t)=>e+Object.values(t).length),0)>0,currentModal(e){const t=Object.keys(e.modals).sort(((e,t)=>t-e));for(const n of t){const t=Object.values(e.modals[n]);if(t.length>0)return t.find((()=>!0))}}},mutations:{open(e,{id:t,component:n,priority:o=0}){const i=Object.assign({},e.modals);i[o]||(i[o]={}),i[o][t]=(0,r.IG)(n),e.modals=i},close(e,t){const n=Object.assign({},e.modals);Object.keys(n).forEach((e=>{n[e]&&n[e][t]&&delete n[e][t]})),e.modals=n}}}},266:function(e,t){"use strict";t.A=e=>e?Intl&&Intl.NumberFormat?(new Intl.NumberFormat).format(e):e:""},270:function(e,t,n){"use strict";const r=n(3908),o=n(8311),i=(e,t,n)=>{let i=null,s=null,a=null;try{a=new o(t,n)}catch(l){return null}return e.forEach((e=>{a.test(e)&&(i&&1!==s.compare(e)||(i=e,s=new r(i,n)))})),i};e.exports=i},283:function(e,t,n){"use strict";var r=n(9504),o=n(9039),i=n(4901),s=n(9297),a=n(3724),l=n(350).CONFIGURABLE,u=n(3706),c=n(1181),d=c.enforce,f=c.get,h=String,p=Object.defineProperty,m=r("".slice),v=r("".replace),g=r([].join),y=a&&!o((function(){return 8!==p((function(){}),"length",{value:8}).length})),b=String(String).split("String"),_=e.exports=function(e,t,n){"Symbol("===m(h(t),0,7)&&(t="["+v(h(t),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!s(e,"name")||l&&e.name!==t)&&(a?p(e,"name",{value:t,configurable:!0}):e.name=t),y&&n&&s(n,"arity")&&e.length!==n.arity&&p(e,"length",{value:n.arity});try{n&&s(n,"constructor")&&n.constructor?a&&p(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(o){}var r=d(e);return s(r,"source")||(r.source=g(b,"string"==typeof t?t:"")),e};Function.prototype.toString=_((function(){return i(this)&&f(this).source||u(this)}),"toString")},350:function(e,t,n){"use strict";var r=n(3724),o=n(9297),i=Function.prototype,s=r&&Object.getOwnPropertyDescriptor,a=o(i,"name"),l=a&&"something"===function(){}.name,u=a&&(!r||r&&s(i,"name").configurable);e.exports={EXISTS:a,PROPER:l,CONFIGURABLE:u}},397:function(e,t,n){"use strict";var r=n(7751);e.exports=r("document","documentElement")},416:function(e,t){"use strict";t.A={data:()=>({metadata:{}}),methods:{async loadMetadata(){if(!this.data)return void(this.metadata=null);this.metadata={};const e=await this.$store.dispatch("packages/metadata",this.data);this.metadata=e?Object.assign({},this.data,e):null}},watch:{data(){this.loadMetadata()}},created(){this.loadMetadata(),this.$watch(this.$i18n.locale,this.loadMetadata)}}},421:function(e){"use strict";e.exports={}},560:function(e,t,n){"use strict";const r=n(3908),o=(e,t,n)=>new r(e,n).compare(new r(t,n));e.exports=o},616:function(e,t,n){"use strict";var r=n(9039);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},641:function(e,t,n){"use strict";n.d(t,{$V:function(){return Ve},$u:function(){return it},$y:function(){return vt},BA:function(){return r.BA},Bi:function(){return be},Bs:function(){return No},C4:function(){return o.C4},CE:function(){return Fr},Df:function(){return ge},Dl:function(){return k},E:function(){return Wt},E3:function(){return qr},EW:function(){return Ao},EY:function(){return kr},FK:function(){return Cr},Fv:function(){return Yr},Fw:function(){return Wn},GM:function(){return xt},Gc:function(){return r.Gc},Gt:function(){return dn},Gw:function(){return jo},Gy:function(){return ie},H4:function(){return h},HF:function(){return Bt},Ht:function(){return Ft},IG:function(){return r.IG},IJ:function(){return r.IJ},Ic:function(){return ot},Im:function(){return ee},K9:function(){return Pn},KC:function(){return nt},KR:function(){return r.KR},Kf:function(){return o.rU},Kh:function(){return r.Kh},LJ:function(){return Uo},LM:function(){return Gn},Lk:function(){return Wr},Lu:function(){return Pt},MZ:function(){return ve},Mw:function(){return Or},NP:function(){return Mt},Ng:function(){return Kr},OA:function(){return $t},OW:function(){return he},PP:function(){return r.PP},PR:function(){return Xe},PS:function(){return hn},PT:function(){return o.PT},Pn:function(){return Fe},Pr:function(){return r.Pr},Q3:function(){return Qr},QP:function(){return ae},QW:function(){return r.QW},QZ:function(){return r.QZ},Qi:function(){return $},R1:function(){return r.R1},R8:function(){return Po},RG:function(){return wt},SS:function(){return lt},Tb:function(){return Tt},Tm:function(){return r.Tm},Tq:function(){return je},Tr:function(){return o.Tr},U4:function(){return l},U_:function(){return qn},Ul:function(){return r.Ul},Vq:function(){return Mr},WQ:function(){return fn},Wv:function(){return $r},X2:function(){return r.X2},Y4:function(){return ze},Y5:function(){return Bo},YY:function(){return U},Yj:function(){return It},Yv:function(){return r.Yv},ZH:function(){return o.ZH},ZQ:function(){return Mo},_B:function(){return o._B},aT:function(){return Vo},bF:function(){return Gr},bU:function(){return Lo},bj:function(){return ut},bn:function(){return Ht},bo:function(){return V},ch:function(){return r.ch},ci:function(){return Mn},dA:function(){return $e},dY:function(){return w},ds:function(){return r.ds},eW:function(){return zr},eX:function(){return Et},fE:function(){return r.fE},fn:function(){return Zn},g2:function(){return pt},g8:function(){return r.g8},gN:function(){return gt},gW:function(){return Br},gh:function(){return d},h:function(){return Ro},hi:function(){return at},i9:function(){return r.i9},iD:function(){return Fo},jC:function(){return Ar},jr:function(){return r.jr},jt:function(){return j},ju:function(){return r.ju},k6:function(){return B},lW:function(){return r.lW},lt:function(){return Do},mu:function(){return r.mu},n:function(){return qe},nD:function(){return r.nD},nI:function(){return ao},nT:function(){return Xn},o5:function(){return r.o5},p9:function(){return Kn},pI:function(){return _t},pM:function(){return ye},pR:function(){return de},qG:function(){return dt},qL:function(){return f},qP:function(){return Lt},qR:function(){return ct},rE:function(){return xo},rO:function(){return Dt},rU:function(){return Me},rY:function(){return r.rY},rk:function(){return Ee},sV:function(){return rt},tB:function(){return r.tB},tC:function(){return _o},tG:function(){return u},tY:function(){return pr},uX:function(){return Lr},uY:function(){return r.uY},ux:function(){return r.ux},v6:function(){return to},v_:function(){return o.v_},vv:function(){return jr},wB:function(){return zn},wX:function(){return Eo},wk:function(){return Nt},xo:function(){return st},y$:function(){return Io},yC:function(){return r.yC},zz:function(){return Vt}});var r=n(953),o=n(33); /** * @vue/runtime-core v3.5.16 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ const i=[];function s(e){i.push(e)}function a(){i.pop()}function l(e,t){}const u={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},c={["sp"]:"serverPrefetch hook",["bc"]:"beforeCreate hook",["c"]:"created hook",["bm"]:"beforeMount hook",["m"]:"mounted hook",["bu"]:"beforeUpdate hook",["u"]:"updated",["bum"]:"beforeUnmount hook",["um"]:"unmounted hook",["a"]:"activated hook",["da"]:"deactivated hook",["ec"]:"errorCaptured hook",["rtc"]:"renderTracked hook",["rtg"]:"renderTriggered hook",[0]:"setup function",[1]:"render function",[2]:"watcher getter",[3]:"watcher callback",[4]:"watcher cleanup function",[5]:"native event handler",[6]:"component event handler",[7]:"vnode hook",[8]:"directive hook",[9]:"transition hook",[10]:"app errorHandler",[11]:"app warnHandler",[12]:"ref function",[13]:"async component loader",[14]:"scheduler flush",[15]:"component update",[16]:"app unmount cleanup function"};function d(e,t,n,r){try{return r?e(...r):e()}catch(o){h(o,t,n)}}function f(e,t,n,r){if((0,o.Tn)(e)){const i=d(e,t,n,r);return i&&(0,o.yL)(i)&&i.catch((e=>{h(e,t,n)})),i}if((0,o.cy)(e)){const o=[];for(let i=0;i>>1,o=m[r],i=R(o);i=R(n)?m.push(e):m.splice(S(t),0,e),e.flags|=1,C()}}function C(){E||(E=_.then(I))}function k(e){(0,o.cy)(e)?g.push(...e):y&&-1===e.id?y.splice(b+1,0,e):1&e.flags||(g.push(e),e.flags|=1),C()}function O(e,t,n=v+1){for(0;nR(e)-R(t)));if(g.length=0,y)return void y.push(...e);for(y=e,b=0;bnull==e.id?2&e.flags?-1:1/0:e.id;function I(e){o.tE;try{for(v=0;vL.emit(e,...t))),N=[];else if("undefined"!==typeof window&&window.HTMLElement&&!(null==(r=null==(n=window.navigator)?void 0:n.userAgent)?void 0:r.includes("jsdom"))){const e=t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[];e.push((e=>{P(e,t)})),setTimeout((()=>{L||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,x=!0,N=[])}),3e3)}else x=!0,N=[]}let M=null,D=null;function F(e){const t=M;return M=e,D=e&&e.type.__scopeId||null,t}function $(e){D=e}function j(){D=null}const U=e=>B;function B(e,t=M,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&Mr(-1);const o=F(t);let i;try{i=e(...n)}finally{F(o),r._d&&Mr(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function V(e,t){if(null===M)return e;const n=Co(M),i=e.dirs||(e.dirs=[]);for(let s=0;se.__isTeleport,X=e=>e&&(e.disabled||""===e.disabled),K=e=>e&&(e.defer||""===e.defer),q=e=>"undefined"!==typeof SVGElement&&e instanceof SVGElement,z=e=>"function"===typeof MathMLElement&&e instanceof MathMLElement,Y=(e,t)=>{const n=e&&e.to;if((0,o.Kg)(n)){if(t){const e=t(n);return e}return null}return n},Q={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,u){const{mc:c,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=u,g=X(t.props);let{shapeFlag:y,children:b,dynamicChildren:_}=t;if(null==e){const e=t.el=m(""),u=t.anchor=m("");h(e,n,r),h(u,n,r);const d=(e,t)=>{16&y&&(o&&o.isCE&&(o.ce._teleportTarget=e),c(b,e,t,o,i,s,a,l))},f=()=>{const e=t.target=Y(t.props,p),n=ne(e,t,m,h);e&&("svg"!==s&&q(e)?s="svg":"mathml"!==s&&z(e)&&(s="mathml"),g||(d(e,n),te(t,!1)))};g&&(d(n,u),te(t,!0)),K(t.props)?(t.el.__isMounted=!1,xn((()=>{f(),delete t.el.__isMounted}),i)):f()}else{if(K(t.props)&&!1===e.el.__isMounted)return void xn((()=>{Q.process(e,t,n,r,o,i,s,a,l,u)}),i);t.el=e.el,t.targetStart=e.targetStart;const c=t.anchor=e.anchor,h=t.target=e.target,m=t.targetAnchor=e.targetAnchor,v=X(e.props),y=v?n:h,b=v?c:m;if("svg"===s||q(h)?s="svg":("mathml"===s||z(h))&&(s="mathml"),_?(f(e.dynamicChildren,_,y,o,i,s,a),Un(e,t,!0)):l||d(e,t,y,b,o,i,s,a,!1),g)v?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):J(t,n,c,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=Y(t.props,p);e&&J(t,e,null,u,0)}else v&&J(t,h,m,u,1);te(t,g)}},remove(e,t,n,{um:r,o:{remove:o}},i){const{shapeFlag:s,children:a,anchor:l,targetStart:u,targetAnchor:c,target:d,props:f}=e;if(d&&(o(u),o(c)),i&&o(l),16&s){const e=i||!X(f);for(let o=0;o{e.isMounted=!0})),st((()=>{e.isUnmounting=!0})),e}const se=[Function,Array],ae={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:se,onEnter:se,onAfterEnter:se,onEnterCancelled:se,onBeforeLeave:se,onLeave:se,onAfterLeave:se,onLeaveCancelled:se,onBeforeAppear:se,onAppear:se,onAfterAppear:se,onAppearCancelled:se},le=e=>{const t=e.subTree;return t.component?le(t.component):t},ue={name:"BaseTransition",props:ae,setup(e,{slots:t}){const n=ao(),o=ie();return()=>{const i=t.default&&ge(t.default(),!0);if(!i||!i.length)return;const s=ce(i),a=(0,r.ux)(e),{mode:l}=a;if(o.isLeaving)return pe(s);const u=me(s);if(!u)return pe(s);let c=he(u,a,o,n,(e=>c=e));u.type!==Or&&ve(u,c);let d=n.subTree&&me(n.subTree);if(d&&d.type!==Or&&!Ur(u,d)&&le(n).type!==Or){let e=he(d,a,o,n);if(ve(d,e),"out-in"===l&&u.type!==Or)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,d=void 0},pe(s);"in-out"===l&&u.type!==Or?e.delayLeave=(e,t,n)=>{const r=fe(o,d);r[String(d.key)]=d,e[re]=()=>{t(),e[re]=void 0,delete c.delayedLeave,d=void 0},c.delayedLeave=()=>{n(),delete c.delayedLeave,d=void 0}}:d=void 0}else d&&(d=void 0);return s}}};function ce(e){let t=e[0];if(e.length>1){let n=!1;for(const r of e)if(r.type!==Or){0,t=r,n=!0;break}}return t}const de=ue;function fe(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function he(e,t,n,r,i){const{appear:s,mode:a,persisted:l=!1,onBeforeEnter:u,onEnter:c,onAfterEnter:d,onEnterCancelled:h,onBeforeLeave:p,onLeave:m,onAfterLeave:v,onLeaveCancelled:g,onBeforeAppear:y,onAppear:b,onAfterAppear:_,onAppearCancelled:E}=t,w=String(e.key),S=fe(n,e),T=(e,t)=>{e&&f(e,r,9,t)},C=(e,t)=>{const n=t[1];T(e,t),(0,o.cy)(e)?e.every((e=>e.length<=1))&&n():e.length<=1&&n()},k={mode:a,persisted:l,beforeEnter(t){let r=u;if(!n.isMounted){if(!s)return;r=y||u}t[re]&&t[re](!0);const o=S[w];o&&Ur(e,o)&&o.el[re]&&o.el[re](),T(r,[t])},enter(e){let t=c,r=d,o=h;if(!n.isMounted){if(!s)return;t=b||c,r=_||d,o=E||h}let i=!1;const a=e[oe]=t=>{i||(i=!0,T(t?o:r,[e]),k.delayedLeave&&k.delayedLeave(),e[oe]=void 0)};t?C(t,[e,a]):a()},leave(t,r){const o=String(e.key);if(t[oe]&&t[oe](!0),n.isUnmounting)return r();T(p,[t]);let i=!1;const s=t[re]=n=>{i||(i=!0,r(),T(n?g:v,[t]),t[re]=void 0,S[o]===e&&delete S[o])};S[o]=e,m?C(m,[t,s]):s()},clone(e){const o=he(e,t,n,r,i);return i&&i(o),o}};return k}function pe(e){if(We(e))return e=qr(e),e.children=null,e}function me(e){if(!We(e))return G(e.type)&&e.children?ce(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&(0,o.Tn)(n.default))return n.default()}}function ve(e,t){6&e.shapeFlag&&e.component?(e.transition=t,ve(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ge(e,t=!1,n){let r=[],o=0;for(let i=0;i1)for(let i=0;i(0,o.X$)({name:e.name},t,{setup:e}))():e}function be(){const e=ao();return e?(e.appContext.config.idPrefix||"v")+"-"+e.ids[0]+e.ids[1]++:""}function _e(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function Ee(e){const t=ao(),n=(0,r.IJ)(null);if(t){const r=t.refs===o.MZ?t.refs={}:t.refs;Object.defineProperty(r,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e})}else 0;const i=n;return i}function we(e,t,n,i,s=!1){if((0,o.cy)(e))return void e.forEach(((e,r)=>we(e,t&&((0,o.cy)(t)?t[r]:t),n,i,s)));if(Be(i)&&!s)return void(512&i.shapeFlag&&i.type.__asyncResolved&&i.component.subTree.component&&we(e,t,n,i.component.subTree));const a=4&i.shapeFlag?Co(i.component):i.el,l=s?null:a,{i:u,r:c}=e;const f=t&&t.r,h=u.refs===o.MZ?u.refs={}:u.refs,p=u.setupState,m=(0,r.ux)(p),v=p===o.MZ?()=>!1:e=>(0,o.$3)(m,e);if(null!=f&&f!==c&&((0,o.Kg)(f)?(h[f]=null,v(f)&&(p[f]=null)):(0,r.i9)(f)&&(f.value=null)),(0,o.Tn)(c))d(c,u,12,[l,h]);else{const t=(0,o.Kg)(c),i=(0,r.i9)(c);if(t||i){const r=()=>{if(e.f){const n=t?v(c)?p[c]:h[c]:c.value;s?(0,o.cy)(n)&&(0,o.TF)(n,a):(0,o.cy)(n)?n.includes(a)||n.push(a):t?(h[c]=[a],v(c)&&(p[c]=h[c])):(c.value=[a],e.k&&(h[e.k]=c.value))}else t?(h[c]=l,v(c)&&(p[c]=l)):i&&(c.value=l,e.k&&(h[e.k]=l))};l?(r.id=-1,xn(r,n)):r()}else 0}}let Se=!1;const Te=()=>{Se||(console.error("Hydration completed but contains mismatches."),Se=!0)},Ce=e=>e.namespaceURI.includes("svg")&&"foreignObject"!==e.tagName,ke=e=>e.namespaceURI.includes("MathML"),Oe=e=>{if(1===e.nodeType)return Ce(e)?"svg":ke(e)?"mathml":void 0},Ae=e=>8===e.nodeType;function Re(e){const{mt:t,p:n,o:{patchProp:i,createText:s,nextSibling:a,parentNode:l,remove:u,insert:c,createComment:d}}=e,f=(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),A(),void(t._vnode=e);h(t.firstChild,e,null,null,null),A(),t._vnode=e},h=(n,r,o,i,u,d=!1)=>{d=d||!!r.dynamicChildren;const f=Ae(n)&&"["===n.data,E=()=>g(n,r,o,i,u,f),{type:w,ref:S,shapeFlag:T,patchFlag:C}=r;let k=n.nodeType;r.el=n,-2===C&&(d=!1,r.dynamicChildren=null);let O=null;switch(w){case kr:3!==k?""===r.children?(c(r.el=s(""),l(n),n),O=n):O=E():(n.data!==r.children&&(Te(),n.data=r.children),O=a(n));break;case Or:_(n)?(O=a(n),b(r.el=n.content.firstChild,n,o)):O=8!==k||f?E():a(n);break;case Ar:if(f&&(n=a(n),k=n.nodeType),1===k||3===k){O=n;const e=!r.children.length;for(let t=0;t{l=l||!!t.dynamicChildren;const{type:c,props:d,patchFlag:f,shapeFlag:h,dirs:p,transition:v}=t,g="input"===c||"option"===c;if(g||-1!==f){p&&H(t,null,n,"created");let c,y=!1;if(_(e)){y=jn(null,v)&&n&&n.vnode.props&&n.vnode.props.appear;const r=e.content.firstChild;if(y){const e=r.getAttribute("class");e&&(r.$cls=e),v.beforeEnter(r)}b(r,e,n),t.el=e=r}if(16&h&&(!d||!d.innerHTML&&!d.textContent)){let r=m(e.firstChild,t,e,n,s,a,l);while(r){Ne(e,1)||Te();const t=r;r=r.nextSibling,u(t)}}else if(8&h){let n=t.children;"\n"!==n[0]||"PRE"!==e.tagName&&"TEXTAREA"!==e.tagName||(n=n.slice(1)),e.textContent!==n&&(Ne(e,0)||Te(),e.textContent=t.children)}if(d)if(g||!l||48&f){const t=e.tagName.includes("-");for(const r in d)(g&&(r.endsWith("value")||"indeterminate"===r)||(0,o.Mp)(r)&&!(0,o.SU)(r)||"."===r[0]||t)&&i(e,r,null,d[r],void 0,n)}else if(d.onClick)i(e,"onClick",null,d.onClick,void 0,n);else if(4&f&&(0,r.g8)(d.style))for(const e in d.style)d.style[e];(c=d&&d.onVnodeBeforeMount)&&no(c,n,t),p&&H(t,null,n,"beforeMount"),((c=d&&d.onVnodeMounted)||p||y)&&wr((()=>{c&&no(c,n,t),y&&v.enter(e),p&&H(t,null,n,"mounted")}),s)}return e.nextSibling},m=(e,t,r,o,i,l,u)=>{u=u||!!t.dynamicChildren;const d=t.children,f=d.length;for(let p=0;p{const{slotScopeIds:s}=t;s&&(o=o?o.concat(s):s);const u=l(e),f=m(a(e),t,u,n,r,o,i);return f&&Ae(f)&&"]"===f.data?a(t.anchor=f):(Te(),c(t.anchor=d("]"),u,f),f)},g=(e,t,r,o,i,s)=>{if(Ne(e.parentElement,1)||Te(),t.el=null,s){const t=y(e);while(1){const n=a(e);if(!n||n===t)break;u(n)}}const c=a(e),d=l(e);return u(e),n(null,t,d,c,r,o,Oe(d),i),r&&(r.vnode.el=t.el,cr(r,t.el)),c},y=(e,t="[",n="]")=>{let r=0;while(e)if(e=a(e),e&&Ae(e)&&(e.data===t&&r++,e.data===n)){if(0===r)return a(e);r--}return e},b=(e,t,n)=>{const r=t.parentNode;r&&r.replaceChild(e,t);let o=n;while(o)o.vnode.el===t&&(o.vnode.el=o.subTree.el=e),o=o.parent},_=e=>1===e.nodeType&&"TEMPLATE"===e.tagName;return[f,h]}const Ie="data-allow-mismatch",Le={[0]:"text",[1]:"children",[2]:"class",[3]:"style",[4]:"attribute"};function Ne(e,t){if(0===t||1===t)while(e&&!e.hasAttribute(Ie))e=e.parentElement;const n=e&&e.getAttribute(Ie);if(null==n)return!1;if(""===n)return!0;{const e=n.split(",");return!(0!==t||!e.includes("children"))||n.split(",").includes(Le[t])}}const xe=(0,o.We)().requestIdleCallback||(e=>setTimeout(e,1)),Pe=(0,o.We)().cancelIdleCallback||(e=>clearTimeout(e)),Me=(e=1e4)=>t=>{const n=xe(t,{timeout:e});return()=>Pe(n)};function De(e){const{top:t,left:n,bottom:r,right:o}=e.getBoundingClientRect(),{innerHeight:i,innerWidth:s}=window;return(t>0&&t0&&r0&&n0&&o(t,n)=>{const r=new IntersectionObserver((e=>{for(const n of e)if(n.isIntersecting){r.disconnect(),t();break}}),e);return n((e=>{if(e instanceof Element)return De(e)?(t(),r.disconnect(),!1):void r.observe(e)})),()=>r.disconnect()},$e=e=>t=>{if(e){const n=matchMedia(e);if(!n.matches)return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t);t()}},je=(e=[])=>(t,n)=>{(0,o.Kg)(e)&&(e=[e]);let r=!1;const i=e=>{r||(r=!0,s(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},s=()=>{n((t=>{for(const n of e)t.removeEventListener(n,i)}))};return n((t=>{for(const n of e)t.addEventListener(n,i,{once:!0})})),s};function Ue(e,t){if(Ae(e)&&"["===e.data){let n=1,r=e.nextSibling;while(r){if(1===r.nodeType){const e=t(r);if(!1===e)break}else if(Ae(r))if("]"===r.data){if(0===--n)break}else"["===r.data&&n++;r=r.nextSibling}}else t(e)}const Be=e=>!!e.type.__asyncLoader; /*! #__NO_SIDE_EFFECTS__ */function Ve(e){(0,o.Tn)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:i,delay:s=200,hydrate:a,timeout:l,suspensible:u=!0,onError:c}=e;let d,f=null,p=0;const m=()=>(p++,f=null,v()),v=()=>{let e;return f||(e=f=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{const r=()=>t(m()),o=()=>n(e);c(e,r,o,p+1)}));throw e})).then((t=>e!==f&&f?f:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),d=t,t))))};return ye({name:"AsyncComponentWrapper",__asyncLoader:v,__asyncHydrate(e,t,n){let r=!1;const o=a?()=>{const o=()=>{n()},i=a(o,(t=>Ue(e,t)));i&&(t.bum||(t.bum=[])).push(i),(t.u||(t.u=[])).push((()=>r=!0))}:n;d?o():v().then((()=>!t.isUnmounted&&o()))},get __asyncResolved(){return d},setup(){const e=so;if(_e(e),d)return()=>He(d,e);const t=t=>{f=null,h(t,e,13,!i)};if(u&&e.suspense||vo)return v().then((t=>()=>He(t,e))).catch((e=>(t(e),()=>i?Gr(i,{error:e}):null)));const o=(0,r.KR)(!1),a=(0,r.KR)(),c=(0,r.KR)(!!s);return s&&setTimeout((()=>{c.value=!1}),s),null!=l&&setTimeout((()=>{if(!o.value&&!a.value){const e=new Error(`Async component timed out after ${l}ms.`);t(e),a.value=e}}),l),v().then((()=>{o.value=!0,e.parent&&We(e.parent.vnode)&&e.parent.update()})).catch((e=>{t(e),a.value=e})),()=>o.value&&d?He(d,e):a.value&&i?Gr(i,{error:a.value}):n&&!c.value?Gr(n):void 0}})}function He(e,t){const{ref:n,props:r,children:o,ce:i}=t.vnode,s=Gr(e,r,o);return s.ref=n,s.ce=i,delete t.vnode.ce,s}const We=e=>e.type.__isKeepAlive,Ge={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=ao(),r=n.ctx;if(!r.renderer)return()=>{const e=t.default&&t.default();return e&&1===e.length?e[0]:e};const i=new Map,s=new Set;let a=null;const l=n.suspense,{renderer:{p:u,m:c,um:d,o:{createElement:f}}}=r,h=f("div");function p(e){Je(e),d(e,n,l,!0)}function m(e){i.forEach(((t,n)=>{const r=ko(t.type);r&&!e(r)&&v(n)}))}function v(e){const t=i.get(e);!t||a&&Ur(t,a)?a&&Je(a):p(t),i.delete(e),s.delete(e)}r.activate=(e,t,n,r,i)=>{const s=e.component;c(e,t,n,0,l),u(s.vnode,e,t,n,s,l,r,e.slotScopeIds,i),xn((()=>{s.isDeactivated=!1,s.a&&(0,o.DY)(s.a);const t=e.props&&e.props.onVnodeMounted;t&&no(t,s.parent,e)}),l)},r.deactivate=e=>{const t=e.component;Hn(t.m),Hn(t.a),c(e,h,null,1,l),xn((()=>{t.da&&(0,o.DY)(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&no(n,t.parent,e),t.isDeactivated=!0}),l)},zn((()=>[e.include,e.exclude]),(([e,t])=>{e&&m((t=>Ke(e,t))),t&&m((e=>!Ke(t,e)))}),{flush:"post",deep:!0});let g=null;const y=()=>{null!=g&&(dr(n.subTree.type)?xn((()=>{i.set(g,Ze(n.subTree))}),n.subTree.suspense):i.set(g,Ze(n.subTree)))};return rt(y),it(y),st((()=>{i.forEach((e=>{const{subTree:t,suspense:r}=n,o=Ze(t);if(e.type!==o.type||e.key!==o.key)p(e);else{Je(o);const e=o.component.da;e&&xn(e,r)}}))})),()=>{if(g=null,!t.default)return a=null;const n=t.default(),r=n[0];if(n.length>1)return a=null,n;if(!jr(r)||!(4&r.shapeFlag)&&!(128&r.shapeFlag))return a=null,r;let o=Ze(r);if(o.type===Or)return a=null,o;const l=o.type,u=ko(Be(o)?o.type.__asyncResolved||{}:l),{include:c,exclude:d,max:f}=e;if(c&&(!u||!Ke(c,u))||d&&u&&Ke(d,u))return o.shapeFlag&=-257,a=o,r;const h=null==o.key?l:o.key,p=i.get(h);return o.el&&(o=qr(o),128&r.shapeFlag&&(r.ssContent=o)),g=h,p?(o.el=p.el,o.component=p.component,o.transition&&ve(o,o.transition),o.shapeFlag|=512,s.delete(h),s.add(h)):(s.add(h),f&&s.size>parseInt(f,10)&&v(s.values().next().value)),o.shapeFlag|=256,a=o,dr(r.type)?r:o}}},Xe=Ge;function Ke(e,t){return(0,o.cy)(e)?e.some((e=>Ke(e,t))):(0,o.Kg)(e)?e.split(",").includes(t):!!(0,o.gd)(e)&&(e.lastIndex=0,e.test(t))}function qe(e,t){Ye(e,"a",t)}function ze(e,t){Ye(e,"da",t)}function Ye(e,t,n=so){const r=e.__wdc||(e.__wdc=()=>{let t=n;while(t){if(t.isDeactivated)return;t=t.parent}return e()});if(et(t,r,n),n){let e=n.parent;while(e&&e.parent)We(e.parent.vnode)&&Qe(r,t,n,e),e=e.parent}}function Qe(e,t,n,r){const i=et(t,e,r,!0);at((()=>{(0,o.TF)(r[t],i)}),n)}function Je(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Ze(e){return 128&e.shapeFlag?e.ssContent:e}function et(e,t,n=so,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{(0,r.C4)();const i=co(n),s=f(t,n,e,o);return i(),(0,r.bl)(),s});return o?i.unshift(s):i.push(s),s}}const tt=e=>(t,n=so)=>{vo&&"sp"!==e||et(e,((...e)=>t(...e)),n)},nt=tt("bm"),rt=tt("m"),ot=tt("bu"),it=tt("u"),st=tt("bum"),at=tt("um"),lt=tt("sp"),ut=tt("rtg"),ct=tt("rtc");function dt(e,t=so){et("ec",e,t)}const ft="components",ht="directives";function pt(e,t){return yt(ft,e,!0,t)||e}const mt=Symbol.for("v-ndc");function vt(e){return(0,o.Kg)(e)?yt(ft,e,!1)||e:e||mt}function gt(e){return yt(ht,e)}function yt(e,t,n=!0,r=!1){const i=M||so;if(i){const n=i.type;if(e===ft){const e=ko(n,!1);if(e&&(e===t||e===(0,o.PT)(t)||e===(0,o.ZH)((0,o.PT)(t))))return n}const s=bt(i[e]||n[e],t)||bt(i.appContext[e],t);return!s&&r?n:s}}function bt(e,t){return e&&(e[t]||e[(0,o.PT)(t)]||e[(0,o.ZH)((0,o.PT)(t))])}function _t(e,t,n,i){let s;const a=n&&n[i],l=(0,o.cy)(e);if(l||(0,o.Kg)(e)){const n=l&&(0,r.g8)(e);let o=!1,i=!1;n&&(o=!(0,r.fE)(e),i=(0,r.Tm)(e),e=(0,r.qA)(e)),s=new Array(e.length);for(let l=0,u=e.length;lt(e,n,void 0,a&&a[n])));else{const n=Object.keys(e);s=new Array(n.length);for(let r=0,o=n.length;r{const t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function wt(e,t,n={},r,i){if(M.ce||M.parent&&Be(M.parent)&&M.parent.ce)return"default"!==t&&(n.name=t),Lr(),$r(Cr,null,[Gr("slot",n,r&&r())],64);let s=e[t];s&&s._c&&(s._d=!1),Lr();const a=s&&St(s(n)),l=n.key||a&&a.key,u=$r(Cr,{key:(l&&!(0,o.Bm)(l)?l:`_${t}`)+(!a&&r?"_fb":"")},a||(r?r():[]),a&&1===e._?64:-2);return!i&&u.scopeId&&(u.slotScopeIds=[u.scopeId+"-s"]),s&&s._c&&(s._d=!0),u}function St(e){return e.some((e=>!jr(e)||e.type!==Or&&!(e.type===Cr&&!St(e.children))))?e:null}function Tt(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:(0,o.rU)(r)]=e[r];return n}const Ct=e=>e?ho(e)?Co(e):Ct(e.parent):null,kt=(0,o.X$)(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ct(e.parent),$root:e=>Ct(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Yt(e),$forceUpdate:e=>e.f||(e.f=()=>{T(e.update)}),$nextTick:e=>e.n||(e.n=w.bind(e.proxy)),$watch:e=>Qn.bind(e)}),Ot=(e,t)=>e!==o.MZ&&!e.__isScriptSetup&&(0,o.$3)(e,t),At={get({_:e},t){if("__v_skip"===t)return!0;const{ctx:n,setupState:i,data:s,props:a,accessCache:l,type:u,appContext:c}=e;let d;if("$"!==t[0]){const r=l[t];if(void 0!==r)switch(r){case 1:return i[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(Ot(i,t))return l[t]=1,i[t];if(s!==o.MZ&&(0,o.$3)(s,t))return l[t]=2,s[t];if((d=e.propsOptions[0])&&(0,o.$3)(d,t))return l[t]=3,a[t];if(n!==o.MZ&&(0,o.$3)(n,t))return l[t]=4,n[t];Gt&&(l[t]=0)}}const f=kt[t];let h,p;return f?("$attrs"===t&&(0,r.u4)(e.attrs,"get",""),f(e)):(h=u.__cssModules)&&(h=h[t])?h:n!==o.MZ&&(0,o.$3)(n,t)?(l[t]=4,n[t]):(p=c.config.globalProperties,(0,o.$3)(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;return Ot(i,t)?(i[t]=n,!0):r!==o.MZ&&(0,o.$3)(r,t)?(r[t]=n,!0):!(0,o.$3)(e.props,t)&&(("$"!==t[0]||!(t.slice(1)in e))&&(s[t]=n,!0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let l;return!!n[a]||e!==o.MZ&&(0,o.$3)(e,a)||Ot(t,a)||(l=s[0])&&(0,o.$3)(l,a)||(0,o.$3)(r,a)||(0,o.$3)(kt,a)||(0,o.$3)(i.config.globalProperties,a)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:(0,o.$3)(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};const Rt=(0,o.X$)({},At,{get(e,t){if(t!==Symbol.unscopables)return At.get(e,t,e)},has(e,t){const n="_"!==t[0]&&!(0,o.BH)(t);return n}});function It(){return null}function Lt(){return null}function Nt(e){0}function xt(e){0}function Pt(){return null}function Mt(){0}function Dt(e,t){return null}function Ft(){return jt().slots}function $t(){return jt().attrs}function jt(){const e=ao();return e.setupContext||(e.setupContext=To(e))}function Ut(e){return(0,o.cy)(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}function Bt(e,t){const n=Ut(e);for(const r in t){if(r.startsWith("__skip"))continue;let e=n[r];e?(0,o.cy)(e)||(0,o.Tn)(e)?e=n[r]={type:e,default:t[r]}:e.default=t[r]:null===e&&(e=n[r]={default:t[r]}),e&&t[`__skip_${r}`]&&(e.skipFactory=!0)}return n}function Vt(e,t){return e&&t?(0,o.cy)(e)&&(0,o.cy)(t)?e.concat(t):(0,o.X$)({},Ut(e),Ut(t)):e||t}function Ht(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function Wt(e){const t=ao();let n=e();return fo(),(0,o.yL)(n)&&(n=n.catch((e=>{throw co(t),e}))),[n,()=>co(t)]}let Gt=!0;function Xt(e){const t=Yt(e),n=e.proxy,i=e.ctx;Gt=!1,t.beforeCreate&&qt(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:l,watch:u,provide:c,inject:d,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:v,activated:g,deactivated:y,beforeDestroy:b,beforeUnmount:_,destroyed:E,unmounted:w,render:S,renderTracked:T,renderTriggered:C,errorCaptured:k,serverPrefetch:O,expose:A,inheritAttrs:R,components:I,directives:L,filters:N}=t,x=null;if(d&&Kt(d,i,x),l)for(const r in l){const e=l[r];(0,o.Tn)(e)&&(i[r]=e.bind(n))}if(s){0;const t=s.call(n,n);0,(0,o.Gv)(t)&&(e.data=(0,r.Kh)(t))}if(Gt=!0,a)for(const r in a){const e=a[r],t=(0,o.Tn)(e)?e.bind(n,n):(0,o.Tn)(e.get)?e.get.bind(n,n):o.tE;0;const s=!(0,o.Tn)(e)&&(0,o.Tn)(e.set)?e.set.bind(n):o.tE,l=Ao({get:t,set:s});Object.defineProperty(i,r,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(u)for(const r in u)zt(u[r],i,n,r);if(c){const e=(0,o.Tn)(c)?c.call(n):c;Reflect.ownKeys(e).forEach((t=>{dn(t,e[t])}))}function P(e,t){(0,o.cy)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&qt(f,e,"c"),P(nt,h),P(rt,p),P(ot,m),P(it,v),P(qe,g),P(ze,y),P(dt,k),P(ct,T),P(ut,C),P(st,_),P(at,w),P(lt,O),(0,o.cy)(A))if(A.length){const t=e.exposed||(e.exposed={});A.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===o.tE&&(e.render=S),null!=R&&(e.inheritAttrs=R),I&&(e.components=I),L&&(e.directives=L),O&&_e(e)}function Kt(e,t,n=o.tE){(0,o.cy)(e)&&(e=tn(e));for(const i in e){const n=e[i];let s;s=(0,o.Gv)(n)?"default"in n?fn(n.from||i,n.default,!0):fn(n.from||i):fn(n),(0,r.i9)(s)?Object.defineProperty(t,i,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e}):t[i]=s}}function qt(e,t,n){f((0,o.cy)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function zt(e,t,n,r){let i=r.includes(".")?Jn(n,r):()=>n[r];if((0,o.Kg)(e)){const n=t[e];(0,o.Tn)(n)&&zn(i,n)}else if((0,o.Tn)(e))zn(i,e.bind(n));else if((0,o.Gv)(e))if((0,o.cy)(e))e.forEach((e=>zt(e,t,n,r)));else{const r=(0,o.Tn)(e.handler)?e.handler.bind(n):t[e.handler];(0,o.Tn)(r)&&zn(i,r,e)}else 0}function Yt(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:a}}=e.appContext,l=s.get(t);let u;return l?u=l:i.length||n||r?(u={},i.length&&i.forEach((e=>Qt(u,e,a,!0))),Qt(u,t,a)):u=t,(0,o.Gv)(t)&&s.set(t,u),u}function Qt(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&Qt(e,i,n,!0),o&&o.forEach((t=>Qt(e,t,n,!0)));for(const s in t)if(r&&"expose"===s);else{const r=Jt[s]||n&&n[s];e[s]=r?r(e[s],t[s]):t[s]}return e}const Jt={data:Zt,props:on,emits:on,methods:rn,computed:rn,beforeCreate:nn,created:nn,beforeMount:nn,mounted:nn,beforeUpdate:nn,updated:nn,beforeDestroy:nn,beforeUnmount:nn,destroyed:nn,unmounted:nn,activated:nn,deactivated:nn,errorCaptured:nn,serverPrefetch:nn,components:rn,directives:rn,watch:sn,provide:Zt,inject:en};function Zt(e,t){return t?e?function(){return(0,o.X$)((0,o.Tn)(e)?e.call(this,this):e,(0,o.Tn)(t)?t.call(this,this):t)}:t:e}function en(e,t){return rn(tn(e),tn(t))}function tn(e){if((0,o.cy)(e)){const t={};for(let n=0;n1)return n&&(0,o.Tn)(t)?t.call(r&&r.proxy):t}else 0}function hn(){return!!(so||M||cn)}const pn={},mn=()=>Object.create(pn),vn=e=>Object.getPrototypeOf(e)===pn;function gn(e,t,n,o=!1){const i={},s=mn();e.propsDefaults=Object.create(null),bn(e,t,i,s);for(const r in e.propsOptions[0])r in i||(i[r]=void 0);n?e.props=o?i:(0,r.Gc)(i):e.type.props?e.props=i:e.props=s,e.attrs=s}function yn(e,t,n,i){const{props:s,attrs:a,vnode:{patchFlag:l}}=e,u=(0,r.ux)(s),[c]=e.propsOptions;let d=!1;if(!(i||l>0)||16&l){let r;bn(e,t,s,a)&&(d=!0);for(const i in u)t&&((0,o.$3)(t,i)||(r=(0,o.Tg)(i))!==i&&(0,o.$3)(t,r))||(c?!n||void 0===n[i]&&void 0===n[r]||(s[i]=_n(c,u,i,void 0,e,!0)):delete s[i]);if(a!==u)for(const e in a)t&&(0,o.$3)(t,e)||(delete a[e],d=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let r=0;r{u=!0;const[n,r]=wn(e,t,!0);(0,o.X$)(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!s&&!u)return(0,o.Gv)(e)&&r.set(e,o.Oj),o.Oj;if((0,o.cy)(s))for(let d=0;d"_"===e[0]||"$stable"===e,Cn=e=>(0,o.cy)(e)?e.map(Jr):[Jr(e)],kn=(e,t,n)=>{if(t._n)return t;const r=B(((...e)=>Cn(t(...e))),n);return r._c=!1,r},On=(e,t,n)=>{const r=e._ctx;for(const i in e){if(Tn(i))continue;const n=e[i];if((0,o.Tn)(n))t[i]=kn(i,n,r);else if(null!=n){0;const e=Cn(n);t[i]=()=>e}}},An=(e,t)=>{const n=Cn(t);e.slots.default=()=>n},Rn=(e,t,n)=>{for(const r in t)!n&&Tn(r)||(e[r]=t[r])},In=(e,t,n)=>{const r=e.slots=mn();if(32&e.vnode.shapeFlag){const e=t._;e?(Rn(r,t,n),n&&(0,o.yQ)(r,"_",e,!0)):On(t,r)}else t&&An(e,t)},Ln=(e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,a=o.MZ;if(32&r.shapeFlag){const e=t._;e?n&&1===e?s=!1:Rn(i,t,n):(s=!t.$stable,On(t,i)),a=t}else t&&(An(e,t),a={default:1});if(s)for(const o in i)Tn(o)||null!=a[o]||delete i[o]};function Nn(){}const xn=wr;function Pn(e){return Dn(e)}function Mn(e){return Dn(e,Re)}function Dn(e,t){Nn();const n=(0,o.We)();n.__VUE__=!0;const{insert:i,remove:s,patchProp:a,createElement:l,createText:u,createComment:c,setText:d,setElementText:f,parentNode:h,nextSibling:p,setScopeId:m=o.tE,insertStaticContent:v}=e,g=(e,t,n,r=null,o=null,i=null,s=void 0,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ur(e,t)&&(r=Y(e),G(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:u,ref:c,shapeFlag:d}=t;switch(u){case kr:y(e,t,n,r);break;case Or:b(e,t,n,r);break;case Ar:null==e&&_(t,n,r,s);break;case Cr:x(e,t,n,r,o,i,s,a,l);break;default:1&d?S(e,t,n,r,o,i,s,a,l):6&d?P(e,t,n,r,o,i,s,a,l):(64&d||128&d)&&u.process(e,t,n,r,o,i,s,a,l,Z)}null!=c&&o&&we(c,e&&e.ref,i,t||e,!t)},y=(e,t,n,r)=>{if(null==e)i(t.el=u(t.children),n,r);else{const n=t.el=e.el;t.children!==e.children&&d(n,t.children)}},b=(e,t,n,r)=>{null==e?i(t.el=c(t.children||""),n,r):t.el=e.el},_=(e,t,n,r)=>{[e.el,e.anchor]=v(e.children,t,n,r,e.el,e.anchor)},E=({el:e,anchor:t},n,r)=>{let o;while(e&&e!==t)o=p(e),i(e,n,r),e=o;i(t,n,r)},w=({el:e,anchor:t})=>{let n;while(e&&e!==t)n=p(e),s(e),e=n;s(t)},S=(e,t,n,r,o,i,s,a,l)=>{"svg"===t.type?s="svg":"math"===t.type&&(s="mathml"),null==e?C(t,n,r,o,i,s,a,l):I(e,t,o,i,s,a,l)},C=(e,t,n,r,s,u,c,d)=>{let h,p;const{props:m,shapeFlag:v,transition:g,dirs:y}=e;if(h=e.el=l(e.type,u,m&&m.is,m),8&v?f(h,e.children):16&v&&R(e.children,h,null,r,s,Fn(e,u),c,d),y&&H(e,null,r,"created"),k(h,e,e.scopeId,c,r),m){for(const e in m)"value"===e||(0,o.SU)(e)||a(h,e,null,m[e],u,r);"value"in m&&a(h,"value",null,m.value,u),(p=m.onVnodeBeforeMount)&&no(p,r,e)}y&&H(e,null,r,"beforeMount");const b=jn(s,g);b&&g.beforeEnter(h),i(h,t,n),((p=m&&m.onVnodeMounted)||b||y)&&xn((()=>{p&&no(p,r,e),b&&g.enter(h),y&&H(e,null,r,"mounted")}),s)},k=(e,t,n,r,o)=>{if(n&&m(e,n),r)for(let i=0;i{for(let u=l;u{const u=t.el=e.el;let{patchFlag:c,dynamicChildren:d,dirs:h}=t;c|=16&e.patchFlag;const p=e.props||o.MZ,m=t.props||o.MZ;let v;if(n&&$n(n,!1),(v=m.onVnodeBeforeUpdate)&&no(v,n,t,e),h&&H(t,e,n,"beforeUpdate"),n&&$n(n,!0),(p.innerHTML&&null==m.innerHTML||p.textContent&&null==m.textContent)&&f(u,""),d?L(e.dynamicChildren,d,u,n,r,Fn(t,i),s):l||j(e,t,u,null,n,r,Fn(t,i),s,!1),c>0){if(16&c)N(u,p,m,n,i);else if(2&c&&p.class!==m.class&&a(u,"class",null,m.class,i),4&c&&a(u,"style",p.style,m.style,i),8&c){const e=t.dynamicProps;for(let t=0;t{v&&no(v,n,t,e),h&&H(t,e,n,"updated")}),r)},L=(e,t,n,r,o,i,s)=>{for(let a=0;a{if(t!==n){if(t!==o.MZ)for(const s in t)(0,o.SU)(s)||s in n||a(e,s,t[s],null,i,r);for(const s in n){if((0,o.SU)(s))continue;const l=n[s],u=t[s];l!==u&&"value"!==s&&a(e,s,u,l,i,r)}"value"in n&&a(e,"value",t.value,n.value,i)}},x=(e,t,n,r,o,s,a,l,c)=>{const d=t.el=e?e.el:u(""),f=t.anchor=e?e.anchor:u("");let{patchFlag:h,dynamicChildren:p,slotScopeIds:m}=t;m&&(l=l?l.concat(m):m),null==e?(i(d,n,r),i(f,n,r),R(t.children||[],n,f,o,s,a,l,c)):h>0&&64&h&&p&&e.dynamicChildren?(L(e.dynamicChildren,p,n,o,s,a,l),(null!=t.key||o&&t===o.subTree)&&Un(e,t,!0)):j(e,t,n,f,o,s,a,l,c)},P=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):M(t,n,r,o,i,s,l):D(e,t,l)},M=(e,t,n,r,o,i,s)=>{const a=e.component=io(e,r,o);if(We(e)&&(a.ctx.renderer=Z),go(a,!1,s),a.asyncDep){if(o&&o.registerDep(a,F,s),!e.el){const e=a.subTree=Gr(Or);b(null,e,t,n)}}else F(a,e,t,n,o,i,s)},D=(e,t,n)=>{const r=t.component=e.component;if(lr(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void $(r,t,n);r.next=t,r.update()}else t.el=e.el,r.vnode=t},F=(e,t,n,i,s,a,l)=>{const u=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:i,vnode:c}=e;{const n=Vn(e);if(n)return t&&(t.el=c.el,$(e,t,l)),void n.asyncDep.then((()=>{e.isUnmounted||u()}))}let d,f=t;0,$n(e,!1),t?(t.el=c.el,$(e,t,l)):t=c,n&&(0,o.DY)(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&no(d,i,t,c),$n(e,!0);const p=or(e);0;const m=e.subTree;e.subTree=p,g(m,p,h(m.el),Y(m),e,s,a),t.el=p.el,null===f&&cr(e,p.el),r&&xn(r,s),(d=t.props&&t.props.onVnodeUpdated)&&xn((()=>no(d,i,t,c)),s)}else{let r;const{el:l,props:u}=t,{bm:c,m:d,parent:f,root:h,type:p}=e,m=Be(t);if($n(e,!1),c&&(0,o.DY)(c),!m&&(r=u&&u.onVnodeBeforeMount)&&no(r,f,t),$n(e,!0),l&&te){const t=()=>{e.subTree=or(e),te(l,e.subTree,e,s,null)};m&&p.__asyncHydrate?p.__asyncHydrate(l,e,t):t()}else{h.ce&&h.ce._injectChildStyle(p);const r=e.subTree=or(e);0,g(null,r,n,i,e,s,a),t.el=r.el}if(d&&xn(d,s),!m&&(r=u&&u.onVnodeMounted)){const e=t;xn((()=>no(r,f,e)),s)}(256&t.shapeFlag||f&&Be(f.vnode)&&256&f.vnode.shapeFlag)&&e.a&&xn(e.a,s),e.isMounted=!0,t=n=i=null}};e.scope.on();const c=e.effect=new r.X2(u);e.scope.off();const d=e.update=c.run.bind(c),f=e.job=c.runIfDirty.bind(c);f.i=e,f.id=e.uid,c.scheduler=()=>T(f),$n(e,!0),d()},$=(e,t,n)=>{t.component=e;const o=e.vnode.props;e.vnode=t,e.next=null,yn(e,t.props,o,n),Ln(e,t.children,n),(0,r.C4)(),O(e),(0,r.bl)()},j=(e,t,n,r,o,i,s,a,l=!1)=>{const u=e&&e.children,c=e?e.shapeFlag:0,d=t.children,{patchFlag:h,shapeFlag:p}=t;if(h>0){if(128&h)return void B(u,d,n,r,o,i,s,a,l);if(256&h)return void U(u,d,n,r,o,i,s,a,l)}8&p?(16&c&&z(u,o,i),d!==u&&f(n,d)):16&c?16&p?B(u,d,n,r,o,i,s,a,l):z(u,o,i,!0):(8&c&&f(n,""),16&p&&R(d,n,r,o,i,s,a,l))},U=(e,t,n,r,i,s,a,l,u)=>{e=e||o.Oj,t=t||o.Oj;const c=e.length,d=t.length,f=Math.min(c,d);let h;for(h=0;hd?z(e,i,s,!0,!1,f):R(t,n,r,i,s,a,l,u,f)},B=(e,t,n,r,i,s,a,l,u)=>{let c=0;const d=t.length;let f=e.length-1,h=d-1;while(c<=f&&c<=h){const r=e[c],o=t[c]=u?Zr(t[c]):Jr(t[c]);if(!Ur(r,o))break;g(r,o,n,null,i,s,a,l,u),c++}while(c<=f&&c<=h){const r=e[f],o=t[h]=u?Zr(t[h]):Jr(t[h]);if(!Ur(r,o))break;g(r,o,n,null,i,s,a,l,u),f--,h--}if(c>f){if(c<=h){const e=h+1,o=eh)while(c<=f)G(e[c],i,s,!0),c++;else{const p=c,m=c,v=new Map;for(c=m;c<=h;c++){const e=t[c]=u?Zr(t[c]):Jr(t[c]);null!=e.key&&v.set(e.key,c)}let y,b=0;const _=h-m+1;let E=!1,w=0;const S=new Array(_);for(c=0;c<_;c++)S[c]=0;for(c=p;c<=f;c++){const r=e[c];if(b>=_){G(r,i,s,!0);continue}let o;if(null!=r.key)o=v.get(r.key);else for(y=m;y<=h;y++)if(0===S[y-m]&&Ur(r,t[y])){o=y;break}void 0===o?G(r,i,s,!0):(S[o-m]=c+1,o>=w?w=o:E=!0,g(r,t[o],n,null,i,s,a,l,u),b++)}const T=E?Bn(S):o.Oj;for(y=T.length-1,c=_-1;c>=0;c--){const e=m+c,o=t[e],f=e+1{const{el:a,type:l,transition:u,children:c,shapeFlag:d}=e;if(6&d)return void V(e.component.subTree,t,n,r);if(128&d)return void e.suspense.move(t,n,r);if(64&d)return void l.move(e,t,n,Z);if(l===Cr){i(a,t,n);for(let e=0;eu.enter(a)),o);else{const{leave:r,delayLeave:o,afterLeave:l}=u,c=()=>{e.ctx.isUnmounted?s(a):i(a,t,n)},d=()=>{r(a,(()=>{c(),l&&l()}))};o?o(a,c,d):d()}else i(a,t,n)},G=(e,t,n,o=!1,i=!1)=>{const{type:s,props:a,ref:l,children:u,dynamicChildren:c,shapeFlag:d,patchFlag:f,dirs:h,cacheIndex:p}=e;if(-2===f&&(i=!1),null!=l&&((0,r.C4)(),we(l,null,n,e,!0),(0,r.bl)()),null!=p&&(t.renderCache[p]=void 0),256&d)return void t.ctx.deactivate(e);const m=1&d&&h,v=!Be(e);let g;if(v&&(g=a&&a.onVnodeBeforeUnmount)&&no(g,t,e),6&d)q(e.component,n,o);else{if(128&d)return void e.suspense.unmount(n,o);m&&H(e,null,t,"beforeUnmount"),64&d?e.type.remove(e,t,n,Z,o):c&&!c.hasOnce&&(s!==Cr||f>0&&64&f)?z(c,t,n,!1,!0):(s===Cr&&384&f||!i&&16&d)&&z(u,t,n),o&&X(e)}(v&&(g=a&&a.onVnodeUnmounted)||m)&&xn((()=>{g&&no(g,t,e),m&&H(e,null,t,"unmounted")}),n)},X=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===Cr)return void K(n,r);if(t===Ar)return void w(e);const i=()=>{s(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:t,delayLeave:r}=o,s=()=>t(n,i);r?r(e.el,i,s):s()}else i()},K=(e,t)=>{let n;while(e!==t)n=p(e),s(e),e=n;s(t)},q=(e,t,n)=>{const{bum:r,scope:i,job:s,subTree:a,um:l,m:u,a:c,parent:d,slots:{__:f}}=e;Hn(u),Hn(c),r&&(0,o.DY)(r),d&&(0,o.cy)(f)&&f.forEach((e=>{d.renderCache[e]=void 0})),i.stop(),s&&(s.flags|=8,G(a,e,t,n)),l&&xn(l,t),xn((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},z=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s{if(6&e.shapeFlag)return Y(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();const t=p(e.anchor||e.el),n=t&&t[W];return n?p(n):t};let Q=!1;const J=(e,t,n)=>{null==e?t._vnode&&G(t._vnode,null,null,!0):g(t._vnode||null,e,t,null,null,null,n),t._vnode=e,Q||(Q=!0,O(),A(),Q=!1)},Z={p:g,um:G,m:V,r:X,mt:M,mc:R,pc:j,pbc:L,n:Y,o:e};let ee,te;return t&&([ee,te]=t(Z)),{render:J,hydrate:ee,createApp:un(J,ee)}}function Fn({type:e,props:t},n){return"svg"===n&&"foreignObject"===e||"mathml"===n&&"annotation-xml"===e&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function $n({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function jn(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Un(e,t,n=!1){const r=e.children,i=t.children;if((0,o.cy)(r)&&(0,o.cy)(i))for(let o=0;o>1,e[n[a]]0&&(t[r]=n[i-1]),n[i]=r)}}i=n.length,s=n[i-1];while(i-- >0)n[i]=s,s=t[s];return n}function Vn(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Vn(t)}function Hn(e){if(e)for(let t=0;t{{const e=fn(Wn);return e}};function Xn(e,t){return Yn(e,null,t)}function Kn(e,t){return Yn(e,null,{flush:"post"})}function qn(e,t){return Yn(e,null,{flush:"sync"})}function zn(e,t,n){return Yn(e,t,n)}function Yn(e,t,n=o.MZ){const{immediate:i,deep:s,flush:a,once:l}=n;const u=(0,o.X$)({},n);const c=t&&i||!t&&"post"!==a;let d;if(vo)if("sync"===a){const e=Gn();d=e.__watcherHandles||(e.__watcherHandles=[])}else if(!c){const e=()=>{};return e.stop=o.tE,e.resume=o.tE,e.pause=o.tE,e}const h=so;u.call=(e,t,n)=>f(e,h,t,n);let p=!1;"post"===a?u.scheduler=e=>{xn(e,h&&h.suspense)}:"sync"!==a&&(p=!0,u.scheduler=(e,t)=>{t?e():T(e)}),u.augmentJob=e=>{t&&(e.flags|=4),p&&(e.flags|=2,h&&(e.id=h.uid,e.i=h))};const m=(0,r.wB)(e,t,u);return vo&&(d?d.push(m):c&&m()),m}function Qn(e,t,n){const r=this.proxy,i=(0,o.Kg)(e)?e.includes(".")?Jn(r,e):()=>r[e]:e.bind(r,r);let s;(0,o.Tn)(t)?s=t:(s=t.handler,n=t);const a=co(this),l=Yn(i,s.bind(r),n);return a(),l}function Jn(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e{let u,c,d=o.MZ;return qn((()=>{const t=e[s];(0,o.$H)(u,t)&&(u=t,l())})),{get(){return r(),n.get?n.get(u):u},set(e){const r=n.set?n.set(e):e;if(!(0,o.$H)(r,u)&&(d===o.MZ||!(0,o.$H)(e,d)))return;const f=i.vnode.props;f&&(t in f||s in f||a in f)&&(`onUpdate:${t}`in f||`onUpdate:${s}`in f||`onUpdate:${a}`in f)||(u=e,l()),i.emit(`update:${t}`,r),(0,o.$H)(e,r)&&(0,o.$H)(e,d)&&!(0,o.$H)(r,c)&&l(),d=e,c=r}}}));return u[Symbol.iterator]=()=>{let e=0;return{next(){return e<2?{value:e++?l||o.MZ:u,done:!1}:{done:!0}}}},u}const er=(e,t)=>"modelValue"===t||"model-value"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${(0,o.PT)(t)}Modifiers`]||e[`${(0,o.Tg)(t)}Modifiers`];function tr(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||o.MZ;let i=n;const s=t.startsWith("update:"),a=s&&er(r,t.slice(7));let l;a&&(a.trim&&(i=n.map((e=>(0,o.Kg)(e)?e.trim():e))),a.number&&(i=n.map(o.bB)));let u=r[l=(0,o.rU)(t)]||r[l=(0,o.rU)((0,o.PT)(t))];!u&&s&&(u=r[l=(0,o.rU)((0,o.Tg)(t))]),u&&f(u,e,6,i);const c=r[l+"Once"];if(c){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,f(c,e,6,i)}}function nr(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(void 0!==i)return i;const s=e.emits;let a={},l=!1;if(!(0,o.Tn)(e)){const r=e=>{const n=nr(e,t,!0);n&&(l=!0,(0,o.X$)(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return s||l?((0,o.cy)(s)?s.forEach((e=>a[e]=null)):(0,o.X$)(a,s),(0,o.Gv)(e)&&r.set(e,a),a):((0,o.Gv)(e)&&r.set(e,null),null)}function rr(e,t){return!(!e||!(0,o.Mp)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,o.$3)(e,t[0].toLowerCase()+t.slice(1))||(0,o.$3)(e,(0,o.Tg)(t))||(0,o.$3)(e,t))}function or(e){const{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[s],slots:a,attrs:l,emit:u,render:c,renderCache:d,props:f,data:p,setupState:m,ctx:v,inheritAttrs:g}=e,y=F(e);let b,_;try{if(4&n.shapeFlag){const e=i||r,t=e;b=Jr(c.call(t,e,d,f,m,p,v)),_=l}else{const e=t;0,b=Jr(e.length>1?e(f,{attrs:l,slots:a,emit:u}):e(f,null)),_=t.props?l:sr(l)}}catch(w){Rr.length=0,h(w,e,1),b=Gr(Or)}let E=b;if(_&&!1!==g){const e=Object.keys(_),{shapeFlag:t}=E;e.length&&7&t&&(s&&e.some(o.CP)&&(_=ar(_,s)),E=qr(E,_,!1,!0))}return n.dirs&&(E=qr(E,null,!1,!0),E.dirs=E.dirs?E.dirs.concat(n.dirs):n.dirs),n.transition&&ve(E,n.transition),b=E,F(y),b}function ir(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)("class"===n||"style"===n||(0,o.Mp)(n))&&((t||(t={}))[n]=e[n]);return t},ar=(e,t)=>{const n={};for(const r in e)(0,o.CP)(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function lr(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||ur(r,s,u):!!s);if(1024&l)return!0;if(16&l)return r?ur(r,s,u):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;te.__isSuspense;let fr=0;const hr={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,u){if(null==e)vr(t,n,r,o,i,s,a,l,u);else{if(i&&i.deps>0&&!e.suspense.isInFallback)return t.suspense=e.suspense,t.suspense.vnode=t,void(t.el=e.el);gr(e,t,n,r,o,s,a,l,u)}},hydrate:br,normalize:_r},pr=hr;function mr(e,t){const n=e.props&&e.props[t];(0,o.Tn)(n)&&n()}function vr(e,t,n,r,o,i,s,a,l){const{p:u,o:{createElement:c}}=l,d=c("div"),f=e.suspense=yr(e,o,r,t,d,n,i,s,a,l);u(null,f.pendingBranch=e.ssContent,d,null,r,f,i,s),f.deps>0?(mr(e,"onPending"),mr(e,"onFallback"),u(null,e.ssFallback,t,n,r,null,i,s),Sr(f,e.ssFallback)):f.resolve(!1,!0)}function gr(e,t,n,r,o,i,s,a,{p:l,um:u,o:{createElement:c}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,h=t.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,Ur(f,m)?(l(m,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():v&&(g||(l(p,h,n,r,o,null,i,s,a),Sr(d,h)))):(d.pendingId=fr++,g?(d.isHydrating=!1,d.activeBranch=m):u(m,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=c("div"),v?(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():(l(p,h,n,r,o,null,i,s,a),Sr(d,h))):p&&Ur(f,p)?(l(p,f,n,r,o,d,i,s,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0&&d.resolve()));else if(p&&Ur(f,p))l(p,f,n,r,o,d,i,s,a),Sr(d,f);else if(mr(t,"onPending"),d.pendingBranch=f,512&f.shapeFlag?d.pendingId=f.component.suspenseId:d.pendingId=fr++,l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0)d.resolve();else{const{timeout:e,pendingId:t}=d;e>0?setTimeout((()=>{d.pendingId===t&&d.fallback(h)}),e):0===e&&d.fallback(h)}}function yr(e,t,n,r,i,s,a,l,u,c,d=!1){const{p:f,m:p,um:m,n:v,o:{parentNode:g,remove:y}}=c;let b;const _=Tr(e);_&&t&&t.pendingBranch&&(b=t.pendingId,t.deps++);const E=e.props?(0,o.Ro)(e.props.timeout):void 0;const w=s,S={vnode:e,parent:t,parentComponent:n,namespace:a,container:r,hiddenContainer:i,deps:0,pendingId:fr++,timeout:"number"===typeof E?E:-1,activeBranch:null,pendingBranch:null,isInFallback:!d,isHydrating:d,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){const{vnode:r,activeBranch:o,pendingBranch:i,pendingId:a,effects:l,parentComponent:u,container:c}=S;let d=!1;S.isHydrating?S.isHydrating=!1:e||(d=o&&i.transition&&"out-in"===i.transition.mode,d&&(o.transition.afterLeave=()=>{a===S.pendingId&&(p(i,c,s===w?v(o):s,0),k(l))}),o&&(g(o.el)===c&&(s=v(o)),m(o,u,S,!0)),d||p(i,c,s,0)),Sr(S,i),S.pendingBranch=null,S.isInFallback=!1;let f=S.parent,h=!1;while(f){if(f.pendingBranch){f.effects.push(...l),h=!0;break}f=f.parent}h||d||k(l),S.effects=[],_&&t&&t.pendingBranch&&b===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),mr(r,"onResolve")},fallback(e){if(!S.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,namespace:i}=S;mr(t,"onFallback");const s=v(n),a=()=>{S.isInFallback&&(f(null,e,o,s,r,null,i,l,u),Sr(S,e))},c=e.transition&&"out-in"===e.transition.mode;c&&(n.transition.afterLeave=a),S.isInFallback=!0,m(n,r,null,!0),c||a()},move(e,t,n){S.activeBranch&&p(S.activeBranch,e,t,n),S.container=e},next(){return S.activeBranch&&v(S.activeBranch)},registerDep(e,t,n){const r=!!S.pendingBranch;r&&S.deps++;const o=e.vnode.el;e.asyncDep.catch((t=>{h(t,e,0)})).then((i=>{if(e.isUnmounted||S.isUnmounted||S.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:s}=e;bo(e,i,!1),o&&(s.el=o);const l=!o&&e.subTree.el;t(e,s,g(o||e.subTree.el),o?null:v(e.subTree),S,a,n),l&&y(l),cr(e,s.el),r&&0===--S.deps&&S.resolve()}))},unmount(e,t){S.isUnmounted=!0,S.activeBranch&&m(S.activeBranch,n,e,t),S.pendingBranch&&m(S.pendingBranch,n,e,t)}};return S}function br(e,t,n,r,o,i,s,a,l){const u=t.suspense=yr(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),c=l(e,u.pendingBranch=t.ssContent,n,u,i,s);return 0===u.deps&&u.resolve(!1,!0),c}function _r(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=Er(r?n.default:n),e.ssFallback=r?Er(n.fallback):Gr(Or)}function Er(e){let t;if((0,o.Tn)(e)){const n=Pr&&e._c;n&&(e._d=!1,Lr()),e=e(),n&&(e._d=!0,t=Ir,Nr())}if((0,o.cy)(e)){const t=ir(e);0,e=t}return e=Jr(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function wr(e,t){t&&t.pendingBranch?(0,o.cy)(e)?t.effects.push(...e):t.effects.push(e):k(e)}function Sr(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let o=t.el;while(!o&&t.component)t=t.component.subTree,o=t.el;n.el=o,r&&r.subTree===n&&(r.vnode.el=o,cr(r,o))}function Tr(e){const t=e.props&&e.props.suspensible;return null!=t&&!1!==t}const Cr=Symbol.for("v-fgt"),kr=Symbol.for("v-txt"),Or=Symbol.for("v-cmt"),Ar=Symbol.for("v-stc"),Rr=[];let Ir=null;function Lr(e=!1){Rr.push(Ir=e?null:[])}function Nr(){Rr.pop(),Ir=Rr[Rr.length-1]||null}let xr,Pr=1;function Mr(e,t=!1){Pr+=e,e<0&&Ir&&t&&(Ir.hasOnce=!0)}function Dr(e){return e.dynamicChildren=Pr>0?Ir||o.Oj:null,Nr(),Pr>0&&Ir&&Ir.push(e),e}function Fr(e,t,n,r,o,i){return Dr(Wr(e,t,n,r,o,i,!0))}function $r(e,t,n,r,o){return Dr(Gr(e,t,n,r,o,!0))}function jr(e){return!!e&&!0===e.__v_isVNode}function Ur(e,t){return e.type===t.type&&e.key===t.key}function Br(e){xr=e}const Vr=({key:e})=>null!=e?e:null,Hr=({ref:e,ref_key:t,ref_for:n})=>("number"===typeof e&&(e=""+e),null!=e?(0,o.Kg)(e)||(0,r.i9)(e)||(0,o.Tn)(e)?{i:M,r:e,k:t,f:!!n}:e:null);function Wr(e,t=null,n=null,r=0,i=null,s=(e===Cr?0:1),a=!1,l=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Vr(t),ref:t&&Hr(t),scopeId:D,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:M};return l?(eo(u,n),128&s&&e.normalize(u)):n&&(u.shapeFlag|=(0,o.Kg)(n)?8:16),Pr>0&&!a&&Ir&&(u.patchFlag>0||6&s)&&32!==u.patchFlag&&Ir.push(u),u}const Gr=Xr;function Xr(e,t=null,n=null,i=0,s=null,a=!1){if(e&&e!==mt||(e=Or),jr(e)){const r=qr(e,t,!0);return n&&eo(r,n),Pr>0&&!a&&Ir&&(6&r.shapeFlag?Ir[Ir.indexOf(e)]=r:Ir.push(r)),r.patchFlag=-2,r}if(Oo(e)&&(e=e.__vccOpts),t){t=Kr(t);let{class:e,style:n}=t;e&&!(0,o.Kg)(e)&&(t.class=(0,o.C4)(e)),(0,o.Gv)(n)&&((0,r.ju)(n)&&!(0,o.cy)(n)&&(n=(0,o.X$)({},n)),t.style=(0,o.Tr)(n))}const l=(0,o.Kg)(e)?1:dr(e)?128:G(e)?64:(0,o.Gv)(e)?4:(0,o.Tn)(e)?2:0;return Wr(e,t,n,i,s,l,a,!0)}function Kr(e){return e?(0,r.ju)(e)||vn(e)?(0,o.X$)({},e):e:null}function qr(e,t,n=!1,r=!1){const{props:i,ref:s,patchFlag:a,children:l,transition:u}=e,c=t?to(i||{},t):i,d={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Vr(c),ref:t&&t.ref?n&&s?(0,o.cy)(s)?s.concat(Hr(t)):[s,Hr(t)]:Hr(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Cr?-1===a?16:16|a:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:u,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qr(e.ssContent),ssFallback:e.ssFallback&&qr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return u&&r&&ve(d,u.clone(d)),d}function zr(e=" ",t=0){return Gr(kr,null,e,t)}function Yr(e,t){const n=Gr(Ar,null,e);return n.staticCount=t,n}function Qr(e="",t=!1){return t?(Lr(),$r(Or,null,e)):Gr(Or,null,e)}function Jr(e){return null==e||"boolean"===typeof e?Gr(Or):(0,o.cy)(e)?Gr(Cr,null,e.slice()):jr(e)?Zr(e):Gr(kr,null,String(e))}function Zr(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:qr(e)}function eo(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if((0,o.cy)(t))n=16;else if("object"===typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),eo(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||vn(t)?3===r&&M&&(1===M.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=M}}else(0,o.Tn)(t)?(t={default:t,_ctx:M},n=32):(t=String(t),64&r?(n=16,t=[zr(t)]):n=8);e.children=t,e.shapeFlag|=n}function to(...e){const t={};for(let n=0;nso||M;let lo,uo;{const e=(0,o.We)(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach((t=>t(e))):r[0](e)}};lo=t("__VUE_INSTANCE_SETTERS__",(e=>so=e)),uo=t("__VUE_SSR_SETTERS__",(e=>vo=e))}const co=e=>{const t=so;return lo(e),e.scope.on(),()=>{e.scope.off(),lo(t)}},fo=()=>{so&&so.scope.off(),lo(null)};function ho(e){return 4&e.vnode.shapeFlag}let po,mo,vo=!1;function go(e,t=!1,n=!1){t&&uo(t);const{props:r,children:o}=e.vnode,i=ho(e);gn(e,r,i,t),In(e,o,n||t);const s=i?yo(e,t):void 0;return t&&uo(!1),s}function yo(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,At);const{setup:i}=n;if(i){(0,r.C4)();const n=e.setupContext=i.length>1?To(e):null,s=co(e),a=d(i,e,0,[e.props,n]),l=(0,o.yL)(a);if((0,r.bl)(),s(),!l&&!e.sp||Be(e)||_e(e),l){if(a.then(fo,fo),t)return a.then((n=>{bo(e,n,t)})).catch((t=>{h(t,e,0)}));e.asyncDep=a}else bo(e,a,t)}else wo(e,t)}function bo(e,t,n){(0,o.Tn)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,o.Gv)(t)&&(e.setupState=(0,r.Pr)(t)),wo(e,n)}function _o(e){po=e,mo=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,Rt))}}const Eo=()=>!po;function wo(e,t,n){const i=e.type;if(!e.render){if(!t&&po&&!i.render){const t=i.template||Yt(e).template;if(t){0;const{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:s,compilerOptions:a}=i,l=(0,o.X$)((0,o.X$)({isCustomElement:n,delimiters:s},r),a);i.render=po(t,l)}}e.render=i.render||o.tE,mo&&mo(e)}{const t=co(e);(0,r.C4)();try{Xt(e)}finally{(0,r.bl)(),t()}}}const So={get(e,t){return(0,r.u4)(e,"get",""),e[t]}};function To(e){const t=t=>{e.exposed=t||{}};return{attrs:new Proxy(e.attrs,So),slots:e.slots,emit:e.emit,expose:t}}function Co(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy((0,r.Pr)((0,r.IG)(e.exposed)),{get(t,n){return n in t?t[n]:n in kt?kt[n](e):void 0},has(e,t){return t in e||t in kt}})):e.proxy}function ko(e,t=!0){return(0,o.Tn)(e)?e.displayName||e.name:e.name||t&&e.__name}function Oo(e){return(0,o.Tn)(e)&&"__vccOpts"in e}const Ao=(e,t)=>{const n=(0,r.EW)(e,t,vo);return n};function Ro(e,t,n){const r=arguments.length;return 2===r?(0,o.Gv)(t)&&!(0,o.cy)(t)?jr(t)?Gr(e,null,[t]):Gr(e,t):Gr(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&jr(n)&&(n=[n]),Gr(e,t,n))}function Io(){return void 0}function Lo(e,t,n,r){const o=n[r];if(o&&No(o,e))return o;const i=t();return i.memo=e.slice(),i.cacheIndex=r,n[r]=i}function No(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&Ir&&Ir.push(e),!0}const xo="3.5.16",Po=o.tE,Mo=c,Do=L,Fo=P,$o={createComponentInstance:io,setupComponent:go,renderComponentRoot:or,setCurrentRenderingInstance:F,isVNode:jr,normalizeVNode:Jr,getComponentPublicInstance:Co,ensureValidVNode:St,pushWarningContext:s,popWarningContext:a},jo=$o,Uo=null,Bo=null,Vo=null},655:function(e,t,n){"use strict";var r=n(6955),o=String;e.exports=function(e){if("Symbol"===r(e))throw new TypeError("Cannot convert a Symbol value to a string");return o(e)}},679:function(e,t,n){"use strict";var r=n(1625),o=TypeError;e.exports=function(e,t){if(r(t,e))return e;throw new o("Incorrect invocation")}},741:function(e){"use strict";var t=Math.ceil,n=Math.floor;e.exports=Math.trunc||function(e){var r=+e;return(r>0?n:t)(r)}},757:function(e,t,n){"use strict";var r=n(7751),o=n(4901),i=n(1625),s=n(7040),a=Object;e.exports=s?function(e){return"symbol"==typeof e}:function(e){var t=r("Symbol");return o(t)&&i(t.prototype,a(e))}},791:function(e,t,n){"use strict";n.d(t,{A:function(){return f}});var r=n(641),o=n(3751);const i={class:"search-bar"},s=["placeholder","disabled","value"];function a(e,t,n,a,l,u){return(0,r.uX)(),(0,r.CE)("section",i,[(0,r.Lk)("input",{class:"search-bar__input",ref:"search",id:"search",type:"text",placeholder:n.placeholder,disabled:n.disabled,autocomplete:"off",value:e.query,onInput:t[0]||(t[0]=(...e)=>u.searchInput&&u.searchInput(...e)),onKeypress:t[1]||(t[1]=(0,o.jR)((0,o.D$)(((...t)=>e.stopSearch&&e.stopSearch(...t)),["prevent"]),["esc"]))},null,40,s),e.query?((0,r.uX)(),(0,r.CE)("button",{key:0,class:"search-bar__button search-bar__button--stop",onClick:t[2]||(t[2]=(...t)=>e.stopSearch&&e.stopSearch(...t))},t[4]||(t[4]=[(0,r.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",fill:"#737373",xmlns:"http://www.w3.org/2000/svg"},[(0,r.Lk)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),(0,r.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"})],-1)]))):((0,r.uX)(),(0,r.CE)("button",{key:1,class:"search-bar__button search-bar__button--start",onClick:t[3]||(t[3]=t=>e.$refs.search.focus()),tabindex:"-1"},t[5]||(t[5]=[(0,r.Lk)("svg",{fill:"#737373",height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,r.Lk)("path",{d:"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"}),(0,r.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"})],-1)])))])}var l=n(1881),u={mixins:[l.A],props:{placeholder:String,disabled:Boolean},methods:{searchInput(e){this.startSearch(e.target.value)}}},c=n(6262);const d=(0,c.A)(u,[["render",a]]);var f=d},851:function(e,t,n){"use strict";var r=n(6955),o=n(5966),i=n(4117),s=n(6269),a=n(8227),l=a("iterator");e.exports=function(e){if(!i(e))return o(e,l)||o(e,"@@iterator")||s[r(e)]}},909:function(e,t,n){"use strict";const r=n(3908),o=(e,t,n)=>{const o=new r(e,n),i=new r(t,n);return o.compare(i)||o.compareBuild(i)};e.exports=o},950:function(e,t){"use strict";let n=null,r=null;t.A={namespaced:!0,mutations:{setCurrent(e,t){r.$router.push({query:Object.assign({},r.$router.currentRoute.value.query,{p:t}),append:!0})},clearCurrent(){const e=Object.assign({},r.$router.currentRoute.value.query);delete e.p,r.$router.push({query:e,append:!0})},trackPackage(e,t){t?r.$store.commit("modals/open",{id:"package-details",component:n}):r.$store.commit("modals/close","package-details")}},actions:{init({commit:e},{vue:t,component:o}){r=t,n=o,r.$watch("$route.query.p",(t=>e("trackPackage",t))),e("trackPackage",r.$route.query.p)}}}},953:function(e,t,n){"use strict";n.d(t,{BA:function(){return He},C4:function(){return A},EW:function(){return et},Gc:function(){return Te},IG:function(){return xe},IJ:function(){return $e},KR:function(){return Fe},Kh:function(){return Se},PP:function(){return nt},Pr:function(){return Ge},QW:function(){return qe},QZ:function(){return T},R1:function(){return Ve},Tm:function(){return Re},Ul:function(){return tt},X2:function(){return d},Yv:function(){return st},a1:function(){return Me},bl:function(){return R},ch:function(){return at},ds:function(){return C},fE:function(){return Ie},g8:function(){return Ae},hV:function(){return ut},hZ:function(){return U},i9:function(){return De},jr:function(){return u},ju:function(){return Le},lJ:function(){return Pe},lW:function(){return Qe},mu:function(){return Be},nD:function(){return ke},o5:function(){return l},qA:function(){return H},rY:function(){return Ke},tB:function(){return Ce},u4:function(){return j},uY:function(){return a},ux:function(){return Ne},wB:function(){return lt},yC:function(){return s}});var r=n(33); /** * @vue/reactivity v3.5.16 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/let o,i;class s{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=o,!e&&o&&(this.index=(o.scopes||(o.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e0&&0===--this._on&&(o=this.prevScope,this.prevScope=void 0)}stop(e){if(this._active){let t,n;for(this._active=!1,t=0,n=this.effects.length;t0)return;if(h){let e=h;h=void 0;while(e){const t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;while(f){let n=f;f=void 0;while(n){const r=n.next;if(n.next=void 0,n.flags&=-9,1&n.flags)try{n.trigger()}catch(t){e||(e=t)}n=r}}if(e)throw e}function y(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function b(e){let t,n=e.depsTail,r=n;while(r){const e=r.prevDep;-1===r.version?(r===n&&(n=e),w(r),S(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function _(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(E(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function E(e){if(4&e.flags&&!(16&e.flags))return;if(e.flags&=-17,e.globalVersion===L)return;if(e.globalVersion=L,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!_(e)))return;e.flags|=2;const t=e.dep,n=i,o=k;i=e,k=!0;try{y(e);const n=e.fn(e._value);(0===t.version||(0,r.$H)(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(s){throw t.version++,s}finally{i=n,k=o,b(e),e.flags&=-3}}function w(e,t=!1){const{dep:n,prevSub:r,nextSub:o}=e;if(r&&(r.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)w(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}function S(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function T(e,t){e.effect instanceof d&&(e=e.effect.fn);const n=new d(e);t&&(0,r.X$)(n,t);try{n.run()}catch(i){throw n.stop(),i}const o=n.run.bind(n);return o.effect=n,o}function C(e){e.effect.stop()}let k=!0;const O=[];function A(){O.push(k),k=!1}function R(){const e=O.pop();k=void 0===e||e}function I(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const e=i;i=void 0;try{t()}finally{i=e}}}let L=0;class N{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class x{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(e){if(!i||!k||i===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==i)t=this.activeLink=new N(i,this),i.deps?(t.prevDep=i.depsTail,i.depsTail.nextDep=t,i.depsTail=t):i.deps=i.depsTail=t,P(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){const e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=i.depsTail,t.nextDep=void 0,i.depsTail.nextDep=t,i.depsTail=t,i.deps===t&&(i.deps=e)}return t}trigger(e){this.version++,L++,this.notify(e)}notify(e){v();try{0;for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{g()}}}function P(e){if(e.dep.sc++,4&e.sub.flags){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)P(e)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const M=new WeakMap,D=Symbol(""),F=Symbol(""),$=Symbol("");function j(e,t,n){if(k&&i){let t=M.get(e);t||M.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new x),r.map=t,r.key=n),r.track()}}function U(e,t,n,o,i,s){const a=M.get(e);if(!a)return void L++;const l=e=>{e&&e.trigger()};if(v(),"clear"===t)a.forEach(l);else{const i=(0,r.cy)(e),s=i&&(0,r.yI)(n);if(i&&"length"===n){const e=Number(o);a.forEach(((t,n)=>{("length"===n||n===$||!(0,r.Bm)(n)&&n>=e)&&l(t)}))}else switch((void 0!==n||a.has(void 0))&&l(a.get(n)),s&&l(a.get($)),t){case"add":i?s&&l(a.get("length")):(l(a.get(D)),(0,r.CE)(e)&&l(a.get(F)));break;case"delete":i||(l(a.get(D)),(0,r.CE)(e)&&l(a.get(F)));break;case"set":(0,r.CE)(e)&&l(a.get(D));break}}g()}function B(e,t){const n=M.get(e);return n&&n.get(t)}function V(e){const t=Ne(e);return t===e?t:(j(t,"iterate",$),Ie(e)?t:t.map(Pe))}function H(e){return j(e=Ne(e),"iterate",$),e}const W={__proto__:null,[Symbol.iterator](){return G(this,Symbol.iterator,Pe)},concat(...e){return V(this).concat(...e.map((e=>(0,r.cy)(e)?V(e):e)))},entries(){return G(this,"entries",(e=>(e[1]=Pe(e[1]),e)))},every(e,t){return K(this,"every",e,t,void 0,arguments)},filter(e,t){return K(this,"filter",e,t,(e=>e.map(Pe)),arguments)},find(e,t){return K(this,"find",e,t,Pe,arguments)},findIndex(e,t){return K(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return K(this,"findLast",e,t,Pe,arguments)},findLastIndex(e,t){return K(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return K(this,"forEach",e,t,void 0,arguments)},includes(...e){return z(this,"includes",e)},indexOf(...e){return z(this,"indexOf",e)},join(e){return V(this).join(e)},lastIndexOf(...e){return z(this,"lastIndexOf",e)},map(e,t){return K(this,"map",e,t,void 0,arguments)},pop(){return Y(this,"pop")},push(...e){return Y(this,"push",e)},reduce(e,...t){return q(this,"reduce",e,t)},reduceRight(e,...t){return q(this,"reduceRight",e,t)},shift(){return Y(this,"shift")},some(e,t){return K(this,"some",e,t,void 0,arguments)},splice(...e){return Y(this,"splice",e)},toReversed(){return V(this).toReversed()},toSorted(e){return V(this).toSorted(e)},toSpliced(...e){return V(this).toSpliced(...e)},unshift(...e){return Y(this,"unshift",e)},values(){return G(this,"values",Pe)}};function G(e,t,n){const r=H(e),o=r[t]();return r===e||Ie(e)||(o._next=o.next,o.next=()=>{const e=o._next();return e.value&&(e.value=n(e.value)),e}),o}const X=Array.prototype;function K(e,t,n,r,o,i){const s=H(e),a=s!==e&&!Ie(e),l=s[t];if(l!==X[t]){const t=l.apply(e,i);return a?Pe(t):t}let u=n;s!==e&&(a?u=function(t,r){return n.call(this,Pe(t),r,e)}:n.length>2&&(u=function(t,r){return n.call(this,t,r,e)}));const c=l.call(s,u,r);return a&&o?o(c):c}function q(e,t,n,r){const o=H(e);let i=n;return o!==e&&(Ie(e)?n.length>3&&(i=function(t,r,o){return n.call(this,t,r,o,e)}):i=function(t,r,o){return n.call(this,t,Pe(r),o,e)}),o[t](i,...r)}function z(e,t,n){const r=Ne(e);j(r,"iterate",$);const o=r[t](...n);return-1!==o&&!1!==o||!Le(n[0])?o:(n[0]=Ne(n[0]),r[t](...n))}function Y(e,t,n=[]){A(),v();const r=Ne(e)[t].apply(e,n);return g(),R(),r}const Q=(0,r.pD)("__proto__,__v_isRef,__isVue"),J=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(r.Bm));function Z(e){(0,r.Bm)(e)||(e=String(e));const t=Ne(this);return j(t,"has",e),t.hasOwnProperty(e)}class ee{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if("__v_skip"===t)return e["__v_skip"];const o=this._isReadonly,i=this._isShallow;if("__v_isReactive"===t)return!o;if("__v_isReadonly"===t)return o;if("__v_isShallow"===t)return i;if("__v_raw"===t)return n===(o?i?_e:be:i?ye:ge).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const s=(0,r.cy)(e);if(!o){let e;if(s&&(e=W[t]))return e;if("hasOwnProperty"===t)return Z}const a=Reflect.get(e,t,De(e)?e:n);return((0,r.Bm)(t)?J.has(t):Q(t))?a:(o||j(e,"get",t),i?a:De(a)?s&&(0,r.yI)(t)?a:a.value:(0,r.Gv)(a)?o?Ce(a):Se(a):a)}}class te extends ee{constructor(e=!1){super(!1,e)}set(e,t,n,o){let i=e[t];if(!this._isShallow){const t=Re(i);if(Ie(n)||Re(n)||(i=Ne(i),n=Ne(n)),!(0,r.cy)(e)&&De(i)&&!De(n))return!t&&(i.value=n,!0)}const s=(0,r.cy)(e)&&(0,r.yI)(t)?Number(t)e,le=e=>Reflect.getPrototypeOf(e);function ue(e,t,n){return function(...o){const i=this["__v_raw"],s=Ne(i),a=(0,r.CE)(s),l="entries"===e||e===Symbol.iterator&&a,u="keys"===e&&a,c=i[e](...o),d=n?ae:t?Me:Pe;return!t&&j(s,"iterate",u?F:D),{next(){const{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:l?[d(e[0]),d(e[1])]:d(e),done:t}},[Symbol.iterator](){return this}}}}function ce(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function de(e,t){const n={get(n){const o=this["__v_raw"],i=Ne(o),s=Ne(n);e||((0,r.$H)(n,s)&&j(i,"get",n),j(i,"get",s));const{has:a}=le(i),l=t?ae:e?Me:Pe;return a.call(i,n)?l(o.get(n)):a.call(i,s)?l(o.get(s)):void(o!==i&&o.get(n))},get size(){const t=this["__v_raw"];return!e&&j(Ne(t),"iterate",D),Reflect.get(t,"size",t)},has(t){const n=this["__v_raw"],o=Ne(n),i=Ne(t);return e||((0,r.$H)(t,i)&&j(o,"has",t),j(o,"has",i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){const o=this,i=o["__v_raw"],s=Ne(i),a=t?ae:e?Me:Pe;return!e&&j(s,"iterate",D),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}};(0,r.X$)(n,e?{add:ce("add"),set:ce("set"),delete:ce("delete"),clear:ce("clear")}:{add(e){t||Ie(e)||Re(e)||(e=Ne(e));const n=Ne(this),r=le(n),o=r.has.call(n,e);return o||(n.add(e),U(n,"add",e,e)),this},set(e,n){t||Ie(n)||Re(n)||(n=Ne(n));const o=Ne(this),{has:i,get:s}=le(o);let a=i.call(o,e);a||(e=Ne(e),a=i.call(o,e));const l=s.call(o,e);return o.set(e,n),a?(0,r.$H)(n,l)&&U(o,"set",e,n,l):U(o,"add",e,n),this},delete(e){const t=Ne(this),{has:n,get:r}=le(t);let o=n.call(t,e);o||(e=Ne(e),o=n.call(t,e));const i=r?r.call(t,e):void 0,s=t.delete(e);return o&&U(t,"delete",e,void 0,i),s},clear(){const e=Ne(this),t=0!==e.size,n=void 0,r=e.clear();return t&&U(e,"clear",void 0,void 0,n),r}});const o=["keys","values","entries",Symbol.iterator];return o.forEach((r=>{n[r]=ue(r,e,t)})),n}function fe(e,t){const n=de(e,t);return(t,o,i)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get((0,r.$3)(n,o)&&o in t?n:t,o,i)}const he={get:fe(!1,!1)},pe={get:fe(!1,!0)},me={get:fe(!0,!1)},ve={get:fe(!0,!0)};const ge=new WeakMap,ye=new WeakMap,be=new WeakMap,_e=new WeakMap;function Ee(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function we(e){return e["__v_skip"]||!Object.isExtensible(e)?0:Ee((0,r.Zf)(e))}function Se(e){return Re(e)?e:Oe(e,!1,re,he,ge)}function Te(e){return Oe(e,!1,ie,pe,ye)}function Ce(e){return Oe(e,!0,oe,me,be)}function ke(e){return Oe(e,!0,se,ve,_e)}function Oe(e,t,n,o,i){if(!(0,r.Gv)(e))return e;if(e["__v_raw"]&&(!t||!e["__v_isReactive"]))return e;const s=we(e);if(0===s)return e;const a=i.get(e);if(a)return a;const l=new Proxy(e,2===s?o:n);return i.set(e,l),l}function Ae(e){return Re(e)?Ae(e["__v_raw"]):!(!e||!e["__v_isReactive"])}function Re(e){return!(!e||!e["__v_isReadonly"])}function Ie(e){return!(!e||!e["__v_isShallow"])}function Le(e){return!!e&&!!e["__v_raw"]}function Ne(e){const t=e&&e["__v_raw"];return t?Ne(t):e}function xe(e){return!(0,r.$3)(e,"__v_skip")&&Object.isExtensible(e)&&(0,r.yQ)(e,"__v_skip",!0),e}const Pe=e=>(0,r.Gv)(e)?Se(e):e,Me=e=>(0,r.Gv)(e)?Ce(e):e;function De(e){return!!e&&!0===e["__v_isRef"]}function Fe(e){return je(e,!1)}function $e(e){return je(e,!0)}function je(e,t){return De(e)?e:new Ue(e,t)}class Ue{constructor(e,t){this.dep=new x,this["__v_isRef"]=!0,this["__v_isShallow"]=!1,this._rawValue=t?e:Ne(e),this._value=t?e:Pe(e),this["__v_isShallow"]=t}get value(){return this.dep.track(),this._value}set value(e){const t=this._rawValue,n=this["__v_isShallow"]||Ie(e)||Re(e);e=n?e:Ne(e),(0,r.$H)(e,t)&&(this._rawValue=e,this._value=n?e:Pe(e),this.dep.trigger())}}function Be(e){e.dep&&e.dep.trigger()}function Ve(e){return De(e)?e.value:e}function He(e){return(0,r.Tn)(e)?e():Ve(e)}const We={get:(e,t,n)=>"__v_raw"===t?e:Ve(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return De(o)&&!De(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Ge(e){return Ae(e)?e:new Proxy(e,We)}class Xe{constructor(e){this["__v_isRef"]=!0,this._value=void 0;const t=this.dep=new x,{get:n,set:r}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=r}get value(){return this._value=this._get()}set value(e){this._set(e)}}function Ke(e){return new Xe(e)}function qe(e){const t=(0,r.cy)(e)?new Array(e.length):{};for(const n in e)t[n]=Je(e,n);return t}class ze{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this["__v_isRef"]=!0,this._value=void 0}get value(){const e=this._object[this._key];return this._value=void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}get dep(){return B(Ne(this._object),this._key)}}class Ye{constructor(e){this._getter=e,this["__v_isRef"]=!0,this["__v_isReadonly"]=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Qe(e,t,n){return De(e)?e:(0,r.Tn)(e)?new Ye(e):(0,r.Gv)(e)&&arguments.length>1?Je(e,t,n):Fe(e)}function Je(e,t,n){const r=e[t];return De(r)?r:new ze(e,t,n)}class Ze{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new x(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=L-1,this.next=void 0,this.effect=this,this["__v_isReadonly"]=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags||i===this))return m(this,!0),!0}get value(){const e=this.dep.track();return E(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}function et(e,t,n=!1){let o,i;(0,r.Tn)(e)?o=e:(o=e.get,i=e.set);const s=new Ze(o,i,n);return s}const tt={GET:"get",HAS:"has",ITERATE:"iterate"},nt={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},rt={},ot=new WeakMap;let it;function st(){return it}function at(e,t=!1,n=it){if(n){let t=ot.get(n);t||ot.set(n,t=[]),t.push(e)}else 0}function lt(e,t,n=r.MZ){const{immediate:o,deep:i,once:s,scheduler:a,augmentJob:u,call:c}=n,f=e=>i?e:Ie(e)||!1===i||0===i?ut(e,1):ut(e);let h,p,m,v,g=!1,y=!1;if(De(e)?(p=()=>e.value,g=Ie(e)):Ae(e)?(p=()=>f(e),g=!0):(0,r.cy)(e)?(y=!0,g=e.some((e=>Ae(e)||Ie(e))),p=()=>e.map((e=>De(e)?e.value:Ae(e)?f(e):(0,r.Tn)(e)?c?c(e,2):e():void 0))):p=(0,r.Tn)(e)?t?c?()=>c(e,2):e:()=>{if(m){A();try{m()}finally{R()}}const t=it;it=h;try{return c?c(e,3,[v]):e(v)}finally{it=t}}:r.tE,t&&i){const e=p,t=!0===i?1/0:i;p=()=>ut(e(),t)}const b=l(),_=()=>{h.stop(),b&&b.active&&(0,r.TF)(b.effects,h)};if(s&&t){const e=t;t=(...t)=>{e(...t),_()}}let E=y?new Array(e.length).fill(rt):rt;const w=e=>{if(1&h.flags&&(h.dirty||e))if(t){const e=h.run();if(i||g||(y?e.some(((e,t)=>(0,r.$H)(e,E[t]))):(0,r.$H)(e,E))){m&&m();const n=it;it=h;try{const n=[e,E===rt?void 0:y&&E[0]===rt?[]:E,v];E=e,c?c(t,3,n):t(...n)}finally{it=n}}}else h.run()};return u&&u(w),h=new d(p),h.scheduler=a?()=>a(w,!1):w,v=e=>at(e,!1,h),m=h.onStop=()=>{const e=ot.get(h);if(e){if(c)c(e,4);else for(const t of e)t();ot.delete(h)}},t?o?w(!0):E=h.run():a?a(w.bind(null,!0),!0):h.run(),_.pause=h.pause.bind(h),_.resume=h.resume.bind(h),_.stop=_,_}function ut(e,t=1/0,n){if(t<=0||!(0,r.Gv)(e)||e["__v_skip"])return e;if(n=n||new Set,n.has(e))return e;if(n.add(e),t--,De(e))ut(e.value,t,n);else if((0,r.cy)(e))for(let r=0;r{ut(e,t,n)}));else if((0,r.Qd)(e)){for(const r in e)ut(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ut(e[r],t,n)}return e}},1072:function(e,t,n){"use strict";var r=n(1828),o=n(8727);e.exports=Object.keys||function(e){return r(e,o)}},1123:function(e){"use strict";const t=/^[0-9]+$/,n=(e,n)=>{const r=t.test(e),o=t.test(n);return r&&o&&(e=+e,n=+n),e===n?0:r&&!o?-1:o&&!r?1:en(t,e);e.exports={compareIdentifiers:n,rcompareIdentifiers:r}},1181:function(e,t,n){"use strict";var r,o,i,s=n(8622),a=n(4576),l=n(34),u=n(6699),c=n(9297),d=n(7629),f=n(6119),h=n(421),p="Object already initialized",m=a.TypeError,v=a.WeakMap,g=function(e){return i(e)?o(e):r(e,{})},y=function(e){return function(t){var n;if(!l(t)||(n=o(t)).type!==e)throw new m("Incompatible receiver, "+e+" required");return n}};if(s||d.state){var b=d.state||(d.state=new v);b.get=b.get,b.has=b.has,b.set=b.set,r=function(e,t){if(b.has(e))throw new m(p);return t.facade=e,b.set(e,t),t},o=function(e){return b.get(e)||{}},i=function(e){return b.has(e)}}else{var _=f("state");h[_]=!0,r=function(e,t){if(c(e,_))throw new m(p);return t.facade=e,u(e,_,t),t},o=function(e){return c(e,_)?e[_]:{}},i=function(e){return c(e,_)}}e.exports={set:r,get:o,has:i,enforce:g,getterFor:y}},1261:function(e,t,n){"use strict";const r=n(3908),o=n(8311),i=n(5580),s=(e,t)=>{e=new o(e,t);let n=new r("0.0.0");if(e.test(n))return n;if(n=new r("0.0.0-0"),e.test(n))return n;n=null;for(let o=0;o{const t=new r(e.semver.version);switch(e.operator){case">":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":s&&!i(t,s)||(s=t);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${e.operator}`)}})),!s||n&&!i(n,s)||(n=s)}return n&&e.test(n)?n:null};e.exports=s},1291:function(e,t,n){"use strict";var r=n(741);e.exports=function(e){var t=+e;return t!==t||0===t?0:r(t)}},1625:function(e,t,n){"use strict";var r=n(9504);e.exports=r({}.isPrototypeOf)},1687:function(e,t,n){"use strict";n.d(t,{A:function(){return ge}});var r=n(641),o=n(33),i=n(3751);const s={class:"popup-overlay__content"},a={key:1,class:"popup-overlay__actions"};function l(e,t,n,l,u,c){const d=(0,r.g2)("focus-trap");return(0,r.uX)(),(0,r.Wv)(d,{active:!0,"fallback-focus":".popup-overlay__popup","escape-deactivates":!0,onDeactivate:t[2]||(t[2]=e=>c.clearCurrent())},{default:(0,r.k6)((()=>[(0,r.Lk)("div",{class:"popup-overlay",onClick:t[1]||(t[1]=(...e)=>c.clearCurrent&&c.clearCurrent(...e))},[(0,r.Lk)("div",{ref:"popup",class:(0,o.C4)(["popup-overlay__popup",{[n.popupClass]:!!n.popupClass}]),tabindex:"-1"},[(0,r.RG)(e.$slots,"content",{},(()=>[(0,r.Lk)("form",{onSubmit:t[0]||(t[0]=(0,i.D$)((t=>e.$emit("submit")),["prevent"]))},[n.headline||e.$slots.headline?(0,r.RG)(e.$slots,"headline",{key:0},(()=>[(0,r.Lk)("h1",{class:(0,o.C4)(["popup-overlay__headline",{[`popup-overlay__headline--${n.headlineType}`]:!!n.headlineType}])},(0,o.v_)(n.headline),3)])):(0,r.Q3)("",!0),(0,r.Lk)("div",s,[(0,r.RG)(e.$slots,"default")]),e.$slots.actions?((0,r.uX)(),(0,r.CE)("div",a,[(0,r.RG)(e.$slots,"actions")])):(0,r.Q3)("",!0)],32)]))],2)])])),_:3})}var u=n(953),c=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],d=c.join(","),f="undefined"===typeof Element,h=f?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,p=!f&&Element.prototype.getRootNode?function(e){var t;return null===e||void 0===e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}:function(e){return null===e||void 0===e?void 0:e.ownerDocument},m=function e(t,n){var r;void 0===n&&(n=!0);var o=null===t||void 0===t||null===(r=t.getAttribute)||void 0===r?void 0:r.call(t,"inert"),i=""===o||"true"===o,s=i||n&&t&&e(t.parentNode);return s},v=function(e){var t,n=null===e||void 0===e||null===(t=e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable");return""===n||"true"===n},g=function(e,t,n){if(m(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(d));return t&&h.call(e,d)&&r.unshift(e),r=r.filter(n),r},y=function e(t,n,r){var o=[],i=Array.from(t);while(i.length){var s=i.shift();if(!m(s,!1))if("SLOT"===s.tagName){var a=s.assignedElements(),l=a.length?a:s.children,u=e(l,!0,r);r.flatten?o.push.apply(o,u):o.push({scopeParent:s,candidates:u})}else{var c=h.call(s,d);c&&r.filter(s)&&(n||!t.includes(s))&&o.push(s);var f=s.shadowRoot||"function"===typeof r.getShadowRoot&&r.getShadowRoot(s),p=!m(f,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(s));if(f&&p){var v=e(!0===f?s.children:f.children,!0,r);r.flatten?o.push.apply(o,v):o.push({scopeParent:s,candidates:v})}else i.unshift.apply(i,s.children)}}return o},b=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},_=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||v(e))&&!b(e)?0:e.tabIndex},E=function(e,t){var n=_(e);return n<0&&t&&!b(e)?0:n},w=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},S=function(e){return"INPUT"===e.tagName},T=function(e){return S(e)&&"hidden"===e.type},C=function(e){var t="DETAILS"===e.tagName&&Array.prototype.slice.apply(e.children).some((function(e){return"SUMMARY"===e.tagName}));return t},k=function(e,t){for(var n=0;nsummary:first-of-type"),i=o?e.parentElement:e;if(h.call(i,"details:not([open]) *"))return!0;if(n&&"full"!==n&&"legacy-full"!==n){if("non-zero-area"===n)return L(e)}else{if("function"===typeof r){var s=e;while(e){var a=e.parentElement,l=p(e);if(a&&!a.shadowRoot&&!0===r(a))return L(e);e=e.assignedSlot?e.assignedSlot:a||l===e.ownerDocument?a:l.host}e=s}if(I(e))return!e.getClientRects().length;if("legacy-full"!==n)return!0}return!1},x=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName)){var t=e.parentElement;while(t){if("FIELDSET"===t.tagName&&t.disabled){for(var n=0;n=0)},F=function e(t){var n=[],r=[];return t.forEach((function(t,o){var i=!!t.scopeParent,s=i?t.scopeParent:t,a=E(s,i),l=i?e(t.candidates):s;0===a?i?n.push.apply(n,l):n.push(s):r.push({documentOrder:o,tabIndex:a,item:t,isScope:i,content:l})})),r.sort(w).reduce((function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e}),[]).concat(n)},$=function(e,t){var n;return t=t||{},n=t.getShadowRoot?y([e],t.includeContainer,{filter:M.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:D}):g(e,t.includeContainer,M.bind(null,t)),F(n)},j=function(e,t){var n;return t=t||{},n=t.getShadowRoot?y([e],t.includeContainer,{filter:P.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):g(e,t.includeContainer,P.bind(null,t)),n},U=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return!1!==h.call(e,d)&&M(t,e)},B=c.concat("iframe").join(","),V=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return!1!==h.call(e,B)&&P(t,e)}; /*! * focus-trap 7.6.5 * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE */ function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n0){var n=e[e.length-1];n!==t&&n._setPausedState(!0)}var r=e.indexOf(t);-1===r||e.splice(r,1),e.push(t)},deactivateTrap:function(e,t){var n=e.indexOf(t);-1!==n&&e.splice(n,1),e.length>0&&!e[e.length-1]._isManuallyPaused()&&e[e.length-1]._setPausedState(!1)}},te=function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"===typeof e.select},ne=function(e){return"Escape"===(null===e||void 0===e?void 0:e.key)||"Esc"===(null===e||void 0===e?void 0:e.key)||27===(null===e||void 0===e?void 0:e.keyCode)},re=function(e){return"Tab"===(null===e||void 0===e?void 0:e.key)||9===(null===e||void 0===e?void 0:e.keyCode)},oe=function(e){return re(e)&&!e.shiftKey},ie=function(e){return re(e)&&e.shiftKey},se=function(e){return setTimeout(e,0)},ae=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:{},n=t.hasFallback,o=void 0!==n&&n,s=t.params,a=void 0===s?[]:s,l=i[e];if("function"===typeof l&&(l=l.apply(void 0,Y(a))),!0===l&&(l=void 0),!l){if(void 0===l||!1===l)return l;throw new Error("`".concat(e,"` was specified but was not a node, or did not return a node"))}var u=l;if("string"===typeof l){try{u=r.querySelector(l)}catch(c){throw new Error("`".concat(e,'` appears to be an invalid selector; error="').concat(c.message,'"'))}if(!u&&!o)throw new Error("`".concat(e,"` as selector refers to no known node"))}return u},c=function(){var e=u("initialFocus",{hasFallback:!0});if(!1===e)return!1;if(void 0===e||e&&!V(e,i.tabbableOptions))if(l(r.activeElement)>=0)e=r.activeElement;else{var t=s.tabbableGroups[0],n=t&&t.firstTabbableNode;e=n||u("fallbackFocus")}else null===e&&(e=u("fallbackFocus"));if(!e)throw new Error("Your focus-trap needs to have at least one focusable element");return e},d=function(){if(s.containerGroups=s.containers.map((function(e){var t=$(e,i.tabbableOptions),n=j(e,i.tabbableOptions),r=t.length>0?t[0]:void 0,o=t.length>0?t[t.length-1]:void 0,s=n.find((function(e){return U(e)})),a=n.slice().reverse().find((function(e){return U(e)})),l=!!t.find((function(e){return _(e)>0}));return{container:e,tabbableNodes:t,focusableNodes:n,posTabIndexesFound:l,firstTabbableNode:r,lastTabbableNode:o,firstDomTabbableNode:s,lastDomTabbableNode:a,nextTabbableNode:function(e){var r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=t.indexOf(e);return o<0?r?n.slice(n.indexOf(e)+1).find((function(e){return U(e)})):n.slice(0,n.indexOf(e)).reverse().find((function(e){return U(e)})):t[o+(r?1:-1)]}}})),s.tabbableGroups=s.containerGroups.filter((function(e){return e.tabbableNodes.length>0})),s.tabbableGroups.length<=0&&!u("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(s.containerGroups.find((function(e){return e.posTabIndexesFound}))&&s.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},f=function(e){var t=e.activeElement;if(t)return t.shadowRoot&&null!==t.shadowRoot.activeElement?f(t.shadowRoot):t},h=function(e){!1!==e&&e!==f(document)&&(e&&e.focus?(e.focus({preventScroll:!!i.preventScroll}),s.mostRecentlyFocusedNode=e,te(e)&&e.select()):h(c()))},p=function(e){var t=u("setReturnFocus",{params:[e]});return t||!1!==t&&e},m=function(e){var t=e.target,n=e.event,r=e.isBackward,o=void 0!==r&&r;t=t||le(n),d();var a=null;if(s.tabbableGroups.length>0){var c=l(t,n),f=c>=0?s.containerGroups[c]:void 0;if(c<0)a=o?s.tabbableGroups[s.tabbableGroups.length-1].lastTabbableNode:s.tabbableGroups[0].firstTabbableNode;else if(o){var h=s.tabbableGroups.findIndex((function(e){var n=e.firstTabbableNode;return t===n}));if(h<0&&(f.container===t||V(t,i.tabbableOptions)&&!U(t,i.tabbableOptions)&&!f.nextTabbableNode(t,!1))&&(h=c),h>=0){var p=0===h?s.tabbableGroups.length-1:h-1,m=s.tabbableGroups[p];a=_(t)>=0?m.lastTabbableNode:m.lastDomTabbableNode}else re(n)||(a=f.nextTabbableNode(t,!1))}else{var v=s.tabbableGroups.findIndex((function(e){var n=e.lastTabbableNode;return t===n}));if(v<0&&(f.container===t||V(t,i.tabbableOptions)&&!U(t,i.tabbableOptions)&&!f.nextTabbableNode(t))&&(v=c),v>=0){var g=v===s.tabbableGroups.length-1?0:v+1,y=s.tabbableGroups[g];a=_(t)>=0?y.firstTabbableNode:y.firstDomTabbableNode}else re(n)||(a=f.nextTabbableNode(t))}}else a=u("fallbackFocus");return a},v=function(e){var t=le(e);l(t,e)>=0||(ae(i.clickOutsideDeactivates,e)?n.deactivate({returnFocus:i.returnFocusOnDeactivate}):ae(i.allowOutsideClick,e)||e.preventDefault())},g=function(e){var t=le(e),n=l(t,e)>=0;if(n||t instanceof Document)n&&(s.mostRecentlyFocusedNode=t);else{var r;e.stopImmediatePropagation();var o=!0;if(s.mostRecentlyFocusedNode)if(_(s.mostRecentlyFocusedNode)>0){var a=l(s.mostRecentlyFocusedNode),u=s.containerGroups[a].tabbableNodes;if(u.length>0){var d=u.findIndex((function(e){return e===s.mostRecentlyFocusedNode}));d>=0&&(i.isKeyForward(s.recentNavEvent)?d+1=0&&(r=u[d-1],o=!1))}}else s.containerGroups.some((function(e){return e.tabbableNodes.some((function(e){return _(e)>0}))}))||(o=!1);else o=!1;o&&(r=m({target:s.mostRecentlyFocusedNode,isBackward:i.isKeyBackward(s.recentNavEvent)})),h(r||(s.mostRecentlyFocusedNode||c()))}s.recentNavEvent=void 0},y=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];s.recentNavEvent=e;var n=m({event:e,isBackward:t});n&&(re(e)&&e.preventDefault(),h(n))},b=function(e){(i.isKeyForward(e)||i.isKeyBackward(e))&&y(e,i.isKeyBackward(e))},E=function(e){ne(e)&&!1!==ae(i.escapeDeactivates,e)&&(e.preventDefault(),n.deactivate())},w=function(e){var t=le(e);l(t,e)>=0||ae(i.clickOutsideDeactivates,e)||ae(i.allowOutsideClick,e)||(e.preventDefault(),e.stopImmediatePropagation())},S=function(){if(s.active)return ee.activateTrap(o,n),s.delayInitialFocusTimer=i.delayInitialFocus?se((function(){h(c())})):h(c()),r.addEventListener("focusin",g,!0),r.addEventListener("mousedown",v,{capture:!0,passive:!1}),r.addEventListener("touchstart",v,{capture:!0,passive:!1}),r.addEventListener("click",w,{capture:!0,passive:!1}),r.addEventListener("keydown",b,{capture:!0,passive:!1}),r.addEventListener("keydown",E),n},T=function(){if(s.active)return r.removeEventListener("focusin",g,!0),r.removeEventListener("mousedown",v,!0),r.removeEventListener("touchstart",v,!0),r.removeEventListener("click",w,!0),r.removeEventListener("keydown",b,!0),r.removeEventListener("keydown",E),n},C=function(e){var t=e.some((function(e){var t=Array.from(e.removedNodes);return t.some((function(e){return e===s.mostRecentlyFocusedNode}))}));t&&h(c())},k="undefined"!==typeof window&&"MutationObserver"in window?new MutationObserver(C):void 0,O=function(){k&&(k.disconnect(),s.active&&!s.paused&&s.containers.map((function(e){k.observe(e,{subtree:!0,childList:!0})})))};return n={get active(){return s.active},get paused(){return s.paused},activate:function(e){if(s.active)return this;var t=a(e,"onActivate"),n=a(e,"onPostActivate"),o=a(e,"checkCanFocusTrap");o||d(),s.active=!0,s.paused=!1,s.nodeFocusedBeforeActivation=f(r),null===t||void 0===t||t();var i=function(){o&&d(),S(),O(),null===n||void 0===n||n()};return o?(o(s.containers.concat()).then(i,i),this):(i(),this)},deactivate:function(e){if(!s.active)return this;var t=z({onDeactivate:i.onDeactivate,onPostDeactivate:i.onPostDeactivate,checkCanReturnFocus:i.checkCanReturnFocus},e);clearTimeout(s.delayInitialFocusTimer),s.delayInitialFocusTimer=void 0,T(),s.active=!1,s.paused=!1,O(),ee.deactivateTrap(o,n);var r=a(t,"onDeactivate"),l=a(t,"onPostDeactivate"),u=a(t,"checkCanReturnFocus"),c=a(t,"returnFocus","returnFocusOnDeactivate");null===r||void 0===r||r();var d=function(){se((function(){c&&h(p(s.nodeFocusedBeforeActivation)),null===l||void 0===l||l()}))};return c&&u?(u(p(s.nodeFocusedBeforeActivation)).then(d,d),this):(d(),this)},pause:function(e){return s.active?(s.manuallyPaused=!0,this._setPausedState(!0,e)):this},unpause:function(e){return s.active?(s.manuallyPaused=!1,o[o.length-1]!==this?this:this._setPausedState(!1,e)):this},updateContainerElements:function(e){var t=[].concat(e).filter(Boolean);return s.containers=t.map((function(e){return"string"===typeof e?r.querySelector(e):e})),s.active&&d(),O(),this}},Object.defineProperties(n,{_isManuallyPaused:{value:function(){return s.manuallyPaused}},_setPausedState:{value:function(e,t){if(s.paused===e)return this;if(s.paused=e,e){var n=a(t,"onPause"),r=a(t,"onPostPause");null===n||void 0===n||n(),T(),O(),null===r||void 0===r||r()}else{var o=a(t,"onUnpause"),i=a(t,"onPostUnpause");null===o||void 0===o||o(),d(),S(),O(),null===i||void 0===i||i()}return this}}}),n.updateContainerElements(e),n}; /*! * focus-trap-vue v4.0.2 * (c) 2023 Eduardo San Martin Morote * @license MIT */ function de(e){return e}const fe=de({escapeDeactivates:{type:Boolean,default:!0},returnFocusOnDeactivate:{type:Boolean,default:!0},allowOutsideClick:{type:[Boolean,Function],default:!0},clickOutsideDeactivates:[Boolean,Function],initialFocus:[String,Function,Boolean],fallbackFocus:[String,Function],checkCanFocusTrap:Function,checkCanReturnFocus:Function,delayInitialFocus:{type:Boolean,default:!0},document:Object,preventScroll:Boolean,setReturnFocus:[Object,String,Boolean,Function],tabbableOptions:Object}),he=(0,r.pM)({props:Object.assign({active:{type:Boolean,default:!0}},fe),emits:["update:active","activate","postActivate","deactivate","postDeactivate"],render(){return this.renderImpl()},setup(e,{slots:t,emit:n}){let o;const i=(0,u.KR)(null),s=(0,r.EW)((()=>{const e=i.value;return e&&(e instanceof HTMLElement?e:e.$el)}));function a(){return o||(o=ce(s.value,{escapeDeactivates:e.escapeDeactivates,allowOutsideClick:e.allowOutsideClick,returnFocusOnDeactivate:e.returnFocusOnDeactivate,clickOutsideDeactivates:e.clickOutsideDeactivates,onActivate:()=>{n("update:active",!0),n("activate")},onDeactivate:()=>{n("update:active",!1),n("deactivate")},onPostActivate:()=>n("postActivate"),onPostDeactivate:()=>n("postDeactivate"),initialFocus:e.initialFocus,fallbackFocus:e.fallbackFocus,tabbableOptions:e.tabbableOptions,delayInitialFocus:e.delayInitialFocus,preventScroll:e.preventScroll}))}return(0,r.sV)((()=>{(0,r.wB)((()=>e.active),(e=>{e&&s.value?a().activate():o&&(o.deactivate(),s.value&&s.value.nodeType!==Node.COMMENT_NODE||(o=null))}),{immediate:!0,flush:"post"})})),(0,r.hi)((()=>{o&&o.deactivate(),o=null})),{activate(){a().activate()},deactivate(){o&&o.deactivate()},renderImpl(){if(!t.default)return null;const e=t.default().filter((e=>e.type!==r.Mw));if(!e||!e.length||e.length>1)return console.error("[focus-trap-vue]: FocusTrap requires exactly one child."),e;const n=(0,r.E3)(e[0],{ref:i});return n}}}});var pe={components:{FocusTrap:he},emits:["submit","clear"],props:{fixed:Boolean,popupClass:[String,Object,null],headline:String,headlineType:String},methods:{clearCurrent(e){(!e||this.$refs.popup&&!this.$refs.popup.contains(e.target)&&document.body.contains(e.target))&&this.$emit("clear")}}},me=n(6262);const ve=(0,me.A)(pe,[["render",l]]);var ge=ve},1701:function(e,t,n){"use strict";var r=n(6518),o=n(9565),i=n(9306),s=n(8551),a=n(1767),l=n(9462),u=n(6319),c=n(9539),d=n(4549),f=n(6395),h=!f&&d("map",TypeError),p=l((function(){var e=this.iterator,t=s(o(this.next,e)),n=this.done=!!t.done;if(!n)return u(e,this.mapper,[t.value,this.counter++],!0)}));r({target:"Iterator",proto:!0,real:!0,forced:f||h},{map:function(e){s(this);try{i(e)}catch(t){c(this,"throw",t)}return h?o(h,this,e):new p(a(this),{mapper:e})}})},1729:function(e,t,n){"use strict";const r=n(144),o=(e,t)=>{const n=r(e,t);return n&&n.prerelease.length?n.prerelease:null};e.exports=o},1763:function(e,t,n){"use strict";const r=n(560),o=(e,t)=>r(e,t,!0);e.exports=o},1767:function(e){"use strict";e.exports=function(e){return{iterator:e,next:e.next,done:!1}}},1828:function(e,t,n){"use strict";var r=n(9504),o=n(9297),i=n(5397),s=n(9617).indexOf,a=n(421),l=r([].push);e.exports=function(e,t){var n,r=i(e),u=0,c=[];for(n in r)!o(a,n)&&o(r,n)&&l(c,n);while(t.length>u)o(r,n=t[u++])&&(~s(c,n)||l(c,n));return c}},1832:function(e,t,n){"use strict";const r=n(144),o=(e,t)=>{const n=r(e,null,!0),o=r(t,null,!0),i=n.compare(o);if(0===i)return null;const s=i>0,a=s?n:o,l=s?o:n,u=!!a.prerelease.length,c=!!l.prerelease.length;if(c&&!u){if(!l.patch&&!l.minor)return"major";if(0===l.compareMain(a))return l.minor&&!l.patch?"minor":"patch"}const d=u?"pre":"";return n.major!==o.major?d+"major":n.minor!==o.minor?d+"minor":n.patch!==o.patch?d+"patch":"prerelease"};e.exports=o},1881:function(e,t){"use strict";t.A={computed:{query:e=>e.$route.query.q,pages:e=>Number(e.$route.query.pages)||1,sorting:e=>e.$route.query.sort||"",isSearching:e=>e.query||e.pages>1||e.sorting},methods:{startSearch(e,t=1){const n={q:e};t&&(n.pages=t),this.sorting&&this.query===e&&(n.sort=this.sorting),this.$router.push({query:n,append:!0}).catch((()=>{}))},stopSearch(e){const t=Object.assign({},this.$route);delete t.query,this.$router.push(t).catch((()=>{})),e&&e.target&&e.target.blur()},sortBy(e){this.$router.push({query:Object.assign({},this.$route.query,{sort:e})}).catch((()=>{}))},loadMore(e){this.startSearch(this.query,this.pages+1),e&&e.target&&e.target.blur()}}}},2106:function(e,t,n){"use strict";var r=n(283),o=n(4913);e.exports=function(e,t,n){return n.get&&r(n.get,t,{getter:!0}),n.set&&r(n.set,t,{setter:!0}),o.f(e,t,n)}},2111:function(e,t,n){"use strict";const r=n(4641),o=n(3999),i=n(5580),s=n(4089),a=n(7059),l=n(5200),u=(e,t,n,u)=>{switch(t){case"===":return"object"===typeof e&&(e=e.version),"object"===typeof n&&(n=n.version),e===n;case"!==":return"object"===typeof e&&(e=e.version),"object"===typeof n&&(n=n.version),e!==n;case"":case"=":case"==":return r(e,n,u);case"!=":return o(e,n,u);case">":return i(e,n,u);case">=":return s(e,n,u);case"<":return a(e,n,u);case"<=":return l(e,n,u);default:throw new TypeError(`Invalid operator: ${t}`)}};e.exports=u},2140:function(e,t,n){"use strict";var r=n(8227),o=r("toStringTag"),i={};i[o]="z",e.exports="[object z]"===String(i)},2195:function(e,t,n){"use strict";var r=n(9504),o=r({}.toString),i=r("".slice);e.exports=function(e){return i(o(e),8,-1)}},2211:function(e,t,n){"use strict";var r=n(9039);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},2273:function(e,t,n){"use strict";n.d(t,{A:function(){return f}});var r=n(641),o=n(33);const i={class:"theme-switch"},s=["title"],a=["title"];function l(e,t,n,l,u,c){return(0,r.uX)(),(0,r.CE)("div",i,["dark"===e.colorScheme?((0,r.uX)(),(0,r.CE)("button",{key:0,onClick:t[0]||(t[0]=(...e)=>c.toggle&&c.toggle(...e)),title:e.$t("ui.app.colorLightTitle")},(0,o.v_)(e.$t("ui.app.colorLight")),9,s)):((0,r.uX)(),(0,r.CE)("button",{key:1,onClick:t[1]||(t[1]=(...e)=>c.toggle&&c.toggle(...e)),title:e.$t("ui.app.colorDarkTitle")},(0,o.v_)(e.$t("ui.app.colorDark")),9,a))])}var u={data:()=>({colorScheme:"light"}),methods:{prefersDark(){const e=localStorage.getItem("contao--prefers-dark");return null===e?!!window.matchMedia("(prefers-color-scheme: dark)").matches:"true"===e},setColorScheme(){document.documentElement.dataset.colorScheme=this.colorScheme=this.prefersDark()?"dark":"light"},toggle(){const e=!this.prefersDark();e===window.matchMedia("(prefers-color-scheme: dark)").matches?localStorage.removeItem("contao--prefers-dark"):localStorage.setItem("contao--prefers-dark",String(e)),this.setColorScheme()}},mounted(){window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",this.setColorScheme),this.setColorScheme()},unmounted(){window.matchMedia("(prefers-color-scheme: dark)").removeEventListener("change",this.setColorScheme)}},c=n(6262);const d=(0,c.A)(u,[["render",l]]);var f=d},2360:function(e,t,n){"use strict";var r,o=n(8551),i=n(6801),s=n(8727),a=n(421),l=n(397),u=n(4055),c=n(6119),d=">",f="<",h="prototype",p="script",m=c("IE_PROTO"),v=function(){},g=function(e){return f+p+d+e+f+"/"+p+d},y=function(e){e.write(g("")),e.close();var t=e.parentWindow.Object;return e=null,t},b=function(){var e,t=u("iframe"),n="java"+p+":";return t.style.display="none",l.appendChild(t),t.src=String(n),e=t.contentWindow.document,e.open(),e.write(g("document.F=Object")),e.close(),e.F},_=function(){try{r=new ActiveXObject("htmlfile")}catch(t){}_="undefined"!=typeof document?document.domain&&r?y(r):b():y(r);var e=s.length;while(e--)delete _[h][s[e]];return _()};a[m]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(v[h]=o(e),n=new v,v[h]=null,n[m]=e):n=_(),void 0===t?n:i.f(n,t)}},2489:function(e,t,n){"use strict";var r=n(6518),o=n(9565),i=n(9306),s=n(8551),a=n(1767),l=n(9462),u=n(6319),c=n(6395),d=n(9539),f=n(4549),h=!c&&f("filter",TypeError),p=l((function(){var e,t,n,r=this.iterator,i=this.predicate,a=this.next;while(1){if(e=s(o(a,r)),t=this.done=!!e.done,t)return;if(n=e.value,u(r,i,[n,this.counter++],!0))return n}}));r({target:"Iterator",proto:!0,real:!0,forced:c||h},{filter:function(e){s(this);try{i(e)}catch(t){d(this,"throw",t)}return h?o(h,this,e):new p(a(this),{predicate:e})}})},2525:function(e,t,n){"use strict";const r=n(7638),o=n(560);e.exports=(e,t,n)=>{const i=[];let s=null,a=null;const l=e.sort(((e,t)=>o(e,t,n)));for(const o of l){const e=r(o,t,n);e?(a=o,s||(s=o)):(a&&i.push([s,a]),a=null,s=null)}s&&i.push([s,null]);const u=[];for(const[r,o]of i)r===o?u.push(r):o||r!==l[0]?o?r===l[0]?u.push(`<=${o}`):u.push(`${r} - ${o}`):u.push(`>=${r}`):u.push("*");const c=u.join(" || "),d="string"===typeof t.raw?t.raw:String(t);return c.lengthy;y++)if(_=I(e[y]),_&&u(m,_))return _;return new p(!1)}v=c(e,g)}E=C?e.next:v.next;while(!(w=o(E,v)).done){try{_=I(w.value)}catch(L){f(v,"throw",L)}if("object"==typeof _&&_&&u(m,_))return _}return new p(!1)}},2777:function(e,t,n){"use strict";var r=n(9565),o=n(34),i=n(757),s=n(5966),a=n(4270),l=n(8227),u=TypeError,c=l("toPrimitive");e.exports=function(e,t){if(!o(e)||i(e))return e;var n,l=s(e,c);if(l){if(void 0===t&&(t="default"),n=r(l,e,t),!o(n)||i(n))return n;throw new u("Can't convert object to primitive value")}return void 0===t&&(t="number"),a(e,t)}},2787:function(e,t,n){"use strict";var r=n(9297),o=n(4901),i=n(8981),s=n(6119),a=n(2211),l=s("IE_PROTO"),u=Object,c=u.prototype;e.exports=a?u.getPrototypeOf:function(e){var t=i(e);if(r(t,l))return t[l];var n=t.constructor;return o(n)&&t instanceof n?n.prototype:t instanceof u?c:null}},2796:function(e,t,n){"use strict";var r=n(9039),o=n(4901),i=/#|\.prototype\./,s=function(e,t){var n=l[a(e)];return n===c||n!==u&&(o(t)?r(t):!!t)},a=s.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=s.data={},u=s.NATIVE="N",c=s.POLYFILL="P";e.exports=s},2812:function(e){"use strict";var t=TypeError;e.exports=function(e,n){if(enew r(e,t).major;e.exports=o},3007:function(e,t,n){"use strict";const r=n(3908),o=(e,t,n,o,i)=>{"string"===typeof n&&(i=o,o=n,n=void 0);try{return new r(e instanceof r?e.version:e,n).inc(t,o,i).version}catch(s){return null}};e.exports=o},3192:function(e,t,n){"use strict";n.d(t,{A:function(){return o}});var r=n(3751);async function o(e,t,n,o=()=>{}){if(await t.init(),void 0!==URLSearchParams){const e=new URLSearchParams(location.search);if(e.has("_locale")){await t.switch(e.get("_locale")),e.delete("_locale");const n=new URL(location.pathname,location);n.search=e.toString(),history.replaceState(history.state,"",n.toString())}}const i=(0,r.Ef)({...e});i.use(t.plugin),n.forEach((e=>{i.use(e)})),o(i),i.mount("body")}},3382:function(e,t,n){"use strict";e.exports=n.p+"img/funding.cf78a0a0.svg"},3392:function(e,t,n){"use strict";var r=n(9504),o=0,i=Math.random(),s=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+s(++o+i,36)}},3513:function(e,t,n){"use strict";n.d(t,{iDZ:function(){return S}});var r=n(953),o=n(641);function i(e){return!!(0,r.o5)()&&((0,r.jr)(e),!0)}const s="undefined"!==typeof window&&"undefined"!==typeof document,a=("undefined"!==typeof WorkerGlobalScope&&(globalThis,WorkerGlobalScope),Object.prototype.toString),l=e=>"[object Object]"===a.call(e);function u(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const e=t;t=void 0,e&&await e},n}function c(e){return Array.isArray(e)?e:[e]}function d(e){const t=Object.create(null);return n=>{const r=t[n];return r||(t[n]=e(n))}}const f=/\B([A-Z])/g,h=(d((e=>e.replace(f,"-$1").toLowerCase())),/-(\w)/g);d((e=>e.replace(h,((e,t)=>t?t.toUpperCase():""))));function p(e,t,n={}){const{immediate:o=!0,immediateCallback:a=!1}=n,l=(0,r.IJ)(!1);let u=null;function c(){u&&(clearTimeout(u),u=null)}function d(){l.value=!1,c()}function f(...n){a&&e(),c(),l.value=!0,u=setTimeout((()=>{l.value=!1,u=null,e(...n)}),(0,r.BA)(t))}return o&&(l.value=!0,s&&f()),i(d),{isPending:(0,r.nD)(l),start:f,stop:d}}function m(e,t,n){return(0,o.wB)(e,t,{...n,immediate:!0})}const v=s?window:void 0,g=(s&&window.document,s?window.navigator:void 0);s&&window.location;function y(e){var t;const n=(0,r.BA)(e);return null!=(t=null==n?void 0:n.$el)?t:n}function b(...e){const t=[],n=()=>{t.forEach((e=>e())),t.length=0},s=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),a=(0,o.EW)((()=>{const t=c((0,r.BA)(e[0])).filter((e=>null!=e));return t.every((e=>"string"!==typeof e))?t:void 0})),u=m((()=>{var t,n;return[null!=(n=null==(t=a.value)?void 0:t.map((e=>y(e))))?n:[v].filter((e=>null!=e)),c((0,r.BA)(a.value?e[1]:e[0])),c((0,r.R1)(a.value?e[2]:e[1])),(0,r.BA)(a.value?e[3]:e[2])]}),(([e,r,o,i])=>{if(n(),!(null==e?void 0:e.length)||!(null==r?void 0:r.length)||!(null==o?void 0:o.length))return;const a=l(i)?{...i}:i;t.push(...e.flatMap((e=>r.flatMap((t=>o.map((n=>s(e,t,n,a))))))))}),{flush:"post"}),d=()=>{u(),n()};return i(n),d}function _(){const e=(0,r.IJ)(!1),t=(0,o.nI)();return t&&(0,o.sV)((()=>{e.value=!0}),t),e}function E(e){const t=_();return(0,o.EW)((()=>(t.value,Boolean(e()))))}Symbol("vueuse-ssr-width");function w(e,t={}){const{controls:n=!1,navigator:o=g}=t,i=E((()=>o&&"permissions"in o)),s=(0,r.IJ)(),a="string"===typeof e?{name:e}:e,l=(0,r.IJ)(),c=()=>{var e,t;l.value=null!=(t=null==(e=s.value)?void 0:e.state)?t:"prompt"};b(s,"change",c,{passive:!0});const d=u((async()=>{if(i.value){if(!s.value)try{s.value=await o.permissions.query(a)}catch(e){s.value=void 0}finally{c()}return n?(0,r.ux)(s.value):void 0}}));return d(),n?{state:l,isSupported:i,query:d}:l}function S(e={}){const{navigator:t=g,read:n=!1,source:i,copiedDuring:s=1500,legacy:a=!1}=e,l=E((()=>t&&"clipboard"in t)),u=w("clipboard-read"),c=w("clipboard-write"),d=(0,o.EW)((()=>l.value||a)),f=(0,r.IJ)(""),h=(0,r.IJ)(!1),m=p((()=>h.value=!1),s,{immediate:!1});async function v(){let e=!(l.value&&T(u.value));if(!e)try{f.value=await t.clipboard.readText()}catch(n){e=!0}e&&(f.value=S())}async function y(e=(0,r.BA)(i)){if(d.value&&null!=e){let r=!(l.value&&T(c.value));if(!r)try{await t.clipboard.writeText(e)}catch(n){r=!0}r&&_(e),f.value=e,h.value=!0,m.start()}}function _(e){const t=document.createElement("textarea");t.value=null!=e?e:"",t.style.position="absolute",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),t.remove()}function S(){var e,t,n;return null!=(n=null==(t=null==(e=null==document?void 0:document.getSelection)?void 0:e.call(document))?void 0:t.toString())?n:""}function T(e){return"granted"===e||"prompt"===e}return d.value&&n&&b(["copy","cut"],v,{passive:!0}),{isSupported:d,text:f,copied:h,copy:y}}"undefined"!==typeof globalThis?globalThis:"undefined"!==typeof window?window:"undefined"!==typeof global?global:"undefined"!==typeof self&&self;Number.POSITIVE_INFINITY},3706:function(e,t,n){"use strict";var r=n(9504),o=n(4901),i=n(7629),s=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return s(e)}),e.exports=i.inspectSource},3717:function(e,t){"use strict";t.f=Object.getOwnPropertySymbols},3724:function(e,t,n){"use strict";var r=n(9039);e.exports=!r((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},3751:function(e,t,n){"use strict";n.d(t,{$9:function(){return V},$V:function(){return r.$V},$u:function(){return r.$u},$y:function(){return r.$y},BA:function(){return r.BA},Bi:function(){return r.Bi},Bs:function(){return r.Bs},C4:function(){return r.C4},CE:function(){return r.CE},D:function(){return we},D$:function(){return Je},Df:function(){return r.Df},Dl:function(){return r.Dl},E:function(){return r.E},E3:function(){return r.E3},EW:function(){return r.EW},EY:function(){return r.EY},Ef:function(){return lt},F:function(){return Re},FK:function(){return r.FK},Fv:function(){return r.Fv},Fw:function(){return r.Fw},GM:function(){return r.GM},Gc:function(){return r.Gc},Gt:function(){return r.Gt},Gw:function(){return r.Gw},Gy:function(){return r.Gy},H4:function(){return r.H4},HF:function(){return r.HF},Ht:function(){return r.Ht},IG:function(){return r.IG},IJ:function(){return r.IJ},Ib:function(){return ht},Ic:function(){return r.Ic},Im:function(){return r.Im},Jo:function(){return $e},K9:function(){return r.K9},KC:function(){return r.KC},KR:function(){return r.KR},KT:function(){return _e},Kf:function(){return r.Kf},Kh:function(){return r.Kh},LJ:function(){return r.LJ},LM:function(){return r.LM},Lk:function(){return r.Lk},Lu:function(){return r.Lu},MZ:function(){return r.MZ},Mw:function(){return r.Mw},NP:function(){return r.NP},Ng:function(){return r.Ng},OA:function(){return r.OA},OW:function(){return r.OW},PP:function(){return r.PP},PR:function(){return r.PR},PS:function(){return r.PS},PT:function(){return r.PT},Pn:function(){return r.Pn},Po:function(){return ge},Pr:function(){return r.Pr},Q3:function(){return r.Q3},QP:function(){return r.QP},QW:function(){return r.QW},QZ:function(){return r.QZ},Qi:function(){return r.Qi},Qv:function(){return at},R1:function(){return r.R1},R8:function(){return r.R8},RG:function(){return r.RG},SS:function(){return r.SS},Tb:function(){return r.Tb},Tm:function(){return r.Tm},Tq:function(){return r.Tq},Tr:function(){return r.Tr},U4:function(){return r.U4},U_:function(){return r.U_},Ul:function(){return r.Ul},Vq:function(){return r.Vq},Vy:function(){return be},WQ:function(){return r.WQ},Wv:function(){return r.Wv},X2:function(){return r.X2},XL:function(){return Be},XX:function(){return st},Xq:function(){return ve},Y4:function(){return r.Y4},Y5:function(){return r.Y5},YY:function(){return r.YY},Yj:function(){return r.Yj},Yv:function(){return r.Yv},ZH:function(){return r.ZH},ZQ:function(){return r.ZQ},_B:function(){return r._B},_U:function(){return Ee},aG:function(){return $},aT:function(){return r.aT},bF:function(){return r.bF},bU:function(){return r.bU},bj:function(){return r.bj},bn:function(){return r.bn},bo:function(){return r.bo},ch:function(){return r.ch},ci:function(){return r.ci},dA:function(){return r.dA},dY:function(){return r.dY},ds:function(){return r.ds},eB:function(){return _},eW:function(){return r.eW},eX:function(){return r.eX},fE:function(){return r.fE},fn:function(){return r.fn},g2:function(){return r.g2},g8:function(){return r.g8},gN:function(){return r.gN},gW:function(){return r.gW},gh:function(){return r.gh},h:function(){return r.h},hi:function(){return r.hi},hp:function(){return Xe},i9:function(){return r.i9},iD:function(){return r.iD},jC:function(){return r.jC},jR:function(){return et},jr:function(){return r.jr},jt:function(){return r.jt},ju:function(){return r.ju},k6:function(){return r.k6},lH:function(){return je},lW:function(){return r.lW},lt:function(){return r.lt},m1:function(){return ut},mu:function(){return r.mu},n:function(){return r.n},nD:function(){return r.nD},nI:function(){return r.nI},nT:function(){return r.nT},o5:function(){return r.o5},p9:function(){return r.p9},pI:function(){return r.pI},pM:function(){return r.pM},pR:function(){return r.pR},qG:function(){return r.qG},qL:function(){return r.qL},qP:function(){return r.qP},qR:function(){return r.qR},rE:function(){return r.rE},rO:function(){return r.rO},rU:function(){return r.rU},rY:function(){return r.rY},rk:function(){return r.rk},sV:function(){return r.sV},tB:function(){return r.tB},tC:function(){return r.tC},tG:function(){return r.tG},tY:function(){return r.tY},u1:function(){return Ve},uX:function(){return r.uX},uY:function(){return r.uY},ux:function(){return r.ux},v6:function(){return r.v6},v_:function(){return r.v_},vv:function(){return r.vv},wB:function(){return r.wB},wX:function(){return r.wX},wk:function(){return r.wk},xo:function(){return r.xo},y$:function(){return r.y$},yC:function(){return r.yC},zz:function(){return r.zz}});var r=n(641),o=n(33),i=n(953); /** * @vue/runtime-dom v3.5.16 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ let s;const a="undefined"!==typeof window&&window.trustedTypes;if(a)try{s=a.createPolicy("vue",{createHTML:e=>e})}catch(pt){}const l=s?e=>s.createHTML(e):e=>e,u="http://www.w3.org/2000/svg",c="http://www.w3.org/1998/Math/MathML",d="undefined"!==typeof document?document:null,f=d&&d.createElement("template"),h={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o="svg"===t?d.createElementNS(u,e):"mathml"===t?d.createElementNS(c,e):n?d.createElement(e,{is:n}):d.createElement(e);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>d.createTextNode(e),createComment:e=>d.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>d.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling)){while(1)if(t.insertBefore(o.cloneNode(!0),n),o===i||!(o=o.nextSibling))break}else{f.innerHTML=l("svg"===r?`${e}`:"mathml"===r?`${e}`:e);const o=f.content;if("svg"===r||"mathml"===r){const e=o.firstChild;while(e.firstChild)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},p="transition",m="animation",v=Symbol("_vtc"),g={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},y=(0,o.X$)({},r.QP,g),b=e=>(e.displayName="Transition",e.props=y,e),_=b(((e,{slots:t})=>(0,r.h)(r.pR,S(e),t))),E=(e,t=[])=>{(0,o.cy)(e)?e.forEach((e=>e(...t))):e&&e(...t)},w=e=>!!e&&((0,o.cy)(e)?e.some((e=>e.length>1)):e.length>1);function S(e){const t={};for(const o in e)o in g||(t[o]=e[o]);if(!1===e.css)return t;const{name:n="v",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:u=s,appearActiveClass:c=a,appearToClass:d=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=T(i),v=m&&m[0],y=m&&m[1],{onBeforeEnter:b,onEnter:_,onEnterCancelled:S,onLeave:C,onLeaveCancelled:R,onBeforeAppear:L=b,onAppear:N=_,onAppearCancelled:x=S}=t,M=(e,t,n,r)=>{e._enterCancelled=r,O(e,t?d:l),O(e,t?c:a),n&&n()},D=(e,t)=>{e._isLeaving=!1,O(e,f),O(e,p),O(e,h),t&&t()},F=e=>(t,n)=>{const o=e?N:_,i=()=>M(t,e,n);E(o,[t,i]),A((()=>{O(t,e?u:s),k(t,e?d:l),w(o)||I(t,r,v,i)}))};return(0,o.X$)(t,{onBeforeEnter(e){E(b,[e]),k(e,s),k(e,a)},onBeforeAppear(e){E(L,[e]),k(e,u),k(e,c)},onEnter:F(!1),onAppear:F(!0),onLeave(e,t){e._isLeaving=!0;const n=()=>D(e,t);k(e,f),e._enterCancelled?(k(e,h),P()):(P(),k(e,h)),A((()=>{e._isLeaving&&(O(e,f),k(e,p),w(C)||I(e,r,y,n))})),E(C,[e,n])},onEnterCancelled(e){M(e,!1,void 0,!0),E(S,[e])},onAppearCancelled(e){M(e,!0,void 0,!0),E(x,[e])},onLeaveCancelled(e){D(e),E(R,[e])}})}function T(e){if(null==e)return null;if((0,o.Gv)(e))return[C(e.enter),C(e.leave)];{const t=C(e);return[t,t]}}function C(e){const t=(0,o.Ro)(e);return t}function k(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[v]||(e[v]=new Set)).add(t)}function O(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[v];n&&(n.delete(t),n.size||(e[v]=void 0))}function A(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let R=0;function I(e,t,n,r){const o=e._endId=++R,i=()=>{o===e._endId&&r()};if(null!=n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=L(e,t);if(!s)return r();const u=s+"end";let c=0;const d=()=>{e.removeEventListener(u,f),i()},f=t=>{t.target===e&&++c>=l&&d()};setTimeout((()=>{c(n[e]||"").split(", "),o=r(`${p}Delay`),i=r(`${p}Duration`),s=N(o,i),a=r(`${m}Delay`),l=r(`${m}Duration`),u=N(a,l);let c=null,d=0,f=0;t===p?s>0&&(c=p,d=s,f=i.length):t===m?u>0&&(c=m,d=u,f=l.length):(d=Math.max(s,u),c=d>0?s>u?p:m:null,f=c?c===p?i.length:l.length:0);const h=c===p&&/\b(transform|all)(,|$)/.test(r(`${p}Property`).toString());return{type:c,timeout:d,propCount:f,hasTransform:h}}function N(e,t){while(e.lengthx(t)+x(e[n]))))}function x(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}function P(){return document.body.offsetHeight}function M(e,t,n){const r=e[v];r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const D=Symbol("_vod"),F=Symbol("_vsh"),$={beforeMount(e,{value:t},{transition:n}){e[D]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):j(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!==!n&&(r?t?(r.beforeEnter(e),j(e,!0),r.enter(e)):r.leave(e,(()=>{j(e,!1)})):j(e,t))},beforeUnmount(e,{value:t}){j(e,t)}};function j(e,t){e.style.display=t?e[D]:"none",e[F]=!t}function U(){$.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const B=Symbol("");function V(e){const t=(0,r.nI)();if(!t)return;const n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach((e=>W(e,n)))};const i=()=>{const r=e(t.proxy);t.ce?W(t.ce,r):H(t.subTree,r),n(r)};(0,r.Ic)((()=>{(0,r.Dl)(i)})),(0,r.sV)((()=>{(0,r.wB)(i,o.tE,{flush:"post"});const e=new MutationObserver(i);e.observe(t.subTree.el.parentNode,{childList:!0}),(0,r.hi)((()=>e.disconnect()))}))}function H(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{H(n.activeBranch,t)}))}while(e.component)e=e.component.subTree;if(1&e.shapeFlag&&e.el)W(e.el,t);else if(e.type===r.FK)e.children.forEach((e=>H(e,t)));else if(e.type===r.jC){let{el:n,anchor:r}=e;while(n){if(W(n,t),n===r)break;n=n.nextSibling}}}function W(e,t){if(1===e.nodeType){const n=e.style;let r="";for(const e in t)n.setProperty(`--${e}`,t[e]),r+=`--${e}: ${t[e]};`;n[B]=r}}const G=/(^|;)\s*display\s*:/;function X(e,t,n){const r=e.style,i=(0,o.Kg)(n);let s=!1;if(n&&!i){if(t)if((0,o.Kg)(t))for(const e of t.split(";")){const t=e.slice(0,e.indexOf(":")).trim();null==n[t]&&q(r,t,"")}else for(const e in t)null==n[e]&&q(r,e,"");for(const e in n)"display"===e&&(s=!0),q(r,e,n[e])}else if(i){if(t!==n){const e=r[B];e&&(n+=";"+e),r.cssText=n,s=G.test(n)}}else t&&e.removeAttribute("style");D in e&&(e[D]=s?r.display:"",e[F]&&(r.display="none"))}const K=/\s*!important$/;function q(e,t,n){if((0,o.cy)(n))n.forEach((n=>q(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Q(e,t);K.test(n)?e.setProperty((0,o.Tg)(r),n.replace(K,""),"important"):e[r]=n}}const z=["Webkit","Moz","ms"],Y={};function Q(e,t){const n=Y[t];if(n)return n;let r=(0,o.PT)(t);if("filter"!==r&&r in e)return Y[t]=r;r=(0,o.ZH)(r);for(let o=0;oae||(le.then((()=>ae=0)),ae=Date.now());function ce(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();(0,r.qL)(de(e,n.value),t,5,[e])};return n.value=e,n.attached=ue(),n}function de(e,t){if((0,o.cy)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}const fe=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,he=(e,t,n,r,i,s)=>{const a="svg"===i;"class"===t?M(e,r,a):"style"===t?X(e,n,r):(0,o.Mp)(t)?(0,o.CP)(t)||oe(e,t,n,r,s):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):pe(e,t,r,a))?(ee(e,t,r),e.tagName.includes("-")||"value"!==t&&"checked"!==t&&"selected"!==t||Z(e,t,r,a,s,"value"!==t)):!e._isVueCE||!/[A-Z]/.test(t)&&(0,o.Kg)(r)?("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),Z(e,t,r,a)):ee(e,(0,o.PT)(t),r,s,t)};function pe(e,t,n,r){if(r)return"innerHTML"===t||"textContent"===t||!!(t in e&&fe(t)&&(0,o.Tn)(n));if("spellcheck"===t||"draggable"===t||"translate"===t||"autocorrect"===t)return!1;if("form"===t)return!1;if("list"===t&&"INPUT"===e.tagName)return!1;if("type"===t&&"TEXTAREA"===e.tagName)return!1;if("width"===t||"height"===t){const t=e.tagName;if("IMG"===t||"VIDEO"===t||"CANVAS"===t||"SOURCE"===t)return!1}return(!fe(t)||!(0,o.Kg)(n))&&t in e}const me={}; /*! #__NO_SIDE_EFFECTS__ */function ve(e,t,n){const i=(0,r.pM)(e,t);(0,o.Qd)(i)&&(0,o.X$)(i,t);class s extends be{constructor(e){super(i,e,n)}}return s.def=i,s} /*! #__NO_SIDE_EFFECTS__ */const ge=(e,t)=>ve(e,t,ut),ye="undefined"!==typeof HTMLElement?HTMLElement:class{};class be extends ye{constructor(e,t={},n=lt){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&n!==lt?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow({mode:"open"}),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;while(e=e&&(e.parentNode||e.host))if(e instanceof be){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then((()=>{this._pendingResolve=void 0,this._resolveDef()})):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,(0,r.dY)((()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)}))}_resolveDef(){if(this._pendingResolve)return;for(let n=0;n{for(const t of e)this._setAttr(t.attributeName)})),this._ob.observe(this,{attributes:!0});const e=(e,t=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:n,styles:r}=e;let i;if(n&&!(0,o.cy)(n))for(const s in n){const e=n[s];(e===Number||e&&e.type===Number)&&(s in this._props&&(this._props[s]=(0,o.Ro)(this._props[s])),(i||(i=Object.create(null)))[(0,o.PT)(s)]=!0)}this._numberProps=i,this._resolveProps(e),this.shadowRoot&&this._applyStyles(r),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then((t=>e(this._def=t,!0))):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const t=this._instance&&this._instance.exposed;if(t)for(const n in t)(0,o.$3)(this,n)||Object.defineProperty(this,n,{get:()=>(0,i.R1)(t[n])})}_resolveProps(e){const{props:t}=e,n=(0,o.cy)(t)?t:Object.keys(t||{});for(const r of Object.keys(this))"_"!==r[0]&&n.includes(r)&&this._setProp(r,this[r]);for(const r of n.map(o.PT))Object.defineProperty(this,r,{get(){return this._getProp(r)},set(e){this._setProp(r,e,!0,!0)}})}_setAttr(e){if(e.startsWith("data-v-"))return;const t=this.hasAttribute(e);let n=t?this.getAttribute(e):me;const r=(0,o.PT)(e);t&&this._numberProps&&this._numberProps[r]&&(n=(0,o.Ro)(n)),this._setProp(r,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!1){if(t!==this._props[e]&&(t===me?delete this._props[e]:(this._props[e]=t,"key"===e&&this._app&&(this._app._ceVNode.key=t)),r&&this._instance&&this._update(),n)){const n=this._ob;n&&n.disconnect(),!0===t?this.setAttribute((0,o.Tg)(e),""):"string"===typeof t||"number"===typeof t?this.setAttribute((0,o.Tg)(e),t+""):t||this.removeAttribute((0,o.Tg)(e)),n&&n.observe(this,{attributes:!0})}}_update(){const e=this._createVNode();this._app&&(e.appContext=this._app._context),st(e,this._root)}_createVNode(){const e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));const t=(0,r.bF)(this._def,(0,o.X$)(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;const t=(e,t)=>{this.dispatchEvent(new CustomEvent(e,(0,o.Qd)(t[0])?(0,o.X$)({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),(0,o.Tg)(e)!==e&&t((0,o.Tg)(e),n)},this._setParent()}),t}_applyStyles(e,t){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}const n=this._nonce;for(let r=e.length-1;r>=0;r--){const t=document.createElement("style");n&&t.setAttribute("nonce",n),t.textContent=e[r],this.shadowRoot.prepend(t)}}_parseSlots(){const e=this._slots={};let t;while(t=this.firstChild){const n=1===t.nodeType&&t.getAttribute("slot")||"default";(e[n]||(e[n]=[])).push(t),this.removeChild(t)}}_renderSlots(){const e=(this._teleportTarget||this).querySelectorAll("slot"),t=this._instance.type.__scopeId;for(let n=0;n(delete e.props.mode,e),Ae=Oe({name:"TransitionGroup",props:(0,o.X$)({},y,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,r.nI)(),o=(0,r.Gy)();let s,a;return(0,r.$u)((()=>{if(!s.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!xe(s[0].el,n.vnode.el,t))return void(s=[]);s.forEach(Ie),s.forEach(Le);const r=s.filter(Ne);P(),r.forEach((e=>{const n=e.el,r=n.style;k(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n[Ce]=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n[Ce]=null,O(n,t))};n.addEventListener("transitionend",o)})),s=[]})),()=>{const l=(0,i.ux)(e),u=S(l);let c=l.tag||r.FK;if(s=[],a)for(let e=0;e{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const i=1===t.nodeType?t:t.parentNode;i.appendChild(r);const{hasTransform:s}=L(r);return i.removeChild(r),s}const Pe=e=>{const t=e.props["onUpdate:modelValue"]||!1;return(0,o.cy)(t)?e=>(0,o.DY)(t,e):t};function Me(e){e.target.composing=!0}function De(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Fe=Symbol("_assign"),$e={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[Fe]=Pe(i);const s=r||i.props&&"number"===i.props.type;te(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n&&(r=r.trim()),s&&(r=(0,o.bB)(r)),e[Fe](r)})),n&&te(e,"change",(()=>{e.value=e.value.trim()})),t||(te(e,"compositionstart",Me),te(e,"compositionend",De),te(e,"change",De))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:s}},a){if(e[Fe]=Pe(a),e.composing)return;const l=!s&&"number"!==e.type||/^0\d/.test(e.value)?e.value:(0,o.bB)(e.value),u=null==t?"":t;if(l!==u){if(document.activeElement===e&&"range"!==e.type){if(r&&t===n)return;if(i&&e.value.trim()===u)return}e.value=u}}},je={deep:!0,created(e,t,n){e[Fe]=Pe(n),te(e,"change",(()=>{const t=e._modelValue,n=We(e),r=e.checked,i=e[Fe];if((0,o.cy)(t)){const e=(0,o.u3)(t,n),s=-1!==e;if(r&&!s)i(t.concat(n));else if(!r&&s){const n=[...t];n.splice(e,1),i(n)}}else if((0,o.vM)(t)){const e=new Set(t);r?e.add(n):e.delete(n),i(e)}else i(Ge(e,r))}))},mounted:Ue,beforeUpdate(e,t,n){e[Fe]=Pe(n),Ue(e,t,n)}};function Ue(e,{value:t,oldValue:n},r){let i;if(e._modelValue=t,(0,o.cy)(t))i=(0,o.u3)(t,r.props.value)>-1;else if((0,o.vM)(t))i=t.has(r.props.value);else{if(t===n)return;i=(0,o.BX)(t,Ge(e,!0))}e.checked!==i&&(e.checked=i)}const Be={created(e,{value:t},n){e.checked=(0,o.BX)(t,n.props.value),e[Fe]=Pe(n),te(e,"change",(()=>{e[Fe](We(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e[Fe]=Pe(r),t!==n&&(e.checked=(0,o.BX)(t,r.props.value))}},Ve={deep:!0,created(e,{value:t,modifiers:{number:n}},i){const s=(0,o.vM)(t);te(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,o.bB)(We(e)):We(e)));e[Fe](e.multiple?s?new Set(t):t:t[0]),e._assigning=!0,(0,r.dY)((()=>{e._assigning=!1}))})),e[Fe]=Pe(i)},mounted(e,{value:t}){He(e,t)},beforeUpdate(e,t,n){e[Fe]=Pe(n)},updated(e,{value:t}){e._assigning||He(e,t)}};function He(e,t){const n=e.multiple,r=(0,o.cy)(t);if(!n||r||(0,o.vM)(t)){for(let i=0,s=e.options.length;iString(e)===String(a))):(0,o.u3)(t,a)>-1}else s.selected=t.has(a);else if((0,o.BX)(We(s),t))return void(e.selectedIndex!==i&&(e.selectedIndex=i))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function We(e){return"_value"in e?e._value:e.value}function Ge(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Xe={created(e,t,n){qe(e,t,n,null,"created")},mounted(e,t,n){qe(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){qe(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){qe(e,t,n,r,"updated")}};function Ke(e,t){switch(e){case"SELECT":return Ve;case"TEXTAREA":return $e;default:switch(t){case"checkbox":return je;case"radio":return Be;default:return $e}}}function qe(e,t,n,r,o){const i=Ke(e.tagName,n.props&&n.props.type),s=i[o];s&&s(e,t,n,r)}function ze(){$e.getSSRProps=({value:e})=>({value:e}),Be.getSSRProps=({value:e},t)=>{if(t.props&&(0,o.BX)(t.props.value,e))return{checked:!0}},je.getSSRProps=({value:e},t)=>{if((0,o.cy)(e)){if(t.props&&(0,o.u3)(e,t.props.value)>-1)return{checked:!0}}else if((0,o.vM)(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},Xe.getSSRProps=(e,t)=>{if("string"!==typeof t.type)return;const n=Ke(t.type.toUpperCase(),t.props&&t.props.type);return n.getSSRProps?n.getSSRProps(e,t):void 0}}const Ye=["ctrl","shift","alt","meta"],Qe={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>Ye.some((n=>e[`${n}Key`]&&!t.includes(n)))},Je=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(n,...r)=>{for(let e=0;e{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=n=>{if(!("key"in n))return;const r=(0,o.Tg)(n.key);return t.some((e=>e===r||Ze[e]===r))?e(n):void 0})},tt=(0,o.X$)({patchProp:he},h);let nt,rt=!1;function ot(){return nt||(nt=(0,r.K9)(tt))}function it(){return nt=rt?nt:(0,r.ci)(tt),rt=!0,nt}const st=(...e)=>{ot().render(...e)},at=(...e)=>{it().hydrate(...e)},lt=(...e)=>{const t=ot().createApp(...e);const{mount:n}=t;return t.mount=e=>{const r=dt(e);if(!r)return;const i=t._component;(0,o.Tn)(i)||i.render||i.template||(i.template=r.innerHTML),1===r.nodeType&&(r.textContent="");const s=n(r,!1,ct(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t},ut=(...e)=>{const t=it().createApp(...e);const{mount:n}=t;return t.mount=e=>{const t=dt(e);if(t)return n(t,!0,ct(t))},t};function ct(e){return e instanceof SVGElement?"svg":"function"===typeof MathMLElement&&e instanceof MathMLElement?"mathml":void 0}function dt(e){if((0,o.Kg)(e)){const t=document.querySelector(e);return t}return e}let ft=!1;const ht=()=>{ft||(ft=!0,ze(),U())}},3874:function(e,t,n){"use strict";const r=n(8311),o=(e,t)=>{try{return new r(e,t).range||"*"}catch(n){return null}};e.exports=o},3904:function(e,t,n){"use strict";const r=Symbol("SemVer ANY");class o{static get ANY(){return r}constructor(e,t){if(t=i(t),e instanceof o){if(e.loose===!!t.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),u("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===r?this.value="":this.value=this.operator+this.semver.version,u("comp",this)}parse(e){const t=this.options.loose?s[a.COMPARATORLOOSE]:s[a.COMPARATOR],n=e.match(t);if(!n)throw new TypeError(`Invalid comparator: ${e}`);this.operator=void 0!==n[1]?n[1]:"","="===this.operator&&(this.operator=""),n[2]?this.semver=new c(n[2],this.options.loose):this.semver=r}toString(){return this.value}test(e){if(u("Comparator.test",e,this.options.loose),this.semver===r||e===r)return!0;if("string"===typeof e)try{e=new c(e,this.options)}catch(t){return!1}return l(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Comparator is required");return""===this.operator?""===this.value||new d(e.value,t).test(this.value):""===e.operator?""===e.value||new d(this.value,t).test(e.semver):(t=i(t),(!t.includePrerelease||"<0.0.0-0"!==this.value&&"<0.0.0-0"!==e.value)&&(!(!t.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0")))&&(!(!this.operator.startsWith(">")||!e.operator.startsWith(">"))||(!(!this.operator.startsWith("<")||!e.operator.startsWith("<"))||(!(this.semver.version!==e.semver.version||!this.operator.includes("=")||!e.operator.includes("="))||(!!(l(this.semver,"<",e.semver,t)&&this.operator.startsWith(">")&&e.operator.startsWith("<"))||!!(l(this.semver,">",e.semver,t)&&this.operator.startsWith("<")&&e.operator.startsWith(">"))))))))}}e.exports=o;const i=n(8587),{safeRe:s,t:a}=n(9718),l=n(2111),u=n(7272),c=n(3908),d=n(8311)},3908:function(e,t,n){"use strict";const r=n(7272),{MAX_LENGTH:o,MAX_SAFE_INTEGER:i}=n(6874),{safeRe:s,t:a}=n(9718),l=n(8587),{compareIdentifiers:u}=n(1123);class c{constructor(e,t){if(t=l(t),e instanceof c){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if("string"!==typeof e)throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>o)throw new TypeError(`version is longer than ${o} characters`);r("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;const n=e.trim().match(t.loose?s[a.LOOSE]:s[a.FULL]);if(!n)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>i||this.major<0)throw new TypeError("Invalid major version");if(this.minor>i||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>i||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map((e=>{if(/^[0-9]+$/.test(e)){const t=+e;if(t>=0&&t=0)"number"===typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);if(-1===r){if(t===this.prerelease.join(".")&&!1===n)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(e)}}if(t){let r=[t,e];!1===n&&(r=[t]),0===u(this.prerelease[0],t)?isNaN(this.prerelease[1])&&(this.prerelease=r):this.prerelease=r}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}e.exports=c},3927:function(e,t,n){"use strict";const r=n(909),o=(e,t)=>e.sort(((e,n)=>r(e,n,t)));e.exports=o},3936:function(e,t,n){"use strict";n.d(t,{A:function(){return S}});var r=Object.defineProperty,o=(e,t,n)=>t in e?r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,i=(e,t,n)=>o(e,"symbol"!=typeof t?t+"":t,n);function s(e,t){""===e||0===e.length||("string"==typeof e?t.classList.add(e):t.classList.add(...e))}function a(e,t){""===e||0===e.length||("string"==typeof e?t.classList.remove(e):t.classList.remove(...e))}function l(e,t){try{if("object"!=typeof t){const e=typeof t;throw new TypeError(`Elements given to isValidInstance() must be inside of an object. "${e}" given.`)}for(const n in t)if(!(t[n]instanceof e)){const r=typeof t[n];throw new TypeError(`${n} must be an instance of ${e.name}. "${r}" given.`)}return{status:!0,error:null}}catch(n){return{status:!1,error:n}}}function u(e,t){try{if("object"!=typeof t){const e=typeof t;throw new TypeError(`Values given to isValidType() must be inside of an object. "${e}" given.`)}for(const n in t){const r=typeof t[n];if(r!==e)throw new TypeError(`${n} must be a ${e}. "${r}" given.`)}return{status:!0,error:null}}catch(n){return{status:!1,error:n}}}function c(e){try{if("object"!=typeof e){const t=typeof e;throw new TypeError(`Values given to isQuerySelector() must be inside of an object. "${t}" given.`)}for(const t in e)try{if(null===e[t])throw new Error;document.querySelector(e[t])}catch{throw new TypeError(`${t} must be a valid query selector. "${e[t]}" given.`)}return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function d(e){try{if("object"!=typeof e||Array.isArray(e)){const t=typeof e;throw new TypeError(`Values given to isValidClassList() must be inside of an object. "${t}" given.`)}for(const t in e){const n=typeof e[t];if("string"!==n){if(!Array.isArray(e[t]))throw new TypeError(`${t} must be a string or an array of strings. "${n}" given.`);e[t].forEach((e=>{if("string"!=typeof e)throw new TypeError(`${t} must be a string or an array of strings. An array containing non-strings given.`)}))}else{const n={};n[t]=e[t],c(n)}}return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function f(e){try{if("object"!=typeof e){const t=typeof e;throw new TypeError(`Values given to isValidState() must be inside of an object. "${t}" given.`)}const t=["none","self","child"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function h(e){try{if("object"!=typeof e){const t=typeof e;throw new TypeError(`Values given to isValidEvent() must be inside of an object. "${t}" given.`)}const t=["none","mouse","keyboard","character"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function p(e){try{if("object"!=typeof e){const t=typeof e;throw new TypeError(`Values given to isValidHoverType() must be inside of an object. "${t}" given.`)}const t=["off","on","dynamic"];for(const n in e)if(!t.includes(e[n]))throw new TypeError(`${n} must be one of the following values: ${t.join(", ")}. "${e[n]}" given.`);return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function m(e,t){if(u("string",{tagName:e}).status&&l(HTMLElement,t).status){const n=e.toLowerCase();let r=!0;for(const e in t)t[e].tagName.toLowerCase()!==n&&(r=!1);return r}return!1}class v{constructor({menuToggleElement:e,parentElement:t,controlledMenu:n,parentMenu:r=null}){i(this,"_dom",{toggle:null,parent:null}),i(this,"_elements",{controlledMenu:null,parentMenu:null}),i(this,"_open",!1),i(this,"_expandEvent",new CustomEvent("accessibleMenuExpand",{bubbles:!0,detail:{toggle:this}})),i(this,"_collapseEvent",new CustomEvent("accessibleMenuCollapse",{bubbles:!0,detail:{toggle:this}})),this._dom.toggle=e,this._dom.parent=t,this._elements.controlledMenu=n,this._elements.parentMenu=r}initialize(){this._setIds(),this._setAriaAttributes(),this._collapse(!1)}get dom(){return this._dom}get elements(){return this._elements}get isOpen(){return this._open}set isOpen(e){u("boolean",{value:e}),this._open=e}_setIds(){var e;if(""===this.dom.toggle.id||""===this.elements.controlledMenu.dom.menu.id){const t=Math.random().toString(36).replace(/[^a-z]+/g,"").substring(0,10);let n=(null==(e=this.dom.toggle.innerText)?void 0:e.replace(/[^a-zA-Z0-9\s]/g,""))||"",r=t;!n.replace(/\s/g,"").length&&this.dom.toggle.getAttribute("aria-label")&&(n=this.dom.toggle.getAttribute("aria-label").replace(/[^a-zA-Z0-9\s]/g,"")),n.replace(/\s/g,"").length>0&&(n=n.toLowerCase().replace(/\s+/g,"-"),n.startsWith("-")&&(n=n.substring(1)),n.endsWith("-")&&(n=n.slice(0,-1)),r=`${n}-${r}`),this.dom.toggle.id=this.dom.toggle.id||`menu-button-${r}`,this.elements.controlledMenu.dom.menu.id=this.elements.controlledMenu.dom.menu.id||`menu-${r}`}}_setAriaAttributes(){this.dom.toggle.setAttribute("aria-expanded","false"),this.elements.controlledMenu.dom.menu.setAttribute("aria-labelledby",this.dom.toggle.id)}_expand(e=!0){const{closeClass:t,openClass:n,transitionClass:r,openDuration:o}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","true"),this.elements.controlledMenu.elements.rootMenu.hasOpened=!0,""!==r?(s(r,this.elements.controlledMenu.dom.menu),requestAnimationFrame((()=>{a(t,this.elements.controlledMenu.dom.menu),requestAnimationFrame((()=>{s(n,this.elements.controlledMenu.dom.menu),requestAnimationFrame((()=>{setTimeout((()=>{a(r,this.elements.controlledMenu.dom.menu)}),o)}))}))}))):(s(n,this.elements.controlledMenu.dom.menu),a(t,this.elements.controlledMenu.dom.menu)),e&&this.dom.toggle.dispatchEvent(this._expandEvent)}_collapse(e=!0){const{closeClass:t,openClass:n,transitionClass:r,closeDuration:o}=this.elements.controlledMenu;this.dom.toggle.setAttribute("aria-expanded","false"),""!==r?(s(r,this.elements.controlledMenu.dom.menu),requestAnimationFrame((()=>{a(n,this.elements.controlledMenu.dom.menu),requestAnimationFrame((()=>{s(t,this.elements.controlledMenu.dom.menu),requestAnimationFrame((()=>{setTimeout((()=>{a(r,this.elements.controlledMenu.dom.menu)}),o)}))}))}))):(s(t,this.elements.controlledMenu.dom.menu),a(n,this.elements.controlledMenu.dom.menu)),e&&this.dom.toggle.dispatchEvent(this._collapseEvent)}open(){this.elements.controlledMenu.focusState="self",this.isOpen||(this._expand(),this.isOpen=!0)}preview(){this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this.isOpen||(this._expand(),this.isOpen=!0)}close(){this.isOpen&&(this.elements.controlledMenu.blur(),this.elements.parentMenu&&(this.elements.parentMenu.focusState="self"),this._collapse(),this.isOpen=!1)}toggle(){this.isOpen?this.close():this.open()}closeSiblings(){this.elements.parentMenu&&this.elements.parentMenu.elements.submenuToggles.forEach((e=>{e!==this&&e.close()}))}closeChildren(){this.elements.controlledMenu.elements.submenuToggles.forEach((e=>e.close()))}}class g{constructor({menuItemElement:e,menuLinkElement:t,parentMenu:n,isSubmenuItem:r=!1,childMenu:o=null,toggle:s=null}){i(this,"_dom",{item:null,link:null}),i(this,"_elements",{parentMenu:null,childMenu:null,toggle:null}),i(this,"_submenu",!1),this._dom.item=e,this._dom.link=t,this._elements.parentMenu=n,this._elements.childMenu=o,this._elements.toggle=s,this._submenu=r}initialize(){}get dom(){return this._dom}get elements(){return this._elements}get isSubmenuItem(){return this._submenu}focus(){this.elements.parentMenu.shouldFocus&&requestAnimationFrame((()=>{this.dom.link.focus()}))}blur(){this.elements.parentMenu.shouldFocus&&requestAnimationFrame((()=>{this.dom.link.blur()}))}}function y(e){try{const t=e.key||e.keyCode,n={Enter:"Enter"===t||13===t,Space:" "===t||"Spacebar"===t||32===t,Escape:"Escape"===t||"Esc"===t||27===t,ArrowUp:"ArrowUp"===t||"Up"===t||38===t,ArrowRight:"ArrowRight"===t||"Right"===t||39===t,ArrowDown:"ArrowDown"===t||"Down"===t||40===t,ArrowLeft:"ArrowLeft"===t||"Left"===t||37===t,Home:"Home"===t||36===t,End:"End"===t||35===t,Character:isNaN(t)&&!!t.match(/^[a-zA-Z]{1}$/),Tab:"Tab"===t||9===t,Asterisk:"*"===t||56===t};return Object.keys(n).find((e=>!0===n[e]))||""}catch{return""}}function b(e){e.preventDefault(),e.stopPropagation()}class _{constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:n="a",submenuItemSelector:r="li:has(ul)",submenuToggleSelector:o="a",submenuSelector:s="ul",controllerElement:a=null,containerElement:l=null,openClass:u="show",closeClass:c="hide",transitionClass:d="transitioning",transitionDuration:f=250,openDuration:h=-1,closeDuration:p=-1,isTopLevel:m=!0,parentMenu:y=null,hoverType:b="off",hoverDelay:E=250,enterDelay:w=-1,leaveDelay:S=-1,prefix:T="am-"}){i(this,"_MenuType",_),i(this,"_MenuItemType",g),i(this,"_MenuToggleType",v),i(this,"_dom",{menu:null,menuItems:[],submenuItems:[],submenuToggles:[],submenus:[],controller:null,container:null}),i(this,"_selectors",{menuItems:"",menuLinks:"",submenuItems:"",submenuToggles:"",submenus:""}),i(this,"_elements",{menuItems:[],submenuToggles:[],controller:null,parentMenu:null,rootMenu:null}),i(this,"_openClass","show"),i(this,"_closeClass","hide"),i(this,"_transitionClass","transitioning"),i(this,"_transitionDuration",250),i(this,"_openDuration",-1),i(this,"_closeDuration",-1),i(this,"_root",!0),i(this,"_currentChild",0),i(this,"_focusState","none"),i(this,"_currentEvent","none"),i(this,"_hoverType","off"),i(this,"_hoverDelay",250),i(this,"_enterDelay",-1),i(this,"_leaveDelay",-1),i(this,"_prefix","am-"),i(this,"_hoverTimeout",null),i(this,"_hasOpened",!1),i(this,"_errors",[]),this._dom.menu=e,this._dom.controller=a,this._dom.container=l,this._selectors.menuItems=t,this._selectors.menuLinks=n,this._selectors.submenuItems=r,this._selectors.submenuToggles=o,this._selectors.submenus=s,this._elements.menuItems=[],this._elements.submenuToggles=[],this._elements.controller=null,this._elements.parentMenu=y,this._elements.rootMenu=m?this:null,this._openClass=u||"",this._closeClass=c||"",this._transitionClass=d||"",this._transitionDuration=f,this._openDuration=h,this._closeDuration=p,this._prefix=T||"",this._root=m,this._hoverType=b,this._hoverDelay=E,this._enterDelay=w,this._leaveDelay=S}initialize(){if(!this._validate())throw new Error(`AccessibleMenu: cannot initialize menu. The following errors have been found:\n - ${this.errors.join("\n - ")}`);if(null===this.elements.rootMenu&&this._findRootMenu(this),this._setDOMElements(),this.isTopLevel&&this.dom.controller&&this.dom.container){const e=new this._MenuToggleType({menuToggleElement:this.dom.controller,parentElement:this.dom.container,controlledMenu:this});m("button",{toggle:e.dom.toggle})||e.dom.toggle.setAttribute("role","button"),e.dom.toggle.setAttribute("aria-controls",this.dom.menu.id),this._elements.controller=e}this._createChildElements(),this._setTransitionDurations(),this.isTopLevel&&(window.AccessibleMenu=window.AccessibleMenu||{menus:{}},window.AccessibleMenu.menus[this.dom.menu.id]=this)}get dom(){return this._dom}get selectors(){return this._selectors}get elements(){return this._elements}get isTopLevel(){return this._root}get openClass(){return this.isTopLevel?this._openClass:this.elements.rootMenu.openClass}get closeClass(){return this.isTopLevel?this._closeClass:this.elements.rootMenu.closeClass}get transitionClass(){return this.isTopLevel?this._transitionClass:this.elements.rootMenu.transitionClass}get transitionDuration(){return this.isTopLevel?this._transitionDuration:this.elements.rootMenu.transitionDuration}get openDuration(){return-1===this._openDuration?this.transitionDuration:this.isTopLevel?this._openDuration:this.elements.rootMenu.openDuration}get closeDuration(){return-1===this._closeDuration?this.transitionDuration:this.isTopLevel?this._closeDuration:this.elements.rootMenu.closeDuration}get currentChild(){return this._currentChild}get focusState(){return this._focusState}get currentEvent(){return this._currentEvent}get currentMenuItem(){return this.elements.menuItems[this.currentChild]}get hoverType(){return this._root?this._hoverType:this.elements.rootMenu.hoverType}get hoverDelay(){return this._root?this._hoverDelay:this.elements.rootMenu.hoverDelay}get enterDelay(){return-1===this._enterDelay?this.hoverDelay:this._root?this._enterDelay:this.elements.rootMenu.enterDelay}get leaveDelay(){return-1===this._leaveDelay?this.hoverDelay:this._root?this._leaveDelay:this.elements.rootMenu.leaveDelay}get prefix(){return this._root?this._prefix:this.elements.rootMenu.prefix}get shouldFocus(){let e=!1;return("keyboard"===this.currentEvent||"character"===this.currentEvent)&&(e=!0),"mouse"===this.currentEvent&&"dynamic"===this.hoverType&&(e=!0),e}get hasOpened(){return this._root?this._hasOpened:this.elements.rootMenu.hasOpened}get errors(){return this._errors}set openClass(e){d({openClass:e}),this._openClass!==e&&(this._openClass=e)}set closeClass(e){d({closeClass:e}),this._closeClass!==e&&(this._closeClass=e)}set transitionClass(e){d({transitionClass:e}),this._transitionClass!==e&&(this._transitionClass=e)}set transitionDuration(e){u("number",{value:e}),this._transitionDuration!==e&&(this._transitionDuration=e,this._setTransitionDurations())}set openDuration(e){u("number",{value:e}),this._openDuration!==e&&(this._openDuration=e,this._setTransitionDurations())}set closeDuration(e){u("number",{value:e}),this._closeDuration!==e&&(this._closeDuration=e,this._setTransitionDurations())}set currentChild(e){function t(e){if(["mouse","character"].includes(e.currentEvent)&&e.elements.parentMenu){let t=0,n=!1;for(;!n&&t=this.elements.menuItems.length?(this._currentChild=this.elements.menuItems.length-1,t(this)):this.focusChild!==e&&(this._currentChild=e,t(this))}set focusState(e){f({value:e}),this._focusState!==e&&(this._focusState=e),this.elements.submenuToggles.length>0&&("self"===e||"none"===e)&&this.elements.submenuToggles.forEach((e=>{e.elements.controlledMenu.focusState="none"})),this.elements.parentMenu&&("self"===e||"child"===e)&&(this.elements.parentMenu.focusState="child")}set currentEvent(e){h({value:e}),this._currentEvent!==e&&(this._currentEvent=e,this.elements.submenuToggles.length>0&&this.elements.submenuToggles.forEach((t=>{t.elements.controlledMenu.currentEvent=e})))}set hoverType(e){p({value:e}),this._hoverType!==e&&(this._hoverType=e)}set hoverDelay(e){u("number",{value:e}),this._hoverDelay!==e&&(this._hoverDelay=e)}set enterDelay(e){u("number",{value:e}),this._enterDelay!==e&&(this._enterDelay=e)}set leaveDelay(e){u("number",{value:e}),this._leaveDelay!==e&&(this._leaveDelay=e)}set prefix(e){u("string",{value:e}),this._prefix!==e&&(this._prefix=e)}set hasOpened(e){u("boolean",{value:e}),this._hasOpened!==e&&(this._hasOpened=e)}_validate(){let e,t,n=!0;if(e=null!==this._dom.container||null!==this._dom.controller?l(HTMLElement,{menuElement:this._dom.menu,controllerElement:this._dom.controller,containerElement:this._dom.container}):l(HTMLElement,{menuElement:this._dom.menu}),e.status||(this._errors.push(e.error.message),n=!1),t=""!==this._selectors.submenuItems?c({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks,submenuItemSelector:this._selectors.submenuItems,submenuToggleSelector:this._selectors.submenuToggles,submenuSelector:this._selectors.submenus}):c({menuItemSelector:this._selectors.menuItems,menuLinkSelector:this._selectors.menuLinks}),t.status||(this._errors.push(t.error.message),n=!1),""!==this._openClass){const e=d({openClass:this._openClass});e.status||(this._errors.push(e.error.message),n=!1)}if(""!==this._closeClass){const e=d({closeClass:this._closeClass});e.status||(this._errors.push(e.error.message),n=!1)}if(""!==this._transitionClass){const e=d({transitionClass:this._transitionClass});e.status||(this._errors.push(e.error.message),n=!1)}const r=u("number",{transitionDuration:this._transitionDuration});r.status||(this._errors.push(r.error.message),n=!1);const o=u("number",{openDuration:this._openDuration});o.status||(this._errors.push(o.error.message),n=!1);const i=u("number",{closeDuration:this._closeDuration});i.status||(this._errors.push(i.error.message),n=!1);const s=u("boolean",{isTopLevel:this._root});if(s.status||(this._errors.push(s.error.message),n=!1),null!==this._elements.parentMenu){const e=l(_,{parentMenu:this._elements.parentMenu});e.status||(this._errors.push(e.error.message),n=!1)}const a=p({hoverType:this._hoverType});a.status||(this._errors.push(a.error.message),n=!1);const f=u("number",{hoverDelay:this._hoverDelay});f.status||(this._errors.push(f.error.message),n=!1);const h=u("number",{enterDelay:this._enterDelay});h.status||(this._errors.push(h.error.message),n=!1);const m=u("number",{leaveDelay:this._leaveDelay});m.status||(this._errors.push(m.error.message),n=!1);const v=u("string",{prefix:this._prefix});return v.status||(this._errors.push(v.error.message),n=!1),n}_setDOMElementType(e,t=this.dom.menu,n=!0){if("string"!=typeof this.selectors[e])throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);{if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be set through _setDOMElementType.`);t!==this.dom.menu&&l(HTMLElement,{base:t});const r=Array.from(t.querySelectorAll(this.selectors[e])).filter((e=>e.parentElement===t));this._dom[e]=n?r:[...this._dom[e],...r]}}_resetDOMElementType(e){if(!(typeof this.dom[e]<"u"))throw new Error(`AccessibleMenu: "${e}" is not a valid element type within the menu.`);if(!Array.isArray(this.dom[e]))throw new Error(`AccessibleMenu: The "${e}" element cannot be reset through _resetDOMElementType.`);this._dom[e]=[]}_setDOMElements(){this._setDOMElementType("menuItems"),""!==this.selectors.submenuItems&&(this._setDOMElementType("submenuItems"),this._resetDOMElementType("submenuToggles"),this._resetDOMElementType("submenus"),this.dom.submenuItems.forEach((e=>{this._setDOMElementType("submenuToggles",e,!1),this._setDOMElementType("submenus",e,!1)})))}_findRootMenu(e){if(e.isTopLevel)this._elements.rootMenu=e;else{if(null===e.elements.parentMenu)throw new Error("Cannot find root menu.");this._findRootMenu(e.elements.parentMenu)}}_createChildElements(){this.dom.menuItems.forEach((e=>{let t;if(this.dom.submenuItems.includes(e)){const n=e.querySelector(this.selectors.submenuToggles),r=e.querySelector(this.selectors.submenus),o=new this._MenuType({menuElement:r,menuItemSelector:this.selectors.menuItems,menuLinkSelector:this.selectors.menuLinks,submenuItemSelector:this.selectors.submenuItems,submenuToggleSelector:this.selectors.submenuToggles,submenuSelector:this.selectors.submenus,openClass:this.openClass,closeClass:this.closeClass,transitionClass:this.transitionClass,transitionDuration:this.transitionDuration,openDuration:this.openDuration,closeDuration:this.closeDuration,isTopLevel:!1,parentMenu:this,hoverType:this.hoverType,hoverDelay:this.hoverDelay,enterDelay:this.enterDelay,leaveDelay:this.leaveDelay}),i=new this._MenuToggleType({menuToggleElement:n,parentElement:e,controlledMenu:o,parentMenu:this});this._elements.submenuToggles.push(i),t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this,isSubmenuItem:!0,childMenu:o,toggle:i})}else{const n=e.querySelector(this.selectors.menuLinks);t=new this._MenuItemType({menuItemElement:e,menuLinkElement:n,parentMenu:this})}this._elements.menuItems.push(t)}))}_clearTimeout(){clearTimeout(this._hoverTimeout)}_setTimeout(e,t){u("function",{callback:e}),u("number",{delay:t}),this._hoverTimeout=setTimeout(e,t)}_handleFocus(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("focus",(()=>{this.focusState="self",this.currentChild=t}))})),this.dom.menu.addEventListener("focusout",(e=>{"keyboard"!==this.currentEvent||null===e.relatedTarget||this.dom.menu.contains(e.relatedTarget)||(this.focusState="none",this.closeChildren())}))}_handleClick(){function e(e,t,n){b(n),0===n.button&&(t.toggle(),t.isOpen&&(e.focusState="self",t.elements.controlledMenu.focusState="none"))}this.elements.menuItems.forEach(((t,n)=>{t.dom.link.addEventListener("pointerdown",(()=>{this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this._clearTimeout(),this.focusChild(n)}),{passive:!0}),t.isSubmenuItem&&t.elements.toggle.dom.toggle.addEventListener("pointerup",(n=>{this.currentEvent="mouse",e(this,t.elements.toggle,n)}))})),this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("pointerup",(t=>{this.currentEvent="mouse",e(this,this.elements.controller,t)})),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(this.currentEvent="mouse",!this.dom.menu.contains(e.target)&&!this.dom.menu!==e.target&&(this.elements.rootMenu.hasOpened=this.elements.submenuToggles.some((e=>e.isOpen))))}))}_handleHover(){this.elements.menuItems.forEach(((e,t)=>{e.dom.link.addEventListener("pointerenter",(n=>{"pen"===n.pointerType||"touch"===n.pointerType||("on"===this.hoverType?(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusChild(t),e.isSubmenuItem&&(this.enterDelay>0?(this._clearTimeout(),this._setTimeout((()=>{e.elements.toggle.preview()}),this.enterDelay)):e.elements.toggle.preview())):"dynamic"===this.hoverType&&(this.currentChild=t,(!this.isTopLevel||"none"!==this.focusState)&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild()),(!this.isTopLevel||this.hasOpened)&&(this.currentEvent="mouse",this.elements.rootMenu.blurChildren(),this.focusCurrentChild(),e.isSubmenuItem?this.enterDelay>0?(this._clearTimeout(),this._setTimeout((()=>{e.elements.toggle.preview()}),this.enterDelay)):e.elements.toggle.preview():this.enterDelay>0?(this._clearTimeout(),this._setTimeout((()=>{this.closeChildren()}),this.enterDelay)):this.closeChildren())))})),e.isSubmenuItem&&(e.dom.item.addEventListener("pointerleave",(t=>{"pen"===t.pointerType||"touch"===t.pointerType||("on"===this.hoverType?this.leaveDelay>0?(this._clearTimeout(),this._setTimeout((()=>{this.currentEvent="mouse",e.elements.toggle.close()}),this.leaveDelay)):(this.currentEvent="mouse",e.elements.toggle.close()):"dynamic"===this.hoverType&&(this.leaveDelay>0?(this._clearTimeout(),this._setTimeout((()=>{this.currentEvent="mouse"}),this.leaveDelay)):this.currentEvent="mouse"))})),e.dom.item.addEventListener("pointerenter",(t=>{"pen"===t.pointerType||"touch"===t.pointerType||e.isSubmenuItem&&("on"===this.hoverType||"dynamic"===this.hoverType)&&this.leaveDelay>0&&this._clearTimeout()})))}))}_handleKeydown(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=y(e);("Space"===t||"Enter"===t)&&b(e)}))}_handleKeyup(){this.isTopLevel&&this.elements.controller&&this.elements.controller.dom.toggle.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=y(e);("Space"===t||"Enter"===t)&&(b(e),this.elements.controller.toggle(),this.elements.controller.isOpen&&this.focusFirstChild())}))}_setTransitionDurations(){this.dom.menu.style.setProperty(`--${this.prefix}transition-duration`,`${this.transitionDuration}ms`),this.dom.menu.style.setProperty(`--${this.prefix}open-transition-duration`,`${this.openDuration}ms`),this.dom.menu.style.setProperty(`--${this.prefix}close-transition-duration`,`${this.closeDuration}ms`)}focus(){this.focusState="self",this.shouldFocus&&this.dom.menu.focus()}blur(){this.focusState="none",this.shouldFocus&&this.dom.menu.blur()}focusCurrentChild(){this.focusState="self",-1!==this.currentChild&&this.currentMenuItem.focus()}focusChild(e){this.blurCurrentChild(),this.currentChild=e,this.focusCurrentChild()}focusFirstChild(){this.focusChild(0)}focusLastChild(){this.focusChild(this.elements.menuItems.length-1)}focusNextChild(){this.currentChild0?this.focusChild(this.currentChild-1):this.focusCurrentChild()}blurCurrentChild(){this.focusState="none",-1!==this.currentChild&&this.currentMenuItem.blur()}focusController(){this.dom.controller&&(this.shouldFocus&&this.dom.controller.focus(),this.focusState="none")}focusContainer(){this.dom.container&&(this.shouldFocus&&this.dom.container.focus(),this.focusState="none")}closeChildren(){this.elements.submenuToggles.forEach((e=>e.close()))}blurChildren(){this.elements.menuItems.forEach((e=>{e.blur(),e.isSubmenuItem&&e.elements.childMenu.blurChildren()}))}}class E extends g{constructor({menuItemElement:e,menuLinkElement:t,parentMenu:n,isSubmenuItem:r=!1,childMenu:o=null,toggle:i=null,initialize:s=!0}){super({menuItemElement:e,menuLinkElement:t,parentMenu:n,isSubmenuItem:r,childMenu:o,toggle:i}),s&&this.initialize()}}class w extends v{constructor({menuToggleElement:e,parentElement:t,controlledMenu:n,parentMenu:r=null,initialize:o=!0}){super({menuToggleElement:e,parentElement:t,controlledMenu:n,parentMenu:r}),o&&this.initialize()}_setAriaAttributes(){super._setAriaAttributes(),m("button",{toggle:this.dom.toggle})||this.dom.toggle.setAttribute("role","button"),this.dom.toggle.setAttribute("aria-controls",this.elements.controlledMenu.dom.menu.id)}open(){this.closeSiblings(),super.open()}preview(){this.closeSiblings(),super.preview()}close(){this.isOpen&&this.closeChildren(),super.close()}}class S extends _{constructor({menuElement:e,menuItemSelector:t="li",menuLinkSelector:n="a",submenuItemSelector:r="li:has(ul)",submenuToggleSelector:o="button",submenuSelector:s="ul",controllerElement:a=null,containerElement:l=null,openClass:u="show",closeClass:c="hide",transitionClass:d="transitioning",transitionDuration:f=250,openDuration:h=-1,closeDuration:p=-1,isTopLevel:m=!0,parentMenu:v=null,hoverType:g="off",hoverDelay:y=250,enterDelay:b=-1,leaveDelay:_=-1,optionalKeySupport:T=!1,prefix:C="am-",initialize:k=!0}){super({menuElement:e,menuItemSelector:t,menuLinkSelector:n,submenuItemSelector:r,submenuToggleSelector:o,submenuSelector:s,controllerElement:a,containerElement:l,openClass:u,closeClass:c,transitionClass:d,transitionDuration:f,openDuration:h,closeDuration:p,isTopLevel:m,parentMenu:v,hoverType:g,hoverDelay:y,enterDelay:b,leaveDelay:_,prefix:C}),i(this,"_MenuType",S),i(this,"_MenuItemType",E),i(this,"_MenuToggleType",w),i(this,"_currentChild",-1),i(this,"_optionalSupport",!1),this._optionalSupport=T,k&&this.initialize()}initialize(){try{super.initialize(),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup()}catch(e){console.error(e)}}get optionalKeySupport(){return this.isTopLevel?this._optionalSupport:this.elements.rootMenu.optionalKeySupport}set optionalKeySupport(e){u("boolean",{optionalKeySupport:e}),this._optionalSupport=e}_validate(){let e=super._validate();const t=u("boolean",{optionalKeySupport:this._optionalSupport});return t.status||(this._errors.push(t.error.message),e=!1),e}_handleClick(){super._handleClick(),document.addEventListener("pointerup",(e=>{"none"!==this.focusState&&(this.currentEvent="mouse",!this.dom.menu.contains(e.target)&&!this.dom.menu!==e.target&&(this.closeChildren(),this.blur(),this.elements.controller&&this.elements.controller.close(),this.elements.rootMenu.hasOpened=!1))}))}_handleKeydown(){super._handleKeydown(),this.dom.menu.addEventListener("keydown",(e=>{this.currentEvent="keyboard";const t=y(e);if("self"===this.focusState){const n=["Space","Enter"],r=["Escape"],o=["Escape"],i=["ArrowUp","ArrowRight","ArrowDown","ArrowLeft","Home","End"];(n.includes(t)||this.optionalKeySupport&&i.includes(t)||this.elements.controller&&r.includes(t)||this.elements.parentMenu&&o.includes(t))&&b(e)}}))}_handleKeyup(){super._handleKeyup(),this.dom.menu.addEventListener("keyup",(e=>{this.currentEvent="keyboard";const t=y(e);"self"===this.focusState&&("Space"===t||"Enter"===t?(b(e),this.currentMenuItem.isSubmenuItem?this.currentMenuItem.elements.toggle.isOpen?this.currentMenuItem.elements.toggle.close():this.currentMenuItem.elements.toggle.preview():this.currentMenuItem.dom.link.click()):"Escape"===t?this.elements.submenuToggles.some((e=>e.isOpen))?(b(e),this.closeChildren()):this.elements.parentMenu?(b(e),this.elements.parentMenu.currentEvent=this.currentEvent,this.elements.parentMenu.closeChildren(),this.elements.parentMenu.focusCurrentChild()):this.isTopLevel&&this.elements.controller&&this.elements.controller.isOpen&&(this.elements.controller.close(),this.focusController()):this.optionalKeySupport&&("ArrowDown"===t||"ArrowRight"===t?(b(e),this.currentMenuItem.isSubmenuItem&&this.currentMenuItem.elements.toggle.isOpen?(this.currentMenuItem.elements.childMenu.currentEvent="keyboard",this.currentMenuItem.elements.childMenu.focusFirstChild()):this.focusNextChild()):"ArrowUp"===t||"ArrowLeft"===t?(b(e),this.focusPreviousChild()):"Home"===t?(b(e),this.focusFirstChild()):"End"===t&&(b(e),this.focusLastChild())))}))}}},3999:function(e,t,n){"use strict";const r=n(560),o=(e,t,n)=>0!==r(e,t,n);e.exports=o},4055:function(e,t,n){"use strict";var r=n(4576),o=n(34),i=r.document,s=o(i)&&o(i.createElement);e.exports=function(e){return s?i.createElement(e):{}}},4089:function(e,t,n){"use strict";const r=n(560),o=(e,t,n)=>r(e,t,n)>=0;e.exports=o},4114:function(e,t,n){"use strict";var r=n(6518),o=n(8981),i=n(6198),s=n(4527),a=n(6837),l=n(9039),u=l((function(){return 4294967297!==[].push.call({length:4294967296},1)})),c=function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(e){return e instanceof TypeError}},d=u||!c();r({target:"Array",proto:!0,arity:1,forced:d},{push:function(e){var t=o(this),n=i(t),r=arguments.length;a(n+r);for(var l=0;l{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},s={};function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);nA});const d=(m={computed:()=>r.EW,createTextVNode:()=>r.eW,createVNode:()=>r.bF,defineComponent:()=>r.pM,reactive:()=>o.Kh,ref:()=>o.KR,watch:()=>r.wB,watchEffect:()=>r.nT},v={},i.d(v,m),v),f=(0,d.defineComponent)({props:{data:{required:!0,type:String},onClick:Function},render:function(){var e=this.data,t=this.onClick;return(0,d.createVNode)("span",{class:"vjs-tree-brackets",onClick:t},[e])}}),h=(0,d.defineComponent)({emits:["change","update:modelValue"],props:{checked:{type:Boolean,default:!1},isMultiple:Boolean,onChange:Function},setup:function(e,t){var n=t.emit;return{uiType:(0,d.computed)((function(){return e.isMultiple?"checkbox":"radio"})),model:(0,d.computed)({get:function(){return e.checked},set:function(e){return n("update:modelValue",e)}})}},render:function(){var e=this.uiType,t=this.model,n=this.$emit;return(0,d.createVNode)("label",{class:["vjs-check-controller",t?"is-checked":""],onClick:function(e){return e.stopPropagation()}},[(0,d.createVNode)("span",{class:"vjs-check-controller-inner is-".concat(e)},null),(0,d.createVNode)("input",{checked:t,class:"vjs-check-controller-original is-".concat(e),type:e,onChange:function(){return n("change",t)}},null)])}}),p=(0,d.defineComponent)({props:{nodeType:{required:!0,type:String},onClick:Function},render:function(){var e=this.nodeType,t=this.onClick,n="objectStart"===e||"arrayStart"===e;return n||"objectCollapsed"===e||"arrayCollapsed"===e?(0,d.createVNode)("span",{class:"vjs-carets vjs-carets-".concat(n?"open":"close"),onClick:t},[(0,d.createVNode)("svg",{viewBox:"0 0 1024 1024",focusable:"false","data-icon":"caret-down",width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},[(0,d.createVNode)("path",{d:"M840.4 300H183.6c-19.7 0-30.7 20.8-18.5 35l328.4 380.8c9.4 10.9 27.5 10.9 37 0L858.9 335c12.2-14.2 1.2-35-18.5-35z"},null)])]):null}});var m,v;function g(e){return g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},g(e)}function y(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"root",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3?arguments[3]:void 0,o=r||{},i=o.key,s=o.index,a=o.type,l=void 0===a?"content":a,u=o.showComma,c=void 0!==u&&u,d=o.length,f=void 0===d?1:d,h=y(e);if("array"===h){var p=_(e.map((function(e,r,o){return b(e,"".concat(t,"[").concat(r,"]"),n+1,{index:r,showComma:r!==o.length-1,length:f,type:l})})));return[b("[",t,n,{showComma:!1,key:i,length:e.length,type:"arrayStart"})[0]].concat(p,b("]",t,n,{showComma:c,length:e.length,type:"arrayEnd"})[0])}if("object"===h){var m=Object.keys(e),v=_(m.map((function(r,o,i){return b(e[r],/^[a-zA-Z_]\w*$/.test(r)?"".concat(t,".").concat(r):"".concat(t,'["').concat(r,'"]'),n+1,{key:r,showComma:o!==i.length-1,length:f,type:l})})));return[b("{",t,n,{showComma:!1,key:i,index:s,length:m.length,type:"objectStart"})[0]].concat(v,b("}",t,n,{showComma:c,length:m.length,type:"objectEnd"})[0])}return[{content:e,level:n,key:i,index:s,path:t,showComma:c,length:f,type:l}]}function _(e){if("function"==typeof Array.prototype.flat)return e.flat();for(var t=u(e),n=[];t.length;){var r=t.shift();Array.isArray(r)?t.unshift.apply(t,u(r)):n.push(r)}return n}function E(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakMap;if(null==e)return e;if(e instanceof Date)return new Date(e);if(e instanceof RegExp)return new RegExp(e);if("object"!==g(e))return e;if(t.get(e))return t.get(e);if(Array.isArray(e)){var n=e.map((function(e){return E(e,t)}));return t.set(e,n),n}var r={};for(var o in e)r[o]=E(e[o],t);return t.set(e,r),r}function w(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function S(e){for(var t=1;t=t||o.length>=n,a=null===(i=e.pathCollapsible)||void 0===i?void 0:i.call(e,o);return"objectStart"!==o.type&&"arrayStart"!==o.type||!s&&!a?r:O(O({},r),{},c({},o.path,1))}),{})},a=(0,d.reactive)({translateY:0,visibleData:null,hiddenPaths:s(e.deep,e.collapsedNodeLength)}),f=(0,d.computed)((function(){for(var e=null,t=[],n=i.value.length,r=0;rt.length?t.length-r:s;l<0&&(l=0);var u=l+r;a.translateY=l*e.itemHeight,a.visibleData=t.filter((function(e,t){return t>=l&&t{if(!e)return"";const o=new Date(e);return isNaN(o.getTime())?e:t?n?o.toLocaleString(r,{dateStyle:n,timeStyle:t}):o.toLocaleTimeString(r,{timeStyle:t}):o.toLocaleDateString(r,{dateStyle:n})}},4270:function(e,t,n){"use strict";var r=n(9565),o=n(4901),i=n(34),s=TypeError;e.exports=function(e,t){var n,a;if("string"===t&&o(n=e.toString)&&!i(a=r(n,e)))return a;if(o(n=e.valueOf)&&!i(a=r(n,e)))return a;if("string"!==t&&o(n=e.toString)&&!i(a=r(n,e)))return a;throw new s("Can't convert object to primitive value")}},4277:function(e,t,n){"use strict";const r=n(909),o=(e,t)=>e.sort(((e,n)=>r(n,e,t)));e.exports=o},4335:function(e,t,n){"use strict";n.d(t,{A:function(){return yn}});var r={};function o(e,t){return function(){return e.apply(t,arguments)}}n.r(r),n.d(r,{hasBrowserEnv:function(){return Fe},hasStandardBrowserEnv:function(){return je},hasStandardBrowserWebWorkerEnv:function(){return Ue},navigator:function(){return $e},origin:function(){return Be}});const{toString:i}=Object.prototype,{getPrototypeOf:s}=Object,{iterator:a,toStringTag:l}=Symbol,u=(e=>t=>{const n=i.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),c=e=>(e=e.toLowerCase(),t=>u(t)===e),d=e=>t=>typeof t===e,{isArray:f}=Array,h=d("undefined");function p(e){return null!==e&&!h(e)&&null!==e.constructor&&!h(e.constructor)&&y(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const m=c("ArrayBuffer");function v(e){let t;return t="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&m(e.buffer),t}const g=d("string"),y=d("function"),b=d("number"),_=e=>null!==e&&"object"===typeof e,E=e=>!0===e||!1===e,w=e=>{if("object"!==u(e))return!1;const t=s(e);return(null===t||t===Object.prototype||null===Object.getPrototypeOf(t))&&!(l in e)&&!(a in e)},S=c("Date"),T=c("File"),C=c("Blob"),k=c("FileList"),O=e=>_(e)&&y(e.pipe),A=e=>{let t;return e&&("function"===typeof FormData&&e instanceof FormData||y(e.append)&&("formdata"===(t=u(e))||"object"===t&&y(e.toString)&&"[object FormData]"===e.toString()))},R=c("URLSearchParams"),[I,L,N,x]=["ReadableStream","Request","Response","Headers"].map(c),P=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function M(e,t,{allOwnKeys:n=!1}={}){if(null===e||"undefined"===typeof e)return;let r,o;if("object"!==typeof e&&(e=[e]),f(e))for(r=0,o=e.length;r0)if(r=n[o],t===r.toLowerCase())return r;return null}const F=(()=>"undefined"!==typeof globalThis?globalThis:"undefined"!==typeof self?self:"undefined"!==typeof window?window:global)(),$=e=>!h(e)&&e!==F;function j(){const{caseless:e}=$(this)&&this||{},t={},n=(n,r)=>{const o=e&&D(t,r)||r;w(t[o])&&w(n)?t[o]=j(t[o],n):w(n)?t[o]=j({},n):f(n)?t[o]=n.slice():t[o]=n};for(let r=0,o=arguments.length;r(M(t,((t,r)=>{n&&y(t)?e[r]=o(t,n):e[r]=t}),{allOwnKeys:r}),e),B=e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),V=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},H=(e,t,n,r)=>{let o,i,a;const l={};if(t=t||{},null==e)return t;do{o=Object.getOwnPropertyNames(e),i=o.length;while(i-- >0)a=o[i],r&&!r(a,e,t)||l[a]||(t[a]=e[a],l[a]=!0);e=!1!==n&&s(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},W=(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},G=e=>{if(!e)return null;if(f(e))return e;let t=e.length;if(!b(t))return null;const n=new Array(t);while(t-- >0)n[t]=e[t];return n},X=(e=>t=>e&&t instanceof e)("undefined"!==typeof Uint8Array&&s(Uint8Array)),K=(e,t)=>{const n=e&&e[a],r=n.call(e);let o;while((o=r.next())&&!o.done){const n=o.value;t.call(e,n[0],n[1])}},q=(e,t)=>{let n;const r=[];while(null!==(n=e.exec(t)))r.push(n);return r},z=c("HTMLFormElement"),Y=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),Q=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),J=c("RegExp"),Z=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};M(n,((n,o)=>{let i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},ee=e=>{Z(e,((t,n)=>{if(y(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];y(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},te=(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return f(e)?r(e):r(String(e).split(t)),n},ne=()=>{},re=(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t;function oe(e){return!!(e&&y(e.append)&&"FormData"===e[l]&&e[a])}const ie=e=>{const t=new Array(10),n=(e,r)=>{if(_(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=f(e)?[]:{};return M(e,((e,t)=>{const i=n(e,r+1);!h(i)&&(o[t]=i)})),t[r]=void 0,o}}return e};return n(e,0)},se=c("AsyncFunction"),ae=e=>e&&(_(e)||y(e))&&y(e.then)&&y(e.catch),le=((e,t)=>e?setImmediate:t?((e,t)=>(F.addEventListener("message",(({source:n,data:r})=>{n===F&&r===e&&t.length&&t.shift()()}),!1),n=>{t.push(n),F.postMessage(e,"*")}))(`axios@${Math.random()}`,[]):e=>setTimeout(e))("function"===typeof setImmediate,y(F.postMessage)),ue="undefined"!==typeof queueMicrotask?queueMicrotask.bind(F):"undefined"!==typeof process&&process.nextTick||le,ce=e=>null!=e&&y(e[a]);var de={isArray:f,isArrayBuffer:m,isBuffer:p,isFormData:A,isArrayBufferView:v,isString:g,isNumber:b,isBoolean:E,isObject:_,isPlainObject:w,isReadableStream:I,isRequest:L,isResponse:N,isHeaders:x,isUndefined:h,isDate:S,isFile:T,isBlob:C,isRegExp:J,isFunction:y,isStream:O,isURLSearchParams:R,isTypedArray:X,isFileList:k,forEach:M,merge:j,extend:U,trim:P,stripBOM:B,inherits:V,toFlatObject:H,kindOf:u,kindOfTest:c,endsWith:W,toArray:G,forEachEntry:K,matchAll:q,isHTMLForm:z,hasOwnProperty:Q,hasOwnProp:Q,reduceDescriptors:Z,freezeMethods:ee,toObjectSet:te,toCamelCase:Y,noop:ne,toFiniteNumber:re,findKey:D,global:F,isContextDefined:$,isSpecCompliantForm:oe,toJSONObject:ie,isAsyncFn:se,isThenable:ae,setImmediate:le,asap:ue,isIterable:ce};function fe(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}de.inherits(fe,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:de.toJSONObject(this.config),code:this.code,status:this.status}}});const he=fe.prototype,pe={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{pe[e]={value:e}})),Object.defineProperties(fe,pe),Object.defineProperty(he,"isAxiosError",{value:!0}),fe.from=(e,t,n,r,o,i)=>{const s=Object.create(he);return de.toFlatObject(e,s,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),fe.call(s,e.message,t,n,r,o),s.cause=e,s.name=e.name,i&&Object.assign(s,i),s};var me=fe,ve=null;function ge(e){return de.isPlainObject(e)||de.isArray(e)}function ye(e){return de.endsWith(e,"[]")?e.slice(0,-2):e}function be(e,t,n){return e?e.concat(t).map((function(e,t){return e=ye(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}function _e(e){return de.isArray(e)&&!e.some(ge)}const Ee=de.toFlatObject(de,{},null,(function(e){return/^is[A-Z]/.test(e)}));function we(e,t,n){if(!de.isObject(e))throw new TypeError("target must be an object");t=t||new(ve||FormData),n=de.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!de.isUndefined(t[e])}));const r=n.metaTokens,o=n.visitor||c,i=n.dots,s=n.indexes,a=n.Blob||"undefined"!==typeof Blob&&Blob,l=a&&de.isSpecCompliantForm(t);if(!de.isFunction(o))throw new TypeError("visitor must be a function");function u(e){if(null===e)return"";if(de.isDate(e))return e.toISOString();if(!l&&de.isBlob(e))throw new me("Blob is not supported. Use a Buffer instead.");return de.isArrayBuffer(e)||de.isTypedArray(e)?l&&"function"===typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,n,o){let a=e;if(e&&!o&&"object"===typeof e)if(de.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(de.isArray(e)&&_e(e)||(de.isFileList(e)||de.endsWith(n,"[]"))&&(a=de.toArray(e)))return n=ye(n),a.forEach((function(e,r){!de.isUndefined(e)&&null!==e&&t.append(!0===s?be([n],r,i):null===s?n:n+"[]",u(e))})),!1;return!!ge(e)||(t.append(be(o,n,i),u(e)),!1)}const d=[],f=Object.assign(Ee,{defaultVisitor:c,convertValue:u,isVisitable:ge});function h(e,n){if(!de.isUndefined(e)){if(-1!==d.indexOf(e))throw Error("Circular reference detected in "+n.join("."));d.push(e),de.forEach(e,(function(e,r){const i=!(de.isUndefined(e)||null===e)&&o.call(t,e,de.isString(r)?r.trim():r,n,f);!0===i&&h(e,n?n.concat(r):[r])})),d.pop()}}if(!de.isObject(e))throw new TypeError("data must be an object");return h(e),t}var Se=we;function Te(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Ce(e,t){this._pairs=[],e&&Se(e,this,t)}const ke=Ce.prototype;ke.append=function(e,t){this._pairs.push([e,t])},ke.toString=function(e){const t=e?function(t){return e.call(this,t,Te)}:Te;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Oe=Ce;function Ae(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Re(e,t,n){if(!t)return e;const r=n&&n.encode||Ae;de.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let i;if(i=o?o(t,n):de.isURLSearchParams(t)?t.toString():new Oe(t,n).toString(r),i){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}class Ie{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){de.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}var Le=Ie,Ne={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},xe="undefined"!==typeof URLSearchParams?URLSearchParams:Oe,Pe="undefined"!==typeof FormData?FormData:null,Me="undefined"!==typeof Blob?Blob:null,De={isBrowser:!0,classes:{URLSearchParams:xe,FormData:Pe,Blob:Me},protocols:["http","https","file","blob","url","data"]};const Fe="undefined"!==typeof window&&"undefined"!==typeof document,$e="object"===typeof navigator&&navigator||void 0,je=Fe&&(!$e||["ReactNative","NativeScript","NS"].indexOf($e.product)<0),Ue=(()=>"undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"===typeof self.importScripts)(),Be=Fe&&window.location.href||"http://localhost";var Ve={...r,...De};function He(e,t){return Se(e,new Ve.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return Ve.isNode&&de.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}function We(e){return de.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}function Ge(e){const t={},n=Object.keys(e);let r;const o=n.length;let i;for(r=0;r=e.length;if(i=!i&&de.isArray(r)?r.length:i,a)return de.hasOwnProp(r,i)?r[i]=[r[i],n]:r[i]=n,!s;r[i]&&de.isObject(r[i])||(r[i]=[]);const l=t(e,n,r[i],o);return l&&de.isArray(r[i])&&(r[i]=Ge(r[i])),!s}if(de.isFormData(e)&&de.isFunction(e.entries)){const n={};return de.forEachEntry(e,((e,r)=>{t(We(e),r,n,0)})),n}return null}var Ke=Xe;function qe(e,t,n){if(de.isString(e))try{return(t||JSON.parse)(e),de.trim(e)}catch(r){if("SyntaxError"!==r.name)throw r}return(n||JSON.stringify)(e)}const ze={transitional:Ne,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=de.isObject(e);o&&de.isHTMLForm(e)&&(e=new FormData(e));const i=de.isFormData(e);if(i)return r?JSON.stringify(Ke(e)):e;if(de.isArrayBuffer(e)||de.isBuffer(e)||de.isStream(e)||de.isFile(e)||de.isBlob(e)||de.isReadableStream(e))return e;if(de.isArrayBufferView(e))return e.buffer;if(de.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let s;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return He(e,this.formSerializer).toString();if((s=de.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return Se(s?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),qe(e)):e}],transformResponse:[function(e){const t=this.transitional||ze.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(de.isResponse(e)||de.isReadableStream(e))return e;if(e&&de.isString(e)&&(n&&!this.responseType||r)){const n=t&&t.silentJSONParsing,i=!n&&r;try{return JSON.parse(e)}catch(o){if(i){if("SyntaxError"===o.name)throw me.from(o,me.ERR_BAD_RESPONSE,this,null,this.response);throw o}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ve.classes.FormData,Blob:Ve.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};de.forEach(["delete","get","head","post","put","patch"],(e=>{ze.headers[e]={}}));var Ye=ze;const Qe=de.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);var Je=e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&Qe[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t};const Ze=Symbol("internals");function et(e){return e&&String(e).trim().toLowerCase()}function tt(e){return!1===e||null==e?e:de.isArray(e)?e.map(tt):String(e)}function nt(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;while(r=n.exec(e))t[r[1]]=r[2];return t}const rt=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function ot(e,t,n,r,o){return de.isFunction(r)?r.call(this,t,n):(o&&(t=n),de.isString(t)?de.isString(r)?-1!==t.indexOf(r):de.isRegExp(r)?r.test(t):void 0:void 0)}function it(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}function st(e,t){const n=de.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}class at{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=et(t);if(!o)throw new Error("header name must be a non-empty string");const i=de.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=tt(e))}const i=(e,t)=>de.forEach(e,((e,n)=>o(e,n,t)));if(de.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(de.isString(e)&&(e=e.trim())&&!rt(e))i(Je(e),t);else if(de.isObject(e)&&de.isIterable(e)){let n,r,o={};for(const t of e){if(!de.isArray(t))throw TypeError("Object iterator must return a key-value pair");o[r=t[0]]=(n=o[r])?de.isArray(n)?[...n,t[1]]:[n,t[1]]:t[1]}i(o,t)}else null!=e&&o(t,e,n);return this}get(e,t){if(e=et(e),e){const n=de.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return nt(e);if(de.isFunction(t))return t.call(this,e,n);if(de.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=et(e),e){const n=de.findKey(this,e);return!(!n||void 0===this[n]||t&&!ot(this,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=et(e),e){const o=de.findKey(n,e);!o||t&&!ot(n,n[o],o,t)||(delete n[o],r=!0)}}return de.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;while(n--){const o=t[n];e&&!ot(this,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return de.forEach(this,((r,o)=>{const i=de.findKey(n,o);if(i)return t[i]=tt(r),void delete t[o];const s=e?it(o):String(o).trim();s!==o&&delete t[o],t[s]=tt(r),n[s]=!0})),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return de.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&de.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([e,t])=>e+": "+t)).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach((e=>n.set(e))),n}static accessor(e){const t=this[Ze]=this[Ze]={accessors:{}},n=t.accessors,r=this.prototype;function o(e){const t=et(e);n[t]||(st(r,e),n[t]=!0)}return de.isArray(e)?e.forEach(o):o(e),this}}at.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),de.reduceDescriptors(at.prototype,(({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}})),de.freezeMethods(at);var lt=at;function ut(e,t){const n=this||Ye,r=t||n,o=lt.from(r.headers);let i=r.data;return de.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function ct(e){return!(!e||!e.__CANCEL__)}function dt(e,t,n){me.call(this,null==e?"canceled":e,me.ERR_CANCELED,t,n),this.name="CanceledError"}de.inherits(dt,me,{__CANCEL__:!0});var ft=dt;function ht(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new me("Request failed with status code "+n.status,[me.ERR_BAD_REQUEST,me.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}function pt(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function mt(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,i=0,s=0;return t=void 0!==t?t:1e3,function(a){const l=Date.now(),u=r[s];o||(o=l),n[i]=a,r[i]=l;let c=s,d=0;while(c!==i)d+=n[c++],c%=e;if(i=(i+1)%e,i===s&&(s=(s+1)%e),l-o{o=i,n=null,r&&(clearTimeout(r),r=null),e.apply(null,t)},a=(...e)=>{const t=Date.now(),a=t-o;a>=i?s(e,t):(n=e,r||(r=setTimeout((()=>{r=null,s(n)}),i-a)))},l=()=>n&&s(n);return[a,l]}var yt=gt;const bt=(e,t,n=3)=>{let r=0;const o=vt(50,250);return yt((n=>{const i=n.loaded,s=n.lengthComputable?n.total:void 0,a=i-r,l=o(a),u=i<=s;r=i;const c={loaded:i,total:s,progress:s?i/s:void 0,bytes:a,rate:l||void 0,estimated:l&&s&&u?(s-i)/l:void 0,event:n,lengthComputable:null!=s,[t?"download":"upload"]:!0};e(c)}),n)},_t=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Et=e=>(...t)=>de.asap((()=>e(...t)));var wt=Ve.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,Ve.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(Ve.origin),Ve.navigator&&/(msie|trident)/i.test(Ve.navigator.userAgent)):()=>!0,St=Ve.hasStandardBrowserEnv?{write(e,t,n,r,o,i){const s=[e+"="+encodeURIComponent(t)];de.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),de.isString(r)&&s.push("path="+r),de.isString(o)&&s.push("domain="+o),!0===i&&s.push("secure"),document.cookie=s.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Tt(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Ct(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function kt(e,t,n){let r=!Tt(t);return e&&(r||0==n)?Ct(e,t):t}const Ot=e=>e instanceof lt?{...e}:e;function At(e,t){t=t||{};const n={};function r(e,t,n,r){return de.isPlainObject(e)&&de.isPlainObject(t)?de.merge.call({caseless:r},e,t):de.isPlainObject(t)?de.merge({},t):de.isArray(t)?t.slice():t}function o(e,t,n,o){return de.isUndefined(t)?de.isUndefined(e)?void 0:r(void 0,e,n,o):r(e,t,n,o)}function i(e,t){if(!de.isUndefined(t))return r(void 0,t)}function s(e,t){return de.isUndefined(t)?de.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function a(n,o,i){return i in t?r(n,o):i in e?r(void 0,n):void 0}const l={url:i,method:i,data:i,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,withXSRFToken:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a,headers:(e,t,n)=>o(Ot(e),Ot(t),n,!0)};return de.forEach(Object.keys(Object.assign({},e,t)),(function(r){const i=l[r]||o,s=i(e[r],t[r],r);de.isUndefined(s)&&i!==a||(n[r]=s)})),n}var Rt=e=>{const t=At({},e);let n,{data:r,withXSRFToken:o,xsrfHeaderName:i,xsrfCookieName:s,headers:a,auth:l}=t;if(t.headers=a=lt.from(a),t.url=Re(kt(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&a.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),de.isFormData(r))if(Ve.hasStandardBrowserEnv||Ve.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(!1!==(n=a.getContentType())){const[e,...t]=n?n.split(";").map((e=>e.trim())).filter(Boolean):[];a.setContentType([e||"multipart/form-data",...t].join("; "))}if(Ve.hasStandardBrowserEnv&&(o&&de.isFunction(o)&&(o=o(t)),o||!1!==o&&wt(t.url))){const e=i&&s&&St.read(s);e&&a.set(i,e)}return t};const It="undefined"!==typeof XMLHttpRequest;var Lt=It&&function(e){return new Promise((function(t,n){const r=Rt(e);let o=r.data;const i=lt.from(r.headers).normalize();let s,a,l,u,c,{responseType:d,onUploadProgress:f,onDownloadProgress:h}=r;function p(){u&&u(),c&&c(),r.cancelToken&&r.cancelToken.unsubscribe(s),r.signal&&r.signal.removeEventListener("abort",s)}let m=new XMLHttpRequest;function v(){if(!m)return;const r=lt.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders()),o=d&&"text"!==d&&"json"!==d?m.response:m.responseText,i={data:o,status:m.status,statusText:m.statusText,headers:r,config:e,request:m};ht((function(e){t(e),p()}),(function(e){n(e),p()}),i),m=null}m.open(r.method.toUpperCase(),r.url,!0),m.timeout=r.timeout,"onloadend"in m?m.onloadend=v:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(v)},m.onabort=function(){m&&(n(new me("Request aborted",me.ECONNABORTED,e,m)),m=null)},m.onerror=function(){n(new me("Network Error",me.ERR_NETWORK,e,m)),m=null},m.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const o=r.transitional||Ne;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new me(t,o.clarifyTimeoutError?me.ETIMEDOUT:me.ECONNABORTED,e,m)),m=null},void 0===o&&i.setContentType(null),"setRequestHeader"in m&&de.forEach(i.toJSON(),(function(e,t){m.setRequestHeader(t,e)})),de.isUndefined(r.withCredentials)||(m.withCredentials=!!r.withCredentials),d&&"json"!==d&&(m.responseType=r.responseType),h&&([l,c]=bt(h,!0),m.addEventListener("progress",l)),f&&m.upload&&([a,u]=bt(f),m.upload.addEventListener("progress",a),m.upload.addEventListener("loadend",u)),(r.cancelToken||r.signal)&&(s=t=>{m&&(n(!t||t.type?new ft(null,e,m):t),m.abort(),m=null)},r.cancelToken&&r.cancelToken.subscribe(s),r.signal&&(r.signal.aborted?s():r.signal.addEventListener("abort",s)));const g=pt(r.url);g&&-1===Ve.protocols.indexOf(g)?n(new me("Unsupported protocol "+g+":",me.ERR_BAD_REQUEST,e)):m.send(o||null)}))};const Nt=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n,r=new AbortController;const o=function(e){if(!n){n=!0,s();const t=e instanceof Error?e:this.reason;r.abort(t instanceof me?t:new ft(t instanceof Error?t.message:t))}};let i=t&&setTimeout((()=>{i=null,o(new me(`timeout ${t} of ms exceeded`,me.ETIMEDOUT))}),t);const s=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach((e=>{e.unsubscribe?e.unsubscribe(o):e.removeEventListener("abort",o)})),e=null)};e.forEach((e=>e.addEventListener("abort",o)));const{signal:a}=r;return a.unsubscribe=()=>de.asap(s),a}};var xt=Nt;const Pt=function*(e,t){let n=e.byteLength;if(!t||n{const o=Mt(e,t);let i,s=0,a=e=>{i||(i=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await o.next();if(t)return a(),void e.close();let i=r.byteLength;if(n){let e=s+=i;n(e)}e.enqueue(new Uint8Array(r))}catch(t){throw a(t),t}},cancel(e){return a(e),o.return()}},{highWaterMark:2})},$t="function"===typeof fetch&&"function"===typeof Request&&"function"===typeof Response,jt=$t&&"function"===typeof ReadableStream,Ut=$t&&("function"===typeof TextEncoder?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Bt=(e,...t)=>{try{return!!e(...t)}catch(n){return!1}},Vt=jt&&Bt((()=>{let e=!1;const t=new Request(Ve.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),Ht=65536,Wt=jt&&Bt((()=>de.isReadableStream(new Response("").body))),Gt={stream:Wt&&(e=>e.body)};$t&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach((t=>{!Gt[t]&&(Gt[t]=de.isFunction(e[t])?e=>e[t]():(e,n)=>{throw new me(`Response type '${t}' is not supported`,me.ERR_NOT_SUPPORT,n)})}))})(new Response);const Xt=async e=>{if(null==e)return 0;if(de.isBlob(e))return e.size;if(de.isSpecCompliantForm(e)){const t=new Request(Ve.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return de.isArrayBufferView(e)||de.isArrayBuffer(e)?e.byteLength:(de.isURLSearchParams(e)&&(e+=""),de.isString(e)?(await Ut(e)).byteLength:void 0)},Kt=async(e,t)=>{const n=de.toFiniteNumber(e.getContentLength());return null==n?Xt(t):n};var qt=$t&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:i,timeout:s,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:c,withCredentials:d="same-origin",fetchOptions:f}=Rt(e);u=u?(u+"").toLowerCase():"text";let h,p=xt([o,i&&i.toAbortSignal()],s);const m=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let v;try{if(l&&Vt&&"get"!==n&&"head"!==n&&0!==(v=await Kt(c,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(de.isFormData(r)&&(e=n.headers.get("content-type"))&&c.setContentType(e),n.body){const[e,t]=_t(v,bt(Et(l)));r=Ft(n.body,Ht,e,t)}}de.isString(d)||(d=d?"include":"omit");const o="credentials"in Request.prototype;h=new Request(t,{...f,signal:p,method:n.toUpperCase(),headers:c.normalize().toJSON(),body:r,duplex:"half",credentials:o?d:void 0});let i=await fetch(h);const s=Wt&&("stream"===u||"response"===u);if(Wt&&(a||s&&m)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=i[t]}));const t=de.toFiniteNumber(i.headers.get("content-length")),[n,r]=a&&_t(t,bt(Et(a),!0))||[];i=new Response(Ft(i.body,Ht,n,(()=>{r&&r(),m&&m()})),e)}u=u||"text";let g=await Gt[de.findKey(Gt,u)||"text"](i,e);return!s&&m&&m(),await new Promise(((t,n)=>{ht(t,n,{data:g,headers:lt.from(i.headers),status:i.status,statusText:i.statusText,config:e,request:h})}))}catch(g){if(m&&m(),g&&"TypeError"===g.name&&/Load failed|fetch/i.test(g.message))throw Object.assign(new me("Network Error",me.ERR_NETWORK,e,h),{cause:g.cause||g});throw me.from(g,g&&g.code,e,h)}});const zt={http:ve,xhr:Lt,fetch:qt};de.forEach(zt,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(n){}Object.defineProperty(e,"adapterName",{value:t})}}));const Yt=e=>`- ${e}`,Qt=e=>de.isFunction(e)||null===e||!1===e;var Jt={getAdapter:e=>{e=de.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let i=0;i`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build")));let n=t?e.length>1?"since :\n"+e.map(Yt).join("\n"):" "+Yt(e[0]):"as no adapter specified";throw new me("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return r},adapters:zt};function Zt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ft(null,e)}function en(e){Zt(e),e.headers=lt.from(e.headers),e.data=ut.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);const t=Jt.getAdapter(e.adapter||Ye.adapter);return t(e).then((function(t){return Zt(e),t.data=ut.call(e,e.transformResponse,t),t.headers=lt.from(t.headers),t}),(function(t){return ct(t)||(Zt(e),t&&t.response&&(t.response.data=ut.call(e,e.transformResponse,t.response),t.response.headers=lt.from(t.response.headers))),Promise.reject(t)}))}const tn="1.9.0",nn={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{nn[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const rn={};function on(e,t,n){if("object"!==typeof e)throw new me("options must be an object",me.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;while(o-- >0){const i=r[o],s=t[i];if(s){const t=e[i],n=void 0===t||s(t,i,e);if(!0!==n)throw new me("option "+i+" must be "+n,me.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new me("Unknown option "+i,me.ERR_BAD_OPTION)}}nn.transitional=function(e,t,n){function r(e,t){return"[Axios v"+tn+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,i)=>{if(!1===e)throw new me(r(o," has been removed"+(t?" in "+t:"")),me.ERR_DEPRECATED);return t&&!rn[o]&&(rn[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}},nn.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};var sn={assertOptions:on,validators:nn};const an=sn.validators;class ln{constructor(e){this.defaults=e||{},this.interceptors={request:new Le,response:new Le}}async request(e,t){try{return await this._request(e,t)}catch(n){if(n instanceof Error){let e={};Error.captureStackTrace?Error.captureStackTrace(e):e=new Error;const t=e.stack?e.stack.replace(/^.+\n/,""):"";try{n.stack?t&&!String(n.stack).endsWith(t.replace(/^.+\n.+\n/,""))&&(n.stack+="\n"+t):n.stack=t}catch(r){}}throw n}}_request(e,t){"string"===typeof e?(t=t||{},t.url=e):t=e||{},t=At(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&sn.assertOptions(n,{silentJSONParsing:an.transitional(an.boolean),forcedJSONParsing:an.transitional(an.boolean),clarifyTimeoutError:an.transitional(an.boolean)},!1),null!=r&&(de.isFunction(r)?t.paramsSerializer={serialize:r}:sn.assertOptions(r,{encode:an.function,serialize:an.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),sn.assertOptions(t,{baseUrl:an.spelling("baseURL"),withXsrfToken:an.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let i=o&&de.merge(o.common,o[t.method]);o&&de.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=lt.concat(i,o);const s=[];let a=!0;this.interceptors.request.forEach((function(e){"function"===typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));const l=[];let u;this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)}));let c,d=0;if(!a){const e=[en.bind(this),void 0];e.unshift.apply(e,s),e.push.apply(e,l),c=e.length,u=Promise.resolve(t);while(d{if(!n._listeners)return;let t=n._listeners.length;while(t-- >0)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new ft(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;const t=new cn((function(t){e=t}));return{token:t,cancel:e}}}var dn=cn;function fn(e){return function(t){return e.apply(null,t)}}function hn(e){return de.isObject(e)&&!0===e.isAxiosError}const pn={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(pn).forEach((([e,t])=>{pn[t]=e}));var mn=pn;function vn(e){const t=new un(e),n=o(un.prototype.request,t);return de.extend(n,un.prototype,t,{allOwnKeys:!0}),de.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return vn(At(e,t))},n}const gn=vn(Ye);gn.Axios=un,gn.CanceledError=ft,gn.CancelToken=dn,gn.isCancel=ct,gn.VERSION=tn,gn.toFormData=Se,gn.AxiosError=me,gn.Cancel=gn.CanceledError,gn.all=function(e){return Promise.all(e)},gn.spread=fn,gn.isAxiosError=hn,gn.mergeConfig=At,gn.AxiosHeaders=lt,gn.formToJSON=e=>Ke(de.isHTMLForm(e)?new FormData(e):e),gn.getAdapter=Jt.getAdapter,gn.HttpStatusCode=mn,gn.default=gn;var yn=gn},4376:function(e,t,n){"use strict";var r=n(2195);e.exports=Array.isArray||function(e){return"Array"===r(e)}},4493:function(e,t,n){"use strict";const r=n(3908),o=(e,t)=>new r(e,t).patch;e.exports=o},4495:function(e,t,n){"use strict";var r=n(9519),o=n(9039),i=n(4576),s=i.String;e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol("symbol detection");return!s(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},4527:function(e,t,n){"use strict";var r=n(3724),o=n(4376),i=TypeError,s=Object.getOwnPropertyDescriptor,a=r&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();e.exports=a?function(e,t){if(o(e)&&!s(e,"length").writable)throw new i("Cannot set read only .length");return e.length=t}:function(e,t){return e.length=t}},4549:function(e,t,n){"use strict";var r=n(4576);e.exports=function(e,t){var n=r.Iterator,o=n&&n.prototype,i=o&&o[e],s=!1;if(i)try{i.call({next:function(){return{done:!0}},return:function(){s=!0}},-1)}catch(a){a instanceof t||(s=!1)}if(!s)return i}},4576:function(e,t,n){"use strict";var r=function(e){return e&&e.Math===Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||r("object"==typeof this&&this)||function(){return this}()||Function("return this")()},4603:function(e,t,n){"use strict";var r=n(6840),o=n(9504),i=n(655),s=n(2812),a=URLSearchParams,l=a.prototype,u=o(l.append),c=o(l["delete"]),d=o(l.forEach),f=o([].push),h=new a("a=1&a=2&b=3");h["delete"]("a",1),h["delete"]("b",void 0),h+""!=="a=2"&&r(l,"delete",(function(e){var t=arguments.length,n=t<2?void 0:arguments[1];if(t&&void 0===n)return c(this,e);var r=[];d(this,(function(e,t){f(r,{key:t,value:e})})),s(t,1);var o,a=i(e),l=i(n),h=0,p=0,m=!1,v=r.length;while(h0===r(e,t,n);e.exports=o},4659:function(e,t,n){"use strict";var r=n(3724),o=n(4913),i=n(6980);e.exports=function(e,t,n){r?o.f(e,t,i(0,n)):e[t]=n}},4758:function(e,t,n){"use strict";n.d(t,{A:function(){return d}});var r=n(641),o=n(33);const i=["href","target","onClick"],s=["onClick"];function a(e,t,n,a,l,u){return(0,r.uX)(),(0,r.CE)("ul",{ref:"menu",class:(0,o.C4)(u.cssClass)},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.items,((e,t)=>((0,r.uX)(),(0,r.CE)("li",{key:t,class:"link-menu__item"},[e.href?((0,r.uX)(),(0,r.CE)("a",{key:0,class:(0,o.C4)(["link-menu__action",{"link-menu__action--active":e.active}]),href:e.href,target:e.target,onClick:t=>u.click(t,e)},(0,o.v_)(e.label),11,i)):((0,r.uX)(),(0,r.CE)("button",{key:1,class:(0,o.C4)(["link-menu__action",{"link-menu__action--active":e.active}]),onClick:t=>u.click(t,e)},(0,o.v_)(e.label),11,s))])))),128))],2)}var l={props:{items:{type:Array,required:!0},color:String,align:String,valign:String},computed:{cssClass:e=>({"link-menu":!0,[`link-menu--${e.color}`]:!!e.color,[`link-menu--align-${e.align}`]:!!e.align,[`link-menu--valign-${e.valign}`]:!!e.valign})},methods:{focus(){this.$refs.menu?.focus()},blur(){this.$refs.menu?.blur()},contains(e){return this.$refs.menu.contains(e)},click(e,t){t.action&&(e.preventDefault(),t.action(t))}}},u=n(6262);const c=(0,u.A)(l,[["render",a]]);var d=c},4901:function(e){"use strict";var t="object"==typeof document&&document.all;e.exports="undefined"==typeof t&&void 0!==t?function(e){return"function"==typeof e||e===t}:function(e){return"function"==typeof e}},4913:function(e,t,n){"use strict";var r=n(3724),o=n(5917),i=n(8686),s=n(8551),a=n(6969),l=TypeError,u=Object.defineProperty,c=Object.getOwnPropertyDescriptor,d="enumerable",f="configurable",h="writable";t.f=r?i?function(e,t,n){if(s(e),t=a(t),s(n),"function"===typeof e&&"prototype"===t&&"value"in n&&h in n&&!n[h]){var r=c(e,t);r&&r[h]&&(e[t]=n.value,n={configurable:f in n?n[f]:r[f],enumerable:d in n?n[d]:r[d],writable:!1})}return u(e,t,n)}:u:function(e,t,n){if(s(e),t=a(t),s(n),o)try{return u(e,t,n)}catch(r){}if("get"in n||"set"in n)throw new l("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},5031:function(e,t,n){"use strict";var r=n(7751),o=n(9504),i=n(8480),s=n(3717),a=n(8551),l=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(a(e)),n=s.f;return n?l(t,n(e)):t}},5032:function(e,t,n){"use strict";const r=n(8311),o=n(3904),{ANY:i}=o,s=n(7638),a=n(560),l=(e,t,n={})=>{if(e===t)return!0;e=new r(e,n),t=new r(t,n);let o=!1;e:for(const r of e.set){for(const e of t.set){const t=d(r,e,n);if(o=o||null!==t,t)continue e}if(o)return!1}return!0},u=[new o(">=0.0.0-0")],c=[new o(">=0.0.0")],d=(e,t,n)=>{if(e===t)return!0;if(1===e.length&&e[0].semver===i){if(1===t.length&&t[0].semver===i)return!0;e=n.includePrerelease?u:c}if(1===t.length&&t[0].semver===i){if(n.includePrerelease)return!0;t=c}const r=new Set;let o,l,d,p,m,v,g;for(const i of e)">"===i.operator||">="===i.operator?o=f(o,i,n):"<"===i.operator||"<="===i.operator?l=h(l,i,n):r.add(i.semver);if(r.size>1)return null;if(o&&l){if(d=a(o.semver,l.semver,n),d>0)return null;if(0===d&&(">="!==o.operator||"<="!==l.operator))return null}for(const i of r){if(o&&!s(i,String(o),n))return null;if(l&&!s(i,String(l),n))return null;for(const e of t)if(!s(i,String(e),n))return!1;return!0}let y=!(!l||n.includePrerelease||!l.semver.prerelease.length)&&l.semver,b=!(!o||n.includePrerelease||!o.semver.prerelease.length)&&o.semver;y&&1===y.prerelease.length&&"<"===l.operator&&0===y.prerelease[0]&&(y=!1);for(const i of t){if(g=g||">"===i.operator||">="===i.operator,v=v||"<"===i.operator||"<="===i.operator,o)if(b&&i.semver.prerelease&&i.semver.prerelease.length&&i.semver.major===b.major&&i.semver.minor===b.minor&&i.semver.patch===b.patch&&(b=!1),">"===i.operator||">="===i.operator){if(p=f(o,i,n),p===i&&p!==o)return!1}else if(">="===o.operator&&!s(o.semver,String(i),n))return!1;if(l)if(y&&i.semver.prerelease&&i.semver.prerelease.length&&i.semver.major===y.major&&i.semver.minor===y.minor&&i.semver.patch===y.patch&&(y=!1),"<"===i.operator||"<="===i.operator){if(m=h(l,i,n),m===i&&m!==l)return!1}else if("<="===l.operator&&!s(l.semver,String(i),n))return!1;if(!i.operator&&(l||o)&&0!==d)return!1}return!(o&&v&&!l&&0!==d)&&(!(l&&g&&!o&&0!==d)&&(!b&&!y))},f=(e,t,n)=>{if(!e)return t;const r=a(e.semver,t.semver,n);return r>0?e:r<0||">"===t.operator&&">="===e.operator?t:e},h=(e,t,n)=>{if(!e)return t;const r=a(e.semver,t.semver,n);return r<0?e:r>0||"<"===t.operator&&"<="===e.operator?t:e};e.exports=l},5200:function(e,t,n){"use strict";const r=n(560),o=(e,t,n)=>r(e,t,n)<=0;e.exports=o},5220:function(e,t,n){"use strict";n.d(t,{Bt:function(){return ue},aE:function(){return it}});var r=n(641),o=n(953); /*! * vue-router v4.5.1 * (c) 2025 Eduardo San Martin Morote * @license MIT */ const i="undefined"!==typeof document;function s(e){return"object"===typeof e||"displayName"in e||"props"in e||"__vccOpts"in e}function a(e){return e.__esModule||"Module"===e[Symbol.toStringTag]||e.default&&s(e.default)}const l=Object.assign;function u(e,t){const n={};for(const r in t){const o=t[r];n[r]=d(o)?o.map(e):e(o)}return n}const c=()=>{},d=Array.isArray;const f=/#/g,h=/&/g,p=/\//g,m=/=/g,v=/\?/g,g=/\+/g,y=/%5B/g,b=/%5D/g,_=/%5E/g,E=/%60/g,w=/%7B/g,S=/%7C/g,T=/%7D/g,C=/%20/g;function k(e){return encodeURI(""+e).replace(S,"|").replace(y,"[").replace(b,"]")}function O(e){return k(e).replace(w,"{").replace(T,"}").replace(_,"^")}function A(e){return k(e).replace(g,"%2B").replace(C,"+").replace(f,"%23").replace(h,"%26").replace(E,"`").replace(w,"{").replace(T,"}").replace(_,"^")}function R(e){return A(e).replace(m,"%3D")}function I(e){return k(e).replace(f,"%23").replace(v,"%3F")}function L(e){return null==e?"":I(e).replace(p,"%2F")}function N(e){try{return decodeURIComponent(""+e)}catch(t){}return""+e}const x=/\/$/,P=e=>e.replace(x,"");function M(e,t,n="/"){let r,o={},i="",s="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(r=t.slice(0,l),i=t.slice(l+1,a>-1?a:t.length),o=e(i)),a>-1&&(r=r||t.slice(0,a),s=t.slice(a,t.length)),r=H(null!=r?r:t,n),{fullPath:r+(i&&"?")+i+s,path:r,query:o,hash:N(s)}}function D(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function F(e,t){return t&&e.toLowerCase().startsWith(t.toLowerCase())?e.slice(t.length)||"/":e}function $(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&j(t.matched[r],n.matched[o])&&U(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function j(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function U(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!B(e[n],t[n]))return!1;return!0}function B(e,t){return d(e)?V(e,t):d(t)?V(t,e):e===t}function V(e,t){return d(t)?e.length===t.length&&e.every(((e,n)=>e===t[n])):1===e.length&&e[0]===t}function H(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];".."!==o&&"."!==o||r.push("");let i,s,a=n.length-1;for(i=0;i1&&a--}return n.slice(0,a).join("/")+"/"+r.slice(i).join("/")}const W={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var G,X;(function(e){e["pop"]="pop",e["push"]="push"})(G||(G={})),function(e){e["back"]="back",e["forward"]="forward",e["unknown"]=""}(X||(X={}));function K(e){if(!e)if(i){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return"/"!==e[0]&&"#"!==e[0]&&(e="/"+e),P(e)}const q=/^[^#]+#/;function z(e,t){return e.replace(q,"#")+t}function Y(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Q=()=>({left:window.scrollX,top:window.scrollY});function J(e){let t;if("el"in e){const n=e.el,r="string"===typeof n&&n.startsWith("#");0;const o="string"===typeof n?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=Y(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(null!=t.left?t.left:window.scrollX,null!=t.top?t.top:window.scrollY)}function Z(e,t){const n=history.state?history.state.position-t:-1;return n+e}const ee=new Map;function te(e,t){ee.set(e,t)}function ne(e){const t=ee.get(e);return ee.delete(e),t}let re=()=>location.protocol+"//"+location.host;function oe(e,t){const{pathname:n,search:r,hash:o}=t,i=e.indexOf("#");if(i>-1){let t=o.includes(e.slice(i))?e.slice(i).length:1,n=o.slice(t);return"/"!==n[0]&&(n="/"+n),F(n,"")}const s=F(n,e);return s+r+o}function ie(e,t,n,r){let o=[],i=[],s=null;const a=({state:i})=>{const a=oe(e,location),l=n.value,u=t.value;let c=0;if(i){if(n.value=a,t.value=i,s&&s===l)return void(s=null);c=u?i.position-u.position:0}else r(a);o.forEach((e=>{e(n.value,l,{delta:c,type:G.pop,direction:c?c>0?X.forward:X.back:X.unknown})}))};function u(){s=n.value}function c(e){o.push(e);const t=()=>{const t=o.indexOf(e);t>-1&&o.splice(t,1)};return i.push(t),t}function d(){const{history:e}=window;e.state&&e.replaceState(l({},e.state,{scroll:Q()}),"")}function f(){for(const e of i)e();i=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",d)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",d,{passive:!0}),{pauseListeners:u,listen:c,destroy:f}}function se(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Q():null}}function ae(e){const{history:t,location:n}=window,r={value:oe(e,n)},o={value:t.state};function i(r,i,s){const a=e.indexOf("#"),l=a>-1?(n.host&&document.querySelector("base")?e:e.slice(a))+r:re()+e+r;try{t[s?"replaceState":"pushState"](i,"",l),o.value=i}catch(u){console.error(u),n[s?"replace":"assign"](l)}}function s(e,n){const s=l({},t.state,se(o.value.back,e,o.value.forward,!0),n,{position:o.value.position});i(e,s,!0),r.value=e}function a(e,n){const s=l({},o.value,t.state,{forward:e,scroll:Q()});i(s.current,s,!0);const a=l({},se(r.value,e,null),{position:s.position+1},n);i(e,a,!1),r.value=e}return o.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0),{location:r,state:o,push:a,replace:s}}function le(e){e=K(e);const t=ae(e),n=ie(e,t.state,t.location,t.replace);function r(e,t=!0){t||n.pauseListeners(),history.go(e)}const o=l({location:"",base:e,go:r,createHref:z.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function ue(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),le(e)}function ce(e){return"string"===typeof e||e&&"object"===typeof e}function de(e){return"string"===typeof e||"symbol"===typeof e}const fe=Symbol("");var he;(function(e){e[e["aborted"]=4]="aborted",e[e["cancelled"]=8]="cancelled",e[e["duplicated"]=16]="duplicated"})(he||(he={}));function pe(e,t){return l(new Error,{type:e,[fe]:!0},t)}function me(e,t){return e instanceof Error&&fe in e&&(null==t||!!(e.type&t))}const ve="[^/]+?",ge={sensitive:!1,strict:!1,start:!0,end:!0},ye=/[.+*?^${}()[\]/\\]/g;function be(e,t){const n=l({},ge,t),r=[];let o=n.start?"^":"";const i=[];for(const l of e){const e=l.length?[]:[90];n.strict&&!l.length&&(o+="/");for(let t=0;tt.length?1===t.length&&80===t[0]?1:-1:0}function Ee(e,t){let n=0;const r=e.score,o=t.score;while(n0&&t[t.length-1]<0}const Se={type:0,value:""},Te=/[a-zA-Z0-9_]/;function Ce(e){if(!e)return[[]];if("/"===e)return[[Se]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(e){throw new Error(`ERR (${n})/"${u}": ${e}`)}let n=0,r=n;const o=[];let i;function s(){i&&o.push(i),i=[]}let a,l=0,u="",c="";function d(){u&&(0===n?i.push({type:0,value:u}):1===n||2===n||3===n?(i.length>1&&("*"===a||"+"===a)&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:u,regexp:c,repeatable:"*"===a||"+"===a,optional:"*"===a||"?"===a})):t("Invalid state to consume buffer"),u="")}function f(){u+=a}while(l{s(p)}:c}function s(e){if(de(e)){const t=r.get(e);t&&(r.delete(e),n.splice(n.indexOf(t),1),t.children.forEach(s),t.alias.forEach(s))}else{const t=n.indexOf(e);t>-1&&(n.splice(t,1),e.record.name&&r.delete(e.record.name),e.children.forEach(s),e.alias.forEach(s))}}function a(){return n}function u(e){const t=Pe(e,n);n.splice(t,0,e),e.record.name&&!Le(e)&&r.set(e.record.name,e)}function d(e,t){let o,i,s,a={};if("name"in e&&e.name){if(o=r.get(e.name),!o)throw pe(1,{location:e});0,s=o.record.name,a=l(Ae(t.params,o.keys.filter((e=>!e.optional)).concat(o.parent?o.parent.keys.filter((e=>e.optional)):[]).map((e=>e.name))),e.params&&Ae(e.params,o.keys.map((e=>e.name)))),i=o.stringify(a)}else if(null!=e.path)i=e.path,o=n.find((e=>e.re.test(i))),o&&(a=o.parse(i),s=o.record.name);else{if(o=t.name?r.get(t.name):n.find((e=>e.re.test(t.path))),!o)throw pe(1,{location:e,currentLocation:t});s=o.record.name,a=l({},t.params,e.params),i=o.stringify(a)}const u=[];let c=o;while(c)u.unshift(c.record),c=c.parent;return{name:s,path:i,params:a,matched:u,meta:Ne(u)}}function f(){n.length=0,r.clear()}return t=xe({strict:!1,end:!0,sensitive:!1},t),e.forEach((e=>i(e))),{addRoute:i,resolve:d,removeRoute:s,clearRoutes:f,getRoutes:a,getRecordMatcher:o}}function Ae(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Re(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:Ie(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function Ie(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]="object"===typeof n?n[r]:n;return t}function Le(e){while(e){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Ne(e){return e.reduce(((e,t)=>l(e,t.meta)),{})}function xe(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Pe(e,t){let n=0,r=t.length;while(n!==r){const o=n+r>>1,i=Ee(e,t[o]);i<0?r=o:n=o+1}const o=Me(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function Me(e){let t=e;while(t=t.parent)if(De(t)&&0===Ee(e,t))return t}function De({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Fe(e){const t={};if(""===e||"?"===e)return t;const n="?"===e[0],r=(n?e.slice(1):e).split("&");for(let o=0;oe&&A(e))):[r&&A(r)];o.forEach((e=>{void 0!==e&&(t+=(t.length?"&":"")+n,null!=e&&(t+="="+e))}))}return t}function je(e){const t={};for(const n in e){const r=e[n];void 0!==r&&(t[n]=d(r)?r.map((e=>null==e?null:""+e)):null==r?r:""+r)}return t}const Ue=Symbol(""),Be=Symbol(""),Ve=Symbol(""),He=Symbol(""),We=Symbol("");function Ge(){let e=[];function t(t){return e.push(t),()=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function Xe(e,t,n,r,o,i=e=>e()){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise(((a,l)=>{const u=e=>{!1===e?l(pe(4,{from:n,to:t})):e instanceof Error?l(e):ce(e)?l(pe(2,{from:t,to:e})):(s&&r.enterCallbacks[o]===s&&"function"===typeof e&&s.push(e),a())},c=i((()=>e.call(r&&r.instances[o],t,n,u)));let d=Promise.resolve(c);e.length<3&&(d=d.then(u)),d.catch((e=>l(e)))}))}function Ke(e,t,n,r,o=e=>e()){const i=[];for(const l of e){0;for(const e in l.components){let u=l.components[e];if("beforeRouteEnter"===t||l.instances[e])if(s(u)){const s=u.__vccOpts||u,a=s[t];a&&i.push(Xe(a,n,r,l,e,o))}else{let s=u();0,i.push((()=>s.then((i=>{if(!i)throw new Error(`Couldn't resolve component "${e}" at "${l.path}"`);const s=a(i)?i.default:i;l.mods[e]=i,l.components[e]=s;const u=s.__vccOpts||s,c=u[t];return c&&Xe(c,n,r,l,e,o)()}))))}}}return i}function qe(e){const t=(0,r.WQ)(Ve),n=(0,r.WQ)(He);const i=(0,r.EW)((()=>{const n=(0,o.R1)(e.to);return t.resolve(n)})),s=(0,r.EW)((()=>{const{matched:e}=i.value,{length:t}=e,r=e[t-1],o=n.matched;if(!r||!o.length)return-1;const s=o.findIndex(j.bind(null,r));if(s>-1)return s;const a=et(e[t-2]);return t>1&&et(r)===a&&o[o.length-1].path!==a?o.findIndex(j.bind(null,e[t-2])):s})),a=(0,r.EW)((()=>s.value>-1&&Ze(n.params,i.value.params))),l=(0,r.EW)((()=>s.value>-1&&s.value===n.matched.length-1&&U(n.params,i.value.params)));function u(n={}){if(Je(n)){const n=t[(0,o.R1)(e.replace)?"replace":"push"]((0,o.R1)(e.to)).catch(c);return e.viewTransition&&"undefined"!==typeof document&&"startViewTransition"in document&&document.startViewTransition((()=>n)),n}return Promise.resolve()}return{route:i,href:(0,r.EW)((()=>i.value.href)),isActive:a,isExactActive:l,navigate:u}}function ze(e){return 1===e.length?e[0]:e}const Ye=(0,r.pM)({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:qe,setup(e,{slots:t}){const n=(0,o.Kh)(qe(e)),{options:i}=(0,r.WQ)(Ve),s=(0,r.EW)((()=>({[tt(e.activeClass,i.linkActiveClass,"router-link-active")]:n.isActive,[tt(e.exactActiveClass,i.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive})));return()=>{const o=t.default&&ze(t.default(n));return e.custom?o:(0,r.h)("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},o)}}}),Qe=Ye;function Je(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(void 0===e.button||0===e.button)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function Ze(e,t){for(const n in t){const r=t[n],o=e[n];if("string"===typeof r){if(r!==o)return!1}else if(!d(o)||o.length!==r.length||r.some(((e,t)=>e!==o[t])))return!1}return!0}function et(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const tt=(e,t,n)=>null!=e?e:null!=t?t:n,nt=(0,r.pM)({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const i=(0,r.WQ)(We),s=(0,r.EW)((()=>e.route||i.value)),a=(0,r.WQ)(Be,0),u=(0,r.EW)((()=>{let e=(0,o.R1)(a);const{matched:t}=s.value;let n;while((n=t[e])&&!n.components)e++;return e})),c=(0,r.EW)((()=>s.value.matched[u.value]));(0,r.Gt)(Be,(0,r.EW)((()=>u.value+1))),(0,r.Gt)(Ue,c),(0,r.Gt)(We,s);const d=(0,o.KR)();return(0,r.wB)((()=>[d.value,c.value,e.name]),(([e,t,n],[r,o,i])=>{t&&(t.instances[n]=e,o&&o!==t&&e&&e===r&&(t.leaveGuards.size||(t.leaveGuards=o.leaveGuards),t.updateGuards.size||(t.updateGuards=o.updateGuards))),!e||!t||o&&j(t,o)&&r||(t.enterCallbacks[n]||[]).forEach((t=>t(e)))}),{flush:"post"}),()=>{const o=s.value,i=e.name,a=c.value,u=a&&a.components[i];if(!u)return rt(n.default,{Component:u,route:o});const f=a.props[i],h=f?!0===f?o.params:"function"===typeof f?f(o):f:null,p=e=>{e.component.isUnmounted&&(a.instances[i]=null)},m=(0,r.h)(u,l({},h,t,{onVnodeUnmounted:p,ref:d}));return rt(n.default,{Component:m,route:o})||m}}});function rt(e,t){if(!e)return null;const n=e(t);return 1===n.length?n[0]:n}const ot=nt;function it(e){const t=Oe(e.routes,e),n=e.parseQuery||Fe,s=e.stringifyQuery||$e,a=e.history;const f=Ge(),h=Ge(),p=Ge(),m=(0,o.IJ)(W);let v=W;i&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const g=u.bind(null,(e=>""+e)),y=u.bind(null,L),b=u.bind(null,N);function _(e,n){let r,o;return de(e)?(r=t.getRecordMatcher(e),o=n):o=e,t.addRoute(o,r)}function E(e){const n=t.getRecordMatcher(e);n&&t.removeRoute(n)}function w(){return t.getRoutes().map((e=>e.record))}function S(e){return!!t.getRecordMatcher(e)}function T(e,r){if(r=l({},r||m.value),"string"===typeof e){const o=M(n,e,r.path),i=t.resolve({path:o.path},r),s=a.createHref(o.fullPath);return l(o,i,{params:b(i.params),hash:N(o.hash),redirectedFrom:void 0,href:s})}let o;if(null!=e.path)o=l({},e,{path:M(n,e.path,r.path).path});else{const t=l({},e.params);for(const e in t)null==t[e]&&delete t[e];o=l({},e,{params:y(t)}),r.params=y(r.params)}const i=t.resolve(o,r),u=e.hash||"";i.params=g(b(i.params));const c=D(s,l({},e,{hash:O(u),path:i.path})),d=a.createHref(c);return l({fullPath:c,hash:u,query:s===$e?je(e.query):e.query||{}},i,{redirectedFrom:void 0,href:d})}function C(e){return"string"===typeof e?M(n,e,m.value.path):l({},e)}function k(e,t){if(v!==e)return pe(8,{from:t,to:e})}function A(e){return x(e)}function R(e){return A(l(C(e),{replace:!0}))}function I(e){const t=e.matched[e.matched.length-1];if(t&&t.redirect){const{redirect:n}=t;let r="function"===typeof n?n(e):n;return"string"===typeof r&&(r=r.includes("?")||r.includes("#")?r=C(r):{path:r},r.params={}),l({query:e.query,hash:e.hash,params:null!=r.path?{}:e.params},r)}}function x(e,t){const n=v=T(e),r=m.value,o=e.state,i=e.force,a=!0===e.replace,u=I(n);if(u)return x(l(C(u),{state:"object"===typeof u?l({},o,u.state):o,force:i,replace:a}),t||n);const c=n;let d;return c.redirectedFrom=t,!i&&$(s,r,n)&&(d=pe(16,{to:c,from:r}),re(r,r,!0,!1)),(d?Promise.resolve(d):j(c,r)).catch((e=>me(e)?me(e,2)?e:ee(e):z(e,c,r))).then((e=>{if(e){if(me(e,2))return x(l({replace:a},C(e.to),{state:"object"===typeof e.to?l({},o,e.to.state):o,force:i}),t||c)}else e=B(c,r,!0,a,o);return U(c,r,e),e}))}function P(e,t){const n=k(e,t);return n?Promise.reject(n):Promise.resolve()}function F(e){const t=se.values().next().value;return t&&"function"===typeof t.runWithContext?t.runWithContext(e):e()}function j(e,t){let n;const[r,o,i]=st(e,t);n=Ke(r.reverse(),"beforeRouteLeave",e,t);for(const a of r)a.leaveGuards.forEach((r=>{n.push(Xe(r,e,t))}));const s=P.bind(null,e,t);return n.push(s),le(n).then((()=>{n=[];for(const r of f.list())n.push(Xe(r,e,t));return n.push(s),le(n)})).then((()=>{n=Ke(o,"beforeRouteUpdate",e,t);for(const r of o)r.updateGuards.forEach((r=>{n.push(Xe(r,e,t))}));return n.push(s),le(n)})).then((()=>{n=[];for(const r of i)if(r.beforeEnter)if(d(r.beforeEnter))for(const o of r.beforeEnter)n.push(Xe(o,e,t));else n.push(Xe(r.beforeEnter,e,t));return n.push(s),le(n)})).then((()=>(e.matched.forEach((e=>e.enterCallbacks={})),n=Ke(i,"beforeRouteEnter",e,t,F),n.push(s),le(n)))).then((()=>{n=[];for(const r of h.list())n.push(Xe(r,e,t));return n.push(s),le(n)})).catch((e=>me(e,8)?e:Promise.reject(e)))}function U(e,t,n){p.list().forEach((r=>F((()=>r(e,t,n)))))}function B(e,t,n,r,o){const s=k(e,t);if(s)return s;const u=t===W,c=i?history.state:{};n&&(r||u?a.replace(e.fullPath,l({scroll:u&&c&&c.scroll},o)):a.push(e.fullPath,o)),m.value=e,re(e,t,n,u),ee()}let V;function H(){V||(V=a.listen(((e,t,n)=>{if(!ae.listening)return;const r=T(e),o=I(r);if(o)return void x(l(o,{replace:!0,force:!0}),r).catch(c);v=r;const s=m.value;i&&te(Z(s.fullPath,n.delta),Q()),j(r,s).catch((e=>me(e,12)?e:me(e,2)?(x(l(C(e.to),{force:!0}),r).then((e=>{me(e,20)&&!n.delta&&n.type===G.pop&&a.go(-1,!1)})).catch(c),Promise.reject()):(n.delta&&a.go(-n.delta,!1),z(e,r,s)))).then((e=>{e=e||B(r,s,!1),e&&(n.delta&&!me(e,8)?a.go(-n.delta,!1):n.type===G.pop&&me(e,20)&&a.go(-1,!1)),U(r,s,e)})).catch(c)})))}let X,K=Ge(),q=Ge();function z(e,t,n){ee(e);const r=q.list();return r.length?r.forEach((r=>r(e,t,n))):console.error(e),Promise.reject(e)}function Y(){return X&&m.value!==W?Promise.resolve():new Promise(((e,t)=>{K.add([e,t])}))}function ee(e){return X||(X=!e,H(),K.list().forEach((([t,n])=>e?n(e):t())),K.reset()),e}function re(t,n,o,s){const{scrollBehavior:a}=e;if(!i||!a)return Promise.resolve();const l=!o&&ne(Z(t.fullPath,0))||(s||!o)&&history.state&&history.state.scroll||null;return(0,r.dY)().then((()=>a(t,n,l))).then((e=>e&&J(e))).catch((e=>z(e,t,n)))}const oe=e=>a.go(e);let ie;const se=new Set,ae={currentRoute:m,listening:!0,addRoute:_,removeRoute:E,clearRoutes:t.clearRoutes,hasRoute:S,getRoutes:w,resolve:T,options:e,push:A,replace:R,go:oe,back:()=>oe(-1),forward:()=>oe(1),beforeEach:f.add,beforeResolve:h.add,afterEach:p.add,onError:q.add,isReady:Y,install(e){const t=this;e.component("RouterLink",Qe),e.component("RouterView",ot),e.config.globalProperties.$router=t,Object.defineProperty(e.config.globalProperties,"$route",{enumerable:!0,get:()=>(0,o.R1)(m)}),i&&!ie&&m.value===W&&(ie=!0,A(a.location).catch((e=>{0})));const n={};for(const o in W)Object.defineProperty(n,o,{get:()=>m.value[o],enumerable:!0});e.provide(Ve,t),e.provide(He,(0,o.Gc)(n)),e.provide(We,m);const r=e.unmount;se.add(e),e.unmount=function(){se.delete(e),se.size<1&&(v=W,V&&V(),V=null,m.value=W,ie=!1,X=!1),r()}}};function le(e){return e.reduce(((e,t)=>e.then((()=>F(t)))),Promise.resolve())}return ae}function st(e,t){const n=[],r=[],o=[],i=Math.max(t.matched.length,e.matched.length);for(let s=0;sj(e,i)))?r.push(i):n.push(i));const a=e.matched[s];a&&(t.matched.find((e=>j(e,a)))||o.push(a))}return[n,r,o]}},5342:function(e,t,n){"use strict";const r=n(7075),o=(e,t,n)=>r(e,t,"<",n);e.exports=o},5397:function(e,t,n){"use strict";var r=n(7055),o=n(7750);e.exports=function(e){return r(o(e))}},5571:function(e,t,n){"use strict";const r=n(7075),o=(e,t,n)=>r(e,t,">",n);e.exports=o},5580:function(e,t,n){"use strict";const r=n(560),o=(e,t,n)=>r(e,t,n)>0;e.exports=o},5610:function(e,t,n){"use strict";var r=n(1291),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},5633:function(e,t,n){"use strict";n.d(t,{Bx:function(){return Re},Eg:function(){return At},FD:function(){return ne},VC:function(){return O}});var r=n(953),o=n(641),i=n(33),s=n(3751),a=Object.defineProperty,l=Object.defineProperties,u=Object.getOwnPropertyDescriptors,c=Object.getOwnPropertySymbols,d=Object.prototype.hasOwnProperty,f=Object.prototype.propertyIsEnumerable,h=(e,t,n)=>t in e?a(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,p=(e,t)=>{for(var n in t||(t={}))d.call(t,n)&&h(e,n,t[n]);if(c)for(var n of c(t))f.call(t,n)&&h(e,n,t[n]);return e},m=(e,t)=>l(e,u(t)),v=(e,t)=>{var n={};for(var r in e)d.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&c)for(var r of c(e))t.indexOf(r)<0&&f.call(e,r)&&(n[r]=e[r]);return n};const g="Notivue__",y=6e3,b={SUCCESS:"success",ERROR:"error",WARNING:"warning",INFO:"info",PROMISE:"promise",PROMISE_RESOLVE:"promise-resolve",PROMISE_REJECT:"promise-reject"},_={title:"",message:"",duration:y,ariaLive:"polite",ariaRole:"status"},E=m(p({},_),{ariaLive:"assertive",ariaRole:"alert"}),w=m(p({},_),{duration:1/0}),S=m(p({},E),{ariaLive:"polite"}),T=p({},_),C={[b.SUCCESS]:_,[b.ERROR]:E,[b.WARNING]:S,[b.INFO]:T,[b.PROMISE]:w,[b.PROMISE_RESOLVE]:_,[b.PROMISE_REJECT]:E},k={pauseOnHover:!0,pauseOnTouch:!0,pauseOnTabChange:!0,enqueue:!1,position:"top-center",teleportTo:"body",notifications:C,limit:1/0,avoidDuplicates:!1,transition:"transform 0.35s cubic-bezier(0.5, 1, 0.25, 1)",animations:{enter:g+"enter",leave:g+"leave",clearAll:g+"clearAll"}},O=I();function A(e){Object.assign(O,e)}function R(e){let t=0;function n(n,o,i=""+t++){return"string"===typeof(0,r.R1)(n)&&(n={message:n}),e.push(m(p({},n),{id:i,type:o})),{id:i,clear:()=>e.clear(i),destroy:()=>e.clear(i,{isDestroy:!0})}}return{success:e=>n(e,b.SUCCESS),error:e=>n(e,b.ERROR),warning:e=>n(e,b.WARNING),info:e=>n(e,b.INFO),promise:e=>{const{id:t,clear:r,destroy:o}=n(e,b.PROMISE);return{resolve:e=>n(e,b.PROMISE_RESOLVE,t),reject:e=>n(e,b.PROMISE_REJECT,t),success:e=>n(e,b.PROMISE_RESOLVE,t),error:e=>n(e,b.PROMISE_REJECT,t),clear:r,destroy:o}},load(e){return this.promise(e)},clearAll:()=>e.clearAll(),destroyAll:()=>e.destroyAll()}}function I(){const e=new Proxy({},{get:()=>()=>{}});return R(e)}const L="undefined"===typeof window;function N(e,t){const n=p({},e);for(const r in t)t.hasOwnProperty(r)&&(P(t[r])?n[r]=N(e[r],t[r]):n[r]=t[r]);return n}function x(e,t){return t.props||(t.props={}),p(p(p(p({},e[t.type]),e.global),t),"promise"===t.type?{duration:1/0}:{})}function P(e){if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||null===Object.getPrototypeOf(t)}function M(e,t,n){const o=N(e,t);function i(e){return(0,r.rY)(((t,r)=>({get(){return t(),e},set(t){n.value&&(e=t,r())}})))}for(const r in o)o[r]=i(o[r]);return o}function D(e){return Object.entries(e).reduce(((e,[t,{value:n}])=>m(p({},e),{[t]:(0,r.ux)(n)})),{})}const F=e=>e===b.SUCCESS||e===b.ERROR||e===b.WARNING||e===b.INFO,$=["timeout","resumedAt","remaining","animationAttrs","positionStyles"];function j(e){return Object.fromEntries(Object.entries(e).filter((([e])=>!$.includes(e))))}let U=()=>{};function B(e,t){const n=V(e,t),r=H(),o=W(n,r),i=G(),s=X(n,o,r,i),a=K(o,s);return{config:n,queue:r,items:o,elements:i,animations:s,timeouts:a}}function V(e,t){const n=M(k,e,t);function r(e){if(t.value){"function"===typeof e&&(e=e(D(n)));for(const t in e)"object"===typeof n[t].value?n[t].value=N(n[t].value,e[t]):n[t].value=e[t]}}return U=r,m(p({},n),{update:r})}function H(){return{entries:(0,r.IJ)([]),get length(){return this.entries.value.length},add(e){this.entries.value.push(e),this.triggerRef()},get(e){return this.entries.value.find((t=>t.id===e))},update(e,t){const n=this.get(e);n&&Object.assign(n,t)},remove(e){this.entries.value=this.entries.value.filter((t=>t.id!==e))},triggerRef(){(0,r.mu)(this.entries)},clear(){this.entries.value=[]}}}function W(e,t){return{entries:(0,r.IJ)([]),get length(){return this.entries.value.length},lifecycleEventsCount:(0,r.KR)(0),addLifecycleEvent(){this.lifecycleEventsCount.value++},clearLifecycleEvents(){this.lifecycleEventsCount.value=0},add(e){this.entries.value.unshift(e),this.triggerRef(),this.addLifecycleEvent()},addFromQueue(){const e=m(p({},t.entries.value[0]),{timeout:t.entries.value[0].timeout(),createdAt:Date.now()});t.remove(e.id),this.add(e)},findDupe(e){return this.entries.value.find((t=>(0,r.R1)(t.message).replace(/\uFEFF/g,"")===(0,r.R1)(e.message).replace(/\uFEFF/g,"")&&(0,r.R1)(t.title)===(0,r.R1)(e.title)&&t.type===e.type))},get(e){return this.entries.value.find((t=>t.id===e))},update(e,t){const n=this.get(e);n&&Object.assign(n,t)},triggerRef(){(0,r.mu)(this.entries)},updateAll(e){this.entries.value=this.entries.value.map(e)},remove(n){this.entries.value=this.entries.value.filter((e=>e.id!==n));const r=t.length>0&&this.length+t.dataset.notivueItem-+e.dataset.notivueItem))},containers:(0,r.KR)([])}}function X(e,t,n,o){return{isReducedMotion:(0,r.KR)(!1),setReducedMotion(e){this.isReducedMotion.value=e},playLeave(n,{isDestroy:r=!1,isUserTriggered:o=!1}={}){const{leave:i=""}=e.animations.value,s=t.get(n);window.clearTimeout(null==s?void 0:s.timeout);const a=e=>{var r;e&&e.currentTarget!==e.target||(null==(r=null==s?void 0:s[o?"onManualClear":"onAutoClear"])||r.call(s,j(s)),t.remove(n))};if(!s||!i||r||this.isReducedMotion.value)return t.addLifecycleEvent(),a();t.update(n,{positionStyles:m(p({},s.positionStyles),{zIndex:-1}),animationAttrs:{class:i,onAnimationend:a}}),t.addLifecycleEvent()},playClearAll(){t.entries.value.forEach((e=>window.clearTimeout(e.timeout)));const{clearAll:r=""}=e.animations.value,i=()=>{n.clear(),t.clear()};if(!r||this.isReducedMotion.value)return i();o.setRootAttrs({class:r,onAnimationend:i})},updatePositions({isImmediate:n=!1}={}){const r=this.isReducedMotion.value||n,i=0===e.position.value.indexOf("top"),s=e.animations.value.leave;let a=0;for(const l of o.getSortedItems()){const n=l.dataset.notivueItem,o=t.get(n);l&&o&&o.animationAttrs.class!==s&&(t.update(n,{positionStyles:{transform:`translate3d(0, ${a}px, 0)`,transition:r?"none":e.transition.value}}),a+=(i?1:-1)*l.clientHeight)}t.triggerRef()}}}function K(e,t){return{isStreamPaused:(0,r.KR)(!1),isStreamFocused:(0,r.KR)(!1),debounceTimeout:void 0,setStreamPause(e=!0){this.isStreamPaused.value=e},setStreamFocus(e=!0){this.isStreamFocused.value=e},clearDebounceTimeout(){window.clearTimeout(this.debounceTimeout)},reset(){this.clearDebounceTimeout(),this.setStreamPause(!1),this.setStreamFocus(!1)},create(e,n){if(!this.isStreamPaused.value)return Number.isFinite(n)&&n>0?window.setTimeout((()=>t.playLeave(e)),n):void 0},pause(){0===e.length||this.isStreamPaused.value||(this.setStreamPause(),e.updateAll((e=>{var t;if(window.clearTimeout(e.timeout),e.duration===1/0)return e;let n=0;return n=null==e.remaining?e.duration-(Date.now()-(null!=(t=e.resumedAt)?t:e.createdAt)):e.remaining-(Date.now()-e.resumedAt),m(p({},e),{remaining:n})})))},resume(){0!==e.length&&this.isStreamPaused.value&&(this.setStreamPause(!1),e.updateAll((e=>{var t;return window.clearTimeout(e.timeout),e.duration===1/0?e:m(p({},e),{timeout:this.create(e.id,null!=(t=e.remaining)?t:e.duration),resumedAt:Date.now()})})))},resumeWithDebounce(e){this.debounceTimeout=window.setTimeout((()=>{this.resume()}),e)}}}function q({config:e,items:t,queue:n,animations:o,timeouts:i}){return{destroyAll(){n.clear(),t.clear()},clearAll(){o.playClearAll()},clear(e,{isDestroy:n=!1}={}){var r;const s=(null==(r=t.entries.value[t.entries.value.length-1])?void 0:r.id)===e;s&&i.resume(),o.playLeave(e,{isUserTriggered:!0,isDestroy:n})},push(s){const a=x(e.notifications.value,s),l=Date.now();if(e.avoidDuplicates.value&&F(a.type)){const e=t.findDupe(a);e&&(window.clearTimeout(e.timeout),t.update(e.id,{createdAt:l,duration:a.duration,remaining:void 0,timeout:i.create(e.id,a.duration),duplicateCount:e.duplicateCount+1}),(0,r.i9)(e.message)?e.message.value+="\ufeff":e.message+="\ufeff",t.triggerRef());const o=t.findDupe.call(n,a);if(o&&(n.update(o.id,{duration:a.duration,createdAt:l,duplicateCount:o.duplicateCount+1}),n.triggerRef()),o||e)return}const u=()=>i.create(a.id,a.duration);if(s.type===b.PROMISE_RESOLVE||s.type===b.PROMISE_REJECT)n.get(a.id)?(n.update(a.id,m(p({},a),{createdAt:l,timeout:u})),n.triggerRef()):(t.update(a.id,m(p({},a),{createdAt:l,timeout:u()})),t.triggerRef());else{const r=e.enqueue.value,c=t.length>=e.limit.value,d=!r&&c,f=r&&!s.skipQueue&&c;d&&t.entries.value.slice(e.limit.value-1).forEach((e=>i.create(e.id,1)));const h=m(p({},a),{createdAt:l,duplicateCount:0,animationAttrs:{class:o.isReducedMotion.value?"":e.animations.value.enter,onAnimationend(){h.animationAttrs.class===e.animations.value.enter&&t.update(a.id,{animationAttrs:{class:"",onAnimationend:()=>{}}})}},timeout:f?u:u(),clear:()=>this.clear(a.id),destroy:()=>this.clear(a.id,{isDestroy:!0})});f?n.add(h):t.add(h)}}}}const z=Symbol(),Y=Symbol();function Q(e){return[(0,o.wB)(e.items.lifecycleEventsCount,(()=>{e.animations.updatePositions()}),{flush:"post"}),(0,o.wB)(e.config.position,(()=>{e.animations.updatePositions({isImmediate:!0})}),{flush:"post"}),(0,o.wB)((()=>0===e.items.length&&0===e.queue.length),(t=>{t&&(e.timeouts.reset(),e.elements.setRootAttrs({}))}),{flush:"post"})]}let J=()=>{},Z=()=>{};function ee(e){const t=(0,r.KR)(e),n=(0,r.tB)(t);function o(r,o){const i=()=>Q(r);e&&A(o);let s=e?i():[()=>{}];const a={isRunning:n,startInstance(){t.value||(A(o),s=i(),t.value=!0)},stopInstance(){t.value&&(r.items.clear(),r.queue.clear(),r.items.clearLifecycleEvents(),A(I()),s.forEach((e=>e())),t.value=!1)}};return J=()=>a.startInstance(),Z=()=>a.stopInstance(),a}return{isRunning:n,setupInstance:o}}function te(e,t){const{setupInstance:n,isRunning:r}=ee(e),o=B(t,r),i=q(o),s=Object.freeze(R(i)),a=n(o,s);return{store:o,instance:a,push:s}}function ne(e={}){return{install(t){var n;const r=e,{startOnCreation:o=!0}=r,i=v(r,["startOnCreation"]),{store:s,instance:a,push:l}=te(o,i);t.provide(z,a),t.provide(Y,s),(n=t.config.globalProperties).$push||(n.$push=l)}}}function re(){return(0,o.WQ)(Y)}function oe(){return L?{isRunning:(0,r.KR)(!0),startInstance:()=>{},stopInstance:()=>{}}:(0,o.WQ)(z)}function ie(){if(L)return m(p({},(0,r.QW)((0,r.Kh)(k))),{update:()=>{},isTopAlign:(0,o.EW)((()=>!0)),isStreamPaused:(0,r.KR)(!1)});const e=re();return m(p({},e.config),{isStreamPaused:(0,r.tB)(e.timeouts.isStreamPaused),isTopAlign:(0,o.EW)((()=>0===e.config.position.value.indexOf("top")))})}const se=Symbol(""),ae='a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex="0"]',le={comboKey:"n",handleClicks:!0,leaveMessage:"You're leaving the notifications stream. Press Control + N to navigate it again.",emptyMessage:"No notifications to navigate",renderAnnouncement:!0,maxAnnouncements:2};const ue={listAriaLabel:"Notifications"},ce=(0,o.pM)({setup(e,{slots:t,attrs:n}){const i=(0,r.KR)(!1);return(0,o.sV)((()=>i.value=!0)),()=>{var e;return i.value?null==(e=t.default)?void 0:e.call(t):(0,o.CE)("span",n,"")}}}),de=e=>"mouse"===e.pointerType;function fe(e){return`${e.title?`${e.title}: `:""}${e.message}`}const he=["role","aria-live"],pe=(0,o.pM)({__name:"AriaLive",props:{item:{}},setup(e){const t=e,n={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:"0"};return(e,s)=>((0,o.uX)(),(0,o.CE)("div",{style:n,role:t.item.ariaRole,"aria-live":t.item.ariaLive,key:`${e.item.id}_${e.item.type}`,"aria-atomic":"true"},(0,i.v_)((0,r.R1)(fe)(t.item)),9,he))}});function me(){const{timeouts:e,config:t}=re();function n(t){de(t)&&e.pause()}function r(t){de(t)&&e.resume()}return(0,o.EW)((()=>t.pauseOnHover.value&&!e.isStreamFocused.value?{onPointerenter:n,onPointerleave:r}:{}))}function ve(){const{timeouts:e,config:t}=re();function n(t){de(t)||(e.clearDebounceTimeout(),e.pause(),e.resumeWithDebounce(2e3))}return(0,o.xo)((()=>{e.clearDebounceTimeout()})),(0,o.EW)((()=>t.pauseOnTouch.value&&!e.isStreamFocused.value?{onPointerdown:n}:{}))}const ge={boxSizing:"border-box"},ye={list:m(p({},ge),{display:"flex",justifyContent:"center",listStyle:"none",margin:"0 auto",maxWidth:"var(--nv-root-width, 100%)",padding:"0",pointerEvents:"none",position:"fixed",zIndex:"var(--nv-z, 500)"}),listItem:m(p({},ge),{display:"flex",margin:"0",position:"absolute",transitionProperty:"transform",width:"100%"}),itemContainer:m(p({},ge),{maxWidth:"100%",padding:"0 0 var(--nv-gap, 0.75rem) 0",pointerEvents:"auto"})};function be(){const{isTopAlign:e,position:t}=ie(),n=(0,o.EW)((()=>{const t=e.value,n=[`var(--nv-root-top, ${t?"1.25rem":"0px"})`,"var(--nv-root-right, 1.25rem)",`var(--nv-root-bottom, ${t?"0px":"1.25rem"})`,"var(--nv-root-left, 1.25rem)"],r=n.map((e=>`calc(-1 * ${e})`));return t?r.splice(2,1,"0px"):r.splice(0,1,"0px"),{inset:n.join(" "),clipPath:`inset(${r.join(" ")})`}})),r=(0,o.EW)((()=>({[e.value?"top":"bottom"]:"0",justifyContent:`var(--nv-root-x-align, ${t.value.endsWith("left")?"flex-start":t.value.endsWith("right")?"flex-end":"center"})`})));return(0,o.EW)((()=>({list:p(p({},ye.list),n.value),listItem:p(p({},ye.listItem),r.value),itemContainer:ye.itemContainer})))}function _e(e){function t(){window.matchMedia("(max-width: 1100px)").matches&&e()}(0,o.sV)((()=>{window.addEventListener("resize",t)})),(0,o.xo)((()=>{window.removeEventListener("resize",t)}))}function Ee(e,t){let n;const r=new WeakSet;(0,o.sV)((()=>{n=new ResizeObserver(((e,n)=>{for(const o of e)r.has(o.target)?Object.values(o.contentRect.toJSON()).every((e=>0===e))?(r.delete(o.target),n.unobserve(o.target)):(t(),r.delete(o.target),n.unobserve(o.target)):r.add(o.target)}))})),(0,o.wB)(e,(e=>{e.length>0&&e.forEach((e=>null==n?void 0:n.observe(e)))}),{flush:"post"}),(0,o.xo)((()=>{null==n||n.disconnect()}))}function we(){const{elements:e,animations:t}=re();_e((()=>t.updatePositions({isImmediate:!0}))),Ee(e.items.value,(()=>t.updatePositions()))}function Se(){const{config:e,timeouts:t}=re();function n(){t.isStreamFocused.value||e.pauseOnTabChange.value&&t.resume()}function r(){t.isStreamFocused.value||e.pauseOnTabChange.value&&t.pause()}(0,o.sV)((()=>{window.addEventListener("focus",n),window.addEventListener("blur",r)})),(0,o.xo)((()=>{window.removeEventListener("focus",n),window.removeEventListener("blur",r)}))}function Te(){const{animations:e}=re(),t=window.matchMedia("(prefers-reduced-motion: reduce)"),n=()=>e.setReducedMotion(t.matches);(0,o.sV)((()=>{var e;n(),null==(e=t.addEventListener)||e.call(t,"change",n)})),(0,o.xo)((()=>{var e;null==(e=t.removeEventListener)||e.call(t,"change",n)}))}const Ce=["data-notivue-align","aria-label"],ke=["data-notivue-item","aria-setsize","aria-posinset"],Oe=["aria-label","tabindex","data-notivue-container"],Ae=(0,o.pM)({__name:"NotivueImpl",props:(0,o.HF)({class:{},containersTabIndex:{},listAriaLabel:{},styles:{}},ue),setup(e){const t=e,{config:n,items:s,elements:a}=re(),l=be(),u=me(),c=ve();return Te(),Se(),we(),(e,d)=>{var f;return(0,o.uX)(),(0,o.Wv)(o.Im,{to:!1===(0,r.R1)(n).teleportTo.value?void 0:(0,r.R1)(n).teleportTo.value,disabled:!1===(0,r.R1)(n).teleportTo.value},[(0,r.R1)(s).entries.value.length>0?((0,o.uX)(),(0,o.CE)("ol",(0,o.v6)({key:0},p(p(p({},(0,r.R1)(u)),(0,r.R1)(c)),(0,r.R1)(a).rootAttrs.value),{"data-notivue-align":(0,r.R1)(n).position.value.split("-")[0],"aria-label":t.listAriaLabel,ref:(0,r.R1)(a).root,class:t.class,style:p(p({},(0,r.R1)(l).list),null==(f=t.styles)?void 0:f.list)}),[((0,o.uX)(!0),(0,o.CE)(o.FK,null,(0,o.pI)((0,r.R1)(s).entries.value,((n,u)=>{var c,d,f,h;return(0,o.uX)(),(0,o.CE)("li",{tabindex:"-1",key:n.id,"data-notivue-item":n.id,"aria-setsize":(0,r.R1)(s).length,"aria-posinset":u+1,ref_for:!0,ref:(0,r.R1)(a).items,style:(0,i.Tr)(p(p(p({},(0,r.R1)(l).listItem),n.positionStyles),null==(c=t.styles)?void 0:c.listItem))},[n.ariaLiveOnly?((0,o.uX)(),(0,o.Wv)(pe,{key:0,item:n},null,8,["item"])):((0,o.uX)(),(0,o.CE)("div",(0,o.v6)({key:1,ref_for:!0},n.animationAttrs,{"aria-label":(0,r.R1)(fe)(n),tabindex:null!=(f=null==(d=e.containersTabIndex)?void 0:d[n.id])?f:-1,"data-notivue-container":n.id,ref_for:!0,ref:(0,r.R1)(a).containers,style:p(p({},(0,r.R1)(l).itemContainer),null==(h=t.styles)?void 0:h.itemContainer)}),[(0,o.RG)(e.$slots,"default",(0,o.v6)({ref_for:!0},(0,r.R1)(j)(n)))],16,Oe))],12,ke)})),128))],16,Ce)):(0,o.Q3)("",!0)],8,["to","disabled"])}}}),Re=(0,o.pM)({__name:"Notivue",props:(0,o.HF)({class:{},containersTabIndex:{},listAriaLabel:{},styles:{}},ue),setup(e){const t=e,{isRunning:n}=oe();return(e,s)=>((0,o.uX)(),(0,o.Wv)((0,r.R1)(ce),null,{default:(0,o.k6)((()=>[(0,r.R1)(n)?((0,o.uX)(),(0,o.Wv)(Ae,(0,i._B)((0,o.v6)({key:0},t)),{default:(0,o.k6)((t=>[(0,o.RG)(e.$slots,"default",(0,i._B)((0,o.Ng)(t)))])),_:3},16)):(0,o.Q3)("",!0)])),_:3}))}}),Ie={touchOnly:!1,exclude:"a, button",disabled:!1,threshold:.5},Le=300,Ne={Mouse:200,Touch:1e3,TouchExternal:1400};Boolean,Boolean,Boolean;function xe(){const e=(0,r.KR)(!1),t=()=>e.value=!0,n=()=>e.value=!1,i=[["keydown",t],["mousedown",n],["touchstart",n]];return(0,o.sV)((()=>{i.forEach((([e,t])=>document.addEventListener(e,t)))})),(0,o.xo)((()=>{i.forEach((([e,t])=>document.removeEventListener(e,t)))})),{isKeyboardFocus:e}}function Pe(){const{root:e}=re().elements,t=(0,r.KR)(null);function n(n){var r;const o=n.target instanceof HTMLElement;o&&(null==(r=e.value)?void 0:r.contains(n.target))||o&&(t.value=n.target)}function i(){t.value?t.value.focus():(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),document.body.focus())}return(0,o.sV)((()=>{document.addEventListener("focus",n,!0)})),(0,o.xo)((()=>{document.removeEventListener("focus",n,!0)})),{focusLastElement:i}}const Me=(0,o.pM)({__name:"NotivueKeyboardImpl",props:(0,o.HF)({comboKey:{},handleClicks:{type:Boolean},leaveMessage:{},emptyMessage:{},renderAnnouncement:{type:Boolean},maxAnnouncements:{}},le),setup(e){const t=e,{comboKey:n,handleClicks:s,leaveMessage:a,emptyMessage:l,renderAnnouncement:u,maxAnnouncements:c}=(0,r.QW)(t),d={ariaRole:"alert",ariaLive:"assertive",skipQueue:!0,ariaLiveOnly:!u.value,props:{isNotivueKeyboard:!0}},f=(0,o.EW)((()=>p({message:a.value},d))),h=(0,o.EW)((()=>p({message:l.value},d))),{elements:m,timeouts:v,queue:g}=re(),y=ie(),{focusLastElement:b}=Pe(),{isKeyboardFocus:_}=xe(),E=(0,r.KR)({qualified:[],unqualified:[]}),w=(0,r.KR)([]),S=(0,r.KR)([]),T=(0,r.KR)(-1);function C(e){T.value=e}let k=0,A=!0,R=[];const I=(0,o.EW)((()=>{const e={};return E.value.qualified.forEach((t=>e[t]=T.value)),E.value.unqualified.forEach((t=>e[t]=-1)),e}));function L(){0!==w.value.length&&(C(0),v.setStreamFocus(),v.pause(),(0,o.dY)((()=>{w.value[0].focus()})))}function N({announce:e=!0}={}){b(),C(-1),v.setStreamFocus(!1),v.resume(),e&&k({id:e.dataset.notivueContainer,container:e}))).sort(((e,t)=>+t.id-+e.id)).forEach((({id:e,container:i})=>{const s=Array.from(i.querySelectorAll(ae)).filter((e=>e instanceof HTMLElement));o.push(...s),s.length>1?(t.qualified.push(e),n.push(i)):(t.unqualified.push(e),r.push(i))})),E.value=t,w.value=n,S.value=r,R=o}function P(e){!e.shiftKey&&"Tab"===e.key&&w.value.length>0&&(e.preventDefault(),A&&(A=!1),L(),(0,o.dY)(D))}function M(){D(),document.addEventListener("keydown",P)}function D(){document.removeEventListener("keydown",P)}(0,o.Gt)(se,{containersTabIndex:I,elementsTabIndex:(0,r.tB)(T)}),(0,o.wB)(m.containers,x,{deep:!0}),(0,o.wB)(w,((e,t,n)=>{if(0===e.length)return;const r=e.length>0,o=e.some((e=>!t.some((t=>t===e)))),i=o&&v.isStreamFocused.value,s=o&&!v.isStreamFocused.value||r&&A;i?e[0].focus():s&&M(),n((()=>{s&&D()}))}),{flush:"post"}),(0,o.wB)(S,(e=>{y.enqueue.value&&v.isStreamFocused.value&&e.length>0&&(w.value.length>0?w.value[0].focus():N({announce:!1}))}),{flush:"post"});let F=!1;function $(e){let t=0;const n=w.value.some(((n,r)=>{if(n.contains(e.target)||n===e.target)return t=r,!0}));if(n){if("Escape"===e.key)return e.preventDefault(),F=!0,N();if(!s.value)return;const n=e.target instanceof HTMLButtonElement||e.target instanceof HTMLAnchorElement;if(n&&(" "===e.key||" "===e.key||"Enter"===e.key)){if(e.preventDefault(),F=!0,e.target.click(),g.length>0)return;const n=w.value[t+1];n?n.focus():N()}}}function j(e){if(e.ctrlKey&&(e.key===n.value.toLowerCase()||e.key===n.value.toUpperCase())){if(e.preventDefault(),v.isStreamFocused.value)return F=!0,N();w.value.length>0?L():O.info(h.value)}}function U(e){var t;v.isStreamFocused.value&&!_.value&&((null==(t=m.root.value)?void 0:t.contains(e.target))||N(),R.includes(e.target)&&N())}(0,o.wB)(m.root,((e,t,n)=>{function r(t){if(t.preventDefault(),t.stopPropagation(),v.isStreamFocused.value&&_.value)return F?F=!1:void((null==e?void 0:e.contains(t.relatedTarget))||N())}e&&e.addEventListener("focusout",r),n((()=>{e&&e.removeEventListener("focusout",r)}))}),{immediate:!0,flush:"post"});const B=[["click",U],["keydown",$],["keydown",j]];return(0,o.sV)((()=>{B.forEach((([e,t])=>document.addEventListener(e,t)))})),(0,o.xo)((()=>{B.forEach((([e,t])=>{document.removeEventListener(e,t)}))})),(e,t)=>(0,o.RG)(e.$slots,"default",(0,i._B)((0,o.Ng)({containersTabIndex:I.value,elementsTabIndex:T.value})))}}),De=(Boolean,Boolean,(0,o.Lk)("path",{d:"M6,-0c-3.308,-0 -6,2.692 -6,6c-0,3.308 2.692,6 6,6c3.308,-0 6,-2.692 6,-6c-0,-3.308 -2.692,-6 -6,-6Zm3.123,3.989l-3.877,4.616c-0.086,0.102 -0.213,0.162 -0.346,0.164l-0.008,0c-0.131,0 -0.256,-0.055 -0.343,-0.153l-1.662,-1.846c-0.081,-0.085 -0.126,-0.199 -0.126,-0.316c0,-0.254 0.209,-0.462 0.462,-0.462c0.135,0 0.263,0.059 0.35,0.161l1.307,1.451l3.536,-4.209c0.087,-0.101 0.215,-0.159 0.349,-0.159c0.253,-0 0.461,0.208 0.461,0.461c0,0.107 -0.036,0.21 -0.103,0.292Z"},null,-1)),Fe=[De],$e=(0,o.pM)({__name:"SuccessIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(pt))),Fe,16))}}),je=(0,o.Lk)("path",{d:"M6,-0c-3.308,-0 -6,2.692 -6,6c-0,3.308 2.692,6 6,6c3.308,-0 6,-2.692 6,-6c-0,-3.308 -2.692,-6 -6,-6Zm-0,9.228c-0.316,0 -0.577,-0.26 -0.577,-0.577c0,-0.316 0.261,-0.577 0.577,-0.577c0.316,0 0.577,0.261 0.577,0.577c-0,0.317 -0.261,0.577 -0.577,0.577Zm0.627,-5.802l-0.166,3.519c-0,0.253 -0.208,0.462 -0.462,0.462c-0.253,-0 -0.461,-0.209 -0.461,-0.462l-0.166,-3.518l0,-0.001c-0,-0.009 -0,-0.018 -0,-0.027c-0,-0.344 0.283,-0.627 0.627,-0.627c0.344,0 0.627,0.283 0.627,0.627c-0,0.009 -0,0.018 -0.001,0.027l0.002,-0Z"},null,-1),Ue=[je],Be=(0,o.pM)({__name:"ErrorIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(pt))),Ue,16))}}),Ve=(0,o.Lk)("path",{d:"M6,0c-3.308,0 -6,2.692 -6,6c0,3.308 2.692,6 6,6c3.308,0 6,-2.692 6,-6c0,-3.308 -2.692,-6 -6,-6Zm0,2.46c0.428,0 0.78,0.352 0.78,0.78c-0,0.428 -0.352,0.78 -0.78,0.78c-0.428,0 -0.78,-0.352 -0.78,-0.78c0,-0.428 0.352,-0.78 0.78,-0.78Zm1.44,6.78l-2.64,0c-0.263,0 -0.48,-0.217 -0.48,-0.48c0,-0.263 0.217,-0.48 0.48,-0.48l0.84,0l0,-2.64l-0.48,0c-0.263,0 -0.48,-0.217 -0.48,-0.48c0,-0.263 0.217,-0.48 0.48,-0.48l0.96,0c0.263,0 0.48,0.217 0.48,0.48l0,3.12l0.84,0c0.263,0 0.48,0.217 0.48,0.48c0,0.263 -0.217,0.48 -0.48,0.48Z"},null,-1),He=[Ve],We=(0,o.pM)({__name:"InfoIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(pt))),He,16))}}),Ge=(0,o.Lk)("path",{d:"M11.963,6.037c-0,3.292 -2.671,5.963 -5.963,5.963c-3.292,0 -5.963,-2.671 -5.963,-5.963c0,-3.292 2.671,-5.962 5.963,-5.962c3.292,-0 5.963,2.67 5.963,5.962Zm-0.918,0c0,-2.785 -2.26,-5.045 -5.045,-5.045c-2.785,0 -5.045,2.26 -5.045,5.045c-0,2.786 2.26,5.046 5.045,5.046c2.785,-0 5.045,-2.26 5.045,-5.046Z"},null,-1),Xe=(0,o.Lk)("path",{d:"M8.401,3.449c0.163,-0.194 0.452,-0.219 0.646,-0.056c0.194,0.163 0.219,0.452 0.056,0.646l-3.853,4.587c-0.085,0.101 -0.21,0.161 -0.343,0.163c-0.133,0.003 -0.26,-0.053 -0.349,-0.151l-1.651,-1.835c-0.169,-0.188 -0.154,-0.479 0.034,-0.648c0.188,-0.169 0.479,-0.154 0.648,0.034l1.298,1.443l3.514,-4.183Z"},null,-1),Ke=[Ge,Xe],qe=(0,o.pM)({__name:"SuccessOutlineIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(pt))),Ke,16))}}),ze=(0,o.Lk)("path",{d:"M12, 6c0, 3.313 -2.687, 6 -6, 6c-3.313,-0 -6,-2.688 -6,-6c0,-3.313 2.688,-6 6,-6c3.313,-0 6,2.687 6,6Zm-0.923,-0c-0,-2.803 -2.274,-5.077 -5.077,-5.077c-2.803,0 -5.077,2.274 -5.077,5.077c0,2.803 2.274,5.077 5.077,5.077c2.803,-0 5.077,-2.274 5.077,-5.077Z"},null,-1),Ye=(0,o.Lk)("path",{d:"M5.373,3.426c-0,-0.009 -0,-0.019 -0,-0.028c-0,-0.342 0.279,-0.624 0.621,-0.627c0.002,-0 0.004,-0 0.006,-0c0.344,-0 0.627,0.283 0.627,0.627c-0,0.009 -0,0.019 -0.001,0.028l0,0.001l-0.165,3.518c-0.012,0.246 -0.215,0.44 -0.461,0.44c-0.246,-0 -0.449,-0.194 -0.461,-0.44l-0.166,-3.518l0,-0.001Z"},null,-1),Qe=(0,o.Lk)("path",{d:"M6,9.228c-0.316,0 -0.577,-0.26 -0.577,-0.577c0,-0.316 0.261,-0.577 0.577,-0.577c0.316,0 0.577,0.261 0.577,0.577c-0,0.317 -0.261,0.577 -0.577,0.577Z"},null,-1),Je=[ze,Ye,Qe],Ze=(0,o.pM)({__name:"ErrorOutlineIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(pt))),Je,16))}}),et=(0,o.Lk)("path",{d:"M6, 0c3.313, 0 6, 2.687 6, 6c-0, 3.313 -2.687, 6 -6, 6c-3.313,-0 -6,-2.687 -6,-6c0,-3.313 2.687,-6 6,-6Zm0, 0.96c-2.783, 0 -5.04, 2.257 -5.04, 5.04c0, 2.783 2.257, 5.04 5.04, 5.04c2.783, 0 5.04,-2.257 5.04,-5.04c-0,-2.783 -2.257,-5.04 -5.04,-5.04Z"},null,-1),tt=(0,o.Lk)("path",{d:"M6.6, 8.28l0.84, 0c0.265, 0 0.48, 0.215 0.48, 0.48c-0, 0.265 -0.215, 0.48 -0.48, 0.48l-2.64,-0c-0.265, 0 -0.48,-0.215 -0.48,-0.48c-0,-0.265 0.215,-0.48 0.48,-0.48l0.84, 0l-0,-2.64l-0.48, 0c-0.265, 0 -0.48,-0.215 -0.48,-0.48c-0,-0.265 0.215,-0.48 0.48,-0.48l0.96, 0c0.265, 0 0.48, 0.215 0.48, 0.48l-0, 3.12Z"},null,-1),nt=(0,o.Lk)("path",{d:"M6, 2.46c-0.428, 0 -0.78, 0.352 -0.78, 0.78c-0, 0.428 0.352, 0.78 0.78, 0.78c0.428, 0 0.78,-0.352 0.78,-0.78c-0,-0.428 -0.352,-0.78 -0.78,-0.78Z"},null,-1),rt=[et,tt,nt],ot=(0,o.pM)({__name:"InfoOutlineIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(pt))),rt,16))}}),it=(0,o.Lk)("path",{d:"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z",opacity:".25"},null,-1),st=(0,o.Lk)("path",{d:"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z",class:"Notivue__spinner"},null,-1),at=[it,st],lt=(0,o.pM)({__name:"PromiseIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)(m(p({},(0,r.R1)(ht)),{width:28,height:28,fill:"currentColor"}))),at,16))}}),ut=(0,o.Lk)("line",{x1:"18",y1:"6",x2:"6",y2:"18"},null,-1),ct=(0,o.Lk)("line",{x1:"6",y1:"6",x2:"18",y2:"18"},null,-1),dt=[ut,ct],ft=(0,o.pM)({__name:"CloseIcon",setup(e){return(e,t)=>((0,o.uX)(),(0,o.CE)("svg",(0,i._B)((0,o.Ng)((0,r.R1)(mt))),dt,16))}}),ht={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24","aria-hidden":"true"},pt=m(p({},ht),{fill:"currentColor",viewBox:"0 0 12 12"}),mt=m(p({},ht),{stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"}),vt={[b.SUCCESS]:(0,r.IG)($e),[b.ERROR]:(0,r.IG)(Be),[b.INFO]:(0,r.IG)(We),[b.WARNING]:(0,r.IG)(Be),[b.PROMISE]:(0,r.IG)(lt),[b.PROMISE_RESOLVE]:(0,r.IG)($e),[b.PROMISE_REJECT]:(0,r.IG)(Be),close:(0,r.IG)(ft)},gt=(b.SUCCESS,(0,r.IG)(qe),b.ERROR,(0,r.IG)(Ze),b.INFO,(0,r.IG)(ot),b.WARNING,(0,r.IG)(Ze),b.PROMISE,(0,r.IG)(lt),b.PROMISE_RESOLVE,(0,r.IG)(qe),b.PROMISE_REJECT,(0,r.IG)(Ze),(0,r.IG)(ft),{"--nv-width":"350px","--nv-spacing":"0.625rem","--nv-radius":"0.625rem","--nv-icon-size":"1.25rem","--nv-title-size":"0.925rem","--nv-message-size":"0.925rem","--nv-y-align":"center"}),yt={"--nv-shadow":"rgba(0, 0, 0, 0.06) 0px 4px 6px -1px, rgba(0, 0, 0, 0.03) 0px 2px 4px -1px"},bt=m(p(p({},gt),yt),{"--nv-global-bg":"#FFF","--nv-global-fg":"#171717","--nv-success-accent":"#28B780","--nv-error-accent":"#E74C3C","--nv-warning-accent":"#F59E0B","--nv-info-accent":"#3E8EFF","--nv-promise-accent":"#171717"}),_t=(m(p(p({},gt),yt),{"--nv-success-bg":"#E9FAEF","--nv-success-accent":"#059669","--nv-success-fg":"#057452","--nv-error-bg":"#FEEFEF","--nv-error-accent":"#E6523C","--nv-error-fg":"#C5412C","--nv-warning-bg":"#FFF0D8","--nv-warning-accent":"#F48533","--nv-warning-fg":"#81471D","--nv-info-bg":"#DEF0FA","--nv-info-accent":"#1F70AC","--nv-info-fg":"#1F70AC","--nv-promise-bg":"#FFF","--nv-promise-accent":"#334155","--nv-promise-fg":"#334155"}),m(p(p({},gt),yt),{"--nv-global-accent":"#FFF","--nv-global-fg":"#FFF","--nv-success-bg":"#178570","--nv-error-bg":"#C94430","--nv-info-bg":"#117AAE","--nv-warning-bg":"#FFE556","--nv-warning-fg":"#4F5358","--nv-warning-accent":"#4F5358","--nv-promise-bg":"#FFF","--nv-promise-fg":"#334155","--nv-promise-accent":"#64748B"}),m(p({},gt),{"--nv-border-width":"1px","--nv-global-bg":"#1F1F1F","--nv-global-border":"#414141","--nv-global-fg":"#D0D0D0","--nv-success-accent":"#8EF997","--nv-error-accent":"#FF7777","--nv-warning-accent":"#FFE554","--nv-info-accent":"#5FD4FF","--nv-promise-accent":"#D0D0D0"}),m(p({},gt),{"--nv-border-width":"1px","--nv-global-bg":"#20252E","--nv-global-border":"#353b45","--nv-global-fg":"#dfdfdf","--nv-success-accent":"#34D399","--nv-error-accent":"#FF7777","--nv-warning-accent":"#FFE554","--nv-info-accent":"#5FD4FF","--nv-promise-accent":"#D0D0D0"}),{NOTIFICATION:g+"notification",ICON:g+"icon",CONTENT:g+"content",TITLE:g+"content-title",MESSAGE:g+"content-message",CLOSE:g+"close",CLOSE_ICON:g+"close-icon",TRANSITION:g+"transition",PROGRESS:g+"progress",DUPLICATE:g+"duplicate"}),Et={icons:()=>vt,theme:()=>bt,hideClose:!1,closeAriaLabel:"Close"},wt=["data-notivue","data-notivue-has-title"],St=["aria-live","role"],Tt=["textContent"],Ct=["textContent"],kt=["aria-label"],Ot=["textContent"],At=(0,o.pM)({__name:"Notification",props:(0,o.HF)({item:{},icons:{},theme:{},closeAriaLabel:{},hideClose:{type:Boolean}},Et),setup(e){const t=e,n=(0,r.IJ)(t.icons[t.item.type]),a=t.icons.close;return(0,o.wB)((()=>t.item.type),(e=>n.value=t.icons[e]),{flush:"sync"}),(e,l)=>((0,o.uX)(),(0,o.CE)("div",{class:(0,i.C4)([(0,r.R1)(_t).NOTIFICATION,{[(0,r.R1)(_t).DUPLICATE]:e.item.duplicateCount>0}]),key:e.item.duplicateCount,"data-notivue":e.item.type,"data-notivue-has-title":Boolean(e.item.title),style:(0,i.Tr)(e.theme)},[n.value?((0,o.uX)(),(0,o.CE)(o.FK,{key:0},["object"===typeof n.value?((0,o.uX)(),(0,o.Wv)(s.eB,{key:0,name:(0,r.R1)(_t).TRANSITION,mode:"out-in"},{default:(0,o.k6)((()=>["object"===typeof n.value?((0,o.uX)(),(0,o.Wv)((0,o.$y)(n.value),{key:0,class:(0,i.C4)((0,r.R1)(_t).ICON),"aria-hidden":"true"},null,8,["class"])):(0,o.Q3)("",!0)])),_:1},8,["name"])):"string"===typeof n.value?((0,o.uX)(),(0,o.CE)("div",{key:1,class:(0,i.C4)((0,r.R1)(_t).ICON),"aria-hidden":"true"},(0,i.v_)(n.value),3)):(0,o.Q3)("",!0)],64)):(0,o.Q3)("",!0),(0,o.Lk)("div",{class:(0,i.C4)((0,r.R1)(_t).CONTENT),"aria-live":e.item.ariaLive,role:e.item.ariaRole,"aria-atomic":"true"},[e.item.title?((0,o.uX)(),(0,o.CE)("h3",{key:0,class:(0,i.C4)((0,r.R1)(_t).TITLE),textContent:(0,i.v_)((0,r.R1)(e.item.title))},null,10,Tt)):(0,o.Q3)("",!0),(0,o.Lk)("p",{class:(0,i.C4)((0,r.R1)(_t).MESSAGE),textContent:(0,i.v_)((0,r.R1)(e.item.message))},null,10,Ct)],10,St),!t.hideClose&&(0,r.R1)(a)&&"promise"!==e.item.type?((0,o.uX)(),(0,o.CE)("button",{key:1,class:(0,i.C4)((0,r.R1)(_t).CLOSE),"aria-label":e.closeAriaLabel,type:"button",tabindex:"-1",onClick:l[0]||(l[0]=(...t)=>e.item.clear&&e.item.clear(...t))},["object"===typeof(0,r.R1)(a)?((0,o.uX)(),(0,o.Wv)((0,o.$y)((0,r.R1)(a)),{key:0,class:(0,i.C4)((0,r.R1)(_t).CLOSE_ICON)},null,8,["class"])):"string"===typeof(0,r.R1)(a)?((0,o.uX)(),(0,o.CE)("div",{key:1,"aria-hidden":"true",textContent:(0,i.v_)((0,r.R1)(a))},null,8,Ot)):(0,o.Q3)("",!0)],10,kt)):(0,o.Q3)("",!0),(0,o.RG)(e.$slots,"default")],14,wt))}})},5745:function(e,t,n){"use strict";var r=n(7629);e.exports=function(e,t){return r[e]||(r[e]=t||{})}},5917:function(e,t,n){"use strict";var r=n(3724),o=n(9039),i=n(4055);e.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},5966:function(e,t,n){"use strict";var r=n(9306),o=n(4117);e.exports=function(e,t){var n=e[t];return o(n)?void 0:r(n)}},6043:function(e,t,n){"use strict";var r=n(9306),o=TypeError,i=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw new o("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new i(e)}},6080:function(e,t,n){"use strict";var r=n(7476),o=n(9306),i=n(616),s=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?s(e,t):function(){return e.apply(t,arguments)}}},6119:function(e,t,n){"use strict";var r=n(5745),o=n(3392),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},6170:function(e,t,n){"use strict";const r=n(3908),o=n(144),{safeRe:i,t:s}=n(9718),a=(e,t)=>{if(e instanceof r)return e;if("number"===typeof e&&(e=String(e)),"string"!==typeof e)return null;t=t||{};let n=null;if(t.rtl){const r=t.includePrerelease?i[s.COERCERTLFULL]:i[s.COERCERTL];let o;while((o=r.exec(e))&&(!n||n.index+n[0].length!==e.length))n&&o.index+o[0].length===n.index+n[0].length||(n=o),r.lastIndex=o.index+o[1].length+o[2].length;r.lastIndex=-1}else n=e.match(t.includePrerelease?i[s.COERCEFULL]:i[s.COERCE]);if(null===n)return null;const a=n[2],l=n[3]||"0",u=n[4]||"0",c=t.includePrerelease&&n[5]?`-${n[5]}`:"",d=t.includePrerelease&&n[6]?`+${n[6]}`:"";return o(`${a}.${l}.${u}${c}${d}`,t)};e.exports=a},6198:function(e,t,n){"use strict";var r=n(8014);e.exports=function(e){return r(e.length)}},6254:function(e,t,n){"use strict";const r=n(3908),o=(e,t)=>new r(e,t).minor;e.exports=o},6262:function(e,t){"use strict";t.A=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n}},6269:function(e){"use strict";e.exports={}},6278:function(e,t,n){"use strict";n.d(t,{y$:function(){return ee},i0:function(){return se},L8:function(){return ie},PY:function(){return oe},aH:function(){return re}});var r=n(641),o=n(953);function i(){return s().__VUE_DEVTOOLS_GLOBAL_HOOK__}function s(){return"undefined"!==typeof navigator&&"undefined"!==typeof window?window:"undefined"!==typeof globalThis?globalThis:{}}const a="function"===typeof Proxy,l="devtools-plugin:setup",u="plugin:settings:set";let c,d;function f(){var e;return void 0!==c||("undefined"!==typeof window&&window.performance?(c=!0,d=window.performance):"undefined"!==typeof globalThis&&(null===(e=globalThis.perf_hooks)||void 0===e?void 0:e.performance)?(c=!0,d=globalThis.perf_hooks.performance):c=!1),c}function h(){return f()?d.now():Date.now()}class p{constructor(e,t){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=e,this.hook=t;const n={};if(e.settings)for(const s in e.settings){const t=e.settings[s];n[s]=t.defaultValue}const r=`__vue-devtools-plugin-settings__${e.id}`;let o=Object.assign({},n);try{const e=localStorage.getItem(r),t=JSON.parse(e);Object.assign(o,t)}catch(i){}this.fallbacks={getSettings(){return o},setSettings(e){try{localStorage.setItem(r,JSON.stringify(e))}catch(i){}o=e},now(){return h()}},t&&t.on(u,((e,t)=>{e===this.plugin.id&&this.fallbacks.setSettings(t)})),this.proxiedOn=new Proxy({},{get:(e,t)=>this.target?this.target.on[t]:(...e)=>{this.onQueue.push({method:t,args:e})}}),this.proxiedTarget=new Proxy({},{get:(e,t)=>this.target?this.target[t]:"on"===t?this.proxiedOn:Object.keys(this.fallbacks).includes(t)?(...e)=>(this.targetQueue.push({method:t,args:e,resolve:()=>{}}),this.fallbacks[t](...e)):(...e)=>new Promise((n=>{this.targetQueue.push({method:t,args:e,resolve:n})}))})}async setRealTarget(e){this.target=e;for(const t of this.onQueue)this.target.on[t.method](...t.args);for(const t of this.targetQueue)t.resolve(await this.target[t.method](...t.args))}}function m(e,t){const n=e,r=s(),o=i(),u=a&&n.enableEarlyProxy;if(!o||!r.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__&&u){const e=u?new p(n,o):null,i=r.__VUE_DEVTOOLS_PLUGINS__=r.__VUE_DEVTOOLS_PLUGINS__||[];i.push({pluginDescriptor:n,setupFn:t,proxy:e}),e&&t(e.proxiedTarget)}else o.emit(l,e,t)} /*! * vuex v4.1.0 * (c) 2022 Evan You * @license MIT */ var v="store";function g(e,t){Object.keys(e).forEach((function(n){return t(e[n],n)}))}function y(e){return null!==e&&"object"===typeof e}function b(e){return e&&"function"===typeof e.then}function _(e,t){return function(){return e(t)}}function E(e,t,n){return t.indexOf(e)<0&&(n&&n.prepend?t.unshift(e):t.push(e)),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}function w(e,t){e._actions=Object.create(null),e._mutations=Object.create(null),e._wrappedGetters=Object.create(null),e._modulesNamespaceMap=Object.create(null);var n=e.state;T(e,n,[],e._modules.root,!0),S(e,n,t)}function S(e,t,n){var i=e._state,s=e._scope;e.getters={},e._makeLocalGettersCache=Object.create(null);var a=e._wrappedGetters,l={},u={},c=(0,o.uY)(!0);c.run((function(){g(a,(function(t,n){l[n]=_(t,e),u[n]=(0,r.EW)((function(){return l[n]()})),Object.defineProperty(e.getters,n,{get:function(){return u[n].value},enumerable:!0})}))})),e._state=(0,o.Kh)({data:t}),e._scope=c,e.strict&&I(e),i&&n&&e._withCommit((function(){i.data=null})),s&&s.stop()}function T(e,t,n,r,o){var i=!n.length,s=e._modules.getNamespace(n);if(r.namespaced&&(e._modulesNamespaceMap[s],e._modulesNamespaceMap[s]=r),!i&&!o){var a=L(t,n.slice(0,-1)),l=n[n.length-1];e._withCommit((function(){a[l]=r.state}))}var u=r.context=C(e,s,n);r.forEachMutation((function(t,n){var r=s+n;O(e,r,t,u)})),r.forEachAction((function(t,n){var r=t.root?n:s+n,o=t.handler||t;A(e,r,o,u)})),r.forEachGetter((function(t,n){var r=s+n;R(e,r,t,u)})),r.forEachChild((function(r,i){T(e,t,n.concat(i),r,o)}))}function C(e,t,n){var r=""===t,o={dispatch:r?e.dispatch:function(n,r,o){var i=N(n,r,o),s=i.payload,a=i.options,l=i.type;return a&&a.root||(l=t+l),e.dispatch(l,s)},commit:r?e.commit:function(n,r,o){var i=N(n,r,o),s=i.payload,a=i.options,l=i.type;a&&a.root||(l=t+l),e.commit(l,s,a)}};return Object.defineProperties(o,{getters:{get:r?function(){return e.getters}:function(){return k(e,t)}},state:{get:function(){return L(e.state,n)}}}),o}function k(e,t){if(!e._makeLocalGettersCache[t]){var n={},r=t.length;Object.keys(e.getters).forEach((function(o){if(o.slice(0,r)===t){var i=o.slice(r);Object.defineProperty(n,i,{get:function(){return e.getters[o]},enumerable:!0})}})),e._makeLocalGettersCache[t]=n}return e._makeLocalGettersCache[t]}function O(e,t,n,r){var o=e._mutations[t]||(e._mutations[t]=[]);o.push((function(t){n.call(e,r.state,t)}))}function A(e,t,n,r){var o=e._actions[t]||(e._actions[t]=[]);o.push((function(t){var o=n.call(e,{dispatch:r.dispatch,commit:r.commit,getters:r.getters,state:r.state,rootGetters:e.getters,rootState:e.state},t);return b(o)||(o=Promise.resolve(o)),e._devtoolHook?o.catch((function(t){throw e._devtoolHook.emit("vuex:error",t),t})):o}))}function R(e,t,n,r){e._wrappedGetters[t]||(e._wrappedGetters[t]=function(e){return n(r.state,r.getters,e.state,e.getters)})}function I(e){(0,r.wB)((function(){return e._state.data}),(function(){0}),{deep:!0,flush:"sync"})}function L(e,t){return t.reduce((function(e,t){return e[t]}),e)}function N(e,t,n){return y(e)&&e.type&&(n=t,t=e,e=e.type),{type:e,payload:t,options:n}}var x="vuex bindings",P="vuex:mutations",M="vuex:actions",D="vuex",F=0;function $(e,t){m({id:"org.vuejs.vuex",app:e,label:"Vuex",homepage:"https://next.vuex.vuejs.org/",logo:"https://vuejs.org/images/icons/favicon-96x96.png",packageName:"vuex",componentStateTypes:[x]},(function(n){n.addTimelineLayer({id:P,label:"Vuex Mutations",color:j}),n.addTimelineLayer({id:M,label:"Vuex Actions",color:j}),n.addInspector({id:D,label:"Vuex",icon:"storage",treeFilterPlaceholder:"Filter stores..."}),n.on.getInspectorTree((function(n){if(n.app===e&&n.inspectorId===D)if(n.filter){var r=[];G(r,t._modules.root,n.filter,""),n.rootNodes=r}else n.rootNodes=[W(t._modules.root,"")]})),n.on.getInspectorState((function(n){if(n.app===e&&n.inspectorId===D){var r=n.nodeId;k(t,r),n.state=X(q(t._modules,r),"root"===r?t.getters:t._makeLocalGettersCache,r)}})),n.on.editInspectorState((function(n){if(n.app===e&&n.inspectorId===D){var r=n.nodeId,o=n.path;"root"!==r&&(o=r.split("/").filter(Boolean).concat(o)),t._withCommit((function(){n.set(t._state.data,o,n.state.value)}))}})),t.subscribe((function(e,t){var r={};e.payload&&(r.payload=e.payload),r.state=t,n.notifyComponentUpdate(),n.sendInspectorTree(D),n.sendInspectorState(D),n.addTimelineEvent({layerId:P,event:{time:Date.now(),title:e.type,data:r}})})),t.subscribeAction({before:function(e,t){var r={};e.payload&&(r.payload=e.payload),e._id=F++,e._time=Date.now(),r.state=t,n.addTimelineEvent({layerId:M,event:{time:e._time,title:e.type,groupId:e._id,subtitle:"start",data:r}})},after:function(e,t){var r={},o=Date.now()-e._time;r.duration={_custom:{type:"duration",display:o+"ms",tooltip:"Action duration",value:o}},e.payload&&(r.payload=e.payload),r.state=t,n.addTimelineEvent({layerId:M,event:{time:Date.now(),title:e.type,groupId:e._id,subtitle:"end",data:r}})}})}))}var j=8702998,U=6710886,B=16777215,V={label:"namespaced",textColor:B,backgroundColor:U};function H(e){return e&&"root"!==e?e.split("/").slice(-2,-1)[0]:"Root"}function W(e,t){return{id:t||"root",label:H(t),tags:e.namespaced?[V]:[],children:Object.keys(e._children).map((function(n){return W(e._children[n],t+n+"/")}))}}function G(e,t,n,r){r.includes(n)&&e.push({id:r||"root",label:r.endsWith("/")?r.slice(0,r.length-1):r||"Root",tags:t.namespaced?[V]:[]}),Object.keys(t._children).forEach((function(o){G(e,t._children[o],n,r+o+"/")}))}function X(e,t,n){t="root"===n?t:t[n];var r=Object.keys(t),o={state:Object.keys(e.state).map((function(t){return{key:t,editable:!0,value:e.state[t]}}))};if(r.length){var i=K(t);o.getters=Object.keys(i).map((function(e){return{key:e.endsWith("/")?H(e):e,editable:!1,value:z((function(){return i[e]}))}}))}return o}function K(e){var t={};return Object.keys(e).forEach((function(n){var r=n.split("/");if(r.length>1){var o=t,i=r.pop();r.forEach((function(e){o[e]||(o[e]={_custom:{value:{},display:e,tooltip:"Module",abstract:!0}}),o=o[e]._custom.value})),o[i]=z((function(){return e[n]}))}else t[n]=z((function(){return e[n]}))})),t}function q(e,t){var n=t.split("/").filter((function(e){return e}));return n.reduce((function(e,r,o){var i=e[r];if(!i)throw new Error('Missing module "'+r+'" for path "'+t+'".');return o===n.length-1?i:i._children}),"root"===t?e:e.root._children)}function z(e){try{return e()}catch(t){return t}}var Y=function(e,t){this.runtime=t,this._children=Object.create(null),this._rawModule=e;var n=e.state;this.state=("function"===typeof n?n():n)||{}},Q={namespaced:{configurable:!0}};Q.namespaced.get=function(){return!!this._rawModule.namespaced},Y.prototype.addChild=function(e,t){this._children[e]=t},Y.prototype.removeChild=function(e){delete this._children[e]},Y.prototype.getChild=function(e){return this._children[e]},Y.prototype.hasChild=function(e){return e in this._children},Y.prototype.update=function(e){this._rawModule.namespaced=e.namespaced,e.actions&&(this._rawModule.actions=e.actions),e.mutations&&(this._rawModule.mutations=e.mutations),e.getters&&(this._rawModule.getters=e.getters)},Y.prototype.forEachChild=function(e){g(this._children,e)},Y.prototype.forEachGetter=function(e){this._rawModule.getters&&g(this._rawModule.getters,e)},Y.prototype.forEachAction=function(e){this._rawModule.actions&&g(this._rawModule.actions,e)},Y.prototype.forEachMutation=function(e){this._rawModule.mutations&&g(this._rawModule.mutations,e)},Object.defineProperties(Y.prototype,Q);var J=function(e){this.register([],e,!1)};function Z(e,t,n){if(t.update(n),n.modules)for(var r in n.modules){if(!t.getChild(r))return void 0;Z(e.concat(r),t.getChild(r),n.modules[r])}}J.prototype.get=function(e){return e.reduce((function(e,t){return e.getChild(t)}),this.root)},J.prototype.getNamespace=function(e){var t=this.root;return e.reduce((function(e,n){return t=t.getChild(n),e+(t.namespaced?n+"/":"")}),"")},J.prototype.update=function(e){Z([],this.root,e)},J.prototype.register=function(e,t,n){var r=this;void 0===n&&(n=!0);var o=new Y(t,n);if(0===e.length)this.root=o;else{var i=this.get(e.slice(0,-1));i.addChild(e[e.length-1],o)}t.modules&&g(t.modules,(function(t,o){r.register(e.concat(o),t,n)}))},J.prototype.unregister=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1],r=t.getChild(n);r&&r.runtime&&t.removeChild(n)},J.prototype.isRegistered=function(e){var t=this.get(e.slice(0,-1)),n=e[e.length-1];return!!t&&t.hasChild(n)};function ee(e){return new te(e)}var te=function(e){var t=this;void 0===e&&(e={});var n=e.plugins;void 0===n&&(n=[]);var r=e.strict;void 0===r&&(r=!1);var o=e.devtools;this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new J(e),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._makeLocalGettersCache=Object.create(null),this._scope=null,this._devtools=o;var i=this,s=this,a=s.dispatch,l=s.commit;this.dispatch=function(e,t){return a.call(i,e,t)},this.commit=function(e,t,n){return l.call(i,e,t,n)},this.strict=r;var u=this._modules.root.state;T(this,u,[],this._modules.root),S(this,u),n.forEach((function(e){return e(t)}))},ne={state:{configurable:!0}};te.prototype.install=function(e,t){e.provide(t||v,this),e.config.globalProperties.$store=this;var n=void 0!==this._devtools&&this._devtools;n&&$(e,this)},ne.state.get=function(){return this._state.data},ne.state.set=function(e){0},te.prototype.commit=function(e,t,n){var r=this,o=N(e,t,n),i=o.type,s=o.payload,a=(o.options,{type:i,payload:s}),l=this._mutations[i];l&&(this._withCommit((function(){l.forEach((function(e){e(s)}))})),this._subscribers.slice().forEach((function(e){return e(a,r.state)})))},te.prototype.dispatch=function(e,t){var n=this,r=N(e,t),o=r.type,i=r.payload,s={type:o,payload:i},a=this._actions[o];if(a){try{this._actionSubscribers.slice().filter((function(e){return e.before})).forEach((function(e){return e.before(s,n.state)}))}catch(u){0}var l=a.length>1?Promise.all(a.map((function(e){return e(i)}))):a[0](i);return new Promise((function(e,t){l.then((function(t){try{n._actionSubscribers.filter((function(e){return e.after})).forEach((function(e){return e.after(s,n.state)}))}catch(u){0}e(t)}),(function(e){try{n._actionSubscribers.filter((function(e){return e.error})).forEach((function(t){return t.error(s,n.state,e)}))}catch(u){0}t(e)}))}))}},te.prototype.subscribe=function(e,t){return E(e,this._subscribers,t)},te.prototype.subscribeAction=function(e,t){var n="function"===typeof e?{before:e}:e;return E(n,this._actionSubscribers,t)},te.prototype.watch=function(e,t,n){var o=this;return(0,r.wB)((function(){return e(o.state,o.getters)}),t,Object.assign({},n))},te.prototype.replaceState=function(e){var t=this;this._withCommit((function(){t._state.data=e}))},te.prototype.registerModule=function(e,t,n){void 0===n&&(n={}),"string"===typeof e&&(e=[e]),this._modules.register(e,t),T(this,this.state,e,this._modules.get(e),n.preserveState),S(this,this.state)},te.prototype.unregisterModule=function(e){var t=this;"string"===typeof e&&(e=[e]),this._modules.unregister(e),this._withCommit((function(){var n=L(t.state,e.slice(0,-1));delete n[e[e.length-1]]})),w(this)},te.prototype.hasModule=function(e){return"string"===typeof e&&(e=[e]),this._modules.isRegistered(e)},te.prototype.hotUpdate=function(e){this._modules.update(e),w(this,!0)},te.prototype._withCommit=function(e){var t=this._committing;this._committing=!0,e(),this._committing=t},Object.defineProperties(te.prototype,ne);var re=ue((function(e,t){var n={};return ae(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=this.$store.state,n=this.$store.getters;if(e){var r=ce(this.$store,"mapState",e);if(!r)return;t=r.context.state,n=r.context.getters}return"function"===typeof o?o.call(this,t,n):t[o]},n[r].vuex=!0})),n})),oe=ue((function(e,t){var n={};return ae(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=[],n=arguments.length;while(n--)t[n]=arguments[n];var r=this.$store.commit;if(e){var i=ce(this.$store,"mapMutations",e);if(!i)return;r=i.context.commit}return"function"===typeof o?o.apply(this,[r].concat(t)):r.apply(this.$store,[o].concat(t))}})),n})),ie=ue((function(e,t){var n={};return ae(t).forEach((function(t){var r=t.key,o=t.val;o=e+o,n[r]=function(){if(!e||ce(this.$store,"mapGetters",e))return this.$store.getters[o]},n[r].vuex=!0})),n})),se=ue((function(e,t){var n={};return ae(t).forEach((function(t){var r=t.key,o=t.val;n[r]=function(){var t=[],n=arguments.length;while(n--)t[n]=arguments[n];var r=this.$store.dispatch;if(e){var i=ce(this.$store,"mapActions",e);if(!i)return;r=i.context.dispatch}return"function"===typeof o?o.apply(this,[r].concat(t)):r.apply(this.$store,[o].concat(t))}})),n}));function ae(e){return le(e)?Array.isArray(e)?e.map((function(e){return{key:e,val:e}})):Object.keys(e).map((function(t){return{key:t,val:e[t]}})):[]}function le(e){return Array.isArray(e)||y(e)}function ue(e){return function(t,n){return"string"!==typeof t?(n=t,t=""):"/"!==t.charAt(t.length-1)&&(t+="/"),e(t,n)}}function ce(e,t,n){var r=e._modulesNamespaceMap[n];return r}},6279:function(e,t,n){"use strict";var r=n(6840);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},6319:function(e,t,n){"use strict";var r=n(8551),o=n(9539);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(s){o(e,"throw",s)}}},6395:function(e){"use strict";e.exports=!1},6435:function(e,t,n){"use strict";n.d(t,{A:function(){return A}});var r=n(641),o=n(33);const i={key:0,class:"discover-package__hint"},s={class:"discover-package__inside"},a=["title"],l={class:"discover-package__details"},u={class:"discover-package__headline-container"},c=["title"],d=["title"],f={class:"discover-package__more"},h={class:"discover-package__counts"},p=["title"],m={key:1,class:"discover-package__count discover-package__count--updated"},v={key:2,class:"discover-package__count discover-package__count--downloads"},g={key:3,class:"discover-package__count discover-package__count--favers"},y={class:"discover-package__actions"};function b(e,t,n,b,_,E){const w=(0,r.g2)("package-logo"),S=(0,r.g2)("details-button");return(0,r.uX)(),(0,r.CE)("article",{class:(0,o.C4)(["discover-package",n.hint||!E.slotEmpty(e.$slots.hint)?"is--hint":""])},[n.hint||!E.slotEmpty(e.$slots.hint)?((0,r.uX)(),(0,r.CE)("div",i,[(0,r.RG)(e.$slots,"hint",{},(()=>[(0,r.eW)((0,o.v_)(n.hint),1)]))])):(0,r.Q3)("",!0),(0,r.Lk)("div",s,[n.data.abandoned?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"discover-package__abandoned",title:E.abandonedText},(0,o.v_)(e.$t("ui.package.abandoned")),9,a)):(0,r.Q3)("",!0),(0,r.bF)(w,{class:(0,o.C4)(["discover-package__icon",{"discover-package__icon--fallback":!n.data.logo}]),src:n.data.logo},null,8,["class","src"]),(0,r.Lk)("div",l,[(0,r.Lk)("div",u,[n.data.contaoVersions?((0,r.uX)(),(0,r.CE)("ul",{key:0,class:(0,o.C4)(["discover-package__versions",{"discover-package__versions--fallback":!n.data.logo}]),title:`${e.$t("ui.package.contaoVersion")} ${n.data.contaoVersions.join(", ")}`},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.data.contaoVersions,((e,t)=>((0,r.uX)(),(0,r.CE)("li",{class:"discover-package__version",key:t},(0,o.v_)(e),1)))),128))],10,c)):(0,r.Q3)("",!0),(0,r.Lk)("h1",{class:(0,o.C4)(["discover-package__headline",{"discover-package__headline--fallback":!n.data.logo}]),title:n.data.name!==n.data.title?n.data.name:""},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(E.title.split("%%"),((e,t)=>((0,r.uX)(),(0,r.CE)(r.FK,null,[t%2?((0,r.uX)(),(0,r.CE)("em",{key:t},(0,o.v_)(e),1)):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.eW)((0,o.v_)(e),1)],64))],64)))),256))],10,d)]),(0,r.Lk)("p",{class:(0,o.C4)(["discover-package__description",{"discover-package__description--fallback":!n.data.logo}])},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(E.description.split("%%"),((e,t)=>((0,r.uX)(),(0,r.CE)(r.FK,null,[t%2?((0,r.uX)(),(0,r.CE)("em",{key:t},(0,o.v_)(e),1)):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.eW)((0,o.v_)(e),1)],64))],64)))),256))],2),(0,r.Lk)("div",f,[(0,r.Lk)("p",h,[n.data.private?((0,r.uX)(),(0,r.CE)("span",{key:0,class:"discover-package__count discover-package__count--private",title:e.$t("ui.package.privateTitle")},(0,o.v_)(e.$t("ui.package.private")),9,p)):(0,r.Q3)("",!0),n.data.updated?((0,r.uX)(),(0,r.CE)("span",m,(0,o.v_)(E.datimFormat(n.data.updated,!1,"short")),1)):(0,r.Q3)("",!0),n.data.downloads?((0,r.uX)(),(0,r.CE)("span",v,(0,o.v_)(E.numberFormat(n.data.downloads)),1)):(0,r.Q3)("",!0),n.data.favers?((0,r.uX)(),(0,r.CE)("span",g,(0,o.v_)(E.numberFormat(n.data.favers)),1)):(0,r.Q3)("",!0)]),(0,r.Lk)("div",y,[(0,r.bF)(S,{small:"",name:n.data.name},null,8,["name"]),(0,r.RG)(e.$slots,"actions")])])])])],2)}var _=n(4210),E=n(266),w=n(9451),S=n(7423),T=n(9071),C={components:{PackageLogo:S.A,DetailsButton:T.A},props:{data:Object,hint:String},computed:{title:e=>e.data._highlightResult?.title?.value||e.data.title||e.data.name,description:e=>e.data._highlightResult?.description?.value||e.data.description||"",abandonedText:e=>!0===e.data.abandoned?e.$t("ui.package.abandonedText"):e.$t("ui.package.abandonedReplace",{replacement:e.data.abandoned})},methods:{datimFormat:_.A,numberFormat:E.A,slotEmpty:w.A}},k=n(6262);const O=(0,k.A)(C,[["render",b]]);var A=O},6518:function(e,t,n){"use strict";var r=n(4576),o=n(7347).f,i=n(6699),s=n(6840),a=n(9433),l=n(7740),u=n(2796);e.exports=function(e,t){var n,c,d,f,h,p,m=e.target,v=e.global,g=e.stat;if(c=v?r:g?r[m]||a(m,{}):r[m]&&r[m].prototype,c)for(d in t){if(h=t[d],e.dontCallGetSet?(p=o(c,d),f=p&&p.value):f=c[d],n=u(v?d:m+(g?".":"#")+d,e.forced),!n&&void 0!==f){if(typeof h==typeof f)continue;l(h,f)}(e.sham||f&&f.sham)&&i(h,"sham",!0),s(c,d,h,e)}}},6699:function(e,t,n){"use strict";var r=n(3724),o=n(4913),i=n(6980);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},6780:function(e,t,n){"use strict";const r=n(8311),o=(e,t,n)=>(e=new r(e,n),t=new r(t,n),e.intersects(t,n));e.exports=o},6801:function(e,t,n){"use strict";var r=n(3724),o=n(8686),i=n(4913),s=n(8551),a=n(5397),l=n(1072);t.f=r&&!o?Object.defineProperties:function(e,t){s(e);var n,r=a(t),o=l(t),u=o.length,c=0;while(u>c)i.f(e,n=o[c++],r[n]);return e}},6823:function(e){"use strict";var t=String;e.exports=function(e){try{return t(e)}catch(n){return"Object"}}},6837:function(e){"use strict";var t=TypeError,n=9007199254740991;e.exports=function(e){if(e>n)throw t("Maximum allowed index exceeded");return e}},6840:function(e,t,n){"use strict";var r=n(4901),o=n(4913),i=n(283),s=n(9433);e.exports=function(e,t,n,a){a||(a={});var l=a.enumerable,u=void 0!==a.name?a.name:t;if(r(n)&&i(n,u,a),a.global)l?e[t]=n:s(t,n);else{try{a.unsafe?e[t]&&(l=!0):delete e[t]}catch(c){}l?e[t]=n:o.f(e,t,{value:n,enumerable:!1,configurable:!a.nonConfigurable,writable:!a.nonWritable})}return e}},6874:function(e){"use strict";const t="2.0.0",n=256,r=Number.MAX_SAFE_INTEGER||9007199254740991,o=16,i=n-6,s=["major","premajor","minor","preminor","patch","prepatch","prerelease"];e.exports={MAX_LENGTH:n,MAX_SAFE_COMPONENT_LENGTH:o,MAX_SAFE_BUILD_LENGTH:i,MAX_SAFE_INTEGER:r,RELEASE_TYPES:s,SEMVER_SPEC_VERSION:t,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}},6953:function(e,t,n){"use strict";const r=n(144),o=(e,t)=>{const n=r(e,t);return n?n.version:null};e.exports=o},6955:function(e,t,n){"use strict";var r=n(2140),o=n(4901),i=n(2195),s=n(8227),a=s("toStringTag"),l=Object,u="Arguments"===i(function(){return arguments}()),c=function(e,t){try{return e[t]}catch(n){}};e.exports=r?i:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=c(t=l(e),a))?n:u?i(t):"Object"===(r=i(t))&&o(t.callee)?"Arguments":r}},6969:function(e,t,n){"use strict";var r=n(2777),o=n(757);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},6980:function(e){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},6992:function(e,t,n){"use strict";n.d(t,{hU:function(){return Rr}}); /*! * shared v9.14.4 * (c) 2025 kazuya kawaguchi * Released under the MIT License. */ const r="undefined"!==typeof window;const o=(e,t=!1)=>t?Symbol.for(e):Symbol(e),i=(e,t,n)=>s({l:e,k:t,s:n}),s=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),a=e=>"number"===typeof e&&isFinite(e),l=e=>"[object Date]"===k(e),u=e=>"[object RegExp]"===k(e),c=e=>O(e)&&0===Object.keys(e).length,d=Object.assign,f=Object.create,h=(e=null)=>f(e);let p;const m=()=>p||(p="undefined"!==typeof globalThis?globalThis:"undefined"!==typeof self?self:"undefined"!==typeof window?window:"undefined"!==typeof global?global:h());function v(e){return e.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}const g=Object.prototype.hasOwnProperty;function y(e,t){return g.call(e,t)}const b=Array.isArray,_=e=>"function"===typeof e,E=e=>"string"===typeof e,w=e=>"boolean"===typeof e,S=e=>null!==e&&"object"===typeof e,T=e=>S(e)&&_(e.then)&&_(e.catch),C=Object.prototype.toString,k=e=>C.call(e),O=e=>{if(!S(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t.constructor===Object},A=e=>null==e?"":b(e)||O(e)&&e.toString===C?JSON.stringify(e,null,2):String(e);function R(e,t=""){return e.reduce(((e,n,r)=>0===r?e+n:e+t+n),"")}function I(e){let t=e;return()=>++t}function L(e,t){"undefined"!==typeof console&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const N=e=>!S(e)||b(e);function x(e,t){if(N(e)||N(t))throw new Error("Invalid value");const n=[{src:e,des:t}];while(n.length){const{src:e,des:t}=n.pop();Object.keys(e).forEach((r=>{"__proto__"!==r&&(S(e[r])&&!S(t[r])&&(t[r]=Array.isArray(e[r])?[]:h()),N(t[r])||N(e[r])?t[r]=e[r]:n.push({src:e[r],des:t[r]}))}))}}function P(e,t,n){return{line:e,column:t,offset:n}}function M(e,t,n){const r={start:e,end:t};return null!=n&&(r.source=n),r}const D=/\{([0-9a-zA-Z]+)\}/g;function F(e,...t){return 1===t.length&&U(t[0])&&(t=t[0]),t&&t.hasOwnProperty||(t={}),e.replace(D,((e,n)=>t.hasOwnProperty(n)?t[n]:""))}const $=Object.assign,j=e=>"string"===typeof e,U=e=>null!==e&&"object"===typeof e;function B(e,t=""){return e.reduce(((e,n,r)=>0===r?e+n:e+t+n),"")}const V={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},H={[V.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};function W(e,t,...n){const r=F(H[e]||"",...n||[]),o={message:String(r),code:e};return t&&(o.location=t),o}const G={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},X={[G.EXPECTED_TOKEN]:"Expected token: '{0}'",[G.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[G.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[G.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[G.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[G.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[G.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[G.EMPTY_PLACEHOLDER]:"Empty placeholder",[G.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[G.INVALID_LINKED_FORMAT]:"Invalid linked format",[G.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[G.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[G.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[G.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[G.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[G.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function K(e,t,n={}){const{domain:r,messages:o,args:i}=n,s=F((o||X)[e]||"",...i||[]),a=new SyntaxError(String(s));return a.code=e,t&&(a.location=t),a.domain=r,a}function q(e){throw e}const z=" ",Y="\r",Q="\n",J=String.fromCharCode(8232),Z=String.fromCharCode(8233);function ee(e){const t=e;let n=0,r=1,o=1,i=0;const s=e=>t[e]===Y&&t[e+1]===Q,a=e=>t[e]===Q,l=e=>t[e]===Z,u=e=>t[e]===J,c=e=>s(e)||a(e)||l(e)||u(e),d=()=>n,f=()=>r,h=()=>o,p=()=>i,m=e=>s(e)||l(e)||u(e)?Q:t[e],v=()=>m(n),g=()=>m(n+i);function y(){return i=0,c(n)&&(r++,o=0),s(n)&&n++,n++,o++,t[n]}function b(){return s(n+i)&&i++,i++,t[n+i]}function _(){n=0,r=1,o=1,i=0}function E(e=0){i=e}function w(){const e=n+i;while(e!==n)y();i=0}return{index:d,line:f,column:h,peekOffset:p,charAt:m,currentChar:v,currentPeek:g,next:y,peek:b,reset:_,resetPeek:E,skipToPeek:w}}const te=void 0,ne="'",re="tokenizer";function oe(e,t={}){const n=!1!==t.location,r=ee(e),o=()=>r.index(),i=()=>P(r.line(),r.column(),r.index()),s=i(),a=o(),l={currentType:14,offset:a,startLoc:s,endLoc:s,lastType:14,lastOffset:a,lastStartLoc:s,lastEndLoc:s,braceNest:0,inLinked:!1,text:""},u=()=>l,{onError:c}=t;function d(e,t,r,...o){const i=u();if(t.column+=r,t.offset+=r,c){const r=n?M(i.startLoc,t):null,s=K(e,r,{domain:re,args:o});c(s)}}function f(e,t,r){e.endLoc=i(),e.currentType=t;const o={type:t};return n&&(o.loc=M(e.startLoc,e.endLoc)),null!=r&&(o.value=r),o}const h=e=>f(e,14);function p(e,t){return e.currentChar()===t?(e.next(),t):(d(G.EXPECTED_TOKEN,i(),0,t),"")}function m(e){let t="";while(e.currentPeek()===z||e.currentPeek()===Q)t+=e.currentPeek(),e.peek();return t}function v(e){const t=m(e);return e.skipToPeek(),t}function g(e){if(e===te)return!1;const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||95===t}function y(e){if(e===te)return!1;const t=e.charCodeAt(0);return t>=48&&t<=57}function b(e,t){const{currentType:n}=t;if(2!==n)return!1;m(e);const r=g(e.currentPeek());return e.resetPeek(),r}function _(e,t){const{currentType:n}=t;if(2!==n)return!1;m(e);const r="-"===e.currentPeek()?e.peek():e.currentPeek(),o=y(r);return e.resetPeek(),o}function E(e,t){const{currentType:n}=t;if(2!==n)return!1;m(e);const r=e.currentPeek()===ne;return e.resetPeek(),r}function w(e,t){const{currentType:n}=t;if(8!==n)return!1;m(e);const r="."===e.currentPeek();return e.resetPeek(),r}function S(e,t){const{currentType:n}=t;if(9!==n)return!1;m(e);const r=g(e.currentPeek());return e.resetPeek(),r}function T(e,t){const{currentType:n}=t;if(8!==n&&12!==n)return!1;m(e);const r=":"===e.currentPeek();return e.resetPeek(),r}function C(e,t){const{currentType:n}=t;if(10!==n)return!1;const r=()=>{const t=e.currentPeek();return"{"===t?g(e.peek()):!("@"===t||"%"===t||"|"===t||":"===t||"."===t||t===z||!t)&&(t===Q?(e.peek(),r()):A(e,!1))},o=r();return e.resetPeek(),o}function k(e){m(e);const t="|"===e.currentPeek();return e.resetPeek(),t}function O(e){const t=m(e),n="%"===e.currentPeek()&&"{"===e.peek();return e.resetPeek(),{isModulo:n,hasSpace:t.length>0}}function A(e,t=!0){const n=(t=!1,r="",o=!1)=>{const i=e.currentPeek();return"{"===i?"%"!==r&&t:"@"!==i&&i?"%"===i?(e.peek(),n(t,"%",!0)):"|"===i?!("%"!==r&&!o)||!(r===z||r===Q):i===z?(e.peek(),n(!0,z,o)):i!==Q||(e.peek(),n(!0,Q,o)):"%"===r||t},r=n();return t&&e.resetPeek(),r}function R(e,t){const n=e.currentChar();return n===te?te:t(n)?(e.next(),n):null}function I(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t}function L(e){return R(e,I)}function N(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t||45===t}function x(e){return R(e,N)}function D(e){const t=e.charCodeAt(0);return t>=48&&t<=57}function F(e){return R(e,D)}function $(e){const t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function j(e){return R(e,$)}function U(e){let t="",n="";while(t=F(e))n+=t;return n}function B(e){v(e);const t=e.currentChar();return"%"!==t&&d(G.EXPECTED_TOKEN,i(),0,t),e.next(),"%"}function V(e){let t="";while(1){const n=e.currentChar();if("{"===n||"}"===n||"@"===n||"|"===n||!n)break;if("%"===n){if(!A(e))break;t+=n,e.next()}else if(n===z||n===Q)if(A(e))t+=n,e.next();else{if(k(e))break;t+=n,e.next()}else t+=n,e.next()}return t}function H(e){v(e);let t="",n="";while(t=x(e))n+=t;return e.currentChar()===te&&d(G.UNTERMINATED_CLOSING_BRACE,i(),0),n}function W(e){v(e);let t="";return"-"===e.currentChar()?(e.next(),t+=`-${U(e)}`):t+=U(e),e.currentChar()===te&&d(G.UNTERMINATED_CLOSING_BRACE,i(),0),t}function X(e){return e!==ne&&e!==Q}function q(e){v(e),p(e,"'");let t="",n="";while(t=R(e,X))n+="\\"===t?Y(e):t;const r=e.currentChar();return r===Q||r===te?(d(G.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,i(),0),r===Q&&(e.next(),p(e,"'")),n):(p(e,"'"),n)}function Y(e){const t=e.currentChar();switch(t){case"\\":case"'":return e.next(),`\\${t}`;case"u":return J(e,t,4);case"U":return J(e,t,6);default:return d(G.UNKNOWN_ESCAPE_SEQUENCE,i(),0,t),""}}function J(e,t,n){p(e,t);let r="";for(let o=0;o{const r=e.currentChar();return"{"!==r&&"%"!==r&&"@"!==r&&"|"!==r&&"("!==r&&")"!==r&&r?r===z?n:(n+=r,e.next(),t(n)):n};return t("")}function ae(e){v(e);const t=p(e,"|");return v(e),t}function le(e,t){let n=null;const r=e.currentChar();switch(r){case"{":return t.braceNest>=1&&d(G.NOT_ALLOW_NEST_PLACEHOLDER,i(),0),e.next(),n=f(t,2,"{"),v(e),t.braceNest++,n;case"}":return t.braceNest>0&&2===t.currentType&&d(G.EMPTY_PLACEHOLDER,i(),0),e.next(),n=f(t,3,"}"),t.braceNest--,t.braceNest>0&&v(e),t.inLinked&&0===t.braceNest&&(t.inLinked=!1),n;case"@":return t.braceNest>0&&d(G.UNTERMINATED_CLOSING_BRACE,i(),0),n=ue(e,t)||h(t),t.braceNest=0,n;default:{let r=!0,o=!0,s=!0;if(k(e))return t.braceNest>0&&d(G.UNTERMINATED_CLOSING_BRACE,i(),0),n=f(t,1,ae(e)),t.braceNest=0,t.inLinked=!1,n;if(t.braceNest>0&&(5===t.currentType||6===t.currentType||7===t.currentType))return d(G.UNTERMINATED_CLOSING_BRACE,i(),0),t.braceNest=0,ce(e,t);if(r=b(e,t))return n=f(t,5,H(e)),v(e),n;if(o=_(e,t))return n=f(t,6,W(e)),v(e),n;if(s=E(e,t))return n=f(t,7,q(e)),v(e),n;if(!r&&!o&&!s)return n=f(t,13,oe(e)),d(G.INVALID_TOKEN_IN_PLACEHOLDER,i(),0,n.value),v(e),n;break}}return n}function ue(e,t){const{currentType:n}=t;let r=null;const o=e.currentChar();switch(8!==n&&9!==n&&12!==n&&10!==n||o!==Q&&o!==z||d(G.INVALID_LINKED_FORMAT,i(),0),o){case"@":return e.next(),r=f(t,8,"@"),t.inLinked=!0,r;case".":return v(e),e.next(),f(t,9,".");case":":return v(e),e.next(),f(t,10,":");default:return k(e)?(r=f(t,1,ae(e)),t.braceNest=0,t.inLinked=!1,r):w(e,t)||T(e,t)?(v(e),ue(e,t)):S(e,t)?(v(e),f(t,12,ie(e))):C(e,t)?(v(e),"{"===o?le(e,t)||r:f(t,11,se(e))):(8===n&&d(G.INVALID_LINKED_FORMAT,i(),0),t.braceNest=0,t.inLinked=!1,ce(e,t))}}function ce(e,t){let n={type:14};if(t.braceNest>0)return le(e,t)||h(t);if(t.inLinked)return ue(e,t)||h(t);const r=e.currentChar();switch(r){case"{":return le(e,t)||h(t);case"}":return d(G.UNBALANCED_CLOSING_BRACE,i(),0),e.next(),f(t,3,"}");case"@":return ue(e,t)||h(t);default:{if(k(e))return n=f(t,1,ae(e)),t.braceNest=0,t.inLinked=!1,n;const{isModulo:r,hasSpace:o}=O(e);if(r)return o?f(t,0,V(e)):f(t,4,B(e));if(A(e))return f(t,0,V(e));break}}return n}function de(){const{currentType:e,offset:t,startLoc:n,endLoc:s}=l;return l.lastType=e,l.lastOffset=t,l.lastStartLoc=n,l.lastEndLoc=s,l.offset=o(),l.startLoc=i(),r.currentChar()===te?f(l,14):ce(r,l)}return{nextToken:de,currentOffset:o,currentPosition:i,context:u}}const ie="parser",se=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g;function ae(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const e=parseInt(t||n,16);return e<=55295||e>=57344?String.fromCodePoint(e):"�"}}}function le(e={}){const t=!1!==e.location,{onError:n,onWarn:r}=e;function o(e,r,o,i,...s){const a=e.currentPosition();if(a.offset+=i,a.column+=i,n){const e=t?M(o,a):null,i=K(r,e,{domain:ie,args:s});n(i)}}function i(e,n,o,i,...s){const a=e.currentPosition();if(a.offset+=i,a.column+=i,r){const e=t?M(o,a):null;r(W(n,e,s))}}function s(e,n,r){const o={type:e};return t&&(o.start=n,o.end=n,o.loc={start:r,end:r}),o}function a(e,n,r,o){o&&(e.type=o),t&&(e.end=n,e.loc&&(e.loc.end=r))}function l(e,t){const n=e.context(),r=s(3,n.offset,n.startLoc);return r.value=t,a(r,e.currentOffset(),e.currentPosition()),r}function u(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:o}=n,i=s(5,r,o);return i.index=parseInt(t,10),e.nextToken(),a(i,e.currentOffset(),e.currentPosition()),i}function c(e,t,n){const r=e.context(),{lastOffset:o,lastStartLoc:i}=r,l=s(4,o,i);return l.key=t,!0===n&&(l.modulo=!0),e.nextToken(),a(l,e.currentOffset(),e.currentPosition()),l}function d(e,t){const n=e.context(),{lastOffset:r,lastStartLoc:o}=n,i=s(9,r,o);return i.value=t.replace(se,ae),e.nextToken(),a(i,e.currentOffset(),e.currentPosition()),i}function f(e){const t=e.nextToken(),n=e.context(),{lastOffset:r,lastStartLoc:i}=n,l=s(8,r,i);return 12!==t.type?(o(e,G.UNEXPECTED_EMPTY_LINKED_MODIFIER,n.lastStartLoc,0),l.value="",a(l,r,i),{nextConsumeToken:t,node:l}):(null==t.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,n.lastStartLoc,0,ue(t)),l.value=t.value||"",a(l,e.currentOffset(),e.currentPosition()),{node:l})}function h(e,t){const n=e.context(),r=s(7,n.offset,n.startLoc);return r.value=t,a(r,e.currentOffset(),e.currentPosition()),r}function p(e){const t=e.context(),n=s(6,t.offset,t.startLoc);let r=e.nextToken();if(9===r.type){const t=f(e);n.modifier=t.node,r=t.nextConsumeToken||e.nextToken()}switch(10!==r.type&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(r)),r=e.nextToken(),2===r.type&&(r=e.nextToken()),r.type){case 11:null==r.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(r)),n.key=h(e,r.value||"");break;case 5:null==r.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(r)),n.key=c(e,r.value||"");break;case 6:null==r.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(r)),n.key=u(e,r.value||"");break;case 7:null==r.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(r)),n.key=d(e,r.value||"");break;default:{o(e,G.UNEXPECTED_EMPTY_LINKED_KEY,t.lastStartLoc,0);const i=e.context(),l=s(7,i.offset,i.startLoc);return l.value="",a(l,i.offset,i.startLoc),n.key=l,a(n,i.offset,i.startLoc),{nextConsumeToken:r,node:n}}}return a(n,e.currentOffset(),e.currentPosition()),{node:n}}function m(e){const t=e.context(),n=1===t.currentType?e.currentOffset():t.offset,r=1===t.currentType?t.endLoc:t.startLoc,f=s(2,n,r);f.items=[];let h=null,m=null;do{const n=h||e.nextToken();switch(h=null,n.type){case 0:null==n.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(n)),f.items.push(l(e,n.value||""));break;case 6:null==n.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(n)),f.items.push(u(e,n.value||""));break;case 4:m=!0;break;case 5:null==n.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(n)),f.items.push(c(e,n.value||"",!!m)),m&&(i(e,V.USE_MODULO_SYNTAX,t.lastStartLoc,0,ue(n)),m=null);break;case 7:null==n.value&&o(e,G.UNEXPECTED_LEXICAL_ANALYSIS,t.lastStartLoc,0,ue(n)),f.items.push(d(e,n.value||""));break;case 8:{const t=p(e);f.items.push(t.node),h=t.nextConsumeToken||null;break}}}while(14!==t.currentType&&1!==t.currentType);const v=1===t.currentType?t.lastOffset:e.currentOffset(),g=1===t.currentType?t.lastEndLoc:e.currentPosition();return a(f,v,g),f}function v(e,t,n,r){const i=e.context();let l=0===r.items.length;const u=s(1,t,n);u.cases=[],u.cases.push(r);do{const t=m(e);l||(l=0===t.items.length),u.cases.push(t)}while(14!==i.currentType);return l&&o(e,G.MUST_HAVE_MESSAGES_IN_PLURAL,n,0),a(u,e.currentOffset(),e.currentPosition()),u}function g(e){const t=e.context(),{offset:n,startLoc:r}=t,o=m(e);return 14===t.currentType?o:v(e,n,r,o)}function y(n){const r=oe(n,$({},e)),i=r.context(),l=s(0,i.offset,i.startLoc);return t&&l.loc&&(l.loc.source=n),l.body=g(r),e.onCacheKey&&(l.cacheKey=e.onCacheKey(n)),14!==i.currentType&&o(r,G.UNEXPECTED_LEXICAL_ANALYSIS,i.lastStartLoc,0,n[i.offset]||""),a(l,r.currentOffset(),r.currentPosition()),l}return{parse:y}}function ue(e){if(14===e.type)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function ce(e,t={}){const n={ast:e,helpers:new Set},r=()=>n,o=e=>(n.helpers.add(e),e);return{context:r,helper:o}}function de(e,t){for(let n=0;nme(e))),e}function me(e){if(1===e.items.length){const t=e.items[0];3!==t.type&&9!==t.type||(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;na;function u(e,t){a.code+=e}function c(e,t=!0){const n=t?o:"";u(i?n+" ".repeat(e):n)}function d(e=!0){const t=++a.indentLevel;e&&c(t)}function f(e=!0){const t=--a.indentLevel;e&&c(t)}function h(){c(a.indentLevel)}const p=e=>`_${e}`,m=()=>a.needIndent;return{context:l,push:u,indent:d,deindent:f,newline:h,helper:p,needIndent:m}}function _e(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),Te(e,t.key),t.modifier?(e.push(", "),Te(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function Ee(e,t){const{helper:n,needIndent:r}=e;e.push(`${n("normalize")}([`),e.indent(r());const o=t.items.length;for(let i=0;i1){e.push(`${n("plural")}([`),e.indent(r());const o=t.cases.length;for(let n=0;n{const n=j(t.mode)?t.mode:"normal",r=j(t.filename)?t.filename:"message.intl",o=!!t.sourceMap,i=null!=t.breakLineCode?t.breakLineCode:"arrow"===n?";":"\n",s=t.needIndent?t.needIndent:"arrow"!==n,a=e.helpers||[],l=be(e,{mode:n,filename:r,sourceMap:o,breakLineCode:i,needIndent:s});l.push("normal"===n?"function __msg__ (ctx) {":"(ctx) => {"),l.indent(s),a.length>0&&(l.push(`const { ${B(a.map((e=>`${e}: _${e}`)),", ")} } = ctx`),l.newline()),l.push("return "),Te(l,e),l.deindent(s),l.push("}"),delete e.helpers;const{code:u,map:c}=l.context();return{ast:e,code:u,map:c?c.toJSON():void 0}};function ke(e,t={}){const n=$({},t),r=!!n.jit,o=!!n.minify,i=null==n.optimize||n.optimize,s=le(n),a=s.parse(e);return r?(i&&pe(a),o&&ge(a),{ast:a,code:""}):(he(a,n),Ce(a,n))} /*! * core-base v9.14.4 * (c) 2025 kazuya kawaguchi * Released under the MIT License. */ function Oe(){"boolean"!==typeof __INTLIFY_PROD_DEVTOOLS__&&(m().__INTLIFY_PROD_DEVTOOLS__=!1),"boolean"!==typeof __INTLIFY_JIT_COMPILATION__&&(m().__INTLIFY_JIT_COMPILATION__=!1),"boolean"!==typeof __INTLIFY_DROP_MESSAGE_COMPILER__&&(m().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function Ae(e){return S(e)&&0===$e(e)&&(y(e,"b")||y(e,"body"))}const Re=["b","body"];function Ie(e){return Ge(e,Re)}const Le=["c","cases"];function Ne(e){return Ge(e,Le,[])}const xe=["s","static"];function Pe(e){return Ge(e,xe)}const Me=["i","items"];function De(e){return Ge(e,Me,[])}const Fe=["t","type"];function $e(e){return Ge(e,Fe)}const je=["v","value"];function Ue(e,t){const n=Ge(e,je);if(null!=n)return n;throw Ke(t)}const Be=["m","modifier"];function Ve(e){return Ge(e,Be)}const He=["k","key"];function We(e){const t=Ge(e,He);if(t)return t;throw Ke(6)}function Ge(e,t,n){for(let r=0;r{void 0===r?r=o:r+=o},f[1]=()=>{void 0!==r&&(t.push(r),r=void 0)},f[2]=()=>{f[0](),d++},f[3]=()=>{if(d>0)d--,c=4,f[0]();else{if(d=0,void 0===r)return!1;if(r=Ze(r),!1===r)return!1;f[1]()}};while(null!==c)if(u++,n=e[u],"\\"!==n||!h()){if(i=Je(n),l=qe[c],s=l[i]||l["l"]||8,8===s)return;if(c=s[0],void 0!==s[1]&&(a=f[s[1]],a&&(o=n,!1===a())))return;if(7===c)return t}}const tt=new Map;function nt(e,t){return S(e)?e[t]:null}function rt(e,t){if(!S(e))return null;let n=tt.get(t);if(n||(n=et(t),n&&tt.set(t,n)),!n)return null;const r=n.length;let o=e,i=0;while(ie,it=e=>"",st="text",at=e=>0===e.length?"":R(e),lt=A;function ut(e,t){return e=Math.abs(e),2===t?e?e>1?1:0:1:e?Math.min(e,2):0}function ct(e){const t=a(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(a(e.named.count)||a(e.named.n))?a(e.named.count)?e.named.count:a(e.named.n)?e.named.n:t:t}function dt(e,t){t.count||(t.count=e),t.n||(t.n=e)}function ft(e={}){const t=e.locale,n=ct(e),r=S(e.pluralRules)&&E(t)&&_(e.pluralRules[t])?e.pluralRules[t]:ut,o=S(e.pluralRules)&&E(t)&&_(e.pluralRules[t])?ut:void 0,i=e=>e[r(n,e.length,o)],s=e.list||[],l=e=>s[e],u=e.named||h();a(e.pluralIndex)&&dt(n,u);const c=e=>u[e];function f(t){const n=_(e.messages)?e.messages(t):!!S(e.messages)&&e.messages[t];return n||(e.parent?e.parent.message(t):it)}const p=t=>e.modifiers?e.modifiers[t]:ot,m=O(e.processor)&&_(e.processor.normalize)?e.processor.normalize:at,v=O(e.processor)&&_(e.processor.interpolate)?e.processor.interpolate:lt,g=O(e.processor)&&E(e.processor.type)?e.processor.type:st,y=(e,...t)=>{const[n,r]=t;let o="text",i="";1===t.length?S(n)?(i=n.modifier||i,o=n.type||o):E(n)&&(i=n||i):2===t.length&&(E(n)&&(i=n||i),E(r)&&(o=r||o));const s=f(e)(w),a="vnode"===o&&b(s)&&i?s[0]:s;return i?p(i)(a,o):a},w={["list"]:l,["named"]:c,["plural"]:i,["linked"]:y,["message"]:f,["type"]:g,["interpolate"]:v,["normalize"]:m,["values"]:d(h(),s,u)};return w}let ht=null;function pt(e){ht=e}function mt(e,t,n){ht&&ht.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const vt=gt("function:translate");function gt(e){return t=>ht&&ht.emit(e,t)}const yt=V.__EXTEND_POINT__,bt=I(yt),_t={NOT_FOUND_KEY:yt,FALLBACK_TO_TRANSLATE:bt(),CANNOT_FORMAT_NUMBER:bt(),FALLBACK_TO_NUMBER_FORMAT:bt(),CANNOT_FORMAT_DATE:bt(),FALLBACK_TO_DATE_FORMAT:bt(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:bt(),__EXTEND_POINT__:bt()};_t.NOT_FOUND_KEY,_t.FALLBACK_TO_TRANSLATE,_t.CANNOT_FORMAT_NUMBER,_t.FALLBACK_TO_NUMBER_FORMAT,_t.CANNOT_FORMAT_DATE,_t.FALLBACK_TO_DATE_FORMAT,_t.EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER;const Et=G.__EXTEND_POINT__,wt=I(Et),St={INVALID_ARGUMENT:Et,INVALID_DATE_ARGUMENT:wt(),INVALID_ISO_DATE_ARGUMENT:wt(),NOT_SUPPORT_NON_STRING_MESSAGE:wt(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:wt(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:wt(),NOT_SUPPORT_LOCALE_TYPE:wt(),__EXTEND_POINT__:wt()};function Tt(e){return K(e,null,void 0)}St.INVALID_ARGUMENT,St.INVALID_DATE_ARGUMENT,St.INVALID_ISO_DATE_ARGUMENT,St.NOT_SUPPORT_NON_STRING_MESSAGE,St.NOT_SUPPORT_LOCALE_PROMISE_VALUE,St.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION,St.NOT_SUPPORT_LOCALE_TYPE;function Ct(e,t){return null!=t.locale?Ot(t.locale):Ot(e.locale)}let kt;function Ot(e){if(E(e))return e;if(_(e)){if(e.resolvedOnce&&null!=kt)return kt;if("Function"===e.constructor.name){const t=e();if(T(t))throw Tt(St.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return kt=t}throw Tt(St.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}throw Tt(St.NOT_SUPPORT_LOCALE_TYPE)}function At(e,t,n){return[...new Set([n,...b(t)?t:S(t)?Object.keys(t):E(t)?[t]:[n]])]}function Rt(e,t,n){const r=E(n)?n:Mt,o=e;o.__localeChainCache||(o.__localeChainCache=new Map);let i=o.__localeChainCache.get(r);if(!i){i=[];let e=[n];while(b(e))e=It(i,e,t);const s=b(t)||!O(t)?t:t["default"]?t["default"]:null;e=E(s)?[s]:s,b(e)&&It(i,e,!1),o.__localeChainCache.set(r,i)}return i}function It(e,t,n){let r=!0;for(let o=0;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function $t(){return{upper:(e,t)=>"text"===t&&E(e)?e.toUpperCase():"vnode"===t&&S(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>"text"===t&&E(e)?e.toLowerCase():"vnode"===t&&S(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>"text"===t&&E(e)?Ft(e):"vnode"===t&&S(e)&&"__v_isVNode"in e?Ft(e.children):e}}let jt,Ut,Bt;function Vt(e){jt=e}function Ht(e){Ut=e}function Wt(e){Bt=e}let Gt=null;const Xt=e=>{Gt=e},Kt=()=>Gt;let qt=null;const zt=e=>{qt=e},Yt=()=>qt;let Qt=0;function Jt(e={}){const t=_(e.onWarn)?e.onWarn:L,n=E(e.version)?e.version:xt,r=E(e.locale)||_(e.locale)?e.locale:Mt,o=_(r)?Mt:r,i=b(e.fallbackLocale)||O(e.fallbackLocale)||E(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:o,s=O(e.messages)?e.messages:Zt(o),a=O(e.datetimeFormats)?e.datetimeFormats:Zt(o),l=O(e.numberFormats)?e.numberFormats:Zt(o),c=d(h(),e.modifiers,$t()),f=e.pluralRules||h(),p=_(e.missing)?e.missing:null,m=!w(e.missingWarn)&&!u(e.missingWarn)||e.missingWarn,v=!w(e.fallbackWarn)&&!u(e.fallbackWarn)||e.fallbackWarn,g=!!e.fallbackFormat,y=!!e.unresolving,T=_(e.postTranslation)?e.postTranslation:null,C=O(e.processor)?e.processor:null,k=!w(e.warnHtmlMessage)||e.warnHtmlMessage,A=!!e.escapeParameter,R=_(e.messageCompiler)?e.messageCompiler:jt;const I=_(e.messageResolver)?e.messageResolver:Ut||nt,N=_(e.localeFallbacker)?e.localeFallbacker:Bt||At,x=S(e.fallbackContext)?e.fallbackContext:void 0,P=e,M=S(P.__datetimeFormatters)?P.__datetimeFormatters:new Map,D=S(P.__numberFormatters)?P.__numberFormatters:new Map,F=S(P.__meta)?P.__meta:{};Qt++;const $={version:n,cid:Qt,locale:r,fallbackLocale:i,messages:s,modifiers:c,pluralRules:f,missing:p,missingWarn:m,fallbackWarn:v,fallbackFormat:g,unresolving:y,postTranslation:T,processor:C,warnHtmlMessage:k,escapeParameter:A,messageCompiler:R,messageResolver:I,localeFallbacker:N,fallbackContext:x,onWarn:t,__meta:F};return $.datetimeFormats=a,$.numberFormats=l,$.__datetimeFormatters=M,$.__numberFormatters=D,__INTLIFY_PROD_DEVTOOLS__&&mt($,n,F),$}const Zt=e=>({[e]:h()});function en(e,t,n,r,o){const{missing:i,onWarn:s}=e;if(null!==i){const r=i(e,n,t,o);return E(r)?r:t}return t}function tn(e,t,n){const r=e;r.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function nn(e,t){return e!==t&&e.split("-")[0]===t.split("-")[0]}function rn(e,t){const n=t.indexOf(e);if(-1===n)return!1;for(let r=n+1;rsn(t,e);return t}function sn(e,t){const n=Ie(t);if(null==n)throw Ke(0);const r=$e(n);if(1===r){const t=n,r=Ne(t);return e.plural(r.reduce(((t,n)=>[...t,an(e,n)]),[]))}return an(e,n)}function an(e,t){const n=Pe(t);if(null!=n)return"text"===e.type?n:e.normalize([n]);{const n=De(t).reduce(((t,n)=>[...t,ln(e,n)]),[]);return e.normalize(n)}}function ln(e,t){const n=$e(t);switch(n){case 3:return Ue(t,n);case 9:return Ue(t,n);case 4:{const r=t;if(y(r,"k")&&r.k)return e.interpolate(e.named(r.k));if(y(r,"key")&&r.key)return e.interpolate(e.named(r.key));throw Ke(n)}case 5:{const r=t;if(y(r,"i")&&a(r.i))return e.interpolate(e.list(r.i));if(y(r,"index")&&a(r.index))return e.interpolate(e.list(r.index));throw Ke(n)}case 6:{const n=t,r=Ve(n),o=We(n);return e.linked(ln(e,o),r?ln(e,r):void 0,e.type)}case 7:return Ue(t,n);case 8:return Ue(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const un=e=>e;let cn=h();function dn(e,t={}){let n=!1;const r=t.onError||q;return t.onError=e=>{n=!0,r(e)},{...ke(e,t),detectError:n}}const fn=(e,t)=>{if(!E(e))throw Tt(St.NOT_SUPPORT_NON_STRING_MESSAGE);{!w(t.warnHtmlMessage)||t.warnHtmlMessage;const n=t.onCacheKey||un,r=n(e),o=cn[r];if(o)return o;const{code:i,detectError:s}=dn(e,t),a=new Function(`return ${i}`)();return s?a:cn[r]=a}};function hn(e,t){if(__INTLIFY_JIT_COMPILATION__&&!__INTLIFY_DROP_MESSAGE_COMPILER__&&E(e)){!w(t.warnHtmlMessage)||t.warnHtmlMessage;const n=t.onCacheKey||un,r=n(e),o=cn[r];if(o)return o;const{ast:i,detectError:s}=dn(e,{...t,location:!1,jit:!0}),a=on(i);return s?a:cn[r]=a}{0;const t=e.cacheKey;if(t){const n=cn[t];return n||(cn[t]=on(e))}return on(e)}}const pn=()=>"",mn=e=>_(e);function vn(e,...t){const{fallbackFormat:n,postTranslation:r,unresolving:o,messageCompiler:i,fallbackLocale:s,messages:a}=e,[l,u]=En(...t),c=w(u.missingWarn)?u.missingWarn:e.missingWarn,f=w(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,p=w(u.escapeParameter)?u.escapeParameter:e.escapeParameter,m=!!u.resolvedMessage,v=E(u.default)||w(u.default)?w(u.default)?i?l:()=>l:u.default:n?i?l:()=>l:"",g=n||""!==v,y=Ct(e,u);p&&gn(u);let[b,_,S]=m?[l,y,a[y]||h()]:yn(e,l,y,s,f,c),T=b,C=l;if(m||E(T)||Ae(T)||mn(T)||g&&(T=v,C=T),!m&&(!(E(T)||Ae(T)||mn(T))||!E(_)))return o?Pt:l;let k=!1;const O=()=>{k=!0},A=mn(T)?T:bn(e,l,_,T,C,O);if(k)return T;const R=Sn(e,_,S,u),I=ft(R),L=_n(e,A,I),N=r?r(L,l):L;if(__INTLIFY_PROD_DEVTOOLS__){const t={timestamp:Date.now(),key:E(l)?l:mn(T)?T.key:"",locale:_||(mn(T)?T.locale:""),format:E(T)?T:mn(T)?T.source:"",message:N};t.meta=d({},e.__meta,Kt()||{}),vt(t)}return N}function gn(e){b(e.list)?e.list=e.list.map((e=>E(e)?v(e):e)):S(e.named)&&Object.keys(e.named).forEach((t=>{E(e.named[t])&&(e.named[t]=v(e.named[t]))}))}function yn(e,t,n,r,o,i){const{messages:s,onWarn:a,messageResolver:l,localeFallbacker:u}=e,c=u(e,r,n);let d,f=h(),p=null,m=n,v=null;const g="translate";for(let y=0;yr;return e.locale=n,e.key=t,e}const l=s(r,wn(e,n,o,r,a,i));return l.locale=n,l.key=t,l.source=r,l}function _n(e,t,n){const r=t(n);return r}function En(...e){const[t,n,r]=e,o=h();if(!E(t)&&!a(t)&&!mn(t)&&!Ae(t))throw Tt(St.INVALID_ARGUMENT);const i=a(t)?String(t):(mn(t),t);return a(n)?o.plural=n:E(n)?o.default=n:O(n)&&!c(n)?o.named=n:b(n)&&(o.list=n),a(r)?o.plural=r:E(r)?o.default=r:O(r)&&d(o,r),[i,o]}function wn(e,t,n,r,o,s){return{locale:t,key:n,warnHtmlMessage:o,onError:e=>{throw s&&s(e),e},onCacheKey:e=>i(t,n,e)}}function Sn(e,t,n,r){const{modifiers:o,pluralRules:i,messageResolver:s,fallbackLocale:l,fallbackWarn:u,missingWarn:c,fallbackContext:d}=e,f=r=>{let o=s(n,r);if(null==o&&d){const[,,e]=yn(d,r,t,l,u,c);o=s(e,r)}if(E(o)||Ae(o)){let n=!1;const i=()=>{n=!0},s=bn(e,r,t,o,r,i);return n?pn:s}return mn(o)?o:pn},h={locale:t,modifiers:o,pluralRules:i,messages:f};return e.processor&&(h.processor=e.processor),r.list&&(h.list=r.list),r.named&&(h.named=r.named),a(r.plural)&&(h.pluralIndex=r.plural),h}const Tn="undefined"!==typeof Intl;Tn&&Intl.DateTimeFormat,Tn&&Intl.NumberFormat;function Cn(e,...t){const{datetimeFormats:n,unresolving:r,fallbackLocale:o,onWarn:i,localeFallbacker:s}=e,{__datetimeFormatters:a}=e;const[l,u,f,h]=On(...t),p=w(f.missingWarn)?f.missingWarn:e.missingWarn,m=(w(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,!!f.part),v=Ct(e,f),g=s(e,o,v);if(!E(l)||""===l)return new Intl.DateTimeFormat(v,h).format(u);let y,b={},_=null,S=v,T=null;const C="datetime format";for(let c=0;c{kn.includes(e)?u[e]=n[e]:i[e]=n[e]})),E(r)?i.locale=r:O(r)&&(u=r),O(o)&&(u=o),[i.key||"",s,i,u]}function An(e,t,n){const r=e;for(const o in n){const e=`${t}__${o}`;r.__datetimeFormatters.has(e)&&r.__datetimeFormatters.delete(e)}}function Rn(e,...t){const{numberFormats:n,unresolving:r,fallbackLocale:o,onWarn:i,localeFallbacker:s}=e,{__numberFormatters:a}=e;const[l,u,f,h]=Ln(...t),p=w(f.missingWarn)?f.missingWarn:e.missingWarn,m=(w(f.fallbackWarn)?f.fallbackWarn:e.fallbackWarn,!!f.part),v=Ct(e,f),g=s(e,o,v);if(!E(l)||""===l)return new Intl.NumberFormat(v,h).format(u);let y,b={},_=null,S=v,T=null;const C="number format";for(let c=0;c{In.includes(e)?s[e]=n[e]:i[e]=n[e]})),E(r)?i.locale=r:O(r)&&(s=r),O(o)&&(s=o),[i.key||"",l,i,s]}function Nn(e,t,n){const r=e;for(const o in n){const e=`${t}__${o}`;r.__numberFormatters.has(e)&&r.__numberFormatters.delete(e)}}Oe();var xn=n(641),Pn=n(953); /*! * vue-i18n v9.14.4 * (c) 2025 kazuya kawaguchi * Released under the MIT License. */ const Mn="9.14.4";function Dn(){"boolean"!==typeof __VUE_I18N_FULL_INSTALL__&&(m().__VUE_I18N_FULL_INSTALL__=!0),"boolean"!==typeof __VUE_I18N_LEGACY_API__&&(m().__VUE_I18N_LEGACY_API__=!0),"boolean"!==typeof __INTLIFY_JIT_COMPILATION__&&(m().__INTLIFY_JIT_COMPILATION__=!1),"boolean"!==typeof __INTLIFY_DROP_MESSAGE_COMPILER__&&(m().__INTLIFY_DROP_MESSAGE_COMPILER__=!1),"boolean"!==typeof __INTLIFY_PROD_DEVTOOLS__&&(m().__INTLIFY_PROD_DEVTOOLS__=!1)}const Fn=_t.__EXTEND_POINT__,$n=I(Fn),jn={FALLBACK_TO_ROOT:Fn,NOT_SUPPORTED_PRESERVE:$n(),NOT_SUPPORTED_FORMATTER:$n(),NOT_SUPPORTED_PRESERVE_DIRECTIVE:$n(),NOT_SUPPORTED_GET_CHOICE_INDEX:$n(),COMPONENT_NAME_LEGACY_COMPATIBLE:$n(),NOT_FOUND_PARENT_SCOPE:$n(),IGNORE_OBJ_FLATTEN:$n(),NOTICE_DROP_ALLOW_COMPOSITION:$n(),NOTICE_DROP_TRANSLATE_EXIST_COMPATIBLE_FLAG:$n()};jn.FALLBACK_TO_ROOT,jn.NOT_SUPPORTED_PRESERVE,jn.NOT_SUPPORTED_FORMATTER,jn.NOT_SUPPORTED_PRESERVE_DIRECTIVE,jn.NOT_SUPPORTED_GET_CHOICE_INDEX,jn.COMPONENT_NAME_LEGACY_COMPATIBLE,jn.NOT_FOUND_PARENT_SCOPE,jn.IGNORE_OBJ_FLATTEN,jn.NOTICE_DROP_ALLOW_COMPOSITION,jn.NOTICE_DROP_TRANSLATE_EXIST_COMPATIBLE_FLAG;const Un=St.__EXTEND_POINT__,Bn=I(Un),Vn={UNEXPECTED_RETURN_TYPE:Un,INVALID_ARGUMENT:Bn(),MUST_BE_CALL_SETUP_TOP:Bn(),NOT_INSTALLED:Bn(),NOT_AVAILABLE_IN_LEGACY_MODE:Bn(),REQUIRED_VALUE:Bn(),INVALID_VALUE:Bn(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:Bn(),NOT_INSTALLED_WITH_PROVIDE:Bn(),UNEXPECTED_ERROR:Bn(),NOT_COMPATIBLE_LEGACY_VUE_I18N:Bn(),BRIDGE_SUPPORT_VUE_2_ONLY:Bn(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:Bn(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:Bn(),__EXTEND_POINT__:Bn()};function Hn(e,...t){return K(e,null,void 0)}Vn.UNEXPECTED_RETURN_TYPE,Vn.INVALID_ARGUMENT,Vn.MUST_BE_CALL_SETUP_TOP,Vn.NOT_INSTALLED,Vn.UNEXPECTED_ERROR,Vn.NOT_AVAILABLE_IN_LEGACY_MODE,Vn.REQUIRED_VALUE,Vn.INVALID_VALUE,Vn.CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN,Vn.NOT_INSTALLED_WITH_PROVIDE,Vn.NOT_COMPATIBLE_LEGACY_VUE_I18N,Vn.BRIDGE_SUPPORT_VUE_2_ONLY,Vn.MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION,Vn.NOT_AVAILABLE_COMPOSITION_IN_LEGACY;const Wn=o("__translateVNode"),Gn=o("__datetimeParts"),Xn=o("__numberParts"),Kn=o("__setPluralRules");o("__intlifyMeta");const qn=o("__injectWithOption"),zn=o("__dispose");function Yn(e){if(!S(e))return e;if(Ae(e))return e;for(const t in e)if(y(e,t))if(t.includes(".")){const n=t.split("."),r=n.length-1;let o=e,i=!1;for(let e=0;e{if("locale"in e&&"resource"in e){const{locale:t,resource:n}=e;t?(s[t]=s[t]||h(),x(n,s[t])):x(n,s)}else E(e)&&x(JSON.parse(e),s)})),null==o&&i)for(const a in s)y(s,a)&&Yn(s[a]);return s}function Jn(e){return e.type}function Zn(e,t,n){let r=S(t.messages)?t.messages:h();"__i18nGlobal"in n&&(r=Qn(e.locale.value,{messages:r,__i18n:n.__i18nGlobal}));const o=Object.keys(r);if(o.length&&o.forEach((t=>{e.mergeLocaleMessage(t,r[t])})),S(t.datetimeFormats)){const n=Object.keys(t.datetimeFormats);n.length&&n.forEach((n=>{e.mergeDateTimeFormat(n,t.datetimeFormats[n])}))}if(S(t.numberFormats)){const n=Object.keys(t.numberFormats);n.length&&n.forEach((n=>{e.mergeNumberFormat(n,t.numberFormats[n])}))}}function er(e){return(0,xn.bF)(xn.EY,null,e,0)}const tr="__INTLIFY_META__",nr=()=>[],rr=()=>!1;let or=0;function ir(e){return(t,n,r,o)=>e(n,r,(0,xn.nI)()||void 0,o)}const sr=()=>{const e=(0,xn.nI)();let t=null;return e&&(t=Jn(e)[tr])?{[tr]:t}:null};function ar(e={},t){const{__root:n,__injectWithOption:o}=e,i=void 0===n,s=e.flatJson,l=r?Pn.KR:Pn.IJ,c=!!e.translateExistCompatible;let f=!w(e.inheritLocale)||e.inheritLocale;const h=l(n&&f?n.locale.value:E(e.locale)?e.locale:Mt),p=l(n&&f?n.fallbackLocale.value:E(e.fallbackLocale)||b(e.fallbackLocale)||O(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:h.value),m=l(Qn(h.value,e)),v=l(O(e.datetimeFormats)?e.datetimeFormats:{[h.value]:{}}),g=l(O(e.numberFormats)?e.numberFormats:{[h.value]:{}});let T=n?n.missingWarn:!w(e.missingWarn)&&!u(e.missingWarn)||e.missingWarn,C=n?n.fallbackWarn:!w(e.fallbackWarn)&&!u(e.fallbackWarn)||e.fallbackWarn,k=n?n.fallbackRoot:!w(e.fallbackRoot)||e.fallbackRoot,A=!!e.fallbackFormat,R=_(e.missing)?e.missing:null,I=_(e.missing)?ir(e.missing):null,L=_(e.postTranslation)?e.postTranslation:null,N=n?n.warnHtmlMessage:!w(e.warnHtmlMessage)||e.warnHtmlMessage,P=!!e.escapeParameter;const M=n?n.modifiers:O(e.modifiers)?e.modifiers:{};let D,F=e.pluralRules||n&&n.pluralRules;const $=()=>{i&&zt(null);const t={version:Mn,locale:h.value,fallbackLocale:p.value,messages:m.value,modifiers:M,pluralRules:F,missing:null===I?void 0:I,missingWarn:T,fallbackWarn:C,fallbackFormat:A,unresolving:!0,postTranslation:null===L?void 0:L,warnHtmlMessage:N,escapeParameter:P,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};t.datetimeFormats=v.value,t.numberFormats=g.value,t.__datetimeFormatters=O(D)?D.__datetimeFormatters:void 0,t.__numberFormatters=O(D)?D.__numberFormatters:void 0;const n=Jt(t);return i&&zt(n),n};function j(){return[h.value,p.value,m.value,v.value,g.value]}D=$(),tn(D,h.value,p.value);const U=(0,xn.EW)({get:()=>h.value,set:e=>{h.value=e,D.locale=h.value}}),B=(0,xn.EW)({get:()=>p.value,set:e=>{p.value=e,D.fallbackLocale=p.value,tn(D,h.value,e)}}),V=(0,xn.EW)((()=>m.value)),H=(0,xn.EW)((()=>v.value)),W=(0,xn.EW)((()=>g.value));function G(){return _(L)?L:null}function X(e){L=e,D.postTranslation=e}function K(){return R}function q(e){null!==e&&(I=ir(e)),R=e,D.missing=I}const z=(e,t,r,o,s,l)=>{let u;j();try{__INTLIFY_PROD_DEVTOOLS__&&Xt(sr()),i||(D.fallbackContext=n?Yt():void 0),u=e(D)}finally{__INTLIFY_PROD_DEVTOOLS__&&Xt(null),i||(D.fallbackContext=void 0)}if("translate exists"!==r&&a(u)&&u===Pt||"translate exists"===r&&!u){const[e,r]=t();return n&&k?o(n):s(e)}if(l(u))return u;throw Hn(Vn.UNEXPECTED_RETURN_TYPE)};function Y(...e){return z((t=>Reflect.apply(vn,null,[t,...e])),(()=>En(...e)),"translate",(t=>Reflect.apply(t.t,t,[...e])),(e=>e),(e=>E(e)))}function Q(...e){const[t,n,r]=e;if(r&&!S(r))throw Hn(Vn.INVALID_ARGUMENT);return Y(t,n,d({resolvedMessage:!0},r||{}))}function J(...e){return z((t=>Reflect.apply(Cn,null,[t,...e])),(()=>On(...e)),"datetime format",(t=>Reflect.apply(t.d,t,[...e])),(()=>Dt),(e=>E(e)))}function Z(...e){return z((t=>Reflect.apply(Rn,null,[t,...e])),(()=>Ln(...e)),"number format",(t=>Reflect.apply(t.n,t,[...e])),(()=>Dt),(e=>E(e)))}function ee(e){return e.map((e=>E(e)||a(e)||w(e)?er(String(e)):e))}const te=e=>e,ne={normalize:ee,interpolate:te,type:"vnode"};function re(...e){return z((t=>{let n;const r=t;try{r.processor=ne,n=Reflect.apply(vn,null,[r,...e])}finally{r.processor=null}return n}),(()=>En(...e)),"translate",(t=>t[Wn](...e)),(e=>[er(e)]),(e=>b(e)))}function oe(...e){return z((t=>Reflect.apply(Rn,null,[t,...e])),(()=>Ln(...e)),"number format",(t=>t[Xn](...e)),nr,(e=>E(e)||b(e)))}function ie(...e){return z((t=>Reflect.apply(Cn,null,[t,...e])),(()=>On(...e)),"datetime format",(t=>t[Gn](...e)),nr,(e=>E(e)||b(e)))}function se(e){F=e,D.pluralRules=F}function ae(e,t){return z((()=>{if(!e)return!1;const n=E(t)?t:h.value,r=ce(n),o=D.messageResolver(r,e);return c?null!=o:Ae(o)||mn(o)||E(o)}),(()=>[e]),"translate exists",(n=>Reflect.apply(n.te,n,[e,t])),rr,(e=>w(e)))}function le(e){let t=null;const n=Rt(D,p.value,h.value);for(let r=0;r{f&&(h.value=e,D.locale=e,tn(D,h.value,p.value))})),(0,xn.wB)(n.fallbackLocale,(e=>{f&&(p.value=e,D.fallbackLocale=e,tn(D,h.value,p.value))})));const be={id:or,locale:U,fallbackLocale:B,get inheritLocale(){return f},set inheritLocale(e){f=e,e&&n&&(h.value=n.locale.value,p.value=n.fallbackLocale.value,tn(D,h.value,p.value))},get availableLocales(){return Object.keys(m.value).sort()},messages:V,get modifiers(){return M},get pluralRules(){return F||{}},get isGlobal(){return i},get missingWarn(){return T},set missingWarn(e){T=e,D.missingWarn=T},get fallbackWarn(){return C},set fallbackWarn(e){C=e,D.fallbackWarn=C},get fallbackRoot(){return k},set fallbackRoot(e){k=e},get fallbackFormat(){return A},set fallbackFormat(e){A=e,D.fallbackFormat=A},get warnHtmlMessage(){return N},set warnHtmlMessage(e){N=e,D.warnHtmlMessage=e},get escapeParameter(){return P},set escapeParameter(e){P=e,D.escapeParameter=e},t:Y,getLocaleMessage:ce,setLocaleMessage:de,mergeLocaleMessage:fe,getPostTranslationHandler:G,setPostTranslationHandler:X,getMissingHandler:K,setMissingHandler:q,[Kn]:se};return be.datetimeFormats=H,be.numberFormats=W,be.rt=Q,be.te=ae,be.tm=ue,be.d=J,be.n=Z,be.getDateTimeFormat=he,be.setDateTimeFormat=pe,be.mergeDateTimeFormat=me,be.getNumberFormat=ve,be.setNumberFormat=ge,be.mergeNumberFormat=ye,be[qn]=o,be[Wn]=re,be[Gn]=ie,be[Xn]=oe,be}function lr(e){const t=E(e.locale)?e.locale:Mt,n=E(e.fallbackLocale)||b(e.fallbackLocale)||O(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:t,r=_(e.missing)?e.missing:void 0,o=!w(e.silentTranslationWarn)&&!u(e.silentTranslationWarn)||!e.silentTranslationWarn,i=!w(e.silentFallbackWarn)&&!u(e.silentFallbackWarn)||!e.silentFallbackWarn,s=!w(e.fallbackRoot)||e.fallbackRoot,a=!!e.formatFallbackMessages,l=O(e.modifiers)?e.modifiers:{},c=e.pluralizationRules,f=_(e.postTranslation)?e.postTranslation:void 0,h=!E(e.warnHtmlInMessage)||"off"!==e.warnHtmlInMessage,p=!!e.escapeParameterHtml,m=!w(e.sync)||e.sync;let v=e.messages;if(O(e.sharedMessages)){const t=e.sharedMessages,n=Object.keys(t);v=n.reduce(((e,n)=>{const r=e[n]||(e[n]={});return d(r,t[n]),e}),v||{})}const{__i18n:g,__root:y,__injectWithOption:S}=e,T=e.datetimeFormats,C=e.numberFormats,k=e.flatJson,A=e.translateExistCompatible;return{locale:t,fallbackLocale:n,messages:v,flatJson:k,datetimeFormats:T,numberFormats:C,missing:r,missingWarn:o,fallbackWarn:i,fallbackRoot:s,fallbackFormat:a,modifiers:l,pluralRules:c,postTranslation:f,warnHtmlMessage:h,escapeParameter:p,messageResolver:e.messageResolver,inheritLocale:m,translateExistCompatible:A,__i18n:g,__root:y,__injectWithOption:S}}function ur(e={},t){{const t=ar(lr(e)),{__extender:n}=e,r={id:t.id,get locale(){return t.locale.value},set locale(e){t.locale.value=e},get fallbackLocale(){return t.fallbackLocale.value},set fallbackLocale(e){t.fallbackLocale.value=e},get messages(){return t.messages.value},get datetimeFormats(){return t.datetimeFormats.value},get numberFormats(){return t.numberFormats.value},get availableLocales(){return t.availableLocales},get formatter(){return{interpolate(){return[]}}},set formatter(e){},get missing(){return t.getMissingHandler()},set missing(e){t.setMissingHandler(e)},get silentTranslationWarn(){return w(t.missingWarn)?!t.missingWarn:t.missingWarn},set silentTranslationWarn(e){t.missingWarn=w(e)?!e:e},get silentFallbackWarn(){return w(t.fallbackWarn)?!t.fallbackWarn:t.fallbackWarn},set silentFallbackWarn(e){t.fallbackWarn=w(e)?!e:e},get modifiers(){return t.modifiers},get formatFallbackMessages(){return t.fallbackFormat},set formatFallbackMessages(e){t.fallbackFormat=e},get postTranslation(){return t.getPostTranslationHandler()},set postTranslation(e){t.setPostTranslationHandler(e)},get sync(){return t.inheritLocale},set sync(e){t.inheritLocale=e},get warnHtmlInMessage(){return t.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(e){t.warnHtmlMessage="off"!==e},get escapeParameterHtml(){return t.escapeParameter},set escapeParameterHtml(e){t.escapeParameter=e},get preserveDirectiveContent(){return!0},set preserveDirectiveContent(e){},get pluralizationRules(){return t.pluralRules||{}},__composer:t,t(...e){const[n,r,o]=e,i={};let s=null,a=null;if(!E(n))throw Hn(Vn.INVALID_ARGUMENT);const l=n;return E(r)?i.locale=r:b(r)?s=r:O(r)&&(a=r),b(o)?s=o:O(o)&&(a=o),Reflect.apply(t.t,t,[l,s||a||{},i])},rt(...e){return Reflect.apply(t.rt,t,[...e])},tc(...e){const[n,r,o]=e,i={plural:1};let s=null,l=null;if(!E(n))throw Hn(Vn.INVALID_ARGUMENT);const u=n;return E(r)?i.locale=r:a(r)?i.plural=r:b(r)?s=r:O(r)&&(l=r),E(o)?i.locale=o:b(o)?s=o:O(o)&&(l=o),Reflect.apply(t.t,t,[u,s||l||{},i])},te(e,n){return t.te(e,n)},tm(e){return t.tm(e)},getLocaleMessage(e){return t.getLocaleMessage(e)},setLocaleMessage(e,n){t.setLocaleMessage(e,n)},mergeLocaleMessage(e,n){t.mergeLocaleMessage(e,n)},d(...e){return Reflect.apply(t.d,t,[...e])},getDateTimeFormat(e){return t.getDateTimeFormat(e)},setDateTimeFormat(e,n){t.setDateTimeFormat(e,n)},mergeDateTimeFormat(e,n){t.mergeDateTimeFormat(e,n)},n(...e){return Reflect.apply(t.n,t,[...e])},getNumberFormat(e){return t.getNumberFormat(e)},setNumberFormat(e,n){t.setNumberFormat(e,n)},mergeNumberFormat(e,n){t.mergeNumberFormat(e,n)},getChoiceIndex(e,t){return-1}};return r.__extender=n,r}}const cr={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>"parent"===e||"global"===e,default:"parent"},i18n:{type:Object}};function dr({slots:e},t){if(1===t.length&&"default"===t[0]){const t=e.default?e.default():[];return t.reduce(((e,t)=>[...e,...t.type===xn.FK?t.children:[t]]),[])}return t.reduce(((t,n)=>{const r=e[n];return r&&(t[n]=r()),t}),h())}function fr(e){return xn.FK}const hr=(0,xn.pM)({name:"i18n-t",props:d({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>a(e)||!isNaN(e)}},cr),setup(e,t){const{slots:n,attrs:r}=t,o=e.i18n||Ir({useScope:e.scope,__useComponent:!0});return()=>{const i=Object.keys(n).filter((e=>"_"!==e)),s=h();e.locale&&(s.locale=e.locale),void 0!==e.plural&&(s.plural=E(e.plural)?+e.plural:e.plural);const a=dr(t,i),l=o[Wn](e.keypath,a,s),u=d(h(),r),c=E(e.tag)||S(e.tag)?e.tag:fr();return(0,xn.h)(c,u,l)}}}),pr=hr;function mr(e){return b(e)&&!E(e[0])}function vr(e,t,n,r){const{slots:o,attrs:i}=t;return()=>{const t={part:!0};let s=h();e.locale&&(t.locale=e.locale),E(e.format)?t.key=e.format:S(e.format)&&(E(e.format.key)&&(t.key=e.format.key),s=Object.keys(e.format).reduce(((t,r)=>n.includes(r)?d(h(),t,{[r]:e.format[r]}):t),h()));const a=r(e.value,t,s);let l=[t.key];b(a)?l=a.map(((e,t)=>{const n=o[e.type],r=n?n({[e.type]:e.value,index:t,parts:a}):[e.value];return mr(r)&&(r[0].key=`${e.type}-${t}`),r})):E(a)&&(l=[a]);const u=d(h(),i),c=E(e.tag)||S(e.tag)?e.tag:fr();return(0,xn.h)(c,u,l)}}const gr=(0,xn.pM)({name:"i18n-n",props:d({value:{type:Number,required:!0},format:{type:[String,Object]}},cr),setup(e,t){const n=e.i18n||Ir({useScope:e.scope,__useComponent:!0});return vr(e,t,In,((...e)=>n[Xn](...e)))}}),yr=gr,br=(0,xn.pM)({name:"i18n-d",props:d({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},cr),setup(e,t){const n=e.i18n||Ir({useScope:e.scope,__useComponent:!0});return vr(e,t,kn,((...e)=>n[Gn](...e)))}}),_r=br;function Er(e,t){const n=e;if("composition"===e.mode)return n.__getInstance(t)||e.global;{const r=n.__getInstance(t);return null!=r?r.__composer:e.global.__composer}}function wr(e){const t=t=>{const{instance:n,modifiers:r,value:o}=t;if(!n||!n.$)throw Hn(Vn.UNEXPECTED_ERROR);const i=Er(e,n.$);const s=Sr(o);return[Reflect.apply(i.t,i,[...Tr(s)]),i]},n=(n,o)=>{const[i,s]=t(o);r&&e.global===s&&(n.__i18nWatcher=(0,xn.wB)(s.locale,(()=>{o.instance&&o.instance.$forceUpdate()}))),n.__composer=s,n.textContent=i},o=e=>{r&&e.__i18nWatcher&&(e.__i18nWatcher(),e.__i18nWatcher=void 0,delete e.__i18nWatcher),e.__composer&&(e.__composer=void 0,delete e.__composer)},i=(e,{value:t})=>{if(e.__composer){const n=e.__composer,r=Sr(t);e.textContent=Reflect.apply(n.t,n,[...Tr(r)])}},s=e=>{const[n]=t(e);return{textContent:n}};return{created:n,unmounted:o,beforeUpdate:i,getSSRProps:s}}function Sr(e){if(E(e))return{path:e};if(O(e)){if(!("path"in e))throw Hn(Vn.REQUIRED_VALUE,"path");return e}throw Hn(Vn.INVALID_VALUE)}function Tr(e){const{path:t,locale:n,args:r,choice:o,plural:i}=e,s={},l=r||{};return E(n)&&(s.locale=n),a(o)&&(s.plural=o),a(i)&&(s.plural=i),[t,l,s]}function Cr(e,t,...n){const r=O(n[0])?n[0]:{},o=!!r.useI18nComponentName,i=!w(r.globalInstall)||r.globalInstall;i&&([o?"i18n":pr.name,"I18nT"].forEach((t=>e.component(t,pr))),[yr.name,"I18nN"].forEach((t=>e.component(t,yr))),[_r.name,"I18nD"].forEach((t=>e.component(t,_r)))),e.directive("t",wr(t))}function kr(e,t,n){return{beforeCreate(){const r=(0,xn.nI)();if(!r)throw Hn(Vn.UNEXPECTED_ERROR);const o=this.$options;if(o.i18n){const r=o.i18n;if(o.__i18n&&(r.__i18n=o.__i18n),r.__root=t,this===this.$root)this.$i18n=Or(e,r);else{r.__injectWithOption=!0,r.__extender=n.__vueI18nExtend,this.$i18n=ur(r);const e=this.$i18n;e.__extender&&(e.__disposer=e.__extender(this.$i18n))}}else if(o.__i18n)if(this===this.$root)this.$i18n=Or(e,o);else{this.$i18n=ur({__i18n:o.__i18n,__injectWithOption:!0,__extender:n.__vueI18nExtend,__root:t});const e=this.$i18n;e.__extender&&(e.__disposer=e.__extender(this.$i18n))}else this.$i18n=e;o.__i18nGlobal&&Zn(t,o,o),this.$t=(...e)=>this.$i18n.t(...e),this.$rt=(...e)=>this.$i18n.rt(...e),this.$tc=(...e)=>this.$i18n.tc(...e),this.$te=(e,t)=>this.$i18n.te(e,t),this.$d=(...e)=>this.$i18n.d(...e),this.$n=(...e)=>this.$i18n.n(...e),this.$tm=e=>this.$i18n.tm(e),n.__setInstance(r,this.$i18n)},mounted(){0},unmounted(){const e=(0,xn.nI)();if(!e)throw Hn(Vn.UNEXPECTED_ERROR);const t=this.$i18n;delete this.$t,delete this.$rt,delete this.$tc,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,t.__disposer&&(t.__disposer(),delete t.__disposer,delete t.__extender),n.__deleteInstance(e),delete this.$i18n}}}function Or(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[Kn](t.pluralizationRules||e.pluralizationRules);const n=Qn(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(n).forEach((t=>e.mergeLocaleMessage(t,n[t]))),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach((n=>e.mergeDateTimeFormat(n,t.datetimeFormats[n]))),t.numberFormats&&Object.keys(t.numberFormats).forEach((n=>e.mergeNumberFormat(n,t.numberFormats[n]))),e}const Ar=o("global-vue-i18n");function Rr(e={},t){const n=__VUE_I18N_LEGACY_API__&&w(e.legacy)?e.legacy:__VUE_I18N_LEGACY_API__,r=!w(e.globalInjection)||e.globalInjection,i=!__VUE_I18N_LEGACY_API__||!n||!!e.allowComposition,s=new Map,[a,l]=Lr(e,n),u=o("");function c(e){return s.get(e)||null}function d(e,t){s.set(e,t)}function f(e){s.delete(e)}{const e={get mode(){return __VUE_I18N_LEGACY_API__&&n?"legacy":"composition"},get allowComposition(){return i},async install(t,...o){if(t.__VUE_I18N_SYMBOL__=u,t.provide(t.__VUE_I18N_SYMBOL__,e),O(o[0])){const t=o[0];e.__composerExtend=t.__composerExtend,e.__vueI18nExtend=t.__vueI18nExtend}let i=null;!n&&r&&(i=Br(t,e.global)),__VUE_I18N_FULL_INSTALL__&&Cr(t,e,...o),__VUE_I18N_LEGACY_API__&&n&&t.mixin(kr(l,l.__composer,e));const s=t.unmount;t.unmount=()=>{i&&i(),e.dispose(),s()}},get global(){return l},dispose(){a.stop()},__instances:s,__getInstance:c,__setInstance:d,__deleteInstance:f};return e}}function Ir(e={}){const t=(0,xn.nI)();if(null==t)throw Hn(Vn.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&null!=t.appContext.app&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw Hn(Vn.NOT_INSTALLED);const n=Nr(t),r=Pr(n),o=Jn(t),i=xr(e,o);if(__VUE_I18N_LEGACY_API__&&"legacy"===n.mode&&!e.__useComponent){if(!n.allowComposition)throw Hn(Vn.NOT_AVAILABLE_IN_LEGACY_MODE);return $r(t,i,r,e)}if("global"===i)return Zn(r,e,o),r;if("parent"===i){let o=Mr(n,t,e.__useComponent);return null==o&&(o=r),o}const s=n;let a=s.__getInstance(t);if(null==a){const n=d({},e);"__i18n"in o&&(n.__i18n=o.__i18n),r&&(n.__root=r),a=ar(n),s.__composerExtend&&(a[zn]=s.__composerExtend(a)),Fr(s,t,a),s.__setInstance(t,a)}return a}function Lr(e,t,n){const r=(0,Pn.uY)();{const n=__VUE_I18N_LEGACY_API__&&t?r.run((()=>ur(e))):r.run((()=>ar(e)));if(null==n)throw Hn(Vn.UNEXPECTED_ERROR);return[r,n]}}function Nr(e){{const t=(0,xn.WQ)(e.isCE?Ar:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw Hn(e.isCE?Vn.NOT_INSTALLED_WITH_PROVIDE:Vn.UNEXPECTED_ERROR);return t}}function xr(e,t){return c(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function Pr(e){return"composition"===e.mode?e.global:e.global.__composer}function Mr(e,t,n=!1){let r=null;const o=t.root;let i=Dr(t,n);while(null!=i){const t=e;if("composition"===e.mode)r=t.__getInstance(i);else if(__VUE_I18N_LEGACY_API__){const e=t.__getInstance(i);null!=e&&(r=e.__composer,n&&r&&!r[qn]&&(r=null))}if(null!=r)break;if(o===i)break;i=i.parent}return r}function Dr(e,t=!1){return null==e?null:t&&e.vnode.ctx||e.parent}function Fr(e,t,n){(0,xn.sV)((()=>{0}),t),(0,xn.hi)((()=>{const r=n;e.__deleteInstance(t);const o=r[zn];o&&(o(),delete r[zn])}),t)}function $r(e,t,n,r={}){const o="local"===t,i=(0,Pn.IJ)(null);if(o&&e.proxy&&!e.proxy.$options.i18n&&!e.proxy.$options.__i18n)throw Hn(Vn.MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION);const s=w(r.inheritLocale)?r.inheritLocale:!E(r.locale),a=(0,Pn.KR)(!o||s?n.locale.value:E(r.locale)?r.locale:Mt),l=(0,Pn.KR)(!o||s?n.fallbackLocale.value:E(r.fallbackLocale)||b(r.fallbackLocale)||O(r.fallbackLocale)||!1===r.fallbackLocale?r.fallbackLocale:a.value),c=(0,Pn.KR)(Qn(a.value,r)),d=(0,Pn.KR)(O(r.datetimeFormats)?r.datetimeFormats:{[a.value]:{}}),f=(0,Pn.KR)(O(r.numberFormats)?r.numberFormats:{[a.value]:{}}),h=o?n.missingWarn:!w(r.missingWarn)&&!u(r.missingWarn)||r.missingWarn,p=o?n.fallbackWarn:!w(r.fallbackWarn)&&!u(r.fallbackWarn)||r.fallbackWarn,m=o?n.fallbackRoot:!w(r.fallbackRoot)||r.fallbackRoot,v=!!r.fallbackFormat,g=_(r.missing)?r.missing:null,y=_(r.postTranslation)?r.postTranslation:null,S=o?n.warnHtmlMessage:!w(r.warnHtmlMessage)||r.warnHtmlMessage,T=!!r.escapeParameter,C=o?n.modifiers:O(r.modifiers)?r.modifiers:{},k=r.pluralRules||o&&n.pluralRules;function A(){return[a.value,l.value,c.value,d.value,f.value]}const R=(0,xn.EW)({get:()=>i.value?i.value.locale.value:a.value,set:e=>{i.value&&(i.value.locale.value=e),a.value=e}}),I=(0,xn.EW)({get:()=>i.value?i.value.fallbackLocale.value:l.value,set:e=>{i.value&&(i.value.fallbackLocale.value=e),l.value=e}}),L=(0,xn.EW)((()=>i.value?i.value.messages.value:c.value)),N=(0,xn.EW)((()=>d.value)),x=(0,xn.EW)((()=>f.value));function P(){return i.value?i.value.getPostTranslationHandler():y}function M(e){i.value&&i.value.setPostTranslationHandler(e)}function D(){return i.value?i.value.getMissingHandler():g}function F(e){i.value&&i.value.setMissingHandler(e)}function $(e){return A(),e()}function j(...e){return i.value?$((()=>Reflect.apply(i.value.t,null,[...e]))):$((()=>""))}function U(...e){return i.value?Reflect.apply(i.value.rt,null,[...e]):""}function B(...e){return i.value?$((()=>Reflect.apply(i.value.d,null,[...e]))):$((()=>""))}function V(...e){return i.value?$((()=>Reflect.apply(i.value.n,null,[...e]))):$((()=>""))}function H(e){return i.value?i.value.tm(e):{}}function W(e,t){return!!i.value&&i.value.te(e,t)}function G(e){return i.value?i.value.getLocaleMessage(e):{}}function X(e,t){i.value&&(i.value.setLocaleMessage(e,t),c.value[e]=t)}function K(e,t){i.value&&i.value.mergeLocaleMessage(e,t)}function q(e){return i.value?i.value.getDateTimeFormat(e):{}}function z(e,t){i.value&&(i.value.setDateTimeFormat(e,t),d.value[e]=t)}function Y(e,t){i.value&&i.value.mergeDateTimeFormat(e,t)}function Q(e){return i.value?i.value.getNumberFormat(e):{}}function J(e,t){i.value&&(i.value.setNumberFormat(e,t),f.value[e]=t)}function Z(e,t){i.value&&i.value.mergeNumberFormat(e,t)}const ee={get id(){return i.value?i.value.id:-1},locale:R,fallbackLocale:I,messages:L,datetimeFormats:N,numberFormats:x,get inheritLocale(){return i.value?i.value.inheritLocale:s},set inheritLocale(e){i.value&&(i.value.inheritLocale=e)},get availableLocales(){return i.value?i.value.availableLocales:Object.keys(c.value)},get modifiers(){return i.value?i.value.modifiers:C},get pluralRules(){return i.value?i.value.pluralRules:k},get isGlobal(){return!!i.value&&i.value.isGlobal},get missingWarn(){return i.value?i.value.missingWarn:h},set missingWarn(e){i.value&&(i.value.missingWarn=e)},get fallbackWarn(){return i.value?i.value.fallbackWarn:p},set fallbackWarn(e){i.value&&(i.value.missingWarn=e)},get fallbackRoot(){return i.value?i.value.fallbackRoot:m},set fallbackRoot(e){i.value&&(i.value.fallbackRoot=e)},get fallbackFormat(){return i.value?i.value.fallbackFormat:v},set fallbackFormat(e){i.value&&(i.value.fallbackFormat=e)},get warnHtmlMessage(){return i.value?i.value.warnHtmlMessage:S},set warnHtmlMessage(e){i.value&&(i.value.warnHtmlMessage=e)},get escapeParameter(){return i.value?i.value.escapeParameter:T},set escapeParameter(e){i.value&&(i.value.escapeParameter=e)},t:j,getPostTranslationHandler:P,setPostTranslationHandler:M,getMissingHandler:D,setMissingHandler:F,rt:U,d:B,n:V,tm:H,te:W,getLocaleMessage:G,setLocaleMessage:X,mergeLocaleMessage:K,getDateTimeFormat:q,setDateTimeFormat:z,mergeDateTimeFormat:Y,getNumberFormat:Q,setNumberFormat:J,mergeNumberFormat:Z};function te(e){e.locale.value=a.value,e.fallbackLocale.value=l.value,Object.keys(c.value).forEach((t=>{e.mergeLocaleMessage(t,c.value[t])})),Object.keys(d.value).forEach((t=>{e.mergeDateTimeFormat(t,d.value[t])})),Object.keys(f.value).forEach((t=>{e.mergeNumberFormat(t,f.value[t])})),e.escapeParameter=T,e.fallbackFormat=v,e.fallbackRoot=m,e.fallbackWarn=p,e.missingWarn=h,e.warnHtmlMessage=S}return(0,xn.KC)((()=>{if(null==e.proxy||null==e.proxy.$i18n)throw Hn(Vn.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const n=i.value=e.proxy.$i18n.__composer;"global"===t?(a.value=n.locale.value,l.value=n.fallbackLocale.value,c.value=n.messages.value,d.value=n.datetimeFormats.value,f.value=n.numberFormats.value):o&&te(n)})),ee}const jr=["locale","fallbackLocale","availableLocales"],Ur=["t","rt","d","n","tm","te"];function Br(e,t){const n=Object.create(null);jr.forEach((e=>{const r=Object.getOwnPropertyDescriptor(t,e);if(!r)throw Hn(Vn.UNEXPECTED_ERROR);const o=(0,Pn.i9)(r.value)?{get(){return r.value.value},set(e){r.value.value=e}}:{get(){return r.get&&r.get()}};Object.defineProperty(n,e,o)})),e.config.globalProperties.$i18n=n,Ur.forEach((n=>{const r=Object.getOwnPropertyDescriptor(t,n);if(!r||!r.value)throw Hn(Vn.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${n}`,r)}));const r=()=>{delete e.config.globalProperties.$i18n,Ur.forEach((t=>{delete e.config.globalProperties[`$${t}`]}))};return r}if(Dn(),__INTLIFY_JIT_COMPILATION__?Vt(hn):Vt(fn),Ht(rt),Wt(Rt),__INTLIFY_PROD_DEVTOOLS__){const e=m();e.__INTLIFY__=!0,pt(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}},7040:function(e,t,n){"use strict";var r=n(4495);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},7055:function(e,t,n){"use strict";var r=n(9504),o=n(9039),i=n(2195),s=Object,a=r("".split);e.exports=o((function(){return!s("z").propertyIsEnumerable(0)}))?function(e){return"String"===i(e)?a(e,""):s(e)}:s},7059:function(e,t,n){"use strict";const r=n(560),o=(e,t,n)=>r(e,t,n)<0;e.exports=o},7075:function(e,t,n){"use strict";const r=n(3908),o=n(3904),{ANY:i}=o,s=n(8311),a=n(7638),l=n(5580),u=n(7059),c=n(5200),d=n(4089),f=(e,t,n,f)=>{let h,p,m,v,g;switch(e=new r(e,f),t=new s(t,f),n){case">":h=l,p=c,m=u,v=">",g=">=";break;case"<":h=u,p=d,m=l,v="<",g="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(a(e,t,f))return!1;for(let r=0;r{e.semver===i&&(e=new o(">=0.0.0")),s=s||e,a=a||e,h(e.semver,s.semver,f)?s=e:m(e.semver,a.semver,f)&&(a=e)})),s.operator===v||s.operator===g)return!1;if((!a.operator||a.operator===v)&&p(e,a.semver))return!1;if(a.operator===g&&m(e,a.semver))return!1}return!0};e.exports=f},7272:function(e){"use strict";const t="object"===typeof process&&{NODE_ENV:"production",BASE_URL:""}.NODE_DEBUG&&/\bsemver\b/i.test({NODE_ENV:"production",BASE_URL:""}.NODE_DEBUG)?(...e)=>console.error("SEMVER",...e):()=>{};e.exports=t},7347:function(e,t,n){"use strict";var r=n(3724),o=n(9565),i=n(8773),s=n(6980),a=n(5397),l=n(6969),u=n(9297),c=n(5917),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=a(e),t=l(t),c)try{return d(e,t)}catch(n){}if(u(e,t))return s(!o(i.f,e,t),e[t])}},7414:function(e,t,n){"use strict";const r=n(144),o=(e,t)=>{const n=r(e.trim().replace(/^[=v]+/,""),t);return n?n.version:null};e.exports=o},7423:function(e,t,n){"use strict";n.d(t,{A:function(){return d}});var r=n(641),o=n(33);const i=["src"],s={key:1,xmlns:"http://www.w3.org/2000/svg",viewBox:"2 2 20 20"};function a(e,t,n,a,l,u){return(0,r.uX)(),(0,r.CE)("div",null,[(0,r.Lk)("figure",{class:(0,o.C4)(u.computedClass)},[n.src?((0,r.uX)(),(0,r.CE)("img",{key:0,src:n.src,loading:"lazy",alt:""},null,8,i)):((0,r.uX)(),(0,r.CE)("svg",s,t[0]||(t[0]=[(0,r.Lk)("path",{d:"M4 4h7V2H4a2 2 0 0 0-2 2v7h2V4zm6 9-4 5h12l-3-4-2 2.7-3-3.7zm7-4.5a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0zM20 2h-7v2h7v7h2V4a2 2 0 0 0-2-2zm0 18h-7v2h7a2 2 0 0 0 2-2v-7h-2v7zM4 13H2v7c0 1.1.9 2 2 2h7v-2H4v-7z"},null,-1)])))],2)])}var l={props:{src:String,componentClass:String},computed:{computedClass:e=>({"package-logo--fallback":!e.src,[e.componentClass]:!!e.componentClass,[`${e.componentClass}--fallback`]:!!e.componentClass&&!e.src})}},u=n(6262);const c=(0,u.A)(l,[["render",a],["__scopeId","data-v-9c1c5f6c"]]);var d=c},7476:function(e,t,n){"use strict";var r=n(2195),o=n(9504);e.exports=function(e){if("Function"===r(e))return o(e)}},7566:function(e,t,n){"use strict";var r=n(6840),o=n(9504),i=n(655),s=n(2812),a=URLSearchParams,l=a.prototype,u=o(l.getAll),c=o(l.has),d=new a("a=1");!d.has("a",2)&&d.has("a",void 0)||r(l,"has",(function(e){var t=arguments.length,n=t<2?void 0:arguments[1];if(t&&void 0===n)return c(this,e);var r=u(this,e);s(t,1);var o=i(n),a=0;while(anew r(e,t).set.map((e=>e.map((e=>e.value)).join(" ").trim().split(" ")));e.exports=o},7638:function(e,t,n){"use strict";const r=n(8311),o=(e,t,n)=>{try{t=new r(t,n)}catch(o){return!1}return t.test(e)};e.exports=o},7657:function(e,t,n){"use strict";var r,o,i,s=n(9039),a=n(4901),l=n(34),u=n(2360),c=n(2787),d=n(6840),f=n(8227),h=n(6395),p=f("iterator"),m=!1;[].keys&&(i=[].keys(),"next"in i?(o=c(c(i)),o!==Object.prototype&&(r=o)):m=!0);var v=!l(r)||s((function(){var e={};return r[p].call(e)!==e}));v?r={}:h&&(r=u(r)),a(r[p])||d(r,p,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:m}},7740:function(e,t,n){"use strict";var r=n(9297),o=n(5031),i=n(7347),s=n(4913);e.exports=function(e,t,n){for(var a=o(t),l=s.f,u=i.f,c=0;c[(0,r.bF)(R,{placeholder:e.$tc("ui.discover.searchPlaceholder",e.extensionCount),class:"package-search__input"},null,8,["placeholder"])])),default:(0,r.k6)((()=>[e.searching&&!e.results?((0,r.uX)(),(0,r.Wv)(I,{key:0,class:"package-search__status package-search__status--loader"},{default:(0,r.k6)((()=>[(0,r.Lk)("p",s,(0,o.v_)(e.$t("ui.discover.loading")),1)])),_:1})):e.offline||null===e.discover?((0,r.uX)(),(0,r.CE)("div",a,[(0,r.Lk)("p",l,(0,o.v_)(e.$t("ui.discover.offline")),1),(0,r.Lk)("p",u,(0,o.v_)(e.$t("ui.discover.offlineExplain")),1),(0,r.Lk)("button",{class:"widget-button widget-button--inline widget-button--update",onClick:t[0]||(t[0]=(...e)=>A.getOnline&&A.getOnline(...e))},(0,o.v_)(e.$t("ui.discover.offlineButton")),1)])):e.isSearching&&e.results&&!Object.keys(e.results).length?((0,r.uX)(),(0,r.CE)("div",c,[(0,r.bF)(L,{keypath:"ui.discover.empty",tag:"p",class:"package-search__title"},{query:(0,r.k6)((()=>[(0,r.Lk)("i",null,(0,o.v_)(e.query),1)])),_:1})])):e.isSearching?((0,r.uX)(),(0,r.CE)(r.FK,{key:3},[e.query?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.Wv)(N,{key:0})),e.exactHit?((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("h2",d,(0,o.v_)(e.$t("ui.discover.exactHit")),1),(0,r.Lk)("div",f,[(0,r.bF)(x,{class:"package-search__item",data:e.exactHit},{hint:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-hint",{data:e.exactHit})])),actions:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-actions",{data:e.exactHit})])),_:3},8,["data"])]),(0,r.Lk)("h2",h,(0,o.v_)(e.$t("ui.discover.results")),1)],64)):(0,r.Q3)("",!0),(0,r.Lk)("div",p,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.results,(t=>((0,r.uX)(),(0,r.Wv)(x,{class:"package-search__item",data:t,key:t.name},{hint:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-hint",{data:t})])),actions:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-actions",{data:t})])),_:2},1032,["data"])))),128))]),(0,r.Lk)("div",m,[e.hasMore?((0,r.uX)(),(0,r.Wv)(P,{key:0,inline:"",icon:"search",loading:e.searching,onClick:e.loadMore},{default:(0,r.k6)((()=>[(0,r.eW)((0,o.v_)(e.$t("ui.discover.more")),1)])),_:1},8,["loading","onClick"])):(0,r.Q3)("",!0)])],64)):((0,r.uX)(),(0,r.CE)("div",v,[e.discover.ads.length?((0,r.uX)(),(0,r.Wv)(M,{key:0})):(0,r.Q3)("",!0),(0,r.Lk)("h2",g,(0,o.v_)(e.$t("ui.discover.latestPackages")),1),(0,r.Lk)("div",y,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.discover.latest,(t=>((0,r.uX)(),(0,r.Wv)(x,{class:"package-search__item",data:t,key:t.name},{hint:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-hint",{data:t})])),actions:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-actions",{data:t})])),_:2},1032,["data"])))),128))]),(0,r.Lk)("div",b,[(0,r.Lk)("button",{class:"package-search__more-button",onClick:t[1]||(t[1]=e=>A.openSearch("latest"))},(0,o.v_)(e.$t("ui.discover.more")),1)]),(0,r.Lk)("h2",_,(0,o.v_)(e.$t("ui.discover.faversPackages")),1),(0,r.Lk)("div",E,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.discover.favers,(t=>((0,r.uX)(),(0,r.Wv)(x,{class:"package-search__item",data:t,key:t.name},{hint:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-hint",{data:t})])),actions:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-actions",{data:t})])),_:2},1032,["data"])))),128))]),(0,r.Lk)("div",w,[(0,r.Lk)("button",{class:"package-search__more-button",onClick:t[2]||(t[2]=e=>A.openSearch("favers"))},(0,o.v_)(e.$t("ui.discover.more")),1)]),(0,r.Lk)("h2",S,(0,o.v_)(e.$t("ui.discover.downloadsPackages")),1),(0,r.Lk)("div",T,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.discover.downloads,(t=>((0,r.uX)(),(0,r.Wv)(x,{class:"package-search__item",data:t,key:t.name},{hint:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-hint",{data:t})])),actions:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"package-actions",{data:t})])),_:2},1032,["data"])))),128))]),(0,r.Lk)("div",C,[(0,r.Lk)("button",{class:"package-search__more-button",onClick:t[3]||(t[3]=e=>A.openSearch("downloads"))},(0,o.v_)(e.$t("ui.discover.more")),1)])])),t[4]||(t[4]=(0,r.Lk)("a",{href:"https://www.algolia.com/",target:"_blank",class:"package-search__algolia"},[(0,r.Lk)("img",{src:i,alt:"Algolia | Fast, Reliable and Modern Search and Discovery",width:"200"})],-1))])),_:3,__:[4]})}var O=n(6278),A=n(1881),R=n(6435),I=n(9045),L=n(3751);const N={class:"ads"},x={key:0,class:"container"},P=["href","title","onClick"],M=["src"],D=["href","title"],F=["src"],$={key:1,class:"link"},j={href:"https://contao.org/de/anzeigen-erweiterungsliste.html",target:"_blank"},U={key:2,class:"link"},B={href:"https://contao.org/en/extension-ads.html",target:"_blank"};function V(e,t,n,i,s,a){const l=(0,r.g2)("vueper-slide"),u=(0,r.g2)("vueper-slides");return(0,r.uX)(),(0,r.CE)("div",N,[e.ads&&e.ads.length>1?((0,r.uX)(),(0,r.CE)("div",x,[(0,r.bF)(u,{class:"no-shadow",autoplay:"",infinite:"",duration:1e4,"slide-ratio":1/4,"visible-slides":2,breakpoints:{630:{slideRatio:.5,visibleSlides:1}},bullets:!1,touchable:!1,"arrows-outside":!1},{default:(0,r.k6)((()=>[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.ads,(t=>((0,r.uX)(),(0,r.Wv)(l,{key:t.objectID},{content:(0,r.k6)((()=>[t.package?((0,r.uX)(),(0,r.CE)("a",{key:0,href:e.$router.resolve({query:{p:t.package}}).href,title:t.title,onClick:(0,L.D$)((n=>e.setCurrent(t.package)),["prevent"])},[(0,r.Lk)("img",{src:t.image,alt:""},null,8,M)],8,P)):((0,r.uX)(),(0,r.CE)("a",{key:1,href:t.url,title:t.title,target:"_blank",rel:"noreferrer noopener"},[(0,r.Lk)("img",{src:t.image,alt:""},null,8,F)],8,D))])),_:2},1024)))),128))])),_:1})])):(0,r.Q3)("",!0),"de"===e.$i18n.locale?((0,r.uX)(),(0,r.CE)("div",$,[(0,r.Lk)("a",j,(0,o.v_)(e.$t("ui.discover.advertisement")),1)])):((0,r.uX)(),(0,r.CE)("div",U,[(0,r.Lk)("a",B,(0,o.v_)(e.$t("ui.discover.advertisement")),1)]))])}const H=["src"],W=["src"],G=["src"],X=["src"],K=["src"],q={key:2},z={class:"vueperslide__content-wrapper"},Y=["innerHTML"],Q=["innerHTML"],J={class:"vueperslide__content-wrapper"},Z=["innerHTML"],ee=["innerHTML"],te={key:4,class:"vueperslide__loader"};function ne(e,t,n,i,s,a){return(0,r.uX)(),(0,r.Wv)((0,r.$y)(n.link?"a":"div"),{class:(0,o.C4)(["vueperslide",a.slideClasses]),href:!(!n.link||a.justDragged)&&n.link,target:n.link&&n.openInNew?"boolean"==typeof n.openInNew?"_blank":n.openInNew:"_self",face:a.slideFace3d,style:(0,o.Tr)(a.slideStyles),"aria-hidden":a.slides.activeId===e._.uid||a.isSlideVisible?"false":"true",onMouseenter:t[0]||(t[0]=t=>e.$emit("mouse-enter",{slideIndex:a.slideIndex,title:n.title,content:n.content,image:n.image,link:n.link},e.$el)),onMouseleave:t[1]||(t[1]=t=>e.$emit("mouse-leave"))},{default:(0,r.k6)((()=>[a.videoObj?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[a.videoObj.webm||a.videoObj.mp4?((0,r.uX)(),(0,r.CE)("video",(0,r.v6)({key:0,class:"vueperslide__video",width:"100%",height:"100%"},a.videoObj.props||{}),[a.videoObj.webm?((0,r.uX)(),(0,r.CE)("source",{key:0,src:a.videoObj.webm,type:"video/webm"},null,8,H)):(0,r.Q3)("",!0),a.videoObj.mp4?((0,r.uX)(),(0,r.CE)("source",{key:1,src:a.videoObj.mp4,type:"video/mp4"},null,8,W)):(0,r.Q3)("",!0),a.videoObj.ogv?((0,r.uX)(),(0,r.CE)("source",{key:2,src:a.videoObj.ogv,type:"video/ogg"},null,8,G)):(0,r.Q3)("",!0),a.videoObj.avi?((0,r.uX)(),(0,r.CE)("source",{key:3,src:a.videoObj.avi,type:"video/avi"},null,8,X)):(0,r.Q3)("",!0),(0,r.eW)((0,o.v_)(a.videoObj.alt||"Sorry, your browser doesn't support embedded videos."),1)],16)):a.videoObj.url?((0,r.uX)(),(0,r.CE)("iframe",(0,r.v6)({key:1,class:"vueperslide__video",src:a.videoObj.url,type:"text/html",frameborder:"0",width:"100%",height:"100%"},a.videoObj.props||{}),null,16,K)):(0,r.Q3)("",!0)],64)):(0,r.Q3)("",!0),e.imageSrc&&a.conf.slideImageInside?((0,r.uX)(),(0,r.CE)("div",{key:1,class:"vueperslide__image",style:(0,o.Tr)(a.imageStyles)},null,4)):(0,r.Q3)("",!0),a.conf.slideContentOutside?(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",q,[(0,r.RG)(e.$slots,"content",{},(()=>[(0,r.Lk)("div",z,[n.title?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"vueperslide__title",innerHTML:n.title},null,8,Y)):(0,r.Q3)("",!0),n.content?((0,r.uX)(),(0,r.CE)("div",{key:1,class:"vueperslide__content",innerHTML:n.content},null,8,Q)):(0,r.Q3)("",!0)])]))],512)),[[L.aG,!1]]):(0,r.RG)(e.$slots,"content",{key:3},(()=>[(0,r.Lk)("div",J,[n.title?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"vueperslide__title",innerHTML:n.title},null,8,Z)):(0,r.Q3)("",!0),n.content?((0,r.uX)(),(0,r.CE)("div",{key:1,class:"vueperslide__content",innerHTML:n.content},null,8,ee)):(0,r.Q3)("",!0)])])),a.conf.lazy&&!e.loaded?((0,r.uX)(),(0,r.CE)("div",te,[(0,r.RG)(e.$slots,"loader")])):(0,r.Q3)("",!0)])),_:3},40,["href","target","class","face","style","aria-hidden"])}const re=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},oe={inject:["slides","touch","updateSlide","addClone","addSlide","removeSlide"],props:{clone:{type:Boolean},image:{type:String,default:""},video:{type:[String,Object],default:""},title:{type:String,default:""},content:{type:String,default:""},link:{type:String,default:""},duration:{type:Number,default:0},lazyloaded:{type:Boolean},openInNew:{type:[Boolean,String]}},emits:["mouse-enter","mouse-leave"],data:()=>({imageSrc:"",loading:!1,loaded:!1}),computed:{conf(){return this.$parent.conf},slideClasses(){return{"vueperslide--active":this.slides.activeId===this._.uid,"vueperslide--previous-slide":this.isPreviousSlide,"vueperslide--next-slide":this.isNextSlide,"vueperslide--visible":this.isSlideVisible,"vueperslide--loading":this.conf.lazy&&!this.loaded,"vueperslide--has-video":this.videoObj,"vueperslide--has-image-inside":this.conf.slideImageInside,"vueperslide--no-pointer-events":this.videoObj&&!1===this.videoObj.pointerEvents}},slideStyles(){const{visibleSlides:e,fade:t,slideImageInside:n,gap:r,gapPx:o}=this.conf;return{...!n&&this.imageSrc&&{backgroundImage:`url("${this.imageSrc}")`},...e>1&&{width:(100-(r?r*(e-1):0))/e+"%"},...e>1&&t&&{[this.conf.rtl?"right":"left"]:this.slideIndex%e/e*100+"%"},...r&&{[this.conf.rtl?"marginLeft":"marginRight"]:r+(o?"px":"%")}}},videoObj(){if(!this.video)return null;let e={url:"",alt:"",props:{controls:!0}};return"object"==typeof this.video?e=Object.assign(e,this.video):"string"==typeof this.video&&(e.url=this.video),e},youtubeVideo(){return/youtube\.|youtu\.be/.test(this.videoObj.url)},imageStyles(){return{...this.conf.slideImageInside&&this.imageSrc&&{backgroundImage:`url("${this.imageSrc}")`}}},slideFace3d(){if(!this.conf["3d"])return!1;const e=["front","right","back","left"],t=(this.slides.current-1+this.slidesCount)%this.slidesCount,n=(this.slides.current+1)%this.slidesCount;let r="front";return this.slideIndex===t?r=e[(4+this.slides.current-1)%4]:this.slideIndex===n&&(r=e[(this.slides.current+1)%4]),r=e[this.slideIndex%4],this.conf.rtl&&"left"===r?r="right":this.conf.rtl&&"right"===r&&(r="left"),r},isPreviousSlide(){if(!this.conf["3d"])return!1;const e=(this.slides.current-1+this.slidesCount)%this.slidesCount;return this._.uid===this.slides.list[e].id},isNextSlide(){if(!this.conf["3d"])return!1;const e=(this.slides.current+1)%this.slidesCount;return this._.uid===this.slides.list[e].id},isSlideVisible(){return this.slideIndex>=this.slides.firstVisible&&this.slideIndexe.id))},slidesCount(){return this.slidesList.length},slideIndex(){return this.slidesList.indexOf(this._.uid)},justDragged(){return this.touch.justDragged}},methods:{updateThisSlide(e){this.updateSlide(this._.uid,e)},loadImage(){if(!this.loading&&!this.loaded)return this.loading=!0,new Promise(((e,t)=>{const n=document.createElement("img");n.onload=()=>{this.imageSrc=this.image,this.loading=!1,this.loaded=!0,this.$nextTick((()=>{e({image:this.imageSrc,style:((this.$el.attributes||{}).style||{}).value})}))},n.onerror=(this.loading=!1)||t,n.src=this.image}))},playVideo(){this.videoObj&&(this.videoObj.url?this.$el.querySelector("iframe").contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):this.$el.querySelector("video").play())},pauseVideo(){this.videoObj&&(this.videoObj.url?this.$el.querySelector("iframe").contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*"):this.$el.querySelector("video").pause())}},created(){if(this.imageSrc=this.conf.lazy?"":this.image,this.clone)return this.addClone();this.addSlide({id:this._.uid,image:this.imageSrc,video:this.videoObj&&{...this.videoObj,play:this.playVideo,pause:this.pauseVideo},title:this.title,content:this.content,contentSlot:this.$slots.content,loaderSlot:this.$slots.loader,link:this.link,style:"",loadImage:this.loadImage,duration:this.duration})},mounted(){this.clone||this.updateThisSlide({contentSlot:this.$slots.content,loaderSlot:this.$slots.loader,style:((this.$el.attributes||{}).style||{}).value})},beforeUnmount(){this.clone||this.removeSlide(this._.uid)},watch:{image(){this.imageSrc=this.conf.lazy&&!this.isSlideVisible?"":this.image,this.clone||this.updateThisSlide({image:this.imageSrc,...!this.conf.slideImageInside&&{style:this.slideStyles}})},title(){this.clone||this.updateThisSlide({title:this.title})},content(){this.clone||this.updateThisSlide({content:this.content})},link(){this.clone||this.updateThisSlide({link:this.link})},lazyloaded(){this.clone&&(this.loaded=this.lazyloaded)}}},ie=re(oe,[["render",ne]]),se=["innerHTML"],ae=["innerHTML"],le={class:"vueperslides__inner"},ue={key:0,class:"vueperslides__paused"},ce={key:1,class:"vueperslides__progress"},de={key:2,class:"vueperslides__fractions"},fe={viewBox:"0 0 9 18"},he=["d"],pe={viewBox:"0 0 9 18"},me=["d"],ve={key:4,class:"vueperslides__bullets",ref:"bullets",role:"tablist","aria-label":"Slideshow navigation"},ge=["aria-label","onClick"],ye={class:"default"},be={key:1,class:"vueperslides__bullets vueperslides__bullets--outside",ref:"bullets",role:"tablist","aria-label":"Slideshow navigation"},_e=["aria-label","onClick"],Ee={class:"default"},we=["innerHTML"],Se=["innerHTML"];function Te(e,t,n,i,s,a){const l=(0,r.g2)("vnodes"),u=(0,r.g2)("vueper-slide");return(0,r.uX)(),(0,r.CE)("div",{class:(0,o.C4)(["vueperslides",a.vueperslidesClasses]),ref:"vueperslides","aria-label":"Slideshow",style:(0,o.Tr)(a.vueperslidesStyles)},[a.slidesCount&&"top"===a.conf.slideContentOutside?((0,r.uX)(),(0,r.CE)("div",{key:0,class:(0,o.C4)(["vueperslide__content-wrapper vueperslide__content-wrapper--outside-top",a.conf.slideContentOutsideClass])},[a.currentSlide.contentSlot?((0,r.uX)(),(0,r.Wv)(l,{key:0,vnodes:a.currentSlide.contentSlot()},null,8,["vnodes"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[a.currentSlide.title?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"vueperslide__title",innerHTML:a.currentSlide.title},null,8,se)):(0,r.Q3)("",!0),a.currentSlide.content?((0,r.uX)(),(0,r.CE)("div",{key:1,class:"vueperslide__content",innerHTML:a.currentSlide.content},null,8,ae)):(0,r.Q3)("",!0)],64))],2)):(0,r.Q3)("",!0),(0,r.Lk)("div",le,[(0,r.Lk)("div",{class:"vueperslides__parallax-wrapper",style:(0,o.Tr)(`padding-bottom: ${100*a.conf.slideRatio}%`),"aria-live":"polite"},[(0,r.Lk)("div",{class:(0,o.C4)(["vueperslides__track",{"vueperslides__track--dragging":e.touch.dragging,"vueperslides__track--mousedown":e.mouseDown}]),ref:"track",style:(0,o.Tr)(a.trackStyles)},[(0,r.Lk)("div",{class:"vueperslides__track-inner",style:(0,o.Tr)(a.trackInnerStyles)},[(0,r.RG)(e.$slots,"default"),e.isReady&&a.conf.infinite&&a.canSlide&&a.lastSlide?((0,r.uX)(),(0,r.Wv)(u,{key:0,class:"vueperslide--clone vueperslide--clone-1",clone:"",title:a.lastSlide.title,content:a.lastSlide.content,image:a.lastSlide.image,link:a.lastSlide.link,style:(0,o.Tr)(a.lastSlide.style),lazyloaded:a.lastSlide.loaded,"aria-hidden":"true"},(0,r.eX)({_:2},[a.lastSlide.contentSlot?{name:"content",fn:(0,r.k6)((()=>[(0,r.bF)(l,{vnodes:a.lastSlide.contentSlot()},null,8,["vnodes"])])),key:"0"}:void 0,a.conf.lazy&&!a.lastSlide.loaded&&a.lastSlide.loaderSlot?{name:"loader",fn:(0,r.k6)((()=>[(0,r.bF)(l,{vnodes:a.lastSlide.loaderSlot()},null,8,["vnodes"])])),key:"1"}:void 0]),1032,["title","content","image","link","style","lazyloaded"])):(0,r.Q3)("",!0),e.isReady&&a.conf.infinite&&a.canSlide&&a.firstSlide?((0,r.uX)(),(0,r.Wv)(u,{key:1,class:"vueperslide--clone vueperslide--clone-2",clone:"",title:a.firstSlide.title,content:a.firstSlide.content,image:a.firstSlide.image,link:a.firstSlide.link,style:(0,o.Tr)(a.firstSlide.style),lazyloaded:a.firstSlide.loaded,"aria-hidden":"true"},(0,r.eX)({_:2},[a.firstSlide.contentSlot?{name:"content",fn:(0,r.k6)((()=>[(0,r.bF)(l,{vnodes:a.firstSlide.contentSlot()},null,8,["vnodes"])])),key:"0"}:void 0,a.conf.lazy&&!a.firstSlide.loaded&&a.firstSlide.loaderSlot?{name:"loader",fn:(0,r.k6)((()=>[(0,r.bF)(l,{vnodes:a.firstSlide.loaderSlot()},null,8,["vnodes"])])),key:"1"}:void 0]),1032,["title","content","image","link","style","lazyloaded"])):(0,r.Q3)("",!0)],4)],6)],4),(a.conf.pauseOnHover||a.conf.pauseOnTouch)&&e.$slots.pause?((0,r.uX)(),(0,r.CE)("div",ue,[(0,r.RG)(e.$slots,"pause")])):(0,r.Q3)("",!0),a.conf.progress?((0,r.uX)(),(0,r.CE)("div",ce,[(0,r.RG)(e.$slots,"progress",{current:e.slides.current+1,total:a.slidesCount},(()=>[(0,r.Lk)("div",{style:(0,o.Tr)(`width: ${100*(e.slides.current+1)/a.slidesCount}%`)},null,4)]))])):(0,r.Q3)("",!0),a.conf.fractions?((0,r.uX)(),(0,r.CE)("div",de,[(0,r.RG)(e.$slots,"fraction",{current:e.slides.current+1,total:a.slidesCount},(()=>[(0,r.eW)((0,o.v_)(`${e.slides.current+1} / ${a.slidesCount}`),1)]))])):(0,r.Q3)("",!0),a.conf.arrows&&a.canSlide&&!n.disable?((0,r.uX)(),(0,r.CE)("div",{key:3,class:(0,o.C4)(["vueperslides__arrows",{"vueperslides__arrows--outside":a.conf.arrowsOutside}])},[(0,r.bo)((0,r.Lk)("button",{class:"vueperslides__arrow vueperslides__arrow--prev",type:"button",onClick:t[0]||(t[0]=e=>a.previous()),"aria-label":"Previous",onKeyup:[t[1]||(t[1]=(0,L.jR)((e=>a.conf.rtl?a.next():a.previous()),["left"])),t[2]||(t[2]=(0,L.jR)((e=>a.conf.rtl?a.previous():a.next()),["right"]))]},[(0,r.RG)(e.$slots,"arrow-"+(a.conf.rtl?"right":"left"),{},(()=>[((0,r.uX)(),(0,r.CE)("svg",fe,[(0,r.Lk)("path",{"stroke-linecap":"round",d:a.conf.rtl?"m1 1 l7 8 -7 8":"m8 1 l-7 8 7 8"},null,8,he)]))]))],544),[[L.aG,!a.arrowPrevDisabled]]),(0,r.bo)((0,r.Lk)("button",{class:"vueperslides__arrow vueperslides__arrow--next",type:"button",onClick:t[3]||(t[3]=e=>a.next()),"aria-label":"Next",onKeyup:[t[4]||(t[4]=(0,L.jR)((e=>a.conf.rtl?a.next():a.previous()),["left"])),t[5]||(t[5]=(0,L.jR)((e=>a.conf.rtl?a.previous():a.next()),["right"]))]},[(0,r.RG)(e.$slots,"arrow-"+(a.conf.rtl?"left":"right"),{},(()=>[((0,r.uX)(),(0,r.CE)("svg",pe,[(0,r.Lk)("path",{"stroke-linecap":"round",d:a.conf.rtl?"m8 1 l-7 8 7 8":"m1 1 l7 8 -7 8"},null,8,me)]))]))],544),[[L.aG,!a.arrowNextDisabled]])],2)):(0,r.Q3)("",!0),a.conf.bullets&&a.canSlide&&!n.disable&&!a.conf.bulletsOutside?((0,r.uX)(),(0,r.CE)("div",ve,[(0,r.RG)(e.$slots,"bullets",{currentSlide:e.slides.current,bulletIndexes:a.bulletIndexes,goToSlide:a.goToSlide,previous:a.previous,next:a.next},(()=>[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(a.bulletIndexes,((n,i)=>((0,r.uX)(),(0,r.CE)("button",{class:(0,o.C4)(["vueperslides__bullet",{"vueperslides__bullet--active":e.slides.current===n}]),type:"button",key:i,role:"tab","aria-label":`Slide ${i+1}`,onClick:e=>a.goToSlide(n),onKeyup:[t[6]||(t[6]=(0,L.jR)((e=>a.conf.rtl?a.next():a.previous()),["left"])),t[7]||(t[7]=(0,L.jR)((e=>a.conf.rtl?a.previous():a.next()),["right"]))]},[(0,r.RG)(e.$slots,"bullet",{active:e.slides.current===n,slideIndex:n,index:i+1},(()=>[(0,r.Lk)("div",ye,[(0,r.Lk)("span",null,(0,o.v_)(i+1),1)])]))],42,ge)))),128))]))],512)):(0,r.Q3)("",!0)]),a.conf.bullets&&a.canSlide&&!n.disable&&a.conf.bulletsOutside?((0,r.uX)(),(0,r.CE)("div",be,[(0,r.RG)(e.$slots,"bullets",{currentSlide:e.slides.current,bulletIndexes:a.bulletIndexes,goToSlide:a.goToSlide,previous:a.previous,next:a.next},(()=>[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(a.bulletIndexes,((n,i)=>((0,r.uX)(),(0,r.CE)("button",{class:(0,o.C4)(["vueperslides__bullet",{"vueperslides__bullet--active":e.slides.current===n}]),type:"button",key:i,role:"tab","aria-label":`Slide ${i+1}`,onClick:e=>a.goToSlide(n),onKeyup:[t[8]||(t[8]=(0,L.jR)((e=>a.conf.rtl?a.next():a.previous()),["left"])),t[9]||(t[9]=(0,L.jR)((e=>a.conf.rtl?a.previous():a.next()),["right"]))]},[(0,r.RG)(e.$slots,"bullet",{active:e.slides.current===n,slideIndex:n,index:i+1},(()=>[(0,r.Lk)("div",Ee,[(0,r.Lk)("span",null,(0,o.v_)(i+1),1)])]))],42,_e)))),128))]))],512)):(0,r.Q3)("",!0),a.slidesCount&&"bottom"===a.conf.slideContentOutside?((0,r.uX)(),(0,r.CE)("div",{key:2,class:(0,o.C4)(["vueperslide__content-wrapper vueperslide__content-wrapper--outside-bottom",a.conf.slideContentOutsideClass])},[a.currentSlide.contentSlot?((0,r.uX)(),(0,r.Wv)(l,{key:0,vnodes:a.currentSlide.contentSlot()},null,8,["vnodes"])):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[a.currentSlide.title?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"vueperslide__title",innerHTML:a.currentSlide.title},null,8,we)):(0,r.Q3)("",!0),a.currentSlide.content?((0,r.uX)(),(0,r.CE)("div",{key:1,class:"vueperslide__content",innerHTML:a.currentSlide.content},null,8,Se)):(0,r.Q3)("",!0)],64))],2)):(0,r.Q3)("",!0)],6)}const Ce={name:"vueper-slides",components:{VueperSlide:ie,vnodes:{render(){return this.$attrs.vnodes}}},provide(){return{conf:this.conf,slides:this.slides,touch:this.touch,updateSlide:this.updateSlide,addClone:this.addClone,addSlide:this.addSlide,removeSlide:this.removeSlide}},props:{alwaysRefreshClones:{type:Boolean,default:!1},arrows:{type:Boolean,default:!0},arrowsOutside:{type:Boolean,default:null},autoplay:{type:Boolean,default:!1},breakpoints:{type:Object,default:()=>({})},bullets:{type:Boolean,default:!0},bulletsOutside:{type:Boolean,default:null},disable:{type:Boolean,default:!1},disableArrowsOnEdges:{type:[Boolean,String],default:!1},draggingDistance:{type:Number,default:null},duration:{type:[Number,String],default:4e3},infinite:{type:Boolean,default:!0},fade:{type:Boolean,default:!1},fixedHeight:{type:[Boolean,String],default:!1},fractions:{type:Boolean,default:!1},gap:{type:Number,default:0},initSlide:{type:Number,default:1},lazy:{type:Boolean,default:!1},lazyLoadOnDrag:{type:Boolean,default:!1},pauseOnHover:{type:Boolean,default:!0},pauseOnTouch:{type:Boolean,default:!0},parallax:{type:[Boolean,Number],default:!1},pageScrollingElement:{type:String,default:""},parallaxFixedContent:{type:Boolean,default:!1},preventYScroll:{type:Boolean,default:!1},progress:{type:Boolean,default:!1},rtl:{type:Boolean,default:!1},slideContentOutside:{type:[Boolean,String],default:!1},slideContentOutsideClass:{type:String,default:""},slideImageInside:{type:Boolean,default:!1},slideMultiple:{type:[Boolean,Number],default:!1},slideRatio:{type:Number,default:1/3},touchable:{type:Boolean,default:!0},transitionSpeed:{type:[Number,String],default:600},visibleSlides:{type:Number,default:1},"3d":{type:Boolean,default:!1}},emits:["ready","next","previous","autoplay-pause","autoplay-resume","before-slide","slide","image-loaded","image-failed"],data:()=>({isReady:!1,isPaused:!1,container:null,slides:{list:[],activeId:null,current:0,focus:0,firstVisible:0},mouseDown:!1,mouseOver:!1,touch:{enabled:!0,dragging:!1,lazyloadTriggered:!1,justDragged:!1,dragStartX:0,dragNowX:0,dragAmount:0},transition:{currentTranslation:0,speed:0,animated:!1},autoplayTimer:null,nextSlideIsClone:!1,breakpointsData:{list:[],current:null},parallaxData:{translation:0,slideshowOffsetTop:null,isVisible:!1}}),computed:{conf(){const e={...this.$props,...this.$props.breakpoints&&this.$props.breakpoints[this.breakpointsData.current]||{}};return e.slideMultiple=e.slideMultiple?e.visibleSlides:1,e.gap=this.gap&&parseInt(this.gap)||0,e.visibleSlides>1&&(e["3d"]=!1),(e.fade||e.disableArrowsOnEdges||e.visibleSlides>1||e["3d"])&&(e.infinite=!1),e.visibleSlides>1&&null===e.arrowsOutside&&(e.arrowsOutside=!0),e.visibleSlides>1&&null===e.bulletsOutside&&(e.bulletsOutside=!0),this.touch.enabled!==e.touchable&&this.toggleTouchableOption(e.touchable),e.parallax&&e.parallaxFixedContent&&(e.slideContentOutside="top",e.slideContentOutsideClass="parallax-fixed-content"),e},slidesCount(){return this.slides.list.length},gapsCount(){const{fade:e,"3d":t,slideMultiple:n,gap:r}=this.conf;if(!r||e||t||this.multipleSlides1by1&&this.slides.current0&&(o-=this.slidePosAfterPreferred),o},slidesAfterCurrent(){return this.slidesCount-(this.slides.current+1)},preferredPosition(){return this.multipleSlides1by1?Math.ceil(this.conf.visibleSlides/2)-1:0},slidePosAfterPreferred(){return this.conf.visibleSlides-this.preferredPosition-this.slidesAfterCurrent-1},multipleSlides1by1(){return this.conf.visibleSlides>1&&1===this.conf.slideMultiple},touchEnabled:{get(){return this.slidesCount>1&&this.touch.enabled},set(e){this.touch.enabled=e}},canSlide(){return this.slidesCount/this.conf.visibleSlides>1},firstSlide(){const e=this.slidesCount?this.slides.list[0]:{};return e.style&&"string"==typeof e.style&&(e.style=e.style.replace(/width: ?\d+.*?;?/,"")),e},lastSlide(){const e=this.slidesCount?this.slides.list[this.slidesCount-1]:{};return e.style&&"string"==typeof e.style&&(e.style=e.style.replace(/width: ?\d+.*?;?/,"")),e},currentSlide(){const e=this.slidesCount&&this.slides.list[this.slides.current]||{};return this.slides.current1,"vueperslides--bullets-outside":this.conf.bulletsOutside,"vueperslides--animated":this.transition.animated,"vueperslides--no-animation":!this.isReady}},vueperslidesStyles(){return/^-?\d/.test(this.conf.fixedHeight)?`height: ${this.conf.fixedHeight}`:null},trackStyles(){const e={};return this.conf.parallax&&(e.transform=`translate3d(0, ${this.parallaxData.translation}%, 0)`,e.willChange=this.parallaxData.isVisible?"transform":"auto"),e},trackInnerStyles(){const e={},{fade:t,"3d":n}=this.conf;if(e.transitionDuration=`${this.transition.speed}ms`,n){const t=90*this.transition.currentTranslation/100;e.transform=`rotateY(-90deg) translateX(-50%) rotateY(90deg) rotateY(${t}deg)`}else t||(e.transform=`translate3d(${this.transition.currentTranslation}%, 0, 0)`,e.willChange=this.touch.dragging||this.transition.animated?"transform":"auto");return e},bulletIndexes(){return Array(Math.ceil(this.slidesCount/this.conf.slideMultiple)).fill().map(((e,t)=>t*this.conf.slideMultiple))},arrowPrevDisabled(){return!this.slides.current&&this.conf.disableArrowsOnEdges},arrowNextDisabled(){const{disableArrowsOnEdges:e,visibleSlides:t,slideMultiple:n}=this.conf;return this.slides.current+(n>1&&t>1?t-1:0)===this.slidesCount-1&&e}},methods:{init(){this.container=this.$refs.vueperslides,this.touchEnabled=this.conf.touchable,this.transition.speed=this.conf.transitionSpeed,Object.keys(this.breakpoints).length&&(this.setBreakpointsList(),this.setBreakpointConfig(this.getCurrentBreakpoint()));const e={animation:!1,autoPlaying:this.conf.autoplay};this.goToSlide(this.conf.initSlide-1,e),this.bindEvents(),this.$nextTick((()=>{this.isReady=!0,this.emit("ready")}))},emit(e,t=!0,n=!1){let r=null;if((t||"number"==typeof n)&&(r={},t&&this.slides.activeId&&this.slidesCount&&(r.currentSlide=this.getSlideData(this.slides.current)),"number"==typeof n&&this.slidesCount)){const{nextSlide:e}=this.getSlideInRange(n);r.nextSlide=this.getSlideData(e)}this.$emit(...r?[e,r]:[e])},getSlideData(e){const t=this.slides.list[e];let n={};return t&&(n={index:e,title:t.title,content:t.content,contentSlot:t.contentSlot,image:t.image,link:t.link}),n},setBreakpointsList(){this.breakpointsData.list=[99999,...Object.keys(this.breakpoints)].map((e=>parseInt(e))).sort(((e,t)=>parseInt(t)-parseInt(e)))},getCurrentBreakpoint(){const e=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,t=[e,...this.breakpointsData.list].sort(((e,t)=>parseInt(t)-parseInt(e)));return this.breakpointsData.list[t.indexOf(e)-1]},hasBreakpointChanged(e){return this.breakpointsData.current!==parseInt(e)},setBreakpointConfig(e){const t=this.breakpoints&&this.breakpoints[e]||{},n=t.slideMultiple&&t.slideMultiple!==this.conf.slideMultiple,r=t.visibleSlides&&t.visibleSlides!==this.conf.visibleSlides;this.breakpointsData.current=e,this.slides.current=this.getFirstVisibleSlide(this.slides.focus),n||r?this.goToSlide(this.slides.current,{breakpointChange:!0}):this.updateTrackTranslation()},bindEvents(){const e="ontouchstart"in window;this.touchEnabled&&this.toggleTouchableOption(!0),this.conf.autoplay&&(this.conf.pauseOnHover&&!e?(this.container.addEventListener("mouseenter",this.onMouseEnter),this.container.addEventListener("mouseleave",this.onMouseLeave)):this.conf.pauseOnTouch&&e&&document.addEventListener("touchstart",(e=>{this[this.$el.contains(e.target)?"onSlideshowTouch":"onOustideTouch"]()}))),(this.breakpointsData.list.length||this.conf.parallax)&&window.addEventListener("resize",this.onResize),this.conf.parallax&&this.enableParallax()},getSlideshowOffsetTop(e=!1){if(null===this.parallaxData.slideshowOffsetTop||e){let e=this.container,t=e.offsetTop;for(;e=e.offsetParent;)t+=e.offsetTop;this.parallaxData.slideshowOffsetTop=t}return this.parallaxData.slideshowOffsetTop},enableParallax(){this.refreshParallax(),this.pageScrollingElement?(this.parallaxData.scrollingEl=document.querySelector(this.pageScrollingElement),this.parallaxData.scrollingEl.addEventListener("scroll",this.onScroll)):document.addEventListener("scroll",this.onScroll)},disableParallax(){(this.pageScrollingElement?document.querySelector(this.pageScrollingElement):document).removeEventListener("scroll",this.onScroll),this.parallaxData.scrollingEl=null,this.parallaxData.isVisible=!1,this.parallaxData.translation=0,this.parallaxData.slideshowOffsetTop=null},onScroll(){const{scrollingEl:e}=this.parallaxData,t=document.documentElement;let n=0;n=e?e.scrollTop:(window.pageYOffset||t.scrollTop)-(t.clientTop||0);const r=window.innerHeight||t.clientHeight||document.body.clientHeight,o=this.container.clientHeight,i=this.getSlideshowOffsetTop(),s=i+o-n,a=r+n-i;if(this.parallaxData.isVisible=s>0&&a>0,this.parallaxData.isVisible){const e=r+o,t=100*s/e,n=-1===this.conf.parallax?100-t:t;this.parallaxData.translation=-n/2}},onResize(){if(this.breakpointsData.list.length){const e=this.getCurrentBreakpoint();this.hasBreakpointChanged(e)&&this.setBreakpointConfig(e)}this.conf.parallax&&this.getSlideshowOffsetTop(!0)},onMouseEnter(){this.mouseOver=!0,this.conf.pauseOnHover&&this.conf.autoplay&&(this.isPaused=!0)},onMouseLeave(){this.mouseOver=!1,this.conf.pauseOnHover&&this.conf.autoplay&&(this.isPaused=!1)},onMouseDown(e){!this.touchEnabled||this.disable||(!e.touches&&this.preventYScroll&&e.preventDefault(),this.mouseDown=!0,this.touch.dragStartX=this.getCurrentMouseX(e),this.conf.draggingDistance||this.updateTrackTranslation(this.touch.dragStartX))},onMouseMove(e){if(this.mouseDown||this.touch.dragging)if(this.conf.autoplay&&(this.isPaused=!0),this.preventYScroll&&e.preventDefault(),this.mouseDown=!1,this.touch.dragging=!0,this.touch.dragNowX=this.getCurrentMouseX(e),this.conf.draggingDistance){this.touch.dragAmount=this.touch.dragNowX-this.touch.dragStartX;const e=this.touch.dragAmount/this.container.clientWidth;this.updateTrackTranslation(),this.transition.currentTranslation+=100*e}else this.updateTrackTranslation(this.touch.dragNowX)},onMouseUp(e){if(this.mouseDown=!1,!this.touch.dragging)return this.cancelSlideChange();this.conf.autoplay&&(("ontouchstart"in window||this.mouseOver)&&this.conf.pauseOnTouch||(this.isPaused=!1)),this.touch.dragging=!1;const t=this.conf.draggingDistance?-this.touch.dragAmount:0,n=(this.touch.dragStartX-this.container.offsetLeft)/this.container.clientWidth,r=(this.touch.dragNowX-this.container.offsetLeft)/this.container.clientWidth,o=100*((n<.5?0:1)-r);let i=(t||o)>0;if(this.conf.rtl&&(i=!i),[Math.abs(t)this.touch.justDragged=!1),50),this.touch.lazyloadTriggered=!1},onSlideshowTouch(){this.isPaused=!0},onOustideTouch(){this.isPaused=!1},justDragged(){return this.touch.justDragged},cancelSlideChange(){this.conf.fade||this.updateTrackTranslation()},getCurrentMouseX(e){return"ontouchstart"in window?e.touches[0].clientX:e.clientX},getBasicTranslation(){return this.slides.current/this.conf.visibleSlides},updateTrackTranslation(e=null){let t=this.getBasicTranslation();const{infinite:n,visibleSlides:r,slideMultiple:o,gap:i,"3d":s,lazy:a,lazyLoadOnDrag:l}=this.conf;if(n&&!1!==this.nextSlideIsClone&&(t=(this.nextSlideIsClone?this.slidesCount:-1)/r),i&&(t+=this.gapsCount/(r/o)*i/100),this.touch.dragStartX&&e&&(!n||!1===this.nextSlideIsClone)){let o=0;const i=(this.touch.dragStartX-this.container.offsetLeft)/this.container.clientWidth;let u=(e-this.container.offsetLeft)/this.container.clientWidth;if(s){const e=Math.round(i)?[0,2]:[-1,1];u=Math.min(Math.max(u,e[0]),e[1])}if(o=(i<.5?0:1)-u,t+=o*(this.conf.rtl?-1:1),a&&l&&!this.touch.lazyloadTriggered){this.touch.lazyloadTriggered=!0;let e=this.slides.current+(o>0?1:-1)*r;n&&-1===e?e=this.slidesCount-1:n&&e===this.slidesCount&&(e=0);for(let t=0;t0;let n=Math.min(this.preferredPosition,this.slides.current);e&&(n+=this.slidePosAfterPreferred),t-=n/r}this.transition.currentTranslation=100*-t*(this.conf.rtl?-1:1)},pauseAutoplay(){this.isPaused=!0,clearTimeout(this.autoplayTimer),this.autoplayTimer=0,this.emit("autoplay-pause")},resumeAutoplay(){this.isPaused=!1,this.doAutoplay(),this.emit("autoplay-resume")},doAutoplay(){clearTimeout(this.autoplayTimer),this.autoplayTimer=setTimeout((()=>{this.goToSlide(this.slides.current+this.conf.slideMultiple,{autoPlaying:!0})}),this.currentSlide.duration||this.conf.duration)},previous(e=!0){e&&this.emit("previous"),this.goToSlide(this.slides.current-this.conf.slideMultiple)},next(e=!0){e&&this.emit("next"),this.goToSlide(this.slides.current+this.conf.slideMultiple)},refreshParallax(){setTimeout((()=>{this.onResize(),this.onScroll()}),100)},getFirstVisibleSlide(e){const{slideMultiple:t,visibleSlides:n}=this.conf;let r=this.slides.current;return n>1&&t===n?r=Math.floor(e/n)*n:this.multipleSlides1by1&&(r=e-Math.min(e,this.preferredPosition)-Math.max(this.slidePosAfterPreferred,0)),r},getSlideInRange(e,t){let n=!1;this.conf.infinite&&-1===e?n=0:this.conf.infinite&&e===this.slidesCount&&(n=1);let r=(e+this.slidesCount)%this.slidesCount;if(this.conf.slideMultiple>1){const t=this.slidesCount%this.conf.slideMultiple||this.conf.slideMultiple,n=this.conf.slideMultiple-t;r+=e<0?n:0,r=this.getFirstVisibleSlide(r)}return this.conf.disableArrowsOnEdges&&(e<0||e>this.slidesCount-1)&&!t&&(r=this.slides.current),{nextSlide:r,clone:n}},goToSlide(e,{animation:t=!0,autoPlaying:n=!1,jumping:r=!1,breakpointChange:o=!1,emit:i=!0}={}){if(!this.slidesCount||this.disable)return;this.conf.autoplay&&!n&&!this.isPaused&&(this.isPaused=!0,this.$nextTick((()=>this.isPaused=!1))),this.transition.animated=t,setTimeout((()=>this.transition.animated=!1),this.transitionSpeed);const{nextSlide:s,clone:a}=this.getSlideInRange(e,n);if(this.nextSlideIsClone=a,!this.slides.list[s])return;if(this.conf.lazy)for(let u=0;u{const t=-1===e&&this.slides.current!==this.slidesCount-1,n=e===this.slidesCount&&0!==this.slides.current;t||n||(this.transition.speed=0,this.goToSlide(a?0:this.slidesCount-1,{animation:!1,jumping:!0}),setTimeout((()=>this.transition.speed=this.conf.transitionSpeed),50))}),this.transition.speed-50),this.slides.current=s,this.slides.firstVisible=this.getFirstVisibleSlide(s),o||(this.slides.focus=s),this.conf.fade||this.updateTrackTranslation(),this.slides.activeId=this.slides.list[this.slides.current].id,this.conf.autoplay&&n&&!this.isPaused&&this.doAutoplay(),this.slidesCount&&(this.isReady&&!r&&i&&this.emit("slide"),this.isReady&&this.conf.bullets&&!n&&!r&&this.$refs.bullets)){const e=this.$refs.bullets.children,t=e&&e[this.slides.current/this.conf.slideMultiple];if(t&&"button"===t.nodeName.toLowerCase()){let e=document.documentElement;this.pageScrollingElement&&(e=document.querySelector(this.pageScrollingElement));const n=e.scrollTop;t.focus({preventScroll:!0}),e.scrollTop=n}}},addSlide(e){return this.slides.list.push(e),this.isReady&&1===this.slidesCount&&this.conf.autoplay&&this.isPaused&&(this.isPaused=!1),this.slidesCount},addClone(){return this.updateTrackTranslation(),this.slidesCount},updateSlide(e,t){let n=this.slides.list.find((t=>t.id===e));n&&(n=Object.assign(n,t))},removeSlide(e){const t=this.slides.list.findIndex((t=>t.id===e));t>-1&&(this.slides.list.splice(t,1),this.slidesCount&&e===this.slides.activeId&&this.goToSlide(t-1,{autoPlaying:!0})),this.slides.current>=this.slidesCount&&this.goToSlide(0,{autoPlaying:!0})},loadSlide(e,t){e.loadImage().then((n=>{const{image:r,style:o}=n;e.loaded=!0,e.image=r,e.style=o,this.$emit("image-loaded",this.getSlideData(t))}),(()=>{e.loaded=!1,this.$emit("image-failed",this.getSlideData(t))}))},toggleTouchableOption(e){const{track:t}=this.$refs;if(!t)return;this.touchEnabled=e;const n="ontouchstart"in window;e?(this.$refs.track.addEventListener(n?"touchstart":"mousedown",this.onMouseDown,{passive:!this.preventYScroll}),document.addEventListener(n?"touchmove":"mousemove",this.onMouseMove,{passive:!this.preventYScroll}),document.addEventListener(n?"touchend":"mouseup",this.onMouseUp,{passive:!0})):this.removeEventListeners()},removeEventListeners(){const e="ontouchstart"in window;this.$refs.track.removeEventListener(e?"touchstart":"mousedown",this.onMouseDown,{passive:!this.preventYScroll}),document.removeEventListener(e?"touchmove":"mousemove",this.onMouseMove,{passive:!this.preventYScroll}),document.removeEventListener(e?"touchend":"mouseup",this.onMouseUp,{passive:!0})}},watch:{isPaused(e){this[e?"pauseAutoplay":"resumeAutoplay"]()},parallax(e){this[e?"enableParallax":"disableParallax"]()}},mounted(){this.init()},beforeUnmount(){this.removeEventListeners(),this.conf.parallax&&this.disableParallax(),window.removeEventListener("resize",this.onResize),document.removeEventListener("touchstart",(e=>{this[this.$el.contains(e.target)?"onSlideshowTouch":"onOustideTouch"]()})),this.container.removeEventListener("mouseenter",this.onMouseEnter),this.container.removeEventListener("mouseleave",this.onMouseLeave)}},ke=re(Ce,[["render",Te]]);var Oe={components:{VueperSlides:ke,VueperSlide:ie},computed:{...(0,O.aH)("algolia",["ads"])},methods:{...(0,O.PY)("packages/details",["setCurrent"])}},Ae=n(6262);const Re=(0,Ae.A)(Oe,[["render",V]]);var Ie=Re;const Le={class:"package-sorting__label"},Ne=["title","onClick"];function xe(e,t,n,i,s,a){return(0,r.uX)(),(0,r.CE)("section",{class:"package-sorting",onClick:t[0]||(t[0]=t=>e.open=!e.open)},[(0,r.Lk)("label",Le,(0,o.v_)(e.$t("ui.discover.sortBy")),1),(0,r.Lk)("ul",{class:(0,o.C4)(["package-sorting__group",{"package-sorting__group--open":e.open}])},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.sortOptions,((t,n)=>((0,r.uX)(),(0,r.CE)("li",{key:t,class:(0,o.C4)(["package-sorting__item",{"package-sorting__item--active":e.sorting===t,"package-sorting__item--open":e.open}])},[(0,r.Lk)("button",{title:e.$t(`ui.discover.sort${n}Title`),onClick:n=>e.sortBy(t)},(0,o.v_)(e.$t(`ui.discover.sort${n}`)),9,Ne)],2)))),128))],2)])}var Pe={mixins:[A.A],data:()=>({open:!1,sortOptions:{Released:"released",Latest:"latest",Favers:"favers",Downloads:"downloads"}})};const Me=(0,Ae.A)(Pe,[["render",xe]]);var De=Me,Fe=n(791),$e=n(85),je={mixins:[A.A],components:{LoadingButton:$e.A,SearchInput:Fe.A,SearchSorting:De,AdBanner:Ie,LoadingSpinner:I.A,DiscoverPackage:R.A},props:{wrapper:{required:!0},hideThemes:{type:Boolean,default:!1}},data:()=>({offline:!1,searching:!1,extensionCount:0,results:null,hasMore:!1,exactHit:null}),computed:{...(0,O.aH)("algolia",["discover"])},methods:{...(0,O.PY)("packages/details",["setCurrent"]),async searchPackages(){this.searching=!0,this.offline=!1;try{const e={hitsPerPage:10*this.pages};this.hideThemes&&(e.facetFilters=["type:-contao-theme"]),this.query?e.query=this.query:this.sorting&&(e.sorting=this.sorting);const t=await this.$store.dispatch("algolia/findPackages",e);if(this.hasMore=t.nbPages>1,0===t.nbHits)return this.results={},void(this.exactHit=null);const n={};t.hits.forEach((t=>{e.query===t.name?this.exactHit=t:n[t.name]=t})),this.results=n}catch(e){this.offline=!0}this.searching=!1},async getOnline(){this.searching=!0,this.offline=!1,await this.$store.dispatch("algolia/discover"),this.searching=!1},async openSearch(e){this.results=null,this.exactHit=null,await this.sortBy(e)}},watch:{sorting(){this.searchPackages()},query(){this.results=null,this.exactHit=null,this.searchPackages()},pages(){this.searchPackages()}},created(){this.$watch(this.$i18n.locale,(()=>{this.isSearching&&this.searchPackages()}))},async mounted(){const e={hitsPerPage:0,attributesToRetrieve:null,attributesToHighlight:null,analytics:!1};this.hideThemes&&(e.facetFilters=["type:-contao-theme"]),this.$store.dispatch("algolia/findPackages",e).then((e=>{this.extensionCount=e.nbHits}),(()=>{})),this.isSearching&&this.searchPackages()}};const Ue=(0,Ae.A)(je,[["render",k]]);var Be=Ue},7943:function(e,t,n){"use strict";n.d(t,{A:function(){return V}});var r=n(4335);function o(){function e(e){return new Promise((t=>{let n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>n.setRequestHeader(t,e.headers[t])));let r,o=(e,r)=>setTimeout((()=>{n.abort(),t({status:0,content:r,isTimedOut:!0})}),e),i=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=()=>{n.readyState>n.OPENED&&void 0===r&&(clearTimeout(i),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=()=>{0===n.status&&(clearTimeout(i),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=()=>{clearTimeout(i),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}return{send:e}}function i(e){let t;const n=`algolia-client-js-${e.key}`;function r(){return void 0===t&&(t=e.localStorage||window.localStorage),t}function o(){return JSON.parse(r().getItem(n)||"{}")}function i(e){r().setItem(n,JSON.stringify(e))}function s(){const t=e.timeToLive?1e3*e.timeToLive:null,n=o(),r=Object.fromEntries(Object.entries(n).filter((([,e])=>void 0!==e.timestamp)));if(i(r),!t)return;const s=Object.fromEntries(Object.entries(r).filter((([,e])=>{const n=(new Date).getTime(),r=e.timestamp+tPromise.resolve()}){return Promise.resolve().then((()=>(s(),o()[JSON.stringify(e)]))).then((e=>Promise.all([e?e.value:t(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e))},set(e,t){return Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},r().setItem(n,JSON.stringify(i)),t}))},delete(e){return Promise.resolve().then((()=>{const t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear(){return Promise.resolve().then((()=>{r().removeItem(n)}))}}}function s(){return{get(e,t,n={miss:()=>Promise.resolve()}){const r=t();return r.then((e=>Promise.all([e,n.miss(e)]))).then((([e])=>e))},set(e,t){return Promise.resolve(t)},delete(e){return Promise.resolve()},clear(){return Promise.resolve()}}}function a(e){const t=[...e.caches],n=t.shift();return void 0===n?s():{get(e,r,o={miss:()=>Promise.resolve()}){return n.get(e,r,o).catch((()=>a({caches:t}).get(e,r,o)))},set(e,r){return n.set(e,r).catch((()=>a({caches:t}).set(e,r)))},delete(e){return n.delete(e).catch((()=>a({caches:t}).delete(e)))},clear(){return n.clear().catch((()=>a({caches:t}).clear()))}}}function l(e={serializable:!0}){let t={};return{get(n,r,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(n);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const s=r();return s.then((e=>o.miss(e))).then((()=>s))},set(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear(){return t={},Promise.resolve()}}}function u(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const n=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(n)&&(t.value=`${t.value}${n}`),t}};return t}function c(e,t,n="WithinHeaders"){const r={"x-algolia-api-key":t,"x-algolia-application-id":e};return{headers(){return"WithinHeaders"===n?r:{}},queryParameters(){return"WithinQueryParameters"===n?r:{}}}}function d({algoliaAgents:e,client:t,version:n}){const r=u(n).add({segment:t,version:n});return e.forEach((e=>r.add(e))),r}function f(){return{debug(e,t){return Promise.resolve()},info(e,t){return Promise.resolve()},error(e,t){return Promise.resolve()}}}var h=12e4;function p(e,t="up"){const n=Date.now();function r(){return"up"===t||Date.now()-n>h}function o(){return"timed out"===t&&Date.now()-n<=h}return{...e,status:t,lastUpdate:n,isUp:r,isTimedOut:o}}var m=class extends Error{name="AlgoliaError";constructor(e,t){super(e),t&&(this.name=t)}},v=class extends m{stackTrace;constructor(e,t,n){super(e,n),this.stackTrace=t}},g=class extends v{constructor(e){super("Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",e,"RetryError")}},y=class extends v{status;constructor(e,t,n,r="ApiError"){super(e,n,r),this.status=t}},b=class extends m{response;constructor(e,t){super(e,"DeserializationError"),this.response=t}},_=class extends y{error;constructor(e,t,n,r){super(e,t,r,"DetailedApiError"),this.error=n}};function E(e){const t=e;for(let n=e.length-1;n>0;n--){const r=Math.floor(Math.random()*(n+1)),o=e[n];t[n]=e[r],t[r]=o}return t}function w(e,t,n){const r=S(n);let o=`${e.protocol}://${e.url}${e.port?`:${e.port}`:""}/${"/"===t.charAt(0)?t.substring(1):t}`;return r.length&&(o+=`?${r}`),o}function S(e){return Object.keys(e).filter((t=>void 0!==e[t])).sort().map((t=>`${t}=${encodeURIComponent("[object Array]"===Object.prototype.toString.call(e[t])?e[t].join(","):e[t]).replace(/\+/g,"%20")}`)).join("&")}function T(e,t){if("GET"===e.method||void 0===e.data&&void 0===t.data)return;const n=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(n)}function C(e,t,n){const r={Accept:"application/json",...e,...t,...n},o={};return Object.keys(r).forEach((e=>{const t=r[e];o[e.toLowerCase()]=t})),o}function k(e){try{return JSON.parse(e.content)}catch(t){throw new b(t.message,e)}}function O({content:e,status:t},n){try{const r=JSON.parse(e);return"error"in r?new _(r.message,t,r.error,n):new y(r.message,t,n)}catch{}return new y(e,t,n)}function A({isTimedOut:e,status:t}){return!e&&0===~~t}function R({isTimedOut:e,status:t}){return e||A({isTimedOut:e,status:t})||2!==~~(t/100)&&4!==~~(t/100)}function I({status:e}){return 2===~~(e/100)}function L(e){return e.map((e=>N(e)))}function N(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}function x({hosts:e,hostsCache:t,baseHeaders:n,logger:r,baseQueryParameters:o,algoliaAgent:i,timeouts:s,requester:a,requestsCache:l,responsesCache:u}){async function c(e){const n=await Promise.all(e.map((e=>t.get(e,(()=>Promise.resolve(p(e))))))),r=n.filter((e=>e.isUp())),o=n.filter((e=>e.isTimedOut())),i=[...r,...o],s=i.length>0?i:e;return{hosts:s,getTimeout(e,t){const n=0===o.length&&0===e?1:o.length+3+e;return n*t}}}async function d(l,u,d=!0){const f=[],h=T(l,u),m=C(n,l.headers,u.headers),v="GET"===l.method?{...l.data,...u.data}:{},y={...o,...l.queryParameters,...v};if(i.value&&(y["x-algolia-agent"]=i.value),u&&u.queryParameters)for(const e of Object.keys(u.queryParameters))u.queryParameters[e]&&"[object Object]"!==Object.prototype.toString.call(u.queryParameters[e])?y[e]=u.queryParameters[e].toString():y[e]=u.queryParameters[e];let b=0;const _=async(e,n)=>{const o=e.pop();if(void 0===o)throw new g(L(f));const i={...s,...u.timeouts},c={data:h,headers:m,method:l.method,url:w(o,l.path,y),connectTimeout:n(b,i.connect),responseTimeout:n(b,d?i.read:i.write)},v=t=>{const n={request:c,response:t,host:o,triesLeft:e.length};return f.push(n),n},E=await a.send(c);if(R(E)){const i=v(E);return E.isTimedOut&&b++,r.info("Retryable failure",N(i)),await t.set(o,p(o,E.isTimedOut?"timed out":"down")),_(e,n)}if(I(E))return k(E);throw v(E),O(E,f)},E=e.filter((e=>"readWrite"===e.accept||(d?"read"===e.accept:"write"===e.accept))),S=await c(E);return _([...S.hosts].reverse(),S.getTimeout)}function f(e,t={}){const r=e.useReadTransporter||"GET"===e.method;if(!r)return d(e,t,r);const i=()=>d(e,t),s=t.cacheable||e.cacheable;if(!0!==s)return i();const a={request:e,requestOptions:t,transporter:{queryParameters:o,headers:n}};return u.get(a,(()=>l.get(a,(()=>l.set(a,i()).then((e=>Promise.all([l.delete(a),e])),(e=>Promise.all([l.delete(a),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>u.set(a,e)})}return{hostsCache:t,requester:a,timeouts:s,logger:r,algoliaAgent:i,baseHeaders:n,baseQueryParameters:o,hosts:e,request:f,requestsCache:l,responsesCache:u}}var P="5.26.0";function M(e){return[{url:`${e}-dsn.algolia.net`,accept:"read",protocol:"https"},{url:`${e}.algolia.net`,accept:"write",protocol:"https"}].concat(E([{url:`${e}-1.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${e}-2.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${e}-3.algolianet.com`,accept:"readWrite",protocol:"https"}]))}function D({appId:e,apiKey:t,authMode:n,algoliaAgents:r,...o}){const i=c(e,t,n),s=x({hosts:M(e),...o,algoliaAgent:d({algoliaAgents:r,client:"Lite",version:P}),baseHeaders:{"content-type":"text/plain",...i.headers(),...o.baseHeaders},baseQueryParameters:{...i.queryParameters(),...o.baseQueryParameters}});return{transporter:s,appId:e,apiKey:t,clearCache(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((()=>{}))},get _ua(){return s.algoliaAgent.value},addAlgoliaAgent(e,t){s.algoliaAgent.add({segment:e,version:t})},setClientApiKey({apiKey:e}){n&&"WithinHeaders"!==n?s.baseQueryParameters["x-algolia-api-key"]=e:s.baseHeaders["x-algolia-api-key"]=e},searchForHits(e,t){return this.search(e,t)},searchForFacets(e,t){return this.search(e,t)},customPost({path:e,parameters:t,body:n},r){if(!e)throw new Error("Parameter `path` is required when calling `customPost`.");const o="/{path}".replace("{path}",e),i={},a=t||{},l={method:"POST",path:o,queryParameters:a,headers:i,data:n||{}};return s.request(l,r)},getRecommendations(e,t){if(e&&Array.isArray(e)){const t={requests:e};e=t}if(!e)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!e.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");const n="/1/indexes/*/recommendations",r={},o={},i={method:"POST",path:n,queryParameters:o,headers:r,data:e,useReadTransporter:!0,cacheable:!0};return s.request(i,t)},search(e,t){if(e&&Array.isArray(e)){const t={requests:e.map((({params:e,...t})=>"facet"===t.type?{...t,...e,type:"facet"}:{...t,...e,facet:void 0,maxFacetHits:void 0,facetQuery:void 0}))};e=t}if(!e)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!e.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");const n="/1/indexes/*/queries",r={},o={},i={method:"POST",path:n,queryParameters:o,headers:r,data:e,useReadTransporter:!0,cacheable:!0};return s.request(i,t)}}}function F(e,t,n){if(!e||"string"!==typeof e)throw new Error("`appId` is missing.");if(!t||"string"!==typeof t)throw new Error("`apiKey` is missing.");return D({appId:e,apiKey:t,timeouts:{connect:1e3,read:2e3,write:3e4},logger:f(),requester:o(),algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:l(),requestsCache:l({serializable:!1}),hostsCache:a({caches:[i({key:`${P}-${e}`}),l()]}),...n})}var $=n(9589),j=n(9997);const U=F("60DW2LJW0P","13718a23f4e436f7e7614340bd87d913"),B=(e,t=6)=>{const n=Array.from(e),r=[];while(n.length>0&&r.lengthe(null)));if(Object.keys(e.metadata).includes(n))return e.metadata[n];const o=(async()=>{let t=null;try{const r=await U.search([{indexName:"v3_packages",params:{filters:`name:"${n}" AND languages:${e.language}`,hitsPerPage:1}}]);r.results[0].nbHits>0&&(t=r.results[0].hits[0])}catch(o){}try{if(t&&t.private)t=Object.assign({},(await r.A.get(`https://contao.github.io/package-metadata/meta/${n}/composer.json`)).data,t||{});else{let e,i=(await r.A.get(`https://packagist.org/packages/${n}.json`)).data.package,s=[];i.downloads=i.downloads.total,i.dependency=!0;try{const e=(await r.A.get(`https://repo.packagist.org/p2/${n}.json`)).data.packages[n];let t=null;Object.values(e).forEach((e=>{if(!t)return t=e,void s.push(JSON.parse(JSON.stringify(t)));Object.keys(e).forEach((n=>{"__unset"===e[n]?delete t[n]:t[n]=e[n]})),s.push(JSON.parse(JSON.stringify(t)))}))}catch(o){s=Object.values(i.versions)}if(e=s.filter((e=>"dev-"!==e.version.substr(0,4)&&"-dev"!==e.version.substr(-4)&&e.require&&"contao/core-bundle"in e.require)),e.length||(e=s.filter((e=>"dev-"!==e.version.substr(0,4)&&"-dev"!==e.version.substr(-4)))),e.length||(e=s),e&&e.length||(e=[]),e=e.sort(((e,t)=>{const n=(0,$.coerce)(e.version_normalized,{loose:!0}),r=(0,$.coerce)(t.version_normalized,{loose:!0}),o=(0,$.compare)(n,r);return 0===o?new Date(e.time)>new Date(t.time)?1:-1:o})),e.length){const t=e[e.length-1];i=Object.assign(i,t),i.latest={version:t.version,time:t.time}}t=Object.assign({},i,t||{},{versions:e})}}catch(o){console.info("No package metadata for "+n,o)}return t?(delete t.version,delete t.time,delete t.constraint,j.A[t.name]&&(t.features=j.A[t.name]),t):null})();return t("cache",{name:n,data:o}),o},async findPackages({state:e,dispatch:t},n){let r="",o="dependency:false";n.sorting&&(r=n.sorting?`_${n.sorting}`:"",o="discoverable:true",delete n.sorting),n.type&&(o=`type:${n.type}`,delete n.type),n.filters=`languages:${e.language} AND ${o}`,n.highlightPreTag="%%",n.highlightPostTag="%%";const i=(await U.search([{indexName:`v3_packages${r}`,params:n}])).results[0];if(n.query&&new RegExp("^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$").test(n.query)&&!i.hits.find((e=>e.name===n.query))){const e=await t("getPackage",n.query);e&&(i.nbHits++,i.hits.push(e))}return i},async discover({state:e,commit:t}){try{const n=new Date,r=`${n.getFullYear()}${String(n.getMonth()+1).padStart(2,"0")}${String(n.getDate()).padStart(2,"0")}`,o=await U.search([{indexName:"v3_packages_latest",params:{hitsPerPage:6,filters:`languages:${e.language} AND discoverable:true`}},{indexName:"v3_packages_downloads",params:{hitsPerPage:4,filters:`languages:${e.language} AND discoverable:true`}},{indexName:"v3_packages_favers",params:{hitsPerPage:4,filters:`languages:${e.language} AND discoverable:true`}},{indexName:"v3_ads",params:{hitsPerPage:6,filters:`position:primary AND languages:${e.language} AND published:true AND validFrom <= ${r} AND validTo >= ${r}`}},{indexName:"v3_ads",params:{hitsPerPage:100,filters:`position:secondary AND languages:${e.language} AND published:true AND validFrom <= ${r} AND validTo >= ${r}`}},{indexName:"v3_ads",params:{hitsPerPage:100,filters:`position:subheader AND languages:${e.language} AND published:true AND validFrom <= ${r} AND validTo >= ${r}`}}]);t("setDiscover",{latest:o.results[0].hits,downloads:o.results[1].hits,favers:o.results[2].hits,ads:B(o.results[3].hits).concat(B(o.results[4].hits,6-o.results[3].nbHits)),news:B(o.results[5].hits)})}catch(n){t("setDiscover",null)}}}}},7944:function(e,t,n){"use strict";n.d(t,{dv:function(){return g}});var r,o=n(641),i=n(953),s=function(){return s=Object.assign||function(e){for(var t,n=1,r=arguments.length;nt.MAX_VERSION)throw new RangeError("Version value out of range");if(i<-1||i>7)throw new RangeError("Mask value out of range");this.size=4*e+17;for(var s=[],a=0;a7)throw new RangeError("Invalid value");var c,d;for(c=s;;c++){var f=8*t.getNumDataCodewords(c,r),h=i.getTotalBits(e,c);if(h<=f){d=h;break}if(c>=a)throw new RangeError("Data too long")}for(var p=0,m=[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH];p>>3]|=e<<7-(7&t)})),new t(c,r,k,l)},t.prototype.getModule=function(e,t){return 0<=e&&e>>9);var s=21522^(t<<10|n);o(s>>>15==0);for(i=0;i<=5;i++)this.setFunctionModule(8,i,r(s,i));this.setFunctionModule(8,7,r(s,6)),this.setFunctionModule(8,8,r(s,7)),this.setFunctionModule(7,8,r(s,8));for(i=9;i<15;i++)this.setFunctionModule(14-i,8,r(s,i));for(i=0;i<8;i++)this.setFunctionModule(this.size-1-i,8,r(s,i));for(i=8;i<15;i++)this.setFunctionModule(8,this.size-15+i,r(s,i));this.setFunctionModule(8,this.size-8,!0)},t.prototype.drawVersion=function(){if(!(this.version<7)){for(var e=this.version,t=0;t<12;t++)e=e<<1^7973*(e>>>11);var n=this.version<<12|e;o(n>>>18==0);for(t=0;t<18;t++){var i=r(n,t),s=this.size-11+t%3,a=Math.floor(t/3);this.setFunctionModule(s,a,i),this.setFunctionModule(a,s,i)}}},t.prototype.drawFinderPattern=function(e,t){for(var n=-4;n<=4;n++)for(var r=-4;r<=4;r++){var o=Math.max(Math.abs(r),Math.abs(n)),i=e+r,s=t+n;0<=i&&i=l)&&v.push(t[e])}))};for(f=0;f=1;i-=2){6==i&&(i=5);for(var s=0;s>>3],7-(7&n)),n++)}}o(n==8*e.length)},t.prototype.applyMask=function(e){if(e<0||e>7)throw new RangeError("Mask value out of range");for(var t=0;t5&&e++):(this.finderPenaltyAddHistory(i,s),r||(e+=this.finderPenaltyCountPatterns(s)*t.PENALTY_N3),r=this.modules[n][a],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,s)*t.PENALTY_N3}for(a=0;a5&&e++):(this.finderPenaltyAddHistory(l,s),r||(e+=this.finderPenaltyCountPatterns(s)*t.PENALTY_N3),r=this.modules[n][a],l=1);e+=this.finderPenaltyTerminateAndCount(r,l,s)*t.PENALTY_N3}for(n=0;nt.MAX_VERSION)throw new RangeError("Version number out of range");var n=(16*e+128)*e+64;if(e>=2){var r=Math.floor(e/7)+2;n-=(25*r-10)*r-55,e>=7&&(n-=36)}return o(208<=n&&n<=29648),n},t.getNumDataCodewords=function(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]},t.reedSolomonComputeDivisor=function(e){if(e<1||e>255)throw new RangeError("Degree out of range");for(var n=[],r=0;r>>8!=0||t>>>8!=0)throw new RangeError("Byte out of range");for(var n=0,r=7;r>=0;r--)n=n<<1^285*(n>>>7),n^=(t>>>r&1)*e;return o(n>>>8==0),n},t.prototype.finderPenaltyCountPatterns=function(e){var t=e[1];o(t<=3*this.size);var n=t>0&&e[2]==t&&e[3]==3*t&&e[4]==t&&e[5]==t;return(n&&e[0]>=4*t&&e[6]>=t?1:0)+(n&&e[6]>=4*t&&e[0]>=t?1:0)},t.prototype.finderPenaltyTerminateAndCount=function(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)},t.prototype.finderPenaltyAddHistory=function(e,t){0==t[0]&&(e+=this.size),t.pop(),t.unshift(e)},t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],t}();function n(e,t,n){if(t<0||t>31||e>>>t!=0)throw new RangeError("Value out of range");for(var r=t-1;r>=0;r--)n.push(e>>>r&1)}function r(e,t){return 0!=(e>>>t&1)}function o(e){if(!e)throw new Error("Assertion error")}e.QrCode=t;var i=function(){function e(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw new RangeError("Invalid argument");this.bitData=n.slice()}return e.makeBytes=function(t){for(var r=[],o=0,i=t;o=1<=t.y+t.h?e:e.map((function(e,n){return(n=t.x+t.w)&&e}))}))}var m={value:{type:String,required:!0,default:""},size:{type:Number,default:100},level:{type:String,default:l,validator:function(e){return d(e)}},background:{type:String,default:"#fff"},foreground:{type:String,default:"#000"},margin:{type:Number,required:!1,default:0},imageSettings:{type:Object,required:!1,default:function(){return{}}},gradient:{type:Boolean,required:!1,default:!1},gradientType:{type:String,required:!1,default:"linear",validator:function(e){return["linear","radial"].indexOf(e)>-1}},gradientStartColor:{type:String,required:!1,default:"#000"},gradientEndColor:{type:String,required:!1,default:"#fff"}},v=s(s({},m),{renderAs:{type:String,required:!1,default:"canvas",validator:function(e){return["canvas","svg"].indexOf(e)>-1}}}),g=(0,o.pM)({name:"QRCodeSvg",props:m,setup:function(e){var t,n=(0,i.KR)(0),r=(0,i.KR)(""),c=function(){var o=e.value,i=e.level,s=e.margin,c=s>>>0,m=d(i)?i:l,v=a.QrCode.encodeText(o,u[m]).getModules();if(n.value=v.length+2*c,e.imageSettings.src){var g=h(v,e.size,c,e.imageSettings);t={x:g.x+c,y:g.y+c,width:g.w,height:g.h},g.excavation&&(v=p(v,g.excavation))}r.value=f(v,c)},m=function(){if(!e.gradient)return null;var t="linear"===e.gradientType?{x1:"0%",y1:"0%",x2:"100%",y2:"100%"}:{cx:"50%",cy:"50%",r:"50%",fx:"50%",fy:"50%"};return(0,o.h)("linear"===e.gradientType?"linearGradient":"radialGradient",s({id:"qr-gradient"},t),[(0,o.h)("stop",{offset:"0%",style:{stopColor:e.gradientStartColor}}),(0,o.h)("stop",{offset:"100%",style:{stopColor:e.gradientEndColor}})])};return c(),(0,o.$u)(c),function(){return(0,o.h)("svg",{width:e.size,height:e.size,"shape-rendering":"crispEdges",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(n.value," ").concat(n.value)},[(0,o.h)("defs",{},[m()]),(0,o.h)("rect",{width:"100%",height:"100%",fill:e.background}),(0,o.h)("path",{fill:e.gradient?"url(#qr-gradient)":e.foreground,d:r.value}),e.imageSettings.src&&(0,o.h)("image",s({href:e.imageSettings.src},t))])}}}),y=(0,o.pM)({name:"QRCodeCanvas",props:m,setup:function(e,t){var n=(0,i.KR)(null),r=(0,i.KR)(null),m=function(){var t=e.value,o=e.level,i=e.size,s=e.margin,m=e.background,v=e.foreground,g=e.gradient,y=e.gradientType,b=e.gradientStartColor,_=e.gradientEndColor,E=s>>>0,w=d(o)?o:l,S=n.value;if(S){var T=S.getContext("2d");if(T){var C=a.QrCode.encodeText(t,u[w]).getModules(),k=C.length+2*E,O=r.value,A={x:0,y:0,width:0,height:0},R=e.imageSettings.src&&null!=O&&0!==O.naturalWidth&&0!==O.naturalHeight;if(R){var I=h(C,e.size,E,e.imageSettings);A={x:I.x+E,y:I.y+E,width:I.w,height:I.h},I.excavation&&(C=p(C,I.excavation))}var L=window.devicePixelRatio||1,N=i/k*L;if(S.height=S.width=i*L,T.scale(N,N),T.fillStyle=m,T.fillRect(0,0,k,k),g){var x=void 0;x="linear"===y?T.createLinearGradient(0,0,k,k):T.createRadialGradient(k/2,k/2,0,k/2,k/2,k/2),x.addColorStop(0,b),x.addColorStop(1,_),T.fillStyle=x}else T.fillStyle=v;c?T.fill(new Path2D(f(C,E))):C.forEach((function(e,t){e.forEach((function(e,n){e&&T.fillRect(n+E,t+E,1,1)}))})),R&&T.drawImage(O,A.x,A.y,A.width,A.height)}}};(0,o.sV)(m),(0,o.$u)(m);var v=t.attrs.style;return function(){return(0,o.h)(o.FK,[(0,o.h)("canvas",s(s({},t.attrs),{ref:n,style:s(s({},v),{width:"".concat(e.size,"px"),height:"".concat(e.size,"px")})})),e.imageSettings.src&&(0,o.h)("img",{ref:r,src:e.imageSettings.src,style:{display:"none"},onLoad:m})])}}});(0,o.pM)({name:"Qrcode",render:function(){var e=this.$props,t=e.renderAs,n=e.value,r=e.size,i=e.margin,s=e.level,a=e.background,l=e.foreground,u=e.imageSettings,c=e.gradient,d=e.gradientType,f=e.gradientStartColor,h=e.gradientEndColor;return(0,o.h)("svg"===t?g:y,{value:n,size:r,margin:i,level:s,background:a,foreground:l,imageSettings:u,gradient:c,gradientType:d,gradientStartColor:f,gradientEndColor:h})},props:v})},8014:function(e,t,n){"use strict";var r=n(1291),o=Math.min;e.exports=function(e){var t=r(e);return t>0?o(t,9007199254740991):0}},8111:function(e,t,n){"use strict";var r=n(6518),o=n(4576),i=n(679),s=n(8551),a=n(4901),l=n(2787),u=n(2106),c=n(4659),d=n(9039),f=n(9297),h=n(8227),p=n(7657).IteratorPrototype,m=n(3724),v=n(6395),g="constructor",y="Iterator",b=h("toStringTag"),_=TypeError,E=o[y],w=v||!a(E)||E.prototype!==p||!d((function(){E({})})),S=function(){if(i(this,p),l(this)===p)throw new _("Abstract class Iterator not directly constructable")},T=function(e,t){m?u(p,e,{configurable:!0,get:function(){return t},set:function(t){if(s(this),this===p)throw new _("You can't redefine this property");f(this,e)?this[e]=t:c(this,e,t)}}):p[e]=t};f(p,b)||T(b,y),!w&&f(p,g)&&p[g]!==Object||T(g,S),S.prototype=p,r({global:!0,constructor:!0,forced:w},{Iterator:S})},8227:function(e,t,n){"use strict";var r=n(4576),o=n(5745),i=n(9297),s=n(3392),a=n(4495),l=n(7040),u=r.Symbol,c=o("wks"),d=l?u["for"]||u:u&&u.withoutSetter||s;e.exports=function(e){return i(c,e)||(c[e]=a&&i(u,e)?u[e]:d("Symbol."+e)),c[e]}},8237:function(e,t,n){"use strict";var r=n(6518),o=n(2652),i=n(9306),s=n(8551),a=n(1767),l=n(9539),u=n(4549),c=n(8745),d=n(9039),f=TypeError,h=d((function(){[].keys().reduce((function(){}),void 0)})),p=!h&&u("reduce",f);r({target:"Iterator",proto:!0,real:!0,forced:h||p},{reduce:function(e){s(this);try{i(e)}catch(d){l(this,"throw",d)}var t=arguments.length<2,n=t?void 0:arguments[1];if(p)return c(p,this,t?[e]:[e,n]);var r=a(this),u=0;if(o(r,(function(r){t?(t=!1,n=r):n=e(n,r,u),u++}),{IS_RECORD:!0}),t)throw new f("Reduce of empty iterator with no initial value");return n}})},8311:function(e,t,n){"use strict";const r=/\s+/g;class o{constructor(e,t){if(t=a(t),e instanceof o)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new o(e.raw,t);if(e instanceof l)return this.raw=e.value,this.set=[[e]],this.formatted=void 0,this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e.trim().replace(r," "),this.set=this.raw.split("||").map((e=>this.parseRange(e.trim()))).filter((e=>e.length)),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const e=this.set[0];if(this.set=this.set.filter((e=>!y(e[0]))),0===this.set.length)this.set=[e];else if(this.set.length>1)for(const t of this.set)if(1===t.length&&b(t[0])){this.set=[t];break}}this.formatted=void 0}get range(){if(void 0===this.formatted){this.formatted="";for(let e=0;e0&&(this.formatted+="||");const t=this.set[e];for(let e=0;e0&&(this.formatted+=" "),this.formatted+=t[e].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){const t=(this.options.includePrerelease&&v)|(this.options.loose&&g),n=t+":"+e,r=s.get(n);if(r)return r;const o=this.options.loose,i=o?d[f.HYPHENRANGELOOSE]:d[f.HYPHENRANGE];e=e.replace(i,L(this.options.includePrerelease)),u("hyphen replace",e),e=e.replace(d[f.COMPARATORTRIM],h),u("comparator trim",e),e=e.replace(d[f.TILDETRIM],p),u("tilde trim",e),e=e.replace(d[f.CARETTRIM],m),u("caret trim",e);let a=e.split(" ").map((e=>E(e,this.options))).join(" ").split(/\s+/).map((e=>I(e,this.options)));o&&(a=a.filter((e=>(u("loose invalid filter",e,this.options),!!e.match(d[f.COMPARATORLOOSE]))))),u("range list",a);const c=new Map,b=a.map((e=>new l(e,this.options)));for(const s of b){if(y(s))return[s];c.set(s.value,s)}c.size>1&&c.has("")&&c.delete("");const _=[...c.values()];return s.set(n,_),_}intersects(e,t){if(!(e instanceof o))throw new TypeError("a Range is required");return this.set.some((n=>_(n,t)&&e.set.some((e=>_(e,t)&&n.every((n=>e.every((e=>n.intersects(e,t)))))))))}test(e){if(!e)return!1;if("string"===typeof e)try{e=new c(e,this.options)}catch(t){return!1}for(let n=0;n"<0.0.0-0"===e.value,b=e=>""===e.value,_=(e,t)=>{let n=!0;const r=e.slice();let o=r.pop();while(n&&r.length)n=r.every((e=>o.intersects(e,t))),o=r.pop();return n},E=(e,t)=>(u("comp",e,t),e=C(e,t),u("caret",e),e=S(e,t),u("tildes",e),e=O(e,t),u("xrange",e),e=R(e,t),u("stars",e),e),w=e=>!e||"x"===e.toLowerCase()||"*"===e,S=(e,t)=>e.trim().split(/\s+/).map((e=>T(e,t))).join(" "),T=(e,t)=>{const n=t.loose?d[f.TILDELOOSE]:d[f.TILDE];return e.replace(n,((t,n,r,o,i)=>{let s;return u("tilde",e,t,n,r,o,i),w(n)?s="":w(r)?s=`>=${n}.0.0 <${+n+1}.0.0-0`:w(o)?s=`>=${n}.${r}.0 <${n}.${+r+1}.0-0`:i?(u("replaceTilde pr",i),s=`>=${n}.${r}.${o}-${i} <${n}.${+r+1}.0-0`):s=`>=${n}.${r}.${o} <${n}.${+r+1}.0-0`,u("tilde return",s),s}))},C=(e,t)=>e.trim().split(/\s+/).map((e=>k(e,t))).join(" "),k=(e,t)=>{u("caret",e,t);const n=t.loose?d[f.CARETLOOSE]:d[f.CARET],r=t.includePrerelease?"-0":"";return e.replace(n,((t,n,o,i,s)=>{let a;return u("caret",e,t,n,o,i,s),w(n)?a="":w(o)?a=`>=${n}.0.0${r} <${+n+1}.0.0-0`:w(i)?a="0"===n?`>=${n}.${o}.0${r} <${n}.${+o+1}.0-0`:`>=${n}.${o}.0${r} <${+n+1}.0.0-0`:s?(u("replaceCaret pr",s),a="0"===n?"0"===o?`>=${n}.${o}.${i}-${s} <${n}.${o}.${+i+1}-0`:`>=${n}.${o}.${i}-${s} <${n}.${+o+1}.0-0`:`>=${n}.${o}.${i}-${s} <${+n+1}.0.0-0`):(u("no pr"),a="0"===n?"0"===o?`>=${n}.${o}.${i}${r} <${n}.${o}.${+i+1}-0`:`>=${n}.${o}.${i}${r} <${n}.${+o+1}.0-0`:`>=${n}.${o}.${i} <${+n+1}.0.0-0`),u("caret return",a),a}))},O=(e,t)=>(u("replaceXRanges",e,t),e.split(/\s+/).map((e=>A(e,t))).join(" ")),A=(e,t)=>{e=e.trim();const n=t.loose?d[f.XRANGELOOSE]:d[f.XRANGE];return e.replace(n,((n,r,o,i,s,a)=>{u("xRange",e,n,r,o,i,s,a);const l=w(o),c=l||w(i),d=c||w(s),f=d;return"="===r&&f&&(r=""),a=t.includePrerelease?"-0":"",l?n=">"===r||"<"===r?"<0.0.0-0":"*":r&&f?(c&&(i=0),s=0,">"===r?(r=">=",c?(o=+o+1,i=0,s=0):(i=+i+1,s=0)):"<="===r&&(r="<",c?o=+o+1:i=+i+1),"<"===r&&(a="-0"),n=`${r+o}.${i}.${s}${a}`):c?n=`>=${o}.0.0${a} <${+o+1}.0.0-0`:d&&(n=`>=${o}.${i}.0${a} <${o}.${+i+1}.0-0`),u("xRange return",n),n}))},R=(e,t)=>(u("replaceStars",e,t),e.trim().replace(d[f.STAR],"")),I=(e,t)=>(u("replaceGTE0",e,t),e.trim().replace(d[t.includePrerelease?f.GTE0PRE:f.GTE0],"")),L=e=>(t,n,r,o,i,s,a,l,u,c,d,f)=>(n=w(r)?"":w(o)?`>=${r}.0.0${e?"-0":""}`:w(i)?`>=${r}.${o}.0${e?"-0":""}`:s?`>=${n}`:`>=${n}${e?"-0":""}`,l=w(u)?"":w(c)?`<${+u+1}.0.0-0`:w(d)?`<${u}.${+c+1}.0-0`:f?`<=${u}.${c}.${d}-${f}`:e?`<${u}.${c}.${+d+1}-0`:`<=${l}`,`${n} ${l}`.trim()),N=(e,t,n)=>{for(let r=0;r0){const r=e[n].semver;if(r.major===t.major&&r.minor===t.minor&&r.patch===t.patch)return!0}return!1}return!0}},8480:function(e,t,n){"use strict";var r=n(1828),o=n(8727),i=o.concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},8551:function(e,t,n){"use strict";var r=n(34),o=String,i=TypeError;e.exports=function(e){if(r(e))return e;throw new i(o(e)+" is not an object")}},8568:function(e,t,n){ /*! Name: vue-upload-component Component URI: https://github.com/lian-yue/vue-upload-component#readme Version: 3.1.16 Author: LianYue License: Apache-2.0 Description: Vue.js file upload component, Multi-file upload, Upload directory, Drag upload, Drag the directory, Upload multiple files at the same time, html4 (IE 9), `PUT` method, Customize the filter */ (function(t,r){e.exports=r(n(8756))})(0,(function(e){"use strict";function t(e){return i(e)||o(e)||r(e)||n()}function n(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(e,t){if(e){if("string"===typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function o(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function i(e){if(Array.isArray(e))return s(e)}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=200&&e.status<300){var t;try{t=JSON.parse(e.response)}catch(o){t=e.response}n(t)}else r(e.response)},e.onerror=function(){return r(e.response)},e.send(JSON.stringify(t))}))},b=function(e,t){var n=new FormData;for(var r in t)n.append(r,t[r]);return new Promise((function(t,r){e.onload=function(){if(e.status>=200&&e.status<300){var n;try{n=JSON.parse(e.response)}catch(o){n=e.response}t(n)}else r(e.response)},e.onerror=function(){return r(e.response)},e.send(n)}))};function _(e){var t=g(e);return y(t,e.body)}var E=function(){function e(t,n){h(this,e),this.file=t,this.options=n,this.chunks=[],this.sessionId=null,this.chunkSize=null,this.speedInterval=null}return m(e,[{key:"maxRetries",get:function(){return parseInt(this.options.maxRetries,10)}},{key:"maxActiveChunks",get:function(){return parseInt(this.options.maxActive,10)}},{key:"fileType",get:function(){return this.file.type}},{key:"fileSize",get:function(){return this.file.size}},{key:"fileName",get:function(){return this.file.name}},{key:"action",get:function(){return this.options.action||null}},{key:"startBody",get:function(){return this.options.startBody||{}}},{key:"uploadBody",get:function(){return this.options.uploadBody||{}}},{key:"finishBody",get:function(){return this.options.finishBody||{}}},{key:"headers",get:function(){return this.options.headers||{}}},{key:"readyToUpload",get:function(){return!!this.chunks}},{key:"progress",get:function(){var e=this,t=this.chunksUploaded.length/this.chunks.length*100,n=this.chunksUploading.reduce((function(t,n){return t+(0|n.progress)/e.chunks.length}),0);return Math.min(t+n,100)}},{key:"chunksToUpload",get:function(){return this.chunks.filter((function(e){return!e.active&&!e.uploaded}))}},{key:"hasChunksToUpload",get:function(){return this.chunksToUpload.length>0}},{key:"chunksUploading",get:function(){return this.chunks.filter((function(e){return!!e.xhr&&!!e.active}))}},{key:"chunksUploaded",get:function(){return this.chunks.filter((function(e){return!!e.uploaded}))}},{key:"createChunks",value:function(){this.chunks=[];var e=0,t=this.chunkSize;while(e1&&o.length+this.files.length>=this.iMaximum)break;if(o.push(s),1===this.iMaximum)break}}if(o.length){var u;if(1===this.iMaximum&&this.clear(),!0===n||0===n)u=o.concat(this.files);else if(n){var c;u=this.files.concat([]),(c=u).splice.apply(c,[n,0].concat(t(o)))}else u=this.files.concat(o);this.files=u;var d=0;!0===n||0===n?d=0:n?n>=0?d=n+o.length>this.files.length?this.files.length-o.length:n:(d=this.files.length-o.length+n,d<0&&(d=0)):d=this.files.length-o.length,o=this.files.slice(d,d+o.length);for(var f=0;f0&&l.length>=a)break;return Promise.resolve(this.add(l))}return Promise.resolve([])},getFileSystemEntry:function(e){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return new Promise((function(o){var i=n.iMaximum;if(e)if(e instanceof Array){var s=[],a=function a(l){var u=e[l];if(!u||i>0&&s.length>=i)return o(s);n.getFileSystemEntry(u,r).then((function(e){s.push.apply(s,t(e)),a(l+1)}))};a(0)}else if(e instanceof Blob)o([{id:"",size:e.size,name:r+e.name,type:e.type,file:e}]);else if(e.isFile){var l=e;l.file((function(e){o([{id:"",size:e.size,name:r+e.name,type:e.type,file:e}])}))}else if(e.isDirectory&&n.dropDirectory){var u=e,c=[];n.createDirectory&&c.push({id:"",name:r+u.name,size:0,type:"text/directory",file:new File([],r+u.name,{type:"text/directory"})});var d=u.createReader(),f=function e(){d.readEntries((function(s){var a=function a(l){return!s[l]&&0===l||i>0&&c.length>=i?o(c):s[l]?void n.getFileSystemEntry(s[l],r+u.name+"/").then((function(e){c.push.apply(c,t(e)),a(l+1)})):e()};a(0)}))};f()}else o([]);else o([])}))},replace:function(e,t){var n=this.get(e),r=this.get(t);if(!n||!r||n===r)return!1;var o=this.files.concat([]),i=o.indexOf(n),s=o.indexOf(r);return-1!==i&&-1!==s&&(o[i]=r,o[s]=n,this.files=o,this.emitInput(),!0)},remove:function(e){var t=this.get(e);if(t){if(this.emitFilter(void 0,t))return!1;var n=this.files.concat([]),r=n.indexOf(t);if(-1===r)return console.error("remove",t),!1;n.splice(r,1),this.files=n,delete this.maps[t.id],this.emitInput(),this.emitFile(void 0,t)}return t},update:function(e,t){var n=this.get(e);if(n){var r=l(l({},n),t);if(!n.fileObject||!n.active||r.active||r.error||r.success||(r.error="abort"),this.emitFilter(r,n))return!1;var o=this.files.concat([]),i=o.indexOf(n);return-1===i?(console.error("update",n),!1):(o.splice(i,1,r),this.files=o,r=this.files[i],delete this.maps[n.id],this.maps[r.id]=r,this.emitInput(),this.emitFile(r,n),r)}return!1},emitFilter:function(e,t){var n=!1;return this.$emit("input-filter",e,t,(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return n=e,n})),n},emitFile:function(e,t){var n,r=this;this.$emit("input-file",e,t),null===(n=e)||void 0===n||!n.fileObject||!e.active||t&&t.active?e&&e.fileObject&&e.active||!t||!t.fileObject||!t.active||this.uploading--:(this.uploading++,this.$nextTick((function(){setTimeout((function(){e&&r.upload(e).then((function(){var t;e&&(e=r.get(e)||void 0),null!==(t=e)&&void 0!==t&&t.fileObject&&r.update(e,{active:!1,success:!e.error})})).catch((function(t){e&&r.update(e,{active:!1,success:!1,error:t.code||t.error||t.message||t})}))}),Math.ceil(50*Math.random()+50))}))),!this.active||Boolean(e)===Boolean(t)&&e.active===t.active||this.watchActive(!0)},emitInput:function(){this.$emit("update:modelValue",this.files)},upload:function(e){var t=this.get(e);if(!t)return Promise.reject(new Error("not_exists"));if(!t.fileObject)return Promise.reject(new Error("file_object"));if(t.error)return t.error instanceof Error?Promise.reject(t.error):Promise.reject(new Error(t.error));if(t.success)return Promise.resolve(t);if(t.name&&this.iExtensions&&"text/directory"!==t.type&&-1===t.name.search(this.iExtensions))return Promise.reject(new Error("extension"));if(this.size>0&&void 0!==t.size&&t.size>=0&&t.size>this.size&&"text/directory"!==t.type)return Promise.reject(new Error("size"));if(this.customAction)return this.customAction(t,this);if(this.features.html5){if(this.shouldUseChunkUpload(t))return this.uploadChunk(t);if(t.putAction)return this.uploadPut(t);if(t.postAction)return this.uploadHtml5(t)}return t.postAction?this.uploadHtml4(t):Promise.reject(new Error("No action configured"))},shouldUseChunkUpload:function(e){return this.chunkEnabled&&!!this.chunkOptions.handler&&e.size&&e.size>this.chunkOptions.minSize},uploadChunk:function(e){var t=this.chunkOptions.handler;return e.chunk=new t(e,this.chunkOptions),e.chunk.upload().then((function(t){return e}))},uploadPut:function(e){var t,n=[];for(var r in e.data)t=e.data[r],null!==t&&void 0!==t&&n.push(encodeURIComponent(r)+"="+encodeURIComponent(t));var o=e.putAction||"",i=n.length?(-1===o.indexOf("?")?"?":"&")+n.join("&"):"",s=new XMLHttpRequest;return s.open("PUT",o+i),this.uploadXhr(s,e,e.file)},uploadHtml5:function(e){var t,n=new window.FormData;for(var r in e.data)t=e.data[r],t&&"object"===c(t)&&"function"!==typeof t.toString?t instanceof File?n.append(r,t,t.name):n.append(r,JSON.stringify(t)):null!==t&&void 0!==t&&n.append(r,t);n.append(this.name,e.file,e.name||e.file.name||e.file.filename);var o=new XMLHttpRequest;return o.open("POST",e.postAction||""),this.uploadXhr(o,e,n)},uploadXhr:function(e,t,n){var r=this,o=t,i=0,s=0;e.upload.onprogress=function(e){if(o&&(o=r.get(o),e.lengthComputable&&o&&o.fileObject&&o.active)){var t=Math.round(Date.now()/1e3);t!==i&&(i=t,o=r.update(o,{progress:(e.loaded/e.total*100).toFixed(2),speed:e.loaded-s}),s=e.loaded)}};var a=window.setInterval((function(){var t;if(o&&((o=r.get(o))&&null!==(t=o)&&void 0!==t&&t.fileObject&&!o.success&&!o.error&&o.active))return;a&&(clearInterval(a),a=void 0);try{e.abort(),e.timeout=1}catch(n){}}),100);return new Promise((function(t,i){if(o){var s,l=function(n){if(!s){if(s=!0,a&&(clearInterval(a),a=void 0),!o)return i(new Error("not_exists"));if(o=r.get(o),!o)return i(new Error("not_exists"));if(!o.fileObject)return i(new Error("file_object"));if(o.error)return o.error instanceof Error?i(o.error):i(new Error(o.error));if(!o.active)return i(new Error("abort"));if(o.success)return t(o);var l={};switch(n.type){case"timeout":case"abort":l.error=n.type;break;case"error":e.status?e.status>=500?l.error="server":e.status>=400&&(l.error="denied"):l.error="network";break;default:e.status>=500?l.error="server":e.status>=400?l.error="denied":l.progress="100.00"}if(e.responseText){var u=e.getResponseHeader("Content-Type");u&&-1!==u.indexOf("/json")?l.response=JSON.parse(e.responseText):l.response=e.responseText}return o=r.update(o,l),o?o.error?o.error instanceof Error?i(o.error):i(new Error(o.error)):t(o):i(new Error("abort"))}};for(var u in e.onload=l,e.onerror=l,e.onabort=l,e.ontimeout=l,o.timeout&&(e.timeout=o.timeout),o.headers)e.setRequestHeader(u,o.headers[u]);o=r.update(o,{xhr:e}),o&&e.send(n)}else i(new Error("not_exists"))}))},uploadHtml4:function(e){var t=this,n=e;if(!n)return Promise.reject(new Error("not_exists"));var r=function(e){27===e.keyCode&&e.preventDefault()},o=document.createElement("iframe");o.id="upload-iframe-"+n.id,o.name="upload-iframe-"+n.id,o.src="about:blank",o.setAttribute("style","width:1px;height:1px;top:-999em;position:absolute; margin-top:-999em;");var i=document.createElement("form");for(var s in i.setAttribute("action",n.postAction||""),i.name="upload-form-"+n.id,i.setAttribute("method","POST"),i.setAttribute("target","upload-iframe-"+n.id),i.setAttribute("enctype","multipart/form-data"),n.data){var a=n.data[s];if(a&&"object"===c(a)&&"function"!==typeof a.toString&&(a=JSON.stringify(a)),null!==a&&void 0!==a){var l=document.createElement("input");l.type="hidden",l.name=s,l.value=a,i.appendChild(l)}}i.appendChild(n.el),document.body.appendChild(o).appendChild(i);var u=function(){var e,t;try{o.contentWindow&&(t=o.contentWindow.document)}catch(n){}if(!t)try{t=o.contentDocument?o.contentDocument:o.document}catch(n){t=o.document}return null!==(e=t)&&void 0!==e&&e.body?t.body.innerHTML:null};return new Promise((function(e,s){setTimeout((function(){if(n){if(n=t.update(n,{iframe:o}),!n)return s(new Error("not_exists"));var a,l=window.setInterval((function(){n&&(n=t.get(n))&&n.fileObject&&!n.success&&!n.error&&n.active||(l&&(clearInterval(l),l=void 0),o.onabort({type:n?"abort":"not_exists"}))}),100),c=function(o){var i;if(!a){if(a=!0,l&&(clearInterval(l),l=void 0),document.body.removeEventListener("keydown",r),!n)return s(new Error("not_exists"));if(n=t.get(n),!n)return s(new Error("not_exists"));if(!n.fileObject)return s(new Error("file_object"));if(n.error)return n.error instanceof Error?s(n.error):s(new Error(n.error));if(!n.active)return s(new Error("abort"));if(n.success)return e(n);var c=u(),d={};if("string"===typeof o)return s(new Error(o));switch(o.type){case"abort":d.error="abort";break;case"error":n.error?d.error=n.error:d.error=null===c?"network":"denied";break;default:n.error?d.error=n.error:null===c?d.error="network":d.progress="100.00"}if(null!==c){if(c&&"{"===c.substr(0,1)&&"}"===c.substr(c.length-1,1))try{c=JSON.parse(c)}catch(f){}d.response=c}return n=t.update(n,d),n?null!==(i=n)&&void 0!==i&&i.error?n.error instanceof Error?s(n.error):s(new Error(n.error)):e(n):s(new Error("not_exists"))}};o.onload=c,o.onerror=c,o.onabort=c,document.body.addEventListener("keydown",r),i.submit()}else s(new Error("not_exists"))}),50)})).then((function(e){var t;return null===o||void 0===o||null===(t=o.parentNode)||void 0===t||t.removeChild(o),e})).catch((function(e){var t;return null===o||void 0===o||null===(t=o.parentNode)||void 0===t||t.removeChild(o),e}))},watchActive:function(e){var t,n=0;while(t=this.files[n])if(n++,t.fileObject)if(e&&!this.destroy){if(this.uploading>=this.thread||this.uploading&&!this.features.html5)break;t.active||t.error||t.success||this.update(t,{active:!0})}else t.active&&this.update(t,{active:!1});else;0===this.uploading&&(this.active=!1)},watchDrop:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(this.features.drop&&e!==t){if(this.dropElement)try{document.removeEventListener("dragenter",this.onDocumentDragenter,!1),document.removeEventListener("dragleave",this.onDocumentDragleave,!1),document.removeEventListener("dragover",this.onDocumentDragover,!1),document.removeEventListener("drop",this.onDocumentDrop,!1),this.dropElement.removeEventListener("dragenter",this.onDragenter,!1),this.dropElement.removeEventListener("dragleave",this.onDragleave,!1),this.dropElement.removeEventListener("dragover",this.onDragover,!1),this.dropElement.removeEventListener("drop",this.onDrop,!1)}catch(i){}var n=null;if(e)if("string"===typeof e)n=document.querySelector(e)||this.$root.$el.querySelector(e);else if(!0===e){var r,o;if(n=this.$parent.$el,!n||8===(null===(r=n)||void 0===r?void 0:r.nodeType))n=this.$root.$el,n&&8!==(null===(o=n)||void 0===o?void 0:o.nodeType)||(n=document.body)}else n=e;else;this.dropElement=n,this.dropElement&&(document.addEventListener("dragenter",this.onDocumentDragenter,!1),document.addEventListener("dragleave",this.onDocumentDragleave,!1),document.addEventListener("dragover",this.onDocumentDragover,!1),document.addEventListener("drop",this.onDocumentDrop,!1),this.dropElement.addEventListener("dragenter",this.onDragenter,!1),this.dropElement.addEventListener("dragleave",this.onDragleave,!1),this.dropElement.addEventListener("dragover",this.onDragover,!1),this.dropElement.addEventListener("drop",this.onDrop,!1))}},watchDropActive:function(e,t){e!==t&&(!e&&this.dropElementActive&&(this.dropElementActive=!1),this.dropTimeout&&(clearTimeout(this.dropTimeout),this.dropTimeout=null),e&&(this.dropTimeout=setTimeout(this.onDocumentDrop,1e3)))},onDocumentDragenter:function(e){var t,n;if(!this.dropActive&&e.dataTransfer){var r=e.dataTransfer;null!==r&&void 0!==r&&null!==(t=r.files)&&void 0!==t&&t.length?this.dropActive=!0:r.types?(r.types.indexOf&&-1!==r.types.indexOf("Files")||null!==(n=r.types)&&void 0!==n&&n.contains&&r.types.contains("Files"))&&(this.dropActive=!0):this.dropActive=!0,this.dropActive&&this.watchDropActive(!0)}},onDocumentDragleave:function(e){this.dropActive&&(e.target===e.explicitOriginalTarget||!e.fromElement&&(e.clientX<=0||e.clientY<=0||e.clientX>=window.innerWidth||e.clientY>=window.innerHeight))&&(this.dropActive=!1,this.watchDropActive(!1))},onDocumentDragover:function(){this.watchDropActive(!0)},onDocumentDrop:function(){this.dropActive=!1,this.watchDropActive(!1)},onDragenter:function(e){this.dropActive&&!this.dropElementActive&&(this.dropElementActive=!0)},onDragleave:function(e){var t;if(this.dropElementActive){var n=e.relatedTarget;if(n)if(null!==(t=this.dropElement)&&void 0!==t&&t.contains)this.dropElement.contains(n)||(this.dropElementActive=!1);else{var r=n;while(r){if(r===this.dropElement)break;r=r.parentNode}r!==this.dropElement&&(this.dropElementActive=!1)}else this.dropElementActive=!1}},onDragover:function(e){e.preventDefault()},onDrop:function(e){e.preventDefault(),e.dataTransfer&&this.addDataTransfer(e.dataTransfer)},inputOnChange:async function(e){var t=this;if(!(e.target instanceof HTMLInputElement))return Promise.reject(new Error("not HTMLInputElement"));e.target;var n=function(e){return t.reload=!0,t.$nextTick((function(){t.reload=!1})),e};return this.addInputFile(e.target).then(n).catch(n)},isRelatedTargetSupported:function(){try{var e=new MouseEvent("mouseout",{relatedTarget:document.body});return"relatedTarget"in e}catch(t){return!1}}}}),T=["for"],C=["name","id","accept","capture","disabled","webkitdirectory","allowdirs","directory","multiple"];function k(t,n,r,o,i,s){return e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(t.className)},[e.renderSlot(t.$slots,"default"),e.createElementVNode("label",{for:t.forId},null,8,T),t.reload?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("input",{key:0,ref:"input",type:"file",name:t.name,id:t.forId,accept:t.accept,capture:t.capture,disabled:t.disabled,webkitdirectory:t.iDirectory,allowdirs:t.iDirectory,directory:t.iDirectory,multiple:t.multiple&&t.features.html5,onChange:n[0]||(n[0]=function(){return t.inputOnChange&&t.inputOnChange.apply(t,arguments)})},null,40,C))],2)}function O(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!==typeof document){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===n&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var A="\n.file-uploads {\n overflow: hidden;\n position: relative;\n text-align: center;\n display: inline-block;\n}\n.file-uploads.file-uploads-html4 input,\n.file-uploads.file-uploads-html5 label {\n /* background fix ie click */\n background: #fff;\n opacity: 0;\n font-size: 20em;\n z-index: 1;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n position: absolute;\n width: 100%;\n height: 100%;\n}\n.file-uploads.file-uploads-html5 input,\n.file-uploads.file-uploads-html4 label {\n /* background fix ie click */\n position: absolute;\n background: rgba(255, 255, 255, 0);\n overflow: hidden;\n position: fixed;\n width: 1px;\n height: 1px;\n z-index: -1;\n opacity: 0;\n}\n";return O(A),S.render=k,S}))},8587:function(e){"use strict";const t=Object.freeze({loose:!0}),n=Object.freeze({}),r=e=>e?"object"!==typeof e?t:e:n;e.exports=r},8622:function(e,t,n){"use strict";var r=n(4576),o=n(4901),i=r.WeakMap;e.exports=o(i)&&/native code/.test(String(i))},8686:function(e,t,n){"use strict";var r=n(3724),o=n(9039);e.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},8721:function(e,t,n){"use strict";var r=n(3724),o=n(9504),i=n(2106),s=URLSearchParams.prototype,a=o(s.forEach);r&&!("size"in s)&&i(s,"size",{get:function(){var e=0;return a(this,(function(){e++})),e},configurable:!0,enumerable:!0})},8727:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},8745:function(e,t,n){"use strict";var r=n(616),o=Function.prototype,i=o.apply,s=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?s.bind(i):function(){return s.apply(i,arguments)})},8756:function(e,t,n){"use strict";n.r(t),n.d(t,{BaseTransition:function(){return r.pR},BaseTransitionPropsValidators:function(){return r.QP},Comment:function(){return r.Mw},DeprecationTypes:function(){return r.aT},EffectScope:function(){return r.yC},ErrorCodes:function(){return r.tG},ErrorTypeStrings:function(){return r.ZQ},Fragment:function(){return r.FK},KeepAlive:function(){return r.PR},ReactiveEffect:function(){return r.X2},Static:function(){return r.jC},Suspense:function(){return r.tY},Teleport:function(){return r.Im},Text:function(){return r.EY},TrackOpTypes:function(){return r.Ul},Transition:function(){return r.eB},TransitionGroup:function(){return r.F},TriggerOpTypes:function(){return r.PP},VueElement:function(){return r.Vy},assertNumber:function(){return r.U4},callWithAsyncErrorHandling:function(){return r.qL},callWithErrorHandling:function(){return r.gh},camelize:function(){return r.PT},capitalize:function(){return r.ZH},cloneVNode:function(){return r.E3},compatUtils:function(){return r.Y5},compile:function(){return o},computed:function(){return r.EW},createApp:function(){return r.Ef},createBlock:function(){return r.Wv},createCommentVNode:function(){return r.Q3},createElementBlock:function(){return r.CE},createElementVNode:function(){return r.Lk},createHydrationRenderer:function(){return r.ci},createPropsRestProxy:function(){return r.bn},createRenderer:function(){return r.K9},createSSRApp:function(){return r.m1},createSlots:function(){return r.eX},createStaticVNode:function(){return r.Fv},createTextVNode:function(){return r.eW},createVNode:function(){return r.bF},customRef:function(){return r.rY},defineAsyncComponent:function(){return r.$V},defineComponent:function(){return r.pM},defineCustomElement:function(){return r.Xq},defineEmits:function(){return r.qP},defineExpose:function(){return r.wk},defineModel:function(){return r.NP},defineOptions:function(){return r.GM},defineProps:function(){return r.Yj},defineSSRCustomElement:function(){return r.Po},defineSlots:function(){return r.Lu},devtools:function(){return r.lt},effect:function(){return r.QZ},effectScope:function(){return r.uY},getCurrentInstance:function(){return r.nI},getCurrentScope:function(){return r.o5},getCurrentWatcher:function(){return r.Yv},getTransitionRawChildren:function(){return r.Df},guardReactiveProps:function(){return r.Ng},h:function(){return r.h},handleError:function(){return r.H4},hasInjectionContext:function(){return r.PS},hydrate:function(){return r.Qv},hydrateOnIdle:function(){return r.rU},hydrateOnInteraction:function(){return r.Tq},hydrateOnMediaQuery:function(){return r.dA},hydrateOnVisible:function(){return r.Pn},initCustomFormatter:function(){return r.y$},initDirectivesForSSR:function(){return r.Ib},inject:function(){return r.WQ},isMemoSame:function(){return r.Bs},isProxy:function(){return r.ju},isReactive:function(){return r.g8},isReadonly:function(){return r.Tm},isRef:function(){return r.i9},isRuntimeOnly:function(){return r.wX},isShallow:function(){return r.fE},isVNode:function(){return r.vv},markRaw:function(){return r.IG},mergeDefaults:function(){return r.HF},mergeModels:function(){return r.zz},mergeProps:function(){return r.v6},nextTick:function(){return r.dY},normalizeClass:function(){return r.C4},normalizeProps:function(){return r._B},normalizeStyle:function(){return r.Tr},onActivated:function(){return r.n},onBeforeMount:function(){return r.KC},onBeforeUnmount:function(){return r.xo},onBeforeUpdate:function(){return r.Ic},onDeactivated:function(){return r.Y4},onErrorCaptured:function(){return r.qG},onMounted:function(){return r.sV},onRenderTracked:function(){return r.qR},onRenderTriggered:function(){return r.bj},onScopeDispose:function(){return r.jr},onServerPrefetch:function(){return r.SS},onUnmounted:function(){return r.hi},onUpdated:function(){return r.$u},onWatcherCleanup:function(){return r.ch},openBlock:function(){return r.uX},popScopeId:function(){return r.jt},provide:function(){return r.Gt},proxyRefs:function(){return r.Pr},pushScopeId:function(){return r.Qi},queuePostFlushCb:function(){return r.Dl},reactive:function(){return r.Kh},readonly:function(){return r.tB},ref:function(){return r.KR},registerRuntimeCompiler:function(){return r.tC},render:function(){return r.XX},renderList:function(){return r.pI},renderSlot:function(){return r.RG},resolveComponent:function(){return r.g2},resolveDirective:function(){return r.gN},resolveDynamicComponent:function(){return r.$y},resolveFilter:function(){return r.LJ},resolveTransitionHooks:function(){return r.OW},setBlockTracking:function(){return r.Vq},setDevtoolsHook:function(){return r.iD},setTransitionHooks:function(){return r.MZ},shallowReactive:function(){return r.Gc},shallowReadonly:function(){return r.nD},shallowRef:function(){return r.IJ},ssrContextKey:function(){return r.Fw},ssrUtils:function(){return r.Gw},stop:function(){return r.ds},toDisplayString:function(){return r.v_},toHandlerKey:function(){return r.Kf},toHandlers:function(){return r.Tb},toRaw:function(){return r.ux},toRef:function(){return r.lW},toRefs:function(){return r.QW},toValue:function(){return r.BA},transformVNodeArgs:function(){return r.gW},triggerRef:function(){return r.mu},unref:function(){return r.R1},useAttrs:function(){return r.OA},useCssModule:function(){return r.D},useCssVars:function(){return r.$9},useHost:function(){return r.KT},useId:function(){return r.Bi},useModel:function(){return r.fn},useSSRContext:function(){return r.LM},useShadowRoot:function(){return r._U},useSlots:function(){return r.Ht},useTemplateRef:function(){return r.rk},useTransitionState:function(){return r.Gy},vModelCheckbox:function(){return r.lH},vModelDynamic:function(){return r.hp},vModelRadio:function(){return r.XL},vModelSelect:function(){return r.u1},vModelText:function(){return r.Jo},vShow:function(){return r.aG},version:function(){return r.rE},warn:function(){return r.R8},watch:function(){return r.wB},watchEffect:function(){return r.nT},watchPostEffect:function(){return r.p9},watchSyncEffect:function(){return r.U_},withAsyncContext:function(){return r.E},withCtx:function(){return r.k6},withDefaults:function(){return r.rO},withDirectives:function(){return r.bo},withKeys:function(){return r.jR},withMemo:function(){return r.bU},withModifiers:function(){return r.D$},withScopeId:function(){return r.YY}});var r=n(3751); /** * vue v3.5.16 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/const o=()=>{0}},8773:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);t.f=o?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},8794:function(e){"use strict";class t{constructor(){this.max=1e3,this.map=new Map}get(e){const t=this.map.get(e);return void 0===t?void 0:(this.map.delete(e),this.map.set(e,t),t)}delete(e){return this.map.delete(e)}set(e,t){const n=this.delete(e);if(!n&&void 0!==t){if(this.map.size>=this.max){const e=this.map.keys().next().value;this.delete(e)}this.map.set(e,t)}return this}}e.exports=t},8823:function(e,t,n){"use strict";n.d(t,{A:function(){return h}});var r=n(641),o=n(33),i=n(3751);const s={class:"footer-languages"},a=["title"];function l(e,t,n,l,u,c){const d=(0,r.g2)("link-menu");return(0,r.uX)(),(0,r.CE)("div",s,[(0,r.Lk)("button",{class:"footer-languages__toggle",title:e.$t("ui.app.language"),onClick:t[0]||(t[0]=(...e)=>c.toggle&&c.toggle(...e))},(0,o.v_)(n.locales[n.current]),9,a),(0,r.bo)((0,r.bF)(d,{ref:"menu",class:"footer-languages__menu",color:"contao",valign:"top",tabindex:"-1",items:c.languageOptions,onFocusout:c.close,onClick:c.close},null,8,["items","onFocusout","onClick"]),[[i.aG,e.visible]])])}var u=n(4758),c={components:{LinkMenu:u.A},emits:["change"],props:{display:String,locales:Object,current:String},data:()=>({visible:!1}),computed:{languageOptions(){return Object.keys(this.locales).map((e=>({label:this.locales[e],active:e===this.current,action:()=>this.$emit("change",e)})))}},methods:{open(){this.visible=!0,setTimeout((()=>this.$refs.menu?.focus()),0)},close(e){e&&this.$refs.menu?.contains(e.relatedTarget)||(this.$refs.menu.blur(),setTimeout((()=>{this.visible=!1}),100))},toggle(){this.visible?this.close():this.open()}}},d=n(6262);const f=(0,d.A)(c,[["render",l]]);var h=f},8981:function(e,t,n){"use strict";var r=n(7750),o=Object;e.exports=function(e){return o(r(e))}},9039:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},9045:function(e,t,n){"use strict";n.d(t,{A:function(){return u}});var r=n(641),o=n(3751);function i(e,t,n,i,s,a){return n.horizontal?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"loader",onTransitionend:t[0]||(t[0]=(0,o.D$)((()=>{}),["stop"]))},[t[2]||(t[2]=(0,r.Fv)('
',5)),(0,r.RG)(e.$slots,"default")],32)):((0,r.uX)(),(0,r.CE)("div",{key:1,class:"loader",onTransitionend:t[1]||(t[1]=(0,o.D$)((()=>{}),["stop"]))},[t[3]||(t[3]=(0,r.Fv)('
',1)),(0,r.RG)(e.$slots,"default")],32))}var s={props:{horizontal:Boolean}},a=n(6262);const l=(0,a.A)(s,[["render",i]]);var u=l},9071:function(e,t,n){"use strict";n.d(t,{A:function(){return f}});var r=n(641),o=n(33),i=n(3751);const s=["href"];function a(e,t,n,a,l,u){return n.name.includes("/")?((0,r.uX)(),(0,r.CE)("a",{key:0,href:e.$router.resolve({query:{p:n.name}}).href,class:(0,o.C4)(["widget-button widget-button--details widget-button--info",{"widget-button--small":n.small,"widget-button--inline":n.inline}]),onClick:t[0]||(t[0]=(0,i.D$)((t=>e.setCurrent(n.name)),["prevent"]))},(0,o.v_)(e.$t("ui.discover.detailsButton")),11,s)):(0,r.Q3)("",!0)}var l=n(6278),u={props:{name:{type:String,required:!0},small:Boolean,inline:Boolean},methods:{...(0,l.PY)("packages/details",["setCurrent"])}},c=n(6262);const d=(0,c.A)(u,[["render",a]]);var f=d},9297:function(e,t,n){"use strict";var r=n(9504),o=n(8981),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},9306:function(e,t,n){"use strict";var r=n(4901),o=n(6823),i=TypeError;e.exports=function(e){if(r(e))return e;throw new i(o(e)+" is not a function")}},9348:function(){(function(){"use strict";var e=document.createElement("details"),t="undefined"!=typeof HTMLDetailsElement&&e instanceof HTMLDetailsElement,n={open:"open"in e||t,toggle:"ontoggle"in e},r='\ndetails, summary {\n display: block;\n}\ndetails:not([open]) > *:not(summary) {\n display: none;\n}\nsummary::before {\n content: "â–º";\n padding-right: 0.3rem;\n font-size: 0.6rem;\n cursor: default;\n}\n[open] > summary::before {\n content: "â–¼";\n}\n',o=[],i=o.forEach,s=o.slice;function a(){document.head.insertAdjacentHTML("afterbegin","")}function l(){var e=document.createElement("details").constructor.prototype,t=e.setAttribute,n=e.removeAttribute,r=Object.getOwnPropertyDescriptor(e,"open");Object.defineProperties(e,{open:{get:function(){return"DETAILS"==this.tagName?this.hasAttribute("open"):r&&r.get?r.get.call(this):void 0},set:function(e){return"DETAILS"==this.tagName?e?this.setAttribute("open",""):this.removeAttribute("open"):r&&r.set?r.set.call(this,e):void 0}},setAttribute:{value:function(e,n){var r=this,o=function(){return t.call(r,e,n)};if("open"==e&&"DETAILS"==this.tagName){var i=this.hasAttribute("open"),s=o();if(!i){var a=this.querySelector("summary");a&&a.setAttribute("aria-expanded",!0),m(this)}return s}return o()}},removeAttribute:{value:function(e){var t=this,r=function(){return n.call(t,e)};if("open"==e&&"DETAILS"==this.tagName){var o=this.hasAttribute("open"),i=r();if(o){var s=this.querySelector("summary");s&&s.setAttribute("aria-expanded",!1),m(this)}return i}return r()}}})}function u(){p((function(e){e.hasAttribute("open")?e.removeAttribute("open"):e.setAttribute("open","")}))}function c(){window.MutationObserver?new MutationObserver((function(e){i.call(e,(function(e){var t=e.target,n=e.attributeName;"DETAILS"==t.tagName&&"open"==n&&m(t)}))})).observe(document.documentElement,{attributes:!0,subtree:!0}):p((function(e){var t=e.getAttribute("open");setTimeout((function(){var n=e.getAttribute("open");t!=n&&m(e)}),1)}))}function d(){f(document),window.MutationObserver?new MutationObserver((function(e){i.call(e,(function(e){i.call(e.addedNodes,f)}))})).observe(document.documentElement,{subtree:!0,childList:!0}):document.addEventListener("DOMNodeInserted",(function(e){f(e.target)}))}function f(e){v(e,"SUMMARY").forEach((function(e){var t=g(e,"DETAILS");e.setAttribute("aria-expanded",t.hasAttribute("open")),e.hasAttribute("tabindex")||e.setAttribute("tabindex","0"),e.hasAttribute("role")||e.setAttribute("role","button")}))}function h(e){return!(e.defaultPrevented||e.ctrlKey||e.metaKey||e.shiftKey||e.target.isContentEditable)}function p(e){addEventListener("click",(function(t){if(h(t)&&t.which<=1){var n=g(t.target,"SUMMARY");n&&n.parentNode&&"DETAILS"==n.parentNode.tagName&&e(n.parentNode)}}),!1),addEventListener("keydown",(function(t){if(h(t)&&(13==t.keyCode||32==t.keyCode)){var n=g(t.target,"SUMMARY");n&&n.parentNode&&"DETAILS"==n.parentNode.tagName&&(e(n.parentNode),t.preventDefault())}}),!1)}function m(e){var t=document.createEvent("Event");t.initEvent("toggle",!1,!1),e.dispatchEvent(t)}function v(e,t){return(e.tagName==t?[e]:[]).concat("function"==typeof e.getElementsByTagName?s.call(e.getElementsByTagName(t)):[])}function g(e,t){if("function"==typeof e.closest)return e.closest(t);while(e){if(e.tagName==t)return e;e=e.parentNode}}n.open||(a(),l(),u(),d()),n.open&&!n.toggle&&c()})()},9376:function(e,t){"use strict";t.A={en:"English",de:"Deutsch (German)",br:"brezhoneg (Breton)",cs:"ÄeÅ¡tina (Czech)",es:"Español (Spanish)",fa:"ÙØ§Ø±Ø³ÛŒ (Persian)",fr:"Français (French)",it:"Italiano (Italian)",ja:"日本語 (Japanese)",lv:"latvieÅ¡u valoda (Latvian)",nl:"Nederlands (Dutch)",pl:"polszczyzna (Polish)",pt:"Português (Portuguese)",ru:"руÑÑкий (Russian)",sr:"ÑрпÑки језик (Serbian)",sv:"Svenska (Swedish)",tr:"Türkçe (Turkish)",zh:"中文 (Chinese)"}},9433:function(e,t,n){"use strict";var r=n(4576),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},9451:function(e,t,n){"use strict";n.d(t,{A:function(){return i}});var r=n(641);const o=e=>e&&e.every((e=>e.type===r.Mw||(e.type===Text&&"string"===typeof e.children&&!e.children.trim()||!(e.type!==r.FK||!o(e.children)))));function i(e){return!e||o(e())}},9462:function(e,t,n){"use strict";var r=n(9565),o=n(2360),i=n(6699),s=n(6279),a=n(8227),l=n(1181),u=n(5966),c=n(7657).IteratorPrototype,d=n(2529),f=n(9539),h=a("toStringTag"),p="IteratorHelper",m="WrapForValidIterator",v=l.set,g=function(e){var t=l.getterFor(e?m:p);return s(o(c),{next:function(){var n=t(this);if(e)return n.nextHandler();if(n.done)return d(void 0,!0);try{var r=n.nextHandler();return n.returnHandlerResult?r:d(r,n.done)}catch(o){throw n.done=!0,o}},return:function(){var n=t(this),o=n.iterator;if(n.done=!0,e){var i=u(o,"return");return i?r(i,o):d(void 0,!0)}if(n.inner)try{f(n.inner.iterator,"normal")}catch(s){return f(o,"throw",s)}return o&&f(o,"normal"),d(void 0,!0)}})},y=g(!0),b=g(!1);i(b,h,"Iterator Helper"),e.exports=function(e,t,n){var r=function(r,o){o?(o.iterator=r.iterator,o.next=r.next):o=r,o.type=t?m:p,o.returnHandlerResult=!!n,o.nextHandler=e,o.counter=0,o.done=!1,v(this,o)};return r.prototype=t?y:b,r}},9504:function(e,t,n){"use strict";var r=n(616),o=Function.prototype,i=o.call,s=r&&o.bind.bind(i,i);e.exports=r?s:function(e){return function(){return i.apply(e,arguments)}}},9519:function(e,t,n){"use strict";var r,o,i=n(4576),s=n(2839),a=i.process,l=i.Deno,u=a&&a.versions||l&&l.version,c=u&&u.v8;c&&(r=c.split("."),o=r[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&s&&(r=s.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=s.match(/Chrome\/(\d+)/),r&&(o=+r[1]))),e.exports=o},9539:function(e,t,n){"use strict";var r=n(9565),o=n(8551),i=n(5966);e.exports=function(e,t,n){var s,a;o(e);try{if(s=i(e,"return"),!s){if("throw"===t)throw n;return n}s=r(s,e)}catch(l){a=!0,s=l}if("throw"===t)throw n;if(a)throw s;return o(s),n}},9565:function(e,t,n){"use strict";var r=n(616),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},9589:function(e,t,n){"use strict";const r=n(9718),o=n(6874),i=n(3908),s=n(1123),a=n(144),l=n(6953),u=n(7414),c=n(3007),d=n(1832),f=n(2938),h=n(6254),p=n(4493),m=n(1729),v=n(560),g=n(9970),y=n(1763),b=n(909),_=n(3927),E=n(4277),w=n(5580),S=n(7059),T=n(4641),C=n(3999),k=n(4089),O=n(5200),A=n(2111),R=n(6170),I=n(3904),L=n(8311),N=n(7638),x=n(7631),P=n(9628),M=n(270),D=n(1261),F=n(3874),$=n(7075),j=n(5571),U=n(5342),B=n(6780),V=n(2525),H=n(5032);e.exports={parse:a,valid:l,clean:u,inc:c,diff:d,major:f,minor:h,patch:p,prerelease:m,compare:v,rcompare:g,compareLoose:y,compareBuild:b,sort:_,rsort:E,gt:w,lt:S,eq:T,neq:C,gte:k,lte:O,cmp:A,coerce:R,Comparator:I,Range:L,satisfies:N,toComparators:x,maxSatisfying:P,minSatisfying:M,minVersion:D,validRange:F,outside:$,gtr:j,ltr:U,intersects:B,simplifyRange:V,subset:H,SemVer:i,re:r.re,src:r.src,tokens:r.t,SEMVER_SPEC_VERSION:o.SEMVER_SPEC_VERSION,RELEASE_TYPES:o.RELEASE_TYPES,compareIdentifiers:s.compareIdentifiers,rcompareIdentifiers:s.rcompareIdentifiers}},9617:function(e,t,n){"use strict";var r=n(5397),o=n(5610),i=n(6198),s=function(e){return function(t,n,s){var a=r(t),l=i(a);if(0===l)return!e&&-1;var u,c=o(s,l);if(e&&n!==n){while(l>c)if(u=a[c++],u!==u)return!0}else for(;l>c;c++)if((e||c in a)&&a[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},9628:function(e,t,n){"use strict";const r=n(3908),o=n(8311),i=(e,t,n)=>{let i=null,s=null,a=null;try{a=new o(t,n)}catch(l){return null}return e.forEach((e=>{a.test(e)&&(i&&-1!==s.compare(e)||(i=e,s=new r(i,n)))})),i};e.exports=i},9718:function(e,t,n){"use strict";const{MAX_SAFE_COMPONENT_LENGTH:r,MAX_SAFE_BUILD_LENGTH:o,MAX_LENGTH:i}=n(6874),s=n(7272);t=e.exports={};const a=t.re=[],l=t.safeRe=[],u=t.src=[],c=t.safeSrc=[],d=t.t={};let f=0;const h="[a-zA-Z0-9-]",p=[["\\s",1],["\\d",i],[h,o]],m=e=>{for(const[t,n]of p)e=e.split(`${t}*`).join(`${t}{0,${n}}`).split(`${t}+`).join(`${t}{1,${n}}`);return e},v=(e,t,n)=>{const r=m(t),o=f++;s(e,o,t),d[e]=o,u[o]=t,c[o]=r,a[o]=new RegExp(t,n?"g":void 0),l[o]=new RegExp(r,n?"g":void 0)};v("NUMERICIDENTIFIER","0|[1-9]\\d*"),v("NUMERICIDENTIFIERLOOSE","\\d+"),v("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${h}*`),v("MAINVERSION",`(${u[d.NUMERICIDENTIFIER]})\\.(${u[d.NUMERICIDENTIFIER]})\\.(${u[d.NUMERICIDENTIFIER]})`),v("MAINVERSIONLOOSE",`(${u[d.NUMERICIDENTIFIERLOOSE]})\\.(${u[d.NUMERICIDENTIFIERLOOSE]})\\.(${u[d.NUMERICIDENTIFIERLOOSE]})`),v("PRERELEASEIDENTIFIER",`(?:${u[d.NONNUMERICIDENTIFIER]}|${u[d.NUMERICIDENTIFIER]})`),v("PRERELEASEIDENTIFIERLOOSE",`(?:${u[d.NONNUMERICIDENTIFIER]}|${u[d.NUMERICIDENTIFIERLOOSE]})`),v("PRERELEASE",`(?:-(${u[d.PRERELEASEIDENTIFIER]}(?:\\.${u[d.PRERELEASEIDENTIFIER]})*))`),v("PRERELEASELOOSE",`(?:-?(${u[d.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${u[d.PRERELEASEIDENTIFIERLOOSE]})*))`),v("BUILDIDENTIFIER",`${h}+`),v("BUILD",`(?:\\+(${u[d.BUILDIDENTIFIER]}(?:\\.${u[d.BUILDIDENTIFIER]})*))`),v("FULLPLAIN",`v?${u[d.MAINVERSION]}${u[d.PRERELEASE]}?${u[d.BUILD]}?`),v("FULL",`^${u[d.FULLPLAIN]}$`),v("LOOSEPLAIN",`[v=\\s]*${u[d.MAINVERSIONLOOSE]}${u[d.PRERELEASELOOSE]}?${u[d.BUILD]}?`),v("LOOSE",`^${u[d.LOOSEPLAIN]}$`),v("GTLT","((?:<|>)?=?)"),v("XRANGEIDENTIFIERLOOSE",`${u[d.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),v("XRANGEIDENTIFIER",`${u[d.NUMERICIDENTIFIER]}|x|X|\\*`),v("XRANGEPLAIN",`[v=\\s]*(${u[d.XRANGEIDENTIFIER]})(?:\\.(${u[d.XRANGEIDENTIFIER]})(?:\\.(${u[d.XRANGEIDENTIFIER]})(?:${u[d.PRERELEASE]})?${u[d.BUILD]}?)?)?`),v("XRANGEPLAINLOOSE",`[v=\\s]*(${u[d.XRANGEIDENTIFIERLOOSE]})(?:\\.(${u[d.XRANGEIDENTIFIERLOOSE]})(?:\\.(${u[d.XRANGEIDENTIFIERLOOSE]})(?:${u[d.PRERELEASELOOSE]})?${u[d.BUILD]}?)?)?`),v("XRANGE",`^${u[d.GTLT]}\\s*${u[d.XRANGEPLAIN]}$`),v("XRANGELOOSE",`^${u[d.GTLT]}\\s*${u[d.XRANGEPLAINLOOSE]}$`),v("COERCEPLAIN",`(^|[^\\d])(\\d{1,${r}})(?:\\.(\\d{1,${r}}))?(?:\\.(\\d{1,${r}}))?`),v("COERCE",`${u[d.COERCEPLAIN]}(?:$|[^\\d])`),v("COERCEFULL",u[d.COERCEPLAIN]+`(?:${u[d.PRERELEASE]})?`+`(?:${u[d.BUILD]})?(?:$|[^\\d])`),v("COERCERTL",u[d.COERCE],!0),v("COERCERTLFULL",u[d.COERCEFULL],!0),v("LONETILDE","(?:~>?)"),v("TILDETRIM",`(\\s*)${u[d.LONETILDE]}\\s+`,!0),t.tildeTrimReplace="$1~",v("TILDE",`^${u[d.LONETILDE]}${u[d.XRANGEPLAIN]}$`),v("TILDELOOSE",`^${u[d.LONETILDE]}${u[d.XRANGEPLAINLOOSE]}$`),v("LONECARET","(?:\\^)"),v("CARETTRIM",`(\\s*)${u[d.LONECARET]}\\s+`,!0),t.caretTrimReplace="$1^",v("CARET",`^${u[d.LONECARET]}${u[d.XRANGEPLAIN]}$`),v("CARETLOOSE",`^${u[d.LONECARET]}${u[d.XRANGEPLAINLOOSE]}$`),v("COMPARATORLOOSE",`^${u[d.GTLT]}\\s*(${u[d.LOOSEPLAIN]})$|^$`),v("COMPARATOR",`^${u[d.GTLT]}\\s*(${u[d.FULLPLAIN]})$|^$`),v("COMPARATORTRIM",`(\\s*)${u[d.GTLT]}\\s*(${u[d.LOOSEPLAIN]}|${u[d.XRANGEPLAIN]})`,!0),t.comparatorTrimReplace="$1$2$3",v("HYPHENRANGE",`^\\s*(${u[d.XRANGEPLAIN]})\\s+-\\s+(${u[d.XRANGEPLAIN]})\\s*$`),v("HYPHENRANGELOOSE",`^\\s*(${u[d.XRANGEPLAINLOOSE]})\\s+-\\s+(${u[d.XRANGEPLAINLOOSE]})\\s*$`),v("STAR","(<|>)?=?\\s*\\*"),v("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),v("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")},9970:function(e,t,n){"use strict";const r=n(560),o=(e,t,n)=>r(t,e,n);e.exports=o},9997:function(e,t){"use strict";t.A={"contao/manager-bundle":["contao/news-bundle","contao/calendar-bundle","contao/faq-bundle","contao/comments-bundle","contao/newsletter-bundle","contao/listing-bundle"]}}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[953],{3953:function(e){e.exports=JSON.parse('{"ui.app.title":"Contao Extensions","ui.app.loading":"Laddar tilläggslista …","ui.app.language":"Byt sprÃ¥k för Contao Manager","ui.app.colorDark":"Mörkt läge","ui.app.colorDarkTitle":"Byt färgschema till mörkt","ui.app.colorLight":"Ljusläge","ui.app.colorLightTitle":"Byt färgschema till ljus","ui.discover.advertisement":"Annons i tilläggslistan","ui.discover.loading":"Laddning ...","ui.discover.offline":"Det gick inte att hämta nÃ¥gra resultat.","ui.discover.offlineExplain":"Kontrollera din internetanslutning och inaktivera JavaScript-blockerare i din webbläsare.","ui.discover.offlineButton":"Försök igen","ui.discover.searchPlaceholder":"Sök i {count} tillägg …","ui.discover.empty":"Inga resultat för {query}","ui.discover.more":"Fler resultat","ui.discover.sortBy":"Sortera efter","ui.discover.sortReleased":"Släppte","ui.discover.sortReleasedTitle":"Sortera resultat efter releasedatum","ui.discover.sortLatest":"Uppdaterad","ui.discover.sortLatestTitle":"Sortera resultat efter senast uppdaterade","ui.discover.sortDownloads":"Nedladdningar","ui.discover.sortDownloadsTitle":"Sortera resultat efter antal nedladdningar","ui.discover.sortFavers":"Betyg","ui.discover.sortFaversTitle":"Sortera resultat efter betyg","ui.discover.detailsButton":"Detaljer","ui.discover.latestPackages":"Senaste och uppdaterade tillägg","ui.discover.faversPackages":"Högst rankade tillägg","ui.discover.downloadsPackages":"Mest nedladdade tillägg","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Projektets hemsida","ui.package.private":"Privat paket","ui.package.privateTitle":"Privata paket är endast tillgängliga frÃ¥n leverantören (t.ex. som en ZIP-nedladdning). Besök gärna webbplatsen för mer information.","ui.package.abandoned":"övergiven","ui.package.abandonedText":"Detta paket är övergivet och underhÃ¥lls inte längre.","ui.package.abandonedReplace":"Detta paket är övergivet och underhÃ¥lls inte längre. Författaren föreslÃ¥r att du istället använder paketet {replacement}.","ui.package.contaoVersion":"Tillgänglig för Contao","ui.package-details.previous":"Tidigare tilläggsinformation","ui.package-details.close":"Stäng tilläggsinformation","ui.package-details.loading":"Laddning ...","ui.package-details.tabDescription":"Beskrivning","ui.package-details.tabRequire":"Krav","ui.package-details.tabFeatures":"Funktioner","ui.package-details.tabSuggest":"Förslag","ui.package-details.tabConflict":"Konflikter","ui.package-details.tabDependents":"Anhöriga","ui.package-details.linkRequires":"kräver","ui.package-details.linkReplaces":"ersätter","ui.package-details.linkProvides":"tillhandahÃ¥ller","ui.package-details.linkConflicts":"konflikter","ui.package-details.funding":"UnderhÃ¥ll av fondpaket!","ui.package-details.contaoVersions":"Stödd Contao version(er)","ui.package-details.latest":"Senaste versionen","ui.package-details.released":"släppt pÃ¥","ui.package-details.license":"Licens(er)","ui.package-details.authors":"frÃ¥n","ui.package-details.more":"Mer","ui.package-details.packagist":"Paketdetaljer","ui.package-details.metadata":"Redigera metadata","ui.package-details.support_docs":"Dokumentation","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Supportforum","ui.package-details.support_issues":"Problem/felrapport","ui.package-details.support_source":"Källkod","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Support E-post","ui.package-details.support_rss":"RSS Feed"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[748],{8367:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Веза није безбедна !!","ui.app.httpsDescription":"Ðко не кориÑтите HTTPS ваши поверљиви подаци ће Ñе преноÑити без енкрипције.","ui.app.httpsLink":"Детаљније","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Сигурни мод је омогућен !!","ui.app.safeModeDescription":"Ðеке функционалноÑти Contao Manager-a ниÑу доÑтупне.","ui.app.safeModeExit":"Изађи из Сигурног мода","ui.app.limitedHeadline":"ДаљинÑка аутентификација","ui.app.limitedDescription":"You have limited permissions due to passwordless login.","ui.app.limitedLogout":"Re-authenticate","ui.app.totpHeadline":"Security Notice","ui.app.totpDescription":"Configure two-factor authentication now to secure your account.","ui.app.totpSetup":"Покретање инÑталације","ui.app.loading":"Contao Manager Ñе учитава...","ui.app.apiError":"Ðеочекиван ÑÑ‚Ð°Ñ‚ÑƒÑ API","ui.app.configSecurity1":"УПОЗОРЕЊЕ !!! Пронађен је незаштићен config фолдер","ui.app.configSecurity2":"Contao Manager је открио да Ñу конфигурациони фајлови јавно доÑтупни. Све операције Ñу обуÑтављене док Ñе config фолдер не заштити. У Ñупротном би потенцијални нападач могао да приÑтупи оÑетљивим подацима о Вашој инÑталацији.\\n\\nДа поправите ово, оÑигурајте да приÑтуп фолдеру \\"contao-manager\\" на Вашем Ñерверу буде Ñпречен. Ðко је потребно да прво научите како то да урадите, прочитајте упутÑтво за ваш Ñервер или контактирајте кориÑничку подршку Вашег хоÑтинг провајдера.","ui.account.welcome":"Добро дошли","ui.account.intro1":"Добродошли у Contao Manager, универзални алат за инÑталацију и управљање Ñа Вашом инÑталацијом Contao Open Source CMS. Ðко Ñе први пут Ñрећете Ñа њим, погледајте {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} да почнете","ui.account.introManual":"прочитајте приручник","ui.account.intro2":"Ðко наиђете на неки проблем, проверите {ourGithubIssues}  и Ñлободно креирајте нову тему за било шта што до Ñада није пријављено.","ui.account.introIssues":"наши GitHub проблеми","ui.account.headline":"КориÑнички налог","ui.account.description":"Да управљате Вашом инÑталацијом, потребно је да креирате налог за Contao Manager. Имајте на уму да овај налог није иÑто што и налог за Contao Фронт- и БекЕнд.","ui.account.username":"КориÑничко име","ui.account.password":"Лозинка","ui.account.passwordPlaceholder":"мин. 8 знакова","ui.account.passwordLength":"УнеÑите барем 8 знакова.","ui.account.loginInvalid":"There was an error when creating the account. Please try a different username.","ui.account.submit":"Креирај налог","ui.account.usePassword":"Use password for login","ui.account.usePasskey":"Use Passkey for login","ui.account.totpHeadline":"Two-factor authentication","ui.account.totpDescription":"Please enable two-factor authentication, which adds an extra layer of security to your account. In addition to your username and password, you will need to enter a verification code generated by a two-factor app such as 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator or any other TOTP app.","ui.account.totpSetup":"Configure now","ui.account.totpSkip":"Configure later","ui.account.login":"Decline Invitation","ui.account.contribute1":"Contao и Contao Manager Ñу под покровитељÑтвом непрофитне организације Contao Association.","ui.account.contribute2":"Молимо Ð’Ð°Ñ Ð´Ð° размиÑлите о томе да помогнете отвореном пројекту Ñвојом {donate}.","ui.account.contributeDonate":"донирање","ui.login.headline":"Пријава","ui.login.description":"Пријави Ñе ради управљања инÑталацијом.","ui.login.username":"КориÑничко име","ui.login.password":"Лозинка","ui.login.totpHeadline":"Two-factor authentication","ui.login.totpDescription":"Please enter your verification code to complete the login process.","ui.login.totp":"Verification code","ui.login.forgotPassword":"Заборавили Ñте лозинку?","ui.login.button":"Пријава","ui.login.passkey":"Sign In with Passkey","ui.login.cancel":"Откажи","ui.login.or":"или","ui.login.locked":"ПриÑтуп је одбијен јер је Contao Manager закључан. Да биÑте га откључали, обришите {lockFile} у почетном директоријуму ваше Contao инÑталације.","ui.logout.headline":"СеÑија је иÑтекла","ui.logout.warning":"ÐиÑте били активни дуже од 25 минута. Из безбедноÑних разлога ваша ÑеÑија ће бити уÑкоро прекинута.","ui.logout.expired":"Ваша ÑеÑија је аутоматÑки прекинута јер Ñте били неактивни дуже од 30 минута.","ui.logout.renew":"ОÑтани пријављен","ui.logout.logout":"Одјава","ui.logout.login":"Ðазад на пријаву","ui.oauth.error":"ÐеиÑправан OAuth покушај. Проверите параметре.","ui.oauth.https":"URI за редирекцију МОРРда кориÑти Ñигурни протокол (https:) чиме Ñе Ñпречава да Ñе аутентификациони токен преноÑи као обични текÑÑ‚.","ui.oauth.headline":"ДаљинÑка аутентификација","ui.oauth.description":"Следеће апликације или ÑервиÑи захтевају удаљени приÑтуп Вашој инÑтанци Contao Manager-а.","ui.oauth.domain":"Пре него што дозволите приÑтуп, будите Ñигурни да познајете овај URL и имате поверење у влаÑника!","ui.oauth.outOfScope":"Unfortunately, you do not have the necessary permissions to grant this access.","ui.oauth.allow":"Дозволи приÑтуп","ui.oauth.deny":"Одбиј приÑтуп","ui.oauth.switchUser":"Switch User","ui.scope.admin":"Admin access including user management","ui.scope.install":"Install new packages and change Contao configuration","ui.scope.update":"Update packages and execute maintenance tasks","ui.scope.read":"Read packages and configuration","ui.boot.headline":"Провера ÑиÑтема","ui.boot.description":"Молимо Ñачекајте, анализирам ваш Ñервер ...","ui.boot.issue1":"Пронађен је проблем приликом инÑталације","ui.boot.issue2":"Ваша инÑталација има проблеме који морају бити решени како биÑте могли да кориÑтите Contao Manager.","ui.boot.run":"Покрени Contao Manager","ui.boot.safeMode":"Покрени у Safe Mode","ui.recovery.headline":"Опоравак ÑиÑтема","ui.recovery.description":"Contao Manager је открио фајлове који наликују на Contaо, али Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ðµ линије - Command Line Interface - не ради како би требао.","ui.recovery.console":"ИÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ","ui.recovery.repairOptions":"Одаберите опцију за опоравак инÑталације.","ui.recovery.repairHeadline":"ÐутоматÑка поправка","ui.recovery.repairDescription":"ÐутоматÑка поправка инÑталације поновним креирањем апликативног cache-а и реинÑталацијом пакета Композера.","ui.recovery.repairWarning":"Било која модификација vendor фајлова можда ће бити обриÑана приликом процедуре!","ui.recovery.repairFailed":"ÐутоматÑка поправка није уÑпела. Пробајте ручно да поправите инÑталацију у Safe Mode-у.","ui.recovery.repairButton":"Покрени ÑиÑтемÑку поправку","ui.recovery.safeModeHeadline":"Safe Mode","ui.recovery.safeModeDescription":"Покретањем Contao Manager-а у Safe Mode-у омогућиће управљање пакетима и одређеним задацима одржавања, али могућноÑти које Ñе оÑлањају на поÑтојећу инÑталацију Contao неће бити доÑтупне.","ui.recovery.safeModeButton":"Покрени у Safe Mode","ui.server.pending":"Причекајте...","ui.server.running":"Ðнализа је у току...","ui.server.error":"Провера није уÑпела због неочекиваног одговора Ñа Ñервера.","ui.server.details":"Детаљи","ui.server.prerequisite":"Провера је зауÑтављена због тога што потребни предуÑлови ниÑу задовољени.","ui.server.selfUpdate.title":"Ðжурирања Contao Manager-а","ui.server.selfUpdate.update":"Ðова верзија Contao Manager {latest} је доÑтупна.","ui.server.selfUpdate.manualUpdate":"Ðова верзија Contao Manager {latest} је доÑтупна. Ваш Ñервер не подржава аутоматÑко ажурирање, панову верзију преузмите Ñа {download}.","ui.server.selfUpdate.latest":"КориÑтите поÑледњу верзију {current}.","ui.server.selfUpdate.dev":"Развојне верзије не подржавају аутоматÑко ажурирање.","ui.server.selfUpdate.unsupported":"Ðова верзија је доÑтупна али не подржава вашу верзију PHP-а.","ui.server.selfUpdate.button":"Покрени Само-ажурирање","ui.server.selfUpdate.continue":"ÐаÑтави","ui.server.config.title":"Конфигурација Ñервера","ui.server.config.setup":"Конфигуриши","ui.server.config.change":"Промени","ui.server.config.save":"Сачувај","ui.server.config.cancel":"Откажи","ui.server.config.customOption":"ОÑтало...","ui.server.config.description":"Да би иÑправно извршавао позадинÑке задатке, Contao Manager треба да зна где Ñе налази PHP command line binary и како да извршава команде одвојено од мрежних процеÑа.","ui.server.config.formTitle":"Конфигурација Ñервера","ui.server.config.formText":"УнеÑите путању до вашег PHP binary. Проверите да ли је binary у иÑтој верзији PHP као ваш веб процеÑ.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud омогућава инÑталацију Composer завиÑноÑти и у Ñлучају када ваш локални Ñервер не поÑедује довољно радне меморије. Имајте на уму да ће информације о вашим пакетима бити пренете на Ñервер којим управља Contao Association.","ui.server.config.cloud":"КориÑти Composer Resolver Cloud","ui.server.config.cli":"PHP binary","ui.server.config.stateErrorCli":"Ðа Ñерверу није пронађен валидан PHP binary.","ui.server.config.stateErrorCloud":"Употреба Composer Resolver Cloud није подржана.","ui.server.config.stateSuccess":"PHP binary на {php_cli}.","ui.server.php_web.title":"PHP Web Process","ui.server.php_web.below7":"Пронађена је верзија PHP {version}. Молимо Ð’Ð°Ñ Ð´Ð° што пре пређете на PHP 7!","ui.server.php_web.success":"Пронађена верзија PHP {version}, нема познатих проблема.","ui.server.php_cli.title":"PHP Command Line Interface","ui.server.php_cli.success":"Пронађена верзија PHP {version}, нема познатих проблема.","ui.server.composer.title":"Composer Environment","ui.server.composer.success":"Ðема познатих проблема.","ui.server.composer.install":"ЗавиÑноÑти Композера ниÑу инÑталиране.","ui.server.composer.button":"ИнÑталирај","ui.server.contao.title":"ИнÑталација Contao","ui.server.contao.setup":"Покретање инÑталације","ui.server.contao.check":"Провери базу података","ui.server.contao.empty":"Ðије пронађена инÑталација Contao.","ui.server.contao.old":"Верзија Contao {version} није уÑклађена Ñа Contao Менаџером, па ћете морати ручно да ажурирате вашу инÑталацију.","ui.server.contao.found":"Пронађен Contao {version} (API version {api}).","ui.server.contao.connectionError":"ÐеуÑпешно повезивање Ñа Ñервером базе података.","ui.server.contao.connectionProblem":"Пронађен је проблем у бази података.","ui.server.contao.missingUser":"Ðије пронађен админиÑтраторÑки налог.","ui.setup.continue":"ÐаÑтави","ui.setup.manager":"Покрени Contao Manager","ui.setup.cancel":"Откажи","ui.setup.welcome":"Добро дошли","ui.setup.welcome1":"Овај чаробњак ће Ð²Ð°Ñ Ð²Ð¾Ð´Ð¸Ñ‚Ð¸ кроз неопходне кораке за инÑталацију Contao Open Source CMS.","ui.setup.welcome2":"У Ñлучају да имате било каква питања, претражите документацију, форуме, канал на Slack-у и оÑтале реÑурÑе на Ñтраници {support}.","ui.setup.support":"подршка из заједнице","ui.setup.start":"Почни","ui.setup.complete":"ЧеÑтитамо!","ui.setup.complete1":"Contao {version} је уÑпешно инÑталиран.","ui.setup.complete2":"За завршетак процеÑа инÑталације, отворите алат за инÑталацију да биÑте пдеÑили параметре конекције Ñа базом података и креирали кориÑника за Бек Енд.","ui.setup.complete3":"Сада можете почети да развијате Ñвој Ñајт у Бек Енду. Ðко Ñу вам потребне додатне екÑтензије, наÑтавите у Contao Manager.","ui.setup.installTool":"Отвори ИнÑталациони алат","ui.setup.login":"Пријави Ñе у Contao","ui.setup.funding":"Free software is \\"free\\" as in \\"free speech\\", not as in \\"free beer\\". Пројекат Отвореног кода попут Contao захтева новац који не може да обезбеди Ñамо један појединац или комапнија.\\nÐко имате Ñајт или продајете Ñајтове заÑноване на Contao, волели биÑмо да добијемо вашу подршку у виду донације те да на тај начин подржите пројекат од кога завиÑи и ваш поÑловни резултат.","ui.setup.fundingLink":"Више информација","ui.setup.document-root.headline":"Подешавања мрежног Ñервера","ui.setup.document-root.warning":"Да биÑте инÑталирали Contao уз помоћ Contao Manager-а, морате да иÑправно подеÑите локацију root-а на Вашем мрежном Ñерверу.","ui.setup.document-root.description1":"Contao кориÑти поÑебан фолдер за јавно доÑтупне фајлове, а апликативни фајлови Ñу инÑталирани у надређеном фолдеру. Contao Ñада није могуће инÑталирати јер Ñтруктура фолдера није тачна или фолдери ниÑу празни.","ui.setup.document-root.description2":"Ðко ниÑте Ñигурни како да подеÑите root, прочитајте документацију или контактирајте админиÑтратора Вашег хоÑтинг провајдера.","ui.setup.document-root.documentation":"Прочитајте документацију","ui.setup.document-root.conflictsTitle":"ИнÑталациони фолдер није празан","ui.setup.document-root.conflictsDirectory":"ОÑновни директоријум ваше будуће инÑталације Contao није празан. Пронашли Ñмо {count} фајла(ова) који ће можда бити обриÑани приликом инÑталације. Препоручујемо да направите празну Ñтруктуру директоријума, али можете и да премеÑтите Ñледеће фајлове и проверите поново ако ниÑте Ñигурни да ли Ñу у употреби.","ui.setup.document-root.ignoreConflicts":"Желим да инÑталирам Contao у директоријум који није празан. Разумем да ће ово можда обриÑати поÑтојеће фајлове.","ui.setup.document-root.check":"Провери поново","ui.setup.document-root.create":"Ðаправи директоријуме","ui.setup.document-root.change":"Промени директоријуме","ui.setup.document-root.formTitle":"Подешавање директоријума","ui.setup.document-root.formText1":"Contao Manager може аутоматÑки да креира нову Ñтруктуру директоријума на Ñерверу.","ui.setup.document-root.formText2":"Мораћете рућно да подеÑите нови root за документе (нпр. преко админиÑтраторÑког контрол панела на хоÑтингу).","ui.setup.document-root.autoconfig":"Разумем да морам да променим моју конфигурацију Ñервера. Ðко то не урадим, конфигурациони фајлови ће бити изложени (укључујући детаље налога и лозинке)!","ui.setup.document-root.directory":"Ðови директоријум","ui.setup.document-root.currentRoot":"Тренутни Document Root","ui.setup.document-root.newRoot":"Ðови Document Root","ui.setup.document-root.finish":"ПоÑтављање директоријума","ui.setup.document-root.publicDir":"КориÑти {dir} за јавне фајлове (за Contao {version})","ui.setup.document-root.directoryInvalid":"УнеÑите иÑправан назив за директоријум.","ui.setup.document-root.directoryExists":"Одредишни директоријум већ поÑтоји. УнеÑите други назив.","ui.setup.document-root.confirmation":"Contao Manager је уÑпешно завршио креирање потребног директоријума за Вашу Contao инÑталацију. Сада треба да подеÑите document root на Вашем мрежном Ñерверу. Ðемојте да поново учитавате ову Ñтраницу пре тога.","ui.setup.document-root.reload":"Поново учитај Ñтраницу","ui.setup.document-root.success":"Структура директоријума на вашем Ñерверу је иÑправно поÑтављена.","ui.setup.document-root.installingProjectDir":"Ðпликативни фајлови ће бити инÑталирани у {dir}.","ui.setup.document-root.installingPublicDir":"Јавни фајлови ће бити инÑталирани у {dir}.","ui.setup.document-root.installedProjectDir":"Ðпликативни фајлови Ñу инÑталирани у {dir}.","ui.setup.document-root.installedPublicDir":"Јавни фајлови Ñу инÑталирани у {dir}.","ui.setup.create-project.headline":"ИнÑталација Contao","ui.setup.create-project.description":"Развој Contao Ñледи принципе {semver}, што значи да Ñе нова мања верзија објављује Ñваких шеÑÑ‚ меÑеци. Тренутно подржана издања Ñу:","ui.setup.create-project.semver":"Семантичко верзиониÑање","ui.setup.create-project.latestTitle":"ПоÑледња верзија","ui.setup.create-project.ltsTitle":"Long Term Support","ui.setup.create-project.latestQ1":"Ðаша поÑледња верзија нуди највише функционалноÑти Ñа подршком до фебруара {year}.","ui.setup.create-project.latestQ3":"Ðапа поÑледња верзија нуди највише функционалноÑти Ñа подршком до авгуÑта {year}.","ui.setup.create-project.ltsText":"Ðаша тренутна LTS верзија, ако Ñте фокуÑирани на ÑтабилноÑÑ‚. Ðуди дугорочну подршку до фебруара {year}.","ui.setup.create-project.pltsText":"Претходна LTS верзија, још увек нуди дугорочну подршку до фебруара {year}.","ui.setup.create-project.requiresPHP":"Захтева минималну верзију PHP {version}, а ви имате PHP {current}.","ui.setup.create-project.releaseplan":"За више информација, проверите {contaoReleasePlan}.","ui.setup.create-project.releaseplanLink":"План издања за Contao","ui.setup.create-project.installed":"Contao {version} је уÑпешно инÑталиран на Ñервер. ÐаÑтавите Ñа поÑтављањем ваше базе података или покрените Contao Manager да инÑталирате другу верзију.","ui.setup.create-project.formTitle":"Изабери диÑтрибуцију","ui.setup.create-project.formText":"Изаберите верзију која треба да Ñе инÑталира.","ui.setup.create-project.version":"Верзија","ui.setup.create-project.demo":"ИнÑталирај Contao демо Ñајт.","ui.setup.create-project.demoDescription":"Демо Ñајт помаже да Ñе упознате Ñа Contao и Ñа оÑновним функционалноÑтима. Више тема можете пронаћи у {store}.","ui.setup.create-project.coreOnly":"Минимална инÑталација (Ñамо оÑновни модули)","ui.setup.create-project.noUpdate":"ПреÑкочи инÑталацију (Ñамо за екÑперте!)","ui.setup.create-project.theme":"Теме за Contao","ui.setup.create-project.themeInstall":"Да инÑталирате тему за Contao, кориÑтите претрагу или учитајте фајл теме (.cto/.zip) који подржава инÑталацију помоћу Contao Manager.","ui.setup.create-project.themeBuy":"Ðе заборавите да поÑетите званични {store}.","ui.setup.create-project.themeStore":"Продавница тема за Contao ","ui.setup.create-project.themeUpload":"Учитај фајл теме (.cto/.zip)","ui.setup.create-project.themeInvalid":"Учитани фајл није тема за Contao или не подржава Contao Manager.","ui.setup.create-project.themeWarning":"Contao Manager не може да процени да ли је ова тема компатибилна Ñа вашим Ñервером. Проверите то Ñа иÑпоручиоцем од кога Ñте набавили тему ако имате било каква питања.","ui.setup.create-project.themeTitle":"Прегледај детаље теме","ui.setup.create-project.themeDetails":"Следеће завиÑноÑти и фајлови ће бити инÑталирани Ñа овом темом.","ui.setup.create-project.themeRequire":"{count} ЗавиÑноÑти | {count} ЗавиÑноÑти","ui.setup.create-project.themeFiles":"{count} Фајл | {count} Фајлови","ui.setup.create-project.theme.or":"или претраже јавне теме","ui.setup.create-project.theme.search":"Претражи теме","ui.setup.create-project.theme.more":"Више тема","ui.setup.create-project.theme.empty":"Ðема тема које Ñе поклапају Ñа {query}","ui.setup.create-project.theme.uploaded":"Фајл теме је уÑпешно учитан.","ui.setup.create-project.theme.packageName":"Име пакета","ui.setup.create-project.theme.version":"Верзија","ui.setup.create-project.theme.authors":"Ðутор(и)","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"ИнÑталирај","ui.setup.create-project.cancel":"Откажи","ui.setup.database-connection.headline":"Конекција Ñа базом података","ui.setup.database-connection.description":"Да би могао да чува Ñтранице, Ñадржај, кориÑнике и оÑтале релационе податке, Contao захтева MySQL базу података (или компатибилну варијанту као што је MariaDB). Параметри за повезивање Ñу Ñачувани у фајлу {env} који Ñе чува у оÑновном фолдеру ваше Contao инÑталације.","ui.setup.database-connection.formTitle":"Параметри за повезивање","ui.setup.database-connection.formText":"УнеÑите URL базе података или иÑпуните кориÑничко име, лозинку, Ñервер и име базе података.","ui.setup.database-connection.url":"URL базе података","ui.setup.database-connection.validUrl":"URL базе података није иÑправан или повезивање Ñа Ñервером није уÑпело.","ui.setup.database-connection.or":"или","ui.setup.database-connection.user":"КориÑничко име","ui.setup.database-connection.password":"Лозинка","ui.setup.database-connection.server":"Сервер (:Порт)","ui.setup.database-connection.database":"Ðазив базе података","ui.setup.database-connection.connected":"Повезивање Ñа базом података {database} на Ñерверу {server} је уÑпело.","ui.setup.database-connection.error":"Грешка приликом повезивања Ñа базом података.","ui.setup.database-connection.problem":"Contao је поронашао проблем Ñа вашим Ñервером базе података.","ui.setup.database-connection.schemaTitle":"Шема базе података","ui.setup.database-connection.migration":"Ðа чекању је једна миграција. | Ðа чекању је {count} миграција.","ui.setup.database-connection.schema":"Једно ажурирање шеме је на чекању. | Ðа чекању је {count} ажурирања шеме.","ui.setup.database-connection.noChanges":"Ваша шема у оквиру базе података је ажурна.","ui.setup.database-connection.check":"Провери базу података","ui.setup.database-connection.skip":"ПреÑкочиПреÑкочи","ui.setup.database-connection.save":"Сачувај","ui.setup.database-connection.change":"Промени креденцијале","ui.setup.database-connection.restoreTitle":"Увоз базе података","ui.setup.database-connection.restoreText":"Тема коју Ñте управо инÑталирали Ñадржи копију базе података. Увезите базу података да биÑте увезли податке теме или преÑкочите овај корак да почнете Ñа празном инÑталацијом Contao. | Тема коју Ñте управо инÑталирали Ñадржи неколико копија базе података. Изаберите копију да увезете податке теме или преÑкочите овај корак да почнете Ñа празном инÑталацијом Contao.","ui.setup.database-connection.backup":"Спреми копију тренутне базе података прије увоза","ui.setup.database-connection.backupWarning":"Сви подаци у бази података ће бити обриÑани и умеÑто њих ће Ñе упиÑати нови подаци! Ðко база није празна, прво направите резервну копију. ","ui.setup.database-connection.restore":"Увоз базе података","ui.setup.database-connection.restoreOption":"Резервна копија од {date} ({size})","ui.setup.database-connection.restored":"Ваша база података која припада теми је уÑпешно увезена. ÐаÑтавите према валидацији шеме базе података.","ui.setup.backend-user.success":"У бази је пронађен админиÑтраторÑки налог за Contao Бек Енд. Употребите Contao Бек Енд да додате нове кориÑнике.","ui.setup.backend-user.error":"Повлачење лиÑте кориÑника није уÑпело. Проверите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ за више детаља.","ui.setup.backend-user.headline":"Ðалог за Бек Енд","ui.setup.backend-user.description":"Да биÑте управљали Ñвојим Ñајтом, морате да имате барем један админиÑтраторÑки налог за Contao Бек Енд. Имајте на уму да овај налог није повезан Ñа Contao Manager.","ui.setup.backend-user.formTitle":"Креирај налог","ui.setup.backend-user.formText":"УнеÑите податке за нови налог Бек Енда.","ui.setup.backend-user.username":"КориÑничко име","ui.setup.backend-user.name":"Име","ui.setup.backend-user.email":"E-mail адреÑа","ui.setup.backend-user.emailInvalid":"УнеÑите иÑправну адреÑу e-mailа.","ui.setup.backend-user.password":"Лозинка","ui.setup.backend-user.passwordPlaceholder":"мин. 8 знакова","ui.setup.backend-user.passwordLength":"УнеÑите барем 8 знакова.","ui.setup.backend-user.create":"Додај налог","ui.task.headline":"ПозадинÑки задаци","ui.task.loading":"Учитавам детаље...","ui.task.created":"Учитавам детаље...","ui.task.active":"Сачекајте док Contao Manager заврши Ñа позадинÑким задацима и операцијама.","ui.task.complete":"Сви задаци Ñу уÑпешно завршени. За више детаља, проверите излаз конзоле.","ui.task.paused":"ПозадинÑки задатак је неочекивано зауÑтављен. Проверите излаз конзоле.","ui.task.aborting":"Сачекајте док Ñе позадинÑки задаци не откажу.","ui.task.stopped":"Ðеки позадинÑки задаци Ñу отказани. Проверите излаз конзоле.","ui.task.error":"ПозадинÑки задатак је неочекивано зауÑтављен. Проверите излаз конзоле.","ui.task.failed":"Contao Manager није уÑпео да покрене позадинÑки задатак!","ui.task.failedDescription1":"Ðешто је кренуло погрешно приликом извршавања операција у позадини.","ui.task.failedDescription2":"Ðко Ñе ово деÑи поново, Ваш Ñервер можда не подржава инÑталацију.","ui.task.reportProblem":"Пријави проблем","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud је подржан од {sponsor}","ui.task.buttonAudit":"Ðжурирај базу података","ui.task.buttonClose":"Затвори","ui.task.buttonConfirm":"Потврди и затвори","ui.task.buttonContinue":"ÐаÑтави","ui.task.buttonCancel":"Откажи","ui.task.confirmCancel":"Да ли Ñте Ñигурни да желите да откажете задатак? Ово ће можда довеÑти до тога да Contao инÑталација не буде комплетна.","ui.task.autoclose":"Затвори детаље задатка након уÑпешног завршетка.","ui.console.toggle":"Прикажи/Сакриј конзолу","ui.console.showLog":"Прикажи Ñав лог конзоле","ui.console.copyLog":"Копирај лог у привремену меморију.","ui.migrate.headline":"Ðжурирања базе података","ui.migrate.migrationsOnly":"(Ñамо миграције)","ui.migrate.schemaOnly":"(Ñамо шема)","ui.migrate.loading":"Молимо да Ñачекате док проверимо вашу базу података ...","ui.migrate.empty":"ÐиÑу пронађене миграције или ажурирања шеме базе података на чекању. Ваша база података је ажурна.","ui.migrate.emptyMigrations":"ÐиÑу пронађене миграције на чекању. Ðе заборавите да проверите и ажурирања шеме.","ui.migrate.emptySchema":"ÐиÑу пронађена ажурирања шеме на чекању. Ðе заборавите да проверите и миграције.","ui.migrate.pending":"Ваша база података није ажурна. Проучите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ и извршите захтеване промене.","ui.migrate.previousChanges":"Миграција претходне базе података није потврђена..\\nПроверите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ иÑпод, а онда наÑтавите Ñа променама.","ui.migrate.previousComplete":"Претходна миграција базе података није потврђена, проверите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ иÑпод.\\nÐема других промена на чекању.","ui.migrate.appliedChanges":"Извршена Ñу ажурирања базе података.\\nПроверите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ иÑпод, а онда наÑтавите Ñа променама.","ui.migrate.appliedComplete":"Извршена Ñу ажуриања базе података.\\nСада је ваша база ажурна. Ðема других миграција и ажурирања шеме на чекању.","ui.migrate.problem":"Contao је пронашао проблем Ñа вашим Ñервером базе података.\\nПроверите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ како биÑте Ñазнали шта треба да Ñе поправи. | Contao је пронашао проблем Ñа вашим Ñервером базе података. \\nПроверите иÑÐ¿Ð¸Ñ ÐºÐ¾Ð½Ð·Ð¾Ð»Ðµ како биÑте Ñазнали шта треба да Ñе поправи.","ui.migrate.warning":"Contao је пронашао грешку у подешавању Ñервера базе података.\\nУпозорења за Ñада можете да занемарите, али би било добро да их поправите како биÑте добили оптималне перформанÑе и интегритет података.","ui.migrate.error":"Промене не могу да Ñе Ñачувају. Изгледа да је дошло до промена у вашој бази података, оÑвежите податке и покушајте поново.","ui.migrate.execute":"Изврши","ui.migrate.close":"Затвори","ui.migrate.confirm":"Потврди и затвори","ui.migrate.cancel":"Откажи","ui.migrate.continue":"ÐаÑтави","ui.migrate.setup":"Покретање инÑталације","ui.migrate.skip":"ПреÑкочиПреÑкочи","ui.migrate.retry":"Провери поново","ui.migrate.retryAll":"Провери Ñве","ui.migrate.withDeletes":"Изврши Ñве промене у бази података, укључујучи DROP упите.","ui.migrate.migrationTitle":"Миграције базе података","ui.migrate.schemaTitle":"Ðжурирања шема","ui.migrate.problemTitle":"Проблеми базе података","ui.migrate.warningTitle":"Упозорења базе података","ui.migrate.addTable":"Додај табелу {table}","ui.migrate.dropTable":"Обриши табелу {table}","ui.migrate.addField":"Додај колону {table}.{field}","ui.migrate.changeField":"Промени колону {table}.{field}","ui.migrate.dropField":"Обриши колону {table}.{field}","ui.migrate.createIndex":"Креирај Ð¸Ð½Ð´ÐµÐºÑ \\"{name}\\" над табелом {table}","ui.migrate.dropIndex":"Обриши Ð¸Ð½Ð´ÐµÐºÑ \\"{name}\\" над табелом {table}","ui.widget.mandatory":"Ово поље не Ñме бити празно.","ui.widget.blankOption":"Одаберите...","ui.widget.showPassword":"Прикажи лозинку","ui.widget.hidePassword":"Сакриј лозинку","ui.error.title":"HTTP захтев за \\"{method} {url}\\" није уÑпео.","ui.error.server500":" Изгледа да Ñе деÑила нека неочекивана грешка на Ñерверу. Проверите логове на Вашем Ñерверу (Apache/Nginx) и логове Contao Manager на локацији \\"contao-manager/logs\\".","ui.error.response":"Сервер је договорио Ñа кодом {status}.","ui.error.moreLink":"Више информација","ui.error.support":"Подршка за Contao","ui.error.permission":"You do not have permission to use this feature.","ui.footer.help":"Помоћ","ui.footer.reportProblem":"Пријави проблем","ui.navigation.discover":"ИÑтражи","ui.navigation.packages":"Пакети","ui.navigation.tools":"Ðлати","ui.navigation.installTool":"Ðлат за инÑталацију","ui.navigation.backend":"Contao БекЕнд","ui.navigation.debug":"Contao мод за дебаговање","ui.navigation.logViewer":"Преглед логова","ui.navigation.phpinfo":"Информације о PHP","ui.navigation.phpinfoLoading":"Учитавање информација о PHP...","ui.navigation.maintenance":"Одржавање","ui.navigation.rebuildCache":"Поновно креирај кеш","ui.navigation.users":"Accounts","ui.navigation.systemCheck":"Провера ÑиÑтема","ui.navigation.advanced":"Ðапредно","ui.navigation.logout":"Одјава","ui.maintenance.database.title":"Миграције и резервне копије базе података","ui.maintenance.database.description":"Миграције базе података оÑигуравају конзиÑтентноÑÑ‚ података и табела у оквиру шема.","ui.maintenance.database.migrations":"Једна миграција базе података на чекању | {count} миграција базе података на чекању","ui.maintenance.database.schemaUpdates":"Једно ажурирање шеме на чекању | {count} ажурирања шеме на чекању","ui.maintenance.database.error":"Пронађен је проблем у бази података.","ui.maintenance.database.warning":"Пронађена Ñу упозорења за базу података.","ui.maintenance.database.button":"Провери базу података","ui.maintenance.database.migrationOnly":"Провери Ñамо миграције","ui.maintenance.database.schemaOnly":"Провери Ñамо шеме","ui.maintenance.database.installTool":"Отвори ИнÑталациони алат","ui.maintenance.database.createBackup":"Креирај резервну копију","ui.maintenance.database.backupUnsupported":"Резервне копије базе података ниÑу подржане у оквиру ваше верзије Contao.","ui.maintenance.database.backupList":"Имате једну резервну копију базе података, креирану {date}. | Имате {count} резервних копија базе података, а поÑледња је креирана {date}.","ui.maintenance.database.backupEmpty":"Тренутно немате резервне копије базе података.","ui.maintenance.rebuildCache.title":"Ðпликативни cache","ui.maintenance.rebuildCache.description":"Поновно креирање апликативног cache-a је потребно Ñваки пут када мењате било који конфигурациони фајл.","ui.maintenance.rebuildCache.rebuildProd":"Обнови продукциони Cache","ui.maintenance.rebuildCache.rebuildDev":"Обнови развојни Cache","ui.maintenance.rebuildCache.clearProd":"Обриши продукциони Cache","ui.maintenance.rebuildCache.clearDev":"Обриши развојни Cache","ui.maintenance.installTool.title":"ИнÑталациони алат за Contao","ui.maintenance.installTool.description":"ИнÑталациони алат за Contao је аутоматÑки закључан ако три пута заредом погрешите лозинку.","ui.maintenance.installTool.unlock":"Откључај ИнÑталациони алат","ui.maintenance.installTool.lock":"Закључај ИнÑталациони алат","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"The Composer autoloader је одговоран за учитавање PHP клаÑа. Ðutoloader мора бити иÑпражњен након додавања влаÑтитих namespaces у root composer.json.","ui.maintenance.dumpAutoload.button":"ИÑпразни Autoloader","ui.maintenance.composerInstall.title":"Композер завиÑноÑти - dependencies","ui.maintenance.composerInstall.description":"Композер завиÑноÑти Ñу Ñмештене у фолдер {vendor} у root фолдеру ваше апликације. РеинÑталирање завиÑноÑти ће можда бити неопходно након измене или ручног копирања на Ñервер фајла {composerLock}.","ui.maintenance.composerInstall.button":"Покрени ИнÑталер","ui.maintenance.composerInstall.update":"Покрени ажурирање Композера","ui.maintenance.composerCache.title":"Композер Cache","ui.maintenance.composerCache.description":"Композер кешира преузете пакете како би побољшао перформанÑе. Ðко имате проблеме Ñа непотпуним фајловима, покушајте да обришете cache Композера како биÑте га приÑилили на поновно преузимање читавог пакета.","ui.maintenance.composerCache.button":"Обриши Cache","ui.maintenance.maintenanceMode.title":"Мод одржавања","ui.maintenance.maintenanceMode.description":"Када Contao пребаците у Мод одржавања, Ñајт ће да приказује шаблон за \\"503 Service Unavailable\\".","ui.maintenance.maintenanceMode.enable":"Омогући","ui.maintenance.maintenanceMode.disable":"Онемогући","ui.maintenance.debugMode.title":"Мод за дебаговање","ui.maintenance.debugMode.description":"Ðктивирајте мод за дебаговање тако што ћете поÑтавити кориÑничко име и лозинку за улазну тачку {appDevPhp}.","ui.maintenance.debugMode.descriptionJwt":"Ðктивирајте debug мод тако што ћете поÑтавити debug колачић за тренутни домен.","ui.maintenance.debugMode.activate":"Ðктивирај","ui.maintenance.debugMode.deactivate":"Деактивирај","ui.maintenance.debugMode.credentials":"Креденцијали","ui.maintenance.debugMode.user":"УнеÑите кориÑничко име за Мод за дебаговање.","ui.maintenance.debugMode.password":"УнеÑите лозинку за Мод за дебаговање.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode кешира PHP фајлове ради бржег извршавања. У неким околноÑтима мора бити обриÑан ако фајлови ниÑу препознати након измене.","ui.maintenance.opcodeCache.button":"ИÑпразни Cache","ui.maintenance.safeMode":"Ðије доÑтупно у Safe Mode","ui.maintenance.unsupported":"Ðије подржан у вашој верзији Contao","ui.packages.updateButton":"Ðжурирај Пакете","ui.packages.searchButton":"Претрага пакета","ui.packages.searchPlaceholder":"Претрага Пакета...","ui.packages.uploadOverlay":"Превуците & пуÑтите фајлове да биÑте их пренели на Ñервер","ui.packages.uploadButton":"ПоÑтави пакете","ui.packages.uploadMessage":"Имате непотврђено пребацивање на Ñервер. | Имате {count} непотврђених пребацивања на Ñервер.","ui.packages.uploadApply":"Потврди преноÑе","ui.packages.uploadReset":"Обриши преноÑе","ui.packages.uploadIncomplete":"Фајл није пренеÑен у потпуноÑти. Уклоните га и пробајте поново.","ui.packages.uploadDuplicate":"Изгледа да је овај фајл пренеÑен неколико пута. Уклоните дупликате.","ui.packages.uploadInstalled":"Овај фајл је већ инÑталиран. Уклоните дупликате.","ui.packages.uploadUnsupported":"Учитавања ниÑу подржана у вашој инÑталацији. Проверите да је инÑталирана екÑтензија PHP ZIP и ажурирајте завиÑноÑти.","ui.packages.changesMessage":"Имате једну непотврђену промену. | Имате {count} непотврђених промена.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"Примени промене","ui.packages.changesApplyAll":"Ðжурирај Ñве пакете","ui.packages.changesDryrunAll":"Обави \\"dry-run\\" Ñимулацију Ñвих пакета.","ui.packages.changesReset":"Врати на почетно Ñтање","ui.packages.changesReview":"Прегледај промене","ui.packagelist.loading":"Учитавам ...","ui.packagelist.uploads":"ПреноÑи","ui.packagelist.added":"Ðови пакети","ui.packagelist.installed":"ИнÑталирани пакети","ui.package.hintRevert":"Опозови измене","ui.package.hintNoupdate":"Ðе ажурирај","ui.package.hintConstraint":"Када Ñачувате измене, овај пакет ће бити инÑталиран Ñа ограничењима {constraint}.","ui.package.hintConstraintBest":"Када Ñачувате измене, овај пакет ће бити инÑталиран Ñа најбољом доÑтупном верзијом.","ui.package.hintConstraintChange":"Када Ñачувате измене, ограничење овог пакета биће промењено из \\"{from}\\" у \\"{to}\\" .","ui.package.hintConstraintUpdate":"Ови пакети ће бити ажурирани када потврдите измене.","ui.package.hintAdded":"Ови пакети ће бити инÑталирани када потврдите измене.","ui.package.hintRemoved":"Када Ñачувате измене, овај пакет ће бити уклоњен.","ui.package.requiredTitle":"ручно додати","ui.package.requiredText":"Овај пакет је захтеван у Вашем composer.json али није инÑталиран.","ui.package.removedTitle":"ручно уклоњено","ui.package.removedText":"Овај пакет је уклоњен из вашег composer.json.","ui.package.installed":"Тренутно инÑталирано:","ui.package.version":"Верзија {version}","ui.package.additionalDownloads":"{count} Преузимање | {count} Преузимања","ui.package.additionalStars":"{count} Звезда | {count} Звезде","ui.package.editConstraint":"Уреди","ui.package.uploadConstraint":"Ова завиÑноÑти је дефиниÑана од пренеÑеног пакета.","ui.package.updateButton":"Ðжурирај","ui.package.removeButton":"Уклони","ui.package.installButton":"Додај пакет","ui.package.installButtonShort":"Додавање","ui.package.detailsButton":"Детаљи","ui.package.latestConstraint":"поÑледња верзија","ui.package.update":"ДоÑтупно је ажурирање","ui.package.updateLatest":"поÑледња верзија","ui.package.updateAvailable":"{version} доÑтупна","ui.package.updateUnknown":"непозната верзија","ui.package.updateConstraint":"Ðовија верзија изван вашег опÑега верзија је доÑтупна.","ui.package.incompatible":"{package} does not work with Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Верзија {version}","ui.cloudStatus.waitingTime":"Време чекања","ui.cloudStatus.jobs":"Тренутни задаци","ui.cloudStatus.workers":"Радници","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"нема","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ca. {minutes} min {seconds} sec","ui.cloudStatus.error":"Ðије могуће проверити Ñтање ÑервиÑа Composer Resolver Cloud. Можда је у току одржавање или поÑтоје проблеми.","ui.cloudStatus.button":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Cloud-а","ui.cloudStatus.refresh":"ОÑвежи ÑÑ‚Ð°Ñ‚ÑƒÑ Cloud-а","ui.log-viewer.loading":"Учитавам ...","ui.log-viewer.empty":"Ðема лог фајлова на вашем Ñерверу. ","ui.log-viewer.reload":"Поново учитај","ui.log-viewer.file":"Лог фајл","ui.log-viewer.channel":"Канал","ui.log-viewer.channelTitle":"Канал у ком је ова порука забиљежена.","ui.log-viewer.level":"Ðиво","ui.log-viewer.levelTitle":"ОзбиљноÑÑ‚ лог поруке.","ui.log-viewer.timeHeader":"Време","ui.log-viewer.messageHeader":"Порука","ui.log-viewer.showContext":"Прикажи контекÑÑ‚","ui.log-viewer.hideContext":"Сакриј контектÑÑ‚","ui.log-viewer.showExtra":"Прикажи додатне информације","ui.log-viewer.hideExtra":"Сакриј додатне информације","ui.log-viewer.more":"Учитај више ...","ui.log-viewer.download":"Преузми локално","ui.log-viewer.downloadTitle":"Преузми фајл \\"{file}\\"","ui.log-viewer.prodEnvironment":"Продукционо окружење","ui.log-viewer.devEnvironment":"Развојно окружење (Debug Mode)","ui.user-manager.loading":"Loading users …","ui.user-manager.changePassword":"Change Password","ui.user-manager.setupTotp":"Setup Two-Factor Authentication","ui.user-manager.disableTotp":"Disable Two-Factor Authentication","ui.user-manager.invite":"Invite User","ui.user-manager.delete":"Delete","ui.user-manager.deleteConfirm":"Do you really want to delete user \\"{username}\\"?","ui.user-manager.deleted":"User {username} deleted successfully","ui.user-manager.passwordHeadline":"Change Password","ui.user-manager.passwordText":"To change your password, please enter the current and a new password in the respective fields.","ui.user-manager.currentPassword":"Current password","ui.user-manager.newPassword":"New password","ui.user-manager.passwordPlaceholder":"мин. 8 знакова","ui.user-manager.submitPassword":"Submit","ui.user-manager.passwordChanged":"Your password has been changed successfully.","ui.user-manager.passwordError":"This password is incorrect.","ui.user-manager.inviteHeadline":"Invite User","ui.user-manager.inviteText":"If you need multiple logins for the Contao Manager, you can create an invitation link here. Share this link with someone or use it on another device to create a new account with the given permissions.","ui.user-manager.inviteSuccess1":"A new invitation link was created. The URL below can be used to create a new user account for this Contao Manager. The invitation expires on {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Please copy the link to your clipboard. It will only work once and you will not be able to see it again after closing this dialog.","ui.user-manager.createInvitation":"Create Invitation Link","ui.user-manager.clipboard":"Copy to clipboard","ui.user-manager.permissions":"Learn about permissions","ui.user-manager.cancel":"Откажи","ui.user-manager.close":"Затвори","ui.user-manager.you":"You","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Two-Factor Authentication","ui.totp.setupQr":"Please scan the QR code with your 2FA/TOTP app.","ui.totp.setupCode":"If you cannot scan the QR code, enter this key instead:","ui.totp.codeLabel":"Verification code","ui.totp.codeDescription":"Please enter the verification code generated by your 2FA/TOTP app.","ui.totp.disableText":"Please enter the verification code to disable two-factor authentication.","ui.totp.invalid":"The verification code is invalid.","ui.totp.enable":"Омогући","ui.totp.disable":"Онемогући","ui.totp.cancel":"Откажи","ui.totp.enabled":"Two-factor authentication was enabled successfully.","ui.totp.disabled":"Two-factor authentication was disabled successfully.","ui.totp.setup":"Setup Two-Factor Authentication","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[164],{6164:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Onveilige Verbinding !!","ui.app.httpsDescription":"Zonder HTTPS worden vertrouwelijke gegevens ongecodeerd overgedragen. ","ui.app.httpsLink":"Meer info","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Veilige modus ingeschakeld !!","ui.app.safeModeDescription":"Sommige functies van de Contao Manager zijn niet beschikbaar.","ui.app.safeModeExit":"Verlaat veilige modus","ui.app.limitedHeadline":"Verificatie op afstand","ui.app.limitedDescription":"You have limited permissions due to passwordless login.","ui.app.limitedLogout":"Re-authenticate","ui.app.totpHeadline":"Security Notice","ui.app.totpDescription":"Configure two-factor authentication now to secure your account.","ui.app.totpSetup":"Setup","ui.app.loading":"Contao Manager laden","ui.app.apiError":"Onverwachte API status","ui.app.configSecurity1":"VEILIGHEIDSWAARSCHUWING !!! De configuratie-map is niet beveiligd","ui.app.configSecurity2":"Contao Manager heeft vastgesteld dat de configuratiebestanden openbaar toegankelijk zijn. Alle bewerkingen zijn geblokkeerd totdat de map is beveiligd, anders zou een aanvaller toegang kunnen krijgen tot gevoelige gegevens van uw installatie.\\n\\nOm dit probleem op te lossen, moet u ervoor zorgen dat er geen toegang tot de map \\"contao-manager\\" is op uw server. Raadpleeg de handleiding van uw webserver voor meer informatie of neem contact op met uw hostingprovider.","ui.account.welcome":"Welkom","ui.account.intro1":"Welkom bij de Contao Manager, een universeel hulpmiddel om Contao Open Source CMS te installeren en te beheren. Bent u hier nieuw? {ReadthemanualTogetStarted}.","ui.account.introGetStarted":"{ReadTheManual} om te beginnen","ui.account.introManual":"lees de handleiding","ui.account.intro2":"Als u problemen ondervindt, kijk dan op {ourGithubIssues} en voel je vrij om nieuwe te maken voor iets dat nog niet is gemeld.","ui.account.introIssues":"Onze GitHub issues","ui.account.headline":"Gebruikers Account","ui.account.description":"Om uw installatie te beheren maakt u een account aan voor de Contao Manager. Houd er rekening mee dat dit account niet gerelateerd is aan het Contao-backend of frontend.","ui.account.username":"Gebruikersnaam","ui.account.password":"Wachtwoord","ui.account.passwordPlaceholder":"min. 8 tekens","ui.account.passwordLength":"Vul minstens 8 tekens in.","ui.account.loginInvalid":"There was an error when creating the account. Please try a different username.","ui.account.submit":"Maak een Account","ui.account.usePassword":"Use password for login","ui.account.usePasskey":"Use Passkey for login","ui.account.totpHeadline":"Two-factor authentication","ui.account.totpDescription":"Please enable two-factor authentication, which adds an extra layer of security to your account. In addition to your username and password, you will need to enter a verification code generated by a two-factor app such as 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator or any other TOTP app.","ui.account.totpSetup":"Configure now","ui.account.totpSkip":"Configure later","ui.account.login":"Decline Invitation","ui.account.contribute1":"Contao en de Contao Manager worden gesponsord door de non-profit Contao Association.","ui.account.contribute2":"Overweeg om bij te dragen aan Open Source door te {donate}.","ui.account.contributeDonate":"een donatie doen","ui.login.headline":"Aanmelden","ui.login.description":"Log in om uw installatie te beheren.","ui.login.username":"Gebruikersnaam","ui.login.password":"Wachtwoord","ui.login.totpHeadline":"Two-factor authentication","ui.login.totpDescription":"Please enter your verification code to complete the login process.","ui.login.totp":"Verification code","ui.login.forgotPassword":"Wachtwoord vergeten?","ui.login.button":"Aanmelden","ui.login.passkey":"Sign In with Passkey","ui.login.cancel":"Annuleer","ui.login.or":"of","ui.login.locked":"Toegang is geweigerd omdat de Contao Manager is vergrendeld. Om te ontgrendelen, verwijdert u het {LockFile} -bestand in uw Contao Root map.","ui.logout.headline":"Time-out sessie","ui.logout.warning":"U bent meer dan 25 minuten inactief geweest. Om veiligheidsredenen wordt uw sessie binnenkort beëindigd.","ui.logout.expired":"Uw sessie is automatisch beëindigd omdat u meer dan 30 minuten inactief bent geweest.","ui.logout.renew":"Ingelogd blijven","ui.logout.logout":"Uitloggen","ui.logout.login":"Terug naar inloggen","ui.oauth.error":"Ongeldige OAuth-poging. Controleer de request parameters.","ui.oauth.https":"De omleidings-URI MOET een beveiligd protocol gebruiken (HTTPS :) om te voorkomen dat het authenticatie-token in duidelijke tekst wordt verzonden.","ui.oauth.headline":"Verificatie op afstand","ui.oauth.description":"De volgende toepassing of service vraagt om externe toegang tot uw Contao Manager.","ui.oauth.domain":"Zorg ervoor dat u deze URL en eigenaar vertrouwt, voordat u toegang toestaat!","ui.oauth.outOfScope":"Unfortunately, you do not have the necessary permissions to grant this access.","ui.oauth.allow":"Toegang verlenen","ui.oauth.deny":"Toegang ontzeggen","ui.oauth.switchUser":"Switch User","ui.scope.admin":"Admin access including user management","ui.scope.install":"Install new packages and change Contao configuration","ui.scope.update":"Update packages and execute maintenance tasks","ui.scope.read":"Read packages and configuration","ui.boot.headline":"Systeem Controle","ui.boot.description":"Even geduld we analyseren uw server ...","ui.boot.issue1":"Installatieproblemen gedetecteerd","ui.boot.issue2":"Uw installatie heeft problemen die moeten worden opgelost voordat de Contao Manager kan worden gebruikt.","ui.boot.run":"Contao Manager Starten","ui.boot.safeMode":"Start in Veilige Modus","ui.recovery.headline":"Systeemherstel","ui.recovery.description":"De Contao Manager heeft bestanden gevonden die op Contao lijken, maar de opdrachtregel interface werkt niet zoals verwacht.","ui.recovery.console":"Console Uitvoer","ui.recovery.repairOptions":"Kies een optie om de installatie te repareren.","ui.recovery.repairHeadline":"Automatisch herstel","ui.recovery.repairDescription":"Pogingen om de installatie automatisch te herstellen door de cache van de toepassing opnieuw op te bouwen en de Composer-pakketten te herinstalleren.","ui.recovery.repairWarning":"Handmatige wijzigingen aan de vendor bestanden kunnen verloren gaan!","ui.recovery.repairFailed":"Automatisch herstel is mislukt. Probeer de Veilige Modus om de installatie handmatig te repareren.","ui.recovery.repairButton":"Voer systeemreparatie uit","ui.recovery.safeModeHeadline":"Veilige Modus","ui.recovery.safeModeDescription":"Door de Contao Manager te starten in de veilige modus kunnen pakketten worden beheerd en bepaalde onderhoudstaken worden uitgevoerd, maar functies die afhankelijk zijn van een werkende Contao-installatie zijn niet beschikbaar.","ui.recovery.safeModeButton":"Start in Veilige Modus","ui.server.pending":"Wachtend …","ui.server.running":"Analyseren …","ui.server.error":"Controle mislukt vanwege een onverwachte reactie van de server.","ui.server.details":"Details","ui.server.prerequisite":"Controle geannuleerd als gevolg van een ontbrekende voorwaarde.","ui.server.selfUpdate.title":"Updates van de Contao Manager","ui.server.selfUpdate.update":"Een nieuwe versie van Contao Manager {latest} is beschikbaar.","ui.server.selfUpdate.manualUpdate":"Er is een nieuwe Contao Manager-versie {latest} beschikbaar. Uw server ondersteunt geen automatische updates, download de nieuwe versie van {download}.","ui.server.selfUpdate.latest":"U gebruikt de laatste versie {huidige}.","ui.server.selfUpdate.dev":"Ontwikkelingsversies ondersteunen geen automatische updates.","ui.server.selfUpdate.unsupported":"Een nieuwe versie is beschikbaar, maar deze ondersteunt uw PHP-versie niet.","ui.server.selfUpdate.button":"Voer Zelf-Update uit","ui.server.selfUpdate.continue":"Ga verder","ui.server.config.title":"Server Configuratie","ui.server.config.setup":"Configureer","ui.server.config.change":"Wijzig","ui.server.config.save":"Bewaar","ui.server.config.cancel":"Annuleer","ui.server.config.customOption":"Ander ...","ui.server.config.description":"Om achtergrondtaken correct uit te voeren, moet de Contao Manager weten waar hij de PHP -opdrachtregel binair kan vinden en hoe de opdrachten uit te voeren die zijn gescheiden van het web proces.","ui.server.config.formTitle":"Server Configuratie","ui.server.config.formText":"Voer het pad naar uw PHP-binair bestand in. Zorg ervoor dat het binaire bestand dezelfde PHP-versie is als gebruikt in het web proces.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Met de Composer Cloud Resolver kunt u Composer-afhankelijkheden installeren, zelfs als uw server niet voldoende lokaal geheugen heeft. Houd er rekening mee dat uw pakketinformatie wordt verzonden naar een cloudserver die wordt beheerd door de Contao Association.","ui.server.config.cloud":"De Composer Cloud Resolver gebruiken","ui.server.config.cli":"PHP Binary","ui.server.config.stateErrorCli":"Ongeldige PHP binary gevonden op de server.","ui.server.config.stateErrorCloud":"De Composer Cloud Resolver wordt niet ondersteund.","ui.server.config.stateSuccess":"PHP binary in {php_cli}.","ui.server.php_web.title":"PHP Web Proces","ui.server.php_web.below7":"PHP versie gevonden {version}, stap zo spoedig mogelijk over op PHP 7.","ui.server.php_web.success":"PHP versie gevonden {version}, geen bekende problemen gevonden.","ui.server.php_cli.title":"PHP Command Line Interface","ui.server.php_cli.success":"PHP versie gevonden {version}, geen bekende problemen gevonden.","ui.server.composer.title":"Composer Omgeving","ui.server.composer.success":"Geen bekende problemen gevonden.","ui.server.composer.install":"Afhankelijkheden van Composer zijn niet geïnstalleerd.","ui.server.composer.button":"Installeren","ui.server.contao.title":"Contao Installatie","ui.server.contao.setup":"Setup","ui.server.contao.check":"Controleer database","ui.server.contao.empty":"Er is geen Contao installatie gevonden.","ui.server.contao.old":"Contao versie {version} is niet compatibel met de Contao Manager, installatie handmatig updaten.","ui.server.contao.found":"Gevonden Contao {version} (API versie {api}).","ui.server.contao.connectionError":"Kan geen verbinding maken met de databaseserver.","ui.server.contao.connectionProblem":"Databaseprobleem gevonden.","ui.server.contao.missingUser":"Beheerdersaccount niet gevonden.","ui.setup.continue":"Ga verder","ui.setup.manager":"Contao Manager Starten","ui.setup.cancel":"Annuleer","ui.setup.welcome":"Welkom","ui.setup.welcome1":"Deze wizard leidt u door de nodige stappen om uw Contao Open Source CMS-installatie in te stellen.","ui.setup.welcome2":"Als je vragen hebt, vind je documentatie, forums, een Slack-kanaal en meer op de {support}-pagina.","ui.setup.support":"Community ondersteuning","ui.setup.start":"Begin","ui.setup.complete":"Gefeliciteerd!","ui.setup.complete1":"Contao {version} is succesvol geïnstalleerd.","ui.setup.complete2":"Om het installatieproces te voltooien, opent u de installatietool om de databaseverbinding te configureren en een back-endgebruiker aan te maken.","ui.setup.complete3":"U kunt nu beginnen met het maken van uw website in de backend van Contao. Als u extra extensies nodig heeft, gaat u verder naar de Contao Manager.","ui.setup.installTool":"Open de installatietool","ui.setup.login":"Log in op Contao","ui.setup.funding":"Gratis software is \\"gratis\\" zoals in \\"aardig zijn voor iemand\\", niet zoals in \\"gratis bier\\". Voor een Open Source-project als Contao zijn bedragen nodig die niet door één persoon of bedrijf kunnen worden bijeengebracht.\\nAls u een website heeft of websites verkoopt die met Contao zijn gebouwd, zouden we graag zien dat u een financiële bijdrage levert aan het product waar uw bedrijf van afhankelijk is.","ui.setup.fundingLink":"Kom meer te weten","ui.setup.document-root.headline":"Webserver Instellingen","ui.setup.document-root.warning":"Om Contao via de Contao Manager te installeren, moet u de documentroot op de webserver repareren.","ui.setup.document-root.description1":"Contao gebruikt een aparte map voor openbare bestanden, toepassingsbestanden worden in de bovenliggende map geïnstalleerd. Contao kan niet worden geïnstalleerd als de mappenstructuur niet correct is of als de mappen niet leeg zijn.","ui.setup.document-root.description2":"Als u niet weet hoe u uw document root moet configureren, lees dan de Contao documentatie of neem contact op met uw hostingprovider.","ui.setup.document-root.documentation":"Lees de Documentatie","ui.setup.document-root.conflictsTitle":"Installatiemap niet leeg","ui.setup.document-root.conflictsDirectory":"De hoofdmap van uw toekomstige Contao-installatie is niet leeg, we hebben {count} bestand(en) gevonden die mogelijk worden overschreven door het installatieproces. Het wordt aanbevolen om een lege mappenstructuur voor Contao aan te maken, maar u kunt ook de volgende bestanden verwijderen en opnieuw controleren of u zeker weet dat ze niet worden gebruikt.","ui.setup.document-root.ignoreConflicts":"Ik wil Contao installeren in de niet-lege map. Ik begrijp dat dit alle bestaande bestanden op mijn webruimte kan overschrijven.","ui.setup.document-root.check":"Opnieuw controleren","ui.setup.document-root.create":"Maak mappen","ui.setup.document-root.change":"Wijzig mappen","ui.setup.document-root.formTitle":"Mapinstellingen","ui.setup.document-root.formText1":"De Contao Manager kan automatisch een nieuwe mappen structuur op de server maken.","ui.setup.document-root.formText2":"U moet de nieuwe document root handmatig configureren (bijv. via een hosting admin paneel).","ui.setup.document-root.autoconfig":"Ik begrijp dat ik mijn serverconfiguratie moet wijzigen. Het niet configureren van de document root zal de Contao Manager stuk maken en configuratiebestanden openbaar maken (inclusief accountgegevens en wachtwoorden)!","ui.setup.document-root.directory":"Nieuwe Map","ui.setup.document-root.currentRoot":"Huidig Document Root","ui.setup.document-root.newRoot":"Nieuwe Document Root","ui.setup.document-root.finish":"Stel Mappen In","ui.setup.document-root.publicDir":"Gebruik {dir} voor publieke bestanden (voor Contao {version})","ui.setup.document-root.directoryInvalid":"Voer een geldige mapnaam in.","ui.setup.document-root.directoryExists":"De doelmap bestaat al. Voer een andere naam in.","ui.setup.document-root.confirmation":"De Contao Manager heeft met succes de benodigde map gemaakt voor uw Contao installatie. U moet nu de document root configureren op uw webserver. Laad deze pagina niet opnieuw.","ui.setup.document-root.reload":"Pagina herladen","ui.setup.document-root.success":"De mappenstructuur op uw webserver is correct ingesteld!","ui.setup.document-root.installingProjectDir":"Applicatiebestanden worden geïnstalleerd in {dir}.","ui.setup.document-root.installingPublicDir":"Openbare bestanden worden geïnstalleerd in {dir}.","ui.setup.document-root.installedProjectDir":"Applicatiebestanden zijn geïnstalleerd in {dir}.","ui.setup.document-root.installedPublicDir":"Openbare bestanden zijn geïnstalleerd in {dir}.","ui.setup.create-project.headline":"Contao Installatie","ui.setup.create-project.description":"De ontwikkeling van Contao volgt het principe van {semver}, er wordt elke zes maanden een nieuwe secundaire versie uitgebracht. De momenteel ondersteunde releases zijn:","ui.setup.create-project.semver":"Semantische versiebeheer","ui.setup.create-project.latestTitle":"Nieuwste","ui.setup.create-project.ltsTitle":"Lange Termijn Support","ui.setup.create-project.latestQ1":"Onze nieuwste versie biedt de meeste functies met ondersteuning tot februari {jaar}.","ui.setup.create-project.latestQ3":"Onze nieuwste versie biedt de meeste functies met ondersteuning tot augustus {jaar}.","ui.setup.create-project.ltsText":"Onze huidige LTS-versie, als je focust op stabiliteit. Biedt langdurige ondersteuning tot februari {jaar}.","ui.setup.create-project.pltsText":"De vorige LTS-versie heeft nog steeds ondersteuning op lange termijn tot februari {jaar}.","ui.setup.create-project.requiresPHP":"Vereist minimaal PHP {version}, je hebt PHP {current}.","ui.setup.create-project.releaseplan":"Bekijk het {ContaoReleasePlan} voor gedetailleerde informatie.","ui.setup.create-project.releaseplanLink":"Contao Release Plan","ui.setup.create-project.installed":"Contao {version} is succesvol op de server geïnstalleerd. Ga door met het instellen van uw database of start de Contao Manager om een andere versie te installeren.","ui.setup.create-project.formTitle":"Selecteer een distributie","ui.setup.create-project.formText":"Kies welke versie moet worden geïnstalleerd.","ui.setup.create-project.version":"Versie","ui.setup.create-project.demo":"Installeer de Contao demo website","ui.setup.create-project.demoDescription":"De demowebsite helpt u vertrouwd te raken met Contao en alle kernfuncties ervan. Meer thema\'s zijn te vinden in de {store}.","ui.setup.create-project.coreOnly":"Minimale installatie (alleen de kern)","ui.setup.create-project.noUpdate":"Installatie overslaan (alleen expert!)","ui.setup.create-project.theme":"Contao Thema","ui.setup.create-project.themeInstall":"Om een Contao-thema te installeren, gebruikt u de zoekinvoer of uploadt u een themabestand (.cto/.zip) dat installatie via Contao Manager ondersteunt.","ui.setup.create-project.themeBuy":"Zorg ervoor dat je de officiële {store} bezoekt.","ui.setup.create-project.themeStore":"Contao Thema\'s Winkel","ui.setup.create-project.themeUpload":"Themabestand uploaden (.cto/.zip)","ui.setup.create-project.themeInvalid":"Het geüploade bestand is geen Contao-thema of ondersteunt de Contao Manager niet.","ui.setup.create-project.themeWarning":"De Contao Manager weet niet of dit thema compatibel is met uw server. Als u vragen heeft, neem dan contact op met de themaleverancier.","ui.setup.create-project.themeTitle":"Themadetails bekijken","ui.setup.create-project.themeDetails":"De volgende afhankelijkheden en bestanden worden met dit thema geïnstalleerd.","ui.setup.create-project.themeRequire":"{count} Afhankelijkheden | {count} Afhankelijkheden","ui.setup.create-project.themeFiles":"{count} Bestand | {count} Bestanden","ui.setup.create-project.theme.or":"of zoek naar openbare thema\'s","ui.setup.create-project.theme.search":"Thema\'s zoeken","ui.setup.create-project.theme.more":"Meer thema\'s","ui.setup.create-project.theme.empty":"Geen thema\'s die overeenkomen met {query}","ui.setup.create-project.theme.uploaded":"Het themabestand is succesvol geüpload.","ui.setup.create-project.theme.packageName":"Pakketnaam","ui.setup.create-project.theme.version":"Versie","ui.setup.create-project.theme.authors":"Auteur(s)","ui.setup.create-project.theme.upload":"Uploading {name} ({size})","ui.setup.create-project.install":"Installeren","ui.setup.create-project.cancel":"Annuleer","ui.setup.database-connection.headline":"Database verbinding","ui.setup.database-connection.description":"Contao vereist een MySQL-database (of een compatibele fork zoals MariaDB) om pagina\'s, inhoud, gebruikers en andere relationele gegevens op te slaan. Verbindingsparameters worden opgeslagen in het bestand {env} in de projectroot van uw Contao-installatie.","ui.setup.database-connection.formTitle":"Verbindingsparameters","ui.setup.database-connection.formText":"Voer een database-URL in of vul de velden gebruikersnaam, wachtwoord, server en database apart in.","ui.setup.database-connection.url":"Database URL","ui.setup.database-connection.validUrl":"Database-URL is ongeldig of verbinding met de server is mislukt.","ui.setup.database-connection.or":"of","ui.setup.database-connection.user":"Gebruikersnaam","ui.setup.database-connection.password":"Wachtwoord","ui.setup.database-connection.server":"Server (:Port) ","ui.setup.database-connection.database":"Database Naam","ui.setup.database-connection.connected":"Succesvol verbonden met database {database} op {server}.","ui.setup.database-connection.error":"Fout bij het verbinden met de database.","ui.setup.database-connection.problem":"Contao heeft een probleem gedetecteerd met uw database server.","ui.setup.database-connection.schemaTitle":"Database Schema","ui.setup.database-connection.migration":"Er is één migratie in behandeling. | Er zijn {count} migraties in behandeling.","ui.setup.database-connection.schema":"Er is één schema-update in behandeling. | Er zijn {count} schema-updates in behandeling.","ui.setup.database-connection.noChanges":"Uw databaseschema is up-to-date.","ui.setup.database-connection.check":"Controleer database","ui.setup.database-connection.skip":"Overslaan","ui.setup.database-connection.save":"Bewaar","ui.setup.database-connection.change":"Inloggegevens wijzigen","ui.setup.database-connection.restoreTitle":"Database importeren","ui.setup.database-connection.restoreText":"Het thema dat u zojuist hebt geïnstalleerd, bevat een databaseback-up. Herstel de database om themagegevens te importeren of sla deze stap over om te beginnen met een lege Contao-installatie. | Het thema dat u zojuist hebt geïnstalleerd, bevat meerdere databaseback-ups. Selecteer een back-upbestand om themagegevens te importeren of sla deze stap over om te beginnen met een lege Contao-installatie.","ui.setup.database-connection.backup":"Maak een back-up van de huidige database vóór het importeren","ui.setup.database-connection.backupWarning":"Alle gegevens in de database worden bij het importeren overschreven! Maak eerst een back-up als de database niet leeg is.","ui.setup.database-connection.restore":"Themadatabase importeren","ui.setup.database-connection.restoreOption":"Back-up van {date} ({size})","ui.setup.database-connection.restored":"Uw themadatabase is succesvol geïmporteerd. Ga door met het valideren van uw databaseschema.","ui.setup.backend-user.success":"Er is een beheerdersaccount voor de Contao-backend gevonden in uw database. Gebruik de Contao-backend om meer gebruikers toe te voegen.","ui.setup.backend-user.error":"Kan gebruikerslijst niet ophalen. Controleer de console-uitvoer voor details.","ui.setup.backend-user.headline":"Backend Account","ui.setup.backend-user.description":"Om uw website te beheren, moet u ten minste één beheerdersaccount hebben voor de Contao-backend. Houd er rekening mee dat dit account niet gerelateerd is aan de Contao Manager.","ui.setup.backend-user.formTitle":"Maak een Account","ui.setup.backend-user.formText":"Voer de gegevens in voor het nieuwe backend-account.","ui.setup.backend-user.username":"Gebruikersnaam","ui.setup.backend-user.name":"Naam","ui.setup.backend-user.email":"Emailadres","ui.setup.backend-user.emailInvalid":"Vul a.u.b. een geldig e-mailadres in","ui.setup.backend-user.password":"Wachtwoord","ui.setup.backend-user.passwordPlaceholder":"min. 8 tekens","ui.setup.backend-user.passwordLength":"Vul minstens 8 tekens in.","ui.setup.backend-user.create":"Account toevoegen","ui.task.headline":"Achtergrond taak","ui.task.loading":"Details laden ...","ui.task.created":"Details laden ...","ui.task.active":"Wacht terwijl de Contao Manager taakbewerkingen op de achtergrond uitvoert.","ui.task.complete":"Alle bewerkingen zijn met succes voltooid. Controleer de console uitvoer voor meer informatie.","ui.task.paused":"Een achtergrondbewerking stopte onverwacht. Controleer de console -uitvoer.","ui.task.aborting":"Wacht terwijl de achtergrondbewerkingen worden geannuleerd.","ui.task.stopped":"Sommige achtergrondbewerkingen werden geannuleerd. Controleer de console -uitvoer.","ui.task.error":"Een achtergrondbewerking stopte onverwacht. Controleer de console -uitvoer.","ui.task.failed":"De Contao -manager kon geen achtergrondtaak starten!","ui.task.failedDescription1":"Er ging iets mis bij het uitvoeren van bewerkingen op de achtergrond.","ui.task.failedDescription2":"Als dit opnieuw gebeurt, wordt uw server mogelijk niet ondersteund.","ui.task.reportProblem":"Een probleem melden","ui.task.pausedDescription":"Click \\"Continue\\" if you want to ignore the error and execute the remaining operations.","ui.task.sponsor":"Composer Cloud gesponsord door {sponsor}","ui.task.buttonAudit":"Update Database","ui.task.buttonClose":"Sluit","ui.task.buttonConfirm":"Bevestig & Sluit","ui.task.buttonContinue":"Ga verder","ui.task.buttonCancel":"Annuleer","ui.task.confirmCancel":"Weet u zeker om deze taak te annuleren? Dit kan uw Contao-installatie in een niet werkende staat achterlaten!","ui.task.autoclose":"Sluit taakdetails bij succes","ui.console.toggle":"Toon/Verberg Console Output","ui.console.showLog":"Toon volledig consolelogboek","ui.console.copyLog":"Kopieer logboek naar klembord","ui.migrate.headline":"Database Updates","ui.migrate.migrationsOnly":"(alleen migraties)","ui.migrate.schemaOnly":"(alleen schema)","ui.migrate.loading":"Even geduld a.u.b., we controleren uw database …","ui.migrate.empty":"Geen lopende migraties of schema-updates gevonden. Uw database is up-to-date.","ui.migrate.emptyMigrations":"Geen lopende migraties gevonden. Zorg ervoor dat u ook controleert op schema-updates.","ui.migrate.emptySchema":"Geen lopende schema-updates gevonden. Zorg ervoor dat u ook controleert op migraties.","ui.migrate.pending":"Uw database is niet up-to-date. Bekijk de console-uitvoer hieronder en voer de wijzigingen door.","ui.migrate.previousChanges":"Een eerdere databasemigratie is niet bevestigd.\\nBekijk de console-uitvoer hieronder en ga verder met het bekijken van de volgende wijzigingen.","ui.migrate.previousComplete":"Een eerdere databasemigratie is niet bevestigd. Bekijk de console-uitvoer hieronder.\\nEr zijn geen wijzigingen meer in behandeling.","ui.migrate.appliedChanges":"Database-updates zijn toegepast.\\nBekijk de console-uitvoer hieronder en ga verder met het bekijken van de volgende wijzigingen.","ui.migrate.appliedComplete":"Database-updates zijn toegepast.\\nEr zijn geen lopende migraties of schema-updates meer. Uw database is up-to-date.","ui.migrate.problem":"Contao heeft een probleem gedetecteerd met uw database server.\\nBekijk de console-uitvoer hieronder om erachter te komen wat er moet worden opgelost. | Contao heeft problemen met uw database server gedetecteerd.\\nBekijk de console-uitvoer hieronder om erachter te komen wat er moet worden opgelost.","ui.migrate.warning":"Contao heeft een verkeerde configuratie van uw database server gedetecteerd.\\nWaarschuwingen kunnen tijdelijk worden overgeslagen, maar moeten worden opgelost voor optimale prestaties en gegevensintegriteit.","ui.migrate.error":"De wijzigingen kunnen niet worden toegepast. Uw database is mogelijk gewijzigd. Controleer het nogmaals om het opnieuw te proberen.","ui.migrate.execute":"Uitvoeren","ui.migrate.close":"Sluit","ui.migrate.confirm":"Bevestig & Sluit","ui.migrate.cancel":"Annuleer","ui.migrate.continue":"Ga verder","ui.migrate.setup":"Setup","ui.migrate.skip":"Overslaan","ui.migrate.retry":"Opnieuw controleren","ui.migrate.retryAll":"Alles controleren","ui.migrate.withDeletes":"Voer alle database wijzigingen uit, inclusief DROP-query\'s.","ui.migrate.migrationTitle":"Database Migraties","ui.migrate.schemaTitle":"Schema Updates","ui.migrate.problemTitle":"Database Problemen","ui.migrate.warningTitle":"Database Waarschuwingen","ui.migrate.addTable":"Tabel {tabel} toevoegen","ui.migrate.dropTable":"Drop tabel {table}","ui.migrate.addField":"Veld {tabel}.{field} toevoegen","ui.migrate.changeField":"Veld {table}.{field} wijzigen","ui.migrate.dropField":"Drop veld {table}.{field}","ui.migrate.createIndex":"Maak index \\"{name}\\" op {table}","ui.migrate.dropIndex":"Drop index \\"{name}\\" op {table}","ui.widget.mandatory":"Dit veld mag niet leeg zijn.","ui.widget.blankOption":"Selecteer ...","ui.widget.showPassword":"Toon wachtwoord","ui.widget.hidePassword":"Verberg wachtwoord","ui.error.title":"HTTP verzoek voor \\"{method} {url}\\" mislukt.","ui.error.server500":"Het lijkt erop dat er een onverwachte fout is gebeurd op uw server. Controleer de logbestanden van uw webserver (Apache/Nginx) en de Contao Manager-logboeken in \\"contao-manager/logs\\".","ui.error.response":"De server heeft een antwoord geretourneerd met statuscode {status}.","ui.error.moreLink":"Meer informatie","ui.error.support":"Contao Ondersteuning","ui.error.permission":"You do not have permission to use this feature.","ui.footer.help":"Help","ui.footer.reportProblem":"Een probleem melden","ui.navigation.discover":"Ontdekken","ui.navigation.packages":"Pakketten","ui.navigation.tools":"Hulpmiddelen","ui.navigation.installTool":"Installatie Tool","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Contao foutopsporingsmodus","ui.navigation.logViewer":"Log viewer","ui.navigation.phpinfo":"PHP Informatie","ui.navigation.phpinfoLoading":"PHP informatie laden","ui.navigation.maintenance":"Onderhoud","ui.navigation.rebuildCache":"Cache opnieuw opbouwen","ui.navigation.users":"Accounts","ui.navigation.systemCheck":"Systeem Controle","ui.navigation.advanced":"Gevorderd","ui.navigation.logout":"Uitloggen","ui.maintenance.database.title":"Databasemigraties en back-ups","ui.maintenance.database.description":"Databasemigraties zorgen voor consistente gegevens en tabelschema\'s.","ui.maintenance.database.migrations":"Eén databasemigratie in behandeling | {count} lopende databasemigraties","ui.maintenance.database.schemaUpdates":"Eén schema update in behandeling | {count} schema updates in behandeling","ui.maintenance.database.error":"Databaseprobleem gevonden.","ui.maintenance.database.warning":"Database waarschuwingen gevonden.","ui.maintenance.database.button":"Controleer database","ui.maintenance.database.migrationOnly":"Controleer alleen migraties","ui.maintenance.database.schemaOnly":"Alleen schema controleren","ui.maintenance.database.installTool":"Open de installatietool","ui.maintenance.database.createBackup":"Een backup maken","ui.maintenance.database.backupUnsupported":"Databaseback-ups worden niet ondersteund door uw Contao-versie.","ui.maintenance.database.backupList":"U heeft één databaseback-up, gemaakt op {date}. | U heeft {count} databaseback-ups, de laatste is gemaakt op {date}.","ui.maintenance.database.backupEmpty":"U heeft momenteel geen databaseback-ups.","ui.maintenance.rebuildCache.title":"Applicatie Cache","ui.maintenance.rebuildCache.description":"Het opnieuw opbouwen van de applicatie-cache is vereist na het wijzigen van een van de configuratiebestanden.","ui.maintenance.rebuildCache.rebuildProd":"Produktieomgeving Cache opnieuw opbouwen","ui.maintenance.rebuildCache.rebuildDev":"Cache ontwikkelingsomgeving opnieuw opbouwen","ui.maintenance.rebuildCache.clearProd":"Cache van de productieomgeving leegmaken","ui.maintenance.rebuildCache.clearDev":"Cache ontwikkelingsomgeving legen","ui.maintenance.installTool.title":"Contao Installatie Programma","ui.maintenance.installTool.description":"Het Contao-installatie programma wordt automatisch vergrendeld als u een wachtwoord drie keer achter elkaar verkeerd invoert.","ui.maintenance.installTool.unlock":"Installatie Programma Ontgrendelen","ui.maintenance.installTool.lock":"Installatie Programma Vergrendelen","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"De autoloader van Composer is verantwoordelijk voor PHP class loading. De autoloader moet worden gedumpt nadat aangepaste namespaces zijn toegevoegd aan de root van composer.json.","ui.maintenance.dumpAutoload.button":"Dump Autoloader","ui.maintenance.composerInstall.title":"Composer Afhankelijkheden","ui.maintenance.composerInstall.description":"Composerafhankelijkheden bevinden zich in de map {vendor} in uw applicatie root. Het opnieuw installeren van de afhankelijkheden kan nodig zijn na manipulatie of het handmatig uploaden van het {composerLock} bestand.","ui.maintenance.composerInstall.button":"Installatieprogramma Uitvoeren","ui.maintenance.composerInstall.update":"Start Composer update","ui.maintenance.composerCache.title":"Composer Cache","ui.maintenance.composerCache.description":"Composer cached gedownloade pakketten voor betere prestaties. Als u problemen hebt zoals onvolledige bestanden, probeer dan de Composer-cache te verwijderen om een nieuwe download te forceren.","ui.maintenance.composerCache.button":"Cache Wissen","ui.maintenance.maintenanceMode.title":"Onderhoudsmodus","ui.maintenance.maintenanceMode.description":"Contao in de onderhoudsmodus zetten toont een \\"503 service niet beschikbaar\\" -template voor de website.","ui.maintenance.maintenanceMode.enable":"Inschakelen","ui.maintenance.maintenanceMode.disable":"Uitschakelen","ui.maintenance.debugMode.title":"Foutopsporingsmodus","ui.maintenance.debugMode.description":"Activeer de foutopsporingsmodus door een gebruiker en wachtwoord in te stellen voor het ingangspunt {AppDevphp}.","ui.maintenance.debugMode.descriptionJwt":"Schakelt foutopsporingsmodus in door een cookie in te stellen voor het huidige domein.","ui.maintenance.debugMode.activate":"Activeren","ui.maintenance.debugMode.deactivate":"Deactiveren","ui.maintenance.debugMode.credentials":"Aanmeldgegevens","ui.maintenance.debugMode.user":"Geef een gebruikersnaam op voor de foutopsporingsmodus.","ui.maintenance.debugMode.password":"Geef een wachtwoord op voor de foutopsporingsmodus.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode slaat PHP-bestanden op in het web-proces voor snellere uitvoering. Het moet onder bepaalde omstandigheden worden verwijderd als bestanden niet worden herkend na wijziging.","ui.maintenance.opcodeCache.button":"Wis Cache","ui.maintenance.safeMode":"Niet beschikbaar in Veilige Modus","ui.maintenance.unsupported":"Wordt niet ondersteund door uw Contao versie","ui.packages.updateButton":"Pakketten Updaten","ui.packages.searchButton":"Pakketten zoeken","ui.packages.searchPlaceholder":"Zoek pakketten...","ui.packages.uploadOverlay":"Sleep bestanden om ze te uploaden","ui.packages.uploadButton":"Pakketten uploaden","ui.packages.uploadMessage":"U heeft één onbevestigde upload. | U heeft {count} onbevestigde uploads.","ui.packages.uploadApply":"Bevestig Uploads","ui.packages.uploadReset":"Verwijder Uploads","ui.packages.uploadIncomplete":"Dit bestand is niet volledig geüpload. Verwijder het en probeer opnieuw.","ui.packages.uploadDuplicate":"Dit bestand lijkt meerdere keren te zijn geüpload. Verwijder de duplicaten.","ui.packages.uploadInstalled":"Dit bestand is al geïnstalleerd. Verwijder de duplicaten.","ui.packages.uploadUnsupported":"Uploads worden niet ondersteund in uw installatie. Zorg ervoor dat de PHP ZIP-extensie is geïnstalleerd en werk uw afhankelijkheden bij.","ui.packages.changesMessage":"U heeft één onbevestigde wijziging. | U heeft {count} onbevestigde wijzigingen.","ui.packages.changesDryrun":"Testloop","ui.packages.changesApply":"Wijzigingen toepassen","ui.packages.changesApplyAll":"Update alle pakketten","ui.packages.changesDryrunAll":"Dry Run alle pakketten","ui.packages.changesReset":"Reset wijzigingen","ui.packages.changesReview":"Wijzigingen controleren","ui.packagelist.loading":"Bezig met laden ...","ui.packagelist.uploads":"Uploads","ui.packagelist.added":"Nieuwe pakketten","ui.packagelist.installed":"Geïnstalleerde pakketten","ui.package.hintRevert":"Wijzigingen terugdraaien","ui.package.hintNoupdate":"Niet updaten","ui.package.hintConstraint":"Dit pakket wordt geïnstalleerd met beperkingen {constraint} wanneer u de wijzigingen toepast.","ui.package.hintConstraintBest":"Dit pakket wordt geïnstalleerd in de best beschikbare versie wanneer u de wijzigingen toepast.","ui.package.hintConstraintChange":"De beperking voor dit pakket wordt gewijzigd van \\"{from}\\" naar \\"{to}\\" wanneer u de wijzigingen toepast.","ui.package.hintConstraintUpdate":"Dit pakket wordt bijgewerkt wanneer u de wijzigingen toepast.","ui.package.hintAdded":"Dit pakket wordt geïnstalleerd wanneer u de wijzigingen toepast.","ui.package.hintRemoved":"Dit pakket wordt verwijderd wanneer u de wijzigingen toepast.","ui.package.requiredTitle":"handmatig toegevoegd","ui.package.requiredText":"Dit pakket is vereist in composer.json maar is niet geïnstalleerd.","ui.package.removedTitle":"handmatig verwijderd","ui.package.removedText":"Dit pakket is verwijderd van uw composer.json.","ui.package.installed":"Momenteel geïnstalleerd:","ui.package.version":"Versie {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Ster | {count} Sterren","ui.package.editConstraint":"Bewerk","ui.package.uploadConstraint":"Deze beperking wordt bepaald door het geüploade pakket.","ui.package.updateButton":"Update","ui.package.removeButton":"Verwijder","ui.package.installButton":"Pakket toevoegen","ui.package.installButtonShort":"Toevoegen","ui.package.detailsButton":"Details","ui.package.latestConstraint":"laatste versie","ui.package.update":"Update beschikbaar","ui.package.updateLatest":"laatste versie","ui.package.updateAvailable":"{version} beschikbaar","ui.package.updateUnknown":"Onbekende versie","ui.package.updateConstraint":"Er is een nieuwere versie beschikbaar buiten uw versiebeperking.","ui.package.incompatible":"{package} werkt niet met Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Versie {version}","ui.cloudStatus.waitingTime":"Wacht Tijd","ui.cloudStatus.jobs":"Huidige Taken","ui.cloudStatus.workers":"Werkers","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"geen","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ong. {minutes} min {seconds} sec","ui.cloudStatus.error":"Niet in staat om de status van de Composer Resolver Cloud op te halen. Het kan down zijn voor onderhouds- of ervaringsproblemen.","ui.cloudStatus.button":"Cloud Status","ui.cloudStatus.refresh":"Vernieuw de Cloud Status","ui.log-viewer.loading":"Bezig met laden ...","ui.log-viewer.empty":"Er zijn geen logbestanden op uw server.","ui.log-viewer.reload":"Herladen","ui.log-viewer.file":"Logbestand","ui.log-viewer.channel":"Kanaal","ui.log-viewer.channelTitle":"Het kanaal waarop dit bericht is geregistreerd.","ui.log-viewer.level":"Niveau","ui.log-viewer.levelTitle":"Ernst van het logbericht.","ui.log-viewer.timeHeader":"Tijd","ui.log-viewer.messageHeader":"Bericht","ui.log-viewer.showContext":"Context tonen","ui.log-viewer.hideContext":"Context verbergen","ui.log-viewer.showExtra":"Extra tonen","ui.log-viewer.hideExtra":"Extra verbergen","ui.log-viewer.more":"Meer laden …","ui.log-viewer.download":"Download","ui.log-viewer.downloadTitle":"Download bestand \\"{file}\\"","ui.log-viewer.prodEnvironment":"Productieomgeving","ui.log-viewer.devEnvironment":"Ontwikkelomgeving (foutopsporingsmodus)","ui.user-manager.loading":"Loading users …","ui.user-manager.changePassword":"Change Password","ui.user-manager.setupTotp":"Setup Two-Factor Authentication","ui.user-manager.disableTotp":"Disable Two-Factor Authentication","ui.user-manager.invite":"Invite User","ui.user-manager.delete":"Delete","ui.user-manager.deleteConfirm":"Do you really want to delete user \\"{username}\\"?","ui.user-manager.deleted":"User {username} deleted successfully","ui.user-manager.passwordHeadline":"Change Password","ui.user-manager.passwordText":"To change your password, please enter the current and a new password in the respective fields.","ui.user-manager.currentPassword":"Current password","ui.user-manager.newPassword":"New password","ui.user-manager.passwordPlaceholder":"min. 8 tekens","ui.user-manager.submitPassword":"Submit","ui.user-manager.passwordChanged":"Your password has been changed successfully.","ui.user-manager.passwordError":"This password is incorrect.","ui.user-manager.inviteHeadline":"Invite User","ui.user-manager.inviteText":"If you need multiple logins for the Contao Manager, you can create an invitation link here. Share this link with someone or use it on another device to create a new account with the given permissions.","ui.user-manager.inviteSuccess1":"A new invitation link was created. The URL below can be used to create a new user account for this Contao Manager. The invitation expires on {expires} (one week from now).","ui.user-manager.inviteSuccess2":"Please copy the link to your clipboard. It will only work once and you will not be able to see it again after closing this dialog.","ui.user-manager.createInvitation":"Create Invitation Link","ui.user-manager.clipboard":"Copy to clipboard","ui.user-manager.permissions":"Learn about permissions","ui.user-manager.cancel":"Annuleer","ui.user-manager.close":"Sluit","ui.user-manager.you":"You","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"This account is secured by two-factor authentication.","ui.user-manager.2faDisabled":"This account is insecure due to missing two-factor authentication.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"This account is secured by a Passkey.","ui.totp.headline":"Two-Factor Authentication","ui.totp.setupQr":"Please scan the QR code with your 2FA/TOTP app.","ui.totp.setupCode":"If you cannot scan the QR code, enter this key instead:","ui.totp.codeLabel":"Verification code","ui.totp.codeDescription":"Please enter the verification code generated by your 2FA/TOTP app.","ui.totp.disableText":"Please enter the verification code to disable two-factor authentication.","ui.totp.invalid":"The verification code is invalid.","ui.totp.enable":"Inschakelen","ui.totp.disable":"Uitschakelen","ui.totp.cancel":"Annuleer","ui.totp.enabled":"Two-factor authentication was enabled successfully.","ui.totp.disabled":"Two-factor authentication was disabled successfully.","ui.totp.setup":"Setup Two-Factor Authentication","ui.totp.skip":"Skip Two-Factor Authentication"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[486],{8486:function(e){e.exports=JSON.parse('{"ui.app.title":"Contao eklentileri","ui.app.loading":"Eklenti listesi yükleniyor…","ui.app.language":"Contao Manager dilini deÄŸiÅŸtir","ui.app.colorDark":"Koyu kip","ui.app.colorDarkTitle":"Renk temasını koyu olarak deÄŸiÅŸtir","ui.app.colorLight":"Açık kip","ui.app.colorLightTitle":"Renk temasını açık olarak deÄŸiÅŸtir","ui.discover.advertisement":"Eklenti listesinde duyuru","ui.discover.loading":"Yükleniyor…","ui.discover.offline":"Herhangi bir sonuç alınamadı.","ui.discover.offlineExplain":"İnternet baÄŸlantınızı denetleyin ve tarayıcınızdaki JavaScript engelleyicileri etkisizleÅŸtirin.","ui.discover.offlineButton":"Yeniden dene","ui.discover.searchPlaceholder":"{count} eklentide ara…","ui.discover.empty":"{query} ile eÅŸleÅŸen bir sonuç bulunamadı","ui.discover.more":"DiÄŸer sonuçlar","ui.discover.sortBy":"Sıralama","ui.discover.sortReleased":"Yayınlandı","ui.discover.sortReleasedTitle":"Sonuçlar yayınlanma tarihine göre sıralansın","ui.discover.sortLatest":"Güncellendi","ui.discover.sortLatestTitle":"Sonuçlar güncellenme tarihine göre sıralansın","ui.discover.sortDownloads":"İndirmeler","ui.discover.sortDownloadsTitle":"Sonuçlar indirme sayılarına göre sıralansın","ui.discover.sortFavers":"DeÄŸerlendirme","ui.discover.sortFaversTitle":"Sonuçlar deÄŸerlendirmeye göre sıralansın","ui.discover.detailsButton":"Ayrıntılar","ui.discover.latestPackages":"Yeni ve güncellenmiÅŸ eklentiler","ui.discover.faversPackages":"İyi deÄŸerlendirilmiÅŸ eklentiler","ui.discover.downloadsPackages":"En çok indirilen eklentiler","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Proje sitesi","ui.package.private":"Özel paket","ui.package.privateTitle":"Özel paketler yalnızca üretici tarafından saÄŸlanabilir (ZIP indirmesi gibi). Ayrıntılı bilgi almak için siteye bakabilirsiniz.","ui.package.abandoned":"kullanımdan kaldırıldı","ui.package.abandonedText":"Bu paket kullanımdan kaldırıldı ve artık geliÅŸtirilmiyor.","ui.package.abandonedReplace":"Bu paket kullanımdan kaldırıldı ve artık geliÅŸtirilmiyor. GeliÅŸtirici bunun yerine {replacement} paketinin kullanılmasını öneriyor.","ui.package.contaoVersion":"Contao ile kullanılabilir","ui.package-details.previous":"Önceki eklenti bilgileri","ui.package-details.close":"Eklenti bilgilerini kapat","ui.package-details.loading":"Yükleniyor…","ui.package-details.tabDescription":"Açıklama","ui.package-details.tabRequire":"Gereksinimler","ui.package-details.tabFeatures":"Özellikler","ui.package-details.tabSuggest":"Öneriler","ui.package-details.tabConflict":"Çakışmalar","ui.package-details.tabDependents":"Bağımlılar","ui.package-details.linkRequires":"gereksinimi","ui.package-details.linkReplaces":"deÄŸiÅŸikliÄŸi","ui.package-details.linkProvides":"sundukları","ui.package-details.linkConflicts":"çakışması","ui.package-details.funding":"Paketin geliÅŸtirilmesine destek olun!","ui.package-details.contaoVersions":"Desteklenen Contao sürümleri","ui.package-details.latest":"Son sürüm","ui.package-details.released":"yayınlanma tarihi","ui.package-details.license":"Lisanslar","ui.package-details.authors":"geliÅŸtiren","ui.package-details.more":"Ayrıntılar","ui.package-details.packagist":"Paket bilgileri","ui.package-details.metadata":"Üst verileri düzenle","ui.package-details.support_docs":"Belgeler","ui.package-details.support_wiki":"Viki","ui.package-details.support_forum":"Destek forumu","ui.package-details.support_issues":"Sorunlar / Hata bildirimi","ui.package-details.support_source":"Kaynak kodu","ui.package-details.support_irc":"IRC / Sohbet","ui.package-details.support_email":"Destek e-postası","ui.package-details.support_rss":"RSS akışı"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[715],{3715:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! ÐебезопаÑное Ñоединение !!","ui.app.httpsDescription":"Без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ HTTPS ваши конфиденциальные данные будут переданы не зашифрованными.","ui.app.httpsLink":"Больше информации","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.safeModeHeadline":"!! Включен безопаÑный режим !!","ui.app.safeModeDescription":"Ðекоторые функции Contao Manager недоÑтупны.","ui.app.safeModeExit":"Выйти из безопаÑного режима","ui.app.limitedHeadline":"Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ ","ui.app.limitedDescription":"У Ð²Ð°Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ñ‹ разрешениÑ, поÑкольку вы вошли без ввода паролÑ.","ui.app.limitedLogout":"ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ","ui.app.totpHeadline":"Примечание о безопаÑноÑти","ui.app.totpDescription":"ÐаÑтройте двухфакторную авторизацию ÑейчаÑ, чтобы защитить ваш аккаунт.","ui.app.totpSetup":"ÐаÑтроить","ui.app.loading":"Загрузка Contao Manager...","ui.app.apiError":"Ðеожиданный ÑÑ‚Ð°Ñ‚ÑƒÑ API","ui.app.configSecurity1":"ПРЕДУПРЕЖДЕÐИЕ СИСТЕМЫ БЕЗОПÐСÐОСТИ !!! Обнаружен незащищенный каталог конфигурации","ui.app.configSecurity2":"Contao Manager обнаружил, что файлы его конфигурации общедоÑтупны. Ð’Ñе операции отключены до тех пор, пока каталог не будет защищен, в противном Ñлучае злоумышленник Ñможет получить доÑтуп к конфиденциальным данным уÑтановки.\\n\\nЧтобы уÑтранить Ñту проблему, обÑзательно запретите доÑтуп к каталогу \\"contao-manager\\" на вашем Ñервере. Чтобы узнать, как Ñто Ñделать, обратитеÑÑŒ к руководÑтву Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²ÐµÐ±-Ñервера или ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ хоÑтинг-провайдером.","ui.account.welcome":"ПриветÑтвие","ui.account.intro1":"Добро пожаловать в Contao Manager, универÑальный набор инÑтрументов Ð´Ð»Ñ ÑƒÑтановки и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao Open Source CMS. ЕÑли вы новичок в Ñтом, {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} чтобы начать работу","ui.account.introManual":"прочтите руководÑтво","ui.account.intro2":"ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ какие-либо проблемы, Ñм. {ourGithubIssues}, а так-же не ÑтеÑнÑйтеÑÑŒ Ñоздавать новые вопроÑÑ‹ Ð´Ð»Ñ Ð²Ñего, о чем еще не ÑообщалоÑÑŒ.","ui.account.introIssues":"наши GitHub вопроÑÑ‹","ui.account.headline":"Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ","ui.account.description":"Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтановкой, Ñоздайте учетную запиÑÑŒ Ð´Ð»Ñ Contao Manager. Имейте в виду, что Ñта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не ÑвÑзана Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒÑŽ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao, либо внешним интерфейÑом.","ui.account.username":"Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ","ui.account.password":"Пароль","ui.account.passwordPlaceholder":"мин. 8 Ñимволов","ui.account.passwordLength":"Введите не менее 8 Ñимволов.","ui.account.loginInvalid":"Произошла ошибка при Ñоздании аккаунта. Попробуйте другое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ.","ui.account.submit":"Создать учетную запиÑÑŒ","ui.account.usePassword":"ИÑпользовать пароль Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°","ui.account.usePasskey":"ИÑпользовать Passkey Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°","ui.account.totpHeadline":"Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ","ui.account.totpDescription":"Включите двухфакторную авторизацию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ дополнительный уровень безопаÑноÑти к вашей учетной запиÑи. Ð’ дополнение к вашему имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролю вам нужно будет ввеÑти код подтверждениÑ, Ñгенерированный двухфакторным приложением, таким как 1Password, Authy, Google Authenticator, Microsoft Authenticator, LastPass Authenticator или любым другим приложением TOTP.","ui.account.totpSetup":"ÐаÑтроить ÑейчаÑ","ui.account.totpSkip":"ÐаÑтроить потом","ui.account.login":"Отклонить приглашение","ui.account.contribute1":"Contao и Contao Manager ÑпонÑируютÑÑ Ð½ÐµÐºÐ¾Ð¼Ð¼ÐµÑ€Ñ‡ÐµÑкой аÑÑоциацией Contao.","ui.account.contribute2":"ПожалуйÑта, подумайте о внеÑении вклада в открытый иÑходный код {donate}.","ui.account.contributeDonate":"Ñделать пожертвование","ui.login.headline":"Вход в ÑиÑтему","ui.login.description":"Войдите в ÑиÑтему Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑтановкой.","ui.login.username":"Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ","ui.login.password":"Пароль","ui.login.totpHeadline":"Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ","ui.login.totpDescription":"Введите проверочный код Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа входа.","ui.login.totp":"Проверочный код","ui.login.forgotPassword":"Забыли пароль?","ui.login.button":"Вход в ÑиÑтему","ui.login.passkey":"Войти Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Passkey","ui.login.cancel":"Отмена","ui.login.or":"или","ui.login.locked":"ДоÑтуп запрещен, потому, что Contao Manager заблокирован. Чтобы разблокировать, удалите файл {lockFile} в корневом каталоге Contao.","ui.logout.headline":"Тайм-аут ÑеанÑа","ui.logout.warning":"Ð’Ñ‹ были неактивны более 25 минут. Из Ñоображений безопаÑноÑти ваша ÑеÑÑÐ¸Ñ Ð±ÑƒÐ´ÐµÑ‚ прервана в ближайшее времÑ.","ui.logout.expired":"Ваш ÑÐµÐ°Ð½Ñ Ð±Ñ‹Ð» автоматичеÑки прерван, потому, что вы были неактивны более 30 минут.","ui.logout.renew":"ОÑтаватьÑÑ Ð² ÑиÑтеме","ui.logout.logout":"Выход","ui.logout.login":"ВернутьÑÑ Ð½Ð° Ñтраницу входа","ui.oauth.error":"ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° OAuth. Проверьте параметры запроÑа.","ui.oauth.https":"URI Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð”ÐžÐ›Ð–Ð•Ð Ð¸Ñпользовать защищенный протокол (https:), чтобы предотвратить передачу токена авторизации в виде открытого текÑта.","ui.oauth.headline":"Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ ","ui.oauth.description":"Следующее приложение или Ñлужба запрашивает удаленный доÑтуп к ÑкземплÑру Contao Manager.","ui.oauth.domain":"Прежде чем разрешить доÑтуп, убедитеÑÑŒ, что Ñтот URL вам извеÑтен и вы доверÑете его владельцу!","ui.oauth.outOfScope":"К Ñожалению, у Ð²Ð°Ñ Ð½ÐµÑ‚ необходимых разрешений Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¾Ð³Ð¾ доÑтупа.","ui.oauth.allow":"Разрешить доÑтуп","ui.oauth.deny":"Запретить доÑтуп","ui.oauth.switchUser":"Сменить пользователÑ","ui.scope.admin":"ÐдминиÑтративный доÑтуп, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ пользователÑми","ui.scope.install":"УÑтановка новых пакетов и изменение конфигурации Contao","ui.scope.update":"Обновление пакетов и выполнение задач по техничеÑкому обÑлуживанию","ui.scope.read":"Чтение пакетов и конфигурации","ui.boot.headline":"Проверка ÑиÑтемы","ui.boot.description":"Подождите, мы анализируем ваш Ñервер...","ui.boot.issue1":"Обнаруженные проблемы уÑтановки","ui.boot.issue2":"Ваша уÑтановка имеет проблемы, которые должны быть иÑправлены, перед иÑпользованием Contao Manager.","ui.boot.run":"ЗапуÑк Contao Manager","ui.boot.safeMode":"ЗапуÑк в безопаÑном режиме","ui.recovery.headline":"ВоÑÑтановление ÑиÑтемы","ui.recovery.description":"Contao Manager обнаружил файлы, которые выглÑдÑÑ‚ как файлы Contao, но Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñтроки не работает как положено.","ui.recovery.console":"Вывод конÑоли","ui.recovery.repairOptions":"Выберите вариант воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ уÑтановки.","ui.recovery.repairHeadline":"ÐвтоматичеÑкое воÑÑтановление","ui.recovery.repairDescription":"ПытатьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки воÑÑтановить уÑтановку путем переÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ ÐºÐµÑˆÐ° Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ повторной уÑтановки пакетов Composer.","ui.recovery.repairWarning":"Любые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файлах каталога vendor могут быть удалены в процеÑÑе!","ui.recovery.repairFailed":"ÐвтоматичеÑкое воÑÑтановление не удалоÑÑŒ. ИÑпользуйте безопаÑный режим, чтобы воÑÑтановить уÑтановку вручную.","ui.recovery.repairButton":"ЗапуÑтить ÑиÑтемное воÑÑтановление","ui.recovery.safeModeHeadline":"БезопаÑный режим","ui.recovery.safeModeDescription":"ЗапуÑк Contao Manager в безопаÑном режиме позволÑет управлÑть пакетами и запуÑкать определенные задачи обÑлуживаниÑ, но функции, которые опираютÑÑ Ð½Ð° рабочую уÑтановку Contao, будут недоÑтупны.","ui.recovery.safeModeButton":"ЗапуÑк в безопаÑном режиме","ui.server.pending":"Ожидание...","ui.server.running":"Ðнализ...","ui.server.error":"Проверка завершилаÑÑŒ неудачно из-за неожиданного ответа Ñ Ñервера.","ui.server.details":"СведениÑ","ui.server.prerequisite":"Проверка отменена из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ñ… уÑловий.","ui.server.selfUpdate.title":"ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Contao Manager","ui.server.selfUpdate.update":"ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Contao Manager {latest}.","ui.server.selfUpdate.manualUpdate":"ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Contao Manager {latest}. Ваш Ñервер не поддерживает автоматичеÑкое обновление, загрузите новую верÑию из {download}.","ui.server.selfUpdate.latest":"Ð’Ñ‹ иÑпользуете поÑледнюю верÑию {current}.","ui.server.selfUpdate.dev":"ТеÑтовые Ñборки не поддерживает автоматичеÑкое обновление.","ui.server.selfUpdate.unsupported":"ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ, но она не поддерживает вашу верÑию PHP.","ui.server.selfUpdate.button":"ЗапуÑтить Ñамообновление","ui.server.selfUpdate.continue":"Продолжить","ui.server.config.title":"ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñервера","ui.server.config.setup":"ÐаÑтроить","ui.server.config.change":"Изменить","ui.server.config.save":"Сохранить","ui.server.config.cancel":"Отмена","ui.server.config.customOption":"Другие…","ui.server.config.description":"Ð”Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ð½Ð¾Ð²Ñ‹Ñ… задач, Contao Manager необходимо знать, где найти двоичный файл командной Ñтроки PHP и как выполнÑть команды, отделенные от веб-процеÑÑа.","ui.server.config.formTitle":"ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñервера","ui.server.config.formText":"Введите путь к вашему бинарному файлу PHP. УбедитеÑÑŒ, что бинарный файл той же верÑии PHP, что и ваш веб-процеÑÑ.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"Composer Resolver Cloud позволÑет уÑтанавливать завиÑимоÑти Composer даже еÑли Ñервер не предоÑтавлÑет доÑтаточно локальной памÑти. Имейте в виду, что Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пакетах будет передана на облачный Ñервер, управлÑемый Contao Association.","ui.server.config.cloud":"ИÑпользовать Composer Resolver Cloud","ui.server.config.cli":"Бинарный файл PHP","ui.server.config.stateErrorCli":"Ðа Ñервере не найден верный бинарный файл PHP.","ui.server.config.stateErrorCloud":"Composer Resolver Cloud не поддерживаетÑÑ.","ui.server.config.stateSuccess":"Бинарный файл PHP {php_cli}.","ui.server.php_web.title":"Веб-процеÑÑ PHP","ui.server.php_web.below7":"Ðайдена верÑÐ¸Ñ PHP {version}. Перейдите на PHP 7 как можно Ñкорее!","ui.server.php_web.success":"Ðайдена верÑÐ¸Ñ PHP {version}, извеÑтные проблемы не найдены.","ui.server.php_cli.title":"Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñтроки PHP","ui.server.php_cli.success":"Ðайдена верÑÐ¸Ñ PHP {version}, извеÑтные проблемы не найдены.","ui.server.composer.title":"ÐžÐºÑ€ÑƒÐ¶Ð°ÑŽÑ‰Ð°Ñ Ñреда Composer","ui.server.composer.success":"ИзвеÑтных проблем не обнаружено.","ui.server.composer.install":"ЗавиÑимоÑти Composer не уÑтановлены.","ui.server.composer.button":"УÑтановить","ui.server.contao.title":"УÑтановка Contao","ui.server.contao.setup":"ÐаÑтроить","ui.server.contao.check":"Проверить базу данных","ui.server.contao.empty":"УÑтановка Contao не найдена.","ui.server.contao.old":"Contao верÑии {version} не ÑовмеÑтима Ñ Contao Manager, пожалуйÑта, обновите уÑтановку Contao вручную.","ui.server.contao.found":"Ðайдена Contao {version} (верÑÐ¸Ñ API {api}).","ui.server.contao.connectionError":"Ðе удаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñерверу базы данных.","ui.server.contao.connectionProblem":"Обнаружена проблема Ñ Ð±Ð°Ð·Ð¾Ð¹ данных.","ui.server.contao.missingUser":"Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ админиÑтратора не найдена.","ui.setup.continue":"Продолжить","ui.setup.manager":"ЗапуÑк Contao Manager","ui.setup.cancel":"Отмена","ui.setup.welcome":"ПриветÑтвие","ui.setup.welcome1":"Этот маÑтер проведет Ð²Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· необходимые шаги Ð´Ð»Ñ Ð½Ð°Ñтройки и уÑтановки ÑиÑтемы Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом Contao CMS.","ui.setup.welcome2":"ЕÑли у Ð²Ð°Ñ ÐµÑть какие-либо вопроÑÑ‹, найдите документацию, форумы, канал Slack и многое другое на Ñтранице {support}.","ui.setup.support":"поддержка ÑообщеÑтва","ui.setup.start":"Ðачать","ui.setup.complete":"ПоздравлÑем!","ui.setup.complete1":"Contao {version} уÑпешно уÑтановлена.","ui.setup.complete2":"Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÑтановки, откройте маÑтер уÑтановки, наÑтройте подключение к базе данных и Ñоздайте учетную запиÑÑŒ панели управлениÑ.","ui.setup.complete3":"Теперь можно приÑтупить к Ñозданию Ñвоего веб-Ñайта, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao. ЕÑли нужны дополнительные раÑширениÑ, перейдите в Contao Manager.","ui.setup.installTool":"Открыть маÑтер уÑтановки","ui.setup.login":"Войти в Contao","ui.setup.funding":"Свободное программное обеÑпечение означает \\"беÑплатно\\" как \\"Ñвобода Ñлова\\", а не как \\"беÑплатное пиво\\". Ð”Ð»Ñ Ñ‚Ð°ÐºÐ¾Ð³Ð¾ проекта Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом, как Contao, требуютÑÑ Ñуммы денег, которые не могут быть Ñобраны одним человеком или компанией.\\nЕÑли у Ð’Ð°Ñ ÐµÑть веб-Ñайт или Ð’Ñ‹ продаете веб-Ñайты, Ñозданные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Contao, мы были бы рады, еÑли бы Ð’Ñ‹ внеÑли поÑильный финанÑовый вклад в продукт, на который опираетÑÑ Ð’Ð°Ñˆ бизнеÑ.","ui.setup.fundingLink":"Узнать больше","ui.setup.document-root.headline":"ÐаÑтройка веб-Ñервера","ui.setup.document-root.warning":"Чтобы уÑтановить Contao Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Contao Manager, необходимо иÑправить корень документа на веб-Ñервере.","ui.setup.document-root.description1":"Contao иÑпользует отдельный каталог Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ´Ð¾Ñтупных файлов, файлы приложений уÑтанавливаютÑÑ Ð² родительÑкий каталог. Contao не может быть уÑтановлен, еÑли Ñтруктура каталогов неверна или каталоги не пуÑты.","ui.setup.document-root.description2":"ЕÑли вы не знаете, как наÑтроить корень документа, ознакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹ Contao или обратитеÑÑŒ к хоÑтинг-провайдеру.","ui.setup.document-root.documentation":"Читать документацию","ui.setup.document-root.conflictsTitle":"Каталог уÑтановки не пуÑтой","ui.setup.document-root.conflictsDirectory":"Корневой каталог будущей уÑтановки Contao не пуÑтой, найдено {count} файла(ов), которые могут быть перезапиÑаны в процеÑÑе уÑтановки. РекомендуетÑÑ Ñоздать пуÑтую Ñтруктуру каталогов Ð´Ð»Ñ ÑƒÑтановки Contao. Также вы можете удалить Ñледующие файлы и проверить еще раз, уверены ли вы, что они не иÑпользуютÑÑ.","ui.setup.document-root.ignoreConflicts":"Я хочу уÑтановить Contao в непуÑтой каталог. Я понимаю, что Ñто может перезапиÑать любые ÑущеÑтвующие файлы в моем веб-проÑтранÑтве.","ui.setup.document-root.check":"Проверить еще раз","ui.setup.document-root.create":"Создать каталоги","ui.setup.document-root.change":"Изменить каталоги","ui.setup.document-root.formTitle":"ÐаÑтройка каталога","ui.setup.document-root.formText1":"Contao Manager может автоматичеÑки Ñоздать новую Ñтруктуру каталогов на Ñервере.","ui.setup.document-root.formText2":"Ðеобходимо вручную наÑтроить новый корень документа (например, через панель админиÑтратора хоÑтинга).","ui.setup.document-root.autoconfig":"Я понимаю, что мне нужно изменить конфигурацию Ñервера. ЕÑли не наÑтроить корневой каталог документа, Ñто Ñломает Contao Manager и откроет файлы конфигурации (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ учетной запиÑи и пароли)!","ui.setup.document-root.directory":"Ðовый каталог","ui.setup.document-root.currentRoot":"Текущий корень документа","ui.setup.document-root.newRoot":"Ðовый корень документа","ui.setup.document-root.finish":"Каталоги уÑтановки","ui.setup.document-root.publicDir":"ИÑпользовать {dir} Ð´Ð»Ñ Ð¾Ð±Ñ‰ÐµÐ´Ð¾Ñтупных файлов (Contao {version})","ui.setup.document-root.directoryInvalid":"Введите допуÑтимое Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°.","ui.setup.document-root.directoryExists":"Целевой каталог уже ÑущеÑтвует. Введите другое имÑ.","ui.setup.document-root.confirmation":"Contao Manager уÑпешно Ñоздал каталог, необходимый Ð´Ð»Ñ ÑƒÑтановки Contao. Теперь необходимо наÑтроить корневой каталог документа на веб-Ñервере. Ðе перезагружайте Ñту Ñтраницу до тех пор.","ui.setup.document-root.reload":"Перезагрузить Ñтраницу","ui.setup.document-root.success":"Структура каталогов на веб-Ñервере наÑтроена правильно!","ui.setup.document-root.installingProjectDir":"Файлы Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ уÑтановлены в {dir}.","ui.setup.document-root.installingPublicDir":"ОбщедоÑтупные файлы будут уÑтановлены в {dir}.","ui.setup.document-root.installedProjectDir":"Файлы Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑƒÑтанавливаютÑÑ Ð² {dir}.","ui.setup.document-root.installedPublicDir":"ОбщедоÑтупные файлы уÑтанавливаютÑÑ Ð² {dir}.","ui.setup.create-project.headline":"УÑтановка Contao","ui.setup.create-project.description":"Разработка Contao Ñледует принципу {semver}, Ð½Ð¾Ð²Ð°Ñ Ð¼Ð¸Ð½Ð¾Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð²Ñ‹Ð¿ÑƒÑкаетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ðµ шеÑть меÑÑцев. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ Ñледующие релизы:","ui.setup.create-project.semver":"СемантичеÑкое управление верÑиÑми","ui.setup.create-project.latestTitle":"ПоÑледнÑÑ Ð²ÐµÑ€ÑиÑ","ui.setup.create-project.ltsTitle":"ВерÑÐ¸Ñ Ñ Ð´Ð¾Ð»Ð³Ð¾Ñрочной поддержкой","ui.setup.create-project.latestQ1":"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ‚ большинÑтво функций Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ до Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ {year}.","ui.setup.create-project.latestQ3":"ПоÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ‚ большинÑтво функций Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ до авгуÑта {year}.","ui.setup.create-project.ltsText":"Ð¢ÐµÐºÑƒÑ‰Ð°Ñ LTS-верÑиÑ, еÑли вы предпочитаете ÑтабильноÑть, предлагает долгоÑрочную поддержку до Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ {year}.","ui.setup.create-project.pltsText":"ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ LTS-верÑиÑ, по-прежнему имеет долгоÑрочную поддержку до Ñ„ÐµÐ²Ñ€Ð°Ð»Ñ {year}.","ui.setup.create-project.requiresPHP":"ТребуетÑÑ PHP верÑии минимум {version}, у Ð²Ð°Ñ PHP {current}.","ui.setup.create-project.releaseplan":"Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации Ñм. {contaoReleasePlan}.","ui.setup.create-project.releaseplanLink":"План выпуÑка Contao","ui.setup.create-project.installed":"Contao {version} уÑпешно уÑтановлена на Ñервере. Продолжайте наÑтройку базы данных или запуÑтите Contao Manager Ð´Ð»Ñ ÑƒÑтановки другой верÑии.","ui.setup.create-project.formTitle":"Выберите диÑтрибутив","ui.setup.create-project.formText":"Выберите, какую верÑию Ñледует уÑтановить.","ui.setup.create-project.version":"ВерÑиÑ","ui.setup.create-project.demo":"УÑтановить демонÑтрационный веб-Ñайт Contao.","ui.setup.create-project.demoDescription":"ДемонÑтрационный веб-Ñайт поможет вам познакомитьÑÑ Ñ Contao и вÑеми его оÑновными функциÑми. Дополнительные темы можно найти в {store}.","ui.setup.create-project.coreOnly":"ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÑтановка (Только Ñдро)","ui.setup.create-project.noUpdate":"ПропуÑтить уÑтановку (Только Ð´Ð»Ñ ÑкÑпертов!)","ui.setup.create-project.theme":"Contao тема","ui.setup.create-project.themeInstall":"Ð”Ð»Ñ ÑƒÑтановки темы Contao, иÑпользуйте поиÑк или загрузите файл темы (.cto/.zip), который поддерживает уÑтановку через Contao Manager.","ui.setup.create-project.themeBuy":"ОбÑзательно поÑетите официальный {store}.","ui.setup.create-project.themeStore":"Магазин тем Contao","ui.setup.create-project.themeUpload":"Загрузить файл темы (.cto/.zip)","ui.setup.create-project.themeInvalid":"Загруженный файл не ÑвлÑетÑÑ Ñ‚ÐµÐ¼Ð¾Ð¹ Contao или не поддерживает Contao Manager.","ui.setup.create-project.themeWarning":"Contao Manager не может определить, ÑовмеÑтима ли Ñта тема Ñ Ð²Ð°ÑˆÐ¸Ð¼ Ñервером. ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑŽÑ‚ вопроÑÑ‹, обратитеÑÑŒ к поÑтавщику темы.","ui.setup.create-project.themeTitle":"ПроÑмотр Ñведений о теме","ui.setup.create-project.themeDetails":"С Ñтой темой будут уÑтановлены Ñледующие завиÑимоÑти и файлы.","ui.setup.create-project.themeRequire":"{count} завиÑимоÑть | {count} завиÑимоÑтей","ui.setup.create-project.themeFiles":"{count} файл | {count} файлов","ui.setup.create-project.theme.or":"или выполните поиÑк в общедоÑтупных темах","ui.setup.create-project.theme.search":"ПоиÑк тем","ui.setup.create-project.theme.more":"Больше тем","ui.setup.create-project.theme.empty":"Ðет ÑоответÑтвующих тем {query}","ui.setup.create-project.theme.uploaded":"Файл темы загружен уÑпешно.","ui.setup.create-project.theme.packageName":"Ð˜Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°","ui.setup.create-project.theme.version":"ВерÑиÑ","ui.setup.create-project.theme.authors":"Ðвтор(Ñ‹)","ui.setup.create-project.theme.upload":"Загрузка {name} ({size})","ui.setup.create-project.install":"УÑтановить","ui.setup.create-project.cancel":"Отмена","ui.setup.database-connection.headline":"Подключение к базе данных","ui.setup.database-connection.description":"Contao требуетÑÑ Ð±Ð°Ð·Ñ‹ данных MySQL (или ÑовмеÑтимого форка, такого как MariaDB) Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñтраниц, контента, пользователей и других релÑционных данных. Параметры Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½ÑÑ‚ÑÑ Ð² файле {env} в корне проекта вашей уÑтановки Contao.","ui.setup.database-connection.formTitle":"Параметры подключениÑ","ui.setup.database-connection.formText":"Введите URL-Ð°Ð´Ñ€ÐµÑ Ð±Ð°Ð·Ñ‹ данных или заполните Ð¿Ð¾Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ пользователÑ, паролÑ, Ñервера и базы данных отдельно.","ui.setup.database-connection.url":"URL базы данных","ui.setup.database-connection.validUrl":"URL-Ð°Ð´Ñ€ÐµÑ Ð±Ð°Ð·Ñ‹ данных недейÑтвителен или Ñоединение Ñ Ñервером не выполнено.","ui.setup.database-connection.or":"или","ui.setup.database-connection.user":"Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ","ui.setup.database-connection.password":"Пароль","ui.setup.database-connection.server":"Сервер (:Порт)","ui.setup.database-connection.database":"Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных","ui.setup.database-connection.connected":"Соединение Ñ Ð±Ð°Ð·Ð¾Ð¹ данных {database} на {server} уÑпешно уÑтановлено.","ui.setup.database-connection.error":"Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных.","ui.setup.database-connection.problem":"Contao обнаружила проблему Ñ Ñервером базы данных.","ui.setup.database-connection.schemaTitle":"Схема базы данных","ui.setup.database-connection.migration":"СущеÑтвует одна Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ. | ЕÑть {count} ожидающие миграции.","ui.setup.database-connection.schema":"СущеÑтвует одна Ð¾Ð¶Ð¸Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñхема. | ЕÑть {count} ожидающих Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñхем.","ui.setup.database-connection.noChanges":"Схема базы данных обновлена.","ui.setup.database-connection.check":"Проверить базу данных","ui.setup.database-connection.skip":"ПропуÑтить","ui.setup.database-connection.save":"Сохранить","ui.setup.database-connection.change":"Изменить учетные данные","ui.setup.database-connection.restoreTitle":"Импорт базы данных","ui.setup.database-connection.restoreText":"Только что уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° Ñодержит резервную копию базы данных. ВоÑÑтановите базу данных, чтобы импортировать данные темы или пропуÑтите Ñтот шаг, чтобы начать Ñ Ñ‡Ð¸Ñтой уÑтановки Contao. | Только что уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° Ñодержит неÑколько резервных копий базы данных. Выберите файл резервной копии Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° данных темы или пропуÑтите Ñтот шаг, чтобы начать Ñ Ñ‡Ð¸Ñтой уÑтановки Contao.","ui.setup.database-connection.backup":"Резервное копирование текущей базы данных перед импортом","ui.setup.database-connection.backupWarning":"При импорте вÑе данные в базе данных будут перезапиÑаны! ЕÑли база данных не пуÑта, Ñначала Ñоздайте резервную копию.","ui.setup.database-connection.restore":"Импорт базы данных темы","ui.setup.database-connection.restoreOption":"Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¸Ð· {date} ({size})","ui.setup.database-connection.restored":"База данных темы была уÑпешно импортирована. Продолжайте проверÑть Ñхему базы данных.","ui.setup.backend-user.success":"Ð’ базе данных обнаружена ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ админиÑтратора Ð´Ð»Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao. ИÑпользуйте панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao, чтобы добавить больше пользователей.","ui.setup.backend-user.error":"Ðе удалоÑÑŒ получить ÑпиÑок пользователей. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации Ñм. вывод конÑоли.","ui.setup.backend-user.headline":"Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ панели управлениÑ","ui.setup.backend-user.description":"Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñвоим веб-Ñайтом, вам необходимо иметь Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну учетную запиÑÑŒ админиÑтратора в панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao. Имейте в виду, что Ñта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не ÑвÑзана Ñ Contao Manager.","ui.setup.backend-user.formTitle":"Создать учетную запиÑÑŒ","ui.setup.backend-user.formText":"Введите данные Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ учетной запиÑи панели управлениÑ.","ui.setup.backend-user.username":"Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ","ui.setup.backend-user.name":"ИмÑ","ui.setup.backend-user.email":"E-mail адреÑ","ui.setup.backend-user.emailInvalid":"Введите допуÑтимый e-mail","ui.setup.backend-user.password":"Пароль","ui.setup.backend-user.passwordPlaceholder":"мин. 8 Ñимволов","ui.setup.backend-user.passwordLength":"Введите не менее 8 Ñимволов.","ui.setup.backend-user.create":"Добавить учетную запиÑÑŒ","ui.task.headline":"Ð¤Ð¾Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°","ui.task.loading":"Загрузка Ñведений...","ui.task.created":"Загрузка Ñведений...","ui.task.active":"Подождите, пока Contao Manager выполнÑет задачи в фоновом режиме.","ui.task.complete":"Ð’Ñе операции уÑпешно завершены. Дополнительные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ñм. в протоколе конÑоли.","ui.task.paused":"ÐÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾Ñтановка фоновой операции. Проверьте протокол конÑоли.","ui.task.aborting":"Подождите, пока отменÑÑŽÑ‚ÑÑ Ñ„Ð¾Ð½Ð¾Ð²Ñ‹Ðµ операции.","ui.task.stopped":"Ðекоторые фоновые операции были отменены. Проверьте протокол конÑоли.","ui.task.error":"ÐÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾Ñтановка фоновой операции. Проверьте протокол конÑоли.","ui.task.failed":"Contao Manager не удалоÑÑŒ запуÑтить фоновую задачу!","ui.task.failedDescription1":"Что-то пошло не так при попытке Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ в фоновом режиме.","ui.task.failedDescription2":"ЕÑли Ñто Ñобытие произойдет Ñнова, ваш Ñервер может не поддерживатьÑÑ.","ui.task.reportProblem":"Сообщить о проблеме","ui.task.pausedDescription":"Ðажмите \\"Продолжить\\", еÑли хотите проигнорировать ошибку и выполнить оÑтавшиеÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸.","ui.task.sponsor":"Composer Cloud ÑпонÑируетÑÑ {sponsor}","ui.task.buttonAudit":"Обновить базу данных","ui.task.buttonClose":"Закрыть","ui.task.buttonConfirm":"Подтвердить и закрыть","ui.task.buttonContinue":"Продолжить","ui.task.buttonCancel":"Отмена","ui.task.confirmCancel":"Ð’Ñ‹ дейÑтвительно хотите отменить задачу? Это может оÑтавить вашу уÑтановку Contao в не работающем ÑоÑтоÑнии!","ui.task.autoclose":"Закрыть ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± уÑпешном выполнении задачи","ui.console.toggle":"Показать/Скрыть вывод конÑоли","ui.console.showLog":"Показать полный журнал конÑоли","ui.console.copyLog":"Скопировать журнал в буфер обмена","ui.migrate.headline":"ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных","ui.migrate.migrationsOnly":"(только миграции)","ui.migrate.schemaOnly":"(только Ñхема)","ui.migrate.loading":"Подождите, идет проверка базы данных...","ui.migrate.empty":"Отложенных миграций или обновлений Ñхемы не обнаружено. Ваша база данных актуальна.","ui.migrate.emptyMigrations":"Отложенных миграций не найдено. Ðе забудьте проверить наличие обновлений Ñхемы.","ui.migrate.emptySchema":"Отложенных обновлений Ñхемы не найдено. Ðе забудьте проверить миграции.","ui.migrate.pending":"Ваша база данных не обновлена. ПроÑмотрите приведенный ниже вывод конÑоли и внеÑите изменениÑ.","ui.migrate.previousChanges":"ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных не была подтверждена.\\nПроÑмотрите приведенный ниже вывод конÑоли, а затем продолжите проÑмотр Ñледующих изменений.","ui.migrate.previousComplete":"ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных не была подтверждена, проÑмотрите вывод конÑоли ниже.\\nОжидаемых изменений больше нет.","ui.migrate.appliedChanges":"Были применены Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных.\\nПроÑмотрите приведенный ниже вывод конÑоли, а затем продолжите проÑмотр Ñледующих изменений.","ui.migrate.appliedComplete":"Были применены Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных.\\nБольше нет ожидающих миграций или обновлений Ñхемы. База данных обновлена.","ui.migrate.problem":"Contao обнаружила проблему Ñ Ñервером базы данных.\\nПроÑмотрите вывод конÑоли ниже, чтобы узнать, что необходимо иÑправить. | Contao обнаружила проблемы Ñ Ñервером базы данных.\\nПроÑмотрите вывод конÑоли ниже, чтобы узнать, что необходимо иÑправить.","ui.migrate.warning":"Contao обнаружила неправильную конфигурацию Ñервера базы данных.\\nÐŸÑ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть временно пропущены, но должны быть иÑправлены Ð´Ð»Ñ Ð¾Ð±ÐµÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ производительноÑти и целоÑтноÑти данных.","ui.migrate.error":"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ могут быть применены. Возможно, ваша база данных была изменена, проверьте еще раз, чтобы повторить попытку.","ui.migrate.execute":"Выполнить","ui.migrate.close":"Закрыть","ui.migrate.confirm":"Подтвердить и закрыть","ui.migrate.cancel":"Отмена","ui.migrate.continue":"Продолжить","ui.migrate.setup":"ÐаÑтроить","ui.migrate.skip":"ПропуÑтить","ui.migrate.retry":"Проверить еще раз","ui.migrate.retryAll":"Проверить вÑе","ui.migrate.withDeletes":"Выполнить вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑÑ‹ DROP.","ui.migrate.migrationTitle":"Миграции базы данных","ui.migrate.schemaTitle":"ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñхемы","ui.migrate.problemTitle":"Проблемы Ñ Ð±Ð°Ð·Ð¾Ð¹ данных","ui.migrate.warningTitle":"ÐŸÑ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных","ui.migrate.addTable":"Добавить таблицу {table}","ui.migrate.dropTable":"Удалить таблицу {table}","ui.migrate.addField":"Добавить поле {table}.{field}","ui.migrate.changeField":"Изменить поле {table}.{field}","ui.migrate.dropField":"Удалить поле {table}.{field}","ui.migrate.createIndex":"Создать Ð¸Ð½Ð´ÐµÐºÑ \\"{name}\\" в {table}","ui.migrate.dropIndex":"Удалить Ð¸Ð½Ð´ÐµÐºÑ \\"{name}\\" в {table}","ui.widget.mandatory":"Поле не должно быть пуÑтым.","ui.widget.blankOption":"ПожалуйÑта, выберите…","ui.widget.showPassword":"Показать пароль","ui.widget.hidePassword":"Скрыть пароль","ui.error.title":"HTTP Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ \\"{method} {url}\\" не выполнен.","ui.error.server500":"ВероÑтно, на Ñервере произошла Ð½ÐµÐ¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Проверьте файлы журнала вашего веб-Ñервера (Apache/Nginx) и журналы Contao Manager по адреÑу \\"contao-manager/logs\\".","ui.error.response":"Сервер вернул ответ Ñ ÐºÐ¾Ð´Ð¾Ð¼ ÑоÑтоÑÐ½Ð¸Ñ {status}.","ui.error.moreLink":"Больше информации","ui.error.support":"Поддержка Contao","ui.error.permission":"У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование Ñтой функции.","ui.footer.help":"Справка","ui.footer.reportProblem":"Сообщить о проблеме","ui.navigation.discover":"Обзор","ui.navigation.packages":"Пакеты","ui.navigation.tools":"ИнÑтрументы","ui.navigation.installTool":"МаÑтер уÑтановки","ui.navigation.backend":"Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Contao","ui.navigation.debug":"Режим отладки Contao","ui.navigation.logViewer":"ПроÑмотр журнала","ui.navigation.phpinfo":"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ PHP","ui.navigation.phpinfoLoading":"Загрузка информации о PHP...","ui.navigation.maintenance":"ОбÑлуживание","ui.navigation.rebuildCache":"ВоÑÑтановить кеш","ui.navigation.users":"Учетные запиÑи","ui.navigation.systemCheck":"Проверка ÑиÑтемы","ui.navigation.advanced":"РаÑширенный","ui.navigation.logout":"Выход","ui.maintenance.database.title":"ÐœÐ¸Ð³Ñ€Ð°Ñ†Ð¸Ñ Ð±Ð°Ð· данных и резервное копирование","ui.maintenance.database.description":"ÐœÐ¸Ð³Ñ€Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных обеÑпечивает ÑоглаÑованноÑть данных и Ñхем таблиц.","ui.maintenance.database.migrations":"Одна Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð¼Ð¸Ð³Ñ€Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных | {count} незавершенных миграций базы данных.","ui.maintenance.database.schemaUpdates":"Одно ожидающее обновление Ñхемы | {count} ожидающих обновлений Ñхемы","ui.maintenance.database.error":"Обнаружена проблема Ñ Ð±Ð°Ð·Ð¾Ð¹ данных.","ui.maintenance.database.warning":"Обнаружены Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных.","ui.maintenance.database.button":"Проверить базу данных","ui.maintenance.database.migrationOnly":"Проверить только миграции","ui.maintenance.database.schemaOnly":"Проверить только Ñхему","ui.maintenance.database.installTool":"Открыть маÑтер уÑтановки","ui.maintenance.database.createBackup":"Создать резервную копию","ui.maintenance.database.backupUnsupported":"Резервное копирование баз данных не поддерживаетÑÑ Ð²Ð°ÑˆÐµÐ¹ верÑией Contao.","ui.maintenance.database.backupList":"У Ð²Ð°Ñ ÐµÑть одна Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ {date}. | У Ð²Ð°Ñ ÐµÑть {count} резервных копий базы данных, поÑледнÑÑ Ð¸Ð· которых была Ñоздана {date}.","ui.maintenance.database.backupEmpty":"Ðа данный момент у Ð²Ð°Ñ Ð½ÐµÑ‚ резервных копий базы данных.","ui.maintenance.rebuildCache.title":"Кеш приложениÑ","ui.maintenance.rebuildCache.description":"ПоÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ из файлов конфигурации требуетÑÑ Ð²Ð¾ÑÑтановление кеша приложений.","ui.maintenance.rebuildCache.rebuildProd":"ПереÑтроить производÑтвенный кеш","ui.maintenance.rebuildCache.rebuildDev":"ПереÑтроить кеш разработки","ui.maintenance.rebuildCache.clearProd":"ОчиÑтить производÑтвенный кеш","ui.maintenance.rebuildCache.clearDev":"ОчиÑтить кеш разработки","ui.maintenance.installTool.title":"МаÑтер уÑтановки Contao","ui.maintenance.installTool.description":"МаÑтер уÑтановки Contao автоматичеÑки блокируетÑÑ, еÑли вы введете неправильный пароль три раза подрÑд.","ui.maintenance.installTool.unlock":"Разблокировать маÑтер уÑтановки","ui.maintenance.installTool.lock":"Заблокировать маÑтер уÑтановки","ui.maintenance.dumpAutoload.title":"Загрузчик клаÑÑа Composer","ui.maintenance.dumpAutoload.description":"Ðвтозагрузчик Composer отвечает за загрузку клаÑÑов PHP. Ðвтозагрузчик должен быть Ñброшен поÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких проÑтранÑтв имен в корневой файл composer.json.","ui.maintenance.dumpAutoload.button":"Дамп автозапуÑка","ui.maintenance.composerInstall.title":"ЗавиÑимоÑти Composer","ui.maintenance.composerInstall.description":"ЗавиÑимоÑти Composer находÑÑ‚ÑÑ Ð² каталоге {vendor}, в корне приложениÑ. ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ ÑƒÑтановка завиÑимоÑтей может потребоватьÑÑ Ð¿Ð¾Ñле различных манипулÑций или ручной загрузки файла {composerLock}.","ui.maintenance.composerInstall.button":"ЗапуÑтить уÑтановщик","ui.maintenance.composerInstall.update":"ЗапуÑтить обновление Composer","ui.maintenance.composerCache.title":"Кеш Composer","ui.maintenance.composerCache.description":"Composer кеширует загруженные пакеты Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти. ЕÑли у Ð²Ð°Ñ ÐµÑть проблемы, например, иÑпорченные файлы, попробуйте очиÑтить кеш Composer, чтобы запуÑтить новую загрузку.","ui.maintenance.composerCache.button":"ОчиÑтить кеш","ui.maintenance.maintenanceMode.title":"Режим обÑлуживаниÑ","ui.maintenance.maintenanceMode.description":"Перевод Contao в режим обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚ шаблон \\"503 Service Unavailable\\" Ð´Ð»Ñ Ð²ÐµÐ±-Ñайта.","ui.maintenance.maintenanceMode.enable":"Включить","ui.maintenance.maintenanceMode.disable":"Выключить","ui.maintenance.debugMode.title":"Режим отладки","ui.maintenance.debugMode.description":"Ðктивируйте режим отладки, задав Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль Ð´Ð»Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ входа {appDevPhp}.","ui.maintenance.debugMode.descriptionJwt":"Ðктивируйте режим отладки, уÑтановив файл отладки cookie Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ домена.","ui.maintenance.debugMode.activate":"Ðктивировать","ui.maintenance.debugMode.deactivate":"Деактивировать","ui.maintenance.debugMode.credentials":"ПолномочиÑ","ui.maintenance.debugMode.user":"Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° отладки.","ui.maintenance.debugMode.password":"Введите пароль Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° отладки.","ui.maintenance.opcodeCache.title":"Кеш Opcode","ui.maintenance.opcodeCache.description":"Opcode кеширует PHP-файлы в веб-процеÑÑе Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ быÑтрого выполнениÑ. Он должен быть удален при определенных обÑтоÑтельÑтвах, еÑли файлы не раÑпознаютÑÑ Ð¿Ð¾Ñле изменениÑ.","ui.maintenance.opcodeCache.button":"УÑечение кеша","ui.maintenance.safeMode":"ÐедоÑтупно в безопаÑном режиме","ui.maintenance.unsupported":"Ðе поддерживаетÑÑ Ñтой верÑией Contao","ui.packages.updateButton":"Обновить пакеты","ui.packages.searchButton":"ПоиÑк пакетов","ui.packages.searchPlaceholder":"ПоиÑк пакетов...","ui.packages.uploadOverlay":"Перетащите файлы Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸","ui.packages.uploadButton":"Загрузить пакеты","ui.packages.uploadMessage":"У Ð²Ð°Ñ Ð¾Ð´Ð½Ð° Ð½ÐµÐ¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°. | У Ð²Ð°Ñ Ð½ÐµÐ¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð½Ñ‹Ñ… загрузок {count}.","ui.packages.uploadApply":"Подтвердить загрузки","ui.packages.uploadReset":"Удалить загрузки","ui.packages.uploadIncomplete":"Этот файл не был загружен полноÑтью. Удалите его и попробуйте еще раз.","ui.packages.uploadDuplicate":"Этот файл загружен неÑколько раз. Удалите дубликаты.","ui.packages.uploadInstalled":"Этот файл уже уÑтановлен. Удалите дубликаты.","ui.packages.uploadUnsupported":"Загрузка не поддерживаетÑÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ уÑтановкой. УбедитеÑÑŒ, что уÑтановлено раÑширение PHP ZIP и не забудьте обновить завиÑимоÑти.","ui.packages.changesMessage":"У Ð²Ð°Ñ Ð¾Ð´Ð½Ð¾ неподтвержденное изменение. | У Ð²Ð°Ñ Ð½ÐµÐ¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð½Ñ‹Ñ… изменений {count}.","ui.packages.changesDryrun":"Пробный прогон","ui.packages.changesApply":"Применить изменениÑ","ui.packages.changesApplyAll":"Обновить вÑе пакеты","ui.packages.changesDryrunAll":"Пробный прогон вÑех пакетов","ui.packages.changesReset":"Ð¡Ð±Ñ€Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹","ui.packages.changesReview":"Обзор изменений","ui.packagelist.loading":"Загрузка...","ui.packagelist.uploads":"Загрузки","ui.packagelist.added":"Ðовые пакеты","ui.packagelist.installed":"УÑтановленные пакеты","ui.package.hintRevert":"Отменить изменениÑ","ui.package.hintNoupdate":"Ðе обновлÑть","ui.package.hintConstraint":"Этот пакет будет уÑтановлен Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸ÐµÐ¼ {constraint} при применении изменений.","ui.package.hintConstraintBest":"Этот пакет будет уÑтановлен в наилучшей доÑтупной верÑии при применении изменений.","ui.package.hintConstraintChange":"Ограничение Ñтого пакета будет изменено Ñ \\"{from}\\" на \\"{to}\\" при применении изменений.","ui.package.hintConstraintUpdate":"Этот пакет будет обновлен при применении изменений.","ui.package.hintAdded":"Этот пакет будет уÑтановлен при применении изменений.","ui.package.hintRemoved":"Этот пакет будет удален при применении изменений.","ui.package.requiredTitle":"добавлено вручную","ui.package.requiredText":"Этот пакет необходим в composer.json, но он не уÑтановлен.","ui.package.removedTitle":"удалено вручную","ui.package.removedText":"Этот пакет удален из вашего composer.json.","ui.package.installed":"УÑтановлена:","ui.package.version":"ВерÑÐ¸Ñ {version}","ui.package.additionalDownloads":"Загрузок {count} | Загрузок {count}","ui.package.additionalStars":"Звёзд {count} | Звёзд {count}","ui.package.editConstraint":"Редактировать","ui.package.uploadConstraint":"Это ограничение определÑетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼ пакетом.","ui.package.updateButton":"Обновить","ui.package.removeButton":"Удалить","ui.package.installButton":"Добавить пакет","ui.package.installButtonShort":"Добавить","ui.package.detailsButton":"СведениÑ","ui.package.latestConstraint":"поÑледнÑÑ Ð²ÐµÑ€ÑиÑ","ui.package.update":"ДоÑтупно обновление","ui.package.updateLatest":"поÑледнÑÑ Ð²ÐµÑ€ÑиÑ","ui.package.updateAvailable":"{version} доÑтупна","ui.package.updateUnknown":"неизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ","ui.package.updateConstraint":"ДоÑтупна более Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ, выходÑÑ‰Ð°Ñ Ð·Ð° рамки вашего Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñии.","ui.package.incompatible":"{package} не работает Ñ Contao {constraint}.","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"ВерÑÐ¸Ñ {version}","ui.cloudStatus.waitingTime":"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ","ui.cloudStatus.jobs":"Текущие заданиÑ","ui.cloudStatus.workers":"Рабочие","ui.cloudStatus.approx":"{minutes} мин","ui.cloudStatus.none":"ни один","ui.cloudStatus.short":"прим. {minutes} мин","ui.cloudStatus.long":"прим. {minutes} мин {seconds} Ñек","ui.cloudStatus.error":"Ðе удалоÑÑŒ получить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ð»Ð°ÐºÐ° Resolver Composer. ВероÑтно, он не работает из-за проблем Ñ Ð¾Ð±Ñлуживанием или неполадок.","ui.cloudStatus.button":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ð»Ð°ÐºÐ°","ui.cloudStatus.refresh":"Обновить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ð»Ð°ÐºÐ°","ui.log-viewer.loading":"Загрузка...","ui.log-viewer.empty":"Ðа вашем Ñервере нет файлов журнала.","ui.log-viewer.reload":"Перезагрузить","ui.log-viewer.file":"Файл журнала","ui.log-viewer.channel":"Канал","ui.log-viewer.channelTitle":"Канал, на который было зарегиÑтрировано Ñто Ñообщение.","ui.log-viewer.level":"Уровень","ui.log-viewer.levelTitle":"Уровень журнала или ÑерьезноÑть ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð°.","ui.log-viewer.timeHeader":"ВремÑ","ui.log-viewer.messageHeader":"Сообщение","ui.log-viewer.showContext":"Показать контекÑÑ‚","ui.log-viewer.hideContext":"Скрыть контекÑÑ‚","ui.log-viewer.showExtra":"Показать дополнительное","ui.log-viewer.hideExtra":"Скрыть дополнительное","ui.log-viewer.more":"Загрузить больше...","ui.log-viewer.download":"Загрузка","ui.log-viewer.downloadTitle":"Загрузка файла \\"{file}\\"","ui.log-viewer.prodEnvironment":"Ð Ð°Ð±Ð¾Ñ‡Ð°Ñ Ñреда","ui.log-viewer.devEnvironment":"Среда разработки (режим отладки)","ui.user-manager.loading":"Загрузка пользователей…","ui.user-manager.changePassword":"Изменить пароль","ui.user-manager.setupTotp":"ÐаÑтройка двухфакторной авторизации","ui.user-manager.disableTotp":"Отключить двухфакторную авторизацию","ui.user-manager.invite":"ПриглаÑить пользователÑ","ui.user-manager.delete":"Удалить","ui.user-manager.deleteConfirm":"Ð’Ñ‹ дейÑтвительно хотите удалить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \\"{username}\\"?","ui.user-manager.deleted":"Пользователь {username} уÑпешно удален","ui.user-manager.passwordHeadline":"Изменить пароль","ui.user-manager.passwordText":"Чтобы изменить пароль, введите текущий и новый пароль в ÑоответÑтвующие полÑ.","ui.user-manager.currentPassword":"Текущий пароль","ui.user-manager.newPassword":"Ðовый пароль","ui.user-manager.passwordPlaceholder":"мин. 8 Ñимволов","ui.user-manager.submitPassword":"Отправить","ui.user-manager.passwordChanged":"Ваш пароль был уÑпешно изменён.","ui.user-manager.passwordError":"Этот пароль неверный.","ui.user-manager.inviteHeadline":"ПриглаÑить пользователÑ","ui.user-manager.inviteText":"ЕÑли вам нужно неÑколько учётных запиÑей Ð´Ð»Ñ Contao Manager, вы можете Ñоздать здеÑÑŒ ÑÑылку-приглашение. ПоделитеÑÑŒ Ñтой ÑÑылкой или иÑпользуйте её на другом уÑтройÑтве, чтобы Ñоздать новую учётную запиÑÑŒ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ правами доÑтупа.","ui.user-manager.inviteSuccess1":"Создана Ð½Ð¾Ð²Ð°Ñ ÑÑылка-приглашение. URL-Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ можно иÑпользовать Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ учетной запиÑи Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Contao Manager. Приглашение иÑтекает {expires} (через неделю).","ui.user-manager.inviteSuccess2":"Скопируйте ÑÑылку в буфер обмена. Эта ÑÑылка Ñработает только один раз, и вы больше не Ñможете её увидеть поÑле Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñтого диалогового окна.","ui.user-manager.createInvitation":"Создать ÑÑылку-приглашение","ui.user-manager.clipboard":"Копировать в буфер обмена","ui.user-manager.permissions":"Узнать о разрешениÑÑ…","ui.user-manager.cancel":"Отмена","ui.user-manager.close":"Закрыть","ui.user-manager.you":"Ð’Ñ‹","ui.user-manager.2fa":"2FA","ui.user-manager.2faEnabled":"Эта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ защищена двухфакторной авторизацией.","ui.user-manager.2faDisabled":"Эта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ небезопаÑна из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ð¹ авторизации.","ui.user-manager.passkey":"Passkey","ui.user-manager.passkeyTitle":"Эта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ защищена Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Passkey.","ui.totp.headline":"Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ","ui.totp.setupQr":"ПожалуйÑта, отÑканируйте QR-код Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вашего Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ 2FA/TOTP.","ui.totp.setupCode":"ЕÑли вы не можете отÑканировать QR-код, введите Ñтот ключ вмеÑто него:","ui.totp.codeLabel":"Проверочный код","ui.totp.codeDescription":"ПожалуйÑта, введите проверочный код, Ñгенерированный Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ вашего Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ 2FA/TOTP.","ui.totp.disableText":"ПожалуйÑта, введите проверочный код Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ð¹ авторизации.","ui.totp.invalid":"Проверочный код неверный.","ui.totp.enable":"Включить","ui.totp.disable":"Выключить","ui.totp.cancel":"Отмена","ui.totp.enabled":"Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ ÑƒÑпешно включена.","ui.totp.disabled":"Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ ÑƒÑпешно отключена.","ui.totp.setup":"ÐаÑтройка двухфакторной авторизации","ui.totp.skip":"ПропуÑтить двухфакторную авторизацию"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[909],{3909:function(e,i,o){o.r(i),o.d(i,{default:function(){return C}});var t=o(641),s=o(3751),l=o(33),n=o(6894);const a={key:0,class:"view-login__locked"},r={key:0,class:"view-login__form"},g={class:"view-login__headline"},d={class:"view-login__description"},u={class:"view-login__or"},p=["href"],c={key:1,class:"view-login__form"},_={class:"view-login__headline"},h={class:"view-login__description"};function m(e,i,o,m,k,w){const b=(0,t.g2)("i18n-t"),f=(0,t.g2)("text-field"),v=(0,t.g2)("loading-button"),y=(0,t.g2)("boxed-layout");return(0,t.uX)(),(0,t.Wv)(y,{slotClass:"view-login"},{default:(0,t.k6)((()=>[i[7]||(i[7]=(0,t.Lk)("header",{class:"view-login__header"},[(0,t.Lk)("img",{src:n,width:"80",height:"80",alt:"Contao Logo"}),(0,t.Lk)("p",{class:"view-login__product"},"Contao Manager")],-1)),e.locked?((0,t.uX)(),(0,t.CE)("main",a,[(0,t.bF)(b,{tag:"p",keypath:"ui.login.locked"},{lockFile:(0,t.k6)((()=>i[6]||(i[6]=[(0,t.Lk)("strong",null,"contao-manager/login.lock",-1),(0,t.Lk)("br",null,null,-1)]))),_:1})])):((0,t.uX)(),(0,t.Wv)(s.eB,{key:1,name:"animate-flip",type:"transition",mode:"out-in"},{default:(0,t.k6)((()=>[e.requires_totp?((0,t.uX)(),(0,t.CE)("main",c,[(0,t.Lk)("form",{onSubmit:i[5]||(i[5]=(0,s.D$)(((...e)=>w.login&&w.login(...e)),["prevent"]))},[(0,t.Lk)("h1",_,(0,l.v_)(e.$t("ui.login.totpHeadline")),1),(0,t.Lk)("p",h,(0,l.v_)(e.$t("ui.login.totpDescription")),1),(0,t.bF)(f,{name:"totp",required:"",minlength:"6",maxlength:"6",autocomplete:"one-time-code",label:e.$t("ui.login.totp"),placeholder:e.$t("ui.login.totp"),class:(0,l.C4)(["view-login__totp",e.login_failed?"widget--error":""]),disabled:e.logging_in,modelValue:e.totp,"onUpdate:modelValue":i[3]||(i[3]=i=>e.totp=i),onInput:w.reset},null,8,["label","placeholder","class","disabled","modelValue","onInput"]),(0,t.bF)(v,{submit:"",class:"view-login__button",color:"primary",disabled:!w.totpValid||e.login_failed,loading:e.logging_in},{default:(0,t.k6)((()=>[(0,t.eW)((0,l.v_)(e.$t("ui.login.button")),1)])),_:1},8,["disabled","loading"]),(0,t.Lk)("button",{class:"widget-button view-login__button",onClick:i[4]||(i[4]=(...e)=>w.cancelTotp&&w.cancelTotp(...e))},(0,l.v_)(e.$t("ui.login.cancel")),1)],32)])):((0,t.uX)(),(0,t.CE)("main",r,[(0,t.Lk)("form",{onSubmit:i[2]||(i[2]=(0,s.D$)(((...e)=>w.login&&w.login(...e)),["prevent"]))},[(0,t.Lk)("h1",g,(0,l.v_)(e.$t("ui.login.headline")),1),(0,t.Lk)("p",d,(0,l.v_)(e.$t("ui.login.description")),1),(0,t.bF)(f,{ref:"username",name:"username",autocomplete:"username webauthn",label:e.$t("ui.login.username"),placeholder:e.$t("ui.login.username"),class:(0,l.C4)(["view-login__user",e.login_failed?"widget--error":""]),disabled:e.logging_in||e.passkey_login,modelValue:e.username,"onUpdate:modelValue":i[0]||(i[0]=i=>e.username=i),onInput:w.reset},null,8,["label","placeholder","class","disabled","modelValue","onInput"]),(0,t.bF)(f,{type:"password",name:"password",autocomplete:"current-password",label:e.$t("ui.login.password"),placeholder:e.$t("ui.login.password"),minlength:"8",class:(0,l.C4)(["view-login__password",e.login_failed?"widget--error":""]),disabled:e.logging_in||e.passkey_login,modelValue:e.password,"onUpdate:modelValue":i[1]||(i[1]=i=>e.password=i),onInput:w.reset},null,8,["label","placeholder","class","disabled","modelValue","onInput"]),(0,t.bF)(v,{submit:"",class:"view-login__button",color:"primary",disabled:!w.inputValid||e.login_failed||e.passkey_login,loading:e.logging_in&&!e.passkey_login},{default:(0,t.k6)((()=>[(0,t.eW)((0,l.v_)(e.$t("ui.login.button")),1)])),_:1},8,["disabled","loading"]),(0,t.Lk)("p",u,(0,l.v_)(e.$t("ui.login.or")),1),e.showPasskey?((0,t.uX)(),(0,t.Wv)(v,{key:0,class:"view-login__button",icon:"passkey",color:"primary",loading:e.passkey_login,disabled:e.logging_in,onClick:(0,s.D$)(w.passkeyLogin,["prevent"])},{default:(0,t.k6)((()=>[(0,t.eW)((0,l.v_)(e.$t("ui.login.passkey")),1)])),_:1},8,["loading","disabled","onClick"])):(0,t.Q3)("",!0),(0,t.Lk)("a",{href:`https://to.contao.org/docs/manager-password?lang=${e.$i18n.locale}`,target:"_blank",class:"view-login__link"},(0,l.v_)(e.$t("ui.login.forgotPassword")),9,p)],32)]))])),_:1}))])),_:1,__:[7]})}var k=o(6278),w=o(60),b=o(707),f=o(728),v=o(9757),y=o(85),$={components:{BoxedLayout:f.A,TextField:v.A,LoadingButton:y.A},data:()=>({username:"",password:"",totp:"",logging_in:!1,passkey_login:!1,requires_totp:!1,login_failed:!1,showPasskey:!1}),computed:{...(0,k.aH)(["locked"]),inputValid(){return""!==this.username&&""!==this.password&&this.password.length>=8},totpValid(){return""!==this.totp&&/^\d{6}$/.test(this.totp)}},methods:{async login(){this.inputValid&&this.doLogin({username:this.username,password:this.password,totp:this.totp})},async passkeyLogin({useBrowserAutofill:e}){this.passkey_login=!e;const i=(await this.$request.get("api/session/options")).data;try{const o=await(0,w.HS)({optionsJSON:i,useBrowserAutofill:!!e});await this.doLogin({passkey:JSON.stringify(o)})}catch(o){}this.passkey_login=!1},async doLogin(e){this.logging_in=!0;const i=await this.$store.dispatch("auth/login",e);201===i.status?this.$store.commit("setView",b.A.BOOT):401===i.status&&i.data.totp_enabled?(this.logging_in=!1,this.requires_totp=!0,this.login_failed=!!this.totp):(this.logging_in=!1,this.login_failed=!0)},reset(){this.login_failed=!1},cancelTotp(){this.username="",this.password="",this.totp="",this.logging_in=!1,this.requires_totp=!1,this.login_failed=!1}},async mounted(){if(this.$store.commit("setError",null),this.locked)return;if(this.$refs.username&&this.$refs.username.focus(),"https:"!==location.protocol)return void(this.showPasskey=!1);const e=(0,w.zZ)(),i=await(0,w.ZF)();this.showPasskey=e,e&&i&&this.passkeyLogin({useBrowserAutofill:!0})}},L=o(6262);const V=(0,L.A)($,[["render",m]]);var C=V}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[219],{3219:function(e){e.exports=JSON.parse('{"ui.app.title":"Contao Extensions","ui.app.loading":"Loading Extension List …","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Advertisement in the extension list","ui.discover.loading":"Loading …","ui.discover.offline":"Could not fetch any results.","ui.discover.offlineExplain":"Check your internet connection and disable JavaScript blockers in your browser.","ui.discover.offlineButton":"Try again","ui.discover.searchPlaceholder":"Search in {count} extensions …","ui.discover.empty":"No results for {query}","ui.discover.more":"More Results","ui.discover.sortBy":"Sort by","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"Updated","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"Downloads","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"Rating","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"Details","ui.discover.latestPackages":"Latest and updated extensions","ui.discover.faversPackages":"Top rated extensions","ui.discover.downloadsPackages":"Most downloaded extensions","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Project Website","ui.package.private":"Private Package","ui.package.privateTitle":"Private packages are only available from the vendor (e.g. as a ZIP download). Please visit the website for more information.","ui.package.abandoned":"abandoned","ui.package.abandonedText":"This package is abandoned and no longer maintained.","ui.package.abandonedReplace":"This package is abandoned and no longer maintained. The author suggests using the {replacement} package instead.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"Previous Extension Details","ui.package-details.close":"Close Extension Details","ui.package-details.loading":"Loading …","ui.package-details.tabDescription":"Description","ui.package-details.tabRequire":"Requirements","ui.package-details.tabFeatures":"Features","ui.package-details.tabSuggest":"Suggestions","ui.package-details.tabConflict":"Conflicts","ui.package-details.tabDependents":"Dependents","ui.package-details.linkRequires":"requires","ui.package-details.linkReplaces":"replaces","ui.package-details.linkProvides":"provides","ui.package-details.linkConflicts":"conflicts","ui.package-details.funding":"Fund package maintenance!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"Latest version","ui.package-details.released":"released on","ui.package-details.license":"License(s)","ui.package-details.authors":"from","ui.package-details.more":"More","ui.package-details.packagist":"Package Details","ui.package-details.metadata":"Edit Metadata","ui.package-details.support_docs":"Documentation","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Support Forum","ui.package-details.support_issues":"Issues / Bug Report","ui.package-details.support_source":"Source Code","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Support E-Mail","ui.package-details.support_rss":"RSS Feed"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[958],{2958:function(e){e.exports=JSON.parse('{"ui.app.httpsHeadline":"!! Kevreadur diasur !!","ui.app.httpsDescription":"Hep HTTPS ho roadennoù kuzhut a vo treuzkaset dirinegañ.","ui.app.httpsLink":"Muioc\'h a ditouroù","ui.app.httpsHref":"https://https.cio.gov/everything/","ui.app.loading":"O kargañ Contao Manager ...","ui.app.apiError":"Statud API dic\'hortoz","ui.app.configSecurity1":"SECURITY ALERT !!! Unprotected config directory detected","ui.app.configSecurity2":"The Contao Manager has detected that its config files are publicly accessible. All operations are disabled until the directory is secured, otherwise an attacker could access sensitive data of your installation.\\n\\nTo fix this issue, make sure to prevent access to the \\"contao-manager\\" directory on your server. To learn how to do this, please refer to the manual of your webserver or contact your hosting provider.","ui.account.welcome":"Degemer mat","ui.account.intro1":"Welcome to the Contao Manager, a universal tool to install and manage Contao Open Source CMS. If you are new to it, please {readTheManualToGetStarted}.","ui.account.introGetStarted":"{readTheManual} to get started","ui.account.introManual":"read the manual","ui.account.intro2":"If you encounter any problems, check {ourGithubIssues} and feel free to create new one for anything that has not been reported yet.","ui.account.introIssues":"our GitHub issues","ui.account.headline":"Kont implijer","ui.account.description":"Da verañ ho staliadur, krouit ur gont mar plij evit Contao Manager. Deoc\'h da c\'houzout n\'eo ket liammet d\'ar c\'hontoù Contao back end pe front end.","ui.account.username":"Anv-implijer","ui.account.password":"Ger-tremen","ui.account.passwordConfirm":"Adskrivit ar ger-tremen","ui.account.passwordPlaceholder":"min. 8 arouezenn","ui.account.passwortLength":"Ebarzhit da vihanañ 8 arouezenn.","ui.account.passwortDifferent":"Ar ger-tremen na glot ket gant ar c\'hadarnadur.","ui.account.submit":"Krouiñ ur gont","ui.account.contribute1":"Contao and the Contao Manager are sponsored by the non-profit Contao Association.","ui.account.contribute2":"Please consider contributing to open source by {donate}.","ui.account.contributeDonate":"making a donation","ui.login.headline":"Kevreañ","ui.login.description":"Kevreit evit merañ ho staliadur.","ui.login.username":"Anv-implijer","ui.login.password":"Ger-tremen","ui.login.forgotPassword":"Ankouaet ho ker-tremen?","ui.login.button":"Kevreañ","ui.login.locked":"Access has been denied because the Contao Manager is locked. To unlock, delete the {lockFile} file in your Contao root directory.","ui.logout.headline":"Session Timeout","ui.logout.warning":"Your have been inactive for more than 25 minutes. For security reasons your session will be terminated shortly.","ui.logout.expired":"Your session was automatically terminated because you have been inactive for more than 30 minutes.","ui.logout.renew":"Keep Logged In","ui.logout.logout":"Digevreañ","ui.logout.login":"Back To Login","ui.oauth.error":"Invalid OAuth attempt. Check the request parameters.","ui.oauth.https":"The redirect URI MUST use a secure protocol (https:) to prevent the authentication token from being transmitted in clear-text.","ui.oauth.headline":"Remote Authentication","ui.oauth.description":"The following application or service is requesting remote access to your Contao Manager instance.","ui.oauth.domain":"Before allowing access, make sure you know this URL and trust its owner!","ui.oauth.allow":"Allow Access","ui.oauth.deny":"Deny Access","ui.boot.headline":"Gwiriadur ar reizhad","ui.boot.description":"Please wait, we are analyzing your server …","ui.boot.issue1":"Kudennoù diguzhet en ur staliañ","ui.boot.issue2":"Your installation has issues that have to be fixed before the Contao Manager can be used.","ui.boot.run":"Loc\'hañ Contao Manager","ui.recovery.headline":"System Recovery","ui.recovery.description":"The Contao Manager detected files that look like Contao, but the Command Line Interface does not work as expected.","ui.recovery.console":"Console Output","ui.recovery.repairOptions":"Please choose an option to repair your installation.","ui.recovery.repairHeadline":"Automatic Repair","ui.recovery.repairDescription":"Attempts to automatically repair the installation by rebuilding the application cache and re-installing the Composer packages.","ui.recovery.repairWarning":"Any modifications to the vendor files might be deleted in the process!","ui.recovery.repairFailed":"Automatic repair was not successful. Try the Safe Mode to manually repair the installation.","ui.recovery.repairButton":"Run System Repair","ui.recovery.safeModeHeadline":"Safe Mode","ui.recovery.safeModeDescription":"Launching the Contao Manager in Safe Mode allows to manage packages and run certain maintenance tasks, but features that rely on a working Contao installation will not be available.","ui.recovery.safeModeButton":"Launch in Safe Mode","ui.server.pending":"Waiting …","ui.server.running":"Oc\'h analizañ ...","ui.server.error":"Check failed due to an unexpected response from the server.","ui.server.details":"Munudoù","ui.server.prerequisite":"Check cancelled due to a missing prerequisite.","ui.server.selfUpdate.title":"Hizivadurioù Contao Manager","ui.server.selfUpdate.update":"Ur stumm nevez eus Contao Managaer a zo hegerz: {latest}.","ui.server.selfUpdate.manualUpdate":"A new Contao Manager version {latest} is available. Your server does not support automatic updates, please download the new version from {download}.","ui.server.selfUpdate.latest":"You are using the latest version {current}.","ui.server.selfUpdate.dev":"Development builds do not support automatic updates.","ui.server.selfUpdate.unsupported":"A new version is available but it does not support your PHP version.","ui.server.selfUpdate.button":"Seveniñ an em-hizivaat","ui.server.selfUpdate.continue":"Continue","ui.server.config.title":"Kefluniadur ar servijer","ui.server.config.setup":"Kefluniañ","ui.server.config.change":"Cheñch","ui.server.config.save":"Enrollañ","ui.server.config.blankOption":"Diuzit mar plij ...","ui.server.config.customOption":"Traoù all ...","ui.server.config.description":"To correctly run background tasks, the Contao Manager needs to know where to find the PHP command line binary and how to run commands separated from the web process.","ui.server.config.formTitle":"Kefluniadur ar servijer","ui.server.config.formText":"Please enter the path to your PHP binary. Make sure the binary is the same PHP version as your web process.","ui.server.config.cloudTitle":"Composer Resolver Cloud","ui.server.config.cloudText":"The Composer Resolver Cloud allows to install Composer dependencies even if your server does not provide enough local memory. Please be aware that your package information will be transmitted to a cloud server operated by the Contao Association.","ui.server.config.cloud":"Use the Composer Resolver Cloud","ui.server.config.cli":"PHP daouel","ui.server.config.stateErrorCli":"No valid PHP binary was found on the server.","ui.server.config.stateErrorCloud":"The Composer Resolver Cloud is not supported.","ui.server.config.stateSuccess":"PHP binary at {php_cli}.","ui.server.php_web.title":"PHP Web Process","ui.server.php_web.below7":"Found PHP version {version}. Please switch to PHP 7 as soon as possible!","ui.server.php_web.success":"Found PHP version {version}, no known issues found.","ui.server.php_cli.title":"PHP Command Line Interface","ui.server.php_cli.success":"Found PHP version {version}, no known issues found.","ui.server.composer.title":"Endro kompozer","ui.server.composer.success":"N\'eus bet kavet kudenn ebet.","ui.server.composer.install":"Composer dependencies are not installed.","ui.server.composer.button":"Run Composer","ui.server.composer.safeMode":"Run Safe Mode","ui.server.contao.title":"Staliadur Contao","ui.server.contao.setup":"Setup","ui.server.contao.empty":"Staliadur Contao ebet bet kavet","ui.server.contao.old":"Contao version {version} is not compatible with the Contao Manager, please update your installation manually.","ui.server.contao.found":"Kavet Contao {version} (API stumm {api}).","ui.server.contao.headline":"Kefluniadur Contao","ui.server.contao.description":"Welcome to the setup process of your Contao Open Source CMS. You can choose between two versions to install.","ui.server.contao.publicDir":"Use {dir} for public files (for Contao {version})","ui.server.contao.ltsTitle":"Skor war hir amzer","ui.server.contao.ltsText":"The LTS version has an extended support period of up to four years.","ui.server.contao.latestTitle":"Diwezhatañ","ui.server.contao.latestText":"A new latest version is released every six months in February and August.","ui.server.contao.noLatest":"Requires at least PHP {version}.","ui.server.contao.releaseplan":"See the {contaoReleasePlan} for detailed information.","ui.server.contao.releaseplanLink":"Contao Release Plan","ui.server.contao.formTitle":"Staliadur Contao","ui.server.contao.formText":"Select the Contao version to install.","ui.server.contao.version":"Stumm","ui.server.contao.coreOnly":"Initial Setup","ui.server.contao.coreOnlyNo":"Full Installation (News, Calendar, etc.)","ui.server.contao.coreOnlyYes":"Minimal Installation (Core only)","ui.server.contao.coreOnlyFeatures":"What\'s the difference?","ui.server.contao.noUpdate":"Skip Installation (Expert Only!)","ui.server.contao.install":"Finish","ui.server.docroot.headline":"Webserver Setup","ui.server.docroot.warning":"To install Contao through the Contao Manager, you have to fix the document root on the web server.","ui.server.docroot.description1":"Contao uses a separate folder for public files, application files are installed in its parent folder. Contao cannot be installed right now, because your folder structure is not correct or the folders are not empty.","ui.server.docroot.description2":"If you don\'t know how to configure your document root, please read the Contao documentation or contact your hosting provider.","ui.server.docroot.documentation":"Read the Documentation","ui.server.docroot.conflictsTitle":"Installation directory not empty","ui.server.docroot.conflictsDirectory":"The root directory of your future Contao installation is not empty, we have found {count} file(s) that might be overwritten by the installation process. It is recommended to create an empty directory structure for Contao, but you can also remove the following files and reload the page if you are sure they are unused.","ui.server.docroot.ignoreConflicts":"I want to install Contao into the non-empty directory. I understand that this might overwrite any existing files on my webspace.","ui.server.docroot.create":"Create directories","ui.server.docroot.formTitle":"Directory Setup","ui.server.docroot.formText1":"The Contao Manager can automatically create a new directory structure on the server.","ui.server.docroot.formText2":"You will need to manually configure the new document root (e.g. through a hosting admin panel).","ui.server.docroot.autoconfig":"I understand that I have to change my server configuration. Not configuring the document root will break the Contao Manager and expose configuration files (including account details and passwords)!","ui.server.docroot.directory":"New Directory","ui.server.docroot.currentRoot":"Current Document Root","ui.server.docroot.newRoot":"New Document Root","ui.server.docroot.finish":"Setup Directories","ui.server.docroot.directoryInvalid":"Please enter a valid directory name.","ui.server.docroot.directoryExists":"The target directory already exists. Please enter a different name.","ui.server.docroot.confirmation":"The Contao Manager has successfully created the necessary directory for your Contao installation. You now have to configure the document root on your web server. Do not reload this page until then.","ui.server.docroot.reload":"Reload Page","ui.task.headline":"Background Task","ui.task.loading":"Loading details …","ui.task.created":"Loading details …","ui.task.active":"Please wait while the Contao Manager is running task operations in the background.","ui.task.complete":"All operations are completed successfully. Check the console output for details.","ui.task.aborting":"Please wait while the background operations are being cancelled.","ui.task.stopped":"Some background operations were cancelled. Please check the console output.","ui.task.error":"A background operation stopped unexpectedly. Please check the console output.","ui.task.failed":"The Contao Manager failed to start a background task!","ui.task.failedDescription1":"Something went wrong while trying to execute operations in the background.","ui.task.failedDescription2":"If this happens again, your server might not be supported.","ui.task.reportProblem":"Danevelliñ ur gudenn","ui.task.buttonAudit":"Update Database","ui.task.buttonClose":"Serriñ","ui.task.buttonConfirm":"Kadarnaat & ha serriñ","ui.task.buttonCancel":"Nullañ","ui.task.confirmCancel":"Are you sure to cancel this task? This might leave your Contao installation in a broken state!","ui.task.autoclose":"Close task details on success","ui.console.toggle":"Show/Hide Console Output","ui.console.showLog":"Show full console log","ui.console.copyLog":"Copy log to clipboard","ui.widget.mandatory":"Ar vaezienn-mañ n\'hall ket bezañ goullo.","ui.error.title":"HTTP request for \\"{method} {url}\\" failed.","ui.error.server500":"Looks like an unexpected error happened on your server. Please check the log files of your web server (Apache/Nginx) and the Contao Manager logs at \\"contao-manager/logs\\".","ui.error.response":"The server returned a response with status code {status}.","ui.error.moreLink":"Muioc\'h a ditouroù","ui.error.support":"Contao Support","ui.footer.help":"Skoazell","ui.footer.reportProblem":"Danevelliñ ur gudenn","ui.navigation.discover":"Discover","ui.navigation.packages":"Pakadoù","ui.navigation.tools":"Ostilhoù","ui.navigation.installTool":"Staliañ an ostilh","ui.navigation.backend":"Contao Backend","ui.navigation.debug":"Contao Debug Mode","ui.navigation.phpinfo":"PHP Information","ui.navigation.maintenance":"Trezalc\'h","ui.navigation.rebuildCache":"Adsevel ar c\'hrubuilh","ui.navigation.systemCheck":"Gwiriadur ar reizhad","ui.navigation.advanced":"Araokaet","ui.navigation.logout":"Digevreañ","ui.maintenance.rebuildCache.title":"Application Cache","ui.maintenance.rebuildCache.description":"Rebuilding the application cache is required after modifying any of the configuration files.","ui.maintenance.rebuildCache.rebuildProd":"Rebuild Production Cache","ui.maintenance.rebuildCache.rebuildDev":"Rebuild Development Cache","ui.maintenance.rebuildCache.clearProd":"Clear Production Cache","ui.maintenance.rebuildCache.clearDev":"Clear Development Cache","ui.maintenance.installTool.title":"Contao Install Tool","ui.maintenance.installTool.description":"The Contao Install Tool is automatically locked if you enter a wrong password three times in a row.","ui.maintenance.installTool.unlock":"Unlock Install Tool","ui.maintenance.installTool.lock":"Lock Install Tool","ui.maintenance.dumpAutoload.title":"Composer Class Loader","ui.maintenance.dumpAutoload.description":"The Composer autoloader is responsible for PHP class loading. The autoloader must be dumped after adding custom namespaces to the root composer.json.","ui.maintenance.dumpAutoload.button":"Dump Autoloader","ui.maintenance.composerInstall.title":"Composer Dependencies","ui.maintenance.composerInstall.description":"Composer dependencies are located in the {vendor} folder in your application root. Reinstalling the dependencies can be necessary after manipulation or manually uploading the {composerLock} file.","ui.maintenance.composerInstall.button":"Run Installer","ui.maintenance.composerInstall.update":"Run Composer Update","ui.maintenance.composerCache.title":"Composer Cache","ui.maintenance.composerCache.description":"Composer caches downloaded packages for improved performance. If you have issues like broken files, try to delete the Composer cache to force a new download.","ui.maintenance.composerCache.button":"Clear Cache","ui.maintenance.maintenanceMode.title":"Maintenance Mode","ui.maintenance.maintenanceMode.description":"Putting Contao in maintenance mode will display a \\"503 Service Unavailable\\" template for the website.","ui.maintenance.maintenanceMode.enable":"Enable","ui.maintenance.maintenanceMode.disable":"Disable","ui.maintenance.debugMode.title":"Debug Mode","ui.maintenance.debugMode.description":"Activate the debug mode by setting a user and password for the {appDevPhp} entry point.","ui.maintenance.debugMode.descriptionJwt":"Activate the debug mode by setting the debug cookie for the current domain.","ui.maintenance.debugMode.activate":"Activate","ui.maintenance.debugMode.deactivate":"Deactivate","ui.maintenance.debugMode.credentials":"Credentials","ui.maintenance.debugMode.user":"Please enter a username for the debug mode.","ui.maintenance.debugMode.password":"Please enter a password for the debug mode.","ui.maintenance.opcodeCache.title":"Opcode Cache","ui.maintenance.opcodeCache.description":"Opcode caches PHP files on the web process for faster execution. It must be deleted under certain circumstances if files are not recognized after changing.","ui.maintenance.opcodeCache.button":"Truncate Cache","ui.maintenance.safeMode":"Not available in Safe Mode","ui.maintenance.unsupported":"Not supported by your Contao version","ui.packages.updateButton":"Hizivaat ar pakadoù","ui.packages.searchButton":"Search Packages","ui.packages.searchPlaceholder":"Klask war-lerc\'h pakadoù ...","ui.packages.uploadOverlay":"Drag & drop files to upload","ui.packages.uploadButton":"Upload Packages","ui.packages.uploadMessage":"You have one unconfirmed upload. | You have {count} unconfirmed uploads.","ui.packages.uploadApply":"Confirm Uploads","ui.packages.uploadReset":"Delete Uploads","ui.packages.uploadIncomplete":"This file was not uploaded completely. Please remove it and try again.","ui.packages.uploadDuplicate":"This file seems to be uploaded multiple times. Please remove the duplicates.","ui.packages.uploadInstalled":"This file is already installed. Please remove the duplicates.","ui.packages.uploadUnsupported":"Uploads are not supported in your installation. Please make sure to update your dependencies.","ui.packages.changesMessage":"You have one unconfirmed change. | You have {count} unconfirmed changes.","ui.packages.changesDryrun":"Dry Run","ui.packages.changesApply":"Arloañ ar c\'hemmoù","ui.packages.changesApplyAll":"Update all packages","ui.packages.changesDryrunAll":"Dry run all packages","ui.packages.changesReset":"Adderaouekaat ar cheñchamantoù","ui.packages.changesReview":"Review Changes","ui.packagelist.loading":"O kargañ ...","ui.packagelist.uploads":"Uploads","ui.packagelist.added":"New packages","ui.packagelist.installed":"Installed packages","ui.package.hintRevert":"Adlakaat ar cheñchamantoù","ui.package.hintNoupdate":"Do not update","ui.package.hintConstraint":"This package will be installed with constraint {constraint} when you apply the changes.","ui.package.hintConstraintBest":"This package will be installed in the best available version when you apply the changes.","ui.package.hintConstraintChange":"The constraint for this package will be changed from \\"{from}\\" to \\"{to}\\" when you apply the changes.","ui.package.hintConstraintUpdate":"This package will be updated when you apply the changes.","ui.package.hintAdded":"This package will be installed when you apply the changes.","ui.package.hintRemoved":"This package will be removed when you apply the changes.","ui.package.requiredTitle":"manually added","ui.package.requiredText":"This package is required in your composer.json but not installed.","ui.package.removedTitle":"manually removed","ui.package.removedText":"This package was removed from your composer.json.","ui.package.installed":"Currently installed:","ui.package.version":"Stumm {version}","ui.package.additionalDownloads":"{count} Download | {count} Downloads","ui.package.additionalStars":"{count} Star | {count} Stars","ui.package.editConstraint":"Kemm","ui.package.uploadConstraint":"This constraint is defined by the uploaded package.","ui.package.updateButton":"Update","ui.package.removeButton":"Dilemel","ui.package.installButton":"Add Package","ui.package.installButtonShort":"Add","ui.package.detailsButton":"Munudoù","ui.package.latestConstraint":"stumm diwezhañ","ui.package.update":"Update available","ui.package.updateLatest":"stumm diwezhañ","ui.package.updateAvailable":"{version} available","ui.package.updateUnknown":"unknown version","ui.cloudStatus.headline":"Composer Resolver Cloud","ui.cloudStatus.version":"Stumm {version}","ui.cloudStatus.waitingTime":"Waiting Time","ui.cloudStatus.jobs":"Current Jobs","ui.cloudStatus.workers":"Workers","ui.cloudStatus.approx":"{minutes} min","ui.cloudStatus.none":"none","ui.cloudStatus.short":"ca. {minutes} min","ui.cloudStatus.long":"ca. {minutes} min {seconds} sec","ui.cloudStatus.error":"Unable to fetch the status of the Composer Resolver Cloud. It might be down for maintenance or experience issues.","ui.cloudStatus.button":"Cloud Status","ui.cloudStatus.refresh":"Refresh Cloud Status"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[669],{9669:function(e){e.exports=JSON.parse('{"ui.app.title":"Ø§ÙØ²ÙˆÙ†Ù‡â€ŒÙ‡Ø§ÛŒ کنتائو","ui.app.loading":"بارگذاری لیست Ø§ÙØ²ÙˆÙ†Ù‡...","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Advertisement in the extension list","ui.discover.loading":"بارگذاری ...","ui.discover.offline":"Could not fetch any results.","ui.discover.offlineExplain":"Check your internet connection and disable JavaScript blockers in your browser.","ui.discover.offlineButton":"دوباره تلاش کنید","ui.discover.searchPlaceholder":"Search in {count} extensions …","ui.discover.empty":"هیچ نتیجه‌ای برای {query}","ui.discover.more":"نتایج بیشتر","ui.discover.sortBy":"مرتب‌سازی براساس","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"بروزرسانی شده","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"دانلودها","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"امتیاز","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"جزئیات","ui.discover.latestPackages":"Latest and updated extensions","ui.discover.faversPackages":"Ø§ÙØ²ÙˆÙ†Ù‡â€ŒÙ‡Ø§ÛŒ با امتیاز بالا","ui.discover.downloadsPackages":"Most downloaded extensions","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"وب‌سایت پروژه","ui.package.private":"بسته اختصاصی","ui.package.privateTitle":"Private packages are only available from the vendor (e.g. as a ZIP download). Please visit the website for more information.","ui.package.abandoned":"منع شده","ui.package.abandonedText":"This package is abandoned and no longer maintained.","ui.package.abandonedReplace":"This package is abandoned and no longer maintained. The author suggests using the {replacement} package instead.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"جزئیات Ø§ÙØ²ÙˆÙ†Ù‡ قبلی","ui.package-details.close":"بستن جزئیات Ø§ÙØ²ÙˆÙ†Ù‡","ui.package-details.loading":"بارگذاری ...","ui.package-details.tabDescription":"توضیح","ui.package-details.tabRequire":"نیازمندی‌ها","ui.package-details.tabFeatures":"ویژگی‌ها","ui.package-details.tabSuggest":"پیشنهادها","ui.package-details.tabConflict":"ناسازگاری‌ها","ui.package-details.tabDependents":"وابسته‌ها","ui.package-details.linkRequires":"نیاز دارد","ui.package-details.linkReplaces":"جایگزین می‌کند","ui.package-details.linkProvides":"ÙØ±Ø§Ù‡Ù… می‌کند","ui.package-details.linkConflicts":"ناسازگار است","ui.package-details.funding":"Fund package maintenance!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"آخرین نسخه","ui.package-details.released":"منتشر شده در","ui.package-details.license":"مجوز(ها)","ui.package-details.authors":"از","ui.package-details.more":"بیشتر","ui.package-details.packagist":"جژئیات بسته","ui.package-details.metadata":"ویرایش ÙØ±Ø¯Ø§Ø¯Ù‡","ui.package-details.support_docs":"مستندات","ui.package-details.support_wiki":"ویکی","ui.package-details.support_forum":"انجمن پشتیبانی","ui.package-details.support_issues":"مشکلات / گزارش باگ","ui.package-details.support_source":"کد منبع","ui.package-details.support_irc":"IRC / چت","ui.package-details.support_email":"ایمیل پشتیبانی","ui.package-details.support_rss":"خوراک RSS"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[769],{4769:function(i){i.exports=JSON.parse('{"ui.app.title":"Estensioni Contao","ui.app.loading":"Caricamento lista estensioni...","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Pubblicità nell\'elenco delle estensioni","ui.discover.loading":"Caricamento in corso ...","ui.discover.offline":"Non è stato possibile ottenere alcun risultato.","ui.discover.offlineExplain":"Controlla la tua connessione internet e disabilita i blocchi JavaScript nel tuo browser.","ui.discover.offlineButton":"Riprova","ui.discover.searchPlaceholder":"Cerca in {conti} estensioni ...","ui.discover.empty":"Nessun risultato per {query}","ui.discover.more":"Ulteriori risultati","ui.discover.sortBy":"Ordina per","ui.discover.sortReleased":"Rilasciato","ui.discover.sortReleasedTitle":"Ordina i risultati per data di rilascio","ui.discover.sortLatest":"Aggiornamento eseguito","ui.discover.sortLatestTitle":"Ordina i risultati per ultimo aggiornamento","ui.discover.sortDownloads":"Downloads","ui.discover.sortDownloadsTitle":"Ordina i risultati per numero di download","ui.discover.sortFavers":"Valutazione","ui.discover.sortFaversTitle":"Ordina i risultati per valutazione","ui.discover.detailsButton":"Dettagli","ui.discover.latestPackages":"Estensioni più recenti e aggiornate","ui.discover.faversPackages":"Estensioni più votate","ui.discover.downloadsPackages":"Estensioni più scaricate","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Sito web del progetto","ui.package.private":"Pacchetto privato","ui.package.privateTitle":"I pacchetti privati sono disponibili solo attraverso il fornitore (ad es. Come download ZIP). Per ulteriori informazioni, visitare il sito Web.","ui.package.abandoned":"dismesso","ui.package.abandonedText":"Questo pacchetto è abbandonato e non è più mantenuto.","ui.package.abandonedReplace":"Questo pacchetto è abbandonato e non è più mantenuto. L\'autore suggerisce di usare il pacchetto {sostituzione}.","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"Dettagli estensione precedente","ui.package-details.close":"Chiudi dettagli estensione","ui.package-details.loading":"Caricamento in corso ...","ui.package-details.tabDescription":"Descrizione","ui.package-details.tabRequire":"Requisiti","ui.package-details.tabFeatures":"Caratteristiche","ui.package-details.tabSuggest":"Suggerimenti","ui.package-details.tabConflict":"Conflitti","ui.package-details.tabDependents":"Dipendenti","ui.package-details.linkRequires":"richiede","ui.package-details.linkReplaces":"sostituisce","ui.package-details.linkProvides":"fornisce","ui.package-details.linkConflicts":"Conflitti","ui.package-details.funding":"Manutenzione del pacchetto!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"Ultima versione","ui.package-details.released":"rilasciato il","ui.package-details.license":"Licenza","ui.package-details.authors":"da","ui.package-details.more":"Altro","ui.package-details.packagist":"Dettagli del pacchetto","ui.package-details.metadata":"Modifica metadati","ui.package-details.support_docs":"Documentazione","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Forum di supporto","ui.package-details.support_issues":"Problemi / Bug Report","ui.package-details.support_source":"Source Code","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"E-Mail di supporto","ui.package-details.support_rss":"Feed RSS"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[721],{9721:function(a){a.exports=JSON.parse('{"ui.app.title":"Contao機能拡張","ui.app.loading":"機能拡張ã®ä¸€è¦§ã‚’読ã¿è¾¼ã¿ä¸­...","ui.app.language":"Contao Managerã®è¨€èªžã‚’切り替ãˆ","ui.app.colorDark":"ダークモード","ui.app.colorDarkTitle":"é…色をダークモードã«åˆ‡ã‚Šæ›¿ãˆ","ui.app.colorLight":"ライトモード","ui.app.colorLightTitle":"é…色をライトモードã«åˆ‡ã‚Šæ›¿ãˆ","ui.discover.advertisement":"機能拡張ã®ãƒªã‚¹ãƒˆã«åºƒå‘Š","ui.discover.loading":"読ã¿è¾¼ã¿ä¸­...","ui.discover.offline":"ä½•ã‚‚çµæžœã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚","ui.discover.offlineExplain":"Internet接続を確èªã—ã€ãƒ–ラウザーã®JavaScriptã®ãƒ–ロッカーを無効ã«ã—ã¦ãã ã•ã„。","ui.discover.offlineButton":"å†å®Ÿè¡Œ","ui.discover.searchPlaceholder":"{count}ã®æ©Ÿèƒ½æ‹¡å¼µã‹ã‚‰æ¤œç´¢ä¸­...","ui.discover.empty":"{query}ã®çµæžœã¯ã‚りã¾ã›ã‚“。","ui.discover.more":"ã•らã«çµæžœã‚’表示","ui.discover.sortBy":"ä¸¦ã¹æ›¿ãˆ","ui.discover.sortReleased":"リリース","ui.discover.sortReleasedTitle":"リリース日ã§ä¸¦ã¹æ›¿ãˆ","ui.discover.sortLatest":"更新日時","ui.discover.sortLatestTitle":"更新日時ã§ä¸¦ã¹æ›¿ãˆ","ui.discover.sortDownloads":"ダウンロード","ui.discover.sortDownloadsTitle":"ダウンロード数ã§ä¸¦ã¹æ›¿ãˆ","ui.discover.sortFavers":"評価","ui.discover.sortFaversTitle":"評価ã®çµæžœã§ä¸¦ã¹æ›¿ãˆ","ui.discover.detailsButton":"詳細","ui.discover.latestPackages":"æœ€æ–°ã¨æ›´æ–°ã•ã‚ŒãŸæ©Ÿèƒ½æ‹¡å¼µ","ui.discover.faversPackages":"最上ä½ã®ãƒ¬ãƒ¼ãƒˆã®æ©Ÿèƒ½æ‹¡å¼µ","ui.discover.downloadsPackages":"ã‚‚ã£ã¨ã‚‚ダウンロードã•ã‚ŒãŸæ©Ÿèƒ½æ‹¡å¼µ","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"プロジェクトã®ã‚¦ã‚§ãƒ–サイト","ui.package.private":"ç§çš„ãªãƒ‘ッケージ","ui.package.privateTitle":"ç§çš„ãªãƒ‘ッケージã¯ãƒ™ãƒ³ãƒ€ãƒ¼ã‹ã‚‰ã ã‘(例ãˆã°ã€ZIPã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã§)入手ã§ãã¾ã™ã€‚詳細ã¯ã‚¦ã‚§ãƒ–サイトをå‚ç…§ã—ã¦ãã ã•ã„。","ui.package.abandoned":"放棄","ui.package.abandonedText":"ã“ã®ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã¯æ”¾æ£„ã•れã€ã‚‚ã†ä¿å®ˆã•れã¦ã„ã¾ã›ã‚“。","ui.package.abandonedReplace":"ã“ã®ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã¯æ”¾æ£„ã•れã€ã‚‚ã†ä¿å®ˆã•れã¦ã„ã¾ã›ã‚“。代ã‚りã«{replacement}パッケージã®ä½¿ç”¨ã‚’ä½œè€…ã¯æŽ¨å¥¨ã—ã¦ã„ã¾ã™ã€‚","ui.package.contaoVersion":"Contaoã§åˆ©ç”¨å¯èƒ½","ui.package-details.previous":"以å‰ã®æ©Ÿèƒ½æ‹¡å¼µã®è©³ç´°","ui.package-details.close":"機能拡張ã®è©³ç´°ã‚’é–‰ã˜ã‚‹","ui.package-details.loading":"読ã¿è¾¼ã¿ä¸­...","ui.package-details.tabDescription":"説明","ui.package-details.tabRequire":"å¿…é ˆè¦ä»¶","ui.package-details.tabFeatures":"機能","ui.package-details.tabSuggest":"ææ¡ˆ","ui.package-details.tabConflict":"ç«¶åˆ","ui.package-details.tabDependents":"ä¾å­˜é–¢ä¿‚","ui.package-details.linkRequires":"å¿…è¦","ui.package-details.linkReplaces":"ç½®ãæ›ãˆ","ui.package-details.linkProvides":"æä¾›","ui.package-details.linkConflicts":"ç«¶åˆ","ui.package-details.funding":"パッケージã®ä¿å®ˆã«è³‡é‡‘ã‚’æä¾›!","ui.package-details.contaoVersions":"サãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹Contaoã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³","ui.package-details.latest":"最新版","ui.package-details.released":"リリース日","ui.package-details.license":"ライセンス","ui.package-details.authors":"次ã‹ã‚‰","ui.package-details.more":"詳細","ui.package-details.packagist":"パッケージã®è©³ç´°","ui.package-details.metadata":"メタデータを編集","ui.package-details.support_docs":"ドキュメント","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"サãƒãƒ¼ãƒˆãƒ•ォーラム","ui.package-details.support_issues":"å•題 / ãƒã‚°å ±å‘Š","ui.package-details.support_source":"ソースコード","ui.package-details.support_irc":"IRC / ãƒãƒ£ãƒƒãƒˆ","ui.package-details.support_email":"サãƒãƒ¼ãƒˆã®é›»å­ãƒ¡ãƒ¼ãƒ«","ui.package-details.support_rss":"RSSフィード"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[52],{9052:function(e){e.exports=JSON.parse('{"ui.app.title":"Extensões Contao","ui.app.loading":"A preparar a Lista de Extensões ...","ui.app.language":"Switch language for the Contao Manager","ui.app.colorDark":"Dark Mode","ui.app.colorDarkTitle":"Switch color scheme to dark","ui.app.colorLight":"Light Mode","ui.app.colorLightTitle":"Switch color scheme to light","ui.discover.advertisement":"Anúncio na lista de extensão","ui.discover.loading":"A Carregar ...","ui.discover.offline":"Falha ao obter resultados.","ui.discover.offlineExplain":"Verifique a sua conexão à internet e desactive bloqueadores JavaScript no seu browser.","ui.discover.offlineButton":"Tente novamente","ui.discover.searchPlaceholder":"Pesquisar em extensões {count} ...","ui.discover.empty":"Sem resultados para {query}","ui.discover.more":"Mais resultados","ui.discover.sortBy":"Ordenar por","ui.discover.sortReleased":"Released","ui.discover.sortReleasedTitle":"Sort results by release date","ui.discover.sortLatest":"Actualizado","ui.discover.sortLatestTitle":"Sort results by last updated","ui.discover.sortDownloads":"Downloads","ui.discover.sortDownloadsTitle":"Sort results by number of downloads","ui.discover.sortFavers":"Classificação","ui.discover.sortFaversTitle":"Sort results by rating","ui.discover.detailsButton":"Detalhes","ui.discover.latestPackages":"Extensões mais recentes e mais recentemente actualizadas","ui.discover.faversPackages":"Extensões com melhor classificação","ui.discover.downloadsPackages":"Extensões com maior numero de downloads","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Website do Projecto","ui.package.private":"Pacote Privado","ui.package.privateTitle":"Pacotes privados apenas são disponibilizados pelo proprietário. (por ex. Como um download .zip). Por favor visite o website para mais informação.","ui.package.abandoned":"abandonado","ui.package.abandonedText":"Este pacote é obsoleto e já não recebe actualizações e suporte.","ui.package.abandonedReplace":"Este pacote é obsoleto e já não recebe actualizações e suporte. O autor sugere que utilize como alternativa {replacement} .","ui.package.contaoVersion":"Available for Contao","ui.package-details.previous":"Detalhes da Extensão Anterior","ui.package-details.close":"Fechar Detalhes da Extensão","ui.package-details.loading":"A Carregar ...","ui.package-details.tabDescription":"Descrição","ui.package-details.tabRequire":"Requerimentos","ui.package-details.tabFeatures":"Funcionalidades","ui.package-details.tabSuggest":"Sugestões","ui.package-details.tabConflict":"Conflitos","ui.package-details.tabDependents":"Dependências","ui.package-details.linkRequires":"necessita","ui.package-details.linkReplaces":"substitui","ui.package-details.linkProvides":"fornece","ui.package-details.linkConflicts":"tem conflito","ui.package-details.funding":"Manutenção do pacote de fundos!","ui.package-details.contaoVersions":"Supported Contao version(s)","ui.package-details.latest":"Última versão","ui.package-details.released":"lançada em","ui.package-details.license":"Licença(s)","ui.package-details.authors":"a partir de","ui.package-details.more":"Mais","ui.package-details.packagist":"Detalhes do Pacote","ui.package-details.metadata":"Editar Metadata","ui.package-details.support_docs":"Documentação","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Forum de Suporte","ui.package-details.support_issues":"Submissão de erros e problemas","ui.package-details.support_source":"Código Fonte","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"E-mail de Suporte","ui.package-details.support_rss":"RSS Feed"}')}}]);"use strict";(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[518],{2518:function(e){e.exports=JSON.parse('{"ui.app.title":"Contao Extensies","ui.app.loading":"Extensie Lijst laden …","ui.app.language":"Wijzig de taal voor de Contao Manager","ui.app.colorDark":"Donkere modus","ui.app.colorDarkTitle":"Verander het kleurenschema naar donker","ui.app.colorLight":"Lichte modus","ui.app.colorLightTitle":"Verander het kleurenschema naar licht","ui.discover.advertisement":"Advertentie in de extensielijst","ui.discover.loading":"Bezig met laden ...","ui.discover.offline":"Kon geen resultaten ophalen.","ui.discover.offlineExplain":"Controleer uw internetverbinding en schakel JavaScript blokkers uit in uw browser.","ui.discover.offlineButton":"Probeer opnieuw","ui.discover.searchPlaceholder":"Zoeken in {count} extensies…","ui.discover.empty":"Geen resultaten voor {query}","ui.discover.more":"Meer resultaten","ui.discover.sortBy":"Sorteren op","ui.discover.sortReleased":"Uitgebracht","ui.discover.sortReleasedTitle":"Sorteer de resultaten op releasedatum","ui.discover.sortLatest":"Updated","ui.discover.sortLatestTitle":"Sorteer de resultaten op laatst bijgewerkt","ui.discover.sortDownloads":"Downloads","ui.discover.sortDownloadsTitle":"Sorteer resultaten op aantal downloads","ui.discover.sortFavers":"Beoordeling","ui.discover.sortFaversTitle":"Sorteer de resultaten op beoordeling","ui.discover.detailsButton":"Details","ui.discover.latestPackages":"Nieuwste en bijgewerkte extensies","ui.discover.faversPackages":"Best beoordeelde extensies","ui.discover.downloadsPackages":"Meest gedownloade extensies","ui.discover.exactHit":"Exact query match","ui.discover.results":"More search results","ui.package.homepage":"Project Website","ui.package.private":"Privépakket","ui.package.privateTitle":"Privépakketten zijn alleen verkrijgbaar bij de leverancier (bijvoorbeeld als ZIP-download). Bezoek de website voor meer informatie.","ui.package.abandoned":"niet meer ondersteund","ui.package.abandonedText":"Dit pakket wordt niet langer ondersteund en onderhouden.","ui.package.abandonedReplace":"Dit pakket wordt niet langer ondersteund en onderhouden. De auteur stelt voor om in plaats daarvan het {vervangend} pakket te gebruiken.","ui.package.contaoVersion":"Beschikbaar voor Contao","ui.package-details.previous":"Vorige Extensie Details","ui.package-details.close":"Sluit Extensie Details","ui.package-details.loading":"Bezig met laden ...","ui.package-details.tabDescription":"Beschrijving","ui.package-details.tabRequire":"Vereisten","ui.package-details.tabFeatures":"Kenmerken","ui.package-details.tabSuggest":"Suggesties","ui.package-details.tabConflict":"Conflicten","ui.package-details.tabDependents":"Afhankelijkheden","ui.package-details.linkRequires":"vereist","ui.package-details.linkReplaces":"vervangt","ui.package-details.linkProvides":"biedt","ui.package-details.linkConflicts":"conflicten","ui.package-details.funding":"Fund package maintenance!","ui.package-details.contaoVersions":"Ondersteunde Contao versie(s)","ui.package-details.latest":"Laatste versie","ui.package-details.released":"uitgebracht op","ui.package-details.license":"Licentie(s)","ui.package-details.authors":"van","ui.package-details.more":"Meer","ui.package-details.packagist":"Details bundel","ui.package-details.metadata":"Bewerk Metadata","ui.package-details.support_docs":"Documentatie","ui.package-details.support_wiki":"Wiki","ui.package-details.support_forum":"Support Forum","ui.package-details.support_issues":"Problemen / Foutrapport","ui.package-details.support_source":"Broncode","ui.package-details.support_irc":"IRC / Chat","ui.package-details.support_email":"Support E-Mail","ui.package-details.support_rss":"RSS Feed"}')}}]);(function(){"use strict";var e={70:function(e,t){t.A={ADMIN:"admin",INSTALL:"install",UPDATE:"update",READ:"read"}},707:function(e,t){t.A={INIT:"init",ACCOUNT:"account",LOGIN:"login",BOOT:"boot",CONFIG:"config",SETUP:"setup",RECOVERY:"recovery",MIGRATION:"migration",READY:"ready"}},728:function(e,t,a){a.d(t,{A:function(){return p}});var s=a(641),o=a(33);const n={class:"layout-boxed"},i={class:"layout-boxed__cell"};function l(e,t,a,l,r,c){const u=(0,s.g2)("footer-fragment");return(0,s.uX)(),(0,s.CE)("div",n,[(0,s.Lk)("div",i,[(0,s.Lk)("div",{class:(0,o.C4)("layout-boxed__container "+(a.wide?" layout-boxed__container--wide ":"")+a.slotClass)},[(0,s.RG)(e.$slots,"default"),(0,s.bF)(u,{display:a.wide?"boxed":""},null,8,["display"])],2)])])}var r=a(1218),c={components:{FooterFragment:r.A},props:{slotClass:String,wide:Boolean}},u=a(6262);const d=(0,u.A)(c,[["render",l]]);var p=d},1218:function(e,t,a){a.d(t,{A:function(){return _}});var s=a(641),o=a(33);const n={key:0,class:"fragment-footer__product"},i={class:"fragment-footer__links"},l={href:"https://docs.contao.org",target:"_blank"},r={href:"https://to.contao.org/support",target:"_blank"},c={class:"fragment-footer__settings"};function u(e,t,a,u,d,p){const g=(0,s.g2)("footer-languages"),h=(0,s.g2)("theme-toggle");return(0,s.uX)(),(0,s.CE)("footer",{class:(0,o.C4)("fragment-footer"+(a.display?" fragment-footer--"+a.display:""))},[p.isLogin?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("strong",n,"Contao Manager 1.10.3")),(0,s.Lk)("ul",i,[(0,s.Lk)("li",null,[(0,s.Lk)("a",l,(0,o.v_)(e.$t("ui.footer.help")),1)]),(0,s.Lk)("li",null,[(0,s.Lk)("a",r,(0,o.v_)(e.$t("ui.footer.reportProblem")),1)])]),(0,s.Lk)("div",c,[(0,s.bF)(g,{locales:p.languageOptions,current:p.currentLanguage,onChange:p.updateLanguage},null,8,["locales","current","onChange"]),(0,s.bF)(h)])],2)}var d=a(8044),p=a(9376),g=a(707),h=a(8823),m=a(2273),k={components:{FooterLanguages:h.A,ThemeToggle:m.A},props:{display:String},computed:{isLogin:e=>e.$store.state.view===g.A.LOGIN,currentLanguage(){return this.$i18n.locale},languageOptions(){return p.A}},methods:{updateLanguage(e){d.A.switch(e)}}},v=a(6262);const b=(0,v.A)(k,[["render",u]]);var _=b},1326:function(e,t,a){a.d(t,{A:function(){return u}});var s=a(641),o=a(33);const n={class:"progress-bar"};function i(e,t,a,i,l,r){return(0,s.uX)(),(0,s.CE)("div",n,[(0,s.Lk)("div",{class:"progress-bar__label",ref:"bar"},(0,o.v_)(a.label?a.label:`${r.progress}%`),513),(0,s.Lk)("div",{class:"progress-bar__bar",style:(0,o.Tr)(`width:${r.progress}%`)},[(0,s.Lk)("span",{style:(0,o.Tr)(`width:${e.width}px`)},(0,o.v_)(a.label?a.label:`${r.progress}%`),5)],4)])}var l={props:{amount:[String,Number],label:String},data:()=>({width:0}),computed:{progress(){return Math.floor(this.amount)}},methods:{updateWidth(){this.$refs.bar&&(this.width=this.$refs.bar.clientWidth)}},mounted(){setTimeout(this.updateWidth,0)}},r=a(6262);const c=(0,r.A)(l,[["render",i]]);var u=c},2864:function(e,t,a){a.d(t,{A:function(){return U}});var s=a(641),o=a(33);const n={class:"console"},i={class:"console__header"},l={class:"console__headline"},r={key:0,class:"console__description"},c={class:"console__actions"},u=["title"],d={class:"console__operations"};function p(e,t,a,p,g,h){const m=(0,s.g2)("button-menu"),k=(0,s.g2)("console-operation");return(0,s.uX)(),(0,s.CE)("div",n,[(0,s.Lk)("section",i,[(0,s.Lk)("div",null,[(0,s.Lk)("h1",l,(0,o.v_)(a.title),1),a.description?((0,s.uX)(),(0,s.CE)("p",r,(0,o.v_)(a.description),1)):(0,s.Q3)("",!0)]),(0,s.Lk)("div",c,[a.forceConsole?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("button",{key:0,class:(0,o.C4)(["widget-button widget-button--transparent widget-button--console console__action",{"console__action--active":e.showConsole}]),title:e.$t("ui.console.toggle"),onClick:t[0]||(t[0]=(...e)=>h.toggleConsole&&h.toggleConsole(...e))},null,10,u)),(0,s.bF)(m,{transparent:"","button-class":"console__action"},{default:(0,s.k6)((()=>[(0,s.Lk)("button",{onClick:t[1]||(t[1]=(...e)=>h.showLog&&h.showLog(...e))},(0,o.v_)(e.$t("ui.console.showLog")),1),(0,s.Lk)("button",{onClick:t[2]||(t[2]=t=>e.clipboard.copy(a.consoleOutput))},(0,o.v_)(e.$t("ui.console.copyLog")),1)])),_:1})])]),(0,s.Lk)("div",d,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(a.operations,((t,o)=>((0,s.uX)(),(0,s.Wv)(k,(0,s.v6)({key:o,ref_for:!0},t,{"show-console":e.showConsole,"force-console":a.forceConsole}),null,16,["show-console","force-console"])))),128))])])}var g=a(3513),h=a(3751);const m={class:"button-menu"};function k(e,t,a,n,i,l){return(0,s.uX)(),(0,s.CE)("div",m,[(0,s.Lk)("button",{class:(0,o.C4)(l.classes),onClick:t[0]||(t[0]=(...e)=>l.toggle&&l.toggle(...e))},null,2),(0,s.bo)((0,s.Lk)("div",{ref:"menu",class:"button-menu__menu",tabindex:"-1",onFocusout:t[1]||(t[1]=(...e)=>l.close&&l.close(...e)),onClick:t[2]||(t[2]=(...e)=>l.close&&l.close(...e))},[(0,s.RG)(e.$slots,"default")],544),[[h.aG,e.showMenu]])])}var v={name:"ButtonMenu",props:{buttonClass:String,type:String,icon:{type:String,default:"more"},transparent:Boolean,disabled:Boolean},data:()=>({showMenu:!1}),computed:{classes(){let e=`widget-button widget-button--${this.icon} button-menu__button ${this.buttonClass}`;return this.type&&(e+=` widget-button--${this.type}`),this.transparent&&(e+=" widget-button--transparent"),e}},methods:{open(){this.showMenu=!0,setTimeout((()=>this.$refs.menu?.focus()),0)},close(e){e&&this.$refs.menu?.contains(e.relatedTarget)||(this.$refs.menu.blur(),setTimeout((()=>{this.showMenu=!1}),100))},toggle(){this.showMenu?this.close():this.open()}}},b=a(6262);const _=(0,b.A)(v,[["render",k]]);var f=_;const w={class:"console-operation__status"},y={key:0,class:"console-operation__icon console-operation__icon--active",width:"18",height:"18",fill:"none",xmlns:"http://www.w3.org/2000/svg",stroke:"#dbab0a"},C={key:1,class:"console-operation__icon console-operation__icon--success",viewBox:"0 0 16 16",width:"16",height:"16","aria-hidden":"true"},$={key:2,class:"console-operation__icon console-operation__icon--error",viewBox:"0 0 16 16",width:"16",height:"16","aria-hidden":"true"},L={key:3,class:"console-operation__icon console-operation__icon--skipped",viewBox:"0 0 16 16",width:"16",height:"16","aria-hidden":"true"},A={key:4,class:"console-operation__icon console-operation__icon--pending",viewBox:"0 0 16 16",width:"16",height:"16","aria-hidden":"true"},E={class:"console-operation__label"},X={key:0,class:"console-operation__description"},S={class:"console-operation__lines"},M=["data-index"],T={class:"console-operation__line-number"},x={class:"console-operation__line-content"};function O(e,t,a,n,i,l){return(0,s.uX)(),(0,s.Wv)((0,s.$y)(console&&!a.forceConsole?"details":"div"),{ref:"details",class:"console-operation",onToggle:l.toggleConsole},{default:(0,s.k6)((()=>[((0,s.uX)(),(0,s.Wv)((0,s.$y)(console&&!a.forceConsole?"summary":"div"),{class:(0,o.C4)(["console-operation__summary",{"console-operation__summary--console":!!console}])},{default:(0,s.k6)((()=>[(0,s.Lk)("div",w,[l.isActive?((0,s.uX)(),(0,s.CE)("svg",y,t[3]||(t[3]=[(0,s.Lk)("g",{fill:"none",fillrule:"evenodd"},[(0,s.Lk)("g",{transform:"translate(1 1)","stroke-width":"2"},[(0,s.Lk)("circle",{opacity:".5",cx:"8",cy:"8",r:"7"}),(0,s.Lk)("path",{d:" M 15 8 A 7 7 0 0 1 8 15"})])],-1),(0,s.Lk)("path",{"fill-rule":"evenodd",d:"M9 5a4 4 0 100 8 4 4 0 000-8z"},null,-1)]))):l.isSuccess?((0,s.uX)(),(0,s.CE)("svg",C,t[4]||(t[4]=[(0,s.Lk)("path",{"fill-rule":"evenodd",d:"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z"},null,-1)]))):l.isError||l.isStopped?((0,s.uX)(),(0,s.CE)("svg",$,t[5]||(t[5]=[(0,s.Lk)("path",{"fill-rule":"evenodd",d:"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z"},null,-1)]))):l.isSkipped?((0,s.uX)(),(0,s.CE)("svg",L,t[6]||(t[6]=[(0,s.Lk)("path",{"fill-rule":"evenodd",d:"M8 4a4 4 0 100 8 4 4 0 000-8z"},null,-1)]))):((0,s.uX)(),(0,s.CE)("svg",A,t[7]||(t[7]=[(0,s.Lk)("path",{"fill-rule":"evenodd",d:"M8 4a4 4 0 100 8 4 4 0 000-8z"},null,-1)])))]),(0,s.Lk)("div",E,[Array.isArray(a.summary)?((0,s.uX)(!0),(0,s.CE)(s.FK,{key:0},(0,s.pI)(a.summary,((e,n)=>((0,s.uX)(),(0,s.CE)(s.FK,{key:`${n}_title`},[(0,s.Lk)("h2",{class:(0,o.C4)(["console-operation__title",{"console-operation__title--disabled":e.match(/^~.+~$/)}])},(0,o.v_)(e.replace(/^~(.+)~$/,"$1")),3),a.details[n]?((0,s.uX)(),(0,s.CE)("p",{class:"console-operation__description",key:`${n}_details`},(0,o.v_)(a.details[n]),1)):(0,s.Q3)("",!0),t[8]||(t[8]=(0,s.Lk)("br",null,null,-1))],64)))),128)):((0,s.uX)(),(0,s.CE)(s.FK,{key:1},[(0,s.Lk)("h2",{class:(0,o.C4)(["console-operation__title",{"console-operation__title--disabled":a.summary.match(/^~.+~$/)}])},(0,o.v_)(a.summary.replace(/^~(.+)~$/,"$1")),3),a.details?((0,s.uX)(),(0,s.CE)("p",X,(0,o.v_)(a.details),1)):(0,s.Q3)("",!0)],64))])])),_:1})),a.console?((0,s.uX)(),(0,s.CE)("div",{key:0,class:"console-operation__console",ref:"console",onScroll:t[2]||(t[2]=(...e)=>l.scrolled&&l.scrolled(...e))},[(0,s.bo)((0,s.Lk)("button",{class:"console-operation__scroll console-operation__scroll--top",onClick:t[0]||(t[0]=(...e)=>l.scrollToTop&&l.scrollToTop(...e))},t[9]||(t[9]=[(0,s.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",height:"24",viewBox:"0 0 24 24",width:"24"},[(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,s.Lk)("path",{d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"})],-1)]),512),[[h.aG,!e.isScrolledTop]]),(0,s.Lk)("div",S,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(l.consoleLines,((e,t)=>((0,s.uX)(),(0,s.CE)("div",{key:t,class:"console-operation__line","data-index":t},[(0,s.Lk)("span",T,(0,o.v_)(t+1),1),(0,s.Lk)("span",x,(0,o.v_)(e),1)],8,M)))),128))]),(0,s.bo)((0,s.Lk)("button",{class:"console-operation__scroll console-operation__scroll--bottom",onClick:t[1]||(t[1]=(...e)=>l.scrollToBottom&&l.scrollToBottom(...e))},t[10]||(t[10]=[(0,s.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",height:"24",viewBox:"0 0 24 24",width:"24"},[(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,s.Lk)("path",{d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"})],-1)]),512),[[h.aG,!e.isScrolledBottom]])],544)):(0,s.Q3)("",!0)])),_:1},40,["onToggle"])}a(9348);var I={name:"ConsoleOperation",props:{status:String,summary:[String,Array],details:[String,Array],console:String,showConsole:Boolean,forceConsole:Boolean},data:()=>({openConsole:!0,isScrolledTop:!0,isScrolledBottom:!0,autoScroll:!0,swallowScroll:!0}),computed:{isPending:e=>"pending"===e.status,isActive:e=>"active"===e.status,isSuccess:e=>"complete"===e.status,isError:e=>"error"===e.status,isStopped:e=>"stopped"===e.status,isSkipped:e=>"skipped"===e.status,consoleLines:e=>e.console.trim().split("\n")},methods:{toggleConsole(){this.openConsole=this.$refs.details.open,this.openConsole&&this.$refs.console&&(this.autoScroll=!0,this.$refs.console.scrollTop=this.$refs.console.scrollHeight,this.updatePosition())},scrolled(){this.swallowScroll||this.updatePosition(),this.swallowScroll=!1},updatePosition(){const e=this.$refs.console,t=e.scrollTop+e.clientHeight;this.autoScroll=t===e.scrollHeight,this.isScrolledTop=e.clientHeight<=250||e.scrollHeight>250&&e.scrollTop<16,this.isScrolledBottom=e.clientHeight<=250||e.scrollHeight>250&&t>=e.scrollHeight-16},scrollToTop(){this.$refs.console.scrollTop=0},scrollToBottom(){this.$refs.console.scrollTop=this.$refs.console.scrollHeight},updateConsole(e=!0){this.isError&&(e=!0),this.$refs.details&&(this.$refs.details.open=e)}},watch:{console(e){e&&(this.updateConsole(this.openConsole),this.autoScroll&&setTimeout((()=>{this.swallowScroll=!0,this.$refs.console.scrollTop=this.$refs.console.scrollHeight}),0))},showConsole(e){this.openConsole=e,this.updateConsole(e)}},mounted(){this.openConsole=this.showConsole,this.updateConsole(this.openConsole)}};const P=(0,b.A)(I,[["render",O]]);var F=P,B={components:{ConsoleOperation:F,ButtonMenu:f},props:{title:{type:String,required:!0},description:String,operations:{type:Array,required:!0},forceConsole:{type:Boolean,default:!1},consoleOutput:String},data:()=>({showConsole:!1,clipboard:(0,g.iDZ)()}),methods:{toggleConsole(){this.showConsole=!this.showConsole,window.localStorage.setItem("contao_manager_console",this.showConsole?"1":"0")},showLog(){const e=window.open();e&&(e.document.open(),e.document.write(`
${this.consoleOutput}
`),e.document.close())}},mounted(){this.showConsole="1"===window.localStorage.getItem("contao_manager_console")}};const R=(0,b.A)(B,[["render",p]]);var U=R},3480:function(e,t,a){a.d(t,{A:function(){return d}});var s=a(641),o=a(33);const n=["id","name","disabled","required","checked"],i=["for"];function l(e,t,a,l,r,c){return(0,s.uX)(),(0,s.CE)("div",null,[(0,s.Lk)("div",{class:(0,o.C4)(["widget widget-checkbox",{"widget--required":a.required}])},[(0,s.Lk)("input",{ref:"input",type:"checkbox",id:a.label?"ctrl_"+a.name:"",name:a.name,disabled:a.disabled,required:a.required,checked:a.modelValue||null,onChange:t[0]||(t[0]=e=>c.toggle(e.target.checked))},null,40,n),a.label?((0,s.uX)(),(0,s.CE)("label",{key:0,for:"ctrl_"+a.name},(0,o.v_)(a.label),9,i)):(0,s.Q3)("",!0)],2),a.description||e.$slots.description?((0,s.uX)(),(0,s.CE)("div",{key:0,class:(0,o.C4)(["widget__description",{"widget__description--disabled":a.disabled}])},[(0,s.RG)(e.$slots,"description",{},(()=>[(0,s.Lk)("p",null,(0,o.v_)(a.description),1)]))],2)):(0,s.Q3)("",!0)])}var r={emits:["input","update:modelValue"],props:{name:{type:String,required:!0},label:{type:String,required:!0},description:String,modelValue:Boolean,disabled:Boolean,required:Boolean},methods:{toggle(e){this.$emit("input"),this.$emit("update:modelValue",!!e)}}},c=a(6262);const u=(0,c.A)(r,[["render",l]]);var d=u},3723:function(e,t){t.A={discover:{name:"discover"},packages:{name:"packages"},oauth:{name:"oauth"},maintenance:{name:"maintenance"},userManager:{name:"users"},logViewer:{name:"logs"}}},4173:function(e,t,a){a.d(t,{A:function(){return ke}});var s=a(6278),o=a(707),n=a(4335),i=a(4710),l=a(70),r=a(641),c=a(33);const u={class:"logout-warning__text"},d={class:"logout-warning__countdown"},p={key:1,class:"logout-warning__text"};function g(e,t,a,s,o,n){const i=(0,r.g2)("loading-button"),l=(0,r.g2)("popup-overlay");return(0,r.uX)(),(0,r.Wv)(l,{class:"logout-warning",headline:e.$t("ui.logout.headline"),headlineType:0===e.countdown?"alert":null},{actions:(0,r.k6)((()=>[e.countdown>0?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.bF)(i,{color:"primary",loading:e.renew,disabled:e.logout,onClick:n.keepAlive},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.logout.renew")),1)])),_:1},8,["loading","disabled","onClick"]),(0,r.bF)(i,{onClick:n.doLogout,loading:e.logout,disabled:e.renew},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.logout.logout")),1)])),_:1},8,["onClick","loading","disabled"])],64)):((0,r.uX)(),(0,r.Wv)(i,{key:1,onClick:n.close},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.logout.login")),1)])),_:1},8,["onClick"]))])),default:(0,r.k6)((()=>[e.countdown>0?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.Lk)("p",u,(0,c.v_)(e.$t("ui.logout.warning")),1),(0,r.Lk)("p",d,(0,c.v_)(n.minutes)+":"+(0,c.v_)(n.seconds),1)],64)):((0,r.uX)(),(0,r.CE)("p",p,(0,c.v_)(e.$t("ui.logout.expired")),1))])),_:1},8,["headline","headlineType"])}var h=a(1687),m=a(85),k={components:{PopupOverlay:h.A,LoadingButton:m.A},data:()=>({renew:!1,logout:!1}),computed:{...(0,s.aH)("auth",["countdown"]),minutes(){return Math.floor(this.countdown/60)},seconds(){const e=this.countdown%60;return e<10?`0${e}`:e}},methods:{async keepAlive(){this.renew=!0,await this.$store.dispatch("auth/status"),this.renew=!1},async doLogout(){this.logout=!0,await this.$store.dispatch("auth/logout"),this.logout=!1},close(){this.$store.commit("auth/resetCountdown")}}},v=a(6262);const b=(0,v.A)(k,[["render",g]]);var _=b;let f,w,y,C;const $=function(){clearTimeout(f),y=Date.now()+18e5,w=1800,f=setInterval(A,1e3),C.commit("setCountdown",w),C.commit("modals/close","logout-warning",{root:!0})},L=function(){y=null,w=null,clearInterval(f),f=void 0,C.commit("setCountdown",w),C.commit("modals/close","logout-warning",{root:!0})},A=function(){w>0&&(w=Math.floor(Math.max(y-Date.now(),0)/1e3)),w<=300&&C.commit("modals/open",{id:"logout-warning",component:_,priority:255},{root:!0}),0===w&&(C.dispatch("logout"),clearInterval(f)),C.commit("setCountdown",w)};var E={namespaced:!0,state:{username:null,scope:null,limited:!1,totpEnabled:!1,passkey:!1,countdown:null},getters:{isGranted:e=>t=>{const a=Object.values(l.A);return e.scope&&a.indexOf(e.scope)<=a.indexOf(t)}},mutations:{setUser(e,t){e.username=t?.username||null,e.scope=t?.scope||null,e.limited=t?.limited||!1,e.totpEnabled=t?.totp_enabled||t?.passkey||!1,e.passkey=t?.passkey||!1},setCountdown(e,t){e.countdown=t},renewCountdown(){C&&$()},resetCountdown(){C&&L()}},actions:{status(e){return C=e,n.A.get("api/session").then((t=>(t.data.username?(e.commit("setUser",t.data),$()):(e.commit("setUser",null),L()),t.status))).catch((t=>(e.commit("setUser",null),L(),403===t.response?.status&&e.commit("setLocked",null,{root:!0}),t.response?.status)))},async login(e,t){return C=e,await i.A.post("api/session",t,null,{201:t=>(e.commit("setUser",t.data),$(),t),401:e=>e,403:t=>(e.commit("setLocked",null,{root:!0}),t),422:e=>e})},logout({commit:e}){return n.A.delete("api/session").then((()=>!0),(e=>401===e.status)).then((t=>(t&&(e("setUser",null),e("setView",o.A.LOGIN,{root:!0}),L()),t)))}}},X=a(7943),S={namespaced:!0,state:{enabled:null,status:null},getters:{isLoading:e=>null===e.enabled||null===e.status,isReady:e=>e.enabled&&null!==e.status&&!!e.status.appVersion,hasError:(e,t)=>e.enabled&&!t.isLoading&&!t.isReady},mutations:{setEnabled(e,t){e.enabled=t},setStatus(e,t){e.status=t}},actions:{async fetch({state:e,commit:t,dispatch:a}){let s=e.enabled;if(null===e.enabled){try{const e=await a("server/config/get",null,{root:!0});s=!!e.cloud?.enabled}catch(o){s=!1}t("setEnabled",s)}if(s)try{const e=await n.A.get("https://www.composer-resolver.cloud/",{timeout:2500,responseType:"json",headers:{"Composer-Resolver-Client":"contao"}});if(!e.data?.appVersion)return void t("setStatus",{});t("setStatus",e.data)}catch(o){t("setStatus",{})}else t("setStatus",{})}}},M={namespaced:!0,actions:{get(){return n.A.get("api/config/composer").then((e=>e.data))},put(e,t){return n.A.put("api/config/composer",t).then((e=>e.data))},patch(e,t){return n.A.patch("api/config/composer",t).then((e=>e.data))},writeDefaults({dispatch:e}){return e("patch",{config:{"preferred-install":"dist","store-auths":!1,"optimize-autoloader":!0,"sort-packages":!0,"discard-changes":!0}}).then((e=>e.data))}}},T={namespaced:!0,modules:{composer:M}},x=a(156),O=(a(4114),a(8111),a(2489),a(116),a(7588),a(9589)),I=a(950),P=a(9997);a(1701),a(8237);const F=e=>{const t=Object.values(e).reduce(((e,t)=>(e[t.hash]=(e[t.hash]||0)+1,e)),{});return!!Object.values(t).find((e=>e>1))};var B={namespaced:!0,state:{uploads:null,uploading:!1,files:[],confirmed:[],removing:[]},getters:{hasUploads:(e,t)=>t.totalUploads>0,isDuplicate:e=>(t,a)=>Object.values(e.uploads).find((s=>s.id!==t&&(s.hash===e.uploads[t].hash||e.uploads[s.id]?.package?.name===a))),isRemoving:e=>t=>e.removing.includes(t),totalUploads:(e,t)=>e.uploads?t.unconfirmedUploads.length:0,unconfirmedUploads:e=>Object.values(e.uploads).filter((t=>!e.confirmed.includes(t.id))),canConfirmUploads:(e,t,a,s)=>!!e.uploads&&(void 0===Object.values(e.uploads).find((e=>!e.success||e.error||Object.keys(a.packages.installed).includes(e.package.name)&&a.packages.installed[e.package.name].version===e.package.version||e.package.require&&!s["packages/contaoSupported"](e.package.require["contao/core-bundle"]||e.package.require["contao/manager-bundle"])))&&!F(e.uploads))},mutations:{setUploads(e,t){e.uploads=t},setUploading(e,t){e.uploading=!!t},setFiles(e,t){e.files=t},setConfirmed(e,t){e.confirmed.push(t)},setUnconfirmed(e,t){delete e.confirmed[e.confirmed.indexOf(t)]},setRemoving(e,t){e.removing.push(t)},setRemoved(e,t){e.removing=e.removing.filter((e=>e!==t))}},actions:{async load({commit:e}){try{e("setUploads",(await n.A.get("api/packages/uploads")).data)}catch(t){if(501!==t.status)throw t;e("setUploads",!1)}},async confirm({state:e,commit:t},a){const s=e.uploads[a].package;s&&(this.getters["packages/packageInstalled"](s.name)?this.commit("packages/change",s):this.commit("packages/add",Object.assign({},s,{constraint:s.version})),s.suggest&&await Promise.all(Object.keys(s.suggest).map((async e=>{if(!this.getters["packages/packageInstalled"](e)){const t=await this.dispatch("packages/metadata",{name:e});t.contaoConstraint&&!this.getters["packages/contaoSupported"](t.contaoConstraint)||this.commit("packages/add",t)}}))),t("setConfirmed",a))},confirmAll({state:e,dispatch:t}){Object.keys(e.uploads).forEach((e=>t("confirm",e)))},unconfirm({state:e,commit:t},a){const s=e.confirmed.includes(a)?a:Object.keys(e.uploads).find((t=>e.uploads[t].package&&e.uploads[t].package.name===a&&e.confirmed.includes(t)));if(!s)return;t("setUnconfirmed",s);const o=e.uploads[s].package;o&&o.suggest&&Object.keys(o.suggest).forEach((e=>{this.getters["packages/packageAdded"](e)&&this.commit("packages/restore",e)}))},unconfirmAll({state:e,dispatch:t}){Object.keys(e.uploads).forEach((e=>t("unconfirm",e)))},async remove({commit:e,dispatch:t},a){e("setRemoving",a),await n.A.delete(`api/packages/uploads/${a}`),await t("load"),e("setRemoved",a),await t("unconfirm",a)},async removeAll({state:e,commit:t,dispatch:a}){await Promise.all(Object.keys(e.uploads).map((async a=>{e.confirmed.includes(a)||(t("setRemoving",a),await n.A.delete(`api/packages/uploads/${a}`),t("setRemoved",a))}))),await a("load")}}};const R=["contao/core-bundle","contao/installation-bundle","contao/conflicts"],U=e=>e.includes("/")&&!R.includes(e),q=(e,t)=>U(e)&&!t.packageFeature(e);var j={namespaced:!0,modules:{details:I.A,uploads:B},state:{root:null,local:null,installed:null,required:{},add:{},change:{},update:[],remove:[]},getters:{hasRoot:e=>!!e.root,packageInstalled:(e,t)=>a=>Object.keys(e.installed).includes(a)&&!t.packageMissing(a),versionInstalled:e=>(t,a)=>Object.keys(e.installed).includes(t)&&e.installed[t].version===a,packageRoot:e=>t=>!!e.root&&Object.keys(e.root.require).includes(t),packageRequired:e=>t=>Object.keys(e.required).includes(t)&&!!e.required[t].constraint,packageMissing:e=>t=>Object.keys(e.required).includes(t)&&!e.required[t].constraint,packageAdded:e=>t=>Object.keys(e.add).includes(t),packageChanged:e=>t=>Object.keys(e.change).includes(t),packageUpdated:e=>t=>e.update.includes(t),packageRemoved:e=>t=>e.remove.includes(t),packageFeatures:()=>e=>P.A[e]?P.A[e]:[],packageFeature:(e,t)=>e=>!!Object.keys(P.A).find((a=>P.A[a].includes(e)&&(t.packageInstalled(a)||t.packageRequired(a)))),packageVisible:(e,t)=>e=>q(e,t),packageSuggested:e=>t=>!!Object.values(e.local||{}).concat(Object.values(e.add||{})).find((e=>e.type&&("contao-"===e.type.substr(0,7)||"contao/"===e.name.substr(0,7))&&e.suggest&&Object.prototype.hasOwnProperty.call(e.suggest,t))),totalChanges:e=>Object.keys(e.add).filter(U).length+Object.keys(e.required).filter(U).length+Object.keys(e.change).filter(U).length+e.update.length+e.remove.length-Object.values(e.add).filter((t=>Object.keys(e.required).includes(t.name))).length-Object.values(e.change).filter((t=>Object.keys(e.required).includes(t.name))).length-e.remove.filter((t=>Object.keys(e.required).includes(t))).length,totalRequired:e=>Object.keys(e.required).length-Object.values(e.add).filter((t=>Object.keys(e.required).includes(t.name))).length-Object.values(e.change).filter((t=>Object.keys(e.required).includes(t.name))).length-e.remove.filter((t=>Object.keys(e.required).includes(t))).length,canResetChanges:(e,t)=>t.totalChanges>t.totalRequired,visibleRequired:(e,t)=>Object.values(e.required).filter((e=>q(e.name,t))),visibleInstalled:(e,t)=>Object.values(t.installed).filter((e=>q(e.name,t))),visibleAdded:(e,t)=>Object.values(e.add).filter((e=>q(e.name,t))),installed:e=>{if(!e.root||!e.installed)return{};const t={};return Object.keys(e.root.require).forEach((a=>{a.includes("/")&&e.installed[a]&&(t[a]={name:a,version:!1,constraint:e.root.require[a]},t[a]=Object.assign(t[a],e.installed[a]))})),t},packageConstraint:(e,t)=>e=>t.packageConstraintAdded(e)||t.packageConstraintChanged(e)||t.packageConstraintInstalled(e)||t.packageConstraintRequired(e),packageConstraintAdded:(e,t)=>a=>t.packageAdded(a)?e.add[a].constraint:null,packageConstraintChanged:(e,t)=>a=>t.packageChanged(a)?e.change[a]:null,packageConstraintInstalled:(e,t)=>e=>t.packageInstalled(e)&&t.packageRoot(e)?t.installed[e].constraint:null,packageConstraintRequired:(e,t)=>a=>t.packageRequired(a)?null:t.packageChanged(a)?t.constraintChanged(a):e.required[a]?.constraint,contaoConstraint:(e,t)=>t.packageConstraint("contao/manager-bundle")?(0,O.coerce)(t.packageConstraint("contao/manager-bundle"),{includePrerelease:!0}).toString():"",contaoSupported:(e,t)=>e=>!e||(0,O.intersects)(e,t.contaoConstraint,!0)},mutations:{setInstalled(e,{root:t,local:a,missing:s}){const o={},n={};a&&Object.keys(a).forEach((e=>{!1===a[e].version?n[e]=a[e]:o[e]=a[e]})),t&&Object.keys(t.require).forEach((e=>{e.includes("/")&&(Object.prototype.hasOwnProperty.call(o,e)||Object.prototype.hasOwnProperty.call(n,e)||(n[e]={name:e,constraint:t.require[e]}))})),s&&s.forEach((e=>{n[e]={name:e,constraint:null}})),e.root=t,e.local=a,e.installed=o,e.required=n},clearInstalled(e){e.root=null,e.local=null,e.installed=null,e.required={}},add(e,t){e.add[t.name]=t},change(e,{name:t,version:a}){this.commit("packages/restore",t),e.change[t]=a},update(e,t){this.commit("packages/restore",t),e.update.push(t)},remove(e,t){this.commit("packages/restore",t),e.remove.push(t)},restore(e,t){delete e.add[t],delete e.change[t],e.remove.includes(t)&&e.remove.splice(e.remove.indexOf(t),1),e.update.includes(t)&&e.update.splice(e.update.indexOf(t),1)},reset(e){e.add={},e.change={},e.update=[],e.remove=[]}},actions:{async metadata({state:e,dispatch:t},a){const s=a.name;if(a&&!a.source&&a.extra&&a.extra["contao-metadata-url"])return a;const o=await t("algolia/getPackage",s,{root:!0});if(!o)return a;const n=e=>e.version&&(0,O.valid)(e.version)?(0,O.parse)(e.version):e.version_normalized?(0,O.coerce)(e.version_normalized,{loose:!0}):null,i=e.change[s]||e.root?.require[s],l=e.installed?n(a):null;if(o.update=null,o.versions&&i&&"dev-"!==i.substr(0,4)&&"-dev"!==i.substr(-4)){let e;o.update={valid:!0,latest:!0,version:null,time:null},i&&l&&(e=o.versions.filter((e=>e.version===l.version||(0,O.satisfies)(n(e),i))).pop(),e?(o.update.version=e.version,o.update.time=e.time,o.update.latest=(0,O.eq)(n(e),l),o.latest&&o.latest.version&&(o.latest.active=(0,O.eq)(n(e),o.latest.version))):o.update.valid=!1)}const r=Object.assign({},o,{dependents:a.dependents||o.dependents,conflict:a.conflict||o.conflict,require:a.require||o.require,"require-dev":a["require-dev"]||o["require-dev"],suggest:o.suggest});return a.suggest&&(r.suggest={},Object.keys(a.suggest).forEach((e=>{r.suggest[e]=o.suggest&&o.suggest[e]||a.suggest[e]}))),r},async load({state:e,commit:t,getters:a},s=!0){t("clearInstalled"),t("algolia/reset",null,{root:!0}),s&&t("reset");const o=[n.A.get("api/packages/root"),n.A.get("api/packages/local"),n.A.get("api/packages/missing")];t("setInstalled",{root:(await o[0]).data,local:(await o[1]).data,missing:(await o[2]).data}),s||(Object.keys(e.add).forEach((e=>{a.packageInstalled(e)&&(t("restore",e),t("update",e))})),Object.keys(e.change).forEach((s=>{a.versionInstalled(s,e.change[s])&&(t("restore",s),t("update",s))})),e.remove.forEach((e=>{a.packageInstalled(e)||t("restore",e)})))},apply({state:e,dispatch:t},a={dry_run:!1,update_all:!1}){const s=Object.assign({},e.change),o=Array.from(e.remove),n=Array.from(e.update).concat(Object.keys(e.required),Object.keys(e.change).filter((t=>!Object.keys(e.required).includes(t))),Array.from(e.remove).filter((t=>!Object.keys(e.required).includes(t))));Object.keys(e.add).forEach((t=>{s[e.add[t].name]=e.add[t].constraint||null,n.push(e.add[t].name)})),Object.keys(P.A).forEach((t=>{P.A[t].forEach((a=>{if(e.root&&Object.keys(e.root.require).includes(a)||e.installed&&Object.keys(e.installed).includes(a))return n.includes(t)&&n.push(a),void(s[t]?s[a]=s[t]:o.includes(t)&&o.push(a));Object.prototype.hasOwnProperty.call(s,a)&&(n.includes(a)||n.push(a),!Object.prototype.hasOwnProperty.call(s,t)&&e.root?.require[t]?s[a]=e.root.require[t]:Object.prototype.hasOwnProperty.call(s,t)&&(s[a]=s[t]))}))}));const i={require:s,remove:o,uploads:!0,dry_run:!!a.dry_run};a.update_all||(i.update=n);const l={name:"composer/update",config:i};return t("tasks/execute",l,{root:!0})},updateAll({state:e,getters:t,commit:a}){Object.keys(e.root.require).forEach((e=>{q(e,t)&&a("update",e)}))}}};const D=(e,{commit:t})=>new Promise(((a,s)=>{e.then((e=>{t("setCache",e.data["access-key"]),t("setIsEnabled",""!==e.data["access-key"]),a(e.data["access-key"])})).catch((()=>{t("setIsEnabled",!1),s()}))}));var V={namespaced:!0,state:{cache:null,isEnabled:null},mutations:{setCache(e,t){e.cache=t},setIsEnabled(e,t){e.isEnabled=t}},actions:{get(e,t=!0){return t&&e.state.cache?Promise.resolve(e.state.cache):e.rootState.safeMode||e.rootState.server.contao.contaoApi.version<1||!e.rootState.server.contao.contaoApi.features?.["contao/manager-bundle"]?.["dot-env"]?.includes("APP_DEV_ACCESSKEY")?Promise.reject():D(n.A.get("api/contao/access-key"),e)},set(e,t){return D(n.A.put("api/contao/access-key",t),e)},delete(e){return D(n.A.delete("api/contao/access-key"),e)}}},W={namespaced:!0,state:{cache:null,isSupported:null,isLocked:null},mutations:{setCache(e,t){e.cache=t,e.isSupported=!t&&null,e.isLocked=null,t&&200===t.status&&(e.isSupported=!0,e.isLocked=!0===t.data.locked)}},actions:{fetch(e,t=!0){if(t&&e.state.cache)return Promise.resolve(e.state.cache);if(e.rootState.safeMode)return e.commit("setCache"),Promise.resolve();const a=t=>(e.commit("setCache",t),Promise.resolve(t));return n.A.get("api/contao/install-tool/lock").then(a).catch((e=>a(e.response)))},lock(e){const t=t=>(e.commit("setCache",t),Promise.resolve(t));return n.A.put("api/contao/install-tool/lock").then(t).catch((e=>t(e.response)))},unlock(e){const t=t=>(e.commit("setCache",t),Promise.resolve(t));return n.A.delete("api/contao/install-tool/lock").then(t).catch((e=>t(e.response)))}}};const Q=(e,{commit:t})=>new Promise(((a,s)=>{e.then((e=>{t("setCache",e.data),t("setIsDebugEnabled",204!==e.status&&e.data.debug),a(e.data)})).catch((()=>{t("setIsDebugEnabled",!1),s()}))}));var H={namespaced:!0,state:{cache:null,isDebugEnabled:null},mutations:{setCache(e,t){e.cache=t},setIsDebugEnabled(e,t){e.isDebugEnabled=t}},actions:{get(e,t=!0){return t&&e.state.cache?Promise.resolve(e.state.cache):e.rootState.safeMode||e.rootState.server.contao.contaoApi.version<2||!e.rootState.server.contao.contaoApi.features?.["contao/manager-bundle"]?.["jwt-cookie"]?.includes("debug")?Promise.reject():Q(n.A.get("api/contao/jwt-cookie"),e)},enableDebug(e){return Q(n.A.put("api/contao/jwt-cookie",{debug:!0}),e)},disableDebug(e){return Q(n.A.put("api/contao/jwt-cookie",{debug:!1}),e)},delete(e){return Q(n.A.delete("api/contao/jwt-cookie"),e)}}};const G=(e,{commit:t})=>new Promise(((a,s)=>{e.then((e=>{t("setCache",e.data.enabled),t("setIsEnabled",!0===e.data.enabled),a(e.data.enabled)})).catch((()=>{t("setIsEnabled",!1),s()}))}));var N={namespaced:!0,state:{cache:null,isEnabled:null},mutations:{setCache(e,t){e.cache=t},setIsEnabled(e,t){e.isEnabled=t}},actions:{isEnabled(e,t=!0){return t&&e.state.cache?Promise.resolve(e.state.cache):e.rootState.safeMode?Promise.reject():G(n.A.get("api/contao/maintenance-mode"),e)},enable(e){return G(n.A.put("api/contao/maintenance-mode"),e)},disable(e){return G(n.A.delete("api/contao/maintenance-mode"),e)}}},z={namespaced:!0,state:{cache:null,loading:!1,supported:!1,files:[],restore:!1,restored:!1},getters:{hasBackups:e=>e.supported&&e.files&&e.files.length>0},mutations:{setLoading(e,t){e.loading=!!t},setCache(e,t){e.cache=t,e.loading=!1,e.supported=!t&&null,e.files=[],t&&200===t.status&&(e.supported=!0,e.files=t.data)},setRestore(e,t){e.restore=t},setRestored(e){e.restored=!0}},actions:{fetch({state:e,commit:t},a=!0){if(a&&e.cache)return new Promise((t=>{t(e.cache)}));const s=e=>(t("setCache",e),e);return t("setLoading",!0),n.A.get("api/contao/backup").then(s).catch((e=>s(e.response)))}}},K={namespaced:!0,modules:{"access-key":V,backup:z,"install-tool":W,"jwt-cookie":H,"maintenance-mode":N},state:{package:null,version:null},mutations:{installTheme(e,{package:t,version:a}){e.package=t,e.version=a}},actions:{install({commit:e,dispatch:t},a){e("installTheme",{package:null,version:null});const s={name:"contao/install",config:a};return t("config/composer/writeDefaults",null,{root:!0}).then((()=>t("tasks/execute",s,{root:!0})))}}},J={namespaced:!0,state:{cache:null},mutations:{setCache(e,t){e.cache=t}},actions:{get({state:e,commit:t},a=!0){return a&&e.cache?new Promise((t=>{t(e.cache)})):n.A.get("api/server/composer").then((e=>e.data)).then((e=>(t("setCache",e),e)))}}},Z={namespaced:!0,state:{cache:null},mutations:{setCache(e,t){e.cache=t}},actions:{async get({state:e,commit:t},a=!0){if(a&&e.cache)return e.cache;const s=(await n.A.get("api/server/config")).data;return t("setCache",s),s},async set({commit:e},t){try{const a=(await n.A.put("api/server/config",t)).data;return e("setCache",a),a}catch(a){if(!a.response)throw a;return a.response.data}}}},Y={namespaced:!0,state:{cache:null,contaoVersion:null,contaoApi:null,contaoConfig:null},getters:{badgeTitle:e=>e.contaoConfig?.backend?.badge_title},mutations:{setCache(e,t){e.cache=t,e.contaoVersion=null,e.contaoApi=null,e.contaoConfig=null,t&&(e.contaoVersion=t.data.version,e.contaoApi=t.data.api,e.contaoConfig=t.data.config)}},actions:{get({state:e,commit:t},a=!0){if(a&&e.cache)return new Promise((t=>{t(e.cache)}));const s=e=>(t("setCache",e),e);return n.A.get("api/server/contao").then(s).catch((e=>s(e.response)))},documentRoot(e,{directory:t,usePublicDir:a=!1}){const s={usePublicDir:a};return t&&(s.directory=t),n.A.post("api/server/contao",s).catch((e=>e))}}},ee={namespaced:!0,state:{cache:null,loading:!1,supported:null,status:null,pattern:null,url:null},getters:{totalMigrations:e=>e.status&&"migration"===e.status.type?e.status.total:0,totalSchemaUpdates:e=>e.status&&"schema"===e.status.type?e.status.total:0,hasError:e=>!!e.status&&("error"===e.status.type||"problem"===e.status.type),hasWarning:e=>!!e.status&&e.status.warnings>0,hasChanges:(e,t)=>!!t.totalMigrations||!!t.totalSchemaUpdates,totalChanges:(e,t)=>t.totalMigrations+t.totalSchemaUpdates,accessProblem:e=>!!e.status&&"error"===e.status.type&&e.status.message.toLowerCase().includes("access denied")},mutations:{setLoading(e,t){e.loading=!!t},setCache(e,t){e.cache=t,e.loading=!1,e.supported=!t&&null,e.status=null,e.url=null,t&&200===t.status&&(e.supported=!0,e.status=t.data.status,e.pattern=t.data.pattern,e.url=t.data.url)}},actions:{get({state:e,commit:t},a=!0){if(a&&e.cache)return new Promise((t=>{t(e.cache)}));const s=e=>(t("setCache",e),e);return t("setLoading",!0),n.A.get("api/server/database").then(s).catch((e=>s(e.response)))},set({commit:e},t){const a=t=>(e("setCache",t),t);return e("setLoading",!0),n.A.post("api/server/database",{url:t}).then(a).catch((e=>a(e.response)))}}},te={namespaced:!0,state:{cache:null,supported:!1,hasUser:null},mutations:{setCache(e,t){e.cache=t,e.supported=!1,e.hasUser=null,!t||200!==t.status&&201!==t.status||(e.supported=!0,e.hasUser=!!t.data.hasUser)}},actions:{get({state:e,commit:t},a=!0){if(a&&e.cache)return new Promise((t=>{t(e.cache)}));const s=e=>(t("setCache",e),e);return n.A.get("api/server/admin-user").then(s).catch((e=>s(e.response)))},set({commit:e},t){const a=t=>(e("setCache",t),t);return n.A.post("api/server/admin-user",t).then(a).catch((e=>a(e.response)))}}},ae={namespaced:!0,state:{cache:null},mutations:{setCache(e,t){e.cache=t}},actions:{get({state:e,commit:t},a=!0){return a&&e.cache?new Promise((t=>{t(e.cache)})):n.A.get("api/server/opcache").then((e=>e.data)).then((e=>(t("setCache",e),e)))},delete({commit:e},t){return n.A.delete(`api/server/opcache?opcache_reset=${encodeURIComponent(t)}`).then((e=>e.data)).then((t=>(e("setCache",t),t)))}}},se={namespaced:!0,state:{cache:null},mutations:{setCache(e,t){e.cache=t}},actions:{get({state:e,commit:t},a=!0){return a&&e.cache?new Promise((t=>{t(e.cache)})):n.A.get("api/server/php-cli").then((e=>e.data)).then((e=>(t("setCache",e),e)))}}},oe={namespaced:!0,state:{cache:null},mutations:{setCache(e,t){e.cache=t}},actions:{async get({state:e,commit:t},a=!0){if(a&&e.cache)return e.cache;const s=(await n.A.get("api/server/phpinfo",{responseType:"text"})).data;return t("setCache",s),s}}},ne={namespaced:!0,state:{cache:null,phpVersion:null,phpVersionId:null},mutations:{setCache(e,t){e.cache=t,e.phpVersion=null,e.phpVersionId=null,t&&200===t.status&&(e.phpVersion=t.data.version,e.phpVersionId=t.data.version_id)}},actions:{get({state:e,commit:t},a=!0){if(a&&e.cache)return new Promise((t=>{t(e.cache)}));const s=e=>(t("setCache",e),Promise.resolve(e));return n.A.get("api/server/php-web").then(s).catch((e=>s(e.response)))}}},ie={namespaced:!0,state:{cache:null},mutations:{setCache(e,t){e.cache=t}},actions:{get({state:e,commit:t},a=!0){return a&&e.cache?new Promise((t=>{t(e.cache)})):n.A.get("api/server/self-update").then((e=>e.data)).catch((e=>{if(501===e.response?.status)return{current_version:null,latest_version:null,channel:"dev",supported:!1,error:null};throw e})).then((e=>(t("setCache",e),e)))},async latest(){const e=await n.A.get("https://download.contao.org/contao-manager/stable/contao-manager.version");return e.data.version}}},le={namespaced:!0,modules:{composer:J,config:Z,contao:Y,database:ee,adminUser:te,opcache:ae,phpinfo:oe,"php-cli":se,"php-web":ne,"self-update":ie}};a(4628);let re,ce,ue,de=0,pe=!1;const ge=(e,t,a,s=5e3,o=1)=>{setTimeout((()=>{n.A.get("api/task",{timeout:5e3*o}).then((s=>re(s,e,t,a))).catch((s=>ce(s,e,t,a)))}),s)};re=(e,t,a,s)=>{if(de=0,204===e.status)return void a();if(!(e.data instanceof Object))return pe||t.commit("apiError",e,{root:!0}),void s();const o=e.data;switch(t.commit("setCurrent",o),o.status){case"paused":break;case"active":case"aborting":ge(t,a,s);break;case"terminated":case"complete":o.autoclose&&"1"===window.localStorage.getItem("contao_manager_autoclose")&&t.dispatch("deleteCurrent"),a(o);break;case"stopped":case"error":s(o);break;default:s(o);break}},ce=(e,t,a,s)=>{e.request&&!e.response&&(de+=1,de<=5)?ge(t,a,s,5e3,de+1):(pe||t.commit("setStatus","failed"),s())};var he={namespaced:!0,state:{status:null,current:null,deleting:!1,initialized:!1},mutations:{setStatus(e,t){e.status=t},setCurrent(e,t){e.deleting=!1,e.current=t,e.status=t?t.status:null},setDeleting(e,t){e.deleting=!!t},setInitialized(e,t){e.initialized=!!t}},actions:{async init(e){if(e.state.initialized)return Promise.resolve();if(ue)return ue.promise;ue=Promise.withResolvers();const t=()=>{e.commit("setInitialized",!0),ue.resolve(),ue=null};return ge(e,t,t),ue.promise},execute(e,t){return null!==e.state.status?Promise.reject():(ue=Promise.withResolvers(),pe=!!t.ignoreErrors,delete t.ignoreErrors,e.commit("setCurrent",t),e.commit("setStatus","created"),n.A.put("api/task",t).then((t=>re(t,e,ue.resolve,ue.reject))).catch((t=>ce(t,e,ue.resolve,ue.reject))),ue.promise)},abort(e){return null===e.state.status?Promise.reject():(e.commit("setStatus","aborting"),ue||(ue=Promise.withResolvers()),n.A.patch("api/task",{status:"aborting"}).then((t=>re(t,e,ue.resolve,ue.reject))).catch((t=>ce(t,e,ue.resolve,ue.reject))),ue.promise)},continue(e){if(!ue||!e.state.current?.continuable)return Promise.reject();e.commit("setStatus","active"),n.A.patch("api/task",{status:"active"}).then((t=>re(t,e,ue.resolve,ue.reject))).catch((t=>ce(t,e,ue.resolve,ue.reject)))},async deleteCurrent({commit:e,dispatch:t},a=2){e("setDeleting",!0),ue&&(ue.resolve(),ue=null);try{await n.A.delete("api/task"),e("setCurrent",null),await t("server/contao/get",!1,{root:!0})}catch(s){const o=s.response;if(400===o.status)return void e("setCurrent",null);if(403===o.status&&a>0)return new Promise((e=>{setTimeout((()=>{e(t("deleteCurrent",a-1))}),5e3)}));"application/problem+json"===o.headers.get("Content-Type")?e("setError",o.data,{root:!0}):e("setError",{type:"about:blank",status:o.status,response:o},{root:!0})}}}};const me=(0,s.y$)({modules:{auth:E,algolia:X.A,cloud:S,config:T,modals:x.A,packages:j,contao:K,server:le,tasks:he},state:{view:o.A.INIT,setupStep:0,migrationsType:"",error:null,locked:!1,safeMode:!1},mutations:{setView(e,t){e.view=t,t===o.A.READY&&(e.setupStep=0)},setLocked(e){e.view=o.A.LOGIN,e.locked=!0},setError(e,t){t&&e.error||(e.error=t)},setSafeMode(e,t){e.safeMode=!!t},setup(e,t){e.view=o.A.SETUP,e.setupStep=t},checkMigrations(e,t=""){e.view=o.A.MIGRATION,e.migrationsType=t},apiError:(e,t)=>{if(!e.error)if("application/problem+json"===t.headers["content-type"]){const a=t.data;a.response=t,e.error=a}else e.error={type:"about:blank",status:t.status||"",response:t}}},actions:{reset({commit:e}){e("server/composer/setCache"),e("server/config/setCache"),e("server/contao/setCache"),e("server/database/setCache"),e("server/adminUser/setCache"),e("server/opcache/setCache"),e("server/phpinfo/setCache"),e("server/php-cli/setCache"),e("server/php-web/setCache"),e("server/self-update/setCache"),e("contao/install-tool/setCache"),e("contao/backup/setCache"),e("tasks/setInitialized",!1),e("cloud/setStatus",null),e("setSafeMode",!1)}}});var ke=me},4676:function(e,t,a){a.d(t,{A:function(){return g}});var s=a(641),o=a(33),n=a(3751);const i={class:"button-group"},l=["disabled"];function r(e,t,a,r,c,u){const d=(0,s.g2)("loading-button");return(0,s.uX)(),(0,s.CE)("div",i,[(0,s.bF)(d,{href:a.href,to:a.to,class:(0,o.C4)(u.primaryClass),onClick:t[0]||(t[0]=t=>e.$emit("click",t)),disabled:a.disabled,loading:a.loading,submit:a.submit},{default:(0,s.k6)((()=>[(0,s.eW)((0,o.v_)(a.label),1)])),_:1},8,["href","to","class","disabled","loading","submit"]),(0,s.Lk)("button",{type:"button",class:(0,o.C4)(u.moreClass),onClick:t[1]||(t[1]=(...e)=>u.toggle&&u.toggle(...e)),disabled:a.moreDisabled},t[4]||(t[4]=[(0,s.Lk)("svg",{fill:"#FFF",height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,s.Lk)("path",{d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"}),(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"})],-1)]),10,l),(0,s.bo)((0,s.Lk)("div",{ref:"group",class:(0,o.C4)({"button-group__group":!0,["button-group__group--top"]:a.alignTop}),tabindex:"-1",onFocusout:t[2]||(t[2]=(...e)=>u.close&&u.close(...e)),onClick:t[3]||(t[3]=(...e)=>u.close&&u.close(...e))},[(0,s.RG)(e.$slots,"default")],34),[[n.aG,e.showGroup]])])}var c=a(85),u={components:{LoadingButton:c.A},emits:["click"],props:{label:{type:String,required:!0},type:String,href:String,to:[String,Object],icon:String,color:String,disabled:Boolean,loading:Boolean,submit:Boolean,moreDisabled:Boolean,alignTop:Boolean},data:()=>({showGroup:!1}),computed:{primaryClass(){let e="widget-button button-group__primary";return this.type&&(e+=` widget-button--${this.type}`),this.icon&&(e+=` widget-button--${this.icon}`),this.color&&(e+=` widget-button--${this.color}`),e},moreClass(){let e="widget-button button-group__more";return this.type&&(e+=` widget-button--${this.type}`),this.color&&(e+=` widget-button--${this.color}`),e}},methods:{open(){this.showGroup=!0,setTimeout((()=>this.$refs.group?.focus()),0)},close(e){e&&this.$refs.group?.contains(e.relatedTarget)||(this.$refs.group?.blur(),setTimeout((()=>{this.showGroup=!1}),100))},toggle(){this.showGroup?this.close():this.open()}}},d=a(6262);const p=(0,d.A)(u,[["render",r]]);var g=p},4710:function(e,t,a){var s=a(4335),o=a(4173);const n=new Proxy(s.A,{get(e,t){const a={request:1,get:2,delete:2,head:2,options:2,post:3,put:3,patch:3};return Object.keys(a).includes(t)?async(...s)=>{let n,i={};s.length>a[t]&&(i=s.pop());try{n=await e[t](...s)}catch(l){n=l.response}return i[n.status]?i[n.status](n):(n.status>=400&&n.status<=599&&o.A.commit("apiError",n),n)}:Reflect.get(...arguments)}});t.A=n},4960:function(e,t){t.A=e=>{let t=["KB","MB","GB"],a="Bytes";while(e>1024)e/=1024,a=t.shift();return`${Math.round(100*e)/100} ${a}`}},5062:function(e,t,a){a.d(t,{A:function(){return v}});var s=a(641),o=a(33),n=a(3751);const i={key:0,class:"package-constraint"},l=["placeholder","title","disabled"],r=["title","disabled"];function c(e,t,a,c,u,d){return!e.isFeature&&e.isVisible?((0,s.uX)(),(0,s.CE)("fieldset",i,[(0,s.bo)((0,s.Lk)("input",{ref:"constraint",type:"text",placeholder:d.inputPlaceholder,title:d.inputTitle,"onUpdate:modelValue":t[0]||(t[0]=e=>d.inputValue=e),class:(0,o.C4)({disabled:!a.emit&&(e.willBeRemoved||!e.isInstalled&&!e.willBeInstalled&&!e.isRequired||e.isUpload||!e.isGranted(d.scopes.INSTALL)),error:e.constraintError}),disabled:!e.constraintEditable||e.willBeRemoved||!a.emit&&!e.isInstalled&&!e.willBeInstalled&&!e.isRequired||e.isUpload||!e.isGranted(d.scopes.INSTALL),onKeypress:[t[1]||(t[1]=(0,n.jR)((0,n.D$)(((...e)=>d.saveConstraint&&d.saveConstraint(...e)),["prevent"]),["enter"])),t[2]||(t[2]=(0,n.jR)((0,n.D$)(((...e)=>d.resetConstraint&&d.resetConstraint(...e)),["prevent"]),["esc"]))],onBlur:t[3]||(t[3]=(...e)=>d.saveConstraint&&d.saveConstraint(...e))},null,42,l),[[n.Jo,d.inputValue]]),(0,s.Lk)("button",{class:(0,o.C4)({"widget-button widget-button--gear":!0,rotate:e.constraintValidating}),title:d.buttonTitle,onClick:t[4]||(t[4]=(...e)=>d.editConstraint&&d.editConstraint(...e)),disabled:!a.emit&&(e.willBeRemoved||!e.isInstalled&&!e.willBeInstalled&&!e.isRequired||e.isUpload||!e.isGranted(d.scopes.INSTALL))},(0,o.v_)(d.buttonValue),11,r)])):(0,s.Q3)("",!0)}var u=a(6278),d=a(4335),p=a(70),g=a(8200),h={mixins:[g.A],emits:["update:modelValue"],props:{data:{type:Object,required:!0},emit:{type:Boolean,default:!1},modelValue:{type:String,default:""}},data:()=>({constraint:"",constraintEditable:!1,constraintValidating:!1,constraintError:!1}),computed:{...(0,u.L8)("auth",["isGranted"]),scopes:()=>p.A,buttonTitle:e=>e.isUpload?e.$t("ui.package.uploadConstraint"):"",buttonValue:e=>e.isUpload?e.$t("ui.package.editConstraint"):e.$t("ui.package.private"),inputTitle:e=>e.isUpload?e.$t("ui.package.privateTitle"):e.constraint,inputPlaceholder:e=>e.isUpload||e.$store.state.packages.root&&Object.keys(e.$store.state.packages.root.require).includes(e.data.name)?"":e.$t("ui.package.latestConstraint"),inputValue:{get:e=>e.isUpload?e.$t("ui.package.private"):e.constraint,set(e){this.isUpload||(this.constraint=e)}}},methods:{editConstraint(){this.constraintValidating||(this.constraintEditable=!0,setTimeout((()=>{this.$refs.constraint.focus()}),0))},async saveConstraint(){if(this.constraintEditable){if(this.constraintEditable=!1,this.constraintError=!1,!this.emit&&(this.isInstalled&&(!this.constraint||this.constraintInstalled===this.constraint)||this.isRequired&&(!this.constraint||this.constraintRequired===this.constraint)))return this.$store.commit("packages/restore",this.data.name),this.$store.dispatch("packages/uploads/unconfirm",this.data.name),void this.resetConstraint();if(!this.emit&&!this.isRequired&&this.willBeInstalled&&!this.constraint)return this.$store.commit("packages/add",Object.assign({},this.data,{constraint:null})),void this.resetConstraint();if(this.emit&&!this.constraint)return this.$emit("update:modelValue",this.constraint),void this.resetConstraint();this.$refs.constraint.blur(),this.constraintValidating=!0;try{const e=await d.A.post("api/constraint",{constraint:this.constraint});this.constraintValidating=!1,e.data.valid?this.emit?this.$emit("update:modelValue",this.constraint):this.isRootInstalled||this.isRequired?this.$store.commit("packages/change",{name:this.data.name,version:this.constraint}):this.$store.commit("packages/add",Object.assign({},this.data,{constraint:this.constraint})):(this.constraintError=!0,setTimeout((()=>this.editConstraint()),0))}catch(e){this.constraintValidating=!1,this.constraintError=!0,setTimeout((()=>this.editConstraint()),0)}}},resetConstraint(){this.emit?this.constraint=this.modelValue:this.willBeInstalled?this.constraint=this.constraintAdded:this.isChanged?this.constraint=this.constraintChanged:this.isInstalled?this.constraint=this.constraintInstalled:this.isRequired&&(this.constraint=this.constraintRequired),this.constraintEditable&&(this.constraintEditable=!1,this.constraintError=!1,this.constraintValidating=!1)}},watch:{modelValue(e){this.constraint=e},constraintAdded(e){this.constraint=e},constraintChanged(e){this.constraint=e||this.constraintInstalled||this.constraintRequired}},mounted(){this.resetConstraint()}},m=a(6262);const k=(0,m.A)(h,[["render",c],["__scopeId","data-v-45700166"]]);var v=k},5761:function(e,t,a){a.d(t,{A:function(){return v}});var s=a(641),o=a(33);function n(e,t,a,n,i,l){const r=(0,s.g2)("confirm-button");return e.isGranted(l.scopes.INSTALL)?((0,s.uX)(),(0,s.Wv)(r,{key:0,color:"primary",icon:"add",small:a.small,inline:a.inline,disabled:a.disabled||e.isRootInstalled||e.isAdded||e.isRequired||!e.canBeInstalled,onClick:e.install},{default:(0,s.k6)((()=>[(0,s.eW)((0,o.v_)(e.$t(a.small?"ui.package.installButtonShort":"ui.package.installButton")),1)])),_:1},8,["small","inline","disabled","onClick"])):(0,s.Q3)("",!0)}var i=a(6278),l=a(70),r=a(8200);const c=["disabled"];function u(e,t,a,n,i,l){return(0,s.uX)(),(0,s.CE)("button",{type:"button",class:(0,o.C4)(l.buttonClass),disabled:a.disabled,onClick:t[0]||(t[0]=(...e)=>l.click&&l.click(...e))},[(0,s.Lk)("span",{class:(0,o.C4)(l.slotClass)},[(0,s.RG)(e.$slots,"default")],2),(0,s.Lk)("span",{class:(0,o.C4)(["confirm-button__icon",{"confirm-button__icon--confirm":e.confirm}])},t[1]||(t[1]=[(0,s.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,s.Lk)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)]),2)],10,c)}var d={emits:["click"],props:{color:String,icon:String,inline:Boolean,small:Boolean,disabled:Boolean},data:()=>({confirm:!1}),computed:{buttonClass:e=>({"confirm-button":!0,"widget-button":!0,"widget-button--inline":e.inline,"widget-button--small":e.small,[`widget-button--${e.color}`]:e.color}),slotClass:e=>({[`widget-button--${e.icon}`]:e.icon})},methods:{click(e){this.confirm||(e.preventDefault(),e.target.blur(),this.$emit("click",e),this.confirm=!0,setTimeout((()=>{this.confirm=!1}),1e3))}}},p=a(6262);const g=(0,p.A)(d,[["render",u]]);var h=g,m={components:{ConfirmButton:h},mixins:[r.A],props:{data:{type:Object,required:!0},small:Boolean,inline:Boolean,disabled:Boolean},computed:{...(0,i.L8)("auth",["isGranted"]),scopes:()=>l.A}};const k=(0,p.A)(m,[["render",n]]);var v=k},6894:function(e,t,a){e.exports=a.p+"img/logo.d9707286.svg"},7473:function(e,t,a){var s=a(4335),o=a(5633),n=a(3192),i=a(5220),l=a(3723),r=a(641),c=a(33);const u={key:0},d=["href"];function p(e,t,a,s,o,n){const i=(0,r.g2)("install-button"),l=(0,r.g2)("discover-list");return(0,r.uX)(),(0,r.Wv)(l,{wrapper:n.wrapper,"hide-themes":""},{"package-hint":(0,r.k6)((({data:t})=>[e.contaoSupported(t.contaoConstraint)?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("p",u,(0,c.v_)(e.$t("ui.package.incompatible",{package:t.name,constraint:e.packageConstraint("contao/manager-bundle")})),1))])),"package-actions":(0,r.k6)((({data:t})=>[t&&t.private&&!e.packageSuggested(t.name)?((0,r.uX)(),(0,r.CE)("a",{key:0,class:"widget-button widget-button--small widget-button--primary widget-button--link",target:"_blank",href:t.homepage},(0,c.v_)(e.$t("ui.package.homepage")),9,d)):((0,r.uX)(),(0,r.Wv)(i,{key:1,small:"",inline:"",data:t},null,8,["data"]))])),_:1},8,["wrapper"])}var g=a(6278),h=a(6894);const m={class:"layout-main"},k={class:"layout-main__logo"},v={class:"layout-main__title"},b={key:0,class:"layout-main__badge-title"},_={key:0,class:"layout-main__subheader"},f={class:"layout-main__subheader-inside"},w={key:0,class:"layout-main__news"},y=["href","title"],C=["src","alt"],$={class:"layout-main__content"};function L(e,t,a,s,o,n){const i=(0,r.g2)("navigation-fragment"),l=(0,r.g2)("footer-fragment");return(0,r.uX)(),(0,r.CE)("div",m,[(0,r.Lk)("header",{class:(0,c.C4)(["layout-main__header",{"layout-main__header--margin":!e.$slots.search,"layout-main__has-badge-title":e.badgeTitle}])},[(0,r.Lk)("div",k,[t[1]||(t[1]=(0,r.Lk)("img",{src:h,width:"40",height:"40",alt:"Contao Logo"},null,-1)),(0,r.Lk)("span",v,[t[0]||(t[0]=(0,r.Lk)("span",{class:"layout-main__manager-title"},"Contao Manager",-1)),e.badgeTitle?((0,r.uX)(),(0,r.CE)("span",b,(0,c.v_)(e.badgeTitle),1)):(0,r.Q3)("",!0)])]),(0,r.bF)(i)],2),e.$slots.search?((0,r.uX)(),(0,r.CE)("div",_,[(0,r.Lk)("div",f,[n.currentNews?((0,r.uX)(),(0,r.CE)("div",w,[(0,r.Lk)("a",{href:n.currentNews.url,title:n.currentNews.title,target:"_blank",rel:"noreferrer noopener"},[(0,r.Lk)("img",{src:n.currentNews.image,width:"320",height:"50",alt:n.currentNews.title},null,8,C)],8,y)])):(0,r.Q3)("",!0),(0,r.RG)(e.$slots,"search")])])):(0,r.Q3)("",!0),(0,r.Lk)("main",$,[(0,r.RG)(e.$slots,"default")]),(0,r.bF)(l,{display:"main"})])}var A=a(3751);const E={id:"main-navigation",role:"navigation",class:"navigation"},X={ref:"menu",class:"navigation__group navigation__group--main"},S={key:0,class:"navigation__item-badge"},M={key:0,class:"navigation__item-badge"},T={class:"navigation__item navigation__item--main navigation__item--children"},x={class:"navigation__group navigation__group--sub"},O={key:0,class:"navigation__item navigation__item--sub"},I=["href"],P={key:1,class:"navigation__item navigation__item--sub"},F={href:"/app_dev.php/",target:"_blank"},B={key:2,class:"navigation__item navigation__item--sub"},R=["href"],U={key:3,class:"navigation__item navigation__item--sub"},q=["href"],j={class:"navigation__item navigation__item--sub"},D={class:"navigation__item navigation__item--main navigation__item--children navigation__item--icon"},V={class:"navigation__group navigation__group--sub navigation__group--right"},W={class:"navigation__item navigation__item--sub"},Q={class:"navigation__item navigation__item--sub"};function H(e,t,a,s,o,n){const i=(0,r.g2)("navigation-item");return(0,r.uX)(),(0,r.CE)("nav",E,[(0,r.Lk)("button",{class:"navigation__toggle",onClick:t[0]||(t[0]=(0,A.D$)(((...e)=>n.toggleNavigation&&n.toggleNavigation(...e)),["prevent"]))},t[4]||(t[4]=[(0,r.Lk)("span",null,null,-1)])),(0,r.Lk)("ul",X,[(0,r.bF)(i,{to:e.routes.discover,onNavigate:n.closeNavigation},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.navigation.discover")),1)])),_:1},8,["to","onNavigate"]),(0,r.bF)(i,{to:e.routes.packages,onNavigate:n.closeNavigation},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.navigation.packages")),1),n.packageChanges>0?((0,r.uX)(),(0,r.CE)("span",S,(0,c.v_)(n.packageChanges),1)):(0,r.Q3)("",!0)])),_:1},8,["to","onNavigate"]),e.isGranted(n.scopes.UPDATE)?((0,r.uX)(),(0,r.Wv)(i,{key:0,to:e.routes.maintenance,onNavigate:n.closeNavigation},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.navigation.maintenance")),1),e.hasDatabaseChanges||e.hasDatabaseWarning||e.hasDatabaseError?((0,r.uX)(),(0,r.CE)("span",M,"1")):(0,r.Q3)("",!0)])),_:1},8,["to","onNavigate"])):(0,r.Q3)("",!0),(0,r.Lk)("li",T,[(0,r.Lk)("button",null,(0,c.v_)(e.$t("ui.navigation.tools")),1),(0,r.Lk)("ul",x,[e.safeMode?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("li",O,[(0,r.Lk)("a",{href:n.backendUrl},(0,c.v_)(e.$t("ui.navigation.backend")),9,I)])),!e.safeMode&&e.showAppDev?((0,r.uX)(),(0,r.CE)("li",P,[(0,r.Lk)("a",F,(0,c.v_)(e.$t("ui.navigation.debug")),1)])):(0,r.Q3)("",!0),!e.safeMode&&e.showPreview?((0,r.uX)(),(0,r.CE)("li",B,[(0,r.Lk)("a",{href:n.previewUrl,target:"_blank"},(0,c.v_)(e.$t("ui.navigation.debug")),9,R)])):(0,r.Q3)("",!0),!e.safeMode&&e.showInstallTool?((0,r.uX)(),(0,r.CE)("li",U,[(0,r.Lk)("a",{href:n.installToolUrl,target:"_blank"},(0,c.v_)(e.$t("ui.navigation.installTool")),9,q)])):(0,r.Q3)("",!0),(0,r.bF)(i,{to:e.routes.logViewer,sub:"",onNavigate:n.closeNavigation},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.navigation.logViewer")),1)])),_:1},8,["to","onNavigate"]),(0,r.Lk)("li",j,[(0,r.Lk)("a",{href:"#",onClick:t[1]||(t[1]=(0,A.D$)(((...e)=>n.phpinfo&&n.phpinfo(...e)),["prevent"]))},(0,c.v_)(e.$t("ui.navigation.phpinfo")),1)])])]),(0,r.Lk)("li",D,[(0,r.Lk)("button",null,[t[5]||(t[5]=(0,r.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 204.993 204.993"},[(0,r.Lk)("path",{d:"M113.711 202.935H92.163c-3.242 0-4.373.007-15.421-27.364l-8.532-3.468c-23.248 10.547-26 10.547-26.92 10.547h-1.779l-1.517-1.303-15.275-14.945c-2.323-2.319-3.128-3.124 8.825-30.137l-3.479-8.231C0 117.977 0 116.81 0 113.496V92.37c0-3.31 0-4.355 27.972-15.171l3.479-8.249c-12.644-26.602-11.774-27.428-9.28-29.776l16.427-16.105 2.04-.064c2.48 0 11.681 3.357 27.371 9.981l8.507-3.454C86.758 2.054 88.015 2.058 91.246 2.058h21.548c3.228 0 4.363.004 15.411 27.382l8.546 3.443c23.212-10.533 26-10.533 26.927-10.533h1.768l1.517 1.281 15.275 14.92c2.323 2.344 3.117 3.146-8.836 30.17l3.489 8.278c28.101 10.014 28.101 11.177 28.101 14.498v21.101c0 3.232 0 4.37-28.008 15.192l-3.457 8.256c12.58 26.487 11.749 27.317 9.394 29.69l-16.552 16.205-2.051.057c-2.469 0-11.649-3.361-27.317-9.992l-8.557 3.457c-10.27 27.472-11.437 27.472-14.733 27.472zm-19.308-8.722h16.996c1.95-3.976 6.166-14.516 9.541-23.595l.68-1.807 15.475-6.249 1.664.705c9.223 3.933 20.124 8.292 24.372 9.631l11.943-11.681c-1.517-4.205-6.116-14.494-10.264-23.173l-.837-1.764 6.403-15.285 1.743-.673c9.316-3.586 20.11-8.013 24.143-10.032V93.88c-4.08-1.918-14.831-6.009-24.096-9.294l-1.814-.648-6.445-15.3.769-1.725c3.965-8.947 8.375-19.501 9.788-23.753l-11.975-11.706c-3.865 1.349-14.688 5.987-23.817 10.153l-1.7.78-15.475-6.238-.691-1.721c-3.658-9.13-8.203-19.716-10.253-23.635H93.569c-1.961 3.965-6.163 14.509-9.53 23.585l-.669 1.797-15.432 6.27-1.664-.712c-9.244-3.926-20.167-8.278-24.429-9.616L29.923 43.805c1.496 4.198 6.109 14.48 10.243 23.159l.848 1.768-6.435 15.278-1.732.669c-9.301 3.582-20.077 8.006-24.111 10.017v16.431c4.08 1.925 14.82 6.027 24.079 9.326l1.8.655 6.446 15.249-.769 1.721c-3.965 8.94-8.371 19.48-9.788 23.724l12 11.742c3.854-1.36 14.663-5.998 23.803-10.168l1.711-.784 15.443 6.277.691 1.721c3.669 9.133 8.2 19.701 10.251 23.623zm8.092-56.56c-19.759 0-35.849-15.772-35.849-35.159 0-19.372 16.087-35.134 35.849-35.134 19.748 0 35.799 15.765 35.799 35.134 0 19.387-16.051 35.159-35.799 35.159zm0-61.563c-14.956 0-27.113 11.846-27.113 26.405 0 14.569 12.154 26.426 27.113 26.426 14.931 0 27.078-11.857 27.078-26.426-.004-14.559-12.147-26.405-27.078-26.405z"})],-1)),(0,r.Lk)("span",null,(0,c.v_)(e.$t("ui.navigation.advanced")),1)]),(0,r.Lk)("ul",V,[(0,r.bF)(i,{to:e.routes.userManager,sub:"",onNavigate:n.closeNavigation},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.navigation.users")),1)])),_:1},8,["to","onNavigate"]),(0,r.Lk)("li",W,[(0,r.Lk)("a",{href:"#",onClick:t[2]||(t[2]=(0,A.D$)(((...e)=>n.systemCheck&&n.systemCheck(...e)),["prevent"]))},(0,c.v_)(e.$t("ui.navigation.systemCheck")),1)]),(0,r.Lk)("li",Q,[(0,r.Lk)("a",{href:"#",onClick:t[3]||(t[3]=(0,A.D$)(((...e)=>n.doLogout&&n.doLogout(...e)),["prevent"]))},(0,c.v_)(e.$t("ui.navigation.logout")),1)])])])],512)])}var G=a(3936),N=a(707);const z=["href","onClick","onKeypress"];function K(e,t,a,s,o,n){const i=(0,r.g2)("router-link");return(0,r.uX)(),(0,r.Wv)(i,{to:a.to,custom:""},{default:(0,r.k6)((({isActive:t,href:s,navigate:o})=>[(0,r.Lk)("li",{class:(0,c.C4)({["navigation__item navigation__item--"+(a.sub?"sub":"main")]:!0,"router-link-active":t})},[(0,r.Lk)("a",{href:s,onClick:e=>n.go(o),onKeypress:(0,A.jR)((e=>n.go(o)),["enter"])},[(0,r.RG)(e.$slots,"default")],40,z)],2)])),_:3},8,["to"])}var J={props:{to:Object,sub:Boolean},methods:{go(e){this.$emit("navigate"),e()}}},Z=a(6262);const Y=(0,Z.A)(J,[["render",K]]);var ee=Y,te=a(70),ae={components:{NavigationItem:ee},data:()=>({routes:l.A,databaseChanges:0}),computed:{...(0,g.aH)(["safeMode"]),...(0,g.aH)("contao/install-tool",{showInstallTool:"isSupported"}),...(0,g.aH)("contao/access-key",{showAppDev:"isEnabled"}),...(0,g.aH)("contao/jwt-cookie",{showPreview:"isDebugEnabled"}),...(0,g.aH)("server/contao",["contaoConfig"]),...(0,g.L8)("auth",["isGranted"]),...(0,g.L8)("packages",["totalChanges"]),...(0,g.L8)("packages/uploads",["totalUploads"]),...(0,g.L8)("server/database",{hasDatabaseChanges:"hasChanges",hasDatabaseWarning:"hasWarning",hasDatabaseError:"hasError"}),scopes:()=>te.A,packageChanges:e=>e.totalChanges+e.totalUploads,backendUrl:e=>e.contaoConfig?.backend?.route_prefix||"/contao",previewUrl:e=>`${e.contaoConfig?.backend?.preview_script||"/preview.php"}/`,installToolUrl:e=>`${e.contaoConfig?.backend?.route_prefix||"/contao"}/install`},methods:{...(0,g.i0)("auth",["logout"]),toggleNavigation(){document.body.classList.toggle("nav-active")},closeNavigation(){document.body.classList.remove("nav-active")},phpinfo(){const e=window.open();e&&(e.document.open(),e.document.write('

'),e.document.write(this.$t("ui.navigation.phpinfoLoading")),e.document.write("

"),this.$store.dispatch("server/phpinfo/get").then((t=>{e.document.write(t),e.document.close(),e.document.body.removeChild(e.document.querySelector(".phpinfo__loading"))})))},systemCheck(){this.closeNavigation(),window.localStorage.removeItem("contao_manager_booted"),this.$store.commit("setView",N.A.BOOT)},doLogout(){this.closeNavigation(),this.logout()}},mounted(){new G.A({menuElement:this.$refs.menu,hoverType:"on",submenuItemSelector:".navigation__item--children"}),this.isGranted(te.A.UPDATE)&&(this.$store.dispatch("contao/install-tool/fetch"),this.$store.dispatch("contao/jwt-cookie/get").catch((()=>{})),this.$store.dispatch("contao/access-key/get").catch((()=>{})),this.$store.dispatch("server/database/get"))}};const se=(0,Z.A)(ae,[["render",H]]);var oe=se,ne=a(1218),ie={components:{NavigationFragment:oe,FooterFragment:ne.A},computed:{...(0,g.aH)("algolia",["news"]),...(0,g.L8)("server/contao",["badgeTitle"]),currentNews:e=>e.news.length?e.news[0]:null},mounted(){this.$store.dispatch("server/contao/get")}};const le=(0,Z.A)(ie,[["render",L]]);var re=le,ce=a(7930),ue=a(5761),de={components:{DiscoverList:ce.A,InstallButton:ue.A},computed:{...(0,g.L8)("packages",["packageSuggested","contaoSupported","packageConstraint"]),wrapper:()=>re}};const pe=(0,Z.A)(de,[["render",p]]);var ge=pe;const he={class:"package-list"},me={key:1,class:"package-list__headline"},ke={key:2,class:"package-list__headline"},ve={key:0,class:"package-actions__inner"},be={class:"package-actions__text"},_e=["disabled"],fe={key:1,class:"package-actions__inner"},we={class:"package-actions__text"},ye=["disabled"];function Ce(e,t,a,s,o,n){const i=(0,r.g2)("package-uploads"),l=(0,r.g2)("composer-package"),u=(0,r.g2)("loading-button"),d=(0,r.g2)("cloud-status"),p=(0,r.g2)("link-menu"),g=(0,r.g2)("button-group"),h=(0,r.g2)("package-base");return(0,r.uX)(),(0,r.Wv)(h,{onStartUpload:t[3]||(t[3]=e=>n.openFileSelector())},{actions:(0,r.k6)((()=>[e.hasUploads&&!e.uploading?((0,r.uX)(),(0,r.CE)("div",ve,[(0,r.Lk)("p",be,(0,c.v_)(e.$tc("ui.packages.uploadMessage",e.totalUploads)),1),(0,r.Lk)("button",{class:"package-actions__button widget-button widget-button--primary",disabled:!e.canConfirmUploads||n.removingUploads,onClick:t[0]||(t[0]=(...e)=>n.confirmUploads&&n.confirmUploads(...e))},(0,c.v_)(e.$t("ui.packages.uploadApply")),9,_e),(0,r.bF)(u,{class:"package-actions__button",color:"alert",loading:n.removingUploads,onClick:n.removeUploads},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.packages.uploadReset")),1)])),_:1},8,["loading","onClick"])])):e.totalChanges&&!e.uploading?((0,r.uX)(),(0,r.CE)("div",fe,[(0,r.bF)(d,{"button-class":"package-actions__button package-actions__button--cloud"}),(0,r.Lk)("p",we,(0,c.v_)(e.$tc("ui.packages.changesMessage",e.totalChanges)),1),(0,r.bF)(g,{class:"package-actions__button-group","align-top":"",type:"primary",icon:"update",loading:e.cloudLoading,disabled:e.cloudError,"more-disabled":e.cloudLoading||e.cloudError,label:e.$t("ui.packages.changesApply"),onClick:t[1]||(t[1]=t=>e.hasLockFile?n.applyChanges():n.applyChangesAll())},{default:(0,r.k6)((()=>[(0,r.bF)(p,{align:"right",valign:"top",items:n.applyActions,color:"primary"},null,8,["items"])])),_:1},8,["loading","disabled","more-disabled","label"]),(0,r.Lk)("button",{class:"package-actions__button widget-button widget-button--alert",disabled:!e.canResetChanges&&!e.confirmed.length,onClick:t[2]||(t[2]=(...e)=>n.resetChanges&&n.resetChanges(...e))},(0,c.v_)(e.$t("ui.packages.changesReset")),9,ye)])):(0,r.Q3)("",!0)])),default:(0,r.k6)((()=>[(0,r.Lk)("div",he,[!1!==e.uploads&&e.isGranted(n.scopes.INSTALL)?((0,r.uX)(),(0,r.Wv)(i,{key:0,ref:"uploader"},null,512)):(0,r.Q3)("",!0),n.hasAdded?((0,r.uX)(),(0,r.CE)("h2",me,(0,c.v_)(e.$t("ui.packagelist.added")),1)):(0,r.Q3)("",!0),((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.addedPackages,(e=>((0,r.uX)(),(0,r.Wv)(l,{data:e,key:e.name},null,8,["data"])))),128)),n.showHeadline?((0,r.uX)(),(0,r.CE)("h2",ke,(0,c.v_)(e.$t("ui.packagelist.installed")),1)):(0,r.Q3)("",!0),((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.installedPackages,(e=>((0,r.uX)(),(0,r.Wv)(l,{data:e,key:e.name},null,8,["data"])))),128))])])),_:1})}a(8111),a(2489);const $e={key:0,class:"package-tools"},Le=["disabled"],Ae=["disabled","title"];function Ee(e,t,a,s,o,n){const i=(0,r.g2)("main-layout");return(0,r.uX)(),(0,r.Wv)(i,null,{default:(0,r.k6)((()=>[e.isGranted(n.scopes.UPDATE)?((0,r.uX)(),(0,r.CE)("section",$e,[(0,r.RG)(e.$slots,"search",{},(()=>[(0,r.Lk)("button",{class:"package-tools__button widget-button widget-button--update",disabled:e.totalChanges>0||e.uploading,onClick:t[0]||(t[0]=(...t)=>e.updateAll&&e.updateAll(...t))},(0,c.v_)(e.$t("ui.packages.updateButton")),9,Le),(0,r.Lk)("button",{class:"package-tools__button widget-button widget-button--upload",disabled:!e.uploads||e.uploading||!e.isGranted(n.scopes.INSTALL),title:n.uploadError,onClick:t[1]||(t[1]=(0,A.D$)((t=>e.$emit("start-upload")),["prevent"]))},(0,c.v_)(e.$t("ui.packages.uploadButton")),9,Ae)]))])):(0,r.Q3)("",!0),(0,r.RG)(e.$slots,"default"),(0,r.Lk)("div",{class:(0,c.C4)({"package-actions":!0,"package-actions--active":!n.slotEmpty(e.$slots.actions)})},[(0,r.RG)(e.$slots,"actions")],2)])),_:3})}var Xe=a(9451),Se={components:{MainLayout:re},computed:{...(0,g.L8)("auth",["isGranted"]),...(0,g.L8)("packages",["totalChanges"]),...(0,g.aH)("packages/uploads",["uploads","uploading"]),scopes:()=>te.A,uploadError:e=>!1===e.uploads?e.$t("ui.packages.uploadUnsupported"):e.isGranted(te.A.INSTALL)?"":e.$t("ui.error.permission")},methods:{slotEmpty:Xe.A,...(0,g.i0)("packages",["updateAll"])}};const Me=(0,Z.A)(Se,[["render",Ee]]);var Te=Me,xe=a(7591);const Oe={key:0},Ie={class:"package-uploads__overlay"},Pe={key:0,class:"package-list__headline"};function Fe(e,t,a,s,o,n){const i=(0,r.g2)("file-upload"),l=(0,r.g2)("uploading-package"),u=(0,r.g2)("uploaded-package");return null!==e.uploads?((0,r.uX)(),(0,r.CE)("div",Oe,[(0,r.bo)((0,r.Lk)("div",Ie,[(0,r.Lk)("div",null,[t[0]||(t[0]=(0,r.Lk)("img",{src:xe,alt:"",width:"128",height:"128"},null,-1)),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.packages.uploadOverlay")),1)])],512),[[A.aG,e.$refs.uploader&&e.$refs.uploader.dropActive]]),(0,r.bF)(i,{name:"package",ref:"uploader","post-action":"api/packages/uploads",multiple:!0,drop:!0,"drop-directory":!1,"chunk-enabled":!0,chunk:{action:"api/packages/uploads"},"onUpdate:modelValue":e.setFiles,onInputFile:n.updateFile,onInputFilter:n.filterFile},null,8,["onUpdate:modelValue","onInputFile","onInputFilter"]),e.$refs.uploader?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[e.hasUploads||e.files.length?((0,r.uX)(),(0,r.CE)("h2",Pe,(0,c.v_)(e.$t("ui.packagelist.uploads")),1)):(0,r.Q3)("",!0),((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.files,(e=>((0,r.uX)(),(0,r.Wv)(l,{file:e,key:e.id},null,8,["file"])))),128)),((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.unconfirmedUploads,(t=>((0,r.uX)(),(0,r.Wv)(u,{upload:t,uploader:e.$refs.uploader,key:t.id},null,8,["upload","uploader"])))),128))],64)):(0,r.Q3)("",!0)])):(0,r.Q3)("",!0)}var Be=a(8568),Re=a.n(Be);const Ue={class:"package__version package__version--release"};function qe(e,t,a,s,o,n){const i=(0,r.g2)("progress-bar"),l=(0,r.g2)("base-package");return(0,r.uX)(),(0,r.Wv)(l,{title:a.file.name},{release:(0,r.k6)((()=>[(0,r.bF)(i,{amount:a.file.progress},null,8,["amount"]),(0,r.Lk)("div",Ue,[(0,r.Lk)("p",null,[(0,r.Lk)("strong",null,(0,c.v_)(n.filesize),1)])])])),_:1},8,["title"])}const je={key:0,class:"package__hint"},De={class:"package__inside"},Ve={class:"package__details"},We={class:"package__about"},Qe=["title"],He={class:"package__title"},Ge={class:"package__description"},Ne={class:"package__additional"},ze={class:"package__release"},Ke={class:"package__actions"};function Je(e,t,a,s,o,n){const i=(0,r.g2)("package-logo");return(0,r.uX)(),(0,r.CE)("article",{class:(0,c.C4)(["package",a.hint||!n.slotEmpty(e.$slots.hint)?"is--hint":""])},[a.hint||!n.slotEmpty(e.$slots.hint)?((0,r.uX)(),(0,r.CE)("div",je,[(0,r.RG)(e.$slots,"hint",{},(()=>[a.hintClose?((0,r.uX)(),(0,r.CE)("a",{key:0,href:"#",class:"package__hint-close",onClick:t[0]||(t[0]=(0,A.D$)((t=>e.$emit("close-hint")),["prevent"]))},(0,c.v_)(a.hintClose),1)):(0,r.Q3)("",!0),(0,r.Lk)("p",null,(0,c.v_)(a.hint),1)]))])):(0,r.Q3)("",!0),(0,r.Lk)("div",De,[(0,r.bF)(i,{class:"package__icon",src:a.logo},null,8,["src"]),(0,r.Lk)("div",Ve,[(0,r.Lk)("div",We,[(0,r.Lk)("h1",{class:(0,c.C4)({package__headline:!0,"package__headline--badge":a.badge})},[a.badge?((0,r.uX)(),(0,r.CE)("span",{key:0,class:"package__badge",title:a.badge.title},(0,c.v_)(a.badge.text),9,Qe)):(0,r.Q3)("",!0),(0,r.Lk)("span",He,(0,c.v_)(a.title),1)],2),(0,r.Lk)("p",Ge,(0,c.v_)(a.description),1),(0,r.Lk)("p",Ne,[(0,r.RG)(e.$slots,"additional")])]),(0,r.Lk)("div",ze,[(0,r.RG)(e.$slots,"release",{},(()=>[t[1]||(t[1]=(0,r.Lk)("div",null,null,-1))]))]),(0,r.Lk)("fieldset",Ke,[(0,r.RG)(e.$slots,"actions",{},(()=>[t[2]||(t[2]=(0,r.Lk)("div",null,null,-1))]))])])]),(0,r.RG)(e.$slots,"features")],2)}var Ze=a(7423),Ye={components:{PackageLogo:Ze.A},props:{title:String,logo:String,badge:Object,description:String,hint:String,hintClose:String},methods:{slotEmpty:Xe.A}};const et=(0,Z.A)(Ye,[["render",Je]]);var tt=et,at=a(1326),st=a(4960),ot={components:{ProgressBar:at.A,BasePackage:tt},props:{file:{type:Object,required:!0}},computed:{filesize:e=>(0,st.A)(e.file.size)}};const nt=(0,Z.A)(ot,[["render",qe]]);var it=nt;const lt={class:"package__version package__version--release"},rt={key:0},ct={key:1},ut={key:2},dt=["disabled"];function pt(e,t,a,s,o,n){const i=(0,r.g2)("progress-bar"),l=(0,r.g2)("loading-button"),u=(0,r.g2)("base-package"),d=(0,r.g2)("composer-package");return!a.upload.success||a.upload.error?((0,r.uX)(),(0,r.Wv)(u,{key:0,title:a.upload.name,hint:n.hintUploading},(0,r.eX)({release:(0,r.k6)((()=>[(0,r.bF)(i,{amount:n.progress},null,8,["amount"]),(0,r.Lk)("div",lt,[(0,r.Lk)("p",null,[(0,r.Lk)("strong",null,(0,c.v_)(n.filesize(a.upload.size)),1)])])])),actions:(0,r.k6)((()=>[(0,r.bF)(l,{color:"alert",icon:"trash",loading:n.removing,onClick:n.removeUpload},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.package.removeButton")),1)])),_:1},8,["loading","onClick"])])),_:2},[a.upload.error?{name:"hint",fn:(0,r.k6)((()=>[(0,r.Lk)("p",null,[(0,r.eW)((0,c.v_)(a.upload.error)+" ",1),a.upload.exception?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.eW)((0,c.v_)(a.upload.exception),1)],64)):(0,r.Q3)("",!0)])])),key:"0"}:void 0]),1032,["title","hint"])):((0,r.uX)(),(0,r.Wv)(d,{key:1,"uncloseable-hint":"",data:n.pkg},{hint:(0,r.k6)((()=>[e.isDuplicate(a.upload.id,n.pkg.name)?((0,r.uX)(),(0,r.CE)("p",rt,(0,c.v_)(e.$t("ui.packages.uploadDuplicate")),1)):e.versionInstalled(n.pkg.name,n.pkg.version)?((0,r.uX)(),(0,r.CE)("p",ct,(0,c.v_)(e.$t("ui.packages.uploadInstalled")),1)):n.isCompatible?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("p",ut,(0,c.v_)(e.$t("ui.package.incompatible",{package:n.pkg.name,constraint:e.packageConstraint("contao/manager-bundle")})),1))])),actions:(0,r.k6)((()=>[(0,r.Lk)("button",{class:"widget-button widget-button--primary widget-button--add",disabled:!n.canBeInstalled,onClick:t[0]||(t[0]=(...e)=>n.addPackage&&n.addPackage(...e))},(0,c.v_)(e.$t("ui.package.installButton")),9,dt),(0,r.bF)(l,{color:"alert",icon:"trash",loading:n.removing,onClick:n.removeUpload},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.package.removeButton")),1)])),_:1},8,["loading","onClick"])])),_:1},8,["data"]))}a(4114);var gt=a(416);const ht={key:0,class:"package__version package__version--additional"},mt=["title"],kt={key:0,class:"package__version-update package__version-update--error"},vt={key:1,class:"package__version-update package__version-update--available"},bt={key:2,class:"package__version-update package__version-update--none"},_t=["title"],ft={key:1,class:"composer-package__stats composer-package__stats--license"},wt=["title"],yt={key:0,class:"package__version package__version--release"},Ct=["title"],$t={key:0,class:"package__version-update package__version-update--error"},Lt={key:1,class:"package__version-update package__version-update--available"},At={key:2,class:"package__version-update package__version-update--none"},Et=["title"],Xt=["disabled"],St=["disabled"],Mt=["disabled"],Tt=["disabled"],xt=["disabled"],Ot={class:"package__features"};function It(e,t,a,s,o,n){const i=(0,r.g2)("router-link"),l=(0,r.g2)("package-constraint"),u=(0,r.g2)("details-button"),d=(0,r.g2)("button-group"),p=(0,r.g2)("feature-package"),g=(0,r.g2)("base-package");return(0,r.uX)(),(0,r.Wv)(g,{class:(0,c.C4)({"package--contao":e.isContao}),title:n.packageData.title||a.data.name,logo:n.packageData.logo,badge:n.badge,description:n.packageData.description,hint:n.packageHint,"hint-close":n.packageHintClose,onCloseHint:n.restore},(0,r.eX)({additional:(0,r.k6)((()=>[n.packageData.version?((0,r.uX)(),(0,r.CE)("div",ht,[(0,r.Lk)("strong",{title:n.packageData.time?n.datimFormat(n.packageData.time):""},(0,c.v_)(e.$t("ui.package.version",{version:n.packageData.version})),9,mt),n.packageData.update?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[n.packageData.update.valid?n.packageData.update.latest?((0,r.uX)(),(0,r.CE)("div",bt,[(0,r.eW)((0,c.v_)(e.$t("ui.package.updateLatest"))+" ",1),n.packageData.latest&&!n.packageData.latest.active?((0,r.uX)(),(0,r.CE)("span",{key:0,class:"package__version-latest",title:e.$t("ui.package.updateConstraint")},null,8,_t)):(0,r.Q3)("",!0)])):((0,r.uX)(),(0,r.CE)("div",vt,(0,c.v_)(e.$t("ui.package.updateAvailable",{version:n.packageData.update.version})),1)):((0,r.uX)(),(0,r.CE)("div",kt,(0,c.v_)(e.$t("ui.package.updateUnknown")),1))],64)):(0,r.Q3)("",!0)])):(0,r.Q3)("",!0),n.license?((0,r.uX)(),(0,r.CE)("span",ft,(0,c.v_)(n.license),1)):(0,r.Q3)("",!0),n.packageData.contaoVersions&&!e.isContao?((0,r.uX)(),(0,r.CE)("ul",{key:2,class:"composer-package__stats composer-package__stats--versions",title:`${e.$t("ui.package.contaoVersion")} ${n.packageData.contaoVersions.join(", ")}`},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.packageData.contaoVersions,((e,t)=>((0,r.uX)(),(0,r.CE)("li",{class:"composer-package__stats--version",key:t},(0,c.v_)(e),1)))),128))],8,wt)):(0,r.Q3)("",!0),n.packageData.funding?((0,r.uX)(),(0,r.Wv)(i,{key:3,class:"composer-package__stats composer-package__stats--funding",to:{query:{p:a.data.name}}},{default:(0,r.k6)((()=>t[5]||(t[5]=[(0,r.eW)(" ")]))),_:1,__:[5]},8,["to"])):(0,r.Q3)("",!0)])),release:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"release",{},(()=>[(0,r.bF)(l,{class:"package__constraint",data:a.data},null,8,["data"]),n.packageData.version?((0,r.uX)(),(0,r.CE)("div",yt,[(0,r.Lk)("strong",{title:n.packageData.time?n.datimFormat(n.packageData.time):""},(0,c.v_)(e.$t("ui.package.version",{version:n.packageData.version})),9,Ct),n.packageData.update?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[n.packageData.update.valid?n.packageData.update.latest?((0,r.uX)(),(0,r.CE)("div",At,[(0,r.eW)((0,c.v_)(e.$t("ui.package.updateLatest"))+" ",1),n.packageData.latest&&!n.packageData.latest.active?((0,r.uX)(),(0,r.CE)("span",{key:0,class:"package__version-latest",title:e.$t("ui.package.updateConstraint")},null,8,Et)):(0,r.Q3)("",!0)])):((0,r.uX)(),(0,r.CE)("div",Lt,(0,c.v_)(e.$t("ui.package.updateAvailable",{version:n.packageData.update.version})),1)):((0,r.uX)(),(0,r.CE)("div",$t,(0,c.v_)(e.$t("ui.package.updateUnknown")),1))],64)):(0,r.Q3)("",!0)])):(0,r.Q3)("",!0)]))])),actions:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"actions",{},(()=>[a.data.name?((0,r.uX)(),(0,r.Wv)(u,{key:0,name:a.data.name},null,8,["name"])):(0,r.Q3)("",!0),e.isGranted(n.scopes.UPDATE)?((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[e.isContao?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[e.isRequired?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("button",{key:0,class:"widget-button widget-button--update",disabled:e.isModified,onClick:t[0]||(t[0]=(...t)=>e.update&&e.update(...t))},(0,c.v_)(e.$t("ui.package.updateButton")),9,Xt))],64)):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[e.isMissing?((0,r.uX)(),(0,r.CE)("button",{key:0,class:"widget-button widget-button--primary widget-button--add",disabled:e.willBeInstalled,onClick:t[1]||(t[1]=(...t)=>e.install&&e.install(...t))},(0,c.v_)(e.$t("ui.package.installButton")),9,St)):e.isRequired?((0,r.uX)(),(0,r.CE)("button",{key:1,class:"widget-button widget-button--alert widget-button--trash",disabled:e.willBeRemoved,onClick:t[2]||(t[2]=(...t)=>e.uninstall&&e.uninstall(...t))},(0,c.v_)(e.$t("ui.package.removeButton")),9,Mt)):e.isRootInstalled?((0,r.uX)(),(0,r.CE)(r.FK,{key:2},[e.isGranted(n.scopes.INSTALL)?((0,r.uX)(),(0,r.Wv)(d,{key:0,label:e.$t("ui.package.updateButton"),icon:"update",disabled:e.isModified,onClick:e.update},{default:(0,r.k6)((()=>[(0,r.Lk)("button",{class:"widget-button widget-button--alert widget-button--trash",disabled:e.willBeRemoved,onClick:t[3]||(t[3]=(...t)=>e.uninstall&&e.uninstall(...t))},(0,c.v_)(e.$t("ui.package.removeButton")),9,Tt)])),_:1},8,["label","disabled","onClick"])):((0,r.uX)(),(0,r.CE)("button",{key:1,class:"widget-button widget-button--update",disabled:e.isModified,onClick:t[4]||(t[4]=(...t)=>e.update&&e.update(...t))},(0,c.v_)(e.$t("ui.package.updateButton")),9,xt))],64)):(0,r.Q3)("",!0)],64))],64)):(0,r.Q3)("",!0)]))])),_:2},[n.slotEmpty(e.$slots.hint)?void 0:{name:"hint",fn:(0,r.k6)((()=>[(0,r.RG)(e.$slots,"hint")])),key:"0"},e.packageFeatures(a.data.name)?.length?{name:"features",fn:(0,r.k6)((()=>[(0,r.Lk)("section",Ot,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.packageFeatures(a.data.name),(e=>((0,r.uX)(),(0,r.Wv)(p,{key:e,name:e},null,8,["name"])))),128))])])),key:"1"}:void 0]),1032,["class","title","logo","badge","description","hint","hint-close","onCloseHint"])}var Pt=a(4210),Ft=a(266),Bt=a(8200);const Rt={key:0,class:"feature-package"},Ut={class:"feature-package__name"},qt={key:0,class:"feature-package__hint"},jt=["title"],Dt=["title"],Vt={class:"feature-package__actions"},Wt=["title"];function Qt(e,t,a,s,o,n){const i=(0,r.g2)("details-button");return e.isRequired||e.isMissing||e.isRootInstalled||e.willBeInstalled?((0,r.uX)(),(0,r.CE)("article",Rt,[(0,r.Lk)("p",{class:(0,c.C4)(["feature-package__text",{"feature-package__text--hint":this.packageHint}])},[(0,r.Lk)("strong",Ut,(0,c.v_)(n.packageTitle),1),this.packageHint?((0,r.uX)(),(0,r.CE)("span",qt,(0,c.v_)(n.packageHint),1)):e.isMissing?((0,r.uX)(),(0,r.CE)("span",{key:1,class:"feature-package__badge",title:e.$t("ui.package.removedText")},(0,c.v_)(e.$t("ui.package.removedTitle")),9,jt)):e.isRequired?((0,r.uX)(),(0,r.CE)("span",{key:2,class:"feature-package__badge",title:e.$t("ui.package.requiredText")},(0,c.v_)(e.$t("ui.package.requiredTitle")),9,Dt)):((0,r.uX)(),(0,r.CE)(r.FK,{key:3},[(0,r.eW)((0,c.v_)(e.metadata.description),1)],64))],2),(0,r.Lk)("div",Vt,[n.packageHint&&e.isGranted(n.scopes.INSTALL)?((0,r.uX)(),(0,r.CE)("button",{key:0,class:"feature-package__restore",onClick:t[0]||(t[0]=(...e)=>n.restore&&n.restore(...e))},(0,c.v_)(e.$t("ui.package.hintRevert")),1)):(0,r.Q3)("",!0),(0,r.bF)(i,{small:"",name:a.name},null,8,["name"]),(e.isRequired||e.isRootInstalled)&&!e.willBeRemoved&&e.isGranted(n.scopes.INSTALL)?((0,r.uX)(),(0,r.CE)("button",{key:1,title:e.$t("ui.package.removeButton"),class:"widget-button widget-button--alert widget-button--trash widget-button--small",onClick:t[1]||(t[1]=(...t)=>e.uninstall&&e.uninstall(...t))},null,8,Wt)):(0,r.Q3)("",!0)])])):(0,r.Q3)("",!0)}var Ht=a(9071),Gt={mixins:[Bt.A],components:{DetailsButton:Ht.A},props:{name:String,reason:String},computed:{...(0,g.L8)("auth",["isGranted"]),scopes:()=>te.A,data:e=>({name:e.name}),packageTitle(){return this.metadata?.name?this.metadata.title||this.metadata.name:this.data.name},packageHint(){return this.willBeRemoved?this.$t("ui.package.hintRemoved"):this.willBeInstalled?this.$t("ui.package.hintAdded"):null}},methods:{restore(){this.$store.commit("packages/restore",this.data.name)}}};const Nt=(0,Z.A)(Gt,[["render",Qt]]);var zt=Nt,Kt=a(5062),Jt=a(4676),Zt={mixins:[Bt.A],components:{BasePackage:tt,FeaturePackage:zt,PackageConstraint:Kt.A,ButtonGroup:Jt.A,DetailsButton:Ht.A},props:{data:{type:Object,required:!0},hint:String,uncloseableHint:Boolean},computed:{...(0,g.L8)("auth",["isGranted"]),...(0,g.L8)("packages",["packageFeatures"]),scopes:()=>te.A,packageData:e=>Object.assign({},e.data,e.installed[e.data.name]||{},e.metadata||{}),license:e=>e.packageData.license instanceof Array?e.packageData.license.join("/"):e.packageData.license,packageHint(){return this.hint?this.hint:this.willBeRemoved||this.isMissing&&!this.willBeInstalled?this.$t("ui.package.hintRemoved"):this.isRequired?this.$t("ui.package.hintConstraint",{constraint:this.constraintRequired}):this.willBeInstalled?this.constraintAdded?this.$t("ui.package.hintConstraint",{constraint:this.constraintAdded}):this.$t("ui.package.hintConstraintBest"):this.isChanged?this.$t("ui.package.hintConstraintChange",{from:this.constraintInstalled,to:this.constraintChanged}):this.isUpdated?this.$t("ui.package.hintConstraintUpdate"):null},packageHintClose(){return this.uncloseableHint||this.isRequired&&!this.willBeRemoved&&!this.isChanged||this.isMissing&&!this.willBeInstalled?null:this.isUpdated?this.$t("ui.package.hintNoupdate"):this.$t("ui.package.hintRevert")},packageUpdates(){return this.isInstalled&&(Object.keys(this.$store.state.packages.add).length>0||Object.keys(this.$store.state.packages.change).length>0||this.$store.state.packages.update.length>0||this.$store.state.packages.remove.length>0)},badge(){return this.isRequired?{title:this.$t("ui.package.requiredText"),text:this.$t("ui.package.requiredTitle")}:this.isMissing?{title:this.$t("ui.package.removedText"),text:this.$t("ui.package.removedTitle")}:this.packageData.abandoned?{title:!0===this.packageData.abandoned?this.$t("ui.package.abandonedText"):this.$t("ui.package.abandonedReplace",{replacement:this.packageData.abandoned}),text:this.$t("ui.package.abandoned")}:null}},methods:{datimFormat:Pt.A,numberFormat:Ft.A,slotEmpty:Xe.A,restore(){this.$store.commit("packages/restore",this.data.name),this.$store.dispatch("packages/uploads/unconfirm",this.data.name)}}};const Yt=(0,Z.A)(Zt,[["render",It]]);var ea=Yt,ta=a(85),aa={mixins:[gt.A],components:{ProgressBar:at.A,BasePackage:tt,ComposerPackage:ea,LoadingButton:ta.A},props:{upload:{type:Object,required:!0},uploader:{type:Object,required:!0}},computed:{...(0,g.L8)("packages",["packageRemoved","versionInstalled","contaoSupported","packageConstraint"]),...(0,g.L8)("packages/uploads",["isDuplicate","isRemoving"]),removing:e=>e.isRemoving(e.upload.id),progress:e=>100/e.upload.size*e.upload.filesize,isTheme:e=>"contao-theme"===e.data.type,isCompatible:e=>!e.data.require||e.contaoSupported(e.data.require["contao/core-bundle"]||e.data.require["contao/manager-bundle"]||null),canBeInstalled:e=>!e.isDuplicate(e.upload.id,e.pkg.name)&&!e.versionInstalled(e.pkg.name,e.pkg.version)&&!e.removing&&!e.packageRemoved(e.pkg.name)&&!e.isTheme&&e.isCompatible,data:e=>e.upload.package||{name:""},pkg:e=>Object.assign({name:e.upload.name,version:null},e.upload.package||{}),hintUploading(){return this.upload.error?this.upload.error:this.upload.size!==this.upload.filesize?this.$t("ui.packages.uploadIncomplete"):""},additional(){const e=[];return this.pkg.license&&(this.pkg.license instanceof Array?e.push(this.pkg.license.join("/")):e.push(this.pkg.license)),this.pkg.downloads&&e.push(this.$tc("ui.package.additionalDownloads",this.pkg.downloads)),this.pkg.favers&&e.push(this.$tc("ui.package.additionalStars",this.pkg.favers)),e}},methods:{filesize:st.A,addPackage(){this.$store.dispatch("packages/uploads/confirm",this.upload.id)},removeUpload(){this.$store.dispatch("packages/uploads/remove",this.upload.id)}}};const sa=(0,Z.A)(aa,[["render",pt]]);var oa=sa,na={components:{FileUpload:Re(),UploadingPackage:it,UploadedPackage:oa},computed:{...(0,g.aH)("packages/uploads",["uploads","files"]),...(0,g.L8)("packages/uploads",["hasUploads","unconfirmedUploads"])},methods:{...(0,g.PY)("packages/uploads",["setUploading","setFiles"]),openFileSelector(){this.$refs.uploader&&this.$refs.uploader.$el.querySelector("input").click()},async filterFile(e,t,a){if(e&&!t&&!/\.zip$/i.test(e.name))return a()},async updateFile(e,t){this.setUploading(!this.$refs.uploader.uploaded),!t||e?(e.error&&e.xhr&&(401===e.xhr.status?this.$store.commit("setView",N.A.LOGIN):"application/problem+json"===e.xhr.getResponseHeader("Content-Type")&&this.$store.commit("setError",JSON.parse(e.response))),Boolean(e)===Boolean(t)&&t.error===e.error||this.$refs.uploader.active||(this.$refs.uploader.active=!0),this.$refs.uploader.uploaded&&e&&t&&!e.active&&t.active&&(await this.$store.dispatch("packages/uploads/load"),this.$refs.uploader.remove(e))):this.$refs.uploader.uploaded&&!this.$refs.uploader.active&&this.setFiles([])}}};const ia=(0,Z.A)(na,[["render",Fe]]);var la=ia;const ra={class:"cloud-status__headline"},ca={class:"cloud-status__version"},ua={class:"widget-button widget-button--info widget-button--link widget-button--small cloud-status__link",href:"https://composer-resolver-cloud.statuspage.io/",target:"_blank",rel:"noreferrer noopener"},da={key:1,class:"cloud-status__popup cloud-status__popup--error",tabindex:"-1"},pa={class:"cloud-status__headline cloud-status__headline--error"},ga={class:"cloud-status__error"},ha={class:"widget-button widget-button--info widget-button--link widget-button--small cloud-status__link",href:"https://composer-resolver-cloud.statuspage.io/",target:"_blank",rel:"noreferrer noopener"},ma=["title"];function ka(e,t,a,s,o,n){const i=(0,r.g2)("loading-button");return e.enabled?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"cloud-status",onMouseenter:t[3]||(t[3]=(...e)=>n.open&&n.open(...e)),onMouseleave:t[4]||(t[4]=(...e)=>n.close&&n.close(...e))},[(0,r.bF)(i,{class:(0,c.C4)(`cloud-status__button ${a.buttonClass}`),color:"info",icon:e.hasError?"cloud-off":"cloud",loading:e.isLoading,disabled:e.hasError,onClick:n.open},{default:(0,r.k6)((()=>[e.isReady?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.eW)((0,c.v_)(e.$t("ui.cloudStatus.approx",{minutes:n.approxMinutes})),1)],64)):(0,r.Q3)("",!0)])),_:1},8,["class","icon","loading","disabled","onClick"]),e.isReady?(0,r.bo)(((0,r.uX)(),(0,r.CE)("div",{key:0,ref:"menu",class:"cloud-status__popup",tabindex:"-1",onFocusout:t[0]||(t[0]=(...e)=>n.close&&n.close(...e)),onClick:t[1]||(t[1]=(...e)=>n.open&&n.open(...e))},[(0,r.Lk)("h2",ra,(0,c.v_)(e.$t("ui.cloudStatus.headline")),1),(0,r.Lk)("p",ca,(0,c.v_)(e.$t("ui.cloudStatus.version",{version:e.status.appVersion})),1),(0,r.Lk)("table",null,[(0,r.Lk)("tbody",null,[(0,r.Lk)("tr",null,[(0,r.Lk)("th",null,(0,c.v_)(e.$t("ui.cloudStatus.waitingTime"))+":",1),(0,r.Lk)("td",null,(0,c.v_)(n.waitingLabel),1)]),(0,r.Lk)("tr",null,[(0,r.Lk)("th",null,(0,c.v_)(e.$t("ui.cloudStatus.jobs"))+":",1),(0,r.Lk)("td",null,(0,c.v_)(e.status.numberOfJobsInQueue>0?e.status.numberOfJobsInQueue+e.status.numberOfWorkers:`≤ ${e.status.numberOfWorkers}`),1)]),(0,r.Lk)("tr",null,[(0,r.Lk)("th",null,(0,c.v_)(e.$t("ui.cloudStatus.workers"))+":",1),(0,r.Lk)("td",null,(0,c.v_)(e.status.numberOfWorkers),1)])])]),(0,r.Lk)("a",ua,(0,c.v_)(e.$t("ui.cloudStatus.button")),1)],544)),[[A.aG,e.visible]]):e.hasError?((0,r.uX)(),(0,r.CE)("div",da,[(0,r.Lk)("h2",pa,(0,c.v_)(e.$t("ui.cloudStatus.headline")),1),(0,r.Lk)("p",ga,(0,c.v_)(e.$t("ui.cloudStatus.error")),1),(0,r.Lk)("a",ha,(0,c.v_)(e.$t("ui.cloudStatus.button")),1),(0,r.Lk)("button",{class:"widget-button widget-button--update widget-button--small",onClick:t[2]||(t[2]=(...e)=>n.refreshCloud&&n.refreshCloud(...e)),title:e.$t("ui.cloudStatus.approxError")},null,8,ma)])):(0,r.Q3)("",!0)],32)):(0,r.Q3)("",!0)}var va={components:{LoadingButton:ta.A},props:{buttonClass:String},data:()=>({visible:!1,timeout:null,mouseout:null}),computed:{...(0,g.aH)("cloud",["enabled","status"]),...(0,g.L8)("cloud",["isLoading","isReady","hasError"]),waitingTime:e=>Math.round(e.status.numberOfJobsInQueue*(e.status.averageProcessingTimeInMs/1e3)/Math.max(e.status.numberOfWorkers,1)),waitingMinutes:e=>Math.floor(e.waitingTime/60),waitingSeconds:e=>e.waitingTime-60*e.waitingMinutes,approxMinutes:e=>Math.round(e.waitingTime/60),waitingLabel(){return this.waitingTime?this.waitingSeconds?this.$t("ui.cloudStatus.long",{minutes:this.waitingMinutes,seconds:this.waitingSeconds}):this.$t("ui.cloudStatus.short",{minutes:this.waitingMinutes}):this.$t("ui.cloudStatus.none")}},methods:{open(){this.visible=!0,setTimeout((()=>this.$refs.menu?.focus()),0)},close(e){e&&this.$refs.menu?.contains(e.relatedTarget)||(this.$refs.menu.blur(),setTimeout((()=>{this.visible=!1}),100))},refreshCloud(){this.$store.commit("cloud/setStatus",null),this.fetchCloud()},async fetchCloud(){await this.$store.dispatch("cloud/fetch"),this.enabled&&!this.hasError&&(this.timeout=setTimeout(this.fetchCloud,6e4))}},mounted(){this.fetchCloud()},beforeUnmount(){clearTimeout(this.timeout)}};const ba=(0,Z.A)(va,[["render",ka]]);var _a=ba,fa=a(4758);const wa=(e,t)=>"contao/manager-bundle"===e.name?-1:"contao/manager-bundle"===t.name?1:0;var ya={components:{PackageBase:Te,PackageUploads:la,ComposerPackage:ea,LoadingButton:ta.A,CloudStatus:_a,ButtonGroup:Jt.A,LinkMenu:fa.A},data:()=>({hasLockFile:!0}),computed:{...(0,g.L8)("auth",["isGranted"]),...(0,g.L8)("cloud",{cloudLoading:"isLoading",cloudError:"hasError"}),...(0,g.aH)("packages",{requiredPackages:"required"}),...(0,g.aH)("packages/uploads",["uploads","uploading","files","removing","confirmed"]),...(0,g.L8)("packages",["totalChanges","packageMissing","canResetChanges","visibleRequired","visibleInstalled","visibleAdded"]),...(0,g.L8)("packages/uploads",["hasUploads","totalUploads","canConfirmUploads"]),scopes:()=>te.A,addedPackages:e=>e.visibleRequired.concat(e.visibleAdded).filter((t=>!e.packageMissing(t.name))).sort(wa),installedPackages:e=>e.visibleRequired.filter((t=>e.packageMissing(t.name))).concat(e.visibleInstalled).sort(wa),removingUploads:e=>e.removing.length>0,showHeadline:e=>e.installedPackages.length>0&&(e.hasAdded||e.hasUploads||e.files.length),hasAdded:e=>e.addedPackages.length,applyActions(){return this.hasLockFile?[{label:this.$t("ui.packages.changesDryrun"),action:this.dryrunChanges},{label:this.$t("ui.packages.changesDryrunAll"),action:this.dryrunChangesAll},{label:this.$t("ui.packages.changesApplyAll"),action:this.applyChangesAll}]:[{label:this.$t("ui.packages.changesDryrun"),action:this.dryrunChanges}]}},methods:{openFileSelector(){this.$refs.uploader&&this.isGranted(te.A.INSTALL)&&this.$refs.uploader.openFileSelector()},confirmUploads(){this.$store.dispatch("packages/uploads/confirmAll")},async removeUploads(){await this.$store.dispatch("packages/uploads/removeAll")},dryrunChanges(){this.$store.dispatch("packages/apply",{dry_run:!0})},dryrunChangesAll(){this.$store.dispatch("packages/apply",{dry_run:!0,update_all:!0})},async applyChanges(){try{await this.$store.dispatch("packages/apply"),await this.$store.dispatch("packages/load")}catch(e){await this.$store.dispatch("packages/load",!1)}await this.$store.dispatch("packages/uploads/load")},async applyChangesAll(){try{await this.$store.dispatch("packages/apply",{update_all:!0}),await this.$store.dispatch("packages/load")}catch(e){await this.$store.dispatch("packages/load",!1)}await this.$store.dispatch("packages/uploads/load")},resetChanges(){this.$store.commit("packages/reset"),this.$store.dispatch("packages/uploads/unconfirmAll")}},mounted(){this.$store.dispatch("server/composer/get").then((e=>{this.hasLockFile=e.lock.found}))}};const Ca=(0,Z.A)(ya,[["render",Ce]]);var $a=Ca,La=a.p+"img/oauth.1243e742.svg";const Aa={class:"view-oauth__header"},Ea={class:"view-oauth__product"},Xa={class:"view-oauth__form"},Sa={class:"view-oauth__description"},Ma={class:"view-oauth__client"},Ta={class:"view-oauth__warning"},xa=["disabled"],Oa={class:"view-oauth__warning"},Ia=["disabled"];function Pa(e,t,a,s,o,n){const i=(0,r.g2)("user-scope"),l=(0,r.g2)("loading-button"),u=(0,r.g2)("boxed-layout");return(0,r.uX)(),(0,r.Wv)(u,{slotClass:"view-oauth"},{default:(0,r.k6)((()=>[(0,r.Lk)("header",Aa,[t[5]||(t[5]=(0,r.Lk)("img",{src:La,width:"80",height:"80",alt:"",class:"view-oauth__icon"},null,-1)),(0,r.Lk)("p",Ea,(0,c.v_)(e.$t("ui.oauth.headline")),1)]),(0,r.Lk)("main",Xa,[(0,r.Lk)("p",Sa,(0,c.v_)(e.$t("ui.oauth.description")),1),(0,r.Lk)("p",Ma,(0,c.v_)(n.hostname),1),n.scopes.length?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[(0,r.bF)(i,{class:"view-oauth__scopes",allowed:n.scopes,modelValue:e.scope,"onUpdate:modelValue":t[0]||(t[0]=t=>e.scope=t)},null,8,["allowed","modelValue"]),(0,r.Lk)("p",Ta,(0,c.v_)(e.$t("ui.oauth.domain")),1),(0,r.bF)(l,{class:"view-oauth__button",color:"primary",disabled:!e.valid,loading:e.authenticating,onClick:n.allowAccess},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.oauth.allow")),1)])),_:1},8,["disabled","loading","onClick"]),(0,r.Lk)("button",{class:"view-oauth__button widget-button",onClick:t[1]||(t[1]=(0,A.D$)(((...e)=>n.denyAccess&&n.denyAccess(...e)),["prevent"])),disabled:!e.valid||e.authenticating},(0,c.v_)(e.$t("ui.oauth.deny")),9,xa),(0,r.Lk)("button",{class:"view-oauth__button widget-button widget-button--anchor",onClick:t[2]||(t[2]=(0,A.D$)(((...t)=>e.logout&&e.logout(...t)),["prevent"]))},(0,c.v_)(e.$t("ui.oauth.switchUser")),1)],64)):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("p",Oa,(0,c.v_)(e.$t("ui.oauth.outOfScope")),1),(0,r.Lk)("button",{class:"view-oauth__button widget-button",onClick:t[3]||(t[3]=(0,A.D$)(((...e)=>n.denyAccess&&n.denyAccess(...e)),["prevent"])),disabled:!e.valid},(0,c.v_)(e.$t("ui.oauth.deny")),9,Ia),(0,r.Lk)("button",{class:"view-oauth__button widget-button widget-button--anchor",onClick:t[4]||(t[4]=(0,A.D$)(((...t)=>e.logout&&e.logout(...t)),["prevent"]))},(0,c.v_)(e.$t("ui.oauth.switchUser")),1)],64))])])),_:1})}a(4603),a(7566),a(8721);var Fa=a(728);const Ba={class:"user-scope"},Ra={key:0,class:"user-scope__label"};function Ua(e,t,a,s,o,n){const i=(0,r.g2)("check-box");return(0,r.uX)(),(0,r.CE)("fieldset",Ba,[a.label?((0,r.uX)(),(0,r.CE)("legend",Ra,(0,c.v_)(a.label),1)):(0,r.Q3)("",!0),((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.all,(t=>((0,r.uX)(),(0,r.Wv)(i,{key:t,class:(0,c.C4)(["user-scope__item",{"user-scope__item--required":a.readonly||n.isRequired(t)}]),name:`${t}_${e.randomKey}`,label:e.$t(`ui.scope.${t}`),disabled:a.readonly||!n.isRequested(t)||n.isRequired(t),"model-value":e.model[t],"onUpdate:modelValue":e=>n.setEnabled(t,e)},null,8,["class","name","label","disabled","model-value","onUpdate:modelValue"])))),128))])}a(116),a(7588);var qa=a(3480),ja={components:{CheckBox:qa.A},props:{allowed:Array,label:String,modelValue:String,readonly:Boolean},data:()=>({randomKey:(Math.random()+1).toString(36).substring(7),model:{admin:!1,install:!1,update:!1,read:!1}}),computed:{all:()=>Object.values(te.A).reverse(),scopes:e=>e.all.filter((t=>!e.allowed||e.allowed.includes(t))),isRequested:e=>t=>e.scopes.includes(t),isRequired:e=>t=>e.all.indexOf(t)<=e.all.indexOf(e.all.find((t=>e.scopes.includes(t))))},methods:{init(){this.all.forEach((e=>{this.model[e]=!1})),this.setEnabled(this.modelValue||this.scopes[this.scopes.length-1],!0)},setEnabled(e,t){this.all.forEach((a=>{this.isRequired(a)?this.model[a]=!0:this.model[a]=t?this.all.indexOf(a)<=this.all.indexOf(e):this.isRequested(a)&&this.all.indexOf(a)this.model[e])))}},watch:{scopes:{handler(){this.init()},deep:!0}},mounted(){this.init()}};const Da=(0,Z.A)(ja,[["render",Ua]]);var Va=Da,Wa={components:{BoxedLayout:Fa.A,LoadingButton:ta.A,UserScope:Va},data:()=>({valid:!1,authenticating:!1,scope:null}),computed:{...(0,g.L8)("auth",["isGranted"]),hostname:e=>e.$route.query.redirect_uri?new URL(e.$route.query.redirect_uri).hostname:"???",scopes:e=>e.$route.query.scope.split(" ").filter((t=>e.isGranted(t)))},methods:{...(0,g.i0)("auth",["logout"]),async allowAccess(){this.authenticating=!0;try{const e=await s.A.post(`api/users/${encodeURIComponent(this.$store.state.auth.username)}/tokens`,{client_id:this.$route.query.client_id,scope:this.scope});this.redirect({access_token:e.data.token,token_type:"bearer",scope:this.scope,endpoint:`${location.origin}${location.pathname}`})}catch(e){this.redirect({error:"server_error"})}},denyAccess(){this.redirect({error:this.scopes.length?"access_denied":"invalid_scope"})},redirect(e){const t=[];for(let o in e)t.push(encodeURIComponent(o)+"="+encodeURIComponent(e[o]));this.$route.query.state&&t.push(encodeURIComponent("state")+"="+encodeURIComponent(this.$route.query.state));const a=t.join("&"),s=this.$route.query.redirect_uri;s.includes("#")?document.location.href=`${s}&${a}`:document.location.href=`${s}#${a}`}},async mounted(){await this.$router.isReady();let e=!1;try{const t=new URL(this.$route.query.redirect_uri);"https:"!==t.protocol&&"localhost"!==t.hostname&&(e=!0)}catch(t){e=!0}if(!e)return"token"!==this.$route.query.response_type?this.redirect({error:"unsupported_response_type"}):this.$route.query.client_id?void(this.valid=!0):this.redirect({error:"invalid_request"});this.$store.commit("setError",{title:this.$t("ui.oauth.error"),detail:this.$t("ui.oauth.https"),type:"https://tools.ietf.org/html/rfc6749#section-3.1.2.1",status:400})}};const Qa=(0,Z.A)(Wa,[["render",Pa]]);var Ha=Qa;function Ga(e,t,a,s,o,n){const i=(0,r.g2)("rebuild-cache"),l=(0,r.g2)("database-status"),c=(0,r.g2)("maintenance-mode"),u=(0,r.g2)("install-tool"),d=(0,r.g2)("debug-mode"),p=(0,r.g2)("dump-autoload"),g=(0,r.g2)("composer-install"),h=(0,r.g2)("composer-cache"),m=(0,r.g2)("opcode-cache"),k=(0,r.g2)("main-layout");return(0,r.uX)(),(0,r.Wv)(k,null,{default:(0,r.k6)((()=>[(0,r.bF)(i),(0,r.bF)(l),(0,r.bF)(c),(0,r.bF)(u),(0,r.bF)(d),(0,r.bF)(p),(0,r.bF)(g),(0,r.bF)(h),(0,r.bF)(m)])),_:1})}const Na={class:"maintenance"},za={class:"maintenance__inside"},Ka={class:"maintenance__about"},Ja={key:0,class:"maintenance__error"},Za={key:1,class:"maintenance__warning"},Ya={key:2,class:"maintenance__warning"},es={key:3,class:"maintenance__warning"},ts={key:0},as={key:1},ss={key:2},os={class:"maintenance__actions"},ns={key:1,class:"widget-button widget-button--alert",href:"/contao/install"};function is(e,t,a,s,o,n){const i=(0,r.g2)("loading-spinner"),l=(0,r.g2)("link-menu"),u=(0,r.g2)("button-group"),d=(0,r.g2)("loading-button"),p=(0,r.g2)("message-overlay");return(0,r.uX)(),(0,r.Wv)(p,{message:n.overlayMessage,active:e.safeMode||!1===e.supported},{default:(0,r.k6)((()=>[(0,r.Lk)("section",Na,[(0,r.Lk)("div",za,[t[2]||(t[2]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:h,alt:""})],-1)),(0,r.Lk)("div",Ka,[(0,r.Lk)("h1",null,[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.database.title"))+" ",1),e.hasError?((0,r.uX)(),(0,r.CE)("span",Ja,(0,c.v_)(e.$t("ui.maintenance.database.error")),1)):(0,r.Q3)("",!0),e.hasWarning?((0,r.uX)(),(0,r.CE)("span",Za,(0,c.v_)(e.$t("ui.maintenance.database.warning")),1)):e.totalMigrations?((0,r.uX)(),(0,r.CE)("span",Ya,(0,c.v_)(e.$tc("ui.maintenance.database.migrations",e.totalMigrations)),1)):e.totalSchemaUpdates?((0,r.uX)(),(0,r.CE)("span",es,(0,c.v_)(e.$tc("ui.maintenance.database.schemaUpdates",e.totalSchemaUpdates)),1)):(0,r.Q3)("",!0)]),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.database.description")),1),t[1]||(t[1]=(0,r.Lk)("br",null,null,-1)),e.supportsBackups||e.loadingBackups?e.supportsBackups&&e.backupFiles.length?((0,r.uX)(),(0,r.CE)("p",as,(0,c.v_)(e.$tc("ui.maintenance.database.backupList",e.backupFiles.length,{date:n.datimFormat(e.backupFiles[0].createdAt)})),1)):e.supportsBackups?((0,r.uX)(),(0,r.CE)("p",ss,(0,c.v_)(e.$t("ui.maintenance.database.backupEmpty")),1)):(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("p",ts,(0,c.v_)(e.$t("ui.maintenance.database.backupUnsupported")),1))]),(0,r.Lk)("fieldset",os,[e.loading?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"maintenance__loader"})):e.hasError&&!e.supported?((0,r.uX)(),(0,r.CE)("a",ns,(0,c.v_)(e.$t("ui.maintenance.database.installTool")),1)):e.hasError?((0,r.uX)(),(0,r.CE)("button",{key:2,class:"widget-button widget-button--alert",onClick:t[0]||(t[0]=(...e)=>n.checkMigrations&&n.checkMigrations(...e))},(0,c.v_)(e.$t("ui.maintenance.database.button")),1)):((0,r.uX)(),(0,r.Wv)(u,{key:3,label:e.$t("ui.maintenance.database.button"),type:e.hasChanges||e.hasWarning?"warning":"primary",icon:"database",onClick:n.checkMigrations},{default:(0,r.k6)((()=>[(0,r.bF)(l,{align:"right",items:n.advancedActions(),color:e.hasChanges?"warning":"primary"},null,8,["items","color"])])),_:1},8,["label","type","onClick"])),(0,r.bF)(d,{class:"widget-button",onClick:n.createBackup,disabled:!e.supportsBackups,loading:e.loadingBackups},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.database.createBackup")),1)])),_:1},8,["onClick","disabled","loading"])])])])])),_:1},8,["message","active"])}const ls={class:"message-overlay"},rs={key:0,class:"message-overlay__overlay"},cs={class:"message-overlay__message"};function us(e,t,a,s,o,n){return(0,r.uX)(),(0,r.CE)("div",ls,[(0,r.Lk)("div",{class:(0,c.C4)({"message-overlay__blur":a.active})},[(0,r.RG)(e.$slots,"default")],2),a.active?((0,r.uX)(),(0,r.CE)("div",rs,[(0,r.Lk)("span",cs,(0,c.v_)(a.message),1)])):(0,r.Q3)("",!0)])}var ds={props:{message:{type:String,required:!0},active:{type:Boolean,required:!0}}};const ps=(0,Z.A)(ds,[["render",us]]);var gs=ps,hs=a(9045),ms={components:{MessageOverlay:gs,LoadingSpinner:hs.A,ButtonGroup:Jt.A,LinkMenu:fa.A,LoadingButton:ta.A},computed:{...(0,g.aH)(["safeMode"]),...(0,g.aH)("server/database",["loading","supported","status"]),...(0,g.aH)("contao/backup",{supportsBackups:"supported",backupFiles:"files",loadingBackups:"loading"}),...(0,g.L8)("server/database",["hasError","hasChanges","hasWarning","totalMigrations","totalSchemaUpdates"]),overlayMessage:e=>e.safeMode?e.$t("ui.maintenance.safeMode"):e.$t("ui.maintenance.unsupported")},methods:{datimFormat(e){return(0,Pt.A)(e,"short","long")},checkMigrations(){this.$store.commit("checkMigrations")},advancedActions(){return[{label:this.$t("ui.maintenance.database.migrationOnly"),action:()=>{this.$store.commit("checkMigrations","migrations-only")}},{label:this.$t("ui.maintenance.database.schemaOnly"),action:()=>{this.$store.commit("checkMigrations","schema-only")}}]},async createBackup(){await this.$store.dispatch("tasks/execute",{name:"contao/backup-create"}),await this.$store.dispatch("contao/backup/fetch",!1)}},mounted(){this.$store.dispatch("server/database/get"),this.$store.dispatch("contao/backup/fetch")}};const ks=(0,Z.A)(ms,[["render",is]]);var vs=ks,bs=a.p+"img/symfony-logo.5c162c73.svg",_s=a.p+"img/symfony-logo--dark.ea265042.svg";const fs={class:"maintenance"},ws={class:"maintenance__inside"},ys={class:"maintenance__about"},Cs={class:"maintenance__actions"};function $s(e,t,a,s,o,n){const i=(0,r.g2)("link-menu"),l=(0,r.g2)("button-group");return(0,r.uX)(),(0,r.CE)("section",fs,[(0,r.Lk)("div",ws,[t[0]||(t[0]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{class:"color-scheme--light",src:bs,alt:""}),(0,r.Lk)("img",{class:"color-scheme--dark",src:_s,alt:""})],-1)),(0,r.Lk)("div",ys,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.rebuildCache.title")),1),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.rebuildCache.description")),1)]),(0,r.Lk)("fieldset",Cs,[(0,r.bF)(l,{label:e.$t("ui.maintenance.rebuildCache.rebuildProd"),type:"primary",icon:"update",onClick:n.rebuildProd},{default:(0,r.k6)((()=>[(0,r.bF)(i,{align:"right",items:n.advancedActions(),color:"primary"},null,8,["items"])])),_:1},8,["label","onClick"])])])])}var Ls={components:{ButtonGroup:Jt.A,LinkMenu:fa.A},methods:{advancedActions(){return[{label:this.$t("ui.maintenance.rebuildCache.rebuildDev"),action:this.rebuildDev},{label:this.$t("ui.maintenance.rebuildCache.clearProd"),action:this.clearProd},{label:this.$t("ui.maintenance.rebuildCache.clearDev"),action:this.clearDev}]},rebuildProd(){this.execute("prod",!0)},rebuildDev(){this.execute("dev",!0)},clearProd(){this.execute("prod",!1)},clearDev(){this.execute("dev",!1)},execute(e,t){const a={name:"contao/rebuild-cache",config:{environment:e,warmup:t}};this.$store.dispatch("tasks/execute",a)}}};const As=(0,Z.A)(Ls,[["render",$s]]);var Es=As;const Xs={class:"maintenance"},Ss={class:"maintenance__inside"},Ms={class:"maintenance__about"},Ts={key:0,class:"maintenance__actions"};function xs(e,t,a,s,o,n){const i=(0,r.g2)("loading-spinner"),l=(0,r.g2)("loading-button"),u=(0,r.g2)("message-overlay");return(0,r.uX)(),(0,r.Wv)(u,{message:n.overlayMessage,active:e.safeMode||!1===e.isSupported},{default:(0,r.k6)((()=>[(0,r.Lk)("section",Xs,[(0,r.Lk)("div",Ss,[t[0]||(t[0]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:h,alt:""})],-1)),(0,r.Lk)("div",Ms,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.installTool.title")),1),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.installTool.description")),1)]),e.safeMode||!1===e.isSupported?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("fieldset",Ts,[null===e.isLocked?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"maintenance__loader"})):e.isLocked?((0,r.uX)(),(0,r.Wv)(l,{key:1,class:"widget-button widget-button--primary widget-button--unlock",loading:e.loading,disabled:!e.isSupported,onClick:n.unlock},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.installTool.unlock")),1)])),_:1},8,["loading","disabled","onClick"])):((0,r.uX)(),(0,r.Wv)(l,{key:2,class:"widget-button widget-button--primary widget-button--lock",loading:e.loading,disabled:!e.isSupported,onClick:n.lock},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.installTool.lock")),1)])),_:1},8,["loading","disabled","onClick"]))]))])])])),_:1},8,["message","active"])}var Os={components:{MessageOverlay:gs,LoadingSpinner:hs.A,LoadingButton:ta.A},data:()=>({loading:!1}),computed:{...(0,g.aH)(["safeMode"]),...(0,g.aH)("contao/install-tool",["isLocked","isSupported"]),overlayMessage:e=>e.safeMode?e.$t("ui.maintenance.safeMode"):e.$t("ui.maintenance.unsupported")},methods:{async unlock(){this.loading=!0,await this.$store.dispatch("contao/install-tool/unlock"),this.loading=!1},async lock(){this.loading=!0,await this.$store.dispatch("contao/install-tool/lock"),this.loading=!1}},mounted(){this.$store.dispatch("contao/install-tool/fetch")}};const Is=(0,Z.A)(Os,[["render",xs]]);var Ps=Is;const Fs={class:"maintenance"},Bs={class:"maintenance__inside"},Rs={class:"maintenance__about"},Us={key:0},qs={key:0,class:"maintenance__actions"},js={key:1,class:"maintenance__actions"},Ds={key:2,class:"maintenance__actions"};function Vs(e,t,a,s,o,n){const i=(0,r.g2)("i18n-t"),l=(0,r.g2)("loading-spinner"),u=(0,r.g2)("loading-button"),d=(0,r.g2)("message-overlay");return(0,r.uX)(),(0,r.Wv)(d,{message:n.overlayMessage,active:e.safeMode||!e.loading&&!e.supportsJwtCookie&&!e.supportsAccessKey},{default:(0,r.k6)((()=>[(0,r.Lk)("section",Fs,[(0,r.Lk)("div",Bs,[t[1]||(t[1]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:h,alt:""})],-1)),(0,r.Lk)("div",Rs,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.debugMode.title")),1),e.supportsJwtCookie?((0,r.uX)(),(0,r.CE)("p",Us,(0,c.v_)(e.$t("ui.maintenance.debugMode.descriptionJwt")),1)):e.supportsAccessKey?((0,r.uX)(),(0,r.Wv)(i,{key:1,tag:"p",keypath:"ui.maintenance.debugMode.description"},{appDevPhp:(0,r.k6)((()=>t[0]||(t[0]=[(0,r.Lk)("code",null,"app_dev.php",-1)]))),_:1})):(0,r.Q3)("",!0)]),!e.loading||e.supportsJwtCookie||e.supportsAccessKey?e.supportsJwtCookie?((0,r.uX)(),(0,r.CE)("fieldset",js,[e.hasJwtDebug?((0,r.uX)(),(0,r.Wv)(u,{key:1,class:"widget-button widget-button--alert widget-button--hide",loading:e.loading,onClick:n.removeJwtCookie},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.debugMode.deactivate")),1)])),_:1},8,["loading","onClick"])):((0,r.uX)(),(0,r.Wv)(u,{key:0,class:"widget-button widget-button--primary widget-button--show",loading:e.loading,onClick:n.enableJwtDebugMode},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.debugMode.activate")),1)])),_:1},8,["loading","onClick"]))])):e.supportsAccessKey?((0,r.uX)(),(0,r.CE)("fieldset",Ds,[e.hasAccessKey?((0,r.uX)(),(0,r.Wv)(u,{key:1,class:"widget-button widget-button--alert widget-button--hide",loading:e.loading,onClick:n.removeAccessKey},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.debugMode.deactivate")),1)])),_:1},8,["loading","onClick"])):((0,r.uX)(),(0,r.Wv)(u,{key:0,class:"widget-button widget-button--primary widget-button--show",loading:e.loading,onClick:n.setAccessKey},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.debugMode.activate")),1)])),_:1},8,["loading","onClick"])),e.hasAccessKey?((0,r.uX)(),(0,r.Wv)(u,{key:2,class:"widget-button widget-button--edit",loading:e.loading,onClick:n.setAccessKey},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.debugMode.credentials")),1)])),_:1},8,["loading","onClick"])):(0,r.Q3)("",!0)])):(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("fieldset",qs,[(0,r.bF)(l,{class:"maintenance__loader"})]))])])])),_:1},8,["message","active"])}var Ws={components:{MessageOverlay:gs,LoadingSpinner:hs.A,LoadingButton:ta.A},data:()=>({supportsJwtCookie:!1,supportsAccessKey:!1,loading:!0}),computed:{...(0,g.aH)(["safeMode"]),...(0,g.aH)("contao/access-key",{hasAccessKey:"isEnabled"}),...(0,g.aH)("contao/jwt-cookie",{hasJwtDebug:"isDebugEnabled"}),overlayMessage:e=>e.safeMode?e.$t("ui.maintenance.safeMode"):e.$t("ui.maintenance.unsupported")},methods:{async enableJwtDebugMode(){this.loading=!0,await this.$store.dispatch("contao/jwt-cookie/enableDebug"),this.loading=!1},async removeJwtCookie(){this.loading=!0,await this.$store.dispatch("contao/jwt-cookie/delete"),this.loading=!1},async setAccessKey(){const e=prompt(this.$t("ui.maintenance.debugMode.user"));if(!e)return;const t=prompt(this.$t("ui.maintenance.debugMode.password"));t&&(this.loading=!0,await this.$store.dispatch("contao/access-key/set",{user:e,password:t}),this.loading=!1)},async removeAccessKey(){this.loading=!0,await this.$store.dispatch("contao/access-key/delete"),this.loading=!1}},mounted(){this.$store.dispatch("contao/jwt-cookie/get").then((()=>{this.supportsJwtCookie=!0,this.supportsAccessKey=!1,this.loading=!1}),(()=>this.$store.dispatch("contao/access-key/get").then((()=>{this.supportsJwtCookie=!1,this.supportsAccessKey=!0,this.loading=!1}),(()=>{this.supportsJwtCookie=!1,this.supportsAccessKey=!1,this.loading=!1}))))}};const Qs=(0,Z.A)(Ws,[["render",Vs]]);var Hs=Qs,Gs="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAABgFBMVEX///94Xz5KNyUGBQX15cxyWjucYTRqVDgAAACJVjD//+oXFxb8/PwdHRz5+fkICg709PR9ZEH///IoJyYQERMtLS2UXDI4LCBbPiciISH/+d5hTzVWRjAuJBvV1dX77dPOzs+mZzb//uNubnBLTEw4Myz04snv8PD/9No5ODY+PTqWl5cUCwPa2tump6eDVC9IRkP15Mvs7Oz+8daHbEnHyMlBQT+xp5abnJ3///je39/m5udYWFXCwsNWU0uRkZKJiotySitpRSosHA766c+hoaLEuKN1dnjz4chnZ2e6sJ2ysrN8fH1HKRJbXF6NhHZybWMfEwj35s2jm4phYWNSUlTj4+NTTUO8vLzp4crp6eqTjH18UC62t7h7dWn46tGPj4+sra2flIJiW1BmYlrKv6pwaV3a0LrVybOBgoOFfG/89d7k1b3LxrXo3MXz4Mbv5s7Rw6xhNhaSkonv69Ssd0/e1MGSVyqGSh3KnXt4RB1ocXqDTyiBhHz6+ebw7uYmf38+AAAM/0lEQVRYw61ZB1viWtc9JAY2CSEhBQhVmtJFQRBF7Nh7772Xabe+9a9/+4DM6Nx3BO8353miecLJysrea5dzQsi7h8329dROfuqwF2dvtxqnWWP4ZyLbNqBWEiPd9Dx2thr4idARIZJ4JMvpETxPzX1kbT8PekEg8+kc4bfVDLHp5Pz2J9I2YuQ/OntNasIAmVrn2e6/adj52Lc7+5/1oE4QsgL7JJwcHbogy5t/SwvzqXNo6ktOGjJeikQHSSVWJiWo4gNylSdFHGoHqukSGUFIZrRY2k027xuAFP03AuvCiT2yrZBdI1c+BiiR5Wgb0DHx2QwA/dlYcp/sCs8C3hLUhmFkfZlcJYY3jxSeTx49redWlLjQ2tq2KDtQP0ksn0H1WiFzxeebpuH066zZJHmMFdkzJR6sxcv5m2PlKtWa9W0pQS0xIhCSTBD+DjrrlzNaUn4xa0rkyRELJSUY7+rCw/Mp1xo6e/ZpCd8ZHsKee6F4frc8Sh2wADuvpw3DLnmoQincUR+TnlhriwzmSGyP6Ffl3jh6SCfxGCpOgtzod1moE64Jv3/maUD3KtX+Nvx4/ylyKITD14kbsqvuk+WBBTBqJB35bl4AdnlS7pppYPPLA23khzNShRteuQOjRO5zp1cgrsfJJfwlB92K/6klj4LHdWjPXBvBfrhNano8eL9+OSes/PcIxDkPX/70GtneObCxGQUJNZRvsM7fzLaGlvW8crXMz3g8JKwBJHfLQc9HeGXJjFG9uDur3SyXlPizQfLX7QRNcU75tH/f5VEec8LKo8czc6z4s69mRP0fFUJ4Dx/u7W0gdwRnYm1Um4FzJR8MKh8vQH0s88GurvJd4ru4CgxUc0cdylpXR3PEr/U2knafGs8rnn2AfZ5HVl2eXZD/GrX9S+J6uWkOVMhRW8kPVTcnwPZHJUhZrSnJ6f85bU/c9ijxyWfofa0d6OHtC9DmlHAXNWQXfwm2H1VI4ctuWMl/oLa+T3e2kfoXAI48ymTdkL2TxLXww6mdOogrx3Gk0KVcVdqABjgj+YaHuibJOrzl+swtnBNqOM+D1IZEbKkY3zDhTLhcghbpMgBX8SDNIrFG0u1+Wykwp1DWvfndKrSMsoA0x6OQ+JqOrp3S4W3yo+IvQZoqw7rQhnMWcnwwrPAPQiUBQk5/e3I31DAR93oetHaaly0I85dHBrDixnC33MKb/fo9JrQ1fnukraLPJg0A/RZfsB82pt+YiMfGPrV1/EFtw+eZWwOkaHavUdjUyI+lSqJ6qt+4weQzyS+/nmbb6p9PTfX3vUrBLBjTwy/MNh/5MbS6MJpT9eLdZZxsv/ShLSuw6YnFxVW22P/SzlOv7h5ST96AHsQ/pxsJQ92GzAt6wupnq5mOnkVY+iawhReK2BuILgV+7HhZsGUTtKRsDVSSam4kUEfpLrL/CJmt9eEMWVlJ/ha7z0VRzi6pE2zizZRKdFhqlvfUppCkF2HC/AxMh9mcjg4NTw3XG7Ys1FvODTW96jY50rkfsx4skhHt9EVfgm7Zg8WQ9cXoMfew7MRiGgS61pCmA9M6m2ZMDs7LOeDwx1VXfd2rLPUj588U2Yl2duIfJ56H/P5Q6PfClLhEOxIJGIuJs+DgvC/985eMIEQj0yPzgWeNqWhN5Ow0W8fcjMvvdzHuHrPV7DacVufvf27pRXypyGrB0himQvr0jRjo0yDNspqYiP7zZGd0liRXQ07zgUs0XAzjxsG43E7zuL+n56Dnj19/Y7Fx05k6ZQvnc3lXs28FmOBDq7ldE2kAFvpP2bOQ1aX53Q3pUfUxjLNHZNwM41oMlaB7GJ5Jc17GgM43E7AJZ3Emh8PhE2xDUinkloSxFwpBzu5xP3XnuEsbZ9TuKGN6Nkih4H8rvQ+Bz9FkIZHU/p8TEvNSelR9Y5rLXH9IYckPgUFoQnMO5s28M886mjON6NTDqnTwSnpUIWbRT6F7Dqx/TunRW6F5g8U08WYXlWGbJEwu2LlgrS8pO51jFJoRUdx4Mrb46x379TXxDjh9s6FkOW9joiMmqpqzjvE1EP3I13ngHnNZnXjdeRDzC6LlKxff/2iHXvYhX1k7fJLwDZmGy5jAjpmtIcYVcvtR39Ye568jmsg1STvYt0tpJzSnOmISfW8nDUKz9WDMLbKolZ7QgcSEzOPGOPXBH7VD8Jmafoeh9qA5L8tguFgPxmmkMH6JFTBarKEDEdL4tAOxrpw/Pv1TbEpqItGiMoIFsdHcJlUImRETh8tvYJCPI7DT7BYgVkmb8VwU8crvv95pDdac5fvV1F9ZN30i9Ixh1NXBkfcBTU+hz35VwvZKBWso5HQJfmb8X2OixcE1BGVrBe3lKAVHzM+IY24XpqTxHnMoFDI7/7W4ur1gwFVY2RWBoeDj9KF+NcYhcVN6ulU7BF76gpzJ0CQGwRHzH58/Ly4uTky4cqNzRb0Ujn/gg7iWwUc6e8bRE4ua5nVYuDcy6nM1AF/99XySoUqu0MFE2l+9uFg5+veX0o2H1Eq7HmzZZ8L8FxY0v2EYmqbGVE3yoVRbdUR7z9AuySeKZj+o/34M4hKR/lQOl1dqn6rl+ORaV1D5bZtdXRyzjouqyeJldIer2Kpr6QaayTiLxJgkZpFdDyue+PG5mNhe2Z97WobroHbmCfM4FM/ceWxVmBA0lXOYOG61lamJzLqpG30CxwkClPh8x9r9sl7N6RrLAqzz/BkI0dx5pXp+ScK7j+LFCoCKyjax861ZeznOwjGMg1Ml9jKxrvR+eAg+hZVwbfncyHs6+OsYnOcq649fLuMepVKr+pMQwxeFlns53WlUkpfzejmTqsHVsv5LMP/xKiHosdzscfWc7+otH+srpcu56spT0FOrzYG34NIsnFto2deiG70urDOcpcBIGjys7/PHT9e7R+r5zUd+2UAXrnme9isCHPH5D2H+QURxOMRkYTHZuqndAEw4VCQcZ4hpg+fDH9aCeT5MW8w54UOcD87ElfDTTPj4Az9XFEDE9/MlCxNLbXTM8qbL8ZwVDJ+QTD3cY0+8NrmGLfdVklcuLjyTvWv5+Bou5DX2s2bQ6PUVVkfb6cYz4GtUaTR6gYGkEmwsxj2XkCBH8Jhfq6/PwuUqHIyJYj0xmFrGYmOkgHE0+iG0uA/TUX3l23Ec/E0Eun8TxHjMK79UJC/jjgkU2uHS29w67ASqkwbz7VV2XwnP9M54+K7a+kXpl9LRTb4jf72ig8Phd3kFGr0maHuzWc5hNa0TNyXH/JDbVXo96zHVSC6vVC8Sl56O+8svF0LBJIoFEaMXG4t37JGnwN9Iwz6Xi0tLj8p96bxEnpK5Wpkusz/ESdRvMsVEB4PQJp/xnv3UALAWGsCM5Cs4/PDIx8vls0Tlqnj1MUiX5SUJg9aiehvPLxI50P5Gtj0KNA3rMby5MAG/8fwRXNzEn9avg7gU5nUXysgUo8nMVHBJUeh8D/EpcHGWOi2HC/T7sHRHPJP5cLCrd5LcwbbDi7R9nMMywc7uwN77NpkDzcD0wmFkm1RvPFThvV0ess5uilRDJodvIj09SPpkknnXFnmmXt6pwQVsj0uExs5anleCK7g+0hiTyeFOiwO0ZQocRrPtiMQe6JO3+nCmbdZlavQkYob0q3dxBVPK8SU2ereERNIFho0dovNsw7Narj3O9ltgO4dPItPDI2DCCkK7OboSjURX9leSKkCCLi93sAbQzqP7BGsEdA4F5PbAU1kbkTtTEYNNu3wOr5Yl8sD0QlEDMVLUpyOVzXkyK9C6MhhBXC3SPyS3bebB5wVz3+mmtJpW6aozuzOqQ6KyaURGUrPCziyqLaADGCeB936ussuyvX6PPbPE0gVhZlOYHrLJtu6RSvRkEFd+QxLA6OD7UPuyqY3NoiBoaEVJHd2hm+OBxLeNqCVhMxrB36KBd39Ksvf19XXLOLqHMp0DUSQ3m4LZ09R8XQa2RIJ+8BCnZPL/H/ahw4VEZQMfEekjdiwI5DS68/fhujN1Q8ud3/atsydYCk5gg/QlErZX3xrtnSftx+IIWpJGOjoKbT+CZhigmxSigBbfqP+WApqR5jVBCmzhSr3ttHoCmb0+sgVZ9B4hGh46Vr+NBAKSipqZgr5B2DpJkaw2MDJlL8ZIBNqVSKOKwgLSZ8kpLOGtrI2A3Q5ZugdiB9sexZKxcKFdICB/t1f0xua73iiRaFFp3oZGGWFnNXxgBbIEMAjnEXcJj0O0xDQukXUYbVcRiDCYHMoaFJ7k1CUJ5CkdjTHajUQpzYguE3WBRKOdOzYyoA2jb9usuiCyoNtSmr0f5B2QNXRYUeuDSH2bbKtbihADMgOQ0cRZYZMkRGTQZuojESkySBmDtDeI9SOyQ7+wZVnqABtbFw2ZYuEkoCUjI8M2QAGdArwrkwwGCNl83ruzyaQR1XLnM4bclLbcnPveT7B/P+r+D5q++1kip6P4AAAAAElFTkSuQmCC";const Ns={class:"maintenance"},zs={class:"maintenance__inside"},Ks={class:"maintenance__about"},Js={class:"maintenance__actions"};function Zs(e,t,a,s,o,n){return(0,r.uX)(),(0,r.CE)("section",Ns,[(0,r.Lk)("div",zs,[t[1]||(t[1]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:Gs,alt:""})],-1)),(0,r.Lk)("div",Ks,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.dumpAutoload.title")),1),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.dumpAutoload.description")),1)]),(0,r.Lk)("fieldset",Js,[(0,r.Lk)("button",{class:"widget-button widget-button--primary widget-button--update",onClick:t[0]||(t[0]=(...e)=>n.execute&&n.execute(...e))},(0,c.v_)(e.$t("ui.maintenance.dumpAutoload.button")),1)])])])}var Ys={methods:{execute(){this.$store.dispatch("tasks/execute",{name:"composer/dump-autoload"})}}};const eo=(0,Z.A)(Ys,[["render",Zs]]);var to=eo;const ao={class:"maintenance"},so={class:"maintenance__inside"},oo={class:"maintenance__about"},no={class:"maintenance__actions"};function io(e,t,a,s,o,n){const i=(0,r.g2)("i18n-t"),l=(0,r.g2)("link-menu"),u=(0,r.g2)("button-group");return(0,r.uX)(),(0,r.CE)("section",ao,[(0,r.Lk)("div",so,[t[2]||(t[2]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:Gs,alt:""})],-1)),(0,r.Lk)("div",oo,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.composerInstall.title")),1),(0,r.bF)(i,{tag:"p",keypath:"ui.maintenance.composerInstall.description"},{vendor:(0,r.k6)((()=>t[0]||(t[0]=[(0,r.Lk)("code",null,"/vendor",-1)]))),composerLock:(0,r.k6)((()=>t[1]||(t[1]=[(0,r.Lk)("code",null,"composer.lock",-1)]))),_:1})]),(0,r.Lk)("fieldset",no,[(0,r.bF)(u,{label:e.$t("ui.maintenance.composerInstall.button"),type:"primary",icon:"run",onClick:n.composerInstall},{default:(0,r.k6)((()=>[(0,r.bF)(l,{align:"right",items:n.advancedActions,color:"primary"},null,8,["items"])])),_:1},8,["label","onClick"])])])])}var lo={components:{ButtonGroup:Jt.A,LinkMenu:fa.A},computed:{advancedActions(){return[{label:this.$t("ui.maintenance.composerInstall.update"),action:this.composerUpdate}]}},methods:{composerInstall(){this.$store.dispatch("tasks/execute",{name:"composer/install"})},composerUpdate(){this.$store.dispatch("tasks/execute",{name:"composer/update"})}}};const ro=(0,Z.A)(lo,[["render",io]]);var co=ro;const uo={class:"maintenance"},po={class:"maintenance__inside"},go={class:"maintenance__about"},ho={class:"maintenance__actions"};function mo(e,t,a,s,o,n){return(0,r.uX)(),(0,r.CE)("section",uo,[(0,r.Lk)("div",po,[t[1]||(t[1]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:Gs,alt:""})],-1)),(0,r.Lk)("div",go,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.composerCache.title")),1),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.composerCache.description")),1)]),(0,r.Lk)("fieldset",ho,[(0,r.Lk)("button",{class:"widget-button widget-button--primary widget-button--trash",onClick:t[0]||(t[0]=(...e)=>n.execute&&n.execute(...e))},(0,c.v_)(e.$t("ui.maintenance.composerCache.button")),1)])])])}var ko={methods:{execute(){this.$store.dispatch("tasks/execute",{name:"composer/clear-cache"})}}};const vo=(0,Z.A)(ko,[["render",mo]]);var bo=vo,_o=a.p+"img/php-logo.7376e212.svg";const fo={key:0,class:"maintenance"},wo={class:"maintenance__inside"},yo={class:"maintenance__about"},Co={class:"maintenance__actions"};function $o(e,t,a,s,o,n){const i=(0,r.g2)("loading-spinner");return e.status.opcache_enabled?((0,r.uX)(),(0,r.CE)("section",fo,[(0,r.Lk)("div",wo,[t[1]||(t[1]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:_o,alt:""})],-1)),(0,r.Lk)("div",yo,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.opcodeCache.title")),1),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.opcodeCache.description")),1)]),(0,r.Lk)("fieldset",Co,[e.loading?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"maintenance__loader"})):((0,r.uX)(),(0,r.CE)("button",{key:1,class:"widget-button widget-button--primary widget-button--trash",onClick:t[0]||(t[0]=(...e)=>n.execute&&n.execute(...e))},(0,c.v_)(e.$t("ui.maintenance.opcodeCache.button")),1))])])])):(0,r.Q3)("",!0)}var Lo={components:{LoadingSpinner:hs.A},data:()=>({opcodeEnabled:!1,loading:!1,status:{opcache_enabled:!1}}),methods:{execute(){this.loading=!0,this.$store.dispatch("server/opcache/delete",this.status.reset_token).then((e=>{this.loading=!1,this.status=e}))}},mounted(){this.$store.dispatch("server/opcache/get").then((e=>{this.status=e}),(()=>{this.status={opcache_enabled:!1}}))}};const Ao=(0,Z.A)(Lo,[["render",$o]]);var Eo=Ao;const Xo={class:"maintenance"},So={class:"maintenance__inside"},Mo={class:"maintenance__about"},To={class:"maintenance__actions"};function xo(e,t,a,s,o,n){const i=(0,r.g2)("loading-spinner"),l=(0,r.g2)("loading-button"),u=(0,r.g2)("message-overlay");return(0,r.uX)(),(0,r.Wv)(u,{message:n.overlayMessage,active:e.safeMode||!e.loading&&!e.supported},{default:(0,r.k6)((()=>[(0,r.Lk)("section",Xo,[(0,r.Lk)("div",So,[t[0]||(t[0]=(0,r.Lk)("figure",{class:"maintenance__image"},[(0,r.Lk)("img",{src:h,alt:""})],-1)),(0,r.Lk)("div",Mo,[(0,r.Lk)("h1",null,(0,c.v_)(e.$t("ui.maintenance.maintenanceMode.title")),1),(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.maintenance.maintenanceMode.description")),1)]),(0,r.Lk)("fieldset",To,[e.loading&&!e.supported?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"maintenance__loader"})):e.enabled?((0,r.uX)(),(0,r.Wv)(l,{key:2,class:"widget-button widget-button--alert widget-button--maintenance",loading:e.loading,disabled:!e.supported,onClick:n.disableMaintenanceMode},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.maintenanceMode.disable")),1)])),_:1},8,["loading","disabled","onClick"])):((0,r.uX)(),(0,r.Wv)(l,{key:1,class:"widget-button widget-button--primary widget-button--maintenance",loading:e.loading,disabled:!e.supported,onClick:n.enableMaintenanceMode},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.maintenance.maintenanceMode.enable")),1)])),_:1},8,["loading","disabled","onClick"]))])])])])),_:1},8,["message","active"])}var Oo={components:{MessageOverlay:gs,LoadingSpinner:hs.A,LoadingButton:ta.A},data:()=>({loading:!0,supported:!1,enabled:!1}),computed:{...(0,g.aH)(["safeMode"]),overlayMessage:e=>e.safeMode?e.$t("ui.maintenance.safeMode"):e.$t("ui.maintenance.unsupported")},methods:{async enableMaintenanceMode(){this.loading=!0,this.enabled=await this.$store.dispatch("contao/maintenance-mode/enable"),this.loading=!1},async disableMaintenanceMode(){this.loading=!0,this.enabled=await this.$store.dispatch("contao/maintenance-mode/disable"),this.loading=!1}},async mounted(){const e=await this.$store.dispatch("server/contao/get");if(200===e.status){const t=Object.keys(e.data?.cli?.commands);this.supported=t.includes("contao:maintenance-mode")||t.includes("lexik:maintenance:lock")&&t.includes("lexik:maintenance:unlock"),this.supported&&(this.enabled=await this.$store.dispatch("contao/maintenance-mode/isEnabled"))}this.loading=!1}};const Io=(0,Z.A)(Oo,[["render",xo]]);var Po=Io,Fo={components:{MainLayout:re,DatabaseStatus:vs,RebuildCache:Es,InstallTool:Ps,MaintenanceMode:Po,DebugMode:Hs,DumpAutoload:to,ComposerInstall:co,ComposerCache:bo,OpcodeCache:Eo},computed:{...(0,g.L8)("auth",["isGranted"])},mounted(){this.isGranted(te.A.UPDATE)||this.$router.push("/")}};const Bo=(0,Z.A)(Fo,[["render",Ga]]);var Ro=Bo;const Uo={class:"log-viewer__title"},qo={key:1,class:"log-viewer__status log-viewer__status--empty"},jo={class:"log-viewer__title"},Do={key:2},Vo={class:"log-viewer__filters"},Wo={class:"log-viewer__file"},Qo=["title"],Ho=["href","download","title"],Go={class:"log-viewer__list",ref:"list"},No={class:"log-viewer__line log-viewer__line--header"},zo={class:"log-viewer__meta log-viewer__meta--header"},Ko={class:"log-viewer__content log-viewer__content--header"},Jo={class:"log-viewer__meta"},Zo=["datetime"],Yo=["title"],en=["title"],tn={class:"log-viewer__content"},an={class:"log-viewer__message"},sn={class:"log-viewer__details"},on=["title"],nn=["title"],ln=["onClick"],rn=["onClick"],cn={key:1,class:"log-viewer__line log-viewer__more"},un={key:2,class:"log-viewer__loading"};function dn(e,t,a,s,o,n){const i=(0,r.g2)("loading-spinner"),l=(0,r.g2)("select-menu"),u=(0,r.g2)("vue-json-pretty"),d=(0,r.g2)("main-layout");return(0,r.uX)(),(0,r.Wv)(d,null,{default:(0,r.k6)((()=>[null===e.files?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"log-viewer__status log-viewer__status--loader"},{default:(0,r.k6)((()=>[(0,r.Lk)("p",Uo,(0,c.v_)(e.$t("ui.log-viewer.loading")),1)])),_:1})):e.files&&0===e.files.length?((0,r.uX)(),(0,r.CE)("div",qo,[(0,r.Lk)("p",jo,(0,c.v_)(e.$t("ui.log-viewer.empty")),1),(0,r.Lk)("button",{class:"widget-button widget-button--inline widget-button--update",onClick:t[0]||(t[0]=(...e)=>n.load&&n.load(...e))},(0,c.v_)(e.$t("ui.log-viewer.reload")),1)])):((0,r.uX)(),(0,r.CE)("div",Do,[(0,r.Lk)("div",Vo,[(0,r.Lk)("div",null,[(0,r.Lk)("div",Wo,[(0,r.bF)(l,{options:n.fileOptions,name:"file",label:e.$t("ui.log-viewer.file"),modelValue:e.file,"onUpdate:modelValue":t[1]||(t[1]=t=>e.file=t)},null,8,["options","label","modelValue"]),(0,r.Lk)("button",{class:"widget-button widget-button--inline widget-button--update",title:e.$t("ui.log-viewer.reload"),onClick:t[2]||(t[2]=(...e)=>n.load&&n.load(...e))},null,8,Qo)]),(0,r.Lk)("a",{href:`api/logs/${encodeURIComponent(e.file)}`,download:`${e.file}.log`,target:"_blank",class:(0,c.C4)(["widget-button widget-button--inline widget-button--download",{disabled:!e.file}]),title:e.$t("ui.log-viewer.downloadTitle",{file:`${e.file}.log`})},(0,c.v_)(e.$t("ui.log-viewer.download")),11,Ho)]),(0,r.Lk)("div",null,[(0,r.bF)(l,{options:n.channelOptions,name:"channel",label:e.$t("ui.log-viewer.channel"),modelValue:e.channel,"onUpdate:modelValue":t[3]||(t[3]=t=>e.channel=t)},null,8,["options","label","modelValue"]),(0,r.bF)(l,{options:n.levelOptions,name:"level",label:e.$t("ui.log-viewer.level"),modelValue:e.level,"onUpdate:modelValue":t[4]||(t[4]=t=>e.level=t)},null,8,["options","label","modelValue"])])]),(0,r.Lk)("div",Go,[(0,r.Lk)("div",No,[(0,r.Lk)("div",zo,(0,c.v_)(e.$t("ui.log-viewer.timeHeader")),1),(0,r.Lk)("div",Ko,(0,c.v_)(e.$t("ui.log-viewer.messageHeader")),1)]),n.lines?((0,r.uX)(!0),(0,r.CE)(r.FK,{key:0},(0,r.pI)(n.lines,((t,a)=>((0,r.uX)(),(0,r.CE)(r.FK,{key:a},["string"===typeof t?((0,r.uX)(),(0,r.CE)("div",{class:"log-viewer__line log-viewer__line--raw",key:a},(0,c.v_)(t),1)):((0,r.uX)(),(0,r.CE)("div",{key:1,class:(0,c.C4)(`log-viewer__line log-viewer__line--${t.level.toLowerCase()}`)},[(0,r.Lk)("div",Jo,[(0,r.Lk)("time",{class:"log-viewer__datetime",datetime:t.datetime},(0,c.v_)(n.datimFormat(t.datetime,"medium")),9,Zo),(0,r.Lk)("span",{class:(0,c.C4)(`log-viewer__badge log-viewer__badge--desktop log-viewer__badge--level-${t.level.toLowerCase()}`),title:e.$t("ui.log-viewer.levelTitle")},(0,c.v_)(t.level),11,Yo),(0,r.Lk)("span",{class:"log-viewer__badge log-viewer__badge--desktop log-viewer__badge--channel",title:e.$t("ui.log-viewer.channelTitle")},(0,c.v_)(t.channel),9,en)]),(0,r.Lk)("div",tn,[(0,r.Lk)("div",an,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(n.pieces(t.message),((e,t)=>((0,r.uX)(),(0,r.CE)("span",{key:t},(0,c.v_)(e),1)))),128))]),(0,r.Lk)("div",sn,[(0,r.Lk)("span",{class:(0,c.C4)(`log-viewer__badge log-viewer__badge--mobile log-viewer__badge--level-${t.level.toLowerCase()}`),title:e.$t("ui.log-viewer.levelTitle")},(0,c.v_)(t.level),11,on),(0,r.Lk)("span",{class:"log-viewer__badge log-viewer__badge--mobile log-viewer__badge--channel",title:e.$t("ui.log-viewer.channelTitle")},(0,c.v_)(t.channel),9,nn),n.canShow(t.context)?((0,r.uX)(),(0,r.CE)("button",{key:0,class:(0,c.C4)(["log-viewer__toggle",{"log-viewer__toggle--active":e.showContext[a]}]),onClick:e=>n.toggleContext(a)},(0,c.v_)(e.$t(`ui.log-viewer.${e.showContext[a]?"hide":"show"}Context`)),11,ln)):(0,r.Q3)("",!0),n.canShow(t.extra)?((0,r.uX)(),(0,r.CE)("button",{key:1,class:(0,c.C4)(["log-viewer__toggle",{"log-viewer__toggle--active":e.showExtra[a]}]),onClick:e=>n.toggleExtra(a)},(0,c.v_)(e.$t(`ui.log-viewer.${e.showExtra[a]?"hide":"show"}Extra`)),11,rn)):(0,r.Q3)("",!0)]),n.canShow(t.context)&&e.showContext[a]?((0,r.uX)(),(0,r.Wv)(u,{key:0,data:t.context,deep:1,class:"log-viewer__json"},null,8,["data"])):(0,r.Q3)("",!0),n.canShow(t.extra)&&e.showExtra[a]?((0,r.uX)(),(0,r.Wv)(u,{key:1,data:t.extra,deep:1,class:"log-viewer__json"},null,8,["data"])):(0,r.Q3)("",!0)])],2))],64)))),128)):(0,r.Q3)("",!0),n.current&&0!==e.offset?((0,r.uX)(),(0,r.CE)("div",cn,[(0,r.Lk)("button",{class:"widget-button widget-button--inline widget-button--add",onClick:t[5]||(t[5]=(...e)=>n.next&&n.next(...e))},(0,c.v_)(e.$t("ui.log-viewer.more")),1)])):(0,r.Q3)("",!0),e.loading?((0,r.uX)(),(0,r.CE)("div",un,[(0,r.bF)(i)])):(0,r.Q3)("",!0)],512)]))])),_:1})}a(1701);var pn=a(4144);const gn=["for"],hn=["id","name","disabled","required"],mn={key:0,value:""},kn=["label"],vn=["value","disabled","selected"],bn=["value","disabled","selected"],_n={key:1,class:"widget__error"};function fn(e,t,a,s,o,n){return(0,r.uX)(),(0,r.CE)("div",{class:(0,c.C4)(["widget widget-select",{"widget--error":a.error,"widget--required":a.required}])},[a.label?((0,r.uX)(),(0,r.CE)("label",{key:0,for:"ctrl_"+a.name},(0,c.v_)(a.label),9,gn)):(0,r.Q3)("",!0),(0,r.Lk)("select",{ref:"input",id:a.label?"ctrl_"+a.name:"",name:a.name,disabled:a.disabled,required:a.required,onChange:t[0]||(t[0]=e=>n.input(e.target.value))},[a.includeBlank?((0,r.uX)(),(0,r.CE)("option",mn,(0,c.v_)(e.$t("ui.widget.blankOption")),1)):(0,r.Q3)("",!0),((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(a.options,((e,t)=>((0,r.uX)(),(0,r.CE)(r.FK,null,[e.options?((0,r.uX)(),(0,r.CE)("optgroup",{label:e.label,key:t},[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.options,(e=>((0,r.uX)(),(0,r.CE)("option",{value:e.value,disabled:e.disabled,selected:e.value===a.modelValue,key:e.value},(0,c.v_)(e.label),9,vn)))),128))],8,kn)):((0,r.uX)(),(0,r.CE)("option",{value:e.value,disabled:e.disabled,selected:e.value===a.modelValue,key:e.value},(0,c.v_)(e.label),9,bn))],64)))),256))],40,hn),a.error?((0,r.uX)(),(0,r.CE)("p",_n,(0,c.v_)(a.error),1)):(0,r.Q3)("",!0)],2)}var wn={emits:["input","update:modelValue"],props:{name:{type:String,required:!0},options:{type:Array,required:!0},label:String,modelValue:String,disabled:Boolean,required:Boolean,error:String,includeBlank:Boolean},methods:{input(e){this.$emit("input"),this.$emit("update:modelValue",e)}},mounted(){this.$emit("update:modelValue",this.$refs.input.value)},updated(){this.$emit("update:modelValue",this.$refs.input.value)}};const yn=(0,Z.A)(wn,[["render",fn]]);var Cn=yn,$n={components:{MainLayout:re,LoadingSpinner:hs.A,SelectMenu:Cn,VueJsonPretty:pn.A},data:()=>({files:null,loading:!1,file:null,offset:0,limit:100,content:[],channel:"",level:"",showContext:{},showExtra:{}}),computed:{channelOptions:e=>e.countOptions("channel"),levelOptions:e=>e.countOptions("level",{emergency:0,alert:0,critical:0,error:0,warning:0,notice:0,info:0,debug:0}),fileOptions(){if(!this.files)return[];const e={},t=[];return this.files.forEach((a=>{const s=a.name.match(/^([a-z]+)-(\d{4}-\d{2}-\d{2})$/i);s?(e[s[1]]||(e[s[1]]={label:this.$te(`ui.log-viewer.${s[1]}Environment`)?this.$t(`ui.log-viewer.${s[1]}Environment`):s[1],options:[]}),e[s[1]].options.push({value:a.name,label:`${(0,Pt.A)(s[2],null,"long")} (${(0,st.A)(a.size)})`})):t.push({value:a.name,label:`${a.name} (${(0,st.A)(a.size)})`})})),[...Object.values(e),...t]},current:e=>e.files?.find((t=>t.name===e.file)),lines:e=>e.content?.filter((t=>"string"===typeof t||(!e.channel||t.channel===e.channel)&&(!e.level||t.level.toLowerCase()===e.level))).reverse()},methods:{datimFormat:Pt.A,canShow:e=>e&&(!Array.isArray(e)||e.length),pieces:e=>{let t=[];const a=e.split(' "'),s=a.length-1;let o=0;for(let n=0;n<=s;n++){let e=a[n];if(0!==o)while(o>0){while(!a[n].includes('"')&&n!==s)e=`${e} "${a[n+1]}`,o++,n++;if(o--,0===o){t[t.length-1]+=' "';const a=e.indexOf('" ')||e.lastIndexOf('"');t.push(e.slice(0,a)),t.push(e.slice(a)),o++;break}}else t.push(e),o++}return t},toggleContext(e){this.showContext[e]=!this.showContext[e]},toggleExtra(e){this.showExtra[e]=!this.showExtra[e]},countOptions(e,t={}){return this.content.forEach((a=>{"string"!==typeof a&&(t[a[e].toLowerCase()]||(t[a[e].toLowerCase()]=0),t[a[e].toLowerCase()]+=1)})),[{label:"all",value:""}].concat(Object.keys(t).map((e=>({value:e,label:`${e.at(0).toUpperCase()}${e.slice(1)} (${t[e]})`}))))},next(){this.limit=Math.min(this.offset,100),this.offset=Math.max(this.offset-100,0)},async load(){const e=this.file;this.files=null,this.file=null,this.files=(await s.A.get("api/logs")).data,this.file=this.files.find((t=>t.name===e))?.name||(this.files.length?this.files[0].name:null)},async fetch(){if(!this.current)return;this.loading=!0;const e=(await s.A.get(`api/logs/${encodeURIComponent(this.current.name)}?offset=${this.offset}&limit=${this.limit}`)).data;this.content=this.content.concat(Array.from(e.content.reverse())),this.loading=!1}},watch:{async file(){this.content=[],this.channel="",this.level="",this.showContext={},this.showExtra={},this.limit=100,this.offset=this.current?Math.max(this.current.lines-100,0):0,await this.fetch()},async offset(){await this.fetch()}},async created(){await this.load()}};const Ln=(0,Z.A)($n,[["render",dn]]);var An=Ln;const En={key:1},Xn={class:"user-manager__list"},Sn={key:0,class:"user-manager__ribbon"},Mn=["title"],Tn=["title"],xn=["title"],On={class:"user-manager__username"},In=["onClick"],Pn={class:"user-manager__new"};function Fn(e,t,a,s,o,n){const i=(0,r.g2)("loading-spinner"),l=(0,r.g2)("user-scope"),u=(0,r.g2)("main-layout");return(0,r.uX)(),(0,r.Wv)(u,{class:"user-manager"},{default:(0,r.k6)((()=>[null===e.users?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"user-manager__loading"},{default:(0,r.k6)((()=>[(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.user-manager.loading")),1)])),_:1})):((0,r.uX)(),(0,r.CE)("div",En,[(0,r.Lk)("div",Xn,[((0,r.uX)(!0),(0,r.CE)(r.FK,null,(0,r.pI)(e.users,((a,s)=>((0,r.uX)(),(0,r.CE)("div",{key:s,class:"user-manager__item"},[e.currentUser===a.username?((0,r.uX)(),(0,r.CE)("div",Sn,(0,c.v_)(e.$t("ui.user-manager.you")),1)):a.passkey?((0,r.uX)(),(0,r.CE)("div",{key:1,class:"user-manager__ribbon user-manager__ribbon--hint user-manager__ribbon--primary",title:e.$t("ui.user-manager.passkeyTitle")},(0,c.v_)(e.$t("ui.user-manager.passkey")),9,Mn)):a.totp_enabled?((0,r.uX)(),(0,r.CE)("div",{key:2,class:"user-manager__ribbon user-manager__ribbon--hint user-manager__ribbon--primary",title:e.$t("ui.user-manager.2faEnabled")},(0,c.v_)(e.$t("ui.user-manager.2fa")),9,Tn)):((0,r.uX)(),(0,r.CE)("div",{key:3,class:"user-manager__ribbon user-manager__ribbon--hint user-manager__ribbon--warning",title:e.$t("ui.user-manager.2faDisabled")},(0,c.v_)(e.$t("ui.user-manager.2fa")),9,xn)),(0,r.Lk)("div",On,(0,c.v_)(a.username),1),(0,r.bF)(l,{readonly:"",label:"Permissions","model-value":a.scope,class:"user-manager__scope"},null,8,["model-value"]),t[4]||(t[4]=(0,r.Lk)("div",{class:"user-manager__spacer"},null,-1)),e.currentUser!==a.username||e.hasPasskey?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("button",{key:4,class:"widget-button",onClick:t[0]||(t[0]=(...e)=>n.changePassword&&n.changePassword(...e))},(0,c.v_)(e.$t("ui.user-manager.changePassword")),1)),e.currentUser!==a.username||e.hasPasskey||e.hasTotp?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.CE)("button",{key:5,class:"widget-button",onClick:t[1]||(t[1]=(...e)=>n.setupTotp&&n.setupTotp(...e))},(0,c.v_)(e.$t("ui.user-manager.setupTotp")),1)),e.currentUser===a.username&&!e.hasPasskey&&e.hasTotp?((0,r.uX)(),(0,r.CE)("button",{key:6,class:"widget-button",onClick:t[2]||(t[2]=(...e)=>n.disableTotp&&n.disableTotp(...e))},(0,c.v_)(e.$t("ui.user-manager.disableTotp")),1)):(0,r.Q3)("",!0),e.currentUser!==a.username?((0,r.uX)(),(0,r.CE)("button",{key:7,class:"widget-button widget-button--alert widget-button--trash",onClick:e=>n.deleteUser(a.username)},(0,c.v_)(e.$t("ui.user-manager.delete")),9,In)):(0,r.Q3)("",!0)])))),128))]),(0,r.Lk)("div",Pn,[e.isGranted(n.scopes.ADMIN)?((0,r.uX)(),(0,r.CE)("button",{key:0,class:"widget-button widget-button--inline widget-button--add",onClick:t[3]||(t[3]=(...e)=>n.addUser&&n.addUser(...e))},(0,c.v_)(e.$t("ui.user-manager.invite")),1)):(0,r.Q3)("",!0)])]))])),_:1})}const Bn={class:"invite-user__text"},Rn={class:"invite-user__url"},Un={class:"invite-user__text"},qn=["href"],jn=["disabled"];function Dn(e,t,a,s,o,n){const i=(0,r.g2)("i18n-t"),l=(0,r.g2)("user-scope"),u=(0,r.g2)("loading-button"),d=(0,r.g2)("popup-overlay");return(0,r.uX)(),(0,r.Wv)(d,{class:"invite-user",headline:e.$t("ui.user-manager.inviteHeadline"),onSubmit:n.submit,onClear:n.close},{actions:(0,r.k6)((()=>[(0,r.Lk)("button",{type:"button",class:"widget-button",disabled:e.loading,onClick:t[2]||(t[2]=(...e)=>n.close&&n.close(...e))},(0,c.v_)(e.token?e.$t("ui.user-manager.close"):e.$t("ui.user-manager.cancel")),9,jn),e.token?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.Wv)(u,{key:0,submit:"",color:"primary",loading:e.loading},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.user-manager.createInvitation")),1)])),_:1},8,["loading"]))])),default:(0,r.k6)((()=>[e.token?((0,r.uX)(),(0,r.CE)(r.FK,{key:0},[t[3]||(t[3]=(0,r.Lk)("div",{class:"invite-user__check"},[(0,r.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,r.Lk)("path",{d:"M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"})])],-1)),(0,r.bF)(i,{tag:"p",keypath:"ui.user-manager.inviteSuccess1",class:"invite-user__text"},{expires:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(n.datimFormat(1e3*e.token.expires,"short","long")),1)])),_:1}),(0,r.Lk)("p",Bn,(0,c.v_)(e.$t("ui.user-manager.inviteSuccess2")),1),(0,r.Lk)("code",Rn,(0,c.v_)(e.token.url),1),e.clipboard.isSupported?((0,r.uX)(),(0,r.CE)("button",{key:0,type:"button",class:(0,c.C4)(["widget-button widget-button--small invite-user__clipboard",{"widget-button--clipboard":!e.clipboard.copied,"widget-button--check":e.clipboard.copied}]),onClick:t[0]||(t[0]=t=>e.clipboard.copy(e.token.url))},(0,c.v_)(e.$t("ui.user-manager.clipboard")),3)):(0,r.Q3)("",!0)],64)):((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("p",Un,(0,c.v_)(e.$t("ui.user-manager.inviteText")),1),(0,r.bF)(l,{modelValue:e.scope,"onUpdate:modelValue":t[1]||(t[1]=t=>e.scope=t)},null,8,["modelValue"]),(0,r.Lk)("a",{class:"invite-user__help",href:`https://to.contao.org/docs/manager-users?lang=${e.$i18n.locale}`,target:"_blank"},(0,c.v_)(e.$t("ui.user-manager.permissions")),9,qn)],64))])),_:1},8,["headline","onSubmit","onClear"])}var Vn=a(3513),Wn=a(1687),Qn={components:{PopupOverlay:Wn.A,LoadingButton:ta.A,UserScope:Va},data:()=>({loading:!1,scope:"admin",token:null,clipboard:(0,Vn.iDZ)()}),methods:{datimFormat:Pt.A,async submit(){this.loading=!0,this.$request.post("api/invitations",{scope:this.scope},null,{201:e=>{this.token=e.data,this.loading=!1}})},close(){this.$store.commit("modals/close","invite-user")}}};const Hn=(0,Z.A)(Qn,[["render",Dn]]);var Gn=Hn,Nn=a(9473);const zn={class:"disable-totp__text"},Kn=["disabled"];function Jn(e,t,a,s,o,n){const i=(0,r.g2)("text-field"),l=(0,r.g2)("loading-button"),u=(0,r.g2)("popup-overlay");return(0,r.uX)(),(0,r.Wv)(u,{class:"disable-totp",headline:e.$t("ui.totp.headline"),onSubmit:n.submit,onClear:n.close},{actions:(0,r.k6)((()=>[(0,r.Lk)("button",{type:"button",class:"widget-button",disabled:e.loading,onClick:t[2]||(t[2]=(...e)=>n.close&&n.close(...e))},(0,c.v_)(e.$t("ui.totp.cancel")),9,Kn),(0,r.bF)(l,{submit:"",color:"primary",loading:e.loading},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.totp.disable")),1)])),_:1},8,["loading"])])),default:(0,r.k6)((()=>[(0,r.Lk)("p",zn,(0,c.v_)(e.$t("ui.totp.disableText")),1),(0,r.bF)(i,{ref:"totp",name:"totp",required:"",pattern:"\\d+",minlength:"6",maxlength:"6",autocomplete:"one-time-code",error:e.error,onKeyup:t[0]||(t[0]=t=>e.error=""),modelValue:e.totp,"onUpdate:modelValue":t[1]||(t[1]=t=>e.totp=t)},null,8,["error","modelValue"])])),_:1},8,["headline","onSubmit","onClear"])}var Zn=a(9757),Yn={components:{PopupOverlay:Wn.A,LoadingButton:ta.A,TextField:Zn.A},data:()=>({loading:!1,error:"",totp:null}),computed:{...(0,g.aH)("auth",["username"])},methods:{submit(){this.loading=!0,this.$request.delete(`api/users/${this.username}/totp`,{data:{totp:this.totp}},null,{200:async()=>{await this.$store.dispatch("auth/status"),this.$notify.success(this.$t("ui.totp.disabled")),this.close()},422:()=>{this.loading=!1,this.error=this.$t("ui.totp.invalid"),this.$refs.totp.focus()}})},close(){this.$store.commit("modals/close","disable-totp")}},mounted(){setTimeout((()=>{this.$refs.totp.focus()}),0)}};const ei=(0,Z.A)(Yn,[["render",Jn]]);var ti=ei;const ai=["disabled"];function si(e,t,a,s,o,n){const i=(0,r.g2)("text-field"),l=(0,r.g2)("loading-button"),u=(0,r.g2)("popup-overlay");return(0,r.uX)(),(0,r.Wv)(u,{class:"change-password",headline:e.$t("ui.user-manager.passwordHeadline"),onSubmit:n.submit,onClear:n.close},{actions:(0,r.k6)((()=>[(0,r.Lk)("button",{type:"button",class:"widget-button",disabled:e.loading,onClick:t[3]||(t[3]=(...e)=>n.close&&n.close(...e))},(0,c.v_)(e.$t("ui.user-manager.cancel")),9,ai),(0,r.bF)(l,{submit:"",color:"primary",loading:e.loading,disabled:!n.inputValid},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.user-manager.submitPassword")),1)])),_:1},8,["loading","disabled"])])),default:(0,r.k6)((()=>[(0,r.Lk)("p",null,(0,c.v_)(e.$t("ui.user-manager.passwordText")),1),(0,r.bF)(i,{ref:"password",name:"current-password",type:"password",label:e.$t("ui.user-manager.currentPassword"),required:"",minlength:"8",autocomplete:"current-password",error:e.error,onKeyup:t[0]||(t[0]=t=>e.error=""),modelValue:e.currentPassword,"onUpdate:modelValue":t[1]||(t[1]=t=>e.currentPassword=t),disabled:e.loading},null,8,["label","error","modelValue","disabled"]),(0,r.bF)(i,{name:"new-password",type:"password",label:e.$t("ui.user-manager.newPassword"),placeholder:e.$t("ui.user-manager.passwordPlaceholder"),required:"",minlength:"8",autocomplete:"new-password",modelValue:e.newPassword,"onUpdate:modelValue":t[2]||(t[2]=t=>e.newPassword=t),disabled:e.loading},null,8,["label","placeholder","modelValue","disabled"])])),_:1},8,["headline","onSubmit","onClear"])}var oi={components:{PopupOverlay:Wn.A,LoadingButton:ta.A,TextField:Zn.A},data:()=>({loading:!1,currentPassword:"",newPassword:"",error:""}),computed:{...(0,g.aH)("auth",["username"]),inputValid:e=>e.currentPassword.length>=8&&e.newPassword.length>=8},methods:{async submit(){this.loading=!0,await this.$request.put(`api/users/${this.username}/password`,{current_password:this.currentPassword,new_password:this.newPassword},null,{200:()=>{this.$notify.success(this.$t("ui.user-manager.passwordChanged")),this.close()},422:()=>{this.error=this.$t("ui.user-manager.passwordError"),setTimeout((()=>{this.$refs.password.focus()}),0)}}),this.loading=!1},close(){this.$store.commit("modals/close","change-password")}},mounted(){this.$refs.password.focus()}};const ni=(0,Z.A)(oi,[["render",si]]);var ii=ni,li={components:{MainLayout:re,LoadingSpinner:hs.A,UserScope:Va},data:()=>({users:null}),computed:{...(0,g.aH)("auth",{currentUser:"username",hasTotp:"totpEnabled",hasPasskey:"passkey"}),...(0,g.L8)("auth",["isGranted"]),scopes:()=>te.A},methods:{load(){this.$request.get("api/users",null,{200:e=>{this.users=e.data}})},changePassword(){this.$store.commit("modals/open",{id:"change-password",component:ii})},setupTotp(){this.$store.commit("modals/open",{id:"setup-totp",component:Nn.A})},disableTotp(){this.$store.commit("modals/open",{id:"disable-totp",component:ti})},addUser(){this.$store.commit("modals/open",{id:"invite-user",component:Gn})},async deleteUser(e){confirm(this.$t("ui.user-manager.deleteConfirm",{username:e}))&&(await this.$request.delete(`api/users/${e}`),this.$notify.success(this.$t("ui.user-manager.deleted")),this.load())}},async mounted(){this.load()}};const ri=(0,Z.A)(li,[["render",Fn]]);var ci=ri;const ui=(0,i.aE)({history:(0,i.Bt)(),routes:[{name:l.A.discover.name,path:"/discover",component:ge},{name:l.A.packages.name,path:"/packages",component:$a},{name:l.A.oauth.name,path:"/oauth",component:Ha,props:!0},{name:l.A.maintenance.name,path:"/maintenance",component:Ro},{name:l.A.logViewer.name,path:"/logs",component:An},{name:l.A.userManager.name,path:"/users",component:ci},{path:"/:pathMatch(.*)*",redirect:"/discover"}]});var di=ui,pi=a(4173),gi=a(8044),hi=a(4710);const mi={id:"app"},ki={key:0,class:"app-hint app-hint--alert"},vi={class:"app-hint__headline"},bi={class:"app-hint__description"},_i={key:1,class:"app-hint"},fi={class:"app-hint__headline"},wi={class:"app-hint__description"},yi={key:2,class:"app-hint app-hint--warning"},Ci={class:"app-hint__headline"},$i={class:"app-hint__description"},Li=["href"],Ai={key:3,class:"app-hint app-hint--warning"},Ei={class:"app-hint__headline"},Xi={class:"app-hint__description"},Si=["inert"],Mi={class:"view-init__cell animate-initializing"},Ti={class:"view-init__message"},xi={key:3};function Oi(e,t,a,s,o,n){const i=(0,r.g2)("Notification"),l=(0,r.g2)("Notivue"),u=(0,r.g2)("error-view"),d=(0,r.g2)("task-view"),p=(0,r.g2)("router-view");return(0,r.uX)(),(0,r.CE)("div",mi,[(0,r.bF)(l,null,{default:(0,r.k6)((e=>[(0,r.bF)(i,{item:e},null,8,["item"])])),_:1}),e.safeMode&&"ready"===e.view?((0,r.uX)(),(0,r.CE)("div",ki,[(0,r.Lk)("strong",vi,(0,c.v_)(e.$t("ui.app.safeModeHeadline")),1),t[3]||(t[3]=(0,r.eW)("  ")),(0,r.Lk)("span",bi,(0,c.v_)(e.$t("ui.app.safeModeDescription")),1),t[4]||(t[4]=(0,r.eW)("  ")),(0,r.Lk)("button",{class:"app-hint__link",onClick:t[0]||(t[0]=(...e)=>n.exitSafeMode&&n.exitSafeMode(...e))},(0,c.v_)(e.$t("ui.app.safeModeExit")),1)])):e.limited?((0,r.uX)(),(0,r.CE)("div",_i,[(0,r.Lk)("strong",fi,(0,c.v_)(e.$t("ui.app.limitedHeadline")),1),t[5]||(t[5]=(0,r.eW)("  ")),(0,r.Lk)("span",wi,(0,c.v_)(e.$t("ui.app.limitedDescription")),1),t[6]||(t[6]=(0,r.eW)("  ")),(0,r.Lk)("button",{class:"app-hint__link",onClick:t[1]||(t[1]=(...t)=>e.logout&&e.logout(...t))},(0,c.v_)(e.$t("ui.app.limitedLogout")),1)])):n.isInsecure?((0,r.uX)(),(0,r.CE)("div",yi,[(0,r.Lk)("strong",Ci,(0,c.v_)(e.$t("ui.app.httpsHeadline")),1),t[7]||(t[7]=(0,r.eW)("  ")),(0,r.Lk)("span",$i,(0,c.v_)(e.$t("ui.app.httpsDescription")),1),t[8]||(t[8]=(0,r.eW)("  ")),(0,r.Lk)("a",{href:e.$t("ui.app.httpsHref"),target:"_blank",class:"app-hint__link"},(0,c.v_)(e.$t("ui.app.httpsLink")),9,Li)])):e.loaded&&e.username&&!e.totpEnabled?((0,r.uX)(),(0,r.CE)("div",Ai,[(0,r.Lk)("strong",Ei,(0,c.v_)(e.$t("ui.app.totpHeadline")),1),t[9]||(t[9]=(0,r.eW)("  ")),(0,r.Lk)("span",Xi,(0,c.v_)(e.$t("ui.app.totpDescription")),1),t[10]||(t[10]=(0,r.eW)("  ")),(0,r.Lk)("button",{class:"app-hint__link",onClick:t[2]||(t[2]=(...e)=>n.setupTotp&&n.setupTotp(...e))},(0,c.v_)(e.$t("ui.app.totpSetup")),1)])):(0,r.Q3)("",!0),e.error?((0,r.uX)(),(0,r.Wv)(u,{key:4})):(0,r.Q3)("",!0),(0,r.bF)(A.eB,{name:"animate-fade",mode:"out-in",style:{height:"100%"}},{default:(0,r.k6)((()=>[n.isInitializing||n.isReady?((0,r.uX)(),(0,r.CE)("div",{key:0,class:"view-init",inert:e.hasModal},[(0,r.Lk)("div",Mi,[t[11]||(t[11]=(0,r.Lk)("img",{src:h,width:"100",height:"100",alt:"Contao Logo"},null,-1)),(0,r.Lk)("p",Ti,(0,c.v_)(e.$t("ui.app.loading")),1)])],8,Si)):e.username&&e.taskStatus?((0,r.uX)(),(0,r.Wv)(d,{key:1,class:(0,c.C4)(e.hasModal?"animate-blur-in":"animate-blur-out"),inert:e.hasModal},null,8,["class","inert"])):n.currentView?((0,r.uX)(),(0,r.Wv)((0,r.$y)(n.currentView),{key:2,class:(0,c.C4)(e.hasModal?"animate-blur-in":"animate-blur-out"),inert:e.hasModal},null,8,["class","inert"])):((0,r.uX)(),(0,r.CE)("div",xi,[(0,r.bF)(p,{class:(0,c.C4)(e.hasModal?"animate-blur-in":"animate-blur-out"),inert:e.hasModal},null,8,["class","inert"])]))])),_:1}),e.hasModal?((0,r.uX)(),(0,r.Wv)((0,r.$y)(e.currentModal),{key:5})):(0,r.Q3)("",!0)])}var Ii=a(953);const Pi={class:"view-error"},Fi={class:"view-error__content"},Bi={class:"view-error__status"},Ri=["href"],Ui={class:"view-error__headline"},qi={key:0,class:"view-error__details"},ji={key:1,class:"view-error__debug"},Di={class:"view-error__actions"},Vi=["href"],Wi=["href"];function Qi(e,t,a,s,o,n){return(0,r.uX)(),(0,r.CE)("div",Pi,[n.isDebug?((0,r.uX)(),(0,r.CE)("button",{key:0,type:"button",class:"view-error__close",onClick:t[0]||(t[0]=(...e)=>n.close&&n.close(...e))},t[1]||(t[1]=[(0,r.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",fill:"#fff",xmlns:"http://www.w3.org/2000/svg"},[(0,r.Lk)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),(0,r.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"})],-1)]))):(0,r.Q3)("",!0),(0,r.Lk)("div",Fi,[t[3]||(t[3]=(0,r.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",class:"view-error__icon"},[(0,r.Lk)("path",{d:"M473.7 73.8l-2.4-2.5c-46-47-118-51.7-169.6-14.8L336 159.9l-96 64 48 128-144-144 96-64-28.6-86.5C159.7 19.6 87 24 40.7 71.4l-2.4 2.4C-10.4 123.6-12.5 202.9 31 256l212.1 218.6c7.1 7.3 18.6 7.3 25.7 0L481 255.9c43.5-53 41.4-132.3-7.3-182.1z"})],-1)),(0,r.Lk)("div",Bi,[t[2]||(t[2]=(0,r.eW)("ERROR ")),e.error.status?((0,r.uX)(),(0,r.CE)("a",{key:0,href:`https://developer.mozilla.org/${e.$i18n.locale}/docs/Web/HTTP/Status/${e.error.status}`,target:"_blank"},(0,c.v_)(e.error.status),9,Ri)):(0,r.Q3)("",!0)]),(0,r.Lk)("h1",Ui,(0,c.v_)(n.title),1),n.detail?((0,r.uX)(),(0,r.CE)("div",qi,(0,c.v_)(n.detail),1)):(0,r.Q3)("",!0),n.debug?((0,r.uX)(),(0,r.CE)("div",ji,(0,c.v_)(n.debug),1)):(0,r.Q3)("",!0),(0,r.Lk)("div",Di,["about:blank"!==e.error.type?((0,r.uX)(),(0,r.CE)("a",{key:0,href:e.error.type,target:"_blank",class:"view-error__link"},(0,c.v_)(e.$t("ui.error.moreLink")),9,Vi)):(0,r.Q3)("",!0),(0,r.Lk)("a",{href:`https://to.contao.org/support?lang=${e.$i18n.locale}`,target:"_blank",class:"view-error__link view-error__link--support"},(0,c.v_)(e.$t("ui.error.support")),9,Wi)])])])}var Hi={computed:{...(0,g.aH)(["error"]),response:e=>e.error.response,isDebug:()=>!1,title(){return this.error.title?this.error.title:this.response?this.$t("ui.error.title",{method:(this.response.config.headers["X-HTTP-Method-Override"]||this.response.config.method).toUpperCase(),url:this.response.config.url}):this.$t("ui.app.apiError")},detail(){return this.error.detail?this.error.detail:this.error.debug?"":500===this.error.status?this.$t("ui.error.server500"):this.response?this.$t("ui.error.response",this.error):""},debug(){return this.error.debug?this.error.debug:this.response&&this.response.data?this.response.data:""}},methods:{close(){this.$store.commit("setError",null)}}};const Gi=(0,Z.A)(Hi,[["render",Qi]]);var Ni=Gi,zi=a.p+"img/task.e9e5333f.svg",Ki=a(3382);const Ji={class:"view-task__header"},Zi={class:"view-task__headline"},Yi={key:0,class:"view-task__description"},el={class:"view-task__text"},tl={class:"view-task__text"},al={href:"https://github.com/contao/contao-manager/issues/new",target:"_blank"},sl={class:"view-task__actions"},ol={class:"view-task__text"},nl={class:"view-task__actions"},il={key:3,class:"view-task__actions"},ll={key:4,class:"view-task__loading"},rl={key:1,class:"view-task__sponsor"},cl=["href"];function ul(e,t,a,s,o,n){const i=(0,r.g2)("loading-button"),l=(0,r.g2)("check-box"),u=(0,r.g2)("loading-spinner"),d=(0,r.g2)("console-output"),p=(0,r.g2)("i18n-t"),g=(0,r.g2)("boxed-layout");return(0,r.uX)(),(0,r.Wv)(g,{wide:!0,slotClass:"view-task"},{default:(0,r.k6)((()=>[(0,r.Lk)("header",Ji,[t[3]||(t[3]=(0,r.Lk)("img",{src:zi,width:"80",height:"80",alt:"",class:"view-task__icon"},null,-1)),(0,r.Lk)("h1",Zi,(0,c.v_)(e.$t("ui.task.headline")),1),e.taskStatus?((0,r.uX)(),(0,r.CE)("p",Yi,(0,c.v_)(e.$t(`ui.task.${e.taskStatus}`)),1)):(0,r.Q3)("",!0),e.isFailed?((0,r.uX)(),(0,r.CE)(r.FK,{key:1},[(0,r.Lk)("p",el,[(0,r.eW)((0,c.v_)(e.$t("ui.task.failedDescription1")),1),t[1]||(t[1]=(0,r.Lk)("br",null,null,-1)),(0,r.eW)(" "+(0,c.v_)(e.$t("ui.task.failedDescription2")),1)]),(0,r.Lk)("p",tl,[t[2]||(t[2]=(0,r.Lk)("br",null,null,-1)),(0,r.Lk)("a",al,(0,c.v_)(e.$t("ui.task.reportProblem")),1)]),(0,r.Lk)("div",sl,[(0,r.bF)(i,{class:"view-task__action",loading:e.deletingTask,onClick:n.deleteTask},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.task.buttonClose")),1)])),_:1},8,["loading","onClick"])])],64)):e.isPaused&&e.allowContinue?((0,r.uX)(),(0,r.CE)(r.FK,{key:2},[(0,r.Lk)("p",ol,(0,c.v_)(e.$t("ui.task.pausedDescription")),1),(0,r.Lk)("div",nl,[(0,r.bF)(i,{class:"view-task__action",color:"primary",loading:e.deletingTask,onClick:n.continueTask},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.task.buttonContinue")),1)])),_:1},8,["loading","onClick"]),(0,r.bF)(i,{class:"view-task__action",loading:e.deletingTask,onClick:n.deleteTask},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.task.buttonClose")),1)])),_:1},8,["loading","onClick"])])],64)):e.hasTask?((0,r.uX)(),(0,r.CE)("div",il,[e.allowCancel&&(e.isActive||e.isAborting)?((0,r.uX)(),(0,r.Wv)(i,{key:0,class:"view-task__action",color:"alert",loading:e.isAborting,onClick:n.cancelTask},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.task.buttonCancel")),1)])),_:1},8,["loading","onClick"])):(0,r.Q3)("",!0),e.requiresAudit?((0,r.uX)(),(0,r.Wv)(i,{key:1,class:"view-task__action",color:"primary",loading:e.loadingMigrations,disabled:e.supportsMigrations&&!e.hasDatabaseChanges||e.deletingTask,onClick:n.updateDatabase},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.task.buttonAudit")),1)])),_:1},8,["loading","disabled","onClick"])):(0,r.Q3)("",!0),e.isActive||e.isAborting?(0,r.Q3)("",!0):((0,r.uX)(),(0,r.Wv)(i,{key:2,class:"view-task__action",loading:e.deletingTask,onClick:n.deleteTask},{default:(0,r.k6)((()=>[(0,r.eW)((0,c.v_)(e.$t("ui.task.buttonConfirm")),1)])),_:1},8,["loading","onClick"])),e.isActive&&e.allowAutoClose?((0,r.uX)(),(0,r.Wv)(l,{key:3,name:"autoclose",label:e.$t("ui.task.autoclose"),modelValue:e.autoClose,"onUpdate:modelValue":t[0]||(t[0]=t=>e.autoClose=t)},null,8,["label","modelValue"])):(0,r.Q3)("",!0)])):((0,r.uX)(),(0,r.CE)("div",ll,[(0,r.bF)(u)]))]),e.hasTask?((0,r.uX)(),(0,r.Wv)(d,{key:0,class:"view-task__main",title:e.hasTask?e.currentTask.title:e.$t("ui.task.loading"),operations:e.currentTask.operations,"console-output":e.currentTask.console},null,8,["title","operations","console-output"])):(0,r.Q3)("",!0),e.currentTask&&e.currentTask.sponsor?((0,r.uX)(),(0,r.CE)("div",rl,[(0,r.bF)(p,{keypath:"ui.task.sponsor"},{sponsor:(0,r.k6)((()=>[t[4]||(t[4]=(0,r.Lk)("br",null,null,-1)),(0,r.Lk)("a",{href:e.currentTask.sponsor.link,target:"_blank",rel:"noreferrer noopener"},(0,c.v_)(e.currentTask.sponsor.name),9,cl)])),_:1}),t[5]||(t[5]=(0,r.Lk)("a",{href:"https://to.contao.org/donate",target:"_blank",rel:"noreferrer noopener",class:"view-task__donate"},[(0,r.Lk)("img",{src:Ki,alt:"",width:"20",height:"20"})],-1))])):(0,r.Q3)("",!0)])),_:1})}var dl={computed:{...(0,g.aH)("tasks",{taskStatus:"status",currentTask:"current",deletingTask:"deleting"}),hasTask:e=>e.currentTask&&e.currentTask.status,isActive:e=>e.hasTask&&"active"===e.taskStatus,isComplete:e=>e.hasTask&&"complete"===e.taskStatus,isPaused:e=>e.hasTask&&"paused"===e.taskStatus,isAborting:e=>e.hasTask&&"aborting"===e.taskStatus,isFailed:e=>"failed"===e.taskStatus,isError:e=>e.hasTask&&("error"===e.taskStatus||"stopped"===e.taskStatus||"failed"===e.taskStatus),allowAutoClose:e=>e.hasTask&&e.currentTask.autoclose,allowCancel:e=>e.hasTask&&e.currentTask.cancellable,allowContinue:e=>e.hasTask&&e.currentTask.continuable,requiresAudit:e=>e.isComplete&&e.currentTask.audit}},pl=a(2864),gl={name:"TaskView",mixins:[dl],components:{BoxedLayout:Fa.A,LoadingSpinner:hs.A,LoadingButton:ta.A,ConsoleOutput:pl.A,CheckBox:qa.A},data:()=>({autoClose:!1,favicons:null,faviconInterval:null}),computed:{...(0,g.aH)("server/database",{supportsMigrations:"supported",loadingMigrations:"loading"}),...(0,g.L8)("server/database",{hasDatabaseChanges:"hasChanges"})},methods:{cancelTask(){confirm(this.$t("ui.task.confirmCancel"))&&this.$store.dispatch("tasks/abort")},continueTask(){this.$store.dispatch("tasks/continue")},async deleteTask(){await this.$store.dispatch("tasks/deleteCurrent")},async updateDatabase(){this.supportsMigrations?(await this.$store.dispatch("tasks/deleteCurrent"),this.$store.commit("checkMigrations")):window.open("/contao/install")},updateFavicon(){let e;this.faviconInterval&&clearInterval(this.faviconInterval);const t=e=>{this.favicons.forEach((t=>{t.href=`${e}/${t.href.split("/").pop()}`}))};switch(this.taskStatus){case"active":e="icons/task-active";break;case"complete":e="icons/task-success";break;case"error":case"failed":case"stopped":e="icons/task-error";break;default:return void setTimeout(t.bind(this,"icons"),2e3)}let a=!1;this.faviconInterval=setInterval((()=>{a=!a,t(a?e:"icons")}),2e3)}},watch:{taskStatus(){this.updateFavicon()},autoClose(e){window.localStorage.setItem("contao_manager_autoclose",e?"1":"0")},isComplete(){this.isComplete&&this.$store.dispatch("server/database/get",!1)}},mounted(){this.favicons=document.querySelectorAll('link[class="favicon"]'),this.updateFavicon(),this.autoClose="1"===window.localStorage.getItem("contao_manager_autoclose"),this.$store.dispatch("server/database/get")},beforeUnmount(){this.updateFavicon()}};const hl=(0,Z.A)(gl,[["render",ul]]);var ml=hl,kl={components:{ErrorView:Ni,TaskView:ml,Notivue:o.Bx,Notification:o.Eg},data:()=>({views:{[N.A.ACCOUNT]:(0,Ii.IG)((0,r.$V)((()=>Promise.all([a.e(60),a.e(904)]).then(a.bind(a,5523))))),[N.A.LOGIN]:(0,Ii.IG)((0,r.$V)((()=>Promise.all([a.e(60),a.e(909)]).then(a.bind(a,3909))))),[N.A.BOOT]:(0,Ii.IG)((0,r.$V)((()=>a.e(522).then(a.bind(a,3310))))),[N.A.CONFIG]:(0,Ii.IG)((0,r.$V)((()=>a.e(335).then(a.bind(a,1035))))),[N.A.SETUP]:(0,Ii.IG)((0,r.$V)((()=>Promise.all([a.e(474),a.e(782)]).then(a.bind(a,1232))))),[N.A.RECOVERY]:(0,Ii.IG)((0,r.$V)((()=>a.e(367).then(a.bind(a,7390))))),[N.A.MIGRATION]:(0,Ii.IG)((0,r.$V)((()=>a.e(826).then(a.bind(a,9826)))))},loaded:!1}),computed:{...(0,g.aH)(["safeMode"]),...(0,g.aH)(["view","error"]),...(0,g.aH)("auth",["username","limited","totpEnabled"]),...(0,g.aH)("tasks",{taskStatus:"status"}),...(0,g.L8)("modals",["hasModal","currentModal"]),isInitializing:e=>e.view===N.A.INIT,isReady:e=>!e.isInitializing&&!e.currentView&&!e.loaded,isInsecure:()=>"https:"!==location.protocol&&"localhost"!==location.hostname,currentView:e=>e.views[e.view]||null},methods:{...(0,g.i0)("auth",["logout"]),exitSafeMode(){window.location.reload()},initColorMode(){let e=localStorage.getItem("contao--prefers-dark");null===e&&(e=String(window.matchMedia("(prefers-color-scheme: dark)").matches)),document.documentElement.dataset.colorScheme="true"===e?"dark":"light"},async checkPublicConfig(){const e=location.pathname.split("/").filter((e=>""!==e));e.unshift("");while(void 0!==e.pop()&&e.length){let a;try{a=(await s.A.get(`${e.join("/")}/contao-manager/users.json`)).data}catch(t){continue}if(a.users||a.version)throw this.$store.commit("setError",{title:this.$t("ui.app.configSecurity1"),type:"about:blank",status:"500",detail:this.$t("ui.app.configSecurity2")}),new Error(this.$t("ui.app.configSecurity1"))}},setupTotp(){this.$store.commit("modals/open",{id:"setup-totp",component:Nn.A})}},watch:{async isReady(e){if(e){try{await this.$store.dispatch("packages/uploads/load"),await this.$store.dispatch("packages/load"),await this.$store.dispatch("algolia/discover")}catch(t){}this.loaded=!0,this.$store.dispatch("packages/details/init",{vue:this,component:(0,r.$V)((()=>Promise.all([a.e(474),a.e(380)]).then(a.bind(a,1474))))})}},username(e){null===e&&(this.$store.commit("tasks/setCurrent",null),this.$store.commit("tasks/setInitialized",!1))}},async mounted(){if(this.initColorMode(),await this.checkPublicConfig(),await this.$router.isReady(),this.$route.query.invitation)return void this.$store.commit("setView",N.A.ACCOUNT);if(this.$route.query.token){try{await s.A.post("api/session",{token:this.$route.query.token})}catch(t){}this.$router.replace({name:this.$route.name,query:null})}const e=await this.$store.dispatch("auth/status");200===e?this.$store.commit("setView",N.A.BOOT):204===e?this.$store.commit("setView",N.A.ACCOUNT):401===e||403===e?this.$store.commit("setView",N.A.LOGIN):this.$store.commit("setError",{type:"about:blank",status:e})},created(){document.title=`Contao Manager | ${location.hostname}`}};const vl=(0,Z.A)(kl,[["render",Oi]]);var bl=vl;s.A.defaults.headers.common["Accept"]="application/json",s.A.interceptors.request.use((function(e){return"api/"===e.url.slice(0,4)&&(e.headers["Accept-Language"]=gi.A.plugin.global.locale,["PUT","PATCH","DELETE"].includes(e.method)&&(e.headers["X-HTTP-Method-Override"]=e.method,e.method="POST")),e})),s.A.interceptors.response.use((e=>(pi.A.commit("auth/renewCountdown"),e)),(function(e){if(!e.response)return Promise.reject(e);const t=e.response,a=t.config.url;return 401===t.status&&"api/session"!==a?(pi.A.commit("auth/reset"),pi.A.commit("setView",N.A.LOGIN),t):"application/problem+json"===t.headers["content-type"]?(500===t.status&&pi.A.commit("setError",t.data),Promise.reject(e)):"api/session"===a&&200!==t.status?t:"api/"===a.substring(0,4)&&"application/json"!==t.headers["content-type"]&&t.status>=400&&t.status<=599?(pi.A.commit("setError",{type:"about:blank",status:t.status,response:t}),Promise.reject(e)):Promise.reject(e)}));const _l=(0,o.FD)({position:"bottom-right",limit:4,enqueue:!0});(0,n.A)(bl,gi.A,[pi.A,di,_l],(e=>{e.config.globalProperties.$notify=o.VC,e.config.globalProperties.$request=hi.A}))},7591:function(e,t,a){e.exports=a.p+"img/button-upload.ca8e9cfc.svg"},8044:function(e,t,a){var s=a(6992),o=a(4173),n=a(4210);const i=async(...e)=>{let t,a={};for(t=0;ti(a.e(219).then(a.t.bind(a,3219,19)),a.e(553).then(a.t.bind(a,5553,19))),de:()=>i(a.e(523).then(a.t.bind(a,523,19)),a.e(477).then(a.t.bind(a,6477,19))),br:()=>i(a.e(140).then(a.t.bind(a,1140,19)),a.e(958).then(a.t.bind(a,2958,19))),cs:()=>i(a.e(874).then(a.t.bind(a,2874,19)),a.e(540).then(a.t.bind(a,4540,19))),es:()=>i(a.e(180).then(a.t.bind(a,2180,19)),a.e(706).then(a.t.bind(a,2706,19))),fa:()=>i(a.e(669).then(a.t.bind(a,9669,19)),a.e(139).then(a.t.bind(a,4139,19))),fr:()=>i(a.e(120).then(a.t.bind(a,8120,19)),a.e(554).then(a.t.bind(a,4554,19))),it:()=>i(a.e(769).then(a.t.bind(a,4769,19)),a.e(851).then(a.t.bind(a,6851,19))),ja:()=>i(a.e(721).then(a.t.bind(a,9721,19)),a.e(551).then(a.t.bind(a,2551,19))),lv:()=>i(a.e(194).then(a.t.bind(a,194,19)),a.e(560).then(a.t.bind(a,1560,19))),nl:()=>i(a.e(518).then(a.t.bind(a,2518,19)),a.e(164).then(a.t.bind(a,6164,19))),pl:()=>i(a.e(716).then(a.t.bind(a,3716,19)),a.e(638).then(a.t.bind(a,3638,19))),pt:()=>i(a.e(52).then(a.t.bind(a,9052,19)),a.e(606).then(a.t.bind(a,4606,19))),ru:()=>i(a.e(557).then(a.t.bind(a,1557,19)),a.e(715).then(a.t.bind(a,3715,19))),sr:()=>i(a.e(581).then(a.t.bind(a,4581,19)),a.e(748).then(a.t.bind(a,8367,19))),sv:()=>i(a.e(953).then(a.t.bind(a,3953,19)),a.e(643).then(a.t.bind(a,6643,19))),tr:()=>i(a.e(486).then(a.t.bind(a,8486,19)),a.e(44).then(a.t.bind(a,44,19))),zh:()=>i(a.e(542).then(a.t.bind(a,7542,19)),a.e(28).then(a.t.bind(a,4028,19)))},r=(0,s.hU)(),c=e=>{r.global.locale=e,(0,n.x)(e),o.A.commit("algolia/setLanguage",e),document.querySelector("html").setAttribute("lang",e)};t.A={plugin:r,async init(){r.global.fallbackLocale="en",await this.load("en");const e=localStorage.getItem("contao_manager_locale");if(e&&l[e])return this.load(e);const t=Array.from(navigator.languages);for(let a=0;ae.packageInstalled(e.data.name),isRootInstalled:e=>e.isInstalled&&e.packageRoot(e.data.name),isRequired:e=>e.packageRequired(e.data.name),isAdded:e=>e.packageAdded(e.data.name),isMissing:e=>e.packageMissing(e.data.name),isChanged:e=>e.packageChanged(e.data.name),isUpdated:e=>e.packageUpdated(e.data.name),willBeRemoved:e=>e.packageRemoved(e.data.name),willBeInstalled:e=>e.packageAdded(e.data.name),isModified:e=>e.isUpdated||e.isChanged||e.willBeRemoved||e.willBeInstalled,isSuggested:e=>e.packageSuggested(e.data.name),isPrivate:e=>e.metadata&&!!e.metadata.private,isDependency:e=>e.metadata&&!!e.metadata.dependency,isFeature:e=>e.packageFeature(e.data.name),isVisible:e=>e.packageVisible(e.data.name),isTheme:e=>"contao-theme"===e.data.type||e.metadata&&"contao-theme"===e.metadata.type,isContao:e=>"contao/manager-bundle"===e.data.name,isUpload:e=>e.metadata&&"dist"===e.metadata["installation-source"]&&e.metadata.dist&&new RegExp("/contao-manager/packages/[^/]+.zip$","i").test(e.metadata.dist.url),installedVersion:e=>e.installed[e.data.name]?e.installed[e.data.name].version:null,installedTime:e=>e.installed[e.data.name]?e.installed[e.data.name].time:null,isCompatible:e=>e.contaoSupported(e.metadata.contaoConstraint),canBeInstalled:e=>(!e.isPrivate||e.isSuggested)&&!e.isTheme&&(!e.isDependency||e.isSuggested)&&e.isCompatible,constraintInstalled:e=>e.packageConstraintInstalled(e.data.name),constraintRequired:e=>e.packageConstraintRequired(e.data.name),constraintAdded:e=>e.packageConstraintAdded(e.data.name),constraintChanged:e=>e.packageConstraintChanged(e.data.name),targetConstraint:e=>e.$store.state.packages?.change[e.data.name]||e.$store.state.packages?.root?.require[e.data.name]},methods:{install(){this.$store.commit("packages/add",this.metadata||this.data)},update(){this.$store.commit("packages/update",this.data.name)},uninstall(){this.willBeInstalled&&!this.isInstalled?this.$store.commit("packages/restore",this.data.name):(this.$store.commit("packages/restore",this.data.name),this.$store.dispatch("packages/uploads/unconfirm",this.data.name),this.$store.commit("packages/remove",this.data.name))}},watch:{targetConstraint(){this.$store.commit("algolia/uncache",this.data.name),this.loadMetadata()}}}},9473:function(e,t,a){a.d(t,{A:function(){return _}});var s=a(641),o=a(33);const n={class:"setup-totp__qr"},i={class:"setup-totp__uri"},l=["disabled"];function r(e,t,a,r,c,u){const d=(0,s.g2)("qrcode-svg"),p=(0,s.g2)("text-field"),g=(0,s.g2)("loading-spinner"),h=(0,s.g2)("loading-button"),m=(0,s.g2)("popup-overlay");return(0,s.uX)(),(0,s.Wv)(m,{class:"setup-totp",headline:e.$t("ui.totp.headline"),onSubmit:u.submit,onClear:u.close},(0,s.eX)({default:(0,s.k6)((()=>[e.provisioning_uri?((0,s.uX)(),(0,s.CE)(s.FK,{key:0},[(0,s.Lk)("p",null,(0,o.v_)(e.$t("ui.totp.setupQr")),1),(0,s.Lk)("div",n,[(0,s.bF)(d,{value:e.provisioning_uri,level:"H"},null,8,["value"])]),(0,s.Lk)("p",null,(0,o.v_)(e.$t("ui.totp.setupCode")),1),(0,s.Lk)("code",i,(0,o.v_)(e.provisioning_uri),1),(0,s.bF)(p,{ref:"totp",name:"totp",label:e.$t("ui.totp.codeLabel"),description:e.$t("ui.totp.codeDescription"),required:"",pattern:"\\d+",minlength:"6",maxlength:"6",autocomplete:"one-time-code",error:e.error,onKeyup:t[0]||(t[0]=t=>e.error=""),modelValue:e.totp,"onUpdate:modelValue":t[1]||(t[1]=t=>e.totp=t)},null,8,["label","description","error","modelValue"])],64)):((0,s.uX)(),(0,s.Wv)(g,{key:1}))])),_:2},[e.provisioning_uri?{name:"actions",fn:(0,s.k6)((()=>[(0,s.Lk)("button",{type:"button",class:"widget-button",disabled:e.loading,onClick:t[2]||(t[2]=(...e)=>u.close&&u.close(...e))},(0,o.v_)(e.$t("ui.totp.cancel")),9,l),(0,s.bF)(h,{submit:"",color:"primary",loading:e.loading},{default:(0,s.k6)((()=>[(0,s.eW)((0,o.v_)(e.$t("ui.totp.enable")),1)])),_:1},8,["loading"])])),key:"0"}:void 0]),1032,["headline","onSubmit","onClear"])}var c=a(4335),u=a(6278),d=a(1687),p=a(9045),g=a(85),h=a(9757),m=a(7944),k={components:{PopupOverlay:d.A,LoadingSpinner:p.A,LoadingButton:g.A,TextField:h.A,QrcodeSvg:m.dv},data:()=>({loading:!1,provisioning_uri:null,totp:null,error:""}),computed:{...(0,u.aH)("auth",["username"])},methods:{submit(){this.loading=!0,this.$request.put(`api/users/${this.username}/totp`,{provisioning_uri:this.provisioning_uri,totp:this.totp},null,{201:async()=>{await this.$store.dispatch("auth/status"),this.$notify.success(this.$t("ui.totp.enabled")),this.close()},422:()=>{this.loading=!1,this.error=this.$t("ui.totp.invalid"),this.$refs.totp.focus()}})},close(){this.$store.commit("modals/close","setup-totp")}},async mounted(){const e=await c.A.get(`api/users/${this.username}/totp`);this.provisioning_uri=e.data.provisioning_uri,setTimeout((()=>{this.$refs.totp.focus()}),0)}},v=a(6262);const b=(0,v.A)(k,[["render",r]]);var _=b},9757:function(e,t,a){a.d(t,{A:function(){return g}});var s=a(641),o=a(33);const n=["for"],i=["type","id","name","placeholder","required","pattern","minlength","maxlength","disabled","autocomplete","autocapitalize","value"],l=["title"],r={key:2,class:"widget__error"};function c(e,t,a,c,u,d){return(0,s.uX)(),(0,s.CE)("div",{class:(0,o.C4)(["widget widget-text",{[`widget-text--${a.type}`]:!!a.type,"widget--error":a.error,"widget--validate":a.validate&&!a.error,"widget--required":a.required}])},[a.label?((0,s.uX)(),(0,s.CE)("label",{key:0,for:"ctrl_"+a.name},(0,o.v_)(a.label),9,n)):(0,s.Q3)("",!0),(0,s.Lk)("input",{ref:"input",type:d.inputType,id:a.label?"ctrl_"+a.name:"",name:a.name,placeholder:a.validate?a.placeholder||" ":a.placeholder,required:a.required,pattern:a.pattern,minlength:a.minlength,maxlength:a.maxlength,disabled:a.disabled,autocomplete:a.autocomplete,autocapitalize:a.autocapitalize||"none",value:a.modelValue,onInput:t[0]||(t[0]=e=>d.input(e.target.value)),onKeyup:t[1]||(t[1]=t=>e.$emit("keyup")),onFocus:t[2]||(t[2]=t=>e.$emit("focus")),onBlur:t[3]||(t[3]=t=>e.$emit("blur"))},null,40,i),"password"===a.type?((0,s.uX)(),(0,s.CE)("button",{key:1,type:"button",class:(0,o.C4)(["widget__password-toggle",{"widget__password-toggle--visible":e.showPassword,"widget__password-toggle--hidden":!e.showPassword}]),title:e.$t("ui.widget."+(e.showPassword?"hidePassword":"showPassword")),onClick:t[4]||(t[4]=(...e)=>d.togglePassword&&d.togglePassword(...e))},t[5]||(t[5]=[(0,s.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,s.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,s.Lk)("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"})],-1)]),10,l)):(0,s.Q3)("",!0),a.error?((0,s.uX)(),(0,s.CE)("p",r,(0,o.v_)(a.error),1)):(0,s.Q3)("",!0),a.description||e.$slots.description?((0,s.uX)(),(0,s.CE)("div",{key:3,class:(0,o.C4)(["widget__description",{"widget__description--disabled":a.disabled}])},[(0,s.RG)(e.$slots,"description",{},(()=>[(0,s.Lk)("p",null,(0,o.v_)(a.description),1)]))],2)):(0,s.Q3)("",!0)],2)}var u={emits:["input","keyup","focus","blur","update:modelValue"],props:{type:{type:String,validator:e=>["text","tel","email","url","password","search"].includes(e)},name:{type:String,required:!0},label:String,description:String,modelValue:String,pattern:String,placeholder:String,disabled:Boolean,required:Boolean,validate:Boolean,error:String,autocomplete:String,autocapitalize:String,minlength:String,maxlength:String},data:()=>({showPassword:!1}),computed:{inputType(){return"password"===this.type&&this.showPassword?"text":this.type?this.type:"text"}},methods:{input(e){this.$emit("input"),this.$emit("update:modelValue",e)},enter(){this.$emit("enter")},focus(){this.$refs.input.focus()},checkValidity(){return this.$refs.input.checkValidity()},togglePassword(){this.showPassword=!this.showPassword,this.focus()}},mounted(){this.$emit("update:modelValue",this.$refs.input.value)}},d=a(6262);const p=(0,d.A)(u,[["render",c]]);var g=p}},t={};function a(s){var o=t[s];if(void 0!==o)return o.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,a),n.exports}a.m=e,function(){var e=[];a.O=function(t,s,o,n){if(!s){var i=1/0;for(u=0;u=n)&&Object.keys(a.O).every((function(e){return a.O[e](s[r])}))?s.splice(r--,1):(l=!1,n0&&e[u-1][2]>n;u--)e[u]=e[u-1];e[u]=[s,o,n]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){var e,t=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__};a.t=function(s,o){if(1&o&&(s=this(s)),8&o)return s;if("object"===typeof s&&s){if(4&o&&s.__esModule)return s;if(16&o&&"function"===typeof s.then)return s}var n=Object.create(null);a.r(n);var i={};e=e||[null,t({}),t([]),t(t)];for(var l=2&o&&s;"object"==typeof l&&!~e.indexOf(l);l=t(l))Object.getOwnPropertyNames(l).forEach((function(e){i[e]=function(){return s[e]}}));return i["default"]=function(){return s},a.d(n,i),n}}(),function(){a.d=function(e,t){for(var s in t)a.o(t,s)&&!a.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})}}(),function(){a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,s){return a.f[s](e,t),t}),[]))}}(),function(){a.u=function(e){return"js/"+e+"."+{28:"ec57a4f8",44:"6fcd0b80",52:"e4b26831",60:"63bbe8ae",120:"75250efe",139:"aa9cf5f9",140:"cbc1e5ae",164:"b82ac3d4",180:"03013187",194:"520ccb65",219:"3e87ebaf",335:"5446ec61",367:"5add6572",474:"01393a50",477:"5046f228",486:"a5512a72",518:"11cd8ca7",522:"8581957a",523:"024d09d8",540:"7447dfbb",542:"2a7ece7e",551:"f5fd138e",553:"7da028f7",554:"b7ccbdff",557:"32851d13",560:"d7cbad40",581:"2f384acc",606:"98b967fa",638:"ebc81223",643:"b4e0291b",669:"0cbe6924",706:"93cf9c0e",710:"38857bbe",715:"0c8337cc",716:"2fcdd2df",721:"f305df88",748:"2ad02c68",769:"7ff2380b",782:"d9aac0b7",826:"3d9d8358",851:"de2537b9",874:"fcb753e0",904:"dbbbfcc5",909:"7d314c8f",953:"9ea61c64",958:"d2146865"}[e]+".js"}}(),function(){a.miniCssF=function(e){return"css/"+e+"."+{335:"e18cb2b2",367:"25211792",380:"93b3a21a",522:"44f2aba0",782:"eb3ccfd5",826:"11002f25",904:"3a60e65a",909:"2589534e"}[e]+".css"}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="contao-manager:";a.l=function(s,o,n,i){if(e[s])e[s].push(o);else{var l,r;if(void 0!==n)for(var c=document.getElementsByTagName("script"),u=0;u[C.currentStep>0?((0,i.uX)(),(0,i.CE)("section",r,[(0,i.Lk)("ul",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(C.steps,((e,t)=>((0,i.uX)(),(0,i.CE)("li",{class:(0,a.C4)({active:C.currentStep>t}),key:e.name},[(0,i.Lk)("button",{onClick:e=>C.currentStep=t+1,disabled:C.currentStep<=t+1},[(0,i.Lk)("img",{src:e.icon,width:"24",height:"24",alt:""},null,8,u)],8,l)],2)))),128)),(0,i.Lk)("li",{class:(0,a.C4)({active:C.currentStep>C.steps.length})},t[4]||(t[4]=[(0,i.Lk)("button",{disabled:""},[(0,i.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",height:"24px",viewBox:"0 0 24 24",width:"24px"},[(0,i.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,i.Lk)("path",{d:"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"})])],-1)]),2)])])):(0,i.Q3)("",!0),C.currentStep>C.steps.length?((0,i.uX)(),(0,i.CE)("main",c,[t[6]||(t[6]=(0,i.Lk)("span",{class:"view-setup__party"},"🎉",-1)),(0,i.Lk)("h1",d,(0,a.v_)(e.$t("ui.setup.complete")),1),(0,i.Lk)("p",p,(0,a.v_)(e.$t("ui.setup.complete1",{version:e.contaoVersion})),1),e.showInstallTool?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("p",h,(0,a.v_)(e.$t("ui.setup.complete2")),1),(0,i.Lk)("button",{class:"widget-button widget-button--inline",onClick:t[0]||(t[0]=(...e)=>C.launch&&C.launch(...e))},(0,a.v_)(e.$t("ui.setup.manager")),1),(0,i.Lk)("a",m,(0,a.v_)(e.$t("ui.setup.installTool")),1)],64)):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.Lk)("p",_,(0,a.v_)(e.$t("ui.setup.complete3")),1),(0,i.Lk)("button",{class:"widget-button view-setup__continue",onClick:t[1]||(t[1]=(...e)=>C.launch&&C.launch(...e))},(0,a.v_)(e.$t("ui.setup.manager")),1),(0,i.Lk)("a",v,(0,a.v_)(e.$t("ui.setup.login")),1)],64)),(0,i.Lk)("div",k,[t[5]||(t[5]=(0,i.Lk)("figure",null,[(0,i.Lk)("img",{src:o,width:"80",height:"80",alt:""})],-1)),(0,i.Lk)("div",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.$t("ui.setup.funding").split("\n"),((e,t)=>((0,i.uX)(),(0,i.CE)("p",{key:t},(0,a.v_)(e),1)))),128)),(0,i.Lk)("p",null,[(0,i.Lk)("a",b,(0,a.v_)(e.$t("ui.setup.fundingLink")),1)])])])])):C.currentStep>0?((0,i.uX)(),(0,i.Wv)((0,i.$y)(C.steps[C.currentStep-1].component),{key:2,onContinue:t[2]||(t[2]=e=>C.currentStep+=1)},null,32)):((0,i.uX)(),(0,i.CE)("main",g,[t[7]||(t[7]=(0,i.Lk)("img",{src:n,width:"100",height:"100",alt:"Contao Logo",class:"view-setup__icon"},null,-1)),(0,i.Lk)("h1",f,(0,a.v_)(e.$t("ui.setup.welcome")),1),(0,i.Lk)("p",y,(0,a.v_)(e.$t("ui.setup.welcome1")),1),(0,i.bF)(E,{tag:"p",class:"view-setup__description",keypath:"ui.setup.welcome2"},{support:(0,i.k6)((()=>[(0,i.Lk)("a",w,(0,a.v_)(e.$t("ui.setup.support")),1)])),_:1}),(0,i.Lk)("button",{class:"widget-button widget-button--inline widget-button--primary view-setup__start",onClick:t[3]||(t[3]=e=>C.currentStep=1)},(0,a.v_)(e.$t("ui.setup.start")),1)]))])),_:1})}s(4114);var $=s(707),C=s(6278),E=s(728),X=s(3751),F=s.p+"img/document-root.0e6dd2e4.svg",j=s.p+"img/button-update.ad79c617.svg";const A={class:"setup__header"},V={class:"setup__headline"},U={key:0,class:"setup__warning"},x={class:"setup__description"},D={class:"setup__description"},S=["href"],P={class:"setup__form setup__form--center",key:"updated"},W={class:"setup__fields"},T={class:"setup__fielddesc"},I={class:"setup__directories"},q={key:0},R={key:1},B={key:2},M={key:3},O={key:4},H={key:5},Q={key:6},K={class:"setup__actions setup__actions--center"},J={class:"setup__form",key:"conflicts"},N={class:"setup__fields"},z={class:"setup__fieldtitle"},Z={class:"setup__fielddesc"},Y={key:0},G={class:"setup__actions setup__actions--center"},ee=["disabled"],te={class:"setup__form",key:"setup"},se={class:"setup__fields"},ie={class:"setup__fieldtitle"},ae={class:"setup__fielddesc"},oe={class:"setup__directories"},ne={key:0},re={key:1},le={key:2},ue={key:3},ce={key:4},de={key:5},pe={key:6},he={class:"setup__actions setup__actions--center"},me=["disabled"],_e={class:"setup__form",key:"confirmation"},ve={class:"setup__fields setup__fields--center"},ke={class:"setup__fielddesc"},be={class:"setup__actions setup__actions--center"};function ge(e,t,s,o,n,r){const l=(0,i.g2)("loading-button"),u=(0,i.g2)("check-box"),c=(0,i.g2)("text-field"),d=(0,i.g2)("radio-button"),p=(0,i.g2)("i18n-t");return(0,i.uX)(),(0,i.CE)("section",null,[(0,i.Lk)("header",A,[t[10]||(t[10]=(0,i.Lk)("img",{src:F,width:"80",height:"80",alt:"",class:"setup__icon"},null,-1)),(0,i.Lk)("h1",V,(0,a.v_)(e.$t("ui.setup.document-root.headline")),1),r.needsFix?((0,i.uX)(),(0,i.CE)("p",U,(0,a.v_)(e.$t("ui.setup.document-root.warning")),1)):(0,i.Q3)("",!0),(0,i.Lk)("p",x,(0,a.v_)(e.$t("ui.setup.document-root.description1")),1),(0,i.Lk)("p",D,(0,a.v_)(e.$t("ui.setup.document-root.description2")),1),(0,i.Lk)("a",{class:"widget-button widget-button--inline widget-button--info widget-button--link",href:`https://to.contao.org/docs/webroot?lang=${e.$i18n.locale}`,target:"_blank"},(0,a.v_)(e.$t("ui.setup.document-root.documentation")),9,S)]),null!==e.projectDir?((0,i.uX)(),(0,i.Wv)(X.eB,{key:0,name:e.forceInstall?"none":"animate-flip",type:"transition",mode:"out-in"},{default:(0,i.k6)((()=>[r.needsFix||e.wantsFix?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[e.directoryUpdated?((0,i.uX)(),(0,i.CE)("main",P,[(0,i.Lk)("div",W,[t[13]||(t[13]=(0,i.Lk)("svg",{class:"setup__check",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,i.Lk)("path",{d:"M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"})],-1)),(0,i.Lk)("p",T,(0,a.v_)(e.$t("ui.setup.document-root.confirmation")),1),(0,i.Lk)("dl",I,[(0,i.Lk)("dt",null,(0,a.v_)(e.$t("ui.setup.document-root.currentRoot")),1),e.isWeb?((0,i.uX)(),(0,i.CE)("dd",q,(0,a.v_)(e.projectDir)+"/web",1)):e.isPublic?((0,i.uX)(),(0,i.CE)("dd",R,(0,a.v_)(e.projectDir)+"/public",1)):((0,i.uX)(),(0,i.CE)("dd",B,(0,a.v_)(e.projectDir),1)),(0,i.Lk)("dt",null,(0,a.v_)(e.$t("ui.setup.document-root.newRoot")),1),!e.isEmpty||e.wantsFix&&e.directory||!r.canUsePublicDir||!e.usePublicDir?!e.isEmpty||e.wantsFix&&e.directory?r.canUsePublicDir&&e.usePublicDir?((0,i.uX)(),(0,i.CE)("dd",H,[(0,i.eW)((0,a.v_)(e.projectDir),1),(0,i.Lk)("span",null,"/"+(0,a.v_)(e.directory)+"/public",1)])):((0,i.uX)(),(0,i.CE)("dd",Q,[(0,i.eW)((0,a.v_)(e.projectDir),1),(0,i.Lk)("span",null,"/"+(0,a.v_)(e.directory)+"/web",1)])):((0,i.uX)(),(0,i.CE)("dd",O,[(0,i.eW)((0,a.v_)(e.projectDir),1),t[12]||(t[12]=(0,i.Lk)("span",null,"/web",-1))])):((0,i.uX)(),(0,i.CE)("dd",M,[(0,i.eW)((0,a.v_)(e.projectDir),1),t[11]||(t[11]=(0,i.Lk)("span",null,"/public",-1))]))])]),(0,i.Lk)("div",K,[(0,i.bF)(l,{inline:"",loading:e.processing,color:"primary",icon:"update",onClick:r.reload},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.document-root.reload")),1)])),_:1},8,["loading","onClick"])])])):e.conflicts.length?((0,i.uX)(),(0,i.CE)("main",J,[(0,i.Lk)("div",N,[(0,i.Lk)("h2",z,(0,a.v_)(e.$t("ui.setup.document-root.conflictsTitle")),1),(0,i.Lk)("p",Z,(0,a.v_)(e.$t("ui.setup.document-root.conflictsDirectory",{count:e.conflicts.length})),1),(0,i.Lk)("ul",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.conflicts.slice(0,5),(e=>((0,i.uX)(),(0,i.CE)("li",{key:e},(0,a.v_)(e),1)))),128)),e.conflicts.length>5?((0,i.uX)(),(0,i.CE)("li",Y,"...")):(0,i.Q3)("",!0)]),e.isPublic||e.isWeb?((0,i.uX)(),(0,i.Wv)(u,{key:0,name:"ignoreConflicts",label:e.$t("ui.setup.document-root.ignoreConflicts"),disabled:e.processing,modelValue:e.forceInstall,"onUpdate:modelValue":t[0]||(t[0]=t=>e.forceInstall=t)},null,8,["label","disabled","modelValue"])):(0,i.Q3)("",!0)]),(0,i.Lk)("div",G,[e.forceInstall?((0,i.uX)(),(0,i.CE)("button",{key:0,class:"widget-button widget-button--alert widget-button--run",onClick:t[1]||(t[1]=t=>e.$emit("continue"))},(0,a.v_)(e.$t("ui.server.contao.setup")),1)):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.bF)(l,{inline:"",icon:"update",loading:e.processing,onClick:t[2]||(t[2]=e=>r.init(!1))},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.document-root.check")),1)])),_:1},8,["loading"]),(0,i.Lk)("button",{class:"widget-button widget-button--inline widget-button--primary widget-button--gear",disabled:e.processing,onClick:t[3]||(t[3]=t=>e.conflicts=[])},(0,a.v_)(e.$t("ui.setup.document-root.create")),9,ee)],64))])])):((0,i.uX)(),(0,i.CE)("main",te,[t[14]||(t[14]=(0,i.Lk)("img",{src:j,class:"invisible",alt:""},null,-1)),(0,i.Lk)("div",se,[(0,i.Lk)("h2",ie,(0,a.v_)(e.$t("ui.setup.document-root.formTitle")),1),(0,i.Lk)("p",ae,[(0,i.eW)((0,a.v_)(e.$t("ui.setup.document-root.formText1"))+" ",1),(0,i.Lk)("u",null,(0,a.v_)(e.$t("ui.setup.document-root.formText2")),1)]),!e.isEmpty||e.wantsFix?((0,i.uX)(),(0,i.Wv)(c,{key:0,ref:"directory",name:"directory",label:e.$t("ui.setup.document-root.directory"),error:r.directoryError,required:!e.isEmpty,pattern:"^[^/]+$",validate:"",modelValue:e.directory,"onUpdate:modelValue":t[4]||(t[4]=t=>e.directory=t)},null,8,["label","error","required","modelValue"])):(0,i.Q3)("",!0),r.canUsePublicDir?((0,i.uX)(),(0,i.Wv)(d,{key:1,name:"usePublicDir",options:r.publicDirOptions,"allow-html":"",modelValue:e.usePublicDir,"onUpdate:modelValue":t[5]||(t[5]=t=>e.usePublicDir=t)},null,8,["options","modelValue"])):(0,i.Q3)("",!0),(0,i.Lk)("dl",oe,[(0,i.Lk)("dt",null,(0,a.v_)(e.$t("ui.setup.document-root.currentRoot")),1),e.isWeb?((0,i.uX)(),(0,i.CE)("dd",ne,(0,a.v_)(e.projectDir)+(0,a.v_)(e.directorySeparator)+"web",1)):e.isPublic?((0,i.uX)(),(0,i.CE)("dd",re,(0,a.v_)(e.projectDir)+(0,a.v_)(e.directorySeparator)+"public",1)):((0,i.uX)(),(0,i.CE)("dd",le,(0,a.v_)(e.projectDir),1)),(0,i.Lk)("dt",null,(0,a.v_)(e.$t("ui.setup.document-root.newRoot")),1),!e.isEmpty||e.wantsFix&&e.directory||!r.canUsePublicDir||!e.usePublicDir?!e.isEmpty||e.wantsFix&&e.directory?r.canUsePublicDir&&e.usePublicDir?((0,i.uX)(),(0,i.CE)("dd",de,[(0,i.eW)((0,a.v_)(e.projectDir),1),(0,i.Lk)("span",null,(0,a.v_)(e.directorySeparator)+(0,a.v_)(e.directory)+(0,a.v_)(e.directorySeparator)+"public",1)])):((0,i.uX)(),(0,i.CE)("dd",pe,[(0,i.eW)((0,a.v_)(e.projectDir),1),(0,i.Lk)("span",null,(0,a.v_)(e.directorySeparator)+(0,a.v_)(e.directory)+(0,a.v_)(e.directorySeparator)+"web",1)])):((0,i.uX)(),(0,i.CE)("dd",ce,[(0,i.eW)((0,a.v_)(e.projectDir),1),(0,i.Lk)("span",null,(0,a.v_)(e.directorySeparator)+"web",1)])):((0,i.uX)(),(0,i.CE)("dd",ue,[(0,i.eW)((0,a.v_)(e.projectDir),1),(0,i.Lk)("span",null,(0,a.v_)(e.directorySeparator)+"public",1)]))]),(0,i.bF)(u,{name:"autoconfig",label:e.$t("ui.setup.document-root.autoconfig"),disabled:e.processing,modelValue:e.autoconfig,"onUpdate:modelValue":t[6]||(t[6]=t=>e.autoconfig=t)},null,8,["label","disabled","modelValue"])]),(0,i.Lk)("div",he,[(0,i.bF)(l,{color:"primary",icon:"run",loading:e.processing,disabled:!e.autoconfig||!!r.directoryError||e.wantsFix&&!e.directory&&(e.isPublic&&e.usePublicDir||e.isWeb&&!e.usePublicDir),onClick:r.setupDocroot},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.document-root.finish")),1)])),_:1},8,["loading","disabled","onClick"]),e.wantsFix?((0,i.uX)(),(0,i.CE)("button",{key:0,type:"button",class:"widget-button",disabled:e.processing,onClick:t[7]||(t[7]=(...e)=>r.init&&r.init(...e))},(0,a.v_)(e.$t("ui.setup.cancel")),9,me)):(0,i.Q3)("",!0)])]))],64)):((0,i.uX)(),(0,i.CE)("main",_e,[(0,i.Lk)("div",ve,[t[15]||(t[15]=(0,i.Lk)("svg",{class:"setup__check",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,i.Lk)("path",{d:"M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"})],-1)),(0,i.Lk)("p",ke,(0,a.v_)(e.$t("ui.setup.document-root.success")),1),(0,i.bF)(p,{tag:"p",class:"setup__fielddesc",keypath:`ui.setup.document-root.${e.contaoVersion?"installed":"installing"}ProjectDir`},{dir:(0,i.k6)((()=>[(0,i.Lk)("code",null,(0,a.v_)(e.projectDir),1)])),_:1},8,["keypath"]),(0,i.bF)(p,{tag:"p",class:"setup__fielddesc",keypath:`ui.setup.document-root.${e.contaoVersion?"installed":"installing"}PublicDir`},{dir:(0,i.k6)((()=>[(0,i.Lk)("code",null,(0,a.v_)(r.publicDir),1)])),_:1},8,["keypath"])]),(0,i.Lk)("div",be,[e.contaoVersion?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.CE)("button",{key:0,class:"widget-button widget-button--inline widget-button--gear",onClick:t[8]||(t[8]=t=>e.wantsFix=!0)},(0,a.v_)(e.$t("ui.setup.document-root.change")),1)),(0,i.Lk)("button",{class:"widget-button widget-button--inline widget-button--primary",onClick:t[9]||(t[9]=t=>e.$emit("continue"))},(0,a.v_)(e.$t("ui.setup.continue")),1)])]))])),_:1},8,["name"])):(0,i.Q3)("",!0)])}var fe=s(9757);const ye={key:0},we=["id","name","disabled","required","checked","onClick"],Le=["for","innerHTML"],$e=["for"];function Ce(e,t,s,o,n,r){return(0,i.uX)(),(0,i.CE)("fieldset",{class:(0,a.C4)(["widget widget-radio-button",{"widget--required":s.required}])},[s.label||e.$slots.label?((0,i.uX)(),(0,i.CE)("legend",ye,[(0,i.RG)(e.$slots,"label",{},(()=>[(0,i.eW)((0,a.v_)(s.label),1)]))])):(0,i.Q3)("",!0),((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.options,((e,t)=>((0,i.uX)(),(0,i.CE)("div",{key:t},[(0,i.Lk)("input",{ref_for:!0,ref:"input",type:"radio",id:`ctrl_${s.name}_${e.value}`,name:s.name,disabled:e.disabled,required:s.required,checked:s.modelValue===e.value,onClick:t=>r.input(e.value)},null,8,we),s.allowHtml?((0,i.uX)(),(0,i.CE)("label",{key:0,for:`ctrl_${s.name}_${e.value}`,innerHTML:e.label},null,8,Le)):((0,i.uX)(),(0,i.CE)("label",{key:1,for:`ctrl_${s.name}_${e.value}`},(0,a.v_)(e.label),9,$e))])))),128))],2)}var Ee={emits:["input","update:modelValue"],props:{name:{type:String,required:!0},options:{type:Array,required:!0},label:String,modelValue:{required:!0},disabled:Boolean,required:Boolean,allowHtml:{type:Boolean,default:!1}},methods:{input(e){this.$emit("input"),this.$emit("update:modelValue",e)}}},Xe=s(6262);const Fe=(0,Xe.A)(Ee,[["render",Ce]]);var je=Fe,Ae=s(3480),Ve=s(85),Ue={components:{TextField:fe.A,RadioButton:je,CheckBox:Ae.A,LoadingButton:Ve.A},data:()=>({processing:!1,usePublicDir:!1,wantsFix:!1,conflicts:[],isEmpty:!0,isWeb:!0,isPublic:!1,projectDir:null,autoconfig:!1,forceInstall:!1,directory:"",directoryExists:!1,directoryUpdated:!1,directorySeparator:"/"}),computed:{...(0,C.aH)("server/php-web",["phpVersionId"]),...(0,C.aH)("server/contao",["contaoVersion"]),needsFix:e=>!e.isEmpty||!e.isWeb&&(!e.isPublic||!e.canUsePublicDir),publicDirOptions:e=>[{label:e.$t("ui.setup.document-root.publicDir",{dir:"web",version:"4.9+"}),value:!1},{label:e.$t("ui.setup.document-root.publicDir",{dir:"public",version:"4.13+"}),value:!0}],canUsePublicDir:e=>e.phpVersionId>=70400,publicDir:e=>e.isWeb?`${e.projectDir}${e.directorySeparator}web`:`${e.projectDir}${e.directorySeparator}public`,directoryError(){return this.directoryExists?this.$t("ui.setup.document-root.directoryExists"):this.directory&&!this.directory.match(/^[^/]+$/)?this.$t("ui.setup.document-root.directoryInvalid"):this.wantsFix||this.isEmpty||this.directory?"":this.$t("ui.setup.document-root.directoryInvalid")}},methods:{reload(){this.processing=!0,window.location.reload()},async setupDocroot(){this.processing=!0;const e=await this.$store.dispatch("server/contao/documentRoot",{directory:!this.isEmpty||this.wantsFix?this.directory:null,usePublicDir:this.canUsePublicDir&&this.usePublicDir});if(403===e.status)return this.directoryExists=!0,this.processing=!1,void this.$refs.directory.focus();this.processing=!1,this.directoryUpdated=!0,this.$store.commit("auth/resetCountdown")},async init(e=!0){this.processing=!0;const t=await this.$store.dispatch("server/contao/get",e);this.projectDir=t.data.project_dir,this.conflicts=t.data.conflicts,this.isEmpty=0===t.data.conflicts.length,this.isWeb="web"===t.data.public_dir,this.isPublic="public"===t.data.public_dir,this.usePublicDir="public"===t.data.public_dir,this.wantsFix=!1,this.directory=this.isEmpty?"":location.hostname,this.directorySeparator=t.data.directory_separator,this.processing=!1}},watch:{directory(){this.directoryExists=!1}},async mounted(){this.init()}};const xe=(0,Xe.A)(Ue,[["render",ge]]);var De=xe,Se=(s(8111),s(1701),s.p+"img/create-project.b22522ee.svg"),Pe=s(7591);const We={key:0,class:"setup__theme-upload"},Te={class:"setup__header"},Ie=["src","alt"],qe={key:1,src:Se,width:"80",height:"80",alt:"",class:"setup__icon"},Re={class:"setup__headline"},Be={class:"setup__description"},Me={class:"setup__version"},Oe={class:"setup__version"},He={key:2,class:"setup__version"},Qe={key:3,class:"setup__version"},Ke={key:4,class:"setup__version"},Je=["href"],Ne={class:"setup__form"},ze={key:0,class:"setup__fields"},Ze={class:"setup__fieldtitle"},Ye={class:"setup__fielddesc"},Ge={class:"setup__tabs"},et={class:"setup__tab-controls"},tt={key:0,class:"setup__tab"},st={class:"setup__requires"},it={key:1,class:"setup__tab setup__tab--files"},at={class:"setup__fielddesc setup__fielddesc--warning"},ot={class:"setup__actions"},nt=["disabled"],rt={class:"setup__header"},lt={class:"setup__headline"},ut={href:"https://semver.org",target:"_blank",rel:"noreferrer noopener"},ct={class:"setup__versions"},dt={class:"setup__version--warning"},pt=["href"],ht={key:0,class:"setup__form"},mt={class:"setup__fields setup__fields--center"},_t={class:"setup__fielddesc"},vt={class:"setup__actions setup__actions--center"},kt={key:1,class:"setup__form"},bt={class:"setup__fields"},gt={class:"setup__fieldtitle"},ft={class:"setup__fielddesc setup__fielddesc--version"},yt={key:0,class:"setup__theme"},wt={href:"https://themes.contao.org",target:"_blank"},Lt={class:"package-uploads__overlay"},$t={href:"https://themes.contao.org",target:"_blank"},Ct={class:"setup__fields"},Et={class:"setup__or"},Xt=["disabled"],Ft=["disabled"],jt={key:2,class:"setup__themes"},At={key:1,class:"setup__theme-search setup__theme-search--offline"},Vt={key:2,class:"setup__theme-search setup__theme-search--empty"},Ut={class:"setup__themes-results"},xt={class:"setup__themes-more"};function Dt(e,t,s,o,n,r){const l=(0,i.g2)("file-upload"),u=(0,i.g2)("progress-bar"),c=(0,i.g2)("file-tree"),d=(0,i.g2)("loading-button"),p=(0,i.g2)("i18n-t"),h=(0,i.g2)("radio-button"),m=(0,i.g2)("check-box"),_=(0,i.g2)("search-input"),v=(0,i.g2)("button-group"),k=(0,i.g2)("loading-spinner"),b=(0,i.g2)("discover-package");return(0,i.uX)(),(0,i.CE)("div",null,[(0,i.bF)(l,{name:"package",ref:"uploader","post-action":"api/packages/uploads",multiple:!0,drop:!0,"drop-directory":!1,"chunk-enabled":!0,chunk:{action:"api/packages/uploads"},onInputFile:r.uploadTheme,onInputFilter:r.filterTheme},null,8,["onInputFile","onInputFilter"]),e.upload?((0,i.uX)(),(0,i.CE)("main",We,[(0,i.Lk)("h1",null,(0,a.v_)(e.$t("ui.setup.create-project.theme.upload",{name:e.upload.name,size:r.uploadSize})),1),(0,i.bF)(u,{amount:e.upload.progress},null,8,["amount"])])):e.theme?((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.Lk)("header",Te,[e.themeImage?((0,i.uX)(),(0,i.CE)("img",{key:0,class:"setup__theme-image",src:e.themeImage,alt:e.theme.composerJson.name},null,8,Ie)):((0,i.uX)(),(0,i.CE)("img",qe)),(0,i.Lk)("h1",Re,(0,a.v_)(e.$t("ui.setup.create-project.headline")),1),(0,i.Lk)("p",Be,(0,a.v_)(e.$t("ui.setup.create-project.theme.uploaded")),1),(0,i.Lk)("div",Me,[(0,i.Lk)("strong",null,(0,a.v_)(e.$t("ui.setup.create-project.theme.packageName"))+":",1),(0,i.eW)(" "+(0,a.v_)(e.theme.composerJson.name),1)]),(0,i.Lk)("div",Oe,[(0,i.Lk)("strong",null,(0,a.v_)(e.$t("ui.setup.create-project.theme.version"))+":",1),(0,i.eW)(" "+(0,a.v_)(e.theme.composerJson.version),1)]),e.theme.composerJson.authors||e.theme.authors?((0,i.uX)(),(0,i.CE)("div",He,[(0,i.Lk)("strong",null,(0,a.v_)(e.$t("ui.setup.create-project.theme.authors"))+": ",1),e.theme.composerJson.authors?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.eW)((0,a.v_)(e.theme.composerJson.authors.map((e=>e.name)).join(", ")),1)],64)):((0,i.uX)(),(0,i.CE)(i.FK,{key:1},[(0,i.eW)((0,a.v_)(e.theme.authors),1)],64))])):(0,i.Q3)("",!0),e.theme.composerJson.license?((0,i.uX)(),(0,i.CE)("div",Qe,[(0,i.Lk)("strong",null,(0,a.v_)(e.$t("ui.package-details.license"))+":",1),(0,i.eW)(" "+(0,a.v_)(Array.isArray(e.theme.composerJson.license)?e.theme.composerJson.license.join(", "):e.theme.composerJson.license),1)])):(0,i.Q3)("",!0),e.theme.composerJson.homepage?((0,i.uX)(),(0,i.CE)("div",Ke,[(0,i.Lk)("strong",null,(0,a.v_)(e.$t("ui.package.homepage"))+": ",1),(0,i.Lk)("a",{href:e.theme.composerJson.homepage,target:"_blank"},(0,a.v_)(e.theme.composerJson.homepage),9,Je)])):(0,i.Q3)("",!0),(0,i.Lk)("button",{class:"widget-button widget-button--info widget-button--details",onClick:t[0]||(t[0]=(...e)=>r.themeDetails&&r.themeDetails(...e))},(0,a.v_)(e.$t("ui.package.detailsButton")),1)]),(0,i.Lk)("main",Ne,[e.theme.files?((0,i.uX)(),(0,i.CE)("div",ze,[(0,i.Lk)("h2",Ze,(0,a.v_)(e.$t("ui.setup.create-project.themeTitle")),1),(0,i.Lk)("p",Ye,(0,a.v_)(e.$t("ui.setup.create-project.themeDetails")),1),(0,i.Lk)("div",Ge,[(0,i.Lk)("div",et,[(0,i.Lk)("button",{class:(0,a.C4)(["setup__tab-control",{"setup__tab-control--active":"require"===e.view}]),onClick:t[1]||(t[1]=t=>e.view="require")},(0,a.v_)(e.$tc("ui.setup.create-project.themeRequire",Object.keys(e.theme.composerJson.require).length)),3),(0,i.Lk)("button",{class:(0,a.C4)(["setup__tab-control",{"setup__tab-control--active":"files"===e.view}]),onClick:t[2]||(t[2]=t=>e.view="files")},(0,a.v_)(e.$tc("ui.setup.create-project.themeFiles",e.theme.files.length)),3)]),"require"===e.view?((0,i.uX)(),(0,i.CE)("div",tt,[(0,i.Lk)("table",st,[(0,i.Lk)("tbody",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.theme.composerJson.require,((e,t)=>((0,i.uX)(),(0,i.CE)("tr",{key:t},[(0,i.Lk)("td",null,(0,a.v_)(t)+":",1),(0,i.Lk)("td",null,(0,a.v_)(e),1)])))),128))])])])):(0,i.Q3)("",!0),"files"===e.view?((0,i.uX)(),(0,i.CE)("div",it,[(0,i.bF)(c,{files:r.themeFiles},null,8,["files"])])):(0,i.Q3)("",!0)]),(0,i.Lk)("p",at,(0,a.v_)(e.$t("ui.setup.create-project.themeWarning")),1)])):(0,i.Q3)("",!0),(0,i.Lk)("div",ot,[(0,i.bF)(d,{color:"primary",icon:"run",loading:e.processing,onClick:r.installTheme},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.create-project.install")),1)])),_:1},8,["loading","onClick"]),(0,i.Lk)("button",{class:"widget-button",onClick:t[3]||(t[3]=(...e)=>r.cancelTheme&&r.cancelTheme(...e)),disabled:e.processing},(0,a.v_)(e.$t("ui.setup.create-project.cancel")),9,nt)])])],64)):((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[(0,i.Lk)("header",rt,[t[14]||(t[14]=(0,i.Lk)("img",{src:Se,width:"80",height:"80",alt:"",class:"setup__icon"},null,-1)),(0,i.Lk)("h1",lt,(0,a.v_)(e.$t("ui.setup.create-project.headline")),1),(0,i.bF)(p,{tag:"p",keypath:"ui.setup.create-project.description",class:"setup__description"},{semver:(0,i.k6)((()=>[(0,i.Lk)("a",ut,(0,a.v_)(e.$t("ui.setup.create-project.semver")),1)])),_:1}),(0,i.Lk)("ul",ct,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(r.versions,(e=>((0,i.uX)(),(0,i.CE)(i.FK,null,[e.description?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[e.disabled?((0,i.uX)(),(0,i.CE)("li",{class:"setup__version",key:e.value},[(0,i.Lk)("strong",null,(0,a.v_)(e.label),1),t[13]||(t[13]=(0,i.Lk)("br",null,null,-1)),(0,i.Lk)("span",dt,(0,a.v_)(e.problem),1)])):((0,i.uX)(),(0,i.CE)("li",{class:"setup__version",key:e.value},[(0,i.Lk)("strong",null,(0,a.v_)(e.label),1),t[12]||(t[12]=(0,i.Lk)("br",null,null,-1)),(0,i.eW)(" "+(0,a.v_)(e.description),1)]))],64)):(0,i.Q3)("",!0)],64)))),256))]),(0,i.bF)(p,{tag:"p",keypath:"ui.setup.create-project.releaseplan",class:"setup__releaseplan"},{contaoReleasePlan:(0,i.k6)((()=>[(0,i.Lk)("a",{href:`https://to.contao.org/release-plan?lang=${e.$i18n.locale}`,target:"_blank",rel:"noreferrer noopener"},(0,a.v_)(e.$t("ui.setup.create-project.releaseplanLink")),9,pt)])),_:1})]),e.contaoVersion?((0,i.uX)(),(0,i.CE)("main",ht,[(0,i.Lk)("div",mt,[t[15]||(t[15]=(0,i.Lk)("svg",{class:"setup__check",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,i.Lk)("path",{d:"M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"})],-1)),(0,i.Lk)("p",_t,(0,a.v_)(e.$t("ui.setup.create-project.installed",{version:e.contaoVersion})),1)]),(0,i.Lk)("div",vt,[(0,i.Lk)("button",{class:"widget-button widget-button--inline",onClick:t[4]||(t[4]=(...e)=>r.launch&&r.launch(...e))},(0,a.v_)(e.$t("ui.setup.manager")),1),(0,i.Lk)("button",{class:"widget-button widget-button--inline widget-button--primary",onClick:t[5]||(t[5]=t=>e.$emit("continue"))},(0,a.v_)(e.$t("ui.setup.continue")),1)])])):((0,i.uX)(),(0,i.CE)("main",kt,[(0,i.Lk)("div",bt,[(0,i.Lk)("h2",gt,(0,a.v_)(e.$t("ui.setup.create-project.formTitle")),1),(0,i.Lk)("p",ft,(0,a.v_)(e.$t("ui.setup.create-project.formText")),1),(0,i.bF)(h,{name:"version",options:r.versions,disabled:e.processing,modelValue:e.version,"onUpdate:modelValue":t[6]||(t[6]=t=>e.version=t)},null,8,["options","disabled","modelValue"]),"theme"===e.version?((0,i.uX)(),(0,i.CE)("div",yt,[(0,i.Lk)("p",null,(0,a.v_)(e.$t("ui.setup.create-project.themeInstall")),1),(0,i.bF)(p,{keypath:"ui.setup.create-project.themeBuy",tag:"p"},{store:(0,i.k6)((()=>[(0,i.Lk)("a",wt,(0,a.v_)(e.$t("ui.setup.create-project.themeStore")),1)])),_:1}),(0,i.bo)((0,i.Lk)("div",Lt,[(0,i.Lk)("div",null,[t[16]||(t[16]=(0,i.Lk)("img",{src:Pe,alt:"",width:"128",height:"128"},null,-1)),(0,i.Lk)("p",null,(0,a.v_)(e.$t("ui.packages.uploadOverlay")),1)])],512),[[X.aG,e.$refs.uploader&&e.$refs.uploader.dropActive]])])):((0,i.uX)(),(0,i.Wv)(m,{key:1,name:"demo",label:e.$t("ui.setup.create-project.demo"),disabled:e.processing,modelValue:e.demo,"onUpdate:modelValue":t[7]||(t[7]=t=>e.demo=t)},{description:(0,i.k6)((()=>[(0,i.bF)(p,{tag:"p",keypath:"ui.setup.create-project.demoDescription"},{store:(0,i.k6)((()=>[(0,i.Lk)("a",$t,(0,a.v_)(e.$t("ui.setup.create-project.themeStore")),1)])),_:1})])),_:1},8,["label","disabled","modelValue"]))]),(0,i.Lk)("div",Ct,["theme"===e.version?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.bF)(d,{color:"primary",icon:"upload",loading:e.processing,onClick:r.openFileSelector},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.create-project.themeUpload")),1)])),_:1},8,["loading","onClick"]),(0,i.Lk)("div",Et,[(0,i.Lk)("span",null,(0,a.v_)(e.$t("ui.setup.create-project.theme.or")),1)]),(0,i.bF)(_,{placeholder:e.$t("ui.setup.create-project.theme.search"),disabled:e.processing},null,8,["placeholder","disabled"])],64)):((0,i.uX)(),(0,i.Wv)(v,{key:1,color:"primary",icon:"run",disabled:!e.version,loading:e.processing,onClick:t[10]||(t[10]=()=>r.install()),label:e.$t("ui.setup.create-project.install")},{default:(0,i.k6)((()=>[e.demo?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.CE)("button",{key:0,class:"widget-button",disabled:!e.version||e.processing,onClick:t[8]||(t[8]=(...e)=>r.installCoreOnly&&r.installCoreOnly(...e))},(0,a.v_)(e.$t("ui.setup.create-project.coreOnly")),9,Xt)),(0,i.Lk)("button",{class:"widget-button",disabled:!e.version||e.processing,onClick:t[9]||(t[9]=(...e)=>r.installNoUpdate&&r.installNoUpdate(...e))},(0,a.v_)(e.$t("ui.setup.create-project.noUpdate")),9,Ft)])),_:1},8,["disabled","loading","label"]))])])),t[17]||(t[17]=(0,i.Lk)("div",{class:"clearfix"},null,-1)),e.searching||e.results||e.offline?((0,i.uX)(),(0,i.CE)("div",jt,[e.searching&&!e.results?((0,i.uX)(),(0,i.Wv)(k,{key:0,class:"setup__theme-search setup__theme-search--loader"},{default:(0,i.k6)((()=>[(0,i.Lk)("p",null,(0,a.v_)(e.$t("ui.discover.loading")),1)])),_:1})):e.offline?((0,i.uX)(),(0,i.CE)("div",At,[(0,i.Lk)("p",null,(0,a.v_)(e.$t("ui.discover.offline")),1),(0,i.Lk)("p",null,(0,a.v_)(e.$t("ui.discover.offlineExplain")),1),(0,i.Lk)("button",{class:"widget-button widget-button--inline widget-button--update",onClick:t[11]||(t[11]=(...e)=>r.searchThemes&&r.searchThemes(...e))},(0,a.v_)(e.$t("ui.discover.offlineButton")),1)])):e.isSearching&&e.results&&!Object.keys(e.results).length?((0,i.uX)(),(0,i.CE)("div",Vt,[(0,i.bF)(p,{tag:"p",keypath:"ui.setup.create-project.theme.empty"},{query:(0,i.k6)((()=>[(0,i.Lk)("i",null,(0,a.v_)(e.query),1)])),_:1})])):e.isSearching&&e.results?((0,i.uX)(),(0,i.CE)(i.FK,{key:3},[(0,i.Lk)("div",Ut,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(e.results,(e=>((0,i.uX)(),(0,i.Wv)(b,{class:"setup__themes-item",data:e,key:e.name},null,8,["data"])))),128))]),(0,i.Lk)("div",xt,[e.hasMore?((0,i.uX)(),(0,i.Wv)(d,{key:0,inline:"",icon:"search",loading:e.searching,onClick:e.loadMore},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.create-project.theme.more")),1)])),_:1},8,["loading","onClick"])):(0,i.Q3)("",!0)])],64)):(0,i.Q3)("",!0)])):(0,i.Q3)("",!0)],64))])}s(2489),s(116),s(7588),s(4603),s(7566),s(8721);var St=s(4686),Pt=s.n(St),Wt=s(1881),Tt=s(8568),It=s.n(Tt);const qt=["href"],Rt=["href"],Bt={key:3};function Mt(e,t,s,o,n,r){const l=(0,i.g2)("package-constraint"),u=(0,i.g2)("package-details");return(0,i.uX)(),(0,i.Wv)(u,null,{"package-actions":(0,i.k6)((()=>[!e.isTheme||r.data.uploaded||r.isPrivate?r.data.homepage||e.metadata.homepage?((0,i.uX)(),(0,i.CE)("a",{key:1,class:"widget-button widget-button--primary widget-button--link",target:"_blank",href:r.data.homepage||e.metadata.homepage},(0,a.v_)(e.$t("ui.package.homepage")),9,qt)):r.isPrivate?((0,i.uX)(),(0,i.CE)("div",Bt)):((0,i.uX)(),(0,i.CE)("a",{key:2,class:"widget-button widget-button--primary widget-button--link",target:"_blank",href:`https://packagist.org/packages/${r.data.name}`},(0,a.v_)(e.$t("ui.package-details.packagist")),9,Rt)):((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[(0,i.Lk)("button",{class:"widget-button widget-button--primary widget-button--run",onClick:t[0]||(t[0]=(...e)=>r.install&&r.install(...e))},(0,a.v_)(e.$t("ui.setup.create-project.install")),1),(0,i.bF)(l,{class:"theme-details__constraint",emit:!0,data:r.data,modelValue:e.version,"onUpdate:modelValue":t[1]||(t[1]=t=>e.version=t)},null,8,["data","modelValue"])],64))])),_:1})}var Ot=s(1474),Ht=s(5062),Qt=s(416),Kt=s(8200),Jt={mixins:[Qt.A,Kt.A],components:{PackageConstraint:Ht.A,PackageDetails:Ot["default"]},data:()=>({version:""}),computed:{...(0,C.aH)("packages",{allInstalled:"installed"}),current:e=>e.$route.query.p,data:e=>e.allInstalled&&e.allInstalled[e.current]||{name:e.current},isPrivate:e=>e.metadata&&!!e.metadata.private},methods:{install(){this.$store.commit("contao/installTheme",{package:this.data.name,version:this.version})}}};const Nt=(0,Xe.A)(Jt,[["render",Mt]]);var zt=Nt,Zt=s(791),Yt=s(9045),Gt=s(6435);const es={class:"file-tree"},ts=["onClick"],ss={key:1,class:"file-tree__file"};function is(e,t,s,o,n,r){const l=(0,i.g2)("file-tree",!0);return(0,i.uX)(),(0,i.CE)("ul",es,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(s.files,((e,t)=>((0,i.uX)(),(0,i.CE)(i.FK,{key:t},[e.children.length?((0,i.uX)(),(0,i.CE)("li",{key:0,class:(0,a.C4)("file-tree__folder"+(r.isOpen(e)?" file-tree__folder--open":""))},[(0,i.Lk)("button",{onClick:t=>r.toggle(e)},(0,a.v_)(r.name(e)),9,ts),r.isOpen(e)?((0,i.uX)(),(0,i.Wv)(l,{key:0,files:e.children},null,8,["files"])):(0,i.Q3)("",!0)],2)):((0,i.uX)(),(0,i.CE)("li",ss,[(0,i.Lk)("span",null,(0,a.v_)(r.name(e)),1)]))],64)))),128))])}var as={name:"FileTree",props:{files:{type:Array,required:!0}},data:()=>({open:[]}),computed:{name:()=>e=>e.name?e.name:e.path.substring(e.path.lastIndexOf("/")+1),isOpen:e=>t=>e.open.includes(t)},methods:{toggle(e){this.open.includes(e)?this.open=this.open.filter((t=>t!==e)):this.open.push(e)}}};const os=(0,Xe.A)(as,[["render",is]]);var ns=os,rs=s(4676),ls=s(1326),us=s(4960),cs={mixins:[Wt.A],components:{ButtonGroup:rs.A,FileTree:ns,DiscoverPackage:Gt.A,LoadingSpinner:Yt.A,SearchInput:Zt.A,FileUpload:It(),RadioButton:je,CheckBox:Ae.A,LoadingButton:Ve.A,ProgressBar:ls.A},data:()=>({processing:!1,isWeb:!0,version:"5.5",demo:!1,view:"require",theme:null,themeImage:null,upload:null,searching:!1,results:null,hasMore:!1,offline:!1}),computed:{...(0,C.aH)("tasks",{taskStatus:"status"}),...(0,C.aH)("server/php-web",["phpVersionId","phpVersion"]),...(0,C.aH)("server/contao",["contaoVersion"]),...(0,C.aH)("contao",{themeName:"package",themeVersion:"version"}),themeFiles:e=>Pt()(e.theme.files,{directoriesFirst:!0}).children,uploadSize:e=>e.upload&&(0,us.A)(e.upload.size)||"",versions(){const e=[];return e.push({value:"5.5",label:`Contao 5.5 (${this.$t("ui.setup.create-project.latestTitle")})`,disabled:this.phpVersionId<80200,description:this.$t("ui.setup.create-project.latestQ3",{year:"2025"}),problem:this.$t("ui.setup.create-project.requiresPHP",{version:"8.2.0",current:this.phpVersion})}),e.push({value:"5.3",label:`Contao 5.3 (${this.$t("ui.setup.create-project.ltsTitle")})`,disabled:this.phpVersionId<80100,description:this.$t("ui.setup.create-project.ltsText",{year:"2027"}),problem:this.$t("ui.setup.create-project.requiresPHP",{version:"8.1.0",current:this.phpVersion})}),e.push({value:"4.13",label:`Contao 4.13 (${this.$t("ui.setup.create-project.ltsTitle")})`,disabled:this.phpVersionId<70400,description:this.$t("ui.setup.create-project.pltsText",{year:"2025"}),problem:this.$t("ui.setup.create-project.requiresPHP",{version:"7.4.0",current:this.phpVersion})}),e.push({value:"theme",label:this.$t("ui.setup.create-project.theme")}),e}},watch:{version(){this.stopSearch(),this.searching=!1,this.results=null,this.hasMore=!1},sorting(){this.searchThemes()},query(){this.results=null,this.query?this.searchThemes():(this.searching=!1,this.hasMore=!1)},pages(){this.searchThemes()},themeName(){this.themeName&&(this.closePopup(),this.install({package:this.themeName,version:this.themeVersion}))}},methods:{...(0,C.PY)("packages/details",{closePopup:"clearCurrent"}),async searchThemes(){this.searching=!0,this.offline=!1;try{const e={facetFilters:["type:contao-theme"],hitsPerPage:10*this.pages};this.query?e.query=this.query:this.sorting&&(e.sorting=this.sorting);const t=await this.$store.dispatch("algolia/findPackages",e);if(this.hasMore=t.nbPages>1,0===t.nbHits)return void(this.results={});const s={};t.hits.forEach((e=>{s[e.name]=e})),this.results=s}catch(e){this.offline=!0}this.searching=!1},async install(e,t=null){let s;this.processing=!0,s=e||(this.theme?{upload:this.theme.upload.id}:this.demo?{package:"contao/contao-demo",version:this.version,"no-update":"no-update"===t?"1":"0"}:{version:this.version,"core-only":"core-only"===t?"1":"0","no-update":"no-update"===t?"1":"0"});try{await this.$store.dispatch("contao/install",s)}catch(i){}this.processing=!1,"complete"===this.taskStatus&&(this.$store.commit("tasks/setDeleting",!0),await this.$store.dispatch("server/composer/get",!1),"no-update"===t?(this.$store.commit("setSafeMode",!0),this.$store.commit("setView",$.A.READY)):(this.isWeb="web"===(await this.$store.dispatch("server/contao/get",!1)).data.public_dir,await Promise.all([this.$store.dispatch("contao/install-tool/fetch",!1),this.$store.dispatch("server/database/get",!1),this.$store.dispatch("contao/backup/fetch",!1)]),this.$store.commit("contao/backup/setRestore",!0),this.$store.commit("setup",3)),await this.$store.dispatch("tasks/deleteCurrent"))},installNoUpdate(){this.install(null,"no-update")},installCoreOnly(){this.install(null,"core-only")},launch(){this.$store.commit("setView",$.A.READY)},openFileSelector(){this.$refs.uploader&&this.$refs.uploader.$el.querySelector("input").click()},async filterTheme(e,t,s){if(e&&!t&&!/(\.cto|\.zip)$/i.test(e.name))return console&&console.debug(`${e.name} is not a .zip or .cto`),alert(this.$t("ui.setup.create-project.themeInvalid")),s()},async uploadTheme(e,t){if(e)if(this.processing=!0,this.$refs.uploader.uploaded&&e&&t&&!e.active&&t.active){if(this.theme.upload=e.response.data,e.success)try{await this.install()}catch(i){this.upload=null,this.processing=!1}}else if(!e.active||t.active){e.url=URL.createObjectURL(e.file);try{const t=new File([e.file],e.name,{type:e.type}),a=(await s.e(710).then(s.t.bind(s,1710,23))).default,o=await a.loadAsync(t),n=o.filter((e=>!["composer.json","theme.xml"].includes(e)&&!e.startsWith("__MACOSX/")&&!e.includes(".DS_Store")&&!e.endsWith("/"))).map((e=>e.name));let r=n[0].substring(0,n[0].indexOf("/")+1);n.find((e=>e.substr(0,r.length)!==r))&&(r="");const l=JSON.parse(await o.file(`${r}composer.json`).async("string")),u=await o.file(`${r}theme.xml`).async("string"),c=new DOMParser,d=c.parseFromString(u,"application/xml");if(this.theme={tstamp:d.querySelector('table[name="tl_theme"] field[name="tstamp"]')?.innerHTML,name:d.querySelector('table[name="tl_theme"] field[name="name"]')?.innerHTML,author:d.querySelector('table[name="tl_theme"] field[name="author"]')?.innerHTML,screenshot:d.querySelector('table[name="tl_theme"] field[name="screenshot"]')?.innerHTML,composerJson:l,files:n},this.theme.screenshot&&"NULL"!==this.theme.screenshot)try{const e=await o.file(`${r}${this.theme.screenshot}`);this.themeImage=e?URL.createObjectURL(await e.async("blob")):null}catch(i){}}catch(i){console&&console.debug(i),alert(this.$t("ui.setup.create-project.themeInvalid")),this.cancelTheme()}this.processing=!1}else this.upload=e},cancelTheme(){this.theme=null,this.$refs.uploader.clear()},themeDetails(){this.$store.commit("packages/setInstalled",{local:{[this.theme.composerJson.name]:Object.assign({},this.theme.composerJson,{uploaded:!0})}}),this.$store.commit("packages/details/setCurrent",this.theme.composerJson.name)},installTheme(){this.$refs.uploader.active||(this.processing=!0,this.$refs.uploader.active=!0)}},async mounted(){await this.$router.isReady(),Object.keys(this.$route.query).length&&this.$router.replace({query:null}),await this.$store.dispatch("packages/details/init",{vue:this,component:zt}),this.$store.commit("packages/setInstalled",{}),this.isWeb="web"===(await this.$store.dispatch("server/contao/get")).data.public_dir,this.version=this.versions.find((e=>!e.disabled)).value}};const ds=(0,Xe.A)(cs,[["render",Dt]]);var ps=ds,hs=s(9472);const ms={class:"setup__header"},_s={class:"setup__headline"},vs={class:"setup__form",key:"setup"},ks={class:"setup__fields"},bs={class:"setup__fieldtitle"},gs={class:"setup__fielddesc"},fs={key:0,class:"setup__warning"},ys={class:"setup__or"},ws={class:"setup__actions"},Ls=["disabled"],$s={class:"setup__form",key:"confirmation"},Cs={class:"setup__fields"},Es={class:"setup__fieldtitle"},Xs={key:"migrate"},Fs={class:"setup__fields"},js={class:"setup__fieldtitle"},As={key:0,class:"setup__fielddesc setup__warning"},Vs={key:1,class:"setup__fielddesc"},Us={class:"setup__actions setup__actions--center"},xs={key:"restored"},Ds={class:"setup__fields"},Ss={class:"setup__fieldtitle"},Ps={class:"setup__fielddesc"},Ws={class:"setup__actions setup__actions--center"},Ts={key:"backup"},Is={class:"setup__fields"},qs={class:"setup__fieldtitle"},Rs={class:"setup__fielddesc"},Bs={class:"setup__fielddesc setup__warning"},Ms={class:"setup__actions"},Os=["disabled"];function Hs(e,t,s,o,n,r){const l=(0,i.g2)("i18n-t"),u=(0,i.g2)("text-field"),c=(0,i.g2)("loading-button"),d=(0,i.g2)("radio-button");return(0,i.uX)(),(0,i.CE)("section",null,[(0,i.Lk)("header",ms,[t[17]||(t[17]=(0,i.Lk)("img",{src:hs,width:"80",height:"80",class:"setup__icon",alt:""},null,-1)),(0,i.Lk)("h1",_s,(0,a.v_)(e.$t("ui.setup.database-connection.headline")),1),(0,i.bF)(l,{tag:"p",keypath:"ui.setup.database-connection.description",class:"setup__description"},{env:(0,i.k6)((()=>t[16]||(t[16]=[(0,i.Lk)("code",null,".env.local",-1)]))),_:1})]),e.currentState?((0,i.uX)(),(0,i.Wv)(X.eB,{key:0,name:"animate-flip",type:"transition",mode:"out-in"},{default:(0,i.k6)((()=>["error"===e.currentState||"edit"===e.currentState?((0,i.uX)(),(0,i.CE)("main",vs,[(0,i.Lk)("form",{onSubmit:t[7]||(t[7]=(0,X.D$)(((...e)=>r.save&&r.save(...e)),["prevent"]))},[(0,i.Lk)("div",ks,[(0,i.Lk)("h2",bs,(0,a.v_)(e.$t("ui.setup.database-connection.formTitle")),1),(0,i.Lk)("p",gs,(0,a.v_)(e.$t("ui.setup.database-connection.formText")),1),"edit"!==e.currentState&&""!==e.currentUrl?((0,i.uX)(),(0,i.CE)("p",fs,(0,a.v_)(e.$t("ui.setup.database-connection.error")),1)):(0,i.Q3)("",!0),(0,i.bF)(u,{ref:"url",name:"url",type:"url",label:e.$t("ui.setup.database-connection.url"),placeholder:"mysql://user:password@server:port/database",required:"",pattern:e.urlPattern,validate:"",disabled:e.processing,modelValue:e.url,"onUpdate:modelValue":t[0]||(t[0]=t=>e.url=t),onKeyup:t[1]||(t[1]=t=>e.validUrl=!0),onBlur:r.parseUrl,error:e.validUrl?void 0:e.$t("ui.setup.database-connection.validUrl")},null,8,["label","pattern","disabled","modelValue","onBlur","error"]),(0,i.Lk)("div",ys,[(0,i.Lk)("span",null,(0,a.v_)(e.$t("ui.setup.database-connection.or")),1)]),(0,i.bF)(u,{name:"user",label:e.$t("ui.setup.database-connection.user"),disabled:e.processing,modelValue:e.user,"onUpdate:modelValue":t[2]||(t[2]=t=>e.user=t)},null,8,["label","disabled","modelValue"]),(0,i.bF)(u,{name:"password",type:"password",label:e.$t("ui.setup.database-connection.password"),disabled:e.processing,modelValue:e.password,"onUpdate:modelValue":t[3]||(t[3]=t=>e.password=t)},null,8,["label","disabled","modelValue"]),(0,i.bF)(u,{name:"server",label:e.$t("ui.setup.database-connection.server"),disabled:e.processing,required:"",modelValue:e.server,"onUpdate:modelValue":t[4]||(t[4]=t=>e.server=t)},null,8,["label","disabled","modelValue"]),(0,i.bF)(u,{name:"database",label:e.$t("ui.setup.database-connection.database"),disabled:e.processing,required:"",modelValue:e.database,"onUpdate:modelValue":t[5]||(t[5]=t=>e.database=t)},null,8,["label","disabled","modelValue"])]),(0,i.Lk)("div",ws,[(0,i.bF)(c,{submit:"",color:"primary",icon:"save",loading:e.processing,disabled:!e.valid},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.database-connection.save")),1)])),_:1},8,["loading","disabled"]),"edit"===e.currentState?((0,i.uX)(),(0,i.CE)("button",{key:0,type:"button",class:"widget-button",disabled:e.processing,onClick:t[6]||(t[6]=(...e)=>r.load&&r.load(...e))},(0,a.v_)(e.$t("ui.setup.cancel")),9,Ls)):(0,i.Q3)("",!0)])],32)])):((0,i.uX)(),(0,i.CE)("main",$s,[(0,i.Lk)("div",Cs,[(0,i.Lk)("h2",Es,(0,a.v_)(e.$t("ui.setup.database-connection.formTitle")),1),e.url?((0,i.uX)(),(0,i.Wv)(l,{key:0,tag:"p",keypath:"ui.setup.database-connection.connected",class:"setup__fielddesc"},{database:(0,i.k6)((()=>[(0,i.Lk)("i",null,(0,a.v_)(e.database),1)])),server:(0,i.k6)((()=>[(0,i.Lk)("i",null,(0,a.v_)(e.server),1)])),_:1})):(0,i.Q3)("",!0),(0,i.Lk)("button",{type:"button",class:"widget-button widget-button--edit widget-button--small",onClick:t[8]||(t[8]=t=>e.currentState="edit")},(0,a.v_)(e.$t("ui.setup.database-connection.change")),1)]),(0,i.bF)(X.eB,{name:"animate-flip",type:"transition",mode:"out-in"},{default:(0,i.k6)((()=>[!e.hasDatabaseError&&e.backupRestore&&e.hasBackups?e.backupRestored?((0,i.uX)(),(0,i.CE)("div",xs,[(0,i.Lk)("div",Ds,[(0,i.Lk)("h2",Ss,(0,a.v_)(e.$t("ui.setup.database-connection.restoreTitle")),1),t[18]||(t[18]=(0,i.Lk)("svg",{class:"setup__check",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,i.Lk)("path",{d:"M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"})],-1)),(0,i.Lk)("p",Ps,(0,a.v_)(e.$t("ui.setup.database-connection.restored")),1)]),(0,i.Lk)("div",Ws,[(0,i.Lk)("button",{type:"button",class:"widget-button widget-button--primary",onClick:t[12]||(t[12]=t=>e.$store.commit("contao/backup/setRestore",!1))},(0,a.v_)(e.$t("ui.setup.continue")),1)])])):((0,i.uX)(),(0,i.CE)("div",Ts,[(0,i.Lk)("div",Is,[(0,i.Lk)("h2",qs,(0,a.v_)(e.$t("ui.setup.database-connection.restoreTitle")),1),(0,i.Lk)("p",Rs,(0,a.v_)(e.$tc("ui.setup.database-connection.restoreText",e.files.length)),1),e.files.length>1?((0,i.uX)(),(0,i.Wv)(d,{key:0,required:"","allow-html":"",options:r.fileOptions,name:"selection",modelValue:e.selection,"onUpdate:modelValue":t[13]||(t[13]=t=>e.selection=t)},null,8,["options","modelValue"])):(0,i.Q3)("",!0),(0,i.Lk)("p",Bs,(0,a.v_)(e.$t("ui.setup.database-connection.backupWarning")),1)]),(0,i.Lk)("div",Ms,[(0,i.Lk)("button",{type:"button",class:"widget-button widget-button--inline",onClick:t[14]||(t[14]=t=>e.$store.commit("contao/backup/setRestore",!1))},(0,a.v_)(e.$t("ui.setup.database-connection.skip")),1),(0,i.Lk)("button",{type:"button",class:"widget-button widget-button--inline widget-button--primary",disabled:e.files.length>1&&!e.selection,onClick:t[15]||(t[15]=(...e)=>r.restore&&r.restore(...e))},(0,a.v_)(e.$t("ui.setup.database-connection.restore")),9,Os)])])):((0,i.uX)(),(0,i.CE)("div",Xs,[(0,i.Lk)("div",Fs,[(0,i.Lk)("h2",js,(0,a.v_)(e.$t("ui.setup.database-connection.schemaTitle")),1),e.status&&e.status.total>0?((0,i.uX)(),(0,i.CE)("p",As,(0,a.v_)(e.$tc(`ui.setup.database-connection.${e.currentState}`,e.status.total)),1)):((0,i.uX)(),(0,i.CE)("p",Vs,(0,a.v_)(e.$t("ui.setup.database-connection.noChanges")),1))]),(0,i.Lk)("div",Us,[e.status&&e.status.total>0?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[e.hasDatabaseError?(0,i.Q3)("",!0):((0,i.uX)(),(0,i.CE)("button",{key:0,type:"button",class:"widget-button widget-button--inline",onClick:t[9]||(t[9]=t=>e.$emit("continue"))},(0,a.v_)(e.$t("ui.setup.database-connection.skip")),1)),(0,i.Lk)("button",{type:"button",class:"widget-button widget-button--inline widget-button--primary",onClick:t[10]||(t[10]=(...e)=>r.checkMigrations&&r.checkMigrations(...e))},(0,a.v_)(e.$t("ui.setup.database-connection.check")),1)],64)):((0,i.uX)(),(0,i.CE)("button",{key:1,type:"button",class:"widget-button widget-button--primary",onClick:t[11]||(t[11]=t=>e.$emit("continue"))},(0,a.v_)(e.$t("ui.setup.continue")),1))])]))])),_:1})]))])),_:1})):(0,i.Q3)("",!0)])}var Qs=s(4210),Ks={components:{RadioButton:je,TextField:fe.A,LoadingButton:Ve.A},data:()=>({processing:!1,validUrl:!0,valid:!1,validating:!1,currentState:null,url:"",user:"",password:"",server:"localhost",database:"",backup:!0,selection:null}),computed:{...(0,C.aH)("tasks",{taskStatus:"status"}),...(0,C.aH)("contao/backup",{backupRestored:"restored",backupRestore:"restore"}),...(0,C.aH)("server/database",{currentUrl:"url",urlPattern:"pattern",status:"status"}),...(0,C.aH)("contao/backup",["files"]),...(0,C.L8)("server/database",{hasDatabaseError:"hasError"}),...(0,C.L8)("contao/backup",["hasBackups"]),fileOptions(){return this.files.map((e=>({value:e.name,label:this.$t("ui.setup.database-connection.restoreOption",{date:(0,Qs.A)(e.createdAt),size:(0,us.A)(e.size)})})))}},methods:{datimFormat(e){return(0,Qs.A)(e,"short","long")},checkMigrations(){this.$store.commit("checkMigrations")},parseUrl(){if(!this.validateUrl())return;this.validating=!0;const e=new RegExp(this.urlPattern,"i").exec(this.url);this.user=e[3]?decodeURIComponent(e[3]):"",this.password=e[5]?decodeURIComponent(e[5]):"",this.server=decodeURIComponent(e[6]),this.database=decodeURIComponent(e[8]),":3306"===this.server.substring(this.server.length-5)?this.server=this.server.substring(0,this.server.length-5):this.server.includes(":")||(this.server=`${this.server}:3306`),this.valid=this.validateUrl(),this.validating=!1},updateUrl(){if(this.validating)return;if(this.valid=!1,!this.server)return;const e=this.server.split(":",2),t=`${encodeURIComponent(e[0])}:${e[1]||"3306"}`;let s="mysql://";this.user&&(s+=encodeURIComponent(this.user),this.password&&(s+=":"+encodeURIComponent(this.password)),s+="@"),s+=t,this.database&&(s+="/"+encodeURIComponent(this.database)),this.url=s,this.valid=this.validateUrl()},validateUrl(){return this.validUrl=!0,this.valid=!1,""!==this.url&&(this.validUrl=new RegExp(this.urlPattern,"i").test(this.url),this.validUrl)},async load(){this.url=(await this.$store.dispatch("server/database/get")).data.url,this.currentState=this.status?.type,this.parseUrl(),"error"===this.currentState&&(this.validUrl=!1,this.valid=!1)},async save(){this.processing=!0;const e=await this.$store.dispatch("server/database/set",this.url);if("error"===e.data.status.type)return this.processing=!1,this.validUrl=!1,void(this.valid=!1);await this.$store.dispatch("server/adminUser/get",!1),this.processing=!1},async restore(){await this.$store.dispatch("tasks/execute",{name:"contao/backup-restore",config:{file:this.files.length>1?this.selection:this.files[0].name,backup:!1}}),"complete"===this.taskStatus&&(this.$store.commit("contao/backup/setRestored"),await this.$store.dispatch("tasks/deleteCurrent"))}},watch:{user(){this.updateUrl()},password(){this.updateUrl()},server(){this.updateUrl()},database(){this.updateUrl()},status(){this.currentState=this.status?.type}},mounted(){this.load(),this.selection=null,this.backup=!0}};const Js=(0,Xe.A)(Ks,[["render",Hs]]);var Ns=Js,zs=s.p+"img/user.129e863d.svg";const Zs={class:"setup__header"},Ys={class:"setup__headline"},Gs={class:"setup__description"},ei={key:0,class:"setup__form"},ti={class:"setup__fields"},si={class:"setup__warning"},ii={class:"setup__form setup__form--center",key:"confirmation"},ai={class:"setup__fields"},oi={class:"setup__fielddesc"},ni={class:"setup__actions setup__actions--center"},ri={class:"setup__form",key:"setup"},li={class:"setup__fields"},ui={class:"setup__fieldtitle"},ci={class:"setup__fielddesc"},di={class:"setup__actions setup__actions--center"};function pi(e,t,s,o,n,r){const l=(0,i.g2)("console-output"),u=(0,i.g2)("text-field"),c=(0,i.g2)("loading-button");return(0,i.uX)(),(0,i.CE)("section",null,[(0,i.Lk)("header",Zs,[t[8]||(t[8]=(0,i.Lk)("img",{src:zs,width:"80",height:"80",class:"setup__icon",alt:""},null,-1)),(0,i.Lk)("h1",Ys,(0,a.v_)(e.$t("ui.setup.backend-user.headline")),1),(0,i.Lk)("p",Gs,(0,a.v_)(e.$t("ui.setup.backend-user.description")),1)]),null===e.hasUser?((0,i.uX)(),(0,i.CE)("main",ei,[(0,i.Lk)("div",ti,[(0,i.Lk)("p",si,(0,a.v_)(e.$t("ui.setup.backend-user.error")),1),502===e.response.status?((0,i.uX)(),(0,i.Wv)(l,{key:0,class:"view-recovery__console",title:e.$t("ui.recovery.console"),operations:[{status:"error",summary:"vendor/bin/contao-console contao:user:list",console:e.response.data.detail}],"console-output":e.response.data.detail,"show-console":"","force-console":""},null,8,["title","operations","console-output"])):(0,i.Q3)("",!0)])])):((0,i.uX)(),(0,i.Wv)(X.eB,{key:1,name:"animate-flip",type:"transition",mode:"out-in"},{default:(0,i.k6)((()=>[e.hasUser?((0,i.uX)(),(0,i.CE)("main",ii,[(0,i.Lk)("div",ai,[t[9]||(t[9]=(0,i.Lk)("svg",{class:"setup__check",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,i.Lk)("path",{d:"M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,16.5L6.5,12L7.91,10.59L11,13.67L16.59,8.09L18,9.5L11,16.5Z"})],-1)),(0,i.Lk)("p",oi,(0,a.v_)(e.$t("ui.setup.backend-user.success")),1)]),(0,i.Lk)("div",ni,[(0,i.Lk)("button",{type:"button",class:"widget-button widget-button--inline widget-button--primary",onClick:t[0]||(t[0]=t=>e.$emit("continue"))},(0,a.v_)(e.$t("ui.setup.continue")),1)])])):((0,i.uX)(),(0,i.CE)("main",ri,[(0,i.Lk)("form",{onSubmit:t[7]||(t[7]=(0,X.D$)(((...e)=>r.save&&r.save(...e)),["prevent"]))},[(0,i.Lk)("div",li,[(0,i.Lk)("h2",ui,(0,a.v_)(e.$t("ui.setup.backend-user.formTitle")),1),(0,i.Lk)("p",ci,(0,a.v_)(e.$t("ui.setup.backend-user.formText")),1),(0,i.bF)(u,{ref:"username",name:"username",label:e.$t("ui.setup.backend-user.username"),disabled:e.processing,required:"",validate:"",modelValue:e.username,"onUpdate:modelValue":t[1]||(t[1]=t=>e.username=t)},null,8,["label","disabled","modelValue"]),(0,i.bF)(u,{ref:"name",name:"name",label:e.$t("ui.setup.backend-user.name"),disabled:e.processing,required:"",validate:"",modelValue:e.name,"onUpdate:modelValue":t[2]||(t[2]=t=>e.name=t)},null,8,["label","disabled","modelValue"]),(0,i.bF)(u,{ref:"email",name:"email",type:"email",label:e.$t("ui.setup.backend-user.email"),disabled:e.processing,required:"",validate:"",error:e.errors.email,onFocus:t[3]||(t[3]=t=>e.errors.email=""),onBlur:r.validateEmail,modelValue:e.email,"onUpdate:modelValue":t[4]||(t[4]=t=>e.email=t)},null,8,["label","disabled","error","onBlur","modelValue"]),(0,i.bF)(u,{ref:"password",name:"password",type:"password",label:e.$t("ui.setup.backend-user.password"),placeholder:e.$t("ui.setup.backend-user.passwordPlaceholder"),disabled:e.processing,required:"",minlength:"8",validate:"",error:e.errors.password,onFocus:t[5]||(t[5]=t=>e.errors.password=""),onBlur:r.validatePassword,modelValue:e.password,"onUpdate:modelValue":t[6]||(t[6]=t=>e.password=t)},null,8,["label","placeholder","disabled","error","onBlur","modelValue"])]),(0,i.Lk)("div",di,[(0,i.bF)(c,{submit:"",color:"primary",loading:e.processing,disabled:!e.valid},{default:(0,i.k6)((()=>[(0,i.eW)((0,a.v_)(e.$t("ui.setup.backend-user.create")),1)])),_:1},8,["loading","disabled"])])],32)]))])),_:1}))])}var hi=s(2864),mi={components:{TextField:fe.A,LoadingButton:Ve.A,ConsoleOutput:hi.A},data:()=>({processing:!1,valid:!1,username:"",name:"",email:"",password:"",errors:{email:"",password:""}}),computed:{...(0,C.aH)("server/adminUser",{hasUser:"hasUser",response:"cache"})},methods:{validate(){this.valid=this.$refs.username.checkValidity()&&this.$refs.name.checkValidity()&&this.$refs.email.checkValidity()&&this.$refs.password.checkValidity()},validateEmail(){this.errors.email=null,""!==this.email&&(this.$refs.email.checkValidity()||(this.errors.email=this.$t("ui.setup.backend-user.emailInvalid")))},validatePassword(){this.errors.password=null,""!==this.password&&this.password.length<8&&(this.errors.password=this.$t("ui.setup.backend-user.passwordLength"))},async save(){this.processing=!0,await this.$store.dispatch("server/adminUser/set",{username:this.username,name:this.name,email:this.email,password:this.password}),this.processing=!1,this.$store.commit("setup",5)}},watch:{username(){this.validate()},name(){this.validate()},email(){this.validate()},password(){this.validate()}}};const _i=(0,Xe.A)(mi,[["render",pi]]);var vi=_i,ki={components:{BoxedLayout:E.A,DocumentRoot:De,CreateProject:ps,DatabaseConnection:Ns,BackendUser:vi},computed:{...(0,C.aH)(["setupStep"]),...(0,C.aH)("server/contao",["contaoVersion"]),...(0,C.aH)("server/database",{databaseSupported:"supported"}),...(0,C.aH)("server/adminUser",{userSupported:"supported"}),...(0,C.aH)("contao/install-tool",{showInstallTool:"isSupported"}),currentStep:{get(){return this.setupStep},set(e){this.$store.commit("setup",e)}},steps(){const e=[];return e.push({name:"document-root",icon:F,component:De}),e.push({name:"create-project",icon:Se,component:ps}),this.databaseSupported&&e.push({name:"database-connection",icon:hs,component:Ns}),this.userSupported&&e.push({name:"backend-user",icon:zs,component:vi}),e}},methods:{launch(){this.$store.commit("setView",$.A.READY)}},mounted(){this.$store.dispatch("server/adminUser/get"),this.$store.dispatch("contao/backup/fetch")}};const bi=(0,Xe.A)(ki,[["render",L]]);var gi=bi},4686:function(e,t){var s=this&&this.__extends||function(){var e=function(t,s){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[s]=t[s])},e(t,s)};return function(t,s){if("function"!==typeof s&&null!==s)throw new TypeError("Class extends value "+String(s)+" is not a constructor or null");function i(){this.constructor=t}e(t,s),t.prototype=null===s?Object.create(s):(i.prototype=s.prototype,new i)}}();Object.defineProperty(t,"__esModule",{value:!0}),t.treeifyPaths=t.Node=t.PathTree=void 0;var i=function(){function e(e){void 0===e&&(e=""),this.path=e,this.name="",this.children=[]}return e}();t.PathTree=i;var a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return s(t,e),t}(i);function o(e,t,s){void 0===s&&(s={});var a={};t.forEach((function(t){var s=t[0],o=t[1],n=r(s).split("/"),l=n[0];if(!a[l]){var u="".concat(e.path,"/").concat(n[0]);a[l]={paths:[],obj:new i(r(u))}}if(1==n.length)a[l].obj.name=l,a[l].obj.ctx=o;else{n.shift();var c=n.join("/");a[l].paths.push([c,o]),a[l].obj.ctx=o}}));var n=Object.keys(a);return s.caseInsensitive?n.sort((function(e,t){return e.toLocaleLowerCase().localeCompare(t.toLocaleLowerCase())})):n.sort(),n.forEach((function(t){var i=a[t].obj;o(i,a[t].paths,s),(i.name||i.path||i.children.length)&&e.children.push(i)})),s.directoriesFirst?e.children.sort((function(e,t){return e.children.length&&!t.children.length?-1:t.children.length&&!e.children.length?1:0})):s.directoriesLast&&e.children.sort((function(e,t){return e.children.length&&!t.children.length?1:t.children.length&&!e.children.length?-1:0})),e}function n(e,t){void 0===e&&(e=[]),void 0===t&&(t={});var s=l(e)?e.map((function(e){return[e,void 0]})):e;return o(new i,s,t)}t.Node=a,t.treeifyPaths=n,t["default"]=n;var r=function(e){return e.replace(/^\/*/,"").replace(/\/*$/,"")},l=function(e){return"string"===typeof e[0]}},9472:function(e,t,s){e.exports=s.p+"img/database.7f0a8c49.svg"}}]);(self["webpackChunkcontao_manager"]=self["webpackChunkcontao_manager"]||[]).push([[710],{1710:function(e,t,r){ /*! JSZip v3.10.1 - A JavaScript class for generating and reading zip files (c) 2009-2016 Stuart Knightley Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown. JSZip uses the library pako released under the MIT license : https://github.com/nodeca/pako/blob/main/LICENSE */ !function(t){e.exports=t()}((function(){return function e(t,r,n){function i(a,o){if(!r[a]){if(!t[a]){var h=void 0;if(!o&&h)return require(a,!0);if(s)return s(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var l=r[a]={exports:{}};t[a][0].call(l.exports,(function(e){var r=t[a][1][e];return i(r||e)}),l,l.exports,e,t,r,n)}return r[a].exports}for(var s=void 0,a=0;a>2,o=(3&t)<<4|r>>4,h=1>6:64,u=2>4,r=(15&a)<<4|(o=s.indexOf(e.charAt(u++)))>>2,n=(3&o)<<6|(h=s.indexOf(e.charAt(u++))),c[l++]=t,64!==o&&(c[l++]=r),64!==h&&(c[l++]=n);return c}},{"./support":30,"./utils":32}],2:[function(e,t,r){"use strict";var n=e("./external"),i=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),a=e("./stream/DataLengthProbe");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),t=this;return e.on("end",(function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")})),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,r){"use strict";var n=e("./utils"),i=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==n.getTypeOf(e)?function(e,t,r,n){var s=i,a=n+r;e^=-1;for(var o=n;o>>8^s[255&(e^t[o])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var s=i,a=n+r;e^=-1;for(var o=n;o>>8^s[255&(e^t.charCodeAt(o))];return-1^e}(0|t,e,e.length,0):0}},{"./utils":32}],5:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){"use strict";var n=null;n="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,i=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),o=n?"uint8array":"array";function h(e,t){a.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic="\b\0",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},r.compressWorker=function(e){return new h("Deflate",e)},r.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,r){"use strict";function n(e,t){var r,n="";for(r=0;r>>=8;return n}function i(e,t,r,i,a,l){var f,c,d=e.file,p=e.compression,m=l!==o.utf8encode,_=s.transformTo("string",l(d.name)),g=s.transformTo("string",o.utf8encode(d.name)),b=d.comment,v=s.transformTo("string",l(b)),y=s.transformTo("string",o.utf8encode(b)),w=g.length!==d.name.length,k=y.length!==b.length,x="",S="",z="",C=d.dir,E=d.date,A={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(A.crc32=e.crc32,A.compressedSize=e.compressedSize,A.uncompressedSize=e.uncompressedSize);var I=0;t&&(I|=8),m||!w&&!k||(I|=2048);var O=0,B=0;C&&(O|=16),"UNIX"===a?(B=798,O|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(d.unixPermissions,C)):(B=20,O|=function(e){return 63&(e||0)}(d.dosPermissions)),f=E.getUTCHours(),f<<=6,f|=E.getUTCMinutes(),f<<=5,f|=E.getUTCSeconds()/2,c=E.getUTCFullYear()-1980,c<<=4,c|=E.getUTCMonth()+1,c<<=5,c|=E.getUTCDate(),w&&(S=n(1,1)+n(h(_),4)+g,x+="up"+n(S.length,2)+S),k&&(z=n(1,1)+n(h(v),4)+y,x+="uc"+n(z.length,2)+z);var R="";return R+="\n\0",R+=n(I,2),R+=p.magic,R+=n(f,2),R+=n(c,2),R+=n(A.crc32,4),R+=n(A.compressedSize,4),R+=n(A.uncompressedSize,4),R+=n(_.length,2),R+=n(x.length,2),{fileRecord:u.LOCAL_FILE_HEADER+R+_+x,dirRecord:u.CENTRAL_FILE_HEADER+n(B,2)+R+n(v.length,2)+"\0\0\0\0"+n(O,4)+n(i,4)+_+x+v}}var s=e("../utils"),a=e("../stream/GenericWorker"),o=e("../utf8"),h=e("../crc32"),u=e("../signature");function l(e,t,r,n){a.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}s.inherits(l,a),l.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,a.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},l.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=i(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},l.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=i(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return u.DATA_DESCRIPTOR+n(e.crc32,4)+n(e.compressedSize,4)+n(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},l.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{"../utils":32}],19:[function(e,t,r){"use strict";var n=e("./Uint8ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,r){"use strict";var n=e("./DataReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./DataReader":18}],21:[function(e,t,r){"use strict";var n=e("./ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,r){"use strict";var n=e("../utils"),i=e("../support"),s=e("./ArrayReader"),a=e("./StringReader"),o=e("./NodeBufferReader"),h=e("./Uint8ArrayReader");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),"string"!==t||i.uint8array?"nodebuffer"===t?new o(e):i.uint8array?new h(n.transformTo("uint8array",e)):new s(n.transformTo("array",e)):new a(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../utils");function s(e){n.call(this,"ConvertWorker to "+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../crc32");function s(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then((function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()}),(function(e){t.error(e)}))}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,r){"use strict";function n(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=n},{}],29:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./ConvertWorker"),s=e("./GenericWorker"),a=e("../base64"),o=e("../support"),h=e("../external"),u=null;if(o.nodestream)try{u=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function l(e,t){return new h.Promise((function(r,i){var s=[],o=e._internalType,h=e._outputType,u=e._mimeType;e.on("data",(function(e,r){s.push(e),t&&t(r)})).on("error",(function(e){s=[],i(e)})).on("end",(function(){try{var e=function(e,t,r){switch(e){case"blob":return n.newBlob(n.transformTo("arraybuffer",t),r);case"base64":return a.encode(t);default:return n.transformTo(e,t)}}(h,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[a++]=224|r>>>12:(t[a++]=240|r>>>18,t[a++]=128|r>>>12&63),t[a++]=128|r>>>6&63),t[a++]=128|63&r);return t}(e)},r.utf8decode=function(e){return i.nodebuffer?n.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,r,i,s,a=e.length,h=new Array(2*a);for(t=r=0;t>10&1023,h[r++]=56320|1023&i)}return h.length!==r&&(h.subarray?h=h.subarray(0,r):h.length=r),n.applyFromCharCode(h)}(e=n.transformTo(i.uint8array?"uint8array":"array",e))},n.inherits(u,a),u.prototype.processChunk=function(e){var t=n.transformTo(i.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var s=t;(t=new Uint8Array(s.length+this.leftOver.length)).set(this.leftOver,0),t.set(s,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var a=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0||0===r?t:r+o[e[r]]>t?r:t}(t),h=t;a!==t.length&&(i.uint8array?(h=t.subarray(0,a),this.leftOver=t.subarray(a,t.length)):(h=t.slice(0,a),this.leftOver=t.slice(a,t.length))),this.push({data:r.utf8decode(h),meta:e.meta})},u.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=u,n.inherits(l,a),l.prototype.processChunk=function(e){this.push({data:r.utf8encode(e.data),meta:e.meta})},r.Utf8EncodeWorker=l},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,r){"use strict";var n=e("./support"),i=e("./base64"),s=e("./nodejsUtils"),a=e("./external");function o(e){return e}function h(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[a++]=224|r>>>12:(t[a++]=240|r>>>18,t[a++]=128|r>>>12&63),t[a++]=128|r>>>6&63),t[a++]=128|63&r);return t},r.buf2binstring=function(e){return h(e,e.length)},r.binstring2buf=function(e){for(var t=new n.Buf8(e.length),r=0,i=t.length;r>10&1023,u[n++]=56320|1023&i)}return h(u,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0||0===r?t:r+a[e[r]]>t?r:t}},{"./common":41}],43:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var i=65535&e,s=e>>>16&65535,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,i){var s=n,a=i+r;e^=-1;for(var o=i;o>>8^s[255&(e^t[o])];return-1^e}},{}],46:[function(e,t,r){"use strict";var n,i=e("../utils/common"),s=e("./trees"),a=e("./adler32"),o=e("./crc32"),h=e("./messages"),u=0,l=4,f=0,c=-2,d=-1,p=4,m=2,_=8,g=9,b=286,v=30,y=19,w=2*b+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=h[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(i.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){s._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,s,h,u,l,f,c,d,p=e.w_size;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=p+(p-z)){for(i.arraySet(e.window,e.window,p,p,0),e.match_start-=p,e.strstart-=p,e.block_start-=p,t=r=e.hash_size;n=e.head[--t],e.head[t]=p<=n?n-p:0,--r;);for(t=r=p;n=e.prev[--t],e.prev[t]=p<=n?n-p:0,--r;);s+=p}if(0===e.strm.avail_in)break;if(u=e.strm,l=e.window,f=e.strstart+e.lookahead,c=s,d=void 0,d=u.avail_in,c=x)for(h=e.strstart-e.insert,e.ins_h=e.window[h],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=s._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===u)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===l?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)})),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,_,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?c:(e.state.gzhead=t,f):c},r.deflate=function(e,t){var r,i,a,h;if(!e||!e.state||5>8&255),U(i,i.gzhead.time>>16&255),U(i,i.gzhead.time>>24&255),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(U(i,255&i.gzhead.extra.length),U(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=o(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(U(i,0),U(i,0),U(i,0),U(i,0),U(i,0),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,3),i.status=E);else{var d=_+(i.w_bits-8<<4)<<8;d|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(d|=32),d+=31-d%31,i.status=E,P(i,d),0!==i.strstart&&(P(i,e.adler>>>16),P(i,65535&e.adler)),e.adler=1}if(69===i.status)if(i.gzhead.extra){for(a=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>a&&(e.adler=o(e.adler,i.pending_buf,i.pending-a,a)),F(e),a=i.pending,i.pending!==i.pending_buf_size));)U(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>a&&(e.adler=o(e.adler,i.pending_buf,i.pending-a,a)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){a=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>a&&(e.adler=o(e.adler,i.pending_buf,i.pending-a,a)),F(e),a=i.pending,i.pending===i.pending_buf_size)){h=1;break}h=i.gzindexa&&(e.adler=o(e.adler,i.pending_buf,i.pending-a,a)),0===h&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){a=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>a&&(e.adler=o(e.adler,i.pending_buf,i.pending-a,a)),F(e),a=i.pending,i.pending===i.pending_buf_size)){h=1;break}h=i.gzindexa&&(e.adler=o(e.adler,i.pending_buf,i.pending-a,a)),0===h&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&F(e),i.pending+2<=i.pending_buf_size&&(U(i,255&e.adler),U(i,e.adler>>8&255),e.adler=0,i.status=E)):i.status=E),0!==i.pending){if(F(e),0===e.avail_out)return i.last_flush=-1,f}else if(0===e.avail_in&&T(t)<=T(r)&&t!==l)return R(e,-5);if(666===i.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==i.lookahead||t!==u&&666!==i.status){var p=2===i.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===u)return A;break}if(e.match_length=0,r=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===l?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(i,t):3===i.strategy?function(e,t){for(var r,n,i,a,o=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===u)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=s._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=s._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===l?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(i,t):n[i.level].func(i,t);if(p!==O&&p!==B||(i.status=666),p===A||p===O)return 0===e.avail_out&&(i.last_flush=-1),f;if(p===I&&(1===t?s._tr_align(i):5!==t&&(s._tr_stored_block(i,0,0,!1),3===t&&(D(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),F(e),0===e.avail_out))return i.last_flush=-1,f}return t!==l?f:i.wrap<=0?1:(2===i.wrap?(U(i,255&e.adler),U(i,e.adler>>8&255),U(i,e.adler>>16&255),U(i,e.adler>>24&255),U(i,255&e.total_in),U(i,e.total_in>>8&255),U(i,e.total_in>>16&255),U(i,e.total_in>>24&255)):(P(i,e.adler>>>16),P(i,65535&e.adler)),F(e),0=r.w_size&&(0===o&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),d=new i.Buf8(r.w_size),i.arraySet(d,t,p-r.w_size,r.w_size,0),t=d,p=r.w_size),h=e.avail_in,u=e.next_in,l=e.input,e.avail_in=p,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,s=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function _(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function g(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=c,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(d),t.distcode=t.distdyn=new n.Buf32(p),t.sane=1,t.back=-1,l):f}function b(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,g(e)):f}function v(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=a.wsize?(n.arraySet(a.window,t,r-a.wsize,a.wsize,0),a.wnext=0,a.whave=a.wsize):(i<(s=a.wsize-a.wnext)&&(s=i),n.arraySet(a.window,t,r-i,s,a.wnext),(i-=s)?(n.arraySet(a.window,t,r-i,i,0),a.wnext=i,a.whave=a.wsize):(a.wnext+=s,a.wnext===a.wsize&&(a.wnext=0),a.whave>>8&255,r.check=s(r.check,j,2,0),w=y=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&y)<<8)+(y>>8))%31){e.msg="incorrect header check",r.mode=30;break}if(8!=(15&y)){e.msg="unknown compression method",r.mode=30;break}if(w-=4,F=8+(15&(y>>>=4)),0===r.wbits)r.wbits=F;else if(F>r.wbits){e.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(j[0]=255&y,j[1]=y>>>8&255,r.check=s(r.check,j,2,0)),w=y=0,r.mode=3;case 3:for(;w<32;){if(0===b)break e;b--,y+=d[_++]<>>8&255,j[2]=y>>>16&255,j[3]=y>>>24&255,r.check=s(r.check,j,4,0)),w=y=0,r.mode=4;case 4:for(;w<16;){if(0===b)break e;b--,y+=d[_++]<>8),512&r.flags&&(j[0]=255&y,j[1]=y>>>8&255,r.check=s(r.check,j,2,0)),w=y=0,r.mode=5;case 5:if(1024&r.flags){for(;w<16;){if(0===b)break e;b--,y+=d[_++]<>>8&255,r.check=s(r.check,j,2,0)),w=y=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(b<(C=r.length)&&(C=b),C&&(r.head&&(F=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,d,_,C,F)),512&r.flags&&(r.check=s(r.check,d,C,_)),b-=C,_+=C,r.length-=C),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===b)break e;for(C=0;F=d[_+C++],r.head&&F&&r.length<65536&&(r.head.name+=String.fromCharCode(F)),F&&C>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;w<32;){if(0===b)break e;b--,y+=d[_++]<>>=7&w,w-=7&w,r.mode=27;break}for(;w<3;){if(0===b)break e;b--,y+=d[_++]<>>=1)){case 0:r.mode=14;break;case 1:if(S(r),r.mode=20,6!==t)break;y>>>=2,w-=2;break e;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=30}y>>>=2,w-=2;break;case 14:for(y>>>=7&w,w-=7&w;w<32;){if(0===b)break e;b--,y+=d[_++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&y,w=y=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(C=r.length){if(b>>=5,w-=5,r.ndist=1+(31&y),y>>>=5,w-=5,r.ncode=4+(15&y),y>>>=4,w-=4,286>>=3,w-=3}for(;r.have<19;)r.lens[Z[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,U={bits:r.lenbits},N=o(0,r.lens,0,19,r.lencode,0,r.work,U),r.lenbits=U.bits,N){e.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,B=65535&L,!((I=L>>>24)<=w);){if(0===b)break e;b--,y+=d[_++]<>>=I,w-=I,r.lens[r.have++]=B;else{if(16===B){for(P=I+2;w>>=I,w-=I,0===r.have){e.msg="invalid bit length repeat",r.mode=30;break}F=r.lens[r.have-1],C=3+(3&y),y>>>=2,w-=2}else if(17===B){for(P=I+3;w>>=I)),y>>>=3,w-=3}else{for(P=I+7;w>>=I)),y>>>=7,w-=7}if(r.have+C>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=30;break}for(;C--;)r.lens[r.have++]=F}}if(30===r.mode)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,U={bits:r.lenbits},N=o(h,r.lens,0,r.nlen,r.lencode,0,r.work,U),r.lenbits=U.bits,N){e.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,U={bits:r.distbits},N=o(u,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,U),r.distbits=U.bits,N){e.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=b&&258<=v){e.next_out=g,e.avail_out=v,e.next_in=_,e.avail_in=b,r.hold=y,r.bits=w,a(e,x),g=e.next_out,p=e.output,v=e.avail_out,_=e.next_in,d=e.input,b=e.avail_in,y=r.hold,w=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;O=(L=r.lencode[y&(1<>>16&255,B=65535&L,!((I=L>>>24)<=w);){if(0===b)break e;b--,y+=d[_++]<>R)])>>>16&255,B=65535&L,!(R+(I=L>>>24)<=w);){if(0===b)break e;b--,y+=d[_++]<>>=R,w-=R,r.back+=R}if(y>>>=I,w-=I,r.back+=I,r.length=B,0===O){r.mode=26;break}if(32&O){r.back=-1,r.mode=12;break}if(64&O){e.msg="invalid literal/length code",r.mode=30;break}r.extra=15&O,r.mode=22;case 22:if(r.extra){for(P=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;O=(L=r.distcode[y&(1<>>16&255,B=65535&L,!((I=L>>>24)<=w);){if(0===b)break e;b--,y+=d[_++]<>R)])>>>16&255,B=65535&L,!(R+(I=L>>>24)<=w);){if(0===b)break e;b--,y+=d[_++]<>>=R,w-=R,r.back+=R}if(y>>>=I,w-=I,r.back+=I,64&O){e.msg="invalid distance code",r.mode=30;break}r.offset=B,r.extra=15&O,r.mode=24;case 24:if(r.extra){for(P=r.extra;w>>=r.extra,w-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===v)break e;if(C=x-v,r.offset>C){if((C=r.offset-C)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=30;break}E=C>r.wnext?(C-=r.wnext,r.wsize-C):r.wnext-C,C>r.length&&(C=r.length),A=r.window}else A=p,E=g-r.offset,C=r.length;for(vb?(y=U[P+f[S]],T[D+f[S]]):(y=96,0),d=1<>I)+(p-=d)]=v<<24|y<<16|w,0!==p;);for(d=1<>=1;if(0!==d?(R&=d-1,R+=d):R=0,S++,0==--F[x]){if(x===C)break;x=t[r+f[S]]}if(E>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>m-r?(e.bi_buf|=t<>m-e.bi_valid,e.bi_valid+=r-m):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(p+1),a=0;for(n=1;n<=p;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,m=t.stat_desc.extra_base,_=t.stat_desc.max_length,g=0;for(s=0;s<=p;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return i;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return s;for(t=32;t>>3,(o=e.static_len+3+7>>>3)<=a&&(a=o)):a=o=r+5,r+4<=a&&-1!==t?J(e,t,r,n):4===e.strategy||o===a?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,g,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":41}],53:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,n){(function(e){!function(e,t){"use strict";if(!e.setImmediate){var r,n,i,s,a=1,o={},h=!1,u=e.document,l=Object.getPrototypeOf&&Object.getPrototypeOf(e);l=l&&l.setTimeout?l:e,r="[object process]"==={}.toString.call(e.process)?function(e){process.nextTick((function(){c(e)}))}:function(){if(e.postMessage&&!e.importScripts){var t=!0,r=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=r,t}}()?(s="setImmediate$"+Math.random()+"$",e.addEventListener?e.addEventListener("message",d,!1):e.attachEvent("onmessage",d),function(t){e.postMessage(s+t,"*")}):e.MessageChannel?((i=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){i.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(n=u.documentElement,function(e){var t=u.createElement("script");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,n.removeChild(t),t=null},n.appendChild(t)}):function(e){setTimeout(c,0,e)},l.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n[(0,o.Lk)("header",a,[e[9]||(e[9]=(0,o.Lk)("img",{src:r,width:"80",height:"80",alt:"",class:"view-boot__icon"},null,-1)),(0,o.Lk)("h1",n,(0,i.v_)(t.$t("ui.boot.headline")),1),(0,o.Lk)("p",c,(0,i.v_)(t.$t("ui.boot.description")),1)]),t.tasksInitialized?((0,o.uX)(),(0,o.CE)("main",u,[(0,o.Lk)("div",null,[(0,o.bF)(k,{ready:f.canShow("PhpWeb"),onResult:e[0]||(e[0]=(...t)=>f.result("PhpWeb",...t))},null,8,["ready"]),(0,o.bF)(_,{ready:f.canShow("Config"),onResult:e[1]||(e[1]=(...t)=>f.result("Config",...t))},null,8,["ready"]),(0,o.bF)($,{ready:f.canShow("PhpCli"),onResult:e[2]||(e[2]=(...t)=>f.result("PhpCli",...t))},null,8,["ready"]),t.isGranted(f.scopes.UPDATE)?((0,o.uX)(),(0,o.Wv)(S,{key:0,ready:f.canShow("SelfUpdate"),onResult:e[3]||(e[3]=(...t)=>f.result("SelfUpdate",...t))},null,8,["ready"])):(0,o.Q3)("",!0),f.isOAuth?(0,o.Q3)("",!0):((0,o.uX)(),(0,o.Wv)(C,{key:1,ready:f.canShow("Composer"),onResult:e[4]||(e[4]=(...t)=>f.result("Composer",...t))},null,8,["ready"])),f.isOAuth?(0,o.Q3)("",!0):((0,o.uX)(),(0,o.Wv)(y,{key:2,ready:f.canShow("Contao"),onResult:e[5]||(e[5]=(...t)=>f.result("Contao",...t))},null,8,["ready"]))]),e[11]||(e[11]=(0,o.Lk)("div",{class:"clearfix"},null,-1)),f.hasError?((0,o.uX)(),(0,o.CE)("div",h,[e[10]||(e[10]=(0,o.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,o.Lk)("path",{d:"M0 0h24v24H0z",fill:"none"}),(0,o.Lk)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)),(0,o.Lk)("h1",l,(0,i.v_)(t.$t("ui.boot.issue1")),1),(0,o.Lk)("p",d,(0,i.v_)(t.$t("ui.boot.issue2")),1),t.safeMode?((0,o.uX)(),(0,o.CE)("button",{key:0,onClick:e[6]||(e[6]=(...t)=>f.runSafeMode&&f.runSafeMode(...t)),class:"widget-button widget-button--warning view-boot__safeMode"},(0,i.v_)(t.$t("ui.boot.safeMode")),1)):(0,o.Q3)("",!0)])):t.safeMode?((0,o.uX)(),(0,o.CE)("div",p,[(0,o.Lk)("button",{onClick:e[7]||(e[7]=(...t)=>f.runSafeMode&&f.runSafeMode(...t)),class:"widget-button widget-button--warning view-boot__safeMode"},(0,i.v_)(t.$t("ui.boot.safeMode")),1)])):f.autoContinue?(0,o.Q3)("",!0):((0,o.uX)(),(0,o.CE)("div",b,[(0,o.Lk)("button",{onClick:e[8]||(e[8]=(...t)=>f.finish&&f.finish(...t)),class:"widget-button widget-button--primary view-boot__continue",disabled:!f.canContinue},(0,i.v_)(t.$t("ui.boot.run")),9,v)]))])):((0,o.uX)(),(0,o.CE)("main",m,[(0,o.bF)(L)]))])),_:1})}var w=s(6278),f=s(70),k=s(707),_=s(3723),$=s(728),S=s(9045);const C=["href"];function y(t,e,s,r,a,n){const c=(0,o.g2)("boot-check");return(0,o.uX)(),(0,o.Wv)(c,{progress:t.bootState,title:t.$t("ui.server.php_web.title"),description:t.bootDescription,detail:t.problem&&t.problem.detail},{default:(0,o.k6)((()=>[t.problem&&t.problem.type?((0,o.uX)(),(0,o.CE)("a",{key:0,href:t.problem.type,target:"_blank"},(0,i.v_)(t.$t("ui.server.details")),9,C)):(0,o.Q3)("",!0)])),_:1},8,["progress","title","description","detail"])}var L={props:{ready:!1,current:!1},data:()=>({booted:!1,bootState:"loading",bootDescription:""}),watch:{ready(t){t&&(this.booted=!0,this.boot())}},created(){this.bootDescription=this.$t("ui.server.pending"),this.ready&&(this.booted=!0,this.boot())}};const A={class:"boot-check"},D={key:1,class:"boot-check__icon boot-check__icon--success"},x={key:2,class:"boot-check__icon boot-check__icon--info"},E={key:3,class:"boot-check__icon boot-check__icon--warning"},X={key:4,class:"boot-check__icon boot-check__icon--error"},U={class:"boot-check__label"},O={class:"boot-check__title"},M={class:"boot-check__description"},P={key:0,class:"boot-check__detail"},j={class:"boot-check__action"};function z(t,e,s,r,a,n){const c=(0,o.g2)("loading-spinner");return(0,o.uX)(),(0,o.CE)("div",A,["loading"===s.progress?((0,o.uX)(),(0,o.Wv)(c,{key:0,class:"boot-check__icon"})):"success"===s.progress?((0,o.uX)(),(0,o.CE)("div",D,e[0]||(e[0]=[(0,o.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,o.Lk)("circle",{cx:"12",cy:"12",r:"8",fill:"#fff"}),(0,o.Lk)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"})],-1)]))):"info"===s.progress||"action"===s.progress?((0,o.uX)(),(0,o.CE)("div",x,e[1]||(e[1]=[(0,o.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,o.Lk)("circle",{cx:"12",cy:"12",r:"8",fill:"#fff"}),(0,o.Lk)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"})],-1)]))):"warning"===s.progress?((0,o.uX)(),(0,o.CE)("div",E,e[2]||(e[2]=[(0,o.Lk)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},[(0,o.Lk)("path",{d:"M5 19h15L12 5",fill:"#fff"}),(0,o.Lk)("path",{d:"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"})],-1)]))):((0,o.uX)(),(0,o.CE)("div",X,e[3]||(e[3]=[(0,o.Lk)("svg",{height:"24",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg"},[(0,o.Lk)("circle",{cx:"12",cy:"12",r:"8",fill:"#fff"}),(0,o.Lk)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"})],-1)]))),(0,o.Lk)("div",U,[(0,o.Lk)("h2",O,(0,i.v_)(s.title),1),(0,o.Lk)("p",M,[(0,o.RG)(t.$slots,"description",{},(()=>[(0,o.eW)((0,i.v_)(s.description),1)]))]),s.detail?((0,o.uX)(),(0,o.CE)("p",P,(0,i.v_)(s.detail),1)):(0,o.Q3)("",!0)]),(0,o.Lk)("div",j,[(0,o.RG)(t.$slots,"default")])])}var G={components:{LoadingSpinner:S.A},props:{title:String,description:String,detail:String,progress:{type:String,required:!0,validator:t=>-1!==["ready","loading","success","info","warning","error","action"].indexOf(t)}}},B=s(6262);const I=(0,B.A)(G,[["render",z]]);var W=I,Q={mixins:[L],components:{BootCheck:W},data:()=>({problem:{}}),methods:{async boot(){this.bootDescription=this.$t("ui.server.running");const t=await this.$store.dispatch("server/php-web/get");200===t.status?t.data.problem?(this.problem=t.data.problem,this.bootState="error",this.bootDescription=t.data.problem.title):t.data.version_id<7e4?(this.bootState="info",this.bootDescription=this.$t("ui.server.php_web.below7",t.data)):(this.bootState="success",this.bootDescription=this.$t("ui.server.php_web.success",t.data)):(this.bootState="error",this.bootDescription=this.$t("ui.server.error")),this.$emit("result",this.bootState)}}};const R=(0,B.A)(Q,[["render",y]]);var T=R;const N=["disabled"],V=["disabled"];function F(t,e,s,r,a,n){const c=(0,o.g2)("boot-check");return(0,o.uX)(),(0,o.Wv)(c,{progress:t.bootState,title:t.$t("ui.server.config.title"),description:t.bootDescription},{default:(0,o.k6)((()=>["error"===t.bootState||"action"===t.bootState?((0,o.uX)(),(0,o.CE)("button",{key:0,class:"widget-button widget-button--alert",disabled:!t.isGranted(n.scopes.INSTALL),onClick:e[0]||(e[0]=(...t)=>n.showConfiguration&&n.showConfiguration(...t))},(0,i.v_)(t.$t("ui.server.config.setup")),9,N)):"loading"!==t.bootState?((0,o.uX)(),(0,o.CE)("button",{key:1,class:"widget-button widget-button--edit",disabled:!t.isGranted(n.scopes.INSTALL),onClick:e[1]||(e[1]=(...t)=>n.showConfiguration&&n.showConfiguration(...t))},(0,i.v_)(t.$t("ui.server.config.change")),9,V)):(0,o.Q3)("",!0)])),_:1},8,["progress","title","description"])}var H={mixins:[L],components:{BootCheck:W},computed:{...(0,w.L8)("auth",["isGranted"]),scopes:()=>f.A},methods:{async boot(){this.bootDescription=this.$t("ui.server.running"),this.$store.dispatch("server/config/get").then((t=>{this.php_cli=t.php_cli,this.cloud=t.cloud.enabled,this.cloudIssues=t.cloud.issues,t.php_cli?t.cloud.enabled&&t.cloud.issues.length>0?(this.bootState="error",this.bootDescription=this.$t("ui.server.config.stateErrorCloud")):(this.bootState="success",this.bootDescription=this.$t("ui.server.config.stateSuccess",{php_cli:t.php_cli})):(this.bootState="error",this.bootDescription=this.$t("ui.server.config.stateErrorCli"))})).catch((()=>{this.bootState="error",this.bootDescription=this.$t("ui.server.error")})).then((()=>{this.$emit("result",this.bootState)}))},showConfiguration(){this.$store.commit("setView",k.A.CONFIG)}}};const q=(0,B.A)(H,[["render",F]]);var Y=q;const J=["href"];function K(t,e,s,r,a,n){const c=(0,o.g2)("boot-check");return(0,o.uX)(),(0,o.Wv)(c,{progress:t.bootState,title:t.$t("ui.server.php_cli.title"),description:t.bootDescription,detail:t.problem&&t.problem.detail},{default:(0,o.k6)((()=>[t.problem&&t.problem.type?((0,o.uX)(),(0,o.CE)("a",{key:0,href:t.problem.type,target:"_blank"},(0,i.v_)(t.$t("ui.server.details")),9,J)):(0,o.Q3)("",!0)])),_:1},8,["progress","title","description","detail"])}var Z={mixins:[L],components:{BootCheck:W},data:()=>({problem:{}}),methods:{boot(){this.bootDescription=this.$t("ui.server.running"),this.$store.dispatch("server/php-cli/get").then((t=>{t.problem?(this.problem=t.problem,this.bootState="error",this.bootDescription=t.problem.title):(this.bootState="success",this.bootDescription=this.$t("ui.server.php_cli.success",{version:t.version}))})).catch((t=>{503===t.status?(this.bootState="error",this.bootDescription=this.$t("ui.server.prerequisite")):(this.bootState="error",this.bootDescription=this.$t("ui.server.error"))})).then((()=>{this.$emit("result",this.bootState)}))}}};const tt=(0,B.A)(Z,[["render",K]]);var et=tt;function st(t,e,s,r,a,n){const c=(0,o.g2)("i18n-t"),u=(0,o.g2)("boot-check");return(0,o.uX)(),(0,o.Wv)(u,{progress:t.bootState,title:t.$t("ui.server.selfUpdate.title"),description:t.bootDescription},(0,o.eX)({default:(0,o.k6)((()=>[t.isSupported||"action"!==t.bootState?t.hasUpdate?((0,o.uX)(),(0,o.CE)("button",{key:1,class:"widget-button widget-button--alert",onClick:e[1]||(e[1]=(...t)=>n.update&&n.update(...t))},(0,i.v_)(t.$t("ui.server.selfUpdate.button")),1)):(0,o.Q3)("",!0):((0,o.uX)(),(0,o.CE)("button",{key:0,class:"widget-button widget-button--warning",onClick:e[0]||(e[0]=(...t)=>n.next&&n.next(...t))},(0,i.v_)(t.$t("ui.server.selfUpdate.continue")),1))])),_:2},[t.latestDownload?{name:"description",fn:(0,o.k6)((()=>[(0,o.bF)(c,{keypath:"ui.server.selfUpdate.manualUpdate"},{latest:(0,o.k6)((()=>[(0,o.eW)((0,i.v_)(t.latestDownload),1)])),download:(0,o.k6)((()=>e[2]||(e[2]=[(0,o.Lk)("a",{href:"https://to.contao.org/download?lang=${this.$i18n.locale}",target:"_blank",rel:"noreferrer noopener"},"https://to.contao.org/download",-1)]))),_:1})])),key:"0"}:void 0]),1032,["progress","title","description"])}var ot={mixins:[L],components:{BootCheck:W},data:()=>({hasUpdate:!1,isSupported:!0,latestDownload:null}),methods:{async boot(){let t;this.bootDescription=this.$t("ui.server.running");try{t=await this.$store.dispatch("server/self-update/get")}catch(s){return void this.emitState("error",this.$t("ui.server.error"))}const e={current:t.current_version,latest:t.latest_version};if(null!==t.latest_version)if(t.error){if("dev"===t.channel)return void this.emitState("warning",t.error);try{const s=await this.$store.dispatch("server/self-update/latest");s===t.current_version?this.emitState("success",this.$t("ui.server.selfUpdate.latest",e)):(this.latestDownload=s,this.emitState("error",this.$t("ui.server.selfUpdate.manualUpdate",{latest:s,download:`https://to.contao.org/download`})))}catch(s){this.emitState("warning",t.error)}}else if(t.current_version!==t.latest_version){if(!t.supported)return this.isSupported=!1,void this.emitState("action",this.$t("ui.server.selfUpdate.unsupported",e));if("dev"===t.channel)return this.hasUpdate=!0,void this.emitState("warning",this.$t("ui.server.selfUpdate.update",e));this.hasUpdate=!0,this.emitState("error",this.$t("ui.server.selfUpdate.update",e))}else this.emitState("success",this.$t("ui.server.selfUpdate.latest",e));else this.emitState("info",this.$t("ui.server.selfUpdate.dev"))},async update(){try{await this.$store.dispatch("tasks/execute",{name:"manager/self-update",ignoreErrors:!0})}catch(t){}setTimeout((()=>{window.location.reload(!0)}),3e3)},next(){this.bootState="info",this.$emit("result",this.bootState)},emitState(t,e){this.bootState=t,this.bootDescription=e,this.$emit("result",t)}}};const it=(0,B.A)(ot,[["render",st]]);var rt=it;function at(t,e,s,r,a,n){const c=(0,o.g2)("boot-check");return(0,o.uX)(),(0,o.Wv)(c,{progress:t.bootState,title:t.$t("ui.server.composer.title"),description:t.bootDescription},{default:(0,o.k6)((()=>["action"===t.bootState?((0,o.uX)(),(0,o.CE)("button",{key:0,onClick:e[0]||(e[0]=(...t)=>n.install&&n.install(...t)),class:"widget-button widget-button--primary widget-button--run"},(0,i.v_)(t.$t("ui.server.composer.button")),1)):(0,o.Q3)("",!0)])),_:1},8,["progress","title","description"])}var nt={mixins:[L],components:{BootCheck:W},computed:{...(0,w.aH)("tasks",{taskStatus:"status"}),...(0,w.L8)("auth",["isGranted"])},methods:{async boot(){this.bootState="loading",this.bootDescription=this.$t("ui.server.running");try{const t=await this.$store.dispatch("server/composer/get");if(t.json.found&&!t.json.valid?(this.bootState="error",this.bootDescription=t.json.error):t.json.found&&!t.vendor.found?(this.bootState="action",this.bootDescription=this.$t("ui.server.composer.install"),this.$store.commit("setSafeMode",!0)):(this.bootState="success",this.bootDescription=this.$t("ui.server.composer.success")),this.isGranted(f.A.INSTALL)){const t=await this.$store.dispatch("config/composer/get");t&&0!==t.length||await this.$store.dispatch("config/composer/writeDefaults")}}catch(t){503===t.status?(this.bootState="error",this.bootDescription=this.$t("ui.server.prerequisite")):(this.bootState="error",this.bootDescription=this.$t("ui.server.error"))}this.$emit("result",this.bootState)},async install(){await this.$store.dispatch("tasks/execute",{name:"composer/install"}),"complete"===this.taskStatus&&await this.$store.dispatch("tasks/deleteCurrent")}}};const ct=(0,B.A)(nt,[["render",at]]);var ut=ct;const ht=["disabled"],lt=["disabled"],dt=["disabled"];function pt(t,e,s,r,a,n){const c=(0,o.g2)("boot-check");return(0,o.uX)(),(0,o.Wv)(c,{progress:t.bootState,title:t.$t("ui.server.contao.title"),description:t.bootDescription},{default:(0,o.k6)((()=>["action"===t.bootState?((0,o.uX)(),(0,o.CE)("button",{key:0,class:"widget-button widget-button--primary widget-button--run",disabled:!t.isGranted(n.scopes.INSTALL),onClick:e[0]||(e[0]=(...t)=>n.setup&&n.setup(...t))},(0,i.v_)(t.$t("ui.server.contao."+(t.databaseProblem&&!t.databaseAccessProblem?"check":"setup"))),9,ht)):(0,o.Q3)("",!0),"warning"===t.bootState?((0,o.uX)(),(0,o.CE)("button",{key:1,class:"widget-button widget-button--alert",disabled:!t.isGranted(n.scopes.INSTALL),onClick:e[1]||(e[1]=(...t)=>n.setup&&n.setup(...t))},(0,i.v_)(t.$t("ui.server.contao."+(t.databaseProblem&&!t.databaseAccessProblem?"check":"setup"))),9,lt)):(0,o.Q3)("",!0),"success"===t.bootState&&t.databaseSupported?((0,o.uX)(),(0,o.CE)("button",{key:2,class:"widget-button",disabled:!t.isGranted(n.scopes.INSTALL),onClick:e[2]||(e[2]=(...t)=>n.setup&&n.setup(...t))},(0,i.v_)(t.$t("ui.server.contao.setup")),9,dt)):(0,o.Q3)("",!0)])),_:1},8,["progress","title","description"])}var bt={mixins:[L],components:{BootCheck:W},data:()=>({processing:!1}),computed:{...(0,w.aH)("server/database",{databaseSupported:"supported",databaseStatus:"status"}),...(0,w.aH)("server/adminUser",{userSupported:"supported",hasUser:"hasUser"}),...(0,w.L8)("auth",["isGranted"]),...(0,w.L8)("server/database",{databaseProblem:"hasError",databaseAccessProblem:"accessProblem"}),scopes:()=>f.A},methods:{async boot(){this.bootState="loading",this.bootDescription=this.$t("ui.server.running");const t=await this.$store.dispatch("server/contao/get",!1),e=t.data;let s=this.bootState,o=this.bootDescription;if(200===t.status?e.version?e.supported?(s="success",o=this.$t("ui.server.contao.found",{version:e.version,api:e.api.version})):(s="error",o=this.$t("ui.server.contao.old",e)):(s="action",o=this.$t("ui.server.contao.empty")):503===t.status?(s="error",o=this.$t("ui.server.prerequisite")):502===t.status?(window.localStorage.removeItem("contao_manager_booted"),this.$store.commit("setView",k.A.RECOVERY)):(s="error",o=this.$t("ui.server.error")),"success"===s&&this.isGranted(f.A.UPDATE)&&(await Promise.all([this.$store.dispatch("contao/install-tool/fetch",!1),this.$store.dispatch("server/database/get",!1)]),this.databaseSupported&&(this.databaseAccessProblem?(s="warning",o+=` ${this.$t("ui.server.contao.connectionError")}`):this.databaseProblem?(s="warning",o+=` ${this.$t("ui.server.contao.connectionProblem")}`):this.isGranted(f.A.INSTALL)&&(await this.$store.dispatch("server/adminUser/get",!1),this.userSupported&&!this.hasUser&&(s="warning",o+=` ${this.$t("ui.server.contao.missingUser")}`)))),"warning"===s)this.$store.commit("setSafeMode",!0);else if("action"===s){const t=await this.$store.dispatch("server/composer/get");t.json.found&&t.json.valid&&this.$store.commit("setSafeMode",!0)}this.bootState=s,this.bootDescription=o,this.$emit("result",this.bootState)},async setup(){this.$store.commit("setSafeMode",!1);const t=await this.$store.dispatch("server/composer/get");t.json.found?this.databaseAccessProblem?this.$store.commit("setup",3):this.databaseProblem?this.$store.commit("setView",k.A.MIGRATION):this.hasUser?this.$store.commit("setup",0):this.$store.commit("setup",null===this.hasUser?3:4):this.$store.commit("setup",0)}}};const vt=(0,B.A)(bt,[["render",pt]]);var mt=vt,gt={components:{BoxedLayout:$.A,LoadingSpinner:S.A,BootPhpWeb:T,BootConfig:Y,BootPhpCli:et,BootSelfUpdate:rt,BootComposer:ut,BootContao:mt},data:()=>({status:{}}),computed:{...(0,w.aH)(["safeMode"]),...(0,w.aH)("tasks",{tasksInitialized:"initialized"}),...(0,w.L8)("auth",["isGranted"]),scopes:()=>f.A,isOAuth:t=>t.$route.name===_.A.oauth.name,hasError:t=>-1!==Object.values(t.status).indexOf("error"),autoContinue:t=>"1"===window.localStorage.getItem("contao_manager_booted")&&-1===Object.values(t.status).indexOf("error")&&-1===Object.values(t.status).indexOf("action")&&-1===Object.values(t.status).indexOf("warning"),canContinue:t=>-1===Object.values(t.status).indexOf(null)&&-1===Object.values(t.status).indexOf("error")&&-1===Object.values(t.status).indexOf("action"),shouldContinue:t=>-1===Object.values(t.status).indexOf(null)&&-1===Object.values(t.status).indexOf("error")&&-1===Object.values(t.status).indexOf("action")&&-1===Object.values(t.status).indexOf("warning")},methods:{runSafeMode(){this.$store.commit("setSafeMode",!0),this.$store.commit("setView",k.A.READY)},finish(){window.localStorage.setItem("contao_manager_booted","1"),this.$store.commit("setSafeMode",!1),this.$store.commit("setView",k.A.READY)},result(t,e){this.status[t]=e},canShow(t){const e=Object.keys(this.status);for(let s=0;s‰PNG  IHDR(-SgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<·PLTEô}ó|ô|ó}ôzï€õ|ô|ô|ô|ô|õ}îwëvô|ô|õ|ÿ€ó|ô|ê€ô|÷€÷{ô|ô{òyô|õ{ô~ó{òyõ|ÿó{ó{ÿ€ô{ô{ô{ô}ô}ô|ô|ô|ôzô{ô|í€ô|õ{õ}ô|ô|ô|ózô|ó}ô|ÿÿÿ8mpA;tRNS/‚¤.­å»æþª ÐäPRÎ ¡ç(ýOGW&{U—xŸ¶×-·žÚ0¸¨èMhÏÍ ,s+û¥&ObKGD<§jaÏ pHYs Ø ØÇ ¹­tIMEã =z$•IDATÓc`À ™˜™YXá\6vkNN.n^Ÿ_@PˆAH˜KD, Æ%‘‘”QÒ2² rò ¦°ŒTPb`P¶VQêâR ¨k0€¬5µ´utõôAŠ’`-†@-Fj0CM†bXËÀg s˜Äa ¢æÜ`§ëˆÂ}ca©®ni…Ýã<î ².ô+%tEXtdate:create2019-08-13T09:12:00+02:00›:²¥%tEXtdate:modify2019-08-13T09:12:00+02:00êg tEXtSoftwarewww.inkscape.org›î<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚00 ¨%6  ¨Þ% h†6(0` $€ÿ{ö6|ôs|ô¨|ôÒ|ôî|ôÿ|ôÿ|ôî|ôÑ|ô§{ôr}õ5€ÿ€ö|ôˆ|ôä|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôâ}ô‡{öxð|õ’|ôø|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô÷|ô€ï{óU|ôé|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôè|óRfÿ|ó˜|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôï|ô¢{ô_}õ5zôUÿUÿzô{ö6{ô_|ô£|ôð|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|õ”€ÿtÿ {ô¸|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ{ôß|ôa€ÿ€ÿ}õb|ôá|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ{ô¶tÿ €ÿ{ô¶|ôÿ|ôÿ|ôÿ|ôÿ|ôú|õ€ÿqÿ }ó|ôú|ôÿ|ôÿ|ôÿ|ôÿ}ô´€ÿ{õ•|ôÿ|ôÿ|ôÿ|ôÿ|ôê{ó>}ó?|ôë|ôÿ|ôÿ|ôÿ|ôÿ|ô{óW|ôÿ|ôÿ|ôÿ|ôÿ|ôÔ{÷€÷ }ôÕ|ôÿ|ôÿ|ôÿ|ôÿ|óR€í|ôæ|ôÿ|ôÿ|ôÿ|ôì€ñ$€ñ$|ôì|ôÿ|ôÿ|ôÿ|ôävë |õ”|ôÿ|ôÿ|ôÿ|ôö{ö6{ö8|ô÷|ôÿ|ôÿ|ôÿ}ô{ö|ôø|ôÿ|ôÿ|ôÿ{ôr|ô§vë {ôv|ôÿ|ôÿ|ôÿ|ôö€ô}ô‡|ôÿ|ôÿ|ôÿ}ôÙ€ÿ|ôÿ|ôÚzô0€ÿ|õÜ|ôÿ|ôÿ|ôÿ|ó„Uÿ|ôä|ôÿ|ôÿ|ôÿ}õb|ôÿ|ôÿ|ô÷}õh|õe|ôÿ|ôÿ|ôÿ|ôâ€ÿ{ò:|ôÿ|ôÿ|ôÿ|ôñ€ÿ |ôÿ|ôÿ|ôÿ|ôÿ|ô§vë tÿ |õó|ôÿ|ôÿ|ôÿ{ö6|õ{|ôÿ|ôÿ|ôÿ|ô¥|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÚzô0|ô©|ôÿ|ôÿ|ôÿ|ôw}ó®|ôÿ|ôÿ|ôÿ|õc|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô÷}õh|õg|ôÿ|ôÿ|ôÿ|õ«|ôÔ|ôÿ|ôÿ|ôÿ}õ5|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô§vë {ö8|ôÿ|ôÿ|ôÿ|ôÒ|ôí|ôÿ|ôÿ|ôÿ€ò|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÚzô0€ó|ôÿ|ôÿ|ôÿ|ôë|ôú|ôÿ|ôÿ|ôÿfÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô÷}õhmÿ|ôÿ|ôÿ|ôÿ|ôø|ôù|ôÿ|ôÿ|ôÿ€ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôö}õfmÿ|ôÿ|ôÿ|ôÿ|ôø|ôí|ôÿ|ôÿ|ôÿ€ò|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÎ|ñ%€ó|ôÿ|ôÿ|ôÿ|ôë|ôÔ|ôÿ|ôÿ|ôÿ}õ5|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|õ–€ÿ{ö8|ôÿ|ôÿ|ôÿ|ôÒ}ó®|ôÿ|ôÿ|ôÿ|õc|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôñ{óW|õg|ôÿ|ôÿ|ôÿ|õ«|õ{|ôÿ|ôÿ|ôÿ|ô¥|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÎ|ñ%|ô©|ôÿ|ôÿ|ôÿ|ôw{ò:|ôÿ|ôÿ|ôÿ|ôñ€ÿ |ôÿ|ôÿ|ôÿ|ôÿ|õ–€ÿtÿ |õó|ôÿ|ôÿ|ôÿ{ö6Uÿ|ôä|ôÿ|ôÿ|ôÿ}õf|ôÿ|ôÿ|ôñ{óW|õe|ôÿ|ôÿ|ôÿ|ôâ€ÿ}ô‡|ôÿ|ôÿ|ôÿ|ôå€ÿ |ôÿ|ôÎ|ñ%€ÿ|õÜ|ôÿ|ôÿ|ôÿ|ó„{ö|ôú|ôÿ|ôÿ|ôÿ{õz|õ–€ÿ{ôv|ôÿ|ôÿ|ôÿ|ôø€õ|ôœ|ôÿ|ôÿ|ôÿ|ôö{ö6{ö8|ô÷|ôÿ|ôÿ|ôÿ{ó—€õ|ôñ|ôÿ|ôÿ|ôÿ|ôâ€ôzõ|ôã|ôÿ|ôÿ|ôÿ|ôí€ó{óW|ôÿ|ôÿ|ôÿ|ôÿ|ôÓ{ö€÷|ôÔ|ôÿ|ôÿ|ôÿ|ôÿ|óR{õ•|ôÿ|ôÿ|ôÿ|ôÿ|ôæ}õ5}ö7|ôç|ôÿ|ôÿ|ôÿ|ôÿ|ô€ÿ{ô¶|ôÿ|ôÿ|ôÿ|ôÿ|ôõ{ôvqÿ €ÿ{ôp|ôö|ôÿ|ôÿ|ôÿ|ôÿ}ô´€ÿtÿ {ô¸|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôâ}õb€ÿ€ÿ{ô_|ôÖ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ{ô¶tÿ fÿ|ó˜|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôï|ô¢{ô_}õ5zôxðxðzô{ö6{ô_|ô£|ôð|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|õ”€ÿ{óU|ôé|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôè|óRxð|õ’|ôø|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô÷|ô€ï€ö|ôˆ|ôä|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôâ}ô‡{ö€ÿ{ö6|ôs|ô¨|ôÒ|ôî|ôî|ôî|ôî|ôÑ|ô§{ôr}õ5€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿü?ÿÿøÿÿàðÿÿÀþÿÿÿÿÿÿÿÿÀÿÿÿÿàÿþÿÿðüÿÿø?ü?÷ÿü?ø?óÿüøñÿþøðþøð?þðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿðÿøð?þøðþøñÿþø?óÿüü?÷ÿü?üÿÿø?þÿÿðÿÿÿàÿÿÿÿÀÿÿÿÿÿÿÀþÿÿàðÿÿøÿÿü?ÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ €ê yò({ó>{ó>yò(€ê |ñ%|ó€|ôË|ôþ|ôÿ|ôÿ|ôÿ|ôÿ|ôý|ôÊ|ó€€ñ$yò}ô‘|ôú|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôù}ô€ñ{ö8|ôå|ôÿ|ôÿ|ôÿ|ôñ|õ«{õ|{ô]{ô]|õ}}õ¬|ôò|ôÿ|ôÿ|ôÿ|ôä}õ5}óV|ôø|ôÿ|ôÿ|ôà}ô\€ÿmÿ}ô^|ôâ|ôÿ|ôÿ|ô÷|óT}ö9|ôø|ôÿ|ôÿ{ó—€ÿqÿ {ó›|ôÿ|ôÿ|ô÷{ö6yó|ôæ|ôÿ|ôÿ{ôp{ôt|ôÿ|ôÿ|ôä€ñ|ôŒ|ôÿ|ôÿ|ô |ô¢|ôÿ|ôÿ|ôˆ|÷!|ôù|ôÿ|ôÞmÿ}ó…zô0€ÿ|ôà|ôÿ|ôø{÷|ó€|ôÿ|ôÿ}ôZ}õª|ô÷}õh{ô]|ôÿ|ôÿ|õ}|ôÎ|ôÿ|ôñ€ÿ}õª|ôÿ|ôÿ}ô‘€ÿ€ÿ|õó|ôÿ|ôË€ò|ôÿ|ôÿ|ô¦}õª|ôÿ|ôÿ|ôÿ|ôÚzô0|ô©|ôÿ|ôþ€ñ}ô/|ôÿ|ôÿ|õ{}õª|ôÿ|ôÿ|ôÿ|ôÿ|ôô{ô]|õ}|ôÿ|ôÿ}ô-zõI|ôÿ|ôÿ}ô`}õª|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô§vë }õb|ôÿ|ôÿ|ôHzõI|ôÿ|ôÿ|ôa}õª|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ô¢tÿ }õb|ôÿ|ôÿ|ôHzô0|ôÿ|ôÿ{õz}õª|ôÿ|ôÿ|ôÿ|ôÿ|ôö}õf{õ||ôÿ|ôÿzô.€ò|ôÿ|ôÿ|ô¦}õª|ôÿ|ôÿ|ôÿ|ôÎ|ñ%|ô©|ôÿ|ôþ€ñ|ôÓ|ôÿ|ôí€ÿ}õª|ôÿ|ôÿ|ô¢tÿ fÿ|ôî|ôÿ|ôÐ|ó€|ôÿ|ôÿ}ôZ}õª|ôñ{óW{ô]|ôÿ|ôÿ|õ}|÷!|ôù|ôÿ|ôÞmÿ{õz|ñ%€ÿ|ôà|ôÿ|ôø{÷|õ–|ôÿ|ôÿ|ôŽ|õ’|ôÿ|ôÿ|õ’yó|ôæ|ôÿ|ôÿ{ôp{ôt|ôÿ|ôÿ|ôä€ñ}ö9|ôø|ôÿ|ôÿ{ó—€ÿqÿ {ó›|ôÿ|ôÿ|ô÷{ö6}óV|ôø|ôÿ|ôÿ|ôà}ô\€ÿmÿ}ô^|ôâ|ôÿ|ôÿ|ô÷|óT{ö8|ôå|ôÿ|ôÿ|ôÿ|ôñ|õ«{õ|{ô]{ô]|õ}}õ¬|ôò|ôÿ|ôÿ|ôÿ|ôä}õ5yò}ô‘|ôú|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôù}ô€ñ|ñ%|ó€|ôË|ôþ|ôÿ|ôÿ|ôÿ|ôÿ|ôý|ôÊ|ó€€ñ$€ê yò({ó>{ó>yò(€ê ÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿ€ÿÿÀÿþøü?ü?øÿÿðÿÿñûÿãùÿÏãøÇãø?Ççøççøççøççøçãø?ÇãøÇãùÿÏñÿÿðÿÿøÿÿü?ü?þøÿÀÿÿ€ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿ(  zó,|ôs{ôŸ{ôŸ|ôs}ó+€ê |ô |ôþ|ôå|ô»|ô»|ôæ|ôþ|ôž€ê vë |ôÏ|ôä|õP€ÿ€ÿ|óR|ôæ|ôÍ€ê |ô¡|ôæ€÷{÷|ôç{ôyò(|ôý{õO{õM}õh|óR|ôýyò&|õ{|ôçÿ{óU|ôÿ|ô¨€í€ÿ|ôè{ôx{ôŸ{ô¶{óU|ôÿ|ôÿ|ôÚzô0{ô¸|ôž{ôŸ{ô¶{óU|ôÿ|ôÿ}ô×}ô-|ô·|ôž|õ{|ôäÿ{óU|ôÿ{ó—€ÿ€ÿ|ôæ{ôxyò(|ôý{õO~ôG{óW|óR|ôýyò&|ô¡|ôæ€÷{÷|ôç{ôvë |ôÐ|ôä|õP€ÿ€ÿ|óR|ôæ|ôÎ€ê €ï|õ­|ôÿ|ôå|ô»|ô»|ôæ|ôþ}õªwî}ô/|ó‚|ô¤|ô¤}ózô.ÿÿþðççÏóßûÞ{ž9ž9Þ{ßûÏóççðü?ÿÿ‰PNG  IHDR D¤ŠÆgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEê€òyó{ñ|ó|ô|ô|ô|ô|ñ€òyô}ô|ô|ô}ñ€ö{ô|ô|õ|õ{ô{õ|õ}ô|ô|õ}ó}ô|ô|ô}ÿ€ÿmô}ô|ô|ó|ö}ó{ÿ€ÿqó{ö{óyô|ô{ô{õ|ô|õ|÷|ô|õ{÷{ô}õ}ó{ô|ô|ÿ€ô|ÿtÿfô|ô|ò€ô|ô|ô|ôzô|õ}ôzõzô|õ}ô|ô}ô|ëvô}õ|ô|ô}ô|õ|õ}ó}ô|ô|ô|ô|ÿÿÿÕkb\tRNS (>%€ËþýÊ$‘úù8åñ«|]}¬òä5Vøà\^â÷T9— ›6æpt–Ž’!ÞzZªWÓí¢ îЦΩ0öf.IabH`§ /{ô-Úóh…Œ ˆ5É®bKGD]ß0 pHYs¯¯cæŽÃtIMEã J}…$IDAT8Ë­“gSÂ@†C X ’Ø@PÔØÅŽcï]Ÿÿÿ;¼I¹£q÷Ó»÷>s»³·§(ÿ‰d*•L|ç¦ÕLmíjG„Ý™ëBF¾»'ì÷ö‰óBQÓôA!‡†ƒþH Ê£;©ŽCmÂïO ÊðòéAÌzùÜ<,¯\U¼>–`9ÜTê®^ɳZµT#-£LiÍÑ*¬Ûj£°) tGn±½ãÐÜuN÷ö9°Õ!) å–9&k·iBÃprj'E8³Ä9\ø·Ì%\¹Àu¸¹ wpï4;Ñá1ªÉ'3ܤҢP‘@Î}ã™Ì×AÕ^¢åúÕ”¾Ôʼ‡« ¿îØ…‰_¹ø¥_{%öãXñó×ûc|M.Q_G#ñ%tEXtdate:create2019-08-13T09:12:01+02:00=M¹%tEXtdate:modify2019-08-13T09:12:01+02:00L­tEXtSoftwarewww.inkscape.org›î<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚‰PNG  IHDR(-SgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<·PLTEÙQAÜPAÛOAÞNCßP@ÜPAÛPAÜPAÜPAÛPAÛQBÝUDÚQAÛQAÜP@ÿ€€ÚQAÛPAÛPAÝMDÞRBÛOAÛPAÝO>ÛQAÙM@ÜQBÛMAÚPBÿÛQAÛQBÚOBÛPAÜPBÛP@ÛPBÛOAÛQAÚQAÜPBÛPAÜQ@ÚP@ÜQ@ÛPAÙS@ÛPAÝQCÛPAØN;ÛPAÛPBÕU@ÛQAÜQ@ÜOBÜP@ÛPAÿÿÿ>Ëi;tRNS/‚¤.­å»æþ«ÑäPRЬç¨-Oe+|bxayŸ¶p·žnm¸{`_è(ý&¢ ÏÎ ¡,tsnÜŒ€bKGD<§jaÏ pHYs Ø ØÇ ¹­tIMEã ;éßbIDATÓmÉ‚0 E#8ЪXP±ZgQ‡þÿ™R Yäws2ÔFÃ0M£YÚV[v,‹Ðnïïûö€0‡ 5‘±®LÜ©’™œƒçø84@°°CXJÎå Y#L‘”Ê6.ÀŽÒ=ÊA£ÂIµœ]8‚kR MnjͽZçš>ŠÃž™®¤/šŸ.²ò›÷GˆoPÿø4Í V×|úÔ%tEXtdate:create2019-08-13T08:08:59+02:00Mxož%tEXtdate:modify2019-08-13T08:08:59+02:00<%×"tEXtSoftwarewww.inkscape.org›î<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚00 ¨%6  ¨Þ% h†6(0` $€€ÿBPÙ6BOÜtAPÛ¨BPÛÒAPÛîAPÛÿAPÛÿAPÛîAQÚÑAPÛ¨@PÜsCRÝ5€€ÿ@RÛAP܉AQÛäAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛãBQÛˆBLÙGUÕAOÛ”APÛøAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛøAOÜ‘AQÛ?APÛëAPÛÿAPÛÿAPÛÿAPÛÿAPÚ’@QÜXAPÛÿAPÛÿAPÛÿAPÛÿAQÛÔBRÞ@P× APÛÕAPÛÿAPÛÿAPÛÿAPÛÿ@OÛTIIÛAPÜæAPÛÿAPÛÿAPÛÿAPÛì@NÜ$@NÜ$APÛìAPÛÿAPÛÿAPÛÿAPÛå;NØ APÛ•APÛÿAPÛÿAPÛÿAPÛöBPÙ6@RÛ8AOÛ÷APÛÿAPÛÿAPÛÿBPÜ@RÛAPÛøAPÛÿAPÛÿAPÛÿAQÛrAPÚvAPÛÿAPÛÿAPÛÿAOÛ÷=RÖBQÛˆAPÛÿAPÛÿAPÛÿAPÛÙ@@¿3fÌAPÛ¬@PÛ\@PÛ\BQÛ«3fÌUUÕAPÛÜAPÛÿAPÛÿAPÛÿAQÛ…UUÿAPÛåAPÛÿAPÛÿAPÛÿAQÛb@@¿APÛ¬APÛÿAPÛü@PÛ\@PÛ\APÛüAPÛÿBQÛ«@@¿BQÜeAPÛÿAPÛÿAPÛÿAPÛ ÿBOÜ:APÛÿAPÛÿAPÛÿAPÛñMMæ APÛ¥APÛÿAPÛÿAPÛÿAPÛü@QÛ[@QÛ[APÛüAPÛÿAPÛÿAPÛÿAOÛ¤FFÑ APÛóAPÛÿAPÛÿAPÛÿBPÙ6@QÜ{APÛÿAPÛÿAPÛÿAPÛ¥@QÜXAPÛûAPÛÿAPÛÿAPÛÿAPÛüAOÚZAOÚZAPÛüAPÛÿAPÛÿAPÛÿAPÛû@OÜWAPÛ©APÛÿAPÛÿAPÛÿ@OÛw@QÚ®APÛÿAPÛÿAPÛÿ@PÛcAPÛVAPÛûAPÛÿAPÛÿAPÛÿAPÛüBPÚYBPÚYAPÛüAPÛÿAPÛÿAPÛÿAPÛûBQÛU@OÚgAPÛÿAPÛÿAPÛÿBQÛ«AQÛÔAPÛÿAPÛÿAPÛÿCRÝ5@OÛTAPÛúAPÛÿAPÛÿAPÛÿAPÛüAPÛüAPÛÿAPÛÿAPÛÿAPÛúAPÚS@RÛ8APÛÿAPÛÿAPÛÿBPÛÒAPÛíAPÛÿAPÛÿAPÛÿ@MÙAQÚRAPÛúAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛúBOÜQFQÜAPÛÿAPÛÿAPÛÿAPÛëAPÛúAPÛÿAPÛÿAPÛÿ3fÌ@PÜPAPÛùAPÛÿAPÛÿAPÛÿAPÛÿAPÛù@PÜPIIÛAPÛÿAPÛÿAPÛÿAPÛøAPÛùAPÛÿAPÛÿAPÛÿUUÕAPÚSAPÛúAPÛÿAPÛÿAPÛÿAPÛÿAPÛúAPÚSIIÛAPÛÿAPÛÿAPÛÿAPÛøAPÛíAPÛÿAPÛÿAPÛÿ@MÙ@PÛ\APÛüAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛü@PÛ\FQÜAPÛÿAPÛÿAPÛÿAPÛëAQÛÔAPÛÿAPÛÿAPÛÿCRÝ5@QÛ[APÛüAPÛÿAPÛÿAPÛÿAPÛûAPÛüAPÛÿAPÛÿAPÛÿAPÛü@QÛ[@RÛ8APÛÿAPÛÿAPÛÿBPÛÒ@QÚ®APÛÿAPÛÿAPÛÿ@PÛcAOÚZAPÛüAPÛÿAPÛÿAPÛÿAPÛû@OÜW@QÜXAPÛûAPÛÿAPÛÿAPÛÿAPÛüAOÚZ@OÚgAPÛÿAPÛÿAPÛÿBQÛ«@QÜ{APÛÿAPÛÿAPÛÿAPÛ¥BPÚYAPÛüAPÛÿAPÛÿAPÛÿAPÛûBQÛUAPÛVAPÛûAPÛÿAPÛÿAPÛÿAPÛüBPÚYAPÛ©APÛÿAPÛÿAPÛÿ@OÛwBOÜ:APÛÿAPÛÿAPÛÿAPÛñMMæ BPÛ£APÛÿAPÛÿAPÛÿAPÛúAPÚS@OÛTAPÛúAPÛÿAPÛÿAPÛÿAPÛ¢FFÑ APÛóAPÛÿAPÛÿAPÛÿBPÙ6UUÿAPÛåAPÛÿAPÛÿAPÛÿAPÜfUUÿAPÛ¥APÛÿAPÛúBOÜQAQÚRAPÛúAPÛÿAOÛ¤UUÿBQÜeAPÛÿAPÛÿAPÛÿAPÛ ÿBQÛˆAPÛÿAPÛÿAPÛÿAPÛåMMæ UUÿAPÛ@PÜP@PÜPAPÛUUÿUUÕAPÛÜAPÛÿAPÛÿAPÛÿAQÛ…>OÜAPÛúAPÛÿAPÛÿAPÛÿAOÛzAPÚvAPÛÿAPÛÿAPÛÿAPÛùBLÙAPÛAPÛÿAPÛÿAPÛÿAPÛöBPÙ6@RÛ8AOÛ÷APÛÿAPÛÿAPÛÿAPÚ™BLÙAPÛñAPÛÿAPÛÿAPÛÿAPÛâ@Uß=RÖAPÛãAPÛÿAPÛÿAPÛÿAPÛîCNÞAOÚZAPÛÿAPÛÿAPÛÿAPÛÿAPÛÓ>OÜDMÝAQÛÔAPÛÿAPÛÿAPÛÿAPÛÿAPÛVAQÛ¡APÛÿAPÛÿAPÛÿAPÛÿAPÜæCRÝ5AOÚ7AOÛçAPÛÿAPÛÿAPÛÿAPÛÿAPÛIIÛAPÛ½APÛÿAPÛÿAPÛÿAPÛÿAPÛõAPÚv9Uã @@¿BPÛpAPÛöAPÛÿAPÛÿAPÛÿAPÛÿ@PÛºUUÕ@UÕ @PÛºAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛâAQÛb@`ß@`ß@QÜ_BPÛÖAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAOÛ·@UÕ UUÕAPÚ™APÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛïAPÛ¢@QÜ_CRÝ5CNÞBNÚ>@SÙ(@UÕ >SÝ%AOÛAPÛÌAPÛþAPÛÿAPÛÿAPÛÿAPÛÿAPÛþAPÛËBPÛ€@NÜ$@MÙAPÚ’APÛúAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛúBPÜCQ×@RÛ8APÜæAPÛÿAPÛÿAPÛÿAPÛñBQÛ«BPÚ|BPÛ]BPÛ]APÚ}APÛ¬APÛòAPÛÿAPÛÿAPÛÿAPÛåAOÚ7@OÜWAPÛøAPÛÿAPÛÿAPÛà@PÛ\UUÕIIÛAOÜ^APÛâAPÛÿAPÛÿAOÛ÷APÛVCQÛ9APÛøAPÛÿAPÛÿ@OÜ—@`ß9Uã BQÛ›APÛÿAPÛÿAOÛ÷AOÚ7=UÛAOÛçAPÛÿAPÛÿBPÛpBOÜtAPÛÿAPÛÿAPÛåCQ×APÛAPÛÿAPÛÿAPÚ APÛ¢APÛÿAPÛÿAP܉>MØ!APÛùAPÛÿAPÛÞIIÛCNÞCNÞ@`ßAPÛàAPÛÿAPÛøBRÞBPÛ€APÛÿAPÛÿAOÚZAOÝJAPÛõAOÜ^@QÜ_APÛõBPÜIBPÛ]APÛÿAPÛÿAPÚ}APÛÐAPÛÿAPÛï3fÌ@RÛAOÛ÷APÛÿAPÛýAQÛbAQÛbAPÛýAPÛÿAPÛö@RÛIIÛAPÛñAPÛÿAPÛÍ@MÙAPÛÿAPÛÿAPܦ@OÛdAPÛýAPÛÿAPÛýBQÜeAPÜfAPÛýAPÛÿAPÛý@OÛdAPÛ©APÛÿAPÛþGUÕ@PÚ0APÛÿAPÛÿAOÛzBOÚaAPÛýAPÛÿAPÛþAPÛþAPÛÿAPÛý@PÚ`BPÚ|APÛÿAPÛÿCNÞ.BPÜIAPÛÿAPÛÿ@PÚ`BPÛ]APÛüAPÛÿAPÛÿAPÛüBPÛ]AQÛbAPÛÿAPÛÿ@QÜHBPÜIAPÛÿAPÛÿBOÚaBOÚaAPÛýAPÛÿAPÛÿAPÛýBOÚaAQÛbAPÛÿAPÛÿ@QÜHAQÙ/APÛÿAPÛÿ@QÜ{BPÛiAPÛþAPÛÿAPÛþAPÛþAPÛÿAPÛþBPÛiAPÚ}APÛÿAPÛÿ>OÝ-@MÙAPÛÿAPÛÿAPܦBQÚhAPÛþAPÛÿAPÛýBQÜeAPÜfAPÛýAPÛÿAPÛþBQÚhAPÛ©APÛÿAPÛþGUÕAPÛÐAPÛÿAPÛï3fÌ@RÛAOÛ÷APÛÿAPÛýAQÛbAQÛbAPÛýAPÛÿAOÛ÷@RÛIIÛAPÛñAPÛÿAPÛÍBPÛ€APÛÿAPÛÿAOÚZAOÝJAPÛõAOÜ^@QÜ_APÛõBPÜIBPÛ]APÛÿAPÛÿAPÚ}>MØ!APÛùAPÛÿAPÛÞIIÛCNÞCNÞ@`ßAPÛàAPÛÿAPÛøBRÞAPÛ–APÛÿAPÛÿAQÛŽAPÚ’APÛÿAPÛÿAPÚ’=UÛAOÛçAPÛÿAPÛÿBPÛpBOÜtAPÛÿAPÛÿAPÛåCQ×CQÛ9APÛøAPÛÿAPÛÿ@OÜ—@`ß9Uã BQÛ›APÛÿAPÛÿAOÛ÷AOÚ7@OÜWAPÛøAPÛÿAPÛÿAPÛà@PÛ\UUÕIIÛAOÜ^APÛâAPÛÿAPÛÿAOÛ÷APÛV@RÛ8APÜæAPÛÿAPÛÿAPÛÿAPÛñBQÛ«BPÚ|BPÛ]BPÛ]APÚ}APÛ¬APÛòAPÛÿAPÛÿAPÛÿAPÛåAOÚ7@MÙAPÚ’APÛúAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛÿAPÛúBPÜCQ×>SÝ%AOÛAPÛÌAPÛþAPÛÿAPÛÿAPÛÿAPÛÿAPÛþAPÛËBPÛ€@NÜ$@UÕ @SÙ(BNÚ>BNÚ>@SÙ(@UÕ ÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿ€ÿÿÀÿþøü?ü?øÿÿðÿÿñÿÿã÷ïÏããÇÇãñÇçøççü?ççü?ççøçãñÇããÇÇã÷ïÏñÿÿðÿÿøÿÿü?ü?þøÿÀÿÿ€ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿ(  @QÜ,BOÜtBPÜŸBPÜŸ@PÜsAMÛ+;NØ AQÛ¡APÛþAPÛåAPÜ»APÜ»APÜæAPÛþBPÜŸ@UÕ ;NØ APÛÏAQÛä@PÜP€€ÿ€€ÿAQÚRAPÜæBPÛÎ@UÕ APÛ¢APÜæDMÝBRÞAOÛçAQÛž@SÙ(APÛýAQÛO@MÙBQÜeBQÜe@MÙAQÚRAPÛýCQÝ&@QÜ{AOÛçÿ@PÚ`APÛÿBQÛxBQÛxAPÛÿ@QÜ_€€ÿAPÛèBQÛxBPÜŸ@PÛ¶AQÚnAPÛþAPÛþBPÜmAPÛ¸AQÛžBPÜŸ@PÛ¶BPÛpAPÛÿAPÛÿBPÛpAOÛ·AQÛžBPÚ|AQÛäÿAQÛbAPÛÿBQÛxBQÛxAPÛÿBOÚa€€ÿAPÜæAPÛy>OÝ-APÛÿAQÛO@MÙBQÜeBQÜe@MÙAQÚRAPÛþAMÛ+APÛ¬APÜæDMÝBRÞAOÛçAPÛ¨@PßAQÚÑAQÛä@PÜP€€ÿ€€ÿAQÚRAPÜæAPÛÐDUÝ@PßAPÜ­APÛÿAPÛåAPÜ»APÜ»APÜæAPÛþBQÛ«DUÝAQÙ/APÜ‚AOÛ¤AOÛ¤APÜ‚CNÞ.ÿÿþðççÏóßûÝ»žyžyÝ»ßûÏóççðü?ÿÿ‰PNG  IHDR D¤ŠÆgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<PLTEÕU@ÙS@ÚNBÝS>ÛOAÛPAÛPAÛPAÛPBÜN@ÙM@ÚPAÛPAÜPB×QCÛR@ÜPAÛPAÛQBÚPBÛPBÚPAÛPAÛPAÛPAÚOAÜO@ÛPAÛPAÛP@ÕUUÛIIÜOAÛPAÛOAÛPAÛQCÜO@ß`@ãU9ÛQBÛU=ÛOAÛPBÜOBÛPAÛQAØM>ÛPAÛPAÞNCÞRBÚOAÝOAÛPAÜQ@ÜPBÛPAÛPAÌf3ÛR@ÛPAÛQAÛPAÜPAÚQBÜQBÜPAÛPAÕUGÙQAÜQ@ÛPBÝO>ÚOBÜQ@ÚP@ÛPAÚP@ÛOAÞNCÛO@ÛPAÛPAÚPAÛPAÜPAÛPAÿÿÿÆæÂXtRNS (>%ÌþË€$’ú8æñ«|]}¬òå7Wøà\^â÷V9— ›çpt–Ž!ùÞZJõ_IÐïýbͦhef©/{i-aH`ü0z.dö ¢‰ÅêµbKGDYš²ô pHYs¯¯cæŽÃtIMEã  AϺa0IDAT8Ë­“‡R1†P#zXà ¢bä+¢¨Ø¾÷s…rg‰ã¸“™ý7û϶l ã%Å¢‘ï¼=½}%¢?>ð…{ÐLЖÄÐpØ?2ªî“c)ËJO(89ôOg ;3ë¹üæ»ý Ê¿XìØKËŠÑceÖ‚!×U–N°.ʳ…·¶ÙÉ9`׳]UÌ’Ùó qØwôA)ï¨ÃRÙQ¤}ÂÇ'JU HÛ0lI¡âô’äÔœ¹ *çQuÍKÄ• ®áÆ£ÖBšg¥áÖe¨ûÉêd˰á®E¸÷ï¬4¬0áÛT éÓSð,²)½"e3Xäç6Ÿƒmꥵñ¯áÇzƒ÷ß?·vaô+§_ZýÚÚãÊÏ_ïòŽßPCÉÅZ›%tEXtdate:create2019-08-13T08:09:00+02:00ÂO%tEXtdate:modify2019-08-13T08:09:00+02:00Ÿ÷«tEXtSoftwarewww.inkscape.org›î<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚‰PNG  IHDR(-SgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<ÆPLTE1¨L1§K2¦K1¦K2¦N0ŸP1§K1¦K1¦K1¦K1¦K1¦K3ªD1¦J1¦K0¦M€€2¥K1¦K1¦L5§O3ªM1¦K1¥J3¤J1§K1¤I3¦M/¦M1§Jÿ1¦K1¥L0¦L0¦J3§J0¦K$¶I1§K+ªU1¦K1¦K2§K1¦M1¦K2¦K0¥J1¦K'N2¦K1¦K0¦K1¦J3¦M1¦J/¨J1¥L1¦K2¦L1¦J.¨K0§K1¦K1¦Kÿÿÿœ·wô@tRNS/‚¤.­å»æþ«ÑäPRЬç¨-N*<+|è¶yž7©Ä ¸Ÿ?ô´0Æ {ýÈx(À&¢ÏΡ,tsóú[ëbKGDA‰ÞlN pHYs Ø ØÇ ¹­tIMEã ã¡}_£IDATÓmÙ‚0 D£(B«bq_°.`q©¸ïÿÿUªøB^&ssN&È­BQÓJåÌê•·aš„Vk__· €ÙFS‘i«I§ÛK¤OÊG6uPÇ–«¼ç32Á†û0ÍÑ/—„Ñj½ñ¶ ävÄEï1yÇ—F'[;>'Û.ÿXžª¼þ»j"ï4=]Ù7§/'ÿñ,{ ‘ž› à%tEXtdate:create2019-08-13T08:05:08+02:00Váþ%tEXtdate:modify2019-08-13T08:05:08+02:00'LYBtEXtSoftwarewww.inkscape.org›î<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚00 ¨%6  ¨Þ% h†6(0` $€€L¥/6K¦1sJ¥1¨K¦1ÒK¦1îK¦1ÿK¦1ÿK¦1îJ¦1ÑJ¥1¨K¦1sM¤05€€I¤.J¦0‰K¦1äK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ãL¦1‡Lª/K¥-K§1“K¦1øK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1øL¥1‘PŸ0J¦2VK¦1êK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1èJ¦1S3™3K§0™K¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ïL¥1¢L¥1^M¤05N¦,UªUUªUN¦,L¥/6K¦0_K¦0£K¦1ðK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦2•3™3Uª+ J¥2¹K¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1æK¥1c@Ÿ@@Ÿ@L¦2aK¦1àK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1·F¢. 3™3K¦1·K¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ùL¥1ƒUª+ @Ÿ@L¥2€K¦1úK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦2´@¿@K§1–K¦1ÿK¦1ÿK¦1ÿK¦1ÿL¦1éK§2=J¥1>K¦1êK¦1ÿK¦1ÿK¦1ÿK¦1ÿL¥1‘L§2WK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦2ÓMª3J¥1K¦1ÔK¦1ÿK¦1ÿK¦1ÿK¦1ÿJ¦1SI¤7K¦1æK¦1ÿK¦1ÿK¦1ÿK¦1ìI¨3#N£2$K¦1ìK¦1ÿK¦1ÿK¦1ÿK¦1åN' L¥0”K¦1ÿK¦1ÿK¦1ÿK¦1öM¤05I¤28K¦1÷K¦1ÿK¦1ÿK¦1ÿJ¦2Lª/K¦1øK¦1ÿK¦1ÿK¦1ÿJ§2qK§1ˆK§1ˆL¦2vK¦1ÿK¦1ÿK¦1ÿK¦1÷G£3L¦1‡K¦1ÿK¦1ÿK¦1ÿL¦2Ø@¿@K§1ˆK¦1ÿK¦1ÿK§1ˆUª+K¦1ÜK¦1ÿK¦1ÿK¦1ÿK§2…UªUK¦1äK¦1ÿK¦1ÿK¦1ÿK§1bK§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆL§0eK¦1ÿK¦1ÿK¦1ÿJ¦1 K§0:K¦1ÿK¦1ÿK¦1ÿK¦1ñM³3 K§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆF¢. K¦1óK¦1ÿK¦1ÿK¦1ÿL¥/6K¦2{K¦1ÿK¦1ÿK¦1ÿL¥1¥K§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆK¦0©K¦1ÿK¦1ÿK¦1ÿK¥1wK¦0®K¦1ÿK¦1ÿK¦1ÿK¥1cK§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1îK¦1îK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆJ¦2gK¦1ÿK¦1ÿK¦1ÿK¦1«K¦1ÔK¦1ÿK¦1ÿK¦1ÿM¤05K§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1îK¥23K¥23K¦1îK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆI¤28K¦1ÿK¦1ÿK¦1ÿK¦1ÒK¦1íK¦1ÿK¦1ÿK¦1ÿM¦3K§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1îK¥23J§14K¦1îK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆF¢.K¦1ÿK¦1ÿK¦1ÿK¦1ëK¦1úK¦1ÿK¦1ÿK¦1ÿ3™3K§1ˆK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ïJ§14J§14K¦1ïK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆI¶$K¦1ÿK¦1ÿK¦1ÿK¦1øK¦1ùK¦1ÿK¦1ÿK¦1ÿUª+K§1‚K¦1ÿK¦1ÿK¦1ÿK¦1ôM¦1?M¦1?K¦1ôK¦1ÿK¦1ÿK¦1ÿK¦1ÿL¥2€I¶$K¦1ÿK¦1ÿK¦1ÿK¦1øK¦1íK¦1ÿK¦1ÿK¦1ÿM¦3K¦1~K¦1ÿK¦1ïM¤05M¤05K¦1ïK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆF¢.K¦1ÿK¦1ÿK¦1ÿK¦1ëK¦1ÔK¦1ÿK¦1ÿK¦1ÿM¤05L¦0yL¥/6M¤05K¦1ïK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆI¤28K¦1ÿK¦1ÿK¦1ÿK¦1ÒK¦0®K¦1ÿK¦1ÿK¦1ÿK¥1cM¤05K¦1ïK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆJ¦2gK¦1ÿK¦1ÿK¦1ÿK¦1«K¦2{K¦1ÿK¦1ÿK¦1ÿL¥1¥L¥/6K¦1ïK¦1ÿK¦1ÿK¦1ÿK¦1ÿK§1ˆK¦0©K¦1ÿK¦1ÿK¦1ÿK¥1wK§0:K¦1ÿK¦1ÿK¦1ÿK¦1ñM³3 L¥/6K¦1ðK¦1ÿK¦1ÿK¦1ÿL¦0yF¢. K¦1óK¦1ÿK¦1ÿK¦1ÿL¥/6UªUK¦1äK¦1ÿK¦1ÿK¦1ÿK§1bL¥/6K¦1ðK¦1ÿK¥1}K¥1iK¦1ÿK¦1ÿK¦1ÿJ¦1 L¦1‡K¦1ÿK¦1ÿK¦1ÿL¦2Ø@¿@J§37L¦0yF¢. K¦1æK¦1ÿK¦1ÿK¦1ÿK§2…O§5K¦1úK¦1ÿK¦1ÿK¦1ÿJ§2qJ§1|K¦1ÿK¦1ÿK¦1ÿK¦1øLª/K§1œK¦1ÿK¦1ÿK¦1ÿK¥1õK¨.,I¤28K¦1÷K¦1ÿK¦1ÿK¦1ÿK¦1˜Iª1K¦1ìK¦1ÿK¦1ÿK¦1ÿK§1ÛN¦,O§5K¦1çK¦1ÿK¦1ÿK¦1ÿK¦1êQ¡6L§2WK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÐF¢.O§5K¦2ÓK¦1ÿK¦1ÿK¦1ÿK¦1ÿJ¦1SK§1–K¦1ÿK¦1ÿK¦1ÿK¦1ÿL¦2ØK¨2)M¤05K¦1æK¦1ÿK¦1ÿK¦1ÿK¦1ÿL¥1‘3™3K¦1·K¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1óK¦1mUªU@¿@L¥0oK¦1öK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦2´@¿@Uª+ J¥2¹K¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÔJ§1]@Ÿ@@Ÿ@L¥1^K¦1ÖK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1·F¢. 3™3K§0™K¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ïL¥1¢L¥1^M¤05N¦,K¥-K¥-N¦,L¥/6K¦0_K¦0£K¦1ðK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦2•3™3J¦2VK¦1êK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1èJ¦1SK¥-K§1“K¦1øK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1øL¥1‘PŸ0I¤.J¦0‰K¦1äK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ãL¦1‡Lª/€€L¥/6K¦1sJ¥1¨K¦1ÒK¦1îK¦1îK¦1îK¦1îJ¦1ÑJ¥1¨K¦1sM¤05€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿü?ÿÿøÿÿàðÿÿÀþÿÿ€ÿÿÿÿÿÿÀÿÿÿÿàÿþÿÿðüÿÿø?ü?ùÿü?ø?ðÿüøàþøÀ?þø€þðÿÿðþÿðüÿðøÿðø?Àÿðþàðÿÿð?ðÿÿøøÿüøÿþøÿÿ>ø?ÿÿüü?ÿÿü?üÿÿø?þÿÿðÿÿÿàÿÿÿÿÀÿÿÿÿÿÿÀþÿÿàðÿÿøÿÿü?ÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ Uª+ M¦3(J¥1>J¥1>M¦3(Uª+ L¥0%K¦1K¦1ËK¦1þK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ýJ¥1ÊL¥2€N£2$Q¡6K¦1’K¦1úK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ùK¦0Gª+I¤28K¦1åK¦1ÿK¦1ÿK¦1ÿK¦1ñK¦1«J§1|J§1]J§1]K¥1}K¦1«K¦0òK¦1ÿK¦1ÿK¦1ÿK¦1äL¥/6J¦2VK¦1øK¦1ÿK¦1ÿK¦1àL¥0[Uª+Uª+J§1]K¥1áK¦1ÿK¦1ÿK¦1÷K¥0UL¦19K¦1øK¦1ÿK¦1ÿK§1–@Ÿ@@Ÿ@K¦2šK¦1ÿK¦1ÿK¦1÷L¥/6Iª1K¦1æK¦1ÿK¦1ÿL¥0oL¦1rK¦1ÿK¦1ÿK¦1åQ¡6K¦1ŒK¦1ÿK¦1ÿK¦1 L¥1¢K¦1ÿK¦1ÿJ¦0‰M¢.!K¦1ùK¦1ÿK¦0ÝUª+K¥-K¦1ÁJ¥1>@Ÿ@K¦1àK¦1ÿK¦1øJ¥1L¥2€K¦1ÿK¦1ÿJ¦1YK¥-K¦1ÌK¦1ÿK¦1ôJ¥1>K¦2\K¦1ÿK¦1ÿK¥1}L¦2ÎK¦1ÿK¦1ñUª+F¢. K¦1ÁK¦1ÿK¦1ÿK¦1ÿK¦1îK¥23@Ÿ@K¦1óK¦1ÿK¦1ËM¦3K¦1ÿK¦1ÿK¦1¦K¥-K¦1ÌK¦1ÿK¦1ÿK¦1ñK¦1ÿK¦1ÿK¦1ôJ¥1>K¦0©K¦1ÿK¦1þGª+L¨1/K¦1ÿK¦1ÿK¦2{F¢. K¦1ÁK¦1ÿK¦1ÿK§1ÛMª3K¦1 K¦1ÿK¦1ÿK¦1îK¥23K¥1}K¦1ÿK¦1ÿJ¤3-I¨1IK¦1ÿK¦1ÿJ¥0`K¥-K¦1ÌK¦1ÿK¦1ÿK¦1×Jª5ÿK§0™K¦1ÿK¦1ÿK¦1ôJ¥1>K§1bK¦1ÿK¦1ÿJ¦2HI¨1IK¦1ÿK¦1ÿL¦2aK¥-L¦2ÎK¦1ÿK¦1àH§0 UªUK¦1§K¦1ÿK¦1ÿK¦1îK¥23K§1bK¦1ÿK¦1ÿJ¦2HL¨1/K¦1ÿK¦1ÿK¦2{I¤7K¦2¤G£3ÿK§0™K¦1ÿK¦1ÿK¦1ôJ¥1>K¥1}K¦1ÿK¦1ÿJ¤3-M¦3K¦1ÿK¦1ÿK¦1¦ÿK¦2šK¦1ÿK¦1ÿK¦1óJ¥1>K¦0©K¦1ÿK¦1þGª+K¦1ÐK¦1ÿK¦1ï3™3€€K¦2šK¦1ÿK¦1ÿK¦1·I¶$K¦1ñK¦1ÿK¥1ÍL¥2€K¦1ÿK¦1ÿJ¦1Y€€L¦1›L§1ÇN' K¦2\K¦1ÿK¦1ÿK¥1}M¢.!K¦1ùK¦1ÿK¦0ÝUª+€€Uª+ @Ÿ@K¦1àK¦1ÿK¦1øJ¥1K§1–K¦1ÿK¦1ÿJ¦1L¥1‘K¦1ÿK¦1ÿK¦1’Iª1K¦1æK¦1ÿK¦1ÿL¥0oL¦1rK¦1ÿK¦1ÿK¦1åQ¡6L¦19K¦1øK¦1ÿK¦1ÿK§1–@Ÿ@@Ÿ@K¦2šK¦1ÿK¦1ÿK¦1÷L¥/6J¦2VK¦1øK¦1ÿK¦1ÿK¦1àL¥0[Uª+Uª+J§1]K¥1áK¦1ÿK¦1ÿK¦1÷K¥0UI¤28K¦1åK¦1ÿK¦1ÿK¦1ÿK¦1ñK¦1«J§1|J§1]J§1]K¥1}K¦1«K¦0òK¦1ÿK¦1ÿK¦1ÿK¦1äL¥/6Q¡6K¦1’K¦1úK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ùK¦0Gª+L¥0%K¦1K¦1ËK¦1þK¦1ÿK¦1ÿK¦1ÿK¦1ÿK¦1ýJ¥1ÊL¥2€N£2$Uª+ M¦3(J¥1>J¥1>M¦3(Uª+ ÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿ€ÿÿÀÿþøü?ü?øÿÿðÿÿñýÿãøÿÏãðÇãà?ÇçÂçç‡çç‡ççßÃçãÿáÇãÿðÇãÿùÏñÿÿðÿÿøÿÿü?ü?þøÿÀÿÿ€ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿ(  K¨.,K§0tK§2ŸK§2ŸK¦1sM¦/+N' J¦1¡K¦1þK¦1åK¦1»K¦1»K¦1æK¦1þK§2ŸUª+ N' K¦1ÏK¦1äM¦0P€€€€K¥2RK¦1åL¦2ÎUª+ L¥1¢K¦1æO§5Mª3K¦1çJ¦0žM¦3(K¦1ýK§1NM¦1?J¦1ÀPŸ0K¥2RK¦1ýJ¨/&K¦2{K¦1æÿM¦1?K¦1ôK¦1ýK¦0ÈDª3€€K¦1èJ¦1xK§2ŸL¥1¶M¦1?K¦1ôK¦2´J¥00K¦1èK¦1ÆN' K¦1¸J¦0žJ¦0žL¥1¶J§37K¦0©I¶$I¤1*K¦1èK§1ÄUª+ K¦1¸K¦1J§1|K¦1äÿI¤1*K¦1èL¥1¶€€K¦1æL¦0yJ¤3-K¦1þK§1NI¤1*M¦3%ËþýÊ€$’úù8åñ«|]}òä6Vøà[á÷U9–šæor‘!ÝY›Ç \Ðï·Í¦ó©/{¤™ô-IaÎ §î3bH`Ì× ÁÛ Œ¢‰1¢†bKGDb+¹< pHYs¯¯cæŽÃtIMEã  ”¦MÉ;IDAT8Ë­“çVÂ@…'DAD%˜Xˆ±{ïì ìE½ïÿNú&GÇãüÙ½ûÍÌΙ%ú_“²œ¾£MÍÉØZZÓm_àL¶¾å::£¼+ÏçJ¡[UµBo{û¼¿è†# uùó’hs”=„cãÀD8å$ÏøªLE‹š²Þ~&‡Y#Dç$2uç]™Â|qi™VÍÕ«X[q.qƒ6l9zØy™yE&ÚEÊi×°ÏËÁá‘Ãæ¤§öÉpNT­A¿`uy\ßXç·ÀçpÏÀãS/8¸W<ח׆/\áiåPüx¡HªA±ûdåðãɬ mçðãÅF­®Ö}.¶šÞ€Fô±Þß?wìÀÄ\üÐÆ=Å~Û~þz´Oq(Xžv'‰B%tEXtdate:create2019-08-13T08:05:09+02:00ðfêJ%tEXtdate:modify2019-08-13T08:05:09+02:00;RötEXtSoftwarewww.inkscape.org›î<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚handle($request); $response->send(); $kernel->terminate($request, $response); } catch (\Throwable $throwable) { ApiProblemResponse::createFromException($throwable, 'prod' !== 'prod')->send(); } ‰PNG  IHDRóÿa pHYsèèµ{RkGIDATxœc` |›fòöK Ãÿ_Gûþ~hùRÂßfX¼a1~¬ ÿO4ø÷ïÿ·æCêYÿƒ øûò*ªšOOÁ†~ëSþÿs[áÿÿ#ä><‹Á øÚÂaÉ÷¥þpg‚]¸<øÿ÷%~ÿ¿vH ˆƒ øÖ§‚aÀ·)ú¨ qa° :ı¸ €x¾Ô2þÿÿëŠ?wU`@ Ãÿ¿Ž¡ðûü"Ò øul"j,|xDPó×&žÿ_8 €B# 'j¢jhæûÿcCÚÿßgæüÿûâÒÿÿÿüÿÚ. 1Ä%”pØ^Œ•+#Pmøýýÿ—FNˆàpxvÕŸ_üÿ6Í’d'ëüÿûú&ŠüŸ{ûa¶ac:†7ð+B¡ iºñ°!u,ÿÿ>:N”æßWVÿÿRËôÿÛ»—çfJÍÈŠ˜$°IEND®B`‚‰PNG  IHDR66ë¼¾© pHYsèèµ{Rk×IDATxœíwÔUÕ™Æ/ ˆ 1j,q¢1&j2Kl¨‰‰fÒÇqÒ̲°RÔd9“øzïÂGQE&U@@éUê·O/{Ö>D"Jçœûœ³÷ó[ëùÿÜý¾ûwï=gŸ½K%B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BHžq'üõ2gÌý]ìg~ø–ÝëÚV‡Ïù¢e£XT7¢¢Ýó*[Û%!ZÒr|^‰,¢œÑ²Q¬¢\¢œ¢Ü¢S™Éç«Ø£ÓÕî}ýû¢ª~@%µ^_“±½ÝŠ„¤KàJgÐíðù%Ê•ªzÒîsÃv{ì]•{ÒZuu]wô¯{Yþ͇Ø#I­Ï 2vv¡[lð„´û6†Ï3QæX/òÝ1<)¥¬“ŠÔü‰Ýîyõ.ô;š8ýn–±»Ýz„dŠúâV·ZÐóMb÷ºv§?副'$5wìƒmD‹3âBHmÀ­2öjÑ=GHYˆÅ6iw»>ï"­ÎŒ½q4;.©9£î{NTÖ•…Ú Û¥ô-t¯RVâÝë¤Õî<øüˆT$ݱ¿|lRyïpø…­ÔúÞ$¥o£{ŒцùR4;>"•u¤;î¡AG'µ±¶/Ê/5»û2¶w {‹(ÁÒÉ$GÏGHu}éNúkÅá¥6áOß,Ê=5«Ýù2ÞµÝS„äÿµVð9)PisNìÏétÝ!—tØ=®Ü]©µl$£-KнDH®pG5ÏMŠóÔw·t)ˆû¯ú¡/î¨Ò´¡ ß›Žî!BòGè%÷œzŽ‚âMoÕòÀ_kÓªŠè ;b*ë&÷!'®Ý,­¶çâç* vŸÆê)âIÿúµ6ú75è‹:šø¯wG÷ !¹'\91ù€ž¯GÌíñ·ýb³k®Ù‰¾ #Åqº_) Þ”*øœEÄq÷Ú}¿Ö&þíʼÛÝ®¹škÕ9¢P:oƒÏÝrÇjÿYõé?SR/·çúB[)ã«ÑmBHáˆÅViµ¿>‡Ëpù˜ß—¬Áß{}!‡LU=¾û*º?),áª)Æ-Þõ^k5©”çµkþŒ¶è¾ ¤ðx/=l–ØÆ?¶º$Úž¢/ä`q‡ýXÊ8F÷!ÅÇ·¤ÝåRøœ.WœQMjK¢Ùi¹{…Êî|‰ŒÝ½èv Dµ³“[;FˆmÄÝ~)wODÕ}µ53Ñ}@ˆvxÿl†Ø†ß—ÐñÑx¯þ]Bô$p¥ýä¿ÃçxÖqŸÿ…Ì•Øìÿ‘ >!$¢ ohÿ—4_bkz²Œ6¿®;!Úã½ø;ü|7El\ÚAHyˆíÒjs|Îk/6uœ˜z„R‚Eƒàó^o±5;UF;ÞE×™³ˆãä¸Jøü×Ulþô6èb$Ñ–%É™hh'6õèY†>º¾„‹7þQ¸ˆô[eÝd54!{ª¼ÕêL¸Œ´›;æ~tM !RJF;¸Œ´›ÕâôdovBHiu¸.¤Â‹M}CBòC° ?\H…›Õéâä‚’#¢PÚÝ¿ —Raż=]BBÈA—†K©b³ŸüŠ”qt°1%„ä»Ïp1NlÁÒ‘èºBCø÷—áb*”ؒŸüµFHî±k®†Ë©0b Þ…®!ä(– ‡Ë©bSIð×!zBÚõ‹pAå^lþ¼t©HŽŒ÷¬—Ñæ·’ó^ƒ%Ï' —‘ồd¸jròbµzM‡›`Ḡr-6«õYÉñ_¤8Ä{7ÉpåéÏê(ÝÑ¿–vŸ¤Õ²Ñ±Õ¾ùiÒî~…tGÜ-ý9Ýd´n×/‰Ð+ìÛe›7¹]"r;ª†ï¼ ½qI»ÛåÙõC³S“óbƒ·‡ÈØÝƒþØäøsºÂ%•O±UÕ“ñîµG? [¥?»³´{} s¸GÓ““_sêp’Ob¯VZ-΀‹*wbsžù!º6äÄ~r?ÌrG®6túÝ’¬Ÿ"ùÃ{éaxäNláŠq躅oKviµ;Þt‡Ü o'H~ˆ¶-“¢²¼7r#6«ýgy@ šÀInÜ[í·7ÛQ§ª^ò+œòƒ3ð6|_äElÞ„?¡ëa4ÁâaÒj¼ÉŽ7v·Ëd´qz‰”Ƀ%t?äFlѦEèz»T#¹‡–ƒ;áT×—þ¬Nè!%QP¨¥™‰M- ˜³"­VŸ‚7Vê:ú×ɺ*‚í%¼àbó§5G×Á,Wº/üÞPYÆp+ßh@GÉfxÀÅmYŒ.‡1ÄÖûɤG7S9b÷¼*ù¼$ã·N–¿(½)ÕÉr-«õ§áuÏ…Ø’­¿IYPK#¬ŽÁ©¬r«¹FÆöôÐkAìî‘áª)ÒŸÞZ:Cï,ôæÌÅæ½üº^Fm[.­6çÀ›»÷uRz]‚bz2Ú0_ús{HwT“}¯ÎUօײ0bS»¶¢Ât±©ûk¡n-‰ÝÆ>=¦· D\»eßz±ÉÒyê;Z¾1"t›ÚS‹dƒÚPÝ,EH¸â%™K<ññûbüõ- !6uÿ‡¤O´ã]£ÕŸHÔöLj›slÁ‚dˆ`~oé¾ð+i?ùÌÅæ&U±ñ”÷lp‡ÿÞ(EŠ;öÁ²Ö'Ú±29ÃÁÿ¨´û6NnÉ Ç@žTÅïz¯¬ eê¼Qu¼Q •ʺ2Z÷z6õpv' Ð÷¿GÙælüçedfb³Zœž<Õ!éâ½úx“1jYÄ ¿•Ü›±ïÂç~fÜ;¹¢ÀIMljÑ(Iß.äÎ …\¸…¬KAW7€¦„[¹ïk˜@°p ¼AŠþ áP/ÊÇ;W%[§{ã“N¿›“óNÑ×Ë”ò'6õ›¤‹){¬ejS[Û“£ý’ûbO_Z­Ï‚_S*†Ør»~¨À‡s‰@ áJ“šØÔ)$=‚…àÍÁ0Âh±UÕãA)㎸Þ #L›ÕáßÐÐuØ4º9F˜,6µÚ𤻑$º1F˜.6÷¹Ÿ¢] ê º1F˜.6Þ’.þŒ¶ðÆ`aºØ¸knº¸cî‡7È ÓÅ6¯í­pÞ #L›Úʘ¤G²Wšƒa„ÉbSÛ“ôàà SÊØÞ{ í­àn¹ S‹MmƒLR"ôáMÁ0¢àIGl;ÞEë@b{¼)F<©ˆ-ÛÐ>І¸v3¼)F<©ˆM.ÚÚ@±1L)'bãY©A±1L)'b;ÑC3È~(6†)åDl¡ö6¨m¬ÑMÁ0¢àIIlÜd25|Þ # ><ÈqÌ}ú¦"bóm´´Âjþ xc0Œ(pR›…vVXm?o †¦/ÐõjÑ.Ð »ë—àÁ0¢Ât±9»Ñ.Њädò4ãŶgÚZá ½Þ #*L ~Û2´ ´Âó¼1FT˜.¶u¯£] Þ¤'àÁ0¢Âô&WN@»@+ü9]áÁ0¢Âô3–Ž@»@+Ôx¢ƒaD…éb[Ðí­ˆÖÏ…7È Óß›Ýí­ˆ÷n„7È ÓÅ6µ)ÚzGRT7€7Ã“Åæ½üZÚauü¼9F˜,6wØOÐо}À0%¬Øœ¾7¡= îÈ{áÍÁ0Âd±Y.F{@;Ô}Kts0Œ0Ylêärè’.Á[Ï›ƒa„ÑbS/Â[ï£] ê55ts0Œ0]lÑ–%hhua˜^láʉhh‡Õò“ðaa²Ø‚EƒÐлæxƒ0Œ0YlþÔfhh‡*ºAF˜,6wä}hh‡?­9¼AF˜,6.ÒMn_Ä0`±YíÎC{@;¢­Ká Â0Âd±‰Ê:Rzí½=)ªN‚7 ÃcÅÆµl™`wý"¼IF˜,¶pÙ´´Ãr¼IF˜,6VG´´Ã{õ¯ð&aa²Ø¼‡ö€vo…7 Ã“Åæ üÚÚ¡î[¢›„a„Éb³Úž‹ö€~DA²-ºQF˜*6µ+I»ç•ðFaa²ØÂ53ÐÐnÎ0%¬Ø‚ù½ÑÐf{x£0Œ0Yl<Š/}•àÂ0Âd±9oC{@;â½›àÂ0Âd±ñÉh6XmÎ7 ÃSŦÛ;ÐÐgð÷àÍÂ0Âd±…«§¢= Þä x³0Œ0YlþìÎhhG¸l4¼YF˜,6wT´´#Þ½Þ, #L›Ýã«hh‰z0ƒn†¦ŠMT×—2pÑÐçéïÆa„±bS»énZ„ö€vx“+á Ã0Âd± ¢= j‡btÃ0Œ0YlÞË¿G{@;â=à Ã0Âd±9ý¿ö€–ðÔpb³Zœ.e¡= Î3?€7 ÃSŦm[Žö€vxSªàMÃ0Âd±o=ƒö€v„ËÇ›†a„ÉbóÆ?Šö€vÄ{7›†a„ÉbsúÝŒö€–Xí΃7ÃSÅ&ššœ²DÒÅyæ‡ðÆaa¬ØÔ„-KÐÐoJ5¼qF˜,¶`Ñ ´´#\1Þ8 #L›7î!´´ƒg 0L +6»÷uhh‰Õî|xó0Œ0Ul¢º·0Êgèðæaa¬ØÔ„õsÑТÌ0%¬Øü×»£= áÚYðæaa²ØÜ÷ = +EÓ“á Ä0ÂT±Ù].Ek@KìÞ×Èa„©b•udl½ö€vxãƒ7ÃcŦQ^9íí–<o †&‹ÍŸÚ ííàN SŠM½¸MÒÇêp!¼‰F˜*6«ÍÙhh‰;üçð&baªØTâ«ÑÐNWx1Œ0YlÁâçÐÐŽhý6-B{@;Âe£áÄ0Âd±ó{¡= ±Ø o$†&‹Í}á—hh‰Ýùx31Œ0Ulv÷+Ðе5º™F˜*6QYWÆÎn´´ÃŸ×ÞL #Œ›ÚécÕd´´#Úü¼™F˜,6zk´ô#ޤÕúÓð†baªØœ!w 5 %j\Ñ Å0ÂT±YmÏE;@KüÙá Å0ÂT±©Ä»×¢= jñ3º¡FkªH»×µÒ÷ =%ÝQMŠ+6µ­5Éà>[ËFøFe˜ŠCÇjwžtŸûi²åV¸f¦”¾}@{Sª‹+6oÂaó_gÔNÅèÆeñ!‰©žT² —¿(ckû{Ø­eqŦv¤ éãÏìofÆÌXÍ?‘ìàã½üˆ Þ,£­K³‡ÛWlj1©OlÓ‰6¼opÆ€T×—vÍ5Ò{ñw2X4hŸÄâ(7»BãÄ–ìôñf*A>DJ«Õ™øÆg´üKéÏh{Ðûby{‹*¶`~ïÌÇdÜ¡ÿŸLqcµl$A·ÿ뾘ØVÖþ Þè[l±q§lðçÕÀ'S4?íã÷ÅâÚ¿jÉG¡ÅÆ>²!Ú±?a˜ü¥ê$i÷¼Jºc”ÁÂ2Ú²$¹u‘7‚7Ÿ.¶ØDeÛ;Ðã¨%V§‹ñ‰ÉÏR‹w'Ié[² ú\lj§¼‚G-qGÿ>±˜òÅjùIè}±4Q»l^lÞ”ªT…ìCኞlŒ9÷ÅÒÄŸÓ­øbSß2$}Ô oµ©'|2'~_¬ÇW¥;æþä/Z´ùí\ÞKV§â‹Íjqºö…Ba÷¾?1#î‹¥‰?½MñŦ¢v%éãOmŸ¨Ìî‹©¿”ÿç}±­è–Ѧos!6É— ÑÆðÉËü3ÍN•N¿›¥7þ1,&ã«Ðí‘[¼ÉzˆÍy/z,õ$Ž“¿6èú—ªzÉMÕ×û·æ \t7õPD ±Ù¿€KmQow ëkBœß”þ¬Ž2\3CJO Ë^hÜ‘÷é!6•¸v3z<µDm艮­ áÉkùÚS07b —IqhȨ3\ÕÖËèúêµ-;Iõ@E±©'C$œÁ߃×W÷Ļסˬ v·ËõwÔÍ÷60Ìácâz³¬HãWnÄ&š6”2ô2,“Që£Ô“:x5Õælt‰µB4=Y#±©ûë^G©¶8ý¿¯¯®±k®F—Wb¯6•šäJlêU ’ þì.ðúêgȣ˫ ÑÖwô›óÔ¢ÇU[ÔÍm¾ŸM¼Wþ€.¯6„+'ê'¶ää*ÞgË þÍ&ê”&’¯]ù›Z϶vVJCD²ØÀùx¢ óÑ¥Õor¥žbó§µ@­¶ÄÖû\¬›v*ë&7¼I¾^ÌØœßJiˆÈÁpžý¼Æ:EmIÒÃx›žbÍNáN,ޝ±FQ'>‘ô°»\ª©ØÔ}¶÷¦§8TäBOZmÎ×X—¨3HJ„^²º¶bSÛ"“ìð&ü^c-¢Žä;¢©mYœZmr)6§ÿ7Ò-ò1¢íO&%ºÎEÝóJt)µ"X7d4œä£8n…×;¯±Úž+cwºDZâM|Ü<±%ùí݈{#ˆ¶¯H¶‚×ÓºKlÉb]6!’x×{Òî}=¼ÒˆÓïnAÂî}Åv`3ÞŒªù€(HÎ~ÍbÅx9¢–$Ç1z$ýrÿX8±%‡ÔîZƒ® QMWOKÎÖ,ŒÐÚ—<‰ãÑŽXüí2¯uñÄ–leÔ\²Ÿ8’Á‰4Ð}q¨ØÝ¿œ\#_ÊqœœðE±$j·M/ÔCniw¿"=Ò²QòºNøî$þåÌá{¯•¥þ…›J¸rºFä`ı WO•î°Ÿ”ý•,«õYIC« ùë,Ÿ¸#î¡Ø{áÜ{>ÿø¶ ÿ>^z/=,íÎ_H_d­>%gÿ+Ùj)Úü6™åœØÞY¶/»ÂŠ-YÓV»]+r ¨ CÕ_C%"wÌÉr »Ë¥Òjû™ƒ6¼ú;©ž`ªÂÕVJÞ¸ÿM–û„«&ËxÏzôÇ!Ljÿz÷òýð)¬ØÔC„íŽulIž ýä[[pkúÐàɯPlGõmÏ¿„䕼Šò¹¡ÐbS W¼„®!ä8¾I±Kœ·iL !èMKËì…‹M%Úô&²n„Ãà>÷3Ší¸>Ĩ&‡WBr{"À.ÌZˆMT7ñÞM¨ÚB;ö·˜;ZˆMý8é‰C-!õk­ºÅv¢§ ÅÎnDý!Áq7ÌÚˆMÅŸÖü`ãK)3Ñ–ÅÐýú´›Õò“ÉÊuBu> ÒZ‰MÅŸÚ\RBÌ&\3îíÄÆ_m„‰£\œ‰¡ØT¼)Uèòb$ÁüÞðù¯­Ø¬gÈXlEט£ˆ­íÒjýiøü×VlÉû ºÎ„…;æ~ø¼?Pl…IU½}»ªB2'Z?7WÇ1:Ïß—j›ž£/$“7ð[ÙW”Ó }i÷¼*_sÌý^I´>;D_HV —F—­ñÔáÙ9˜ëŽûÊö”¬nWìF_HV±:}ž'’ÑÆ…Éù#èyþÑø3;-+Yý¿þúB2ýÓ[gUWBÌÅ·¥Ýírøü>XÂ/>_r‡ÞYƒ¾LÓôdm}Ý„h…7þQüÜ>Ä"}éÚ¿(‰Aß¾}1YÇéw3O'$%ÂUSrõô€¹>ôÇê„§³K «Ë¥;Ñ”uü¹O¦UWBŒ%®Ý"­vçÁçó¡,è¿0‘Z"¶Áßy}AYÇjqºŒw­A÷!Å% ’ƒ®s;Ç;\(¥µû®ýb“Õ¥†¢õY>úÂÊrªÏ"%ä¸ð^ù|.îÌöÛ¤”õJÆî«Þþ™`~¯ã«*!¾ó‚Ìó[Jv×/IY»õ_¿Ö>ô«í$«ãE»Ð˜yš6äëV„ÑöÉÓFøÜ=T*ëÈ`Ɉy“Úþ_m5×ÝR[}²–¯X}8v·ËdìÕKm 1’Xl“vçKàsöpqÇ?fI)Ï/§ÿ-ÍÐZ–ÁyºgÉÿ"Ü>7Âçêáb?õH:»o?¬ÔöË­÷ O£/¸ =…nBòIIwØOàsôp±úÜËkï;*©íÿ[ÚëÚy¾Y˜JšŸÆ·9Þ„?áççab?ýýHîYï1Im¿ÜúÞü·Úf§Dè‘õ‹òj÷OBÈ>üÙ]àóò©ª'Ý Þ%­=7”N«æêk¬NŸß ÿ@Y¿rÅ]@‘ɹ9ý§f÷øªô–ŽxIJÙ¨”²ºT×éscSÑæl ýᲊ;â.Þ%F,z*—5jþÌöK¤½£q*Bû˜à(Õ·ûÞø¸Õíòµy€?­º·,–üÍCÏÁ¢ÞGuž¿Ûò )=qu©\ÔV—αú4~ÌîÓxŠÕíËk¬vÑâ ¿¶ª~q×ÁUÖ‘þ‚~«¤” Æ”D{6¾åޏw›3ü®í¨¸£š¬óÆ=¼Ì}­Í8ÙèJ)åe“!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BHiÿsExާ}édIEND®B`‚‰PNG  IHDR€€¤Çµ¿ pHYsèèµ{Rk IDATxœíy¼Ue½ÿ8—iše–um°2o“6¨•–?½ V–¿Û`eY–ÝÊ2o¥u/‡Ã,“ *£ "¢((≨ ˆƒˆÊ,‚ȸæé¹¯gÑdpÎÞ眽÷w­g½ß¯×ûŸ^÷Öf?Ÿýýì³öZÏcYÐ!Ԕ惃Y—ÿÜ¿í»÷¹£N{Õîw|d7uVv«PºÃ>®R{‹€ÆÎï->ì<ªgi¿ã#=[ýÉß½7˜õ»Ÿé™+=÷-ÎïÏón>ÿq»ï±‰ø›ÔÑá?ê4•ºÛ¥?¥&˜{•ø,°‹àÕÇÆÞ¤o.öç\u^Ã0ûŠº7|îe»©“üQ½qg«4Ø#}Ð%pׯÄg‚]›:+oìY›ü9¼°îƒß›ý‡÷¹ãþß2S6ü'ž§TäIgþFš(ÚEâ³Á.’M•;ñë«üùýN¬Ëð÷ïüU“Ýç-…¿Ôóºá?á+JE¾tÜà_I"åßrøŒ°‹æÕoKüÙW\U³Á¯š›;»·\°Ð¤oýÙð¿ñK|óÈ3‘Ÿ}N¥g…]4» üÛ.œ§”êÔ±á?åŠÃܱg¿ þªõð.à¶r‡Ÿ">3ìêNüúójÞøCÛ7üç5šýЛƒH-õÆœ¥TèJǪ$ݵQ9ýß)>;ìêÿÒ:5oÞm¿ìsã—VI¿øZë^ÿ1•z;¤ó m$yùIe÷x£ø ± ¨7ùÂemºäÝváLé]kÝÁ'ªtÏ+Ò9€v?wwv}[z–ØÔ»ûòIU ÿ`Ö?±›ÁµÔé¼Jw¬•Î/tpAñybP§Çá*XxÍ÷Z¿ô3ãor®9!0êÞû(•l]![¨þôŸ‰Ï»€º£N×?~Òbø“¿s¿ô‹¬©ÝQñšùÒy€Z‡ÙÓûâó¥KñôïýÓ­ûþ÷üùCFýÈÒÔIEOÝ,U¨zÓFî ²ÚîÀµyõÛö)€ìa/éWCÃy=¥3 u$Yÿ¨²›Ÿ5vÁ îoºýõ×þïéz´ÝóÈTú…ÕJÚ¤³ |¨Ÿø¼± ¦3âS‘RêˆùÓvô‹ª•îðSyÐ  ,¤©ò&}S|îØ3\>õ·ÿ¸ü3úŒ-Ò/¨:ýÞ¡ÒÝ›¤# $u_SÎÀÄç] ƒY¿[¾÷òϼæÃøñ·Û¡*Ùð˜t@€dãâì®?ñ9Ô¥ºãÏ•RYÞ¬ß^&ýbjaôäxé € á£×ŠÏ!» :=PÊÝýyË›òý»¤_LGÕ†@ÉÑ¿Lø²ø<² bôÂÜÞ–;áË+¥_HGt¯ûˆR¡#=Èú7@§÷ÑâsÉ.€Á’q3-wø©Û¥_H{uz©’×VKgrD´ô&ñÙdÀ`Aÿå–3ô$Wú…´×hÙTé¬@áÖP«rÌë³Þr¼;”~!íÑŸñséŒ@NIí­Êé{¬øœ²s¬?¯çVËî{\,ýBÚª;äƒÙQq-¡¯HÏ*;Çózì,^4¤’ ‹¤³ÀŸò}ù™Õ%Ÿv/^è½?ª~Jøê·‰Ï-;‡®ÜQ§+•èت#zòFñÙeçÐb@÷7¨dÛóÒY€"> 6æ,ùÖ%_ªÂ…ƒ¤c%yåYÎèRÐàÒt”`öïÄg™#‹Qz—ÏWŸ“ΜÔß•m/>ÓºäÃB@8¯‡tnÀ¢§'‰Ï4;'æ¾Ü!P*ò¥3á;[|¶Ù90ßÐÔIÅkþ"0ŒdËrew=P~ÆQ-ëO¿D:'`(ú ;sŽØz?ïÔÙ&0”t×Few?L|ÖQû1|d¨t>Àp‚{ÿ$>ë(€ýíô‡ÒÙÃI½Êéóñ™Gü“ñÊ»¤s%!\Ð_|æQÕûEé<@™ˆ<å x·øì£š:©äå'¥ã%#Z2N~þ•½ü[.Δ‘$Vîµ'‹ÏÀò€þö¿ù)é@I‰ž¹U| —¶üÛ¾+½þPö¿†|@|(—¯º ’­+¤—JNôÄ âC¹tÀ·Èq œþÇ‹æR@²a‘ô²dè“¥si €ûþ W„Žr®~«øp.EÄÏÝ-½ÜPRçU¯™¯¢Å#Tð@³ fþZù“¿£¼±_PîuQÎ5ïÝGýƒžwÃç•?õ*˜{e¶¿T¼bºJ^{AúŸ9'œ×C|8_îµV*M¥×òDš¨ä•göú»~™ý…XoczÿoÂW²2‰WßáCð:Rw»rz¾I|@]Ñã£^ÿ®C)I^]•]wõnúªrz)òAÐÿ»ú/…hùíÙ%€`î•âÚØÐíš{¤×„H6=¡‚9¿Wî ÷‰ö±û²ÃB’-ˤß&$Ý¹ÞøSÃÄ À¿ó¿¤×Lºg³ ç÷*ÎÃ6M”wã¨øù9\ª,)þ-ÈçÐÄH^^*½¶Ð âug?ØÚ͉¾½º£NSÉúG¥ßJh0ñ‹ˆgϸpG~Fz]¡Ä«fgwáH‡¼f6uRþ”ï«tç:é·Ešf7«ˆgϤˆ-½¬Pçoüîè3ÄÃ]7»¦ÂG†pY¨$„]/Ÿ9c  ùàì+0tÇZåÝò-ñP7Joü¹ÙÁâ`6©¿ÛØ[B^Þ¤ó¥×jMªð¡~ÊîñFñ@7Z§÷Ñ*^~‡ô @ îú•xÖŒ(€èÙÛ¤×jHºýE³/÷TcS'̽ŠKB“l]‘­³xÖŠ\úÏ(ºÒk 5"Z<2»g^:ÄyQ?H¦Ï—3ñÆ~QLjçÃ.S„‹†IgÚI²ñqåô>J<¬ETŸW „:*^» ÛaÖ¿í{ÙÙÒ9°Ë^<>_L’­+³½ó¥ƒZd³›¸E´>$±J6?­¢'Æ(ÆÏ•{ýÇŒßÁÓ.Z¸ƒO”Ž ´ó)×ükôA»ï¥—ÓÒk²g‰ôVâÙ>S%|øÐ.Z°õs‰|åŽü´x@M2Z6UzU EêïÚ{)ç‘!ÊŸümåô=V| mÃlHpûgñТH‡Ó4žG¨dÛóÒK›OBWÅëªpá`åO¹P¹ƒÞ/¾^v ¬4uR©½U:^ТeÓăiªúûÒ9©¯ÛoY¦¢¥T0ë·ÊýÙì6qéµ±KhÝ @?LÅ!ݵ;~ê¬þëªLè@ôå¯àž?(oÌYÊéq¸ø Õ˜îú¥tþ  x7C<”eÐÔD÷½nÿvñ÷-¹ˆž¼Q:“P%ñŠéâ,‹N¿ãTêlS…&÷^Êy|”ò§]´÷䬦Îâï-Zù)€äÕUÒ1…jˆCåzŸx ˤþ±³h[¿þºý¡âï!Zù-½uÀƒpÑpñ0–Ñxå*¤;׫hùí*˜{eö4³©'bÙ%·®àMø²tŽ¡âP9ýcÕÚIß”z;Tü½*œß+û H_ž’~_Ð*~÷þY4ØPúwé –Ù†~Nô–ǽӟq)×í»”Ûº@ôô¤ÆÚ¾7]:ˆ¥¶ùàìÈÁš“&Ù¯.ø`毕;âSÙÿ–ø¿U) @Ó€|£O;’!Öf»ô×ío?ñklâ‡J®º’][†|£oß“!î5^=·êuÓ‡+ýý~ûi±å1ª\€Þ–òMêíTv÷ÃÄCˆûÌ|4Û&aâ@%©ð±ë³³˜Ý¡âº=ª\€?ù;3 Ú@´ô&ñâëÕûÚë3ôÚ3/Û»#+×í±KÁ ¸ï¤çT€m­R[·ˆ–Œ•žoÐÍ“œˆ]ÊmÝ ^óé­ p”"Zf€¾% ò‹~øH:|ˆhXÍg¡@~qG.>D´Ì+€lÈ/IÌ퟈¨êRîè3¤G´B²e¹xðÑ2³ü[ÿSzÆA+DÏÜ*`Çéùf].DD´Ì+€xõ=Òó *À@ˆV)­{„_#=ß ÉÆÅâADD˼ð§_"=ß š=º FD´Ì*wÔiÒã ªÀòAñ0"¢eV8=P*M¥çTÀ¿õ?ÅȈ–Y MwmžoPðÁîâaDD˼àN ü¯˜.FD´Ì+€pá éùH·¿(FD´Ì+úϤçT"M³ßk¤‰ˆ–YàŽ:]z¼Ax£?+HD´Ì*§×‘Ü TôöÝÒDDˬв'Pþ‰–Œ$"Z怾ËòMòòRñ@"¢e^4KÏ7¨D*»Û¡â¡DDˬð&}Sz¼A¸ÃO%"Zf€3ðéÙU oÙ•%"Zf€ÝÔI¥îvéù %"Z†€þ!ø¥yÒó *¬T<”ˆh™WáÂÁÒó ª:à@ñ`"¢eVø·_,=Þ  ÜkO&"Zf€;ìãÒ³ ªÀŸv‘x0Ñ2«ì惕ŠéùЗ꤃‰ˆ–aÐÅRɦ%Òó *¯{X<˜ˆh™WÑ㣤çT"tø!±‹ù6¼ü—J7¨÷úЇ-³ À~Šôlƒ*ð§_"ND´Ì*»ù ¥"Oz¾A¢Å#ÅɈ–a Þ°Hz¾AôõÒáDD˼ÐûÍ@¶†î~˜x@Ñ2«ü;~*=Þ  Ü‘Ÿ("Zf€¾Ãòg#ZF+Rv×” léùˆ–N("Z†€ÞzÝBéùH¶®("Zæ@øÈPéù•HåôQz¶A÷þY<¤ˆh™UÙÁÎ6éùˆWÌ)"Z†€þ!øù9Òó *Ú[ÄCŠˆ–y>Ø]z¾A8O*"Zf€7ñ<éÙUàßö=ñ "¢eV8}Þ¢TšJÏ7¨GD"ZF*ZÚtû‹Òó *¬T<¨ˆh™WÑ3·JÏ7¨Dä+»Û!âaEDˬf_!=Þ  ØÑ2NñpGŸ!=Û  ‚Y—‹‡-³ Àîvhvøä›èé[Äʈ–a ˆÜ´Dz¾AÒí/‰‡-ó Z!ž,¡û»nùÊDüi•«ÜÁ'J¿çP%ú®-é¼`É®Ûë­¼ª,øuxæ&×`7ujuo Èñê¹òyA£tzñ[0Ÿ¢Ò=¯¨2ãßrAÉ @ï ºòNé÷ª!ò”ÝíPñ¼`A5ôº}-ñnþzù ¸÷O5}¡~x7þ‡x^°–èº}-ñnüRù €ŠC¸p°x^°×íÝíÒQ-$Þ¸³ËWv÷Ãrõ4´ ÇDâ¾×í7KÇÒ¼>_ÂЄm|\ú½‡*ÑwnIçxÝ^_Ê™qé?]·O¤#h,îÈÏ”³ÂG†J¿÷P%Á¬ËÅó‚u°©³r¯=Yù·_¬ÂEÃU²é ¥âP:n¥Â½î#å,ÿ¶ïI¿÷P%ñê{Äó‚õ¸nÿšt´JÓÿå,gà¿I¿÷P-‘Ÿmä'lŸáÃUºûeéÁ~¨Ç窠儰âàÝü ñ¼`ûÌ®ãC>¿XÕa½ SѲ©ÒKU=>ZùöŸOôÝT¥.€`ÎK¯TIjoÉö‘Î ¶]n¹Î'É–åå.wÔiÒkÂ÷,c}uz¾I:6Ðñº…å.}ϱ Ý–ÞÈáÂAò™Á6éù tl ôXå.½1ܺ‡[z g¤;Öf»¹Jg«×Žtl ôƒvvÙ |¨_Kïäwø)â™Áêõïø‰td Áûlª¼‰çµôþ@ çõÏ V¯~è òI0ûŠú¬y‘ Àéu¤RI,½ |çÖÇhÉ8éÈ@ ø“¿]—5/Th“—Ÿlé=‚â^ÿQñÌ`•Ÿ­ ‹¤ã-àŽüt]Ö¼p €â>ÔW<3Xåñ«þné¸@ è½™ê±î…+}.&‡tçúl'IéÜ`ë:Þ-h‰8¨Ûg¨pàô9†³B †7æLñÜ`ëz¾"htûKu[÷€– «ŠE´x¤xf°u¹(¿Äkæ×oÝ‹Xú@ (ú X»ù`ñÜ`Ëês ŸDKoªÛº²üÉß‘^h#ú·éÜ` 6uV©·C:"Ðáü^u[ûB€Óç-œ=Z0âU³ÅsƒûW5ùÅŸòýº­}! @Ëó#M²“ݤsƒû̼L:Ð î°×oí‹Zá‚­½gC»‹ç÷5^=W:ÐI¬ìî‡Õmí [Þ„/·øžA>Iwmä ˜œéô8<;nòI²íùº®a @ÌéEŃó‚ó%Væ›xÅŒº®q @ÿéºæ/Òëm$~ññÜà?Ô·B~ ç÷®ëúº‚ºJ¯´wØ'ijƒ{/ÿ¤Áé8@+øSPßZäðF¶µ÷Jø` V¯?ýé(€ð—¥B€Ýõ@`)"q œþï”ÏOÉåˆÕœùÊîvH]3PìÐ×0Ÿ"½LÐÂýųSfÝ¡'±©bÎI6£Òû y%‰88¾FÏÜ*½âƒ'€*½¿Lêl«æ}…¯}(;”\äG:CFÛõ@•¼òŒô2C•xc¿Ð\SœVlÒ]”ÓëÍâ92Uý B`×ý0ã `ï¶¶žôÒA`‹ˆúèŽü´Rq(½¼P%ñªY ˆ1 Ÿ›Yí{ 9ÅŸümñ™¤þ«*ݱFzY¡ ³×°|Uþ?mËû 9$µ·òl@­lê¤âåwH/)´÷Ú7,#F@vX|µõý†œ¡Ï{®ç1xe‘cS zj^—ÆeĨÐÆkæK¯!Ô€héñ,Ù`毥—ÚA´dlcsbZ³.oÏû9$¸çây*¢z•&ÒË9ÝÿÇèp¼›‡]L!M•ûÅ3U$ý)ßg£·¢’ÄÊésLCób\hõ>Ú`I”\.©"Ìù=_~ Lü҃ό‰Àe ÃHbåO»H¥‚¹Wªøù9Ùëîùƒøl,EØ=Þ¨R—ôzCÎH¶=ŸÝZ©÷ŽòÆœ•ÝqS‹­ô°×_:Â…ƒUüâýdö%”sõ[Ågc9 @?°xÄ~Vàõ¤þn•l~JÅ«fg‡Ôëkózû‰`îUÿðÞ?eÿYøÈ=usö­^ÿÿèçªAÿ%*=KUîðSªZÓü-]h“×}aZCŸW"= KYþÔ´º0õ&O•ªìæƒTºs}Ý`¤Û_Ìî Ÿ…¥,ýž{Õ~ ÞøwþB|–ºœ^oæ>lh8©½%w[””"®PUIDAT®´á£×JgJFpñÙGè[B½?;„ ègDœÞG‹Ï> à¯ê=äÊúí¿ÔàþlCÊMjoQNÃÅgð/Æ/Ü' 0œàî߈Ï: `?º£N—ÎLºcmv2¡ô¬£Z0~á^錀¡øÓ~$>ã(€V䯨ÉÖ•Ùá?Ò3ލ ÞΠ–x¿&>Û(€*tG|’C¸ fècH¥çÐõ &t•sÍ{ÅgÐÝaçé`è0Á]ÅçУ'nèøê@iI^{AÙÝŸe@;Ô‡‚s€7´羚ŠÏ±6À¼;-»ÿñ¡ô É‹œí!^1½xónAÿ-–3øDWú…䯿ƒU²íùvÊIêíP΀wÉϯ6.ö’å^÷ÑíÒ/$Oú·þé<@ð§þP|nµÇè™[Ÿ´Ü1g®”~!y3^3_:SPâ^úù›É¦'&ZÞÍçß)ýBry[hIg rLºçå\ýVñyÕ.»¦T^ay7ã×â/&‡†õ“ÎäoÒùâsª½zãÎÖÿ„Ó­mÍGa7$þ‚rg·CT²u…tÆ ‡DKÆÉϨè?ØÝWJdiÜ¡'m‘~AyÔs&OÀ>|9½ŽŸO1~iþÙðÏ `ü¹C¤_P^  ýê@y‰<å?E|.uø7N¥.ø{ìxÜ1{šN¥_Xuz¾I¥;×KÇr€?ýñ™ÔQƒ‡¯±•R‡XÿŒ3âS ¤_X^õ&|E:w LôÔDñYÔQ>ǨdÏæÖ¿â ;ù¤¼Ÿ`#i´ô&éü€Éæ§²['¥çPG æ÷q•RGîSÙ_Ã?9WúæU§çÙ?P.Ro§r½_|uTw臔òw]aµÄö«¬#íÞGûÒ/4¯ºÃOU*ÒwO@)HåÝü ñÙÓa›:©hå]«•R´X{/}ò'úÿXüçÔ`ÖåÒ‘€̾B|æÔBÎôÖ³ªÁö±iÒ/8·6uRñŠÒ¹€:>v½ü¼©Þ˜³” ìŸZÕ¢š­Á'>#ýÂóªÓûh•î\'O¨ñs3•ÝõñYÓQÝë>¢’íkT=üÿ^WX‡9×¼g­ô? ¯º£Ï`Ã8I6-QNË?£†ž¤’­Ë&(¥:YíaK³u¸3è}Ë¥ÿ!y5˜{¥tV †¤;×+§ß;Š?üGŸ¡âëFµ{øÿý/K­ƒœ¡¾Gú”Û_Öy>ÀRçUå^{²ü\é þŒK#eoý¹UKœaŸøÝý ÿ¯v;DÅkHg:x¬£[ð=~œ~Ç©pÉk”R®éðÿ{ 4v¼;ô¤EÒÿÐ\>^ÍCb…$õw+wÔiâs¤Ýv;Dù3/óãë®RJhÕ›Ýßs®3èý%ù/?¸èoP B'Ûö]z~´wwïîßñ槆)¥Ž¶3àŸq‡Ÿ2Ëîy$OëûmÇŸ£Y“Ž4TCäeŸÙB ýÞG)wÒùIøèuOª]›/VJ½Á’F?7°§ß±_tF|j¬3ôC«í>oµí¦Îâo–„þ¿Ž5TAð@×l{—<êÝð9åŽ?'ò&}Ëõgþê•`^ÏEÑòi#U蛋¡`”ÿbí²½¢ì©¶IEND®B`‚‰PNG  IHDRe „¬%Ó¹ pHYsèèµ{Rk IDATxœìÝ{°­uAÆñЦ‰¨YYÙ4ŽSV^rF›2µ› /55‘åŒÚ¤ƒÍ45Ú4çÂ9À9€©!D.@** qŽpˆ‹€ p›¼ëþ®õkö"Г@pÎÞûYk½ŸÏÌó7ïÞç]û}ß/{¯Õ*,»Öòÿ'eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eD€Q @”eeF÷Ý\O+½óW—î†w”öÇ_Qª5»”jEËì§Ö=~ÏRôi À4JïÔ½ã÷®f3¹5»NžË»'½³ô/X]†OŸ<·7ÉüF™Q]êï]Vúßüh霸W©Öíž?álfÖûÜŸ–R÷Óg1³`T—ÞÉ¿‡5››­aélx{é_tH©ï¼bò›WseFÝËàÛJ÷”½EÛêõNÏ\¿èXõ t7¼=~/k6—[ÿÂÒ=õÝepÍçʨûP™'³ez—Á5'=òÛ0ûîœ?Yl¦×?{ŸRÆãôY À,ªû¥{ÂÛâ÷´fs½5»LÞŽdpíÉ¥ôÛeÖÍl”©ïÞXz_þp©ö^þ¤°¹XÿܤOkf0c¶|[»[éžñþRßõ­2«f+Êԃɟ'µxuþßæjƒ ×¥ÏnæÅ ]ºÇþ~ü׬IkùºG~{¦–Y2Q¦÷ðä ~ªƒ>þms¶•Û•Á¥‡§ÏpæÌ¸ÿpéý†üý®YÓvÈËJÿ¿>>3Ú4ÝQfØ+ƒË*Õ/ÊÿÃÚümÕeø­cÓg9sjÜ{¨tŽz]þ¾×¬‰[·{é_¸¾”a·L³éŒ2£º ®8¦T½$ÿió¹Õ;•áÆSÓg:snܹ¿tUþþ׬©ûè/”ÁÕŸÚt™º(SßqIiõ;ù8›ßíûÌR_fúT !ÆÕæÒù×_Ëß›5xí#^S†·]T¦ÍÔD™Qµ¹tOùËø?”ÍùÖìZê[¿š>Ýh˜ñý·”öA/Îß›5y+·/Ý3ÿ¶Œ:”i1QfpíçKµîù ›ï­Ù¥Ô·œŸ>Ýh¨ÑÝוöÏÏß›5}¾¨ 6žVJÓ£ÌÂoÇtNÜ+ÿbÍ27Ÿ—<Ý Ô·_4ùííøý±™•î©ï.£îCÍŒ2ÛÎóF¾¶<[½S©7“:Õ` õÍ_™¼Ïaü>ÙÌÊ¿ûE™Ñ°ôÎýH©Vn—ÿæ[3ÞÔ÷Æ/.ûiOføí'ïo¿_6³R­zFéóù2£êÞÒ9î­ùo¸5ç7dnøÂržâð” .ûTþžÙÌÊ£ëžüç¥ôžÏ(SÿàšÉ¯¥¿ÉÖ¤ sÖrÞ°Uú¬Êß;›YytíOþz=pû|E™áMç–j¿çÄ¿¹Ö­Þ±Ôן¹§6l³þYÈßC›Yyl¾¸Ôw]5Qfp屓‡äø7Õš±Õ;–áwN_êÓϨ.Ýÿ$/mfåѵ÷Ûmò &3eú—î }mù¶j‡2¼æ¤¥<¥`i :¥óé×çï©Í¬<¶Õ;•ÁÆÓf3Êô/\ŸÿZÂ̆¥:`ÉÛ÷–Ρ/Ïß[›Yyl«v(ƒ«ŽŸ­(Ó¿`ßü7Κ³•ÛO>RfÝhó ¥}Àóó÷ØfV¶3מ<Q¦ñaùo˜5jƒ‹[ìÓbêÛ¾Qª}Ÿ¿Ï6³Ö–ï_zÃÙÓe—á=dlY7øÚ~‹y ÀTXx¯DÏVf­éÚš]ÊðÖ¯Og”Y(F ¿Òÿ&YcÖ?{ŸÅ:}`ê ¾~@üžÛÌZ[¬½ÿsK}÷uÓeê;¯(ÕÚgÅ¿9ÖœõNý«RÆ£Å8}`jõÏú`üÞÛÌZ[î—•ÑÃwOG”=p{©Öï‘ÿ¦XcÖݰW)£á¢¼`ª†¥{üžñ{p3km±ÎÑo,eØG™A·´|mü›aÍY÷Ø7•2ìnó‰³bÜûQéþñ{q3km±Þ9Ÿ2Ýÿxoü›`ÍYçÈ×N.HÐ4ãn+íõ/Œß“›Yk‹ ®>!eß:.þÅ[sÖùø+ʸ}ï6ì0ó•½z§ø½¹™µ[{¿ÝJýÛ–7ʌTkw‹ñÖŒµ~éäÿ @Ó ¯ò?Çͪ)[û¨×—R—)ÊÔƒÉ0ýE[3Ö^¿{m¾a«Nn˜Gýs>¿O7³ÖëuíòD™…ÿPú‹µæ|þûèûWmÕ‰ sý‰Lǽ5~¿nf­oõŽ¥þþ·—6ÊÔ›o(Õ¾;ç¿XkÆ }óyOû„€&wî/Ã~5ßnfåÑ-|:uÕKeFuéý†øi ØÊí&+ <±Ñ½›J{ÿŸÉß¿›YytýK?µ4Qfpù§ã_œ5cý VmÍ5 §þï/•jÕñ{x3kM¶JGÕæÅ2£îC¥Z¿Gü‹³ù_ïóQÊx¼-×%h”ÁE‡ÄïãͬõØzgí³¸Q¦÷¥ŒQ6ÿëû¦Rêþ¶\ ‘z§½;~?of­¿GêæM‹eF÷ÝRªÕ;å¿(›ëu>ñÊ2î>°×#hžA§tUü¾ÞÌZ“u7¼cq¢L÷´¿‰16ßkø¢2~à¶Å¸@c-ÜS·×ýlüþÞÌZ“°©¿õ¶E™úÞKµêù/Ææwkv-£ï]º˜×"h¬zÓ9¥Z¹}þ>ßÌJ÷¤wm[”éž²wü‹°9ÞªJ½éìż@ãõÏ_™¿×7³²H뻯ۺ(3zðŽÉ›ÓÄ¿›Û .ùÄR\ƒ ÙÆ£Ò=~Ïøý¾™µJ÷Œ÷m]”é}éâoó»þ—ÿi).?ÀB—éÜ_Úûåø}¿Yã·f—2ªî}zQfÔ}°Tkw˼ÍåzŸ{פÞKgtו¥Úwçøý¿YÓ׿pýÓ‹2ýK>?h›Ï-|L_éWKyíþ×ðêâÏfM_çЗ—2=õ(Ó>ü7ãmó·…çßËR_w€ŸÐ;ã}ñg³¦oøÝo<µ(Sßqiü`m·zÇR÷Â叿?iØ-#^&0kðzg¼÷©E™Þþ.~°6^~är\n€Ç1ºï¦ÒÞï9ñ糦®½ÿsKöþŸ(3–jÝîñƒµùZÿ¬,ãåx<Ãë>60kò†›þóÉ£Ìð¦sãióµî1o,¥î/çµx B‘~F0kêzg¾ÿÉ£L×@Ù"®}È/–qµy9¯1À“´K篌?+˜5qí÷(eT?A”JuÐKâis²5»”Ñ]W®2À“ݳ±TkvÍ?3˜­hÞê»®zü(3úÁÕñƒ³9ÙÊíÊðÚ“×à)^qtþ¹ÁlEó6¸èceú__?8›õÏ_™¸®OCïÔ½ãÏfUÃÖ=áme:Ÿysüàlö×ݰW)ãQâš< ãÞC¥sè¯ÄŸ!̪má£éò}e‰2õ TkŸ?8›í-¼aظ÷£àex:Fw^QªÕ;ÅŸ%̪­¾ç;[F™úÎ+ãe³½öÚg—Ñæë“×`+ .>4þþúüôÏw`ÚG¥{ÌïæŸaÌVÌæDû©õÏýHúG;0#>ħùšµ¶j¢Œm1 <]ƒo–1«fp¢ŒýŸ¿Þ”þyÌšQ]:G¾&ÿLc¶b¶&ÊØcóñ×ÀÖýàšR­zFü¹Æ¬š¡‰2öȉðÙ?Nÿ þ‡½ûŽ·ì. ý¿†%TE.EDE5(–‹Â5Š^ý‰zùyQ,gf2-=!½“B’B2éeÒ3)“dÒ é=“63ÉÚ}ïõ½¯s1„ÉÌ9{¯sž½÷z^¯÷ÿp2çYóäe*¬síaѳZ’$IÒ˜Ö¾t×ðò!ç(SQÃ>’RQDÏiI’$IãZ¯›êûþbøîùs”© ¿¶$I’$i.ê=xUÊl¾A>¤e*¨s͡ѳY’$IREjúÅðò!å(SÅÿà~mI’$IÒU4×§ÚÎo ß… BŽ2R[²µ_[’$I’4çu®;*|‚|9ÊTHçêC¢g±$I’¤*V©qȇÃw"ȇŒ£LEøµ%I’$I‘õ^í¥¿0ñƒe* ¶äU©Xw_ô –$I’TñZË?¾A>De* }ù^ѳW’$I’RQ2Õ¶CøŽùp”sõ>˜R¯={%I’$iªö•û†ïI G™q¶pËÔ[sSôÌ•$I’¤ÿ®×Mõ}Þ¿/ÁDÆeFí#°½1z.J’$IÒœÕüÎ_Æïb01;eFH󻟉ž‡’$I’4§õž¼#å ·ßÇ ŸŽ2£bÑV©Xÿ@ô<”$I’¤9¯yòßÅïd0Q>G™Ñ:o~ô”$I’¤Š§šú‡êè½ ò’9ÊŒ€ÚoLEs}ô”$I’¤°Zg|%|7ƒ¼dŽ2# }å~ÑóO’$I’B+j§Ú’W…ïg—ÈQfÈÕv{GJÝVôü“$I’¤ðZçM„ïh—ÈQfÈu®?:zîI’$IÒPT4Ö¥Ú²×…ïi—ÄQfˆÕ÷þ¹”Š^ôÜ“$I’¤¡©}Ñöá»ä%q”bÝ[NŽžw’$I’4\µòTÛñÍáûä%p”Rõ>˜RQD;I’$IºÚ—ï¾³A^G™!Õ½ë¼è9'I’$IÃY§™j;¿%|oƒ|@Ž2C¨qÈoF8I’$IêÚ—}#|wƒ|@Ž2C¨{ßeÑóM’$I’†»vÝ»eH£ÎQfÈ4ûHôh“$I’¤‘¨}É.á;äp”2Ý{.Šžk’$I’4:ŸÄ´ÃÃ÷8Èûä(3D‡þNôH“$I’¤‘ª}Ñöá»ä}r”"Ý{.Œžg’$I’4R­gRmû7„ïs÷ÁQfH4Ú&z–I’$IÒHÖ>QøNye†D÷®ÑsL’$I’F²¢±.Õ–½6|¯ƒ|†e†€Ÿ’‘$I’¤Áj7?|·ƒ|†e†@÷¶Ó¢ç—$I’$tEýÉT[òªðýòp” VßógR*zÑóK’$I’F¾Ö9ÿ¾ãA>Ž2Á:«¿=·$I’$i,*j§|ñ+Â÷<ȧÉQ&Pm—·¦ÔmGÏ-I’$I›Z§9|׃|šeµ¯Ø;z^I’$IÒXU¬»?å ·ß÷ ŸG™ µí_ŸR+žW’$I’4v5ÿTøÎù48ÊiŸ¿(zNI’$IÒXÖ{五ϟ¾÷A¾ Ž2m5õ*I’†µ¢ùt*Ö?˜Š§îú¾Þã·§ÞCWÿ°'ïLÅSw§¢þT*šë£ÿ§K’4Uãðßßý`bãe4Oþ»èù$IªRíÚÔA¥{ÏE©sýÑ©}Ùî©uÆ?¥æwþ25ŽüƒÔ8øC©¾Ï{Sm×·§Ú²×–ó/‹ ·Hµe¯Kõ=~*5Ú&5ŽþãÔ<ù³©uÞDj¯Ü3u®ÿvêÞ{I*ž~8ú«#IÓºw¾ûA¾ Ž2smþ¼Ô[sSô|’$SÝvê=ñ½Ô½ýŒÔ^¹GjúÅ©¬ïõžT[²uü³oSm•ê{ýljõG©uÆW¦^„ß½ãìT<óhôWV’4âÕ÷{üs&^œ£Ì\Áÿýè¹$IåŸxyàŠÔYu`jþ¥Ô8âc©¾û»R¾`óðçÛl©íøæ©ggëì¯OýtMï±[Rêu£ÿKH’F¤Î dž?Ë ßG™9Ö½ã¬è¹$I&ßÏ2ùë=“?ùÒ<ᯧ~ê%_°Yøsl(,~ÅÔ¯DMjºwž›R»ýŸK’4¬õºÏþFô³ &6ÌQfÕ÷ü™”Š"z,I’†­N3uï»4µ/Þ15ŽÜ6Õvxcø3k¤l÷Ò©÷â´ÎýÔ½kÅÔ¯sI’ô_µ¯Ø'þYæ(3‡&Ü\’¤¢õÌÔOx´V,œzO¾S%ú5v?Isä¶SÏÝâ釢ÿsK’¢k×Rm‡‰>ÁÄs”™#“Ÿf19 $IÕüxéîÍ'M½€·¾÷Ï'ÏÜ94ÿ%©~ÀSûÂ¥S/C–$U³öù‹âŸI0ñÃeæHëÌŽžC’¤9¬xꮩŸÔ˜ü‰É_¯‰~ñ¬ÉwóLþš˜â–¤jUÔŸLµÅ¯ AþŽ2sõ1ØþuN’Æ»v=u¿wfjú©¶Û;ãŸ=lÜ‚ÍR㰤ε‡Mý:™$iük-ÿ|üó&~£Ì\|‘} ¶$e“Ë|çú£Sã¨?Jù¢—‡?oèOmÉÖ©µü ©÷èѤ$I³Xï±[§þÁ<ú¹ùó8ÊÌî­Ë£ç$©ÌOJºuùÔÇTû1èñSßïýϾ˜ßÇlKÒX6ùæÑÏÈŸÇQf–Õv}[J½nôì‘$ R¯;õiIÍ“þvêÅíÑÏæàù½ã›RûüíRQ{"úOŸ$©Äº·ŸþŒüyefYû¢í£çŽ$©ÏzÝ’Z§9Õv|søó„“? Õ:ãŸR±þÁè?Ž’¤2*ŠTßãÝáÏÈŸã(3›n™Š|MôØ‘$ͤn+un8&5ùpüs„á±pËÔüîg¼¸_’Æ ö{Ç?W`âYŽ2³¨yì'¢ç$iškïI­sþ}ê×V¢Ÿ ±ù/™zŸÐäŸIÒhV4ŸNµ¥¯Ž¦À„£Ì¬êÞqVô¼‘$m¬¢÷ì»bŽýDÊlþÜ`„,Ü"5Oþl*žy$úO±$©&55üYŽ2³¦¶Ë[½àW’†ùW”V‘ê{þtøó‚·ø©uö×SÑ\ý§Z’4ƒ&â1_°Yüs„Êk8ÊÌŽÉOl$ ß+·/Ù%Õvú±ðçãeò×Þ:×6õIIÒhÔ8êŸÐp”™ó_’е÷FÏIÒsµÇSkÅÂT[öºøgc­¾ÿ/§ÞWFÿ‘—$M£î]+ŸÐp”™…/êá¿=_$I“ǘu÷§Öé_šú“èg²`³Ô:õRÑXý- IÚDõ½>þ¹Aª2G™YйéøèÙ"I•®¨?™Zg}-åÛ½,ü™@Å¥éº#£¿$I©³ê ðçÕæ(S²ÉOfôl‘¤jÖi¤ö%;§Ú²×†?à¿4ŽúÃT<ýpôw‡$iCµë©¶ýëßd•å(S²ÖòÏGIª^E/unüNªíöŽðçlHmékRgÕÑß)’¤ Ô:ó«áÏ ²Êr”)Yïþ•Ñ3E’*U÷ÎsS}ß_Ÿÿ0#>–ŠõFÛH’žWïÉ;R>^ø3‚¬’eJTßý]> S’æð/P“/Vžý0S“?&ß½õ”èo!IÒójú;áϲJr”)QûüEѳD’Æ¿n;µ/ÞÑK|yÍþzê]’¤ø:7þ\ «$G™²ÌŸ—Š§îŠž%’4Öuï¹0Õ÷zOü̇’Ô÷úÙÔ[sSô·–$©ÛNµ~4ü¹@V9Ž2e}!þè1"Ic[ñÌ£©yü§Âg=̆ڒWùèlI‚Zçü{ø3¬reJÒ¹ê€è"IãWQL}bÍä'×DÏy˜m­å_˜ú—ZIRLÅSw'{1ùs”)ÂÍS‘¯‰ž!’4VMÎÕÆQ?ãa5Ú&Ï<ýí'I•­qÄGßd•â(SÆñˆFÏI«:7Ÿ˜jÛ¿!|¾C„ÚÎoI½¯Šþ6”¤JÖ½å»áϲJq”)AçšC£g‡$EEs}jžøéð¹ám•:×ý-)IÕ«×™:އ?HUá(3¨…[¦¢þdô褑¯wÿÊTßý]ñs†Hëì¯O½[I’4wµV, Ÿÿd•á(3èðÈm£g†$v½njûŸ)_°YøL‡aÔ<éÿ÷`IšÃŠõL½74zþ“U‚£Ì€:×=3$id+jO¤Æá¿>ËaØ5ýÝ©_ï“$ÍM£þ(|ö“U‚£Ì ¶{™¿ IRŸõ\•j»üøY#¢¾ï/¦â釢¿u%iì+kSkÅ‚ð¹OV Ž2ƒ|ñŽúÃèy!I#YçꃧÛÑsFMm×·¥Þ“wD KÒøÔi¤Þý—§öÊ=Sóø¿Jõ=ÞòùóÂç=Ye8Ê  síaÑ#D’F«N35Oþ»ðù £¬¶ã›RïÑ¢¿›%i$+žº+uV‘Z§)5ÚÆ?‘¢9ÊôkÁ橨==S$idšüµ‹úþ¿?¿a Ô¶Cê=tMô·µ$ ý {»7Ÿ”Zçü[j|ó·SmÉÖáóòp”é÷ wèïDÏI™zknžúµ‹è٠㤶ôÕ©{ߥÑßÞ’4ͧS÷ÞKR{å©yÂ_§ÚnïŸÓOƒ£LŸÚ—ï=w$i$êÞsaª-{møÜ†±´ø©{÷ùÑßæ’4·u[©÷À•©}ÅÞS˜úž?í=0¤Qå(ÓùóR±îþèQ$IC_ç¦ü®6̶E/OÝ»/ˆþv—¤YýèÎßñÒ8r”éCý€FÏ%Iú&|سæð'fî½8úÛ^’®xúáÔ½uyj­X˜Gn›jÛ¿>~ÆÂÄìq”éCû¥ѳJ’†·¢—Z§ýcø¬†ª©-}Mê=tuô¤iW4×§î]+Rû¢RãÛ’j;¿%|–B>ÇeúÐ{äúèù%IÃYQ¤ÖòχÏi¨öaƧ2IÂzÔ[sÓ÷?Žº¾ßûýD-L8ÊÌXmçŸZ:$I/¨è¥æ‰ŸŸÓPuµÞ˜zO|/z"HªrE‘zß–:«¿5õÓ³“¯È·{iø|„|9ÊÌPó”ÏE8I¾zÝÔ<ñÿ„ÏhàY“;ù^IŠyÌÂç ä#ÂQf†&‡$é™þ&|>?¨¾÷ϧ¢±6zBH³ŠÖ3©{ï%S/ôŸú8ê½Þ>ï aŽ23±ÝËRj×¢ç $ ÙAæ¯ãç3°AoþVJfô¤4NïY°Yølƒ|Œ8ÊÌä‹uÄG£Ç¢$ OEá # yì'§Þù$I›|ÌßKëŽzösà¯Mý£tô ƒ|Ì9ÊÌ@ûн£G¥$ M­³ÿ5|.ÓÓ:ëkÑ#CÒU<óè³ï9o~jþû©¶ìµá³ ò r”™Þã·GÏNIŠÚWî>“™é\u@ôèU+ÿá÷ÀÌŸ>—€ÌQfºj»¾-z”JÒPÔ¹áØä™#há©{׊è"iŽßÓ8h›”/Ü2~iCe¦©yòg£Ç«$…×½û‚”o÷Òð™ ô§¶ìu~òW³Š§úï£>ì¦|ÑËÃg M›£Ì4un:>zÞJRh½G®Kµ¥¯ŸÇÀ`ê{üT*êOEI}TäkR÷¶ÓRkÅ‚©!©mÿúð™dq”™Ž›¥¢þdô –¤°ŠÚ©¶Û;âç1PÞ_{ÝèÑ"icy ¤*p”™†úŒÉ’W¯“ßüíðY ”«uîFOIÿU¯ë=00QMŽ2Ó0ù1q’TÕZg|%|³`þ<¿ž-å=0@þG™i˜|±¥$U±ÎõG‡Ï``öÔ–¼*õÖÜ=j¤±®h¬{ö×.Þ15ŽÜ6Õvxcø÷> G™MÙî¥)µëѳ\’B^ìë_î "/þm®9ÒxÔm§ÞCW{ ¦ËQfS_ C>=Ú%iΛ|¹ym×·‡Ï``n4û‹è±#æ{`¹>u®>$5Oþ»Tßç})_°yø÷3G™M˜ü=OIªZÍc?>¹ÕYuPôè‘Fç=0“¿†´ô5áß·@6òe6¡{÷ùÑó_’æ´Î5‡†Ï^ Àv/›úµEIiêWú¾ÿqÔÇ~"Õv|Sü÷(Æ‘£ÌÆxŸŒ¤ŠUwá0ùÓÉeV¥ŠúSSo_°$5ŽúÃTÛñÍáßKù&8ʼ˜ù/IEc]ô³E’f¿^7Õ÷û¥ø¹ •ÆÁ¿15¤¡}Ìä¯!­:ðyï±ÏÙÈq”yõ}Þý¨‘¤9©½rÏð™ §ö¥»F(iªâ©»^𘗅ä%p”y­å_ˆ~öHÒ¬W<óÈÔ¯)DÏ\`Hm÷R“­9¯xú¡Ô½uyj­X˜Gn›jË^ÿ½01;e^D纣¢ŸG’4ë5û‹ðy ·ú>ïM©ÓŒWÓŠÆÚÔ½óœÔ¾pijýñTÛéGÃÿÌäsÈQæEkï~FIÒ¬6ù—àèY Œ†Ö¹ÿ=²4õ:ßÿ8êæÉŸõ€ G™ ªíôcÑ,IšÝ:ÍTßãÝáó 6O½‡®‰ž\¥Š^ê=vKê\{xjúÅTßÿ)_¸eüŸe€‰áâ(³Ícþ4ú1&I³ÚäË;£g-0‚¿ÆÔmE/Ê{`¶}øŸY€|8Êl@û⣟k’4k­gRm‡7†ÏZ`ôL.ÜRÑ|:uï½$µWî1õqÔµÝÞþg QŽ2нkEô³N’f­ÖŠásQ~©zy @šMŽ2/4^*뢒4+ùšT[òªøY Œ¬ú~ïO©×gšŠ"õ»5uV+µNý‡T?àƒS‹ýg cŽ2/Pß󧣇’4kµNÿRøœF_û²oD3•PñôÃ/xÌÂÿläã(ó“¿+IãX±ö^ÿâ ”cñ+R±öžè±¦¾Oìùï™ú5¤è?G$G™h¯Ü3ú™)I³Ró”Ï…ÏX`|4ŽþxôXÓ‹Õm§Þƒ«RûÊ}SóÄO{ ÀÄðr”yî}—E?F%iVÞ%“/Ú*|Æã¥{óIÑãM“ïyüöÔ¹îÈ©_Q­ø«)ßîeá6ȦÅQæ…/ùm=ýh•¤Òó‰KÀl¨íüãS¬¹«xæ‘Ô½õ”Ô:o"5ÿ½T[öÚð?d}s”yžúî?ýœ•¤òk×¼¼˜5­³¾=åÆ6ïÈÆž£Ìó¿ßþ“èg¯$•^ûнÃç+0ÆlžzÞ=êF¿^'õÖÜ”:«xö×ö{Êlÿ߀4›ežgòã%i¬êuS}÷w…ÏW`¼5ýÝèi7rO?ôìÇQŸýõÔ8h›”/zyøG²9ç(ó<›Nˆ~>KR©unüNølªarÞhõ©{ç¹SÿØ8rÛTÛáGÂÿ{ G™çé=~[ô3[’J­~ÀÃg+P µ]ÞšR+OUoê=0÷\”Ú—ì’šÇ~"Õv}[ø†—£ÌYôò©ó—¤q©÷àªøÙ TJëÜÿL•{ÌëSgÕ©ùÝÿ›ê{ÿ¼÷ÀfÂQæ9õ~%ú±.I¥Ö<ù³á³¨˜í^–е÷¦±Ìä¯!ö?½€4(G™çLþë†$ÓÏ×–l>[ê™üèæq¨h¬{öã¨/Þñ¹÷À¼1ük @6vežÓ^¹Gô³_’J«³ê ð¹ TÔüyS¿>9RuÛ©÷ÐÕSœ<*Õ÷zÏÔÿð¯%iÜ9Ê<§{÷ùѤҪïÿð¹ TWã§¡­×M½57¥Îê#Rëô/=ûqÔ · ÿšU’£ÌsŠü±è¿"HR)õ¹>|¦to;5 å{`¿"ükùse&?Âq§‹þû‚$•VkùÂç*@}ÏŸžút¢Ð÷Àìø¦ð¯äá(3ùE8â£súIšµÚõT[öÚð¹ 0©sÕþ³7ï¼€‰Ñç(3‘¥ÖY_›½¿0HÒÖ¹þèð™ ð_&R¥h>]Î{`½!u®>$5Oþlªïû )_°yøÿ?Èä(3ù¯8«ü/ ’45Žüƒð™ ð|­ó&{Ìä¯!ù @&Æ“£ŒO^’4&õ§|‚0|m•Šu÷½øìj®ö=0“¿†tì'¼€T%Ž2“Ÿ¼´îþ9\›$ivšü©¿èy °!Í?ýßï™ü8êUz L8ʤ|»—¥Tôb7)I*¡©zž©2ÿ%©¾ï/¦|áñÿ[`bxTþ(Sßëg£÷(I*åc`ýêd#¥òG™ÆÑÞ¥$ià|êd#§òG™Ö™ÿ½KIÒÀ5ýdø<²©üQ¦}å¾Ñ»”$ V·•jK_>O€lF*”éÞyNô:%IÕ½çÂðY d3Vù£LñÔÝÑû”$ TëÜÿ Ÿ¥@6cÕ>Ê,Ü2¥^7zŸ’¤ªïÿøy ¤™ªôQ¦¾Ç»£w)I¨¢þTÊl>O€lÆ*}”i|ëEïS’4P›NŸ¥@Ö—JeZ§)zŸ’¤jþåðY d}©ôQ¦½rÏè}J’ª¾ÿ/‡ÏR ëK¥2Ý[NŽÞ§$©ÿZyÊl>K€¬/•>Êô\½RIRßuï:/|ŽYß*}”)Ö?½SIRßµ/X>G€¬oÕ=Ê,Ø,¥^7z§’¤¾kýñøY ¤~Uö(SÛù-Ñû”$ Tm—·†ÏR ë[e2õ~%zŸ’¤¾+j‡ÏQ He2£ÿ8z§’¤¾ë~ïÌð9 d©ìQ¦µü Ñ;•$õ]û¢íÃç( ¤²G™ö…Ë¢w*Iê»æñŸ Ÿ£@6Êe:×½SIRßÕ÷û¥ð9 d©ìQ¦{ç¹Ñ;•$õWÑKùâW„ÏQ He2½57G¯U’ÔWÅÚ{Âg( ¬²G™¢±.z¯’¤¾êÞ~zø ²Uó(³èåÑ;•$õ]{åñsHƒªäQ¦þŸŒÞ©$©ïZ§9|ŽÙÀ*y”iü¡èJ’ú®qôÇÃç( ¬šG™£?½SIRßÕ÷yoø²Uò(Ó<éo£w*Iê»Ú’­Ãç( ¬’G™Ö™_Þ©$©¯ŠÚá3ÈJQÉ£LûÂeÑ{•$õUïáÕá3ÈJQÉ£Lçªý£÷*Iê«î÷Î Ÿ¡@VŠjen<.z¯’¤¾ê\shø ²RTò(Ó½óÜè½J’úª}Ñöá3ÈJQÉ£Lï¡k¢÷*Iê«ÖéÐñs® IDAT_Ÿ¡@VŠJeе÷DïU’ÔWÍc?>C€¬Õ<Ê4ÖEïU’ÔWoþvø ²RTï(³p‹”Š"z¯’¤¾ªïó¾ø9 ¤2Tî(SÛñMÑ;•$õ]m—ÿ>G€¬•;ÊÔ÷ü™èJ’ú®¶äUásÈJQ¹£Lã m¢w*Iê¯^'åóç…ÏQ +EõŽ2GþAôZ%I}UÔžŸ¡@VšÊešÇ~"z¯’¤¾ê=yGø ²ÒTï(sâ§£÷*Iê«ÞëÃg(•¦rG™Öò/DïU’ÔWÝû. Ÿ¡@VšêeÎúZô^%I}Õ½ë¼ð d¥©ÞQfÅ‚è½J’úª{ëòð d¥©ÜQ¦}ÑÑ{•$õUç†cÃg(•¦zG™•{DïU’ÔWk Ÿ¡@VšÊe:«ŠÞ«$©¯ÚWî>C€¬4Õ;Ê\wTô^%I}5ù“~Ñ3ÈJS¹£L÷æ“¢÷*Iê«ö¥»…ÏP +MõŽ2wœ½WIR_µ/Ù9|†Yiªw”¹÷âè½J’újòÓã¢g(•¦rG™Þƒ«¢÷*Iê«ö…KÃg(•¦zG™57GïU’ÔWíó…ÏP +MåŽ2ÅÚ{¢÷*Iê«ÖŠá3ÈJS½£Ìú£÷*Iê«Öyá3ÈJS½£Ì3DïU’ÔW­ Ãg(•¦zG™ü±è½J’úª}Áâð d¥©ÞQ¦öDô^%I}Õ¾pYø ²ÒTï(S*z¯’¤¾j_¼cø ²ÒTï(Ó\½WIR_µ/Ý5|†Yiªw”i=½WIR_µ/ûFø ²ÒTî(“Úµè½J’úª}ù^á3ÈJS½£L§½WIR_u®Ú?|†Yiªw”é¶£÷*Iê«Îµ‡…ÏP +MõŽ2½nô^%I}Õ¹á˜ð d¥©ÞQ¦(¢÷*Iê«î-'‡ÏP +MµŽ2óçEïT’ÔwÝ;ΊŸ£@*KµŽ2 6Þ©$©ïº÷\?G€T–jen½SIRßõ¼*~Ž©,Õ:Êl÷ÒèJ’ú®÷èñsHe©ÖQfÁfÑ;•$õ]ïÉ;âç(ÊRÁO_êEïU’ÔWÅ3„ÏP +MõŽ2ÝVô^%IýÕÊÃg(•¦zG™V½VIRßM~Š\ô²RTî(S4ÖFïT’Ôwµe¯ Ÿ£@VŠêeòÇ¢w*Iê»Ú®o Ÿ£@VŠêež~(z§’¤¾«ïýóásÈJQ½£ÌÚ{£w*Iê»ÆAÛ„ÏQ +EåŽ2½'ïŒÞ©$©ïG|,|ŽY)ªw”yì–èJ’ú®yÜŸ‡ÏQ +EõŽ2Þ½SIRß5Où\ø²RTï(óÐ5Ñ;•$õ]ëÜÿŸ£@VŠêe¸"z§’¤¾k_ºkø²RTî(Ó½÷’èJ’ú®síaásÈJQ½£ÌÝçGïT’ÔwÝ[—‡ÏQ +EõŽ2·Ÿ½SIRßuï»4|ŽY)*w”éÜt|ôN%I}×{ìÖð9 d¥¨ÞQæÚãw*Iê»"_>G€¬•;Ê´¯Ø'z§’¤þëuR>^ø,²Uï(sñNÑ+•$ TmékÂg) ¬rG™ÖŠÑû”$ T}w‡ÏR XõŽ2gþsô>%IÕ8ø7Âg) ¬rG™æ)Ÿ‹Þ§$i šÇüYø,²Uï(sü_EïS’4P­S¿>K€l`•;Ê4Žþãè}J’ª}ÁâðY d«ÞQæ°DïS’4PU†ÏR XåŽ2õƒ~=zŸ’¤êÞrrø,²Uï(³Ï{£÷)I¨Þý—‡ÏR XõŽ2»ÿDô>%IUK€l`Õ;Ê,~eô:%IW[úêðy d©ÜQfRê¶£÷)I¨ú^ï Ÿ¥@6JeŠü±è}J’jrxGÏR H%2½Ço‹Þ§$i š'þŸðY d©æQæþË£÷)I¨Ö¹ÿ>K€l •<Êto?=zŸ’¤j_¹oø,²Tò(Ó¹î¨è}J’ª{ËÉá³ÈRÉ£Lûò½¢÷)I¨Þƒ«Âg) ¤šG™óEïS’4PÅÓ…ÏR H%2­3¾½OIÒ`õº)_°yø<²¾Uò(Ó<áo¢×)I¸ÚÎ?>O€¬o•<Ê4ŽúÃè]J’®~௅ÏS ë[52m½KIÒÀ5ûóðy d}«äQ¦¾çÏDïR’4p­³ÿ5|žYß*y”©íøæè]J’®}Å>áóè_%2ùÂ-£w)I¸îm§ÆÏS õ«šG™‰,­g¢÷)I¨Þ£7„ÏR ë[u2OݽOIÒ@Íõá³ÈúVÙ£LïþË£÷)I¸ÚÒW‡ÏS ëKe2Ý[NŽÞ¥$iàêû¼7|žY_*{”é¬:0z—’¤k¹mø<²¾Tö(Ó¾`qô.%I×:õ‹áóÈúRÙ£Ìä"#I£^û’Ãç)õ¥²G™æ1½KIÒÀun:>|žY_*{”iü¡è]J’®÷Ð5áóÈúRÙ£Lý?½KIÒÀuáóÈúRÙ£LmÉÖÑ»”$•RmÙëÂg*ÍXe2“R»½KIÒÀÕ÷ÿåðy d3Vé£L±öÞè]J’®yì'Ãç)ÍX¥2½®ŒÞ¥$iàZg=|žÙŒUú(Ó½uyô.%I×¹ê€ðy d3Vé£Lçꃣw)I¸îç„ÏS ›±JeÚ,‰Þ¥$iàŠ§î Ÿ§@6c•>Ê4Oùûè]J’¯×Iù‚ÍÃg*ÍH¥2#ÿ z•’¤RªíöÎð™ d3Ré£L}Ÿ÷EïQ’TJÃ>>S€lF*}”©mÿúè=J’J©µü á3Èf¤ÒG™I©]‹Þ¥$iàÚ—}#|žÙŒTþ(Ó{üöè]J’®{ÛiáóÈf¤òG™î]+¢w)I¸Ésô<²©üQ¦³úˆè]J’¯ÛNùÂ-Âg*M[å2í —F¯R’TJõÝ"|¦Ù´Uþ(Ó<åï£÷(I*¥Æ Ÿ©@6m•?Ê4ŽÜ6z’¤Rjöá3Ȧ­òG™ú¾¿½GIR)µ/ß+|¦Ù´Uþ(SÛþõÑ{”$•R÷{g†ÏT ›¶Êe&¥v-z—’¤ë=ygø<²is”™ÈRï‰ïEïR’4x½nÊn>S€lZe&²Ô½kEô*%I¥Tßë=á3ȦÅQf"Kk¾½GIR)5ùÓð™ dÓâ(3‘¥ÖyÑ{”$•Òä<‹ž©@6-Ž2Yjÿ©è=J’J©sýÑá3ȦÅQf"Kõƒ~=z’¤Rê=|møL²iq”™ÈRm§Þ£$©œÚµTåyùq”™4ÞÔ"#IãPm×·ÇÏU mŠ£ÌszݽGIR)5ŽøXøL²Mr”yN÷ö3¢÷(I*¥Ö™_ Ÿ©@¶IŽ2Ïi_¹oô%I¥Ô¹úàð™ d›ä(óœÖYÿ½GIR)uï»4|¦€¯@¶IŽ2ÏiógÑ{”$•RQ2|¦Ù&9Ê<§¾ßû£÷(I*­Úo Ÿ«@¶QŽ2Ï©-{]ô%I¥Õ8äÃásÈ6ÊQæyŠÆºè=J’J©yÊ߇ÏT Û(G™çé=r]ô%I¥Ô^¹gøL²r”yžîÍ'EïQ’TJÝ;Ï Ÿ©@¶QŽ2ÏÓ¾x§è=J’J©Xÿ@øL²r”yžæw?½GIR9Eª-Ù:|®Ù‹r”yþãG¯Q’TZõý?>W€ìE9ÊW€ìûe6¢sõÁÑ;”$•Vó¸?Ÿ«@ö}Ž21ùi%’4.µ/\>W€ìûe6öÅ9âcÑ;”$•V÷ÖåásȾÏQf#j»½#z‡’¤Ò*ÖÞ>W€ìûe6fþKRj×¢÷(I*§¢Hµ¥¯‰Ÿ­@šä(³ ½‡¯^£$©´(|®ÙG™Mè\wdô%I¥ÕZþ…ð¹ dSe6¡uοEïP’TZ«öŸ«@6ÅQfS_ #·Þ¡$©´º÷]>W€lŠ£Ì&Ôv}[ô%I¥U4ŸNùüyá³Èe6iþ¼T4×GïQ’TZµÝÞ?[€ä(3 ½ûWFïP’TZ£þ(|®™£ÌttV½CIRiµÎ›Ÿ«@æ(3­Ó¿½CIRiun<.|®™£Ì´¾H‡þnô%I¥Õ{ìÖð¹ dŽ2ÓQÛñMÑ;”$•W¯›òE[…ÏV¨º†£Ìôùšè5J’J«¾ßûÃç*T]ÃQfzºwŸ½CIRi5¿ûÃç*T]ÃQfzÚ—ï½CIRiµ¯Ø'|®@Õ5e¦§yÊç¢w(I*­Þý+Ãç*T]ÃQfzêýzô%IåÕ®¥|Áfá³ò s”™¦ÚÒW§TÑk”$•V}¯÷„ÏVÈ+ÌQfе÷FïP’TZÍãÿ*|®@^aŽ23нõ”èJ’J«}énásò s”™ö‹£w(I*­îÝç‡ÏUÈ+ÌQfšÇüiô%I¥U4Ö¥|þ¼ðÙ Uå(3õÝß½CIR©Õv{gøl€¼¢efbþ¼T4×GïP’TZÍcþ,~¶ÀD59ÊÌPïþ•Ñ;”$•VûÂeásòŠr”™¡ÎUûGïP’TZÝï>W ¯(G™jžò÷Ñ;”$•V‘¯ Ÿ«W”£Ì ÕüµèJ’J­¶ó[Âg+ää(3S‹_‘Rыޡ$©´Gn?[`¢zeúÐ{òÎèJ’J«µbAø\€¼‚eúйùÄèJ’J«{ËwÃç*ää(Ó‡ÉU–¤q©Xw_ø\€¼‚eúù¢ýñèJ’J­¶ýÂg+äã(Ó‡Ú®oÞŸ$©Ô‡}$|¶@^1Ž2ý˜?/µÑ;”$•Vë쟭0Q-Ž2}êÞ}Aô%I¥Õ¹á˜ð¹ yÅ8Êô©}ÙîÑ;”$•VïñÛÃç*äã(Ó§æ ½CIRyEª-Ù:|¶@^!Ž2}ªïýsÑ+”$•Zãàߟ­Wˆ£L¿l–R»½CIRiµNÿrül€‰êp”@ï+£w(I*­Îµ‡‡ÏUÈ+ÄQf«öÞ¡$©´z\>W ¯G™4Oþlô%IåÕë¤|ÑVá³òŠp”@}ÿD¯P’Tj“s-z¶@^Ž2ƒØîe)uÛÑ;”$•Vó”ÏÅÏV˜¨G™õ½!z‡’¤Òê\u@ø\€¼"eÔY}Dô%I¥Õ{ðªð¹ yE8Ê ¨uÆW¢w(I*¯N#å ·Ÿ­W€£Ì _ÀC>½BIR©Õ÷y_øl€¼eT[²uJE½CIRi5¿û™ðÙ y8Ê” ÷äÑ;”$•–—ý@6'eJйáØèJ’J«÷ðµásò p”)A묉ޡ$©¼ºí”/Ú*|¶@>æeÊø"~ó·£W(I*µú¿>[ sŽ2¥½ì·½CIRiµNûÇðÙ ù˜s”)IïñÛ¢w(I*­Îêo…ÏUÈÇœ£LI:×½CIRiõ»%|®@>æeJÒ:㟢w(I*¯¢Hµ¥¯Ÿ­1G™²¾ÿFô %I¥Öøæo…ÏVÈǘ£LIj‹_™R¯½CIRiµÎú—ðÙ ùs”)QoÍMÑ;”$•VçÆï„ÏUÈǘ£L‰:×½CIRikï Ÿ«1G™µNûÇèJ’J­¶ÃÃg+äcÊQ¦Dõ-z’¤Rkñ±ðÙ ù˜r”)Óv/K©ÛŽÞ¡$©´Z+ÄÏV˜OŽ2%ë=r]ô%I¥Õ½íÔð¹ ù˜r”)YçêC¢w(I*­"_>W SŽ2%k-ÿ|ô%I¥VÛå­á³ò1ä(S²úþˆÞŸ$©Ôšßþßá³ò1ä(S¶…[¦ÔmEïP’TZí‹vˆŸ­01~efAï¡k¢w(I*­î]ç…ÏUÈÇ£Ì,è¬:0z‡’¤Ò*ë’gd¥s”™Í“?½CIR©Õ÷xwøl€|Ì8ÊÌ‚ú~¿½?IR©5ÿTøl€|Ì8Ê̆…[¤ÔiDïP’TZí•{ÄÏV˜/Ž2³¤÷À•Ñ;”$•V÷¾ËÂç*äcÆQf–´¯Ü7z‡’¤òj×§~ 0z¶@>FefIó¤¿^¡$©Ôêû¼/|¶@>FefI}Ÿ÷FïO’TjÍï~&|¶@>FefË‚ÍRjåÑ;”$•VgÕñ³&Ƈ£Ì,š|1¦$K½‡¯ Ÿ«G™YÔ^¹gô%IåÕm§|ÑVá³ò1á(3‹š'üMô %I¥V?ðWÃg+äcÂQfÕ÷zOôþ$I¥Ö:íÃg+äcÂQf6ÍI*šë£w(I*­ÎêoÅÏV˜Ž2³¬{׊èJ’J«÷Ø­ásò1á(3ËÚm½CIRyEª-}Møl€| 8ÊÌöøè?Ž^¡$©Ô‡þNøl€| 8Ê̲ÚN?½?IR©µÎýðÙ ùp”™Åú¢w(I*­î­§„ÏUÈÇ€£ÌèÜ|bô%I¥UäkÂç*äcÀQf´Îþzô%I¥VÛíá³òç(3_äoþVôþ$I¥ÖüÎ_†ÏVÈGœ£Ì¨-~eJ½nô%I¥Õ^¹gøl€|Ä9Ê̑ޣ7FïP’TZ½® Ÿ«8G™9Ò¹úèJ’Ê«ÛNù¢­Âg+ä#ÌQfŽ4Où\ô %I¥V?è×Ãg+ä#ÌQfŽÔ÷ý…èýI’J­uæWÃg+ä#ÌQf®,Ø,¥V½CIRiun<.~¶ÀÄèr”™CÝ{/‰Þ¡$©´Šµ÷†ÏUÈG˜£Ìj_ºkô%I¥VÛéÇÂg+ä#ÊQf5ýdôþ$I¥ÖøöŸ„ÏVÈG”£ÌªíúöèýI’J­}ñŽá³òå(3ÇŠgÞ¡$©´º÷\>W QŽ2s¬{ëòèJ’Ê«]Kù‚ÍÃg+ä#ÈQfŽµÎ›½BIR©Õ÷ýÅðÙ ùr”™ë/øá¿½?IR©µ–>|¶@>‚eæXmékR*ŠèJ’J«síáá³òä( ÷øíÑ;”$•VïñÛÂç*ä#ÈQ&@gõ·¢w(I*¯¢Hµí_>[ 1Ž2Z§þCô %I¥Ö8â£á³òã( ~À¯DïO’Tj­ Ãg+ä#ÆQ&ÂÂ-Sê4£w(I*­î÷ÎŒŸ­01Ze‚ô¸2z‡’¤Ò*k“çd3â(¤}ù^Ñ;”$•Z}ÏŸŸ­G™ Íãÿ*z’¤RkžøéðÙ ùq” RßãÝÑû“$•ZçªýÃg+ä#ÄQ&Êüy©¨=½CIRiõ^?[`bt8ÊêÞqVô%IåÕë¦ÚâW†ÏVÈG„£L ö‹£W(I*µÆ!Ÿ­G™È/þ‘ÛFïO’Tj­³¿>[ Ž2j;üHôþ$I¥Ö½ù¤ðÙ ùˆp” V¬½'z‡’¤Ò*ž~8|®@>"e‚un86z‡’¤R«íú¶ðÙ ùp” Ö:ó«Ñû“$•Zó¸?Ÿ­G™èÿ(z’¤Rk_¶{øl€|8ÊD[ôò”zèJ’J«wÿåñ³&†Ÿ£Ìè=¼:z‡’¤òê¶§Îѳò!ç(3:W½BIR©5ùÍðÙ ùs”Í“þ6z’¤Rkóïá³ò!ç(3ê{ÿ\ôþ$I¥Ö½í´ðÙ ùs”ó_’ŠæúèJ’J«h¬šmáó&†—£ÌèÞ}~ô%I¥6ùS€Ñ³ò!æ(3$Úï½?IR©5Où\øl€|ˆ9Ê ‰æ·ÿwôþ$I¥ÖYý­ðÙ ùs”µÄe†H±þÁèJ’J­¶ó[Âg+äCÊQfˆto>)z’¤Rkógá³ò!å(3DZçü[ôþ$I¥Ö¾ìá³ò!å(3D‡þNôþ$I¥Ö{pUøl€|H9Ê ‘Ú’W¥Tô¢w(I*¯^'Õ¿2|¾@>„e†LoÍÍÑ+”$•ÚäOFÏVȇ£Ìé\shôþ$I¥Ö:o~øl€|9Ê ™æ)½?IR©uï8+|¶@>„e†L}¿_ŠÞŸ$©ÔŠæú”/Ø,|¾@>de†ÍÂ-Rj×¢w(I*µú>¯01\e†P÷¾K£÷'I*µÖ©_ Ÿ­G™!Ô¾l÷èýI’J­sý·Ãg+äCÆQf5û‹èýI’J­Xw_øl€|È8Ê ¡ÚnïŒÞŸ$©ôj»¼5|¾@>De†T‘?½?IR©Mþ`ôl€|ˆ8Ê ©îm§EïO’Tjí+öŸ­G™!Õ:o~ôþ$I¥Ö{xuøl€aâ(3¤‡ÿ~ôþ$IåÖë¦ÚÒW‡ÏWȇ„£Ìª-}MJE½BIR©5ÿ½ðù ùp”b½ÇoÞŸ$©ÔÚç/ Ÿ­ G™!ÖYý­èýI’J­{×yá³ò!á(3ÄZ§~1z’¤rkå)_°yø|€|8Ê ±úþ¿½>IRéÕ÷{ø|€|8Ê ³…[¤Ô®GïO’Tj­Ó¿?_`"ž£ÌëÝ¿2z’¤RëÜx\øl€|8Ê ¹öÊ=¢÷'I*µâé‡Âg+äCÀQfÈ5¿óÿEïO’Tzõoüdø|€<˜£Ì«íöÎèÝI’J¯ùÝÏ„ÏWȃ9ÊŒ€"_½?IR©u®;2|¶@ÌQfto;-z’¤R+Öÿ?öî<\²º<ðx51ÑLœìN¢É˜˜ÕŒ1F£™dLbF“Œ“1ƬΘ8IúöÆÚ @ö}ßA@AvdmV¡e‘š¦¦Ï©ýœß<·PFdë{oU½çT}>Ïó?ò$óÜ{»~oÕy©:uoøl•$I’²à,ejPç¼™èë'€¡k~ñGÃç«$I’”f)SƒZ‡} úÚ `èÚ§|*|¾J’$IY`–25(ßþ•)•eôõÀPõV>_%I’¤,0K™šT¬[}ý0Tåã÷„ÏVI’$) ÌR¦&õV}ý0tùno Ÿ¯’$IR”¥LMê|åo¢¯†®}ò_„ÏWI’$) ÊR¦&5÷}wôµÀÐõ®=4|¾J’$IYP–2uié)u›Ñ×OCU>zgü|•$I’Çd)S£Š{.‹¾~º|ן¯’$IR¥Lê^¶{ôµÀеOú³ðù*I’¤€f6KÍ=2µOþóÔÜç]ñ?O@–25ª}ÂÇO—MO IDAT£¯†®wÍÁáóU’$I£/_¹mjùáÔ9iêßrz*›ëŸzMØ>í3á?_D–25*ßíí—M£Q¬¿=|¾J’$i¸åÛ½,µxoêœñ÷©·úðÁ½ŸOçÌÏ…ÿÌYÊÔ¬2[;¦Ë$€ñÉwykø|•$IÒ<[ò¢'?†tÒ'SïªýS±ö¦”ÊbN¯;çüKüï¥LÍêßúÕ]ÄiŸø‰ðù*I’¤MÿRû¸ î{Ú¿ë’”z­¿ì^°<ü÷ŠÈR¦fuÎ_2„Ë€jé]}`ø|•$IÒ&Ü&d$¯»—¬ ÿ]#²”©Y­Ã>0’©xäÛáóU’$iÚËW¼ôi÷| iLº—ïþûGd)S³òí_™RYŽí`ŒK¾êÍá3V’$iï3û1¤âþ«ç|˜aêMé;§-ejX±nMØA•ö Ÿ¯’$ISs˜n3UIﺣÂÿFYÊÔ°Þê#¢Ï ÀÐõ®Ü/|¾J’$MBùÎoüûÀ¬KU×»é¤ð¿[D–25¬ó•¿‰>/CW¬»5|¾J’$Õ­ÈûÀ SÍáˈ,ejXsßwGŸ€‘ÈW¾)|ÆJ’$Õê>0E?M‚þçÇÿ}²”©cK·¨Üçÿ†¡}üÇÏXI’¤Š}u÷â+y˜a*î¹,üï‘¥LM+î¹<úÌ ]÷Š}Âç«$IRÔ7íÎ^ ?u˜ìá4MŠ® ÿ7ˆÈR¦¦Í¾U `ÒkoŸ¯’$I#oÅKžy˜²LÓ¬xø–ø—€,ejÚìWÇLœ²LùÎoŸ±’$I£ºÌàcHýNô«®Ê)½#þß* K™š–ïööè30íã>>c%I’z˜ÁÇn?7¥nýòªÊÇî ÿ·‹ÈR¦ÆMÛg éнbïðù*I’´)å;½>µŽüPê^°<õל™Êü‘è—RµUn¸7üß3"K™׿õ«Ñç`èŠu·†ÏWI’¤gä>0#U>ñ@ü¿q@–25®sþ’ès0ù.?>c%IÒ·ds÷³2[ÿï¥Lköès0íSþGøŒ•$IÓ“ûÀÄ+óGÂYÊÔü{ì½]˜D½ëŸ±’$i2Ë·Å“C:û ©Ëéƒwh¯l=þ؈ÈR¦æëÖDŸ€Ñ¼}ufQøŒ•$I5o驹ϻܦÊöñ—€,ej^oõÑg`$š{½3|ÆJ’¤šß¦×Ž~Iæêæñ¡€,ej^ç+}tF¢óµÿ>c%IRMî3û1¤æ£Ñ/_Xˆ^;ü1‘¥LÍkîûîè£0ýo-|ÆJ’¤j”o÷òÿÿuÔ7žÊE¿TaØŠ^øã,"K™º·t‹”ºÍèã0š·°.{qüœ•$Iã¿ÌìÇNý´ûÀL“²Œìd)3÷\}|F¢uðo„ÏXI’4Â܆ï“Má=XÊL@³Ã `u/Ú>|ÆJ’¤áå>0<ŸléáÑqg)3µOøxôÙ‰âÞ+Âg¬$Iš_ù¯J­Ã>:ç-~r³ñÁè—T\6…]·”™€òÝÞ}vF£è^ÐEÏYI’ô-Û*5÷ÿ¥'oÄ{ÝQ©X·Æ}`˜³Ì;eâ Í/w&Uû˜?Ÿ±’$é™ÿaøé÷iE¿d`dî)ÿi~õo9-úüŒD÷Š}Âg¬$IÓÜ3ï³>ú哨ôíKá?Œæ_眉>B#Q<òíð+IÒ´”o÷²Ô:à½O~ iõá©|ôÎè—L‹¢þøÈRfBjü›ÑG`dòÝÞ>g%Iš¸–¼è©¯£î]µ*ÖÞ”RYD?í3­úø3¥Ì¤´â%)½èc0í/ÿeüœ•$i>†Ô>îcîC5u›ág$"K™ ªx`uô1‰Þ džÏXI’j}˜ü‘è§sx^egcø¹‰ÈRf‚ê]¹oô9‰2_—0L¨²ùhüù ÈRf‚jîþ£ÏÀÈtÎú§ð9+IRø}`ºÍè§dÝ;£7¦.K™IjfÑà 0‰ú·?g%Ië}`¼¶gz”ÙÚð3‘¥Ì„Õ_sFôY^+e˶ Ÿ³’$ £|ÅKŸv˜ÁÇ`Š•O<~.#²”™°:çÍDŸ%€‘iò¾ð9+IÒBî3û1¤âþ«Ý~@¹áÞø³¥Ì„Õ:ôýÑg `dº_ß)|ÎJ’ô¼Í,JÍÝß‘Ú'~"u/Û#÷\>x·'ðüÊÇîŠ?¿YÊLXùv/·u&VqßUásV’¤ï/ßþ•ƒ‹*÷…)ÖÝ~ž#²”™À|˜Xe‘ò_>g%IÓY¾ÝËRë _|#`ï¦SùøÝÑÏŒ01Н ?ãYÊL`½«Œ>O#Ó>áãásV’4}÷|u¿ý4«¸çòøs¥ÌÖþòÿŒ>O#Ó[}Døœ•$Mî×Qw/ÞùÉL7~ʃ©Ò¿óÂð9‘¥ÌÖÜó§¢ÏÀÈ”ÙÃÉs–$i¨÷ÉŽ~zƒ©×_sfølˆÈRf›Y”ÊÖcÑg `dšû¼+~ÖJ’êÑŠ—¤ÖïM3þ>õVþäýË2ú© øý›O‰ŸYÊLhýÛω>S#Ó9oqøœ•$U°%›?Ë}`:ÑO[À&è]Lü ÈRfBë^°<úLŒLÿîo„ÏYIRuî3øÒíçº ÔXÃgJD–2ZëðFŸ)€Ñ)ú)ßáÕá³V’4¾òí_ñäÇÎþÂwï³6úÙ¢î{‡Ï™ˆ,e&øæe>+ L²öq>k%I#jéƒû‡¹ LÅÏž€,e&¸bÝ­Ñç `dz×>g%ICÈ}`€”R÷¢íãçQ@–2\ïÚâÏÀÈ”|Û\ô¬•$-à>0³Cò­¡@šý"‡™ðù‘¥Ì×>í3Ñç `¤š{ÿ\ø¬•$=wùv/ú}`6>ýÔTTç¬Ï‡Ï¬ˆ,e&¸æ^ïŒ>W#Õ9÷_Ãg­$é»-ßúÉÌ™ÿ8øjÛbýíÑO@t¾ò7ñs, K™Inf³T¶>[#Ó¿ûÒøY+IÓØ³Ý¦×Ž~Zj¬}Ò'ãg[@–2^ÿ¶³£ÏÀh¿{Ç׆ÏZIšºûÀ4~&Lëè†Ïºˆ,e&¼ÎùK¢ÏÀHMëU‘¤‘ßföë¨o7#²”™‚º—ï}¾Fª{éná³V’ªÔì»aê$[öâðÙ‘¥ÌÔ>þ£ÏÀHën Ÿµ’T¥:g}>z4lº^;|nFe)3å«Þ}ÄF®ùï?>o%©*u¿¾côXØde¶6|nFe)3%•ß}ÎFªsæçÂg­$U¥ÞUûGe€MV¬¿-|nFe)3%õn86úœŒTÿŽóÂg­$U¥ÞM'Fe€MVÜMøÜŒÊRfJê|åo£ÏÀhõ»)ßþáóV’ªPÿŽó£§2À&ëßyaøÜŒÊRfJjîýsÑç `äfol=o%© ^=’6Yÿ[§†Ïͨ,e¦¥%›§²ýDôY©ÞõÇÄÏ[Iª@å†{£G2À&ë]{XøÜŒÊRfŠêß~nôY©²õxÊ–n>o%)ºÔmFd€MÖ½dUøÜŒÊRfŠê^°,ú¬Œ\ë°ßŸ·’Úò­£G1ÀœtÎþBüì ÊRfŠjúþè³0rÝ+öŸ·’Y¾ê-Ñ£`NÚ§|*|vFe)3EåÛ½,¥¢}ÞFª|âþ”Í, Ÿ¹’Us¯wFb€9iõ‘ðÙ•¥Ì”U<°:ú¼Œ\sß_Ÿ·’Uë÷Ea€9iðËÓ;³-e¦«î7÷Š>o#×½h‡ðy+IQµûXô˜“æîÿ1|vFe)3eµOøxôy¹bíMáóV’¢êœùÑc`Nò^>;£²”™²ò]Þ}ÞÆ¢¹û;Âg®$EÔ½d—è °éŠ~šæ}„¥ÌVn¸7úØŒ\ç¬Ï‡Ï[IЍwý1Ñ#`“• Ÿ›‘YÊLa½>w#׿ûáóV’"êç¢è °É¦ýcç-K™é«sÆßGŸ;€Ñ+Ë”ïòCá3W’Æ]±þ¶è °ÉfÉYfgT–2SXsŸwEŸ;€±è|õïÂg®$»ÔÉ¢Ç/À&ëÝ|røÜŒÌRf[ò¢T¶Ÿˆ>{#7íÿåEÒô•ïøšèÑ 0'½+÷ Ÿ‘YÊLiýÛΊ>{£W)_¹møÌ•¤qÕÜ÷ÝÑ“`N:ç/ Ÿ‘YÊLisÿ5úìŒEçô¿Ÿ¹’4®ÚÇ},zìÌIûË>;#³”™ÒZ¼7úìŒEÿŽóÂg®$«ÎYÿ=væ¤uøÃggd–2ÓÚÒ-SêæÑç`ôŠ~Êwz]üÜ•¤1Ô½bïè© 0'ͽÞ>;#³”™âúw^}þÆbÚß+izê¯93zäÌÉ´ÿdz–¥ÌôÖ9iôù‹þ·¿>s%iß=r6]¿“²™Eá³32K™)®uðoFA€ñèwS¾Ã«Ãç®$´%/\àÔEùØ]ñ³sql–2ÓÜò­Sêµ£Ï!ÀXø“¤I¯¹û;¢G-ÀœôïþFøìÌ‚³”™òúw_}Æ¢û¹á3W’FYë¨DZ€9éÝxBøìÌ¢g·¥Ìt×½h‡ès0e‘ò•Û†Ï]IU¾¨›îe»‡ÏÎ,8K™)¯uØ¢Ï!ÀØt¾ò·ásW’FUïꃢÇ,ÀœtÎþçðÙ™g)3åå+^šRÑ‹>‹cÑ¿ë’ð¹+I£ÊÇÒºiŸø‰ðÙ™g)£TÜ{EôY²Lù.o Ÿ»’4ŠÊæúè) 0'­CÞ>;³à,e”º—ì}ƦsÖçÃç®$ »Ù…3@Ý4¿ø£áó3 ÎRF©uÔïEŸE€±)î¿:|îJÒ°kùáèñ 07e‘²¥[†ÏÏ,z~[Ê(ßáUƒ0-š»¿#|öJÒ0ëœû¯Ñ£`NÊÇï ŸY²”Ñ âÕÑg`l:ç/ Ÿ»’4Ìz7=Zæ¤×Åá³3«@–2Ô½|Ïè3 06ÅúÛR6³(|öJÒ°*þVôh˜“ÞêÃÃggV,e4¨}ìFŸI€±jîÿžðÙ+ICiùÖ)½è± 0'Ý –ÇÏÏÅñYÊhP¾Óë_ 0-ºWì>{%iµxoôH˜³öÉ>?³ d)£§ò¶W`š”Íõ)[öâðÙ+I ­sæç¢G*Àœµúõðù™U K=UïÊý¢Ï%ÀXµŽþhøì•¤…Ö»þ˜èq 0gù.o ŸŸY²”ÑSµOøÓès 0V½›N Ÿ½’´ÐŠõ·GS€¹éwS¶dóðù™U K=U¾rÛè£ 0^ýNÊw|Møü•¤ù–ïðj÷j§|ôŽðù™U$K=­Ù¯‰˜&íÓþ*|öJÒ|kþ;Ñc`Îúwœ>?³Šd)£§Õ»ú èó 0Vý»¿>{%i¾u/\=Fælöº3z~fÉRFOË}e€iÔÜã'Âç¯$ͧþw.Š¡sÖ9çÿ†ÏϬ"YÊèiå;½Þç’©Ó½dUøü•¤9·ìÅ)u›Ñ#`ÎZGÿ~ü ]\,eôŒŠ‡nˆ>£cUn|(eK·Ÿ¿’4—Zþjôø˜ïRnüÿYn)£¬û>£c×:ú£áóW’æRçÜ‹sWôïô‹ž¡YE²”Ñ3jùáèc 0vý[N Ÿ¿’4—ú·=:æ¬xäÛáó3«P–2zFùv/K©ß>«ãUôR¾rÛð,I›ÔÒ-SÙÙ=9æ¬ëWãgèâêd)£gmö+b¦Mçì/„Ï_IÚ”ZÿfôȘ—†ÏЬBYÊèYë^°<ú¬Œ]±nMÊf…Ï`Iz¡ºï=2æ¥}ê§ÃghV¡,eô¬µúµè³ ¢uðo„Ï`Iz¡Š¯‹—ó2{­=C³ e)£goé–)u²èó 0v½ŸÁ’ô<å;¿1¥²Œ—ó’ïü†ð9šU(K=gýo-ú¼Œ_¿›ò•o ŸÁ’ô\µOþ‹èI 0/eë±ðšU,K=g³>}fBtÎý·ð,IÏUï†c£Ç$À¼÷~3|†fËRFÏYs>³!ÊÇîJÙ’ÍÃç°$=ëWa·7DI€yé­><~Ž.®V–2zîf¥2{8úÜ„hùáø9,I?PëðFG€yëœõOás4«X–2zÞz7ž}nBôoýjø –¤¬wÕÑã`ÞZ‡} |ŽfËRFÏÛìwÈL¥²Hùno ŸÃ’ôT3›¥rãƒÑÓ`ÞòUoŽŸ¥‹«•¥Œž·æ4úÜ„é^ºkø–¤ïÕ:ðW¢Ç"À¼•ù#ás4«`–2zÁÊǾ}~¾¶1_ñÒð9,I³Í.Šêªç…ás4«`–2zÁzW}~ÂtNÿlø–¤ÁG—6Ü=æ­{Ùîñ³tqõ²”Ñ Ö>áãÑç LñÈ·CѳXÒt×:ä·¢Ç!À‚´¿ü?ÃgiVÁ,eô‚å;½>¥²Œ>ÃaZ‡ÿNø,–4Ýõ®9$z,Hs¿_ Ÿ¥Y³”Ñ&U%MW³sÇk0 î:ç/ Ÿ§YE³”Ñ&׿ëâè³ ªûõÂg±¤éªsÞâèѰ`ícþ |žfÍRF›\çÜ‹>Ë¡Êö†”oÿŠðy,iJšÙ,•}'zô,X¾ËÅÏÔÅÕÌRF›\sßwGŸe€p³>>%MG­#~7zä,X¹ñ¡ðyšU8KÍí¿Ödk£Ï4@¨rÃ})[ºeüL–4ñõ¿ujôÈX°þ­_ Ÿ§Y…³”Ñœê]wdô™×>åSáóXÒd—¯zKJE/zÜ,X÷‚eá35«p–2šSí?}¦ÂëoOÙ’…ÏdI“[÷â•Ñ£`(ZG~(|¦fÎRFs*ßñµ)•Eô¹×>é“á3YÒd–o÷²T¶‹sC‘ïüÆð¹šU8K͹⾫¢Ï5@¸býmÞ-#i$uÎü\ôˆŠòñ»ÃgjVñ,e4çºm}¶*¡}Ÿ†ÏdIÖ’ÍSùèÑã `(z7Ÿ?WW;K͹ֿ}¶*¡xäÛƒ ¨è¹,irjÿ'Ñ£ `h:çüKø\Í*ž¥ŒæÞ’ùœ3ÀwµOøxü\–41ù˜80IZ‡¾?|®fÏRFóªwÓIÑç ЇoqoIC©u䇣GÀð”eÊwxuølÍ*ž¥ŒæUûË}Ä*£ýåÿ>—%Õ¼™E©¸ÿêèq04ÅúÛãgëâêg)£y•¯Üv°ù ¥ò‰ûS¶|›ðÙ,©¾µŽúHô(ªÞuG†ÏÖ¬YÊhÞ¬Ž>ç•Ñ9ëóásYRß%sß•Ñc `¨Ú§}&~¾.®~–2šwÝ ·‹>ç•Q6Mù¯ ŸÍ’êWëèßaC×üÒÏ„Ï׬YÊhÞ5÷ÿ¥èsP)³ËêèÙ,©f-Ù<Ý=¾†ªl=žì›”¥ŒæßÌf©ÌÖFŸw€êè6S¾Ë[ã糤ÚÔ>õÓÑ“ `èúkÎ Ÿ¯YM²”Ñ‚ê­><ú¼TJoõá³YR=ÊW¼4•O<=¶†®sî¿…ÏØ¬&YÊhAµû£èóP-e™Z¼7|>Kª~Ý‹vˆžX#Ñ:ø7ÂglV“,e´ òí_‘R¿}æ*¥¸çòÁ·©DÏhIÕ-_õ–”ºyô¸¾~7eË· Ÿ³YM²”Ñ‚ëßyaô±¨œöñ>Ÿ%U·ÞõGG)€‘(î»2|Æf5ÊRF ®sÖç£Ï=@å”ß²/ ŸÑ’ª×ìÛúg?ê0‰ºßø÷ð9›Õ(K-¸æ?}î*©{ñÎá3ZRÅZºe*þVôx™ö±?kk”¥Œ†R±þ¶è³P=E/5÷úÙð-©:uÎ_=™F*_¹mø¬Íj”¥Œ†R÷ò=£Ï>@%õ¿óu7ý•4¨¹û;Rêµ¢ÇÀÈÌþÇúèY›Õ,K ¥Ö!¿}þ*«}òŸ‡ÏiIñõï8/zŒTïÊýÂgmV³,e4œ–n‘ÊÖcÑ3 ’Êìá”ïøÚøY-)¬ö)ŸŠE#×>îÂçmV³,e4´|µ#Àsë]Løœ–S¾ÛÛRÙÞ=†F«,S¾óÂgnV³,e4´f·¢<·ö1>«%¹™ÍRÿ;E€‘+¼>~æ.®_–2ZùŠ—¦ÔkGÏ€Ê*7>˜ò^>¯%¯Î¹ÿ=zÆ¢û/†Ïܬ†YÊh¨õ¿ýµèYPi½k ŸÕ’ÆSsïŸK©ß‰;cÑ:òÃás7«a–2jíÓ>= *¯uôGÃ絤·|›T¬½9zÜŒGÑKùv/Ÿ½‹ë—¥Œ†Z¾òMƒ<ðÜÊ|]ÊWn>³%®ÙwÅL‹âžËÃçnVÓ,e4ôŠû®Œž •׿ýœ”Í, ŸÙ’†_çôÏF€±ê^´}øìÍjš¥Œ†^çÜ‹ž µÐ9óÃg¶¤áÖÜ÷|ñ0uZ‡¼/|þf5ÍRFC¯ù¥ŸŽž õÐk§æÞÿ)|nKNùޝIåcwEO€ñêµR¶l«ðœÕ4K¤býíÑ£ Šõ·¥|ûW„ÏmI lÉæ¾…˜JýÛÏŸÁ‹ë›¥ŒFR÷Ò]£g@môn>Ùýe¤š×½l÷èQ¢óµÿ>ƒ³g)£‘ÔÜÿ=ѳ V:g~.|vKš_íSÿWôÓÜãÇÃçpVã,e4šf¥rýÑó >úÝÔ:ðWâç·¤9Õ:òC)ýè ¢|ôÎð9œÕ“³šg)£‘Ö»rßèQPKÝ · Ÿá’žY¾Ã«ïh˜výÛÎ ŸÉÙd)£±<À˜»ÎéŸ Ÿã’¾¯åÛ¤þ]—D€Jèœññsyqý³”Ñh[ò¢TfGÏ €z*ú©uÔGâg¹¤”-ß:õï¼ z*TFóß,~6/®–2y½kŽžµUv6¦æ>ï ŸåÒT·l«Ô_sFô8¨Œbýmñ³yñdd)£‘×:âw£g@í¿*»¹çO†Ïsi*[ñ’Ô¿ýœè1P)ÝËöˆŸÏ‹'#K¾¥[¦²õxôܨµÙ¯ÞÍwý‘ø™.MÛM}ï¹<úøTNëÐ÷‡ÏèlB²”ÑXê­>"znLÄ[…óß>Ó¥i(ßù ©xðºècP9eóÑ”-Ý"|Ng’¥ŒÆRëÈEÏ€‰P¬»5å+ß>×¥I._¹m*ÖÞ}Ü*iö?¸GÏél‚²”Ñø>ÂÔ\=?&B±nMÊW½%~¶KXs¯w¦òñ{¢9@eµùƒðYMP–2Ûß wõÑó`b”Ý•òÝÞîyLb­Ã>à>xϧÛÜ=z^g”¥ŒÆþ``8ÊÇïNÍ/þ‡ðù.MBíS?RÑ‹>Ö•Ö¿ù”ðyMX–2_K6O寇¢çÀD)7>èë²¥…´dóÁW»ðÂÚ'}2~n/ž¬,e4ÖºßÜ+zŽLœò‰RsŸŸñR¿òº¿æÌè# PE/å;¼:|vg–¥ŒÆZëÀ_‰%©ÌNÍý~1|ÎKu©¹Ï»RùèÑG 6úwœ>»³ ÌRFãmfÑàæ”Œ@7O­£~/~ÖKoöí÷³7«`ÓuNÿløüÎ&0K½î¥»FÏ€ÉUôSçô¿ŸõR%[¾uê]spô)¨Ÿ²Lùª·ÄÏñÅ“—¥ŒÆ^sß_ˆ)¯{ávƒw'FÏ|©*ÍÞ»X{sôѨ¥âÞo†ÏñlB³”QHÅúÛ¢ç ÀÄë­>†õV)_õæð™žMh–2 iö«[bÝšÁG7¢g¿4ÎÚÇ},•ÍG£@íõï¼0|¦gœ¥ŒÂ*î¿:z¾L²½!µŽþhøì—F]¾óSÿ–Ó¢ÀÄhŸö™ðÙžMp–2 C‡Å IDAT«sæ?FÏ€éR–©{ñÎ)[²yøs€4ôf6|Õu™?}Ò&GÑKùN¯Ÿñ‹'7K…5{¸g9ã5{ /°4I5÷þ¹Á7ƒ0\ý5g„Ïøl³”Qhý5gFÏ€©T>zgjø+áÏÒBÊwxUê^±Ïà&” _û¤? ŸõÙ„g)£ÐÚ'|}Š&W¯•òí^?óOv–2ŠmùÖ©l==n¦ZñЩ¹÷ŠN6ñÅkñÀµÑÇ`âõn:)|ægS¥ŒÂë]{Xô¼ ×N³¿à&ÀªlÍ=*õoýjôI˜ícÿ0|ögS¥ŒÂkò[Ñó€ïêç멹çO†?7Hß+ßím©wýÑî0Feû‰Á§¢Ÿ²)ÈRFñÍl–Ê ÷FϾ§ßMÝKV¥|ÅKãŸ#4µå»þpê~s¯Á»¸¯Þµ‡†?dS’¥Œ*Q÷â•Ñs€P>qjŸôÉðçMWùnoOÝËv·ŒÔ:èן²)ÉRF•¨ù¥ŸŽž;<‡þmg§æîï®Ðd×ÜëgSï†cß @œbýí)›Yþ¼MI–2ªLÅ}WEÏžK¯º—í‘ò^þ|¡Éªu௤þ-§¥T–ÑrRJófŸ²)ÊRF•©súg£ç/¤“¥îÅ;§|ûW†?o¨Æ-{qj÷±TÜsyô#€ïW)ßå­ñÏ‹§'KU¦|ûW¤ÔͣǛ l®Oó—¦|»—…?¨>å+ß4xÜ”ùºè‡0Ï¢û¹áÏÙ”e)£JÕ»î¨è9À”O<:_ý»”-ß&ü9Dmf³Á Îþͧ¸_ @ŵOøÓøçÅÓ•¥Œ*UëߊžCÌCÙz|ð9ùª7‡?—¨:_iÝ9û ©|ôŽè‡'›ø\î?²4Æž¥ŒªÕÌ¢Áݾ¨©~'õV>øV½ðç…|yökÔgßþîÆ½õÒ»r¿ðç‘l ³”Qåꜿ$z°Pe™úkμÐðcÂ[¶Ujõ‘Ô»ñø”z­èGóÔÜÿ=ñÏ)‹§/KU®|Õ[|æ`‚”î}ò›v{{øsŒ†ÔòmRëÈÞU¶7D?ÄX bÝ­ñÏ-‹§3KU²þmgGÏ%†­,RÿösRû„Þ]ý\£¹•ïðêÔ>ù/Rÿ–Ó½#`ÂtÎú|øóL6¥Yʨ’µÿãè¹À•ÍGS÷нSë _OÙ’Íßwô,Í,JͽÿSêœýÏ©Çù)½è‡ £Ðk¥|Çׯ?ï,žÎ,eTÍ–n™Ê|]ôx` ÊæúÁÇ`ÚÇ},e+^ÿ4Åå;½nðïлjÿÁÇΘ|½ÕG„?ÿdSœ¥Œ*[÷ò=£çcV¶ŸÜ0¶}üŸ¤|»—‡?M÷%µÿ`ê^¼2¬öIS¨yÀ/‡?eSœ¥Œ*[sÏŸŒžOD*ú©¸ÿêÁM‚go*›o÷²ð禺—¯ÜvðN˜îe»þ¶³÷ù`z^þÜ4íµ,eTåúw_=§¨Š^;õ¿sQꜿ4µüÕÁG]£Ÿ§*ÝŠ—¤æ~ÿ9u¾ò·©wñ>ŽÀ3tNÿëøç«)¯e)£*×>é“Ñs €ªêwS±ö¦Áýh:gü}jðÞ”-ß:ü¹+ê0³/êfÿ³Ù¿Ëì;๔>*¼8>KU»e[¹á/s[ÔšÕ>éÏR÷‚eƒw½ôïº$•îs^†ª¹×;ßûÔ°”Qõk~ñ?x! ÀX¾š»Xwëà~fýo}9õ®: u/Ú>uÎþÂà]7íS?Ú§üÁrg›}5[sÿ÷¤æ>ïJ­ƒãÉÿÙaxêgv¹2ø¿;õÓ©sö?þÿë]¹_êÝ|rêç냕J©èEÿúL‘þÝß¿ÎSc¥ŒjQÿös£çÀDhŸø‰ðk<5YʨµýÃè¹P{e¶vpïÎèk<5Yʨ-yÑ“Ÿ§`Þ:ç/¿¾Sú^–2ªMÝ WDÏ/€úêµS¾óïíÔx*KÕ¦|—J©èG1€Zê]spøuOËRFµªËiÑs  ~Ê25¿ô3á×tj<-KÕò À¦ëß~NøõœÏyk)£ÚTe+^~ §Æ³f)£Z–ïòÖ”Š^ô|¨´îEÛ‡_¿©ñœYʨ¶õn:)z¾TW¯ò•o ¿vSã9³”QmkôkÑ# ²ºWì~ݦÆó_×ZʨÎ÷_=çª§è§æ4üšMçÍRFµ®}Êÿˆu•Ó[}Døõš/˜¥Œêݲ§rãCÑó :Ê25¿ôÓñ×kJ/”¥Œj_÷ÂÑ# 2úßúrøu𛔥Œj_¾ÓëSê6£ç@%4÷ÿ¥ðë456)KMD½+÷ž{áú·Ÿ~}¦Æ&g)£‰(ßí탻‹L³Ö!ï ¿>Sc“³”ÑÄÔ»é¤èù¦¸÷Šðë25攥Œ&¦æþaZG}$üºL9e)£‰ª×ÅÑs`ìŠû¯NÙÌ¢ðk25攥Œ&ªÖQ¿= Æ®uøïÇÔ˜û5¬¥Œ&ª™E©X{Sô<›â¾+½Kfq=³”ÑÄÕ>åSÑ3`lf/죯ÃÔ˜W–2š¼–n‘Ê ÷FÏE€‘ëßuIü5˜Ò|³”ÑDÖ9û ѳ`äZýZøõ—óÎRFY¾ÝËSÙ|4z>ŒLÿösï½ÔXP–2šØº,‹ž‘#Ó:ðWï»ÔXP–2šØòí_‘ÊÖcÑs`èúkοæRcÁYÊh¢ë^´Cô¬®²LÍ}ß~½¥Æ‚³”ÑD—ïøšTv6FL€¡éÝx|øµ–CÉRF_÷Ò]£g&Àpô»©ùï?~¥ÆP²”ÑÄ—ïü†”ºÍèÑ °`ÝËö¿ÆRchYÊh*ê^¾gôìX²ýÄà?:G__©1´,e4å«Þ’R¯=Cæ­s_[©1Ô,e45õ®Ú?z†ÌKùÄý)[¾Møu•CÍRFSS¾Ë[Sêw¢g)ÀœµOùTø5•CÏRFSUïꃢg)ÀœkoJÙ’Íï§Ôz–2š¾w˸· P#­#?~-¥ÆH²”ÑÔ囘€ºèç¢ðk(5F–¥Œ¦®|§×¥²³1z¶<¿²HÍ}ß~ ¥ÆÈ²”ÑTÖ½xçèñ ð¼zWî~í¤ÆH³”ÑT–oÿÊT6ž±Ïjözeö]þÑ×NjŒ4KMmó—DÏY€gÕùêß…_3©1ò,e4µå+^šÊlmô¬xšbíÍ)[ºEø5“#ÏRFS]ç¬ÏGÏ[€§iöÛá×JjŒ%KMw˶Jå†{£g.À@ï¦㯓”Æ•¥Œ¦¾Î韞»)u›)ßõG¯‘Ô[–2ÒÒ-S±þöèñ L¹îË㯔ƙ¥Œ´¸‘ÚÇ},zþS¬|üî”-ß&üÚH±f)#}·þÝ—FÏa`JµŽþýðk"5Æž¥ŒôÝšû¿'¥²ŒžÅÀ”é¯9#üzH,e¤ï«wÓIÑó˜&ÝÜÍ}Oo–2Ò÷•ïöö”úè± L‰Î×þwøuaYÊH?P÷²=¢ç20ЇnHÙÒ-¯ÔËRFúò_›ÊÖcÑó˜de‘šûýçðë5B³”‘ž¥ÎÙÿ=¢€ Ö½bïðë5ÂkþÁÁã¡á-SÒ÷µl«T>vWôœ&P¹ñÁ”oÿÊøë¥èZÇü×Ác¢±qù6á?ŒT¥Ú'þ÷èY L öq~½£F%jÿǃÇD#ÛþUá?ŒT©f6KŽWDÏk`‚ôל­£T•Ú'ÿùàqÑÈv~cø#U­ÙoÍÞ€ `¡Êö†”ïòCá×9jT¦Ù¯DŸÕÈwÿñðFªb½k‰žÝÀhù/ïoÔ¨Tݯï8xl4š¼7ü‡‘ªX¾Óë}E6° ý;ÎKÙÌ¢ðë5*UïªFó¨†ÿ0RUëœùÑ3¨õÇ–Þ~]£FåêëÔÁc¤Ñò6*é¹[ºE*ÖÞ=Ë€jŸöWñ×4JU¬xðúÁc¤Ñ¹`Eø#U¹Ö!å@Íôï8ßÇ–”ž«ÙwQÍjtWþÃHU¯wÓ‰Ñ3¨‰²ýDÊwý‘ðë5*Y¾ãkžz¬4zw]þIUoöëëR' ì@=´OûLø5Œ•­uà¯<õXi׆ÿ@Rêœ7:Ø€êó±%e/Pçô¿~êñÒ˜ý²ÞþCI•oÙV©|ôÎÈùTXÙzÜÇ–”^¨îû<})Ó<ôýá?”T‡ZG~(rÆÖ>é“á×,jT¾âžËž¾”iíÿ„ÿPR]êÝxBäœ*¨wñá×*jT¿e/N©×zúR¦{ã ñ?˜T“òߘÊÖc‘ó¨rÃ})ßáÕá×*jÔê&¿O-eŠ' ÿÁ¤ºÞ˜ ˜be‘Z‡¼/üEZÔ9çÿ>s)3+Ûõmá?œT›f6Ký»¿1ò€ é^²Küõ‰R]êûkϾ”iôgá?œT§š_úé”ú݈¹T@ñàuƒ{„D_›¨Q–o“R·ùìK™îõÇÄÿ€RÍê~}LjÙDëµSs¯Ÿ ¿&Q£6µŽøÝg<ŒžZÊùú´qf³ðRªUË·NÅúÛÆ=þ€`3þ!þzD©Nu¿¹×s/efåûÿRø)Õ­Ö¡ÿeœ³Ö_sfÊf…_‹¨QŸf6Kå÷?ÿR¦sñªøTªa½ëŽçsùõ×;¾6üDZÕ:ø7Ÿõñô´¥LñØÝ¶}Ò<Êwz]*óuãz"½Ô:ðWï?Ô¨]½+÷}á¥Ì¬æþ¿þÃJu¬}üŸŒãiÒ9ç_¯;Ô¨_˶JeþȦ-e:ßÜ+þ–jZï¦Çñ\ŒYÿ¶³÷‰¾æP£vµOøøs>®ž±”)[§Ë¶ÿ¡¥:6ûÙÒrãC£~>Æ¨Üø`Êw~cøõ†µ¬ç…›¾”™Õ:éÏÃh©®µýo£|>Æ}™ƒ~-ü:CZÖÜãÇS*˹-eúw_þƒKu®wÃq£|ZƤsî¿…__¨QÛzWð¼¯g]ÊÌÊ÷{Oø/Õµ|Ç× ÞâÔWÿŽóS¶dóðë 5jY¾ÓëSêµæ·”éÞxbø/ Õ¹Ö1ÿuÏ À”î\TG_W¨QÛºíð‚³ç\ʤ¢Hùn?þKHu®wÝQC~jF®ßM­Þ~=¡F½?=ÑÞ°€¥Ìì»e®>(ü‘ê\¾ý+v >Ú§þ¯ðk 5j]÷’U›ôX{Þ¥Lê÷Rþï?þËHu®uÔï 驵ٳF_C¨Qëò•Û¦Ô͇°”™}·ÌuG‡ÿBRÝë]}Ð0ž€*îýfÊ–½8üúAZ×»æàM~̽àRfpo™½>ü—’jÝŠ—¤bÝš>E£Rn|(å«Þí Tçšû¾;¥²âRföSLw_–²™E῜Tçšûü|JýÎBž'€Q(z©uЯ‡_3¨Qïf¥þ]—Ìé¡·IK™Y­ã?ÿ J5¯söæóŒP猿¿VP£öÍÞ z®6y)S<~_ʶ{yø/)Õº™ÍRÿŽóæ|P€Ñè]wTüu‚RÝËW¾)•­ÇF·”8´Çæ‚—2³:_ß)ü#Õ½æ—~fpx`xÊö†ÔÜó§Â_ï«þå;¼zè_Ö2”¥Ì¬öiŸ ÿIuoXŸKf?³ÔI­CÿKøë|M@Ë·Iý».úCthK™TôSóÈß‹ÿCI5¯wõC;–0µÊ2µOüïá¯ï5-Û*õo?g$Óá-efuÛ©yèûãÿ`R[¶U*¸v¨G¦Mçì/Ä¿¶Wý[ºeêßú•‘=N‡»”™Õi¦æA¿ÿ‡“j\¾ë§²¹~èǦAïÊ}Ã_ÓkZöâÔÿÖ—GúXþRfö“Lí©yðoÆÿ¥×:ú÷o¹6]ïæ“S6³YøëyÕ»|ûW¤þ]üñ:’¥Ì@·å3Òë^²jdG&ÍìXgoý:^õ._ù¦±ÝRbtK™Yýnjø‰ð?¨TÛ–¼(õï¼`¤Ç&ÁìWÏ~eqøkxÕºæ^ïLå†{Çö¸íRæ{w¼>oIÚX?®TÇò_›ÊGïùQ€º*Ÿ¸p_Æè×îªw­#?œÊöc}ìŽ~)ó]ÝÕG¦K· ÿ#Ku¬ù¥ŸIeg㸎+ÔFÙ|45÷úÙð×ìªqK6OÝ W¤TcüŽm)3«ï•)[õCñp©¶7þÿ€ªšý—Íý)üµºê[¾ÓëRÿ¶³ÃÃc]ÊÌ*²GRóÐßÿÃKu¬sÞ̸,TS¿“Z‡ÿNøktÕ·Ö¡ï|ô-ÒØ—2E‘:í”6.Ù"üAªU3‹RïÆBŽ-TFÑK­£?ÿú\õlùÖ©ûÍ/…|\©K™ïê?xcÊ¿ô3ñÿ RZ¾u*î»*òè@œÙ/“9åSñ¯ËUËZýz*ÖÝšª"t)3Ði¦öÙ_H—¼(üGªKù.oMe¶6úôÀØuNÿëð×ãª_ùÎoH½ëŽLU¿”ù®þƒ7¤|¿ÿþ%ե濜R¯}t`l:çüßð×áªYK·H3þ>•­ÇSUf)3P©{õÁ)ÛùñÿpR jŸú¿¢O-ŒE÷ë;…¿þVšÙ,µÿ“T>zGª²j-e¾«hoLísþ%m\¶uü?¤Tñº—î}d`¤foÊýº[5ZÆ÷±T¬½)ÕA%—2ßS<ñ`jŸñiã²­âÿa¥ª6³™od`bu¯Ø{ð-¤á¯»Uí–½xpèâ¡STz)ó=ņûSûÌÿ²/‹ÿ‡–ªØ²­RÿîK£* UïÊ}-d”ž¯|å¶©sÞâTn|0ÕQ-–2ßS´6¤Î%»¥l—ÿ‡—ªV¾ãk*õÕn°½«ö·QzÖ–n‘ZG4õo9=¥~7ÕY­–2O)ŠÔ»íÜÔ:ñ>Ú$}_ùnoK寇¢O(,HÓ~}­ µdóÔ:ཀྵ{Ù kžz.e¾O‘­KÝ+öM̓ߗ6:´Rjî÷‹)uóè£ óÒ»ú ¥ÙòUoÜ'¦wãñ©ÈI“¨öK™ïWl\›ºW˜ZÇüAʶ{EøHŠªuÔGR*úÑGæÄ;d¦¸%›§æ?ñäæšCRí·Ò4˜¨¥ÌÓô{©w×¥©sá©yÄï¦lûWÅ?Ȥ1ÖùÊßDŸBØd½kµ™‚ò_›šû¾;µýo©sÖ? 0Å}W¥Ô™ÎwûOîRæ•eê?|kêÝp|jŸ»85þý”ïñîI£‰®{ɪè“/¬ÛL½«ÜÜW5ïÚÃRïÆR÷†ãSï¶³SïÎ SÿÁߪœzíèGZåLÏR B,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,eXʰ”`)ÀR €¥ @K€–2,e€ÿ׎À0 ò¯ºs±< ƒðOʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ÊxgCn .IDAT¤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ʤ @@ÊìßѨ<} rIEND®B`‚‰PNG  IHDR<Pà´Ú pHYsèèµ{Rk IDATxœìÝy¸ewYà{+AdDEZmDmm½‚¢\glEQñªWP¡[à¶§Æ$U•y 3™!!3 IHH ™ ™!sÈR•ªÚóÞkýú©“«¨J­½ßwïóù<Ï÷_\{­_Ö{Þ:g_W­¿¿ ¿ñùÒ¿xuéžü¾Ò9ü­¥µÇkJkñ6¥õoß§)mðťѷÀ¼êá›J{åKÂߤMnɶó3Qçð_Ÿ‘úíV†·ž3?;Íû¾1ü߀gôàõ¥é¾¥{üÿ(­Õ¯ˆ®Õls‹Êà’½£o3€ïP=x]iïúâøw%iKÛí•¥û™?)ýËö+£oˆ~´`&XÀ31ì—á-g–î©ïŸVÃf¯Å[—áW‹¾ãžTuÿWK{—Æ¿3IM¶û«K÷´¿-ïŸUÊhý˜ÀT²€Í0¼ó¢Ò=å¯Jkg?dY-Ù¶ ¯;.ú¶xZÕ½W–öÎ/ˆw’ÆÑ.;ÎÿÃËÑÝ—D?j0U,à{¨º•þ%{—ö¾oˆ~5¹–>§Œn>=úöØ$—#íåÏ‹‡’ÆX{¿Ÿ˜ÿ3¡Uo}ô#éYÀS¨ÖÞ]zg}¨´–??|ÐÕ„°°üyetûùÑ· ÀfÝyAi-{nø»”4öV¼ ô>ÿ¯¥ZwoôciYÀw©6<8?Lnü °ðÁV¯½ó÷ûóBÀÔÝö…ÒZ¶]ø;•4‘–PJ5Š~`ì,˜iUo}éñ…™ÊQ{×—ê¯Eß–aêö·JgŸ×‡¿—I‘uOxw)Ã~ôãceÀ̪Úß*íƒý g=^{çï/Õ}_‰¾-ÂÕkî(íU/ ?“"ëþkóÿ`f• 3©Zsgiïý£áC¥-ÿî½*ú¶Hcã»QkùöáïiRdíƒÞRªÖÃÑ#Œ… 3§Z{wiíöÊðaR9j¯ØÁòàIŒn:µ´oþ¾&EÖ>àM¥ê®‹~ q€Ì”ªõHiïû†ð!RIZò¬2ºõœèÛ ­á•Å¿³IÁu>ñÖRÝèÇeÀìè·Kç_•¤Å[—á 'Eß•éõÏúçøw7)¸îgþ¤”jý8@c,˜ Ã~éýŽð¡QIš[T†W}WL‡º*½OÿAü;œ\ïóÿ+úi€ÆX0º'½7|XTž—î}KL—A§tùùð÷8)ºþå~ €L½Á•‡„‰ÊSÿ¼¹è[`*Õ­‡K{ׄ¿ÏIáß#~ïUÑ#l1 @¦ÚèëJkÙsã‡D¥¨ú?Dß’S­zèÆÒ^±Cø{Y{Ï*U÷±èǶˆ Ó«·¡´÷ù±ðáP9êðîùï¯`ËŒn:­´æ¶ ¿“"ë÷®èG¶ˆ S«{â{‡Bå¨{äÛJõ£oI€™1¸`çðw<)ºÁÕGD?ŠðŒY0•×|2|TŽº‡ýR)ƒNô- 0[êºôNøÓðw=)´åÛ—êÑÛ¢ŸFxF,˜:Ugmi­zYü0¨ð:û¾¡Ô5Ñ·$ÀlvKçàŸ ç“"ëùöè'ž @¦Nï³>*¾öª—•zíÑ·#ÀL«×Ý[Ú«_þî'E6¸öØèG6› SetïU¥µxëðPÁ-Û®T÷\};,Õ}W—Ö²çÆ¿JAm\‚—Þ†èG6‹ Ó£•öoþÜâ­ËèæÏFß ÊðÚOÅ¿JõÏ_ýÀf±`j ®8(|èS|ƒË÷¾¤þ™ ”¢j/^©Ö?ýÀ&³`: :¥µúáCŸbëŸý¡è;`᪆¥û‰_'”¢êe`zX0ú_Þ#|ØSlÝcÞ9ÿg`ˆSoxpþûÐ¢ß ¥–=·TŒ~ `“X0¿ý·ò%ñÞÂêòóó÷ñFw^XZ‹· G”"êóÑèG6‰ é ®<$|ÈS\í=_;ÿ/ÍÈcðå=ÃߥˆÚ»ìXJoCô#ß“ ¹UUiïû†ð!OAÃõ®/*Õ#·Dß…|·º.½ãÿ8ü}QŠhã?R€ì,Hmxë¹áÂZ¼MÝ~~ô-ÀS¨ûJg¿o”&\çÀ7G?~ð=YZ÷¸? îÓàòý£o?¾‡ê‘¯—öÎ/w”&Ýèþk£?xZ€¤Umx°´–<+|°Óäëú×Ñ·›hxý áïÒ¤ëýáèGž– iõ/Ý7|¨Óäëú ¥ {Ñ·›¡÷Ùÿ'ü=RšdíÝ^9ÿõ• iuýÅð¡N¢W¿¼ÔëõØ\ÃnéðÆð÷Ii’î½*úÉ€§d@Jõº{Kkn«ðNlÙv¥ºï+Ñ·ÏPõðM¥µ|ûø÷JiBõÎýÿ¢;xJ€¤4¸òàðaNlnQ~íØèÛ€-4¼úˆøwKiBuzKô#OÉ€”:Çþ^ø0§ÉÕ?÷£Ñ· éôžð÷Ki"-ÞºTíG£9xR€ä3ì—ÖòçÇsšHÝc~»”ºŠ¾ëhHÝ[_:ûühø{¦4‰†7žýÈÀ“² Ñ=—‡qšL}^_êîÚè[€†U^7ÿÏÑï›Ò¸ëŸó¯Ñ<) @Òéy¯ð!N㯽âù¥zøæèÛ €1\¶_ø;§4¿5úQ€'e@:Ýãþ(|ˆÓø^w\ô­À8Õué~êwÂß;¥qÿÃÆR¢Ÿ6x @ÒiíñÚð!Nã­Æ?FßfL@Ýz¸´W½,üýSgÕš;£5x @R©ºëJknQø§ñÕ9è-¥ {Ñ·2úÆÙÞñ5Ó ¿ñùèÇ žÀ€TFw_>¼i|µwÙ±ÔkýëX€…¦wÚûÃßE¥q5¸tßèG žÀ€T×>¼iLÍ-*£›N‹¾ÅˆÐo•Î>?ÿN*¡þÙŽ~Âà ,H¥þ’ðáMcŠÏýXôí@ êÞ«Jkɶáï¥RÓõNxwôãO`@*Ý“Þ>¼©ùºŸø•Rªaôí@°þysáï¦ÒXæHÆ€T:G¾-|xS³µW½´ÔëµÈ –ÎÁ?þŽ*5Yçãÿ5úÉ€'° •öo ÞÔ`s[•Ñm_ˆ¾­H¤zôÖÒ^þ¼øwU©¡Ú{¾6ú±€'° •Öî?>¼©¹ì}KÐàòýÃßU¥¦j¯Ü)ú‘€'° •ÖÎ/ ÞÔLÝÃßZJ]EßRdTWóß›ýÎ*5Q{Åó£Ÿ(x @Ri-ß>|xSðÎß_êÇH¬^s‡?ª™¨½b‡èÇ žÀ€TZK¶ Þ´å ¯;.úV` .Ù;üÝUÚÒÚ;¿ úQ€'° •èÁM[^ï”¿Š¾˜uU:‡þBø;¬´¥²± •èÁM[Vg¯×•º·>ú6`ŠT|½´–mþ.+=Ó,ÈÈ€T¢7mA‹·)Õ=—EßBL¡ÁE«ãßg¥g˜ YJôà¦gÞàÂ]£o¦•?ª)΀Œ,H%zpÓ3«{Ø/•R¢o¦XõðÍ¥µô9áï¶Òæf@F€¤=¸é™ »õÚ»¢ofÀà‚Ãßo¥ÍÍ€Œ,H%zpÓæ7¼î¸èÛ€YQ Kçã?þŽ+mN€dd@*у›6¯ÞIe˜1£»/)­¹­Âßu¥MÍ€Œ,H%zpÓf ¹« Ô5Ñ· 3¨wÚ߆¿ïJ›š YJôà¦MotÓ©Ñ· 3ªî>6ÿ΢ßy¥MÉ€Œ,H%zpÓ¦Õ;é/¢ofÜðÚO…¿÷J›’ YJôà¦MýÓŸFß*,Ý#ßþþ+}¯,ÈÈ€T¢7}ïF7ž}›°@TÞZZKŸþ,=]€dd@*у›ž¾ÞIEX`_Zþ,=]€dd@*у›žf¨õ§?ˆ0ê—Î~ÿ%ü}Xzª,ÈÈ€T¢7=u£›N‹¾=X Fw^PZs‹Â߉¥'Ë€Œ,H%zpÓ“×;ñÏ£o ¸Þ ï/–ž, @2² •èÁMO2Ì®z™?ý @¸zÃ¥½b‡ð÷c黳 # @R‰ÜôÄF7ž}[À¼Á…+Ãߥï΀Œ,H%zpÓwÖ;î¢o øO£~éìó£áïÉÒ·g@F€¤=¸éۇؔzݽѷ|‡Ñ-g„¿+Kßž YJôà¦ÿlø•âoxRÝOþVøû²ôïY‘ ©Dnz¼î'~¥”ºŽ¾àIUÞZZKŸþÞ,mÌ€Œ,H%zpÓ÷Íÿ ¥zøæè[žVÿœÄ¿;K€$e@*у›¾¯ .Ü5ú6€ï©îo(íÕ/–,ÈÈ€T¢·…^gß7”2êGß°I†×þ-Y‘ ©Dn ½ÑíçGß°éêºtý…ð÷h-ì,ÈÈ€T¢·…\ïÄ?þø`³U÷\ZZs‹Âß§µp³ # @R‰Üjí;”zý}Ñ?<#Ýc/üZ 7 @2² •èÁm¡6¸|ÿ螱ꑯ—Ö’mÃß«µ0³ # @R‰Üb~º”jýÑÀéŸñáïÖZ˜Y‘ ©Dn ±ÑFì°Åêö#¥½ó Â߯µð² # @R‰ÜZ½þ4ú#€Æ .\þŽ­…— YJôà¶ Z¶]©×Þý‘@s†ÝÒÞããßµµ ² # @R‰ÜRƒ/.‹þ¸ qÃk>þ®­…• YJôà¶PjïþªRíèšW×¥sÐÏ„¿skád@F€¤=¸-”†×ýQÀØŒnûBø;·N€dd@*уÛB¨sðÏÎÿ«h˜eÝ#~-üÝ[ # @2² •èÁm!4ºëâèÆ®úæ¥5·(üý[³Ÿ YJôà6ëu?ýûÑ1LL÷˜w†¿ƒkö³ # @R‰ÜfºÅÛ”êᛢ?b˜˜êÁëJkn«øwqÍt€dd@*уÛ,×?ý¢?^˜¸ÞgþGø»¸f; @2² •èÁmVk¯x~©7<ýñÀÄU|}þ¯aD¿“kv³ # @R‰Üfµþù‹£?ZÓ;å¯ÂßÉ5»Y‘ ©Dn³X{—–º³&ú£€0õcw—ÖÒg‡¿›k6³ # @R‰Üf±ÁE«£?V×ÿÜÂßÍ5›Y‘ ©Dn³V{õËK´£?V·ñ;±[Ë·G×ìe@F€¤=¸ÍZƒ+ˆþH þÙG×ìe@F€¤=¸ÍRí=_[ʨý‘@õ†JkÙváïêš­,ÈÈ€T¢·YjxõáÑ'¤Ó?óƒáïêš­,ÈÈ€T¢·Y©½û«ýö<‰zýý¥µô9áïìš,ÈÈ€T¢·YixÕ¡Ñ%¤Õ?ýïÃßÙ5;Y‘ ©Dn³P{÷Wùí?xõc÷”Ö’g…¿»k6² # @R‰Üf¡á•EŒ^ïÔ¿ w×ld@F€¤=¸M{íÝ^Yʰý1@zõšÛKkñ6áïðšþ,ÈÈ€T¢·iopÉÞÑ!LÞÉï ‡×ôg@F€¤=¸Msí;”º·.ú#€©Q=z«ßÔg@F€¤=¸Msýs>ýñÀÔéøgáïòšî,ÈÈ€T¢·©mɶ¥^÷Íè¦Nõàu¥5·(þ^S› YJôà6­õNþËè¦V÷èw„¿Ókz³ # @R‰ܦµêk£?:˜Z£;¾þN¯éÍ€Œ,H%zp›ÆºGýFôÇÀ¦ê·JÝY3_v£ÿ×ðm:½%üÝ^Ó™ YJôà6nûBôǰ0 »¥^sGÝýå2¼þ„2¸tŸÒ?ç_KïÔ¿)½ãßUºG¾­tþ¹ÒÙ÷ ¥½Û+J{Åó7í,_¾}iïòÂÒÞãK{Ï*ß\ºGÿféôžÒ?ë_Êà•exõáetóé¥zè†Rè+0“6žíÑïöšÎ,ÈÈ€T¢·i«sÀ£?2€™Rox°Œîº¸ ¯>¢ôÏýXé÷Gógm{×åúAãê——îaÿ½ôN~o|iEÝxÊür€-PJg¯?ã5}Y‘ ©DnÓÖðÚc¢?2€©´ñOpnü¾§Á%{—ÞÉ9ÿ[wí;ÌÀ _Pº‡ýRéîó¿5X=|sô¥˜*ƒ+ ?Ë5}Y‘ ©DnÓT{÷W•2DdéÕ­‡Ëè¦ÓJÿ¼¹ÒýÔïÌÿ©Íõß‹U/-½ãþpþO–V÷uþ7\x ƒNi¯|IøÙ­éÊ€Œ,H%zp›¦_Þ3úãH©^ßü÷8õÏüàüoöµæ…ŸÙ™jï²ãüw¯:¤Ôˆþ¸Ò|iyøY­éÊ€Œ,H%zp›–ÚËŸWêÞºè …ê‘[ÊàÒ}翯¯½úÂÏè©jñÖó2tpѪR=z[ôG BÝy´´–oFkj² # @R‰ܦ¥Þiïþ¨â »eô³ç¿ç®³×ëÂÏäYªsÈÏ—Áeû•zÃџ2@¨þ™ÿ~&kz² # @R‰ܦ¥ê¾¯DTU¯½« ®8°tygi-{nø9<ó-Þ¦tþÍ2üÚ§Kõ£?~€‰«×Ü>ÿ[Òá籦" @2² •èÁmêô3ÑÀDÔíoÍO]÷Ð_ô=~µwyáü÷)Ök%&ª{ìÁšŽ,ÈÈ€T¢·ihxÕ¡ÑÀØÔ5eø•ÃJ÷ˆ_ó›ÙšÛªtùíù?¿Zê:úV»ÑíçÇŸ½šŠ,ÈÈ€T¢·ìµWìPêþ†è  Y£~^Bé~êÿ.­%Ï ?kõ½ëðÆ2¼îøRªQôÝ0Vý2üÌUþ,ÈÈ€T¢·ìõOÿûè 1õúûÊà¢U¥½Û+ÃÏW=³Ú{¾¶ .ݧ”a7úv‹¿•}Ö*€dd@*у[öªû¿ýl™º*£Û¾PzÇ¿«´o~®ª™6.q7~_c©†Ñw@³ÒÞõEáç¬rg@F€¤=¸e®sðÏE<ÏXÝ][®,í=^~žjŒÿ­ÚïÇËèæÏFßnêŸûÑðóU¹³ # @R‰Ü27¼úˆè`³Õ(ýsþuþ;L£ÏQM®Î¡¿Pª{.¾ýQ?vßZ×Óf@F€¤=¸e­½ó J´£?€MV¯½³ôÏü`i-Û.ü UPs‹Jï¤÷”ºõPôí°ÅzÇÿqü¹ª´Y‘ ©DnYëîÑ À&©¼®ôNx·ß”ÐÔÞå…epÅ¥T£èÛàÝýåðóTy³ # @R‰ܲV=x}ôGð´êµw•Þ‰^Zs[…Ÿ™ÊYçÀ7•êþ¯FߪÏXçÀ7‡Ÿ¥Ê™ YJôà–±Î?ý±<¥ºý­Ò?ûC¥µôÙá祦 %Û–þù‹Kõ£o]€Í6üêQñç¨Rf@F€¤=¸elpñîÑ Àúepé>ó?ðŠ>'5}uöÿ‰RÝ{Uô] °yÒÞeÇð3Tù² # @R‰ÜÒ5·U©×}3úcøÃk?UÚ»½2þŒÔt·dÛ2øÒrß L•þYÿ~*]€dd@*у[¶º‡¿5ú#øÕ£·–îQo?5[u?ñ+¥^woôí °Iª‡o.­¹Eág§re@F€¤=¸ekxÕ¡Ñ @)Ãn響Ä÷üilµw}qÝrFô°I6þ#½èsS¹² # @R‰ÜRµäY¥î<ý‘ Üèg—Î^¯‹?5ûÍ-*ý³?TJ5Œ¾ížÖðºãâÏL¥Ê€Œ,H%zpËT÷Øßþ8€¬î®-½ÿ,ü,ÔÂkãoÖÔíG¢€§6ê—öÊ—„Ÿ—Ê“ YJôà–©áõŸ‰þ8€jtûù¥½û«ÂÏA-ÜÚ»½²T÷^ý(<¥þ9 ?+•' @2² •èÁ-KíÏ/eÐŽþ8€…ø] 9·Uø9(µ–>§ ¯9:ú©xRõšÛý÷Rÿ‘ YJôà–¥ÞIýQ LõÀµ¥³ÿO„ŸÒw4·¨ ¾¸,úñxRÝ£~#þœTŠ,ÈÈ€T¢·,¾qvôG, ƒËö+­¥Ï?û¤§ªwê_—R £€ï0ºñ”ðóQ9² # @R‰Ü2Ô^¹“r“1ì–Þ)ï ?÷¤M©{䯗º·.ú©øOÕ°´w{Eøù¨ø,ÈÈ€T¢· õ>ûwѰTÞZ:ÿ¯ágž´9uøéRox úñ²a·T÷\V—î[z'þYiï²cøÙ¨ø,ÈÈ€T¢· ùóŸÀ¸nù\iïòÂðóNz&µ÷|m©×Üý D½æö2¼æèÒ?óƒ¥{è/–ÖÒ焟ƒÊ— YJôà]{ÅóKö¢?`VÕu響¤´æ…ŸwÒ–ÔÞã5¥zô¶è' ˜1õºo–á'—þ9)ÝÃuþÝ<ú¼Ótd@F€¤=¸E×;þ]Ñ0«ªaéöþðsNjªöª—•êÁ뢟,`JÕ½õet×Åepé>¥wÒ{æ»8ú\Óôf@F€¤=¸E·ñÏ 4­î­+Ý#=üŒ“š®½r'K@à{öJõÍËËà²ýæ—}}^ï·áÕh€dd@*у[h‹·.uû‘è˜1õúûK瀟Ž?ã¤q.º1úQ©×ßW†×Ÿà{û4±,ÈÈ€T¢·ÈºŸøåèË̘êÁëK{÷W…ŸoÒ¸k¯~y©½5ú‘Ôëî-£›N-ýs?VºGüZi¯Ø!üLÒÂË€Œ,H%zp‹lðå=£/?0Cªû¿ZÚ»¾(ül“&ÕÆew½æŽèG˜è÷öýPøÙ#mÌ€Œ,H%zp‹Ìo.M©î½²´wyaø¹&MºÎ^¯+õ†¢A  £þüÏ—¼ôNú‹ÒÙ÷ ¥5·Uø9#=Y€dd@*у[Tý~<úÒ3¢ºï+¥½ËŽáçšUgÿŸ,uwmô£lé÷ö-Û.ü<‘65 @2² •èÁ-ªßYÐÌòÏoþIÝÃßZʰýHO¡^Ý|z響¤tygiïúâðsCÚ’,ÈÈ€T¢·¨ª{.¾ôÀ”«î¹¬´Wì~žIYêÿÇ¥ÔUô£ ^Ý[WFw|± .ZUzŸþƒÒÞí•áçƒÔt€dd@* rX\ù? ¶HõðÍ¥½ë‹ÂÏ3)[ý³þ%úñ„…e4(Õ½W•Á”ÞÉY:ûýßÛ§‘ YJôàQï„wG_v`Ê¿3©½ÇkÂÏ2)kƒ+Œ~La¦ÿ4o¾Ñ IDATÿ§<Ïùˆïíӂ΀Œ,H%zp‹hxõáÑ—˜â?«Ö9àá瘔ºÅÛ”Ñm_ˆ~\aêÕݵóÏ’ï퓞˜ YJôàQ½öÎèËL£Q¿t|[ø&MC¿³zè†è§¦FÝßPFw]\—îSz'½çñ?å™àY–²f@F€¤²àÅ=(ú’Sj㟎>äiª³×—º³&úÑ…œßÛwßÕexåA¥wÊûJgÿŸ(­Å[‡?³Ò4e@F€¤=¸MºÞiï¾äÀ\¼[øù%Mck¶T£èG’}oßsßMiÚ³ # @R‰Ü&Ýðºã£/90eF·Ÿ7ÿfÑç—4­õÏ›‹~Œ!î{ûVîþ J³˜ YJôà6Ñæ•zÃї˜"õÚ»üðVÚÒæ•á'G?Îм~ë‰ßÛ7·(þ™“@€dd@*уÛ$ëìÿ“Ñ—˜&ƒNéðÓág—4 µw~A©¾õè§ž¹jXªû¯)ë)½Sÿzþ½Ò÷öIqY‘ ©Dn“¬Ö?G_n`ŠôNù«ðsKš¥:¼±”a7úцMR=z[~íÓ¥Ö¿øÞ>)a€dd@*уÛ$ÝrFôå¦ÄèÆSÂÏ,iëŸñÿF?Þðu÷±Çÿ”çE«þÿïí{Iø³"éé³ # @R‰Ü&ÖâmJÝ[}¹)P¯¿¯´w}Qü¹%Íh« ÂŒ¥ºï+¾·Ošò,ÈÈ€T¢·IÕ9ä¿E_j`Ôué~ò·ÂÏ,iÖh[¯¹#úig!¨F¥zè†2¼æèÒ?óƒÿ)Ï%Ï $my€dd@*уۤêŸûÑèK LÁeû…ŸWÒ‚ù‡9Õ(ú‘gÆl\,¯;¾ôÏþPéöK¥µ|ûð{]Òx² # @R‰Ü&ÕèæÏF_j ¹ê‘¯—Ö²íÂÏ+i¡4¸peôcÏ«Ûß*£¯ŸU_\ZºÇüvi¯Ü)üž–4¹,ÈÈ€T¢·IUox0úRÉu~GøY%-¨–>»T|-úÑgøÞ>Iß• YJôà6‰:{½.ú2É ¿öéð³JZˆuxc)£~ô@öïí[úìð{UR®,ÈÈ€T¢·IÔ;ñÏ¢/3XÝ[WÚ»½"ü¬’jýóGª×ßWF7Ÿ^úç/)ÝcÞYÚ»¼0üž””? @2² •èÁm .Û/ú2‰õ?÷ðsJZÐ-Þ¦Tß¼"ú(`Bÿàbt×Åÿ)ÏãßUÚ«^ÿIšÊ,ÈÈ€T¢·I䇊ÀS©î¿¦´o~NI ½ßéV†Ýè#& :et÷%/ûNxwéìý#á÷™¤ÙÉ€Œ,H%zp{KŸã»…€§Ô=ê7âÏ)Ióõ?ÿ?£¶@½ævßÛ'ibY‘ ©Dnãnã žÌ讋ÂÏ(IßÖÜVetçÑGÏè{ûvŒ¿$-¨,ÈÈ€T¢·q×?ûCÑ—HªsÈ ?£$}g½~xþOG’GÝ][F·žS_ZQºŸúÒ^õ²ðûD’,ÈÈ€T¢·q7¼áÄèK $4ºé´ðóIÒ“·ñ·Ê2”ê¡ÊðªCJï¤÷Ì7ãÆßÌŒ¾'$黳 # @R‰ÜÆ]ýØ=Ñ—Ȧ®JgÿŸ ?Ÿ$=EKŸ]ªo}#ú¤˜}uUª‡n,ïYú§ÿCéô3¥µdÛøÏ_’6! @2² •™ W¿<úò n:5ü|’ôôu|[ôQ1s|oŸ¤YÊ€Œ,H%zpg¿§à»uýÅðóIÒ÷nxýg¢‹©U÷Ö—Ñ]—Á¥ûÌÿ)Ïöž¯ ÿ<%©É,ÈÈ€T¢·qÖ?ïߢ//LõÍ+ÂÏ&I›V{ÕËJÝ},úØÈ¯>þ½}×]z§ý­ïí“´ ² # @R‰Üƙ߾[ïÓ~6IÚôúg(úØHù§<‡×ŸPúg~ðñßh^úœðÏI’& YJôà6Ϊ‡o޾¼@"õšÛKkñÖág“¤Íhñ6¥ºÿš²PÕëïÿÎïíÛõEñŸ‰$%È€Œ,H%zpŸ3ÿ'±þ]ÿô¿?›$mvË­ÔuYhßÛ7ÿ§<\Iʘ YJôà6®:¾)úÒ‰Ô5¥µì¹ág“¤gÖðêÃËLõKuï•epùÇKïä÷–ξoð½}’´Y‘ ©Dnãªwò_F_Z ‘Á¥û†ŸK’žyí•;•º·®ÌÌ÷ö-Û.üšJÒ4g@F€¤=¸«Á—÷Œ¾´@"ÿTø¹$iËêá—éüÞ¾‡_;Išµ,ÈÈ€T¢·q5ºí Ñ—H¢ºçÒð3IR-Û®ÔÝ]2©û|oŸ$d@F€¤=¸«ºõPô¥’èò¾ð3IR3mü¾¼0Õ°TÝP†×=ÿ§<;¾Ù÷öIRP€dd@*39 ®Ü)ú²IÔÝÇJkùöáç’¤†šÛªT÷}e2çÇúûÿSžç|Ä÷öIR²,ÈÈ€T¢·qÔ=òmÑ—HbpÅág’¤fëþÖÆÏŠº»vþχÿÇ÷ö­Ü)üÿOIÒSg@F€¤=¸£þYÿ}Y$:ÿlø™$©ùF_?s˾·ïÎ ÊàâÝJï¸?*íÝ_þÿ$ió² # @R‰ÜÆÑðʃ¢/+@ýØ=¥5·(üL’Ô|}lþ;ù6÷{ûæÿ”ç’mÃÿ÷K’¶, @2² •èÁmmü^ƒ/ï~I_Ã+Þ„ïí{nøÿNIRóY‘ ©Dnã¨^{gôe˜ÿá‚3IÒxj¯zYÝtZ響¸tþÍÒÞõEáÿ›$I“É€Œ,H%zpk¼¥Ï.¥E_V X½îÞÒšÛ*þL’$IRãY‘ ©DncùN `Á\ºoøy$I’¤ñd@F€¤=¸5]÷˜wF_R î'~9ü<’$IÒx² # @R‰Üš®æ?E_R XÝz¨´o~I’$i}) õc÷„ŸA’$Iš\€dd@*у[SU÷\}) £;/ ?ƒ$I’4¹,ÈÈ€T¢·¦ª¾9úRA†×~I’$irY‘ ©DnMU·޾”@Á…»†ŸA’$Iš\€dd@*у[#Í-*¥F_J HÿÌŠ?‡$I’4±,ÈÈ€Tfcø{AôeõŽÿãðsH’$I“Ë€Œ,He&†¿=_}@ÝOürø9$I’¤Ée@F€¤=¸5QçÀ7E_F PgŸ×‡ŸC’$Iš\€dd@*у[uz{ôeµwÙ1ü’$IÒä² # @R‰Üš¨÷™?‰¾Œ@”º.­Å[‡ŸC’$Iš\€dd@*у[õOÿ‡èË©»…ŸA’$Išl€dd@*у[õÏû·èË©×Þ~I’$i²Y‘ ©DnM4¸x÷èË©î¿&ü ’$IÒd³ # @R‰ÜšhpÅÑ—2ºãKág$I’&› YJôàÖDï} £¯Ÿ~I’$i²Y‘ ©DnM4¼þ3Ñ—2¼áÄð3H’$I“Í€Œ,H%zpk¢Ñ-gD_F Èðš£ÃÏ I’$M6 @2² •èÁ­‰F·Ÿ} Ã+?ƒ$I’4Ù,ÈÈ€T¢·&ªî¹,ú2A—ì~I’$i²Y‘ ©DnMT=pmôe‚ .\~I’$i²Y‘ ©DnMT=zkôe‚ ¾´<ü ’$IÒd³ # @R‰Üš¨^woôe‚ôÏ_~I’$i²Y‘ ©DnMTwÖD_F Hÿ¼ ?ƒ$I’4Ù,ÈÈ€T¢·&*Ã^ôe‚ôÏýXø$I’¤Éf@F€¤=¸mq‹·Ž¾„@ þ9ÿI’$i¢Y‘ ©Dn[Üòí£/!¨ö‡ãÏ!I’$M4 @2² •©üVì} @ýÏÿ¯ðsH’$I“Í€Œ,H%zp3ø[¢îGÃÏ!I’$M6s YÊÔ~»¾(úú_øßáç$I’&› YÊÔ~+wо„@ þùKÂÏ!I’$M6 @2² •©üV½4ú_Z~I’$i²Y‘ ©Lýà·ú¢/!hpÁ.áç$I’&› YÊÔ~»½"ú­?‡$I’4Ù,ÈÈ€T¦~ðÛýÕÑ—4¸tßðsH’$I“Í€Œ,Heê¿=^} @ë ?‡$I’4Ù,ÈÈ€T¢·-­³×ë¢/!hxÍ'ÃÏ!I’$M6 @2² •èÁmKëìý#Ñ—4¼þ„ðsH’$I“Í€Œ,H%zpÛÒ:û¼>úF·œ~I’$i²Y‘ ©Dn[Zgß‹¾„@ Ñíç…ŸC’$É5Ðd³ # @R‰ܶ´Î^?} @£»/ ?‡$I’4Ù,ÈÈ€T¦~ðÛã£/!¨zàkáç$I’&› YÊÔ~«_} @õÚ;ÃÏ!I’$M6 @2² •©üVî} @uû[áç$I’&› YJôàfð¶Èh~I’$i²™ÈÈ€T¢·-nùöÑ—ÖZ¶]üY$I’¤‰e@F€¤=¸mqKž} `íU/?‹$I’4±,ÈÈ€T¢·-nnQô%‚uöþ‘ø³H’$IË€Œ,H%zpk¢R £/#¨sÐ[ÂÏ!I’$M. @2² •èÁ­‰Ê°}@Ý£ß~I’$irY‘ ©DnMT÷ÖG_F P錄?‡$I’4¹,ÈÈ€T¢·&ª;k¢/#¨ö‡ÃÏ!I’$M. @2² •èÁ­‰ê D_F Ðà¢Uáç$I’&— YJôàÖDõš;¢/#hxõááç$I’&— YJôàÖDÕƒ×G_F ÐèæÓÃÏ!I’$M. @2² •èÁ­‰ª{.‹¾Œ@ g@ô9$I’¤Ée@F€¤=¸5Ñèöó¢/#¨zô¶ðsH’$I“Ë€Œ,H%zpk¢ÑM§E_F PÝ},ü’$IÒä² # @R‰Üšhøµc£/#¬µôÙág‘$I’&“ YJôàÖD뾌@°öê—‡ŸE’$IšL€dd@*у[ .Ù+ú2Á:ÿ©ð³H’$I“É€Œ,H%zpk¢Á—VD_F X÷È_?‹$I’4™,ÈÈ€T¢·&êŸûÑèËëð§ág‘$I’&“ YJôàÖDýÏ} ú2Áúg~0ü,’$IÒd² # @R‰Üš¨wÊû¢/#l㟎>‹$I’4™,ÈÈ€T¢·&êÿ®èË~å°ð³H’$I“É€Œ,H%zpk¢îQo¾Œ@°Ñ­Ÿ?‹$I’4™,ÈÈ€T¢·&êô–èË«º1ü,’$IÒd² # @R‰Üš¨³×ë¢/#¬î­?‹$I’4™,ÈÈ€TfbøÛeÇèË$Ð^±Cøy$I’¤ñg@F€¤=¸5ÒÜV¥ÔUô¥‚uöûñøóH’$IcÏ€Œ,H%zpkªº³&úRÁºGÿføY$I’¤ñg@F€¤=¸5UõèmÑ—Ö;íýág‘$I’ÆŸ YJôàÖTÕ½WE_J Øà‹ËÂÏ"I’$? @2² •èÁ­©F·ž})`ë?‹$I’4þ,ÈÈ€T¢·¦^w|ô¥‚nûBøY$I’¤ñg@F€¤=¸5ÕàŠ£/%¬zä–ð³H’$IãÏ€Œ,H%zpkªÁ»D_J Ú ~I’$iüY‘ ©DnMÕÿüÿŒ¾”@í]v ?$I’4Þ,ÈÈ€T¢·¦êü—Ñ—H óñŸ ?$I’4Þ,ÈÈ€T¢·¦êýŽèK $Ð=æ·ÃÏ#I’$7 @2² •èÁ­©:¾)úR ô>ûwáç‘$I’Æ› YÊÌ €»½"úR .Ø%ü<’$IÒx³ # @R‰Ükñ6¥ÔUôå‚ ¯9:þ<’$IÒX³ # @R‰Üš¬n+úrÁFw^~I’$i¼Y‘ ©DnMV=tcôå‚Õëî ?‹$I’4Þ,ÈÈ€T¢·&ÝñÅèË D«ëÒZöÜðóH’$IãË€Œ,H%zpk²áuÇE_N Îþ?~I’$i|Y‘ ©DnM6¸tŸèË $Ð=öwÃÏ#I’$/ @2² •èÁ­Éúç~,úr ôÏþpøy$I’¤ñe@F€¤=¸5Yï”÷E_N Á†ŸG’$I_€dd@*у[“u?ù[Ñ—H`të9áç‘$I’Æ— YJôàÖdß}9ê5·‡ŸG’$I_€dd@*35®ziôå2¨F¥µäYág’$I’Æ“ YJôàÖhs‹Jö¢/)@gï‰?“$I’4–,ÈÈ€T¢·¦«×Ü}IºGÿføy$I’¤ñd@F€¤=¸5Ý讋¢/)@ÿŒ ?$I’4ž,ÈÈ€T¢·¦~íØèK $0¸dïðóH’$IãÉ€Œ,H%zpkºÁE«£/)ÀèæÓÃÏ#I’$' @2² •èÁ­éúŸû@ô%¨¾)ü<’$IÒx² # @R‰Üš®ûéß¾¤@Ã^iÍm~&I’$©ù,ÈÈ€T¢·¦ëô–èK $ÑÞýUág’$I’šÏ€Œ,HeæÁU/‹¾¤@ÝÃ5üL’$IRóY‘ ©Dn7·U)£~ôeèú7ñg’$I’Ï€Œ,H%zpGõÚ;£/+Àà•áç‘$I’šÏ€Œ,H%zpG£».޾¬@ÃO?$I’Ô|€dd@*уÛ8~íØèË $P=tcøy$I’¤æ³ # @R‰ÜÆÑà‚£/+ÁhPZK¶ ?“$I’Ôl€dd@*уÛ8êú×Ñ—H¢³ÏëÃÏ$I’$5› YJôà6ŽºGüZôe’èû{ág’$I’šÍ€Œ,He&‡Á=_}Y$úç~,üL’$IR³Y‘ ©Dnciñ6¥TÃèK $0¼æ“ñg’$I’Í€Œ,H%zpWõÚ»¢/-@uïUáç‘$I’šÍ€Œ,H%zpW£;¾}iêþ†Òš[~&I’$©¹,ÈÈ€T¢·q5¼úˆèK $ÑÞýÕág’$I’šË€Œ,H%zpWýóæ¢/-D÷¨ß?“$I’Ô\€dd@*у۸êøçÑ—H¢Ö?‡ŸI’$Ij. @2² •èÁm\uûïÑ—HbxÕ!ág’$I’šË€Œ,HefÂÝ^}i$Fw]~&I’$©¹,ÈÈ€T¢·±5·U)ƒNôå¨ÛÄŸI’$Ij, @2² •èÁmœUÝ}y$Ú»¾8üL’$IR3Y‘ ©DnãltÓ©Ñ—H¢{Ø/…ŸI’$Ij& @2² •èÁmœ .Þ-úòIôNûÛð3I’$IÍd@F€¤=¸³Þiï¾¼@ƒKö?“$I’ÔL€dd@*уÛ8ëþÖèË $1ºõóág’$I’šÉ€Œ,He¦‡ÂÝ^}y$êÇî?“$I’ÔL€dd@*уÛX›[Têþ†èK dP×¥½üyñç’$I’¶8 @2² •èÁmÜU\}‰$:¾9üL’$IÒ–g@F€¤=¸ýöî<\³º:ð½UÑèc4‰fÖ$&Ú¶IbbÌÐÞ˜6CÇN®v†+é›tÇt¢Á6c¦sj€B@ÁbžDJF A D&‘Aæ¡DF™Š‚bzçaÿîs¹¤†sÞµö~?Ÿçù>ýG÷íÙû¬ªU‹sÞÖ"7¼îÄè/1DoíNá3I’$IÛŸ 9Jôâ¶Ø Î[ý%’|åcá3I’$IÛŸ 9Jôâ¶ØõNúóè/1Äè¦/„Ï$I’$m€dä@*Ñ‹Ûb×=ìíÑ_b ‰êá;Ãg’$I’¶?@2r •Æ/†»ÿ`ô—H¤½úûÂç’$I’¶/@2r •èÅmUÍÑ_f ‰î§~-|&I’$iûr #@R‰^Ü&ÑøÎ¯F™$ú§0|&I’$iûr #@R‰^Ü&ÑðŠ#¢¿Ì@ÃË ŸI’$IÚ¾ÈÈ€T¢·IÔ?ó#Ñ_f ‰¹ŸŽžI’$IÚ¾ÈÈ€T¢·IÔ=ú÷¢¿Ì@ýViÍ, ŸK’$IÚöÈÈ€T¢·IÔÙû'£¿Ì@"s3!z.I’$iÛs #@R‰^Ü&ÒÌÒRè/5D÷Ø?ˆŸK’$IÚæÈÈ€T¢·I5¾÷êè/5DÿÜÙð™$I’¤mÏ€ŒH%zq›TÃkŽþRI ¯;1|&I’$iÛs #@R‰^Ü&Õ`ýŠè/5ÄxÓ†ð™$I’¤mÏ€ŒH%zq›T½ÏýQô—È¢—Öª†Ï%I’$m[€dä@*ыۤêìÿ†è/5Hç ·„Ï%I’$m[€dä@*Ñ‹ÛÄZñüRÆ£è/7Dïäÿ?—$I’´M9‘ ©D/n“lüàÍÑ_n ‰ÁÅkÂg’$I’¶-@2r •èÅm’n8%úË $1ºu}øL’$IÒ¶å@F€¤½¸M²Áy»F¹$ªöá3I’$IÛ– 9Jôâ6ÉzŸûãè/7H{ ŸK’$IÚúÈÈ€T¢·IÖÙïõÑ_n ‘îQï ŸK’$IÚúÈÈ€T¢·‰¶|ÇRFýè/9DÿÌÄÏ%I’$mu€dä@*ыۤßwmô—HbxågÂg’$I’¶>@2r •èÅmÒ ¯9.úK$1¾÷ªð™$I’¤­Ï€ŒH%zq›týsþ5úKd1ê—Öòç†Ï%I’$m]€dä@*ыۤë~ö¿FÉD:û½>|.I’$iër #@R‰^Ü&]aÕ2C IDATgþ’‰ôN|_ø\’$IÒÖå@F€¤½¸M¼™¥¥ô[Ñ_v ‰Á…{ÅÏ%I’$mU€dä@*Ñ‹[Dã».þ²IŒn]>“$I’´u9‘ ©D/n ¯8"úË$Qu.­™%ásI’$I[ž 9JôâQÿŒGÙDÚ{½:|.I’$iËs #@R‰^Ü"êñŽè/;Hï¸÷„Ï%I’$my€dä@*S¹,®~i)Uý¥’œ·:|.I’$iËs #@R‰^Ü¢ª¾#úK$1úÆÃg’$I’¶<@2r •èÅ-ªÑ§Fé$ªÖÆð™$I’¤-Ï€ŒH%zq‹j°~Eô—H¤½ç‡Ï%I’$mY€dä@*Ñ‹[TÝcÿ úK$Ò=ú÷Âç’$I’¶,@2r •©]÷zUô—H¤îlø\’$IÒ–å@F€¤½¸…5³¤TÍÑ_~ ‰Ñ 'ÇÏ%I’$mQ€dä@*Ñ‹[d£Û΋þòITß>“$I’´e9‘ ©D/n‘ .^ýåiïöòð¹$I’¤gÏ€ŒH%zq‹¬wÒŸGùDºG¾3|.I’$éÙs #@R‰^Ü"ëð Ñ_~ ‘þYÿ>—$I’ôì9‘ ©D/n¡-n)£~ô#’^s\ü\’$IÒ³æ@F€¤½¸E7¾÷ªèG$1Þ´!|&I’$éÙs #@R‰^Ü¢~ýÓÑÈ¢ªJ{—‡Ï%I’$}÷ÈÈ€T¢·èúg|8ú‰tûÕð¹$I’¤ïž 9Jôâ]÷ð߈~@"ýu ŸK’$Iúî9‘ ©D/n)ǪŠ~ @s¿8z.I’$é»ç@F€¤½¸e¨zè¶èÇ$1¾÷êð™$I’¤ïž 9Jôâ–¡Ñ 'G? ‹ñ°´V¾ |.I’$é™s #@R‰^Ü2Ô?wyôcéô–ð¹$I’¤g΀ŒH%zqËP÷³ÿ5ú1‰ôNý«ð¹$I’¤g΀ŒH%zqËPû?ý€D†—>—$I’ôÌ9‘ ©D/n)šYRªÎæèG$1¾ëÒø¹$I’¤gÌ€ŒH%zqËÒèÖ/G? ‹a·´fwŸK’$IzúÈÈ€T¢·, .údô£éðóásI’$IOŸ 9Jôâ–¥Þçÿ{ô£éò—ásI’$IOŸ 9Jôâ–¥Î~ÿ1úQ‰ /;4|.I’$éés #@R‰^ÜÒ4»¬”~+úqIŒï¹2~.I’$éis #@R‰^Ü25ºãÂèÇd1–ÖÊ„Ï%I’$=5@2r •èÅ-Sƒ‹×D? ‘Î!¿>—$I’ôÔÈÈ€T¢·LõÖîý8€DúëvŸK’$Izj€dä@*Ñ‹[¦:û¼6úq‰ ¯::|.I’$é©9‘ ©D/n©šYZªÞ£ÑHb¼é¦ø¹$I’¤§ä@F€¤½¸ektÛW¢ EUÍÿãRô\’$IÒ“s #@R‰^ܲ5¸p¯èG$Ò=âásI’$IO΀ŒH%zqËVï„?~$@"ý³>>—$I’ôäÈÈ€T¢·luÖ¼&ú‘‰ ¯[>—$I’ôäÈÈ€T¢·tÍ,)U÷¡èÇ$Q=|Gü\’$IÒ“r #@R‰^Ü26ºåÜèÇ$ÒÞýÃç’$I’žÈ€ŒH%zqËØàü=¢ H÷èß ŸK’$Iz"@2r •èÅ-c½ãÿ[ôc¬_>—$I’ôD€dä@*Ñ‹[ÆÚ{½:ú±‰Œ6¬ ŸK’$Iz"@2r •èÅ-e3KJÕ~ úÑIT­ûãç’$I’¾ 9Jôâ–µÑÍgE? ‘ö'~<|.I’$éñÈÈ€T¢·¬ Î[ýh€Dzǽ'|.I’$éñÈÈ€T¢·¬õŽýÃèG$28ð¹$I’¤Çs #@R‰^ܲÖþøE? ‘Ñ­ëÃç’$I’Ï€ŒH%zqË\ÕÚýx€$ªÞ£¥5³4|.I’$É€œH%zqËÜhúèÇ$ÒÙçgÃç’$I’ÈÉ€T¢·Ì Ö¯Œ~<@"½µ;…Ï%I’$9“ ©D/n™ëóûÑHdðÕ}Ãç’$I’ÈÉ€T¢·ÌµwEôãßùÕð¹$I’$@rr •èÅ-{Õ£wG?" ‹a·´–ï>—$I’¦=@2r •èÅ-{£O‹~D@"ß>—$I’¦=@2r •èÅ-{ýsþ5ú‰ôNyø\’$IšöÈÈ€T¢·ìu?ý[ÑHdxùaásI’$iÚs #@R‰^ܲ×^ýÒRª*ú1IŒï½*|.I’$M{€dä@*Ñ‹[oº)ú1YŒG¥½êEásI’$išs #@R‰^ÜêÐðÊÏD?& ‘îá¿>—$I’¦9@2r •èÅ­õOÿ`ôcééÃç’$IÒ4ç@F€¤½¸Õ¡ÎÁ¿ý˜€DF7œ>—$I’¦9@2r •èÅ­-n)Ã^ô£’¨Zãç’$IÒç@F€¤½¸Õ¥ñ·.‰~T@"íOüxø\’$IšÖÈÈ€T¢·º4øê¾Ñ H¤÷¹? ŸK’$IÓš 9JôâV—z'¾/úQ‰ .Ú;|.I’$Mk€dä@*Ñ‹[]ê¬yMô£ßyqø\’$IšÖÈÈ€T¢·Ú4³¤Tí¢ŰWZ+ž?›$I’¦0@2r •èÅ­Nn>3úq‰t~kø\’$IšÆÈÈ€T¢·:5øòªèÇ$Ò_÷¡ð¹$I’49‘ ©D/nuª{ôïE?. ‘áÕdžÏ%I’¤iÌ€ŒH%zq«Sí}ôã©6ß>—$I’¦1@2r •èÅ­nÍýƒ?Àÿ¯½û†Ï%I’¤iË€ŒH%zq«[ÃkŽ~d@"Ýc~?|.I’$M[€dä@*Ñ‹[Ýêñï¢Èà¼ÕásI’$iÚr #@R‰^ÜêV÷°·G?2 ‘Ñ-ç†Ï%I’¤iË€ŒH%zq«]+_PÊhýØ€$ªÞ£¥5»,~6I’$MQ€dä@*Ñ‹[ßóõèÇ$ÒÙÿ ásI’$išr #@R‰^ÜêØðÒƒ£Hï”÷‡Ï%I’¤iÊ€ŒH%zq«c½“þ"ú±‰ ¯8<|.I’$MS€dä@*Ñ‹[ëì÷úèÇ$2Þx]ø\’$Iš¦ÈÈ€T¢·Z6³´T½G¢EUÍÿ#Tøl’$Iš’ÈÈ€T¢·º6ºu}ô£éùÎð¹$I’4-9‘ ©D/numpþîÑH¤ÎLø\’$Iš–ÈÈ€T¢·ºÖ;ö£Èè¦/„Ï%I’¤iÉ€ŒH%zq«kí=~(úщTíJkfIøl’$Iš†ÈÈ€T¢·:W=rWôãé|ò§Ãç’$IÒ4ä@F€¤½¸Õ¹Ñõ'E?> ‘Þ‰ï ŸK’$IÓ 9JôâVçú_úÇèÇ$2¸d¿ð¹$I’4 9‘ ©D/nu®{Ä;¢Èø®ËÂç’$IÒ4ä@F€¤½¸Õ¹ö./.¥G?B ‹Ñ ´V¾ |6I’$5=@2r •èÅ­î7^ýDºŸúõð¹$I’ÔôÈÈ€T¢·º7¼âˆèG$Ò?ûŸÃç’$IRÓs #@R‰^Üê^ïÔÿýDFÖ…Ï%I’¤¦ç@F€¤½¸Õ½ÎoŒ~„@"U÷¡ÒšY>›$I’šœ 9JôâVû–ïXÊ ýD:û½>~6I’$58@2r •èÅ­ î¸0ú1‰Ìýjàè¹$I’ÔäÈÈ€T¢·&4¸hïèÇ$2¼êèð¹$I’ÔäÈÈ€T¢·&ÔûÜG?F ‘jó­ásI’$©É9‘ ©D/nM¨½×«¢#L{Ï ŸM’$IMÍ€ŒH%zqkJUkcô£éÿÞð¹$I’ÔÔÈÈ€T¢·¦4ºé ÑHdpñšð¹$I’ÔÔÈÈ€T¢·¦Ô?w6úQ‰Œïº,|.I’$55@2r •èÅ­)uzWô£2K{Õ‹Âg“$IRs #@R‰^ÜšR{õ÷•RUÑH¤{Ä;Âg“$IRs #@R‰^ÜšÔøoD?N ‘¹_ =—$I’š˜ 9JôâÖ¤†Wý8DF7Ÿ>—$I’š˜ 9JôâÖ¤úëvŽ~œ@"Uï‘Òš]>›$I’š– 9JôâÖ¤:¿5úqÉtøùðÙ$I’Ô´ÈÈ€T¢·Fµây¥ {ÑH¤úâg“$IRÃr #@R‰^ÜšÖø®K£)ÈðêcÃç’$IRÓr #@R‰^ÜšÖà’ý£)HõðásI’$©i9‘ ©D/nM«·v§èG $Óþø†Ï&I’¤&å@F€¤½¸5­Îš×D?R ™Þ >›$I’š” 9JôâÖ¸f–”ªý@ôc™ûÕÀá³I’$©A9‘ ©D/nMltó™ÑHd|Ï•ásI’$©I9‘ ©D/nMl°~eôc2J{×—„Ï&I’¤¦ä@F€¤½¸5±îÑ¿ýXdºŸþ­ðÙ$I’Ô”ÈÈ€T¢·&ÖÞíe¥TUô£™ûÉàèÙ$I’Ô”ÈÈ€T¢·¦Vm¾%úщŒn97|.I’$5%@2r •èÅ­© ¯>6úÑ™ô[¥µ|ÇðÙ$I’Ô„ÈÈ€T¢·¦Ö_÷¡èG $Ó9ä—Ãg“$IRr #@R‰^ÜšZç_Š~´@2ý/ýcøl’$IjB€dä@*Ñ‹[c[ñ¼R†½èÇ $2úÆãg“$IRr #@R‰^ÜšÜø®Ë¢/HÕÌçJ’$-@€dä@*Ñ‹[“\²ôã’éüÖðÙ$I’T÷ÈÈ€T¢·&×[»Sôã’éŸõá³I’$©î9‘ ©D/nM®³æ5ÑHf´a]øl’$Iª{€dä@*Ñ‹[£›YRªöÑH¤ê=ZZ³;ÄÏ'I’¤ç@F€¤½¸5½ÑÍgF?b ™ÎAoŸM’$Iu΀ŒH%zqkzƒõ+£1LÿÌ¿ŸM’$Iu΀ŒH%zqkzÝ£7úÉŒn:=|6I’$Õ9@2r •èÅ­éµ?öýÑH¦ê>\Z³ËÂç“$Ijní=~¨t?ûî28ou}óìÒ;ñ}Íúßç@B€¤½¸MCÕæ[¢3LçÀ7†Ï&I’Ԍګ^Tº‡þJé¯Û¹ ¯<ªŒ7^÷”¿{ô×}¨Yÿ›HÈ€T¢·ihxõ±ÑH¦ÿÅ¿ ŸM’$©†ÍîP:û¾®ôÖîT¯)ã»//¥?ûß=¾ôñÿ_ÀÈÈ€T¢·ihî¿¶ø÷F7ž>›$IRþÚ{¼²tþ½28÷2ºý‚Rmú»Ç`ýŠf}]HÈ€T¢·i¨sÈ/E?f ™ªûÏ”$IOª½û+æ}ýs——ѧ•ª½iÁþî1w@lÔ×Ê€„H%zq›ŠV<¯”a/úQÉtøùøù$I’Ò~nßB\¼O³¾~€$ä@*ы۴4¾ëÒèG $3÷ë£g“$I úܾñh¢ï^vHü×as #@R‰^ܦ¥Á%ûG?j ™Ñõ'…Ï&I’4‰ÏíkGÿµ£ ¯üL³¾Æ€$ä@*ы۴4÷_ûü{UçÁÒšY>Ÿ$IÒö¢ºGþæŸÛ׺¿d4¼ö„Æ}Ý @R‰^ܦ¥Îš×D?j ¡ÎþoŸO’$i [õ§~n_U•:Ýtzü×os #@R‰^ܦ¦™%¥j?ý¸dú_øÛøù$I’žÚì²'}nßü¯òõK]¾yvü×ts #@R‰^ܦ©ÑÍgF?n ™áukÃg“$Izâsûæ•ç7ÏNñ¹} itÇ…á_ã}^€$ä@*Ñ‹Û45X¿2úqÉTíMó?!=Ÿ$Iš¦ÚûþÒ=úwçÿ~>ÚpÆTü¦Žñ]—5ë: ©D/nÓÔÜ?2|§Î~¯ŸO’$5¶nßBßseü³XÀÈÈ€T¢·iû/¾Sÿô†Ï'I’Ñ쥳ÿÏ•Þ)Y†—VÆ÷^]ÊxýG} ãû®‰> ˜ 9Jôâ6mU›o‰~ä@2£NŸM’$5âsûú­è?ÖÓo¼¾YÏÞ€„H%zq›¶†WýÈdªîÃó?±=Ÿ$IÊ\{×—<þ«<ÏúhÝxZ©Z£ÿ¯•ñ¦›ö>8 ©D/nÓV݇¢9Pç_ ŸO’$¥iùŽ¥sà›¦þsûÒøÁ›ãŸëæ@F€¤½¸M[sÿÈðúçÌ„Ï'I’Bš]V:û¾®ôÖîT¯)£Û/(eØ‹þ£¹qªÍ·Æ?ëÌ€ŒH%zq›ºV<Ï?hO1ºí+ñóI’¤InßܯòìlŽþcx*TßѬ÷È€„H%zq›ÆÆw]ýØlFýÒ^õ¢ðù$IÒBÖÞåÅnßܯò¼ö„R=v_ôŸ¸S«zä®f½[€$ä@*Ñ‹Û46¸dÿèÇ$ÔýÌï„Ï'I’¶ësûæ~•ç)ï÷¹} UÝÿŽ,`€dä@*Ñ‹Û46÷ù&ßipÑÞáóI’¤-ÊçöÕNÕº?þ½YÀÈÈ€T¢·i¬³æ5ÑHh|ß5áóI’¤§ËçöÕ_Õy°Yï¤ 9Jôâ6•Í,ñ&ÀSUÕü?°†Ï(IÒT×^ýÒÒýô.ýsþõñcßc÷Fÿ ɨº5ë=u !@R‰^ܦµÑÍgF?z ¡Þ‰ï ŸO’¤)jÅóKç_.ýu;—áUÇ”ñ¦ >·¯¡ü ,>@R‰^ܦµ¹_Ÿð†_?2|>I’š[{¯WÇçöu£ÿècB| ,>@R‰^ܦµîQïŠ~ô@BÕ#w…Ï'IRS?·ïÁè?æT=v_³Þo@r •èÅmZ›_X«qôãêìóÚð%IªWí]¾·tý•Ç•ç•G•jó­Ñœ‘LõèÝÍzçHÈ€T¢·in|ÿ ÑH¨ÿ…¿ ŸO’¤ÄÍîP:û¾nþWy/;¤Œ7^ç?,ãYUßÿî.`€dä@*Ñ‹Û47¼âˆèÇ$4ºñÔðù$IÊõ«<{Ç¿×çö±]ª‡nkÖ÷… 9Jôâ6ÍõNyôãªz–ÖòÃg”$)Áçöµˆþc‰†¨6ßÒ¬ï@r •èÅmšëìÿ†èÇ$5÷9NÑ3J’4éÏí»%úlüÀ7šõýã@B€¤½¸Mu3KKÕ{$úšûÉð%IZ¸|nÁÆ÷ßÿ}°€9‘ ©D/nÓÞè–s¢_ ¡¹ÏxŠžO’¤üܾA'ú¦ÜxãõÍús !@R‰^ܦ½Áy»F¿@Fãaiïòâð%IÚ–ÏíÛý§<Åø¾kšõ}ç@B€¤½¸M{sÿXðtºÇü—ð%IzrsÿqF÷ðÿTúg}´ ¯ÿ|©ùVô°EÆ÷|½Yß‹€$ä@*ы۴×þØ÷—RUѯÐàâ}Âg”$MuËw,ƒÞ\ú§ýM~ýÈù_¡èsû¨«ñÇO-`€dä@*Ñ‹›žSÆÞý 7Ý>Ÿ$i•çàüÝ}n3ºåÜf}¿: ©D/nzN^utôk$ÕÙû§Âg”$5±¹ãA÷Èßô¹}Lцuû€lH%zqÓsJÿôD¿@Rý/ümøŒ’¤º×^õ¢Ò=ôWJÝÎexåQe¼ñºèñ7÷™•ú¾v !@R‰^ÜôœÒ9ðMѯÔè_ ŸQ’T«fw(}_Wzkw*ƒ‹×”ñÝ——2Es7¼ú³ñߟ ˜ 9Jôâ¦Çÿ¡ªô[ѯѰ7ÿ“+ásJ’jó¹}íèÉ ) /ÿT³¾÷HÈ€T¢7=Þ趯D¿ @Rsÿ°=£$)åçöµîÑPƒKöÿ^èyÙ8Jôâ¦Çœ¿Gô«$5øÚá3J’&Þª>õsûª*z$Cm .üDü÷õæ@F€¤½¸éñºÇþAô«$U=|gøŒ’¤EmvÙ“>·oþWyŽúÑãepÞ®ñßë ˜ 9Jôâ¦[`÷xeô«$ÖÙ÷?„Ï)IZèÏí›ÿUžß<ÛçöÁôÏù×fÍ@r •èÅMOT=t{ôë$Õ?ëÂg”$mKí]_òø¯ò<ë£ÿö¹}£G*L¥þ™ß°Ùâ@>€¤½¸é‰†×ý:In;/|FIÒ}nßa¿Zú_ü»2¼æøRm¾5z|ÿ¦Ú_ÇψÌ€ŒH%zqÓõOÿ`ôëd5ÎÿCWôœ’¤oçsû Vz'üiüÜXÀÈÈ€T¢7=Qç€_ˆ~€Äzǽ'|NIšÞžò¹}ýVôX¶ÂÜ÷o£f’ 9Jôâ¦×ì²Rõ‰~%€¤†W?§$Mççö=v_ô¶S÷S¿Ö°9å@>€¤½¸éÉÍÿõO£jm,­™¥ásJRÃZ¾céø¦Ò_·s^yTo¼®”ªŠyÀëìÿsñófs #@R‰^ÜôäëWD¿@bƒÞ>§$Õ¿Þ R†—RÆ÷\9ÿ£@óµ÷zUøìYÈÈÈ€T¢7=¹î‘ïŒ~%€ÄúçΆÏ)Iõ¯j?=΀ k¯þ¾ðÙ³9‘ ©D/núŽEv—ï-e<Š~-€¤Æw~5|NIªy3Ký]¦Ðܯû Ÿ? ˜ 9Jô⦧6ÿ븞N5.íý@øœ’TßÚ«_=É€I´›7ËHÈ€T¢7=µÁ%ûG¿@b½µ;…Ï)Iõ­³÷OE1`ªÇî Ÿ=  9Jô⦧Ö;áO£_ ±á5LJÏ)Iõ­sð/F1`ÂÆ›6„Ïž…΀ŒH%zqÓÓ,³Ÿøñè×H¬ê=RZ+ž>«$Õ³îQ¿=Æ€ ßuiøìYèÈÈ€T¢7=}Õ#ߊ~5€ÄºŸùð9%©žõN|_ô&l´áŒðÙ³Ð9‘ ©D/nzú†×~.úÕ^~Xøœ’TÏúë>=€ ^yTøìYèÈÈ€T¢7=}ýu;G¿@bU{SiÍî>«$Õ¯Áú•Ñ# ˜°Á…{…Ïž…΀ŒH%zqÓÓ×9ðMѯ\÷S¿>«$Õ¯Á%ûG/`ÂúgÿsøìYèÈÈ€T¢7=C³;”ªÿXôë$6¸xMü¬’T»†W=¾€ ëòþðÙ³Ð9‘ ©D/nzæF·œýz‰U|«´f–„Ï*IõjtÛyÑã ˜°î±>{:@2r •èÅMÏÜàË«¢_ ¹ÎAoŸU’êUµùÖèÑLX÷°_ Ÿ=  9Jôâ¦g®ûéÿýzÉ Î[>«$Õ¨™¥¥ŒúÑ£ ˜°Î>??8@2r •èÅMße©ÝåÅ¥ŒGѯØxÓ†ðY%©>µ÷ø¡è±hïöòæÍ3@r •èÅMß½ñ½WG¿"@r}^>«$Õ£Î!¿=²€I«Æ¥5»,|þ,t€dä@*Ñ‹›¾{ƒ¯ýŠÉõÏþçðY%©õŽ{OôÈ&¬j?>Ê"Ô® IDAT{#@2r •èÅMß½Þ ýŠÉï¾<|VIªGý/þŸè‘LØø¾kÃgÏbä@F€¤½¸éYÛ=^ýŠ5ÐÞëUáóJRþ¯‰WÀ„n>+|ö,F€dä@*Ñ‹›ž½ñƒ7G¿&@rý3þwø¬’”¿Ñõ'E+`†W>{#@2r •èÅMÏÞðŠÃ£_ ¹Ñm_ ŸU’ò7÷+ƒé28o×ðÙ³9‘ ©D/nzözŸÿïѯ ]5.íÝ_>¯$å®jmŒžVÀ„õOû›ðÙ³9‘ ©D/nÚ‚åö?ýš5Ð;ù†Ï+Iyk¯zQ)U=ª€ ëûÍœi€$ä@*Ñ‹›¶¬êá;¢_ ¹Ñ-ç„Ï*Iyëôæè1èô–ðù³9‘ ©D/nÚ²†Wýªuø5 {þpø¼’”³Þ‰ÿOô”4õï€dä@*Ñ‹›¶¬Þ)ýª5Ð?ãÃáóJRÎ_^=¢€IJkv‡ðù³9‘ ©D/nÚ²:k^ýª50¾ë²ðy%)gÃkOˆQÀ„UÞ>{+@2r •èÅM[^õè=ѯ P5?>¯$åk|ïÕÑã ˜°ñÝ—‡ÏžÅÊ€ŒH%zqÓ–7¼æøèרÁú•áóJR²–?·”Q?z<6ºá”øù³H9‘ ©D/nÚòú§ úuj`üà7KkfIøÌ’”§Îþ?=š€ƒ‹>>+@2r •èÅM[^g¿×G¿.@MtþÅð™%)O½µ;E% @ÝÎáóg±r #@R‰^Ü´Í,)U{Sô+ÔÀàâ5ñ3KRšì=–€Ýc~?|þ,V€dä@*Ñ‹›¶®Ñõ'E¿2@ TÝWZ³ËÂg–¤n>3z,:û¿!|þ,V€dä@*Ñ‹›¶®þŽ~e€šè~ú·Âg–¤U­Ñ# ÐÞå{ÃçÏbå@F€¤½¸iëêøÆèW¨‰á×?>³$Å×ÞëÕÑãPµhöls !@R‰^Ü´•Í.+U÷¡èרª÷hi­|AüÜ’Zïs=Ž€ã». Ÿ?‹™ 9Jô⦭o´a]ôkÔDïø÷†Ï,I± .Ú;z†×>3@2r •èÅM[_ÿ¬F¿6@MŒn89|fIŠmtÇ…Ñ£0¸`Ïðù³˜9‘ ©D/nÚú:¿5úµêbÔ/íÕß>·$µü¹¥ ÚÑ“Ð?ýñ3hs #@R‰^Ü´ ÍîPªîÃѯPýÓ??·$…Ô9ä—£G¤{Ô»ÂgÐbæ@F€¤½¸iÛÝxjô«ÔÄøÞ«Ãg–¤˜ú_úÇèiâ'ÂgÐbæ@F€¤½¸iÛê¯Û9úÕj¤sÀ/„Ï-I“o´a]ôø" »¥5»,|-f€dä@*Ñ‹›¶­Î¾ÿ!úÕjdpÉ~ásKÒ„›]VªîCÑã0 ?ýï@F€¤½¸i›YRªGï‰~}€š¨:›KkÅóãg—¤‰Õ9ðÑ£2¼îÄð´Ø9‘ ©D/nÚö†Wýú5Ò;áOÂç–¤Éåóÿ`z ¾¼Kø ZìÈÈ€T¢7m{½Ïÿ¿Ñ¯P#£[Î Ÿ[’&×èÖõÑcÒ;ñ}á3h±s #@R‰^Ü´Kïž?ýúuRU¥³æ5á³KÒZõÂR†½è©éôæø9´È9‘ ©D/nھƛ6D¿B@ .øxøÜ’´øu?ûîèqjïòâð9´Ø9‘ ©D/nÚ¾_; új¤j?PZ+ž>»$-nþ~Ó«zôžð4‰ÈÈ€T¢7m_½ãþïèW¨™iø\ iª›YRª‡ïˆ5@¹Ïÿ ŸCÈ€ŒH%zqÓv.¾«_ZÊxý52ºã¢ðÙ%iñšûì/`zÍýpôšD€dä@*Ñ‹›¶¿ñ]—E¿F@Ítø…ðÙ%iqœ·:zÄz§þUøšD€dä@*Ñ‹›¶¿Áù»G¿F@Í /=(|vIZœÆ¯1@ Î¡o ŸC“È€ŒH%zqÓö×=òѯP7ƒviïö²ðù%iaë|ò§£§ ©ªJ{—‡Ï¢Iä@F€¤½¸iZù‚R†ÝèW ¨™þ™‰Ÿ_’´þÙÿ=Z€@Õæ[ÃçФr #@R‰^Ü´0n97úUj¦zøŽÒšÝ!|~IZ¸Æ¯‹-@ Ñ '‡Ï¡Iå@F€¤½¸iaêŸýÏѯPC½ãÞ>¿$-Lß=R€`ƒ/¯ ŸE“Ê€ŒH%zqÓÂÔ9ø­Ñ¯PC£Û/Ÿ_’¦ÁE{G Xïø÷†Ï¢Iå@F€¤½¸iš]VªîCѯPCs?5>Ã$mÿß½'zœÁ:ûülü<šP€dä@*Ñ‹›®¹ÏüØZÃkŽŸ_’¶¯îQ¿=J€hƒÎü =&• 9Jô⦅«ú¢_' ŽÆ£ÒÞëÕá3LÒ¶ç?Æw_>‹&™ 9Jôâ¦\‚÷zUôëÔÔàk„Ï0IÛV{W–2D ØðÒƒ§kö9 ©D/nZØÆ›nŠ~¥€:vK{÷W„Ï0I[_ÿÜÙè $Ð;ù†Ï£Iæ@F€¤½¸ia\ôÉèW ¨©Á—W…Ï0I[ÙÌÒR=t{ôøèðóñ3i‚9‘ ©D/nZغG¾3ú•jªê—"r #@R‰^Ü´H-n©zF¿^@õ[¥½û+â癤'Îï¨=€DºŸ}÷tÎC@r •èÅM‹×膓£_/ æ—ì>Ë$=Ñð²C£ÇIU•öǾ?|6Eä@F€¤½¸iñêò—ѯPw£~éìý“áóLÒsJgÍÏ”2DO ‘ñ¦ á³)*@2r •èÅM‹¸ïù#óÿU0Àö^ÿùðy&é9etãiÑãHfxÅáá³)*@2r •èÅM‹Ûø¾k¢_1 ºGþfø<“¦¹îáÿ)z õNú‹ðù• 9Jôâ¦ÅmpþѯÐã{®,­Ùeá3MšÊf––ñÝ—G ¡¹_ >£‚r #@R‰^Ü´¸u?õëѯн“ÿGøL“¦±¹ŸðøNU{SiÍ, ŸQQ9‘ ©D/nZä–ïXªîÃѯÐÕc÷Íÿc[ø\“¦¨ön/+Uëþèo ¡Ñ§N÷|t !@R‰^Ü´ø ¯[ýš 1øÚá3Mš¦†Wým$Õ?ó#á3*2@2r •èÅM‹Ÿ_,˜j\:½%|®IÓP÷S¿VJUE×Iu}[øœŠÌ€ŒH%zqÓ–ãýÀü?Ú,„ñÝ——Öì²ðÙ&5ºåÏ-ã×G»IUýÇæÕø¬ Ì€ŒH%zqÓdÝqQô«4HÝÎásMjrƒõ+£¿ÍÄFΟSÑ9‘ ©D/nšLý³>ýªM2h—ÎÞ?>Û¤&Ö9ðM¥ŒÑßå@bý/þŸðY 9Jôâ¦ÉÔùäOG¿j@ÃŒnýriÍ, ŸoR£ZõÂ2Þ´!úÛH®sÀ/ÄÏ«àÈÈ€T¢7M®ñ¦›¢_7 az§þ¯ðÙ&5©á¥G[ÉUíJkfiø¼ŠÎ€ŒH%zqÓ䜿Gôë4LÕ{´´÷zUø|“šP÷èß+¥ª¢¿­ä†×­ ŸWr #@R‰^Ü4¹:‡¾-úuhtÇ…¥5»,|ÆIu®ýñ-U{Sô·3PýÓþ:|feÈ€ŒH%zqÓ›YZªÇî~å€êŸ;?㤺¶|Ç2ºã¢èoc &:k~&~n%È€ŒH%zqÓd^þ©èWh¢ñ°tùåð'Õ±á¥E5Q=zwøÌÊ’ 9Jôâ¦ÉÖ=æ¿D¿r@CUÝ^Ú»½<|ÎIuªwâû¢¿u^ù™ð¹•%@2r •èÅMnå JÕ,úµjtË9>PÚÂ:½¥”A;úÛ¨‘Þ >»²ä@F€¤½¸iò ¯ý\ôk4Øà‚=Ã眔½öž?\ªGîŠþvêd<*íÝ^>¿²ä@F€¤½¸iòõŽÿoѯÐdU5?g¢g”µö.ß[Æ÷^ý ÔÌøÎ‹ÃçW¦ÈÈ€T¢7,Ë«^TÊ ýê 6÷«†;û½>|ÞIéš]VF7ý- ÔPÿœ™ø–(@2r •èÅM1n89úÕnüÀ7æÿq.zÞIišYR†Wý­ ÔTç 7ÇϱD9‘ ©D/nŠ©wâû¢_=` ŒnúÂüO÷¤I×?ãÃÑßz@ÝG¥½úûÂçY¶ÈÈ€T¢7.Í»½¬”ñ0ú¦E5ö šªúçÎF× 0ºãÂðy–1@2r •èÅM±¾yvô+L“Q¿tüÍðÙ'-j3KÊàÂOD· Ñ?ó#ñs-a€dä@*Ñ‹›bëò—ѯ 0eªÞ£¥sèÛÂ矴(Í,-Ãˉþ6¤³÷OÅ϶„9‘ ©D/nJðk@Gƒèט2Uÿ±ÒýÔ¯‡Ï@iA[ù‚2¼îÄèo/ AÆ÷]?Û’æ@F€¤½¸)¾Ñ†uѯ!0íÒ=òá3PZˆÚ»½¼Œn¿ ú» h˜Áúáó-k€dä@*Ñ‹›âë­ý³èטVÃ^éóûásPÚž:û½¾TÝýÝ4PgÿŸ ŸqYs #@R‰^Ü_{——2ìF¿ŠÀ´rTëõ®Rõ‰þ.¨Ú|køŒËœ 9Jô⦮?)úU¦ÙhPzŸû£ðY(mq3KJÿì)e<ŠþîjpÑÞñ³.q€dä@*Ñ‹›r4÷ªôÏ]>¥g«½ÛË|~.°èº‡½=|Þe΀ŒH%zqS’V~O©úE¿ŽepñšÒšY?¥§©sà›æ-ÀbªZKkvYøÌËœ 9Jôâ¦< ¯>6úu˜7¼ös¥µâyásQzÒ¯ü\÷¡RFýèo` /;$~î%Ï€ŒH%zqSžºŸ}wôëðmã;/.íÝ^>¥ö¯ô+?‰êþá³/{€dä@*Ñ‹›µây¥êlŽ~%¾m|ÿ ¥³æ5ñóQS[oퟕªûpô·0EªGïñë?· @2r •èÅM¹^zpô+ ð$sÇ—î1¿>5]µ?öetýIѯ?0­Ÿ…›`fÏ€ŒH%zqS®º‡½=ú•xªª*ƒów/­™¥ásR ofIé­Ý©T­û£ßz`Ju~kü,¬A€dä@*Ñ‹›’5³¤T›o‰~-žÖÜç°µW¿4~Vª‘uøù2¾ó«Ñ¯90ŪͷÎÿ}+Õ V½pþ'LËxýzSnpÞêø™X“ÈÈ€T¢7嫳æ5ѯ%ÀwWËࢽKkÅóÃg¦jÜì¥wê_•ê±{£ßh€yýß?k’ 9Jô⦜¿uIô« ð¬Æ¯/ß>3U¿ºGþfßwMô+ ðmãûoŸuÊ€ŒH%zqSÎú§ úÕØ2£~韻ÜOj‹êú¶2ºãÂè·à)úçükøŒ¬S€dä@*Ñ‹›rÖÞí奌ѯ'À?xséõ®ðù©œu~kÝxZôk ðôªª´÷zUø¬¬S€dä@*Ñ‹›òæJ:š›]íOüxø UŽº‡þŠ?Ï€ôF·®Ÿ—uË€ŒH%zqSÞzǽ'úõØ6ýVééŸJkå Âg©bêõÛ~Õ'P½µ>7ë– 9Jôâ¦Ä-n©Z÷G¿¢Ûln†õÏúhi­x^üLÕâ·âù¥·v§2¾÷êèW`‹UýÇJ{Õ‹âghÍr #@R‰^Ü”»ÁÅk¢_Q€íV=t{éòþÒš]>Wµðµ÷zuœ¿{©ÚD¿j[mxù§Âçhs #@R‰^Ü”»Îþoˆ~EÌø¾kKïø÷:6¡Ùe¥û™ß)£›N/¥G¿ZÛ¬{ØÛãgj s #@R‰^Ü”¿ñ]—E¿¦ ªÚ|ëü¯mïú’ð«­«³ïëJÿÜåó?Õ Pwã¾QZ3KÂgks #@R‰^Ü”¿þiýš,Šª÷Èü¯:nïù#á³VÏ\{õKç…ëèö ¢_€ÕÿÒ?…ÏØºæ@F€¤½¸©&Ëõ ýª,žQ¿ ¯>¶t|giÍ, Ÿ»zNiïþƒýn>«”Ñ ú Xxã‘ÿe{þœp !@R‰^ÜT†WýªLDõðe°~eiïõªðÙ;mµ?þc¥¿îCetÛWæÿa ÉFΟ»u΀ŒH%zqS=êñŽèW`²ªqÝrnéô祽ÛËÂçp#›Ý¡t}ÛüÁu|×¥¥TUôS˜˜îgß?‡kœ 9Jô⦚4³¤Œüfôë c<šÿü¹þY-½*~&׸ö¯,½µ;•áµ'”ª³9úÉ„¨¾³´f—…Ïä:ç@F€¤½¸©>õÏ™‰~]âUÕüO«õ¿ôO¥sÐ[üî³ÔÞëÕ¥·öÏÊð²CÊøoD?=€æþ^=Ÿëž 9Jôâ¦zýÔF ¢_Y€TªþceôͳÿéÀßTZ3KÃçuX³ËJgßוÞ)ï/Ã+*ÕC·G?€|ÆÃÒÞã‡âgvÍs #@R‰^ÜT¯†×>ú•H­jo*£ëO*ý³ÿ¥túíÒÞýÃg÷bÔÞõ%¥{ØÛKÿ´¿yü§û¾uI)ýVô— ½áu'†Ïð&ä@F€¤½¸©^u|gô+ P;Õ#w•ѧ•Áú¥wì–Î~ÿ±´V~OøLß’ÚûÒ9ø­¥wŸ”Áú•etÃÉ¥Ú|kô— ¶ºGü_á³½ 9‘ ©D/nªY3KÊøÁ›£_[€F¨½»ŒnûJ^qÄüO öNøÓÒ=ü7Jg¿×—öî¯XÜÏœYRÚ»½¼töùÙÒ=ôWJ÷³ï.ýu;—ÁEŸ,£O-ãû®ñ} l¼é¦ùùþwúä@F€¤½¸©~õÏüûè×`ª~¥èøþÊèöóËè¦ÓËðÚÊðšãæíæ\ƒ ö,ƒów/ýs—ÏÿŸó]ôÉoÿßÏÿ¿½ö„2ºá”2ºý‚2¾ÿÆRµî/¥ª¢ÿ§Lþÿ»|Sr #@R‰^ÜT¿æ~b¤ {ѯ.ÔÇ ]Ú«_þwù¦ä@F€¤½¸©ž ¯:&úÕ€Ú^zPøßá›” 9Jôâ¦zÖ=ìíѯ.ÔCU•Î>¯ ÿ;|“r #@R‰^ÜT߯÷]ýú@z£›¾þw÷¦å@F€¤½¸©¾õOû›è×ÒëùÎð¿»7-@2r •èÅM5nå÷”ªó`ô+ iï»¶´f–Äÿݽa9‘ ©D/nªwƒ ÷Š~… ­ÞIþwö&æ@F€¤½¸ýíÝû“ÝuyÀñD EhG„Z«µ­7ª¶:U§L½µÚþÐÑêTgZGÛ)Ž•^¦­8Ó7÷&ánáÒ€ÐbdD%¶ ˜AQ¤h)H$ä²ç{îßï§“U[dsÙ=»gŸÏ9çõšyÿŸïÌóð„³5 tÅÙ/J©ìF?cÈNUûqª-<*|fÆÈ‘ Y‰^Ü4øuï[ýŒ ;­›ç‡ÏêÚ 9r +Ñ‹›¿Æš·F?cÈK§‘Šå'„ÏêÚ 9r +Ñ‹›†£rÛw£Ÿ2d£½éâð}˜s G€d%zqÓpÔ\wjôS€<”ÝT?ç¥á3ú0ç@ŽÈJôâ¦!iѼT;¢Ÿ3„ë|çÓñóùç@ŽÈJôâ¦á©½aEôs€XU•ê«^>›{€äÈ€¬D/nžŠ³^R·ý¤ L÷¾uásù(ä@ŽÈJôâ¦áªs÷§¢Ÿ4„©¯~cøL> 9#@²½¸i¸ª¯:yâg`ÔtxSø<>*9#@²½¸iøêÞcô³€9×Xó¶ðY|Tr G€d%zqÓðÕXóÖèg sªÜ²)|¥È‘ Y‰^Ü4œ•[îˆ~Ú0gW½3|¥È‘ Y‰^Ü4œ5¯y_ôÓ€9Ñ}ä¶ðù{Ôr G€d%zqÓ6ÿˆTî|0úy@ßíû üðù{Är G€d%zqÓðÖºáo£Ÿ7ôU÷áás÷(æ@ŽÈJôâ¦!nÑÑ©*¶G?qè›Æe§ÄÏÝ#˜ 9r +Ñ‹›†»ÖMcÑOú¢ûÀWÂçíQÍ€9•èÅMÃ]±ô¸T5vE?s˜uõÕoŸ·G5@rä@V¢7 í¯-‰~æ0«º?øbøœ=Ê9#@²½¸iø+–='UͽÑOfGU¦úE¯ Ÿ³G9@rä@V¢7Fí gD?u˜ï|:|¾õÈ‘ Y‰^Ü4ËŽOUk<ú¹ÀÌt[©XùâðùzÔs G€d%zqÓèÔ¾íÜèç3ÒÞxVø\-@òä@V¢7NÅŠ_N©]~òГª±kâï[GÏÕr O€d%zqÓhÕÞtQô“€ž´Ö,|žÖOr G€d%zqÓhUœõ”:ÍègÓRí~$Õ>Oë§{… r +Ñ‹›F¯öF?{˜–æç>>Gëÿs G€d%zqÓèUœñ¼”ÚEôÓ€))»;ÕÆŸ£õ”€ 9•èÅM£Y{ã™ÑO¦¤qù›Ãçgý|€äÈ€¬D/nÍŠeÏIUsOôó€ƒê|ïšðÙYûÙ'È Y‰^Ü4ºµ¿º0úùÀµë©8ûEás³&ç@ŽÈJôâ¦Ñ­X|LªjOD°_­›ç‡ÏÌ:À.á@†ÈJôâ¦Ñ®õ•G0IµûÑT[ttø¼¬ýç@ŽÈJôâ¦oѼTíÙýÀÏi®}Oü¬¬æ@ŽÈJôâ&µn8-ú3€ÿÓ}è«á3²ž 9r +Ñ‹›T[pd*wÜý)@Je7Õ/ü­øYÍ€9•èÅMÚWsí{£?HíÛÏŸuèÈ‘ Y‰^ܤŸÕ}xcôçÀ«ö>–Š¥Ç…ÏÅ:t€äÈ€¬D/nÒϪÿÛ³gÜ€ gIDATï¦TUÑŸ#ª¹ö=á3±¦– 9r +Ñ‹›ôÔ:÷^ýI0‚º›¿> kê9#@²½¸IO­Xùâ”:ÍèÏ€QÒ.R±ò¤ðYXÓØÈ Y‰^ܤ§×¾ý¼èÏ€ÒZzø ¬éU,{Nô³€IÈJmìððåMzú2_5vEŒ€rÛwSmÁ‘á3°¦¹3œñ¼è§“8•Ú£—7ééíûWØÐWU™ê—¾)|öÕô+Î~Qôë€IÈJmñ³Ã—7iR JåΣ?†X{ÓÅñs¯zª~Á+¢ŸLâ@VjËO_Þ¤ýÕø÷?‰þ<RÕ®‡S±Ä?†Ô—ý„`@²Rœ÷²ðåM:PÝÍ_ŠþD6U•W¾#|ÖUï5>óîèW“8•ú¥¿¾¼Iª~Þo¤ÔmE& ‘ΫÃç\ͬæºS£ŸLâ@VW¿;|y“V{ÊèÏ€!Qí~$KŽ Ÿq5Ãá–¥ÑO &q +Í/ýCøò&¬bñ1©Ú³5úS`~úóªw†Ï·šyï~&ú5À$€d¥uûyáË›t¨š×þyô§À€ëÜuYø\«Ù©|ôÑÏ &q +û®_Þ¤C6vXê>¼1ús`@U»MÅÒãâçZÍÊnP5÷D?)˜Ä€¬”;Œ_à¤)T¿è5)•ÝèO€AüéÏ+ß>Ïjv*Vžý¢`¿ÈKU¥Úâc—8i*µïXýÅ0`Ú߸ |ŽÕìÕ¸ú]ÑO öË€ìÔW¿)|‰“¦R±äØTíÙýÉ0 Êß›j‹æ…ϱš½ÚVD?+Ø/@²Óüò?†/qÒTk~æO£?A§9ñ3òÑó«f·î#·F¿,Ø/@²Ó¾÷sáKœ4º÷­‹þlÈ\kýéás«f¹Eó&»#@²Sî}<ÕÆ‹_æ¤)Vœù«©jîþtÈT÷¡¯¦ÚØáás«f·Æ•ïˆ~Zp@€d©Xurø2'M§Ö—þ>ú³ CUcW*Îzaø¼ªÙ¯}ûùÑÏ È€,5×<|™“¦Õü#R¹õ›ÑŸ™i^óþøYU}©Ü¾9úyÀ9¥ÎC·„/sÒt«_ôš”ÊNôç@&:ß¾2|FUŸfÿ _ý¼à ÈSY¦ÚŠç…/uÒtko<+úë ûþï°bɳÃçSõiîÿúòè'å@¶š_8-|©“¦Ý¢£S¹óèÏ€Hí"ÕW½*~6U;,UOþ0ú•ÀA9­ÎÃã;©‡—’RUFBiþÇ_…Ϥê㼿æ­ÑO É€¬ç¿<|¹“z©}۹џ:÷¬ ŸEÕß:÷|6ú™À!9µÖ­+×;©çŸݾ9ú`•O|?‹‰ŸEÕ·Š'¦ÔiF?58$@²V;ÓøÂyáKžÔKõKß”RÙþŒ˜ ízª¯:9|Ukßò¯Ñ/ ¦Ä€ì5¯ÿ›ð%Oêµö­gGBÌæºSÃgOõ·}ÿwgU2ú©À”8½îŽÒøØááËžÔS‹æMüëó­5ñs§ú^kýéÑO ¦Ì€Ðøìû—=©×ê«ßà§@†T¹õÎT[xTøÌ©þV,96UÅöèçSæÀ@è>ñƒ4>vDøÒ'õZ{ÊèÏ€YVÕžHÅY/ Ÿ5ÕÿZ7/ˆ~n0-€ ŒÆu _ú¤ž[ø¬T>vwôgÀl);©qù[âçLõ½âì_K©U‹~q0-€ Œrï¶T[r\øò'õZýü—§Ô.¢?%fAëÆ Ÿ/57u¿}ôs€is` ´n??|ù“fRóúDFÌPçžµás¥æ¦ÆUýÜ '€ –²LÅ%¯_¥™Ô½o]ô—@ÊÇïIµÅ¿>SjZ4/UO>ýä '€ œî–o¦ñO¿ J=V,;>U{ý)0MU±#ÕÏyIø<©¹©ýõåÑOzæÀ@Ú÷3ŠÑË 4“Ÿüý”ª2úS`ªºíÔ¸ü-ás¤æ¦úê7¦ÔiE¿:è™ ©lŽ§â¼—…/…ÒLjo<3úS`Ššë>>?jn*–?7U{¶F?9˜@VwÛ÷ÒøÂyáË¡Ôs ŽLå–MÑŸ‡ÐÞpFü쨹iìðÔ}`}ô“€s` µïúdü‚(Í úy¿™ªÖxô§Àtï[7qŠž57µnžýä`V80ð×~ |I”fRóš÷GFìGùØÝ©X|Lø¼¨¹©qŤÔíD?;˜€ ¾f-¼2|Y”fRûŽ £¿$ž¢ÚûX*ÎzAøœ¨¹©~ÑkSÕÜýì`Ö80Ê]¦Ú™–s p Ÿåïä¢]¤ú%¯Ÿ5'ÕÏýõT?ýê`V904ºÛïOµå'„/R¯íûæU±=úSme75®~Wøl¨9šÁÏø•T=ùPô«€YçÀPén¹3Õü p+Þ>ñˆÑºá´ð™PsS±ô¸‰¿óÃÈ€¡Óyà¿Òø‚g†/“R¯µoYýŒ¤öׇςš›Š'¦òGwE?9è@†Rçû7¤ñ…ó—J©§æ‘º?¼)ú3)o­Iµ±ÃâgAõ½ú9/IåΣŸô• C«»å›©¶ìøðåRê¥bù ©Ú³5ú3 ÝÍ_NµùÏŸÕÿê—¼.UµG?9è;@†Zwǃ©Xù’ð%Sê¥úÅ¿“R»ý µ}?Yø;â#QcÍÛRÙØýä`N80ôÊ=¥âÂW‡/›R/5¯û`ô'0´öý 便=ó©Ï–ZëOO©ÓŠ~r0g ecOj|öÏâO©‡Ú·®Œþ„†Î¾Ÿ[/Vž>ë©¿ËŸ;ñ¯0j)ío_•ƾ„JÓjìðÔýÁ£?€¡QÛSý‚WÄÏyêkËßìïj0²9ÝmßKÅù/_F¥éT,ýÅTnßýù ¼ª±;Õ/þíðùN}lÁ3Sûk‹Sêv¢Ÿ„q`4µŠÔøü_Oü-ˆðåTšbõó_6ñ¬èQ»HËN ŸëÔ¿Wþ¡8€ŒºÎÿlHŪ“×Ti:ÿA#•ÝèO`ðtÛ©ñ©?ŸçÔŸŠ3ŸŸ:w_ýÊ €Ðí¤Ömç¦Ú’c×Vi*µÖŸýÕ –²›škß>Ç©-š—Zÿù/)5Ç£_dÅ~ªÜ»-5®ý@ÿ„ŸUþu¾}Eô'0ª25¯ûPøü¦Ù­XrìÄá¯<ú…@–àiº;LÍ/þ]_ðÌð¥V:` ŽLݾý¹ä­ªRóúÄÏnšµŠeǧÖÍ RYìŒ~]5@8€òɇSó Mã _r¥ý«çrÛw¢?€|ëN ŸÙ4;ÕW¿!µ7]œR«ý²` 8À!”{OÍ›æ§ÚÙ'…/½ÒÓ+Î|~ªöl‰þL2<þ}8|VÓ̪ŸóÒ‰ÿÛ¯»ãþèǦªªRçáÛ~òBK)|–~V}ÕÉ©jìŽþBòàg?ºú¯L­ÿ9u¹-ú%À@s€^tZ©óߟOkÿ"Õ–Ÿ¾$K+ÞžR·ýeĪªÔúÂGÃg3M±±ÃS}Õ«&þoÍÎÝW¥r×#Ñ/†† ÌTU¥îÖo¥ÖÆ•©qõ»Smù‰ñ‹´F²æuœx#{ü»á´ð™LOkþ©Xqbª_òºÔ\ûÞÔZÿ±Ô¹ë“©»eSJÍñèWCËú Ü½%u6ߘZ_?#5®ûËT¿ü-Cp|þ3âp u͛ƢŸ?@ŒV‘º[ïT=~o*w>˜Êú“ѯÒ¨ú_\Ü£R¾>:IEND®B`‚‰PNG  IHDR6î”àIô pHYsèèµ{Rk IDATxœìÝw¼ìwYè{w ¡#RU@@)¢Åkƒ‹;Eñ Š Å‹ÇráXÖÞ;½C:$!lÒ{LH'…„NzHBz…´éå÷=¯µ¢÷`È^{fÖÌ<ó¬õ~¿^Ÿÿޝß™ù>?ž½Ö¬(“Ôz¼to9«´/Þ«´Nþ»Ò8è7Kmç+µ¹U¥öï? «óÕ­£ß1Àt/ÝÏs–¦ÛÜ& Ï÷óÏù­ÿøKûâ½K÷Ö³þwÀ¤ýÀÄÿV–^§ôî¾´´ÏÛ¾4|g©­Ý"þaK<®*¯íýîÆ {Ùþ–›Šoõf¥¾÷Ï–ÖiŸ.Ý›Ï(¥ÓˆþhËÅ&°tfé\stiúžRÛòñQò¡sÓÒ½ü€èw0Fóÿ`þŒ!}o[>³4Öý~é^w|)ÝVôGX&,6‘Íÿdæü¯›Ô¶{aüƒ’Fkõf¥{å—¢ßJÀXnjfÛúy¥yü_•îmç—ÒïGT€Ä,6áô»¥sÕ—K}ŸŽ ÒÒZûôÒ»ñ?¢ßQÀµÏ^ÿÌ!-R}Ï7•ÎÕG”RYpóØÓm—Ε—úç^þð£1´Õ³Jï–3£ßUÀ´Ïü×øgicíòªÒ¹ä ßÙ0(‹M`qý^éÌÿuÍ^ÿ°£±Tßöù¥×ÅÑï,`ŠÚ§þÏðgi vyeéÌU’_Q`± lPïž+Jý ¿ÿp£±Ußá%¥ßUÑo-`Úªª´ŽùóðgiÐû¿£ôî¿6ú“Ì8‹Màûµ/­Ó>½ð‡e¢h4¾êÛ¿¨ôï¿&úÝDé÷Jëð÷‡?“H·fó…?VÚo­þô3Êbøoºß:­Ôvøáø‡5KM`A§Qš_|Gø³‰4T;ÿØAàI,6'ô»¥uÖšR›Û$þÁEãÿNÍ{.‹~‡3¢j=Vûülø3Š4T«7+­³V/üä1À±ØJý}¥qà;ãV4öêÛü ¥&ð}ªÚƒ¥±ÛëŸU¤a›ÿß-óÿû`žÅ&¬pÝ[Î,µí^þ€¢ ý¤æ½WD¿Å€U=üíRßñGŸY¤¡Ûéå¥w×%Ñ!`Xl Öùæa¥¶æiñ&{~RÄüwpÏÿchô³‹4lõ­ž]º7Ÿý‚Yl Õþúž¾Os™Vßæy¥×7¢ßb@½ÛÎ+µµ[„?ÃHC·æi¥óÍã?B@ ‹MXÚçmÿ¢‰Tßú¹¥×ÅÑo1 ™îÕ‡—ÚܪðgièVoZ:ߨ'ú#±Ø„¦uÊßÇ?|h2mõ¬Ò»ãÂè·Tç«[Ç?ÏH#Ö¾ðsÑ! €Å&¬ m«Ë·5O+½›N~‹ɵNüDüs4Js«J÷ÊC¢?BÀ”Yl ѹò`¿^´\[½ié^sdô[ XzÒ<ø·âŸo¤QZ³yéÞ|zô§˜"‹MXº×ŸPj«7‹ÐÐdþeúÒý¢ßbÀ2RµÖ—Æ^oŽΑFüÎùÞ=—GŒ€)±Ø„e®w×%¥¶öéášLówŒ~‹ËPõØ]¥¾Ó†?ëH#µÃ—þã÷GŒ€)°Ø„e¬ßx¤ÔvyUüƒ…&RûŒÿý–±þ½W.üqÂègi”ýV)U?úcL˜Å&,cÍ#ÿ$üB“©uìGJ©ªè·°Ìu¯;Ö÷´+mm¿ÝËžÅ&,Sí¯ïþ ¡ÉÔüò”ÒïF¿Å€¢}Ö\øó4R«7+½;.Œþd± ËPïž+Jmíñ{ó¥´ôÚÑo1`%©ªÒ:üýáÏAÒHíòÊÒo>ý)&Äb–›~¯Ô÷ù¹ø½Æ>o-¥]‹~‡+Q»V{¿%üyH¥ÖWþ)úLˆÅ&,3í‹÷ pÐø«ïô²…¿N ¥zôŽRßá%áÏEÒЭټô¸>ú#L€Å&,#ýÇï/µm~0þÁAc­¾õsKÿþ«£ß^ ßWè+”±ÆïŒþø`± ËHóè‡?0hÌ­yZé}ûœè·Àÿ¯{ùñÏHÒu®=&ú㌙Å&,½;¿^js«Â4ÆæV•D¿µ¾Oë„Ç?+ICVßõÕ¥ô:Ñ`Œ,6a™h|é]á os¶Œ~[<µ^§4öûåðç%iغWýéÆÈb–þ}WúiÍeV먕RUÑo-€ ª½³Ô·Qøs“4L=ßXJ¿ýñÆÄb–æáþ€ ñÕ<àWKéµ£ßVÕ»õìR[½iøó“4LÝO‰þècb± Éõ¼¡Ôæ6 8Ðxjìñ†R5‰~[ ¬sî¶áÏPÒ05¾ø+Ñ`L,6!¹æñþ` ñTßþÅ¥zôŽè·Àpªª4×½7üYJ¦Þ½WFr€1°Ø„Ì:RÛúyáCk6/½ÛÎ~GŒ¤j­/Ý_ÿL% Xë´OGl€1°Ø„Ä:ß<<ü@ã©{é¾Ño'€%éß÷ÍRÛòáÏUÒ Õwù1D–‹MH¬qÈï†?héµOþdô[ `,º—|!üÙJ´îí_‹þÈKd± Iõ×ßWj«7 ÐÒjîÿvXVZG}(üK¤ÖÉýq–Èb’j_¸[øƒ€–V}—W–ªþè·ÀXUÍGK}×W‡?kI«¾ãûutHÎb’j|é÷´„‡¨­ž½ð=TËQÿîKKmÍÓŸ¹¤Õ{àúè °›Q¯Sj[='ü!@#6·ªt¯92ú]0Q¯íÿÜ%m¤Î¥ûET€%°Ø„„zw\þ ÑkŸ½&ú-0yUUšëÞþì%-VëØFR€%°Ø„„Ú_Ý&ü@£Õüòï/<ä¬óß'^ßéGßÁ¤ ÕøìODL€%°Ø„„¾3ü@Ã7ÿ%úUó‘è·ÀTõn;·Ôæ6 “6Tý½Ñ`D›Pm›ç‡ ÙÚ-JÿžË¢ß:!Ú§&þyLÚ@Ý[ÎŒþˆ#²Ø„dúß>ø5ÂÃÒ¥ûF¿uâô:¥ñùŸ &“žªîeûGB€YlB2ÝoŸ>ø5\­£>ý¶×àºRÛòáÏfÒ“kŸõïÑ`D›Lç’}ÿ¯±ÛëJÕZý¶˜ ?þ|&=¹ÖÑýÑFd± É´NýÇðÁ¯ÛêY ?™ÀªªÒ<äwâŸÓ¤ï©¹ßÛ¢?Àˆ,6!™Æº÷†~ V÷›_Ž~»Ìœê±»J}[ S³S}§—E,€YlB2ýÞ>øµñÚ'ýmô[`fu¯=&üyMú¯ê[?'ú#ŒÈb’©ïõ–ðÁ¯ÅkìóÖRº­è· ÀL›ÿ‹ÑÏmÒBs«Jé÷¢?À,6!™ú®??øµè¿ööº9úm0óªÆC¥¾ÃKßߤùJëñè0‹MH¦¶ý‹Ã‡¾6\÷Šƒ£ß"iôn8)üùMš¯´kÑ`›LmËg†}=u­ÃßýöH§uäÿþ'YlBN›Ìü÷¿D}}õ_QªÆÃÑo€tªÚƒ¥¾ý‹ÂŸç´²+zôGÅ&$=ðõÍmRzß>'ú­V÷š#ãŸé´¢³Ø„œ,6!™è¯ï¯}æ¿E¿-Ò›ÿZŸèç:­Ü,6!'‹MH&zàë¿×Øç­¥ôÚÑo €ôüJº"³Ø„œ,6!™è¯ïi«g•þwnŠ~K,Ý«ÖÅ?ãiEf± 9YlB2Ñ_ÿ§îåF¿–æ¡ïÎÓÊËbr²Ø„d¢¾ž¨uÄ¢ß ËRõÈí ¿ý¼§••Å&äd± ÉD|ý@©o÷ÂRÕˆ~+,[ væÓÊÊbr²Ø„d¢¾~ t¯=:úm°¼õ»¥±÷Ï„?÷iåd± 9YlB2Ñ¥×:òO¢ß+BÿîKJmõ¦áÏZYlBN›LôÀ_Éùt€éjŸô7áÏ€ZYlBN›LôÀ_Éùt€éªZ•úŽ?þ¨åŸÅ&äd± ÉDü•Zëˆ?Ž~éV¤îÕ‡‡? jùg± 9YlB2Ñ%æWÐb5}Wø3¡–w›“Å&$=ðWbÝkŽŒ~ÙV´êá[KmíÓß µ|³Ø„œ,6!™è¿Òj~ù÷£_ræÿЙÿþl¨å›Å&äd± ÉDü•”_A˜!íZ©ïüòðgD-Ï,6!'‹MH&z௤ºWýrð=ü!!M*‹MÈÉb’‰ø+¥æ¥”ªŠ~¹x’æ¿þ¬¨å—Å&äd± ÉDüÑÚ-JÿÁë£_jžBÿkKmõfñÏŒZVYlBN›LôÀ_ uÎYý2°ˆöÉŸ fÔòÊbr²Ø„d¢þr¯ñ¹×”ÒmF¿Ì,¢j<¼ð‡£Ÿµ|²Ø„œ,6!™è¿¬›[Uz·žý0€î%Ÿ~Ô²Ébr²Ø„d¢þr®uìG¢_^Õï•ÆÞo †ÔòÈbr²Ø„d¢þr­¾Ý JU{0úå`½oŸþ©å‘Å&äd± ÉDüåZ÷Šƒ¢_ZFÐüÒï…?K*›“Å&$=ð—cÍ/¾£”ªŠ~iAÿÁëKmõfáÏ”ÊÅ&äd± ÉDüeך§•þƒ7D¿¬,Aë„¿Š®Tê,6!'‹MH&zà/·Ú§ýsôK ÀUµJ}ëç„?[*o›“Å&$=ð—Sõm¨T‡¢_RÆ sÎÚðçKåÍbr²Ø„d¢þrªó½£_NÆ¥Ó(õ^þŒ©œYlBN›LôÀ_.5v})½NôË Àu/Û?ü9S9³Ø„œ,6!™è¿\êÝtJôK À¸õ{¥±çß5•/‹MÈÉb’‰øË¡æïŒ~˜Þ '†?o*_›“Å&$=ðÓ·zÓÒ¿ÿêè—€ jìûKñÏJ•Å&äd± ÉDüìµNüDôKÀ„õn;/ü¹S¹²Ø„œ,6!™èŸ¹úÖÏ)Õã÷E¿„LAóÀ_þTž,6!'‹MH&zàg®sþŽÑ/SÒ¿û’R›[þ ªYlBN›LôÀÏZ}×W•ÒmE¿|LQsÝ{ßC•#‹MÈÉb’‰øYë^qPôKÀ”õï¿¦Ôæ6 Õìg± 9YlB2Ñ?cϽ¦”~7ú¥ @먆?jö³Ø„œ,6!™èŸ±îUë¢_6‚ô¿û­R[³yø3©f;‹MÈÉb’‰øÙjìþ“¥ô{Ñ/ZÇ,ü¹T³Å&äd± ÉDülu¯>"ú% Xõð­¥¶z³ðgSÍn›“Å&$=ð3ÕØã§J©úÑ/3 uìGŸO5»YlBN›LôÀÏT÷ºc£_.fDÿ¡›ýÔ¦6˜Å&äd± ÉDü,5ö|£ŸÖà¿iõ¡ðçTÍf›“Å&$=ð³Ô»áÄè— €ÓðúR›Û$üYU³—Å&äd± ÉDü 5öyk)UýR0ƒZG| üyU³—Å&äd± ÉDü õn:%úe`Fõï¿ºÔæV…?³j¶²Ø„œ,6!™è?ë5öz“ŸÖ`QÍÃÞþܪÙÊbr²Ø„d¢þ¬×½j]ôKÀŒëß{¥ŸÚÔËbr²Ø„d¢þ,Wßùå¥ô:Ñ/ 4¿ô{áϯš,6!'‹MH&zàÏr¯íýòDï¶sß_5;YlBN›LôÀŸÕê[?·TÍG£_iìûKáϱš,6!'‹MH&zàÏjíÓþ¿è—€dº×þ«ÙÈbr²Ø„d¢þL¶fóR=zgôK0UUªÇï[øÃ½O.ÝË( v.í³æJû”¿/­ãþ¢´iô¥yௗÆ>o}êöý¥'þßúîÒ:â¥uìGþï;çnSº—í_zןPzw|­ôº¹”^;ú¿5ÀdTýÒØíµñϳ Ïbr²Ø„d¢þ,Ö:úÏ¢_€±ª¿¿ôn¿ t/?°´Ïü×…Åcã ¿Pê;ýèÂ?æLý®Û¤Ôwù±Ò<à×Jëø•ÎyÛ•îuÇ–êá[­™u/Ý7üyVñYlBN›LôÀŸÅæj £ªñpé}ûœÒ¹ð³ ?1ÙØçg¾38ú^¦ùÿ¼Íýß^Ú'rá§Gûß¹1úX†Óm–ú/ ¿O›Å&äd± ÉDüYkþ×(2¨Z•ÞM§–öÙ«KsÝ{J}çW„ß¡“j~A0ÿëð‹vâŸüT'0ã:çn~w*6‹MÈÉb’‰ø³VïæÓ£_€§T­¿·ôn8©´OÿLiî÷¶˜_!Ÿ‘êÛ¿¨´Žùpé^sT©šF¿4Oùôõ­Ÿ~_*.‹MÈÉb’‰ø³Tc÷×û) `fTÍGw­c?Z껼2üŽœÙÖnQšÿÖ¯­ÏŸÀ¬hŸúñw¤Â²Ø„œ,6!™è?KÍ'@¤þý×”Îù;–æ¥ÔVo~/¦\rö¾Ò½öè…︈T=z‡»|g± 9YlB2ÑfZûôRÕ¿ýr+MÕ/½ÛÎ+í“þvYGfDõm~°´OùTé?x}ô« ¬`­#þ8ü>TL›“Å&$=ðg¥ÖÑýR+HÿkKûì5¥¾ë«Ãï¿•PcŸ·–”ÒëD¿ôÀ Ó»ãkáw b²Ø„œ,6!™è?+õn¿ ú¥–¹þwn\ø æÏ½&üÎ[©Õw~yé\´[)íZôÛXAæÿq%úþÓô³Ø„œ,6!™è? 5vÿI4˜Œ^{á5úR›[~ßé‰êÛ½pá'f«ÆCÑï`˜ÿ‰ñè{OÓÏbr²Ø„d¢þ,Ô¹h÷è—XfªGn/í3ÿ­Ôwxiø§ Wßú9¥sÎÚRµ~ËËY·Uê;¼$üÎÓt³Ø„œ,6!™èÞ–Ï(Uãáè—X&z·žUš‡¾»ÔVo¿iàêÛ¿¸t¾¾ÇÂOØLÂüO‰Gßušn›“Å&$=ð£kû‘è—XÙüºãJã ?~§iiÍÿ1§ù¯·êñûJmÍÓÂï9M/‹MÈÉb’‰øÑõïüzôKdÕë,|oZc7„ßeoÍ~­ô¸.ú,3­£ÿ,ü~Óô²Ø„œ,6!™èYc¯7E?Q¯S:ߨ»Ôw~Eø=¦ ¶æi¥}Æ¿ø êÀØôï¾4þnÓԲ؄œ,6!™è™? ¥ª~M¹ñ¹×„ß_š^õ]_Uz·žýî–‰Æ~¿~¯i:YlBN›LôÀkõ¦¥züþèã’èßyQiîÿöø»K1Í­*­>^ªÖúè·"\÷ªCãï4M%‹MÈÉb’‰øQ5þí裘ÿžÅæ—~/üÎÒ ýôæ·¿ý¶2ë6K}»†ßgš|›“Å&$=ð£šÿƒÔi”öÙkü[}s«Jû”O-|×*À(Ú_ù§ø»LÏbr²Ø„d¢~HkŸ^ªæ£ÑG̨Þ'—ú.¯Œ¿«4Ó5¾ðó¥zøÛÑoW ¡þC·,ü#Iô=¦Éf± 9YlB2Ñ?¢Ö}ìÀ ª½³4¿üáw”òTßö‡J¢ßº@BÍß~‡i²YlBN›LôÀ¨wýñÑÇ̘î%_(õ­ž~?)as«J眵¥TUôÛH¤{ÍQñ÷—&šÅ&äd± ÉDüiWßöù¥t[ÑÇ̈ªö@i®{oøÝ¤ü5}—¯9×ë”úŽ?~wirYlBN›LôÀŸv­þ*úÈÑ»þ„RßþEá÷’–O=~já»óÑ>ó_Ãï-M.‹MÈÉb’‰øÓ®÷ís¢Vµ/­ã?~iy6¿,ïßuqôÛH zä¶R›Û$üÞÒd²Ø„œ,6!™è?Íæݧô{ÑGêç¦ÒØó§Ãï#-óÖ>}áûó6¦yÈïÆßYšH›“Å&$=ð§Yû+ÿ}Ü@ îuÇ–úÖÏ ¿‹´BZ½ié|cŸè·=0«ú½Ò¿ÿšÒ:ñ¯ãï+M$‹MÈÉb’‰øÓ¬wûÑÇ Dè÷Jûì5~ÝO!µOÿLô'˜Õú{JæQóÐw/üAËèûI“Íbr²Ø„d¢þ´ªo÷B¿†+PUÿniøëáwVvíÓ?ýQ¦¨j<\z7Ÿ^:_ݺ4×½§Ôwxiø=¤ég± 9YlB2ÑZµŽû‹è£¦¬zøÛ¥±ÛëÂïi¾Ö‰Ÿ(¥êG,€qëuJÿkK÷Ò}K똗ÆoðZÈbr²Ø„d¢þ´ê]w\ôQSÔ¿û’RßþÅáwô½µŽÿ˜å&dVõKÿëJ÷ŠƒJû¤¿-}ÞZjk6¿[4›YlBN›LôÀŸJk·(Uk}ôQS2ÿëõ­Ÿ÷HOQ븿,¥ª¢?&ÀHß‹ùCáwˆòd± 9YlB2Ñ5}Wô1S2ÿ«€ó:úÞ‘«}ÊßGT€'©š–Þ-g”ι۔æ—¿Ôwüáð»B¹³Ø„œ,6!™è?æÀò×¹h·R›[~çHƒä A n«ôﺸt¾¾Çß‹9ÿ}Ìæ‡ÆœÅ&äd± ÉDü‰7·ªTÝ}ÌÀ„u.ülü}# Yçü¢?:°b~¥¼{ÍQ¥}ʧJs¿·•ÚÚ§‡þµü³Ø„œ,6!™è?é_ø…è#&¬óµ]Ãïi¤æV•îåD„`y/æv/ˆÿ¬kEf± 9YlB2ÑÒÍO°|uÎß1üž‘–ÔšÍKï¦S¢?J÷{1o=«tÎÛ®4¿ü¥¾ÓƦ¥ÿÌbr²Ø„d¢þ¤ëßuôÒ½äóáwŒ4–¶zVéß}IôG f[¯½ð9é\¼Wió祱ûO–ÚÜ&ñŸ_iYlBN›LôÀŸdõ$úx ™ÿ5ÃÚêÍÂïi\Õwxi©½#ú£³û½˜[>#üs* “Å&äd± ÉDüI6ÿW.å§ç×KmËg†ß1Ò¸kìñS¥j=ýƒ©«Ößû¤ïÅ|aøçQZj›“Å&$=ð'Y÷Šƒ£³þוú¶?~¿H“ªyÈï–ÒïEÔ`bªöã¥wû¥sÑn ÿÝØã áŸ;iYlBN›LôÀŸdÕ£wF/0FUíRßùáw‹4éÚ§:úããÑë”þÝ—–Î7ö.­c?úÄÓ÷bj…d± 9YlB2ÑR5v{môÑãÔï–æ¿~·HSinUé^sdô§Fú^Ì…_)?ý3¾S+>‹MÈÉb’‰ø“ªuâ'¢£ù?}¯HÓ¬¾Õ³Kÿk£?z°AUó‘Ò»åLß‹)m ‹MÈÉb’‰ø“ª{íÑÑG ŒI÷ªuáwŠQãs¯)UóÑè ø^Li„,6!'‹MH&zàO¤¹MJUÿNôÑcп÷ ¿Ê¨]ë°?Œþ²¿óžËK÷’Ï—ÖqQ{þt©­Þ4ü³ eËbr²Ø„d¢þ$jìý3ÑÇ ŒC§^»½.üN‘¢ë\¼gô§‘õ½˜Ï ÏKË!‹MÈÉb’‰ø“¨ý•Š>V` Ú'ýMø}"ÍDk·Xø :û÷bnÿ¢ø÷·´L³Ø„œ,6!™è?‰z7}¬Àõn>má/CGß'Ò¬ÔøìO”ªõXôG“LÚµïÿ^L÷ª4µ,6!'‹MH&zà½Õ›–ªµ>úX%˜ÿŽÜú/¿O¤«uìG¢?žÌª~·ôï½²t/Ý·´ŽÿXiìùFß‹)g± 9YlB2ÑÜ5özsô‘KÔ:âáw‰4«õ®?!ú#Ê è?tKé~ó°Ò>õ|/¦4£YlBN›LôÀwóßÉ$ÿô¸K¤Ymþ;«ÚÑU¦¨j>úį”Ÿ¿Ã~/æ‹Ã߇’6žÅ&äd± ÉDüq×½âàè#FÕm•Æn¯ ¿G¤Y¯ùå?ˆþ´2)½Néßs™ïÅ”–A›“Å&$=ðÇ]ÿ;7F)0¢öYÿ~‡HYšÿ5d’ë÷JÿkK÷ÊCJû”O=ñ+åkžþÞ’4ž,6!'‹MH&zà³ú6?XJUE)0‚þw¿UjkŸ~H™f^õØ]Ñ]†P­¿§ôn8©´Ï^SšýF©mõ¬ð÷‘¤Ée± 9YlB2Ñœ5ùÝèãFÔ\÷žð;DÊVóàßòzY¾s‡—„¿_$M7‹MÈÉb’‰øã¬sÎÚèãFпë¾CN±îe_Œþã{1%=E›“Å&$=ðÇÙü_Sòið«á÷‡”µúÖÏ-Õ£wFŒWÖ÷bÞõÂB¹uÂÇKcï·”ÚêÍÂß’f/‹MÈÉb’‰øcknU©G'0¤Þ·¾HÉkö‡Ñå•ñ½˜ó¿R¾íóÃ_oI9²Ø„œ,6!™è?®»¿>ú(aUUiìó³á÷‡´êÝtJô'rjLð IDAT:½ªñÐÂ?¶tÎÙò‰%æö/]%åÍbr²Ø„d¢þ¸jûÑ裆ä§5¥ñUßõÕ¥tÑë<:Ò»ãÂ'¾ó¨•Æg"ü5”´¼²Ø„œ,6!™è?®:_ß#ú(!5üõð»CZNµÏš‹þXÏî÷b>pmé^yHiŸò©ÒÜïm¥¶v‹ð×KÒòÎbr²Ø„d¢þ¸êÝvnôQCèßw•¿,»5O+ýo(+ïÅ”4 YlBN›LôÀWUý»ÑG ¡uÔÃï i9Ö<è7ÊJRµ+½Û/xâWÊø@©ïðÒð×@’æ³Ø„œ,6!™è?Žê;½,ú!TÞYjk6¿;¤åZ÷ê#ʲÔë<ñ+å—î[ZÇ|¸4öxC©Ím~Þ’ôTYlBN›LôÀGÍC~'ú!´Oý‡ð{CZÎÕwü‘…ŸdL­ê—þוî•öISû¼Õ?ˆHJ•Å&äd± ÉDüqÔ>ýÓÑÇ ªÓð}wÒjŸöÏ%“ê±»J÷ºcKûôÏ”æ¿Vê[?'ü %i)YlBN›LôÀGÝ«ÖE#0 î•_ ¿3¤ó‡„º¥Ì¢ªµþÿ|/æ1.õ]_^’4æ,6!'‹MH&zà£þýWG#0 æþÿwø!­”ZGþIôG¾”~÷‰ïżòÒ:áã¾SÒŠÉbr²Ø„d¢þ’[³y)½vô1èçÆR›[oH+¥¹U¥wÇ…SýœWëï)ÝkŽ*íS>Ušû½­ÔÖ>=þ$) ‹MÈÉb’‰øK­±×›¢Pû+ÿ~gH+­Æ¾¿TJUMl‰Ù»á¤Ò>{MiúîRßîáÿ}%iV²Ø„œ,6!™è¿ÔZGÿiôƒè¶J}»†ßÒJ¬wÝqKþWÍGKïÖ³Jç¼íJóËPê;ýhø/Išå,6!'‹MH&zà/µùÿ̾ùŸêо/¤•Zãs¯)¥×âÛ.ý»¾Q:ïUZÇüyiìþ“¾S’†Ìbr²Ø„d¢þRë^{tô˜ÿËÇÑ÷…´’ë\´ûàß‹¹å3ÂÿóJRö,6!'‹MH&zà/µþ½WF!°1½N©oûüðûBZÉÍ«ÆC¥ZÓWDHÒ$²Ø„œ,6!™è¿ÔªÖúè#6¢wÓ©áw…¤(õ­ŸþŸA’VJ›“Å&$=ð—R}‡—F0€Öq~_H’$M3‹MÈÉb’‰øKiþ{À€×ïúUWI’´â²Ø„œ,6!™è¿”ZÇ~$úø€èÝzvø]!I’4í,6!'‹MH&zà/¥ÎW·Š>>`#ÚgüKø]!I’4í,6!'‹MH&zà/¥î7‹>>`#ûþRø]!I’4í,6!'‹MH&zà/¥þÝ—D°ˆªýx©­Ù<ü®$Išv›“Å&$=ð—RÕx8úø€Eôn>-üž$IŠÈbr²Ø„d¢þ¨Õ·{AôÑÑ>ã…ß’$IYlBN›LôÀµÆ>?}tÀF4öýÅð»B’$)"‹MÈÉb’‰ø£Ö<ôÝÑG,Â÷kJ’¤•œÅ&äd± ÉDüQkø‰è£Ñ»í¼ð{B’$)*‹MÈÉb’‰ø£ÖùêVÑG,¢sñžá÷„$IRT›“Å&$=ðG­{ùÑG,¢uÂÇÃï I’¤¨,6!'‹MH&zàZï[_‰>:`þp$IZÉYlBN›LôÀµþýWG°!U¿Ô·zvø=!I’•Å&äd± ÉDüQ«E°ý‡n¿#$I’"³Ø„œ,6!™è?RkŸ^JUE°½ëŽ‹¿'$I’³Ø„œ,6!™è?Jõ]_}lÀ":ç¬ ¿'$I’"³Ø„œ,6!™è?JÍýß}lÀ"ZG}(üž$IŠÌbr²Ø„d¢þ(µŽøãècÑüâ;Âï I’¤È,6!'‹MH&zàRûäOF°ˆú®¯ ¿'$I’"³Ø„œ,6!™è?Jí³æ¢ ت*µµ[„ß’$I‘YlBN›LôÀ¥Î…Ÿ‹>6`ªÇï¿#$I’¢³Ø„œ,6!™è?JÝ+‰>6`úw_~GH’$Eg± 9YlB2Ñ”z7ž}lÀô®?>üŽ$IŠÎbr²Ø„d¢þ(õî¸0úØ€ è\¼gø!I’Å&äd± ÉDüQê?xCô±Ð>ý3áw„$IRt›“Å&$=ðGiþ“³©uìGÂïI’¤è,6!'‹MH&zàÝܪRzèc6 yØûâï I’¤à,6!'‹MH&zà[}›çE°ˆæï ¿'$I’¢³Ø„œ,6!™è?lõ]_}dÀ"_øùð{B’$):‹MÈÉb’‰øÃÖØû-ÑG,¢±ÇÂï I’¤è,6!'‹MH&zà[s¿·E°ˆúN/ ¿'$I’¢³Ø„œ,6!™è?l̓~3úÈ€EÌnô=!I’Å&äd± ÉDüak~ù÷£ ت*µÕ›†ß’$IÑYlBN›LôÀ¶ÖQŒ>2`CÚµð;B’$i²Ø„œ,6!™è?l­ã?}dÀTß~GH’$ÍB›“Å&$=ð‡­}òßE°ý‡n¿#$I’f!‹MÈÉb’‰øÃÖ>ýÓÑGl@ÿÁÂïI’¤YÈbr²Ø„d¢þ°µÏ^}dÀXlJ’$=‘Å&äd± ÉDüa뜿cô‘`±)I’ôD›“Å&$=ð‡­sñžÑGl€Å¦$IÒYlBN›LôÀ¶îåD°›’$IOd± 9YlB2ÑغW­‹>2`úß¹1üŽ$Iš…,6!'‹MH&zà[÷êã Ø‹MI’¤'²Ø„œ,6!™è?lÝkŽŒ>2`,6%I’žÈbr²Ø„d¢þ°u¯=:úÈ€ °Ø”$Iz"‹MÈÉb’‰øÃÖ½îØè#6ÀbS’$é‰,6!'‹MH&zà[ïú¢ Ø‹MI’¤'²Ø„œ,6!™è?l½NŠ>2`úßýVø!I’4 YlBN›LôÀ¶Þÿ}dÀTÝ~GH’$ÍB›“Å&$=ð‡­÷­¯D°Uó‘ð;B’$i²Ø„œ,6!™è?l½›O>2`Czð;B’$i²Ø„œ,6!™è?l½[ÎŒ>2`µ5›‡ß’$IÑYlBN›LôÀ¶Þ­gG°ˆú¶Ï¿'$I’¢³Ø„œ,6!™è?l½[ÏŠ>2`õ_~OH’$Eg± 9YlB2ÑØz7Ÿ}dÀ"»½.üž$IŠÎbr²Ø„d¢þ°õn<9úÈ€E4öykø=!I’Å&äd± ÉDüaë]w\ô‘‹h~ñá÷„$IRt›“Å&$=ð‡­{Í‘ÑG,¢yÈï†ß’$IÑYlBN›LôÀ¶îUë¢ XD누ߒ$IÑYlBN›LôÀ¶îE°ˆÖ± ¿'$I’¢³Ø„œ,6!™è?lÝK÷‹>2`í“?~OH’$Eg± 9YlB2ÑØ:ߨ;úÈ€E´Ïú÷ð{B’$):‹MÈÉb’‰øÃÖ¹h·è#ѹh÷ð{B’$):‹MÈÉb’‰øÃÖ¹`çè#Ñýæ—Ãï I’¤è,6!'‹MH&zà[ç¼í¢ XDï–3Âï I’¤è,6!'‹MH&zà[ûìÕÑG,¢ï•á÷„$IRt›“Å&$=ð‡­ý•Š>2`Õcw‡ß’$IÑYlBN›LôÀ¶Ö‰}dÀbzíR›[~WH’$Ef± 9YlB2ÑØZGÿYô‘Qßú¹áw…$IRd›“Å&$=ð‡­yØû¢ ؈Æg<ü®$IŠÌbr²Ø„d¢þ°5úÍè#6¢±ï/†ß’$I‘YlBN›LôÀ¶Æ~¿}dÀF4×½'ü®$IŠÌbr²Ø„d¢þ°5özsô‘Ñ:î/Ãï I’¤È,6!'‹MH&zàÛüw÷³­}ú§Ãï I’¤È,6!'‹MH&zà[}‡—F° v¿+$I’"³Ø„œ,6!™è?lõ­ž}dÀFt¯88ü®$IŠÌbr²Ø„d¢þÐÍmRJUE°ˆÞ·¾WH’$f± 9YlB2Ñ”ªÖcÑÇ,¢ÿÀµá÷„$IRd›“Å&$=ðG©zäöècQµÖ‡ß’$I‘YlBN›LôÀ¥þ½WD°õ­Ÿ~WH’$Ee± 9YlB2Ñ”z·ž}lÀF4öø©ð»B’$)*‹MÈÉb’‰ø£Ô½öèèc6¢yðo‡ß’$IQYlBN›LôÀ¥î¥ûE°­ãÿGø]!I’•Å&äd± ÉDüQꜿCô±Ñ9gËð»B’$)*‹MÈÉb’‰ø£Ô>ý3ÑÇlD÷òÃï I’¤¨,6!'‹MH&zàRë„G°½[ο+$I’¢²Ø„œ,6!™è?J­Ãÿ(úØ€è?xCø]!I’•Å&äd± ÉDüQjøÎèc6¦] ¿+$I’¢²Ø„œ,6!™è?J½&úØ€Ô·}~ø}!I’‘Å&äd± ÉDüQªïô²ècÐØëMá÷…$IRD›“Å&$=ðGjÍÓJ©ªè£6¢yè»âï I’¤€,6!'‹MH&zàZÕx8úè€hø×áw…$IRD›“Å&$=ðGmþ/.³­sî6áw…$IRD›“Å&$=ðG­wÛ¹ÑGlD÷Ê/…ß’$IYlBN›LôÀµî5GF°½;¾~WH’$Ed± 9YlB2ÑÔ:í}tÀFTß~WH’$Ed± 9YlB2ÑÔÚgþkôѨoýœðûB’$iÚYlBN›LôÀµÖñ‹>:`½Þ~_H’$M;‹MÈÉb’‰ø£Ö<ôÝÑG  uøûÃï I’¤ig± 9YlB2ÑÔŸÿ¿¢@ûôO‡ß’$IÓÎbr²Ø„d¢þ¨Õw~EôÑè^ºoø}!I’4í,6!'‹MH&zàÜš§•RUÑÇlDïÖ³ãï I’¤)g± 9YlB2Ñ)Uß}|ÀFTÜ~WH’$M;‹MÈÉb’‰øK©ÏeÑÇlLÕ/µµ[„ß’$IÓÌbr²Ø„d¢þRê]|ôñhìþúðûB’$išYlBN›LôÀ_J‹÷Œ>>`ÍCß~_H’$M3‹MÈÉb’‰øK©}úg¢@û”¿¿/$I’¦™Å&äd± ÉDü¥Ô:úO£@çë{„ß’$IÓÌbr²Ø„d¢þRj~ñÑÇ  wÓ)á÷…$IÒ4³Ø„œ,6!™è¿”껾:úø€ô¿sSø}!I’4Í,6!'‹MH&zà/©µ[”RUÑGlL¯]j«7¿3$I’¦”Å&äd± ÉDü¥VÕˆ>B`õ]^~_H’$M+‹MÈÉb’‰øK­ÏeÑG  yÐo†ß’$IÓÊbr²Ø„d¢þRë]|ôhŸüwá÷…$IÒ´²Ø„œ,6!™è¿Ô:~.út.Þ+ü¾$IšV›“Å&$=ð—Zû”OE!0€Þ­g‡ß’$IÓÊbr²Ø„d¢þRk®{Oô¨Öß~_H’$M+‹MÈÉb’‰øK­±ç£P}Ûç‡ß’$IÓÈbr²Ø„d¢þR«oõìè#ÔØ÷Ãï I’¤id± 9YlB2ÑUõïD#0€Öq~_H’$M#‹MÈÉb’‰øã¨÷%ÑÇ  sÁNá÷…$IÒ4²Ø„œ,6!™è?Žº×}ŒÀz7þGø}!I’4,6!'‹MH&zà£Îù;D#0€êá[Ãï I’¤id± 9YlB2ѵNüDô1ƒ¨ú¥¶å3Âï I’¤Ig± 9YlB2Ñ5þíècÔØëÍáw†$IÒ¤³Ø„œ,6!™è?ŽŸ{Mô1jù'áw†$IÒ¤³Ø„œ,6!™è?–Öl^J¯}”À:çlgH’$M8‹MÈÉb’‰øãªÿÐ-ÑG  {ÍQá÷…$IÒ¤³Ø„œ,6!™è?®z7}”Àú÷_~_H’$M:‹MÈÉb’‰øãªsÑîÑG ¢×.µÕ›…ß’$I“Ìbr²Ø„d¢þ¸jŸüwÑG hþ~Eß’$I“Ìbr²Ø„d¢þ¸jüÛÑG ¨¹î½áw†$IÒ$³Ø„œ,6!™è?®ê»¾:ú(µOÿLø!I’4É,6!'‹MH&zà­Õ›–ÒmE'0€îÇß’$IÌbr²Ø„d¢þ8ë?x}ôqèß}Iø}!I’4É,6!'‹MH&zà³Þ 'E'0ˆNc᧬£ï I’¤Ie± 9YlB2Ñœu¾¶kôqjìöÚð;C’$iRYlBN›LôÀg­ÿ:ú8µø!I’4©,6!'‹MH&zà³æ¿}œÀ€:ç¬ ¿3$I’&•Å&äd± ÉDüqVßá%ÑÇ ¨wÝqáw†$IÒ¤²Ø„œ,6!™è?îªÆÃÑG  ÿÐ-á÷…$IÒ¤²Ø„œ,6!™è?îúw^}¤À ªªÔ·~Nø!I’4‰,6!'‹MH&zà»îåD)0 Æ¾¿~gH’$M"‹MÈÉb’‰øã®}Ú?G)0 Ö ¿3$I’&‘Å&äd± ÉDüq×<ô]ÑG ¨sñžáw†$IÒ$²Ø„œ,6!™è?î껾:úHõn;/üÎ$IšD›“Å&$=ðÇÞÜ&¥tÑÇ  j>Rjs«âï I’¤1g± 9YlB2Ñõïûfô±ªïüòð;C’$iÜYlBN›LôÀŸDÝ«ˆ>V`@óß‹}gH’$;‹MÈÉb’‰ø“¨}öšècÔ>ã_Âï I’¤qg± 9YlB2ÑµŽø@ô±ê~ó°ð;C’$iÜYlBN›LôÀŸDÝ2úXõï¿&üÎ$Iw›“Å&$=ð'ÒêÍJé¶¢D¿[jk·ˆ¿7$I’ƘÅ&äd± ÉDüIÕ¿ïªè£ÔØû-áw†$IÒ8³Ø„œ,6!™è?©ºW­‹>Z`@­c>~gH’$3‹MÈÉb’‰ø“jþ/-9t.Ø)üÎ$Ig›“Å&$=ð'UsÝ{¢PïæÓÂï I’¤qf± 9YlB2ÑRÕw}UôѪÖß~gH’$3‹MÈÉb’‰øknU©Zë£P}ûÅß’$IcÊbr²Ø„d¢þ$ëßuqôñjô›áw†$IÒ¸²Ø„œ,6!™è?ɺ—í}¼À€Ú§&üÎ$IW›“Å&$=ð'YûÔÿ}¼À€ºW~gH’$+‹MÈÉb’‰ø“¬yà;£Pÿ»ß ¿3$I’Æ•Å&äd± ÉDüIVßîÑÇ ªªJ}›ç…ß’$IãÈbr²Ø„d¢þ¤«»+úˆ5¿øŽð;C’$iYlBN›LôÀŸt½OŽ>b`@íSþ>üÎ$IG›“Å&$=ð']ç«[E10 î‡ß’$IãÈbr²Ø„d¢þ¤kþþè#Ô¿ÿêð;C’$iYlBN›LôÀŸtÏþxôƒê÷JmËg†ß’$IKÍbr²Ø„d¢þÄ›[Uªæ£ÑÇ ¨ñ…Ÿ¿7$I’–˜Å&äd± ÉDüiÔ»ýüècÔ:ñáw†$IÒR³Ø„œ,6!™è?:_ß#ú˜u/Ý7üÎ$IZj›“Å&$=ð§QëøE30 þÝ—†ß’$IKÍbr²Ø„d¢þ4jìóÖècÕm•ÚšÍÃï I’¤¥d± 9YlB2Ñ*­Ý¢”^'ú¨5özsü½!I’´„,6!'‹MH&zàO«þýWG50 Ö± ¿3$I’–’Å&äd± ÉDüiÕ½òKÑG ¨sÑîáw†$IÒR²Ø„œ,6!™è?­Ú_ù§è£Ô»ý‚ð;C’$i)YlBN›LôÀŸVÍß}ÔÀ€ªöã¥6·Iø½!I’4j›“Å&$=ð§U}»D50„Æn¯ ¿7$I’FÍbr²Ø„d¢þ4«½3ú¸µŽú`ø!I’4j›“Å&$=ð§Y¢Pç‚Âï I’¤Q³Ø„œ,6!™è?Í:_Ý*ú¸õn93üÎ$I5‹MÈÉb’‰øÓ¬uØF70 ªñp©Í­ ¿7$I’FÉbr²Ø„d¢þ4«ïúêèã†PßåÇÂï I’¤Q²Ø„œ,6!™è?ÕæV•ªùhô‘jö¾ø{C’$i„,6!'‹MH&zàO»ÞmçE90 Î¹Û†ß’$I£d± 9YlB2ÑÚu.Ú=úÈõn9#üÎ$I%‹MÈÉb’‰øÓ®uÌŸG90 ªùˆ? $I’Rf± 9YlB2ÑÚ5öxCô‘Ch|ö'Âï I’¤a³Ø„œ,6!™è?õæ6)Uk}ô±jõÁø{C’$iÈ,6!'‹MH&zàGäA ?~gH’$ ›Å&äd± ÉDüˆ:_Û5úØõn¿ üÎ$I6‹MÈÉb’‰øµŽúPô±ƒêÔKmõfá÷†$IÒ0YlBN›LôÀ¨±Ûk£BcÏ7†ß’$IÃd± 9YlB2Ñ?¤¹U¥j>}ôÀ€ZÇýeü½!I’4D›“Å&$=ð£êÝzvôÑê^òùð;C’$i˜,6!'‹MH&zàGÕ9Çè£Ô¿ç²ð;C’$i˜,6!'‹MH&zàGÕ:â£T¯SjkŸ~oH’$ šÅ&äd± ÉDü¨ê»¾:úè!4¾ðóá÷†$IÒ YlBN›LôÀýBõïF?0 öÉŸŒ¿7$I’Ìbr²Ø„d¢~d½›O>~`@Ý+¿3$I’Íbr²Ø„d¢~ds·>~`@ý® ¿3$I’Íbr²Ø„d¢~d­Ãþ0úøAUýRßú¹á÷†$IÒ YlBN›LôÀ¬¾ó+¢Bó‹¿~oH’$ ’Å&äd± ÉDüèªÚÑ/0 öiÿ~gH’$ ’Å&äd± ÉDüèz7ýê^sdø!I’4H›“Å&$=ð£ëœ³eôK ¨zøÛáw†$IÒ YlBN›LôÀ®¹î½Ñ/0„úö/ ¿7$I’6–Å&äd± ÉDüèê;¼4ú%†Ð<äwÂï I’¤e± 9YlB2ѪÖßý2jŸ5~gH’$m,‹MÈÉb’‰ø³P_`@½N ¿3$I’6–Å&äd± ÉDüY¨}öêè—Põø}áw†$IÒÆ²Ø„œ,6!™è? ÍgG}§—…ß’$I‹e± 9YlB2ѪoûC¥TUôK ¨yØûÂï I’¤Å²Ø„œ,6!™è?+õº9ú¥Ô9oûð;C’$i±,6!'‹MH&zàÏJÝ«ÖE¿À€zß>'üÎ$IZ,‹MÈÉb’‰ø³Rû”OE¿À ÚµR[½Yø½!I’´¡,6!'‹MH&zàÏJ}1ú¥†ÐØëMá÷†$IÒ†²Ø„œ,6!™è?3­Ý¢”n+úåÔ:áãñ÷†$IҲ؄œ,6!™è?Kõï¾4úåÔ½ü€ð;C’$iCYlBN›LôÀŸ¥:ïýrê?p]ø!I’´¡,6!'‹MH&zàÏR­cþ<úåUU¥¾íóÃï I’¤§Êbr²Ø„d¢þ,ÕØýõÑ/0„æÁ¿~oH’$=U›“Å&$=ðgª¹U¥j<ý’jŸ5oH’$=E›“Å&$=ðg­Þ-gD¿$À€z7þGø!I’ôTYlBN›LôÀŸµ:çný’ªêß]øIëè{C’$éÉYlBN›LôÀŸµšëÞý’Ch|î5á÷†$IÒ“³Ø„œ,6!™è?kÕ·qôK ¡u̇Ãï I’¤'g± 9YlB2Ñ«½#úeÔ¹x¯ð;C’$éÉYlBN›LôÀŸÅº×ý²êßsYø!I’ôä,6!'‹MH&zàÏbíÓþ9úeÕë”Ú–Ï ¿7$I’¾7‹MÈÉb’‰ø³Xó‹ïˆ~Y€!4÷{ø½!I’ô½YlBN›LôÀŸÉ¶|f)ýnôK hþ§¬Ãï I’¤ïÉbr²Ø„d¢þ¬Ö¿ïªè—P÷Ú£Ãï I’¤ïÍbr²Ø„d¢þíæšÏ IDAT¬Ö½t¿è—Pµþžð;C’$é{³Ø„œ,6!™è?«µŽÿÑ/ 0„úN/ ¿7$I’þ+‹MÈÉb’‰ø³Zc¯7E¿4ÀZ‡ÿQø½!I’ô_YlBN›LôÀŸÙVoZªöãÑ/0 Î;Çß’$Iÿ™Å&äd± ÉDüY®wÛ¹Ñ/0 Þíç‡ß’$Iÿ•Å&äd± ÉDüY®sÁNÑ/0¨N£ÔÖl~oH’$Íg± 9YlB2Ñ–›ÿÎ> Æ>o ¿7$I’æ³Ø„œ,6!™è?ËÕw~EôË ¡}ò'Ãï I’¤ù,6!'‹MH&zàÏzÕú{¢_"`@Ý+¿~gH’$Íg± 9YlB2ÑÖë]BôK ¨ÿÝo…ß’$IóYlBN›LôÀŸõÚgþkôK ªªJ}»†ß’$I›“Å&$=ðg½æA¿ýCh®{oø½!I’d± 9YlB2ÑÖ«oó¼Rª~ôË ¨sþŽá÷†$I’Å&äd± ÉDü õ¼>úeÔ»ãÂð;C’$Ébr²Ø„d¢~†ºWý2ƒê¶JmíÓÃï I’´²³Ø„œ,6!™èŸ¡öIý2Chîÿöð{C’$­ì,6!'‹MH&zàg¨ñùŸ‹~™€!´OÿLø½!I’Vv›“Å&$=ðS´fóR:è— Pâï I’´¢³Ø„œ,6!™èŸ¥þE¿TÀ€ªÆÃ¥6·Iø½!I’Vn›“Å&$=ð³Ô¹h·è— Bc7„ß’$iåf± 9YlB2Ñ?K­£>ýRChðWá÷†$IZ¹YlBN›LôÀÏRã³?ýRCè^qpø½!I’Vn›“Å&$=ðÓ4·ªTõïD¿\À€úÝoH’¤›Å&äd± ÉDüLõn:5úå†Pßñ‡Ãï I’´2³Ø„œ,6!™ÿÝÞ†[V–Þ“ JÄ`Lãð:ÆV;Ѥێ‰tÇ$ŽQ‰ß„vHÇÓ‰ÚI«IÞSU@1TY C!ƒL%R2 ( ƒÌS1ÏsA1SÔY{^ëy¯sHGÁªâœ³÷>÷~öúý®ëÿ¡¯«?Ö³ïgysÎ>“#péçRçœEÑ ˜…ÖÊ†Ï I’TÏ,6!O›™è ?§šßþ@ôãf¡sážásC’$Õ3‹MÈ“Å&d&úÂÏ©b·íRªªèGÌPyߥásC’$Õ3‹MÈ“Å&d&úÂÏ­ò±Û£0S½NšÜiëð¹!I’ê—Å&äÉb2}áçVwÕÊèGÌBóÐß Ÿ’$©~YlBž,6!3Ñ~nµOûRô#f¡}Ö¿†Ï I’T¿,6!O›™è ?·ýNô#f¡wËiásC’$Õ/‹MÈ“Å&d&úÂÏ®E[¥ÔkG?6`†ªÖÚ4¹`³øÙ!I’j•Å&äÉb2}áçXyÿåÑ ˜…Æò·„Ï I’T¯,6!O›™è ?Ç:—,~lÀ,´OùÛð¹!I’ê•Å&äÉb2}áçXëø£0 Ýk¾>7$IR½²Ø„YlBž,6!3Ñ~®uÎÝ9úѳнì€ð¹!I’ê“Å&äÉb2}áçZóÈF?:`ʇo Ÿ’$©>YlBž,6!3Ñ~®»m—RUE?>`¦ª*{üJøì$IõÈbòd± ™‰¾ðs®züŽèÇÌBëè‡Ï I’T,6!O›™è ?纫VF?>`:—î>7$IR=²Ø„8ô»º{Å·Âÿïî'‹MÈ“Å&d&ú‡¦~òk¦ßŒ†ÎOö Ÿ’$åó½˜å¼ßÕÝkŽŒÿwÑG›'‹MÈLô…?.Ußý(Y(¸*|nH’4šß‹ÙL£ {ýñáÿnúÉbòd± ™‰¾ðǥјí÷l.Þ6|vH’4Nß‹9H½›þ﫟,6!O›™è \jŸúÅèG ÌRó;>;$IVÅ.Ûüô{1¯^‘ªÇïL9éÝqvø¿Ã~²Ø„;$IH‹¶LßžÚßÿ_©{õ·SùðMÙ|Äÿ{í#‹MÈ“Å&d&ú›m™R·ý8Y(ï¿<~vH’4Ç_)oý±‘û^ÌAÊýž¶Ø„²Ø„{aêÝtJªŠG¢¯»ì”ÞþûÉbòd± ™‰¾ðÇ­Þm?Œ~¤À,µNøTøì$å[±ó }/æTßþlûÉbòd± ™‰¾ðǭι;G?R`–º×>;$Iù}/æÔ¯”—«¯ð½˜CR=qwüóî#‹MÈ“Å&d&ú·šG~0ú‘³T­[3ýUÑóC’4º¿RÞ9ß‹9Ϫµ÷…?ÿ~²Ø„;}d± y²Ø„ÌD_øãXûÔ/F?V`¶Ú“irÑ–áóC’4ŒïÅ´`ÊQõÔêð³ÔOÎäÉb2}ác+ú±s0õ+‰ÑóC’4»ŠÅ/ò½˜cÊ"XlBf¢/ü±láþb&d¨sîÎñóC’´áv~Aj¼CjŸú©{õŠT>t½?Ú8ƪ'îŽ?s}d± y²Ø„ÌD_øãZD?Z`–Ê{/Ÿ’¤kÁf©±ï›SëøS碽Ÿþ•ò^;úª`MýAÎðsØG›'‹MÈLô…?®u.\ýhÙ*{©ØõÅáóC’êü½˜Ó¿R~ûY–B¤ò±ÛÂÏe?9Ã'‹MÈLô…?®µŽþXô£æ yÔGÂç‡$Õâ{1§~¥üŒ¯þÛ÷b>=þAå#7‡ŸÕ~²Ø„rKøì¤ló½˜ P¹æºø3ÝG›'‹MÈLô…?Îu¯?.úñsP,{uøü¤ì¾sêWÊ›ODpÆHùà5ág¼Ÿ,6!O›™è œkŸþјƒÖ‰Ÿ Ÿ’4j»m—š+þðé%æÍ?HÕäÃÑãš1W®¾2üÜ÷“Å&äÉb2}ásS_Šä§»jeøü¤Ð|/&# ¼÷¢øÏBYlBž,6!3ÑþX·h+ß+ªŠG¦¿'.|†HÒ|}/æ~¿>ýÓêÝËLåW§Tv£G1¤ÞçÄ>úÈbòd± ™‰¾ðǽòþË¢10ƒ~;|~HÒ¼|/fãñè‘ ëÕ»åÔðÏK?YlBž,6!3Ñþ¸×¹hŸèG ÌAçœÂç‡$õ[±Ë/N5Îô¯”_wlªÖ­‰¯0cÝNÿ õ“Å&äÉb2}á{­c?ýˆ9(ï¿<|~HÒ¬¿sß7§ÖIŸó½˜Œ…â?W}d± y²Ø„ÌD_øã^±çk¢10U•Š%/ Ÿ!’´¡Š=_›ZÇï˜:ízw_R·=9a ºWþ9ë'‹MÈ“Å&d&ú¯CÕº£30­?>?$iýß‹ùXôˆ„¡ë\ºøg¯Ÿ,6!O›™è ¿õn<)ú1s0õ}tÑóCRÍ¿óê©zâ®èq!:. ÿ<ö“Å&äÉb2}áסö™_‹~ÌÀT­µÓßY=C$Õí{1Ëèñ#¡óãÅñŸÑ>²Ø„C$P 6ú{1ß1u/?È÷b´ŽùDüç½,6!O›™è ¿.µŽþxô£æ¨}Ê߆ÏIqK¶O­£?æ{1až5W¼?üóßO›'‹MÈLô…_—Š%/‹~ÔÀõn:%|†Hš¿%fóÈ¥öÙ §?ûUñhô‚ÚjüŽð™ÐO›'‹MÈLô…_§ª'îŠ~ÜÀ\tŠ4¹h«ð"ixu¯?.Ukïž6ÀÏhì÷k᳡Ÿ,6!O›™è ¿NuWý¸šþ:œ¤´ÓÖÑ#Xâ믌Ÿ}d± y²Ø„ÌD_øuª}Ê¢70GS,z†HNSË`ô‹_>úÉbòd± ™‰¾ðëTcù[£70GÕãw„ÏIÃÉý #¨ªÒäĦáó¡Ÿ,6!O›™è ¿V-Ø,U­µÑ˜£ÆÞÿ1~ŽHxÍC?z¼ÏRµž Ÿ ýf± y²Ø„ÌD_øu«wÛј£ö_ Ÿ!’_ë»=^€g™úc^ѳ¡ß,6!O›™è ¿nµÏ^ýÈ9*ï½8|†H|­“?=^€g)¼&|6ô›Å&äÉb2}á×­æaïŠ~äÀ\UU*–¾"|ŽHlí³þ%zºÏÒ»ãG᳡ß,6!O›™è ¿víü‚”Ênôcæ¨ýý¿‹Ÿ#’ZçÂ=£G ð,ÝkŸ ýf± y²Ø„ÌD_øu¬\}eôcjü$’žY÷ªÃ£G ð,Kö Ÿ ýf± y²Ø„ÌD_øu¬sñ¾Ñ˜«²›ŠÝ¶ Ÿ#’Wï¦S¢' ð,s…φ~³Ø„³Ø„>‘Å&äÉb2}á×¹©¿¬ ä«{Å·Â爤þê^uxô(ž¥|àªðÙ0ˆ,6!O›™è ¿ÎµOÿÇèÇô¡*I“ 6Ÿ%’æ^£G ð,½›>‘Å&äÉb2}á×¹Æo‹~ü@Ÿš‡¼3|–Hš{壷F`L#Âbòd± ™‰¾ðk݂ͧÿ ¯ÎÅûÆÏIskÑ–)•Ýè1 @Ÿzw>K$ͬÎy»G `=Úg~-|> *‹MÈ“Å&d&úÂ×Óu~¼kôQúUU©Xöêðy"é¹ëÝñ£è‰Œùã³Ø„À4öûµðy"iõNøTô˜Ö§=9ýÕÑ3bPYlBž,6!3Ѿ~Zç‚¥ÑÇ€©?J=O$m¸Î%ˣǰåC7„χAf± y²Ø„ÌD_øúiÍï>ÀTO­N“ 6Ÿ)’Ö_ùàªè1¬Gï¦SÂçà ³Ø„O$ý|SÿÑM­ïýÏð1È,6!O›™è _Ϭ}ö‚è# BU¦bÙ«ÂgФgÖ¹pYôt6 ù­ÿ>#™Å&äÉb2}áë™5Þ!úHÒ>{aøL‘ôÌÊÕWD`ŠÝ_>#™Å&äÉb2}áëY-Øë_ãçŠTóþVô(6¢µò£ásbÐYlBž,6!3ѾÖ_wÕQÑGêñ;ÓäĦásEªsóvÀF4öycøœt›'‹MÈLô…¯õ×úÞ_E `€š‡¿'|®Hu®|äæè1lH§‘&l>'Å&äÉb2}ákýË^}4€òG„¤¸û¼)zQ®¾"|N #‹MÈ“Å&d&úÂ׆+»-úxƒR•©ñ_ Ÿ+R›úž[`tu¯:<|N #‹MÈ“Å&d&úÂ׆ë^v`ôñ¨séþásEªcåšk£?þÀF´OûrøœF›'‹MÈLô…¯ ×:úcÑǤN‘ŠÝ^>[¤:ÕØÿ7¢?ùÀshö®ðY1Œ,6!O›™è _®Øm»é__ÆÇÔ¯ÄFÏ©Nu.øzôÇxÅî/ ŸÃÈbòd± ™‰¾ðµñÊ®Š>"ÀUëÖ¤ÉE[…Ï©Mlšªµ÷Eì¨Ö=?+†”Å&äÉb2}ákãu.X}D€kðéðÙ"Õ¡æáïŽþ¸Ï¡wû™á³bXYlBž,6!3Ѿ6^óˆ÷F`À¦þÉäÄ&áóE÷º×ýqžCçÂeá³bXYlBž,6!3Ѿž£E[¦ª½.ú˜6õ-Âç‹4Æ{üJJ½vôGx­c?>/†•Å&äÉb2}áë¹ëÝüýèc Xï¶3Âg‹4εÏüZôǘÆ^¯ŸÃÊbòd± ™‰¾ðõܵOùÛèc ZU¥Æ~¿>_¤±lbÓT>v{ô§xUó‰±þj‹MÈ“Å&d&úÂ×sWìùšèc AwÕÊðù"cÍïüqôǘÞíg…Ï‹af± y²Ø„ÌD_øšYåÃ7F`Ъ25–¿5|¾HãVï®ó¢?ÝÀ tÎÛ-|^ 3‹MÈ“Å&d&úÂ×Ìê\¸gôQ† {à áóE§¼-úc ÌPkåGÃgÆ0³Ø„*À°¾kó€ÿ>c¤q©{Ý1ÑŸj`†Š¯¿2|f 3‹MÈ“Å&d&úÂ× [ø¼Tµ×E`z7ÿ ~ÆHcPc¯×¥Tv£?ÒÀ T“…ÏŒag± y²Ø„ÌD_øšy½OŠ>.À4úíð#å^÷ªÃ£?ÊÀ Õá?êYlBž,6!3Ѿf^ë¤ÏE`Hz·Ÿ>c¤œkìõz?­ iŸ½0|n ;‹MÈ“Å&d&úÂ×Ì+–¾"ú¸CÔ<äásFʵîÕ+¢?ÂÀ,4{WøÜv›'‹MÈLô…¯ÙU®¹.úÈCÒ»ë¼ð#åXcï7øiMÈIÙMÅ.Û„ÏŽag± y²Ø„ÌD_øš]ó—D`ˆš+þ0|ÎH¹Õ»áÄè.0 åê+ÃçÆ|d± y²Ø„ÌD_øš]ÍC?úÈCT>v[š\´eø¬‘riê+€¼t.Ú'|vÌG›'‹MÈLô…¯Y¶p‹T5ŸŒ>6ÀµÏøJü¬‘rhbÓTÞyôG˜¥ÖÑŸóÅ&äÉb2}áköuo8!úØCTµ×¥béËÃg4êµNøTôǘƒ©?ˆ=?æ#‹MÈ“Å&d&úÂ×ìk}ïF`Ⱥ×|'|ÖH£\±Ë/¦jíýÑU`–ª'îŸó•Å&äÉb2}áköK¶O©ª¢0dSß=o¤Q­séþÑQ`º«Ž Ÿó•Å&äÉb2}ákn•\}t€!+¼&M.Ø,|ÞH£VãÀ·§T•ÑQ`Ú§|!|†ÌW›'‹MÈLô…¯¹Õ9w—è£̃:ý@iF-Ø<•\ýÑ樱ÏãçÈv{ø,™ï,6!O›™è _ýÕ½öèè#Ì£öéÿ;|îHóY±ìU©*þè}ê^~Pø<™ï,6!O›™è _ýÕ:ö“ÑG˜OÝVjì÷ká³Gš·ïÕ\}Eô§€Ö1ŸˆŸ)óœÅ&äÉb2}á«¿ŠÅÛ¦ÔëD#`•^“&wÚ:|þHî{ùÁÑ7`ª*»¿4|¦Ìw›'‹MÈLô…¯þëÝ~fô1æY÷š#Ãg4ÌZ'>úc H¹úÊð™‘Å&äÉb2}á«ÿZ'ÿMô1´Oýbøü‘†Qóˆ÷¥Tv£?bÀ€tÎÝ%|®Dd± y²Ø„ÌD_øê¿b_I©ìE%`¾•ÝÔ<äá3Hd}ßœªæÑŸ.`€µ²Þè IDAT¿#|¶Dd± y²Ø„ÌD_øL½»~}”€Õº5©Xúòð$ ¢bÉö©zòžè0@Uã±4¹`³ðù‘Å&äÉb2}ák0µð÷ÑG RÞwIš\´eø’úýcxåWEœ€ë®Z>_¢²Ø„w¢³Ø„VÀ(éµSkåGÃg“êÛÔ´š:‡@=TÅ#irÁæá³':‹MÈ“Å&d&úÂ×à+–lŸRUF-`””ÝÔ:æáóI5kÁf©sþѧ˜gÝ+‰Ÿ?#Å&äÉb2}ák8õî<7úh£¦ì¥ö÷ÿ.|>©»ÿrêÝvFô©4¿ýð4 YlBž,6!3Ѿ†SëäÏG-`”ÿ ÃĦásJã[ó[ÿ=UO­Ž>ê@€ª½.M.Ú*|B›'‹MÈLô…¯áTìö’é_=XŸîÕßN“ ·ŸU³&6Mí3¾êþë^{tü,‘,6!O›™è _ëwëéÑÇ a½;ÎNÅâ…Ï*GŲW¥ÞçDk Xs埄ϣQÉbòd± ™‰¾ð5¼Z'|*úx#®|ðšT,{uø¼RÞµNülªZk£3ljø5ôŸf± y²Ø„ÌD_ø^Å.Ûx¡žSU<šš‡¿'|f)¿Š=þCêÝtrôFD÷êási”òy²Ø„ÌD_ønÝUGE1 U•:çïá ifMlšZÇï8½ø¿šG¼/~>P›'‹MÈLô…¯áÖ\ñþè#d¤{ýñ¾wS­qÀÛRyÿåÑG1Uñˆ?J÷¬,6!O›™è _CnÁæ©Z÷`ô12R=yOjöñóK#U±ë/¥Î¥û§T•ÑGAÝËŸS£–Å&äÉb2}ákøu~²Wô1rSU©{ùAir§­Ãg˜‚[ø¼Ô:és©š|8úT#¬yÈïÆÏ«Ëbòd± ™‰¾ð5üûÿfô12U>t}j|ó¿„Ï1}æ Ÿšþ ^€©ÖÞï;š×“Å&äÉb2}ák~šZNÌIÙK‹÷õÝ›uib“ÔüΧòÁUÑ'ÈDçÂeñ³k³Ø„Ê{/Š>)Àé^{tø|å,6!O›™è _ó[ç¢}¢0Ϊ2õn:%5~Gø¼«}S èà¦:³j¯‹>Àjñ¾øY7ÂYlBž,6!3Ѿ淩?ø0zwŸŸšG}$M.Ø<|öÕmÎwÎÛÝwgC55c&l>óF9‹MÈ“Å&d&úÂ×üW®¾2úØ5R=õ@ꜿ$5öycøüË&6Iß>ýï¸|ìöèÇ ÔDçÇ»ÆÏ¿Ïbòd± ™‰¾ð5ÿµ¿ÿwÑǨ©Þ=¦Ö÷þ*»übø,̺E[¦æaïJ‹÷õ“™Àü«ÊÔØëuñ³pij؄zO+{©w×y©}Ú—Rcï7„ÏÇQ©Øó5©uüŽ©{Å!©zòžè§ðïšG}8|FæÅ&äÉb2}á+¦æ¡¿}ôÖ«Z·fú§§~:qê§£çå¼´`³ÔØ÷ÍOÿDæÕ+RõÄ]Ñ`½ª'ïõGƒf˜Å&äÉb2}á+¨‰MRùðÑÇà9Uß™ºW{ú':›‡ünößÏ9õÏßå ©{ùA©¼÷â”Ú“Ñÿšf¤ý£‰ð9šK›'‹MÈLô…¯¸¦¾Û ;U•ÊGoMÝkNí3¿–Zßý³ÔØÿ7R±Ë6ásõß[°Y*–½jú§ã['~6u~¼8õnü^ª¿cúŸ K½N*–¼,~Æf’Å&äÉb2}á+®bñ¶^¸€±û5öÞ=?™þuî©ebûÔ/¦Öq‘šG¼75–¿5K_>ýÅç<;wz~*–¾bz‘Ú<ü=©uì'SûŸ:ç,JÝËL½ÛÏLåc·Mÿ€qÓ½þ¸ð÷לòž y²Ø„ÌD_øŠ­{åaÑG DÕxüéž¼wú')§¾ž£\}E*W_9ýÿžî©ÕÿþÿoêÔYó°w…¿»æ”Å&äÉb2}á+¶Æ¿}qSÿñgê;Ú£ß]sÊbòd± ™‰¾ðßÔO(À†´Nú\ø;knYlBž,6!3Ѿâ›zQ€õ©¥É_þΚ[›'‹MÈLô…¯øŠ_˜ªæ“ÑG€4õÇØ¢ßWsÌbòd± ™‰¾ð5u~òè£À¨éµS±dûðwճ؄úH0šßù£ø÷ÓŒ³Ø„¢ Yû¬ ï·,6!O›™è _#Þ‚ÍSõÄÝÑÇ€!©ŠG}·æ²Ø„® Hëäχ¿_Žs›'‹MÈLô…¯|*vÛ.U­§¢,}*¹%M.Ü"üýrœ³Ø„5WþIø{å¸g± y²Ø„ÌD_øÊ«b_ñ’±òÞ‹ÓäÄ&áï•ãžwfÈ“Å&d&úÂW~u.Ú;úØ0G̓wŸ¬C›'‹MÈLô…¯ü*–lŸR§}t˜¥î '„¿KÖ%‹MÈ“Å&d&úÂWžu.Ù/úè0e75öySø{d]²Ø„ÂlDùðirááïuËbòd± ™‰¾ð•wÅÎ/LÕäCÑÇ€ h®xø;c³Ø„åo£2?£sÞnáïˆuÎbòd± ™‰¾ð5&-Ü"•Ü}œH)UkïŸþ.ôðwÄg± y²Ø„ÌD_øŸšG}8ú8Rj}÷OÃß ëžÅ&äÉb2}ák¼êÝqvô‘¨µÞ­§‡¿Êbre± ™‰¾ð5^5öÿÍ”ª2úXÔS§HÅž¯ '”Å&äÊb2}áküê®Z}¬j©}ÆWÂßõt›'‹MÈLô…¯ñ«Xöꔺ­è£ P+åšk§ÿ cô» ž.u›ÑG˜‹MÈŒ— £Î_>ÚõQ•©qð;ÂßõoMl’Réë™ G›™ÉÅ/Ž¿ø5v»¾8UÅ£ÑÇ º—þþ§Ÿiáó¢0G›™É¥¯Œ¿ø5–µ¿ÿwÑÇ`ìUO­NÅâmÃßýôӊݶ‹>ÀYlBfŠ}Þ~ñkL[°Y*¼&úˆŒµæQ‰ïÓ3jìý£0G›™âÀ·‡_üßš‡ünJU}ÌÆR÷êáï{úùýNôÑæÈb2Ó8ìÝá¿Æ»îª•ÑÇ`<}Wß—?еŽùóèãÌ‘Å&d¦y§Ã/~wÅÒ—§ª½.ú¨Œ¿‚>ºuÎY}<€9²Ø„Ì´ÏÛ=üâ×ø×>óŸ£:ÀØð+è£]÷ÚïF`Ž,6!3ÝN ¿øUƒ>/•Ü}ܲW=õ@*vý¥ø÷;m°ò«¢ 0G›™ÞÃ7†_üªGÍo ú¸d¯ù? ¯ÓFšØ$¥ödô1æÈbrÓë¤u 6P-êÝø½è­îå…¿ÏiãË^}L€>XlB†Š}Þþ zT,}EªZOEy€ìL}­ÏäÎ/ŸÓÆkÿ?¢ ЋMÈPó¤¿ P}jŸúÑG /e75|{ø{œž»©?ìäËb2Ô¹ö˜ðÕ¨‰MSyïÅÑÇ íýñïpšQÕÚû¢ ЋMÈP9ùèô²)ú%@õ©±ü-Óßï ÀÆõîùIš\°Yøû›fðŽ»÷¢ Ð'‹MÈT±ß[Â_T¯:|=úØŒ´ªµ6{¾6ü½M3«uòç£ Ð'‹MÈTëÔ/…¿¨fíü‚T=qWôÑYSˆ&üM3®wÛÑGè“Å&dª{×ùá/ª_Íï>ú#©{ÕááïjšyÅ’—¥ÔëF O›«ªJÅž¯ !Pýê®:*úôŒ”ò¡¦»%ú=M3¯}ÆW¢ 0›±öÙ‹Â_T¿ŠÅÛ¦jíýÑÇ`4t©±ü­áïhš]åšë¢O0›±òñ»ýut…Ô<òCÑÇ`$´Nøtø»™fW〷E`@,6!soýnø‹êY÷êoG€PÝ«W„¿“iï±W}t€±Ø„Ìu®=&üÅ@õ¬ØõÅ©zjuôG Dùð¾W3Êe¯J©ÛŽ>>À€XlBîÊ2{¿1üAõ¬yä£?ó®j¯K}ÿSø»˜f_÷²¢0@›0:WùÅÕ½ò°èÀü©ªÔ:úãáï`š}Å’í§ÿØ0>,6a”½TìõúðÕ³bñ‹Rõä=ÑŸ€yѹ`iøû—æVçâ}£0`›0&:—+üEAõ­yø{RªÊèÀPõîøQš\°yø»—f_ã¿ê§5a Yl¸èuS±ß[Â_Tß:.‹þ ÍÔo¨»ÿrø;—æVï–S£0›0Fºw_˜&'6 iPM[¸E*ï¿,úc0xÝfjð_ãß·4§ZÇ|"úCb± c¦yÂgÂ_Tß{½~ú¯„Œ“Ö‰Ÿ ÏÒÜ*vÙ&Ukï>BÀXl˜)'M“»nþ¡úÖ:ésÑ€é\´wøû•æ^ç¢}¢0D›0†:Wþ¡z×»áÄè@ßz·œ–&lþn¥¹Õ<òC)•þÀ%Œ3‹MSÍãþ2üEBõ­ØõÅÓ_°«òáS±xÛð÷*Íñ}ôë¯LåäÃÑÇ2‹MSek]*ö~cø …ê[ów¦Tö¢? ³V¦Æ^¯ ŸÒ[¸EêÝó“ècÌ‹Mc½¯Kë=?þÅBµ­sîÎÑ€Ùéµ§ÿmô{”úx½hïèSÌ‹Ms+ ±P›Ø4õnûaôÇ`ÆZÇïÿ¥9çYB½XlB ´Nÿ§ð Õ·b÷—¦jíýÑ€çÔùñâðw'ͽÖwÿ4¥^7úóÈbê ªRóÄφ¿h¨¾5úíé_ëUÝU+ÓäÄ&áïMš[ÍC?¥N#úóÌbê¢ì¥æÊ†¿p¨¾µOÿßÑŸ€õêÝyNš\´eøû’æVcù[SÙx<ú,6¡NºíÔ8ìÝá/ªi›¤îõÇE ž¡\sm*oÿ®¤9ÿfP9ùpô1‚XlBÝ´&Scņ¿€¨ž;¿0•ßý)˜V­½/K_þޤ¹Õ<êÃ)µ‹èc²Ø„:êuRó8íQ15–¿%¥ŽP VÕx,5öySø»‘æVëäÏûCA€Å&ÔVU¥Ö¿þB¢zÖ:úãÓg D§‘šïþN¤94±iêüx×茋M¨¹öÅû¥u 6AQíꜻsôñê¨ì¦æwþ8ü]H³¯X²}êÝñ£èŒ‹M õî»<{¾6üEE5ücB×}ü€ºýÖÒ‰Ÿ‰Ò¬kö©\»:ú#Æb˜V6žHÍ•þ¢þ1¡5×F .KÍ“?þþ£Y¶p‹Ô9o÷”Ê^ô FÅ&ð íKöOë=?þFµ©Øó5©*‰>úÀ˜kŸñÕð÷Íþ§4{k®>:À³Ø~Nùä}©yÜ_†¿È¨>5¿õßRêµ£>0¦¦þØLôûŽf^±äe©{õŠ”Ê2úè#ÎbØ îͧ¦bÏ×…¿Ø¨µOùBô‘ÆPç’åáï9ša;mÚg|%•­§¢ ‹M`ã:­Ô>w—4¹Ë‹â_t4öu.Þ7úÄc¤{ÕáirbÓðwm¼bñ¶©}Ö¿¦rÝCÑGÈŒÅ&0#ek]jÿäiríÃ_|4ÆMlšº7œ}Ü€1нöè4¹`³ø÷m°b÷_Ní³¦²x,ú¸™²Øf§ÓJ«ŽHÅ^¯Ò˜¶ÓóSyïEÑ'ÈX÷ºcÒä‚Íãßkôó-Ø,5÷ÓߡٞŒ>*@æ,6¹){©{ëé©yì_¤u;mÿ‚¤±û¯÷åc·GŸr CÝUGùIÍQkbÓÔ"À±Øòkê«LÃß›Öù/ãP½ßªâ‘èã d¤»j¥¥æ(4±IjìûŸRûŸº×Ÿ`™ Å&0X­ÉÔ½õŒÔ:ã«©8à·Òº /–š{ƒß‘R§}ª€l¾SÓdŸïŠÝ^2ýÎÖ:ñ³©sÞî©{É©\·&ú85a± UÙ|*uo;#µ/Þ/µNùBjöî4ùõÿgú¿âF¿„)š+?:ýÕÔm¥Î‡¦ÎejX]uDê\|êÞvfêÝ{Iê­¹ÞOb)ÚÿŒÕ&/:•˜IEND®B`‚‰PNG  IHDRçF⸠pHYsèèµ{Rk ÅIDATxœíw”ÕÀ‡ib‚±äh¢1Æp4&”Óõä˜@’ƒ$D“H‚Ç’†Ä”£Ñí´¥Ww¥,ìËâR¤-—"%,ei¡W!°Á]ïôòå|£ì ûæ½73÷æþÎùþ}ïÍ7¿wgæÎwï'I@ @ @ òê×:¨szÏW ;_`ùm–)AÊ‘•æ¶) ð½²êç#™Èoã(…ëÕŠÞóز×Ú{’G›ÿ»©lðm¶/? »)˜;K}LÀÅq@›ÿl8]ŽÁ·ÛÚ‚ç&_WÈÉÉP§ÿx—o_ˆòìšõÑ üǶ@-{2\‰2%PËzî€&ŸH-j­Ÿ_dl@ÖWa( u ]"mnŸWÉ£W¾Ü—e5ñí ôÕYW¨ 0œ‹§AzW¸e7}MÞS )E]ê}³s~_÷-ëÄz`ÙÍB•HúýZWcÅ«ý}”‰˜Zˆ©\ÆX7$ÜQ(·hû|IÒæõ-ñãå‚vîp*à„ã€ZÚ-T‰ô5¹#%µ¼×†´?,»™;Œ øâ\:ò [CH[þ…’\Ú}_ú&æpNà2fÍŒðZòÒFI)éöït>D)ì `  à:ã'! ÔoSzå¶ûÜÞù\ƒóÁI`ù7ÓÈX;èÚß. ‚Q•O[ eôÅ#;eL 䟧+u°’wŠ 0wN§):³G¢ß. €cƒ2á+ÄÊjöÙ]¼S#ðˆµ-Äè1”7¾FG û½-pÃ`›`×ëä»`í_øQY厰ŽznÌÝå4R‹‡(ã(u`î©máïA™ð°œæ¯2æÐ<Ö¡enWd±-PF}¿@fÍLˆŽÖÁ¥ •÷J(Lc!¼Œº£V16Žæ+<ðÓn\”À©|ÕâgÒ”qÁ>[QÃQ/ø>;”@ÚÂ!*8¬´ÙOûþkˆ¼V`nŸ QC[ð?¬ãk! ا·‚<¬Cpò\úÒ—! ÷}x‡¯6”‰ßà#{ùŠÀwëðrwtC’õ߆ÖÉ`lZÅ3îë¦ Ý³@Ú¬ŸuðQœåµUöqà jèØص{ÝK©ûTYØ XÎM¡·gÌêI@ýž'ô• WFVXǪ‚=ÆKgÜYe,ÞÃzyÐgøo²ÙçeÔY?åžLyÄç|›|Äϱ¯£j€;óõæ¼/eäŸr_ÊQÿùd:·Oò`ª`ŸÚ Ʀ± ÍéíN^ú¹F»@jñc@µäÜÉ®ëøºF¯SÔÝ/@¯| ÔIß–Û’ûoT }Ù_*xi¥öoU ;5ŒØÎÅ÷ÀÜ7ô¯¸¯p4çýûBȬžTÁ’ZÞIdÿO¢Ißyh{„@8·B÷@ ‘,¦áI û¿û$–ú¼‡)yÀ"öû‡¸'Å< ”×(¿iç@óH(\ðY Š¹c÷²˜GBpR‹*æÖ7¹'Å< „ëÞ‰blÏ=,æ‘X ¢.@cã(î d1H $.aR.a€*æîÙÜÈb‰šðPËx'Å< 4ê~  .pä@óH<4äN Š˜‰–"0ÛÈbªäJ9XÌÂÛ»0Sªp­ƒžr.œª`Ý ï$²‡·rŽS›€*¸ö‰wYŒÃ[EâÞ¹@}ÕëÜ“Èbž¢Ü¶ ;!òN"‹qx+ª¯ìTÁe¼¼“ÈbÞ–õ”vª8ÚEñ(ŸI\ yä½@yøÝÜÉbÞ–6gež »Å‘)IðQ¾v/PE_þwî‰d1 ï»sì›TµÑ}ŒuƒòŽd¼ÉbÞ7˜š÷[ ‹!»]„y'“Å0< D¹2QÆ?Ä=™,†á}“Íœæ¤[;áÉ;™,†‘Ô.­ö™í@|ÝÂ;™,†‘”@æ¶É@¬àLÃHJ }Ñöt3î e1‹¤R&> ”QÆ?Ì=¡,f‘\³•¼V¤hóûrO(‹Y$Ý­‡r‹ocËî e1‹äÛ=í(ªˆub}HßH›Z¤·Ìeqˆòf ˆßÝhDHþ „›ZRn:§/û÷¤²EjMw /óÁ$¼“Êb) „½¨¨‚mx'•Å(RóQ»æðN,‹I¤$¶¦ŒöÖ/¹'–Å$R—Ñ8òû@ñf^".öÏ8X T±OWsO,‹I¤,©F³×b ç·áž\ƒHY uÚ@µ´;÷ä²DÊQoƒilÆ=¹,j‘Ý”qݶ8UcØúêÌ`¢¾ØÐ>³ÿ ɤØ»?chìí(õŸÈ£±¾ 8pk²Øȃnå~’‘À+6çÃ>­æž p><çK7€´ÒÞ~(£–õä~âÈkåný§/ý ˜»ÊÀ®;XUZáZ,Ê`mî'33üû?—_ág&îÚûóP«'¹ŸàLC~hå?w¬ãkÁÑ? 4‡Æ†á „ŠGVepo£ç¾å,¹®Øi d¬”Ñ—ôã.ó¹-Ýb8W–š™`Ÿ?à8¼Óìc<>RÆ:²’¿™‰ÃQê€"úâ?+<ø6ÿ”F_k lË]ÖXnl¬Uü*X0°é e´ÙOó—$3šå1jɃˆòšyçBxK uÊ÷ ª«}}H›ók Î@p wQØu'ü¨‚O‚ „ïT¨£Í–»(ì:aîœd÷àN4xø!†}þPÆ:±ž»(ìz¹«Ý±ÿ³#<°ƒ2iǽYå- »&ä‘÷UÌšá „O:Ô¡Øg^_ùO Š¾òÕð’‡Üá–P¿™|;wiØaŸ­ª¨Óž@Ø9‡:FU>wiXßñ’ïåÏæ«@úŠW€:ŽzÁ-yËÃðw¬ ¨‚5D^ŽÁW°.% x¹9 :´·~”1w–†/†]w¢@¢)ú C~7Ù—§—Á5.GCpä󠌺?|yÜBz¿í†ûŸ¡íù¤?QW•„Yx/lëNhRÇËb`¹e®œ‚¨`ŸÝrA»ÀåQÆ<@zƒÒdŠÈ‚È­RQ©?ên݈<ÙMA_ô‡Àk—ýDû _ðß9,ŒwrÝâ.¿Fb­¼—;ÂE œØLæ8ˆú6xá\<í¾^‡Ü™ÚŸgìƒîJOÕ¢ˆ¾øÏ4Ò¼‘Æ6Á:¾ôU¯»Sú¸ºãª?òZƒ<ô.P‹má‹`n/§þDCIú¡"0ð‰ƒòn®)ƒõß„7•Hü$=P%†Y=1­„\î2®#-”±_¦½bCЀu`qj·*A D}+<Á£OQWšájKm̽sR>¿ äŽB‡–ñΑàzXFR‡\RÞüº¸"J¢Ý7< $—vߤ@¸¸O@oÒ4ÝõrÚ’þïJjYÏõaÔÀ`c\Ô™=Ò>¯úêì¹’VñLIÐ}ôe™¼s&øsûT®,[‹HÆœ>]ˆå4ûÜîËÇ àV&Z²ìéªRÐ@©¿GB”qÕ…!Î7_þs#c( ¼ñU_Î¥ööóÇ\y\*zÿ&”Që…ÞÉãÆØ¢ù´GV+G«¾Ý +Ñ´'V…"QVXG×ðÎeì0üÚ½?ç&Ð6-’®r¤ yòwªÃHÖÁófןf›³2Ò?oùmÀXWP!5†Vöä6°­´DîkSõ!=‚ư/–Û"ýó5ù»ŠQ=¥Ÿä…KÅÝîPgö˜¡Œ¸–åßl%v³ÔÁöNÃÑ Å’ 6â^G)ꪪsû06΀æžä@ @ @ò“ÿA嫟œ(]=IEND®B`‚‰PNG  IHDR ì˜Ä. pHYsèèµ{Rk IDATxœìØ1 0 À°ò'Ý)(zÌF;³À÷æ:¸gF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £0 €…€Q…€QÄ(ŒBÀ(ŒB F!`F!`1 £0 £ˆQ…€Q…@ŒBÀ(ŒBÀ(bF!`F!£0 £€ÇÞ}GIv–‡¾.L`À„kÀ`cƒqlŒ/àˆã±ÁÇs 8\ËøñÝ%ÍŒò(ŒÐ( BåJˆ‘PF9g „ÒHH“ö®¼÷wW—8€zzRwu¿UµŸg­ß_^¶{J]ß×ïÛ]U`QŒ³(, ‹BÀ¢gQX…€E!0΢°(, ‹B`œE!`QX…À8‹BÀ¢°(, €q…€E!`QXã, ‹Â‰Šú3©óÝo§ÖÕ‡¤Æ™ŸêËß—²%¯IÙœíR6V“f´|¯—¥â‘k£ŸÀf´ÎÝ=|v´ ït–¼&Õxjœù™ÔúΡ©ó३¨¯‰>NNµ…E‘º«ïHíëŽLÓ?•òßÿͫʖ/yu*ž¸5úYlIY¦æÙŸ Ÿ!$M¿|éÛz;¡öõG§îê;SÕUoQØÜ:wžÝÛ gû¼.üR/ß÷§Rñý{£ŸÀ¶, Ïúlø,!©Ï-zej|íÏSû¦¯ô^uZ5•XÙS©}íòT?úÿMÙÜã¿é¤«¾ô­©\ûPôÓØVE75OýDøL!i†š÷¼T_ñ‘Þ+Q‹üû© FwQØ®§öÍǧúŠß¶ÔÀV?ä©Üðxô³˜ª¢“š'ýEøl!i–†Çþ^jßòµ”:Í4ªFnQØ}ò®Ô¼à‹)[ôŠøo"i3Õ{O*󧢟2@?þ²ð¤…Ï’f©=ví½¥]÷ñ[Ò¨™EaçÁËRý«àÓ‰55Žú@*›ë¢Ÿ6@¿t[©qÜGÃg I³[}ùûzŸ…1þ¹£`¸…Ývjß°"åÿ\ø7†´µ5Žý½ÞKã€Ói¤ÆŠ„Ï’f¿üÐwõÞ/u;i˜ 碰è¦ö­'§üÀ·„#HÛRãø?é÷2€Êk×Sãèß Ÿ=$Å”/ý™Ô¾ñ+½÷/FC·(lß~ZÊz{øxi[kžþ·½%70ÚÊÖ†T?â}á3ˆ¤¸òC!uî>7 ›¡YvWßñì'Àli[kžý)•£ñ~À–•µ©¾ìÝ᳈¤ØêÇ|(uŸ¸- ‹_ù÷Sã¬Ï¦lîáÿq¥©Ôúæÿ‰~Êõ¥|ÿ7‡Ï$’‚›÷¼Ô<ïßRÑ\ŸÝ@/ Ç?5&Ûû'ãÿƒJS¬uþ¿G?€@ÅÓ÷§|ïׄÏ&’ %¯I;ÎLƒl …źGRýø?Šÿ(M£Ö…_Œ~* xüæ”ï¹køŒ"i0jœúשȞJƒhà…ÛOOÙ^/ ÿ&M§ÖyÿýTHñðÕ)[ø¢ðYEÒ€´x·ü°“ÁY¶òÔüÆ¿Äÿ‡’¦Yë¼ÏG?›€Ô½ûë)›»cøÌ"i@š³]o–:­4(bQØ}ü–”ø–øÿ@Ò4k»{Jeý”Tç¦c{ËèÙEÒà”öK©X³* ‚ðEaû–ýùµF¢æYŸ±$¶¨ýCÃçIÖ^/Kû¾YáEaÑIÍs?ÿBêC­sþÑ’Øj­‹þ+|Ž‘4`ÍÝ1µ.߯‚‹Âæ†TÿêÄÿúPóÌÿ•RY„<•€á5þÖEÑóŒ¤Á«qúß…½oá¬/ ‹u¤üÐw…?èR?òrc`ÊŠnjœø§ás¤Á«~ì異¹~´…ÝÕw¤lŸ×…?ØR?jžñiILO»žêË-|¾‘4xåË~1V械ûÄm)[òêðYêGÍÓÿÖ’è‹2*Õ|Køœ#©6påKߖеß­Ea÷{×ö>½%úÁ•úQóä÷^"Ð/ÅÓ÷§|ñ+ÃçIµÁk¿7¦âéFcQØ}èÊ”-Ü%þA•úPó”ÿiÏîªËS6çð¹GRm0—…kîEañøM)Ûó¥ñ¦Ô‡+>’R7æS‡€jèÜvJÊæl>ÿHª \ù?Šõ 碰ûä])[¼[øƒ(õ£úò÷¦ÔÊfêéðCíËöŸ$Õ²üw¦"z¸…ÅšU)[òšðOêGõeïJecíLCIª \ùž»¦â™c…Ý'ïJÙÂ…?Òtk}klZO"€Yÿ$do&ilãêG}0¥¢;ˋ¢›òåï ÿÇKÓ­uÎ?NùÉ¥xôú”-xaøL%©6pµ¯ùòì. [Wþ–¦[ã¸?H©èLùÉ©sûi½÷[ž­$Õï%Èë™Ea±fUÊîþ–¦Sý°÷¤Ôʦô¤ão¥=_Iª \“>>;‹ÂúWÿ ü+M§|¿7¦rÃãSz ”²Hÿ4|Î’T¸:÷}sf…ãÿ¢ÿ‘ÒtÊ÷xI*ž¸u›Ÿ(«]ï½j*zÞ’T¨ê¿#¥n{†…ÝVÊ—þLø?Ršr󞟺߽x ·.À`+׬JùâÝâç.Iij_wÄÌ, [W. ÿÇISnÎv©sÓW§rß …î+S6w‡øùKR”ò½_“Šæúþ. Çÿf‹^þ“¦Zû’…Ó¹o†Bû²%áó—¤Ú@Õúö¢þ. [/ ÿGIS­yÆßMçže™š_ûóð9LRm`ʽ<uýYõ5)Ûó¥áÿ(i*5Žþ`ïý5ª¢lmè}ˆAô<&©60µ.Û»?‹Âæ·æ„ÿc¤©T?ä©l¬íÇ= 0TŠÕ·§|á.ás™¤Ú@4þaG©•MsQØÊR¶×ËÂÿ1ÒTÞ¬³\ûP¯Y€áÒ¹õ¤ðÙLRm`j_»|z‹ÂÖÕ‡„ÿ#¤mmü·fÅc7öó~J­ó>>£Iª Dõƒ6¥¢˜â¢°è¦|ÿÿ'ü!mSswHݻΞë`Ô8êñ³š¤4uîûæÔ…;Î ÿâ¥m­ýCfâjZåúÇzoÏ=¯Iª…×8á§¶(¬åwÿxi[jžþ©™¸S†^ñðU)›÷üð¹MR-¶¹;¦býãÛ¶(,Ö<Ô{ gø/me¬;©ƒ IDATõ#Þ—R§9“÷*ÀPk_y`øì&©^늶mQØüÖœð/ZÚÚò}_ŸÊ OÌä} 0š'},|†“T ­¾ì]Û°(,Š”íóúð/ZÚª¼0Þ0ÃW)Àh(›ëRý\*U½î·mÝ¢°³êòð/VÚªæl—:·œ8w)ÀÈ(½ÞûJ¯}É­[6¿ñ/á_¬´5µ.ú¯Ù¸CFNûÊÂg:Iµ°êËÞ½‹Â¢›²½2ü‹•¶Tã+¿Óû~` Ê25NøãðÙNR-¬âéû7¿(ì>teø)m©úAoッSWæßOù>¯ Ÿñ$ÕBj_}ðæ…Í‹þ;ü‹”6W¾×KSñý{góîYÝU—¥lî᳞¤Ú¬7þWÅ›]æË~1ü‹”6ÙÜR÷žsgóÎyí‹ÄÏ{’Òl—ï¹kJÝÎä‹ÂbÃê”ÍÙ>ü‹”6Õø›íÐge‘+>>óIªÍz݇¯ž|Qؾùøð/NÚTÍÓþ&⺨„rýc)_¼[øì'©6«µ/Û{òEaóìÿâ¤Éªö‹)µëw%@etï=ß+ ¥±jÕüÚŸO¾(Ìùùð/NšØøo´ÊuDÜ‘•Óºð‹ás ¤Ú¬•ï÷†…Ec­O9Òà5gûÔ½ÿ¢¨û zºíT?üWãçAIi¶*6<ñÜEaç¾o†QÒÄÚϼ*©xú¾”/Ü%|&”T›•Æßvà9‹ÂÖeû„QÒ×8æC)ÝÈ» ²:×>JªÍJí+|qê'ÿ(éÿ–ïóºTfOFÞ‰•×üÚÿŸ%Õf¼ñ8~΢Йh`š÷¼Ô]uyä]@J½?àÈ—¼:~N””f²ÆÑ¿õÃç}-”Íß)ü‹’Æk_±èEÀtï:;|N”T›Ñò}^ûÃç|­xæÁð/H¯qü¥T–¡— ÏÕ<ë3áó¢¤ÚÌ5gû4þ‡„ãj.Žÿ‚Tùêüt*k£ï?&je©¾ô­ás£¤ÚŒU®{¤÷t¯µo8&ü‹QÅ›¿s*½!úê`ŠG®ë½§|øü()ÍDÅ#×öžëµÖÊyá_Œª]çú#£ï<¶ õ­±ðùQRmF?ÒqµÆYŸ ÿbTÝš§üUô]ÀÖ(:©~ø¯†Ï‘’j}¯sãWzOóZãÄÿþŨšÕù¹”ÚyôUÀV*ž¾/å w Ÿ'%ÕúZû;‡öžãµúQ¿þŨz_,Å“wFßql£ñ…BôL)©Ö×Ú—-é=¿kù!ï ÿbT½:·œ}·0e™+>>WJªõ­ÖEÿÝ{zײ}ßþŨZ5Oû›èk €i(׬Jù/Ÿ/%ÕúRë‚/ôžÛµlñ«Â¿U§|ÿ7§²¹.úN`šÚ×>cJªõ¥ÖÿÑ{^ײ=_þŨ"ÍÝ1_}—Ð^‚,¥Q©uá{OëZ¶àEá_ŒªQû’…Ñ×}T®yЧ KcÃ_ëÂ/õžÓµlþNá_ŒF¿Æ‘¿žRѾÃè³öU…Ïœ’jÓªõÍÿÓ{>ײyÏÿb4Úå{îÚû-#¨,R㨄Ϟ’jS΢P³Vç–¢¯-fPñÔ=)[ð‚ðùSRmJYjVjžöÉèû €Yо|ßðTRmJYjÆË÷S*›ë¢ï*fë%ÈG¼?|•TÛæ, 5³ÍÝ1uº2úš`OÞ•²ù;ÇϤ’Ò¶dQ¨­}ñ‚èû €íK…Ϥ’jÛ”E¡f¬ñ?5OE7ún BÑIõ/ÿrøl*©¶ÕYjFÊ÷Ü5•kŒ¾–T<~sï-©¢gTIµ­Ê¢P3Rçæã£ï#@ë‚/„Ϩ’j[•E¡ú^ó¤EßC ŠV–òýÞ>«Jªm1‹Bõµ|Ñ+R™­Ž¾† Ý{Î ŸW%Õ¶˜E¡úZçöS£ïPóÄ? ŸY%Õ6›E¡ú–—°)åúÇz|=»Jªm2‹Bõï%Çžˆ¾w`í«–†Ï¯’j›Ì¢P}©sÛ)Ñ÷ ƒ®,Rýð_ Ÿa%Õ&Í¢PÓ®qÂG_5 ‰âñ›S6wÇðYVRm£, 5­¼ä€mÕ:÷_ÃçYIµ²(Ô´êÜvrôýÀ)›ëS¾ÏëÂgZIµçdQ¨)ç%ÇLUçŽÓÃçZIµçdQ¨)•/z¹—0-ãÿ(|¾•Tûa…šR[¿}Ÿ0äʵ¥lÁ Ãg\Iµ^…ÚæÆãýоdaøœ+©ÖË¢PÛ”—ÐWfªø–ðyWRÍ¢PÛVç–£¯FL÷Î3Ãç]I5‹Bm}ãÿ0úî`D5¾òÛás¯TõZ…Úšò=^’ʵGߌ¨âÉ;S6ïyáó¯”U8‹BmUík–Eߌ¸Öùÿ;|þ•² gQ¨-V_þk)•Eô}Àˆ+›ëS¾÷kÂç`)«h…Ú|󞟊ÕwDßTDçÆñ³°4VÍ, µÙÚ/ˆ¾#¨’²ì½²-z–² fQ¨MV?ègRê4£¯*¦xôú”ÍÙ>|.–²ŠeQ¨É›³}ê>tEôÝ@E5Ïøtül,U+‹BMZëëÿ}'Pae¶:å{î>KY…²(ÔFåK^•ÊÆšè;€Šk_y@øŒ,eÊ¢PÕ¹ù¸è»Rê¶S}éÛÂçd)«H…zN#£÷ S0ºwž>+KYE²(Ôš»c*ž¸5ú€çhó¡ø™Yý, µÑ7 ’â±S6gûð¹YÊF<‹BõÊ÷}}*[¢Ï~˜Tó”¿ Ÿ¥lij(T¯îgDŸù°Iåºï¥lÁ Âçg)á, •Çþ^ôy[Ôºð‹á3´”p…UoÞóSñÔÝÑg=lQÙX“òE¯ˆŸ¥¥±ÑÌ¢°âµ.øès¶ZûªƒÂgi)Ñ, +\¾x·T6ÖFŸñ°õºíT?ð-á3µ”`…®sÃÑÑÇ;l³Îí§…ÏÔR6‚YV´ú²w§TÑg;LIãÈ_Ÿ­¥lIJ(¬bs¶KÝU—EŸé0eÅ÷®éÍ·á3¶46:YV°æ©Ÿˆ>Ï`Úš'<|Æ–²Ê¢°j-|Q*×}/ú,€i+ž¾?eóž?kKc£‘EaÅj­œ}Ž@ß4Ïþ\ø¬-e#’Ea…Êï–Êæºè3ú¦\ÿhʼ |斲Ȣ°Bu®=<úü€¾kÿ¿Ãgn), +R}éÛR*:Ñg7ô]™?•ò=^>{KÙgQX‘ºw}nÀŒi}kNøì-eCžEajõèófTÙX›òE/ŸÁ¥lˆ³(õæl—Ї¯Š>¯`Ƶ/[?‡KcÛEáˆ×<ùãÑç4ÌŽv=åû¼6|—²!Í¢p”›÷¼T<}_ô1 ³¦ýCâçqil8³(ášg.ú|€ÙÕm¥|ÿ7‡ÏäR6„YŽjówNåÚ‡£g˜uމŸË¥±áË¢pDkÿïÑç2Ä(º©~ÐÛÃgs)², G°|á.©ÌVG˦sÛÉáó¹” Y…#XkåÜèób•eª/{WøŒ.eC”EሕïõÒT6ÖDÇ®sÇéásº” Q…#Vû²½£Ïaœ¿*<ôçÃgu)’, G¨|É«SjçÑÇ0 ïU(Õ¶:‹Âª}åÑç/ –²HõC~.|f—²!È¢pDÊ—¼Ê_À$:7>·KÙdQ8"µ/ß7úÜ€ÁTtS}é[Ãgw)ð, G |Ñ+RÙÚ}ìÀÀêÜpLøü.ežEáÔ¾lIôy ƒ­ÛNùþo Ÿá¥l€³(òòE/Oes}ôq ¯sÝòð9^Ê8‹Â!¯}é¢ès†ç¯ ÷{cø,/ešEá—ïõ²T6×E³04Ú×, Ÿç¥l@³(âZ+çEŸ¯0\:Í”ïóÚð™^Ê0‹ÂamÁ S™=}¼ÀÐi_µ4~®—Æ/‹Â!­uîîÑç* §N#å{ÿdøl/e–Eá06ïy©\³*úX€¡Õ¾|ßøù^¬, ‡°æi}žÀP+›ëS¾çO„ÏøR6@Y[s¶KÅ·EŸ§0ôÆ—"ás¾468YYãÿ0ú€‘Pnx"eówŸõ¥l@²(²º]}ŽÀÈhžù÷á³¾” H…CT}ù{£ÏO)ÅSw§lÎöá3¿” @…CTç¶“£ÏO¨¦vžÊ §â©{RñÈu©{ÿE©sû©©sÃÑ©}å©}ñ‚Ô:ÿßSó¬Ï>·3þ.5Oú‹;õ½ÿyëÜÝSëÂ/õþ÷Û—-Iíïš:×-ïýßî>xi*Vß‘ÊìÉ”Ê2ú€‘Ö8áOÂg~)€, ‡¤|ߟJ©èDŸ0Z:ÍT®YÕ{kñå\ûªƒz‹»æiŸLc>”ê¿#å{îþs@6w‡”/yUªòs©qôSó”ÿÙû!®sÝ©ûÀ·R¹æÁ”Šnô£ C«xøªøû^‹Ï¢pHj_¾oô¹ éÛ꽤¨{÷7RûÊRëœJIù~oì-à¢ïø¾5ïy©~ÀO§ÆW~'µÎùÇÔþÎ!©»ê²T6×Eÿ€¡Ð8ò×ãïsi,6‹Â!(_¸K*k¢ÏLlFïeÁë콤w|a–ïÿæ”ÍÝ1ü.mÎv½Ç¡yâŸõ^âܽó¬Þ_QÏÕ½ëœø{[‹Í¢pv€)ëϤîªËSûª¥½— ×{OÊæï~gSã/en÷ÑÞ{#Ž?–©ÛŽþÏ ±Ê2ÕþÙð;Zʳ(ôælŸŠ§ï‹>. LÙÚÐ{¾ÖÊy©qìï¦|É«ãïçlü½ÇýÁ³‹Ã‡®ôÞÈTRç†cÂïd) Ì¢pÀÿä%¨’2[Ý{éÏø‡Š4Žxò3JP _Ôû‹ÃñOaÿÄg¨„n;åû¾>þ–Æb²(ðºß½$ú˜€Uñw¯4“Eá7þÞ0jÊæúÔ½ãŒÔ<óïS¾ÏkÃï[m{ãŽÒºè¿S±úŽèo'軲¹®÷–Ñ÷­”dQ8Àµ¯Y}>@_OÝÚWìŸÇ|ÈK‰G¬ú¡¿ÐûË‹ríÃÑßfÐ7­ ¿~ÇJY@…Z¾Ç‹{qC©]OÝ{ÏO­¯ÿ½¿>‹¾W5 ÍÙ>5Žú@ê\w„Ÿazã¿Ëæî¿Jc³›Eá€Ö:矢ÏEØ6ízêÜvrjœø§)[ðÂð»T±¿ðÿY¦xâ¶èïJ˜²æI ¿S¥l–³(Ðü` ÀP(º©{ÿE©yÚ'S¾ÇKÂïO ^õÃÞÓûääñE2 “îCW„ߣR6ËY`£?}À¦•Eê>øíÔ<ûs)_ôòð{SÃQ¾x·Ôúæ¦rÃãÑßÁ°ÕÆá}‡JÙ,fQ8€un;%ú,€^ŸZçý›O*Öôš¿sjžý©|æèoiØ¢ÎMÇÆßÒØìeQ8`å{¿&¥n;ú,€gu½_`Õx_ø©üð“ã>Ú[@ÀÀê¶R¾äÕñ÷¦46;YX­oEƒŠÕw<û‰Å{î~7jÄ›³]jÿ‡©xøêèo{˜Tkå¼øûR›, ©9Û¥âéû£Ï@ªªÛêýõ`cŇ{wRø½¨Ê5þ½W<~sô3ž£ÌV§lþNá÷¤”ÍB…Tã˜EŸTP¹æÁÞã6}JÙÜRóŒO§ríÃÑO ø¡æiŸŒ¿#¥±™Ï¢p€êÜúµè³€ )ž¸íÙzçî~J5ïù©yÖg{ÅÑŠGoˆ¿¥±™Ï¢p@Ê÷zYï ã`¦uº¢÷!^^¬a(ßó'RûÊR*:ÑO*·»)«@…RëÜ>óqÝU—?» €{OÚÖêKß–º÷3úi@…un=)ü>”²΢p@òÆÝ̈²HÝ»ÎIõ/ÿrø]'õ£ñe·÷/ DÑIù¾¯¿ ¥l³(€ê‡ÿJôqÀ¨)‹Ô¹å„T?ð-á÷œÔïò=wMí«–z92³®}é¢ð{PÊf0‹Â¨síáÑg#düå™õeï¿ß¤™®¾ì]^•À¬*ó§R¶àáw ”ÍP…ÑÍß9•õg¢Ï:F@ñØ©±â#ñw›4›Í{^j_¼ ¥n;ú)@E4Ïøtüý'ÍL…Á5Oú‹è3€!W®}(5ÏúlÊæî~¯IQÕyg*½!úé@\~ïIÙ eQÜøÌÀT”õ§SëÂ/õþ:=ú>“¢¹;öž©ÛŠ~z0âꇽ'þÞ“ÆúŸEa`ùâWz™ Û®è¦öÕ÷>Ð!ú.“±ñá­øþ½ÑÏTFXçº#Âï;)›, #üsw>ÛÂ÷!¬þ+áw˜4èå{¼8un>.ú) Àˆ*[R¾ÇKÂï;)ës…\}¶0$ÊÆÚÞ/˜¼¡´m5Oûdo˜€~kóOá÷œ”õ9‹Â ê½=úL`HŒ¿Ÿm¾ÏëÂï.iX«/}[*»)ú© Àˆ)¿%üŽ“²>gQTûÒEÑg®xêžÔXñáð;K‰æïœ:×-~Z0bêËßÇIcýË¢0¢9Û¥r̓Ñçƒüa%ßÞ3eówŠ¿³¤«yÖg|*2}Ó¹éØð»MÊú˜Ea@õå¿}–0 Æ‘Ô8êáw•4ÊÕx_*×?ýt`´ë)ßëeáw›”õ)‹Â€ÚW}”0 ¿‘ÿ¤Öè{JªBùÞ?™Š‡¯Ž~Ú0Zç}>ü^“²>eQ8ÛÍÙ>•ë‰>Ç eödjœð'ñw”Tµæï”:7}0äŠ'ïê½ÅXø½&M?‹ÂY®qäoDŸa Ú'/yUøý$U¹Ö_H©,¢†Xãè†ßgRÖ‡, g¹öw>¿­¬÷¡ Ñ÷’¤gkžô±”:Íè“€!Õ¹õ¤ð»LÊúEál6w‡Tnx"úü Xñý{SýwÆßK’žS}ù{S™?}D0Œº-¯Q…, g±Æ1Š>ºÖ½ûë)ßó'Âï$I“W?à§Sñô}ÑGC¨uá—Âï1)›f…³XçºåÑçQŠnj}ó?½Ñµ4å{¿&Þ}j0$ÊæºÔ}`ej}ýŸÃï0)›f…³ùiÇ^v PIã/el¬øpü]$i«Ë÷xqê>øíèã€AÓm¥â‘k{Ÿ?Ð<ýoSý ·÷æýè{KÊú”Eá,åÓŽªiü¯’òýß~IšBówJݻΎ>FT®4un;%µÎÝ=5Žxʼ þ~’Æf.‹ÂYª}ÅþÑ糬sÃѽECô$iÍ{~êÞqFôqÀ,(×?–ºwž•Zýwj¬øˆ÷•Vªb…³TùÌw£Ï<fKY¦ÖÊyáw¤>5w‡Ô¹qEôÉ@•­ ©»êòÔ¾jijžöÉT?øñ÷4ŸEá,T_öîè3€ÙRtRó¬Ï„ß=’úÜœíRûꃣO¦¢è¤bõí©sÓ±½—×{÷”Æ&Ï¢pj_¼ úX`–>ñ·–H#¾,¼fYôQÀæ”e*žº'un>þÙ¥àò÷¦lþÎñwˆ46YÎB㿹`ôßÓfü/È£ïI3ÜœíRçÚã~ l¬IÝû/ê½íK㸦|ñ+ãï ilx³(œáêütô¹ À ÿ…P¾ïO…ß9’f©9Û§ÎÍÇE=•3éû ÎÙ.þ^ÆF'‹Â™~€Ïÿ÷è³€Ô}ðÛ>OªêœÜvrô0Úï+øØ©sí—SóŒO§ú!?×;{ÃÏiij(œáºß½8úx`&—„ w ¿k$eYÐ7åúGS÷®sRëÂ/¥ÆïOÙ‚ÆŸóÒXõ²(œÁò=wM©ÛŽ>o˜Ýû.LÙ‚„ß5’‚›÷üÔ½ï‚è# `¨”ÙêÔ½û멵rnjû»)_ôòøó\RÏ¢pkžô±èó€0¾°$”ôü0_}4 ¦Væ}¥±áÉ¢pëÜtlô‘ @Ÿuï=?eów¿c$ Vù¢W¤â©»£(€XE·÷!oã³pëÜÝŸ} ±]ƒ”†)‹Â™jÎö©ÜðDô1 @uï9Ï’PÒ&Ë÷}}*×}/ú¨˜ý÷\9/5V|Øû JcßEá U_þkÑg6}Ô½ç\KBI[¬~È;SÙX}dô]ÙXûìKˆ/[’Ç}4å‹w ?s%ÕúžEá Õ¾daô9@ŸtXée3’¶ºÆÑ¿•R§}tL];v)xÅþ©yò_¦|ÿ7…Ÿ­’j³’Eá U~Kê\djžõ™T?ôR6wÇðsTR-$‹Âz3ëTÑÇ=ÓT®}8åû¼.ü^‘4œµ/Ù#úØüû Ž¿„xÏŸ?/%Õ&‹Â¨yÊ_EŸýLS™?Õú™ð;EÒ7g»Ô¹åÄèã ¨°²¹îÙ—_µ45Oú‹”/yUüÙ() r…3PçÆÑ÷ÓÑ®§úï ¿O$@ówNÅ÷¾}ªUÐm÷Þ«·<í“©~ð;z¿°?%¥aÊ¢p©Cªè¦Æ ~—Hò%¯öó!Ðÿ÷\}{êÜtlj»{jñþ”Íß)ü¼“Tú, ûÜøom^ãoâ}—H½êËÞ•R+‹>â€!U®}(un?5µ.øBjõ›)_¸Kø¹&©6’Yöû=ïóÑwSÔþΡá÷ˆ¤Ñ­yò_FsÀP¾¯à«ÃÏ/IµÊdQØçº÷œ}¯0ÅÃW%w¡¤™®}åÑÇ0hï+8þâë–ÿØû n~VIªU6‹Â~6ïù©lmˆ¾jØFå†ÇS¾ÏkãïI£ßÜS÷»—D{@ò™&¼¯àÎñç’$ý(‹Â>Ö8êÑ÷ÛªÛJõåï ¿C$U§|ñn©\÷½èÓ˜aãbÔ¹ý´Ôºð‹©qôS¾Ç‹ÃÏIʶEa?Ì•ó¢ï"¶Qó¬Ï†ß’ªWýð_I©ÓŒ>>)›ëô¾‚§}2åû¿)üœ‘¤l Yö±îw/޾ŸØëŽ¿;$U·æÙŸ‹>©è4SñðÕ©}õÁ©yê_§úÒ·¥lÎvágŠ$õ#‹Â~5§”Úõè+ €­TÕ8ê7£¯0¶V§‘ꇼ3üî¤|á.©xêžèSørý£©{×9½·•j÷Ñ”/zyø9!IÙ,fQدÒû Ö7þ%üÞ¤ÿ[ý°÷x¿Bà}%©¶Q…}Êû ‡îýßô>B’®ÖyŸ>a´T¬¾=un:¶÷Afõƒß‘²9Û‡?÷%)°, û‘÷' eý™”ïûúø{C’&6g»Ô½óÌècFê%ÄÛNI­swO#ÞŸ²ù;Ç?Ï%ilð³(ìC##ú`+4¿öçáw†$mª|¯—¥ríÃÑG% çû ÞyVj]ô_©±âÃ)ßs×ðç³$eCšEa?Ä‹þ+ún` :7®¿/$i«~]ÑG& ¬²µá9ï+Ø{ ñåxî IÚæŸ1;è#fL¹áñg—‚+ç¥ÆqMù¢W„?ï$I5‹ÂéÖ<ë³Ñw,›Òi¦úÒ·…ß’4•ZüGô) }á}%©64YN³ñ7Ç`0µ/^~OHÒ”›³}ê>xiôQ Ûþ¾‚ÞÚ×–šgü]ï¯c³¹;Ä?Ÿ$Iik²(œfÅÓ÷E_ÅLbü|Îæï~OHÒtÊ÷{cﯱ`Py_AIªT…Ó(_¼[ô½ À&4¾úûá÷„$õ£Ö¹ÿ}¤BOÙX“º÷_ô£÷\üÊðç‡$©Ö×, §Qã„?޾«˜Äø_6Dß’Ô×— ¯º<úh¥Šï+øà¥©}ù¾©yÒ_¤|¿7Ä?$Ii¦³(œFíoï}0QY¤ú¡¿~GHR?«/}kJízô ˨*º©X}{êÜtlj»û³/!6JRªb…Ó¨{–»ã» IDATÿ7£¯t&r¢ïIš‰Z|!úˆeÔÞWpü%Ä+>œ²/ ÿþ–$Õ"‹Â©6g»TÖŸŽ¾ãøqÝvÊ÷sü!I3õ䇮ˆ>i2ecmï¥ëíË–üà}w‹ÿ^–$¥AÍ¢pŠÕ|KôÀí«¿$i&«ü³½_ŠÀ¤ZÙ³KÁ«–¦æiŸLõƒßÑû‡èï[IRmh²(œbÍS?ýc?®•¥|É«ÃïIšéÚ—.Š>qÞWP’4Öÿ, §ØøoéíKö¿$iVZð‚T<}ô±Kôû .|Qü÷¢$)Z…SÌûÃ Ž²¹.å{þDøÝ I³Uã+¿}ô2ƒÊü©Ô½çÜÔ¾x~j|õ÷S¾ø•áßs’¤Z%²(œJswL©GÿüÀ´¯Ø/þn¤Y®sˉÑÇ/ýÐΟ}_Á+HÍ“ÿÒ‡rI’Rd…S¨~È;£œàÇ?éxߟ ¿$i¶Ë—¼*•õg¢Oa¦û¾‚ów ÿ^’$)ûA…S¨yê_GÿˆÀtn>.ü^¤¨šg.úf3Ê5«Rç¶“SëüO£>à}%Iiг(œBí+öþ™€¨/{wø½ IaÍÙ>ß»&ú(æï—Û{ ñUKSó¤¿èýÅgø÷‡$IcÛ–Eáê>°2úçÆ_u|ß…áw‚$EWÿò/¥TÑGrµtÛϾ„øºå©yÚ'Sýàw¤lÎváß ’$eÓÌ¢p  ñ+>~'HÒ Ô¹áèè#yty_AIÒXu²(ÜÆòýÞý£ ãsÛ·úë IúAùâÝRÙX}4„rý£©{×9©µr^j÷Ñ”ïõÒðÿ¾’$e³”Eá6Ö8á£v ¥ÞKEß ’4Hµ¾ñ/ÑGó¼¯à«Ãÿ;J’”fQ¸­ØÊ¹Ñ?ÏT^¹áñ”Í{^ø IÕÜRñøÍÑGôàê4RñðÕ©}ÕA©yê'R}é[ýeº$IcÏÍ¢pëÞqFô8•×¾tqø} IƒXãèFу¡,R±úŽÔ¹qEjó©~Ø{ü‚I’¤±-gQ¸ß¿7úÇ€j+ËT?ð-á÷$ jUüÅöÆï+ø²ðÿ’$eC˜Eá¶4çÞ§ž§ûÀ·âïIàòýßœR§™FUÙ\ÿ£÷<í“)ßÿMá¹$IÙˆdQ¸ Õ—½+úç"€Êkžüñðû@’½öû¥‘PtR±úöÔ¹éØÔ<볩~ð;R6gûðÇW’¤lD³(܆Æßô€8eþTÊæï~HÒ —ïù½3s_Bܹí”Ô:w÷Ô8âý½WôD?–’$eÊ¢pj_º(úg'€Jk_¾oø] IÃRëœJCõ¾‚‹^þ˜I’TõZ…[_÷®³£ž¨ö‡˜,}[ø] ICÓÜ{Ÿü;ÊÆÚÞ{ÌŽÿâ½qŸ¤|Ÿ×Æ?>’$)MÌ¢p*Ÿy úg,€Êê>øíð{@’†­Æñ4û¶÷”$) k…[Û‚¦T³ÿƒ=ãŸl~HÒÖ]uÙÌÎe™Š§îN›¾šZßø—T?üW½—¬$IcÛEáVV_öî™û €Íkç)_¸Kø] IÃX}ù{{ ½~(×?–ºwž•Zýwj¬øHÊ÷Ü5üß'I’j}Ë¢p+kžü—}ùá €m×¹õ¤ð{@’†¹Î§oóÙ[¶6¤îªËSûª¥½¿êxþ-’$©6cYníµrÞ Œ¾lñ7¾¾$i˜«/}kJÝöV½¯`ëÜÝSý°÷x_AI’ƪ—EáVÖ¹å„Ù›ˆø¡²¹.eów¿$iØë\{øÎÖõ¦î]ç¤Ö…_J#ÞŸ²/ÿú$IR-<‹Â­¬xäºÀ1 ºÆÿº%ú¤Q(_¼[j|å·S¾×KÿI’TÈ, ·²ñ¿h`öyÙ±$I’$Õf%‹Â­(ßû5Ñs2@5µë)[ø¢ð{@’$I’² dQ¸5Žþ`ô¨ PIãïŸ}H’$IRV‘, ·¢æYŸ‰ž•*©yæß‡ß’$I’”U$‹Â­¨}ÙÞѳ2@õ”eÊ—¼:ü$I’¤¬"YnEÛO—*§xìÆðó_’$I’² eQ¸^=/TNû²%áç¿$I’$eÊ¢p+*ëÏDÏË•Ó8æCáç¿$I’$eÊ¢p å{î=+TO§‘²/¿$I’$)«P…[¨¾ìÝÑã2@åtï»0üü—$I’¤¬bYn¡æ‰=/TÎøå}þK’$IRV±, ·ô]ð…èy rGþFøù/I’$IYŲ(ÜBíï=/TK·åý %I’$ilö³(ÜBÝ»¿=2TJñðUág¿$I’$eÌ¢p ß=3TJûò}ÂÏ~I’$IÊ*˜Eá*óïGÏÌ•Ò8ñOÃÏ~I’$IÊ*˜EáæZðÂèy rò}^þK’$IÒXõ²(ÜLõ¥o‹ž—*¥ÌV‡Ÿý’$I’”U4‹ÂÍÔXñ‘è™ Rº÷œ~öK’$IRVÑ, 7SóŒOGÏ̕Ҿdð³_’$I’²ŠfQ¸¹gå¼è™ R|‰$I’$Õ²(ÜL뎈ž™*%ßïág¿$I’$eÍ¢p3uïþzôÌ P­,es¶ ?û%I’$)«h…›©xäºè± 2ŠG¯?÷%I’$)«p…›©\÷HôÜ P› ?÷%I’$)«p…›jÎv)uÛÑs3@e´.ú¯ø³_’$I’ƪ›Eá&Ê¿2zf¨”Æ ~öK’$IRVá, 7QýŸ‹ž™*¥~ÐÏ„Ÿý’$I’”U8‹ÂMÔXñ‘è™ :Ê"eów ?û%I’$)«p…›¨yÚßDÍ•Q®û^ø¹/I’$IU¯eQ¸‰æüž›*£»ê²ðs_’$I’ª^Ë¢pòÚßÞ+zn¨ŒÎMdžŸû’$I’TõZ…“×¹öðè¹ 2Ú/?÷%I’$©êµ, '¯sÛ)Ñs3@e4OÿTø¹/I’$IU¯eQ8yÝû/Šž›*£qôo…Ÿû’$I’TõZ…“W÷%I’$I5‹ÂÉc}fGãÈß?÷%I’$I5‹ÂÉêÜrbôÜ PõCÞ~îK’$I’j…“Õ½ûëÑs3@eäû¼6üÜ—$I’$Õ, '«ûÀÊè¹ 2ò=^~îK’$I’j…“U<|uôÜ PÙÜÂÏ}I’$IRÍ¢p²ŠÇo‰ž›ª¡Û ?ó%I’$Iµ^…“T<}_ôè P ecMø™/I’$Iªõ²(œ¤rÝ#ѳ3@%”ë ?ó%I’$Iµ^…“TÖŸ‰ž*¡xúþð3_’$I’TëeQ8I©ÓŒž*¡xâ¶ð3_’$I’TëeQ8±¹;DÏÍ•Q|ïšøs_’$I’”Ƴ(œP¾p—è¹ 2º^~îK’$I’j½, '”/Þ-zn¨Œî+ÃÏ}I’$IR­—Eá„òýÞ=7TF÷þo†Ÿû’$I’¤Z/‹Â Õ~GôÜ PÝ{Ï?÷%I’$Iµ^…ªù—¢çf€ÊèÞýðs_’$I’TëeQ8¡ÆQˆž›*£{×Ùáç¾$I’$©ÖË¢pB¯üNôÜ PÝ;Î?÷%I’$Iµ^…jœø§Ñs3@etn?5üÜ—$I’$ÕzYN¨yÊ_EÏ͕ѹõ¤ðs_’$I’TëeQ8¡æi=7T†E¡$I’$Õ&‹Â 5OÿTôÜ P^z,I’$IµÉ¢pBÍ3>=7T†3‘$I’¤ÚÀdQ8¡æ™=7TF÷®³ÃÏ}I’$IR­—Eᄚg.zn¨Œî=熟û’$I’¤Z/‹Â‰È9ÿ=7TF÷¾ ÂÏ}I’$IR­—EáÄäëÿ=7TF÷þ‹ÂÏ}I’$IR­—EáÄäÜÝ£çf€Êè~÷âðs_’$I’TëeQ8ñ9ïóÑs3@etW]~îK’$I’j½, '> çý[ôÜ PÅÃW‡Ÿû’$I’¤Z/‹Â‰Èÿ=7TFñØMáç¾$I’$©ÖË¢pârá—¢çf€Ê(žº;üÜ—$I’$ÕzYnô€ügôÜ PåÚ‡ÂÏ}I’$IR­—EáÄä[cÑs3@e”Ùêðs_’$I’TëeQ8ñY97zn¨Œ²¹>üÜ—$I’$ÕzYN|@V΋ž›ª£Û?÷%I’$Iµ^…j_²0zl¨”lîŽág¿$I’$©fQ81‹B€Ù•ïñâð³_’$I’T³(Üèñ…³*_üÊð³_’$I’T³(ÜøùÏè™ Ròýß~öK’$I’j…= |!zf¨”ú¡?~öK’$I’j…= ç}>zf¨”Æ‘¿~öK’$I’j…= _ÿçè™ R_ýýð³_’$I’T³(œXó¬ÏFÏÌ•Ò<ù/ÃÏ~I’$IRÍ¢pbÍ3þ.zf¨”ñ_ÐDŸý’$I’¤šEáÄš§þuôÌ P)ã"}öK’$I’j…kžüñè™ RÚ/?û%I’$I5‹Â‰5Oü³è™ RÚW~öK’$I’j…kÿ‡Ñ33@¥t®?*üì—$I’$Õ, 'Ö8öw£gf€JéÜ~ZøÙ/I’$IªYN¬q̇¢gf€Jé~÷âð³_’$I’T³(œXã¨DÏÌ•R<~KøÙ/I’$IªYN¬~Äû¢gf€J)×=~öK’$I’j…«ù—£gf€jé4ÂÏ~I’$IRÍ¢pbõe*'[ð‚ðó_’$I’ªžEá„ê½=z^¨œ|Ÿ×…Ÿÿ’$I’TõZ…Ï-ß÷§¢çe€Ê©úóáç¿$I’$U½–Eás˽¯ ?ÿ%I’$)«p…“Ô¾fYô¼ P9õÃ~1üü—$I’¤¬ÂYNRûò}¢çe€Êiû{áç¿$I’$e΢p²eå¼èy rš§*üü—$I’¤¬ÂYNö \ð…èy rZ~)üü—$I’¤¬ÂYNRó숞—*§}ÕÒðó_’$I’² gQ8IÍS?=/TNç¶SÂÏI’$IÊ*œEá$5¾úûÑó2@åtº2üü—$I’¤¬ÂYNR}ù¯EÏË•S®Y~þK’$IRVá, '©¾ô­Ñó2@õtÛ)›³}ø I’$IYE³(œ¤|ñ+£Çe€JÊï~H’$IRVÑ, 'kîŽ)•eô¼ P9õe$I’$i¬šYn¢²¹.z^¨œÆq ?ÿ%I’$)«h…›hüMõ˜]ͳ?~þK’$IRVÑ, 7QñØÑó2@å´/^~þK’$IRVÑ, 7Q÷•Ñó2@åt®?*üü—$I’¤¬¢Yn¢Îí§FÏ˕ӽ÷üðó_’¤ÿŸ½û޶ìª|MIè&cû Ó`œ0¶nlh°ývã0š`0Øà€Æ€[AU’JE”%J •²PB9‚rN( I( RZ'Ÿ³×·n8÷Î}öú~c|ÿíÚkž5UgßSe²(܈Á¥ûDß—%©¸F÷_~þ¤BYnDÿ¼í£ïË’T\Uç‘ðó Ê¢pc?˜Ó>}_–¤"kmóÓá3 È¢p#ºÇ}2ú®,IEÖÞí×Ãg@*EáFtÿó軲$YgÍ{Âg@*EáFtxGô]Y’ЬwÂ?†Ï€T ‹ÂhïñÛÑweI*²é_&=R, 7¢µãË£ïÊ’TdƒkŸ©@…³âÙÑweI*²á]ÆÏ€©òXnBÕy4ú¾,IÅU=vOøù dQ¸ £‡n޾/KRyU£l&Ra, 7¡{Ü'¢ïÊ’Tdƒ+Ÿ©0…›Ð9ä}ÑweI*²é_&=Ra, 7¡ýµß¾+KR‘UÝ>Ra, 7¡µÓ/Gß•%©Ìª*§­Ÿ>RA, 7eëçD_•%©ØÚ_}mü˜*‡EáfTÝÇ£ïÊ’Td5ï Ÿ© …›1zø–軲$Yï›ÿ>RA, 7cxçùÑweI*²þ…;‡Ï€T‹ÂÍ\wTô]Y’ŠlxÃqá3 Ä¢p3úï}W–¤"ÝMø H±(ÜÜèÌeÑweI*³^Êié’ð9 aQ¸Ýc>}U–¤bkm÷’ð9 aQ¸ƒþ8úž,IÅÖÞûMás ¢p3Ú_}mô=Y’Š­»öÃás ¢p3Z«ž}O–¤b럵"|¤BXÎ@Õy4ú®,IE6¸úÐð aQ8£®‹¾+KR‘î¹$|¤BXÎÀð»§Dß•%©È¦ÿEwô H…°(œÁeûFß•%©ØZ_ú¹ð9 `Q8“ҙˣïÉ’Tlí½ß>R, g {ìßDß“%©ØºG}$|¤XÎ@ç ?‰¾'KR±õÏ^>R, g ½ëë¢ïÉ’TlƒkŽŸ©…3ÐZõüè{²$Ûè¾+Âç@*€Eá UÝÇ¢ïÊ’TdU–. Ÿ©á, ghôÀõÑweI*¶Öö/ Ÿ©á, ghxË©Ñ÷dI*¶Î¾o Ÿ©á, ghpÙ~Ñ÷dI*¶î1Ÿ©á, g¨ÖŠè{²$[ÿ¼Âç@j8‹Âêó±è{²$Ûð†cÃç@j8‹Âêìÿ¶è{²$ÛèÁÃç@j8‹ÂjíôKÑ÷dI*·a?§å[…Ï€Ô`…3µlËõUIRLí]^? ¦šË¢pªu·Eß“%©Ø:‡þïð9Ì¢p†·}O–¤bëöùð9Ì¢p—í}O–¤b\~@øH fQ8›Öé_Œ¾'KR± ïº0|¤³(œ…¾'KR±Uí‡Ãç@j0‹ÂYhïýæè{²$]k»‡Ï€ÔP…³ÐÚþ¥ÑwdI*ºÎ¾o Ÿ©¡, gcé’œû­è{²$[÷¸OÄÏ€©f²(œ¥Ñƒ7Dß“%©Øúì>RCYÎÒðæ“£ïÉ’TlÛN Ÿ©¡, g©ÿÝ£ïÉ’Tl£‡o Ÿ©¡, gû;õ?¢ïÉ’Tn£aN[?'|¤²(œ¥îá}M–¤¢kïþ›á³ 5Eá,µ÷|CôY’Š®{äÃg@j ‹ÂYjmóÂè;²$]ÿœmÂg@j ‹Â9¨ZEß“%©Ø†×>RYÎÁð® £ïÉ’Tl£‡n Ÿ©, ç`pÅAÑ÷dI*·Ñ §Ï Ÿ©a, çòC;ý‹Ñ×dI*ºön¿> RÃXÎA÷ˆ¿Œ¾#KRÑu¿ñÃg@j‹Â9hïñÛÑwdI*ºþY[‡Ï€Ô0…sÐZù¼œ«*úž,IÅ6¸î¨ðYÆ¢pŽªÇ'KR±¼!|¤†±(œ£áçFß“%©Üüæc€ RCXÎCkõ+£ïÈ’TtUë¡ðY¢p>–n‘s¿}O–¤¢kmÿÒøy05ù, çiôý«¢ïÈ’Ttƒþ8|¤°(œ§Á5‡Gß‘%©èz§þGø,H `Q8ßà™Ë¢ïÈ’Ttƒ+Ÿ©, ç©{Ä_Dß‘%©èF÷]> RXÎS{·_¾#KRÙ º9-ß*|¤ gQ8_+ž•óh}M–¤¢kïúkñó`j²YŽÁèá[¢ïÈ’TtÝ#?> Ò„³(ƒá'Dß‘%©èúç~)|¤ gQ8ýóvˆ¾#KRÑ o:1|¤ gQ8Ýc>}G–¤¢«½+|¤ gQ8í½ß}G–¤âkmóÂðy&˜Eá´V½ ú~,IÅ×Ù÷­áó M0‹Â1©¿/úŽ,IE×;ñSá³ M0‹Â1ÞvfôY’ŠnpÉ×Âg@š`…cÒÿÎîÑwdI*ºÑÝ…Ï€4Á, Çõƒ<á£ïÈ’TtU÷ñœ–. ŸiBYŽIg¿?Œ¾#KRñµV¿2|¤ eQ8&­m_}?–¤âëú§áó M(‹Â1ò›%)¶ÞKÃg@šP…c4¼å´è;²$ÝàÚ#Ãg@šP…cÔ¿`uôY’ŠnôÐMá³ M(‹Â1êóñè;²$•Ýh˜ÓÖ?>Ò²(£ö×~/úŠ,IÅ×Þëáó M ‹ÂqZùÜœ«QôY’Šnú_w‡Ï€©ÉcQ8fÕºÛ¢ïÈ’Ttý ¿> Ò²(³áÇGß‘%©è†·> Ò²(³þ9ÛDß‘%©èªÖCá³ M ‹Â1ëùè;²$_k‡—…Ï€4a, Ǭ½Û¯Gß%©ø:¿+|¤ cQ8nË·ÊyØ‹¾#KRÑõNÿBü<˜š,… `ôÀuÑwdI*ºÁukÃg@š0… `pÍÑwdI*ºjÝmá³ M‹Â…ø¡ž1}G–¤²«ªÜÚögÂç@š …  sèŸF_‘%©ø:û¿=|¤ bQ¸Z«_}?–¤âëò™ðy&ˆEáBXº$WÝÇ¢ïÈ’Ttƒ«‰ŸS“âp ïº úŽ,IE7zàúðY&ˆEáé_¼GôY’Ên4ÌiåsÃç@š… ¤{Ü'£¯È’T|í½ß>Ò„°(\ í¯ý~ôýX’Нwâ§Âç@š… eåss®FÑwdI*ºÁeûÅÏ€©É`Q¸€FÝ}G–¤¢ÝwEø,H¢p ®[}G–¤²örZñ¬ðy&€EáBþpÏ˜Š¾"KRñµ÷|Cø<HÀ¢puùÿ¢ïÇ’T|Ýcÿ&|¤ `Q¸€Z;¾<ú~,IÅ×ÿÎîáó M‹ÂVµ×Eß‘%©èFw_> Ò°(\`Ã;Ή¾#KRÙõ[9-Û2|¤š³(\`ýoï}E–¤âkïúºðyj΢pM¿D_’[wí‡Ãç@ª9‹ÂÖÞëÑ÷cI*¾þ«Ãç@ª9‹Â…¶õsr ¢ïÈ’TtÃÛÏŠŸSõfQ¸FÞ}G–¤¢«:ä´tIø<H5fQ¸W}G–¤âk­~eø<H5fQ¸?äSÿ#ú~,IÅ×=üÏÃç@ªòCÀ IDAT1‹ÂEÐ9àÑ÷cI*¾þ9ۆπTc…‹ µíÏä\UÑwdI*ºáwO Ÿ©Æ, IõÈÑwdI*º*=> RY.’á ÇFß‘%©øZ_þ…ðyjÊ¢p±~Ðg.‹¾KRñuÖ¼7|¤š²(\$Ó—SIRlÓÿÑ&z¤š²(\$Ó_w“$Å6ýˆèyjÊ¢pUOÜ}G–¤¢«½+|¤š²(\DÃ[N¾#KRñµ¾ôsáó ÕEá"ꟻ]ôýX’Нsà…Ï€TC…‹¨{Ä_Fß%©øz§}.|¤²(\Dí¯¼:ú~,IÅ7¸æððyjÈ¢p1-]’«Î£ÑwdI*ºÑC7ÇÏ€©ú±(\dÃ;Ï‹¾#KRÙU£ÜZõ‚ðyjÆ¢p‘õ/Ú%úŠ,IÅ×Ùÿmáó ÕŒEá"ëýÑèû±$_ïÔφÏ€T3…‹¬½ûoDß%©ø×>RÍX.¶e[æÜKÑwdI*ºê‘;âçÀT½XÞuaôY’НµÝKÂç@ª‹Âý‹¾}?–¤âëü®ðyjÄ¢0@÷¨Dß%©øzg. Ÿ©F, ´w}]ôýX’ŠoxÓ‰áó ÕˆEa„¥[äªûxôY’Š®JÄÏ€©ú°( 2¼ãÜè;²$_kÇ_ Ÿ©&, ƒô/X}?–¤âëöþðyj¢0H÷ÈFß%©øúçn>RMXiïò«Ñ÷cI*¾ámg„Ï€T…Q–.ÉUç‘è;²$]Õytý/˜ Ÿ Sñ,  o;3úŽ,IÅ7ý/¼£ç@ª‹Â@ýóvˆ¾KRñu×~(|¤°( Ô=â/£ïÇ’T|ý‹v Ÿ©, µV¿2ú~,IÅ7¼ëÂðyjÀ¢0úš´~}G–¤²ë·sZ¾UüL˜ŠeQlxËiÑWdI*¾öî¿>R0‹Â`ýs¶¾KRñuýÛðy‚Yëöþèû±$ßàÒ½Ãç@ fQ¬µãË£ïÇ’T|£û®Ÿ)˜Ea TO|?úŽ,Ie7ìç´õsÂç@ dQXÛOо"KRñµ÷~Sø<H, k ÖÖÑ÷cI*¾Þ7ÿ9|¤@…5Ð9ä}Ñ÷cI*¾Á•_Ÿ)Ea ´¶iôýX’Šoôàáó ²(¬‰êñ{£ïÈ’TvU•[Û¼0|¤ …51¼ñøè+²$_gÿ·‡Ï€Ä¢°&zg.‹¾KRñõNû\ø<HA, k¢óõwGß%©ø×­ Ÿ)ˆEaM´¶{qôýX’НzäÎðy‚XÖHõè]ÑwdI*¾Öv/ Ÿ)€Ea ®?:ú~,IÅ×YóžðyXÖHïô/Dß%©øúg­Ÿ)€Eatúãèû±$ßðæ“Âç@ `QX#­m_”sUEß‘%©èªô`ø<H, k¦Zw[ôY’НµÓ/…Ï€´È, kfpí7¢ïÇ’T|ÝÃÿ<|¤EfQX3½S?}?–¤â럷Cø<H‹Ì¢°f:ûýaôýX’ŠoxûYáó -2‹ÂºYùÜœGƒè;²$]Õ},§¥[ÄÏ€©ÅcQXC£û¯‰¾#KRñµ¿úßÃç@ZD…54¸l¿èû±$_÷¨¿ ŸiYÖP÷¸OFß%©øúï>Ò"²(¬¡ö¿}?–¤âÝ{yø<H‹È¢°Ž–m™s/Eß‘%©ìFƒõ¿`*|&L-‹ÂšÞy~ôY’Н³ï[Ãç@Z$…5Õ¿`uôýX’НwêgÃç@Z$…5ÕýÆÿ¾KRñ ®;*|¤EbQXS­Õ¯ˆ¾KRñUß>Ò"±(¬±*=}G–¤âkíø‹áó -‹ÂÞôÍèû±$_÷ˆ¿ŸiXÖXïÌåÑ÷cI*¾þ;…Ï€´, k¬sð»¢ïÇ’T|û.ŸiXÖXkÛå\UÑwdI*»A'›‘@*€Ea;5úŠ,IÅ×Þëáó -0‹Âš\}hôýX’Нwâ?…Ï€´À, k®wò¿Fß%©øW­ ŸiYÖ\{Ÿ·Dß%©øFß>Ò³(¬»ÏÎyؾ#KRñµ¶{IüL˜Z8…`tïåÑ÷cI*¾Îš÷†Ï€´€, 'Àà’½¢ïÇ’T|ý³W…Ï€´€, '@÷˜Eß%©ø†·ž>Ò²(œí]-ú~,IÅWuÏiÙ–á3 -‹ÂI°t‹\u‹¾#KRñµw{}üL˜Z…bxûYÑ÷cI*¾î±>Ò±(œýó¶¾KRñ .Û7|¤bQ8!º‡½?ú~,IÅ7ºÿšðyˆEá„h}ù¿Eß%IÕ(·V½ |&¤`Q8AªÇï¾"KRñuxGø<X…dxñÑ÷cI*¾Þé_ ŸiXNÞé_ˆ¾KRñ oÒ˜YN˜Þ‰ŸŠ¾KRñî¹$|¤1³(œ0í½Þ}?–$ û9mýœð™ÆÈ¢pÒ,ß*ç~;úŠ,IÅ×Þç-ñ3`j|, 'Ðèî‹¢ïÇ’T|½Sþ=|¤1²(œ@ý‹v‰¾KRñ ®ýFø<HcdQ8ºG~ ú~,IÅW=zWø<HcdQ8Ú;¿*ú~,IÊ9·¾ü á3 ‰EᄪÒÑ÷cI*¾îaïŸiL, 'Ôðæ“¢ïÇ’T|ýóvŸiL, 'TïÌeÑ÷cI*¾áç†Ï€4&…ªsðÿ}?–$õ[9-{føLHc`Q8¡ZÛ¾(窊¾"KRñµ÷üð™ÆÀ¢p‚~ðÝèû±$_ï¤O‡Ï€4…lpÕšèû±$ßàÚo„Ï€4…¬÷Í޾KRñUß>ÒXN°ö×~/ú~,IÊ9·vúåð™æÉ¢p’-ÿrt£ïÇ’T|ݵŽŸ SócQ8áFß»8ú~,IÅ7¸d¯ðyæÉ¢pÂõ¿½kôýX’Šotÿ5áó Í“Eá„ë®ýPôýX’TrkÛ…Ï€4…®ý•WG_%I9çÎÁï Ÿ i, 'ÝÒ%¹jý ú~,IÅ×?g›ø™05w… 0üî)Ñ÷cI*¾áíg‡Ï€4… Ð?kEôýX’Ôog³HÌ¢°:_wôõX’”sní÷Âg@š#‹Âh}égs®ªèû±$_ iŽ, bôð­Ñ÷cI*¾ÁõG‡Ï€4G… 1¸ú°èû±$_õÄýáó Í‘EaCôNú—èû±$iú=…;ÿJøLHs`QØí½ß}7–$圻G4|&¤9°(lŠÏÊyоKRñ .Ý'~&LÍžEaƒŒî¹4ú~,IÅ7zàúðyæÀ¢°AúßÙ=ú~,IªªÜúÒÏ…Ï€4K… Ò=ê#Ñ×cIRι³æ½á3 Í’Eaƒ´wyMôÝX’”s]øLH³dQØ$K—䪽.ú~,IÅ7¼óüø™05;… 3¼å´èû±$iÐÍiųÃg@š‹Â†éŸ½*úz,IÊ9·÷yKøLH³`QØ0Ó/З$Å×;õ³á3 Í‚Eaô¶{IôÝX’4ýžÂŽ Ÿ i, ¨Zw{ôýX’Нj=´þ—LEÏ€4C… 4¸æðèû±$iú=…»¼&|&¤²(l ÞÉÿ}7–$圻ÇþMøLH3dQØ@Ó¿iS’ßàòÂg@š!‹Â&Zñ윇½èû±$ßè¡›ãgÀÔÌX6ÔèÞË¢ïÇ’¤ªZÿÛè£g@š‹Â†ê_¼GôõX’”sîú§á3 Í€EaCuúHôÝX’”scøLH3`QØPí]^}7–$M¿§ðî‹Âg@š‹Â¦Zº$WíuÑ÷cIÒ°ŸÓÖ??¦6Í¢°Á†·~+úz,Iš~Oá¾o Ÿ i3, ¬öªè»±$)çÜ;ý á3 m†EaƒuÖ¼7ún,IšþöñwO Ÿ i3, ¬µÝ‹£ïÆ’¤œsÕ{"§eÏ Ÿ i, ®Zw{ôýX’”snïõÆð™6Á¢°á×}7–$M¿§ð”τπ´ … ×;ùß¢ïÆ’¤é÷Þp\øLH›`QØpí}Þ}7–$M¿§°ýpNK·Ÿ i#, ›nųsö¢ïÇ’¤é÷îþñs`jÃ, 0º÷²è»±$iú=…'þSøLHaQX€þÅ{Dß%I9çÁµG†Ï€´…èõ‘è»±$iú=…霖. Ÿ i, ÐÞå5ÑwcIÒ“MŸÉÑs m€Ea –.ÉU{]ôÝX’”sî÷‰ø¹0õ“, 1¼å´è»±$iú=…W­ Ÿ i, Ñ?{UôÝX’4ýžÂǾ>ÒX¢³æ½ÑwcIÒ“µV¿"|.¤§±(,Dk»—Dß‹%IOÖ=ú£ásJÒZõüÜÙÿm¹wÚç²Ø36Ê¢° ÕºÛ£ïÆ’¤é÷^¾øL€ÆZöÌÜÞõu¹{Ô_åþE»äѽ—å<þ×çñÖ6?ÿ¿qªž, 2¸æðÀk±$é?=|KøL€¦håÕ¹»öC?\ Þ}Q΃Î&?·vxYøÿæTS…éü¯‹t–$m®ÖŽ/Ÿ 0iZÛ¼0w|gî¹<oÿ#÷Nút\yp=p]ÎU5ïÏâí¯¾6þÿÛT=Y–dųsöÆp½•$Í7ï)€§X¶å½Wpxçù ¶Ãhïù†øÿ¿SõdQX˜õ/ð”$…W­»-|&@”é÷vÖ¼÷‡_!¾õôœû­Eû,>ýËèÿÿ©¦, Ó¿xE{ð$I›®µÓ/…ÏXhÓ¿exýWˆOûü“ï| ôsxç€w„ÿLRMY¦{ÔGBFIÒêýÑð¹“ð^ÁqÖYóžøŸÓT=Y¦½Ëk¢ŸGIÒ“ ®80|.À$¼WpœuÿóøŸÝT=Y–fé’\µ×E?“’¤é÷>zWü\€ x¯à8›^lFÿ,SMYhxËiÑϤ$éÉZ«_> îïgÝã>þóM5eQX þÙ+£ŸIIÒ“uùXø\ pË·Êí=§ÖïgÓÿ?ÃæSõdQX é&,IªGÓĢ煿WpÐÍ%Õ;ísñSõdQX Öv/Ž~&%IOV=zwø\ ÷ N…¸óH.½éŸEôŸKª)‹ÂBUën~.%IOÖÞùUás€É×Zõ‚¾Wpú+Ä×™«'îþ¨[Ëúçnþg•jÊ¢°Pƒk~.%IOÖ=öoÃçø^Áé¯÷É"Þ+8Φ¿rþç7UO……êü¯ÑÏ¥$éÉW>¨ù{w{}îóñ<¸äkytß9Ñc'¶Á%{Åÿ™NÕ“Ea¡Ú{¿9ú¹”$=Yõø}ás€¿W°½.ú#k£\ºwøŸqª)‹ÂR­xvÎÃ^ô³)Iz²öW^?¨Á{¿ýÑ´ñ .Û/üÏ=Õ”EaÁF÷\ýlJ’ž¬{üß…ÏØŠg¯ÿ†ßú¥àU‡äÑC7{¯`@ƒ+Šÿ»0UO…ë_¼Gô³)Iz²éÿz=¯ÖêWæîQµþ—g ïJ7ýâîὂ nxñáÏRMY®öÊèçS’ôŸõR6ß+ØúAô'B-BÓÖÑ÷RMYnú@”$էξo Ÿ e¼Wð¶è~ jxóIáSMY®µÝ‹£ŸOIÒSꟵ"|6L<ïÔ&ÞrjüßÑ©z²(Äog’¤5ýœè¹0ñïì·£?Ö©Æ o==üïlª)‹BòàšÃ£ŸQIÒ6¬ÿZLôl¨+ïÔ|Þ~VøßãTS…äÞÉÿýŒJ’žRçàw…Ï€:h­|Þ½WpýWˆ¥y6¼ãÜð¿Û©¦, Éí½ßýŒJ’žRÿ‚Âg@ä{§¿B<º÷2ïÔ‚4¼ë‚ø¿ïSõdQHN+žó°ýœJ’žltß•ñ³`!-]’Û»üjî®ýpî_ôÕ<ºûÛ9:ÑÃTH£»/ЦêÉ¢õF÷\ýœJ’þ³j´þ·ÒGÏ€qimÿÒÜ9ä}¹öª<¼å´\u‰þÄ¥‚Þuaø3‘jÊ¢õúßÙ-ú9•$=¥éßÚ=æÂ{U÷†wžþœ¤š²(d½îÚE?§’¤§4¸tïðÙ°YË·Êí=ß»Çÿ}\~À—‚£aôG)i“ o?;þÙ™ª'‹BÖkïüªèçT’ô”ªGîŸ O×Úáe¹³æ½¹Þöyxçù9÷[Ñ›¤Y7¼íŒðg)Õ”E!ÿ¥zâþègU’ô”Ú_yuølÊÕÚæ…¹sà;sïÌåyxã ¹JF<’ÆÒô{2£Ÿ¯TS…ü—éƒ_’TŸz'ücøl ±ò¹?ù^ÁªŠþ8$-HÃïžÿÌMÕ“E!?úËpú¢ŸUIÒSÞplølhÙ–¹½ëër÷¨¿Êý‹vùáWˆ‡½è>Ò¢5¼é›ñÏáT=Yò_:û¿=úY•$=¥ªûøú„GÏ ï\ÿâ[O÷^AßðÆãßËTS…üÈÊçæ<D?¯’¤§ÔÙ÷ÆÏ`b´¶ùé~…ø´Ï?ù^Á¢?ÎHµkxý1áÏjª)‹B~ÌèûWE?¯’¤§Ô?këðÙÔ”÷ JsjpÝQñÏïT=Yòc—|-úy•$=¥ÑÝߟ @ x¯ 4¶×~#þ™žª'‹B~L÷迎~^%IOm4Ì­m_>€à÷ öRô§©1 ®>,üO5eQÈiïòšèçU’ô´º‡ÿYø|Ž÷ J‹ÛàªCŸûTS…ü¸¥KrÕúAô3+IzJÓ¯…ŸÀx,ß*·÷üï”›~öÂÏ‚©z²(ä' o>9ú™•$=¥ê‘;Âg0¦÷ ºÑ-¤â\~@üù0UO…ü„ޙˢŸYIÒÓjåÕáóØ´ÖN¿”»Güeî_°SÞq®÷ J5mpÙ~áçEª)‹B~Bç ?Ž~f%IO«wâ§Âçð#­U/øá{§¿B|푹zâþè ’fXÿ;»‡Ÿ!©¦, Ùà‹ts5Š~n%IOixÃqáóеõsr{Ÿ·äÞIÿ’WšGßýÑ@Ò<ê_°:þ\™ª'‹B6hý u%Iµ©ê>žÍjXÞ+(5¾þ9ÛÄŸ5SõdQÈM__’T¯:û¿-|>@Ó´vxYî¬yoî¹<o Yïü~ôx—PïÔÿ?RMY²AíÝ^ýÜJ’žÖèûW‡Ï˜Ë·úáWˆûd\yð_¯ä]ì’Öÿ¢ÀŠ?£¦êÉ¢ [ºE®:F?»’¤§ÕÚñãgÔPkõ+Ÿö^ÁNôØ–TÓºÇþMø™•jÊ¢Þú­ègW’ô´|¨€ ½Wðáè-i‚ê®ýPø9–jʢꟽ2úÙ•$=­ÁuG…ÏXL­UÏÿÑ{¯<8WënÇ’&¼îá~¶¥š²(d£:_wô³+IzZU÷±õï\Šž° –=ó‡ï<ê¯òàÒ½½WPÒ‚ÔYóžøónªž, Ù¨Ö¶/ʹª¢Ÿ_IÒÓêìûÖðãú q÷ˆ¿ð^AI‹Zç€ÿ~þ¥š²(d“FÝýüJ’žVÿÜ/…Ϙ÷{[?ˆ©’ ­½Ï[ÂÏÄTS…lÒàŠƒ¢Ÿ_IÒÓÝwEø|€Ù½Wð¶èñ)IÿU{Ï7„Ÿ“©¦, Ù¤îñýüJ’ž^UåÖ?>#`=ï”4aµ¿úÚø³sªž, Ù¤ö¿ýüJ’6P÷迟”é'Þ+ØoGEIšU­Õ¯?KSMY²iËž™«ÞÑϰ$éi ®ýFüŒ Œ÷ ú¿sÿœmóðÖÓsÕy4zJÒ¼›>Û¢Ï×TS…lÖð¶3£ŸaIÒÓªÚëÖÿÇœè@s´V½ wö{îöù<¸þè\=ö½èq'I RkåóÂÏÜTS…lVÿì•Ñϰ$iuöûƒðÀä¿Wpú+Ä£{/ó^AIe4æ´tIü9W퇣'Œ$5²Á5‡‡Ÿó©Æ, ™±ê±{¢ŸgIÒêþgá3€1Y¶eÎU=Z$©± .Ý;þ¬Ÿª/‹BflpÝÚèçY’´—>#Ö¶/Š+’Ôèúç9ü¬O5fQÈŒõNþ×èçY’´ªô@NK·ŸÌ_{çWEIjt½3–†Ÿõ©Æ, ™±ö^¿ý~Ö§³(dæ–oå7­IRM럽*~N0oÞ=R$©Ñuþëð³>Õ˜E!³2¼ýìègZ’´F÷]>#˜¿é_P%IZ¸º‡½?ü¬O5fQȬôÏÙ&ú™–$m¨ªÊ­_>'˜Ÿî1ž(’Ôè:¾3ü¬O5fQȬt¾þîègZ’´‘zßüçð9ÀüôNýlô8‘¤F×Þëág}ª1‹Bf¥µÍ s®FÑϵ$i o;#|N0?ýówŒ'’ÔèZ;ýrøYŸjÌ¢Y=p]ôs-IÚP£Anmû3ás€¹\qPô4‘¤F—V>7ü¬O5fQȬ .Ý;ú¹–$m¤îÚ‡Ï ænxóIÑ£D’šÛ ~Χš³(dÖºG}$úÑ–$m¤ÁukÃçs7ºç’èQ"I­zôîðs>ÕœE!³ÖÞùUÑ϶$i#U½'rZñìðYÀÜTÜ=J$©±î»"üœO5gQÈœTßý|K’6RgÍ{Âçs“û­è1"Imxë·ÂÏùTs…ÌÉàú££ŸoIÒF\ºOøœ`¶þ©è"InpÍáñgýT½Y2'½Sþ=úù–$m¤ê‰ûsZºEø¬`vÚ;ÿJô‘¤F׿è«ág}ª9‹B椽÷›¢ŸoIÒ&jïó–ðYÀìtöûÃèñ!I®wæ²ð³>ÕœE!s³|+ïO‘¤×?o‡øYÀ¬tü`ôø¤F×;áÂÏúTs…ÌÙðŽs£ŸqIÒF=tSøœ`vz§|&z|HR£ëñ—ág}ª9‹Bæ¬îvÑϸ$iµwýµðYÀÌõ/üJôè¤F×Ùÿíág}ª9‹B欳æ½Ñϸ$iõÎ\>+˜¹ÁµGFIjtíÝ^~Ö§š³(dÎZÛþLÎÕ(ú9—$m¤ÑýaíÌô IDAT×„Ï fnx×…Ñ£C’]kû—†Ÿõ©æ, ™—Ñ×G?ç’¤MÔÞå5á³€™©¹3zlHRs«ªl÷õŒÍ²(d^—ìý¨K’6Qïô/†Ï f`ùV9†ÑcC’[Õz(þ¬Ÿª?‹Bæ¥{䢟uIÒ&ÝwEø¬`óZ«_=2$©Ñ¾uøYŸ&€E!óÒÚáeÑϺ$i3µw~Uø¼`Ó:¼#z\HR£Þ|røYŸ&€E!ó6zøÖèç]’´‰z§}.|V°iÝcÿ6z\HR£\¶_øYŸ&€E!ó6¸|ÿèç]’´‰Fß»8|V°iýs¶‰’Ôèúg¯ ?ëÓ°(dÞºG4úy—$mªªÊ­~)|^°qƒ«ž’ÔèºÇÿ}øYŸ&€E!óÖÚé—£ŸwIÒfêüoáó€Þuaô¨¤F×9ä}ág}š…ŒEõè]Ñϼ$i ïº |V°qUz0zTHR£kïõÆð³>M‹BÆbpÕšèg^’´©|ý ¶ZÛ¾(zJHRãkíð²ðó>M‹BÆ¢{Ü'¢ŸyIÒfêúáó€ŸÔÞç-Ñ#B’šÝhÓ²-ÃÏû4, ‹ö.¯‰~ì%I›itÏ¥áó€ŸÔ=æãÑ#B’]õØ÷ÂÏú4!, ›êñ{£Ÿ}IÒfjåÕáó€×?o‡èñ Inô½‹ÃÏú4!, ›Áµßˆ~ö%I›©wÆTø¼àÇ o8.z}H’fÐàʯ‡Ï €’uúãèQ Iopé>áç}š …Œ]{ï7EŸ’¤™ÔK¹µòyás T½3¦¢'$5¾Þé_?ïÓ±(dü–=3W½'¢ÏIÒ ê®ýpüÜ(ÔðÆã£Ç€$5¾î‘?ïÓ±(dAL¿@’Tÿ†·œ>3JU=~_ô¤Æ7ý­Çèó>M‹BDÑg$i&U£Üúò/„Ï €Ò´v|yô¤"jmÿÒð3?M‹BDg¿?ˆ> $I3¬wÊgÂç@iº‡ÿyôñ/IͯßÎié’ð3?M‹BÆŠgå<èD ’¤4ºÿÚø¹P˜þy;Dÿ’ÔøFÞ~Þ§ cQÈ‚ÞqNô™ IšaíÝ3|n”dxûYÑG¿$5¾áÍ'‡Ÿ÷iÂX²`úg¯Œ>$I3¬ÁNás ˷ʹ—¢~Ij|ý‹÷ˆ?ó§&‹E! ¦³ÿÛ¢ÏIÒ «Òë/®Ñ³ í¯ý~ô±/IEÔ;åßÃÏü4a, YØ÷öÛÑç‚$i†uû?ñ³ ½Ó>}äKRuÖ¼'üÌOÆ¢5¼íŒèsA’4Æ7>7J0}ÞJ’¾öο~æ§ cQÈ‚êþÅèsA’4ÓFƒÜÚáçÃg@£-Ý"WG¢O|Ij~Ã^NËžîOM‹BT{ï7G ’¤Y4ýÁ zv4Y{ߊ>ê%©ˆF\~æ§ dQÈÂZöÌ\u‹>$I3lôƒïæ´tIüüh¨ÞIŸŽ>ê%©ˆ†×~æ§ dQÈ‚ÞôÍèóA’4‹:ûýAøìhªé‹«$iá럻]ø™Ÿ&E! ®wÊg¢ÏIÒ,\q`øìhì·m:Fó’TDÝ£ÿ:þÜŸš<…,¸ö¿}>H’fS/åÖª„Ï€¦™þÛ’¤Åiúw&DŸûiY²8¿Ù­õƒè3B’4‹ºÇÿ}üüh˜þ9ÛFï’TL­m_~î§ dQÈ¢\wTô!IšE£ï_>;šftïeÑÇ»$Q• ?óÓ„²(dQôNüTô9!Iše¾®0>­í^œs5Š>Ú%©ˆ†wž~î§ eQÈ¢hõµÑç„$i– ®<8|~4Ew퇣uI*¦Áeû…ŸûiBY²hªÇï>+$I³iÐÉ­/ýløüh‚ÁU‡DŸê’TL½S?~î§ eQÈ¢\µ&ú¬$ͲÞ)Ÿ ŸoùV¹ê<}¤KR1uy_üÙ?5™, Y4Ý£?}VH’fÙèá[×ÿöúè0É:ýIôq.IEÕZýÊð³?M(‹BMk‡ŸÏ¹ª¢Ï IÒ,ëøÎð0É—|-ú(—¤rê%ÿ¡{jî, YT£®>2$I³lpÝQáó`b-Ý"Wß}”KR1î¾(þ쟚\…,ªþE»DŸ’¤Ù6äÖŽ¿>C&Q{ï7GŸâ’TTƒK÷ ?ûÓ³(dQuÖ¼7úÌ$Í¡þ¹Û…Ï€IÔ?Çè#\’Šªwâ?…Ÿýi‚Y²¨Z+Ÿ—ó°}nH’fYÕúAN[ÿTø˜(K—¬ÿ¥P’¤Å«³ßÆŸÿS“Ë¢E7¼ó¼èsC’4‡ºÇ}2|†L’öÞoŠ>º%©¸ZÛ¾(üüOÌ¢E×;ciô¹!IšCÓ¿jú_ÇDÏ€IÑÿÎnÑG·$UõèÝágšp…,:ÿeU’&·Î>G&²gæê‰û£mI*ªáÍ'ÅŸÿS“͢ŷlË\µ×EŸ’¤94¼é›ñs`t¾þîè#[’ŠË/à{ƼYbxý1Ñç‡$i.UUnõ¿‡Ï€º\}hô‰-IÅÕ=òƒáçšp…„èðÑç‡$iŽM¿s+zŽÔYkåórî¥èãZ’Š«½Û¯‡Ï€4á, ÑþÊ«£ÏIÒ\ë·rëK?>Kêª{ÔG¢OjI*¯a/Ûm=cÞ, S­»=ú‘$ͱþY+Âç@] ïº0ú˜–¤â}ÿªðó?5€E!a—î}ŽH’æXÕúAN+Ÿ>KꦽÛë£hI*²ÁUkÂg@j‹BÂt{ô9"IšG½“>>Kêfú=®’¤ÅÏgÓgŒ…E!aZ«^ó°}–H’æXõèÝ9-ß*|žÔÆÖÏÉU{]ôñ,IEÖÞç-ñs`jòYjxçyÑg‰$iu×~(|–ÔE÷˜EË’Tf£¡×âL‡E!¡z§1ú8‘$Í£Ñý×ä´tIø<¨ƒÑ÷¾},KR‘ùE&Ï‹BBµ÷|Côy"Išg5ï Ÿ'Ñ|®•¤¸—ï>RCXké’\=qô™"IšG£{/ó¯ â ®>,ú8–¤bëÿwás 5„E!ᦅ¹$i²ëô'áó JëËÿÍ/铤ÀÚ{þNø,H aQH¸îÚGŸ)’¤y6ºûÛáó Jÿ‚ÕÑǰ$•Û ›ÓŠg…ςԅ„k}éçr®FÑG‹$ižuü£ð™°ØZ«^«Î£ÑG°$Ûè{‡Ï‚Ô …ÔÂèžK£ÏIÒ<Ý}Qø<Xl½S?}üJRÑõ/Þ#|¤±(¤úg¯Š>[$Ic¨sÀ;Âg À¢Y¾U®½;ú蕤¢ëóñøy0Õ…ÔBgßÿ}¶H’ÆÐðÎóÂg Àbéû7ÑÇ®$_{÷ߟ©A, ©‡e[檽.ú|‘$¡ÎÁ+‹ñ¯ ×Ý}äJRÙõ[9-{füL˜j‹BjcpÝÚè#F’4†F÷]™ÓÒ-Âç ÀBê÷‰èãV’Šoxçùáó 5ŒE!µÑ=æcÑgŒ$iLuü@ø\XØMx{ôQ+IÅ×?o‡ø™0Õ,…ÔFk»—ä\¢ÏIÒš¾@ûl4U÷ø¿‹>f%IÓ¯¼9ä}á3!5ŒE!µ2ºç’èsF’4¦z'üCø\XMøÈÑG¬$©ªrk»ÇÏ…©f±(¤Vzg.>j$Icªzü¾œV>7|¶ŒS>^%IÓïÅ~è¦ð™È¢ZiïõÆè³F’4Æz§1|¶ŒKkÕ r•ˆ>Z%I9çÁåû‡Ï…Ô@…ÔËÒ%¹züÞèóF’4¦ªÞ¹µÃÏÇÏ€1˜~i¾$©MÿBÔè¹È¢Ú\¶_ôy#IcƒËŸ-óÕÚé—st¢TIÒ“µwùÕðÙÈ¢Úéö¢ÏIÒ8«F¹½×ï†Ï€ù\sDôi*Iz²ªõÐúo$FφÔ@…ÔNkåórt£ÏIÒÞu¡sÀÄjïý¦õ¿]S’T†7>RCYRKÃ[¿}îH’Æ\÷ˆ¿Ÿ/³¶tIÝ}Qô*IzJ½Ó>?¦šÉ¢Zêô/ÑçŽ$iÌUënÏiëç„Ï€ÙèóñèãS’ô´:ûüðùÊ¢Zj­~eô¹#IZ€úg¯ Ÿ13ÕúÒÏæ*=}tJ’žÚ ›ÓŠg…ψÔP…ÔÖè¡›¢IÒ¸örû«¯ Ÿ131¸òàèSS’ô´†wž>RƒYR[ý VGŸ?’¤hxÛá3`s:ü/¿ÀD’jXÿ¼ÂgDj0‹Bj«³ÿÛ£ÏIÒÕ=òƒás`£V<;º9ú¨”$m ÎÁSÍeQH}-Û2W­‡¢Ï IÒT=qnmóÂøY°ý³¶Ž>&%IjØÏ­•Ï Ÿ©Á, ©µÁ•_>†$I Tÿâ=Ãç ÀÓµwÿõ/Ê—$Õ/ï'|Æ‚³(¤ÖþöîØÒ³®óøé΄%¨DQTPD–¨Ì€Â 8ˆQPqAEj¤dúöš•tbö­B&!ûIÙÈBÙÈ! YHw’nÒÝI¿ïÙß÷™zOBÈÒË]Ïÿ,ŸOÕת©«nwŸû<¾¿Ü{NóÄEŸCÌ•²LcÞ~×HÒ“-Þ.Þ}:° íKÇß F;C¡ºêGŠS§}0GÊu÷øõI“Ól£~7ü®ÈF؂֟¿/²1ÈP¨¡¨¸ÿêè3 €9æS%EÔ<õ¯£?&¡~Ø[ÂïŒl 2j¨^¨Œ¶Æñ¿s$Oõƒ~=¥V}ô°ec]Ên~odc¡PCQý€×EŸKôA™­î½åDô½#iô«>q½X}{ô±À$to?3üÞÈÆ$C¡†¦êý«“7ªž˜~ïHá&æ¥Î­§FwLRëkŸŽ¿;ŒG†B Mí+ö‰>›è“Ö¹Ÿ ¿w$n­ó?}Ì0õ-üîÈÆ$C¡†¦ÆŠwFŸMôK·•ê‡ÿvøÝ#iôj¬Ø%¥n;ú”`’ÊÇVùm“ýËP¨áiáV©ÌŽ>£è“rݽ)ß}§øûGÒÈ”/ß9•Œ>Þ˜‚Î Ç„ßÙe(ÔPÕ¹öˆè3 €>êÞqnÊ&æ‡ß?’†¿|ÙŽ©xð¦èc €)jž´kø’Q†B U/ÿAô@Ÿµ.üBøý#iÈ[¸u2E×o˜,èo†B W‹¶Ieý‘è£ €~*º©qÌ{âï IC›ßJNÝ{/¿C²1ËP¨¡«zÆKY_›êÿõKáw¤á«uÁDaLS5ZEß#Ù˜e(ÔÐÕ8î¢Ï*«oOùn/¿‡$ OÍ?”RYD_LSýàß¿K²1ËP¨ákñv©l>}^ {ç×S¶p«ø»HÒÀ×øÒÿH©Óˆ>¶˜¦ò±U)›˜~Ÿdc–¡PCY禯DŸYi_ñÅð{HÒ`×8ò)µ²èã €è\wTø}’a†B eÍþ4úÌ PëkŸ¿‹$ fÕ¯©Uïk Àp«žû£ï”l 3j8[òÿ•`œ•EjœðÁøûHÒ@Ußÿµ©ÜðPô ÀLuÛÞ›zAL†B m[O>ºˆÔ®§úo ¿$ Fõý^ÊÇVFŸLÌ‚î/ ¿W²1ÍP¨¡­yò‡£Ï.‚•Ùé¾ßkÂï$I0®»7úH`–´¾þÂï–lL3jhË—>¯÷Ó$Œ·rýý)_¾sø½$)¦ú¯Kå£DEÌ¢úA¿~¿dcš¡PC]÷{gGŸ_ €bõ÷R¾çKÂï%Iý­~è›R™¯‰>‚˜EåÚ†ß/Ùg(ÔP×<ío¢Ï0D±òzoz-Q»¤²±>úè`–µ¿µ_ø“q†B uÕaê4£Ï1D÷¾+S¾lÇðûIÒÜÖøò¦ÔΣæ@õ‚¢ï™lŒ3jèëÞ~fô9À)î¿:廽0ü~’475Oü³”º­è£€9ú ºláVáwM6Æ 5ôùôcž©XuCÊ÷xqø%ivkû™”Ê"úˆ`Žt®=2ü®÷Z†B }Kž“ÊÖ†èó €S<|[Ê÷ziü=%iæ-Ü:µ¿shô±Àkû¾ø;gÌk 5 un>)ú<`P? yï—‡ßS’¦_¾û‹R÷î‹£æXÙ|,e‹·¿wƽ–¡P£Pã„FŸi ¨bÍ)ÿâχßU’¦^¾ï«R±úöèc€>èÜtBø½£š¡P#ÒâíSÙX}®0 ŠGîJù>¯ˆ¿¯$MºêS/Ë|Môñ@Ÿ4Oúóð»G5C¡F§Î _Ž>×`åº{R}ÿ׆ßW’¶ÐļÔ:ÿs)èc€~é4S¾lÇø;HÉP¨‘©zÓSØœ²þHj¬xgø%iãåËžŸ:·ž}TÐgÝï5üR­—¡P£Ó­S™=}¾0è:ÍÔšR;>ˆPtS¾çKÂï"Õz 5R5Ž~WôÀi_¶GïýТï/i¬ÕøÆã¢uxiø}¤Ú“ 5ZMÌOåc+£Ï9†H5Rø¿ƒ¤þW?òí©xäÎè#€`ͳÿ9üNRíÉ …¹ÚW}Î0dºw}£÷“MÑw˜4-Ù!µ¿µ_Jeý­@´n;å{¼8þnRúI†B\õÃß}Ô0„Š5w¤ú¿~I£\ýà7¤âÁ›¢¿ÝÝ;Î ¿›T{Z†BdÅšïGŸw ¡²ùXjžø¡ð{L¹nZ|>¥n+úÛ€R}˜Uø¥ôÔ …ÉZMDŸw «²LíoîÖ{ßÛèûL…ê‡ÿv*VÝý À é4¼õË‚ÁËP¨‘,_¾sïA¦«ûƒóS¾ûNáwš4¬å»½0µ¯Ú?¥¢ýí ÀêÜzjø]¥Ú³2jdëÞ{yô¹À+×ÞêÿFø& UóRóô¿Ke¶:ú[€Ö<ñÏâï,¥gf(ÔÈÖ<ëãÑ磠Óè½·š_E–¶\}ÿ_NÝ»/Šþ®`Þ:[²Cø½¥Ú³2jdËwQJfôùÀˆèþð’”ïóŠðûMØ_3¾ryJÝvô·*C sãqáw—jÍP¨‘®sëiÑç#¤l>Úû‰õèûM˜mÛûž(³‡£¿="c߇)m,C¡FºÆWþ$úü`Uÿ!*ßãÅá÷œú>„'íÚ{O˜Š²þHï?4…ßeJËP¨ÑnѶ©Ì}0‚ÊÇV¥Æñ×I}®qÌ{R±ê†èoA†TçÚ#Âï2Õ6™¡P#_û;‡DŸƒŒ°îíg¥|ù/†ßwÒ\W?ôM©{çÑßr ¹ÆQ¿~§©¶É …ùêG¼-ú`Ôµë©uñ¢”-Þ.üÞ“f»Æ‘ïHÝï“RYF§0äÊu÷¤lb~øÝ¦Ú&3j,*ÖÜ}0ŠGîLcß~ïI³:À,i]¼0ü~Sm³ 5U‡ôKç–SRþÅŸ¿ÿ¤)71¯÷ޛžýmÀ¨) oײ`ð3j,Ê—ïÜ;” oÚyj_¾WÊwß)ü”¶Ø¢mSóÔ¿JŃ7Eç0¢ºw_ß)m)C¡Æ¦î]FŸ‹Œ¡²µáñÁpÙóÃïBé™å{ýlj]ðùT>ú£èoF\õ¤¢ï=Õ¶˜¡PcSó”DŸ‹Œ±2_Ód²Åۇ߉Rõ ÆkH©ÓˆþÖ` ”ÍGS¶ä9á÷Ÿj[ÌP¨ñiñö©¬¯>såº{SóŒ¿OÙ­âïFW‹·ï½öŠ•×G0f:×*M&C¡Æªö·Ž> §\{wjû™”/}^øý¨ÑÿéÁöÕ¦2ÿqôË€1U?òíá÷¡j“ÊP¨±û?”`Ð~§}Õþ)ßçÂïINùÞ/ë ÑŪ¢_⌹bÍ)›˜~7ª6© …»ŠUß>'àÙº­Ô¹å”T?ì-áw¥†øW‹OÚ5u¿wNJE'ú =½÷h޾#•&›¡PcWëkŸŽ>'`ÓÊ2uï¼ 5Žû£”-Ü:üÞÔ€·hÛÔ8ö½©sÝQ©l¬~õÀÓÝ”ïýòøûRi² 5vå»ï”R§}\À•­êýZrý ×‡ßŸ oß’;ß=6•uÑ/SؤîçÆß›JSÉP¨±¬sËÉÑç%LI÷Þ+RóŒùð“1-_öüÔ<å#©së©)µ²è—#LJóÄ…ß¡ªM)C¡Æ²Æ—ÿ0ú¼€i)[Rçú/¥ÆQ¿›²‰ùáwªæ®|ßW¥æÙŸHÝïÍoC0”¿‘-Ú&ü>UmJ 5žMÌOåúû¢ÏM˜‘2_ÓûõÓÞû.Þ.þ~ÕÌZúÜÔ8æÝ©}ù^©Xy]ôË f¤}éÒø»Uiª 5¶U‡ŒŒvÞû´Ûæiíýšjô=«I41?Õ}SïÓ »w]Øûäk™1Y¾sü]«4Õ …Ûò}_™RYDŸ0û:ÇGóþ)Õ÷{uø«'Z´mªñ¶Ô:ÿs©{ûY©ÌýJ€9QÝsá÷®Òt2j¬ëþàüèóúòA[NIͳ>žòå¿~ÿŽKù²{¿JܺxÑã?1Ø®G¿ /Ǿ7üVmZ 5Ö5¾ò'Ñç'ô]ñã¤ÎµG¤æÉNù^/ ¿G¢…[§úÁoHÍÓÿ.u®9,Ýâ7KåÚ»}àÚ‚áÍP¨ñnáÖ©|ôGÑç(„*} ÷«ÊíK§ÆñHù>¿GpÕ{@Ökï'4;×žŠ®éýº7zï½}W«6í …ûZ/Œ>G`à”ÙêÔ½óë©}Ù©yÒ®©~௦lñöá÷vßš˜—ò½_ž+ÞÙû)Áöå{§îç¥rݽÑÿ40¸:Í”ïù’ø{\iº 5öå{¿,¥n;ú8€¡PÖצbåu½÷åoŸò}_Õ{Áê§«?Oõçªþ|ekCô_5 ÎM_‰¿ß•f’¡Pª>Ôä¶3¢ÏS‰ŸB,¼)uᄄ÷ Ð¾ê€Ôºh"5ÏþDjœðÁÞOçÕø•”ïñâ¹yÏMù>¯è —Õ›¨7Oý«Ô:÷_SûÒ¥©ýCSçÖSS÷‡—öÞ?Ð'Àìk¬Ø%üù^µe(”ª5ùòDŸ§0žÚyï§ËìáÞ›ŸW+¯ïýT_÷žËzŸܽïÊÞÿ»×#w=þÿoýýÿïÕ×úÍÕˆ‹~¶WmÆ ¥ª‰ù½`êZ_ýTü³½ÒL3JOÔºà?¢ÏU:eóÑ”/{~øs½j3ßF …ÒãUï—”:èó†JûŠ}ŸéU›• …ÒSªÞx˜¤¢›ò}_þ<¯Ú¬d(”žRõ MÀätn>)üY^µYËP(=£ê“š€-«ñ;áÏñªÍZ†BéµÎùdô9 ¯¸ÿªðgxÕfw1JÏhÉsRY$ú¼€Ö¹ x¶ÖùŸ vWmÖ3J›¨{û™Ñç. œ²ùXÊw{Aøs»j³ž¡PÚD£?úì€Ó¾jÿðgvÕæ$C¡´™ŠoŒ>`pÝTßïÕáÏëªÍI†Bi35Ïü‡è#FçÖÓŸÕU›³ …ÒæZ¼]*³‡£ÏaõÃÞÿ¬®4W ¥-Ô¾lèsÂuïüzø3ºjsš¡PÚBùÞ/O©ÛŽ> Tã¨ß FWmN3J“¨sËÉÑç1„)î¿:üÙ\µ9ÏP(f=Û? IDATM¢Æ‘ïˆ>“ Lã¸÷‡?›«6ç ¥IV»`V•­LÙ’Ÿ¹U ÉP(Í î/‰>Ã`Ö4ÏþçðgmÕÂ2J3¨qìû¢Ïp˜åº{“}h¼3J3ib^*¼)ú,€kžñ±øçl¥È …Ò kžüÑg9ÌHñÈ)[¸uø3¶j¡ ¥™61?ß}¦À´5Oýëøçk¥è …Ò,Ô<í£Ñg:LK±æ?M¨Te(”f£…[¥âÇ?ˆ>Û`Êš'ýyüsµÒ d(”f©æ™ÿ}¶À”«¾Û{K­ègjÕ"C¡4[-Ú&•ëî‰>ã`ÒǼ'þyZiP2J³X뜉>ã`Rºw~=ü9ZµÊP(Íf‹·Kå£DŸõ°ye‘ê‡þVüs´Ò e(”f¹Öyÿ}ÜÀfunørøó³j—¡PšíoŸÊÇVEŸù°qFÊ÷yEüó³Ò e(”æ Öÿ}ìÀFµ/ß+ü¹YµÌP(ÍEKŸ›ÊluôÙOSÖצ|÷⟛•1C¡4Gµ.ü¿Ñç?}0ÎÊ25ŽúÝðçcÕ>C¡4×-Ú&•kS6V† …Rjžþ·Ñ÷㨧|ŸW„?«6 ¥~´p«T¬¾=úz`Ì´.üBü3±Ò°d(”úTó¤]£ïÆHõ6XÙâí߇Uš …R¿š˜—ŠU7Dߌ‰ÆñˆV¦ …Rk÷þè{€1нëÂðg`Õ†.C¡Ôçº÷\}_0ÊŠNªôëáÏ¿ª ]†B©Ï5Vì}e0ÂÚWîþì«ÚPf(”êÞyAô½À*³‡S¾Û Ÿ{UÊ …R@õƒßRѾ?1Í3>þÌ«ÚÐf(”‚êÜpLôýÀ)î¿:eóßwUÚ …RPùÞ/O©•Eß#ŒÊ˜òÆðg]Õ†:C¡XûÒeÑW # }Å>áϸª }†B)°|éóR¹áÁèû€!V®¿¯÷|ýŒ«áÏP(×:ç“Ñw C¬qüŸmU‰ …Rt ·JÅ÷Fß+ ¡Îm§Ç?×*J†BiªþëLEÙ|,å_üùðgZÕF&C¡4 uï¾(úŽ`ˆ´Îý×ðgYÕFªÖE½×Vmâí¿iœ«öæ”Ê2úž`+¯ë½•Uô³¬j#UûÒe½×W-[ºcø#{¾kte‘ꇿ5üVµ‘«}Å>½—X-ÛãÅá_Œ4îåËwN©Óˆ¾r`í« ~Um$k_u@ï5VËö~yø#©–ÚßÜ-úÎ`@•ëïOù²ç‡?»ª6’u®?º÷:«eË_þÅHª¥lés{?þÅHÚø§ 0¾:×)üùTµ‘/_¶ã“¯¹Zë²=ÿ IO¯ú±ò2[z!ǯ+ëSõƒßðäë®Ö¾ù¤ð/HÒ³kžù¡—q_ù“ðçRÕÆ¢êµöµî¾þIÚHóSñÀ5¡ý×ùî±ñϤJãRë¼{òµW+6¬ÿ‚$m¼úaoN©,B/(ú§|l•_9VêgëV<ùú«Uÿ#Ûí…á_”¤×¹á˜È; €>jÿÇáÏ¡ªUžýô¡°¾âwÿ(I/ßëgSÙXyOÐÕŠD?ƒª6^MÌO©•=}(l~õÇa’6YëÜÏDÞU̱ríÝ)_¶cøó§jcUý¿~éi¯ÃÞPؾöÈð/LÒ>Øäþ«£î+æRY¤ÆQ¿ÿì©4n5Oýëg…ÅÊë¿0I›¯~ÈS*:Q×s¤}éÒðgNgíïúì¡0u;)[òÜð/NÒæk_¹<èÚ`.ô~xkÑ6áϛϊ‡nÙÈPX} ÉÑÿ=ü‹“´…–<§÷¾Œ€V–êû¿6þYScY¾û‹z¿ö¾Ñ¡°yÑDø(iË5Ž}oÄõÀ,kžõOáϘßš'üé³^“O…;/ ÿ%M®Î-'÷ûþ`uo?+üÙRã]çÚ#7=¦vÓûJCR¾×KSY_Ûçk €ÙPf§|¯Ÿ ¶ÔxW®¿o3Caõ>…ÇýQø)ir5Ïþç~Þc̆²LãÞþL©ñ®~Ðë7úò|ÚPØúö!á_¨¤I61?uﻲ_W³ ýíƒâŸ'5öµ.šØòPX¬»/eó¿XI“«~௥Ômõë>`ŠUßMÙâíß%¥âá[·<VòÃßþÅJš|íoîÖû €([Rý€_ †”ê›øµã…­+÷ ÿ‚%M¡ÅÛ§bÍs}§0Í“?ÿü(-Øü=k(,]•6,ðëÇÒ0U?âwR*ºs}¯0 kn”²ª‰ù©\wïä‡ÂJã¨ßÿÂ%M©öûÌå½À4Þè} •¥Æ±ïÛìëu£Caû»Ç…á’¦Øâí6ùf¤ôŸ÷%T6`uo;cêCaj7S¶ûNá_¼¤©U?ü­~`@4OùËðçD){¢|ï—¥ÔmOc(¬^Ìçý{ø@ÒÔk_¶ç\ÜoLAçÚ#ߥì)µ¿¹û_·› »k~àCM¤a̯ „*º9eKvˆ>”<^¾ôy©¬?2ý¡°RÿÊÿ ÿƒHšzõCÞ¸Å'`´²T?àuáÏ…Rö”ZçýÛ¤^¾› ;÷~+ü"izµ¿¹Ûl]sLRó”„?JÙS[´m*×Ý;ó¡°’ñ¶ø?¤©·hÛÞ»Ðí+÷”<½æÙŸ˜ôkx‹Caçûç†ÿ$M¯ú!¿éWú ûÃKR¶pëðç@){j‹·Oå£?𽡰R_±KüLÒ´j_²x&w[P®¿?å{¾$üùOÊžQëüÏNéµ<©¡°s÷¥á0IÓlÑ6©Xyýtï;6§ÓHõÃÞÿì'-xzùn/Le¶zö‡ÂJýKïÿJš^õý¹÷É[Ì®æ 擲Ծjÿ)¿ž'=vº-m˜Ø*ü)iz5Ïú§)lZû;‡†?ëIÙFªðºi}fÁ¤‡ÂJóœ ÿƒJš~ÛNŸò!À³÷_•²EÛ†?çIÙFêÞõi½®§4–õµ)ÛýgÂÿ°’fðþëï›ÖaÀãÊ ¥ü‹?þŒ'e©yÚG§ýÚžÒPXi_sDøXÒôký®”ÊbÚ‡ÀXë¶ScÅ;ßí¤l#UŸ¾]ækú7¦²Lõ£ßþ—4ýÚ—í9íC`œ5ÏþDø3”m¢ÎM'Ìèõ]›Öxþã»Ò†Å;„ÿá%M³EÛ¤âkftxŒ›öUÄ?ÏI 6^óÄÍø5>­¡°Òºrßð¿IÓ¯¾ßkRÙÚ0ãC`tï8/e · –“²”ïó ½Ï  {¿‚|ìûÂÿ"$M¿æ?ãC`Ô«oï}8dô3œ”m¬‰ù©{÷ųòZ¯ÍèåÑU)ÛãÅñ!’¦]ç–“gå0Ee¶:åû¾2üÙMÊ6QëâE³özŸÑPXé|ï«iÃü¥Hš^Õ+×ß7;' À(é4}Â±Ò ×8îý)•Åà …•æŸÿ‹‘4ýêG¾=¥n{6Ž€‘Ñ<íoŸפlsŸ=ÐX7«¯ùY SÑMõcÞþ$iúµÎû÷Y9FAû²=ŸӤlåËvLÅC·Ìúë¾6k¿³__›ò}_þ%iúun=u¶Ž€¡Õ¹íôÞDD?£IÙÆZ¸Uê~ïœ9yíÏÚPXé>xKÊ–=?þ/LÒ´Ê—=??þÁl C¥Xy}Ê–>7üùLÊ6Q纣æìõ?«Ca¥s×ÅiÃÂmÂÿÒ$M¯úÁoH©]Ÿí£`àUô˜ïýòðç2)ÛD­‹Îé÷À¬…•öM'ú$diˆkžúWsq4 ¬²±¾÷ƒÑÏcR¶‰Z_ûôœÌÉPXi]±Oø_ ¤ÁüQf€Òi¤ÆŠ]Ÿäl5ÏúxJe9¼Ca¥uɲð¿HIÓlÉ©Xõݹ<"â•EjžøgñÏ`Ò‚×<ýo{¯Ó~˜Ó¡°ÒüƆÿ…Jš^õý^Óûñ{€QÕ:÷_ß½¤l5ÏþDßF¾ …•æ7¾þ+iz5Nø`_~¼ ßÚW|1ü™KÊ6QëÿÙ÷ …•Öå{û€iHk_¹¼_G@_tnúJÊ&æ…?oIÙ3›˜öÞ·¡°ÒþÎaiÃÄüø¿pISkÑ6©{ïåý<.æL÷î‹S¶hÛøg-iÁ3ZòœÔ¹õ´°ï¾…•Îç§léŽññ’¦T¾ÇϤríÝý>2fUñÐ-)ßí…áÏXRöŒò½^šŠ® ýþèûPXé>p}ÊözYø?€¤©U?ä7SjeÇÀŒ•ëïKù.üÙJÊžQýˆßIåúû£¿Eb†ÂJ±þG)?ä·Âÿ!$M­æI»úp`è”Jõý_þL%eϨõÕO¥Ôm¥A6ö´©qÆ?„ÿƒHšZíK—†SQÖצúÁ¿þ,%eO)_¶cêÜx|$±CáÚ7›6,Þ!üHÒ$›˜—:·œ}tlY;O»Ä?GI ~Zýð·¦â‘;Ó ˆ¡°Ò}ðæ”ôúð(I“+_ú¼TŸ6,Ü:üTÒækó/Ñ'À“ªO‘~N’²‰ù©yúߦò±•iX îPø„RýÈwÄÿãJÚlk>.RëÂ/„?I»¤âkÓ°ø¡°§,Sûæ“S¶ÏÎáÿÐ’6Ñ¢mR÷žoFŸÀk_¾wü³‘ƺú!¿™º·Ÿ•†Õp …?Ñn¤Ö7÷LÙn/ ÿ‡—ôìòÝwJÅšïGŸÀj_}`Ê&|8ªbªü†Ô½íŒÞ» ³á ŸP47¤ÖeÕ`øÂð‚¤§—ïûÊTnx(ú˜ÆHçÚ#„ ©qä;R÷{ç ý@8ÔCáOõu©uÉ’”íùßÂ_’~Zý°·¤ÔÊ¢` ´¿sˆ‘PýmÉ©yÚߤbÕwÓ¨ê¡ðIVjßplÊüµø‹¤^ÿ÷?S*:ѧ0Â:×­è}²lôóÆ£ú¿šÚ—ï•Ê|MU£1þDY¦Î]¦ÆÉNmþ’ƽÖ9ŸŒ>€Õ¹æp?I¨9¯¾ßkzŸ¤]E‘?’ZWòÃÞ’6 À KתO˜MÞ“PsÖÄüT?ôM©uáÿMŪÒ¸١𩊵÷¤Öå{§ü°7 ¥~71/un>1úF„_7Öl—ïûªÔ<í£©sãq©ÌNãl,†Â§*]•Úד'ýEÊvß)üÅ(E‹·KÝ{.‹þö†\çú£„šQù^/McÞZç.un;=•Œ~Y”± Ÿ¦è¦îªSëêƒR㔿LÙ>;‡¿`¥Q-ßýE©X}{ôw=0¤:×ÉH¨-–/}^Ê—ïœêG¾=5OùËÞû V¿ªÞ½ûâ‘þ’Ù2ÞCáFÙšÔ¹ëâÔúÖ©qæ?¦úoOÙ^/ó+ËÒ,”/ÿEÿµ˜º²è =Ý».”ž¬Xy]ê>pmê>xs*} ¥v#ú•:ô …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†BÀP C!P1†BÀP €Š¡0†BÀPT …€¡0†B b( …€¡0C!`( …€¡¨ C!`( …@ÅP C!`(*†Bþ;v@€0¨jÝ{@ ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(pP&é ßIDATD! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢…€(" QˆB@…€(D! €ˆB@¢…@D! QˆB ¢…€(D!QˆB@¢ˆ(D! QD¢Æ‰•È[/BËœIEND®B`‚ (V ( ~  (¦ 00 ($Î@@ (@öA(  3—öì|ôÿ~ôÿÇâýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«Ôûÿ}ôÿ>œöé|ôÿ|ôÿg±øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU¨øÿôÿ|ôÿ|ôÿÎæýÿÿÿÿÿÿÿÿÿÿÿÿÿèóþÿ2–öÿ|ôÿ,“öÿÙëýÿÿÿÿÿÿÿÿÿÿÿÿÿ¿Þüÿôÿ|ôÿ‡õÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿs·ùÿ|ôÿ|ôÿ|ôÿX©øÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûÿÿ ôÿ|ôÿS§øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)‘öÿ|ôÿ|ôÿ|ôÿƒõÿf°øÿœÌûÿÒèýÿüýÿÿ‡õÿ|ôÿ‘Æúÿÿÿÿÿÿÿÿÿÿÿÿÿâðþÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ‚õÿ€ôÿ|ôÿÆâýÿÿÿÿÿÿÿÿÿÿÿÿÿ¢Ïûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿôÿ}ôÿöúÿÿÿÿÿÿÿÿÿÿÿÿÿÿxºùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿôÿˆõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP¥÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿôÿ$Žöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/”öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿôÿ„õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿO¥÷ÿ|ôÿ|ôÿ|ôÿS§øÿN¤÷ÿˆõÿ|ôÿ|ôÿ|ôÿôÿ|ôÿÕéýÿÿÿÿÿÿÿÿÿÿÿÿÿåòþÿW©øÿ#Žöÿq¶ùÿûýÿÿÿÿÿÿÿÿÿÿáðþÿq¶ùÿ|ôÿôÿ|ôÿW©øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿ7˜öÿ|ôÿôÿ4–öí|ôÿŽÅúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„Àúÿ|ôÿ|ôÿ8˜öì(0 @U¨÷¶ óþ|ôÿ|ôÿ‰õÿëõþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿc¯øÿ…õÿ‡ôþc®÷¯ ôÿ|ôÿ|ôÿ|ôÿ¶Ùüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóùþÿ$Žöÿ|ôÿ„ôþ|ôÿ|ôÿ|ôÿ8™öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿäñþÿöúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡Ïûÿ|ôÿ€ôÿ|ôÿ|ôÿ|ôÿ¢ÏûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁßüÿ‹õÿ|ôÿ€ôÿ]¬øÿñøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýÿÿ†õÿ€ôÿ|ôÿ|ôÿ~ôÿï÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï÷þÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿP¥÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR¦øÿ€ôÿ|ôÿ|ôÿ;š÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÅúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿíöþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†Áúÿ€ôÿ|ôÿ|ôÿz»ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9™öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿa®øÿ§ÒûÿÝîþÿÿÿÿÿÿÿÿÿÿÿÿÿ–Éúÿ€ôÿ|ôÿ|ôÿ²×üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñøþÿ~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ†õÿI¡÷ÿ½ùÿk³ùÿ€ôÿ|ôÿ|ôÿèóþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·Úüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ‹õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|¼ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿS§øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI¡÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ~½ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ›Ìûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëõþÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ¸ÛüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏæýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ¾ÞüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀßüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ¬ÔûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝîþÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ.”öÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿ|ôÿ}¼ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS§øÿ|ôÿ|ôÿ|ôÿ|ôÿN¤÷ÿÿÿÿÿúüÿÿÍåýÿ–Éúÿa®øÿ+’öÿ}ôÿ|ôÿ|ôÿ€ôÿ|ôÿ+’öÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüÿÿŽÅúÿCž÷ÿ6˜öÿ~½ùÿøûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¶ùÿ|ôÿ|ôÿ€ôÿ|ôÿ|ôÿ¬Ôûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèóþÿ ôÿ|ôÿ|ôÿ€ôÿ ôÿ|ôÿŠõÿëõþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\«øÿ|ôÿ|ôÿ|ôÿƒôþX©ø¹ ôÿ|ôÿ;š÷ÿóùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘Æúÿ|ôÿ|ôÿ|ôÿ ôÿY©÷¶( @ j²÷g"õø|ôÿ|ôÿ|ôÿ|ôÿH¡öúüýÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîäñýð#Žõý„ôþ„ôþ,’õõ{»ù_Œõù|ôÿ|ôÿ|ôÿ|ôÿ‡õÿîöþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿Þüÿôÿ|ôÿ|ôÿ+’õ÷|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ—Êûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿv¹ùÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿõúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿßïþÿäñþÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿï÷þÿ ‚õÿ|ôÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿr·ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÍûÿˆõÿ|ôÿ|ôÿ‰õÿ…Àúÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa®øÿ|ôÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿÌåýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦Ñûÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ^¬øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£Ðûÿ|ôÿ ôÿ|ôÿ|ôÿ|ôÿ‡õÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøûÿÿŠõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿÕéýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáðþÿ|ôÿ ôÿ|ôÿ|ôÿ|ôÿ[«øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°Öüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿŠÃúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„õÿ ôÿ|ôÿ|ôÿ|ôÿ™ËûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZªøÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ<›÷ÿ²×üÿçóþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠõÿ ôÿ|ôÿ|ôÿ|ôÿÑçýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‹õÿS§øÿŠÃúÿ¿Þüÿòøþÿÿÿÿÿ'öÿ ôÿ|ôÿ|ôÿ ƒõÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒèýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ~ôÿ+’öÿƒõÿ ôÿ|ôÿ|ôÿ@÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•Éúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿt¸ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿYªøÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿ©Óûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿÝîþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòøþÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿôÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄáüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ Œõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ•Éúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ=›÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw¹ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿU¨øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^¬øÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿR¦øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿW©øÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿA÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp¶ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿˆõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈãýÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ`­øÿìõþÿ·Úüÿ¾úÿL£÷ÿ‡õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿÖêýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…Àúÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ9™öÿð÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßïþÿ©Óûÿs·ùÿ&öÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿ~½ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍåýÿnµùÿ=›÷ÿDŸ÷ÿ‡Áúÿõúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:šöÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿ„õÿíöþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀßüÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ|ôÿ|ôÿ|ôÿe°øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýÿÿ2–öÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ Œõú|ôÿ|ôÿ|ôÿ¨Òûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ&õøn´÷j"Žõù|ôÿ|ôÿ€ôÿ¹ÛüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÓûÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ"õøpµöh(0` UªÿW¨÷©"õ÷}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ~ôÿµÙûóÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîüýÿîV§÷ù„ôþ„ôþ„ôþ…ôþ1•õôo´ø›ÿÿÿV¨÷­|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…Àúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôùÿÿ1•öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿoµø Šôú|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ-“öÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛíýÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ.“õ÷}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÄáüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÅúÿ|ôÿ|ôÿ|ôÿ|ôÿ„õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿDŸ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüÿÿ#Žöÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ¹Ûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûÿÿÔéýÿÃàüÿÚìýÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”Èúÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‹õÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð÷þÿm´ùÿ„õÿ|ôÿ|ôÿ|ôÿ…õÿd¯øÿÝîþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóùþÿ ƒõÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿyºùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëõþÿ+’öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ‚ôÿ¯ÖüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS§øÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÄáüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ¢÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿÏæýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÍûÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ„õÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½Ýüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿL£÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔéýÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿR¦øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH¡÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ~ôÿï÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿ ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ™Ëûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíöþÿôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÆâýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%öÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ×êýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‡Áúÿ÷ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<›÷ÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ¢÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿôÿ4—öÿj²ùÿŸÎûÿÕéýÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI¡÷ÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿH¡÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýÿÿ ƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ‚õÿ;š÷ÿnµùÿ¡ÏûÿÔéýÿÿÿÿÿÿÿÿÿI¡÷ÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ€¾úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËäýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‰õÿO¥÷ÿ!õÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ·ÚüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿêôþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ¦÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ!õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿ‡õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿV¨øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛíýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿŠÃúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÓûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ¾Þüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{»ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿîöþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK£÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ‡õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ=›÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêôþÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿYªøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆâýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿm´ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­Õûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ½ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”Èúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ½ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~½ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿz»ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡Áúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿk³ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÌûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿCž÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜíýÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ_­øÿW©øÿ!õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ‰õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK£÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ<›÷ÿýþÿÿÿÿÿÿÿÿÿÿêôþÿ´Øüÿ½ùÿI¡÷ÿ†õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿÕéýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãñþÿ"õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‡õÿÛíýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜíýÿ¦Ñûÿp¶ùÿ;š÷ÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ¾úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèóþÿYªøÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ+’öÿÕéýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüÿÿ#Žöÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ'öÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßïþÿ‘Æúÿe°øÿU¨øÿm´ùÿ­Õûÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»Üüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿžÍûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEŸ÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ|ôÿ|ôÿ|ôÿ|ôÿ‹õÿöúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶Ùüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿk³ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûÿÿ(‘öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ„õÿŠôú|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ­Õûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿm´ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ(‘õù[ªö°|ôÿ|ôÿ|ôÿ|ôÿ|ôÿƒõÿÉãýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«Ôûÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ_¬÷«ÿ\«÷®"Žõù}ôÿ|ôÿ|ôÿ|ôÿ…õÿÐçýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁßüÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿ"Žõù]«÷¬ÿ(@€ i´÷"H¡÷̉ôú~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ2–õûöúÿïÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿîÿÿÿî£Ïúô Œôý Œôý Œôý Œôý Œôý Œôý.“õ÷`­øÀ¦Òÿkµ÷&‹õù|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‡õÿãñþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs·ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ3–öö¢ÌÿEŸöÔ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ¸ÛüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿF ÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ_­øÈ†ôý|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿV¨øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçóþÿ‡õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ)‘õû}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ‚õÿäñþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦Ñûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ†õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿt¸ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿ;š÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿåòþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿Þüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ`­øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòøþÿÉãýÿ°Öüÿ¸ÛüÿÓèýÿøûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/”öÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÀßüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔéýÿS§øÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ƒõÿS§øÿ¿Þüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›Ìûÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ!õÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›Ìûÿôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿN¤÷ÿîöþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîöþÿ~ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿw¹ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤Ðûÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ*’öÿï÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@÷ÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÅáüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜíýÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿS§øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰Âúÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‡õÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZªøÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÉãýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾Þüÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿYªøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàïþÿ~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿh±øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîöþÿ}ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿšËûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¾úÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ!õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠõÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÚìýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#Žöÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿð÷þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4—öÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ‡õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓèýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÖêýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK£÷ÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿN¤÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…Àúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ†õÿI¡÷ÿ½ùÿµÙüÿêôþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_­øÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ†Áúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?œ÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ!õÿW©øÿÄúÿÃàüÿõúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa®øÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ¾Þüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøûÿÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ~ôÿ*’öÿ]¬øÿÆúÿÃàüÿùüÿÿÿÿÿÿÿÿÿÿa®øÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ~ôÿóùþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄáüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ‚ôÿ=›÷ÿs·ùÿ9™öÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ/”öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡Áúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿe°øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ¢÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ™Ëûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿ„õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿÍåýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏæýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ€ôÿúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”Èúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ7˜öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿa®øÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿk³ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1•öÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿŸÎûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüÿÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿÒèýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐçýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ~ôÿøûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Îûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ$Žöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿq¶ùÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿK£÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿl³ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ€¾úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòøþÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ”ÈúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒèýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ¨ÒûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÜüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ¬ÔûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÓûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ¦Ñûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡Ïûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ Îûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§Òûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ“ÈúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁßüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿm´ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòøþÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿ~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿEŸ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU¨øÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿc¯øÿóùþÿÃàüÿÆúÿ]¬øÿ*’öÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿŠõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍåýÿ~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿˆõÿêôþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçóþÿ²×üÿ|¼ùÿG ÷ÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿÝîþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÂúÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿôÿ¼ÝüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÚìýÿ¤Ðûÿnµùÿ9™öÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ’Çúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’Çúÿ€ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ ôÿ­ÕûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúüÿÿÌåýÿ”Èúÿ~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ5—öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝîþÿ[«øÿ ‚ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿEŸ÷ÿÓèýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®Õüÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿËäýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöúÿÿ¶ÙüÿÄúÿp¶ùÿxºùÿ–ÉúÿØëýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=›÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿR¦øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇâýÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿÀßüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>œ÷ÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ.”öÿøûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©Óûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ…õÿ}ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿoµùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñøþÿŒõÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ†õÿ‡ôý|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ}ôÿ±×üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[«øÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ!õûI¡õÕ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ†õÿØëýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢Ïûÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿO¥öÐy¸ø(‹õú|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿŠõÿÞîþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃàüÿ ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ õù‚Àø%x»÷&K¢÷щôü~ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ!õÿãñþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕéýÿ…õÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ|ôÿ~ôÿ‰ôüL£öÐ|ºø%‰PNG  IHDRxx9d6Ò pHYsèèµ{Rk ÃIDATxœí}VUÀßõ4£ÐÊB§2«±œ&' ›¦˜Êfú2Ëfš©É>¦ìKÌɦ°Ø/Ù…X–•EFEäkEV TB@å#\ AVhaϽ÷ÜϧyÎ ¸ïûÞûÞsŸsÏžßÌó3ûrÏó»ßç¹Ï)€Ak Ô`‹¬9F°æÁšckŽÜ߇w_1¬–¡Àš†k+¬é×Axü ÍhT& Áyì§±óY2š†€Õr=ðŽ» xswÁ¾ ¼ý`5çUHöä« :¶?ãÌåÏç¾/$Îoɨ=øò;ï Á¾ öœ*úq{ÒÇ ê1Gn)"ûØÍŸ”']<øS’…`¾ô¶Š~Ðjz?„G^)98C/Q÷^°Æ_.U2òÏâÿ*_Vsnr¹£Ax`ó‰M7”K¸ÿy`u%ž®@x¤ |Ùˆä?R]þK–=(Ãéxÿœ&õ(vW×CÁªàzàvÜuÆ&âÂç_š`{öp(°ú‹ý±Óú€0ˆ= ÃéDV—¸‡‘!Øj¾ ‰þ°a0DÝûÎØTCR‚íË<ñÊd‚ý­sÆðö8m7ª!Ø™û­>6ÑP Ñ÷«¿XpÝí¬h †¾qWÕÐ vWÕÙÛç¾¶ìI•,¸æ\Q ÊuÉ™ýåTŲ·&c‡!:öÁÀBoÿ…ÄÎkc-\í€tÆTJ0^§” ðÀi.M.;9ÞæOHß¡±f 'pªg䬆wËÛiK öV׃ ¸Ëÿ ].;ÎCßMm»#~ ‚ÎUà==Fü®ì2Ø‚ñfF‰Ò– o6XÌð7Έ¿¡ áþàm˜ ü±ŸôÖe¼ÝñWW)qýuîÿZö‰=¢ã¯÷½QQa×Nð_xÜe#Àžñ9¹õU2[?ÔàÍGÚw̬Ìà n9µ(;رܧþ*±àZ^Å‚¬­%Æ]YM— ê*pÚ¾ Ö=$%E°»ä7Ô~Ánù,y’XŽ£¨`ï™q´vC_|ŠA$¦«`ê7X8@ ¦³à`ÇRÁ8ãC ¦µà=OÓ Þõy‚˜Î‚©¿7ÂÇê1­¿¾…VðË ÉÄô>‚7Ñ î\Iž ¦µàýIã%‚:A,ç¡ôMØS'ˆå<”~LŠœnò1½_t´52'ÃÙ¨þþªrýj¿`O½†qy’XŽ£ø|ðœ¯Rûo]3y’XŽ£xEÇ„+¨ýŠš0ê$±G‰š¬sÈ?ÅRê$±GɪÊðЋ@5æ=ä‰bº V¡É™3sy¢XN£táûšFj¿¢6Œ:QLWÁ|Áµo÷Ç4ŽÒß&µ ¥ö ÁÞµä‰b9Ò_Ö]pZsi<«¢&å¬GYß«p'mßû)òd±Fy€o¹ŸÚ/p\ë@„1»í¿§ö Þ†{É“Åråõè˜9ŒÚ/„ûÖ‘'‹é*غû¢Í)¾c>c%I0†h$FŒ=õÓä cº Æ©á‹~Iž0¦«`wémÔ~ÁßÜJž0¦«`Þháe‚:a,gQ~·ÙÚ¢9)Q$š¢R'å(bµÆÎkÔ8s¿Iž4–£ˆ×/z]3µ_ðÖ4'é*˜?ú#j¿¢©uÒ˜®‚±1¦ ý*ÍÌRAŽ`Œ¨çµc°g\Ož8¦«`êÒ·c$yâ˜aÝó!±î¡÷ìx°ÿöñtc§7j°K{¿“9ú]¢³½Û~;øÛ9k!nÑJ1 ÁbAJj°ÂCÁ¾,­¨=_4(ǵ%°‡tøÆK%'{RŒM:UXqT§RZkâ•¢¸Ñ[7‚ÿ<+fÎâ’š`Œðà¿@·%àXV2Ç k?â rx?“V7ßTûÏßÔ{ŸS_fÃ`Ñ™ï[°%TÑöÄ* æ äD!Xc/%—ÈNFÝ@‘dìS«ØKßg…=ýÚôã € àŽF.v.\rùDL_-“--:ÁjTi”f¿œ6QÔç*-‰WÇ>’ä¸LæS ¶§_Gš¼QësçK*Ø]ñ'P>ÿfrÁœx&|ãåô«Páࣵ`xÙÝbm— +¢9Ý@NèƒÕôRÁqG@ól ‚q`;—‚ ¸Oþ‘L®5ö}b'#ÿ²rãjd*€KßRÅóÅ¿¢>83¿(G0®ó§ $ÏÄÕUbU6ò>£ÉŒ¾ùoP°kWæG1è{jŒ»È6V,Ø[;TÁ}ê/Ù ®¨Äç<Ø0Vª`\ÏW|§wAÈ û[æ€ àêåRã{X^[ž/Vã%R床Ü\ŠGÄÆ‹% ƽys+¨~K\jà,©ÜŽ‘™Î#xõ%·7Áά/j`_KI,¾L ¶/•(gÑìT‹Ù¥£ ø¦/þµxë–Xlã%bÔˆ¥ÀÇ£2vàtã©kU-¨JصKT#–] p÷E¢¬F|í2P‘rW…KM°XLZ‘kSŸD¡X KŽðõ&üÀþ¨^Äk«¿i„ûÖÓ÷+ç¯g+ë• Ù<)`«çÌ;­Ã3žÁm¿=Æ™5EÁâgVfb×#2Á¸JŠA|áÏcÞ¥,X̰Ú&qˆý—ðàÖØ|é ÆY–ù7SçBKœÖá±]Á=õïHU0F°g u>´Âßöp"ÖÔk `M¾*uÁö´Ï—²èBÔ½7ñ»u{ÞMPàK~›º` ï™&êÜäŸ(S²‰lœ…àÀ–²œcEý…½ß胯€+) n(à9‹n•r‹S5uµœìj¯h¢Ä;Ñ_TÏ{VòSê}.ó†ø<¶‚›_¾²æÔoõ F|kl%´)ÂâlCy`ˆÄU)ã.wÜoåÿ‚Otí¾b$X-C5 Ö0¸ò{)ûè[!*ï»íF°¦][vØ3‡³àð¶Îp­³~ò,Á½0‚5ÇÖ#XsŒ`Í1‚5ÇÖ#ôæ²æ»*4ÉõIEND®B`‚‰PNG  IHDR ¬Y¯€® pHYsèèµ{Rk IDATxœìÝyØ¥u}ßñ̰‹·³X¨ÁcVMLbRccš´&&6ÖÔ&¶©‰&­­½l¢ib}žY`Ø÷]vYqd†UÙ—¶æÜg¿ïo¯™hÊA–Yžç|ïsî×ëºÞÿûÏü~Çû÷a懠ÁʧVÆàös£wéžÑùÒ‡¢}Ü¿ŽÖ~»DkÑ6ÑúôIÒ¼Õ»p&û¨µþŠC¢5³ ý{®$I›Ôú½Á~ÿ2ÚÇýNtÎüË {„ÁçEµöÁì« Ýeÿ‹A7†«®ŽþµGG÷ÜEûØßŽÖî¯Èÿ¡*©yÍ,ˆþdŸŠ¡Åùßu%Iš«–½2Úǽ3ºçþ¯è_{L W]1èe_·cc° L¥²óT î:?º.ŠöñïŠÖ’òxJÒìV1¸î˜ì#`¢¬ÿKÒ¿ïJ’4_-Ú&ŠÃß²á/ßêßüù([ß;zæÁ*0Êu«£ÃIÑ9ó¯¢8øMþyIõkñv1¸õKÙÇ%ÀDê_¶Wþw^I’ÆÑÌ‚(þÙèœõ‘èßxŠ+0U VÉTcøàµÑ»tÏhæíÑšY˜ÿ£Q’ž¯¥;Æð®åÙ''ÀDësßüï½’$»™…ÿô7°.ÿû ÿÒl ûÙW2Àf3X&FÙ~2ú7œÏ ZË^™ÿ£P’6¢bÙ+£\¹"û˜ ýK–¦÷•$)µ=^/üyôoú\”µÙW3À&1Xê­WÄà¶/G狌֒—äÿð“¤M¨ØëµQ>rcöI 0Uzͦÿ•$©-Þ>Ú'ýAôo8Ñx˜«@ýôÛÏ©î˜ÿO’6£b¿]¢|üÎì`*õ.ütúw`I’jÕ’þy¼ÝuÙW5Às2XjcøÀ•ÑùÒ‡ŒT%M|íCÞÕÓe«S­·üé߃%IªeKwŠÎÙï;®F¬©ÊbMô®<8ŠC~.ÿ›$ÍAí£~-ªöšìã`úUUôÎùhúwaI’ê\qð›¢wéžQgßÜ«@ŽÁ}—Fç‹ÜðWÒgÿ8“¤¹ªsì;¢ê>}Ä4GUE÷Ì¥–$©ö-Ýqÿz[®Z‘}{ f° ŒO9ŒÁm_ŽâÈ·åÿ“¤9®sÜ;£ê­Ë>iš§F÷ –þX’¤I©8ü—£ÉÃ~ö-4ŒÁ*0ïÊÎÚè]q`´öy]ú.Iš:'½;bÐÉ>nš=Z=ýýéß‹%Iš¨öÛeÞ#ºþb`< VyS>ýpt/\­Ý_žÿ#K’æ©Î)ï‰t³\†½èœüéß%Iš¸v{YtÏýX”O­Ê¾Í)g° ̹ò©•~È´o—ÿ£J’æ±îç?Q²]¾¯ßŽÎqïLÿ~,IÒD¶hÛèœõ‘ AÀ|0XæLÙúnt—ÿ}´–ìÿ#J’æ¹îYލÊ죀gëµ¢sÌ¿JÿŽ,IÒĶtÇ û²X“}«SÆ`Øbeë±è^¸(ZKwÊÿÑ$Ic¨ûåÿf¬ PcUç©hñÖôïÉ’$MtK_Ýåÿ'Êö“ÙW;0% VÍ×kEï¢Å~ ¤ÿH’¤1Õ[þ‰ˆªÊ>xUñX´ùÙôïÊ’$M|Ë^½Ë÷ô²¯w`¬›epÛ—£µïÎù?Š$iŒõ¾þ²_6AõôCQìÿ/Ó¿/K’4 ìƒïœ“}½Ì`Ø$ï‹öÑ¿•þ#H’Æ]ÿâ%ÙG0›¡\sw{ÿXúwfI’¦¥öñïŠá£ßξâ d° l”ríCÑ9ë#ÑšÝ*ý‡$µ™Ñ¿â€ìc€-P>úí(–½2ÿ›³$IÓÒ¢m¢{îÇ¢l?‘}ÍÄ`xaå0zW­¥/Íÿ±#IcÕ«È>‰˜åÊ+£µtÇüoÏ’$MS{üHôo<5ûš&„Á*ð¼†ÝícÞ‘ÿãF’²ÆªW–}0‡†÷\­ÅÛ烖$iÊjößEùäýÙW=Ps«Àô¢wéžÑZ¼]úIÊû›UÏ>˜ÃÛÎŽÖìÖùߢ%Iš¶–î¸ao²þ_óx.«ÀˆáWDqðÏæÿˆ‘¤¬ŒU¦Þà†ÏnøœþMZ’¤)¬ý™ßŒáê[³¯{ † VÒïD÷kÿ;Z3 Ó¸HRZ3 cpݱÙ'2cп|ÿüïÒ’$Mk‹·ÞåûG”eö•ÔˆÁ*°á¿j)û¥ü+’”ÙÌ‚\sdö‘ Àõ.ütþ÷iI’¦¸öñïŠríƒÙW>P«ÐdU½‡FkÉé?P$)ýoV½þøìS€½sþ{þwjI’¦¹=~$ß9'ûÊjÀ`ª\·:Ú'ÿaþIªÃXõ['fËd©ÊèžþþüïÕ’$My/~0¢Wdßü@"ƒUh ÁË£µçkÒˆHRz³[Åà†ÏfËdt£sÜ¿Îÿn-IÒ”Wò殾5ûæ’¬B“”eô.ÝsÃ@+ûˆ$¥g¬ À3TݵÑ>â-ù߯%IšòŠ¥/Á·¿˜}õ V¡!ÊÎÚè|îOÒtHR-2Và9T­ïFû ŸÎÿŽ-IÒ´7³ ºËÿ>b8Ⱦþ12X…>zKú?Ö’ôÏcÕ›NÍ>š¨©rÍÝQìõ£ùß³%Ij@íã~;Êuf_ÿÀ˜¬Â”Üvv´v{Yú IªE3 bpÝ1ÙG35W>zs»¿<ÿ»¶$IMhŸŸŒáªk²¯` VaZ•et/øô†qVú IªCƪl‚á=Ekñvùß·%IjBK^ƒ[Ï̾þyf° ÓhÐÎþ<ÿÇ„$Õ¥™Ñ¿ê°ìÓ€ 3\ÿ¯În•ÿ[’¤&4»Uô®<8ûúæ‘Á*L™²XícÞ‘ÿ#B’jTÿгg&TÿêÃÓ¿sK’Ô¤ºçýïˆr˜ý˜«0EÊ5÷DqÐϤÿp¤:Õ¿tì〠׻àÿ¦ï–$©IµO}oD¯ý˜c«0%†+¯ŠÖž¯IÿÁ IuªÉÒìã€iPUÑýÒMÿî-IR“*Ž|[”ëÍþÌ!ƒU˜ƒ{.ŠÖ’Ó(HRê}íï²g¦É°/ýû·$IMª8ð§£|jUö¯`Ž¬Â„|ç+ÑZ¼}úIªS½ó>ž}<0…ªîÓÑ>ü—Ò¿ƒK’Ô¨öÝ9Ê5wgÿ æ€Á*L°þM§EkÑ6ù? $©FõÎýXöñ À«ž~(ŠývNÿ.IR“*öý1|üÎìŸÀ2X… Õ¿á¤hÍnþƒ@’êT÷Ì¿Œ¨ªì#€)W®¾5Še¯Hÿ..IR“*özm ¹9ûg° Vaõ¯>"Z3 ÓHRê~é/"ª2ûˆ !†÷]­ÅÛ¥—$©I{¾&†ßý3ØL«0azW˜~ùKRÝê~áÏ"Êaö @à n>-Z3 Ò¿“K’Ô¤Š=^åoZ… e° ¤ýñþ¯$=«Î)1ìgÑ4Tÿ›û¤+—$©‘Óêw¿“ý3ØD«0!ú7œ­™…é¾$Õ©ÎñïŠt²h®wîÇÒ¿™K’Ô´Šýv‰ò©•Ù?€M`° `pë™ÑšÝ:ý¢—¤:Õ>ê×¢ê­Ë>¢ ¢*£sê{Ó¿K’Ô´Ú¾!ʧÉþ%l$ƒU¨¹Á]_ÖâíÒ/xIªSíC>ªöšì#þ¿~;ÚG½-ýº$IM«8ôç£,¼Ã$0X…Üwi´–ì~±KRjôƨZ«³høÕÓG±ïëÒ¿¥K’Ô´ÚGÿfD¯Èþ)¼ƒU¨©áãwEkW§_è’T§Ö䫞¼?ûˆ€çU®¾5ŠÝ_žþM]’¤¦ÕùÜû"ÊaöOà¬B •­ïFqÀ®é¹$Õ©bÏ×DùØíÙG4¼¨á]Ë£5»uú·uI’šV÷üOeÿ ^€Á*ÔM¯ˆâ¨_O¿À%©N­ÿ/Ñˇ¿•}BÀF\wlú÷uI’šXÿš£²ÏÃ`ê¤,£óù¤_Ü’T«–îÃ.Ï>¡`“õ–"ÿ;»$IMkÑ61¸û‚ìŸÀs0X…éž÷·ù—¶$Õ©%;ÄðÞK²gØpEöÏh,ƒU³î…‹ò/_IªIívjÝ£ÙG3¤(»=ŠÝ_žþ½^’¤&Uìÿú(;k³@#¬Â î¿|é‘}ñJR*öþñ¨ž¼/ûh€TûÏ÷†(IÒ˜ëœý×Ù? ‘ VaLÊîÓQ°kú…+Iu¨Øý‡£|ø†ì£j¡¿âôo÷’$5­Ámçdÿ€Æ1X…1é|ñƒé­$Õ¢%;Äðþ˲e¨•Þ9Íÿ†/IRƒ*öü‘(Ÿ~$û'4ŠÁ*ŒAÿ–3Ò/YIªE³[Çð;þ+5øå :ÇÿNþ·|I’T÷ô?Íþb° ó¬ì<­½^›~ÁJRz3 bpýñÙÇ2ÔVU<Åþ¯Ïÿ¦/IRƒøK—`l VažuÎúpúÅ*Iu¨ÉnÙG2Ô^ùÝÛ¢Øíeéßõ%IjJÅ~;GÙ}:û'4‚Á*Ì£Á½—lø³/VIÊ®{Ö‡³d˜ÃÛΊÖÌÂôïû’$5¥îòOf_ÿЫ0_ú(zcú…*IÙuNzwD9È>•`¢ô.Z”þ_’¤Æ4»u º>ûú‡©g° ó¤»üïó/SIJ®}ä¯DÕ[—}$À䩪èžþ§éßú%IjJí#5bè/c‚ùd° ó`øðþË‹ì‹T’2kðSQµVgÉ0±Öÿ¥íC>ý›¿$IM©õÙ×?L5ƒU˜íã7ý•¤ÌŠ=^åc·gÇ0ñª'ï‹bÏIÿö/IRZç–í'³¯˜Z«0Çú·œ‘~yJRjKvˆáWdÇ05†÷_­EÛä¿H’Ô€zçÿCöÕSË`æÒ Å»¦_œ’”ÖìV1¸õKÙ§1Lþ•ç¿H’Ô„oå÷e_ý0• Vaõ¾±Gþ¥)I‰õ¯><û(€©Õ=óCéo’$5¡îþ,ûÚ‡©d° s¤|ú‘h-Ý)ý”¤¬zçÿcöQ ÓmÐöQoK$iê›Yƒû/Ͼùaê¬Âéœñù—¥$%Õýâ#ª*û(€©W=µ2Š=_“þ6 IÒ´×9æ·²¯}˜:«0†~;Z3 Ó/JIʨsüïD {ÙG14ÆðÞ‹£5»uú$IÓÞàŽó²¯}˜*«0:Ÿû“ô R’2jü¦¨ÚOdÃÐ8ýË÷O'$iÚkæ×³¯|˜*«°…†^­™é¤$»bWG¹æ®ìc«{ÆI/$iÚܹ<ûʇ©a° [¨}Ò»Ó/FI{‹·rå•ÙG04[¿í#Þ’ÿn IÒ×þÌodßø05 Va W]íoW•Ô¼fÄà¦S³` "ª'ï‹bWå¿H’4Å ï¹0ûʇ©`° [ }ü»Ò/DIwýo,Ë>~€gÞ}~´f·JC$iZkýöì릂Á*l¦Á}—¦_†’4îº_ú¯ÙÇ/ðú—,MG$išÞ÷ìë&žÁ*l¦öIïN¿%iœuŽ}GÄ ›}üÏ¥ª¢{ÚûÒß$IšÖ:§üQömÏ`6Ãpõ­ÑšY~JÒ¸jü3QµŸÈ>~€PužŠöoHW$i*›YÃÇïʾîa¢¬ÂfèœùWù— $©bWEùøÙG/°ÊGoŽÖ’—¤¿/H’4õÎûxöUÍ`6Q¹îÑh-Þ>ý”¤±´hÛÞ{IöÑ l‚ÁM§æ¿1H’4…»íeûÉì«&–Á*l¢îÿ7ýò“¤±4³ 7žœ}웡{öGòß$IšÂúWœ}ÍÃÄ2X…MÑkEkÙ«Ò/>IGýK–fŸºÀæt£}Ä[Óß$Iš¶ÚìQ³oz˜H«° úW™~éIÒ8ê~ñÏ#ª*ûض@õĽQ,{Eú»ƒ$IÓÖðޝf_ó0‘ Va‡ÿrú…'IóÝúÿÚ:úEö‘ ÌáíçFkfaúûƒ$IÓT÷ô÷g_ñ0‘ Va# W]“~ÙIÒ|WìýãQ­}0ûÈæPï‚O¥¿AH’4U-Ú6ªâ±ì+&ŽÁ*l¤ÎYÉ¿ì$i>[²C”^“}Üs­*£sâïå¿EH’4Eõ¯:,û†‡‰c° ¡ì>­¥;¥_t’4oÍ,ˆÁͧe·À<©Z«£Øç'òß$$Iš’ÚGþjöõÇ`6BÿÚ£Ó/9IšÏú/Î>j€yV®\±áŸ0Î~—$iZ*½9ûz‡‰b° ¡8òWÓ/8Iš¯º§¿?¢ª²Z` ú—ï—þ6!IÒ´Ô[þÉì«&ŠÁ*¼ˆá#7¥_n’4_µxKD¿È>j€q©ªèœòžô7 I’¦¡bÊìÛ&†Á*¼ˆî×ÿ!ýr“¤ù¨ØëµQ=µ2û˜Ƭj?Å~»¤¿UH’4 ïÿföÕÃ`^D±ÿO¥_l’4ç-Þ>Ê•+²X I¹êêh-Ú6ÿÍB’¤ ¯÷µ¿Í¾Öab¬Â ®º&ýR“¤9ofA n<%ûˆ’õ¿¹Oþ»…$IÞú¿µ<ª*ûZ‡‰`° / ûµ¿K¿Ô$i®ë]ð©ì㨃ªŠÎ©œþv!IÒ¤W>|Cö­Á`žOYFkßÓ/4IšËÖtŠªÌ>a€š¨ŠÇ£Ø÷uéo’$Mr½‹f³¯t˜«ð<†\™~™IÒ\Ö>èQužÊ>^€š)W]­EÛ¤¿eH’4©µý¹ìë&‚Á*<îW?ž~™IÒ\Uìþò(»#ûhjªÙÞéï’$Mråš»²¯s¨=ƒUxÅ»¦_d’4'Í,Œáíçf«@UUtNù£üw I’&´þÕGdßæP{«ðÊ5÷¤_b’4Wõ¿±,ûX&@Õ^Å~;§¿mH’4‰uO{_öUµg° Ï¡·âÐôKL’æìqUe«À„ÞY´f·Jã$iÒ*–½2¢*³¯r¨5ƒUxíÏþ»ôKL’¶´öÁ?Uwmö‘ L˜þÅ‹Óß9$IšÄʇ®Ï¾Æ¡Ö VáÙúíh-yIú&I[R±ìQ®¹+ûD&QUFçøßIï$iÒêsŸì[jÍ`žepÇyé——$mQ3 cxÇW³S`‚UkWE±Ç«òß=$Iš :'þ~öµf° ÏÒ=÷cé——$mIýËöÊ>J€)0¼ýÜhÍ,Hû$ibZò’ˆA7û ‡Ú2X…g)þÙüËK’6³Îçþ}DUe¥À”èóÑô÷I’&©råŠìëjË`ž¡l?±áŸÒξ¸$isjö ½VöQ L“A7Ú‡ýbú;ˆ$I“RÅ!Ù·7Ô–Á*<Ã`ý?iQƒ‹K’6µbÙ+¢\swö1 L¡rõ­þ‰ãì÷I’&¡îÿ9ûê†Ú2X…gèžÿ©ôKK’6¹™…1¼kyö L±ÁµG翉H’4µzcöµ µe° ÏÐ>æé—–$mjýKvË>>€è~á?¥¿‹H’TûfDÕy2ûÚ†Z2X…ïôü3’&®ÎÉQ•Ù'(ÐëÇ7Å~»¤¿H’T÷†÷\”}mC-¬Â÷ W^•~YIÒ¦Tìÿú¨ÚOdŸ@ƒ ¸ü­ì£h ÞE³ùo%’$Õ¸îiÿ!ûº†Z2X…ïéœñé—•$mlƒëË>6€¦*ÑþÌo¤¿—H’T×Ú‡¼9û¶†Z2X…ï)ÿåôËJ’6¦îÙÉ>2€†«ž¸'ŠÝvJ7‘$©–-Þ.¢f_×P;«°Þ°­ÅÛç_V’ô"µÿ¥ˆ~;ûÔØð/Âe¿H’T×ÖÿÇÀ(ƒUX¿W}ôÛé—”$½XŲWDõĽÙG&À?ëžþ§éo(’$Õ±á_;¦¡v V!"ú7žš~IIÒ 6³0†wœ—}\Œ¨ÚOD±ïëòßR$IªYý+Ⱦ¦¡v Vaýõ÷õH¿¤$é…ê_¼8û¨xNû/Øð—od¿§H’T§º_þ›ì+jÇ`"¢}Ò»Ó/)Iz¾:'ünD9Ì>*žWïk›þ¦"IRê÷ÎìëjÇ`"¢Øÿõé—”$=WÅ~»DÕ^“}L¼°A7Ú‡ýbúÛŠ$Iu©Ø÷uÙ·3ÔŽÁ*”ƒh-Ú&ý’’¤hñvQ>xmö) °QÊÕ·Dkñöùo,’$Õ¡EÛDTeöõ µb°Jã•OÞŸAIÒsÔ¿êÐì#`“ô¯<8ýE’¤ºTµVg_ÍP+«4ÞàÞKÒ/'IzvSÞQUÙG$À¦©ªè|öߦ¿µH’T‡Ê‡oȾ™¡V Vi¼þõ'¤_N’ôÌŠývŽª½&ûxØ,ÕÚ£XöŠô7I’²ÞñÕìkjÅ`•Æë^¸(ýr’¤nÑ6Q®\‘}4l‘Á 'å¿»H’”Üàºc³¯d¨ƒU¯sÆI¿œ$éûõW’},̉îéïO{‘$)³þ%K³¯c¨ƒU¯}Ì;Ò/'IZ_÷´÷e‰s¦*‹b¯×¦¿ÁH’”Uïœÿž}C­¬ÒxÅoH¿œ$©Øoç¨Úk²D€95¼ky´f¤¿ÅH’”Q÷óÈ¾Š¡V Vi¼Öî¯H¿œ$5¼EÛD¹rEöq0/ºg}8ÿ=F’¤„:'ÿaö5 µb°J³•ƒhÍ,L¿œ$5»þŠC²OC€ùÓkEû€]Óßd$Iwc;û†Z1X¥ÑÊu«Ó/&IÍ®sÊ{"ª*û8˜WÃ.ÖìVéo3’$³öo;‚¡V Vi´áêÛÒ/&IÍ­Øoç¨Úk²B€±è-ÿDúûŒ$Iã¬}г¯_¨ƒUmpße铤†¶h›(W®È>ÆgÐö¡?ŸÿN#IÒ˜*öù‰ìÛjÅ`•FÜvvúÅ$©™õ¯<(û»ò¡ë7üÅÙo5’$£b·—e_½P+«4ZÿºãÒ/&IÍ«sòFTUö¢wáLú{$Iciv«ìkjÅ`•Fë­84ÿb’Ô¨Š½~4ªufyÊA´xkú»$Iãøÿü‰ ÑzßÜ7ýR’Ô fÆðî ²>€tå#7FkѶùï7’$Íg3 ²¯\¨ƒU­÷eù“¤ÆÔ;ÿ³=€Úè]´(ýýFæw`‚ IDAT’¤ymfaöu µb°J£ù?@’ÆUûÈ_ö²=€ú(Ñ>â­éï8’$Í[³[eß¶P+«4Z÷üÌ¿˜$M}ÅÒ—FùøÙG@í”Ü­EÛ¦¿çH’4/Ín}ÕB­¬ÒhÝóþ6ÿb’4õ n<%û¸¨­þÅKÒßs$Iš—m“}ÍB­¬ÒhݯüÏü‹IÒT×=óCÙG@½•ƒhù+éï:’$Íy‹¶Í¾e¡V Vi´ÎÙ1IšÚÚýtT½uÙG@í•Ü´aÔ“ý¾#IÒœ¶x»ì+jÅ`•Fëœõ‘ü‹IÒt¶h›(W]•}ÌLŒþ%Kóßx$IšË Va„Á*f°*i¾ê_¾ö0YÊA´xKú;$Is–Á*Œ0X¥Ñ V%ÍG?¢ª²8€‰S>rÓ†É.û½G’¤9É`F¬Òh«’æºb¯ªµ:ûx˜X½ ?þæ#IÒœd° # Vi4ƒUIsÚÌ‚Þþ•ì£ `² {Ñ>äÍùo?’$mi«0Â`•F3X•4—õÎùhö±0ÊUWEkv«ô÷I’¶(ƒUa°J£¬Jš«ÚìUo]ö±05zç}<ý H’¤-Ê`F¬Òh«’æ¤Ù­£\uuö‘0]úE´ø©ü· I’67ƒUa°J£¬Jš‹úߨ=û8˜JÃ{/ŽÖÌ‚ô÷ I’6+ƒUa°J£¬JÚÒÚG¿=¢fgS«{Ö_¥¿ I’´Y¬ÂƒUÍ`UÒµtÇ(¿3û(˜jUç©(öùÉü·!I’65ƒUa°J£¬Jڒן}Œ4Âðö¯¤¿ I’´É¬ÂƒUÍ`UÒæÖ9õ½ÙG@£t?ÿÓ߈$IÚ¤ Va„Á*f°*is*öþ±¨ŠÇ²0€F©Z«£ØãUéoE’$mt«0Â`•F3X•´ÉÍ,ˆá_Í>¾ið­òß‹$IÚØ Va„Á*f°*iSëû±ì£  ¹ª*:'ünú›‘$I•Á*Œ0X¥Ñ V%mJíƒßÑog]V>~g´–ìþv$IÒ‹f° # Vi4ƒUIÝìÖQ>xmö±@Dô¿±,ÿýH’¤Ë`F¬Òh«’6¶ÞE‹²,¾¯Dû°_LC’$é3X…«4šÁª¤©}ø/E {ÙGÏP®º*Z3 Óß’$IzÞ Va„Á*f°*éE[¼]”Ü”}\ðzç|4ÿ=I’¤çË`F¬Òh«’^¬þ¥{fU<ª»6Š}~"ýMI’¤çÌ`F¬Òh«’^¨ög~=¢fU¼€Á-g¤¿+I’ôœ¬ÂƒUÍ`UÒó¶xû(Wßš}L°:§¾7ÿ}I’¤gg° # Vi4ƒUIÏWÿг(6RõôCQìþÃéoL’$d° # Vi4ƒUIÏUçØwDTeöÀ&è¯8$ýI’¤‘ Va„Á*f°*éZºc”kîÊ>žØTUí£~-ÿ½I’¤ïg° # Vi4ƒUIÏnpÍ‘ÙG›©|èºhÍn•þæ$IÒ† Va„Á*f°*é™uŽWDUeMlÞ9Mw’$iC«0Â`•F3X•ôýŠÝ8ª§È>–ØBUwm{ÿxúû“$I«0Ê`•F3X•ôýß:!ûH`Ž n:5ýýI’$ƒUe°J£¬JZ_ç„ߨªì# €9Ô9þ]éïP’¤†g° # Vi4ƒUIÅn/‹ê©²#æXùøÑZ¼}ú{”$©Á¬ÂƒUÍ`UÒàš#³"æIïÂO§¿GI’œÁ*Œ0X¥Ñ V¥f×9ö·#ª*û(`¾ôÛÑ>à§Òߥ$I Í`F¬Òh«Rƒ[ò’(×Ü•} 0φw-Ï›’$53ƒUa°J£¬JÍ­ùþÙGcÒ=í}éïS’¤f° # Vi4ƒU©™µúµˆr˜}0&ÕÚUQì¶Sú;•$©a¬ÂƒUÍ`Uj`‹¶rõ-ÙÇcÖÿæ>ùoU’¤fe° # Vi4ƒU©yõ/Ù-ûè C9ˆö¡?—þ^%IjP«0Â`•F3X•šUû°_ˆö³’ ï¹0ýÍJ’Ô  Va„Á*f°*5¨Ù­£|èºìc€dÝÓþCþÛ•$©¬ÂƒUÍ`UjN½ >•}äPÕÚUÑZºcúû•$©¬ÂƒUÍ`UjFíƒÞ1èd9ÔDÿËÒß°$I È`F¬Òh«RšYÃ.Ï>n¨“A7Ú¾!ÿ-K’4ݬƒUÍ`Ušþz_ùÙG 54¼ëëéoY’¤)Ï`F¬Òh«ÒtWìýãQužÌ>j¨©Î©œþ¦%Išâ Va„Á*f°*MwÃÛÎÎ>f¨±ê©¢µä%éïZ’¤)Í`F¬Òh«ÒôÖýüÌ>b˜ý‹§¿mI’¦4ƒUa°J£¬JÓY±ûGõôCÙG “`ÐöoHã’$Ma«0Â`•F3X•¦³ÁõÇe/Lámg§¿qI’¦0ƒUa°J£¬JÓWç¸wFTUöñÀ„éœøûéo]’¤)Ë`F¬Òh«Ò”µd‡(×Ü•}´0ÊïÞ­EÛä¿yI’¦'ƒUa°J£¬JÓUÿ²½³&XïÜ¥¿yI’¦(ƒUa°J£¬JÓSû°_ˆö³&XÕ~"Š=^þö%Iš’ Va„Á*f°*MI³[EùÐuÙG S õáùï_’¤éÈ`F¬Òh«ÒtÔ[þ‰ìã€iQ7üë~Ùo`’¤)È`F¬Òh«ÒäWì·KT½uÙÇ SdxïÅéï`’¤)È`F¬Òh«Òä7¼ëëÙG S¨û¹?I “$Mx«0Â`•F3X•&»îÿ9û`JUOÜ­ÅÛ§¿‰I’&8ƒUa°J£¬J“[±ÛË¢zúáìc€)Ö»àSéïb’¤ Î`F¬Òh«ÒäÖ¿úðì#€i×/¢Ø÷_¤¿I’&4ƒUa°J£¬J“YûÈ_‰(‡ÙG 0¸á¤ô÷1IÒ„f° # Vi4ƒUi›Y媫²š¢ª¢}ÔÛòßÉ$I“—Á*Œ0X¥Ñ V¥É«wÎG³¦\ye´f¤¿•I’&,ƒUa°J£¬J“U±çk¢j?‘}tÐ@ÝÓÞ—þ^&Iš° Va„Á*f°*MVƒ>›}lÐPÕ÷le¿™I’&(ƒUa°J£¬J“Sç˜ßЍªìc€ë}íïÒßÍ$I”Á*Œ0X¥Ñ V¥ ivë(¹1ûÈ áªÎ“Qìñêü÷3IÒdd° # Vi4ƒUi2ê-ÿdöqôW’þ~&Iš Va„Á*f°*Õ¿bŸŸŒª·.û¸€R¢}È›ÓßÑ$IÁ*Œ0X¥Ñ V¥ú7¸åŒì£F ¿sNú;š$i2X…«4šÁªTï:'þ^ö1Ï©s¿IO“$Õ<ƒUa°J£¬J5nñvQ>vGö1Ï©|äÆhÍn•ÿ®&Iªo«0Â`•F3X•ê[ï¢Ùì#^P÷Ì¿LW“$Õ8ƒUa°J£¬Jõ¬Ø÷uý"ûˆ€T=ýP´–î˜þ¾&Iªi«0Â`•F3X•êÙàæÓ³Ø(½ gÒß×$I5Í`F¬Òh«RýjýöˆªÊ>`£T½uQìõÚôw6IR 3X…«4šÁªT³fFùàµÙGl’þU‡å¿µI’ê—Á*Œ0X¥Ñ V¥zÕ=û¯³Øtå Ú¿)ý½M’T³ Va„Á*f°*Õ§b·—Eµî‘ìc6Ëà–/¦¿¹I’j–Á*Œ0X¥Ñ V¥úÔ¿â€ì#¶HçèßLw“$Õ(ƒUa°J£¬Jõ¨}ðÏD ûÙGl‘råŠhÍ,H“$Õ$ƒUa°J£¬JõhxÇyÙÇ̉Ωœþþ&IªI«0Â`•F3X•òëœü‡ÙGÌ™ò±Û£5»uú;œ$©¬ÂƒUÍ`UJnѶþ;L“î—ÿ&ÿ-N’”ŸÁ*Œ0X¥Ñ V¥ÜzË?™} Àœ«Z«£Øm§ô÷8IRr«0Â`•F3X•ò*ö|MT§²˜½‹fÓßä$IɬƒUÍ`UÊkpݱÙGÌ›ªûô†¿Ä%û]N’”˜Á*Œ0X¥Ñ V¥œÚG¼%¢*³˜Wý+J›“$%f° # Vi4ƒU)§áÝdÿñ€ù7ìE±ÿëÓßç$II¬ÂƒUÍ`U“ÿ û>ŒÍà['¤¿ÑI’’2X…«4šÁª4æf·ŠòÑogÿÑ€ñ)‡Ñ>äÍùou’¤ñg° # Vi4ƒUi¼uÏúpö{»á­g¦¿ÕI’2X…«4šÁª4Æ–ìÕÚUÙì Eû3¿‘ÿf'Io«0Â`•F3X•ÆWï¢Ùì?òfxߥéov’¤1g° # Vi4ƒUi<{¾&ªîÚì?òªsâ勵ÝI’ƘÁ*Œ0X¥Ñ V¥ñ4¸æÈì?î®|èºhÍ,H¿“$)ƒUa°J£¬Jó_û 7F ûÙÜ º§¿?ý O’4¦ Va„Á*f°*ÍÃï|9û:ÔFùØÑšÝ:ýO’4† Va„Á*f°*Íocß‘ýÇj§{Ö‡Óßò$IcÈ`F¬Òh«Ò<6³ ÊUWgÿ1€Ú©žZ­ÅÛç¿éI’æ7ƒUa°J£¬JóW÷óÈþ#µÕûêÿJÓ“$Ís«0Â`•F3X•æ©EÛF¹æîì?âP[ÕºG¢µä%ùo{’¤ùË`F¬Òh«ÒüÔ;ïãÙ¼ özË?™þ¶'IšÇ Va„Á*f°*Í}ÅÒ—FÕZýÇj¯*b·—¥¿ñI’æ)ƒUa°J£¬Js_ï™ì?Ú01z~:ýO’4O¬òÿØ»óh»ëúÞÿ S‡Új«ö¶Öæþj{‹¿¶Š·÷×ÖÕ1·¿öZ½b‡å¥­mé½Ú_µ·žÂ4Dƨ@ŒBP FdˆÁˆH ŒÀ™Nö¼¿ûûþ­ì­_dÈpÎyソÇZÏ?ërÙïwïÏ7ûuö¾—Á*µf°*ÍlÍ#_eë±ì[FFÙ~"šG˜þYŸ$i2X… ƒUjÍ`UšÙzW-ɾ­`äô®8"ý³>IÒ,d° «ÔšÁª4s5—¼*¢×̾­`ä”ÝmÑ<æ•éŸùI’f8ƒU¨0X¥Ö V¥™«wÍDzoiY½uǦæ'Išá V¡Â`•Z3X•f¦æñ¯èw²oi]ýv4}uúg’¤Ì`* V©5ƒUifêßxföí #¯·þÄôÏþ$I3˜Á*T¬Rk«Òî×Zú†ˆA?ûv€ÑWt£yüëÒ?”$ÍP«Pa°J­¬J»_ÿæó²oeý¯Ÿžþ $i†2X… ƒUjÍ`UÚ½Z'½)¢dßÊ0>Š^4Ox}úg’¤È`* V©5ƒUi÷*nÿRöm c§ÝiéŸJ’f ƒU¨0X¥Ö V¥]¯½üàì[Æ÷[V]úg‚’¤ÝÌ`* V©5ƒUi×+¾uEö- c«Ý©éŸ J’v3ƒU¨0X¥Ö V¥]«}Öodß¾0ÞŠn4û±ôÏ%I»‘Á*T¬Rk«Ò®UÜ{uöí c¯wí)éŸ J’v#ƒU¨0X¥Ö V¥Ï·«À~Ëêñ¯MÿŒP’´‹¬B…Á*µf°*í|Åæ«²o]¨Þµ'§F(IÚÅ V¡Â`•Z3X•v®ö™oϾm ^|˪$n«Pa°J­¬J;Wqϕٷ-ÔNïš“Ò?+”$íB«Pa°J­¬J;^û“¿’}Ë@=õ;Ñ<ö5éŸJ’v2ƒU¨0X¥Ö V¥¯øÖÙ·,ÔVf(IÚÉ V¡Â`•Z3X•v¬Öò·fß®Po¾eU’F/ƒU¨0X¥Ö V¥«¸ûòìÛj¯·~iúg‡’¤È`* V©5ƒUéùkþ–ì[خߎæ‡8ý3DIÒf° «ÔšÁªôüw^’}«ßÕ»jIúgˆ’¤Ì`* V©5ƒUé¹kö‹Ù·)ð=Êî¶hýòôÏ%I;Á*T¬Rk«ÒsWÜþ¥ìÛxšîÚÉôÏ%I;Á*T¬Rk«Ò³×:åç#Ê2û6ž¦l?Í#HÿLQ’ô<¬B…Á*µf°*={ŦÕÙ·(ð,º—~0ý3EIÒód° «ÔšÁªô̵Nz“oW€!V6‰Æá/HÿlQ’ô¬B…Á*µf°*=sý›Îξ=€çÑ]óéŸ-J’ž#ƒU¨0X¥Ö V¥ï¯yÂë#ýìÛxåÔÑ8lßôÏ%IÏ’Á*T¬Rk«Ò÷×»öäì[ØA/üUúgŒ’¤gÉ`* V©5ƒU©Zó˜WFôZÙ·&°ƒÊ'îÆäÞéŸ5J’ž!ƒU¨0X¥Ö V¥j½¯™}[;©³êÝéŸ5J’ž!ƒU¨0X¥Ö V¥¯yÄ‹¢l=–}[;iðð¦hLì‘þ™£$éi¬B…Á*µf°*ý{Ý/ÿÙ·$°‹:ç¼#ý3GIÒÓ2X… ƒUjÍ`Uún“{GùÄ}Ù·$°‹ß¾.ÿsGIR5ƒU¨0X¥Ö V¥§ê|þ=Ù·#°›Úgüjúg’¤ïÉ`* V©5ƒUé¢1±G ¾5ûvvSqç%ùŸ?J’þ=ƒU¨0X¥Ö V¥ˆÎ9ïȾ€Ò:å ôÏ %IßÍ`* V©5ƒUébpß¿fߊÀ éßüÙôÏ %IßÍ`* V©5ƒUÕ½ö¿–}3iPDë£?™þY¤$É`žÎ`•Z3XUÝ+îº4û6fXÿë§§)I2X…§3X¥Ö VUçZ'ýlö-̆~;šþáôÏ$%©ö¬B…Á*µf°ª:׿ñ¬ì[˜%½«–¤&)IµÏ`* V©5ƒUÕµæ’WEô;Ù· ; l?åã÷Äࣸûò(nù\ôo:{úç{뎋Þ‡G÷’Dç  þ,:ç¾3:ç¼#Úg¾ý©>þŸ£uÊAOuâ£yÂïPÛ™ãßþïÚgüêÿùÏ›þÏ?÷]ѹðè~éE÷²™þ´Ý©Ñß°"úÏŸþï¹ý¿oùĽQv·eÿOPKeçÉhy@úg“’Të V¡Â`•Z3XU]ë}eqöíPOƒ"Ê©bðàMQÜqñôÀ³wõñѽø}ÑYµ0Ú+~3Z§ýb´–¾!šG¿<‹öL†œ‘&÷™þãÉÖ²ùÑþøÛ¢}öïE÷¢¿›Ûöoød·}1[nˆrjËôÿFÌŒî¥ÿœÿL(IuÎ`* V©5ƒUÕ²Ãö²±5ûö?E7ÊÇîŽâž+£ÿ•Ñ»òèè^ô·ÑþôÖÉ?Í%?‰yùÏ…ÃÞ¢=£yìk¦‡­óÿ$º—ýïéo“-îür ¾5¢ßÎþÿ4ÀÈ(·=4ýù`ú³ž$Õ5ƒU¨0X¥Ö VUÇ:ŸûËì[`4•ƒ(Ÿ¸/Š{¾ýΈîåŠÎy­Ó)šþacÔ¹jb^4û±hŸñkÑ]ý7ÑûÚG¢¸}M ¾sGÄ Ÿ}• Îþ*ÿYN’êšÁ*T¬Rk«ª]óbðÐ7³o=€¡V>yw_½kOŽîÿ>Ú+~3ZKß0ýËéÏuzî&÷ŽÖ²ùÑ9÷]Ñ»âˆ(nù\ ½szl PWƒGnÆÄùÏl’TÇ V¡Â`•Z3XUÝjŸùöìÛ`8½ozØ8ýM©§¾9šG¼(ýÙM³Ðâý¢uÊAÑùÜ_Dïš“bpßúˆ^+û*˜3í³/ÿÙL’ê˜Á*T¬Rk«ª[Û" nÊÇï‰â¶‹¢wå1Ñ9ï¢uÒ›¢1¹Oú3š’[´W´>ö3ѹàÏ£wÍÇbpß¿Fô;Ù—+À¬(î½:ÿ9L’ê˜Á*T¬Rk«ªS­¥?Q–Ù·Àìé·cðíë¢Ýiѹðhþ–hñâôç1P‡ý`´–¿5º¿?Š[>å¶³¯j€³ý99ý¹K’ê–Á*T¬Rk«ªS½kOɾåfN·Ž_›þfÌí?óÞ:ég£1¹wú³—Ưæ ?óÿ4ú×<Þ™}åì²þ-¤?cIRí2X… ƒUjÍ`Uu©yÔ½fö-°kE üÆôâuV½;ZËæGcÑžéÏZªgÍã~tú:ìßxf”ß“}wì¸A­üDús•$Õ*ƒU¨0X¥Ö VU—º—~0ûvØaeãá(6­ŽîeÿíOþJ4aús•ôl5Ox}t.<$Š[>eçÉìÛà9õ®=9ý9J’j•Á*T¬Rk«ªE“{GùäýÙ·À3+Ël½å»ßžº0ZýÉüç(iW›Ü;ÚŸø/Ñ»òèl¹aúú*½f4~yþó“$Õ%ƒU¨0X¥Ö VU‡:çýqö­ð´êÆè]sRtÎ}g4yeús“4[5—¼*:ŸO·]Ñogß}Óºk¥?/IRm2X… ƒUjÍ`UuhpÿµÙ·Pgß;P=ç TUßAtÎyGô7¬ˆ²ùì;¨±²±5‹÷ËN’¤:d° «ÔšÁªÆ½Ö©oξ̀*§¶DÿÆ3£óÙ?Œæ1¯H6’†®E{EûŒ_þu§FÙx8û–j¨sá!ùÏF’T‡ V¡Â`•Z3XÕ¸·ýb€Y×oGq×eѽäÑ:å hLÌK’F¦E{F{ùÁÑ[¿4ÊmeßÍ@M ¹={ä?IÒ¸g° «ÔšÁªÆ¹æQFôZÙ·0¦[o‰Þ×>í¿ég¥™jrïé{ª¿aE”ÝmÙ·90æÚgÿ¿ùÏA’4î¬B…Á*µf°ªq®ûå̾ŀqRô¢¸ûòè®94š'¼>ý™GûAtV-œþöâ(Ù¯À*6_•ÿì#IãžÁ*T¬Rk«Û&öˆÁ£weßbÀˆ+ÛGÿ›çDç³Í#_’ÿ¬#մ汯‰î¥ŒÁ÷f¿,c¦uê›ÓŸy$i¬3X… ƒUjÍ`UãZ{Åoeß^Àˆ*ûVôÖ/ö¿6ýóäÙÏ7’ªµ–¿5ú7žÑkf¿\c ÿO§?çHÒXg° «ÔšÁªÆµâ¶‹²o/`„”o~j¤ºüàhLÌK¦‘ôü5xqt.<$ܘýŒ²¢7ý«ÙÏ8’4¶¬B…Á*µf°ªq¬yüë"Eöí ¹ò±»£wÕ’hrPúsŒ¤Ý«uÚ/Dÿ†OFôÛÙ/-Àê}õ¨ôçIÛ V¡Â`•Z3XÕ8¶ýg€gâ›T¥ñ®yäÑ]sh”ßá=‚ IDAT“ýrŒ²õh4Aú3$e«Pa°J­¬jì:ì£l<œ}kC¤llÞú£uê›óŸY$ÍM‹öŒÎ9ïˆâ[Wd¿#¢sá!ùÏ2’4ެB…Á*µf°ªq«³jaöm ƒ^+úß<'Ú+'‹öJV‘”Wë¤7Eʈ¢—ýÊ ±ÁÖ[ü‹$ÍF«Pa°J­¬jÜÜMömd)Ql^7ýsàÍ£_–þ|"i¸j.yUt×NFÙz,ûÕ Rí³~#ýÙE’Æ.ƒU¨0X¥Ö V5NµNùùì[ H0xôÎè^úÏÑ<îÇÒŸK$ Í#ˆî%ÿåÔ–ì—/`Èw\œþÌ"Ic—Á*T¬Rk«§ú×"û–æJ¿ý›>íOþŠŸë“´kMî ‰ò±oe¿¢â,£uâOç?¯HÒ8e° «ÔšÁªÆ¥æQ/è5³o)`– ¶nŒîšˆæQ¦?‡H“&÷ŽÎƒïÜ‘ý þu§å?§HÒ8e° «ÔšÁªÆ¥îE—};³ùmª7Ÿí3ßîÛT%Í^{DçÜwÆ`ë-Ù¯z@¦^+šG¿,ÿE’Æ%ƒU¨0X¥Ö V5. Ø};3lðÈmÑýâßGóˆ§?sHªÙpõ¼?ö«PcÝKÿ9ÿÙD’Æ%ƒU¨0X¥Ö V5µN9(ûVfJ9ˆâ¶‹¢}Öoø6UI¹-Ú+:ŸO”OÜ›ýÊ̱òÉoGcrïüçI‡ V¡Â`•Z3XÕ8Ô¿îÔì[ ØMeçÉèýôhøÓéÏ’TirŸè\xH”Sd¿Ts¨sî»òŸG$i2X… ƒUjÍ`U#ßâý£l?‘}+»hðÐÍÑùÂ_Eãðä?_HÒsuø ¢{ù‡¢ìLe¿ts Ø¼.ÿ9D’Æ!ƒU¨0X¥Ö V5êu.ø³ìÛØÅ}Ú+Dcb^ús…$íLÍ£_½õK#ýì—R`–µN9(ýD’F>ƒU¨0X¥Ö V5ꛯʾ€U¢Ø´:Z§ýbú³„$ín­¥?ý›ÏË~efQÿ†O¦?{HÒÈg° «ÔšÁªFýƒ¡(ËìÛxew[ô¾öÑhÿÚôçIšéÚŸübðÀÙ/µÀlèw¢yÌ+ÓŸ;$i¤3X… ƒUjÍ`U£\oݱٷðÊmF÷ÒFóÈ—¤??HÒ¬¶hÏè|ᯢl>’ýÒ Ì°íÿ¶‘þÌ!I£œÁ*T¬Rk«Ùí5ýá70|ÊmE÷’Dcñ~ùÏ’4‡mè÷®ZQt³_Š€R>qïôg“ÙÏ’4²¬B…Á*µf°ªQ­ó™ÿ–}ûOS>~Ïô7 6&÷If¤ÌZû™(¾õ•ì—e`†lÿl2û9C’F6ƒU¨0X¥Ö V5ª·¯É¾}€ïªv×:ýÙÏ ’4LµW.ˆòÉû³_¦€ÝT|ëŠôç IÙ V¡Â`•Z3XÕ(Ö<ö5ƒ"ûö€Ú+»;:âgñ$é9jy@ôÖ/õo0âZ'½)ýùB’F2ƒU¨0X¥Ö V5Šu×.ʾu ÖÊ'îýîPuÏôçI•Z§ü| ¾}]öK8°‹ú_?=ý¹B’F2ƒU¨0X¥Ö V5rMì1ýs£ÀÜ+§ˆîê÷FcrŸügIÅíÝ‹ßÑkf¿¤;«×ŒæQæ?WHÒ¨e° «ÔšÁªF­ö¿š}Û@í”­G£{É¢±xÿôgI‡š'üxw¯Í~yvR÷â÷§?OHÒÈe° «ÔšÁªF­þgeß6Pew[ô®8"šGþ, Ic×ļè\ø?¢l?‘ýrì ò±»§2ýyB’F)ƒU¨0X¥Ö V5R-Þ?ÊÎTömãoÐÞ5'Eó˜Wæ?HÒ˜×<öÕQlZýÊì ö§~;ý9B’F*ƒU¨0X¥Ö V5JuÎÿ“ì[Æ^qÛEÑ:ñéçIª[óÿ4ÊöãÙoÀüÛIöóƒ$T«Pa°J­¬j”*îürö-ck°õß"IÉ5—¼júÃo`ˆ•ƒhžðúôçI™ V¡Â`•Z3XÕ¨ÔüðD Šì[ÆN9µ%:E{¦Ÿû%I?‰yÓ¯Ëew[ö[ð,zWÿì I£’Á*T¬Rk«•º¿?ûv€ñÒkFï+‹£qø ÒÏû’¤ï¯õ‘ŸˆâÞ¯e¿[Ï l<<=ÀÊ~n¤‘È`* V©5ƒUJƒoʾ]`l›VGóø×¥Ÿó%IÏÓ¢=£{É"Š^ö[ð4óþ(ÿ™A’F!ƒU¨0X¥Ö V5 µNúÙì[ÆÂà;wDûS¿~Æ—$í\­Ó~!Þ•ý6|bóUéÏ ’4¬B…Á*µf°ªQ¨wõñÙ· Œ¶^3ºk'ýT$pÍ#^ýo¬Ì~G¾Gëc?“þ¬ ICŸÁ*T¬Rk«úíåÔÙ· Œ¬þ7Ïæ±¯É?ÛK’f¤Îew[öÛ °ýo„¯=9ýA’†>ƒU¨0X¥Ö V5ìµÏúìÛFÒà‘Û£ýÉ_I?ÓK’f¾Ö‰oŒÁCßÌ~«€Ú+;SÓ¿†ýŒ ICÁ*T¬Rk«öú7}›Àhô£wÕ’h¶oúy^’4‹¶oôÖ/Í~×€Úë|á¯óŸ$i˜3X… ƒUjÍ`UÃ\óðFtÙ· ŒŒÁ–¢uÊϧŸå%IsWgÕBÿ~‰Þ”þ\ ICÁ*T¬Rk«æ:üyö-#óósÝ/þ}4&öH?ÇK’æ¾Ö²ù1xøÖì·#¨­öòƒÓŸ $ih3X… ƒUjÍ`UÃ\q÷åÙ· ½bÓêh÷£éçwIRnÍ#^Å­ŸÏ~[€ZêãÓéÏ’4´¬B…Á*µf°ªa­¹äUƒ"û€¡U6¿ÏþaúÙ]’4DMÌ‹îÚɈ²Ì~›€zéw¢yôËóŸ $i3X… ƒUjÍ`UÃÚöŸ3žYqû—¢yì«ÓÏ풤ᬽòw¢l?‘ývµÒ½ø}éÏ’4”¬B…Á*µf°ªa­¸÷êìÛ†ÎöñQçÂCÒÏ뒤᯵ô 1xøÖì·.¨Á#·MÿêAö³€$ ]«Pa°J­¬jk÷£å ûö€¡RÜùåhûšôóº$itjñâ(n½0û- j£ý‰_N¤¡Ë`* V©5ƒU c݋ߟ}kÀÐ(;O>õ­ª¾¡C’´+MÌ‹îÚɈ²Ì~K€±×ÿÆÊügI¶ V¡Â`•Z3XÕ06¸ÿÚì[†BqïÕÑ<þuégtIÒè×ùìè5³ßÚ`¼õ;Ñ<úåéçIª V¡Â`•Z3XÕ°Õ<áõ¾ñEô®ZɽÓÏè’¤ñ©uÒ›¢|ì[Ùïr0Öº_úŸégIª V¡Â`•Z3XÕ°Õ½äÙ·¤*ßí¿-ýl.I϶ÛÓà¾õÙow0¶oЯļô³¿$ M«Pa°J­¬jØ<°!û¶€4ý«¢yÔKÓÏå’¤1ï°Œþ7ÏÍ~Û€±å‘%é{2X… ƒUjÍ`UÃTkéOeߣ׊îšCÓÏä’¤51/zW}8ûÆRÊü3¿$ K«Pa°J­¬j˜ê^>‘}KÀœ<øh}ô'ÓÏã’¤zÖ½øýå ûíÆK¯Í£L?ïKÒPd° «ÔšÁª†©ÁÖÙ·Ìý·m,Þ?ý,.IªwÏü·éÔ€™ã×t$黬B…Á*µf°ªa©õ±ŸÉ¾`îôÛÑùü{ÒÏá’$ý[­Ó)Êæ#Ùï06ßš~Η¤¡È`* V©5ƒU K½¯™};ÀœóíÑ8üéç{IJÏ`* V©5ƒU CÛØ`\•ÛŠöÇÿsú¹[’¤jÑ^Óß <³²ýD›×Eïª%Ñ^¹ šK~(ÿ/IØÁ*T¬Rk«†}3ûV€Y1xàÆhÿÚô3·$I»Ôļè]ó±ì·SÈWôb°åúè­_U £µlþôy9ýÌ.I£Á*T¬Rk«Ê®yÂë³o˜ý›>Åû§Ÿ¹%IÚíÑêÕ'd¿­ÀÜ1غ1úVDwÍ¡Ñ^~ðôØ*ýl.I£šÁ*T¬Rk«Ê®{ñû³o˜Yƒ~t/~_úY[’¤™¬÷Õ#³ßa`V”oŽþÍçE÷ËÿíOür4aúù[’Æ*ƒU¨0X¥Ö V•]qïÕÙ·̘²õh´Ï|{ú9[’¤Ù¨{é³ßj`·ÿí¦¸ãâè]qx´W.ˆæ’J?gKÒØg° «ÔšÁª2Ûþå û6€1xô®høÆôs¶$I³Yç íßs E/[7Fÿë§GgÕÂh-›‰yégjIª]«Pa°J­¬*³îê¿É¾`F î[Íc^‘~Æ–$i.êœÿ§ƒ~öÛ/T”Ýý +¢»æÐh/?xz •}v–$¬ÂÓ¬Rk«Ê¬¸ëÒì[v[ÿæÏFã°}ÓÏ×’$Íesß5ýU¡œÚŦÕÑ];í• ¢yÔKÓÏÈ’¤gÉ`* V©5ƒUeÕ<ò%E7û€]W–Ñ»j‰Ÿ’“$Õ¶öÊ߉跳ߑseçÉ(6¯‹Þú¥Ñ9÷Ñ\òªô³°$i'2X… ƒUjÍ`U©?£ªß‰Îù’~®–$)»öY¿a´ ÀÌé·cpß¿Foý‰ÓŸ'¶–¾Á KÒ¨g° «ÔšÁª²êßrAö廤l?íOürú™Z’¤aiûO°ú%vZ9ˆÁÖ[¢ã™Ñ]ýÞhúæhLî~¾•$Íp«Pa°J­¬*¥ÅûEtÙ—?ì´rÛƒÑ:ùçòÏÔ’$ Yí³/¢èe¿U0ÄÊ©-QlZݵ“ÓôÔ<êÀôs¬$i2X… ƒUjÍ`Uµ?óûÙ—>ì´ò±»£õ‘ŸH?OK’4¬uÎùƒˆA?û-€!Pv¦¢Ø¼.zë—FgÕÂhžðúôóª$))ƒU¨0X¥Ö V•Qç²/}Ø)ƒo=šÇ¼2ý,-IÒ°×YõîéŸv FýlÝý +¢sá!ÑZ6?{¤ŸM%IC’Á*T¬Rk«šóíeëÑìKvXq×¥Ñ<ü…ùgiI’F¤ÎçßQ–Ùoá̆rƒ‡o§v/úÛhö јÜ'ý *Iâ V¡Â`•Z3XÕ\×þÄ/g_ö°Ãúß<LJ.’$íBÛÇ F«£¯|òÛQÜúùè^úÏÑ>ã×¢yäégMIÒˆe° «ÔšÁªæºÞºc³/{Ø!ýë?îçë$IÚºkþ!ûí€Pv¦¢Ø¼.zë—FgÕÂh-›Ÿ~¦”$A«Pa°J­¬j®l½%û²€çÕ¿îTcUI’f îÅïÏ~[à™ ú1غ1úVDçÂCž§ú·IÒld° «ÔšÁªæ²æñ¯Ë¾äàyõ®Z’~v–$iœê}eqöÛ;@½•e ¹-ú>Ý/þ}´NûÅéñPö9Q’T“ V¡Â`•Z3XÕ\Ö½èï²/yxNƪ’$ÍN½¯}4ûm 6Ê©¢Ø´:ºk'£½rA4~yúyP’Tã V¡Â`•Z3XÕ\VÜqqö%Ϫ{ù‡ÒÏÌ’$mó¦¿Ñ €™Uv·E±y]ôÖ/Ϊ…ÑZ6?ÿì'IÒ÷f° «ÔšÁªæ¬ÅûGôÛÙ—<|¿²œþ5€ô3³$IãÞa?ÅÝk³ßùFWÑ‹Á–ë£wí)ѹàÏŸ§Nì‘Γ$é¹2X… ƒUjÍ`UsUûÓ¿›}¹À3ê^òOéçeI’êRóˆÅ`Ë Ùoÿ#¡œÚŦÕѽäÑ^~p4ï—~ž“$i§3X… ƒUjÍ`UsUÿë§g_îð}º—~0ý¬,IRÝjóŠ|çŽìcÀP)ÛGq×eÑ];í• ¦ÏLÙç6I’f$ƒU¨0X¥Ö V5'MÌ‹òÉû³/w¨è^ö/ùgeI’jZë#ÿ!ÊmeR”ÝmQl^½õK£³ja´–ÍO?ŸI’4k¬B…Á*µf°ª¹¨uòÏe_êPѽ|"ýœ,IRÝkúæ(;SÙÇ€Ù5èÇ`ëÆèoXÝ5‡F{ùÁјÜ;ý,&IÒœe° «ÔšÁªæ¢îåʾÔàÿè­;6ýŒ,I’žª}ƯFô;ÙÇ€SNm‰bÓêè^ò§Æ©‹÷O?sI’”šÁ*T¬Rk«š‹Š{¿–}©À´ÞÕǧŸ%IRµÎùQ–ÙÇ€V6¶FqÛEÑ]»(Ú+~3šG˜~¶’$iè2X… ƒUjÍ`U³]óè—G ŠìK¢Ã'£11/ýŒ,I’¾¿îÅïË>*<·n#Š{®œþcØÎ¹ïŠæñ¯M?CI’4¬B…Á*µf°ªÙ®³êÝÙ—9Dqë…ÑX´WúùX’$={½kNÊ>2t’$ikÿ: ÌŒ¢ƒ-×GoýÒè¬Z­eó§¿p%û¼#IR­2X… ƒUjÍ`U³Y÷’ʾĨñOù5ûÑô3±$IÚµÚ[D¿“}¤FÉ ƒoŠþõÎ…ÿ#Z'ýl4í•~®‘$©ö¬B…Á*µf°ªÙ¬¸ûòìK€*»Û¦¿í?û<,I’v¯Îªwg+€!¶ýU‹M«£»v2Ú+DóÈ—¤Ÿ_$IÒ3d° «ÔšÁªf­ÅûEôZÙ—8u3(¢ýéßÍ?K’¤©wåÑÙ§ `”'£Ø¼.zW-yjœºä‡ÒÏ)’$i3X… ƒUjÍ`U³U{Åof_ÞÔP÷¢¿M? K’¤lb^ô¿yNö˜KE/[®Þú¥ÑYµ0ZËæOŸ ÒÏ%’$i×2X… ƒUjÍ`U³Uïê²/oj¦wå1éç`I’4 -Þ/÷_›}ÔfàˆÁÖÑß°"ºköòƒ§G-éçI’4s¬B…Á*µf°ªÙjðÐÍÙ—75Ò¿ù¼hLì‘~–$I³SóÃ?å÷e9€ÝTNm‰bÓê讌öÊÑ<ê¥éç I’4ˬB…Á*µf°ªÙ¨ùá‰(ËìË€šÜ÷¯Ñ8lßôs°$IšÝZ§Ñke=€T¶âÎ/GïŠÃŸ§.ù¡ôó„$IJÈ`* V©5ƒUÍF þ,ûÒ &Ê©¢yì«ÓÏÀ’$inêœÿ§ÙÇà™½lÝý¯ŸU £µl¾_B‘$IOe° «ÔšÁªf£þ7>}iPýv´Nû…ôó¯$IšÛzמœ} €Ú+»;úVDwÍ¡Ñ^~ðô%ûŒ I’†4ƒU¨0X¥Ö V5ãMÌ‹rÛƒÙ—6ã®,£sÞçŸ%IÒÜ7¹w›¯Ê>@m”S[¢Ø´:ºk'£½rA4:0ÿ< I’F'ƒU¨0X¥Ö V5ÓµNþ¹ìË€è}õ¨ô³¯$IÊ«¹äUÓã`f•©(6¯‹Þú¥ÑYµ0šÇ¿.ý}_’$x«Pa°J­¬j¦ë^òOÙ—5c®¸ãâh,Ú3ýì+I’rkþ–ˆ¢›}4€ÑUôb°ucô¿~úô8µµl~4&öH—$Ic–Á*T¬Rk«šéŠ».;¬cƒGn‹æ/J?÷J’¤á¨»æÐìã Œ†rƒ­·DÿƳ¢»ú½Ñ:õÍјÜ;ý½\’$Õ ƒU¨0X¥Ö V5£MîÑmd_ÖŒ«n#ZËþcþ¹W’$ UýÏÌ>¥ÀÐ)§¶D±iut×NF{å‚hu`ú{¶$Iªi«Pa°J­¬j&kümÙ—4c¬³êÝég^I’4„¶o ¶\Ÿ}T€4eg*ŠÍ뢷~itV-Œæ ¯Ï–$Iú· V¡Â`•Z3XÕLÖ½üCÙ—4cªwÍIéç]I’4¼5m”ÍG²,0ûýlÝý +¢sá!ÑZ6?{¤¿K’$=k«Pa°J­¬j&+îº,û’` î¿vú´²Ï»’$i¸kŸùöˆA‘}t€UNm‰þÍçEwÍ¡Ñ^~ðô7‹g¿çJ’$íT«Pa°J­¬jÆšÜ'¢ÛȾ¤3eëQ?e(I’v¸Þ‡g_`—•SD±iut×NF{å‚hý²ô÷VI’¤ÝÎ`* V©5ƒUÍTÛÿªfTYFûS¿~Ö•$I#Ô¢=£¸çÊìS <¯²ódw¯Þ•ÇDû3¿Íc_ÿ>*I’4¬B…Á*µf°ª™ª{ù‡²/gÆLïêÒϹ’$iôÚ>ø)›deàß ú1غ1úVDwÍ¡Ñ:å hLì‘þž)I’4'¬B…Á*µf°ª™ª¸ë²ìË€12xè›Ñ8lßôs®$IÍÚ+~kúÛÚ C9µ%ú7Ÿ7=NÝþ uÅû¥¿7J’$¥e° «ÔšÁªf¤É}"ºìË€qÑmDëÄ7æŸs%IÒH×[w\ö©€(§ˆbÓê讌öÊÑ<úåéï’$IC•Á*T¬Rk«š‰Ú[ö¥ Àé|î/Òϸ’$i Z´W î[Ÿ}´`Œ”ÝmQl^½õK£³ja´–ÍÏ¿“$Iö V¡Â`•Z3XÕLÔ½üCÙ—2c¢¿ñüôó­$IŸšÇýX”­G³8Œ¢A?[7FÊè®94Z§E{¦¿·I’$\«Pa°J­¬j&*îº4ûR` ”ßÍ#H?ßJ’¤ñªsÎ;²9Œ€Áwîˆþ7>ýÔ8õô·Dã°}ÓßÃ$I’Æ"ƒU¨0X¥Ö VµÛMîÑmd_ÊŒº²ŒöY¿ž¾•$IcYïÚ“³O; ‘²ýxw]ݵ“Ñ^¹ šÇ¼"ý½J’$il3X… ƒUjÍ`U»[{ùÁÙ—1c ·þÄô³­$IãûÁ/ûÀ.ØþyDq×eÑ];í• ¢yÌ+ÒßS$I’´¬B…Á*µf°ªÝ©uÒ›²/aFØ`ë-Ñ8lßôs­$IªWÍ£_å¶³B<—n#ŠÍWEïêã£syüëÒß?$I’´‹¬B…Á*µf°ªÝ©»ú½Ù—0£ªDkù[ÓÏ´’$©žµÏúõˆ²Ì>°Ý ˆÁÖÑß°"ºköòƒ£1¹Oú{…$I’f(ƒU¨0X¥Ö Vµ;õo:;û`Dõ®ùXúyV’$Õ»Þµ§d‰j©œÚŦÕÑ];í3ßÅû§¿'H’$i3X… ƒUjÍ`U»Sùø=Ù—0#úádóÈÒϳ’$©æ-Þ?Ü–}4keû‰(6¯‹ÞUK¢½rA4yeþë¿$I’æ6ƒU¨0X¥Ö Vµ«5?ü#Ù—/#ª}ö寧g%I’¶×:å ˆ¢—}<E/[®Þú¥ÑYµ0ZËæGcb^úk½$I’’3X… ƒUjÍ`U»ZçÜwf_¾Œ þÆóÓϲ’$Iß[wí¢ì#Àè1غ1úVDwÍ¡Ñ^~ðô!û5]’$ICšÅÉe IDAT˜Á*T¬Rk«ÚÕ¶ÿ…4쌲ód4}uúYV’$©Ò¢½bpßúì£ÀP+§¶D±iut×NF{å‚hù’ü×oI’$F«Pa°J­¬jWÜmöå Àˆé®~oú9V’$é™j}ä'¢ìnË>. …²ù(î¸8z_YüÔ8õ˜W¦¿NK’$i„3X… ƒUjÍ`U»Ôâý"Šnöå À÷—Ù—-#¢ýéÿš~~•$IÚÕ¶ÃæZ9µ%ŠM«£»v2Ú+Dó¨Ó_%I’¤ÝÊ`* V©5ƒUílýëN;lÅ=W¦Ÿ]%I’v«‰yQÜuiö± cۿɹؼ.zë—FgÕÂhžðúü×>I’$i¦3X… ƒUjÍ`U;Û`Ë Ù—-î,£uú[ÒÏ®’$I»[óø×EÙÝ–}ºÆÁ ƒ­£¿aEt.<$ZËæGcbô×9I’$iÖ3X… ƒUjÍ`U;ÕaûFÝìË€!׿é3ùgWI’¤ª»æÐìã0‚ÊÇîž§n i/?xúß׳_Ï$I’¤” V¡Â`•Z3XÕÎÔ:ý—²/Y†]ÑÖGþCúÙU’$iÆšØ#Š{®Ì>eC¬œÚŦÕÑ];í• ¢yôËò_»$I’¤aÉ`* V©5ƒUíLÝ/þ}ö% Àë]}|ú¹U’$i¦kžðãÝFöQ eg*ŠÍ뢷~itV-œ~}È~’$I’†:ƒU¨0X¥Ö Vµ3mÿù"x6eçIß$$I’ƶîÅïÏ>ns­èÆàþk£wÍIÑYõîhøÆéo]Î~=’$I’F*ƒU¨0X¥Ö Vµ3 ¹-û’`ˆõ¾²8ýÌ*I’4k-Ú3[nÈ>r³¨œÚý›Ï‹îšC£½üàh,Þ/ÿµG’$Iõ V¡Â`•Z3XÕŽÖ<ò€ˆr}É0¤ÊöÑ<ê¥éçVI’¤Ù¬uê›#EöÑ ˜åÔQlZݵ“Ñ^¹À¯EH’$I³•Á*T¬Rk«ÚÑÚgüZöå Àë^>‘~f•$Iš‹zëOÌ>z;©ìn‹bóºè­_U £µl~úk‰$I’T› V¡Â`•Z3XÕŽÖ½ôƒÙ—+Cªl~'šG¼8ýÌ*I’45xQ”OÞŸ}žÍ ƒ­£¿aEt×­SŠÆÄ鯒$IRm3X… ƒUjÍ`U;Zÿ– ²/W†Ôö?nÊ>¯J’$ÍeíÏü~ö ø®rjK›VG÷’D{ùÁÑX¼_úk„$I’¤ïÉ`* V©5ƒUíhå÷f_® ¡²ùH4aúyU’$i®+n½0û(µSn{0ŠM_ˆîåŠöY¿Í#_’þZ I’$éy2X… ƒUjÍ`U;RsÉ«²/U†T÷ò‰ôóª$IRFÍã~4ÊÎTöq ÆVÙÝÅæuÑ[¿4:«FkÙüôû^’$IÒ.d° «ÔšÁªv¤ö§7ûR`uÑ<úeéçUI’¤¬º_ú_Ù'2ƒ~ ¶nŒþ†Ñ]sh´N9(‹öL¿Ç%I’$Í@«Pa°J­¬jGê}eqö¥ Àê}í#égUI’¤Ôíƒ-×gË`ä ¾sGôo:;ºkþ!ZËßÃöÍ¿Ÿ%I’$ÍN«Pa°J­¬jG*n»(ûR`ؽh÷cégUI’¤ìZ'ýìô·CϬl?Å]—Ewíd´W.ˆæ1¯H¿o%I’$Ía«Pa°J­¬jG*Ÿ¼?ûR`Èôo8#ýœ*I’4,õ¾öÑìã ‡n#ŠÍ뢷~itV-ŒÖ²ùј˜—~J’$IJÌ`* V©5ƒU=_Í£_–}™0lÊA´Nüéô³ª$IÒ°Ô<âEQ>ùíìSÌ­A?lˆþ×OÎçþ2Zû™h,Ú3ý~”$I’4d¬B…Á*µf°ªç«}æÛ³/S†LqëçÓÏ©’$IÃVç¼?Ê>¦Á¬*§¶D±iut×NNÿ»qcñþé÷$I’¤È`* V©5ƒU=_݋ߟ}™0dZ§¿%ýœ*I’4Œߺ"û¨3¢l<Åm_|jœºâ·¦‰+ûþ’$I’4¢¬B…Á*µf°ªç«ÿOg_¦ ‘âÞ¯¥ŸQ%I’†µÖ²ùE/ûÈ;§èÅ`ËõÑ[¿4:«N_ljyé÷“$I’¤1É`* V©5ƒU=_ƒ­³/S†Hçœ?H?£J’$ s½¯}4ûÈÏnPLÿ›oÊè®94ÚËŽÆä>é÷$I’¤1Î`* V©5ƒU=g‡í1èg_¦ ‰òñÍÑX´Wþ9U’$iˆkñâ(§È>ºÁ´rjK›VGwíd´Ï|{4Aú="I’$©f¬B…Á*µf°ªçªuêÿ}‰0Dº¿/ýŒ*I’4 u.ø³ì£5T¶Ÿˆbóºè]µ$Ú+Dó˜W¦ß ’$I’d° U«ÔšÁªž«Î…‡d_¢ ‰²3Í#H?£JúÿÙ»ó`½îú¾ã±2 LIJJÒ$¥Ô¡“BÒÄ Ù&M€4éÐi.aj†â¤„-‘Ë6^±…¯Ø&Ɔ‚-o«ð",¼"À²eð‚l¼/H÷ٟ眎®kÅ?ßûd?ç+Ÿïë=óú_º÷7£ïÜûѽßÀ³Áнêé7¯Ž>áÔå¦ãzvÿMõxóšz¸nÿº¿vßÅwþöžÉ`U*2XUê VùÛŒ¯?>ú‰J’$ii|í±á÷)À³IÿøWÖõl}Æ© ͦõìá­õdËõhÃõà”ý¿áýÆþ^ V¥"ƒU¥Î`•¿Íôžk£Ÿ¨$I’ö„fÓºÌKÃïS€g›ñõ'D_rzVí¸¿žn[_6®ªg¾¾îú‚ð· ðf°*¬*u«ÌµbïºíŒ~¢’$IÚšÞz^ü} ð,Ô;ôëª÷×Ñçœöàªþ£õô×ã+W?9N=ì‡Ãß-À?+ƒU©È`U©3Xežþš—G?OI’$í! N{]ø} ðl5¼à]Ñçœö”¦ãzöðÖzrãÉõpÝþuí¾õнÂß(@£ V¥"ƒU¥Î`•y†ŸySôó”$IÒÐì‘Û|àŸbÅÞõìþ›¢Ï:µÝlZϺ¥žÜ|z=¼ð€º«ê…Uωm3X•Š V•:ƒUæ_uHôó”$IÒÐhÃá·)À³ÝàÔ×FŸuj¸ê‰{êÉÖsêÑ%VNýåºwð÷‡¿;€=‚ÁªTd°ªÔ¬2Ïô¶ ¢Ÿ§$I’¢÷êÞ¡/¿Mº`²u]ôu§¦ªáwêéöMõxóšÅßTÕ;üEáï `e°*¬*u«Ì3{ôŽèç)I’¤à&7œ~—tEï£?Qדaô‰§hÓq={xk=¹ñäz¸nÿº¿vßzaÅÞáï àYÃ`U*2XUê VYÖ_|o]ϦÑÏS’$IÁõOxUüm Ð!ãMGFŸxú;ª»«žl9£m8°œ²ßâ×J£ß À³šÁªTd°ªÔ¬²œþñ¯Œ~š’$I nzϵáw)@×ôþþºÚù`ô©§ÿ_µãþzºm}=Ú¸ªœùúºw膿€Î1X•Š V•:ƒU–³ëW[I’$)wÃsÞ~—tÑð¢O½”UÃõtû¦z¼yÍâ×?{ý‰ð·‚ÁªTd°ªÔ¬²œñÕ‡E?MI’$Võõ«Oš²rŸzöÐ-Ñ'_·› ëÙ·®«Ç×·8Ní¯ùÉzaÅ^ñŸ{€Œ V¥"ƒU¥Î`•åLoÿ\ôÓ”$IR`»¾±}“tÙàô_>ù:UµãþzrËÙõhÃõà”ýüç+€=‰ÁªTd°ªÔ¬²œê±»£Ÿ¦$I’ëŸðªð› ë¦_ß}ö=kÇ©ÓmëëÑÆUõàÌ××½üPøç€¿…ÁªTd°ªÔ¬²ÄAÏ­ëjý4%I’Ô졯Åߤ ô?öSu=GŸ{tÕpG=ݾ©o^S×í_÷×îþyàÈ`U*2XUê Vy¦þ‰?ý,%I’ØhÇߤYŒ¯;.úüÛsšMêÙÃ[ëÉ–3êáïzrœºbïðÏÿD«R‘ÁªRg°Ê3 Ï}kô³”$IRTÓQÝ;ì…á7)@»~}5x¼NWUÕ³¿¾½žlùd=ºè½uÿ¤_Xüfô瀬JE«JÁ*Ï4Þtdô³”$IRP“­ëÂïQ€lF—}¨îzÕŽêé¶õõhãªzpæëëÞGþeøÇ€–¬JE«JÁ*Ï4ýú†èg)I’¤ gþNø= Î_|o]=qoÝ•ªÑÎzº}S=Þ¼¦®Û¿î¯Ý7þc @ƒU©È`U©3X噪ǷG?KI’$ýÔ«…•ß~d4<ïíõ³²é¸žÝS=¾þ„zxî=9N]±wøÇ€=ˆÁªTd°ªÔ¬òt½Õϯ몊~–’$I h|í1á÷(@Z+÷©go­÷ôª÷×ÓmëëÑ¥¬§ìW/ô}ñ;öl«R‘ÁªRg°ÊÓõOüùè')I’¤ ú'ýBø= Ùà¬7Ô{RÕΟ§^ñçõà¯~³îú‚ðÏB«R‘ÁªRg°ÊÓ ÏyKô“”$IR@ÕcwÕ +ö ¿G²›Þý…˜{p´³žnßT7¯©‡ëö¯ûk÷ ÿXЫR‘ÁªRg°ÊÓ¿pPô“”$IR@ã« ¿Eø®ºҫ뺪š=þf“zöðÖz²åŒz´áÀzpÊ~õªç„ÿÝè(ƒU©È`U©3Xåé&_ûLô“”$IR@ýã^~‹ð¤É­çþ³ÞzÕŽûëé¶õõèÒ>9N=è¹áG1X•Š V•:ƒUžnöÀ—£Ÿ¤$I’ZnöÈmáw(£¿æåu=ÿ£n»jðx=½óòz´qU=8óõuï°†ÿ}HÎ`U*2XUê VÙmÅ^u5Úý$%I’Ôr£Ë?‹P˜Üpâßã[¨§Û7ÕãÍkêáºýëþÚ}¿Æýg€‚ÁªTd°ªÔ¬ò”Þ‘/‰~Ž’$I ¨ìËÂoQJ½Ã~¸®†;þæh›MëÙÃ[ëÉ–3êцëÁ)ûÕ «¾'üÏ 'ƒU©È`U©3Xå)ƒÓ^ý%I’Ôr³ûn ¿CXÞpݯGŸÿ_OŽSznøŸþQ V¥"ƒU¥Î`•§ /< ú9J’$©åF—ýïð;è0ƒU©È`U©3Xå)ãk‰~Ž’$Ij¹þÚ}ÃïP Ã V¥"ƒU¥Î`•§Lo¿(ú9J’$©ÅfÞ~ƒg°*¬*u«úùI’$©Áªþ£õнÂïN 1ƒU©È`U©3XÍköÀ–èç'I’¤›ÞyYøÍ $g°*¬*u«yU½oG??I’$5ØøšÃÃoN 9ƒU©È`U©3XMê çF?=I’$5Üð3ÿ5þîr3X•Š V•:ƒÕœúk^ýô$I’Ôpýc^~wɬJE«JÁjNƒÓ-úéI’$©ÁªÁõнÂïN 9ƒU©È`U©3XÍixî[£Ÿž$I’lz÷•á7'€ÁªTf°ªÔ¬æ4ºüÿD?=I’$5ØxóÇÂoNƒU©Ì`U©3XÍiü¥µÑOO’$I 6¼ð€ð›À`U*3XUê VsšÜrvôÓ“$IRƒ N}møÍ `°*•¬*u«9M·oŠ~z’$Ij°Þa/ ¿9 V¥2ƒU¥Î`5§Ù£wD?=I’$5TÕûvø½ °È`U*2XUê VsªF;£Ÿž$I’jºýšð{`‘ÁªTd°ªÔ¬æÓ[ýüèg'I’¤›ÜxrøÍ °È`U*2XUê Vóéû²èg'I’¤}þOÂoN€E«R‘ÁªRg°šÏà㯉~v’$Ij°Á_ýføÍ °È`U*2XUê Vó~æMÑÏN’$I Ö;êGÃoN€E«R‘ÁªRg°šÏhÃÑÏN’$I UvÖ +ö ¿9¬JE«JÁj>ã«~v’$Ij¨Ùý7…ß›»¬JE«JÁj>“›O~v’$Ij¨É-g‡ß›»¬JE«JÁj>Ó¯>úÙI’$©¡Æ×~oìf°*¬*u«ùÌØýì$I’ÔP£õï¿7v3X•Š V•:ƒÕ|ªD?;I’$5ÔàŒÿ~oìf°*¬*u«É¬Ø«®§ãèg'I’¤†êì§âoN€§¬JE«JÁj.½C_ýä$I’ÔTUU/ôÜð›`7ƒU©È`U©3XÍ¥ìË¢Ÿœ$I’ªÚñ@ø½ P0X•Š V•:ƒÕ\ú'ÿbô““$IRCMï¹6üÞ(¬JE«JÁj.ƒ³Þýä$I’ÔP“¯~*üÞ(¬JE«JÁj.ÃóÞýä$I’ÔPã« ¿7 «R‘ÁªRg°šËèÒD?9I’$5Ôðüw†ß›ƒU©È`U©3XÍe|ÍÑON’$I 5øÄ¯‡ß›ƒU©È`U©3XÍeróéÑON’$I ÕÿØ¿ ¿7 «R‘ÁªRg°šËtÛúè''I’¤†êú‚ð{ `°*¬*u«¹ÌîýRô““$IRM†õнÂïM€‚ÁªTd°ªÔ¬æ2{ôŽè''I’¤ªÿfø­ °„ÁªTd°ªÔ¬æR ~r’$Ij ]?I?úÖXÂ`U*2XUê VYõœº®ªè''I’¤šÞv~ü½ ðL«R‘ÁªRg°šGïðE?7I’$5ÔøúÂïM€% V¥"ƒU¥Î`5þÚŸŽ~n’$Ij¨ÑÆUá÷&À«R‘ÁªRg°šÇà㯉~n’$Ij¨áï ¿7–0X•Š V•:ƒÕ<g½!ú¹I’$©¡vÝzÑ÷&À«R‘ÁªRg°šÇpÝþÑÏM’$I Õ?ñçÃïM€% V¥"ƒU¥Î`5ÑEï~n’$Ij¨Þ‘?~o,a°*¬*u«yŒ.ÿpôs“$IRC-¬úžð{` ƒU©È`U©3XÍcüÅ££Ÿ›$I’¨î¿5–e°*¬*u«yLn:5ú¹I’$©ª'î ¿5–e°*¬*u«yL¶®‹~n’$Ij Ùƒ_ ¿5–e°*¬*u«yLï¼<ú¹I’$©¦w_~k,Ë`U*2XUê Vó˜Ýwcôs“$IRMo=/üÖX–ÁªTd°ªÔ¬æ1{ôŽèç&I’¤šÜ|zø­ °,ƒU©È`U©3XÍ£êýuôs“$IR¿øÑð[`Y«R‘ÁªRg°šG=G?7I’$5ÐèŠ?¿5–e°*¬*u«9ôV??ú©I’$©¡FŸ{Oø½ °,ƒU©È`U©3XÍ¡wäD?5I’$5Ôðì? ¿7–e°*¬*u«9ô×îýÔ$I’ÔPƒOþvø½ °,ƒU©È`U©3XÍ¡òŒ~j’$Ij¨]·^ô½ °,ƒU©È`U©3XÍað‰_~j’$Ij¨þšŸ ¿7–e°*¬*u«9 >õ»ÑOM’$I Õ;âÅá÷&À² V¥"ƒU¥Î`5‡á9o‰~j’$Ij¨ÞÁ?~o,Ë`U*2XUê Vs^x@ôS“$IRC-¬zNø½ °,ƒU©È`U©3XÍatÉû£Ÿš$I’šh6 ¿5æ2X•Š V•:ƒÕFWE?5I’$5P5üNø­ 0—ÁªTd°ªÔ¬æ0ÞtTôS“$IRU; ¿5æ2X•Š V•:ƒÕ&7œýÔ$I’Ô@Õcw‡ßšs¬JE«JÁj“-ŸŒ~j’$Ij ÙÃ[ÃoM€¹ V¥"ƒU¥Î`5‡é­çE?5I’$5Ðì¾ÂoM€¹ V¥"ƒU¥Î`5‡é—E?5I’$5Ðô›W‡ßšs¬JE«JÁj³{7G?5I’$5Ðô‡ßšs¬JE«JÁj³‡¾ýÔ$I’Ô@“[Ï ¿5æ2X•Š V•:ƒÕªÇîŽ~j’$Ij ÉWÎ ¿5æ2X•Š V•:ƒÕª…G¢Ÿš$I’hrÓÇÃoM€¹ V¥"ƒU¥Î`5‡j´3ú©I’$©ÆÅ³(5 IDAT›×„ßšs¬JE«JÁjõtýÔ$I’Ô@ãMG†ßšs¬JE«JÁj+÷‰~f’$Ij¨ñÕ‡Åß›ó¬JE«JÁj«ŸýÌ$I’ÔP㫉¿7æ1X•Š V•:ƒÕîë}䇢Ÿ™$I’jü…ƒÂïM€¹ V¥"ƒU¥Î`µûzG¾$ú™I’$©¡FW†ß›s¬JE«JÁj÷õyiô3“$IRC.ÿpø½ 0—ÁªTd°ªÔ¬v_íOG?3I’$5Ôè²…ß›s¬JE«JÁj÷õOxUô3“$IRC.ù³ð{`.ƒU©È`U©3Xí¾þ)¿ýÌ$I’ÔP£‹ß~oÌe°*¬*u«Ý78ýW£Ÿ™$I’j´áÃïM€¹ V¥"ƒU¥Î`µûŸüíèg&I’¤†}î†ß›s¬JE«JÁj÷ ?ýûÑÏL’$I 5Zÿîð{`.ƒU©È`U©3Xí¾áÙýÌ$I’ÔPà Þ~oÌe°*¬*u«Ý7<ïmÑÏL’$I 5<ÿá÷&À\«R‘ÁªRg°Ú}à ˆ~f’$Ij¨á¹~oÌe°*¬*u«Ý7Úp`ô3“$IRC ×í~oÌe°*¬*u«Ý7ºøO£Ÿ™$I’jxî[ÃïM€¹ V¥"ƒU¥Î`µûF—~0ú™I’$©¡†ç½=üÞ˜Ë`U*2XUê V»otù‡£Ÿ™$I’jx{؃¬JE«JÁj÷6®Š~f’$Ij¨á…„ß›s¬JE«JÁj÷¯<8ú™I’$©¡FŸ{Oø½ 0—ÁªTd°ªÔ¬vßøê⟙$I’j´áÀð{`.ƒU©È`U©3Xí¾ñ¦£¢Ÿ™$I’jtñûÂïM€¹ V¥"ƒU¥Î`µûÆ›×D?3I’$5Ôè’? ¿7æ2X•Š V•:ƒÕî_÷—ÑÏL’$I 5ºìCá÷&À\«R‘ÁªRg°Ú}“NŠ~f’$Ij¨Ñå¿7æ2X•Š V•:ƒÕî›Ütjô3“$IRC6® ¿7æ2X•Š V•:ƒÕî›l9#ú™I’$©¡Æ_8(üÞ˜Ë`U*2XUê V»oòÕOE?3I’$5ÔøªCÂïM€¹ V¥"ƒU¥Î`µû&·|6ú™I’$©¡Æ×~oÌe°*¬*u«Ý7¹õÜèg&I’¤†o:*üÞ˜Ë`U*2XUê V»ozÛùÑÏL’$I 5¾öØð{`.ƒU©È`U©3Xí¾émD?3I’$5ÔøºãÂïM€¹ V¥"ƒU¥Î`µû¦Û.Œ~f’$Ij¨É§„ß›s¬JE«JÁj÷¬J’$u·ÉWÎ ¿7æ2X•Š V•:ƒÕî3X•$Iên“­ëÂïM€¹ V¥"ƒU¥Î`µû¦ÛÖG?3I’$5Ôôö‹ÂïM€¹ V¥"ƒU¥Î`µû V%I’ºÛô®á÷&À\«R‘ÁªRg°Ú}«’$IÝmvïæð{`.ƒU©È`U©3Xí¾éퟋ~f’$Ij¨Ù_¿7æ2X•Š V•:ƒÕî3X•$Iên³G¶…ß›s¬JE«JÁj÷Mo¿(ú™I’$©¡ªÇ·‡ß›s¬JE«JÁj÷¬J’$u·jçCá÷&À\«R‘ÁªRg°Ú}«’$IÝ­~'üÞ˜Ë`U*2XUê V»oúõ ÑÏL’$IM5‡ß›s¬JE«JÁj÷¬J’$u»…•û„ßœË2X•Š V•:ƒÕî3X•$Iêv «Ÿ~s,Ë`U*2XUê V»Ï`U’$©Ûõ{aøÍ °,ƒU©È`U©3Xí¾é¶õÑÏL’$I Ö;êGÃoN€e¬JE«JÁj÷Mo;?ú™I’$©ÁúǾ,üæX–ÁªTd°ªÔ¬vßdë9ÑÏL’$I Ö?þ?„ßœË2X•Š V•:ƒÕî›ÜòÙèg&I’¤œúÚð›`Y«R‘ÁªRg°Ú}“¯~:ú™I’$©Ág¾>üæX–ÁªTd°ªÔ¬vßä+gF?3I’$5Øðì? ¿9–e°*¬*u«Ý7ùò'¢Ÿ™$I’lxáá7'À² V¥"ƒU¥Î`µû&7ýÌ$I’Ô`£K?~s,Ë`U*2XUê V»orãÉÑÏL’$I 6¾òàð›`Y«R‘ÁªRg°Ú}ãëOˆ~f’$Ij°ñæ5á7'À² V¥"ƒU¥Î`µûÆ×ýÌ$I’Ô`“›O¿9–e°*¬*u«Ý·ë'nI’$©»M¶® ¿9–e°*¬*u«Ý7þâG£Ÿ™$I’lzçeá7'À² V¥"ƒU¥Î`µûÆ×ýÌ$I’Ô`³o]~s,Ë`U*2XUê V»o|õG¢Ÿ™$I’löÈmá7'À² V¥"ƒU¥Î`µûÆW®Ž~f’$Ij°ê;÷…ßœË2X•Š V•:ƒÕî]±"ú™I’$©ÁªáŽð›`Y«R‘ÁªRg°Ú}£K?ýÌ$I’ÔdUU/¬Ø;üîXÂ`U*2XUê V»oôù?‰~f’$Ij¸ÞÁ?~w,a°*¬*u«Ý7Zÿîèg&I’¤†ëù#áw'À«R‘ÁªRg°Ú}ÃóÞýÌ$I’Ôpýµû†ßK¬JE«JÁj÷ Ïysô3“$IRÃõOù¥ð»` ƒU©È`U©3Xí¾ágÞýÌ$I’Ôpƒ³Þ~w,a°*¬*u«Ý7øÔïF?3I’$5ÜðÜ·†ßK¬JE«JÁj÷ Îø­èg&I’¤†]ü¾ð»` ƒU©È`U©3Xí¾Ái¯‹~f’$Ij¸ñU‡„ßK¬JE«JÁj÷ NÙ/ú™I’$©á&7œ~w,a°*¬*u«Ý×?ñ碟™$I’nrËgÃïN€% V¥"ƒU¥Î`µûúÇýûèg&I’¤†›ÞuEøÝ °„ÁªTd°ªÔ¬v_ÍOF?3I’$5Üì-áw'À«R‘ÁªRg°Ú}½£<ú™I’$©áª'î ¿;–0X•Š V•:ƒÕîëñâèg&I’¤†«F;ÃïN€% V¥"ƒU¥Î`µûz‡¾ ú™I’$©…v}Á'úö(¬JE«JÁjþá—$IJÑ®Ÿ¬~{<ÝŠTd°ªÔ¬æPϦÑOM’$I ×?îáw'@Á`U*2XUê Vs¨F;£Ÿš$I’npêkÃïN€‚ÁªTd°ªÔ¬æP-<ýÔ$I’ÔpƒOÿ^øÝ P0X•Š V•:ƒÕªÇ·G?5I’$5Üðüw†ßƒU©È`U©3XÍaöÈmÑOM’$I 7ºôáw'@Á`U*2XUê Vs˜ÝSôS“$IRï9<üî(¬JE«JÁjÓ훢Ÿš$I’nrÓÇÃïN€‚ÁªTd°ªÔ¬æ0½ãÒè§&I’¤†›Þv~øÝ P0X•Š V•:ƒÕv$I’Ôíf÷n¿; «R‘ÁªRg°šÃ䫟Š~j’$Ij¸ê±»ÂïN€‚ÁªTd°ªÔ¬æ0¹éÔè§&I’¤¦-„߃U©È`U©3XÍaü¥µÑOM’$I-´°úyá·'Àn«R‘ÁªRg°šÃøšÃ£Ÿš$I’Z¨÷Ñ~{ìf°*¬*u«9Œ6®Š~j’$Ij¡þÉ¿~{ìf°*¬*u«9Œ.yôS“$IR >õŸÃoO€Ý V¥"ƒU¥Î`5‡á…ÿ#ú©I’$©…vÝ}Ñ·'Àn«R‘ÁªRg°šÃðì?Œ~j’$Ij¡ÑÆ•á·'Àn«R‘ÁªRg°šÃà¬7D?5I’$µÐøúãÃoO€Ý V¥"ƒU¥Î`5‡Ái¿ýÔ$I’ÔB“­ëÂoO€Ý V¥"ƒU¥Î`5‡þ ?ýÔ$I’ÔBÓí›ÂoO€Ý V¥"ƒU¥Î`5‡þš—G?5I’$µÐìÛß¿=v3X•Š V•:ƒÕzG¼8ú©I’$©…ªáwÂoO€Ý V¥"ƒU¥Î`5‡ÞêçG?5I’$µÔÂAß~,2X•Š V•:ƒÕ$VìU׳iôs“$IR õŽþ±øû`ƒU©È`U©3XÍcׯ‡•$IR÷ëŸôêðÛ`‘ÁªTd°ªÔ¬æQ}ç¾èç&I’¤œõ†ðÛ`‘ÁªTd°ªÔ¬æ1{d[ôs“$IR Ïgøí °È`U*2XUê Vó˜ÝwCôs“$IR .ÿpøí °È`U*2XUê Vó˜ÞuEôs“$IR ¿´6üöXd°*¬*u«yLo» ú¹I’$©…&[×…ßž‹ V¥"ƒU¥Î`5É–OF?7I’$µÐìÞ/…ßž‹ V¥"ƒU¥Î`5]¿V’$IݯzâÞðÛ`‘ÁªTd°ªÔ¬æ1¾ruôs“$IRÍ&õÂÊ}ÂïOƒU©Ì`U©3XÍctñŸF?7I’$µTïð…ߟ«R™ÁªRg°šÇðüwD?7I’$µTÿ„Ÿ ¿? V¥2ƒU¥Î`5áÿý/ÑÏM’$I-58ëá÷'€ÁªTf°ªÔ¬æ18ý×¢Ÿ›$I’Zj´þÝá÷'€ÁªTf°ªÔ¬æ±ë×ÂJ’$)Gã« ¿? V¥2ƒU¥Î`5þ1/~n’$Ij©É—?~¬Je«JÁj½üPôs“$IRKMï¼,üþ0X•Ê V•:ƒÕDVîS×Uýä$I’ÔB³‡o¿? V¥"ƒU¥Î`5—j¸#úÉI’$©…ªÁá·'€ÁªTf°ªÔ¬æR=qoô““$IRK-¬~^øý $g°*¬*u«¹ÌúZô““$IRKõ}Yøý $g°*¬*u«¹L·_ýä$I’ÔRƒÓ~%üþ’3X•Š V•:ƒÕ\¦ÛÖG?9I’$µÔðœ7‡ßŸ@r«R‘ÁªRg°šËdË'£Ÿœ$I’ZjtéÂïO 9ƒU©È`U©3XÍe¼ùcÑON’$I-µëö‹¾?€ä V¥"ƒU¥Î`5—ÑÆ•ÑON’$I-5Ùº.üþ’3X•Š V•:ƒÕ\FŸ{Oô““$IRKÍîýRøý $g°*¬*u«¹ ?ûߢŸœ$I’ZªzâÞðûHÎ`U*2XUê Vs|â7¢Ÿœ$I’Új:®Vî~ƒ‰¬JE«JÁj.ý^ýä$I’Ôb½#_~ƒ‰¬JE«JÁj.½£,úÉI’$©Åú§üRø $f°*¬*u«¹ôV??úÉI’$©Å†gÿAø $f°*¬*u«ùÔ“aô³“$IRK.ý`øý $f°*¬*u«ùT;ˆ~v’$Ij©ñõLJߟ@b«R‘ÁªRg°šÏì¡[¢Ÿ$I’ZjzûEá÷'˜ÁªTd°ªÔ¬æ3ýæUÑÏN’$I-µë?+Eߟ@b«R‘ÁªRg°šÏäÖs£Ÿ$I’Zªî¿?€Ä V¥"ƒU¥Î`5ŸÉ§D?;I’$µXï~ƒI¬JE«JÁj>ã«‹~v’$Ij±þ_þLø $e°*¬*u«ùŒ.yô³“$IR‹ Îzcø $e°*¬*u«ù Ï{[ô³“$IR‹.zoø $e°*¬*u«ù Îüèg'I’¤o:2ü’2X•Š V•:ƒÕ|ú'½:úÙI’$©Å&·|6ü’2X•Š V•:ƒÕ|zGÿxô³“$IR‹Í¾u]ø $e°*¬*u« ôÜèg'I’¤«v<ƒ9¬JE«JÁjNõh!úéI’$©­ªª^ø‹ï ¿A€„ V¥"ƒU¥Î`5§ê±»£Ÿž$I’Z¬Ì¿ ¿A€„ V¥"ƒU¥Î`5§Ù·®‹~z’$Ij±Áé¿~ƒ ¬JE«JÁjNÓm룟ž$I’ZlxÞÛÂoP !ƒU©È`U©3XÍiróiÑOO’$I-6Ú¸*ü2X•Š V•:ƒÕœÆWýô$I’Ôb“›O¿A€„ V¥"ƒU¥Î`5§ÑÅï‹~z’$Ij±é]W„ß @B«R‘ÁªRg°šÓðœ·D?=I’$µØìÑ;ÃoP !ƒU©È`U©3XÍiðW¿ýô$I’ÔfÓq½°rŸð;HÆ`U*2XUê VsêÿÊè§'I’¤–ëýcáw(ŒÁªTd°ªÔ¬æÔ;ò%ÑOO’$I-78íuáw(ŒÁªTd°ªÔ¬&µê9u]UÑÏO’$I-6<ÿñw(‹ÁªTd°ªÔ¬æUõ~~’$Ij±ñU‡„ß @2«R‘ÁªRg°š×ìá[£ŸŸ$I’ZlòÕO‡ß @2«R‘ÁªRg°š×ô®+¢ŸŸ$I’Zlö­ëÂoP ƒU©È`U©3XÍkò•³¢ŸŸ$I’Z¬Zx$ü’1X•Š V•:ƒÕ¼Æ›ŽŠ~~’$Ij¹ÞÁ?~‡‰¬JE«JÁj^£‹ÿ4úùI’$©åúù3áw(ÿ½{q¾¼®ï;ÞUÇ/Q«ctm;´Õhl2›Z›&&1Sã%Qê-Ms›T§‰cLLÝ«,Š\D. ‹B@åîJD– ‹®‚ÀÊŠð;÷s¾§³ÎáCYööû×÷œÏã9óø>ß™÷üæ5ç÷Ï «R‘ÁªªÎ`µ^ý³ßœ~~’$Išq½Ó_¿C€Š¬JE«ª:ƒÕzõ>ù_ÒÏO’$I3nÛ¯ì§ïP "«R‘ÁªªÎ`µ^Ý£^~~’$Išqï¿C€Š¬JE«ª:ƒÕzuzzúùI’$iÆo¹0~‡1X•Š VUu«u›Žzé'(I’¤6Ù²1~ƒ1X•Š VUu«uk~üÝô”$IÒ,õ§K«¿C€J¬JE«ª:ƒÕºM6ÿßô”$IÒŒëþÜø TÂ`U*2XUÕ¬Öm|ÓgÓOP’$I3®wÂŽß¡@% V¥"ƒUUÁj݆_ýhú J’$iÆõ?ó?âw(P ƒU©È`UUg°Z·Á¥kÒOP’$I3nxùñ;¨„ÁªTd°ªª3X­[ÿÜ?M?AI’$͸Ñ7?¿C€J¬JE«ª:ƒÕºõ>õ»é'(I’¤7Ù|uü*a°*¬ªê VëÖ=æ—ÓOP’$I3®yà®ø TÂ`U*2XUÕ¬Ö­sð3ÓOP’$I:<9~‹0X•Š VUu«•[½j:õÒÏP’$I3®{ô/åoQ`ñ¬JE«ª:ƒUš­›ÒÏP’$I3®wÚkâw(PƒU©È`UUg°Êø»_J?CI’$͸ÁEïŽß¡@ V¥"ƒUUÁ*£o™~†’$Išq£¯¿C€ ¬JE«ª:ƒU†ŽH?CI’$͸ñ¦Ëâw(PƒU©È`UUg°ÊàóïJ?CI’$͸æ'ßß¡@ V¥"ƒUUÁ*ýuoL?CI’$ͺ¦™.ð¤ø- ,8ƒU©È`UUg°Jï/O?CI’$êý¢ø- ,8ƒU©È`UUg°Jçˆ_H?CI’$êŸþºø- ,8ƒU©È`UUg°ÊOƒ¦I?EI’$͸ÁÅ›¿E€Åf°*¬ªê VÙ¦élI?EI’$͸Ñ×Oˆß¡À‚3X•Š VUu«l3ùá7ÓOQ’$I3n|û•ñ;Xp«R‘ÁªªÎ`•mÆ·|.ý%I’4ãšûïŒß¡À‚3X•Š VUu«l3úÚñé§(I’¤Y×4ÓÎOŽß¢À3X•Š VUu«l3¸ä}é§(I’¤@Ýc_¿E€f°*¬ªê VÙ¦¿þmé§(I’¤@ý3ÿ ~‹ Ì`U*2XUÕ¬²MïÄW¦Ÿ¢$I’ ¾ø÷ñ[X`«R‘ÁªªÎ`•mºz~ú)J’$)ÐèÚ“â·(°À V¥"ƒUUÁ*ÿt4Mú9J’$iÆ¿·!‹‹Ë`U*2XUÕ¬ò æ»ÒÏQ’$I3®Yº;~‡ Ì`U*2XUÕ¬ò É®I?GI’$êøÔø- ,(ƒU©È`UUg°ÊƒF7®O?GI’$ê~ôWã·(°  V¥"ƒUUÁ*~ùÃéç(I’¤@ýuoŠß¢À‚2X•Š VUu«-ýT%I’¬¿îMñ›˜C«R‘ÁªªÎ`•Õt¶¤Ÿ«$I’B /? ~sÈ`U*2XUÕ¬²³&›¯N?WI’$…ݸ>~sÈ`U*2XUÕ¬²³F×’~®’$I 5¹çæø= Ì!ƒU©È`UUg°ÊÎ\ò¾ôs•$IRªÉè§PJߤÀœ1X•Š VUu«ì¬þº7¦Ÿ«$I’‚uþ¥øM ̃U©È`UUg°ÊÎê~ôWÒÏU’$IÁúgþaü&æŒÁªTd°ªª3Xegu>ð”é´iÒOV’$I¡†—í¿I€9c°*¬ªê VÙÍýw¦Ÿ¬$I’Bn<;~sÆ`U*2XUÕ¬²+Æß½*ýd%I’jrÏMñ{˜3«R‘ÁªªÎ`•]1úƉé'+I’¤T“Ñti¿'ÄoR`ެJE«ª:ƒUvÅà —~²’$I Ö=ö%ñ›˜#«R‘ÁªªÎ`•]Ñ?ãõé'+I’¤`ýõoߤÀ1X•Š VUu«ìŠî1/N?YI’$^uXü&æˆÁªTd°ªª3Xe—ì¿×tÚ4ég+I’¤Pã[>—¿I€ùa°*¬ªê VÙUÍO¾Ÿ~¶’$I ÕÜ·9~sÄ`U*2XUÕ¬²«Æ›.K?[I’$ëø´øM Ì ƒU©È`UUg°Ê®}íøô³•$IR°Þ'^¿I€9a°*¬ªê VÙUƒ ÿ:ýl%I’¬Þ_ÄoR`N¬JE«ª:ƒUvUï”ßI?[I’$~å˜øM Ì ƒU©È`UUg°Ê®ê¬ýùô³•$IR°ñíWÆoR`N¬JE«ª:ƒUvÙêÇL§ƒ¥ôÓ•$IR¨¦»5“óÁ`U*2XUÕ¬²;&w^›~º’$I Öù࿈ߤÀ0X•Š VUu«ìŽÑõ§¥Ÿ®$I’‚õN~Uü&æ€ÁªTd°ªª3Xew .y_úéJ’$)Øà¢wÇoR`¬JE«ª:ƒUvGÿŒ7¤Ÿ®$I’‚®=9~“sÀ`U*2XUÕ¬²;ºG½0ýt%I’lrÇ7â7)0 V¥"ƒUUÁ*»åýŸN'£ôó•$IRªQoº´æ±ù»h7ƒU©È`UUg°Êîšl¹%ý|%I’¬{äÞñ›h9ƒU©È`UUg°ÊîßtnúùJ’$)XÿŒ×ÇoR å V¥"ƒUUÁ*»kxå!éç+I’¤`ƒKß¿I€–3X•Š VUu«ì®þ9oO?_I’$ݸ>~“-g°*¬ªê VÙ]Ýãþ}úùJ’$)ØdËÆøM ´œÁªTd°ªª3Xewu>ð3ÓiÓ¤Ÿ°$I’RMÆÓ¥ý÷Šß¥@‹¬JE«ª:ƒUöD󓤟°$I’‚u?ú+ñ›h1ƒU©È`UUg°Êžç‹é',I’¤`ýsÞ¿I€3X•Š VUu«ì‰áWŽN?aI’$~éðøM ´˜ÁªTd°ªª3XeO þá/ÓOX’$IÁÆÿøùøM ´˜ÁªTd°ªª3XeOôN|eú K’$)Xó“ÄoR Å V¥"ƒUUÁ*{¢sè³ÓOX’$Iá:?#~—-e°*¬ªê VÙSMwkúK’$)Xï„WÄoR ¥ V¥"ƒUUÁ*{j²ùêô3–$IR°Áùïˆß¤@K¬JE«ª:ƒUöÔèŸL?cI’$}ýñ›h)ƒU©È`UUg°Êž\ô7ég,I’¤`“ï5~“-e°*¬ªê VÙS½S/ýŒ%I’”lØ.­ylü.ZÈ`U*2XUÕ¬²§ºz~úK’$)\÷È¿K€2X•Š VUu«ì±Õ™NG½ôS–$IR°þ™˜¿K€ö1X•Š VUu«,‡É]ßJ?eI’$^qPü&ZÈ`U*2XUÕ¬²F7¬K?eI’$o¼ ~“-d°*¬ªê VYÃËöK?eI’$kîÛ¿I€2X•Š VUu«,‡þº7¦Ÿ²$I’Âu~Fü.ZÆ`U*2XUÕ¬²ºÇ¼8ý”%I’®wâ¯ÇïR e V¥"ƒUUÁ*Ëv\LFéç,I’¤`ƒÏýïü] ´‹ÁªTd°ªª3Xe¹Lî¹)ýœ%I’lôOÆoR e V¥"ƒUUÁ*Ëetúôs–$IR°É_ߤ@ˬJE«ª:ƒU–ËàÒ5éç,I’¤d£þtiÍãâw)Ð"«R‘ÁªªÎ`•åÒ?ýuéç,I’¤pÝ£^¿K€1X•Š VUu«,—î‘{§Ÿ³$I’ÂõÏÚ7~—-b°*¬ªê VY6k;»é'-I’¤`ëÍߥ@{¬JE«ª:ƒU–ÓäŽo¤Ÿ´$I’‚o¹0~“-b°*¬ªê VYN£ëNI?iI’$kî¿#~“-b°*¬ªê VYNƒ‹ß“~Ò’$I ×9äYñ»h ƒU©È`UUg°Êrêò;é'-I’¤p½OþFü.ZÂ`U*2XUÕ¬²œ:‡?7ý¤%I’nðùwÅïR % V¥"ƒUUÁ*Ë­éý8ý¬%I’ltíÉñ›h ƒU©È`UUg°ÊroCúYK’$)ØäÎëâ7)ЫR‘ÁªªÎ`•å6ºæ¸ô³–$IR²ñ`ºôþÇÇïR  V¥"ƒUUÁ*ËmpÁ;ÓÏZ’$IáºG¿(~—-`°*¬ªê VYn½_™~Ö’$I ×?û-ñ»hƒU©È`UUg°ÊrëüÌô³–$IR¸á—ߥ@ ¬JE«ª:ƒUVBóÀ]é§-I’¤`ã[/Žß¤@ ¬JE«ª:ƒUVÂø¶KÒO[’$IÁš¥»ã7)ЫR‘ÁªªÎ`••0üò‡ÓO[’$Iá:‡þlü. V¥"ƒUUÁ*+¡ÿÙ?I?mI’$…ëü[ñ»3X•Š VUu«¬„îñ/K?mI’$…\ô7ñ»3X•Š VUu«¬„ÎOžN›&ý¼%I’ltýiñ»3X•Š VUu«¬”æÇ·§Ÿ·$I’‚Mîþvü& V¥"ƒUUÁ*+e¼ñüôó–$IR²Éxº´ÿãw)d°*¬ªê VY)Ã+I?oI’$…ë·Oü.‚ V¥"ƒUUÁ*+¥ö[ÒÏ[’$IáúçýEü.‚ V¥"ƒUUÁ*+¥{Ì/§Ÿ·$I’®9.~—A«R‘ÁªªÎ`•=8&£ô—$IR°É÷¿š¿K€ƒU©È`UUg°ÊJšÜsSú‰K’$)Ù°;]Zó¸ø] „¬JE«ª:ƒUVÒ膳ÒO\’$IáºG½0~—!«R‘ÁªªÎ`••4¸ôýé'.I’¤pý³ß¿K€ƒU©È`UUg°ÊJêŸþºô—$IR¸á†µñ»1X•Š VUu«¬¤î‡žŸ~â’$I 7¾íÒø] „¬JE«ª:ƒUVÔêUÓ¦ÿ“ô3—$IR°¦»õ§waü6fÏ`U*2XUÕ¬²ÒÆßûrú™K’$)\çðçÅïR À`U*2XUÕ¬²Ò†_ýhú™K’$)\ï´×ÄïR À`U*2XUÕ¬²Òúçýyú™K’$)Üð²ýâw)`°*¬ªê VYiÝã_–~æ’$I 7¾éÜø] ¬JE«ª:ƒUVÜOšN›Iú©K’$)Xsß÷òw)0{«R‘ÁªªÎ`•Y˜Ü{kú©K’$)\çàgÆïR`Æ V¥"ƒUUÁ*³0ºq}ú©K’$)\ï“¿¿K€3X•Š VUu«ÌÂà’Õé§.I’¤pƒ‹Þ¿K€3X•Š VUu«ÌBïÓÿ-ýÔ%I’nôÍOÇïR`Æ V¥"ƒUUÁ*³ÐYû/ÓO]’$Iá&w;~—3f°*¬ªê V™‰Õ«¦Mwkú¹K’$)Ùd<]Úÿ‰ùÛ˜ƒU©È`UUg°Ê¬Œo¿2ýÜ%I’®{Ü>ñ»˜!ƒU©È`UUg°Ê¬ ¿rtú¹K’$)\ÿ¼?ߥÀ ¬JE«ª:ƒUf¥ÿÙ?I?wI’$…]s\ü.fÈ`U*2XUÕ¬2+ݽ4ýÜ%I’nòý¯ÆïR`† V¥"ƒUUÁ*3³ÿ^Óédœ~ò’$IJ6ìN—Ö<.›³a°*¬ªê V™¥É=7§Ÿ¼$I’ÂuzAü.fÄ`U*2XUÕ¬2K£o™~ò’$I ×?ûÍñ»˜ƒU©È`UUg°Ê, ¾ðÞô“—$IR¸á†µñ»˜ƒU©È`UUg°Ê,õN}uúÉK’$)Üø¶Kâw)0#«R‘ÁªªÎ`•Yê|ðçÒO^’$IášÎâw)0#«R‘ÁªªÎ`•Yk:[ÒÏ^’$Iá:‡?/~—3`°*¬ªê V™µñ¦ËÒÏ^’$Iáz§½&~—3`°*¬ªê V™µá—?œ~ö’$I 7¼lÿø] Ì€ÁªTd°ªª3XeÖúçüQúÙK’$)Üxãùñ»˜ƒU©È`UUg°Ê¬uýwég/I’¤pÍ?Œß¥À ¬JE«ª:ƒU"‡Èx˜~ú’$I ×9ì9ùÛXY«R‘ÁªªÎ`•„ÉÝ7¦Ÿ¾$I’ÂõN}uü.V˜ÁªTd°ªª3X%atýié§/I’¤pƒK×ÄïR`…¬JE«ª:ƒU¿'ýô%I’n|Ó¹ñ»Xa«R‘ÁªªÎ`•„ÞɯJ?}I’$…kîÛ¿K€f°*¬ªê VIèúìôÓ—$IR êò¬øm ¬ ƒU©È`UUg°JJóÀÓÏ_’$Iáz§üvü.VÁªTd°ªª3X%e|ËçÒÏ_’$Iá_üûø] ¬ ƒU©È`UUg°JÊðŠÓÏ_’$IáF7®ß¥À 2X•Š VUu«¤ôÏx}úùK’$)\óãÛãw)°‚ V¥"ƒUUÁ*)#~1ýü%I’Ô‚:?3~›+Ä`U*2XUÕ¬³zÕ´énM’$I ×;é7ó·)°2 V¥"ƒUUÁ*IãM—§?I’$…\ü·ñ»X!«R‘ÁªªÎ`•¤á†#ÒŸ€$I’ÂnX¿K€b°*¬ªê VIêŸý–ô' I’¤p“{¿¿K€b°*¬ªê VIêõÂô' I’¤tM3íôôøm ¬ƒU©È`UUg°JÔšÇN§ÃNú3$IR¸Þ‰¯ÌߦÀò3X•Š VUu«¤M¾ÿ•ôg I’¤pƒ‹Þ¿K€`°*¬ªê VI]ó±ôg I’¤p£ëOߥÀ 0X•Š VUu«¤õÏý³ôg I’¤p“-ãw)° V¥"ƒUUÁ*iݽ4ýH’$)]ÓL;>5~›ËÌ`U*2XUÕ¬ÒŠÃd-~›{À`U*2XUÕ¬ÒFÝ#÷N’$IjA½_¿M€=`°*¬ªê Vi¥Õ«¦Mï¾ôç!I’¤pƒ‹ß“¿M€Ýg°*¬ªê Vi«ñ¦ËÓŸ‡$I’ÂnX¿K€=`°*¬ªê Vi«á†µéÏC’$Iáš­·ÅïR`¬JE«ª:ƒUÚªÖ¾éÏC’$IéšfÚ9øñÛØM«R‘ÁªªÎ`•¶ê¹wúó$IR êü[ñÛØM«R‘ÁªªÎ`•ÖZ½jÚôîK"’$I 7øâÿÉߦÀî1X•Š VUu«´ÙxÓåéOD’$IáÆßþLü.v“ÁªTd°ªª3X¥Í†Ö¦?I’$…kîÛ¿K€Ýd°*¬ªê Vi³þYû¦?I’$µ Î¡ÏŽß¦Àn0X•Š VUu«´Y÷Ƚӟˆ$I’ZPïÔWÇoS`7¬JE«ª:ƒUZmõªiÓ»/ý™H’$)ÜàÒ÷çoS`׬JE«ª:ƒUÚn¼éòôg"I’¤pãçÇïR`7¬JE«ª:ƒUÚn¸amú3‘$IR¸æ»âw)° V¥"ƒUUÁ*m×?kßôg"I’¤ÔùàÏÅoS`¬JE«ª:ƒUÚ®{äÞéÏD’$I-¨wÚïÇoS`¬JE«ª:ƒUZoõªiÓ»/ý©H’$)ÜðŠó·)°k V¥"ƒUUÁ*ó`¼éòô§"I’¤pã[/Šß¥À.2X•Š VUu«Ìƒá†µéOE’$Iášî½?ýõýôm ìƒU©È`UUg°Ê<蟵oúS‘$IR êñ ñÛØ«R‘ÁªªÎ`•yÐ=rïô§"I’¤Ô?óâ·)° V¥"ƒUUÁ*saõªiÓ»/ý¹H’$)ÜðªÃò·)°ó V¥"ƒUUÁ*ób¼éòôç"I’¤pãÛ.ߥÀ.0X•Š VUu«Ì‹á†µéÏE’$Iá¶ýêþÒêÇÄoS`'¬JE«ª:ƒUæEÿ¬}ÓŸ‹$I’ZP÷Ƚã·)°“ V¥"ƒUUÁ*óbÛ0A’$IêŸõßã·)°“ V¥"ƒUUÁ*scõªŸþ XI’$ÕÝðËÊߦÀÎ1X•Š VUu«Ì“ñ¦ËÓŸŒ$I’¿{Uü.v’ÁªTd°ªª3Xež 7¬M2’$I × ˜.­ylü6v‚ÁªTd°ªª3Xežô×½1ýÉH’$©u~Qü6v‚ÁªTd°ªª3XežtŽøÅô'#I’¤ÔÿìÿŒß¦ÀN0X•Š VUu«Ì•Õ«¦MçGéÏF’$IáF×—¿M€3X•Š VUu«Ì›ñ­¥?I’$…›Üymü.v‚ÁªTd°ªª3XeÞ ¯80ýÙH’$)Ýx8]Ú¯øm ì€ÁªTd°ªª3XeÞôN{Mú³‘$IR ê~ü×â·)°«R‘ÁªªÎ`•yÓ9ì9éÏF’$I-hpá_ÅoS` V¥"ƒUUÁ*ó¨¹ÿŽô§#I’¤p£ëO‹ß¥À¬JE«ª:ƒUæÑøæóÒŸŽ$I’ÂM~ôñ»ØƒU©È½–~_ IDAT`UUg°Ê<\ò¾ô§#I’¤tM3íüŒøm < ƒU©È`UUg°Ê<êüªô§#I’¤´í.LߦÀ£0X•Š VUu«Ì£ÎAÿü§¿¨%I’¤ºÛöËûéÛx«R‘ÁªªÎ`•yÕlÝ”þ|$I’n|óyñ»x«R‘ÁªªÎ`•y5ºa]úó‘$IR¸æÆïRàQ¬JE«ª:ƒUæÕà¢w§?I’$µ ÎáϋߦÀv¬JE«ª:ƒUæUïÄ_O>’$IjAý3Þ¿M€í0X•Š VUu«Ì«Îž26“ô'$I’¤pë‹ß¦Àv¬JE«ª:ƒUæÙ䞛ҟ$I’Â7]¿K€í0X•Š VUu«Ì³Ñu§¤?!I’$…kú÷O—Ö<6~›À`U*2XUÕ¬2Ïç¿#ý I’$©uzaü6ÁªTd°ªª3XežuYú’$IR êŸóGñÛx«R‘ÁªªÎ`•¹¶ß¦Óñ0ýI’$)Üð«ÇæoSàÿg°*¬ªê V™w“;¯MF’$I 7ùÁ×âw)ð V¥"ƒUUÁ*ónôµãÓŸ‘$I’Ò‡Ó¥ý÷Šß¦ÀìJE«ª:ƒUæ]ÿÜ?MF’$IjAÝãö‰ß¦ÀìJE«ª:ƒUæ]÷Ø—¤?#I’$µ ÁïŒß¦ÀìJE«ª:ƒUæÞšÇM§ÃnúS’$IR¸ÑuŸÊߦ@É`U*2XUÕ¬²&›¯NJ’$I 7Ù²1~—c°*¬ªê VYë?’þ”$I’”®i¦Ÿ¿M€‡0X•Š VUu«,‚þú·¦?%I’$µ ÞIÿ5~›Àÿcïîƒî.ë;+N« ¶Ý阮uKÛÝucÛmK·ƮڊuÝLÛÝÊj;ÛÚŽ¶Ì6»ÛvËhInI"% ‚FBˆ© 4¢Ü!É* ) VÅ`å! €pŸó;¿k'Á¹T‡Ü÷÷:çz½g^ÿ#ä:ùæøI2À·¬JY«ª:ƒU¦A÷ÜçF?%I’$Pÿš7„ߦÀìJY«ª:ƒU¦Âʧ¦¶¹/ú9I’$)¸ÑçÞ›ßb°*e¬ªê V™£[?ýœ$I’\ûÀáw)ð0«R–ÁªªÎ`•i1ØyFôs’$IRuÎø—á·)ðM«R–ÁªªÎ`•iÑ{÷+¢Ÿ“$I’ ¨y× ¿M€o2X•² VUu«L‹Î™Ï‰~N’$I* ÁGO ¿M€o2X•² VUu«L“ö;¢Ÿ”$I’‚}éÚð»ø&ƒU)Ë`UUg°Ê4í»2úII’$)¸¶¹?Í­<"ü6 V¥oÏ`UUg°Ê4é_{Jô“’$IRuÏ}nøm ¬JßžÁªªÎ`•iÒl>!úII’$©€zÛ^~›«Ò·g°ªª3XeštÖ›R;Ž~V’$I nð‰óÂoSÀ`Uúö VUu«L›ñ=·D?+I’$7þçO†ß¥€Áªôí¬ªê V™6Ã=ïˆ~V’$IŠnÔOsoüþðÛªg°*e¬ªê V™6ý÷ÿyô³’$IRu/ø•ðÛªg°*e¬ªê V™6Ýó9úYI’$©€úÛÿgøm Õ3X•² VUu«Lå¡3ìE?-I’$7¼é]ñ·)ÔÎ`UÊ2XUÕ¬2ÆÿüÉè§%I’¤àÚ{¿~—@õ V¥,ƒUUÁ*Óhð‰ó¢Ÿ–$I’ ¨ó·?~›@Õ V¥,ƒUUÁ*Ó¨·íÕÑOK’$IÔlýÏá·)TÍ`UÊ2XUÕ¬2ºç>7úiI’$©€ÿ°:ü6€ª¬JY«ª:ƒU¦Òʧ¦¶¹/úyI’$)¸Ñ?›@Í V¥,ƒUUÁ*ÓjôÅk¢Ÿ—$I’‚k›ûÓÜÊ#ÂoS¨–Áª”e°ªª3XeZ ®{Sôó’$IRuÏ}nøm Õ2X•² VUu«L«æ¿ý¼$I’T@½÷ü÷ðÛªe°*e¬ªê V™VÓŸý¼$I’T@ƒOn ¿M Z«R–ÁªªÎ`•iÖÞÿ•è'&I’¤àÆ·*ü.€j¬JY«ª:ƒU¦Ùpï¶è'&I’¤èFƒ4wêÓÂoS¨’Áª”e°ªª3Xešõ¯>9ú‰I’$©€š _~›@• V¥,ƒUUÁ*Ó¬¹èÅÑOL’$IÔÿà_†ß¦P%ƒU)Ë`UUg°Ê4ë¬9&¥ñ(ú™I’$)¸áÍ—‡ß¦P%ƒU)Ë`UUg°Ê´ßusô3“$IRpíý·…ߥP%ƒU)Ë`UUg°Ê´~ê¢èg&I’¤ê¬ûÑðÛªc°*e¬ªê V™v½+ÿ4ú™I’$©€šwþvøm Õ1X•² VUu«L»îÆ_ˆ~f’$I* ÁGO ¿M :«R–ÁªªÎ`•©7³(¥A7ú©I’$)¸Ñ—vÄߦPƒU)Ë`UUg°J F·íŠ~j’$I ®í=æV~›@U V¥,ƒUUÁ*5ì:;ú©I’$©€ºçýtøm U1X•² VUu«Ô wùïE?5I’$Pï½~›@U V¥,ƒUUÁ*5èžý“ÑOM’$I4¼aSøm U1X•² VUu«TaåSSÛ¹'ú¹I’$)¸ñ7ÅߦPƒU)Ë`UUg°J-FŸÿ@ôs“$IRtãQê¬9&ü6€j¬JY«ª:ƒUj1øÈ£Ÿ›$I’ ¨¹èEá·)TÃ`UÊ2XUÕ¬R‹æ/~n’$I* þÕ'‡ß¦P ƒU)Ë`UUg°J-:§ýpJmýä$I’Üè³W„ߦP ƒU)Ë`UUg°JMÚ{¿ýä$I’\ûÀáw)TÃ`UÊ2XUÕ¬R“ágÞýä$I’T@3ž~›@ V¥,ƒUUÁ*5éð/¢Ÿœ$I’ ¨÷îß ¿M  «R–ÁªªÎ`•š4¾ úÉI’$©€;Ï¿M  «R–ÁªªÎ`•ªœú)ÑÏN’$IÁ¾üÑøÛj`°*e¬ªê V©ÍøŽ=ÑÏN’$IÑ :inÕQá·)L=ƒU)Ë`UUg°Jm†×Ÿýì$I’T@Ý·þ\øm SÏ`UÊ2XUÕ¬R›Þ{ÿ8úÙI’$©€zW¾.ü6€©g°*e¬ªê V©M÷¼Ÿ‰~v’$I* á§.¿M`ê¬JY«ª:ƒUª³òˆÔöˆ~z’$I n|÷çâoS˜v«R–ÁªªÎ`•¾|]ôÓ“$IRtm›:oú¡ðÛ¦šÁª”e°ªª3X¥FƒgD?=I’$P³åeá·)L5ƒU)Ë`UUg°Jzï~EôÓ“$IR >òÆðÛ¦šÁª”e°ªª3X¥F3Ÿýô$I’T@£/\~›ÀT3X•² VUu«Ôª}àŽèç'I’¤àÚÞ7ÒÜÊ#ÂoS˜Z«R–ÁªªÎ`•Zö]ýü$I’T@Ý Ï ¿M`j¬JY«ª:ƒUjÕ¿ö”èç'I’¤ê½÷OÂoS˜Z«R–ÁªªÎ`•Z5—¼4úùI’$©€†7¾=ü6€©e°*e¬ªê V©Ugí3SjÇÑOP’$IÁ|6ü6€©e°*e¬ªê V©Ùøž[¢Ÿ $I’¢kÛÔyӆߦ0• V¥,ƒUUÁ*5îyGô”$IR5—üføm SÉ`UÊ2XUÕ¬R³þûÿ<ú J’$©€ú;fÂoS˜J«R–ÁªªÎ`•šuÏÿåè'(I’¤}áCá·)L%ƒU)Ë`UUg°Ê\íGѰý %I’\ÛÜ—æVŸÀ´1X•² VUu«ÔnüÕ룟¡$I’ ¨»aIøm SÇ`UÊ2XUÕ¬R»Á'΋~†’$I* Þ¯ ¿M`ê¬JY«ª:ƒUj×Ûöêèg(I’¤Þxaøm SÇ`UÊ2XUÕ¬R»î¹Ï~†’$I* ñ½á·)LƒU)Ë`UUg°JõV>5µÍ}ÑOQ’$Iѵmê¬}fü} ÓÄ`UÊ2XUÕ¬ÂSÒè‹×D?EI’$P³ù„ðÛ¦ŠÁª”e°ªª3X…§¤Áuk£Ÿ¢$I’ ¨¿cUøm SÅ`UÊ2XUÕ¬ÂSRów¿ý%I’T@£ú`øm SÅ`UÊ2XUÕ¬ÂSRço$ú)J’$©€Úæ¾4·òˆðû¦†Áª”e°ªª3X…‡´÷í~Ž’$I* î¹Ï ¿M`j¬JY«ª:ƒUxÈðæË£Ÿ£$I’ ¨wÅ…ߦ05 V¥,ƒUUÁ*<¤ÿÁ¿Œ~Ž’$I* á ›ÂoS˜«R–ÁªªÎ`Ò\ø‚èç(I’¤ßõ™ðÛ¦†Áª”e°ªª3X…o:õi)‡ÑOR’$IѵãÔY{lü} ÓÀ`UÊ2XUլ·ŒïØý$%I’T@Íæ—„ߦ0 V¥,ƒUUÁ*|Ëðú󣟤$I’ ¨íÊðÛ¦‚Áª”e°ªª3X…oé]ñšè')I’¤}~{øm SÁ`UÊ2XUլ·t7€‰b°*e¬ªê Vá{ßusôS•$IR ¯[øm Å`UÊ2XUÕ¬Â÷6¼ñíÑOU’$I4¾ë3á·)LƒU)Ë`UUg° ß[ï}¯~ª’$I*¡vœ:k ¿O`b¬JY«ª:ƒUøÞºoù÷ÑOU’$I…Ô\ò›á÷)L ƒU)Ë`UUg° Áª#SÛ0ú¹J’$©€95þ>€Ia°*e¬ªê Vá±}ù£ÑÏU’$I4úÒµá·)L ƒU)Ë`UUg° Í`ç™ÑÏU’$I%ÔŸKs«Ž ¿O`"¬JY«ª:ƒUxlzï~Eôs•$IR!ußúóá÷)LƒU)Ë`UUg° MçÌçD?WI’$Rÿªÿ~ŸÀD0X•² VUu«ðصÜýd%I’T@ÛÞ~›ÀD0X•² VUu«ðØ>÷¾è'+I’¤jïÛ~›ÀD0X•² VUu«ðØõ¯yCô“•$IR!uÎxvø} Å3X•² VUu«ðØ5ÿFô“•$IR!õ.=1ü>€â¬JY«ª:ƒUxì:kŽI©G?[I’$Ð`×9á÷)Ï`UÊ2XUÕ¬Âã3>ðÙèg+I’¤õúðÛŠg°*e¬ªê Váñ~êâèg+I’¤ ÒÜ©O ¿O h«R–ÁªªÎ`ŸÞ•ýl%I’THÍÛ_~Ÿ@Ñ V¥,ƒUUÁ*<>Ý·þ|ô³•$IR!õ¯yCø} E3X•² VUu«ð8­:*¥þ\ôÓ•$IRn¹*þ>€’¬JY«ª:ƒUxüFûwF?]I’$PÛùZš[ùÔðûŠe°*e¬ªê Váñ|ü¬è§+I’¤BênX~Ÿ@± V¥,ƒUUÁ*<~½Kÿ[ôÓ•$IR!õÞ÷ÚðûŠe°*e¬ªê Váñë¼ùÇ£Ÿ®$I’ i¸gKø} Å2X•² VUu«ðÄ´Þý|%I’T@í½·†ß¦P,ƒU)Ë`UUg° OÌhßlôó•$IR!uÎxvø} E2X•² VUu«ðÄô¯=%úùJ’$©z—½2ü>€"¬JY«ª:ƒUxbšÍ'D?_I’$Òàç…ß§P$ƒU)Ë`UUg° OLgí±)µãè',I’¤ß±'ü>€"¬JY«ª:ƒUxâÆwï‹~Â’$I*¡v|è74Eß§PƒU)Ë`UUg° OÜpÏ–è',I’¤Bj¶¼,ü>€â¬JY«ª:ƒUxâú³'E?aI’$Òີá÷)Ç`UÊ2XUÕ¬Â×Ýx|ô–$IR!¾|]ø} Å1X•² VUu«ð$Ì,JiÐ~Æ’$I*¡A÷Зná7*”Ä`UÊ2XUլ“3þÊîèg,I’¤Bênz~ø} E1X•² VUu«ðä výŒ%I’THý«ÿ:ü>€¢¬JY«ª:ƒUxrz—½*úK’$©FûfÃïS(ŠÁª”e°ªª3X…'§sÖqÑÏX’$I…ÔvïMs+¿Q «R–ÁªªÎ`ž¼vî@ôS–$IR!u7€b¬JY«ª:ƒUxòF·¼?ú)K’$©zW¾.ü>€b¬JY«ª:ƒUxòú×®Œ~Ê’$I*¤á?n ¿O «R–ÁªªÎ`ž¼æ’—F?eI’$R{ß—ÃïS(†Áª”e°ªª3X…'¯³ö™)µãèç,I’¤Bêœùcá7*Á`UÊ2XUÕ¬Âá1¾ç–èç,I’¤Bê]þ{á÷)Á`UÊ2XUÕ¬Âá1ܳ%ú9K’$©ŸxKø} E0X•² VUu«pxôgOŠ~Î’$I*¤ñÿ~Ÿ@ V¥,ƒUUÁ*Ý·ýbôs–$IR)µãÔyÓ…ߨÎ`UÊ2XUÕ¬Âa2³(¥A7úIK’$©šw¼<þF€h«R–ÁªªÎ`ŸñWvG?iI’$Òàº7…ß§Î`UÊ2XUÕ¬Âá3ØuNô“–$IR!ö,ü>€p«R–ÁªªÎ`ŸÞe¯Š~Ò’$I*¥a/ͽñûÃoTe°*e¬ªê Váðéœu\ô“–$IRA5›–†ß¨Ê`UÊ2XUÕ¬ÂáÕ>xWô³–$IR!õ¯>9ü>€P«R–ÁªªÎ`¯Ñ-WE?kI’$ÒÁÛ0ú>€P«R–ÁªªÎ`¯þµ+£Ÿµ$I’ ©íÞ›æV~£@ƒU)Ë`UUg° ‡WsÉK£Ÿµ$I’ ª{ÞO‡ß¨Æ`UÊ2XUÕ¬ÂáÕyÓ¦Ô¶ÑO[’$I…ÔŸý³ð¬JY«ª:ƒU8üÆ÷Üý´%I’THÛÞ~Ÿ@ƒU)Ë`UUg° ‡ßpÏ–è§-I’¤Bj¸#ü>€0«R–ÁªªÎ`¿þìIÑO[’$IÕ=û§ÂoTa°*e¬ªê Váðën<>úiK’$© zW¼&üF€«R–ÁªªÎ`æÁÌ¢”Ýèç-I’¤B~ú’ø"¬JY«ª:ƒU˜ã¯ìŽ~Þ’$I*¤öÞ[ÃïSa°*e¬ªê Va~ vý¼%I’TP3Ÿ~£À‚3X•² VUu«0?z—½*úyK’$© zÿá7*,8ƒU)Ë`UUg° ó£sÖqÑÏ[’$I5¼á‚ðœÁª”e°ªª3X…ùÓ>xWô—$IR!ï¹%ü>€g°*e¬ªê VaþŒn¹*ú‰K’$© :ë‡ß¨°  V¥,ƒUUÁ*ÌŸþµ§D?qI’$TïÒÃoTXP«R–ÁªªÎ`æOsÉK£Ÿ¸$I’ jð‰óÂoTXP«R–ÁªªÎ`æOgí3SjÇÑÏ\’$I…4¾ó¦ð”Áª”e°ªª3X…ù5¾ç–èg.I’¤RjÛÔ9í‡ÃoTX0«R–ÁªªÎ`æ×pÏ–èg.I’¤‚jþî·ÂoTX0«R–ÁªªÎ`æWö¤èg.I’¤‚|üÍá7*,ƒU)Ë`UUg° ó«»ñøèg.I’¤‚õúðŒÁª”e°ªª3X…y6³(¥A7ú©K’$©”ÆÃÔYóŒø;‚Áª”e°ªª3X…ù7ºmWôS—$IRA5[^~£À‚0X•² VUu«0ÿ»Î‰~ê’$I*¨ÁGO ¿Q`A¬JY«ª:ƒU˜½Ë^ýÔ%I’TP£Û>~£À‚0X•² VUu«0ÿ:gýÔ%I’TR£~š;õiáw*Ì;ƒU)Ë`UUg° £}ð®èç.I’¤‚j.zqø óÎ`UÊ2XUÕ¬ÂÂÝrUôs—$IRAõw̄ߨ0ï V¥,ƒUUÁ*,Œþµ§D?wI’$ÔèK;ÂoT˜w«R–ÁªªÎ`F³ù„èç.I’¤’t}I}§À¼2X•² VUu«°0:kM©G?yI’$T³iiø óÊ`UÊ2XUÕ¬ÂÂß½/úÉK’$© ú~}ø 0oV>5þŸx«R–ÁªªÎ`ÎpÏ–è'/I’¤‚ýÓÃoT€Ã¥³nqj¶.Ký3i´o6µ÷ÞþÏD V¥,ƒUUÁ*,œþìIÑO^’$IÕöLs«Ž ¿S¯ÎšcR³iiêo_qèo:8NýŽFƒðN `°*e¬ªê Vaát7ýä%I’TXÝ·ýbø ð¨V•º–¤Þ¶åixÃi|`oJíø1}:7³(þ¨cÜ IDATŸŸX«R–ÁªªÎ`ÐÌ¢”Ýèg/I’¤‚êð/âïT€‡é¬[œz—ž˜»×§Ñþ) ›'ühgÍ3Âÿ÷Ì`UÊ2XUÕ¬ÂÂݶ+úÙK’$© Fû® ¿Q€ºÇ©ÍÖe©¿c&öͦ¶óµÃúhçôg…ÿo$˜Áª”e°ªª3X……5Øuvô³—$IRAµÍýinÕ‘áw*0ý:kŽIͦ¥©¿}EîÙ’ÆöÎûw ³~"ü7Á V¥,ƒUUÁ*,¬Þe¯Š~ö’$I*¬îÆãÃïT`ʬ:*u7,I½mËÓð† §¶ã…ÿþ󼟎ÿwA,ƒU)Ë`UUg° «sÖqÑÏ^’$I…ÕÿÐ_…ß©Àdë¬[œz—ž˜»×§Ñþ) º©„ºçÿRø¿‚¬JY«ª:ƒUXxíƒwE?}I’$Ôè–÷‡ß¨ÀdS›­ËRÇLí›MmçžTjÍE/ ÿ÷E0ƒU)Ë`UUg° otËUÑO_’$IÕö8ô×sEß©@y:«Nͦ¥©¿}EîÙ’Æö¦IªyÇËÃÿÌ`UÊ2XUÕ¬ÂÂë_{JôÓ—$IRaùk±€ƒ¿±½»aIêm[ž»×§ñí7¦ÔŽÓ$×{÷ïÆÿ{%–Áª”e°ªª3X……×l>!úéK’$©°úWÿuø ,¬ÎºÅ©Ùº, >vzíߙҠ›¦­ƒãÛèÏ3X•² VUu«°ð:køß'I’¤ÃÛèó¿S€ùÓYûÌÔl~Iêï˜I£}³©»;ÕPïÊ×…ÿ»'˜Áª”e°ªª3X…ã»÷E?I’$TÛ0ÍÍ, ¿S€'¯³úèÔlZšúÛW¤áž-i|`oJm›j¬ÿÿþ߃`«R–ÁªªÎ`büE‰$I’ôðºüJø öïLi4ˆþº±˜ú×üMü#b¬JY«ª:ƒUˆÑŸ=)úùK’$©°ú~}ø <ºîÙ?•z—ÿ~ì:'nÛ•Ò ýÕbÑ ®[þߌ`«R–ÁªªÎ`bt7ýü%I’TX£/\~§ßÒY{lj6¿$õw̤ѾÙÔÎÝý5âÄ5ØyføG‚¬JY«ª:ƒU2³Èï´“$IRÞ “æf¾/þV€­~zj6-Mýí+ÒpÏ–4>°7¥¶þÖpâüß ñÿm‰e°*e¬ªê V!Ρ¿B’$IzX¿¾S`ê­:2u7,I½mËÓ`÷ú4Ú¿3¥Q?úëÁ©lxÃñÿ½‰e°*e¬ªê V!Î`×ÙÑ’$I*¬þ5~§À´é¬[œš­ËRÇL}ñšCÛ‘¦á§/ ÿïO0ƒU)Ë`UUg° qz—½*ú#@’$I…uðËòè;&Ygí±‡þ&£þÕ'§Ñ¾ÙÔΈþگꆟ¹4üÇÁ V¥,ƒUUÁ*Äéœu\ôG€$I’JkÐ9ôå]ô­ afQên<>õ·¯HÃ=[ÒøÀÞ”Ú6ú[>=¬ÑçÞÿã„X«R–ÁªªÎ`bµÞý1 I’¤Âj.üµð;гêÈÔݰ$õ¶-OƒÝëÓhÿΔFýè¯óô=}þñ?vˆe°*e¬ªê V!Öè–«¢?$I’TXý«ÂïTˆÖY·85[—¥þŽ™4Ú7›Úæ¾è¯îôÝú‘ðK3X•² VUu««í)Ñ’$I*,_àP›Îšg¤fÓÒÔ¿ú䇯©þ¦Ê©itÛ®ð_3X•² VUu««Ù|BôÇ€$I’Jkؤ¹7~ø­ óbfQên<>õ·¯HÃ=[ÒøÀÞ”Ú6ú[9ÍSãÛoŒÿ1G,ƒU)Ë`UUg° ±:kM©GH’$©°š‹^~«À“¶êÈÔݰ$õ¶-OƒÝëÓhÿΔ†½è¯ß´€ïº9þÇ!± V¥,ƒUUÁ*Äß½/ú£@’$I…5øÈÃïTx¼:ë§fë²Ôß1“FûfSÛ½7ú«67þúÂ\Ì`UÊ2XUÕ¬B¼á§/‰þ($IRa¾üÑð;MgÍ3R³iiêo_‘†7_žÚïŒþZMÖÞÿ•ð«3X•² VUu«¯?{RôG$I’JkÔOs§>-üV€Cf¥î†%©÷¾×¦áž-i|`oJí8ú[4M@íÜø¿Ä2X•² VUu«¯»ñøèI’$Xsño„ߪThå©»áy©wÅ¥Á'7¦ñíŸJi4ˆþºLZÛÜÿcšX«R–ÁªªÎ` 0³(¥A7úã@’$I…5ø‡Õñ·*S¯³nqj¶.Ký3i´o6µÝ¯G5¦iª?þcœ`«R–ÁªªÎ`Ê0ºmWôÇ$I’ k´gø Àté¬9&5›–¦þöi¸gKjïûrô×`šö†½ð÷3X•² VUu«P†Á®³£?$I’TZ£~š[ýôð[€ 5³(u7,I½÷½öÐ8u|`oJí8ú[/ÕV;Ž Ä2X•² VUu«P†Þe¯Œþ8$IR5›O¿U˜ ³~"õ¶-OƒÝëýí=iØD½%jnåáïƒ@«R–ÁªªÎ`ÊÐ9ë¸èI’$Øà£§…ߪ”§³nqj¶.Ký3i´o6µ¯E•%=bs3ßþfd°*e¬ªê V¡íƒwE$H’$©°Æÿü‰ð;€X5ǤfÓÒÔß¾" ÷lIí½·Fm%=®æV?=üÈ`UÊ2XUÕ¬B9F·\ý‘ I’¤ÒRgí3ÃoUȪ£RwÃ’ÔÛ¶< o¸ ìM©GK%=©:k[Ä1X•² VUu«PŽþµ§D$H’$©Àš¿û­ð[€ùÑY·8õ.=1 v¯O£ý;S6Ñ_GI‡½Îi?þÖd°*e¬ªê V¡Íæ¢?$I’T`ƒÝç†ßªžqj³uYêï˜I£}³©í|-ú«'iAêœþ¬ð÷G ƒU)Ë`UUg° å8ø× øë<$I’ôíükߢoUŸÎê£S³iiêo_‘†{¶úŽGªµÎÏ“2X•² VUu«P–ñÝû¢?$I’TZm{èO߈¾Ux«ŽJÝ KRoÛò4ؽ>o¿ÑT#=¬ÎYÇÅ¿Sâ¬JY«ª:ƒU(ËðÓ—D,H’$©Àz—ÿ~ø­ ÀCþæâÞ¥'§ŽöïLiÐþúH*ºî9ÿ:üÝÈ`UÊ2XUÕ¬BYú³'E,H’$©À†Ÿº(üV¨Qçôg¥fë²Ôß1“FûfSÛ¹'ú«"iâêžûïÂß2 V¥,ƒUUÁ*”¥»ñøèI’$X{ÿmá·*À´ë¬>:5›–¦þöi¸gKØýµ4ußò³áï›@«R–ÁªªÎ` 3³È_"I’¤ïZ÷쟊¿W¦ÅÌ¢C˜LöÏÒðS?4NmÇÑ_ISYwã/Ä¿yâ¬JY«ª:ƒU(Ïè¶]Ñ ’$I*°Þ•¯ ¿U&UgÝâÔl]–;=öïô‡ÈH ØÁqxôg V¥,ƒUUÁ*”g°ëìèI’$ØðæËÃoU€IÐYûÌÔl~Iêï˜I£}³©»;ú«©êºoû០2X•² VUu«PžÞe¯Œþh$IRµ¯¥¹•G„ß«EYýôÔlZšúÛW¤áž-i|`oJmýUޤ‡Õ=ÿ—ã?+ˆc°*e¬ªê V¡<7ÿxôGƒ$I’ ­ûÖŸ ¿W¬:*u7,I½mËÓ`÷ú4Ú¿3¥Q?ú+Iߣî¿ÿùAƒU)Ë`UUg° ej¼+úãA’$IÖÿà_†ßª ¥³nqj¶.Ký3iôÅkRt¢¿ž‘ôênz~øç V¥,ƒUUÁ*”i´o6úãA’$I6úüÂoU€ùÐY{lj6-Mý«O>ôÿ•µs¢¿Š‘t˜j.|Aøg V¥,ƒUUÁ*”©í)Ñ’$I*±þ\š›ù¾ð{àIYýô‡Æ©ÛW¤áž-i|`oJmýÍ‹¤yª¹ð×â?wˆc°*e¬ªê V¡LÍæ¢?$I’Thþ4`¢¬:2u7,I½mËÓ`÷ú4Ú¿3¥Q?ú+I XóöÆÇ`UÊ2XUÕ¬B¹åIjÇÑ’$I*°þŽ™ð{à‘tÖ-NÍÖe‡¾Ã}ñš”è¯S$×\ôâðÏ&¬JY«ª:ƒU(×øî}Ñ’$I*°Ñþ…ߪÿÿai6-Mý«ON£}³©;ýÕ‰¤k.þõðÏ+¬JY«ª:ƒU(×ðÓ—DDH’$©ÄFýÔY}tø½ TffQên<>õ·¯HÃ=[ÒøÀÞ”Ú6ú›IP³ù%ñŸaÄ1X•² VUu«P®þìŸEDH’$©Ðš-/ ¿W€)¶êÈÔݰ$õ¶-OƒÝëÓhÿΔ†½è¯D$MhÍ%/ÿ\#ŽÁª”e°ªª3X…rüª’$IÒwk°óÌð{˜u‹S³uYêï˜I£}³©mî‹þúCÒå7àWÎ`UÊ2XUÕ¬BÁf¥4èFLH’$©ÀÆw|:þ^&RgÍ3R³iiêo_‘†7_žÚïŠþªCÒ”×lùOáŸ}2X•² VUu«P¶Ñm»¢?&$I’Tbí8uNûá÷*P¸S u7=?õ?ð¿Òð¦w¦ñ׿ý­†¤ kÞñòøÏCâ¬JY«ª:ƒU(Û`×ÙÑ’$I*´Þ¥'†ß«@AV™º–¤Þ¶åi°{}íߙҰý†$¥fËËâ?#‰c°*e¬ªê V¡l½Ë^ý1!I’¤B^~ø½ ÄéœùœÔ{÷+Ò`çiôåëRÛ0úë Iú®5—üføg& V¥,ƒUUÁ*”­óæý1!I’¤B;øWøEß«ÀÂè¬yFj6-Mýí+ÒðæËSûàÑ_MHÒc®¹ä¥áŸ£2X•² VUu«P¾öÛ£?*$I’Th7ÿxø½ f3‹RwÃ’Ô{ßkÓpÏ–4>°7¥vý5„$=ášÍ'ĶÇ`UÊ2XUÕ¬BùFŸ½"ú£B’$I…Ö»â5á÷*ð$¬<"u7ñ–è I’$ÚèÖ„ß«0íãÔfë²Ôß1“FûfSÛùZô×’4Q5oÿáŸå2X•² VUu«0zÿÑ’$I*µQ?uV~³À4è¬9&5›–¦þöi¸gKjïýRô¯ü%iâk.|Aøç; V¥,ƒUUÁ*L†îÙ?ýq!I’¤‚kÞñòð›&Ϊ£RwÃ’ÔÛ¶< o¸ ìM©Gÿ2_’¦®ƒ¿ ü3Ÿ8«R–ÁªªÎ`&Gûà]Ñ’$I*´Á®sÂïU(]gÝâÔ»ôÄ4ؽ>öïLiÐþ%½$UQwÓóà Áª”e°ªª3X…É1Ú7ý‘!I’¤Bølø½ %é¬ûÑÔ¼ó·Óàº7¥Ñ¯Imsô/ß%©ÚºüjøÏ 2X•² VUu«09ú×¼!ú#C’$I×9óÇÂoVˆÐY}ô¡¿nº¿}EîÙ’ÆöFÿ2]’ô°ºçÿRøÏ2X•² VUu«09š‹=ú#C’$I×»âÂoV˜w«ŽJÝ KRoÛò4ؽ>o¿1¥výËrIÒ£ÔÝø ñ?Ç`UÊ2XUÕ¬ÂYýô”ÆÃè I’$Úð¦wÅ߬p˜uÖ-NÍÖeið±ÓÓhÿΔÝè_‚K’gÝ·üløÏ'2X•² VUu«0YÆwþcôdž$I’ ­íÜ“æV~³ÀÕYûÌÔl~Iêï˜I£}³‡~­+IšüþÉØÑ?ÇÈ`UÊ2XUÕ¬Âd^~ôdž$I’ ®»ñøð›‹Îê£S³iiêo_‘†{¶¤ñ½Ñ¿¬–$ÍSÝõÿ&üç¬JY«ª:ƒU˜,½÷üaôdž$I’ ®ÿáׇ߬ðVuèO×ëm[ž»×§ñí7¦4Eÿ2ZÒÿcï^¼ý®ë;߯p;ÔVpéx,¶¶Ú–vôPkç¸èXg–—¶ÆN­uÚi'íÛ‘i2GíÔÎiw6 Œ‘‹DbkD†‹ÈE"”« 7!€\Âð»_¾Ÿ³v]~•ûþíýþ~¿ŸÇc­ç¿ðù½;¯ì`~´W¼1þ³Hq¬B‰Á*Y3X•êUç3¿ýlPa£»/ ¿Y%I’$Ij/ß'u×.Lƒ+—¥Ñ¶) ÚÑ_™Ô>òçÂ?›˜Á*”¬’5ƒU©fM-HEçñè§€ªõwþIÅð»U’$I’”Mí¥¯JÝ“ßú—N§ÑÖõ©h=ý퀊i/}øç•3X…ƒU²f°*Õ¯ÑíD?TX÷‹¿~³J’$I’Ú!?™º«÷Oý ¦ákÒxû–”Š"ú«0×>üÿŒÿ S\«Pb°JÖ V¥ú5ó?”๠®útøÍ*I’$Ij@‹wMUû¦ÞºEi°yemÛ¸ó/{ÀKÕ>ôÕñŸkŠË`J VÉšÁªT¿º§¼7úé ÂÆÛo ¿Y%I’$Iõ«½|ŸÔ]»pç/ÎÝuIJƒvôW\¢½d¯ðÏ9f° %«dÍ`Uª_í¥{§TŒ£Ÿ*¬}äÂïVI’$IRµÿ­¡»zÿÔ¿øSi´u}*ZÛ£¿ÊÐ`­ƒ_þÙ§À V¡Ä`•¬¬Jõlæ·fÀséó‘ð›U’$I’T‘¦wOãÞ–úLÃפñö-)EôWW2ÒšÞ#þóPq¬B‰Á*Y3X•êÙ𺣟*lxóéá7«$I’$) Å»¦Îª}SoÝ¢4ؼ2¶mLiÔþš @æZS»ÄF*.ƒU(1X%k«R=ë}寢Ÿ*¬h?ê‡À’$I’”Aíÿ2õÎüã4Ø´â{ãÔ~+ú+)”ãðÏKg° %«dÍ`UªgÏþZôó@ÅÍü¹Çè»U’$I’4¹ÚK÷NÝÕû§þÅŸJ£­ëSñÌÃÑ_=à… »áŸ¡ Î`J VÉšÁªTÓ¦vIE÷©è'€ ëíÅß­’$I’¤—×ôî;ÿ#bÃixãš4Þ¾%¥¢ˆþª /ÙÌ¿k‡®*6ƒU(1X%k«R}ÝuIô@…î¾,üf•$I’$½ˆïš:«öM½u‹Ò`óÊ4Ú¶1¥a/úk%LDÑÚÿY«Ø V¡Ä`•¬¬Jõmpù’è'€*õSûŸ ¿[%I’$IåÚGý|êñá4ØxdÝóTôŸ‰þ s¦xê¾ðÏ^g° %«dÍ`Uªoݵï~B¨¸î©¿[%I’$)çÚKöJÝÕû§þ†Óð–³RñÌÃÑ_`^¿3üóXÁ¬B‰Á*Y3X•ê[û°×¤TÑÏ6¸æØð»U’$I’²iz÷ÔYµoêûÑ4¼qMoßâçødoæó0ü3Z±¬B‰Á*Y3X•êÝøÑÛ£Ÿ*¬xâîð›U’$I’šZ{ÅSoÝ¢4ؼ2¶mLiØ‹þ•3~àúðÏlg° %«dÍ`Uªw3ÿCžOgå/…ß­’$I’T÷ÚË÷Iݵ SÿÒé4Úº>'¢¿î@-ŒïÛþ9®à V¡Ä`•¬¬Jõ®¿þ¯£Ÿ*®Áÿ~·J’$IRj/Ù+uWïŸúLÃ[ÎJÅ3Eµ€ÚÝ}yøg»‚3X…ƒU²f°*ջαûE?#TÜè΋ÂïVI’$IªlÓ»§Îª}SïÜîü«fãí[R*ÆÑ_å 1Fw^ÿy¯Ø V¡Ä`•¬¬J5oñ®©è?ý”PeÃnjüŠøÛU’$I’*P{ÅSoÝ¢4ؼ2¶mÜù ˜;£­ëÃ?ÿœÁ*”¬’5ƒU©þÍü x>Ý/þ^øÝ*I’$Ió]{ù>©»vaê_:½s,StþzÙn9;ü&Pp«Pb°JÖ V¥ú7øÆáÑO 7øæªð»U’$I’æ²ö’W¦îêýSÃixãšTÓ(6ƒU(1X%k«Rsêþ¡è'€è¯ÿ›ðÛU’$IR5k/ß'u×.Lƒ+—¥Ñ¶) :Ñ_a€šëžò¾ðGÁ¬B‰Á*Y3X•šS{ù룟j`tÛùá·«$I’¤øÚK_•º'¿;õ/N£­ëSÑz$úë Ð@Ýß~÷(8ƒU(1X%k«R³*žº/úY êú­Ô:hÏðÛU’$IÒüÕ>ä§Rwõþ©¿áÀ4¼qMoßýÍÈDçøß¿…œÁ*”¬’5ƒU©Y o9+úY º'¿'üv•$I’4G-Þ-uVí›zë¥Áæ•i´mcJ£Aô× S3wIø}¤Ø V¡Ä`•¬¬Jͪá'¢Ÿj`°iEøí*I’$i2µ—k¦Á•˾7N´£¿rü@û¨_¿—œÁ*”¬’5ƒU©YuNxGô³@ Œùvøí*I’$é¥×^ºwêžüîÔ¿t:¶®OEë‘è¯Ï«½ìuá7”‚3X…ƒU²f°*5¬ƒöLiØ‹~Z¨¿Ù@’$Iªx‡üdêžøÎÔ¿ð“ixË™©xr[ô×€—¬½ä•ñw•b3X…ƒU²f°*5¯ñ}ߌ~Z¨Þyÿ-üv•$I’ô¿[¼kê¬Ú7õÖ-JƒÍ+ÓhÛÆ”Fýè¯ ³S©5µKü­¥Ø V¡Ä`•¬¬JÍk°iEôÓ@ ÌüùÐèÛU’$Iʵöò}RwíÂÔ¿t:îº$¥A;ú+ÀÄýgÂï.U ƒU(1X%k«Róêþ¡è§€:tRëàW„߯’$IRÓk/Ý;uWïŸújç+ZÛ£¿ ̋♇Âo1U ƒU(1X%k«Rój/{]ôÓ@Mt×¾?ü~•$I’Õôî©sÜÛRÃixãš4Þ¾eçŸÂÈÑø±;âï3Åg° %«dÍ`UjfÅwG?/ÔÀàšãÂoWI’$©¶-Þ5uVí›zë¥Áæ•i´mcJ£~ô™P㮿ٟÁ*”¬’5ƒU©™ SXê IDATo:5úy ЧîK­©á÷«$I’T‡ÚË÷Iݵ SÿÒé4Úº>Ý'£Oz€JÝsEø § d° %«dÍ`Ujfýó?ý¼PcÞ~¿J’$IU«½d¯Ô]½ê_ü©ïSŸy8út¨Ñmç‡ßuª@«Pb°JÖ V¥fÖ9v¿è瀚è_òá÷«$I’Úôî©sÜÛRÃixãš4Þ¾%¥¢ˆ>Õjoø­Óâo=Åg° %«dÍ`Ujh‹wMEïéè'€ß·9þ~•$I’æ«Å»¦Îª}SoÝ¢4ؼ2¶mLiØ‹>ËixíêøûOñ¬B‰Á*Y3X•šÛè;_~b¨ƒbœÚË^~¿J’$IsQ{ù>©»vaê_:F[×§¢óDôÁ¦á÷ *Á*”¬’5ƒU©¹ .?$ú‰ &z_þ/á÷«$I’4ÛÚKöJÝÕû§þ†Óð–³RñÌCѧ6@Ö—~#ª¬B‰Á*Y3X•š[wÍïD?1ÔÄpËÙá÷«$I’ô’šÞ=uVí›zç~4 o\“ÆÛ·ìüëTGÿÂOÆßŠÏ`J VÉšÁªÔÜÚK_å´¼(EïéÔšÞ#ü†•$I’ž«öŠ7¦ÞºEi°yemÛ˜Ò°}FðfþsQô© d° %«dÍ`Ujvã‡o‰~f¨‰îÉï¿_%I’¤¨®\žFw_žŠÞŽès€—¡wÖŸ†ß•ª@«Pb°JÖ V¥f7¼ö„èg€š\õéðûU’$Iú~½s>}"0Kݵï¿+U V¡Ä`•¬¬JÍ®÷åÿýÌPÅß ¿_%I’¤ï׿ðÑ'2³Ô]½ø]© d° %«dÍ`Ujv•oŽ~f¨‘Îg~9ü†•$I’f\vpôy À,u>ûkáw¥*Á*”¬’5ƒU©áM-HEë‘è§€šè_ôwñ7¬$I’43XÝü™èó€Yjñ³áw¥*Á*”¬’5ƒU©ù¶žýÔP£»/¿_%I’¤™†7®‰>˜¥ö!?~Wª¬B‰Á*Y3X•š_ÿâOE?5ÔÅx”Ú‡¾:ü†•$I’F[×G_ÇÌÆx¸ó/‚Fß•ª@«Pb°JÖ V¥æ×ýü¿~j¨‘Þ™~ÃJ’$I£mWFŸÆÌBÑ~,ü¦TE2X…ƒU²f°*eÐA{¦4êG?7ÔÄð¦SãoXI’$eßøá›£Ocfaüø]á7¥*’Á*”¬’5ƒU)Æ÷_ýÜPEçñÔZ¼[ø +I’¤¼+žº/ú4`Æ\~Sª"¬B‰Á*Y3X•òhpÕÑÑÏ 5Òýü¿ ¿a%I’”wEoGôY À,Œ¾óõð›RÉ`J VÉšÁª”G½3>ýÜP#ƒ+—…ß°’$IʸݦTÑg1³0ܲ.þ®T52X…ƒU²f°*åQûˆŸ‰~n¨‘ñö-á7¬$I’ò­}è«£ObfixýIáw¥*’Á*”¬’5ƒU)ŸŠ'·E?9ÔHçÓ¿~ÃJ’$)Ï:G¿)ú`–›V„ß•ªH«Pb°JÖ V¥|~ë´è'€é_øÉðV’$IyÖ9îmÑç0³Ô¿tqø]©Šd° %«dÍ`Uʧþù‹~r¨‘Ѷ+ÃoXI’$åY÷”÷EŸÃÌRÃáw¥*’Á*”¬’5ƒU)Ÿ:Ǽ5úÉ NŠqj/{]ø+I’¤üê­[} 0K½³þ4ü®TE2X…ƒU²f°*eÔÔ.©è>ýìP#½s>ÇJ’$)»ú~"ú`–ºk~'ü®TE2X…ƒU²f°*åÕèŽ £Ÿjd´õ¼ðV’$Iù5øÆáѧ0³Ô9þíáw¥*’Á*”¬’5ƒU)¯ú_ÿ§èg€:tRëŸ ¿c%I’”WÃëOо„˜¥öŠ7†ß•ªH«Pb°JÖ V¥¼êžôj¦{ÚÃïXI’$åÕhëúè3€Yj/Ý;ü®TE2X…ƒU²f°*eÖÁ?‘Ò¨ýôP#ÃN‰¿c%I’”Uãû¾}0ãajM-¿+U‘ V¡Ä`•¬¬Jù5¾ÿêè§€):§ÖâÝÂïXI’$åÓøñ»¢Ï`f¡h=~SªB¬B‰Á*Y3X•òk°iEôÓ@ÍtOzWø+I’¤|*zOGŸÀÌÂø‘­á7¥*”Á*”¬’5ƒU)¿z§ýaôÓ@Í ®útø+I’¤LòÙµ7ºwSü]©ê䯇ƒU²f°*åWûðצTÑÏ5R<¹-üŽ•$IRµøÙèó€Ym=/ü®T…2X…ƒU²f°*åÙø±;¢Ÿj¦sÌ[ÃïXI’$5¿Î±ûEŸ¾ÌÒð†“ÃïJU(ƒU(1X%k«Rž ¯ÿBôó@Íô/¿c%I’Ôüº§¼7úô`–›Ž ¿+U¡ V¡Ä`•¬¬JyÖûÊ_F??ÔÌøÁÂïXI’$5¿ÞÙ}ú0Ký¯ý¯ð»RÊ`J VÉšÁª”g•¿ýüP7E‘ÚGý|ø-+I’¤f׿èF_¾ÌRï¼ÂïJU(ƒU(1X%k«R¦M-HEk{ô@Íô7ËJ’$©Ñ 6&úì`–º§}0ü®T…2X…ƒU²f°*åÛèÛ_‰~‚¨™Ñw. ¿c%I’Ôì†[ÖEŸ½ÌRwõþáw¥*”Á*”¬’5ƒU)ßúý]ô@ÝŒ‡©}ØkÂoYI’$5·ñ}›£¯^f©óé_ ¿+U¡ V¡Ä`•¬¬JùÖ9áÑO5Ô[·(ü–•$IRs+žº7úä`–ÚK÷¿+U¡ V¡Ä`•¬¬J7½{Jƒvô3@ÍÌü‰Öð[V’$IÍlj—”Fýè“€ÙõSkjAüm©êd° %«dÍ`UÊ»Ñ=߈~†¨›~+µÚ3ü–•$IRój/{]ôµ À,Oß~Wªb¬B‰Á*Y3X•ònpÅ¡ÑÏ5Ô=õ÷ÃoYI’$5¯Î±ûEŸºÌÒøÁÂïJU,ƒU(1X%k«RÞu¿ø{ÑÏ54¼qMø-+I’¤æÕ]»0úÔ`–Fw^~Wªb¬B‰Á*Y3X•ò®½tï”Æ£è§€š)ºO¦Öôá÷¬$I’šUï¼¢O]fixãÃïJU,ƒU(1X%k«’ÆßýPCÝ5¿~ËJ’$©Y .;8úÌ`–›Ž ¿+U± V¡Ä`•¬¬J\s\ôS@ ¯;1ü–•$IR³š¹1¨·þÅŸ ¿+U± V¡Ä`•¬¬JêýgÑO5T´K­Å»…ß³’$IjN£;.Œ>s˜¥Þ9 ¿+U± V¡Ä`•¬¬JjõóÑO5Õ=ùÝá÷¬$I’šÓøá›£O\f©»vaø]©Še° %«dÍ`UÒLÅS÷F?GÔÐðŸ?~ËJ’$©9½Ñ'.³ÔùÜo†ß•ªX«Pb°JÖ V%Í4¼éÔèç€*Z¤ÖâÝÂïYI’$Õ¿öá¯>o˜€ö‘o¿-U± V¡Ä`•¬¬Jš©wÞÑÏ5Õ=é]á÷¬$I’ê_çø·GŸ¶ÌVQ¤Öôá·¥*–Á*”¬’5ƒUI3uVíýPSƒ«?~ÏJ’$©þõÎøÑ§-³T´ ¿+UÁ V¡Ä`•¬¬JÚÙÔ‚T´¶G?IÔPñÌC©5µKüM+I’¤Z׿øSѧ-³4~øæð»RÌ`J VÉšÁª¤ï7ºõœè' €šê®Þ?üž•$IR½þóñÑg-³4ºóâð»RÌ`J VÉšÁª¤ï׿àãÑO55¸êèð{V’$IõntçEÑg-³4¼á”ð»RÌ`J VÉšÁª¤ï×9þ7¢Ÿ$jªxúþÔšZ~ÓJ’$©¾½-ú¬`–ß8<ü®T3X…ƒU²f°*é-Þ-½ÑÏ5ÕùÜoÆß´’$IªgS Rv£OZf©¿áÀøÛRÕË`J VÉšÁª¤ntçÅÑÏ55¸ryø=+I’¤zÖ^þúès€ èñáðÛRÌ`J VÉšÁª¤®ÿõŠ~–¨©â‰»wþf¬è›V’$Iõ«»zÿès€ è~þ·ÂoKU0ƒU(1X%k«’~¸î‰ïŒ~–¨±Î±û…ß´’$Iª_½³ÿ,ú”`:G¿)ü¶T3X…ƒU²f°*©ÔA{¦4ìE?MÔÔàŠCãoZI’$Õ.ù  Z‡üdøm© f° %«dÍ`UÒ6Ú¶1úi ¦ÆÞ~ÏJ’$©~ o\}Ê0KEïéð»RÍ`J VÉšÁª¤mæ·bÀËÕùì¿¿i%I’T¯Æ÷_}Æ0KãGo ¿+UÑ V¡Ä`•¬¬JúѺk~'úi Æ—/ ¿i%I’T¯Šî“Ñg,³4ºë’ð»RÍ`J VÉšÁª¤­½d¯”Æ£èç €š?~WjM-¿k%I’TÚË^}Â0ÃN ¿-UÑ V¡Ä`•¬¬Jz¶Æ\ý<Pcã#ü¦•$IR=êžøÛÑç+0¸biøm©Šf° %«dÍ`UÒ³5ؼ2úy Æ ¿i%I’Tzç~4ú|`úëÿ:ü¶TE3X…ƒU²f°*éÙêþ¡èç €+žº/µ¦v ¿k%I’Tý›VDŸ¯L@÷Ô„ß–ªh«Pb°JÖ V%=[íÃ_›RQD?QÔX÷ó¿~×J’$©únß}º0c÷ ¿-UÑ V¡Ä`•¬¬Jz®Æl~¢¨±ÁÕŸ ¿i%I’TýÆß}º03¿)ú¶TE3X…ƒU²f°*é¹^»:ú‰ ÆŠÖ#©µx·ð»V’$Inz”Æ£èÓ€ÙvSkjAü}©jf° %«dÍ`UÒsÕ[·(ú‰ æº'¿;ü®•$IRuë¬úÕè“€ ˜ù­ùÑ·¥*œÁ*”¬’5ƒUIÏUû¨_ˆ~¢¨¹áu'†ßµ’$Iªn½Ó?}²0£{®¿-Uá V¡Ä`•¬¬Jz¾Š§î~¦¨±¢ûäÎFFßµ’$IªfýKþ¿è“€ Þtjøm© g° %«dÍ`UÒó5óÅf£»vaø]+I’¤j6¼ñ‹Ñç*0¸rYøm© g° %«dÍ`UÒóÕ;÷£ÑÏ5ç·+H’$é¹?tSô¹ Àô¿ú·á·¥*œÁ*”¬’5ƒUIÏWg団Ÿ)j®è?“Z¿"ü¶•$IRÅšÞ=¥a/ú\`º§}0þ¾Tu3X…ƒU²f°*é…*v<ýTPs½3>~×J’$©ZuŽyKô™ À„tŽÝ/ü¾T…3X…ƒU²f°*é…~ë´è§ €šnY~×J’$©ZõÎþÏÑg*Ò>ôÕá÷¥*œÁ*”¬’5ƒUI/Tï¼¢Ÿ*ênØMí¥{‡ß¶’$IªNƒGD_©L@ÑÛ~[ªâ¬B‰Á*Y3X•ôBu>óËÑO Ð[·(ü¶•$IRuÝyQô‰ ÀŒ¾%ü¶TÅ3X…ƒU²f°*éÅTìx ú¹ æF·o¿k%I’TŠFŸ¨LÀ趯†ß–ªx«Pb°JÖ V%½˜†7Ÿý\Pw£AjöšðÛV’$Iñµmôu À„ ®96ü¾TÅ3X…ƒU²f°*éÅÔ;ï¿E?W4@ï¼Âo[I’$Å×ý¿>M˜þÅ~_ªâ¬B‰Á*Y3X•ôbê|æW¢Ÿ+`tï¦ðÛV’$Iñõ/üDôi À„ôÎüãðûRÏ`J VÉšÁª¤ÕÔ‚T<ópô“@ÝEêý¦øûV’$I¡ o8%ú2`B:Ÿû7á÷¥*žÁ*”¬’5ƒUI/¶á-gF?Y4@ÿÒÅá·­$I’b?xCôY À„´—ýtø}©Šg° %«dÍ`UÒ‹­¿þo¢Ÿ,`üø;ƒô}+I’¤ ï–Ò°}–0 ÞŸõé…3X…ƒU²f°*éÅÖYõ«ÑO Ñ9áá÷­$I’bêûEŸ£LÈø±;ÂïKÕ ƒU(1X%k«’^tS RÑÚýlЃkŽ‹¿o%I’Rï+}Ž0!£». ¿/Uƒ V¡Ä`•¬¬Jz) ·œýlÐEçñ?¤Œ¾o%I’4ÿ ¯û|ô9 À„ ¯=!ü¾T 2X…ƒU²f°*é¥Ô?ÿ¿G?[4D÷K~ßJ’$iþ?ô­èS€ éíÂïKÕ ƒU(1X%k«’^JÏþZô³@C oýrø}+I’¤yîàW¤4FŸ¢LHïŒÿcªú¬B‰Á*Y3X•ô’šZŠÖöè§ €&õSû°×Ä߸’$Iš·º'¾3ú `‚:ÇÿFø©d° %«dÍ`UÒKmæ7aÀ$ôÎ; ü¾•$IÒüÕ¿èï¢OP&¨}è«ÃoLÕ ƒU(1X%k«’^jý F?]4ÄèÞMá÷­$I’æ¯á-gFŸ LHÑ}2ü¾TM2X…ƒU²f°*é¥Ö9æ-ÑO ÒYùæðW’$IóSñä=Ñç'2~àºðûR5É`J VÉšÁª¤—ÜÔ‚T´~¾hˆþ¥Óñ7®$I’æ¼öá¯>=˜ á-g…ߘªI«Pb°JÖ V%½œF·žý|ÐãÇïÚùŸ¢¢o\I’$Ímݵ £OO&hpå²ðS5É`J VÉšÁª¤—SÃÿˆ~¾hÎ ï¿q%I’4· .;8úì`‚zç~cª&¬B‰Á*Y3X•ôrêóÖèç €\s\ø+I’¤¹mtÇ…Ñg'Ô=ù=á7¦j’Á*”¬’5ƒUI/«©]RÑy<ú  !fnË™Z†ß¹’$I𛦤¢ýXôÙ ÀuŽ~Sü©zd° %«dÍ`UÒËmtë9ÑO Ò;ýÂo\I’$ÍMÏþëès€ISkz÷ð;S5É`J VÉšÁª¤—[ÿ«ý„Ð £Û/¿q%I’47õÏÿXô¹ ÀOÜ~cªF¬B‰Á*Y3X•ôrë¬úÕè' €&)Æ©}äÂï\I’$M¾á-gF_›LÐè΋ÂoLÕ(ƒU(1X%k«’^vS RñÌCÑÏ Ò¿äãï\I’$M¼bÇѧ&4øæªðS5Ê`J VÉšÁª¤Ù4üÖiÑÏMûSbS Âï\I’$M®ÎÊ7GŸ™LXÿ«~gªF¬B‰Á*Y3X•4›zçþ×èg €†éžô®ð;W’$I“«÷•¿Š>1˜°î)ï ¿3U£ V¡Ä`•¬¬JšM£ßýŒÐ0ÿ~çJ’$irÍÜw4K{ÅÃïLÕ(ƒU(1X%k«’f[ñä=ÑOM2è¤öÒW…ß¹’$IšLœۢ/L&iÔO­Å»†ß™ªQ«Pb°JÖ V%Ͷáõ_ˆ~Êh˜Þy„ß¹’$Iš}í#ß}Z0aãG¾~gªf¬B‰Á*Y3X•4ÛzëE?e4ÌøþkÂï\I’$Í>?;hžÑ·Ï ¿3U³ V¡Ä`•¬¬Jšmíå¯~Êh Î1o ¿u%I’4»†×}>ú¬` ¿3U³ V¡Ä`•¬¬JšDãGo‹~Îh˜ÁUG‡ß¹’$Iš]ãGo>+˜°Þ¹ ¿3U³ V¡Ä`•¬¬JšDƒkŽ‹~Îh˜¢ýhjMï~ëJ’$éåÕ^¾OôI Àèžô®ð[S5Ë`J VÉšÁª¤IÔ;ãÃÑÏ Ô;ýÂo]I’$½¼z_þ‹ès€9Ð>âgÂoMÕ,ƒU(1X%k«’&Qû°‘R1Ž~Òh˜Ñí„ߺ’$Izy ¿uZô9 À¤õ[©5µ üÖTÍ2X…ƒU²f°*iRº)úI iŠqjù†ð[W’$I/±©]RÑz$úš`ÂÆ\kª~¬B‰Á*Y3X•4©Wý¤Ð@ýKþ1üÖ•$IÒK«ó¹ßŒ>#˜ÛN ¿5Uà V¡Ä`•¬¬JšTݵ £Ÿ4¨xâ;þ̘$IRÍêýŸ¢ÏHæÀÌ}kª†¬B‰Á*Y3X•4©ÚK^™Òxý¬Ð@Ý“ß~ïJ’$éÅ7ºwSô Àèþ¡ð[S5Ì`J VÉšÁª¤I6¾ÿêèg €Þúåð[W’$I/®ö’½R ¢OHæ@gÕ¾á÷¦j˜Á*”¬’5ƒUI“lðâŸ5šhó+Ñ'#sdðÃÃïMÕ4ƒU(1X%k«’&ÝÌŸj€¹0ºóâð{W’$IÏ]ÿ‚GŸŒÌ‘Þº?¿7UÓ V¡Ä`•¬¬JštÝÏÿVôÓ@SEêý¯Âo^I’$={£;/о˜#Ïýfø½©šf° %«dÍ`UÒÄ›Þ#¥~+úy ¡ˆ¿y%I’ôcµ—îÒ¨}.0Gfî½è›S5Í`J VÉšÁª¤¹htÇ…ÑÏ U´M­ƒö ¿y%I’T®wÖŠ>˜#ÅÓß ¿7Uã V¡Ä`•¬¬Jš‹ú~"úy Ázgÿçð›W’$I冷œ}&0GFw]~oªÆ¬B‰Á*Y3X•4uŽyKôó@ƒîÝ~óJ’$é‡:èÿHEoGô™À\utüÍ©úf° %«dÍ`UÒœ4µ ;Œ~âh°Î±ûÅß½’$IÚY÷ÔDŸ‡Ì¡ÞWþ2üæT3X…ƒU²f°*i®Þtjô@ƒ ®96üæ•$IÒ÷^ÿ…èó€9ÔùÜ¿ ¿9Uã V¡Ä`•¬¬Jš«z_þ‹è'€›ù“³í%{…ß½’$IÙ·x×T´‰>˜+E‘ÚK^wª¾¬B‰Á*Y3X•4Wµ—¿>ú‰ ázç~÷J’$å^÷¤wEŸ…̡≻ÃoNÕ<ƒU(1X%k«’æ²ñö[£Ÿ9lüðÍá7¯$IRî 6¯Œ> ˜C£­ç…ßœªy«Pb°JÖ V%ÍeƒÍŸ‰~æh¸îIÿ.üî•$Iʹ™ß¸@s ®84üæTÍ3X…ƒU²f°*i.ë®]ýÌÐp£oŸ~÷J’$åZ縷EŸƒÌ±ÞY~wªæ¬B‰Á*Y3X•4—µ—¼2¥Ñ ú© ÉŠqêý¦ðÛW’$)ÇW,¾˜ccÞ~wªæ¬B‰Á*Y3X•4×¶]ýÔÐpƒ«>~÷J’$娸‘oGŸ‚Ì¥ñpçØ0úîTÍ3X…ƒU²f°*i®ë_º8ú© áŠÞŽÔ^²Wøí+I’”Sã~=ú `Ž·ß~wª¬B‰Á*Y3X•4×uNxGôS@ú ¿}%I’rj°iEô ÀÞrføÝ©d° %«dÍ`UÒœ·x·TtŸŒ~îh¸ñcw¤ÖÔ.ñ÷¯$IR-Þ5;ˆ>˜cý¯OÅßžª«Pb°JÖ V%ÍG£o%ú¹ ݵ Ão_I’¤êžüžèÓ€yÐ=õ÷ÃoO5 ƒU(1X%k«’æ£þú¿‰~îÈÀè®KÂo_I’¤ÞpJôéÀì5á÷¯$IRSÝv~ôÅÀ<l^~{ª!¬B‰Á*Y3X•4_õÎüãè'€Lô¿öá÷¯$IRkúê”Fýès€yÐ;çÿ ¿?Õ V¡Ä`•¬¬Jš¯f~ËU*ÆÑÏ(žþnjMï~K’$5­þù‹>õ˜'ã~=üþTC2X…ƒU²f°*i>P£"¼ IDAT?p]ô³@&zgþIøý+I’Ô´F÷^}æ0ÆÃÔ:hÏðûS É`J VÉšÁª¤ùlpå²èg€LŒº)µ¦„ßÀ’$IM©}Ô/¤TÑgó`üð-á÷§”Á*”¬’5ƒUIóY÷äwG?{ddæþŒ¾%I’šÒàò%ÑçódxÓ©á÷§”Á*”¬’5ƒUIóÚA{¦4èD?}dbt×%ñ7°$IRZ¼[*žþnôyÀ<é_ô?ãoP5'ƒU(1X%k«’æ»Ñ]_‹~úÈH縷…ßÀ’$Iu¯{Ú£Ï:æQ÷”÷†ß jP«Pb°JÖ V%Íwý ?ýô‘áÍg„ßÀ’$IuotÇ…Ñgó¨½ìuá7¨”Á*”¬’5ƒUIó]糿ýô“ñ(uŽþWáw°$IR]kùs;o*òP<ýÝðT Ë`J VÉšÁª¤ˆŠ§î~þÈÈàšcÃo`I’¤º6¸âÐès€y4Úz^ø ª†e° %«dÍ`URDÃë>ýü“a7µ—ýtø,I’T»ï–ŠD_sÌ£þ¥Óñw¨š•Á*”¬’5ƒUIõNÿ£èç€Ì ._~K’$Õ­ÞéŠ>ã˜gݵ ÃïP5,ƒU(1X%k«’"j/}UJãaô@FŠÎ©½ä•á·°$IRÝõµè3€yÖ^¾Oøª†e° %«dÍ`URT£{7E?d¦ÁÇÃï`I’¤ºÔ^ñÆ”Šqô À<*žy(üU3X…ƒU²f°*)ªþ×§¢Ÿ@2S<}jMï~ K’$Õ¡Á•Ë¢Ï7æÙè¶óÃïP50ƒU(1X%k«’¢êÿöè'€ õÖýyø-,I’Tù¦wOÅŽ£O7æÙಃãoQ5/ƒU(1X%k«’šÚ%­G¢ŸA23~ø–ÔšZK’$U¸Þ™}¶ {êï‡ß¢j`«Pb°JÖ V%E6¼éÔèg€ õNûÃð[X’$©Êï¿:úd @ûˆŸ ¿EÕÀ V¡Ä`•¬¬JЬ·nQô3@¶¿eu—ð{X’$©ŠuOüíès €Å3‡ß¢jh«Pb°JÖ V%EÖ>üµ)ãè§€ u¿ôÂïaI’¤*6Úº>úT Àèö á·¨šÁ*”¬’5ƒUIѸ.ú) CãoH­©á÷°$IR•ê¬ü%ÿÁ Sƒ+–†ß£jh«Pb°JÖ V%E7¸âÐè§€LuOý@ø=,I’T¥†×ž}¢¤{êï‡ß£jh«Pb°JÖ V%E×=ñÑO!™?p½ß²*I’ô¿kþÚ”è € íåû„ߤjh«Pb°JÖ V%…·x·TtŸŠ~ÈTwíûãobI’¤ 4¸ì èÓ € ÅS÷†ß£jp«Pb°JÖ V%U¡á­_Ž~ÈÔøëü–UI’¤ƒ"­G¢O3‚ ·œ“ª¹¬B‰Á*Y3X•T…zç~4ú9 cÝ5¿~K’$EÖ_ÿ×Ñ'úÿ}øMªg° %«dÍ`URjñ³ÑÏ!ßuøM,I’ÖÔ‚4~dkôI@ î‰¿—ª¹¬B‰Á*Y3X•T•ÆÛo~ÈX÷”÷…ßÄ’$Iu¿ôѧ‘Šqj/yeø]ªg° %«dÍ`URUlZý$±ñ}›ÃobI’¤ˆFÛ6FŸb?|søMª†g° %«dÍ`URUêžòÞè'€ÌuO~Oø],I’4Ÿu¿ðï£O0‚ ¯;1ü.UÃ3X…ƒU²f°*©2´gJƒvô³@ÆÆßýçÔšZK’$ÍS£{¾}‚¬wÞáw©žÁ*”¬’5ƒUIUjtûÑÏ"™ëö‡áw±$IÒ|Ô=ùÝѧÐ9v¿ðÛT Ï`J VÉšÁª¤*Õßð?¢ŸE27~ô¶ÔZ¼[øm,I’4×¶]}zmÐI­éÝÃoS5<ƒU(1X%k«’ªTg団ŸEH½s>~K’$ÍeÝSÞ}rP£{¯ ¿M•A«Pb°JÖ V%U­ñcwD?d®xú»©uðO„߯’$IsÕhÛÆè“ € l<2ü6U¬B‰Á*Y3X•Tµ›WF?ú~2ü6–$Iš‹ºk~'úÔ "z§ýaø}ª 2X…ƒU²f°*©juO~OôÓ©h?–ÚK÷¿%I’&Ýøþ«£O-*¢½üõá÷©2È`J VÉšÁª¤Ê5½G*z;¢ŸGHƒË‰¿%I’&XwÍïFŸXTDñÄÝá÷©2É`J VÉšÁª¤*6ºõœèçRê·R{ÙO‡ßÇ’$I“ÊoWàû†ßúRø}ªL2X…ƒU²f°*©Šõ¾ò—ÑÏ#ì4øæªðûX’$iu×¾?ú´ Búçÿ÷ðU™d° %«dÍ`URk/ß'¥¢ˆ~" ¥Q?µWüËðY’$iVM-Hãï^}YP!ã~=þNU¬B‰Á*Y3X•TÕÆ\ýDÀNÿ~K’$ͦÞYÿ)ú¤ Jú­ÔZ¼[øªL2X…ƒU²f°*©ª .;(ú‰€ï)Æ©sì~á7²$IÒËjzT<ñè‹ € Ý}Yüª|2X…ƒU²f°*©ªuŽ{ô ?0ºwÓÎ?¥}'K’$½Ôú|<ú” bW~§*£ V¡Ä`•¬¬JªlS»¤â™‡¢ŸIøÞ銿“%I’^Bí¥¯JEû±è3 €Šé®]~«*£ V¡Ä`•¬¬JªrÃë¿ýLÀOÜZí~'K’$½ØW.‹>¡¨š¢HíÃþEø­ªŒ2X…ƒU²f°*©ÊõNÿ£ègJú*üN–$Iz1µü¹”èó €Š?z{ø­ªÌ2X…ƒU²f°*©Êµ—ì•Ò¨ýTÀ½©½|Ÿð[Y’$é…Þrfôé@ ¯;1üVUf¬B‰Á*Y3X•TõFßùzôS %ÃkW‡ßÉ’$IÏWwõþ;ÿÔ+ü¨Þ—ÿ"ü^Uf¬B‰Á*Y3X•Tõú|<ú©€²bœ:ǽ-üV–$IzÖ¦vIãï^}1PQíoŒ¿Y•W«Pb°JÖ V%U½ÎÊ7G?•ðcFw_~+K’$=[½sÿkô©@E; ¿W•a«Pb°JÖ V%Õ¡ñcwD?—ðcº§}0üV–$IúáÚK^™ŠgŠ>“¨¨áÍg„߬Ê0ƒU(1X%k«’êÐàªOG?—ðcÆß™ZÓ{„ßË’$IßopÕÑÑ'Ö?ÿcá7«2Ì`J VÉšÁª¤:Ô=ùÝÑÏ%<«þÅ~/K’$ÍÔ9æ-)‡Ñç6s3Fß­Ê0ƒU(1X%k«’jÑô©èíˆ~2àÇ Ú©}Ô/ÄßÌ’$)捻Ñ=WD_FTXÑ}*µï»*¿ V¡Ä`•¬¬JªKÃ[¿ýdÀ³}û+á÷²$IÊ»Þ9‰>‰¨¸ÑíÂïVešÁ*”¬’5ƒUIuÉݨ²î©¿™%IRžµ}u*ZDŸCT\ÿkÿ~»*Ó V¡Ä`•¬¬JªKíe?RQD?›ð¬Š'ïI­ƒ_~7K’¤ü^{Bô)@ tWï~»*Ó V¡Ä`•¬¬JªSãï^ýlÀs|ã°ð›Y’$åUç„ÿ;¥b}PuÃ^j´gøýªL3X…ƒU²f°*©N .;(úÙøÿÙ»óè=ëúÎÿMXd—.¢Ò™ŸÚã ¶Žkû«Ž¶v¬c[{¦íÔÖ_m§¶ã±N±ÛÎÌé7ß$ÑPÂV‘Md”}5ì;Â}Ýûu}~'_¹„$ßo¾Ëû¾ïÏãqÎó¯ž3S{Èõù\^/î$Ø¢~'5W¼-üÞ,I’2iá+Rùä=Ñ7 †@ÿ¡Ëãï¯Ê7ƒU¨1X%k«’†©æï~lÀVõº"5Ææ…ß%IÒè×½lqôÕ€!ѹd<üþªŒ3X…ƒU²f°*i¨›—ªk£°Uí3þ<þî,I’Fºæ¡¿2ñëî0­c?~‡UƬBÁ*Y3X•4lu¯?,úÑ [U=÷D*–¼&üî,I’F´±ù©¿æšè+â×J…»Äßc•o«Pc°JÖ V% [­>ýè€mê­Z~w–$I£YçÛ}Õ`ˆô¼$ü«Ì3X…ƒU²f°*ièß)U­g¢Ÿ°uUé¯Z“$I3^óà“R·}Ó`ˆt¾÷Ïá÷XežÁ*Ô¬’5ƒUIÃXïöS£Ÿ°MÕ†Õ©±x÷ðû³$I‘Ææ§þÃWE_q2­£?—UÞ¬BÁ*Y3X•4ŒµOÿTôã&¥{õòðû³$I:ÿŸè« æ[¤ÆøÎáwYežÁ*Ô¬’5ƒUIÃX±ß«Rêw¢¡°mU™ZÇü»ð;´$I¼=¥^+úfÀé?pqø]V2X…:ƒU²f°*iXÛürà|êÞÔX¸KøZ’$ i vLå£7D_iB›¥?ü>+¬BÁ*Y3X•4¬uÎÿBô#&­{ÅáwhI’4œu/_}•`H5úÃï³’Á*Ô¬’5ƒUIÃZ±ì)UUôc&§ì¥æÊ÷‡ß£%IÒpÕ:æC)•ýè› C¨ê<—ã;…ßi%ƒU¨3X%k«’†¹rÝÑQ˜´ò‰ÛSc|çð{´$IŽŠý^ªk¢¯0 ©þ¾~§•&2X…ƒU²f°*i˜ë|o,ú1 SÒ½lqø=Z’$ G½ÛN‰¾º0Ä:~)üN+Md° 5«dÍ`UÒ0×<ìÑQ˜š~75wø]Z’$ ví3ÿ2úÖÀkþ®ð{­4‘Á*Ô¬’5ƒUIÃ^µauô£¦¤|òîÔX´[ø]Z’$ f̓~)UíMÑW†XU<•cóÃï¶ÒD«Pc°JÖ V% {ÝkŽ~”À”u¯?,ü.-I’°…¯H庛¢¯* ¹Þí§Æßm¥g° 5«dÍ`UÒ°×:î#ÑR˜ºªJ­¯ÿ~ø}Z’$ V½U+£o)Œ€öÙŸ ¿ÛJ/d° 5«dÍ`UÒз`‡‰¿Ò†MÕx2K÷Š¿SK’¤¨}ÚŸD_OÅò7…ßo¥2X…ƒU²f°*iêÝòµèÇ)l—þý¦ÆØ¼ð;µ$IŠ­yÐ/¥ªýlôÕ€P>}øýVªe° 5«dÍ`UÒ(Ô>õ?E?N`»u¾õßÃïÔ’$)°…»¤ò±›£¯$ŒˆÞª•ñw\éŬBÁ*Y3X•4 ‹÷H©×Š~¤ÀöéµSó°w†ß«%IRL½›Ž‹¾0B6ÿØOôWªe° 5«dÍ`UÒ¨Ô¿ï‚èG*l·rý¿®}¯–$Is[çü/D_C%e?K^~Ï•j¬BÁ*Y3X•4*µÏù\ô#¦¥{Í¿„ß«%IÒÜÕ<ú)õ;ÑWFHùèªð{®ô’ V¡Æ`•¬¬J•Š¥¯K©*£«°ýªÊ_Ù&IR&K÷JÕ³Fß>1Ý+ö¿ëJ/É`j VÉšÁª¤Qª\{]ôc¦¥jmL̓Þ~·–$I³ØøN©¿æêèk#¨õÕߊ¿ïJ?Á*Ô¬’5ƒUI£TçâÿýX€i+»%5î~¿–$I³SoÕÊè루ӘFßw¥—d° 5«dÍ`UÒ(Õ\±OôcfDïÆcÂï×’$iæëœÿߢ¯Œ¨þ=ç…ßw¥—Í`j VÉšÁª¤Q«\gô£fDûÌτ߯%IÒÌÕ:þ·S*{ÑW FTçü/„ßy¥—Í`j VÉšÁª¤Q«{é¢èG+ÌŒ^+5Wø[’$M¿æÁÿ&U­g¢oŒ°æAo ¿÷J/›Á*Ô¬’5ƒUI£Vó°wF?Z`Æ”?üA*öÝ3üž-I’¶¿bÉk'Ît˜-›ï›Ñ÷^i‹¬BÁ*Y3X•4ŠùÀ(éÝ~Zø[’$mgã;§þêË¢¯Œ¸îu‡Äß}¥-e° 5«dÍ`UÒ(Ö½â€èÇ+̨΅_ ¿gK’¤)66/õn91ú@Z'ý^üýWÚR«Pc°JÖ V%bÍ•ï‹~¼À̪ÊÔ:éáwmI’4ùºWì}ƒ ½v*ï~ÿ•¶˜Á*Ô¬’5ƒUI£ZµáÁèG,̨ª½)5yGø][’$m»öÙŸ¾:‰þß ¿ÿJ[Í`j VÉšÁª¤Q­{õòèG,̸ò©ûR±ä5á÷mI’´åZ_ûÝ”Ê^ôµ€Lt.üRøXÚj«Pc°JÖ V%jÍ£?ýˆ€YÑ¿ÿÂÔX°Cø[’$½´æÊ÷§ÔiD_ÈHóÐ_¿K[Í`j VÉšÁª¤‘ml~ªž}4ú1 ³bóß(~ç–$Iµš+öIUãÉèk©ž}$ü,m3ƒU¨1X%k«’F¹îõ‡F?f`Ö´Ïþlø[’$=_±lïT=ópôõ€ÌôV~–¶™Á*Ô¬’5ƒUI£\ë¸ßŒ~ÌÀìéµSóè„ß»%Iʽ‟OåS÷Fß ÈPëë¿~–¶™Á*Ô¬’5ƒUI#ÝØüT=÷xô£fMU<•š¿5þî-IR¦ûî™Êu7F_ ÈQ¯•‹w¿KÛÌ`j VÉšÁª¤Q¯wÃQÑZ˜UåÓ÷Oü²[ôÝ[’¤ìZ´k꯾,ú*@¦ú÷};þN,M&ƒU¨1X%k«’F½Ö ‹~ÔÀ¬+]å5$IšËÆwNý{¿} có¿/–&“Á*Ô¬’5ƒUI#ßøN©j>ý¸€Y׿÷üÔX°Cü\’¤Qo|§Ô¿çÜ裀ÌËß7–&“Á*Ô¬’5ƒUI9Ô»ùøèÇ-̉ު#Ãïß’$t vH½ÛO‹>òÈ\¹þÎø»±4Ù V¡Æ`•¬¬JÊ¡ÖIŸˆ~ÜÀœé\ø¥ð;¸$I#;V½íäè£R÷Ê¥ñ÷ci²¬BÁ*Y3X•”E _‘ªö³Ñ\˜U™Ú§ÿiü=\’¤Q«ÞzRô)ZÇ|(þŽ,M6ƒU¨1X%k«’rɯ_•^;µ¾úïÃïá’$D vL½ÛN‰>Ý`BÕÜ0qG ¿'K“Í`j VÉšÁª¤\jŸòGÑ\˜[Ý"µŽùwáwqI’†ºñSïÎoFŸêð‚Íÿ2Uø=YšJ«Pc°JÖ V%eÓ¢ÝRê4¢»0§ªÖÆÔ<üÝñ÷qI’†±ñSÿî³£s¨iŸñéø»²4• V¡Æ`•¬¬JÊ©ÞgD?v`ÎUõ©¹bŸðû¸$ICÕ¢ÝRÿþ‹¢q¨+û©ØÿçâïËÒT2X…ƒU²f°*)§Ú§*ú± !ªgNÅ—1üN.IÒ0TìûÊÔ_}Yôñ /Ñ_}iø}Yšr«Pc°JÖ V%åT±x”ºÍèG/„(øƒT,Ý+ü^.IÒ W,ym*×^}lÀËê\ðwáwfiʬBÁ*Y3X•”[ý»ÎŠ~ô@˜òñÛR±ä5á÷rI’±âÀ7¤ò‰Û£kØ¢bù›ÂïÍÒ”3X…ƒU²f°*)·Ú§ÿiô£B•k¯Mž{†ßÍ%I¤š+öIÕÆµÑÇ4lQùø­á÷fi»2X…ƒU²f°*)»í–ªÎsÑ_e´*IÒOjñÞT5žŒ>ž`«º—. ¿;KÛ•Á*Ô¬’5ƒUI9Ö»ýÔèÇ/„3Z•$égRë„¥ª½)úX€mjñžðû³´]¬BÁ*Y3X•”c­“ÿ úñ ÁhU’”sí3?“R¿}À6UÏ>šcóÂïÐÒve° 5«dÍ`UR–-|EªZÏD?‚` ­J’²kl^ê\2}À¤u¯?4þ-mo«Pc°JÖ V%åZïæã£Á00ŒV%IÙ´`ÇÔ»áè裦¤uüGãïÒÒöf° 5«dÍ`UR®µNüxô#JÍ5F«’¤‘®ØïU©ÿà÷¢\˜’ªµ15Æw¿OKÛÁ*Ô¬’5ƒUIÙ¶`ÇT5ÖG?†` ”ënJÅþ?_—$i†+–¿9•ëïŒ>j`Êz·~Ÿ–¦•Á*Ô¬’5ƒUI9×[udôcNùÄ©8ðõá÷uI’fªÖq¿™ªâ‡ÑG,l—öiŸ ¿SKÓÊ`j VÉšÁª¤œk÷‘èÇ0 ¤jÃêÔ<è-áwvI’¦[ûìϦÔïD­°}ºÍÔX¼{ø½ZšV«Pc°JÖ V%eÝØüT=ûhô£Rµé±Ô<äñ÷vI’¶§;¤î•K£S˜–þ]gÅß­¥éf° 5«dÍ`URîu¯=8úQ «zî‰Ô<ì߆ßÛ%IšJŒצþýE£0mí3>~¿–¦Á*Ô¬’5ƒUI¹×<ê×£Å0Ъæ†Ô<ò×Âïî’$M¦æáïJÕ†£O˜¾~7K^~Ç–¦Á*Ô¬’5ƒUIÙ76/UÏ<ý8€ÁÖi¤Ö×~7þþ.IÒVÚüëS©[DŸš0#ú÷]~Ç–f$ƒU¨1X%k«’ô3©{åÒèÇ1 ¾²—Úgÿ—ðû»$I/iÁŽþûFŽÿF#“Á*Ô¬’5ƒUIÚüWŽ;úq áªRç’ñð;¼$I?®XöÆT®½6ú„€™UöSqÀχ߷¥É`j VÉšÁª$=_ùÔ½ÑdÝ«—§ÆØ¼ð{¼$)ïZ'|,UõÑÇ"̸þƒ—„ß·¥Ë`j VÉšÁª$=_÷ÒEÑd*½[¿žã;…ßå%I¶`‡‰_üNU}À¬èœ÷·ñ÷ni¦2X…ƒU²f°*IÏ×<äíÑd:ýû/LÅâ=Âïó’¤|*–íú_}Àì©ÊTø†ð»·4c¬BÁ*Y3X•¤ŸT>~[ôc†Îæ{ôæñPô}^’4úµŽÿhªž{"úè€YÕ_suøÝ[šÑ V¡Æ`•¬¬JÒOê|÷ÿF?–`(Uפ桿~§—$h _‘ºW%¥ªŠ>ò`Öu¾ý?âïàÒLf° 5«dÍ`U’~R±üÍ>|ÀvªÚ›RëÄß ¿×K’F«æŠ·¥ò±›£9˜U™Šeo ¿‡K3šÁ*Ô¬’5ƒUIªW>òýèG3 ¯²—ÚçþMø½^’4ÍKís>—R·ˆ>Ý`Îô¾2þ..Ít«Pc°JÖ V%©^ç;ÿ3úÑ C¯{íÁC£èû½$i8+–¾.õïýVôqs®sþÂïãÒŒg° 5«dÍ`U’êËöžø«6€ééÝrbjŒï~Ç—$ WíSþ(UÅSÑÇ̽²ŸŠ¥{…ßÉ¥Ï`j VÉšÁª$½´þêK£Ï0úk®ñ¡E’4©Šý^z7}t@˜þƒ—„ßË¥YÉ`j VÉšÁª$½´öYýx€‘Q=ûhj®|ø=_’4¸µNú½TmZ}d@¨ö9Ÿ ¿›K³’Á*Ô¬’5ƒUIziž{¦Ô-¢Ñ0:z­Ôþæ_„ßõ%Iƒ•_U€){©8àÂïèÒ¬d° 5«dÍ`U’^¾Þí§F?¢`´TUê^±jŒÍ¿ïK’âkò‡©zî‰èÓ Bÿþ ÃïèÒ¬e° 5«dÍ`U’^¾Ö×~7ú #©ïù©Xòšð;¿$)¦bÙSÿ®³¢#(í³þ*ü®.ÍZ«Pc°JÖ V%i -ØÑ¯|À,©6®IÍ#-þÞ/I𻯿§ö9ŸKUûÙècK¿›Š%¯¿³K³•Á*Ô¬’5ƒUIÚrÝkWD?¦`tõÚ©sÁÃïý’¤Ù¯yØ;S¹öºè“öo£‰¾³K³šÁ*Ô¬’5ƒUIÚrÍ•ï‹~LÀÈëÝzRj,Þ=üþ/Iš…í–ºW-K©ìE70°Úßü‹ø»»4›¬BÁ*Y3X•¤­W>ywô£F^¹þÎÔ\ñ¶ðû¿$iæjŸúǩڸ&úˆ€ÁÖ-R±xðû»4«¬BÁ*Y3X•¤­×ùîÿ~T@ºÍÔ¹à‹áï’¤éÕ<ø­©ÿƒ2ñÖ IDATïDŸ*0z·Ÿ~‡—f=ƒU¨1X%k«’´õŠ/ÿ«”ª2úq Ùèß}v*öÿÙðwIÒ[¼{ê\2žR¯}”ÀÐh}ý÷ãïòÒlg° 5«dÍ`U’¶]õeÑkÈJõ죩õÕß $M¢±y©}ÆŸ§jÓcÑÇ •ªùtjŒï§—f;ƒU¨1X%k«’´íÚgÿ—èÇ5䧪R÷Úƒ}¸‘¤®y䯦þš«£O J½U+ÃïôÒœd° 5«dÍ`U’¶]±ß«Rê6£Ù¥rÝ©yè/‡¿H’~Ró ·¤ÞgD0ÔZÇ|(ün/ÍI«Pc°JÖ V%irõîøFô#òÕï¦î•KSc|§ðwIʹb¿WOí“©|úè§?Œ”æaïKs•Á*Ô¬’5ƒUIš|Ýë‰~l?R>r}jú+áï ’4ªµNþƒT®¿3úq#§\Wø}_šÓ V¡Æ`•¬¬JÒäkù«ÑmàÅÊ^ê^{p*ïþ¾ I£Rëè¦þCWD?á`du.þ?á÷~iN3X…ƒU²f°*IS«|êÞèG7ðSª ¦Ö‰_¤a®yôRÿ‹£é0Úª*Ëß~ÿ—æ4ƒU¨1X%k«’4µ:ß‹~t[пç¼T,Û;ü½A’†n¨zÏyÑpÈBÿÁKÂߤ9Ï`j VÉšÁª$M­ÍÿÆãæóLUsCêœ÷·©±`‡ð÷IäZÇ~xâc90wÚßüÏáïÒœg° 5«dÍ`U’¦^ÿá+£ßÀ6”ßšZÇþFøûƒ$ Z­ã~3õW_ý˜€üt©X¼Gø;4ç¬BÁ*Y3X•¤©×>çsÑo`’6ÿ5×ÅWþŸð÷I ml^jô‰Ô_sMôc²Õ»åÄøw)"ƒU¨1X%k«’4õŠý^R¯ý&«[¤Î% RcÑ®áï’4§ï”Úgþe*×ßý$€ìµ¾ú[ñïRD«Pc°JÖ V%iûêÝ~Zô#˜¢ê™‡RûÿßÄ/ F¿SHÒ¬¶x÷Ô¹àïRµqMô£ØüßI<ûHj,Ø!þ]AŠÈ`j VÉšÁª$m_­>ý¶S¹îÆÔú꿯¤™®XºWê^¶8UÅ£µÀ‹t/ß/ü}A Ë`j VÉšÁª$mgcóSõÌÃÑq`ú|75wüû…$M³æáïJ½ŽJ©ÛŒ~´/£¹bŸð÷),ƒU¨1X%k«’´ýu/]ý¦«*SïŽo¤bù›Âß1$iJÍO­“>11¾W¹öºø÷)2ƒU¨1X%k«’´ýmþ ½ùã60z­Ô½vE*|}ø»†$m­b¿W§Îwþgª6¬Ž~r“Ð>÷óáïRh«Pc°JÖ V%izõü^ô£˜IÝfê^sP*–¾.ü}C’^\såûRï¦ãRêÑOJ`²zíT,ymøû„šÁ*Ô¬’5ƒUIš^í3>ý(fC·HÝkö‹«’b[øŠÔ>í“©ÿÀw£ŸŠÀvèÝ~jü{…Á*Ô¬’5ƒUIšf‹vMUë™èÇ90KªÎs©{åR¿¸*iNküÖÔ½zyªš¢ƒÀ4´Žÿíð÷ )<ƒU¨1X%k«’4ýºß?<úq̶~'õn9qbDý"iD[¸ËO~Mµª¢ŸzÀ4UצƂâß5¤è V¡Æ`•¬¬JÒôk®|_ôã˜+U™ú÷œ—š+ßþ."i4jñÞÔ»á¨Tµ7E?á€Ô¹d<ü}Cˆ V¡Æ`•¬¬JÒÌT>~kô#˜KU•ú÷};µŽýpøûˆ¤á«XºWê\ø©|òžè§0ª*Ëßþî! D«Pc°JÖ V%ifê\ðwÑt HùØÍ©}ÎçRcÑ®áï&’¸E»¦öiŸœø•æÔïF?º€YÔàâøwiP2X…ƒU²f°*I3S±ÿϦÔkG?Ö€@Uc}ê^¹4ËöG‘4 -Ø!µŽþ`êÝpTªÚ›¢SÀiŸþ©ø÷iP2X…ƒU²f°*I3WïŽoD?Ö€AÐk§Þ-'¦æï O‘SóÈ_MÝkW¤ê¹'¢ŸHÀ«šO§ÆÂ]ÂßK¤É`j VÉšÁª$Í\­?ýXLÍ5©}æ_NüUàÑï,’f·æÊ÷¥î•¦jÃêèG¨{Ý!áï'Ò@e° 5«dÍ`U’f°±ù©Ú¸&úÑ  ªýìÄ_ Þ<ü]ñï.’f¬æ!oOKÆSùÔ}Ñ`@x÷—~*ƒU¨1X%k«’4³u/Û7úÑ ¸ríµ©}Ö_¥Æ¢ÝÂßa$M±±y©yä¯ú%Uàe•ënŒo‘-ƒU¨1X%k«’4³ËßœRUE?Þ€!Pµ6¦Þ G§Ö1šÁE¿ÏHÚB _‘Z'~<õV­LÕ¦uÑ`€uÎûÛøwiÐ2X…ƒU²f°*I3_õ¥Ñw`ÈTצî•KSóà·†¿ÓHú™ÔX¼{jô‰Ô»åĉq9À6u©ØwÏø÷iÐ2X…ƒU²f°*I3_ûŒ?~¼C¬¿æšÔ>÷ó©Xòšð÷)§6Æ;ßþûÔàâ”úÝèG0dz7þ^# d«Pc°JÖ V%iZ´kªZÏD?â€aWöSÿá«Rç‚/¦â€ŸבF­E»¦ÖñøuãòÉ»£ÿÄC®¹òýñï9Ò f° 5«dÍ`U’f§Þª•Ñx`”ô;©ß©}ægüòª4Ý_Q½à‹©ÿ…)õZѲ€Q>~køûŽ4°¬BÁ*Y3X•¤Ùió¿A 0«ãÕ³þ:üBøû4ÈK_—Úßø³Ô»é¸Tm\ý§Qísÿ&üýGØ V¡Æ`•¬¬JÒìµùߤ˜UU™Êu7¦Î%ã©yÄ{Scl^ø»ÚâÝSëø¦î•K'þl¤ªŠþS Œ¸ªó\*öÝ3þ}HÔ V¡Æ`•¬¬JÒìÕùößG?æ€ÌTV§îµ+&{ñÃß‹¤Ù®Ø÷•©uâÇS÷ò%©¿æê”Ê^ôC 3½Ž 7’:ƒU¨1X%k«’4{K^“R·ˆ~Ô¹ê4Rÿï¦ÎEÿä×W5ZÕý‚jÿá«Rêw¢ÿ¤™›xç€÷%i`3X…ƒU²f°*I³[ï–£õªkRïÆcSûô?MÅþ?þ¾$M¦bù›Rû–º×–Ê'îH©*£ÿ(¼ |ì–ð÷&ià3X…ƒU²f°*I³[óèD?ê^ª*S¹î¦Ô½æ Ô:ù?°j0Z´kjó¡Ô¹èSÿî³SõÜãÑR¶ª}ŽÍ…´Í V¡Æ`•¬¬JÒìW>~[ôã`ëª*•ëïL½U+'~ͲX¶wø»”F¼±ù©¹bŸÔ>ãÓ©{Ý!©|tUJýnôŸ€I«Ú›R±xø÷+iÐ3X…ƒU²f°*I³_ç¼ÿý¸˜²jÃêÔ»õ¤Ô¹à‹©yÔ¯§ÆÂ]Â߯4¤-Ø15{gjŸù™‰qjÿá«RÕy.úq€ié^Xüû–4 ¬BÁ*Y3X•¤Ù¯ØwOâ€á×ï¦rÝ©ûý#Rû¬¿JÍC95ìþÎ¥ÁªØ÷•©y䯥ö9Ÿ›øÅÞò‘ï§ÔkEÿÓ 0ã&Þ‹à=Lø V¡Æ`•¬¬JÒÜÔ[udô#`Æmþ—óʵ×N¼ólþÛ%ZGpâ_Ú‹~Ó´h×Ô<⽩ýÍÿœºW˜ú÷]ªgŠþG`NôW_ÿ^& K«Pc°JÖ V%injþîèG>ÀܨªTmx0õï:+u/]˜Ú§þqjú+'¢ßÍ4õŠ¥¯K­c>4ñ«ºÝ+öOý»ÏNåÓ÷§T•Ñÿ¤„Ùü®ý¾& M«Pc°JÖ V%iî*¹>ú±§ì??dýÁwR÷šIís?ŸZ_ý­T,{cøûZîMŒRþ`jŸù™Ô½|IêÝqz*×Ý”ªö¦èjNµé±Ôß)ü]Nš V¡Æ`•¬¬JÒܵù×hx½öócÖ¾›z7•:ýSjó/Rëø¦bù›Scl~ø;ÝÐ6¾s*|}jñÞÔ>í“ÿ·Ýüãþ=ç¥rÝF©SÔ¹dAü»ž4L¬BÁ*Y3X•¤9lÑ®©jnˆ~ô Ÿn3•OÞ“ú]žz·<ñ ­ ÿá…Qków¤bÿŸ‹ï›ÃŠ~~â?w븤öŸNoÿ}ê^q@êÝ|BêßwA*»yâW˜Aý®¿)Dšj«Pc°JÖ V%inÛüQ€YRöRÕXÿü¸uÍ5©ï·Rï–¯¥îµOüNç[ÿ}bÜÙ:基õë©yÄ{&~ŵ8ð ©XòšYÿ5×b¿W¥bÿŸøÿ³¹âm¿|Ú:öÃÿû´OýO©}ögSçÂ/¥îåKR÷ûG¤Þm§¤þ¾“ʵץò©{'þómþ@ ÀÜëÝ~Zø÷Fiè2X…ƒU²f°*Is[sÅ>)UUô〭éw'þ†ŒÚ´.U|¡ò©ûR¹îÆŸ´ù×L_ô?¡Æ“/ü¿‘úèÿTLS똅o”†.ƒU¨1X%k«’4÷õW_ýø¦ \gjŒÍ ÿÖ( ]«Pc°JÖ V%iîkŸþ©èÇ?0ís?þQÊ V¡Æ`•¬¬JR@ã;§ê¹'¢`ªÖÆT,Þ#þ;£4Œ¬BÁ*Y3X•¤˜ºW}“нú+áߥ¡Í`j VÉšÁª$ÅT|ù_¥Tö£`kÊ~*–¿9üû¢4´¬BÁ*Y3X•¤¸ú÷};ú¶¢w×™áߥ¡Î`j VÉšÁª$ÅÕ:ù?FÀV´ŽýpøwEi¨3X…ƒU²f°*I-Ø!UÏ<}/£|âöøoŠÒ°g° 5«dÍ`U’bë\² ú(^FûÌÏ„O”†>ƒU¨1X%k«’[qàëSêw£àEªÆ“©±p—ðï‰ÒÐg° 5«dÍ`U’âëÝufôq¼H÷ÒEáߥ‘È`j VÉšÁª$Å×:þ£ÑÇðcýn*–½1ü;¢4¬BÁ*Y3X•¤Á¨|âöè#H)õn=)üû¡42¬BÁ*Y3X•¤Á¨}îç£ ¥Ô\ù¾ðï‡ÒÈd° 5«dÍ`U’¤E»¥ªøaô±Yë?tyü·Ci”2X…ƒU²f°*IƒS÷ªeÑÇd­õõßÿn(T«Pc°JÖ V%ip*¾ò¯S*{ÑGd©|ê¾Ô›þÝP© V¡Æ`•¬¬JÒ`Õ»ëÌ裲Ô>÷o¿J#—Á*Ô¬’5ƒUI¬ZÇþFôÑÙ©O¦Æ¢]ÿJ#—Á*Ô¬’5ƒUI¼Êu7F•î¥ Ã¿J#™Á*Ô¬’5ƒUI¼ÚgýuôñùèµS±t¯ðï„ÒHf° 5«dÍ`U’°…¯HÕsOD…Þ GÇ#”F5ƒU¨1X%k«’4˜u/ß/úˆ€ÑWU©yÈÛÿJ#›Á*Ô¬’5ƒUIÌŠßR¿}LÀHëß{~ø·Ai¤3X…ƒU²f°*Iƒ[ïöS£ i­ã>þ]Pé V¡Æ`•¬¬JÒàÖ<ê×£ Y士¿ J#ŸÁ*Ô¬’5ƒUIìÊG¾}TÀHjò‡áߥ‘Ï`j VÉšÁª$ ví3þ<ú¨€‘S>uojŒÍÿ(|«Pc°JÖ V%iÀß)UÏ>}\ÀHiŸõ×ñߥ2X…ƒU²f°*Iƒ_ç’ñèãFÆæŒiŒïþPÊ"ƒU¨1X%k«’4øüBJ½Vô‘#¡óÿþ PÊ&ƒU¨1X%k«’4õn91úÈ€¡W57¤bßW†ÿ“²É`j VÉšÁª$ GÍÃß}dÀÐë^¶oø·?)« V¡Æ`•¬¬JÒðÔ_suô±ë×JÅҽ¿ûIYe° 5«dÍ`U’†§öi}lÀÐê^hø7?)» V¡Æ`•¬¬JÒµ`ÇTm\}tÀð){©Xþ¦øo~Rn¬BÁ*Y3X•¤áªsá?D0tz·œþ­OÊ2ƒU¨1X%k«’4\ûî™ªÖÆèã†GU¦æ!ïÿÖ'e™Á*Ô¬’5ƒUI¾ºW/>>`hôî8=üŸ”m«Pc°JÖ V%iø*–íR¿}„À૪Ô<â=áßø¤l3X…ƒU²f°*IÃYï¶S¢xý{Î ÿ¶'eÁ*Ô¬’5ƒUIΚG¼7ú€×<úáßö¤¬3X…ƒU²f°*IÃ[õ¥ÑÇ ¬þ‡Ó“²Ï`j VÉšÁª$ o­“~/ú€Õ:ö7¿éIÙg° 5«dÍ`U’†¸±y©\WôQ§\{mü÷º*þ;ž¤ç3X…ƒU²f°*IÃ_ç{ÿ}œÀÀhô{áßð$ý(ƒU¨1X%k«’4üK^›ªÎsÑG „+×ݘcó¿áIúQ«Pc°JÖ V%i4ê^ó/ÑG „k}íwÿÝIzQ«Pc°JÖ V%i4*–íR¿}¬@¿®* `«Pc°JÖ V%itêÝ|Bô±aZ'þNø7;I?•Á*Ô¬’5ƒUIš+öI©*£˜så£7øuUi3X…ƒU²f°*I£Uÿžó¢˜s­þCø·:I/“Á*Ô¬’5ƒUI­šGþZôÑsª\{]øw:I[È`j VÉšÁª$^ý‡¯Š>^`δNøXø7:I[È`j VÉšÁª$^­“>}¼Àœ(×^þ}NÒV2X…ƒU²f°*I#ØØ¼T>qGô³®uüoÇŸ“´å V¡Æ`•¬¬JÒhÖþæ_D10«ú_þ]NÒ62X…ƒU²f°*I#ÚøN©zæáècfMëØÇ—“´õ V¡Æ`•¬¬JÒèÖ9ÿ¿E30+ú÷]þ=NÒ$2X…ƒU²f°*I#ÜÂ]Rµé±è£fVU¥æÊ÷Ç“´í V¡Æ`•¬¬JÒh׹裘Q½;Ïÿ'i’¬BÁ*Y3X•¤oñî©*~}ÜÀÌ(û©yÈÛã¿ÃIš\«Pc°JÖ V%iôë^º(ú¸€Ñ»åÄðïo’¦Á*Ô¬’5ƒUIýŠ%¯MU{Sô‘ÓÓï¦æAo ÿþ&i ¬BÁ*Y3X•¤<ê^õåè#¦¥·jeøw7ISÌ`j VÉšÁª$åQ±ôu)u›ÑÇlŸ^+Ëöÿî&iЬBÁ*Y3X•¤|ê^Xô±Û¥{õW¿·IÚŽ V¡Æ`•¬¬JR>_þÅ”ú裦¤j=“Šý6ü{›¤íÈ`j VÉšÁª$åUïæã£˜’ÎÅÿ;ü;›¤íÌ`j VÉšÁª$åUóà·¦Tö£˜”jÓºÔX´[øw6IÛ™Á*Ô¬’5ƒUIʯÞm'G?0)ís줡Î`j VÉšÁª$åWsÅÛRªÊè#¶ª|ê¾ÔX°cø÷5IÓÈ`j VÉšÁª$åYïöÓ¢ تö)þ]MÒ43X…ƒU²f°*IyÖ<äí~e€U>òýÔ›þ]MÒ43X…ƒU²f°*IùÖ»ãÑǼ¬Öq ÿž&i2X…ƒU²f°*IùÖ<ä~e€Ó¿÷[áßÒ$ÍP«Pc°JÖ V%)ïzwž}ÀOTejöÎðïh’f(ƒU¨1X%k«’”w~e€AÒ»é«áßÐ$Í`«Pc°JÖ V%Iý»ÎŠ>Ž ¥n3_þÅðïg’f0ƒU¨1X%k«’¤æáïJ©ª¢$2×½tQø·3I3œÁ*Ô¬’5ƒUIÒæúwŸ}$±ª±>ûîþÝLÒ g° 5«dÍ`U’´¹æïñ+«„iŸó¹ðof’f!ƒU¨1X%k«’¤׿ë¬èc € •OÞ v ÿ^&i2X…ƒU²f°*IúqÍCÞ‘RUFMd¦uâï„+“4K¬BÁ*Y3X•$½¸Þí§EMd¤¿úÒðod’f1ƒU¨1X%k«’¤×<ø­)•½èã €Tejñžðod’f1ƒU¨1X%k«’¤Ÿ®wëIÑÇèÝôÕðoc’f9ƒU¨1X%k«’¤Ÿ®yÐ/ù•UfW§‘Šeo ÿ6&i–3X…ƒU²f°*Iz¹z7}D0Â:ßûçðob’æ ƒU¨1X%k«’¤—«øÊ¿N©ß‰>¦AÕÆµ©±h·ðob’æ ƒU¨1X%k«’¤-Õ[µ2ú˜`µOû“ðoa’æ(ƒU¨1X%k«’¤-Uø†”ºÍè£ €Ò_sMjŒÍ ÿ&iŽ2X…ƒU²f°*IÚZÝë‰>ªU™š+ßþ LÒf° 5«dÍ`U’´µŠ¥{¥ÔiDWŒ€Þdžÿ’4ǬBÁ*Y3X•$m«îåK¢+†\ÕÞ”Š_þíKÒg° 5«dÍ`U’´­Šý^•ªæÓÑGC¬sÑ?†÷’Á*Ô¬’5ƒUIÒdê\ôOÑGCªÚðàÄh-ú›—¤€ V¡Æ`•¬¬J’&Õ¢ÝRµi]ô±Àjüñß»$Åd° 5«dÍ`U’4Ù:çý×èc €!Óà»áß¹$f° 5«dÍ`U’4éÆwJåÓD] ‹~'5WìÿKR\«Pc°JÖ V%IS©}Ƨ£.†D÷ÊÿoI Î`j VÉšÁª$iJÍOåc·D_ ¸ê¹ÇS±ïžñß·$Åf° 5«dÍ`U’4ÕZ'}"úø`Àµ¿ñgáßµ$ @«Pc°JÖ V%IÛSÿ¡Ë£0Tÿá«Rcl^ø7-IÁ*Ô¬’5ƒUIÒöÔ:öÃÑGƒ¨ì§æaÿ6ü{–¤É`j VÉšÁª$i{ëß{~ô1À€é^»"ü;–¤Ê`j VÉšÁª$i{k®Ø'¥²}”0 ªÆúTì÷êðïX’(ƒU¨1X%k«’¤éÔ»ñØè£ €Ñ>ë¯Ã¿_I° V¡Æ`•¬¬J’¦SqàRêÑÇÁÊG¾Ÿcóÿ_I° V¡Æ`•¬¬J’¦[÷Šý£3"•½Ô<ü]áß­$ `«Pc°JÖ V%IÓ­Ø÷•©j¬>ÒÒ½zyø7+IšÁ*Ô¬’5ƒUIÒLÔ¹àï¢4T›KÅ~¯ ÿ^%i@3X…ƒU²f°*Iš‘ÆwNåÓ÷Gḵö©ÿõ̳ IDAT­JÒàf° 5«dÍ`U’4SµOÿTô±ÀêßQø7*IžÁ*Ô¬’5ƒUIúÿÛ»¯»ëúÀã& Ö—ªu©µU©­Œ[µ•£m§¶cG;NÛñÔjí´NÛéi¥ãÔ¦-O$–°…]”E‚@ ‹" QÖ KHòÜß]÷÷™“ :€Yžå>ùÜåõ:çý/|>?î÷Óç¨WÍŠîš²W;C§õ£ßœÿF%©¿s° Ïà`•‘æ`U’Ô˧ýföj`'h]1–þ6%ir° Ïà`•‘æ`U’ÔëÊ;/É^oÌ îãwGíÀŸI—’49X…gp°ÊHs°*IêuõcöŠ(ÛÙ+€Ò8ýƒéoR’$«ð ViV%I3QûÆ%Ù+€ÐùÞ—Óߢ$ PVá¬2Ò¬J’f¢bÁK£ª?‘½æè¡Íï?Å¡?›þ%i€r° Ïà`•‘æ`U’4Sµ.ÿçì5@5/øËô7(IÖÁ/Ì]ÐW¬2Ò¬J’f¬¹»E÷‰{²W=Pþè[Q›•ÿ%i *ì™=¾ ¯8Xe¤9X•$Ídͯ~,{Õ0]FÔ~súÛ“¤Á«Xøªì }ÅÁ*#­yñߥ/&IÒpWÞmöº`ZËÿ-ýÍIÒ`VñóÙ# úŠƒUFZóŸM_L’¤á®~Ò{"ª*{å0Ýu+£6w·ô7'IƒY}ñ›²Çô«Œ´æ²ýÓ“$iøë|ÿ¬ì•ÀdUÝhœ²Oú[“¤Á­~ܯfO2è+ViÍ+ÆÒ“$iø+½6¢]d¯=&¡}ã’ôw&Iƒ]ý„we2è+Vi­«ç§/&IÒhÔþö!Ùk€ ª6­bþéoL’»úÉ¿‘=Π¯8Xe¤µ®Y”¾˜$I£Qqð‹¶ü°@ÿkœý‡éïK’¿ÆÿSö8ƒ¾â`•‘ÖZqtúb’$NÍó?•½úØÎm_MW’45ÏûdöHƒ¾â`•‘ÖþÎIé‹I’4BÍŠîš²×ÛPG±ð•ùïJ’†¢Ö7þWöXƒ¾â`•‘Ö¾ýÜôÅ$I­ê'¼+¢êf¯@¶¢yî'Òß“$ Oí«ÎkÐW¬2Ò:«®L_L’¤Ñ«sËéÙ+€g)ï¼$ýIÒpÕ¾qIöhƒ¾â`•‘V>|[úb’$^›ÿ™ª±!{ 𔪹1ŠE¯MG’4\un?'{¼A_q°ÊHën\›¾˜$I£YkÙ~Ùk€§4¿þWéïG’†¯rÕÙã úŠƒUF[§µ±YéËI’4‚ÍÝ-ºÝ•½ FÞæƒ2·’f¢îC·f8è+Vyµƒ_”¾œ$I£Yã˽F[»ˆúQ¿˜þn$i8«êOdO9è+Vyµ#Þ¾œ$I£[y×¥Ù«`dµ¾ñéïE’†³bÞîÙ#úŽƒUF^qâ{Ò”$it«óËe;{Œœòþk£66;ý½HÒpV?~ïì1}ÇÁ*#¯ñ•¥/(IÒh×¾îˆìu0ZÚEÔ¿)ýHÒðÖ8ë£Ù“úŽƒUF^óòýÒ”$i´ÛüOATÌ^‰#£µô3éoD’†»Ö¥ŸÍuÐw¬2òÚ7ž¾ $Ijžû‰ì•0Êû®ŠÚجô÷!IÃ]ûúc²Çô«Œ¼Î]—¥/(I’6·ùÇfP«õ£~1ý]HÒðWÞqqöă¾ã`•‘W>zgú‚’$isõcßQ¶³W#ÀÐj^ô·éoB’F£îº•Ù#úŽƒUh7büê_’Ôµ¯;2{3 ¥rÕQs i'4w·ˆ²•=ö ï8X…ˆ¨-|uþ¢’$é€çD1o÷¨6­Í^C¥jnŒâð×§¿IêKÞž=ö /9X…ˆ¨Ÿö›é‹J’¤×<ï“Ù«`¨4/øtú¤Ñ©yþŸg=èKVaó‡é%û¦/*I’~ÒØ¬(ô­ìõ0Ê».Íÿ‘4Rµ¯]”=ú /9X…ˆhßtjú¢’$ééÕý•ˆ²½"ZÕx2ŠÃ_—þö#i´*ïY–=þ /9X…Íÿ7ÕßI_T’$=»öŠÅÙ+` 5Ïù“ô7I£W5þpöøƒ¾ä`6k1>6;}YI’ôôŠy/ŽjãƒÙ[` unýRú{¤Ñ«8äåÙãú–ƒUxJ±øÍé K’¤g×üêDzW$ÀÀ©6¬‰bþKÒßz$^3>”=¡o9X…§4¾òßÒ–$I[«¼siöšU7_øéo<’F³ö·ægOAè[Vá)­«æ¥/,I’¶Vqä#ÚõìU 0Ú×™þ¾#it+ï»:{ Bßr° Oéܳ<}aI’´­ZËÿ5{Uô½îºDí ç§¿íHÑæ>7¢]dBè[Vá)ÝæxŒí’¿¸$IÚZswÛò ÛP¶£~â»óßu$lõ“Þ›= ¡¯9X…§)–¼#}qI’´­§¾?¢ª²×%@_j}óÿ¤¿çHíZ—}.{B_s° OÓ¼dßôÅ%IÒöêÜü…ìu ÐwÊÕ×EmŽUURn|-{B_s° OÓ¾íœôÅ%IÒö*yYTµG³W&@ߨ¢8â éï8’F¼±YQÕÖeDèkVáiº׿//I’vPó‚Og¯L€¾Ñ<ï“éï7’T?áÙãúžƒUx–Úá?Ÿ¾À$IÚnc³¢¼ïªì• ®ó½3óßn$é€çD늲G"ô=«ð,óÿ{ú“$iGÕ}kD§™½6ÒTëï‹bÞ‹Óßm$isåêÙcúžƒUx–ö÷¿’¾À$IšHí«Ì^›9º¨Ÿò¾ô÷IÚ\±`Ï-s Ø>«ð,U}}Œí’¾È$IÚasw‹îº•Ù«`§k]9'ÿ­F’žªyΟdEVa+ê§ì“¾È$IšHõ“ÞQu³W'ÀNS®¾.jsü!*IýSç–/fFVa+ZW/H_d’$M´öK²W'ÀNQ56DqÄÒßg$é'ÍŽjüáìñÁÁ*lE¹ö–üe&IÒ+æ½8ª k²×'ÀŒkžû‰ô·IzzSߟ=a`8X…­©ª¨-|UúB“$i¢5¾üÙÛ`Fun=#ýMF’ž]ûßË00¬Â64.øtúB“$i2un?7{}̈î÷D1o÷ô÷IzFsv‰jü‘ì ÃÁ*lCçîeùKM’¤IT,|UTõõÙ+ ·:ͨ/yGú[Œ$=»Æ~'{BÂ@q° ÛRv¢vÈ+Ò›$I“©ùõÿ‘½Azªuñߥ¿ÁHÒÖêÜtJöˆ„â`¶£qáÿL_l’$Mª±YQÞ»<{…ôDyçÒ-ïéo0’ôìæ>7ªâñì1 ÅÁ*lGgÕÕùËM’¤IV?ê—"ÚEö˜–jÚ(¼4ýíE’¶VãKÿ9{LÂÀq° ÛÓíFí°ŸK_p’$M¶Ö¥ŸÍÞ¢S×íDã”}Òß\$i[unûJö¤„ã`v yɾé N’¤I76;Êû¯Í^£SÒZ¶þ{‹$m£â—EtšÙ£ŽƒUØrõõéKN’¤©T?ú-Fö*˜”ò¾«¶üqŽì·IÚV­Ë>—=*a 9X… (ŽùåôE'IÒTj-Û/{LXµé¡(¾2ýE’¶Ùجè>zGö¸„ä`& uÝ‘ùËN’¤©46;ÊÕ+²W)ÀŽUÝhœþÁü÷IÚNÓ>=-a`9X… èÖñ¹ÏK_x’$M¥ú1{EtÙë`»ZËÿ5ý]E’vTç{gfKXVa‚ç~"}áI’4ÕZËÿ-{•lSy×¥[þå¸ì7IÚ^Åü—D´‹ì‘ ËÁ*LPç¾o¥/=I’¦Üœ]£ûàMÙëà§Tˆâ—ç¿§HÒj-Û?{dÂ@s° “P½Wúâ“$iªÕß;¢le¯S€ÿ¯lGã”}ÒßQ$i‡Í}î–{`ê¬Â$´®=2ùI’4ÚW˜½N~¢uéÿN?‘¤‰Ô¼à/³G& <«0 UcCÔÞ=}J’4åæî݇nÍ^©QÞqqÔÆf忟HÒŽ›Ýu+³Ç& <«0IÍË>—¿%IšFõcßÑid¯T`„UOÞÅ‚—¦¿›HÒDjœù‘ì± CÁÁ*LRwÃ1>ç¹é‹P’¤éÔZ¶öJFU§õÞ•þ^"I­üÑ·³'' «0óþ,}J’4­æìåêÙ+AÍ ÿ&ÿ­D’&Xý¤÷dMVa ʇo‹ñ>Xˆ’$M§âÈ7FÕÏ^«ÀéÜú¥ô7IšLå]ßÈ04¬ÂÕOÿ½ô…(IÒtk-ýLöJFD÷áïEí ç§¿HÒ¤þºjUeOVaŠ:«®L_Š’$M»±YQÞ»<{­C®ª¯ßò¯¿¥¿HÒ$*W]™=>a¨8X…i¨Ÿö[é‹Q’¤éV,zÍ–‰fDÕÆ¿Ÿþ&"I“©qÚ²§' «0 ûW¤/GI’zQók‘½V€!Õºb,ý-D’&[yÿ5ÙㆎƒU˜¦ºÿ L’4$uVžŸ½V€!SÞ¹4jc³ÓßA$i25Îüpöø„¡ä`¦©|ðæïƒE)IÒt+¾2ªâ±ìÕ ‰î÷F±`Ïô7IšTc³£ûЭÙ#†’ƒUèÆÙ”¿,%IêA³>š½V€aÐiDý„w¦¿}HÒdk^ø×Ù†–ƒUèò‘•1îŸ0$ Iïžš½Z€×<ïÏÒß<$i²ó÷ˆª¶.{„ÂÐr° =Ò¸àÓéKS’¤^Tü¢è>qOöjTûº#Óß;$i*µW,Ρ0Ô¬BtÇ×EmÞ‹Ó§$I½¨~â»#ÊvözL¹êʨÍÙ5ý­C’&[ý˜½¼‘ s° =Ôºöðôå)IR¯j]97{µ¤zòþ(}Eú‡$M¥ò®K³Ç( =«ÐKe;ŠÅoN_ ’$õ¤9»FwÍõÙÛí"êKÞžÿ¾!IS¨qæG²§(Œ«Ðc{–¥/QI’zUqä/DÕܘ½^€~VUÑ<çãéï’4¥zATëWeOR VaÔÏøýüe*IRj^ð—Ù«ècíkKϤ©Ö¾þ˜ì1 #ÃÁ*Ì€òÑ»b|îné U’¤^ÕYy~özúPyïò¨ÍÙ%ý-C’¦Rý¤÷FtËìQ #ÃÁ*ÌÖUóÒ—ª$I½ªX°gTÖd¯W TOþ(ŠC^žþŽ!ISjînÑ]·2{”ÂHq° 3¥lGqÜÞùËU’¤Õ8ýw#ªnö†ú@ÕúqoK¿¤©Ö¾ê ìQ #ÇÁ*Ì rí­1>g×ô+IR¯j_sXöz²UÝhœõÑôw Išj›î£leOS9Va†5/û§ô%+IRÏš³kt×\Ÿ½^€D­oþKþ›…$Mµ¹»EwíÍÙ£F’ƒU˜iífG¿%ÙJ’Ô£Š#ßUscö†tn?7jc³Òß+$iªµ¯;"{”ÂÈr° ;AgÕÕ1~€vIÒðÔ<÷O³×+°“u×~7j½ ýB’¦ZãôߨºÙãF–ƒUØIš—}.}éJ’ÔË:·œž½^€¤Ú´6ŠE¯IŸ¤©VúЍ6=”=Na¤9X…¥lGq⯥/_I’zÖÁ/Œî£wdoX`¦µëQ÷Þ-i›åeOSyVa'*¿'j¿( K’Ô£êǽ-¢ÓÈ^±ÀL©ªhžóñô7 IšN­KöÍž¦€ƒUØùÚ7š¾„%Iêe­K?›½^€Ò¾êÀô·IšNõßíð@Ÿp° gÿqú2–$©§ÿ|ÆK³×+ÐcÛÏÝòþ!IS¬8ôQmX=N§8X…U}}Ô½.})K’ÔÓÿÐÛ´6{Å=Ò]ûݨô‚ô7Išrsv‰òžeÙãx«¤|à;1>÷yùËY’¤ÕøüoEtËì LSõäýQ,|eúÛƒ$M§öŠ£²Ç)ð,V!Qû–3Ò—³$I½¬uÅXöz¦¡jnŠúñ{§¿9HÒtjžû§ÙãØ «¬yÑߦ/iI’zÖØì(ï¹<{½SÑíDãŒå¿7HÒ4Ú|t­ZöD¶ÂÁ*d+ÛQ?õýéËZ’¤^UúЍ6>˜½a€Ij-ýûôwIšNÅa¯ŽêÉû³Ç)° V¡t7=µÃ~.}iK’Ô«§}`Ëÿ… †öŠÅéï ’4Šy»G÷¡[²Ç)°V¡O”«¯ñ¹ÏK_Þ’$õªÖ7ÿ%{½PÞ¹4jsvI[¤)7g×(ï¾,{œ;à`úHç¶sbü€YùK\’¤^46+Ê;.Ê^¯Àvt×­Œbþùï ’4Ú7.ɧÀ8X…>Óºæ°ô%.IR¯*yyTÈ^¯ÀVTŒbÑkÓß$i:µ®8 {œä`úPségÒ—¹$I½ª~ò¯G”íìõ ×ÝôHG¿%}ÙK’Ô‹êÇïÑ.²×+Œ¤ÎÍŸO+¤éÔ8eŸˆV-{œSä`@wÃQ;â éK_’¤^Ô<ï“Ù«FNyßUQ›»[ú;$MµúÉ¿UsSö8¦ÁÁ* ˆî“«£vøëÓ—¿$I½¨ó“²W+ŒŒî#·G1ô÷IšjÓ>Uscö8¦ÉÁ* ò±»£¶ðUé’$M»¹ÏrõŠìÕ C¯Úø`‡¿.ÿm@’¦XãÌG´ëÙãè«0`ʇoÚ¡?›þ1 IÒt+}TÅcÙ«†VU_õc%ýM@’¦ZóœG”íìq ôˆƒU@å£wFmÑkÓ? $Išn/üND·Ì^­0|Úõhœúþô·IšjÍ ÿ&¢êfOS ‡¬Â€ê>¹:ŠÅoJÿ8$iºµ–ÿ[öZ€áÒ-£ù•?N¤©ÖºüŸ"ª*{š=æ`XwÓ#Q·wúG‚$IÓjlV”?¸ {­ÀÐh-ýLþïÿ’4•æìíkfQ`†8X…×­?ÅI¿žÿÁ IÒ4*æ¿$ºOÜ›½V`൮œ›þ»¿$M©ƒ_åeQ`9X…!ÐmŽGý ¿“ÿá IÒ4ª¿wD«–½V``un:9ý÷~IšJÅa¯ŽîÚïfQ`†9X…aQv¢yÑߦ@H’4gÿaDUeoU8åGmήé¿õKÒd«÷¶¨6¬Î£ÀNà`†LkÅâ?`VúÇ„$IS­ý­ÙëJwÍ Q;èé¿ñKÒdkœù‘¨ZãÙcØI¬Âj¯üZŒøüô I’¦ÔØì(ï\š½N` t×ý Š/Íÿ}_’&ÓØ¬h-Û?¢êfQ`'r° Cª\scÔ}eþ†$IS¨˜·{týaö:€¾VmXÅá¯Oÿ]_’&SqÈË¢¼û²ì $p° C¬»þþ(Ž{ú‡†$IS©~ì[£jnÊ^§Ð—ªñG¢¾øMé¿çKÒdªŸðΨÖß—=B$Vaص›Ñøú_¥pH’4•g}Ô?ÏR57n9úÊþ_’&SóüOE´ëÙ#Hä`FDû–3büÀç§|H’4ÙÚW˜½F ´ëÑ8íé¿ßKÒD+æïï}9{z}ÀÁ*Œrí-Q;âÒ?D$IšTc³¢³ò¼ì5 ùÊv4Îüpþo÷’4Áê'ÿztŸ¸7{z}ÂÁ*Œ˜nñDÔ¿ø¡ôI’&S1ïÅÑ}ô‡ÙkòTÝhžû‰ôßì%iBÍÙ5ZWÎè–ÙÓè#VaUU´®;2Æç>/ÿE’¤ V?úÍQÕ×goQHѺøïÒ«—¤‰T?f¯è®ýnöØúƒUaå#?ˆâø·§¨H’4ѧ} ¢le¯PØ©ZWþ½$í°±ÙѺd߈v={l}ÊÁ*Œºv3š—þcŒ0+ÿÃE’¤ ´ùÿ €QÑ^qTúoó’´£êǽ-ºknÈ™@Ÿs° lѹ÷ʨ-zmúŒ$I©}ã’ìÕ 3®sËéQóLJ$õqþL´®œë_I&ÄÁ*ðU}}4.øtŒgÌH’´£æìå½Ë³W'̘Î÷ÏÚòÏk§ÿ&/IÛ¨qÚ¢ûèÙã VŸÒùѵQ½Wú‡$IÛ«X°gt»+{m@Ï•?¼pËoÈþ-^’¶V±ðUѹõŒˆªÊ—À€q° l]ÙŽÖ·ñ¹»¥èH’´­êG¿eË_€a±ù_ÛüOlgÿ/I?ÕÜÝ¢õˆª¹1{TÊÁ*°]åcwGýó¿ÿÑ#IÒ6jœþ»ÝNöÊ€i+W¯ˆÚÁ/Lÿí]’ž]ãÌDµ~Uö˜œƒU`Ǫ*Úßý|Ô¾:ýH’¤­ÕZú÷ÙÛ¦¥ûÀQÌÛ=ý7wIzzõÞåý×dH`H8X&®UDëÛ‡Fí ÿGŸ$©ÿjßxBö¦€)é>r[‡¼,ý·vIúqõcöŠÎ÷ÏÞòGÎzÅÁ*0iÝ'WGãœÇx| I’ô“æ>7Ê{—g¯I˜”îcwF±ð•ù¿³KÒωâÈ_ˆÎM'Gt;ÙãBV)+W_ÅIïMÿX’$éÇó÷ˆîº•Ù+&¤ûĽQ,zMúïë’T?ê—¢sË#ºeöh†˜ƒU`Ú:÷,â„w§4ê§ýfŒÏÙ5ý#Q’4ص–í—½ÚÆcÕãÞ–þ¸¤iÎ.Q?ö­Ñ<ÿSѹéäè®[™=Æf”ƒU`0µŠèܳ<š—ïÅÑ{åDJ’²öŠÅÙ €!QÕÖ9V•´íÆfEqä£ñåÿí«ŒòÞoFÕÜ”=ºv*«ÀP(½+Z׳ÿ8j _ÿ¡)IŒÆfGgåyÙk €W?õc%ÿwoI}Qqè+¢ñùߎÖ%ûFç¦S¢»æÇ©VaÕݸ6:·ÍKöúÉï‹ñ9»¦J’ú´¹»E¹êŠìÕÀ@ÿeÕ_Íÿ½[ÒÎiÎ.Qú³Q?áÑ<û¢uÙ?Fû†c£¼ãâè>r{T­ñì±з¬#¡ÛØUWFkÅ1Ñøú_Eqâ{¢vÐ ó?d%I}Q±`Ïè®[™½®4U­+çDó«“4¨]ø×Ѽðo¢µôlÿ-µ¯ží‹£së—¢¼ëÑ}àߣûÄ=Q5žÌž:ÍÁ*0ºª*ºO¬ŠÎ¾­«çEã¼OEýÔ÷GmÑëb|lvúñ”$içVþº¨6>½ †Ñÿ;êü›©IEND®B`‚‰PNG  IHDRÀÀRÜl pHYsèèµ{RkåIDATxœíwUõÇiÖ`°D“8Œ˜8–Ä» #¨ÑX’˜èÄ–€Fœèèò–^¤,(u ¬T!¬»ta—nAPŠ€ÂRÞíåd~×Y\`Õ}ûÞ}çþÎ=Ÿ™ï¿»ïþÎùÞò+çÁ0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 y ‘¨o–þ«£1®Ý*màf²k3H¾*2.}èåàk{QoÇ ÐºŸJn¤¬®Í@æª1¶}…YÚ©£Ìá:%¿Yúlgmp+-쬽|íì2iân[ Én'âàiCZ%Íwž}¡öwý’D3}LÛ³ñãô×€oT¦;öLDp7΄d¢zÒ×$cìÝëaÙ€¦?˜ü‡ç¿|¦>ìªÊ¬$ÿÈëÀ7bÇŒÉ0ÎêbôdÿÞœ~õ>X<¸EÍwþD¢¾QpËö¬ü!­À×÷ez왈`Í{=Ù¿÷IPxËN˜<¹Áñïü“˜Ÿ õ;üÛ°cÄ„‰ïƒ9éèš`úã3ŽNþ9/ÏÆŒÖã4ðv¯Ã“ lôaW¢'{êÙÜ7Ö·#¨ô!Ëݸg3*ªáí^‡kŠ¥R$rÃv‚†%sÊ#àWn ¸[ã@ëu:ÚP˜X³^@OÔ°d:Ïá~4 ×RÞ7Ÿ5Ü-‹Ð5,¹M*Èst8«ßrxÙr)ž\”"‚½d¾dyAŠ˜SEOÖ0ä*nfÍîŒo}à@¹¢‰¬al>ƒÍã§‹Ü"n€à®R¹H¾õ9 =i3)#ÿ „>òÚh@.‰S„Úæ8«¬#PBëû³hÀ|û1 H* -*ÈY5ÈàìÒ Ðúÿ¨¢»=q3%oïF ‚÷Õš”®=TP›]¨ŽÜÏŽ¸™žw1PÂY;>Z‹‘‡.´§¢'pº²æ¾”°æ½-È=&T±æ¾ŒžÀéÊÛó ĹÏsèöšc®ŽŸü’]›¡'q]eÜÔÐú-H¹[ߪÈ)DìD®s\>›”ðlOy ²bkö‹@ÿà—Áq@ìdNUúÈë€Ά)Ñ4€>øW@™T6_EB9õÁÛ±¨aÕa»zV @u{ô<ôaWá'v-eÍ|(¢×!Y3€¼KRFvÈQ¡r„\ÀÇjøÉ=uªà—57uœŠ"ôÿ!É’!õ°¬@–Òu6©#?ø#™ü½[,[Y…ÜwmPÛtõ}ø^ƒZò8Ÿø7˜<ò0ÆÜ±À÷ƒæá؉ÿí˜ß,ØQÆM£¥mV ·©Ê¶Cq!Ø0—h„vÊË^:duŽc1g<¥ˆälвÁ'ä|»\ÉZòçÔóí¿õ1cç‚ÖçLu {8Å×ûƒ!Á¾¨ÐƶۉA;'oßfˆnš•»³n)o×jˆ%¶Ny~ænä6ªð9kƬãˆ1®½z°Jž¸#ïÔöò7ÀO0Kó£‹89õ‚vr"Aîy—~UMáâŠpG0½®œäA’¨WÎ:¶ÞWkƒ³î§¥à¬ŸìÖ”Ýåd°’Ø¿0rØ »¥‹( ÚJ‰É"Ž‘‘ò4hЇ\‹):&œ•#3’‡hr7ÍixÒø>èƒ/Qßr•’aRE~e*Q g6d†©5ž”r¡aù˜p_í/ž‰=ÎÊQÍ?tO¸.Œ1©aë õ;—˜äS`ü½)ŽG¬ù9ϽH x lÿ{|™¨·>ÍmŽ´Â[¿@5€\q ¯ 0ß‹ñæ]¡ä9ç¿+…1öîrlHÉM] “©ó¾µ2ÀâÞ3„1±C vòKÉÞóÂTGžk³1¡Sž?D˜Sé„üU’G &À÷Á(n^¾u;`ïæÖ_Ø8Ùýd;ùuiÀÄL€<=f®cÛÉI „D/¸i-zòWß(G°xS{äM0ìóÔö’¼Q…5¡Ýe‡|ì䯒¬½ÏÄ_Û Úk?÷&;êzY³ÿÌ#žEmfa'þåÔwó<ìX0ÙÆµÁ(jnnum öÚ‰ýű@Ñ@zî¢X5i½ÏÿЮ¬Ç€Q³ÄIín¬õÀZÒ9Ô5q¨ðúÚ –ß`'•ŒÑmÈv˜aŽÆ^Ô#Ü|êÒ̉uФÆä?ò$pnS}䵫°“¿J<5J§¼ ¸;‡•CZß³ÁZ9R®´ÖµÅsçÚ€ó+± å¬#&$œ5ãêTÚ¼V‰ßãT0K;m†×Õ:ñz$D}½øŽ‡¢ÛkýÏ;|8· ÎzAâþ(&ˆ»m)èy-ƒÒ0ÑVž^psÒ|ëÏÛí÷ûåî.­Sâ3 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0ŒPˆÿ^@¦l¨¹®IEND®B`‚‰PNG  IHDR´´=Í2 pHYsèèµ{Rk«IDATxœíw”ÕÅÇC±Ähb#ßšˆî„TÎ)É}{º_qjõ0i&Ú»¬g’‹\“üVžÂ[T”Ü‹´ÿD;k¿oÈèK¸¾X©‹Ä`Ã4ö¨;’{eoPלIï¿“‹|4îŒgAXý~”Ì?/~,éZ2*à[`÷º„\fŒ3þ~©.ç¥ýÛE—Ë &;w,€TnSr¡í·‚Hu8+½ÿ8ïTˆv-§®1“a¼’çè…zcú…öçvÌt-ðm°z\h–Ðö «¢º´ áº) §Õë©jÉ(‚3òv3„æt ïÛ’ø4ŠÄ…¶ºÏ¶™¼Ïê-4N+d˜£Äö>°:ž¥§ÐÎ_Ö|†9ŠÿA'=…w,¬ù SƒoÕõ<½„æ£3Sþünz ny¯ÖÄd9^ ¬Ngë!´=ðJÈj¢¢Ï>–S(ƒeƒå9#ÞºÄà2¥`É@7L•ó†³oN®B‡k'AVᥠüxx%ÏË88×»®µÂ£”óÖ¬ ±s²‰Øú R­ÕÚêr.@èƒñÄ„›gƒ;þ¾´-á· N“ vâýÛ [p‹S[h¼qn4Q(¦vïK“€ö-dK‡lx í^¥¶ÐÑž5`*á–9`÷ùnF@BÏ‹!ª\ ¦ã ¾FM¡ñüÑDb÷¸S¥Y#—×Üøåj6©QQhaO0qBÝ÷û™ùâ½÷*˜Dlï…pS ø¥à ÿµšBGÕëÀ$ðç>“÷J¿PêY/ƒ–Deà—õwܽ$ë ë-´õÚ·À$¢ª•ô­bO¿¬èð«”oúSà¼~u½nc*#´[ü8˜B|°¬Î_#„“&·)„›f‚*Ä* X3¼™/€3ä:¥Zë6Jh\bcQο €Ú‚_¶øpÉÅq¸}þ‘S‡ íä¯2u-’:§‰<É7^òâ×%Έ[“íÖ¸U,Q_ÙVÞwW¨R¢BãŠ^ˆï–Ý*©‹_× léùàD{ÖB°|˜ìvdøiâí•Ús7˜n…A]øúÏWãC»t®$ŸFâ4_¾Ä¦˜tN°4¨±q'>P¿óÞ´ý1´Z¥«î†‚S:©‹Þ ä49öx<ôä&>þâ")¯|L¯ñyoŠJèxßVÐgدô¬žß{àÏdÿê÷’Ò^èܦúOõRdý"8B-¡± ¿î„§“œ#ÔBèŽ?¯+yÁ9B ¡qņî¸S!/8G¨!´7íIÐgðµäçE„žý è® ¡.8G¨!4žê6”¤.8G¨!t°d莲SE9y¡WŒÝÑñ‘7G$$ôÊÑ ;؃ºà¡ˆÐF¡Õ[jÅDB—ݱz\D^pŽPDèåÃ@wìþWœ#ú£! ;ÎÐëÉ Îj­Ã²ú/ÂsyÁ9B¡K AwÜÉ‘œ#Ô{"ë¶Ù¢.8G¨!4ö÷Õì²O]pŽPDè±ÚäRœ#ÔÛ?±e¯Eçz¡±£Žö„¾\I]tŽ çA˜€ÕýäEçz¡1±{t‡W­£S/¡£êõ ;î¤É‹Îj{ôéN¦·êåu…ö÷ÝáÞÂèÔKhìÚ©;ñäEç5„vFßÚÇ`u8“¼ðA/4n{fö «È ÏôBã.G¸7‰î¸“&/ÝÁ¾¨‚#×n*ÝÁ…¿ÔÁj·½Œh>ÃK²À„4Zh|0aΨßGÐ G6ð?èD>A/4÷.Ñpk)ù`p„B+Gƒöx)Hå6#Ž Ú›ö$˜€=ðJòáz¡ímÁ¼Y/“GÐ Ê;À·AwÂͳÉ„#j‚;–¹cî–Ûˆø {fPh|À²choÉi±Ô™± Ïçõ«Á›þ«ÇA|¸ê„¡Á™Ú_ð˜€3øòÁ5>yÍÁî{¸S… |8D{ÖÄQ­ãíZžY¡ñ§Á¼9yônX¬;¡øe½!Ü>¿A¢Ý«3+´Õí|0pû¸t/03/´ìy·L·¦–/qÇÝ#y2yÞ›N‚µi„6¡µ‰ÓIƒ%@g‚eoÐ펻Œ Áêt6¹ˆéJ¸n2èŒ?¯+ÐV ÁÜñ÷‘‹˜®D‹@g¼Y/щìV%‘Çäx ‘Lh|jd¾ V‡/“ËØØXÏ’+ÛuÆ|-ÐîÄ¿‚)¸“&²±q†ÞºƒœÈ„¶^û&˜Î󦲱ñJž­‰cùŒƒLhL’U2Jkÿ%X5t&Þ¿½ÎŸ51¡ƒ†‚)ø¥äR689§@œÚ:nœN/4ÎÊ2¹¹P^sz9³t~?¿;½Ð¦Lø?Š;éAr9³ñ !‚7È…Æà²Sˆ>Ý _§ÿüV;ûAwì~?TChnG0 ÷í?ÒKZxï> º»‡êu ITh{ÐÏÁ$äª ]ŽÒù­´™šÎIb‰ -¯°ï“ð¦ÿ“^Ö:Ä/-ð?è¬ÐòöÝ0‰Ø;,;úP [ë µiP«q†Ý¬–ÐÎèßiÈû¢9MÈÅ=i ZC´g-Aà@*¿¥ZBã¹¶Ø2 %w Ím*—U™BC6EM^hœ\¾aG«5_:·å#À$pŠ’B›4ûîBÜ·ÿ@/sAk7LÓ°{^¬¦Ð¸ÒØ”‹”ÿ# Áò™Ìv¿˜sÎ|Ñ®ò†Õ#B›ÔUéóÀGÌu☖䷒}4L=Px³ÿ­¶ÐÎ[w‚é`{,œLŸh-Û·mhã`,qÜ ÓŒ ]þuŸÆXWð"Ør]Z뇭¹üÒ¬¨aXǦ2´BãÓ«ùÝ ›Às[oö+`÷¿¢þ÷­ó[‚óær>LTµ² wÜ=zm÷þŽö‹5Jœª†pËð÷î3àN~HÞ!qÇÜîÄÀ›ú„”7X3áHgOCZªÕì«×˜mA2*4'›0Ìç_êF43-t6\2 $pe'T­„ÆxÑÞM ýÈŒÁK_o´_™Ú g™4`÷¾TO¡­‚Ó ¶>Mg9Í êØ]TI¡åQzÖKÔ5dT!pÀê~ÞBË£tªšº”Œfm ”Z¥Kž§®%CL|h—œ¼f„Ðø4,Þ¿º¦ !Ø ?Nºó¹4Bã\鱦¬'C½¢;ÍKÙìQ¿aÕ£‘GÁ툙,ÃK5xF]­Èâ¿°GÞF*´Ýÿ'r¢<“=¸Å%â’7¯+oAOR¡1x¥Ëda‚«æÃªU ¢½[è—åç·äGâY@| ¬Nç$7›þqFßI~”Æ}4tÝ’©¡'ÛÃ%ö+_>ò˜ÐaõF%z cë'ÆL¼©ÿHÌk@Ûšë0)4â/MÏóôF%·™Üׄ1‹`ÉÀädîtD{7×¼VЈ;ýir©±w\l泌;“áúwëÚŠ»ý†;ÊNx½„F¼²ÞòHI)µóæMrJ!£7QE™l„“ˆÌ}/?áÈü¹B#áÎeò1"¥Ônñ㙨9“Ñ'ËÀêpfúEîr.x‹Š‚“¯»<©ÐG +[òXEmàp~«ŒKí/ì•T½™Áfëö€¶rÃÌF§Ïe`½ÜiOB°i¦\ªUµ Í0ºÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3`ÿå|ÛŒ â IEND®B`‚‰PNG  IHDRÚ €y¡[† pHYsèèµ{Rk IDATxœìÛÏ«åsÇñkš†=4%þKväQ–² RîÌXøq1K‰B²±ò£h†…bI Íb !EÔÌÈâœëÜç~䎵džõížóxÔk{6çý­ïyÖÙÀuÛ¸þ„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„¶¿í-Æþ/Æî…·ÆâÜ£cûÍÆüìcvúĘ=µa–mñîƒc,÷§¾x82þøiÌ_ºcòwy3ûg§OŒùÙ»ÛÉâÜc‡-eùëW‡m…5 mËÙå±wéýÃØ~õž1;sãô‡j+¿ãà`êó€#çà÷ÆüÅ““¿Ó›Ù¿ìÌMcûµ{ÇâüãcïÒc9¿2ÖÑz„¶åþØÿù˱óÙscûûÇìÔñéÐÖj;?1õSGÚòêwc¾uÛäïöfö·ylÌ_¾ûZxûñó1–˱V7´-÷¿ÈŇÙó·N`¶¶Ûýô驟X ËËߌù–ßwfGrÏÜ<þ|ï¡kÑm…ÿíµr¡mÿÊ·‡µt¶uûôGdë½Íccï‹W¦~$`¥,»8æÏÞ2ýû¾™ýÿ½pr,>yr,¯~?VÍj„¶½±{ñ±ýú}c¶yÃôcvêøØûúí¿Ø»ï0Kïºàÿ³)I¨‘**EQP° ¢> ‚¨ˆ$êÃQŠ Âó8³»Ù´Mï=¤¾ÙÒ{ $¤’¾i›Ý$›û>ý¾¿¿kNÜ,[ffçœÏ¹Ïy½¯ëuù—NÎîù|çûÙ™ûD¿3$I’¤¡¬xøú”ïðÒøïû3±I÷CZ·œ”R§•†¡J/ÚŠúÓ©yÅžÝMhø_ø±ÏKí[—F¿=$I’¤¡Î² †Ì®¿Ø}¶~Q[™ª\%mEöxjœûµ”-zaü_Xݶ/H»Î‹~‹H’$I#Qçþ+R¾h«ø{0w¶Ij\ðß©ÈW¤*6V¹Ÿ`ûîN)ÛîEñð°†É¾ó£‹¢ß&’$IÒHÕ¹ÿrË6F‹¶ê>ƒ¿¨=™ªT5míFj^¶kʶ{qü4¬ÅäÃX‹e×F¿S$I’¤‘¬s÷ùÝG¸Dß €±¹·ÃÖ©yÕ~•y†ÛÀ/ÚÚwŸò½ßÿ ë/~U÷“$I’$ÅÕùÁ©)›¿iøýë‰|¯_Ií;ÎJƒÞÀ.ÚŠ•÷¦Ú‘ÿƒ„õÉwym*VÜýv‘$I’4ùƒ×~GÆzª~üÇRùÌ#iP¼E[Q¤Ö5u7úÖ'_üÊT<þƒèwŒ$I’¤Õj]²]ø]ë­í^ÜÝMî­Z´užøaÊzWül@¾ó«S±üŽè·Œ$I’¤µÔ<ëKáw`¬çjG¼/O?”©Y´µn8ÒO±Q ùN¯HÅc·E¿e$I’$­«²LS>~wÆúóÓm7Ÿ¥ðEÛäÇ´Öûëø?˜î¯‹Z²I’$Iƒ_§•êG(üŒõEý´ÿ/¥Vm´mÇ~ò½~5ü¦#ßéå©xô–È·Œ$I’¤™Ôª¥úaÿ+ü.ŒõE¾ßo¦bå=£¹h›ü±¾lÑ–á0ùŽ?›ŠGoŽz»H’$IšeeãéTÛÿ·ÂïÀXì°ujßuþ-ÚŠ"5.øïø¦)ßqëT‘´ç‹¶bÕ#)ßç×Ã_T˜Ù’íª^¿5$I’$ÕþþÁá÷`¬¯jßü£T4VU{ÑV<ýPÊ÷ø¥ð¦+ßî…©xà{½|[H’$I€šç|5üþŒõUí›ÿ;¥f^ÍE[‘=žò½ßþ"´-x^êÜun¯Þ’$I’©²L Ö#§vÄûºÖY©E[Q{2åûÿvø‹Ó6ÓÔ¾eI/Þ’$I’µv=ÕyOü}HýT?ö¯Rê´+²hkæ)?øÝá/LÛļԾîð9+H’$IüÊ|yªíùËñ÷ õSãôÏW`ÑV©~âÇÃ_,˜‰Öe»ÎéÛ@’$IRµ*Wþ(å;½"ünŒõUóŠ={ÑÖ8ç?Ã_$˜‰æ…ãsù$I’TÑŠ‡®IÙ¶/¿£cý3±Ijßvê`.ÚZ×ÿÁ 4¾ý¹¹úë/I’$ijߺ´{ñ޾«c}“/Ú*u½u°m¯IÙÂ燿80]ÿ>¥²˜‹¿þ’$I’†¨Ö¥;‡ßW€±¾Ê÷ú•TÔŸŒE[‘?‘²Ý^þ¢ÀtÕ'?ʷݘ“7$I’¤á«qê?‡ß[€±¾ªó‘îgÄ.ÚŠ"ÕŽx_ø‹Ó5ùÑÝ©•oôG’$IÒ×®§ÚÁï ¿¿c}ÕüÞ¾±‹¶æå»…¿0]µ}ßšÊÚÊ~ÓH’$IþÊgIù®?~ÆúgáóSç‘›cmGoñ\6*£¶Ç»¥$I’$M·âáë})Œ˜|ÿßJ©Óìó¢­UOùÞo ÿ‡éÈwù¹T®¼gÖoI’$I£[ûæR61/ü^ŒõMãÂùý]´5.ÿ†éÈ·q*½eÖoI’$Ij^è #eÁóRç±Ûú³hë¿–ÊúÌ~¤S’$I’fSãäO‡ß€±¾¨Ÿ´ÍÜ.ÚêK?þë“ïüêîó$I’$©/µë©vÀÛÃïBÀXïÍß4u¿cnmåw¦lþfñÿQ°.Û¾ ^5G¥$I’$ÍìÃvÜ:þN¤^›ü!´9Y´ÕOüxø ¬w«|Ç™sqFJ’$IÒŒëÜyVÊ&6‰¿©§æo–:Oܵq‹¶î³Ùæoÿå$™ IDATëкjß¹<#%I’$iÆ5/Z~7Æz®qú¿mÜ¢mòÿ@ô¬KóܯÍåÙ(I’$I³«,Rý[~GÆz*_´U*jOÎnÑVä+R¶í–áÿ°6þ¦{˜I’$IÒ TÖV¦|÷7„ß•€±žj^¶ÛìmÍïîþÅÃÚÔúÝî'üH’$IÒ U,».e Ÿ~gÆzfr¡žŠb†‹¶¢Hùîo ÿâaMùίNåÓõðh”$I’¤Ù×¾ñèð{0ÖSí]<³E[û®ó¿hø) ŸŸŠ¯êå™(I’$I]ã´ÏÆßŸ€Ô+“?=³E[ýø…Ѱ¦ö Gõò,”$I’¤¹©ÝHµ'üŒõîC«¦·hë~‚ç…Ѱºæ9_éÇq(I’$IsR±âî”o÷¢ð»0Ö­ŽžÞ¢­õýCÿXX]ýˆ÷¥T´ûqJ’$IҜվeIø} ë‰ÆqÞ¢­vÄû¿Xø±Ú^oê~L¶$I’$U±Æ©ÿ~¯ÆæÞ¶/H©ñÌúmEöxÊæoÿÅÂäï´¬?y¾I’$IRH»ÏOÙļð{0¶QÚ×øÜE[ã쯄QŒ …ÏOÅÃ×Gžk’$I’Z󌿛ic4ÏþòsmµÃÿ$ü‹bô´¯;<ò<“$I’¤øÚõTÛ÷×ÃïgÀجÕúàsmÙN¯ÿ¢-S>y”I’$IÒÀT,»6e 6¿§c³’ïþ†Ÿ¼ŸÇŠúSá_#øÑ·­<ô “$I’¤AªõíÃïjÀØìÌß,¥²è¾—ÇŠGnˆÿ‚ù¢­RñøíÑg˜$I’$ Ve‘ê‡ý¯ð;06+å3vßÊcíÛN ÿbí‰>¾$I’$i +WÞ“òí^~oÆfìÇö8Ö¼|ð/†ÑÐ<ë‹Ñç–$I’$ tík ¿»c3Ö¹ãÌî{x¬qî׿†_í w¦ÔiFŸY’$I’4ð5ŽÿXø›‘ö ßê¾Çê'&ü‹a¸å;¼4•OÞ}VI’$IR%*óå)_üªð»06m­«è¾ÇjÇ|$ü‹aˆMÌKœ}NI’$IR¥êÜun÷>~§Òt´.Û¥ûÞ«òžð/†áÕ<ÿÿFŸO’$I’TɧþKø›–æ…Ý÷íX¾ï[ÿ†ù¹l­è³I’$I’*YY*廼6ünŒmPó¼ÿê¾oÇò=ßþÅ0„m™ŠåwFŸK’$I’Té:wž¿Ò†4Ïûz÷=;–íú‹á_ ç}ÝáÑç‘$I’$ E“?~ÇÆÖ«yþ7ºï×±lñ«Ã¿†Kã¸FŸC’$I’4d¿Búsáw=`lƒÏ¨ËvüÙð/†á‘ïú󩬭Œ>‡$I’$i¨êüà´ðû0¶Nm̽‰MRçGEŸ?’$I’4”5–|<þÞ¤µ±h£g©$I’$Is_™?‘òů ¿ûc?Å¢9U;àí)ušÑçŽ$I’$ u~…Æ’EsgÑ–©X~Gôy#I’$I#QãøÅß´:‹6æLûºoFŸ3’$I’42•ùò”ïôŠð» 0öm̉Æq>c$I’$iäjßtlø}û ‹66Z¾ËkSY[}¾H’$IÒHV?æ#á÷B`¬Ë¢3±Iêüè¢èsE’$I’F¶rÕ²”oÿâøû!,ÚØ(Íóþ+úL‘$I’¤‘¯uÅžá÷C`Ì¢Ù«íý«)µëÑç‰$I’$©è¤Úo¿'¨kZ´1+ó7MŃWG%’$I’¤©Še×vïjá÷E]mÌJóüoDŸ!’$I’¤5jžù…ðû"d#Ì¢ó+£’$I’4˜•U)ßåµá÷FÈF”E3ÿ”Ñû/>;$I’$Ië¨}ëÒø»#Œ&‹6f¤yÞ×£Ï I’$IÒªó‘ðû#d#È¢ió+£’$I’TʧîOù¢­Âï‘‹6¦Ç¯ŒJ’$IR¥j]¶Kü]ÆG‹EÓÒ<ï¿¢ÏI’$IÒL*Ú©¶ÿo…ß'!!mlPm¯_I©U‹>"$I’$I3¬xèšîo(Eß+!m¬ßüMSñÀ•Ñgƒ$I’$i–5¾ý¹ø»%Œ‹6Ö«yî×¢ÏI’$IÒFTÖV¦ÜR?X´±N~eT’$I’†£ÖÕû‡ß1!m¬ûSFï»,ú,$I’$ÍEE'ÕöÿÍø»&Œ7‹6ÖªyöD’$I’¤9¬sÿå)›˜~ß„lˆY´ñSòÝ~1•Íg¢ÏI’$IÒ×Xòñð;'dCÌ¢ŸÒ¹ãŒèÙ/I’$IêAåÓ¥|ÑVá÷NȆ”EÏÑXºMôÜ—$I’$õ°Öwv¿{B6¤,Úø‰|Ç­S™==ó%I’$I½¬ÓLµ½Þ~…lY´ñí‰÷’$I’¤>Ô¹ýÛáwPȆE]õ£>=ç%I’$I}¬þ­? ¿‹B6d,Úè>³|òÞè/I’$IêcÅò;R¶àyáwRȆˆE©uÙ®Ñó]’$I’Póܯ…ßI!"m#®¶ï¯§ÔiEÏvI’$IR@ecUÊw~uøÝ²!aÑ6Ê&æ¥Î=—DÏuI’$IR`ík¿ŸÂøp°ha“?=Ï%I’$IÑTÛ÷­áwTȆ€Eۈʷq*W==Î%I’$IPçγÃï© ‹¶Õºú€è9.I’$I êGþiø]²Š³hAµÞÞýÑ`I’$I’~\ñÈM)›¿iø² ³h5›¤â¡ïGÏoI’$IÒÖ8ùÓñ÷V¯.‹¶Ó8í³Ñs[’$I’4 •«–¥lÑ–áwWÈ*Ê¢m„äÛ½(•Ï<=·%I’$I\óÂñðû+deÑ6BZWì=¯%I’$I^Ù|&å‹_~‡…¬‚,ÚFDmï_M©ÓŠž×’$I’¤ Ô¾æÀð{,ddÑ6":wž=§%I’$IU©è¤Ú>¿~—…¬b,ÚF@ýèGhI’$IRÅêÜqFø}²Š±hv ž—ŠåwDÏgI’$IR«ñÞø{-ŒW‡EÛkžóÕè¹,I’$IªhÅCßOÙļð»-daÑ6Äò^šÊÚŠè¹,I’$Iªpã>~¿…¬",Ú†Xëʽ£ç±$I’$©âM>Ž(›¿Yø² °hRùî¯O©ÝˆžÇ’$I’¤!¨±t›ð{.d`Ñ6¤Ú·,‰žÃ’$I’¤!©|òÞî‡íEßu!pmC¨vÐ;S*Ëè9,I’$I¢ßþ\ø}²gÑ6„:÷]=%I’$ICV¹êá”mû‚ð;/dÌ¢mÈÔû«èÙ+I’$IÒšç|5üÞ Ù³h&ó7ë~Œ$I’$I½¨Ì—§|»Åßa|0Y´ ‘ÆiŸž¹’$I’¤!¯yÑ‚ðû/dÊ¢mX,|~*Ÿz zÞJ’$I’†¼²ùLÊwzyü=ÆEÛhžó•èY+I’$I‘Z—î~†lY´ |ÑV©Ì‹ž³’$I’¤Q©]Où.?~†AcÑ6šÍ±’$I’¤«uÕ~á÷aÈŒE[Åå;¼,•õ§¢ç«$I’$iÔê4S¾ë/„ß‹! m7ù{ñ’$I’$Eä§Ú`ì9,Ú*,ßùÕ)µòè¹*I’$IÕ<« Òê,Ú*¬uå^Ñ#U’$I’4âMÞM£ïÇ ‹¶ŠÊ¿ÊO³I’$I’ã§Úv~Mø=²`ÑVQ­Ëw¥’$I’$uk]¶kø=²`ÑVAùŽ?›Êæ3ÑsT’$I’¤gkf)ßéá÷eÈ‚Y´UPë²]¢G¨$I’$IÏ©õÝÃï˳h«˜|Ç­SÙX=?%I’$IzN“¿y5ùXÑ÷fÈY´ULë»;EÏNI’$I’ÖZëâmÃïͲh«?Í&I’$IäÊú“)ßþ%á÷gÈ‚X´UHëâ…Ñ3S’$I’¤õÖ¼p"üþ Y‹¶ªX´e*óåÑóR’$I’¤õVÖV¤|»Æß£a¼ÿ,Ú*¢yöDÏJI’$I’¦Uóüo„ߣ! `ÑV 6OåSDÏII’$I’¦U™=ž²m_Ÿ†ñþ²h«€ÆÉŸŽž‘’$I’$ͨæÿ~Ÿ†¬Ï,ÚÝļTáç*d=fÑ6h&6ñ¯×’¤êUtRñð Ýo 'þ]w9~¦©|‡—¥ú1žZWÐ]fJ’T™šYÊwÜ:ü,…¬‡,ÚÌä¿øK’4ðuZ©Xvm÷7ëG¸»ü‰>CGÕä§¢6ÏúbêÜ}A÷ÏE’¤AnòÙ¤Ñg'd=dÑ6`:?º0zîI’ôÓuZ©sÏÅ©yÞ¥ÚÁïÞ)¨¸ÉŸh,ùD÷WvS»ý·F’¤ŸªÌOÙ¶?~fBÖ#m¤¶÷›}Ú˜$i ¾nß²$5–n“òí_~N23ùö/îþÙun?½ûjI’¥æéŸ?'!ë‹¶2ù\I’Â*‹T<ð½Ô¼püÙO˜~627&Ÿ™×<û?º¿î+IRtÅŠ»ºÏ'>!ë‹¶‘/Ú*•õ§¢ç$iÔj×»¿fØ8é“)÷½ÀH¨í÷¶Ô¾æÀT6VEÿí“$p“Ïx>!ë‹¶Ñøöç¢çœ$iT*:©sßeÝè[®®|»¦ÆiŸMÅ#7Fÿ”$`»Ï? ¡,ÚDñÈMÑsN’4Ì•å³Ëµ3þ-å;½"üÜc°ÔýƒÔ¾é8ŸZ*Iê_e™jû¼%ü „lŽY´ È7·’$õ¢â±[S󢩶ÇÃÏ;_¾Û/¦Ö•{¥ÔÊ£ÿêJ’F ö5…Ÿ}Í1‹¶оùøèù&I¢&Ÿ½ÕþþÁ©¶ÿo†ŸqTS¾ÓË» Ú²¶2ú¯³$i˜kå)ßqëðs²9dÑ6ßȦN3z¼I’† ÉÇ4Oÿ×î³·¢Ï7†C¾ý‹»ß,–Ùcѽ%ICZóܯ…ŸwÍ!‹¶è?€s¾=×$IU®ÝHí[–¤úï ?Ób‹¶LÍó¾îÒ%Is^ùÔý)›¿YüYãsâ-XñØmÑsM’TÁŠwwÿا†ÒïŸÄï>ÃÍOãK’æ°Æñ~ÆA6G,ÚÕyOô<“$Uð×CK·ñ/¿„ÊwýùîsSщ~KH’† Î}—†ŸmÍ‹¶@íëžg’¤ŠÔ¹÷;©~äûÃÏ.X]m¿ßè^Ž$IÚØjûÿVø¹Ù°h ’/Ú*•Íg¢g™$i+ËÔ¹ýôT;ä÷ÂÏ-XŸúÑNåÓF¿c$I®}ýáçdsÀ¢-Hã´ÏFÏ1IÒ VÏ.Øx{øy3úÀ„‹x~›$ivµ)_üÊøó Æ7ŽE[âÁ«£Ç˜$iÐ*‹Ô¾éØ”ïþ†ðs f«¶ßÛü:©$iV5/œ?Ç ÛHmjûþzôü’$ X»Ï÷l†ÇļÔ<ý_=&C’4£ÊUËR¶àyñçŒÏžE[€Ö¥;GÏ/IÒ€T<|}ªñ¾ð³ z!ßýõ©ó£‹¢ßf’¤ Õ8ñïÃÏ/È6‚E[¿MlâaÁ’¤T>õ@÷yÙüMãÏ&襉yÝ¿ëecUôÛN’T:÷\vÁøìY´õYýˆ÷FÏ-IR`eþDjžýå”-Ü"üL‚~òÓm’¤iU–©¶÷¯†Ÿ[Í’E[ŸµoøVôØ’$ET–©}ÃQ)ßéåág„>»í¬/údRIÒzk]±Gü™ã³cÑÖO‹¶ôP`IÁŠåw¦úáÁ€¨øŽT®üQô[S’4 •õ'S¶í ÂÏ+ÈfÁ¢­K·‰žW’¤~ÖÊSó¢>= Ö"ßîE©}ó ÑïRIÒ€ÖXúágd³`ÑÖG»ÏžU’¤>չ㌔ïöºð³*ñ‘­<ú-+I°:÷_~FA6 m}’ïüꔊNô¬’$õáÓDëÇþEø¹UR;à·SùÔýÑo_IÒ€UÛïmágd3dÑÖ¯ú¬/EÏ(IRkß²$å;¼,üÌ*ÊwÜÚ§’J’žSëêýÃÏ'ÈfÈ¢­OŠ®ŒžQ’¤>°·qÒ'ÃϨ¼ù›¥Ö¥‹£ßÒ’¤©l¬Jùv/Œ?Ÿ`|ú,Úú ßõçS*Ëè%IêA»/Hù.¯ ?k`˜L.®S«ýö–$ @ÓþOø¹Ù X´õãE>÷?£g“$i®kÕRóÌ/¤lb^ø9èvð»SùÌ£ÑïtIRpŲëÂÏ$ÈfÀ¢­Še×FÏ&IÒVßý–—$W;ðágdÓdÑÖcµ=Þ=“$IsXëʽR¶`óðóFêCî¿"ú­/I ¬}íaáçdÓdÑÖëø‚ÿ=“$IsQ«–':ü\‘´p‹Ô¾ùøè) IŠª•§|‡—ÆŸG0¾am=V ûÜÛîRÍ?h2>|,Úz$_ü*ÿÒ*I¬|òÞTÛûWÃÏ`Ã'üm÷â&I¼ÊUËRçöÓ»¿ò_?ä=)ÛögÂÏ ÈúÀ¢­W/ì韞k’¤VR»=F$itž«vïwRë²]Rãø¥|×_?  m=0ù©(~A’ªSûú#R¶`óðó˜=Ë6IêAE;ÝšÚ7•šg}ñÙ_õ=¤õ±hëÉOK‘$U ²L͋懟ÀܘüÉŠÉK¡$iv+îJ훎Mͳ¿œj‡üžçªÁøÌY´õ@û–%ÑóQ’´¡ŠNjœòOág0·K>áÓH%i•Ùc©sÇÝtœü©à|Ç­Ãg8dCÀ¢m®-Ø<•õ§¢g¦$iCK¶¥ÿf=Ñ8ùS>ý]’V¯™¥Î}—¥Ö•{u«¶Ï[R61/|^C6„,ÚæXýð?Ž¡’¤õU´ScÉÇÃÏ  ·šgü{ô´‘¤¸çª=|CjÿàÔ8õŸSm¿·¥lþ¦ás²aÑ6ÇZ—ï=V%IëûI¶“þ!ü¬ú£õí£§Ž$õ¼rÕ²Ô¹ýôÔ¼hAªñÞ”mû‚ðù Ù³h›cÅò;£ç¬$i]K¶%Ÿ?'€>š˜—Ú×=}$iΚ|LQ÷W@/]œêG8å;½"~Öiums(ßý ÑsW’´¶:­Ô8î£áç`þ¦©}ÛÉÑSH’f^§•Še×z®ŒW‹EÛ\¾˜g})zK’Ö¬h§ú±~F¶}AêÜEô4’¤uWtRñÈM©}í¡©qÚÿIµý~#eó7‹ŸŸ@š)‹¶9Ô¹ë¼èñ,IZ½²LSþ)ü|âå;¼,ß=•$©[ù佩}ˉ©yÎWSýÐ?HÙ¢-Ãç$06',ÚæÊ¶/H©Ýˆž×’¤Õj^8>£¶Ç/¥2"z4I±&çNçγSëâmSýèy®Œ7‹¶9R?êƒÑó[’´Zík ?€ÁS?ô÷ý㨤Þå¹j0òšms£uÅÑ#]’4ÕäGÜO>=úlSãäOE)IÃò\µÇnMíŽJͳ¾˜ê‡¼'e ·ŸqÀX(‹¶929`%Iñ|¯ûëüÑç0ØZ—î=®$U¬rÕ²î?æ5/ZêG8å;¼4|–cÇ¢mä;¿¦ûÀmIRl“ÿèá›^`Z&6IÛN‰[’´²¶2uî:7µ.Y”êÇüyÊ¿2~n© ,Úæ@ãäOGŸ’4òM~C\ÛãágP!‹¶LÅ£·D/Iƒð\µÉ_ýþÁ«=Wm“ø¤*²h›훎>$i´+‹î‡ÒDŸ@õÔöüåTÖŸŒžb’úX¹òGkáŽ3£Çš¤éV´Ÿ}®Ú G¥ÆiŸõ\5 ‹¶äÓª$)î_­'Ÿ­}ÃcòS‹'ŸÝ$iÀ*‹T<þƒÔ¾þÈÔ<ýó©và;R¶`óð™­…EÛÆ˜Ø$•ùÑÇŽ$d“¿~CgòŸ:Íè'tåÓu aò¬õÃÿØO¯©J,Ú6‚ç³IRLík ?€áÕ<ç+ÑcN™ÊƪԹï²Ôºr¯ÔXºMÊwCø È6‚EÛÆ¼xg})ú\’¤‘«XqwÊm~Clb^êüà´èq' _ž«Œ?‹¶àùl’ÔçŠvªô»áó‘çµ=y_ôÔ“*]¹jYjß²$5Ïúbªòž”mû3áïm€¬Ç,Úfkb^*óåÑg—$TÍ 'âç?02j¿+¥N+zôI•¨\õpêÜ~zj^´ ÕþpÊwÜ:ü= °h›¥Ú¾o>Ë$i¤*¸2eó7 ŸÿÀhi^8=þ¤«l<:÷\œZßÝ)Õû«”ïòÚð÷*@6 ,ÚfûÂþùèóM’F§f–j{þrøìFÐÄ&©sïw¢§ 4ÏU›üÐÚo÷\5€ñu³h›¥öÇDy’42M~øLôÜFW¾û뻟Œ(ÊsÕº¿zÞ×=W `|æ,Úf©|òÞè3P’F¢âÑ›ýÊ(®qê?GCiÎ+Ÿyd窹dÉ¢mò_}&JÒhT©vð»Ãç>À¤ö­'EOEiÖ•ÍgRç¾ËRëʽRcé6©¶Ï[ÂßSÙ²h›…Æ }NJÒHÔ¾æ ð™ðc“?í3ù@R%Ÿ«6Óð÷@6,Úf¡uÅžÑG§$ }eöXÊwxiøÌX]ý˜?ÒOU<ñÃÔ¾éØî3Mk‡ü^Ê>?ü½(‹¶Y(º&ú,•¤¡¯±ôÃç=ÀÚ´o<:zDj„+ëO¦ÎÝüÏsÕvzyø{€±Ÿ°h›©m_R§}¾JÒP×¹÷»)›˜?óÖ"ßáe~…Tý{®Ú½ßM­Ëví>¾&ßíÃÿþ0¶^m3T?ô¢Ï[IîÊ2Õ~Wø¼X¿Bª9¯è<ç¹jõCÞ“²Ï ÿ»ÀØŒX´Íô;ç+ÑG°$ uí[—†Ïz€éhß|BôÈT…+W-KÛOöW@xo÷7g¢ÿN0¶Ñ,Úf¨}óñÑg²$ o'i2D IDATE'ÕöyKø¬˜þ§>=9UÊúS©sße©uéâ©çª½"üï/c=aÑ6CÅŠ»¢ÏiIÚÚ×>çf¢qâßEN ZÍ,uî»4µ.ß½û÷#ßýõáOë‹¶>øvòÙA’¤Ô®§|×_Ÿõ3Õ¹ãŒè ª¨Ê%ihk]±Gøœ˜ÉO‚œütHàsÕmþ÷€±bÑ6“ëÂñè³]’†²É j¾ÓËÃç<Àl5Ïû¯èQª9®Ì—§Îg§ÖÅ Sýè9§HÓaÑ6“ÿz%IšûZWì>ã6ÊüÍRñðõÑãT³­ÓJŲkSëʽRcé6Ï~0Ïļø¿W¤ª±h›É—$ÍqE;廽.|Æl¬ÚÁïJ©,¢§ª¦ó\µGoNíkKÓ>›jûÿfwQý÷€±¡`Ñ6M“Á-IšûÚ7Ÿ>ãæJëêý£ÇªÖ¨|ò¾Ô¾eIjžûŸ©~ØÿJù¢­Âÿž06´,Ú¦©~äû£¿G¤¡¬vÐ;Ãg<À\Éwxi*³Ç£GëÈV6žNû.{öW@Oø›”/~eøß ÆFŠEÛ´_¨oDß ICWçž‹Ãç;À\kœú/Ñãutž«öØ­©ýýƒ=W €4(,Ú¦iòW›$Is[ý[>ßæÜÄ&©xðªè;t•+”Ú7•šg}1ÕyOÊnÿg ãÏeÑ6MÅò;¢¿·¤¡ªxüöîe4z¾ôB퀷û`„hòCÈ:·Ÿžš-Hõ£?œò^þg Ù4X´MÇ¢-}£$Is\ã”ÏÄÏw€j_{hô¨­èsÕ^þgÙ,Y´M÷£Ú%IsV™/÷+?ÀÐËwüÙTÖVDÜÁª]OÅßK­+÷N“>™j{½ÉsÕHÃÄ¢mßþ\ô·$’4Tµ.ß-|¶ôCó¬/¥‘­,RñØm©}ý©yúçSíÀßIÙ‚ÍÃÿL ë!‹¶ih]µ_ô·)’4TÕö~sølè‹›§â‰¦QÈsÕ`Ì¢m::÷\ý}‹$ M{¿>×ú©qüÇÒ°U6VýÏsÕ–n“òÝ_þ:@6,Ú¦¡Ìþ^F’†¦ÆIÿ>×úmr)UÙŠv*»5µo8*5NûlªíóŸ ãkgÑ6‡ØJ’榲þdʶý™ðÙÐoµƒ~7¥²LUùÐö-KRó¬/¦ú!ïIÙÂ燿~U„EÛÔ¿ùGÑßëHÒÐÔºbÏð¹¥}ˉiÐ*W=üÜçªí¸uøëY…Y´mè:ãߢ¿ÿ‘¤¡©¶Ï¯…Ïu€(“Ï1KíÆÀÓ¢å;¼,•µ•s;`Ë2ËïHí¾•šg~¡û<¸lááÿ­ ‹¶ (³Çæö!IÅ:Íîå2z¦ ‚æ9_™ãçªù>²aѶùö/ž£¦$vÛ¿>ÓÆ‚ç¥bÅ]ÓšŸeóÏU€ñê°h[ÚAïìñÕS’F£Æ‰>ÓIãÄ¿ûéaé¹jªÎ¢m='}²ÿ·QI¶šYÊm>ÓÊļԾuijßx̳Kµƒß²…Ïÿº€´1,ÚÖ£uÉvÑ×SIª|íÛNŸçYX´­Gû–£ï§’TùKÿ1|žd}`ѶÅ#7FßO%©ÚŸ†¤QaѶ.óºÏ’$;ν߉ŸçãýaѶù.?}?•¤Ê×<ç«áó ë‹¶u¨úÑ÷SIª|µ½ß>ϲ>±h[‡ÆÉŸŠ¾ŸJR¥+Ÿ~(|–d}dѶ­‹FßQ%©Òµ¯;<|–d}dѶ펊¾£JR¥k,ùxø,ÈúÈ¢m:÷]}G•¤êV–)ßéá³ ë#‹¶u˜|¶$ivÞ>Dz>³h[›…ÏO©,¢ï©’TÙZW?ËÆûË¢m-j{½)úŽ*I•®±t›ðYõ™EÛZÔÿ“è;ª$Uº|·×…Ïr€¬Ï,ÚÖ¢±ô£ï¨’TÙÊUËÂç8@À¢m­/Ê7¢ï©’TÙÚ·ž>DzmkѺjßè{ª$U¶æy_ŸãY‹¶µèÜvJô=U’*[ýˆ÷†Ïq€,€EÛZ^}O•¤jV–)ßqëð9°h[‹ò飯ª’TÉÊ•÷„Ïp€,ˆEÛš&6I©hGßU%©’ù  amkÈ¿*úž*I•­yáDøÈ‚X´­¡vÀۣ禍TÙÇÿuøÈ‚X´­¡~ÌG¢ï©’TÙjû¼%|ŽdA,ÚÖ|ANÿ×è{ª$U³¢²…[„Ïq€,ˆEÛZ—l}U•¤JV<~{ø ÈY´­¡}ÝáÑwUIªdÛN ŸáY ‹¶5t~xNô]U’*YëÒÅá3 dѶ†âÑ[¢ïª’Tɧ}6|†d,ÚÖPæË£ïª’TÉêGþiø ÈY´­nb“”Ê"ú®*I•¬¶ç/ÇÏq€ñ8m«ÉwÜ:úž*IÕ¬,R¶p‹ð9²h[ÍäOcH’f^ùôƒá3 fѶšÚA«JR%ëÜwYø È‚Y´­¦~ԣ朗TÉÚ7>ò`m«iœôÑwUIªd­+ö ŸáY0‹¶Õ_Œ3¿}W•¤JÖ<ïëá3 fѶú‹qт軪$U²ÆÉŸ ŸáY0‹¶Õ´®Ü;ú®*I•¬~äûÃg8@Ì¢m5í޾«JR%«í÷¶ð³h[MçŽ3£ïª’TÉòů ŸáY0‹¶Õ|/ú®*I•,[ð¼ð³h[M±üÎ軪$U®²ùLøüÈ€EÛjÊ|yô}U’*WùÔáó m?61/¥¢}_•¤ÊUò`Ñ6%ßíuÑwUIªdÛ¿>ò`Ñ6¥¶Ï¯EßU%©’µ¯?2|†dÀ¢mJíÀwDßU%©’µ®Ú7|†dÀ¢mJý°?Œ¾«JR%k]ºsø È€EÛ”úQŒ¾«JR%k]¼0|†dÀ¢mJãø¿Ž¾«JR%kž÷õð ‹¶)“>}W•¤JÖ<ó á3 mS§}6ú®*I•¬qê?‡Ïp€lX´ýø…8ûËÑwUIªd%ŸŸáÙ°h[ã…$ͬúq>ò`Ñ6¥uÉvÑwUIªdõ£?>ò`Ñ6¥uùîÑwUIªdõ£>>ò`Ñ6¥uõÑwUIªdõ#Þ>ò`Ñ6¥}ý‘ÑwUIªdõÃÿ8|†dÀ¢mJû–%ÑwUIªdõÃþ0|†dÀ¢mJçŽ3£ïª’TÉê‡þ~ø È€EÛ”Î=GßU%©’Õ~wø È€EÛ”â+£ïª’TÉjýnø È€EÛ”â¡k¢ïª’TÉ,ÚÆº,ڦˮ¾«JR%«ò{á3 mSЇ¯¾«JR%«úá3 mSŠGnо«JR%«ó‡Ïp€lX´M)½%ú®*I•¬~Ä{Ãg8@6,Ú¦Ý}W•¤JV?òýá3 mSŠÇo¾«JR%«ý¡ð ‹¶)Å?Œ¾«JR%«ó‘ð ‹¶)ÅŠ»£ïª’TÉÇ}4|†dÀ¢mJ¹òžè»ª$U²Æ‰>ò`Ñ6¥|êþ軪$U²Æ)Ÿ ŸáÙ°h›R>ý`ô]U’*YóôχÏp€lX´M)W-‹¾«JR%kžó•ð ‹¶)å3DßU%©’5/øïð ‹¶)eöxô]U’*Yë’íÂg8@6,Ú¦”ùÑwUIªd­Ëw ŸáÙ°h›RÖVDßU%©’µ®Þ?|†dÀ¢mJ™/¾«JR%k_÷Íð ‹¶)>uT’fWûæÂg8@6,Ú¦”OÝ}W•¤JÖ¹ó¬ð ‹¶)ÅŠ»£ïª’TÉ:÷]>ò`Ñ6¥xüö軪$U²â‘›Âg8@6,Ú¦Þ}W•¤JV®¼'|†dÀ¢mJñðõÑwUIªdeþDø È€EÛ”âÁ«£ïª’TÍ:­ð ‹¶)û/¾ªJRe˶ý™ð9³h›Ò¹ç’è{ª$U¶|ñ+Ãç8@Ì¢mJçîó£ï©’TÙj{þrøÈ‚Y´MéÜyVô=U’*[íÀß ŸãY0‹¶)œ}O•¤ÊV?òýás fÑ6¥}ëÒè{ª$U¶Æ’‡Ïq€,˜EÛ”öÍÇGßS%©²5Ïø÷ð9³h›Ò¾á[Ñ÷TIªlÍ‹„Ïq€,˜EÛ”öµ‡EßS%©²µ®Ü;|ŽdÁ,Ú¦´®Ú/úž*I•­}ãÑás fÑ6¥uéÎÑ÷TIªl;ÏŸãY0‹¶¿;§JRe+¼*|ŽdÁ,Ú~üBœó•è{ª$U¶bÅ]ás fÑ6¥qÚg£ï©’TÙÊÚŠð9³h›Ò8é“Ñ÷TIªne™²›‡Ïr€,EÛ”ú±}M•¤J—ïüšðY²h›R?â}ÑwTIªtµý+|–d,Ú¦Ô~wôU’*]ý¨„Ïr€,EÛ”Ú~o‹¾£JR¥kœü©ðY²h›RÛãÑwTIªtÍóþ+|–d,Ú¦ä‹_}G•¤J׺|÷ðY²h›’/Ú*úŽ*I•®}ã1á³ dÑöc›¤T–Ñ÷TIªl»/ˆŸåãq,ÚV“Zyô=U’*[ñèÍás ’EÛjÊì±è{ª$U¶É=Dz@m«)Wþ(úž*IÕ­,R6³ðY±h[MñÈÑ×TIªtù®?>˲ m«éÜsIôU’*]í ß ŸåY‹¶Õ´o;9úŽ*I•®qÜGÃg9@Ä¢m5ík‹¾£JR¥kžù…ðY±h[Më²]¢ï¨’TéZ—.ŸåY‹¶µ¼’¤ÙÕ¾ñèðY±h[MãÛŸ‹¾£JR¥ëÜsqø,È‚X´­¦qÂßFßQ%©ÒËï ŸåY‹¶ÕÔx_ôU’ª]3 ŸåY‹¶ÕÔx{ôU’*_¾ý‹Ãç9@À¢m5ùîoˆ¾ŸJRå«íýæðy°h[M¾ýK¢ï§’TùêGþiø<ÈX´­nb“”ŠNôU’*]ãÔ‰ŸçãýgѶ†²¶"úŽ*I•®uÉ¢ðY°h[C±â®è;ª$Uºö G…Ïr€,€EÛЇ®‰¾£JR¥ëÜsIø,ÈX´­¡s×¹ÑwTIªtåÊ{Âg9@À¢m 훎‹¾£JRµë´R6Óðyõ™EÛZWî}E•¤Ê—ïòÚðyõ™EÛ:^IÒì«òžðyõ™EÛ§üSôýT’*_cÉÇÃç9@Ögmk¨ý¡èû©$U¾æùߟçYŸY´­¡vàïDßO%©òµ®> |žd}fѶ†|ן¾ŸJRåëÜyVø<ÈúÌ¢mM ·H©,£ï¨’TéŠÇ?ÏÆûË¢m-ÊÚÊè;ª$U»v=eóÂç9@ÖGmkQ<~{ôU’*_¾ókÂç9@ÖGmkѹ÷;Ñ÷SIª|õC?|žd}dѶí[NŒ¾ŸJRåk,Ý&|žd}dѶ­ïí}?•¤Ê×¼hAø<ÈúÈ¢mm/Êÿ}?•¤Ê×¾þÈðyÐOmkÑ8õŸ£ï§’Tù:÷]>ϲ>²h[‹úÑ޾ŸJRå+Ÿ~(|žd}dѶµß}?•¤êW–)ÛögÂg:@Ö'mk‘ïú Ñ×SIŠj{¿9|¦d}bѶ6 ·èþ$†$iãªý¡ø™0ÞmëP>óhôýT’*_óŒŸçYŸX´­C±ìÚèû©$U¾Ö{†Ïs€¬O,ÚÖ¡óƒÓ¢ï§’Tù:wœ>ϲ>±h[‡ÖUûFßO%©òËïŸçYŸX´­ó…ùFôýT’ª_§™²ù›…Ït€¬,ÚÖ¡qÒ?D_O%i(ÊwCøLÈúÀ¢mê‡ýaôÝT’†¢ú‘ïŸéYX´­Cm7FßM%i(jžñïá3 ë‹¶uY¸EJe}?•¤Ê׺rïø™0Þ{mëQfEßO%©òuî<;|žd}`ѶŲë¢ï§’TùŠw…Ïs€¬,ÚÖ£sû·£ï§’TýŠvÊl>Ó²³h[ÖÕûG_O%i(ªíùËá3 ë1‹¶i¼8’¤«þ­? ŸéYY´­Gcé6ÑwSIŠšg})|¦d=fѶõoþQôÝT’†¢ÖUû…Ït€¬Ç,ÚÖ£¶Ç/EßM%i(êÜ}AøLÈzÌ¢m}Ó²²hÛ€|×_ˆ¾›JÒpÔª¥lb“ð¹õˆEÛ†Ìß4¥N3úz*ICQ¾Ûëâç:ÀxoX´MC±âî軩$ Eõ£>>Ó²±h›†ÎÝDßM%i(jžõ¥ð™õˆEÛ4´¯=4ún*ICQëêÂg:@Ö#mÓy‘.øÑwSIŠ:÷\>Ó²±h›†Æ’GßM%i(*W=>Ó²±h›†ÚÁ›JÒДoÿ’ð¹õ€EÛ4ä‹_}/•¤¡©vð»Ãç:@ÖmÓ11/¥V}7•¤¡¨qê¿ÄÏuàÿgï¾Ã-+ëCï¡KDoôcˆÑÄĘ(馽išDcŒ1ÆÄx7&æIΙ˜¡¡‰ ½H@&Uém„Q:Òfè°vß{½÷92ÀÌ™}Îo­w}¾Ïóù_‡³~ïy3{í@kâ,ÚÖÓxͪ軩$eÑàâ=Âg:@1,ÚÖÓ膓¢ï¦’”E£o%|¦óÀ¢m= .Ü5ún*IYT>rgøL(æEÛzêôá軩$åQY¦öò—†Ïu€bÂ,ÚÖS÷ ¿}5•¤lêì÷Ëás ˜0‹¶õÔÞåG¢ï¥’”M½>>׊ ³h[_Ó‹RêÑwSIÊ¢™÷^†Ïu€©É²hÛã{¯¾›JR¾uZøL(&Ì¢m W}7•¤,*¾-|¦fѶçï}7•¤|¾ytÙKÂç:@1Am wÂ?D_M%)›:+~1|®dѶºþFô½T’²©÷å„Ïu€b‚,Ú6@{§ÿ}/•¤l\°sø\(&È¢m•½Ç¢ï¦’”E£Õ§†Ït€b‚,Ú6Ðøž«¢ï¦’”Eå#w†Ït€b‚,Ú6Ððúc¢ï¦’”Míí |®bѶ_[}/•¤lêô›ás ˜‹¶ 4ó-y’¤ÉÔ_ùñð¹PLˆEÛêìÿ+Ñ÷RIʦáåû‡Ïu€bB,Ú6P{ùVÑ÷RIʦñ—„Ïu€bB,Úæ |üÞ軩$åQ¿HÅô&ás ˜‹¶9ÝznôÕT’²©½ûÖás ˜‹¶9\ºOô½T’²©{Ä;Ãç:@1msùC[ùñè{©$eSÿœÅás ˜‹¶9èü{Ñ÷RIʦáªãÂç:@1msÐÞåUÑ÷RIʦñýß ŸëÅX´ÍQÙ}$ún*IyTŽS±Ý‹Ãç:@±‘,ÚæhüK£¯¦’”M¿>׊dÑ6G뉾—JR6õNüÇð¹Pl$‹¶¹þÁù™è{©$eÓà’=Ãç:@±‘,Úæ¨{øŸEßK%)›F·œ>׊dÑ6GÏþdô½T’²©l?>׊dÑ6W‹7MiØ‹¾›JR6µwþáøÙ05wma¼fUô½T’²©{ÈÛÂç:@±,Ú6ÂpÕqÑ÷RIʦþÿ>׊`Ѷçm}/•¤l^ý¥ð¹Pl‹¶Ð;毣勒”Mã{¯ ŸëÅF°hÛÏÿlô½T’òiÔOÅ’ï ŸíÅY´mŒ%›Ï^ %I“iæ/0Âg;ÀÔÜX´m¤ñ}×GßK%)›zÇþMø\(æÈ¢m# ¯;*ú^*IÙ48Çð¹PÌ‘EÛÆþžõßÑ÷RIʦÑêSÃç:@1Gm©{Ä;¢ï¥’”Må#w†Ïu€bŽ,Ú6RgŸˆ¾—JRVµwxYøl(æÀ¢mcMo’R¿ˆ¾—JR6uúÍøÙ0µá,Ú&`|×eÑ÷RIʦþʇÏu€b,Ú&`xåÁÑ÷RIʦáåû‡Ïu€b,Ú&ñ‡ø•‹¾—JR6ïüzø\(æÀ¢mº‡üaô½T’²©ì?>ûþËèÙPl ‹¶ hïòªè{©$eUgÏׇÏv€bY´MHÙ~ ú^*IÙÔ;ö½ás Ø@m2ºíüè{©$eÓàÂ]Âç:@±,Ú&dpé>Ñ÷RIʦÑ-g‡Ïu€bY´Mêò”FßK%)›ÊÎC©˜^>ÛŠ `Ñ6!Ýß}/•¤¬jïöšðÙPl‹¶ i/Û2¥²Œ¾—JR6uüóðÙPl‹¶ *º5ú^*IÙ48o»ð¹Pl‹¶ Ýpbô½T’²i´úÔð¹Pl‹¶ œ»4ú^*IÙT>vwø\(6€EÛͼOH’4¹Ú;ýïðÙP¬'‹¶ jï¾uôT’²ª{èÿ ŸíÅz²h›¤éE©ì=}/•¤lêŸõßñ³`jýX´MØèŽ‹£ï¥’”MÃULJÏu€b=Y´MØàÒ}£ï¥’”MåC·†Ïu€b=Y´MXïäÿ}/•¤|*ËÔÞþÃg;@±,Ú&¬³ÿ¯D_K%)«ºÿnøl(ÖƒEÛ¤m÷â”Êqô½T’²©ÿ•‹ŸíSÏÏ¢mŒøvô½T’²ixÍáás Xmó`¸ê¸è{©$eÓxí ás Xmóñ‡zötô½T’ò©§övß>ÛŠçaÑ6º‡ÿYôµT’²ªsÀ¯…Ïv€âyX´Íƒön?}'•¤¬ê¯üXøl(ž‡EÛ|˜^”Ê΃Ñ÷RIʦáÅÏv€©çfÑ6OF·œ}/•¤lßsUø\(ž‡EÛ<\´[ô½T’òiÔOÅÒ-Âg;@ñ,ÚæIï¸÷E_K%)«:û¾9|¶ÏÁ¢mžtözCôT’²ªwâ‡Âg;@ñ,ÚæËâMSêÑ÷RIʦÁ¥ûÄÏv€©ggÑ6Æw~=ú^*IÙ4¾ó’ð¹P<‹¶y4¸tßè{©$åÓ =û¯…£g;@ñ,,ÚæQï¤о–JRVͼÿ2z¶Ï¢muVl}'•¤¬ê÷·á³ xmóié)Ñ÷RIʦÁE»ÇÏv€©u³h›gã{¯¾—JR6n=7|®Ï¢mž ¯:$ú^*IÙTvIÅô¢ðÙP¬ƒEÛ|ÿŸöÉè{©$eU{÷­Ãg;@±mó¬{àoDßI%)«zG½+|¶ë`Ñ6ÏÚ˶L©,£ï¥’”MƒówŸíÅ:X´-€ñƒ7EßK%)›F7Ÿ>׊u°h[Ã뉾—JR6ùB ¨(‹¶…øC>ó3Ñ÷RIʪÎg2|¶ßâmt¿øûÑwRIʪޱ>ÛŠïaѶÚË_ê $i‚ .þløl(¾‡EÛñ…’4¹Fw\>׊ïaѶ@†×}/•¤|´S±x³ðÙP<…EÛBýAŸñéý³£ñ IDATèk©$eUgïŸ ŸíÅSX´-î~;úN*IYÕ;ñÃg;@ñm ¤½ì%)•ãè{©$eÓð²ýÂg;@ñm h¼öÆè{©$eÓøî+Ãç:@ñm hxÍaÑ÷RI椄 Û¾0|¶O²h[È?ìÓÿ5úZ*IYÕÙï—Ãg;@ñ$‹¶Ô=ð­ÑwRIʪþʇÏv€âIm iÛ¥4FßK%)›†W?Û¦ž`ѶÀÆ÷]}/•¤l¯½!|®O²h[`ë¾}/•¤|*Ç©½lËðÙPX´ü¯üxôµT’²ªû…ߟí…EÛÂëìÿ+ÑwRIʪþÿ>Û ‹¶K_Òh}/•¤l^lül˜²h 1¾çêè{©$eSùðmás °h‹1¼âÀè{©$eU{Ç—‡Ïv€¾EÛÂëü‘è;©$eU÷Ðÿ>Ûúm ¯³b›è;©$eUÿœÅá³ oÑ`É÷¥4ìEßK%)›F«WÆÏv ñúm1Æw]}/•¤l*‹5ás oÑcxÙŠè{©$eU{× Ÿí@³Y´éø¡è;©$eUïÈ¿Ÿí@³Y´éìóóÑwRIʪÁù;†Ïv Ù,Ú¢,Þ,¥A'ú^*IÙ4ºåìøÙ¤&³h 4¾óëÑ÷RIʦ²ûH*¦7 Ÿí@«±,Ú ¾ñùè{©$eUgÏ×…Ïv ÕXmz_þûè;©$eUï¸÷…Ïv ÕXm:ŸÿÙè;©$eÕà’=Ãg;Ðj,‹¶HÓ›¤²ÿxô½T’²itÇÅñ³HMeÑltû…Ñ÷RIʧA'K6Ÿí@«‘,Ú‚ .þlôµT’²ª³÷›Âg;Ðj$‹¶`½ãþ6úN*IYÕ;ñCá³h5’E[°Îç~*úN*IY5¼|ÿðÙ´É¢-Úô¢Tvо—JR6ï¹*~¶©‰,Ú*`tóW£ï¥’”O£A*¶}aølZcÑVƒ¯-¾–JRVuöÿ•ðÙ´Ç¢­º‡ÿYôT’²ªÚ'Âg;Ðj‹¶ hïøòè;©$eÕðÚ#Âg;Ðj‹¶Š(¹#ú^*IÙ4~ðæð¹´Ç¢­"†×}/•¤¬jïôŠðÙ´Å¢­"úg|:úN*IYÕ=üOÃg;Ðj‹¶Šèô›ÑwRIʪ™otŽží@«Q,ÚªbÛ¥4FßK%)›F·œ?Û€Ô$m2¾÷šè{©$eSÙ{,‹7 Ÿí@«1,Ú*dxùÑ÷RIʪÎçß>Û€VcX´UHïÄEßI%)«z'ýSølZaÑV!½.úN*IY5¼â ðÙ´â­JošÊþãÑ÷RIʦñšUñ³HMaÑV1£Û¾}/•¤|*ËÔ^¾UølZ`ÑV1ƒ w‰¾–JRVu¿øûá³h5‚E[ÅôŽzWôT’²ªöTølZ`ÑV1í]_}'•¤¬­^>Û€V#X´UPùØÝÑ÷RIʦ²ý@*¦…Ïv •=‹¶ ÝpRô½T’²ª³ÇkÃg;ÐÊžE[õÏú¯è;©$eU︿ Ÿí@+{m4ó y’¤É5øÆçÃg;ÐÊžE[µ—¿4¥r}/•¤lßuyølZÙ³h«¨ñڢ勒”O£A*¶}QølZY³h«¨áU‡D_K%)«º¾5|¶­¬Y´UTÿ”FßI%)«úg|:|¶­¬Y´UTgÅ6ÑwRIʪáªãÂg;ÐÊšE[U-Ù<¥A'ú^*IÙT>rgülRÎ,Ú*l|ç%Ñ÷RIʪö.¯ Ÿí@+[m6¸dÏè;©$eU憎 Ÿí@+[mÖ;öo¢ï¤’”Uƒ w Ÿí@+[mÖÙã'¢ï¤’”U£Û/Ÿí@+[mU6½(•íû£ï¥’”OƒÎì—Í„Ïw åÈ¢­âFß:=úZ*IYÕÙ÷-á³heÉ¢­âç.¾“JRVõW~,|¶­,Y´U\÷K}'•¤¬^ý¥ðÙ´²dÑVqí^–RYFßK%)›Æ|;|¶­,Y´ÕÀøÁ›£ï¥’”Oe™ÚÎ<`jò,Új`xí‘Ñ×RIʪ™åGÏv •‹¶èŸþ¯ÑwRIʪÁ¹Û†Ïv •‹¶èìÿ«ÑwRIʪÑMg†Ïv •‹¶:Xú‚”Fýè{©$eSÙ}$Ó›ÄÏw åÄ¢­&Æw_}/•¤¬êìõ†ðÙ´²bÑVƒK÷¾“JRVõNø‡ðÙäÅ¢­&z_þûè;©$eÕðòýÃg;ÐÊŠE[Mt>÷ÓÑwRIʪñ½×†Ïv •‹¶º˜^”ÊîÃÑ÷RIʧrœÚË·ŠŸï@Ê…E[Œn9;úZ*IYÕ=ôíá³heâ­F_Û>úN*IY58oYølZÙ°h«‘î“JRVn=7|¶­lX´ÕH{çWFßI%)¯T,ù¾ðù´²`ÑV3å#wF_K%)«:+~1|¶­,X´ÕÌpÕñÑwRIʪþéŸ Ÿí@+ m5Ó?ó?¢ï¤’”U3=Û€V,Új¦{ÐoEßI%)«ÊÇï Ÿí@+ mu³Ý‹S£ï¥’”U=~"~¾©î,Újh|ßuÑwRIʪÞñ>Û€VíY´ÕÐðŠ£ï¤’”UÃË÷Ÿí@«ö,Új¨wÒ‡£ï¤’”Uã5«Âg;Ъ=‹¶êìý¦è;©$åUY¦öö?>߀V­Y´ÕÑâMSêÑ×RIʪîa?߀Tgm55ºý‚è;©$eÕàüÂg;Ъ5‹¶š\¸kôT’²jæ/0¢g;Ъ5‹¶šêýîè;©$åÕ°—Š¥[„Ïw U[m5ÕÞíÇ¢¯¤’”]ý5|¾­Ú²h«±ò±{¢ï¤’”Uý3>>Û€VmY´ÕØèÆS¢ï¤’”U£N Ÿí@«¶,Új¬öTôT’²ªlߟŠéEáóhÕ’E[u¿øÑwRIʮΞ¯ Ÿï@«–,Új¬½ü¥)•ãè;©$eUÏw UKm57¾uôT’²jxÅAá³hÕ’E[Í ¯>4úN*IY5óѳhÕ’E[ÍõW~,úN*IyU–©½ã…Ïw U;m5×Y±Mô•T’²«{Ä;Âç;Ъ‹¶º[²yJƒNôT’²jpá.ñóHucÑ–ñ_¾“JRVî¸8|¶­Ú±hËÀà’=£ï¤’”WÃ^*–¾ |¾õbіޱメJRvu|kø|ZµbÑ–öî[GßG%)»ú_ýÏðù´jÅ¢-e±&úN*IY5Z½2|¶­Z±hËÄhõ©ÑwRIʪ²óP*¦7 Ÿï@«6,Ú2Ñ?gqôT’²«³×Âç;Ъ ‹¶Lty[ô}T’²«wÒ?…Ïw Um™h/ß*¥²Œ¾“JRV ¯:$|¾­Ú°hËÈøþÕÑwRIʪñƒ7‡Ïv Um^ý¥è;©$eW{×W‡Ïw U mé¯üXô}T’²«wÜûÂç;Ъ‹¶ŒtVl}•¤ì^~@ø|Zµ`Ñ–“%›§4èDßI%)«Æ÷+~¾©,Ú23¾ó’è;©$eW{çŸï@«ò,Ú23¸dÏèû¨$eWïØ÷†Ïw Uym™™¹ J’&Ûð²ýÂç;Ъ<‹¶Ì´wß:ú>*IÙ5^{cø|Z•gÑ–¡²X}'•¤ìòž6 xm­>5ú>*IÙÕ;æ=áóhUšE[†úgOGßG%)»—î>߀V¥Y´e¨{ÈFßG%)»Æk¾>߀V¥Y´e¨½|«”Ê2úN*IyU–©½Ó+Âg<Ъ,‹¶LïÿVô•T’²«wÔ»Âç;Ъ,‹¶L ¯þRô}T’²kð½Ãç;TÆÒÄÿo˜ª‹¶LõW~,ú>*IÙ5¾ïúðù!–lž:û¾%õOûD^}h¯Y•F«WÆÿ‹¶LuVl}•¤<ßÓ¶ãËÃg<̫ś¦Î^oH½ãߟ—ì™F·_˜Ò°÷Œ_G·žÿ¿uªZ,Úrµdó”€[¨$å]ïÈ¿ˆŸñ0Aí_™º‡ýIꟳ$n<%•‡Öëwãñ—„ÿo/*Æ¢-c3?ð’¤É6¸äsáó檽lËÔ=àןøèõǦòñ{çü»ñøž«ÃÿÿcÑ–±ÁÅŸàÕR’4ÓøÞkÂç;¬÷{Õf>zÒ‡¿û^µTŽ'÷»ñÚãÿ?NU‹E[ÆzǾwb$é)ïiÛáeá3¾W{÷­Ÿ÷½jýÕøáÛÃÿ?cÑ–ù&Iš|Ý#Þ>ãh¶g¾WíÁÿ½¸|ü¾ð?‡¢b,Ú2WküA“¤Ü›ùh~ô| 9ÚË^ò?ïU»úÐT>|[ªBeïÑð?›¢b,Ú27Z}jôs'IÙ5¾çªðù@¦æù½jmÔÿ󚪋¶ÌõÏžŽ~ì$)¿Êqjoÿƒá3€ú{æ{Õº©N‹7 ÿ3,*Ä¢-sÝCþ0ú™“¤,ëþgá3€š¿W­ý@ª{Åv/ÿs-*Ä¢-síå[U÷Ÿ˜JR\´{øŒ FïU{èÖ”cí^þg]TˆE[Œï_ýÜIRvï¾"|¾P‹7{â½jÇ¿? /ß¿ÚïU›pí]~$þϪ:,Ú`xõ—¢Ÿ;Iʯñhö_ GÏxb>Ú;úݵ}¯Ú$ëìñÚðÿE…X´5@åÇ¢Ÿ;Iʲîa>ã˜_9¾Wm’u>ÿÆðÿFE…X´5@gÅ6ÑÏ$eÙàÂ]Ãg<“Ó^¶eêü»©ÿÕÿL£ožÊGïŠþ•³òuöû¥ðÿnE…X´5Á’ÍSt¢Ÿ=IÊ®ñ]—ÅÏx6ú½j3yoSÞ«6Éf¾ð!ü¿åTuX´5ÄøÎK¢Ÿ=Iʯñpöo=£g<ëÿÐÁ;=ñ^5ÿ e"uúÍðÿ¶E…X´5ÄàâÏF?{’”eÝ/ýQøŒ`KµÃÿ, ¾¶4׬Šþ±Qu¿øûá?E…X´5D{÷­£Ÿ=Iʲñ=W…Ïx€F¿Wm<Šþ•°Ñuy[üÏÅTuX´5HY¬‰~þ$)¿Êqj;Cæ…÷ªU?¯Ri=E[ƒŒVŸýüIR–õŽzWøŒ¨»öò­f?†Ø?gIÝxJ*‹µÑ¿æi=êþ§á?;E…X´5HÿìéèçO’²lxÙŠðP+Û½ø™ïU+Ëè_ë4‡ºG¼3þçiª:,Ú¤{ÈF?’”eã¾>ãêò^µÙ€ŽúÑ¿ÂiBõŽúËøŸ±©ê°hkØ?Ãy—$iòµw{Møœ¨Ò{Õf?zóY) ÚÑ¿ªiëýWá?sE…X´5ÌøþÕÑÏ $eYÏx€…Ö^þÒ'>zægž|¯š/ákZ½cßþsXTˆE[ÃÌ|ö]’4ù†×>ãæ•÷ªiõŽûÛøŸÍ©ê°hk˜þÊE?ƒ’”eåã÷¥bzQøœ˜ˆÅ›z¯šÖ«Þ—?ÿó:Um ÓY±Mô3(IÙ6óËhôœ˜ ïUÓ\ëðá?¿E…X´5Í’ÍSt¢ŸCIʲþ©ÿ?瞇÷ªi’õNú§ðŸé¢B,Úh|ç%ÑÏ¡$eÙèÆ“Ãg<ÀÓlû¢Ô=ð­©ú§Òðº£RùÐ-Ñ¿2)³ú§üsüÏùTuX´5ÐàâÏF?‡’”ee÷‘Ù÷™DÏy ¡Öõ^µa/úW$e^ïäÿÿ³?Um Ô;毣ŸCIʶÎ~¿>ç€fhïöšÔ;ú¯Òà¢ÝÒèö RêÑ¿ ©ùèhëi,Ú:Œ%IóSÿ¬ÿ Ÿó@~Ú;¼,u}{ꟳ8V¯ô^5U&_†Ðz‹¶†*»;úY”¤,Ýz^øŒjnÉæO|ô¤§áÕ‡¦ñšU)•eô¯9Ò:ë}ùñÏÌTuX´5Ôè›'D?‹’”g£~jo÷ýás¨ ïUSÍ›ùÙ ަªÃ¢­¡úgþGô³(IÙÖ=ìÃç<PMí_™º‡ýIꟳ$n<%•‡¢u‘6ªÞ±þ\bÑÖP݃~3úY”¤l›ùÛèè9Äk/Û2uøõÔ?íixý±©|üÞè_S¤‰×;æ=áÏZQ!mMµí S ¢ŸGIʲñÚâç<P÷ª£-‘æ½ÞÑïŽþ¦ªÃ¢­ÁÆw_ýŠ ±hk¸îÁ¿ýLJR¾ú©½Ý÷‡ÏzÈÊ’ïKý~)õW~lv©6^{ƒ÷ªIuú­ø¹0Um 7ó7?i<Š~.%)Ûf>²=ë «÷ª :ÑÇ»¤§ÔÙï—ÃçDQ!m¤ñ½×F?—’”mƒ¯ï>ç .Ú;ÿpêñŽ4øÚöitóY©ì>}”Kzž:{¿)|vbÑÆì×XK’æ§ñߟóPE3¯Wxê{ÕÆkVEÛ’æPgÏ×…Ï“¢B,ÚH½>ý\JRÖuöø‰ðY¡o–:{½!õŽÿìG@Çw_á½jR&µw}uüŒ™ª‹6Rçs?ý\JRÖͼ¬9zÖÀB¿Wmæ=¥ƒ vò^5)óÚ;þPøÌ)*Ä¢TL/JeçÁègS’²m´úÔøYó¤½|«Ôýâï§þ9KÒèÆSRÙ¾?úè•´€Í|Ébô**Ä¢Y£o%úÙ”¤|tR±í Ãg=l,ïU“ô½K6ŸME…X´ñÄÂ9K¢ŸMIʺî!>ë`£ß«6E©’ªÔx?«¦ªÅ¢YÝCÞýxJRÖ .Þ#|ÖÀ†½W­}|JªxeÿñðÙUTŒEß}¯‚oý‘¤ùk¼öÆðYÏú^µbmôQ)©†Í¼“1zžcÑÆw×ÞýŒJRÖµwß:|ÖÐ@Û½ø™ïU+ËècQR•~'~ÆMU‹Eß5¼òàègT’²®wòGÂg=™[¼éÓÞ«6ûÐQ?ú””iã¾?÷¦ªÅ¢ïêôáègT’²ntãÉá³€<ß«6ûЛÏò^5I Úø¾ëÂç`Q1m|WçóoŒ~F%)ïúE*–n>﨧öò—>ñÐ3?óä{ÕÖDŸl’Þø®ËÂgcQ1müÅ›¦²÷Xôs*IY×=ø÷âç=õx¯Ú¿‘ú_ùixÝÑ©|èÖè#L’žÑèö âçåTµX´ñ4£›¿ýœJRÖ .Ú-|ÖP1‹7K½ß”z'ýS^q`ß{mJãaô‘%IÏÛè[§ÅÏЩj±hãiç.~N%)ëÆ÷¯ŸõTì½jý"úx’¤95¼öÈð™ZTŒEOÓýâD?§’”}Ïþdø¼ è½jß} IÒÄ^¶_øœ-*Æ¢§io÷ýþ™º$ÍsýÓ?>ï˜K6O}ß’ú§}" ¯>4׬J©,£Iš·ì?{§ªÅ¢gßsuô³*IY7ºåìðYÀFZ¼iêìõ†Ô;þýipÉžitû…) {ÑGŒ$-hý³§âçñTµX´ñ ƒoìý¬JRÞ©½|«ðyÀß«6óÐÎCѧ‰$…×?õ_ÂçsQ1mïX·ö²-Ÿx¯ÚÌG@¯?Ö{Õ$éYê}ùá3»¨‹6ž¡½ë«£ŸUIʾ™w÷DÏ{ži棠’¤õ«{䟇Ïí¢b,ÚX§ò‘;£ŸWIʺ²X;û~ŸèyÀÓõÏø÷è#B’jS÷àß ŸÛEÅX´±NÃ뎎~^%)û:üZø¼àé_Û>úx¤ÚÔY±MøÜ.*Æ¢ušy¡¡$i~›¹ÌEÏ{žnpé>Ñǃ$զΞ¯ ŸÛEÅX´±N}ßý¼JRöï½6|ÞðtÃkˆ>$©6µwzEøÜ.*Æ¢u[¼i*{E?³’”}íÝ^?óø®Ñ·N‹>$©6Û¾0|ncÑÆ³Ýrvô3+IÙ×?å£áó€ÿ1ºãâè£A’êÑh>³‹ ²hãY ÎÝ6ú±•¤ìÝtfø¼àŒ×|3úh¤ZT¶ŸÙEY´ñ¬º‡¼-ú¹•¤ü R{ùVá3€'”íû£OIªEãû¿>³‹ ²hãYµ—m™ÒxýìJRöõŽ}oøÌà‰÷ûýW’Ö¯™Ú‡Ïí©ê±hã9Í|#ž$i~^wtø¼ •Ú;¾<úH¤Ú4ºñäð¹]TEÏipé¾ÑÏ®$e_Ù<K·ŸùM×Ùëg¢IªMÃ+ ŸÛEY´ñœzǽ/úÙ•¤FÔ=ôíá3 éº_øíèã@’jÓà‚ÂçvQAm<§ön¯‰~v%© /[>óš®wô»£IªMý3þ=|ndÑÆó*½+úù•¤ì+»;Ó›„Ï|€&ëŸòÏÑÇ$Õ¦Þ  ŸÛEY´ñ¼†×ýüJR#êì÷Ëá3 Éç-‹> $©6uû“ð¹]TEÏ«Ú'£Ÿ_IjDƒówŸùM6¼òàè£@’jSgÿ_ ŸÛEY´ñ¼:+¶‰~~%©×Þ>óšltÓ™ÑG$զί ŸÛEY´ñüo–R¿ˆ~†%©uö|}üÜh¨ñ}×G’T›ÚÛÿ@øÜ.*È¢õ2ºõÜègX’ÑÌÁ=óšªì>} HR= R1½(|ndÑÆzñbXIZ˜Æw_>óiÛE’T›ÊÇïŸÛSÕdÑÆzéúöèçX’S{÷­Ãç>@Ót>û“Ñã_’jÓø¾ëÂçvQQm¬—öò—¦4E?Ë’Ôˆúg|:|î4M÷ ¿=þ%©6n=/|neÑÆzßsUô³,Ih|ç×Ãg>@ÓôNø‡èñ/Iµixíás»¨(‹6ÖÛàâÏF?Ë’ÔŒÊ2µw}uøÜhï$–¤õopá®ás»¨(‹6Ö[÷È?~–%©1õOûdøÜh’á5‡E~IªMýÓ?>·‹Š²hc½µ·ÿÁ”Êqôó,Ihtûás IFw\=ú%©6õŽyOøÜ.*Ê¢ 2^³*úy–¤fTŽS{çŸûMQ>vwôä—¤ÚÔ=ð­ás»¨(‹66ÈàÒ}¢ŸgIjLýS>>÷aé>¹!IP{÷­ãg÷T5Y´±Afþy¨$iaÝznøÜh‚Ξ¯ù’T«Šm_>»‹Š²hcƒ´w~eôó,IÍiûr×=üÏ¢'¾$Õ¦²ó`øÜ.*Ì¢ 6~àÛÑϵ$5¦þÊ…Ï}€ÜõÏüèq/Iµi|ßuás»¨0‹66ØðŠ£ŸkIjL¾}`þ ¯üBô¸—¤Ú4ºéŒð¹]T˜E¬wüû£ŸkIjNe™Ú»ýXøìÈÙ莋£§½$Õ¦™¿œˆžÛE…Y´±ÁÚ»þhôs-Iªÿ• Ÿý9+ÛDzIªMƒó–…Ïí¢Â,Ú˜“òáÛ£ŸmIjLã». Ÿû¹jïð¿¢Ç¼$Õªþ)ÿ>»‹ ³hcN†WýlKR£êìñá³ GÝß=â%©VuxGøì.*Ì¢9éøÑ϶$5ªþYÿ>ûr4ó/3$Ië_gÅ6á³»¨0‹6æ¤óÙŸŒ~¶%©Qùu€ù1¼l¿è/Iµª½ÃËÂgwQamÌYùØÝÑÏ·$5ªÎ^?>ûr3¾ó’èñ.Iµ©ì=>·‹Š³hcΆ×ýŒKR£œ·]øìÈÊô¢Töï’T›|Ê¢õ¼,Ú˜3ﳤ…müàͳ—Âèù‹öî[GvIªU£O ŸÝEÅY´1g3a’$-l~-|þä¢wä_DuIªUƒK>>»‹Š³hcãþ©}±6ú9—¤F5¼lEüüÈDÿœ%Ñc]’jUÿ¯Þð IDATôO…Ïî¢â,ÚØ(Ão~9ú9—¤FUvJÅÒ-Âç?@F«Oë’T«ºG¼3|vgÑÆFéŸöÉèç\’W÷È?Ÿÿ9(‹5Ñ#]’jUgï7…Ïî¢â,ÚØ(}~!ú9—¤Æ5úæ áó îÚ»ÿxô8—¤ÚÕ^þÒðù]TœEgz“TvŽ~Ö%©Yú©½ÃËâÏ€ëóžèi.Iõ{…IæwQqml´Ñê•ÑÏ»$5®ÞÉ Ÿÿu6¸h·èQ.Iµj|÷•á³»¨‹66ZÿŒ~Þ%©qî¸8|þÔÙèö ¢G¹$ÕªáªãÃgwQml´Î~¿ý¼KRó*ËÔÙãµág@--Þ,¥~=É%©VÍüKàðù=U}ml¼Å›¥²÷hô3/IkpÞvñg@ uVl=Â%©võW~<|~5`ÑÆDŒVŸýÌKRã*ýN*o~ÔMÿ+ÿ=Â%©vuy[øü.jÀ¢‰ðËŠ$Åä€ 7ºá¤èñ-Iµ«½ÛkÂçwQmLDgŸ_ˆ~æ%©‘ ¯?&ü ¨•éE©l?=¾%©^ :©˜Þ$~†OUŸE“1½I*Û÷G?ú’Ô¼FýÔv†¬·Îçß=¹%©vï½6|~5aÑÆÄÌ|Õ¯$iáëŸö‰ð3 .ú+?=¶%©v ¯?6|~5aÑÆÄôOùhô³/IÌß0¬¿áuGGmIª]ƒó–…Ïï¢&,Ú˜˜Îç~:úÙ—¤ÆÖÙ÷-áç@-^wR¬Ù’T»zÇýmü Ÿª‹6&ª|ô®èç_’ÙàÒ}ÂÏ€ªëì÷KÑãZ’jYgÅ6á3¼¨ ‹6&jxÍáÑÏ¿$5²²ûp*¶}Qø9Peý³§¢Çµ$Õ²ö²-ÃgxQmLTïÄE?ÿ’ÔØz'|0ü¨²ÑEjIª]åc÷„Ïï¢F,Ú˜¨öî[GÏIjlãï\~TU{ùV)‡Ñ£Z’j×èÖóÂgxQ#mL\ùðmÑs@’›/EX·ÞQïŠÑ’Tˆ—­ŸáEX´1qÃ+¿=$©± ¯80ü¨¢™ù(IÚðú§*|†5bÑÆÄõŽ{_ô¤æÖ/R{ùKÃÏ€J™Þ$•ß=¡%©–u¿ôGñs|ª>,Ú˜¸öN¯H©,£g$5¶þ©ÿ~TI÷À·FfIªmíÝ^>Ç‹±hc^Œï½6zHRc¯½!Ó‹ÂÏ€ª\¼Gôh–¤ZVvñ{åÔ†±hc^ .Ú=zHR£ëô›ág@U”Ý=–%©–n¿0|†5cÑÆ¼èúöèy Inxý1ág@tö~SôH–¤Ú6¸tßð9^ÔŒEócÛ¥4ìEÏIjnãajïú£ñç@°Á¹ÛFOdIªm½“?>Ç‹š±hcÞŒn9'z&HR£œ¿cøYm|ßuÑãX’jÛÌ—ÉDÏñ¢f,Ú˜÷.IRLeç¡Tl÷âðó Jg¯Ÿ‰Å’TßÊ2µ—m>Ë‹š±hcÞtVl=$©ñõNú§ðó Êà‚£Ç°$Õ¶ò¡[ÃçxQCmÌŸéMRÙ¾?z6HR£¯Yå+Ùæþ.úÈÑcX’jÛèÆ“ãgùTýX´1¯†«Ž‹ž ’Ôøº_üýðó`¡u¿ð;ÑãW’jÝà¼eá³¼¨!‹6æUï¤GÏIj|£Õ+ÃÏ€…6¼â èñ+Iµ®wô_…Ïò¢†,Ú˜WíÝÏ‹²hcÞ .Ý7zDH’†½ÔÞù•ágÀBÝznôÔ•¤Z7¾ûÊðY^Ô”Eó®{Ä;£g„$iæ…¶ì~&̷Ξ¯O©,£G®$Õºá•_ŸçEMY´1ïÚË^’Òh='$©ñ•½GS{ùVáçÀ|\´{ô¸•¤Ú×;ù#áó¼¨)‹6Ä趯EÏ IRJ©æ„Ÿ ófÉ÷¥²X=j%©öuö}KüLŸª'‹6ôM’[ùø}³ßÆ}.̇ޱ=f%©þú©XºEøL/jÊ¢ÑÙçç£G…$éÉz'~(ü\˜£Ûα’TûÆw]>Ï‹³hcaL/Jåc÷DÏ IÒÌ/OÞìëÚìÌ|ÌI’´ñ .Ý'|¦5fÑÆ‚^}hô¼$=Yïø¿ ?&ixí‘Ñ£U’²¨wÂ?„Ïô¢Æ,ÚX0Þ™!IÕiüàMþUö.?â[î%iBu>ÿÆð¹^Ô˜E ¦½ÃÿJ©GÏ IÒ“õŽûÛð³`ï=R%)m;µq,ÚXPãï\=6$IO6~àÛ~‘j¯½lËTv‰©’”E£;. ŸëEÍY´± çn=7$IOiæcýÑgÀÆèŸùÑ£T’²ipñgÃçzQsm,¨Î¿=7$IOi¼ö†T,Þ4ü|˜“¥/Hå£wERIÊ&¯im4‹6ÖâMSÙy0zvH’žRïˈ?æ Ú'¢G¨$eUgÏׇÏö¢æ,ÚXpÃ뉞’¤§T>|[*–n~>lð¿f{ìîè*IÙTöMÅô&ñó}ªÞ,ÚXp3ÿrB’T­ú§}2ü|ØýÓÿ5ztJRVn:3|¶°hcÁµwü¡”Êqô ‘$=¥²}ÿì7÷EŸëÅ»Ù$iâõÏY?ß§êÏ¢ãï|#z†H’¾§þ9KÂÏ€õÑ?ýSÑ#S’²«{ðï…Ï÷"m„èŸ==C$Iëx/GÛï@ŵ·ûþT>~oôÈ”¤¼S{ÙKÂg|‘‹6Btö}sô‘$­£Á%Ÿ ?#žËà¼í¢G¥$e×øî+Ãç{‘ ‹6bL/ò^ Iªbãaêìõ3ñçÀ:´wyUJƒvô¤”¤ìò—­­‰±h#Ìðò¢g‰$iVŸ~F¬ËðšÃ¢G¤$eYïè¿ ŸñE&,ÚÓ=âѳD’ô,u}{ø9ðT}~Á7×KÒ<ÕÞåGÂç|‘ ‹6âl÷┆Ýèy"IZGãµ7¤bñfñgÀ“F·_=%)Ëʇo ŸñEF,Ú5ºéŒè™"Iz–ú§|4üœ˜Ñ;ê]Ñ#Q’²mxíás¾ÈˆE¡ú§þKôL‘$=KeûþÔÞáeágÐlíe/Iå£ß‰‰’”mþrµ5Qm„jïþãÑ3E’ô ¯80ü¬šmpɞѣP’²®³÷Ï…Ïú"#m„›y$©¢•eêðkágÐL}ß’Òx= %)ÛÊÞ£©X¼iø¼/2bÑF¸Á…»DÏIÒs4¾÷Z_Œ,¼Å›¦ñÝWD@IʺѷNŸ÷Sy±h#\÷À߈ž-’¤ç©ÿ•ÿ~^ÍÒ?ý_£GŸ$e_ÿŒO‡Ïû"3mÄ[¼i*‹µÑóE’ô•ýÇS{×?3€F˜™7eï±èÑ'IÙ×Ù÷Íá3¿ÈŒE•0¼òàèù"IzžFß:-ü¼`z“4ºåœè‘'IÙWvœ¹ás*/mTB÷ˆwDÏIÒzÔ;þïÂÏ o3U—$ÍÃULJÏü"CmTö/LiÐŽž3’¤ç©ì>’Ú»¼*þܲÔÙë ) :Ñ£N’Qÿ”†Ïý"CmTÆèÆ“£çŒ$i=­^~fZò}i|ï5Ñ#N’Sçs??û§òcÑFeôNø‡è9#IZÏzǾ7üÜò2¸`§èÑ&I©|ìîð¹_dÊ¢Êhïøò”Æ£èy#IZÏ—çú)0)Ý/ü¶ß%i^sXøì/2eÑF¥Œî¸(zÞH’Ö³Ñm_óMUÀFkïôŠÙY!IZ¸z_þûðù_dÊ¢JéŸñïÑóF’´õÏøtøÙÔØâÍÒè¶ó£G™$5®ön?dÊ¢JéìñÚèy#IÚ†½ÔÙçÂÏ ží=Å$©q¼)|þ³h£rÆkoˆž;’¤ hfnÛ¾(üüê¥wä_¤T–Ñ#L’×ðòýÃÏ€"cmTŽoœ’¤ú5¼êðó¨Îž¯KeïÑèÑ%I¬wô_…ŸEÆ,Ú¨œÎþ¿=w$Is¨wâ‡ÂÏ úÚË_šÆk¾=²$©™G©½ý„ŸEÆ,Ú¨žéE©|äÎèñ#IÚІÝÔÙ÷ÍñçP]K6O£›¿=­$©±n¿0þ,˜Ê›E•4øú^ÑóG’4Ç—ëÎük•ès¨¦áe+¢Ç”$5ºþYÿ~™³h£’ºýVôü‘$ͱÑ'§bz“𳨖þ™Ÿ‰O’Ôø|[|kþÏ;‹6*iz“T>vOô ’$ͱÁ×–ÇŸ%@eôŽúË”Êqôh’¤FW>~ï쫚¢Ï„"smTÖð²ý¢ç$i®•eêóžð³¨È] :ÑSI’ßðʃÃÏ„¢,Ú¨¬îÿ zI’6¦A'uVübøyÄé|þ©ì<=$I3ßÔ»ÂÏ…¢,Ú¨®%›§²ý@ô,’$mDå£ßIí]^¦ ®³çëSY¬‰C’¤™ÆÃÔ^¾UøÙP4€E•6óO[%Iõn¼f•_ì aÚ»þh*¾=züH’žltÛùágCÑmTZ÷°?ŽžG’¤ 4ºõ¼T,Ý"ü\æ_{§W¤ñý«£ÇŽ$é)õ¿úŸáçCÑmTÛÒ-RÙ}$z&I’&ÐðªC|Ód®½ã¥ñšoFIÒ÷ÔÙûçÂψ¢!,Ú¨¼á5‡GÏ$IÒ„œ¿cø¹ÌöίLãû®3’¤ï©|ô.Ù9µp,Ú¨¼î‘=—$I¬ægÂÏ`²Ú»½&¼)z¼H’ÖÑðŠÃω¢A,Ú¨¾m_˜ÊþãѳI’4©Ê2õNþHüùLîÛE¹3z²H’ž¥î—þ(ü¬(Ä¢Z^Lôl’$M²rœzǽ/ü|6NgŸŸOe±&z¢H’ž¥²÷X*–¾ ü¼(Ä¢ZðñQIʰñ(õ¾üð3˜›ÎŠ_LeûèI"Izކ×~^ cÑF=,}A*{FÏ(IÒ¼,Ûþ>þœ6H÷ˆw¦Ô/¢'ˆ$éyêó×ágFÑ0mÔÆðêC£g”$i>*ËÔ_ùñðsX?ýÓ>1ûñoIRÅöR{Ù–áçFÑ0mÔÆÌ %I/ÛNûdøY<‡Å›¥Á7öŽž’¤õlô­ÓâÏŽ©æ±h£>–lî= ’”yý³þ+þ¼ž¡½ì%³6IR}êø¡ðó£h ‹6jexùþѳJ’4Ïõ¿úŸáç ð?Ú»oÆkoˆ ’¤ ©§öN¯?Cвh£Vºÿnô¸’$-@ƒs—†Ÿ9À¯îð‰Iª_£Û/ ?CІ²h£^¦7IåcwGÏ,IÒ4¼òàÙwB…Ÿ=ÐD‹7Mýs–øÒIªiýÓ?–L5“Eµ3¸äsÑ3K’´@n:söÝPÑg4I{ÇJ£›¿ýøK’6¢™ýGŸ'ECY´Q;~-zfI’°ñ]—¥öŽ/?  ºþ†OHRÍßsuøyR4˜Eõ3½(•Ü=»$I ØøÁ›RgׯŸA«éMf¿ˆ$‡Ñ»$i#럳8þ\™j.‹6jipá.ѳK’´À•S÷€_?ƒ 7íÝ^“F·žýˆK’&TgÏ×…Ÿ-EƒY´QK}ß=»$Iõ‹Ô=üOÃÏ!ÈÂô¢Ô;ééì?ýdK’&Ôøî+ãÏ—†ë[´QWã5«¢g˜$)¢²Lƒ všý¨[ôYuÕÞéitãÉÑO³$iÂõÏøtøÓt}‹6êªÖGÏ0IR`£OIíå/ ? nzG¿;•í¢aIÒ¤+ËÔÞíÇÂÏ™¦ë[´QW3$•ãèQ&I l¼ö†ÔùÜO…ŸIPí]_F7œýØJ’æ©Ñ톟5´,Ú¨·ÑmçGÏ2IRpeï±Ô;ê/ÃÏ$¨¬Å›¥þiŸ˜}V$IùÖ?å£ñgÉ¢Zëø¡èY&IªÊ{Û¾¶ýìB!úl‚*éô[Þk+IMh|Û“ ·MÃÏ4š¥½Ë«Rÿœ%©lßýH’êÐx”Ú»üHøùEë,ÚÈËÒ¤²óPôÈ“$Õ¼ñšU©wô»ãÏ5ñþµáõǦ4FÿØK’jÔè[§…Ÿa´ÖÉ¢ì .Ý'zæI’2itÇÅ©{Ä;R1½IøùF>Ú;¾<õOûd¯½!úG\’TÓü…`«²,ÚÈNgß·DÏëh=+‹6²ÔÞáe) {ÑóO’Ô€Æw_1û<3gOôùGì¿\ëŸù™4ºýÂèIIRÆï»>üÌ£õœ,ÚÈÖðúc¢g $©I :ixÍa©û…ßIÅô¢ðsy6½(uVüâìÇBÇ|;ú§O’Ôf¾L'ü $=‹6²Õ=ämÑ3P’Ôä/O8{:µwû±ðó Úö…³¿_ .ù\*¹3úÇL’Ô´ÔÞþâÏCÒs±h#_Ó›¤ò‘;¢G¡$©á׬Jýs–xŸJMµwß:õNúpÝxÊì»ù$IŠjxåÁáç"­çeÑFÖçm= %IúnåC·¦Á%{¦î¿>ûBÑç$ÏÔÞáÿ³wïÑ–Öõ}ÇŸá"¢¬ÁDƒ5QSk¢1MLc]¦6±6ÆÔ4¦ÑX›ª±1ÕÕµlcŒ¶+‹330ÃUG¹‰€Ü‘‹À0JEtP@.‚(0€Ž Ãe¸33g?û¾Ÿ_×Þ3À\¾ûüöÞÏëµÖ;ÿ$˵ϙ}ž'¿û²wjŸþÎÔ»úX¯Z`¢ ?² ÷}RÅ3fhÓLW®xiJÕ ÷õ6Sm¼3u¯üLj}ñ?§rùó²ß3ëZù‰—¤ö™ÿ-u¯8* ÖÿÀÿßÀÄ~ùRî{¦Š­ÊЦ™¯ÿ£ r_àé ú£·˜_E5|5•ámL-Þyôí Ã·‚ö¾ÿùÑ+ `´WþMþû¨ÒÖdhÓÌ×:õÏr_`Û z©ûe©»zyjôfÃÛö4·Sj~ê×Rû´wŒ>J¢ÿã SÕÞ˜û_¶YÕÚû?7ÿ½Uik2´iö[¼³/E`êU›î} ÿð‹Z§¼-•ÿRþ{ì„T.Ûcôeí³Þ3ú ¼þO¿“ªÎ|î2ÑýîÙïµ*¶:C›jÑðP³føaýý5çŽîsí3Þ•šŸýÝÙ}õÛâSùÉ_I­þ µÏù£Wûõo<'Uý$¥ªÊýOc3ü؃ì÷a¥­ÍЦZTºÏèm8PUù@ÜqeêýàÔÑÛ&Ûg¿oôM§å¡/N¥»e¿/o±%»¦òÆÂöé™:_û¿©wÕ1©¿öëiðàSêwsÿZ`Áõo[ÿ­´-ÚT›†ÿ­7RÕÞ4¯ë.½µwÍ ©{ÉA©sþGFo¿lŸö£Ï†Ö<æu£·e6xU*W¼,•ŸüÕTðÏŸØ¡/ýzù#ÿ·G¿v4ì=úŸ1üÏk¯ü@ê\ô©{éŠÑôo>/ î¸bô8|vlYûŒÿšý,­b›2´©6µN~Kîk$l•ªqßä¾]é©2´©>Íí”®Í}­€gÔ]}@þs´Ò¶fhS­ê|í㹯•ðôúÝG>[uÎÑ*¶mw0´©N•îR¯•û’ O©wÝ)ÙÏÏ*¶+C›j×ðØ`R5?ûo²ŸUlW†6Õ®ÖñoÌ}Í€-êß¶:û¹YÅvghS-Üs}îk'l¦õ¥?Ï~fV±ÝÚTËÚçþÏÜ×Nx‚ê¡[ScñÎÙÏÌ*¶;C›êÙ~»§ª| ÷5Ó9ïÃùÏËJ;’¡Mµ­ûíƒs_C`¤joLå²=³Ÿ•UìP†6Õ¶ò/IiÐË}-€ÔýΡÙÏÉ*v8C›j]r_K¨»AoôbÜgd;œ¡Mµ®uüs_N¨¹ÞOÏ~>V’¡Mµop÷µ¹¯©ÔXó˜×e?«ÉЦÚ×>çý¹¯©ÔTÿ'g?«ËÐ&-Ý-Uó÷ä¾¶PC­“Þœÿ\¬•¡MÚ·HÝo-Ë}m fw^•ý<¬"4C›´o‘ÊC~9¥~'÷5€iúöìça¡Ú¤ŸÕûÁ—r_c¨‰Á}kRcn§ìga¡Ú¤Ÿ5ü–Xí³Þ“ý¬"•ËöÌ~U1‘Ú¤Àú7Ÿ—ûšÀµ¿üß³Ÿ=ULl†6)°æ‘¿™R5È}Ý` †_„ט[”ýì©bb3´IÁõ®?3÷µ€hÕ`ô‘A¹Ïœ*&:C›\óðW¦4è羨÷½ã³Ÿ7UL|†6i õ®>.÷=€ U{c*~aö³¦Š‰ÏÐ&¡ò¥ª3Ÿû^@€Îù—ýœ©b*2´Icªsñ’Ü÷vÐ`ýRcÉ®ÙϘ*¦"C›4®öÛ=UïÈ}O`G¾áØ×ç?_*MK†6iŒµW~ ÷m€íÔ½â¨ìçJS•¡Mg‹wNƒ{~˜ûÞÀ6ªæ×§rùóòŸ+•¦)C›4æZŸkîûÛ¨}ú;³Ÿ'UL]†6i꯽(÷=€­Ô¿åüìçHS™¡MZ€šGýÖèC4˜pfî IDATÝf*W¼,û9RÅTÖùÆÜèiT4|Aö#Ír½kOÎ}»àt¾þÿ²ŸULmÝo-=ŠÆ!ûd0Ò,WºOJÝ2÷=€§0¸÷†ÔX²kö󣊩­ûOŒžK…—EJ㯻zyîû[RU©uܲŸULuÝË=Šò°Wf0Ò¬W.Û#U›îÊ}ûàIzW}6û™QÅÔ×ûÞñ£çSQõ¯³?©µ¿üW¹ï8zní‹öÍþ`¤:UðüT•侯ԓ·Œjߨ†£í£ŠîUÇf@Rݾ’€…×»ú¸ìgB3Uó¨ßzìùUô~üµìHª]s;¥ÁWe½¹ÔMµñÎT.^þ3¡Ò,Õ:õí=ÇŠþ?Êþ€¤:Ö:î £—,°0ZŸkö³ Š™«sÁG{Ž©×Iós;ePRë]wJÖ› @]ô®91ûPÅLÖ»öäÇžgÅð”Ÿ~Eö%Õ±ò¥ª½)ç½`æy˨clp×5OÚZ§½#ûƒ’êZçÂå¼ßÌþ·Œžôæìg?³Ùâ]R굞8´u¾¹þ&Õµ%»¦Á=?ÌyÛ˜YÝKWä?÷)ÍjÍ#_ý„çÛhhë­97û“ê\óØ×§T rÝwfÒðE ¥»e?ó©˜ÙÚ«>¸ùÐ6ØtOö&Õ½î•Gçº÷Ìž^;5zMö³žŠ™®÷ý/l>´ •+^žýÁIu®\¶çè:Øqó?’ýœ§b櫺uËC[ë¬÷fpRÝkŸöŽ÷€™Ò_{QjÌ-Ê~ÆS1Ó•Ÿø›=÷ÚºW—ýJ*Rÿæ¯.ô=`fTÍSyè>ÙÏv*f¾ö¹ûÔCÛàáuÙ ¤á"þ’Tuæú^0Úg¼+û¹NE-êßxÎSmCåa¯Ìþ %©sÁß/ä}`&ô®=)ûyNE=Z²kªZž~hkŸÿ÷ù¨¤ÔX¼sÜuÍBÞ¦ÚðCé‡_2—ý<§T‡Z'½y‹ÏÃ' m½µg ’©yôkSôêž0½úÔ<æuÙÏq*jSï{Ÿ{æ¡mx¨oô‹Ù¬¤Gê^öéº+L¯ÎùÉ~~S¾m´ùàV m÷®úPþ,iT¹ÿ?KÕÃ?]ˆûÀTêß´*5æe?¿©>µNùOOù|Ülhëݺ:û–ôóZ'¾)¥ª÷½ `êTÖ¥òÀ_È~nS½ê]ÆÖmi0HCöÉþ %ý¼î•Gùö0eúÝÔ<ößf?¯©^•½`ô™€[?´ ß>ú¹ì\ÒãÚÿ¹iðàÇy‹˜* >šÿ¬¦ÚÕ¹ðcOû¼ÜâÐ6xx]šŸÛ)ûƒ—ôóZ'ü¡·Œ>—í+>—MiÁ›[”÷ß²íCÛPó ’ÿô„ºW9Ž{À”}.ÛÞÙÏgª_­/þé3>?ŸrhëÝrAö@Ò–ÞBº6ú>0EŸËöúüg3Õ²þm«·h¾E­<âÕÙIO¬uüSªÁw+€É7ü|¬Üg2Õ³æ1¯ÛªçèSm)¥î5'eÿA$m^÷òâîSS¡ã9>—M)Wý5+w|hK½Nj²OöFÒ“Úï9iðÀ‚nW“mpßšT.Û#ÿYLµ¬yôk·úË ‹g|YæŸÉþIÚ¼áç¤A?âž0±ªö¦Ô<â7²ŸÁTßú?º`«Ÿ¯Ï8´^ÕöÉ_ÍþCIڼÜÁ[À«ªÔ:õíÙÏ^ªo­ãÞ°MOÙgÚ|V›4¹-}vÜsýöÞ²&Zwõòüç.Õ·¹EipÇñCÛðíiå¯ÊÿJڬ摯N©×ÚÎÛÀdêßr~jÌí”ýÌ¥úÖ>û}Ûü¼Ýº¡møÒµgÿ%m¹ÎyÞæ?~€IU=|[*ü…ìg-Õ·rÙ©Út÷ø†¶¡¦÷EK“ÙÜ¢Ô¿ù¼m¾LœN#5zMþs–j]÷²Om×Ów›†¶Áƒ?IóKŸý‡•´yåA¿˜ªùõÛu!˜í3ßý|¥z×<æ÷F£6ö¡m¨sÉ!Ù`I[®uò[FßÊ0º—®È~®RÍ[ò¬4¸ç‡ÛýÞæ¡-õ{©üÌïäÿÁ%…¾¼ û—,Þ9û™Jõ®ûÍ¥;ô<.¶ëÉ÷ui~ñ.ÙxI[héni°þºº0,¤Á½7¤rÙžùÏSªuÍc_ŸÒ ·ðCÛPç[˲ÿ$m¹æá¿žR·Ü¡‹ÀB¨ÊRóS/Ï~ŽR½+—‡nÝáçóvmi0HÍϽ1û/BÒ–k¯úÐ_ ƪ×N­ãÞýü$õ~ð¥§ôömíméqÀó³ÿ2$m¹þšsC.áª*µÏzOös“Ô9ïÃaOëÚ†zkV¥ù}eÿ¥HÚ¼òÀ½Sµa]ÌÕ PwõÙÏLRësÿ.¥~wr†¶¡ö7gÿÅHzšs ¼hì¨Þ g¥Æœí¨ÈZyè>©š_úÜ.¢^îÙ:õϳÿ‚$m¹Î?ýŸ?u€5¸ûÚÔØÿ¹ÙÏIªwå²=FÏÅh1CÛpkkmHå¯Êþ‹’´åzןõç°]ªw¦ò_Î~>RÍ[²kêÿøÂ±<ÇÆ¶¡ÁÃëRÃŒ4‘•ËöLƒûo‰ü“ØjU{Sj~æ·³ŸTóæ¥Þ5'Œíy:´ õ×_ŸËöÊÿ‹“´YÍ#_R·Œþ³xzýnjü–ìg"©ûíCÆúTÚ†zk/NóKŸý—'ióÚg¿oö[VU©}Ö{³Ÿ…¤îêåcºehêÝrAš_ò¬ì¿DI›×ûÞçÆõ§ð‹þ1ûHê|cnAžïcÚ†z7®Ló‹wÉþË”ô¤–>{,ß®ðx½«>›ÿü£z7·(u¿}ð‚=çÇ:´ õnúª·‘JXùÉ_IUóÁq_€šêßüÕÔðâí›yd»ü°}Þ}hê­½(5ö{nþ_°¤'Ô:õí£ÏKˆ4Xwyjì·{ö3jÜÒg§Þõg,øsA†¶¡þíßMžŸÿ-é -äKh€Ù7¸ÿ–T¸wö³Žê[yÐ Rÿö˲<ÿlhêßÿ£T~êײÿÂ%=®¹Rÿ–ZÈK0£ªùõ©\ñÒüçÕ¶æá¿žª‡~’ío`A‡¶¡AãÔ<î÷³ÿâ%ý¼rù^ipßš…¾3¤joLÍ£'ûùFõ­}Ú;RÕÞ”õï`Á‡¶‘n;µV~ û?€¤Ÿ×üô¿LUó¡,—`Êu›©uü³ŸkTÓï’º—®˜ˆÏ Ï3´ýL÷š“|#©4AµNþ£”ýœ—`Úô;©õ…?É~žQ=+W¼4Ûç±MÜÐ6Ô¿ëû>·Mš :ç$÷e˜ƒ~jŸþ—ÙÏ1ªgí³ß7zËò$É>´´©µòo³ÿIz¤Þ5'æ¾*“®ªR{åßd?¿¨~•ÿRêÝðå4‰&chû™ÞšU©qà ²ÿƒIµoéni°îòÜ—`‚ ß “ýì¢z5·h4îNòç‹OÔÐöè·’¶ÎzošÏý'Õ¼òà¦jã¹/ Àê~siö3‹êUóˆW¥þm«Ó¤›¸¡íQ½[/Iåaÿ*û?¤T皟ù픺eîË0AºW™ý¬¢úTðüÔ½ü°”½4 &vhé¶Rç’ƒRcÿ=²ÿÃJu­}æ»'â+’€üzל0zû^îsŠjÐ~ÏI ÿ!U­‡Ó4™ì¡íg›îI­•Hós;åÿ‡–jX÷›ûå¾ ™õ®?#5ïœý|¢o¿ÝSçü¿KÕüú4¦bh{TÿÞ›RëŒw§ù}­çÒ‚6·(õ®=9÷%Èdø Å»ä?›hf+—ï•:~,U›îNÓlª†¶Gõï¹1µN—W¸I Ù’]SíE¹ÿü€Ö»á¬Ñy û™D3Y¹â¥£Ï`«Ú›Ò,˜Ê¡íQƒ‡nKí ?žËöÊþÄêP¹l4X]î?}`ôn<ÛȦø–<+µNy[ê]fJýnš%S=´=ªjmHË>Ê#^•ÿÉ"Íxå¡/NÕÆ;sÿÙcÖ_³ÒȦ¸æ¥ÖqoHÝËOUyšU31´=^Ý£/Nð*7i|5zMªÚsÿ¹cÒ_sîèUG¹Ïšò–ìšZÇÿûÔ½ìÓ©ÚxGªƒ™ÚÓë¤ÞM_M­/¿Çè&¡ÖIÿqæ^â ¤Ô¿i•‘MÛ]ó°W¤öª¦þçÔò³;´=yt[{Qj_ð©<ò7³?é¤Y©}ö_§TU¹ÿ€ ý›¿jdÓVW¸wjø¦Ñ·…_Y5îMuW¡íIïJÝž‘ÚçýïTý»i~nçìONiZë\¼$÷Ÿ4 óy©±t·ìg MPKvMåÁ/LÍ£_›Ú§ýEê\ðÑÔ½âÈÔ_ûõ4Øtwî§ìDªåж™N3õï¸:u¿wBjŸÿ‘Ô<ñÍ©\ñ²4¿x—üOjiÒ›[”zל˜û¯ØU5zËèð[ U¯†¯D믽è‘Ö}7õï¼: \›­ ¹Ÿ•SÉÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐ mÀÐÀÿoÇŽ `ùW݉XNÁømmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmϤ<IDATmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm°¿‘Ò¨Ñä€Ó…IEND®B`‚‰PNG  IHDR\r¨f pHYsèèµ{RkIDATxœíy”UՕƨhÔ8à˜ØºÔ8²bk‡tÔ8ᬉi§t:±…D»ç,;­i‘˜ d²¤€JF¡ÀÄ"ó$ó  Ìó$2Ÿ;¼;í^ç–‚XUõî½ûÜû¾ßZß_¬U¼wöù¾w‡söI¥k¨<·±9á¥Vúð'æèýoß©õl¢i]/³D—K#“Öí Ë^W¾ƒˆ6@PP2ǵ<å<Ä ]/³¤õþwì0†?9Ûœðò[4-ïœÀ¯—ÿïCúà‡V‹vgy¢uŠØ”w Ù_Œ"Ç6Èx/ßÜJíÎö´’‡WåoÞŸ±ñÍò·®Ó=°Fä4äÿbyÈYý÷4 ÆK!½èVþ¹„rO"½äá/õi¹WÕÏü^þ›(¸Èeÿ"GÍ_Æ=?@àI/lÊ?çƒRÇó]sâ«oÕÍü£Ÿ*‘ Âþá¥ÚüˆœuåÜódžØCZ·+ùç~PÊ=™Ì²–ƒke~£´ù‡ìø;åBΚ‰Üód!î׫Ik¿‚RN2Ç¿Xs¤Ç½ÐF‰ûýo?°½d÷<YŒ³þSÿ×“Ý A)ï2'·z£Jó[“þ¯©h.ïSþïɚё»þ½ /»U矺æ‚Âk+_ú7ÛÆþá¾UzÂ+Üuà(éO^g÷D2Fþ~Íñ—þ_F™7ìQ"×96úpãÚd ¸“Ý®§YÐ÷wÇ~ýܹ] ó÷»Í_€jx‡wÖéBvæµQO}UñÊïÓÖWË÷ìÜH+¸˜¼CÛ¹ë @µ8§ú l¸½ˆ .öh׺ SæØgû+ñºoóÌêGE°¦æó›7 Y ŠÞNéƒXËþA>ïÃ]Wj‡ç&cÏ@ë™å››Òz5¬bôÖräPïÐvÒ:œËnàŒ½7¦Å®”èИm½¿þÞ¿Y:w=¨3öâìÎTÆÐGÍÛÀ6§“»wMÝGE0†?ÎnâŒ~€‡üÖMqýçÖü÷¸ë@Fx‡w’ÖñÇ@ß¿4‚ˆAkè e/Êÿ¾½ãyìã ²!œÍ3#/v\0?È^`iÏ÷o}ÂBv›’«(­éÈö˜ëÁýEV€lþÕ`U"kp—Sé_ h íŠWpKKÈ,{>¶ïÛE@¶•UcŽ}–½¸¬Ê=‰ÜÝ+êu)o1 ÷í­cæè§C1O–„Š6§³—[ò”ÜÇéðNÜ··ŽqX³ß‰ÌTqšӽ°ªH.¨‘xæ!¿½™5£“ßÄTëòOìŸ Jeß^t+{aU‘ÜîŒûöT2@ö™Ç#ûîgûâ(•àißpûM9d¯~î¢B=ÚžÁí5%Qý0HA€¼¯ñèýA"èÀ Uày‰Þ: ¥§z€Yö·Ý”C¾×æ.(‰(@6Kñ8ÿ ‚DÐ ‚ãqVÄ^P‘ÀÜžÜ~S{q1{A!HD²A"8Ù» $" €•¥Ü~Skz{ö‚Bˆ"œõŸrûM9ä®6î‚Bˆ"pPe¬©ùì… Q!WÈš[€-³¹ý¦òÕ(wA!HD›gqûM9’~ú”Jœ2tþ!ö‚¾ì… IÄ𨰱— a/(‰H`ã4n¿)‡óå8ö‚Bˆ$6|Æí7åp¶Ìa/(‰H`u·ß”ÃÝ·Ž½ $"Y ¼´„ÛoÊ!¬â.(‰HvÎëÅí7õð<yØ‹ A"ô˜ÞžÛnJ¢½s9{Q!H„ßèïÜ^S£ønö¢B½'ุ½¦$æØgØ‹ A"ôõ'n¯)‰5­-{Q!H„Þü'¿f+öÒØ‹ A"ôƒAz^Çí5%‘{$¸‹ A"ìÐÚÅí5%ñne/*‰HMáö›zx.‰üSÙ A"ôãÁ¿YËm7%Ñ»_Å^Xa€³i:·×”Ät{a!H„öŠÜ^Syn"wa!H„ÖÌn¯) ZƒA"À,{žÛkJâ¬+g/,‰°Àx/·×”Ä;´½°$¹ó TÖ¡1{q!H„"÷$"'Íí5%1úÝÆ^\¡ÖT‹9®%{q!H„ÎÚp{MIdÇ$îâB;¬¹=¹½¦$ÎÆ©ìÅ… v 1HÕxb{q!H„Fÿ;¸½¦,Z§ Ø A"ÌÐ:žÇí3e1Š›±‚D˜ åÙÍí5%IOx™½À$ÂgÃn¯)‰5¿½À$ÂR5ΖÙì† vÈE/ 2²c’\-É]da€Þ÷fn¯)‹Þ« {‘!H„"ÿ4"Çâöš’˜¥-Ø‹ A"Ô{v¯àöš’È•’ÜE† vØKs{MIð Ùé‰åöššX‰Ü“Ù A"ÌÀ’àêÑ{ÿœ½Ð$ ­í™þ¡ 2æ˜?³‚D˜ åîýŠÛkJ‚ÞȆ°—çöš’¸[粂DØ.ƒÛkj‚Pë,´ ¯½÷ ìņ fhÎ%ò·×”Eër {ñ!(Ô0>ø ·Ï”Åñ{L@ˆZÇóÐ"¬¬ÙÝØ‹A¡€”»o=·×”­Â!‘ `/Æí55±MmNgŸP*«zÈwÞ jŒA÷±O(•Õ =ô¢[¸}¦,ÖôìJeµB‘*‘“æöš’ S0$2”ÖõR2GÃ=NÊâüÕ_ÜIö}{r›ÔZõ\Piè=®å'¥1Š›±›&Ö÷íÅwSzÒßÉ^5†¼CÛ(›°ê¹³4ÒÀ‚ š±ætg7Rl^Á6¥ôøÉ^2(Ò÷íª’.# }5{¬”E¶Oc7W ¤þ‚»TÊaŽ}6žÜŠ{¬”F®$ã6˜êB·éÊÃGÈû4P=ò–Û`ªKþÚ`žE¢í~# P5ΖÙìS]éÉos—I9ô>7Æ$ä‚ ‹¸ÇK]\‡´N°›LeYózqWI9´®—Å'ä;KP=昿°›LeÉvXà{xn½×°€lƒªG.Zá6™Êrw,æ.‘Rx‡¶×ß‹ mà9@ 8–¬·Ñ”TNC"Kã®PbN™b )ÿ4¨s\K~³)(½ûϸK£ò–(v`ÍìÌ=nJãlšÁn6e~øGîÒ$ª±,[%q›ú½ß¹œÝpªIîâÇ“žø×ø€ÖöLÿ^T5­-»áT™©Œ1øø€_Ì­s«ø:à;¼Ã;ýF“ܦSEòÁ¨\'ŽGërI<@na5c ý7vã©"Ù€gôwÙÆ2äñØ fd;unã©"{åhîr$ê {ˆ6§Ù&÷&vw’¤µ?;1í»‚¤¾'©²?À¦éH±³[²ù¨Œì\ëÛ_Á °ÍŒô$Aò EP½è–x€Þ矫øZà‡Xóßc7!—ä$U`›$òOwHy·TõõÀ÷t»‚ÝŒr6Ïä}%q·Î $\ÙçÔ{Ùv3F-ÙÖT\™ˆ§ã‚Zàyd ¸“Ý”‘)¯¹{×pº²È}‰{°mpg,pw.ÍšÕé)¹Üíöy’<V"¤Ð.¼öÈ“n¸ë¶ô¾7c¯H Ès6ƒge^ë€c‘Þ÷Wì5 KZ‡Æx0Ñ!2Ê@ÅFt ª-ÞÁ­Élšžú×¹>Q ålœV›ï¾E®¢Ìô=°RÊ=‰œUc¹‡U}lÃ_FŸ¸Hü*÷ÐÆ{e©oîÚe¬üSÉ^1’{8c³nR`ã®TÈ㜱߻î8«ËüKgîúÕ»îmÏô'5¨fÙóÉ )gýäZ¨ô«Ðö öúÕUzïŸWœî êppÌ…É ¼ Èlo¸Vp{ ë´Ã[|넳aJ 5P.´öç`QP†mÄŒ÷°×±&é½oð'2¨;24RòÁÈÏ%kF'ån ´‚‹Éš_ˆç<™\þ|…§dë÷cx‡wTœ3˜Óµžz¯&d/€îO §dȃå¥,w÷ŠŠ'Ç^È[9sì3u={BƒX5@v žÑ‘{¼ÙAV­m7«÷i²':¶Ëüè¿ý×’øµáÐ6)Z·+ñË"žyˆìUc(=áe?´Žç×¾>9 üóèA÷û‹·ì¥%X»2Öôö¡øLÙš€hñ´½än_è» {É ²ù+ôœ¯>ö—»»–¥÷G;câº]‘}`Žü÷ÐÀŽ ã°<¦tÈ{\Z‚lG/º5KÀoþ&÷øØcâ•­ÝYþ+²cÈ#ÙRÖÜžÜu rÜ=«2:ø31 Ÿ€bù(È6Œá‡î­X€”½bw=ˆ ù:6ì_ÿX€Þã\€¬Áxo$¾ŠMHÙˇq׀Б ±¢òT¬@ïq-®@²qÒ ¨Nò|<’Šñ)б “vš≯Iëp.àD²fvæ®#ûaFí¥Šaoxè«ì¾0ál™Ék¿J0ì17%ÚŸír›º®’'H–æ?àæð‘1úi#¥½{µà6t•ÓÜ‹¸K@Ƥ'¼Âæ£ô¤7¶¦ô~w¬e7t=¤÷ûµß,€X¿óωþÒÿ;Y ŠÊSƈ'ûr›¹Þ_…@LñŒ¤u½”Ï?yÈ9°éÙ”Qrï5q=`Rž+çØÄ]Kê†ç‘9âIVïèC‘—Ïç¤$zŸ›¶q›¹¾’Í)Ñ@Ä kNwvߨ Šføæ÷ ä7͹?PF_fñ@îšP+œ-³CiË^é}n$J§oL}­÷ [¸œÉÚwߺÚU&<±‡´.—ðú%§Yˆ}’ú!bÐ]7‰6§ÇnMÀÑT+lŠeÂ@]lƒŒþ·³ûÄû¬ìë~~¥ðoÝ÷6÷ÌD鉯q—€ªú}øGvhïÿÊ£ƒ[îKÕ„Ñÿޏ?h½•Ó€œÕUQøHOnÅî ­gÏÙ±è¹Íôy@ÿÛp.PÈè‹vhLÞþ Ü5ÀGžŒÌí ½ß¯]gç’µ2ÿÑ+Í^íÎv¸?|½¾pÏëý…pb¯, åPÏZ+÷$2'¼ò ÜÙ4UôM.Ó ¹˜ûŒùz¯pmî9²ç« þj;¶Áâ{l{eé{DtZ*S´¢›oÖûÞ<_´9#VW渖Üód!ÎúOIäŸù|× ."£´Å>{ÙÐÞDtn*hèõÔô·7׋›× ›®ÕÞýÙ>­ó%š(ø‰®ª¬ù…+ˆH5 A¡ËÕ÷O5JŸÞb r{Ø2K[l4Ëžûœ’7ÞZ>¬]¸éŠšÿ! €±Ô6âæIEND®B`‚‰PNG  IHDR „e^Q pHYsèèµ{Rk IDATxœìÝy´eu}çïT!8Å¡£ÆãÒ&1‰m¢­&JFIbL´3™61ÚI'ñ—Øvüu'·nóL"ó$ƒ(ƒ$XÈX* …R€ “@EÉPÅÙgÞûÓëÞJ"*CUÝásÎù>ÏZ¯Õÿ¤×êΞ؛7÷üPPœºý@ n»8z_:$:g~0ÚG¼)Z{½(ZSK¢õÏ?$-hÕþ/æ[³/à1 ®9>ZSKÓß$ma3ßsözQ´|óìwž™ï=ƒÛ/™ýþ@™~(ûÿ,°ºŽáúë£ÕQÑùÌû£:ðÕù*Ulíƒ^ÍÆ»³¯ à ®:Ò4$M@ÕÊ×Ì~ê_}L ×ß}k`‘„L¢îÃ1¸áìÙÿ*´µÏ¦|”fjúúhZ÷e_À\}”Q˜4iíñüè|ꢿæxA `‚„Lˆºµ!úWícÞ­eOÊÿÀ(=¢ö‘oЦó`öel¥þåû§¿OHZ –=)ÚÇî4ûWåëê;Ù·æ‘AÀ8ë·£íIÑ>î׌À4²uŽ}GD¯•}µÛ¨Ééï’¸éí£}ÂoFÿë§F ºÙ·æÈ ` ïûFt?ÿÑÚãyù ¥Ç©sâ;g‡‹Àxë­šN¿´HíöìèœùÁÞûõì[ÛÈ `Œ n¿4ÚŸ|g´¦–䔞 î§ÿ0bØÏ¾l€yÒ»ðÿ¦¿gHZÜÚG¼)7œQ×Ù· ¶‚AÀ¨ö£¿æø¨y]úG@iKëžù—õ0ûêæYï¼Hß´øU‡þ\ô¿ö©ˆÆ0 `„Œªzý¯:ª_•þÑOÚšzŸû›ˆ¦É¾‚€…Ð4³ÿÌŸýÞ!)§ê Ÿœý^å/†Œ6ƒ0€4¸þ̨Ú1ý#Ÿ´µõV-˾|€…Ö4Ñ=óéï’òª}} ¾yAöÝ€Ç`0B†ëoˆöñ¿‘þQOÚꦖDÿ²}³/!`±4utO}oþ»ˆ¤ÔÚǾ#†ß^›}Gàû„Œ€ºº?ºgÿU´–m—þ!OÚꦖÆàÊó/#`± ºÑ9öùï$’r›Þ!ºç4¢ûpö] €clpÃÙÑÚû%ùï¤mýË`_94û2²ô«hù¦üwIùíû²Üüùì»ayêë¢sòï嬓æ4ûDö¥$kª Ñ>èµùï(’ò›Z3þûì_à A@‚ÁõŸÖîÏÍÿH'Íe öåC²/%`D4ïŽj¿—å¿«Hö|a n>?ûÖP,ƒ0€ÅÔ«¢û/—ÿQNšëlõAÙW0bêïÜÕ^/Ìg‘4M-™ýÃ^öí  8a‹døíµQ­|MþÇ8iŽõ¯80ûrFT}÷•QíúŒô÷I£Suø£~èÎìÛ@Q ÂÁà†³¢µë3Ó?ÀIs­ÉžÙ—0↷]­åOI‘4BíþÜÜraöí  a ©D÷üÎþ‰üôoÒë_¶OöŒ‰ÁÚ3¢µl»ô÷I#ÔôöÑ[}Pöí  a ¥ûp´OüíümÒ<Ô¿x·ì+ 3ƒkŽ÷HIú:Ÿý@İŸ}‹˜ha  ÞtOTŸøùôlÒ|d l«þwM§‘4zµOúˆ^+û0± ÂæÙð¾oDkßKÿ°&ÍGý‹Vd_RÀ˜ëžùôwI£WuØ¢iߟ}‹˜Haóh¸þúhíõ¢ôjÒ|Ô[5}I“`ØÎñ¿žþŽ#iôªúɨ7®Ë¾KLƒ0€y2¼ûêhíþÜôiÒ|Ôûüÿ Òt7EûПMב4zU¾:ê‡îʾMLƒ0€y0¼ë+ÑÚõ™éФù¨wÁDz/)`5ïŠjŸMç‘4zU¼Ò_ ˜Gas4¼÷kÑÚý9éΤù¨û™÷G4MöeL¨zýÚ¨v{vú»¤Ñ«:ø§¢nmȾMLƒ0€9n¸)Z{ýHú3i>êœò{õ0û²&Üð¶‹¢5½Cú;¤Ñ«:ì ³?1 ÀÜ„l£fãÝÑòSš:Çÿzİ—}Y…\}tú{¤Ñ¬}ìNß(æÂ `ÔÝMQ}ügÒ?IóQûð7FÓ{8û² Ó»ðŸÒ߇$fÏüyö- `¬„l­zí;ýØ4µy]4íû³¯* DMÝ3þ,ý½HÒhÖ»tïì»ÀØ2ØJÝÏýmú1i>jðŠh¾7û’J6ìEç˜_N?’4‚M-Á ggߥƒAÀVè_sBþÇ0iªö~q4Ü–}IDÓ~ Ú+_“þž$iôªvÿOQßKöm `ì„l¡úÞ5ÑZñ´ôaÒ\«v{vÔ÷¬É¾¤þC½á¦ÙáGöû’¤Ñ«:äu½Vöm `¬„lºý@´öûñô`Ò\«vùá¨ïüRö%ð†ß¼ ZËž”þÞ$iôê|öÙ·(€±b°:Ÿþ£ô_Òœ›Þ!†7ŸŸ}9<¦þê•ùïN’F²þ×?}‹aO Í 鼤9·l»\çÃ)0úºg}(ÿJÒÈUíñ¼¨7Ý“}‹ a£¾ÿÖhíòŒô^ÒœšZƒ«Î¾œ¶Ì°£Þ’ÿ.%iäjò·²ïPcÁ à±Ôu´ù•ô]Ò\ë_ºwöÕ°UšÖ}Qí÷ãéïS’F¯þšOfߢFžAÀcè_uTú.i®ÍüÔ À8ª×_Õ®ÏL¯’4‚?Ùº/û0Ò ÂE½éžhíöìô\Ò\êÌüŒB=Ⱦœ¶Ùð†3£5µ4ýýJÒhÕùì²oO#Í àQtN}oú‡-i.µ?ñó½Vö¥0gý‹wKÇ’4bM-‰Á—gßžF–AÀ÷™ù˜4óQ)ýÖ´Uû¼$šwe_Jó£i¢{Ú§¿kI­Ú‡¿1¢®³ïP#É à‘êaT‡¾>ýƒ–´­U»=;êõk³¯$€ùÕoÏþ%äìw.I£Uÿk§dßF’AÀ#ô¯:*ýC–´ÍMïÃ[We_F ¢yè[Qíñ¼üw/I#SµßÏFø^aÿ®ßŽÖÞ/Iÿ%mSSKbpÍñÙWÀ‚Þú…h-Û.ÿLÒÈÔûÒÁÙ·&€‘cðoz—þKÚÖú­È¾„EÿâÝÒßÁ$NÕÞ/ŠèUÙ·&€‘b0£ûp´ö|Aú,i[êžöÇM“},ަ‰î)ïN“4:õ¾üñì;ÀH1˜ùë`—íþáJÚ–:Çí1ìg_B‹ªé<í^™þN&i4ªö}iÄ —}kaƒ^´ö~Iú‡+ikk¼ãì¿(Qýí¯Gk—§§¿›Iúמœ}[a@ñú_=6ýƒ•´µU{¿(šïȾ|R ¾vJúû™¤Ñ¨}Ø/dß’F†AP¼êŸNÿ`%mU+žõ]_ɾtFBïs›ÿž&i$~kuö- `$„EÜraú‡*i«šZÃÏξtFǰí#~)ÿ}MRzÝÓÿ$ûŽ0 €¢u>õ骤­©ñîÙ— ÀÈi¾7ª½_”þÎ&)¹Oºý@ö- AP¬ºu_´–?9ÿC•´…uOywDÓd_:#iø­+¢5½}ú»›¤ÜúW™};Hg«wéÞ騤-­}èë#úUöe0Òú—í“þþ&)·ÎQÿ5ûVÎ (Vµòµé¨¤-©ÚóÑ<ô­ìK`ô5MtNøÍô÷8I‰M-‰úÛ²ïF© €" ï¹6ÿã”´%MoÃÛ/ξdÆFÓº/ª½_œÿ>')­þdߊR„EêþëÿMÿ0%mIƒ+Ͼ\ÆÎÌXÓZ¶]ú;¤œ:G½%û6Ê (RuÀ+Ó?LIOTïs“}©Œ­Þªeéïu’’šZõ¦{²oCi €â ïýzþG)é êóËÃ~öå0¾êatŽ~[úû¤œ×—}Hc§wÉ^餤ǫÚïeÑ´î˾TÆ^³ñî¨öx^ú{ž¤Å¯{úŸf߂҄ÅióË餤ÇlÅS£^wuöe01†7­©%ùï{’µjïEÔuö- …AP”º»)ZËŸœþAJzÔ¦–ÄàºOg_&§wþGòßù$-zÃõ×gß~R„EÜø¹ôQÒcÕ[µ,û˜LÃ^´{Cú{Ÿ¤ÅmpåaÙw€a@Qº|,ýC”ôhuN~WDãg JóÀ­Qíö¬ô÷?I‹W÷³‘}ëHa¥}Ô[Ò?DIß_{åk¢énʾ<&ÞàºO§¿JZ¼Ú‡¼.û¶ (Ç ­OMÿ%}O+žõ·¿ž}u£{Ö‡òß%-N˶‹è>œ}ÛXta@1†w]™ÿJú¾×Ÿ}i”¥×ŠöÊW§¿JZœ†ßº"û®°è €bô¯:2ý”ôȺg}0û²(R½îêhMoŸþ^(iá|õØì[À¢3ŠÑýÜߦ€’þ½öÇ:¢ßξ,ŠÕ[5þn(iáë]ð±ìÛ À¢3ŠÑ>ê­é ¤™ª]Ÿõ†od_e«Ñ>âÓß%-l“ß•}·Xta@1Z»?7ý”ÔšZƒë?“}90³ ÛpS´vyzþ»¢¤«}ðŽÙ·€Eg¡îlLÿø$ÍÔ;ÿ#Ù—0¸ò°ôwEI WµÛ³²o3‹Î (B}ïšôORûð7F {Ù—ß§sâÎé®¦÷pöm`Q„E\fú‡'•]µûs¢yðŽìK€GÑ´î‹j¯¦¿;JZ˜êïÜœ}›XTa@zW¬Lÿ𤂛ZÃo~>û2àq oð“I“ÚðöK²o1‹Ê (B÷‚ÿ?ýÓʭ·j:û` t?ûéï’æ¿ággß^•AP„Ι™þáIeÖ9æW"êaö%À–èµ¢}à«Òß%%Íoƒ¯œ}wXTa@:'ÿ^ú‡'•Wµ×Dóð½Ù§?[aø­+¢µl»ôwJIó×àª#²o-‹Ê (Bûè·¥xRa-Û.†w\š}ê° zücþ{¥¤y«ù~Ù·€Ee¡:ôõéžTV½/üsöiÀ¶t¢}ÐkÓß-%ÍOýKöȾ«,*ƒ0 ÕA;¦xR9µû…ˆa?û´`ê;¿ä§#¥ ©ÉžÙ·€Ee¡:à•éžTFÕ.?õ†›²OyæAï¼HÏ”4÷ú—î•};XTa@Zû¼4ýÓÊh°æ„ìÓ€ùÒ¯¢}à«Òß5%Í­þ¥{gßM•AP„Ö^?’þáI“_÷Óÿ-ûT`ž o¿$ZSKÓß9%m{a@i €"„i¡«öùÑhÚ÷gŸê,€Þçþ&ý½SÒ¶g”Æ (‚A˜´©¥1¼í¢ìÓ€…ÒkEû€Wä¿JÚ¦ €Ò„E0ÓBÖ»ðŸ²OqØÌÔšZ’þ*ië3JcÁ L Uû°_ˆö³OqA÷¬¥¿‡JÚú €Ò„E0Ó‚´ËÓ£ÞpSöé À"iº£Ú÷ÇòßG%mUa@i €"„i!\s\ö© À"Þú?)Ya@i €"„i¾ë~ê÷³Ok’t?óþô÷RI[žAPƒ0 ašÏª}_MûìÓ€$3ï„Õ^/L?•´e„¥1Š`¦ykji o]•}JlpíIù晴¶(ƒ0 4a@ Â4_õ>ÿÑìÓ€Ñ9n§ô÷TIOœAPƒ0 ašÚ+_ÑogŸÎŒˆúþoFkùSÒßW%=~a@i €"„i^~*òŽË²OeFLÿ‹»ä¿³JzÜ Â€Ò„E0Ó\ëÿ¿²OcFѰíƒ~2ý½UÒcg”Æ (‚A˜æR{å«ýT$ixû%ÑšZ’þþ*éÑ3JcÁ Lsû©ÈK³OaF\÷3ïχ•ô¨„¥1Š`¦m­wþG²O_Æ@S}'ª=ŸŸþ+é3JcÁ LÛRµÿODôZÙ§/cbðÕcÓße%ý`a@i €"„i«óS‘l­¦‰Î±oϧ•ô=„¥1Š`¦­­wÞ?dŸ¶Œ¡zÃMÑZþäô÷ZIßÍ (APƒ0míOE6½‡³O[ÆTï ÿœþn+黄¥1Š`¦-ÎOE0WƒN´xEþ;®¤Ù €Ò„E0Ó–Ö;ïï³OW&ÀðƳÓßq%mÎ (APƒ0mIÕþ/÷S‘̛Π¿™þ®+É (APƒ0mÑOEÞ~Iö© À©7|#ZÓ;ä¿óJ…g”Æ (‚A˜ž¨Þçþ&û4`õ>ÿÑôw^©ô €Ò„E0ÓãUíýâh:fŸ¦L ¦»iö½3ûÝW*9ƒ0 4a@ Âôx o8+û`‚ Öœþî+•œAPƒ0 az¬º§¾7ûô`Ò5MtŽzKú;°Tja@i €"„éѪv{V4›ÖeŸž ^÷Õh-Û.ý]X*1ƒ0 4a@ Âôh ¾zLö© @Aºg}0ý]X*1ƒ0 4a@ ÂôýuŽ~ÛìOvÀbiªïDµÇsÓ߉¥Ò2JcÁ LßÓŠ§F}ÿ7³OK Ô_}Pþ{±TXa@i €"„é‘õ/Ù#û” Tõ Ú‡üçôwc©¤ €Ò„E0Ó¿×^ùêˆA7û” `Ã;.ÖÔ’ôwd©” €Ò„E0Ó¿7¼uUöéÑ9å÷Òß‘¥R2JcÁ L3uOÿ“ìSfÕ÷ß­éÒß•¥2JcÁ LծόfÓºìSþCï_þ.ý}Y*!ƒ0 4a@ ÂÔÿÒÁÙ§!|¦}T»?'ýYšô €Ò„E0+»öÇ:¢dŸ†ðú—î•þÞ,Mza@i €"„ÜÔÒ¨ï\} À£t¢ÚïeùïÏÒg”Æ (‚AX¹uÏú`öékpíIéïÏÒ$g”Æ (‚AX™U»>3š‡ïÍ>ýàñ5M´{Cú{´4©„¥1Š`Vfý+Ì>õ`‹ o¿$ý=ZšÔ €Ò„E0+¯öA?1ìgŸz°Å:'ýNúû´4‰„¥1Š`V^ÛÏÏ>í`«Ô¾­éíÓß©¥IË (APƒ°²êœôÛÙ§l“Þ9ÿ3ý½Zš´ €Ò„E0+¨é¢ÞpSö)Û¤iÝÕnÏÊ¿–&(ƒ0 4a@ ÂÊ©wÁ?fŸn0'ý‹wO¿–&)ƒ0 4a@ ÂʨÚë…Ñt7fŸn07ývT{¿8ý=[š” €Ò„E0+£ÁUGdŸj0/ú_94ý=[š” €Ò„E0›üÚ½6¢dŸj0?†ý¨öÿ‰ô÷mi2JcÁ lòÞxNöiójpÍñéïÛÒ$d”Æ (‚AØd×9ú­Ù§Ì¿zíƒwLï–Æ=ƒ0 4a@ Â&¸©%Qß¹:û€1X{zþ»·4æ„¥1Š`6¹uOû£ìÓ NÓDûðÿ’þþ-sa@i €"„MhÓ;D}ÿ-Ù§,¨áMç心KcœAPƒ0 a“YïüdŸZ°(:G¿-ý=\× Â€Ò„E0›¼ª]~8šÖúìS ÅðŽËÒßÅ¥qÍ (APƒ°É«ÑòìÓ Uçø_O—Æ1ƒ0 4a@ Â&«jçEÓݘ}ZÀ¢ª×]­©%éïåÒ¸e”Æ (‚AØdÕ¿|¿ìS RtOywú{¹4n„¥1Š`69U{¿8¢_eŸR¢^¿6Z˶K?—Æ)ƒ0 4a@ Â&§Á•‡gŸNª{úŸ¦¿ŸKã”APƒ0 a“QµÿË#†½ìÓ RÕß¹Ù_ “¶"ƒ0 4a@ Â&£Áµ'eŸJ0ºŸþÃô÷ti\2JcÁ lük¼cDSgŸJ0êõk£5µ4ý}]‡ €Ò„E0ÿ_ÿTöi#¥û©ßO_—Æ!ƒ0 4a@ ÂÆ»ö¯Š¨‡Ù§Œ”úÞk£5µ$ý½]õ €Ò„E0ïמ”} ÀHêœü»éïíÒ¨g”Æ (‚AØøÖ>à•õ û€‘Tßs¿&=Aa@i €"„oƒ5'dŸ>0Ò:Ÿü­ô÷wi”3JcÁ le`, o>?ýÝ^µ €Ò„E0Ÿzücöéc­}èëÓßï¥QÊ (APƒ°1iù“£Ù´.ût€±6¸ö¤üw|i„2JcÁ l<êžõÁìSÆ_=ˆj¿—¥¿çK£’APƒ0 acÐÔÒ¨7Ü”}ªÀDè¯^™ÿ®/Ha@i €"„~“ß•}šÀäèµ¢Úý9éïûÒ(d”Æ (‚AØè7¼ý’ìÓÊÒoG}ÿ7£¾ëË1¼å_cpÝi1¸ú¨è_¾ôVMG(î©ï‰Îq;}·c~%ÚŸøùìã?½ùÿ<òM›ÿçNúíÙÿ»Ýϼ?ºg}(zç$zþSô¯80מÃo~>ê{¯fãÝÃ^öÿ6`"õ¾ðÏéïûÒ(d”Æ (‚AØh×þÄÏeŸ"0QšÖú¨ï\Ãë?ý/½ý?Ñ=ãÏ¢sܯFûàŸŠj·g§?ÿ¿¿j·gE{å«£sôÛ¢ûÙ¿ˆþÅ»Åàk§D}×W¢©6dÿ¯ÆöŸ Z+žšþœ—²3JcÁ l´¬ùdö)c§iÝ7;ú\süì_ÿè~ú¿Íþ…®j×g¦?Û¢™ÿµ}ýì_ëq×ÞxN4Ý™}`äuÏþ«ô縔APƒ0 a£[µ÷‹ýL<ަý@ o»hö§g~~±}Ø/Œä_øJûg‰ÝŸcß>û—3ã¸úÛ_hêìÃ#cæ'¢[˶KfK™„¥1Š`6ºõ/Þ=ûô€‘ÑlZ7û—¯z«¦gÿVûà£5µ$ýy=nU»üptŽÛiöÃ[.Œt³-¤šùçŠìç³”™APƒ0 a#ÚŠ§FSmÈ>= E³éžÞpfô.øÇèýÖ¨v}Fþ³yR[ñ´èó+›b·}1¢d~XTõÝWæ?¥Ä €Ò„E0ͺg}0ûÔ€[ƒ…Û IDATÅÑ4Q¯_ý/<º§ýQTû½,ý9\r3?¹Ù=õ½1XsB4­û²ÏX3ãèìg°”•APƒ0 a#ØÔ’Ù1“jóìè~ê¢ÚóùùÏ^=Æ?“,ö¿ý‹w‹úž5Ù§ ,˜áMçå?w¥¤ €Ò„E0½fþËd˜(ýv o¹0zç~8ª},ýY«mk毷õ.øXÔ¾‘}FÀ¼kú³éÏZ)#ƒ0 4a@ ÂF¯ÁÚÓ³O ˜³ú;7GõÊèÿkÑZþäôç«æ·öaoˆþF³éžìS æÅ`Í'ÓŸ¯RFa@i €"„VÕÞ/Žö³O Øzƒn ¿yAôÎýÿ¢}à«ÒŸ©Z¤–mãvŠÁµ'Íž0¶†½¨ö~Qþ³UZä €Ò„E0­ú-Ï>%`ËÕÃÞqYtÏúPT»>3ý9ªÜªÝž=û³ Í·fŸ™°MfÞɳŸ§Òbg”Æ (‚AصìIÑl¼;û”€Ç×Ô³#°™áOµç òŸŸ½¦–nþ«a×Q²ÏXØbMk}´–?%ÿY*-ba@i €"„NÝSß“}:Àcªï¾*zç$ª}~4ý™©ñ©ÚïÇ£ù~Ñt7eŸÂ°EºgüYúóSZÌ Â€Ò„E0†·}1ût€ï1óÓ½UË¢}à«ÒŸ“ïªÝŸ3{.5Õ†ìÓW½îêô禴˜„¥1Š`6µÞ1¢i²Oˆ¨‡1¼ñìèœð³?ý—ýŒÔ„µËÓ£wÞßG³ñ®ì3SçÈ7ç?3¥EÊ (APƒ°Ñ¨¿zeö©@ášM÷Dÿ‹»DµïKÓŸ‹* é¢{æ¢yà¶ìS~ÀàºÓòŸ•Ò"e”Æ (‚AØ4½ƒŸO ÍðŽË¢{ê{¢5½}þ3Qå5½}tÏúP4ß›})ÀwÕ#y“APƒ0 aùu?ý‡Ù§…iº£ÅÑ^ùêôç 4Sµë3¢Ñòhzg_0«ÉžéÏGi12JcÁ ,¿á-fŸ¢iݽUÓQíþŸÒŸÒ£UíñÜè_ºWÄ ›}¹P¸¦ý@´vyzú³QZè €Ò„E0Ë­ÚÿåM}0ášïˆÞçþ6Z+ž–þì“¶¤ö¯ŒáMçf_:®{ÖÓŸ‰ÒBg”Æ (‚AXòG·/îš} 0Áêû¿½s?­åONæIÛRçÄ£yà¶ìK €BÕë×FkjIúóPZÈ Â€Ò„E0KlÙvÑà•M“}è3õ]_Žö¡?›þ“FµîYŒè·³/U&ÔðŽËÒŸuÒBd”Æ (‚AX‡¶‹VdvÆHÓy0zç~8Z˶K†I£^û ×F}ïײ/[&Tûÿœþ¬“æ;ƒ0 4a@ ¹©%Ñ䌲~;zþS´¦wHfI“Pû€WD}ïµÙW6¤{æÒŸoÒ|f”Æ (‚AØ"6½}4íû³9#ª¾su´xeþóJš´vyz ¾~jö%À„¨ï¾2ÿÙ&Íca@i €"„-^ß™}¸Eõ ú—î5;Î~VI“\ïÜGÔÃì+€ ÐþÄϧ?פùÊ (APƒ°Åk°æ“Ù‡€Sßwc´û…ôg”TJ~#šöÙ—>cnpÕéÏ4i¾2JcÁ l‘Zþäh:enFEÓlþ‰»<=ÿ%ÖÌO³Öë×fßcMïá¨v}fú3Mš €Ò„E0[œ:'¿+ûP0"š‡¿wN6I%WíòÃ1¼ùüìÛc¬wÎ_§?ϤùÈ (APƒ°ÅiðµS²5#`pýg¢Úã¹éÏ%I?­éü¤7Û¬¾÷kùÏ2i2JcÁ lZñ´ÙŸ“ `õ0z|,ZSKòŸK’¾ÛԒ譚ξC0¦ÚGüRþ³Lšca@i €"„-|ÝSß›}˜HÔT¢sÜNéÏ#I]÷³1ìgß.3ƒkŽO†IsÍ (APƒ°…opÝiÙ‡€$õ«£Úç%éÏ"IO\çÄwFôZÙ· FÝ õ]_Žþ—Žî©ïI~IsÍ (APƒ°nùS¢énÊ>Ì$\uD´¦wÈIÚâÚ‡½!šöýÙ·FHóÀ­1XsBôÎýptŽ|óì{~öóJšÏ €Ò„E0[Ø:'ÿnö!`± :Ñýì_¤?ƒ$m[íC_Më¾ì; šMëbxã9Ñ[5wŽjç¦?—¤…Î (APƒ°…mpÍqÙ‡€EÔ¼,’á-Fµë3ÓŸ=’æ·jß‹ú;7gßbØMõ}7Æ`Í'£÷¹¿öáÿ%ZÓ;¤?S¤QÍ (APƒ°ü öåg^ÁÌ_šð/¥É­Úç%QßKö­€Ç0ó¿Ãωުé蜸sT{<7ýÙ!Sa@i €"„-PSK¢ÙxWöá`õW¯œ½ç§?w$-h3?Ûåö£¾ûªèåÐè~æ¿oM-MH“–APƒ0 a ô1í‹»fZÊ 3ûsDÙÏI‹_{åk¢yøÞì»Àäiš¨7܃kOŒÞ¹Žö¿­åOI¿ïK%d”Æ (‚AØÂTß³&ûа]c0©ð6¾}7k3ãÚáçDoÕôì?[U{ôõÑt7fß•ÆBÓÝÃÛ¾8;:é~ê÷£Ú÷¥é÷qIßÍ (APƒ°ù¯{öÿÈ>¬,ÄìØw¤?c$Nc~yö¯ðõ êõkc°æ„Í?ýø‰ŸÖ²íÒïÙ’;ƒ0 4a@ Âæ¿™Ÿ½`ÒÆ`oO¾H½:'¿+¢fߥÒ4›ÖmþéÇ >#ß­OK¿7KÚº €Ò„E0›ç–?9šÞÃÙ‡€ùÒkEç˜_ɾHÙzçüuö `Q4cxË…Ñ[5wŽjÏç§ßƒ%Í=ƒ0 4a@ Âæ·Î ¿‘}H˜'MwStŽú¯éÏI£_ÿâݳoYójæ?tÞ~Iô/Û7º§¾'ªý^–~¯•´0„¥1Š`6ÏѾtpö!`> ûÑ9þ×ÒŸ+’Ƥ©%1øê±Ùw.€mS¢¾gM ®:"ºg~ Ú‡¼.Z˶˿·JZ” €Ò„E0›ßšnÍ>¤ÌUÓD÷ô?M¦H³¦·ámeßÁžP}ÿ-1øÚ)Ñ;ïï£s䛣µâ©ù÷PIi„¥1Š`6µxeöá`ô>ÿÑôgФñ¬Úý9Qo¸)û6ðšÎC1¼ã²è_ºWtNÜ9ª=_~¯”4Z„¥1Š`6õÎùŸÙ‡€9êåÐô牤ñ®Úÿ'¢©6dß΀ ûQ¯»:ú«WF÷Œ÷EûàgÒ6û¾(i´3JcÁ lþÞpföá`_?5ZSKÓŸ'’Æ¿ÎÑoö²okÀ$«‡Q¯_ƒ5'DïÜoþéÇéÒï’Æ/ƒ0 4a@ Âæ©eOšý)ÆÓð¶/Fkù“óŸ'’&¦îgÿ<ûÖLfÓºÞxNôVMG縢µËÓÓïs’&#ƒ0 4a@ Âæ§ö‘oÊ>”l£ú¾¢ÚíYéÏI“WÿвoqÀšùÙÙáMçEÿ¢åÑ9ñQíùüôû™¤ÉÍ (APƒ°yúxvÑòìC À6hº›¢}ðŽéÏIÚ²íbxË¿fßê€Q6ìG½îêè¯^Ý3Þ·ùŸK¦–äß¿$“APƒ0 aóS}çêìC ÀÖjšèžòîôgˆ¤É®ÚóÑl¼+ûŽŒ‚zõúµ1XsBôÎýptŽ|³Ÿ¬–”žAPƒ0 as¯ÚíÙõ ûP°•fþºcö3DRµcÄ ›}ÛYóà1¸î´è}þ£Ñ9ú­ÑÚåéé÷#Iúþ €Ò„E0›{“~'û0°•†7ž­©¥éÏIåÔ=ëCÙ·>`5Ý1¼ã²Í?ýxê{¢Úë…é÷IÚ’ €Ò„E0›‡g—ïŸ}Ø õ†›fÿºcöóCRy ®>*û̇aóO?^uDtÏx_´Þ1ZSKÒï1’´-„¥1Š`6÷êu_Í>Œl¡¦»ió¿´燤[þÿìã¦FýíëbðÕc£{ö_Eû?­éíóï'’4O„¥1Š`6·fþÂÌÌ¿ `„<‘¦ŽÎ±ïHfHÒ÷´ü)Qß{mö&VóÀ­1XsBôÎýptŽ|óì5—~ÝKÒf”Æ (‚AضWíö¬ˆz˜}xýË÷OfHÒ£Õ^ùêhº›²o“0öšMëbxã9Ñ[5wöWA%i+2JcÁ lÛëœøÎìÃÀ¨¿}¿"i¤ëžù—Ù·J+Mç¡Þraô/Þ=:'ÿnT{¿(ý:–¤qÎ (APƒ°9|0»dìÃÀãt£ýñŸI^HÒ5¼á¬ì;&Œ¦A7껾ý/Ý3Þ핯‰ÖÔ’ôkV’&)ƒ0 4a@ ¶½á—f>Gÿ¢éÏ IÚ’ª=žÍÃ÷fß6a$~úqpÝiÑ;÷ÃÑ9òÍþʧ$-Ba@i €"„mcÓÛGô«ìÃÀc¨ï¿Å¿D–4VuŽÿõˆ¦É¾}Â¢Ž¿†7ž½UÓÑ9qç¨öxnúu(I%f”Æ (‚AضÕ>â³£sâ;ÓŸ’´µ ®<<ûö ¢énŠá—EõÊÍ?ýxðŽé×›$isa@i €"„m[½óÿWö¡à1ÌüÔTösB’¶©]žõ†›²o£07õ êõkc°æ„èžõ¡Í㯩¥ù×—$éQ3JcÁ lÛ¬=#ûÐð¤Úç%éÏ IšÓ_¢­‡Ù·SØ2Mõ†oÄ`Í'£÷/íÃß­åON¿Ž$I[žAPƒ0 aÛV³éžìCÀ£è÷÷éÏIškýËöɾ£šyÞxNôVMGçÄ£Úãyé׋$in„¥1Š`¶õUûÿDöaàQÔ÷¬‰Ö²'¥?'$iέxêì_]‚쿺9¼í¢è_ºWtOywTûühþµ!Iš÷ €Ò„E0Ûúº§ÿIöaàQtŽ}Gú3B’æ«ö‘oŠhêì[+¥ö£^wuô¿ò‰è~æýÑ>xÇhM-M¿$I ŸAPƒ0 aÛð¡lõAÙ‡ €ï3üæéÏIšïúW˜}{eB5›ÖmþéÇ >#ß<ûWé²ÏwIRNa@i €"„m}õ«³Ô4Ñ>üéÏIš÷V<-êïÜœ}—eÌ5cxË…Ñ[5wŽjçåŸÛ’¤‘É (APƒ°­lÙ“"úíìÃÀ# Öžžÿ|¤ªsô[ýt$[¬é=ÃÛ/ŽþeûD÷SÕ¾?–~K’F;ƒ0 4a@ ¶®ö¡¯Ï>dd<Âàê£ÒŸ ’´ÐU»=+šMë²o¹$›9†7ž½ >¶yüµâiéç¦$iü3JcÁ lëš0"¨ö}iú³A’£îiœ}×e5‡bxË…Ñ[5wŽjÏç§Ÿƒ’¤ÉÌ (APƒ°­«¾÷ÚìCÀ¿éåéÏIZ̆ßü|ö­—…ÐkÅðöK¢ù~Ñ=õ½Qí÷²ôsM’TNa@i €"„mE+žQ²3š:Ú¾*ÿÙ I‹Xû€WDôÛÙw`æ¢D}Ïš\uDtÏü@´y]´–m—~nI’ÊÍ (APƒ°-¯}Ä/f.þÍ`íéÏIʨ÷¯ÿ'ûÌVh6­‹áçlþéÇãvŠÖЧ¥ŸC’$=2ƒ0 4a@ ¶¼îÙÿ#ûpðoÚGüRúsA’RšÞ>êõ×g߆yMë¾Þtîæñ×'+ª=ž—¾H’ô„¥1Š`¶å ®<,ûpÃ;.K&HRfcßž}+fØzÝÕÑ_½2ºg¼/Úï­©%éç†$I[›APƒ0 a[^}ç—²Ñ9ùÿ±wçÁš×噇‹%£’1ÛL¢ÉÈ8“‰Yf&Éh¬1‰cL˜«’”Žf …RãBB—éÙT Ù›-,²Ó4²YDYšE”Eviλ/¿)8©:¶½ÐÝtŸç}Ï}]UŸÿ¥ŸS¿oåä®î·•¿ ’TÝ`åiÕŸã£a3zôÖfð­ã›Þyn:G½±™ÙãEå?’$mŽ Â€4a@ƒ° lñ6MÓ›©>@¼Ñãw63‹¶®$©¸Öþ¯jƽgª?Ë ÒxÕƒÍð޳ÿôã ;5­}þMù½%IÚR„i €aVûÐ×VŸ €¦iºËw)$iRê]òÉêÏòÔwŸ~îŸ"îí³³ã¯ÏþÛò»J’4Ÿ„i €aV÷ÔwTŸ ÞxæÑfæÓ/)$ibÚóÅÍèß©þôµåo$MC­½^ÖŒW=ÔL¢qwU3¼÷ʦÍ!ÏýÓ­_]þç%I’ €<a@ƒ°çox÷ÅÕgˆ5üîeåï€$MSÝåï«þt7Ͱߌ½µ\·ô¹ñWû°š™E[—ÿÙH’¤53Ò„ ž¿gÿ)jtOûßåï€$MU‹·iF¬œ×oõøÉ{šÁ·Žozç}¸éõÆffÏŸ¬ÿs$I”AÆ ˆ`¶þZû¾¢úD±Æ§Œ $iêüóŸn¹oóÓ4ÃÛÎjz¼éý¦¦µ÷våÿ½’$iÓ3Ò„ ÂÖ_û¨ß«>@¬Á G—¿’”üÏž»«šá½W6ýkyîŸ~l-Ù¾ü¿K’$mÞ Â€4a@ƒ°õ×=sçêÄêûæòw@’¦µö¿Ù4ãцtGƒfôè­ÏýÓÝå»4íÃvhfm]þß!I’¶la@ƒ0 ‚AØóüRìŠýªOi<óX3³xÛòw@’¦¹ÁÇ®û;»êÁf°ò´¦wÞ‡›ÎQoôOôJ’šAÆ ˆ`¶þ·žQ}"€Hýk/$iÚkíÿʦ鷚ñª‡šá+šÞ¥{4vjZûýlùÿ6I’4„i €aëoôÈ-Õ'ˆÔYöåo€$-„ZûütùÿI’4¹„i €aëiÑÖMÓoWŸ θõÿ\¤$I’$ÍCa@ƒ0 ‚AغkøêêóDÜx\ù I’$I „i €aë®sÜ[ªÏ©sòÛËßI’$IJÈ HcD0[w½sÿ¾ú<yff¯—–¿’$I’”AÆ ˆ`¶ž_ˆ]}põyâ ï<¿üû/I’$I)„i €aënxûòêóÄéÿÑòï¿$I’$¥d¤1"„­»Ñ#·TŸ Nû°Ê¿ÿ’$I’”’AÆ ˆ`¶îÆÝUÕçˆ2~úûÍÌ¢­Ê¿ÿ’$I’”’AÆ ˆ`¶öZŸùùêÓÄÜpLù÷_’$I’’2Ò„ ÂÖ^û‹¿[}€8ÝÓßUþý—$I’¤¤ €4a@ƒ°µ×=õÕ§ˆÓ:à—Ë¿ÿ’$I’””AÆ ˆ`¶öz—|²ú4QÆOÝ[þí—$I’¤´ €4a@ƒ°µ7¸î¨êÓDÜ|Rù·_’$I’Ò2Ò„ ÂÖÞð® «O¥·âýåß~I’$IJË HcD0[{£Go«> @”ö¿Qþí—$I’¤´ €4a@ƒ°µ7î>]}€ãîªffñ6åß~I’$IJË HcD0[³Ö>?]}€(Ãï]Qþí—$I’¤Ä €4a@ƒ°5kþºê³Dé_}Pù·_’$I’3Ò„ ÂÖ¬sü[«Ï¥{ú»Ë¿ý’$I’”˜AÆ ˆ`¶fÝsv­> @”ö¡¯-ÿöK’$IRba@ƒ0 ‚AØZ~vù>Õgˆ1î=ÓÌ,Þ¦üÛ/I’$I‰„i €ak6¸á˜ê³ÄÝÿõòï¾$I’$¥f¤1"„­Ùð;TŸ Æà†£Ë¿û’$I’”šAÆ ˆ`¶f£‡¾U}€½ w/ÿîK’$IRja@ƒ0 ‚AØšŸy¸ú,1:'üYùw_’$I’R3Ò„ Â~¬ÅÛ4ÍhX}€­%Û×û%I’$)4ƒ0 AÁ lõZŸûÅê“ätžâVû%I’$)5ƒ0 AÁ lõÚŸÿ­êâæ:3 IDAT“Ä=|Sùw_’$I’’3Ò„ ÂV¯sü[«OcpÛ™åß}I’$IJÎ HcD0[½î™;WŸ Fÿª%åß}I’$IJÎ HcD0[½ÞE«> @ŒÞ¹_þÝ—$I’¤ä €4a@ƒ°ÿ%Øg«O£sÂNåß}I’$IJÎ HcD0[½ÁuGUŸ Fû°_+ÿîK’$IRra@ƒ0 ‚AØê n=£ú$1Z{½¬ü»/I’$IÉ„i €a«7¼çÒê“D·/ÿæK’$IRza@ƒ0 ‚AØê¾©ú$FÜRþÍ—$I’¤ô €4a@ƒ°Õÿðþê“DÞuQù7_’$I’Ò3Ò„ ÂV¯éÍTŸ Âà[Ç—ó%I’$)=ƒ0 AÁ ìGÚóÅÕçˆÑÿÚgë¿û’$I’žAÆ ˆ`6Wës¿X}€½ów+ÿîK’$IRza@ƒ0 ‚AØ\íÃ_W}€ÝSßQþÝ—$I’¤ô €4a@ƒ°¹:_úýêsÄèó‡åß}I’$IJÏ HcD0›«sÒ_TŸ Fûˆß,ÿîK’$IRza@ƒ0 ‚AØ\ݳþ¶ú1ZüJùw_’$I’Ò3Ò„ Âæê]¸{õ9b´ö~yùw_’$I’Ò3Ò„ Â~ä`—ï[}€ £a3³h«òï¾$I’$¥g¤1"„Í5øæ‘Õçˆ0ný ü›/I’$I2ò„ ÂæÜrJõ9"Œž¸«ü›/I’$I2ò„ Âæ~ûÜêsD}ÿ›åß|I’$I’AÇ ˆ`6×ðžK«ÏáÙïmõ7_’$I’dä1"„Í5ºÿëÕçˆðìßÈXýÍ—$I’$„y €as¾¹ú+O+ÿæK’$I’ €<a@ƒ°¹F?øNõ9" n<®ü›/I’$I2ò„ Âæ?ýýêsD|óÈòo¾$I’$É ÈcD0›kÜ~²úúW-)ÿæK’$I’ €<a@ƒ°¹šA·úú—ïSþÍ—$I’$„y €aÿÚâmªO£wɧê¿û’$I’$ƒ0 ŽAÁ l¶Ö^/«>@ŒÞ…»—÷%I’$Ia@ƒ0 ‚AØl­ÏüBõ)bôÎß­ü»/I’$I2ò„ ÂfkøêêSÄè}åCåß}I’$I’AÇ ˆ`6[û°ªO£·âåß}I’$I’AÇ ˆ`6[ûÈß®>@Œî9»–÷%I’$Ia@ƒ0 ‚AØle;VŸ F÷ì÷–÷%I’$Ia@ƒ0 ‚AØlãÞR} €ݳÞSþÝ—$I’$„y €a³uN~{õ)btÏø?åß}I’$I’AÇ ˆ`6[÷ÔwTŸ F÷ôw—÷%I’$Ia@ƒ0 ‚AØlÝÓßU} €Ý3þ¦ü»/I’$I2ò„ Âf{vœÀüèž¹sùw_’$I’dä1"„Íöì8€ùÑ=ûïÊ¿û’$I’$ƒ0 AÁ l¶îY[} €Ýsv-ÿîK’$I’ €<a@ƒ°Ùºg¿·ú1z+>PþÝ—$I’$„y €a³u—ïR} €½¯|¨ü»/I’$I2ò„ Âfë­xõ)bôÎß­ü»/I’$I2ò„ ÂfëûÁêSÄè]¸{ùw_’$I’dä1"„ÍÖ;÷ï«O£wñÇË¿û’$I’$ƒ0 AÁ l¶Þy©>@ŒÞ¥‹Ë¿û’$I’$ƒ0 AÁ l¶ÞÿP} €ý+ö+ÿîK’$I’ €<a@ƒ°Ùzî^} €ý«.ÿîK’$I’ €<a@ƒ°Ùz}¬ú1ß<²ü»/I’$I2ò„ Âfë]üñêSÄÜx\ùw_’$I’dä1"„ÍÖ»äSÕ§ˆ1Xyjùw_’$I’dä1"„ÍÖû—EÕ§ˆ1¼ãœòï¾$I’$É ÈcD0›­wéÕ§ˆ1¼ûâòï¾$I’$É ÈcD0›­wéâêSÄÞûµòï¾$I’$É ÈcD0›­wñÇ«Ocôàõåß}I’$I’AÇ ˆ`6[ïÂÝ«Ocôø·Ë¿û’$I’$ƒ0 AÁ l¶Þy©>@Œñª‡Ê¿û’$I’$ƒ0 AÁ l¶ÞŠTŸ Go¦ü»/I’$I2ò„ Âfë._õ)¢Ì,Þ¶üÛ/I’$Ié„i €a³uÏܹúQZû¾¢üÛ/I’$Ié„i €a³uOWõ)¢´ø•òo¿$I’$¥g¤1"„ÍÖ=寫O¥}øëÊ¿ý’$I’”žAÆ ˆ`6[çä·WŸ Jû¨ß+ÿöK’$IRza@ƒ0 ‚AØlvª>@”ÎñRþí—$I’¤ô €4a@ƒ°Ùž&0žý§z«¿ý’$I’”žAÆ ˆ`6[ç˜?ª>@”îò]Ê¿ý’$I’”žAÆ ˆ`6[gÙŽÕ§ˆÒ»øåß~I’$IJÏ HcD0›­½ô Õ§ˆÒ¿ò€òo¿$I’$¥g¤1"„ÍÖ>ò·«OepÃ1åß~I’$IJÏ HcD0›­}ÄoVŸ ÊðŽsÊ¿ý’$I’”žAÆ ˆ`6[û°ªOexï•åß~I’$IJÏ HcD0›­µdûêSD=v{ù·_’$I’Ò3Ò„ Âfk}æªOeüÌ#åß~I’$IJÏ HcD0û×öziõ)² ûÍÌ¢­ê¿ÿ’$I’œAÆ ˆ`ö¯-ÚªiÆ£êsDií½]ý÷_’$I’‚3Ò„ Âæjz3ÕçˆÒZ²}ù·_’$I’’3Ò„ Âæ?ópõ9¢´üòo¿$I’$%g¤1"„Í5~òžêsD霰Sù·_’$I’’3Ò„ Âæ=rKõ9¢tÏþ»òo¿$I’$%g¤1"„Í5ºÿšêsDé]òÉòo¿$I’$%g¤1"„Í5¼û’êsDé_shù·_’$I’’3Ò„ ÂæÞ~võ9¢ n9¥üÛ/I’$IÉ„i €as n:±úQ†ß½¬üÛ/I’$IÉ„i €as ®[Z}€(£Çn/ÿöK’$IRra@ƒ0 ‚AØüìª%Õçˆ2n?Qþí—$I’¤ä €4a@ƒ°ùØe{UŸ ËxÜÌìñ¢òï¿$I’$¥f¤1"„ÍÕ»èÿVŸ NkÿW–ÿ%I’$)5ƒ0 AÁ l®Þ¹¬>@œöþ[ù÷_’$I’R3Ò„ Âæêž¹sõ9âtNØ©üû/I’$I©„i €asuN~{õ9âtÏÙµüû/I’$I©„i €asu–ýAõ9âô/Û«üû/I’$I©„i €asµøêsÄÜptù÷_’$I’R3Ò„ ÂæjíÿªêsÄÞuaù÷_’$I’R3Ò„ Â~¤OÿTõ9âŒYYÿý—$I’¤Ð €4a@ƒ°ÕkÝê“D·Ÿ(ÿöK’$IRja@ƒ0 ‚AØêŸy¸ú$qf>ý’òï¿$I’$%f¤1"„­ÞèÑÛªO§}ÐkÊ¿ÿ’$I’”˜AÆ ˆ`¶zÃû®ª> @œÎ²Ë¿ÿ’$I’”˜AÆ ˆ`¶zÃ;VTŸ N÷´w–ÿ%I’$)1ƒ0 AÁ lõß:¾ú$qzî^þý—$I’¤Ä €4a@ƒ°û%ØÕWŸ NÿšCÊ¿ÿ’$I’”˜AÆ ˆ`¶z½KWŸ Îà¶3Ë¿ÿ’$I’”˜AÆ ˆ`¶z½¯|¨ú$qF^_þý—$I’¤Ä €4a@ƒ°Õëžþ®ê“Ä·/ÿþK’$IRba@ƒ0 ‚AØêuŽkõI"ÍìõÒò7@’$I’Ò2Ò„ ÂV¯½ôõÕ'ˆÔ>ô?—¿’$I’”–AÆ ˆ`¶zíC~µú$‘:ÇÿIù I’$Ii„i €a«×Ú÷Õ'ˆÔ]¾Kù I’$Ii„i €a?Ö¢­šfЭ> @œþåûÔ¿’$I’–AÆ ˆ`¶f㧨> @œÁM'”ÿ%I’$)-ƒ0 AÁ lÍF^_}€8Ãï]Qþý—$I’¤´ €4a@ƒ°5Þy^õY⌟º·üû/I’$Ii„i €ak6¸á˜ê³ä š™ÅÛ–¿’$I’””AÆ ˆ`¶–_„]ñ™ê³Djð+åo€$I’$%e¤1"„­YïüVŸ RgÙ”¿’$I’””AÆ ˆ`¶fÝÓÞY}€HݳÞSþH’$IRRa@ƒ0 ‚AØšuŽùÃê³Dê_¶Wù I’$II„i €akÖ>ìתÏipÓ‰åo€$I’$%e¤1"„­Yk¿Ÿ«> @¤Ñý×”¿’$I’””AÆ ˆ`¶–mÕ4Ã~õi⌟y¤þ $I’¤  €4a@ƒ°µ7^õ`õi"µözYù I’$I)„i €akoôÐÕ§ˆÔ>ü×ËßI’$IJÉ HcD0[{Ãï\P}€H“ÞVþH’$IRJa@ƒ0 ‚AØÚÜx\õi"õÎß­ü $I’¤” €4a@ƒ0¿ ˜$ý¯VþH’$IRJ~¤1"„­½Þù­> @¤á·¿RþH’$IRJa@ƒ0 ‚AØÚë~ù/«OiôØíåo€$I’$¥d¤1"„­½öÒ×WŸ S¿ÝÌ,Úºü$I’¤„ €4a@ƒ°µ×Úÿ•Õ§ˆÕÚÿUåï€$I’$%d¤1"„­£ÅÛ4ÍhP}€H£ßTÿH’$IR@a@ƒ0 ‚AغÿðþêóDê.ߥü $I’¤„ €4a@ƒ°u7ºÿšêóDê_y@ù I’$I „i €aën°òÔêóDÞ¾¼ü $I’¤„ €4a@ƒ°õüBìª%Õçˆ4zô¶ò7@’$I’2Ò„ ÂÖ]ïüݪÏiÐmfoSþH’$IÒBÏ HcD0[wÝSþªú<±Z¾ºü$I’¤…žAÆ ˆ`¶îÚKßP}€Xcß\þH’$IÒBÏ HcD0[w­ý_U}€X½($I’$i¡g¤1"„­§ÅÛ4ÍhP}"€Hý«®$I’$ig¤1"„­¿ñÓTŸ ÒðÛ_)$I’$i¡g¤1"„­¿Ñý_¯>@¤Ñãw–¿’$I’´Ð3Ò„ ÂÖß`åiÕ'È4ì73‹·-$I’$i!g¤1"„=Ï/Å®>¨úD±ÚýÇòw@’$I’ra@ƒ0 ‚AØúë¿[õ‰buNø³òw@’$I’ra@ƒ0 ‚AØúëœüöêÄê]ðåï€$I’$-ä €4a@ƒ°õ×þüoUŸ Öລåï€$I’$-ä €4a@ƒ°õ×Úç§«Okø½+ÊßI’$IZÈ„i €aÏ߸ýdõ™"Ÿy¤ü $I’¤…œAÆ ˆ`öüº±úL±ZûþLù; I’$I 5ƒ0 AÁ ìùÜvfõ™bµ—¾¾ü$I’¤…šAÆ ˆ`¶¿»êÀê3Äêž¹sù; I’$I 5ƒ0 AÁ ìùëûÁê3Äê_ñ™òw@’$I’ja@ƒ0 ‚AØó×ùç?­>@¬áíg—¿’$I’´P3Ò„ ž¿ö¡¯­>@¬Ñc·—¿’$I’´P3Ò„ Â6 O¿¤iÆãêSdö›™=~¢þ-$I’¤˜AÆ ˆ`¶aŸy¸úT±Ú‡üjù; I’$I 1ƒ0 AÁ lÃÝÿõêSÄêœøçåï€$I’$-Ä Â€4a@ƒ° kpóÉÕ§ˆÕ»ðŸÊßI’$IZˆ„i €aøË±Ë÷©>@¬Á Ç”¿’$I’´3Ò„ Â6¬îÙï­>@¬gÿÙÞêw@’$I’ba@ƒ0 ‚A؆Õ9æªOkÜ}º™Y´Uù[ I’$I -ƒ0 AÁ lÃj-ùÕ§ˆÖ:à—ËßI’$IZh„i €aØâmšfØ«>@¬Îqo© $I’$ie¤1"„mx£Çï¬>@¬Þù»•¿’$I’´Ð2Ò„ Â6¼á·Ï­>@¬Áõ_*$I’$i¡e¤1"„mÄ/È®>¨ú\±†÷]]þH’$IÒBË HcD0Ûðz+Þ_}.€XãΛ™E[•¿’$I’´2Ò„ Â6¼Î±\}.€h­ý_YþH’$IÒBÊ HcD0ÛðZþûêsDëûæò·@’$I’Ra@ƒ0 ‚AØF´hë¦tªO«wÞGêßI’$IZ@„i €a×èÑÛªOkpÝÒòw@’$I’Ra@ƒ0 ‚AØÆ5¼}yõÉb ﻪü$I’¤…”AÆ ˆ`¶‘¿$»rÿê“Äwž*$I’$i!e¤1"„m\Ýåï«>@´Öç~±ü-$I’¤…’AÆ ˆ`¶quŽþÕ'ˆÖ9æÊßI’$IZ(„i €aWkÿWVŸ Zï¼”¿’$I’´P2Ò„ Â6²E[5Mo¦úl±×©þ-$I’¤’AÆ ˆ`¶ñ¾¹úl±F÷½ü$I’¤…’AÆ ˆ`¶ñ n=£úl±Æ½gžûÛ«ßI’$IZ„i €a›ð‹²+ö«>@´Ö’íËßI’$IZ„i €a_÷̫ϭs⟗¿’$I’´2Ò„ Â6¾öÿ{õÙ¢õ.ùdù[ I’$I !ƒ0 AÁ lãkí½]õÙ¢ n>¹ü-$I’¤…AÆ ˆ`¶iW=T}:€X£GV–¿’$I’´2Ò„ Â6­á=—VŸ ×°ßÌìñ¢ò·@’$I’¦=ƒ0 AÁ lYvíÕ§ˆÖ>ü×ËßI’$Išö €4a@ƒ°M«wî«O­{Ú;ËßI’$Išö €4a@ƒ°M«sÌVŸ ZÿŠýÊßI’$Išö €4a@ƒ°M«õ¹_ª>@´á+ÊßI’$Išö €4a@ƒ°MoÜyªú|±ÆO}¯ü$I’¤iÏ HcD0ÛôF\[}>€\ãqÓÚ{»ò·@’$I’¦9ƒ0 AÁ lÓÜxlõù¢µ—¾¾ü-$I’¤iÎ HcD0Ûôz}¬ú|ѺËw) $I’$iš3Ò„ Â6½Î‰^}>€hýk/ $I’$iš3Ò„ Â6½öÁÿ©ú|ц÷~­ü-$I’¤iÎ HcD0{-Þ¦iÝêÄwŸnfmUÿH’$IÒ”f¤1"„½°F¬¬>!@´Ö¯. $I’$iZ3Ò„ Â^Xƒ•§UŸ Z礷•¿’$I’4­„i €a/ð—f_ýtõ ¢õþeQù[ I’$IÓšAÆ ˆ`öÂêžò×Õ'ˆ6¸õŒò·@’$I’¦5ƒ0 AÁ ì…Õ>l‡êD=qWù[ I’$IÓšAÆ ˆ`ö[¼mÓ ºÕgÈ55­½^VÿH’$IÒf¤1"„½ðFß\}F€hí¥o( $I’$i3Ò„ Â^xƒ›Oª>#@´î9»–¿’$I’4„i €a/¼ÞÅŸ¨>#@´þ7¾PþH’$IÒ4f¤1"„½ð:'þ¯ê3DÞwuù[ I’$IÓ˜AÆ ˆ`öÂk-Ù¾úŒÑÆÝUÍÌ¢­ËßI’$Iš¶ €4a@ƒ°ÍТ­ž#P§}ÐkêßI’$Iš² €4a@ƒ°ÍÓèk«O ­sòÛËßI’$Iš¶ €4a@ƒ°ÍÓàúeÕ§ˆÖÿêžåo$I’$M[a@ƒ0 ‚AØæ©wþG«O mxûÙåo$I’$M[a@ƒ0 ‚AØæ©sìWŸ ÚøÉï–¿’$I’4m„i €a›§Ögÿ]õ)²ÇMkߟ)$I’$iš2Ò„ Â6_ã™ÇªÏ ­sô›ÊßI’$I𦠀4a@ƒ°Í×ð»—UŸ Zï‚, $I’$iš2Ò„ Â6ã/Ю=¼úœÑ7XþH’$IÒ4e¤1"„m¾ºçìZ}N€h£Çn/ $I’$iš2Ò„ Â6_í£~¯úœÙFÃff¯—–¿’$I’4-„i €a›¯ÖÞ/ošñ¨ú¤ÑžçV¿’$I’4-„i €a›·ÑwWŸ ZïÜ–¿’$I’4-„i €a›·ÁmgVŸ Úàúeåo$I’$MKa@ƒ0 ‚AØæ­wéâê“D=tcù[ I’$IÓ’AÆ ˆ`¶yëœôÕ'È6ì53{¾¸ü=$I’¤iÈ HcD0Û¼µ–l_}R€xí/ü×ò÷@’$I’¦!ƒ0 AÁ l3·h«fÜyªú¬Ñºg¿·þ=$I’¤)È HcD0Ûü ï½²ú¬Ñúßø|ù[ I’$IÓAÆ ˆ`¶~‘víÕgˆ6ºÿšò·@’$I’¦!ƒ0 AÁ ló×]þ¾ê³dë·š™ÅÛ–¿’$I’4é„i €a›¿ö·ú¬ñÚ‡íPþH’$IÒ¤g¤1"„m>ý’¦ «O ­{ú»ëßI’$Išð €4a@ƒ°-Óèñ;«O ­Õ’ò·@’$I’&=ƒ0 AÁ lË4XyZõi¢ ¿{Yù[ I’$I“žAÆ ˆ`¶eê]ò©êÓDw~ØÌ,Úªü=$I’¤IÎ HcD0Û2uNØ©ú´ñÚ½¦ü=$I’¤IÎ HcD0Û2µøåêÓÄë~ù/ËßI’$Išä €4a@ƒ°-׸õƒêóDë_¾où[ I’$I“œAÆ ˆ`¶å~÷«Õçˆ6üÎåo$I’$Mra@ƒ0 ‚AØü…ÚUKªÏ m<óhù[ I’$I“œAÆ ˆ`¶åêžþîêóÄkíÿÊò÷@’$I’&5ƒ0 AÁ lËÕ>ì×ªÏ ¯sÂNåï$I’$Mja@ƒKO® IDAT0 ‚AØlñ6MÓoUŸ ZïÒÅõï$I’$Mha@ƒ0 ‚AØ–môÀµÕ'ˆ6¼ýìò·@’$I’&5ƒ0 AÁ l ÿRí_¨>1@´ñï+ $I’$iR3Ò„ ¶lÝåï«>1@¼Ö~?WþH’$IÒ$f¤1"„mÙÚGþvõ‰âuŽ}sù{ I’$I“˜AÆ ˆ`¶…ÛóÅM3ìWŸ Zï¢Õ¿’$I’4„i €a[¾ÑÃ7WŸ Úà–/—¿’$I’4‰„i €a[¾ÁÇUŸ Úèñ;ËßI’$IšÄ €4a@ƒ°-_ï¼TŸ ÛxÜ´öÞ®ü=$I’¤IË HcD0Ûòu–íX}f€x/ý~ù{ I’$I“–AÆ ˆ`¶å{öo¥iÆ£êSD{öok¬~$I’$iÒ2Ò„ Âæ§ÑwUŸ ÚàÆãÊßI’$Iš´ €4a@ƒ°ùi°ò´êSD=²²ü-$I’¤IË HcD0›Ÿz¢úÔÙÆ£¦µ÷ËËßI’$I𤠀4a@ƒ°ù©sÜ[ªO ¯³lÇò÷@’$I’&)ƒ0 AÁ l~jí÷sÕ§ˆ×»àÊßI’$I𤠀4a@ƒ°ùküÔ½Õçˆ6¸åËåo$I’$MRa@ƒ0 ‚AØü5¸õŒêsD=qwù[ I’$I“”AÆ ˆ`6õ.þDõ¹²ÇMk¿Ÿ-$I’$iR2Ò„ Âæ¯Î±o®>7@¼Îqÿ³ü=$I’¤IÉ HcD0›¿Zû¾â¹¿€:½K>UþH’$IÒ¤d¤1"„Ío£'î®>9@´áíËËßI’$Iš” €4a@ƒ°ùmpË)Õ'ˆ6^õPù[ I’$I“’AÆ ˆ`6¿õ.ü§ê“Äk}î—ÊßI’$Iš„ €4a@ƒ°ù­sô›ªO¯sÒÛÊßI’$Iš„ €4a@ƒ°ù­µ÷vM3UŸ Zÿò}ÊßI’$Iš„ €4a@ƒ°ùoôø·«Ïmx×Eåo$I’$MBa@ƒ0 ‚AØü7¸éÄê³D·ŸhfmUþH’$IRua@ƒ0 ‚AØü×;·ê³Äkôšò÷@’$I’ª3Ò„ Âæ¿Î—~¿úìñº§¾£ü=$I’¤ê €4a@ƒ°‚>ýSM3VŸ Zÿª%õï$I’$g¤1"„Õ4zôÖêÓDÞûµò·@’$I’ª3Ò„ ÂjÜx\õé²õ[ÍÌâmËßI’$IªÌ HcD0«©÷•UŸ ^ûðו¿’$I’T™AÆ ˆ`VS{éªO¯{Ö{ÊßI’$IªÌ HcD0+jÏŸlša¿úüÑúßøBý{ I’$I…„i €au¾©úüÑFß¿®ü-$I’¤Ê €4a@ƒ°º×/«>?@¶a¯™ÙóÅåï$I’$Ue¤1"„ÕÕ[ñþêóÄkù;åï$I’$Ue¤1"„Õõì€Z½($I’$©*ƒ0 AÁ ¬°=^Ô4ƒnõ@´ÁÇÖ¿’$I’T”AÆ ˆ`VÛèÁë«¢½µü-$I’¤ª €4a@ƒ°Úßübõ@¶ñ¨iíýòò÷@’$I’*2Ò„ Âjë._õ@¼Î²ËßI’$IªÈ HcD0«­ýùÿRý#¯wÁ?–¿’$I’T‘AÆ ˆ`VÜ?Ñ4ývõ@´Á-§Ô¿’$I’TAÆ ˆ`Vßèk« ¢Ÿ¼§ü-$I’¤Š €4a@ƒ°úú×Qýc¯õ™Ÿ/$I’$i¾3Ò„ Âêëžõžê€xãÞRþH’$IÒ|g¤1"„Õ×>ü׫ âõþåÿ•¿’$I’4ß„i €aÐâmš¦7Sý£mxÇ9õï$I’$Ísa@ƒ0 ‚AØd4¼ïêê€hãg. $I’$i¾3Ò„ Â&£þ5‡Vÿ(Äkíÿªò÷@’$I’æ3ƒ0 AÁ l2êžþîê€x“þ¢ü=$I’¤ùÌ HcD0›ŒÚ‡üjõ@¼þåû–¿’$I’4Ÿ„i €ÿÏÞ½Gû]×w¾n^ñÚ9vpÚ©ÇÕŽ;m=öØ2íèTéêÚÎ/=ÓôØÖqÕN›iשµNM6 AÆ (‘KbDn0†[ D$"ÁÀábPQ‚rß¿û÷÷ýœ•‹ÓLšËξäýýýÞÇZÏÿ[ýìï{·¾d— ÂÒ‚ÃJÝúQôsH­zàºø{ I’ük I‡0ƒ0 ƒ0 ƒ°æTÝmôsH­n?±c }$I’$éPedc¤`Öœú_ZýÒk/{Mø=$I’¤C•AA‚AXsê|æw¢Ÿ@zÝÏý?á÷@’$I’Ua@6a@ aÍ©uê+¢Ÿ@zýÛÎ ¿’$I’t¨2²1R0kVõ“[£Ÿ@jÃïß~ $I’$éPedc¤`Ö¬w_ý$rV¥µøèð{ I’$I‡"ƒ0 ƒ0 ƒ°fÕ»æ}ÑO ½Îyÿ&üH’$IÒ¡È ÈÆ HÁ ¬YuÎûè'^ïÚ÷‡ßI’$I:„Ù„)„5¬E/(e8ˆ~©U÷\$I’$éddc¤`Ö¼†?¸+úY¤V?óýð[ I’$I‡"ƒ0 ƒ0 ƒ°æ5¸ãSÑÏ ½Ö‡ÿYø=$I’¤¹Î ÈÆ HÁ ¬yu¯zOô³H¯{ÉÛÃï$I’$Íua@6a@ aÍ«ýñ_Œ~éõo93üH’$IÒ\gdc¤`ÖÀQJo2úi¤V=|kü=$I’¤9Î ÈÆ HÁ ¬™U[7D? €ÜÝ2yÒsÃï$I’$Íea@6a@ aÍlûŸ* Vû“¿~$I’$i.3²1R0kfÝKßý4Òë­›~$I’$i.3²1R0kf­3ÿ÷è§Þ஋Âï$I’$Íea@6a@ aÍ­žÜý<R«Ÿx0üH’$IÒ\fdc¤`Öܪ{¿ý<Òkö“á÷@’$I’æ*ƒ0 ƒ0 ƒ°æÖ[?ý<Òë|æwÂï$I’$ÍUa@6a@ aÍ­³ê·£Ÿ@zý›–„ßI’$Iš« €l € š[ë”——R×ÑO µêÁÂï$I’$ÍUa@6a@ aÍnøøýÑO µºûL™\xDø=$I’¤¹È ÈÆ HÁ ¬Ù îº(ú‰¤×>ûuá÷@’$I’æ"ƒ0 ƒ0 ƒ°f×»ú/£Ÿ@zÝ«þKø=$I’¤¹È ÈÆ HÁ ¬ÙµWüZôHopÇyá÷@’$I’æ"ƒ0 ƒ0 ƒ°†wÒóJ©úÑÏ µá¶Íñ÷@’$I’æ ƒ0 ƒ0 ƒ°æ7|äëÑÏ ·º.­%/ ¿’$I’4Û„Ù„)„5¿Á×>ýLÒë\øÖð{ I’$I³AA‚AXóë^ñGÑÏ ½Þ Âï$I’$Íva@6a@ aͯ½üµÑÏ ½êÞ/†ßI’$Iší €l € ÂF ‡—ºûtôSH­ný¨L.8,þ&H’$IÒ,fdc¤`6UÝýTÒkŸõ³á÷@’$I’f3ƒ0 ƒ0 ƒ°Ñ¨óiÑO ½îå~$I’$i63²1R0ºŸýÑO ½þWÏ¿’$I’4›„Ù„)„F­¥¯Œ~*é ¿w{ø=$I’¤ÙÌ ÈÆ HÁ ltªŸþ^ôsÈ­ê—ÉE/¿’$I’4[„Ù„)„NÕ=WD?€ô:Ÿú×á÷@’$I’f+ƒ0 ƒ0 ƒ°Ñ©wíû£Ÿ @z½kþ:üH’$IÒledc¤`6:uÎSôsHo°ùòð{ I’$I³•AA‚AØèÔZ|t)Ã*úɤV?óHø=$I’¤ÙÊ ÈÆ HÁ l´>zwô“H¯uúO…ßI’$Iš €l € ÂF«ÁçE?€ôºŸ~$I’$i62²1R0­ºW½'úɤ×ßðáð{ I’$I³‘AA‚AØhÕþØ¿Š~2éU[7„ßI’$Iš €l € ÂF¬…G”º÷lô³ÈmÐ-“'=/þ&H’$IÒ 3²1R0½ªo9úÙ¤×^ñká÷@’$I’fšAA‚AØèÕßpzô³H¯wÍûÂï$I’$Í4ƒ0 ƒ0 ƒ°Ñ«{ñ‰ÑÏ ½ê[W…ßI’$Išia@6a@ a£WëÃ?ýlÒ«[?,“  ¿ ’$I’4“ €l € ÂF³ú™G¢Ÿ@zíe¯ ¿’$I’4“ €l € ÂF³íª €XÝ+ÿ$üH’$IÒL2²1R0Íz×} úé¤7øúá÷@’$I’f’AA‚AØhÖ¹àßF?€ô†?¼/üH’$IÒL2²1R0ÍZ'¿¨”zý|r«ëÒ:õá7A’$I’¦›AA‚AØè6ÜvOôóH¯sÑ¿¿’$I’4Ý Â€l € ÂF·Á×/ˆ~>éõ7|8üH’$IÒt3²1R0ݺŸÿÓèçÞð;Ãï$I’$M7ƒ0 ƒ0 ƒ°Ñ­ýñ_Š~>Tý2¹èá7A’$I’¦“AA‚AØ·ðÈRz“ÑO ½Î§~=þ&H’$IÒ42²1R0íª­¢Ÿ@z½ë>~$I’$i:„Ù„)„vý[Έ~BéU÷~1üH’$IÒt2²1R0íº—¼=ú ¤W·Ÿ(“ ¿ ’$I’t°„Ù„)„v­3~&ú PJi/møM$I’¤ƒÍ ÈÆ HÁ lô«Ÿ}4ú¤×½ê=á÷@’$I’6ƒ0 ƒ0 ƒ°Ñ¯Ú²6ú¤7Ø´*üH’$IÒÁfdc¤`6úõ®ÿ»èg^ýăá÷@’$I’6ƒ0 ƒ0 ƒ°Ñ¯sá[¢Ÿ¥”ÖÒcÂo‚$I’$La@6a@ a£_kÉKJ©‡ÑO ½îÅ'†ßI’$I:˜ €l € ÂÆ£ác[¢Ÿ@zý[?~$I’$é`2²1R0w®Œ~Jé ¿÷µð{ I’$I“AA‚AØxÔ[ûÞè§ÀpPZ‹¿ ’$I’4Õ Â€l € ÂÆ£ö9¯~J”R:ç¿9ü&H’$IÒT3²1R0“&Ž*¥ßŽ~Néõnø`üM$I’¤)fdc¤`6>UßýœÒ«þ¿ÿ~$I’$iª„Ù„)„Oý[ÏŠ~NéÕݧËäÂ#Âo‚$I’$M%ƒ0 ƒ0 ƒ°ñ©{é;¢Ÿ¥”öÇ~!ü&H’$IÒT2²1R0ŸZg¼*ú9PJé­ý³ð› I’$ISÉ ÈÆ HÁ l¼ªŸ}4úI¤7¸ë¢ð{ I’$ISÉ ÈÆ HÁ l¼ªîýBô“H¯~rkø=$I’¤©ddc¤`6^õnø`ô“ ”ÒúðO‡ßI’$I:Pa@6a@ aãUç·F?)J)ÝKß~$I’$é@„Ù„)„W­%/)¥F?+€ôú_Y~$I’$é@„Ù„)„_ÃǶD?+€ô†ß¿3üH’$IÒ2²1R0¿w®Œ~V «Ò:ùEá7A’$I’ö—AA‚AØøÕ[ûÞèg@)¥³ò·Âo‚$I’$í/ƒ0 ƒ0 ƒ°ñ«}Î룟¥”þM§„ßI’$IÚ_a@6a@ acØÄQ¥ôÛÑO ½jë†ø› I’$IûÉ ÈÆ HÁ l<«¾5úiPõÊ䢄ßI’$IÚWa@6a@ aãYÿÖ³¢Ÿ¥”Îùo ¿ ’$I’´¯ €l € ÂÆ³î¥ïˆ~Z”Rzë†ßI’$IÚWa@6a@ aãYëŒWE?-¶ÿÕÈo¿ ’$I’´¯ €l € ÂÆ·úÙG£ŸýV™œxNøM$I’¤½edc¤`6¾U[ÖF?/J)ís5ü&H’$IÒÞ2²1R0ßz7|0úyPJé]÷·á7A’$I’ö–AA‚AØøÖ¹ð­ÑÏ €RJuߺð› I’$I{Ë ÈÆ HÁ l|k-yI)õ0ú‰¤WwŸ.“ ¿ ’$I’´ga@6a@ aãÝð±-ÑO €RJûœ×‡ßI’$IÚ3ƒ0 ƒ0 ƒ°ñnpçÊè'@)¥wõ_…ßI’$IÚ3ƒ0 ƒ0 ƒ°ñ®·ö½ÑO €RJuÏá7A’$I’öÌ ÈÆ HÁ l¼Ûþ'ʈW·~T&~$I’¤lµ–ãwñýddc¤`6æMUJ¿ýÌ(¥´Ïþ—ñwA’$IãZ‹.Ǖ޺ùe°iUnÛ¼ãwñÉE/ÿŸ­©„Ù„)„Õ÷F?3J)½µ~$I’¤±iá‘¥½üØÒ]3¯ô7.+ÃGî(¥îõwñÖ‡~"þÞ†fdc¤`6þõo=+ú™PJÜ}iøM$I’FùO?vVŸPú7ŸVª­ꟈÞ:ýŸ†ÿÏßÔ Â€l € ÂÆ¿î¥ïˆ~f”RêÉmerÁaáwA’$Ijz­%/- ßRzë'Jµem©'›Ñïâí³~6ü§¦fdc¤`6þµÎxUô3`—öò׆ßI’$©Q-~aé¬8®ôÖÍ/ƒM«ÊpÛæRêzv?ûuñÿ{64ƒ0 ƒ0 ƒ°ÕÏ>ýÔ(¥ô¾ð_Ão‚$I’ÖÂ#K{ù±¥»f^éo\¶óO?V½9ÿ=¼ý‰7ÄÿïÞР€l € Âr´ýÏ+o°yMøM$I’U­¥Ç”ÎêvþéÇ®/¥ß ù=¼sÞo„ÿkÑÔ Â€l € ÂrÔ»áƒÑO €RJÝúQ™\pxø]$I’f»Ö’—”Î…oÙ9þÚ²¶Ô“•¦è¬<>ü_Ÿ¦fdc¤`–£Î…o~jìÒ>ûuáwA’$IšQ‹_X:+Ž+½uóË`Óª2ܶ¹”º.MÕ¹è÷âÿ5kha@6a@ ayþ[º¥F?7JÙñšEßI’$iÊ-<¢´—[ºkæ•þÆe¥Úº¡”ªWFI÷ÒwÆÿëØÐ €l € Âò4|lKôs ”RÝsEøM$I’öUké1¥³ú„úñëKé·Ê¨ë~î]áÿº65ƒ0 ƒ0 ƒ°< î\ýÜ(¥ÔíÇËä‚ÃÃï‚$I’´ýŸ(¾ãO?^ûþRmY[êÉmeõÖ¾7ü_ë¦fdc¤`–§íÿÏOš¡ýñ_ ¿ ’$IJÖÄQ¥}Îëwü óÁ¦Ue¸ms)u]2è]ýWñÿú74ƒ0 ƒ0 ƒ°<µÏùåèçÀ.þ)I’$Íi (íåÇ–îšy¥¿qY©¶n(eÐ-Yõ®ÿïñÿž44ƒ0 ƒ0 ƒ°DMUJ¿ýä(¥T[>$I’46µ–S:«O(½õ;ÿôcçÉè_y¥ÿ¥Åáÿ55ƒ0 ƒ0 ƒ°\Ußýä(¥Ô§vüS¢ï‚$I’F¯ÖÉ/.ÇíüÓw_Vêgþõ¶ñú>þï[S3²1R0ËUÿÖ³¢Ÿ»´Ïy}ø]$IRÃ[ôü㯫ÿ² îúl>~ô¯±#©ÿÕ³ãÿ½lha@6a@ a¹ê^úŽè'À.½ÿñÿ†ßI’$5¨…G”öòcKwͼÒ߸¬T[7”2èFÿÚ:ú·ÿïoC3²1R0ËUëŒWE?9v©îýBø]$IR\­¥Ç”ÎêJoýD©¶¬-uû‰è_QÇÖàösÃÿýnja@6a@ aùª'·E?;J)u÷é2¹ðÈð» I’¤¹¯uÊËJgåo•Þ vŽ¿ž}4ú×ÑT_??ü 45ƒ0 ƒ0 ƒ°|mÿ<Ð ísß~$I’4ËMµóO?^õž2Ø´ª ·m.¥Fÿê™ÚàÎ ãßEC3²1R0ËWïú¿‹~vì²ý›}$I’4³Zg¾ºt×Ì+ýËJµuC)ƒNô¯™ìa°éÓá朗„Ù„)„å«sá[£Ÿ»TÝ~$I’4õZK)Õ'”Þú‰ú±ýxô¯”LÁ஋ÂßNS3²1R0ËWkÉKü© €¦tËä¢ç‡ßI’$ýÃZ'¿¨tVWzëæïøÓõEÿöÈ4 ¾yIø{jja@6a@ a9>¶%úé°Kç·„ßI’¤ô-<²´—»ãO?n?· ·mö_¦#ƒÍkâßXC3²1R0ËÙàΕÑO€]ú_>5ü.H’$e«uæ«wŒ¿ú—•jë†Rè_ ™CÕ·® sMÍ ÈÆ HÁ ,g½µï~zì2üÞ×Âï‚$IÒ8×ZzLé¬>¡ôÖO”jËÚR·~ý+ ‡ØöߣßaS3²1R0ËYûœ_Ž~züذ*­S^~$I’Æ¡ÖÉ/*Ǖ޺ùe°iU©Ÿx(ú·= ºo]øÛlja@6a@ aI›8ª”~+úù°Kç¢$I’F­…G–öòcwüéÇÁíç–á¶Í¥ÔÃè_íh êþkâßkC3²1R0Ë[õð-ÑÏ€]ú_=;ü.H’$Ÿ~ì^ò¶Ò߸¬T[7”ÒoGÿLj¨¸>üý65ƒ0 ƒ0 ƒ°¼õo93úù°Ëð±-áwA’$©iã¯ÎêJoýD©¶¬-uëGÑ¿²1ª‡n ÓMÍ ÈÆ HÁ ,oÝKßýüØMëôŸ ¿ ’$Iµ]:+Ž+½uóË`ÓªúfQõí/‡¿ó¦fdc¤`–·Ö¯Š~~즻f^øm$Išó&Ž*íOü¥·öÏÊàΕe¸ížRêaô¯bŒ¹êá[âß~C3²1R0Ë]ýì£ÑO€]¶ÿ¢ÑwA’$i®þôcÿæÓJµuC)ývô¯]$´ýíEÿ,45ƒ0 ƒ0 ƒ°ÜU[>ýØ¥~ú»áwA’$i&µNû'¥ó™ß-ý›–”êþkKÝy2úW,ØÁŸŒÜwa@6a@ a¹ë]÷è'ÀnÚË^~$I’¦Rëä•Îùo*½kÿ¦ 6¯)õS߉þU ö©zèÆðŸ™¦fdc¤`–»ÎùoŽ~‚ì¦÷…?¿ ’$Iÿ …G–öòcKwͼÒ߸¬ ¹£”aý«LYõÀõñ?G Í ÈÆ HÁ ,y‹_XÊpý ØeûŸò ¿ ’$)}­¥Ç”ÎêJÿæÓJµuC)ývô¯I0#Õýׄÿ\55ƒ0 ƒ0 ƒ0 ðègÀ.u÷™29qTøm$Iyj-yié\ø–Ò[?Qª-kK=ùXô¯D0ëªû®ÿYkja@6a@ a|íÑÏ€Ýt>õëá·A’$i‹_X:+Ž+½uóË`Óª2ܶ^½ IDAT¹”ºŽþõæ\uïâþšAA‚A˜ºŸ{Wô3`7ý/-¿ ’$i ZxDi/?¶t×Ì+ýËvþéǪý«„¨¾uUüÏdC3²1R0S{Ùk¢Ÿ!»~÷«á·A’$^­¥Ç”ÎêvþéÇ®/¥ßŠþµcpÏçÂF›šAA‚A˜&VêÖ¢Ÿ"?6¬Jë”—ÇßI’ÔØZK^²óO?^ûþRmY[êÉmÑ¿Á@£ 6_þsÛÔ Â€l € ´½ê¾«£Ÿ"»é^|bøm$I iñ wŽ¿ÖÍ/ƒM«ÊpÛæRê:ú×)ƒo^ÿ³ÜР€l € ´½Þú…ÑO€Ý n?7ü6H’¤€QÚË-Ý5óJã²RmÝPJÕ‹þÕFÞ஋⾚AA‚A˜¶×Yy|ôS`7õ“[Ãoƒ$IšûZK)Õ'”Þú‰R=p})½Éè_C`, ¾±:ü罩„Ù„)„i{­“_\J=Œ~Žì¦½ìŸ‡ßI’4{µ–¼dçŸ~¼öý¥Ú²¶Ô“ۢ݀4w® ÿ45ƒ0 ƒ0 ƒ0ý¸á¶ÍÑÏ€Ýô¾ðçá·A’$M³‰£Jûœ×—Þºùe°iÕÎÿ{«®£½€´_??þ»ÐР€l € ÂôãwœýØMµåóá·A’$M¡…G”öòcKwͼÒ߸¬T[7”2èFÿ*ìfpûŠøoEC3²1R0Óë^ùîèçÀnêî3;þé"Ñ÷A’$ý¯µÎø™Ò½äí¥Ë¥úö—KéMFÿÚ@ÿ¶s¿MÍ ÈÆ HÁ L?®}ö¿Œ~Žì¡ó©_¿’$e®uò‹KgÅq;ÿôãÝ—•úÙG£=¦¡Ë™áß“¦fdc¤`¦ÿÙ‚ÃKÝy*úI°›þMKâïƒ$IYZôüÒ^ñk¥·î¿•Á]•áã÷Gÿ*Ì’þM§ÄcšAA‚A˜v¯zàºè' Àn†Ü~$IËQÚË-Ý5óJã²RmÝPÊ }ú9Ò»aAüw§¡„Ù„)„i÷ú_Zý$Ø]]—Öi?~$IõZK)Õ'”Þú‰RmY[êöÑW8„z×¼/ü;ÔÔ Â€l € ´{Oÿ»è' Àºkþ0ü>H’4JµN~qé¬8®ôÖÍ/ƒ»/+õ³?ˆ>ç@°Þþ<üÛÔÔ Â€l € ´{­S^¾ãŸF@s îúlø}$©±MµóO?^õž2Ø´ª ·m.¥FŸo aºW¾;þ{ÕР€l € ´gÃÞý,ØMÝ~¼L.<"ü>H’Ô„Zg¾ºt×Ì+ýËJµuC)ƒNô©F@÷ò?ÿ~55ƒ0 ƒ0 ƒ0íÙàΕÑÏ€=´Ï}cø}$éP×ZzLé¬>¡ôÖO”jËÚ#i€éè^üŸÂ¿iMÍ ÈÆ HÁ L{ÖýüŸF?Köпñ¤ðû IÒ\Ö:ùE¥³â¸Ò[7ÇŸ~¬Ÿx(úüc¤³úÿ ÿÎ55ƒ0 ƒ0 ƒ0íYûã¿ý,ØÃð»·…ßI’f­…G–öòcwüéÇÁíç–á¶Í¥ÔÃès Œ±Î¿ÿíkha@6a@ aú-<¢Ô½g£Ÿ&»«‡¥uê+âo„$IÓüÓÝKÞVú—•jë†RèË $³ýŸ@ý-lja@6a@ aÚ[ÕC_Š~šì¡{ù¿’$MeüÕY}Bé­Ÿ(Õ–µ¥ný(ú„”ö9¿þ}lja@6a@ aÚ[ý/(úi°‡Á7V‡ßI’v¯uò‹vüSwzëæ—Á¦U¥~âÁès °WÛÿLmô7³©„Ù„)„iou>ó»ÑO€=Ô­–ɇ‡ßIRÒ¹cPÑ]3¯ n?· ·mÞñ'FAëÌWÇGšAA‚A˜öVëÔWD?Mö¢ý‰7„ßIRž?ýؽäm¥¿qY©¶n(¥ßŽ>ƒÓÖZúÊðïjS3²1R0Ó¾>þ@ôó`½õ Ãïƒ$i<Ç_‹~¯ôo:¥T\_êÎSÑ'`Vµ–¼$ü[ÛÔ Â€l € ´¯›VE?Oö0üîmá÷A’4Úµ]:+Ž+½uówüοãO?Œ³ºö§×÷“AA‚A˜öU÷ª÷D?OöTKËí–$Mµ…G–öòcKwͼúqøÈ;n @&u÷éøïqƒ3²1R0Ó¾j/môó`/ºWüqø$5øO?®>¡ôo>­T[7”ÒoGŸ-€põÓß ÿ>79ƒ0 ƒ0 ƒ0í³‡•ºýxô`ƒ{>#$Iáµ–¼´t.|Ké­Ÿ(Õ–µ¥ný0úD4Òö?ýÍnra@6a@ aÚ_Õ}WG?QöP÷ž-“'=7üFH’]­ÅG—ΊãJoÝü2Ø´jǸ€©~gcøw¼É„Ù„)„iõ®ÿ»è' À^tV~#$IsÔÂ#K{ù±¥»f^éo\V†ÜQʰŠ>=#«ºÿšøo{ƒ3²1R0Óþêœÿ¦è' À^ô¿²<üFH’f÷÷îíã¯êá[Ké·£Ï ÀXÜ}Yøw¾É„Ù„)„i¿-z~)U/ú™°‡ú‰‡âo„$iÖª¾uUôi[ƒ;>þora@6a@ a:PÃï}-ú™°íå¯ ¿’¤Ù©úöMÑg`lõo93ü;ßä €l € Ât ú·~$ú™°½kß~#$I³Óð߈>+c«·~"ü;ßä €l € Ât ºŸýLØ‹jëÍá7B’4;ÕOn>+c«wõ_…盜AA‚A˜Të´ýLØ›aUZú‰ð;!Išyu÷éè«0¶ºWüqøw¾É„Ù„)„i*ÕO<ýTØ‹îåÿ9üFH’fØÂ#J©ëè“0¶¶ÿ“Ïÿõ Î ÈÆ HÁ LSiðÕÑO€½|óâð!IšY­S^}NÆZgåñáßú&gdc¤`¦©ÔýüŸF?Uö¢îTß~'$I_=¹-ú„Œ­þ‹Â¿óMÏ ÈÆ HÁ LSké+£Ÿ,ûRKË]—¤Ñjâ¨ßoæFoÝüøo}Ã3²1R0ÓÁV?¹5úÙ°Ý+ß~'$IS¯uÆÏDŸ€±Ö½ì÷ÿõMÏ ÈÆ HÁ LÛ஋¢Ÿ-ûPÝ·.üNH’¦^ûÜ_>c­³òøðo}Ó3²1R0ÓÁÖûÂ~¶ìKÕ/­S^~+$IS«{ñ‰Ñ—`¬µ?þKáßú¦gdc¤`¦ƒ­ýñ_Œ~¶ìGwͼð[!IšZ½uÿ-úlŒµÖ‡:ü[ßô €l € ÂtÐ-<¢Ôݧ£Ÿ.ûP}ëªø[!IšRý §GŸ €±6¹èáßú¦gdc¤`¦éTÝwuôÓ`_Ò:ùEá·B’tàw_}5ÆVÝ}&ü;? „Ù„)„i:õ®û@ôÓ`?º—¾3üVH’Üð{·GŸ €±5|lKøw~2²1R0Ótj¯øµè§ À~ 6_~+$I®ný0údŒ­êÁõáßùQÈ ÈÆ HÁ LÓjâ¨Rú­èç À¾ô[erñ ãï…$iŸmÿó¾ÌÁ¦O‡ëG!ƒ0 ƒ0 ƒ0M·íÿM[š«{ñ ¿’¤}×>ûuѧ`¬õo>-ü[? „Ù„)„iºõÖOD?_öcp×gÃo…$ißu>ó»Ñ§`¬õÖÍÿÖBa@6a@ ašnóßý|غûL™<éyá÷B’´÷¶˜;Ý‹O ÿÖBa@6a@ ašv'=¯”A'ú °Ûÿé3á÷B’´×ú_Y}&ÆZûÜ_ ÿÖBa@6a@ ašIÕÖ›£Ÿ0û1øÆêð[!IÚ{Õý×FŸ €±Ö:ãUáßúQÈ ÈÆ HÁ L3©Ó’è' Àþlä¢ç‡ß IÒ?¬~êáè30¾êºLžôÜðoý(ddc¤`¦™ÔYy|ôຟ~/$I{´è¥ÔÃè0¶êÉÇâ¿õ#’AA‚A˜fRkñÑ¥Týèg À~ 6_~/$IÿkíÿRôykÃïo ÿÖJa@6a@ ašiÃïÞýŒØŸA§´N~qø½$ý}ÝKß}ÆZuߺðoý¨ddc¤`¦™Ößpzô3ທÿAø½$ý}½õѧ`¬ n_þ­• €l € Â4Ó:«Oˆ~Æ@uïÂï…$éï|óâèÓ0Öú7. ÿÖJa@6a@ aši­%/-eXE?eö§ê•Ö)/¿’¤ ·m޾ c­{Õ{¿õ£’AA‚A˜f£á÷7E?e {å»Ãï…$é•É“ž[Êp}ÆZç·ÆïG$ƒ0 ƒ0 ƒ0ÍFýË¢Ÿ2P=xCø½$ý£Ò>çõÑ'`ìµ?òsáßûQÉ ÈÆ HÁ L³Q÷³ÿ1ú)p õ°´–¾2üfHRöºWüQôEoõpÇ?1ú{?*„Ù„)„i6j}è—R×Ñπ譛~3$){ý[ÏŠ>c­~ú{áßúQÊ ÈÆ HÁ L³ÕpÛ=ÑÏ€~ïká÷B’²W=¸>úŒµjë†ðoý(edc¤`¦ÙªÛ9ÑÏ€)hô_„ß IÊ\=ùXô)kƒMŸÿÖRa@6a@ aš­º—¾3ú90ý›N ¿’”µÖ?}Æ^ÿÆEáßûQÊ ÈÆ HÁ L³Uké1ÑÏ€)¨Ÿz¸L.8<ünHRƺ—¼-ú Œ½îþ½¥ €l € Â4› ¿?úI0óþMøÍ¤Œõ7œ}Æ^çü7‡ïG)ƒ0 ƒ0 ƒ0Ífƒ;΋~ÒLÁöïuôͤŒUß¾)úŒ½Ö¯ ÿÞRa@6a@ ašÍºkþ0úI0u÷é2¹èáwC’RµàðRwŸ‰>ãm8(“ ŒÿæPa@6a@ ašÍ¶ÿ·p ÝKß~7$)Sí³_ýé{õ…ïG-ƒ0 ƒ0 ƒ0Ívõ“[£Ÿ5SPÝûÅð›!I™ê^ù'ÑŸ~€±W=tcø÷~Ô2²1R0Ól7Øôéèg ÀT ¥uÚO†ß IÊÒàöÑ_~€±7øúáßûQË ÈÆ HÁ L³]÷Š?Š~ÖLQïš¿¿’”¥áïþìŒ½Þ  ÿÞZa@6a@ ašíZþgÑÏ€)Ú>Nˆ¾’”¡íÿDÆR×ÑŸ}€±×½ämáßüQË ÈÆ HÁ LsÑðñ¢Ÿ6SÔ>÷áwC’ƽíæ^ûc¿þ͵ €l € Â4 n_ý´˜¢ÁŸ ¿’4îõ¿zvôç`üÕÃ2¹èáßüQË ÈÆ HÁ LsQ÷²ß~ÚLQÝ{¶´~;$iœþà®èÏ=ÀØ«Ÿüvø÷~3²1R0Ó\Ô:õ¥Ôuôó`ŠºŸ{Wøí¤q­uÊËvüSk˜[ÕýׄóG1ƒ0 ƒ0 ƒ0ÍUÃm›£Ÿ7STmÝ~7$i\ë\ô{ÑŸy€ú?þÍŠ€l € Â4Wõ¿²<úypÚýùðÛ!IãXÿ¶GâRè­ý³ðoþ(fdc¤`¦¹ªóÙÿý¼8ý›O ¿’4Ž  úBç‚ß ÿæba@6a@ aš«Z§¼¬”aýĘ¢úÙ”ɉ£Âï‡$Síü\ôç Öé?þÝŠ€l € Â4— ¹#ú‰pºŸ~;$iœê}ñ/¢?í9ô&Ëä‚ÿû£˜AA‚A˜æ²þ†Ó£Ÿ8¡zð†ðÛ!IãTuï£?í) ùzø7T3²1R0Ó\ÖYõÛÑO€ƒQ×¥½ì5á÷C’Æ¢‰ç”º÷lô— …Á]Ÿÿîha@6a@ ašËZ‹.¥êG?sBÿÖ³Âï‡$C ~3ú“FoýDøwT3²1R0Ó\WmÝýÌ8uû‰2¹èùá÷C’F½þW–GÒÒè^úÎðïþ¨fdc¤`¦¹nûK€ÑÒýÜ»Âï‡$t +õS߉þœ¤ÑþØ¿Šÿöha@6a@ ašë:+Ž‹~æ¤áw¿~?$i”kâ ÑŸr€<ª~™œxNø·T3²1R0Óœ·ðÈRwžŠ~ê¤ö9¿C$iDëùCÑŸq€4†~3ü»?ʄل)„éPTmù|ôSà îøTøý¤QmøØ·¢?ãi îº(ü»?ʄل)„éPÔûâ_D?uV¿]ZúÇá7D’F­ö²ýH¥wíûÿý£œAA‚A˜Eíþ|ôS`z×} ü†HÒ¨Õ»îo£?ß©t>ýï¿ý£œAA‚A˜UõS߉~î¤ú™GÊäÄQá7D’F©á£ßŒþ|¤Ò:ýŸ†ûG9ƒ0 ƒ0 ƒ0ª_¿ ú¹0 ÝKß~C$iTj/môg •ºýxø·Ô3²1R0Ó¡ª{Ùÿýܘ†áw6†ßI•ü‡ê‡VõЗ¿ý£žÛdc¤`¦CUëÔW”R×ÑO€ihòWÂïˆ$5¾‡û3é‡Xÿ+Ëã¿ÿ#žAA‚A˜eÃ|#úÉ0 ƒo|&ü†HRÓëœÿæèÏ5@:Ý«þKø÷Ô3²1R0Ó¡¬¿áÃÑO€é¨z¥µô•áwD’šÜàŽó¢¿Öé´Ï}cø÷Ô3²1R0Ó¡¬³òøè'À4õo>-üŽHRc[ôüRwžŒþTäRKkñÑñ7`Ä3²1R0Ó!í¤ç•ÒoG?{¦¡î>]ZK^K$©u×Ì‹þL¤3|üþðïÿ8ddc¤`¦C]õÀõÑÏ€iê]û7áwD’šXµuCô' êž+¿ÿãAA‚A˜u½kÞý옦úÙGwüÓ£o‰$5©öGÿE)uý‰H§wý߅߀qÈ ÈÆ HÁ L‡ºöÙ¯‹~öÌ@÷Êw‡ßIjRý¯,þ4¤ÔYy|ø ‡ €l € ÂQýÔw¢Ÿ>Ó4üá½erÁáá·D’Ѣ痺ýDô§ Ÿº.­ýDüƒ €l € ÂÑàŽó¢Ÿ>3Ðùì¿%’Ô„ºŸ{Wô' ¥ú‰ÃoÀ¸ddc¤`¦ˆºŸýô˜áw¿~K$© mÿpè î¾,üŒKa@6a@ aЍµä¥¥ ÑÏ€è¬<>üžHRdOýëèO1@Z½kþ:üŒKa@6a@ aŠªzø–èçÀ ¿³1ü–HRdÕ·®Œþ¤Õ9ÿMáw`\2²1R0ST½D?f¨sÁo†ßIЍuæ«KVÑŸa€œêaiüâð[0.„Ù„)„)ªö'Þýü˜¡êá[Ãï‰$EÔ¿íœèO0@ZÃǶ„ßqÊ ÈÆ HÁ La-8¼Ô“Û¢˜¡ÎùoŽ¿)’tkòòRz“ÑŸ_€´›>~ Æ)ƒ0 ƒ0 ƒ0E6¸ë¢èf¨zø–ð{"I‡²Þú…ÑŸ^€Ôzëæ‡ß‚qÊ ÈÆ HÁ L‘u×Ì‹þ`tÎSøM‘¤CÒâú§Üë¬8.þŒQa@6a@ aЬuêÿVJ=Œþ1`††ß½­L.8,ü®HÒ\×»öo¢?¹¹ «ãÜè{0N„Ù„)„)ºá#_þ1`t>ó;á7E’æ²Öâ£K=ùXôç µáî ¿ã–AA‚A˜¢ëéäèfÁðÑ»ËäÂ#ÂïŠ$ÍU½ëþ6úS ÞàkŸ ¿ã–AA‚A˜¢kŸûÆèfIw͆ßIš‹üÓÁš¡»f^øM· €l € ÂÞ‚ÃKýì£Ñ? Ì‚úÉ­eò¤çÆßIšåz×ÿ÷èO,¥”Ö™¯¿ ã–AA‚A˜šÐ`ÓªèfIï‹~W$i6k-yI©ÛG^Ò«ŸýAøMÇ Â€l € ÂÔ„º—¼=úG€YROn+­“_~[$i¶êß|Zô§€RÊ`óšð›0Ž„Ù„)„© µN~q)U?úÇ€YÒÿò©á·E’f£Ö¯*eЉþ¬°ýŸD{õ_†ß…qÌ ÈÆ HÁ LM©zèKÑ?Ì–ªWÚgýløm‘¤™6øæ%Ñ_Tviâ áwa3²1R0SSê]ó×Ñ?Ì¢ÁÝ—…ßIšIísßXJ]GNØ®ß.“Ï ¿ ã˜AA‚A˜šRû£?ýãÀ,ëœ÷á÷E’¦Õ‚ÃJõð-ÑŸQv©º1þ6Œia@6a@ ajRÃÇïþ‘` ¿g™\pxø}‘¤ƒ­{ÙïGBØMÿK'‡ß†qÍ ÈÆ HÁ LMª¿ñ£Ñ?̲îçÞ~_$é`j->ºÔO}'úó Àn:«~;ü>Œka@6a@ ajR•ÇGÿH0ËêÖKëC?~c$iªõo=+úÓ Àîêaiò²ðû0®„Ù„)„©QôÜRwŸ‰þ±`– ¾ö‰ø#IS¨ý±_(e8ˆþl°›á£ß ¿ãœAA‚A˜šVõ­+£,˜mõ°´?ù†ßIÚo (Ãï}-ú‹ Àü— æ6ƒ0 ƒ0 ƒ05­î•ýcÀ~ÿÎc‹è;#Iûª÷Å¿ˆþT°ÝË~?üFŒsa@6a@ ajZ­S_QʰŠþÑ`ôÖÍ¿3’´·ZK)uç©èÏ${ªëÒòÿ»šÓ €l € ÂÔĪÿ¿½{¶´®ï;î  ˆÄ Q«Q‹IÔFck£¹4š{4éJ¬íJcbb´¶&&­65­Ñ–zf†á6ˆÜPQA¹ßÁaœ‚ (0\•á®"0 ³Ÿ}}öóíšcŒ\fàœ3çœïÞû÷z­õþ£kµ]Ëx~Ï“ßÇsî¼4ûh°šî¦¨xyú{F’žX}ã™ÙH¶bxÿuéïˆIÏ (APƒ0b½ >š}4X õwÏMÏHÒcó'ËFWÿ²ƒÓß“žAPƒ0 aÅÚŸ|uöÑ`uO}Oú»F’¶T}â§§{!£©sü;Òß“žAPƒ0 aÕ†?¸9ûx°@šÎƨxYú»FRáM-úö‹³’YXÒ IDAT‰l˰Žjïçç¿/&<ƒ0 4a@ Â4ªù 0Ùê›ÎN×H*»Þ×þOö£€§0¼ëŠôwE ùþ”Æ (‚A˜FµöÑoÎ>,°îIïJßH*³öÿ:¢îe?x ýKöM_”APƒ0 aÙ¦–F³ùþì#ÀjÚEuÀËóß9’Êjåsbøý²<αoËgAPƒ0 aåW“}DX`õí—L€³ß9’Êipõ²}<º­=wIg”APƒ0 aå:ǽ=ûˆ°zç$ý#©Œzç|0û‘À Ô·}=ýQJa@i €"„i¤[ñ¬hºfZÝö§~)ÿ½#i¢kú—#Ýì'3лp*ý½QJa@i €"„iÔ«o8=û˜°†ÜèÏIZ°ª}~2šGîÌ~Ô0C£ß’þî(%ƒ0 4a@ Â4êuOûOÙÇ€E2øÎ±éïIØÔÒ¨o9?ûÀ 5½ÍÑZ¾Sþû£ €Ò„E0Ó¨Wíóˆá û¨°Hºg¼?ýÝ#i²ê_²Oö£ €Y¨o<3ýÝQRa@i €"„iªo]›}TX,ƒN´|cú»GÒdÔ=í}ÙO5f©{Ö_§¿?JÊ (APƒ0C½³ÿ[öQ` º%ª½Ÿ—þþ‘4Þu>óƒnö# €YªÜ=ýRRa@i €"„iªöiD3Ì>.,¢ú†Ó£5µ$ý$i[Böã €í0¸á´ü÷I„¥1Š`¦qªwÁG³ I†w_­•ÏIIÁ¦–ÄàÊ£²Sl§îïϧ˜APƒ0 a§ªOütö‘ Q}óW¢µlÇô÷‘¤Ñª¿nuöã €íÕ4Qð²ôwJ‰„¥1Š`¦qkxïÕÙÇ€Dƒ+NIúïýX`l¹ëg¿SJÍ (APƒ0[½ ?ž}lHÖûÚÿNIʯ·fìÇó¤É>éï•R3JcÁ LãVûà‘}lÈÖ4Ñ=óéï$Iyõ.øXö“€yÔ9æ×Òß-¥f”Æ (‚A˜Æ±á÷oÈ>:dÖÑ=éOÓßI’¹©%Ñ¿ü°ì'󨩌ֲóß1…f”Æ (‚A˜Æ±þ×WfFAÝÎÿ ý½$i‘Z¶C ¾óùì'ól˳=ýSpa@i €"„iköúì£À¨è·£óÙßN7IZà–?3ןšýÄ`t¾ôïóß3g”Æ (‚A˜Æµá÷¯Ï>>ŒŠ~cß–þn’´@í¹KÔßûjö“€…ÐkEkÏgç¿k Î (APƒ0k½ §²£¤îùíÒVíÿÒÞý­ì' dËoÌ~×”žAPƒ0 a×Úýlöñ`ÔÔ½è~ùÒßQ’æ§öaÿ2šwd?YX@ÝSÞþ¾)=ƒ0 4a@ Â4Î ï¹*û0j†µ°(M@Ïÿ~4ÝMÙORÝjÕ Òß9¥g”Æ (‚A˜Æ¹ÞùŸ}„ÕQØ©ïMOIš[Ý3?1d?IX`õ-ç§¿sd”Ç (‚A˜Æ¹êÀÝ#š&û0ª£°ÓÞ—þ®’4‹–íýËÏ~z°HºgýMþ»Ga@q €"„iÜ«ï¼4û0ªš¡Ð(IÕþ/úö‹³Ÿ,–f8ýìÏ~ÿÈ (APƒ0{½sÿ6û0âú—­©%éï,I[¯ó™ßŒæÑ{³,¢-ÿrWöûG?Ì (APƒ0{Õ~/™þ³`ðTW!ZËwJoIzLSK~8î¯ûÙYïü俇4APƒ0 aš„ê[×f%Æ@½aMT{=7ý½%éQíý¼¨o8=û±@’öÁ¯I釄¥1Š`¦I¨{æ²cbxÏ·§»dö»K*¹ö§%šwd?H2¼}ú»H?Î (APƒ0MBÕªÝ"ê^öq`L4oö!?—þþ’ŠkÙŽÑ»àcþD$@ázköÈ'éŸ2JcÁ L“RýÝó²c¤i?c~=ýý%•RûÐ×Å𞫲># }ЫÒßKúqa@i €"„iRêžòÙÇ €qÓoG÷Ô÷¦¿Ã¤‰njiô¾ú¿"ìÀÞuEþ»IË (APƒ0ML+ŸMosö‘` ®<*ZËŸ™ÿ.“&¬êÀWF}Û׳8#¤wÞ‡ÓßOz|a@i €"„i’\ýÅì#À˜ªïüQíÿÒôw™4-Û!zç|(šî£ÙG€QÒ £:àeùï)=.ƒ0 4a@ Â4Iu>ÿ{ÙG €1Ö´ˆÎg;ý}&sí#ß8ýçÀà‰êÛ.JOéÉ„¥1Š`¦‰jji4›îÎ>VŒ³á z|,ÿ&YÕÞÏþeG ëìS Àˆêžùô÷•žœAPƒ0 aš´úëVg+&Àຓ¢Zµ[ú{Mù¦–D÷´÷Mÿ†=ئºÕ>/ÌoéI„¥1Š`¦I«}ø²¢yôžè|þ÷ÓßmÒ¨Ö>ü_E}Ç7²*c þî¹éï-m=ƒ0 4a@ Â4‰ ï»6ûh0)š&W­•ÏI¿I£RuÀ˧υ? ÀLuOù‹ô÷—¶žAPƒ0 ašÄzçÿ}öÑ`Â4ßc~-ý'eV­Ü5zk—GôÛÙG€q2èDµ×sÓßcÚza@i €"„i«x™ßXÀü¢ÑŠh-fú»NZÔV<+z_ýŸÑ´Ê>…Œ¡Áõ§ä¿Ë´Í €Ò„E0Ó¤VoøZöñ`B ¸1:Ÿûôw´àM-î)ïŽfãíÙÇ€1Ö=á?æ¿Ó´Í €Ò„E0Ó¤Ö=õ½ÙÇ € WßtvT«_‘þΓdvâ;§Ç°=¶üvÉ-¿i2ýݦmf”Æ (‚A˜&¶•ω¦·9ûˆ0éz­è­]îÏHj2ZþÌèžúž>ø½ì“À„èóÐü÷›ž2ƒ0 4a@ Â4É ®9>ûˆPˆá}×Fç˜_K÷Isjås¢wÞßEóè=ÙG € Ó>òùï9=ea@i €"„i’ëûÖì#@Iš&ëOŒöÁ¯IJ3©Zµ[ôÖìMëìÓÀ„æ³ßuzú €Ò„E0ÓD7µ$š‡oÍ>f”¦Æàº“£úÄÏä¿ ¥­Ô>äç¢ÙÁÓòJï¼§¿óôô„¥1Š`¦I¯·vyö1 Tu/W•ÿ}K£ÐÔÒè÷ö¨7¬™þmv° ê~Tû¾(ÿý§§Í (APƒ0MzÕêWD ëì£@Éz­èc¿¨ö~~ú{QåUíûâè]ð±h¹3û$Pú†ÓÓßšYa@i €"„©„ê _Ë>jMû¡è_¼Êo Ó·l‡è|þ÷bpí—"Ýì} Ô9þùïCÍ(ƒ0 4a@ ÂTBÝ“ÿ,û¨Àãÿ”äÕ_ˆöaÿ2ý©Éª}ÈÏMÿ¹ìfãíÙ?å¬Ù|´–ï”þ^ÔÌ2JcÁ LE´bçhÚg7x’úŽuÑ9îíÑšZ’ÿ¾ÔX¶åO‘vÏüÀôÏŒ‚þºÕéïGÍ<ƒ0 4a@ ÂTJýËË>n°MÃû®‰î©ï1g¿35í¹KtOøã¨o8}ú7ÎÀ(iúóùïJÍ8ƒ0 4a@ ÂTJí#ߘ}Üài5GbpåQÑ9ú-éïNX{î2ýÛä¶ü¹Ñ¦·9ûG¶jx×ùïLÍ*ƒ0 4a@ ÂTRÃ{¯Î>r0cÃû×Gï¼GµÏ ÓߡʩÚ÷EÑ=ã/£þîy~c¡{Öߤ¿?5» €Ò„E0SIõ¾òß³Ì^Ý‹Áõ§Fç¸?ŒÖ²Òß§ZØÚ¿&zçþmÔ·}=bXgÿôÀŒ5ÝG£Úë'Òߥš]a@i €"„©¤ªU»E :ÙÇæ¬i?4ý'»'¾3ª•»¦¿[5ÿûÉÊ]£sì[£ÙÁÑ<|[öÌÙà[ŸJ¯jö„¥1Š`¦Ò¬?1ûØÀüè·£¾éìèžúž¨ö~~ú;V3lÙÑ>òMÑ»àcQoXQ÷³’`^´ø…ü÷¬fAPƒ0 a*­Îç/ûØÀü«{Qï«Ñ=óQøÊô÷­Óò¢ýé_‰Þyõ §GÓ~8û§æ]}ç¥ùï\Í)ƒ0 4a@ ÂT\SKbøà÷²,¨æÑ{bpÝÉÿ8Û=ÿý[àŸ€ì­]>ýÜšÎ#Ù?°à¶üÆÒìw°æ–APƒ0 a*±ÞÍ>z°¨†?¸9úWÝßÕ¾/JOLËvŒö!¯î)ïŽþGÄð¾k#šaöݰ¨šêÁh­Ø9ÿ½¬9e”Æ (‚A˜JlË?A7ûø@ަ™þm™ƒõ'N¤·ü6«jÕnéïçQ¯Zõ‚è|ö·¢wî߯àÛŸá=WE :Ùÿm@ºþºÕéïiÍ=ƒ0 4a@ ÂTjƒk¿”}ü`¤4ïˆú†Ó£wáÇ£óÅ?ˆê€—¥¿¯SÚs—höúèžø'Ñ¿xUÔ7ŸÍ#ÿý_Œ¦¦‰öA¯Êk΄¥1Š`¦Rë|æ7²Œ¾A7š‡ozÚ\yTô.øXtŽ{{TŸø™h-Û!ý}¾=¿í«}䛦ÿ„æ–ÿL[þ³mùϸå?«?ù3WoøZú{]Û—APƒ0 a*¹á÷¯Ï>‚0¾ê^ psÔ·œƒkŽ‹þ¥EoÍÑ=ãýÑ9þÑ>úÍÑ>ø5Qíý¼…¯¯Ø9ª^íÃßÏýntOzWôÎùPôÖ.þå‡ÅàÚ/G}ëÚ>´!¢îgÿO&F÷Ë”~·×öe”Æ (‚A˜J®÷•ÿž}  u/šÍ÷Mÿ®áC·Ä𞫦«oûúôoæÚòg׃õ'Lÿ¶®ÁUÇüðÿ|ÝÉQßtöÿïlXû¿õÃÿ·÷]3ýÿ×–?s½Vö:(R³éîh-Û1ýn¯íË (APƒ0•Ü–ßXâ"ÀìmùMœÙ÷zma@i €"„©ôW}&ûÀx©{QíÿSéwzma@i €"„©ôÚŸú¥ìccepõÒïóšŸ Â€Ò„E0“žÃ{®Ê>Š06ÚGüBú]^ó“APƒ0 aÒ3¢{Æ_fE õm_O¿Çkþ2JcÁ LzF´öÜ%šöÃÙÇF^çøwäßã5o„¥1Š`&ý°þegGiÇn‰ÖÔÒô;¼æñ{ˆAPƒ0 aÒkôªˆf˜}$`dõÎù`úý]ó›APƒ0 aÒ«o>'ûHÀHj:£Z¹kúÝ]ó›APƒ0 aÒëû¶ì# #iËp(ûÞ®ùÏ (APƒ0éñ ï_Ÿ},`´ Q­þçéwvÍa@i €"„I¯{ÖßdK)ƒk¿œ~_×Âd”Æ (‚A˜ô„öÜ%šêÁì£ #£ýé_É¿¯kA2JcÁ Lzrýu«³&Œ„úŽué÷t-à7ƒ0 0a@ ¤'W¸{Äp}< ]ç‹~O×Âe”Æ (‚A˜´õ7œ–}< Õð¾k¢5µ$ýŽ®…Ë (APƒ0iëu>ó›ÙÇRuOü“ôû¹6ƒ0 4a@ ¤m·åß„€ Ú­e;¤ß͵°„¥1Š`&m»îéÿ%ûˆ@ŠîïO¿—ká3JcÁ LzŠVìMëìc ‹ªÙtW´–?3ÿ^®Ï (APƒ0é©ë­]–}L`QõÎýé÷q-Na@i €"„IO]µj·hz›³*,Цz0ª•»¦ßǵ8„¥1Š`&=}ýoš}T`Qô.üxú=\‹øÍà (ŒAPƒ0éé«|eÄp}\`A5ÝMQ­zAú=\‹—APƒ0 aÒ̬?1û¸À‚êc¿ôû·7ƒ0 4a@ ¤™Õ>òMÙÇN¿ŠÊw¢â2JcÁ Lšyõ­k³,,ˆþºÕé÷n-~a@i €"„I3¯ó…›}d`þõZQíûâô{·?ƒ0 4a@ ¤Ù5¼÷êìc óªñªôû¶r2JcÁ Lš]ÝSß“}l`Þ4G¢Zµ[ú}[9„¥1Š`&Ͳå;EóÈÙGæEoíòü»¶Ò2JcÁ Lš}½¯þÏì£ Û­élŒjÕ ÒïÙÊË (APƒ0iöU{ýD4퇳/l—Þš=ÒïØÊÍ (APƒ0inõ/Ú3ûøÀœ5Õ¦ÿ…§ìûµ’¿o„…1Š`&Í­jïçGÓy$ûÀœôÎÿHúÝZù„¥1Š`&ͽþ%ûfa˜µfó}ÑÚs—ô{µò3JcÁ Lš{Õ>?Mosö1€Yéû·éwjFa@i €"„IÛWÿÿ˜}Œ`ÆšGîŒÖŠÓïÓ €Ò„E0“¶¯j¿—DôÛÙGf¤{ê{ÓïÒ €Ò„E0“¶¿þå‡eexZÃû®ÖÔÒô{´F'ƒ0 4a@ ¤í¯:àåu/û8ÀSê|þ÷ÒïЭ €Ò„E0“æ§Á•Gggئú¶‹Òïν €Ò„E0“æ§êÀÝ#ê~ö‘€'k†Ñ>òéwg^a@i €"„Ió×à;ŸÏ>Òð$ƒ«¿~gÖhf”Æ (‚A˜4µzUÄp}¬àÇéßj}gÖhf”Æ (‚A˜4¿ ®ýRö±€Ò_·:ý®¬ÑÍ (APƒ0i~kòÕ~K#¡i?ÕªÝÒïÊÝ Â€Ò„E0“æ¿Á·?›}´ z_ý_éwdva@i €"„Ió_uàîƒnöñ `ÍÆ;¢µbçô;²F;ƒ0 4a@ ¤…©ùaÙÇ€‚uO|gúÝX£ŸAPƒ0 aÒÂTí÷’ˆ~•}Ä(P}ǺhM-I¿kô3JcÁ LZ¸|T`Ñ ëhþ†ô;±Æ#ß.€Ò„E0“®jÕ ¢élÌ>æ¤ùáé÷aOa@i €"„I [oíòìc@!šöCQíóÂô»°Æ'ƒ0 4a@ ¤…­Z¹k4­ïgu Ð;û¿¦ßƒ5^„¥1Š`&-|½ >š}Ô˜pÃï_­e;¦ß5^„¥1Š`&-B{>;šMwgw&X糿•ÿÕØe”Æ (‚A˜´8õÎùPöq`B ÖŸ~ïÕxf”Æ (‚A˜´H-f4ß–}ä˜4ý*ªÕ¯È¿÷j,3JcÁ LZ¼º'½+ûÈ0azN¥ßw5¾„¥1Š`&-bSKbx×ÙÇ€ 1|hC´ö|vþ}Wc›APƒ0 aÒâÖ>êW#š&ûè0:Çýaú=WãAPƒ0 aÒâWßxFöÑ`Ì ®ýrúýVãŸAPƒ0 aÒâ×>ø5u?ûø0¦šî¦¨öÿ©ôû­Æ?ƒ0 4a@ ¤œú—ž}üSݳþ&ý^«ÉÈ (APƒ0)§jßEÓy$ûÀ˜ÞuE´¦–¦ßk5„¥1Š`&åÕ[³Gö#€q2Dûð•~ŸÕäÔ_w@öO5À¢2Š`&%¶bçh¹3û1À˜Ø2ÞI¿Ëj¢ê_zPö5À¢2ŠÐÚï¥éž¤’ëžöŸ²ŒfãÑZùœô{¬&«þGdÿh,*ƒ0 ­Õ»§x’Šnji ï¹*ûQÀˆëÿŽü;¬&®ÁUŸÉþÑXTa@ªO¾:ýÓTzÏþvö£€6¸þÔô»«&³Á5Çeÿx,*ƒ0 Õ¡¯Oÿð$éQßtVöã€Ôt‰ê€—¥ß[5™ n8-ûG`Q„E¨ŽüÅôO’žíƒ~6bÐÉ~$0bº§ÿ—ô;«&·úö‹³Ä•AP„öçÞšþáIÒë_¼wö#€RoX­©%é÷UMnÃïßýc°¨ €"tNzWú‡'Iÿ؞ώfãÙF@ÓÝÕêžWÕD×l¾?ûG`Q„EèžýÁôO’~\÷Ä?É~,0ºgþUúUÞÔÒˆºŸý£°¨ €"t/\–ÿñIÒãªo»(ûÑ@¢zÃ×ü©H-xÕ/ÏþQXta@úßútúÇ'I¯}èëüº…ò§"µXuŽùõìw€EgapËéŸ$=¹þe‡d?HÐ=óéwR•Q÷Ô÷fÿ¸,:ƒ0 õƒßKÿø$éÉU{??šÖ÷³,¢úÖ ý©H-Z½µË²äAP†A/ZSKÓ?@IzrÝ3ÞŸý„`±ôZÑ>ègÓï¢*§Áu'eÿÔ,:ƒ0 ­_™þJÒVšZû®È~D°zgÿ×ü{¨ŠjøÀÙ?ö‹Î (Fû¸—þJÒÖkú—#šaöc€ToXãOEjq[±sİÎþÑXta@1ºkþoþG(IÛlpÕ1Ù HS=Õ/K¿{ª¬ÚG¾)ûG …APŒþú“Ò?BIÚvժݢÙ|ö£€Ð=éOÓï*¯ÞÙÿ-ûG …APŒúÁ[Ò?BIzêº'ÿyö£€y6øÎ±é÷M•Ùàšã³üR„EiíûÏÒ?DIzê꛿’ý¨`ž4ßÕ^ÏM¿kªÌšwd€a@QÚ_úé¢$=uÕ»GôZÙ ¶W3ŒÎg~3ýž©2«xYö Hc¥·nuúÇ(IO_ï‚e?.ØNý¯¯L¿_ªÜº§¾7û¤1ŠRßõ­ôQ’fÐòbxßµÙ æhx×Ów»ôû¥Šm°þ„ìcÆ (Ëp­}^”þAJÒÓ×þô/G ëì§³ÕkEûà‘~¯TÁ-Û!šêÁì“Æ (Nç¤?Ëÿ(%iFõ¯8"û‘À,uÏü«ôû¤Ê®}ô›³@*ƒ0 8ý«Kÿ(%ifU{=7šMwg?6˜¡ú¦³Òï’Rÿûg€Ta@q†­Äæ©Ò?LIšYÝ/ÿQöc€hù‡¨öùÉô{¤ ojI4oÏ>© €"µ?÷»ù§$͸úÆ3³<•á :G¿%ýþ(µúÕìÓÎ (ÒàÊcÒ?NIr5ðµ IDATšyÕêWDÓÝ”ýè`z|4ýî(m©é'³@:ƒ0 HMûáØ¼l§ôT’f^÷Ì¿Ê~t°õwÏ‹ÖÔÒô{£ÔZ¾S4Þ›}$Ò„Åj÷öüT’fÞÔ’¨o9?ûÑÀc4›îŠjŸæß¥-ÿ2Ù œ}$F‚AP¬Á g¤¤’4»ªýjú7ü0†ƒèóëéwEéGÕ·\}*F‚AP®z­ý_–þ¡JÒìêžþŸ³ŸDDïkÿ;ýŽ(ý¨ê?Ñ ³ÀH0ŠÖ½p*ýc•¤ÙWßxFöã hõ÷¾­©¥é÷CéGõ/;8ûXŒ ƒ0 hÃGîŠÍËvLÿ`%ivùÓ‘yšMwGµï‹Òï†ÒªV½ šÞæì£02 €âuN~wúG+I³¯{ê{³åÖÑùÜï¤ß ¥ÇÖ[ó³OÀH1ŠWß{M´¦–¤¸’4ûê›ÎÊ~„¥wÁÇÒï‚ÒãÚóÙÑl¾/ûhŒƒ0€ˆhî­ù¯$ͺ-¢¤i=ý(B}ãþ¥:\½ó?’}4FŽA@D n_—þñJÒÜêžüçÙ€‰7|নöznúPzlÕÊ]£i}?ûxŒƒ0€Ô>ömé±$Í­Áõ§d?B&VÓ}4Ú‡¼6ýî'=±Þ…SÙÇ`$„ü£ú®où³Ò˜VíûbÿF0ÀBh†Ñ9þߥßû¤­~ è<’}BF’AÀc´¿ôÒ?fIš[ãþ0¢i²#¥ÑŠôûž´µW}<F–AÀcÔnˆÍËŸ™þAKÒÜêóÐìÇÀĨo>'ZSKÓïzÒkñ Ã:ûˆŒ,ƒ0€'èžÿ÷éµ$ͱ;ÇðþõÙ€±7|ð{Qíýüü{žôĦ–D}Ǻì#0Ò Âž`Øy4Zû½4ÿã–¤9Õ>ôuývö£`l5½ÍÑ>ìõé÷;ikuÏúëì#0ò ¶¢Í—Ò?nIš{½s>”ýOMÝß™~¯“¶VµÿOEÓy$û”Œ<ƒ0€mhñÒ?rIÚŽ?qó9Ù€±Ó¿dßü;´êÏÌ>"cÁ `†ÿ!Z+"ýC—¤¹Uíûâh6ß—ý(õ §Gkjiú}NÚZÝSþ"ûˆŒ ƒ0€§Ð¿âSé»$ͽÎçúÏðÔ†÷|;Z+Ÿ“~“¶Võ‰Ÿ‰¦»)û˜Œ ƒ0€§Ñ>þé½$ͽþ¥e?FFZóè½Q­~EúýMÚjËvŒá?\–}LÆŠAÀÓ¶~­ý^’ÿñKÒÜZñ¬Þ{uö£`4õ«hêóïnÒ6ê_²oö);a30¸eMlþø’ô`’æVû×NÿC£i¢{§ßÙ¤mÕýòMÿœ0;a3Ô[»<ý#˜¤¹×=ãýÙ€‘Ò»ðãéw5é©þ宦ûhö1Ka35Fû¸·§ “4÷ß96ûI0×­)¿ ]£Yµ÷ócøƒ›³ ÀØ2˜…açѨymúG1IslÅÎ1¼÷;Ù€Tõ—NßÒïhÒÖZ¾SÔÖd€±f0Kõ7GkÕnùÇ$Í©ö'_MwSö£ E³ñö¨ö}qúÝLÚjSKbpÍqÙÇ`ì„ÌÁàöu±yù³ò?’IšSÝþ8¢i²%‹ªélŒö¡?Ÿ~'“¶UÿâUÙÇ`"„ÌÑ`ýI±ùãKÒ?”Iš[ýKÊ~Œ,žºÏýnú]LÚV½ó>œ}J&†AÀvè}ó°ôe’æØò¢¾óÒìÇÀÂk†Ñ=ñù÷0iõÎùPö)˜(aÛ©÷ýÓ?šIš[Õ/¦õ@öc`AmùÍKÙ÷/i[uÏü«ˆ¦É>&Å `ôÖ.Oÿx&inu>÷;Ã:û1° úëV§ß»¤mÕ;çƒÓ¿Á€ùe0Ozí™þMÒÜÚ2ê˜4ƒõ'DkjiúKÚZý‹Vd€‰e0z—›Gàƒš¤Y6µ4ê[ÎÏ~„Ì›ú¶‹¢µâYù÷-é‰-Û!úß<4ûˆL4ƒ0€yÖ¿ê³±Ù¿}+]Õ>/Œæ‘;³!Ûmxÿú¨ö~^ú=KzbÕÊ]£¾éìì#0ñ ÂÀà{Dk¯ç¦d“4»Ú‡¿!¢×Ê~„ÌY³éî¨V¿"ý~%=±jÿ—Æðž«²@ ÂH}ï5Ñ:àåéÛ$Í®î‰Ñ4Ù€YkÚGûПO¿WIO¬sô[¢yôžì#P ƒ0€4ÜtOTŸú¥ôn’fWÿë{e?>f§×ŠöQ¿š~Ÿ’žXïÜÿQ÷³O@Q ÂZ¿3ÿ:ý㛤Y4µ4êÏÌ~zÌÌ cßš—’Sµ÷ób°þÄìÓP$ƒ0€EÒ¿ú¸Ø¼ç.éã$ͬjå®1¼}ö£à© ëèžøÎô;”ôØÚGý›>´!ûtË `Õ÷_ÕáoHÿ('ifUŸø™hª³[× £{ê{ÒïNÒ?µ|§è_²ÏôP€<a‹­îG÷Âe±yjiþG:IO[ç˜_¨{ÙO€'é÷wéw&éGµ|c ïùvö±À Ïà¶K¢:èUéë$=}½s>˜ýÈxœÞš=ÒïJÒ–ª½žý+Ž˜þuŒƒ0€LýNt¿¶Gl^¶cúÇ;IOÝàÊ£²ŸÓúߨ?ýŽ$µ¦–F÷´÷Eóè½ÙG€'0õ}×Eûè_Ëÿ'iÛ-fÔw|#ûqnð­OGkjIþIE×ùÌoÄ𞫲Û`0Bú×­_™þQOÒÖ«ö}q4ïÈ~T…\û¥éßÊ”}7R¹µø…¨o:+û(ð4 ÂFM¿½KöÖÞ/HÿÈ'éɵ}]4ÙO  0ƒN‹ÖòÒïD*³öÿ:êψhšì£À „Œ¨awsô.Ù×0LÁ¶üiŒt³@!êïž­ÏJ¿ ©¼:G¿%ê›Î63a#®é<½‹öŠÖ¾/Nÿ(éÇuOþsÄ€Wßxf´–?3ý¤‚ÚóÙÑ=í}1¼ïšìæÈ `\ zÑÿ΢:ôõù%M×[³Gö“˜`õwÏó›Á´hµ}]ô¿±_4ÕƒÙ?úl'ƒ0€qÓ41¸umtNú³Ø¼ÜGa)»Á·>ýT&Ж?Óç7ƒi¡kòÕÓÿ²Óð¾k³ä˜Gac¬i?½oÕ§~96ÀGD©È–íõÍ_É~dËÃoÓ‚4µ4ÚŸúÅè]øñÞ{uö: Ä `B ¾#zëV‡I U+wá=We?€ P÷\c0Íkíƒ~6º§¾7×MëìqAÀ>z_ô¿}ltNzW´Výdú‡G©„ªý^ÍÆÛ³?0Æêïžg ¦í¾›vŽ}[ôÎÿHÔ7œÍæû²¬H`0é†Ã¨ï½6z—“ß­_™þqRšÔÚ‡¼vúO¹ÌVý½¯FkÅÎé÷þo¨®Ü=ÚG¿9º'ÿyôÖìƒ+ŽúÖµÑT?Èþ1`D„hØz0ÖFïÒC¢sÆ_Fû¨7Gk¿—úS“Ò<ÔùÌoD ºÙÇ3õë¢Þ°Fú§†÷\õÝWF}ßúnº;¢ßÉþ1 ÆÃÿ=‡´É‘IEND®B`‚‰PNG  IHDRFFq.â„ pHYsèèµ{RkqIDATxœíœklEÀ·i­UÑ`LÔ4Q‚ Áj46b| ñ4>PIÔDâ#Äøü@¼ëµ¥ ÐP(Z¨¥µ6B /1«!ܬƒi)Æl-Cc4oGŒÞø&šÚ×,޲õ.ÜpVŠbä¬;ñæÿ:¸©O3¨ô}^qĘ-Åhb¬î&qÄhˆûL?‹²†^¼ öÖŒVý\èbÔnLÔ-·_p|ßš”.ýX'ê)Ãþ਺Ù;GÃç`S*!;HÑB{/Þ<¶è`‡sp®Äx$°º÷¢‰±N6DODÆL{ê¡Õ½jïcÓv»±!ãVŒq M  úxFßóX½‡ì ÌeØ bâ>‡gMaŠá‰@Бß܉Qrf»»%ƒÀû:šž€`”¸¬žƒîÄÈüªüÙ˜¯m¬Ô ž ƒ…ÙVá^Œq00Ñv-Çy¾ìó¢Å¤7­t/†”.Lìþœ‘q7¢#Ýh1‘í‹Ý‹‘}³PÇ3½aEdwKà ¼`僫Âã‘ì¬KLøëQÝ´ ¼gKáh]=sä?u„,F«x°a§í .7RHÙcÀ´ Ô8&›ù‡,Fæ)ôê c(þM¹ ; êæ[Áê¬JR4Ÿ†/Æ#qøcˆŒŒÙ›s|I•ß<ƒœÿmüT`Ÿ‰Ö©ï&m«+1*ŸmGáŠ]HøEˆXŒÌ'•'ê@è௎kD®Å¨Ÿ¤ƒ(9¶Ó/&È™HùüWw{5Ä:üÀE 6*æY’’??ð)ZÏy_Zw­=‰U˜<ÊÚk÷Œ’ûF%RùL•1r,Ÿ¬e ÈÎG‚¶OkZY Aþâ$uóm®äxÀl¯ÏEjOññA¢ÿg J_H&åOÔ)¹iZÈ]*;Õ¿„#ð„(~8}Ò²f_¬—µÆwJÏI‰'Nœ8Ò”ó/®möP2Ï3IEND®B`‚‰PNG  IHDR€pzå pHYsèèµ{Rk IDATxœìÝwØlwYèýIB Uøo¸Z¶b½Ô¿h¯…~ʘUÃAjð—ñçRHË×IíÃ>‘†Ü3à టºg}5¾ þ«cË×MýKöY°§ €Šè·SÛ;jy·ñ‹Sïü]Æ ˜©pøÈÝã_U†?@umù:©?zâÈRÙY›Z;ÿFüy¤ÙèóÃâ¾ÙXû7ž”ŠÍ~6üA©÷ò·ó‚<ÙTWÙ¼/µ¶}}ü¹¤Ú¯Lý[Έ]»glî¦Í‹½ü]°Û¼Ÿdê¡\sKjnñÊøóI)´ ž™zóܦ[‡ÃÔ9æ ñ@ó›?žÀðî+RsãÅŸSJÑ{B÷ÔM–pöSûðˆÿ‡×ýV/çn?õ“ @½ n>5+Ÿ^)E7úfµÑ_‹/îXSû †ÿcë^ïÌ­&~"ÈËèξdAÅh <ú󋻎¾Ä8úY÷º'.›øI O½“W†Ÿ[jÌDÝÓ7_œ°{’‹l±ë|ó_¦™rU–¾-D釛àË"æ´ö®84þVó:ÿÍø-v˜È —Ú{½/üS#¾ ž•·_°0 àpÍ-ã;P‡ÿ£j\{ïßO©ßYˆ—2T¶L­¯üRøy¦FxÍ­_›†í‡æ¹ö»©¹Ë;Ãÿ1u®µë;Sê ø2@ކ÷]“šÿTø¹¦Fxí?2¿°sü—Âÿu®µÃ[RÙ^³ó@Æ×“Šë…Ÿoj„×»ü éÀÁÝWŽï4ý¨kÍÍ_žÊ‡¾·ó@Æzgl~Æ©ßæ¯HÃÎÚ Àá0µö|oü_Óš½ ï¼dÇ€œuŽødøY§Fxãÿk²°wÉ×ÃèÚ¶âipýq‹9÷ä®ßI­]Þæ)…¶òÙipÿus\‡ýÔÜæãèšÖ;o§%˜|r7ú˜QsÓ—…Ÿ{j„ÖþÆßÏmôÛ¿Å«ûÿ^Š™€±Á'ù£ÜÛà™i¸æÖ§Y‡ÃÔÜî—ãØÖ9ø£ã;¶ÀRêº:ü T#v9ö‹O½ö¯:2ü‡¬cíÝßãFÏÄ(ËÔÞÿÏÃÏB5Âjnô”:<ùØÚϲàú–¯Nå#w/õ¸À•µ©µíÂÏD5Âê]ºÿ/€Ãæý㿉þkÕªõÓðöó#f~Ìðî+ÆçRøÙ¨Qkß<ñØ=gûð®V-_'õ/; bÆà õÎÝ!þ|T iƒgÙ÷ `k·wÇÿp5ª{—£æžT瀿 ?#Õit§—[G_âkß®ö>”Òp9ßð„FßAßÜú5ág¥K¿ŸñO?¾ö¯ùvøU—ZÛ¾>•í‡"gžÒð¶óÆo FŸ™j,펲Ý|Ý&ú‡ªËŸYï»6r¦`Nz§o~nª±´-_' ‹û~´6wyGüUƒúW=Ï07å0µ÷z_øÙ©ÆÒî*×ý£°ØèEá?PÕëóùèQ€‰”ßžš«_~†ª±tûÊ9ÛŸûÆpíá?LÕkíòö”Ýè9€‰õ¯<,üUcÉê÷ãç½Ñ¿é”ð¦ÊþË©\ssôüÀÔ:‡|,ümü‹è³UE­µÝ/ŸïFçÄåá?Lkïù^7{ VºG6ü|UcQk}å—ÆÏu£sôçØªÕÜø§RùЭÑs «×L­m~1üœUcñv˜­~~üT7Ú‡ÿcøSµÜŒþ8tù:ág­‹RsóŸ?ÏöaŸÿaªTçðˆžMXTÝ£>~Þª±(57ûãçØ8A­m^—ÊÎÚè¹€ÅÕ-Rsë׆Ÿ»j,xÀI[ñŒ4¼íÜè‘€%1¸ñ$o/«_À ë¶Iô,À’êáeœ ö¿=þÒlÈîÑ›ýðsXË8×V=7 ¸>z DÿÒ}ãÏb¥…Ê8Çzçn={ª½÷ûÃÏc5$ àjïönoý½Ñ;aÅÊ焟ËjÌ; àÓå­_ø¡ÞÉ«âÏf¥ùf|šzçl=k0;ÝÔÚö áç³óÊøµwÿ-oýÀã n:9üŒVc^YŸê­ßû¯‹ž1˜Iƒ>V+M›ðIê±eôlÀÌ*ºuüË’èóZ©²>A­íߜҠ=[0ÓüAH£²YßòuÓð{gGÏ̾~;5·~MüÙ­4iÀÇÕýÖg¢Ç *cðÝÃÃÏn5&ÎøØcóŸKe{Mô,@¥´÷ù£ð3\Év àê_yXô @å ï¹2+Ö ?ÇÕ˜sÀGkïóÇÑó•Õ9òSág¹sÎ8jÕsSùàMѳ•U÷¤æF/ˆ?Ó•æ’ptÏ¿Ó6ž¨<·…iT¦ìÀÑŸ¯þŒ˜§^+5·|UøÙ®ÆÓï?¹/€ý+‰¨þ…{„Ÿíj ¶Z»ýføY¯Æ“–ç¸jýT®¹%z6 ¶·œÞ+=YY.€Ý—GÏÔ^{ï÷‡ŸùjrWô5<ÎàšoÇï ™×¬ëØ9òŸ¢¯o`®ÝT>tkÜzV\ó­Ô¿lÿñ½;{§o–º'üWêÿ¥qoþKêù©qãÿÝ _ÿÿ}Çwÿ’¯§ÁuǦá§òáÛRö£ÿUÀ“)ËÔÚþMá»B‘qõ\—¯›†÷^}yQ>ô½4¸éäÔ¿`×Ô=îÿŒ¿ ¾µÃ[RsÓŸYœ× ž™ZÛübjíÆ‹cïìmÓàæSSÙ^ýP)¥þÅ_‹ß–å[-Àö~ˆ¾®!_ƒ^ÞqQê_´gêýÙñg}šÿÔl½ðmõ ©sÐGÆß>¼ë²”Êaô£ùtSs‹W†¿™VËppóiÑ—5d£ì<<~ëµ{â²ï°{ÕúÕ{!\ýâñ×Tõ/Þ;•Å=Ñ)d£wæVáó_dZíÀÖŽ¿}=C½ ûipËéãÏæµv|k*V¬>÷ ÚòuSk×w¦ÞY_IåÚ;£m¨µ²³væÞ!(2©v `ï¼¢¯g¨²yê_²OêüÑñoË¢ç|ÉZ±^jïýþñ˜¤~;úi€Z}&8|Ö—åW­Àæ†Ï¿,Ì™÷/Ý7µ÷ýÓñTDÏwtÍM^:>¨†ÜýÔ@­”kn©ß; Ëf¿Z-€nýó4ŒoÃÒ9è¯+ùY¾%iùºãÏ Ž¾ÓX??ÛËòªV  d˜Îè¦é½S7NÍ-_>ÇUjt‹™Ñ½ ùýñfô<™U›°µÓ¯G_¿P9ƒ[Ïüþoû¼Å;¯ÚûÿyÞóÝè§*môGœÑ³\dTmÀþ»E_»P e™×Ú»ÿVøÜÖªë?†R6ï‹~†¡’úí?ÇËò© `s£¦²ûHôµ ³­¦þå¦Ö¿>³u®¹ú%㯱ssi˜P¿š›¾,|†‹LªÅ8ú^PàÉ ®=füµkѳšS­]Þž†÷\ýÔC¥Œn(=»E&ÕbÝ”øIÃÛ/Hí½~/|F³mƒg¦îñ_=ðôʇosK˜eKSåÀæ–¯òV >³EU~ÿ×5ð}e9þÆŽÑM‹£gS?ùYåþeD_!0óF¤=¯EU~Þuiôµ 3a4 ­]Þ>“zêºGýkJƒnô峫¦æV¿>«EÍ«ôØÚö Ñ—)Ä+‡©wöWS±òÙá3©9¾víö›ã›oOltcúè9-j^¥ÀÞ©«£¯Q5ú\Y{÷÷„Ï¢&¯¹Å+}{<‰Ñ ¹A}cq_ƒ*»._LJªÉZÿÒ}Ss£ÄÏ¢¦oÃç¿{øIƒ>?£Ëê[eÀÑ[(¥Awü9²èÔµb½Ô?—è« fÎèÚÂçsY}«ìØ;s«èkBî‘5º¥Hôüi^ÓNÛ$úò‚0eóþñ ë{'¯Jí}ÿ457ý™ð™,j^eÀáý×E_¯°¤·žåE±æ>øµ×k¥Á­g¦ÞY_IC>–ZÛ¼.|öŠ «äØÚîÑ—/,©ÁUG¤bÕú᳧ůwòÊèË Îp0þJÄÑ۹ݣ?›Ú»½Û –ÍF•\»'|9ú’†%Ó;g»T,_7|î´„¯qnpOE•kïHƒ«JÝ“6Hí}ÿ,5W¿8|žÔ¨Ï8üÞÙÑ×8,‰î ÿ>oŠ©{ÒŠèËžRÙz0 ®?.õNÙ0µ÷ûÀx¡ˆž5껎`ßýKºÇ~1|Þ›? afôÛã_¾Œn:ß9ôoSë+¿>jäµvŽødôÀâ*ËÔ=æó᳦hù:©É×£¯H2T>xãã>·÷œøyPÊz\ýÍè¹€EeùÓµòÙipÓ)Ñ—%5V>ô½Ô¿ò°Ô=þ?S{Ï÷ºÁü²<ªÖ¸òÙ)õšÑ³‹¦wúfñs¦™kôAúá=ß¾<©²½& n8a|Ë¡ö~LÍÍ.üúV#æu¥J àè¿L ®ú—í?~Ë/zÎ4»ß<º8ÌÙ°ÿÃ[°tŽüÔøjî( ¢Š àè/ Ž×ï‹Ïõ´µvúõ”ºEôåÊ,*‡ãß÷/þÚø«"[;¿ÍkŠRmÀÑ7!@Ý”knNÍM~:|¾T:ÿMô%Ë,ÞoÏkˆ–Õt}(5 zÑ3 ªì>’ZÛ¿)|¾T­úçï}鲄ÊÎÚ4¸åŒï߂尧æÖ¯ ¿Õ¨|•YG_ µR–©sÐ_‡Ï–*ØÊg§áF_Á,ŸÛÓ²¥©2 `ïÌ­¢ÇTïÜíÃçJÕ­¹õkÆßÄ@…•eÞ{õ÷ï·÷­Ï¤Ö.oOÅÏ ¿¶ÔÈ¢Ê,€Ã».UX0Ã{¯JŪõÃçJÕnôÙ¯ÑA5”kïô¹=¥Y© `s“—úú7êcÐM­~-|®Tzgl}EóÊÎÃipÓÉ©wÚ¦©}À_Žoã}­HEÕÀÑ—LC]tO\>SªQ<Ë;$ѽ4¼ý‚Ô;oÇÔùÆ'|nO© Ubìº:z¼aA ï»vüþè™R½jíð+ãß,³Ä·`9þKßÿž\çвêU‰pôkt¨ƒö^¿>Oªg£ß,³ðÊGîzÜçö^þ\KE àŠõÆ÷@‚ªë_ºoü<©¾­xFÞv^ôe^ýûíÝtJê¾yêø¡ÔÜòUñÏ«´,ÓpüÖT]¿íCàZôZÛ¾>¥^+új¯ÜýöºGvü5{£_8D?‡R±DÍü8º&TÝè/5£gIyÔ=öߣ/÷™4¼ÿºÔ¿lÿÔ=ús©µë»R±ò9áÏ•T6ó `ÿ¢½¢_7`^ÊöCî÷¥¥kùºÙ¿\¶×¤Á ßùÑçö6}Yüó"-›­f~Ý0ª¬{ÒŠð9R^µv~[6÷N}ŸöàæÓRïŒ-Sç ¤æV?þøKEšé°¹Ñ ³y£¦ºEj®~Iø,)¿zçí”jù¹½;/Iý vM#þ1µ¶³ÏíIËj¸Žî¯UÖ;{Ûð9Rž57~Ñø«Çjq¿½Ñ[¹{¿?«žþ¸JEMšé°{Ô§£_`zÃAjmóºð9R¾¾•¢JŸ•ÜrFê¾Ù£ŸÛû™ðÇO*jÜL/€£¯Õªê_~Pø )󖯓7ŸšfN·Hƒ[NO½3·Nƒ?šš[¿&þ±’–åÕL/€£¨ªöîï Ÿ!©µý›Æ¿ýÜÞ]—¦þ…»§ÎŸL­Þ2¾iuôã"å^sfÀåëŒÿ”ªhxïÕãk8|ޤÑí´.Ø-îs{>/üß/©Qpô§üPUÝc¾>CÒ}žn1¾Ró'>··Ùÿÿ·JjT{lï÷±‚%1èºñ¬f®Ñoäæw]÷ÒðŽ Sï쯦ÎaO­íÞè·ÜÒ²ê6³ `÷„//Ìa KÌh&Ûðyã·gçd8Hû/Oý ÷gkÇ_õ¹=iY½šÙpôÝPEíþ2|~¤'jtóä§ýÜÞè­ÜÕ/ÿY%5ò\·ž¹ÄÇ6,€náfµšÝV¬7¾»ÂàºcSï” }nOZ–o3»–Å=ÑG9L¬ÅÁá³#IRQÅpüÀPAƒþ:|~$I*ª¸¶v|kô9Óýõï†ÏŸI’Š*.€£ß¢@ÕŒ>[=;’$U]»ßù¿Ñg9L¬wòªðÙ‘$©¨êØ¿hÏè³&ÖÞë÷ÂgG’¤Ê.€ƒ›N‰>Ëa2ýN*V­>;’$U]‡Ü}œÃD7Ÿ>7’$U^S¯}žÃDzgl>7’$U]›«_}–ÃÄ:‡}<|v$I*ªº¶¶sôYkíð+á³#IRQÕ°ýµ?Œ>Ëa2ƒ^*6xVøìH’TTuìþÑÇ9Ldx÷åás#IRQå°{â²èó&Ò¿t¿ð¹‘$©¨òØ;o§èó&Ò;yeøÜH’TTyì÷Ñç9L¤sÄ'ÃçF’¤¢Ê ààæS£Ïs˜Èè—¢çF’¤¢Ê àðî+¢Ïs˜Hk»7†Ï$IE•ÀríÑç9L¤¹Ñ ÃçF’¤¢Ê `ê·£Ïs˜³²³6|f$I**½®Z?ú<‡‰ ï½*~n$IZVá°¹Å+£Ïs˜Èà–ÓÃçF’¤¢Ê `k‡·DŸç0‘ÁµG‡Ï$IE•Àö¿}žÃDú—>7’$•^÷û@ôyé_¸{øÜH’TTyìüÑèó&Ò;k›ð¹‘$©¨ôxøßGŸç0ß,I**ØL-€Ý£þ5ú<‡‰týbøÜH’TTz<ö‹Ñç9L¤óÍŸI’ŠJ/€'­ˆ>Ïa"#ÿ)|n$I*ª¼öNÛ4ú<‡‰X%IE›­ðìm£Ïs˜ˆP’TT°™Zûì}žÃD:G~*|n$I**½^´Wôyñ@IRQÁfk¼dŸèó&â7€’¤¢‚ÍÖxé¾Ñç9LÄ(I**Øl-€—í}žÃD,€’¤¢‚ÍÖxùÑç9L¤óÍ ŸI’ŠJ/€W}žÃDºÇþ{øÜH’TTz¼ò°èó&Ò=qyøÜH’TTy|÷ðèó&Ò;}³ð¹‘$©¨ôxÕ‘Ñç9L¤wîás#IRQåÐ[ÀTMÿâ½ÃçF’¤¢Ò  ¿¦bF¸=7’$•^/ùzôy\{tøÜH’TTz¼hÏèó&2¸ù´ð¹‘$©¨ôxþ.Ñç9LdxÇ…ás#IRQå°wîöÑç9Ldxßµás#IRQéð¬m¢Ïs˜HÙz |n$I**½ž¾yôy“)ËT¬xFøìH’TTvËabÝ£þ5|v$I*ªº¶÷ýÓè³&Ö=iƒðÙ‘$©¨ì¸ç{£Ïr˜XïÜÂgG’¤¢ª `kç·EŸå0±þå…ÏŽ$IEeÀmß}–ÃÄ7ž>;’$U]›[¼2ú,‡‰ ï½:|v$I*ªº>/ú,‡Éõšñ³#IÒ²ª.€Ë)õ;ÑÇ9L¬¹úÅá³#IRQÕ°|ä®è³&ÖÚá-á³#IRQÕpxïUÑg9Llvñk IDATtËèÙ‘$©¨ê8¸õÌè³&Öùæ¿„ÏŽ$IEeÀk¾}–ÃÄz§n>;’$U]û—ì}–ÃÄF×môìH’TTuìýÕè³&6¸éäðÙ‘$©¨êØ=qyôYÞ]øìH’TTuìù©è³&×o§bù:áó#IR%Àöþ}”ÃTš›¼4|~$I*ª¸¶v}gô9Siíôkáó#IRQŰ¹õk¢Ïq˜JçÀ‡Ï$IEÀbÕúÑç8L¥{ü—âçG’¤eU\GßÜ}$ú,‡‰õ/Ø-|v$I*ªº¸!ú,‡‰¹ $©¨H3¹n=+ú,‡‰•Ý>;’$U]ûW}–ÃäÊa*V>'|~$I*ª¸ú:8ªªµíÂçG’¤¢Š `÷¸ÿˆ>Ça*íý>>?’$U\;ÿMô9Séóùðù‘$©¨âØÞíÝÑç8L¥wîöáó#IRQŰ¹ÕÏGŸã0•ÁudžÏ$IEÀbƒg¦4DŸå0±áý×ÅÏ$I˪¸Ž¾ díÑg9LnØOÅŠg„Ï$IEÀámçEå0•æÖ¯ ŸI’Š*.€nMUµ÷ùãðù‘$©¨âØ;s«ès¦Ò=æ áó#IRQŰû­ÿ}ŽÃTúì>?’$U\Ûûþiô9SÜrFøüH’TTqlm÷Æès¦R6ïŸI’Š*.€ÅªõS*Ë賦ÒÜôeñ3$IÒ²ª-€£{>rwô9SiïñÛáó#IRQÅpø½s¢Ïq˜Jç›ÿ>?’$U\û—}ŽÃTzg5|~$I*ª¸öN]}ŽÃT7œ>?’$U\;‡ÿ}ô9S)ú^øüH’TTqlïþžès¦S–©¹Ñ ÃgH’¤¢j à~8¨¢Öο>C’$U[G•퇢Ïq˜Jç°‡Ï$IEÀáFŸã0•Þi›„Ï$IE@·‚¡ªW>?’$U\{§l}ŽÃT†÷_>?’$U\GŸ£‚J*‡©¹áóÃgH’¤¢j `k×wFã0µÖ.ïŸ!I’Šª-€£{©î©UÔ9òŸÂgH’¤¢j à¨òáÛ¢Ïq˜JïœíÂçG’¤¢Š ààúã£Ïq˜Êà¦SÂçG’¤¢Š `ï¬m¢Ïq˜JÙz |~$I*ª¸vŽødô9SknñÊð’$©¨ÚØÚí7£Ïp˜Zûë>C’$U[›¿È_SYÝã¿>C’$U[G•ß}ŽÃTú—î>?’$U\7œ}ŽÃT†w_>?’$U\{g}%ú‡é z©ØàYá3$IRQµpô PU­~%|†$I*ª¶¶w{wôSëúwá3$IRQµ°¹ñOEŸá0µÞ雇Ï$IEÕÀQåÚ;¢Ïq˜ÊàºcÃçG’¤¢Š  ¿¦ªFÿñ=?’$U\{g5ú‡©57}Yø I’TTmìù©è3¦ÖþÚ†Ï$IEÕ@ L•uOø¯ð’$©¨ÚØÜè…¾˜Êê_qpø I’TTmU>xcô9S>p}øüH’TTqì÷Ñç8L§,Ssã…Ï$Iͪ-€Ý“VDã0µö¿>C’$5«¶¶÷û@ôSëóùð’$©Yµ°¹å«¢Ïp˜Zÿ’}ÂgH’¤fÕÀQeó¾ès¦2¼ûŠðù‘$©YÅppã‰Ñç8Lg8HŪç†Ï$)ï*¹öÎÜ*ú‡©µvyGø I’ò®’ `ç°GŸá0µîQŸŸ!IRÞUrlmÿæè3¦Ö¿`·ð’$å]%ÀbÅ3Rê·£Ïq˜Êðö âgH’”r®š à²FÞqaô9ÓtS±Á³ÂgH’ÔȶÊ.€ý ÷ˆ>Æaj­~%|†$Il«ìØýö¿EŸá0µÎá>C’¤F¶Uvlïþžè3¦Ö;g»ð’$5²­² `s£¤T£Ïq˜ÊàÖ3ÃgH’ÔȶÊ.€£†\}ŽÃTÊî#©X±^ø I’YVé°å¡Ñç8L­µý›ÂgH’ÔȲJ/€Ý¾}†ÃÔü!ˆ$©ªÒ `{ïß>Ãaj½óv Ÿ!IR#Ë*½6W¿8¥²Œ>Ça*¾D’TUépÔð¢Ïq˜þAV>;|†$IìªüØ¿ü èc¦ÖÚùmá3$IjdWåÀîqÿ'ú ‡©uú×ð’$5²«ò `{Ïß>Ãajý‹÷Ÿ!IR#»*¿67z¡o¡²†÷\>C’¤FvU~5¼ïšès¦SÇ_k=C’¤FVÕbì_º_ô1SkïñÛá3$IjdU-Àî1_ˆ>ÃajÝcÿ=|†$I¬ªÅØÞý·¢Ïp˜ZÿòÃgH’ÔȪZ,€Åªç¦4DŸã0•ÑÍÌÃgH’”rª àèAî¹2ú‡é”ejnòÓá3$IjdSmÀþÅ_‹>Æají¯ýAø I’ÙT›°ûí‹>ÃajÝïüwø I’ÙT›°µë»¢Ïp˜Úàª#ÃgH’ÔȦÚ,€ÅÊç¤4èEŸã0•ríñ3$IJ¹TŸpô‡ w^}ŽÃÔš[¼"|†$I,ªÕØ¿`×è3¦ÖÞÿÏÃgH’ÔÈ¢Z-€#þ1ú ‡©õN]>C’¤FÕjlmÿæè3¦6¸ñÄð’$5²¨V `±|ÝTvŽ>Ça*egm*V¬?G’¤T÷êµ.k¤ÁM§DŸã0µÑo±£gH’Ô¨}µ[{§o}†ÃÔ:GþSø I’µ¯v `çÀEŸá0µþ…{„Ï$©Qûj·6·|UôSÞseø I’µ¯v à¨ríÑç8L§¦æÆ/ Ÿ!IR£ÖÕr\uDô1Skïýþð’$5j]-Àî _Ž>ÃajÝ—…Ï$©Qëj¹¶÷z_ôS\ó­ð’$5j]-ÀæF/– ª¨lÞŸŠåë„Ï‘$©QÛj¹ŽÞ{Uô9Skmó‹á3$IjÔ¶Ú.€ý‹÷Ž>ÃajCÿ.|†$IÚVÛ°{Ô§£Ïp˜ZïÜíÃgH’Ô¨mµ][;ýzôSÞ~Aø I’µ­¶ `±Á3Sêµ¢Ïq˜Î —ŠUëÇÏ‘$)Õ±ú.€£BßzVô1Skïöîð’$5jY­ÀÞY_‰>ÃajÝc¿>C’¤F-«õØ9äcÑg8L­Å!á3$IjÔ²Z/€­m^}†ÃÔʇ¾>C’¤F-«õ8ª,î‰>ÇajÍ-^>C’¤Fíªý8¸öèè3¦Ö9ðCá3$IjÔ®Ú/€Ý“6ˆ>Ãaj½3·Ÿ!IR£vÕ~lïóÇÑg8LmxÛyá3$IjÔ®Ú/€ÍÕ/I©,£Ïq˜Ç ¡Ÿ>G’¤F­ªý8jøÀ ÑÇ8L­½ç{ÃgH’Ô¨UY,€ýËö>ÃajÝïüwø I’µ*‹°{ôç¢Ïp˜ÚàÚcÂgH’Ô¨UY,€­]ß}†ÃÔÊöC©X±^øI’µ)‹°Xùœ”Ýès¦ÖÚþÍñs$IJu)pô‡ ·_}†ÃÔ:ßü—ð’$5jS6 `ï¼£Ïp˜ZÿÒ}ÃgH’Ô¨MÙ,€o|"ú ‡©•knŸ!IR£6e³¶¶}CôóÒÜâ•ás$IjÔ¢lÀbù:©l¯‰>Ãajƒþ:~Ž$Iµ(ŸpY# nøNôSë½mø I’µ(«°wêêè3¦6¼ãÂð’$5jQV `{¿FŸá0½a?57zAøI’•/«°¹éÏDá0/í½Þ>G’¤FåËjU®¹%ú ‡©uOÚ |†$IÊ—ÝØ¿âàè3¦6¸á„ð’$5*_v `÷Ø/FŸá0µ²³6+ž>G’¤F¥Ënlïþžè3極óo„Ï‘$©Qé²[‹Uë§4èEŸá0µîqÿ?G’¤Tåò[—5Òð΋£Ïp˜Úàšo…Ï$©Qé²\ûçï}†ÃÔÊöC©X±^øI’•-˰óÿ}†Ã¼´vúµð9’$5*[– `k»7FŸß0/Ýc¾>G’¤FeËr,–¯“Êöšè3¦6¸êÈø9’$¥ª–縬‘7ž}†ÃÔÊÖƒ©X¾nøI’O߆ÏKíÝ+µvüÕøŸ%÷°wêêè3æe–^H$Iï·b½ñGÍ:‡}<õÎþjÜrFJƒîøu»wòÊøŸ/÷°½ßƒo˜ŸîÑŸ Ÿ#Iʽææ?—ÚûþÙø»Ú7|'¥^óI_·{§o6;?w® `sÓŸY£Þ໇‡Ï‘$åTsã¥önïNÝã¿”W•Ê➉^·{go;;ÿ–\ÀQåš[éh†ÅW¶ð9@IZ¬6xfjíôë©{ôgSÿ’}Òðž+S*Ëy½n÷/Ø5þßõhY/€ý+^ £b´¶søIR-?·×ï,økvÿ’¯Çÿ[-ë°{ìüÉ…¥Ôýö¿…Ï‘$Uús{Wµd·†ë_qÈì<9/€íÝß³$O8,–þ•‡…Ï‘$ÍrÍ^øýÏíÞʽâT>rwØkö`†¾Ë=ë°XõÜ”†ý° æ«,îߨ<|–$iZµ~jíö›©{ÌçSÿ²ýÓðëÓ,ÜðøÇèÑò^—5Òð΋£¯˜—Öv¿>G’T×Ïí-¤ÁͧÆ?n–ýØ?ç}ra©u¿õ™ð9’¤Å®¹å«SçÀ§Þ[Œ©²ûHªšÁ-gÌÎã™ûØ9ü˜—ÁUG„Ï‘$-îçöîJu0üÞÙ³ó美~} UVv߯*z–$iêûíÞÊ=òS¹ßÞ0ÕÑð¶óâïGË~}€~©þüKk×wÅÏ’$Í¡æÖ¯}ÜçöÚ)Ã;.œç!ûpY# n<1úš€y鞸<|Ž$éiï·×z ålxç%³óÜX©wêêèkæepóiás$)ïš½àGŸÛ»dŸT>xSôKãÌÞ}ùì<_ÀFjï÷ÁèkægÐKÍ Ÿ>K’2iå³Sk—wŒ¿hôõfÃû®™÷÷äæ`xïUñÏÝ£YÇÂÏF_0oí}ÿ4|–$Õ°åë¦Ö¶oHo|"õÎÝ! o??¥A7ú%¯’†ÀÙ«\ssôuóÒ;ë+ás$©†ŸÛkÞýòVû¯˜çÙøýú—}]@m^X$Uõs{7F¿”ÕÚð®Kgç¹·~¿îÑŸ‹¾.`~Êrü_îѳ$iF[ñŒ~uZÿ‚]k}¿½Y5¼ã¢øëàÑ,€ÖÚåíÑ×Ì[çп Ÿ%I³Ñè?;}äG÷Ûëµ¢_¢²7¼ýüÙ¹>,€¶Á3 •׿økñ³$iÉó¹½jÞvîì\3À5¸õ¬èkæ¥\{ÇøÛm¢gIÒâ5ºåÓc?·7~+—JÜzÖì\GÀÕ;s«èkæmôŸèY’´ðŸÛ½•;ú*1ŸÛ«®Á-§Ç_Sf|L£ÏJ@Õ~+=K’æ÷VnïôÍ|n¯†7ž8;ךð1ƯŒ¾6`Þ×>K’æö%£o¢ê²Q\|*Ûk¢_>ÈèõÙø¸Ê‡o[ìçW¯•ŠUÏ Ÿ%I?Êçöé_yØì\“À¯å¡ãª¬ýõ? Ÿ%)Ûžès{ÃAôË3 é~ñ×ç£YW÷Ø/F_0o£ï댞%)ßÏí5£_˜Qý ÷˜ëÖøã~EUW>xSø,Iu¬¹ñO¥öÞïÿÑýöŠ{£Ç é»ýì\ËÀǵò9) ºÑ×Ì[kÛ7ÄÏ“Tå6|ÞO~n¯,£G› ë±eüuýhÀ'hxÛyÑ×ÌÛèã ѳ$Uês{;þjê|óŸSÿ¢=ÓðîË}n×;uãøkýÑ,€OÐèC»PuƒO Ÿ%©_vÃw|n%Ñ=á¿fg,€?™BS ƒ^jnü¢ðy’¢ÍÁø­Üã¿ôèçöN2Õ=êÓ³3À'xP6yô5 ¢sÀ_…Ï“´¤ùÜ3¬sè߯ÏÈ£YŸ¤rÍÍÑ× Ôê–ÒbÕ9âSÿÂÝÓð®ËRö£ÇžT{¿„Ï˲>I£›5BÕ•kïLÅòuÂçIZ´V>;zÌ`ÎÚ{üvüÌ<šðI½OuÐÚñ­áó$-V>²C•´vüÕÙ™ à×Úá-Ñ× ,ˆîwþ;|ž¤Åªµý›£G 欹õkÂgæYŸ¬륲ýÐÜŸU˜Q£ûZ†Ï“´Hµ÷øèƒ9knòÓá3óƒ,€OÑàúãæþ¬Â¬*ËÔÜòUáó$-F?=a07ÃA*–¯>3?ÈøuOZ1Çgf[÷Ûÿ>OÒbÔ9òSÑãs2úÞèèyylÀ§¨½×ûæö¬ÂŒÜtrø/ÍøTΆÏwO)êaØOÍM^>SÒB×;sëèé‚9ÜrFø¼<6 àÓ4¼ã¢¹=³0ã:‡ÿCøSÒBÔÞów£G 欽û{Âgæ±YçP矘û3 3®½ïŸ…Ï”´uûŸÑãsÖÜúµá3óØ,€sy¶~ÍÜŸa˜qý‹¿>SÒB4úP=TE±jýð™ylÀ9V>tkôµ ¢ì< àó…ãÔɬݑ^š¸Uë§4DÌÉàúãâgæqYçXkÛ×ÏíY†*tSsõKÂçJš¶ÖŽož"¨ì·€Œ²NP¹öι?Û0ã:GücøLIÓÖ9ôo£Gæ¬{—ÃgæñY'¨Å!s¶aÆ n<)|¦¤ië¶IôÁœuùXøÌ<> àu¿õ™¹?Û0ëÊáø«£çJš¦ÁµÇDOÌYk×w…ÏÌã³NPk‡·ÌýÙ† èûÅð¹’&nù:©l==>0gÍÍ~6~n—pÒæýsÆaÆ ï¸(~®¤ kmÿ¦èÑ¹ëµÆûCôÜ<> à„¹ñ(uÓÚîás%M’ÛrQ%Ã{¯ Ÿ™'Ê8aÝ£?}-Á‚ê¾Yø\I“Ô¿h¯è±9\{tøÌrw*6xfølIsmxßµÑcsÖ;sëð™y¢,€Ó|Ðý©™ÎŠŸ-i57yiJe=20g£,Ìä,Y'¯Ùþsæ¡×>WÒ\jð—ÑãiïùÞð¹y¢,€SÔ9ü&{öaÖ•ejmóºðÙ’ž®þ…{DO Tþ0£,€ÓLUR6§Ê8Ú_ûƒèë E÷ø/…Ï—ôƒZÛ½1z$`bƒ›NŸ§Ê8ŸV>'¥~{ò«f\ùðí©ØàYñ3&Þm9cËè‘€‰õÎþjøì_R±âã{TBÕtŽødüü?O•pžµ¶ótWT@{¯ß Ÿ1åÝàª#¢Ç&×oÏü7+Y ò¡[§¸:`ö ®?>|¾”ù½ÿ½è1€‰ o;wöçË8ÿúì:ùÕÑÞã·ÃgLyæV[TUïÜíÃççé².@£ïO…ºÜrzøŒ)¿š½ •í5Ñ—?L¥óÙß©,€ ñ nøü”Ý鮨ŸÔR×=æ Ñ—=L­µÝ/‡ÏÐÓe\ 7ž8ý•3npëYá3¦ŒZµ~*×Þ}ÙÃTÊî#©X±^ü=MÀª{ì§»R "fùKÍU¯üö*ÜxRø Í% àÕÚö Ñ×,ªáí¸/ ¿UÏuãg*­wÊFñs4‡,€ X¹ææèëUç ¿Ÿ3Õ»î‰Ë£/sÈâÝ àÖ;o§ù]50ãʇoKÅ†Ï Ÿ5Õ³ÑTvÖF_æ0½r˜š¿¨2ó6b\€Úû}`W TCUÞÞPõê_´gôå óÿ ͘¥¹d\È6|Þøë_ ÖúÔúêÿ?oªU­ß–Òp}uüŒÞ Œž¥¹f\àF_u7¸ú¨ðYSZñŒ4¼ëÒèËæ­sèßÅÏÓ³.pÝo}fþWT@ûë>oªGn£E]4·|Uø<Í5 àB? [¾*¥²Œ¾aÑ•Þ8þœè™Sµ}œ u‹èËæmxßµáó4IÀEhxûùó¿’ úçï>oªø[¿·}CvŸÿe\„º'|ya®&˜ueé­`M]ïä•ÑW0,˜ÎŸ©I².B­m_¿pW̸òáÛSsõKÂçNÕª½Çï¤4ìG_¾°p÷ÿÛä¥ás5IÀEjxïU tUÁìë_¶øÌ©b7|^{Gôe fxçÅ•œÃ à×;uõÂ]YPUºý[ñŒ4¸åôèËTïÌ­âgkÂ,€‹Tkç߈¾aiõÛ©µÓ¯‡Ïžf»Þ¹;D_©°àÚ{¿?|¶&͸X-_'•Ý}MÂ’*×ÜR¹ÏÁhéê÷Ñ—(,¼n‘Š•ÏŸ¯I³.b½³·¾,aÉ ®?.Ë× Ÿ?ÍVþjüAy¨›AE¿É¸ˆµ÷|oôu !z§m>šÚ{½Ï÷¤S[oþKøŒM“p1[±^*‹{£¯MÑ=ú³ñ3¨ðZ»¾3•ÝG¢/GX4Í­~>|ΦɸÈõ/Ú3úÚ„ÃAêø¡ðT\£? *Ûk¢¯DX4Ã{¾>gÓf\äÚûþYôõ qúñG!¢çP¯}»ÿV*ÛE_°¨zgl>kÓf\ìV>Ç‹ Y]ÿn“Wí¯ýaJ½fô¥‹®½Û»ÃçmÚ,€KPÿ¢½¢¯Q5z°µË;ÂgQ‹ßè†àiоä`Ñ•ÜUé;X— öÞ¿}B¼n‘Ú{þnø?õÏß%úò0í¼‹a\Âz'¯Œ¾faæô/; «ž>Ÿš[£Û^ ¸!ú²Ø·W>'|ç›p k}õÿ¾na& ïº45·~møŒê©ë×;s«ñÛ÷³þÅ{×c¦-€KÛðö ¢¯]˜IeëÔÞçÃgT?Y瀿JåCß‹¾D`&´+þ׿?ȸÄuý÷èkfWY¦Þ¹Û{Kx†Þµ\{tôU3£,îMÅŠg„ÏæBd\ê|óŸó <òÁ+ýKU¯¹ÉKSïôÍ|£ón\ú:Güã\VÀ}‹Nç°‡ÏmÝã7ú7÷ôƒ'W>xS­n[eŒxÐ7~‘ÿ† n:9µvyGøüÖ©Ö6¯K½³·M©×Œ~zaæuO\>³ ™0¨ÑŸ‘“ÜðÔÚñWÃg¸Ê>_Ù¿âŸG†¹*‡©¹å«Ãgw!³ÕÚõ]s¾î€Ç)‡©ù©µóo„ÏrUjnþòÔ=î?ÒðÞ«£Ÿ=¨œÁõÇ×ï5Á×ðî+¢¯i¨¼Áͧ¦ö~HÅòuÃgzæZµ~êò±4¸îX¿íƒyèò±øy^à,€uþ\ô5 µºuL÷Ä婹å«Âg;²Ñ_Mwþ›ï¿Åë³Æ0oe{M-¾úí'^+,€þê—¤ÔoG_ÛP/å0 ®?.uùÿÆp•ÅkÉÖ¯Ioþs\}”×X`½s¶«çë†0¶þ¥ûE_ÛP_ƒîøíÏΑŸ¿ØEÏûBÕÜø§R{¿¦Þ¹;¤áý×E?ÊPk­íÞ>ó‹ò:bŒ­½ç{£¯mÈêmâþ»¦ÎAßô8zþ'ù¡ÑÏÜ;û«ixÇ…ãßrKóãb^åuÅÜò«¡CnIDATuÒð¾k¢¯qÈÏp†w^œúG}:µv}güwoð¬ÔÚñ­©óO¤Þ™[¿5¨lÞýHA¶:ÿMüž°HYg Ñ­€Y ¸~üÂÑw~vùÂø­ÖÖÎoûþ=Àæ³ ._'57}Yjmûúñ}øFUØýÎÿ/ ƒOËÀèëï€ÙP÷Œÿ£,zGX¬,€3PsÓŸñ¥ëP½f*×Ü’†w]6~;vpëYã›S–Æq£ÿù¦SÆÿ·q÷^ýýßâ•eôOL wÚ&õÞ=,€³Ñø– @¼a?5·úùðÝ`1³ÎHí½?úrRJýË ß ; ଴|Ýñ_(±Z£? ‹Þ 9 à Õ=öߣ¯yÈÚàÖ³Â÷¥È8C57za*;G_û­ÎÎcç°ÎV£[OK¯\sK*V<#|XŠ,€3ÖèanK¯{ÌçÃ÷€¥Ê8ƒî%,²yjnøüð`©²Î`í¯ÿIô@Vº'.?ÿ—2 à¬~?ð½WGÏd¡ì¬MÍÕ/Ž?ÿ—0 àŒÖ9â“ÑóYè¾yø¹¿ÔYgµ•ÏNåÚ;£gê­ßIÍÍ_î/qÀ®{—£Çj­wîáç}DÀY¿1tû¡èÙ€zê·Ss‹Wæ¹cXg»ÞYÛDÔRï¬mÂÏù¨,€3^sËW§4èEÏÔK·/AÙîÀÙ¯Ñ^ÑcµÒ;mÓðó=2 `jm󺔆ýèY€Z(»¤æ¦/ ?ß#³V¤þ¥ûEÏ ÔB÷¤áçzœ°"µ¶}CJå0zf ÒÊâžÔÜèáçzœ°Bõ¯<4zn Ò:G~*üÃÏæe³]së׌¯Fç[Ÿ ÿa4}í=ß=skØO­Þ~&hô84:ÇÿWø£ùÕÿî7¢GÂôNÝ8ü,.*R{·w³F÷ÔÕá?ŒæWsËW¥Ô-¢ç–ÜðÞ«Æ}©½Ï·F÷œíÂÍ¿îI+¢g–þ­ßß~ªsøßºFÿªo†ÿ0Z€V­ŸÊoŠEX2=ïb¦Ië¾Ùø±k î½&ü‡ÑÂÔ>à/£g–ÄðÞ«½õ»lòW1~üiÐO¬ð}yuipýñÑ3 ‹Ë[¿iê=ážïŽÂÆèÿi~õõá?¦ÖW~)¥~;z4`ÑtO\~ÞUlÃç¥ÔïþhlúñøJ Öh0 Ž·ž•Šë…ŸµEkïóG?|Ç `Ã(-`<+ ý/ÔEÙ}düNWø9»¬šõÎØòÇÀáC·…ÿPZØZ»¾3¥r9§° :¾¾6ͧÁýø8Ò´Q×®þ»FÍ(,¨þ•‡†Ÿ«E…knþò”†ƒŸ\»Çÿgø§~²7~Q*×Þ5«° ʇnMÍÕ/ ?W‹ 7Úóë‡ ààîï†ÿpZøÚû}0bV`a z©µë»ÂÏÓ¢â îºì‰À‘æN¿þjáë_¶ÿR+,ˆîÑŸ ?G‹Š×Úé×~âqý±Ð÷׳æ&?ÊGîZÊy€y}kE±|ðs´¨xý wêpØ^›Š_þƒjáóV0U2ú~ûæj;I1Ïš[¾:¥~ç©À‘îI+ÃX-NýKöYª¹€éõÛ©åcii!ê·Ó>Ä?±[kR±Ñ Ã`-|£ÿ’òWÁ̺Îaÿ3üÌ,jPs‹W¤ÔkÍm?ð¾c¯¶µ÷þ}7ˆ`fõÎÝ>ü¬,þÿöî'T³ºŽãø˜™a‹j!V´°EÑÂEAѦDj!-¢Ù¸‹iÓ¨ EwÆRf´éd:ΨÍÀPCfC„$)$Å8ÈTJ)³1Tì>ÿÿÜ_<',œñyž{žû›y>¯|÷÷œß9üÞÜ{Ï9+Ë1Ó÷ó<¿n–~§´ö¾¯ún3ƒGö.ðÖ€ |ç÷Æ·Tß'[K0ÝŸ|¢”ñxÆœüùý‰û«ÿðfß ~Íç` ¶É¿(µ÷¼«þ¹²³óò2záÉóžïsàD÷ÞÏÖ?³é|÷ƒ¥ô[Mß¿0»A»t~ø‘ê{ckIfð»=oxÊÏ€ãÕ3¥uË{ªˆYÌôŽlkòö€Ù­­•Þ¡­Õ÷ÄÖ’Lwÿ§ÿ盿sàÄð™‡ÊêöK«YÌ ÿt¸©[fÖÿÍ·ªï…­%zç߸õ¯©Îû–©ç¡›«”YÐÅrÓ;ÊøÅ¿nôþ€™ O𥕆f×eôìï§>÷Sàä)’îÁÏ×?8³éÜþ¡õ—nÀfýý‘õ‡jï­e˜/[xw[¦_©Aéì»®þAš…Lïç_˜ãö€Ù_üKiï¾²úÞ×Z†Ù~I»sæ5˜>'z­Ò¾ã£õÖ,d†í›ù€Y¬­>_Ú{¯®¾çµ–a¶¿© ýÁ\ë°eæ…ë¼T:?úXýƒ6ÍÏ®+ÊøŸ§æºà¬õþ]:·¸þ~·²³óò28up9×õ;¥sÏõõÞ4>ÛÞ_Öº/Ï}AÀë JwßµÕ÷¹e˜öMo/çÜÐrÌ€ãQéùbõ“`šŸîÝ×Mõ!˜ú]‡o¨¾¿-Ãt¾My|ÃK2¾jðؾÒÚõ¶ê'Ä4;ý£_ßðÅý£_«¾¯-ÃôßÐØW¼6€£3.íï]SýĘfgxüî&.‚yÑó– O{ÏUepêP£ëÒH®ëwJï×ß,«;.«~¢LC³ó­e<ÃK%àµßZ/»˜gÇ›Kÿ¯”qç¥Æ×¦¹|Õè…'KçÎOÖ?i¦‘ißòî²öÊé¦/–ÜðwøÊÇÊüÓ½ëSeô [ŸÆð¬áã?+mz/ÅLÙŸ<ºÓ˜¼WvòŽºÚû×E7Û/)Ý{¯/£g]ø-,Ï>õ«ÒùñÇëŸTÓÀ“ÁÃE_.\ä†Ç÷—ÖŽK«ï[Ó´w_Yú÷©Œžß¼wñ.<Ï>Vz|µ´v_UýD›ùÆçâ8Ÿá‰{ÄßÊtÓ¾ù¥whk>ñ‹R†ýM_«M ÀÿÖ+Ø=²­´oû@õ0³Íà·ßÞôK€ ßðä}âoåÜÓ¾õ½¥{à3¥ÿðwÊèôKÕý«Úæàÿ¿ò\?Pz¿üréÜumií½º¬®ø§Ñ ú£ÓÇ÷×¾l¸€¬½ü·õßfõ~.wm-½#ÛJïè7JÿÁë¡78ùÓ2zîX_€ÿG_=Ø\ Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€0 Œ#Â@€’å?„Öå[Èá:IEND®B`‚‰PNG  IHDR’ äVAK pHYsèèµ{Rk IDATxœìÝ]¬äu}ÇñY`-Ñb¼è…ib ñlZmkÚ¦OhZ55mzáM{¡iZ›pѦ©^”„º€i¥»¥ËƒòÌJ!DEE°Ð¢)`5ÀVŠåÁ𠦬’EXÏ!iüÌ}ßûåµxrm‰¶kG¾zIëÓÖÅlp´z—ÿJûël3«WZïà»jò샵è6$Í^~¶ú7½×Ÿ°Ùæo÷‰5>tMë—¬«Yÿ¥ê]ú–ö×ÛfV¯¸];ÖZÈôè·kQ-^Hõkx÷ÞZ9÷ÕíŸ@[¾íÙY㯪õ«6ìØw÷ŸÚþºÛÌê‡î¼Sjxïþªé¸ÍB…¤É·¾\Ý‹~¦ýfËûI¤ÿ¸±õË6ÔôÈ“ÕýÈëÛ_›Yý¨u/ysMþëþZ$‹’†+5øüŸ¯}kyë'É–t»OªñßhýJ€M1=|¨ºç¿¶ýu¸™ÕÜž5¸óœªñ°Aó4yîáê^ü³íŸ[îO"=t}ë—lªÉÓ_ª•½'·¿7³JÖýØ[kòÂãK’¦ÓÞówµ²çUÍŸ [öˆtC³—´4yôskŸÎo~]nf•¬{Þ×èеË’¦ý—«ã{š?¶äÛuB¿v]‹—,ŒÕOçûµl³­µþMï­v—#$­~ «{Ñ›št[òíÚQã®ØìÓÒè+·¿F7³šgÝþbM_üæöIã'î¬_èf‹‘î¿l3O}XxÃ;În­nf5×>òúš<ûÀö I£®ô··¶ ŸDºr³N{Ø:f³|öÛ_³›YÍû½IãÇoÛ^!ip×_7?°fßû$Òå›qÊÀÖ4Uÿà;Û_»›Y͵Ý'mÚ—polHšNkpÛ_¶? f»vÔè«—lèéÛÁlp´z—¾¥ý5¼™Õ\Ûµ£†_þ‡-’¦“êöýí¤ÙjDúÊÅvªÀv3;z¸ºûÞÐþZÞÌæÞð‹çmÁ4Vÿ3þ¶Öc£{÷mÈiÛÙô¹‡ª{þ)ͯçͬ3÷†÷]¸µBÒàö6?hf«ÞuÎFœâ°&O±Vö¼ªùu½™uæÿËœû¯Ø!ià'#mA6¸å¬µ_žŽÝøÁ«š_Û›Ygþí>±F_ÿÔb‡¤ÕÚÕü@™­F¤ß³ö=]Àñ[ý¤ëk|3ëÌ¿½'×ø™û3$¿míçæš$[úõ¾£jî™ú 5~÷XÞË€Í2›Õà“ØüþÁÌ:smüÈÍë’ÆÞÒüAÙò®»ï 5;zøxÞ΀Í2êVï’Ÿk~afx½§W‡ë’¦“êú€5ÚêöMŸ{hÞÍ€Í2=òDu?üºæ÷fÖ‰7zðšõ I£‡nhþ`lI·ggMž¼s=ÞÇ€M6yìÖZÙµ£ý}…™U²Þ…o¬šŒŽ3$MÇÕ=pzóc˹ñý—¯ãÛ°Ù†wÓü¾ÂÌò<¾4úÚõÍ„-ç†wï^Ï÷/ …é¤úßÑüþÂÌ:ÑzQ5{Hê^úóÍ„-ßVåaõ×€­oÖ;RÝ¿?­ù}†™u¢¿qû±…¤ñ“w5ÿ—·å[ÿê3ÿ‡½;²ì. ý½3@‚„ ""^EPT½*^.ÈðS ^àGUOé$yžçt2“yî‰Ìó<'dž;éœ}泿wU%`z¨îªÚïÙg?Ÿµž?îZ®u‹J×»û}»jWJ½öl<¿$I’$5xèšÔ˜ÿâð}ÈV«uÈGÖîÔ<ôcá<õûº¢µt6ž[’$I’‚ë]±OøÎd«7¾Nê?vëš’K’sÖ‹ÿà©|‹_JƒGošÍç–$I’¤àÚÇ!|÷²ÕjŸùÝ5;$µÏÿ ©‘ñuSÿÖSfóy%I’$iêµRsÏwÆï @Z•|Û×¥ÔïMñ4è¥Æ6¯ ÿ ©î…Û•ðÄ’$I’4 OÝò…/ßC€UëÝ~úÔI½ÛÏÿ`©ö1Ÿ.ãY%I’$iˆêÝxlø.d«Ô>ö_¦vHj÷¹ð–zhîùû)uó2žS’$I’†¬ÎI_ßI€l¥&¾s0õ:«9$õ:©±ðá,£/_´Y*ž¹¿ÄÇ”$I’¤¡ª×NÍ=~/|7²•êÝqÖªI½[O ÿ ©y/Jƒû.)ó%I’$i“$I’$U ö±Ÿ ßU€l…OݳâCRÿ‘Ã?8F[ë ¦4èE<—$I’$ sFjîòÖðøE½«Zñ!©óãÂ?8FWsÇ7¥¢ùdÄ#I’$IRî³+>$µŽøûðŽÑ”oñ²4x䆈g‘$I’¤ Õ½t·ðýÈ~Ns—ßZñ!©±è5á#h|Ô»ñ؈g$I’¤ Ö:âïâ÷ ýÌøºiÐzúçIƒ'ïŠÿÀIÓ¾ù ’$I’T±ŠCÿØÐ IDATæS)ßî á» ýLÿîsþÔ½þÈðŠÑÓÜç=)õ»‘Ï I’$Ilbiø.ˆèÈ&u¼ÓÏ’Úg}/üƒb´ä[¾2Kï|öH’$IªpÓ¿¾×Ù¤ÎI_þùCRóÐ…PŒñuSÿöÓ#Ÿ9’$I’ª^¯š»ÿnü~¤Öñ󇤆Ÿ?eu–̉|ÜH’$I‘_—ó^¾ã@ÝåÛ¾îg_—Yê6'³VôÅhhðþ”ýЇ$I’¤Ñ©{ává{ÔÞø:“ß%8QÖì–øˆ‘/Ú,Ï>ýœ‘$I’4JƒÉ«‰Þw îЧ2ù%™õn;-üƒaÌY?õï½ ú#I’$i+ž¹?å[¾"~ï±úÜwÉä×cÖ½lÏð†ê›øvSI’$Iš­z×.ß{ Qcý›ŽŸüZÌÚçÌ ÿ`¨¶ÖaRQD?W$I’$xí£þ9|ÿFMõ®:pòë0kŸô•ð†êÊ·ß<Í'£Ÿ'’$I’jPÑZšr¿uBt/Ùuòë0kõ¿Â?*jÞFiðàUÑÏI’$I5ªçY~ó8Œ•¯{Þ–“_ƒYó …0Tû)I’$IeÖ>ñßÃ÷!hÔLç¬ïM~ýeÍýÞþÁP=­ƒ?ì½H’$I’bê4R¾Ã¯‡ïEШ‘ÎYßüòËò½ÿ0üƒ¡Zò­7MųG?:$I’$Õ¸þ]KüˆŒ|GR¾ûÿÿ`¨ñuRÿÖ“£Ÿ’$I’”ÚÇ!~G‚±º’výíð†êèœòÑÏ I’$Iúïßâ¶íëÂ÷$hÔ@çìÿòë.Ëwy[øC54w}[JÝfô³B’$I’~Vÿ¶SÃw%hÔ€CkfÞ‹Òàák£Ÿ’$I’ô µýLüÎc£Í!‰5Ò½x—ègƒ$I’$­0?âÙ¬sHbÊZ8¥¢ˆ~6H’$IÒJëßrRøîæÄ”ä[ošŠgŽ~&H’$IÒjkõÉð #Ê!‰Õ_gòª/I’$IU¨ÈOùÖ¯Žß¥`lô8$±Z“¿ý$I’¤5ªwýÂw)hŒ ‡$V©¹ëÛRê6£Ÿ’$I’´Æµ<|§‚ƈqHbåæn˜_=û%I’$i­*žº;5æ¿$~·‚±ÑáÄJuÏ=÷%I’$iZuÏß*|·‚ÆqHb…š»ÿnJýnôÌ—$I’¤é5èMî7Ñ;4F„C¿hÎúiðà•Ñã^’$I’f¤Áý—¦Æøºñ»ŒUŸC¿ {î¼è9/I’$I3Zû„ ßµ 1’XÁ´u¢g¼$I’$ÍhEó©”oýêð çÄó#m’$I’F¸Þµ‹ã÷.«6‡$þûÃ’¹Ñs]’$I’fµÖA ß½ QaILjîþ?Ò&I’$iä8|W„FI’ªdÁÆ©xöáè)I’$IZ¾A?5wµS“Õ‚CR…tÎú^ôx”$I’$­ ÞÇ„ïŒÐ(CREä _žŠæSѳQ’$I’´¢Š"5÷|gøî³Í!©"ºç-Œ‹’$I’¤UÔ¿å¤ðݳÌ!©ò­7ME{YôL”$I’$­¦æ^¾CBc9$U@÷Ç;EÏBI’$IÒêßt|ø Yä4äòE›¥ÔÍ£g¡$I’$iªïJÚýá»$4f‰CÒë^´Cô”$I’$­A½ë ß%¡1K’†X¾Õ«RÑy6zJ’$I’Ö¤bš»½=|§„Æ,pHbÝ ·’$I’¤µ¨wíâðfƒCÒÊ·úe¿©M’$I’ªÚ Ÿš;ÿføn æ4¤ºço=ö$I’$IÓ¨wõAá»%4f˜CÒòÝH’$I’4"ß•´Ó›ÃwLhÌ ‡¤!ÔýÑ‚èq'I’$IšzWì¾cBc9$ ›§"›:§+u/Ú~ò5xðÊT´–F¶$Iú…Þ4ùŽÜè=kÉ!)ØÄ_‚Ó =Ë$IúYų§þ=ç§ÞU¤ÎYßMíüCjîþ»•|Ah¾å+Ss¯?Hí£>™:g}/õ®>( º:¥~'úÓ,Iªq­Ãþ:ü kË!)X÷Âm£g˜$©ŽÅäŠõn:.u–ÌIí#ÿ15÷ø½”/xiø³±s7HÍÝß‘ÚÇ~fò»˜úw“Šü‰èÿ*’¤šÔ¿÷Âøg!Œ­‡¤H 6NEóÉè&IõúÝÉwM¼ƒ¨sê×Rë ¦|«WÅ?‡P¾Ã¯O—&ÞÕ4qh“$i¶jîûÇáÏ=h¬‡¤ÈOþÉ_ž]’¤lò;®9$µOø·ÔÜõ·ScÎúáϼ*ÿzû˜O§ÞûN¾4\’¤™ªóßsÐX IQÆ×IƒÇož]’¤ª7è?÷ÝFWì3ù4ùöoŒÆøw,M|W×Äo“óŽCIÒ´*ŠÔÜÕNV9IAZ‹?=¶$IU¬¤Á}—¤î¤ÖÁNù/ ¦ÕU¾õ¦©}쿤ÞǤÔmFÿÉ$U°Þ•û…?Ï ±†’‚ôo?=zfI’*ÒÄûô&~¥}û„/¦|›×„?ÃXù/ž|ayÿ–“&ßI%IÒ”êµS¾ÍkãŸc06uIš;þÆä¿(K’´²_›ºço•ZûýijÌY/üÙÅÔå‹~eòÇß&¾sL’¤ÕÕ=oËðg¬ ‡¤Ý ·‹žU’¤akÐOý;Μ|Av¾í¯†?«˜Í]~+u/Ù5­§£ÿ„I’†´"<5æmþÌ‚Æ9$•mþ‹S‘?=«$ICÒàÁ+'¿{%_´Yü3ŠÙ3o£É—¡º:úœ$ikÿ…øgŒMCRÉÚÇ}.zFI’†àÇÖ:g~'åÛoþ\¢|ͽÿ0õ®]ì]J’¤Ÿû»Aôó SäT²Á—GÏ(IR@ÅSw¥î¹ó'Ô)úYÄpÈ·cê^º›ßø&Iš¬uÀûŸMИ‡¤5÷zWôl’$•ýÞ£›OH­C>’ãë†?‡NùÖ¯ž|±º÷(IR½ëßt|ø3 SàT¢Þ•ûEÏ&IR ËJÝ-Hùv¯öPùÂM&ÿbV4ŸŠþ#,IŠhПünÕèç4VÃ!©$ù‚—¦¢½,z4I’f±þ½¦ö‘ÿ˜s7îP]ù/K%sýÈ›$Õ°‰ßðý‚ÕqH*Iû‡ÿ_ôL’$ÍFÝ|ò=7Íßþ¬a´äÛ¾î¹ïfô¢ÿ”K’Jjâ»R 6Ac’J2¸ïâè™$IšÁŠÖÒÔ=oáäûm¢Ÿ1Œ¶æ.o|o†$©uNúrø³«àTÒ_%I£QÑxtòÇŽò…/¾P/­ÞŸÞý% Išåß–ãë„?w ±I%èþxÇèY$IšfÅÒ{RçÔ¯¥Æü‡?W¨±¹Lþ9ôÞEIíZ(þ™c+æ4Ûæ½(ùãÑsH’´– ž¼#µùß©1gýøg üÙpHšEƒ¯Šž;’¤Õ¼H{â»8¢Ÿ0ÓZGü]*šOE‰I’¦ÙàþKß)Ðx‡¤YÒÜõmÑ3G’´²úÔ½`QjÌÛ(üy³ù›Ýú?¹(ú«M’4Íš{þ~ø3ËqHš% Š$iøêß}njîòÖðç”bÎú©³dîäoÿ‘$U³Þå{Å?O`ì¿9$͆ñuSñÌýÑóF’´\Ų‡Rû¨OÆ?# @뤢ñhô—¡$i-*ÚËR¾ÅËŸ%ÐxžCÒ,høѳF’ôÓŠ"u/Û#å 7 >@¤|»×§ÁƒWFEJ’Ö¢ö‰ÿþŸrHš½+öž3’¤‰Ò³¤Öâ‡?`hÌ{‘ßê&IlððµñÏ{ŽCÒL›³~*EÏIª}½MùV¿ÿ\€!Ô>á‹)õ»Ñ_¦’¤5¨¹÷†?? á4;ï $ÅU´Ÿ™\’£Ÿ0ìZûÿ™÷&IR…ê]u`ø³I3oâ‹[’Sÿî¥|ûÍßPÍß”OÞý¥+IšJÝ<å[¾"üÙ‡¤4wÃT4ŸŠ/’T¿½Ô9ã¿&kfø³*&ßzÓ4¸ï’è¯bIÒêœúµðçt’fNë°¿Žž+’T»&ÞK×:ðáϨ´y¥Þ GE9K’VÓà±›Sc|øç©Î’fPïÚÅÑsE’jUÿ'¥|›×†Ï sÖKÝKwþ²–$­¦æ¾ÿÌ Õ™CÒLþX[ëéè™"Iµ©{É®©1wƒøù#¦sæwR*Šè/qIÒä/Y6ùÈîÛ¤öþgÊ·{}øs:I3£uÈ_EÏIªG½Vjÿù𹣬}â—R*Ñ_í’T¯½4xôÆÔ»æÉw!5÷|çäw‹F? ñI3¤wÅ>ÑcG’F¾Á“w¦æîïŸùPíã>›Ò ýe/I#Ûà‰ÛSïÚÃRçÔ¯§æ>ï™|_]ôì‡Æ8$Í„ñuSñìÃÑsH’FºÁý—¥|ëWÇÏ|¨‘Öa“R¯ýå/I•¯h-Mý;ÏN%sSkñÇ'cfôŒ‡ÆZrHš­ýÞ=—$i¤ëß|BjÌIø¼‡:júÑ”ºÍè1 IÕ©ÓHý{/LÝ‹wNíc?“š»¾ÍoZ#‡¤нh‡èQ%I#ÛÄo‘ò~ˆÕ:øÃ¾3I’Vö^£‡®N½Ë÷Ní㿚»ýŽ¿·FCÒ (žº;z|IÒèU“ßþ=ãç´ùˆc’¤ÚW,{0õo9é¹Q;胾cšTGIÓÔÜãDÏ2I½zíÔ>êŸÃg<ðó&~õôÄ¿¾KR*¦þ­§¤Î’9“¿¥;ßê—Ãç04†€CÒt?çŒGÏ7I­:Ô:ð/Âç;°bí£ÿ—ßæ&iDßktAê^´}jõÉ”oÿÆðy !å4Mƒû.‰y’42gSkÿ? ŸíÀªµû\JÅ zdHÒÚ¿×èákSïŠ}Sû‡ÿšš»¿Ã{`lê’¦aâW6úK”$Íàw"ð¾ðÙLMç¤ÿ=5$iJy¯d3Ê!iºÿ'Iš™#Òþ>×5Ó½`›èé!I?WÑz:õï½0u/X”Z‹?žò­_>+¡1b’¦¡wã1ÑsR’Fâ/|Í}Þ>Óµ0¾Nê]u@ô‘T×úÝ4xðÊÔ½xçÔ>ö3©¹ëÛ&çRøl„±Ñæ´¶ænŠÖÒèÑ)I#pDú£ø™¬½9ë¥þÍ?Œ'’F½A? ½1õ®9$uNýZjíû'©1ïEñ3ÆêÇ!i-µxô(•¤j×m>÷—À!˜éÀ4-Ø8 î¿4zªH¡Š¥÷¦Þ G¥Îéßzîq,Ø8~Öi‚CÒZê^¸]ôl•¤ê6è§Ö៟åÀÌ™xI±ôžèé"©‚Í'SÿöÓS÷ÜùÞkcÃÏ!i- ¾.zÞJReëœüÕð9̼‰÷“LüȪ$­ò½F?¢vÅ>ÞkcÕä´òE›¥TÑ#X’*Y÷Üyás˜=­ƒ?œÒ =j$ CÞki9$­…‰Ë¹$iÍë]¹_ø f_ç´oDIËLý[NJ%sŸûµ-_>€lÆ9$­…Þ5‡FÏhIª\ý[ON9ë‡Ïp ½Ë÷Š;’f±¢ùTêßqfêþh‹Ô:ì¯'j#zîY)’ÖÔø:©XöPôÜ–¤J5x䆔/xiü Ê3wƒÔ¿çüèñ#i&êµÒà¾KR÷â]Rû˜ÿš;¿Å{`¬¾’ÖPs÷wDqIªÜ¿X6w|SøüÊ—/ú•TO€lh8$­é'ìŒoGÏuIªNÅ µ,|vqš{ÿaJ½vô4’4å÷½2|nÙPsHZCýÛN‹žõ’T™:猅Ïm ^ûÄG’&ŽF­§SÿγR÷¼…©uøß¦|›×„Ï «‡¤51gýT´—EÏIªDý›OðþàgzWî=–¤z5è¥Á£7NþˆZû„/¦æ®oKñuÃgUžCÒš~k¶$iµ »9å[¼,|nCdÞFiðÐÕÑãIÍŠÁä³wò½F'%5÷zWjÌÝ0þëH£È!iM>YgþßèG„$ ½Vjîööð™ Ÿ‰ßôä»»¥éW<ó@êßüÃÔ9ë{©uàR¾p“ð¯o « ‡¤5àýH’´ú:§~=|^ë}Ô'£Ç”T©&ޝý{/LÝ‹wNíc?óܨ Á×2Õ–CÒ½é™èçˆ$ uý;Ïö^$`µzW=®¤áÌ{€±áç4EÞ$I«®h-MùvoŸ×@EÞ—ôðuÑcK ¯Xö`êÝptêœúµÔÚ÷ORcþ‹ã¿>ÆVÍ!iªŸ(ïG’¤UÖ>òŸÂg5PÍ];¥n=º¤Ò*–=4ùM;g?µúKï5RU9$MQÿÖS¢Ÿ=’4´õ®94|NÕ3ñÛ¥¤Q¬è<ë½F@UIS1¾N*ò'¢ŸG’4´ÿÂê_Uµ2¾Nêß~zô“¦W¿›^™º—í™ÚÇ}Î{€4ê’¦`âa IZq¿)zNÕ•oýêT4eҽרËI©sæw¼×Huä4íþ-úy%ICYÿγÂg4P}­Ã?=Τ•þ"‰‰ßHÚY27µ<å[½*üë Ì!i zWý “¤á«×NÍ3|F£Áß·÷dSâ4ƒÇo‹~®IÒÐÕ=w~ø|FG¾Å/¥bé½Ñ£Muz¯ÑCW§Þå{¥öñ_HÍÝÞžsÖ ÿ:hT€CÒjL|ûj*ŠèG$ Uƒ'ïLy…Ïh`´´ü ïRIï5zIøŸw€FE9$­Fëð¿~îIÒÐÕ:ä¯Âç30šzWî=âTñ&^ÞÞ¿õäÔY2'µùHÊ·|eøŸk€ÆqHZîù[E? %i¨êßs^ølFüGÜž¾/zÔ©*u¿ø^£ñuÂÿ4F˜CÒjôï:'úñ(ICUsŸ? ŸÍÀhkúÑèQ§alÐOƒGoL½kIS¿öܨÍÝ0üÏ+@£f’Ve|É_ù)Iz®ÞÇÆÏf &Žªw?{¯Ñ’¹©uн×`l88$­Bsç·D??%ixôSs—ß ŸÍ@=L¼×fâ]7ªGEã±Ô¿íÔçŽF‡~tòÞDÿ [!‡¤Uhóéègª$ M½«ŸË@½ø»ØˆÖï¦ÁƒWz¯ÀX59$­B÷â]¢³’4õ;)ßá×Âç2P?ý;ÏŠž€šNÞkFCÒ* î»8úÑ+ICQ÷²=Ãg2POÍß”R·=5ÅŠ¥÷¤ÞõG¦ÎéßJ­ýÞ› 6ÿ3@6£’VfÎúþÒ"IƒÔÜéÍñs¨­ÎÙßž„ZAEþDêßvZêž;?µ,å[¿:üÏ Ù¬sHZ‰æn¿ýl–¤¡ÈojÂÍÝ0 ½)zÖ;ï5`ì9I+Ñ>ö_¢×’45÷yOøLhí÷§)EôH¬ï{æ½(üÏÙPpHZ‰îE;D?Â%)¼þ½†Ïc€Ÿê]wDôXÉŠe¦þ-'¥Î’¹©µøã)ßòáÿ­Ȇ–CÒJôï>7ú™.IáµÿDø<ø©|Ñf©h?=+ÝÄçoâ &DíÈœüœFÿw «‡¤•˜xy $Õ¹Áã·¥Æøºáó`y3ÿoôx¬Ö{&~DíŠ}–{¯‘¹@6-I+o¿yôc_’ÂkŸø¥ðy °Âo?vKôˆÊЧîò^#ÒlsHZÖaý÷I ­h>•ó_>V¤uÐ_¦ºW<}ßäoÕœø­ÖïKù/ ÿï@V I+ú¤œ3ýwI ­{É®á³`U&^]—ŠÖÒÔ¿ó¬Ô=oáä?xæÛ¼&üó@V[I+лá¨è¿/HRhÍÝ7|¬Jsçßœ|ÐȾ×èšCRû„/z¯iØ8$­ÀÄÃ[’êÚྋÃç0ÀTt/Û3Þ{6 ÿ¼@c’^hî)õ;ѧ¤°ÚÇ>~LA¾õ¦“¿Î¾*Ëœü‘¼Î’¹©µøã)ßê—Ã?‡ÐXCI/0ñíÃ’T׊ÖÓ©±`ãðY 0U³¿Ÿ†±¢½,õï½0u/Þ9µýLÊwøµðÏ4f€CÒ ´üÇè¿wHRXÝËöŸÃkdþ‹SñôOb‡ç ç½F¤ºpHzî¹óbÿ""I5÷ø½ð9 °¦ÚÇ}¶ôQëÝp´÷êÈ!éz7Sê_D$iXaò/Í­ƒ>˜ò…›Äÿ8I/à7¶IªkÓ¾>ƒÖVëÀL{N¼¸»÷¹©{þÖ©uÄߥ|Û_ ÿß!ã´¼ñuSê6g`“¤ŠU R¾íëâç0À4ôo;u­Þk4ñ#jÍ=ßé½F0¶zIËÉ·{Ãì-i’4ÄõïZ>ƒ¦«¹ËoMˆVú#j·œ”:g~ç¹÷ÍqøÇ rHZNë€÷—¼ºIÒpÔ>áßÂg0ÀLè]±O*ž}ø¹£Ñ’¹©µøã)ßêUá4F„CÒr&)Iª]ƒ¾% sÖ‹ÿ`lt9$-§{Á¢èuN’J¯ÏùáóÈ*Á!i9½Þç$©ô:§V¸]£ IDAT3|þY%8$-gððµÑûœ$•^s§7‡Ï_ «‡¤Ÿ_'g£÷9I*µÁc7ÇÏ_ U…CÒóòm^½ÏIRéu/Ú!|þYe8$=¯µß{£÷9I*½Ö! Ÿ¿@VIÏkÿùè}N’Ê­ßI‡Ï_ « ‡¤çuÏ[½ÒIR©õïZ>{€¬R’ž×»þÈèN’J­sÖ÷Âg/UŠCÒó^½ÓIR©µöý“ðÙ d•âô¼¢µ4z§“¤òêµScÞFá³È*Å!i,Kù–¯ˆ^é$©Ôú?¹(|öYå8$e©¹ÛÛ£w:I*µî‹Âg/UŽCÒX–Z(z§“¤Rkö7á³È*Ç!i,Kíã?½ÓIR©å‹6 Ÿ½@V9IŸ„sÆ¢w:I*­bÙƒásÈ*É!i,KÝËöŒÞë$©´ú·œ>w€¬’’ƲԿåÄè½N’J«{î¼ð¹ d•ä4–¥ÁWDïu’TZ^´ 4Ö’CÒX6ù¾IªKùöo Ÿ»@VIIsÖKiÐÞë$©œ:Ô_'~ö©ŠjHÊ·}]ôZ'I¥5xðÊð¹ d•UûCRsïwGïu’TZ½k Ÿ»@VYµ?$µŽø»è½N’J«sÖ÷Âç.UVíI“þOô^'I¥Õ:üásÈ*«ö‡¤îy[Fïu’TZÍÝÞ>w€¬²jHê]}pô^'I¥•/xiøÜ²Êªý!©ÛiÑ{$•RÑx,|æY¥Õþ4¸ÿÒèÝN’Jipÿeá3È*Í!é‰Û£w;I*¥Þ G…Ï\ «´Ú’ŠüñèÝN’J©{Á¢ð™ d•VïCÒøº) úÑ»$•Rç䝯Ï] UY­Iù–¯ŒÞë$©´Ú?øŸásÈ*­Ö‡¤æŽoŠÞë$©´ZûþIøÜ²J«÷!iïwGïu’TZÍ#|îY¥ÕúÔ:ä#Ñ{$•VcÁÆásÈ*­Ö‡¤öÑŸŠÞë$©”Šö²ð™ d•WëCRçä¯Dïv’TJƒ'ï Ÿ¹@Vyõ>$-™½ÛIR) î¿,|æYåÕúÔýñNÑ»$•RÿŽ3Âg.U^­I½k‰Þí$©”z×ÿ |æYåÕúÔ¿õäèÝN’J©{Ùžá3È*¯Ö‡¤Á}Gïv’TJÝó¶ Ÿ¹@Vyõ>$=rCôn'I¥Ô9ãÛá3È*¯Þ‡¤'ïŒÞí$©”Ú'|1|æYåÕúT,{(z·“¤Rjóéð™ d•WïCRëéèÝN’J©}Ä߇Ï\ «¼Z’R¿½ÛIR)µù«ð™ d•WßCÒÜ ¢÷:I*­Öþ?w€Tuµ=$å 7‰Þë$©´š{¿;|îYåÕ÷´h³è½N’J«¹ÛÛÃç.U^}I;üzô^'I¥ÕÜñMásÈ*¯¶‡¤‰—¤º”o÷†ð¹ d•WßCÒÞïŽÞë$©´òm_>w€¬òj{Hjð¾è½N’Jkâ½pÑsÈ*¯¾‡¤C?½×IRiå[o>w€¬òj{Hjÿà¢÷:I*­|ËW†Ï] «¼ú’ŽýLô^'I¥•/Ü$|îYåÕ÷tâ—¢÷:I*­|ÁKÃç.U^mISþ#z¯“¤Òj,Ø8|îYåÕ÷tÚ7¢÷:I*­|‹—…Ï] «¼ú’Nÿfô^'I¥•/|yøÜ²Ê«ï!éŒoGïu’TZùV¿>w€¬òê{H:ó;Ñ{$•V¾õ«Ãç.U^}Ig}/z¯“¤ÒÊ·ymøÜ²Ê«ï!éìïGïu’TZùv¯Ÿ»@Vyõ=$3½×IRiåÛ¿1|îYåÕ÷´dnô^'I¥ÕÜñMásÈ*¯¶‡¤î¹ó£÷:I*­æ®¿>w€¬òê{H:oaô^'I¥ÕÜóásÈ*¯¾‡¤ó·ŠÞë$©´ZûýiøÜ²Ê«ï!é‚EÑ{$•Vë †Ï] «¼ú’.Ü.z¯“¤Òjö×ásÈ*¯¾‡¤‹vˆÞë$©´ÚGþSøÜ²Ê«ï!éÇ;Eïu’TZícÿ%|îYå9$IR jŸø¥ð¹ d•WßCÒ…ÛFïu’TZÓ¾>w€¬òê{H:«è½N’J«sÎxøÜ²Ê«ï!éÜùÑ{$•ÖÄwaFÏ] «¼Ú’:çŒEïu’TZ½Ë÷Ÿ»@Vyõ=$ùè½N’J«wÝásÈ*¯¾‡¤Ó¿½×IRiõo=%|îYåÕ÷tÊDïu’TZý{Ο»@Vyõ=$ôåè½N’JkðÐ5ásÈ*¯¶‡¤öÿ5z¯“¤Ò*žº+|îYåÕ÷tÜg£÷:I*­"<|îYåÕ÷tô§¢÷:I*¯A/5Æ× Ÿ½@Viõ=$ùÑk$•Z¾p“ðÙ d•VÛCRëðODït’Tjù¿>{€¬Òê{HZü±èN’J­¹×„Ï^ «´ú’þPôN'I¥Ö:øÃá³È*­¾‡¤Þ½ÓIR©Mü’èÙ d•VÛCRsïwGït’Tj“¿>{€¬Òê{HÚõmÑ;$•ZgÉÜðÙ d•VÛCR¾ýæÑ;$•Z÷â]Âg/UZ}I[½*z§“¤Rë]{Xøì²J«í!©1o£èN’J­Çñ³HUVßCÒX–Ò ½×IRi º&|îY¥ÕúT´Ÿ‰Þë$©´ŠgŸ»@Viõ>$-{(z¯“¤òôSc|ÝðÙ d•UëCÒàÉ;¢×:I*µ|ëMÃg/UV½I]½ÓIR©5w{{øì²Êªõ!©ÿ“‹¢w:I*µÖŸ½@VYõ>$ÝqfôN'I¥Ö>úSá³È*«Ö‡¤ÞMÇEït’TjÓþ3|öYeÕûtÍ¡Ñ;$•Z÷‚Eá³È*«Ö‡¤îe{Fït’Tj½« Ÿ½@VYõ>$]¸]ôN'I¥Ö¿ãŒðÙ d•UëCRçìïGït’TjƒGnŸ½@VYõ>$ôåèN’J­h>>{€¬²j}HjõÏÑ;$•^cÁÆáóÈ*©Ö‡¤ÖÁŠÞç$©ôš;¾)|þY%ÕúÔÜë]Ñûœ$•^kÿ?Ÿ¿@VIõ>$íøÑûœ$•^ûèO…Ï_ «¤Z’ò-_½ÏIRéuÎø¯ðù d•TëCRc|Ý”ŠAôN'I¥Ö½xçøù ¤*ª÷!i,›üUØ’T§z7>{€¬’jH'I¥×>æÓáóÈ*§ö‡¤ÎéߊÞç$©ô:g?|þYåÔþÔ>îsÑûœ$•^ïŠ}Âç/UNíI­C>½ÏIRéõo?=|þYåÔþÔÜã÷¢÷9I*½Ác7‡Ï_ «œÚ’òm^½ÏIRùuóðù d•SûCRcÎú)ƒè•N’J/ßêUñ3HUâ4–¥""zŸ“¤ÒkîùûáóÈ*Å!i,KƒGoŒÞç$©ôÚGü}øü²JqHËRÿîs£÷9I*½Îߟ¿@V)IcYê]wDô>'I¥×½lðù d•â4–¥îwŠÞç$©ôú·Ÿ>€¬R’&> g}7zŸ“¤Ò<~[øü²JqHËRûøÏGïs’T~ýNjÌY/|Ye8$e©uèG£×9I )ßî á3È*Ã!i,KÍ=ß½ËIRH­Þ>ƒ€¬2’Ʋ”oû«Ñ»œ$…Ô>þ á3È*Ã!iÂÜ S*Šè}N’J¯û£-âg0ªÂ!éyEóÉè}N’J¯wÝáóÈ*Ã!éyƒ‡¯‹Þç$©ô÷]>€¬2’ž×¿íÔè}N’J¯h<>€¬2’ž×»bŸè}N’BÊn>ƒ€¬’~ú‰8gƒ€¬’ž×Üå­Ñ»œ$…Ô»æð d•àôS 6ŽÞå$)¤Á}ÇÏ` UCÒrŠÖÒè}N’J¯ÈŸ¿@V IË'I!å[¾"|ÙÐsHZNÿ¶Ó¢w9I ©¹×»Âg0 =‡¤åô®Ø7z—“¤ÚG*|ÙÐsHZþ“±dNô.'I!u–Ì ŸÁ@6ô’–Ó>þ Ñ»œ$…Ô»ö°ð dCÏ!i9­ƒ?½ËIRHƒû/ ŸÁ@6ô’–ÓÜå·¢w9I ©h- ŸÁ@6ô’–“/xiô.'Iaå‹6 ŸÃ@6Ô’^ ÈÞå$)¤Öï ŸÁ@6Ô’^`ðÀåÑ»œ$…Ô9éËá3ȆšCÒ ôn8*z—“¤º—ì>ƒ€l¨9$½@÷‚EÑ»œ$…Ô¿óìð dCÍ!éÚ'þ{ô.'I!Ï<>ƒ€l¨9$½@ëàGïr’V¾p“ð9 dCË!éš;¿%z“¤°š{¿;|ÙÐrHz¡y/J©Dïr’Rû¸ÏÅÏa +‡¤˜xOˆ$Õ±îÛ„Ï` ZI+п÷Âè]N’BêßrRø ²¡å´½kÞå$)¤Á“w„Ï` ZI+Ð=w~ô.'I1 ú©1o£ð9 dCÉ!iÚÇ>z•“¤°š»ýNø²¡ä´­Þ½ÇIRXí#ÿ)|ÙPrHZ|ûÍ£÷8I «³dnø²¡ä´"sÖK©ßÞå$)¤ÞõGÆÏa #‡¤•‡€l¨8$­B÷¢í£÷8I «uà_„Ïa *I«Ð>ñKÑ{œ$…Õ9ù+ásȆŠCÒ*Lük¼$յ‡Ïa *I«o÷úè=N’Âêßs^ø²¡â´*ãë¤ÔmFïr’RÑ|2~i˜8$­Æà‘¢w9I +ßöWÃç0 ‡¤Õèßt|ô'Iaµýhø²¡á´Ý Eïq’VçÌï„Ïa I«Ñ>îsÑ{œ$…Õ»ö°ð9 dCÃ!i5š{ÿaô'Ia ¹>|ÙÐpHZ|‹_ŠÞã$)®~75æn>‹€l(8$MA±ì¡èUN’ÂjîþŽð9 dCÁ!i úw-‰Þã$)¬ö1ŸŸÃ@6’¦ {éîÑ{œ$…Õ½`›ð9 dCÁ!i*Ÿ¤“¿½ÇIRXýÛOŸÃ@6’¦ uà¢÷8I «Xö`ø²¡à4ù6¯Þã$)´|ëMÃg1…sH𢢵4z“¤°Z¼?|Y8‡¤)Üiô'IauNýzø²pISÔ»ú è=N’Âê]¹ø²pISýDùè=N’‹€,”CÒTÍY/¥^;z“¤°Ú?ø‡øY ¤HIk`ðÈõÑ{œ$…Õ=w~ø²PIk wÝÑ{œ$…Õ¿éøð9 d¡’Öè“õýè=N’‹€¬tIk©xú¾è=N’Âê]}pø²Ò9$­¥þ­§Dïq’Öà‘ëÃç0•Î!i-uÏÛ2z“¤¸½Ô˜ÿâðY d¥rHZKí#ÿ)z“¤Ðš{¿;|Y©’ÖRs—·Fïp’ZûÄ/…Ïb +•CÒÚš³^JÝ‹€lÖ9$Í€æžïŒÞá$)´î¹óÃg1Í:‡¤™0wÔúè=N’Âêßzrü,ÒlsHš!ƒ‡¯Þã$)¬bÙƒásÈfCÒ é]u`ô'I¡å‹6 ŸÅ@6«’fêyÊDïp’Zë¿ ŸÅ@6«’fHk¿?Þá$)´ÎÙߟÅ@6«’fH¾à¥)ƒè=N’ÂêÝxlø,²Yå4ƒß½ÇIRXÅSw…Ïa ›UI3¨wý‘Ñ{œ$ÅU)ßò•á³ÈfCÒL~2ÏüNô'I¡µxø,²Yã4ƒZýeô'I¡uNÿVø,²Yã4ƒò­7Þá$)´Þµ‡…Ïb ›5I3¬xú¾è=N’Â<~kø²Yã4Ãú·œ½ÇIRì ·¾<|Ù¬pHšéOè’¹Ñkœ$…Ö:ðá³Èf…CÒ k-þxô'I¡MüËèY d³Â!i†å‹~%z‡“¤Ðz7>‹€lV8$Í‚â™û£÷8I «xú'ásÈf…CÒ,èßüÃè=N’BËm>‹€lÆ9$ÍÆ'õœ±èN’Bk-þXø,²ç4 Z‡|$z‡“¤ÐºçÎ ŸÅ@6ã’fA¾Õ«¢w8I ­Û©á³ÈfœCÒ,)–Þ½ÇIRXEã±ð9 d3Î!i–ôn<&z“¤Ðòí7ŸÅ@6£’fë{Öw£w8I ­ýƒŸÅ@6£’fIë Fïp’Z÷‚mÂg1Í(‡¤Y’oùŠ”Š"z“¤°úwŸ>‹€lF9$Í¢Á“wDïq’VÑ^–ãë†Ïb ›1I³¨wý¢÷8I ­¹Ë[Ãg1͇¤ÙüäžñíèN’Bkû™ðY d3Æ!iµx_ô'I¡u/Ù5|ÙŒqHšEù/K©Dïq’Öà¾KÂg1͇¤Y6xì–è=N’âêµRcîá³Èf„CÒ,ë]»8z“¤Ðš{ü^ø,²á4ÛŸàÓ¾½ÃIRhí¾>‹€lF8$ͲÖ~½ÃIRh½+÷ ŸÅ@6#’fÛü—¤4èGïq’Öàákãg1f‚CR Þ½ÇIR\ƒ~j,Ø8|Ù´9$• wõÁÑkœ$…ÖÜ÷Ãg10}Ie|’OùèN’BëœúõðY dÓæT‚æ>ï‰Þá$)´Þµ‡…Ïb ›6‡¤2ÌÛ(¥~7z“¤°ß?‹€4]I%™ø­E’TÛŠ"å _>‹€lZ’JÒ»rÿè5N’BkøðY dÓâTÖ'ú¤/Gïp’Zç¬ï†Ïb ›‡¤’4÷zWô'I¡õn:.|ÓãT–¹¦ÔkGïqÿ½;šì. ü_ÝYÙ! "‹ŒŠ²éˆ  ‚€Ì¨Œ þE·aÑ‘qùÛo/Iwö„ì;ÙC’ξ’­³'²’=dßÈÞéNß[{Ýßœz#!Iw¿o¿UϽ·>Ÿs¾ž9gŽž·;uŸûþž®º•¢«î‰ŸÅ’$I’Ò†d‘4Æ÷_}Ž•o÷sá³X’$IRcÖY$±Þö‰>ÄjößÃg±$I’¤Æ¬³Hcí¾}†Õ=wIø,–$I’Ô˜uIc¬¹ûÛ£Ïp¡ú·œ>‹%I’$5fEÒ8›šŸŠöêès@˜"$~K’$IJ³Í"iÌõï8/ú*ßéMá³X’$IÒì²HsÝ ·>Äj/ÿ\ø,–$I’Ô˜UIc®ý?‰>Äê^ºKø,–$I’Ô˜UIc.ßþõÑg8€Pƒ{/ ŸÅ’$I’³Ê") â‰û£Ïqqú”-Þ,|K’$IjÌ8‹¤€ú7ž}ŒÕÜ÷}á³X’$IRcÆY$Eü¥ŸõoÑg8€PÓÿ!|K’$IjÌ8‹¤€Zþ^ô TïÚ#Ãg±$I’¤™g‘P¾ÕKR*Ñç8€0Åãw†ÏbI’$Ig‘Ôà¡¢Ïq¡òí^>‹%I’$5f”ERP½+Œ>Äjñ©ðY,I’$©1£,’‚jŸô·Ñg8€PÝ ¶ ŸÅ’$I’3Ê")¨æ^ï‰>Äêßq^ø,–$I’Ô˜QIQ-Ú$¥n3ú§“¥láÆñóX’$IRZß,’ëß}Iô1 Tsw†ÏbI’$IëŸER`ÝKvŽ>ÄjŸô7á³X’$IRc½³H ¬}ôg£Ïp¡†ß`=‹%I’$5Ö;‹¤ÀòÞ}†5xøÆðY,I’$©±ÞY$WdEŸãâEÊ—½"|K’$Ij¬WIÁõo>5úªuðÇÃg±$I’¤Æze‘ý`ÅÂè3@¨ÎŠEá³X’$IRc½²H ®uÈ'¢Ïp¡ú·œ>‹%I’$­_IÁå˶˜~FÀ¤*š¥lj^ø<–$I’ÔXgI%hðØ­Ñç8€PÍ]~)|K’$Ij¬3‹¤Ô»æðè3@¨ö±>‹%I’$5Ö™ER êœöõè3@¨î÷÷ ŸÅ’$I’ëÌ"©5÷}_ô Ôàþ+Ãg±$I’¤Æ:³H*C‹7K©×Ž>ÇÄôR¶å‹âç±$I’¤´¶,’JÒà¾DãBµøPø,–$I’´ö,’JR÷²=¢Ïp¡:gþsø,–$I’ÔXkI%iøE“¬wÃqá³X’$IRc­Y$•¤æ®o>Ä*žøqø,–$I’ÔXkIeij^*š+£Ïq¡òÞ?%I’$¥çË"©Dõo;+ú ª}ÔgÂg±$I’¤Æóf‘T¢ºç/>Äê^¼cø,–$I’ÔxÞ,’JTëð?Š>Äêß}qø,–$I’ôüY$•¨|›WGŸábõZ)[´iø<–$I’ÔxÎ,’JVñø]ÑÇ8€Pͽ#|K’$IjÄê^¼cø,–$I’ÔxVI%¬}Â_EŸáB î½,|K’˜Éj IDAT$Ij<+‹¤ÖÜýÑg8€Xýîô3ã¢ç±$I’¤Æ3²H*cSóSÑ~"úªuÀ‡ãç±$I’¤ô“Y$•´þçGŸáB oPѳX’$IRãY$•´îEÛGŸáBõo9-|K’$Ij<#‹¤’Ö>òFŸáB­Ç§?ê=%I’$ýgI%-ßá Ñg8€pÍÝß>%I’$5žÎ"©ÄOÜ}†Õ>éoÃg±$I’¤ÆÓY$•¸þ'FŸáBõ®9,|K’$Ij|K’$IjLg‘Tâò¥/K©DŸáBµúLø<–$I’Ô˜Î"©ä ¾1ú ª{é.á³X’$IÒ“Y$•¼ÞUGŸáB î¿"|K’$IjLg‘Tò:'ÿ}ô Ö —ò-_>%I’$5,’Ê^s¯÷Fá ¿| zK’$IjX$•¾E›¤ÔmFŸáBuV,ŒŸÇ’$I’’ERÜsiô TÿÖ3Ãg±$I’¤†ERê^ò­è3@¨¢ýDÊn>%I’¤I¯c‘TþÚË?}†×Üó]áóX’$Išô,’*Psç·DŸßÂuNùjø<–$I’&½ŽERšš—Šü‘è3@¨ÞµGÆÏcI’$iÂëX$U£þ-§GŸáB«î ŸÅ’$IҤױHªF‹¢Ïpáò~>|K’$IÙg‘T‘Z‡|"úünøåÑóX’$IÊ&8‹¤Š”/Û"¥¢ˆ>Äê^¶Gø<–$I’² Î"©B ýQô ÔàkÂg±$I’”MpIªwÍaÑg8€XÅ åK_>%I’¤lB³HªPS¿}„×:øãáóX’$IÊ&4‹¤ ÕÜç¿FŸßÂuÏÛ2|K’$IÙ„f‘T¥mšR¯}†Õ¿}Eü<–$I’LfIkpïeÑg8€X,e‹6 ŸÇ’$IR6Y$U¬î¥»FáÂ5÷þõðy,I’$e˜ERÅj/ÿ|ôù \çôŸÇ’$IR6Y$U¬æÎo‰>¿„ëßxBø<–$I’² Ì"©jMÍKEþHô TÑ|,eSóãg²$I’´`²²Hª`ý[N>ÄkîñkáóX’$IÊ&,‹¤ ÖY±(úü®sê×Âç±$I’”MXI¬uÈ'¢Ïoáz×>%I’¤l²Hª`ù²-R*Šè3@¨"Ôs’$I’¤ãÍ"©¢ ýQô \s÷·‡ÏcI’$)› ,’*ZïšÃ¢Ïoá:§üïðy,I’$e”ERE>d`Òõ®[>%I’¤l‚²HªhÍ}þkôù \‘=œ²©yá3Y’$IÊ&$‹¤ª¶hÓ”zíè3@¸ænî_’$IR6¦,’*ÜàÞË¢Ïoá:'ÿ]ø<–$I’² É"©Âu/Ý5úü®wíQáóX’$IÊ&$‹¤ ×^þùèó@¸bÍž“$I’$-OI®¹ó‰>¿”Bs×·†ÏdI’$Õ¯|˧ÖJ3¾9ýÁ½ìþ3eÁY$U¹©y©È‰>¿„kŸô7ñ3Y’$IÕnáFÓ_äÒ>ö‹©{é.©×E)õ;Ïø½³ÛÙñ?ç‚Ø,’*^ÿ–Ó‚ŽmåÑûáwÂç±$I’ªU¾ÝÏ¥Öaÿ=uV,š^¥n¾Îß;‡Ë¥èŸ; Î"©â _ð“®xâÇáóX’$Iå-_ú²ÔÚï©s濤þM'§"{hV¿wî¿"üÏ’g‘TñZ‡|bŽcÕÔüÖ/†ÏdI’$• -_ôäÒè´¯§ÞÕ‡¤ÁC×§Tsò;çðÿVøŸoAlI/_¶Åœ]UÖ>ñ+á3Y’$Iå{®Ñ\*VÞÿg^›ER <ú£‘]$UÑ»æððy,I’¤1?ר“õwNT°HªE½kë…PFÅê{Ãç±$I’Ê÷\£9ý³¹2üï% Î"©uNùjôµP Íß>“%I’4‹m’š{½w$Ï5šS½VüßÕ‚Ø,’jPsï߈¾”J¡}ü_†ÏdI’$Íâ¹F½vª„¢HÙÔ¼ø¿ÃÀ,’êТM«sÑŒÐð_¯Âg²$I’žÿ¹Fè5W¦*Ëoþw™ERMÜ{Yôµ®XuOø<–$Išäò­^úäs†Q»ny*Ö<˜ê&_öŠð¿çÈ,’jR÷Ò]£¯%€RÈwzSøL–$Iš˜ç ?¢vâ_—û¹Fslø«,úï>0‹¤šÔ^þùèk  ÚÇ})|&K’$Õ®*?×hŽå;½9þ¿G`I5iøME¤Ô»ê ð™,I’Tõêö\£¹4\¨e%øo•ER]šš—Šü‘èë \ñøñ3Y’$©B ŸùÓ:øc©s΂'—Fkˆþ•®Ôš{½'ü¿YdI5ªËiÑ×@)ä;¾1|&K’$Uç¹Fƒè_ß*¥¹÷¯Çÿw Ì"©F ßr@Jícÿ,|&K’$…75ÿÉ¥Ñq_JÝïï•÷_‘R¿ý«Zå5÷}_üÛÀ,’jTëOD_O¥Ð»êàð™,I’ÿ\£Ç¢-«¥æ~ïÿo™ERÊ—m1_µ°.Å÷‡ÏdI’¤Q–oõ’ÔÚï©sÚ×§?¢V¬¼#úW°‰ÑÚÿƒáÿý#³HªYƒG}M”Bs×_ ŸÉ’$IsÒŸüˆÚ±_L½Ë÷õ\£`­oÿNük"0‹¤šÕ»æ°èk  †ÿ:=“%I’fûµöQŸIÝKwIý».J©×ŠþÕŠŸÐ:ð#ᯑÈ,’jV甯F_S¥0|.@ôL–$IšñsòG£bZ<üu™ERÍjîýÑ×@)í'¦¿Þ6z.K’$=ßs¦?¢Få´ýdøk)2‹¤ºµhSo{xÊðµð¹,I’&3Ï5ª­Öáÿú Ì"©† îù^ôuP ÷ˆGÏdI’4¡Ï5ê6£bDZG|*üõ™ER ë^ºkôuP Ã_â¢g²$Iš„ç=ýkcÔ>òÓá¯ÁÈ,’jX{ù磯+€rôR¾ÕKÃç²$Iªnù–/ö\#ž¡}ÔŸ†¿.#³HªaÍß}]”Ƥ†]’$Íî¹Fè î¿Âsx–öòÏÅ¿V³HªcSó¼µà)Ã_Ãç²$I*õGÔºnë¹F¬·ö1_íFf‘TÓú·œ}m”Âà¡Âg²$IŠ/ßö5ÓïTîž·UêßzF*š+£M¡¢ÚÇþYøë92‹¤šÖY±0úÚ(|û×…ÏeI’4æçðáÔ9ãÿ¦ÞõǤbÕÝÑ¿ŽP#ícþWøk<2‹¤šÖ:øcÑ×@iLú¿I’4IÏ5šþˆZ¿ýë5Ö>ú³ñ¯ûÀ,’jZ¾ôe ð”ÞÕ‡†ÏeI’4ªçåÑ¿j0aÚG}&ü:ˆÌ"©Æ Ÿ @JÅš¦¿ˆ z.K’¤™ÿy렦ΊE©ÓɩȎþµRû;~mDf‘TãzW}}”Fs··…ÏeI’´–¶|Qjí÷Ô9íë©wõ!iðÐõ)Eô¯ð,­#>½f‘TãÚ'üUôõPÓÿ!|.K’¤§Z¸Ñs<רý묗á·ÿeÑ×P`I5®¹ûÛ£¯/€Òèß|jø\–$iÒŸk4ýµÛÎö\#*­uØ ¿¦"³HªsSóSÑZ}”C'KÙ¢Mãg³$I“ð\£áGÔÎü—§žkôPôo0§Z‡|"ü:‹Ì"©æMoû˜ÖÚÿƒásY’¤Zµh“ÔÜ뽞kÄDiôûñ×^`I5¯{Þ–Ñ×@itÏ]>—%IªlžkÓZ~$þz Ì"©æµýdô5Pý»/ ŸË’$Uò¹Fèµ¾•C)´¾ý;á×gdI5/_¶…·–ü‡Aoú¹ ѳY’¤²•oõÒg>×h̓Ñwm(­I\BÇ"©þ ¹%ú:(Ö>—%I Ís`ƒ —®Yôu˜EÒ4¼9ð¤îe»‡ÏeI’Æú\£Ýß‘ÚÇÿeêý`Ÿ4øñUÓïÐf¯¹ïûâ¯íÀ,’& ÎÉ}”Æàá›Âç²$Ic{®Qseô­j§¹ç»Ã¯õÈ,’& æžïоÎJ%ßá á³Y’¤¹xjëà§Î9Sžkc4üö¬3 *‹¤IháF©è¬‰¾ÖJ£}—ãg³$I3}®Ñn¿šÚ'þõO<×h}K…‰”ïô¦ø™˜EÒ„Ô¿ã¼èk  4z×>—%IZ[ùNoNíc¿˜º—î’úw]”R¯}ûž’oûšð™EÒ„Ô½`›èk  4Šöêéٞ͒$=÷s‹¾Uk‘/}yøÜˆÌ"iB~Ý5ÿ©µÿÃg³$iòÊ·zÉôW‡wNûúôGÔŠÇ%3”-Þ<|–Df‘4!åÛ¼:úZ(•î[‡ÏfIÒ„<×èØ/¦Þåûz®ÔAQ¤lj^ü| Ì"i‚*VÞ}É”ÆàÇW‡ÏeIRÝŸkÔŠ¾Ýs­Û Ÿ5YpITï‡GD_råQ)ßîµá³Y’T“çåFßÙ€1(š+ÃçOœEÒÕ9õkÑ×@©´ûRøl–$Uð¹F+…AŠ'îŸIYpITsï߈¾æJ¥wÝÑá³Y’T²nì¹FÀó>2&|N-ˆÍ"i’Z´Éôç9ø‰·&/Ü8~>K’B?¢Ö>ê3ÿù\#¿/k1xè†ð¹•g‘4aõï¾8úº(•æ~ïŸÍ’¤ñä¹FÀ†ÜEø,Ë‚³Hš°ºí}Ý”J÷¼­Âg³$iîË·|ñ3žk4ý5€ 4|sFô|Ë‚³Hš°ÚG~:úº(ÿª$I5hÑ&©¹÷¯§ÎÉŸzW<ýÑÏ5F¡ÛÙñ3oAlIV¾íÏF_wåR)ßîµáóY’4ó¨u/ÜÖs€±ê]lø Ì‚³HšÀ†O™à?µOørøl–$=wù¶¯ù©ç=}Û&XïÊÃçbœEÒÖ»úÐèk Tú7ž>›%Ižk”_÷’o…ÏÊ,8‹¤ ¬}ÒßD_{åÒÉR¶xóðù,IÕÂSs·_Míc¿˜º—î2ý̺4èGßÖª{î’øù¹ 6‹¤ ¬¹ûÛ£¯=€Òiò‰ðù,IuÎs€:è|÷ŸÂçiœEÒ$65/ÍÇ¢¯?€Ré^¶{ü|–¤š”/}yjôÑÿ|®Qöpô˜˜í¿>c³à,’&´þ-§G_¥R<~gøl–¤Ê·ä©xü®è‘02í£ÿ¿øY» 6‹¤ ­s΂èë t†ýžÏ’Tåòí_=ÊFÊãI“ZëÛ¿}ý”Nç¬ ŸÏ’Tåš{¼3z”ŒTs¿÷‡ÏÚ,8‹¤ImÉ Sêw£¯A€R>ü5|>KR…kø{Ñ£`¤¼ƒÝ"i¢Üwyô5P.ƒ~Ê·~Uø|–¤ªÖ>òFOr€‘ÊwxCø¬Í‚³Hšàº—î} ”Nû˜/„ÏgIªjí“þ&zŒŒT¾ôeá³6 Î"i‚kõ™èk tz×>Ÿ%©ª Ÿ5P[E‘²©ùá³6‹žõI“[¾ýë¢/C€Ò)Ú«S¶x³ð-IU¬{ÑÑc`dŠöás6+AI^ñøÑ×"@éøZWIš]½«Šá#S¬¼=|Îf%È"iÂë]sxôµP:½ì>Ÿ%©Šõo:)z„ŒÌàÞï‡ÏÙ¬Y$Mx“ÿ>úZ(b̓>ÿ.I³¨÷ÅÑ#`dú·œ>g³d‘4á5÷xgôµPJÍ}~3|FKRÕ<|Sôø™ÞU‡ÏÙ¬Y$MzSóSÑZ}=”N÷‚­ãg´$U¬"{(z|ŒL÷âÃçlV‚,’”ú·ž}=”ÎàáÃç³$Uª©y)õ»Ñã`d:gý[ü¬]ŸE’RgÅÂèë ”š»ürøŒ–¤ª”/Û"zlŒTûį„ÏÚ¬Y$)µüHôõPJ3ÿ9|FKRUjîþŽè± 0R­#>>k³d‘¤”mù¢”½èk túw_?£%©"µùDôØ©Öþ¿>k³d‘¤é÷_}M”O1Hù¶¯ ŸÑ’T…ÚÇÿeôԩ殿>k³d‘¤éºßÛ-úš(¥öI>£%© yî&PwùÖ¯ ŸµY ²HÒtí£?}M”Rÿ¶³Ãg´$U¡Þö‰Ù£3è§láFá³6+AIš.ßá Ñ—%@9 zþõI’Ö£þM'GOl€‘)òGÂçlV’,’ôtÅãwE_›¥Ô>áËá3Z’ÊÞàk¢Ç5ÀÈ ¾)|Îf%É"IO×»úÐèk ”ú·œ>£%©ì­UÑã`dú·Ÿ>g³’d‘¤§kŸðWÑ×&@9õ»)_¶Eøœ–¤²6œ‘u6|ãEô¬ÍJ’E’ž®ù­_Œ¾6J«}쟅ÏiI*kͽÞ=¦Fª{Á6á³6+IIzFÅ÷G_Ÿ¥Ô¿é¤ð-Ie­}ä§£Ç4ÀHuNýZø¬ÍJ’E’žQïÚ£¢¯O€rêµS¾ÕKÃç´$•±ÎߌžÒ#5\˜GÏÚ¬$Y$éuNþ»èë ´ÚË?>§%©Œu/Û#zDŒTs¿÷‡ÏÚ¬$Y$é5w{[ôõ PZ½Ž ŸÓ’TÆú·ž=¢F*ßñá³6+IIzfSóR‘=}”S¯•ò¥/‹ŸÕ’T²ŠUwGOh€Ñ)Š”-Ú4|Öf%É"IϪÃñÑ—)@iµýbøœ–¤Rµä…)ƒèñ 02Ã7[„ÏÚåÉ"IϪsú?D_§¥Õ¿ùÔð9-Ieª¹ç»¢G3ÀH ~|Uø¬ÍJ”E’žUsÏwG_§åÕï¦|ëW†ÏjI*Kí£?=™FÊ?$6ž‘E’žÝÔüT´¾VJ«}âWâgµ$•¤ÎŠEÑc`¤z—ï>k³e‘¤ç¬ó)Ñ×*@iõo?'|NKRYê]{dôX©î¹‹ÃgmV¢,’ôœuÎø¿Ñ×*@y ú)ßö5á³Z’ÊÐà¡ë£§2ÀHy7zãY$é9kîó›Ñ×*@©uNýZø¬–¤ðo–Ò =’FªuÐGãçí‚òd‘¤çnáÆ©h?}½”Vÿî‹ãgµ$×Üë=Ñã`äš;ÿ—ðy›•(‹$=oý[ÏŒ¾^Ê«(R¾ãÃgµ$EÖ>îÏ£§1Àhƒ”-Ú4|Þf%Ê"IÏ[çœÑ—,@©uÎú×ðY-I‘u/Ù9zŒT±êžðY›•,‹$=o­ý?}Í”ÚàáÃgµ$EÖ¿}Eô(©þ]†ÏÚ¬dY$iíOìµ¢¯[€RkîõÞøy-IMÍKEþhô©ÞÕ‡ÄÏÛåÊ"Ik­çùÑ×-@©u/ùVø¬–¤ˆ†Ÿ¨»î¹‹ÃçmV²,’´Öºç.‰¾nJ­Èšþ¦Ëèy-I㮽üóÑ#`äÚÇ})|Þf%Ë"Ik­uàG¢¯[€ÒkòáóZ’ÆÝð™u×:àÃáó6+YIZ{K^˜R¿}í”Zï‡ß‰Ÿ×’4æúw_=~F.ßñáó6+YIZgƒ{.¾vÊ­ÛLùÒ—…ÏkI[‹6™ž}µ6èy„Á‚gg‘¤uÖ½`›èË ôÚÇÿEø¼–¤qÕÜóÝÑc`䊕w„ÏÛ¬„Y$iµùDôõ Pzý;Î Ÿ×’4®:§|5zìŒ\ÿöáó6+aIZ¿ç$õÚÑ×0@¹ÅôWa‡ÏlIC½ë–GO]€‘ë]¾oø¼ÍJ˜E’Ö«þD_Ã¥×=o«ðy-Iã¨xâÇÑ#`ä:ßý?áó6+aIZ¯:+F_Ã¥W¬¾/e 7 ŸÙ’4Êš»ürô¸‹Ö¡Ÿ Ÿ¹Y ³HÒzÕÚïÑ×0@%´ùƒð™-I£¬}âW¢G-ÀX4w~KøÌÍJ˜E’Ö¯…§¢½:ú:(½ÞõÇÄÏlIa½«µ£×ïLŸƒ£gnVÂ,’´Þõo>%úR(¿~'åÛüLøÌ–¤QU<~Wô¤¹ÁC7„ÏÛ¬¤Y$i½ëœþÑ×2@%tNÿ‡ð™-I£¨¹ë[£G,ÀXôn8.|æf%Í"Ië]s÷wD_Ë•0xðºð™-I£h¸(˜Ý ¶Ÿ¹YI³HÒú75/kŒ¾ž*¡¹ïoÅÏmIšãú·œ=^Æ¢}Ü—ÂgnVÒ,’4£z?üNôõ P ½«ŸÙ’4§-Þ<¥n=^Æ¢¹ïûâçî‚rf‘¤Õ>áËÑ×3@5t›)ßú•ás[’æªÖÁ‹ž¬c“/Û"|îf%Í"I3*ßá磯g€Êè|÷ÿ„ÏmIš«ºï=VÆ¢È Ÿ¹Y‰³HÒŒs³g‘¤×ûÁ>Ñ×5@e´úhøÜ–¤ ­¹ÛÛ¢Ç)ÀØô.ß/|îf%Î"I3®}Ôg¢¯k€Êè]løÜ–¤ ­s΂èq 06S¾>w³g‘¤7|xl*Ñ×6@5 z)ßþuá³[’6¤ÁýWFOS€±ið¡ð¹›•8‹$Í*¿L¬¿ÎŠEás[’6èËVŠ"z”Œolk¬5‹$ͪîEÛG_ÛÕúæÅ›‡ÏnIšMÓ¾=FƦX}oøÜÍJžE’fUëàG_ß•Ò>ö‹á³[’fSÿÎ ¢G(ÀØôo9=|îf%Ï"I³kÉ Sêµ£¯q€Ê~$8|vKÒ¬>ÖæÙ˜Àäè^°MøìÍJžE’f]ÿÎó£¯q€JiíÿÛá³[’fRç¬cÕ^þùðÙ›•<‹$ͺÎ9SÑ×8@¥ô®?&|vKÒLÃ%é?êß~NôXÑ:ð÷ÂgpV‘,’4'uÎþ÷èë ’úwœ>Ã%iXs_K©(¢Ç"ÀøEÊ—¾<|gÉ"IsRs¯÷F_ú•Õ:àÃás\’z×=B ¹%|gÊ"IsÓÔüTdE_ÿ•Ô¿}Eü—4ÑåÛ¿.¥~'z„èýðˆð9œU(‹$ÍYþ `öZ|(|ŽKšÜºí=ÂtNÿÇð9œU(‹$ÍYícþWôõPYýÛΟã’&³|«—¤¢µ*z „iíÿÁðYœU(‹$ÍYù6?“R1ˆž•ÕÚÿ·Ãg¹¤É«sÖ¿E?€8ƒ~Ê·|qø,Î*”E’æ´Á}—G€ÊêßuQø—4Y OEöpôø3xðºðYœU,‹$ÍiÝ󶌞•Ö:ô“á³\ÒäÔ9ûߣÇ@¨ÞU…Ïâ¬bY$iNkîû¾è9Piƒ¯þ&Ìèy.©þå[½4ÍÇ¢Ç@¨ö _ŸÇYŲHÒÜ65?kŒž•Ö^þùøy.©öuΙŠwáš»¾5|gË"Is^廙£g@¥ »-e‹6 Ÿç’ê[¾ôe©h®Œw¡ŠüÑ”MÍ ŸÉYŲHÒœ×>êO£ç@åuNþûðy.©¾u/Ø&zÌ„ëßtrø<Î*˜E’FòyûÔïFÏ€J~‹R¾ôåá3]RýÊwü…”z­è1®sæ?‡Ï䬂Y$i$õï8/z&T^÷¢Â繤úÕ»ö¨èñP ­ý>>“³ f‘¤‘Ô9ã›Ñ3 úúÔÜå—Âgº¤š}ÃnQDO7€x½vÊo>—³ f‘¤‘4|ò=®ã á3]RMšš—úw_=ÖJa8Ãçò‚jf‘¤‘5üÖ!6\ëÛ¿>Ó%U¿öòÏE3€Òè^´}ø\Î*šE’FV÷Ò]£g@- øaÊn>×%U·|éËRñÄýÑã  4ZGüqølÎ*šE’FVëàEÏ€Úèœþás]Ruë^¶Gô(¢Hù6?>›³Šf‘¤Ñµx³T´Ÿˆµ0œ§ùö¯Ÿí’*WsïßHiÐc¥1xø¦ðÙœU8‹$´áCb˜½ë Ÿë’*ÖÂÓàÇWG/€Ré]±ü|^PÝ,’4ÒÚÇÿEôŒ¨•Öaÿ-|¶KªN3¾=¶J§}ôgÃçsVá,’4Ò†Ÿ;õVj€¹S¬¼=eK^>ß%•¿|§7§¢³&zl”ïùHÛþløŒÎ*œv IDATE’F^ÿ® £G@­t/Ù9|¶K*ySóSÿÎ ¢Ç@é ¼6~F/¨vIyïþSô¬¨—bZûÿvø|—TÞ:gÿ{ô¤(¥î¥»„Ïè¬âY$iä5w~Kô¬¨Á#7§lÉ Âg¼¤òÕÜóÝ)õ;Ñc  ”Z‡ÿQøœÎ*žE’ÆÒà¡¢ç@ít/Ü.|¾K*Y‹7Oƒ¯‹Oå4è§|éËãgõ‚jg‘¤±Ô½`ëè‘P?ƒ~jîû¾ð/©|ÖK½«ŠA¥×¿ã¼ðyÕ$‹$¯Å›¥¢³&z~ÔVÿî‹S¶h“øy/ilµOüJô訄Î9 ÂgvV“,’4Öz×=?j­{ñŽá³^Òxjîû[)õZÑc š{ÿFøÜÎj’E’ÆZ{ùç¢ç@½Ejùéðy/i´å;½)kŒž8•Pd§lj~øìÎj’E’ÆZ¾å‹ýËÀˆí'Rs—_Ÿù’FS¾ÕKÓàÁë¢G @eô®>$|vg5Ê"Ic¯ÓÉÑs öüpzy=ó%Íq‹6Mý;Î1•âÛmsšE’Æ^û¸?ž#¡ã ÞÆ-Õ¬Þö‰-Õ2è§|ëW†Ïï¬FY$iìåË^‘R¿=N&B÷Ü%ás_ÒÜÔY±(z¤TNÿîKÂçwV³,’RÿGßž'“óðmoç–*_çÔ¯EO€Jêœýïá3<«YI ©}Â_EÏ€ÉÑm¦æ~ïŸý’fWû¸/M/…˜¹æ^ï ŸãYͲHRHùÖ¯JiЋž)£ÈIÍ]~)|þKšYí#?=ý|f®Xó@ʦæ…Ïò¬fY$)¬þí+¢ç ÀD)VÞžòm^>ÿ%­_­ÃÿÈs%6@ïÊÃgyVÃ,’Vç俞+gpÏ÷R¶ä…á÷Ik¯uè'Sêµ£G@¥µúÓðyžÕ0‹$…•oûoÕпíì”-Þ,ü> é¹kñÇ–HjÐOù²-ÂgzVÃ,’Zÿ®‹¢Ç ÀDêßxBÊn~ôÌÚÇ|Ás$æ@ÿŽsÃgzVÓ,’Zç´oDÏ€‰Õ»ê` ”JTç´¯ûv6€92œ©Ñs=«iI -ßþu)ƒè0±z—©ùá÷iÒ뜳 zÔGQ¤|‡ŸŸíYM³HRxý;Ï3­wÕA)[¸Qøý@šÈn”º—î=jepßåñó}A}³HRx“ÿ.zÎL¼ÞµGyf’4æò-_œú7}ùÔNç¬ ŸñY³HRxùÖ¯òPI€è]LÊm~_&¡|»×¦ÁýWD_öµÔÜõ­ás>«qI*Eý[ψž5 ¿áäæSS¶xóðû‚Tçš{¼3«î‰¾ÜjiðÈ-ás>«yI*Eíãÿ"zÞðË$itµ¾ó?RêdÑ—9@mu/Ø&|Ög5Ï"I¥(_úò”zíè™ÀSú·5ýü–èûƒT›n<}¸~“£ÓÜç¿ÆÏüõÎ"I¥ÉÃ&Êeðàµ)ßþuá÷©êåÛüLêßvvô% P{ÅêûR65/|îg5Ï"I¥©½üóÑs€ŸR<~§VJP뀥â‰G_Ê¡û½ÝÂç~6Y$©ýMAÄ(VÝ“²©ùá÷ƒlB²HRéjðáè9Àz(VÝš{ÿzø}CŠ*_¶Eê]ùíèK`âu/Þ1üžMPI*_SóR±òŽèYÀúèµSû„¿Š¿wHãlj^jûÅ黯¹×{âï &'‹$•²îùË¢g3ÐûÁÞ)[´iøýCuÍ=~-õïº(ú’à)ƒG~oÈ&,‹$•²æ®¿=˜¡Áƒ×¥æžï ¿‡H#iÉ SgÅ¢”úèK €ŸÐ=wIü=bÁde‘¤Ò6¸ïòè™ÀLõZ©óÝòÀKÕ§©ù©}Ì5z6°†ò|§7…ßS¤u•ïøÆÔ»æ°”ŠAôeÀº…ß/Äd‘¤R×>ú³Ñã €¹Ðm¦Î9S)[¼Yø½Eúéò!u¿¿WJ½vô•Àzêßuaøý#›Ð,’TîožŠÖªèÀD»(¢_ýl€ÞU‡ßS² Î"I•hððMѳ €)š+SgÅ"ÿ²¨Ñ´x³Ô>ê3ipÏ÷¢_ê̑֎¿¿,˜Ü,’T©*õUd?ù5¾‹7¿ï¨úåÛ½vzAYäD¿´˜CÅãw¦lj^ø}&›à,’T™_Ó =³Ó/ˆíãþý|áÒ"›š~›ä†_ÙÜ>ñ¯Sïºå>²Àzk÷¥ð{˜þ3‹$U²ÞÕ‡DÏ2*¨XuOê^¶Gjñ©”/{Eøý¬Ö-ÜxúcÓ¾ñäâè‰û£ÿóPAEseÊ–¼ þ¾¦ôY$©’5÷{ô< êŠÁôGàz—ï›ÚG}&åK_~«t[¾hú]_3ÿ%õo:9­Ç£ÿ PÃoî¿Ç)ýdIªlƒ®‰žiÔÉ —÷\šºlZGüqÊwxCø½®¬ ßÍÕúöï¤Îi_O½+Hƒ_•Ò ý_€º)ŠÔÜõ­á÷=5ž‘E’*[çä¿‹kÔÜð]5ý».š~ÆRûØ/>ùðî©ùá÷Àq–o÷s©uØŸ~xùð#jÃwqy06ãп}Eø}Pge‘¤Ê–oõ’T´ŸˆžmLâréÎó§ß‰Ó9ëߦ?×Üë=Ó_}oœU‹7KÍ]~9µùƒÔ9ùïS÷¢Rï†ãž|—‘/· Ðð~ŸTúé,’Téz?Ø;z¶ÀÓŠìáéÇõ®9,uÏÛ2uNýZj/ÿ\jø‘ÔÜýÓïîÉm2žûä’N<¯¹ç»Sëà§öòÏOÿ<Ýs—¤ÞU§þ]¦bõ½Þ]@)Oüx|÷L¥™d‘¤J×Üó]Ñó fõ 4ƒGnNý»/IýÛÎNý[ÏœþØØtW0ýð¦î…Û¦îù˦ŸÛ4ýÿ¾xÇéÿ¿é®9üéÿéÿ·=ý.¢á7Óy'U7ü™èó¦Ï™E’*ßàžïEÏ8æÊ Ÿòß~ÖTã9³HRåk÷¥è1Àé]lø9SçÍ"IÕoÉ RÑ|,zÖ0Zû} þœ©ô|Y$©u/Ù9zÖ°÷]~¾Tc­Y$© ¿¶Ø·ÎT[ûèφŸ/ÕXkIªMýÛWDÏ<f©X}oÊm~¶Tc­Y$©6µŽøTôÜ`–:gþsø¹Ruf‘¤ú45?+ož}ÌT7OùÖ¯Œ?W*­+‹$ÕªÎwÿ)zü0CÝËv?Oª±~çn‹$Õ©|éËSÑY=X_E1ýJÑçI5Ö+‹$Õ®î÷÷Œƒ¬§þM'…Ÿ#ÕXï,’T»š»üRJÅ z°Zßþðs¤ëE’jYÿÖ3¢g!ë0¸ÿŠðó£3Ê"Iµ¬uè'£ç!ëÐ>òÓáçG5f”E’êÙÔ¼4xäæè™Àó<|SʦæÇŸ•f’E’j[çÔ¯EÏEžGû¸??7ª1ó³¶E’êZ¾ÕKRÑZ=ø)Ū{R¶hÓðs£3Î"Iµ®{é.Ñó€ŸÒ9å«áçE5f•E’j]¾ã/¤4èEÏHžRd¥lÉ ÂÏ‹jÌ*‹$Õ¾Þ¿='xJç¬ ?'ª1ë,’Tûš{¼3¥¢ˆž•¯h¯NùÒ—‡ŸÕ˜uIšˆú·=/&^÷ü¥áçC56(‹$MD­ƒ?=/&[7Où6¯?ª±AY$i2šš—\=6&V÷’ãφJšE’&¦ö1_ˆž›“©“¥|ÛŸ ?ª±ÁY$irZ¸q*¿+z|Lœî…ÛÆŸ •æ"‹$MTÓÿ1z~L”¢³&åÛüLøyP¹9W[$i¢ÚòE©Èž££{Þ–ñgA¥¹Ê"IW÷üeÑs`"­U)_öŠðs s–E’&®|ÛפÔkEÏS€Úëœ3~TcN³HÒDÖýþžÑó Ö†É·ziøùO9Í"IY¾ÃRêw¢ç*@muÎüçð³ŸsžE’&¶ÞûGÏU€Z*òGR¾å‹ÃÏ}jÌyIšØòޜҠ=_j§sú?†ŸùÔIIšèzW=_j¥X}oÊ–¼ ü¼§ÆH²HÒD×üÖ/¦4èGÏY€Úhó…ð³ž#Ë"I_ïÚ£¢ç,@- ¸&eSóÃÏyjŒ,‹$M|ÍÝ~5¥b=o*¯uÐñÔiIÒ‚Fêßp|ô¼¨´þ­g„ŸíÔyIÒð]I{¾+¥¢ˆž»ÕT Rs¯÷„ŸíÔyIÒSõo>5zôTR廙ÃÏtjŒ%‹$驚ûüfô쨞^+å;ü|ø™N±d‘$ýDý›NŽÁ•Ò½p»ð³œcË"Iú‰š»¿Ã7¸¬§¢¹2å˶?Ë©1¶,’¤Ÿªwí‘ѳ :§ÿcøN±f‘$ýTÍoýbJƒ^ô<(µÁÃ7¦lÑ&ág85ÆšE’ôõ®<0z&”ZëO„ŸÝÔ{IÒs”ïøÆ”zíè¹ PJýO ?·©’E’ôzF”F±ú¾”oùâð³šaY$Ik)ßú•©h¯ŽžÕ¥Ð^þùðsš¡Y$I먳bQô¬׿û’”MÍ ?£©{F¶H’Ö^¾ÕKR‘==³âƒÔÜóÝáç35³H’Ö£ÎÉ=¶Âô.ß7ü\¦F)²H’Ö§…¥ÁC×GÏn€±+òGS¾õ«âÏeJeÈ"IZÏZ‡ÿQôü»ö±_ ?©Qš,’¤Ô¿ýœè06ý;Ï÷€m¥ŸÌ"IšAÃ‡Ë 2P{½vjîúÖðs˜¥Ê"Iša½=ÎF®³bQøùKÒe‘$Ͱ|Ç_H©×Šžé#3xä–”-Þ,üü¥Fé²H’fQ÷¢í£ç:ÀÈ´üHø¹KR6|§ÚP#ßííá?ŒT•ò¥/OEþHôl˜s½« ?s©QÚºl=ý:iä{½7ü‡‘ªTç´oDÏw€9U4Kù6¯?o©QÚºï4ýZiäûþVø#UªE›¦Á£?Šžós¦}—ãÏZJe®{ÙÓ¯•Fó€‡ÿ0RÕjü±è90'ú·¯HÙÔ¼ðs–•ø&óFó°? ÿa¤*Ö¿ùÔèy°a:YÊwzsøùJÒ׿õÌé—L£uܗ©Š5w~KJ½VôؘµöI~¶R£ î¿bú5Óh÷ŸÂ©ªuÏ_=÷f¥ǹ>Ò¦´¾ß9ýºit.Ø&ü‡‘*Û–/JÅê{£ç?ÀŒ5)ßéMñg*¥J´pã”úÝé×N£{Õ!ñ?TáÚG6ú0#SþwøYJÊ”ïø O¿v½;/ ÿ¤ª×¿ã¼Ð›Àúž_|¤MÙ j}ûwŸ~ý4«î ÿ¤ª×Üý) z¡7€uêdÓ_}†R£RµOø«§_B4¤5‹6 ÿ¡¤ª×½l÷ÐûÀºtNûzøÙIÊÕ½t—§_CáÿÈ÷xgø%U½|Ù+R‘=yOx^ý;/HÙÔü𳓕kø ÏX$µŽùbø%Õíí~eQ´VM?09ṳ́F%+òGž¹Hê\´Cø%Õ¢©ù©÷Å‘÷€gië $j̪|‡ŸÆkiz‘Ô»íìðLªKÍÝÞ–R¿ux†ÞµG…Ÿ“Ô¨líåŸö"iÐ^“ÖLmþÃIu©{þÒ¨{ÀÓŠÕ÷¥|Ùág$5*[÷û{={‘4”ïñ®ðNªM‹7OƒGqŸxR1H­/þ|¤Tå\óÜ‹¤öÉÿ;ü‡“êT뀧T· €Ô½hûðs‘•.ßæg¦’ϹHê^·<ü”êVïêC"îÀ„¾‹$[¼Yø™HJ7|HûOküäW®Y¸qø)Õ©|ëW¦"{xÜ÷ `’õÚ©¹û;ÂÏCjT¾ÞµG>ÿ"i¨¹ÿÃH©nµûóqÞ2€ ×9íëáç 5ªßÂS‘?ú¬××3Ió·ŽÿA¥º55/õo_1Îû0¡ú·œ6} ?)U½ÖÁ{Îר3Iý‡o ÿA¥:ÖüÖ/¦ÔkëÞL bõ½)ßúUáç5jQïÊ×½HÊ÷xWø+Õ±Î9 Æqï&Ñ —Zûÿvø¹Gz´x³T´_¿ERç‚mâ`©Ž-Ú$ î¿r·`ÂtÎú×ø3R]jçOž÷µö¬EÒ`åiÍŸ§”FÑð›R¿3ê{0Aú?únʦ懟wÔ¨MÃ×Ôz/’†šý~ø-ÕµÎÙÿ>Ê{0AŠ5¤|ÛׄŸsÔ¨Mù?ŸÒ ?³ERïºåá?¸TÛnœ÷]>Ê{ 0)ÏE:àCñg¥:Õ=o«µ¾ìžs‘”úÝ”móêð^ªkÍÝÞ–R¯=¢» 0 †Ÿvˆ>Û¨Q¯–¼0ù#³X$¥”Úç,ŒÿH5nø0<€Ùèß¾"e 7 ?רQ«:§|u¯½ç]$ Ö<œÖ,Þ<ü!Õ¶…¥Á½—Íõý¨¹â‰ûSîSDZ0‚3êc·Í~‘4Ô:ñoâÿ Rkîú+)õZsyOê¬ßIÍ}+ü,£Fíjó…õz ®u‘ÔôÖ´fÊ[å¤QÖ9ã›suKj®}Ò߆ŸaÔ¨_‹6Y¯w#­s‘4Ô:þ/ãÿ@R›šŸúw]8÷ ÆzW~Qªcíÿz½_‡ë\$ ¿;­Y´iøJªsÍ]~)¥n¾¡÷ ¦÷ý ežc¬#ú¦¶Õ÷®÷kq‹¤¡ö)_ÿƒI5o&``rÙC)ßá ágÕ³î¹Kfôz\¯ERÑ\™²e[„ÿ᤺׻îèÙÞ[€:ôRëÛ¿~VQ=ËwxÃŒ?³^‹¤¡Î÷v ÿJu/ßú•©X}ßln/@ u¾ûÂÏ)ªo½Ž›ñkr½I©ßKùno ÿCJu¯uàï¥T f|1õÒûáwÂÏ'ªo­#>5«×ecF/â».IkÌ ÿÃJu¯{á¶³º €z<ðÔmù¢ð³‰êY¾ôå©xâþÑ/’†Ú§~-ü,Õ¾E›¤Á}—Ïê¢jðpí!þ\¢ÚÖ»â€Y¿>g¼HJ ¬½&å{¾'þ/Lªyíãÿr./]`Œºï~¦P[´IêßtòÈ^¿sºH4OùïŠÿ‹“j^ïÊçúòF¬wíQ)›š~žPM[¸Qê]{äH_Ãs¾H¬y(å»þJü_ Tçož?¾j—00ý;ÏOÙâÍâϪg‹6M½ë–üu<’EÒÐ`Õ})ßå—ãÿ"¥×üÖ/¦¢µjT—10G^;ýå9ÑgÕ´-_”ú·ž1–×òÈICƒ5û˜›4âÚG~:¥¢å¥ l€bÕ=)ßþõágÕ³|ëW¦þÝíõ<ÒEÒÐðÝÍý>þ+Õ¹áÃú€ò)Z§æno ?3¨¾ŸR<ú£±¾¦G¾HšÖm¥ÖQþ,Õ¶…¥þ­gŽårÖS¯Z|8þ¼ ZÖÚÿƒ©ÈûËz<‹¤¡¢Hí³þ-ü/Zªkù²WŒ} ÞpDؾõ’±¶ï¨é?Øjìä§ŽÍë>>ÆöÁ±h"$íÙÝÛ7_8ÖN?nú f¶"›ù±ûøCSŸnXiÛw]9Öö3ùó¿­Æ^òö…xÒ⇤¿š?þð8xù‰ãÀ\<³UØú…oc{cê£ +içîkö¾=2õs¿-ÿÖÏyÕØùÕ·Æ¢[¸tØö}?³óß0ù…4[…m\uÒÔGVÎÎ}?k§>còç}[îÍÎzñؾé cìle°°!iÏ|>¶n½t¬}楓_X³eßÖõ§N}¢`eÌïÿé˜þìÉŸómy7;ëEcëgç-Ý/H;$¶³µ”fg¿|ò m¶´ÛwÔÞ €ÿÎüÁ[ÆìÏþß–rëç°÷Žè±µ>–Ñr„¤Ã¶7ÿ”>÷šÉ/¼ÙRîä§Œ{¯›ú$ÀµÑ¶IDATÒ:ôÏȳ3ž3ý³½-×NyÚØ¸üıó›ëDz[®ô¶ï¹v¬_ö®q`ßÑÓßfK´ÙÇùï1õ€¥3àfÉÆ²õó_?¶n[—bÿ¿™! €ÿ˜@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$I$B‰@"$IŒâÏ>›¹îªTpˆIEND®B`‚‰PNG  IHDR+ƒ pHYsèèµ{Rk IDATxœìÝw´dgyàëj@ Àd 6ƒ<lcñßqGÀ€{<6p=}:Hêne”3m%+'„2( ,Pʹ[RKêÞ•kïï®SÒ\ Ñáä·êÛϳÖ﯅×::]õÖþÞS»ª‘€ì5¢`þY@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ X@ ä¹èµÓà«RïêCSç›ÿ3µ¾þ‘TìþS©Xºm*7”y­ƒß—ªÖºèG!ÀXÜrªëfÕ§¥Û¦æoM­Ã-u¾ù¥Ô»æ°áYròL™£<Ý"õo=#uÎú§Ô:øý©XöÂø’Bjþ‘Tu7D?"ÆZÿ¦R±d›ðk;)¬e/J­C>:g9õo;3¥n3å`låÓ¦îåû¦Ö¿1üÇ €(¼ö‘O©Ÿç¦`¡õo8:K¶¿Æ“F¢åÛ¥ÖêßžAËõ§q5V €²µ.u¯Ø?µýP*&¶Šhdê÷G) zÑQ€¬ô¯=Âu·´øy-Ù:µû•Ô»ê T¶ŸJãd,ƒû.Mí?Šå/ŽÿÇÖÈÕ9å¯S*ÑS€,õ¯>8‹Â¯ù¤‘l‡—¤öI™÷_žÆÁè.ÊAêßrZjüKñÿ¨Ùº§!¥ªŒ~´d­wù>á×}Ò¨×ÜÿÝ©wÝ7RôÓ¨½À —zß;ü™OíDnÝó'¢­µÑûîîá×Ò8ÔüÚO§ÞuGŽä*GgP–©wÃ1Ã_Vô?˜F¼‰E©wÉ®ÑX€Úé]¸Süµ 4&5÷~gêßtR%#±TDSkb«Ô¿ö‘Yª*u&¯á£¯ ¥qjÉÖ©súSÙ~ºž €Éø+vyCü?„Æ£‰EÃO `”ƒÔ9ö“ñ׈ҸµóëSÿæ“ë³þÕÿØ?ˆÿÅk¼þòÿ½¯/ôC€Íé·Sû°Ç_+JcXûä¿N©³!ï@ÿ® R±ËÃÙ·¿ü²S¦¨ê €É9hóûñ¿XßáÿŠýæûá À¨žº?5w{sü5¤4¦µOø³”ºÍñ^TO?˜šûþlø/Scxø¿|Ÿù|h0ÇÊ57¥æŠWÆ_KJcZó ÿšÊ kÆs0xàªT¬z]ø/QãWï²½æëa À<Ü÷ÝT,{Qøõ¤4®5¿öSùÄãµèßy^*vxIø/OãWïÒ=çã! Àéßxüð[œ¢¯+¥±mÕëÒà‘ïÇ Û7S±|»ø_šÆ®ÞE+çúá@€Þ%»…_[Jã\sÅ+Òàþ+F{пù”á§Fÿ²4~9üä¥{Æï1¥q®¹Ó¥Áƒ×Œæ ÿƒsÜï£Õ=ç+sõ0`T”ƒÔ>úáךÒ8×\ùê4xô¦ÑZôï¾ÐÛþ5£:§üMJU5CFM·H­!üšSëvyC*×Ý3 €Áš›S±ÓÅÿR4vMn„SÙŸ“2£©*Ö¦Öžo ¿ö”ƹæ^ïHek]ì ,Ö¦æÿ!ü—¡ñ«}ø¯¥ÔïÌú Àè+×Þ2üP³èkP©ãZ‡}xÖg¨™/úÔ<è}á¿_­ƒß7|;õ1¸û;>0\Z<»:ßüŸ1 €ö©Ÿ ÿ×øÕÚ÷gRÕzbVZÆSÿºÕá×£R1æõ®]½° €Þ÷ŽÿÖøÕÜã­©ZÿðŒ¬Œ¿îYÿ~]*c\s‡í‡ŸÅ· €Áã?HÅÛ‡ÿGk¼j®zm*»}FR2R•©}äÇïO¥bŒkî÷s3ú<€é-½Ô<ð½áÿ±¯š;½<•_7í'yª:ëSkŸw…_§JÅ×9ç«ó»èœ?þ©1k‡—¤òþ˦ýÀ oåãwøfiñ,Z²uÜwéü,ÜàS;5ýä-§Îäõ€Üy^*–lÝ*iÍ}Þ•R¿;Ç €rà+ÿ4ízWì;‹—ê wÙÞá×­R1Æu/Z5· €îû…ÿGi¼êžýO³y F:§~&üúU*Ƶå/NåSÌÍ l>‘НŠÿÒØÔ9ö†Ÿî S2è¥ö×5ü:V*Æ´ö‰>7 €Î7¿þ£ñ©uÈûSê·çâe€©Š5©¹ë›Â¯g¥b›Ø* ºvv €rÝ=>øOS®¹Ç[‡ƒf¢|àÊT,{aøu­TŒa­ýíÙ-Ú'ýEø„Æ£æÊW¥ò±ÛçrþPC½+÷¿¶•Š1mðÀ•3[ ÖÞæ+94µ–½hÚß? ›Ò9ñÓñ׸Òâñ«uÔŸÙ }ò_…ÿðƒ&¥þ GÏÇÜ ®úíÔ:àÝñ׺Ҹ5±( ÖÜ<½@¹áÑá_uÃx|½Kv›ÏÑ@MUOÞ;¼Í4úzW*ƬÎiŸŸÞ sþDø­Ñ¯{ú¦X0[ƒÛÎ~ºyôu¯TŒS;¼$•Í'¦¸ôR±óëãhtíC9¥AwÆ>uÖõÇI)M·îûMmлñ„ðV£]s÷ŸLU±v!æ=uW•©½ú·Â¯¥bŒjôÞ©-Z«3ü‡ÕèÖÜaûT>úý…õ0T5OÍÝ~"üZX*ƨÁ£7n~P®8K¶ÿA5Ÿøãñ 9ë`¨|àŠT,Ý6þšXZ<uÎ[¼ù@÷²½ÃHn½ïì°3~H﯉¥bLjíû3›_´ù@ø©Ñ¬}Ìï¥TU 9ßàG?àˆ_¿6–Æ¥ÁÚ[7¾(7¬ñÚh­ý~6UÝ #~Hµá‘ÔÜùuá×ÈR1u¿»çƽkW‡ÿp½š+_•Ê'í°Qƒ»¿í³Ë¤Å[®}äÇ7¾h÷Gá?œF¬¥Û‡+Œšî¹_¿^–vÍ_šR¿û¼@Y¦bå«Ã8V½+÷é°e?µyø5³TŒxƒû¯øáÀäDÿP­:§~6rœÀUOÞ›š+^~í,#\ïŠ}xлúÐðJ£SëÀ_L©ß‰œå0%ƒÛÎHÅÄ¢ðkh©Ñ:'~ú‡í“ÿ:ü‡Òh4¹A­ÖÝ9Ã`Z:§}.ü:Z*F´Ö>ïúá@sÿw‡ÿP&¥Á-§DÎn˜¾^3µöz{üõ´4Š-}AJƒÞð©Ò˜üðŒbùvñ?”Âëžó•èÑ 3R>tÍð[¬¢¯©¥b<~ÇðyÒ¬¹%ü‡Q|íÃ>4ü$UWÝ –†_WKÅ6¸í›ÃçH£Ë©á?Œbk®zmªÖ?=¯`ö_ xðû¯¯¥bD¿â½Ñ½t¯ðFMl•wž=ª`N”OÜ™š;¾4þ:[Z<:uÏ_<|~4:gþCø£¸zî=£`Nõ¯:0ü:[*F¨ÎÉ5|n4ÚÇ|2ü‡QLíÕ¿•RUFÏg˜[U•ÚGþvøõ¶TŒH“χIÖ¡ ÿa´ð5wû‰T5‹Í0/ªbmjîüºðën©Ú‡}xø¼h4÷yWø£né¶ipßw£g2Ì«<—Òd­Þ=|N4Š_þÃhaë]²[ô,€Ñ9ñSá×ßR\k¯ÿ8|>4Š_þÃhßúá¾j¢j?™š»¾1ü:\*kíù¶áó¡Q,qø£…©¹â©zêþè jpëéá×âRXëk?=|.4Š%[‡ÿ0Z˜ú7={ Dç¸? ¿—Šð[Fà‡Ñü×9õ³Ñ3b¿`Õk¯˥" €šÝïQu7DÏ\Õ¿ñ¸ðks©È .-Ý6•\=k`$tŽýdü5º´xa³¨I¾òþ[TÇ,j¯ü€Õ¿þ¨ðku©XÀ,jñ•÷EÏVIí£?~Í. ”@æ n>9z¦ÀȪž~05w|Yøu»T,@×9õ3ÑóF^ïò}¯ݥb²È´æîoIUg}ô,€ÑW•©uðû¯á¥bž³È±‰Eiðƒs¢Ç(Œò‘R±d›økyiñüeaÓþ6z~ÀØé~ë¯å¥b³È,oý€™™¼Žnîú¦ðkz©˜§,²{ëÿÙÑsÆÖä·h…_×K‹ç' €Œêœö¹èy c¯}ôï†_ÛKÅO? €1©{Þ¿DÏ: ¥Ô¿áèðóTÌ €1¨¹Û›SêÑs˜TU©uÈûÃÏ R1Í,Æ Á­§E8à9Êû/KÅÄ¢ð³‚TL# €¯½ú·¢g°í£?~^Šid0Ê-ß.UëkÀF”ÝžŠ¥ÛÆŸ¤ÅSË`„ë]¸SôL6£{ÆÃÏ R1Å,F´æoM©ßŽžgÀfTÍÇRs§—‡Ÿ¤b YŒhƒ[NžeÀô.Z~~Š)d0‚µÿµèLU¿=üêîès„Tl! €QkÉ6©|ôûÑ# ˜†þu«ãÏÒâÍg0buÏüRô즫*Së€÷„Ÿ'¤b3YŒPÍ•¯NUk]ôèf`p×ág ©ØL#TïŠý¢g0 í#~=ü\!›È`Djíõö”½èyÌBùàÕ©˜X~¾Šd0" n9%zVs }Ìï…Ÿ/¤b#YŒ@­ƒ)¥ªŠžSÀ(×ܔЉ­ÂÏRñ¼,¢›X”÷]=£€9Ô9áÏâÏÒâÎ ¸Î¿ýèÙ̱êÉ{R±ôáç ©xN‘-}A*ŸøAôlæAç´ÏÅŸ9¤Åÿž@`Ý3¾=“€yR­(Ë_~îŠg³ˆjùv©zúÁè™Ì£îYÿö?“@PÝs¾=‹€yV5KÍ_~þ €˜š;½ñƒè™Œ°ÎqvQªKóTçø?Žž%Àˆ+¹>‹ÂÏ/jÔ" €yª|øºèYŒö ?¿¨Q‹,æ¡ö቞!DtSÕ|,UëîJåCפÁ}—¦ÁçýHýOƒ›O~æÿ¾ç¢áÿ¶\sÓðÿoò;¢«ÎúèÿÀàÎsÃÏ0jÔ" €yhpÛÑ3€9Vmxtø6ÍÁmßLýkK½o/OÓþ6µúÔ:轩µçÛRsÕk‡ß3§¯+Ë^”š»¾)µxwj¯þ­Ô9ñS©{Ö?¦Þww.&¦ª»!ú×À,µöÿùðsŒòÏ`>~¡U=?˜®ª~'óàîo§þÕ§îÙÿœÚG"µöý™¹?ÔÏC“ˇÖÁïKãÿ$õ.Z™·Ÿ™ª§Œþ­0EýŽ -Q#û,æ¸ÞûE϶ j­ô{—~-uNúógþê²|»ð×ù¨¹òÕ©}ø¯¥îYÿ;õo8z¸ä`•ýÔÜã§Â_7ÔÈ: €9¬¹â)u‹èÑÀóÞº?ùVùîù÷ë7w{søëEt“˜?=¼•¡|ì¶è"žÕ»|Ÿð×5²Î`ëžóåè™P{“Úþ÷¾ž:'ýEj}í§Ã_Æ¡æ.oHSþf¸(ñyzÍá;·¢_ÔÈ6 €¹jÉ6©zê¾è‘P/U™Ê¯N½K÷Líc~ï™á‹~=÷–½0µ¿ñÿBUOÞý/ P;Ý –Æ¿(åšÀÕ9æ÷£g@-Lþ…zpëé©sêg‡¹Žžÿ¹×:à=©wÙ^ï%`þUÍÇS±ÃKÂç¿Yf0GM~‡3ócò«î&?Ù¾}èS±dëð™_Ë–l3üÂþuÿê6€yÖ=ýóñs_)Ç,æä—øöá×G0Gª2 î½xxÔÜõMás^?\sÇ—¥î_Låš›¢)Y*×Þ’Š‰Eáó^ùe0õ.Û;zFdaò@9yïcs·†ÏvMýþÕ§ÔkE?|²2ùy,Ñ3^처m;¼$Uí'£çÀØ*×Þ:<ôO¾ …Ït͸æÎ¯K½ W¤ªýTôC ƒÛ¾>ÛÕÈ. €Y6ù!TLÏä=ä“5žüëqô×<ÜpîWSµáÑè‡Àx«J_g«4×Y̲òák£GÀØ(½qxïøä!1z~kž[¾]êžþ_‘ 0 “_É>Ï•rÊ`6¿¼Þ=Fß ›ú7ŸÚG|ÔÕ±¥/¾[Î;¦¯ê¬OÍ^?Ë•rÉ`õ®Ü?z&Œ¬ªX“ºçýKj®zMø¼V|“°½ wJ©[D?4ÆJ÷Ì¿Ÿájd“ÀL[¾ÿ؈êÉ{†o󟜓á³Z#Wsçæ[ª2ú¡ 0Ê'~Љ­Âç·Yd0Ã:'~:zŒÜÊä[½‹¥Û†Ïh~­ý>•÷_ý° í£~'|n«‘E3lpÏ…Ñs`$”÷_žÚGÿ®ûû5ý&¶JS?“ªæãÑc€‘6¸ó¼ø™­”C3ù¥}í§Sªªè9ª\sSjùñð™¬ñ¯¹òU©Í¡^[6¥ªRkŸw…Ïk5Æ> €4ü#€šªž~ uNþ«T,Ù:|+¯ÚGüº¯ Ø„þU…Ïi5Æ> €é6±(UëîŽ~þ,¸ª»!u/XêÃý4¿-qê]¼³ ØÈëpsÇ—ÅÏi¥qÎ`šµ¿þ+ÑÏ}€…5è¦Þw÷¾M;z«>y7Àêžþùðù¬ÆXg0Íúß;<úy°`÷\äžC…5ù—®þ÷ÿ-úi02ÊGnŸÍjŒuÓiùv©j?ý¼˜wUë‰g¾ÒÏ'ûkêœø©”zÍè§ÀHhü¾ð¹¬ÆØf0:ÇÿIôó`~UUê_·:5W¾:|æJÏmò(å£7F?CÂõ¯="|&«1¶YL£Áíߊ~¾Ì›ò‘ëýUA#]s‡íÝÐk¥æŠW„Ïd5Æ2 €)6ù×°4èE?Ýæ^U¦Þe{¥bé Âg­4•ºg~)¥rýÌÓ=óïÃg±c™À›¼ 7Õ“÷¤öa Ÿ±Òtk¯þXªZ뢟B!ʵ·úœ¥™d0Åwý<˜Sýk¾¥:z¾J³¹ˆ)×ÞýTÑ>ìÃásX±Ë` 5W½&¥²ý˜U±6µþDøl•æ¢æŽ/Mƒ;Ί~Z,¸þ Ç„Ï`5Æ. €)Ô=ý ÑÏo€91¸ë‚ÔÜùuásUšÓ–¾ õ¯?*úé°°ÝÔ\õÚø¬4NYL¡Á½G?½f§ªžý ¿mÃgª4/M,JÝ –F?ÓT÷œ/ÇÏ_¥qÊ` 5wyýð²ÆUÕYŸ:Ç~2|žJ Qç´¿õ @Þª2•knNýkðú®4Ý,¶·ÿã¬|ì¶ÔÚç]á³TZÈ:ÿö?|u/jýCipëéÃw9µüxj®xeøœUcl³ØBƒ;Ï~ÎÌHÿ¦†=G¥ˆÚGýNJývôÓ`ZªöSipçy©wáŠÔ>úw‡ïFŽž§jd•Àfjîôcþ‚Œ¥áýþ[…ÏQ)²ö×ex ÀH*û©\sSê_·:uNýljíóN¯ÝJóÀfêœø©è±0=å uOÿ|øü”F¥ö¡LUçéèg&Pw“÷í¯½exØïžñÅÔ:ð‡ß`=#Õ¨]›ip˩ѣ`êzÍáÛž£g§4jµþ%ïbïÛ_ùªðY(›iù‹‡Óã j>žÚ‡| ~vJ#Úäó£ênˆ~ªš\0î½dxûÝä;ˆ‡oå¹'É`µþDô,˜’ò‰;SkÏÿ>7¥Q¯}ÄG}0 0;ƒn*¼*õ®Ø/uNütjíýŸÜ·¯4NYl¢þ5‡E€-*¿#5w}cøÌ”Æ¥ö7~ØÖ[ùû7Ÿºg~é™wÚ-ß.|ŽIÅ,²ØX‹RõôƒÑó`³ÊÇnKÍ]Þ?3¥1«sì ? ๪õ?¬{ÞÿIí#~=5wzyø¼’Š9Î`c¿”Þ=6Ëá_š]Ó>ý4M~&ˆûöUÔ0 €Ô="z&lR¹öV‡iê}gÇè§3°Ê~*×ÜôÌWðù¥Ô:à=îÛWªk©¼ÿòè1°Qåš›SsÕkÃ礔E‹|æ䦪RùØí©ýQÏö~_*–½(~ÞH‹G# €çÕ\õ÷#©zêþÔÜõMásRʪ%Û¤Ámߌ~z3Tmx$ n==uÏ_<üÏæŠWÄÏiñèfð¼:ÇÿqôøUû©ÔÚïgÃg¤”cͶOå#7D?Í-pß¾Ô˜uÏË[‘Ók¥ö¡¿>¥œkîþ–Tmx4úÙlâ¾ýáWð-Ý6|VHŘgð¼ªuwG;€W•©sì'Ãg£T‡ZþBJ½fô³j©ZÿÐ3oå?ç+Ïö—¿8|&HE†Y<§æ?=û~H÷ôχÏF©NuŽû£á‡ˆó§*Ö¤Ámg¤îKR{õÇRsÅ+ßûRQ“,žS甿‰ž‡ÿ¿Þe{‡ÏE©Žõ.Zýô‡|t‹½obQøó\*jšÀsêÿØè 04¸ïÒT,}Aø\”jÙÄVipÇYÑcÆO9ØÈ}û^ˤb„²ø¿M,~@´jýé¹Ëëãç¢Tã&ß’\­»+zÀxÜ·ÁÒÔ>â£îÛ—~ÿ÷±ïŽž¡)õ;©uÐ{Ãg¢¤Fjí÷_|( <çëh‡oå¿xçÔ>ò㩹êµáÏQIigðlÝ3ÿ>z®¤Î)>%ý{“ÿ2z,@Ü}ûßÝ#uŽûÃáeG?%5æ$ €g›|û@¤þµG„ÏBI?ÚäýÌ­²ŸÊGnHýkMS?3|çK±d›ðç¤Æ¼d0Ù’m†okˆR­»;5w|Yü<”ô£íð’T®½%zLÀüÜ·¿ÃKâŸc’ÒBe0ùK8ø}ѳ¨³ªLí5¦ù IDATÃ>> %mºÖ¾?“R¯=-`v÷íïüºðç’¤Fh“÷ÿŸ÷¢ç3Pc½ïì>%m¹Îi=.`Ó½T>tMê]¶Wêœø©ÔÚçÃo¹Š~ÞHjŒT“÷ÿßu~ôÈjjòb­Xºmø”4µú7=6 ¥rÊG¿Ÿú×–:§~6µöÿ9÷íKJSÉ`ÉÖ©ê¬ã@õZ©µ÷;âç ¤)×\ùªá=Ô°ª'ïMýOݳÿ)µûPjî°}øsARc,«ý`ø¿ºç/Ÿ’¦_ûˆ_O©ª¢G™ª:O?sßþä[ùÿíÿqß¾¤4—Õ~Ð9ísÑs¨¡òñ;R±ìEá3PÒÌê]¾Oô!—ûö×Ü”úWì¾}Ii!ªý`ò{·Zûð_ Ÿ’fѲ¥òÑ£G c¦ZwWê_·:uÏüRjòT,{aücYRªSµ_ø^_`¡õo8:|öIš}­!¥²=RQÕS÷§þM'¦î9_Ní¯ÿJjîøÒðǬ$µê¼hîôcÃïßXÈ{;›»¼!|þIš›z­Œ+Œä}û?þØ”¤b#ÕzÐþÆoF¿^5Ó=ëÃgŸ¤9lÙ ½›°núíTÞyê]¶wêœðgËi÷íK*ƤZ/º,~ j¤zúÁT,ß.|öIšÛZý×á÷²S—ûö}€«¤ÆØVëÀàgG¿¦5Ò9ù/Ã瞤ù©wÉnÑ#†9P­( n=}øG¢ö‘Oͯ lIR1‡Õw0±(U­'¢_g€š(×ÞšŠ%[ÇÏ>IóÓòíRùÄÑ£†i¨ÚO¥Áç¥Þ…+Rûèßõù,’Rªí µ÷Š~Ýj¤sÌï‡Ï=Ió›Ïae?•kn¾•¿sêgSkŸw¦bb«ðÇŒ$ \m“þ<ú¥¨‰òÁ«|@”T“&¿ö`U9ü`Æá}ûg|1µzo*–¾ ü±!IÅTÛ@ÿªƒ¢_ž€šhõßÃgž¤…©¹ë›RÕÝ=vj¥Zÿðß·¿òUáI*F´Ú.ʇ®‰~½j |ì6o3•jV÷ìŠ=Ùª:O§Á]¤ÞE+Sû˜ßKÍ]ßþï-IÅUÏÀ’­Sêµ¢_Àèœú™ø™'ia[²M*¹>züŒ?÷íKRšëj¹ð€ÀB¨Š5ÃOžy’¾ö¡L©ª¢ÇÐØ}_ÿÆãS÷Ì/¥ö!0?%iñÜWË@ç¸?Œ~j {þâðy')®þµßˆCctßþ«Ãÿ½$©¨Aµ\ô.Ü)úuÈ]¯é‚Vªy“FW5Ku7ù¡ˆƒ{/I½ËöJ?õÌ[ùGàßG’ŠVËÀàÖÓ¢_ Ìõ.ß'|ÖIНsÚߦºÞ·?ùVþÖïqß¾$-j¹¨ÖÝýò䬪Rkïw„Ï:I#ÐÄV©|𪔥ªJåc·§þõG=sØ?ø—R±ìEñ¿sIRÚTµ[4w|©åæÕàž‹Âg¤Ñiò`œÃµGÕ~2 î<ïßïÛ_õšðß­$©1­j·˜üTY€ùÔ9áÏÂg¤ÑªóIiìïÛŸXþ{”$5fUíÝÓ?ýš dlò/dÅò‡Ï:I£Us·¦4è¦q¸oø|K· ÿI’s^í½+ˆ~™26ùײè9'i4ë]¶wÕú‡žù ¾s¾òÌaßÒR’R]ªÝ`òíló¥µïÏ„Ï9I£YsÅ+RÕzbAgRÕ~Ê}û’¤TÏÀÄ¢áÛsæÃà¾Kã眤‘®{Ηçou ÷íK’ÒæªÕ ¹Û›çïE¨½Î)>ç$xË^”ª'ï™›ûö¾.õ¯>8uNùëÔÚïgS±dëøÿ>IRåjµhã7gÿ‚ °1e?5W¾:|ÎIý:ÇÿÉÌïÛŸ|+ÿuß¾$)ͤZ-ºg|q®úRÜynøŒ“4&M,Jåý—mþ¾ýÉ·ò_¼ó³÷í¿6þg–$¥ªÕ wéž xê¤sÚçÂgœ¤ñ©}؇žƒ^*ºÆ}û’¤´Õj0ùÖ9€9WRsç×…Ï8IãUkïw¤bÉ6á?‡$©Q›jµ(×Þ}L24¸û;áóM’$I*¶P}[¥ÔoGŸ€ uÏø»ø'I’$-Þ|µY4wKôÈQU¦æ.oŸq’$IR±…j³hþ‘èc¡ò+Âç›$I’TL¡Ú,:§~6úœd¨÷íåáóM’$I*¦Pm½‹w‰>'júÁðù&I’$S¨6 €þÍ'EŸ€ÌTõ©Xºmø|“$I’Š)T›@ùÈ Ñg 3ƒ[OŸm’$IR1Å걘X”R·ˆ>+™éžýOñóM’$IZ<µj±hîòúès¡Ö!ïŸo’$IR1Åj±hü¾ès›^+K_>ß$I’¤bŠÕbÐ9æ÷£ @f÷\>Û$I’¤bÕbÐ=ãï¢Ï @fz—ì>Û$I’¤bÕbлhUôYÈLç¸? Ÿm’$IR1j±è_·:ú¬d¦µçÛÂg›$I’TL£Z,w}V2RµŸ~½hôl“$I’ŠiT‹@¹ææèó‘ÁÝß Ÿk’$IR1Íj±¨:OGŸ€Œô®Ø7|®I’$IÅ4Ë~ÐÜaûè³™îé_Ÿm’$IR1Ͳ_´öz{ôYÈLûë¿>Û$I’¤bše¿˜¼P˜KÍ<|¶I’$IÅ4Ë~Ð9áO£Ï @Fªö“ásM’$I*fPö €î9_‰>/)¼:|®I’$IÅ Ê~лl¯èó‘þLJÏ5I’$©˜AÙ/ú×}^2Ò»x—ð¹&I’$3(ûÀàöoEŸ€ŒtOÿ|ø\“$I’Š”ý |àÊèó‘öê…Ï5I’$©˜Aù/¿#ú¼d¤µÏ»Âçš$I’TÌ ìUë‰èó‘æŠW†Ï5I’$©˜Ay/&¶J©DŸ€\ô;©˜X?Û$I’¤ÅÓ/ëÀä_êæJõä½ásM’$I*fXÖ €Öžo‹>/)¸"|®I’$IÅ Ë{pà/FŸ€Œ n=-|®I’$IÅ Ëz0ùu]s¥ÍaásM’$I*fXÖ €Îñ}^2Ò»d·ð¹&I’$3,ë@÷Œ¿‹>/éž÷/ásM’$I*fXÞ € –DŸ€ŒtOÿ|ø\“$I’Š–õ wé×¢Ï @F&o+Šžk’$IR1ò^ô¯>$ú¼d¤½ú·Âçš$I’T̰¼×}^2Ò>ôƒásM’$I*fXÖ €ÁÍ'GŸ€Œ´xwø\“$I’Š–÷àgGŸ€Œ´öþOásM’$I*fXÞ €{/Ž>/iîþ–ð¹&I’$3,ë@ùÐ5Ñç #ÍU¯ Ÿk’$IR1Ãò^¬¹9ú¼d¤¹ÃöásM’$I*fXÖ €êÉ{¢Ï @FŠ%Û„Ï5I’$©˜ay/Š5Ñç #ÅÄ¢ð¹&I’$3,ï@wCôyÈEU†Ï4I’$©˜EY/R9ˆ>2¹ôÂgš$I’TÌ¢|Ë^}\rÒoÇÏ5I’$iñÌËvÐ\ñŠèã“n>×$I’¤b廨å ÑÇ #Uçéð¹&I’$³(ßÀîo‰>/©ÚO…Ï5I’$©˜Eù.öø©èó‘Éo‰žk’$IR1‹²]´ö|[ôyȉ”$IÒâñ.ßÀ³ÿasÂ×J’$iñx—ï`ïwD€œTeø\“$I’ŠY”ï`ŸwE€Ì‹Âg›$I’T̰|ûþçè³™bÉ6á³M’$I*fX¾ €ýþKôYÈL±|»ðÙ&I’$3,ßÀïŽ>+™i®xEøl“$I’Š–ïàÀ_ˆ>+™iîòúðÙ&I’$3,ßÀAï>+™iîñÖðÙ&I’$3,ßÀÁ¿}V2ÓÚçá³M’$I*fX¶ €ö!ˆ>+™iðžðÙ&I’$3,ßÀ¡¿}V2Ó>ôƒá³M’$I*fX¾ ïæXûˆ†Ï6I’$©˜aÙ.| 0×ÚGÿnøl“$I’Š–ï`ÿŸ>+™éœø©ðÙ&I’$3,ßÀ¾?}V2Ó=ý á³M’$I*fX¾ €½Þ}V2Ó=÷«á³M’$I*fX¶ €æo>+™é]¸"|¶I’$IÅ Ëw°ÛODŸ€Ìô®Ø7|¶I’$IÅ Ëw°Ëë£Ï @fú×­Ÿm’$IR1Ãò]¬|uôYÈÌà–SÂg›$I’T̰|;½<ú¬dfp÷wÂg›$I’T̰lÅòGŸ€Ì”Ü?Û$I’¤Å3+ßÀÒm£Ï @fª§ˆŸm’$IÒ♕ï`bQJU}^rÒkÅÏ6I’$iñÌÊw°¸‘RÙ>.™)–o>Û$I’¤be½¨:ë£Ï @fš»¾)|¶I’$IÅ Ê{°áÑè³™Ö~?>Û$I’¤bå½XwWôYÈLûë¿>Û$I’¤be½˜üÊ.€¹Ô9ö“á³M’$I*fPÖ €Á}—FŸ€ÌtNû\øl“$I’Š”÷àÎs£Ï @fº, Ÿm’$IR1ƒò^ÜrJôYÈLïÊýÃg›$I’TÌ ¬ýëŠ>+™éßtbøl“$I’Š”÷ઃ¢Ï @f÷^>Û$I’¤be½è}wè³™òñ;Âg›$I’TÌ ¼ßÙ!ú¬d¦ê¬Ÿm’$IR1ƒ²^tÏùJôYÈP±üÅáóM’$I*¦YÞ €3¾}N2ÔÜý'Ãç›$I’TL³¬“þ<úœd¨uðûÂç›$I’TL³¼Ç~2úœd¨sì„Ï7I’$©˜fY/Ú‡$úœd¨û­Ÿo’$IR1Ͳ^´öÿ¹ès¡É¯žo’$IR1Ͳ^4wKô9ÈPÿÆãÃç›$I’TL³¼;¾4úœd¨¼ÿòðù&I’$Ó,ëÀdiЋ>+™©ž~0|¶I’$IÅ4Ë~Pk£Ï @nÊA*–n>ß$I’¤be¿(»-ú¨d¨¹Û›Ãç›$I’TL£ü÷_}N2Ô:äýáóM’$I*¦Qö €ÁígFŸ€ uŽûÃðù&I’$Ó(û@ÿú#£Ï @†ºgÿSø|“$I’Ši”ý wù>Ñç C½ËöŸo’$IR1ò_|{Yô9ÈÐàæ“Ãç›$I’TL£ìÝ3ÿ>úœd¨|ðªðù&I’$Ó(û@çÄOEŸ€ U Ÿo’$IR1²_´W,úœä¨ªR±ì…á3N’$I*¦Xö €Öþ?}L2ÕÜã§Âgœ$I’TL±ìÍ]Þ}F2Õ>ìCá3N’$I*¦Xö €bÉ6)Ueô9ÈPç„?Ÿq’$IÒâ©•ÿ`q#UÍÇ¢Ï @†ºç~5|¾I’$IūŠ\sSô9ÈPÿªÃç›$I’TL±Z,w]}N24¸óÜðù&I’$S¬ €þ ÇDŸ€ UëîŸo’$IR1Åj±è]úµès£rŠ¥/Ÿq’$IR1…j±˜ü .€ù09D£gœ$I’TL¡Z,:'ÿeôÈT{õo…Ï8I’$©˜BµX´ÿõ¿EŸ€Lu¿ù?Ãgœ$I’TL¡Z,Z¼'úŒdªwÙ^á3N’$I*¦P-Í]ß}F25¸íŒð'I’$S¨ €bé¶)Ueô9ÈP¹öÖø'I’$-ÞrõX,n¤jýÃÑç GýN*–l>ã$I’¤b ÕfP>xUô1ÈTs·7‡Ï8I’$©ØBµYôo>)úŒdª}øGÂgœ$I’Tl¡Ú,z—í}F2Õ9õ3á3N’$I*¶Pmݳÿ9úŒdªwñÎá3N’$I*¶Pmãÿ8úŒdªÓ‰á3N’$I*¶PmíC9úŒdª|øºð'I’$[¨6 €æî?}F2Uu7„Ï8I’$©ØBµYK·M©*£Ï @¦š;¿.~ÎI’$I‹7]}‹©ÚðHôÈTë÷‡Ï8I’$©ØLµZ”^}F2Õ9ñÓá3N’$I*6S­ƒ›OŽ>#™ê}{yøŒ“$I’ŠÍT«@ïò}¢Ï@¦ú×>ã$I’¤b3ÕjÐ=çËÑg S“·EÏ8I’$©ØLµZtþíDŸ€œ¿ pbQøœ“$I’ŠMT«@ëÀ_Œ>#kîú¦ð9'I’$›¨V €æª×DŸ€Œµøõð9'I’$›¨V €ÉªÎúè3©î™_ Ÿq’$IR±‰j·(½1úŒdªÕá3N’$I*6Qíƒ[O>#™ÜsQøŒ“$I’ŠMT»@ï²½£Ï@¦ªbmøŒ“$I’ŠMT»@÷[ÿ}F2Ö\ùêð9'I’$©v €öÑ¿}>2Ö>ôƒásN’$I*6Rí­ýþKôùÈXçÔÏ„Ï9I’$©ØHµ[4w|iôùÈXïÒ=Ãçœ$I’Tl¤Ú-&«ZODŸ€L î8+|ÆI’$IÅFªå |èšè3©êÉ{Ãgœ$I’Tl¤Z.ú7}FrUU©¹ÃöásN’$I*žW-½‹wŽ>"kðžð9'I’$Ï«– €Î)}>2Ö9áOÃçœ$I’T<¯Z.Ú‡}8ú|d¬wáNásN’$I*žW-Í]Þ}>2Ö¿ù¤ð9'I’$Ï«– €bbQª:ë£Ï@¦Êµ·ÄÏ9I’$iñWÏÀäW>|]ôÈÕ —Š¥Û†Ï9I’$©xNµ]ôo<>úˆd¬µ÷;Âçœ$I’T<§Ú.z®ˆ>kó{ásN’$I*žSm“þ"ú|d¬{Þ¿„Ï9I’$©xNµ]´ù@ôùÈXÿú#Ãçœ$I’T<§Ú.š«^}>2V>tMøœ“$I’ŠçTÛÀdUûÉè3«^+K¶Ÿs’$IRñlµ^”^}D269`£çœ$I’T<[­ýމ>ëûásN’$I*ž­Ö €Þ·—EŸ€Œõ¾½<|ÎI’$IųÕzÐ9þO¢Ï@Æ·œ>ç$I’¤âÙj½híÿóÑç cÕº»Âçœ$I’T<[­Åò§T•Ñg WU•š;¾,~ÖI’$I‹ë¾˜ü*À'ï‰>"küKásN’$I*,ipÇYÑç cÓ>>ç$I’¤Â ‘z—î}>2Ö»b¿ð9'I’$Ô9õ3Ñç cƒ{. Ÿs’$IRaÐHíC9ú|d¬j?™Š‰Eá³N’$IjÕ}Ð\ùªèó¹ænoŸu’$IR«î €ÉªæcÑç cí#;|ÎI’$I- €FÜ{qôùÈX÷Üÿ7|ÎI’$I- €Fê_}pôùÈXÿ†cÂçœ$I’Ô²h¤î·þWôùÈX¹æ¦ð9'I’$µ,©½úcÑç ge?Ë^>ë$I’Tï,&¿ `÷·D€Ìµöÿ¹ðY'I’¤zg0ÙÄ¢TužŽ>ëœøéøY'I’¤Tç,ž­¼ÿòèó±Þ%»…Ï9I’$Õ; €gë_shôùÈØàg‡Ï9I’$Õ; €gëžù÷Ñç cÕú‡Ãçœ$I’êÀ³µÿµèó¹æª×†Ï:I’$5j›À³5w~]ôÙÈ\ûð„Ï:I’$5j›ÀsªŠµÑç cÝoýCøœ“$IR£¶Y<§ÁÝߎ>ëïëásN’$IÚfðœz—ï}>2V>xuøœ“$IR£¶Y<§Î©Ÿ‰>9ë5S±dëðY'I’¤F-³xî/ã÷G€Ìµöygø¬“$IR£–Y<§æŽ/K©ª¢Ï@Æ:'üiø¬“$IR£–Y<¯ê©û¢Ï@ÆzßÝ=|ÎI’$©QË,ž×àö3£Ï@Æ&¿m$zÎI’$©QË,žWïâ£Ï@ƪö“©˜X>ë$I’Ô¨]Ï«sÜEŸ€Ì5÷xkø¬“$IR£vY<ÿ²÷;¢Ï@æ:ÇþAø¬“$IR£vY<¿‰­RÕÝ}>2Ö»pEü¬“$IRª[©¼ÿòèó±Áíß Ÿs’$IjÔ. €Ô¿êÀèó±ªX>ç$I’Ô¨]©sÚßFŸ€Ì5wyCø¬“$IR£VYlì—rðû¢Ï@æÚG~<|ÖI’$©Q«,6Öò§T¢Ï@ƺ,‰Ÿu’$IJuÊ`•ko>ÜrJøœ“$IR£VYl¢þ÷>«ž¼7|ÎI’$©Q«,6Q÷ܯFŸ€Ì5W¾:|ÖI’$©Q›,6Q{õÇ¢Ï@æÚG|4|ÖI’$©Q›,6QsÕk£Ï@æºç|9|ÖI’$©Q›,6Sµá‘èó±Éωžs’$IjÔ& €Í4¸ã¬èó±ò±ÛÃçœ$I’µÉ`3õ.Z}>rVU©¹ãËÂg$I’µÈ`3uŽûÃèã¹ö¡¿>ë$I’Ô¨E›ýå¼=úld®{æ—Âg$I’µÈ`sMl•ªî†èó±þµGÄÏ:I’$¥:d°…Êû/‹>+¹!|ÎI’$©Q‹,¶PïÊ¢Ï@ÎÊ~*–½(|ÖI’$©‘}[¨sÚç¢@æZþbø¬“$IR#û,¶ô :è¿FŸ €ÌM.£g$I’Ùg°¥–o—R9ˆ>ë_uPü¬“$IRÊ= €)T®½%ú|d¬|àÊð9'I’¤FöYL¡þ ÇDŸ€œõÛ©Xºmø¬“$IR#ë,¦P÷œ/G€ÌµöûÙðY'I’¤FÖYL¡ö7~3úld®sò_†Ï:I’$5²Î` 5W½6úld®wåá³N’$I¬³˜bÕú‡¢Ï@ÆÊ¯ Ÿs’$IjdÀÜzZôùÈÙ ›Še/ Ÿu’$Ijd›Àë^°$úxd®uà/†Ï:I’$5²Í`еÿõ¿EŸ €ÌuOÿBø¬“$IR#Û,¦XsÕk¢Ï@æú×>ë$I’ÔÈ6 €iT=u_ôùÈX¹æ¦ð9'I’¤F¶YL£þÍ'EŸ€œUejîøÒðY'I’¤F–YL£îyÿ}<2×>ìCá³N’$I,³˜FíoüFôÙÈ\÷¬ÿ>ë$I’ÔÈ2 €iÔ\ñÊ”ª*ú|d¬ÿý Ÿu’$Ijd™À4«ÖÝ}>269c¢çœ$I’Yf0Íú7}>rVU©¹òUá³N’$I처fÝs¾}<2×þÆo†Ï:I’$5²Ë`šµÿHôÙÈ\÷üÅá³N’$I처fÍ^>ü®n€ù2¸õ´ðY'I’¤FvYÌ ò±Û£Ï@ƪ „Ï9I’$5²Ë`õo8:ú|d®¹ëÃg$I’Ye0ƒºgýcôÙÈ\ûèO„Ï:I’$5²Ê`µûPôÙÈ\ïÂá³N’$I¬²˜AͶO©DŸ€Œ î<7|ÖI’$©‘U3¬\ssôùÈXÕZ—ЉEá³N’$Il²˜aýëVGŸ€Ìµö|[ø¬“$IR#›,fX÷Ì/EŸ €ÌuŽÿãðY'I’¤F6YÌôwÈû£Ï@æz—î>ë$I’ÔÈ& €™¶ìE) zÑç cƒ{/‰Ÿu’$IJ¹d0‹ÊGnˆ>9ë5S±d›ðY'I’¤FYÌ¢þ÷¾}<2×Ú÷?‡Ï:I’$5²È`uOÿBôÙÈ\çä¿ Ÿu’$Ijd‘Àl~y½7úld®Õá³N’$I,²˜MË^˜Ò }>2V>tMü¬“$IRÊ! €Y6yq0oÝá²1zÖI’$©1öY̲ޕD€ÌMÞn=ë$I’Ôû,fY礿ˆ>™ëžñÅðY'I’¤ÆØg0Û_à>ïŒ>™ë_ûðY'I’¤ÆØg0Û&¥ªýdôùÈX¹öÖøY'I’¤4îYÌAƒ»Î>9«ªÔ\ñÊðY'I’¤ÆXg0õ.Z}<2×^ý±ðY'I’¤ÆXg0µþDôÙÈ\÷‚¥á³N’$I±Î`jîòúè³¹Ág…Ï:I’$5Æ: €9ªzêþèó±ÉüÐÑèY'I’¤ÆØf0Gõo:1ú|d®µ×ÛÃg$I’c›ÀÕ=çËÑg s“þ<|ÖI’$©1¶YÌQí¯ÿJôÙÈ\ïÊÂg$I’c›À\µÃKR*ûÑç cåÃׯÏ:I’$¥qÍ`+ý~ôùÈY9HͶŸu’$IjŒesXÿšÃ¢@æÚ‡}8|ÖI’$©1–YÌaS?}62×=çÿkï¾£å:˃o,7Š/ %¦|!$à€ $!å%!7@ò%B!¡¦@ Áð½ÒQ³Üe\Ä#³¹ IDATd¹c÷&7a÷^å î]²±lIÓË~Þ5câ Ü$™¹÷ì}]kýøƒk3Ï}fßgöÌNá³N’$I•‰Ì`˜ßÌÅ;D_×½åäðY'I’¤ÊDf0̦f¦ÔªF_–­{8~ÖI’$)MbC®{ïEÑ×@ÁÕö|Cø¬“$IReâ²ríKöо6 ®y쟇Ï:I’$U&. €!×b0JíK…Ï:I’$U&. €!WÛëÑ×@Áuï»4|ÖI’$©2qYŒ lýªèë È:ÍT»Mø¬“$IRe¢²AÝÛN‹¾< ®~Ð{Ãg$I’*•Àj;+úÚ(¸Ö_ Ÿu’$IªLT#¨qÄïG_×¹ñÛá³N’$I•‰Ê`Õv~yJY/úú(°lÍ]á³N’$I•‰Ê`Dõ»=úú(¸Ún¯ Ÿu’$IªLL#ªsý‘Ñ×@Á5ŽúXø¬“$IReb²Q­Óÿ%úÚ(¸ö;‡Ï:I’$U&& €Q}cüÕèk àºw>ë$I’T™˜,FÕœ­Sê4£¯€ËšëRujfü¼“$IRš„,FXï+¢¯€‚«ïÿŽðY'I’¤ÊDd0ÂÚ—í}m\óÔφÏ:I’$U&" €Ö<ᯣ¯ €‚ë\sXø¬“$IRe"²å7÷o¾6 ®·úæðY'I’¤ÊDd0ÊfÏHYí‡Ñ×@‘eYªíüŠøy'I’¤”÷,F\÷gE_×8â÷Ãg$I’*¹Ï`ĵϟ}m\뼩ðY'I’¤Jî³qe‰¾6 ®{Ç9á³N’$I•Üg0âj»þtôµPpYsmªNÍ Ÿw’$Iªä: €1”­¹;úú(¸ú¿>ë$I’TÉuc¨³ò˜èk àZ§ÿsø¬“$IR%×YŒ¡Ö™ÿ}m\çÆ£Ãg$I’*¹Î` 5yôµPpÙÚÂg$I’*¹Î`ÍÝ6¥n;úú(¸Úž¯Ÿw’$IJyÍ`Lõº6úÚ(¸æñŸ Ÿu’$Iªä6 €1Õ¹êÀèk àÚW,Ÿu’$Iªä6 €1Õ<ùÓÑ×@Áõ¾>|ÖI’$©’Û,ÆõÞï—¢¯ €¢ëuSmç—‡Ï;I’$Ur™À¸š½EÊšk£/€‚k,ýPü¼“$IRÊcc¬{×yÑ×@ÁµÏŸ>ë$I’TÉec¬}á®Ñ×@Áuï:7|ÖI’$©’Ë,ÆXãè?‰¾6Š®UMÕ©-Ãç$I’*¹Ë`ŒÕvÿ™èK êKv Ÿw’$Iªä. €1—­} úÚ(¸Ö_Ÿu’$Iªä. €1×¹å¤èk à:7>ë$I’TÉ]c®uÎNÑ×@Áeë Ÿu’$Iªä. €1×8üÑ×@ Ôm>ï$I’TÉUc®¶`»”zÝèk àš'üMø¼“$IR%WYÔ[uSôµPp« Ÿu’$Iªä* €€:×}m\oÕÊðY'I’¤J®²¨yê碯 €¢Ë²T[øÊðy'I’¤Jn²ˆø¦/Þ!úÒ(Æ·þ0|ÞI’$©’›,"šš™²Öúèk àÚ,ŒŸw’$IJyÉ ¨î=F_×½ç‚ðY'I’¤Jn²ª}ñÑ×@ѵë©:gëðy'I’¤J.²ªyÌÇ£/ €¨ô¾ðy'I’¤J.²ª¶ç룯 €hõáóN’$I•\dX¶î¡èk à:·œ>ë$I’TÉEuo=%úÚ(¸¬úhªÎž>ï$I’T Ï °ÖНE_%PßïíáóN’$I•ð,kþèë Z§ýSø¼“$IR%< €Àj ¶K©×¾6 ®sÓqáóN’$I•ð,‚ë­º)úÚ(¸¬ºÚûH’$)Y×¹æ°èk êû¾-|ÞI’$©š@pÍS?}]”@sùÂç$I’*¡YDÿï}]”@gå1áóN’$I•Ð,¢›š™²Öúèk à²uÇÏ;I’$¥È,rP÷ž £¯ €èüèy'I’¤JX9¨}ñÑ×@ 4Oýlø¼“$IR%, €Ô<æãÑ×@ tn8*|ÞI’$©–@ªíùúèë ²µ†Ï;I’¤¼VÛùå©:µeø×1Ê,rR¶î¡èk ê{¿%|ÞI’$…7µeªï÷öÔ<ñoSçêƒSoõÍ)e½TÛãuñ_Û³ÈIÝ[O‰¾.J yÊ?†Ï;I’¤qWÛýgRóØ?KíËöIÝ{/N©]/åK,rRkÅׯ|”Qçúo…Ï;I’¤Q_ì7–}4µÎ›“º·–²Úcý\©¾ÿ;¿þQf“‡`„Oùž’­} |ÞI’$ «Úü—¦Æ!ïO­3¾”:×ùÔKù§¡~ெÿ›F™@Nª-Ø.¥^wHOñž[mÑ›Âgž$IÒtîÛï¿”¿÷Ð5ƒûö‡©qØoÇÿ;G˜@Žê­ºi¨^€gÓ<ùÓáóN’$ic_Êß¾h·ç½o˜K?þïe9ªsÍa#@t®[>ï$I’~¼ÚίH#>¸Y÷íSãÛþ½e9ªyêçBä@¹dOÞ>ï$IRyö}ûÃÔ<î/¿?£Ì GÕïýxJ¢¶×Ãgž$I*é}û9~ï³æIÿ=ayjjfÊZë£ó@ 4OúTüÌ“$I%¸o¿–&Isù¿‡£Ì guï¹0ú1”@çÚo†Ï;I’T°ûö«¦I×:óßÿ¯£Ì gµ/Þ#ú1”@¶æ®ðy'I’&¨ù/yæ}ûY–Цµâëñßëf³šÇ|<ú1”DmÏ7„Ï$þ10Â,rZÿݹÆ¡¾äÝá3O’¤Röl÷íwšÑO J­síáñ‹fÓš§~.ú±”D뜯†Ï©só ñÍfó²µDŸ $šÇþYøÌ“$i|÷í7¢õ’C•dž?VG™@Îëo Æ¡sõÁá3O’¤aä¾}6WçÆ£Ã¿£Ì çµÎúÏè3”DöÄ=á3O’¤M­¶`»Ô8äýO½”ÿú#S¶æîè_©L°Î ËÂÓ£Ì çõ‡À¸ô_=÷$IzΦ¶LõýÞ>x)ÿ•k½Õ7Þdž¥sÝÒøÇù³È{s·ñ¹¢ÀØ4—>~îI’ôc/åï¿Gûö—凇?îG™ÀÔ{àÊès”DÑßùV’”ßžqß~í‡Ñ¿)¡Î5‡†Ÿ…Qf0µ/Û7ú%‘ÕפêÔÌð¹'I*×}ûƒ—òCt®:(ü|Œ2 € ¨yü'£ÏP"õß>÷$IÊ}ûLö•ÄŸ™f0Õöúùès”HkÅ×Âçž$©@÷í·ëÑ¿Ú`£µ¯Ø?ü 2 € )[ÿHôYJ¢{×¹á3O’4©÷í?ýk ¦¥}Ù>áçj”YLHÝ[O‰> @Yt©:ïEásO’”Ãûöÿ@j³SêÜrRÊÖ>ý †®}éÞágm”YLHýA 0.¥ Ÿ{’¤|Ü·ßÿ‹hï¡kÜ·O)´/Ü5þü0 € ©qØïDŸ DÚï>÷$IcjöŒÁEAó„¿|úTïþ˯ƒ2jŸ?7þLŽ0 €IiÞ‹Sêu¢ÏP½U+ãçž$i$Õv~EjñÁÿ¹o¿úhô¯ÈÖ9;…ŸÑQf0Aõº6ú<%RÛëásO’4½jó_š‡¼?µÎøRê\äSÁ<§Ö_?·£Ì`‚ê&%À¸4—!|îI’6ÿ¾ýÁGðuÛÑ¿N`¢4—>þ,0 € ª?ÌÆ¥{Ûòð¹'Izáàk_´ÛSûíZô¯˜xÍÿ.ül2 € ªþ·FŸ LZÕT»møì“$õïÛ¹ûöa šÇþyøye“Ôì†=0V¥ŽŸ}’T¶æ¿ä™÷ígYô¯(…ÆQ?F˜À„Õ½ýôè3”HÿÒè¹'I…njæ³Ü·ßŠÿPZ¥ŠŸ #Ì`Âj}÷ÿDŸ  D²5w…Ï=I*â}ûƒ—òßù]÷íCÎ4ý­ð91Ê,&¬Æ7/úL%ÓÿE=û$ibïÛï¿”ÿœ~tßþê葼€ú¿>;F™À„U[°]J½nô¹J¤uæ¿…Ï>IÊ}s¶Jõ%;ºo&\}ÿwÄÏ“f0õ¹1ú\%Ò½sEøÜ“¤\5µeª/~gjžò™Ô¹úÔ{䆔zèq AýoŸ1#Ì`ë\u`ô¹Ê¤Û¼ú(zöIR.îÛï¿”¿ñDôdF¤¶ÛkÃgÎ(³˜Àúï 0Noÿqøì“¤qT[ð² ïÛ_¿*zcT÷¢ð94Ê,&°Ú¢7EŸ  d:W>û$iè¹oøqÝvü\qZ¶îá «£”­} UgÏŸ}’´ÙMÍLõýÞ>x%eû²}R÷Þ‹Sê4£Ç+#Yí±øY5â,&´ÎÍ'FŸ dúox=û$i³ïÛ¯¯‰£@Îekî Ÿ]£Î`BkùïÑç(™ÖН…Ï>Iz®úKÊÖ¹³Ý·l¶ÞÃ×VZLfõƒÞ}>€’éÞ{Qøì“¤çªÿq|Óѽç‚ðY6ê,&µ9[¥Ô®EŸ LzÝT[øÊøù'IÏ’Û#éêÞvZø,u\C0NÍãþ"|öIÒ³Õ½û{Ñ#˜p–…ϲQg0Áµ/X}F€’éLVô쓤g«÷ÈÑ#˜pí+Ÿe£Î`‚k,ûHôJ&«>šª³·Ÿ’ô“ekŒ‘À„k_¸kø,u\ÿ^Ü”eÑç(™ú!¿>ÿ$é'óÞHÀtµV|=|–: € ¯·úæès”Lûâ=ÃgŸ$mмEF Z§}1~ž8 € ÏGÞã–=qOøì“¤¯¶Çë¢G#PÍc>>ÏFÀ„×<éSÑç(¡úâÂçŸ$ýwý™0]Ã~§øóÒ`²«ïý–ès”Pûü¹áóO’þ»Æáˆ‹@Ô÷û¥ðy6ê, P¶þ‘è³”LoÕÊðÙ'Iÿ]ÿe»ÓUÛíµáólÔY î-'GŸ „ú¯@Šž’Ô¯yêç¢G"0é²,Uçl>ÏF@jý•èã”P뜯†Ï?Iê׿- `:²úšðY6Ž, Pýà_>/@ õî¿<|þIR¿ÎµßŒ‰À„ë=öýðY6Ž,ŠÐœ­Sj×£Ï P6Y6øè­ð(©ôuïünôD&\÷¾KÃgÙ8²(HÝ{/Ž>3@ µNÿçðù'Iý¿ÜLG÷¶åá³lY¤öE»EŸ „ºw>ÿ$•¼Ù3¼˜¶Îµ‡Çϳ1dPG},úÌeÔë¤Ú.¯ Ÿ’Ê[m—WGOB Úï>ÏÆ‘@Aª-|eJY/úÜ%Ô<éïÃg ¤òV_òîè1@ë쯔cfZ§Þª•Ñç(¡²Ü3')Ÿ5Žþ“è1@óø¿ ŸgãÈ @µ¯Ø?úÜeÔi¦Ú‚íÂg ¤rÖ:ãËÑS(€Æa¿>ÏÆ‘@jûgÑç(©þü‰ž’ÊYû’½¢G Põo¼5|ž# €UÛõ5ƒÏå·ÎG‡Ï@Iå¬sÓqÑ#(€êü—„ϳqdP°zÞ}v€ÊškSuî6á3PRùêÝYô&\Öx2|–+ €‚Õ¹úàèó”TcÙGÂg ¤ò•UÀ„ë=zkø,W«yÂ_GŸ ¤:×>%•ðc¦©{çŠðy6®, Vm×EŸ ¤²æºT÷¢ð9(©<ÕùèÑ@纥噛Å+[swôJªyôŸ†Ï@Iå©yò?D= Ú, ŸgãÊ €u®;"ú %Õ7îè(©<µ/Ú=zìÐ:ý_ÂçÙ¸²(`Í“?}†€²j×RmþKÃç ¤rÔ½õÔè©@³D¯`´(`µEoŠ>C@‰5ÿ«ð9(©õ¿3zäP?è}áól\Y´ìÉû£ÏPRÝÛ–‡Ï@Iů¶`»”²,zäPÛíµá3m\Y´Îߎ>G@Yu[ƒæŠžƒ’Š]ã÷GO; ÚõT=#|¦+ €‚Ö\þù裔Xÿ¹£ç ¤b×\þ…èQ@oõ-áólœY´ú¾¿}–€ëÞ}~ø”Tì:W=ê€èÞþðy6Î,ŠÚì)[¿*ú<e•õRmÏ7ÄÏBI…­{ß%Ñ“(€ö‹ÃçÙ8³(p›Oˆ>O@‰µV|=|J*hS[¦ÔªF9 Zg%~¦1 €×úοFŸ' ÄzÞ>%³úïŠq@A4ùx¹æ§@q«/Þ!ú<%W_²cø,”T¼¼Ù10,õ’=W±(r³·HYí‡Ñg (±öeûÄÏBI…«sÍaÑã (ˆZÉ>ºØ àuo[}¦€˪«SuÎVá³PR±ê­Z=ހȚëÂçÙ¸³(x­³þ3ú\%×Xö‘ðY(©8Õæ¿4¥^7z´Ð{äÆð™6î, ž7É¢õ?‘$zJ*N¥Šk@Ato=%|¦; €R¼ÀcÑg (³n+Õvýéøy(©µ/Ø9zªѾh·ð™6î,JPç¦ã£ÏPr­3ÿ-|J*FÝ{/Ši@A4OþtøLw%ÈGåÑz«n Ÿ…’ ÐÜmRê4¢GPõC~#~®9 €Tßû-Ñg ÕüÕðy(i²kö;Ñ£ (Ú.¯ ŸkãΠ$eOÜ}¾€’ë\uPø,”4ٵΛ=Ê€‚Èj…Ï´ˆ,JRçšÃ¢ÏPrYãÉT÷âðy(irëÝYô( ¢{ß%á3-" €’Ô<þ“Ñg 5Oü»ðy(i2«-ü©”zÝè1DçÚÃÃçZD%©¶ëkRʲès”\÷¾KÃ硤ɬyìŸG0 @Zç|5|®EdP¢z«VFŸ3€T?à]áóPÒäÕÿkÀ°4Žú£ð¹‘@‰j_ºwô9H« Ÿ‡’&¬Ù3R¶öÁèñH}ß·Å϶€,JTcÙG£Ï@ÊZëSmÁËÂg¢¤É©¾dÇèÑI¯“ªs¶*ç<µ(OµÛ¥ÔmG7€Ô:í‹á3QÒäÔþÞ‚è±HïÑ[ÃçZT%«ÿ\ÑzÜ>%MN½Õ·D- @:+ ŸkQY”¬öùó¢ÏÀ@ã÷‡ÏDIù¯þ·F+ `ZçÎ*ïLµ(WÃ~;ú¼¤²oß%m|­svŠW@Á4ŽúXøl‹Ê lÍÙ:¥V5úÌ Þ“¤¶Çëâ碤\×»ÿòèiLmÑöá³-* €ÖýÁYÑg` }á.á3QR~«ïý攲,zT’5×>Z´´sÕ |µÎþJô¹Èê§êü—„ÏEIù¬uÞTô˜ ¦{ß%á³-2 €V?àW¢ÏÀÓš§~6|.JÊg½ÇnQ@Á´¯\>Û"³(c³g¤¬úhôÙè­¾¹Ô/Å“ôìÕzoôx ¨uÚË=[-ÊYç¦ã¢ÏÀÓGü~ø\””¯Ú—í=š€jú›áó-2 €’ÖÉ-@^tï\>%娹Ûxµ"0|Y–j;¿"~ÆfPÒú}'õ%òQ󸿌I@eOÜ>ߪÁY”¸Þ}žÖYylø\””ºw/z$Ô¹ùÄðùV Πĵ/ß/ú ü^7Õ÷~Køl”[}Ÿ_¼L`ØZ+¾>ãªá3Ö ´5–}$ú l ìÍ#©’Ú—ì=Š€‚jñÁðW ΠÌÍ{qJFô9øízªíöÚøù()¦y/JYí±èIõ ¾2~ÎÍŠÍ äuïünôQØ@ûâ=Âg£¤˜šË¿=‚€‚ê=~GøŒ«æ €’×:û+Ñg`C­jªíúšðù(iÌÍž‘zÞ=€‚êÜxtüœ›Ÿ@É«ïÿËÑgàÚí>%·Æ·ÿ¿èÑXë¬ÿŸsÕd ”=y_ôyx–Wütø|”4¾º÷^=y€köÛás®šƒ,”:×}ž¡}á.áóQÒxªô¾è‘YÖKµۅϺj²Pjó‰è# ð YsWH%©{ûéÑ#(°Þê[Âç\5'Y(Õv~EJ½Nô¹x†ö¥{‡ÏHI£­¾dÇÁÇsŒJ纥ᳮš“,4¨{ïEÑçà™º­T[´}øŒ”4ººß?3zÒ×:í‹á³®š“,4¨uÎNÑçàYu®ýføŒ”4šê¾Ç_ÿ‘«ïÿŽðyWÍIzê°ß/EŸK€g×ëfTôœ”4üºwœ=a€‚ËškSujfø¼«æ$ =]öÄ=ÑçàYuo=%|FJnÃ?=Z€è/£ç]5GYèéÚW,Ž>ŸÏ©qÄÃ礤!5{‹Ô{èšè±”@ëÜYñ3oV~²ÐÓ5ŽüßÑçà9õ¹ÁKø¤‚Ô<ù¢G PýWEϼj޲Ðÿ4wÛ”ZÕè3 𜚧|&~VJš^ó^œ²'ï'@ô:©6ÿ¥ñsoV~²Ðuo;-ú˜<§¬º:Õv~yø¬”´ùµÏŸ=J€’è=xUøÌ«æ, mPsùç£Ï)Àój_´[ø¬”´yÕmŸR»=F€’h_¶OøÜ«æ, mPm÷Ÿõy¼@¾u[©¾ßÛÃ祤M¯{ûéÑ(‘æ1ŸŸ{Õœe gÔ£-€<ëÞ{QªÎž>/%m|Íãþ"zt%Óÿãfôì«æ, =£ö;GŸU€Ô<ñoÃ祤«ÿÞÙº‡£ÇP"½Çï Ÿ}Õf gT?è½ÑçàeëW¥ÚŸ Ÿ™’^¸ö•K¢GP2«Ÿ}Õf g6{FÊÖ=}f^PçšCãg¦¤ç­qøÿJ)ëE  dú·EÏ¿j³Ð³Ö¹êÀè3 ð²,5–~8|fJzž—þ?qoô¤Ê&ËRm·×†ÏÀj³Ð³Ö8ò¢-ÀFé_\Ôl>7%=³Î GE „zÜ>ÿª9Í@ÏÞÜmRÖ\}v6JûÊâ禤 jý§Ñ£(©ö¥ßŸÕœf ç¬sÓñÑg`ãoøæï†ÏMIOUÛãçRV «9Î@Ï[ë;ÿ}†6IÖ\7øå=?¥²Õ?wÞ@ˆÖøæï…ÏÃj޳ÐóVÛë6ùÀÄé­Z™ªó^>C¥²Ôÿ(ÎÞª›¢>PvíZªÎÝ6|&Vsœ€^°ÞC×De€MÖ¹ñÛáóS*ES3S÷¶åÑG uo?=~&ÎÊwzÁZ+¾}–6Kó”Ï„ÏP©èµ¯Ø?ú¨ ´Nû§ð™XÍyzÁêßxkôYØO¥I¯¾dÇ”5žŒ>ÒhñÁðùX€,´Ñõ_V0ÉÚW>K¥I®¾Ï/¤lýªè£ °¡V5Uçn>#«€6ºö;Gm€ik³Sø<•&±þ›keëŠ>ÂÏнõÔðY,´ÑÕ—¼;úlL_–¥æÉŸŸ©Ò$U[´}Êž¸7úô<«æò/„ÏÉê„d M*[sWôù˜¾^'5–}4|¦J“P}ß_LÙÚ£O-ÀsªíõÆðYY,´Iµ/Þ#ú| G»>x'óè¹*å¹úïJYõÑèÓ ðœz_>+«”€6©úAï>ãC“ÕOõýß>[¥<Ö8äýÞíȽÖySáó²:AYhÓš=Ãm@¡dµÇRý€_‰Ÿ¯RŽj,ýðà]µò®¾øá3³:AYh“k_¸Kô9ª¬ñDªô¾ðù*塿)ŸI©ÛŽ>–/¨÷øá3³:aYh“«/Þ!ú¬ ]ÿ¥Îõƒ=|ÆJaÍž‘Zç͉>Š­ÿþdá³sÖde Íª·ú–èó0|­jj|ówÃg¬4öæ¿dð9Ú“Äâ¾²ÉYh³ò °,T²j{¾~ð.Ú“$[ÿHªÎÞ"|†V', mVõ}ß}æFûGýQø¬•Æñfý7˜4« Ÿ¡Õ Ì@›]ïáë£Ï=Àèôº©uÚ?…ÏZid÷ûŸ³SJY/ú¤l–ÆÒÅÏÒY“—€6»ÖНEŸ{€‘k_¶Ïàb)zæJê¶Ë«S÷޳£À´Þ¸·:gëðyZÀ,´ÙÕmŸR–EŸ€‘ë\·4Uçl>w¥éÖ8ü¥líƒÑG `Z:7, Ÿ§Õ Í@Óª÷ÀÑç`,ºw›j ^>w¥Íjî¶©}Ñnƒ[[&]cÙGâçê¬ÉÌ@ÓªuÆ—£Ï?ÀØôß)½¶çÂg¯´)Õ—ìèã{ÂÈê{ùÿ¬iüN°Ðtªíúš”zè906Y퇩qÄï‡Ï_é›Úò©7úë¶¢ ÀÐt®>8~¾ÎšÜ,4íºß?#zŒW¯“ZgÅ›*·Õ|Oê=tMôIºÆ77|ÆV'8 M»æñŸŒž!º·žê}”«j;¿bðÉîõŠ([÷pªNÍ ŸµÕ Î@ÓoÞ‹SÖ\=BôVÝ”êûÿrü,V¹›=#5OüÛ”­_}$FûѼÑóvÖdg ¡Ô¹îˆèy§ÓüÑ-[„Ïc•¯úþïHÝ{.ˆ>#W?ø×Âgnu³ÐPj|ó÷¢ç@¸î}—¦úÞoŸÉ*Gµ=~nðfX^î”A¶æ.ï½3kúYh8ÍÞ"eOÞ=Âe͵©yêçâç² [mþKSë¼9)µëÑw€±i_°0|þV €†Vû¢Ý¢ç@nô?!¥¶èMá³Yjî6©uæ¿>Š lê‹ß?‡gM~ZõýÞ=ò¥Óü¥¶:wÛð­ nî6ƒW•x¥PV½U+ãgñ¬bd ¡Ö{øúèù;½ÇïLoýaøŒÖ¾ÔÿŒ/ >ö  Ìú³0z&W ’€†ZëÌ‹ž¹Õ½åäTßû-á³Zù®¶Ë«Rû{óSV_ýˆ×m¥Ú.¯ŸÍÕ‚d ¡?iéÏ¡ÛNëLµEÛ‡Ïlå«ú>¿0øŒëÔªF?Jr£só‰áó¹Z ,4ôú‡€Ðm >­¶ÛkÃç¶›½EjñÁÔ½í´”²,úQ ;e‰ŸÕ³Š“€†^ÿ>W6þcûoXÛùáó[ã«ÿrÖÖŠ¯¥ìÉû¢‚¹•­$U§¶ ŸÙÕe á75Ó;l¢¬µ~ðŠ€þ/æð9®‘ý~ìÿµ¿sÓñƒW€ðüÚï?»g+ ¤ö…»DÏ €É”õ/¯üëá³\Ãû˜ÜöE»¥¬º:úÑ0Qúó3z†W –€FRýou/#À4uï½(5ùxªÎÙ:|®kÓö_âß[}sôÃ`"õ¸"|–W ˜€FV÷ž £ç@!ô?np{Àï Ÿízîú©j³SêÞ{qôC`â5—>|®W ˜€FVó¤OEÏ €Âé=xUjöEo˜‡fo‘ê½/µ/Ú=õ¿#ú¡P¨÷Å©íüòø9?«xYhtÍÉàÝ­N#uo995OüÛT[øSñ3¿$ÕvÿÙÔ<éïSgå1)«=ý((¤þ«Þ¢ç}µ Yh¤u®94z~_¯;xÙyëŒ/¥Ú?>û Õ¼ Þ¹¿ÿ&~½‡®ñþ6cP_òîøù?«˜Yh¤õ_ ÀeYêÝyj7'5ý-o ¸‰Õ¾25–}4µ/Üõ©{ù;èŸ(@©xó¿ÊH³ÐÈë=|]ô(¯v-uï\‘Z+¾>XÊV§¶ ÿ½§ê{¿ypEÿ妃wì÷~€PýÛ¬¢7T œ€F^ÿ<ȇ¬¹.uï8;µ/Ü%5ý³T[ô¦ðßciÞ‹RýÀ÷¤æ)ÿ˜Ú—ï—º÷\0øtò#«?>˜×á¿3f7 ¼Úü—z3@€ËO¤îÝç§ö%{¥æñ•êKvœØOè¿ktÿã›Gÿij­øZê¬<6õ½uð> ä[û’Eá¿GªÏ@c©}å’èyÀ&ê¿Ë}ÿ^ÌÎßNíóç¥æ‰—‡¼ðä!äã™æl=xþúþïH¥NÍå_|_çæoÐ×ÿË*Ë¿_¢¯[ªÏ@c©¾øÑ#€aë¶R¶î¡Ô{äÆÔ½ó»O- .ÛwðŽùíï-H­svÔ¿¬yêçRó„¿Üv0èÄ¿}ê¿;õs©uö=õ¿=wÖSÿßK÷NëLÝïŸ1X@dkîܺ@quï:7üš¥Z‚,4¶º÷]=W€jóñðë•j ²ÐØê¿tàÇekHÕ9[…_¯TK€Æ×ÜmRV}4z¾9Ò:û+ñ×*³Ê‘€ÆZÿ=ZÕT[øÊðë”jI²ÐX«ïýæÁ;|´/ß/ü¥Z¢,4öºwœ=g€hY/Õ÷~KøõIµDYhì5–}$zÔÁº·ž~mR-Y³g¤Þc·GÏ Pã°ßŽ¿6™U®,RëŒ/EÏ Hï¡kïIª%Ì@!Õl—²Æ“ÑsÐ<áo¯Iª%Ì@aµ/Û'zîc–­{(Uçl~=R-a «ÿŽŸýwþÊ£uöW¯Eª%Í@¡uo?=zþc’ÕÜ}R-i ­qÄïGÏ `LÚçÏ ¿©–8 …×[µ2z£Öª¦Ú.¯¿þ¨–8 …×\þùèQŒXûҽï=Ê^Ý@áÍÝ6e뉞GÀ¨tÛ©¶çâ¯=J^Ý@y¨uÞTôHF¤sõ!áתX(Õ¾2e­õÑs ¶^7Õ¿ñÖðkU,”ŸÚ—ï=š€!ë¬<&üZC•AÊMµEÛ§ÔëDÏ'`X²^ª/~gøµ†*ƒ,”«úÛA :7~¡ÊÓY(WÕïR–EÏ)`ýßÿáתüÏõ–€òV÷®s£G0M–…_[¨²AÊ]¥ŽžUÀtßùŸ_¿¶Peƒ,”Ëz_=²€ÍÔ¹öððk Už‘€rY󸿌žYÀæè¶Ÿð}M¡Ê3²P>›š™zÝ=º€MÔ¹ê øë ¥gË@¹­yÒ§¢g°):ÍTÛóõáתþú@iS²ÐÄÕ<å£Ç”Zûüyáתlrš¼¦f>j¿lí©:ÿ%ñ×J›š€&²æñŸŒž{PJÍãþ"üz@•ÍÊ@“Ùì-Rï‘¢g”J÷¾KRuöŒøë¥ÍÉ@[ãÛ=ÿ ¯ÊHjú[ƒŸs¥ºðUá_Œ4¬êûýRJ½Nôü€ÉÑë þBý\^•‘Õ8êcƒu¥º—{9w`ì²Æ“©¶×χ?WeìÕ÷}Û…Á ×X›ÖÏÞ"ü‹“F]ó˜ODÍ]Ñ<áoŸ‡«sý³ü Ï\ôÕ¼„JR÷¶Ó"æ.Œ]gå1áÏ¿U ¼öYþì €æwg…qÒ8ªíù†”µÖGÌ_›þí¯µ…¯ þ­JLs¶~ÆuÏÓ €î}—ÆÒ˜jùï3Æ#ë¥ÆáÞ­JX#ÿà‹§©×MÕ]^þEJcijfê=t͘§0ŒGû{ âŸs+EÖ¹îˆçY¤”§~>ü‹”ÆU}ñ)õ:ãœÃ0rÝ{.LÕ©-ßo«×ÜmRÖxâù»ÎÿB¥1Ö¾h÷qÎb©þg¾×vÿÙðçÙª„Ö8úOžõñ±Á õz©êÁ¢25wÛÔ[}˘Æ1Œø¾ÿ¥ŽŽ­]÷öïlÄ`ðiÿ'ü‹•ÆYý€w¥Ômc$ÀÈ´/Ø9ü¹µ*áÕöxÝà=þ6jÐ[sOZ?kFø-³ö Ç1“`$º÷^ä¾¥~íóç=çãä €¾úÒ?ÿ¢¥±6w›Ô[µr”3F"«>šj{ü\üsj¥ðæ½xðxؤ@çŽsâ¿piÌÕø·0Y²,5ŽúXøsiUrQëô~އ˳.új‹wÿâ¥<½\ò¦ý½ùáÏ¡UÉGS[¦ÞãwnÞ }ÃQñÿiÜÍÙ:õ¹a³†ªûý3RuöñÏ¡•òPó”ϼàcæ9ýw ¬íû‹áÿiÜÕïR·5äñ Ó=qOªíòªðçΪä£9[§lÍÝÓXôß à¦ããÿ!R@­sgs>À𴪩¾øáÏ™UÉM­3ÿm£:•zC‰Ú’Ãÿ1ÒØ›š™º÷^<¤ ÃÓ<î/ãŸ/+å¥Ú®?²ÆCXôï+¹ï²T=#ü%»Úž¯OYýñaÌhŠö%{…?OV%Wu®>d£?/¸èkØ0©¤õ·«Ý»Ï¼Ó{ôsdUrSý ÷ Þ¿o¨ €Þ“¦êüíÂÿqRDë–NgNÀ´eOÞŸj»¾&ü¹±*ùú³U7mÒãh£}í+—Äÿ¥€j ¶K½ÇïØœ9 Ó×®¥º÷fÓ¬ kŸ?w“J½è¿!`ýðß ÿGJÕ|`ü²Ì›þ) ëúdãý[¿Û­*m­ïþÿ›|À`:úÏA£Ÿ«’«jó_šz}³O›´èk_¿,ü,…4{‹Ô½û{›uÐ`Su®ÿ–OdSúÉ:7~{³S›¼èkœð7áÿh)" À8tï»$UçnþüW•\Õ:ãKÓz\mÖ µê©vÀ»ÂÿñRDeI)ëMëàÀsÉž¸Ç;þ+ýdõC~cÚïK¶y €þû¬¹7U¾*ü› EÔ¾p—i<x6Ys]ªïÿŽð绪äªÚ¢7¥lýªi?¾6{Ð×¹ó»iýÔ–áß iìMÍLݻϟö€§õº©qäÿŽ®«”§j»¼z³ßôo¨ €¾öuGzc •²ÚnÿOÊÖ=<”ƒ­Ó¾þW•|5ÿ%©wÿeC{ŒM{Ð×:~ü7F ¨qØo§Ôë ãPbí †?·U%_ÍÝ6uï:w¨³¡,úšg5þ$Ô:ç«Ã:F”Pçz¯ªVeÃælº·g赡-úšßùRü7Jw³g¤îmˇy”(‰îç¤êœ­âŸÓ*å¦ù/<.Fa¨ €”e©yÖWâ¿aÒ˜«íüŠ”­¹k¨Ç €bë­Z™j;¿<ü¹¬*¹º®èÞwÉÈsÃ]üˆ÷P«/ywJÆ(Ž“­¹{ð¦ÒÑÏaUÉMµ½Þ˜z«néãn$ €¾ÎÕ§õ³g†¥qÖ<ñïFu¤(ˆ¬öÃTß矻ª’›ê½7eëùcod €¾ÎÎIÕ/ ÿfJã¬}É^£ªàæn;x¤v=úá´ø‘îêÛRýÐߊÿH#®sòȣ@€ö%‹ÂŸ‡*°Ù3RóØ?OÙ÷¤¼] dYj¯<.U÷|cüHUs·M½®Œ>mŒIçšÃ€áÏCR㛿›º÷]šò&~ðßÚÔºp÷T]øªð–4Šj»½6ekîŽ>iŒXÿÕŸý†Ž~þ©ñ×8ü©{Ï)¯ò³ø‘^c]j}oaª.|eøOvõ}ß–²úãÑÇ €éÜømÿekjËÔ<î/SïÁ«SÞånð´f5µ.ß?Õ½9þ* ±Æ¡¿•R§}²ÎG»ø/QµEÛ§ö÷æ§Þ“÷§I‘ßÀëõRçÖ婾ì£iýl‡IŨyÜ_¤”õ¢OCÒYyìà/ÁÑÏ35Új»¼:5OýlêÞuÞD~Üwþ?¦·ö¡ÁûÔxWø^šn> :7çâ¿à·ñ¶ÎørêÞ¹"¥n;M²‰Zü¸îïH­ v|Œ WhRk_±8ú(0 ›Opñ_¤fo‘êûýÒà¯üë–¦Þšü|„_©?®×X›:·œ’šg|9Õ|oZïjRšš™º·->Bl†ÎÍ'¦êœ­âŸSj“«ÍiªïÿË©±ì£ƒ¿îw®>$uï»lpmYd…Xzáoè ûkF7\£ δG•H®á.é™ÜmqÆãªsÉ4†g*yÕ@8³žJäŬ¾ ¸^£ž`ïŠD&Ìóºá¬žòH2㮚MªsÈ4;ï¯Ù ¶¼2‚y+4umŒx˜ýo %®1‚ U§ŽÉ‘`Ë B‚•´„ðè–\¯Ñ{ì}4Ãßt†áñí`”´Ð[0³O;ÎiÕ¹bbâLLoÁü ãâ^£²öÝ.×S0kðx`ß pçýMOÁüõ•ªsÃ$€¬;FÙ¥z föÿ4@èC³$ð@žÚ á*v.¨½+@žÞßl¯Ùù„^‚y«_€æBxb'øUàLü9Xƒo¾ð“Uik°FÜîüg#› òän0º^¢‰`e—‘r”ÆÑhåÁò¥‚’g ½üuÿjcQ絟è!˜3é! Š4jê"Ê.K4‰Ö°¯¯ v½©‡`Á{‹€R‚_5ÌîN%‰Q”´oiï轨b ù¢ZÁÌç?Iîç@Ú'£®¦ÔÄ:ûÿú/é= .„ûWƒýêÔ †3¿”ïïkàM™ÉuÆ0B×D)£µcÝ+àÎ|¬áßH¼“,¶`Áæi@yú@¦e)ºVöÊÚCQõ„»¨ìÊŽ`öº2Û<ä,XIKN-À³Àúeer5„·âŸ™^6>ÝãÇ‚ö¸ƒY~­òä,XTóEU çDi+­Kç"/zrõVgò¯£¥;£Ë‡Ô_s\Á¨”å„ûÞ£ËEÊÛÖ€Ï&²á‹¬=þ»Áý°qß—w”æW Ø£¾©<©…þsÊhÜ4Üÿ{̽`öøˆòkH]0\RÑðÐZå =oÕï±m~f¼»{þ ÞÊÑÓgôS§úóf-˜Ùã ˆÎÔß*Oèù®ìX?n:øN´–ëL~¸~íSÃqSæ‚YÃní‘Ì>W+O裴•úÏ £`8ë;xgPLO0wöAwðq]u29D<Á¼åý@wÜ9O+O&‡ˆ'˜¿v èŽ]ùåÉä1Û8 tÇzñkÊ“É!â †u麣ÃÚ#‡ˆ'X¸èî«:™"¦`×€î`§“êdrˆ˜‚è ±}Ny29D\ÁôohÀv2ÕÉä1Û¿tÇ~åûÊ“É!â ì^ ºãL|Py29DLÁ¶ÎÝqgü^y29D<Áü ¯‚îdzŒ$*…½(° Ku29DLÁ–ôÝ ö,SžLO0lÐÔyjŸòdrˆx‚9ãîí‘aªÊ"=Áp“Ö€Ï(O(‡È_0óùë€öËßQžP‘¿`ØùBáÌm®j„û"TƒîøïŒTžPO0ãë ;ᾕÊÊ!â æ-麃»Ëè´/‡È]0*{³â‰ê¤rˆü³†ßà²AS0Üá…îÜ?+O*‡È_0 úˆ;÷/ÊÅ1r Ý÷cíí³,šp]ÀÙiÕâ9FxlèL°cnv‚áÂ' ¤$q¦‘Ù­MjsWIáWUd'˜]q—êëÍ|ÄW-ÑT>GÞ ºƒeó™ †ã0 {‡!òý]Ú/~»žÌq¥ ;Áp¶cPA÷I×`ë,Ðë…Û² '© óæ(&ö;d¸ÜûØ&Š  [ÄÈú`ö¿A¹LF#áLéÍeÒ:QÁ¢Dß øo¿¨\&£‘v/Ýñ«_S XÔòÁ·›¬ÈÌ:lOùô›&.îhC }¥r©Œ†èr„ûÞ àáhJÃS6šªãÖ ûå流«³wÆã@œŽÊuÏäÃ1ĶÙ@ œÃV,•rYÃn%ó‰uh9ÿÓ¤!˜3ý1 F°{‰²xÌòö Oí*¸3ŸT+œñP*j`§:> gzçxÈ“»M5z¤.µYýs6KÉèNfWvT^òœ/áÁ5y]cj‚9ª`IOSÝ2…„Ù모ۇÂîDgãÎNÁŒ²KAÚ§€*Ø„ŠOuIv"™½®ŒÊš°Ã‰$1JÒ ']«*€:Xô‡• ظ+%-¢ƒêq_¬a§ •æ{ý© F©F¬I|‚óÁ}㙨CÚ,¿¶™Z‚5ðƨJ‚msÈ”0å‚3ágz ÍLßÍéÔÖÿäé^ýP ²îp“-jÙ †o0çéB¯!8¸ÏL0l•öIÕùa Á5¢-ÃÀŽj†.Þ²>ñÁ² ÷S Ò7Éœ þú˜=?¦·`dŽbf{e.ßÅè!OíÍ©î^ Á¢»ØÒÞªsÆä=ö¾‚¿óH0gÆ™=QÖÎçE[¦'sS©ªá¾Ù#Á0œ©¨Ê“#Xá‘ÔiÁþÖÙ üÍÓ2 ë­(œù]Ì8ãšØwÖiu¥—f&îÑE¥<¸Øðß•Ü÷<âÎè5þq°4%«»XÔþœê\2gZ FiëľcËô 뎀‘eãC׋!ØõæÙ×È(w%¹­•5úžÿ½v$âéVßfŸ«ù©R7Úl8±ï¶ßõÖÕœ+âUÏt<œK°A¤Ù Cp&<ÜMcØmžÜ{Æ[œ!\æˆ;2“ŒÂ^XÍ)Á™þ»dÄêÖœ…]\óœ·9G°ümsÀžÜ Œòë¢1Sš’y«†¦Næ,¼ÅeÑVQ±¢O;0‡Þö¸û£ÉÔÐ8ç㼂1L°`Lª°`Lª°`Lª°`Lª°`Lª°`Lª°`Lª°`Lª°` ¤É-tí…JIEND®B`‚‰PNG  IHDRTp[ ÓÅ pHYsèèµ{Rk IDATxœìÝ{´u}çñ“@QTou±¬£­èT;«ÖY­:ÖN»ÆvœiGÛq¬ã\ì²³tê­ãj]msr’ån*‚ŠB”‹r .ñnä"H 0Éóìû³³rTVQà›Ë9ç÷ìý¼^k½ÿâŸ}.Ï>Ïþ}ÈÞ €'5ñäÿƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *ƒ @À 0¨ *³¨*Hý;.KÝkŽIísÞZ§¼>«^”ŠÉù©X8!5ºÖ'~7 Ës_¦ð+zß>1“ó²¿v–¤'l×óª¥Ö)oHísÿ:u×›úw¬MUá¼m6TfJggêßyyê~sIj}îOR±òù/*©¦µO{Sv¶ç¾jà õÖ“ýõ³$íU+_˜Z§ÿiê~siêßùÍ”ºEî§Ô±aPÙ[Ý2õo½(u.úP*OþÝT,ZÿB‘F öÿ9¥~;÷ ¡Þ•+²¿Ž–¤}njÿT~⵩sÉߥþ.q6· *{`ðÐRwýq©uú›S±ä©ù/iÄê|ù])UýÜ—2ì¶Þ7g=-I3Ú’ƒ~ö/X®=!UÛîÈý4;R *êáO¿ÿ\ëS¯Ëÿ‹.pݯýß”†UîKöX÷²ÎþºZ’f«rõ+RgíTÿ–4¸ÿ‡©)Æ~Pl½9µ¿ü.ÿ"Eší–”·_šû’€¹3è¥ö–ÿ5¹$ålrþô?fUý4nÆjPéßrA*yYþ_©!•ËŸªû¾—ûÒ€ì†åƒ©µúðì¯Õ%©.•'¼:õ|U'c1¨TåC©}Þßdÿ‘šT¹üTmúnîËjc¸ýÞT~üÅÙ_³KRmšœ7}v_µ·§q0òƒJRqä¡ù1¤eL€ÇW=ô£T®|~ö×î’T«V¾ õo:'º‘Tªí›Rëô7çÿEVyä¡©Ú¼!÷SÔVuïu©\úôì¯á%©nµÏ~çHhýH*ý›ÏMÅòçdÿáKM«\ñÜTm¾>÷SÔÞàÎËS±øÀì¯å%©vuXêßµ.¢ÑTºeê\øü?p©©cÊ–r? ÀÈl9ý¡Ì¹_ÛKR+?õû©úé½iTŒÄ Ò»~M*–>-ûWjbÆØ7½u˲¿¾—¤Ú¶ü9©ÇeiÔ{PôRç¢åÿJ ­\ùüTm½9÷3Œ¼îÅÎþ:_’jÛÔþ©»þ¸TwµTª[SëÓÿ.ÿRjh呇ú̘)Ãaê|åd½/Iu®ýåw¥Ôk§ºªå 2xèöTûÙxRS+—=3U›¾›û©ÆK5H5oËþº_’ê\ùÉß›þuT»A¥ÿã+S±üÙÙhR³Ç”ïä~*€ñÔk¥ö)¯Ïþú_’ê\yÜËSµíÎT7µTzÎLÅâ³ÿ°¤¦V.}zܳ>÷SŒµaùPj÷›ÙÏ$©Ö­x^Ü{]ª“Ú *½ëNNÅäüü?$©©-9( îúfî§h„áÃw¥råóóŸHR[ú´Ô¿ã²TµTºW¯JÅä¼ü?©©M·]œû©e×[nï:,Ì~. IunÉA©ÿ£KRdTºW®Èÿ‘š>¦ÜzAî§h¤Á-_KÅ¢ýòŸHR›: õo:§ÙƒJçëŸÿ!5¹©ýÓ`ãù9Ÿ ñzëÍF IuojÿÔ»é+ÍT:k'óÿ¤&79?õ¯_“ë)øº}0ÿY$¿T¹õÂf *ÝkŽÉÿ—šÜä¼ÔÿÎ's\þÀãV©½æ­ùÏ $©î-yjêßµ®ƒJ÷ÚòÃ¥†×»ú¨¹¾ô€H¯•ZŸúýìç’T÷Ê#ž‘›¾;ÞƒJoÃÓÿg|îo¶Ô亗/šËËØÃbk*þWÙÏ$©î•+ž—ªmwŒç Òÿñ•©X|`öo²Ô亼®.y`/í: ,W<7û9‚$Õ½ò¸—§ªÜ6^ƒÊà¡ÛSqä¡Ù¿¹R“ëœó¿¦ß¨¿ÁÝW¥bñS²Ÿ'HRÝk}ú)õ;ã1¨TÅ©<æeÙ¿©R“ë¬y[JU¶/w`õo<+“ó³Ÿ+HRÝkŸó¿Ç`PéwSë”7dÿfJM®ýùÿ˜Ò ;«—:0;zW®È~¶ I£Pwýq£=¨t.ü@öo¢ÔäÚ§¼>¥^k6/s`–uÎ{Oö3I*êÞÔþipÏúÑTzÎÈÿ ”\ë„ßJÃÖÜ} 0K½Ô>í³Ÿ5HRQóÊ•/HÕöûFkPÜ¿!KÊþÍ“šZù±ÃÒð§?™ËÈ`X>”ZǼ4û™ƒ$5¯uê›RôGcP©:;|½”±rÅsSõàm3}i™U[nHåg?{¤¢æu/_<ƒJûœwgÿfIMm×MUuß÷fú²jbpÛÅ©X´_ö3I*êÜ¢ið“kë=¨ôo:'ÿ7JjjS¤Áí_ŸÉK¨¡ÞºåùÏ!$ia½Ûõ6‰»ÞQ«–ƒÊpû¦T,vöo’ÔÈ&ç§þgÍÔå ÔÙp˜:g¿3ÿy„$-¬w¯¾¯†ƒJU¥Ögþ8û7Gjj½ëNš‘K½Vj}âµÙÏ$$©¨s“óRÿöKë5¨ô¾wZþoŒÔкk'gâ2FÌpÇ}©\õkÙÏ&$©¨ù[¥nYA¥Úq*–’ý›"5±Î—ÿûô?󚩺ïû©XrPö3 I*j\çÿXA¥½æ/²3¤&ÖþÌ¿OiБ'`tõo<{úmmrŸUHRQ×-Hƒû˜wPéo”¥XòÔì_”4îuÎ{ÏLÜ<¡Á]W¤bÑ‚ìç ’TÔ¨þ-ÌÌ ÒY;•ý‹‘ƽöçÞœRÕŸ‰û"€'Õ»ú¨ìg!’TÔí|vŸ•ªŸŠ£ËþÅHã\븗§aû‘º% ‡©ó¥ÿšýLD’Šº49?UܳoƒJãùù¿iŒ+—’ª‡~4“·D¡awgjÿÊìg#’TÔ¤Þºåû6¨´>ÿ–ì_„4¶-Zw®É{!€ÝV=xk*xFþ3IZX—§¯önP©~ú“T,Ú/û!k½ëNš{!€ÝÖ¿á‹ÙÏH$©¨Iý»¯Ù»A¥{ÅÙ¼4®u¿ö¾Ù¸ØcóÿOö³I*jPç«ïÝ»A¥\í=¥Ù¨}êStgãþ`ÏõÛ©uâog?3‘¤"såÊç§4èïÙ 2غ1û—Ʊòè—¤aùàlÞì±jëÍ©XrPö³I*27¸çš=T:k§²?hiÜ*—=+UÜ2›÷>{­ÿýÓ²ŸŸHR‘¹î%Ù³A¥<îðìZ«&ç§Á­Îæ=À>ë|ù]ùÏQ$ia¾Êÿúî*ƒ-7fÀÒ¸Õ[·l¶ïwöÙ°³#µŽyYö³I*2Vm¹q÷•îÕ«²?XiœjŸù_Rçâž`ŸU›¯OÅâ§d?S‘¤"S½õÇîÞ Ò:íMÙ¬4.µVž†ísq¯0czß:.û¹Š$åªý…ÿ*U{{*¦Èþ`¥q¨\~Hª¶Ý>W÷93g8œ~×Üç+’Td¨<âà”úÝ'Tú7Ÿ›ýJcó!ô·]4—·93jØz8•qþsIZ8÷U?ùÖ“*¯¾7ûƒ”ơޕ+æòþ`V î¾:‹d?k‘¤bŽë­[þäƒJ¹ú•Ù¤4êµ×¼Õ‡Ðc£·nYöóI*æ¸ö™þăJÕzxúmŠr?Hi”k𪔺Å\ß×Ìža•ÚŸýãìç.’TÌaåª_{âA¥ë…Ù 4êTT=pË\ßÒ̺a±5•«^˜ýüE’Š9l¸}Óã*oüSö'l“óÒ`ãy9îgæÄàöK½Ã¤Ô¤7ŸûøƒJë´7epÒ¨Ö½ô£9îcæT÷â¿Ë~#IÅÕ½ìŸP)–=+ûƒ“F±öi˜RÕÏq0·úÔ:ñÕÙÏc$©˜ƒÚkÞú«ƒJõÈÝÙ˜4ŠízïÐáŽûsÝÂ̹jëM©Xü”ìç2’TÌr­ã_ù«ƒJÿ–¯e`ÒÈ5µÜ}u®{€lzW­Ê6#I g¹©óîDÓƒJ÷Šeù˜4bõ¾}bÎû€|†ÕôÛ ç>Ÿ‘¤b–«¶ÝþØA¥}Ö;²?(i”êœýΜ·,Ù ùq*—=3û9$³ØàÖ ;¨”'¿&ûƒ’F¥Öñÿ:¥n‘ó~ ú?<=ûY$³Xﺓ;¨ËÉþ ¤‘héÓRµõæœ÷)µÒ9ë¿å?³‘¤…³S÷²~ôùn¢joÏþ€¤Q©ÿƒÏe½A¨›aû‘T~ì°ìç6’TÌBsßýèóÝÄàþ Ù4 uÎýë¬7'u5¸ã©˜œ—ýüF’Š®}úŸ<ú\7Ñ¿ù¼ìH‰ÏMé•YoLê¬{Áû³ŸáHR1õN|õ£ÏsÝoŸ˜ýIµÿÜ”6f½!¨½^+µVžÿ,G’Î\åÊ<ú47ѽ|*û’êœÏMØ=Õ}ßOÅÔÙÏs$©˜¡Ê#~ô9n¢ãŸâIO˜ÏMØ3½u˲ŸéHR1SMÎOiXM?¿M´ÏzGþ$Õ0Ÿ›°†UjŸúÆìg;’TÌPÃîÎé§·‰ÖgÿCö#ÕòsS¶Þœûö`$UÛî˜>_É~Æ#I ÷½áÎÍÓÏmåɯÉþ`¤ºÕÿÞ©¹ï;FZïÚ㳟ñHR1UÛnŸ~^›(W¿2ûƒ‘êTç‹™û~`ôyë/I ÇmP9ú¥3þÆÞ IDATÙŒT—Ê–†­m¹o7ÆÂðỼõ—¤4êízÃ]&Š£Ëþ`¤Z´hAܳ>÷}ÀXé]stþsIZ¸÷ ¾súùl¢XñüìFªC½uËrß_Œç[}ú ÙÏ~$©ØçAeÙ³²?)w»ÞÏ3UƒÜ·c©zðÖT,yjö3 I*ö¢]o_¸ËD±ôàìFÊYyäsÒpû¦Ü÷c­wÕÊìç@’TìEéç 6žŸû~`üUƒÔúÄk³ŸIR±‡T¤…©{Áßæ¾•hŒjË©˜: û™${AE¯µú)õZ¹ï#¥wÅÒìçB’TìA5»©ýSµé;¹ïš§ê§ÖɯÉ>$I w/ƒŠ]ïªU¹o«Ú¼aúxÍ}F$IÅndPQckú Ó‚@>ݵ“Ùω$©Ø *jdå²g¦á#wç¾_`ÐM­^•ý¼H’Š ƒŠYÃrß*ðsÕý?ðÖ_’RÝ3¨¨qu¾ôöÜ÷ü’î¥Í~n$IÅ“dPQ£*zQ¶¶å¾?à—õZ©uÌK³ŸIRñTÔœ&ç¥Ámç¾5à n¿4ÿ’$-|ü *jLÝ‹>˜ûž€@ç¬wd?G’¤âq2¨¨íúç¢ÃîÎÜ÷†;·¤rù!ÙÏ“$©ø¥ *ÿ&ç§ÁÝWç¾`7õ®;9ÿ™’$-|l}ÝK?šû€=1¬Rë”×e?W’¤â_dPÑX×ZýŠ”úíÜ·ì¡jË ©˜Ú?ûù’$?Ï ¢ñmÑ‚TmúNî¿ýì¥î×ÿ>ÿ“$-üYmÝ˧rÿÍ`_ôÊTý’ìçL’TT4®µNú7) z¹ÿä°·]œý¬I’ ƒŠÆ²ÅN¿Ç&ã¡óÅ¿Èæ$©ñ *·zW™ûo<3h¸}S*xFös'IÍΠ¢±Ê[}Œ§ÞµÇg?{’Ôì *Ÿ-HÕ}ßÏý·€Ù0¬RëS¿—ÿ JRjjMÝËåþ³À,ª6_?ý?Õæ>‡’4ÑÈ *‹Z«O©ßÎý7€YÖ½øÃÙÏ¢$M42ƒŠF¿Eû¥êÞoçþ[Àvv¤ò¨å?“’”š–AE#_÷’äþ;Àê_fö3)IË ¢‘®<ú%)u‹ÜØcíSÿ ûÙ”¤‰FePÑè69/ î\›ûo7T[nôõ’Ò\fPÑÈÖùê{sÿÝ £î×Þ—ýŒJÒDc2¨h$+W½0 Ûäþ› @FÃÖ¶Tyhö³*IÈ ¢‘l°ñ¼Ü¯¨Þu'e?«’4ш *¹:_z{î¿ÓÔE5H­;û™•¤‰±Ï ¢‘ª\öÌ4Üq_î?ÓÔÈàžkR19/ûÙ•¤‰±Î ¢‘ªÿýÓrÿ} †:gÿUö³+IcAE#SûÔ?Hi8Ìý·€nߔʥOÏ~†%ibl3¨h4Z|`ª¸%÷ßeþ?{÷nÇYz{ÉCB àÐáK(9$Ú!áù8ÉÁà„pˆ!!!á$Ä@´%¹È–å‚Üä‚»±-÷nÜänã‚ îÆÛrÃØ’gVŸy¿k/ÀE’gÖ³Êý»®û¿ØÒžçÕûì½&I’$nÝóÆßciRY¨0º.ŠžÇ’$I’$IõúÔ\ò›áwY@c"Y¨0òš{þvJýnô8–$I’$IÒÔ¿ùäðû, 1‘,TmóÖOÅ}WFÏaI’$I’$Q­C?¯¤Ic¡ÂHëœþÕèù+I’$I’¤1«xäÖ”Íß(ün hL FV¾èå©l==%I’$I’4†uÎøZøýИ(*Œ¬ÞõGEÏ]I’$I’$ie{UÊwÜ,üŽ hL FRë EÏ\I’$I’$y½+÷ ¿çÃB…Ñ3£Tîsá÷_@c¬Y¨0¶Þ4•Ý=W%I’$I’4¡•+ïKÙ6ϿҸ²Pa$t/\=S%I’$I’4áuÎþ÷ð{0 1¶,T×Üõ )õÚÑóT’$I’$I^Ùy"å‹^~4Æ’… Ἀ^’$I’$Iê{ùÒðû0 1–,TÕ:èƒÑ3T’$I’$IÓTÑOÍÝ+ü^ hŒ âÌÛ ^=B%I’$I’4eõo>9þn HãÆB…0Ó¿=;%I’$I’4¥Í~rJôýÐ+*„ÈwøµT¶‹ž›’$I’$IšÒŠפlf½ð{2 16,TÑ»rßè™)I’$I’¤)¯}ÌgÃïÉ€ÆØ°Paèš{½mðò/I’$I’$)²rå½)ÛzÓðû2 1,Tºþ]çGÏJI’$I’$iP笯‡ß—±`¡ÂPµ—}*zFJ’$I’$I?«l=žòí_~oŒ> †gÁÆ©|ì®è)I’$I’$ý\Ý wŒ¿;Ò¨³Pah:g|-z6J’$I’$I¿\·™òů¿?#ÍB…¡È¾0•ÍG£G£$I’$I’ô¤u/Û#ü hŒ4 †¢{É·¢g¢$I’$I’ôÔõ»)ßåõá÷h@cdY¨P»|—×¥ÔkGDI’$I’$éië]u`ø]ÐY*Ô®wݲèY(I’$I’$=sE?5w{sø}ÐI*Ôª¹Ï»S*ËèQ(I’$I’$­Q½ë ¿S#ÉB…ZõïX=%I’$I’¤5¯,SséÛÃïÕ€ÆÈ±P¡6­Ã?=þ$I’$I’¤µ®ëiáwk@cäX¨Pyë§â¡£gŸ$I’$I’´Nµöÿ@üF‰… µhŸôÅè™'I’$I’$­sý»Î¿c#ÅB…ê-Ø$•+ïžy’$I’$IÒ³ªuðÿŠ¿kÒ¨°P¡r3¾=ë$I’$I’¤g]qÿ÷S63'ü¾ hŒ *•oó¼TfEÏ:I’$I’$©’ZG|<üÎ hŒ *ÕY>?zÆI’$I’$I•UvWÊæo~ÿ4BY¨P‰|Ç_O©ÛŒžm’$I’$IR-µOÜ2üh„²P¡½+öŽži’$I’$IRm•ßã·T`Ê•*<[ùίM©ß‰ži’$I’$IR­µÿ|ø]Ðc¡Â³Ö»æÐèY&I’$I’$Õ^ñèí)›·Aø}Ða¡Â³ÒüÖo¤Tô£g™$I’$I’4”ÚÇn~'4BX¨ð¬ô®=,z†I’$I’$IC«øñS6oýð{9 1t*¬³æ®oH©èEÏ0I’$I’$i¨µú‹ð»9 1t*¬³ÞÕGÏ.I’$I’$ièݘ²™õÂïç€ÆPY¨°Nò]^ï·S$I’$I’4µµüdøÐ* ÖI甆g–$I’$I’VñÀµ)›™~O4†ÆB…µ–ïôê”úè™%I’$I’$…Ö:ücáwu@ch,TXk½+÷‹žU’$I’$IRxÅŠ«ý– Ì*¬•|§WùíI’$I’$é?júáð;; 1*¬•Þ{GÏ(I’$I’$id*î½,üÎh …… k,_üŠ”zíè%I’$I’$T­ƒÿWøÝШ… k¬{ñ.ѳI’$I’$I¹ú÷\~w4jg¡Âɾ0•íUѳI’$I’$IÉZü~øШ•… k¤sÎLôL’$I’$I’F¶þËÃïð€F­,Txf[ošÊìáè™$I’$I’$t­o¿/þ.Hu±PáuNùrô,’$I’$I’F¾þ­§‡ßåÚX¨ðôæ­ŸŠGožE’$I’$IÒXÔÜëmñwz@ªƒ… O«}Ìg£g$I’$I’46õ®94üNhÔÂB…§63'+®‰žA’$I’$IÒøÔï¦|ç×Äßí©j*<¥Öa‰?’$I’$IÒØÕ½d×ð»= Q9 žRÿî £g$I’$I’4~u²”oÿâðû= Q) žTsïwFI’$I’$ilëœýïáw|@£R*<©ÞŽˆž9’$ISUÙy"•«îOÅÃ7§âÞËSÿö³Sïú£Sïûû§îÅ»¤î…‹RçÌ­~Ùi_Ií·|R“ÿ~õÿÌ93ƒÿýî¥KRïÊ}SïÚÃÿ·û·ž>øÿSÜÿýT>þ£”z­è/ƒ$IÒÄT>ñ`Êl~Ï4*c¡Â/É¿rðò,I’$=‹Š^*WÞ·z9róI©{ù^ƒÅFûø¿I­C?œš{½-廼>å _˜²™õFç,¸ÍóRs×7¤æ¾¿›Zßù“Ô>þó©sÖ7ŸÞ»æÐÔ¿ëüT®¼7¥²Œþ K’$|³?ä}¾•±Pá—Ìþô¢$I’ž¡nžŠ®M½ŽMÝ vüc¹uØGSséÛS¾ãf#µ$©Å‚Ss·7 –CSÿ1u/ùÖ`qTâág3 Q ~ÎìçlK’$M]ýn*V\“zWœ:§5µüÃÁB ›™~>›(Û<75÷}OjŸôÅÔ»bŸTüè{)u²è?}I’¤Z+î½,þ¤*X¨ðŸfæ ^‚*I’4É•­ÇSÿî‹/h|L×~ïõ²ÐHóÖOÍÝß2ø³è]t*³‡£ÿŠH’$U^kÿÄŸ»€ôlY¨ð3³É I’4I;<}ö'³ÿ}ð~“ÁoŒÀ¹‹§13'5wÿ­Ô>éK©÷ƒÃ†’$Iã^ÿ–SãÏY@z¶,Tø™þçDÏI’¤u¯×Ný{.IÝKvMíe›§|ñ+ÃÏWT#ßùµ©}üç˱²½*úoš$IÒÚW–©¹Ç ?WgÅB…æž¿=V$I’Öª²½rð“~3¾6x/G6£ð3C0£Ô:胃l+½-ú¯¡$IÒ7û¾¾ð³ž zW=S$I’Öpò¯©¹÷»ïÞˆ>C¯¹ä©óÝIý;ÏM©ßþk*I’ôÔõ;~‹æŽ7 R¾ðE)u›Ñ#E’$éç+úƒðê,Ÿ¿ú7P,Pxùv/Híãÿ&õo?{ð÷G’$iÔê^¼sø™ h¬3 ?Ñ'I’4 •ÝzWî—ÚGþùàr<úœÄøÊwÜ,uNÿçTÜ{yô_kI’¤Ÿ5û>8ç\hŒ- •i7³žÏž–$Iq•E*î½,uÎþfjîñÖø³©ù­ßü¦SñÈ-Ñã%I’RçÌ ?ub¡2åZ‡üqô ‘$IÓV·™ú7ŸœÚ'þmʽ<ü<ÄtiîýÎÔ»bïÁO‡J’$ET>~OÊæm~.kÍBeÊõo9%z†H’¤iZ¢»EÊ·uî$ÞìßÃö‰[¦âk£¿;$IÒÖ>ò“áç! ±Ö,T¦X¾Ó«½¬S’$Õ—% c¢¹ô©w徃¿³’$Iè÷…ág  ±Ö,T¦X÷‚¢g‡$Iš´úÝÁoÀ¶útʶÞ4ü¼k#ßᥩsÖ×SùØ]ÑßI’$i jîõßÃÏ?@c­X¨L«§2{(znH’¤ ©xè†Ô9s«”/zYü9ž­™õRë°¦â¾+¢¿µ$IÒ×»úàøsÖ†…Ê”jóÙè™!I’Ƽrå}©{þv©¹Û›ÂÏ6P‹™9©uè‡Sÿî‹¢¿Ý$IÒ$Ök~C6ṳ̈5e¡2¥Š}/zdH’¤q¬,Rÿö³S{Ùæ)›·Aø™†¥µß{ïJeý](I’&¨Î93áç ±Æ,T¦PsÏߎž’$iÌ*½=uÎúFÊwÜ,ü,‘š{þNê]wdJE?úÛR’$M@åª)›¿Qøh¬ •)ÔýÞîѳB’$Ëo£ÜrjjüGƒ>Š>ÃÀ(™ý¨»ÞÇùI’ô¬kó—ág ±F,T¦Í‚MRÙ|4zNH’¤®l¯L½+÷MÍÝÞv×ÜçÝ©Çòèo[I’4Æ÷?üL4Öˆ…Ê”iý™è!I’F´âá›Rû¤/¥l›ç†ŸY`Ü´ùß©xàÚèocI’4¦5÷}Oøyh<# •)ã§ç$IÒ/Ö¿û¢ÿxÉüúágk3sßK³ï’$IZ›z?8"þ,¤gb¡2Eš»¾Ág«'e¡2:ßý—è9 I’ê®,RïÚï¤æ®o?{khëMS÷ÒÝß¿’$I?­wãqñç = •)PÒ/²P™p³/£•$I“U™ÿ8uNûJÊæm~ÖªÕÜï÷RñÈ­ÑI’\¹ò^ç}˜;z,T&Ù¼õS¹jEôó_’$UU¿›º-Nù¶¿Îê³ÍsSïŠ}¢Ÿ8’$)¸Öá‹?—鿲P™`­Cþ8ú¹/I’*ª繩¹ûo…Ÿ/€áiññT6ýø‘$IAõo==ü<4~Ž…Êëýàðèç¾$Iz–•+ïKíc·?W1ò^ú÷\ý(’$I•EÊwy]øyhüŒ…ʄʷý•”ºyôc_’$=›÷º`û”m½iø¹6ÃÁÇý¥²Œ~2I’¤!7ø7AôYH?e¡2¡ÚÇ}.úy/I’Ö±bÅÕ©¹ôáç `´´üCïH”$iÊ*Ÿx0eó7 ?‡ • Õ¿cyôó^’$­eeç‰Ô9í+)›Y/ü,Œ¦|ÇÍœõ%Iš²ÚË>~*(_üÊÁg,J’¤ñ©Ë©ƒw%DŸ#€10oýÔ½h§èÇ–$IR³?L~þÒ, • Ôùîÿ~ÎK’¤5¬l=žÚ'n~~ÆOû¨O{o¢$IÓPY¦æ’ß ?{ •ITÜ{yôc^’$­AýÛÎLùN¯ ?;㫹çï¤ò±»¢g’$©æºï~î*“&ßåuƒ­µ$Iáºù¼+eNøÙùö/ö^I’&¼2ÿqÊl~î€iWZ¨L–Ι[E?ß%IÒÓÔ¿çâ”ïüÚð30aæo˜º—íýˆ“$I5Ö>æ³ñg˜r¥…Êd)î¿*úÙ.I’ž¬¢Ÿ:Ëç^&}^&Wû„ÿ“R¿ýÄ“$I5ýpVôY¦]i¡29f_N%I’F¯òñ{RëÛï ?+Ó¡uलõxô£O’$ÕPs·†Ÿ5 ›b*¤sÎÜègº$Iú…z×-Kùv/?'Óeö²¥\yoô#P’$U\÷²=ÂÏM1 • RûêÔúöÿL©“E?r%I±÷žxo"Ðø •1Ö¿å”è1#IÒÄ׿óÜ”oû«ás`Z}0¥^+úÑ+IÒP*rÇ/¼÷d“ðY 4Fš…ʘʷyžèH’Ts½ëö2I`êÌ~|êw¢Á’$UZ¹òÞÔ»ñ¸Ô9s«Á{ómÝ…µf¡2¦Z‡ÿYô’$i¢ë^¾—_ï¦VûˆOx_£$il+[¥þíg¥îùÛ¥ÖáKùŽ›…ÏV 1,TÆTïûûGÏ&I’&¶îE‹Ãg=@´ö‘Ÿ´T‘$~Eoõ{O®9$µOÜÒ{O€T' •q43'•«îW’$Mdåóãg=ÀˆhûW)•Eô£Y’¤Õ•E*¾iõ{ONùrjîý®”Íß(|^©a¡2†š{¿3z|I’4‘uΙ>çFMçä¿~/zžI’4Y•eêœòá3`Tu/\ý¤–$MxeëñÔ¿ãœÔ½`ûÁ»ƒóůŸÙ/°PCÅ}WDÏ8I’&ªÎ_ Ÿï#mfNê]u@ôãZ’4)yï 0wK²1a¡2&f2ÀO~I’´nßœò…/ Ÿç“ªwÍ¡ÑzIÒ“UôRñÐ ƒ½|t×Òw¤lÞúás S*c¢}ôg¢G°$IcY™?’š»þ?á³`¢Íß0õïºkþFáÏw*ã súW£G¹$IcUïú£S63'|†L«î¹[GI¿÷žÌ~t×AôÞ€¹£ËBe ôo==z¶K’46÷_å¡ÑfÖKý[N ’4rÍ~,bÿî‹R÷ÂEÿñÞ“—Æ?³HkÊBeÔ-Øxð9™’$iÍ~º/_üŠøù @ʾ0Þ=$)®n¾zyrñ.©}Ô§S¾ËëŸÍ4ž •Îò„ IDAT×ÚÿÑã_’¤ñ¨ß]ýùÒ#0¿X­¹çï .%iâ+z©xà©÷ýo§ö‰;xþeó6Ш”…ʈ›ýüLI’ôÌuNû§ð¹ À/kýÿEIª÷½'³ÝµÝ Ÿ·4jg¡2âúwž}F$iäëßt¢—ÐŒ°î¥K¢G…$U÷Þ“E/ ®Ða¡2Êl’R¯}n$i¤+¹%åÛ:ÇŒ´ù¦þ=—D IzæºÍÔ¿çâÔ½ä[ƒß°kîú†øg(iTX¨Œ0ïO‘$éêµRs·†ÏlžY¾Ó«SÙ|4zrHÒVôSñàu©wÕ©}ÒSs¯·yï ééX¨Œ0ïO‘$ééëœòåðy Àškö‘”Ê2z|HšÒ~é½' _þ\ 1V,TFXÿÎs£Ï’$lý[OóÞ€1ä}*’†QÙ^¹ú½'—.Iíe›{ï © *£jÁƃÏí”$I¿\¹ò¾”oÿ’øy ÀÚ›¿a*~ô½èQ"i’êwSñÐ ©w復}쩹û[üà ©*#ªµÿû£#’$fe‘ZþAø¬`Ý;äyö§Ç%iÞ{2»<¹êÀÔ>éK©¹ôíƒEmôs €ÆT°PQÞŸ"IÒ“7û± Ñs€goö#x$iíß{ò¢ðç©e¡2¢¼?E’¤_®øñS¶õ¦ás€jÌ~<$ý´²õXêßvfêž·mj}çOS¾èåáÏ)Èþ •Q4Ôºyô9F’¤Ñû¨¯o¿/~NP­7MÅÃ7GOI#óÞ“õâŸK0÷©Y¨Œ æ>ïŽ>ÖH’4ru/Z>£¨^sïw .V%Mpe‘ЇnL½«N“ÿ>5÷~§÷žÆ‘…Êê|÷ÿFu$IÁúzNøŒ sf¢G¤ óÞ² e¡2‚z7}ö‘$it*ËÔ:èƒáó€ͬ—úw]=q$­Ce{Uêß}Qê^ºdðÑ]ù.¯‹¦ÀÜzX¨Œ rÕŠèó$I#SïªÂg3õËwyýàbVÒWôV¿÷äšCRûÄ-½÷€4m,TFð’$iueþHÊ·Iø|`8Ú'|!zôHú…îê]têœö•ÔÚï½)[°Iøs²@*#¦}Ìg£ÏK’$Lícþ2|60\ý›OŠ?Òô¾÷ä¦Rç¬o¤Ö˜òížþ<€lÄX¨Œ˜îåK£ÏP’$D³ŸÅÍÌ ŸÍ W¾ÃKS™==†¤‰®l¯Lý;–§î;¤ÖOùâW„ï@6,TFLñàuÑç*I’â+ú©¹×ÛÂç21ÚË6žDÒD¾÷dö£»šKßá½'0wÝX¨Œ|Û_\ I’4íu/ß+|.«wÃ1ÑãHšŒ÷žlýœðïgÈ&„…ÊiüGÑç.I’Â+ó§|á‹Âç2±òE/ÌIO]¹jÅà½C³ÿ=µúPÊ·{Aø÷.dÌBe„t–Ï>‹I’ÞìOSFÏdFCûèÏD%id*;O Þ1×½tIj»Ejîþ–ðïQȦŒ…ÊéßrjôùL’¤ÐÊŸÜ‘²‡ÏdFGÿÆã£Ç“4ü¼÷Ò(²P!åFÙ$I ­}ä'Ãç1£%ßq³T6QRíï=éß|rꜹ•÷žÀÜÑe¡2"ò_}~“$)´âÞËR63'|&0zÚÇýuô˜’*«l=–ú·Ÿ=øØïÖaMù¿þ=4Öˆ…ʈhùçÑg:I’Bkíÿðy Àèêÿð»Ñ£JZ·÷žÜu~ê^´xð›¸ùN¯ÿ^ëÌBeDÌ®$IšÖúwœ>‹ƒßêïdÑ#KZã÷ž >ºkþFáß;@£2*#¢çyÑG?I’ÂjíÿþðY Àè›}¿„4rï=™ý讃>˜²­7 ÿµ²P3륲½2ú,(IRHýÛΈŸÅŒ‡y¤bÅ5Ñ£KSXÙzÜ{O€d¡2š»½9úl(IRXÍ}ß>‹³s#•EôøÒ$×ÉRÿî S÷âS{Ù§R¾ókÃÿÞ‘`¡2ÚÇ}.ú¸(IRH³/ižÃŒŸîåK£G˜&¥¢ï½'@ZS*# {ÙÑGHI’Bj}çOÂç0ã'ßîù©\µ"zŒi +rGê]wdêœþÕÔúöÿôÞ ­ •пç’è3¥$IC¯xä–Á{Ä¢ç0ã©}Ô§£G™Æá½'w_”º.ú÷ž¼4üï-Ðk*£ðBúÎÑçLI’†^û„/ÄÏaÆZÿÖӣǙF¥n¾zyrÉ®©}Ô_¤|—ׇÿýÇB%XsÉ£’$ ½ò‰S¶`“ð9 Àxkîú†”z­è±¦QxïÉ‚Ãÿ>‰g¡̯©K’¦±ÎÙß ŸÁL†îùÛE5Õ\¹êþÔ¿ùäÔY>õGwm÷‚ð¿w@c*Y¨ë^°CôÙT’¤áÖÍS¾ý‹Ãg0bëç¤ò±»¢§›*ªl¯\ýÑ]—.Iíe›§|ÑËâÿŽÌ]ÍB%Xÿ‡ß>¯J’4Ôº—î>˜,³ïÃúÝTÜÿýÕË“c·HÍÝß’²™9៲§`¡ýðÄÑGXI’†WÑ|Þ}ôü`òøaµÏ{O€¹ãÏB%Ðì¯.K’4Mõ®[>˜LÍÝÞ<øè{O¾0üï@ö,Y¨jüGÑg\I’†Zsïw…Ï_&W÷¢¢GÝTV6’ú·‘ºçm“Zßùï=Ò¤²P Ô9s«ès¯$IC«øÑ÷Âg/“-ßöW¿¡ëµRñ£KW¿÷䘿LÍoýFøŸ;@6$*z×}–$ih;l6zö0ùÚÇ}.zäMNe±ú½'W”:'ÿ]j.}GÊæoþg ±P Toàõn<®ÒyW®ºõGw¹Ují÷Þ”mýœðÿŽ4jc¡`ö3å%IšäÚ'üŸðy ¿¨¹ä7¿E².•O<ð ï=yIøCe¡2l3sRÙy¢âk+I’F¨~'å _?sàIô®ØûGÙì¿Ùúw_”º—.Iíc·XýÑ]#ðŸ€F( •!›}¡$I“\ÿæ“Âç-<•|‡—¦²½ê?WÑKÅC7¤Þ5‡¤Îi_IÍ¥ïHÙ¼õÃÿsÐ9*CÖ:ðân¸$IBí£?>oàé´ùlêœöOƒÕg 6 ÿÏ@c,X¨ Yû¤/EßsI’T_ýnÊ·{Aø¼È*f¡2dÝKv¾ê’$©¶ú·>k²X¨ YÿÖÓ¢ïº$Iª­ÎÉ>k²X¨ YñèmÑw]’$ÕSY¦|§W…ÏZ€¬*Ã4£”Š^ôu—$IµTÜÿýøY 0·*CÔ\òÆè».I’j«³|^ø¬Èjb¡2D­Cþ8ú®K’¤Új.}Gø¬Èjb¡2D³/ê•$i+óGR6³^ø¬Èjb¡2DÝ‹vоï’$©–z×>g²Y¨ QïÆã¢ï»$Iª¥öñŸŸ³Y,T†¨Xquô}—$Iµ”ïôêð9 ÕÈBe˜_ìÖcÑ÷]’$U^ñðÍá3 «™…Êä _}ß%IR-u¿·{øœÈjf¡2$ͥï’$©–ÚG|"|Îd5³P’ö²Í£ï»$Iª¥|ÑËÃç,@V3 •!éœùoÑ÷]’$U^ñã†ÏX€l,T†¤{ùÒè;/I’*¯wõÁá3  •!éßrjô—$I•×>á á3  •!)øAô—$I•×ÜíMá3  •a}¡óGßyI’Ti³³-›™>c²!°P†mž}ç%IRåõo=-~ÆÌ •!˜ý8I’&­îyÛ†ÏX€lH,T† uЇ¢ï¼$Iª¼Öá>c²!±P‚öñŸ¾ó’$©òò^>c²!±P‚ÎòùÑw^’$UZ™?>_²!²P‚Þ÷¿}ï%IR¥õo;#|¾dCd¡2³—N’$MRÝó†ÏW€lˆ,T† xðúè{/I’*­½ìSáó " •a|‘›Fß{I’TiÍÝ+|¾dCd¡R·ù¥T–Ñ÷^’$UWÑKÙ‚ãg,ÀÜá±P©Y¾Ó«£¯½$Iª´â‘[Âç+@6d*5kîóîè{/I’*­Ó áó 2 •šµÿXô½—$I•Ö½`ûðù ™…JÍÚ'}1úÞK’¤Jk»Eø|ȆÌB¥fåó£ï½$Iª´æÞï Ÿ¯ÙY¨Ô¬wÅÞÑ÷^’$UZ¾­3И:*5ëßtbô½—$I•Uf‡ÏV€,€…JÍŠ{/‹¾û’$©²Šû®Ÿ­Y •º¿ÀÝ}÷%IReõ®?*|¶d,Tj–:YôÝ—$I•Õ½pQølÈX¨ÔiÁ&Ñ÷^’$UZû¤/ÆÏW€¹Ãg¡R£|§WEß{I’Ti­ƒÿ(|¾d,TjÔ\úöè{/I’*­¹ä7Ãç+@ÀB¥F­ƒ>}ï%IRu•Åàã,£ç+@ÀB¥Fí£?}õ%IRe•ÙCá³ b¡R£Îiÿ}÷%IReü |¶dA,TjÔ=o›è»/I’*«Û™á³ b¡R£îåK£ï¾$Iª¬ÞÕ‡ÏV€,ˆ…Jz7}÷%IReu/\>[² *5êß±<úîK’¤ÊêœþÕðÙ ±P©Q±âêè»/I’*«}Ô_„ÏV€,ˆ…ʾ¸’$MB­ý?>[² *u~q›Fß}I’TYÍÝÞ>[² *u™™“RѾû’$©²òí_?_æÆ°P©I¾Ýó£ï½$Iª´lþ†áó b¡R“|§WGß{I’TYe{UølÈY¨Ô¤¹çoGß}I’TYåã÷„ÏV€,…JMZû¿?úîK’¤Ê*¸6|¶d,TjÒúΟFß}I’TYý;Ï Ÿ­Y •š´ý«è»/I’*«ãñá³ d¡R“Î)ÿ}÷%IReõ®:0|¶d,TjÒ9ëÑw_’$UV÷â]Âg+@ÈB¥&Ýó·‹¾û’$©²:Ëç‡ÏV€,…JMº—.‰¾û’$©²:g|-|¶d,TjÒûþþÑw_’$UVç”/‡ÏV€,…JMz×-‹¾û’$©²ÚÇÿMølÈY¨Ô¤Ë©Ñw_’$UVû¨¿Ÿ­Y •šôï>[²@*5)¾9úîK’¤Êjí÷ÞðÙ ²P©ë »òÞè»/I’*«¹ôíá³ d¡R×¶ù“è»/I’*«¹Û›Ãg+@ÈB¥&©ÛŒ¾û’$©²ò_>[²@*u˜™“RYFß}I’TYùâWÆÏW€¹q,Tê°`ãè{/I’*-ßq³øù 07Ž…J òíž}ï%IR¥å;¼4|¾d,Tj/zYô½—$I•–oÿâðù ²P©A¾ók¢ï½$Iª´|»„ÏW€,…J šKÞ}ï%IR¥åÛ_²@*5híÿþè{/I’*-›·~ø|ÈY¨Ô uЇ¢ï½$Iª´lfNø|ÈY¨Ô u臣ï½$Iª´èÙ ³P©AëðEß{I’TiÙÌzáó d¡Rƒö‘}ï%IR¥eó7 Ÿ¯‘,TjÐ>êÓÑ÷^’$UZ¶õsÂç+@ÈB¥íc>}ï%IR¥åÛîsÑ÷^’$UZ¾ÝóÃç+@ÈB¥í¾}ï%IR¥å _>_²@*5hŸô¥è{/I’*-ßá×Âç+@ÈB¥Sÿ1úÞK’¤JËwÜ,|¾d,TjÐ9ý«Ñ÷^’$UZ¾ø•áó d¡RƒÎÿ}ï%IR¥å;¿6|¾d,TjÐ9óߢï½$Iª´æ®oŸ¯Y •tÎÜ*úÞK’¤Jkîþ–ðù ²P©…Š$iÒj.}{ø|ÈY¨Ô sÖ×£ï½$Iª´Ö~ï Ÿ¯Y •X¨H’&­ÖA Ÿ¯Y •X¨H’&­Öa Ÿ¯Y •tÎúFô½—$I•Ö^¶yø|ÈY¨ÔÀBE’4iµý«ðù ²P©…Š$iÒjŸ¸eø|ÈY¨Ô sö7£ï½$Iª´Îiÿ>_²@*5°P‘$MZ3· Ÿ¯Y •Ì^:I’4IuÏ]>_²@*5è|÷_¢ï½$Iª´î…‹Âç+@ÈB¥Ó¾}ï%IR¥u/Û#|¾d,TjÐ9ùï¢ï½$Iª´Þ5‡„ÏW€,…J Ú'|!úÞK’¤JëßtBø|ÈY¨Ô }Ü_Gß{I’Tiý;–‡ÏW€,…J ÚG&úÞK’¤J+î»2|¾d,TjÐ^ö©è{/I’*­xäÖðù ²P©AëˆGß{I’Tiåªáó d¡RƒÖa¾÷’$©Ú:Yø|ÈY¨Ô uðE_{I’TyÙ¼ Âg,@ÄB¥­ÿ úÎK’¤Ê˾0|ÆdA,TjÐúöû¢ï¼$Iª¼|çׄÏX€,ˆ…J šû¾'úÎK’¤ÊkîñÖð ±P©Asé;¢ï¼$Iª¼æ~¿>c² *5hîùÛÑw^’$U^ë°„ÏX€,ˆ…J š»¿%úÎK’¤Êk»EøŒÈ‚X¨Ô ù­ßˆ¾ó’$©ò:§ÿsøŒÈ‚X¨Ô ßùµÑw^’$U^÷¼mÂg,@ÄB¥ùâWDßyI’TyÝË÷ Ÿ±Y •ä;¼4úÎK’¤Êë]wdøŒÈ‚X¨Ô _øÂè;/I’*¯ûYá3 b¡R‡mž}ç%IRå÷_?cæÆ°P©ÃÌz)•eô½—$I•V>vWüŒ˜ÃB¥&©›Gß{I’Tie{Uø|È‚X¨Ôõ…Í޾÷’$©ò²ù…ÏX€,€…J]_ØÇó’$©òòE/Ÿ±Y •š^}ç%IRå5wKøŒÈX¨Ô¤¸÷²è;/I’*¯õí÷…ÏX€,€…JMúwœ}ç%IRåµøDøŒÈX¨Ô¤óIÑw^’$U^çä¿ Ÿ±Y •šô~pDô—$I•×=wAøŒÈX¨Ô¤wå~Ñw^’$U^Ãg,@ÀB¥&ÝK¾}ç%IRåõo<>|Æd,TjÒ=oÛè;/I’*¯Ï%á3 `¡R“ÎY_¾ó’$©òŠGoŸ±Y •štNýÇè;/I’*¯ì<>c²*5iÿùè;/I’j)Ûæ¹ás 2 •š´—}*ú¾K’¤ZÊwy]øœȆÌB¥&­Ã>}ß%IR-5÷}OøœȆÌB¥&­~?ú¾K’¤Zjþ±ð9 ™…JMš{¿3ú¾K’¤ZjŸ¸eøœȆÌB¥&ÍÝÞ}ß%IR-uΙ Ÿ³ÙY¨Ô$ßéUÑ÷]’$ÕR÷²=Ãç,@6d*5ɾ(ú¾K’¤Zêßx|øœȆÌB¥.ó7L©,£ï¼$Iª¼âÞËãç,ÀÜá²P©ó‹Û^}ç%IRå•+ï Ÿ±ÙY¨ÔùÅ}ìîè;/I’ª¯è§lÞúás " •+®‰¾ò’$©–ò=|ÎdCd¡R£þË£ï»$Iª¥æÞï Ÿ³ÙY¨Ô¨wñÑ÷]’$ÕRëð? Ÿ³ÙY¨Ô¨wå~Ñ÷]’$ÕRç”/‡ÏY€lˆ,TjÔ½pÇèû.I’j©{þÂð9 ‘…J:g}=ú¾K’¤Zê]}pøœȆÈB¥Fí·Œ¾ï’$©–ú·Ÿ>g²!²P©Q{ÙæÑ÷]’$ÕRñðMás " •µüÃèû.I’j©l¯ Ÿ³ÙY¨Ô¨¹×¾ï’$©¶òm€ÆÔ°P©Q¾ók£ïº$Iª­æ’7†ÏZ€lH,Tj”o÷üè».I’jkö£-£g-@6$*uš™“RÑ‹¾ï’$©–ÚÇ}.~ÖÌ •º¿Àù#Ñ÷]’$ÕRgùüð9 ‰…JÍŠGn¾ï’$©–zW>g²!±P©YqïeÑ÷]’$ÕRÿŽsÂç,@6$*5ëßzzô}—$IµTüø‡ás  •šõ~pxô}—$IõÔk§lfNø¬ȆÀB¥fÝËöˆ¾î’$©¶òE/ŸµÙX¨Ô¬{Þ6Ñw]’$ÕVsŸÿ>k²!°P©YçÔŒ¾ë’$©¶ÚË6ŸµÙX¨Ô¬½ìSÑw]’$ÕVçŒ ŸµÙX¨Ô¬µÿû£ïº$Iª­î÷vŸµÙX¨Ô¬¹äÑw]’$ÕVÿæ“Âg-@6*5Ë·{Aô]—$IµU¬¸&|ÖüÿìÝyÔ]uyèñçY;ÙZ‡ÚÚÚÚ:-­µƒëµ]¶ÕÛ:´·Ö¶®:´ÕÞÚkmë›’0D™A¨ £‚ŒÁ"EÀ aT†°÷™ÏÙw½ÑªÈ”áìß³ÏÞŸïZŸÿ!É»Ÿ÷}žäì`®z* ”Ãnô¾K’¤Jštî Ÿ³y*)~‘ï»%zß%IReKŸ>kòŠ9¨$0¾õÒè]—$I•ÕÙ÷×Âg-@^1•F×½ë’$©²ºŸ{kø¬È+æ ’Àð²ÏDïº$Iª¬þ©ŸµyÅTœ·sô®K’¤Ê\´wø¬È+æ ’@ÿ´Dïº$Iª¬Ñµ'‡ÏZ€¼b* ôŽ}Wô®K’¤ÊßñðY WÌA%îaoˆÞuI’T]ý¼Ì.Ÿ·y…Tè|êW¢W]’$UZ±ÛO…Ï[€¼B* ;?+zÏ%IR¥u~]ø¼È+ä ’ÂÂe9ìEïº$Iª¬Þq?oæªã ’êúþoGïº$Iª¬þÙsá³ ¯ƒJ"ãõ—Eïº$Iª¬ášÃÂg-@^!•DFן½ë’$©²F7>kò 9¨$2\³"z×%IReMî[>kò 9¨$28×è]—$IÕ5—ùŽŸ·yETéŸöÏÑ«.I’*­³Ï/…Ï[€¼"*‰ô¾ðçÑ{.I’*­{ä[Âç-@^•D:ÿfôžK* {‰ IDAT’¤Jë¯úPø¼È+â ’H±ÇÏEï¹$Iª´Á…{†Ï[€¼"*©,Ú¶,ÇÃè]—$I•5ºö¤øy 0W •”¿Ø÷;z×%IReï¼:|ÖäqPIh|ËW£w]’$U×°[æ · Ÿ·yT^u\ôªK’¤J+öüùðy WÀA%¡ÁE{Gï¹$Iª´îŠÂç-@^•„ú§4zÏ%IR¥õV~0|ÞäpPI¨wÌ;£÷\’$UÚ`õ^áó ¯€ƒJBC~+zÏ%IR¥Ö® Ÿ·yT*ö|^ôžK’¤Jßµ6|ÞäpPIiѶe9Eïº$Iª®Qã¼ Ÿ¹sÓå ’úüþ[£W]’$UZ±× Ãç-@>e*‰¿}qôžK’¤Jëñæðy O™ƒJbëÞsI’TiýSþ1|ÞäSæ ’Øà¢OFï¹$Iª´ÁW÷ Ÿ·ù”9¨$Ö?ãÿEï¹$Iª´Ñõ§…Ï[€|ÊTëû®è=—$I•6þ·Ï[€|ÊTëòúè=—$IÕ6–ùâíÃg.@>E*‰ËŸ½æ’$©ò:{¿8|æäSä ’ÚâíËr2ŽÞsI’TiÝÏþQü̘›•ˆ_ô ë£÷\’$UZÿKÿ>oò)rP 0¾å«Ñ{.I’*mxÉAáó Ÿ"•Ã+ŠÞsI’Ti£›Î Ÿ·ù9¨œ·,zÏ%IR¥M¸=|ÞäSä  wÒû¢÷\’$U^±ìá3 Ÿ•ÝoŒÞqI’Tyƒ^>sò)qP PìõÂè—$I•×;ñ½á3 Ÿ•‹¶+Ëñ0zÏ%IR¥ Îß%~æÌM‡ƒJÔ/ü½ßŠÞsI’Ti£k¾>oò)qP 2ºéÜè=—$I•6¾óšðy O‰ƒJášÑ{.I’ªmÔßø1—Ñ3 Ÿ• ý³F¯¹$Iª¼Î'1|æäSà ¤wü_Eï¸$Iª¼îçÿ8|æäSà ¤{Èë£w\’$U^ÿŒ…Ï\€| T‚»?7zÇ%IRå /ûLøÌȧÀA%ÊÂe9ìFï¹$Iª´Ñ·.ŒŸ¹s[ÏA%Ðøîë¢÷\’$UÚ¤øNø¼ȧÀA%Ðè†3¢÷\’$U^±ËsÂg.@¾•T /90zÇ%IRåuy}øÌÈ·’ƒJ þ‹ÞqI’Ty½“Þ>sò­ä ¨wÌ;¢w\’$UÞ`õòð™ o%•@_½ã’$©òFÿ}zøÌÈ·’ƒJ b—gGï¸$Iª¼É}ëÂg.@¾•T¢z÷Gï¹$Iª¶É¤,–>-|æä[ÁA%Øø¶Ë£×\’$U^ç ×„Ï\€|+8¨^ulôŽK’¤Êë}ñoÃg.@¾T‚ Î[½ã’$©òî>sò­à ¬wâ{£w\’$UÞèúÓÂg.@¾T‚u~]ôŽK’¤Ê›Ü{søÌÈ·‚ƒJ°b—çDï¸$Iª¾É¤,–<%|îä[ÈA¥&{¢×\’$U^çÀW‡Ï\€| 9¨ÔÀøÖK¢w\’$UÞü{âg.@¾…Tj`xåQÑ;.I’*opÁná3 ßB*508gÇè—$I•7ºî”ð™ o!•èÿ¢w\’$UÞäžÃg.@¾…Tj sÐk¢w\’$Ußd\æKž>wò-à RÅÎÏŒ^qI’”¤Î¯ Ÿ»ùpP©‰IqwôŽK’¤Êëðžð™ o•šßòÕè—$I•78—ð™ o•š^qdôŽK’¤Ê­]>sò-à Rý³ç¢w\’$UÞø»ß Ÿ¹ùpP©‰Þ±ïŠÞqI’T}“q™/yrøÜÈ7“ƒJMtxeôŠK’¤$u|uøÜÈ7“ƒJMKŸ½ß’$)I½/þmøÜÈ7“ƒJL¸#zÇ%IRå Vï>sòÍä R#£o]½ã’$©òFßürøÌÈ7“ƒJ ×½ã’$©ò&Ü>sòÍä R#ý3ÿ-zÇ%IR’Š]"|îä›ÁA¥FºŸÿãèý–$IIêö†ð¹ o•éìýâèý–$IIêŸúáð¹ o•:Y´mY»Ñ;.I’*oxéÁñs`nÓ9¨ÔÌøŽ«¢w\’$UÞhÝEá3 ß *53¼ê¸è—$I•7ém(ó… Âç.@¾‰TjfpÎNÑ;.I’’T,~øÜÈ7‘ƒJÍôŽ}wô~K’¤$u?÷Öð¹ o"•šéì÷Ñû-I’’Ôÿò¿‡Ï]€|9¨ÔÍŽO(Ëñ(zÇ%IRå ¿þùø¹ 0·iTjü›"IR“ß~eøÌÈ7‘ƒJ ®?-zÇ%IRõúe¾øqás ß*54X½/zÇ%IRõM&e±ìás  *55¼äÀè—$IIêú;ás  *5Õ?í#Ñû-I’’Ô?åÃç.@þTjª{Ä›£÷[’$%ixé!ás  *5Uìù¼èý–$IIûkás  *uµpA9émˆÞqI’T}ƒN™/Ú6~öÌ=2•›ÿ»’$µ¡Î>/ Ÿ»ù£pP©±ášÃ¢÷[’$%©wÌ;Ãç.@þ(Tj¬úG£÷[’$%ipÞ²ð¹ ? •ëñæèý–$II]wJøÜÈ…ƒJ»?7z¿%IR’&÷Ý>wòGá Rs“â;Ñ;.I’’Tìòìð¹ ?•šÝ|~ô~K’¤$u{CøÜȃJÍ .Þ/z¿%IR’ú§}$|îäÀA¥æú«>½ß’$)IÃ5‡…Ï]€ü8¨Ô\÷Ð߉ÞoI’”¤ñúËÂç.@þTj®Øù™Ñû-I’Ò4ì•ù¢íÂg/@þ0TfÀäþ[£W\’$%©óé—†Ï]€üa8¨Ì€Ñ gDï·$IJR︿Ÿ»ùÃpP™ƒÕË£÷[’$%ipþ®ás *3 ÷Å¿ÞoI’”¤Ñõ_ Ÿ»ùÃpP™_½ß’$)I“ ëÃç.@þ0TfÁNO*ËÉ8zÇ%IR’Š]"~öÌ=˜ƒÊŒ÷†èý–$IIêþás ÿ1*3btíIÑû-I’’Ô?óßÂç.@þcTfÄàÜ¥Ñû-I’’4¼òèð¹ ÿ•Ñ;öÝÑû-I’’4¾kmøÜÈŒƒÊŒèìûkÑû-I’Ò4—Å’§„Ï^€üG8¨ÌŠÅۗ娽â’$)Iƒ_?{æ~ÈAe†ŒïøFô~K’¤$õW}(|îä?ÂAe† ¿þùèý–$II^zHøÜÈ„ƒÊ éŸñ±èý–$IIßziøÜÈ„ƒÊ éñæèý–$Iiö6¾?,zöäßç 2CŠ]2z½%IR²:û¾,|öäßç 2c&ܽߒ$)I½Þ>wòïsP™1£ÎŒÞoI’”¤ÁE{‡Ï]€üûTfÌàÂ=£÷[’$%itÓ9ás ÿ>•Ó;þ¯¢÷[’$%iÒ½·Ì.Ÿ½¹ƒÊì™A¯$Im©Xþ‚ðÙ ;¨Ì Eە尽ߒ$)IÝ£ß?{æTfÒø¶+¢÷[’$%ipÎNás wP™MÃˈÞoI’”¤ÑÚUás wP™MýÓ?½ß’$)I“û¿>wr•ÙÔ]±Cô~K’¤d»þDøì˜8¨Ìžb—gGï¶$IJV÷ð?Ÿ½•Ù4Ù°>z¿%IR’úg|,|îLTfÓèú/Eï·$IJÒðÊ£Ãç.ÀÄAe6 Îß5z¿%IR’Æw­ Ÿ»•ÙÔ;öÝÑû-I’Ò4—ÅRß§Y(•ÕùôK£×[’$%«{èï„Ï^ ÝTfÕ¢mËrЉÞoI’”¤þiÿ?{€²ÍTfØxýeÑû-I’’4¼â³ásh7•6\sXô~K’¤$ï¼:|îíæ 2Ãú§~8z¿%IRšÆ£2ßéIá³ÈZËAe†uýíèõ–$IÉêò[á³ÈZËAe†KžR–“qô~K’¤$õOù§ðÙ d­å 2ãÆw_½ß’$)IÃ5+Âç.µ–ƒÊŒ~ã˜èý–$IIß~eøÜ²ÖrP™qý3?½ß’$)Mãa™ïôÄðÙ d­ä 2㺇ÿAôzK’¤duzMøì²VrP™qÅ.ÏŽÞmI’”¬þª…Ï^ k%•˜ÜwKô~K’¤$ /;4|îY+9¨4ÀhíÊèý–$II¯_>w€¬•T`pÎŽÑû-I’Ò4ê—ùŽŸ½@Ö:* Ð=êO£×[’$%«sÀ«Âg/µŽƒJ{>/z·%IR²z'¿?|öYë8¨4Ĥ¸;z¿%IR’†—>w€¬uTbôͳ¢÷[’$%i|ë%ásÈZÇA¥!ì½ß’$)MÃ^™/Þ>|öY«8¨4DïØwG¯·$IJVgÿ—‡Ï^ k•†èìó’èÝ–$IÉê}ñïÂg/µŠƒJS,ܦœô6Dï·$IJÒàâýâg/Ð** 2Z·:z¿%IR’Æ·üWøÜ²VqPiÁÅûFï·$IJÓ Sæ‹¶ Ÿ½@Ö* 2ÿyò’$µ¥Î~¿>{€¬5T¤³ÿË£w[’$%«wÒûÂg/µ†ƒJ“,~\Y{Ñû-I’’4¼äÀøÙ ”má Ò0ãõ—Eï·$IJÒøÖKÃç.µ†ƒJà /=8z¿%IRšFý2ßññá³ÈZÁA¥az'¿?z½%IR²:¾:|öY+8¨4Lç€WEï¶$IJVoåÃg/µ‚ƒJÓx1½$©E /ûLüìÊ6pPi /¦—$µ¥ñí_Ÿ»@Ö * äÅô’¤Ö4•ùNO Ÿ½@Öx* äÅô’¤6Õ9øuá³ÈÏA¥¼˜^’Ô¦ú§~8|öYã9¨4‘ÓK’ZÔðŠ#ãg/P6ƒJCy1½$©-ï¼&|îYã9¨4”ÓK’ZÓd\K}d•rPi(/¦—$µ©îg~7|öY£9¨4”ÓK’ÚTÿô†Ï^ k4•¦òbzIR‹^ytüìÊ&sPi0/¦—$µ¥ñwþ;|îY£9¨4˜ÓK’ZÓdRËž>{€¬±TÌ‹é%Imª»b‡ðÙ då Ò`^L/IjSý3?>{€¬±TšÌ‹é%I-jxõññ³(›ÊA¥á¼˜^’Ô–&÷Þ>w€¬±T΋é%ImªØõ'Âg/5’ƒJÃy1½$©Mu|Køì²FrPi8/¦—$µ©þÙsá³ÈÉA¥éo_–Ãnô~K’¤$Ö®ŒŸ½@ÙD*-0þö×¢÷[’$%iòÀíásÈÉA¥ï½ß’$)YÅžÏ Ÿ½@Ö8*-Ð;ño¢w[’$%«÷…? Ÿ½@Ö8*-Ðùô¯Fï¶$IJÖà‚ÝÂg/5ŽƒJ,ܦœô6Dï·$IJÒè¦sâg/P6ƒJKŒn>?z¿%IR’æÿÁü_&ˆž½@Ö(*-1X½{€¬QTZ¢³÷/Dï¶$IJÖàkû‡Ï^ k•¶X¸ œ߉ÞoI’”¤ñ­—ÆÏ^ l•Ýpfô~K’¤4e¾ãÂg/5†ƒJ‹ ÎÛ9z½%IR²:½6|öYc8¨´H÷¨·Eï¶$IJVÿÔ‡Ï^ k •)öøÙèÝ–$IÉ^ñÙðÙ dá Ò2“ ·Eï·$IJÒø®µásÈÃA¥eFkWEï·$IJÓdRËž>{€¬TZ¦öÂèõ–$IÉêþ¦ðÙ dà Ò2Ý#ß½Û’$)Yý/ÿGøì²FpPi™b—çDï¶$IJÖèš/†Ï^ k•šÜ{sô~K’¤$M6Ü>w€¬TZhxÕqÑû-I’’Uìñ³á³ÈfžƒJ õÏøXônK’¤duz[øì²™ç ÒBÝÃÞ½Û’$)Yƒów Ÿ½@6óTZ¨XúÔ²¢÷[’$%iôͳÂg/Í<•–ßqUô~K’¤$Mº÷•ùÂmÂg/Í4•–®9,z¿%IR²:û¼$|öÙLsPi©ÞÊFï¶$IJVï„÷„Ï^ ›i*-Õ9à•Ñ»-I’’5¸xßðÙ d3ÍA¥­o_–ƒNô~K’¤$o½$~öå,sPi±Ñº‹¢÷[’$¥i4(óž>{€lf9¨´Øà¢OF¯·$IJVçàß Ÿ½@6³TZ¬wÜ_Dï¶$IJVÿ´Ÿ½@6³TZ¬³÷/Dï¶$IJÖðÊ£Ãg/Í,•6[¸ œwGï·$IJÒäžãg/PÎ*•–]ÿ¥èý–$IÉ*vû©ðÙ d3ÉA¥åçì½Û’$)YÝϽ5|öÙLrPi¹îgÿ(z·%IR²ç. Ÿ½@6“TZ®Øå9Ñ»-I’’5úæ—Ãg/Í$6¾¤W’¤64éÞWæ · Ÿ½@6sT(‡ßøBô~K’¤du>õËá³ÈfŽƒ eÿôFï¶$IJVïÄ÷†Ï^ ›9*”ÝC;z·%IR²_; |öÙÌqP¡ÌwzbYŽÑû-I’’4^¿&~öå¬qPa£ñmWDï·$IJÓxXæKž>{€l¦8¨°Ñ𒃢×[’$%kþã.£g/Í6êô¾èÝ–$IÉêŸþ¯á³ÈfŠƒ uö}YônK’¤d ¯:.|öÙLqPá{nSNz¢÷[’$%irߺøÙ ”³ÄA…Ý|^ô~K’¤d»?7|öÙÌpPáî½Û’$)YÝ£þ4|öÙÌpPáz_øóèÝ–$IÉœ¿Køì²™á Â{þ|ônK’¤dnüJøì²™á ÂƒL6ܽߒ$)I“Þ†2_´møì²™à ÂƒŒÖ®ŒÞoI’”¬Î¾¿>{€l&8¨ð ý³ç¢w[’$%«wÒûÂg/ͤ{Ä›£w[’$%kxé!á³Èf‚ƒ Rìü̲œL¢÷[’$%i|û•á³Èf‚ƒ 1¾ûºèý–$IišŒËbéÓÂg/Õžƒ 1¼â³Ñë-I’’Õ]±Cøì²ÚsPá!ú§~8z·%IR²úgÏ…Ï^ «=¢sÐk£w[’$%ktݩ᳨?jÇǗ尽ߒ$)I“â;e¾pAüüÊ:sPáao½$z¿%IR²:ûüRøì²ZsPáa .Þ/z·%IR²z'¾7|öY­9¨ð°z'üuônK’¤d /90|öY­9¨ð°:ŸúåèÝ–$IÉßþõðÙ dµæ ÂÃ[¸ œtïÞoI’”¦ñ¨,–>-~þe]9¨ðˆFß<+z½%IR²º+Þ>{€¬¶TxDƒóvŽÞmI’”¬þYŸŸ½@V[*<¢îQ½Û’$)Y£ëN Ÿ½@V[*<¢b÷Ÿ‰ÞmI’”¬Iq÷ÆwˆEÏ_ «%Õä¾[¢÷[’$%«óÉ_ Ÿ½@VK*<ªáÕÇGï¶$IJVï„¿Ÿ½@VK*<ªþ‹ÞmI’”¬Áן½@VK*<ªîg~7z·%IR²Æ·]>{€¬–Txt;=©,ÇÃèý–$IiÊbÉSâç/PÖƒ i|û×£×[’$%«{Øï‡Ï^ «ÓðÒC¢w[’$%«ÿåÿŸ½@V;*<¦ÞIï‹ÞmI’”¬ÑÚUá³ÈjÇA…ÇÔÙ÷eÑ»-I’’5)î.ó… Âç/ÕŠƒ má6å¤wô~K’¤duö~qüüÊ:qPa“Œn:7z·%IR²zÇÿUøì²ZqPa“ .Ø-z·%IR²_Û?|öY­8¨°IzGÿïèÝ–$IÉßvyøì²ZqPa“»?7z·%IRºÆ£²Xê{# û6Ùäþ[£×[’$%«»b‡ðÙ dµá Â&^sbônK’¤dõÏ^>{€¬6TØdý3?½Û’$)Y£ÿ>=|öYm8¨°Éº‡½!z·%IR²&½ûË|ѶáóÈjÁA…MV,yÊÆ—ôJ’Ô–:û¾,|þY-8¨°YÆw|#z·%IR²z+?>{€¬TØ,ÃË>½Û’$)YÃ+Ž Ÿ½@V *l–Þɽے$)YãïÞ>{€¬TØ,ý~#z·%IRÒŠÝ~:|þY86Ï¢mËIÿèÝ–$IÉêýöøù ”ÑTØl£›ÏÞmI’”¬Á…{†Ï^ ç Âf\¸GônK’¤dÖ]>{€,œƒ ›­÷…?ÞmI’”®a¯Ìw|Bøü²P*l¶bÏçE¯¶$IJZ÷ׇÏ_ å Â™lX½Û’$)Yý3>>{€,”ƒ [dtíIÑ»-I’’5?÷¢g/…rPa‹ô¿üÑ»-I’’5)î.ó… Âç/…qPa‹tW¼1z·%IRÒ:{¿8|þY¶H±ô©e9Gï¶$IJVïÄ÷†Ï_ ã ÂßyMônK’¤d /=8|öY¶ØpÍŠèÝ–$IÉßqUøì²0*l±ÞÊDï¶$IJ×dR;?+|þY¶XgÿWD¯¶$IJZ÷È? Ÿ¿@ÂA…-·h»²ìçÑ»-I’’58wIüüÊ*l•Ñ·.ŒÞmI’”¬Ñ_ Ÿ½@ÂA…­2X½€,9¶J±üùÑ{-I’’Ö?ý£áóÈ’sPa«M6ܽے$)Y£k¾>{€,9¶ÚhíÊèÝ–$IÉšw—ùÂáóÈ’rPa«õÏúDônK’¤¤uöyIøü²¤TØjÝÃß½×’$)i½“Þ>€,)¶Z±ìée9Gï¶$IJÖðòÃÃç/%å ÂTŒïZ½Û’$)YãïÞ>{€,)¦bxùÑ»-I’’VìþÜðù dÉ8¨0ýUŠÞkI’”´Þ1@–Œƒ SÑ9à•Ñ{-I’’6øê>áóÈ’qPa:o_–ƒ"z·%IR²Æë×ÄÏ_ LÅA…©­[½Û’$)]ãQY,{zøü²$T˜šÁê½¢W[’$%­{Ä›Ãç/%á ÂÔôŽ}Wô^K’¤¤ ÎÙ)|þY*LM±üÑ{-I’’6ºéœðù dI8¨0U“îˆÞmI’”®A§Ì?.|þYåT˜ªÑÚUÑ«-I’’Ö9èµáó+ÕEð IDATÈ*ç ÂTõÏúDô^K’¤¤õOÿ×ðù d•sPaªº‡¿)z¯%IRÒFמ>€¬r*LU±ìée9Gï¶$IJÖ¤¸»Ì.ŸÁ@V)¦n|׵ѻ-I’’ÖùÔ/‡Ï_ «”ƒ S7¼üˆè½–$IIëü÷áóÈ*å ÂÔõW}(z¯%IRÒ†W>€¬R*L]ç€WFïµ$IJÚä¾[Âç/UÊA…é[¼}YŠèÝ–$II+–??~eUT¨ÄhÝêè½–$IIëðžðù d•qP¡ƒÕ{Eïµ$IJÚð²CÃç/UÆA…JôŽygô^K’¤¤ï¾>|þYeT¨D±üÑ{-I’’WìþÜð d•pP¡2“îˆÞkI’”´ù¡=€¬*Tf´vUô^K’¤¤ .Þ/|þY%T¨Lÿ¬ODïµ$IJÚøŽo„Ï_ «„ƒ •éþ¦è½–$Ii›LÊb—ç„Ï` ›:*S,{zYNÆÑ«-I’’Ö=êmá3ȦÎA…Jïº6z¯%IRÒí>€lêT¨Ôðòã÷Z’$%m¼þ²ðù dSç B¥ú«>½×’$)mãÑÆ½ŒžÁ@6U*TªsÀ+£×Z’$%¯{ä†Ï` ›*ªµxû²Ñ{-I’’68×ø ”Óä BåFëVGïµ$IJÚhÝEáó˜.*7X½Wô^K’¤´e¾äÉá3ȦÆA…ÊõŽygôZK’¤äuWì>ƒ€ljT¨\±üÑ;-I’’78g§ð @ƒíôIJsÈo•ýÓþ¹ìðªøÿž¹æsP!‰É·Gïµ$IJÚè¦sÃç/ÍQìõ¢²wÂ{ÊÁW÷)Gߺ°,‡½ü Ú;ñ½áÿ}y 8¨ÄhíÊÀ•–$I »e¾ãÂg0³§ØýgÊîçÞZö¿²¸­]UN:÷<ê ½•ÿoÎ[ÀA…$úg}"ÑöJ’¤úÔ=ôwÂg0õVìü̲{Ä›ËþÙsß;žlÁ§ýô¿ôÃÿ?òpP!‰îáoª`M%IR½ëŸ½0|P#‹·/;Ÿ~iÙ;ùýåðŠ#ËñW—åd¼õ?~ùßãÿßæšÏA…$ŠeOŸÊƒA’¤YjtãWÂg0uzïI·’Ÿ?çìþÿš·€ƒ Ɍﺶ’‡…$IµÍ{TZüÞ“ï&ûñspÁîáÿÿy 8¨ÌðòÓ=@$IªKÝÏü^ø `ºŠ¥O-»‡¼¾ìŸö‘Ýõ?‹ö¨ÿõéð_“¼TH¦·òƒ¡I’"šÿ›IÑ3€­°h»ï½÷ä„÷”ÃKžÚ{O¦ÙðÒCâæšÏA…d:û¿"ú¹"IRòF7Ÿ>ƒؼîêóŽÊß{2͆_ÿ\ø¯[Þ*¤³h»²ìçÑÏI’Ò6ì•ùNOŒŸÃ<ö{OŠï”³ØðêãÃ-ópP!©ÑºÕÑÏI’’×]ñÆð Ðv?þÞ“ÝÕF×þë›·€ƒ I Vïýl‘$)yƒs—„Ï`€V™÷žL³ÑgÇÿšÏ5Ÿƒ IõŽygô³E’¤ä¾uAø hÕ{O²MÖ]þ{·€ƒ IËŸýl‘$)}£~™/yrøhæ{Oî.ÛÞxýšðß—¼THn²á¶èç‹$IÉëþ¦ð 0kŠ%Oiì{O¦Ùø®kïòpP!¹ÑÚ•ÑÏI’’78oYø ˜•÷žÌt×xýe~ïÉ4›Ü{süïß\ó9¨\ÿ¬ÿŒ~¾H’”<Ÿg ððÝ5¸`·V¾÷dšM¸=ü÷3o’ë®Ø!úù"IRúÆÃ²Xêû- ŠeÏØøQÈÞ{RM“î}á¿Çy 8¨Üü2É?Õ“$µ±îÿ+|TÍ{OöÂßópP!ÄüK’$Ij[ƒów ŸÁU¾÷dãGwÑ?~µ²|á6ñæšÍA…ÃË~¾H’”¼ñ·/ŸÁ[£³÷‹ËÞqù½ãɺ‹¼÷¤Få;=1üÏGÞp*„è­ü`ôóE’¤ ÷¨<-|lŠbÙÓüÞ“ü®èŸªô(ÍÔZôŸ™¼áTÑÙÿÑÏI’Bêù‡ásà!–<ù¡ï=™L¢„Òf4 ÿs4×l*ÄX´]YöóègŒ$IÉ\°{üÚmѶóÞ“~ôKÚÊŠŸÿgk®ÙT³ñA-IRËßziø Ú¥ØëEeïØw—ƒ‹ö.GëV—å ˆþÑHTìú“áÖò†sP!Ì`õòègŒ$Iéü­! Ú÷žÌt×™ÿþ{OîŒþ)H‰*vûéð?yÃ9¨¦wÌ;£Ÿ1’$…Ô=úíásh€ÅÛ—^å½'ÚX±ÇÏÆÿ™œk6ÂËŸýŒ‘$)¤ÁÅû…Ïa`ÆxbÏŸÿs:×l*„šl¸-ú9#IRòÆw­ ŸÁ@½»ÿLÙýÜ[ËþWº÷Fÿ(£šWìõÂð?·yÃ9¨j´veôsF’¤Š=~.|õP,}Úƒß{òÀÑ?²hëìýâð?ËyÃ9¨ªÖF?g$I ©wÂ_‡Ïa €÷ž¨¢:û¼$þÏ÷\³9¨ª»b‡èçŒ$I!Íÿà=‡€€÷ž {Ñ?ލ¡ÍÿY ÿ3?×l*„*–>µ,'ãèg$IÉ›lX>‡€Šß{Ò¹'úGµ¨Î¾/ ÿÈÎA…pã;¯‰~ÖH’’Ž xïÉüGw]uœ÷ž(¼Îþ/ÿºÈÎA…pÃ5+¢Ÿ5’$…Ô_õásØÄ÷žÌt×Éï÷ÞÕ¶ùwó„­Ì5›ƒ áz+?ý¬‘$)¤á5'†Ïaࡊ½^ä½'š¹:½&ük'o8ÂuöEô³F’¤&Ý{7¾¤2z@›=ô½'ßþQAÚ¢:¿.üë)o8â-Ú®,ûyôóF’¤ü“lH§XúÔ¾÷äŠ#Ëɽ7GÿH M­î¡¿þ5–7œƒ µ°ñŸNJ’ÔÂúgþ[ø€ö¼÷dý#€TYÝÃÞÿu7×l*ÔÂ`õòèç$I!n83|@3ß{Òþv_JZwÅá_‡yÃ9¨P ½cÞý¼‘$)¦AQæ;>>|À,)öø¹²{ôÛËÁù»–£›Î)'½û£¿³—Âëñæð¯Í¼áT¨…bÏŸ~ÞH’V÷3¿>‹`fÞ{òý…¦¤ç ’UÎA…Ú˜-|@•ŠÝŸ[vz[98oçrtãÙå¤{_ôwâR£òqÒYåT¨ù/xI’ÚZ÷ó>‹`ZŠ%OyÐ{OÆw^ý-·Ôøæ¿æ¢¿öó†sP¡>vzÒÆ¿¡+IR\¼oü,€-±h»²óé—–½Þ³ñ£»Æë/+ËÉ8ú[l©uu~]üó`®ÙT¨•ñm—G?w$I i|÷õás¶è½'ƒNô·Ó’æ*½&üù7œƒ µ2øÚþÑÏI’Â*özaø,€?žt?÷Ö²ÿ•ÅåhíªrRÜým³¤G¨sà«ÃŸyÃ9¨P+óÿ4T’¤¶Ö;ùýá³€öòÞi¶ëìÿŠðçHÞp*ÔJç“¿ýÜ‘$)¬áÕLJÏbZÂ{O¤ÆÕÙï×ãŸ-sÍæ B½,\àŸŽJ’ZÛ¤sO™/Ú6~ÐØî\°›÷žH ­³ï¯…?kò†sP¡vF×ýì‘$)¬ÎA¯ ŸÅ̶bÙ3Êîáoúá{Oò»¢¿Í•” Î§~%üù“7œƒ µÓ?{.úÙ#IRXý³†ÏbfÈ’'?ô½'“Iô·µ’êìó’øgÒ\³9¨P;óƒB’¤¶6úÖá³€ÙxïÉÆîõ£¿…•T“:{¿8þ95×l*ÔN±ô©e9E?$IŠi<,‹eOŸÇÔç½'?ºë›g•å ˆþnUR+özaøs+o8ji|Ç7¢Ÿ?’$…ÕýüŸ„ÏbÒšÿK5Þ{"ik*–??üY–7œƒ µ4¼ôèç$Ia .Þ7|P!ï=‘TAÅ?ÿ|›k6j©÷Å¿‹~þH’ÖøîëÃg1S²h[ï=‘”¤ù æÍ5›ƒ µ4ÿ†$ImÎgßÌ&ï=‘U±ÛO…?ó†sP¡ž.('{¢ŸA’$…Õ;ùýñó€Ç~ïÉüGwùñï¿÷äÎèo#%µ¸b—ç„?ó†sP¡¶F7œý ’$)¬áÕLJÏb~ÄNO*»‡þvÙÿÒ¿”Ão|¡œÜscô·Œ’ô ŠŸÿ¬œk6jkpÎŽÑÏ I’štïÝøyÛÑó •î½'Ã^ô·ˆ’ô¨å;>!þù9×l*ÔV÷È·D?ƒ$I ­sÐkÃç1@ëÞ{2ÿÑ]Ý{£¿”¤Ík2Ùø…èçiÞp*ÔÖü?Q›H’ÔÖæ žÇMSìò쉳ÿ•EåèºS½÷DR3v߯y 8¨Pkã»ÖF?Š$I k|Ë…Ïb€™¶xû²sÀ«Êþi)‡WYŽï¼Ú_Þ”ÔÜŽ~æÎ5Ÿƒ µ6\³"úY$IR\ãÑÆ¿A=f‚÷žHjq“ ·Å?‡çšÏA…Zë­ü@ô³H’¤ÐzǾ;|ÌÄ{O:÷Dë&IaÍ/ú£ŸËy 8¨Pký~=úY$IRhóM=¢KŸVvyý÷>ºëªãÊÉ·G›&Iµj|×µáÏê¼T¨·…Û”“ÞýÑÏ#I’šäwmœ‡á3 å{Oæ?ºëä÷ÿÈ{OÆÑß–IR­¯_ÿüžk>jotãW¢ŸG’$…6ÿ"Õèy P•b¯ýØ{OºÑß~IÒÌ5ZwQøóþ‡÷žHR½~ýóá³!ofÂð럋~&I’ÚpÍŠðy ´ÓCÞ{R|'ú[#IÒ5¼ìÐðy‘·€ƒ 3¡Ê?F?“$I mòÀíe¾pAøLÚöÞ“£¿ ’$mBƒ‹÷ Ÿ!y 8¨0:¼*ú™$IRxý_>“€ñÞIjLƒ ÷ŒŸ+sÍç ÂlX´]Yöóèç’$I¡õ¿üñ3˜éîêó޾÷dЉþöF’4¥ç. Ÿ3y 8¨03Fߺ ú¹$IRh£›ÏŸÇÀlðÞIjWý³>>{òpPaf .Ø=ú¹$IRlãaY,{FøLê¥Xò”½÷dãGwI’ZUÿô†Ï£¼T˜Ý£ßý\’$)¼Þþ,|&o_v|uÙ_õåðò#Êñ×xï‰$©ì¯úPüŒšk>þ?{÷­Y]zü¥H5F£±$ÆIl¹‰1ÑÄk,YišèM1ÉU£IÌM¹1ær¦Ñ†Cº R¥—¡÷Ž 0iìýÖýîß]ç¨H™™sÞsž½ßýù¬õ½ÿÜu×}“5ç÷üØÏ9ûMu)_üÊès  ®<8|&K’¤9jbƒÔÞãM©ûÍ¿Lý‹—¤áÊ‹St£¯#TP÷›ÿ+~nm=þY¨¨V WÝ}6@¨2{ e†ÏdI’4úòůzÆ÷ž<}õ &:G|"|Že ÈBEµjòÏ™ éÚKß>“%IÒÌò½'ŒRç ßŸmY²PQ­ê.ÿ\ôÙáúg/ ŸÉ’$i=š·qj/ykêûW©Ñixï) ‹è+c¤½Ï;ãçÝÖ㟅ŠjU{ÉÛ¢Ï&7¼÷Êð™,I’Ö^¾ãVS¯îê¯XœŠ;ÏO©ŸG_sù®oŸY²PQ½šØ •íUÑçÄ*Ë”ïôšø¹,I’R¾íO¥Î×~ï'ß{’=}S òí_>³d¡¢ÚUÜrJôùáºË?>“%Ij\‹^øìï=)Ëèk¤lþ&ñsrëñÏBEµ«wÆGŸO®øî‰á3Y’¤±nÞFOûÞ“©Ww½è+<[¿?7·nF*ª]ƒ>}D@5.Ì ·ŸË’$Û÷žL½ºë¶3|ï µQ>qøÍ’…Šê×ÂÍýV¤”:_ÿhü\–$i jïñ¦è±Ó6|ø{á³4kH*ªeû/>§ \ÿÒ}Âg²$IãP{¿÷Du˜¶á=—‡ÏÒ¬!Y¨¨–õ/Ü-úœ€påê•)›Ø |.K’T÷:‡~8z¬À´·Ÿ>K³†d¡¢ZÖ=êO£Ï)¨„öÞïŸË’$Õ½îÑ=Ò`ÚŠ›NŸ¥YC²PQ-Ë¿2úœ€JèñßásY’¤º×=ñ Ñ#¦mpÕ¡á³4kH*ªmå#·GŸU®¸ëÂð™,IRÝëö•è‘ÓÖ¿xIø,Í’…ŠjÛàšÃ£Ï*ˆWS¾Ã+Âç²$Iu®ÞöѦ­î¶á³4kH*ªmÝÿ!ú¬€Jèû×ásY’¤:׿tßèqÓÖ;í?ÃgiÖ,TTÛÚ{½=ú¬€JÜðÍð¹,IR\{dô8€i›üÅóèYš5$ Õ·‰ SÙy4ú¼€pe÷ñ”-Ø4~6K’TÓŠ[¾=Î`ÚºÇ|&|–f ÉBEµ®øÞw¢Ï+¨„Î×?>—%IªkÃ{.å0mÃþ |–f ÉBEµ®wæÖÑçTÂàòýÃç²$Iu­\}Wô(€ik/}Wø,Í’…Šj]çàß>¯ Ê'îŸzfôl–$©Ž¥~=Ê`Úò]^>K³†d¡¢z·è…)ýè3 *¡½ÿoÄÏfI’êøß•Pcù¢-ãçéÖÍÈBEµÏ»nà‡ú+‡ÏeI’êÖäoõ@m :á³4kP*ª}ý‹öˆ>¶ †/|.K’T·Úû½'z„À´•«W†ÏÒ¬AY¨¨öu—}*úÜ€ÊhïùæðÙ,IRêþ±èñ Ó6¼ïªðYš5( Õ¾|ÇŸ>· 2z§ÿWøl–$©Nuûlôø€i+n;=|–f ÊBEcQùèÑgTÂpåÅásY’¤:Õ;õÿFo˜¶ÁµG†ÏÒ¬AY¨h,\ûè³ ª¡¦|Ç­Âg³$Iu©þÎÑÓ¦­É^á³4kP*‹z'})úì€Êèžø…ðÙ,IR]\wTôè€ië5/|–f ÊBEcQ{ï_‰>» 2Š[¾>›%IªKÅ+¢G7LÛä/šGÏÒ¬AY¨h<šØ0•ÕÑçTà›òm^?Ÿ%IªAÃU·EOn˜¶î²O†ÏÒ¬AY¨hl*n=-úü€Êè.ûTøl–$©¥~;zlÀ´uþÝðYš5( M“ï ~hpí‘á³Y’¤ª—o÷Òè‘ 3ÒÞûáó4kP*›:‡|(úü€Ê(»§lÁfáóY’¤*×ÞëíÑ#f$_üªðyš5( O‹^˜Òp}†@etŽøÃøù,IR…ëö‘èq ÓW–)›¿Iø<Í”…ŠÆªá½WFcPƒ« ŸÍ’$U¹î =®`ÚÊΣá³4kX*«ú/‰>Ç Z—k¿­$IÒZë9=®`Ú†«n Ÿ¥YòPÑXÕ]ö©ès *¥sØ„ÏgI’ªÚàŠƒ¢G5LÛpåÅá³4kX*«&¿„ ø‰ÉEÑóY’¤ªVÜ~Vô¨€iÜx\ø,Í–…ŠÆ®áª[£Ï2¨Œ28eó6ŸÏ’$Uù¡ÔÑä×DÏÒ¬aY¨hì\yHôY•ÒùÚï…ÏgI’*×¼R*úÑc¦­wúÅÏÓ­›•…ŠÆ®îñ}–@¥ .[>Ÿ%IªZù.?=¢`FºÇþuø<Í–…ŠÆ®önoŒ>Ë RÊìA¯ý’$éuþè 3Ò9äCáó4kX*ËÊÇï>Ï R&EÏgI’ªT÷¸ÏFg˜‘öžo Ÿ§YòPÑX6¸nYôy•Ò¿d¯ðù,IR•ꟽ0z<ÀŒäÛ¼8|žf ËBEcYï[ÿ}ž@¥”Oü e†ÏhI’ªÒàêâÇ3L_/ Ÿ¥Y³PÑXÖÞëíÑGTNç€ß ŸÑ’$U¥â® ¢G3LÛðáï…ÏÒ¬Y¨h<›Ø0•íUÑçTJÿÂÝãg´$I©ÌŠÍ0mÅç†ÏÒ¬Y¨hl+¾{Rô¹•R>~_Êæm>£%IŠ.ßþeÑcfdpÍáó4k`*Ûz§þßès *§sÐÂg´$IÑM¾ê¬þNáó4k`*ÛÚû½7ú\€Ê\¶4|FK’]÷„¿É0#½oÿŸðyš50 oó6Neï‰è³ *eò}ñÙüÄÏiI’›ü­^¨³î²O†ÏÓ¬Y¨h¬+n?3úl€Êéö‘ð-IRdÅwOŒÇ0#“¯¯Œž§Y³PÑX×;k~ôÙ•3¸êká3Z’¤È†Ý=Ž`Fò]_>O³f¡¢±®sÈ£Ï6¨œ²ûXÊl>§%I iþ R*úÑ㦯,ý7ÝÖ1Y¨h¼[¸EJE/úˆ€Êé|ãâç´$Iµ÷|sô€)ó‡ÃçiÖÐ,T4öw]}Æ@å ®[>£%IŠhòK| Î†?¸6|žf ÍBEc_ÿÜí¢Ï8¨ž~žòE[†ÏiI’æºþ¹ÛFOa˜‘â»'…ÏÓ¬¡Y¨hìëúáè3*©{̧Ãç´$Is]qó·¢G0ÌHÿ¢=ÃçiÖÐ,T4þùX£â¦åñsZ’¤9®\}Wô€é}û_ÃçiÖÐ,TÔˆ†+/Š>ç zŠ^Ê·ûéð9-IÒ\•oûS)•eô€é|ãÂgjÖÐ,TÔˆúçm}Î@%uÿÛð9-IÒ\Õ9ðýÑ£f¬½Ï;ÃgjÖÐ,TÔˆ:‡}$úœ€J*n?+|NK’4WõNþçèÑ 36ù—Ñ35kh*jDù¢-S*úÑgTO9LùÎ?>«%Iš‹W=y`FÊö#áó4kp*jLÕGŸwPI½Óÿ+|NK’4 ï¾$zìÀŒ ï»*|žf ÎBE©¿bqôy•4|ð¦ð9-IÒ¬7ÿ)õÛÑcfdpãqñ3uëæf¡¢ÆÔ9ì¢Ï;¨¬ö¾¿>«%IšÍÚKß=n`Æúì>S³g¡¢Æ”o󢔆ƒè3*©áîá³Z’¤Ù¬wÒ—¢Ç-ÌXï[ÿ>S³g¡¢F5¼ûÒè3*©ÌHÙ¼Ãgµ$I³ÕયE[˜±Îá Ÿ©Yƒ³PQ£êŸ¿Sô™•5ùzÌèY-IÒl5|àÆèQ 3Ö^ò¶ð™š58 5ªÉ .°fƒk ŸÕ’$ÍÚ+ Ëaô¨€Ëm>W³g¡¢F•oó┆Eô¹ÕÔo§|Û—„ÏkI’F]çFOYÍ«š+0W³g¡¢Æ5¼çòè³*«{ÜgÃgµ$I£®wúEX˜±áÝ—„ÏÔ¦WZ¨¨iõ/Ø%úì€Ê*n?+|VK’4ê7=b`Æ×- Ÿ©M¯´PQÓêþñ質«¦|ç׆ÏkI’FYùø½Ñf¬¿bqøLmz¥…Ššù=*ƒèó*«wæDø¼–$iTµwÿÅèÑ #Ñ]þùð¹ÚôJ 5±É÷ k6yAÌ&6 Ÿ×’$¢î =Z`$:ÿNø\mz¥…ŠšXÿ¼í£Ï?¨´Î! Ÿ×’$¢ÁU‡FU‰|ñ«ÂçjÓ+-TÔÄ:_ûýèó*mpÍáóZ’¤Q>ø€:+»…ÏTµ,TÔÐn‘Ò }@u :)ßî¥ñ3[’¤”ïôšè‰ #1¼ç²ð¹ª–…Šš[qǹÑç TZï¤/†ÏkI’fR÷›=N`$×>WÕ²PQsë5?ú€JÞ{Eø¼–$i& .ß?zœÀHôÎÜ:|®ªe¡¢æÖ9ðýÑç T^{Ÿw†ÏlI’¦ÛðÁïFR‰î²O†ÏUµ,TÔàæo’R/‹>  Òúí?³%IšFùŽ[¥T–Ñ£F¢½÷;Âg«Z*jvÅ­§FŸ…Pie{UÊl>³%IZߺT¶ IDATÇ}6zŒÀh”Ô-Ü<|¶ªe¡¢f×;í+ÑÇ!T^wÙ§Âg¶$IëÛຣ¢G(ŒDùèásU­©,TÔèÚKß}@å·ž>³%IZ¯æm”Êüáè #1ù–ðÙª4™…ŠšÝä%»ýHô™ÕV–©½Û/ÄÏmI’Ö±ö~ïžž02¾Û²U™,TÔøŠ›–GŸ‰Pyý‹Ãg¶$IëZï¬ùÑ£F¦wÒ—Âg«ZSY¨¨ñõNù—è3*¯ÌJÙ‚ÍÂç¶$IëÒpåEÑ£F¦sÈÃg«ZSY¨¨ñµ÷z{ô™µÐ=æ3ás[’¤ç+ßî¥) ÑcF&ßéÕáóU­©,T¤‰ RùÄýÑç"T^qçŠø¹-IÒóÔ]öÉè‘ £Ó˦ž_FÏWµ¦²P‘¶n¥ÁuGEP í½~9|nK’ô\ ®úZô¸€‘Þ{eølUëÉ,T¤Éß`Zþ¹è³j¡ÉÞás[’¤µ6oãTæGK™ÁµGÆÏW¥g¡"M¾cw—×EŸP eguÊm>»%IZS“_Ú ã¤wæÖáóU­'³P‘~ÔpÕmÑç#ÔÂä_vFÏmI’ÖTÿ’½¢Ç$ŒTçˆ? Ÿ¯úI*Ò\¶4ú|€Zþàšð¹-IÒ³šØ •«WFI©É7ë„ÏX¥g¡"ý¨î‘}>@m´÷{Oøì–$驵—¾;z<ÀH•Ýǧ~a zƪõd*ÒÊ·ý©”†Eô9 µ0¸úëá³[’¤§Ö?w»èñ#UÜuaø|UëiY¨HOix÷%Ñç$ÔCÑKùâW…ÏnI’~ÜðÁïFOG©þ¥û†ÏWµž–…Šô”úçn}N@môÏ^>»%Iš¬½Ç›¢Ç"Œ\ï¤/†ÏXµž–…Šô”:} úœ€Ú(³R¶`³ðù-IRï¬yÑcF®sào…ÏXµž–…ŠôÔæo’ÊÞÑg%ÔF÷Ø¿ŽŸß’¤Æ7|èæè‘£U–Sßù=cÕzZ*Ò3*n9%ú¸€ÚÞwUøì–$5»öÒwGC¹òÑ;Ãg¬ZÏÊBEzF½oÿkôy µÒ9ðýáó[’ÔÜúí= `äŠïž>cÕzV*Ò3jïõËÑç%ÔÊà†cÃç·$©¡ÍÛ(•Oü zÀÈõÏÝ6~Î*=3 é™MlÊÇï‹>3 >†EÊw}}ü —$5®Îa‰ž‚0+ºGÿyøœUëYY¨Hkhpõ×£ÏL¨•þù;…ÏoIRó\sxô€YÑ^òÖð9«Ö³²P‘ÖP÷Ø¿Š>3 VÊö#)[ôÂð.IjP‹^˜ÊÞÑ#FoÐMÙ¼ãg­Ò3³P‘ÖP¾ãV)•eôÑ µÒ;å_Âg¸$©9uùLôè€Y1¼ïêð9«Ö³P‘ÖÒðþë£ÏN¨•ò±»S6“ð.IjFÅ÷ÏŽ}0+W>gÕZc*ÒZê_¸[ôÙ µÓýæ_†ÏpIÒø×ÞãMÞ*ÀØêúá³V­5f¡"­¥Îa‰>; v†÷_—²‰ Âç¸$i¼ë_°KôÈ€YÓùÚï‡ÏZµÖ˜…Š´¶l–R¿}~@ít¾þÑø9.Ißæo’ÊìÁèq³£,S¾ÝOÇÏ[¥5e¡"=GÅ­§F¡P;Åç…ÏpIÒøæËègÃU·†ÏZµÖš…Šôõ¾ý¯Ñg(ÔR{ÿߟ㒤ñlrqãjpí‘á³V­µf¡"=Gí=ß}†@-7>Ç%IãW{Ï7û2zÆZï;ÿ>oÕZk*Ò:þë¡,S{É[Ãç¸$i¼ê_¸{ô„€YÕ9è·Ãç­ZkÍBEzž—í}Ž@- ®<8|ŽK’ƨE/Le{Uôx€ÙSS¾çôY…³P‘ž§Î‘}”@=ý”ïúúðY.Iz'ÿsôd€Y5|à†ðy«Ösf¡"=O“[áÉBÀú\¾ø,—$Aó6JÃU·E5˜Uƒ«Ÿ¹JÏ•…Š´wœ}ž@}ÿJe—×…ÏrIR½ë.ûdôD€Y×ûÖ?…Ï\µž3 iêþÕèójkpÙÒðY.IªwÕG3˜uíýß>sÕzÎ,T¤u¨½Ï¯FŸ§Pó¿Rùùðy.Iªg+z’Àì+ú)[¸yøÜUë9³P‘Ö¥‰ Rùø}ÑÇ*ÔVÿÒ}âç¹$©–7=Æ`Ö ï»*|æªõ¼Y¨HëØàêâÏU¨¯A7å;½&|žK’êU{÷_L©FO1˜uƒËŸ»j=o*Ò:Ö=æÓÑç*ÔZÿ’½Ãç¹$©^õ/Ý7z|Àœèžø…ð¹«Öóf¡"­cùö/÷›Q0ƒŽ¿R‘$­s“3crv@´÷ýõðÙ«Öóf¡"­Gû/>[ Öü»$i]›üþ-h„A'eó7 Ÿ½j=o*ÒzÔ?{aôñ õ6,R{Ï·„ÏtIRµËwþ¹©ï߀&Þ}IøìUk²P‘Ö£öþ¿}¾@í ®?&|¦K’ªÝಥÑã æLÿ’½Âg¯Zë”…Š´>Ml˜Êìè3ê­,S{¿÷ÆÏuIR%Ëw~­¿N QºGÿyøüUk²P‘Ö³ÁÕ‡EŸ±P{Åm§‡ÏtIR5\¾ô˜€95ùªËèù«Ö:e¡"­gÝeŸŠ>c`,tùPø\—$Uð¯SŠ^ôˆ€9S>zgøüUk³P‘Ö³|ÛŸJ©èGŸµP{û/MÙÄá³]’T—=ž`N ®=2|þªµÎY¨HÓ¨øþ9Ñg-Œ…îQ>×%IÕ¨½ç›ýòÓ;éKá3X­uÎBEšF½Sÿ#ú¬€±0\u[Êl>Û%Iñ7Ÿ=–`ε÷þ•ð¬Ö:g¡"M£öžo‰>k`lô¾óoá³]’[çF#˜se÷±”ÍÛ(|«µÎY¨HÓlò7j€™+;¦|û—‡ÏvIRP¦á½WF#˜sÅ­§ÆÏa¥õÉBEšfý‹—DŸ¹06ú—î>Û%I1u—.z @ˆÞ™ásX­õÊBEšfCÿgô™ ãcX¤ö^oŸï’¤¹-_´e*¿/z @ˆÉW^FÏbµÖ+ iº-Ø4•½'¢Ï]ÅígÅÏwIÒœÖ?g›èñ1†ƒ©_,ˆžÅj­W*Ò *nZ}ôÀXéþñðù.Iš›ò^R?=bxÏåá³X­õÎBEšAÞõ £5|èæ”ÍAøŒ—$Í~ƒë‰;¦Ñžá³X­õÎBEšAùŽ[¥T–Ñç/Œ•Þiÿ>ã%I³[ç°DÕ]öÉðy¬Özg¡"Ͱá}WEŸ¿0^úyÊw}}øŒ—$ÍR ·Hå#·GO5ùêË𙬴¾Y¨H3Ì—(Àè7>ã%I³Sÿü¢Ç „š|(=ÕšV*Ò kïÿ¾è3ÆRçˆO„ÏyIÒhkïýŽ”†ƒè¡×>“ÕšV*ÒL›Ø0•ÙÑç0ŒòÑ;¦^ >ë%I£ibÃ4\yqôx€pÝþwü\VšN*Ò\ypô9 c©Þöás^’4šz'})z¬@%øÎÈVm³P‘FPçˆ?Œ>‡`<½ÔÞó-á³^’4³ò·JeguôT€jü%~f³ZÓÊBEE 7O©ŸGŸÇ0–Š;ÏŸzMLø¼—$M¯‰ RqóÉÑã*aòM7á³YiºY¨H#ª¸iyôy c«wÊ—Ãg½$izõNúbô€Êèó™ðÙ¬Ö´³P‘FT÷ø¿>`|õóÔÞíÂç½$iýjïöÆTöžˆž"P e9õÌèù¬Ö´³P‘FT¾ýËRÑÇ2Œ­âûçL½6&zæK’Ö±y§áÊ‹£ÇTÆðãç³ÒL²P‘FXqçŠèsÆÚäkc¢ç½$iÝê5?zl@¥ô/^>ŸÕšQ*Òë}çߣÏeo½,廾!|æK’ž»ö¾¿žRÑžP)oüQøŒVkFY¨H#¬½û/FŸË0öŠÛN÷ê/Iªr ·HÇnŽP-Ã"åÛ½4~N+Í$ iÄM¾ ˜]½“ÿ9|æK’ÖÜಥÑc*gxÏåá3Z­g¡"¸þyÛGŸÏ0þÝÔÞûás_’ôôºÇ|:zB@%õW,ŸÓjÍ8 iĵ÷{oôù 0|à†”-Ø,|öK’~X{¯_žú®+àÙ:‡~8|V«5ã,T¤Q7±A*»'úŒ€Fè_°küì—$¥|Ñ–iøàMÑcª©è¥lÑ ÃçµZ3ÎBEš…—ï}L@3”eê|ý£á³_’ÝÄipý1Ñ*«¸ã¼øy­4Š,T¤YhòÁ07Ê'îOùâW†ÏIjj½ïü[ô(€Jë5?|^«5’,T¤ÙhÁ¦©ì>}V@c·œ’²‰ ãï’Ô°ÚûÿÆÔkL€µëøþð™­ÖH²P‘f©Á ÇFŸÕÐ(½3þ;|þKR“šüëÀòñ{£¨´É_ºÎæo>·ÕI*Ò,Õýæ_FŸ×Ð,Ã"uþÝð;€$5¢…›§áÊ‹£O~¨¼â¦âç¶Ò¨²P‘f©|Û—øÓw˜ceö@ÊwüÙð{€$ý—Ð_ûè#j¡»üsñ³[iTY¨H³ØäûÜ€¹UÜqnÊæm~¤q­ÞÑG=ÔF¾ókÃg·Z#ËBEšÅºÇÿ]ô™ Ô_±8ü Iã˜ÿÆ€u7¼ÿºðÙ­ÖH³P‘f±|û—¥4DŸÝÐÙ V:ývø Wk¤Y¨H³\÷Ĉ>» ±ÊÇïõ%õ’4Ãòí_ž†«n>Ò VÊîc)›ÿ‚ð9®ÖH³P‘f¹|ñ+SÑg84Vq×…)[°iø@’êX¾íKÒðÞ+¢r¨Á ß Ÿãj< i*î8/ú €F\uhø}@’j×Â-ü· LS÷ø¿‹ŸåJ£ÎBEšƒz§|9ú €ÆëúáwIªM 6MÅm§GÝPOeéÕÃ[g*Ò”ïôꩃT–©ûÍ¿ ¿HRå›·Q\Lô© µ5¼ïªøy®4Y¨HsÔpåÅÑg9PôRç…ß $©²Ml˜×~#ú´€Z럻müLWš,T¤9jò5#@¼²³:µ÷z{øÝ@’*×ÄipÙ~ÑÇ4Ô^ç€ßŒŸëJ³‘…Š4G廾>ú,~¤|ôŽ”ï¸Uøý@’ªTÿÂÝ£g¨½²ýHÊæm>×Õš•,T¤9lxïÑg:ð”÷çÛ¾$ü~ IáMlúí},ÀX\·,~¶+ÍV*ÒÖ;ý«Ñg:ðÕ¥|Ñ–áwI ýú+Š>Ž`ltû›øù®4[Y¨HsX{7EŸéÀ3·žš²ù›„ß$iΛ¿I\tô1 ãcX¤|‡WÄÏx¥ÙÊBEšã†÷_}´ÏPÜt‚÷KjV 6:û€Ñ)î8/~Æ+Íf*Ò×;k^ôÙ¬ÁàÊC¦¾G ú® I³]¾Í‹Rñýs¢];½oÿkøœWkV³P‘æ¸ö¿}¶kÑ¿tKIc]¾ÝO§áÝ—F·0–ò]_>ëÕšÕ,T¤€†÷]}¾ka©"i\ËwüY¯ €Y2ù¼/zÖ«5ëY¨HõNûJô<‡ÁåXªH«Ú{½=•«ïŠ>^`lõΜŸ÷jÍz*R@ùίM©,£Ïyà9XªH—:‡þÏTv‹>V`¬µ÷úåð™¯Ö¬g¡"5\yQô9<¯ÿ’T÷z§üKJÃ"ú8€±6\ukøÌWkN²P‘"ÿè¼Á5G¤lÞÆáwIZ¯æm”ú/‰>B ú+vŒŸýJs‘…ŠT¾ãV~S j¢¸iyÊl~¤u)_´e*nþVôÑ ÑÞÿ}áó_­9ÉBE ¬øþ9Ñç=°ŽŠ[¾²…›‡ß$é¹ÊwzuÞwuô‘ Q>ñƒ”Ml~PkN²P‘ëžøÑg>°&"߯½YR5ëúáTfF•Ð(ƒË–†ßÔš³,T¤Àòí_žRÑ>÷€õ0¼ÿº”ïôšð{„$=ÙÄ©wÚW¼Rt¾öûñw¥¹ÊBE ®øÞw¢Ï}`=•Þ‘Ú{¾9ü!I“¿¤UÜzjô±TvMÙüMÂïjÍY*RpÝã>}öÓP¶Iß~—ÔÜÚKß=µàb ®9<ü> Öœf¡"—oóâ”èó˜ŽA7u—}*ü>!©yu—>¥¢} @£uü“ð;Zsš…ŠTŠ›–GŸÿÀt ‹ÔûÖ?…ß'$5£|Û—¤ÁÇEŸ|@¿²E/ ¿¨5§Y¨H¨{̧£G0Cý;N}1tô½BÒø6ùšÁÿG<kpñáwµæ< © -Ü"¥^=€ÜðÍ”-Ø,þn!i¼Z°Yê¯X<õq@5túÓø;‚Ò\g¡"U¤ÁõGGÏ`ŠÛÏšz%OôÝBÒxÔÞ÷×Òð¢6à)Êîc)[¸yø=A­9ÏBEªH#þ0z#2ùð³½ÛÃï’jܼSï̉”Š~ô‘<Ãàê¯Çß”"²P‘ªÒü¤2(z#R¶W¥Î×~/þŽ!©v廾!wž}ŒkÑ9ì#á÷µB²P‘*Tÿ’½£ç0JÃAêòåð;†¤š4±áÔ™‘úíèÓ X‹É_ˆžüÅèð{ƒRD*R…jïÿ¾è™Ì‚ÁU‡¦lááw IÕ­½Ï;ÓpåEÑÇð<—í~oP+, ©b º9z.³`øàM©½ä­áw IkÑ SÅâ©¿hª¯sÐoÇß”¢²P‘*Vï¬yÑs˜%e÷ñÔ=úÏÃï’ªQçð§rõÊè£ XGåã÷N½¢3ú¡VX*R¿€2•eô|fQÿâ%)[°Yø½CRLí=Þ”ŠÛN>Š€õÔ¿p·ð{„Z¡Y¨H¬¸ë‚èù̲á7¦öÞ¿~ï4‡-Ü<õΚŸÒ }ÓÐ^ú®øû„Rd*Rëžø…èùÌ…~;õ¾õ)›Ø üþ!ivëù'i¸ê¶èS˜¦áª[Ãïj…g¡"U°|»—¦4èFÏ `Ž7Ÿœò· ¿ƒH}~3w]}Ì3Ô?g›ð{…ZáY¨H­¸ñøè9Ì¡²óhê.ÿ|øDÒhjïñKipý1¾ÆD{ÉÛÂïj…g¡"U´Î‘='€Å-§¤|§W‡ßE$M¯|û—§þE{¤4D'Àˆ pmøC­Jd¡"Uµù›¤²½*z^ÊüáÔ=îo|·ŠT£òm^”úç,J©—E!ÀˆõNÿjø]C­Jd¡"U¸þ¥ûFÏ Pñý³S{7…ßI$=G 6K½“ÿ9•ÙÑG0Ê2廼.þΡT…,T¤ ×>àD ZÑOý‹S¶`Ó𻉤Ÿ”/Ú2õNùr*»'ú”fù—œ¢ïjU& ©â º%zn0|ø{©søÇÃï&RÓ›|µWï´¯L½šÝcÿ*üþ¡Ve²P‘*^ÿìÑs¨â¶3R{É[Ãï(RÓÊwø™Ô;k~*;FÀ){OLýUjô=D­Êd¡"U¼önoœzW#À“Š^ê¯Ø1åÛ¼8ü®"{ùN¯Iý‹öL©ŸGÿäslpÅAáwµ*•…ŠTƒŠ;Ξ@•ÙƒS_†Íß$ü¾"[í½ÞžW8µÀš©sào…ßIÔªT*R ê÷7Ñó¨°rõ]©»üó)›Ø0üÞ"Õº‰ §¾«hòÕzþJšmò; ³‰ âï'JUÊBEªC ·He÷±è9TÜðžËRç°?ˆ¿»H5+ßþå©wúWS¹zeô1P½3þ;üŽ¢Vå²P‘jÒàòý£çPÕOý–}ôýEªzí}~õ‡÷lßå;n~gRÜ÷ tùPê5/·‘R¿ý/àÙúyÊ·{iøÝI­Zd¡"Õ¸ö>ïŒ9Ï«|äö©×:M¾Þ)ßæÅáw(ÍNùâW¥ÎáOý‹Sqçù¾¨…Á•‡ß£ÔªM*RÍÞsyôÜXwEoêKÇ{gÍÿá.Ü"ü>¥i4±Aj/y[ê.ÿ|\ýõ©¥@µ÷{OüÝJ©.Y¨H5oòUµ^°ÜuáÔ_5tÿXÊ·yøýJÏ.ßåçSçÈ?Nýs¥â–SRÙ^ý/`Ɔ÷^~ÏR«VY¨HãðåôG£çÀÈLþGÊàºe©÷Kß?uß ¿s5¥ù/Hí%oMÝeŸúá«»n;=•ùÃÑÿ$fE÷„ÿÿRªS*ÒÔ¿xIôü˜=Ã" º9 ®?&õÎø©sÄ'¦þb"úVëæmœÚ»ýÂÔ_Lþïtr5¼ÿ:ß{4Æä/(ûÅeë™…Š4M¾¿ ‰ÿ<¼ûÒ4¸ú°Ô;ã¿S÷¨?Kí½Þž²›†ßÏ*ѼS¾ëRçЧ޷þ1õ/Ü=7Ÿœ†Ýbq4Þä/(‡ßהꖅŠ4&w®ˆžCÕP–©|üÞTÜuA\sDꟻ]ê.ÿÜÔbaòQòí_~w›qó6JùŽ[¥öÞï˜úî™ÞI_Lýóv˜úŸ·¸óüT®^9õ—=¬ÙäkNÃïtJuËBE“ºÇ|&zÔÇ ;µt®¼87-OƒË˜úÎÞiÿ9õ.íî‘’:ÿnjïûkSå‘ïø³)ßî¥)›Øp¤w¸|›§|»ŸžúÿcrÙÓ9ð·¦^iÖ=ö¯Rï”/§ÞYó§þ²dpÍáSßg2ùZ®ò‰ûS*‡Ñÿ¨­âŽsßå©UË,T¤qiÁ¦©ÌŒžGã¯è§²ýÈÔb£|äö'>ü½4¼÷ЧõÔÿû©V¯œú;¹Ð F÷迈–§TÇ,T¤1ªþNÑó*kò’}çž²if¡"QíÝÞèõ°ýs· †§Vm³P‘ƬâÖÓ¢çTOÑKùŽ[…?¿S«¶Y¨HcÖä¨O7¸êÐðgwjÕ: iÜš·q*»'z>@¥´÷ygü³;¥:g¡"aý³DÏ'¨Œâûg‡?³S«öY¨HcX¾ÓkR¢çTBçˆO„?³S«öY¨HcZqÓ Ñs  þ^Ê&6 ^§Ví³P‘Æ´Î!ŠžU®wҗŸթ5Y¨HcÜð×FÏ+S¶Iù¢-ßө5Y¨Hc\wùç£g„韷Cø3:µÆ& iœ[¸y*ó‡£ç̽¢Ÿò.þÒ¸d¡"yý‹£G̹Áµß6§ÖXe¡"yùN¯žÚÆè¼üÔ IDAT@“´÷{Oø³9µÆ* © nøfôü€9Sܹ"ü™œZc—…ŠÔ€:¾?z†ÀœéùÇáÏäÔ»,T¤†4¼ïªè9³®|äö”ÍÛ(üyœZc—…ŠÔºÇ}6z–À¬ëôÅðgqje*RSZ°i*Ÿ¸?zžÀ¬™|þ•-Ü<þYœÒ8f¡"5¨þ9‹¢gÌšÞiÿþ N­±ÍBEjPùŽ[¥Tô¢çŒ\ÙYòm_þ N­±ÍBEjXƒk¿=Û`ä&ßÎýìM­±ÎBEjXí¥ïŠžm0Zý<å;üLø³7µÆ: © ï¾$zÄÀÈô/Ü-ü™›ZcŸ…ŠÔÀºÇ|:zÆÀh½”ïôšðgnj}*R›·Q*¹=zÔÀŒ ®80þy›R²P‘Zžu03Ã"µ÷xSø³65# ©©-Ü"•ùÃÑ#¦mpݲøçlJMÉBEjpýs¶‰žy0mí}-ü›ZÉBEjpù¯H©ßŽž{°ÞŠ›O¾¦V£²P‘Þà²ý¢g¬·Î¿þlM­Fe¡"5¼É/íJå0zþÀ:+î\þ\M­Æe¡") n<.zÀ:ëòÁðgjj5. I©½ôÝÑ3ÖIqçùáÏÓÔjd*’¦šü3I¨ºÎA–¦V#³P‘4UçˆODÏBxNÅm§‡?GS«±Y¨Húa¤á7DÏDX«öþï‹ަÔÔ,T$=Y÷ø¿‹ž‰°FÅÍ'‡??S³³P‘ô“æ¿ •Ý=àéÊ2µ—¾;þù™R“³P‘ô´z§}%z<ÀÓ7þÜL*-T$=µ|›§²³:zFÀOþ:eï_ n&•*’žYÅâè1 S×- ^&e*’ÖT¾ýËSÙ{"zVÐtÃ"µ÷|Køó2)³P‘´¶úî=.h¸Á5‡‡?'“²e¡"iå‹_•R¿=3hò_§ìñKáÏɤìGY¨HZkýK÷‰›4ÔàʃßIÙS²P‘´Öò_›RÑ‹ž4MÑKù.¯ >&eOÉBEÒs6¸âÀèñ @Ãô/Ú#ü¹˜”=# IÏY¾ëR¢g( QvOù¯.&eÏÈBEÒó6¸ú°è9 @CôNÿjøó0)[C*’ž·ön¿Ò°ˆž¥Œ¹ò±{R¶p‹ðçaR¶†,T$­SƒëŽŠž§Œ¹îñþLÊÖ’…Фuª½ä­)•Ãè™ À˜>xSÊæmþLÊÖ’…Фu®¸ñøè¹ À˜ê|ý£áÏ¿¤ì9²P‘´Îµ÷ygJe=[3Åç†?û’²çÉBEÒzUÜ|rô|`œ”ej/}Wøs/){ž,T$­WíýÞ=b#ƒk¿þÌKÊÖ! Ië]ñ½ïDÏYÆAÑKù®oÞ%eë…Š¤õ®½ï¯û.f¬Á®áϺ¤l³P‘4­Š›Nˆž·ÔXÙy4åÛ¿,ü9—”­c*’¦U{ÉÛR*‡Ñs€šêö•ðg\R¶Y¨HšvƒkŽˆž»ÔPùè)[¸yøó-)[,T$M»ön¿RÑž¿ÔL÷¨? ¶%eë™…Š¤5¸âÀèù @ß?;ü™–”M# I3*ßéÕ)õÛÑs€:©½÷;ŸiIÙ4²P‘4ãúí=ЍþÅKŸeIÙ4³P‘4ãò~&•ÝÇ£ç1V¶W¥|û—…?Ë’²if¡"i$õÏÛ!z&PaÝÿ!ü–”Í I#)ßö§RÙ~$z.PAÃû®NټŸaIÙ ²P‘4²zgNDÏf*¨sП]IÙ ³P‘4²òE[¦2{ z>P!ƒk n%e#ÈBEÒHë}çߣg4UÑo§|—Ÿf%e#ÈBEÒh[°Y*»;zTP½3·Ž^%m=š,T$¼î‰_ˆžÕ›|ø<ùË·ÑϪ¤lDY¨H}ó6JÃnˆžÙê|ãâŸSI[. I³RçðGÏl‚·þ|JÊFœ…ФYkrpÐ0ƒnjïùæðgSR6â,T$ÍZí}Þ™R9ŒáÌ¡ÞYóŸKIÙ,d¡"iV\sxô `Ž þž/¢W×,T$ÍjùN¯I©ŸGÏræ@ç…?’²YÊBEÒ¬×_±8z–0ËWþJÊf1 I³^¾Í‹R™==Ó˜%e{UÊwxEøs()›Å,T$ÍI½S¾=ט%Ýãÿ.üù“”Ír*’æ¦ù/HÇn‰žíŒXqçù)›Ø þù“´õìf¡"iÎêù'Ñó€Q*z©½ä­áϤl*W¯œúgo¡"iN*îº zÌ0"ýs· Þ$esTùÄýSÿî[Ù¶/ ÿ0’Æ¿ö~ïI©,£g=3T>zGʽ0üy“”ÍQegõÔ¿ýV¶Ã+Ã?Œ¤f4¸þèèyÀ uÿXøs&)›ÃÒ 3õo¿•íüÚð#©廾>¥A7zæ0MƒëŽ Æ$es\*‡Sÿþ[ùî¿þa$5§þù;GÏ}¦¡ì<šò· ¾$esÙüMžühå{¾5þIjLù6/Jåã÷†Ö_÷¸¿ ¶$esÜäñÇZùÒw‡ Iͪ{ì_‡ÖOqË)áÏ”¤, ö^¿üäÏA«}èGÂ?¤†5±A*î\z `Ý”Õ)ßùçâŸ)I[Ï}ƒçÉŸ…Vç˜ÿþ$5¯ö>¿šÒ°½ ðüºÇÿ]ø³$) ª{ÔŸ=ù³Ðêžò/áHR3\¾èe€çVÜzêÔÛF¢Ÿ#IYPÝåŸòç¡Õ;{Qø’ÔÌòí~:•ùá—Ö¬ì>–ò_þ IÊ럳èÉŸ‰VÿÒ}Ã?¤æÖûÖ?†^ X³îòÏ…?;’²à×þäÏDkðÝo… I nÞFiøƒkB/<]qû™^õ%mÝJÅ]>ùsÑ*î¿1üIjv~3¥² ½$ð#½,廾!ü™‘”U òñûžüÑh¥^Û¦QRxƒk ½'ðCÝ¿þ¬HʪЂ͞ö‹à­Éÿ#ÛáñLR£Ëwzu*{ODÞÏ«¾¤Ö“µ—¼íi?S •|é{Â?˜$õNÿjÔ]€^–Ú»½1ü‘”U¤î1ŸyöB¥sì_‡0IÊæo’†Ýueh´ÞI_Œ>$m]úçíðì…Jïü]Â?˜$MÖùúG£î åU_RëY7Ÿüì…ÊàÖÓÃ?˜$ý¸âæoEݧl¯šú~ÛègBRV±ÊÕw={¡2|âð&I?.ßåuSïì`öu—}2üy”U¬|û—=ëgej¡2)ÛááP’~\ïÔÿ˜ë»@ã ®úZøs )«`#>±ö…JçЄ@Iz²y§á}WÏõ 1ÊG¾Ÿòm^ÿHÚºú_Hÿ´…JïìEáP’žZ{é»Rs}—å0uú@øó)«hÅ]¬}¡2¸ýœð(IϬÑžs}{ýsü‚½”­­›¦4è¬}¡’zyzbÞÆñT’žR¾Í‹RùØÝs|¥_Ã{.KÙü„?÷‘²ŠÖ9ðýküÙùÉB%¥”/}wø•¤gÖ9ücsuŸo½,µ÷ø¥ðç=RVáúçnûü •îwþ=üƒJÒš*n<~®®c«»üóáÏy¤¬â ï½âù*ƒ[Ïÿ ’´¦ò·Jegõ\Ý-ÆNqÓòðgœ^RƒÞúë‘»÷ôw€FéÿÎâ÷2R«uÏú㉞µtP‰A/ZÇ<·ø&I >½õ°BŒß±£ô}ŒÔjh£;¿ºÈƒJDô¯:¢ø&I mð½Sv÷w€Æð¹)Òv»ÎÇ^9ñÌ^РRµ·Åܺ‹’´Ú‡õÃwíîï"S¯î</*~#µÚðæÏMüÜ-hPë]úâ_ $-´î'þÈ[³©®¢ûé7¿‘Zþë”jé•jÇÖ˜;lÿâ_¨$-´Áu›øP˜vý+?RüÞEj5¸Ñm_Ü­goÁƒÊXïÒÿB%iÁ­;0ªŸÿp·G€i4ºýâh­Þ«ü½‹´ª™uNyÍn¿³ÍDƒJµóŸ¥"©QuÏú9Qw·T"bøÃË‹¿’4iÃ[Îßãƒ`9Ôßí#ŸYü>EjzÃ|fQžÉÝTÆ:Ÿùóâ/„$MRûÈgD½ýÞE9@–Ì “_Uü.EjzÝOýÙ¢=–{4¨Tß­Ã*þ‚HÒ$uÏxcD5Z´ƒ`±õ.|Oñ;©ñþäù¿ôšŠAe¬í¦ò/Š$MØøÃܦÑà;Ç¿;‘f¡Áu[Ôgs•¨ªèl~}ñF’&jí£ºï{‹r,–Ñ–K}½´jÏëžyHD]MÙ 2~ȶ%æÖ>©ø $I“Ô>þ…Q÷v,Æ1°Çªoöú§¿3‘š^{ýÓ£~äîEFePëëØâ/’$MÚøýHJ«çˆö†ç¿+‘f¡á-ç/ÉsºhƒÊü[uhñJ’&mxÓÙ‹vLlØÎæ×¿#‘f¡ÞEï[²Guñ•ñ¦²ck´Ž|VñL’¦áORu½óÞQü~Dš…:›^Ño5cPn¹,æ¦à…“¤Iêžþ†ˆj´ØG"À. ¾±®ø½ˆ4 µxÊüç-¥ETÆz—¼¿ø‹'I“6øÆaKq$üJÃÿ9/Z«÷*~'"5¾Õ{Åè¶‹–ü™]’A%FƒèœñÆò/¢$MÒê½ctçåKr,ü¢jëÑZw`ùûiêmÕ²<·K3¨ÌžÊO£uÌóŠ¿’4Ií£ŸõŽŸ,ÕÑõŽû¢}¬»S©µu?ý戺jö 26ºç»1·v¿â/¨$MRgók#Fý¥<€•jЉΩ¿WüþCš…:{eÔÝíËöø.é 26¸áŒâ/ª$MZÿ+ÿºÔÇ#°ÒÔUtÏþËâ÷Ò,ÔÞðü¨wn]ÖGxÉ•±Þ*þâJÒÄduë–ãˆVˆþåÿ^þÎCšÚëŸÕƒ·,û3¼,ƒJÔutÏ{GñY’&©½þiQm»sYŽI`¶ ¾wJñ»i&Zw@ŒîºªÈs¼<ƒÊØh³-ÿbKÒ„ïÃö²•ÀìÝ~I´Öì[üžCj|k÷‹Ñ–/{–—oP‰ˆªóH´O~uù]’&¨wÑ{—ó¨fÈèžkæÿG}éû ©ñ­Ù·ø[ô/ë 2VµŠöI¯(ÿâKÒ oú9Åï5¤Æ·zïÞtvéGzù•±jçýÑ>á%å¿ ’´ÐÖÕý7•82€ªçîöñ¿UþNCjzköá>Ó È 2Vm¿/Z^Pþ›!I ¬sÂK¢îí(ul Q÷vFç”ß)~—!5¾ÃöÑíÇ´(6¨ŒU;~íM—ÿ¦HÒë~ö/"êºäÑ L³Ñ ºŸ|Sñ; ©ñþäý芘&E•±jîÁhŸüªòßIZ`ƒk6–>:€iT×Ñ»ð=Åï.¤¦×>êYQÝw]L›âƒÊXÕy$Ú›_Wü›$I j;1ºûêÒG'0eúW|¨ü½…Ôð:_ÕC[bMÅ 2¯×ŠŽ?…“ÔÚÇýúü‡ËŒ ¯?µø}…Ôôºgug[L«éTƪQô.yñoš$-¤Îæ×E {¥ON °Ñ–/Í¿£Eé» ©ÉõÎ}{İÓlº•Gõ¯>>æVíUü(IY½/þCé#(¨º÷Úh­; ø…ÔØÖ>ñÿ>³¸®cÚMå 26¼õ¢˜[w`ùo¦$% ¯?­ô‘ P=ps´|fñ» ©©µ}^£>«xj•±Ñ϶D{ÓÁÅ¿©’´ËÖ>1F?þfé#XFÕ¶;ç/ƒ‹ßKH ­{Æ£ÞùÓh’©TƪîŽèžóÖâß\IÚUícžõŽŸ”>2€ePo¿7Úž_ü>Bjdköþ××FTÃhš©TæÕuô¯þhÌ­Þ§ü7[’§Îi¿?õœ왺õ`tN|Yñ{©‰u6¾(ª{¿MÕŒAåQ£{¯‹öÆÿ¦KÒãÕ»àÝ¥J`‰ÔÝG¢óñW¿šXï¢÷FÝŸ‹&kÔ 2¯×ŠîEï+þÍ—¤ÇkðícJŸ”Àbë·¢súë‹ß;HM«½á1ºã²˜ÍT5¼íâhõìâ? ’ôÿZ½wŒn¿¸ô1 ,–a/ºŸüÓòwRÓ>+å+ÿ2?FΊÆ*cUëçѽàÝ1WúC’~©öáEuÿM¥I`OUÃèóÖâw R“êœòš¨¶Þ³¦ÑƒÊc†w}+Ú>JÒ”ÕÞðü¨ç(}D»«®ç?÷¡ôƒÔ”ÚGýZ ®=1¢Å,š‰Ae^¿½+>sk÷+þC#IÕ=ý ó 4OÿÒ¿[Ѻ¢å‡ÿ¡ó+gPyTµí®èžó¶ò?@’ôh½ ßSúh&ÔÿÚªâw ÒÔ·fßè]øwQ?rw¬37¨þ…óCcÝÛYú +kPùÃ_O¿%æ¦à‡RÒʪ³ñEQ·~Vú5¼a³1Ez¬Ãž½ÏÿUŒn¿$¢•~<§ÊŠT3ºÿæè^ø÷1·îÀò?¨’VLÝ3ÿ bÔ/}ÀŠ7¸îdcŠ4þOÀ§þîü_jÕm¥Ë©µâ•ÇTÝóoÖ9ëÐâ?¸’VF½sÿ:¢®K°b o8ݘ¢]礃£ÿõµQ=tGéDZ *óW+½/ÿs´Žûâ?Ð’f»þ×V•>ò`E^ª1E+¯ÃöîþI ¾³ÁçüîƒÊ®ÔuŒî¹6z—ý“qEÒ’5þX>ÃëO3¦he´z¯èœôŠè_öÁÝñåˆA»ôã×h•IÆ•{¿ý¯¯‹öi¯¹Õ{—$ÍFkö‰Ñm_,}ÊÀŠàm¾4ÓþäùÏîí_ù‘ÝqYÔ‡K?r3Å ²›Æ?ˆÃ›ÏîEï‹ö¦—Ç\éER³[w@Œî¹¦ôÑ3møý3¢å?JkZ»_tN|iô>÷¶|ã°ÞrAT?ÿaD5*ý˜Í4ƒÊb,·)zW|8:gþa´Ö?£üC%©QµzVT?»½ôq3ixã'Œ)šúÚëŸíþft>þêèžuhôÎ}{ô/ùÇ\uD ð™Ý}uÔ;~QW¥©É ²„ªí?‰á¿ýoÝóÿ6Ú›_­cžë¯Y$=ní /ˆzçOK_0sêîöùÿ-M[1ì–~W pHYsèèµ{Rk IDATxœìÝ{¬¤u}Çñ].‚€ Å*TªØZ£µmPÓªMM5µ¶Æ´U£©E›hª¶jkÕDjÌÞÙ…¹ ‚B‘r¹ ¸DTDØÂºÂ¢+÷Û »ßûbég/7zü§ÑZõâòïÕ%i[[±W´ŽMtÎzwô®^:uf¾åì|Ë:³Ï 4 F›îþš³£{é¿Eë„×Eµl·òO4©I-~V þçœÒOe£ŸÝ­Ãö-ÿž]’f£e»EëÄ×G÷ÒGÍ9Qoº·ôe7%ƒÐ ¨ÛýOˆÎ¹Du¸ÿ­!mSKw‰á_+ý´€±S?ò£hºOù÷î’4­Ú/:ç¾7úßûbÔß]úœ‚Ahk û1øÉ7£»úÀŸôÛÂùåŸR‚ZËŸà ו~†ÀتY­•{/IsÞª—L}*×àÎ+"úÒ—ãF2=]õ`êÖ9ï}Q-{Nù¿”¬ÖÊD}ÿÍ¥Ÿé0öê×Dëཊ¿——¤b´ûÔYý`íŃnéËrc„~zƒ;VGçü÷Gµü¹åäRÒZ«ö‹úÑ;J?ã 1êû¾?õI¥ßÓKRñ–ï þ)믜:ÓçÿfšÆ–/¬ê]{ÈÔg0KÉkýòù PغQhÅžÅßÛKÒØtè §¾ê¥~lCéKôX2ýê_­½8Úÿõ¶¨m_þ+M@íãöQõpég?4Öð§×GkÙnÅßãKÒXµh‡hŸþw1XwYÄhTúR=6 BýNôoþr´Žzyù©4AµMŒZ–¾@ã 7\Õ²]‹¿×—¤q¬uÄïFï[GFôZ1é&vª7?Ý+DµÂðIs]çKoˆQwSéˤ1\ETKv.þž_’ƶCž½kŠºz$&ÕÄ B[~Ù[>C°ZºKù 4uNúóõž(})€t†w®ŽjÉNÅßûKÒX·l×è®þ¨[cÒLÌ Tw6EïÚC¢:h÷ò8iBëœúÖˆ~»ôåÒ®½0ªÅ;?¤±oÙnSt{´Oý«â Ió¢{Þ{#êAéËLœþ7*~. IM«ýŸÃo‹Œr B½*º_ûdT‹¶/þ ‘4/ºÿsÄhTúÊ«wÙ¿?¤Æµd§è]½4bë+0Ò Bƒ_­#¯üEÒTÝ‹>1ªK_`²FѽàÅÏ $©‰µŽye ï¾!²hü T·6Fçü÷Gµp~ñ‡¤Ÿ×»ä#þ2ÆÅ°ÓÞVü¼@’Ù¢í£{ù'§>¡¬é= Ö_Õ¡/,ÿ€ô‹º}Øã¦ßŽÎ—ÞPüÜ@’šZëÈ—ÅðÞ›¢Éš9 zѽjqT ·+þ ôË|gŒ¯Qçñh÷ªâç’ÔØíÝ«EÔÃh¢Æ BÇÖFË?\ÒØe €ñ7ªŠöQ/+~Ž IM®}ò›¢~üžhšF Bý[ΈjÙ®ÅÙ’ž\ïòOƒ !F?»+Z‡îSü&n¸î«Q-Þ±ø9ƒ$5½Öç÷zÓx¯ÐØBƒ;VGµì9ʼn’žZ÷‚DŒêÒ— ` n9=ª…Û?o¤Æ·rŸÞ÷ƒWc9õnø|T‹¶/ÿË“ô”º_ùGc$Ó¿~Uñ3IÊPkù1XeŒ£ñ„ê:º—ªø/LÒôuÏùûˆzXúJÌ‚ÞWÿµøÙƒ$¥hñ³¢ÿƒScÜŒÏ T¢sþÊÿ¢$M[çÌwD û¥¯ÀlÕÑ9ãíÅÏ $)E çGï[GÆ8™76cÐyï+ÿ ’4mSÿ:bÐ-}¥f[¿í_Wü,B’²Ô»zYŒ‹òƒÐ mÿó@Û:§üeÄ SúJÌ‘Qõp´?÷Òâg’”¥îêc”„úhŸò–â¿ IÓ×9ùMSÿ3˜,õÃk£µbÏâg’”¥î• &xô¢}Úßÿ%Hš¾ö ¯Qws±KPÖpÃ7£Z²Sñ3 IÊRïÚ•8mùΠsÞSüΗ4}ícÿ0FíE.Àø¬9{ê‹ÑKŸUHRŠÎþw¿0AƒP]Gç–¿ã%MÛ–Ïm¾Î/ Àxê_³¢øy…$¥iávÑ¿åŒÉ„º—}¢ü.iÚZ‡¿(Fÿt®/ À˜ë^ô¡âç’”¦Å;ÆàŽÕ¹¡þ'”¿£%M[ëߌúáÎå%hŠzÓ}¸$U3Të çÄð[sBƒu—Fµh‡âw²¤§ÖZ¾GÔ÷ÿ`®.@º›£}ÜþÅÏ1$)K­UûE½ù\ƒÐðÞ›¢Zºkñ;WÒ4-Ý%†®›‹KÐp£Í÷M}ä|ñó IJRëø×DôªƒP½é¾¨Vî]üN•4MKvŽá]_ŸíËHýàš©O)~®!IIêœó ¡A/Ú'þiñ;SÒ4-Ú!†k/šÕKÓpý¾B’Ì\½ïÓìA¨{ÉG‹ß‰’¦iáüÜtÒl>ý€äú7[þŒC’²´xÇÌòW{ÌÚ Ô¿ù´òw ¤iësål=õ€ Ò½ø_ŠŸsHR–Z‡íõ5k>pkTKŸ]üΓôÔz—r6žöÀ$ö£sò‹ŸwHR–Ú§¼%¢®2õ;Ñ:öŠßi’žZ÷Ü"F³s1&Ó¨½1ÚŸ{iñsIÊRï[G5cê^úñâw–¤§Ö9åÍÃÞL?å¢~xm´–ïQüüC’R´dç>°f¼¡Á«§¾¬¾ø%éIµOxmD¯šÉ§;À“ tyT‹¶/~"Ij÷ªˆAw<¡ºz8ª•{¿“$=¹ö1¯œúÓm€ÙÖ¿öâg!’”¥îŸÏA¨sîÅïIO®uø‹b´éž™zšüz£QtÏ{oñ3IJÑâcxÿ-ã5 Ö]VþŽ‘ô¤¶|noýÀ­3ñxú©¯/}6"IjŸð'õpL¡îQ­Ú¯ø"éWZü¬ÞuÕŒ\$ž©ÑDë°}ËŸ‘HR‚z77ƒP÷’¿3$ýJ çÇà–Ófä°µêû¾ÕÒ]ÊŸ•HRÃk´{ÔßSvÞscT ·+~gHúeýëØæ ÀLÜzæÔ^-}^"IUÃëœ{@ÁA¨®£ýÅ?+~'Húe½K>²Í€™Ô»ò³ÅÏL$©ÊðÉP®/3õo9½ü éuNÿÛûr1€3E÷ìw?;‘¤ªáµO|ýÔëÌí Ô«¢ò¥pÒØÔùÒ"­¾̦Qws´ùýâg(’T5¼þm_™ÛA¨{Õââ7ZÒÏkýе7nõE`.Ô¬›úbôÒg)’T5¸öç^1èÎÍ T?ñPTKw-~£%Í‹Öʽcô؆­zò̵ÁíçO}Fé3Iª\ÿÆçfê^þ©â7VÒ¼¨–>;껿³UO|€Rzÿ}`ùsIZÐÜZ«^¼U%ôŒ¡zÓ}Q-Ý¥ø•&¾…óc°æ¬gü„(®FçËo)¾"I š[ÿ¦“fwê^ò±â7RÒ¼è_wØ3~²Œ‹QõP´Û·ø‹$U ­uÄïD û³3ÕßÕ’ŠßHiÒë^øÁ­y0V껿Õâg?k‘¤ª¡õ¿Êì B¾;H*_çä7F {[ó `ìôoø|ñóIªZûØ?ˆ¨ë™„êΦ¨Ú½ø“&¹öѯˆQç±my0vºç¿¿ø¹‹$U mðãoÌì Ô»îðâ7JšäZ?/êwnËk+€ñ4èDûøW?‘¤ªuÎ|Ç BÃ~T‡ývñ%MlKvžúL]€¬Fý$ZïUþF’4¬EÛG½qýÌ Bý[Ï*ƒ¤Imáü¬9{&^WŒµá/™: )~#I šUoõ§gfjŸüÆâ7FšÔz__4¯§¡wÕ‚âç1’T5¬ÖÊL}ÚÛ6 BÃGï´ÊK…êžùΈQ=“¯©ÆÛ¨ŽÎ©o-~.#IUÃüð«Û6uWºø&±öqûGôª™|9УöÆhñ’âç3’T5¨îÙïÞ†AhØ‹êç¿Ò¤ÕZ¹wŒ¿{†_J4G}ï÷¢Z²SñsIªšÒ’¢n=ºuƒÐà¶óËßiÒZ²sÔwg6^G4JÿÛG•?«‘¤Í©ÿÝã·nêœõ®â?¼4i n:i6^?4Ïh3Þ^ü¼F’ª†Ô9åÍ[1õª¨–íZü‡—&©ÞŸ™¥WOÍ4jÿ,Z«^\üÜF’ª&´xÇ_û±qÓBý[Ï,ÿƒKTçÔ·FÔÃÙ|ýÐHõ=7Lr–>¿‘¤ª n>õ™ BmŠ)ÍYíc^£îæÙ|ÝÐhýk–?Ѥªmù¨Í§=ÕÝÍS_l_ú‡–&¡ÖòçFýè³ýš  ÙFõÔwc”>Ë‘¤jÜ[ºKD¯õô¡Áí–ÿ¥Iháv1\wé\¼dh¼QõP´ݧü™Ž$-Æd“ IDATï†ë¯|zƒPç¢ÿa¥I¨íÁsñZ ᯎjÑöÅÏu$©ãzW|æé BÕá/*þÃJÙëœùŽˆÑh.^'¤²å ³ôÙŽ$Uc\û üÿBÃo+þƒJÙkýŠu7ÍÕk$€ÿeïÎÃíªëCÿï0 ŽˆZ[§Š•Öáñ^k«öjíd«·Zïm«­¶rí¯½µ¶~­r2 a„0†AæA óŒ ó†°Öž×úÞçì´$„ çìÏÚ{½^Ïóþ«OŸçHrÖç›ï眽ÒX)z©uÈGÂïx$)«j³6Oeó©u/„:—íÿ…Jc\>o»TøI‚ôZ©¹ß{ãï‰$if|Åc7?!Ô<òw¿(iê^º ò¸@J©xp¹w¦KÒÌFêßrÚóBùÞ?þEI£^ëØÏ¤T–‘gþC÷¢]Âï‹$) ®{ÅâgŸ‹TôS6gëð/Jåò=ß’Êü‰ÐCÏQ©uØÇÂï$) ¬óý}ö±Ø(VÞþI#Ýì-Sÿ¾ËCÏ7¼PùÔS¾Ë+ãï$ifLíS¿ôì3±Ñ»ç’ð/H店ïz°àÅõ®>4üþH’² ZGþö³ÏÃF÷º£Â¿ iTkóiï ¨¸öñ~$IY@ÍÅïyöYØè\–RÑ>ª0E|tœ¤¬&OÞ9xî5²]_þÅHU.Ÿ·]*Ÿ¾/úŒÀëœóð»'Iʆ¶Úùåá_ŒTåú·ž}6`:tóÔÜûçÂïŸ$)›ÆŠ'ï<òÙ¬-¿©ªuÎþZô±€iÔ¿û¢”MÌ¿‡’¤lš*Ÿúñày׈þB¤ªÖÜÿ})õZÑg¦Yû̯„ßEIR6MYIëjÎËRñÈ Ñg†¡“¥|áñwR’4sê³’ÖQoù’ècCÔÿñ>:NRÇ,„¤©uÜïGŸ?Ð>ý/Âï¦$)›â,„¤µ”ïö†TfEŸ=P¶W¥|Ï·„ßQIR6…YI?ÙČԿý;Ñçõï8'þžJ’fN]BÒOÔ9ûkÑç * }ÊNáwU’”MQBÒsjîû )uóè³P¶V¦|7…ßYIR6YIÿÙ¬-RñÀ£ÏTHÿ¶³âï­$iæ¦g!$ýGÝKæGŸ/¨ ö‰Ÿ¿»’¤l³’f6RëЦTô£ÏTP™­HùüíÃï°$)Û„,„Tûò_‘Š'ïŒ>WPa½« ¿Ç’¤l²Ríë]{dôy€ª+ËÔ:ìcáwY’”mdBªu­c/ú(Àˆ(¿=es¶¿Ó’¤l#²Rm›üÜ×ò™G¢ÏŒÎùÿ~¯%IÙFd!¤ÚÖ»éÄèó£¦×NÍE?~·%IÙf!¤ZÖ:î÷£Œ¨þç…ßoIR¶Y©v廽>•ÙcÑçFXû¤/„ßsIR¶Y©võn95ú¼Àˆ+Ÿy4åó¶ ¿ë’¤l=³R­jŸú¥è³c¢wÕÁá÷]’”­gBªMùî?“ÊæSÑçÆEY¤æ!ÿ#üÞK’²õÈBHõhbFêßqnô€1S0¦:çýsøý—$e/‘…êñQq­•ÑçÆU7OùÂÂïÁ$)[GBûú·ž}$`ÌõôÝð{0IÊÖ‘…ƺöÉ_Œ> Píã?~&IÙ‹d!¤±-ŸÿºTf+¢ÏÔDùÌ#)ßõ5á÷b’”­% !m½›NŒ>P3Ý+‡ß‹IR¶–,„4–µŽý½èÙ@ýÔÜÿ}á÷c’”ýDB»ò]_ÊUF~jªïÒ”MÌ¿'“¤ì9Yiìê]{TôÌ æÚ'|.üžL’²çd!¤±ªuÄo¥T–Ñó€š+W=²_~_&IÙd!¤ñiî¶©|êîèYÝ çÆß™IÒÌ5Yilê.[=ãà¿ôÚ©¹Ï;ÃïÍ$)³Ò¸Ô<øƒ)ýèÏÓ¿å´ð»3IÊ,„4ÍÚ"_=Û`­ZG2þMRí+-„4êu~0=ÓàE+nMÙì-ÃïÑ$Õ; !tÍE;¦ÔkEÏtX§Îwÿ!ü.MR½³Òè61#õ|Aô,€—T¶W§|÷ŸŽ¿S“”êš…F¶ö™_‰žã°Þz×~§&©QÛ,„4’Mþ4EÙZ=Ã`ý•ej.ùpøÝš¤F-³ÒHÖ¿å´èñ ¬xèê”Ml~¿&©Q»,„4rµûƒè¹ ­}ÚŸ‡ß±IjÔ. !Vs·MåÊ{£g6l´2{,廾&þ®MRªSB©ºK÷Œž×°Éº—ï~×&©Q«,„425÷{oJýnô¬€M×ï¦æ¢Ÿ¿s“Ô¨MB&f¤þÝEi˜2ý[O¿w“”ê’…F¢ö©=Ÿ`ÊµŽøÍð»7IZd!¤Ê—ÏÛnð¢=7ÅÃצlb³ð;8I±ÏBH•¯wÕAÑs¦Mû¤/„ßÁIjŒ}BªtÍ?RÑžÉ0mÊ•÷¤lÎËÂïâ$5Æ: !U·‰ÍRñÀ•Ñó¦]ç{ÿ')sBªl³¿=‡`(ÊÖÊ”Ï]øœ¤ÆØf!¤J–ïöúÁ€ºè.[~/'©1¶Y©’õ–=`¸úÝÔÜçáws’c™…*Wó€ÿžRÑ¿0t½›O¿Ÿ“ÔË,„T¹ú÷\=w LëІßÑIjŒ]BªTí?=o TñÀ•)›˜~W'©1VY©:ÍÝ&•+ïž·®}ÂÅß×IJã”…*S÷Â9Ñs*¡|êî”ÍÙ:üÎNRcl²R%Ê÷xsJ,zÎ@etÎýûð{;I±ÉBH•¨wã Ñó*¥l>•òùÛ‡ßÝIjŒEB ¯uÈGR*Ëèù •Ó½l¯ðû;I±ÈBH±Ml–Ї¯ž«PM½vÊ÷z[ü=ž¤4êY)´öi=R Òz×~'©1òY)®¹Û¤òéû£ç)T[ÑOÍ}ߟ')rB «óƒ™Ñ£FBïÆÂïó$5F: !…”ïöúT¶WEÏQ e™š¼?ü^ORcd³RHÝ=B`¤ôo?;ü^ORcd³ÒÐk.úù”úÝèù #§uØÇÂï÷$5F2 ! ½þ­gDÏMIý{/ ¿ß“ÔÉ,„4ÔšK~eðy§ÀÆiùñð{>I‘ËBHÃkbFêßwyô¼€‘V<¸|p×~ß')RBZíÿ8zVÀXh}û…ß÷IjŒTBN³·JÅ“wEÏI Å£7¥lb³ø{?IiT²ÒPêœýÕè c¥}ÒŸ„ßûIjŒLBšþæn“ÊUFÏG+Å“w¦lö–ñ÷’Ò(d!¤i¯sÞ7£g#Œ¥ö~ÿ'©1YiZËw}u*ó'¢ç"Œ¥rõCƒO艾”Ô¨|BšÖºí=`¬uÎý»ð{@IÊg!¤i+ŸÿºT¶WGÏCkeþxÊwyeø} ¤F¥³Ò´Õ½laô,€Zèü`fø} ¤F¥³Ò´”ïþ3)u›Ñsj¡l=ò]_~/(©ºYiZê-_= V:çÿ[ø½ ¤Fe³Ò”—/|{JýNôü€Z)ó'¼KHRz±,„4åõ®?6zö@-u¾÷Oá÷ƒ’•ÌBHSZsŸw¦Tô¢çÔR™?žò_~O(©Q¹,„4¥õ®?&zæ@­uÎý»ð{BIÊe!¤)«¹÷;üv+Ÿy$es· ¿/”Ô¨TBš²z×=ë€Éß:ûká÷…’•ÊBHSR¾p¿Q®z es¶¿7”Ô¨LBš’z×=ã€çhŸùWá÷†’•ÉBH›\¾×ÛRêw¢çðåÓ÷¥löVá÷‡’•ÈBH›\où!ѳ X‹öi~(©Q‰,„´Iå{¾Õo@EOÞ•²Y[„ß#Jj„g!¤MªwÕÁÑ3 X‡ö);…ß#Jj„g!¤.ßãÍ)õÚÑó X‡âñÛS6kóðûDIÐ,„´Ñu/[=Ë€õÐ>é á÷‰’¡Yi£Êç½6•íÕÑs XÅŠ[S6±Yø½¢¤FXBÚ¨:ÌŠžaÀhÿÙð{EI°,„´áÍÝ6•ÙŠèùl€â±›ý–4³¾YiƒëœýµèÙl„Ö1Ÿ¿_”ÔÉBHÖ¬-R¹òžè¹l„þ½—Æß1JJYiƒjŸ²SôÌ6Aóÿ~Ï(©1ô,„´þMÌHÅÃ×EÏ+`ôo9-þ®QRvBZï&?_qe™šû¾+ü¾QRc¨Yi½ëß»4zTS ·üðûFI¡f!¤õª¹äÃÑ3 ˜*½vÊwÿéð{GI¡e!¤õªwÓ‰Ñ# €©ÒÍSùÌ#©xüŽTyÍÿýî ×üÿ?rÃàåªSÙ|*¥n3ú!ë¡{Éná÷Ž’CËBH/Y¾ç[S*zÑó €ŸÔk ô“í;ù<Ýe‹Rçûÿš:gýujŸü§©uìï¥Öa¿–š¼?å wHù¼×¦lÖÃ;KÎÝ6å»ÿLjîÿ¾Ô:ò·_S眿MÝ‹wM½«Mý[ÏHýû.,¦ÊöªèÿšµS¶V¦|—W†ß?Jj % !½dÝ¥{DÏ&€Ú)›O¦â¦þ-§¥î‹SçüKíS¿”ZGýNj.~ÏšåNΊSÙäeDsÿÿ–ZÇý~ê|÷S÷‡~K©xâG)õ;Ñ$ciòÜ}”ÔJBZgùίü¤SoòœU<¸<õn8.u/Ú9µOþbjü¡”Ïß>üX¹fmžò½~6µŽøÍÔ>ýÿ~ª÷Ek>¢€V®z e³·Š?ïIJÓ…ÖYçì¯EÏ$€ÑV©xüöÁ»w&?*mò·|šK~%廽>ü¬7.å{½-µŽýLê\0+õn9uÍ?rÊ2úO`dLžQ£Ït’Óž…^¼‰ÍÖ|<ë¥ì<“Šû—¥ÞU¥ö™•šK>œ²_®«aù.¯J­C?:xgÑ`I”=ý× ²ŠÇnNÙÄŒð3œ¤Æ´f!¤mò§,X»rõC©×ùƒ.kŸ²Sj.~÷àj¢Ïpzñò…; þ¬zË— .=ø/­c>~^“Ô˜Ö,„ô¢õï¾0zTBÙz:õïò¸ç2IiÉBHk­wíQÑó`h&Å“#6ùqb“¿5}Sš»íàcS&ÿ^”«Œþ+ 0“ï^ ?‡IJÓ•…^P¾ÛëSêµ£çÀ´)ž¼3ux`jŸðG)_ðSáç/U¼‰ÍRó _|d`ñèÑ}¦OY¤æ¢ãÏ_’Òtd!¤Ôùþ¿F€©ÕÉÖ9¹øÝáç-v“‡:ÌNÅ“wEÿ͘r“¿!}Þ’Ô˜–,„ôüfmžÊ•÷DÏ€MVo»Ô9ç©|êîèï&€õR<|møJRcJ³Òšæn“Êæ“Ñsà¿ô»©Û™©}ügS6çeñç%i*šØ,µŽùTêßqnJeý]°N­C?~’”¦* ! jŸöçÑó` xìæÔ9ï›)ßí ág$i:kî÷ÞÔ»î蔊^ô·ÀZõn>9üÌ$©1eYiPñàòèùÔX¹ú¡Ô½x^j.Ú1ü\$ »|á©wÕA)õZÑߊÏWôR¾ç[ÃÏK’S’…RóàE ŽÊ"õï:?µOø\Êfo~&’¢›ü­¸Î³SÙZýÝ ð¬î¥ ÂÏI’S’…RïšÃ£ç P#åSw§Îf¦|7…Ÿƒ¤*–ÏÛnð=Rf+¢¿]ïÏæn~F’ÔØä,„j^¾ó+RÙ^=W€èß»tÍoÍÚ<ü $D;¿|ð>­²õtô·/Psí3¾6’”65 ¡š×>ã/£ç 0Æ&ð¤·|Ij.~Oø¹GÕòùÛ>ªÅ;†€(Åc·¤lbFø¹HRc“²ªyÅWFÏ` Oü(uÎþZÊwyeøyG—ò…oO½ë¼ `ØZGüVøyHRc“²ªqÍýÞ=G€1Se§ðs‰¤Š51cðÑ‘©ß~L#¨¹ß{ãÏ3’Òúd!T“:çþ}ôl¢t›©sÁlŸï-iµûØ`q °!ºWî~Ž‘ÔX¯,„jRñðuѳпç’ÔÜ÷ÂÏ"’F£|þö©ûÙÑ.`„”­§S¶óËÃÏ1’/™…P j.~Oô\†¬l­Lí3¾<ø(¨è³ˆ¤ý¹^;úQŒˆöi†‘”^* ¡Ô½t÷è™ Qï†oÞ}‘4Ú5ú¥T>}_ô# ŃW…Ÿ]$5^2 ¡qob†Ä@ML¾û£uôÿŒ?H›&—Ë“= ðRšþbøÙERcYy­C>= €!èÝtRÊç½6üì!i ›µEê^º ú1T\où’øs‹¤´®,„Ƽî‹£g0ÊgM­ã~?üÌ!iükŸüÅ”ºÍèÇPQeç™”ïòªð3‹¤Æ‹f!4ÎMl–ÊÕGÏ`šônjˆQ¶W­yïÏäG¿ð9ïý‘fÖ3 ¡1ª{ÉnѳX½kŽ|ŒRôÙA’†]÷¢£ÁP÷þÝ» IDATøyA’ªTwéžÑOg±÷þ¼1|~KjŒtBcRñÐÕÑ3 X‹2"5þPøYA’*×ÄŒÔ[~Hôcª¡×JÅýW¤î²}Sûä/¦æ¢½÷GRšê,„Æ |7 ÞITKùô}©¹ï/„Ÿ$©²Ml–z×ý¸€á*‹TþŒ I£Öì­Rÿ®ó£ã°þzíT=ú€ÿP<ðÔÏÛ.ü| I£Z¾Ë+SñÐÕÑsXû{VÜšz×:g55þàà‡¢g§$e…Ј7ù@¼âák-ƒ$i šü-Ëâñ;¢ëÔÜ Þû3ûð)IÙ&f!4âOÞ= öŠG®÷DIšÂò…;¤ò™G¢ïÔô½?ÍÅ’”MCB#ÜäpbÜòù¯ ?HÒ¸ÕÜÿ}©l­Œ~Ì0nŠ^*»yðÑoí3¾¼fù3±YøÜ“¤lYpïýSô€Z›ü‡ääGEŸ $i\kùñ”úèÇ=£ª,Sñøí©wÝ·Rç;_O̓?”²9[‡Ï7IÊ‚²áú÷\=V ¶&Qùî?~¤q¯}âç/ò€—R®~ø'Þûã7ù%){NB#Z¾ëk¿â ßä{-š{¿#ü< Iuɧ#°Ö÷þÜ}aê^º µûƒ”ïñæðy%IYųÑÚÇ6zî@-•­§Só€÷‡Ÿ$©nõ–/‰Tà½?s¾‘š~À{$iæ†g!4¢ùÇè6SëÐ_ ?HR-›½eêÿø‚èIÀ”«ZóÑoç}3µùHÊæn?‡$iæèg!4¢•OÝ=› ^ŠþàsȣϒTçòùÛ§âÉ;£'Süq̃åÏf¦ÖQŸHù¼íÂç$ecš…ÐÖÜçѳj§ó¯‡Ÿ$IÔ\ôó©l>=Øeç™Ô¿wiê.[”ڧ씚‹ß²‰á³E’²šd!4‚uÎþjôü€Zé.Ý3|þK’þ«Öa¿–R¿=Ø€÷þ >úmö–á3D’²g!4‚õo=#z¤@môn>Ù k%©‚µOÿ‹èÀ:ßû³mø¬$5ž—…Ш5k‹T¶žŽžñP ÅWz­$U¸î²}£G@-•Ùc©ûÙ©sÁ¬Ô:ú“ƒw¼EÏIRã%³±Z‡~4zæ@-”«Nùo Ÿý’¤u4k‹Ô¿û¢è‘0Þ:™÷þHÒÌñÈBhÄê^87úã¯×J̓?>÷%I/]¾ÛR¹êèÉ0ŠþZÞû³Uø³^’Ô˜’,„F¬âþeÑGoe™Ú'ýIøÌ—$­̓?”R¯=AF÷½?ÌN­#?î½?’4s¼³¡ò]_“RÑ‹>+ÀXë^²[øÌ—$mxí3ÿ*z„TZ™­Hý;ÎY³üùÖï¦|þëŸݒ¤ÆP³¡Zßþ_Ñgký_²Y›‡Ï|IÒÆÕ»úÐèQP ýn*ºÚ{$Ié¹YPÝË÷Ž>NÀØš|ÿD¾ÛëÃç½$iš³u*¼*z¤ —÷þH’f®_B#TñðµÑG Oýîš8W`ÞK’6­|Ï· >  ïý9æÓƒW D?{%I‘ÈBhDÊçm—RYDŸ9`,Mþ$eô¬—$M]­£~Ç¿Ÿ€±PæO¤þç¦î…sSë˜O¥|·7„?c%I‘ÍBhDjû™è3Œ¥Þ-§†ÏyIÒÔ×½d~ôˆØ0ÝfêßwYê^¾OjŸô…ÔÜûáÏRIRc¬²‘¼?¦é½Aó·Ÿó’¤ihÖ©ïÒèQ°þïý™³uü³S’”Æ9 ¡Éûƒ`Š•Ejþá3^’4}å{¼9•ùãÑà…ïý™·]ø3R’Ô¨]B#ÐäË'r˜:“ŸÃ=ã%IÓ_ë[¿›RYF FÊöªÁo(v—-Jí>—òo J’”YFÞS«¸Ùࣄ¢g¼$i8ùn`ÚôZƒ³å`ùsòŸ¦æ>ï æI’”½HB#¼Àêæ©¹hÇðù.Ib³·LÅýWDO ` L^¤yï$)Ñ,„F ÓùÎ×Ãg»$iøå wHeëéè1ŒòéûSïæSRç¼N­Ã=廼2üY&IR¶ YU¼|×W^z lºþݦlbFø|—$ÅÔ>ù‹Ñ£¨¨²µ2õïú~ê^¼ëà£ûóÝ:ü™%IR6ÅYU¼ÖÑŸŒ>Àxèd©¹÷;Âg»$)¶ÞÇGO$ Z¿›ŠÇnN½åKRû”Rsñ»S6±YøóI’¤lš³ªxÝ‹vŽ>&ÀXèœõ×ás]’_¾ëkRùô}Ñc }ïÏËŸE’$eYU¼þ/ˆ>7ÀÈ+¸ÒO}J’ž­uäÇS*ËèñLƒrõC©ÛY©sÁìÔ:æÓ)Ÿ¿}ø3G’¤¬"YU¹Y[¤²óLôY F[¿“š‹ß?×%I•ª»lQô„6QÙ^ú÷.|?O~ô[¾ðíáÏI’² g!Táš~ úl#¯{áÜð™.Iª`s¶NÅ£7F)`}½5ïý¹îèÔ>ãËÞû#IÒÌ ÏB¨Âu¾óõè㌴âñÛ~Ñ3]’TÍš¼ð›¤@Å”e*Vܶæ½?g-5þ`ÊfoþÌ$)ñ,„*\ïÆã£`0ÒZG}"|žK’ª]çûÿ=® öïý¹õôÔ9ÿßïøÊw}uø³A’¤l ³ªpåÓ÷GŸÉ`dM^*DÏrIÒ4±YêßwYô؂ژ|Wòsßû3øè·èç€$I3ë‘…PEË÷|kô FW¯å¥Â’¤õ®¹ï/ f0}ïýéœóÁ»’½÷G’¤FXB­}Ò¢m0²ºÎ Ÿå’¤Ñjò£ª€)øè·ÛÎJó¾™Z‡|$es· ÿÞ–$Ig³ªhÝeûFŸã`$•«LÙÜmÃg¹$iÄšµE*º:zŒÁÈ(W?œú·™:çÿ{jùÛ)ßõ5ñßÇ’$)­+ ¡ŠVÜEôÙFRû´ÿ/|ŽK’F³æþïK©ß‰eP9Þû#IRc,²ªb³·L©ÛŒ>ïÀÈ)½1e³6Ÿå’¤‘­sÁìèqÕ{ïó•$Ii²ª`Í1úø#©uÔ'Âç¸$i>:îšè‘Cã½?’$5j“…PkŸùWÑçA9ý»ÎŸá’¤ñ¨yÀûSêw£GL¹ò™G×,~01øAš|Þkÿß$IRchYU°ÞÕ‡EŸ`ä4—|8|†K’Ƨî%»E6Øô÷þÜsqê.Ý3µOø\Ê÷z[ø÷•$Ij„f!TÁ&߬¿þíß Ÿß’¤1kî6©xò®èõÞŸÁG¿ÍÞ*þûH’$¥*e!Tµæn;8Èë¯yðãg¸$iìšüH-¨ô{.˜ZG~|p—ýý"I’•ÏB¨bµýÕès%Œ”þ­§‡ÏoIÒøÖ»ñøèQGÍ•­§SÿÞ¥©{é‚Ô:æÓ)ßí áß’$©1’YU¬Î¹}Ö€‘Ò<ðÃç·$i|˼1•­•Ñ㎺èd©數{Ù^©}â§|¯Ÿ ÿ$I±ÉB¨bùé3Xý»ÎŸÝ’¤ñ¯}æW¢Gã¨è{ï$IJÃÌB¨bOÞ}$€‘Ñ:ú“á³[’Tƒ&6Kýû.{Œ¸ò©»?Úùî?¤Ö¡õÞI’”†…P…ÊwyUJe}F€‘Pñó)_¸CøßUI’¤l-YU¨Îw¾}Œ€‘P®zÐgìK’†ßÜmSùô}Ñcª½÷gÎÖñ7%I’f¾tBªwÍáÑG[ óþ9|nK’êYû¤/DA†¨\ýPêßvVê\0{ÍG¿ÍÛ.üï $IR¶‘YU¨â¡k¢ÏºPye{uÊw}MøÜ–$Õ·þÝFC¦AÙ^µæ£ß–-Jí>—ò?þwM’$)›Â,„ªÒ¬-R굢ϿPyÝËöŠŸÛ’¤Z×\üî”úÝè‘Ȧèw×|ôÛò%©}ÊNƒ?ÓlbFøß-I’¤l³ªHÍýß}€êëwS¾ç[Ãç¶$IÝË÷‰žŠ¬/ïý‘$IJ“YU¤ö©_Š>"@åõ®?&|fK’4Y¾Ë«R¹úáèÑÈZxï$IRc­YU¤îå{GŸ™ òš¼?|fK’ôŸùÁ¾xeó©Ô¿ó{©{Ñ.©uìï¥|ÁÃÿ^H’$eÍB¨"y))¬ÛäKž£çµ$IÏkbFêßwyôˆ¬^+÷/KÝeû¦öÉšš‹vôÞI’¤™ëŸ…PE*›OF­ ÒÚ'}!|^K’ô“5ú¥”Ê"zLŽŸ²XóÞŸkL³þ:5ü@Êfoþç-I’”pB(ßýg¢ÚPie¶ÂËŸ%I•­wÝÑÑ£r ßûóÚð?WI’¤l̲ª@­#;úì •Ö½x×ðy-IÒ‹•ïñ¦”:Yô¸e{õà£`»Ë¥ö);¥|áÛÃÿ %I’²d!T:çþ]ôyª«è§|¯Ÿ Ÿ×’$­«Éßla-ŠÞš~»îèÔ>ãË©¹øÝ)›Ø,üÏK’$)«aB¨wõ¡ÑGt¨¬É‰žÕ’$½ds·MåªRªû{VÜšzו:g55úå”ÍÞ*þÏF’$Ii2 ¡ TÜ¿,úØ•Õ:ö3á³Z’¤õ©}òS­ßû3ûð?I’$5^4 ¡è&f¤²õtô9*©|æÑ”ÍÞ2~^K’´>MÌHÅ?LõxïÏñÿ½%I’”6$ ¡àò=ß}®€Êê.Ý3|VK’´!5—üJJe™Fš÷þH’$¥qÌB(¸ÖÑŸŒ>ê@e5¿'|VK’´¡õn:)Œ²LÅŠÛRïºo¥ÎÙ_K̓?”²9[‡ÿ7”$IRcʳ ®óÝŒ>þ@%M~äNôœ–$icʾ=¥~'UQ¹úáŸxïÏëÂÿ{I’$©1”,„‚ë]sxô¿ ’Úg~%|NK’´±u¯Ü?z”¦²½*õï¾0u/]ÚÇýAÊ÷xsøI’$5² ®xàÊè#@õô;)Ÿ÷Úð9-IÒÆ–ïö†T¶WqvvSñàòÔýá©}êŸyï$I’ÒOf!ýÐZ9¼ Àˆèß~vøŒ–$iS›üX¶éR®~hÍG¿÷ÍÔ:ä#)›»Møÿ^I’$5*…P`ù‚7NÛ?`”µOú“ð9-IÒ¦–ïüŠT>óÈ&ÏÅÉ$ìßu¾÷þH’$)mJBµûØ\™À˜éæƒ ´è9-IÒTÔ9ëo6h –gRÿÞ¥©»lQjŸ²Óš~«ÀÿI’$5F> ¡ÀÚ§ÿßiºI€ÑÕ»ñ„ð-IÒ”5k‹T¬¸uíC¯è¥â±›SﺣSçœo¤æHÙ¬Íã¿fI’$¥qÌB(°îÒ=†{Ã# õíÿ>£%IšÊÚÇöEÞû³mø×&I’¤Fm² ¬ëÁWnP-“““ÍyYøŒ–$iJ›˜‘òy¯ÿ:$I’”꜅P`ÅŠÛ¢ïÝ Rz7Ÿ>Ÿ%I’$I’²1ÌB(ªY›§ÔïDß»@¥´OþbüŒ–$I’$Iš9~YÕÜûç¢ïÜ ZŠ~Êço>£%I’$I’²1ÌB(¨Ö1ŸŠ¾v€Jéß}aø|–$I’$IÊÆ4 ¡ :çþ}ô½TJ眿 ŸÏ’$I’$IÙ˜f!T÷‡Dß»@¥ä wŸÏ’$I’$IÙ˜f!TÿŽs£ïÝ 2ŠÇoŸÍ’$I’$IÙg!ÔäŰF÷ŠÅá³Y’$I’$)ã,„"š˜‘R¯}÷•Ñ:ö÷âç³$I’$IÒÌñÍB( |7Eß»@u½”ïòªðù,I’$I’”qBµýÕè«7¨Œþ½—†ÏfI’$I’¤l̳ ¨}Êÿ‰¾{€Êèü`"|6K’$I’$ecž…P@ fGß½@e4—|8|6K’$I’$ecž…P@½ëŽŽ¾{€jèd)›µEøl–$I’$IÊÆ< ¡€&ß•¤ÔÿñÂç²$I’$IRVƒ,„"þ£¯z0úþ *¡{áÜð¹,I’$I’”Õ ¡a7{«”Ê"úþ *¡uÔ'âg³$I’$IÒÌñÏBhÈå wˆ¾{€j(ú)ßõÕá³Y’$I’$)«ABC®uدE_¿@%_>—%I’$I’²šd!4äÚ'1úþ *¡{å~ásY’$I’$)«IBC®óý‰¾€JhŸ²Sø\–$I’$IÊj’…ÐëþðÀèû7¨„æ¾ï ŸË’$I’$IYM²rýÛÏŽ¾€peç™”ÍÚ<|.K’$I’$e5ÉBhÈ\}áú÷. ŸÉ’$I’$IY²öðæ“Ñwp®»lßð™,I’$I’”Õ( ¡a6wÛèû7¨„ö©_ŠŸË’$I’$I3ë“…Ðk.úùèû7¨„æ~ï ŸË’$I’$IY²b­#~+úþ âu›)›µEø\–$I’$IÊj”…ÐkŸ²Sô„+¾6|&K’$I’$e5ËBhˆuÎûçè;8×»þØð™,I’$I’”Õ, ¡!Ö½laô„ëœÿïá3Y’$I’$)«YBC¬wÃqÑwp®}Ü„ÏdI’$I’¤¬fY ±þÝFßÁ@¸æ¾ï ŸÉ’$I’$IYͲbÅŠ[£ïà V¿›²Ù[…ÏdI’$I’¤¬fY ó?vkeô5„šüáˆèy,I’$I’”Õ0 ¡a5çeÑwp®wË©ñ3Y’$I’$ifý²Rù^?}ẗ.ŸÉ’$I’$IY ³RÍ%޾ƒ€pí3ÿ*|&K’$I’$e5ÌBhHµŽûýè;8×:êá3Y’$I’$)«aBCjò'¢ îš‹v ŸÉ’$I’$IY ³Róÿ=úb•eÊæ¼,|&K’$I’$e5ÌBhHu/ß'úB•« ŸÇ’$I’$IYM³R½ë‰¾‡€Pý{—†ÏcI’$I’¤¬¦Y ©þß‹¾‡€P“?=%I’$I’²šf!4¤Š—GßÃ@¨îE»„ÏcI’$I’¤¬¦Y ë?ôÊ{£ïá Tû̯„ÏcI’$I’¤¬¦Y ©ÔÉ¢ïá TëÛÿ;|K’$I’$Õ5 ¡a4w›è;8×\òáø™,I’$I’4³žY ¡|Ï·FßÁ@¸|¯·…ÏdI’$I’¤¬¦Y ¡æ¿}á²9/ ŸÉ’$I’$IYM³B­#?}¡ÊÖÊðy,I’$I’”Õ8 ¡!Ô>á¢ïá T±âÖðy,I’$I’”Õ8 ¡!Ô>ãËÑ÷pªÿã Âç±$I’$IRVã,„†Pç{ÿô=„êÝp\ø<–$I’$IÊjœ…Ðê^%I’$I’²g!4„ºWî}¡ºÎ ŸÇ’$I’$IY³B½ë¾‡€Psÿ.|K’$I’$e5ÎBhõoÿNô=„jŸú¥ðy,I’$I’”Õ8 ¡!Ô¿ï²è{8Õ:ö3áóX’$I’$)«qBC¨xìæè{8Õ:ôWÃç±$I’$IRVã,„†ñyÕƒÑ÷pª¹ß{Ãç±$I’$IRVã,„†ñ¹½:úBå{¾%|K’$I’$e5ÎBhº›Ø,¥²Œ¾‡€PÙÜmãg²$I’$IÒÌúf!4Íå;¿"úbõ»áóX’$I’$©î•BÓ[¾ûOG_Ã@¨²µ2|K’$I’$Õ½ÒBhzkîóÎè{8U®~(|K’$I’$Õ½ÒBhzkðþè{8U%I’$I’ê^i!4½u—î}¡ºËö ŸÇ’$I’$Iu¯´šÞºW,޾‡€PÝË÷ŸÇ’$I’$Iu¯´šÞzË—DßÃ@¨îÒ=Ãç±$I’$IRÝ+-„¦·Éi@u/]>%I’$I’ê^i!4½õn:1úBu/ž>%I’$I’ê^i!4½õÿ{wâli]xü6‚â3j%1‰qŒ:ÙLœljJ'&fbfÈhtâ×ì©QãèMœ„{»šnYFA@öͦÙeßeÙZhdùýœ÷‚±2{¹ç<Ï9ïç[õù~·«ž®ç¹çžŽÞÃI’Zíöáó é*¡ñÞrZôN’¤Ðzk–…Ïc€¦«„Ækøís¢÷p’$…Ö;cÛðy Ðt•ƒÐxî¾(z'IRh½ÓÿOø<hºÊAh¼F÷^½‡“$)´Þ©ÿ>š®r¯Ñ7Fïá$I ­wʧÂç1@ÓUB“y`I’šZïäO†Ïc€¦«„ÆüÀß½‡“$)´Þ©ŸŸÇMW9ù]½‡“$)´ÞiŸ ŸÇMW9ùËýÑ{8I’Bë±mø<hºÊAhÌÜ~(z'IRh½5KÃç1@ÓUBc~àî£Ñ{8I’B럵]ø<hºÊAh¼ê~;z'IRhý³wŸÇMW9W=ìGïá$I ­ÎgÃç1@ÓUBãUWUôN’¤Ðúçí>š®r£¥ÏŠÞÁI’^ÿ‚Ýâg2@ÃUBc´|ëèœ$Iáõ/Ü#~&4\å 4FÛ=/z'IRxý‹öŠŸÉ W9‘ƒ$IõàÒ/ÆÏd€†«„ÆhûçGïà$I opå!ñ3 á*¡1r’$©\{LüLh¸ÊAh|ZÛ¿ z'IRxÃO ŸÉMç 4FB’$Õõð¶3Ãg2@ÓUBãÓZñÂèœ$Iá ïB’$ÕõhÝåá3 é*¡ñq’$©®G÷_>“š®rŸÖŠ‹ÞÁI’^õÐíá3 é*¡ñq’$©®«Çî ŸÉMW9ƒ$Iu]uŸÉMW9OkûDïà$IŠoÐ ŸÉMW9Ñò­£Wp’$¥¨,l?—æ›ËAhœ–m½“$)EÿÕð¹ 0ß\Bã´°EôþM’¤µvþÙø¹ 0ß\BcVWUôN’¤ðÚ{þrøL( æ 4fõh½ƒ“$)¼ö~o ŸÉ¥Á„Ƭö¢wp’$…×9ømá3 4˜ƒÐ˜ÕývôN’¤ðºG¾;|&”s÷÷‹ÞÁI’^÷«>“Jƒ9û;ß‹ÞÁI’^ï¤O„Ïd€Ò`Bã~àÖw£wp’$…×;s!|&”s÷?voôN’¤ðúçí>“Jƒ9û¾+z'IRxƒKö ŸÉ¥Á„Ælôà-Ñ;8I’Â\}DøL( æ 4f£õ×Eïà$I oxã7Âg2@i0¡1­»;z'IRxUY>“Jƒ9ÙðÖÓ£wp’$Å7ÔeaIø\( å 4fÃOŒ^ÁI’”¢Ö/ ŸË¥¡„ÆlpÝqÑû7I’RÔÚõ•ás 4”ƒÐ˜ ®>"zÿ&IRŠÚûüVø\( å 4fƒ+ŠÞ¿I’”¢ÎÁ>—JC9Yÿâ/Dïß$IJQ÷˜÷…Ïe€ÒPBcÖ?oçèý›$I)êø±ð¹ PÊAhÌzk–Eïß$IJQoÍÒð¹ PÊAhÌz§~:zÿ&IRŠúî>—JC9Y÷øGïß$IJÑàªCÃç2@i(¡1ë÷¡èý›$I)8ý¥î IDATÞtrø\( å 4f#Þ½“$)E£»/ŸË¥¡„ƬsðÛ¢÷o’$¥¨úÞás 4”ƒÐ˜u¾ø¦èý›$I9tÂç2@i(¡1kïõºèõ›$Iij­ø±ðÙ PÈAhÌÚ»½:z÷&IRšÚŸMøl( ä 4f­*z÷&IRš:û¿9|6”r³ÖŠFïÞ$IJS÷È? ŸÍ¥„Æma‹º®ªèý›$I)êðÑøÙ 0ß<BP÷ÛÑû7I’RÔ?k»ð¹ PÈAhÜz zÿ&IRŠ—ì>—J9Mâ‘¿÷íèý›$I)^ÿµð¹ PÈAhF믋޿I’”¢Ñ]†Ïe€Ò@B0ºû¢èý›$I)zü?Ñs 4ƒÐ o[½“$)G½>—J9MÀð†¢×o’$¥©lÿüðÙ PÆAhW½{“$)MíÝ^>›JÃ8MÀà²ý£wo’$¥©³ÿ›Ãg3@i¡ 蟿kôîM’¤4uþ³ðÙ PÆAhzgl½{“$)M½Sþ!|6”†qš€Þ Þ½I’”¦Ç?9=›JÃ8M@÷è÷FïÞ$IJÓàš£Âg3@i¡ èüGÑ»7I’Ò4¼ã¼ðÙ PÆAhÚûüvôîM’¤4UÝ>›JÃ8M@{·WGïÞ$IÊÓ [—…%áó 4ˆƒÐ´V¾8zõ&IRªZ«^>ŸJƒ8MÂÂu]¢wo’$¥©½×ëâç3À|s8Mê¡;ߋ޽I’”¦Î!Û„Ïf€Ò B~hI’T×ݯÿ]øl( â 4!£u—EïÞ$IJSÿ¬åá³ 4ˆƒÐ„ o==z÷&IRš—í>›Jƒ8MÈàš£¢wo’$¥ixÓIá³ 4ˆƒÐ„ .Ù'z÷&IRšF÷^>›Jƒ8MHÿì•Ñ»7I’ÒTµ ŸÍ¥A„&¤wê§£wo’$¥ªµâ…áó 4„ƒÐ„t¿ö7Ñ{7I’RÕÞó—Ãç3@i¡ éñ®è½›$I©ê|ù¿†Ïg€ÒBÒùÒïEïÝ$IJU÷ø‡Ïg€ÒBÒÞë×¢÷n’$¥ªΪðù PÂAhBZ»¼ŸJC8MÊöÏÞ»I’”ªáçÅÏg€ùfpš zÐÞ½I’”¦êá»Âg3@i¡I>öÃwEïÞ$IÊÓhX—e[…Ïg€ÒB4ºçÒèÕ›$I©j}îáó 4€ƒÐ oüFôÞM’¤TuøÝðù PÀAh‚—)zï&IRªºÇ~0|>”pš þ9«¢÷n’$¥ªwƶáó 4€ƒÐõNúDôÞM’¤T .Ý/|>”pš îÑïÞ»I’”ªá-§†Ïg€ÒBÔùÒïGïÝ$IJÕèþëÃç3@i¡ jïùËÑ{7I’rÕo×eaIøŒ(3ÎAh‚Z+_½v“$)]­^>£ÊŒsš¤…%u=ìEïÝ$IJUç‹oŠŸÑó³ÍAhÒþÈ=Ñ{7I’RÕ=îCáó Ì8¡ ­»ŸÊŒsš°þ¹;FïÝ$IJÕã߯=ŸÊŒsš°ÞÉŸŒÞ»I’”«ªªËvÏ ŸÑe†9MX÷˜÷G¯Ý$IJW{_ ŸÑe†9MXçÀ·FïÜ$IJWçmÂg4@™aBÖÞóW¢wn’$¥«wâÇÂg4@™aBÖZõÒè›$IéꟿkøŒ(3ÌAhÒ–Ôõ°½w“$)UÃë¿?£æg—ƒPÄ£?úè½›$I©Ý{uø|(3ÌA(ÀhÝeÑ{7I’RUõ ŸÏe†9^ÿõè½›$Iéj}ö'Âg4@™QBú­ŽÞ¹I’”®ö~o ŸÑeF9èö™è›$Iéêûð Pf”ƒP€î±ŒÞ¹I’”®Þšeá3 Ì(¡Þ½s“$)]ƒ« ŸÑeF9hïöªè›$IéÝ}qøŒ(3ÊA(ÂòçÔuUEïÝ$IJUÕ~(~FÌÏ&¡¨‡/÷GïÝ$IJWkÕKÂg4@™ABAFë.Þ¹I’”®ö~o ŸÑe9Þp|ôÎM’¤tuûPøŒ(3ÈA(Hÿâ/DïÜ$IJWíöá3 Ì ¡ ½Óÿ9zç&IRº×>£Ê r òøŸÄ‘$I?ÜhÝeá3 Ì ¡ /ý~ôÎM’¤tUÝGÂg4@™ABAÚ»½:zç&IRÊZŸý‰ð9 PfŒƒP”å[×uUEïÜ$IJWç‹oŠŸÓó³ÅA(òñ[DïÜ$IJW÷+>£ÊŒq 4úΕÑ;7I’ÒÕ?{eøŒ(3ÆA(ÐðÆ£wn’$¥kpí1á3 Ì¡@ý‹÷ŽÞ¹I’”®Ç?A=£ÊŒq Ô;cÛè›$IéªzÕeaIøœ(3ÄA(P÷¸?Þ¹I’”²ÖN?>§Ê q Ô9ð­Ñû6I’RÖùÒï‡Ïi€2C„µvýùè}›$I)ëÿáð9 PfˆƒP¤e[Õõh½s“$)]ý >?§æg‡ƒPôà{wDïÜ$IJ×ðæSÂg4@™!BÁ†·¯Þ¹I’”®ê¡ÛÃg4@™!BÁ—½s“$)_Õ¨.Û=/|N”á ¬·fiôÊM’¤”µ÷z]øœ(3ÂA(X÷¸EïÛ$IJY÷¨÷„Ïi€2#„‚uösô¾M’¤”=þ)Úè9 Pf„ƒP°ÖÎ?½o“$)eƒ«ŸÓeF8E[XR׃NôÎM’¤tÖ]?§ægƒƒP£nŠÞ¹I’”¯^yâ'¢ç4@™B o95zå&IRÊZ»¼<|N”à ”Àà’}¢÷m’$¥¬sІÏi€2„èö™è}›$I)ëø±ð9 Pf€ƒPÝ£Þ½o“$)eý‹V‡Ïi€2„hïóÛÑû6I’R6¼õŒð9 Pf€ƒP­U/Þ·I’”²ê‘»Ãç4@™BITÝG£wn’$嫪êÖŠ†Ïi€2å„’ÝwMôÊM’¤”µ÷þÍð9 P¦œƒPÃ뿽o“$)eÝc?>§Ê”sJ¢áîÑû6I’RÖ?{eøœ(SÎA(‰ÞIŸˆÞ·I’”²Ç?E=§Ê”sJ¢sØ;¢÷m’$¥lôÝ›Ãç4@™rBI´W¿6zß&IRÎFú,ß:|V”)æ ”ÅvÏ­ëj½r“$)eí½^?«æ§—ƒP"Õ#wGïÛ$IJY÷˜÷‡Ïi€2ń޶&zß&IRÊúkW„Ïi€2Å„\²oô¾M’¤” ¾õ•ð9 P¦˜ƒP"½S>½o“$)e£n ŸÓeŠ9%Ò9ìÑû6I’r6ÔeùsÂg5@™RB‰´÷ø¥èu›$Iik¯þÕðY P¦”ƒP&ËŸS×£aô¾M’¤”uþ³øY 0?„’©¾÷íè}›$I)럵]øœ(SÊA(™á­§GïÛ$IJÙàºcÃç4@™RBÉô/Ú+zß&IRÊFë¿>§Ê”rJ¦wÒ'¢÷m’$ålد˲g‡Ïj€2…„’é²MôºM’¤´µ÷ü•ðY P¦ƒP2íÏ¿&z×&IRÚºGýðY P¦ƒP6K·|âOâH’¤'×[³,~VÌO¡„FÞ½o“$)eƒkŸÓe 9%4¼é¤è}›$I)­¿.|N”)ä ”PÿÂ=¢÷m’$ålد˲g‡Ïj€2e„êø±èu›$Iik¯~mø¬(SÆA(¡ÎÁo‹ÞµI’”¶î1ï ŸÕeÊ8%ÔÚõ•Ñ»6I’ÒÖ?{eø¬(SÆA(£…-êzÐÞ·I’”²á 'ÄÏj€ùéâ ”Ôèþ¢÷m’$¥¬zèöð9 P¦ŒƒPRÃ뿽o“$)gUU·V¼0|V”)â ”TÿÜ£×m’$¥­½ßÃg5@™"BIu¿òÑ»6I’ÒÖýÚ߆Ïj€2E„’jïûúè]›$Iië_¸{ø¬(SÄA(©ÖŠ{â;$IÒ“Þ¶&|V”)â ”Xõèºè}›$I)«Z„Ïi€2E„Þvfô¾M’¤´µvüÉðY P¦„ƒPbý‹VGïÚ$IJ[çÀ?ŸÕeJ8%Ö;á£Ñ»6I’ÒÖ;ù‡Ïj€2%„ëøÖè]›$Ii\v@ø¬(SÂA(±ÖN/‹ÞµI’”¶Ñ݇Ïj€2%„’«ÚEïÛ$IÊY¯Ôea‹ðY P¦€ƒPr£»¾½n“$)m­]>|V”)à ”Üàò£wm’$¥­søŸ„Ïj€2„’ëúÑ»6I’ÒÖ;cÛðY P¦€ƒPrÃÞ½k“$)mƒkŽ ŸÕe 8%×ÞíÕÑ»6I’Ò6Z]ø¬(SÀA(»¥ÏªëA'zß&IRÎFƒº,ß:~^Ìçæ 4F÷]½n“$)mí½#|V”䄦ÀàÚ££wm’$¥­ûÕ¿ ŸÕ%9¡)Ð?kyô®M’¤´õ/Ü=|V”䄦@÷è÷FïÚ$IJÛðö³Âg5@IÎAh ´÷z]ô®M’¤´UíÃg5@IÎAh,ߺ®GÃè}›$Iikíü³ñó`>/¡)1zð–è]›$IiëúÇá³ $æ 4%†×=z×&IRÚzgüKø¬(‰9M‰þÙ;DïÚ$IJÛàÚ£Ãg5@IÌAhJt~oô®M’¤´î¿!|V”Ä„¦D{õk£wm’$åm4¬ËvÏ Ÿ×%)¡i±l«ºö¢×m’$¥­½ÏoÇÏk€ùœ„¦Èè¾k£wm’$¥­ûµ¿ ŸÕ%)¡)2¸æÈè]›$Iië_´:|V”¤„¦HïÌùè]›$IiÞqnø¬(I9M‘ÎáïŒÞµI’”¶ªóp]–„Ïk€’ƒÐiïöêè]›$I©k}î߇Ïk€’ƒÐ4YØ¢®{%z×&IRÚ:‡½#~^Ìçã 4eF÷\½k“$)m½3Âg5@IÈAhÊ ®8(z×&IRÚ×>«JBBS¦wʧ¢wm’$¥môà-á³ $ä 4e:ÿQô®M’¤¼U£ºµý Âç5@IÆAhÊ´vþ™èU›$I©kï÷;áó $ã 4…ªöƒÑ»6I’ÒÖ;á#á³ $ã 4…†wœ½k“$)mƒK÷ ŸÕ%¡)Ô¿xïè]›$IiÝsIø¬(É8M¡Þ‰½k“$)oƒN]–m>¯J"BS¨sÀ[¢Wm’$¥®½úµáó $â 4…Z+_½g“$)uÝc?>¯J"BSªzô;Ñ»6I’ÒÖ?×ðY PqšRÃ[N‹ÞµI’”¶ámkÂg5@IÄAhJõÏÛ9z×&IRÚªöCuYX>¯JBSª{ì¢wm’$¥®õ¹W„Ïk€’„ƒÐ”j¯þÕè=›$I©ëþÎðy P’pšVK·¬ëA7z×&IRÚúg-Ÿ×ó98M±Ñw®ŒÞµI’”¶á LJÏj€’„ƒÐ\qpô®M’¤´Uß>«JBS¬wò'£wm’$¥®µê¥áó $à 4Å:¾5zÏ&IRê:þAø¼( 8M±Öª—DïÙ$IJ]ïÔO‡Ïk€’€ƒÐ”«¹'z×&IRÚW>«JBSnxÓÉÑ»6I’Ò6Zÿ­ðY Ppšrýs>½k“$)o£a]¶{^ø¼(Á„¦\÷è÷F¯Ú$IJ]{ß7„Ïk€ÌAhʵ÷ø¥è=›$I©ëÿáðy P‚9M»¥Ïªë~+z×&IRÚ—ì?¯æc9Í€Ñ=—FïÚ$IJÛèî‹Ãg5@ æ 4—½k“$)oýv]–n>¯J ¡Ð;éãÑ«6I’R×ÞóWÂç5@ ä 4:¼%zÏ&IRêºÇ}(|^”@B3 µÃ×uUEïÚ$IJ[ÿÂÝÃç5@ ä 4#ª‡ïŒÞµI’”¶áç†Ïj€ÈAhF o8!z×&IRÚªÞcuYØ"|^” B3¢¿vEô®M’¤Ôµ÷øÅðy P‚8͈î‘ïŽÞ³I’”ºî1ïŸ×%ˆƒÐŒhïöªè=›$I©ëŸÿ¹ðy P‚8ÍŠ…%uÕy8z×&IRÚ†·¯Ÿ×ó1„fÈðÛçDïÚ$IJ[Õ}ä‰_ ˆž×%€ƒÐ é_ðùè]›$I©kïöêðy P8Íîq½g“$)uÝ£ÿ,|^”B3¤½úW£÷l’$¥®îNáó pš%K·¬ë~;z×&IRÚ†·?¯æ'ÏAhÆŒî¹$z×&IRÚªöCuYX>¯Ê„9͘Á¥ûEïÚ$IJ]k×W†Ïk€2aB3¦{ü‡£÷l’$¥®{ä»Ãç5@™0¡ÓÞ÷ Ñ{6I’R×?gUø¼(æ 4k¶{n]Ñ»6I’Ò6¼å´øy 0?YB3h´þºè]›$Ii«Zß ŸÕe„fÐàÊC¢wm’$¥®µËÏ…Ïk€2AB3¨wò'£÷l’$¥®sÄ»Âç5@™ ¡ÔùÒïEïÙ$IJ]íŠðy P&ÈAhµvxQ]WUô®M’¤´ o:)|^” ršñ¬$IzrÕc÷…Ïj€2AB3jpÝqÑ»6I’R×ÚùgÂç5@™¡Õ;cÛè=›$I©ëöŽðy P&ÄAhFuÙ&zÏ&IRêúg-Ÿ×eB„fTkÇŸŒÞ³I’”ºáߟ×eB„fXõؽѻ6I’ÒV•ûÃg5@™¡6¼é¤è]›$I©kíòòðy P&ÀAh†õ×®ˆÞ³I’”ºîÿ=|^” pšaÃß½g“$)uý³W†Ïk€2B3ìñ?ƒ#I’ž¾á-§…Ïk€2B3®zì¾è]›$Ii«ÚÖeaIø¼(cæ 4ã†7½k“$)u­]>|^”1sšqýµ+¢÷l’$¥®{Ô{Âç5@3¡×9üÑ{6I’R×?oçðy 0nB3®µËË£÷l’$¥nxûYá󠌙ƒPTݽk“$)mU÷‘º,l>¯Ê95ÀðæS¢wm’$¥®½û/„Ïk€2FB Ð_»"zÏ&IRêºÇ~ |^”1rj€ÎáïŒÞ³I’”ºþŸŸ×eŒ„ µËË£÷l’$¥nxÇyá󠌑ƒPCTe}ô®M’¤¼õ[uYºeø¼(câ ÔÛO‰^µI’”ºöê׆Ïk€2&B Ñ?{‡è=›$I©ë~å/Ãç5@¡†èñ®è=›$I©ë_´Wø¼(câ Ô­]^½g“$)u£»/ Ÿ×eL„¤*ë£wm’$åmЩ˲­Âç5@¡Þ|JôªM’¤Ôµ¿ðëá󠌃PƒôÏÞ!zÏ&IRêº_ÿ»ðy PÆÀA¨A:G¼+zÏ&IRê—î>¯Ê85Hk—Ÿ‹Þ³I’”ºÑºËÃç5@¡†©Êúè]›$Iyöë²|ëðy P™ƒPà o:9zÕ&IRêÚû¾>|^”Eæ Ô0ýµÛGïÙ$IJ]ïÄ…Ïk€²È„¦sØÛ£÷l’$¥npå—Ãç5@YdB ÓÚñ§¢÷l’$¥ntÿ áó ,2¡ª¹'z×&IRÞªªníðãáó ,"¡^ÿµèU›$I©ëøáó ,"¡êñ/Ñ{6I’R×;ýŸÃç5@YDB Ô9è£÷l’$¥nø­¯†Ïk€²ˆ„¨µòß=ñý’$é©«¹;|^”Eä ÔP£oÞµI’”ºÖN?>¯Ê"qj¨Á5GFïÙ$IJ]çðw†Ïk€²H„ªwÊ?DïÙ$IJ]ÿì•áó ,¡†êð»Ñ{6I’R7¼õôðy P‰ƒPSmÿüº £wm’$¥­ê<\—…-âg6Àüæsj°Ñúë¢wm’$¥®½û/„Ïk€²„lpÅAÑ{6I’R×=öƒáó ,¡ëðÑè=›$I©ë_¸Gø¼(‹ÀA¨ÁÚû¾>zÏ&IRêFw}3|^”Eà ÔdËŸS׃nô®M’¤¼ :uYöìø™ 0¿y„n´î²èU›$I©kïý›áó l&¡†\²OôžM’¤ÔõNøHø¼(›ÉA¨áº_ýëè=›$I©\~`ø¼(›ÉA¨áÚ{ýZôžM’¤ÔÖ_>¯Êfrjº¥Ïªë^‰ÞµI’”·jT·VüXü̘ßtBÔÃ;Ï^µI’”ºÎ—~/|^”Íà DÝ¿`·è=›$I©ëöOáó l!êî1ï‹Þ³I’”ºÁudžÏk€²„¨Û»½*zÏ&IRêª‡ï Ÿ×e38ñÿþ!”õÑ»6I’R×Úéeáó l"!ž0¼é¤è=›$I©ëööðy P6‘ƒO蟵¯Ê&pâ_ ®92zÏ&IRêº_ù‹ðy P6ƒÿªwò'£÷l’$¥®ñÞáó l!þUç‹oŠÞ³I’”ºÑºËÃç5À¦pâÿ[¾u]ûÑ»6I’ò6ì×e»çÅÏl€ùã Ä}çŠèU›$I©ëìÿæðy P6’ƒ?dpɾÑ{6I’R×;åSáó l$!~H÷«½g“$)uƒk Ÿ×e#9ñCÚ«_½g“$)uÕÃw†Ïk€²‘„øa [ÔU÷‘è]›$I©kíôÓñ3`~Ã9ñ$ÃÛ×FïÙ$IJ]çð? Ÿ×e#8ñ$ýswŠÞ³I’”ºþ9«Âç5@ÙBZ—¥Ï ŸÙe9ñ”ªG×EïÚ$IJ]{õkÃç5@Ù@B<¥áõ_Þ³I’”ºî×þ&|^” ä ÄSê±môžM’¤Ô .ýbø¼(ÈAˆ§Ô9è£÷l’$¥ntïÕáó l !žRk‡Õu5ŠÞµI’”·Ñ°nmÿ‚ð™ P6€ƒOkôÀÑ«6I’R×9à-áó l!žÖàÊ/GïÙ$IJ]ï´ Ÿ×e8ñ´z'~,zÏ&IRêßúJø¼(ÀAˆ§ÕÞ÷õÑ{6I’RW=º.|^” à ÄÓ[öìºt£wm’$¥®µóÏÆÏl€ùgæ Ä3Ý}qôžM’¤ÔöΩù IDATuüÓðy P~!žQÿ›{FïÙ$IJ]ÿ¼Ãç5@ù„xFÝã>½g“$)uÃoŸ>¯Êà Ä3jïþ Ñ{6I’r×oÕeé–á3 <!žÙÂ’ºj?½j“$)uí½#~fÌ?=!~¤á­§GïÙ$IJ]ïÄ¿Ÿ×å8ñ#õÏÞ!zÏ&IRêW>¯Ê3pâGêöŽè=›$I©=xkø¼(ÏÀAˆ©µãOEïÙ$IJ_kÇŸ ŸÙåi8±Aª‡ïŒÞ³I’”ºÇ?Q=¯ÊÓpbƒ ®;6zÏ&IRêúç¬ Ÿ×åi8±Az§ýSôžM’¤Ô o_>¯ÊÓpbƒtxKôžM’¤ÜõJ]–n>³ÊSpbÃlÿüº ¢Wm’$¥®ý…_ŸÙóOæ ÄÝwMôžM’¤ÔõNøHø¼(OÁAˆ 6¸ì€è=›$I©\yHø¼(OÁAˆ Ö=þFïÙ$IJÝèÁ[Âç5@y Bl°öþcôžM’¤ÜUUÝZõÒð™ Pþ !6ÜÒgÕu¯D¯Ú$IJ]çÐÿ?³æ˜ƒexÇyÑ{6I’R×?{eø¼(ÿ†ƒ¥þç¢÷l’$¥nxûYáó üBl”îQï‰Þ³I’”»^©ËÒ-Ãg6@ùBl”Öç^½f“$)}í½^>³Êpb£U~'zÏ&IRêºÇ8|^”à ÄFÞp|ôžM’¤Ô ®88|^”à ÄFë±môžM’¤Ô¸)|^”à ÄFëôŸ£÷l’$宪êÖª—†Ïl€ò}Bl´Ö/ªëj½j“$)uCÿ8|f”ïsb“Œî¿>zÏ&IRêúkW„Ïk€ò}Bl’Ç¿,[’$=}ÃÛÎ Ÿ×åû„Ø$½>½g“$)uU÷Ѻ,}VøÌ(BlªöÞ¿½g“$)}í½^>³Šƒ›lÙVuÝoGïÙ$IJÝ㟨 ŸÙóBl†áDïÙ$IJÝàªCÃç5Àã„Ødý v‹Þ³I’”ºê¡ÛÃç5@qbst~oôžM’¤ôµvzYøÌ¨„ØT­]_½c“$)}Ý#ÿ4|fTBlŽê±û¢÷l’$¥®þ®áó rbs o<1zÏ&IRêFw}3|^TBlŽÞ™ Ñ{6I’r7ì×e»ç…Ïl Ù„Ø,ƒß½f“$)}ýÿSøÌšÍAˆÍÒÚáÇëºEïÙ$IJ]ï´Ï„Ïl Ù„Øl£nŒÞ³I’”ºá LJÏk Ù„Ølƒ+‰Þ³I’”ºªõ@]–„Ïl`®±„Øl½ÿ>zÏ&IRúÚ»ÿ‡ð™ Ì5–ƒ›­½ÏoEïØ$IJ_÷«>³€¹Ærbó-Ûª®ûíè=›$I©\úÅø™ ÔMå Ä¢ÝõÍè=›$I©­ÿVø¼æËAˆEÑ¿p÷è=›$I¹«ªºµòÅá3˜k$!E÷˜÷G¯Ù$IJ_çmÂg60×HB,Šön¯ŠÞ±I’”¾þÙ;„Ïl`®‘„X4UY½g“$)uÃÛ׆Ïk`®‘„X4ÛNŠÞ³I’”»~».˶ ŸÙÀ\ã8±hzk–E¯Ù$IJ_{Ÿß ŸÙÀ\ã8±h:_þ/Ñ;6I’Ò×;éãá3˜k!Mkå‹ëºª¢÷l’$¥npÍQá3˜k!Õè»7GïÙ$IJ]õÈ=áó˜k!ÕàªC£÷l’$¥¯µËÏ…Ïl`®Q„XT½oü¯è›$Iéëó¾ð™ Ì5Šƒ‹ª½ïë£wl’$¥¯ñÂg60×(B,®eÏ®ëA7zÏ&IRêF÷^?³€ºI„Xt£»/ŽÞ³I’”»jT·V¾8|fsá Ä¢ësÏè5›$IéëúÇá3˜k !]÷ØFïØ$IJ_ÿœUá3˜k !]ûó¯‰Þ±I’”¾áç…Ïl`®1„X| KêªõÝè=›$I¹të²|ëø¹ ÔMà ÄX o>%zÍ&IRú:û¿9|fsà ÄXôÏZ½c“$)}½Óÿ9|fsà ÄXtÙ&zÇ&IRú†7~#|fsà ÄX´V½¤®«*zÏ&IRêªÎ÷ê²°EøÜæfžƒc3zðÖè=›$Iékïõká3˜›yBŒÍàêãwl’$¥¯wÂGÃg607ó„›ÞIÞ±I’”¾ÁÕG„Ïl`næ916í}ß½c“$)}Õ#÷„Ïl`næ91>ËŸS׃nôžM’¤ôµ>÷Šø¹ Ô³ÌAˆ±Ý}qôŽM’¤ôuý@øÌæfšƒcÕ¿huôŽM’¤ô .Ù'|fs3ÍAˆ±êûÁè›$IéÝwmøÌæfšƒcÕþük¢wl’$寪êÖª—„Ïm`nf91^ KêªõÝè5›$Iéëööø¹ Ô³ÊAˆ±Þ|JôŽM’¤ôõÏÝ)|fs3ËAˆ±ëŸµ³€¹™å ÄØuÙ&zÇ&IRþ†½ºl÷Üð¹ ÌÍ$!Æ®µòÅO|Y¶$Izæ:¼%|ns3ÉAˆ‰=xkôŽM’¤ôõÖ, ŸÙÀÜLrb"W½c“$)}Ã[ÏŸÙÀÜLrb"z'}·€¹™ã Äd,N]ºÑ;6I’Ò×;í3ñsþ/{÷f×Yz{ËLï-Bù ! é@B $@äB9œäNr4’,Y²\qïMØØÆ½Üq“n¸÷&˶lk­Ý÷z¿k‚qÓH3ûY徯ë÷¿ËÌû¼3Ïžµæ+«YBšX£;/Šþ”ÞðúÃg¶$I’$IjÕ. !M¬þ;EÿŽ J¯è>’²‡ÏmI’$I’ÔªUBšXÝÃÿ&úwlP íÝ~)|nK’$I’¤V­²ÒÄjómÑ¿_€Jèôµð¹-I’$I’ZµÊBH“kj^*ò¢Ç¥7¼æ¨ø¹-I’$I’R²ÒDÞprôïØ ôŠöƒ)›Ú(|nK’$I’¤Vm²ÒD럹(úwlP íß>·%I’$IR«6Yi¢uV|4ú÷kP ½ãþ%|nK’$I’¤Vm²ÒDË—¾<¥¢ˆþ”ÞàÊCÃç¶$I’$IjÕ& !M¼Ñƒ7FÿŽ J¯X{oøÌ–$I’$I­Úd!¤‰7¸â èß±@%´¿ù¶ð¹-I’$I’ZµÈBH¯wâW£¿•Ð=úïÃç¶$I’$IjÕ" !M¼ö¿ýû5¨„Áå+Âç¶$I’$IjÕ" !M¾EÏMiÐþ”^±æÖø¹-I’$I’R²RH£;/ŠþTB¾í›Âç¶$I’$I³Þ‚Mâÿæ7+ !…Ô¿`§è߯@%tøløÜ–$I’$iƒZ°Ijïô®éŸqûçïFw_’×ÿÏ5¿YY)¤î៉þýTÂ`å^ás[’$I’¤™”oõºÔ9ðc©îò4¼í{)õÛOúywxã)áÿœYòRHío¾-àWjP=£ÕׇÏmI’$I’ž®|ùkRç ?Ný³O/yŠöƒëôóîðÖsÂÿÙ³†e!¤˜¦æ¥"_=Ç¿B€zÈ·~}üì–$I’$iñ Rg¯¤Þ‰_MƒËW¤Ñª«S*ŠõúYwüžùðŸùÍÊBHa ¯?i–]õÔ=ìÓás[’$I’Ôì÷þL?úmØ›µŸuG÷]ÿï8¿YY)¬þ™‹fíð€:ó!I’$IÒ¤ÞûÓ;caÞtZJý|NÖ=pCø¿sÖ°,„VgÅGçô@€º=xcøÜ–$I’$Õ§|‹—<öè·S¿‘†?<.Ùª‰ÿ¬[w —í>·%I’$I³øÞŸñ£ßÚ¥¦ò$ŒÖD³Rxý vŠ>w ЇoŸÛ’$I’¤uoüH´é÷þŒývÕa©X{_ô–¥ÒÞñáÿ²e!¤ðº‡&úÜ€ÊÈ·ý™ðÙ-I’$Izš÷þŒývÌkýÞŸÙÔÞõãÿ¿ÍoNB ¯½ý[£Ï¨ŒîQŸŸÝ’$I’ÔøüÞŸÙÔÞóýñÿ/ç7' !Å75/ùêè³*aü)³ðÙ-I’$I Ë{æFgßßÿ›5( !•¢áõ'EŸ=P ÅÃw„ÏmI’$IjÖ{îþQ°¶:ßúÃðÿßYƒ²R)oÖ€uÓÞþgÃg·$I’$Õ÷½?£èû£{ðÇã¿æ7' !•¢ÎŠFŸ=PÝ£ÿ!|vK’$IRË·{ËO¼÷§ý#^£uÿLø×DÖ ,„TŠòe¯H©(¢Ï¨„Á…ÏnI’$I*{ùÖo˜þ ”þ¹ËÓð–3SÑ}4úÇ9~B÷è¿ÿ:É”…JÓèÁ£Ï¨„âÑ{Âç¶$I’$•©|É‹þû½?—¯HÅC·DÿèÆ:?ª/úk'kPB*MãO;ë¦ýÍ·…ÏnI’$I iÁ&½÷çˆÏ¦ÁÊ=½÷§ÂzÇýsü×Óüæd!¤ÒÔ;á+ÑçT†OQI’$IjJùV¯KÝC?á½?5Ô;þËá__Yƒ²Rijïñ«ÑçTÆàÊCÂg·$I’$ÍvùÖ¯Oƒÿ<õÏY–†7Ÿ‘Šî#Ñ?~1‡z'}-ük.kPB*O Ÿ“Ò }@%Ùª”MÍ‹Ÿß’$I’4kïýyì—Õ4Gïä ÿ:Ì”…JÕèÎ £Ï ¨ŒöÎï ŸÝ’$I’´NyïO¡wÊ×ã¿6ç7' !•ªþù;FŸAPþ´^’$IReÞûÓoGÿE õ¾ûá_«Yƒ²R©êþ™è3*cxÝñá³[’$I’ÆËŸÎK½3¦áKE¾:úÇ%*¢wúüð¯ß¬AY©Tµ·kô•QtMÙÂMÃç·$I’¤æ”/~áÞû3ýè7XOã%bô×tÖ ,„T®¦æùÌ@{Ï÷ÇÏoI’$IµïÏøÑo£»/ñÞfUÿ¬Åñ_çó›“…J×ðú“¢Ï!¨ ^/I’$i¶ýÖ?w¹÷þ0ý³—†Ýg ÊBH¥küg‚ÀºÞrVøì–$I’T½ò-^š:ûÿž÷þj¼|Œþ^È”…JWgÅG¢Ï!¨Ža/e‹_>¿%I’$•7ïý¡¬úßÛ&üû#kPB*]ùÒ—§TÑgTFç€?Ÿß’$I’JüÞŸÑ0úÇxJýïoÿ=3¿9Y©”¸!ú,€Ê蟻Uøì–$I’T–÷þäÑ?¢À:럿cø÷PÖ ,„TÊW}@eŒ?ñ=»%I’$¼÷'»?úÇØ ý w ÿ¾Ê”…JYDŸEPÅ(åË^>¿%I’$Íb‹_ðä÷þxÍ53¸x÷øïµùÍÉBH¥¬½Ç¯FŸEP)݃?>¿%I’$­g 6~Â{¦ý6ìEÿ˜sn°r¯øï¿ùÍÉBHålásRt£Ï#¨ŒþE»ÆÏoI’$I3zïÏô£ßn:Í{h¬Á¥û†?f ÊBH¥mtç…ÑçTÆhõuá³[’$IÒ“Ë·xÉc~;õ¿÷gUôPƒËÿÍ”…J[ÿü£Ï#¨”|ë7„ÏoI’$)kú{öþ`êü¯ipå¡©xè–è ÔWÿ};¿9Y©´uûtôy•Ò=âoÃç·$I’Ô˜¼÷6ØàòoÅ/ÏoNB*mííß}@¥ ._>¿%I’¤º–o÷æÔýÎ_¥þyÛ¥ámç¦ÔË¢€ÊóȸÖD³R©+ÖÞ}&@eÞ>»%I’¤Z¾÷Çï¨`N .Ý7üû=kPB*uã ¬»öŽïŸß’$IR¥Úüy-NúßiðƒƒÓèÁ›¢¯õЃ•{ÅŸó›“…J]ï´ÿ}&@¥ôNøJøü–$I’*õÞŸA7ú5¸x÷øsa~s²R©ëì÷;ÑgTÊø¯k£ç·$I’T–ò­^—:~,õÎXøØ£ßÚE_ÙÓ¿h×ðs"kPB*uù’¥4FŸKP½,e‹ž>Ã%I’¤I—/yñc~;ñ«ipÕaÞûп`§ð³#kPB*}£{}.@¥töùPøü–$I’æ´…›>öè·c¾˜—¯H£UW§TÑWq`†úßÿfüy2¿9Y©ô .Þ#ú\€J韽Eøü–$I’f³|»·xïÔPÿ¼íÂÏ—¬AY©ôuú|ô¹•2ºëâðù-I’$ÍÞ{Œ¾bs¤ÿ½­ÃÏœ¬AY©ôµw|Gô¹ÕRŒR¾ì•á3\’$IšÑ{._‘Š5·Fߦ ꟻ<üÊ”…ÊßÔ<Ÿ€êúÉø.I’$=ë{FÑWg Pÿì¥ñgÓüæd!¤J4¼áäè³ *epÉÞáó[’$IÍîÉïýéD_“’韵8ü¬Ê”…*Ñø™±Àº+¹3|~K’$©9yï°>úg. ?¿²e!¤JÔ9àÃÑgTÎø=|Ñ3\’$Iõ+_ò¢'¾÷ç¡[¢¯¾@EõNŸ ?Ó²e!¤J”oñRÏ”€êð•ð.I’¤Š·`“ÇÞûsÄgÓ`åžÞû̪Þiÿ/þœ›ßœ,„T™F«®‰>Ÿ RÆêˆžß’$IªÞ£ßº‡~Â{€‰è}÷ÿ†Ÿ{Yƒ²Re\ºoôùÕÒËR¶è¹á3\’$IyïOþ@ô h˜Þ©ÿ~f ÊBH•©{ÌÿŒ>Ÿ r:û|(|†K’$)¾|ñ ŸðÞŸéG¿ëüoáçcÖ ,„T™Ú;¿'ú|€Ê韽Eø —$IRÜ{Æ~Ý}‰÷þ¥Ô;ékñgæüæd!¤ê4µQ*ºDŸQP)£»VÆÏpI’$Í]SóR{‡·?¶ü¹`§4ºó”Ýèk(À:ÿÕbø9:¿9Y©R o:-úŒ€j)F)_öÊð.I’¤¹zïÏêè'ÀzëóÅðs5kPBªTý³–DŸQP9ÝC?>Ã%I’4ó¼÷¨»î~Öf ÊBH•ªsàEŸQP9ƒKö Ÿá’$Iz–nšÚ»½/õŽûç4¸lÿÇ–?ÞûÔœ0¶&š…*U¾ì)Eô9•R›úçïðأ߆½è«@e´wÿåø³|~s²RåjïúÞès ªgØOù/ Ÿã’$IuxïÏô£ßn:-¥~}˨´öÎï?Û³e!¤êµ`ãTôÖFŸUP9oÿYü—$IªHãÓxïÀÜjoÿÖðó>kPBªdÃ[ÏŽ>« r+÷ Ÿá’$I¥Ì{Bä[¿>~ÌoNBªdýs¶Œ>« rŠGî Ÿá’$Iá-ØØ{J"_öŠø¹0¿9Y©’u¾ý§ÑgTÒø—Ñs\’$i’yï@yÿB3zNd ÊBH•,ßòÕÑgTRïä Ÿã’$IsúÞŸñ£ßNýÆãïýY}ýàŒÿj3zvd ÊBH•­xè–èó *gxóéá3\’$iVZ¸ijïö>ïý¨ªa/~–ÌoVBªlƒ}d@õ {)_üÂð9.I’´Áïýt£oVl€¢ûHü|™ß¬,„TÙÆŸf®sЇÏqI’¤u~ïÏøÑo5ÑW(fÙø±žÑó&kXBªlíÝ%úÌ€Jê_´[ø—$Iú¯ò%/~ì½?ãG¿]uX*ÖÞ}]`Š5·…Ï ¬aY©º-Ü4¥~;úÜ€Ê)ÖÜ?Ç%IR3óÞ7Z}]ü\šß¬,„T醷Ÿ}n@%µwx{ø—$I5Ï{x£{¯ˆŸUó›•…*]ÿ¼m£Ï-¨¤ÞI_ Ÿã’$©æïýi?}å ÄFw\>»²†e!¤J×=ä/¢Ï-¨¤á§†ÏqI’TÝò¥/K>œz§O=¶üñÞfhxË™áó,kXBªü§€õ0è¤lñ Âg¹$Iª@‹6Kí=ßÿØ{®8(¸Á{Ø`Ãk‰Ÿqó›•…jóE ÌLçÛ>Ç%IRùÊ·{ËO¼÷§}m †—¯ŸyYòRå\þ­è³ *i°r¯ð9.I’ÊöÞŸ£¯(4DÿÂÃç`Ö°,„TùºÇþSôÙ•TðØ£ß._‘Їn‰¾ŽÐ`ý³—†ÏƬaY©òµw~OôÙ•ÕÞý—Ãg¹$Išƒl’Ú;½kúÑoƒ•{¦Ñª«S*FÑWø‘ީ߈Ÿ—ó›•…ªßÔF©h?}~@%>Ë%IÒç½?TM︟ŸYòR-Þprôù•4ºkeø—$IøÞŸüè+ÌX÷°O‡ÏÔ¬aY©õNŸ}~@5EÊ·~}ø,—$IëúÞŸÇ~‘U7þpCôœÍ–…jQgßߎ>¿ ²ºGÿCø,—$IÞû@³töùÍøÙ;¿YY©-~AJ£Aô•4¼ö˜øY.IRÃë_¸sJÃ^ôµ&¦½ë/†Ï߬aY©6߬‡^–²E›…ÏrI’šÜð¶s£o0QùvoŸ¿YòRmꟿCô•ÕYñ‘ðY.IR“ÝwUôu&*_öŠðù›5, !զŒ>à²úî>Ë%IjrÅ#wF_`¢²…›†Ï߬aY©6å[ýTô•U<|{ø,—$©É½µÑטœ~;|öf ÌBHµªXs[ôQ•ÕÞù=á³\’¤F¶`“”Š"ú*S¬½7~þÎo^BªUƒ|;ú,€Êê}÷?Âg¹$IM,_öÊèkLÔhõõáó7k`BªU½ãþ%ú,€ÊÞ~^ø,—$©‰µ·kô5&jt×Êðù›50 !Õªö.¿}–@u†ÓŸPŽžç’$5­önÀD o>#|þf ÌBHõjj£TtŽ>Ï ²ºG~.~žK’Ô°:ûÿ~ô&jxÍQáó7k`Bª]ÃO>Ï ²\Ê%Iš|ÝC?}€‰\v@øü͘…jWïŒÑçTW?OÙæÏŸç’$5©Þñ_޾ÀDõÏÛ6|þf ÌBHµ«³ßïFŸgPiƒþ$|žK’Ô¤úgn=þ`¢zßý¿áó7k`Bª_‹_Òh}¦@e .Ý7~žK’Ô úí=þ`¢ºGÿCøü͘…jÙèžË¢Ï4¨¬" e 6 Ÿç’$5¥ÁÕ‡G˜¨Î·ÿ,|þf ÌBHµ¬áÎÑgTZgïߟç’$5¥á­gG~˜¨ÎÞ Ÿ¿Y³R-ë~篣Ï4¨4/ø”$irV]=ú`¢Ú;¼=|þf ÌBHµ,ßúõÑgTÚèÁ›Âç¹$IM©Èîý0Qù²W„Ï߬Y©¶ß}®@¥µw~wø<—$©öMm”Òh=ö`rFÃéù>ƒç7/ !Õ¶Á•‡DmPi½Óç‡ÏsI’ê^¾å«¢G>LÔø/c£çoÖÐ,„TÛzÇ9úl€Jݵ2|žK’T÷Ú;¿'zäÀDî¿6|þf ÍBHµ­½ë{£Ï6¨¶¢Hù6?>Ó%Iªs>=ñ`¢†·ž>³†f!¤ú¶`ãTt>ß ?_˜ IDATÒzÇ)~¦K’TãºG}!zÜÀD ®92|þf ÍBHµnxÓiÑçTÚð¦ï†ÏsI’ê\ïô©èq5X¹gøüÍš…j]ÿÌÍ£Ï7¨¶a?åK_>Ó%Iªkƒ‹wžö0Qý³—†Ï߬¡Y©Öuøƒèó *¯{øgÂgº$IumøÃc£G=LTïä Ÿ¿YC³R­Ë—¼8¥Ñ0úŒ€J^sTøL—$©®î¾4zÔÀDuøløüÍš…jßèÞ+¢Ï8¨¶A'åK^>Ó%IªcÅÚû¢'=LTgÅGÃçoÖÐ,„Tûúí}Æ@åuýdøL—$©v-Ø$¥b=æ`¢Ú»ÿJü žßÌ,„Tûº‡}:úŒ€Ê\õð™.IRÝÊ·ùéè—o÷æðœ54 !Õ¾|›7FŸqPyEomÊ6^ø\—$©Nuöþ`ôˆ€‰óHòVXBjDÅšÛ¢Ï9¨¼ÎÁ>Ó%IªSã—j@ã>lX‚œ54 !5¢ÁFŸuPyƒ+ Ÿé’$Õ©ÞéSÑã&j´úºðù›58 !5¢î1_Œ>ë òŠî£)[´Yø\—$©. .Ý/z¼ÀD o>#|þf ÎBH¨½ã;£Ï:¨…Î Ÿë’$Õ¥á-gFv˜¨ñ“œ¢çoÖà,„ÔŒ¦æ¥"[}Þ@å .Û?~®K’T“Š5·Fv˜¨þ¹ËÃçoÖà,„Ô˜×}Þ@å5)[øœð¹.IRå[°IJ£Aôh€‰êøÕø<¿¹Y©1õNúZôyµÐYñ‘ð¹.IRÕË·ý™è‘×=ä/ÃgpÖà,„Ô˜Ú»½/ú¼€Z\²wø\—$©êuöýíè‘×Þë„Ïà¬ÁY©9-Ø8ÝG¢Ï<¨¼"_=ý˜›ðÙ.IR…ëõ…è‘7þ Ùèœ58 !5ªá 'GŸyP ý~7|®K’TåÆ/Õ€F)Š”-znø Μ…Uï´ÿ}ì@- Vî>×%IªrÃk‰ç0QEvøümz……šTgï߈>÷ ŠöC)[øœðÙ.IRUÝÿÃèq5ºçòðùÛô !5ªEÏMiЉ>û :ßúÃøÙ.IR[°IJÃ~ô(€‰^bü nx……šÖð¶s£Ï>¨…Áå+Âçº$IU¬½ÃÛ£Ç8LÜ`å^á3¸éBjZý³·ˆ>û Šî£)Ûüyá³]’¤ªÕ9èO¢Ç8L\ÿÌEá3¸éBjZ>}ö@mtþxøl—$©jõNý÷è×=æ‹á3¸éBjZùâ¦4DŸP ƒ«¾>Û%IªZƒK÷á0q?>ƒ›^a!¤&6ºû’èóêaÐIù’‡ÏvI’ªÔðöó¢'8L\{×÷†Ïà¦WX©‰õ¿¿}ôùµÑ=ìÓá³]’¤*U´Œß0qùò׆Ïà¦WX©‰u¾ý§ÑçÔÆð‡Ç…ÏvI’ªR¾õ¢G7LÞ°—²©ÂçpÓ+,„ÔÄò¥/O©EƒPÃþôlžï’$U¡Î=¹`âFÞ>ƒÕ²RsÝ{Eô9µÑ=úïÃg»$IU¨wÚFm˜¸áMß ŸÁjY©¹õÏß!ú€Úp¹—$iÝ\yHôØ€‰¬Ü+|«e!¤æÖ9øÏ£ÏA¨Ñ0åË_>ß%I*{£û¯žÚ0q㿞ÁjY©¹åË^á=B0‹zÇ9|¾K’Têm–Òh=²`⺇}*~+Y©ÑîýAôYµ1ºó¢ðÙ.IR™kïö¾èq !Ú{þzøVËBHÍ®ÁNÑg!ÔJ{Çw„ÏwI’ÊZ÷¨ÏGj‘/møVËBHÍ®{ðÇ£ÏB¨•þYKÂç»$Ie­ÿýí£G5L^¿²©yásX- !5;ï€ÙU¬¹ÍE_’¤§ixÛ÷¢G5LÜèþkÃg°ZÓY©ñî»*úL€Zéìýáó]’¤Òµ`ã”zYô˜€‰^büVg!¤Æ×¿pçè3je°r¯ðù.IRÙjïú‹Ñ#Bô/Ú5|«5…_÷¿Œ> VŠÎÃ)Ûüyá3^’¤2Õ=æ‹Ñ#BôNùzøVk: !5¾|ËW¥TÑç"ÔJ÷ÐO„ÏxI’ÊÔà’½£Ç3„ ?z«5…4~Ъ«£ÏE¨•á Ÿï’$•©Ñ}WFgÑÞí}ásX­é,„¤ñ{„.Ú5ú\€z R¾ü5á3^’¤R´øÓ³š(_öŠøY¬4ÎBH?ËùÐOFŸ‹P;½ã¿>ã%I*C}>=– DÑ}4|«õ£,„¤é÷½Ú{„`–î¼(|ÆK’T†Æ/Ó€&Ýûƒð9¬Ö²’o´êšèój§½ã;Âg¼$IÑ ®>"z$@ˆá ŸÃjý( !éñúî}>@íôÏ]>ã%I mj^*²UÑ#BôÏß!~+ýWBÒãuù‹èój§X{oÊn>ç%IŠª½ã;£Ç1„éÿ¥ðY¬Ö²’/_úò”ŠQô µÓ9èÃç¼$IQuýÇèQ a:ûÿ^ø,VëGYI?ÖèžË¢ÏH¨áµG‡ÏxI’¢\qPô(€0ùÖoŸÅjý( !éÇꟷmô õ3¤|ùkÃç¼$Iß=‰ F/›~—^ô,Vë¿ï%BÒ×9ð¢I¨¥Þ)ÿ'|ÎK’4éòíÞ=‚ ÌøiLѳX­'d!$ýXù’¥4ìGŸ•P;£Õ×ùd˜$©quü\ô€0ƒ+ ŸÅj=! !é'Ýq~ôY µÔÞë„ÏyI’&Ùà’}¢Ç/„é±0|«õ„,„¤Ÿ¨öÑg%ÔÒø—bÑs^’¤I6zðÆèñ aº‡}*|«õ„,„¤Ÿ¨³ßïFŸ•PKEoíôãY£g½$I“(ßög¢G/„jïúÞðy¬Ö²’~²E›¥4èDŸ—PKÝ£>?ë%Iš@½ãþ9zì@œ¢Hùâ†Ïcµž…ô o9+úÈ€ZÞö½ð9/IÒ$^{LôØ€0Å#w†Ïbµž”…ôõNŸŠ>3 ¶Ú;¾3|ÖK’4§-Ü4ÝG¢G.„Þ|züŠ·ªá.áóX­'e!$=U 6IE÷Ñèsj©è¬IÙæÏŸ÷’$ÍQýs–E[Õ;á+áóX­'e!$=MÃNŽ>7 ¶ºG}>|ÖK’4Wî¹,zÔ@¨Î>ÕzRBÒÓÔ;õߣÏM¨­Ñ…ÏzI’æ¢|ùkR*ŠèQ ¡òmß>“ÕzRBÒÓÔÞí}Ñç&ÔÚxÖFÏ{I’f»îŸ±«ßNÙÔFá3Y­'e!$=] 6NEû¡èãjkpÉÞñó^’¤YnpõáÑ#Bî½"|«õ”YIÏÐàš#£ÏO¨¯^–ò-^>ï%Išµm–ŠÞÚè ¡W}'~&+=UBÒ3Ô;ÏO¨µÞñ_Ÿ÷’$ÍVƒþ8z´@¸Þ Âg²ZO™…ô µ·kôù µ6ºÿÚ”MÍ Ÿù’$ÍFƒK÷‹­®óí? ŸÉj=eBÒ³T—ÕzÚ,„¤u¨βè³j¯{äß…Ï|I’Ö§þ¹Ë£Ç(”BgŸ…Ïeµž6 !iêì÷;Ñg)ÔÞè¾+Ãg¾$I3nj^*ÖÜ=F ò¥/ŸÍJO—…´.-|NJ½,ú<€Úëìó›ñs_’¤ÔÙ÷·¢Ç'”BñðásY­gÌBHZdž7ž}¦@í ®92|æK’4“—ì=> †×>—ÕzÆ,„¤u¬wò¿EŸ©P£aÊ·{KøÜ—$iZôÜTtÖDOO(…ñ{ØÃg³Ò3e!$­cí]~!úL€F蟷møÜ—$i]êòÑcJ£{اÂg³ZϘ…4“…®½7ú\€ÚÒ:_üÂøÙ/IÒ³4¼æ¨è± ¥ÑÞùÝá³Y­gÌBHšAƒ+Š>W zÇ)|îK’ôLåK_–Ò =2 †½”-Ü4|>«õŒYI3¨{äßE­ÐãKj¶`ãðÙ/IÒÓÕ=æ‹ÑãJctïá³Y­gÍBHšAùÖ¯>[ 1º‡~"|öK’ôtî¸ zT@i .ÿVølVëY³’fØèþk£ÏWh„Ñ]+Ãç¾$IOU{—Ÿ“P*½S¾>ŸÕzÖ,„¤Ö?‡èó£³ßï„Ï~I’~²þ…»DH(•Ί„Ïgµž5 !i†uV|4ú|€ÆÞxjøì—$é mþ¼T´Š‘P*ù–¯ŠŸÑJÏ–…4Ó6^Jývô ÑÞí—âç¿$I×=ê Ñ£J¥Xskø|Vk²’Ö£á§DŸ³Ðƒ>û%Iú¯Fw^= TW>ŸµnYIëQï¤ÿ}Î@sŒ†©½ýφÏI’Ú»ü|ôT€Òéúð­Ö:e!$­Gíß}Î@£ô/Ü9|þK’Ô¿h·è‘¥ÓÙïwÂg´Zë”…´žkn‹>k 9ú¹—”J’BË¿0ÝG¢'"”KQ¤|‹—†ÏiµÖ) !i=¬Ü3ú¸€F韽Eøü—$5·Þ _‰…P:£ÕׇÏhµÖ9 !i=ëüñèó¥è­Mù²W†ß$I lÁÆiôàMÑ£JgpÅAñsZi]³’Ö³|É‹Sö£Ï\h”þY‹Ãï’¤æÕ=ôÑ#J©wÒ×Âç´Z뜅´ o='úÌ€F¿»!_ú²ð;€$©Yî¸ z@)uöþ`øœVk³’6 Þiÿ}æ@ãôÏ\~$5§ñ/º€§0¦lñ ÂgµZ뜅´µwû¥èc§è<œò-^~$5£áµGG>(¥Ñ}W…Ïiµf”…´!MÍKÅ£÷DŸ½Ð8½Ó§âï’¤Ú×þæÛR*FÑcJipé~á³Z­e!$m`ƒË¿}ö@ã5þJH’4çõ/Ú-zä@iõŽû—ðY­ÖŒ²’6°îaŸŽ>{ ‘z§Ï¿H’ê[¾å«RêçÑãJ«½Ç¯…Ïkµf”…´åË^é h?˜ò-^~$Õ³þ÷¶ŽuP^Ã~Êm>¯ÕšQBÒ,4ºëâè#©Ö’ð{€$©žü+zk£Ç”ÖèîKÃçµZ3ÎBHš…úg-Ž>ƒ ™zYÊ—¿6ü. IªWýó¶‹žpPjƒ‹÷Ÿ×jÍ8 !ijïùþè3«á.áwIR}ÐÀ»ƒà™uúBøÌVkÆYI³ÑÔF©ÈVEŸÃÐLÃ~joÿ³ñ÷IR-êÿ›Ñ“ J¯½ÃÏ…Ïlµfœ…4K .ÿVô9 5¸âÀð»€$©úùë xvE¾:eSóÂç¶Z3ÎBHš¥ºßù«è³š«¥ö®¿~$U»þù;FO4(½áµG‡ÏlµÖ+ !i–Ê·xÉô#k€ÃëN¿H’ª[¾ÕëR귣ǔ^ï”ÿ>·ÕZ¯,„¤YlxëÙÑç14Zgßß ¿H’ªÙà’½£ÇTB{Ï÷‡ÏmµÖ+ !iëòõèómtÇže-Išqí]~>¥Ñ0zŒ@ù :)[ôÜðÙ­Öze!$Íbíß}$@ãuÿLø@’T­†7ž=¾ †·>·ÕZï,„¤YnôàMÑç24ZñÈ])[ü‚ð;$©uüXôè€Ê蟳eøìVk½³’f¹þ;EŸËÐx½3†ß $IhÁ&i´êê豕1þ EøüVZß,„¤Y®sÀ‡£Ïe ßNù6o ¿H’Ê]ïø/GO,¨Ž¢Hù²W†ÏoµÖ; !i¶[ôÜTôÖFÏÐxƒË¿/$•¶|‹—¦"_=® 2F«® ŸßjmPBÒ4¼ö˜èó(ŠÔÙëá÷IR9ëo›èI•2X¹WøüVkƒ²’æ î1_Œ>Ÿ€ñ'Øî8?eSóÂï’¤rÕÞáçRt£ÇTJ÷È¿ ŸájmPBÒ”oýúéO%ñºG|6ün I*QSóÒðæ3¢ÇTNû›o‹ŸãJ’…4Gî¹,úŒÆOŽËV¥|éËÂï’¤rÔ=òsÑ£ *§X{_ø Wkƒ³’æ¨þYK¢Ïiàqƒ‹w¿H’âË—¾|úƒÀÌ ®92|Ž«µÁYIsT{Ï_>§€ÿRŒR{Ï÷‡ß$I± .Ý7z"@%õNþ×ð9®Ög!$ÍUS¥"»?ú¬7ºûÒ”-Ø8þŽ I ©³Ïoz×+¬§ö¿>ËÕÚà,„¤9lpÙþÑg5ðcz'~5ü~ I hásÒhÕ5Ñc*©è<ìÃuóë‘…4‡u¾ýgÑç5ðcŠî#)ßúõáwIÒdë>=‚ ²†?<6|–«5+YIsÙæÏO©ßŽ>³€3¸ê;ñwIÒÄjïøÎ”èñ•Õ;ñ…Ïsµf% !iŽoЀréüñð;‚$i-Ø$îº8zì@¥µw~wüLWš,„¤9®{Ô¢Ïlà'kïMùÒ—‡ß$Is[ÿì-¢GTZ‘­JÙÔ¼ð™®Ö¬d!$Íqù–¯Ni4Œ>»€Ÿ0¸ü[á÷IÒÜÕÞóý~€ 4¸òð™®Ö¬e!$M áíçEŸÝÀSè|ûÏÂï ’¤9hñ Òè¢Ç T^÷˜ÿ?וf+ !iõNùzôÙ <…âÑ»S¾ôeáwIÒì6¸dïèµÐÞþgÃçºZ³–…4ÚÛ¿5úìžÆà’}Âï ’¤Ù«sПD¨…âáÛÃçºZ³š…4¡F÷_}†O¥(RgÅGÂï ’¤Ùy‡ëøå×À†\º_ølWkV³’&Tÿœ-£ÏpàiÞ“ò-_~_$m@S¥áõ'E¨îá?ß•f3 !iBµ÷üõè3xã_"fSóÂï ’¤õ«wÆ‚èQµ’oýúðù®Ö¬f!$Mª©¦?} ”W÷ØŒ¿3H’f\g¿ßMi4Œ#Pã×_DÏwµf= !i‚ Vî}–ϤŸ§öŽï¿3H’Ö½|›ŸNEvô€Zé_¸søŒWkÖ³’&XçÀ?Š>Ë€g1ºûÒ”-|Nø½A’´-Ü4 o?/zt@ítþxüœWší,„¤I¶h³TôÖFŸçÀ³èŸ»<þÞ IzÖÆŸ^fY1JùÒ—‡Ïyµf= !i ®92úHžM1J ¿7H’ž¾îwþ:zZ@-î¾$|Ϋ5'YI®{ÄßFŸéÀ:(òÕÓ賂¾;H’ž\{§wyúÌOLhÕ6 !iÂåË^‘Òh}®ë`tÇÞ'$I%+ßòU?úe0û:ûüfø¼WkN²’ÞtZô¹¬£þù;†ß$I·h³4¼ýûÑ£j«è>’²…›ÆÏ|¥¹ÈBH ¨{ì?EŸíÀ tÿLøýA’ßÔ¼4¸â è‘µ6¸ê°ø™¯4WYIåË_“Òh}¾3ø”\{‡Ÿ ¿CHR“럽4z@íuú|øÌWkβ’‚ÞzNôùÌÀhõu)ßâ¥áwIjbã_Ns¬(R¾ÕO…Ï}µæ, !)¨Þ‰_>â€ÞxJÊl~¤&5~±uö¢GÔÞèîKÃç¾Zsš…T¾õë§·î@µôÏ]~¤¦ÔÞñ©h?}ô@#ôÏZ>ûÕšÓ,„¤ÀFwœ}Îë¡{øgÂï’T÷ò­ßŠ5·Fùн>>ÿÕšÓ,„¤Àz'ÿ[ô9¬A'µ÷øµð»„$Õµ|ËW¥Ñªk¢O{hŒñ_äf 6 ¿¨5§YIåÛ½9ú¬ÖSñèÝÓŸ^¾OHRÝÊ—¾,î½"ú˜€F\yHø@­9ÏBH nt÷%Ñç=°žF«®Nù/ ¿OHRmÚüùixÛ÷¢whœîPšë,„¤àzßýèóØÃ[ÎJÙ¢ç†ß)$©òmþ¼4¼åÌècš§¥|ùkâïJs…\û›o‹>ò€Ùx¼ÂÔ¼ð{…$U¶…›¦áuÇGçÐH£».Ž¿ (M" !©î»2úÜ6Pÿì-Âï’TÉl<½XbôÏ\PšDBR ê±0úÜfA÷Ø ¿WHR¥Z°I\qPôñ ÖÞã×âïJ“ÈBH*Aíß}¥îwþ:ün!I•hásÒàêãOnh´"_²©âïJ“ÈBH*I£Õ×EŸÿÀlöRç[~·¤R·ùóÓðÆS£Olh¼ÁÆß ”&•…T’úg/>ÿ€ÙÒo§Î> ¿_HRË¿0 o>#ú¤ƽ>ä/ÂïjM, !©$µwû¥èó˜EE÷‘ÔÞý—Ãï’T¦òe¯L£»/‰>¢€±~{úƒÑ÷µ&–…T¢FÞ=€Y~w{§ÿ/üŽ!Ie(ßê§ÒhÕÕÑG3ð¸á ¿¨5Ñ,„¤Õ?kIôfY‘ÝŸÚ;¿'üž!I‘åÛ¾Éà dºGþ]øA­‰f!$•¨öÎÀ(ÖÞç/…$5¶ö®ïMÅ#wEÅÀ ¦å}OPk¢YI%ktßUÑã˜E¶júÃÑw Išd™~§P.ÛÏ¿'¨5ñ,„¤’Õ;}~ô<戥¤&Õ;ñ«)†ÑG/ðzÇ9ü® Öij’JVû›o‹žÀ\/…vù…ð;‡$ÍY 6Iƒ‹w>n€§S)ßæñw¥Ig!$•°ÑÝ—D`5©½çûÃï’4ÛåK^”†×}ÌÏ`t×ÅáwµB²’JXGÏ`®õ²ÔÙÿ÷Âï’4[å[¿!î¹<útžEï»ÿ~oP+$ !©„ÿdsü§›@ÍõÛ©sà…ß=$iCÿÕc±ö¾èSXíß~wP+$ !©¤ oÿ~ôl&aØKÝC?~÷¤õ­wÂW¦Ï2 üF«¯ ¿;¨–…TÒz'~5z>“R©w꿇ß?$i¦ï \yHô Ì@ÿœeáwµÂ²’JZ¾üµ)†Ñ3˜ þù;¤lj£ð{ˆ$=[ãGÍŒV]}l3ÔÞýWÂïj…e!$•¸áÍgDÏ`Â×™²E›…ßC$ééêñÙ”zYôq ÌPñÈ])›š~—P+, !©ÄuùbôœŒß%˜/{Eø]D’žÐ¢Í¦ÿ’¨¦þ…;Çß'”"³’JÜøAiØž@€Ñ}W¥|›Ÿ¿HÒ¸ööoM£{¯ˆ>€ ÐÙïwÃïj…f!$•¼áõ'EÏ HñÈ©½ó{Âï#’š]÷è¿OE÷‘è#ØE¶*e 6 ¿W¨š…TòºG~.z^ŠÞÚÔ9àÃáwIÍ+ßòÕixí1ÑÇ 0 <.N™…Tþò-^’Ò =3€Hƒnêö©ð{‰¤æÔ=ä/S‘¯Ž>ý€YÒÙûƒá÷ µÂ³’*Ðàê#¢g­(Rïô©”MÍ ¿›HªoùÒ—¥Á¾}⳨xøv?G(³’*PçÛ=7€’^w|Ê—¼8ü~"©~uöÿýéw—õÒ?w«ð{†Z¥ÈBHªB 7õ¸àGF÷þ åÛ½9þŽ"©mþ¼Ô?wyJÅ(úxæ@{×÷Æß7”Ê…T‘úí=;€)²ûSg¿ß ¿£Hªv?–Їn‰>Ò€92Z}]ø}C­Òd!$U¤öžïž@ÙŒ†©wÆÂ”Mm~W‘T­ò­_Ÿ—¯ˆ>Å€96ýóB îj•" !©BV_=C€Þ|zÊ·|uø]ERZ¸iêøÕTôÖF]À´w|güýC©,YIªwÆ‚è”T±æ¶ÔÞó×Ãï+’Ê[gßßJ£U×DWÀ„Œî¹,üþ¡V©²’*T¾íϤTѳ(«Ñà±GB,Ø8üÞ"©<åË_óØãáü,Ò;åë†Ú¬? IDATá÷µJ•…T±†·Ÿ=K€’ÞzNÊ·ycø½ERp 6I½ã¿”ŠÎšèc ˜´¢Hù¶oŠ¿(•) !©buý§èqT@Ñ~(u¿óWáwI1uþó4Z}]ôQ¨<ú>¢Vé²’*V¾ôe) ºÑ3¨ˆÁU‡¥|ËW…ßa$M¦ö¿6ýW‚@³ÿJ8ú^¢Vé²’*Øðš£¢g P!E¶*uùËð;Œ¤¹«½ÃÛ§ÀÞ¤Ñpú‚Ñ÷µJ—…TÑÇ?ÌÔàÊCüµT³ò­^—ï‘Òh}Ä%1¼é´ð;ŠZ¥ÌBHªb‹ž›ŠöƒÑ³¨ " uú|ʦæÅßi$­wù’¥þY‹SêeÑÇ P2Ý£¾~WQ«”YImúS€ëixÛ¹©½Ó»Âï4’f¾êøÕT¬½7úʨßNù/ ¿³¨UÊ,„¤ŠÖÙëÑ㨺Awú/ ²ÍŸ~·‘ôÌ÷Ø?{i*:GŸ@‰ .ÿVø½E­Òf!$Uµ©yiôàMÑ3¨â‘»R÷ˆÏzŒœTÂò-_zg,LE÷‘裨€Î¾¿~Q«´YI®ææÑ3¨‘á-g¥ö.?~Ç‘ÔJùvoNƒ‹wŸþK>€uQ¬¹5eS…ßcÔ*mBR…Ë·{KJE=k€: §ßU˜oõºð»ŽÔÄÚ;¾# .; ¥Ñ ú4*¦æ¢ð»ŒZ¥ÎBHªxÃ[ÎŒž5@õóÔ?wyÊ·xIø}GjÊ;BW6½”˜±¢Híí6üN£V©³’*^÷ð¿‰7@ÙªÔ;þK)[¸iø½Gª[ù’§Þ _I£Õ×G«7þÐxôÝF­Òg!$U½ÍŸ—ŠÎšè™Ô\ñðí©{ÌS¶`“øûTñÚß|Ûô_à퇢¿µ€šèñÙð;ŽZ¥ÏBHªAÓ/›˜Ð‹j-†¤õhj£ÔÙÿ÷Òð‡Çy(0«ŠÞÚ”/~aü}G©ìYI5¨½û¯DÏ aF«¯KÝ#?çQrÒ³”/MêòõT̹"»? ®:챿Úæáw0Mðp;½kúÿûàòÞ4FÿÌEñw1¥ªf!$Õ¸ÑEÏ(€‰­º:õÏß!uþxÊ·|uø}L³S¾äE©sÀLÿdxóé©è­þR˜¼Ñ å[¿!ün¦Ve³’j\÷¨/D)€P£û¯~”n÷ð¿Iù¶o ¿ŸiZ¸éô_»ï²ý wI£{.Ki4ŒþR7¼öèø»šR•³’êÜæÏ÷]€S¬½/ ¯;~úDIù²WÄßÙšÜæÏOíÝ%uýÇéÅÝøýPiÐþ2(¥ÎŽ¿¿)U9 !©æõÏß1zV”Úø‡¢Á5G¦Þ Sçà?OùvoIÙÔ¼ð{\­ZøœÔÞåR÷°O¥þ9ËÒðÚcÒèÁ›R*FÑÿû*a|wʦ6Š¿×)U9 !©æµw|gô¼¨œ¢ûhÞþý4¸dŸÔ;åë©óí?MíÞ>ý8³èû]i[°qÊ·{sêìÿû©wÜ¿¤þ÷·OÃëNH£Õ×O?ï€õ7¾“†ß÷”ªž…Ô€†·ž=³øÿÙ»óhIëúÎãº#•ˆƒ—5{LF\â’˜}cL&ã$1c4ãLbÆ8cާ»ow³5K³Í""›ˆ¬ ¤YdQ"‹4ÈÖ€ 4[ÓÏS{=¿9u…ŽH/w©ºßª_½^ç¼ýO­»ÔóÔù}úV% ÖÔÀѹã‚Ôºî¨Ô¼øÿ¥Æ?jÇì™Ê•»‡¿îh“ §þzª~ü;SãËÿ=5×,NíëM;/LÝGoO©ÓŒþéä©ÝHå~»Å¿Tõ BÒÔ{kæA«–ª'ÖMýuQgíÙ©uí©¹fIjœý7SeT?î©ö™ŸIå¯LŲŠ}¸lQ*W¾bê/Êk«÷Jõ/ünj|ù/§þõiï¯{Ú7œ:w_’ºkê³—¼½@ŒÞë²èóEMd‘AH‡&¦ªx$úÞÀj•©Ú¸>u¿+u¼!uî»jj„ißzfjßtJj_¿ú{}ã˜Ôºråö»öÈÿøïÜòÅ©ÏFêýïuî»rê¿»áÛ©zúÁ©ÿ_FCýØ·ÅŸ/*åAH“zÀèè~÷æðsEMd“AH“zï÷îm>`t4ÏÿŸá犚È&ƒ4Fuîº(úLCU{"+^~¦¨‰l2IcTýÔ?޾ÓÐúêþá牚È*ƒ4N-]ª§î¾—ÛÒi¥ò ×ÄŸ'*å”AH³š—NFß΀mhßtJø9¢&²Ë $Y寜úÀpª³gø9¢&²Ë $aµgGßÓ€-èÜweøù¡&²Ì $aõ#ú¾lAã´÷…Ÿj"Ë BÒ˜Ö}ø–è{ð}ª'Ö¥bé‚ð³CMd™AHÓç}4úþ|Ÿæÿ~n¨‰l3IãÚòSU>}zÔØ˜Ê½_n¨”k!iŒk]u`ô}H)µ®>8ü¼PYg’Ƹò ×¦ÔmGßë`¼u;©\µGøy¡&²Î $yíµgEßî`¬µ¿uFø9¡&²Ï $yõãß}¿€±V[ý«á焚È>ƒ¤Ô}ð†è{Œ¥îß?ÔÄXd’”gÿMô}ÆRã‹?ÔÄXd’”Še‹Rµéáè{Œ•îãw§béŽñçƒJãAHÒT­+ö‰¾ÿÀXiœóáðsAMŒM!IS•¼*¥N+úc¡Ú¸>“ ÃÏ516„$m®}ËéÑ÷A ÍûÇðó@MŒU!I›«­Þ+ú>Ù«ÊÇR¹b—ðó@MŒU!IÏ©»þºèû!d­¹fIø9 &Æ.ƒ¤çÔ8óƒÑ÷CÈVÕx:•ûî~¨‰±Ë $é¹M.LÕÓEß K­+ˆ?TÇ B’žWó+ÿ}_€ü´©<àUáçšË B’žW¹÷‹SU*úöYi]wTøÙŸ&Æ6ƒ¤-ÖºzUôýòÑí¤Ú!¯?÷ÓÄØf’´ÅÊ_R§}›€,´o<)üÌOãAHÒVkßø…èû$Œ¾ªJµ#~6ü¼OãAHÒV«ñsS7+`ö:kÏ?ë“*ƒ¤mÕ¹óÂèû%Œ´Úê½ÂÏù¤Ê $i[Õ?÷žèû%Œ¬Î]…ŸñI…AHÒtꮿ6ú¾ #©v̯„ŸïI…AHÒtjœñgÑ÷M9ÛÏ?Û“Šg2IÚ~K¤îãwGß?`tTUªý–ø³=iñ÷2IšVÍùßÑ·Píµg…ŸéIÅ÷e’4½–rCô}†_ÕMµ#!þLOZü„$M»ÖeË£o¥0ôÚ·œ~–'?AHÒ´+÷{YJÍ"ú~ ëÛIµÃ*ü,O*~ ƒ¤Õºî³Ñ·TZíO ?ÓŠ-d’4£j‡¼~ê_9? ÛNµC~"ü O*¶AHÒŒkßtJô­†Nû†ãÂÏî¤b+„$͸Þ{ ¦ª}€áÑi¥rÕágwR±• B’fUûÖ3£o±04zŸ½}f'ÛÈ $iVÕŽü…”ª*ú> ñÚõTøêð3;©ØF!I³®sûyÑ·Z×úÚaáguR± B’f]íèÿ}¯€XÍ"•+_~V'ÛÉ $iNuî¼0ú– aZ—-?£“Šid’4§j«5úž !ªâÑTîýâð3:©˜F!Is®sÏ¥Ñ÷^˜wÍó?~6'ÓÌ $iÎÕOxwô½æUwé˜Ü)ülN*¦™AHR_êÜweô=æMã´÷…ŸÉIÅ 2IêKõÏÿVô=æEwýµ©X²Cø™œTÌ ƒ¤¾Õ]]ô½®~ìÛÂÏâ¤b†„$õ­ú)}/€j¯=+üN*f‘AHR_ë>xCô=£ÛNµÃ*ü N*f‘AHR_kœþ'Ñ·eˆÖuG…Ÿ¿IÅ,3IêoK^ºß}o€¾ªš›R¹òñçoÒâÙe’Ô÷ê§þqôýúªyéÒðs7©˜C!I©»þÚè{4ôEU<’ʽ8üÌM*æAHÒ@ªþ7£ïÓÐs?~Þ&sÌ $i`uî½"ú^ sÒ}ô¶T,Ý1ü¬M*æ˜AHÒÀªû¶èû5ÌIý¤ß?g“Š>d’4Ð:w^}Ï€YéÜvNøùšTô)ƒ¤Vûì/§TUÑ÷n˜™N3ÕýÉðó5©èS!I¯½ö¬èÛ7ÌHëŠ}ÂÏÕ¤¢„$ ¼Úg~&¥n'úÓRm| •+v ?W“Š>f’4/µo:9ú>ÓÒøÒ_„Ÿ§IEŸ3Iš—ʃlê}W`˜uî¿&Kv?O“Š>g’4oµ¯_}?€­«º©vô[ÂÏѤb„$Í[å¯J©U‹¾­ÀõþAsôšT (ƒ¤y­uÍ¡Ñ÷uxžªþd*÷yøù™T (ƒ¤y­Üo·T5žŽ¾¿Às4/øxøÙ™T 0ƒ¤y¯uÅ>Ñ÷wجûÈÚTLî~n&Ì $iÞ+÷þáTmz8ú>SêŸÿ­ð33©p!I!5ÿõï£ïó:kÏ?+“ŠyÈ $)¦ÉRwÃÑ÷{ÆY«Låª=âÏÊ¤ÅƒÏ $)¬Æiå0Æš*üŒL*æ)ƒ¤Ð:÷]}ß` u¹uê]l¢ÏǤbž2I ­vÌž)UUôý€qRuSýØ·…ŸIÅ~wôK2Ô\³$þüKZWµqýÔsÁ $i(jœñgѯ ÈL÷ÑÛS±lQøÙ—TVL=&ŠÉÂŒ$õÞõsÿ5ѯÈEU¥úçÞî%-Ž­ª?5õ”˜Ø´|çð#I½j«÷šºQÀ\µ¿ybøy—T A½ÏÑê™(öyiøƒ‘¤gë¬=;úµ#®*Kåþ/?ë’Š!(UÝ©çÅD±ÿîáF’ž­vèO¦ÔnD¿f`„5Îúëðs.©†&n~^L¾&þIÒ÷Õúêþ¡/]»/™ú¼êè3.©‚Ê^¹ù¹1QöÆð$Iß_¹b—Tm| ô…£§jlLåAþB*ž©vÄÏn~~LÔV¿5üIÒÖøÒ_„¾x`ô4Îùpø¹–T QõÞµùù1Q;åÃ$m©Î½W„¾€`ttîYã­â¤ÅÏ­qúû7?G&êg}(üIÒVÿœ±Û}!À¨¼UÜkÃϳ¤bÈjœ÷w›Ÿ'‹þoø’¤­Õºî¨Ð ¿Æ¹ ?Ç’Š!¬uÙòÍÏ“‰æWW†? IÚZå¾?’ªrCè †—·Š“&¶ZûÆ“6?W&Z7žþ€$i[5Îûhè‹ †T³Håª?¿’Š!­sß•›Ÿ.íû®@’´Í–¼ uøFèk †OïóQÂÏ®¤ÅÃ[µqýæçËDwãƒáH’¶Wmõ^)UUè †GgÝeÞ*NZ¼&¦Tu7?g&z¬›&Å?0IšÁû]0¾ªæ¦T®Ú#ü¼J*†¸ÚaoxÎóf¢÷å¡o`’´½Ê•»§ªþTÔë †Dó_þWøY•T yÓÿäùƒPí ¿þÀ$i:5/údÔë †@çÞ+¦>s:úœJ*†¼ÖeËž?5.þTø“¤i5¹Sê>z{Ôë "5‹T;äõñgTÒâ᯽ö¬çB­›N `’4Ýê'þFÔK5ÎýÛð³)©‘ºßýüA¨óð­áL’fRûÖ3£^w sÛ¹ágRR1"•+vI©ê>JvÚ4¹(üJÒt+W¾"Uõ'ƒ^~0Ÿªâ‘T®Ü=üLJ*F¤ú ï~Þóè{ƒPJ©<òà$ͤæù›ï×Ì·ªJõ“~'ü,J*F¨æšÅ[„êç~4üJÒŒZò‚Ô¹ÿšù~ À/?_’hKvHÕë¦?µï¾$þAKÒªöÆ”ÚA¿F _ºT?þáçJR1ÂÕŽÙs›O³ç B©ÝLÅÞ/ à’4—š—Nð ýÔ\³$ü²vP¯Qè“κËR±tAüy’´xÄß.î©ûg>µï¸0þÁKÒ«ÿk)UÕ ^«0GÕÓ¥råîáçHR1âÕ{ûvŸo[„R§•Š}_þHÒ\k]wÔ^ªÐ—Ï úÜ{ÂϤbLÎA·<õÞ6îÜ„’4ç–ßÕï—+ÌQï3 ÃÏŽ¤Å´ü…©ª=1ûA¨½îŠø/B’úPýøw¦Tuûýš€YêÜs©Ï ’÷§Æ—ÿrZÏ»­B=åao ÿB$©µ¾vx¿^¯0UñH*xeøy‘TdRçþ«ç>5¯<(ü ‘¤¾½uÜcwöëu ³QuSýÄ÷ÆŸI‹ó¨vø›Rªª¹BÝM¦M“ ÿ IêGõãÞî­ãµ.[~F$cúÎHÛ„zêg| ü ’¤~պ湾n`:÷^ásƒ¤Åý«Üw×T57õoj¯»"ü‹’¤¾µü…©»á޹¾~`|n4Ñ÷š—|zFÏÃíB=åÑ{†a’Ô¯j«5¥ng¶¯_˜éç}þ7ÃÏ„¤"§–-JÕÓõjÝrFü'I}¬uÕA³} À ´.ß;ü,H*2«q·gü\œÖ Ôû—ôÅÁ?þJRßZöC©ûèm³x ÀtuîºØçI‹ûÜÒ³úXŒé B)¥æ×ÿ"%©Õ>ûK)uZ3¾p°}Õ“÷¥r¿ÝÂÏ€¤Üjœý¡Y='§=¥F‘ŠýÿSø*Iý¬uåÊY]<؆V™jGýbøÙ”]“ Sõ佄z%tõ¡ñ_¬$õ³e‹R÷á[fu`Ëgýuü¹”aÍó?6ëç匡Ԫ§âÀW‡Á’ÔÏjG½Ù[ÇôIëX ƒhÙ¥jãúy„RJíëWÇÑ’ÔçZ—¯˜õ…€ïéÜ{E*&w ?ë‘r¬yɧçôüœñ ÔûWôåªÿÂ%©¯-Ý1u¿óµ9]PÆYï/Ê•»ÇŸóHVø£©jnšçA¨÷'ß:3ü‹—¤~W®Ú#Usº¨Œ¥v#ÕŽÙ3ü|GʵöͧÎùi:«A¨§vâ{ÿ’Ôïg~pÎV€qÓ8çÃáç:R®ÕVï•RUÅ BïÞ’6-Yþ¤~×¾é”9_\Æ…Ï—&×Ò©ûà }y®Îzêiœÿ±øo†$õ¹rÅ.©ûØ}¹Èä¬û¯§bÙ¢ðó)ךþSßž¯s„ºåã©Øo·ðoˆ$õ»Ú±oM©ÛîÛÅ 7Õ¦‡§>è>úGʵrÕ§Ô*‡cêiÝtjø7E’QóÒ¥ý¹Òä¦ÓJõãÞ~~#eÛ’Rçž5}}ÚÎyê©òGñßIêwK^:ë.ïÇe +óþ.þìFʸÆ9îûó¶/ƒP÷©õ©ØûÅáß IêwåÁ¯KUýÉ~\*²ÐºæÐð3)çʃ,Uõ§†sêi]wtø7I’QãŒ?ï×¥`¤u¾ý¯©Xº ü¼Fʶ¥;¦Îý× äùÛ·A(UUªüûñß,I@ío~¾o—K€QÔ}dm*÷yIø9”s­ËW ì9<Ñ× Â¦GS±òáß0Iê{+^”ºîèç%`dTå†T;äõñg4RÆÕ{{JÝÎh B=í;.L›†à'Iý®vÌž)uZý¾l ·v=ÕŽ}køÙŒ”såþ/OÕSßèS¹ïƒPOã‚ ÿæIÒ j^òéA\6†SU¥Æ™ ?“‘²né‚Ô¹ëâ?2¥V#•G¿%þ›(IýnÉ RgÝe¹t ›Öå{ÇŸÇH™×ºúàyy>fê}žÐƇ|ž¤,+W§Ôå`(´×ž5õc£Ïb¤œkœñçóöœØ ÔÓ^÷Õ´iéŽáßPIêwõÏýú@?à R÷ëS±|çð3)çjG½9¥f‘Ç ÔÓ¼æððoª$ ¢ÖeË} ˜wÕÓ¦òÀW‡Ÿ½H9Wø£©Ú¸~^ŸÛ„zêg}(ü›+Iù<¡{ÖÌÇe`~4‹Tûì/ÅŸ»HWîóÒÔ}äÖyzÏË ”:­T;ñ½áßdIêw>OÈFÕMõÓþKøy‹”u“ SgÝe!Oñ‰y{ÏÉúÆTñóñßlIêsõÞå󄀑׼àÂÏY¤¬[º µo9=ì9>oƒPO÷©Rá½'%eXsÍâù¼œôU몃ÂÏW¤¬[²Cjßp|èó\lf»†ÿ$©Ÿ•ûßqY˜•κËS±lQø¹Š”s­¯îŸ†AÈ ÔÓ¹ÿë©X±KøB’úYí¨7§ÔªE]Z¦­ûÝ›S¹ÏKÂÏS¤l[²Cj]¹2 ‹°A¨§}ß5©Xþ¢øŠ$õ±Æ™Œ¼´lWµñTôšðs)ë1èk‡¥a:õ´×]á/…$eWûúÕÑ—W€-ªjO¤Úg~:üüDʶÉRûæSÓ° „z:ë¿‘Š}$þ‡$IýjÙ¢Ô}àÑ—W€çj×Sýø_‹?;‘rmù SçöóÒ0ŠA¨§óÈm©8àUñ?,IêS½?»®Ê Ñ—W€ï©º©qúûÃÏL¤\+÷{YêÜweVC3õt»+ïþC“¤~U?ñ½)u;Ñ—W€Ô¼àãág%R®Õ>óÓ©zb]fC5õt‹ÇRíØ·‡ÿð$©_5/údô¥s­« ?#‘r­þ¹_OUýÉ4ì†nšÒª§ú?þC”¤~5Œ"Œ‡öͧ¥bÉáç#RŽ5ÿõïSê´Ò(ÎA¨§ªRã+ŸÿaJR_Z¾sê>ôÍè++0f:w]œŠÉ…ñg#Rn­xÑÔØ:J†wzFë¦SÓ¦å;Çÿp%iŽ•¿.UţїU`Ltî¿zê©FŸ‰H¹U;ì©ûÈ­iÔ ý ÔÓyøÖTú†ð²$͵ú ïN©Û޾¬™ë½SI¹ÏKÂÏB¤Üjœñç©jlL£h$¡žnýéT?ýýá?lIškÍ >}I2Ö}ìÎT®Ü=ü DÊ©rï§öõ«Ó(™AhJU¥æÕ‡¦M“‹Âø’4—Úß<1úŠ d¨zòÞTøêð³)§êÇÿZªž¼/ºÑ„žÑùî-©<âç $iÖ-[4õ>¾ýR=ýPªòñçR.-aj]y@JÝNÊÁHBS:­ÔX³4mZ¼Cü/…$Í¢r¿ÝR÷ñ»£¯¦@ªú“©vÔ›ÃÏ;¤\ªÿÎÔÝð픓Ñ„žÑ¾çÒT®z}ø/‡$ͦڑ?ŸªÆÓÑ—R`„õÎjÇì~Î!åò¸Û7ž4õ6¹ùAhJ³–*mZºcø/‹$Í´ú)˜RÕ¾’£¨]OõÞ~¾!|K¤Æ¹IU¹!å*Aèû?[è˜_‰ÿÅ‘¤Ö¼øSÑ—P`ÔtZ©~òkH£^ýsïIÝïÞ”r—Õ 4¥ÛM­ëŽNÅ~/ÿ%’¤™4õ§¨ÓQuSãKÿ5üôÍè§íÐÛAèYݦƚ¥©Øç¥ñ¿¨’ô5/Œ¾LÁšk‡ŸQHÃ^í³¿œZ_;ÌG1lÃØBÏêÖ7¦æ5‡¦òðŸÿÅ•¤Í-Ù!µoüBô%âm⤭WüºÔ¼ðŸR÷áoE?UG‚Ah :÷=ÕÏþ©X±Kø/´$“ SgÝåÑ—F`žùË éù•½65/üDê~çë>na† BÛÐmlJ­?1ÕNú´iéNá¿è’Æ·rß]S÷‘[£/‹Àè<|kj^½*ÕNù£Tì÷òð'¤¼«Ÿð®”ÚèKÐg½·ÄŠ>w9üÔŽüùÔ8ãÏRëŠ}Rç¶sSõÄ=Þn„ ³áΩϪŸó·©<êÍiÓä¢ð'›¤¼j|ñ)UÝèËÐ'­Ë÷?ofÔÒSŸ{]î÷²T;ì ©¶z¯T?ù÷S㬿JÍ ?‘ZW8õ–oÝ®÷W?C 4ºÔyôÛSo3×X³$ÕO{ßÔPTì³kü“VÒÈÖü·ÿ}uú¤÷9)Ò(”ºíè§ ³dÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2gÈœA s!€Ì„2÷ÿÛ³ƒ`€óoºSQ áNAþy×ì2„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„â !€8C Έ3„¦í¢ø"’pêí=IEND®B`‚‰PNG  IHDR<F+ pHYsèèµ{Rk IDATxœìÝwÜåu}çýƒ4E£±¬Æ’ân4Qר1¶d³kbn“xÛn×–Øâ&îºÉ&»Ù5kÌN¥Ï(R„aA.X@:J“.¢T齿ÓË÷~œÙÎ S®ëúœóù=ŸÇëü‘‡×Ì\çË÷=sßi€¤Ñ_À|1x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒ2x€´  -ƒHËàÒšÁ3–Á?*½Ë+S•öá(ͽ_SªåO+Õ¢†‚kîöÒ2ºÿ†èï¨QuWiíõÊ𻀒¶|»É»}ÄKç´Å“»øàŽË'wóY1Õƒgxßu¥wáêÒ>ú£¥Zñ¢ø?p­µÖž¿YFÝýíõ={¾"üN µóóJûð÷—î¹»—Á­•i6uƒgp×KçäÏ–jå/ÇÿAêIk­úí2ªîŽþ¶€Úÿåcs·~7PMûü¯–Î)ÿTwÿ¤L›©<ÃêîÒ=oÏÒ\õ;ñXÚàZ_þÝ2j?ý휬}À[˨³&òÛX £GSÓ²mKû¸O•á7ÕoðŒß›3:˶ÿƒÐF×>ä¥ôÛß:ÀÞ{Mizÿ³¦¥¥ÛLÞ“?¸û§ùÏpÍ¥}ÌÇKµdËøßxmR£þ¼”a!¿m€M0¼ëÊÒÜù¹áw©úç–lõÈ¿øT÷$<ÃÁäçøªžÿ­M®sü§JÍÎ# î†·œ_ªíŸ~‡ªÇ¶ÓsKïâ¯,Ø£­ç}ð n»dòÆ¥ðßXmVoü'cfÐàúÓ½@ek®z}Ürá žá°t¿¿‹_KPçŸ4v`† ®:ÎLÓÙ’­Jç´¥ózל—Á3|øÎÒúêÛãµÙuŽý„± ô/Ü7ü^!Uë¨uÈ;çí1Ös>xúã6Ýõ—ÂÓ´ùuŽüÐäýW@½3·¿_HÕºZù’2¸éÜé<Ýsw/Õâ§Äÿfi³ëýcêžðwá÷ ©ZWK·)½ËÂÁ3–ÎÉÿÿ¤9©sä‡Èj4œüGô}CªÖÕâ§”î¹{NÑàö'ÏÓÿÑœÔ9üý>g²tKû€?¿wHÕzêœô¿§`ðô;¥uè»Ã34GßTÆÔƨyoiíñá÷©ZOo~z³?¯gÓÏpPÚ‡ ü7AsSû«4°@}Œî¿¡4w}Aø=DªÖS礈<ïxÃ[–Zû½¹ŒºoÖ70›†·^TªíŸ~‘ªõÔ=g·…<ÝÓ—†ÿ¢57µ¾ôê2jÝ·Éß@ÀìüôÛ>˜Teª[¼Eé]zð žÞE_ŽÿkNj}ñ×Ëèá;6éÈ¥wÞáw©Z_˶-ý¾7¿ƒgpëÅ“ÿ¡ð_¬6»æŠM~nàŸu¿ýßÂï(Rµ¾v}a>|×ü žagMiîþòø_¤6»æŽ¿X†w\¶)ç Ùø¡Tÿiø]EªÖSë ?)e4šûÁÓ>òÏÂqšƒ–oW7³©Ç Üø½½­Ý_g‘ÍÍC 6hðtÏß'ü¥9hÙ¶epÝ©›s50¼ûªÒÜñYñwiÑ:ZºMÜzÑÜ žáƒ7—j¹GÎ|‹ŸRúW5g Pƒ«Oðä6•i®¹ÏëJö7ð´¿þ¾ð_Œ6¿Þ9_˜«ó¨‰ÞÙ+Ãï0Rµžzì»yƒ§ÍIá¿m~ã?5—gP#ãþ*ü.#U먹Ósʰº{O¿]š»ý›ð_„6¯ö! ¿IÕcê~o§µžþ•džqÚ„Yºú„ˆã `bxßµ“Ä¿I‹©µ÷o­}ð´úHø§«wÎnçÀãô/;$ü^$UixÿÏ~~ðøìÙªsÌÇ¢Î4€ŸÓ9öá÷#©z´ÞyüàÜuUø¥ ¯µê·Kéµ"Ï4€ÇëV“)Eß“¤jü>žoý×Çžîùû„QÚ°š+^XFkn‹<ÎÖjxÇJµì©á÷%©õ¥W?~ð´ø¥ héÖepãÙ‘çÀzõ/Ü7þÎ$-~J6ïû—ÁSíúKñ_”ž´ÞÙŸ>ÞTû°÷„ß›¤þµ'O¾ÃÖýá_Œž¼ö¡ï*e4Š>¿žÔ¨yOiú u-Š­áêÉ÷ccpÓyá_ŒÖ_ó ¿ZF­GþI` ®=iò©÷Ñ÷(5j[÷”ÏM¾½K¾þÅh=-Û¶ o»8úÌØhoþ—ø»”J]ëùáÉ÷a£sò?†1Zwý‹ö‹>«6ýQÕ{¼<ü>¥F-kí÷æÉ·a£ýõ÷…1Z{£?}Ll–áÍ?(Õ’­ÂïUjÔ®ñûÈÆ­ý?ü‹ÑÏ×Úã7ʨ³&úŒØlÝÓ—„ß­Ô¨_Ë·›|ÿ5š{¿6þ‹ÑãÛþéex×£Ï&€¹1ì—Öê7Åß±TjÕ’­&ß~æ=þ‹Ñãê_zPô±0§†w_UªeO ¿g©Q«ÊpPÕ.ÏÿBô/uôy0/zßß%ü®¥F­*½viŒ¶-ú Ñ#5W¾Äçí¹´mß7„ß¹Ô¨MÃöC¥á¡¦¤%[–ÁgECójxçå¥ZºMüÝK¥ «{J#ú‹Ð#uO[}þ,ˆÞËÃï^jÔ¢Qó^ƒgjíû;¥ zÑgÀÂýhׇ۪ßÁÔHŸÁ3- ¾çêèc`A ︬TK·Ž¿‹©dÎà™‚<‚¨«ñôGßÅÔHÁ\çˆFŸ3qúÒÚóáw25ÒfðD?‚ºý@ô1jð³ïO V5O< ®>1ú|˜ o|2ün¦FÊ ž :Çýeô¹05ƼÞÜåùáw45ÒeðÔ\ñ¢2jÝ}®L•ñƒœ¢ïij¤Ëà Ȳ¬ÅhTÚ¾-ü®¦Fª žnüó©¬ÝðÞkJµì©áw65Òdð,`~” àÉuO_~oS#MÏ6øéw¢Ï€Ùølž=^~wS#EÏÕ9ö/¢€™1¸îÔðû›)2x æŠúQ6€Ô>ôÝá÷85f>ƒg\u\ôy0s†÷]ç*››Á3ϵ¿öŽè³`fuOý?á÷95f:ƒg>ÛþéeôÀÏ¢Ï €ÙÕk–æ~5þ^§2«<óXïÜÝ£€™×¿üðð{3›Á3Oµö~M)Ã~ôùBû€·†ßïÔ˜É žùhñSÊð–ó£Ï€4†w]Yª%[ÅßóTf-ƒgêžðߣÏ€tºßþ›ð{ž3—Á3Ÿ¹Ó~0ú<HgÔ¼§4w|Vø}O™Êà™ã|æÀüé}—ðûž3•Á3‡ùÌ€yÖo{LµÊÆdðÌQÍíŸQFÞ}¤×¿ìð»Ÿ3“Á3GõÎÜ!úµP£Qiíû;á÷?5f"ƒgj®|ÉäS€XƒŸ}/ü¨ÆLdðÌAýË~ÍÔNûÐw…ßÕ˜ú žÍ¬µú“V`a ïùi©–n~Tcª3x6§Å[”ÁMçD¿Öj«óÍOÇß U¦9ƒg3êù¡è×8@­ÖÜ^ªåÛ…ß Õ˜Ú žMmé6exßuѯq€Úëžô™ø»¡Ê´fðlbÝSþ1úµ Àø_yš÷–æÏ ¿ª1•<›Ps—ç—QûÁè×6êž¾4üލÆTfðlBý WG¿¦xŒQ÷áÉ_JGßÕ˜º ž¬µç+J¢_ÓáwF5¦*ƒg#êÿøØè×0ë3è–æn/ ¿7ª15<XëK¯ö¯;3 ñþáwG5¦&ƒgüä›Ñ¯]6Ä Wš_øµðû£S‘Á³µV½¾”Ñ(ú¥ Àê]°*ü©ÆTdðl@ƒ«OŒ~Ͱ±ïåùü¯„ß#ŸÁó$µö}ƒÝ˜A½óö ¿KªžÁó$ ®;%úµ À¦~.ÏŠ…ß'ÕÍàYOí/ÿ^ôË€ÍÐ;g·ð;¥¡<ëipíIѯQ6G¯Yš»S:ǪtŽø@iôöÒÚïÍ¥µêõé·Ks·]Z_üõGþïÕo*í¯þQií“ÿŸÎ7>Yº§|®ôÎýbé_vH\óÝ2¼ã2AÌ”á}×–jÉ–á÷M54ƒç±-ݺŒ¼)úµ°n£a=ð³2¸îÔÒ»`Õä/iÚ‡¾«´özUØrÇÿ»­}ßP:G~h2ŠÆƒhxçå¥ zÑ¿[?§søûãïœ* ™Áó˜:Gýyôkàq?o>¸î”Ò;kÅä|j}éß–jÙ¶ágå·t›É¿ÿu¨wþÞexç“Áixë…ñç£ÊBfð<¦áí—F¿šuÖLÆM÷ô%¥}ðŸ–æŠ†Ÿ‰óõ¯Aã‘êýù2¼íŸw„hðáç¡ –ÁóhíßýÚjd´æöÒ¿â¨Ò=áï&ëÏ”7W¼hòÞ¢ÁUÇ—Ò­¢ÿX€š\}bøù§Æ‚eð<ÚàÇ߈~í™õ;ü Î ÿ½´öxyø™7•-{jiöžÒ¿âÈRz­è?1 ³Ñ¨´öþ­øsOe!2xýÆ2ìG¿ô€dFÝRúí7¹ÄWÛ?=ü¬›µèóñ2¸ödïûæEÿÒƒÂÏ:5$ƒgü(êÓG¿æ€$ÆOz?d µÏëÂ϶,—=þ=5ï‰þã2éwJsׄŸqjÌ{Ï’-=ŠØì§©ŸBÖþòï•jññçZÖ–m[:Gtò„%€¹0~PLøÙ¦2ßÕ~ð´ù£_kÀ,tKÿG_Ÿ|ˆg]8zvõÊàúÓ£¿ €?B?úLSc^«ýàüä[ѯ5`†Œî¿¡tOùÇÒÜåùáç—¥µú<áÍã­MÔ9ú#ág™óZ­OsåKJ¢_gÀ´ ËàºSKçˆø×œi>7œýÌ ám‡ŸajÌkµ<½3–E¿Æ€iÖo—Þ«&oš>¯´aµ¿öŽ2¼ã²èï`Æ´ö{Køù¥Æ¼UßÁ³d«2zèÖè×0…F5¥wÞ¥¹òÅñg•6¾ÅO)c>VFÕÝÑßJÀŒè_~xüÙ¥2_ÕvðŒ?à‰O[ëžò¹ÒÜñYág”6¿æÎÏ+ý‹÷÷9>À“ôü%×¢¼Õvð ®>!ú¥LÑ¿èLMêÃASÖZý¦2¼óŠèo3`Êõ¾·cøy¥Æ¼TËÁ3þ©2ìG¿®€hƒÞäósQ[ÿ·ö¡ïžüGà±Z{½*ü|RcN«Ýàéž¶(úu,°ÁUÇ—æç%üüÑô5þ¾ÜtNô·(0Ezçí~6©1§Õnð ïúqôëXÀÇL·{oø¹£)oéÖ“‡WŒZ÷—jùvñg“Ê\U«ÁÓÚçuѯ!` ®ùni®xaø¹£Ù©sôGKéµ¢¿u)Ð9ö/ÂÏ$5æ¬Z žÞÙ+£_?À<u.ã?~Þh6kí÷æ2Zs{ô·1lxËùáç‘sV}Ï⧔у7G¿~€y4¼ù¼Òú⿉?o4óïëÞueô·3¬µÏkÃÏ#5æ¤Ú žöo~Ýó¨Ñ~“÷bDŸ5ÊQs‡_(ƒkOŠþ¶õ/Ü7ü,RcNªÍàé_¸:úuÌ×°ùáð3F [¶méÿè°èoq Àè¡[JÿÒƒâÏ!•¹¨ƒgüãlßýÚs†Â IDATæØðÞkJëK¯Ž?c”·Å[”Þ¹»G«óhÔYS7ž]zçíQ:Ç|¬4w{iüÙ£2—Õbð´V¿)úµ̱ÁO¾Yš;<3ü|Q=êµ"ú[˜ ýÎä½ó¿47­=~còÑgŒóZ-Oïû;G¿¼€9Ô¿xÿR-Ù*ülQ½êžüÙèo}`#ÖÜVúWUº'ü]iù÷Jµì©ág‰ ^-ÏðÎ+¢_oÀ\J÷¤?STߌ˜^£‡n-ƒ«Ž+ÝS>WÚ¾­4w|Vø™¡ÆT”~ðŒQ $0è–ÎQ~¦HÝÓ—F¿ öžø¾›Ö^¯ ?Ô˜ÚÒžî‰ýšæà?lãGËGŸ'Ò?çG¥a ºexë…¥wþÞ¥sÌÇKkÏWLH}¨13¥<ƒÎŒ~™›;vÆ?w=ç‰ôØ<½ æÁhT†÷ü´ôøµÒýÎßN<5~D|ôë]™.õàiîôœR†ýè—.°‰F‡Jk¿·„Ÿ%ÒZ[¼Eé_úÕè— Ì´ÑšÛËà'ßšü¨hûw–æÎÏ‹m«d+õàÿL'0›FíKk¿7‡Ÿ#Òz[ºu\}bôËf惢½ïFU@©Ïø1„Àlþ[kõÃÏiCjnÿŒÉû €ÇôÊð¶‹Kï‚U¥sì_<2n¼ïF‹bÊ;x–n=ùq`Æ º¥ýÕÿ'þ ‘6¢æ.Ï/£~ýêÀ÷Ý\]ú—:ù¼›É¿Îû¼-šžÒžöþÿ.úål¬ÑhòžèóCÚ”ÆO޵ˆ~Á¼Ÿ®;ÕûnTf¥´ƒÇç$Àìé~÷…ŸÒæÔ>è=,‡T¼ïFU‚ÒžÁϾ}FaüˆßèsCš‹Æ?Ò³û¾›KJÿÂ}KçŸ,­/ýÛR-Ù2ü5%U›YÎÁ³|»RúècØ@ãðUeªéAÑ/+xR£5·=òHè“?ûÈç-ß.üµ#UóPÊÁ3ù‘`&Œ¸ÑÏ+_Û?½ ïº2úåë~ßÍ.ÿ*þu"-Z˜RžÞY+¢Ï`CôZ¥µê·ÃÏ i>jíñrO %F·úù÷Ý,Þ"ü5!UA¥<ãç¾Ó¯sä‡ÃÏ i>ëù¡è—Ù “MìÿðàÉûÇ&?š¶t›ðï}©š¢Ò žæNÏž¼øé6~Slôy!-D½ó÷Ž~¹‘ÈèþëKÿòÃK÷Ä¿÷¾iQMOçëï‹>‹€'1¼ïºÉ§ÓGŸÒ‚´të2¼ù¼è—3hÔ~ð‘M;k×GßwóüøïgiÑì•nðø›4˜rÃ~i­~SøY!-dÍÏÿJ5ï‰~õ1õ„¾Øûn¤Es_ºÁ3¼ëÇÑG°ÝÓ—„ŸRDíCßýòcZ ûexÇJÿâýKçøO•ÖÞ¯)Õ’­Â¿G¥*i©Ïäý;£Qô1¬ÃðÖ ýG]µ®ÉÑ/CŒî¿¡ô/?¢t¿û?K{ÿߟ<¶<ú{QªjTªÁÓ>øO£Ï4`]† VíkîðÌÉgOQ£÷Ýìú‚ðï;©ªy©OïŒeÑç°½óö ?#¤i¨}àúi„,¼ïF*³PªÁ3¸ö¤è£X‹ÑÃw”掿~FHÓ’ì$ù¼›eÛ†/IjÔhð,Þ¢ŒZ÷G‡ÀZtŽø`ü!MSË·+Ã{¯‰~i²£5·•ÁO¾Uº§/}äGÓvzvü÷¤RëÁÓÚóÑg#°ƒ›Î ?¤i¬µß[|Pö”uzä}7ãM;âÞw#-ÊUšÁÓùÆ'£ÏK`-Ú¼5ü|¦µÞÙ+£_¢õ|ßÍøGÓ.ÚÏûn¤Eõ(Íàé_¸:úž`põ‰ágƒ4Õ-{jÞý“è—jþ÷Ý\r`é|óÓ<)réÖñî’ÊB–fðŒ?À ˜"£Qiíóºð³AšöÚ_ùžÚ6oï»yNøŸ¯¤Fx)Osûgø9h˜2ý+Ž ?¤Y©ÿ£Ã¢_²3gÔ~  ®=¹ôÎÜ¡´}wiîúK᎒SYŠÁ3~0]Z«^~6H³RsÅ 'XÉ:ôÛexó&ŸçÕ9ú£¥µÇ˽ïFR©Õàéžø?¢bà1ן~.H³Öø³]xÄèþëŸðy7O ÿó‘Ô˜ÙR žþ%DŸÍÀc´þ“ðsAš¹–lY†·_ZêÆûn$Uó\ŠÁ3¼õ¢èóxÔðÎ+ü¨‰´‰µö}C)£aÉjÔYó/ŸwsÌÇJs·—†ÿžKj¤oöÏ’-Ké5£ÏpàQc?.H3ÜøóaRöy$ô.ãÿó£Ÿwó”ðß_IÚ5óƒgüÆE`:Œ¾³TK· ?¤Ynü#]£êî2SFÃÉç MÞwóí¿)­ÕotH*ÓÒÌžÎáï>æGõÎÚ5üL24 Ól´æöÇ¿ïfçç†ÿžIR•uðôÎX}îÿüA£»¿,üLR´d«2¼ëÇeßw3ùÑ´èßIZT£Á3¸ê¸èÿ“GQŸ~H™jöžÐ÷ÝŒ =ù<-ﻑ´h¶›ùÁ3~V?¯sä‡ÃÏ)[ãÏ´šïGB÷¯8ê_>ïfùÓÂÍ’TÍq3=xšÛ?#õã;aVŒ (Í}­}^7gÿûù÷Ý $I’ªlƒ§¹Ós¢ïzP{ý‹¿~H’$UGRC¼Î‘ ? $I’ªŒƒ§sôG¢ïzPo£QiîúKág$IR•qðŒ?)ˆ3¼ëÇáç€$IRÚÁÓÿá×¢ï{Pk½ ö ?$I’ª¬ƒgxóyÑ÷=¨µÎ ?$I’ª¬ƒgüIÓ@äûw^~H’$U)Ï’-Kö£¯|P[û¯Š?$I’%<Í•/޾ïA­õxpø9 I’Te<­}ß}߃Zëžô™ðs@’$©Ê:xÚ‡½7ú¾µÖ>èíáç€$IR•uðt¿õ×Ñ÷=¨µæŠ†Ÿ’$IUÖÁÓûÞNÑ÷=¨­Qóžð3@’$©Ê¨­áí? ?$I’ªÔƒç°÷Fßù ¶?ývø I’Te¨­Î±~H’$U™OÿÂ}£ï|P[ã÷ÐEŸ’$IUêÁsÅQÑw>¨­öo ?$I’ªÌƒgpýiÑw>¨­Öê7†Ÿ’$IUæÁ3¼íâè;ÔVk¯W†Ÿ’$IUêÁs÷O¢ï|P[Í•/ ?$I’ªÌƒgôàMÑw>¨­æŽÏ ?$I’ªÔƒ§yOôêi4*Õ’-ÃÏI’¤*óà)Ý*úÚõÔ­Â_ÿ’$IUêÁ³x‹RFÃèkÔÒèá;âÏI’¤E™ϲ§Fßù ¶†÷]H’$-JÿËÑw>¨-ƒG’$U3ØL žÖ/¾óAm<’$©šÁfkðìóÚè;Ô–Á#I’ªl¶Ï~o‰¾óAm ï½&ü $Iª2žöWþCôjËà‘$IÕ 6[ƒç€?ˆ¾óAm<’$©šÁfkðø¶è;Ô–Á#I’ªl¶ÏAo¾óAm<’$©šÁfkðü'Ñw>¨-ƒG’$U3Øl ž¯½#úεeðH’¤j›­Ás転ï|P[£n ?$I’ªÔƒç°÷Dßù ¶Æ‡Eô I’T¥<_ÿÿ¢ï|P_ývø I’Te<Ãÿcô•j­Z²Uø9 I’T¥ $I’ªŒƒ§søû£ïzÀøÑÔ;=;ü<$Iª² žÖê7Eßó€ñ£©W½>ü<$Iª² žæÊGßó€ñ£©üPøy I’Te<Õ’-Kö£ïzP{ÝSÿ)þ<$IZ”mðŒ¿øo޾ëAíõ/9 ü,$Iª2žÁMçFßõ ö?û~øY I’Te<ý+ŽŒ¾ëAíº5ü,$Iª2žÞ9»Eßõ€Ñ¨TË· ?$I’ªlƒÇ‡ÂthíóÚðó@’$©Ê6xÚ‡½7úžLMýáðó@’$©Ê6xZ{¿&úž”Rzg,?$I’ªlƒ§¹Ã/Dßó€ñ£©¯8*ü<$Iª² žÉ/ u_ô]joxçág$IR•qð o»8ú® º¥Z²Uøy I’Te<ý+޾êã'µíþ²ðó@’$©Ê6xzg¯Œ¾ç¥”ö¡ï?$I’ªlƒ§û­¿Ž¾ç¥”îÉŸ ?$I’ªlƒ§}ðŸFßó€ñ“Ú.=(ü<$Iª² žÖž¿}ÏÆOj»å‚ðó@’$©Ê6xªeO-e4оëAí:•jññg‚$IÒ¢Lƒgü‹xèÖè»PJi®|Iøy I’Te<ƒÎŒ¾çã'µ}õÂÏI’¤*Ûàé_ôåè{0~RÛwþ6ü<$Iª² žîIÿ}ÏJ)½ V…Ÿ’$IU¶ÁÓ>ì½Ñ÷< ”É—FŸ’$IU¶ÁÓÚëUÑ÷<`ü¤¶‡ï ?$I’ªlƒ§Z¶m)£aô]?©mççÆŸ ’$I‹2 žñ/äÁ›¢ïy@)¥õåß ?$I’ªlƒgpÝ©Ñ÷< ”Ò9î¯ÂÏI’¤*Ûà? ˆ×;oðó@’$©Ê6xº'þ}ô=˜<©íŒðó@’$©Ê6xÚ‡¼3úžŒŸÔÖ¼'ü<$Iª² žÖî/‹¾çj®xQø™ I’Te<Õ’-Kéw¢ïy@)¥}ðŸÄŸ ’$I‹2 žE2¼óŠè{PJéžü¿ÃÏI’¤*Ûàé_qTô=(¥ô/;$ü<$Iª² žÞË£ïy@)exÇÂÏI’¤*ÛàéõgÑ÷<`lÐ-ÕÒmÂÏI’¤Tƒ§µÏk£¯yÀ£Z_zuø™ I’”jðTËŸVÊh}ÏJ)£?&H’¤R÷r žñ/èþ¢ïy@)¥wÖ®áç$IRºÁ3¸ú„è{0~ÏÕ'†Ÿ’$IéOïœ/Dßó€RÊè¡[ÂÏI’¤tƒ§sÜ_Fßó€G5wzNø™ I’µ.Ýàií÷–è;ð¨öo ?$IR£Ö¥<Í~¡”Ñ(úž”Rº'ü]ø™ I’µ.Ýà™ü¢¸1úž”Rúï~H’¤F­K9x?ýNô=(¥ o9?ü<$IZ—rðŒ?ÿ˜ݪT‹Ÿ~&H’¤FmK9x:G4úš<ªµûËÂÏI’Ô¨m)OkŸ×Fßñ€Guÿág‚$IjÔ¶”ƒ§Z¶m)Ã~ô=(¥ôÎX&H’¤R×ržE2¼ûªè{PJ\u\øy I’µ-íàé_ytô=(¥Œ¼)ü<$IÚ–vðtOÿÿÙ»ïpKï²Ðû+ º(R< €òªØ^Ñ#ˆ °€€Gà`E="zDÌÅ;{J&mÒHô^&t’IBH%½‡„žI2éeVo¿÷Z›œL¦ì½öZû^ë÷|>×õõâÿس×óÜûwÏìõ¬EÑç< ¯²ãëÃg‚$I*²lžúq}Æúj‡$|&H’¤R!Ëvá©îñ³Ñg< ¯qÞ×Âg‚$I*²lžòÔf©[6úœ¤”Z7¯ˆŸ ’$)±|ž¥Ô¾ïÒèsRê<þýðy I’J…,ë…§yå>Ñç< §ÛM•¥¯ Ÿ ’$©T¸²^xêßüÛècÐW;ø·Ãg‚$I*®¬žêò÷GŸñ€¾ÆÙ_ Ÿ ’$©T¸²^xÊ‹_šR»}Îz.¸þˆø™ I’RÑÊ{áYPJÕ7GŸó€Þƒ ¹)|H’¤RáÊ~áiÝpTô9èé´RyÉËÂg‚$I*ªìžÆ·þ#ú˜ôU÷ÿÕð™ I’J…*û…§v؇£Ïx@_ýô/…ÏI’T*TÙ/<•_}ÆúZW>$IR©Pe¿ðLÿ!Ÿy úœôÞÆ³êêðy I’J…ª Oûö3¢Ïy@O«–Ê‹¶ Ÿ ’$©T˜ ±ð4/Ú.ú˜ôU÷ý¥ð™ I’J…© O}Å'£Ïx@_ý”ÿ>$IR©0bá©ìþöè3Ð×¼bÏð™ I’J…© Oyj³Ô­=}ÎRJíû.‰Ÿ ’$)¥b,<½Ü{qô9H)ukRyjóð™ I’J…¨0 O󊽢Ïy@_uÏw†ÏI’T*D…Yxê§þMô諟ðÙð™ I’J…¨0 Ouùû¢Ïx@_ó’eá3A’$• Qažòâ—¦ÔnFŸó€Þƒ î¾ ~&H’¤T„гð,(¥Î#7EŸó€Þƒ jOO?=1z&H’¤Röjái]xô9èóàI’Tž‡ µð4Îü—è3ÐW?é¯Âg‚$I*e_¡žê¿}ÆúšWì>$IR)û µð”oíÁ0&Ú÷_?$IRʽb-<½<|Cô9èiVSyÑVá3A’$•²®p OëÚƒ£y@_uß÷„ÏI’TʺÂ-<õÓÿ1úŒôÕ¿ùwá3A’$•²®p Ouÿ_‰>ã}­k Ÿ ’$©”u…[xÊ‹^’R«}ÎRJ‡¯Ÿ ’$)å\ñžÞƒ V]}ÎzÚÍT^ò²ð™ I’JÙVÈ…§uõþÑÇ< ¯÷ùXÑ3A’$å[!žÞ¥ñÐ8ëËá3A’$•²­ Ou¿_Ž>ã}­Ž Ÿ ’$©”m…\xÊ ·œþÐC ^ç±Ûãg‚$IJ¹VÌ…§÷à‚¾}ÎzºÝTÙþÕá3A’$•²¬° OóÊ}¢y@_íÐ…ÏI’TʲÂ.<õS¾}Æúç}-|&H’¤R–vá©îó Ñg< ¯uëIá3A’$•²¬° OyjóÔm¬‰>ç½·ñ<}_üL$I)ÇŠ»ð,(¥ö}—FŸó€¾ÊNoŸ ’$©”]…^xš—#úŒôÕŽúÃð™ I’JÙUè…§~Òç¢Ïx@_ãÂEá3A’$•²«Ð Ou¯Ÿ‹>ã}í;Î Ÿ ’$©”]…^xÊS›¥ní™èsÐ{pAù±ø™ I’Rn{áé=¸àžoGŸó€¾Ê®o Ÿ ’$©”U…_xš—ì}Æúê+>>$IR)« ¿ðÔûóè3Ð×û ˆè™ I’JYUø…§²Ë›£Ïx@_ïWL£g‚$I*eUážéo³«¢Ïy@O£œÊ · Ÿ ’$©”MžÞƒ n;5ú˜ôU÷}OøL$I¥l²ð,(¥ÆÊm£Ïx@_ýô/…ÏI’TÊ& Ï‚Rªö»Ñg< ¯uÝaá3A’$•²ÉÂÓ{pÁÒmRê´£Ïy@J©óØ÷Âg‚$I*e“…§_çÑ[£Ïy@O·›*;¼&|&H’¤RYxúõ~µ#~?|&H’¤RYxúÕOÿÇè3Ð׸pQøL$I¥,²ðô«._ôèkÿœð™ I’JYdáy¾E[¥Ô¬DŸó€ÞÛxªO¦òÔfñsA’$¥IϳVíû/‹>ç}Õ=ß>$IRiâ³ð¬Uóò=¢Ïx@_ýä/„ÏI’Tšø, ÏZUv[ôèëç½ }îáð™ I’J…g=už¸3úœôUv}KøL$I¥‰Í³žZ7}ÆúêÇÿEøL$I¥‰Í³žgÿkôèk^¶[øL$I¥‰Í³žªüzôèkßYøL$I¥‰Í³¾¿4¥V=úœô´j©¼è%ñsA’$¥I̳:«®Ž>æ}Õý5|&H’¤ÒDfáÙ@Í+÷>ã}³¾>$IRi"³ðl úÉ_ˆ>ã}½''FÏI’TšÈ,<¨ºç»¢Ïx@_çÉ»Âg‚$I*Mdž 5µYêVŸŠ>ç}•eoŒŸ ’$)MZžÔ¾keô諯ødøL$I¥‰Ë³‘š->ã}ÍË÷Ÿ ’$©4qYx6Rí˜GŸñ€¾ÎƒW…ÏI’Tš¸,<©²Ó¢ÏxÀóÚÍT^òòð¹ I’J•…gSß §ï‹>æ}µC?>$IRi¢²ðl¢Ö-'FŸñ€¾Æ Âg‚$I*MTžMÔ8÷«Ñg< ¯}ç·Âg‚$I*MTžMT;ø·£Ïx@_·þl*/Ü"|.H’¤ÒÄdáÙTK^žR§}ÎúªûþRü\$IiR²ðÌ Î#7FŸñ€¾Æÿ>$IRib²ðÌ Ö5FŸñ€¾ÖÇ„ÏI’Tš˜,<3¨þÍ¿>ã}Ý§ï Ÿ ’$©41YxfPuŸ_Œ>ãk©ìòæð¹ I’J‘…g&Mmžºõç¢Ïx@_ýøOÇÏI’”&! Ï kßûè3Ð×¼b¯ð™ I’J‘…g†5/Y}Æú:]>$IRi"²ð̰úŠOFŸñ€çuZ©²t›ð¹ I’JcŸ…g†õÞ$ ŒÚá¿>$IRiì³ðÌæ›õìªè3Ð׸pQøL$I¥±ÏÂ3‹Ú·}ÆúÚw­ Ÿ ’$©4öYxfQcå¶Ñg< ¯ÛX“Ê · Ÿ ’$©4ÖYxfQíÐEŸñ€µT÷{oø\$I¥±ÎÂ3‹zO…Jvôèkœõåð¹ I’Jc…g–uVß}ÆúZ7>$IRi¬³ðֵ̲‡DŸñ€¾Þ“£g‚$I*užYV?íï£ÏxÀZª{üLø\$I¥±ÍÂ3˪û¾'ú|¬¥þÍ¿ Ÿ ’$©4¶YxfÛÂ-¦‡ÿ%$u IDAT Œ‡Ö GÅÏI’”Æ5 ϵï½8úŒôuŸy |&H’¤ÒØfá æ¥»DŸñ€µTv[ø\$I¥±ÌÂ3@õŸŒ>ßk©ŸòÅð¹ I’Jc™…g€*»¼9ú|¬¥uýáásA’$•Æ2 Ϡ߸gWEŸñ€¾îÓ÷†ÏI’TË,<Ö¾íÔè3°–Ên?>$IRiì²ð Xcå¶Ñç;`-õ“¿>$IʵÊÎ?‘ÊK^þu ’…gÀj‡~(ú|¬¥uÝ¡ásA’¤,Úî©vÐRãìM­ŽLGoM©ÛMÕåï‹ÿÚÈÂ3`•¥Û¤ÔiGŸñ€¾Î“w…ÏI’&®…[¤êÞïNõ“?ŸšWì™Ú÷]šR»±ÞŸµ½%(üë ÏꬾeÞuÀ†Uv}kø\$iœ«,{cªýÇ©qá¢Ô¾ëü”š•ÿœ­öáð¯, |.H’4.ﻦÆy_‹ÿž …gŽÕW|2úÚÖÒyüŽð¹ IÒŒÞwÓª§IÒ¸paü÷q€,÷Pôõ¬¥~ÂgÂç‚$©8U–¾ò‡ï»éýjÚ-'ŽÕûn†©yɲðïõ Yx†Pû¶S£¯?`-ÞÇ#IYK^–ªýfjœý•ÔºéØéD(Šæe»ÇÿÈÂ3„+·¾þ€µtžüAø\$åQe÷·Oôûn†©yù7Â_A²ð ¡Ú¡оþ€uTv[øl$MðçÝô ]}*úÇÙXi^¹Oøk4HžaÜK·I©Ó޾ >M’õ¾›G¢t½æUËÃ_·A²ð ©Îê[¢¯A`-­›Ÿ ’¤1ú¼›Þ#¡Oû‡µ>ï¦ý£jâ´®90þµ Ïj]{Hô5¬¥7ÜÊS›‡ÏIÒ8¼ï¦ýc) ­k mÉÂ3¤zcŒ—êò÷…ÏIÒ|¿ïæÉè?Ùj]xøë=Hž!UÝ÷=Ñ× °ŽÆy_ Ÿ ’¤á¾oúGﻹáÈÔ}êžè5…Òºá¨ðk`,<ÃjáY|‚.ä¤}×ÊøÙ I¬…[þð}7'~ú½#Þw¯uÓ±ñ×ÅYx†XûÞ‹£¯C`mÍj*/Þ:|6H’6ÑÔæ©º×ϧúÉ_HÍ+÷M¯J©Ýˆþ)Â:Z7­ …gˆ5/Y¶îu«þ{á³A’´‰÷ÝTžˆþqÁ ´n<:üÚ$ Ï«÷g3¹V€yÔ¼x§ðÙ IEnÝ÷ÝLÿj©uýá×Ó Yx†yC/{côu¬£óеá³A’ “÷Ýd­uÝañרYx†ý }ú¾èkX[·“*;¾>|6HR®Ù[?þ/þûónšÕè©Ïµ®=8üš$ Ïkݼ"úZÖÑûa=$)¿÷Ý<=Þ™g­k ¿ÉÂ3äçü[ôµd2 %)ªÊv?æ}7¼Hóªåá׿ Yx†\õ€_ñÕ„ê>}oøl¤IxßMïWÓzï}ô¾Ö§yå>ñ×ëYx†Ý¢—¤Ôª­÷"âTv{ü|¤1úÕ´æ%;{ß ³Ò¼b¯ðëw,<#¨óÀ³»z€‘«Ÿþ¥ðÙ Ió]eûWOÙÞwS~,z3Áš—ï~M’…gõ.`¼´n=)|6HÒÈßwsÈï¤Æ¹ÿ9=óºÏÜ=zÉLóÒ]ïóA²ðŒ úñŸŽ¾ut«O¦òÂ-Âçƒ$ í}7û½7ÕOÿÇÔºîÐÔY}KJvô¨%sÍ‹–Æ_ûdáA•]ß}=ëQ=ð7Âçƒ$ ç}7•è‘J5ÎÿÿÂï…A²ðŒêûìªèkXGó¢íÂgƒ$mªÊö¯ò¾ÆRã[ÿ7üþ$ ψjÝzrô5 ¬£÷¨ÕèÙ I/h»W¼øónºÝèq ëÕ8ãŸãï™²ðŒ¨Æ¹_]ÿ•ÄévSeÙO…ÏImá/ø¼›é_Mk7¢'#ÌXýÔ¿‰¿ÈÂ3¢jÿÖ̯`ÞÔOýëðù ©Xï»™þÕ´»Î÷¾&^ýÄ¿ ¿¯ÉÂ3ªoíom` y<µ¤‘½ï¦÷«içýWÿ}7F;ºÚq~¯ ’…g„uV]}]ëèÖŸMåE[…ÏIÜ¢­Ruùû½ï†Â©ù±øûo€,<#¬ùݽ£¯K`=j‡~0|>Hš¼ï&þç§…g„ÕOü_ÿ}…c£yé.áóAÒxVÙí¤ú ŸIÍËvKíû.I©QŽY06ªúyvžM`üô~ý$z>HН²ô•/|ßÍšÕÑã ÆZuïw‡ß·ƒdáõ7øÙ£¯M`=z!=$ÍcÞwsVÙåÍñ÷òYxF\ë–ç~uC×8ãŸÂ烤y|ßM«=v`âU–n…gÄ5ÎþJôµ ¬GûŽ3Ã烤|ÞMïWÓªOEÈO·“ÊS›‡ßïƒdáqÕý%úòÖ§YIå%/ Ÿ’«ñ­ÿð¾˜GÝÚ3á÷ý YxFÝÂ-S·±&ú2ú<I¥é¿´æO÷™ÂïûA³ðÌCí{¾}ëÑû¬¬èù i€o=> p:«o‰¿÷ÌÂ35/Z}ëÑ}êžðù iöUvySôø€Âißyø½?hžy¨väD_£ÀT÷ú¹ð!ivU÷ùÅèÑ…Ó¾ó[á÷þ Yxæ¡Êö¯ž~²0~ç}-|FHš]µC~'zt@á´n9!üÞ4 Ï<ÕY}sôu ¬GçÁ+Ã烤ÙU_ñÉèÑ…Ó¼j¿ð{Ð,<óTëꢯS`}ºÝTÙõ-á3BÒÌ«ŸöÑ“ §ùí%á÷þ Yxæ©Þ§=ã©qæ¿„ÏI3¯±rÛè±…Ó8ëËá÷þ Yxæ©Êîo¾N hß}aøŒ4óš—î=6 pê'þeø½?hžùüf?÷pôµ ¬O§•*;¾.|FHšY­ë‹žP8µ#>~ïš…gkÝzrôµ l@ýÔ¿Ÿ’fVûî ¢GNu¿÷†ßûƒfá™Ççü{ôµ l@ûö3Âg„¤™ÕyâÎè‘…SÙåÍá÷þ Yxæ±ê¿}­Òª§ÊÒmÂ焤M4µYJÍjôÄ€Â)/Þ:þþ0 Ï|¶h«”š•èëØ€úñŸŽŸ’6Ze§7D (œncMø½?—,<ó\ûž‹¢¯Y`Z7¯Ÿ’6^uùû£GN÷éûÂïý¹dá™çzÚŒñß`Mð?ÙKE¨vÜŸE (œÎW„ßûsÉÂ3ÏÕûpô5 lDíè? Ÿ’6\ãì¯D (œÖ­'…ßûsÉÂ3ß-yyJíFôu l@ëÚCâ焤 Ö¼l·è1…Ó¼b¯ð{.Yxjßyôu l@o(–n>'$­¿Ö-'F (œÆyÿ~ïÏ% O@Í‹wоn¨úÁð9!iýuº6zD@áÔOþ|ø½?—,<ÕŽüƒèë؈ÖÕû‡Ï Iëijó”åè…S;ìwãïÿ9dá ¨÷ᆩӊ¾v èVŸLåE/ Ÿ’^XuŸ‰PHÕ=ß~ÿÏ% OPU×D_»ÀFÔŽùxøœôÂjÇ|"z4@!U–n~ÿÏ% OPÍËv¾vð!¤ÒøÕX¹môh€b~FÝ‚ÒDgá ÊßRÁ˜kV&þo´¤ÜjÝxtôd€Âé<~Gø½?×,+$•RíØ?‰PHõ>~ÿÏ5 O`•ÞR·}ÑyàŠðY!©”šßÙ>z@!Uøµðû®Yx‚ë/¤¢UÙù'£o}(¬Úa¿>†‘…g ªlÿê”:íèkØ„öý—‡Ï ©hÕÿtô­…UÙåMá3`YxƤΪk¢¯i`ªûüBø¼ŠTëêý£o{(¤ncÍô#á£gÀ0²ðŒIÍKv޾®h^±gø¼ŠT÷©»£o{(¤ÎC׿3G,<ãQíðD_×À tkO{x4OùüˆÓºéØð0¬,<ãÒâ­SjV£¯m`ê'}.~fH¨qöW¢ow(¬Æ… ÃgÀ°²ðŒQí»/Œ¾¶hß{qø¼ŠPûûçDßîPXõ>>†•…gŒjœÿõèk˜‰n7U÷ú¹ð™!å\eé6)µêÑw;Vu¿_ŸÃÊÂ3FUøõèk˜¡æe»…Ï )çê'|6ú6‡âê´RyñKÃçÀ°²ðŒS ·˜~C40þº•ǧß{>7¤LkÝ||ôm…Õyô¶ð0Ì,†™…g ë>»*ú:f¨}×ùá3CÊ©ÊÒWú\:VÙõ­á³`˜YxÆ°Ö GE_ç@AÝ)EW?õo¢oi(´ní™ì~]ÛÂ3†ÕOùßÑ×:0 ­ëŸR.ùnˆÕ¾ïÒð90ì, †…gL묾%úzf¡ùÂç†4é5/Y}+CáÕ3üÈ ϘfèÃdéVŸJ•í~,|vHÛ¢—¤nùÑè[ ¯ºï{âçÁ³ðŒiµC?}½³Ô8óÿ„ÏiR«Ÿð™è[hVSyÑVáó`ØYxƵE[ù”i˜0ݧïþ[êðù!M`íû/‹¾…¡ð:\> F‘…gŒkÝvJôuÌRýô ŸÒ¤UÝÿW£o] ¥Ô¼b¯ðy0Š,?¤q¯²ë[RjÕ£oW ¥Ô¾ç¢ð™0ª, úVúzŸ=F•…gÜ[¸EêVŸ|þZ&Hã‚©ø"i•]ßšR»}›}µc>>F•…gjÝrÂó×"0Aºµ§Se‡×„Ïik]{Hô- <¯ÛM•_>F•…gªŸòÅ]Àdi^¶{ø ‘Æ­êÞïN©Óо=¾Îcß Ÿ £ÌÂ3UvþI§†IÕi¥ê>¿>G¤qªýƒó¢ïL`-­kŸ £ÌÂ3!uºníë˜ í»/Ÿ!Ò¸T;ú¢oI`½ß&Šž £ÌÂ3!5/Zºîµ LúŠO†Ï)¼E[¥Î£·EߎÀ:ª{¾3~>Œ0 Ï„T=è7×½6 Ò}æFªÂ×X¹mô­¬£[~,•§6 Ÿ£ÌÂ3I§®<±î5 Læ·ÇÏ)¨Ên?R£}ëhßvjø|už ªuã1ë^£À$iVSe÷·…Ï)¢ö÷ω¾õhœóïáóaÔYx&¨úŠO­ï:&Hû{§…Ïi¾«ŸðÙè[Ø€ê¾ï Ÿ£ÎÂ3I-yyJÍʆ®W`BÔOüËøy"ÍS•e?åW²aLu+O¤òÔæásbÔYx&¬öí§GßÀukO§Ê®o Ÿ'ÒÈ›Ú,µ¿vô-l@ë–âçijðLh½7:yé_¤µp‹ÔºåÄè[˜å¯P—n??æ1 ÏW]þþè{…v3ÕŽúÃð#m´©ÍSë¦c£ï`–Z7¯ˆŸóœ…gÂë>uOô}ŒB³šjÿVøŒ‘ÖÛÔf©uõÑw 0€úÉŸŸ!óœ…gÂk^±gô}ŒHo@W÷úùð9#½ ©ÍüìIÕí¤ÊNoˆŸ#óœ…g«úÁè[¡î3LØpô¬‘~ôžkо-€u¼*~Ždá™ôn‘ºåÇ¢ï`„zOd¬ìðÚøy£b·h«éßý&Wãü¯ÇÏ’€,<Ôºzÿèû±ÎªkRe‡×„ÏøÑÓwœ}sT-è¯I[x2ȯµA1t¾!Uv|}øÌQñ>T´}ß%Ñ—?0GÇ¿>O¢²ðäÐÔæ©ûìªèû˜Ǿ—*ËÞ?wTˆªßxGêw”wµÃ/ukOG_îÀT÷ÿ•𹕅'“ªþFô}Ìó¯&Tv}køìQ†Mm–çü{JVôe I÷Ù§ïíðù”…'—¦6Kݧ゚€yÔ}îáTÝï½ñóGÙTYºMjÝrbô¥ Yó»{‡Ï—È,<Õ¼dçèû ˜gÝÆšT;òcáóG“_u¿_N'}I#P;ôCá3&2 OFõþ¦( v#ÕOú«ð¤ þ¶3ÿ%¥f5úJF ÷yå…[ÆÏšÀ,<™Õ{33P@Ýnj¬Ü6|i²ªìú–Ô¾ëüè«¡æUËÃgMtžÌj\¸0ú¾µn^‘ÊÛ½"|iü«ÿ©[}2ú’F¬vðo…Ï›è,<™UÙýíÓÓ Wç‘§gAô<ÒxÖ{º_ûöÓ£/S`ޞζyøÜ‰Î“aíû/‹¾¿€`Ýú³©v쟄Ï#Q‹¶J³ÿ5uëÏE_žÀ—[íÿ™:Þ}Eó¬ºüýáó§<Yx2¬²ÃkRjÕ£ï1`LtVßœªû¾'|6iþ«~ã©uëI~Õ ¨óÄá3¨<&Yx2­uÛ)Ñ÷0NÚÍÔ¸pQ*/Ü"|>iôUv|ý?›Í_~Aa5¿½$|•Ç$ O¦ÕŽýÓèû CUW§êþ¿>£4š*K_9ý´NïÓª{¿;|&•Ç$ O®-zÉô‹ ð"ÝNjÝpäô¿„Ï* ¥Êޝ›þ<™z:^>—Êc”…'ãz4°±Oß®Ÿú7Y:ÁU–½qú)LÝÆšèË #3þ)|>•Ç( OÆU÷ÿÕèû ˜‡ÔŽùDøÌÒ,æû¾ïI­kN©U‹¾|€qÓªM?À*zN•Ç( Oæu¹)ú¶&DçÁ+Sí°‡Ï-m ©ÍSíè?Ní»Î÷Ô5`ƒZ7¯ˆŸW Æ+ Oæ5Îù÷èû˜0½µÅg|ªìöÓ©qÁÔô'¦lJíˆßŸ[å1ËÂS€7²z,)0ˆÎ#7¦úiÿÊ‹·Ÿe…kÉËRýø¿HíÛÏH©Ó޾€ Ñ}v•Xðâ,<¨uëÉÑ÷0Ázÿ²Ð8ïkžê6ê½$ÕŽüXjÝpTJrôËL æwvˆŸe Æ/ Oªõ‡Ñ÷ƒv#µn=iz¦øÄ!µäe©vÜŸ¥ÖG§níéèW˜dÝnª~ãñsmÁøeá)B ·˜þ'N€aéÍ”Þß$V÷ú¹ø7aUvþÉT?ù ÓˣɆ¥}÷…áó­<¦Yx Rï`0 ݧîNÍ+öLµƒ>ÊS›…Ï»±ká–Óß›æ%;§ÎC×zÂ0½÷ý…ϻ㙅§ U÷øY?d‘ë>ó@j~wïT;úReé6á³/¤%/OµC~'5.XÚ?87¥f%úe2×]óH*/Ú*~þ-Ï,<ª}×Êèû(’N+uønj^¼cªþ‘éE zŽ¢Ê.oJµcÿ45/Û}úÏ›ÚÍèïuOô} À€zO‹ ?S.˜Œ,<­qÞ×¢ïS}õîo ?O–'$ OA«ìðš”åèÛ€YjÝzrøY²ˆ`Œ4/Û=üŒXžð,~ö+g˜…GoñÖ©ûÜÃÑ÷?@Ö:ܘÊS›ÇŸýä—…G›¬qÞ×¢g@Öj‡$üÌWÎ4 6Ye»KÝÊãÑs Kí»V†Ÿ÷ÊgáÑŒê=1€!ëvRuùûÂÏz匳ðhf-yYê>÷PôHÈJ놣âÏy òΣçsy†§ÛX“*»¼)üŒWÎ< fÞ¢­R÷©»£g@+·?ß-È? fUý”/FÏ€‰×yò®éy>Û• …G³ká©óØ÷¢gÀD«óñøsÝ‚bdáѬ«ÿéè0±<†º4¯Yx4û¦6K‡oˆž“§ÝLÕ=ßž[Pœ,<¨Ú§yÙnáç¸rÁ²ðhàÚ?87zfLŒîs§Êö¯ ?Õ –…GWÝûÝ)uZѳ`"Ôûóðó[¹€Yx4§Z×=;Æ^ûû焟ÛÊÍ£9UYöS)5ÊÑ3`|5+©²ûÛÂóðˆ<¤IDATÏmå‚fáÑœk^´]ô[s¿~^+¸Ní™T*/Ú*ü ÑäVÙîÇRwÍ#ѳ`ìt¹)•n~^+µ©ÍRê´S©¼ýkâ¿MtõÓ¿=OÆK·“ªþFø9­\ð¿˜ï)•w}kø£ oá>Œ`-ÍïîF+x•eoœ~-J•½ÞþÅhò«ô”ºÝèÙ®ûÔ=Óÿº}>+zÕ=ß5ýz”*ø§6 §ÖMÇFÏ€XÝnªúÁðs™J©ºÿ¯L¿$¥êá ÿb”G•]Þ”º5Ñc LóÊ}ÃÏd*MW_ñ©éפT;íKá_Œò©±rÛè9¢ûô½©²t›ðó˜J?<—^°`úu)5.Û#ü‹QF-zIê<~Gô¼˜ÿ_e;ü#ñg1¥çkÝxôôKSjÝqvø£¼ªñÑè‘0¯šWí~SéuV]3ýÚ”:OÞþÅ(¿Ú·Ÿ=wæEçÉx*Û‚ñ«[vúõ)¥N'­YôÒð/HyUÙí¤Ô(GÏ€Ñê´|Àè‚ñ«ºÇÏüè%*õþGSk5¾õ‘ã`ä. ?s©ô¢ê§ýý žúʯ‡Qʰ…[¦ÎC×EÎ €‘é½G¤¼h«ø3—Òºµn>þ… Oë®óÿ(eüOvä,¾F9U÷|gøYK¥7µYê®YýÂ…'5kÞÇ£‘Õ¼b¯Ài0|õSÿ&üŒ¥Òz«îûK/x­~¸ð¤”ª‡~(ü‹Sžõ>€«û̳`èZ·~¾Riƒ5ÎýÏõ/çÀP´¿öôÓ¿¢ÏR*m¸…[¦îšG6¾ð¤F%•·Û&þ‹UÖµn=iÇÀÜtŸ¹ßûvŒµãþl½¯_éEØ;ãŸÃ¿XáWÛ›ù0÷÷íô›áç'•6Yïƒ`g´ðtžº/­Y¸eø¬¼«¯øÔ|Œ(€9iœûÕðs“J›¬välð5|ÑÂÓS;å¯Ã¿hå_ëæ£œOsÒ¾íTïÛY0µï»tv Oû‰»Òš©-¿på]eÇ×­÷eÑ:Ýž*K_~^Ri“ÕûðF_Ëõ.<=µÿ*ü‹WþÕŽùDJÝî(æÀ@ºµ§Sõï?'©´é¦6OUW¶ðL¿—gÉËãÿʾæUËG1«f¯Û~ÚWôùH¥Õ8ãŸ7ù’npáéi\´4ü¡´xëÔY}ó0GÀ@.Š?)ͤÊÎ?‘:•'ç¶ð¤V#Uöü¹ð?Œò¯ºÏ/¤Ô¬q\ÌNûŽ3§E*ú\¤ÒŒjÝxÌŒ^×/<½çî =BóRãœƬ˜µÎ£·¥Êö¯ ?©4£j‡$¥Ng8 OOí”/†ÿ¡T€¦6Kí;¿5×y0+ÝÊ㩲ûÛãÏBJ3©²óO¦ÎsÏøõÑ“êåTÙëçÃÿpÊ¿ÊNoð¨j`þ´›©vèÃÏ@*ͬ©ÍSû®•³z‰K3¾Vßê©mš—jGý¡GUó¢~òÂÏ>*͸æEKgýÏxáéi^wxøRŨyɲY_̳Ѽx§ð3J3®väÇRê´G»ðôÔNýÛð?¬ ÐÂ-SûÞïÌú‚˜‰Öm§x"Û‚É©ºüý©S{v ×º4Èï9VúÃð?´ò¯²ìÞÏ ]gÕÕ©¼Ý+ÂÏ:*ͨêžïL5«~½g¿ðô4ª©zÐo…ÿᕵC~'¥Nkà `mݧîžþÀÊè3ŽJ3ª²ì§Rç©{æôš—¾XªO¥Ê>¿þMPþ5Vn;§‹ §[~,U÷øÙð³J3ª²Ó§Îê[æüº¼ðôtž}8U¾ñÎðo† ðù:ðÓØF»ðô´[©vÊ_‡“”wõã?íCI€k\¸(üü¢Ò¦›Ú,5ÎýjJ­ÆÐ¯á-<}ÍëHkoÿMS¶ ò »@ñ4¯Ü'üÜ¢Ò&«ìøúԾ㬑]C_xzÚ«oM•½ÞþÍS¦Mm–Z·œ8ŠKÈDë†#}°è„|Iç™Gz-ŒdáééÔžKµÿWø7QyVYºÍPSä§uëÉ©¼p‹ðóŠJ9˽25/ÿÆôÛbFmd Ïóš·œ”Ê»¼9ü›ª<WØ­<1êK˜ 휛ʋ^~NQiýMm–ê'}.už}hÞ®‰‘/<ÓêåT?ï¿Òš…[Å“•UµC?”R»9/—10ÞÚ÷]šÊK^~>Qiƒ›nß{ñ¼_ó³ðôµ»#UÿHø7[yU?ýKóyc¨óе©²ý«ÂÏ%*½¨êò÷Mÿšaïó"ÌëÂó¼öªëRmŧ¦ÿI+úP5/Ù9âRÆ@çáReÇ×…ŸGTzAµƒ>Ú·Ÿ‘R§z}„,<Ïk?|Sªÿ™´Æ44Œ'·Ýt\äå D-;;¼6þ,¢ôü#¦gþŸÔ~àÊ4.Bžçužº/5¾½]ªìù®ðIÜâ—¦ö½ß‰¾œ€yÒyäFÿ²3-ÞzúÃá[ß;}$šÅ³¶öƒW§ÆY_Nå~"þÅÓÄUÙá5©óèmÑ—10bGnšþׄè³G![¸eªøÿ¦Æù_O­¬L©QNãlìžévSû‘›Sãò=Sõ˜?Iåí_ÿâj"ªìöÓ©ûÜÃÑW00"Õ7§ÊN?~æ(B•eoLµC?˜ê§ýCj^¶[jÝù­Ô©?—&Éø.<ëêtRû¡Róú#S}å×§zPÙç—ÒšÅ[‡_¿*û½wânF`fZ·ž’šW avÃQ©uÛ©ÓÿbÓ^uMj?ú½Ô©=“r09 À,Yx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lYx€lýÿí×A 0 ÀÀù7Ý©(…p§ ß¼ë€-†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² ex€,Ãd ËðY†È2<@–á² 0UÑGîÖÌÜIEND®B`‚‰PNG  IHDR☨m pHYsèèµ{Rk IDATxœìÝy´euyàoŠbˆ QqŽ1šhÔ$šNLºc줓t‹‰mb“ø3¿¬N:1ÑÖLv†{kŠ‚bžE AA@dRPAFŠ¡˜Ç*¨³Ï¼÷Û«.1ŠLUµ÷½ïžg­Ï?YY÷~÷®ïyï9[0¾½Þ}eô¯øLôÎ]Ïÿy´üµhíýªh-Ù6Zÿ¶•¤-¬}蛣jÝ—}— ^÷Egg’¦»%ÛF±ÏÏ}ž°ñs…Þy»FÿÊccx÷UsŸ;ãm«ìÿ€MÔ݃5çDï‚=£sâŸFqðÏDkÉvù/ ÒÖ9âmQuÖgßõÀ<|çÄhÍn“~!I#×’íæ>èœø¾è¿W ÖœÑkem`3X€U>|gô¯>1º_úP‡þ¼H Tgõ.ývöæÙàÊÏDkvqúY„$|³ÛDñ±ÿÝÓþÏÜçå#wepà)X€QQbpËùÑýò?EqÈ›£5³(ÿ¡.MYÝÞ1ìgO` .;*Z3[§ŸIHÒØµ÷«¢û¥ÆàƯDô;Ùãø QY<ýKö1ïŠÖ²óØÒ×;åU™=€6¸ä0Œ#IuZþ¬è|æÝÑ¿ôÈ(‹³Ç:L= °ÀÊöCÑ¿ü¨h½ËÜoé¤?˜%EïÌf Qÿ¢ƒ,HRÍ.Žöa¿ýo}<ÊκìñSÉ,„a?×|>Ú«ß­¥Ûç?€%=ÚÌ¢è}Ÿì Œ€þ×÷Î?«¤IjéDû3ÿ3×1dy˜`•®‰îWþ9Z+wÎÐJzl³‹cðí#³Ç0Bú_Ý=ÿÌB’&±=_ݳg¢\wkö¨‡‰gšVç¶ÙÚŸúhÍlÿP•ôøf·‰ÁUÇeO `õÎY’v!I“ÚÌÖÑþôÿˆÁ gD”eöȇ‰dš2èFÿò£¢8àuùPIOÞ’íbpÍIÙa½³þ%ÿ C’&¼b¿×DïûE :Ùc&Ѝ©,ˆÞ¹Ë¢µâéKIOÓ²gÄðúÓ³Ç0z§$ÿ,C’¦¡•/ŽÞ×öˆ²ópö臉`¶PÙ}dîÔÚõÙùGIOß²bxÓYÙ£U½Sÿ&ÿLC’¦¥ÝvŠîÙ³QvÖg?`¬Y€ÍÕÝðèÿ»í”ÿ0”´IËŸÛÏÍžÀ¸©ªè~ñ¯ÒÏ6$iªÚýysŸÃD¯È~ ÀX²›jØÞ7ŠÖŠçç?ü$mrÅî;EyÇ·²'0®ª2º'þIú‡$M]{¾$ú—Q–ÙO+` n:+Šßÿ°“´Y{¼0Ê»¯È!À¸+‡Ñ9öÝég’4‡ü\ nùZö“Ɔx Ãû¯ÎqïI¸IÚüŠ•/Šòž«³Ç0)úíè|âWÒÏ<$iZk½K”Ýœý4€‘gžH¿ݳþ5ZK¶K IÚüн^å7dO`ÂTuÑ>øMég’4µ-ß1zì1f?`dY€2¸õëQðºü‡˜¤-ªØëeQ>xcö(&TÕº7Úû¿6ý D’¦¹âàŸ‰á—f?`$Y€ïéµ¢ûåŠÖìâô—¤-«Xõrþó®zhM{¾8ý,D’¦ºÙmæ>׉A'û±#Ålü«ÿ5çFk¯—ç?¬$Õüðÿ¦ìqL‰òî+¢Øí9ég"’4í¼>†w]‘ýX€‘a€é6ìG÷ì%þê_ó|ød(×~sî÷¨³ÏF$iê[º}ô¾¶GD9Ì~4@: L­á}×EqÈ›óJ’jU¬z…ÿ€4Û¾­%Û¥Ÿ‘H’¶Šö'=ʇïÈ~4@* L¥þ¥GFkÙé"Iõ*ö~eTÝœ=R€)7¸bu´f¥Ÿ•H’¶ŠÖŠÄàÆ3³ Æӥ߉î—>˜ÿð‘ÔÈ_þW­Éž*sú’~^"Iú÷fÏý´Ÿ`Y`j”ë×Fñ±_ÈèHª]±Ï«¢ZwköXxŒÞÙÿ–~n"Iú~c/Êî#ÙXP˜ ƒ5çÎ}åKöƒFRCù¿î–ì±ð„º_ü«ôóIÒ÷+x] ïûnöãŒ&^ÿÛŸŒÖ’mÓ0’êW¬|Q”÷]—=Vž\UF÷³˜~Ž"Iú~Åî;Åàæó²Ÿ° ,0¹Êrî÷]²*’š©Øã…QÞ{MödxzÃ~t>ýßÓÏS$I?ÐÒí£Å1ÙO˜w˜LƒntNø“ü‡‰¤F*VíC~.ý\E’ôÍ,Šîٳ٘W˜8e{]´?ñ¶ü‡ˆ¤F*vn”w]ž=Z6[õÈQ¬zEúùŠ$é±uOùÀÜO¶À$²ÀD)‹£øØ/¤?8$5S±Û³£¼ã[Ù£`‹müIÃb·ç¤Ÿ³H’[ç³ïûɘ4˜å#wGqÐÓ’jùŽ1¼õüìÑPÛðæóæ~{:ý¼E’ô˜:Çý~Ä —ý˜€FY`"”ßůKPHj¨e;ÌýÃ`R ®óîôÁ/©¹úç.Íž,)Ê{®Šb·g§ŸÏH’~¨™EÑ¿ìÓÙ Ø"+Ý3>’?ô%5VïKÌ+©†7œ­ÙmÒÏi$I?Ô’íb°æœìÇl6 Œþ·>ž?ì%5V÷¤÷GTUöhH7¸ôˆô³IÒã+VÀ%5в¢\{aöTK½³gòÏw$I«wþ^ÙxR9“þ,}pKj %ÛÆðF¿‡°Åª*ºŸýÃüsIÒc[º} ïº<û)OÈ#eð“ò‡¶¤úÍlƒ«ŽÏ)ã¯ßŽöÇ~>ÿ¼G’ô˜Ú¾~nFè±ÀȨ¾#Z»í”>°%Õ¯ÑÁÙ#`bTënb¦ŸùH’[÷Ëÿ˜ýˆ€Ç±ÀÈhó®ôA-©~›€f oûz´–l—~ö#Iúf·‰áßÎ~DÀcX`$ô¯úlþ–T»î‰2÷Ût4opÙQéç?’¤Ç¶ñgZb8È~DÀ°@º²½.Z+_œ> %Õ«óéÿQzɘO½Ó?œ~$Izl½ È~<À°@ºÎçÞŸ>˜%Õ«}蛣êmÈ'“¯Fgõ.éçA’¤ïWìú¬(ׯÍ~BÀ ¤¬97Z3‹Ò³¤-¯ØçUQm¸;{œLª³.Úûÿdú¹$éûuÿƒìÇ̱@žrÅAoJÈ’¶¼bÅó¢¼ïºìi0uª‡ÖD±âùéçC’¤ï7¸åüìÇX OÿâCÓ±¤-ý‘ÞzAö(˜ZÛ¾­Ùmòω$Isµ?þ e™ýx`ÊY EÙ~(Z¶S¥ñmfë\sRö(˜zý ÷Ï?+’$ýGý+Í~40å,¢{Ú‡Ó°¤-oã?, ݓޟ~^$Iz´bï‹è·³ L1 ,¸òÁ5ÑZ²]ú–´eõ¾üÙc€ÔkEû 7¦ŸI’­÷õ}²Ÿ L1 ,¸Îçl£JãZ÷¸ß‹¨ü~À¨)¼1ŠÝž“~~$IÚ*Š•;GôŠìGSÊ jxÿõÑšÝ&}ðJÚüÚ‡¾en›€Ñ4¼î”hÍ,J?G’$m½oø)]rX`Au>ûGéWÒæWìýʨ6Ü“=Bx½¯üsúY’$i«(ö|±o …Ìðž«£5³uúÀ•´y»>+Ê»¯Ì!lŠªŒÎQ¿•~¦$IÚ*zß<0û©À²À‚éÿ‡éƒVÒf6»M o<3{|°ªÖ}Q¬zyþÙ’$MyŪWD ûÙ¦ŒD¹î–¹³­¤Í«ñ!Ùã€-PÞ~q´–nŸ~¾$IÓ^ÿªã³ L ,ˆî—>”>`%m^½/ÿCöè †Á·>–~Æ$IÓ^ûð_Î~0e,0ïÊÎúh-Vú€•´éuVïQ³Ç5u?ÿçégM’4í ×^”ý8`ŠX`Þõ¾º"}°JÚôÚ‡¾9¢×Ê4aЉö¡oI?s’¤i®{âŸf? ˜"˜_Ã~´ö|iú`•´i{½4ªGîÌž4¨zhM»ï”~ö$ISÛ’í¢ÜpOöã€)a€y5¸öäü¡*iÓZöŒ(o¿8{l0†7}%Z³‹óÏ $iJëc¿ìGSÂóª}ô.éUÒ&4³(W›=2˜G½s–äŸCIÒ”Ö>èÙ¦„æM¹~­RiLÚø?&\UFçèw¤ŸEIÒ´6¼ó²ì'SÀó¦wÎÒôA*ééë÷žˆªÊ,€ªý`{ÿXú™”$Mc½Ó?œý` X`~”Ãh­zEú •ôÔµ}sD¿Èž, òö‹¢µdÛô³)Iš¶Š=^1ìg?˜p˜ƒ[¾–>D%=uÅÊ£Z¿6{\ þžéçS’4 ל“ý`ÂY`^tOù@ú•ô-ý‘(×~3{T¥ª¢sÌoçŸSIÒ”Õ;õo³ŸL8 ÌÏ×ÿ¯Ü9}€Jz’fÅàŠÕÙ“€dUë¾(ö|Iþy•$MQÅ^/(ËìG̬97}xJzòz_ù¿Ùc€1¼ùÜhÍ.N?³’¤iª¼ý¢ìñϳ@ã:'ÿeúà”ôÄuŽú͹oé€ïé=“~n%IÓ”?Ôc>Y Ye­•/Nœ’_{¿×DÕY—=%5UOþZúù•$MKíƒß”=ù™`hÔðÎËÒ‡¦¤ÇW,f”÷\="QÕÃwD±âùéçX’4Í,ŠjÃ=Ù£Ÿ e€Fõ¾º{þДôØfÅàê²Ç#nxýésgIéçY’4 ®:>{ì3¡,Шöáÿ%}`Jzlà 6Eïô¤ŸgIÒ4Ô=ù/²G>Ê);룵dÛô)éûuŽú­ˆr˜=Ã~´{kú¹–$MzÅ>?ž=ñ™PhLÿ;ŸK–’¾_{ÿ×FÕY—=3åƒ7E±Û³ÓÏ·$iÒ«ÖÝ’=ò™@hL÷KJ”’­XþÌ(ïýNöX`L ®>!ýŒK’&½ÁUÇg{&SòæôA)i«hÍ,ŠÁwNÌ Œ¹¿O~Ö%I\ÏõL 4£»!Z³Û¤JI[Eï¬ÍžL‚~;Ú½!ý¼K’&µÎoËžôL 4bpÓÙéCRÒVÑùä¯G”Ãì‘À„(ï½&ZËvH?÷’¤‰lÙå {Ô3a,Ј޹Ëò‡¤4å«^Uë¾ìqÀ„\rXúÙ—$Mjå=Wey&ŒÑ>z—ô)MuK·òö‹²GªsÌoçŸIÒ6¸üèìÏ„±@#Z{½,}@JÓÜà[ËL°ß¥i«wæG³o}¦XïìK?#“¤Iixó¹Ùc b€ÚZ«^‘>¥iª}Ø[#†ýì[€iV¢ýñ_L?+“¤IhpÅ1ÙS b€z†}_õ$-`ÅîÏjýmÙw>DùàQ,fú™™${ý Vet&ˆj)\“>¥©ifQ ¯;%û¶€ÿпèàüs3Iózgü]ö8g‚X –ÁMg§EiZêõ/Ù·<¥i¨ó‰_™û]55Õ#wE±âyégh’4®uŽøÕìQα@-½¯®HŠÒ¤WìþܨÖß–}»À“^û…ôs4I×Ú‡ülög‚X –îŸ>¥‰nfQ ¯;%ûV€§Õ=éýùçi’4†µ÷ý‰ìα@-Ïy¡“æ³ÞYÿ’}›À&©zæ>ÄÊ>S“¤q«X¹sög‚X –öêw¦EiRköÖˆa?û6€M6¼íëÑš]œ~¶&IcÕò³Ç7ĵ‡ýRþP”&°bÅó£zøŽì[6[ïËÿ˜~¾&IcÕÌ¢ˆªÌßL ÔRìÿ“ùCQš´fÅðºS²ooØ2ƒN´KÒfµñgT  ¨¥µêéQš´z§}(ûÖ€ZʵßôS’´Y )¨¥µrçô(MRíƒÞÑogßÚP[ïô§Ÿ·IÒ¸½VöØfBX –ÖîÏMˆÒÄ´l‡(ï»6û¶€fô‹hï÷šüs7Iƒ6ÎLh‚ji-Û1} J“ÒàÒOdßÒШám߈ÖÌÖégo’4êùv`šb€ZZK¶KˆÒ$Ô=î÷²og˜½S>~þ&I£^ :Ùãš a€ZZ3‹Ò¢4î{¿2ªÎºìÛæEÕÛÅÞ?–~'I£œšb€Z²‡¡4öÍnÃÛ¾ž}+À¼®9Ç”IÒSd€¦X –ìa({ýó–g߯° º'ÿEúyœ$jhŠjɆÒ8×9âmå0û6€QuÖG±êåéçr’4ŠY )¨%{JãZ±Û³£Zwkö- jxÓY~ @’ž 4ŵdCi\\±:ûö€ݓޟ~>'I£–šb€Z²‡¡4ŽuýÝì[r `¯—¥ŸÓIÒ(e€¦X –ìa([Å^/ªý`ö­ ©†ß=5ý¬N’F) 4ŵdCi¬šYÃÎȾm`$tOøãü3;I‘,Ð Ô’= ¥qªwúG²oYUñ@+_”~n'I£šb€Z²‡¡4.µ|}D¿}ËÀH^{rúÙ$BhŠjɆÒX´tû(ï¾"ûv€‘ÔùÌ»òÏð$)9 4ŵdCiê_°*ûV€‘U­_Åòg¦ŸãIRfhŠjɆҨ×9âW#ª2ûV€‘Öÿƾégy’”™šb€Z²‡¡4Ò-ß1ÊoʾM`ô•Ãhúæü3=IJÊM±@-ÙÃPå—ž}‹ÀØ(ï¸$Z³‹ÓÏõ$)# 4ŵdCiTë|ê7"ª*û€±Ò;õoÓÏö$)# 4ŵdCi+v{vTë×fßž0vªîÃQìõÒô3>IZè,Ð Ô’= ¥QlpùÑÙ·&Œ­ÁÕ'¤ŸñIÒBg€¦X –ìa(Zc~'û¶€±×9æ·ÓÏú$i!³@S,PKö0”F©bÅó£Úpwöm c¯Z[ËŸ™~æ'I •šb€Z²‡¡4Jmüj2 ýó÷L?󓤅ÊM±@-ÙÃP•º'¼7ûv€ÉR¢}ÈϦŸýIÒBd€¦X –ìa(BÅÊ£*Ⱦ`â”k/ŒÖÌÖég€’4ßY )¨%{J£Ðàš“²oE˜XÝ/þïô3@Išï,Ð Ô’= ¥ìºÇÿAöm­ê¬bÏ—¤ŸJÒ|f€¦X –ìa(eV¬x^Tîɾ `â ®<6ýñ+U•}[5TÝ­eÏH?o”¤ÍÉM±@-ÙÃPj¬Ùm¢¼ûŠì[ h@ïì™ü3GIÚŒ,Ð Ô’= ¥¦ê}ù²o' )ý"ŠU¯H?w”¤MÍM±@-ÙÃPj¢b¯—EÕÛ}; \±:ýìQ’65 4ŵdC©‰ß91ûVšVUÑþØÏ§Ÿ?JÒ¦d€¦X –ìa(Õ­sÔofßFÀ<ÞòÕô3HIÚ”,Ð Ô’= ¥Z-Ý>Êû¿›}ó¨sÌïäŸEJÒÓd€¦X –ìa(Õ©wÎ’ì[˜gÿ¨µdÛôóHIzª,Ð Ô’= ¥-­½ï«=L`JôNùëô3IIzª|fAS,PKö0”¶´áw¿”}û ¤jÝÅ®?š~.)IO–šb€Z²‡¡´%u{Oö­,°þWwK?›”¤'ËM±@-ÙÃPÚì–ïÕ÷gß:ÀBë·£Øëeùg”’ôY )¨%{J›ÛÆ-_`: .;*ýŒR’ž( 4ŵdCis*öy•(L³ªŒö¡oI?«”¤Îç4ŵdCis\sRö-$Þñ“, IDAT|núY¥$ýphŠjɆҦÖ9ò¿fß.ÀˆèýŽô3KIúÁ,Ð Ô’= ¥Mjvq”w_™}»#¢¼ïÚhÍn“v)Iÿžšb€Z²‡¡´)õNý›ì[1Ý“ÿ"ýìR’¾—šb€Z²‡¡ôt»ïUqö­Œ˜ªuo»>+ý S’6f€¦X –ìa(=]ý‹ʾM€Õ?wiú¦$mÌM±@-ÙÃPzªÚ¾>bØÏ¾M€QÕoG±êåég™’d€¦X –ìa(=UÛÎʾE€7¸ôˆô³LI²@S,PKö0”ž¬Îgþgö팃rí^—~¦)iº³@S,PKö0”ž°%ÛFùÀ Ù·0&WŸ®)iª³@S,PKö0”ž¨Þ—>˜}k㤪¢}è›ÓÏ6%MohŠjɆÒWìú¬¨6Ü“}kcfxýiéç›’¦7 4ŵdCé‡ëmEömŒ©Î¿š~Æ)i:³@S,PKö0”~°b¯—Fô‹ìÛSÃ[/H?ç”4Y )¨%{J?Øà²£²o `ÌuŽú­ô³NIÓ—šb€Z²‡¡ô½Ú¿)¢*³o `Ì•w^­™Eégž’¦+ 4ŵdCé{ o<3ûv&D÷ØßM?ó”4]Y )¨%{Jë|òײo`‚”÷7Z³‹ÓÏ>%MOhŠjɆRkfë(ïüvö­L˜îçÞ—þ)ij²@S,PKö0”º'ýYömL jÝ-ÑZ²]ú¨¤éÈM±@-ÙÃPSÞÒí£Z[ömL¨Þ)*i*²@S,PKö0Ôt×;ýÃÙ·0ÁªGîŠÖ²ÒÏB%M~hŠjɆšâ–ïÕ†{²o`ÂõÎøûüóPIŸšb€Z²‡¡¦·ÞÙÿ–}ùS *îb×M?•4ÙY )¨%{j:+v{NT퇲/`JôÎY’~.*i²³@S,PKö0ÔtÖÿÚŠìK˜"UoC{¼ ýlTÒäf€¦X –ìa¨ékãKvÕ}$ûÒ¦Lÿü=ÓÏG%MnhŠjɆš¾úß<0û²¦Q¿Åž/N?#•4™Y )¨%{jº*ö~eÄ ›}ÙSªÿ}ÓÏI%MfhŠjɆš®ßþdö%L³~Å/L?+•4yY )¨%{jzjïÿÚˆr}ÉS®þžé祒&/ 4ŵdCMOƒ«ŽÏ¾Ü¢êmˆbÅóÓÏL%MVhŠjɆšŽÚ¼.¢*³/w€9ý¯î–~n*i²²@S,PKö0Ôt4¸òØìKà?T݇£Ø}§ô³SI““šb€Z²‡¡&¿ö~¯‰(‡Ù—:ÀcôÎY’~~*ir²@S,PKö0Ôä7¸buöeð8Ug}»='ý UÒdd€¦X –ìa¨É®½ïOD”ƒìËà õÎú×ôsTI“‘šb€Z²‡¡&»ÁeGe_âOª*ˆb×g¥Ÿ¥Jÿ,Ð Ô’= 5¹ûü¸¿þF^ïÌJ?O•4þY )¨%{jr|ûÈìËàiUÅýQ,fú™ª¤ñÎM±@-ÙÃP“Y±êÃ^öå °Iz§$ý\UÒxg€¦X –ìa¨ÉlpÉáÙ—6À&«6Ü­eÏH?[•4¾Y )¨%{jòò×ÿÀ8êú·éç«’Æ7 4ŵdCM^ý‹ʾ¬6[õðíÑZº}ú«¤ñÌM±@-ÙÃP“U±ây½Vöe °Eº_üßé笒Æ3 4ŵdCMVýó–g_Ò[¬Z[´–l—~Ö*iü²@S,PKö0Ôµ|Ǩв/i€ZºŸÿóüóVIc—šb€Z²‡¡&§Þéɾœj+¼)Z³Û¤Ÿ¹J¯,Ð Ô’= 5!-Ùv&A÷„÷査J«,Ð Ô’= 5müJ,€IQÞ}E´f¥Ÿ½JŸ,Ð Ô’= 5Í,ŠòÞk²/e€Fu>õù篒Æ& 4ŵdCcß}4nxÓYé篒Æ' 4ŵdCåÚ ³/c€yÑ>ô-ég°’Æ# 4ŵdCw#ßž} Ì›ÁUÇ¥ŸÃJ,Ð Ô’= 5Þ ¯?-û˜?å Š}^•~+iô³@S,PKö0ÔøÖ>à§"ª*û`‚U½ QµzlÝÕCkSyßuQÞyé£ÝuÙ£ÿñõ·ÍýçG¯•ý¿c®ÑAéç±’F? 4ŵdCoƒo},ûò`ÔUUTîžûP~øÝScpÅ1Ñ¿øÐ蟿2zg~4z§üutOøãè¬~gtŽx[´ùÙ(öùñ(vß)Z³‹›}‡]ú#sÿu‹½^:÷ߣ}ð›æ~ϵsäî ïÞ—>ýó–ÏýÏ7¼æó1¼õü¹Å‚ªx ûÿŠdëQ¬x~ú™¬¤ÑÎM±@-ÙÃPãY±ûsç^z˜^Uq”÷\ÃΈÁeŸŠþy»FïÔ¿‰ÎgÞíÿâÜí­%Û¦¿»6Òì6Q¬Ü9Ú½1:G¿#z§þmô¿±_ ¯ûâÜÿ ¢ßÎþó¬wÎ’ü÷RI#šb€Z²‡¡Æ³ÞWþ9ûÒ`¾UeTënáš³ç¾ý©wÆßGç˜ß‰ö¯‹ÖÒíÓßIG­bÏGçÿ%ºŸûÿ¢îÒ\±:ÊÛ/ö´ÛZ¶Cú{§¤ÑÍM±@-ÙÃPcØ’m£zøöìK€†T퇢¼óÒ\þ鹯åïÿûs_ßZ¾cþ»ç$-¬~çÜ_ ¯;%ª‡Ödÿ¿€-°ñ› ²ß-%nhŠjɆ¿6þF+ã§êmˆámߘûûîÉ9÷5ýþ‚)¯bDçS¿½/ÿc ®8&Êû®¨ªìË€§P=ts´f§¿KJÍ,Ð Ô’= 5~Í})#­zäÎÞtVô/Ü?ºŸ{_´|}´f¶N—ÔSWìú£ÑùÔ‹þù+cxëÃ^ö¥Àé~öÒß%fhŠjɆ¯6þ¦)#¤ª¢¼ïºG¿¾ÿôDç“¿ÅîÏMoT3»>+:GýVôÏÛ5†·|ÍaÀ(ïüvú{¢¤ÑÌ¿ÙhŠjɆ¯ל”}ÉLµªûð£ÙÞòèýöO[K·Ÿ[ÊퟻlîàÙO䨸­MéF. 4ŵdCOÅ>¯Š(‡Ù—,ÀÔ}•ÿàÊÏD÷俌öAoô5þzLÅž/‰îþW ¯ýBD¯•}¹Lág¦¿ J½,Ð Ô’= 5>õ¿±oöå 0ñª‡ïˆÁÇD÷俈ö~¯IÔ˜};ÀÆŸ øæQ=tsö¥ 0ñÚ‡ülþ; ¤‘ÊM±@-ÙÃPcÒò£ê¬Ë¾\&ÎÆw¬?³4÷þ>ðWƒµ|}ôÎú—(ï¹:û2˜Hƒ+Mç“4ZY )¨%{j<Úx @Êa”w^ýóW>ú»¡K¶K×Ó”,œ³$Êoʾ&G9Œö¾¯Nד4:Y )¨%{j<*ïº<ûR[Uñ@ .ÿttÿý(vß)ýÝNSÜÌ¢è|âWbð­Í]—ÔÓ¿ð€üwðõ1¼öäì±°`Ú‡¾%ýLÒÂg€¦X –ìa¨ÑªwÎ’ìK –ò®Ë¢û¹÷ùÝMikücxóyÙc`Þ .ÿtú»—¤…ÏM±@-ÙÃP#ÔÌÖQ­»5û’Ø|UÃï~):G¾=ÿJÒÓÖ=î=Q­_›=9æÏ ÅÊ¥¿wIZØ,Ð Ô’= 5:uŽúÍìË`óTe ®:>Ú½!ý]JÒf¶|Çèmˆa/{’Ì‹Þ9³ùï\’4 4ŵdCNƒ«OȾ6ýƒÿ«Oˆö¯K‡’T¯ö~¯‰á gdO€ÆU­{£µtûô÷-I —šb€Z²‡¡F£bÅóæ¾– `¤ ûs¿¥ÙÞÿ'Óߟ$5[gõ;ý$0qº'þiú{–¤…ËM±@-ÙÃP£Q˾ž\9ŒÁeGE±Ï«Òß›$ÍóÏœ¿ÒÏ£¼ã[ùïX’, 4ŵdCFå½×d_ŠWU1¸æ¤høúô÷%I ׯŸ÷(×^˜=Ñ>ì—Ò߯$-LhŠjɆʯý±ÿ”}<Îð¦³æÞS²ß•$%5³utOþˈ^+{Ô2¸êøüw+I ’šb€Z²‡¡òëóÀìËà1_‘Ù9òíéïH’F£ö?åÚof&€-7ìG±ç‹Óß«$ÍhŠjɆJnv›¨6Ü“}Dõðsí»ñ¯~Óß‘$V¾ s½³þ5ÿJÒ¼g€¦X –ìa¨Ü:ÇüNö%L»^+ú篌bù3Óß$ví}_Ã[¾–=µ6[µþ¶hÍ.NŸ’4¿Y )¨%{*·ÁÕ'd_‚À´ªÊ\rx+wN'’4FÍ.ŽÞ—ÿÑÁ0v:«wÉ—’4¯ùw M±@-ÙÃPy»=;¢ßξ€)TÞyi´{kúû¤ñ­}àOGyÏÕÙã `“ ¯ûbú;”¤ùÍM±@-ÙÃPyÍý†&ÀªÚFï´Íýžwö»¤ hÙ3¢áþÙ£ `Ó”Ã(ö~eþ;”¤yËM±@-ÙÃPy o½ ûò¦éëþ/ÿt+ž—þ$iòêÿûQuÖgO:€§Õ?wYú»“¤ùËM±@-ÙÃP9ûüxDUe_~À(o¿8ÚÿLúû¤É®½ÿk£¼ë²ì‘ð”ªGîŒÖì6éïN’æ' 4ŵdCåÔ;gIö¥Lº~½3?­ÙÅéï>’¦¤¥Û?ú“–€Ö9öÝùïM’æ% 4ŵdC%4³(Êo̾ô€ 6¼þ´(V½"ÿ½GÒTÖùÌ»¢j?˜= žÐðÆ3Óß—$ÍOhŠjɆZøÚ‡½5û²&TÕº7ºŸý£ô÷Ijïûê(ï¹:{,<^Uν«d¿/Ij> 4ŵdC-|s_‰ аÁÕ'D±âùéï:’ô½ŠåÏŒÁwNÌÓ?eú»’¤æ³@S,PKö0Ô7³uTß‘}٤ꬋîÉ™ÿž#IOÔÌ¢èùѹ¿´Uq´–nŸÿ®$©Ñ,Ð Ô’= µ°uŽx[ö%Láõ§E±çKÒßq$ééêý޹…%€QáçÓ¤ÉËM±@-ÙÃP [ÿ¢ƒ³/9`T݇£û¹÷¥¿ÛHÒæÔ>à§¢¼ÿúì 0gxËWÓß$5›šb€Z²‡¡°ÙÅQm¸'û’Æ\yûÅÑÞ÷'òßm$i *v}V ¯ýBö(˜Ó>ðõéïG’šËM±@-ÙÃP Wç“¿ž}¹ã¬Fÿ¼åÑšÝ&ý½F’j5³uô/Ü?{ªDÿûå¿Ij, 4ŵdC-\ƒK?‘}¹cªZ¿6:G¼-ý}F’š¬wÚ‡"ª2{ÄS¬ê¬‹Ö²Òß‹$5“šb€Z²‡¡¨%ÛFU<}¹chãWe»ï”ÿ>#IóP÷¸÷8¤RuOzú;‘¤fòo šb€Z²‡¡¦ÎÑïȾԀqS¢wæG£5³(ý]F’æ³öaoªu_öÔ¦T¹öÂô÷!IÍd€¦X –ìa¨…ipù§³/5`ŒTßÃÿsú;Œ$-Tí}_å7d_`Jµù¹ô÷!Iõ³@S,PKö0Ô´tû¹ß’ØÃΈbÅóóßa$i+V¾(Ê;.ÉÃÀê_¸ú»¤úY )¨%{jþë¬Þ%û2ÆAUEïœ%ÑšÙ:ýýE’ÒZ¾c ¯?-{"“lØòŽoEÿâC¢{Òû£}Àëü;Lš,Ð Ô’= 5ÿ ¾}döeŒ¸ª·!ºÇþnú{‹$D³ÛÄàò£³G30!ªGîŒÁÕ'Dï´=úSkËž‘ÿ¾#i^²@S,PKö0Ô<7»8ªÖ}Ù—0ÂÊoŒö?ÿÞ"I£ÔìbËÔÀf«¹+†×2÷íjÕïôójÒ”e€¦X –ìa¨ù­säÛ³/1`„ o8#ŠÝwJg‘¤‘lfÑÜïñ<Ù7© o½`î}¡û¹÷EûÀ×ç¿¿HJÍM±@-ÙÃPó›Ã*àÉô¿¾÷Ü_¸f¿¯HÒÈ/\°WöȲ ûQÞyiô/>4º'ý٣ߢ6³uþ»Š¤‘ÊM±@-ÙÃPóØÌ¢¨Öß–}‰£¦FïÔ¿ÉW‘¤1ªwæG³§7°€ªGî|ô«üÏühtÿÏÑZöŒô÷I£Ÿšb€Z²‡¡æ¯öÇ~>ûòFLÕ}$:«wIO‘¤qlãòTTUö(VuÖÅ𦳢wÎ’è¬~g{¼ ý½CÒxf€¦X –ìa¨ù«ÿÕݲ//`„TënöAoHG‘¤q®ûÅ¿²c¬êmˆá-_þ«¢{Ü{¢XõŠô÷ I““šb€Z²‡¡æ¯òÞk²//`D”w~;Š•;§¿ŸHÒ$Ô;å–`”ƒ(ïº,ßúxt?ÿç.DÏ.N—4¹Y )¨%{j~jïÿÚìK ÛÏb×M?‘¤IªwÚÿÉïÀ©¹3†×òèWùê¿EkÙéï ’¦+ 4ŵdCÍO½¯üsö¥Œ€áµ_ˆÖÒI7‘¤I¬wÆßey˜ZUg} o:ëÑûW¿3Š=^˜þn IhŠjɆšŸÊÛ/ʾ´€dý‹‰ÖÌÖéï%’4ÉõÏ]š=î`òõZ1¼õüè}ïèÿQìýcéï’ôDY )¨%{ªùŠ•/ЍÊìK H´ñ¯`²ßI$iZêm챓£Dy÷1¸äÿ±wïQWõï ¨àmZïí™Z«s´Š¶3ŽSÆ3vÕiõ,ZoãŒÖ23õt9cgÓÎØcgMrAr©!"B! A.1œ(*ÈMc•KD¢Aä€áNøÝ/ß}Vž§³¹%Ù;ù<Ïw¿Þk½þìZêþòÙ»ä“çY•_üÓÔ;éõ©sÄá÷=À®° RYPVÑÃòç0ú³’$IQ5M~忇¿Gj3ºâãÑ7€$I ²fǶ4Ù²~îGùŸþÖÔYú¬ð{`OYP©,(«èaHyãÍçEV’$)êÿ×ÿYø[ J3‹fõŠ$Izâšî=iò£ ³¿B§ÿ·ÿWê.aüP•Ê€²Š†¶øé©é?ýYI’¤}Ýt2ûS€Âß"5›Y”Æ›VGß’$Í&£4Ývum\‘ëK½•ÏÞ•á÷5À^d@¥² ¬¢‡!eõ?÷»ÑŸ”$IÚ×MÇipÎûÂß!ì\Ê~FšÜôõè›A’¤}Ût’¦w]—ÆW6 .øPê}ê§ÎO‹¿—ö1 *•e= )kô­ODR’$i_ÿÍÿó>þàÝ#Ÿ;û7%IjkÍŽmi²e}^²8õךºûÅðû`>° RYPVÑò¦÷ÞýII’¤}U3ýQšÑï«{ô‹ÒôžEß’$e× J“­WÎý(ÿ³ß›ºÇ¼$üž˜¯,¨T”Uô0¤œÞßü£èÏI’$í«šföGkF¿?xbÝ^‘š‡ïо1$IÚõ&£4ݾ9¯:uvÙ¸·òàÔ™Y~§,T* Ê*zRÎðËý9I’¤}QÓ¤áú‡¿=xj½“^ŸšþÑ7‡$Im:™ûÃþM«ÓpÃá©¿êÔYr`øÝ °YP©,(«èaH9“›¾ý9I’¤}ÐÎ9ýî`×õOkJ“aôõ!Iª¼æÁÛÒxóyixÑ_¦þgÿeê.{Nø Ð6T* Ê*zRF÷ÈçúJ’$UÐèÒeáïvßàÜ?šý .’$틚Þýiòã‹ÒèÒ#SÿÌ?HÝc~)ü.¨•Ê€²Š†”Ñ_ûÎèOI’$íåFßùTø›€=7úÆÒè«D’ÔÆÆý4½}cm<1 Îû@ê­xUêÌ, ¿÷jd@¥² ¬¢‡!eŒ¾srô§$I’öbãëÎJ™ýÃßd˜Y”Æ×­¾R$I ¼æþ›ÓxÓêÙ_ Ö_uHê,9(þŽ`–•Ê€²Š†”1½ïÇÑŸ’$IÚKíüÑÅOoPÀÒg¦éOþ.új‘$-š‡~’Æ?øB~õ£©ÚïÌþÐð» €'d@¥² ¬¢‡!ùºÇÿZôg$I’öRÓŸ^Ÿºû…ð÷åìü=Ì̓·E_1’¤yV3Ø‘&[¯L£+Ò`Ýa©{ÂËÃï,v•Ê€²Š†ä|é?EF’$i/ÔìØ–ºÇ½4ü­@y½•¯MMÿÁè«F’Õtœ¦Û7Ïþ(ÿÁJ½•û•_-`@¥² ¬¢‡!ùvþ0I’Ô¾¿ýÓ;é áï öžþê·§4D_9’¤}´Ü;¾þÜ4Üpxê¯:$u–~Pž•Ê€²Š†d:â€Ôôî‹þŒ$IRÉ&£Ô?ã÷âßìuïü÷è[G’´þ°²e}^²8õךºË_~ß°oXP©,(«èaHžÞ©oŠþ„$IRávþzŸè7ûÎøÚ3¢¯IÒ¶ó×¹Ln¾8._žúkß™ºÇþÃð{€8T* Ê*z’gç&±$IjO£ï|*ü}À>¶ä 4½ãªè+H’ôTMÇiº}soZ|(õVœ:3ûÇß#ÌT* Ê*z’grÛ7£?!I’T¨ÉÖ+Rgñ3Âßì{Ýã~55»£¯"IÒÏý(ÿñõç¦á†ÃSÕ!©³ô™á÷ó›•Ê€²Š†ì¹î‘ÏýÁ’$iáדà©XP©,(«èaÈž™Þõ½èOG’$ía£oþ–`Xr`šÞymôÕ%I{µfǶ4Ù²> ¿úÑÔ_uHê,}Vüü€=`@¥² ¬¢‡!»¯{ÔóSj¦ÑŸŽ$IÚƒvþM¦Îâg„¿'X8zŸxåì¾–¤6ÔôH“›¾ž†—,Ný5‡¦îÑ/ Ÿ³PŠ•Ê€²Š†ì¾þYïŠþl$IÒž4ì¤Þ‰¯K°ð Îy_ô-&I»ß°“&[¯œýU–ƒu‡¥ÞʃSgfQøL€½Å€Je@YECvßÎÿ§I’$-¼_øáï®ñµ§G_e’ôÄMÇizç¦4¾êÔ4øâÿzŸü?RçˆÂg'ìKT* Ê*z²û¦w}/ú³‘$I»Ù䇄¿!Xà–=;Mïþaô•&I³5;¶¥É–õs?Êÿô·¦ÎÒgÅÏIf@¥² ¬¢‡!»§{ÔóSj¦ÑŸ$IÚšî=©{ÌKÂß,|½O¾.¥Q7új“TYMÿÁ¹åÅ1©¿æÐÔ=úÅáóæ# *•e= Ù=ýµïŒþd$IÒn6øü¿CÐÃõ޾Ú$µ¹Qwîû¿yBœóoS÷„—‡Ï=X(,¨T”Uô0d÷Œ¾y|ô'#I’v£ñukÃß´Ïä† £¯8Imh:IÓí›ÓxÓê4Üpxê¯:$u?#|ÆÀBe@¥² ¬¢‡!»gzûÆèOF’$íbÍÃwÍþúžè÷íÓ=æ—RÓ¹;úª“´Àjî¿%¿v~å¿¥þgÞœ:Ëž>Ï M,¨T”Uô0d7,90¥ñ ú“‘$I»Øàì÷Æ¿h­þÚwD_u’æqMÿÁ¹åÅ1©¿æÐÔ=æ%ás Ú΀Je@YECvÝÎÍlI’´0šühCøÛ€ö_sZô•'i>4¥é¶«ÓhãŠ4XwXê­<8uf…Ï(¨•Ê€²Š†ìºáW?ý¹H’¤]¨ìHÝã^þv Ëž¦÷Þ}õIÚ—M'iº}soZ†OýU‡ÌþÔÈðyXP±,(«èaÈ®›lYý¹H’¤]hxá 7PުߞýAIí¬Ù±möß /Y<÷£üz^øÜŸ•Ê€²Š†ì¢™E©éÞý¹H’¤§hzÇwSgfÿø·U]vTô(©@Mï¾4ùñEité²¹?ì?æ%áóØuT* Ê*z²kz+~=úS‘$IOU3M½SþYø»€ -~úìïÿ–´€÷Óôöi´qEœ÷ÔûÄ+ãg Å€Je@YECvÍàüF*’$é)_sZø›€zõN|á(ÍãšûoNãM«ÓpÃá©¿êÔYr`øÜÊòW©,(«èaÈ®Ùù ’$iþÖ JÝÿrø›€º /ž‰¾%í|îØ–&[Ö§á%‹ç~”ÿQÏŸÀÞg@¥² ¬¢‡!»fzÏ ÑŸŠ$Iz’†þkø{:G<ͯöqÍ`Gšl½rîGù¯;,uÿµøY„° RYPVÑç¶sK<5Mô§"I’ž éÝ[fÿÀ%úÍ;õ>õSšŒ¢¯G©izû·ÓèÛ+Óà¼?N½¯J™EáÿÜóƒ•Ê€²Š†<µþ¿ý™H’¤'©æ†¿àg.]}=J­¨¹ÿæ4Þ´: 7žú«I%…ÿó Ì_T* Ê*zòÔüGI’æo“[/+Àc,~FšþôûÑפ´ jvlK“-ëÓð’Å©¿æÐÙŸÈþÏ2° XP©,(«èaÈSÛùÿ|J’¤yXÓ¤Þ©ÿ<ü­§÷©ßð«¤'¨ìH“­W¦ÑÆi°î°Ô=áåáÿÌ Ÿ•Ê€²Š†<µfÇÑŸ‰$IzœÆßÿ|ø;žÌèò££¯K)¾é8M·ožýQþƒ >”z+N™ýÃÿùÚÇ€Je@YECž\÷Ø_‰þD$IÒã5§Þ'^þV€'µä 4½ç†è[SÚw5MšÞ½eöû‡þ—Ô;峿#üŸE  T* Ê*zòäg½;ú‘$IÓøšÓÂß °+úŸý?gÿPTjc;jâÎ_8¼dqê¯94u—¿ üŸ9 ^T* Ê*zòäü¸FI’æa“QêžðŠðwìªñµ§GßžRvÍðá4Ùzem\‘ë›ûQþóàŸ/€ÿÅ€Je@YECžÜäæK¢?I’ôs¯:5ü»cçߊn:Û£¯Pi×›ŽÓtûæ¹å¿áðÔ;ù·Rgfÿ𖞌•Ê€²Š†<‰™E©é?ý‰H’¤Ÿm2LÝã_ÿN€Ý4øÂ¿¾E¥Ç¯iÒôžÒø{kÒðÿûRïÔ7¥Î’Ãÿ™Ø]T* Ê*zòÄz'¾:úó$I?×øšÓÂß°§&7_}•J©ÙqgšlYŸ†—,Ný5‡¦îò†ÿ³P‚•Ê€²Š†<±¿ÏN’$Í£š&õV¾6ü{ª÷‰Wú—’Ú§5ÇÓdë•i´qÅì¿çè­<8üŸ€½Å[[¥² ¬¢‡!Olô­OD’$égšühCøûr /9"úJU[›ŒÒtÛÕiô“Óàü?™[œœÙ?ü›ØW,¨T”Uô0ä‰Mn½,úó$I?Sÿ´ß @¶ÅÏHÓ»}­ª5;¶Íý(ÿ¯~4õW’:KŸÿ}² RYPVÑÃ'0³(5ý¢?I’ô÷íüÛláï(dçR›´;5ÿtîû/žIý3~?uz^øw 0ßXP©,(«èaÈãëžðŠèOC’$ýLƒsÞþ>€’Æß?;úzÕ|mØI“­W¦ÑÆi°î°Ô[yðì_Tˆþfæ; *•e= y|ƒ³ÞýiH’¤¿¯yàÖÔ9âiáï(©{쯤føpô5«è¦ã4ݾ97­Nà ‡Ïý(ÿÅÏÿ>" *•e= y|£K—E’$éïnø¯áo؆_û«èkVû¸fǶ¹åÉâÔ?ý­©³ôYáß!@[XP©,(«èaÈãÛùÿŒK’¤øšÞý©»ì9áoØ+?#Mï¹!úºÕ^ªé?8÷£ü¯8&õךºG¿8þ›h1 *•e= y|̓·G’$)¥4º|yø»ö¦þéÿ*úºU‰†¹?ì߸" Ö–z+N™Eáß@M,¨T”Uô0䱺Ë_ýYH’¤©ûñ_ÀÞ6ùá£o]íNÓIšnߜƛV§á†ÃSÕ!³?Í!ú;¨•Ê€²Š†<ÖÎßÁ'I’â_sZø»ö…îq¿:û7È5?kvl›ýUÃKÏþ;ƒÎÒg…3<–•Ê€²Š†<Öð¢D’$)¥ÔûÔo„¿ `_Ùù‡ËНé?8÷£ü¯8&õךºG¿8üÛ`×XP©,(«èaÈc7ýmôg!IRõMnûVø›ö©%¥æ­ÑWp]ºsØÿ­¿IƒsÞ—º'¼"þ;`YP©,(«èaÈcMïú^ôg!IRõ Îû@ø›öµ­½Ôt’¦Û7§ñ¦Õi¸áðÔ_uHê,90üÌ(Ç€Je@YEC~Τ4êE’$U]Ó½göoA†¿ Àο‘®üšÛÒdËúÙ_­0û£üz^øÙ°wYP©,(«èaÈ£õV¼*ú“$©úF—/@”Þ)oL©i¢¯ãU3xhîGùo\‘g¿7uyIø9°ïYP©,(«èaÈ£ Îzwô'!IRÝ5ÓÔ=áåáoˆ4þÞ™Ñ7òüm2šûQþWšëK½•§ÎÌ¢ð3 ž•Ê€²Š†<Úð⿎þ$$IªºÉ¾þ€hÝã^ê×Óíl:IÓŸ^ŸÆ×œ–_úO©÷©ßHÅO?æ' *•e= y´ñ÷ÏŽþ$$IªºÁçÿuø{æƒÑ¥ËRm5;¶¥É–õixÉâÔ_shêõ¼ðs`á° RYPVÑÃGÛù7 $IRLMï¾ÔYr`ø{æ…¥ÏJ̓·§¶Ö J“­W¦ÑÆipö{S÷˜_Šÿ߀̀Je@YEC~ÆOKi<ˆþ$$Iª¶ÑÆãß0 ¾ðR+šŒÒtûæ4¾êÔ4XwXê­<8uföÿ߀v± RYPVÑÃGôN|Môç IRÕÍþ^ßyð&€ycfÿ4½sSZP5Ó¹?ì¿öô4\ÿáÔ;ù·RgñÓãÿ· õ,¨T”Uô0ä;ç°$IŠiúÓ`>êŸñ{i>×ìØ–&[Ö§á%‹SÍ¡©{ÔóÃÿ7 NT* Ê*zòˆÿ²B’$Å4Üpxø[æ«ÉM_Oó¡¦ÿ@šÜôµ4ºìc©¿ö©ûñ_ÿßþ *•e= yÄøús¢?I’êl:IÝc^þ€ùjçÑOM³oïçñ Mòwiôí•i°î°Ô[ñë©3³(ü x"T* Ê*zòˆé]×E’$UÙοIý€ùn|ÝY{ýGù¯?wö§òôW’:K ÿï »Ã€Je@YECþÞÌ¢”FÝèÏA’¤*œÿ'ño˜çºÇÿÚìßÊ/õ‡ý“-ëg^Í¡©»üáÿý —•Ê€²Š†Ìé÷«ÑŸ‚$Iu6¦îQÏ ÀB0Ú¸b·¯Úf°#M¶^9û»óGùwOxEøØ,¨T”Uô0dNÿôý)H’Te“^þ€…¢»ü…©é?øÄëtœ¦Û7§ñ¦ÕipÁ‡RoåÁ©3³ønØ,¨T”Uô0dÎðÂÿý)H’TeƒsÞþ€…døõÿù¨å?¾þÜ4Üpxê¯:$u–>3ü?D± RYPVÑÃ=ÿ1Š’$)³Q/u–=;ü ÊÒg¥þéoMÝýBü˜G,¨T”Uô0dÎ䯝D ’$U×dË—Âß´ƒ•Ê€²Š†Ìiî¿9úS$©ºç0ü @;XP©,(«èaÈ~©³äÀ”¦“èOA’¤ºj¦©{ÌKâß´‚•Ê€²Š†ì—z+_ýH’T]“­W†¿h *•e= Ù/õÏzWôg IRu /úHø€ö° RYPVÑÃýÒð«ÿoôg IRuõVüzø€ö° RYPVÑÃýÒø»§D’$UÕôž…ßÿ´‹•Ê€²Š†ì—&7}-ú3$©ªFß^~ÿÐ.T* Ê*z²_šÞwSôg IRUõÏüƒðû€v± RYPVÑðzGÒdýH’TOÓqêùâß´Š•Ê€²Š†µëÿ²èO@’¤ªšl½"üþ },¨T”Uô0¬]ÿ´ß‰þ$IªªáÅ3á÷?íc@¥² ¬¢‡aíç0ú$©ªz§ü³ðû€ö± RYPVÑðv£KŒþ$Iª¦¦ÿ@êq@øý@ûXP©,(«èaX»ñuk£?I’ªirÃ…áw?íd@¥² ¬¢‡aí¦·oŒþ$Iª¦á×þ*üî ,¨T”Uô0¬]óðO£?I’ª©ÿ™7‡ßý´“•Ê€²Š†U[ú¬”š&ú$©Ž&ÃÔYrPüý@+YP©,(«èaX³ÞŠ_>~I’ªirÛ·Âï~ÚË€Je@YEÚõOkôñK’TM£+>~÷Ð^T* Ê*zÖlpþŸD¿$IÕÔ?óÃï~ÚË€Je@YEÚ /ž‰>~I’ª©{ô‹Ãï~ÚË€Je@YEÚ¯þLôñK’TEÍ[Ãï}ÚÍ€Je@YEÚM~|QôñK’TE“œ~ïÐnT* Ê*zÖlºýÑÇ/IR /þëð{€v³ RYPVÑðfÍà¡èã—$©Šú«ß~ïÐnT* Ê*zÖª{äs£^’¤jêóKáw?íf@¥² ¬¢‡a­z+_}ô’$UQóÐá÷>íg@¥² ¬¢‡a­ú«ß}ô’$UÑdË—Âï}ÚÏ€Je@YEÃZ ¾ø§ÑG/IR¾±$üÞ ý,¨T”Uô0¬Õðâ™è£—$©Šg¿7üÞ ý,¨T”Uô0¬Õè;ŸŠ>zI’ª¨÷É×…ßû´Ÿ•Ê€²Š†µšüàü裗$©ýMÇ©³äÀð{€ö³ RYPVÑðVÓÛ7F½$I­ozÏÂï|ê`@¥² ¬¢‡a­šûo‰>zI’Zß䇄ßùÔÁ€Je@YEÃZ¥Q/úè%Ij}£Ë—‡ßùÔÁ€Je@YEÃu?ö‹ÑÇ.IR Ö~ïP *•e= kÔ;ñÕÑÇ.IRõ>ýOÂï}ê`@¥² ¬¢‡aú§½%úØ%Iª¢î‘ÿ üÞ T* Ê*zÖhpîû£]’¤Ö×tï ¿ó¨‡•Ê€²Š†5~ù/¢]’¤Ö7Ývuø@=,¨T”Uô0¬ÑèŠc¢]’¤Ö7Þ|^ø@=,¨T”Uô0¬ÑøšÓ¢]’¤Ö7ºòØð;€zXP©,(«èaX£É–/E»$I­o¸þÏÂï|êa@¥² ¬¢‡a&·}+úØ%Ij}ýÕo¿ó¨‡•Ê€²Š†5šÞó£èc—$©õõN|uø@=,¨T”Uô0¬QÓ»?úØ%IjwM“:KŸ~çP *•e= «sÄ)5Óèc—$©Õ5íñw>U± RYPVÑð6Ýc^}ä’$µ¾é›Âï|êb@¥² ¬¢‡amz+_}ä’$µ¾É_ ¿ó¨‹•Ê€²Š†µéö_F¹$I­o|ÍçÂï|êb@¥² ¬¢‡amŸOô‘K’ÔúF—/¿ó¨‹•Ê€²Š†µ|é?F¹$I­o¸áðð;€ºXP©,(«èaX›á×þGô‘K’Ôúgÿ›ð;€ºXP©,(«èaX›Ñ•ÇF¹$I­¯ÿ™7‡ßùÔÅ€Je@YEÃÚŒ¯Z}ä’$µ¾Þ'^~çP *•e= k3¾þÜè#—$©õu|nø@],¨T”Uô0¬ÍäÇ_>rI’ÚÝx~ßP *•e= k3½ã»ÑG.IR«kvÜ~ßP *•e= k3½÷Æè#—$©ÕM·ÿ ü¾ >T* Ê*zÖ¦éÜ}ä’$µºÉmß ¿ï¨•Ê€²Š†µI“aô‘K’Ôê&7\~ßP *•e= «²ìÙÑÇ-IRëoúÛø;€êXP©,(«èaX“î±ÿ0ú¸%Ij}£'†ßùÔÇ€Je@YEÚôV¾6ú¸%Ij}£o, ¿ó¨•Ê€²Š†5éúÏ£[’¤Ö7üò_„ßùÔÇ€Je@YEÚôÏø½èã–$©õ ¾ðïÃï|êc@¥² ¬¢‡aMúg½+ú¸%Ij}ýµï ¿ó¨•Ê€²Š†5¬ûwÑÇ-IRëÛùw¢ï|êc@¥² ¬¢‡aM†ë?}Ü’$µ¾þgþEø@},¨T”Uô0¬É𢿌>nI’Z_ïäß ¿ó¨•Ê€²Š†5}cIôqK’Ôúz'¾&üΠ>T* Ê*zÖdôÍã£[’¤Ö×=þeáw>õ± RYPVÑð&ãïž}Ü’$µ¾îÑ/¿ó¨•Ê€²Š†5ïÌèã–$©õu—='üΠ>T* Ê*zÖdòà ¢[’¤Ö×9â€ð;€úXP©,(«èaX“ÉÍG·$Iín<¿ï¨“•Ê€²Š†5™Þþíèã–$©Õ5ýÂï{êd@¥² ¬¢‡aM¦wnŠ>nI’Z]³ãÎðû€:YP©,(«èaX“é=7D·$I­®yè'á÷=u² RYPVÑð&Í·F·$I­®y`kø}@,¨T”Uô0¬Ióð]ÑÇ-IR«kî¿9ü¾ NT* Ê*zÖ¤é?}Ü’$µºé½7†ß÷ÔÉ€Je@YEÚü’$íݦwo ¿ï¨“?R©,(«èaX™E)5MôqK’Ôê¦Û7ÇßùTÉ€Je@YEÃj,9(ú¨%Ij}Ó»®‹¿ó¨’•Ê€²Š†µè~ì¢Z’¤Ö7½óÚð;€:YP©,(«èaX‹î1/‰>jI’ZßôŽ«Âï|êd@¥² ¬¢‡a-ºÇ¿,ú¨%Ij}ÓŸü]ø@,¨T”Uô0¬EoÅ«¢Z’¤Ö7¹í[áw>u² RYPVÑ𽕯>jI’Zßä¶o†ßùÔÉ€Je@YEÃZôNzCôQK’Ôú¦·;üΠNT* Ê*zÖ¢÷é}Ô’$µ¾éß ¿ó¨“•Ê€²Š†µèú¦è£–$©õMï¼6üΠNT* Ê*zÖ¢ÿ™}Ô’$µ¾é]×…ßùÔÉ€Je@YEÃZôO{KôQK’Ôú¦Û7‡ßùÔÉ€Je@YEÃZôOkôQK’Ôú¦wo ¿ó¨“•Ê€²Š†µè¯~[ôQK’Ôú¦÷Þ~çP' *•e= kÑ_shôQK’Ôúšûo ¿ó¨“•Ê€²Š†µè¯}gôQK’Ôúšo ¿ó¨“•Ê€²Š†µœýÞ裖$©õ5Ý~çP' *•e= k18ç}ÑG-IRëk¾+üΠNT* Ê*zÖbpîû£Z’¤Ö×tï ¿ó¨“•Ê€²Š†µœûGÑG-IRëk;Âï|êd@¥² ¬¢‡a-,H’´šŽÃï|êd@¥² ¬¢‡a-ç} ú¨%Iª¢ÎO ¿÷¨•Ê€²Š†µ° IÒ¾©»ì9á÷>õ± RYPVÑðƒóþ8ú¨%Iª¢îÑ/ ¿÷¨•Ê€²Š†µ° IÒ¾©{ܯ†ßûÔÇ€Je@YEÃZ Ö}Ô’$UQoÅ«Âï}êc@¥² ¬¢‡a-,H’´oêô†ð{€úXP©,(«èaX ’$í›z§¾)üÞ >T* Ê*zÖb°îßEµ$IUÔ?í-á÷>õ± RYPVÑð$Icm3S IDATÚ7õW¿=üÞ >T* Ê*zÖbpÞGµ$IUÔ?ë]á÷>õ± RYPVÑðƒsß}Ô’$UÑàÜ? ¿÷¨•Ê€²Š†µœýo¢Z’¤*\ð¡ð{€úXP©,(«èaX‹Áçß}Ô’$UÑð¢„ßûÔÇ€Je@YEÃZô×¾#ú¨%Iª¢Ñ7–†ßûÔÇ€Je@YEÃZô×}Ô’$UÑè[Ÿ¿÷¨•Ê€²Š†µè¯~{ôQK’TEã«?~ïP *•e= kÑ?ã÷¢Z’¤*_nø½@},¨T”Uô0¬Eÿs¿}Ô’$UÑäÇ…ßûÔÇ€Je@YEÃZôO{KôQK’TEÓÛ7†ßûÔÇ€Je@YEÃZô?óæè£–$©Š¦Û7‡ßûÔÇ€Je@YEÃZôVývôQK’TE̓·‡ßûÔÇ€Je@YEÃZô>ýO£Z’¤*jú†ßûÔÇ€Je@YEÃZôNz}ôQK’TGÍ4uf…ßýÔÅ€Je@YEÃZôN|uôQK’TMÝeÏ ¿û¨‹•Ê€²Š†µèžðò裖$©šºÿßÂï~êb@¥² ¬¢‡a-vþA„$IÚ7õV~÷P *•e= kÑ]þÂ裖$©šúŸysøÝ@],¨T”Uô0¬E÷ÈçFµ$IÕÔ_ûŽð»€ºXP©,(«èaX%Fµ$IÕ48ÿƒñw?U± RYPVÑð3‹Rjšèã–$©Š†}$þî *T* Ê*zÖ$M†ÑÇ-IR.?:üÞ .T* Ê*zÖ¤ìˆ>nI’ªh|Õ©á÷>u± RYPVÑð&M÷Þèã–$©ŠÆ›×…ßûÔÅ€Je@YEÚ4ý$ú¸%Iª¢É-—†ßûÔÅ€Je@YEÚLï½1ú¸%Iª¢é]×…ßûÔÅ€Je@YEÚLïú^ôqK’TEÍCw„ßûÔÅ€Je@YEÚLoÿvôqK’TGã~ø½@],¨T”Uô0¬ÉäæK¢[’¤jê,}føÝ@=,¨T”Uô0¬Éä† £[’¤jêû+áw?õ° RYPVÑð&ãëω>nI’ª©wÒÂï~êa@¥² ¬¢‡aMÆ×ž}Ü’$USÿs¿~÷P *•e= k2úÎÉÑÇ-IR5 Î}øÝ@=,¨T”Uô0¬Éè›ÇG·$IÕ4üòŸ‡ßýÔÀJe@YEÚŒ.]}Ü’$UÓèò£Ãï~êa@¥² ¬¢‡aM†_ûÑÇ-IR5¯ù\øÝ@=,¨T”Uô0¬ÉpÃáÑÇ-IR5M~´!üî T* Ê*zÖdpþ£[’¤jšn»:üî T* Ê*zÖdpö{£[’¤jjúIøÝ@=,¨T”Uô0¬IõÛ¢[’¤zš SgfQøý@,¨T”Uô0¬IÕ!ÑÇ-IRUuz~øý@,¨T”Uô0¬Iï¤×G·$IUÕ;ñ5á÷?u° RYPVÑð&Ý^}Ü’$UUÿ´·„ßÿÔÁ€Je@YEÚt—¿0ú¸%IªªÁ9ÿ6üþ T* Ê*zVeÉÑÇ-IRU 7ÿP *•e= k“&Ãè#—$©šF—~÷P *•e= kÓôî‹>rI’ªi|õgÃï~ê`@¥² ¬¢‡amšn>rI’ªirÃ…áw?u° RYPVÑð6ÓŸ~?úÈ%Iª¦é׆ßýÔÁ€Je@YEÃÚLn½<úÈ%Iª¦¦³=üî T* Ê*zÖfòà ¢\’¤zjšÔYr`øý@ûYP©,(«èaX›ñ5Ÿ‹>rI’ªª{üËÂïÚÏ€Je@YEÃÚŒ¾yBô‘K’TU½U¿~ÿÐ~T* Ê*zÖfxñ_G¹$IU58û½á÷?íg@¥² ¬¢‡am†ëÿ,úÈ%Iªªá—ÿ<üþ ý,¨T”Uô0¬ÍàÜ÷G¹$IU5ºò¸ðû€ö³ RYPVÑð6ý3~?úÈ%IªªñukÃïÚÏ€Je@YEÃÚôNycô‘K’TU“[/ ¿ÿh? *•e= kÓû›ÿ=úÈ%Iªªé}?¿ÿh? *•e= kÓ]þ‚è#—$©®F½ðû€ö³ RYPVÑð:GR3>vI’ªª{Ôóâß´š•Ê€²Š†5júD»$IUÕûäëÂïÚÍ€Je@YEÃ5÷ß}ì’$UUÿŒß¿ÿh7 *•e= k4Ývuô±K’TUƒó?~ÿÐnT* Ê*zÖhrÓ×£]’¤ª^rDøý@»YP©,(«èaX£ñõçD»$IU5¾ú3á÷?íf@¥² ¬¢‡aÆß=%úØ%IªªÉM_ ¿ÿh7 *•e= k4º|yô±K’TUÓ{n¿ÿh7 *•e= k4¼è/£]’¤ºõRgfQø€ö² RYPVÑðFƒ/þiô±K’T]Ý£_þ ½,¨T”Uô0¬Ñà¬wG»$IÕÕûô? Ð^T* Ê*zÖ¨Ú[¢]’¤ê|þ=áoÚË€Je@YEÃõNzCô±K’T]ïü·ð7íe@¥² ¬¢‡aºÇ½4úØ%Iª®ÑÆáoÚË€Je@YEÃ*-90¥¦‰>zI’ªjòÃ/Æ¿h- *•e= kÕôˆ>zI’ªjºíšðû€ö² RYPVÑðVÓ»·D½$IUÕtï ¿ÿh/ *•e= k5¹õ²è£—$©ººËžþ ,¨T”Uô0¬Õøús¢^’¤êêøšð7íd@¥² ¬¢‡a­Fß^}ô’$UWõÛÂß´“•Ê€²Š†µ~ýF½$IÕ5øÒ ÐNT* Ê*zÖjðÅ?>zI’ªktÙQáoÚÉ€Je@YEÃZõÏüƒè£—$©ºÆ×­ ÐNT* Ê*zÖªwÊ£^’¤êšÜö­ð7íd@¥² ¬¢‡a­ºÇ¿,úè%Iª®æá»Âß´“•Ê€²Š†ÕZrPôÑK’TeÝeωÐ:T* Ê*zÖ¬<}ü’$UW Ð>T* Ê*zÖlzïÑÇ/IRuõÏüÃð7íc@¥² ¬¢‡aÍ&[¯Œ>~I’ªkøå?Ð>T* Ê*zÖl¼ù¼èã—$©ºFO Ð>T* Ê*zÖlôw'E¿$IÕ5¹áÂð7íc@¥² ¬¢‡a͆ÏD¿$IÕ5ݾ9ü @ûXP©,(«èaX³ÁŠ>~I’êkÔK™EáïÚÅ€Je@YEÚõ×¾#úø%Iª²îÇ9ü@»XP©,(«èaX³Þ©oŠ>~I’ª¬¿êðwíb@¥² ¬¢‡aͺ'¼<úø%Iª²ÁºÃÂß´‹•Ê€²Š†U[úÌèã—$©Ê†—,ŽÐ*T* Ê*zÖ®>ý H’T]ãkÏÐ.T* Ê*zÖnzïÑŸ€$IÕ5ÙzEø€v± RYPVÑðv“[¾ý H’T]ÍCw„¿h *•e= k7Þ´:ú$©¾š&u–þ =,¨T”Uô0¬Ýè²£¢?I’ª¬wâkÂß´‡•Ê€²Š†µ®ÿpô' IR•õ×þ =,¨T”Uô0¬]ÿÌ?ˆþ$Iª²á—ÿ"ü@{XP©,(«èaX»Þ§~#ú$©ÊFß99ü@{XP©,(«èaX»îòF’$UÙ䦯‡¿h *•e= «7³(¥Q/ú3$©ºš¶Æ¿h *•e= Ù/Mïûqôg IR}5ÓÔYúÌðwí`@¥² ¬¢‡!û¥É-—F’$UYoåÁáïÚÁ€Je@YECöKãMýH’TeýµïÐT* Ê*z²_]¾<ú3$©Ê†}$ü@;XP©,(«èaÈ~i¸þÏ¢?I’ªl|Õ©áïÚÁ€Je@YECöKý3ÿ0ú3$©Ê&·\þ ,¨T”Uô0d¿Ô;ù7£?I’ª¬yèŽðwí`@¥² ¬¢‡!û¥îÑ/Šþ $Iª³¦IeÏ °ðYP©,(«èaÈ~©3³È¥ IRP½“^ÿ`Áóg=*•e= ™3½ï¦èOA’¤*|þ=áï> *•e= ™3¹õ²èOA’¤*~í¯Âß,|T* Ê*z2gü½5ÑŸ‚$IU6¾æ´ðw Ÿ•Ê€²Š†Ì]~tô§ IR•M¶^þ`á³ RYPVÑÃ9à ÿsô§ IR•5ßþ`á³ RYPVÑÃ9ýµïˆþ$Iª¶î‘Ï  °°YP©,(«èaÈœÞÉ¿ý)H’Tm½“+ü-ÀÂf@¥² ¬¢‡!sºG¿(úS$©ÚçþQø[€…Í€Je@YECÑ vD’$UÙèKÃß,lT* Ê*zòˆéO¯þ$Iª²ñõç„¿XØ,¨T”Uô0ä“-ë£?I’ªlz×÷Âß,lT* Ê*zòˆÑÆ£?I’êlÔK™ýÃß,\T* Ê*zòˆá—ÿ<ús$©ÚºÇÿZø[€…Ë€Je@YECÑ_ûŽèÏA’¤jë¯~[ø[€…Ë€Je@YECÑ;é ÑŸƒ$IÕ¶ó'ñD¿X¸,¨T”Uô0äÝ#Ÿý9H’Tmãï~:ü-ÀÂe@¥² ¬¢‡!Öôî‹þ$$Iª²É-ß°pYP©,(«èaÈ£M·]ýIH’TeÍŽ;Ãß,\T* Ê*zòhãÍçE’$U[÷c¿þ`a² RYPVÑÃG]ylô'!IRµõNycø[€…É€Je@YECm¸þÃÑŸ„$IÕ6XwXø[€…É€Je@YEC­¿úíÑŸ„$IÕ6ºìcáo& *•e= y´Þ‰¯Žþ$$Iª¶ñæuáo& *•e= ù9KJ©i¢? I’ªlº}sü[€É€Je@YEC«Ùqgôg!IRM†©sÄÓÂßÿ?{÷µ UØw~Ei&1¦±¹˜•Iš413µ¦—$š5m¢mBm;«I&íŒN]µMk5®L“tšs "DEDH/¨¨ " Þ/ˆ¢ˆ bðrñö>÷Ëžuð¤Áp;çìý¾¿çyöç»Öç8g?›ýx~¾g €µc V¨ªôeÈ=Í?ÿ¾ô±$©Û†'üDü-Àú1P« TUú2äžf}UúXH’Ôm£³þEü-Àú1P« TUú2䞦ï::},$Iê¶É[ÿ þ`ý¨Uª*}rOãóžœ>’$uÛìC/‹¿X?j•€ªJ_†ÜÓ远>’$uÛâ/®ˆ¿X?j•€ªJ_†ÜÓà?–>’$uÛrüõ²µ{Wü=Àz1P« TUú2ä^ì9¬”Å,}4$Iê¶ÁŸþpþ=ÀZ1P« TUú2äÞ-î¸1}4$Iê¶Ñ+ÿYü-Àz1P« TUú2äÞÍox[úhH’Ôm“‹~?þ`½¨Uª*}rï¦W¾8}4$Iê¶ÙO‹¿X/j•€ªJ_†Ü»É…OO I’ºmþù÷Æß¬µÊ@U¥/CîÝèŒ_K I’ºm9újü-Àz1P« TUú2äÞ Oø‰ôÑ$©ëÇÿPü=Àú0P« TUú2ä>ì9¬”ù$}<$Iê¶ÑéË¿Xj•€ªJ_†Ü·ÅíŸNI’ºmráÓãoÖ‡€Ze ªÒ—!÷mþ©·¤‡$IÝ6»êÔø[€õa V¨ªôeÈ}›¾ï…éã!IR·Íoº,þ`}¨Uª*}rß&ü§ôñ$©Û–Ã;ãoÖ‡€Ze ªÒ—!÷mtúãÓÇC’¤®÷ñ÷ëÁ@­2PUéËû6xþßNI’ºnôŠ_Ž¿Xj•€ªJ_†ÜÝò I’‚MÞü´ü{€µàÏtÔ*U•¾ ¹‹¯|2}D$Iê¶éþ,þ`=¨Uª*}rÿæ×½)}D$Iê¶ùçÞ ° Ô*U•¾ ¹Ó÷>?}D$Iê¶åà¶ø[€õ` V¨ªôeÈý¿é?¤ˆ$I]7xî÷Å߬>µÊ@U¥/Cîßèåÿ4}D$IêºÑËÿIü=Àê3P« TUú2äþ þô‡ÓGD’¤®›¼ùiñ÷«Ï@­2PUé˰{W)“­ô1‘$©ÛfWš°ò Ô*U•¾ y`‹[>–>&’$uÛüóï‹¿X}j•€ªJ_†<°Ù'Þ>&’$uÛrüõ»~"Oú=Àj3P« TUú2äM/;.}L$IêºÁó~$þ`µ¨Uª*}òÀÆo|Jú˜H’Ôu£³þEü=Àj3P« TUú2ä^úKéc"IR×MÞñÇñ÷«Í@­2PUéË68öéc"IR×Í>úªø{€Õf V¨ªôeÈYnKI’ºmñåkâoV›€Ze ªÒ—!f~Óeé£"IR¿Í'ekïCâïV—€Ze ªÒ—!föÁÓÒGE’¤®žôèø{€Õe V¨ªôeÈ™\ôÌôQ‘$©ëƯû­ø{€Õe V¨ªôeÈñ«é£"IR×Mßutü=Àê2P« TUú2äÀ žÿ£é£"IR×Í?y~ü=Àê2P« TUú2äíÞUÊd+}\$Iê¶Å7æß¬,µÊ@U¥/CÜâKII’úm¹(ƒgWü=Àj2P« TUú2äÀÍ®yuú¸H’ÔuÃS.þ`5¨Uª*}rà&ÿIú¸H’Ôuã7>%þ`5¨Uª*}ràÆgÿzú¸H’ÔuÓ÷½0þ`5¨Uª*}rà†'ýLú¸H’Ôuóß°š Ô*U•¾ 9{ZÊb–>2’$uÛò›·ä߬$µÊ@U¥/CÎâ¶ëÓGF’¤®<÷ûãïV€Ze ªÒ—!gþÉóÓGF’¤®½â—ãïV€Ze ªÒ—!gúžç¦Œ$I]7¹ðñ÷«Ç@­2PUé˃3~Ão§Œ$I]7ûðËãïV€Ze ªÒ—!gxêÏ¥Œ$I]·øâ‡âïV€Ze ªÒ—!gpôw—²\¦$Iý6—­=‡Å߬µÊ@U¥/CÞòë_HI’ºnxÒ£ãïV‹€Ze ªÒ—!o~ã;ÓÇF’¤®¿î߯߬µÊ@U¥/CÞôý'¥$I]7}ÏsãïV‹€Ze ªÒ—!orÁJI’ºn~ýEñ÷«Å@­2PUé˃7zù?MI’ºnùõ/Ä߬µÊ@U¥/CÞàØ¿•>6’$ußà¹ß°: Ô*U•¾ 94Ë­[ÓGG’¤®½â—ãïV‡€Ze ªÒ—!‡fþ™‹ÓGG’¤®›\ôÌø{€Õa V¨ªôeÈ¡™^qbúèH’Ôu³¼2þ`u¨Uª*}rhÆçÿûôÑ‘$©ë_º:þ`u¨Uª*}rh†/ùßÒGG’¤¾›OÊÖÞ‡Æß¬µÊ@U¥/CÍà臕²\¦$I]7|ñß¿ X j•€ªJ_†ºåWoJI’ºn|Îÿ° Ô*U•¾ 9tóO½9}|$Iêºéå° Ô*U•¾ 9tÓ÷<7}|$Iêºù o¿X j•€ªJ_†ºñ9OLI’ºn¹ukü=Àj0P« TUú2äÐ OylúøH’Ô}ƒã~ þ& Ï@­2PUéË G^Êb–>B’$uÝèôÇçßĨUª*}Rgñ•ëÒGH’¤®›¼íÿ¿È3P« TUú2¤Îìã¯O!I’ºnöѳâïò Ô*U•¾ ©3¹doúI’Ôu‹[>g V¨ªôeHñÙ¿ž>B’$õÝbV¶Ž:<þ& Ë@­2PUéË:Õ>B’$ußð”ÇÆßd¨Uª*}RiσK™ÓÇH’¤®Ÿ÷»ù7Qj•€ªJ_†Ô[|é#éc$IR×M¯xQü=@–€Ze ªÒ—!õfWŸ‘>F’$uÝü¦Ëâï² Ô*U•¾ ©7yû¦‘$I]·½lí~PüM@Ž€Ze ªÒ—!õFg™>F’$ußð„Ÿˆ¿ È1P« TUú2¤Þày?’>F’$ußøì߈¿ È1P« TUú2¤Ý»ÊrôÕôQ’$©ë¦ï~NþM@Œ€Ze ªÒ—!mÌoº<}”$IêºùõÆßä¨Uª*}ÒÆôÊ“ÓGI’¤®[~ãKñ÷9j•€ªJ_†´1>ÿ©é£$IR÷ ŽûÁø›€ µÊ@U¥/CÚžúóé£$IR÷ÎøÕø›€ µÊ@U¥/Cyöw–²\¤“$I]7yÇçßD¨Uª*}ÒÎâ¶ëÓÇI’¤®›}üuñ÷j•€ªJ_†´3ûøëÓÇI’¤®Û7ÆK¿È0P« TUú2¤É;ÿ{ú8I’ÔwËEý°ø›€g V¨ªôeH;£³ž>N’$ußè´#âovž€Ze ªÒ—!í ž÷#éã$IR÷MÞü´ø›€g V¨ªôeH[ËÁíé#%IR×Í>ô²ø{€g V¨ªôeH[óϽ;}¤$IêºÅ?°ó Ô*U•¾ ikzÅ‹ÒGJ’¤¾›OÊÖÞ‡Æßì,µÊ@U¥/CÚŸ÷äô‘’$©û†'?&þ&`g¨Uª*}à¾xô IDATÒÖðÏþAúHI’Ô}ã7üvüMÀÎ2P« TUú2¤±£/e1K+I’ºnú¾æßì(µÊ@U¥/CÚ[Üú‰ô±’$©ëæŸ{wü=ÀÎ2P« TUú2¤½ÙÇÎN+I’ºn9þzÙÚ½+þ&`ç¨Uª*}ÒÞäœ>V’$ußà?°s Ô*U•¾ iotƯ¥•$IÝ7>û×ãovŽ€Ze ªÒ—!í Žÿ¡ô±’$©û¦ï96þ&`ç¨Uª*}²=–[·¦–$I]7¿ámñ÷;Ç@­2PUéËí1ÿÌÅé£%IR×-·ÅßìµÊ@U¥/C¶Çô½/H-I’ºo𼉿 Øj•€ªJ_†lñ~;}´$Iê¾Ñ«ÿø›€a V¨ªôeÈöžòØôÑ’$©û¦ï::þ&`g¨Uª*}²Mö>´”Ù8}¼$IêºùõæßìµÊ@U¥/C¶Ïâ‹N/I’ºnùÍ[âïv†€Ze ªÒ—!Ûgö¡—¥—$IÝ78þ‡âo¶Ÿ€Ze ªÒ—!Ûgòæÿœ>^’$ußèUÿ2þ&`û¨Uª*}²}†§ýbúxI’Ô}“KöÆßl?µÊ@U¥/C¶Ñ³¿³”Å<}Ä$Iêºùuäßl;µÊ@U¥/C¶×â+×¥˜$I]·üúâï¶Ÿ€Ze ªÒ—!ÛkvÍkÒGL’¤î÷ƒñ7ÛË@­2PUéËí5yÛM1I’ºotæ‘ñ7ÛË@­2PUéËí5zů¤˜$IÝ7¹øOâo¶—€Ze ªÒ—!Ûkðœ¿YÊr™>f’$uÝü“oŒ¿ Ø^j•€ªJ_†l¿åWoJ3I’ºnùµÏÇßl/µÊ@U¥/C¶ß¾ÿס$IÊ6xî÷ÅßlµÊ@U¥/C¶ßä’=éc&IR÷^ùÏão¶€Ze ªÒ—!Ûoôª™>f’$ußäÿ-þ&`û¨Uª*}²ýúÃéc&IR÷Í®='þ&`û¨Uª*}²3–ß¼%}Ô$IêºåŸ¿Ø>j•€ªJ_†ìŒù oO5I’ún¹,ƒc°= Ô*U•¾ ÙÓËŽK5I’ºotúãâo¶‡€Ze ªÒ—!;cüºßJ5I’ºoòö?Œ¿ Øj•€ªJ_†ìŒá 2}Ô$Iê¾ÙÇ^°= Ô*U•¾ Ù!»T–ão¤›$I]·¸ã†ü›€ma V¨ªôeÈΙßtYú¸I’ÔwËe<ç{ãoÚ3P« TUú2dçL¯xQú¸I’Ô}£ÓО€Ze ªÒ—!;gü†ßI7I’ºoòŽ?Ž¿ hÏ@­2PUéË3<ù拏$IÝ7»öÜø›€ö Ô*U•¾ ÙA{+e:L9I’ºnùÕ›òoš3P« TUú2dg-n¾2}ä$Iê¾Ás¿?þ& -µÊ@U¥/CvÖô§¤œ$IÝ7:ã×âoÚ2P« TUú2dgÏ{rúÈI’Ô}“‹wÇß´e V¨ªôeÈΞü˜ô‘“$©ûæ×½)þ& -µÊ@U¥/CvØžÃJ™ÓÇN’¤®[~óËù7M¨Uª*}²ó7_™>v’$ußàøŠ¿ hÇ@­2PUéË7ýÀ)éc'IR÷^õ¯âoÚ1P« TUú2dçÏ{rúØI’Ô}ÓKŸÐŽ€Ze ªÒ—!;oxòcÒÇN’¤î›_QüM@;j•€ªJ_†ì9¬”é0}ô$Iêºåà¶ü›€f Ô*U•¾ ÉXÜ|eúèI’Ô}ƒçÿhüM@j•€ªJ_†dL?pJúèI’Ô}ã³=þ&  µÊ@U¥/C2Æç=9}ô$Iê¾é{Ž¿ hÃ@­2PUéËŒáÉI=I’ºo~ã;ãoÚ0P« TUú2$dÏa¥L‡éã'IR×-‡w–­Ý»ò直Uª*}’³¸ùÊôñ“$©û†'üDüM@=µÊ@U¥/Cr¦8%}ü$Iê¾ñëþmüM@=µÊ@U¥/CrÆç=9}ü$Iê¾éåÏ‹¿ ¨g V¨ªôeHÎðäǤŸ$IÝ7ÿÜ»ãoê¨Uª*}´ç°R¦Ãô”$©ë–“o–­ÝÊ¿ ¨b V¨ªôeHÖâæ+ÓGP’¤î¾è§ãoê¨Uª*}’5ýÀ)é#(IR÷Ï}RüM@µÊ@U¥/C²Æç=9}%Iê¾é'ÆßÔ1P« TUú2$kxòcÒGP’¤î›þ}ñ7u Ô*U•¾ ÛsX)ÓaúJ’ÔwÓÁ]ÿMŽ¿ 8dj•€ªJ_†ä-þâŠô1”$©û†§<6þ&àШUª*}’7½âEéc(IR÷ÏjüMÀ¡3P« TUú2$o|ÎÓÇP’¤î›}è¥ñ7‡Î@­2PUé˼á‰?•>†’$ußâË¿ 8tj•€ªJ_†¬€Ý»ÊrôÕôQ”$©ïó²õìïÌ¿ 8$j•€ªJ_†¬†ùg/MEI’ºoôÒ_Š¿ 84j•€ªJ_†¬†éeǧ¢$IÝ7yëÄßµÊ@U¥/CVÃøìßHEI’ºoö±×ÆßµÊ@U¥/CVÃàù?š>Š’$ußòÎÏÄßµÊ@U¥/CVÇrëÖôq”$©ûÏýþø›€ƒg V¨ªôeÈê˜_Qú8J’Ô}£3Œ¿ 8xj•€ªJ_†¬Žé¥ÏJGI’ºorÉÞø›€ƒg V¨ªôeÈêõ„ôq”$©ûæŸzKüMÀÁ3P« TUú2du Žûôq”$©û–[_‰¿ 8xj•€ªJ_†¬–å×þ"}$%Iê¾Á ~,þ&àà¨Uª*}²ZæŸ8/}$%Iê¾ñë~+þ&àà¨Uª*}²Z&ïøoé#)IR÷Mßûüø›€ƒc V¨ªôeÈjþ¸ô‘”$©ûæŸ{OüMÀÁ1P« TUú2dµ Žyx)ËeúXJ’ÔwÓAÙÚsXü]À3P« TUú2dõ,î¸!},%Iê¾áɉ¿ 8pj•€ªJ_†¬žÙ5¯IKI’ºoüƧÄß8µÊ@U¥/CVÏä¢g¦¥$IÝ7»êÔø›€g V¨ªôeÈê½ô§¥$IÝ·øÒGâoœ€Ze ªÒ—!+èYÿS)‹YúhJ’Ôw‹YÙzöwæßµÊ@U¥/CVÓâ–§¦$IÝ7:íˆø›€c V¨ªôeÈjš}øåé£)IR÷M.úýø›€c V¨ªôeÈj¿é?¤¦$IÝ7»æÕñ7Æ@­2PUéËÕ4<ågÓGS’¤î[ÜqCüMÀ1P« TUú2dEí9¬”é }<%Iê»å² Ž}Dþ]À2P« TUú2duÍ?ÿÞôñ”$©ûF¯üçñ7Ì@­2PUéËÕ5}ß éã)IR÷M.ÞðÀ Ô*U•¾ Y]ã×ÿ»ôñ”$©ûæŸzKüMÀ3P« TUú2du Oø;éã)IR÷-·—­Ý»âïZe ªÒ—!«m¹ukúˆJ’Ô}ƒüxüMÀý3P« TUú2dµÍ¯¿0}D%Iê¾}-OúMÀý3P« TUú2dµM.Ù›>¢’$ußôŠãoZe ªÒ—!«mtæ‘é#*IR÷-n¾2þ&àþ¨Uª*}²ÚÇ>¢”å2}L%Iê»Ù¸luxü]À}3P« TUú2dõ-ïüLú˜J’Ô}ÃS.þ&ྨUª*}²úf;;}L%Iê¾É[þKüMÀ}3P« TUú2dõM.zfú˜J’Ô}³¾*þ&ྨUª*}²úF§‘>¦’$ußâŽâoZe ªÒ—!kਿQÊ|š>ª’$õÝrYÇþ­ü»€{e V¨ªôeÈzX|é#é£*IR÷Î<2þ&àÞ¨Uª*}²fWš>ª’$ußôÒgÅßÜ;µÊ@U¥/CÖÃø¼'§ª$IÝ7¿ámñ7÷Î@­2PUéËõ0|ñÿš>ª’$ußrôÕ²µ{Wü]À=¨Uª*}²&v?¨,Ç_OWI’ºoxâ£òïîÁ@­2PUéËõ1ÿì»ÒÇU’¤îŸû¤ø›€{2P« TUú2d}L/;>}\%Iê¾é•'ÇßÜ“€Ze ªÒ—!ëc|öo¤«$IÝ·øÂãoîÉ@­2PUéËõ1xÞÿœ>®’$i>-[ÏúŽø»€og V¨ªôeÈzY~ã‹é#+IR÷ OûÅø›€og V¨ªôeÈz™òüô‘•$©û&=3þ&ðkðí Ô*U•¾ Y/“wþ÷ô‘•$©ûf{müMÀ·3P« TUú2d½ŒN|úÈJ’Ô}˯~.þ&àÛ¨Uª*}²^Ç<¼”å"}l%Iê¾Áq?ðW Ô*U•¾ Y?‹Û>•>¶’$ußèUÿ*þ&௨Uª*}²~fWŸ™>¶’$ußôÝω¿ ø+j•€ªJ_†¬ŸÉ›Ÿ–>¶’$ußü3ÇßüµÊ@U¥/CÖÏðÔŸK[I’ºo9þFÙÚý ø»€o1P« TUú2d ux)³qúèJ’Ô}Ó~&ÿ.à.j•€ªJ_†¬§ÅÍH]I’ºo|Þ“ão¾Å@­2PUéËõ4½òÅé£+IR÷Í>ôÒø›€o1P« TUú2d=Ï}RúèJ’Ô}‹[¯¿ øµÊ@U¥/CÖÓðÄŸJ]I’´\–Á1ß` v¨ªôeÈšÚ½«,‡w¦¯$IÝ7:ýñùwj–€ªJ_†¬¯ùïH_I’ºorÉžø›µË@U¥/CÖ×ôÝǤ¯$IÝ7ÿô[ão Ô.U•¾ Y_£Wÿëôñ•$©û–£¯–­ÝŠ¿ zg V¨ªôeÈú÷ƒéã+I’J)Ãý/ñw@ï Ô*U•¾ Yo˯}>}„%Iê¾ñy¿ôÎ@­2PUéËõ6»öœô–$©ûf<-þ&è€Ze ªÒ—!ëmòö?LaI’ºoqËÇâo€Þ¨Uª*}²ÞF/ÿ'é#,I’–‹28æáñw@Ï Ô*U•¾ YoƒgW)‹yúK’Ô}£ÓôÌ@­2PUéËõ·¸åãéc,IR÷M.ÞôÌ@­2PUéËõ7ûðËÓÇX’¤î›_aüMÐ3µÊ@U¥/CÖßøü§¦±$IÝ·ÞY¶v ze V¨ªôeÈúžòØô1–$I¥”á‰?ôÊ@­2PUéË °çÁ¥L¶ÒGY’¤î¿áwòï€N¨Uª*}²æ7]–>Ê’$ußìªSão€^¨Uª*}²¦—?/}”%Iê¾Å—¯‰¿ ze V¨ªôeÈf¿ö7ÓGY’$-epôwÇß=2P« TUú2d3 ž÷#é£,I’J)£WüJü]Ð#µÊ@U¥/C6Çò_LgI’ºorñŸÄß=2P« TUú2dsÌ?y~ú8K’Ô}óO½%þ&è‘€Ze ªÒ—!›còÎÿ/}œ%Iê¾åàö²µ{Wü]еÊ@U¥/C6Ǿ¿sX’$åžø¨ø» 7j•€ªJ_†lŽÁÑ+e¹HiI’ºo|îÿôÆ@­2PUéËͲøÊ'ÓGZ’¤î›]õçñ7@o Ô*U•¾ Ù,³œž>Ò’$ußâË¿ zc V¨ªôeÈf™\ð{é#-I’–‹28æáñw@O Ô*U•¾ Ù,Ã?ûûé#-I’J)£ÓôÄ@­2PUéË ³÷!¥Léc-IR÷M.Ù›tÄ@­2PUéËÍ3ÿü{ÓÇZ’¤î›ßðöø› 'j•€ªJ_†lžéûNHkI’ºo9þzÙÚóàø» j•€ªJ_†lžñë~+}¬%IR)exòß‹¿ za V¨ªôeÈæ<ÿo§µ$I*¥L.ø½ø» j•€ªJ_†l¦å7oImI’ºoöѳâo€^¨Uª*}²™æŸzsúhK’Ô}Ë;?ôÂ@­2PUéËÍ4¹øOÒG[’$•RÇ?2þ.è€Ze ªÒ—!›iôÊ–>Ú’$©”2>û×ãUª*}²™Ç|O)ËEúxK’Ô}Ó÷>?þ.è€Ze ªÒ—!›kqÛ§ÒÇ[’¤î[üÅûão€¨Uª*}²¹fWŸ‘>Þ’$i>-[ÏúŽø»`Ó¨Uª*}²¹&oþÏéã-I’J)£—þãø»`Ó¨Uª*}²¹†þÓÇ[’$•R&oÿ£ø»`Ó¨Uª*}²Áö>¤”é0}Ä%Iê¾ù'ÏÏ¿ 6œ€Ze ªÒ—!›mñïOqI’ºo9¸­líÞl2µÊ@U¥/C6ÛôŠÓG\’$•R†'>*þ.Ødj•€ªJ_†l¶ñëÿ¯ô—$I¥”ñ~'þ.Ødj•€ªJ_†l¶á '}Ä%IR)eöÁÓâï€Mf V¨ªôeȆ۽뮿wX’$e[Üú‰ü»`ƒ¨Uª*}²ùæ×_˜>æ’$i¹,ƒç|oü]°© Ô*U•¾ Ù|“Kö¦¹$I*¥ŒÎ<2þ.ØTj•€ªJ_†l¾Ñ¿š>æ’$©”2}÷1ñwÀ¦2P« TUú2dóíûqÃû~ì°$IÊ6ÿì¥ñwÀ¦2P« TUú2¤‹Û?>ê’$i²U¶ö>$þ.ØDj•€ªJ_†ôaöÑW¥º$I*¥ ÿüÆß›È@­2PUéË>LÞò_ÒG]’$íû!>#þ.ØDj•€ªJ_†ôaxêϧº$I*¥Ì®='þ.ØDj•€ªJ_†tâ¨ÃK™ÓÇ]’¤î[~ó–ü»`¨Uª*}ÒÅÍHwI’TJžðñwÀ¦1P« TUú2¤Ó÷Ÿ”>î’$©”2>ïwãï€Mc V¨ªôeH?Æç<1}Ü%IR)eö¡—Åß›Æ@­2PUéË~ _ø“éã.I’J)‹Û®¿ 6€Ze ªÒ—!Ù½«,·§¼$I*¥ ŽûÁüÛ`ƒ¨Uª*}Ò—ù oKyI’TJ¿æßÄß›Ä@­2PUé˾L/}VúÈK’¤RÊô}'Äß›Ä@­2PUé˾ŒÎ<2}ä%IR)eñ…«âï€Mb V¨ªôeH_Ç>¢”å2}ì%IÒbVÏþ®øÛ`S¨Uª*}ÒŸÅ7¦½$I*¥Œ^ñ+ñwÀ¦0P« TUú2¤?³k^“>ö’$©”2¹doü]°) Ô*U•¾ éÏäÂg¤½$I*¥Ì?sqü]°) Ô*U•¾ éÏð%¿>ö’$i_“­²µ÷!ñ·À&0P« TUú2¤CG^Êlœ>ú’$©”2üó”lµÊ@U¥/Cú´øÂUé£/I’öý€‹žlµÊ@U¥/Cú4½òÅé£/I’J)³O¼!þ.Øj•€ªJ_†ôi|ÎÓG_’$•R–[_)[»wÅßëÎ@­2PUéË> O|TúèK’¤ýíûïrúm°î Ô*U•¾ éÔî]e9¸=}ü%IR)eüƧäßkÎ@­2PUéË~Íox[úøK’¤RÊì Ö€Ze ªÒ—!ýš^ú¬ôñ—$I¥”Å7ÄßëÎ@­2PUéË~Î<2}ü%IÒþÇ?2þ6Xgj•€ªJ_†ôkpì#JY.ÓI’TJŸýñ·À:3P« TUú2¤o‹;nL$IR)ezÅ‹âï€uf V¨ªôeHßf×¼:ý$I¥”Å—®Ž¿ Ö™€Ze ªÒ—!}›\øŒôG@’$ík¹(ƒc¾'þ6XWj•€ªJ_†ômø’_H$IÒþFg=!þ6XWj•€ªJ_†tî¨ÃK™ÓI’TJ™^þ§ù·Àš2P« TUú2„Å®J $IR)eqó•ñwÀº2P« TUú2„é•/N $IÒ¾³28úañ·À:2P« TUú2„ñ9OL $IÒþF§?>þ6XGj•€ªJ_†0|áO¦?’$iÓw¬#µÊ@U¥/CØÚ½«,·§? ’$©”2ÿÜ{òo€5d V¨ªôeûÌ?ýÖôGA’$ík6.[GýøÛ`ݨUª*}Â>ÓKŸ•þ(H’¤ý^ö¿ÇßëÆ@­2PUéËöydú£ I’ö7¹xwüm°n Ô*U•¾ aŸÁ±(e¹L$IR)e~ã;ão€uc V¨ªôeiqÇéƒ$IÚ×tP¶ö>4þ6X'j•€ªJ_†ð—f×¼:ýq$Iû¾äâo€ub V¨ªôeiráÓÓI’´¿ÉÛÿ0þ6X'j•€ªJ_†ð—†§þ|úã I’ö7ÿÔ[âo€ub V¨ªôeÿÃQ‡—2§?’$©”²}­líypþ}°& Ô*U•¾ áî_¸*ý‘$Iûžò³ñ·Àº0P« TUú2„»›^ùâôGB’$íorÑïÇßëÂ@­2PUéËîn|ÎÓ I’´¿Ù'Þ¬ µÊ@U¥/C¸»á‰J$$IÒþ–ƒÛÊÖî]ñ÷p/ö<¸ _üwËøO)£³žÿçÁ@Í2PUé˾Íî]e9¸=ý±$Iûžô3ù÷PÇ?ò®?èŸ\²·Ì¯» ,‡wþïïÓ÷½0þχ€Úe ªÒ—!üuóO¿5ý±$Iû›\ð{ñ·ôfpôw—ÑiG”É…O/³¿¾,¿yËý~Ÿ]ujüŸµË@U¥/Cøë¦—FèÜ IDAT•þXH’¤ýÍ>öÚøÛ6Ú³¾£ OûÅ2¹ðevÍ«ËâŽþûûÕgäÿ=0P³ TUú2„¿ntæ‘é…$IÚßrëÖ»þŠžôû6Åà?^Æç>©L¯8±Ìoº¼”Ù¸úûûì㯋ÿ{a v¨ªôeÝàØG”²\¦?’$iÃýtü}ëhpü#Ëè¬'”É%{Ëüº Êrxç¶|wŸ_÷¦ø¿+j—€ªJ_†powܘþhH’¤ýM.ø½øÛVÝàèï.£ÓŽ(“ Ÿ^f}Y~óË;öÝ}~ã;âÿþ¨]ª*}½Ù÷÷I’¤ÕÈ€¿fïCÊð¤G—ñùO-³«Ï(‹[¯-e¹ˆ}wŸßtYþ×5Ë@U¥/C¸7û’’$i5ZnÝZ¶v eð‚/ãsŸT¦WœXæ7]¾rлøÂã¿F¨]ª*}½žúóé†$Iº[Ó~&þ>€08þ‘etÖÊä’½e~Ýe9¼£¬z‹[>ÿuÃ@í2PUéËîÕQ‡—2§?’$i“7?-ÿ>€ÆG?¬ŒN;⮟J»ïGù/ïülYÇwÜÿµÄ@í2PUéËîËâæ¤?’$i³kÏ¿  ÊžÃÊð¤Gßõ£üg|IYÜzm)ËEÙ„–ßøbþ×5Ë@U¥/C¸/Ó+_œþxH’¤ý-·—­ÝŠ¿à`~”ÿøµ¿Y¦WœXæ7]¾Ñ8»ï¯)Hÿzc v¨ªôe÷e|ÎÓI’t·†'?&þ>€{³ïûGg=¡L.Ù[æ×]p×½«¦Ãøïj—€ªJ_†p_†/üÉôÇC’$Ý­}bú}ƒ£VF§q×÷ÔÙÕg|ëGù÷ÞrY¶vïŠÿÞôÎ@­2PUéËîÓî]ý­4%IZáæŸ8/ÿ> /{+Ó]Æç>©Ì>ø’oýaÿr‘þм’muxþ÷«sj•€ªJ_†pæŸ~kú#"I’îþ÷ î~Pü}Àfÿ(ÿñk³L¯8±Ìoºü®m¯kpÌ÷Äÿzg V¨ªôe÷gzéQéˆ$Iº[ÃS°9Ø?:ë erÉÞ2¿î‚²Ü–þÚ»Ö ŽûÁøïiï Ô*U•¾ áþŒÎøµôGD’$Ý­ÉEÏŒ¿X?ƒgWvD™\øô2»úŒoý(5mð‚‹ÿ>÷Î@­2PUéËîÏà9ß[Êr™þ˜H’¤ýͯ{Sü}ÀŠÛsXžôè2>÷Iwý(ÿÅ?TÊr‘þJ»ñ _ôÓùßûΨUª*}ÂYÜqcúc"I’ö·}­líypü}Àêý(ÿéeÇ•ùM——2¦¿¾vÙðÏþ~ü,ôÎ@­2PUéËÈìšW§?&’$énùú58æ{ÊèôÇ•É%{Ëüº Êrp[úkªö7<íãç£wj•€ªJ_†ð@öýP’$iuš¼õâï¶ßàÙßUF§q×ÿF;»úŒ²¸õÚôWRÝO£WüJüÌôÎ@­2PUéËÈðÔŸOL$IÒÝšê-ñ÷í}Hžò³eü¦ÿXf~yYÜòñRóôWPD£3ÌŸ£Î¨Uª*}Â:êðRfãôGE’$ío9úZÙÚóàü€C68þ‘etÖÊô²ãÊü¦ËK™Ò_7UÙ¾ßÏô¹ê€Ze ªÒ—!ˆÅÍHT$IÒÝþù?Š¿80ƒc^F§?®L.Ù[æ×]P–[_I­Ô64zõ¿ŽŸµÞ¨Uª*}˜¾ÿ¤ôGE’$Ý­ÉÛþkü}À½xöw–ÑiG”É…O/³«Ï(‹[¯-e¹LÔ4~Ϳɟ¿Î¨Uª*}ŸóÄôGE’$Ý­ù§ßtoÏaexÊcËøü§–Ù‡^V·|¬”Å<ý•Q¡Æ¯ý?óg²sj•€ªJ_†p †/üÉôGE’$ݽé luxüГÁñ¼ëïy¿ëGùßøÎ»¾›IÙøõÿ.~F{g V¨ªôed÷®²Üžþ¸H’¤»5zé/åßjpÌÿõ£üßþGe~Ýe¹ukúk V¼}?I7}n{g V¨ªôejß–$I«ÓôÒ£â÷!eøgÿ L.|z™]}FYÜzm)ËeúkŸÖ¬ñ~;–;g V¨ªôejß2H’¤Õi~Óåñ÷ÀÚÙóà2<éÑe|î“ÊôŠïúnUæ“ôW©yÑg&þ²¿·amJE/úA0pÚ×ÿ½ŽxÈÅ¥DCiÊÍÚ)µ§£?à›žœx£Ã÷I’$IC_íÈ·§æ²ýS{õ¢Ô]¿Ê_¨Á$µ¿}Hø÷;ê™Wäâ€R¢‡¡4ºß»,úÓ¶P_ü á;‚$I’¤áª¶pïÔ8c¿ÔZ9'u×-OEý™è?ÚÀÐj¯:,ü›õ‹J‰†Òtj_57úÓ¶0þooFï’$I’·ÚA¯OÓ>Z+¾”º÷\”Š‹þc TJûº#ÿóQϹ8 ”èa(M§ÆÒ?ˆþt€-t×]¾#H’$Ifïšê‹÷™ø)ÿÎÍ'¥Þ†µ)½è?¶@¥ù€ø‹J‰†Òtª-xcJEýù? hÀê'þZøŽ I’$©¿Õîgì—Z+ç¤îºå©¨=ýG`üàšƒÃçèç€\PJô0”¦[gÍÒèÏØBkÅ—ÃwI’$Iùª¸WjœúÛ©õ­IÝ»/HÅ Fÿ±؆öՆόQϹ8 ”èa(M·Öò¿þ|€-t¸:|G$I’4Ífïšê‹÷IÍeû§öêE©÷Ø-)½è?f“Ô¾jnüñ‹J‰†Òt«÷žèÏØR·•jó_¾'H’$IšÜOù7ÏùÈÄ_öwׯJ©]þPBkåìð¹2ê9 ”= ¥i7{—T´6EBÀÆÿ-Ðð=A’$IÒ+þ²|Wo­œ“ºë–§¢öTô€Ìü³|ñ9 ”= ¥2ÿÌ00XÚ«ß$I’¤QnüW¹KöM­KH5KSoÃÚè?&3 õ­ Ÿ?£žrq@)ÑÃP*SûÛ‡DBÀz×…ï’$IÒÈ4{×T_¼Oj.Ûâ§ü{Ý’R¯ýÇ @늎ŸI#žrq@)ÑÃP*Sã¬ÿý [Q;ümá{‚$I’TåŸòo_{hê®_•R»½þ¢uùÂgÔ¨ç€\PJô0”ÊT;äÍÑŸ°Í ?¾'H’$IÃ^í 7¤ÆiH­•sRwÝòTŒmŒ^õÖºôsáskÔs@.(%zJe+ž} ú3¶Ð¹óœðA’$Iªæï™KöM­KH5KSoÃÚ”Š"zµ†ÈøüŸe#žrq@)ÑÃP*[玳¢?#` Eíé46kçð=A’$IÈfïšê‹÷IÍeû§öêE›ʿۊ^ã!×úæ?ÄϷϹ8 ”èa(•müª<õÞ¾'H’$IƒPmáÞ©qÆ~›Êÿ¾)µkÑë:PA­å>ïF=äâ€R¢‡¡T¶ñ¿\OkÅ—Ã÷I’$i¦«ôúÔ8í›ÿ²ÝòTŒmŒ^ÍѼø³á3pÔs@.(%zJ¥›³[Jízô§l¡ûà5ñ{‚$I’ÔÏæï™Köø…ÊΚ¥©·amJE½Š#ªyá_ÇÏÅϹ8 ”èa(å¨ûÐuÑŸ°¥n+Õæ¿6|O$I’²4{—T_¼Oj.Û?µW/JÝõ«&v^€AѼà“ñ³rÄs@.(%zJ9j_wDô§lÅø¿s½'H’$IÓ©¶pï‰}vâ§üï[‘R»½^lWó>;G=äâ€R¢‡¡”£æÙŽþ”€­h¯>:|O$I’vTí ×oþ)ÿ+¾˜ºë–§blCô* 0eÍó?>OG=äâ€R¢‡¡”£Ú‹þ”€­èm\¾'H’$I/kÎn©~ü{Së’RgÍÒÔÛ°6¥¢ˆ^Jkž÷gñ3vÄs@.(%zJ¹*ž8ús¶¢vøÛÂ÷I’$h³wIõÅû¤æ²ýS{õ¢Ô]¿*¥N3zEè‹æ¹Ÿ»#žrq@)ÑÃPÊUç®ó¢?'`+šþuøž I’¤Ñ¨vÄO¦æ9šÚבºë¯M©5½̘æ9 ŸÃ£žrq@)ÑÃPÊUë²ÏGNÀVtî<'|O$IRõª¸Wj,ÙwóOùßu^*6=½ú„jœù¡ðÙ<ê9 ”= ¥\Õ—üFôçlEQ{:ÍÚ9|W$IÒ7g·T?þ½›ÿ²ÍÒÔÛ°6¥¢ˆ^uJã´ßŸ×#žrq@)ÑÃPÊÖÜW§ÔmERÀVÔOx_ü® I’¤áhö.©~Ì»Ró‚¿J›NL½ÇoK©×‰^i^ãkÿ-~†xÈÅ¥DC)g½GnŒþ¤€­h]9+|O$IÒ`V[¸wjœ±_j­œ“ºë–§¢þlôú 0”ê'üJøLõ‹J‰†RÎÚ«ERÀVtº>|O$IR|µ÷J%ûnþ)ÿ»ÎKŦ'¢WU€Êÿõ”è9?ê9 ”= ¥œ5ÏýXô'lM¯›j Þ¾+H’$i›³[ª/Þ'5/úLê¬YšzÖ¦Tô¢7S€ÊªõÓñ³Äs@.(%zJ9«ñ“ÑŸ° Ís?¾+H’$©ÕŽ|{j.Ûâ»ëWùK€V;ì-áoÁ¨çí#”= ¥Ü/>ýY[ѹíôð=A’$Iyª-Ü;5ÎØ/µVÎIÝuËSQ&zÝy~y/>äâ€R¢‡¡”»î=FVÀVŒÿû®c³v ß$I’4µj¾.5–ì›Z—0ñSþųD¯–lÅØ¼=ÂߌQϹ8 ”èa(å®uÅ£?+`êǽ'|W$IÒvš½kª/Þgâ§ü;7Ÿ”zÖ¦Tô¢×H&alÖÎñïȈç€\PJô0”r×8ù·¢?+`Z+¾¾+H’$é¥jG¾}â/ûÛ«¥îúUþâ`Xu[áoŠJ‰†Röæí‘R¯ýi[1þ•ÃwI’¤­¶pïÔ8c¿ÔZ9'u×-OEíéèõ€LŠÆóáïŒJ‰†R?ê=vkô§lM¯›jÿpø® I’Tõj¾.5–ì›Z—:k–¦âÙû£7Aú¨ØôdøÛ#äã€R¢‡¡ÔÚ7ýiÛÐ<ûÃỂ$IR¥š½kª/Þgâ§ü;7Ÿ”zÖ¦Tô¢×>fPñÜúø÷HÈÆ¥DC©ÿL[O ß$I’†ý§ü›ç|$µW/šø'–R»½â¬·q]øû$äã€R¢‡¡Ôê_}Gô§lCñâãilÖNáû‚$IÒ°üeãŒýRkåœÔ]·<µ§£×9Pïñ5áo–J‰†R_šµS*Æ6F^À6Ôý¥ø}A’$iÀªÍmj,Ù7µ.9 uÖ,ÝüSþ0 ½‡¿þŽÉù8 ”èa(õ«îw¿ýyÛкâ‹á»‚$IRh³wMõÅûLü3†ã?åß{ì–”Š^ôšÀê>pUüÛ&dã€R¢‡¡Ô¯ZW~%úó¶¡ûà5Ể$IRÄOù·¯=4uׯJ©]^ɨ†¿ur@>(%zJýªqêïD^À¶ô:©vÐëÃ÷I’¤~T;ôG'þ²¿µrNê®[žŠÚSÑÛ×½û‚ð÷OÈÇ¥DC©_Õ|]J½nô'lCóëÿ#|_$I*[mþkScɾ©uÉ©³fiêmX½f0‚:wœþ&Êù8 ”èa(õ³Þ“wFbÀ6tnùZø® I’4¥æì–êÇÿrj^ü7©së©›ÿ²ßÿ|ÀèÜrrü;)dã€R¢‡¡ÔÏ:7ý‰ÛP¼ðH›µSø¾ I’´­ê_}Gjž÷g©½zQê=¼ÚÔ``µ¯?*üÝ”òq@)ÑÃPêgÍó?ý‰ÛQ?îÿ ß$I’Æ«ô†Ô8í©µrNê®[žŠ±Ñ«LZûª¹áo©J‰†R?«ùSÑŸ°­+¿¾/H’¤lþž©±dßÔºä€ÔY³tóOùEôjÓÖºìóñï«J‰†R¿+^x4ú3¶¡÷È á»‚$Iªx³wIõÅû¤æ²ý'~Ê¿»~UJÝVôY5/üëø7WÈÆ¥DC©ßuÖžý™ÛRôRíÐ ß$IRuª-Ü;5ÎØoóOùß·"¥v-z〾kžó‘ð7XÈÇ¥DC©ßµ.ýÇèÏ ØŽæŸ ß$IÒpV;èõ›ÊÿŠ/¦îºå©Û½Ú@ˆÆé —å€|PJô0”ú]ýÄ_þÌ€íè¬]¾/H’¤!hþž›ÿ²ÿ’RgÍÒÔÛ°6¥¢ˆ^e` ÔOúõø·ZÈÆ¥DC©ïÍÙÍÏýÀ+Z›ÒØÜÝãwI’48ÍÞ%ÕËöOíÕ‹Rwýª”º­èµÖø»þ~ËÙ8 ”èa(ÍDݯ‰þÔ€íhœö»áû‚$IŠ«¶pïÔ8c¿ÔZ9'uï[‘Rk,z=€¡R;ìÇÃßs9 ”= ¥™¨}ÍÁÑŸ°ãÿg_ô¾ I’f¨y¯I¥°ù/û¿ûR1¶1z€¡W;p¯ø7^ÈÆ¥DCi&jüÛFjÀvÏÞ¾/H’¤™©qúïE¯P-E/ÍÚ9ü—òq@)ÑÃPš‰j½ab WýèŸß$IRÿkžó§ÑkTJÑx>ü}׿‹J‰†ÒLÕÛ°6ús¶£uù?…ï ’$©ÿ5/þlôÚ•R<ÿpøû®Í9 ”= ¥™ªsóIÑŸ°Ý¯ ß$IRÿk]ñÅèµ*eü~‹~ßµ9äâ€R¢‡¡4S5—ýyôçlO¯›j Þ¾3H’¤þÖþö‚è­*¥ûÐõáï»6ç€\PJô0”fªúQ?ý¹;Ð<ï…ï ’$©¿un:!zå€Jé~ï²ð÷]›s@.(%zJ3YñâãÑŸ°ÛÏ ß$IRëÜyvôʕҹëÜð÷]›s@.(%zJ3YçîoDrÀvõgÒØì]ÃwI’Ô¿Æÿ/E ŸÎÍKÂßwmι8 ”èa(Íd­Ë>ýÉ;ÐøÚ ß$IRÿê=üèu*¥}Ýáï»6ç€\PJô0”f²ú‰¿ýÉ;Ð^uXøÎ I’úWoãºèu*¥µrvøû®Í9 ”= ¥mΫRj×£?;`;zO/~g$I}«Øôdôº•ÒºôÃßwmι8 ”èa(ÍtÝõ×FvÀÔï¾3H’¤>4kç”zèU*¥¹lÿø7^9 ”= ¥™®ýíC¢?;`Z+¾¾3H’¤üÕ¼1zÍ€Êi,ýƒð7^›s@.(%zJ3]ãŒý¢?;`zܾ3H’¤üÕ~gôš•S?á}áo¼6ç€\PJô0”fºÚÁÿ)¥¢ýéÛS©vØ‡ï ’$)o“3zˀʩñ“áo¼6ç€\PJô0”"êm¼'úÓv µüoÃwI’”·æÙÿ3zŀʩÍmø¯Í9 ”= ¥ˆ:·|-úÓv ûýËÃwI’”·æÅ½b@µtáï»^ʹ8 ”èa(EÔüÆ_FzÀŽtÛ©vÐÂ÷I’”¯Ö•³¢7 ¨”â…GÂßw½”rq@)ÑÃPЍþÕwDzÀ$4ÏýXøÞ I’òÕþÎâèõ*¥÷øšð÷]/å€\PJô0”¢*6=ýù;йóìðA’$åkümòéÞ÷­ð÷]/å€\PJô0”¢êÞsaôçì@Ñx>ÍyUøÞ I’òÔ½oEôz•âp~°r@.(%zJQµ.ÿBôçLBãô†ï ’$)O½÷D¯P)ãÿ¼Nôû®—r@.(%zJQÕOúõèϘ„öÇ‡ï ’$)OEó…èÕ*¥µrvøû®—r@.(%zJaÍÝÝc C xñ±46k§øÝA’$•kþžÑkTNkùßÅ¿ñúü¹8 ”èa(EÖ]¿*ú&¡~â¯†ï ’$©\õE?½R@å4ÏùÓð7^/å€\PJô0”"k_{hô'LBûšƒÃ÷I’T®Æ)ï^) rÆß×è7^/å€\PJô0”"kœùGÑŸ 0 ½÷„ï ’$©\Íó?½R@åÔýÅð7^/å€\PJô0”"«-xSJEý“P_¼Oøî I’¦_ëŠ/F¯P9µ…{‡¿ñz)äâ€R¢‡¡]ï©ïF†À$´VÎß$IÒôk¯>:z€Ê›óªð7^/å€\PJô0”¢ëÜzJôgLBï‰;Â÷I’4ý:k—E¯P)Eãùð÷]/Ϲ8 ”èa(E׼௢?C`’ê‹~.|w$IÓ«÷ðw¢W ¨”Þ3ßßõò‹J‰†RtõE?ý“ÔúÖ¿†ï’$iz/<½J@¥ô¹!ü}×Ës@.(%zJƒPñâãÑŸ"0 ½Çn ß$IÒ4š»{JE/z•€JéÞsaü¯—å€\PJô0”¡ÎÚó£?E`’êGýtøî I’¦–_߀üÚ7þÆëå9 ”= ¥A¨uÉÑŸ"0I­Ë¿¾;H’¤©Õ8ýƒÑ+TNkÅ—Ãßx½<äâ€R¢‡¡4Õ{Oô§LRïáï„ï’$ij5/þlô •Ó¼à“áo¼^žrq@)ÑÃPˆfï’ŠÆsÑŸ#0E‘j‡¿-~$I“®}í¡ÑTNãôß ãõò‹J‰†Ò Ô½÷ÒèϘ¤½…ý IDATÖ¥ÿ¾;H’¤É×¹óœèõ*§~Ì»Âßx½<äâ€R¢‡¡4(µ¾õ¯ÑŸ#0IÝõ«ÂwI’4ùzܽ>@åÔþáð7^/Ϲ8 ”èa( J%ûFŽÀd½T[øcáûƒ$Iš\ÅØÆèíª¥]ßõÊ‹J‰†ÒÀ4çU)µkÑŸ$0I­oþ}üþ I’vÜü=£×¨œÞ3÷Å¿ñzEÈÅ¥DCiê>xMô' LR÷«ÂwI’´ãêǼ;zm€ÊñOã fÈÅ¥DCij_}`ô' LV¯›j‡¼9|$IÛ¯yö‡£·¨œÎç„¿ñzeÈÅ¥DCijœþ{ÑŸ$0­å¾?H’¤í׺ò+Ñ+TNûº#Ãßx½2äâ€R¢‡¡4HÕæ¿6¥^'ú³&©ûà·Ã÷I’´ý:·Ÿ½2@å´.ûßáo¼^™rq@)ÑÃP´zÞýY“U©vøÛÂ÷I’´ízÞ½1@å4Ïû_áo¼^™rq@)ÑÃP´Æ: ­Ë>¾?H’¤mW4ž^ r'ÿfø¯Wæ€\PJô0”­ÆYýYSÐ{äÆðýA’$m½Ú½£W¨¤úQ?þÎë•9 ”= ¥A«¶àM?' úWß¾CH’¤WÖ8åýÑkTÒØü=Ãßy½2äâ€R¢‡¡4ˆõ6ÜýiSÐZñåðýA’$½²æÅ½&@åçÂßxm=äâ€R¢‡¡4ˆun:1úÓ¦ ÷äáûƒ$Izeí뿽&@åô6¬ ãµõ‹J‰†Ò Ö<ïÏ¢?M`Šê‹!|‡$I/¯û½Ë¢W¨œî}+Âßxm=äâ€R¢‡¡4ˆÕ{Kô§ LQûêÃwI’ôòŠ^ r:·þÆkë9 ”= ¥A­÷Ì÷£?O` zÏܾ?H’¤—ª-xcôz•Ô¾j^ø;¯­ç€\PJô0”µÎ-'GžÀÕoø!I’6×8õ·£W¨¤æ7þ2ü×Ös@.(%zJƒZsÙþÑŸ'0EíU‡‡ï’$is­K?½@%5Nù¿Ãßym=äâ€R¢‡¡4¨ÕûñèϘ¢âù‡ÓجÃ÷I’ôC©së©Ñ«TR툟çµõ‹J‰†Ò 7þo Ã¥ñµÿ¾CH’¤J½Çn‰^  zz46{×ðw^[Ϲ8 ”èa( r[O‰þD€)jßx|ø!IÒÈ7{—”Úõèµ*§xöþøw^Û̹8 ”èa( rÍeý‰STÔŸIcswß#$Iåê‹÷‰^  ’º÷¯ çµí‹J‰†Ò W;ü­ÑŸ(0 ³þ8|$i”kžû±èu*©sËÉáï¼¶rq@)ÑÃPôŠgˆþL€)êÜýðB’¤Q®}ÍÁÑëTRëʯ„¿óÚvÈÅ¥DCiÐëÜvZôg LU·•j Þ¾GH’4ªuï[½ @%5Ïÿxø;¯mç€\PJô0”½æ7þ2ú3¦¡yñgÃ÷I’F²Y;¥¢ñ\ô*•ÔX²oü[¯mæ€\PJô0”½Úáo‹þL€iè>t]ø!IÒ(V?úÑkTVmá…¿õÚvÈÅ¥DCi*ž[ý©ÓP_ô³á{„$I£VsÙŸG¯PMF›µsø[¯mç€\PJô0”†¡Îm§GªÀ4´VÎ ß#$IµÚ7½@%õžúnø;¯íç€\PJô0”†¡æŸŒþT€iè=sßÄ¿C½KH’4Jõ¹1z€Jê~ÿòðw^ÛϹ8 ”èa( Cµ#*úS¦©~Ò¯‡ï’$Ls^•R§ýü@%un:!þ­×vs@.(%zJÃRñÜúèϘ†öLJï’$Jõ5úé€Êj]ñÅð·^ÛϹ8 ”èa( K5ÿý¹ÓPÔŸIcswß%$I…Zßü‡è§*«yΟ†¿õÚ~ÈÅ¥DCiXj^ðWÑŸ+0M¯ÿIø.!IÒ(äxúgü—v¢ßzm?äâ€R¢‡¡4,ÕŽ|{ôç LS÷ž‹Âw I’F¡âÙ¢Ÿ}¨¬Ú!oëµý‹J‰†Ò0U<÷`ô' LG·j‡þHø.!IR•«þÖè*«h¾þÖkÇ9 ”= ¥aªsë)ÑŸ,0M­Ëÿ)|—$©Ê5ÏÿDôs•Õ{ôæð·^;ι8 ”èa( Sþc ¯ÞSßMc³v ß'$Iªj›OŠ~î ²:·ŸþÖkÇ9 ”= ¥aª¶pïèO(¡¾ä7Â÷ I’ªÚø±Ð­+¿þÖkÇ9 ”= ¥a«·q]ôg LSç–“Ãw I’ªXí7§TÑO=TV󜄿÷ÚqÈÅ¥DCiØjßx\ôg LSÑÚ”j¾.|Ÿ$©jÿ¥Ð?õc1ü½×Žs@.(%zJÃVóìG¶@ Í >¾OH’TµÚßYýÄ@u½46oð÷^;ι8 ”èa( [µoœX¸€áÔ}èºð}B’¤ªÕ{âöè'*«xîÁð·^“˹8 ”èa( c½Ç×Dº@ õ£ß¾OH’T•jÿ°Cyè£î÷¯ï5¹‹J‰†Ò0Ö¾îÈèO(¡}íÂð}B’¤ªÔ<÷£ÑO;TZ{õÑáï½&—rq@)ÑÃPÆgìýé%›žLcsv ß)$IªB[O~Ú ÒZËÿ.ü½×är@.(%zJÃXíÀ×¥ÔmG¾@ 3ÿ(|§$© Ï?ý¬@¥5Nýð÷^“˹8 ”èa( k½‡¿ýù%t×-ß'$IöêǼ;úI€Ê«öãáo¾&—rq@)ÑÃPÖÚ×ýùeôº©vÄO„ï’$ s­Ëÿ)úE€jk¥±Y;…¿ùš\ÈÅ¥DCiXkœöèÏ(©}õüðB’¤a®{ÿ•ÑÏ9TZï±[Ãß{M>äâ€R¢‡¡4´Í}µÇ†\±é‰46g·ø½B’¤alþž)ušÑÏ9TZ环ǿùštþ΀\PJô0”†¹îWGÂ@Iͳ?¾SH’4Œ5Îø¢Ÿq¨¼ÖÊ9áo¾&Ÿrq@)ÑÃPæZ+gGÂ@Iã?]½SH’4Œµ¿³8ú€Êkžû±ð7_“Ϲ8 ”èa( s%ûFÂ@YE‘ê‹~.|¯$iØê=s_ô+•W?î=áo¾&Ÿrq@)ÑÃPêæì–ŠÖ¦èÏ(©}ýQñ{…$ICTý˜wG?ßP}E‘Ææïþîkò9 ”= ¥a¯ûÝÿý%õgÒØ¼×„ï’$ KþI<è¿â¹õáo¾¦–rq@)ÑÃPöZ—þcôg dÐüÆ_„ï’$ K½'n~º òºë–‡¿ùšZÈÅ¥DCiØ«/þ…èÏÈ ÷È á{…$IÃP툟Œ~¶`$´¯98üÝ×Ôr@.(%zJU¨xá‘èOÈ ~ü/‡ï’$ z­Ë>ýdÀHhžû±ðw_S˹8 ”èa(U¡Îš¥ÑŸ2Açæ%á{…$Iƒ^wýµÑO6Œ„ñ_Ÿ~÷5µ‹J‰†Rjžÿ‰èOÈ¡]Kµo ß-$IÔj‡¼9¥^7úÅ€êë4ÓØì]Ãß~M-äâ€R¢‡¡T…j‡þHJEý9´®øçðÝB’¤A­yѧ£Ÿj ½Ço ÷5õ‹J‰†RUê=ygôç dP<ÿÿËB’¤mÔ½÷’è§FÂø?;ýîkê9 ”= ¥ªÔ¾þ¨èÏȤyÎGÂw I’­ÚÁ?œR·ýLÀHh]ö¿Ãß~M=äâ€R¢‡¡T•Kÿ ús2é>t]øn!IÒ ÕZþ·ÑO4ŒŒÆé¿þökê9 ”= ¥Ê4o”:ÍèOȤ~Âûâ÷ I’¨ñ9`fÔýÑð·_SϹ8 ”èa(U©îWGÒ@&5ÿ¾[H’4(ÕŽø‰”Š"úy€‘PÔž û5½‹J‰†R•j­ørô' äÒm§Úao ß/$I„ZW~%úe€‘ѽÿÊð·_Ó˹8 ”èa(U©ú‰¿ýIµ¯š¾_H’4õ6¬~–`d´¯?*üí×ôr@.(%zJ•jö.©¨?ýY™cÓØÜWÇï’$V?þ½ÑO2Œ”æŸ ÿ5½‹J‰†RÕê¬]ýY5¿ñáû…$I‘ÿ_ˆÀÌ©Ÿð+á₩—rq@)ÑÃPªZÍ‹?ýYõž¸=ÍÚ)|Ç$)ì—î^|<ú9€ÑÑ릱y{ÄïšVÈÅ¥DC©jÕŽ|{ôg dÖXúûá;†$I¿ÀÌé=uoøû¯éç€\PJô0”ªXñìýÑŸ6Q÷«Â÷ I’"êÞ}Aô3 #¥s×yá₩Ÿrq@)ÑÃPªb›NŒþ´€Ìê'¼/|Ç$i&«-Ü;¥^'ú €‘ÒZ9;|Ðôs@.(%zJU¬ñõ?‰þ´€Ì:kÏß1$IšÉZ+¾ýüÀÈiœùGá;€¦Ÿrq@)ÑÃPªbµ÷J©ÛŽþ¼€œŠ^ªõá{†$I3Ò¬Sñ܃ѯ/Œœñ_à ß4í‹J‰†RUë>øíèÏȬsóIá;†$I3Qãßþ0úÙ€‘S¼ðhø r9 ”= ¥ªÖZñ¥èÏÈ­ÓôcH’F¢î=E¿º0rº÷\¾¨\ÈÅ¥DC©ªÕÿåèÏèƒö·„ï’$õ³ñc7ÿ¬̼֊/‡ï*—rq@)ÑÃPªl³vJÅ‹Gâ@fEó…T;èõñ»†$I}ªµrvôs #©qúÃ÷•˹8 ”èa(U¹Îš¥ÑŸ8Э˿¾gH’Ô—fçŠ~j`$Õ¼)~P©‹J‰†R•kž÷gÑŸ8ÐŦ'ÒØ¼×„ï’$å®yîG£ŸYIų÷‡ï*Ÿrq@)ÑÃPªr㛩èEæ@´.9 |×$)w½Gnˆ~b`$uî:7|Pù‹J‰†RÕë=zSôgôAñâã~@’T©'ÿVôó #«uù?…ï*Ÿrq@)ÑÃPªzí«çGæ@Ÿ´¾ùỆ$I¹ê®[ý´ÀÈjœòþð]@ås@.(%zJU¯±dßèÏè¿ IªJõE?런€(E‘j½!|Pù‹J‰†R国K*êÏDê@Ÿ´–ÿ]ü¾!IRÉ:7Ÿý¤ÀÈêm\¾ (OÈÅ¥DCiêÜu^ô§ôIñüÃilîîáû†$IÓ­vÈN©]~R`dun?#|Pž‹J‰†Ò(Ô¼ðSÑŸ:ÐGÍ‹ÿ&|ß$iºµ¯šý”ÀHk]òÿ†ïÊ“rq@)ÑÃP…j‡½eâßqª©xþ¡46çUá;‡$ISnÞkR1¶!ú)€‘ÖX²oüN ,9 ”= ¥Q©÷äÑŸ;ÐGÍ‹>¾oH’4ÕZ—þcô £­×Mcó÷ ß ”'äâ€R¢‡¡4*µWý¹}T¼øX›·GøÎ!IÒ¤›ûê‰÷ ˆÓ{âŽø@Ùr@.(%zJ£Rã´Dî@Ÿµ.ÿBøÎ!IÒdk]öùè§F^çÖSÂwå˹8 ”èa(LswO©5ýÉ}TÔžNµƒ^¿wH’´£æí‘ŠMOF?0òZËÿ6~/P¶‹J‰†Ò(Õ½ç¢èOè³ö5…ï’$í¨ñ_­âÕýÅð½@ùr@.(%zJ£Tó¢OGò@¿µÆRíÐ ß;$IÚfó÷LÅØ†èF^Ñ|!ÍÞ%~7P¶‹J‰†Ò(U[¸wJEýÙ}Ö¾áØð½C’¤mպ⟣ŸJ ¥Ôýþåá{òæ€\PJô0”F­Þã·Eö@¿uÛ©~ÔO‡ï’$½"ÿ÷? ŒÖ•³âwe͹8 ”èa(Zí«çGöÀ èÜ~føÞ!IÒ–µ¾õ/ÑO$ðï§þvøn ¼9 ”= ¥Q«~Ò‰þ쀙PôRýØ_ ß=$Iúÿ«-xS*ÏE¿À¸^gâ—y¢÷å͹8 ”èa(\³vNŦ'£?}`tï_¿{H’ôïµo<.úiþ]ïÑ›ÃwåϹ8 ”èa(b5K£?}`†4ÎüPøî!IRýèw¦ÔmG?‹À¿k_ÿÕðý@ùs@.(%zJ£Xóœ?þô€Ò{æ¾46w÷ðýC’4Úuï½$úI~@óì‡ïÊŸrq@)ÑÃPÅjîåÿ¼€Òºôsáû‡$itkœúÛÑO!°…Úao ß”?äâ€R¢‡¡4ªu¸:úófHÑx.Õ¼)|ÿ$`³vN½Çn~ €P<û@üŽ ¾ä€\PJô0”FµÖå_ˆþü€Ô¾áØðýC’4z5/útôl¡sûá;‚ú“rq@)ÑÃPÕêG¿3úófR¯›êǼ;|‘$Nµù¯MÅ‹G¿€ÀšÿMøž þä€\PJô0”F¹Þ3÷E`u¿yøþ!IÚß^ýô[Q?öÃ÷õ'äâ€R¢‡¡4ʵW=€Ö8óCá;ˆ$©úÕï“R·ýì[(Ï¥±Y;‡ï êOÈÅ¥DCi”kœþÁḛ̀âù‡ÒØü=Ã÷IR…›µSê>pUô“lE÷ÞKãwõ-äâ€R¢‡¡4ÒÍÝ=Í£Ç0ÃÚ׿‡H’*[ó¢OG?uÀ6´V|9|WPÿr@.(%zJ£^÷ž‹¢Ç0Óº­T?úçÃ÷IRõª-xS*jOE¿tÀ64Nþ­ð}Aý˹8 ”èa(zþÏ MÝ®žø‰æè]D’T­:·ŸýÄÛÒm§±y{„ï ê_ÈÅ¥DCiÔ«-ü±”Š"zšç"|‘$U§Æiˆ~Ú€íè>t]ø¾ þæ€\PJô0”ôC©÷ÈÑ£Plz2ÕþOỈ$©ÍÝ=õžúnôÓlGûªyñ;ƒúšrq@)ÑÃPÒ¥ÖŠ/E HûÆãÂwIÒð×¾úÀè' ØÆÉ¿¾3¨¿9 ”= %ýPªó®èQD)z©~Ò¯‡ï#’¤á­~ü/Oü›ÂÀk×'~±'zoPs@.(%zJÚ\ïéïE ÈøO6Í{Mø>"IÂæ¾:õž¼+ú)v {ß·â÷õ=äâ€R¢‡¡¤Íµ¯;2zÚ×¾H’†¯ö꣣Ÿ0`Zßú—ð½AýϹ8 ”èa(is“3z‘zÝT?á}á;‰$ixjœö”Š"ú&ÁŸ÷F#äâ€R¢‡¡¤oö.©¨==€@½÷Lü”sø^"Iøj½!Ï?ýt“P4žŸøï¿ÑûƒúŸrq@)ÑÃPÒKun;=z$ÁÚW¾“H’¿ÎgG?YÀ$uï¹(|wÐÌä€\PJô0”ôR¯ÿIôH¢õ:©~ü{Ã÷IÒàÖ<ÿãѯ0­Kß439 ”= %ý@ó÷L©] @°ÞãkÒØœWÅï&’¤«vø[SÑx.ú©¦ ~Ì»ÂwÍLÈÅ¥DCI/¯»nyôX@{Õaá{‰$iÀš½kê>xMôLA±éÉ46k§ø=B3’rq@)ÑÃPÒËk^ø©è± ‚¢—§þNøn"IœÚ×.Œ~€)êÜñõðB3—rq@)ÑÃPÒË«òæ”zÝèÑ €â…GSmÁÃ÷IR|3?”RQD?MÀ5/üëð=B3—rq@)ÑÃPÒ+ë>t}ôhD÷î ÂwIRlõ£~&碟$`jG¾=|—ÐÌå€\PJô0”ôÊZWüsôhHó‚O†ï'’¤ æ¾:õ»5ú)¦¡xn}ü.¡Í¹8 ”èa(é•Õ¿úŽèÑ ’ÖXª/úÙðE’4óun=5ú¦©sËÉỄf6äâ€R¢‡¡¤­×Û¸.z<¤÷èMilîîá;Š$iæj^ôéèç(¡yþÇÃ÷ ÍlÈÅ¥DCI[¯}íÂèñ ˜ö Ç„ï(’¤™©~ü{ýdfE‘j ÷ß)4³ÙßÈÅ¥DCI[¯¾ä7¢Ç0€šç~4|O‘$õ·Ú!oNÅsF?9@ ½Çׄïšù‹J‰†’¶Ñ¬SñâcÑ#0EkSªýóñ»Š$©?Í}uê=¼:ú¹Jj_spü^¡Ï¹8 ”èa(iÛµo86zD¨÷ä]ilþžá»Š$)s³vJ;Ί~f€ _û¯ñ»…f<äâ€R¢‡¡¤m×8åýÑ#P;¾¾«H’òÖþö!ÑÏ AQ6ÍÞ5|·ÐÌç€\PJô0”´fï’Š±ÑcPÍ‹>¿¯H’²Ô¼ðSÑÏ IçÎsÂw Åä€\PJô0”´ý:7/‰À ê¶Sãäß ßW$IåŸå©ÛŠ~U€Lšßø‹ðýB19 ”= %m¿ÆéŒÀ+jO¥Ú‘?¾³H’¦Wý蟟ø™` "Š"Õý‘ðC19 ”= %í 9»¥¢þLô¨Xïñ5ilþžñ{‹$iJÕ¼)õžù~ô3dÔ{ôæðCq9 ”= %í¸Îm§G `Àuî:/ÍÚ)|o‘$M®Ú{MüP-í«ç‡ïŠË¹8 ”èa(iÇ5ÎüPô¨†@ëÊYá{‹$iÍÛ#uüvô³ôAý¤ÿ¿k(,äâ€R¢‡¡¤I4w÷T4_ˆÀ +ŠÔ<ûÃñ»‹$iÛÍÝ=u¿Eô‹ôAQ{:ÍÞ%~ßPXÈÅ¥DCI“«sÇYÑãFj,Ù7|w‘$m¥Ù»Lü“-@5ÿ7Üð}C¡9 ”= %M®æ×ÿGô¸†èÿ:©/ú¹ðýE’ôÍÚ9un?3ú‰ú¨yþ'âw…æ€\PJô0”4Éæí‘Rk,zdC¢xöT;ôGâwIR›µSêÜtBôÓôSÑKµCÞ¿w(4äâ€R¢‡¡¤É×Y{~ôȆHïÑ›SmþkÃwIõÚ×.Œ~€>ë=rCøÎ¡ø‹J‰†’&_óÜE `Èt×-Ÿø7§£÷IÕÚWÏ~ €ÐZ9'|ïP|ÈÅ¥DCI“oüÿàKízô؆LgÍÒ‰{:z—‘¤‘jÖN©½ê°è'˜!õÞ¿(<äâ€R¢‡¡¤©Õ]wqô؆Pû†cÂ÷I©¿ü_}tôèfH1¶Ñѵ&r@.(%zJšZÍe=6€!Õ¾j^ø.#I•oö®©sÇYÑ#˜AÛN‹ßA49 ”= %M­ÚAoH©ÛŠÀj]þOáûŒ$U¶9¯J»¿=ê€Ö8óCñ{ˆ"äâ€R¢‡¡¤©×½÷ÒèÑ «¢HÍ ?¾ÏHRåš¿gêÞ·"zÊ3¬hmJcó^¿‹h r@.(%zJšzþ ”^75ÏÿDøN#IUú¥¶îC×GOw @gíùỈ'äâ€R¢‡¡¤©W;èõ ÃÀÇÃ÷Iöj‡¼9õ_=Õ€ Íóþ,|Ñàä¿Û“‹J‰†’¦W÷î ¢ÇP…#€eû‡ï5’4¬Õ¿úŽÔ{êÞèiDé¶'~ (z'Ñàä€\PJô0”4½šç~4z|Uà@’¦UãÔßIEã¹è)ê~ïSh¹| IDAT²ðDƒ•rq@)ÑÃPÒ4›·G*Z›¢GPŽ$iJ5/üÔÄÿñŒ¶æEŸ ßK4X9 ”= %M¿ÎgG JG|2|¿‘¤nÖΩ½êðè‰ ‚¢—j‡þhü~¢Ê¹8 ”èa(iú5ÎúãèTIQ¤Ö¥Ÿ ßq$i ›¿gêÞsaô¤DwýªøýD—rq@)ÑÃPR‰æîîßœ²k_{hüž#ITmáÞ©÷èÍÑã ­Ë>¾£hðr@.(%zJ*Wç¶Ó¢ÇPAŽ$isõãÞ“Š‰ËÀ€©õÓá{Š/äâ€R¢‡¡¤r5–þ~ô*ª}ãqÿÞuô¾#IQ5/ø«”Úõèq ˜Þw„ï)Ì‹J‰†’J6{×TŒmˆ%@Euï¾ Í{MüÎ#I3ÙÜW§ÎÍK¢G00 Z+çÄï+È‹J‰†’Ê×¹éÄèQTXïáï¤Ú‚7…ï<’4Õ¿úމÿ«`[êÇþbøÎ¢Á̹8 ”èa(©|SÞ=J€Šëm¼'ÕŽø‰ð½G’úYã¬ÿžŠÆsÑ#`ų„ï,Ü‹J‰†’24kçT¼ðhô8*®xññT?þ—ãwIÊÝì]SûÚCS*ŠèQ ¸öªÃãw lÈÅ¥DCIyj¯^=N€P´6¥ÆÒ?ß}$)WµÃ~z¼C¢¾ä7Â÷ nÈÅ¥DCIyªŸôëÑãÝVj.Û?|ÿ‘¤,?ù_{*zªC¢xñ±‰_cÞa4¸9 ”= %ejÖN©xîÁè‘ŒŠ¢H­•sâw IšFµ÷J›OŠž¤Ài_Tø£Áι8 ”èa()_ÿf%À êÜròÄ¿½IÒdk,Ù7õž¹/z|C¨~⯆ï2ì‹J‰†’òU?î=Ñ#AÝ{.Jcó÷ ß…$i»Í{Mj¯^4ñ &SU<{ÿį°†ï4è‹J‰†’òÖ{ò®è±Œ Þw¤Ú‘?¾ IÒÖÿ¿õz×EJ`ˆµ¯9(|§Ñàç€\PJô0””·Ö·þ%z¬#ª¨=§¼?|’¤ÿhö®©uÅSê¶£G$0äêǼ+~·ÑÀç€\PJô0””·ÚáoM©èE`TuÛ©yñgÃw"IªóîÔ{ìÖè©T@oÃÚðÝFÑrq@)ÑÃPRþº÷¯Œ-ÀˆëÜrr›ûêð½HÒèU›ÿÚÔ^u¸ÿëȦµâËá;ކ#äâ€R¢‡¡¤ü5/ødôhH½ÇפúQ?¾Igì—ŠçÖG? bü¹F“͹8 ”èa()µ÷J©]‹/©h¾šç|$|?’TíjG¾=uï½$zäÔ{äÆð]GÓrq@)ÑÃPRêÜyvôxج(Rûú£ÒØÜÝÃw$Ikîr¶ÿÐ ôMëÒÏÅï<šì¥äâ€R¢‡¡¤þÔø·?Œ//ÓÛ°6Õywøž$©5Nyêm¼'z´UVôRí°·„ï=ž‹J‰†’úÔì]S±éÉèðríZj^ô™ø]IÒÐV;ü­©s×¹ÑÓ Ý¯ ß}4\9 ”= %õ¯öêEÑ#`«ºw_j Þ¾/Ižj½!µ¯]˜R»=€Ѽø³á;†+äâ€R¢‡¡¤þU?áW¢G À6cRóìÿ¾3Iðæ¼jâ—CÆgÀŒé¶SmÁãw! UÈÅ¥DCIýmüßÚd»Îók’^Ù¬Róœ¤âÙû£Ç0‚º÷^¿ièr@.(%zJêo­_Š3;Tlz"5Îü£ðÝIÒ`Ô8íwSïñÛ¢G0šËö߉4|9 ”= %õ·ÚáoK©èE€Ié®[žj‡¿5|‡’S}ñ/¤îw¿=Š€Q×i¤Ú{…ïF¾‹J‰†’ú_÷«£G À¤çS뛟Æfí¾GIš™êǼ+uîøºãe` tî<'|?Òpæ€\PJô0”Ôÿš~*zÔLYï‘RýØ_ ߥ$õ¯ú ¿’º÷\˜RQD€ÿÐXúûá{’†3äâ€R¢‡¡¤þ7þsU©]7S÷ÿµwçÁšÕåÇmh5îc¢&Ѳ˜q’3YÆ©PcF#É$Ñ2ÛÄÙbÆÑ™dFo¯@Ó -4ÈÚ «È*²Ê¾4[Óì ²/M³uC÷}Ï»Ÿó›º·Ðaéîsî}Î{ÞϧêûOª4UÈyÞSÏ}î{‹< n:6eKÞþN%©º:‡ÿÖôŸüðƒ nЦּíÃß—4š9 *(%zJš·}3zÜl³¢½!õÎù¼EœÔ”üÔTÿ²½Âß™4º9 *(%zJš:Çýaô¸(-_wsêù;áïV’¶¢‰9©sÂHù£7D€—W©}Àûâߟ4²9 *(%zJš¥æÍMŦµÑ# S¿AÜ>ðãß±$½tówLÝo}:åß=2¶Èð¡«âß¡4Ò9 *(%zJš½ú—/‰9Õ)ò4¸í””í÷3áïY’ž/Ûó Ó²£xöáè)°Uºgümø»”F;TÅ¥DCI³×Ô×WM}@£ô³é¿Ó™íõÆð÷-iœk¸[ÜpxJývôTØzý,e‹_þN¥ÑÎUq@)ÑÃPÒì6|ðŠè±0#ŠÎ³©É‚”íùáï\ÒØ4‡Ô=éSixßÅŽ€‘6¸éñïVùP”= %ÍnÝÓÿ:zį̀¢»)õ¯ØÇ!€4ƒeKwM½ þ)Ï>ýÈT¢sÔï…¿ciôs@UPJô0”4Ë-Úyz)ÐtE{}ê]2zôÌž^+õW²}:ü=LÅÚþâô·j“뢟f€1u8ýÎ¥f䀪8 ”èa(iökþ›Ñ£`ö ûi°fej¸[øû˜T÷²}Þžzç~!åënŽ~rfVQ¤lù{Â߿ԌP”= %Å”?ygôø3|ðÊÔ=yÔš·}ø{™T›¼zú+þ·2}00†÷]ÿ¦Æä€ª8 ”èa()¦Þùÿ+zü„ËŸþ~ê}çR¶øuáïgRTíÃ>œ×šŠö†èG`ÖuOýLøû˜š“ªâ€R¢‡¡¤¸¯ôô[=›gSÿºƒSûk¿þž&ÍxÛ¥Îá¿•úW-OÅ3D?~aŠîÆÔZ´süû™“ªâ€R¢‡¡¤¸†wž=‚j'_»:uÏüû”-Ú%ü}Mª¬yÛoþ¡ÿªR±imôcP ƒÕGÄ¿§©Q9 *(%zJŠ«süÇ£G@­hêkѧ¾=ú½MÚ¦ì”:ÇÿQ¬Y™ŠöúèG  v¦$ÃßÙÔ¨P”= %6on*6==†j¯xö¡Ô¿bŸÔþêÏÅ¿ÃI/×ÂפÎqKƒ›Ž>bàÅåOÜÿî¦Æå€ª8 ”èa()¶þK£ÇÀè(Š4|ðŠÔ=ës)[òÖðw9©51'µ¿ö+©wþ—ÒðÞ -¶PïÛÿ5þ]NËû8Uq@)ÑÃPRlíÞ7½È`+åÃ4|ðÊÔ;çó)ÛçáïuŸ²½ß’º'ï‘7–ŠgŽ~FNÑ›LÙâׇ¿×©y9 *(%zJŠoøÐUÑ£`ôî»(õ¾ý_R¶ï»ÂßïÔ°æï˜:Gý^ê_¾$åkoL©È£ÿiƒëÇS#s@UPJô0”_÷ô¿‰E’?¶&õ/]”Ú‡þúôW´G¿ïi¿ÖÿÀÝRï;ÿ†ß;{ú7Ô¨NûàÆ¿ó©‘9 *(%zJŠ/[´K*º£Ç@#›KƒÕG¦î7ÿlú«Û£ßýTÃì”:Güvê]øÏ›àß^ý¯-@c寊ÿScs@UPJô0”Tú×=ŽÆBþÄí©Å>©³ò£Ó?ø~Ôì7õ÷f§þ÷ï]¦Þ³ÃßÕèP”= %Õ§©¯¿ ^ŠÉuix×·S¤Î1²½ßþÞ¨W¥Ö¢SûЙº§ýUê_½>py*º£ÿuà¥Åô±fø{¤ªâ€R¢‡¡¤µ`§é¯Á ÞŠMkÓðûçMÿé€î)‘ÚýRjÍ›ÿ>ÙÄì”ÚpúŸsÿò½Óð®³R±á¾”Š<ú_¶ÂðÞ ãß-ÕøP”= %Õ«þUË£ÇÛbØŸþÁôÔ×ÎOý­ù:+?:ý÷ç£ß1kßüS¶ü½Óÿ¼¦þ¹Mýó›þú~?èhŒÎ‰ŸˆïTãs@UPJô0”T¯Ú¼oúë°hŽ©oyÊ×®NƒÛOMý«öK½³ÿ{ê÷±éoÈö|Cø;èŒ61'eKÞ–ÚÿZêœðÇ©wÎç§^·’òG®MŦǼÿ4\±ñQߘ¥YÉUq@)ÑÃPRýÞwQôh`6õÛ©Øp>tuÜqZê_{Pê]4‘ºg}.uOþÓÔ9úߦö!ÿ"eû½;e‹_ú®š-Ú%eû¾+µúåÔ9òߤÎñOÝÓ>›zç~!õ¯XškŽIûÏMùº›7ÿp?DÿÓ Xïâùá;WG¨ŠJ‰†’êW÷¤OE&ê,¤¢½aú7©¦¾&êÛ¦Ž¦¾6xÇéÓ¿]?Ýš•ipÃaÏÕ_µbóoß¿àÿö\·ž<ýŸÞyÆæÿž‡®žþïÍŸþþôqÂÔÿ¿©?s[%¤lÙ;Ãw®P”= %Õ°ysS±imôx(eê@5|ߪ±ÉUq@)ÑÃPR=ë_º8z<”ÒYùïÂw­ŸP”= %Õ³©¿«šòaôˆØ&ù·§ÖÄœð]«Æ'TÅ¥DCIõmø½³£GÀ6éžñwá;VW¨ŠJ‰†’ê[ç¸E(€­V´žL­…¯ ß±j¼r@UPJô0”Tã&¶KÅ3D)€­Ò¿daü~Uc—ªâ€R¢‡¡¤z×ûî—£ÇÀ–tS¶Ï;Âw«¿P”= %Õ»©å4ìG*€-2¸ñèð½ªÆ3TÅ¥DCIõopÛ7£GÀiíWÃwªÏP”= %տΉU¯hxßEáûTo¨ŠJ‰†’F£üÑ¢ÇÀËê÷‡á»To¨ŠJ‰†’F£îiŸW/)êîÔšØ.|—ªñÍUq@)ÑÃPÒˆ´àÕ©˜|Tz©P”= %~Ùâ×¥¢óLô8¬ènLÙž?¾•^*TÅ¥DCIͨù’èq4Xÿò½Ã÷ ÒË倪8 ”èa(©eû¼ÝË 03”-Ý5|*½\väTÅ¥DCIÍi°úÈè‘4PÿÚƒÂ÷ŸÒ+倪8 ”èa(©9µxJE=Ö€&öS¶ß»Ã÷ŸÒ+倪8 ”èa(©Y ï:+z¬ 2XsLøÞSÚ’P”= %5«Î‰k@SEj¸[øÞSÚ’P”= %5¯áCWG6 ·ž¾ï”¶4TÅ¥DCIÍ«sâ'¢G0êòaj¯ø@ø¾SÚÒP”= %5°‰9)òÎèñŒ°ÁM߈ßuJ[‘ªâ€R¢‡¡¤fÖ=óï£Ç0Ê¿ýÀûÃ÷œÒÖ䀪8 ”èa(©¡-xu*6==â€4X}düŽSÚÊP”= %5·Þw¿=â€Q3ì§lù{Ã÷›ÒÖæ€ª8 ”èa(©¹e{½1½Éè1ŒÁõ‡†ï6¥mÉUq@)ÑÃPR³ë_½ô˜FÅ ›²}ß¾×”¶%TÅ¥DCIÍ.[öSÓ_ÙðJú«V„ï4¥mÍUq@)ÑÃPRóÜ||ô¨ꮟ¥lé®áûLi[s@UPJô0”ÔüÚþbJE=î€ë_¹oø.S*“ªâ€R¢‡¡¤ñhxÇéÑ㨫^+eK޾ǔÊ䀪8 ”èa(i¾«”ªÌUq@)ÑÃPÒx6|èªèñÉ×Ý’ZÛ…ï)¥*s@UPJô0”4žu¾ñï£Ç¤sÌ„ï(¥ªs@UPJô0”4¾å^=€Y6¼ÿ’ðݤ49 *(%zJß:'~"z³©ÈSû…ï&¥™ÈUq@)ÑÃPÒ71gúo}ãapÓ7â÷’Ò å€ª8 ”èa(i¼ë~ó좂 0†½”-oøNRš©P”= %yÛ¥ü‰Û£G!0ÃúW.‹ßGJ3˜ªâ€R¢‡¡$uOýLô(fPÑy&e{½)|)Íd¨ŠJ‰†’Ôš77åëÀ éÿ¥ø=¤4Ã9 *(%zJÒTÝo}:z3 xæÁÔZ°SøRšéP”= %iº‰íR¾î–è‘Tlê—Â÷Ò,䀪8 ”èa(I?¬{â'£G"P¡|ÝÍÓ¿ü½{”f#TÅ¥DCIz®‰9)äºè±T¤³òßÅï¥YÊUq@)ÑÃP’^XçØÝ£Ç"Pá]ßß7J³™ªâ€R¢‡¡$ýxÃ.‹@Ã^jð¾ð]£4›9 *(%zJÒ×9â#Ñ£(¡ù’ð=£4Û9 *(%zJÒ‹5¼ç‚èñlƒbòñ”-~}øŽQšíP”= %éÅjò¡”Š"zD[©{êgÂ÷‹RD¨ŠJ‰†’ôR ï<#zD[!xUjMÌ ß-J9 *(%zJÒKÕ>p·”Š|o(Õ%TÅ¥DCIÚÒ²E»¤bÓcÑcH)õ/Û+|g(Õ)TÅ¥DCIÚšºg}.zlÀØ+6>2ý ;ÑûB©N9 *(%zJÒV5oû”?q{ô耱Ö9ññ»B©f9 *(%zJÒÖÖ9îcÑ£ÆÖðîsÃw„Rs@UPJô0”¤mixïw£Ç'ŒŸ~–²åï ßJuÌUq@)ÑÃP’¶¥öÁL©È£G(Œ•Þy_ ß JuÍUq@)ÑÃP’¶µÁM߈¡06òÇoM­ù;„梁怪8 ”èa(IÛZ¶ìÓ_9̰"OíÃ>¾”Ꜫâ€R¢‡¡$•©ù’è1 ׿îàð] T÷P”= %©LÙâ×¥bòñèQ UL®KÙž?¾ ”Ɦâ€R¢‡¡$•­wö¥ÐXÝoþYøP…Ò ý¸Ò(%zJRéæÍMù“wFShœá=çÇïÿ¤)Eô#KC8 ”ÖÄœð(Ieëœø‰èq ÍÒo§lù{ÃwÒH4‡è'–q@)­ù;ÆEIª áƒWDThŒÞ…ÿ'|ç'JÙ¢]¢YÄ¥´î>%©ŠÚ_ÿ _±ÈŸ¸Ý/J[Q¶÷›£[Ä¥´özSøP”¤ªÜzrôX€ÑV©sÔï†ïú¤Q*[ú“ÑO. â€RZûì>%©ª²ýÞ=ý·É€m3¸áðð=Ÿ4jeËßýèÒ (¥µïO‡EIª²þ% £G+Œ¤bÓÚ”íõÆðŸ4jµýõèÇ—q@)ÙTi _“ŠgŒ¯0r:ßø÷ñû=ië»{ôãKƒ8 ”öa¿>%©êº'ýIôx€‘2¸ñèð½ž4ªu¿õéèG˜q@)íãþ(|(JÒL4¼çüè #ÁWÿKåêû?¢cÄ¥tNûëð¡(I3Q{ÅRö£Ç,Ô^ç„ÿ¾Ï“F¹þ¥‹£cÄ¥tÏûRøP”¤™ªõW£Ç,ÔÚà¦cÃ÷xÒ¨7¸þëÑ2 â€Rz—/ Š’4Se‹_ŸŠMEZ¨¥©ÝY¶×›Â÷xÒ¨7¼ç‚èÇ™q@)ýŠ’4“uOû«èQ µÔ9þãáû;© åOÝý8Ó (epß%áCQ’f´‰9)øšèq µ2¸ù¸øÝÔ„&¶KiÐ~¤i”’ox ~0JÒ ×>äC)yôÈ€Z(&×ùê©¢²e?ýHÓ0('¦ÉysÇ£$ÍtƒÕGFO\¨… ß×IM©sÄoQt¢dÀIDATG?Ò4ŒJkí÷žðá(I3]¶ä­©è<=r Ôà–ÃwuR“êžñ·Ñ5 ã€ÒÚGý^øp”¤Ù¨wÎç£G.„)ZO¦lÉÛÂ÷tR“ê¯ZýhÓ0(­sæç‡£$ÍJóæ¦üñ[£Ç.„èžô'ñ;:©a ï¿$úѦaPZïڃÇ£$ÍV£~7zìÀ¬ÜzRønNjbEöTôãMÃ8 ´ÁƒW…GIšÍ·}3zôÀ¬)6>š²½Þ¾—“šV¶ìÑ7 ä€ÒòÎÆÔš˜>$%i6_ÊŠîÆèñ 3¯ÈSçèßßÉIM¬sìîÑO8 ä€J´ö{wø”¤Ù¬÷ˆ½0ãúW“šZïâùÑ8 ä€J´ÿxø”¤Ymb»”?rmôø€“¯»9µ¼:~'5´á½F?æ4*Ñ»l¯ð!)I³]û _NiØÁP½A7µ¿ö+á;8©±Í››Šî¦è'r@%\?(%) þ•Ë¢G0T®wÎçÃwoR“kò¡èÇœ†r@5úÝ49Çða)I³ÞÂצbÃ}ÑS*3õµä­‰9ñ»7©ÁõÎùÇèG†r@e²Ã>>,%)¢Î±»G`¨D‘=•²¥»†ïܤ¦7¸ýÔèdžr@eºç})|XJRTƒ[OŠÃPZ÷ä? ßµIoÞÜTtž‰~Üi(Tfp×ÙñS’‚Êöy{*Ú¢G1l³ÁG…ïÙ¤q¨s俉~Üi0T§ÛJ“ów š’U÷Ìÿ=‰`›îKÙâ×…ïØ¤q¨ù’èGžs@¥ÚGÿÛð¡)IaMÌIÃû/‰ŰuòAjöáøýš4&åënŽ~êi0TªwÕòð¡)I‘µW| ¥a/zÀë_² |¯&KÙÒŸL©(¢{Ì•>qWøà”¤èú—,ŒǰEò‡¯I­ysÃwjÒ¸Ô;û¿E?ö4œ*×ÚïÝáÃS’B[°SÊŸº;zÀË*:Ϥlù{â÷iÒ5|ðŠèGŸ†s@åºçþÏðá)IÑuŽü_ã@­uOüdøM§²e?•R‘G?ú4œ*7|äúð*Iuh°feôH€Õ_µ"|&[½ó¾ýè3P½¢H­ý|e$e{¿9­'¢§2üˆüÑRkÁ«Ã÷gÒ¸•?r]ôãÏpÀŒè^ðÏáCT’êP÷ä=¢G2<§è<›Ú_ýÙð½™4nµ÷ÿy6–Yá€1|ìæðA*Iuipû·¢Ç2Lëžòçáû2ië_¹,úñgL8`Ædî>L%©eû¼=ÙÓÑc€1׿öká»2i,›¿£?ˬqÀŒé]½ü@•¤šÔ=å/¢Ç2c,_wKj-|MøžLÇü©Xf“fLÞ~&M.ð2!I?lxÇéÑ£€1Tô&Sû€÷‡ïǤqmxï…Ñc€1â€Õù֧Ǫ$Õ¥léO¦¢½!z40fº'ÿiønL×Ú_ý¹”ŠX%©NuOûlôh`Œô¯;8|'&sý뉌̸ìÀ݇«$Õ©áÝçFfÆ@þØšÔZ°Sø>Lײ½ß’R?‹Œ̸þê£Â¬$ÕïO¬Ï4XÑ›Lí¿¾ “ƹþ% ¢GcÈ3oØO­¥ï ²’T§ºßúËèé @ƒMퟢw`ÒX·ðµ©ÈžŠŒ!ÌŠÞeKâ­$Õ¬Áí§Fg¨íAá»/iÜëýߢGcʳ"ïlL­Å¯¶’T·¿ÿTL®‹Ñ4Èð¡«SkþŽá»/i¬[°S*6>=S˜5Ýs¿?p%©fuNøãèñ @C›Ö¦lŸw„Dq¯wî¢Çc̳&Ÿ|2µí>t%©n Ö=¢uÃ~êñ‘ð]—4ö-Ú9“GOƘfU÷‚м’T³²=ߊgŠÑŒ°îYŸ ßsIzUê}÷ËÑã€1ç€Y•gëSkñëǯ$Õ­ÎʦTÑc€4¸ñ¨ðý–¤W¥l¯7¦¢½!z$0æ0ëzÏÀ’TÇú«VDhFLþØšÔZøšðÝ–¤W¥þ5FpÀìË;Skï·„aIª] vJù·GiFDÑz"eû¾+~¯%)µÜ-¥|=À17>ˆ%©¶/‰ƒNô˜ îòAêõ»áû,I›Þs~ôT€iˆ‘ç);äCáÃX’êXïü/EOij®wîÿßcIÚ\çÄODxŽ î¿À%©®uŽùƒ”Š"zT0“òAê¬ühø.JÒóeûýL*Ú¢§¼"ÔR甿ä’T×úWî=¦˜A½oÿ×𔤴`§”?zCôh€-â€ZÊ;S¶ügãº$Õ±ù;¦üÑë£G53 ¿jEüþIÒ4XsLôh€-æ€Ú>qgj-z]øP—¤ú~ÝÔúèQ @…†÷œŸZóæ†ïž$=_ï;ÿ=`«8 Öú·œ”&k0Ü%©ŽuOüdJE=ª¨@þÄí)[üúð“¤çëñ‘”†ýèñ[ŵ×=ï‹á^’êÚÔWÂ0ÚŠìéÔþêÏ…ïš$=_¶ü½©˜|ê÷ý$Õ²ù;¦ü‘ë¢'5ÛjÐMÃ+~Ï$é¹²½ß’ò§¿=`›8`$gSvà/…|IªcÙ¾?=}%Àèéžñwáû%I/hÁNiøÐÕÑ£¶™FF¾áÔZòöøÁ/I5¬s§TÑ£€­Ð¿tqø^IÒ šØ. î8-z4@))ùÚÕ©µpçøIªaý«¿=¦ØBƒ5+SkbNøNIÒš˜“×= 4ŒœÁ]g§É‰íã?$©nÍß!å_=¦xÃ{ΟÞå„ï“$=—_°¢)0’ú7®L“_q)I?^¶ï»RÑz2zLð2ßt›-Ú%|$éùú—í= 2YýÕG¥É|(HRÝêõ{)åƒè1 À)6ÜŸ²}Þ¾?’ô|½ó¾= Ri½«÷ÿ`¤:Ö»ðŸ£G4/PdO¥öï ßIz¾Þw¿= ry½+—‡@HR횘“·Ÿ=¢˜Òo§öá¿¿3’´¹‰9©å²èÉ3Âл|Iü‡…$Õ¬lÏ7¤üéïGh€ñ–Sçø‡ïŠ$ý yÛ§Á ‡EO˜1hŒÞµ§É¯Ì‰ÿà¤Õ>è—Rêµ¢G4ÀØêžõŸÃwD’~ÐüÒàÖ“¢ÇÌ(4JÿæÒä¼¹ñ ’T£ºßüÑã`,õ/]¾’´¹lñëÒðîs£ÇÌ84ÎàŽ3ÒäüÃ?H$©NõW­ˆÏce°æ˜é¿3½’ôª”-OÊŸ¼3z,À¬p@# º&µö~køŠ$Õ¦ysÓðþK¢Ç3ÀXÞwqjùE5©µûש˜|¾ç‘ƹöŠ_HùÚÕÑÓjÃã©(Rïªåþ$€¤±¯}Ð/¥¢»)z*Œža/uŽõËfRXsRïÛÿeúxžÆÚpÝm);è—ã?¤$)°ÎqóÕX[#¦îIŸ ßëHãZ¶ü½ixÏÑ“jÉ û©{Ѽ4ù•9áX’Uïü/EOc€ÑP©{Æß…ïs¤±lÞÜÔ;çó©èMFO¨-ðƒ®HÙïÿð’¤ 7=Šj¯wÎ?†ïq¤q¬ýõßHùº›£GÔžx¡~wó·Ìß1üƒL’f½ù;¦áƒWFOb€Úê]oOƒ÷gLa 9€1|úžÔ>ê÷Ã?Ô$i¶Ëö~sÊ×ß=†j§¿jEøîF«æï°ùëþ;ÏF?þ0RÀK)ŠÔ_slj-ýÉø9IšÅÚýr*º›¢§0@m V‘ZsÂ÷6ÒX41'uOú“Tl¸/úч‘ä^I·µùÏ,xMü‡ž$ÍRã>æ+µ¦~øëÉ©5oûð}4uŽûÔ?zCôc#Íl¡üÙGR甿L“_qå)i<êóÑ£ Ô𮳦¿† ¼2ú‘†±æfAÑÞz«V¤ìàþ,Ieëžõ¹è± Píÿú%.i«›Ø.µùPê]ì7Ódô‡³$mcýKES€Ò†\žZ‹vßµH£R¶÷[R÷ä=Òà†ÃR±ñÑèGx Ððé{Sï²%©}øGÒäÄöáÜ’´ÅMÌIƒŽ£ÛlxßE~ó_z…²ýÞºßúËÔ¿îà”¯»%¥"~tWàj¢è<›ú·Ÿ–:gü]j-{Wø‡º$½bóæ¦áÝçFO€­6¼ïâÔZøÚøýŠT—&æ¤lù{Rçø?J½ ÿOÜ~j*6­~TmàjjøäÝ©ãÊÔ9ýoS¶âþ\€¤Z–-Ú%å^=2¶ØðþKýð_c[¶t×Ô>ìé{ÊŸoþAÿ ‡§üáU©ènŒ~4Š8€‘gëÓளSï’Å©sÒ);àüÙIµ([ò¶”¯¿7zL¼¢br]êœðÇ©³ò£R#êž¼Çæ¾õéÔ=óïS÷¬Ï¥Þwÿoê_µ< Ö“†ß;{úüùSw§4èD?‚À,p£¬ßMõkRÿ¦ãRïâù©sêgSûÈßI­ýÞí8@Ò¬–-ÿÙ”O>= ³ÿ<Õ%·ò—)°IEND®B`‚‰PNG  IHDR´´=Í2 pHYsèèµ{Rk«IDATxœíw”ÕÅÇC±Ähb#ßšˆî„TÎ)É}{º_qjõ0i&Ú»¬g’‹\“üVžÂ[T”Ü‹´ÿD;k¿oÈèK¸¾X©‹Ä`Ã4ö¨;’{eoPלIï¿“‹|4îŒgAXý~”Ì?/~,éZ2*à[`÷º„\fŒ3þ~©.ç¥ýÛE—Ë &;w,€TnSr¡í·‚Hu8+½ÿ8ïTˆv-§®1“a¼’çè…zcú…öçvÌt-ðm°z\h–Ðö «¢º´ áº) §Õë©jÉ(‚3òv3„æt ïÛ’ø4ŠÄ…¶ºÏ¶™¼Ïê-4N+d˜£Äö>°:ž¥§ÐÎ_Ö|†9ŠÿA'=…w,¬ù SƒoÕõ<½„æ£3Sþünz ny¯ÖÄd9^ ¬Ngë!´=ðJÈj¢¢Ï>–S(ƒeƒå9#ÞºÄà2¥`É@7L•ó†³oN®B‡k'AVᥠüxx%ÏË88×»®µÂ£”óÖ¬ ±s²‰Øú R­ÕÚêr.@èƒñÄ„›gƒ;þ¾´-á· N“ vâýÛ [p‹S[h¼qn4Q(¦vïK“€ö-dK‡lx í^¥¶ÐÑž5`*á–9`÷ùnF@BÏ‹!ª\ ¦ã ¾FM¡ñüÑDb÷¸S¥Y#—×Üøåj6©QQhaO0qBÝ÷û™ùâ½÷*˜Dlï…pS ø¥à ÿµšBGÕëÀ$ðç>“÷J¿PêY/ƒ–Deà—õwܽ$ë ë-´õÚ·À$¢ª•ô­bO¿¬èð«”oúSà¼~u½nc*#´[ü8˜B|°¬Î_#„“&·)„›f‚*Ä* X3¼™/€3ä:¥Zë6Jh\bcQο €Ú‚_¶øpÉÅq¸}þ‘S‡ íä¯2u-’:§‰<É7^òâ×%Έ[“íÖ¸U,Q_ÙVÞwW¨R¢BãŠ^ˆï–Ý*©‹_× léùàD{ÖB°|˜ìvdøiâí•Ús7˜n…A]øúÏWãC»t®$ŸFâ4_¾Ä¦˜tN°4¨±q'>P¿óÞ´ý1´Z¥«î†‚S:©‹Þ ä49öx<ôä&>þâ")¯|L¯ñyoŠJèxßVÐgدô¬žß{àÏdÿê÷’Ò^èܦúOõRdý"8B-¡± ¿î„§“œ#ÔBèŽ?¯+yÁ9B ¡qņî¸S!/8G¨!´7íIÐgðµäçE„žý è® ¡.8G¨!4žê6”¤.8G¨!t°d莲SE9y¡WŒÝÑñ‘7G$$ôÊÑ ;؃ºà¡ˆÐF¡Õ[jÅDB—ݱz\D^pŽPDèåÃ@wìþWœ#ú£! ;ÎÐëÉ Îj­Ã²ú/ÂsyÁ9B¡K AwÜÉ‘œ#Ô{"ë¶Ù¢.8G¨!4ö÷Õì²O]pŽPDè±ÚäRœ#ÔÛ?±e¯Eçz¡±£Žö„¾\I]tŽ çA˜€ÕýäEçz¡1±{t‡W­£S/¡£êõ ;î¤É‹Îj{ôéN¦·êåu…ö÷ÝáÞÂèÔKhìÚ©;ñäEç5„vFßÚÇ`u8“¼ðA/4n{fö «È ÏôBã.G¸7‰î¸“&/ÝÁ¾¨‚#×n*ÝÁ…¿ÔÁj·½Œh>ÃK²À„4Zh|0aΨßGÐ G6ð?èD>A/4÷.Ñpk)ù`p„B+Gƒöx)Hå6#Ž Ú›ö$˜€=ðJòáz¡ímÁ¼Y/“GÐ Ê;À·AwÂͳÉ„#j‚;–¹cî–Ûˆø {fPh|À²choÉi±Ô™± Ïçõ«Á›þ«ÇA|¸ê„¡Á™Ú_ð˜€3øòÁ5>yÍÁî{¸S… |8D{ÖÄQ­ãíZžY¡ñ§Á¼9yônX¬;¡øe½!Ü>¿A¢Ý«3+´Õí|0pû¸t/03/´ìy·L·¦–/qÇÝ#y2yÞ›N‚µi„6¡µ‰ÓIƒ%@g‚eoÐ펻Œ Áêt6¹ˆéJ¸n2èŒ?¯+ÐV ÁÜñ÷‘‹˜®D‹@g¼Y/щìV%‘Çäx ‘Lh|jd¾ V‡/“ËØØXÏ’+ÛuÆ|-ÐîÄ¿‚)¸“&²±q†ÞºƒœÈ„¶^û&˜Î󦲱ñJž­‰cùŒƒLhL’U2Jkÿ%X5t&Þ¿½ÎŸ51¡ƒ†‚)ø¥äR689§@œÚ:nœN/4ÎÊ2¹¹P^sz9³t~?¿;½Ð¦Lø?Š;éAr9³ñ !‚7È…Æà²Sˆ>Ý _§ÿüV;ûAwì~?TChnG0 ÷í?ÒKZxï> º»‡êu ITh{ÐÏÁ$äª ]ŽÒù­´™šÎIb‰ -¯°ï“ð¦ÿ“^Ö:Ä/-ð?è¬ÐòöÝ0‰Ø;,;úP [ë µiP«q†Ý¬–ÐÎèßiÈû¢9MÈÅ=i ZC´g-Aà@*¿¥ZBã¹¶Ø2 %w Ím*—U™BC6EM^hœ\¾aG«5_:·å#À$pŠ’B›4ûîBÜ·ÿ@/sAk7LÓ°{^¬¦Ð¸ÒØ”‹”ÿ# Áò™Ìv¿˜sÎ|Ñ®ò†Õ#B›ÔUéóÀGÌu☖䷒}4L=Px³ÿ­¶ÐÎ[w‚é`{,œLŸh-Û·mhã`,qÜ ÓŒ ]þuŸÆXWð"Ør]Z뇭¹üÒ¬¨aXǦ2´BãÓ«ùÝ ›Às[oö+`÷¿¢þ÷­ó[‚óær>LTµ² wÜ=zm÷þŽö‹5Jœª†pËð÷î3àN~HÞ!qÇÜîÄÀ›ú„”7X3áHgOCZªÕì«×˜mA2*4'›0Ìç_êF43-t6\2 $pe'T­„ÆxÑÞM ýÈŒÁK_o´_™Ú g™4`÷¾TO¡­‚Ó ¶>Mg9Í êØ]TI¡åQzÖKÔ5dT!pÀê~ÞBË£tªšº”Œfm ”Z¥Kž§®%CL|h—œ¼f„Ðø4,Þ¿º¦ !Ø ?Nºó¹4Bã\鱦¬'C½¢;ÍKÙìQ¿aÕ£‘GÁ툙,ÃK5xF]­Èâ¿°GÞF*´Ýÿ'r¢<“=¸Å%â’7¯+oAOR¡1x¥Ëda‚«æÃªU ¢½[è—åç·äGâY@| ¬Nç$7›þqFßI~”Æ}4tÝ’©¡'ÛÃ%ö+_>ò˜ÐaõF%z cë'ÆL¼©ÿHÌk@Ûšë0)4â/MÏóôF%·™Üׄ1‹`ÉÀädîtD{7×¼VЈ;ýir©±w\l泌;“áúwëÚŠ»ý†;ÊNx½„F¼²ÞòHI)µóæMrJ!£7QE™l„“ˆÌ}/?áÈü¹B#áÎeò1"¥Ônñ㙨9“Ñ'ËÀêpfúEîr.x‹Š‚“¯»<©ÐG +[òXEmàp~«ŒKí/ì•T½™Áfëö€¶rÃÌF§Ïe`½ÜiOB°i¦\ªUµ Í0ºÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3`ÿå|ÛŒ â IEND®B`‚{ "api_version": 1, "layout": { "logo": "yandex-browser-50x50.png", "color": "#ffffff", "show_title": true } }‰PNG  IHDRhp)ñs pHYsèèµ{Rk IDATxœìÝy°fu}çñÛ@#Ç\À¨cƸ nIgÌ$™š$eÆ©TÅŠFG§¦b%š‰1Î$“*ïínºYº‘UqŒÈâ(‹6«€(‘EeëZdí…nÎyös~S}QÜ@{¹÷û;çy^¯ª÷ßýÜå9÷<¿OßûL%BMÅþsh‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h‚h" :iôÀipÓi©÷åJÝÏýy*OþíT¬<0ÓS’¦§RïóïK©æ~¶Àn\wLöר’´Ã­’ÿu¸$Etį¦Þ…“†÷~uöL_Ì@óLª* ï»6õ¾ô·©XõÂüßÜÒ¸´dŸ4úÎù¹Ÿá£®Sÿ‹ÿ3ÿëqIŠìˆ;-ÈhÃõ¹¯Âf yº÷”¹áäT®yMþobiÜZ¶_Ýó•ÜOsˆi.ü@þ×å’”¡òØWξeHõÄ#¹¯Æc ùáoËܳ6uÏzG*ïýVÇÊ¿’ªï}#÷³ò¨«Ôûüû²¿>—¤l-Ù'uÏ~W®»"÷¹1&{ öÒàæÓS¹æµù¿9¥1®\q@ª¸!÷3òªF©w¿N—¤Ü•Ç¿> ¾yzJÃ~šd9ÐTÝÇSÿºcgÿ^îoDiÜ+W˜ª‡oÍý´€æŒ4g¿3ûëuIjD+L½ËϾõÈ$š¨¦êný[wÅaÏÉÿ'M@åQ/IÕÆ»r?õ YFƒÔýÌÛ³¿n—¤Æ´ìÙ©wé?¦ª»%M’‰hªÞ¶'‡™åûçÿF“&¤òc¿–ªM÷ä~ú@3ú©{æŸdý.Ijųgù©_¤I0ÞͰŸúדŠÏÍÿ%MPã^•ê­ä¾@³ :©{Úïe/IkÕAipÃÉ)†iœí@3¼û+©\}Hþo$iÂê¬~uª·}?÷%Z¡îmK3ûëyIjbåq§á]—¤q5vÍèÑ;R猷eÿÆ‘&±Î‰oLuùXîË´Êö×ÒÕg]/IM­sÆÛRµi]7ã3Ð »©·ö£©X¼0û7‹4‰uN>4Õö&^0Wê-÷¥òÈg}/Im龩ÍQ)UãógÏÆb Þwm*W¿:ÿ7ˆ4¡mÿU캳)÷¥Z­ÚxW*W¾ ûë|IjråÇߪïߘÆA«šª»5õ.ø@*föÈþM!MjS~'ÕÝÇs_`,Tßûz*—=;ûë}Ijt‹ÎþE­4è¦6kí@3ÚðõTýëù¿¤ ®sÊ›SÝÛšûrce´îòT,yVö×ý’ÔôÊÕ‡¤ÑC·¤¶jß@S Sÿê•ÞkFÊ\çÔgœ€y2úÎR±hÏì¯ÿ%©ñ-Ù'õ¯;6¥ªJmÓª¦Ú´.•§¼9ÿ\šðº§¾%Õ½m¹/ 0Ö†7œ”ý @’ÚRç3ÿ5UÅc©MZ3Ð ï¸(Ë÷ÏþE–&=ã Ä\yXö³IjMG¼höíQÚ¢ùMU=ù'ÍföÈÿÅ•&<ã Äë_ò‘ìg’Ôš–<+ nüDjƒF4Ugsêœñ¶ü_PIOŽ3ý'r_`òÔuêûžìg’Ô¦z~0¥a?5YcšÑÆ»Syì+³%M¥Îɇ¦º·5÷e&×hºgúÌ’TìDÓ~7Uå¦ÔThF®OÅáÏÏþÅ“4•:Cª;ͽˆÀÄtR÷“oÍ~V Imª\ýêTm¾75QãšÁmç¦bé/eÿ¢IÚ>μ>ÕåÆÜ—àêío °æìg’ÔªV”FÜ”š¦QMÿÚcR1³Gþ/–¤ÔYýêTä¾,?¥Þro*W”ýì@’ÚT¹ìÙix×¥©I3Ðô¯^™ý $éÉ:Ǿ"ÕÛ¾Ÿû²<ƒêû7Í6æ>C¤Vµxï4¸ý¼Ôhzk§óa$ÍVõ¯S½å¾Ü—àÝyQ*í•ý,A’ZÕ¢=Óàæ3Rähª*õ¾ô¡ü_I³•G½$Õ›×g½,;nxã)ÙÏ$©•#ÍM§Mð@SU©{þ_åÿBHš­<â…©Útw¶K°kú—þïìç ’ÔºföÈþ›4ÙšÞ¥ÿÿ i¶òðç¦ê‘Ûs]€ÝQשwŸ/HR+“æÖ³'k ñž3Rs*{Nª¸!Ç¥˜+Ãnêžú–ìç ’Ôºï†w^<MÿêUù?á’žlé¾itïÕÑ—`ÔåÆÔ9î•ùÏ$©e•ËžF÷_7ÞÍà–ϦbfAöO¶¤íËðÂ4ºãK‘—`žÕ›×¥rÕùÏ$©…o1zìÎñh†ë¯JÅ’geÿ$Kzòo+oý\ÔÓ´ýO™ËöËþ I-«<úe©*¯fôÈ·S±|ÿìŸ\IS³¿Å6¼éO} “Ñw/œýšÙÏ!$©eu>ñRtÇc ©¶=”Š£^šý“*éÉ_[=ßO{ ×›ýB’ÚX÷¼÷Á@3êÏ®M¹?™’žlpåaóú”š¥ч²ŸGHRë_|»šÞE—ý“(éɶߦ¥î™oË~.!I­kñÞi´áúv4ƒoýsþO ¤Ùzç¼+¥ºš¯§;Ð`uo[êÿÚìç’Ô¶Ê£^’ª'i×@3zè–T,Û/û'OÒTêžþ‡³n˜\Õ¦»S¹â€ìç’Ô¶:ŸúO³¿ØŽfÐI勼Ԅ:'½)Õý'æüi´Ï辯ÎþÉžÜç’Ô¶úW¯lÇ@ӻ௳²$M¥Î±¯Hu1¿~´ÏàëÏ~f!I­kñÂ4úÞ Íh†w\”Š™ù?YÒ„Wù¢To¹o.ŸÞÀ˜ð¬%ij§ë¬9$¥~Ù̦zâáT¬|AöO’4é•Ë÷OÕC·ÌÕS7£Aêžö{ÙÏ0$©hY½‹>Ü̦sæÉþÉ‘&¾¥û¦jÃ׿êi Œ©º|,•G¿,ÿY†$M·¨™=ÒðÞ¯6k ÜrVþOŒ4é-Ú+îøâ\<¥€ P=|[*ûWùÏ4$iº=uÖ¼&¥a¯MUnô§Í¤´ýMþvÆè΋S±hÏìç’T´¨þ•Ë›1ÐtÏ{oöO†4éõ/_4'`ò ®><ûÙ†$mjɳÒèÑïæh†÷¬MÅÌ‚üŸ i‚ë}þ¿§T×»}1&T]§Þ¹ïÎ~Æ!IE‹êžþ‡šj˜Ê5¯ÍþI&¹î§~?¥Q·/À„vSçäßÎ~Ö!IE‹ÞqQž¦ÿµÕÙ?xi’ëÿºTwß­ ÀÕO<”Ê#_œýÌC’Š–ÔY}pJÃ~ì@S•›R±üW²ðÒ¤V~ì×R½íÁ]~â<êR±dŸìg’T´¤þ×OˆhzþMöZšÔʤjÞ€ àé o>#ûù‡$-©\ùüTu¶Ä 4£w¥bÑ^Ù?hi"[²OÝwÍ.=ÙvTï ™ÿD’¦ÛQï²E1M÷œwgÿ`¥‰lfA~ëÌ]z¢ì”a/uNzSþóIšn~åò_NUgóü4£GïðÛ3R¦W.Ûé'8À®ª¿?•‡?/û™ˆ$-¨ÅÒùhºgýYöRšÄzg¿3¥ºÞé'8Àî­»,‹öÌ~6"IEÃ+—î–ùhF~+3{dÿ ¥I«ûÉ·¦4êïÊ=Àn\yXöóI*ZPÿÊåó3ÐtÏ~WöNš´Ê£_–êâÑ]¹w˜uºŸýÓìç$’T4¼rå Rtçv ©ߊгpÒ$U®8 Uݹ;·Os¢înIc^žý¼D’І7¸ùŒ¹hz$û%MT‹¦Ñú+vç¾ `NUßšŠ¥ûæ?7‘¤éæÖ9ñs7ÐTÝ­©8ì9Ù?(ibšY†;±²DÞòÏùÏN$iºÙ ï»fnšþµGgÿ`¤IªÙô\Ü/Ì‹þ…Ì~~"IEƒëýçs3ДÇœýƒ‘&¥ío¸—êj.î•æÇhºŸø÷ÙÏQ$©hj‹÷NUñØî 4ÃõWæÿ@¤ ©s¿M©_ÌåíÀ¼¨·=˜Ê#^˜ý `^Ö_‘ŠE{e?W‘¤¢uN>tךªÜ˜Š%ûdÿ ¤±oÉ>©Úðµ¹¾G˜wƒ¯®Ê¶"IÓÍlôðm»6Ðô¯?>ûƒ—&¡áÍgÌÇýÀü«ëÔýôe?_‘¤¢õ¿üvm )Oysö/{ý¯üÓ|Ü„©‹GSyįf?g‘¤¢auŽyùÎ4Õ–ûS1³ ûƒ—ƹî§ÿ8¥j4_÷FaF÷^•ŠE{f?o‘¤¢aºuçšþ5GeÐÒ8×YsHª»Ïç}@¨þe3ÙÏ\$©hXƒ+—íÜ@Sžô¦ìZ×Êß›êÍëçó~ ^5JÝO¾5ûÙ‹$ ªsÂoìø@Sm¾×Ÿ7“æ«E{¦Ñ=kçûv ‹zë÷RyøóòŸÁHÒtsÚ¾»ìÐ@Óÿú Ù¬4® ®=:â^ ›Ñûà’4ý£†ÿrÚŽ 43ÿ$ûƒ•ƱÞ9q]ÿâ¿Ï~#IEÃφr tS±t¿ìV·:CJƒ2è ³Ñ uNùìg2’T4 rÕ)UÕÏh†w9û•Æ­rũ޼.ò »íç!åò_Î~6#IEª¹ýç4½Küê¡4§-Ú+Ö]yïÐÃ[?—ÿ|F’¦ó7¸~ÍÏhÊ3ûƒ”Æ©ÁuÇFÞó4Nïü÷g?£‘¤¢ïCó£¦÷D*/Ìþ ¥q©wowhØ}ÞÜg5’Td¬sì+žy ®»<û”Æ¥ÎÇ_ŸÒ Œ¾Ýh¤ê‘o§bé¾ÙÏl$©ÈÕÌ‚T—Ÿ~ é_±,ÿ”Æ rùþ©ÚtOŽ{€ÆÞôÉìç6’TdltÏWž~ éœþGÙœÔúf¤Ñw/ÌqÐx½Ï½#ÿù$MçipÕŠ§hŠÃŸŸýÁIm¯¿ö£9îmZ¡înIåQ/É~†#IE†zç¼ëgšjÛƒÙ˜ÔöºŸúý”ªQ®û€Vݳvö¯ä>Ë‘¤"¸Î‰oüÙfx×%Ù˜Ôæ¶ÿϺx4×} @«ô¿ô·ÙÏs$©ˆnÙ~)ÕõO4ýkŽÈÿÀ¤¶¶xaÝmÎ{€vvSçø×å?ב¤éØê­ßûɦ{î{²?(©­ ¾qbÎÛ€Vªüf*ïýlG’ŠÀFë.ûɦ<ñ·²?(©õÎ}OÎû€V\µ"ûùŽ$ o8ù'šbÅÙ”Ô¶:ǽ2Õ½m9ïaÚ­®R÷“¿›ýœG’Š ú—/~ê8Uu·f@RëZ²OªúVÖû€qPo^ŸÊÞ“ÿ¼G’¦ç¿Þùïêú75zè–ìHj[Ãoþ߬7.ãdø/§e?" î™o{êÚ75üÎÙÔ¦zç¼+ë À8ê}îÙÏ}$©˜ç:'üÆS×½©þõÇg@R[ê¬9$¥~‘õf`ÕÅ£©\uPöóI*æ±òˆ>uÝ›ê­ýhö$µ"ï;0¯Fw_šŠ™ùÏ$izžZºïS×¼©îù•ÿI-ÈûÎÌ¿ÞýH’ŠùjfAJÕhöz7Õ=ëÏò? ©áy߀ ƒ2uŽ{Uöó I*橺·uör7Õ9í?f0R“ë÷ÊT÷¶å¾5˜Õ÷oJÅâ…ÙÏ…$©˜‡ê­Ì^ë¦Êã_—ýÁHmé/¥êáÛ˜2€ŒºŸúƒìçT’TüTo‹öJÕ7äþù@fÕÆ»R±dŸüçU’4ý£ 4Ûú—MçþÙ@C ®X’ý¼J’ŠË@£±¬³ú`Ú €öfÿ~îs+I*~Fã×Ìitÿu¹äÐ0£{¯JÅÌ‚üçW’4m ÑÖ¿äåþY@CõÎ{oöó+I* 4·Ê£ÿMJý"÷Ïyª.7¦òðçe?Ç’¤Ê@£±ifA­¿2÷Ïxnxã©ùϲ$M|•FãRÿÂäþÙ@ÔUêœ|höó,I“FcQyä‹RÝÝ’ûG;-QmøÚì_dÉ}®%ijb3Ðh,}÷‚Ü?Óh™ÞyïÍ~®%ijb3ШõõÎûo¹–ÐBõ¶SyØs²ŸoIššÈ 4juåáÏKuñhîŸå´Ôàš#³ŸqIššÈ 4juÃ[>›ûg8m6ê§ÎꃳŸsIšš¸ 4jmÝOÿqîߌÑ=k³ŸuIšš¸ 4jgËöKõæõ¹v0&ºŸy{þ3/Ii’2Ш• ®_“ûg6c¤Þ¼.KöÉ~î%ijb2ШuuN>4¥j”ûg6c¦¿ö£ÙϾ$MMLµ«Å{§êáÛrÿ¬` ÊT~ì¥ùÏÀ$¥IÈ@£VÕ¿|QîÓÿŸ½ûŽºì. =~Ò ˆD¸ˆr)^Q®W%^A/x)r±pQˆ%45*Ó“L2i&Ò&uȤ'0 LzBzO&ô„ÔI“™}Ê>eÿîzÏxI›™ÌÞÏÞç|¾k}þq±Xòff?¿üžóž$I’$I’4¹ n86ü hM £³Ï[St£g´$I’$I’&¼îa¿~´&ž Í0{ó4¼ç¢èÙ,I’$I’¤)hôÈM)›³Eü&™ Ð;å³ÑsY’$I’$ISTþÍ¿ ¿ZÍ‚†Úk/|U*ÚGÏdI’$I’$MQEçÉÔ^øêð»1 5±,h¨½ÁµGDÏcI’$I’$Maƒ+ ¿ZË‚†Zëò«)Eô,–$I’$IÒ46¦Î~ï ¿#ZÉ‚†úš³E=t]ô–$I’$IÒ7¼mEü=&‘ µ•ŸñÑóW’$I’$IJÝ#~+ü® hM j©½h»TôžŠž½’$I’$IÒø[^²Ù›‡ß™­‰bAC- n:1zîJ’$I’$I߯wòŸ†ß™­‰bACíÌüʨ$I’$I’T§Š§HÙü—„ß­‰aAC½ÌÛ:»5zÞJ’$I’$IO+?û_ãïÏ€4),h¨•üÜ9ÑsV’$I’$IzÆfÞ™ÜÞõ5áwh@k"XÐPí=ÞR¿=g%I’$I’¤g­Åþá÷h@k"XÐPƒOˆž¯’$I’$IÒs7¦Îâw„ߥ­Æ³ ¡ºK¶O©(¢Ç«$I’$I’ô¼ o9%ü> h5ž ñfožF^=W%I’$I’¤õ®{øûâïÕ€Ôd4„ëò×ÑóT’$I’$IÚ F«®ð8ún h5– ¡Ú;¿"Ù£ÑóT’$I’$IÚàz'þQøýÐj, Bõ/Ý'zŽJ’$I’$IUñÔý)›ÿ’ð;6 ÕH4„éìû¶”†ýè9*I’$I’$mtù™ÿ~Ï´É‚†0ÃÛOžŸ’$I’$IÒ ªè~/µ¾:ü® h5Ž !ºG}(zvJ’$I’$I›¤þ¥û†ß·­Æ± ¡zs·L£Çn‹ž›’$I’$IÒ¦iÐKí=ßï¤&± ¡rù·þ>zdJ’$I’$I›´ÁÕ‡†ß»­F± ¡Rí^–еGÏKI’$I’$iÓ6¦Î¾o ¿ZaAC¥úì=*%I’$I’¤RÜp\øýÐj *ÓÞýõ)õÛÑsR’$I’$I*§¢Hý>üh5‚ •¬\="%I’$I’¤RÞúÍð{8 Õ4T¢óÕŸK©EÏGI’$I’$©ô:KÞ~´jÏ‚†J ï<+z.J’$I’$I•4¼çÂðû8 U{4”®»ôÑ3Q’$I’$Iª´îï¿—ZµfAC¹fožF«®ž‡’$I’$IR¥¸*e³7‹¿ŸR]YÐPªÞÉŸŽž…’$I’$IRHÝ£7ü~hÕ– å™»U*ž¼;zJ’$I’$I!¾qü 3á÷t@ª# J“Ÿö…è(I’$I’$…Ö;á“á÷t@«–,h(Ç‚mS±öáèù'I’$I’$…6z⎔ÍÝ2þ¾HucAC)òsfEÏ>I’$I’$©õ–&ü¾hÕŽ ›\{çW¤¢ódôÜ“$I’$I’jQ±æÁ”Íqø½Ъ 6¹þ £gž$I’$I’T«òÓ¾~o´jÅ‚†Mª½Û§”gÑóN’$I’$IªUEöhj/xiøýЪ 6©þe‹£g$I’$I’TËò³þ9üþhÕ† ›L{Ï7¦4èEÏ9I’$I’$©–íÇý þ? 6™Á5‡GÏ8I’$I’$©Öå§9ühÕ‚ ›DgŸŸIi4ˆžo’$I’$IR­+Ö>”²ù/¿ÏZá,hØ$+¿=Û$I’$I’¤F”¯Ø!ü>h…³ áëìýS~{F’$I’$IZÏŠ5«ü ,hxÁ×=Ó$I’$I’¤F•Ÿú¹ð{= Ê‚†¤½×›ýöŒ$I’$I’´«ïKÙÜ­Âï÷€V ^Á5‡EÏ2I’$I’$©‘õ¾ñ—á÷{@+Œ ­½ÇO¦4Ì£ç˜$I’$I’ÔÈŠïÝ“²¹[†ßó­4l´ÁUK¢g˜$I’$I’Ôèz':üžh…° a£´÷xƒßž‘$I’$I’^`£'îLÙœ-Âïû€Vå,hØ(ƒ+Œž]’$I’$IÒDÔ;ñÂïû€Vå,hØ`íÝ"¥A/znI’$I’$IÑèÑ›S6{óð{? U) 6XÿÒ}£g–$I’$I’4QõŽûƒð{? U) 6H{á«Rʳèy%I’$I’$MT£Gnò[40kºXаAúçÍžU’$I’$IÒDÖ=æcá÷@«24¬¿Û¦¢ýXôœ’$I’$I’&²Ñª•)›½Yü= ª`AÃzËOûbôŒ’$I’$I’&ºî²‡ß­JXа~æn™ŠÕ÷FÏ'I’$I’$i¢ÝEü] ª`AÃzé}ýÏ¢g“$I’$I’4uùÕðû@ U: žßìÍÒè‘›¢ç’$I’$I’4 o9%þNHe³ áyuþÝè™$I’$I’$MOE‘:‹ß~/´JeAÃóÞ{IôH’$I’$I’¦ªÁ5‡…ß ­RYÐ𜺇þzô,’$I’$I’¦¯ažÚ»¿>ü~h•Æ‚†ç4¼åÔèQ$I’$I’$Meý …ß­ÒXÐð¬:ÿöÓ)£è9$I’4݆©è<‘Š'ïJ£UצáwψfpݲԿâ€Ô¿p·”Ÿ¹cÊOý\êðÉÔ;î÷ÿñOÝ#Þÿ4%ïIÞ:þâºÿÛÒ¬ûÏŸøG©·ü3)ÿÖßÿ;ûçÍÿ÷÷/ß/ ®>4 o^>þúÛÑc·¥¢÷TôOF’$iâ›9sµw~yø=!Ð*… Ïjæ_Ä%I’TRýöxÑ1üîipýÑ©ÉÞ)?í‹ã%K÷ÿ9þ°L¶`Ûð3ásš·õøk7:û¿kÝ’çÄ?Nùi_/u7ŸF\5^.I’$iãËÏü§øsÊ`AÃ3jïüŠTäk£ç$IR³0]—7”úìšzßø‹Ô=ü7Sgß·¥öN?2]gË]^9þ™ßÒ™ùÍœÁUKÒð®sRñäÝãß’$IÒ³W¬ypüÁ˜è3ÐÚä,hxF3›yI’$=OÃ|üÕcÃ;ÏNýK÷=ØÌW†µ÷zsÊfo~¦k„¹[¦Îâ·§ÞIŸÿ g~–Eûñè²’$IµjæÃ>áç6 mj4<Ýœ-R±úÞè¹#I’TŸFÃ4zìÖñ×vågýsê.ý`jïñ“)›½YüÙmÍÞ™†·~+¥a?ú¸$IÒó7è¥ö¢×ÅŸ£€ôBYÐ0Ö;þÑ£E’$é+¾wOê_¾_êñ[ã•DŸ›˜\í…¯Nù©“†÷^œRQDÿÑ—$IzÖf¾Ö7úì´^0 Ɔ÷\=W$I’ÖUiôÀU)?gvêìÿ®ðsÓ©½çS~îœT<õ@ôßI’¤§U´OÙü‡Ÿ™€Ö bACê|õ¿EÏI’4í£4¼÷’”Ÿö…ÔÞã áç#ø¾9[¤î1KÃ;Ïò[5’$©Võ–ÿUüY H/„ ipåAÑóD’$McÅ(¼:åçÎMí½Þ~&‚çÓÙû-©án©h?ý·G’$)¹)e³7 ?#­fA3åÚ;¿<ùÚèy"I’¦¨Ñª•)?ýK©½ûëÃÏB°Qæ¿8õNþtÝEô_'I’4åuÿÍø³6–Í”ËWì=G$IÒT¬y0õ/Ý'uø…ðólJ3¦+—Ž#L’$©ê†7/?­fA3Ífo–FÞ=G$IÒ¤Öo/®»G¼?e³7?û@‰:ûýl\·,¥Ñ úož$Iš¦Š‘¯ †YÍeA3ź‡¿/z„H’¤ l怙Ÿ¹cj/|UøyªÖÞóMãßKýNô_EI’4%õ/Ù;ü ´6ŠÍÜxBôü$IRÑ{* ®<0uxwøê ½ÛkSÿÂEã¿’$IeVtW§ö‚—†Ÿ€Ö³ ™Rí],¥a=?$IRÃ=t}ê-ÿ«”-Ø6ü|uÔÞå•©Á®ã¯ü“$I*«ü›~îZÌ‚fJå§)znH’¤¦VŒÒð–SÿýÝ2›…Ÿk )õ™wÔH’¤=~»÷>¬池™òð’$Ië[Ñ~,õ/X˜Ú{¼!ü,MÕÙç­ipÓ‰)Eô_iI’4au—~0ü¬´6ˆÍê,yOô¼$I ªxò®”¯Ø!eó_~ŽIÑ9ðÓð®s£ÿzK’¤ jxûéág µA,h¦ÐàšÃ¢ç…$Ij@£û.K½c?î« DÝ#ÿW=|Cô_wI’4 Eêìû_ÃÏ7@k½YÐL™öN/KE¾6z\H’¤ºVixë7S÷ÿ~n©1g‹”ŸöÅTôžŠ~H’¤†×¿bÿø³ Ö—Í”é-ÿ«è9!I’꺘¹åÔñ×.EŸW`Zµw{m¬\êý4’$iãë·S{— ?×­õbA3eF÷_=&$IR*Fë3¼;üœ¬Ó=ô×|í™$IÚèòÓ¿~žZëÅ‚fŠtö{gô|$Iu©¥Á Ǧξo ?£Ï`î–)?ýK©è­‰~ZH’¤†U)›»UøY˜|íÝ"¸2úÉ'I’*nôèÍÞo ³êÂf ®[ý¬—$IPñÔýãO´GŸ!€)3ÿ%ixóòèG $Iª¸î¡¿Ò šI3o›TôžŠ~ÎK’¤õlø¯§öÂWÅŸ!€é4çE©ù~ÑBI’Ta3î?ƒi†Í„éûñèg¼$IZŸ½”Ÿú¹ð³ÀŒüŒÕ¢$Iš‚½Ô^øêðóв ™4ƒ›NŒ~ÄK’¤ç©X}oêôKá瀧}ث߉~DJ’¤ ÊÏø‡ð³в ™( ¶M)Ï¢Ÿï’$é9ÞrJjïòÊøsÀ3èü+©h?ý¨”$I%7zâΔÍÞ<üìÓndA39zÇ"úÙ.I’ž­a?å§}1e³7 ?3<—Îâ·§â{÷D?5%IRIOÝŸß99µw{mø¹¦ÝÈ‚fr n<>úù.I’ž¡"{4uýõð³Àúj/Ú.¹)úñ)I’^`EwuÞyvꟿKêýÑÔ^ôºðsÐú> šI1oëTôÖD?ó%IÒ5zèºÔÞóMñg€ 4óuŒ£û/~ŒJ’¤õm4Àb°riê-ÿÌø·b}´jÍ‚fBt—}8zH’¤jpÃq)›ÿ’ðsÀÆjïüò4¼÷âèÇ©$Iz†Š5¦Á'¤|Å©»dû”ÍÛ&üì´6ˆÍ„\sxôL$Iÿ¿b”ò3wô¾`2,Ø6 ï:'úÉ*IRšöeÌðæo¤ü¬IÝÃß7þEøH/”Í$˜ó¢T´‹ž’$i¦A7õŽÿDüù`Sš·õøRH’$•ßÌk †÷\”ú—î“z'}jÝW•EŸ€T š Ð=ü7£ç†$IªmUêø‹ág€RÌÙ" V~-úQ+IÒdå½1¦™Íè_¶8z”H’4õº>µ÷øÉðs@©æ¼( ®=2ú‘+IR3+Š4zìÖñòoý}êôKãßR Ÿï@ŠbAÓt³7KÅêû¢Ç‹$ISÝðγR{§—ÅŸ ª0{ó4¸î¨èG¯$Iø ûáÍËS~öWR÷ˆßJí_?ÇT'4 ×9èDÏI’¦ºÁwNNÙ¼mÂÏ•ÿ&ÍõÇD?‚%IªME¾Ö{c€´¡,h®Á®ÑóG’¤©­ùW}?40ÝKš~K’úÞ˜|Å©sÀ»ý{6†Mý9z$I’4}Åøk ¢Ïáæn•†·­ˆ~*K’Tò{cnKƒë–­[Æü+~ƒH›ŠMƒµ÷zsôˆ’$iú*F©wÊgÃϵ1o›ñ»¸$Iš„Šµ¥á-§¦üœY©{äÿJí]^?k4©,hlfk/I’*l4L½“?~¨ù/Iûϋ~JK’ôÂß3{³ø¹ ¤iaAÓ`Ã;Έžc’$MOÃ~êû{áó ®Ú ^šF÷]ý´–$éÙß³êÚ4¸òÀÔûúŸ§Î~ï¿O-z~ÓÍ‚¦©l›Ò =Ú$IšŽ†yêý»ñó æÚ _å=™’¤ZT¬ypÝW•¹cê.Ù~üÛžÑs û!4 5sI$I’*hÐMÝ#;|ö4E{Ï7¦â©¢ŸÞ’¤)ªÈIÃ[¿™òsç¤îÒŒ?0=²õ`AÓPƒ«‰ž}’$MÇoÎõ¡ð¹Ð4ÅïHEçÉ觸$iË3ïÒ¤° i¢Ù›ùDš$Ie7ì§î²ÄÏ}€†êüË)õÛÑOsIR“ Óè‘›Ò`åÒ”¯ØaÝW•ÍÝ*|Æd›ˆMuxwôx”$i² Sïø? ŸùM×]öáñK™%IÚ ÷Æœ;7ux¿÷ÆiÒYÐ4P~Îìèy)IÒäVŒRïøO„Ï{€IÑ;寣Ÿì’¤Vd¦ám+Ö-c¾ö;©½ðÕá3 «˜Mî¿ã¦Egñ;RÑ]ýø—$=_Ã~=xuê_ºOêô©ÔYüvj˜µiYÐ4ÈÌ ”$I›®Ñ£7§ö.¯ ŸñÓ¦»ôƒãwH’jôÞÝ/¦ IDAT˜GnJƒ•KS¾b‡Ô]²½1Ì*ŸMƒä+>=®%Iš˜Šµ¥öžo ŸïÓ*?ýËÑ£@’¦¶§½7Ƈ–R šÞú­èù-IÒdÔo§Îÿ=|¶L»ÁÕ‡DOIšøŠÎixÇ©ÿí©»ìé½Û‡?ÿhYÐ4ÅÜ­R‘¯žé’$5¿¢H½ã??ÛHÙÜ-Óðž‹¢'ƒ$MÖ{cf¾ªìªƒà½1›Ç?ïHÏÄ‚¦!º‡½7zÄK’4Í|r0z®ðÚ»½vüU;’¤ ¯xò.ï˜Õ\4 Ñ¿`aôÌ—$©ñ o^î„5ÔYòž”†yô˜¤†½7æGßߴ^ š†=pUô9@’¤F7zø†Ô^ðÒð™À3ËOûBô¨¤ÚTt¿—†wœ™úçË>’Ú‹¶ NÐÚä,h ½Ë+S*FÑgI’[Ñ]:{¿%|¦ðÜ×=2$©ú½4ºï²Ô¿lqêøÇ©³Ï[S6{³ðg2­ÒYÐ4@÷èF$IjnE‘zÇ~<|ž°æ¿8¼&zrHRÅïÙ&þù @Š`AÓýKöŽ>;H’ÔØú. Ÿå¬¿öžoJEûñèñ!I›$ï {4 0ZumôyB’¤F6üîù)›³Eø,`Ãt—}xü’Ô´¯ÕÞyvꟿKêý»©½èuáÏSZµfASsÞ?#IÒÆUdz™*@ƒù&Iµn˜§ÑýW¤þåû¥ÞI’:ûþWï m( ššóþI’6¢¢HÝe Ÿã¼s·L£û.ž(’ôý¯*Üx‚÷Æ6% ššó©1I’6¼þ¥û„Ïp^¸ö^oe$UY±fÕ~oÌÂW…?hM$ ššóþI’6¬ÑÃ7¦lþ‹Ãg8›FïØß‹-’&¸"_›†÷\4þ€Oï¤O¥Îâ·‡?÷hM šóþI’6°~gÝ÷×`Ž°é ®<0zÂHš„†ý4zàÊÔ¿bÿÔ;ùO×-cfoþŒ 5µ,hjÌûg$IÚ°òŸŸß”`Þ6i´jeô˜‘Ôô÷Æø-kfÕ‹MyÿŒ$Iëßð»çû$À›ù É”gÑãFR­ßsJÊÏþJêñ[©½ó+Ÿ[= š=xuôùF’¤f”g©³÷[Âg7åê-ÿLôÄ‘Tƒ¼7€lBXÐÔÕ‚mS ¢Ï<’$5¢Þ)ŸŸÝTbxË©ÑcGRÕïyðêÔ¿â€ÔûúŸ¥Îâwø­iÒ¤° ©©îá¿}’$©A_m¶Yøì í],kŠ?’J|oÌÌ"6?sGï M: ššÊÏ™}&’$©þ z©³ïÛÂç6Õê.ûHô’´ *ºßKÃ;ÏNù¹sS÷¨°ÑÏÈ*dASSÃÛO>'I’Tûò³ÿ5|fcpõ!ÑcHÒ†”gOoŒß‚`Ê,hjhöæãO‘H’¤goôð)›»eüÜ Æ‚mÓè±Û¢Ç‘¤gj4H£GnJƒ•KS¾b‡u_U6w«øç̪ šêì÷Î裔$Iõ®(RgÉ{Âg6±:ÿÊø"XRl£'îHƒëIùi_ðÞ˜µþ,hj¨wÊg£ÏV’$ÕºÁµG†Ïkê¡ÿí¢Ç’4UÙ#ixë·R~îœÔ]úÁÔ^øªðçd eASCƒëŽŠ>oI’TÛŠÞšÔ^´]ø¼ &æl‘F«®OÒdæ½1ÊdASCÅ“wGÁ$Iªmùi_ ŸÕÔKgÿw¥4ìG(©Ù†Þ³ªeAS3íÝ^}$“$©¶Í\²¹[†Ïkê§ÁÂè1%5ªâÉ»Òà†cS~ú—R÷_MÙü—„ÿ=€lÊXÐÔL÷˜EŸÑ$IªmݯýNø¬ ¦æm=þô¿¤§WtW¯ûª² wKÝ£>”Ú»¾&þï,,hjƧ¾$Izæ†w;|NPoƒ~iü5MÒT7ì§ÑƒW{o ̪? ššÞyvôQN’¤úU©sÀ»Ãç4õ׿hè©%ž7fÞÖá€Öz± ©“Ù›¥¢ódôñN’¤Ú5¸î¨ø9 @ƒ¾êlÝ¿èJ“V±æÁ4¼åÔ”Ÿ;wÝW•íüŠø¿s@ÚX45Òù·ŸŽ>ëI’T¿†yjïù¦ð9 @sÌüA*FÑLzAíÇÓðöÓSÿ¼ùÞ³&“MôNü£èóŸ$Iµ«Åá3€æ\y`ô“Ö?ï€4,hjdæ &I’~ A/µwÿ‰ð @ó´wú‘ñ×AIµË{c€YëXÐÔÈðÞK¢‰’$Õªþ¥û†Ïgš«wüF2ééïÙå•á7€V-XÐÔÅœ-R귣ϒ$Õ§~'µm?£h´ám§EO4MQEçÉ4¼ãŒÔÿöN©»ìé½Û‡ÿZµeASýß}Ž”$©Võ/ÿjø| ùÚ{¾1¥<‹kšÔ÷ÆÌ|UÙUÿÀ{c6ÿ3´¦&zßøË裥$Iõi4L½ß>Ÿ˜ ù™ÿ=ÙÔôŠÑºe̵G¤üÔÏ¥ÎïNÙÜ-Ãÿl­F³ ©‰Á•F7%IªMƒ›N ŸÍL9[¤Ñª•ÑãM~oÌÆÿ9Ò¤± ©‰Ñ}—EŸ?%IªMƒ%|60Y:ÿòø· ¤®è~/ ï<+õÏß9u—}Ä;ð€T š:˜ó¢”úíè3©$IµhxÏEñ³€‰4¸úè1§èFƒu_U¶riê-ÿŒ÷Æ)’M tö}[ôU’¤ÚÔ=ú£á³€ÉÔ^øªT´uª°âÉ»ÆË˜|Å©»dû”ÍÛ&üÏ!@öï,hj wÂÿ>³J’T‹FÝæS¬”*ÿæßF;UõÞ˜…¯ ÿó= šè_¸(ú+IR-šùª‘è¹ À„›ó¢4Zµ2zäéVôÖŒ¿µé>©wÒ§R{¯7ÇÿÙ˜µa,hj`xÇ™Ñg[I’Â+²GR6ÿÅás€É×Yòž”Š"zôi}óÞ`Öd² ©bíÃÑÇ]I’ÂËÏ™>“˜ƒ•_‹}zޝ*Üx¼7Æ8€Y“É‚&X{Ñë¢Ï¾’$Å×o§öÂW‡Ïe¦G{·OEwuôœúŠ5«¼7HÓÊ‚&Xwé£ÏÃ’$…7¸êàð™ ÀôÉOûbôœªŠÞSix÷y©Á®©{ÌÇR{÷Ÿÿ3²  –Ÿõ/ÑgdI’Âë|õçÂg2Shî–iôèÍÑcp2öÓè«RÿŠýSïä?õÞ€YOgAlpñÑÇfI’BÞsQø<`zùVƒM÷Þ˜ñW•¹£÷ÆÌZ?4Ñÿ¾!ú-IRh½>>˜nÃÛO‡ªXûн7Æ{ä²`AiÎ) zÑgkI’Â*²GS6oëø™ ÀTëìû¶”Fƒè±XËŠ|íø·]û—î“z'}jÝW•ÕàŸ@6,h¢ÿ%@’¤)®þ.áófô¯8 z,Æ7¤Ñ#7¥ÁÊ¥)_±Cêðî”ÍyQø?€lBYÐêûñèã·$IqEjïõæðy 3Ú»þX*º«Ó45züö4¸þ蔯ø|êü+)›·Mø?€lŠXКù¾^I’¦µáÝߟÅðƒò3þ!MjE÷{ixçÙÿñÞ˜],üç 0íF4q7ž}F—$)¬ÞI>‹à?™»Õø·J_ž=ý½1³7‹ÿù~Mèÿ¦èc»$I!½5)[°mø,€Ö;æÿ¤Æ½7fÕÊ4¸ò ÔûúŸ§Î~?ë½1³šÁ‚&ÊÜ-SæÑGyI’B\}Hü,€g1¼÷âT׊5¦á-§®ûª²#ÞŸ²ù/ ÿyÐÚ(4A:‹ß}®—$)¬Î’÷„Ïbx6ƒ9¥¢ˆ—©è®^÷UeîöïïyMøÏ€Ö&cA¤wÜDŸõ%I iôľ€ÚÞ¼<à½1¦þÅ{¥Þñ˜Ú{¾)üg@«T4Af~]’¤i¬ÿíÂç0<ŸÎ>o¿ß¥”FÃñ;I+—¦|Å©»dû”ÍÝ*ü3­JYÐ\t9}I’j^g¿w†ÏaXƒ«–”óÞ˜Û†ÿo ΂&êÿàÕ›ä /IR“=|Cø €õÕ^ôºñWmHÞ@¶ž,h‚½§Jºú’$©¾ågÿkø € Ñ?—glÃþøÃwýK÷I½“>•:‹ßî=k¤õeA ½h»ênÂ$IªQ½ß>‡`C´wzY*²Gžù½1ó¶ÿÿ€VcYÐèúëÑ÷c’$UÞè«Âg0lŒö^ÿÅ{cH›šM€ÞòÏDß‘I’TyùÙ_ ŸÁYMXÐè_¼gô™$I•×Ùïá3 « šÃ[N¾#“$©ÒŠï}7|þd5bAñCìÖè{2I’*­ÉÞáó « šªÍÙ"¥a?úžL’¤Jëöñ3`V}XÐT¬³÷OEß‘I’TiEç‰ñ¢g0@V#4ëñ[Ñ÷d’$UÚà†ãÂç/@V34ëòÙè{2I’*­÷¿Ÿ¿YÍXÐT¬ánÑ÷d’$UZ{Ï7…Ï_€¬f,h*6¸ñøè{2I’*kôØ­á³ «! šªà\}W&IReõ/ß/|öd5dAS±¢ýxô]™$I•Õ]ö‘ðÙ ÕM…Ú;ýHô=™$IÕ5Œg_ôüÈjÈ‚¦Býß}U&IRe¸2|öd5eAS¡î1‹¾+“$©²ú—ì>{²š² ©P~ú—£ïÊ$Iª¬Þ±Ÿ½YMYÐT¨Ùâè»2I’*«½h»ðÙ Õ”M…†7/¾+“$©’FOÜ>w²³ ©ò‡ýà5Ñ÷e’$UÒàÚ#Ãç.@Vc4*Ö>}_&IR%õ–&|îd5fAS•y[§TÑ÷e’$URgÿwÅÏ^€YõeAS‘ÎÞo‰¾+“$©š½”ÍÝ2|öd5fAS‘îaï¾.“$©’F\>w²š³ ©Hï¤?‰¾/“$©’W>w²š³ ©H~öW¢ïË$Iª¤Þò¿ Ÿ»YÍYÐTdæÓÄ’$MCÞ>w²š³ ©ÈðÖoEß—I’T~Ão²†± )ûüøíÑ÷f’$•ÚðöÓÃç-@Ö04%+²G£ïÍ$I*µÁ5‡‡Ï[€¬a,hJ–†yô½™$I¥Ö¿hðy 5ŒM™l}g&IRéågýKü̘Õ,4%jïþúè;3I’J¯wÊ_‡Ï\€¬a,hJÔYüöè;3I’J¯wü†Ï\€¬a,hJÔYòžè;3I’J¯{äo‡Ï\€¬a,hJÔýÚïDß™I’Tz1|æd cAS¢Þ ŸŒ¾3“$©ô:{¿%|æd cAS¢üÔÏEß™I’Tzí…¯Ÿ¹YÃXД(?sÇè;3I’Ê­(R6g‹ð™ 5ŒM‰úç;6“$©ÔŠÞšðy 5M‰ú—ì}o&IR©kV…Ï[€¬,hJ4¸êàè{3I’JmôÄáó k š ®?:úÞL’¤R=|cø¼ÈÈ‚¦DÃ[N‰¾7“$©ÔF÷_>o²² )Ñð®s£ïÍ$I*µáwÏŸ·YYДùýÿŠè{3I’JmxÛiáó k š ~¸’$Mjƒïœ>o²² )Q±úÞè{3I’JmpÝQáó k š'¢ïÍ$I*µÁUKÂç-@Ö@4%JýNô½™$I¥Ö¿tßðy 5MYfo–RQDß›I’Tjý‹vŸ¹³šÇ‚¦,󶎾3“$©ôúì?sf5MIÚ;¿<úÎL’¤Ò럿søÌÈÈ‚¦$íÝ~<úÎL’¤ÒëŸ7?|æd dAS’öžoŒ¾3“$©ôòsç„Ï\€¬,hJÒÙç­Ñwf’$•^~öWÂg.@Ö@4%é|õ¿Eß™I’TzùYÿ>s²² )Iç ÿ}g&IRéågücøÌÈÈ‚¦$ÝC-úÎL’¤ÒËOÿRøÌÈÈ‚¦$Ý#;úÎL’¤ÒËW|>|æd dAS’îQо3“$©ôòoý}øÌÈÈ‚¦$Ýc>}g&IRéYд6ŠMIzÇýAô™$I¥—Ÿö…ð™ 5MIz'|2úÎL’¤ÒËOÿrøÌÈÈ‚¦$½“þ$úÎL’¤ÒËÏÜ1|æd dAS’Þ×ÿ<úÎL’¤ÒËÏþ×ð™ 5MIz§|6úÎL’¤ÒËÏ™>s²² )IþÍ¿¾3“$©ôúçÍ Ÿ¹YYД$_ñùè;3I’J¯ÿíÂg.@Ö@4%ÉOÿrô™$I¥×¿`aøÌÈÈ‚¦$ùYÿ}g&IRéõ/\>s²² )I~öW¢ïÌ$I*½þÅ{…Ï\€¬,hJ’Ÿ3+úÎL’¤Òë_ºoøÌÈÈ‚¦$ù9³£ïÌ$I*½Á•…Ï\€¬,hJbA#Iš†+—†Ï\€¬,hJ’Ÿ;'úÎL’¤ÒÜx|øÌÈÈ‚¦$4’¤ihxË©á3 k š’XÐH’¦¡ág…Ï\€¬,hJ’Ÿ;7úÎL’¤ÒÞsQøÌÈÈ‚¦$4’¤ihôàÕá3 k š’XÐH’¦¡Ñ#7…Ï\€¬,hJbA#Iš†Š'ï Ÿ¹YYД¤Þ¼è;3I’J¯Xó`øÌÈÈ‚¦$ù¹s¢ïÌ$I*½¢ódøÌÈÈ‚¦$ùÙ_‰¾3“$©üÝð™ 5MIò³þ9úÊL’¤JÊæl>w²†± )I~Æ?Fß—I’TIí]^>w²†± )I~ú—¢ïË$Iª¤öžo Ÿ»YÃXД$_ñùèû2I’*©³ßφÏ]€¬a,hJ’óï¢ïË$Iª¤Î’÷„Ï]€¬a,hJ’Ÿú¹èû2I’*©»ôás k š’ô–&ú¾L’¤Jê÷ás k š’ô¾ñÑ÷e’$URï>w²†± )IïäOGß—I’TIùé_ Ÿ»YÃXД¤wâEß—I’TIýóæ…Ï]€¬a,hJÒ;î÷£ïË$Iª¤þÅ{…Ï]€¬a,hJÒ=ú£Ñ÷e’$UÒàêCÂç.@Ö04%é.ý@ô}™$I•4¸ñøð¹ 5ŒMIº‡½7ú¾L’¤JÞqføÜÈÆ‚¦$Ý%ÛGß—I’TI£¯Ÿ»YÃXД¤sà¾/“$©’Š'YÃXД¤³ßÏFß—I’TIEï©ð¹ 5ŒMI:û¼5ú¾L’¤ÊÊæn>{²± )I{Ï7Eß•I’TYí]_>{²± )I{ÑvÑwe’$UVgß·…Ï^€¬A,hJÒÞåG£ïÊ$Iª¬î!¿>{²± )˼m¢ïÊ$Iª¬î²ÄÏ^€YÍaAS¢4Fß—I’TI½¯ÿYøÜÈÄ‚¦DEï©èû2I’*)?ýËás k škVEß—I’TIý †Ï]€¬A,hÊüá>~{ô}™$I•4¸ò ð¹ 5ˆM™?ÜU+£ïË$Iª¤ÁM'†Ï]€¬A,hJ4¼ç¢èû2I’*ix÷·Ãç.@Ö 4%ÞqFô}™$I•4zôæð¹ 5ˆM‰ß99ú¾L’¤J*:O„Ï]€¬A,hJ4X¹4ú¾L’¤j*Š”ÍÝ*|öd aAS¢þD_—I’TYíÝ_>{²†° )Qÿ¢Ý£ïÊ$Iª¬Î¿>{²†° )Q~îÜè»2I’*«»ôƒá³ k šågüCô]™$I•Õ;ùÓá³ k šå§~.ú®L’¤ÊÊÏÜ1|öd aAS¢ÞIŸŠ¾+“$©²ú—ì>{²†° )Qï˜ÿ}W&IRe ®?:|öd aAS¢î‘¿}W&IRe ï:'|öd aAS¢î’í£ïÊ$Iª¬ÑÃ7†Ï^€¬!,hJÔÙÿ]Ñwe’$UV‘=>{²†° )Qgï·Dß•I’T]Å(es¶Ÿ¿M`AS¢ön¯¾*“$©ÒÚ‹^>²° )Q{ÁK£ïÉ$Iª´Î¿>²° )Yö£ïÊ$Iª¬îÑ Ÿ½YXДlæ…É’$MKù©>{²° )ûüØ­Ñwe’$UVÿü]Âg/@XДý¾ï²è»2I’*kpí‘á³ k š’ o[}W&IRe ï<;|öd `AS²ÁuË¢ïÊ$Iª¬Ñ£7‡Ï^€¬,hJÖ¿lqô]™$I•UtW‡Ï^€¬,hJÖ?o~ô]™$I•Ö^ðÒðù Pw4%ËOûBô=™$I•ÖÙçgÂç/@Vs4%ëô'Ñ÷d’$UZ÷°÷†Ï_€¬æ,hJÖ]öáè{2I’*­wâ‡Ï_€¬æ,hJÖ]²}ô=™$I•–Ÿ¹cøüÈj΂¦dÅo¾'“$©Òú—-Ÿ¿ugAS²ön¯¾'“$©Òß99|þd5gAS¶y[Gß“I’Ti£û¯ˆŸ¿³êÍ‚¦)Ï¢ïÊ$Iª¬bíCá³ «9 š OÝ}W&IRuEÊæm>²ÿÇÞG[Z×w¾ßà€×!xÅhLǘåÔ7¹‰ÚI´µMÒË «û&¹šŽÑ^½š\o·®51ñPL‚ 2 ˆ –€€(¡d”1€2¨h1*“B‰ÀoÏ{?Ï]Uºk8gž½Ÿ×{­×ÿPuêùžóýVíg©¹hfñ‹|×5éU™$I3­wÀóâó Éhf`rËÓ{2I’fZÿè?‰Ï_€Ò`430ùê)é=™$I3mpÊ[ãó 4˜Í Œ¯<*½'“$i¦Î[Ÿ¿¥Áhf`tѾé=™$I3m|åÑñù PÌf†gÿKzO&IÒL›Ütn|þ4™Í N}[zO&IÒL›n¸1>Jƒ9ÐÌ@ÿ¸×¦÷d’$Ͷɰ.«¶Ï`€ÒP43Ð;üÅé5™$I3¯»Ï3â3 4”Í t÷ýõôŽL’¤™×;â¥ñ PÊfVïP×U•Þ“I’4ÓkߘŸÁ å@3#Uÿûé=™$I3m¸î}ñù PÊfV¿Ð÷ÜÞ“I’4ÓF—Ÿ¿¥¡hfdrËé=™$I3mòõÓãóvÖ— IDAT 4”ÍŒŒ¯;1½'“$i¦Mï¾6>JC9ÐÌÈÆy‘$©U K|þ”†r ™‘á9Ké5™$I3¯»×Óâ3 4ÍŒ N{{zG&IÒÌëñÒø ( ä@3#ýã_ŸÞ‘I’4ó'¾)>ƒJ9ÐÌHï#/IïÈ$Išy?â3=ƒJ9ÐÌHw¿g¥wd’$ͼñ•GÅg0@i šYYý¸ôŽL’¤™7¹ùüü Xjšª÷§÷d’$Í´êû·Åç/@i šYþbßûÍôžL’¤ÙVMë²z‡ø ( ã@3C“[/J¯É$Išy½ŸŸÁ¥ahfh|ýIé™$I3¯ì+ã3 4ŒÍ .;$½#“$iæ Og|”†q ™¡á9«Ò;2I’fÞè¢}ã3 4ŒÍ N{GzG&IÒÌõ3ñ PÆf†úǽ&½#“$iæMï¼*>ƒJÃ8ÐÌPï¦wd’$ͼjp|”†q ™¡îž;¥wd’$EÚ8Ós 4ˆ͌գnzG&IÒÌë}ä%ñ PÄfÖ¿à÷|#½#“$iæ Nú›ø ( â@3c“›ÎMïÈ$Išy£óVÇg0@iš_}lzG&IÒÌ_óÉø ( â@3c£/®IïÈ$IšyÓÛ¯ˆÏ`€Ò 436<ýÿMïÈ$IšyUÿûñ PÄfÆúÇ¿.½#“$)RwϧÆç0@išëú¢ô~L’¤H½#^ŸÃ¥!hflãß–$© Nþïñ9 PÂ& õÒ;2I’fÞèüÝã3 4„Mâ}ÃúôŽL’¤™7¾îÓñ PÂ&`róyé™$I3ozçUñ PÂ&`|õ'Ò;2I’f^5|°.«¶‹Ïa€Ò4£ öLïÈ$IŠÔÝûWâs 4€MÀðôw¦÷c’$Eêôãs 4€M@ÿø×§÷c’$EœòÖø( à@Ð;ìwÓû1I’".Ø+>‡J8Ðt÷úåô~L’¤HãëOŽÏa€Ò4 «¶«ëq?½#“$iæMïº&?‡–òhR¿ðnLïÈ$Iš}£n]VmŸÃ%Ì&dróyé™$I‘ºû=+>‡J˜MÈøÊ£Òû1I’"õ?þ_âs „9Є ÏYJïÇ$IŠ4<ãÝñ9 PÂhB'½9½“$)ÒèòÃâs „9Єô|yz?&IR¤ÉMçÆç0@ s  éîó«éý˜$I‘ªîˆÏa€æ@“²j»º÷Ó;2I’"uwÿ¥ü,XÊq IþâßsCz?&IR¤Þá/ŽÏa€ä@4ùæ™éý˜$I‘'¿%>‡JMÐèòÃÒû1I’"¾¸&>‡JMÐð ÿ˜ÞI’i|ýÉñ9 P‚h‚kßÞI’iz÷uñ9 P‚h‚z‡ÿ~z?&IR¦É°.;?:>‹JˆMPwÏÒë1I’bõöN|”š°jpz?&IR¤þq¯‰Ïa€â@“þ ¸ëšô~L’¤HÃ3ߟÃ%Ä&lòµÓÒû1I’"¿td|”š°Ñ%¤÷c’$EšÜza|”š°áïNïÇ$IŠT•ïÄç0@ q  ëÿºô~L’¤XÝ=wŠÏb€à@Ö;øwÒ»1I’bõ?ú‡ñY Phº»=1½“$)Ö೟Å%À¦ªî=éý˜$I‘F—ŸÃ%À¦¦ß¾,½“$)Òä¦sâs 8Ð4Àø+ǧ÷c’$Eª¸3>‡J€M ÏÝ%½“$)Vw§Äg1@™1šœø¦ônL’¤Xý#_ŸÅeÆh wø‹Ó»1I’b N{{|”s i€îšÓ»1I’b.9 >‹ÊŒ9Ð4DÕ½'½“$)Òdýâs Ì˜MCLn»$½“$)Ruÿ·ãs Ì˜MCŒ¯úxz?&IR¬îš'Çg1@™!š†žýônL’¤X½#^ŸÅe†hb°öéݘ$I±§¾->‹Ê 9Ð4DïÐÿÞI’ktñ‡â³ ÌMCtw{b]WUz?&IR¤É7ÏŒÏb€2C4 R=xWz?&IR¤êû·Åç0@™!š™Üzaz?&IR¦ªª»kvŒÏb€2#4 2¾ò¨ôzL’¤X½üÇø,(3â@Ó Ã³ÞŸÞI’kpÊ߯g1@™šœðéݘ$I±FïŸÅeFh¤wðï¤wc’$Åš¬_ŸÅeFhšd×ÿ­®«iz?&IR¤êþÛó³`i6h¦ºÿÛéý˜$I±º{îŸÅehfróyéݘ$I±úû£ø,(3à@Ó0ã/‘ÞI’kxú;㳠̀Mà Ï|Oz7&IR¬ñ‡Çg1@™š†é÷ÚônL’¤X“[/ŠÏb€24 ÓÛÿ9éݘ$I±ªþ÷ë²j»ø<(+̦iVm_×£^z?&IR¬î¾ÏÌÏc€¥•å@Ó@Ó»®IïÆ$IŠÕÿī㳠¬0š_»6½“$)Öð ÿŸÅe…9Ð4ÐðÜ]Ò»1I’b¯þD|”æ@Ó@ƒOÿUz7&IR¬éWÇg1@Ya4 Ô;äéݘ$I¹Æƒºìüèø<(+Ȧ‰V?®®§“ôzL’¤X½ƒ~3?–VŽMCM7ܘÞI’k°ö ñY PVMCMnø\z7&IR¬Ñù»Åg1@YA4 5ºèƒéݘ$I±&_=%>‹Ê r i¨Á)oMïÆ$IŠ5ݰ>>‹Ê r i¨Þ/KïÆ$IÊUMë²Ûâ󠬚†ê®yrz5&IR´Þ῟Çe…8Ð4XõÀéݘ$I±6~Ügz”â@Ó`“›ÏKïÆ$IŠ5ºä€ø,(+ĦÁF—šÞI’kã_THÏb€²Bhløùÿ•ÞI’«êmˆÏb€²Bh¬ÌŸ¦wc’$Eë~ð×â󠬚ë~ðߥ÷b’$Eë÷šø<(+À¦áªþ÷Ó»1I’b Ïúçø,(+À¦á¦ß¾<½“$)ÖøÚµñY PV€Mï:&½“$)Öô»_Ïb€²hn¸î½éݘ$I¹¦“ºìúøø<(Ë̦áúǾ2½“$)ZïðÇç1@Yf4 ×ý௥÷b’$Eœú¶ø<(ËÌfT½ éݘ$I±Fÿöáø,(ËÌfLn½(½“$)Öä– â³ ,3š90¾âðônL’¤XUÿ¾º¬Ú.>Ê2r ™ÃÏýéݘ$IѺû=+>Ê2r ™ýýçô^L’¤hýã_ŸÇe9ÐÌîOIïÅ$IŠ6Ê2r ™Õw¦wc’$Å_R|”eä@3'&7ž•ÞI’kzï7ã³ ,#š91ºdÿônL’¤\Õ´îîöÄø<(ËÄfN N}[z5&IR´Þ/Ïc€²LhæDï#/IïÅ$IŠ68íñy P–‰ͼØí ›>ÞE’¤¶6ºüÐü<XZ4s¤úÞMéݘ$I±&·]ŸÅe™8ÐÌ‘É×?›ÞI’«>X—UÛÇç1@Y4sdôÅ=Ò»1I’¢õx^|”eà@3G'¾)½“$)Ú`íãó ,š9Ò;ä齘$IÑFìŸÇe8ÐÌ“][דQz7&IR¬É7ÏÌÏc€¥mç@3§¿a’$µ±ª|'>‹Ê2p ™3ãkצwc’$EëîóŒø<(ÛÈfÎ Ïþ@z/&IR´þ±¯ŠÏc€²hæLÿ¸×¦÷b’$Ežý/ñy P¶‘ÍœéîûÌô^L’¤hãëNŒÏc€²hæPÕ½7½“$)ÖtÃúø,(ÛÈfMn>?½“$)WUÕÝ5;Æç1@Ù4shtéAéÕ˜$IÑúýÃø<(ÛÀf Nykz/&IR´áçÿW|”mà@3‡z‡ý^z/&IR´ñ•GÇç1@Ù4óhõu=§wc’$ÅšÞyU~,m=š9ÿ“$©•M†uÙå±ñy P¶’Íœ_sBz5&IR´Þ¡/ŠÏc€²•hæÔð¬÷§÷b’$Eœò·ñy P¶’Íœêûªô^L’¤h£KŠÏc€²•hæTwŸ_MïÅ$IŠ6¹õÂø<([ÉfŽUå;éݘ$I±ªÁýuYµ}|”­à@3Ç&7“ÞI’­·ÿsãó lš96ºøC齘$IÑŸú¿ãó lš968ù¿§÷b’$E}qø<([ÁfŽõyaz/&IR´É7ÏŒÏc€²hæÙ.­ëÉ0½“$)VÕ½'?–¶œÍœ›Þ}mz7&IR´î->Êr ™s㯗ދI’­ÿÉÿŸÇe 9Ð̹áº÷¦÷b’$E·k|”-ä@3çúÇüYz/&IR´É ŸÏc€²…hæ\wϧ¦÷b’$E«¼;>Êr YÕýßNïÆ$IŠÖÝçñy P¶€Í˜|ýôô^L’¤hýã^ŸÇe 8Ð,€/G–$©Í ÏÝ9>Êp YýOþ_齘$IÑ&_;->Êp YÝ}=½“$)ÚÆ÷±¥ç1@Ù4 ¢êÞ“ÞI’­»÷¯Äç1@ÙL4 brãÙ齘$IÑúǾ*>Êfr Y£‹>˜Þ‹I’mxöâó l&š18ñ¯Ó{1I’¢¿ú™ø<(›ÉfAôú?Ò{1I’¢U÷ÝŸÇe39Ð,ŠUÛ×ÕðÁônL’¤hÝ=ŸšŸÉK¿˜Í™ÜvIz/&IR´þ1ŸÇe38Ð,Ñe‡¤÷b’$Ežõþø<(›Áf N}[z/&IR´ñu'Æç1@Ù 4 ¤wèHïÅ$IŠV}ï¦ø<(›Áf‘ìòغž Ó»1I’rUUÝÝã)ù™ °ôÈhÌôΫӫ1I’¢õþãø<(¿€Í‚_yTz/&IR´áº÷Åç1@ùhÌðsÿ3½“$)ÚøÚOÅç1@ùhLÿÈ—§÷b’$E›ÞûÍø<(¿€Í‚éîö宦éݘ$I¹ªªî®yr|&”Gà@³€¦÷Ü^I’­ôŸÄç1@y4 hãgïK’Ôæ†_ø§ø<(Àf ×½7½“$)Úøú“âó <šÔ?ê齘$IѪûn‰Ïc€òhPwÍŽ›^,IR›ëîõËñ™ P†Í‚šnXŸÞ‹I’­ì+ãó < š5¾vmz/&IR´á9Kñy P†Í‚®{_z/&IR´É×NÏc€ò0hTÿ¨W¤÷b’$E«î¿=>ÊÃp YPÝ5;ÖuU¥wc’$EëîóŒøL(ÁfM7¬OïÅ$IŠÖ?þuñy P‚Í_»6½“$)Úè¼Õñy P‚Í®{_z/&IR´É ŸÏc€òhXÿ¨W¤÷b’$E«Êwãó <šÖ]³c]WUz7&IR´î¾ÏŒÏd€ò3hÜtÃúô^L’¤hƒþ">ÊÏp Ypãkצ÷b’$E}qø<(?ÃfÁ ×½/½“$)Údýâó ü š×?úÓ{1I’¢U½ uYµ]|&”Ÿà@³àºkv¬ëªJïÆ$IŠÖýгã3 üš˜nXŸÞ‹I’m°öñy P~‚M Œ¯]›Þ‹I’mtÑãó üš®{_z/&IR´ÉÍçÅç1@ù 4-Ð?úÓ{1I’¢Uƒûë²jûøL(?ä@ÓÝ5;ÖuU¥wc’$Eëøïã3 üMKL7¬OïÅ$IŠ68éoâó üMKŒ¯ýTz/&IR´Ñ¥Æç1@ù!š–žù齘$IÑ&·]ŸÇå‡hZ¢ÿ±?JïÅ$IÊ6î×e—ÇÄg2@q i‘ÝžP×ÓIz5&IR´Þa¿›ŸÉK4­2ýÎõ齘$IÑŸýûø<(4í2¾ê˜ô^L’¤hã+ŠÏc€â@Ó.ÃÓߙދI’mz÷µñy PhÚ¥÷‘—¤÷b’$e«¦uw÷'Åg2ÀÔ¦EVïP×ãAz5&IR´þÇþs~&­7u i—é_NïÅ$IŠ6\÷Þø<˜:Ð´ËøŠÃÓ{1I’¢¯ût|LhÚepêÛÒ{1I’¢U÷ÝŸÇSšvéò‚ô^L’¤xݽŸŸÉ@»9дÍΪëaIïÅ$IŠÖ?îµù™ Ômæ@ÓB“Û.NïÅ$IŠ6:o×ø<Úͦ…F—Þ‹I’mòÏc ÝhZhpÒߤ÷b’$E«zê²j»øL:­å@ÓB½ŸŸÞ‹I’¯·ÿsâ3è´–M­Ú®®ú÷¥÷b’$E|ú¿åg2P·•MKMn:'½“$)ÚèâÅç1Ði-š–]°Wz/&IR´É­Åç1Ði-š–|ê/Ó{1I’²ºuÙùÑñ™ tZɦ¥ºûþzz-&IR¼Þ¡/ŠÏd ÓJ4-V=xWz/&IR´ÁioÏc ÓJ4-6¹ás齘$IÑÆ_:2>€N+9дØðÜÓ{1I’¢MïúJ|Vr i±þ±¯LïÅ$IÊ6Ôe·'Äg2Ðišëîñ”º®ªôjL’¤hýþA|&Öq i¹é†õ齘$IцgþC|Öq i¹ñ5ŸLïÅ$IŠ6¾vm|Öq i¹áïNïÅ$IŠVÝwK|Öq i¹Þ/KïÅ$IŠ×Ýûéñ™ tZŦíV?®®'Ãô^L’¤hýã_ŸŸÉ@Ý&4ÔÓ;¾œÞ‹I’môÅ=âóè´Š õèòÃÒ{1I’¢Mn:'>€N«8ÐP>ó?Ò{1I’¢Uƒê²jûøL:­á@CÝûðo¥÷b’$ÅÛ8Ó3è´† ›þÆp5¸?½“$)Úà”¿ÍÏd n 6™Ütnz/&IR´ñ‰Ïc Ó4l2º`¯ô^L’¤hÓ;¯ŽÏc Ó4l28á/Ò{1I’²M'uw·'Æg2Ði6é~ð×Òk1I’âõ?öGñ™ tZÁ†©î¿=½“$)ÚpÝûâóè´‚ ?2ùê)齘$IÑÆ×ŸŸÇ@§hø‘áYÿœÞ‹I’­ºÿÛñy tZÁ†éý'齘$Iñºüwñ™ tž ?ÒÝýIu]MÓ{1I’¢õOøóøL: φŸ2ýî×Ò{1I’¢.Ü;>€ÎÂs á§Œ¯úxz/&IR´ÉÍçÇç1ÐYx4ü”áéïLïÅ$IÊ6,uÙùÑñ™ tš ?¥wøï§×b’$Åëò‚øL: ͆Ÿ¶ËcêzÔKïÅ$IŠ68ííù™ ԋ̆Ÿ3ýÖ¿¥÷b’$Eùcñy tš ?gtéA齘$IѦw_ŸÇ@g¡9Ððs'½9½“$)[5­»»ÿR|&…å@ÃÏéøüôZL’¤xý£^ŸÉ@ga9ÐðóVmWWÝ{Ó{1I’¢ ÏúçüLêEå@ÃCš¬_—Þ‹I’mòµÓâóè,,ÒèüÝÓ{1I’¢UÞŸÇ@ga9ÐðúÇ¿.½“$)^w¿ßˆÏd ³hxHݽž–Þ‰I’opâ_Çg2ÐYH4<¬ê¾[Ó{1I’¢.=(>€ÎBr áa¯;1½“$)Úôö+âóè,$ÖpÝ{Ó{1I’²MFuÙõññ™ tŽ «ÿ±?J¯Å$IŠ×ÿèÄg2ÐY84<¼]_×Óqz/&IR´ÿ¢4>“€zÑ8Ððˆ¦w]“Þ‹I’müÕÏÄç1ÐY84<¢ñ—?šÞ‹I’­zàÎø<: džG48í齘$Iñºû=+>“€ÎBq áõ}Qz'&IR¼Á§ÿ*>“€ÎBq á‘íü¨º–ô^L’¤h£KÌÏd ^$4üB“[/LïÅ$IŠ6ýöåñy tŠ ¿Ðèâ¥÷b’$e› ë²úqñ™ t† ¿Ð`íÓk1I’âõŽüOñ™ t† ¿Pw¿ßHïÄ$IŠ7<ó=ñ™ t† ›¥zðîô^L’¤hãëOŠÏc ³0hØ,“¯ŸžÞ‹I’­zàŽø<: ÆÍ2<û齘$Iñºû>3>“€ÎBp a³ôù³ôNL’¤xƒµoŒÏd ³hØ,Ý5;Öu5MïÅ$IŠ6ºdÿøL: Á†Í6ýî×Ó{1I’¢M¿õoñy t‚ ›m|ÕÇÓ{1I’²uYý¸øL:sφÍ6<ý鵘$IñzG¼,>“€ÎÜs a³õû½ôNL’¤xÃ3ÿ!>“€ÎÜs aóíò˜ºõÒ{1I’¢¯;1?“€zÞ9аE&·]’Þ‹I’­zàŽø<:sφ-2ºä€ô^L’¤xÝ}ŸŸÉ@g®9аEŸþoé˜$IñŸþ«øL:s͆-ÒýгÓ;1I’â.=(>“€Î\s a‹Uå;齘$IѦw|9>€Î\s a‹Mnø|z/&IR¶é¸îîöÄøL:sˆ-6>“€Î\r a«Œ¯þDz/&IR¼Þ‡ÿÏøL:sɆ­2üÜÿLïÄ$IŠ78ííñ™ tæ’ [¥wø‹Ó;1I’â¯:&>“€Î\r aëìòغ÷Ó{1I’¢Mïýf~&õ“€ÎÜq a«.=(½“$)^ÿ“ÿ5>“€ÎÜq a« N|Sz'&IR¼Ñ…ûÄg2Й;4lµÞþÏMïÄ$IŠ7¹íâøL:sdž­·j»ºêÞ“Þ‹I’”m<¨Ëêòs¨ç‰ ÛdòM¯Å$IŠ×;âeñ™ tæŠ Ûdxî.é˜$Iñ†g¾'>“€Î\q a›ô}Uz'&IR¼ñW?ŸÉ@g®8аMº{<¥®«*½“$)ZõàÝñ™ tæŠ Ûlºa}z/&IR¼ÞþωÏd 37hØf㯟މI’opò[â3èÌ ¶ÙðŒw¥wb’$Å_qx|&¹á@Ã6ë}ä?¦wb’$Å›Þ}m|&¹á@ö[½C]O†é½˜$IÙªiÝ]³c~.õ“€Î\p aYô|~z'&IR¾ñ`Ó»ÙÒsè4ž ËcÕvuÕ½7½“$)^ïÈÿ”ŸË@Ýt4,›Éúué˜$Iñ†_øÇøL:ç@ò·kz'&IR¼É×OÏd Óx4,›þq¯IïÄ$IŠWõ¾W—UÛÇç2Ði4–Mw¯_NïÄ$IjD½ƒ;>—€N£9а¬ªïݔމI’oðÙ¿Ïd Óh4,«ñ5'¤wb’$Å司L:æ@òžñîôNL’¤xÕ}·Æg2Ði4–U¥wb’$5¢î¾ÏŒÏe ÓX4,¯Õ;ÔõxÞ‰I’opâ_çç2P7• Ënzû—Ò;1I’â.?4>“€Nc9аìF—’Þ‰I’oz×5ñ™ tˆe78ù-é˜$IùªiÝÝã)ñ¹ tɆe×;ðù镘$I¨ÿ‰WÇç2Ði$–ߪíêª{oz'&IR¼Ñ{æç2P7‘ +b²~]z'&IR¼É­Æg2Ði$VÄè¼]Ó;1I’òuYý¸ø\:ã@Êè÷šôJL’¤FÔ?òåñ¹ tdžÑÝs§º®ªôNL’¤xóÞŸË@§qhX1Õ÷nJïÄ$IŠ7¹ásñ™ tdž3¾æ„ôNL’¤xUÿ¾º¬Ú>>—€N£8аb†g¼;½“$©õya|.Fq aÅôŽxiz&IR#žñ®ø\:â@ÃÊY½C]é˜$IñÆ×Ÿ”ŸË@Ý$4¬¨éíW¤wb’$Å«Êwë²j»ø\:á@Ê]vHz'&IR#êô›ñ¹ tÆ58ù-é}˜$IhðÙ¿‹Ïe Ó4¬¨ÞÏOïÃ$IjDãk>ŸË@§1hXY«¶««î½é˜$IñªûoÏÏe n VÜdýºôNL’¤FÔýгãsè4‚ +ntÞ®é}˜$Ihð™ÿŸË@§hXqýã^“Þ‡I’ÔˆÆWŸË@§hXqÝ=wªëªJïÄ$IŠ7Ýpc|.Fp a&ªïݔމI’Ôˆºû>3>—€Nœ 31¾æ„ô>L’¤F48ñ¯ãsèÄ9Ð0Ã3ÞÞ‡I’ÔˆÆWŸË@'Ά™èñÒô>L’¤F´ñ›¯ô\:q4ÌÆêêz?þ{TZ†ŒUÛÕU÷Þô³F’¤F4½ûÚülhÅ{c6¤l|Óo_ÿ}+-á@CÌdýºô³F’¤fTUuw¯§Åg3À<ëîþ¤¿7æêcëê¾[Ò?íÍeÓ»¾ÿ½,-á@CÌè¼]ÓÏI’ÓàSŸÍóýÞ˜iúG»…hzÏ7ò¿¿Kíà@CLÿ¯N?k$IjL£Ë‰Ïf€ùyoL?ýcÜÂV}ÿ¶øïwi bº{î´é#]$IR½éo{¥g3@xoL¶ª|7þ5PZ†¨é†ÓÏI’šóš½ŸŸÍ³Ô]³cÝ?æOëáÙÿRO¾vZ]=pGú§³ÖW Œ]”–p !j|Í'ÓÏI’Ó`íã³`Åìüè¼7æä·Ôã/á½1Mm<È­,µƒ QÃ3Þ~ÜH’Ô˜F—ŸÍËùQeƒµoðÞ˜yk:Ží”–p !ªwÄKÓI’Óô»_Ïf€eyoL÷ÞôXÚÚª*þõTZ†¬Õ«ëÉ0ýÈ‘$©1mü¡&>ŸAw÷_ªûGÿq=<ëýõä«§ÔÕý·§”Ò2WVmÿ:+-à@CÜôö+ÒÏI’ÓàÄ7Åg3ÀC½7fãG•Mïø²÷Æ´ ¿ïñ¯½¥Åç@CÜ貃ÓÏI’ÓøÊ£â³h¯Ÿ{ǫ—þ1IÊêâ_‹¥hˆœôæôóF’¤ÆT}ÿ¶ølÚúÞ˜{Ò?©!•]ÿú,-à@C\ï€ç¥Ÿ7’$5ªÞþÏÏg`±tw{bÝ?òåõðŒwÕã«­§ß¹>ý£\w÷'Å¿fK 8зj»ºêÞ›~æH’Ô˜Ÿý»ü|ë½1ÓIúGÍQÝ5OÎ/->a²~]ú™#IRc_wb|6ó÷Qe£ ÷öÞ-KÝ=wŠ]—p ¡Fçíš~æH’Ô˜6þËÒ²jûø|šgã¿lèó§?~oLùnúG-`ݽŸÿZ/-à@C#ô?ñêô3G’¤FÕ;ôEñù „íö„ŸoLU¥\Q êîó«ù¯ÿ¥Åç@C#lü's†‹$I?nxæ{âóȽ7fÓG•M†éMÔÒºû>3ÿgbiñ9ÐÐÓ 7¦Ÿ;’$5¦É7þ5>›€•o̦*»ñìºuÓ?†H?ª»ßoÄÿŒ”p ¡1Æ×|2ýÜ‘$©9 K]vyl|>Û®»fÇ|TÙþé‡ïùNú'éëíÿœøŸ›Ò44ÆðŒw§Ÿ;’$5ªþGÿ >Ÿ€-ä½1Z€z>?ÿgiiñ9Ðн#^š~îH’Ô¨6~ÔAz>`çGyoŒ²ÞA¿™ÿóµ´øhhŽÕ;Ôõx~öH’Ô˜&·^˜ŸÏÀxoŒÚRïàߎÿy+-à@C£Lo¿"ýì‘$©9M†uw·'Æç3´‘÷ƨÍõyaüÏ`ietÙÁég$Iªì+ãóÞ.©{‡ýž÷ÆH?¬wØïæÿ\.->epÒ›ÓÏI’Õèâýâóî½1‡¼ œú¶zü¥#êéW×õtœþÖ_jT½¼$ÿguiñ9ÐÐ(½ž—~öH’Ô¨¦w^ŸÏ°0ïÙøQe½ï¥¿Í—_ïðßÿÙ--à@C³¬Ú®®zÒÏI’šS5­»{>5?£`t÷ÜiÓÇÏݹžÜð9ï‘¶2qÖ™ gòM?$IjTƒµoˆÏghä{c>ü[õà´wxoŒ´ÌõyaþÏøÒâs ¡q6þ I’ôãÆW|$>Ÿ þÞ˜ƒ»œòÖz|Åá›> Ø{c¤•«wðïäÿÜ/->§ÌŸ¥Ÿ?’$5ªê¾[âófÉ{c¤lÿuZú9PZÀ†ÆéîþK›>o_’$ý¸ÞþÏÏhX©]PÿÈ—×Ã3ÞU¯;±®¼+ýí·Ôúzþûø³¡´€ ´é3C%IÒžþÎø|€•yoŒ¿¨+5­ÞÏË?/–Ÿ 4þòÇÒÏ I’Õäk§Æç3l©î‡ž]N~K=ºôÀzrëEu=î§¿µ–´mü³›~~”p ¡‘§þ?ég$IªÜ¿éo¦g4lþ{c6¤¿–´•u÷{Vü™RZÀ†FêüÛég$Ikãçr§g4lÔÝýI?~oÌÕÇÖÕ÷nN»,iëîûÌøs¦´€ Í´jûºêß—~I’Ô¨Fç­ÎÏhÚgçGÿà½1'¿¥éï‘ZPwŸ_Í?{–Ÿ 5¹ñ¬ôsH’¤F5ýÖ¥ñù @;>ªl°ö Þ#µ¸îÞO?‹J 8ÐÐX£ówK?‡$IjVÓIÝÝã)ñ À¿7¦{oú»^I ¨»×/ÇŸO¥hh¬þ'^~I’Ô¸'üE|F°(ï¹)ýí­¤†æ/vf†ÆÚø¨«*ý,’$©Q¯8<>£˜Þ#iê®yrþ9¶´øhh´é=ßH?‹$IjTÕ}·Äç3sðÞ˜Q/ý­«¤9n㿸K?×J 8ÐÐhã«>ž~I’Ô¸zû?7>£hÒ{cîI‹*iÁ*»>>þ¬+-à@C£ >û÷ég‘$Ikxú;ã3€ÙèîöÄŸzo̦*“¤®¬~\üùWZÀ†Fëú¢ô³H’¤Æ5ùÚ©ñ Àʾ7fãG•Mïø²÷ÆHŠTvyLþ™¸´øhh¶UWÃÓÏ#I’U5xÀ7Ë ôQe£ ÷öÞIª¬Ú>þŒ,-à@CãMn>?ý<’$©qõ?úñ Àæëîý+uÿø×Õ£ów¯'ë¿PW½ï¥¿¥”¤‡®ªê²j»øs³´€ 7º`Ïô#I’¤Æ5:ou|Fðм7FÒ\7êÅŸ£¥%hh¼þñ¯O?’$Ij\Óo]ŸÑ<Ì{c¦“ô·‹’´Õmü~ñgëR;8ÐÐxݽž–~&I’Ô¼¦“º»ÇSâs mzû?·œø¦MǘÉm—xoŒ¤…«zàÎø³¶´ÄÿÏÞ}G[v×ÿ?“$Tˆ(EEADQ}@PÁQ”Š,ÀãÃ3wúL2i¤‡RIï i¤B ¤‡Ò{Ïd2{Ÿ~ö÷·î#!ÉdÊ9÷³ËëµÖû/×Òæ~?ßÙŸ{ÎYШ ß}.@étúëð-I’Tçò%[¥ÎAïN½sç§á§¤"{8ú 0qÓÏb£Ï߬!YШ ®9<ú\€Ò\yPøŒ–$IªM‹¶xæ{cŠ"úÊ0릗ágòÜfdA£JÔûÆ¿GŸKP:ŪR65'|NK’$U®y>í½1Ã;/NiØ‹¾Þ”Âè¾+âÏé¹ÍÈ‚F•¨½ÏoGŸKPJí½~3|NK’$•½|ùËSç°÷ÿð«Ên=;¥~}(­á]—„ŸÛYC² Q5š¿±Ë<‹Þ7ÿoüœ–$I*Qù’-øUegmû£÷Æ<}e¨”ám焟åYC² Qešù¸1ð4Ã;/ ŸÑ’$IaÍß8µ÷~³÷ÆŒÑð¦oÄŸïs›‘*Sÿâ£Ï&(ŸÑ åK¶ ŸÓ’$IÏ{cfÅàúcãÏü¹ÍÈ‚F•©{䇢Ï&(¥é=§%I’&úÞ˜é¯*묈¾v4ÂàêÃÂg@Ö,hT™òåÛDŸMPJƒï>§%I’ÆúÞ˜UF_±kð½ýÃçBÖ,hT©Š'îŠ>Ÿ tŠ'ïOÙÔœð9-I’´Fyo @©õ¿½{ü¬˜ÛŒ,hT©×}>@)µ÷|cøœ–$IZ£÷Æ ºÑW'V£ññócn3² Q¥êþ…èó J©wÖ†ÏiI’¤g¼7¦ýxô5 €µÔ?Qø<É’*U{ß·FŸOPJÃÛÏŸÓ’$©Yå‹_üÃ÷ÆLUÙuÇxo @MôÎþrøŒÉ’ªÕ‚M}žÍ°?órÝðY-I’êûÞ˜é¯*;é_¼7 æzg|1~îÌmF4ª\£»¿}F@)uÿ‹ð9-I’êQ¾ók¼7 ¡z§|&|e É‚F•«ÿ­¯DŸQPJƒË÷ ŸÓ’$©ïy,úZ@ î Ÿ ŸMYC² Qåêý‘è3 J©xâîð9-I’Ê]¾d«Ô9ø=©wÎÜ4¼ñäT¬z ú @Étù›ðy•5$ U®|ÇŸ>£ ´Ú»ÿZø¬–$I%iÁ¦©½ïï¥ÞiŸKƒ«K£GnöÞž×ô§*ÃgØÜfdA£J6ýÂÀ3õÎÚ6|NK’¤²¼7¦}5 ‚:û¿=|¦e É‚F•lpí‘Ñç”Òð΋Âç´$Iš|ÞÀ¤´÷üð9—5$ U²Þ©Ÿ>§ œFÔ/{Iø¬–$Iã+_ü¢ÔÙïm?üª²«IÅã·Gß8¨±|çW‡Ï¾¬!YШ’µ÷zSô9¥Õ=öcá³Z’$­có6JíÝ_?óUeƒË÷M£‡®O©E_/h|éÖñópn3² Q5›·a*º+£Ï*(¥Á5GÄÏjI’´Æ_UÖ=êÃÞ@idó7ŸYC² QeÞzvôY¥Ttžp¡–$© ïɾ6ÀÓõóðy™5( U¶þy ¢+(­Îï ŸÕ’$5¹|Ñ ŸöÞ˜™¯*€’+V=>C³eA£ÊÖ9ø=Ñç”VÿâÃgµ$IM|oÌôW•îûž÷ÆPI£GnŠŸ«s›“*[¾øÅ)†Ñg”ÒèáÃgµ$Iu¯{ü'ÒèžËRt£G?ŒÅèÞËÃçkÖ ,hTéF\}f@iµ¿òËá³Z’¤:7¸öÈèqc5¼íœðùš5( UºþwöŠ>³ ´z§>|VK’Tç†?8#zÜÀX ¾|ø|Í”*]÷˜¿>³ ´†·ž>«%Iªs£»¿=î`¬W>_³eA£J—ïôÊè3 ÊkØOù’-Ãçµ$IumúEÊP'ýKw Ÿ¯Yƒ² Qå+VÞ}n@iuü«ðY-IR]+V==ê`¬úç/Ÿ¯Yƒ² Qå\wtô¹¥åãé’$M®4èFz«Þ™_ Ÿ¯Yƒ² Qåëö¹ès J«ÈNÙÔáóZ’¤Úµpóè1c×=ùÓñ3vns² QåkïóÛÑç”Z{ßß Ÿ×’$Õ­|û—Ex»î1>c³eA£ê7o£TôVEŸ]PZý –ÆÏkI’jV{·×Ex»Î¡>c³eA£Z4¼íÜè³ JkúÂ=«%Iª[íý~?zÄÀØuöÿƒð›5( Õ¢þù‹£Ï.(µö®¯ Ÿ×’$Õ©Îá=Þ`ìÚ»ýjøŒÍ”jQç?‰>» Ôzg~)|^K’T§º'ýsôx€±Ë—½4|Æf Ê‚Fµ(_üâ”FÃèó Jkx×%áóZ’¤:Õ;ûËÑãÆk4LÙ¼ ÃglÖ ,hT›F^}„@y£”oÿ²ðy-IR]êë+ÑÓƪÈŸ¯Yò Qm|wŸè3 J­{â§Âçµ$IuipÍáÑ£Æjôð áó5kX4ªMÝcÿ.ú €RÞtjø¼–$©. oýfôh€±ÞyQø|Í–jS¾ó«£Ï0(·A7å‹_>³%IªC£û¯Šžì0VÃïŸ>_³†eA£ZU¬¼7ú€Rëù¡ðy-IRòïOêfpù¾áó5kX4ªUƒë>Ç ÔW>¯%IªCÓŸL€:é_¸,|¾f Ë‚Fµªwú¢Ï1(µ¢³"eó7ŸÙ’$U¹|éÖÑ#ÆnúÙjôŒÍ–jUû«¿}Ž@éu|WøÌ–$©Êµ÷øõèqc×=îãá36kX4ªWó7N©ŸGŸePjýoï?³%IªpCþ$zœÀØuùÓð›5, Õ®áDŸePjÅw¥ljNøÌ–$©ªuOü§èqc×Þç-á36kX4ª]ý –FŸePzí½+|fK’TÕzç΋å0vùN¯ Ÿ±Yò QíêúgÑg”^ÿüEá3[’¤ª6øî>Ñ£Æ._ü¢ð›5, Õ®|ÉV)£èó JmôÈMá3[’¤ª6¼éÔèQã5è„Ï׬YШ–º>úH€Òkïþúð™-IRÝeô€±*VÞ>_³fA£Z6¸|ßè3 Joúûó£g¶$IU¬Xõ`ô€±ÝUø|͘jY÷¸¿>Ó ôF\>³%Iª\ó7ñµÚÔÎðÖ³ãgìÜæeA£Z–ïüêè3 *¡½ëkÃç¶$IUª½Ë/Eo»Á5G„ÏØ¬YШ¶OÜ}®@éõÎþrøÌ–$©Juúãèñ c׿xÇð›50 Õ¶ÁµGFŸkPz£û®ŸÙ’$U©îIÿ=¾`ìz§!|Æf Ì‚Fµ­wÊ¿FŸkP í]~1|nK’T•ú.‹Ý0vÝ£?>c³fA£ÚÖÞã ÑçTBïÌ/…ÏmI’ªÒôwô@Ýtöÿƒð›50 Õ·©9©È>Û ôF÷\?·%IªH£»¿=º`ìò_>c³fA£Z7¼ñäè³ Ê¯(R¾Ó+Ãç¶$IU¨Xõ`ô䀱Ën>c³fA£Z×;óÿDŸmP ½Ó?>·%I*} 7ŸùŨ“éo! Ÿ±s›™j]û«¿}¾@% ï¼8|nK’TöÚ»½.zdÀؼ6|Æf Í‚FõnÞF©è­Š>ã üŠQÊ—o?»%I*qÃÞ=±`솷œ>c³†fA£Ú7¼õìè3*¡wêgÃç¶$IeÎ×hPGƒ+ Ÿ±YC³ Qíë;/úŒ€Jð5g’$­¾Á÷ö×0výó‡Ïج¡YШöu¾öGÑgTCQ¤|§W…ÏnI’ÊÚô/3@ÝôNùLøŒÍšêßÂÍSö¢Ï9¨„Þ™_ŠŸÝ’$•´"{8zTÀØu¾þ¿ÃglÖÐ,hÔˆ†w}+úœ€JÝ÷½ð¹-IRË—n=¦`"ÚûüvøœÍšQÿ¢í£Ï9¨Œö®¯ ŸÝ’$•­ö~¿=¢`"òåÛ„ÏÙ¬¡YШu{_ô9•Ñ;g*|vK’T¶º'|2zDÀø†)›·aøœÍšQ¾dË™Ãx~£‡o ŸÝ’$•-ßÌ@+ï Ÿ±Yƒ³ QcÝUôy•ÑÞã×Ãg·$IejxÃIÑãÆntïåá36kp4jLýKw>ï 2ú, ŸÝ’$•©âñÛ¢Ç3ŒÝô/ DÏØ¬ÁYШ1uŽø`ôy•1ý*›š>¿%I*Cùâ¥TÑãÆ®énás6kp4jLùÒ­S*FÑgTF{Ÿ·„ÏoI’ÊPg¿·Ee˜ˆÞé_Ÿ³Yƒ³ Q£=xmô™•Ñ¿d§ðÙ-IRêò™è± Ñ9ü/ÂçlÖà,hÔ¨úßÞ=úÌ€Ê(ž¼/eS„ÏoI’¢|wŸè± ÑÞó7ÂçlÖà,hÔ¨ºGüeô™•Ò9àáó[’¤è†w]=’`"ò%[†ÏÙ¬ÁYШQåË^êÅŽ°—ï>¿%I mjN*º+£G2Œ]Ñ~<~Î6¼‘šÖèÁë¢Ï>¨Œ¢óDÊn>¿%IŠ*ßù5Ñã&btßás¶é,hÔ´ú—í}ö@¥tü«ðù-IRT#>=Š`"×>g›ÞÈ‚FM«{Ô‡£Ï>¨”á'‡ÏoI’¢êŸ¿(zÀDô/Ù)|Î6½‘šV¾ÝO{ ¬aæ=nÑ3\’¤ˆ†·œ=‰`"z§~6|Î6½‘šüX3½Sÿ-|~K’4ëMÍIEþhô€‰èö¾øYÛðF4jbýïì}þ@¥Œî¹,|~K’4Ûµ¿òËÑ#&¦½ûëÃgmÓYШ‰uúëèó*§½ë¯„ÏpI’f³î±=~`b²E[„ÏÚ¦7²!} IDAT QË·ûï¡€µ4ý’äè.IÒlÖ¿t·èñ Qd…ÏYµ,hÔÜFß}@¥+îœù.þè.IÒl5ºûÛÑã&Â×X·J‘Ûà»ûDŸƒP9ýß>Ã%Iš•æoœR¿=z`"×?k•,hÔØºG4ú€Ê\¾_ø —$i6jïóÛÑc&¦ává³V- 5·|û—y ¬¥¢³"e 6 Ÿã’$MºÞ©ÿ=v`bº':|ÖªeA£fç=4°ö¦?…=Ã%IštÓ_ýuÕ9ø½á³V- 5»þe{FŸ…P9Ã[¿>Ã%IštÅ“÷E\˜˜|çW‡ÏZµ,hÔìºG~(ú,€ê)Š”ïüšð9.IÒ¤jïúÚèi “3è¦lÞ†áóV- 5»|éÖ)£è#*§wîüð9.IÒ¤êžø©èQ 3zðÚðY«ÖL4j|£û¯Œ> rŠ'îöW’¤Ú6¸êèQ 3¸þØðY«ÖL4j|ýKvŠ> ’:ýqø—$i+01ý –„ÏZµf² Qãëö¾è3*ipí‘ás\’¤q—ïðŠè Õ=îãáóV­™,hÔøòÅ/JiØ> z†½”/{iø,—$iœuý»è Õþêï„Ï[µf² ‘¦î¾4ú\€JêúÙð9.IÒ8\¾_ôx€‰Ê—l>o՚ɂFš~ÍK¢ÏE¨¤ÑׄÏqI’ÆYñøíÑã&¦Xõ@ø¬Uë©,h¤é÷Ðø®è³*«½×›Âg¹$I㨽Ûë¢Ç*LÔðŽ Âç­ZOeA#M·`³”úíèó*©Ùñ³\’¤1Ô;ýóÑc&jðݯ†Ï[µžÊ‚FúQÃÛÏ‹> ’Šöã)[ø‚ðY.IÒú6üÁÑc&ªwÆÃç­ZOeA#ý¨Þ9SÑç#TV÷„O†ÏrI’Öÿ›òè‘ Õ9ôÏâg®ÒgA#ý¨Î~o‹> ²F÷|'|–K’´>u~oô8€‰kïò‹á3W­§² ‘þ»y¥¢ûdô •ÕÞûÍñó\’¤u¬ÿ­]¢G)LÖ°7ó 4zæªõT4Ò5¼ùôèc*kpù~á³\’¤õ}@u5zèúðy«Ö³Þ?,h¤é÷Мù¢ÏI¨®^–ò%[†ÏsI’Ö¶|Ç_ˆž¢0qÃïŸ>sÕzZ4Ò5ýÕ,ÀºëúÙðy.IÒÚ6=¿ îú. Ÿ¹j=- éÇ›Ú ù£Ñg%T–ÌK’ªØð¶s£G(L\÷øO„Ï\µž–ô ®;&ú¬€Jëìÿöðy.IÒš–/{IJ£Aôø€‰kïõ¦ð¹«ÖÓ² ‘~¢îIÿ}V@¥ ®9<|žK’´¦uÿ‡èÑ “7¤lÁfásW­§eA#ýDùN¯Œ>. Ú†½”o÷3á3]’¤5ixãÉÑ“&nz=sÕzF4Ò³4zì–è3*­÷Íÿ Ÿç’$=o‹¶H©ßŽ›0qƒëŽŽŸ»J?™ô, ¾»Oô™ •VÓ%IZ]Ý#?=2`VôÎþásW­gdA#=KÝ#þ2úÌ€ÊëùWá3]’¤Õ5¸úëÑãfEçë>wÕzF4Ò³”/Ù*¥Ñ0úÜ€JÞyqøL—$é9›¿I*ÚGK˜ùÎ¯ŽŸ½J?™ôî¹,úÜ€Êkïó–ð™.IÒ³Õ9üÑcfEÑ]™²©9á³W­gdA#=GýóGŸPyƒ« Ÿé’$=[ƒëމ“0+†w]>wÕzÖ,h¤ç¨sÀ;£ÏN¨¾a/åÛ¿,|®K’ôãå‹_œR¿=%`Vô¿³wøìUëY³ ‘V÷}ĽUÑç'T^ÿ¼ñs]’¤«{Â?FG˜5½S>>{ÕzÖ,h¤Õ4¼ù´èó*¯ÈNÙ‚ÍÂçº$IÿÝð¶s£Ç#ÌšÎ~o Ÿ½j=k4Òjêþùèój¡{ü'Âçº$IÓåË·Ii4Œ0;Š"åK¶ Ÿ¿j=k4ÒjjïþkÑG(ÔÂèþ+Ãçº$IÓõÎüRôX€YS¬¸#|öªõœYÐH«kjN*ž¼/ú€ZèðÎøÙ.Ij|£®Ž‰0k†7>{Õzî{‰´úW}Ž@-L¿Û-z®K’š]{Ï7FC˜Uý –†Ï_µž3 éyê÷ñèsj£½×o†ÏvIRsë_¶gô(€YÕ=ú#áóW­çÌ‚Fzžòå/Ÿy™°þW>Û%I má RÑY= `Vµw}ü Vz®,h¤5ÈwÀ˜ û)ßñÂg»$©yuOødô€ÙÕÏS6o£ð¬ÖsfA#­Aý‹¶>N 6ú—î>Û%IÍktÏeÑ#fÕð®KÂç¯Z«¿ŸXÐHÏ_çk}ž@}ôó”/{iø|—$5§öžoŒž~0ëúßúJø VkµYÐHkÒüSÑ]}¦@môÎ™ŠŸï’¤ÆÔÿÎÞÑ£f]÷Ø…Ï`µV›´† o8)úL€Ú(òGS¶h‹ðù.Ij@‹¶ð w4R{×_‰ŸÃJ«Ë‚FZÃz§|&úL€Zéúoáó]’Tÿº'~*zäÀ¬+:O¤ljƒð9¬Öj³ ‘Ö°|çWGŸ«P+Åã·Ï|hôŒ—$Õ»ÑýWF<˜uÃÛÏŸÁj=ÿ=Å‚FZóFÜ}¶@­tOødø|—$Õ·ÎAïŽu¢Ñòð9¬ÖófA#­EýKw‹>[ VFÝš²y…ÏxIR=þàŒèQ!ºG}8|«õ¼YÐHkQçÐ?‹>[ vºÇ"|ÆK’êW{7¤TÑcBL¿®!z«õ¼YÐHkÓÂÍSê·£ÏW¨Ÿ¢‘$M¢ÁF8Q´KÙÔœðY¬ÖófA#­eÃ[Ί>c vºÇ}<|ÆK’êS¾ýϦ4èD71ýŸÑ³X­5Ê‚FZËzg|1úŒ€Ú=v‹OÑH’ÆVÿ‚¥Ñ£ ÂôÏ_>‹ÕZ£,h¤µ¬½û¯EŸ±PKÝc?>ç%I5há R‘?=Ö LçðÄÏc¥5É‚FZ‡Š'îŠ>g vFߘ²y†ÏyIRµë}ãߣG„ÊwxEøë%IÕ¬wêg£G„Þxrøë%IlÁf>=@ãõÎ™ŠŸÉJkš´Ž ï¸0ú¼€ú~$Ñá³^’T­z§}.z„@¸ÎÁï ŸÉj­q4Ò:Ö;ë?£Ï[¨­ÞÙ_Ÿõ’¤ª}zæÞèñ±ŠQÊ—l?—•Ö4 ikïþkÑG.ÔVÑy"åË^>ï%IÕ¨wúç£G„=puøLVk­² ‘Ö£Ñc·FŸ»P[ý‹–‡ÏzIRE>=óä}Ñc Âõ/Û3~.+­M4Òz4}è2è¤|ÇŸŸ÷’¤r×;ã‹Ñ J¡{Ìß„ÏeµÖ* i=êò§Ñç.ÔÚàòýÂç½$©¼åK¶JEþHô¸€RÈwü…ðÙ¬ÖZeA#­O 6K©ŸGŸ½P_£ÁÌ{ßÂg¾$©”õ/Þ!zR@)+ï ŸËj­u4Òz6¼ñ”èójmxÛ9áó^’T¾ò_Ò =¦ ×>›ÕZë,h¤õ¬{ò§£Ï_¨½Îaï Ÿù’¤r5¸î˜èñ¥Ñ;õ³á³Y­µÎ‚FZÏòåÛ¤TÑg0ÔÚè‘›R6ãð¹/I*Gí}ßêßaðcÚ{½)|>«µÖYÐHchôÀÕÑg0Ô^ï´Ï…Ï|IR šš“†w}+z,@i½U)›·QüŒVZÛ,h¤1Ô¿`Iô9 µW´Où²—„Ï}IRlÝc?=’ T†·~3|>«µNYÐHãúx=0qýKw Ÿû’¤Àl–ŠwF#(•Þ¹óãg´ÒºdA#£y¦"$ú,€úöS{·×ÅÏ~IRHÓ €§ëôÇá3Z­uÊ‚FSƒ«>‹ †w\0óþèÙ/IšÝÚ_ùå”è1å2¦|ñ‹Âç´Zë”4¦ºG$ú8€ÆèýÑðÙ/IšÅ¦æ¤ámçD(Ñ}WÄÏi¥uÍ‚FSù’-g¾v˜¼bÕ)_²Uøü—$ÍNÝãÿ!zô@)õ¿½{øœVk³ ‘ÆØôW®³Ã?D$©åK·NEöpôØ€RšþVŸèY­Ö:gA#±Þ™_Š>“ 9FÃÔÞûÍáó_’4ÙW=q ´òåÛ„ÏjµÖ9 iŒµwù¥è3etïå)›·aø@’4™:¼#¥¢ˆ7PJ£‡oŸÕj­W4Ò˜=|côÙ Ò;å3áó_’4æo2óà xvýËöŒŸ×Jë“4æúm}6@£>Ö/I5¬á²è¥Ö=â/ÃçµZë•4æÚû¾5úl€ÆÞôð;€$i|uö{Û̻ƀçPŒR¾ì¥á3[­õÊ‚FwS¤bÕÑG44N÷ØÅß$Iëߢ-Òè±[¢Ç ”Úè¾ïÅÏl¥õÍ‚Fš@ƒïí}F@ãù£)ßþgÃï’¤õkpÅ×¢G ”^ÿâÂg¶Zë4:‡½?úŒ€FÞxrø=@’´îuÿ@ô(€Jèò'ás[­õ΂FšD 6ME÷Éès©{Ô‡ãï’¤µ.ßî§S±êÁè1å7ì§|Ñ Ãg·Zë4¡†ß?!ú¨€F*òGR¾ÝÏ„ß$Ik×ð¦S£GTÂð΋Ãç¶ZcÉ‚FšPÝã?}V@c ®?6ü. IZóº'ýKôè€Ê蟷0|v«5–,h¤ •/Ý:¥Ñ ú¼€ÆêžðÉðû€$éùkïùÆ”úyôØ€ÊèðÎðù­ÖX² ‘&ØðŽ ¢Ïkh®^–Ú»¾6ü> IzîòÅ/J£GnŠžPý|æý×Ñ3\­±dA#M°Þé_ˆ>² ÑF÷^ž²ù‡ß $IÏÒÔœ4øþñÑ£*exËYñ3\i\YÐH,ßéUÑg64^ÿüEáwIÒ3ëµmôˆ€Ê™žŸÑ3\­±eA#M¸Ñƒ×EŸÛÐlÅ(u¾ö‡áwIÒÿ4}.{g'¬½ö>o Ÿãj- iÂõ/X}n@ã+îLùÒŸ ¿H’Z)_þòT¬z z4@å)›·aø,WklYÐHnz« ÄÞxÊÌû¢ï’Ôèæm”†w^= ’†7œ?˕ƙ4馿¤bå½Ñç7àûš%)¼þ¥»E¨¬îÉŸŸåj5 iê_¶gôù L Sç w‡ß $©‰uOú—è)•–ïôÊðy®ÖX³ ‘f¡Î×þ(úü~¤XõàÌû¢ï’Ô¤:‡üiJ£Aô€Ê=x]øÏ€7è¤öW7þž Iukjƒ4¼á¤èSjaðýããg»Ò$² ‘f±Á•EŸçÀO˜þê|ù6á÷IªSýËöŒ>Þ 6º'~*|¶«5‘,h¤Y¬sØû£ÏsàYŒî»bæ«x¢ï ’T‡ú,>Ö >ŠbænÑó]­‰dA#Íf 6ùÎH |Wš²©9ñ÷Iªp½³¶>ΠVF\>ßÕšX4Ò,7¸æðèsxýó„ß$©ªõNù×ècj§á²ð¯ÖIJ ‘f¹î}®«Ñ;å3á÷IªZÝã>žR1Š> v:û¿=|Ϋ5±,h¤Ùná RêeÑg;ð\†ýÔ9ø½ñwIªH#>˜Òh}z@í'R6ãðY¯ÖIJ ‘\lôù¬FÑ}2µ÷zSøA’Ê^çà÷¤4èFÛPKƒëŽŸõjM4 ) îÑ>߀çQ>ïÕšh4R@ù¢ú‡ TÀè±[R¾ýËÂï’T¶:‡½Ï¿i`’Š"åË· ŸùjM4 )¨á'GóÀÝUÊ—l~w¤²Ô=æofÞ×LÎè¾+Âg¾ZÏ‚F ª{ÜßGŸóÀÝýí™OÀFß$©ÿŽ ¢e¨½Þ¹óÂç¾ZÏ‚F jú7qÓ°}Ökhxë7S¶`Óð;„$EÕ;ã?f¾n˜¼öžo ŸýjM< )°áM߈>뀵0øþñ)›·QøB’f»þy £`hŒÑc·†Ï~µf% )°îq>4¸þXKIÍijNê_²SôÑ Ò¿x‡ø;€ÒldA#–/~qJývô™¬¥ÁuG[ÒHªó7Iƒ+Ž>r qÚûý~ü=@i6² ‘‚\\ô™¬Ÿ¤‘Tçò¥?•†·Ÿ}Ô@ã«LÙÔáwµf% )¸îQŽ>÷€udI#©ŽµwùÅ4zøÆè#©ÿ½ÃïjÍZ4Rt _ŠÞªè³XGƒëŽIÙüãï’4†:¼#ù£ÑG+4Vçà÷†ßÔšµ,h¤4¸æðè³XÛOKÙÂÍÃï’´>uþHJƒNô‘ UtV̼.úN Ö¬eA#• Î×ÿwôù¬§á¦|ñ‹Ãï’´ÖMÍI½sç§TÑG)4ÚàêÃâïJ³™T†l:³!ªmtÏe3/Ö¿[HÒš¶pó4¸îèèãH)uüPüÝ@i6³ ‘JÒàŠ£g0£®Iùö/ ¿[HÒóÕÞõµ3gPývÊm~?PkV³ ‘JRçà÷D`LŠw¤ön¿~¿¤çªsø|ŠJdxÉá÷µf= ©,ÍÛ(ÙCѳ“¢ýxêìÿöø;†$ýxó6Jý‹¶÷¾(™îqOPší,h¤ÕÿÎÞѳ§A7uþHøC’¦ËwxEÞõ­è“øI£AÊ—½4ü® Ö¬gA#•¨ÎïŒÀ¸Eêù¥ð{†¤f×9ð¥bÕƒÑ'"ð,†·~WP+$ ©LMmŠ•÷FÏ`ú-OÙÔœøû†¤f5oÃÔ?QJÅ(úžCïÔÏÆß”"² ‘JVÿ[»DÏ`B×—²›…ß7$5£|çW§áD}À꣔/ß&üÞ VH4RÉjõw£Ç0AÃÛÏKù’­Âï’ê]÷¸§¢·*úÈžÇðÖ³Ãï j…eA#•­©9©xüöèÙLÐèÁkg^Ö~ïT»ò~. o93ú˜ÖP÷ÄO…ßÔ Ë‚F*aý –DÏ`Š'ï›ùälô½CR}êõáTäFoÀšöR¾tëð;„ZaYÐH%¬ý•_ŽÀltS÷ø¿{HªvÓ_›8¸ú°è XKÃO¿G¨šTÒF÷~7zF³¤ÉN)›·aøýCRõê|ýÏS±êèc XÝcþ6ü.¡Vh4RIë}ãߣg0‹†·~3åÛýtøDR5š~Õàúã¢.`]õó”/zaøB­Ð,h¤’6ý€& ûÑ£˜EÅÊ{Sg¿·…ßC$•¸y¥ÞiŸKE÷Éè# XƒkŒ¿W(EgA#•¸áM߈žÀl Rï¬mS65'ü."©\uöÿƒ4zðÚèS ƒÎá¿[¨žTâºG$zVA†ß?!åË^~‘TŽO×®80¥¢ˆ>š€1(:+R¶`Óð;†ZáYÐHenÁf36ÐLŪSç?‰¿“HŠijNê÷ñTäDGÀ ®øZü=C© YÐH%oð½¢g©¥þEÛ§lþÆá÷I³W{¿ßO£{.‹>€ èüžð»†Z¥È‚F*y¯ýaôÌJ`tï婽ûëÃï&’&[{×_™ùŠC žŠì¡”ÍÛ(üΡV)² ‘ÊÞÔœT¬¸#zve0ì§Þ¹óS6oÃø;Ф±–/{iê_ºkJ£AôILPÿ²=Âïj•& ©õ/\=;€™þÚ£ön¯ ¿£HC‹¶H½³¶MEweôÑÌ‚Î~o‹¿(•% ©M ÀÓôÛ©÷Íÿòn©ªÍß8õNý·™¯9š¡xâ®™oË ¿‡(•% ©"îû^ô Jhô൩½ï[Ãï*’Ö°© R÷è¤Ñ£?ˆ>>€YÖ¿hyü]D©LYÐH©wúç£gPVE‘W’òe/ ¿³HZÍb樧ÑÃ7DŸ@_S¬ì'² ‘*R¾ýÏza(°ZŪR÷ø˜y}w‘ô£lšº'ÿ©XqGôÝýíø{‰RÙ² ‘*ÔðæÓ£g PÓ_ÚÞï÷Ãï.R£[´Eêö¹T¬¼'úHJ {ò§ãï'JeË‚FªPÝ£?=K€*}íÙ•§|ùËÃï0R“Ê—l™zgÿ¿TäDŸ@YôÛ)_²Uø=E­ÒeA#U©›¥¢ýxôHª¤—¥þù‹R¾øEñw©Æå;ü\ê_°4'¢ê€’\sxø]E­RfA#U¬þe{FÏ ‚ŠüÑÔ;kÛ™÷aDßg¤:ÕÞûÍipÕ!) ûÑ?æ@IuzwøE­RfA#U¬öÞ¿=S€ =úƒÔ=æoS6µAø½Fªl 7OÝÿ)î¿*úG(¹â‰»Ü½•ž+ ©‚ù‡ °¾FߺÇ}鹚š“:¾+ o81¥Ñ0úG¨’¢Hí]~1þ>£TÖ,h¤ –/Ý:¥A'zÄ52ýƒîñŸHÙüÃï:RÊwüùÔ;ûËiôÈMÑ?ž@E ï¸0üN£V©³ ‘*ÚàÚ£¢g PCŪf¾Â)_üâðûŽ4ë-Ø,uúpÞxJJ£Aô#PqÝãÿ!þ~£Tæ,h¤ŠÖ9ø=Ñ3¨±éwlô/X2óÎè{4Ѧ6H¯ýa\yp*ºOFÿè5QôV¥|Ñ ãï:Je΂FªjS¤bÅѳ¨»ÑpæÓƒÞÿ‘ÆX¾ã/¤ÞYÛ¦Ñc·Fÿ”54¸âÀðûŽZ¥Ï‚FªpýóFÏ AF÷\–ºÇ}@ßž²©9á÷ µJŸTñ†·=s€Þõ­Ô=á“)_ü¢ð{‘ôßµ÷zSꟿø©ð̦Þ9sÃïCjU" ©âuýXôÌHiÐIƒëŽIÃÞŸ²y…ߑԼڻ¿>õΟFÜýÓ4Ùhò~.ün¤V%² ‘ªÞÂÍSÑ~¥V¥² ‘jRïÔ‹žAëfØOÃ;.L½sæ¦öW×§kšÒÔ©½çSï”YÖM@eõÛ)_ö’ø;–R•² ‘jÒôožúÚ 6Ÿ®¹þØÔ=ùÓ©½Û¯†ß³4¦¾ u¾ö‡3‹¸áͧ§¢óDô_5€±\ypü}K©jYÐH5jpù~ѳ`ìŠU¦ÁõÇ¥ÞiŸKí½~Ó'lªÐÔœÔÞåS÷¨¿Nýoí’F÷\6óI)€ºjïûÖø;˜RÕ² ‘jT{ïߊžEWtW¦ámç¦þ…ۥΜyoIô=¬ÑÍÛ0µw{]êû±Ô¿dç4¼ý|ŸŽetÿUñw2¥*fA#լѽߞI³®xò¾4¼ñäÔ?QêùW©ý•_žyÇIôݬnå;þBêò'©wæ—ÒàʃÒèÞËSêçÑÿõ‚ IDAT„šþjÞè{šZ•Ì‚FªYÝþ1z&”C/›ùj­é¯íñ©sØûR{—_JÙ¼Âïle._ü¢ÔÞëM3_OÖ;ûË?\ÄÜýmŸŠxŽOwç‹^~‡S«’YÐHuká RÑY=›ÊkØ›ù‡Ððû'Ì|%Wïÿž:_ÿóÔÞã×g–M¸/¶w}êüÞÔ=éŸg>u4¸ê4¼ó¢™÷ý°æúßÙ+þ~§TÕ,h¤Ö¿t·èÙPYEû±4zàš4¼ùô4¸òàÔ¿pYêö¹™O”txGjïñ†”/ß&e 6 ¿÷ýwù’-S¾Ó«f>ù2³x9îã©wÆSÿ’ÒàªCÓð–3gþ*òG¢ÿ㨕é_ò‰¾ ªUÙ,h¤6ý‘Ì‚~;+ïM£¯Mû.IÃ[ÏNƒëKƒkOƒË÷ù„Nÿ¢íSÿ¼©wÖ¶ÿÓÿ‘º'ýËSM¿Óåiÿó³¶Mý –¦þEËgþ÷ ®80 ®;& oúÆÌÿéw¿Œ»uf™”ŠQô 4¼óâðç€jU: ©¦ ï¸0zF@muýXø3@µ*TÓºÇüMôŒ€Z*²‡S¶`Óðg€jU: ©®Íß$ÙCѳ j§ÞÂøçJUÏ‚FªqÓßwŒÑ ›òí_þìO­ÊgA#Õ¸|ç×xi,ŒÑàʃŸû©U‹,h¤š7¼åÌ虵ÑÞë7ßù©U‹,h¤š×9âƒÑ3 jaxÛ9áÏûÔªM4RÝ›·Q*VÞ=» ò:‡½/þyŸR]² ‘PèÙ•6zäæ”Mmþ¬O­ÚdA#5 |»ŸNiЉžaPY½S>þœO­ZeA#5¤Á•GÏ0¨¤¢ýxÊmþŒO­ZeA#5¤ö^oŠžcPIý —…?ßS«vYÐH jxçÅѳ ªeØOù¯¶§Ví² ‘T÷¨G3¨”ÁÕ‡…?×S«–YÐHMjÞ†©XqGôL€Êhïó–øçzJuÌ‚FjX½oþWôL€JÞqAøó<µj›Ô°ò¥?•R/‹žmPzÃ?þˆ5è¤|ùËßש՘,h$¥Á÷ªÿ½ÃŸÓ©Õ¨,h$¥ö>o‰žg4Lí]~)ü9ZÊ‚FÒLÃ;/ŠƒbpÕ¡áÏçÔj\4’fê|ýÏ£ç ̾¢Hí=Þþ|N­ÆeA#é‡MÍI£‡®‡0«†7œÿlN©‰YÐHzªî ÿ=`Vµ÷}køs9µ™¤ÿiÁ¦©xò¾è™³bxÛ9ñÏ䔚š¤§Õ;kÛè¹³¢sÀ;ÂŸÇ©ÕØ,h$=­|ñ‹SÑy"z6ÀD o93üYœš¤gÔ¿d§èùÕÞ÷÷ŸéÙYÐHzFù?—Ò°=#`"†7þ NYÐHz¶W='`üŠ"µ÷yKøó7idA#éÙjïñ†™au2øþñáÏޤ̂FÒêÞ|zô¼€ñ)F©½ço„?w“2 I««óµ?Š™06ƒk æ&e?Ê‚FÒjÝûÝè¹ ëo4LíÝ~5üy›”ý( I«­sÄ£G'¬·ÁU‡†?k“²Ë‚FÒꛚ“F^=?`ý>=³ë¯Ä?k“æþO4’ž·îÑ¡°Îß; ü›”ýD4’ž¿y¦Ñ#7EÏQX{Ã~Êw~uü36iîÓ³ ‘´FuûûèQ k­ÿ½ÃŸ­IÙ³dA#iÍš·Q=vkô<€57è¤|‡WÄ?[“æ>3 Ik\÷ÄOETXcý‹–‡?S“²çÈ‚FÒš7ãT¬¸#z®Àó*Ú§|éÖñÏÔ¤¹Ïž¤µªwÊ¿FÏVx^½3þ#üYš”­& IkׂMS±òÞèù Ïiú[`¦Ÿc…?K“æ>w4’ÖºÞé_ˆž±ðœºÇ~,üš”=O4’Ö¾…/HEöPôœ€g=puʦ6ˆ†&Í]}4’Ö©ÞYÛFÏZx†ÎAïv&ek¤ukѩȉž·ð”áͧÇ?7“æ®Y4’Ö¹Þ9SÑ3~¨¥ö^o f&ek˜¤u._²e*:+¢G/¤Á•…?/“²µÈ‚FÒzÕ?oaôì éúí”ïøóáÏʤl-² ‘´þŸ¢i?=‚h°þ…Û…?'“²µÌ‚FÒz×ûæÿžÁ4TÑ~<åK·F&ek™¤õoÑ©Xõ`ô, z§>þù˜4wí³ ‘4–z§}.zÐ0Åã·¥lÁ¦áÏÆ¤l² ‘4žæo’ŠwDÏd¤sø⟋Is×- Ic«{Ò?GÏdbxÛ9áÏäl=² ‘4¾æm˜FÜ=›¨»Ñ µ÷xCüó0iîºgA#i¬uýXôx æúßÚ%ü9˜”­g4’ÆÛÔiôÀÕÑ3€š*²‡R¾d«øç`ÒÜõË‚FÒØëñÁè9 @MuOü§ðç_R6†,h$M¤Ñ=—EÏjjftß3ßàýìKÊÆ¤‰Ô9ø½Ñó€:)ŠÔÙÿíáϽ¤lLYÐHšXÃÛÏÛÔÄàªCßwIÙ³ ‘4±:û½-znPEoUÊ—oþ¼KÊÆ˜¤‰6¼åÌèù @ÅõÎÚ6ü9—”9 I­½÷›g¾ÖÅè±[R¶`Óðç\R6æ,h$M¼Á5GDÏq*ªsØûßoIÙ² ‘4ñò^•Ò =˨˜á­ß ¶%eÊ‚FÒ¬Ô¿xÇèy@• º©½Û¯†?×’² eA#iVÊ—l•ŠüÑè±@EôÎþLKÊ&˜¤Y«wúç£ç:0zäæ”-Ø,üy–”M0 I³×üMÒèÑDÏwʬ(RçÀÿÿ,Kš;Ù,h$ÍjÝ£>=â(±Á•‡?Ã’²YÈ‚FÒ¬7¼ë’è9@ íÇR¾ÝÏ„?¿’²YÈ‚FÒ¬×Þ÷÷f>ª ?®{Â'ß]IÙ,eA#)¤ÁõÇEÏ{JdxçE)›šþÜJÊf) I!µwù¥”†½è¹@ {©½ûëßYIÙ,6zø†™¿þ4’f½þ¥»E~J þâðgUR6Ëß6ó÷¿•Mmþ‡‘Ô¬òe/MEgEôü Ðè±[S¶póðgUR6Ë+ï™ùh­š¿IøFRóêõŸÑwuý³ðgTRP‘=<ó3Ðʽ0ü#©Íßä©òÐ,ƒkŽˆ>%ͩ讜ù9heK_þ‡‘Ô̺Ç~,ú.À,›þêû|û—…?›’² Ò 3ó³ÐÊ–oþ‡‘ÔЦæ¤á]—Dß ˜EÝ?ÿ\JšÔüMR*Š™Ÿ…V¶Ó«âÿ@’[{ïßJi4Œ¾0 †·œ5óK»ÑϤ¤,¨|ùËŸúyhå{þFøHR³|÷«¡&oú½ùŽ¿þ,JÊkïùƧ~&Zíßþ’Ôìò¥[§"$ô‚ÀduOú—ðçPR\çkôÔÏD«sÔGÂÿ@úÿÛ»ÿ`Ëëú¾ã»€‚ÑÂ$jŒ£©cGÃŒ¥©M'™$š¦jšæç¤M'± SIí´éÞ]–_Ëo1 (Šü È ˆ~-"¤Y~ ËïŸ÷û=¿ÏywÎ( ÷ÞsïûsιÇÌ3Ÿsîý~ýæóbÏ]%­øÚ|¼è˧wçå¾ÚLZ³*Z_þèó×ŪÖ/þ‚$©Z»cô·ÝTôA€¥7h=µ¿….Űööüµ±ªuÙÚâ/H’†5?ûÁˆÁ èK«õÕ?-~î$UcRçªÃŸ¿6Vµÿþ3Å_$=W÷æ/}``éøj3iÕ‹êÞröó×Ǫî÷.*þ‚$é¹êÃ~<­§‹>8°ÚU4ŽÙ«øy“TQýû¯þYÕ{ø¶â/H’^Xûëÿ«è³£k_øßŠŸ3IÕ˜5¨{þYíÚ?1“4^­Û9úÞQô€ÅëÝuET3;”?g’ÖŒOõA¯{Ñu²jøª {a’ôš§þJ©çFÑ©£qÌ;‹Ÿ/IÕ˜Õ8á_:ÐÔ'ìSü…IÒ×»ý‚R,Rûkû?W’ª1¬uþyé@Óü›?.þÂ$é‡þ¹è¶J=K°@½»¯ôÕfÒš—¯sͱ/hÚßÚXü…IÒËÕùÆ!¥ž'X€A{6Ÿú™âçIR5¦õîþÆKšîWa’ô²¸[ žº·ÔsóÔ:ïÊŸ%IkÆ·AýØKš~ýxñ&IÛ«yú‡K=W0Ý[Ï)~†$Uc\}ÔÛ_rÝÌ 4CÕáo)þ%i{ ÿG€ñ3xæ¨}Sñó#©ãZçüÞö𯫸 ”¤íUöã1h>™ý|À+ ¢ù…_+~v$Uc^÷ºã·?д¿ydñ(I¯Tû‚g?bð :W]üÌHª& þC·l éÝûíâ/P’^±™¢wï·²Ÿ3xý‡ojý®åÏŒ¤5ã]}Èîƒþöšè¶cö€]Š¿PIz¥ǽ7¢×I~ÜàEº­¹sšÒgER55ÏøÈË^Fÿ þš“ö-þB%éÕê\¹!ëQ€—ѾøÅψ¤jBê\»éÕšÖe3Å_¨$½jëwþã[³ž7xÞÖK羊¾ø‘´f25OùPÄ`õÜ@D šOF}äÛŠŸ IÕ„Ô8ög·{=½h ‰~/ªCÞXüKÒ|ê~猄ÇžÓ:ë·‹Ÿ IÕ5ü:Àù 4Ñ<ëwŠ¿`IšOõ†=cP?¶ÜÏDDwË©Åσ¤jÂ~%༚ÎM§Á’4ßZóÇËýì°â ÿp}Ð닟IÕ„ýæÑïΠéWÆìÌŽÅ_¸$Í«™ÕÑ»ëŠå~X¹º­hlÚ»ü9´f²j_ðg¯xi½d j|þWŠ¿pIšoïŠè6—ë`Ek_øçÅϤjëÝ}åšΠ§á’´Ú—¯[®g€«{ë¹ÅÏ}¤j«xKÄ ¿ð¦ßx2f×¾¦ø¤y·nçè?xór=‹¬8ƒ'îŒúà7”?÷‘ÖL^íÍû¿ê5ö²ÍPãô’´Ÿy_D¯½ÔÏ"+O¯÷)~Þ#UZÿá[?Ðtn>³ø¤…æ«ÎF×þÚ~ÅÏy¤jBk~öƒóºÎ¶;ÐD·Õ¡ÿ¤ø‘¤µv§èßý>ެ,½ï]ÕÌêòç<Қɬ»åÔšˆh]ü‰âoD’ZãÓï‰è6—ê™`ÅPü\Gª&¸á×Î×+4C“ö-þ†$iq_uvݨ%+Fûâÿ^þLGZ3Á­Ý1úo]º¦só™åß”$-¢Æq?Ñmúl0õz·ïïÎHkF«uÖ\Ðu÷ªMô{QýÓÅߘ$-¦ö×ÿ÷&ÓoðÔ}Qú¦âç8R5áõ¸a‰šá?mûÖ±Åߘ$-ú«Î¾íbŸOVÀßùÅòg8Қɮù¹½àËo^M´ª¨Þ½ø”¤ÅÔ8öŸFt›‹xB˜n­¯þiñ³©š‚zw^¾LÍðBýú_ƒ’´ØÚ—|rÁ7H€iÖ½é´âg6R55OÚwQ×༚~õhT¾¶ø•¤E5³Côîùæ¢n”Ó¦¿mKTëw-f#­™üzw_¹¼ÍPëÒÿSüJÒbkl|wD§±¨›%À´ÔE}ÔÛ‹ŸÕHÕÔ<ý7}-.h é7žŒêà7Ã’´ØÚ›÷_ô `âõ»Ñ<åCÅÏh¤jšYýnÌh†ÚWRþMKÒ(_uv×ß-ú¦ 0ɆÿñjñóiJj÷‡#] hú­Ù¨6ìYüKÒb«xk tó˜4Ý›¿Tü\Fš–êƒ^ƒg¶å4CëO*þæ%i”š_úw#Ý<&IÿÁ›£:p·âg2Ò´Ô¹êð‘¯ËE 4ÑïG½éç‹’4JÝNù& 0î'¢qÌ^ÅÏb¤i©qÌ^ÝÖÈ׿ªEÿs¸{®ŽÙ1ø $iѸ[ôýÞÈ7R€±5èGó ¿VþFš¢zw\¼$—碚¡æY¿Süƒ¤QjlzD¯½$7T€qÓ¾ô¯ŠŸ¿HÓTëÜß_²ës¤¦ÿôQôcÅ?I¥ö%ÿcÉnªã¢wÛùQͬ.~ö"MKõ†=bP?:ÍPçú“Š(’4R3;Doë¥KsWýGn‹ú ×—?w‘¦¨îÍ_ZÒëtä&ƒhœò¡âŒ$R}ø›—tý(exÆ1ü#æ¥Ï[¤iªyÆo.ùµºjIÖØ'îŽjýnÅ? I¥á̎Ϋ׉¦ÿ ^Š¥¬Þ°g fÏf¨ý­Oÿ$iÔ:×nZªÛ"@ºÖyTü|EšªfVGï/Y–ëuÉš¹¯:;í×ËX’4Jìý‡¾»d·F€,«+¶"MYí͹l×ìÒ 4ï:{æÁ¨Ý£ø&I£ÔøÌû"º­¥¼=,«ÞmçG5³Cñsišjlzÿ²ž.é@3Ô½csÌŽÁ'I£Ô¾øK}{Xým7E}àk‹Ÿ§HÓT}ÈîÑ|ë²^»K>Ð µ.Ú¯ø‡'I#·äÿݼ·H€%3xf[ÔGþdù³išZ»ã²ýÝ™eh¢×‰ÆIû–ÿ%i„ê {Äàéï/Ëm`dF4NܧøŠ4mu®<4å^µlÿ¬îémQöÅ?HI¥æg?87:Œ•Á Z_þXñ³iÚj}éßÏ]_=Ð õîýv̮۹ø*I£ÔÞ¼ÿrÞ*¬}ÙLñ3iÚjlÚ;íÙ´ëxYš¡îõ'ÿP%i¤fVG÷Î[îÛ%À¼toþâÜyEñ3iŠª~G fJ½–—} j]¼ñW’F©>èuÑäöŒ[&Àvõï¿>ªõ?Zü¬Dš¦êCÞXäì/e ‰~?šg~´ø‡,I£ÔøÌûæþø@ ýÇ·F½aÏâg$ÒTuÀ.Ñ»çª"×tÎ@3ÔmGãäUþÖ¤jó»i·M€ç êG£±ñ]ÅÏF¤©jÝk¢wûÅ®ëU© oõXÔ¶ü‡.I#Ô½ñ”Ì['°Òµ«hœðâg"ÒTµv§èÞznÑK;u ê?óPÔŸ²ôJšàØ%úܘ}ûV¢~/š_ü­òç!Ò45³Ct¿szé«; ê?qOTG¾­üA’Yã˜wÆ ùT‰[(°‚´¾ò'ÅÏA¤©gn89ÆA‘f¨÷ØÖ¨û‰ò? IZdÍ3~3b0(u¦\ûòuÅÏ?¤©ûZ³-§Æ¸(6Ð õ¾=ªÃß\þ‡"I‹¬sõÑ%o£À”þ Üjfuñ³ijZ¿kô¾waŒ“¢Ís_wV½WùŽ$-¦µ;Eïž«JßJ€)Ò»ãksgÅÏ=¤iéÀÝ¢·õÒ7Åš¡þÓD}ì{Êÿ$iÕG¼%ÕÃ¥o¥ÀèßÝÜaréóiZžÝõ·m‰q4ÍP¿z4êM{ÿaIÒbj~î—#ú½Ò·R`‚õßõ†=‹ŸsHÓRã¯ÿy ž¾?ÆÕØ 4sZU4NÿHñš$-¦öæ¿,}&Ô ~4ßUü|Cš–š§þj ZOÇ8¯f¨ß‹ÖEQü‡'I‹©û3JßE€IÓ®¢qŠŸkHÓR{óþñm7ã7Ð<«ýíãbvf‡â?HIZPëwþ7–¾…“¢×‰æi¿^þLCš‚êƒ^Ý[ÎŽI1¶ÍP÷ŽÍQ¼{ñª$-¤úÈ·Å z¸ô-wÃo:ë·‹ŸeHÓPãÓï‰þ#·Ç$ëf¨ÿÄÝQÿõû‹ÿp%i!5Oþ¥¹ÿàe ÑúÊŸ?æ¡ÖÙÿ)íÙ˜4c?ÐÌé´ü]IWûÂ?/}÷ÆTû’O?»&½ú ×G÷úcRMÆ@ó¬ÎŸjýnÅè’4ߺ7žRúÖ Œ™Î?³&½æÉÿ2OÞ“l¢š¡Þc[£>aŸâ?|IšWëvŽÞ=ß,}ëÆDçšcËŸWH“Ü»DçªÃ"ý˜t7ÐÌéu£}冘]»Sù_Iz•êCßýÇ·–¾s…uo:-ª™ŠŸUH“Úð_Íô¹=¦Åd4ÏêÝwmÔǾ§ø/…$½ZãÞƒÖ3¥o›@!Ý8/ªµ;?£&õ?€înù|Ä`Ód¢š9Ýv´ÿn}Ì®û‘â¿$’ôJ5ÏøÈTüÓK`azÿø·s_ƒ^úlBš¸fvˆÖùÿ9Õ#1& yÁߦi|î—ËÿÂHÒ+ÔþÛÿYúv $êß÷í¨|mñ3 iÒjœ¸ÏÜõ3ͦf ™3DgË¢:üÍÅy$i{u·œZún $èoÛõÁo(~!MRcöšûJÀ•`ºšç´ªh]6³ìZü—I’^Ò?½{¯.}§–Ñð™×ö,!MHõ‘o‹îõ'FôÚ±RLç@ó¬þSßæÙ¿³kVÿå’¤VoØ#úo-}›–Áðÿç¯xkñóiªüÉè\»iE 3+b yNï¡[£yæ0ÔH«ßƒÆã¥o‘À¢ÛŠ•jE 4/jÎù=C¤±©yÒ¾+ú„`š žº7ê£ßQü¼A皟ý`to9;¢ß‹•nE 4Ïém»9šçþAÌ®}Mñ_FIjûûƒAé[#0‚Á“wG}ÔO?gƲw‹Öyýn(}©Ž•9Ð<§ÿÌCѺlmT‡¼±ü/¨¤]ûòu¥o‰ÀHÿræ§‹Ÿ/HãVcÓÞѹf£¯ùߎ=Ð<¯UE÷ú£>þŠÿÂJZ¡Í¬ŽîM§•¾ 4xòž¨z{ù³iL~Í_û’OFÿ¡ï–¾<Çžæ‡ôün´.ú‹¨Þ½ø/²¤Öº£w×¥oƒÀ<ù›3ÒŽ”s£Ìýו¾,'Šf{:­èÜrN4¿ü±˜]ÿ£ÅÁ%­Œêƒßý‡n)}^Åà©û|­™VnëvŽæ)ŠÎU‡EÿÁ'–f>ÚõÆš3?ÕúÝÊÿòKšêê#Þƒ§¿_úÎlÇðÿoo³Wñ3)­µ;EãøŸö×ö‹Þí_A{¶ôe8 4 ÕmGwëåѺä“Q÷Þò†¤©¬qÜÏÅ ùdé;ð²ãÌ;‹ŸHËY}ÔOEóôGçÿà+ùÛUéKo*hFÔúèlùB4¿ò_£þô?‹Ù5«‹_<’¦£æÉ¿Ñm•¾ÍÏ<}4>õ3ÅÏ ¤%é€]¢±ñÝÑ<õW£}ÁÇ£{ÝñÑ»÷ê4Ÿ*}©­š%6üåíÞ±9Z—ÍDãŒÕQïˆÙÒ𤉭õåE ú¥om°â ZÏÌdÿîŒ4n ‡ÃƦ½çjžô/¢ùùÍÓ#ZçþA´/þDt®8(:×nŠî­çDÿ¾kbð̶җšýÖlôîûûè\wâÜW£ ÿ–M}ü/DuèÅ%­‹ö+}û!e) ÔIDAT–˜ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ ™ rý?Ÿ;¢æ\'R¬IEND®B`‚‰PNG  IHDR°„éOuš pHYsèèµ{Rk IDATxœìÝyÔeu}ç{ PÄç)Æ8dÅ\£FšÜÄÜ vL›A3'·cŒIw¢‰Üx3<5QE1ƒHA1ˆY(QfA dÖ± Š©¦³Ï¼÷·W=$DŠžg÷9çõZë½VÿÑ«{uúìß>üøpžgÀfå0†}7ú7ŸÝ‹§¢sò‡£8üÑÚûÅÑú·gHjPÝS?bØË>5FJÕۣߗ~·#IÙÞ/žþ÷N“?Ý‹çMÿû¨á÷Mÿû)€ÿôŒÇÿWÀdUî¿)ú+ÎY‹âˆŸ‰ÖÂçæy‘ô´u—Üz€íTu7D{Ù»Òïx$IÿÑÂçNÿ{ªÍÿ¾ª¿âˆéå&— L‚^ƒÛ/Þ¥ £}ü¢µ× ò¿HÚæz|:¢ª²O€‘VuÖEûðŸN¿ë‘$=E‹ö˜þ÷Y½ËÅàŽ¯Nÿ{.`2°À˜*Yý«—Mÿ) Ö¿®"tSs¢Å>ÙÇ ÀØ0b‘¤jÁnÑ>ö—£wù’(×~'ûÌ"Ã~ ¾wAtÏù›(ü±ü/’f¦¹;Çàš#³O€±SµÖFûÐ7çßÿH’¶©â 7D÷¼OÄ`ÕEå ûuÌ eå0w^1ý’n-yYúI3ܼgÅà¦S²O€ñ±|æ'òï$IÛ×â=£súŸÄ`åÙÓÿ±70Ú X` W¯ˆî¹­}^žÿÅ@Òì´à91¼íËÙÇ ÀØ«6¬ö«Ö’4íûÊè~éïbxßµÙ¯`;°Àˆ(;ë£õ²(–¾=ÿ €¤Y­X´G ïúZö±01ªõ÷DqàëÒï…$I3S±ô§£wåÁQd¿b€m`À 7¼ûÊèœñÿNÿCöË^ÒìWìýâ(×\—}ôLœò‘UQì÷ªôû!IÒ ¶à¹Ñ9ó/¦ÿºÐ|,ÐDåpúoõËÞÿb—T[Å>/‹ò›²O €‰U>|[û¾2ýžH’4;¿ÊÒ¿þ¸ˆá ûu<h²»ñ±?tðÓ_â’ê­Ø÷Q®ýNö10ñʇnbŸ—§ßI’f©^7ýç…¢×Ê~å?Ä€`óßßë^ø/ÑZ´GþK[RímþûÊÕ£wdEü‡òþ¢ØûEé÷F’¤YlïGïÒ…Qv6d¿v€ÿ`ÀÉ¿¸Ò»|I´özAþKZRJíCÞÕ†ÕÙÇ?¤\s}‹÷L¿?’$Ír‹÷ŒîÅs Y  X CwÓôO“µ–¼4ÿ¥,)­ög~"ª÷eŸH<…rõ7£Øk÷ô{$IRM¿Èrù’ˆ~;ûõË€êT¢õ‘†+’¢½ôíQeŸJ<á—GkÁné÷I’¤šÚï5Ñ¿á U•ý ‚‰cÀ5ÜqY‡½5ÿ¥+)½öx8ûX`+ o=7ZswI¿W’$ÕWqø;cx÷•Ù¯ ˜(,0ËÊõ÷Dçô?‰ÖÔœô­¤ü:G¿/ª®¿£ 0j7œ­©Òï—$I565gúßó•×d¿†`"°Àlô¢wé‚hÍvþËUR#êûþˆ~‘}:°úW”~Ç$Iª¿b¯Ý£wÕ¡å0ûUcÍ€fÁð¾k£Xúöô—©¤æÔ9æ¢êmÊ>žØA½‹þ%ý®I’”SqäÏÅðog¿Š`l°ÀLêµ¢û•ŠÖÜÓ_ ’šSç˜ÿ{ú|`<ô¾ôÉô;'IRRóž9ýï7ÿ5`f°À ¬º(Zû¿6ÿ¥)©Qu>ÿ+ývöÀL*‡Ñ=ùÃéwO’¤¼ŠÏ¾%†÷]—ýF‚±bÀ;jЋîÅó¢5µSú‹RR³ê÷«Æ+ãjØ‹Îñ¿ž~%IJþ5–‹çNgÀ;`¸veKßžÿr”Ô¸:Çýšñ À¸ëÑ>ê=éwQ’¤ÜÚŸ{”îÍ~+ÁÈ3`íÔ¿þ¸h-|nú QRCÇ+ƒNö1@ ªâáhúæô;)IRr‹_ƒ•˳_K0Ò X`• Ñ9éwó_‚’Yçßÿ[Ä ›}TP£jý=Qìÿ#éwS’¤ä¦æD÷Ëÿ1d¿š`$°À6>xk‡þdþËOR#Ûü7ýò Àd*ù^û¼,ýŽJ’”_ûèŸrÓýÙ¯&9,°•ßþb´>?ý…'©™uNø _^˜på½×D±—{dIÒ3¢µÿÄðÞk²_M0R Xàé”Ãè^ðÿOÿäWú‹NR#ë÷kÆ+LÞ~q´æïš~g%Ij@óŸýk?Ÿýj‚‘aÀ[ÒoGçää¿Ü$5¶ÎÑï‹èµ²O+d¸ry´æî’~w%IjFÝó>1ýÍ[fÀO¡l=í#ß“þB“ÔÜÚG½'ªÞ¦ìã €\¼_ö–$=^çäOÿÇóÀS3`'1\ûhð£é/2IÍ­}äÏEÕݘ}\Ð`ýËöJ¿Ç’$5§ö1¿eûÑì×4– üÁí—FkÑé/0IÍ­}Ä;£ê¬Ï>®Ýå™~Ÿ%IjNÅgÞ庻²_OÐH,ð}·ž­»¥¿¸$5·öa?UñpöqÀ¨(‡ÑùÂo¥ßkI’Ô~¯‰áCßÍ~CAã°À¬\­ù»æ¿°$5¶ö!?Õ¦²+FM¿=ý'©³ï·$I jÉËbxÿMÙo(hØüÏ7œ­¹»ä¿¨$5¶öÁoŒjãšìã €UEû7¥ßsI’šS±ä¥1\s}ö+ À…‰×¿zY´¦vJAIjníƒÞÕ†{³+F\ùȪéY™}ß%IjNÅ¢=b¸úªìW4‚ í±ñÊœô“¤æVìÿ#Q­¿;û¸`L”÷\­ÏI¿÷’$5§bñ ý °0Éú×ÿ»_^‘´ÅŠ%/‰òÁ[²+ÆÌðÖsýY{IÒþÄpíÊìW¤2`a"õo>Ý?HzÚµsyÿÙÇcªÿÍϦßI’š÷«ð庻²_QÆ€…‰3¸í+Ñš¿kú HRƒ[ðœÞõµìã €1×ûÒßåß…I’Uqàë£Ü¸&û) X˜(ƒ;/Ö‚ÝÒ_<’ÜügÇðöK²+&A9ŒÎ‰ÿ=ÿNL’Ô¨ŠÃÞegCö[ jgÀÂÄ>ü½híýâôޤ7ï™1¼åœìã €IÒoG{ÙÏæßI’Uû¸_‹ö³ßRP+&BÙz(ŠƒÞþ¢‘Ôà¦vŠÁ'eWL jãš(öÿ‘ü;2IR£êœõ±ìWÔÊ€…ñ×oGqäÏ¥¿`$5¸©91¸zYöiÀ+×~;ŠE/È¿+“$5ªÞ7>“ýŠ‚Ú°0þ?ô¤ßM±Hjvý¯}Z@ oûr´æî’~_&IjPswŽÁ-çf¿¢ ,ŒµÞ%óò_*’]ïâ©ì£ 7¸úˆô;3IR³*öÚ=†ÞšýŠ‚YgÀÂØÚ¼DlMí”þB‘ÔÜzçþMöQOÐ;ÿSéwg’¤fÕþì["z­ìWÌ*ÆR¹îÎh-Þ3ýE"©¹u¾ð[Óf §*£sÂÓïÐ$Iͪsêf¿¡`V°0~zEKßžþ‘ÔÜ:Ǿ?bÐÍ>­à)UÝÑ>ô'ÓïÒ$Iͪ¿âðìWÌÆNç´?JqHjní#Þ9ýÿÐtå÷E±ø…éwj’¤5×®¾:û³Â€…±Ò¿öØü—†¤ÆÖ>è Qmz û¨€­6\uQ´æî’~·&IjNíƒ^¥ÿX—1dÀÂØ(Y­…ÏOaHjfž¯ŒjÝÙGl³þ7>“~¿&IjVݳÿ:ûõ3΀…ñ0ìG±ìÝé/ IͬXô‚(ï¿!û¤€íÖ=û¯ÒïÙ$I jjN n9'ûõ3Ê€…±Ð½x*ÿ%!©™-Ø-†w}-û˜€3ìGçs¿”ß&IjLÅ’—F¹ñþì7ÌFÞயGkîÎé/I lî.1¼õ¼ìc fDÕz0Š~4ÿÞM’Ô˜:'ýNöë fŒ £­ß‰âO1HjèOç]|ö)3ª|à¦(>/ÿþM’Ô˜ßþböë f„ #­{Ñ¿¦¿$5³þåK²(˜Õˣ5µSúœ$©û¾"Êöºì×ì0FÖðþ£5ïYé/IÍ«»üãÙG̪þW¥ßÃI’šS÷¼Of¿š`‡°0šÊaËÞþ"Ô¼:'|0¢dŸR0»ª*º§ýQú}œ$©!Míû¿‘ýv‚bÀÂHê}ý ü—€¤ÆÕ>òÝý"ûˆ€zôÛÑ>âé÷r’¤fÔ>ü§#†þ#_F— #§Üô@´öÚ=ý ©Yµz}T­µÙGÔªÚ¸&Šý^~?'IjFý«Ì~5Áv3`aät¾øç鿤fUìýâ(¾-ûx€å}×FkÁsÒïé$IùK^eg}ö« ¶‹ #e¸ùKøÔN鿤µà9QÞsUöñ©7Ÿ­©9ù÷u’¤ôºþKök ¶‹ ££ª¢}Ô{Ó|I jî.1¼õ¼ìÓ ¡wÁ?åßÙI’ò[°[”ëîÎ~-Á63`adôo<)ÿ°—Ô¨ú+–fMÐUã=ýÞN’”_÷Œ?Í~+Á63`a4 zÑ:àGÓzIÍ©wñTöÉSGá>]’4µS ï¿)ûµÛÄ€…‘Ð_qxþ!/©1uOù½é?+Ž`|ôZÑ>ôÍéw’¤œ×~.ûM[dÀB#µÿµô\R^ů‹ªõ`öQc§|pe Ÿ—~(Iª¿öaoÍ~ Á°Ð8ÃoÖÔœô\RNÅ^»G¹öÛÙGŒ­ÁM'§ßJ’rÜõõì×<%§ûåH?¸%%5µS o9'û€±×;÷oóï%Iµ×]þñìW<%šeÐÖÞ/I?¸%åÔÿÚþÙ§L†a?:G½7ýNP’Tÿ/áG¯•ý‚'eÀB£ôo:%ýЖ”S÷Œ?Ë>‚`¢Tëï‰b‰ÿ¨T’&­Á'e¿‚àI°Ð(íc9ýÀ–T›ÿKÍ¿ÀÔkø½ ¦ÿ´wö¡$©¾:Çýjöëž” Q>²Ê—di+xmT­µÙGL¬ÞÅSé÷„’¤›»s”ëïÉ~ýÀ°Ð½KäÖ’j­Xø¼(ï¿!ûø€ÉV•Ññ é’4Qõ¯<8ûíO`ÀBcŸysúA-©Æ¦æÄàæS³`ó†eÓQìóòü{CIR-uŽù…ìW< 0\»2ý–Toý¯.Î>z€ï3¼ãÒé?+‘}w(Iª¡¹;GÕZ›ýê`ÀB#t/ú·üCZRmuOùHDUe=Àé]ô¯é÷‡’¤z|ë˜ì×ü¡8øMé´¤zjñΈ~;ûØžL9œþ³Ù÷ˆ’¤Ù¯sÂod¿uà°®¼ÿúôÃYR=K^Õú{²` ª ÷F±ä%é÷‰’¤Ynþ®Qu7f¿vàq,¤ë]º0ÿp–4ûÍÝ%†w\–}ä[axû%Ñš»sþ½¢$iVÞz^ö+gÀBºö‘ïI?˜%Í~ý«Í>n€mлðŸÓï%I³[ïüOe¿nàq,¤*‹G¦•!û`–4»uÏøÓìãØVå ÚGùP%iœköSÙoxœ ©ú7žœ~(KšÝÚKßÑog7Àv¨ÖßÅâ=Óï%I³ÔÔœ¨6=ýºi,¤êœñgù‡²¤Y«ØçeQmX}Ô;`ðí3Òï%I³×à¦S²_50Í€…i€Ð=ëcùwŽ’¤Y©»ü/³_30Í€…4ÃoI?Œ%Í^ý‡g3ÀLéÑþÌO¤ß;J’f¾ögß’ý–i,¤éë˜ôÃXÒìÔ=ãϲ`†•Ü­»¥ß?J’f¸¹;GÕÛ”ýšòtÎühþa,iÆk/ûÙˆA7ûˆfAÿ›ŸM¿ƒ”$Í|û®È~Å€ yŠƒß”~KšÙŠÅ{FµîÎìã˜-U/|(ý.R’4³õ¿~`ö XÈQ¶ŒÖÔœôƒXÒ 6w箺0ûxfYU<Å~¯Ê¿“”$ÍXÝSÿ ûõ,ä¬<;ý–4³õ¿º(ûhj2\u‘ÿPU’ƨöA¯Ï~µ€ 9ºÏK?„%Í\>Q•ÙG P£ÞùŸ~7)Iš¡¦vŠèÙ¯&œ )Ú_ø­üCXÒŒTðÚéŸ &Ì íϾ%ýŽR’43•÷ßýfa°¢8ðÇÒ`I3ÐügGyßµÙG ¤\s}´æ=+ÿ®R’´Ã n>5ûµÂ„3`¡~ÝMÓ?A•}KÚñ×›}¢Éú—/I¿«”$íxýËf¿R˜p,Ônx÷•釯¤¯»üãÙÇ ÐUÏýbú¥$iÇêžþÇÙo&œ µë¯8"ýð•´cµ—¾-¢ßÎ>N€†¨ÖÝÅ^»§ß]J’¶¿öáïÈ~0á X¨]÷ËŸJ?|%mÅâ=£zôŽì£h˜ÁuŸO¿¿”$mÅÞ/Ê~•0á X¨]ç ¿~øJÚΦæÄpåòìch¨î)¿—)IÚîü?™ X¨]qØÛÒ^IÛWï‚Og!@ƒUÅCQìûŠô»LIÒöåWøÉdÀBíZ‹öH?x%m{íeïŠö³ á†«.œþ5çì;MIÒ¶7¼ûëÙ¯&˜ µ*ÛëÒ]IÛ^±ø…Q­»+ûFDïœÿ•~¯)IÚö7Ÿ–ý a‚°P«á}×¥º’¶±©91\¹<ûøFÉ íC2ÿ~S’´Mõ¿qHö„ fÀB­+ÏN?t%m[½ þ)ûèFPyï5Ñš÷Ìô;NIÒÖ×»è_²_L0jÕÿÖ1釮¤­¯½ì]Ã~öÑŒ¨þe Óï9%I[_ïKŸÌ~u0Á X¨Uïò}Ò]I[W±ø…Q­»+ûØFYUFç˜_H¿ï”$m]Ý3?šýæ`‚°P«îWþ¿ôCWÒV45'†+—gÀ¨½=нžŸï)IzÚº§|$ûµÁ3`¡V3?š~èJzúzüSöqŒ‘Á5G¥ß{J’ž¾ÎñÈ~e0Á X¨UûÄ¥º’¶\û¨÷D ûÙÇ0f:'|0ýþS’´å:G¿/ûuÁ3`¡Ví£Þ—~èJzêŠE{Dµî®ì£CÕÆû¢XüÂô{PIÒS×^úöì×Ì€…ZK:ýЕôÔ n<)û˜ÆØà†ÒïA%IO]û°·f¿*˜`,Ôª8ôÿJ?t%=yÝå™}D {Òï¤ß‡J’ž¼öÒ·e¿&˜`,Ôª8øM釮¤'Ö>øQõ6eÀ¨6ÝÅâ=ÓïE%IOÌŸ"“ µjíÿÚôCWÒ5×(×\Ÿ}<dpÉùw£’¤'Ô>ü§³_L0jÕÚç釮¤¬ÿÏd Àò§„$©y°É€…Zµ¿(ýЕô_uŽÿ@DUe ÀªZF±ä¥é÷¤’¤ÿª}ø;²_L0jÕÚë釮¤Ç*ö}eTÅCÙÇ0Á7ž”~W*Iú¯ÚG¼3ûÕÀ3`¡V,RCšÚ)†·_’}$Dç¤ßο3•$MgÀB&jeÀ"5£ÞEÿ’}L«6ÝÅâ=ÓïM%I,ä2`¡V,R~íeïŠö³€Ç ®;.ýîT’dÀB.jeÀ"%·ð¹Q>ôÝì£à :Çÿzþª$Mx,d2`¡V,RnƒkŽÊ>žTµþî(öz~ú=ª$Mr,d2`¡V,R^ã?QUÙÇÀSêó³éw©’4ɰɀ…Z°H9K^Õ¦²€-«Êèýóéwª’4©°É€…Z°H9 o9'ûñØ*åCßÖ‚ÝÒïU%i3`!“ µ2`‘ê¯{ö_g?úÛ¤ùÞéw«’4‰°É€…Z°HõÖ>èõQõ6e?úÛ¦Dûðw¤ß±JÒ¤eÀB&jeÀ"ÕØÜ]¢\½"û±Ø.åšë§ï9ÓïZ%i‚2`!“ µ2`‘ê«ÙÂìG`‡ô¾üéw­’4I°É€…Z°HõÔ>âg"†ýìG`Çô‹(|]ú«$MJ,d2`¡V,R -|n”|/ûq˜Ã[ÎÉ¿w•¤ É€…L,ÔÊ€Ešýú+–f?ê3ªsÒo§ß½JÒ$dÀB&jeÀ"ÍncßQUÙ:ÀŒª6®‰b‘Ç I³ ™ X¨•‹4{{íÕú»³s€YÑÿÆ!é÷°’4î°É€…Z°H³×àÚc³q€ÙS•Ñ^ö®ô»XIç XÈdÀB­ X¤Ù©sÂod?Þ³®¼ï[Ñš»sú¬$k,d2`¡V,ÒÌW,Ú#ª «³o€Zô¾ôÉô{YI× XÈdÀB­ X¤™opãIÙ6@mªîÆ(ö{uúݬ$c,d2`¡V,ÒÌÖù‡²k€Ú ¾óÅôûYIÇ XÈdÀB­ X¤™«ØûÅQmz û±HÑ9ñ¿§ßÓJÒ¸eÀB&jeÀ"Í\ƒoŸžýH¤©ÖßÅÂç¥ßÕJÒ8eÀB&jeÀ"ÍLÝÓþ(ûqH×ÿÚþé÷µ’4N°É€…Z°H3ô§ƒZk³g€|å ÚKßž~o+Iã’ ™ X¨•‹´ã n>-ûQhŒòÞ«£5wçô»[I‡ XÈdÀB­ X¤«sâof?ÆÓ;ç¦ßßJÒ8dÀB&jeÀ"mÅ¢DµáÞìÇ qªî†(ö{Uú=®$z,d2`¡V,Òö7¸î¸ìG ±7’~+I£ž ™ X¨•‹´}uŽûµˆªÊ~„­sܯ¦ßçJÒ(gÀB&jeÀ"mG ŸÕ£·g?¾W>|[´æïš¯+I#š ™ X¨•‹´íõWžý茌ޟN¿×•¤QÍ€…L,ÔÊ€EÚ¶ÚG½'¢*³]€ÑÑ/¢8àµé÷»’4аɀ…Z°HÛЂݦî€m3¸é”ü;^IÁ XÈdÀB­ X¤­¯ÿµý²Y€‘Õ9öýé÷¼’4j°É€…Z°H[Wû°·F ûÙ,ÀÈ*×~'Zóž™~ß+I£” ™ X¨•‹´ÍÝ%Êû®Í~\F^ïËÿ;ÿÎW’F(2°P+ééë]ðéìG`,TÝQìûÊô{_I• XÈdÀB­ X¤-Wøºˆ^+ûQƒNH¿û•¤QÉ€…L,ÔÊ€EÚBSsbxû%Ù)Àx©ªèý¾ü;`I XÈdÀB­ X¤§®{Ö_d?¢c©\s]´æîœ~,IMÏ€…L,ÔÊ€EzòŠ}^UûÑìG`luÏúXú]°$5=2°P+鯩—g IDATÉÜ|Zöã 0ÖªÖÚ(í‘~,IM΀…L,ÔÊ€EzbÿoÙ&ÀDèý€ô;aIjr,d2`¡V,ÒVìµ{TëïÉ~4&ðíC~<ýnX’šš ™ X¨•‹ôƒõW,Í~,&ÊðÖóÒï†%©©°É€…Z°HÿUç¨÷FTeöc 0q:Ç ýŽX’š˜ ™ X¨•‹ôÍÝ%ÊûoÈ~$&RùÈ÷¢5ïYùwÅ’Ô° XÈdÀB­ X¤Çê}ù²G€‰Ö;ÿSéwÅ’Ô´ XÈdÀB­ X¤gD±ß«£ênÌ~&ZÕYÅ’—¤ßKR“2`!“ µ2`‘žƒ›OË~ˆˆþU‡¦ßKR“2`!“ µ2`Ѥ×ùü¯d?†ü§ríÏüDúݱ$5%2°P+Mtówò¡[³C¾Ïð;gæßKRC2`!“ µ2`Ñ$×»d^ö#À“èýóéwÈ’Ô„ XÈdÀB­ X4©µz}Ä “ýð$ÊÕ+¢55'ý.Y’²3`!“ µ2`Ѥ6¼õÜìÇ€-èžúéwÉ’” ™ X¨•‹&±îI¿“ýèð4ªuwFkþ®éwÊ’”™ ™ X¨•‹&®Ï™þ‡š¯÷•Ì¿W–¤Ä XÈdÀB­ X4iõ¯Ø7û±`+UuQìý¢ô»eIÊÊ€…L,ÔÊ€E“Tû 7D ºÙÛ åÁé÷Ë’”• ™ X¨•‹&©áwÏÏ~äØVÃ^´~cú³$edÀB&jeÀ¢I©sÂod?nl§Áͧ¥ß3KRF,d2`¡V,šˆæ=+ʇnÍ~ÜØ£Þ›ß,I5gÀB&jeÀ¢I¨÷•Ì~ÔØAåêoFkjNú³$Õ™ ™ X¨•‹Æ½bÉK£ê¬Ï~Ԙݓ?œ~ï,IufÀB&jeÀ¢qoð­c²3fHõèíÑš¿kúݳ$Õ• ™ X¨•‹Æ¹öÒ·GTeöcÀ êÿ÷é÷Ï’TW,d2`¡V,ç†w^žýˆ0êö£Q,Þ3ýZ’êÈ€…L,ÔÊ€EãZ÷´?Ì~¼˜%ý¯íŸ~-IudÀB&jeÀ¢±lÁnQ­»+ûñ`¶ {Ñ>èõù÷Ñ’4˰ɀ…Z°hë_º ûÑ`– nüBú}´$Ív,d2`¡V,·Šý_Ñog?Z̶ªŒögß’~/-I³™ ™ X¨•‹Æ­ÁõÇg?VÔd¸ryú½´$Íf,d2`¡V,§Ú‡½uzqÀähùîôûiIš­ XÈdÀB­ X4N W]˜ýHP³áª‹Òï§%i¶2`!“ µ2`ѸÔ9þ׳'’tŽ}ú=µ$ÍF,d2`¡V,‹¦vŠrÍuÙIÊÕ+¢55'ÿ¾Z’f82°P+CÝ3?šý(¬sÂÓï«%i¦3`!“ µ2`ÑÈ·`·¨Öß“ý(¬|à¦é_ìN¿·–¤Ì€…L,ÔÊ€E£^ïâË~Œhˆî©¿Ÿ~o-I3™ ™ X¨•‹F¹bÉK¢ênÈ~ŒhˆòáÛ¢5w—ôûkIš© XÈdÀB­ X4ÊõW,Í~„h˜îY‘~-I3• ™ X¨•‹Fµö!oŠö³!¦Zw´æïš~-I3‘ ™ X¨•‹FµÁw¾˜ýøÐP½/}2ý[’f"2°P+싺ª²ªj=Å^ÏO¿Ï–¤Í€…L,ÔÊ€E£ØpÕ…Ù ×»ðŸÓï³%iG3`!“ µ2`ѨÕ9úç³F@ÕYÅâ=Óïµ%iG2`!“ µ2`Ѩ5¼ûÊìÇ€Ñÿê¢ô{mIÚ‘ XÈdÀB­ X4JuNüÍìG€QÒkE±ÏËÒï·%i{3`!“ µ2`ÑÈ45'Ê5×g?2Œ˜þ•çßqKÒvfÀB&jeÀ¢Q©{êd?.Œ¢A'Šý_“~Ï-IÛ“ ™ X¨•‹F¢¹»DùÐw³FÔàš£òïº%i;2`!“ µ2`Ñ(Ô=ëcÙ £lØâÀ×¥ßwKÒ¶fÀB&jeÀ¢Æ7ïYQ=zGö£Àˆó+,’F12°P+5½ÞùŸý˜0ü ‹¤Ì€…L,ÔÊ€EM®Xø¼¨6=ý˜0&ü ‹¤QË€…L,ÔÊ€EM®wÁ§³Ɖ_a‘4b°É€…Z°¨±-|nT­µÙcfpõ²ü;pIÚÊ XÈdÀB­ XÔÔz_ùÇìÇ€qý–~4ý\’¶&2°P+5²ùÏŽjã}Ùcjpõùwá’´°É€…Z°¨‰õÎÿTö£À8ó+,’F$2°P+5ò×W6Ü›ýh0æú+Ï¿—¤§É€…L,ÔÊ€EM«wÞ'² &Á Åþ¯I¿—¤-eÀB&jeÀ¢F5ר6¬Î~,˜ý«Í¿—¤-dÀB&jeÀ¢&Õ;÷o² &É ž¯H¿—¤§Ê€…L,ÔÊ€EiÞ3£ZwWö#À„é_±oþ¹$=E,d2`¡V,jJݳÿ:ûq`õZQìýâô{rIz² XÈdÀB­ XÔ˜__yôŽìÇ€ Õ¿tAþ]¹$=I,d2`¡V,jBÝ3?šý(0Áªö£Qìµ{ú}¹$ýp,d2`¡V,Joj§(\™ý(0ázþsþ¹$ýP,d2`¡V,Ê®{òïf?Uñp Ÿ—~o.Iߟ ™ X¨•‹²+ï¹*û1€i½óÿ>ýÞ\’¾?2°P+eÖ9ö—³x\µqM´æ?;ýþ\’þ32°P+e6üÞW²øݳÿ:ýþ\’þ32°P+eÕ>ì­U•ýÀ¨½#ZswI¿G—¤Í°É€…Z°(«ÁͧfüàIuOûÃô{tIÚœ ™ X¨•‹2*ü±ˆrýñ€'UÞc´¦æ¤ß§K’ ™ X¨•‹2\½,û£[Ô9þé÷é’dÀB&jeÀ¢º+öyYD¿ýÑ€-ÞùÕô;uI2`!“ µ2`QÝõ/_’ý±€­Ò>ê=é÷ê’&;2°P+ÕY±×îQuÖgì`« Wž•~·.i²3`!“ µ2`QõÎÿTöG¶^UEûПL¿_—4¹°É€…Z°¨¶æîÕ£wdä Ù†½¨6Ýåƒ+£¼÷ꮺ(†+—ÇওcpÍ‘ÑÿúÑÿê¢è]ðéÇúÒßEwùÇëô?Žî)Ùr§ýÑãÿû{ç}âñÿs6ÿŸÙ¿ò éÿ;7ŸÃ[Ï‹á—Fyß·¦¿Çû%E&ÙàºÏçß±KšØ XÈdÀB­ XTWÝ“~'ûãõëQ=z{ ï¾ò±!ÊÕË¢é‚èû7Óß‘;ŸûÅhöSQìÿšh-|nú÷ö-6wç(–¼$Ú‡üx´|wtNüÍèžýWÑ»dÞôÿ»†·œåêoFµáÞˆªÌþŸ<Ìœaÿ±ïìÙßÉ%Md,d2`¡V,ª«á]_Ëþ¸ÀÌ*Q­»3†w\ƒëŸþ“îÙ>øØ(eñžéßÃÓš÷¬hôúè|î—¢ûÅÿýKçÇàºãbx÷×£j=˜ýÿs°ÍúWœÿ=[ÒDfÀB&jeÀ¢:òb`dõ‹(×\ƒoŸý+öþÅ‘ÎçezœÑš÷ÌôïÚ£Z±hh/ûÙé?{Ô¿láôÿ|ˇn(‡Ùÿ?OªêmŠbñ Ó¿KKš¼ü{62°P+ÕÑà†³?ê°EÕ†Õ1¼ýâè¯X½ó>1=R)xm´¦æ¤Ÿž¨æïí¥oîéý+ö‰áª £j?’ýñ€i½ ÿ9ÿ;³¤‰Ë€…L,ÔÊ€E³]±ß«¦ÿ>(4AÕY7ýç-W½sþgtŽþùé_ÉþÞ¬§ùçŠ_Ý“?ýË—<6jénÈþ(0ªk¦G×Ùß%MV,d2`¡V,šíú—ïý1`BUëîŠáwÎŒÞÅÿ~#Šý$ýû±f¨©¢ýÙ·LÿI§ÁuÇEùÐw³?nLˆî™Íÿ>,i¢2`!“ µ2`Ѭ¶à9Qg̘գwÄàæS£wÁ§ûó?{¿(ÿû°j­XòÒèžò{Ñ_qx”Þ’ý‘`L•k¿ãOJª52°P+Íf›ÿkH˜qý"†w^ý+ö‰Î>Å>/Oÿî«æUìûŠèžþÇ1¸öب6Þ—ý©`Œlþ…Çìï»’&'2°P+ÍZSsüẄjÃêÜpbôÎýÛhþŽhÍÝ%ÿû®F®öaoÞÿÃÛ/‰ö²?ÖŒ°á—¦¿•49°É€…Z°h¶êÿì7#ªZO ®ÿ÷èžõÑ>èõéßm5~ ŸÝ“wúsVµÉþÈ0‚¦Çõ øn+iü3`!“ µ2`Ñl5¼íËÙoFDµáÞÇ+g~Ô`Eõ7w—è|î—¢ÿC¢ZwWöãÀˆÜtrþwYI‘ ™ X¨•‹f£ÍÿÒ!ª2ûã @SõÛ1\uQô.øôcÿÕâÔœôï°ÒÖ>ôÍÑ»d^”¬Ê~Rh²rÅ?–þýUÒøgÀB&jeÀ¢Ù¨ÿõ²?Ú4LùÀÍÓß;Çýj´ì–þUzÚ¦æDç¨÷FÿªC£j­Í~„h Í¿â—þ½UÒØgÀB&jeÀ¢oÁnþ†<Ã^ ¿wAôÎù_Qìÿšüï©ÒŽþ™¡>ƒ›O‹t²Ÿ.¢êmŠbÑùßW%u,d2`¡V,šéºgþyöÇ€$›‡ÌƒNˆî)‰b¯ÝÓ¿›J³ÑæAÑ=û¯¢\½"û‘ z_þßéßQ%w,d2`¡V,šéÊ{¯ÉþXP£jÃêéŸÍî|î§¥"ûû¨TgíÃ߃oÑ/²E’TÞ­¹;§7•4¾°É€…Z°h&k/{WöG€:G+G½7ZS;¥•²Ûü‹CÝåò›²Ot¾ð¡ô裸Æ72°P+ÍdƒëÏþH0KŒV¤møU–Íÿl4ìg?¶ÔdxÇ¥éßC%o,d2`¡V,š©Š½_1èd¤˜AUgýôŸGéó F+Ò6VìûŠè]<5=þ`üµû©ôï ’Æ32°P+ÍT½ >ýq`&”îº(ºgüi´>7ý{¦4òÍ{æôóT®ýNöÓ À,|ëèüïž’Æ22°P+ÍHS;EõèíÙgv@¹zEôÎûDK^’ÿýRǦvŠÎI¿å½Wg?î̆~{ú—ÊÓ¿wJ» XÈdÀB­ X4uNø`öG€íýA×í¥oKÿN)MR£ÞÃ[ÎÉ>˜a½ ÿ9ý»¦¤ñË€…L,ÔÊ€E3ÑðÖó²?Êl­ªŠá—E÷ô?ŽÖüg§—”&¹ö²Ÿáʳ"ª2ûd`TVOÿ Éìï™’Æ+2°P+íhÅþ¯‰(‡ÙežFÕZý+ö‰öÁoLÿ)ékúæ\ÿïþÙ ` tOýýôï—’Æ+2°P+íh½KæfŒØ‚ò¾k£»üãÑZ°[úwGI[®ý™ŸˆÁͧMÿR£ix÷•éß+%W,d2`¡V,Ú¡¦æDùȪì1?lØ›þ—àÏÿ?ùß%msíeïšþS_Œ¦Í*2û;¥¤ñÉ€…L,ÔÊ€E;Rçó¿’ýàûT×LÿB^±ÏËÓ¿+JÚñ:'þf”Üœ}´°7œþ]RÒødÀB&jeÀ¢ipó©Ùa6ÿ™ ‡o‹Þ—>éÏIãØÔNÑ=å#Q=z{öQÀÖö£ØïUùß%%E,d2`¡V,ÚÞŠ½_1èf„&Úæ?1Ò9á7¦ÿ´cö÷CI³Üü]£wþ§¢*Ê>zØ ýKç燔4°É€…Z°h{Û|q @‚ªŒá-çDûÈw§'”TÅ¢=¢ÿC"ÊaöiÀT­µÑšÿìôï’F?2°P+moåÚog|&˰ƒoíƒ^Ÿþ]PR~íÃßåêofŸLlA÷Œ?KÿÞ(iô3`!“ µ2`ÑöÔ>òç²?º“cØ‹ÁõÇGû 7¤”Ô°¦æD÷Œ?þ¯{hžrÍuùß%|,d2`¡V,Úž6ÿ—¿Ô0\¹æÈ(ö{uú÷?IÍ®XüBV ¡:G¿/ýû¢¤Ñ΀…L,ÔÊ€EÛZ±ðyQõ6etÆ× ý+ŽbŸ—§÷“4z—šåêÙ§ßgpóiéß%v,d2`¡V,ÚÖºg},ûc 0žÊA ¾utû¿&ý;Ÿ¤nj§è.ÿ˨:ë²O56+þ9OÒeÀB&jeÀ¢mmx÷•Ù[€ñR•1¸éähò¦ôïz’Ƨb¿WÅð»_Ê>ለþû¤?”4º°É€…Z°h[jô†ˆªÊþØŒá­çE{éÛÒ¿çIߺ_ü~ YU<­»¥7”4š°É€…Z°h[ê_:?û# 0Êû®Îç~1ýû¤É¨Øçå1\¹<ûè˜hÝ3þ,ý{¡¤ÑÌ€…L,ÔÊ€E[ÝÔœ(Y•ý‘iÕÆû¢»üãÑš»sþ÷;IW÷”DÕ~$û(˜Hû¯Lÿ>(i43`!“ µ2`ÑÖÖ9ú}ÙW€ÑÕ/¦ÿæy±×óÓ¿×Išìü @BVÒödÀB&jeÀ¢­mpõ²ì+À詪\÷ù(ö}eú÷9IúþºgþyTÝÙ§$ÀDé¯Xšþ=PÒèeÀB&jeÀ¢­jÞ³¢*Îþ¸Œ”rÍuÑ>ê=ùßå$é)*øÑ(ï¹*û¸˜›Ä~™SÒ¶fÀB&jeÀ¢­©{ò‡³?ª#£j?½/}2ZswNÿ'IOÛÜ]¢wɼˆªÌ>>&Bwù_æ”þ{÷ow]ßù~ÂEªG­ì´£¶cë¡u´õqZ5ÇÖí´iNm;CµµÌôt¬¶Öb{ÆZOÛ  !CÂÍ4 \¢B0*BŒ—¡ (—€ɺýÖZ¿ß÷<öÎЇVAÙßÏw­õ|=Ïÿ¿ìõÞÙë%,ŠÌ€EY3`á‰n»<ú©J’$Æ×mY•Ú'=?ü~Ø_Ýó#5{wFÿ$•$Iûêû¶„ß~Àh1`Qd,Êš ?JûÄç¥4ìG?UI’¤¢«wÜ0û¢o7€§¢ýŸLÃí¢¤J’$}þÿ#°? X™‹²fÀÂR}ú¯¢Ÿ©$IR¹õ;³_½Ñš>4ün8 ¼ï+…êaôOXI’¤±mpýÙñw02 X™‹²fÀÂRûkÑÏT’$©È†w_›:Ë~6ü^˜ ÝsßšG¾ý£V’$i<ë·Sû„g‡ß|Àh0`Qd,Êš §³ì碟¨$IRq5­ï¤Þ¥~«̵öI/Hû¿ýcW’$i,«®øËð{ ,ŠÌ€EY3`áñÌþÚhI’$ýKƒ›/JíŸ~§d3}hêõŒè¿’$IcW½óæø[ ,ŠÌ€EY3`áñÔ»n~¢’$IEÔtò[W€‰6ó30õ;Ñ?Ž%I’ƪîÊùáwP>EfÀ¢¬°ðX:yeôó”$I*¢áíëRû䟿ϢuÎ|ujvßýcY’$illù§ð(Ÿ‹"3`QÖ Xx,ý/žý<%I’Bkº»Sï²w„ße%™ôÕ÷~9úG´$IÒx4è¥öIÏ¿ñ€²°(2eÍ€…ÇR?xGôó”$I kxÇU~ë ÀcYtXÜp^ôjI’¤±¨úìÿßE3`Qd,Êš ?LçþÑOS’$)¦zªõÓ©5uPøMPº™ßR•†ýèŸÜ’$I#]ýà7Skj^øm”Ë€E‘°(k,ü0ýëN‰~š’$IÙkº+uV¼6ü%ÝóÞ8û•k’$IzòuÏýõð»(—‹"3`QÖ XøSóRóðöè§)I’”µÁ–U©}Ü3âo1€Ô9ý©Ù}oôrI’¤‘mpóEá7P.EfÀ¢¬°ð¯Íü©cI’¤I©é=’zýAø 0êÚüw©Þµ5úǺ$IÒh6¬R{é Ão: L,ŠÌ€EY3`á_ëo:-úYJ’$e©Þukê,?*üþ힆w]ýã]’$i$«>ÿþð{(“‹"3`QÖ Xø>S¥æ‘oG?KI’¤,_ÔZ|Düý0n¦Ÿ–7]ýc^’$iäjºköŸÑ‡ßs@q X™‹²fÀÂ÷êžû†è')I’4·õ;©÷©·‡ß]cmj^ªÖOGÿÄ—$I¹º«~+þ–ŠcÀ¢È X”5¾Wÿ+‰~’’$IsVým¾2 £jí»Rª‡Ñ?þ%I’Š®é<˜†ßølê_s\êœñªð(‹"3`QÖ XøSó|}$IÛ†·]‘ÚÇ?+þæ˜0½ý~JÃ*úc@’$©Œú4¼çK©¿iYê]òG©ó¡~¯å3`Qd,Êš ê¬xMôs”$I:ð5MêoXê{ÄÍü*ü™Y#I’4i5Ý™[V¥jݱ©»r~j-:,ü6F‹"3`QÖ XxTÃÉÑÏQ’$é€ÖT{Sïãÿ%üÎàߤîÙ¯OMï‘èI’¤9«Ù³# ·­MÕúéÔ]½ µ—<'üƃ‹"3`QÖ XxTýÀíÑÏQ’$é€þ)·Î鯿±øþèÚ´¿ý!I’ô”›æ·oÜ÷U@ÚK ¿µ€ñeÀ¢È X”5ftNÿ…è§(I’tÀªïÝ”Ú'½ üÆàu–•š=÷ETH’$=ñ†ýTïÚš›W¤Þšcfï_S ädÀ¢È X”5fTëF?EI’¤Òà–‹SkñÓÃï+[gÙÏ¥æ‘oEdH’$=æoôlY•ªuǦîÊù©µèððû ˜l,ŠÌ€EY3`aF}ß–è§(I’ôÔjšÔß°4µ¦æ…ßVühíS^œêïˆþô$I^³gGn[›ªõÓ©»zAj/ynøð¯°(2eÍ€…ö)/‰~†’$IO­A/õ.ýãð» €ýÓþÀO¦úÛ£?E$IÒ„Ôtw§áW¥þµKR÷Â7§öÉ/ ¿‡žEfÀ¢¬°P}æo¢Ÿ¡$IÒ“®é<”ºg¿>ü¦àÉiàßúM,’$éÀ7è¥ú[_Iý¯œžzkŽ™ý C¿±U,ŠÌ€EY3`a¸}cô3”$IzR5{îK¼2üžà©ið§RóÐ]Ñ+’$iÄ¿ hpË%©ZwlꮜŸZ‹¿qEfÀ¢¬°L¶öÒ¦T£Ÿ¡$IÒ~7ó§õ;ú™ð{ €£}Ê‹SóðöèI’4"c•á¶µ©Z?º«¤ö‰?~ËÌ%EfÀ¢¬°L¶Þeý%I’ö»ú[_MíŸ~Kp`ÍüjÿfïýÑ3’$© šîî4¼óêÔÿ≩{áïÎ~ý`ôÍ›‹"3`QÖ X&Ûð¶+¢Ÿ $IÒ~5ó.ÛÇ?3üŽ`n±H’4ÁÕƒTïÚš[V¥ÞeïHåG¥ÖÔAá÷ @4EfÀ¢¬°L°ÅOO©ßŽ~‚’$IO¸™_ÝZtXüÀœê|ä?¤¦ýÝèI’”á«€·\’ªuǦîÊù³ÿÌ:ú(‘‹"3`QÖ X&W÷ŸþSôó“$Iz nþxj-<$ü† ίJMç¡èI’t€jöÜ7û‡ªõÓ©»z¯…Ø,ŠÌ€EY3`™\ý¯|$úùI’$=¡ןí×FL ÎŠ×¦Tµ¢?†$IÒ~Öôö¤á]_Hý KSïc¿ŸÚøÉð»`”°ý£Õe IDAT(2eÍ€er5ßýü$I’~dý¯ži¼0Áºç½1¥aýq$I’«zê][Ó`˪ٯêœùjÿà3`Qd,ÊšËdêœþ ÑOO’$éGÖßprøÝ@¼ÞšÿšRÓD,I’¤¦Iõ·§ÁM«÷UV¼&µ~+Œ;EfÀ¢¬°L¦êóï~z’$I[ÿK¿™(Guåû¢?š$Iš¸šîÃixÇU©Z?º«¤ö‰Ï ¿ &‘‹"3`QÖ X&ÓpûÆè§'I’ô˜õ7~/Pžþu§FDI’4¶5ÕÞÙnÜß´,õÖ“:Ë ÿì`EfÀ¢¬°Lžö’çÎ~/©$IR‰ ®?;µ¦æ…ßLhj^lYýQ%IÒèWR½këìçêìWùêÔZxpüg=?”‹"3`QÖ X&Oï’?Š~v’$I?´Á ç¦ÖÔAá÷›>4 ¿ù¹è,I’FªfÏŽ4ܶ6UWþ]ꮜŸZ‹ˆÿLà 3`Qd,ÊšËäÜtAô³“$IúfþäŸñ ODûøg¦zÇõÑ]’$YÓÚ•†·]‘ª«§RwÕoÍþFîèÏnžEfÀ¢¬°L˜…§¦ýÝèg'I’ô} ·]žZ ‰¿•í¥/LõƒwD„I’[ÕJû¿˜ú?˜zÚ§¼8ü3€Ï€E‘°(k,“eæ×CJ’$•ÔðîkSkÑááw£§sÚËSÓ}8ú£L’¤<ÕƒTß·% 6¯H½Oý÷Ô9ý³`1úó€¹gÀ¢È X”5–ÉÒÿÂâè''I’ô/Õ÷ÿsjŸðìð €ÑÕ=ç×RVÑi’$ðš=;ÒpÛÚT­ŸNÝóß”Z‹ÿÜ †‹"3`QÖ X&K}ï—£Ÿœ$IÒlõƒßœýú‡èû€Ñ7ó§Ð%Iåšîî4ܾ1õ7,MÝÕ Rû¤„¾PEfÀ¢¬°LŽ™?Ýœêaô““$IJÍÞûSû”—„ßGŒþ¦eÑo’$=±ªÖ¾±Êu§¦ÞÅoIíS_þ9 @Ù X™‹²fÀ29zÿÏÑÏM’$)¥~'uV¼&ü6`Ì,ú©I’¤ oæûÝ£o"&CgåëRt£?ú$IãÔ°Ÿê×§þ¦e©·æ˜ÔY~TjMÍ ÿÌ`2°(2eÍ€e2Tkÿ"ú©I’¤ næWh·¦ ¿‰˜½Oü·è?IÒ¨VS½óæ4¸þœÔ»ì©sÆ«Rká!áŸmL.EfÀ¢¬°L†á×?ýÔ$IÒ„Vg[jŸàæ ¿þWψþ”$@Íž³£ûjýô¾¯ZòœðÏ0ø^,ŠÌ€EY3`™ ™ý>VI’¤Ü5g¿Ê0ü`2Mš†Û7DJ’ ªé=’†Û7îû* ‹ŽNí¥/Œÿ¼€Á€E‘°(k,㯻r~ô3“$I“X=HÝóÞ~ 0ÙÚKœý“õ’¤ lØOõ®­i°yEê­9&u–•ZSóÂ?›`°(2eÍ€eüõ¿°(ú™I’¤ ¬ºâ/Ãï ˜Ñ=ûõ³ÿS’4ÆÕÃ}c•ÎK½ËÿúiI’¤1®í’ð{¤Î‡_6û›$i\köìHƒ[.IÕºcSwåüÔZüôðŸ½ÀcÀ¢È X”5–ñ4ó«>%I’æ¢zçÍ©µè°ð{´Þ'þ$úcV’HÍžûÒðë—¥êªHÝó#µOxvøÏXàÉ3`Qd,ÊšËZtXJƒ^ôÓ’$IãúÕAg¾:þÞ€92¸ù¢èO[IÚ¯šjïìfëoZ–zkŽÙ÷U@ü<EfÀ¢¬°ŒŸîÙÿgô³’$IcZuõTø­siæ·4»ïþÈ•¤^=Hõ®­i°eÕìW͎˧ ÿÙ Ì-EfÀ¢¬°ŒŸêÊ÷E?+I’4†Õ÷mI­…‡„ß:0׺ý)5MôG¯¤I¯iRýÀíipÓûÆ*+^›Z‹ÿ ägÀ¢È X”5–ñ3ܶ6úYI’¤q«©SgÅkÂïÈ¥ÿååÑŸ¾’&¬¦ûpÞqUªÖO§îê©}ÒóÃe0`Qd,Êš˘™š—šÖw¢Ÿ•$I³ú_úPü9-:<Õ;oŽþ–4¦5ÕÞ4ܾ1õ7-K½5ǤÎò£fÿ¹^øÏ> H,ŠÌ€EY3`/Ó^ý¤$IÒ˜Õì¾'µ{Fø¹uÎøÅ”†UôG±¤Q¯¤z×Ö4زjö«€º+ç§Öô¡á?ã€ÑaÀ¢È X”5–ñÒûäŸF?)I’4fu/ø¿ÃoˆR]õ÷ÑÅ’F¬fÏŽÙ¯ø®®ü»}c•ÅG„ÿ,F›‹"3`QÖ XÆËàús¢Ÿ”$I£·\~ß@¨…§á=×E$K*´¦µ+ o»"Uë¦îªßJí%Ïÿ¹ŒEfÀ¢¬°Œ—ú;Û¢Ÿ”$I—ªVjð§ÂïˆÖ>õ§SÓÛýÉ,)ºª•†w1õ¯;%õ.úƒÔ>åÅá?Ÿ€É`À¢È X”5–ñÑ>ñy)5Mô“’$IcÒÌW&Dß7PŠÞåïŒþh–”³z˜ê][Ó`˪T­;vßWM?-üg0™ X™‹²fÀ2>ºüNôs’$IcRýੵèððûŠ15/ ¿yeôG´¤9ªÙ³# ·­MÕúéÔ=ÿM©µøˆøŸ;ÿ‹‹"3`QÖ XÆGÃÒèç$I’Ƥîêß¿m 4íS^â«„¤1¨éîNÃígÿYZwõ‚Ô>éá?_‹"3`QÖ XÆÇpû†èç$I’Æ áíëÂï(UuÅ»£?ª%íOýö¾±Êu§¦ÞÅoMíS_þs`°(2eÍ€eL,<8¥ªýœ$IÒ¨WSgùÏÇß6Pª©ƒÒðîk£?±%ý°êaªwmMƒ-«RµîØÔ]9?µ¦Ÿÿsà)2`Qd,ÊšËxè|ä•ÑOI’$AƒÍ+Âï(ÝÌophª½ÑÛÒÄ×ìÙ‘†ÛÖ¦jýô¾¯:áÙá?æ‚‹"3`QÖ XÆCï²?‹~J’$iÄ›ùqí“_~×À(¨>ó7ÑÝÒDÕôÙ÷U@–î«,}aøÏ€\ X™‹²fÀ2›WF?%I’4âÍüÉÕè›Fê«„¶oŒþø–Ƴa?Õ;®OýMËRoÍ1©³ü¨Ôššÿ÷=@EfÀ¢¬°Œ‡ú¾£Ÿ’$Iáš½÷§öqÏ¿i`”tN{yJƒnôǸ4ÚÕÃTï¼9 n87õ.gêœñªÔZxHøßß%1`Qd,ÊšËXüôÙ?™"I’ôd«ÖÓÀª>ÿþèqi¤jÞž·\’ªÏ½7uÏùU#j€'À€E‘°(k,£¯³òuÑÏH’$pÍž³ƒØè›FÒÂCR}ÿMÑçR‘5½Gf¿jkö«€.::µ—ÿ÷,À2`Qd,ÊšËè«Ö½'úI’¤®Zûá÷ Œ²ÎY¿’RSG¤K± û©Þµ5 6¯H½5ǤÎò£Rkj^øßŸãÀ€E‘°(k,£opÓÑÏH’$hÍî{RkÑaá÷ ŒºÁ×ΊþX—²Öõ¥)õÛÑõÒÖÔ©ÞukÜøÑT­}×ì¿ñÛøFƒ‹"3`QÖ XFÛà–‹£Ÿ$IÁªõ ÃïWþ°‰J¨Ù³# ·­MÕúéÔ]½ µ—<7üï žEfÀ¢¬°Œ¶úÛ£Ÿ$I±šjojŸøãáw Œ­éCS½óæè|MPMwwÞqUê_»$u/|sjŸüñpÀ°(2eÍ€etµ{Æì¯•$IÚŸú_úPøã®»r~JMý±¯q¬¤z×Ö4ز*õ.{Gê,?*µ¦ óÌEfÀ¢¬°Œ®ÎÊ×E?I’4j û©ýÁŸ ¿c` nº ú“_£^S§ú;ÛfÇ*ÕïN³~9µ¦Ÿþ¶ÈË€E‘°(k,£«ºâ/£Ÿ$I±fþEZô “¢½ôÈÙ¯v‘žhÍžûÒpÛÚT­ŸNÝÕ |í#³ X™‹²fÀ2º›WF?I’4bÍþ©Ýî˜Õçþ6úã_…ÖT{ÓpûÆÔß´,õֳ變 x³”Ç€E‘°(k,£«þöæèç#I’F¨áö á÷ Lœ…‡¤zçÍÑg€¢«©ÞµußW­;6uÎ|ujMÿ> ,ŠÌ€EY3`Q IiÐ~>’$i„ê~ì÷âo˜@ÝóÞ}(sÍžipË%³c•îÊù©µøéáï€ÑeÀ¢È X”5–ÑÔ9ý¢ŸŽ$I¡š‡ïN­…‡ß00©[/>4G5{îKÃmkSµ~:uW/HíŸþÞ/,ŠÌ€EY3`M½Kÿ8úéH’¤ªZ÷žðû&Yûƒ?•RÕŠ> ôkª½i¸}cêoZ–zkŽIåG…¿-ÆŸ‹"3`QÖ XFS㣟Ž$I‘šÞžÔ>þYá÷ Lºêªˆ> ´? û©Þq}êõÌÔûÄŸ¤ÎòŸO­©ƒÂߓǀE‘°(k,£ixÇUÑOG’$H3ÿÒ%úvþMj-:,ÕÞ}è‡Õ4©þî7ÒঠRµîØÔYñÚÔZtxü›gÀ¢¬°Œ¦¦õè§#I’F¤Î鯿]€}zûýèÓ@3{•½;ÓpÛÚT]ý©ûÑßLí%Ï ðX X™‹²fÀ2zÚ'½ úÙH’¤ix÷Ãoàû ï¼:úD˜¬ªVnߘú›–¥ÞšcRgùQ©55/üÀeÀ¢È X”5–ÑÓ=÷×£Ÿ$I‘z¿5üv¾_çŒW¥ÔÔÑgÂxVR½kklY5ûU@Ý•óSkúiáÿ›ÀSaÀ¢È X”5–ÑS]ñîèg#I’F fïýþ… jpÃyѧÂXÔìٱ變ÖO§îùoJ­ÅG„ÿo š‹"3`QÖ XFÏàkÿ3úÙH’¤¨Íñáw ðõ—¾05½G¢Ï…‘ªéîNÃ;®Ú7VY½ µOz~øÿŽƒ‹"3`QÖ XFÏpû†èg#I’J¯©Sû”—„ß-Àc«®þÇ苡ܪÖì?ÿè_wJê]ôî&š‹"3`QÖ XFOÓy0úÙH’¤ÂÞyuøÍü‹Ÿžš‡·GŸ ñÕÃTïÚš[V¥jݱ©»r¾¯A€ïaÀ¢È X”5–ÑÒ>ùEÑOF’$@½Kß~·?Zï’?J“V³gGn[»ï«€ÎSj->"ü(™‹"3`QÖ XFËÌ?Ø‘$Iz¼šînÿ"FÅÔ¼4¼çº4ÎwÉpûÆÔß°4uW/Hí“^ÿ×FŒ‹"3`QÖ XFKµî=ÑOF’$Þ`óŠð›xâ:+_—Æ¢~{ßXåºSSïâ·¦ö©?þׯ‹"3`QÖ XFË`óÊè'#I’ ¯sÖ¯„ß,ÀþÞúÉ4RÕÃTïÚš[V¥jݱ©»r~j-:,ü¯#Œ#EfÀ¢¬°Œ–á=_Š~2’$©àên ¿W€ý×Yö³)ÕƒTjÍži¸mmªÖOïû* žþ× &…‹"3`QÖ XFKÓ}8úÉH’¤‚«>ÿþð{xrf¾°„šöwÓðöϤþ§îêßNí“^þ×&™‹"3`QÖ XFGû䟈~.’$©äš&µO}iøÍ<9í“_”RÕÊ{?ô;ixÏu©ÿ¥§Þ%˜:ú™ð¿À÷3`Qd,ÊšËèèžûëÑÏE’$\}ï¦ð{xjú×?‡ÇÂ0Õ»¶¦Á–U©ZwlꮜŸZ‹ ÿï <>EfÀ¢¬°ŒŽÞåïŒ~.’$©àfþETô½<5í㟙š½;ÈmÐìÙ‘†ÛÖ¦jýtê®^ÚKžþߨ,ŠÌ€EY3`ýëN~.’$©Ôšzöë£ïà©›¥î÷)Ð{$ ·oLýMËRS{é‘áÿ=€ÀE‘°(k,£cxÛ§£Ÿ‹$I*´áW‡ß*À2}hªüæã|ð÷÷}Ðæ©·æ˜ÔY~TjMÿŸ˜,ŠÌ€EY3`õw¿ý\$IR¡õ>õöð[8pz—üá¿|Î7Ý™[VÍþf–îÊù©µèððÿ|@>,ŠÌ€EY3`Ó‡¦T¢Ÿ‹$I*±zÚ'þxü½8SóR÷œ_MíãŸÿŸeÀ¢È X”5–ÑÐYösÑOE’$ÚðÎõá· 07 X™‹²fÀ2ºüNôS‘$I…6óuÑ· 07 X™‹²fÀ2ªÏ½7ú©H’¤BkŸúÒð[˜,ŠÌ€EY3` ƒÍ+£ŸŠ$I*°úþ›Âï`î°(2eÍ€e4 ï¾6ú©H’¤ëaqøÌEfÀ¢¬°Œ†fïýÑOE’$XçÌW‡ß)ÀÜ1`Qd,ÊšKùÚÇ=#ú™H’¤kùVjMÍ ¿U€¹cÀ¢È X”5–òuNEô3‘$I6ؼ2üNæ–‹"3`QÖ XÊ×½ðÍÑÏD’$XÃï`n°(2eÍ€¥|Õgþ:ú™H’¤Òª‡©½ä¹áw 0· X™‹²fÀR¾þ¦Ó¢Ÿ‰$I*¬ú[_ ¿Q€¹gÀ¢È X”5–ò o»"ú™H’¤Âê_{BøÌ=EfÀ¢¬°”¯Þukô3‘$I…Õ=ç×Âo`î°(2eÍ€¥pSóRê·£Ÿ‰$I*©ª•Z‹‹¿S€9gÀ¢È X”5–²µ—ýD$IRa oûtøäaÀ¢È X”5–²uV¾.ú‰H’¤Âª>÷ÞðÈÀE‘°(k,eë]ú¶è'"I’ «³â5á7 ‡‹"3`QÖ XÊV]=ýD$IRIõ;©5ý´ðÈÀE‘°(k,eÜp^ô‘$I5¼ûÚðûÈÇ€E‘°(k,eÞõ…è'"I’ ªí’ðûÈÇ€E‘°(k,e«üfô‘$IÕý§ÿ~Ÿù°(2eÍ€¥`SóRêw¢Ÿˆ$I*¥¦Ií%Ï¿Q€l X™‹²fÀR®öIÏ~’$© ê7‡ß'@^,ŠÌ€EY3`)WçŒ_Œ~’$© ›W†ß'@^,ŠÌ€EY3`)W÷Â7G?I’TP½ËÞ~Ÿy°(2eÍ€¥\ÕïŽ~’$© :g¾:ü>ò2`Qd,ÊšK¹ú–F?I’TJÃ*µ~Ÿy°(2eÍ€¥\ƒ¾0úyH’¤Bªï»1ü6ò3`Qd,ÊšK¹†Û7D?I’THƒëÏ¿M€ü X™‹²fÀR®æá»£Ÿ‡$I*¤jí_„ß&@~,ŠÌ€EY3`)ÔÔA) «èç!I’ ©sÖ/Çß'@v,ŠÌ€EY3`)S{é‘ÑOC’$•R=H­ÅO¿O€ü X™‹²fÀR¦Î™¯Ž~’$©ê]·†ß&@ EfÀ¢¬°”©»zAôÓ$I…4ØziømÄ0`Qd,ÊšK™z—ýYôÓ$I…Ô¿æ¸ðÛˆaÀ¢È X”5–2UWOE? I’TH½Kþ0ü6b°(2eÍ€¥Lý¯žý4$IR!u>òÊðÛˆaÀ¢È X”5–2 nýDôÓ$I%ÔÔ©µøéá· ÀE‘°(k,eÞó¥è§!I’ ¨~ðŽð»ˆcÀ¢È X”5–25Ýý4$IR o»"ü.â°(2eÍ€¥L©ßŽ~’$©€ú?~—q X™‹²fÀRžöñÏŠ~’$©zŸüÓðÛˆcÀ¢È X”5–òtN{yô³$I…Ô=÷ ᷠǀE‘°(k,å™ùU’$I3µOyqømÄ1`Qd,ÊšKyz¿5úYH’¤ª©µððÛˆcÀ¢È X”5–òTëÞý,$IR5Ý~—± X™‹²fÀRžþ5ÇE? I’T@Ã;ׇß%@,EfÀ¢¬°”§ÿÕ3£Ÿ…$I* Áõç„ß%@,EfÀ¢¬°”g°õÒèg!I’ ¨ºêÂï –‹"3`QÖ XÊ3¼ëšèg!I’ ¨wéÛÂï –‹"3`QÖ XÊSï¼%úYH’¤ê¬|]ø]Ä2`Qd,ÊšKyš=÷E? I’T@íüÛð»ˆeÀ¢È X”5–ÂLÍKiØ~’$)º¦N­…‡Äß&@(EfÀ¢¬°”¥½ä9ÑOB’$P³wgø]Ä3`Qd,ÊšKY:~Yô“$ITßSø]Ä3`Qd,ÊšKY:+^ý$$IR ¿ñÙð»ˆgÀ¢È X”5–²t/øè'!I’ hpãùáw Ï€E‘°(k,eé}òO£Ÿ„$I* þO ¿K€x,ŠÌ€EY3`)Kõ¹÷F? I’T@Õº÷„ß%@<EfÀ¢¬°”¥ÍñÑOB’$Pïâ·„ß%@<EfÀ¢¬°”¥ÿ•Ó£Ÿ„$I* î9¿~—æŒÏ- IDATñ X™‹²fÀR–ÁM«£Ÿ„$I* Î²Ÿ ¿K€x,ŠÌ€EY3`)ËpÛÚè'!I’ ¨½ä9áw Ï€E‘°(k,enßý$$IRtMZ ¿K€x,ŠÌ€EY3`)K½óæè'!I’‚kº‡ß$@ X™‹²fÀR–f÷½ÑOB’$×ü.Ê`À¢È X”5–rô¿xbôs$IÔ9óÕáw PEfÀ¢¬°”£ÿååÑÏA’$PgùQáw PEfÀ¢¬°”cpÃyÑÏA’$Pû”—„ß%@ X™‹²fÀRŽÁ-—D?I’T@í¥/ ¿K€2°(2eÍ€¥ÃÛ?ý$IRµfø]”Á€E‘°(k,ånßý$IRµ~—e0`Qd,ÊšK9êûnŒ~’$)ºa~“å0`Qd,ÊšK9ên‹~’$)¸¦»;ü&ÊaÀ¢È X”5–r4o~’$)¸fïÎð›(‡‹"3`QÖ XÊ1ó/¬$IÒd×ìÙ~“å0`Qd,ÊšK9f¾2@’$MvÍî{Ão ,ŠÌ€EY3`)Gô¢Ÿƒ$I ®yøîð›(‡‹"3`QÖ X 15/¥¦‰~’$)¸úÁ;âï ,ŠÌ€EY3`)Ģ㟂$I* úÛãï ,ŠÌ€EY3`)Cû„gG?I’T@õw¾~—å0`Qd,ÊšKÚKŒ~ ’$©€ê·„ß%@9 X™‹²fÀR†ö)/‰~ ’$©€êûo ¿K€r°(2eÍ€¥ e?ý$IRÕ;n¿K€r°(2eÍ€¥ ¼2ú)H’¤ª¿ýµð»(‡‹"3`QÖ XÊÐ9ëW¢Ÿ‚$I* úÞ/‡ß%@9 X™‹²fÀR†îÙ¯~ ’$©€†÷|)ü.ÊaÀ¢È X”5–2tÏû¿¢Ÿ‚$I* à{°(2eÍ€¥ ÝþfôS$ITë+áw PEfÀ¢¬°”¡»ú·£Ÿ‚$I* úÛ›Ãï ,ŠÌ€EY3`)C÷Â7G?I’T@õ}7†ß%@9 X™‹²fÀR†ÞÇÿsôS$ITßÿÏáw PEfÀ¢¬°”¡wñ[¢Ÿ‚$I* z×Öð»(‡‹"3`QÖ XÊлômÑOA’$PýÀmáw PEfÀ¢¬°”¡÷‰?‰~ ’$©€ê¿~—å0`Qd,ÊšKzŸz{ôS$IÔÿÿE?I’THÝÕ Âo  ,ŠÌ€EY3`)ƒßÀ"I’­wÑÑá· PEfÀ¢¬°”¡ºò}ÑOA’$RoÍ1á· PEfÀ¢¬°”¡úìÿˆ~ ’$©z—½#ü6Ê`À¢È X”5–2TŸùëè§ I’ ©úÌß„ß&@ X™‹²fÀR†êÓý$IR!Uë§Ão  ,ŠÌ€EY3`)Cµö]ÑOA’$RÿºSÂo  ,ŠÌ€EY3`)CïòwF?I’THƒÍ+Ão  ,ŠÌ€EY3`)CïSo~ ’$©7_~›e0`Qd,ÊšKzŸü¢Ÿ‚$I*¤áíŸ ¿M€2°(2eÍ€¥ ½5ÿ5ú)H’¤BÞs]øm”Á€E‘°(k,eè]ú¶è§ I’ ©Þysøm”Á€E‘°(k,eè]üÖè§ I’ ©yøîðÛ(ƒ‹"3`QÖ XÊÐûø‰~ ’$©šÎƒá· PEfÀ¢¬°”¡û±ß‹~ ’$©”êAøm”Á€E‘°(k,eè®^ý$IRAµ~Ÿñ X™‹²fÀR†îGÿcôS$IÕ^zdø}Ä3`Qd,ÊšKºçüZôS$IÕYö³á÷ Ï€E‘°(k,eè¬xMôS$I5óJ£ï ž‹"3`QÖ XÊÐ9㣟‚$I*¨îyo ¿O€x,ŠÌ€EY3`)CgùÏG?I’TP½‹Ž¿O€x,ŠÌ€EY3`)CçÃ/‹~ ’$© z—¿3ü>â°(2eÍ€¥ íþ»è§ I’ ªºêïÃï ž‹"3`QÖ XÊÐ^úÂè§ I’ ªÝ)á÷ Ï€E‘°(k,eh/yNôS$I5¸ñüðûˆgÀ¢È X”5–B,>"ú)H’¤‚n»<þ>°(2eÍ€¥ Ž~ ’$© †÷\Ÿá X™‹²fÀRŽT£Ÿƒ$I*¤ú;ÛÂo ž‹"3`QÖ XÊ‘ªVôs$I…Ô´v…ß&@<EfÀ¢¬°”£i?ý$IR)ÕƒÔšš~Ÿ± X™‹²fÀRŽf÷=ÑÏA’$TûwL:EfÀ¢¬°”£~à¶èç I’ ª}êKÃï –‹"3`QÖ XÊQßwcôs$I5óL£ï –‹"3`QÖ XÊ1¼çºèç I’ ªûÑß ¿O€X,ŠÌ€EY3`)ÇðŽÏG?I’TP½Kþ0ü>b°(2eÍ€¥ï_ý$IRAUW¼;ü>b°(2eÍ€¥ƒ›?ý$IRAõ¿°8ü>b°(2eÍ€¥ƒÎ~’$© _;+ü>b°(2eÍ€¥ý¯|$ú9H’¤‚~ýSá÷ Ë€E‘°(k,åèoü@ôs$IUß»)ü>b°(2eÍ€¥ý/,Š~’$© š‡î ¿O€X,ŠÌ€EY3`)Guåû¢Ÿƒ$I*©ª~Ÿ± X™‹²fÀRŽjí»¢Ÿƒ$I*¬Öq?~£q X™‹²fÀRŽÞšc¢Ÿƒ$I*¬Î‡~&üFâ°(2eÍ€¥Ý 7ú9H’¤Âê¬|]øÄ1`Qd,ÊšK9ºç½1ú9H’¤Âê~ì÷Âo Ž‹"3`QÖ XÊÑ9ë—£Ÿƒ$I*¬Þå~£q X™‹²fÀRŽÎiÿ{ôs$I…U­Ÿ¿Q€8,ŠÌ€EY3`)Gû?ý$IRaõ¿zføÄ1`Qd,ÊšK9Ú'üoÑÏA’$ÖàÖO„ß(@EfÀ¢¬°dáÁ)5Mô“$I5¼çºøcÀ¢È X”5–²¤ªý$$IRAÕ~3ü>â°(2eÍ€¥,ÍÞû£Ÿ„$I*¨¦·'ü>â°(2eÍ€¥,õw¿ý$$IRaµ~£1 X™‹²fÀR–zÇ ÑOB’$VçÃ/ ¿Q€,ŠÌ€EY3`)ËðÎõÑOB’$V÷Ü7„ß(@ EfÀ¢¬°”epë'¢Ÿ„$I*¬Þ¥o ¿Q€,úÿÙ»§ïëºÎãsßᢕffe–måjŒS͘³¦t;ì6ZyXó°eë®5;™­MµYmyÁÍQ@å¤È¡ÐoÄ@Do½Å›Cˆ"7¯ßùðÝAÇõÄá>\×çõùü~çÌã?ø\s½g¾¯k®d,*šK]&WŸ”~’$©²FüMüF2 X”Ì€EE3`©ËøCoL? I’TYãËŠß(@†‹’°¨h,u}`ßô“$I•5Ù¶%~£,JfÀ¢¢°ÔeôÞ?O? I’TY³[.ß(@†‹’°¨h,užùòô“$I•5¿çæød°(™‹ŠfÀR—Áæç¥Ÿ„$Iª­é¸[]Ù¿S€ò X”Ì€EE3`©ËàÄg¥Ÿ„$Iª°Þ¡?¿S€ò X”Ì€EE3`©KÿÍ?—~’$©ÂúÇý|üNÊ3`Q2Í€¥.½×ÿxúIH’¤ l~nüNÊ3`Q2Í€¥.½“~’$©Â†g¿2~§å°(™‹ŠfÀR™• ]7›¦Ÿ…$Iª¬ñÅæï 8%3`QÑ Xê3ïß•~’$©²&WŸ¿Q€ò X”Ì€EE3`©ÏìËŸI? I’TYÓ/ˆß(@y,JfÀ¢¢°ÔgvˇÓÏB’$UÖìŽOÆo <%3`QÑ Xê3½þÜô³$I•5ïïˆß(@y,JfÀ¢¢°ÔgrÍ)ég!I’*¬wà£ãw P–‹’°¨h,õo="ý,$IR…õyZüNÊ2`Q2Í€¥>£ ÿ!ý,$IR… NyNüNÊ2`Q2Í€¥>óÿ$ý,$IR…Ý#¤ï ,%3`QÑ Xê3<íEég!I’*lüÁCâw P–‹’°¨h,õœôëég!I’*lòñÍñ;(Ë€EÉ XT4–úôßüség!I’*lºý²ø”eÀ¢d,*šK}z‡ÿhúYH’¤ ›ßsKüNÊ2`Q2Í€¥B›™~’$©ÆfÓnu¿Gäo %3`QÑ XêÔVÓOC’$UXï ?¿S€r X”Ì€EE3`©Ó|ÇMé§!I’*lpâ³âw PŽ‹’°¨h,ušÝòáôÓ$I6Üò‡ñ;(Ç€EÉ XT4–:M?ý/é§!I’*ltá?Äï %3`QÑ Xê4¹êøôÓ$Ivÿ¾S€r X”Ì€EE3`©ÓøâÒOC’$UØôÆóãw PŽ‹’°¨h,u½çÏÒOC’$UØìK×Åï %3`QÑ Xê4<íEé§!I’jlÜ‹ß)@9,JfÀ¢¢°ÔipÂ3ÓOC’$UZïÇÇo  %3`QÑ XêÔ?ê©é§!I’*­Ü3â· P†‹’°¨h,uêô}é§!I’*møŽÆo  %3`QÑ XêÕûéç!I’*ltþ_Çï  %3`QÑ Xê5¿{{úyH’¤ _ylüNÊ0`Q2Í€¥^³[¯L?I’TaÓ΋ß)@,JfÀ¢¢°ÔkzÝ9éç!I’*lvçõñ;(ÀEÉ XT4–zM>zBúyH’¤› »Õ•ñ[X,JfÀ¢¢°Ôk|ÉAéç!I’*­÷ú'Åo`ý°(™‹ŠfÀR¯Ñ¹¯N?I’TiƒÿSüVÖŸ‹’°¨h,õžþ’ôó$I•6<ëñ[X,JfÀ¢¢°Ôkpâ³ÒÏC’$UÚøââ· °þ X”Ì€EE3`©Wÿ¨ŸN?I’Ti“oŽß*Àú3`Q2Í€¥^½ƒ›~’$©Òf·\¿U€õgÀ¢d,*šKݺÉ0ýD$IR…Í¿rGüNÖŸ‹’°¨h,u›ßsKú‰H’¤Jëð½ñ[X_,JfÀ¢¢°ÔmvÛUé'"I’*­ÿ¦Ÿ‰ß*Àú2`Q2Í€¥nÓëÏM?I’TiƒÍÏ‹ß*Àú2`Q2Í€¥n“«OJ?I’Ti£óþ"~«ëË€EÉ XT4–º/98ýD$IR¥?|LüVÖ—‹’°¨h,uóªô‘$I•6½þ=ñ[X_,JfÀ¢¢°Ôm°ùyé'"I’*möÅOÅo`}°(™‹ŠfÀR·þ±OO?I’Tkã~·º²!~¯ëÇ€EÉ XT4–ºõ^÷ƒé'"I’*®wØã÷ °~ X”Ì€EE3`©Üʆ®› ÒÏD’$UÚàÄgåï`ݰ(™‹ŠfÀR¿Ù]ŸM?I’TiÃwÿqüVÖ‹’°¨h,õ›Þtqú™H’¤J_zhüVÖ‹’°¨h,õ›|üíég"I’*mò©wÅo`ý°(™‹ŠfÀR¿ñ_—~&’$©Òfw|"~«ëÇ€EÉ XT4–úÞógég"I’jmÜïVW6Æï`}°(™‹ŠfÀR¿Á©ÏO?I’Tq½×?)~¯ëÀEÉ XT4–úõ{Fú™H’¤Šœüñ{X,JfÀ¢¢°Ô¯÷ºJ?I’Tqóÿ$~¯ëÀEÉ XT4–¬lèºÉ0ýT$IR¥?ô†ü½¬ %3`QÑ XÚ0ßñ¹ôS‘$I•6½îìø­¬%3`QÑ XÚ0ýüÓOE’$UÚìKŸŽß*Àú0`Q2Í€¥ “oN?I’Tk“a·ºïwÅï`í°(™‹ŠfÀÒ†ñ¥‡¦ŸŠ$Iª¸Þ~"~¯kÏ€EÉ XT4–6ŒÎ}uú©H’¤ŠüÓ‰ß+ÀÚ3`Q2Í€¥ ƒS_~*’$©âFç¼*~¯kÏ€EÉ XT4–6øÅ$I’ªñÖ#ã÷ °ö|'T2Í€¥ ½CŸ~*’$©â¦×Ÿ¿W€µgÀ¢d,*šK#V6tÝd˜~.’$©ÒfwÞ¿W€5gÀ¢d,*šK;æ;nJ?I’TkÓq·ºß#â÷ °¶ X”Ì€EE3`iÇtû¥éç"I’*®Ä“ã÷ °¶ X”Ì€EE3`iÇäÚw¤Ÿ‹$Iª¸Á)ωß+ÀÚ2`Q2Í€¥ãKK?I’Tq£óþ"~¯kË€EÉ XT4–vŒÎyUú¹H’¤Š›|äã÷ °¶ X”Ì€EE3`iÇýÿ@’$éÁšÞtqü^Ö–‹’°¨h,íè½Oú¹H’¤Š›ßw{ü^Ö–‹’°¨h, ÙôÈ®›ÏÓOF’$U\ï Çæo`Ͱ(™‹ŠfÀÒ–ûÿ²Z’$éÁê¿åâ÷ °v X”Ì€EE3`iËì–ËÓOF’$UÜðÌ—Çï`í°(™‹ŠfÀҖɵ§¦ŸŒ$Iª¸ñ%Çï`í°(™‹ŠfÀÒ–ñ%¥ŸŒ$Iª¸É§Þ¿W€µcÀ¢d,*šK[†ïþãô“‘$I7ûâ¶ø½¬%3`QÑ XÚ28ù7ÒOF’$ÕÜtÔ­î»WüfÖ†‹’°¨h,mé½ñ'ÓOF’$U^ÿȧÄo`m°(™‹ŠfÀÒ˜}÷êºÙ$ýl$IRÅ Þþ»ù›X,JfÀ¢¢°´g~÷çÓÏF’$UÜèü¿Žß+ÀÚ0`Q2Í€¥=Ó›.N?I’Tq“ž¿W€µaÀ¢d,*šK{&WŸœ~6’$©â¦Û/‹ß+ÀÚ0`Q2Í€¥=£÷¯¤Ÿ$Iª¸ùê—â÷ °6 X”Ì€EE3`iÏp˦Ÿ$Iª¼Þ!?¿Y€=gÀ¢d,*šK{oý•ô³‘$I•wÿ½¾Y€=gÀ¢d,*šK{z‡=1ýl$IRå Ïú£øÍì9%3`QÑ X´²¡ë&ƒôÓ‘$I7¾ô°üÍì1%3`QÑ XÚ4»óúôÓ‘$I7½îìø½ì9%3`QÑ XÚ4½ñüôÓ‘$I7»ó†ø½ì9%3`QÑ XÚ4ùÈ?¦ŸŽ$Iª¹Ù¤[Ý´wüföŒ‹’°¨h,m]ð7é§#I’*¯ÿ¦Ÿß,Àž1`Q2Í€¥MÃÓ_œ~:’$©ò†g¼4~³{Æ€EÉ XT4–6ùE%I’®ñEûÇo`Ïø.¨d,*šK›z‡ü@úéH’¤Ê›l;3~³{Æ€EÉ XT4–vÍû;ÒÏG’$UÜ싟Šß+Àž1`Q2Í€¥]³Û>’~>’$©æ¦ãnu¿¿Y€ÝgÀ¢d,*šK»&מš~>’$©òúÇ<-~³»Ï€EÉ XT4–v/Ú”~>’$©ò†§¿8~³»Ï€EÉ XT4–v ·¼,ý|$IRå>°_üfvŸ‹’°¨h,íê¿åÒÏG’$UÞä“gÄo`÷°(™‹ŠfÀÒ®ÞÁߟ~>’$©òfw|2~³»Ï€EÉ XT4–¶Í{_N?!I’TsÓQ·ºï^ñ›Ø=,JfÀ¢¢°´mvËåé'$I’*¯ô>ñ›Ø=,JfÀ¢¢°´mrÍ)é'$I’*oøŽÆo`÷°(™‹ŠfÀÒ¶Ñû_›~B’$©òFï_‰ß,Àî1`Q2Í€¥mÃ3^š~B’$©ò&×¾#~³»Ç€EÉ XT4–¶õûùô’$I•7ûµñ›Ø=,JfÀ¢¢°´­wà£ÓOH’$ÕÞdØ­î»Wünv‹’°¨h,í›åŽô3’$I•×?ê©ñ›Øu,JfÀ¢¢°´oºý²ô3’$I•78õñ›Øu,JfÀ¢¢°´orõIég$I’*otáßÇo`×°(™‹ŠfÀҾѿþ]úI’¤Ê›||süfv‹’°¨h,ížö{ég$I’*ovûÇâ7 °ë X”Ì€EE3`i_ÿÍ?—~F’$©öÆýnußïŠß-À®1`Q2Í€eìô’œ IDATÿÝ]7Ÿ§Ÿ’$Iª¼þ‘OÉß-À.1`Q2Í€e1Ìï½-ý”$IRå ßñÂøÍì%3`QÑ XÃô¦‹ÓOI’$UÞèûÆo`×°(™‹ŠfÀ²&W½5ý”$IRåM¶m‰ß,À®1`Q2Í€e1ŒÎMú)I’¤Ê›}éºøÍì%3`QÑ XÃàÔç§Ÿ’$Iª½Ù´[ÝÿQñ»Øy,JfÀ¢¢°,†þ1OK?%I’Ô@ýcŸ¿[€gÀ¢d,*š˂ش÷WÿªZ’$類ùòüÝì4%3`QÑ XÇì®ÓÏI’$UÞø²Ãã7 °ó X”Ì€EE3`YÓëÎI?'I’TyÓ΋ß,ÀÎ3`Q2Í€eqŒ/=,ýœ$IRåÍï½5~³;Ï€EÉ XT4–Å1<ëéç$I’¨wðãâw °s X”Ì€EE3`Yýã)ýœ$IR NxfünvŽ‹’°¨h,‹£wÐcÓÏI’$5Ðèœ?ß-ÀÎ1`Q2Í€e±Ìï»=ý¤$IRå¯<.~³;Ç€EÉ XT4–Å2ýÜÒOJ’$UÞtû¥ñ›Ø9,JfÀ¢¢°,–ñ•ǦŸ”$Iª¼ùàînueCünž‹’°¨h,‹eôžÿ~R’$©z‡ÿXünž‹’°¨h,‹epòo¦Ÿ”$Ij Á)ÏŽß-ÀÃ3`Q2Í€e±ô{búII’¤ÿšøÝ<<%3`QÑ XÏ|pOúYI’¤Ê›\sJüfž‹’°¨h,‹gvë•ég%I’*ovûÇâ7 ðð X”Ì€EE3`Y<“ýsúYI’¤Ú› »Õ}÷Šß-ÀC3`Q2Í€eñŒ.øÛô³’$I Ô?zŸøÝ<4%3`QÑ XÏ`óóÒÏJ’$5Ðð´Åïà¡°(™‹ŠfÀ²xúG=5ý¬$IR/Ú?~·Í€EÉ XT4–´ï^]7¦Ÿ–$Iª¼é§ß¿[€‡dÀ¢d,*šËbš}q[úiI’¤Ê›ï¸)~³Í€EÉ XT4–Å4Ù¶%ý´$IRíÍç]ïÀÇÄïàÁ°(™‹ŠfÀ²˜Æ~Z’$©oý•øÝ<8%3`QÑ XÓð~Z’$©Fç¼*~·΀EÉ XT4–ÅÔ?öéé§%I’hrÕññ»xp,JfÀ¢¢°,¨ý¿»ëæ³ôó’$I•7»õŠüÝ<(%3`QÑ X×üîϧŸ—$Iª½Ñj·º²1~·Ì€EÉ XT4–Å5½á½éç%I’¨ÔSãw ðÀ X”Ì€EE3`Y\ãËO?/I’Ô@ÃÓ^¿[€fÀ¢d,*šËâ¾ë¤Ÿ—$Ij ñÅÆïà°(™‹ŠfÀ²¸úÇ=#ý¼$IRM¯;'~·Ì€EÉ XT4–¶ÿ£ºn6M?1I’Tyó{nÎß-À2`Q2Í€e±Í¾ü™ô“$I Ô;øûãw ð X”Ì€EE3`Yl“O½+ýÄ$IR N|Vün¾“‹’°¨h,‹m|Ñþé'&I’htî«ãw ð X”Ì€EE3`YlÃÓ_’~b’$©&=1~·ßÉ€EÉ XT4–ÅÖ?æié'&I’hvÛUñ»øN,JfÀ¢¢°,¸}÷êºÉ0ýÌ$IRíûÝê¾ß•¿]€oaÀ¢d,*šËâ›}áÚô3“$I Ô?zŸøÝ|+%3`QÑ XßäÚSÓÏL’$5ÐðŒ—Æïà[°(™‹ŠfÀ²øFÿúÓÏL’$5Ðøƒ‡Äïà[°(™‹ŠfÀ²ø›Ÿ›~f’$©¦7¼7~·ßÊ€EÉ XT4–Å×{ãO¦Ÿ™$Ij ù½·Åïà[°(™‹ŠfÀ²V6tóá}é§&I’¨wÈãó· ðÿ°(™‹ŠfÀ²f·^‘~j’$©'ýzün¾Á€EÉ XT4–å0ùè‰é§&I’htÞ_Äïà X”Ì€EE3`Y÷Œ’$Iz¸&û§øÝ|ƒ‹’°¨h,ËaðOÿ9ýÔ$IRÍn¿&~·ß`À¢d,*šËrèú„ôS“$I-4u«›öŽß.À×°(™‹ŠfÀ²<æ«_J?7I’Ô@ýcŸ¿[€¯1`Q2Í€eyLoº8ýÜ$IR Ïú£øÝ|‹’°¨h,Ëc|Å›ÒÏM’$5ÐøÃÇÄïàk X”Ì€EE3`Yó_™~n’$©¦Û/‹ß-À×°(™‹ŠfÀ²<'üjú¹I’¤š¾Ò­®lŒß.€‹²°¨h,Ë£wÐ÷uÝ|ž~r’$©úG>%~»,ÊfÀ¢¢°,—ù=7§Ÿœ$Ij áé/‰ß-€‹²°¨h,Ëezý{ÒON’$5Ðøƒ‡ÄïÀ€EÙ XT4–å2¾ä ô““$I 4ýÌûâw `À¢l,*šËržþâô““$I 4_ýbün X”Í€EE3`Y.ý£žš~r’$©‘z‡>!~»À²3`Q2Í€eɬlìºÑjúÙI’¤œòœüíK΀EÉ XT4–å3»õÊô³“$I 4ºðïãw ,;%3`QÑ X–Ï䪷¦Ÿ$Ij É'ß¿[`Ù°(™‹ŠfÀ²|Fïù³ô³“$I 4»ëÆøÝË΀EÉ XT4–å38áWÓÏN’$µÐ|Þõr+@’‹’°¨h,˧wàc¾úAJ’$éáœðÌøíËÌ€EÉ XT4–å4ßqSúéI’¤½÷Ïãw ,3%3`QÑ X–ÓôÓÿ’~z’$©&WŸ¿[`™°(™‹ŠfÀ²œÆíŸ~z’$©f·_¿[`™°(™‹ŠfÀ²œ†ïxaúéI’¤šŽºÕM{ÇoXV,JfÀ¢¢°,§þON?=I’ÔHýcŸ¿]`Y°(™‹ŠfÀ²¤V6tóá½éç'I’hxÖ+ò· ,)%3`QÑ X–×ôæ­éç'I’hüácâw ,+%3`QÑ X–×øÊãÒÏO’$5Ðtûeñ»–•‹’°¨h,Ëkxö+ÓÏO’$5Ð|x_·º²1~»À22`Q2Í€eyõÿåôó“$IÔ?ò)ñÛ–‘‹’°¨h,Kì€ïéºù,ý%IR OIþv€%dÀ¢d,*šËr›Ýucú J’¤_zhün€edÀ¢d,*šËr›l;3ý%IRM?{aün€edÀ¢d,*šËr}`ßô”$I 4ïïèVW6ÄoX6,JfÀ¢¢°,·Á©ÏO?AI’ÔH½7üDüv€ecÀ¢d,*šËr»ÿC”$IÒÎ4<í÷â· ,%3`QÑ X–Üʆn>¸;ý %IR/98»À’1`Q2Í€…éç?˜~†’$©¦7ž¿[`Ù°(™‹ŠfÀÂxë‘ég(I’hÞ»3~·À²1`Q2Í€…á™/O?CI’ÔH½×?)~»À21`Q2Í€…þ›~6ý %IR# N}Aüv€ebÀ¢d,*š «ûîÕu“Aú)J’¤_|@þv€%bÀ¢d,*š ÷›Ýö‘ôS”$I 4½þÜøÝËÄ€EÉ XT4î7¹êøôS”$I 4ÿÊñ»–‰‹’°¨h,Üoxö+ÓOQ’$5Rï°'ÆoX,JfÀ¢¢°p¿þ[~1ý%IR# Þþ»ñÛ–…‹’°¨h,|ÕþêºÙ$ý%IR>°_þv€%aÀ¢d,*š _7ûâ¶ôs”$I 4½îìøÝË€EÉ XT4¾nrÍÛÒÏQ’$5ÐüÞÛâw , %3`QÑ XøºÑy™~Ž’$©‘z‡>!~»À20`Q2Í€…¯œôkéç(I’ipÊsâ· ,%3`QÑ XøºÞAß×uóyúIJ’¤½ÿµñÛ–‹’°¨h,|³ùŽÏ¥Ÿ¤$Ij é§ÎŠß-° X”Ì€EE3`á›M¶™~’’$©æwoß-° X”Ì€EE3`á›.ü‡ô“”$IÔ{ÝÆoXt,JfÀ¢¢°ðÍoûíô“”$I4øçߊß.°è X”Ì€EE3`á›õýáô“”$I4ú׿‹ß.°è X”Ì€EE3`áÛÍ¿ò…ô³”$I 4Ù¶%~·À¢3`Q2Í€…o7½á½ég)I’h¾ãsñ»‹’°¨h,|»ñ%¥Ÿ¥$Ij¡ù¼ëü¸øí‹Ì€EÉ XT4¾Ýð´ßK?KI’ÔHƒ“3~»À"3`Q2Í€…o×{ãO¥Ÿ¥$Ij¤Ñ¿]`‘°(™‹ŠfÀÂwXÙÐÍû;ÒOS’$5Ðä“ïÌß.°À X”Ì€EE3`áLoº8ý4%IRÍwÜ¿[`‘°(™‹ŠfÀÂo="ý4%IR#õy|üv€EeÀ¢d,*š d¸åeé§)I’ipʳ㷠,*%3`QÑ Xx ý£÷I?MI’ÔH£÷¿6~»À¢2`Q2Í€…´²±›ïK?OI’Ô@ÓO¿;»À‚2`Q2Í€…3Ý~iúyJ’¤šß{kün€EeÀ¢d,*š f¼õˆôó”$IÔ;ìGâ· ,"%3`QÑ Xx0Ã-/K?OI’ÔHƒÍÏß.°ˆ X”Ì€EE3`áÁôÞ'ý<%IR#/Ú¿]`°(™‹ŠfÀƒZÙØÍ‡÷¥Ÿ¨$Ij éõçæoX@,JfÀ¢¢°ðP¦Û/M?QI’Ô@óÕ/ÅïXD,JfÀ¢¢°ðPÆ[H?QI’ÔH½×?)~»À¢1`Q2Í€…‡2Üò²ô•$I4xÇß.°h X”Ì€EE3`á¡ôÞ'ýD%IR#/98~»À¢1`Q2Í€…‡´²±›ïK?SI’Ô@Ó/Èß.°` X”Ì€EE3`ááL·_š~¦’$©æý»ºÕ• ñÛ‰‹’°¨h,<œñÖ#ÒÏT’$5Rï?¿]`‘°(™‹ŠfÀÂÃnyYú™J’¤Fžþ’øí‹Ä€EÉ XT4Nÿè}ÒÏT’$5Òø²Ãã· ,%3`QÑ XxX+»ùð¾ôS•$I 4½é¢üí Ä€EÉ XT4vÆtû¥é§*I’h>¼÷«ã×ôí‹Â€EÉ XT4vÆxëé§*I’©ÔOÇoX,JfÀ¢¢°°3†[^–~ª’$©‘î¿Ò· , %3`QÑ XØý£÷I?UI’ÔHã­GÆoX,JfÀ¢¢°°SV6vóá}éç*I’hºý²üí €EÉ XT4vÖtû¥éç*I’ZhÜëV÷Ý+~»À"0`Q2Í€…5ÞzDú¹J’¤Fê¿égâ· ,%3`QÑ XØYÃ-/K?WI’ÔHÃwýÏøí‹À€EÉ XT4vVÿè}ÒÏU’$5ÒøŠ7ÇoX,JfÀ¢¢°°ÓV6vóá}é'+I’hvëùÛ€‹’°¨h,ìŠéç?˜~²’$©…&ÃnuÓÞñÛZgÀ¢d,*š »bü¡7¤Ÿ¬$Ij¤þqψß.Ð:%3`QÑ XØÃ3^š~²’$©‘Fçüiüv€Ö°(™‹ŠfÀ®èñäô“•$I4¹úäøí­3`Q2Í€…]²²¡›÷¾œ~¶’$©f_Ü–¿] q,JfÀ¢¢°°«¦7^~¶’$©…æ³®wàcâ· ´Ì€EÉ XT4vÕø’ƒÒÏV’$5Òà¤_‹ß.Ð2%3`QÑ XØUƒS_~¶’$©‘FüMüv€–°(™‹ŠfÀ®êþ£ég+I’i²mKüv€–°(™‹ŠfÀÂî˜ß÷oé§+I’h~ÏÍñ»ZfÀ¢d,*š »czÝÙé§+I’©wØÄoh•‹’°¨h,ìŽÑûWÒOW’$5Ò`ósã· ´Ê€EÉ XT4vÇà”g§Ÿ®$Ij¤ñÅÄoh•‹’°¨h,ìŽÞÁëºù<ý|%IRMo=~»@k X”Ì€EE3`aOŒÎ}uú K’¤Fžý'ñÛZcÀ¢d,*š {¢ü/¥Ÿ°$Ij¤ÉGOŒß.Ð%3`QÑ XØ#›ÙuÓqúK’¤š}áÚüí1`Q2Í€…=5»ýšô3–$I-4›v½¾7~»@K X”Ì€EE3`aOM®zkúK’¤Fœø¬øí-1`Q2Í€…=5ü—ÿ•~Æ’$©‘Fïû?ñÛZbÀ¢d,*š {ªìÓÓÏX’$5Òä§Çoh‰‹’°¨h,ì±ýÑuã~ú)K’¤šï¸)»@C X”Ì€EE3`a-LoÞš~Ê’$©‘z¯û¡øí­0`Q2Í€…µ0Þzdú)K’¤F¼ýwâ· ´Â€EÉ XT4ÖÂð¿Ÿ~Ê’$©‘ÆmŠß.Ð %3`QÑ XX ý#žœ~Ê’$©‘¦7¼7~»@+ X”Ì€EE3`aM¬lèæ½;ÓÏY’$5м÷å¯Þñû`À¢d,*š kezÃyéç,I’©÷ÆŸŠß.Ð%3`QÑ XX+ã‹6¥Ÿ³$Ij¤á;?~»@ X”Ì€EE3`a­ ÞöÛéç,I’i|ùQñÛZ`À¢d,*š k¥wÈãÓÏY’$5Òì–Çoh‹’°¨h,¬¥ùŽÏ¥Ÿ´$Ij¡É°[Ý´wüv€Ú°(™‹ŠfÀÂZš|â´ô“–$IÔÿÇÿ¿] v,JfÀ¢¢°°–Fïû«ô“–$I4:÷ÕñÛjgÀ¢d,*š kip¯¦Ÿ´$Ij¤ÉÇ7Ço¨‹’°¨h,¬©ýÕuÓqúYK’¤šÝucþv€Ê°(™‹ŠfÀÂZ›Ý~MúYK’¤šÏ»Þ!ß.P3%3`QÑ XXk“¼%ý¬%IR# NyNüv€š°(™‹ŠfÀÂZ¾ûÓÏZ’$5Òø¢MñÛjfÀ¢d,*š k­ÿ¦ŸM?kI’ÔHÓϼ/~»@Í X”Ì€EE3`aÍ­lìæÃûÒO[’$5Ð|pw·º²!¿@¥ X”Ì€EE3`a=L?IúiK’¤FêõÔøíµ2`Q2Í€…õ0¾ìðôÓ–$I4<ó¿Ço¨•‹’°¨h,¬‡ái/J?mI’ÔHã+Þ¿] V,JfÀ¢¢°°z¯ÿñôÓ–$I4»íªøíµ2`Q2Í€…õ2¿ïöôó–$I-4w«û?*~»@ X”Ì€EE3`a½L¯;;ý¼%IR#õÿåøí52`Q2Í€…õ2zÿkÓÏ[’$5Ò輿Œß.P#%3`QÑ XX/ƒþ­ôó–$I4ùÄéñÛjdÀ¢d,*š ë¥wÐc»n>K?qI’Ô@ó»?¿] F,JfÀ¢¢°°žfw^Ÿ~â’$©‘z‡þpüv€Ú°(™‹ŠfÀÂzš\ó¶ô—$I4ØüÜøíµ1`Q2Í€…õ4:÷Õé'.I’i|ÉAñÛjcÀ¢d,*š ë©ÿ–_L?qI’ÔHÓÏ^¿] 6,JfÀ¢¢°°®6íÝu“aú™K’¤šïíVW6æï¨ˆ‹’°¨h,¬·ÙmI?sI’ÔHýcž¿] &,JfÀ¢¢°°ÞÆW¼)ýÌ%IR# ÏzEüv€š°(™‹ŠfÀÂzžùòô3—$I4ùÈ[â· ÔÄ€EÉ XT4Ö[ÿè}ÒÏ\’$5Òìökâ· ÔÄ€EÉ XT4ÖÝʆn>¸;ýÔ%IR ͦÝêß“¿_ ,JfÀ¢¢°PÂô³¦Ÿº$Ij¤Á ÏŒß.P %3`QÑ X(a|ÉÁé§.I’itþkâ· Ô€EÉ XT4JœúüôS—$I4ýÔYñÛjaÀ¢d,*š %ô}Bú©K’¤FšåŽøíµ0`Q2Í€…Ræ÷Ü’~î’$©‘zoø÷ñÛj`À¢d,*š ¥L¶™~î’$©‘†gü·øí50`Q2Í€…RFümú¹K’¤F_~Tüv€°(™‹ŠfÀB)ƒ“~=ýÜ%IR#Ín½2~»@ X”Ì€EE3`¡”ÞîºÙ4ýä%IR MÇÝêþŠß/fÀ¢d,*š %ÍîødúÉK’¤F¼õWâ· ¤°(™‹ŠfÀBI“«OJ?yI’ÔH£óÿ:~»@š‹’°¨h,”4<û•é'/I’i²íÌøíi,JfÀ¢¢°PRÿ¸ŸO?yI’ÔHóûþ-~»@š‹’°¨h,µß#ºnÜO?{I’ÔH½×ÿxþ~€ %3`QÑ X(mzóÖô³—$I4<ã¥ñÛ’ X”Ì€EE3`¡´ñÖ#ÓÏ^’$5ÒýwCúv€$%3`QÑ X(møÎßO?{I’ÔH³[¯ˆß.dÀ¢d,*š ¥õxrúÙK’¤Vš »ÕMŒß/bÀ¢d,*š Å­lèæ½;ÓO_’$5Rÿø_Îß/bÀ¢d,*š ÓÞ›~ú’$©‘Fïû«øí),JfÀ¢¢°0úÀ~é§/I’i²mKüv€%3`QÑ XHœòìôÓ—$I4¿ïßâ· ¤°(™‹ŠfÀBBïàÇuÝ|ž~þ’$©‘z‡ÿXü~€%3`QÑ XH™}ù3éç/I’ixú‹ã· $°(™‹ŠfÀBÊäã›ÓÏ_’$5ÒøCoŒß.`À¢d,*š )£s_~þ’$©‘f·\¿] Á€EÉ XT4RúoùÅôó—$I­4v«›öŽß/Pš‹’°¨h,ÄlÚû«£$I’v¦þñ¿”¿_ 0%3`QÑ XHšÝzeúG@’$5Ò輿Œß.ÿ½;d±¬¯ IDAT²ó®ï<·6zhhDÒÝ ÝA§{™äÁLÒ@&!"púÄMOwÄ t3Ó™¨3„=iUY‹9^„lŒ-Yvð"Œ‘W„y‘Œ%,Œ7Ùx“ÙFõÜý>¿9Uš˜«ªRÕï{Ÿç¾Þç¼þ£_Õ·ÄÇu' 3EfÀ¢¬°©sÛÚè' I’*Rwçeá· äfÀ¢È X”5"µ®ø£è' I’*Rùâcá· äfÀ¢È X”5"5Î|[ô$Iª8õÂïÈÉ€E‘°(k,„ZvX*‹ç¢Ÿ$IªH­/ÿaüý°(2eÍ€…h½ï_ý $IREêÜzZøí9°(2eÍ€…ho.~’$©"õ»-üv€œ X™‹²fÀB´æEŒ~’$©*õ:ibù«ÃïÈÅ€E‘°(k,D+NzCJeý$IREjžÿžðûr1`Qd,Êš àÜ÷PôS$I©}ݧÃoÈÅ€E‘°(k, ƒîwþ6ú)H’¤ŠÔ»ïªðÛr1`Qd,Êš à½ù¿D?I’T‘ÊâÙ4±ì°ðûr0`Qd,Êš àqÞ»£Ÿ‚$IªP5ÿ,ü~€ X™‹²fÀÂP8áU)õÚÑÏA’$U¤ÖWþ8þ~€ X™‹²fÀ°è?¾=ú9H’¤ŠÔݾ.üv€ X™‹²fÀ°èÜ~vôs$I©¿÷»á· ä`À¢È X”5†EkãÇ¢Ÿƒ$IªJe™Šÿ‡ðû曋"3`QÖ X5ÿ<ú9H’¤ Õ¼èƒá÷ Ì7EfÀ¢¬°04––ÊÆ¾è'!I’*Rç¦Uñ÷ Ì3EfÀ¢¬°0Lz^ý$$IREê=üÍðÛæ›‹"3`QÖ X&WF? I’T•Úibü¨ðûæ“‹"3`QÖ X&Í ‹£Ÿ„$IªP“?¼Gß/0Ÿ X™‹²fÀÂ0)N~cô“$Iª½yiøýóÉ€E‘°(k, ›ò…G¢Ÿ…$IªHÝ{/ ¿]`>°(2eÍ€…a3ùDI’$M§ò¥ÇÃo˜O,ŠÌ€EY3`aØ´¯ùdô³$Iªøë~¿À|1`Qd,Êš æ¹nQô³$IªuÙ¿ ¿_`¾°(2eÍ€…¡s«Rêu¢Ÿ†$IªHÛÖÆß/0O X™‹²fÀÂ0ê?qwôÓ$I©ÿÄ]á· ÌEfÀ¢¬°0Œ:wœý4$IRUêwS±â5á÷ ÌEfÀ¢¬°0ŒZ_ùãè§!I’*Tó‚~¿À|0`Qd,Êš èñ¹·G? I’T¡Úßøoá÷ ÌEfÀ¢¬°0”––Êæ ÑÏC’$U¤ÞýWÇß/0 X™‹²fÀ°ê=ôèç!I’*ÒäðubÙáá÷ Ì5EfÀ¢¬°0¬:7ý<$IR…jœõÎðûæš‹"3`QÖ XVÍ‹ÿ úyH’¤ Õºêøðûæš‹"3`QÖ XVÅÉoŠ~’$©Bu¿ý¥ðûæš‹"3`QÖ Xfå‹F?I’T‘Ê}…ß.0× X™‹²fÀÂ0ëî¼<ú‰H’¤ Uœú á÷ Ì%EfÀ¢¬°0ÌÚ×~*ú‰H’¤ Õºô߆ß/0— X™‹²fÀÂ0kžÿÞè'"I’*Tç¶µá÷ Ì%EfÀ¢¬°0Ô–R¿ýL$IREê?ùíøûæ‹"3`QÖ Xvý'wD?I’T•ú½T¬rßP,ŠÌ€EY3`aØu·ŸýL$IR…j®ÿÝðû抋"3`QÖ Xv­+?ýL$IR…êܸ2ü~€¹bÀ¢È X”5†]cí;¢Ÿ‰$IªP½Gn ¿_`®°(2eÍ€…¡·ìðT¶^Š~*’$©*uibüçâo˜,ŠÌ€EY3`¡ z3ú©H’¤ Õ8ïÝá÷ ÌEfÀ¢¬°P›OŽ~*’$©Bµ¯ýËðûæ‚‹"3`QÖ X¨‚æ%‰~*’$©Bõv-ü~€¹`À¢È X”5ª X½ ú©H’¤ U6žOË¿aàP°(2eÍ€…ª(_|,ú¹H’¤ ÕX»0ü~€CeÀ¢È X”5ª¢»ëŠèç"I’*Tëk~¿À¡2`Qd,Êš UѾö/£Ÿ‹$IªPÝ…ß/p¨ X™‹²fÀBU4ÿæŽ~.’$©B•/<~¿À¡2`Qd,Êš •±üè”úÝè'#I’*Tñ×ÿ8þ†€C`À¢È X”5ª¤ÿÔ=ÑOF’$U¨Öeÿ.ü~€CaÀ¢È X”5ª¤»ý¼è'#I’*Tçö³Ãï8,ŠÌ€EY3`¡JZW~"úÉH’¤ 5ùÛÛ¢ï8,ŠÌ€EY3`¡Jkßýd$IR•*û©XõúðfË€E‘°(k,TʲÃSÙz)úÙH’¤ Õ\ÿ{ñ7 Ì’‹"3`QÖ X¨šÞC[¢Ÿ$IªP›N ¿_`¶ X™‹²fÀBÕtn>9úÙH’¤ Õ{äæðûfË€E‘°(k,TMó’D?I’T¥º­4q«Âo˜ EfÀ¢¬°P5ÅêÑÏF’$U¬æºEá7 ̆‹"3`QÖ X¨¢òÅÇ¢ŸŽ$IªPíë?~¿Àl°(2eÍ€…*êîº"úéH’¤ Õ»ÿêðûfÀE‘°(k,TQûÚOE?I’T¡ÊÖKibìˆðfÊ€E‘°(k,TQóü÷F?I’T±ç¼+ü†€™2`Qd,Êš •´üè”úÝèç#I’*TûšOÆß00C,ŠÌ€EY3`¡ªúOÝý|$IR…êÝ÷ÕðûfÊ€E‘°(k,TUwûyÑÏG’$U¨²ñ|šXvxø 3aÀ¢È X”5ªªuå'¢Ÿ$IªX³Þ~ÃÀL°(2eÍ€…ªj¬}Gôó‘$I«ýõ? ¿a`& X™‹²fÀBe-;<•­—¢Ÿ$IªPÝ{/¿a` X™‹²fÀB•õÚý„$IR…*÷?~¿ÀL°(2eÍ€…*ëÜ|Rô’$I«±æŸ…ß00],ŠÌ€EY3`¡Êš—|$ú I’¤ŠÕúê ¿a`º X™‹²fÀB•«D?!I’T±º;. ¿a`º X™‹²fÀBÕ•/>ýŒ$IR…š¼¢ï˜.EfÀ¢¬°PuÝ]WD?#I’T±ŠÓþiø ÓaÀ¢È X”5ª®}í§¢Ÿ‘$IªX­KÂo˜EfÀ¢¬°PuÍóßýŒ$IRÅêÞu~ø ÓaÀ¢È X”5*oùÑ)õ»ÑOI’$U¨þ³÷Çß00 ,ŠÌ€EY3`¡úOîˆ~J’$©b«ß~ÃÀÁ°(2eÍ€…:èÞynôS’$I«uÙGÃo8EfÀ¢¬°P­+?ý”$IRÅêÜ~vø cÀ¢È X”5ê ±öÑOI’$U¬þÓ;Ão8EfÀ¢¬°P ËOeë¥èç$I’ªTY¦â¤ÇDYqLüÊ€E‘°(k,ÔEï¡-ÑÏI’$U¬æ% ¿a²;25Ö.L­KRwûy©¿wW*_|,þ?eÀ¢È X”5ê¢sóIÑÏI’$U¬Î·Î¿aæC±zAj]z\êl[“z{¶¦ÔiüÔß”çÃÿsrp,ŠÌ€EY3`¡.š—|8ú9I’¤ŠÕâ®ð`.Æ*Í ‹S{ËxêíÞ”Êâ¹éýåH§ÿÏÎÁ°(2eÍ€…:g’$I3ªßKÅ*÷0PÅÊcSó‹¿Ú×6õ¾{e*_úÁìÿn¤ì§‰e‡…ÿwb0EfÀ¢¬°P'å‹F?)I’T±&ÿí¤èàe™k¦ÖÆ%S4ùÛd'G'sÙÄ ¯ŒÿïÉ@,ŠÌ€EY3`¡Nº»®ˆ~R’$©bun==ü†øûÔ¹å”ÔÛ³5¥NcÞÿnÄo§~,ŠÌ€EY3`¡NÚ×~*úII’¤ŠÕâîð=Å)ož«´·Œ§ÞîM©,ž ù»‘ÉÿÑÿ,Ì€E‘°(k,ÔIóü÷F?)I’TµÊ~*NzCøÔW±â5©¹nQjo^šº;Ö§þÞ]iX*NûÅð> fÀ¢È X”5jeùÑ)õ»ÑÏJ’$U¬æ%Ž¿c€z;25Ö.L­KRgÛšÔâ®”ú½4¬5>÷öøf dÀ¢È X”5ê¦ÿäŽèg%I’*Vç[g†ß0@5«L}Pç–SRoÏÖ”:T¥çüZø?C3`Qd,Êš uÓ½óÜèg%I’*Vÿ©{Âo`ø«^Ÿš¾?µ·Œ§ÞîM©œx&U½Æºß ÿçÊ`,ŠÌ€EY3`¡nZW~<úYI’¤ªU–©8é†ß1ÀYqLj®[”Ú›—¦îŽõ©¿w×Ôß!Ô­æï‹ÿgÍ@,ŠÌ€EY3`¡nkßý¬$IRkýí¿ ¿c€ cG¤ÆÚ…©µqIêl[sࣀzí4 57ü~ü?2`Qd,Êš µ³ìðT¶^Š~Z’$©bun[ÇY«¤æ†Å> èÁRêiTk}ùÃÿ÷`0EfÀ¢¬°PG½‡¶D?-I’T±úOï ¿a€¹W¬zݺî3©·{S*'öFÿ5ÄPÕºâÂÿ7b0EfÀ¢¬°PG›OŠ~Z’$©j•e*N~Sø‚Ç«l^šº;Ö§þÞ]S?óëg׺êÿß X™‹²fÀB5/ùpôÓ’$I̯Ì€ ;"5Ö.L­KRgÛšÔÛ³5¥^;ú¯*Wûïþ,þK2`Qd,Êš uTœòæè§%I’*XçŽÏ‡ß1ÀË+V/HÍ ‹S{Ëxê=xCJí‰è¿J¨Eíë>þ¿-ƒ°(2eÍ€…º*_|4úyI’¤ŠÕßûÝðxE*V½îÀG]÷™ÔÛ½)•{£ÿÚ ¶µ·Œ…ÿïÍ`,ŠÌ€EY3`¡®º;/~^’$©j•åÔor‹¾c`¤Œ•ç¼+µ7/MÝëSﮩŸÑ•§ÎÍ'Çÿ` EfÀ¢¬°PWík?ý¼$IRk]öÑð;jkìˆÔX»0µ6.ImkRoÏÖ”º­è¿é:ß:3þϰ(2eÍ€…ºjžÿÞèç%I’*X÷Î/„ß1PÅ꩹aqjo?ðQ@}Ñ?úë'êÞynøŸ3`Qd,Êš µµüè”úÝè'&I’*VÿÙïÅß1PAÅÊcSsÝ¢´óòTî:úÇ|M£î·¿þg‡Á X™‹²fÀBõŸÜýÄ$IR+V¿%üŽ€¡6~ÔºêøÔݱ>õ÷îJ©,£¤×,êî¼,þϰ(2eÍ€…:›üµw’$I3­uù¿¿c`hŒ‘g½3µ®üøÔGïöŸüvJ½Nôz»¿ÿgŒ X™‹²fÀBMÓ’$I3­»}]øQŠÕ RsÃâÔÞ2žz»7¥²±/úGuÍc½û7‡ÿ™c0EfÀ¢¬°Pg“¿¾P’$i¦õŸû~ø9+MÍu‹R{óÒÔÝyy*÷?ýc¹2×{àÚð?‡ fÀ¢È X”5jmÙá©l¾ýÌ$IR+þúŸÄß20—Æšú?[WŸº;Ö§þÞ])•ýèÁ\ïÁâÿl2‹"3`QÖ X¨»ÞC߈~f’$©‚µ6. ¿c`Ö–~`¬ò•?N;ÎIý'îJ©×‰þq[CXïáoÆÿye EfÀ¢¬°Pw›OŠ~f’$©‚uï¾ üŽ€é*V/HÍ ‹S{ËxêíÞ”ÊÆóÑ?Z«"õ¹9üÏ/ƒ°(2eÍ€…ºk^òáèg&I’*Xùâ£áw ¼œbåkSsÝ¢ÔÞ¼tꣀÊ}Gÿ­ ×{ôÖð?Ó fÀ¢È X”5ê®8åÍÑÏL’$U´Æ¿~Ë0âÆŽ<ðQ@—¤îöóRï®”Ê~ô̪QýÇn‹ÿsÎ@,ŠÌ€EY3`aLþÔ’$I3­õµ? ¿c½j]z\êl[“z{¶¦ÔmFÿx¬š×üÎð?÷ fÀ¢È X”5FAwçåÑOM’$U°É"úŽ Þc•æ†Å©½e<õvoJeñ\ôÂÁúOÜþÌ€E‘°(k,Œ‚ö5ýÔ$IR›ü‹Ã‰e‡‡ß2T_±òµ©¹nQjo^šº;Ö§rßCÑ?öJSõŸúNøû`0EfÀ¢¬°0 šç¿'ú©I’¤ŠÖøü¿ ¿e¨˜±#ScíÂÔÚ¸$u·Ÿ—ú{w¥Tö£Ä•^¶É?Ÿáo† X™‹²fÀÂHXþê”zèç&I’*Øäor ¿eúj]z\êl[“z{¶¦ÔiDÿ8+M»þ3»Ã߃°(2eÍ€…QÑrGôs“$I¬wÿÕáw Ã5VinXœÚ[ÆSo÷¦TÏFÿè*Rýç¾þ®Ì€E‘°(k,ŒŠîçF?7I’TÅÚibüçÂoò+V¼&5×-JíÍKSwÇú$Õ¬rßCáoÁ X™‹²fÀ¨h]ùñèç&I’*Zóü÷†ß2̳±#ScíÂÔÚ¸dꣀúOÜ•RÙþ‘Tš÷ÊöÄ¿?2`Qd,Êš £bòI’¤ÙÔùæ á· óóQ@[NI½=[Sê4¢ü”B*_úAø{d0EfÀ¢¬°02––Êæ ÑON’$U°É¿È ¿e˜µbÕëSóÂ÷§ö–ñÔÛ½)•ųÑ?jJCSùÃ'Ãß(ƒ°(2eÍ€…QÒ{èÑON’$U±^gêsÏ£onòç·æºE©½yiêîXŸú{wEÿT) uåÄÞðwË`,ŠÌ€EY3`a”tn:1úÉI’¤ŠÖ\ÿ{á· ?aìÈ©om\’:ÛÖ¤þw¥ÔïEÿ)Uª²x.þ-3‹"3`QÖ X%ÍK>ýä$IREëÜzZø-0êŠÕ RsÃâԹ唩{M"úÇE©ò•ÍÂß6ƒ°(2eÍ€…QRœü¦è''I’*ZÿÉá· À()V½>5/|joO½Ý›R9ñLô†R-+[? ï fÀ¢È X”5FMùâ£ÑÏN’$U±²LÅÉo ¿ejiÅ1©¹nQjo^šº;Ö§þÞ]S?‡IÊP§ÿ5€ X™‹²fÀ¨éî¼<úÙI’¤ŠÖºô¸ð[ òÆŽHµ Skã’ÔÙ¶æÀGõÚÑ?òI£[¯ÿu X™‹²fÀ¨i_óÑÏN’$U´îç†ß2USœþÖÔºüKo‘zÞšR§ˆþñNÒß¯ß ÿ:Á`,ŠÌ€EY3`aÔ4ÏOô³“$I­ÿüá· À0+V½îÀG]÷™ÔÛ½)•{£”“t°úÝð¯ fÀ¢È X”5FÎò£§Ž1I’¤ÙTœöOãï€a°â˜©a°}Í'S÷ÞKS¹ïáèÙ$Í&!4ô X™‹²fÀÂ(ê?qwôÓ“$I­uåÇÃo€ìÆŽHµ Skã’ÔÙ¶&õölú?½%Õ N#þk °(2eÍ€…QÔ¹ãóÑOO’$U´î=‡ß2ó­X½ 57,Ní-ã> ¨ùBôc’橲½?ükƒ°(2eÍ€…Q4ùo H’$ͦrÿSibÙaá÷ À\)NzCj®ÿ½c•ïý]*'ž‰þÑKRÆÊÖKá_‡Ì€E‘°(k,Œ¢Æ™o‹~z’$©Â5ÎþÕð{`VÆJsÞ•Ú›—¦îŽõ©¿wWJeýc–¤ÀÊÆ¾ø¯M dÀ¢È X”5FÒ²Ãü[’$iÖµ¯ýTü=p0cG¤ÆÚ…S¿‘º³mMêíÙšR·ý#•¤!«,ž‹ÿzÅ@,ŠÌ€EY3`aTõ¾÷õèç'I’*ZïëÂo€ŸT¬^šø( Ý›¦~«‚$¬rboø×/3`Qd,Êš £ª}Ã_E??I’TÕºÍ4±üÕá÷ 0ºŠ•ǦæºE> hçå©ÜÿtôOJ’*ZùÃ'ÿ¦1˜‹"3`QÖ XUÍ Þýü$IR…k^øð{ãGø( «ŽOÝëSï®”Ê2úÇ"I5©|éñø¯s dÀ¢È X”5FU±òµ)õ{ÑOP’$U´ÎÖSÃï žŠÓßšZ—¤Î¶5©·gkJÝVô@’j\ùâ£á_÷Ì€E‘°(k,Œ²þÓ÷F?AI’TÑúOÝ~ËÕW¬^š§ö–ñÔÛ½)•ç£Ü‘4b•ûÿZÈ`,ŠÌ€EY3`a”u·Ÿý%IRU+Ë©¿h޾g€ê(V›šë¥öæ¥ST¾ðHôO6’”úÏ?þõ‘Á X™‹²fÀÂ(k]ùñè'(I’*Üä¯ô޾g€!5~Tj¬]˜ZW?5VéïÝ•RÙþ1F’~ªþ³÷ÇÍd EfÀ¢¬°0ÊŸ{{ô”$I®»ã¢ð{Åéo¹w¶­I½=[Sê6£d‘¤iÕæ¾ð¯¡ fÀ¢È X”5FÚ²ÃRÙØý %IRE+÷?=uO„ß4@V“'Úܰ8µ·Œ§ÞîM©l<ýã‰$ͺÉßýu•Á X™‹²fÀ¨ë=pmô3”$I®qö¯†ß3Àü)V¾65×-JíÍK§> ¨Ü÷pô!’4§õŸúNø×Z3`Qd,Êš £nòß’$Išmík?~ÏsdìÈÔX»pꣀºÛÏ›ú­©ìGÿØ!IóZÿÉñ_È€E‘°(k,Œºæ—þ×èg(I’*\ïëÂï`öÔºô¸ÔÙ¶&õölM©ÛŒþC’²×â®ð¯Ç fÀ¢È X”5F]±êõþ- I’4ûºÍ4±üÕá7 pð±JsÃâ©ßÈÜÛ½)•ÅsÑ?MHÒPÔÿÁá_£Ì€E‘°(k,ðŠÔæ¾è§(I’*\ó„ß3À+^“šë¥ö楩»cý’$½lýÇn ÿºÍ`,ŠÌ€EY3`W¤îÝD?EI’Tá:[O ¿g`d™k¦ÖÆ%S4ùQ~ã²$M¿Þ£·Æ-g EfÀ¢¬°À+Rëªã£Ÿ¢$Iªpý§î ¿g`”> ¨uéqSc•Þž­)uÑ?HR¥ë=rsø×v3`Qd,Êš ¼"5ÎúÑOQ’$U¹²LÅ)o¿i Žc•æÅ:7­J½¯Oeó…èë_’jWïáÿÞ3˜‹"3`QÖ XàibÙá©l½ý%IR…›üuåá7 TX±â5©¹nQjo^šº;Ö§þÞ]Ñg¾$D½® ÿÀ`,ŠÌ€EY3`z}#ú9J’¤ ×ÝqQø=•1vdj¬]85Ÿü( þw¥Tö£ÏzIÉz÷]ÿ} X™‹²fÀLþRI’¤ÙVî:M,;,ü¦€¡ý(  ‹Sç–SRoÏÖ”:è^’ôÿÕ½÷Òðï fÀ¢È X”58`òhI’¤C©ñù~Ó@´â””š(un\‘z\›ÊƾèS]’4 î·¿þ½ƒÁ X™‹²fÀ'½!¥²Œ~’’$©Âµ¯ÿløMY­8&5×-JíÍKSwÇúÔß»Ëß±IRÅêÞù…øï' dÀ¢È X”5ø‘þsß~’’$©Âõ¹)üž€y3vdj¬]˜Z—¤Î¶5> ¨×Ž>Ã%I‡Xç[gÆa EfÀ¢¬°Àtw\ý$%IR•ëwS±Ê} @L‰U± IDAT=«L}ìv{Ëxê=xCJ"úâ–$ÍC›OÿžÃ`,ŠÌ€EY3`ioúÏÑOR’$U¼Ößþ›ð›fjrˆÝ¼ðýÆ*»7¥râ™èÓZ’”©É¯ýÑ߇Ì€E‘°(k,ð#s~-úIJ’¤Š×ݾ.ü¦€V“šë¥ö楩»c}êïÝ•RYFŸÒ’¤ Ú×}&þ{°(2eÍ€þž±#SÙÞý,%IR…+_úAšXvXü]“ÆŽHµ Skã’ÔÙ¶&õölM©×Ž>›%ICÔä 1üû°(2eÍ€~\ï‘›¢Ÿ¥$Iªx³Þ~Ó0šŠÕ RsÃâôà )uŠèóX’4äµ®:>üûƒ°(2eÍ€~\ç–S¢Ÿ¥$Iªxíkÿ2ü¦ þŠU¯;ðQ@×}&õvoJåÄÞèSX’TÁZ?þ=Á X™‹²fÀ?®yÉG¢Ÿ¥$Iªx½‡¶„ß4ÔÌøQ©qλ¦>æ¡»c}êïÝ•RYFŸ¾’¤Ôºô¸øïs dÀ¢È X”5øqÅÉoŠ~–’$©êõÚ©XùÚ𻀊;"5Ö.L­KRgÛšÔÛ³5¥n+úÊ•$Õ´æÅŠÿÞÇ@,ŠÌ€EY3`ŸV¾ðHôÓ”$I¯yɇÃoª¡X½ 57,Ní-ã> ¨ùBô9+I¡š~ ü{!ƒ°(2eÍ€~Z÷;ý4%IRÅëÞù…ð›€áS¬<65×-:ðQ@;/Oåþ§£OWIÒˆ×<ÿ=áßÌ€E‘°(k,ðÓÚ›ÿKôÓ”$I¯|ñ±ð›€`ãG¥Æ9ï:0VÙ±>õ÷îJ©,£OUI’~¬ÉqDø÷L2`Qd,Êš ü´Æ¹¿ý4%IR j|îíáw ™Œ‘k¦ÖÆ%©³mMêíÙšR·}’J’tÐg½3þû(°(2eÍ€^ÆøQ)uÑÏS’$U¼ö5ŸŒ¿k˜Å꩹aqjoO½Ý›RÙØ}~J’4«gürø÷U3`Qd,Êš ¼¼Þ£ßŠ~ž’$©âõ¼>ü¦àÐ+MÍu‹|ÐÎËS¹ÿ©èSS’¤9«8õçÿ×2˜‹"3`QÖ Xàåun=-úyJ’¤ª×m¥bÅkÂïf`ü¨tÕñ©»c}êïÝ•RÙ¾,%Iš·Š“Þÿý— X™‹²fÀ/¯uéqÑÏS’$Õ É_+}×ð³§¿5µ6.ImkRoÏÖ”ºÍèR’¤¬M,?:üû1ƒ°(2eÍ€^^±ú-ÑÏS’$ՠΟ¿k8 X½`j`ÜÞ2žz»7¥²ñ|ô¹(IRxcG„f0EfÀ¢¬°ÀÏV¾ôƒè'*I’*^¹ïáð›`«^Ÿš~ µoø«ÔÛýµTþðÉèÓP’¤á«×ÿžÍÁ°(2eÍ€~¶îÎË¢Ÿ¨$IªA5ÿ<ü®¨µ^™çþFjÿÝŸ¥î=RÿÙï¥T–Ñg $IC_Y<ÿ}œƒ2`Qd,Êš ülíÍK£Ÿ¨$IªAíkþ"ü®¨“âô·¦ÖÆ%©³mMêíÙšR·}òI’TÉÊ}…_çà X™‹²fÀ?[ãœwE?QI’Tƒz3ü®¨ªbõ‚Ôܰ8µ·Œ§ÞîM©,ž‹>ï$IªMý'¿þ½žƒ3`Qd,Êš 0vd*Ûû£Ÿ©$Iªzýn*V½>þ¶rÅÊצæºES¿·»cýÔ¿.I’æ¯Þ#7…ÿçà X™‹²fÀƒõÚýL%IR j]öÑð»`¨Œ™kN}Pwûy©¿wWJe?úl“$i¤šüífá7eÀ¢È X”5¬sãŠèg*I’jPwÇEáw @ôGµ.=.u¶­I½=[Sê4¢O4I’F¾î=‡ßœ‹"3`QÖ X`°æúß~¦’$©•çÓÄØá· @®±JsÃâÔÞ2>õov—ÅsÑç˜$Iz™:w|>ünàà X™‹²fÀƒ+M©ß‹~ª’$©5×- ¿mæZ±â5SwN{óÒÔݱþÀGI’¤JÔ¹ùäð[‚ƒ3`Qd,Êš \ÿé{£Ÿª$IªA›O ¿kÉØ‘©±vajm\2õQ@ý'îJ©ìGŸY’$i–µ¯ÿ¯ñ÷eÀ¢È X”58¸î_ˆ~ª’$©õŸÞ~×Ìæ£€:·œ’z{¶¦ÔiDŸT’$ikýOÃï ΀E‘°(k,pp­+þ(ú©J’¤šTœö‹á· ÀË)N~cj^ü©sãÊÔ{àºT6_ˆ>$IÒ<7ù[Õ¢o΀E‘°(k,ppÅé¿ýT%IRMjýÿ ¿m^N÷Þ/GŸJ’$)s“ãÕ脃3`Qd,Êš LOùÒãÑÏU’$Õ Þ÷¯ ¿k^Îä"I’F«æ+üáà X™‹²fÀÓÓÝuEôs•$Iu¨ÛJÅÊ׆ß6?©ÿƒÛ£/%I’”¹Æ9¿~ƒpp,ŠÌ€EY3`éi_ýçÑÏU’$Õ¤æ% ¿m~RÿÙïEŸI’$)s3~%üáà X™‹²fÀÓÓøÂÿý\%IRMêÞu~ømð“ÊýOGŸI’$)sÅÉo ¿A88EfÀ¢¬°À4•R§ˆ~²’$©•?|2M,;,þ¾ø{&?êP’$V'¼2üáà X™‹²fÀÓ×{øÆè'+I’jÒä_$IRø„i1`Qd,Êš L_禣Ÿ¬$IªIí-ãá· ÀW¬^}I’¤Ì•Ï„ß L‹"3`QÖ X`úš}0úÉJ’¤šÔ|{ømðß5Ö.Œ>$IRæúÏ?~ƒ0Í[Í€E°(k,0}ʼnÿ ¥²ýl%IR*ËT¬~Kø}0©qÞ»£¯#I’”¹þw‡ß LóV3`Q`,Êš ÌLï®èg+I’jRëk~ÛLò[g%I½zß~ƒ0=,ŠÌ€EY3`™én?/úÙJ’¤šÔ»ÿêðÛ`Rëò}I’¤Ìõv-üaz X™‹²fÀ3ÓÚø±èg+I’êR·•Š•Ç†ß7í«ÿ<ú2’$I™ëÞ}Aø Âô°(2eÍ€f¦qÆ/G?[I’T£Z—þÛðû sÓ‰Ñg‘$IÊ\ç–Õá7ÓcÀ¢È X”5˜¹ò‡OF?]I’T“ºß¹$ü¶èn_}I’¤Ìµ¯ûtø Âô°(2eÍ€f®ûݯD?]I’T“Êæ‹ibüçÂï`´õîûjôY$I’2׺òá7ÓcÀ¢È X”5˜¹ö5ŸŒ~º’$©F5/ü@ø}Œ¶Þ£·FŸD’$)sÍ‹?~ƒ0=,ŠÌ€EY3`™kœûÑOW’$Õ¨Îíg‡ß7Àhë?{ôI$I’2×8ïÝá7ÓcÀ¢È X”5˜…ñ£RêÑÏW’$Õ¤ò¥ÇÓIJÃâo`d•Í¢O"I’”¹Æ™o ¿A˜EfÀ¢¬°ÀìôöÜý|%IRšü‹ˆèûáQ§,£Ï!I’”¹bÕëãï¦Å€E‘°(k,0;›OŽ~¾’$©Fun\~ߣ©X½ ú’$I¹ëwý6Ø 1`Qd,Êš ÌNsÃâèç+I’jTÿéá÷ 0šgÿjô)$I’2Wî*üa÷š‹3`QÖ X`vŠ“Þà×ëJ’¤9­qÆ/‡ß8Àèi^ð¾è3H’$e®¿wWø Âô°(2eÍ€f¯ÿÌ}ÑOX’$Õ¨ö5~ߣ§µñcÑg$IÊ\ïáÃo¦Ï€E‘°(k,0{Ý»Î~Â’$©FõöÜ~ߣ§}ý>ƒ$IRæº;/¿A˜>EfÀ¢¬°Àìµ¾òÇÑOX’$Õ©²ŸŠSþQøŒ–ÎígE_A’$)s;Î ¿A˜>EfÀ¢¬°Àì5Î|[ô–$I5«uå'Âo`´ô¾{eô $I’2×¹qEø Âô°(2eÍ€M¹ÿ©èg,I’jTo÷×Âï`´ôpGô $I’2×Þ¼4üaú X™‹²fÀ‡¦wßW£Ÿ±$IªSFšXqLøŒŽòÅÇ¢/ I’”¹Öÿ!üaú X™‹²fÀ‡¦}í_F?cI’T³Z_þÃðcG¤ÔïFŸ?’$)sÍ/ýNü´°(2eÍ€McÝoF?cI’T³º÷~9üÆFC±ú-ѧ$I ¨ñùÿ1üaú X™‹²fÀ‡è„W¦ÔmF?eI’T£Êöþ4±üÕñwP{þÏI’F³â¯ÿqø‚›MÕÈ€EY3`C×{ôÖè§,I’jVó’„ß8@ý5/ùpôÙ#I’ò/ÎT‹‹"3`QÖ XàÐunYý”%IRÍêÞ³!üÆ꯽éÿŒ>{$IRî:Eø Â̰(2eÍ€]sÃâè§,I’jVÙ|1MŒÿ\øÔ[ç–S¢ÏI’”¹ò…=á73cÀ¢È X”58tʼnÿ ¥²ýœ%IRÍjnøýð;¨·îÎË¢OI’”¹þc·…ß ÌŒ‹"3`QÖ X`nôŸ¾7ú9K’¤šÕ½û‚ð¨·þãwFŸ<’$)sÝ]ÃofÆ€E‘°(k,07:·Ÿýœ%IRÍ*û|Œ0¯Ê‰g¢OI’”¹ÎmkÃofÆ€E‘°(k,07Z—}4ú9K’¤ÖüÒï„ß9@M­8&úÔ‘$Iµ¯ÿlüÂŒ°(2eÍ€æF±zAôs–$I5¬»ý¼ð;¨§ÆYïŒ>u$IR@­ ¿C˜áÝfÀ¢À X”5˜;ýçŒ~Ò’$©f•ųibìÈð;¨Ÿæ†ÅѧŽ$I ¨yÁûÂïfÆ€E‘°(k,0wºß¾0úIK’¤Öüâo‡ß9@ý´ÿîÏ¢ÏI’Pãso¿C˜EfÀ¢¬°ÀÜi]ù‰è'-I’jXçö³Ãï ~:·ž}æH’¤€Š•džß!ÌŒ‹"3`QÖ X`î4Îø•è'-I’jX¹ÿ©41vDø­ÔKï»WFŸ9’$)wí‰ð„™3`Qd,Êš Ì­ò‡OD?kI’TÚç¿'üÎê¥ÿä·£OI’”¹þsß¿A˜9EfÀ¢¬°ÀÜêî¼,úYK’¤ÖùÖ™áwP#ËKeë¥èG’$e®÷ðñw3fÀ¢È X”5˜[í¯ÿiô³–$I5¬|ñ±©ÿ£)úÖê¡8õç£ÏI’P÷;—„ß!Ìœ‹"3`QÖ X`n5ÎþÕèg-I’jšæJó‚}ÚH’¤€:[O ¿C˜9EfÀ¢¬°À[vx*ÏG?mI’TÃ:·ŸëµÐÞôŸ£OI’Pûê?¿C˜9EfÀ¢¬°ÀÜë}ïëÑO[’$Õ°râ™41vdø­T_gÛç¢OI’PëÒãÂïf΀E‘°(k,0÷Ú×}:úiK’¤šÖ¼ðýá·P}½®>k$IR@Íu‹Âïf΀E‘°(k,0÷ç½;úiK’¤šÖ½ëoÂo úÊöDŸ5’$) â´_ ¿C˜9EfÀ¢¬°À<?*¥Ný¼%IR +›/¤‰^ïÕµüÕ)•ýè³F’$å®,ÓÄ ¯Š¿E˜1EfÀ¢¬°Àüè=´%úyK’¤šÖ¼øCá·P]³ÿeô9#I’*‹gÃïfy¿°(0eÍ€æGç›'D?oI’TÓº÷\~ëÕÕºì£ÑçŒ$I ¨ÿÔwÂïfÇ€E‘°(k,0?š¼/úyK’¤ºÖžH+Ž ¿w€jjo‹¾f$IR@½û¯¿C˜EfÀ¢¬°Àe$IR@Ý»¿~‡0;,ŠÌ€EY3`ùÓ{ôÖè'.I’jZ÷»_ ¿u€jê?s_ô)#I’ê|syøÂì°(2eÍ€æO禣Ÿ¸$IªkÝf*V¹å€Zþê”ú½èKF’$Ôºòãñ·³bÀ¢È X”5˜?Í/ýNô—$I5®µñcá÷P-þÏI’F·æ+üÁ §êeÀ¢¬°ÀW$IRTÝVšXvxø=Âì°(2eÍ€òèl=5ú¹K’¤š×ܰ8üæ†SóâEŸ*’$)¨þ³÷‡ß"EfÀ¢¬°@Í ¿ýÜ%IRÍëî¼,üæ†SçÆѧŠ$I ª÷Àµá·‡Æ€E‘°(k,G±êu)õ{ÑO^’$Õ¹n3«^~÷Ãgòÿ¸’$I£Y÷ÎsÃo‹"3`QÖ X ŸþãÛ£Ÿ¼$Iªy­¯þÇð›2ËKeñ\ô™"I’‚j_ÿÙø{„CbÀ¢È X”5ȧsëiÑO^’$Õ¼Þ#7…ß<Àpiœù¶èE’$Öºì£á÷‡xϰ(0eÍ€òi^ü¡è'/I’ê^Y¦âô_ ¿{€áѺâ?D_(’$)°Æ¹¿~ph X™‹²fÀù«^—R¿ýì%IRÍkßðWáw0<:Û>}žH’¤ÀŠ“ß~ph X™‹²fÀyõŸ¸;úÙK’¤š×ö{á70<úm‹>O$IRTí‰4±ì°ð{„CcÀ¢È X”5È«sëéÑÏ^’$@s#üî†ÀòW§ÔmEŸ&’$)¨þÞ]ñ÷‡Ì€E‘°(k,WsÃïG?{I’4uï<7üîâ5¿ø[Ñg‰$I ¬÷½¯‡ß#:EfÀ¢¬°@^ÅÊצÔëD?}I’TóÊæ‹ibùÑá·«½e<ú,‘$IMþVøè{„CgÀ¢È X”5ȯÿØmÑO_’$@­KÂï Vï¡oDŸ$’$)°ÖULJß#:EfÀ¢¬°@~›NŒ~ú’$iê=|cøÝ?*¥öDôI"I’kþÍÿ“pÈ X™‹²fÀù5/|ôÓ—$I£PY¦Æ¿~û1ë~3ú‘$IÁ§¼9ü&aî:fÀ¢¬°@€^•R·ýü%IÒÔ¹iUüí„h_ÿÙèSD’$V6_ ¿G˜,ŠÌ€EY3`“¿Ò_’$i¾+_z±íDÛM4­‰™Œ&ÑÓ­¶I§5ÆÇܪ (F™dž'Aæy™d´ ˜§ ¨³Ï¼÷ïY÷q`¨éÞßwï³_¯µÞÿõJzeQ¿óåð©{Ÿù¿œö1`‘âëîükÑOÐ2ƒÓ¿~I’¤Ùmxþ¢è¨Ñµ‡‡ß%šÝ XˆdÀBV,R=ª–ßý-RþäG~œ°$IVùàÑ'Pƒsæ‡ß%šÝ XˆdÀBV,R=]¹_ôs´LïÀ? ¿$IÒìÔÝå-ѧPý£þ"ü6Ñ,ßz,2`!+©õþ«èçh™Ñ Ç…ß@’$ivœùïѧPÝ]7 ¿M4»°É€…¬ X¤zTl󒔪2úIÚ¤¥bûW‡ßA’$ií+ïþAôeÔÁ°›:ó× ¿M4»°É€…¬ X¤úTÞwuô“´Œß‹-IR󛤦ªŠ>+€(ï½2ü6ÑìgÀB$²2`‘êÓðÂí¢Ÿ eªÇîNùë…ßA’$iÍœüÅ蓨‰ÑU„ß&šý XˆdÀBV,R}êøè'h¡þ¿ƒ$IÒš7^rfô9ÔÄà´ ¿M4û°É€…¬ X¤µp£™ßO Óxéùñw$IZ£ŠE›¤4FŸ@MôøƒðûD³Ÿ ‘ XÈÊ€EªWþÖaú‹è;H’$­~ýãþ6úŒj¤Øöeá÷‰f?"°•‹T¯§5úYZhtõáw$IZýÆ7}F5Q­x ü6ÑÜdÀB$²2`‘êUwÏÍ£Ÿ FýT,~yø-$I’V½b«øUÄÀ“¦Â{ô}¢¹É€…H,deÀ"Õ¬©y©ê<ý4-48{*þ’$I«\ÿ„ÏEŸ@ /Þ1ü>ÑÜdÀB$²2`‘ê×èº#£Ÿ …¦G´…†ßB’$iÕß~^ôùÔHÿ;~Ÿhn2`!’ Y°Hõ«üg£Ÿ ¥úÇ~*ü’$I+¯ØþÕ)UeôéÔHwÏÍÃoÍM,D2`!+©~Û¿&úiZª¼÷ªð[H’$­¼Á_‹>€:)G©³p£ðEs“ ‘ XÈÊ€Eªgå²[¢Ÿ ¥ºûþ×ð[H’$={å×EŸ @”Þ~Ÿhî2`!’ Y°HõlxÙÑÏÐR£ë¿…$IÒ3×Ý㷢ϠfF×~£hï?°•‹TÏz‡,úyÚª¥b‡×…ßC’$éé^¸]ôµÔÌà¬o„ß(š» XˆdÀBV,R=+¶zÁÌ<ˆ0¼pqø=$I’ž¦©uRõè]ѧP3½Ã>§hÎ2`!’ Y°Hõm|çÅÑOÐRUoy*¶z~ø=$I’~±Þþï‹>€*v|Cø¢¹Ë€…H,deÀ"Õ·á¹ £Ÿ Å§%ü’$I¿ØèšC£O fªÞ£©35/üNÑÜeÀB$²2`‘ê[oß÷D?@‹UÝ“: 6¿‰$IÒ‹6IiXDŸ@ÍŒï¸(üNÑÜfÀB$²2`‘jÜüõRÕ,ú™Z¬ügâo"I’4ÓàÔ‰> €]þ­ð;Es› ‘ XÈÊ€Eªwã~&€+—Ý’:Së„ßD’$é9©Œ”y IDAT|ð†èÓ¨¡þ‰ÿ~§hn3`!’ Y°Hõ®ÿÝŠ~&€–ëþ±ð›H’¤¶×Ûï÷£O ¦º{þvø­¢¹Í€…H,deÀ"Õ»b‡×F?@Ë•wÿ ü&’$©í®9,ú$êhÔKë‡ß*šÛ XˆdÀBV,Rý+º)ú©Z®÷íÿ~I’ÔÖŠm^<ó§~Yy×÷ÃoÍ},D2`!+©þ /Ù9ú©Zn|ËÉá7‘$ImmpÚ¿FŸ@M ¿¿[ø­¢¹Ï€…H,deÀ"Õ¿ÞAŠ~*€¶«ªÔÝýmáw‘$Im¬|ðÆèK¨©þwþ.üVÑÜgÀB$²2`‘ÐÂRÑÏÐr£«Š¿‹$IjY½ýß}5ÖÝm³ð{EsŸ ‘ XÈÊ€EjFã[O~.€¶S±ãëÃï"I’ÚÔè†ã¢/ ¦ªÁŠÔ™¿nø½¢¹Ï€…H,deÀ"5£Á©ÿý\¤Ñå{‡ßE’$µ¥b§7¦TŽ£?þ€š/½ ü^Qž XˆdÀBV,R3êîºiôsðŸ?…å á·‘$ImhxÙÑŸü@ /Þ1ü^Qž XˆdÀBV,Rsª¹-úÉHÃì~I’4é[¿hæ×<“þÑ~³(O,D2`!+©9.ÿVô“ÒxŠ_~I’4É ÎþèO| æº;¿9üfQž XˆdÀBV,Rsêþ§ÑOÀŒé_i}I’4±-Ü0UßýqÔXÕ{4u¦æÅß-Ê’ ‘ XÈÊ€EjNÅVÏOi<Œ~6RõS±ýkÂï#I’&±þ ÿýIÔÜxÉYá7‹òeÀB$²2`‘šÕxéùÑÏÀŒá÷w ¿$Iš¸¦æ¥òÁ¢?怚^°MüÝ¢l°É€…¬ X¤f58óëÑÏÀF½TlÿêðûH’¤IªwèG¢?á€èññð»Eù2`!’ Y°Hͪ»çæÑÏÀ“†—î~I’4Io?7úãh€b‡×…ß-Ê— ‘ XÈÊ€EjXSóRõø}ÑOÀÏ~ Ëv¯Š¿‘$Iš€ºûünô';ÐUç¡ð»E™ïD°•‹Ô¼FWýt)ü†QL,D2`!+©Ù|zô3ðÕ£w¥ÎÏ ¿•$Iªeó×Kåƒ7F\ 38ãßâï…dÀB$²2`‘šÝà{ÿ;úxZƒ³¾~+I’TÇü»<°&zû¾'üŽQL,D2`!+©Ù;½1úxZÕ`E*¶{Uø½$IR*m’ªbYôÇ4Ð4£~ê,Ü(ü–QL,D2`!+©ù•Ýý”<­ÑU„ßJ’$Õ©áÅ;F< 4¾ó’ð;Fq°É€…¬ X¤æ7¼hûè§àéUeê~ëwÂï%I’êP±Ó›fþö4Àê^¸]ø-£¸ XˆdÀBV,Róëí÷Þè§àÙÿ–ØÔ¼ð›I’¤èF7ý± 4Tï°†ß2ŠË€…H,deÀ"M@ó×KUoyôsðŒúGýyüÍ$IR`Ý}ÞRUE$MTU©Øö¥á÷ŒoI°•‹4®;*ú9xFÕ#·§ÎÂÂo&I’Bšš—Ê{.þ8ª\vKü=£Ð XˆdÀBV,ÒdÔ?îo£Ÿ€g58óßÃo&I’"êÿ™èa ÁFWí~Ï(6"°•‹4Û¼$¥rý¤<£ªÿx*¶uøÝ$IRî_¯ŠeÑÃ@ƒõOø‡ð›F±°É€…¬ X¤É©¼ëÒè'àY®?&üf’$)g£«Šþø®»Ë[ÂoÅfÀB$²2`‘&§ÁY߈~RVªwèGÂï&I’rÔÛï½)UUôG/Ð`Ó?É­35/ü®Ql,D2`!+irêîùÛÑO ÀJ•/I……ßN’$Íi 7LåC7Eì 7¾éÄø»Fá°É€…¬ X¤ jj^ª»;úYX©áy[ÆßN’$ÍaÃsFÜ`pÆ¿…ß5ŠÏ€…H,deÀ"MV£+ö‰~VVnÔ÷;¼%I[w—_Ÿù¬X[ݽß~Û(>"°•‹4Yõùpô³°JÆKÏ÷{¼%I“×Ô¼4¾íœèY`T½GSgþºñ÷Â3`!’ Y°HÖ SÕ<úiX%ý£ÿ*þ~’$iëÿ™èW`BŒo:1ü¶Q=2`!’ Y°H“×è†ã¢Ÿ€UR=~_*m~?I’4‹_žªbYôÇ+0!§üsø}£zdÀB$²2`‘&¯þqŸŽ~ZVÙèÊýÂï'I’f£ñÍ'E¬¤»ûÛÂïÕ#"°•‹4y[¿(¥rý¼¬²ÞÁ~CI’´6õ¿ûOѧÀ©:¦ÎÔ¼ðGõÈ€…H,deÀ"MfãÛÏ‹~^VYõè©Øêùá7”$IkR±Ó›RÕ<ú㘠£ëŽ ¿qTŸ XˆdÀBV,Òd68õ_¢Ÿ€Õ2üÁ^á7”$I«ÝüõRyץѣÀ„éŸøñwŽj“ ‘ XÈÊ€EšÌŠ_ý¼¬žªJ½ÿ0üŽ’$iuœ=ý L éŸð}ç¨>°É€…¬ X¤É­¼ÿÚè'`µTË—¦bË_ ¿£$IZ•º{½#¥ñ0úã˜À_³}ç¨^°É€…¬ X¤ÉmxÞ–ÑO Àj^ºkø%IÒJ[¸Q*¼!úc˜@£«ö¿uT« XˆdÀBV,ÒäÖÝëÑO Àê«ÊÔûöï…ßR’$=[ÃËvþÄ&TÿØ¿ ¿uT¯ XˆdÀBV,Ò75/UÝý̬ٯZäßU$Iõ¬wð§TUÑ—À„*¶{Uø½£zeÀB$²2`‘&»áöŒ~fÖÈèšCÃo)I’~¹b‡×¥ªXý1 L¨ò¡›ÂïÕ/"°•‹4Ùõú`ô3°ÆúÇ|2üž’$éÉn˜Ê{.þx&Øô¯) ¿yT» XˆdÀBV,Ò„·`ýTõ–G?5k¤ê=šŠßSI’ôÏI£Ë÷Žþh&\ïˆ? ¿yT¿ XˆdÀBV,Òä7ºîÈè§`ï¸(uæ¯~SI’ÚÝôO˜SU™Š­_~÷¨~°É€…¬ X¤É¯ô_E?5kepÖ7Âo*IR{ëîþ¶”†EôÇ!0áÊ{¯ ¿{TÏ XˆdÀBV,ÒäW,úՔƃèç`͇©»÷»Âï*IRû*¶zA*—ÝýI´Àð¢íÃoÕ3"°•‹ÔŽÆKÎŒ~nÖJµüŽTlóâð»J’Ô¢¦æ¥Ñ ÇF-Ñ;èCñ÷j™ ‘ XÈÊ€EjGƒ“¿ýܬµñM'ÎüÇÄèÛJ’ÔŽ§ýßè> -FýÔÙrãðûGõÌ€…H,deÀ"µ£b‡×¦TUÑOÀZœþÕðÛJ’4ùõü@Jå(úch‰éŸ¢}ÿ¨¾°É€…¬ X¤öTÞsyô“°öÊQêí÷ûá·•$irëîú©ê-þÄZdpêÿ ¿Tß XˆdÀBV,R{œñµè'`VT+HÅv¯ ¿¯$I“W±ÍKRùð’è: eº»üzø¤úfÀB$²2`‘ÚS±Ó£Ÿ€Y3¾ýÜÔ™¿nø%Iš n”Ê».þˆZ¦zäöø;HµÎ€…H,deÀ"µ«òþk¢Ÿ€Y31úö’$eláFi|ów£?~ž¢|èæø[IÊ€…H,deÀ"µ»Þþÿ=úÈfpÎüðûK’”¡-7NãŸý±ð´†ï/©Q°É€…¬ X¤–7ÝTuŠ~вœòÏñ7˜$iÎ*m’Ê».þ¸xF½?~3©Y°É€…¬ X$®Ø7ú)ȧªRÿ„Ï…ß`’¤Ù¯Øöe©¼ï‡ÑŸ4Ϩê-Oë‡ßMjV,D2`!+I½ƒ>ýäUŽSÿÈÿ7ü“$Í^Åö¯IåC7GÂ<«Ñ ¿›Ô¼ XˆdÀBV,’¦×ÞUñ“èç ¯ñ`fÈ~‹I’Öºîο–ªåK£?YVªwÄŸ…ßNj^,D2`!+IÓ®Ø'ú9ÈoÔO½C?~‹I’ּ‘ªÇî‰þDX¹a‘:[n~?©y°É€…¬ X$M×Ûÿ¿G?G1†ÝÔ;ðá÷˜$iõëîý.?QhŒñLJßOjf,D2`!+I3M­“ªÇï~’b±HRãšþ5pUÿñèO€UÖ?öSá7”š™ ‘ XÈÊ€EÒO^ºkô“LjE’Sÿ„Ï¥TŽ¢?9VÝx˜Š­_~G©™°É€…¬ X$ý´î¾ÿ5úIˆeÄ"Iõnj^œ³ úÓ`µ—œK©±°É€…¬ X$=ÙÔ¼T-¿#úYˆ±üGñ·™$éÛâyitñџkdpÒâï)56"°•‹¤ŸoxávÑÏ@¼ñ õüDøm&Iz¢b»W¥òžË£?ÖLU¥bûׄßTjn,D2`!+I?_w¯wD?KõPŽSÿøÏ†ßg’Ôöº{nžªGïŠþTXcå]ß¿©Ôì XˆdÀBV,’~¹rÙ­ÑO@=TUœú/á÷™$µµþQ‘Ò°ˆþ4X+ƒ3þ-ü®R³3`!’ Y°Húå†çmý4ÔÊàŒ¯…ßh’Ԫ毛†.ž4]w—·ÄßWjt,D2`!+I¿\w··F?Mµ3ýR;SóÂo5IšôŠm_šÆ·ýìÌŠòÁÂï+5?"°•‹¤§«|àºèç  vF?<$u¬~«IÒ¤ÖÝë©Z¾4ú¹˜5Ó?ñ<úÆRó3`!’ Y°Hzºg}#úy¨¥ñ-ßK-ž~¯IÒ¤Õ?ñó)úÑÏ<À¬šèFßYj~,D2`!+IOW±Ó›ü®q€gPÞýƒ™_q}³IÒ$Tlù+itÍaÑO;À¬«–ßáWÑjV2`!’ Y°Hz¦Ê{®ˆ~¢j«|èæTìðºð›M’š\w·ÍRùà ÑO:Àœ^òÍð{K“‘ ‘ XÈÊ€EÒ358íÿF?QµV=vOêîùÛáw›$5±ÁIÿ+¥Q/ú)˜3½ýÞ~si22`!’ Y°Hz¦Š^ë׬DÕ<õþãðÛM’šR±õ Óèúc¢Ÿo€9U­¸?uæ¯~{i22`!’ Y°Hz¶Æw\ýLÔ_9Nƒ“¾~»IRÝëðþT=vwô« 0熗î~{ir2`!’ Y°Hz¶')ú™hŒá¥»¤ÎÔ:á7œ$Õ®…¦á…‹SªÊè§ ‹î>Á41°É€…¬ X$=[Åâ—ÏübVÍ躣RgáFáwœ$Õ¥îî¿™Êû¯~ž²©–ß‘:SóÂï0MN,D2`!+I+küãÓ£Ÿ*€F)ï½*;¼6üŽ“¤Ð毗g|-¥Q?úYÈjxÁ¶ñ·˜&*"°•‹¤•Õ?öSÑO@ãTß›º{ÿ?á·œ$EÔÝí­©¼çòè§ Dw·‡ßcš¬ XˆdÀBV,’VÚ–§j°"ú¹hžQ?õ¿ó÷ñ÷œ$åÊO]Z®|èæø›L— ‘ XÈÊ€EÒª4úáÁÑÏ@c /Úaæ?êFßt’4—u÷Ü<•÷\ý䄜3?ü.ÓäeÀB$²2`‘´*õüÃèç  ÑÆK/HÅv¯ ¿ë$iÖÛâyixáâ”ÊQôS ®»Ë[âï3M\,D2`!+I«ÔÔ:©zìîè'  ÑªÎC3ÃàðÛN’f©Þ¡IÕò;¢ŸW€Z(ï½2ü>ÓdfÀB$²2`‘´ªMÿè{ÖR9Nƒ3¿ž:SóÂï;IZÓŠí_“F7ý¢ÔÊàô¯„ßišÌ XˆdÀBV,’Vµî¿ýdLŒñ­§¤bÛ—…ßx’´Z-Üpf„—èg ^ª2;¼6þ^ÓDfÀB$²2`‘´:•÷_ýlLŒªóà̯߈¾ñ$iUêðþT>xcôÓ PK㥄ßkšÜ XˆdÀBV,’V§éÀ,ªª4¼d癟j}ëIÒÓUìô¦4¾éÄè× Ö'}!ünÓäfÀB$²2`‘´:Û½*¥rýtLœòþkRw·ÍÂï=IúiÅ¢MÒð¢Rõ£ŸH€z+G~E¬æ4"°•‹¤Õm¼ä¬è§ `2zipÆ×Rgþºá7Ÿ¤·`ýÔ?ñó3¿æ €•ÿè´øN ‘ XÈÊ€EÒêÖ?îÓÑOÀD+ïº4uwùõð»ORûêþ±T.»%úh”þwþ>üŽÓdgÀB$²2`‘´Úm¹qª+¢Ÿ/€Éæ§±HÊXwŸw§ñÒó£_>€æõR±ÈkÓÜfÀB$²2`‘´&®94úùh…ñ§îno ¿ÿ$MfÝ=7Oã[O~êk|ãñá7&?"°•‹¤5©wЇ¢Ÿ/€öÓðüE©³ÅsÃï@I“Q÷›ÿ%®;2¥ªŒ~á­ÔŸ‡ßvšü XˆdÀBV,’Ö¨©uRõØ=ÑO@«TÜ63$¿%5¶b§7¦Ñû¤TŽ¢Ÿ4€Æ«º§ÎÂÂoµ'"°•‹¤µipúW£Ÿ1RJã[OIÝ]7 ¿%65/õþã4^zAô“0ñ§ýküý§ÖdÀB$²2`‘´6‹_‘R9Š~ʘVŽÒèò½gn´è;QRÆlúÇ~*•÷_ý ´Ãx˜ŠÅ/¿Õš XˆdÀBV,’Ö¶ñÍß~ÊøyÃ" /\œŠEþ}Ošä¦ÿŒNùrª½+úÕh•ñM'†ß‚jW,D2`!+Ik[ïðE?ežÆKÎJ©ª¢Ÿ€Öª:ùw+eÏ€…H,deÀ"i6^´}ôsÀ* Y>?ó£ïGI«V±øipÆ×fþüoxÉÎá7¢Ú— ‘ XÈÊ€EÒlÔÝuÓèç €UT>üãÔÿÎßù[ƒR]›š—züAÝp\Jãaô“ÀÏéîñ[ñ÷¢Z— ‘ XÈÊ€EÒl5¾ó’è' €Õ0ýk ç,HÅV/¿%%='Û½jæ§­L̨ŸòÞ+ÃoFµ3"°•‹¤ÙªÂ碟4Ö@U,{bȲ͋ÃoJ©u-Ü0õý“4ºþ˜”ÊQôsÀ³œü¥øûQ­Ì€…H,deÀ"i¶*¶z~ª+¢Ÿ5ÖÔ “†—;¿9ü¶”&½î>¿›†—푪îÃÑòX£¾Ñ¿Â2`!’ Y°HšÍFWý¬°¶ª2—œ5óS!:SóÂoLiR*v|ý¿"hÙ­ÑÊXMÓ?1/úžT{3`!’ Y°HšÍzßþoÑϳ¨|àúÔ?ñSg‹ç†ßšR+¿< ¾÷¿Sy÷eÑœX ½C>~[ª½°É€…¬ X$ÍvåC7G?m̲ª÷h]±Oêîñöð{Sª{Ó?Z¾ܧӸæ“R*GÑ|XKÕŠûSgþzáw¦Ú› ‘ XÈÊ€EÒl78óëÑOs¨¼÷ÊÔ?ñó©³åÆá·§T—ŒV&×ðÂÅá÷¦Ú ‘ XÈÊ€EÒlWl÷*_Ø´@Õ[ž†—푺{¿+ü•"êîüæ48ý+i|ÇE)•ãè?’Ì…ªJÝ]7 ¿=Õî XˆdÀBV,’æ¢ñ-'G?odT.»% ÎYŠÞ~‹JsYw·ÍfþYŸþIDL¾ñíç…ß ’ ‘ XÈÊ€EÒ\Ô;âÏ¢Ÿ7"Tå̼ýã?›Š­_~—Jk[±Õ Rÿˆ§Ñ•ßNÕã÷Fÿ  ³þÑ~“J,D2`!+IsÒüõRµâþè'€HåxæW« Nùr*¶}iü*­bÓ?IhúŸÛñ’³R¢ÿ$dú;î΂ ÂïSÉ€…H,deÀ"i®^¼cô@]Œi|ë)©ÿ¿OÅÖ/ ¿U¥Ÿ¯XüòÔ?æ“itÕþ©zìîè?-ÔÄðü­ÃoUi:"°•‹¤¹ª»ë¦ÑOuTŽSyï•ip΂ÔÝm³ð»U-l‹ç¥ÞHà Ïü³˜ª*úOuS•©Øñ ñ·«dÀB0²2`‘4—•w}?ú™ æÊe·¦áE;¤Þ~ïùU”Ñ7¬&¯b«ç§ÞÁ4ó7hÇw^œÒxý=57¾åäð;Vúi,D2`!+IsYÿøÏD?s4É “ÆKÎJƒ3¾–º{½3u¦æ…ß´j^ÅV/xò'¬Œï¸hæWXÀêèòáð»Vúi,D2`!+IsÚÏMU÷‘è§€†ª½+®Ú?õùëTl|ôÁà IDATÿêøûVõkjÔÝým©ÂçÒèªRùÐM~%k¥Z¾tæÎ ¿u¥ÿÌ€…H,deÀ"i®^ºKôSÀ„(^’FW8ó“þº;¿9üÖUþŠm^òį:waÿøŒTõþÇ€ 38ëÿ ¿{¥ŸÏ€…H,deÀ"i®ëîúþ$s¢züÞ4ºþ˜48ý+©·ßï§bË_ ¿5{Û½*õý“48g~ßtbª½3ú9&ÝxŠÅ/¿…¥ŸÏ€…H,deÀ")GãÛÏ‹~îhƒrœÊ®â×}÷Î|É×Y¸Qø=¬•´`ƒÔÝãí3¿*jxÁ6i|ë)©Zqô?M´Ðèº#ãïcé—2`!’ Y°HÊQÿ迌~îhó¨å¡›Ò躣Òà̯§Þ¡Iů ¿‘[;TÙõ7RÿÈO¤Á9 Òè†cSùÐÍ)•£èJ`Fo¿÷ÆßÍÒ/eÀB$²2`‘”¥¤ªó`ô“OªzËSy÷Òè‡ÏüŽûéQEw÷ßL…ÆßÏMnÁú©ûÍÿ’z‡|8 Nùç4¼l4þñé©zä¶™1ÔÕôð½35/þ¦–~)"°•‹¤\ /Ø6úÉ€•«ÊT=r{ßvN]u@œ3?õûtê}û÷žøÉ-ó× ¿­CÛrãÔÝm³Ô;øRÿÄϧáy[¥ÑIã¥çÏüßÍOS ©§|9þÞ–ž&"°•‹¤\;½qæ?@£‡©zìîTÞ}YßüÝ4º|ï™_‡Óÿî?¥ÞaMÝ}~7uwyK*¶yIêL­ÓŒ[}ë¦b§7¥î·~gæW,õÿÌÌO¥^ºK]{ÄÌ8¥|ðÆTu‰þ¿>ÌA'‹6 ¿Í¥§Ë€…H,deÀ")gã[O~ö «ª÷èÌO&)ï¹"—œ™F×3óKFW쓆m?óLg|- NúÂÌO4éû7©ÔŸ?Yïð¥ÞxjÓ?åçþßÍtܧgþg Nû×™ÿ™Ó?qxñŽ3ÿ»¦UÒèÆïÌüd™ò¾«gþÿ4ýk”€”FW~;üûsé™2`!’ Y°HÊÙô—ïP'ݽÞþý¹ôL°É€…¬ X$emþº©Z~GôÓ3Ê{.ÿî\z– XˆdÀBV,’r78g~ôÓ3úßù»ðïÍ¥gË€…H,deÀ")wÅv¯Li<Œ~þh¹jÅ©³p£ðïÍ¥gË€…H,deÀ")¢Ñ߉~þh¹ÁYßÿ¾\ZY,D2`!+Iõú`ôó@› »©Øæ%áß—K+Ë€…H,deÀ")¤©y©üÉ¢Ÿ@ZjtÅ>ñß•K« ‘ XÈÊ€ERTƒÓ¿ýÐFU•º»mþ=¹´*°É€…¬ X$EUlóâ”F½èg€–ßzjøwäÒªfÀB$²2`‘ÙèšÃ¢ŸAZ¦wÐÿ—V5"°•‹¤È]äT>xCêLÍ ÿ~\ZÕü·"°•‹¤èÊ»/‹~ h‰þ ÿþ½¸´:°É€…¬ X$E×?æ“ÑO!-PuJ……/.­N,D2`!+Iá-X?UÝý0á†ç.ŒÿN\ZÍ XˆdÀBV,’êÐàì©èç€I6ê§bñ+¿—V7"°•‹¤:TlûÒ”F½è'€ 5ºjÿðïÂ¥5É€…H,deÀ"©.®>0úI`Bu÷x{ø÷àÒšdÀB$²2`‘T—º{ný$0ÆKÎ ÿ\ZÓ XˆdÀBV,’êÔøŽ £ŸE&Lï‡ÿ-­i,D2`!+Iuªä'¢ŸE&H¹ìÖÔ™Z'üûoiM3`!’ Y°HªUó×KÕ£wF?Lˆþwÿ)þ»oi-2`!’ Y°Hª[ƒ3¾ý40ª÷§ÎÏ ÿÞ[Z› XˆdÀBV,’êV±õ St¢ŸGnpúW¿ó–Ö6"°•‹¤:6ºbŸè瀫º§b«ç‡ß-­m,D2`!+Iu¬»Û[Sªªè'€†ž»0ü»ni62`!’ Y°HªkãÛÎŽ~"h¢A'Û¼$ü{ni62`!’ Y°Hªk½Ã>ýDÐ@Ëw ÿŽ[š­ XˆdÀBV,’jÛÔ:©|xIô3 @“Œú©ØþÕñßqK³” ‘ XÈÊ€ERœú¢ŸIdtÅ>áßmK³™ ‘ XÈÊ€ER+ýjªúG?•4A9NÝßþݶ4›°É€…¬ X$Õ½áÅ;E?•4ÀèÚÃÿӖf;"°•‹¤ºWlÿš”Æƒèç€:«ªÔÝsóðï´¥Ù΀…H,deÀ"© ~xHôs @o>)ü»li.2`!’ Y°HjBÝÝsf=O§·ï{¿˖æ""°•‹¤¦4þÑiÑO&54¾ýÜðï°¥¹Ê€…H,deÀ"©)õxô“ @ õüÃðï°¥¹Ê€…H,deÀ"©I•w_ýlP#å}W§ÎÔ¼ðﯥ¹Ê€…H,deÀ"©IõþËèg€éññðﮥ¹Ì€…H,deÀ"©QÍ_7UÜýtPåƒ7¤ÎÔ:ñß]Ks˜ ‘ XÈÊ€ERÓœü¥è§€èù‰ðﬥ¹Î€…H,deÀ"©qmñ¼TË¢ŸO•\积¨°É€…¬ X$5±á¹[D?ŸêöÑð瘟°É€…¬ X$5±b›§4èD?¡(ï½2u¦æ…W-åÈ€…H,deÀ"©© °Wô @€ÞÁþµ”+"°•‹¤¦Vìô¦”Êqô3 @Få]—†?-åÌ€…H,deÀ"©Én86ú £ÞþÝ´”3"°•‹¤&×ýÖïD?£d2¾ã¢ð便ܰɀ…¬ X$5½ñÒó£ŸR2èí÷Þð拉ܰɀ…¬ X$5½Þ¡‰~J˜cã%g†-EdÀB$²2`‘Ôø¦æ¥òþk¢ŸSæPwŸwÇ-dÀB$²2`‘4 õú‹èç€92¾õ”ðï¡¥¨ XˆdÀBV,’&¢©uRùÀõÑO*s »÷»â¿‡–‚2`!’ Y°Hš”úÇ~*úI`–o:!üûg)2"°•‹¤‰iþº©\vkô³ Àl©ªÔÝãíñß?K°É€…¬ X$MRýã?ý¬0KF×þ½³ ‘ XÈÊ€EÒDµ`ýT-_ý´°¶Êqêî¶Yü÷ÎRp,D2`!+I“Vÿ»ÿ3úi`-®: üûf©°É€…¬ X$M\ 6HÕ£wF?¯¬©Q/;¼.þûf©°É€…¬ X$MbƒS¾ý¼°††lþ=³T— XˆdÀBV,’&²…¥êñ{£ŸXVSÕ}$[¿0þ{f©&°É€…¬ X$MjƒÓ¿ýİš§üsø÷ËR2`!’ Y°HšØ¶Ü8U‡¢ŸYVQõÈí©³pÃøï—¥eÀB$²2`‘4É ÎúFô3 À*êý—áß+KuË€…H,deÀ"i’+¶zÁÌïK ÞÊ{.O©yáß+KuË€…H,deÀ"iÒž»EôS ÀJôxø÷ÉR3`!’ Y°HšôŠE›¤ª÷hôs À3ß|RøwÉR]3`!’ Y°HjCà ¶~nx:å8uw{kø÷ÈR]3`!’ Y°HjCÅ6/NÕ`Eô“ À/]ùíðï¥:gÀB$²2`‘Ô–†íýäðó†E*¶uø÷ÇR3`!’ Y°HjKÅ6/IUÿ±èg€ÿ4ý´Êð’o†7,5-"°•‹¤Ö6ÝT.»%úh…ªó`*mÿݰ԰ XˆdÀBV,’Ú\ÿ˜OF?í0ýS±£¿–š˜ ‘ XÈÊ€ER«›Z'•÷_ýL´ò¾«g¾ ÿNXj`,D2`!+Im¯wøŸF?Å“«ªRïÛ¿þ]°ÔÔ XˆdÀBV,’ôœTÞ}Yôs 0‘F×þ°Ôä XˆdÀBV,’ôœÔ;èƒÑÏ1ÀÄ©+R±ý«Ã¿–šœ ‘ XÈÊ€E’žh|ûyÑO2ÀDœùïáßýJMÏ€…H,deÀ"IOÔÛ÷=ÑO2ÀÄ(^’: 7 ÿîWjz,D2`!+IúYãý,L„Þaÿ#ü;_i2`!’ Y°HÒÏêîõΔª*úih´ñ’³Â¿ï•&%"°•‹$ýb£ë‰~šškýD4JÿØO…¿+MZ,D2`!+Izú§%ú‰hŒñÒóSgj^øw»Ò¤eÀB$²2`‘¤ghÁ©|xIô3 P£~êîºiü÷ºÒfÀB$²2`‘¤g®Ì_G?Óµ78g~ø÷¹Ò¤fÀB$²2`‘¤gij^*ïº4ú©¨­rÙ­©³p£øïs¥ Í€…H,deÀ"IÏ^wŸw§TUÑÏ5@ýTUêðþðïq¥I΀…H,deÀ"I+o|Ó ÑÏ5@팮>(üû[iÒ3`!’ Y°HÒÊëîò–”ÆÃè' 6ªîéØöeáßßJ“ž ‘ XÈÊ€E’V­áe{D?ÙµÑ?þ³áßÛJmÈ€…H,deÀ"I«V±íKSÕ,úÙ7^zAêLÍ ÿÞVjC,D2`!+IZõg~=úÙˆ5¤în›…_+µ¥î>ïŽþSO‹°•‹$­F[<7UÞýt„ž¿(þ»Z©Eõö{oô{ZÌ€…¬:[¿(üÑ•¤&Õ?îo£Ÿn€åÃ?žù‹~ÑßÓJmªwУÿèÓb,dÕYüÊðGW’ÕÔ:©¼÷Êèç »Þ!ŽÿŽVjY½ÃþGô}ZÌ€…¬:;¼>üÑ•¤¦ÕÛÿ}ÑÏ7@V£kÿnVjcý#?ýÇŸ3`!«â›o t%©‰o=%ú È¢ê-OÅâW„/+µ±þ1ŸŒ~h1²*v{[ø£+IM¬»ë¦)ÑÏ8ÀœëŸøùðïd¥¶Ö?ásÑO-fÀBVÅžït%©© /Ú!ú˜SãÛÎI©yáßÇJmmpæ×£ŸZÌ€…¬ºû¾'üÑ•¤¦VlõüT=~_ôS0'ªÁŠTìø†ðïb¥6ç/ÓÉ€…¬º‡}4üÑ•¤&×?îÓÑO9Àœœô¿Â¿ƒ•ÚÞè꣟ZÌ€…¬zÇ6üÑ•¤F75/—^ýœ̪ñíçúÕAR ßrrôs@‹°Uÿô¯†?º’Ôôº{nžR9Ž~ÒfÇ “º;ÿZøw¯’ž“Ê»¾ý"Ðb,d5¸`qø£+I“Ðèò½£Ÿt€Y18ùKáß¹Jz¢ò'?Š~h1²^¹_ø£+I“P±õ‹RUü$úYX+ã;/N©u¿s•ôœ™_ã•F½èg3`!«ÑM'Æ?¼’4! NúBô³°æ†…_$Õ¨b»WE¿ ´œ Yï¹*üᕤ‰iþº©¼ÿšè§` Nùrü÷¬’ž¬·ï{¢ŸZ΀…¬ªî#á¯$MÜ1YUÑÏ;Àjßy‰_$Õ¬þ±ŸŠ~h9²ëlõ«á¯$MR£kˆ~ÚùÿÛ»óï»ëúÀã ›ˆ£+—ªƒãÒâ©ËTgÅÚ:Õ9ÇnÌ´:N[ý¡SKgN=vê8Ã÷›„%a „M„0,‚`‚€,%‚-²ˆì„ $ßû¹ûçóš“o:´È–åÞïëÞûy<Îyþ y½îy_¹7€­úé cÞ‘þ¶*é¹u®žÊžÔœæ\qÂûÒ‡¯$MRÅoŠª3“=Þ¶Hçò/¦¿«Jz~½›OËÔœæ\óœýÒ‡¯$MZ«þWöxxYåë¢1½cú›ª¤çW>üýìAÍ9`aε/ûËôá+Iׂ]¢|òîìðâzíh·Oþ{ª¤ç75?ªöÆì)AÍ9`aÎuðµü,IXëÌOex€Õ¹â¯ÒßQ%½pÅÒ·epÀÂÜë?´*}KÒ¤Öÿñ%ÙcàyúÝৃ¤®uÎ~Ùc° Ýˆ™ç§aIšÄšGÿ‹ˆ^+{Òü£N#šÇ¼#ýýTÒ‹×¹fAö¤,äØôTÙCX’&µîugy€gµ/ú|ú»©¤—®wçÙ£°£yÎ~éCX’&¶E¯Œò©Ÿdz€èÝùü7SI/[õôÙã°£}õtú–¤I®uÆ'³G=PsÕÆÇ¢Xü‹é勒^ºâˆ7e ˜å€…½Õ§bIšôz·Ÿ—=ªªÙÿh—ýN*éåkŸÿÙf9`!EÙx2SóÓ‡±$MrÅa¯ªõtöÈj¨{Ã1éo¤’¶¬îÇg ˜å€…4Ųw¥cIšô:—þEö¸j¦\{W4½2ý}TÒ–U>~köØ€YXHÓºèóéÃX’&¾©¢|øûÙ#¨‹^;š'¼7ÿmTÒUüšˆ²Ÿ=9`–Òtÿþ´ô,Iu¨ùÕéÃ'0':ßúRú›¨¤-¯uÖog x–ÒôŸ¼7} KR]ê®Z–=ö€ ×`åì·Bg¿‡JÚòº7ž=:àYXÈSUÑ8ì éCY’êPqð«£zæáìÉL¨ªùTGüRú[¨¤­«Zöø€g9`!UëÂ?IÊ’T—Zg~*{ìª}þ¦¿JÚºšËÞ•=:à9°ªwûùéƒY’êTïŽÙ£˜0½[ÎHû”´õu.ÿböø€çpÀBª²µ!f¦wJÎ’T—ŠÃ^Us}öø&Dµþ§Qüšô·OI[_ÿ'Wex,¤kžúÑôá,Iuª}Ñç³G?0 Ê~´NÝ7ýÍSÒÖW²{D¯=Eà9°®ó%éZ’jÕÔüèÿôÚìñŒ¹îµ‹òß;%mSí ÿ${„Àó8`!]ÿ‰;Ó´$Õ­æ1ïˆè6³W0¦6ý'¹ÆôŽéo’¶­þ½ßÊ#ð<X űû¤iIª[«¾’=þ€1T5ÖFqøÓß8%m[Åâ×Eô»Ù£žÇ #¡ã+æ$iî›Þ)ÊÇnÎ^À8©ÊhñÉü÷MIÛ\ûâÿ–=Ià9`a$ôŸ¼7}PKRkžôˆ²—½€1ѽîàôwMIÛWÿþk²G ¼ ,ŒŒâÄ÷§kIªcÝ•‹³W0ú¬ŒÆôŽéoš’¶½âÈ·D”ýìq/È #£³òðô-Iµlá+¢\{göFXÕXÅoÊÏ”´]mú%UXå3ÄÌÔéC[’êXó乸^XUF댗þŽ)i;›Þ)ª fOxQX)ͳ~'pKRMë~÷Èì5Œ îwI¿”´ýµÎùýìq/É #¥·úâôÁ-Iµþ)¡u«³W0Bú^?û­ éï—’¶»þÝ—=Rà%9`a´”ýhî÷%)«Ö©ûÎ~(@ÕXÅþn#MBÅ‘o™ý[,Œ2,ŒœöÕÓé\’ê\wÕ±Ù«ÈVUÑ:ûwÓß+% ¦î÷–fOxYX9åÓÇÌÔéC\’jÛA¯ŠjýýÙëHÔ]¹$ÿ­RÒ@*Ù=ªö†ì±/Ë #©uîþéƒ\’ê\ëëóSBPSý¿éÒß)% ¦Î•_Î+°E°0’úü0}KRÝëÞptö:æXÕ|*Š£Þšþ>)i@-|ETË-°E°0²š§þzþ@—¤:·è•Q®[½€¹R•Ñ:óSùo“’Vû¢ÏeOØbXY½_š>Ð%©î5Oú`DÙË^ Àè\³ ýMRÒ›Þ1Ê'ïÎ-°Å°0ºª*Šc÷Éì’Tóº×”½€!ëÿø’hLíþ)ipùöÆFZ÷æåéƒ]’jß‚£|ü–ì• Iùä=Qò ùo‘’ׂ]¢ZÿÓìñ[Å £­ìG±ì—ó¼$ռ汿Ñkeo`ÀªÎL4{wú¤¤ÁÖ¹ä Ùã¶šF^÷¶sÓ¼$i^t®üëì• RUEû¼ÿœþö(iÀ-Ü5ª dOØjX}eÅñïÉô’T÷¦wŒþCßËÞ À€t¯?<ÿÝQÒÀë|ëKÙ㶉ÆBï®o¦zIÒ¼(–îU{CöZ¶Sÿþ«gÿÓZö›£¤ÁV,Ù+ªÖÓÙ#¶‰ÆCUEqÒ¿Jø’¤yѾèsÙ[ØÕÓD±øÓß% ¾ÞOÉ1°Í°06ú­Š™ú’¤yÑ»ãüìµl‹^+š_ýµô7FIƒ¯yâû#Ê~ö”m怅±ÒZñ™ôÁ/IšÅ¡{DõÌÃÙkØJ›¾a9û}QÒššýVfØ.X+å3ÆÌ¢Ýò€$)ZË?1ûoÀxè~ÿ¸ôwEIé½âÓÙ#¶›ÆN纃Ó€$isÝŽÉ^ Àè?tC4ì’þ¦(ið‡üBTÍ3°Ý°0~ºí(Ž~{ú"$Í‹ÆÂWD¹æ¶ìͼ„jfM‡¿1ÿ=QÒPêݲ<{ÌÀ@8`a,õî¾,}H’6×<îݽVöj^H¿­S÷MG”4œZ§<¢ª²' „ÆVë‚Ϧ/IÒæ:—1{-/ ý·šþ~(iHôª¨Öÿ4{ÌÀÀ8`al•ŸEcñžù‹A’©ùÑ¿çòìÕüÝUÇæ¿JZÝŽÉ30PXkÝÛÎM_ ’¤ÍKöŒjããÙ«ØôËA÷]éÒß % §Ö×=¢ìg(,Œ½æ9û¥/IÒæZ§ýFDUf¯¨µrÝê(Ù=ý½PÒp*Ý#ªgÊ50pX{å†Ç£±øué‹B’´¹îõ‡e¯¨­ª±.Š¥{§¿J^ýÕßÌ50X˜½»/‹™X’¤y³_KZ>¼*{5@ýô»³ß’œþF(ihu.ùBö¤¡qÀÂÄh_r@úÂ$m®Xú¶¨Ú²WÔJû”þ6(ix5Û'¢[d,LŽn;Šãß“¾8$I›kŸ·öf€Úè®\œþ&(ix¿:ʵwe*,L”þš;bfá®é D’´¹Þͧg¯˜xý».ŠÆÔéï’†ÔÔüè¯þfö¨¡sÀÂÄéÞ¼<‰H’6wЫ¢\·:%\DË ÍIDAT{5ÀÄ*»yö.ý-PÒÐê\}`ö¨9စ‰Ô¾äÏÓ‰$isÍãÞí79`ªGqä›Óß% ¯ÖòOD”ýìqs “©ßæÉN_(’¤Íµ/ú\öf€ÉÒ-¢yÒÒßþ$ ¯æ²wFÕ\Ÿ=m`Î8`ab•ŸˆÆáoL_,’¤Íõn9#{5Àd¨ªh¯øtú›Ÿ¤áU,~]”?»7{ÚÀœrÀÂDë?´*fì’¾`$Ióf‡·\{göj€±×¹úÀü÷>IÃkÑnQ>rcö¨9瀅‰×½ýü˜9p~þ¢‘$mþºÃöÆìÕc«wÇŠhLù»‡4±Mí½».Ì5 µÐYyxþ²‘$ÍÖþÆe¯Ký¯ÆÂ]Óßø$ ¯î÷Ë5Æ µÑ¾ø é G’´¹Þͧe¯+åÚ»¢8ôµéo{’†×¦Ÿƒ:sÀB}”ýhžõ;é‹G’ô¿ßùÄíÙ›ÆBµñ±(Ž|Kþ»ž¤¡ÕùÖ—²G ¤sÀB½tŠhžò‘ô$IšÍeõLöf€‘Vµ7Dó„÷¦¿çI^Kþ<¢ª²Ç ¤sÀBí”­ QœôÁôE$Iš­³χrx1ýn´–"ýOÒðj_øÇU™=m`$8`¡–ªæú(\+KÒHÔ½þ°ìµ£§ª¢½â3éïw’†Wûÿ5¢ìgOX¨­²ñdÇ˜$©öMíýû®Ì^ 0R:WüUþÛ¤¡Õ¾øÏ|ó ü,ÔZ¹qMËÞ•¾ $©îKöŠjÃ#ÙkFBwÕ±éov’†W窯dIX¨½²x*Š“>˜¾¨$©î5¿ö¯#zí쵩ú?¾8Ó;¦¿×INÝkfYX`ÓKóéhžüáô…%Iu¯séÙ+Òô¼> wM§“4„¦wŠÞOÎ30Ò°Àÿ×)¢¹ü“ùËK’j^ï–åÙæ\¹ö®(}múûœ¤ÁWôÏ¢÷¥ÙcFžø§ºíhýÍH_b’Tëíåã·fo˜3Õ†G£8ò-ùos’^q䛣\s[ö˜±à€~^UEûêéôe&Iu®8ê­Q5Öeoºª½!š'¾/ýMNÒàkžðÞ¨6<’=f`l8`ѽ餘™Ú1}±IR]kþñˆ²—½`xúÙw°ì·8Iƒ¯}ÞþFö”±â€^BïÞ+£qðkÒœ$ÕµÎ噽 `8ª2Ú+>þ'iÀMïÝï-ýÕ`ë8`—Ñ_sG4ŽÚ;ÙIRMëÝú³W VUEûâ?K{“4ØŠÃßýVfO[X` ”­ ÑrSö*€é\ùåüw7I­uêG£Úøxöx±æ€¶TUEçÚE13µCú”¤ºUùæ¨fžÈްݺ+§¿·I`Ó;FçÛÿ'¢ìe{X`+õî¿.KöÊ_†’T³š§|8¢ßÉ^°Íº7˜þÎ&ipG½ÕOÁ9`mP>ýP4OÙ7})JRÝê\ò…ìÛ¤wë™Ñð-ïÒÄÔ¾ð£joÈ-0Q°À¶*ûÑùÎ’˜™Þ9}AJRêÞxBö€­Ò_ýÍhLï”þ¶&iû+–ì½;/È+0‘°Àv꯹=Šã5}YJRmšÞ1ú÷\ž=þ`‹ôï¿& wÍW“´ÝµÏÛ?ªÆºì±Ë B§íKˆ™Xœ’T‡ŠC÷ˆòÉ{²§?¼¤òáUÑ8èUéïi’¶¯æÑoŸ=F†Ë PïïF±ì—Ó—¨$Õ¡æ²wFÕ\Ÿ=úà•k~Å!»§¿£IÚŽìoÿïˆn3{¤@-8`Aëw£³rIÌ,Ø%©JÒ„×Zþ[e/{òÀs”OÝÅa¯O?“´}ïÏåÚ;³Ç ÔŠ’þÏî‹æiO_®’4éu.= {äÀ³ª DqÔ?O7“´m5ý•èßsYö(ZrÀÃTUѽõ¬hþ¦ôe+I“\÷¦¯fO|ˆjæ‰hóŽô÷2I[_±d¯èýàke?{”@m9`¹Ð)¢sÍ‚˜Y´[úò•¤‰lz§èßuö´ Æªæúhžðžü·2I[U±øuѽþ°¨:3ÙcjÏ Ì¡ò™G£uÁgcf–±$MZÅ!»G¹nuö¨ †ªö†hžü¡ô72I[^qèk£ûC£joÌ!À?pÀ úÝͳÏ!‹$ ¸béÞQ5ÖfyjdÓ¿›§|8ýmLÒ–U,Ù3º×4{xŒ,¨¿æöhûŸ²HÒkžôˆn‘=⨃N#Z_ÿXú›˜¤—¯yôÛ£»j™÷caX`ôùA4Ïü”CIPísÿcDUfw&XÕ™‰Ö©û¦¿…IzéZ§ýfôï¾Ô›1Œ,0BúOÜ­‹>3 vI_æ’4îu®øŸÙc€‰>^ùhú˜¤®8tèüÝrÍmÙãØ X`•3k£³rI4{Cú‚—¤q®{Ó‰Ù#€IÓ-f¿Ñ!ûíKÒÏ55?Z§|$z?<ÙÏÁ˜rÀ£¬ÓŒîߟÅÉÿ&éKÒ86½Sôï»"{š0):h}ýcùï^’ž­yÜ»£{í¨Öߟ=!€í䀯DÝÝѾ⯣±xÏô’4N¿:Ê5?ÊãLÂ7¯œþñô÷.I›ŽVö‰Î5 ¢\{WödÈ Œ›^'ºw\ͳ?f¼"ý‚$CſՆG²'8ãÊÏI¹-Ø9Z§ýFtW.q´Ì Œ³N½ÕGë‚ÏÆÌ¢Ýò?3S;äð¤©}ÞþU™=©‹ã•O¤¿gIׂ£yü¯F{ŧg¨ÿ“oGÕÞ˜ý/X 6ýdƦŸj_ùåhžúјY¸kþ‡IJ¬sÙÿÈÍŒ²^+Zg|2ýKÛ¦æGqø£uÊG¢}Á‰ÎÕFï¶¿‰ò‰Û#úÝìáÀˆrÀuÔïnþ†–ï-ÖŠÏDqü{bfzçü3’4‡u¿{Dö4`•½hŸÿ‡Qº‡¤%{E±ôm³múÖ”æWm¶M^›¾A¥sé_DçšÑ]ulô~tvôrU”OÞÑkgÿKÆàZž¸3º·í«¾­sþ}'¾?‡ì‘þGfIJSógK€H÷ÿg]¾`‡nþIEND®B`‚‰PNG  IHDR› üEÑà? pHYsèèµ{Rk IDATxœìÝ[ŒmwAÇñ¡RŠT@P …xI”`Q!B|ÓPIŒÆ'”øbbb 1&¾H{ÚÒÒ ½RLLiQ°k”K•ˆÄ¢R¡Plhå^z¡zŸ½çºçof¼D‘ž}¾ç¬™3ŸOò{m²×^ûÌZßîËÊ€ÈJõ± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €ŒØ@Fl #6›ÈˆMdÄ&2b± €Ì¡M‹‡î[·¿olÜtÁX»þUcvÅ‹ÆêyO«¯_1{ü;ë có£WN}:À··µ6Ö®}Åô×Îf'óÞð´½®°vý«ÇÆMo[w¼,þê8¬GlZ,ÆöÝŸ¹d¬]÷ʱzñs§?íàïìï[ŸzÇÔg7|g›ó±võ˦¿†6;l»øy{opÙ¸ù²±}Ï-{}â08icÓbþàØ¼õº±vÃkÇê…Ïžþ³“kGž4¶n»aêÓ¿Õ±öÇ?3ýµ´ÙaÞ…Ïkùcó3×ÅÚCãdurŦձõÙ÷Œµë~u¬žsÚô'‘œ;ç´±ýÙ¿žúl€%ƒÓÏNMmfc÷Þrþ'¿46?uíX¬=±i1p¬¾ñû'vÈwäÔ±ý…¿[æï0¡õ÷üÖô÷f6–Ùú{ûøÄ¦õ_7ùƒ³C¾³ž0¶n¹f™¿kÀÔ¶7ÇÚÕ/›þ¾ÂÌÆQïì'ŽíûnkcÓö×oß{GÉäÎõ6>täXþ´ÿÁÞGYV—‡Þß Šóǧ8o|“\ã˜h41&fÅ7rscó&^õMÌInÝ tÓ MƒÌ£ ¢ ƒÈÔÌ3Ȭ Í$2u3ì}æ³wUAl›¦ª»ê<ûìýù®õù'+e׳ûyºÎ9Á•ùý©Øå5á»ÍZëðOÎí±©uä§Âÿ£h¶Î±ÿ#¥²Ü”çš$I’¤ 4¼ëÒ”/Ú2|DzY믾`nŽMƒ»/Ÿ~ùRôÍÕ>ðý)õ;sñ\“$I’Tú—í¾gÙ¬µýèÜ›Z‡þ~ø ÍÕZ¹u*[kæây&I’$©BuŽû|ø¾d³Ö¿ý¼M;6 î¸(ü?‚æ*vze*×®žËç™$I’¤ªÔk¥Ö×-|ï²Yiãã›vljùÇáÿ4Ôâ­Òð®KæòQ&I’$©bMýãr±ô%ñûflrAÜwýÆ›†Ýšòm7ÿ y¶Ý< n8a>že’$I’*Öà–Óíž01^:ßýû;6uNü‡ð/žfê]²×|<Ã$I’$U´îY Ã÷ ›¹íž“†xåõ›†GS¾Ýsã¿x§{Òçó&I’$©Š•Ãé÷‰ÞG€lƺï9»cSÏÇP }À{Stçó&I’$©¢M} u±ü á{ ÍHkŸßœÝ±©Øûá_4ÍRìúºTÌç³K’$IRÅÞseÊ=+|?²üôÚ™›†÷^þÅÒÀ×zÞ{õ(ž]’$I’*^ïÒ½ãw ÍD÷´¯ÍìØÔùþ¿„±4Èä‚Ô¿ö[£xfI’$I“:ßþlü®¤§ÓÚí—gvlòYFiêS'$I’$éÉ•íµ©Xþúð}ÈžÖàÞk6|lÜyIøIs´ü£éO$I’¤uÞ}YÊn¾·ÙõV-Úð±©sÚ¿†‘4CkÏ·§²óè(ŸU’$I’ƬÞù;‡ï.@6ëO¥û™cS±×;¿Hê¯Xòâ4|èÇ£^…*ª IDAT|FI’$IÇÊ2µødødOmÛÍÓ°xhýǦá#÷L¿YsøI½mûŒ4¸õ¬ˆÇ”$I’¤1¬ÌïOÅN¯Šße€ôTú×·þcS¿8ê¯wñʈç“$I’¤1npÛªéßžˆÞg€l½º'ý¯õ›ÚÇlþÅQoïüeÄsI’$IR êž9¾ÓÙzµö~çúMÅò7†qÔWk¿w§4èF<“$I’$Õ¡á µüðÝÈ~ÞÂ-Rêµ~öØ4|ôÞø/ŒZ¿!x¹vuäcI’$IR *¹;K_¾ãÙÏÜyñÏ›¦ÞÈ)ú‹¢¦&7Kƒ?òy$I’$©F n8>~ÏÒºz—ìõ³Ç¦Ž×¾2Oºg-Œ|I’$Iªaã>¾ëÙÏèžôÅŸ=6µŽø£ð/Šúiôé×UK’$IÒœÖÍSk÷7…ï<@öŸÚ‡|øgMù®¯ÿ¢¨—bÙ+Rùؽ‘I’$I5npÇ…)ßvóðÝȦ»¼æ?>³©‹p>¹ ü‹¢F¶}F¬>?ôÁ#I’$©þuÏø÷øýHÓ&¤Ô-¦6³ÁO¯ÿ‚¨•Þ»F?s$I’$5¡a?µöùÍðȦ ºeúG3ëßxRøC}´ÿDJeýÈ‘$I’Ô†÷ßòÅÏß…€, VŸ7ýs™u/Þ3ü‹¡Š]_›ÊÖCÑÏI’$I «wÑáû¥þžþ™Ì:§}-ü‹¡=+ ï¹2ú#I’$©‰•ejúÑø½®wñÊéɬ}ÜçÿÆ_ÿòý¢/’$I’\ùè=©Xú’ðÝòë»túç1kñ‡á_ ã­óíÏF?W$I’$) ®?.|?‚¼Á¦>!rª¬µÿ{ÿÆWk·¥ÔÍ£Ÿ)’$I’4]瘿ß“ o¨îÉ_šþ9ÌŠ•oÿbS‹¶Lß\ý,‘$I’¤ÿ¬,LŲ—ÇïK0Ñ<þvúç0+vSøÃxê]°<ú9"I’$I?×àÆï†ïK7Pç„/Lÿ fù.¯ ÿb?íC>’R9Œ~†H’$IÒzëýgá{ä ÓùîßMÿüeù²W†1Œ—béK§?éA’$I’ªZY<Š_¾?AÞ ïþÓ?Y¾ô¿ÆËÔ¯¤J’$IRÕëÿð›áûä âØÄ&ýÁ‘$I’¤q¨sÔ§Ã÷(ȱ‰Ykíñ¶”zEô³B’$I’f\ùؽ©Xòâð} òplbvm™†?ùAôsB’$I’f]ÿªoÄïT0QŽMÌJï‚]£Ÿ’$I’´ÑµüTø^yÍ961cíC>’R9Œ~6H’$IÒF7õ‰ÚÅ’…ïWטc325ŒË‡ïŒ~.H’$IÒ&׿âÀð òslbF7ý<$I’¤¹©,Sûà…ïY×”cO«óÝ¿‹~H’$IÒœ6|ðG)_ô¬ð} òrlbƒŠå¯Oe÷±èç€$I’$Íy½U‹Ãw.Èkȱ‰§6¹YÜ~Nôü—$I’¤ùiÐM­=Þ¿{ÁD½86ñ”º')zôK’$IÒ¼6¸ýÜ”O.ß¿ ¯Ç&Ö«Øõu^>'I’$©u¾ó—á;ä5âØÄÏ›\·œ=ï%I’$i$•Ń©ØÑN ùqlâçtOúbô¬—$I’¤‘Ö¿òàð] òšplâç_>×y4zÎK’$IÒh+ËÔ>øƒá;ä5àØÄñò9I’$I nøÀÍ)_´eünãͱ‰ÿÔ=ñ¢g»$I’$…Ö=s"|7ƒ|Ì961ÍËç$I’$iêÍ›:©µâ-á;äc̱‰Ç_>wë™Ñ#]’$I’*ÑàǧÅïi01¾›HÝÿ>z–K’$IR¥jù©ð] ò1åØÔpÅ®¯õò9I’$IZ§òá;R¾x«ð ò1äØ4ÑôOŸ;#z†K’$IR%ëžµmüÞãDZ©Á:Ç}>zvK’$IRu뵦?L)zwƒ|Ì865T±ìå©l==º%I’$©Òõ¯ýVøþù˜qlj¨©)I’$IzúÚ} |‡ƒ|Œ865PûžÕ’$I’46 ï»>å Ÿ¾ËA>&›¦Øþù©|øÎèY-I’$IcU÷ä/…ïs Ǧ†é]úõè-I’$IcWÙZ“ŠíÍÏ€cSƒ´ö{WJå0zFK’$IÒXÖ¿|¿ð½ò1àØÔ Ÿ™†÷]=›%I’$i|+‡©µ÷;ã÷;˜¨6Ǧ†èžö/ÑcY’$I’ƾÁ¦|rAøŽy…965@±ËkRÙ},z&K’$IR-ê|ëÏÃ÷<È+̱©×=‹%I’$©6•koOù¢-Ãw=È+ʱ©æÚ‡þ^ô–$I’¤ÚÕýþ?‡ï{W”cS-~v*×Ü=ƒ%I’$©v•íµ©Xú’ø½&ªÇ±©Æzgo=%I’$©¶õ.Ü=|‚›jªµû›Rêw¢g¯$I’$Õ·A7µv{cøþyÅ86ÕÔও£Ç®$I’$Õ¾þµßßÿ ¯Ǧjò‘èy+I’$I©½ÿ{Â÷@È+ı©n>3 ¸)zÖJ’$IRcÞuIÊ'Äïƒ0Q ŽM5Ó=õŸ¢ç¬$I’$5®ÎÑŸ ß!¯Ǧ)v|ÙôÇoJ’$I’F[¹æ¶”/Ú2|/„¼›j¤ÅÑóU’$I’[÷{ÿø^y86ÕDëë¿–R9Œž­’$I’ÔØÊâÁT,yQø~y0ǦšÜ~nô\•$I’¤Æ×;gIø~y0ǦhùGÑóT’$I’4U7OŲ—‡ï‰rlwÛnž†÷]=N%I’$IOÔ»hEü®q›Æ\÷Ä¿ž£’$I’¤'7è¦bùëÃ÷Eȃ86±b»ç¦ò±{£Ç¨$I’$i¦>-BŽMcfpó÷¢ç¤$I’$i–µþPø> ùˆ86‘öïž’$I’¤hx×%á;%ä#âØ4F·=%I’$IYû°…ï•€cÓ˜höûÑsQ’$I’´ ï¼8|·„|›ÆÁä‚4¼ûòè¹(I’$IÚÄÚ‡|$~Ç„‰ùåØ4ÚG|2zJ’$I’æ Á†ï˜Ï3Ǧ10¼ëÒèy(I’$Iš£Úýnøž ù=%I’$IsØàÖ³ÂwMÈç‘cSÅ î¸ zJ’$I’æ¸öï ß7!Ÿ'ŽMÖ>ô£ÑóO’$I’4 ~üýðòyâØTaƒÕçEÏ?I’$IÒ<ÕÚÿ·Ã÷NÈçcSEµþPôÜ“$I’$Ícƒ›N ß=!ŸŽM5¸mUôÜ“$I’$Íge™Z{¿3|ÿ„|Ž96UPkßߊy’$I’¤4¸áøðæšcSM I’$IRC~»i¯w„ï¡Ï!ǦŠiíñÖ”Êaô¸“$I’$¨þµß ßE!ŸCŽMÓ¿òàè9'I’$IeÃAjíþ¦ð}ò9âØT!ÅίNiÐs’$I’¤×»tïðò9âØT!½ –GÏ7I’$IRDýv*–½"|/…|86UD±äE©ì<=Þ$I’$IAõÎÞ>|7…|86UD÷´¯EÏ5I’FÛ°ŸÊ֚ǭ¹-•knýßþ0 ï¹" zíãÿ·G2ýÿë%ç’¤ºV¶JùvÏ ßO!ßDŽMU°ð™©|ä®è¹&IÒÆ×k¥áC·¤ÁêóSÿ‡G§Þ…»§î÷ÿ9uŽû«Ôù柤ö!N­}~#µV¼ùñ—,Þj“ŸŸÅöÏ›þÍàbùëSk¿w¥öáŸHïüÏÔ=í_¦_šÞ¿ê°4¸ù”é£UêæÑß!I’fT÷”¯Äï¨0±i›* óíÏFÏ3I’6\¿=}´\\ê·Sêÿ7©}ÈGRkå¯L|¢Ÿ¥31uäjíÿÛ©sÌçR÷¬…£î¸0•퇣¿»’$ýgåÚÕ)ßöáÏMÈ7cS ïº4zžI’4ÝÔoÚn:9õÎß%uNøBjüÁTìòš”O.^ΧbùRû¨?N½U‹Òà†ã§_Ö'IRTcþ"üÙù&pl ÖÞÿ=ÑsL’ÔĽ4¼÷êéßîéžúO©}ð‡R±ô%áÏÅ*)vxajúÑÔ;{»4¸ýœé— J’4ЦžÑuÿ‡²Zsl Ö¿î˜è9&Iª{e™†÷]Ÿú—ï?ýJ­¯ÿZÊnþ ; ·˜þG¢îéÿ6ý^P>EV’4Ÿµý½øgLlǦ@Å®¯þ$I’æ´aúSÜz­H£?“Š=ãçŶ›OŸzç-›>æI’4— n=3þYDZ)ÐÔûaH’´©•ÝÇÒàæï¥îÿ'µü”/~vø3®‰Z+Þ’º§~5 n[å“$IsRkïw†?ß ßŽMQ?;•­‡¢g—$iL+×Üšú—ï—Ú‡"å‹¶Œ®ñ3Š%/Nc·Iƒ[Θ~£$ISÿ‡G‡?Ó ßŽMQßøãþ*znI’Æ©~; ~üýÔ=ùK©µÛßcÌ\±üõÓ¿uæ¥v’¤Y7L?G¢ŸeÏ’cSáÝ—G-IRÅ+½'õ/Ûçñß^Z¼Uø³‹M7õæì½K÷öæâ’¤×»`yøó òYrl ÐÚ÷¿GÏ+IRE+[kRÿªÃ?0mûŒðgó£Øþy©sÂÒð'WEÿ‘“$U¼²óH*¶~ø³ òYpl ÐÿÁ¡ÑóJ’T¡¦~Ë¥õá©}ø¤|á3ßSŒVû€÷¦þ5G¦ÔïDÿQ”$U´îI_ ^A> ŽM#V,}éôûnH’^¿“7ž8ý&ÒÅvÏ >¯XöòÔ=ka*ÛGÿé”$U¬áƒ?JùäfáÏ*Ègȱiĺ§ýKôœ’$6¼ÿ†Ô=åË©Øá…áÏ$ª©Xú’ÇNŃÑ\%Iª}ØÇŸQÏcÓ(M.HÇn‰žQ’¤Q7è¦þµßJíƒ~wúYþ¿þl|ŽMó¤µrëè™#IÚ@ekMêžòåéOîŠ~fÀ¨;ÿbÜ~nô¡$iê_q`øsòu86͓޹;FÏIÒú*ËÔ¿òàT,}iø³BmûŒÔ;oÙôÏ„$iŒë©Øá…ñϘø/ŽMóarA*×Þ=r$IëT>vojþñÏ ¨ÎÑæÓê$iÌëžü¥ðç äOâØ4Zû½+zÖH’Ö©Ý1©Xú’ðgTQk¯_MåšÛ¢L%IÙðþ¦é!úyù›æAïÂÝ£g$é‰ÊÎ#>f`ê;¸õÌèYIÒFÖ>à½áÏÈŸàØ4×&7Kå#wEÏIÒÔ'Íݶ*»üRü³Æé}œ.Ù+úGW’´õ¯>"þ9slšcíÞ=c$IýNêžö5Ÿ4iê“S9ŒþI–$ͦ~';ÚëÉ*Á±iŽù×@IŠ­|øÎÔÚ÷·ÂŸ0î:G}:¥^+úGZ’4‹º§~5üù¹cÓ<¼„îÑ{¢ç‹$5ûes;¾,þy5ÑÚïÝ©,ˆþÑ–$ͰáC·x£pR86Í¡öAˆž-’ÔÌÊ2õÎÞÎËæ`´öx[*×ÞýS.IÚP½VÜqaê]´";¼0üÙǦ¹Ó»dÏè#Iü´¹öQþ €:+–½" zmô»$é‰Ê5·¦þU‡M¿Ç^{ÿ÷¤|Ñ–áÏ ÈŸÄ±i®L.˜~ŸIÒèÞ{ujíöÆøg4ÀÔKT‡?¹*úÇ^’×Ô[µ n<1uÏZ˜Ú‡"K^þL€üi86Í‘©7£•$®þuǤ|ñVáóšdjÁÞuIô¿$Õ¶²µ& ~|Zê½}jñÉéß,žýoǦ9Ò;oYô\’¤Æ4õ~ÞŸ ‚l÷œ4¸åŒè1 Iãß —†÷]—ú—ï—:Çn“Z+·ö÷R]86Í‘á7E*Iªå0u¿÷á3oñ³§ÿå]’4ÃÊaÞw}êÿàÔ=ñRkŸßHùÂgÆÏs˜˜ŽMs µòW¢G—$Õ¿~'u¾õçá3xÒÁéÖ³¢'ƒ$Éû,½8~nÃÄè86ÍѳL’jÿþí'|ÞëX¼UÜ~Nôˆ¤ÐÊΣi°úüé—ùO½®Xþúøù ±›æÀðîË£ç›$Õ¶ríí©µÇ[Ãg=°~ÅöÏ÷¦á’šS¿3=óz—ìùøû,MýerAø,†¼b›6ÑÔ§¤²Œy’TÛCS±ëëÂg=°aÅ/ðo’jûr¸þµßNÝS¾œÚû¿'勞>s!ŽM›ú <îóÑóO’jÙðÁ¥bç_ ŸóÀÌK_2ý©J’4®•Ü7Ÿº§ÿ[jü¡éCzôl…|L96m¢ÁõÇEÏDIª]ÃnNÅίŸñÀìLýÜ–kWGIšõû,µVn>C!¯ǦM±p‹é!%Iš»†Ü”Š^?ã2µ°•­‡¢G‰$ýWÃþôo^ö¯:,uNøÂ㇥ÉÍÂç%ä5æØ´ Ú‡|$zlJR­rh‚zhíû[)uóè‘"©¡ýÜû,-~vø\„¼a›6AïÂÝ¢ç¨$Õ¦áý7¤bÙËÃg;07ÚG|rú· $i>+ýIÜpBêžñ¦ Øá…áóÈ›6ÅÔ›×J’ææ 9‹]~)|®s«süßDIu{Ÿ¥ÛV¥ÞyËRç¨Oû ˜¨.ǦÔÚí—£g­$Õ¢²óHjíõŽð¹ÌÞù»DIcþ>KS/‡kíýNï³ãñi#uOüûèñ+Iãß ›Ú‡|8|¦óhr³é—¸HÒÓ½ÏÒàÆS÷´¯yŸ%˜ŽMipýqÑóX’Æ»r˜:G&|ž#°x«4¼û²è©#©"•íµipË©{ÖÂÔ>ü©ØÑ. yÍ86mŒmŸ‘ÊöÃÑ3Z’ƺî)_‰ŸçÀÈL}ÒdùÈ]Ñ£GÒˆ+»¥ÁêóSsì6©µrë”O.ŸI@6¯›6BkÿߎžÙ’4ÖM½±gô,F¯µÏo¦ÔkE IóÕ —†?ùAê_¶Oê÷ùÔÚóí)ßvóðÙd#çØ´z«EqIÛ·œî/žÐ`cþ"z Iš·÷YÚ*|ÆY%86m„ÁFÏuIËʵ·§béKÂç8«wéףǑ¤Y6õ6"Þg Ègȱi–Š^0ý1œ’¤Ù¿gÃô¯ÓW`–Ánáï¤*×ÍÓàösSï‚]Sçè?KÅ®¯Ÿ@'ŽM³Ô>â£G¿$_e9ý—ÕèTG±ìÓ/Á‘Üp†÷]—úW–º§|ùñ—Ã-Ü"|FÙXslš¥ÞË£’4võÎÝ1|~ÕÓÚïÝ) ºÑ#Jjæû,M½î{Ÿ% ÍǦYÞsEôóA’ƪ©÷wð†àÀSéžúÕè1%Õ¶2¿? n>åñÃÒ7>žŠ¥/ ÿ™²Fplšõû5 ¢Ÿ’46•Å©Øé•áó¨°Éipà ÑãJÿ½éï]´"uŽÝ&µVn=ýóþ3¤&rlš…öŸŒ~„HÒXÕ9ú3᳨¾bÉ‹R¹vuôÈ’Æ'ï³LT›cÓ,L}ƒ$ifõ¯<(|nã£}Àû|â¯4“÷Y:ü©Øá…á?³ù86Í‚÷k’¤™U®¹-Û??|nã¥{æDôø’Â+;¤ÁêóSï¼e––½<üg Ÿ%Ǧò~M’4ƃÇ¿³3“›¥Á­gFO1itõZipÇ©wáî©óíϦÖnoŒÿ9˜ØtŽM3Ô>ì÷£E’4õÎÞ>|fã«ØùÕ©l==ʤѼÏÒ¢-ÃæòyàØ4CSË“$ià ¸Ù_œMÖ9êÓÑãLšû÷YZò¢ðŸ-€|D›fhpÛªèç•$U»²Líƒ?>¯zè_}DôT“fÿ>K­˜þ$ÖbÙ+†ò@ŽM3±í3RÙ},ú&I•nêeáó¨Õûe–kWG6éçô9Üåû¥Î±Û¤ÖÊ­§ßo,úg ¯ǦhíóÑ4IªtekM*v|Yø¼ê¥}Àû|@‹Â+×Üê}–&fDZiº')ú'I•nêa=«zšú”.iT•ß™ú×›º§ýKjô»©Øþyá?ùrlšþµßŠ~îIReÞ}™—ógñViøà¢GjXÙyô¿ÞgéØmR±ëëâÿ¼LÔƒcÓ Lý ‡$i=•ÃÔÚûás¨·ö7ÒF×ï¤á§ÞÅ+Sç˜Ï¥ÖŠ·¤|rAøŸm€¼¦›žF±Ó+£’TÙú×>§fè]úõè‘§±~Ÿ¥g…ÿÈıéi´ü£èg¥$U³aÿñ®À¬`»ç¤áC·DO>U°òÑ{ÒàÆS÷¬…©}ø'R±äÅñ^®ãØ´a½svˆ~~JR%ë_¶OøŒš¥}ðS*Ëèñ§*½ÏÒòׇÿ¹ û9ŽMOcpËéÑÏTIª^ýv*vþÅð 4Oÿ‡DO@ªa? ï»núåp¾Z+·öãÁ±iC&¤²x0ú1+I•«wÞ²ø 4R±ô%©Ì§—Ãõ¯ý¶÷Y˜ŽMÐÚí—£Ÿ¹’T¹ÊöZê|ç/£G¡æâ}–n8>uÏø÷Ô>øC©Øáá®ÈæŒcÓ†¾9ßþ£ŸÃ’T¹¦ÞË.z> 7¹ n=3zj†•ÝÇ~æ}–¦_ýg€4Ÿ›6 wÁòèg³$U«~'Ë^>Ÿ¦> sj&©b zix÷e©wé×§Íû,d䨴ƒÛVE?®%©Rõ¯80|6ü‡©ºW`e™†Ü”úWžº')µö{WÊmþç€,œcÓ†Þ¼µ&ú.IÕ©,½ô¨–E[¦á7GOÇÆT>ú“4¸ñÄé#_ûðO¤béKãÿ ªÈ±é)»¾.úy.I•jpãwÃg3ÀºÚ‡þ^ôx¬eÞg €|86=…ö‘ŸŠ~ÆKR¥jð¾ðÙ °>ƒ›NŠ‘ãݰŸ†÷]—úW–º§|9µö~gÊ·Ý<üW²±åØôz«E?ö%©2M½Ùkô\x*­ÝÞ˜R¿=*ǦòÑ{9Üi_Kíýß“òÅÏÿ߀¬V›žÂà†¢ÿ I•©óÍ? ŸËÒ;{ûèQYÉÊöÚ4¸åŒÿzŸ¥ý€lÞ96=…ríêè¿HR%*¹ËË)€ê[¼Uãÿþ6ý>K·Ÿ“zçï2ýÅ.¿ÿ¿ ©‰›Ö£Øá…ÓŸº$IJ©·jqø\˜‰Î·?›õ>K?ùAê_¶oê÷ùÔÚóíþa€TŽMë1õÚuIÒÔ?“S±ëkÃç2ÀŒL.Hƒ;.Lµ~Ÿ¥©—Ãòáéßä ÿ~ÀÄú96­ï›r¢ÿ>!I•hpó)á3`6Zû½{ìC½l?¼Îû,½,üû ù,86­Gï¢=¢ÿŽ!I•¨}ä§Âg2Àl n8>MÝ< VŸŸz­Hc·I­•[Oÿ†Vô÷òMàØ´ƒ[ÏŒþk‡$…W>voÊ>3|&ÌVkÅ›SôRåÒð¾ëRÿªÃR÷”/O¿uC¾p‹ðïäs̱i=¦,Ijz½s–„Ïc€Õ»‹ïa• IDATdÏè1ê}–HM娴ŽbÉ‹¢ÿ^"Iñ•ejíöËá3`cK_:ýÞG#}Ÿ¥©—÷Ìû,ÐxǦŸÕ>à½#ûK‰$Uµ©7¦žÇ›ª{ú¿ÎÏì–.Ü-u¾õç©Xþ†ðÿVÈ+ıiÝoÈ ;?)‘¤1ªóÿ>6Ù¢g¥òá;6ý}–î½&õ¯8pú½Þ‘òmŸÿßÕ娴ŽÞy;Íͦ&IãZ¿“Š^>æBç˜Ïmüû,M½n‡†ÿ7@>f›ÖÑ¿þ;ó´½IÒx4¸þ¸ðY 0g&¤áÝ—¯wÞ•G9ÜE+RçèϤbÙËã¿^˜ŽMë˜ú5iIjrS Wô,˜KíߟҠ—†÷\ñøaéØmRkåÖÓ‡¨è¯ òrlz²É)uóè=O’âêµR¾Ýsâç1À\ó>KFűéIŠ^½æIRhƒ¿>‹€l¬96=IûÀ߉Þó$)´Îñ>‹€l¬96=ù›qÜç£÷‡€lì96=IÿÚoEïz’V÷ÌÉð9 dcϱéI†÷\½ëIRX­ýÞ>‡€lì96=IÙ~8zד¤ÊöÚ”o»yø²±çØô„bÇ_ˆÞõ$)¬þudžÏa «Ǧ'´ö{wô®'IaM= ¢ç0Õ‚cÓ|#ŽÝ&zד¤°Z{¼-|Y-86=¡·jQô®'I!•­‡R>¹Yø²ZplzBÿªÃ¢÷=I ipÓIá3ÈjÃ±é ƒ[ÏŠÞ÷$)¤îi_ ŸÁ@VŽMOÞCô¾'I!µx_ø ²ÚplzBÙy4zß“¤Ñ7¤|ñVá3Èjñi"KÅöÏ‹^÷$)¤áO¯ ŸÁ@V+ŽMYjíñÖè}O’BêÿàÐð dµâØ4‘¥öÁŒÞ÷$)¤î)_ŸÁ@V+ŽMSß„c·‰Þ÷$)¤öþï ŸÁ@V+ŽMÙôÇ~KRã*Ëé÷¬‹žÁ@V+ŽMYê]¼2z哤‘W>|Gøü²ÚqlšÈRÿúïDï|’4ò?:5|þYí86MdixçÅÑ;Ÿ$¼Þ…»…Ï_ «Ǧ‰,•ß½óIÒÈëœð·áóÈjDZir³”½èO’F^û€÷ÆÏ` ÕMãMŲ—Gï{’ÒÔü‹žÁ@V;?6µöþõè}O’F_7Oùä‚ð ÔOãMíÃ>½òIÒÈÞw]øü²Zjü±©sì6Ñ;Ÿ$¼ÁM'…Ï_ «¥Æ›º§|%z瓤‘×»dÏðù dµÔøcSoÕ¢èO’F^÷Ô¯†Ï_ «%Ǧ‹WFï|’4ò:G&|þY-5þØÔ¿æÈèO’F^{ÿ÷„Ï_ «¥Æ›?:5z瓤‘×ÚíáóÈj©ñǦá]—Fï|’4òòíž>€¬–›úqôÎ'I#­ì<>{€¬¶l*[Eï}’4Ò†Ü>{€¬¶š}lšÜ,¥á z‘6X}^üüR]5úØT,yqôÎ'I#opýqáóÈj«ÑǦÖîoŠÞù$iäõ¯<8|þYm5ûØ´ïÞù$iäõ.X>€¬¶}ljö±èO’F^÷̉ðù dµÕècS瘿ˆÞù$iäuOúbøü²Újô±©{â?Dï|’4ò¦íÑóÈj«ÙǦïÿsôÎ'I#¯}ø„Ï_ «­f›ÎZ½óIÒÈkøþðù dµÕècSï¼eÑ;Ÿ$¼Ö¾¿>€¬¶š}lºxeôÎ'I#¯µçÛÃç/ÕV£Mý+ˆÞù$iäËß>€¬¶š}lºæÈèO’F^±Ó+Ãç/ÕV£MƒŽÞù$iä;¼ |þYm5ûØôãÓ¢w>IyùÂ-Âç/ÕV³M«Ï‹Þù$i´•eøì²Zkô±ixÏ•ÑkŸ$¶á |öY­5ûØtÿ ÑkŸ$¶~'|öY­5úØT®]½öIÒhëá³Èj­ÙǦüþèµO’FZÙy4|öY­5úØ”ºyôÞ'I#­l¯ Ÿ½@VkÍ=6M.H©Fï}’4ÒÊâÁøù ¤:kî±iÑ–Ñ;Ÿ$¼2¿/~þ©Îš{lÚî9Ñ;Ÿ$¼©÷ª Ÿ¿@ª³Æ›ŠíŸ½óIÒÈ+[…Ï_ «µæ›vxAôÎ'I#¯l?>€¬Öš{lZò¢èO’F^Ù},|þY­5÷Ø´ô¥Ñ;Ÿ$¾~;|þY­5÷Ø´ãË¢W>I}ƒ^øü²Zkî±iÙ+¢W>I}å0|þY­5÷Ø´ó«£W>I )Ÿ\>ƒ€¬¶|lúÅè}O’BÊn>ƒ€¬¶š{lÚõµÑûž$…Tlÿüð dµÕÜcÓò×Gï{’ÒÔ$DÏ` «­Æ›Z»ýrô¾'I!Mýfgô ²Újî±iÅ›£÷=I ©µâ-á3Èj«¹Ç¦=Þ½ïIRH­¯ÿ?á3Èj«¹Ç¦•[Gï{’Rk¿w…Ï` «­æ›ö|{ô¾'I!µú@ø ²Újî±Éo6IjhíÃ>>ƒ€¬¶š{lÚýMÑûž$…Ôù柆Ï` «­Æ›Š]_½ïIRHãþ*|Ym5÷Ø´ó«£÷=I ©{ÊWÂg0ÕVsM;¾,zß“¤ºgN†Ï` «­æ›–¼(zß“¤zçï>ƒ€¬¶š{lÚî¹Ñûž$…Ô¿lßð dµÕØcS¾hËè}O’Bê_sTü R]5÷Ø4¹Yô¾'I! n:9~©®š{lšÈR*‡Ñ;Ÿ$¼ÁêóÂç/ÕV³MýNôÎ'I#oxïÕáóÈj«ÙǦn½óIÒÈ+¾3|þYm5úØT¶×Fï|’4úºyøü²Újö±)¿?z哤òEÏ ŸÁ@VKÍ>6=zOô¾'I!;½*|Y-5ûØ´vuô¾'I!µöüoá3Èj©ÑǦá7Eï{’RûÀ÷‡Ï` «¥f›î¹2zß“¤:G}:|Y-5úØ4X}^ô¾'I!uŽÿ›ð dµÔìcÓNÞ÷$)¤îi_ ŸÁ@VK>6õ¯;&zß“¤zçí>ƒ€¬–š}lúÁ¡Ñûž$…ÔÿÁ!á3Èj©ÑǦޥ_Þ÷$)¤ÁÍß ŸÁ@VKÍ>6¿sô¾'I!M}gô ²Zjô±©{ÖÂè}O’B*¹;|Y-5ûØtêW£÷=IŠiÐKùä‚ð9 dµÓècÓüÇKR+–¾$|Yí4ûØtì6Ñ»ž$…ÕZ¹uø²Úiô±©}ÔGïz’Vû „Ïa «f›ýhô®'Iau¾õçásÈj§ÙǦýß½ëIRXÝS¾>‡€¬v}ljíõŽè]O’Âê»4|Yí4ûØ´Û£w=I «ÕaásÈj§ÑǦbÉ‹£w=I kpËásÈj§ÑǦ|ÛÍS*‡Ñûž$…4¼ÿ†ø9 ¤ºiö±i"Ke{mô¾'I!•GÂg0ÕŽcÓš[£÷=I «ØþyásÈj¥ñǦá=WDïz’VkÅ[Âç0ÕJãMƒ[NÞõ$)¬öÁ ŸÃ@V+?6õ¯ýVô®'IauŽÝ&|Y­86]¶Oô®'IauOÿ×ð9 dµÒøcSïܥѻž$…Õ»xeø²Ziü±©ûýÿ½ëIRXýë¿>‡€¬Vlêÿ×Ñ»ž$…5¼ëÒð9 dµÒøcSû¨?ŽÞõ$)¬ò±Ÿ†Ïa «Ǧƒ~7zד¤¸Ê2募>‹€¬6ljíõ«Ñ«ž$…ÖÚýMá³Èj£ñǦb—×Dïy’Zû‡Ïb «Æ›òíž½çIRhS”>‹€TŽMYJ½Vô®'IaõV-ŸÃ@VŽMY*×®ŽÞõ$)¬þ ŸÃ@VŽMYÞuiô®'Ia n[>‡€¬6›&²4¸ñÄè]O’Â*×Ü>‡€¬6›&²Ô¿â€è]O’âtS>¹Yø,²ZplšÈRW=I ­ØéUá³ÈjÁ±i"KÝ“¿½çIRhíýß>‹€¬›¦¾ G&zÏ“¤Ð:Ç|.|Y-86Md©}àïDïy’Z÷¬mÃg1Õ‚cÓD–Z+Þ½çIRhý>‹€¬›&²TìðÂè=O’BÜ~nø,²ZplzBê·£w=I «|ä®ð9 dµàØô„òá;£w=IŠ«,S¾èYá³ÈÆžcÓ†w_½êIRh­=Þ>‹€lì96=apÓIÑ{ž$…ÖþÆÇÃg1=Ǧ'ô¯80zÏ“¤Ðº'ý¯ðY dcÏ±é ½s–Dïy’ZïÂÝÂg1=Ǧ'tOü‡è=O’BÜp|ø,²±çØô„ö½çIRhÃ{¯ ŸÅ@6ö›žÐÚû×£÷3|ÙXrlZG׀lì86­G÷ÌÉèO’Âëžò•ðy dcDZi}ß”c>½ãIRxýËö ŸÇ@6v›Ö£}À{£w€ll86m@ûðODïx’ß —ò…[„Ïd  ŽMÐZñ–èO’*Qk·…Ïd  ŽM²p‹”†ýèO’Âëõéø™ ¤qàØô4Ê5·Fïx’^÷Œÿ>€l,86=ÁNÞñ$)¼þ5G†Ïc  ŽMO£wÉžÑ;ž$…7üéÃç1Ǧ§Ñ=åËÑ;ž$Åç选™qlzíÃ>½âIR%jíõ«á3È*ϱéi´v{cô~'I•¨sÌçÂg2UžcÓÓÙö)õ;Ñ;ž$…×;o§ø™ ¤ªslšá}×Eïx’Þàæï…Ïc «<Ǧè_wLôŽ'Iá•Ü>€¬ò›f wövÑ;ž$U¢béKÃg2UšcÓL¾Ißþlô~'I•¨}Ðï†Ïd «4Ǧh}ý×¢÷;IªDÝS¾>“€¬Ò›fbñV)•ÃèO’Âë_q@üLR•96ÍP¹ööèO’ÂÞuiø<²Jslš¡©ü–¤Æ×+R>¹YøL²Êrlš¡ÞË£W“€¬²›fú:þo¢÷;IªDoþIøL²Êrlš¡öïÞï$©õV- ŸÉ@VYŽM3T,}Iô~'I•hpýqá3È*˱iÊüþèO’Â>ôãðy d•åØ4 ƒÛÏÞñ$)¾r˜Šíž>“€¬’›f¡Ù¾Ñ+ž$U¢Ö~ï ŸÉ@VIŽM³Ð=å+Ñû$U¢Î >“€¬’›f¡}ÈG¢÷;IªD½‹W†Ïd «$ǦY(vzeô~'I•hpû9á3È*ɱi–ÊâèO’Â+[kÂç1U’cÓ,Mýk¾$)¥bç_ ŸÉ@V9ŽM³Ô»d¯èýN’*QûŸÉ@V9ŽM³Ô=ñï£÷;IªDÝÓÿ5|&Yå86ÍRû€÷Eïw’T‰ú×>“€¬r›f©Øá…Ñû$U¢áO¯ ŸÉ@V9ŽM¡|äîèO’âöS¾hËð™ d•âØ´?:5zÅ“¤JÔÚëá3È*űi#ôÎß%z¿“¤JÔ9v›ð™ d•âØ´1ß´ïüeô~'I•¨wþÎá3È*űi#´öùèýN’*Ñà–ÓÃg2UŠcÓÆXü씆ƒèO’Â+‹ãg2ªÄ±i# úqôŽ'I•¨Øå—Âg2U†cÓFÜp|ô~'I•¨}ä§Âg2U†cÓFê½}ô~'I•¨·jqøL²ÊplÚØoÜÑŸ‰Þï$© n:)|&Ye86m¤ÖŠ7Gïw’T‰ÊGîŸÉ@VŽMkr³Tv‹Þñ$©Ë^?—€TŽM›`x×%Ñû$U¢öa¿>“€¬›6Aÿòý£÷;IªDÝ3þ=|&Y%86m‚îI_ŒÞï$©õ¯;&|&Y%86m‚öïÞï$©•kn ŸÉ@V ŽM› Øþù)•eôŽ'Iñ•e*–¼(|.Y8ǦMT®¹-zÅ“¤JÔ>èá3ÈÂ96m¢Á ÇGïw’T‰º§þSøL²pŽM›¨·jQô~'I•¨õáá3ÈÂ96mê7ð¨OGïw’T‰†÷]>“€,œcÓ&jíöÆèýN’ªÑpòíž>—€,”cÓ¦š\ÊÎ#Ñ+ž$U¢Ö~Ë@ŠäØ4w\½ßIR%êžôÅð™ d¡›æ@ïÒ½£÷;IªDý+ ŸÉ@ʱiN¾‰½ßIR%ÞseøL²PŽMs µß»¢÷;IªFƒnÊn>—€,ŒcÓ\Xü씆ýèO’*Qëë¿?—€űiŽ ï»>z¿“¤JÔ9þ¯Ãg2…qlš#ý«ˆÞï$©õ.Ù+|&YǦ9Ò=õ«Ñû$U¢Á†Ïd ãØ4GÚ} z¿“¤jÔ+R¾íæásÈB86Í‘b‡¦T–Ñ+ž$U¢Öo ŸË@±i•kn‹Þï$©uŽù‹ð™ d!›æPÿúïDïw’T‰zì>“€,„cÓêž9½ßIR%ܶ*|&YǦ9Ô>ü¢÷;IªDe{mÊ'„Ïe 9Ǧ9TìôªèýN’*S±ü ásÈFαiŽ•Ý½ßIR%ê|óOÂg2œcÓüèÔèýN’*QïœÂg2œcÓë»4z¿“¤J4¸ù{á3ÈFαi®¿¡ßüÓèýN’*QY<>“€l䛿Xk·7Fïw’T™Š]_>—€l¤›æÚä‚T¶ŽÞï$©uŽþLü\Ò(96̓Á­gEïw’T‰zçï>“€l¤›æAï¼¢÷;IªDƒÛΟÉ@6RŽMóñM=úÏ¢÷;IªDeçÑ”On>—€ld›æA±ü Ñû$U¦Öo ŸË@62ŽMóõ&áŃÑû$U¢Î±ÿ#~.iT›æÉàǧEïw’T‰z—ì>“€ld›æIïœ%Ñû$U¢á]—„Ïd ǦùúÆõéèýN’ªQ¿ò…[„Ïe  ǦyRìòKÑë$U¦ÖÞ¿>—€l$›æQùؽÑû$U¢Îwÿ.|&ÙH86Í£ÁͧDïw’T‰úW>“€l$›æQoÕâèýN’*ÑðÞkÂg2„cÓþáÒµnUýîû}ï=û¤¹Î²iŽ+žy0ú|P Ý3þ1|&K’$IjÌy–MsÜà¶S¢Ïw¥Ð¿áÈð™,I’$©1çY6ÍqÝsçGŸïJ!üÎð™,I’$©1çY6Íqío~<ú|PE‘šÛ¿&|.K’$IjÌi–Ms\sñë£w¥Ñ>ä£ásY’$IRcN³lCÅS÷FŸïJ¡{ö¿…ÏdI’$I9Ͳi õo9!ú|P ƒ[N ŸÉ’$I’sšeÓêžóïÑç;€R(ž¾?|&K’$IjÌi–Mc¨}èÇ¢Ïw¥Ñ\òÆð¹,I’$iî²lCÍí_;ú&RjñÉð¹,I’$©1gY6©âÉïGŸïJ¡wþ¶á3Y’$IRcβlSý›Ž‰>ß”ÂàÎ3Ãg²$I’¤ÆœeÙ4¦ºg}=ú|P E뉔MÏ ŸË’$I’s’eÓ˜jü»Ñç;€Òh.}kø\–$I’Ô˜“,›ÆTs»W¥TäÑç;€RèýgásY’$IRcN²lcùcwDŸïJ¡wñÎá3Y’$IRcN²lcýŽŒ>ß”Âàž Âg²$I’¤ÆœdÙ4ƺg~-ú|P EwuÊæo>—%I’$5f=˦1Ö>èÃÑç;€ÒhíñÞð¹,I’$©1ëY6±æ¶/O)DŸïJ¡sÂÖásY’$IRcÖ³lsùÊ›£Ïw¥Ð»b¯ð™,I’$©1ëY6¹þµßˆ>ß”B~ÿ•á3Y’$IRcÖ³l ú ˜xýNʾ4|.K’$IjÌj–Mc®µ÷û£w¥ÑÚ÷WÃç²$I’¤Æ¬fÙ4îæo–R7‹>ß”B÷´/ÅÏeI’$Ii6³l hpï%Ñç;€Rè_÷Íð™,I’$©1«Y6Ô»diôù òÇï ŸÉ’$I’³šeSÄ_ú1}¾(‡¢HÍ^>—%I’$5f-˦€šKß}¼(ö7?>—%I’$5f-˦ Šleôù zçm>“%I’$5f-˦ ·;ú|P ƒ»Î ŸÉ’$I’³–eSPÝsçGŸïJ¡h?•²éMÂç²$I’¤Æ¬dÙTûÐß>ß”Fk÷†ÏeI’$IYɲ)¨æö¯} )uNü›ð¹,I’$©1+Y6–?~gôù úWï>“%I’$5f%˦Àú×}¾(…üáÂg²$I’¤Æ¬dÙX÷ô¯DŸïÊ¡ÈSsÑ+Ãç²$I’¤ÆFgÙXk¿ßˆ>Þ”Fûÿ-|.K’$Ijlt–M‘-|iJýNôù ºgÿ[ü\–$I’”66˦àò®Š>ß”ÂàÖ“Ãg²$I’¤ÆFgÙ\ïŠ=£Ïw¥Pd+Ãg²$I’¤ÆFgÙýpüVÑç;€Òh.}kø\–$I’ÔØ¨,›‚k-{WôÙ 4:Ç~6|.K’$IjlT–MÑMÏKEëÉèó@)ô.[?—%I’$¥É²© î:+ú|P ùýW„ÏdI’$Iʲ©õÎ_}¾(‡A7e ·ŸË’$I’œeS jñÉèã@i´öÿÍð¹,I’$©±ÁY6• æâ7DŸíJ£{Æ?†ÏeI’$I6¨¸_ IDAT β©$«VDŸïJ¡ãQá3Y’$IRcƒ³l*Iý›Ž‰>ß”B±êžð™,I’$©±ÁY6•¤î™ÿ}¾(æ’7…ÏeI’$I ʲ©$µüPôÙ 4ÚGþQø\–$I’ÔØ ,›ÊÒ6[¦”÷£Ïw¥Ð»pqü\–$I’”6$˦•?|}ôù wŸ>“%I’$56(˦Õ¿zÿèó@9t³”Íß,|.K’$IjÌ8˦Õ9ésÑÇ;€ÒhíýKásY’$IRcÆY6•¨Öžï‹>Û”F甿 ŸË’$I’3β©LMo’ŠÎÓÑç;€Rè_{pü\–$I’”fšeSÉ>€”òGo ŸÉ’$I’3β©dõ.Z}¾(‡¢HÍí_>—%I’$5f”eSÉêõéèã@i´ýýð¹,I’$©1£,›JVsç·DŸíJ£{î‚ð¹,I’$©1£,›JXñ̃Ñç;€RÜqFøL–$I’Ô˜Q–M%lpëIÑç;€R(Ú«R6=/|.K’$Ij¬w–M%¬{ö¿EŸïJ£µì]ásY’$IRc½³l*aíƒ?}¶(Ήÿ;|.K’$Ij¬w–M%¬¹è)yôù ú×>—%I’$5Ö;˦’–¯¼%ú|P ùc·‡ÏdI’$Iõ⩤õ¿wHôù Š"5»GI’$IYE²l*iÝSÿ>úxPí#?>—%I’$5Ö+˦’ÖÚçW¢Ïv¥Ñ»x§ð¹,I’$©±^Y6•µ›§ÔkEŸïJapï¥ñsY’$IRZŸ,›JÜðpÀð#é:)[¸Eø\–$I’ÔXg–M%®wénÑÇ;€ÒhøÛásY’$IRcY6•¸Î±Ÿ>Û”F÷ì ŸË’$I’ë̲©Äµv}{ôÙ 4·Ÿ>—%I’$5Ö™eSÉ+²•Ñç;€R(ZO¦lz“ð¹,I’$©±Ö,›JÞàŽÓ£Ïw¥ÑÚã½ásY’$IRc­Y6•¼î¹ ¢Ïv¥Ñ9ù ásY’$IRc­Y6•¼öaÿ=úlPýï>—%I’$5ÖšeSÉknÿÚ”Š"ú|P ùËÃç²$I’¤ÆZ³lª@ùwEŸïJ£¹äásY’$IRcY6U þ GFŸíJ£sÔ§Ãç²$I’¤Æ³lª@ÝÓÿ!úlP½Kw ŸË’$I’k̲©µöÿ­è³@iä÷_>—%I’$5Ö˜eSZ¸EJƒnôù ½”m³eül–$I’”^,Ë¦Š”?puôñ 4Úßø¯ásY’$IRãE³lªH½+÷Ž>Û”F÷»SásY’$IRãE³lªH¶Ž>Û”ÆàÎ3Ãç²$I’¤Æ‹fÙT‘Z»¿;úlPEçé”Íß4|6K’$Ij¼ ˦ª4½I*ÚOEŸïJ£µ×/ÄÏfI’$IédzlªPƒåçDŸíJ£{ê߇ÏeI’$IdÙT¡zl}¶(þõG„ÏeI’$IdÙT¡ÚG|2úlPŪásY’$IRãY6U¨æâ7DŸíJ¥¹Ó›Ãg³$I’¤Æó²lªXŪ{¢Ïv¥Ñ9æÏÃç²$I’¤Æó²lªXýŽ>Û”Fïò=Âç²$I’¤Æó²lªXÝ3¿}¶(üÁkÃç²$I’¤Æó²lªXí>}¶(|š‹^>›%I’$5žË²©j-Ü"¥A/úxPíC>?›%I’$¥ÿ—eS¾m€guÏ]>—%I’$5žË²©‚õ®Ü'úlPƒï7|.K’$Ij<—eS뜰uôÙ >›%I’$5FY6U±éy©h¯Š>Û”F÷œŸÍ’$I’Ò0˦Š6X~NôÙ 4w>—%I’$5FY6U´ÞÛEŸíJ£è®NÙ‚ÍÃg³$I’¤†eSUkñÉè³@©´öÿÍðÙ,I’$©aÙTÕš‹ß}®(•îÙÿ>›%I’$5,›ª\±êžè³@i î<3|.K’$IjX6U¹þGGŸíÊõܦù›…ÏfI’$iÒëX6U·î™_‹>Û”Jk¿_ŸÍ’$IҤױlªní>}®(•îwþ9|6K’$I“^Dz©Â-Ü"¥A/úlPƒÛ¿?›%I’¤ ¯cÙTíò¯>Û”FÑy:eó7 ŸÍ’$IR6ÁY6U¼Þ•ûDŸíJ¥µï¯†ÏfI’$)›à,›*^ç„­£Ïu¥Ò=óŸÂg³$I’&§æ?™Ú‡ý÷Ô=wþè±­ý+ükÊ‚³lªx­Ýß}®(•Ám§†ÏfI’$Õ´›§Ö>¿’º§%õ¯;,å+oN©(ž÷ýhûðÿÿuNÅfÙTõ¦ç¥¢½*èHP>Eû)Ïm’$IÒÆ7ÓÔÚ㽩süV©wÙ²4XqqJýÎ:¿íõéø¯}*6˦4X~ÎŽoÕÑÚûýá³Y’$IÕª¹ä©}ø'R÷ܣߖ/ZOnÐ÷¢ãþ2üÏ’gÙTƒzl7ËÇ4€jëžñÕðÙ,I’¤òÖ\ôÊÔ>àƒÏ¾î¦cS±úáYû^´sÒçÃÿ|Yp–M5¨}Ä'gí¢¨ƒÁ­'‡ÏfI’$•è9K÷Ãü·?òœ¥|ξí~ûÿÄÿ™§b³lªAÍÅo˜³‹ ŠŠÖ)›Þ$|>K’$iü5—¾íÇž³Ôë÷¢Ý³¾þwgÙT“ŠU÷Œõâ(»Ö^¿>›%I’4îç,=ýmhêž;?üï% β©&õo<:úz(•îéÿ>›%I’4{5½â‡ÏYºî°TK’$Õõíp£?óÃç,õZÑßþ•ÂளÂÿm²à,›jTk÷÷D_S¥ÓÚãçÂç³$IRÕk.ySjù©Ô»`û4X~N*ÚOE›WZƒ{. ÿ÷Ê‚³lªSÓóRÑz2úº(•î©_ŒŸÏ’$Iª¹íËŸ÷œ¥ÑÛáXoƒ{/ ÿ7Ì‚³lªYƒågG_W¥Ò¿é˜ðÙ,I’T…ç, ß—?xÍD>gi6å÷]ÿï:›eSÍê]°]ôuP*E¶Òs›$I’†MÏK­eïLãþ2õ.ßc´IýNô·kµ“?puü¿õTl–M5«}Ä'£¯+€Òiíõ áóY’$iÜ5wüéÔ>ü©{î‚4¸íÔT4‹þ¶l"ä}/üß> β©f5¿!úº(î_ ŸÏ’$Is™ç,•Gþð ᯇ,8˦V¬º'úÚ(•Áíߟ͒$Isúœ¥|ý-?0\ô…¿F¦b³lªaý޾¶J¥è<“²›‡ÏgI’¤ ©¹ä£·Ãõ.Ú1 V\œR¯ýík‘?z[øk& ⩆ ß.Àóµø@ø|–$IZWÍí^Ú‡|ô‡ÏYÊþ6ŠÊ¿3üu”gÙTÆ*ž¯ûÝéðù,I’ô¼¶}Ù Ÿ³TÑß6±‘Š'¿ÿÚšŠÍ²©Ž-Ü"¥A/úú(•Á=ÄÏgI’4¹ÍßôyÏY½nÐþ‰9P¬Zÿz›ŠÍ²©¦å^}}”Ë ;úéaô|–$I“õœ¥ÑÛá–Ÿã9K¤xúþð×_œeSMë]¹OôõP:íC?>Ÿ%IRýjn÷ªgßwÖ¿üà9K+£¿í!PñÌCá¯É,8˦šÖ9aëèë  tz- ŸÏ’$©âyÎë0\6†¿N§b³lªi­Ýß}}”Nþà5áóY’$U(ÏYbÍÇã_»S±Y6ÕµéMRÑ^}”K‘§æ??£%IR)k.}kêóç©wÉÒgKž³Ä(ZO†¿–³à,›jÜ`ùÙÑ×@étŽútø|–$Iñ5wx]jóãÏ>ÀûŽÓS‘=ým 5á7›–Mu®wþ¶Ñ×@é ?@!z>K’¤1·`óÔÚçWŸ%IÒzK’4ÏYÊ£oû0VÃ×}øµ8›eÓÔ»p‡èk  |ò~jn÷ªð-IR•k.}Û=g©}‡‡pù#7†_›Yp–MPûˆ?Œ¾ÖJ©}ä§Âg´$IÕ}ÎÒÑ·r(¥ü¡ë¯×,8˦ ¨¹ø Ñ×@)õ®Ø+|FK’TÆš‹^ñÃç,]wX*ž¼;ú¶ •‘?xMø5œgÙ4!O~?úz(üñ;Ãç³$IáÍßìÙç,¿Uê_½¿ç,ÁFʸ*þºžŠÍ²iBêßpdôõPJÍ¥o ŸÑ’$­éMRk÷÷¤Îñ5ú ßá¡8 ºÑ·c¨•ü¾Ëâ¯õ©Ø,›&¤î·ÿOôõPJÃOˉžÑ’$í9KÍÇ£o½P{ƒïŸ~ígÁY6MH­}5úz(¥þ-'„ÏhI’f£á§¬¶þHêžýoipëI©xúèÛ,L¤Á§‡Ïƒ,8˦IiÁæ)õšÑ×@é§G32|NK’4“£%I“YsÛ—§öLÝÓ¿’ú×öìÛá€Jë]±gølÉ‚³lš šKÞ}Í”SQŒfdôœ–$Õ¼yÎÒðípùƒ×xÎÔPïâãçÍTl–MVñÔ½Ñ×@)uNüßá3Z’TÏ·Ãõ.ÚÑs–`‚ôÎ_>²à,›&¬þMÇD_w¥4œÑ3Z’TÝšÛ½:µù¨ç,©{΄Ϥ,8˦ «{ÆW£¯;€R*ZOŽÞÞ=§%IåÏs–€µéžùOás* βiÂjíÿ[Ñ×@i ÑsZ’Tîç,Þ7èEß²€ëžö¥øÙ5›eÓ¤µð¥)õ;Ñ×@)y½$é…ÏYjFßž€Šéœø7á³, βiËï»<úÚ(¥á§EÏhIRàs–²G£oE@ tŽý‹ðù–gÙ4õ.Ý-úÚ(§"OÍ*|NK’æ m_–Ú}xô,•á‡B«VDßu€šê|ëOâgÞTl–MXçèÏD_{¥Õ9þ¯Âç´$iž³´÷/¥ÎÉ›ú×”òGnL)Dßb€ Ñ>ôcñsp*6˦ ¬¹äMÑ×@i Ú=§%Iöœ¥ÑÛá–Ÿã9K@¨Ö~¿>³à,›&´bÕ=Ñ×@)§S¶à%ásZ’ôâ5·{ÕèÓC»gýËž³´2úÖð<­Ýß>+³à,›&´þõGD_¥Õ>ø#ásZ’ÔHÙ‚ÍSkŸ_IÝÓ¿’ú×–ò•7§TÑ· €µ¾›(|~NÅfÙ4¡uOýbôõPZ½Kw ŸÓ’4qÍß4µöxoê¿Uê]¶, V\œÒ }K˜±æ¶/Ÿ©S±Y6Mh­½~1úú(­ü‰åásZ’&ê9K÷õWE€—R6=/|ÆfÁY6Mjó7=—€×Zö®øY-I5ª}Èï=»XºýÛ©Èósb¸8ž·Y ²lšàw}”V÷Ì ŸÓ’T§|B0 ŠU+ÂçmV‚,›&¸î¹ó£¯C€ÒÜ}^øœ–¤Ú´p‹è±0ù#7ÆÏÜ©ø,›&¸á§-°y?5·{uø¬–¤:ÔÜé?EOu€±~¸AôÌÍJeÓ$·íËF‡)^\ç˜?ŸÕ’TƒZ{ýBôH‹Á§‡ÏܬY6Mxùƒ×F_‹¥Õ¿þðð9-Iu¨ýÿ=ÒÆ¢ãQá37+A–M^ïò=¢¯E€Ò*š>½3zVKRÕë|ëO¢G:ÀXô¯Þ?|æf%Ȳi¾E€5kôáðY-IU¯sòßFs€±è]¼SøÌÍJeÓ„×Üù-Ñ×"@©õ.Y>«%©êuÏú—èq0Ýsþ=|æf%ȲI©xê¾èë ´ŠU÷„ÏiIªz½‹wŽçcÑ9ù á37+A–M=À €5kíù¾ðY-IU®í7¢G9ÀX´¿õÇá37+A–MJÝÓ¾}=”Z÷»Óá³Z’ªÜàÖ“£G9ÀX´üPøÌÍJe“Rkï÷G_¥–?xMø¬–¤*7Xqqô(‹ÖîY ²lÒèc½‹ÎÓÑ×$@yÅèÂçµ$U´|å-Ñ“`,š;¼.|æf%ȲI£Ëω¾&J­{Ú—Âgµ$UµbõÃÑc`îùè—9¢gnV‚,›4ªwÞÂèË Ô†KùèY-I•lþ¦)åƒè10çŠæcñ3wªY6iTûß‹¾.ÊmÐKÍí_>¯%©j5wzsô‹üÑÛÂgnV’,›4ª¹è~â°ãþWø¼–¤ªÕÚï×£Ç7ÀX V\>s³’dÙ¤çʺ.úÚ(µþMdžÏjIªZí#ÿ(z|ŒÅàÖ“ÂgnV’,›ô\½+÷޾6Ê­×LÙ¶/ Ÿ×’T¥º§}9zzŒEÿêÂgnV’,›ôÃñ}m”^û[>¯%©Jõ.Ü!ztŒEï‚íÃgnV’,›ô\Í]~&úÚ(½þ G†ÏkIªRýï=ºÆ¢{æ?…Ïܬ$Y6éyOÝ}}”ZÑy:e _>¯%©* î¹ ztŒEçø­ÂgnV’,›ô¼ú×}}”^ûˆO†ÏkIªJ~˜ LŠöÁ¿>s³’dÙ¤çÕ9ù Ñ×'@é ß=¯%©-Ø<¥|=¶Æ¢µì]ñswªY6éyµ–½3úú(½¢½*e ^>³%©ìµv}{ôÈ›æ¢W„Ïݬ$Y6éÏ<}”^û°?Ÿ×’TöÚ$z\ŒEÑ]>s³eÙ¤Ô¿é˜èë ôú×>¯%©ìuNú|ô¸‹ü±ÛÃgnV¢,›ô‚º§~1ú:(½¢ùXÊæo>³%©Ìõ.Ø>z\ŒÅàîóÂgnV¢,›ô‚Z{þ|ôu P íC>>³%©Ìõo>.zTŒEÿú#ÂgnV¢,›ô¦ç~bÀÚõ¯> ~fKR‰Ë¹)zTŒEï¢ÃgnV¢,›ô¢ n=)úZ(½¢õ¤O¥“¤55½IJývô¨‹îé_‰Ÿ»SåɲI/Z÷Œ¯F_«•Ð>üá3[’ÊXséÛ¢G4ÀØtŽúÓ𹛕(Ë&½h­}~9úZ¨„þõ‡‡ÏlI*cío~w³’eÙ¤µ6X~vôu P ÃçÜEÏlI*K£>=–ƦwÑŽás7+Y–MZkÝïNG_·Õ÷SsÇŸ ŸÛ’T†zçm=•ƦsÊß…ÏݬdY6i­µúpôu PÝoÿŸð¹-IehpëÉÑ#`lÚ‡~,|îf%˲Ikoá£ß°nùWÅÏmI*AŪÑ#`lZËÞ>w³’eÙ¤u6¸çÂèk 2Z»¿;|nKRdÍÅoˆÅãS£_Òˆž½YɲlÒ:ë¿môå P½ ¶ ŸÛ’Yûˆ?ŒÅcS<ý@øÜÍJ˜e“ÖYûF_¿•1|ëH6½Iøì–¤¨zç/ŠÅc3XqqøÜÍJ˜e“ÖÝ6[¦4èF_ÕÑ>èwâg·$5¸ë¬è1 06ý럻Y ³lÒz•ßwyô5 Pýk ŸÛ’Òô¼T4Ãc3|ìLøì*_–MZ¯zí} TFÑ~*eÛüDøì–¤q×ÚíÑ#`¬:'þMøìÍJ˜e“Ö«öa} TJç˜ÿ>»%iÜuNøëèñ 0Víƒ7|öf%̲Iëÿܦ~'ú:¨ŒÁò³ãg·$¹þµG_€±jîü–ðÙ›•0Ë&­wƒE_ÇÕQ䩹ËÏ„ÏnIgùË£§/Àøt³Ñ³ê¢goVÂ,›´ÞuÏ]})TÊpnFÏnIWÍ%oŒ»c•?ô½ðÙ›•4Ë&­wí>}-TJñÔ})›¿iøü–¤qÔ9ö³Ñc`¬ú7>{³’fÙ¤õoþf©è<}=TJûÆÏoIC½+÷‰¹cÕ;oaøìÍJše“fÔàöoG_Ï•â'^’&¥|å-Ñ#`¬:ÇþEøìÍJše“fT÷Œ¯F_ÏÕÒï¤æ¯ Ÿß’4—5wzsô´»Ö>¿>³’fÙ¤ÕÚó}Ñ×3@åtOûrøü–¤¹¬sÒç£G-ÀxEjnûòðù›•4Ë&ͬéy©XýHôe P)ùÃ7ÄÏoIšÃú7=jƪxúþðÙ›•8Ë&͸þ ߊ¾®*§µÿo…ÏoIš“æošŠÖÑc`¬ßÿnüü*o–Mšq“>}]TNÿºo†ÏoIš‹Ú|0zÄŒ]ïʽÃçoVâ,›4ãš»üLôu PÍ…/v¯•T¿zço=aÆ®{úWÂçoVâ,›´AåOÜ}mTN÷;ÿ7|~KÒl—?ô½èñ 0víC?|þf%βITÿªý¢¯m€Ê.ꇴ=Ã%i¶jîò³£Od˜4ÃwüDÏà¬ÄY6iƒêýgÑ×6@%µùhø —¤Ùª{ÆW£Ç*ÀØí§üqjíY6iƒjîð“)yô5P9ý[NŸá’4[ î¹0z¬ŒÝ`ÅEáó7+y–MÚà¼?`äýÔÜéÍá3\’6¶á‡¤|=UÆ®wå>á38+y–MÚàzï}TRïÂÂg¸$ml“>=NB )Ñ38+y–MÚà†Oß`æŠæã)Ûæ'Âç¸$mLƒÛ¿=NB´ø`ø ÎJže“6¼m¶L©ß‰¾Î*©sòâç¸$mÌ[è½èQ 0~E‘š‹^>‡³’gÙ¤ÊC!6L¾òfŸb"©²uOûRôQµüPôÔˆÓoÞÝ=‹³ dÙ¤®µÇÏE_ò•Ö;o›ðY.IëSÿúãG&@˜üÁkÃçpV‘,›4+OÝ}ÝTVÑz"5·}yø,—¤µÕÜá'G?Õ˜Tý«÷ŸÅYE²lÒ¬Ô¿æ èë Òº§ÿCø,—¤µÕ=ã«Ñ£ Tçä/„Ïâ¬"Y6iVêý™èë ÒЧïOÙ‚—„ÏsIZSùÊ[¢G%@¨ÖÞïŸÅYE²lÒ¬ÔÜîÕ)åýèk Ò:Ço>Ï%éÅjô;Ñ# þáà 6ŸÇYE²lÒ¬5¸÷’èË Òò•7§lz“ðy.I?^ÿ¦c£G$@¨üþ+ÂgqV¡,›4ku¿;}ýT^ç¨? Ÿç’ô£5—¾5¥|=Bõ®Ø3|gʲI³Vkß_‹¾þ*Ïo7I*[ÃÀ¤ëœ°uø<Î*”e“f¯éMR‘­Œž•×ùÖŸÄÏtIþVÓö¯IEwuôX×ÚãçÂgrV¡,›4«õo82zT^þÐu)›ž>Ó%©{ÎDD€pÃ¥{6Ó?ej IDATð™œU(Ë&Íjãÿ*zÔBûÈO…ÏtIÞ—¦â™‡¢Ç!@¸ÁŠ‹âgòTµ²lÒ¬ÖÜñ§R*ŠèYPyùƒ×úí&I¡uNþBô((…Þ¥»†Ïä¬bY6iÖËú^ô,¨ŸL')¬›§âÉ»£Ç @)tŽýlü\žªV–Mšõzî= j!ìö”Íß,|®Kš¼:§ü]ô(Ö²w†Ïå¬bY6iÖkðÁèYP“>>×%Mào5­º'zü”BÑ|Ì£ ¦fže“f¿ù›¦¢ùxôL¨…â™S¶Í–ñ³]ÒÄÔ=õï£G@i n=9|.g̲IsRÿú#¢g@mt¿óÃ纤 iÁKR±jEôØ(îwþ9~6OU/Ë&ÍIè0;†¿-ÚÜîUá³]RýëžþÑ# T†‰‰žÍY³lÒœÔÜþ5)åýè¹P½‹–„ÏvIõÿþÍ£~D¿“²…/ ŸÏY³lÒœ5XqQôh¨A7µv{Gøl—Tßz—î=éJex¦žÍYE³lÒœÕ=ë_¢g@­ôo9!|¶Kªg­]ß>ú >?Ô»pqø|Î*še“æ¬Öž?=j§}ÈGÃ绤ú5¸õ¤èñP:íÃ?>Ÿ³ŠfÙ¤9­XuOô|¨•ü¡ëR6Óðù.©>µúèÑP>E‘š;üdøŒÎ*še“æ´Þ{E€Úéœô¹ðù.©&-Ø<åß=ÖJ'ôÖø=UÝ,›4§µ¿ùñèP;ÃO‹jîðºð/©úuÏúzôH(¥þÕ„Ïè¬ÂY6in[¸EJ½fôœ¨ßIÚØš;ÿçTtWG3€RꜰuøœÎ*œe“æ¼Ám§FÏ €ú)òÔ:àá3^RuÜqzô$(­Ö®ÿ%|NgβIs^çä/DÏ €Zʹqô¼•è9/©zuŽþLô(­âéÂçtVñ,›4ç5—¼qôxf_÷̯…ÏyIÕª¹Ý«Rñ̃Ñã  ´úß;4|VgϲIc)¿ïòèyPO½¦_ó–4£ú×=¹J­sü_…Ïê¬âY6i,uÏþ×èyP[ƒ»ÏOÙô¼ðY/©üµ¿õÇÑ#  ôš;½9|^gϲIc©µû{¢ç@­uNù»ðY/©Ü5—¼)ÍÇ£Ç@©åÝ>¯³dÙ¤±•?vGôܨ¯n–šKß>ë%•´éyipÇÑ“  ôzWî?³§ªŸe“ÆVïâ£ç@­ îúŽ·ÓIzѺ§}9zDTBç¨? ŸÙY ²lÒØjøÛÑs öº§})|ÞK*W­=ß7ú0Ö¡ÈSs‡×…Ïí¬Y6i|Mo’ŠÕG€zë·GËð™/©5½"åÞ=™*!è{ás;«I–Mkýk¿=?j/䦔-Ü"|æK nz^êß|\ôH¨ŒÞ%»ÄÏî©zdÙ¤±Ö>â£çÀDðÍ’¤îwþoô(¨”ö7?>»³šdÙ¤ñ¶Í–ž0EžÚ‡þ~üÜ—RûÀ¥”÷£'@u z£·GÏï¬&Y6iì n=9zŒL„¢ùXjîü–ð¹/i¼5—¼1Ï<=‚*e°â¢ðùÕ(Ë&½Î [GÏ€‰‘ßwYÊl>û%©m¶LùWG€Êéžýoñ3|ª>Y6iì5·{uJƒnô,˜½Kw Ÿý’ÆÐô&ipˉÑ# ’Z{ýbüŸªO–M ip×w¢g ÀDéýgá³_ÒÜÖ»diô¨¨¤â™GŸà=dzeÙ¤:'!zžL–^+µöýÕðù/inêœôùè)PYýk ŸãYͲlRHÍůO)DÏ€‰R¬Z‘š‹ß~4»µûŸ<°:G}:|–g5˲Ia î>/z¦LœÁ½—¦láKÃï’f§Öþ¿™ŠîêèÑP]ƒ^jn÷ªðyžÕ,Ë&…Õ=íKÑc`"ùUq©µö~*Ú«¢G @¥ î>?|žg5̲Ia5wü锊u.[=&ê¥×LÙ6[†Ïø¬¦Y6)¼æÒ·y+@ äOÜ•šKÞ~_ôÃZ| íUÑã v·œ>ã³gÙ¤Rä­t%Z8íü–ðû‚¤Fjò{)u³è±PKã· ŸóY³lR)êžùµèYÀ«V¤Ö®o¿7H“\çÄ¿}b$s`ÐKÍí_>ë³gÙ¤R4|ÛF*òè‘À|pk×ÿ~&®éy©{î‚èPkƒågÇÏû©zgÙ¤Ò4¸çÂè™À(V?œZ{ü\øýAš˜n‘ú7|+úÒ¨½î©?ó§êe“JS÷Ô/FÏ~Ìð°Z{¾/ü!Õ½æŽ?ò®Š¾äê¯(Rs§7‡Ïý¬æY6©45¿!¥¼=zø1Eöhjíõ‹á÷ ©®µöù•Tä£)ðÚè+ €õ1è¥æ?~ïÈ&0Ë&•¾Á=F(fÉàÎ3SsÉ›Âï-ÒLkíýþ4X~vô%À î8#üþ‘Mh–M*}“>=£˜EEû©Ô=ý+)›¿iø=FZWÍ]~6õ¯?|ô€Yª¥süVá÷‘lB³lRékn÷ªÑÛ/¨—üáëS뀄ßg¤«¹ô­©wÙ2ÿ¨¨¢»:5·}yøý$›Ð,›T‰ú7=«˜ E‘ú×–š‹ß~¯‘†µöüùÑkrøiŠTWÿÚo„ßS² βI•¨}ÄFÏ*æPÑzâÙO‹ñqÕÚ÷×ÒàÖ“}0 @M´üPø½%›à,›TlžŠÕGÏ+æX¾òæÔ>òR6=/þÞ£ú7½Ijöip×YÑ/}fQþø¾—˜ŠÍ²I•©wñNÑ3 €1Éï¿2µÿDø½Gõ¬¹è©sòߦ|å-Ñ/uæ@÷œ¿×LzË&U¥Ö²wùÕv€ 3¸÷’Ô>èÃá÷ Õ£ÖnïH½‹vLE{UôK€¹R䩹ó[Âï9“^DzIUjpï¥Ñ£ €Ãgé Ÿ©}R[°ùè­™ƒåçø¡À¾5:üÞ£dÙ¤JÕ9éóѳ €@ƒ§ÎÑŸIÙüMÃïI*w­=Þûìo1­~$úe ÀuŽùŸá÷ 5,›T­šÛ¾<ÝÕÑó €`ùËS÷ô¯¤l›-ÃïM*OÍ%o½.ò‡¾ý @Ñ~*eÛüDøýH Ë&U¯þµGÏ0J¢ÈM½ó¦æŽ?~RàþýlÜyfJù ú% @ þUû†ß—ÔeÙ¤ÊÕ>ðCÑ3 €²É£gòŒÞb·`óð{•æ¶æö¯Iã·Jý›ŽM©›E¿ú(‰Ö~¿~Rc”e“ª×ô¼”?vGô ¤ŠÕ§ÞÅ;¥ÖîgiÖjîøÓ£o\GúÎûÑ/3J&ä¦ð{•ÏeÙ¤JÖ=û_£gßwYêœü…ÔÜþµá÷.Ͱéy©µ×/¦îwþyô`øáGYÀštOûrü½KéÿeÙ¤ÊþtÓO5˜ÑÛìV\7úóôo82å÷]žŠÕDÿUÀs†Ï\ ¿o*½X–Mª|íC?=ã`ͺYʾaôÑÞå{¤î¹óS÷Ô/ŽÞ–×>èãߌj.~}ʦçÍéý²¹Ý«Sk·w¤Öþ¿9zHwç„­S÷̯¥Þ…;¤þµ§ÁòsRþÄr¿1 @5…O•*o–Mª~Ó›<ûÍ1TY‘~s¨xòû)ðÚѵ÷\8Z î8=õo:6õo:fôñÎÏuíÁ?øïýoFÿÛïwôÿµòægŸ”÷£ÿt0«†÷¼ð³¨Òš²lR-êžõõèYÀ˜ C8úªÆ³lR-jîðº”úíèyÀ+V­=c0úªÆ³lRm>¼€zëžùOáçO5Öše“jÓð!«Ôû`‡z}þTc­Y6©VåÜ=û˜#½Ëv?wª±Î,›T«º§}9zö0Š<µv}{ø¹SufÙ¤ZÕ\ôŠT´ŸŠ̲Á-'†Ÿ9ÕX¯,›T»z—î=˜eí?~ÞTc½²lRíj.}kJù z0Kò¯ ?kª±ÞY6©– n;5z0K:Çý¯ðs¦ëe“jYûFÏBfAñ̃)[ð’ðs¦ëe“j[þÈÑ3€Ô=ûßÂÏ—jÌ(Ë&Õ¶Î)=ØEwujnÿÚðó¥3<[6©®m³e*šGÏF6PïâãÏ–J3ͲIµ®wñNѳ€ Ñï¤æ’7…Ÿ+Õ˜q–MªuÍÿsJy?zD0Cý«ö ?Sª±AY6©öõo>>zF0ù µv{GøyR ʲIµ¯}Ї£Ç$3пáÈ𳤜e“&¢ü¾Ë£g%ë£(RkÏ÷…Ÿ#ÕØà,›4uŽþLô¸`= n;%ü ©ÆÆÁ-›4Íß4åOÜ=3X‡Öˆ?C*mL–Mš˜º§~1zf°ƒ»Ï ?;ª±ÑY6irÚfËTdFÏNÖ }ÈïÅŸ•66Ë&MTÝsDÏN^D~ÿágF5f%Ë&MTÍí_›R7‹ž¡ü¿ÕÔ¨M–Mš¸zWì=Cøƒ{/ ?+ª1kY6iâj.}kJy?z–ðíoü×ð³¢³–e“&²þMÇDÏR†¿ÕôýsÃψjÌj–MšÈZûþjô<`ø[M}8üŒ¨Æ¬fÙ¤‰mp÷yÑ3`¢ î<3ül¨Æ¬gÙ¤‰­}ÈG£ç*ÀDkí÷ágC5f=Ë&MtÃO<`ü·~&TcN²lÒD×þæÇ£ç+Àä)ŠÔÚû—ÂÏ„jÌI–Mšøò®Š³¥óqágA5æ,Ë&M|í#ÿ(zÎL޼ŸZ»¿'ü,¨ÆœeÙ$MÏKùÃ7D[€‰Ð¿j¿øs Ò\fÙ$ /„cþ5Æs¶¶l’~¤›§bÕŠè9 P+oýIüyOc˲Iú±üvÀìÉï»AçeÙ$Í´/IùË£g:@¸Î FS*[–MÒÔ9ö/¢g:@¨ÁŠ‹R6=/ü|¦Fé²l’6¤éy)àªèÙcÐM­=Þ6S*c–MÒ6ü´€IÔ;Qø™LÒÖ=õ‹£×I#[ü†ð/FªZƒÛN‰žñc•?qWÊn~S£´uÏøêèµÒÈ–ü§ð/FªZ­eïJiЋžõcÓþæÇÃÏbj”ºîÙÿ:z­4šKßþÅHU¬wå>ѳ`,ú7~S£ôuÏ?z½4šËÞþÅHU¬¹øõ©h==óæTÑ|<5wü©ð3˜¥¯wñN£×L£¹×/…1RUëžöåè¹0§:ÇþEøÙKJÔ¿öàÑk¦Ñ:ø#á_ŒTÙæošò‡¯žýsbpÛ©ñç.¥ª4|½ 5ÚGÿYø#U¹ö¿RQDßfUÑ^•š;ùP15Ö»ü¾ËF¯FçÔ/†1RÕëßxTô}`VuŽûËð³–•ªxòîÑk§Ñ=waø#U½æNoN©›Eß f…·Ï)›ió7K)ï^?Þµ‡ÄAR êžóïÑ÷€V´Ÿý@=úŒ¥F¥j.}ës¯¡Fÿîóÿ ©-|iÊŸ¸+ô¦°±:'l¾RªZíƒ÷¹×P#_uoø$Õ¥ö៽)lŒÁíß?W©Qɺ§}é¹×Q#僴záá_”T—†Ã j|úœ²¨վϽ–Ãÿhîó+á_”T—Z»½#¥~'ò0cã· ?O©QÙ÷^úüeSû„ÿþEIuªwþ¢È{ÀŒôo<:ü¥Fu›Þ$gž¿lê^º[ü&ÕíaáÞy¯X/ÅÓ¤æö¯?G)UµÖžï{Þkj´l꯸8ü “jù$þ¢ˆº_¬[‘Î.Ñç'5*]ç”ÿï…˦Ôë¤Õ ^þÅIu«ÝaAw €uë]¼sø¹IÊ׿þˆY6¥”Zû ü‹“êVs‡×¥¢ùXÄ=`­ò‡¯=$úܤFå+V­xñeSç;ÿþÅIu¬sÂÖ÷ €5ë·SkŸ ?/©QùZ»¿ç/¯ç–Mý»Î ÿ¥º6X~θokÔ=ý+áç$5jQ÷̯­yÙ”úÝ”mó²ð/Rªc­ÝÞ1úÉ@´Áò³S6=/üœ¤Fm¹â‡Ë¦ás›ÿdø)Õµîw§Æyÿxá3e›KÞ~>R£5·{uJýÎÚ—M½«ö ÿB¥Ú¶à%)_yó8ï#?T©}øÿˆ?)եΠý¢/µç-›òì±´zzÓð/Vªk­ý~#¥"×­à9½‹w ?©Q«wµîeÓPë…±Rë]¹Ï8î#ÏÉï»,e 6?©Q›š‹_ŸRÞ_¿eS¿`©Ömû²”?q×8î'©h=™š»ülüYH©îŸB·ÆeSÑ~*­ÞfËð/Zªsíoü·Ñû¥æü9MGø005f½üÑ[×Ù4Ô>á¯Ã¿h©îõ®Øs.o)©wÉ.ág5jWûÀ­õu÷¢Ë¦Á½—‡áÒd¼nù\ÝS€ —ß…ç4)ÍEý¾5óeÓPsÏ_ÿ⥺×>èÃ>˜užÓ¤lŽjîò3k|0ø:—M½ïþ&¡Þ¥»ÍŽ˜äç4}ëÃÏ:jÔ²Þe»¯ó%¸ÆeSêwS¶äMá©öm³eÊ¿s–ï.À¤ê]²4þœ£TÇšÛ¿6ÝÕ±lJ)u/Zþ‘&¡Öþ¿•R>˜Íû 0wŸ—²ù›…ŸqÔ¨e½ ¯×ëp­Ë¦¼³:e;¼>ü#MBÃO‰ØPÅS÷¥æbgx5æ¤ák«è<³ñ˦!¿Ý$©…/MùÊ›gãLš~;µöýµøsR]›Éó†×¹lJÝfÊvüéð?”4 µöûõ”½¼Ë“¦sâß„ŸgTßZ»¾=¥~g—MÇ‹]¹oøLš”ºçüûÆÜc€ Ó¿Ê™]9mpëÉ3zM®×²iøàâæž¿þ‡“&¢éMÒàûçnàm˜$ù}—É~ŽQmkü‘¿.ë½)ýþùá@iRjîü–T´žœñ LŽbõé¹äMáçÕüÙÂÞ6w˦¡öQŸ‰ÿƒJRç¨?ñ LˆA/µüíðsËÿßÞ½þØvtN+`ˆ@ðAc"Qb"AÐ5FC‚&„`â-`oˆú†_ài¥(%¥*¥D ,· –›VËE µ´µXn…^¸ØÐöœ½ç¶÷þ™™´Œ9ç|欙=Ï“|ÿ€³fýÒYŸî½æ¤­õ¶¯9~Z·ç)Ŧå½wŽ“/{øäÿX³£²ëÞxZXo[W½pòç[ïÍ_ûøÓþV§›vm_÷¦ÉÿÁfGfüÀX~ëó§u¸€õ´ý/—Mÿ¬bë½ó8–·_wÚ÷è)Ǧ±Zù›}ú¸ÙÙüuOc±uÚ‡X‹/|dœ<ï“?§ØzoûÚ‹Îè>=õØ´ûuº»o'_þÓÿã͎ʶ>üâ3:èÀá·û¢æÙËpòç[ïm¼ñׯX.Î~lÚµsã“_³#³cçŽÅ?vF‡8¼V³ÿóK~júg[ëÍ^ù¨±º÷Ž3¾_O;6íÚxßó'¿fGe»Òt÷?0À³ØÚû´ÉÔÏ$¶æ;ÿcñ•k“[öŒbÓî[Éç¯ÿåé/ˆÙÙÆ›Ÿ|Æg—Í+Ÿ7ù³ˆ­ÿ¶?}ivÏžYlÚ{Ó×ÆÉ 9ùE1;*ÛþÇ—5§8ð¶?þªÉŸAlý·ùÞg§÷íǦ];_¾vœ8ï“_³#±ó¾Ïû›àXÜtåÞû['±µÞÆßüÆÞ7×\lÚµýÙ·Œà"™…Í.|äXÝ{{u|€fyǿٙüÙÃÖ{ó×>a¬6ïÉïß,6íÚºæøäÊì¨lã ¿2Ær§<ÂÀ°úöWÆì¢ü™ÃÖ{óK³obHcÓ®+ý…:³³µ­«_Ta`B«ù]cþW?3ù³†­÷fÿÄXÝ}ë¾ÝÇylËåØx׳&¿pfGbÇ΋›®È10œ8JÐIDATíùÞ7&ΰµÞì¢Ë»nÙ×[¹M»–‹±qù3&¿€fGa³ãËoݼ/G8KV˱ùŽß™üùÂÖ{³‹½ï¡iÿbÓ®ÅöØøÛ§O~!ÍŽÂæ—ýÜÞÿ§­«þhòç [ïÍ_óØ±ºç¶³r?ï_lºÿNWMlÚ³Z­O¼zœðýT³}Ûö?½b²#|·Õ½wŒù%™ü9ÁÖo³ 97_5ŠébÓ}wüǘ½æq“ÿ`ÌÖrÇ΋ÿ|ÿÔÇ޼Õü®1¿ôg§F°µüVËêä7ÆA2ylÚ³½16¯~‘¿Vg¶O/†[~ãÆ©O9Y«Í{Çü¯aòg[¯Í.~ôX|þïÆAt0bÓ}–·_7f—ýüä?0³uÛîGuwÿO p–ílŒ7=iòg[£½ôÁcëcÇÄ»™ElÚ³Ø[õ8éO@š¥Ûxó“ÇXîL}ÂàèXl·=mòg[£€¿ó÷Çêî[ÇAwðbÓ}–'¾16®|ž¯Ö™…ÛúÀO}´àhX-÷ÂÀÔ϶ÛxëSÇò¶ÏŒÃâÀƦû-îüܘ¿õiãÄøáš­Ã¶?õ—SkXÿÐôÞgOþ»¿ò;gl¼å)cùµOÃæÀǦû-î¼~l¼ãwE'³3ݱsÇÎ ïžúHÀzZ­Ææû^0ýïývxwþƒÆæ»Ÿ5–_¿~V‡&6ÝoqûgÇÆ;Ÿ9Nœ÷€éo³Ãº—>x,¿ú©©3¬ß'š®xîô¿ïÛ¡ÜìÕ?9¶¯9>V'î‡Ý¡‹M÷[Þ}ÛØüЋÇÉW¡úíÃð’Hþ4çòÎÑ5\Of~{­&Jér(E ¬}låR cÏ+œhU›ÜoüÅ¿(båwýüÐ%9g¤37“˜?ÞAÊNˆ^12‚ꢎGÏ¡ß+„z~-ȉ7õpö HÛ†¸Z rlVTóÁº7 0i¼XãIÔJHÁ H[8+€žÂmž­–“§y(%ÉPN.„”=‚ë{QÜÔ~ýÖÁ˜Mˆ­P±ž@«Îô@¥@­Üøh×÷x l7;¤< øqз5Þ y“¹X÷ €”9n$e õ€˜"À”þéIüÏŒ—UÜjÅïhW²¸ôû~ï(EIÜì¦g¤ìÜ0M«x@d‰,Ös3¹Þ0ž]àЮíð€V•Æ @ßßlÃÛƒŸ¼K„ Ó¹@uHé½[×ìæ^Ö•R-_ ½¶ôóƒàtìö€õCYbòŠéÞ°¯+ä} ž]ýNþ¯»y³«gÈ\v,hýcnýö!WæµêL« ǵXy“ìô›û¹L9`­$/}[Ã=—¼c”=€R8nÄò‡ `c˜äß$Ô¶Z"°¦)KL^/*¹È±ÙÜs°dúŒÀÂxsnä8™Óº~¨åŸõn¨—Ö¹0¥/V+ÑÖüæž0q5¾rb¾3iûpÛRf A¾[wl¶[–èx(g–Álxán\µ±Åyc `m£º‹ˆI:±ö¬ñú è×g1u©ÃuA¢ü©ðŒ 5¤Ký JoÓm2·¶´k9a«eć|BÞ=ÎUImMÑ@µÚ!»Ç%•D+yÚåŒös¯Š÷&†õ¥”¯9"À¿ 3)ZxRÊN ?èn:1;CZÞ ¡Mƒ äD’*nég##Þ”ö&ŠJÙš<b|Îß¡ýꊯuÎ'IEND®B`‚‰PNG  IHDR6–Tפó pHYsèèµ{Rk¡IDATxœíyp•ÕÆ!²‰‚ŠÖÖªh[[­TêZ¤Ud,ÚºtªÕQkÇ*nã¨U’ $ʈì²PYAYEPPVYÃb…r¿}y;çc踛›Ü{ßó~y~3Ï¿ ÷æ<¿û-giÔÔz+¯µ=ó¡Ö¨kw'û¶ ’¹9”ìÑ(-1zŸBÁ®÷ èC°k9½NLÛß8¥¨±Õ·m`î¸ÛžyÿËjìq3(‘ȱgÜ[–ì{–Ÿ‰AlžJÁž•Ü=ÿÛJæ·à‘Û×óÂ|{Æ}¥j,r÷Äšñp«ôšŠL X£è4 >ÿˆ»¿à{ð7¾Nɼ&ürëш¬²N4¿¨ w/€`ha¢•1øW‡3&5uûY¹†»· ¸+†°KíhÌ¡í«iÙ¨“¸û„bŽî´#c4¿9ùÛr÷¤€3çQ}ä6¾ëfî~8oÂßSCÀÖb²ÅæoOq%¬®ˆ®ÆŒâóÓSÈD3²Ëï¦`ÿFŠ3ÙX ±Œ‰ÍèNt[7ƒÛÉžq_´æ5#ÅL4%gÎc:5K<›Œ>§Cl@¦Øœ=(Vx69óŸËœÐ¾]Î’ Ž<‡‹!ÎÛÏBl@ ØrSp`+Å…àóÉ|QV„öä· oí$Šjl¨F!6 JlæK(.ø›f“Qprö¥öµ oU)I&<¼—üoóN‚¬W®ÏøvFȈØÔ´†8à­‰…MjG“w\´˜\arôcIlìdµÉú÷±ŒˆÍß±ˆ¤£n3y»”rÍ¢y`Zá$Éß¹„ÜeÅdO¹ƒŒâóø¿'ˆ dBlFÁID¾K’ *×F ÷¹ úï¶w«hgZž/ŧ`ß:ò>KΜGÉy•6çˆBl ãb³&ÜL¢q’d¾x!{9ùýŽº6’L6¦µxŸL&çÍ'É*½:µ‰Çˆ›ØÜE½I2Î;yìÅÌööê¡UMþÎ¥ä.éKÖø®dômËþ!6 •Ø$ï’ÖT²@’RòšD·…uÂ5ȯXFî{%dOý+™%íø?Ät[XóIEÂÕÚÑXeêö\,¿9ûÿb¢Äfôÿ‰ÅwÈè{&{)S‰¿~Ʊ狩[ÊÂSÙÿ/6kLg’Š¿y.{!Sš^¡Ž¸‹Ãs1ˆ h+6ûµI*Îìîì…D 6 ¡ØÜE…$§x `›·v"‰ÄIê±t Ø€~bSs¡$T®a/#±MÅì[OñÖMc/#±MÅÚMqß{‘½ŒÄt›}˜$â.îÃ^Fb:Š-7GìêPî2"ÐQl½N ©8 rÙˈ@l€X‹-Ç‹ *¶ž-I*jYwˆ h)¶ãI*îûƒÙˈ@l@G±å7'©dãtrbbߊ†$Ó,ö2"Ðu›SCQKÁ¸Ëˆ@l@Û•{H"Áþ ìeD 6 ëZÑýHìîØ€ŽbÛýIÅès:{!ˆ è¸mѦY$søåì…D 6 ãF“+GTìÉ·³Ø€†bS§#IÅ™÷4{!ˆ d™¸æâ®Ê^Hb:¿7¾+IÅßò{!ˆ h(6ó¥‹I*aÕNöB"ÐPlÑB—U©ÿ·Qp2{)ˆ è&6µú ¦’¤bïÀ^JbŠÍ¯XFR±gÞÏ^JbŠÍûh I§UÅ#H»Øœ·ÿMRñ·Ìc/%± ÅfM¸™¤ÞË^JbŠÍ,¹€$c¶f/&±ÍÄí¤ëš$«ôöb"ÐMljû¢½«I*ÎìîìÅD 6 ¡Ø¼Õ£I*ê­.w1ˆ h(6gÖ#$•`ß:öb"ÐPlæÈ+I,jÏ]Nbš‰-Z3ø$käUìåD 6 ›ØÔ „}ëI*ΜGÙˉ@l@C±©ÓÕ¥â}<–½œÄ4›3÷ ’ŠºÚä.'± Åfú=‰% È(8‰½ Ä4›Ú´Q B*VéÕìE 6 ™ØT‚¯>#©8sc/(± Åæ­HRñÖL`/(± Ŧ®z¤ÜÆ^PbŠÍñ;’ŒÑ÷Lö’"ÐLlÉüæDžMR±&vc/)±ÝĦ^ ìYIRq—¼À^RbŠÍýàe’Š¿s){Iˆ h(6»üï$פd¢{Qˆ h&6sÐÏH2æðËÙ‹Š@l@3±%sShU‘T0QW^ 6y±©Óá·Î'©xŸLf/*± Åæ., ©„ջ؋Š@l@C±Yã»’dŒ~?d/+±ÍÄfµ! C’Š=í.ö²"ÐLl*Á-$ou{YõyZtžÄ´›ä­ÂÃê öR7¸$š’9ô²èü µU»:Q]õ›Ã;@l@±9³&ÉÅçó—=®É;ŽÌÁ‘]~7¹ËF+>ŽµÆØ*½búˆMýúJÆžù¿bã…³¢JÎ; ò7¾‘Ò’¯¶ËztŽ9ø$‘бÆt&‰_|±}Åæ¾›O’ í‰&¨r ª®qæ=Mñ7͆؀¾bS“,¥cù#» êuŽƒD¼‡Al@_±%ó›GgvJF­…äT]|¹™$âÌb‹M=gÛö‰Æ5Éè} »¤RQØ:z»(µ$bZ‹ÍYKÒ±_{]T©Æžö7’Š9ð§Ð[lVéÕ$ r¸­Œ¼uÓH$ž]ëùƒ`[2ÑŒm‡ˆt¢v‚å–UJ·¡Bç•kký9!6À'6uõ°~:I'صœ]XµóÖS$oU)ÄdˆÍž~/ÅkôuìÒú¿ÉoíÜΜ€Ø«ØŒ>§>I'ؽBû »ÎÛÏ’dÌ—~ ±bSñ+–QP›2rËë˜? ýÏý<34Öjñ;Ä´›:½(8I2ŠÏc—Øw’×äÈy‚Q»ø¦ò™!6À.6u H\ð+Þ‹že±Ëìkq—"騝ýb²Ä¦’‰cÚXÏÕdn›ôçjG1œ ±yb“~,ß·q—óÊ-·1¹‹ûPHeþÄ´›9äRŠѼ+†7¥j®¿~ŵôb"Ŧìß@qÃß2Œ>gdMjÖÄnVï¢8Q—Cª!6 Øœ=(ލI±ö”;2zkªÎõ·- ¸QÛs!6 ­ØÔIãR·Ó©íÒ+küM)ÍÇúÞï«àd²ËïŽþݸ¢Î:…Ø€h±©ø›çRÜ n'waÁ‘ÍS|§nËœ7þuäšgQ¬ñ¬èy!Äċ͚t 5$B«:Zyá­íëÌz„ìé÷Dë"¹GνÕeìz?š}ßðÖL¨ó8‚Ø€VbK&šRxx/w§€˜Ã~ ±˜ˆM½D˜ÿM£éÚê^êm¼#µ¿»:5ÎÿT.Ý;ÿ7 ¦ªöŸÉ}ÀX«·lHÕq?—ýßö’æØÌž©:ãƒ7¼=þ½”ê:MƒÉÚêÞà ÙºæSyì!ù¿Á4µu¾}Tî»&B½ùáTç|'e«JÍ«þûßnüÛ^7´õžÿÛÁZZ÷¶üßDšîföLÝugå¾%`¢ÔÏÜ—ªcÞœÿßû’ÞñïH­µŸMõ–GÓ¤™Œ¡­ÛNû.Mó~=•3{äÿ†‘–îº÷^˜û΀‰T?}wªV˜ÿßý’v¯™=oªÐ¹ÿk)õ:iŒõÐV7_Jí[O,¡Ù¿9¤·lŸÔ}àòÜ·L4c›4aðÎÁßÖ¯[Ó8Ë¡­.ŸK­ŽLåŠ7æÿF^ÝQoH½ 7æ¾E`*ôž¸5U+öÏ×Ñÿ µ¾ù©®¶¤qTŒÝO°}wu*W¾)ÿ^ú‰fð½G¿•û6€©Ò{âc›4‰­Øð7øëÆ iœŒÇÐÖm¥öÍ'¤råù¿ÐÒvšýc¬õSwæ¾S`*õY;ø.¹Ï’ŠøV”Ú·}~lþ†Û¢ÚºÖ¦ê´”ÿ +í êØ·Þùȧ÷ÐU©\ºWöó¤b(U§¾'u×_›»E;´Õ[O/ýVö/¤´³ªãßžê-rß.Àìj¬;+ûAR1Ôš—žú/oJ‹ÕâÚê:uÖ=ø]ÜÜ_´Í¾Mkóâÿ”ÿ #Íõ×El°øõ:©yá¿Ë~†TŒ¤æÕÿ#¥Ncº‡¶Þ³¥êÔ÷fÿbHs©Zý³©~æþœ· 0Fj~ñײŸ%$#©úü/§zëcÓ9´ÍþX_¹b¿ì_i.UǼ9ÕÏÜ—ëv¨ßz)5Îø@ö3…¤b4­:(u7¬¢¡­®S뛑ÿ/ͱꘃR½éÞ‘ß*@Œþ¶§SãäC³Ÿ-$£iéÞ©³îœ)Ú:ÍÔ¼ìwóÂ¥9V­ú™T?}÷Ho ^½å‘Áß\Î}ÆTŒ¬ÖÚÏ~àk"‡¶º±55Îõ»ñŸªU¦ú©»Fu‹CVo\çOISVó²ßM©Ûž¬¡­®¶¤ê¬–ý“+͵êèRýäí£¸=€ê­¿fðke¹Ï’БոòGFöޤCÚêm›Rõ¹÷eÿ¤JóÙnö­dÒ½ãœìçIÅHkœ÷¯SÝÚ6ÞC[ýÒÆTü Ù?™Ò\«V¾1Õ?úëaÞÀ"оþSÙÏ’Š‘Ö8ïߤԮÆsh«ËçRuÚ/fÿ$JsnÙ>©·á†aÝÀbÒï§–7듦®ÆšÃoÖ9VC[Ýx!Ug|0û'OšsK÷JÝû/Æí,VÝfj~áÃùÏ#’Ò(k~å?¦ÔëŽÉÐÖ®RuοÈþI“æÜÌ©{×ùá·°øõ«Í©qÊ?Ì.‘”FYë/ÿç muš_="û'KšO›O½ €ñÒßúhªVœýl"©ií[OYÜC[ëú?ËþI’æSû¦%‘·0¦êëRyÔ²ŸQ$£kfÏÔ}ðªÅ9´uîübþO4Z_ÿ£¨o`t¸|pðÎ}V‘TŒ¬jÅþ©÷Ì‹khë=¹.•Ë÷ÍþÉ‘æZë«ÿ%¥~ñíLÎ÷ŽË~^‘TŒ´êÔ÷¤ºùÒâÚêêùTžøóÙ?)Ò\kξ•o·r“§uÕË~n‘TŒ´ÆE¼÷@Þ¡­®ScÍaÙ?Ò\›}ëîÔ©vûÆ&X·™çüjöó‹¤b¤µÿúô¼C[û–³¤¹Ö8ýý©ßغÛ7 0ùú/oJÕ ïÈ~Ž‘TŒ®åû¦Þ¦ûò m½gî÷wÙ465N>t𠘫ú黽©4eUg| ¥^{ÄC[§™ªÓ~1û/Í¥êø·¥þÖÇ|“Ó«{ߥ©œÙ#û¹FR1²Z7-íÐÖúæ’ì´4—ª£Hõ3÷/øhßä ,MUËöI½gÍÐÖÛôƒÁÿ0û-íªe¯K½GÖ.èÆxE¿ŸZ—þNþ3ޤ4ª_øW zÒù mu7UgýJöVÚe3{¤îÝ_š÷ °=ýöË©ñùœÿ¬#)ªÎçwhë¬;;û)ͥη—ÏûfØ™þ ?LÕꃳŸw$#©Zý³©n¼0œ¡­n¾”ÊÕoÉþAJ»ªuÙƒíˆÖ{â–T.}ös¤b$µnüÌp†¶ÖõŸÊþÁI»ªyþ¯ïÖÛðìJwÝYÙÏ>’ŠÑ´|ßTo}xå·¶Î]k²_¤4hfÏÔ[ÿQ>þ†böfú%û9KRŠlö†w:´5/ýì)ÍÖùÞ±£|î U÷N]*'¬ÆÉ‡îdh«»©\õ3Ù/Rj]rxJýþˆ{ÃÕúÚÍ~Þ’T„Vo}lûC[÷‡·d¿8©qæSêT9žyCÕo½”'ÿBös—¤"¬î]çmhkgeö‹ÓtWû–ÔñG9žw#Q?ug*—¿>ûùKRRëÊßßþÐָෳ_œ¦¸e¯K½'nÉñœ©Î÷OÍ“”"jœþþí muÊ£Ì~qšÞ:ß?-Ó#`ÄúýÔüÊÈ~“Tì~K÷J©õòk‡¶Þ3÷ç¿0M÷›L‘~õ|ªŽû¹ìç1IÅn×ûáͯÚ:w­É~QšÎfÿh¿ùbÎç@½GÖ¦rfìç2IÅnÕ]wÖk‡¶Öušý¢4…-ß7ÕOßó¹Uûÿ;ÿÙLRÚÚ×ýß×mó#ûEiúêÞu~Îç@~Ýfjœþ¾ìç3IÅ‚k^ðÛ¯ÚÊÕg¿(MW­+?™óQ°hÔOÝ™Êe¯Ë~N“T,¨ê¤w½r?uóÅì¤)|ëÛN•õA°˜tþêèìg5IÅÂZºwJýzp/õ¦{ò_¦¦jÅþ©~îor?×~š_üµìg6IÅ‚ê¿üÌàV.º^•ýb4=uï½(÷ã `Qêo},U+ߘýÜ&©˜w?~³Ç¢}ËÉÙ/FÓQûÚÿ“û¹°¨uï<7ûÙMR1ïzë¯ÜÃEë†#³_Œ&¿ÆÙ¿’R¯û™°èµ.9<ûNR1¯º÷|ypÿÍ+>™ýb4ÙU«LýÏý¬ ýjsªŽ}kö³œ¤bÎun?spÿ‹>šýb4ÁÍì‘z]û90Vznœ§²Ÿé$¥¹Ô¹ùøÁ½[4¾ðáì£É­½ö³¹ŸOc©uÕd?ÓI*æTû¦™Á}[T§¿?ûÅh’ÿ.['÷³ `,õ›/¦êø·g?ÛI*vYûÆOîÛ¢:åÝÙ/FØŠýR½ùáÜÏ%€±Ö{øºüç;IiWµoüÌàž-ÊÞ™ýb4yuï:?÷ó`"´®øxö3ž¤b§µ×þùà~-ÊcÉ~1š¬Z,÷s`Â~…ômÙÏz’Š]þú¢<æÍÙ/F“SuÂ;R¿±5÷s`¢ôº:ûyOR±Ã mŠofÏÔ{ô[¹Ÿ?©uÙùÏ}’Òö2´ihßTÄëWÏ§êØ·d?ûI*~*C›Bkœù¡”zíÜÏ€‰æWH¥bQfhS\+öKõæõ¹Ÿ7S¡uÉáùÏ’Ò«3´)¬î]çå~ÎL~µ9U«Î~”T¼’¡M!µ.þXîg ÀÔéþà+Ùσ’ŠW2´i·«Ž{ê7¶ä~¾L¥æEÍ~.”T 2´i÷šÙ3õýVîç Ào¦~ IDATÔêo{*UGÿ|()Ú´[µoütîg ÀÔëÜzJöó¡¤ÂЦ…×8í½)u›¹Ÿ'Ô½Ô8óCÙωҴ×6´iA-Ý+ÕOÞžûQÀß«ŸºspVË~^”–Lo†6-¨öÚ?Ïý à'´¯ùãìçE©œâ mšw~e`qê·¶¥êø·g?7Jå”fhÓüßeô‰[r?;Øî—ç?;JK¦3C›æUûÆÏä~f° Í‹>šýü(•S˜¡MsίŒŒ‡þ‹O¤jÅþÙÏ‘R9eÚ4·üÊ(ÀXéÜ||þ³¤´dº2´iNµoütîgóQwSãŒd?OJåehÓ.kœúž”:Üæ©Þ¸nðJ¹Ï•R9%Ú´ó–î•ê}?÷³€j}ýòŸ-¥%Ó‘¡M;­}ѹŸ ì†~ckªœù¥4Š mÚa~e`2tn?#ûS*§ C›vü.£?¼9÷³€u/5ÎøåügMiÉdghÓvk_÷ÿr?Ô{â–TÎì‘ý¼)•œ¡M?Uuâ;S¿ýrîgÁZ—‘ýÌ)•œ¡M?Uoý7r¿ö0ý—6¦jÅþÙÏR9¡ÚôšZ—ÿ^î×}†¨óW«²Ÿ=¥rB3´é•ªcJýòÙܯù S¯§¾;ûT*'0C›^©{ïE¹_îÞß|=ûT*'0C›5/ø­Ü¯óŒPóËÉ~•Ê ËЦÁÂì¿ðxî×xF¨Þ¼>•ËöÉ~&•Ê ÊЦԹù„ܯïdоáÈìgR©œ  mS^ãô÷¥Ôëä~m ƒ~k[ªŽ;$ûÙT*'$CÛ47³Gê=öܯëdÔ½óÜüçSiÉddh›âZW|<÷ë9¹Õ½Ô8ýýÙϨR9Ú¦´êèRÛÓ¹_ÎXz_—ýœ*•¡mJëÜ~fî×q‘æ—þmö³ªTŽy†¶)¬qæ‡? ?VoúA*—î•ýÌ*•cœ¡mÚšÙ3ÕïÈýú À"ÔºâùÏ­Ò’ñÍÐ6eµ®þÃܯÛ,RýmO¥rÅ~ÙÏ®R9¦Ú¦¨jå›RÿåM¹_·XÄÚ7-É~~•Ê1ÍÐ6Eun=9÷ë5‹\¿ýrªŽ}kö3¬TŽa†¶)©qÚ{Sêur¿^0ºëÎÊ~Ž•Ê1ÌÐ6%õ¾.÷ë4ã¢î¥Æç~)ûYV*Ç,CÛÔ¼ðßç~‰`ÌôÖ#ûyV*Ç,CÛ¤·lŸTo^Ÿûõ€1Ô\ó›ùϵҒñÉÐ6ᵯÿTî×eÆT½ñŽTÎì‘ýl+•c’¡m‚«V˜ú-¹_—c­‹?–ý|+•c’¡m‚ë|ÿ´Ü¯ÇŒ¹Ù?GT.ýÿìÝw´¥w]èÿ3!!ôz)‚"E¼ÊUô (WQDë½Ò"*È‘vA…¥çÌL&½LzOH! !3“B*!Té•„4H¯L¾»ïý|ï:'‡ŸÃ8唽÷g?Ï~½×z­ûë.=™ù<çó™sž½eøŽ ©Ú*ª¶òU9wšÑóX’$I’Tšk¶ ßs!•€C[Eu®[=‡%I’$I©x쎙Û‹Þu!8‡¶ ªôÛ9Eô–$I’$U¨æ7>¾ïBqmÔ½ó¢èù+I’$IªXÅÚ{sÚöá;/¤æÐV1¯ýEôì•$I’$U´Ö™_ ß{!0‡¶*Yºå̧ÁH’$I’4ˆŠÚC¹¶Ýsâ÷_QmÒ<ùÑ3W’$I’TñZç. ß!(‡¶ªXþ´\<~wô¼•$I’$U¼¢õD®íô¢ø=&GC[E´ÎüBô¬•$I’$Ií w ߃! ‡¶ ¨­xV.ÒÑsV’$I’4.u¹¶ëËÃ÷aH#Æ¡­Zç.±’$I’¤1«}Ù~áû0¤ãÐVrµ^‹ÆãÑóU’$I’4nu[¹¶Û+Â÷bH#Ä¡­ä¦/^’$I’¤ˆüTLü ‡¶«íòs9·kÑsU’$I’4®yWäu9´•XûÒ½¢Gª$I’$iÌ›ÞM£÷cH#¡­¤j;¿ÔO³I’$I’Fã§ÚvyYøž i8´•Tûâ•Ñ£T’$I’¤™Úí¾'Cm%TÛñ¿å¢õDô•$I’$éÉZ)×vzqø¾ )˜C[ µ/Ú5z„J’$I’ô3µ/Ø1|_†Ì¡­dj;¾0͵ÑóS’$I’¤Ÿiú7¯¦+zo†È¡­dÚì=;%I’$IÚ`íó¶ ß›!rh+?Í&I’$IåŠÆc¹¶ýóÂ÷gHAÚJ¤}Þòè™)I’$IÒ&k3¾?C âÐV+ž™‹ÚCÑóR’$I’¤MVÔɵíž¿GÃäð9´•DëŒÿ=+%I’$IšS­o}9|†À¡­ –m•‹Ç“’$I’$Í©"=˜Ó¶Ïˆß§ar¸ÚJ yÂßEÏHI’$I’æUëÔO‡ïӆ̡mÔM-ɽ®ž’$I’$Í«âÑÛsZºeü^ “ÃãÐ6âÇþyôl”$I’$iA5ÿ@ø^ iˆÚF\÷®K¢ç¢$I’$I ªwßÕ3¿©½[C‡¶Ö8ôíÑ3Q’$I’¤EÕ8â]áû5¤!qhaëWGÏCI’F¿N3Ý9óSàÝNÌï’Ûïž[ç.Í­3>Ÿ›'þCn÷×3ßä×|S®ïõßsmå«ÿÓÏÿ¯¶{ö“ÿï.?7ó?Sß÷×sý€7äÆWÞ9óÿOó¸¿ÊÍ5ÛäÖ™_Èí wÎïž»7Ÿš{wgæ}4¹•¢¿*’$LÝ[Ï ß¯! ‰CÛˆªíþÊœ{Ýèy(IRl½Nî=r[îþàÌܾ|ÿÜ:gjæÓ¸G½gæøUÛéEáÏìZñÌ™ÿÇþÙ“¹Ëö›ù¿£÷Ð-9w[Ñ_YI’†Z}ÿߌ6Ãäà9´¨é‰—$i,êug~ lú_»gŽig|>7¾ú'¹¾×/ç´l«ðgò@Lm1ój3G¸s—æÎ 'ÌsQDÿ×$i u®96þù “ƒçÐ6‚¦]¥h<=%Iê{ÓÏ·îäö¥{ÏüJçô¯c¦å[‡?{GEm»ç̼£µuê?çΕG¯ Bê3‡¶ùæV’¤AÔ{àúÜ:wY®ïñšð磯¶û/æö¥{åÜ®EÿÑ•$AïþìƒÔgm# síqÑóM’T¡¦ß½ÕùÞÁ¹¾ÿo†?ã(§ÚN/š9ÐõG£ÿ8K’ª\»–k;¾0ü¹©ÚFàÙÜmE7IRš~ A딚y÷Vôój¨mÿÜ™o‹ô@ôoIREk}ó_ßwúÈ¡-ú?À™_Œžk’¤2×iæÎu«rãˆw…?Ó¨°ÏÌ­³¾äÒ%I}¯xü®œ–nÿ¬ƒÉþph Ö{à†è¹&I*a½Gn›ù`Ÿʰæn~_’ÔÇšÇýUø3RŸ8´jò¶èy&I*ᯇ6×lã_~ UÛífÞ˜{Ýè¿’¤ Ô½óÂðg¤>qh ÔùþáÑóL’T’ºw|;7Ž|wø³ ÖUßï7f–#I’[}ÿÿþ\ƒÔmAj+ž•‹ÖѳL’4ÊEîÞtJ®ò;áÏ-Ø”ÆÑïËÅO~ý7F’Tâ:Wþ<ƒÔmAš'"zŽI’Fµ¢÷äí€7„?¯`^˜pî2ïo“$-¬N3×v~Iüó &Ç¡-HïG—G1IÒ¨Uôrçšcsmå«ÃŸS°Põý^ï×I%I ªuÎTøs Ò"9´¨ïûkÑóK’4buoû–w“PSKrë”òš IÒ¼*ÖÞ“Ó²§Æ?Ç`ráÚ´/Ü%z~I’F¤Þ½WæÆþl‚A¨­|UîþðÜè¿f’¤Õ<þáÏ/H‹àÐ6lS[xY°$)ß=ó¾Î´ô)ñÏ&¤©%3Ö‹æÚè¿v’¤Ô½ýüøgL.œCÛ5ŽxWôÜ’$VÔέ3>ŸÓò­ÃŸI0L~ºM’4§Š"×÷þ•ðç¤rh²ÎU_[’¤ˆŠ"w®:*×vzQø³BßÝvúg}2©$i“µ/Ù#þ™“ ãÐ6L+žé¥À’4†õº%7ÿƒøçŒˆúoÊÅ£?Œþ«)IÑŠÆc9mûŒðç¤ph¢æšm¢ç•$i˜µk¹uî2ŸžPÛî9¹sí×£ÿ–J’F´æš¿ VAZ‡¶!êÞö­èY%IRÝ›O͵Ý_þìRüCd»ýWV’4buïº$üiÚ†¤¶ËÏåÜëFÏ*IÒ>M´q쟅?w LêüV.¿+ú¯¯$iĪï÷úðg¤yrhÖúôÏEÏ(IÒ€ë\·*×vxAø3ʨ¶ã }*©$égj_¾øó Ò<9´ IïîK£g”$i€/ìm®þHø³Joé–¹}áÎÑ¥%I#RÑ\›kÛ=;þù“sçÐ6µÝ~!碈žQ’¤Ô½íì\Ûõçß5P%Ó‡ëÜ®Gÿõ–$@Í“ÿ1ü¹iÚ†ñEþæ¿DÏ&IR¿k×së´Ïä4µ$ü9UT?ø­¹xâþè¿é’¤àz÷|?ü™iÚ† wÏѳI’ÔÇz÷_ëå¼0µ•¯Ê½oŠþ+/I ®~à›ÂŸIæÈ¡mÀê{¼&z&I’úXûÒ½rZ¶UøóÆêCîº$ú¯¾$)°Î‡…? Í‘CÛ ¿Àgÿ{ôL’$õ£v=7Oø»ðç Œ¥å[çεÇEOIRTíZ®íðüøçLnžCÛ€õî»:z$I’Yïáäú¾¿þL±6µÅÌO”J’Ƭ¢È½‡nί¼3þY“›çÐ6@~mT’Ê_÷Æ“smûç†?S€'µÎúRôX$ °bí½3ßµÎþÜ8âsmûç…?{ ̓CÛ ¿¸ßü×è%IZhE‘Ûî<óS4ÑÏàg5¿ñÉœ‹^ô”$-²¢õDîÞyÑÌO,7×l“ëû¼.üi‘ÚÈ‹{%©œõGfþ5ú9l\óĿϹ×’¤¹ÖmçÞ=Wäöå̼÷væ¨æ4™¬‡¶©íüRÿÒ*I%¬xìŽ\ßûWŸ#Àæ5¿þf7IÒèU¬½'wo:eæWþ‡¼-§mŸþÜ€4mƒúžò©è¹&Išg½û®Éµ]_þ æ®qô{g>X’WÑx,wo;;·Î]–G¿/×vzQøóR‡¶éÞö­èY'IšGÝ[ÎȵÏ ~ó×8êsî4£Çˆ$Ï{Õîøvn_´kn÷×¹¶Û+ŸFˆCÛL*Š_c¤òÔ¹òˆœ–mþüαM’P¯“{\Ÿ;W•[§öÉ_õ=äMqh€éOK‘$• ¢È­s—†?7€þ˜þÉŠé¥P’´°zÜš;×›[g|>×ùïUƒÉùsh€Îu«¢ç£$isõº¹yâ?„?3€þj®úO#•¤9T¤r÷æSgþÑqú§‚k;¾0|†Cª‡¶~[¶U.GÏLIÒæŽlkþ6þ™ Dó„úôwIZ·VÊÝ;/ÊíK÷šù ¬ú>¯ËijIø¼†TAm}Ö8ü÷£G¨$iSõ:¹¹êƒáÏ `°Z§~:zÚHRÜ{Õî½*w¾wpnžô±\ßïõ9-}Jø\†4&Úú¬}ñÊè±*IÚÔO²­þpø³Žö··ž:’4ðе÷äîM§äÖ¹Ërãˆwå´í3Âç/¤1æÐÖg½‡n‰ž³’¤ÙV}(ü9 ÑԒܹâ°èé#I}kú5E3¿záιqôûrm§ÇÏZ ¯Ë¡­j+_=w%IªÛÎͯýeøs°ô)¹sà ÑSH’æ_·{÷\á½j0Y.mýübžþ¹èQ,IZ¿^'7ŽýóðghÛgäî]—DO#IÚx½nîÝwMî\qhnžü¹¾ßoä´tËøù äùrhë£î­gEgIÒºEnžøáÏ ^m‡äÞƒ7EO%Iš©xìŽÜ¹îøÜ:ó‹¹qè;rZñÌð9 Lô…C[¿lûŒœ;Íèy-IZ§Ö9“ñÏ`dÔ÷ø¥\ÔŽM’Ƭé¹Ó½åŒÜ>oÛÜ8ú½Þ«“ÕæÐÖ'£Þ=¿%IëÔùîAáÏ`ô4}»•4¸¼W Æ^Ë¡­?Ú—ì=Ò%I³MÄýô УŸ ÀhjžðÑè1%©*ïU{àúܹê¨Ü:ý³¹qÈÛrZ¾uøŒ&B9´õÉô€•$Å×»û;3¿Îý\F[ûÂ]¢Ç•¤’U¬½gæóZç.ˣߗk;”&úy”O}Ï׿¢ñXô“4ÄŠG¸Þ{Õž>‹€‰Êph[¬©%¹xâ¾èg…$u­o}9þy”Öô»–¦ö’Æá½j/Ÿ9ÀD¥9´-R}¿ßˆ~vHÒX×¹~õÌ?zD?€r›~“¤r7ýÓ©ÝÛ¾•ÛßÞ>7Žy®íòs᳘;m‹ýžñùèç‰$m½oʵížþ,*òá7Ÿ=Ö$͵^çÉ÷ª]uTnžü ïUò¨ph[$ŸV%Iqÿj=ýn¥èçPÓŸZ<ýî&I#VÑ˽oÌ+Ì­S>•ë¾)§e[…Ï €´m‹1µE.jG?v$i,›þ•ðçP9Ó |î¶¢Gœ4Ö?ùñÌ4L¿ƒµqøïûéu —‰CÛ"x?›$ÅÔùîáÏ ºZg~!zÌIcSÑ\›»w^”Û—î•›k¶Éµ•¯ŸiÚóÅ;ýsÑÏ%I»zÜ–k+žþ *ljIîÞxrô¸“ª—÷ª“ÕçжÞÏ&IC®×ÉõƒÞ>ÿ1y_ÛcwFO=©ÔkïÉëVåÖéŸÍCÞ–Ó¶Oÿ» Ì¡m¡¦–ä¢öPô³K’ƪÖ9Sñóõƒß’s·=ú¤RT¬½7wo:%·Î]–G¿/×v|aøßa€À¡mêûþzô³L’ƪÞÝ—æ´tËðùŒ—Ö9“ÑãO¹ŠæOr÷öórû‚rãk‘k»þ|øßU€4"Úú…;åSÑÏ7IŸZ)×÷|møìÆÐÔ¹{Ç·£§ 4ïU›þÐúoð^5€Ésh[ ÎÕÇD?ò$ilšþð™è¹Œ¯ÚÊWÍ|2¢4.ïU›ùг¾ä½j“óçж@ÅcwD?%i,êÝ­_Â5OúXô8”ú^ñÄ}ë½WÍNÉ¡mj»¼,ú™(IãQÑËõƒß>÷¦u®_=¥W´žÈÝ;/ÊíK÷ÊÍ5Ûäú>¯ ÿ;*È¡mš_ÿßÑÏII‹:ß=(|æüÔôOûLÿTÊ÷ª-}Jøß!€4Ú }ÉžÑNIª|Ez ×vx~øÌXWã˜?Ò©÷ðrçšcgÞiZ?äwrZþ´ð¿+iL9´-@ïÇß~–JRåk®ùÛðy°!«Ž‘ãŠÆc¹{ÛÙÿù^µ^þw€‰ÿŸCÛ|mûŒœ»íèç«$Uºîä4µ$~æl@m‡øR ï½jw\Ûí6óúšÚî¿þ瀉Mrh›§Æ¡ïˆ~ÞJRµ+Š\?ø-áó`Sü ©ú^¯û3ïUkò¶œ–=5üÏ:óâÐ6ß/Ø™_ˆ~KR¥ë\¿&|ÖÌEçÚ¯GL•¸bí=¹{Ó)Oþ èïšùÍ™è?ÓL,šCÛëæþ)¤÷GON• ¢ñxîÞyQn_¸óì{Õ^þ瀉ph›§Þ#·F?§%©²u¾xøœ˜æñ=:5jµRîÞyan_¼ræÏGmå«Âÿœ014mó|ñíô»ƒ$I¨ÓȵÝ^>ëæ«{ó©ÑTQy¯“?Ë¡mGýqô£\’*[û’=Âç<ÀBLäô§Cj ß«¶â™áþ˜)móùb3ýl—¤J6½ ÖvzQøœX¨ÖYÿ=JÕçŠÚC¹{˹}ÞòÜ8ú½žSä¹ph›‡é½’$õ¿ö%{†Ïx€EYºeîÝ{eô8ÕBë¶sïž+rûÒ½rsÍ6O~0ÏÔ’ø?Wä²qh›‡é—$õ¹^'×veøŒX¬úÁoɹèEOUÍå½j÷_›;W–›'"×÷ÿÍ™CiôŸ&*Á¡mަ?‚[’Ôÿ:×~=|ÆôKûòý£ÇªÖ«xìÎܹnUn}ó_rã°ß͵Ï ÿsÀDe9´ÍQãÈwG I•¬~Ðo‡Ïx€~©íðü\¤£GëØV4’»w^ô䯀~ýçÚÎ/ ÿ3ÀÄXqh›óêËÑß7HRåêÞ~^ø|è·æI¯ãó^µ®Ïïì½jäQáÐ6GÓ¿Ú$Iêo¯þIø|軩-rïG—EØÊU<úÃܹê¨Ü:ý³¹qÈÛrZ¾uük˜üYmsÔ{èæèï-$©Rõ¼ifžïƒP?à >aMY÷¦SrëÜe¹qôûrm‡„ÿ7€4ms±â™¾Q’¤>×<ñïãç;Àu®84zÔ–ô½j/ ÿoiÚæúQí’¤¾UÔò+?@åÕvüo¹¨?=rG«N#÷îþNn_ºwn®þH®ïõËÞ«@®‡¶9h~ã“Ñß’HR¥j_¼{øl†ÖéŸËc[Ñ˽nÈ+È­S>•ë¾1§e[…ÿ7€4@msоl¿èoS$©RÕ÷þÕðÙ0˶ʽ‡Ç!ïU€ ‡¶¹èÞ~~ô÷-’T™ºw|;|® Só¸¿ÎU«h®ýÏ÷ª­Ù&×V¾*üë i8´ÍA‘Œþ^F’*Ssõ‡Ãç:À°M¥J[¯“{\Ÿ;W•›'"×÷yO€É sh›ÃKl%Iý©h<–Ó¶OŸíÃV?èÍ9E.˯€v®[•[§67y[NËŸþõ€Tm›ÑøÊ;£¿×‘¤ÊÔ¾dÏð¹¥sÝñyÔ*ÖÞû³ïUÛñ…á_'H%æÐ¶¹/Щÿýý$U¦ú>ÿ#|®D™~Yî4Gæ½j3¿:_HâжíËûfH’ªT÷®‹Ãg:@´öÅ+‡þ^µé_­ðïU€ÉÁshÛŒéOÇ“$-¾æIŸéÑj;¼ õGû;`‹"÷º9w®újnö™™÷Á¥å[‡ÿß i 9´mF‘èï7B’4Žu[3ËeôL­3¿Ðç÷ªù>ÒˆphÛ„ÚöÏíÓ†)Iã]÷¦o„Ït€‘±ì©¹÷È­sšŸEë ïU€ÉòphÛ„úA¿=àÕS’Æ£æñŸé£¤yüßü×aé½jËΡmš«?2ümT’ªV+åÚŠg…Ït€‘2µ$w®_“;WóäQíà·æ´üiñÿ{y1Ú6¡}þvÑë©$•¾Î '„Ïs€4m›Ð¹îøèýT’J_sÍ߆Ïs€4m›Ð»ïêèýT’Ê]¯ëÓð€<.Ú6fjÉÌ{…$I ¯{Ç·ãç9Àäp8´mDm×—Gï§’TúZg~1|ž¤!qhۈơïˆÞO%©ôÕ÷þÕðy†Ä¡m#š'|4z?•¤RWüäÇá³ ‘CÛF´Ï[½£JR©ë|ÿððY†È¡m#:W½£JR©k®ú`ø,HCäжÝ;/ŒÞQ%©¼E®íôâðY†È¡m#¦ß-$IZà ; IDATX½û¯ ŸãiÈÚ6dùÓr.zÑ{ª$•¶öåÄÏr€ÉárhÛ€ú^¿½£JR©k®Ù&|–¤!shÛ€Æá½£JR©«íþÊðY†Ì¡mškþ6zG•¤ÒV¬½'|ޤmü¢|9zO•¤ÒÖ¹~uøHÚ6 }Ù¾Ñ{ª$•¶ÖY_ Ÿã)€CÛto81zO•¤ÒÖ8â]ás phÛ€Þ.‹ÞS%©œE®íøÂð98´m@ñ“E¯ª’TÊŠGoŸá)ˆCÛú¦¶È¹×‰ÞU%©”ù  1‡¶õÔv~iôž*I¥­uÎTøHAÚÖS?à Ñ{ª$•¶æq>ÇR‡¶õ4Žyôž*I¥­¾ÏëÂç8@ âжþ䔊ÞS%©œõ:9-ß:|ޤ mëiŸ¿]ôª*I¥¬÷àMá3 rh[Oçû‡G朗Tʺ7œ>ÃR ‡¶õtpfô®*I¥¬}áÎá3 rh[Oïþë¢wUI*eÍ“?>ÃR ‡¶õµ‡¢wUI*e#ÿ(|†¤@mëšÚ"碽«JR)«ïùÚø90Ç¡mµ_½§JR9+z9-ß:|ޤ@më˜þi IÒü+~ò£ð‚9´­£~ÐoG朗Tʺw^>ÃR0‡¶u4ŽzOô®*I¥¬síqá3 sh[Gsõ‡£wUI*eíKö Ÿá)˜CÛº_ŒÓ>½«JR)kõ¥ð‚9´­ûÅ8wYô®*I¥¬yÂGÃg8@ æÐ¶Žö¥{G朗TÊG¾;|†¤`mëè\}tô®*I¥¬¾ßëÃg8@ æÐ¶ŽîͧE朗TÊj;¿4|†¤`mëèÝýè]U’JYZöÔð‚9´­£÷Ð-Ñ»ª$•®¢õDøüH#À¡mEí¡è}U’JWñøÝáó ‡¶ŸšZ’s¯½¯JRéêÝmü ˜ŒçÐ6«¶ýó¢wUI*eÝ;.Ÿái8´ÍªíþÊè]U’JY÷¦o„Ïp€4ÚfÕ÷ùÑ»ª$•²Î•G†Ïp€4ÚfÕ|Sô®*I¥¬}Ù¾á3 ‡¶YÃ~/zW•¤RÖ¾p—ð¾¤àÐ6«qÔ{¢wUI*eíó–‡Ïp€4Úf5û«è]U’JYë¬/…Ïp€4Úf5W$zW•¤RÖ:í3á3 ‡¶YÍ“?½«JR)kžô±ðF€CÛO¿g|>zW•¤RÖ\õ¡ðF€CÛz_IÒüj|í/Âg8@m³Úço½«JR)ký¾ðF€CÛ¬öÅ+£wUI*e£þ8|†¤àÐ6«}ùÑ»ª$•²Æ>ÃÒph›Õ¹òÈè]U’JYãðߟái8´Íê\·*zW•¤RÖ8ì÷Âg8@m³º7Ÿ½«JR)kúöðF€CÛ¬îíçE朗TÊê¿5|†¤àÐ6«w÷¥Ñ»ª$•²úAoŸái8´Íêýø»Ñ»ª$•2‡6€‰m³z÷\½«JR)«ò;á3 ‡¶Y½{¯ŒÞU%©”5}Gø H#À¡mVï¾k¢wUI*e¯ü¯ðF€CÛ¬Þý×E朗TÊG¼+|†¤àÐ6«÷À Ñ»ª$•²Æ‘ïŸái8´Íê=xSô®*I¥¬qô{Ãg8@m³zÿ zW•¤RÖ8æýá3 ‡¶Y½Gn‹ÞU%©”5¿ö—á3 ‡¶YÅ£·G朗TÊšÇ |†¤àÐ6«xü®è]U’JYóÄ¿Ÿái8´Í*~ò£è]U’JYë”O…Ïp€4Úfkï‰ÞU%©”µÎüBø H#À¡mVñÄ}Ñ»ª$•²ÖÙÿ>ÃÒph›U¤£wUI*eíó· Ÿái8´Í*jG朗TÊÚï>ÃÒph›UÔ‰ÞU%©”µ/ß?|†¤àÐ6«¨=½«JR)ë|ÿ+á3 ‡¶Y>uT’VçÚ¯‡Ïp€4Úfß½«JR)ëÞrzø H#À¡mVï‘Û¢wUI*eÝ;/ Ÿái8´Íê=xSô®*I¥¬wß5á3 ‡¶Y½û¯‹ÞU%©”Þ>ÃÒph›Õ»÷Êè]U’JYQ{8|†¤àÐ6«÷£Ë£wUI*gÝvø H#À¡mV÷®‹£WUI*miÛ§‡Ïq€Ì¡mV÷öó£÷TI*mµ_>ÇR0‡¶YÝÛ¾½§JRi«ïùÚð9‚9´ÍêÞrzôž*I¥­~àÃç8@ æÐ6«{ãÉÑ{ª$•¶Æ‘ïŸã)˜CÛ¬Îõk¢÷TI*mÍU Ÿã)˜C۬εÇEï©’TÚZ§~:|ޤ`m³:W}5zO•¤ÒÖ:wYøHÁÚfu®8,zO•¤ÒÖ¾tïð9‚9´Íj_¶_ôž*I¥­sõÑás sh›Õ¾p—è=U’J[÷–3Âç8@ æÐöÓ/ĹK£÷TI*m½]>ÇR0‡¶Ÿ~!ÎüBôž*I¥­÷È­ás sh›Õ<ùÑ{ª$•¶¢þHøHÁÚf5W$zO•¤òV9-Û*|–¤@m³Çþyôš*I¥®¶ËËÂg9@ äÐ6«qÄF晴TêêûÿÏðY9´ÍªüÖèU’J]ã¨?Ÿå)CÛ¬ú~¯ÞQ%©Ô5Oøhø,HÚfÕ÷xMôŽ*I¥®uÖ¿…Ïr€Hm³j;¿$zG•¤R×¾xeø,HÚfÕV<+zG•¤R×¹ú˜ðY9´ýÔÔ9Eôž*I¥­{ÛÙñ³`2ŽCÛ:r»½§JRiëÝmøHÚÖQ¤¢÷TI*mÓ34zޤ@më(ýaôž*Iå­èå´tËðY‚8´­£wßÕÑkª$•ºÚn¿>ËR‡¶uto??zG•¤RW?èÍá³ qh[G熢wTI*uͯýeø,HAÚÖѹâ°èU’J]ë´Ï„Ïr€Ä¡mí‹vÞQ%©Ôµ/Ü9|–¤ møbH’Vçê£Ãg9@ âÐ¶Žæ7>½£JR©ëÞ~^ø,HAÚÖÑüúÿ‰ÞQ%©Ôõº%|–¤ mëhñ‡Ñ;ª$•»V Ÿå)ˆCÛ:ê¼!zE•¤ÒWÛþ¹áó ph[Gmå«£÷SI*}õ½5|ž¤më¨mÿ¼èýT’J_ãÈ? Ÿç)€CÛº¦¶È¹×ÞQ%©Ô5Oúxü<˜>‡¶õõG¢wTI*uíóW„Ïr€À¡m=½GnÞQ%©Ôu®:*|–¤mëéýø»Ñ;ª$•ºîíç‡Ïr€À¡m=Ý[¿½£JR©+½=|–¤mëé\óµèU’Ê]·ÓÒ§„Ïs€4dmëi_ºWôŠ*I¥¯¶ëχÏs€4dmù‚H’^ã·…Ïs€4dmëižøÑû©$•¾æª†Ïs€4dmëiýÞèýT’J_ë[_ŸçiÈÚÖS?ðÑû©$•¾öå„Ïs€4dmë©íö Ñû©$•¾î-§‡Ïs€4dmë[¾uÎE½£JR©ë=xcü<˜.‡¶ (êF晴Tî:œ¦–„Ïs€4DmÐ{ð¦èU’J_m——…Ïs€arhÛ€îߎÞO%©ô5}{ø<HCäжëŽÞO%©ô5×l>ÏÒ9´m@û;ûDï§’TúZç. ŸçiˆÚ6ôE9û?¢÷SI*}+ ŸçiˆÚ6 yÒÇ¢÷SI*}Ý;/ ŸçiˆÚ6 qôû¢÷SI*}ÅO~>ÏÒ9´m@ýÀ7Eï§’TþŠ"§mŸ>ÓÒ8´m@m·WD¯§’T‰ê{ÿjøLHCâж!Ë·žùI IÒâjýÞø™09mQÓÒ8´mD}×D漣T‰Z§~:|¦¤!phÛ˜å[ç\Ñû©$•¾ö¥{ÇÏt€ÉÁshÛ„"=½ŸJRéëÞrFø<HCàж ½{¾½ŸJRéë=rkø<HCàж Ý›¾½ŸJRùëurZ¶UøLHæÐ¶ íË÷^O%©Õ÷|møLHæÐ6‡/Ž$iq5¾ú'á3 ˜CÛ&4×l½›JR%jþ¹ð™Ì¡m_ygôn*I•¨}Ù~á3 ˜CÛ&Ô÷ø¥èÝT’*Q÷¶³Ãg:@0‡¶MYöÔœ‹^ô~*I¥¯xüîø™09Xm›QüäGÑû©$•¿¢ÈµÏ Ÿéi€Ú6£{ç…Ñë©$U¢ú¿>ÓÒ9´mF窯F漣T‰š«>>ÓÒ9´mFû¼m£wSIªDíó–‡Ït€4@m›Ñ<áï¢wSIªDk¿>ÓÒ9´mFã°ß‹ÞM%©õî»:|¦¤rhÛŒÚn¯ˆÞM%©µë9Mm>×Ò€8´mÎÒ§äÜmE¯§’T‰j»¿2~®L†CÛô¹-z7•¤JÔ8êÃg:@‡¶9èÞvvôn*I•¨uúçÂg:@‡¶9è\qhôn*I•¨}ùá3 ˆCÛ\¾Hgÿ{ôn*I•¨{ûyá3 ˆCÛ4W}0z7•¤JT¬½7|¦¤qh›ƒúÁo‰ÞM%©2Õ¶^ø\HàÐ6µ_½—JReªüÖð¹À¡m.¦–äÜ®E漣T‰š'}<~®LöŸCÛõ¸>z7•¤JÔ¾dð™À¡mŽº7ž½›JR%êþàÌð™À¡mŽÚí½›JR%*¿;|¦¤ph›£æÉŸˆÞM%©E®mÿÜð¹úÌ¡mŽ_ù_Ñ«©$U¦úAoŸë©ÏÚæ¨¶ëÏG勒T™š'þ}ø\H}æÐ6WSKrn¥èÝT’*Ñô{/Ãç:Àd9´ÍCï¾k¢wSIªDÝ[NŸé©ÏÚæ¡sýšèÝT’*QñØá3 õ™CÛ<´/Ø)z7•¤ê|òèvÏŸë©Úæ¡yâ?D¯¦’T™ê¾)|®¤>rh›‡Æ¡ïˆÞK%©25Oøhø\H}äÐ6µ_½—JRej_¸Kø\H}äÐ6OEsmôn*I•¨{óiá3 õ‘CÛ<õî½2z7•¤JT<~wøLH}äÐ6OëŽÞM%©2Õvx~ø\H}âÐ6Oíoo½—JRejö»ás õ‰CÛ×Ò"9´-PçÊ#£÷RIªLÍ“>>×Ò"9´-ô wÖ—¢÷RIªLíK÷ Ÿëi‘Ú¨qÌû£÷RIªLÝž>×Ò"9´-P}Ï×F勒T™ŠÚÃás -’CÛB-}JÎfôn*I•©¶ËËâg;ÀäÂ9´-Bïë£÷RIªL#ß>×Ò"8´-BçúÕÑ{©$U¦Ö7ÿ5|®¤Eph[„öù+¢÷RIªL«¾>×Ò"8´-BóøD勒T™z÷]>×Ò"8´-B}ß_‹ÞK%©:u[9-{jølH äж˶šY %Iýiú0Âg;ÀäÂ8´-Rïþë¢÷RIªLÍU ŸëiÚ©síqÑ{©$U¦ö;…Ïu€´@m‹ýžýÑ{©$U¦îͧ…Ïu€´@m‹Ô8öÏ¢÷RIªLÅãw‡Ïu€´@m‹Tßã5Ñ{©$UªÚŽ/ ŸíiÚkj‹œ[)z/•¤ÊÔ8ìwãg;Àäü9´õAïÇßÞK%©2µNýtø\H àÐÖï½—JReê|ïàð¹À¡­_Ä3¿½—JReêÝýð¹À¡­GþQô^*I•©h=1óþËèÙæÉ¡­j»¾×Ò<9´õIûòý£÷RIªLÝž>×Ò<9´õë yʧ¢÷RIªLEýÑœ¦–„Ïv€4m}Ò8ôíÑ{©$UªÚî¯ ŸíiÚú¤¶Ýsr.Šè½T’*Sãk>ÛÒ<8´õQñèíÑ{©$U¦öù+Âç:@š‡¶>êÞxRô^*I•©{óiás ̓C[µÏ[½—JRe*ÖÞ>×Ò<8´õÑôû„$Iý«¶óKÃg;@š#‡¶>ª­|uôN*I•ªqÔ{Âg;@š#‡¶~šZ’‹æO¢÷RIªL­³ÿ#~¶LÎC[Ÿuïº$z/•¤ÊÔ¹~Mø\HsäÐÖgíˈÞK%©2Þ>×Ò9´õYóÿ_ô^*IÕ©(rm‡„Ïv€4m}V?ø-Ñk©$UªÆá¿>ÛÒ8´õÛŠgæ\ô¢÷RIªL­3¿?Û&7Ï¡mzÿ z/•¤ÊÔ¹ú˜ð¹æÀ¡m:ׯŽÞK%©2õ¼1|®¤9phÄõœ©è½T’ªSÑ˵Ï Ÿíi3Ú qÌû£×RIªTõC~'|¶¤Íph€Ú“JR¥júÏá³ m†CÛ L-ÉEý‘è½T’*SçŠÃâg;Àä¦9´ H÷‡çF勒T™z÷^>×Òf8´ HûâÝ£÷RIªNÝVNË·ŸíiÚ¤¹úÃÑk©$Uªú¿>ÛÒ&8´ H}Ÿ×E裸T©š'}<|¶¤Mph”¥Oɹ•¢÷RIªLíË÷Ÿí“çÐ6@½»¿½—JReêÝ}iø\H›àÐ6@íˈÞK%©:µk3?-=ÛÒF8´ PóäŒ^K%©RM¿ÿ2z¶¤ph úoŒÞI%©R5W$|¶¤ph¤å[çÜmG勒T™Ú¯ŒŸí“æÐ6`½û®‰ÞK%©2uo?/|®¤ph°Î•GF勒T™ŠÆã9M- ŸíiÚý>ýsÑ{©$UªÚÊW‡Ïv€´mÖ8ôÑ;©$Uªæq>ÛÒ8´ Xm»çä\Ñ{©$U¦ö;†Ïv€´mCÐ{äÖè½T’*S÷¶³Ãç:@Ú‡¶!è\w|ô^*I•É"iD9´ ã‹|Ö—¢÷RIªTõ=_>ÛÒzÚ† qÄ»¢wRIªTÍU Ÿíi=mCPÛþ¹>A’úXû’=Ãg;@ZCÛø@Iê_Ý».Ÿëi=mCÒ¹ö¸è½T’ªS»–ÓÒ-Ãg;@Z‡CÛ°¾Ðßü—èµT’*U}¿×‡Ïv€´‡¶!i|åÑ;©$UªæI ŸíimCRÛîÙ9½è½T’*Sç»…Ïv€´‡¶!ê=xSô^*I•©wÏ÷Ãç:@Z‡CÛu®>:z/•¤êÔmç´íÓÃg;@šåÐ6Ì/öŸ^K%©RÕzsølH³Ú†¨qèÛ£wRIªT­S?>ÛÒ,‡¶aÚö9÷:Ñ{©$U¦ÎUGÅÏv€É'9´ Yïþë¢÷RIªL½o Ÿëi–CÛu®<"z/•¤êTôrm»ç„Ïv€äÐð?õÓÑk©$UªÆWÞ>Û’CÛðÕ~KôN*I•ªõÍ ŸíÉ¡-Àò§åÜmG勒T™:×­ŠŸí“m!z÷^½—JRe*»#|®$‡¶+ÞK%©RÕvzqølh9´ _óŸŒÞI%©R5ŽzOølh9´ _ýÀ7F裸T©Zç. Ÿí-‡¶Ëžšs§½—JReêÞ|jülÆ^Ë¡-FïÇß‹ÞK%©2éð¹Ðrh‹ÑùîÑ{©$UªÚn¿>Û€ñæÐ¤yÒÇ£wRIªTͯýeølÆ›C[úþ¿½“JR¥j_°SølÆ›C[”¥[æÜ®G勒T™º?<'~¶yœ9´êÝýè½T’*SÑx<§©-Âg;01¶Úµ/Û7z/•¤JUßë—Ãg;01¶Ú5Oø»èT’*Usõ‡Ãg;01¶ÚÕ÷ýµèT’*UûÒ½Âg;01¶Ú"Mm‘‹ÖÑ{©$U¦î]—ÄÏv +‡¶`Ý;/ŠÞK%©:µë9-Û*|¶cÉ¡-Xû’=£×RIªTõý~#|¶cÉ¡-XsõG¢wRIªTÍ“>>Û€‰±äЬ¾÷¯D裸T©:ß;8|¶cÉ¡-ÚÔ’\ÔÞK%©2õî½2~¶y9´€îmߊÞK%©:uÛ9mûôðÙLŒ‡¶ÐþööÑk©$UªúÁo ŸíÀÄØqhcÞ½“JR¥jþÙðÙLŒ‡¶PÛéÅÑ;©$UªÎ5džÏv`bì8´ˆâñ»¢÷RIªL½Gn ŸëÀÄØqhëVE勒T©j;¿$|¶cÅ¡mD´¾ù/Ñ;©$UªÆ1>Û€‰±âÐ6"‡ýnôN*I•jú£g;01VÚFŶÏȹ׉ÞK%©2uxNülò8qh!½û®ŽÞK%©2͵9-}Jøl&ƆCÛé|ïè½T’*U}ß_ŸíÀÄØph!Í“>½“JR¥jžü᳘m#¤¾ßë£wRIªT+ ŸíÀÄØph%KŸ’‹ÖÑ{©$U¦Þ×ÇÏv ‡¶Ó½ãÛÑ{©$U§¢ÈµíŸ>Û€‰±àÐ6bÚí½–JR¥jñ®ðÙLŒ‡¶Ó<wRIªT­s&Ãg;01ÚFLm·WD裸T©º7Ÿ>Û€‰±àÐ6‚е÷D勒T™ŠÚÃ9M- ŸíÀDå9´ î'G勒T©ê{üRøl&*Ï¡mµÎþ÷èT’*UsõGÂg;0Qym#húò$Iý«}پ᳘¨<‡¶TÛþ¹9½è½T’*SïÇß ŸíÀDå9´¨Þƒ7F勒Tºíœ¶}Føl&*Í¡mDu®<2z-•¤JÕ8ôí᳘¨4‡¶Õ:åSÑ;©$UªÖ7ÿ%|¶•æÐ6¢ê¾1z'•¤JÕ¹~uøl&*Í¡mT-Û*çv=z/•¤ÊT<~wülr•9´°ÞÝ—F勒T©j»¾<|¶•åÐ6ÂڗJR¥j÷W᳘¨,‡¶Ö\õ¡èT’*Uû¢]Ãg;0QYm#¬¾Çk¢wRIªTÝ;/ ŸíÀDe9´²©%¹¨=½—JRuj×g>l&|¾¹ŠÚF\÷–3¢×RIªTõÞ>Û€‰Jrhqíó–G裸T©Z§þsøl&*É¡mÄ5¾ú'Ñ;©$UªÎU_ ŸíÀD%ý?öî<Ú²»,ð÷© †AB··Š IDATF1Ò¨ Ò ÊQl…vDDDl¤ih@Àeß[UIUæ$dNÈ@ÈHÈœ‘L’‰Œd óœªÌ©½Ï¼÷÷·Î ª’Ôpî}÷ð#|¶K’$Iê4.‹¶:´ô)Ñ÷¥QöKÙìFñó]’$IRjRm5©¸÷òèûR€Féîñ†ðÙ.I’$©Ó¨,ÚjÒð’½£ïI¥Ü?„ÏvI’$IFeÑV“ú_ÿûè{R€F]¶_øl—$I’ÔiTm5©»û/Fß“4JqÿÕá³]’$IR§QY´Õ¥ÙE©ì=}_ Ðe‘òå[ÄÏwI’$I©)Y´Õ¨ñ­gEß–4JïÐw‡ÏvI’$IÆdÑV£†çm}O Ð(Ãs—…ÏvI’$IÆdÑV£z‡¿7úž QÆ·>Û%I’$u“E[ÊwxUô=)@³ »)[ò#áó]’$IR§Y´Õ¬ò±»¢oK¥»Ï¯‡ÏvI’$IFdÑV³F×}O Ð(ƒÓ>>Û%I’$u‘E[Íœñùè{R€F™üFôl—$I’ÔiDm5«wàïDß“4J¹êðÙ.I’$©Óˆ,ÚêÖÖ/N©Eß—4Jwן‹Ÿï’$I’Rݳh«aÅ×Dß“4JÿØ¿ Ÿí’$I’:µÏ¢­†.? úž QF—í>Û%I’$ujŸE[ ëŸðñè{R€F)V\>Û%I’$ujŸE[ ëîù¦è{R€f)Ë”oóãáó]’$IR§ÖY´Õ±Å§4È¢oK¥wØÇÏwI’$I©ÎY´Õ´ñçGß“4Êð[Û†ÏvI’$IZgÑVÓ†ì}O Ð(“Àˆží’$I’:µÎ¢­¦õzô=)@³Œú)[ºYø|—$I’Ô©mm5-ßùg¢oI§»ßÛÂç»$I’¤Nm³h«qå÷Eß“4Êàô Ÿí’$I’:µÍ¢­Æo8)úž QÆ×>Û%I’$uj›E[œ5}O Ð(eþ`Êf…ÏwI’$IZfÑVãzÿAô=)@ãtw{}ø|—$I’Ô©em5._þÒ”Ê"úž QúÇ}4|¾K’$IêÔ2‹¶šW}K Ð8½~+|¾K’$IêÔ*‹¶”ï²eôý(@ã ¾ùïáó]’$IR§VY´5¤2[}O Ð(ãOŸí’$I’:µÊ¢­!o<%úž QÊî#)›Ý(|¾K’$IêÔ&‹¶†48{qô=)@ãt÷xCø|—$I’Ô©Mm ©wÈ»¢ïG§Â?†ÏwI’$IÚdÑÖòå[¤T–Ñ÷¤2úÎ!áó]’$IR§6Y´5¨âÁ£ïI¥xø–ðÙ.I’$©S›,ÚÔèʯDß“4N¾ÓkÂç»$I’¤N-²hkPƒ“?}? Ð8ý¯}(|¾K’$IêÔ"‹¶ÕÝç-Ñ÷£3ºlÿðù.I’$©S‹,ÚšÔ’MSv£ïI¥xð¦øù.I’$)Õ!‹¶†UÜuqô=)@ãä;üdø|—$I’Ô©|m kxñnÑ÷£Ó?æƒáó]’$IR§òY´5¬ÉÍ Ó5ºtßðù.I’$©Sù,ÚV¾Ë–Ñ÷£S¬¼!|¾K’$IêT>‹¶Vf+¢ïIÇsÚ$I’$eÏ“E[ßxJôý(@ãôþ@ø|—$I’Ô©tm lpÖlôý(@ã /Ù;|¾K’$IêT:‹¶Ö;ä£ïG§XñÝðù.I’$©Sé,ÚX¾|‹”Ê2úž YÊ2åÛ¿2|ÆK’$IêT6‹¶†Vo‰¾hæsÚ¶{EøŒ—$I’æµÅ§îoHýc?œ†ï–Æw\Ò¨¿ÚÛãñmçÄÿ¬3ÕÊ¢­©-Ù4¥a7à. ÙúGüEüŒ—$I’¦X¾Ã«Rï°?Iƒ³—¤ñ '¥²ûÈZ½7.îº8ügÏ*–E[ƒ›¼à˜®áÅ»‡ÏwI’$i}Ë—mžzû¿ýÉ€^{L*WÝ¿Þï‹û® ÿódË¢­Á /úâo-˜(î¿*|¾K’$Iký\µÉG@OøøSÏUKe1½÷Æ+oˆÿ3ÎT+‹¶×?æƒS»xxÚsÚ¶}YøŒ—$I’~¸|—-Ÿ÷¹jS}küèáæ¬bY´5ü`úz‡¿7|ÆK’$©Ý­þ\µ‡ü}q¹ê𿇬bY´5¼2[±à@ÓM>š=ß%I’Ôžòe/ùÁsÕ®<4•Þžª ì?þw“U,‹¶†7¾ñ”èë qŠû¾>ß%I’ÔÐæù¹jS5Äÿ}ÍT+‹¶†78k6ú²hž²Hù6?>ã%I’ÔÄçªõRd‹7ÿ;Ì*”E[Ãëò‡Ñ×@#õ¾úgá3^’$I5®ZþPª»lë‡ÿ½fÊ¢­áåË·¨î¯˜ÔØðÂ]Âg¼$I’jô\µGnKM”oû²ð¿ë¬BY´µ âÁ£¯;€Æ)î½<|¾K’$©"-ÞäÉçªûá4ºl¿j?WmÊò*þï¦:Y´µ Ñ•_‰¾îš§ÏýÖpôŒ—$IRÌG@ûG½¿¶ÏU›¦î®¯ ÿï‘U(‹¶48ùSÑ×@#õûãð/I’¤ù­‰ÏU›¦î—~9ü¿QV¡,ÚZPwŸ·D_w4¼`§ð/I’¤é•/Û<õú½4øæ¿§ñwKåã÷D¿å¬¼î¾¿þß-«Pmmhɦ) »Ñ×@ã÷\?ã%I’´ÁÏU›|tò Þ¶ç%I’¦Òâ=WµÒÿúGâ_¯3ÕÉ¢­eu÷yKô5ÐX“7£Ñs^’$i}ò\5ÖWÿ¸ýfÊ¢­m-Ù4¥a7ú:h¤Á)ŸŽŸó’$IÏ“çª1Mýþ1ü5U(‹¶VÜuqôuÐHãN Ÿñ’$IÏh«¥Þ¿•§}.®92•Üý–‰†œô¿ã_ç3ÕÉ¢­… /úbôuÐHeï±¹ç™DÏyI’ÔÒÖô\µQ?ú- ×?ñÅ¿ögª“E[ ëý×Ñ×!@cu÷}køœ—$Ií(ßùµ©Ô_¥á…;§ñç§4颧 ÑB>:ÚyFm-ÆÌÁ™ÿ>ç%IRóÊ·}Yêúî48{qßx²çªQ¾ ¡óŒ,ÚZZùĽÑ×"@#o;7|ÆK’¤š·dÓ'?zÂÇÓèÊCS±âº”Ê2úm¬Qÿ뉿ffª“E[K÷¸èk ™Æƒ”oý£ás^’$Õ$ÏU£æ&¯Ýðëh¦:Y´µ´ÁŸ¾«w؇ÏyI’TÍò^•z‡ýIœ½$o8)•ÝG¢ßºÀéó7á×UV¡,ÚZZïÀwD_‹5ù×èè9/I’âË—mžzû¿= NýL]{L*WÝý6¦®ô¯µ¬BY´µµ­^˜Òx}=4R±òúø9/I’*ð\µ"úm Ì»þQï¿þfª“E[‹+î½"úzh¬|§×„ÏyI’4å»lùCÏUëE¿ý€ý#þ"üzÌ*”E[‹~{Ïèë ±úÇÿÏð9/I’æë¹jG¿Õ€ÊèþÞðk4«Pm-nò¯/ÌÑ5G…ÏyI’´îåË^òƒçª]yh*¹-úmTZï«~ÝfÊ¢­Åuw}]ôõÐXeþPÊf7 Ÿõ’$é9Z¼É“ÏU;öÃitÙ~ž«ë¡÷•?Š¿–gª“E[››]”Êleô5 ÐXÝ}Þ?ë%IÒ3>:yp»çªÁôô}wøµU(‹¶–7¾ñäèk ±gþGøœ—$©­­ö\µü¡è·ÐH½ƒÿ üzÏ*”E[Ëœù£¯I€Æßvnøœ—$©ÏU»5úm´Fï ß ŸY…²hky½ƒ~?úšh®ñ å[ÿhø¬—$©Q-ù‘ÔÝ÷7ÒàäOÍ-ÕŠ•×{®êø;ñsa¦:Y´µ¼É¿ü¤b}]4Öä#+ѳ^’¤F=WmØ>Þ§éîûÖð9‘U(‹6¥âþ«£¯K€Æþçás^’¤º”ïð“©wø{Òð¼mÒø–3SÙ{,ú(žGwÏ7…ÏŽ¬BY´iîk¬˜ÅCß Ÿó’$U±Éãžþ\µbÅuÑÇ6°º»½>|ždÊ¢M©ÜG£¯K€Fëîúsá³^’¤Ðo’º{¼!õýðÜG@‹{/÷\5hˆ|§×ÄϘ™êdѦÔÝý£¯K€F›<¬9zÖK’´ÐÏU›<§txþöž« —o÷òð™“U(‹6¥lvQ*»G_›5¾ñ”øY/IÒ<•/ß"õ~gœ½$o8)•ùƒÑG/°€&_²=‡² eѦ¹ÆßûFôµ Ð\Ãnʶzaø¬—$iCó\5à‡eK6 ŸMY…²hÓ“/„³—D_›Ö;äÃg½$Iü\µb}¤URŒãgÕLµ²hÓ\½CÞ}y4Úð¢]Ãg½$Iëö\µ<úø*®¬ Ÿ]YŲhÓSÏUð­?ó§XyCø¬—$éYŸ«–­Œ>*š<“1zžeË¢MOU¬¼>úh´|—-Ãg½$©…mýâÕŸ«V–ÑÇ"ÐåãwÇϸ™jeѦ§]qPô5 Ðhý?>ë%I oñÆÏx®ÚÜG@ǃè#h¨â¡ïÅϽ™jeѦ§êŸðñèk ÑÆ7œ>ë%IÍ|®ÚÜG@o9ÓsÕ€Ur[ô°šñçÇÏË™jeѦg4¾å›Ñ×)@£ /Ü9|ÖK’*ÖâMRwÏ7¥þ ÿ˜F—Šû¯N©EYÏk|Ó©ñ3t¦ZY´é ÏY}4Zñàá³^’T±çª ²èã `½Œ®>"|¦fË¢MϨwðD_§×ýâ Ÿ÷’¤ çª­z ú˜šÑ¥û†ÏÙ¬bY´éå[ÿ¨_S˜gƒÓ>>ï%IóÐ’MSwï7§Á©ŸI£+MÅŠëR*Ëèc`Þ Ïß!~öÎT+‹6­Vqß•Ñ×*@£o=+|ÖK’6°Å§îoHýc?œ†ï–Æw\Ò¨}Ä,¨ÁY3ñóx¦ZY´iµ†ßÞ3úZh¶ñ0åË·Ÿ÷’¤õ|®Úä# ÝG¢O€pƒS>>Ÿ³ŠeѦÕêóÁèk ñúG½?|ÞK’Ö\¾ló'Ÿ«6ùèµÇx®À³èý#á3;«XmZ­|§×D_«7yvOô¼—$­Þ䣠¬Þ>·³ŠeѦ5V>vWôõ Ðhe¶rîù>Ñó^’ô̧ÿ[ôP½ƒ~/|ngË¢MkltÍQÑ×+@ãu÷ÿÍðy/IzfÃó¶‰>j£»Ï[ÂçvV±,Ú´Æ&4`~Mnæ¢ç½$é™ /Ù+úx¨în¯ŸÛYŲhÓëîýkÑ×+@ã÷_>ï%IÏltõáÑÇ@mäÛ¿2|ngË¢MknñÆ©ì?}Í4^¾ókãg¾$驯7}4ÔF¶Õ ÃçvV±,Úô¬o=+úšh¼ÁIŸ Ÿ÷’¤4¾ó¢è£ ÆÃð™U0‹6=kÃs¶Š¾lo|óáó^’ôƒŠß>j¡Ì ŸÙY³hÓ³Ö;ä]Ñ×-@ó‡)_¾EøÌ—$=Y™?}2ÔBñàMá3;«`mzÖòe›§TŒ£¯]€ÆëóÁð™/Izò9ÅÞÿ¬ÉGíÃçöLõ²hÓs6ùF<æ×蚣Âç½$©“òí^}$ÔÆø†ÃçvVÁ,Úôœ /Ù;úÚh¼r°*eK7 Ÿù’Ôöº{¼1úH¨Ñå†Ïí¬‚Y´é9ëíCÑ×.@+ô}wøÌ—¤¶×ûò>jcxþöás;«`mzÎò_}í´ÂèÒ}Âg¾$µ½þQï>jcpú¿…Ïí¬‚Y´éy+¿'úúh¼ò‰{S6»QøÌ—¤678éGµÑ?î£ás;«`mzÞF×}ý´Bwß·†Ï|IjsÃs—EµÑ;ìOÂçvVÁ,Úô¼ Nýlôõ Ð Ãom>ó%©Í®8(ú(¨î~ÿ_øÜÎ*˜E›ž·î>o‰¾~Z¡Xy}øÌ—¤67¾ùŒè£ 6º»¾.|ngÌ¢MÏßâMRdÑ×0@+twûùø¹/I-­xàÚèc 6òm~,|ngÌ¢MkÕø¶s¢¯a€V˜ÌÑ3_’ÚZÙ{4ú¨‡ñ0e³‹ÂçvVÁ,Ú´Vy0,ÀÂ(î½<|æKR+ÛêEÑG@m”«îŸÛ3ÕÌ¢MkUïÐwG_Ç­‘ï²eøÜ—¤¶ÕýâÿµQqoôä¨Þ¿>·³ŠfѦujxÉ^Ñ×3@k NúdøÜ—¤V´t3ŸÜXù.[ÆÏî™jfѦujòë¡,Œñmç„Ï}IjCÝÝ~>zäÔJ¶Õ ÃgwVÑ,Ú´Nå;¼*úzhbœòí^>û%©éõ¾úgÑ 6ÊîÃás;«pmZ犇¾}]´ÆàäO…Ï}Ijzƒ3>=îj£xàšð¹U8‹6­s£Ëˆ¾®Z÷JÒü7ºâËÑã 6Æ7Ÿ>·³ gѦu®쇣¯k€ö(Ë”ïü3á³_’šÜøÎ‹¢§=@mLþq"zng΢Më\¾ÓOG_×­2øÆ¿„Ï~IjreþPô¨¨á¹ËÂçvVá,Ú´^•Þ}m´FqÏ¥ás_’šZ¾íODy€Zœô¿ÃgwVá,Ú´^®<4úÚh•î®?>û%©‰õø­èP+½Ãß>»³ gѦõªüÿŒ¾¶Zepæÿ Ÿý’ÔÄ&¿™ÀÚëîó–ðÙU8‹6­WÝ/þ×èk U|º$ÍO£K÷ñµ’oû²ðÙU8‹6­wå÷F_ß­ÒÝãá³_’šVq×ÅÑã 6Êþás;«xmZïF×}´ÊðÜ­Ãg¿$5ªÙE©ì?=Þjç,:Ï›E›Ö;ϳXXÅ÷ÌÝFÏIjJù.[Fv€ZßpRøìÎ*žE›Ö»ÉG˜XXÝý3|þKRSêñÑc V†ï>»³ŠgѦ ûUûleôuÐ*£K÷‰Ÿÿ’Ôg/‰ëµ28ísá³;«xmÚ FßýzôuÐ*e÷‘”-Ý,|þKRßxJôX¨•Þáï ŸÝYųhÓ58õ³Ñ×9@ëôŽøóðù/IM¨ÌVDt€Zéîù¦ðÙU<‹6mPݽ~5ú:hñw Ÿÿ’T÷ò]~6zœÔN¾ü¥áó;«xmÚ°f7JeïÑèk ]ƃ”oû²ø3@’j\ÿèDOs€ú=¤ó;«xmÚàÆ7ž}½´NÿÄO„ÏIªsà wŽåµRÜ{EøìÎjE›6¸Áéÿ}½´ÎøÎ‹Âç¿$Õ¹ñçGr€Z]wløìÎjE›6¸î¾¿}½´OY¦î®¯ ?$©–-Þ$¥A=Éjeò›Àáó{¦úY´iÃ[¼I*ûG_ó­3Sý,Ú4f7Jeþ`ô¥Ð>ãAÊá’´Öu¿ôËÑ“ vŠû¯ŸßYM²hÓÔš|Õ/ opêgÂÏIªKƒ“?=¶jgtí1áó;«ImšZƒ“>}í´’a”¤µotÍQÑc v†ç. ŸßYM²hÓÔêîþ‹Ñ×>@ku÷~sø9 IµxÜI¶2zdÔNÿk?Ãgê‘E›¦Zùø=Ñ×?@+ /Ù+ü ¤ª×Ý÷7¢Ç5@-u÷yKø Ïj’E›¦Ú誯F_ÿ­TöMÙV/ ?$©Ê Κ‰×µ”/Û<|†g5É¢MS­üÇ¢¯€Öê÷Ñðs@’ªÜøÎ £G5@í”OÜ>¿³eѦ©–ï²eô h­âîKÂÏIªjùò-R*FÑ£ vÆ·>óeѦ©W>z{ôh-_Š Ik®äû¢G4@-.Ý'|†g5Ê¢MSotÅ—£ç@k.? ü¤*6™¬»ÁiŸ ŸáY²hÓÔëíCÑs ½YÊ—¿4ü,¤J5»Q*W==¡j©÷•?ŠŸã3õÉ¢MS/ßþ•)•eô,h­Á)Ÿ? $©Jõø­èÑ P[ùί ŸãY²hÓ¼TÜuô,h­båõ)›]~HRU^´kôh¨¥²÷˜÷•3ë–E›æ¥á…»DÏ€VëøŽð³@’ªRùÈ­Ñc –Æw\>óšeѦy©w軣ç@«®=:ü,¤*ÔÝóMÑ# ¶†—ì>dzšeѦùi«¥4êGÏ€ö*F)ßé§ãÏI nxÎVÑ ¶ú'~"|Žg5Ë¢MóÖøÖ³£g@« ¿µ]øY IÑ\=Žjkòe2Ñs<«Ymš÷1Êî#)ÛúÅáç$EÕÝãÑ£ ¾Ê2åË6ŸåYͲhÓ¼ÕÝç-Ñc õú'ücøy IQ Ïß!z ÔVùÈmás<«amš¿f7Jeþ`ôlhµbÅu¾’]R{ß‹>vWô¨­ñ 'ÆÏò™úeѦymtÝ×¢g@ëõ~gøy I ]ïË¿=~jmxî²ðYžÕ0‹6Íký>=Zo|ãÉáç$-t£ËŒ¿µÖ?ê¯ÂgyVÃ,Ú4¯å»ülôl ,Rw·×‡Ÿ ’´`-}A*{FO_€Zëîþ‹ñó|¦~Y´iÞ+¾9z>´Þè²ýÃÏIZ¨úGÿuôب·Q/e‹7 ŸçY ³hÓ¼7¼dïèÀ¨Ÿò^~&HÒB4¾íœè© PkŽW„Ïò¬¦Y´iÞëþÞèÀä¶ço~&HÒ|×ÝíçS*Ëè‘ Pk£+¾>ϳšfѦy/_ö’”ÆÃè9Ðze¢! é IDATÿñ”/ß"ü\¤ùlxá.Ñã öú'~"|žg5Í¢M Òøöó¢ç)¥ÁŸ?$iÞZò#©ÌVFZ€Úëîýæø™>SÏ,Ú´ /4b•«˜û6¾èsA’æ£þ1=fêo=JcxÑÃçzVó,Ú´ u÷ÿÍè¹ÀÓ+¯OÙâÃÏIZ¯–¾ •ß=JãE:œE›¶Å§²ûpôìàiú_ÿHüù IëÑàÔÏDP€Féîöóá³=«ymZðF×=;xšòÑÛS¶t³ðóA’Öù·Ùž¸7z„4FÙHÒÚ48ísÑ# qzý~ø|ÏE›Bœ5=CXÃs9rï$U¼|ëMåªû£G&@³£”/{IøŒÏE›BêîýkÑc€5^¼{ø!IÏÕðÜ­£G%@ã÷^>ß³†dѦ˜fy®@£ÔÝãñç„$­¡|ÇW§4Ì£'%@ãøÇÖÎÔ²hSX£Ëöž%¬ÁøÆSÂÏIZS£«‹‘Ô?ê¯Âg|Ö,ÚVïð÷DÏžEïÐw‡Ÿ’ôôº{ýªo®˜'ùŽ?>糆dѦ¸¶~qJ£^ô<` Еקlñ&ñg…$}¿ñçGF€F*½=|Æg Ê¢M¡o>=z¦ð,'}2üœ¤Iý#ß=ktõáás>kPm mpʧ£g Ï¢ÌLù¶/ ?+$µ»|ÙKRùøÝÑ# ±üãjgªY´)´|—Ÿž)<‡Ñ償’ÚÝðâÝ¢G!@£u÷ü•ðYŸ5(‹6…7yU–©»ÿo†Ÿ’ÚYwï7§TŒ£'!@c•ýÇS¶xãðyŸ5(‹6…7¼`ÇèÙÀs(î¿Ú#HZøoœŠ{/6¾é´øy?Ó¬,Ú^ï€ßŽž-<Á7þ9ü¼Ô®§ýSôèh¼Áéÿ>ﳆeѦøoœÊleô|à9”ƒU)ßé§ãÏ I­h2oÊþÑ£ ñº{ÿZøÌÏ–E›*Ñ芃¢ç Ïc|Ó©áç…¤4»QßzvôÈh¼²ûðÜÌ Ÿû3ÍÊ¢M•¨wø{¢g k¡ìß…Ÿ’šÝä£êÌ¿ÑudžÏü¬Y´©mõ”†yôœày”½ÇR¾ã«ãÏ I¬»ÇRv£G@+ NúdøÜϘE›*Óø†£ç ka|ãÉág†¤¶äGRqÿUÑ# 5º»ÿBüìo`mªLýãþ!zΰ–úÇ|0üÜÔ¬†ço=ÚZ£|âÞð¹Ÿ54‹6U¦|»W¤TŒ£ç kùð\!•4­z_þïÞ, ÑU‡…Ïþ¬¡Y´©Rï¼0zÞ°–Æ·Ÿç›ª$mpùö¯œûÍ Nÿë>ÿ³†fѦJ58ýߢç ë`pú¿†Ÿ’jÜâMÒøöoE2€ÖÉwþ™ø3`¦™Y´©Ruw}]ô¼`]Œú©»×¯†Ÿ’êÙð£§@ëß>ÿ³gѦÊU¬¼>zî°&s;ÛêEá燤zÕ?â/R*ËèÐ:£Ëö ?²gѦÊå§êgôCÂÏIõ©»ÛëSÙzGôøàûÆ·+ülÈZ’E›*]ï°?ŽžGLÁø¶sS¶t³ðsEÒü—oÿÊT”eœüÂÏIk×àÔÏÌ}ü€ŠõS¾lóðs#kYmªM“8ÐàeÛ©Ÿ ?k$=G‹7IÃoï=-XKã›N?;fÚ—E›êÓ’M= ágþGüy#iµòe/™»a >úÇ,üüÈZ˜E›jÕè²ý¢gólðÍ?o$ý |—-S±òúèÑÀº(‹”oÿÊð3$kamªU½ƒ~/z\°†ç, ?s$=ùèŸ(¨Ÿñ„Ÿ!YK³hS½šÝ(•OÜ=³X£+š{&TøÙ#µ±Å§ÁÙK|é@M Nû\üY2ÓÎ,ÚT»†ï=³X ã›Ï˜{6TôÙ#µ©|»—§ñ-ߌ¾üØ“ýGŸ'YK³hSíêîÿ›Ñ3 €TÜsiÊ·{Eøù#µ¡Þ¿íÓ5WÜweøy’µ8‹6Õ¯ÙE©|ìÎèÙÀ*¾9uw}]ü$5µÙ澈$£èË€ 48{qü¹Òâ,ÚTˆì=»X`e÷áÔÛÿíágÔ´ò_›Æ·}‰0%ÝÝ^~¶d-΢Mµ¬»÷¯EÏ." ²ÔûꟆŸCR#š]”ú'|<•ƒUÑW6SRÜ{EüùÒòmªkÅŠë¢gÊ2 Ïß~î£nÑg‘T×òí_™Æ7œ}50eƒÓÿ5üŒi{‹6ÕµÁ™ÿ7z†h|ÃI)_þÒðóHª[ý£ÞŸÊü¡èK€i+Ë”ïü3áçLÛX´©®MH*‹èQ@ båõ©»û/„ŸIRÊwzM_|ôe À<ßqAøY£ŽE›êÝøöoEÏ2‚•ý'RÿÈ¿ ?“¤Ê¶x“48õ3s× Í58é“ñgŽ’E›j]ÿøEÏ2ªòܶó¶™[(DŸMR•êø;žk ÐÅ(åÛ½"üÜQÇ¢Mõ._¶yJÃnôH "Š»/ñ•öÒä=Ò6?žF—í7·„ ùÆ7Ÿ~ö¨3—E›jßèÚc¢gU2ÈRÿÄO¤lvQø%-xK7KƒÓ>—Êî#ÑW" ¨ÜGãÏ ¥Imª}½¯þiôL ‚Æ7Ÿ‘ò_~NI Ò좹o-¾%úÒ`¡ú)_¾EüY¤4É¢Mõoñ&©ÌVD6*¨ì=šú_ûPüY%Íc½ƒ~?÷^}¹düÝãÂÏ"užÊ¢Mhøí/EÏ6*ltÍQ)ßá'ÃÏ+išu÷|ÓÜ3yh·þÑ?“Ôy*‹65¢î¾ožmT\ÙbîÙU¾™Tu¯»ÇÓèêÃS*‹èË €`eï±”mõ¢ð³I§²hSc*¼1zÆP“ó¢wð;ÃÏ-i}~ƒmtå¡)ãèË€Š˜|Ãtôù¤Î3²hScœ5=㨋²œ[XäÛ¿2üü’ž¯ÞþoOãNš{ÝÀÓu÷{[ø9¥Î3²hScÊw~­P°Î_–0÷qÒ¥/?Ǥ®wð¤ñíçE_&TT±ò†ð³JÕ²hS£ßzVô¬ †ÊÇïNý>îùmŠoéf©ì‡SqÿUÑ—78ã ñç–ÒgѦFÕ?æo¢g5V>zû÷n‡ŸijWùޝNƒ³—¤20ú2 ŠqÊwü©ðóKÕ²hS³Zú‚Tv‰yÔ\±âºÔ?êýñçšZñüµÑµÇ¤TŒ¢_öÔÈø¦SÃÏ0uÖ˜E›×ð’½¢g 1¾ó¢Ô;ü=)›Ý(ü|SsÊ·{EœúÙT¬¼>ú%@MùÁNe³hSãêîýæè™@Ôܚ§~&e[½(üœSM[ºYêö'OþöÚxý’ ÆÊîÃsçJøÙ¦´¦,ÚÔÈŠû®Œž}4ÐäùYÃó·Ÿ{žVôY§zÔÝã s¯™2[ýò !†ÿ¹Gøù¦Î³fѦF6ù­˜7£^]¶ê~é—ÂÏÅ}Ö©ó¬Y´©‘åÛ¾,¥Q?zþÐŽ—ÏýÏäì‰>ÿû›kƒ3¾Æw\ý’ ÁŠ® ?óÔyÎ,ÚÔØF×=h“a7®:,õ¾ü»)›]~jž›]”ºûüúÜÇB‹‡¾ýê %&_¦~*=Wmjl½CÞ=hó—'œ5›ò&ü<ÔÛê…sï/†ïžÊÇîŠ~™Ð6ÃnÊ·ù±øóPé¹²hSs›Ý(•Ý= h¹bÅuipöÏS©iù.[¦þ OãNš{6D]qPø¹¨ÎófѦF73ÕY«,ÚÔøÆßûFôL€çVŒç>b:ù-ªÉoSY¼ÍS‹7žûvÐÉGAGW:÷†Pýãÿgü9ª´6Y´©ñõOôL€uSŒÒøÎ‹Òð¼å©wð;-ÞÖ§ÙRw××¥þ‘ï›{”ÄøæÓSÙ<ú¿,¬³²÷Xʶ~qüÙª´6Y´©ù-ÞØ—"P{å÷Î=òÅ ½Ãþ$åÛ¿2þŒ­Hù²—Ì}ÙDÿØÏ=o|Ç©¬ŠþOS1üÏ=ÂÏZuÖ:‹6µ¢ÉM 4ÍäaýãëO˜;çúG u÷yKsûmñÆ)ßùgRïËÿ=õû‡¹ßö÷¸T>rkJeýŸæÍä±áç°ÒÚfѦV”ïøê¹á@”ùC©¸û’4ºúð¹Mö¿þ‘¹o:Íwü©”-Ý,ü\^cK6Mù¯š[öú«48ã ité¾i|Ë7SñðÍ)‡Ñ­°àÆ·ŸF+­KmjM“õR*ûOÌ-¯Š».žû8êèŠ/§á·¶KƒÓ>7÷ñËþ‘9÷l¸IÝ}ß:÷±ÌîoLù.[¦|çצ|›{f;þÔÜÿ®»ëÏ=ù»÷›ç{ÿïÿÇäÿ_ÿø¥Á™ÿ‘†î2÷EãOIÅÝßžû9<; Ö¬ô_‡ßK«³NY´©5õyWôŒ€µRf+«û›èJÏ–E›ÚÓìF©xø–èY ÏkxÞ6ñ÷ÑJëšE›ZÕàŒÏGÏJxnãá“ÏV­À}´:ë¶w°hS›Ê·ý‰”F½è‘ ÏjtÕaá÷Ïê¬Wmj]“o`€ªêîóëá÷Îê¬Wmj]½ß=3`Æ·Ÿ~߬ÎzgѦVVX©gÑ&=­ñíߊžµ4\ùØ)[²iø=°:SÏ¢MzZ½Ãþ$zÞÐpƒ“>~ÿ«Î¼dÑ&=½ÙE©Xq]ôÌ ¡ÊU¤l«Æßÿ*ÍGmÒÕ?î£Ñs€†œñùðû^uæ-‹6é‡[²i*»+zöÐ0eï±”/iü}¯Ò|eÑ&­¡É¿0À4 Î^~¿«Îüî,Ú¤ÕË—m>÷/ 0 eïÑ”/ß"ü~WyÍ¢Mz–†ì=‡hˆÉ&ú>WyÏ¢Mz–ò_Òx=‹¨¹20åË^~Ÿ«Î¼gÑ&=G£ï=¨¹Á7þ%üþVÉ¢MzŽº»ÿBJe=“¨©rÕý)ÛêEá÷·ê,HmÒó4¾ñ”è¹ @M Nùtø}­: –E›ô=¨á%{‡ß«ªžE›´>-Þxîëš ¬Jùöÿ%þ^U):‹6i=ëýï£g90ü^TÊeÑ&M©ñ­gGzÀð[ۅ߃ªSÉ,Ú¤)ÕÝ÷7R*ËèyÀ<*WÝŸòe›‡ßƒªSÉ,Ú¤)6¾ñ”è™À<êíoÃï=Õ©lmÒë~é—S*‹è¹À<˜|^6»(üÞSÊfÑ&M¹ÑµÇDÏ~¦­,æ}Ï©N¥³h“¦\w÷_H©GLÑèòÃï7Õ©|mÒ<4ºlÿè3€))û§|ûÿ~¯©Nå³h“æ¡|‡W¥r°*ú,` §ýSø}¦:µÈ¢Mš§g/‰> Ø@ÅýW§lɦá÷˜êÔ"‹6i¾Úê…©|üîè3€ ù„ýÞ©T—,Ú¤y¬üÇ¢ÖÓðÛ{†ßWªS«,Ú¤ùlñÆ©xàšè³€uT®º?åË·ˆ¿¯TªSmÒ<×;ôDŸ¬£þQ￟T§vY´I Ðø–3£ÏÖÒø¦ÓÂï#Õ©emÒÔÝóMsÑ â†Ý”ï²eø}¤:µlpÖìÜ˨“mûòðFjr£ï}\ð<ßü÷ðûGujÛðÜes¯£N¶Ã«Ã©Éå;¾:¥a}fð,Š×¥lɦá÷êÔ¶á;ͽ–:~-Ršÿ†ç->7X“²L½ýß~ߨN­^¼ûÜË©“ïö á?ŒÔôòe/Iå÷FüÑ¥û„ß3ªSûF—8÷zêä{þ·ðFjCý¯}(úüàiÊGï˜ûňèûEujßøúãç^Sî—7ü‡‘ZÑì¢4¾ý¼ès€ÿ÷‘ÑCÞ¯¨Ô„Æw^8÷²êôŽ|ø#µ¥î—~)¥b}œ´ÞèÒ}ÃïÕiLÅÊæ^Wþ‰Ÿÿa¤65¼dïèó ÕÊÇîLù²ÍÃïÕiLe÷á¹×V§æLø#µ©|›OeþPô¹ÐN>2ª™é6YÚþ?á¥û…ÿ@RÛšü&) otÙþá÷„ê4ªîžozêõÕÝ|Fø$µ®ÙRqÏ¥¡‡ @۔ߓòå[Äß*5©Þáï}ê5Ö?ô½ðHjc½ýß>÷+Ë,ŒÞ¡ÿ#ü^PÆ5øÆ¿<õë¤Ñ ­šÝ(ü‡’ÚØèªÃB€¶]qPø= :lôCžzu&ÿ#ÿâëÃ(©å;¼*•ý'"Ï€Æó‘QeóXqïÏ\´õŽ|_ø%µµÁéÿyÞ4ÿ[F~gø½Ÿ:Ílñ&)zÏ\´ ÎÙ:þ“ÚÚ’MSñÀ5‘Ç@c /Ü%þ¾O©©u¿ôKÏx½Í-ÚFןþƒIm®»ßÛR*‹¨s ‘&¿Ô-Ý,üžOÆÖ?ñ­¾h+žx ü“ÚÞ𒽣΀æõSwÏ_ ¿×S§Ñ®üÊê‹¶‰|—Ÿ ÿá¤6—/Û|îl¸ÁiŸ ¿ÏS§ñ•ܶæE[ïØ¿ ÿᤶ×?ò}ç@£Œo93e³‹ÂïñÔitùN?½Úkï©EÛð²ýÃ@I4¾ñä…>ƒ£ì>œò_~o§NãëŸðϾh+½+ü”4Ùˆ¿&•ƒU }4Bÿè„ßשӊÆß=îÙmùn¿þCJê¤Á7þy!Ï!€F}çàðû9uÚÑ’MSÙ{ì¹mýÓþ9þ•”²Å§âÞ+ò<¨µÉCé'_2~?§Ô†z¿s¯Ãg,ÚF·œþƒJz²îÞoN©/Ô™P_ãAêîûÖðû8uZÓèòžÑ6¹©Ï¶{Eø+éɆ}qN%€úœö¹ðû7µ¨ÉÇF»¯Å¢mòñÑ?ÿKš+ßúGSùè q.ÔÒø†S6»(üþMí©wØ?ëëqµEÛè¶óÂ`I?¨wÐï¥T–ó}6ÔNùØ])ßöeá÷mjW£k^ûE[*Š”íðêðZÒ^²÷<O53¦î~ÿ_øýšÚU¾ÝËçž ¸ö‹¶ÉÇGÏš ÿÁ%=­­_œŠ‡ožÏ#  Vßø—ø{5µ®Áéÿöœ¯Ë5.ÚŠGïJ«f7 ÿá%ý Þ—×GHæžËv’ç²)-x³‹RñàMë¾h›è~åâÿ’žÑðÛ_š3  fÏeû‰ðû3µ¯ÞWÿôy_ŸÏºhÝôð?€¤5}„ô–iŸS5z.ÛÛâïÍÔÊÆ·Ÿ·þ‹¶ÉGÔò=~)ü!é™õ|GJe1åÓ  ú&ÏÇŠ¾'S;ëîûÖµz>û¢-¥4¼âàð?ˆ¤Õ^¼Û´Î)€Z÷8ÏeSŠj|ýñ¾hK£AÊvxuøFÒµÕ‹RñÐ÷¦t\T[±òú”/{Iü½˜ZYwï7¯õ—vž÷×2¿½WøHÒêMžKŠñ4Î,€Ê*ûO¤îo¿S{ïkýz}ÞEÛÜoµíüÚð?”¤Õ^¸óYV–©wø{Ãï½ÔÞzû¿}^²Ï¿hó¬6©º-}A*¸v},€Jž·<þ¾KímvQ*îþöôm“§å{¼1þ(iµº_ú¥”F½õ<¶ªi|Ói)›Ý(üžKí­ÿõ¬óëvím“OÞrvøPÒšœòéu¾øªª|ôö”oû²ð{-µ·|ÙKRùÄ}ó·h›èú\´TÍf¥ñ§¬ó¨œA–º{þ‘Ï0OIDATJü}–ZÝð¢]×ëå»N‹¶âá[Óª¥/ÿÃJZ½|»W¤rÕýë5ª¢ÌÃï¯ÔîºûþÆÜcÔæ}Ñ61øÖá`Ik®wȻ澕 Ž†î~_¥–·äGRñÀ5ëý^çE[R¾×¯ÅÿÁ%Mõ×[¿ü`ñÆá÷TjwÃs–nÐ븳^/þû®J«oþ‡—´†–n–Šû¯Ú Á°Š×¥|Ùæñ÷SjuÝýÞ–R1ZøEÛÄàÜeá’Ö\w÷_Li˜oÐpXeþPêîúsá÷Qjwùò—¦ò‘Û6øõ¼Þ‹¶T©{À;Âÿ"$­¹þ‰ŸØà0¯FýÔÛÿíá÷OÒèê#¦ò’^ÿEÛd×öØ=)ÛæÇÃÿ2$­¹ñõ'LePL]Y¦þ±¿o’§|zj/ë Z´MŒ®?1­šYþ—"iõòm"•Ý5i0EÃó¶ ¿g’züvJãaumý³‡ÿÅHzއ9Nqhl¨ÑuǦlÖ/í¨Z¾ã«S¹êþ©¾¶;ÓúuÏÞáþ$iÍ NýìT.u€ UÜ÷”mýâðû$µ»|ÙKæ^‹Ó6EÛd×Ö{,å{¼1ü/JÒš]{Ì´.w€õR>~OÊwøÉðû#µ¼%›¦ñͧÏËk|j‹¶‰âÑ»Ræ‚‘*Y¾lóT×ùv]çzÇ9îÎ}é‡Èç9Ÿëœëñ€×?p]ŸÏÞO®/ã™Ë'ñÌìÅÛ¾í‡qÛüï–˱}ë&? ™í~üšC¿Ü%´í›?v׸púe“¿ˆföâÍ?ý'‡uë<ÏÎ=¿3ùÈlçoNÉõ~h¡mßü¡³ãÂU—NþbšÙ væòCùw€çšÿÃOþ±õÞ©KÆîß]wd×ü¡†¶}óGîð5R³Üì÷¿m,7¿rØ`M-½cløð½uâÈvß GzÝzhÛ7?wÏØ¸ú›§ÍìyÛúóŸ=ø½€ÒÞã÷«_1ù™ÇÖxg.óo9òkÿHBÛ¾Åç>96Þþªé_h3{ÞŽò#´ÀÉ·÷Ôccví«'?ëØúnöŽ×ŒÅçîäú?²Ð¶oñÔ¿ŽÙ|Çä/¸™=g§^2ýÕQ> €jyáÉ1»þÊéÏ9¶¶Û|×÷ŒåÓÿ6Ù=p¤¡mßÞÆŽÍ÷üÈä/¼™}}³k®{ÿñðQ?€d¹}~lÞô“Ÿol}·ýÁŸËíg&½Ž<´ØÝ[gß4ù`f_ßæ;¿s,7Ÿžä‘s»›cë½?:ù¹ÆÖtW]:vÿþú•ø òiBÛ³vx¿$5[¡m}à§ÆØ[LùXŽ›ÅÎØúÓŸžüåfvxÛüÃïËíóSßîÀ!Y<ü—Ÿ:šúìaÇ|§/[ïý±±{ï;ÇòüS_ÖGâÄ…¶ÿ1ßóGî[ù%ÑÍì¶õþŸùÃVh§/³ë^;6oúÁ±ýÁŸ;wýæØ½ÿƱ8÷×cï™/N}É®¤µ m/²³9O|jì~ú}cûÎ7Í›bÌ®ÿöqáªK§¿¨ÍV}§.ónžú.¾ËåÁWF÷ÿÒÖkûŸD[œ»çk{ü“cñùO½¯œ{[_úª<–„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6mÚ ´@@h€€Ð¡ B„6m0¾qÿ SKìX7=IEND®B`‚‰PNG  IHDRrrÝ…} pHYsèèµ{Rk IDATxœíwŒEÇŸ ŠbÖhbï5öJŒÆØ»þiˆ$–أƊ×8)‚(MЉrJ„A¤¨HSDª”“" ÂìlߟùÍÉyñàÝÛ}³û›7o¿ÉïÏÛ·óýÜîÎüfæ7H¥…2Ô7JŽRš(©‰Rš(©‰Rº‚t×LsÜ#ÀªÚ+É„ Þ÷lv×Ñ´D1y+'+;8´‡Y£ª½`ã®­=0Hßüø˜"ÿï>{¶$í—Òr}(d“@ ¾µç Fõµ‘/jô9‚=[ -SWÎ¬ŠØ`ò¡\ë?Ö—/D‡Øãðw®¦öKiYžŒ ¦UÛYüFÆß]¬ühªh þïßSû¤¾\ øÀËâYÙ|ãOÈØ úG¾ˆ»x8µE#ǯÀº LgÙXȘ5"ý±=éYjo NîÂêx^¯3Þ† }oè?ä.nüȦ 'sÜCòANz2üã»Ãýaù!ào]òöSíSÀv€Qu´dφéÌ®l¼©TÑäÌíE 37é+U‚<ø{çÐôVO‘ÑŒTà­øœ¤9æ>ê¶k'sØ-Ƀô7/¤n·vò6~›,Hsä ¼|O$íým?¿e‘€ƒÍ@uñÁW'Ò[? ”“ÃÅwÆžüð—‹ta³{/=ø€KÀžú2x¿} *Êýù“d@ò¾g¨¢ ~£È*E‹ñ!׃·®ù\©|Œ^§ÆR™q£ÃÁžöZôÉaOzF©a”3¯wü ƒ]ë©Û)¦Éxÿ òÈš>Õ×@Àÿ"mþ¾·vØÓ^$ÿB –¿e1ÝÂ/;a¹Âl2Ë«\üºà,èÖg&›°¿z¨¿‡8qDÖ´GøroÜ÷Àßþ‹˜æÃ×8t°ò6±µ¡EÞê©@¦À“8!²Ãù¶g~·º»Ü_ƃ=ýu0‡Ý F×#¹ïœAÆN ’»ddrf”·ëÒœî+0ëÁ[;œoªÀs?=OJZh¸ ŠLA ½sÃZ>ô†æÃ,ÏixEþ8¬ñEŸ•¶" ¤9öA*Œàm˜Cbˆ3¯xà8•¾*ÖïZb 1B¥|»ã¬È"+Hì&S ‡Ôæ0]@b/ŒJFÕ1äæ0]@R%™1ÛAm Ó ¤¿ùG¸`Zs˜6 w¬¤¹ë7rc˜V ‰ösø®!7†ér È`ï6rc˜V ·¯ ‰³ÔÆ0­@Ö}GX—ÃÈÍaÚ ?VM&iô:…ܦMB`É2æ‡ÈÍaÚ¤èæö"‰3 Ôæ°ŠìIóÚ7É@Ú3KÉÍaº€´¾x‚ ¤»x¹9¬€"û|䨻 ~)=+’È R,L&RÀw‘›Ã (²¯Ù)k-çTRa- +hqñYv‡ #n#7ˆH´¼rÅçd í©/‘ÄtéÌé¡e7Vl ­šÇÈ@âÆZjƒXDË{?^FZ0AÆÎ+VÑòn¬ò6¤=W±gB£˜â‘Ó¶:ªµ;qWUdÅ—ËëV»#HkâÓd ±¨µI¬"·Õ×Ðvx*%7Š)¹Uõ¨h+v%QIl¦QÀ,¦pä\ž_qT²'?OnÓ¤óÃ@2îOcÉbº€¤Ìð`Uj£˜. ñLJ=O&7‹)¹,=Hìש|4Ó(BU‡ôÖÍ éÌ}—Ü,¦ H¬bA%oÓbAÒ˜ŠÅ”ÿÀÙªJG‰«P ó’Iƒt ‹g›ýÉ ¤3«‚¬Qûè¦Ä ò÷/=G*áTV, ©ó®[ Ð%g’Ãûué‰DÙî-/bAÖß›ZxìÓuì˜ãîíü@â7ca5Ës¤U¼ß7ÏëÉ(Äó­ci޼TP`ì9PÙ±hå2P!‡ërx¼ ñû¤Âë…†K{2ËZƒ]ûiçfŸ¼U_¶x¿ùƒ³!ï€2ò=1;ù´¸ÒVâ() ÷i“ ŸÊ%4£¸Ø{Cתý¤Äy½ÊvÊ$ Uö̒о[S^€ŒYÓIH¼èøŽÔ^¬ÄlN„BŠöì*ÈØóûH‰³"ÞúYÔžä+•¿wN$ÏݵÓ!#æºÊ– S¶'ÜZPˆÂÊ)‘üîy2€kCF\dâ3rŸJâv…&ÜÕggéHq Ÿ#ĸ%çG~ù§Ä©/o]mäÃM–L㇖×}3ÊÖ2ÿåT)/,÷mTÞÛŠ¶`c½yßorŸÜ5_9îa`ÝŽ•³÷éi¢`?”&ïw.ÝÚçì“À¨¾¬™¥à×7O‡6™ª0•‚ÔD)HM”‚ÔD)HM”‚ÔD)HM”‚=ôìš»ÿÛIEND®B`‚‰PNG  IHDRLLÇ—Q+ pHYsèèµ{RkÛIDATxœíœklTEÇ×Vƒ$ õ úÁDã;Ñ/1à#~ÐhÔ˜˜h$5ßÁ¤µµ/ †B ¤-¶U±” ­D [Úb±ÔÒR°± ¡Om Üçܹ÷˜IC¡Ý»s÷Ümw²ÿdÒ/{÷žùuçÌÌ™s&q ) öñ¸âÀ&¨80¯À¬ãõ •.%8”äÀ”MM¿ ho#Ä’œ‘c æÜ²_“¶àÐJ—€ubßD`äbPRÝ¿à‹+öìX”}ú ¨óÄ¡±–š¤µŒO€%m–ûCiWíªXý{() Þ gƒ=Òã§÷Âz€4¯dÖ.÷,9ÆîdhE¸°âF”€¶þ!OÀ´MÏA@-| ´“_µ}d’=Üå:¹M ¬ìI`)—ímeîú˜Qõ&È*Ç8+¼Ô ,}.8Ê È,ëÀz<`f͇Q5Þ1΀sæÿ5Y†Ð¯lj`©‰àŒôÕVg¬HS>è5sþĉ&ûZ0*_Ú½üÙ›90½ü)ß t”!0~|+¼³åë'À9ÛçŸ=ê0ßÁDÌú³Üãì“ûAÍZ <;±acv¢ÚâŒô€Õ^æÎ@ÍJŠXJ8ç[´·oÜEaC[q3÷qžà¨Ã|[GöAÿæ>佨0)0mí=è°ÀT@Í»Ý3¬ñáYò€MC¿‹¨üŸC¿£ò”÷†fl{Ù›fô„=­MÁh«¥Œêe ÞJêåhï iZL]y+šÑÌš»>½äш†80z¤–=t4ªŠ:0ûT3*0Ú¹Mr`ý‡¦uû¡Ä°¡£¨ÀHS¾ÜÀئ,ÙaÎè \`í›åf÷·¡£Ýµr£Ç~Afÿ%706„Peé<Ô--0ò{þJ?÷&y™;?F¦—-‘˜þí³èÀÌŸ?“˜¶út`Ö¡Mòcá &*0{°Sb`>ì'Á¦aÇÍgr›:¦p#.0Ð6<,/0sûÛèÀŒêeòcÙ-Ø"Í…òc™-ØŽŸö6J Œ9þÓ-èÇòJp޼ÀX [z±{ò^Ì3ª–¢3k?—˜Vp:0ÚU#/0¾â7T`Ž>vÊLl®ˆôx`KsÉ©)M;Žç÷ #õ9èÀÌ0ÓÜ£ÚÒç‚^´ÌïóÌ%{ð0€ã©Ë¦ÿ<:0«cËôÂIMmÍ]`l}§EPV3ÅšS˜š{#:0ç\TCÖjÞm<‹‡4äý‡¨aÛJê²Å€ùqìÆ¤­{Ð8YI —? æ¯i@»vðlÇHD~ˆ~(À;ä0»¯×ΚÄ1Gˆ-»¯Õ`ع°Æ–WÅi÷‚ÒòïDŽ ÐmdÞÂÀ˜ƒf9¢Ø"9ÔHó]Øb†80æÇoõg¶ âE/¬–b\ûôÑKfó°ùUsdni8&¡W°ÊãKÜS¸ÀÔœë°ÅÒÛ/®ñÒX¶È¾ޱƊü_ùG°56¿Ä·1~;|a`,sÙ/‘ýkS¤³»‡BM6 ˜V´Hx:×}Hº›nY•îý®xÆöw…)¼ˆ« d ’ª_^íÚg³>t ÃS¡ºòpÔ æE ?qíoæ|°•áó×aØàéÖ#½tqÔ§}T9ö%AÂIaeÌëü \¸VÇ/\;—&v'Y»bU¬\ͼfʦ¬ZzÕR°ÿí&~¥Ÿ âÀ&¨80AŘþâ´DÙ..ê1IEND®B`‚‰PNG  IHDRôxÔú pHYsèèµ{Rk IDATxœíÝy´Uå}ÿñƒbœ£Qc¢ÕŒÚŒmÓ˜fjbmÚ˜É 6¿6I35i›“f.÷22ƒ"(ˆ 8€È$Š ˆEgP„ggŸ½÷ó[û˜X\¼îÝŸýìý~­õ^]+ÿôpÏóœçëö®Õ(ÛÖ¶_8ÿçgÓ¿9ÓŸtÚãÞ˜÷Ó÷ðÔ´Ôl• g|ÓÚ¤a ¨+Æ[Ó«‡üõ²rõ{mšÞŧ=–•áõ¿ü’µ¶GÍEvq[ÏpÞá_üO˜Ç$ò?®¸pÎ[›&ê½ ¯*úãùk&Õ¬ôúÄ¿ä3…óÎþYv¦ÖŠ.Xø‡·‡WœµÈ 9¾!ÿã¤ú‚_Y›¦ê= Ý6TþÚIµÿkÈ_5Â+ÿõæ`qÛ[jEÞü»w—}éÓ÷°Ê½µ¿§¢ÅýÔûöJtKùk(Õ^^ßÃÓàò¯þ1\Øòõ¹_³~x@påYS³Ï/ä˜"Õ«‡–Rï_Ø'õ¿Ô¿ž’}Eý_—†³p•]9áÉá\ÿ‹¯x£ßíÉÿ…<üG«÷-ì»4µá5ßÕ¿®’Ý]Þyg‚~ÿ…|ÿYß›`ú"ÿDZhÉ`õ–€®“Ä6¼âkò×Vªí6¯ïa6œÿÓ©Ý~ðÛëÚ^›ýLAý.jÑÒaê­ ]¯Ø`Ò'寱Tk·à²/¬³Ë¦Ü-‡ÿ®9ç¼ÁwʳêdQ‹– QoQè6i°ÃúcÿFþZKµvó'~ò{ÏÔc»ôðol9Ùón£þǵèÖê½ Ý.Ýñ„õ†/Í¥Z»ùã>°Ó_9áM]røÛÅmÇxçýÝNõ?ª¨ÕoüzO@n’Í«­×ÿùk/ÕÚÍÿ¡çíšéGíÛá?·íü‡ŸQÿcŠZ8óÛ\ä@åÄ]oMkOùk0ÕÚ-˜ò/›ìƒ¸×@0åŒÕêDQ ¯ü׿·c ²÷ (Àk1ÕÚ?§®ùÁÒ½;ügÿp˜úÁµ`òéÖ6Bõþ©ú¼³å¯ÇTk¿ÖžÙwÔ~שÃ?ºá7§ru¿ÝçOøˆµu£Þw —4šÿA¤~]¦Zû {s®™ýîþ…Ý"ÐÌñv›šgÔ[ #õ·YäÉò×gªµ[8óÛñÖÿ>ä <Æ&Ï>¤ÞkP8ÉÖuÖë¤üušjí°|üOöxøÛÅmGš!ÇÇò[´úl“'þ¨ÞcPXñÚ¹ÖôÚOÿzMvwù“>í[k_Óþý_ýW¨dá굟mÜ?S½· ðê7·è_³É¶WcåÄþ»ÿ¯ÿ¹m‡˜¡'6Ô°hE·Pï)pCšØ`Êgå¯ÛTÛmÁe_Úe­íùŠ œõýóÔ®hÕçþH½À)©÷¬õ†½YþúMµWÖº¿m<|Ã_ùÍÿ þá9ùƒ+PÁ¤OYGê½ÎIžºÓšÞÊ_Ç©öŠê ~½îe‡tÃoOÉ&õ+JÞ°·ðs?ØÑÇÈ_Ë©öŠüq§dOÏ ÿ÷å¿éÿv­úA%¯ïa6Ù|Ÿzï€ÛÒÔÓΔ¿¦Sí5¹ioÿÿe½zØÆê«ÔÛJ! ¶7ßQ•¿¶“}iÑ’Á«_øöÿì_nú"@E(ZÔ[½_ Tâ K¹s`K± ®þFóšþµ?ù‰úÁ¡`êÍŸ°ºVtËùk<Õ^,»t³µöcµ`ú7gªŒ:oè‰6õ¶ª÷”÷ú?!­§Ú õÚÏZoÛOkÁ”3VËŒ²¶l¼ávõö€RK·=f½~¯Õ¿æ“ÍŠž¸}JÍ÷J0Z~žz_@%4îºXþšOµfÕÓWÖ¼áo­«ˆªðª¯«÷TJpù—å¯ýT³ÑŠ kfÐ*y÷?Ô_Û4Ü©Þ P)ÙEÖ¼ÁoŸU/ºã‚m5Ó÷°Tý@r¯µ§Mž\®ÞPIñÚ9ús ¥ÚEwœÔªxÿæhÉ`õú€J ¯ãÞ/?gLÉ*Çк¿M6Ý£^¢€n?r£þ¬i)W¥ÂÙ?P¯M@7 .>M~Þ˜åüàõ=̦;ŸV¯K@7KžZaM¯òsÇ”$ç€è–ê5 ÈI0íKòsÇ”$§€ì§!6òÕë“dó}\"¸…ÀFwŒS¯E@β;½ªÏS‚œ¼ao¶6®«×! gÉs[ÓÚS~ÇsvànP]áÌoËÏ!ãxNÞ°·ð_ÿPa¼ P«æÐ¸ûõÚˆñ]€ZµäÉÖ& õºˆ%Ï<À/Z*44îºX½æ^y–ü\2ŽæÔà 9ÎÚF¨^o€‚H6ÝËÕ[*0D·R¯5@ÁS>+?ŸŒƒ934¯ùïoS¯3@* ¶ÛtÇ›n{ô/z¬¹?Òp§ú!¹‹[,?£Œƒ93ÔçÿT½Æ€îÓm²å~?0ÛFK‡ÙúüslxÅW­áG­7ôMÖëDÇ÷K—ÉöÏÿ{\ö…æÞÉ6züÐõ6ݹQý/º…Á?ÈÏ)ãXn ­=mºýqõúºDvÇkçÚhqßùoÏõ›ÌÞ ×Ûà’ÏØhQo?¶ÈÚÈSÿI€}ÖX3CVµ¸•@xÕ×Õk ØkÙÙ7îœ`ë¿e½áo•ï§WÔöL>ÝF·l^\pR[ÄIúýÔâNN ñã·ª—Ðai}—˜eÃÙ?l¾¯Þ?Í÷~-ÎÇpNcÅòýcªð€?ú]ê5¼ªìËw{.µÁÔ3¬é} |ßtI­ûÛ`Ú™6~økÓTý'^]äYoÀQú½ÓâF…¢e£ÔK ؽ$n~–ß¼IŸƒå{¥;óG½Ã6îšÄ=8Pxõ~-ß/Æ‘Š=ô9ئþsêõ¼Lºk“÷k~;_¾Gr.ûH£±b|søŠ(ݾž›µ”`¯þõZ^”l¾Ï†3¾aMÛò½¡Î?ïomüèÍê§Ø­ì×5ê=b¨Ð@òÄ2õ:l²ñ®Þæçr£¯(ûõ@²eú)^&^¿D¾7ŒvðǼG½†Pqɦ{l0å_ä{¡ðµ`ë7ýÞÚ8R?eÀ‹² aÉ÷FK±+ìÝ2@½~PQÙ¥v³Ÿ¸ÍhçòÇÒ¼=+P;/”ï SðŠ9ôêѼ¶9«8jþê$»ï„|¸Zïƒl´d°µi¢~6QqÙõ8¼~¯ÕâVÈ ¸ðÕk“]lÊónùÚ/KÙG'©yFý´¢âês$ß ¦Àrˆî8_½nPÀÖoø o÷wCÙeù‚ ”’M÷Ê÷)pŲÿ˜-êuƒŠü¬/û9›|Í—8¯ßá6^7OýT£Â²;jª÷)h…²K©Ý-[øÙMpÔë½µö´Ñò±ê§ÕX5U¿ZŠYá€ÆÝ“ÕëeV76œþïòu^Åê×ýŒ{ éóOÚøþklýÆßÚà¢É×¾)hÅZ÷·©·U½vPâK„úcÿF¿Î+\ö¥,†t¥4ØaãGnjþt<˜ö%ë 9^¾Î#j&žª^K(ñçý.Þš·Œ…³Àϱw’Fó‹¥USš·Ûnþr‡/ðÚR ÑmCÕË %?¼ ùe4õú¦ÿ+œó_¼€=K›<³¶yØ×çmýñä{;-%’­ª—J&^;‡‚Îùoõò@¤;7ÚøYÍËJŸf½þGÈר)y…üÑïR¯?”L¼îZkz(_ÛÔ~Ñ-ýÕË¢«ôÅëok^y3¼ú[\„«¥â@ý†_«×$J$^;—ÛöºP¯¶qÏ¥êå‚îG6yjEóoáÌo7ÿcÏík…¨0@üØ"õ2EI$OÞaMßCåkš:XÛÍoq£]½ŽQiøü o/`cQçóGœÔüM7ЉÏík¥«@të@õÚ†ëÒÄ—~N¾¡hß .û"?,Øïí³·òýq§4/Ô¦^T+ß<¹\½Üá¸úÂ6ùf¢®)º}„z9UNòìC¶qÏe¶>ÿ§ÖŸðkz$_T+ÿýÖÓ&±zýÃañ†¥ü×I™jíÙ|«Ý# ¶7¿t™ ÍÁ¥Ÿ·Þ ×ëŸs²•šoù{) wZoøÛ䉺¶ì²Íܤ‹>·ü–æUVÃ+ϲް7ËŸ[ª&ù-¢Þ#pXv=põ&¢î);°ÐÉÏ퟾Û6VŒ·á5ß{áÆW¼3F-âõKÔÛ.ÿÞŸ Š”ºÆ½—«—Y±/»vî oåO>Ýš>‡ÈŸ/ª9•vhíÙ¼?;ÐiIÃúç¿O¾¨{Ë~WžÝ۽ꚷ¼Í~‚·dðŸ>·?VþÜPÍù¤€?îýê}GEwŒ“oʧìç•R7ÍwF£¥ÃlxÕ×­7ì-òç€j¥L:ÔçþH½Õà¢È³Þã䛇ò«q×Ŷ´ŸÛoºÇ6î¼Ð†³þÓúçýmóQõß›j•H:4VMUo?8(ºu|ãP¾y.ůÒmÙÆ}WØúõ?·ÁEãs{²•’­ª÷#\ùün¹¢…×|׺$X⯳ѢÞ6˜zë–lÑÒ }m^¾èŒì–¢êMC¢zõhþ¦½°·¼Ý¸òå×ÉïÕCÿ7#j)ààOø°zËÂ5IܼaŒzÓ.ì{›‡­z¾ô:ùÍ[Þö>Pþ·!2® áìh71œß|þhéð\×]º}½m¬¾ÊÖ¯ÿ… &žÚ|÷Rý7 2.Ñò±¹nb¸/¸äŸå†ôyý·é®ÍÝvKéoy›]:wðäÿ^"S¶ °Ÿå¡Ò¸¬)½X}ÞÙ]ó¹}öVþøÜžl“ ©÷lWœ ¨ˆúMo*P­=m²åþN­¡tÛ£|nOÔ"¼!ÇwÛAJSë =Q¾Y¨XÓÎlÉìØ`k®¶õ¿²ÁÄO4?6P?^"S°$@¶!ŽJžX&ß(TÌâGîæsû7Ê‘ I€pÖ÷Õg R_ðKùF¡‚–]IÏ퉬3@të@õ™‡xÃß&ß(DD¦dI€Æêéê3ŽH6ß'ß$DD¦„I€äé»Õç --ß$DD¦„I€4Ü©>Wàˆðò¯È7 ‘)a¹Ù±€ÿüoà1òMBDdJXî€þûÔÇ ‘l^-ß DD¦¤å>—~^}®ÀÙUÛÔ„ˆÈ”´Ü€pöÕç Áïÿ‰ˆjå¢E½Õç \òù!"2%-÷ qç…êsŽð†'ß DD¦¤å>Äë®UŸ+p@êo“o""Sâr’+Õg lºG¾9ˆˆL‰Ë}H·¯WŸ-p@¼nž|s™—ÿÀUÑÑã䛃ˆÈ”¸|€¶šWw^Mý¦?È7Q™Ëuð«>Wàˆpæ·å›ƒˆÈ”¸\ô»Ôç \ú9ùæ "2%.× ¸ècêsŽ&ž*ßDD¦Äå;\ú9õ¹GøãÞ/ßDD¦Äå:„Wþ«ú\#ü'É7‘)qù3¿£>Wàoð䛃ˆÈ”¸\€úÜÿQŸ+p„és°|s™—ïpýÏÕç azí'ßDD¦Äå;ÜÜK}®À DDµò Ñ­Õç Á@DT+Ñpûõ¹G˜Öý囃ˆÈ”¸|€e£Õç Á@DT+Ѱ|¬ú\#ˆˆj%î§>Wà"¢Zy€ÆŠñêsŽ0½’o""Sâòî¼P}®ÀÞ€£ä›ƒˆ¨Ìå;Ü5I}®ÀÞÐ囃ˆÈ”8’?ú]òÍADdJ ü > ßDD¦Äåü+€óÕç Lü„|s™—ó…€F©Ï8"˜z†|s™—ïpÛPõ¹G„Wž%ßDD¦Äå;Ü2@}®Àá¬ÿ”o""SâòõQŸ+pDýÆßÉ7‘)q¹õ›þ >Wàˆhépùæ "2%.ßàºÿUŸ+pDcÕTùæ "2%.× œýCõ¹GÄ]/ßDD¦Äå;Ìø†ú\#’+囃ˆÈ”¸\€`Ú—Ôç ‘îØ ßDD¦Äå;L>]}®À‘/ßDD¦Äå:ø>¢>VàÓ÷Pù!"2%-ß`ìߨÏ8Äþ6ù!"*k¹Þ¹'¨Ï8$˜xª|ƒ™’–ë½¥ tTö«õ!"2%-ß ¥fm#TŸ+pDýÆßÊ7‘)i¹é®MêsŽˆ–Ÿ'ß DD¦¤å>$Ï< >Wàˆxíù!"2%-÷ Þ°T}®ÀÉÓwË7‘)iùëæ©Ï8"õ¶Ê7‘)i¹•Õç bú"ß$DD¦„å>D‹ûªÏ8Äy²|“™–ûPŸû?ê3 .þ´|“™–ûÀÑáìÈ7 ‘)a¹þøªÏ8$Z2X¾IˆˆL Ë}à~èŒÆšòMBDdJXî€iíim«Ï8"yz•|“™–ÿмðfõ¹G¤õ]òMBDdJ˜dÈ®ðt”7èXùF!"*Ûß@2Äë®UŸ)pˆáG先Ȕ,ÉÐXy‘úLC«¿%ß(DD¦dI€hQõ™‡D‹zË7 ‘)Y’ œóßê3iÜs™|£™’%‚˾¨>SàäÉåòBDdJ–dðǽ_}¦À!©¿M¾QˆˆLÉ’ ^ÿ#Õg ã ~ƒ|³™%²Rÿ9õ™‡“>)ß,DD¦DÉ€ä©ê3Én#­Þ,DD¦DÉ€Æ}W¨Ï8$[¨êÍBDdJ”lˆné¯>Sàø‘›ä›…ˆÈ”(Ù^ó]õ™‡¤Ï?%ß,DD¦DÉ€`â©ê3Žñú!ß0DD¦$ÉïÜ¿RŸ'pŒ?þƒò CDdJ’l0½zXùê3 g~[¾aˆˆLIÒ ÙO·Ü¯>SàhÉ`ù†!"2%I:ÄkçªÏ8$^;G¾aˆˆLI’Ñí#Õg ’<û|Ù’$êóÎVŸ)pI[Óçù¦!"2%H:S>«>Ràÿ‚È7 ‘)AÒÀþ6õyÇ„×|O¾iˆˆL ’¦×~ÖÖúLC²ï¨7 ‘)AÚ û)àÆ»Ôg ?ºP¾iˆˆL ’USÕg ’z[囆ˆÈ” ùP¿ñwê3Žñ†'ß8DDÆñä@pÙÕç \òÏòCDdO>ø#NRŸ'pL}Á/凈È8ž|hþ òÔg ÒX5E¾qˆˆŒãé€ì—Oß­>SàäéUòCDd¯@ãžËÔg \Ò­i;@¾yˆˆŒÃb¨ßô{õ‘ÇøcÞ#ßOà˜pú¿É7‘q¸B üÝ:H¾yˆˆŒÃb0­û[ùê3‰^ ßOà˜ì2ÒêuKDd«p€þûÔç ÓX5U¾n‰ˆŒcn0m¯±6®«Ï8$yf­~ݵ¸Uñ€–šM6®TŸ)pî‹€GÊ×-‘q¨BãÕG “ÝMR½n‰ˆŒCrgý§úSàÔ<£_·DD-nTÜ »5ðúÛÔg ã }“|Ý*ôÀ­ÑYá_•¯[""ã@…ÂßTŸ'pL´d°|Ý*ôà~§úºP}¦À1þ¨wÈ×-‘)x…¢[©Ï8&¼ú[òuKDd ^á€àò/«Ï8&Z~ž|Ý™‚WøÀrœúOà˜ðНÉ×-‘)hÎ áœÿRŸ'pLtÛPùº%"2Í™À?ÿ}êóމ×ß&_·DD¦ 93˜Öý­­õ™—D¾5m¯Ñ¯]"¢–âåÎÝpýmê#Žñ/ø€|Ý™æÔ-¦>Oà˜ú¼³åë–ˆÈ0§€ðÊUŸ'pLãžKåë–ˆÈ0§oØ[Ôç “<÷°|Ý™æÔ•îÚ¬>Sà’4µÞÀcäë–ˆÈ,ç€xí\õ‘Ç—}A¾n‰ˆLÁrn¨ßÜK}žÀ1Ñ’ÁòuKDd –s@pÉgÔç Ȉjî^ÿ#›ŸëÖ­é}|í™åÜ•l}P}¤À1þ…•¯[""S œ«¦ªÏ8¦~ïåë–ˆÈ('€ìên@gÄkçÈ×-‘)PNþøªÏ8&õ¶ZÓ«‡|홂ääÝá-ûbÐþèwê×.QK1rsȾøärõyÇ„³¾/_·DD¦ 9;dèŒÆ]Ë×-‘)HÎáŒoªÏ8&ûù¨zÝ™‚äìàOàš8²¦ï¡òµKDdÄ9=xæÎ€è´àâÓäk—ˆÈˆszÈJž{D}žÀ1Ñâ¾òuKDdÄ9?4î¦>Oà˜xýùº%"2âœêóÏQŸ'pM\·¦Ï!òµKDd„9?øã?¤>Nà `Ò§äk—ˆÈs~0½lþÐÑ¢>úµKD•ÏëDó‹ÉõgMïƒrýÿíþ}ð©êóމ[,_·DT±Z{ZÌ»mxõ·lãÎ 6Ù²ÆÚ4yñuÉpT®§@´|¬ô0ƒaîÓ6U+oÈq6¼ò,-eãõ·Yù{|Yò¿!×ÇWŠ€;bo?!_»DTžÃ>¸ôó¶¾°ÍÆkçÚÔÛÚé×$o艹>æR Ü{£¾°U¾v‰È½¼¾‡ÙàÂlþ ­±jÊ oåwÄÛsýw”bà΀Øñ£ õk—ˆœùÜ>Z6Ê&W¾ìsû®ä~g®ÿ¶r Ü{#ò›¿"Q¯]"*Þ[ùÑ’Áúܾ+ùçým®ÿÖÒ ÙϺ€Î .ú˜|í‘&¯ÿ‘6˜|ú>}nß•ü >ë¿¿4ª­ªòIDATwÄÞà{DÕÈëw¸ &}ÒÖüÊ6Ö\mÓlÑø~4׿Iiî ˆ½?~«|íQŸÛ'±-º ç_&•fÈâ΀贸ÞüF¯zíQW~nïY“ÿ)׿[©î ˆ½\ú9ùÚ%¢½üÜÞB¾v‰h7õ=ô•¿·/ñG½Á´3sýû–jð'|XýüÁAÉæÕòµKTù²ÏíÏŸ gÿÐ6VN´ÉæûœøÜ¾+e— Îóo^ª ygÀFØ¥O* M›Ÿ!Ê×/Q…ò†¿Í†Wý¿æ;pñ†¥Î~nß•‚Ë¿œësP® û"à˺ô A5d÷“P¯]¢Rßò6{+ÿ†ßüésû-ê-_HÁ¥ŸÏõy)Ý-¦~á ÆÝ—È×.Q)j;ÀúãN©Ìçö])¸ä3¹>W¥Â+¾Ú¥Oª!ݹ±yO õú%rªÖý_ö{ûæOðâºz;;+˜ô©\Ÿ¿Ò Ùg¹ÀÞÈ^ÈÔë—È©[ÞÛÕÛ¶T‚ ÿ1×ç³t@VºýqõóeoYª×.QQòú½öåŸÛïÚ¬Þ¢¥çÿ`®Ïq)€Æ½—«ŸG8(^7O¾v‰$õ9ø…ÃþºŸ5_?¹ªª†þßçú¼—r¨Ï;[ôôÁiuÃí©üíîs{~>]þ˜÷äºJ9dß@\¸7QîŸÛûÛÔÛ íðGýu®k£”@vE©´¾«½¿1Юèö‘úõK´¯ŸÛg?Á[=ݦ»6©·:Áö–\×K9€–š[Ü™¿;Дl}P¾v‰:ü{ûì­üìÒ¹/þÞ>Qo!ìïÜ¿Êu •vˆn°/Ï*Ìy²|ýíöÒ¹|n_jÞ cs]S¥²Ï¼€½‘ÝUR½~©ÚyCOl^Ô,Z2¤ùnfîTo ä û'ÏuVÚÀx4—ŸÄ^‰^ _¿T¼~‡¿ì–·\Ǥ¢’FîW#-í•l]§~Já¢Fh½¾‡É×/•øsû«¿ewNàs{¼(5Ïä¾K=4îžü] ‚˾(_¿Tžüqï·ÉS+¬#õÒFA%Ï>”ûº,õ};ØÈ×/•§pÆ7ÔK—<¹<÷uYêÀû^õs G¥;žàî€ÔeeŸï{?x]îë²Ô@öÎU¯àÊu¹©¼E‹z«—3 ®qï´ü×e©€ì‚@/P?¯pT´¸¯|ýR9Š–U/g\´ü¼ü×eÙ€ìú×ÀÞH6¯–¯_*GÜ¡EüŽÒÙÍ]WnÎAå,~øõRFÁÕ¯ÿyîë²ô@ve%›ÄêçŽªßø[ù&÷KžY«^Ê(¸pæwr_—¥š›oÓ½êçŽJž¼C¾~Éýlݨ—2 .\{¤@ö›n`¯¤©õÎ=A¾†ÉݼG©W1L<5÷µY‰ œþïêç«_ûù&wË~N ¼šìny¯ÍJ Ù=–½?¶H¾†ÉÝ‚i_R/a]šZÓûÀÜ×f%€¬ä¹GÔO1\•4¬7ðù&7ËÞAö$ݵI²6+34îºxO°'áœÿ’¯ar³ÆŠñêå‹‚KD_6®ÌýÄØ[ñã·Ê×0¹Y¼þ6õòEÁ5Ö\-Y›•²/Xûôk€ao‘¯cr¯ÔN½zQpÑí#$k³2@s#îxBý<Ãaõ~-_ÃäVÞãÔ˨_÷¿’õY© »Û°·’M÷È×0¹U0ùtõ²…Â+¾&YŸ•ÂÙ?T?Ïpœ?ö½òuLî”ý—ðjüñ’¬ÏJ þèw¾êìItËù:&wj¬™¡^²p€7ä8Éú¬Ô`zõ°é®ÍêçK·¯o®#ùZ&'JŸJ½dQtqÝš^ûIÖgµ€l"_=]ýtÃqÁE—¯c*~Þ°7«—*n{L¶F+7dtöEcÕù:¦âÇ=HÐñƒ×ÉÖhåÄIzR€vE¾õ¼N¾–©ØEËǪW*Ý6T·F«6d¥ÛW?çpw¤W+Ù¼Z½Lá€ðšïÉÖh%€Æ]“ÔÏ9—l¾O¾Ž©¸ñù?ŠþÀÊ|6‡®àOø°|-S1«Ï?G½<áÊ%Æû![§•¼AÇ6ÿðÀ¾ÈÞIR¯e*fñÃ7¨—'îØ ]§•²²·p}R7Ò銙×÷0k¡zuÂñC×K×je€èö‘êç% º‰·ðò¯¨—%-.]«•‚K?¯~îQ–+¶ö”¯g*Nñýר—% PéÀëw¸µq¤~þQáU_—¯g*FÞÀ£yûÎ|‘¸²@V¼áöŽ?S@;’§î”¯e*FÜý®üÀT}¨/lëø“ì÷ ¬dÓ½ê¥G¤Û—¯×Jþøª×J"~`–|=“øõdÜ)êe‡4î»B¾f+=d·`LÍõ:@¤‰õG¿K¿¦IVcåEêU‡Ô ð ¢jÙ¦]5U½Pû®”¯gÒä{Bó¾î@Gù>"_·•ÂéÿÖá' Ø£4µþy'_Ó”\W×­é}~ÝV}ðemwîÉÚÁwªùÓ¿´¾K½ôàäÉåòu›Uù +yb™z= D²/—ª×4åWtKõ’ƒc¢e£‹±vj¶~s‹z= D⯓¯iÊïÄ4Ø®^rpL8ýßåk7‹€Ÿï S>+_×ÔýEwŒS/58Èþ¶b¬_€ìç€=lºóiõš@‰$Ï>dMïõk›º-ÿü¿çûCè´ì§çêµûçþTãîÉ&=¨/ø•|]S7Õ«‡¿U½Äà xí\ýúýS *¼ò,õº@ɤáNë 9^¾¶©^/f|S½¼à¨úM¿—¯ß?ÇðÒ»r/t±Æ½Óäk›ºøµbÀëøÈ{Í¿ð£ò5üç^R¼îÚ½Vv„W|M¾¶© _'î¿F½¤à𻂦íùþs /)œõ}õú@ ¥ÞVë ~ƒ|}Ó¾WŸw¶z9Áañºkåkø¥1¼$oà1Ö& õA ÅkçÈ×7í[þØ÷Zùꥇկÿ¹|¿4€¿ˆoö¢»„3¿#_ß´—õ=Ô&ϬU/!8Î?ÿ}úµü’þ¢úu?S¯”Uäq³ ëÕ£yïv`_¤»67oA/_Ï/‰à/ò†½¹yW7 ;¤Û×7?jR¯sêxÑâ~êeƒhÜ}IñÖ6À+K6Þ¥^+(û½ ö_´ûÂk¾§^.(‰ðª¯Ë×ó_ư›¸9º[´t˜|S.Æ¥~Ñ’¸yýõšþËv“?æ=]òœ{R_ðKùZ§Ý\ú9kãºz‰ $â Kåkzw1´S²õAõšAÙ¥© ¯þùZ§——]¸‰Ã]©~ãïäëzw1´÷‡¹¥—.`·âÈ—Y¾Þé…²Ÿjò¶?ºš?ê¯åk{w1´“?ú]]¾€ÝJâæÍeÔk¾Òõêaë7ü†_¡Ë%O¯Ò¯ïvbØCÙä‚!@W7mºCö¥rùo'€=”ÝÏÈMš4¯5¯^÷UÊþ6~ö‹nåz‡|·Àž^†žØ|Qò-Ò|KZ½þË^0íL›ÛÕO7J,Ù|Ÿ|ï)€W)~üõBeoIgoM«×óún+'ªŸbT@}a«|½ï)€W)œýCõBE%O­h¾ ¥Þe*¸øÓ6Ýö˜ú©EEø£ß%_ó{ŠàUòÅo‚!“š-ÍCK½\ÏüFÛ¸ç2õÓ‰ I¶¬‘¯ûW‹ e÷rdÒÄFK‡ó‘ÀÞÔû@[¿þ6 v¨ŸETL}a›~ý¿J (»‰P„ÿ¢ðÇP¾œ¨×~ÍŸUfw_ü1ïÑïƒW‰ #õ9ĦáNõzšªi¬šb½A¯×ï‹¢üWže“-÷«Ÿ)TXòôÝú½Ð:X㮋Õk xQê=këóÚ|‹[½7 QßCm}îÿØtۣ꧰õk¢ßˆ ƒù~T½¦€WHwlhÞ³Þ´ö¬æ¾ñöæ÷#ø=? £ZoàÑò½Ñ‘:Qö,PDéΧ›_:*â=Ç»¼>7ßæ¹‰k÷£p«§ë÷HcèDÙ[®@‘eßv–¶þùï“ï—.­ï¡ÍÛô6î»ÂÚºQÿ™vSÏÐï—ÆÐÙk4‚öŸy @²kÜ×çŸc½sOps¿ {³ gý§˜emä«ÿœ@‡>’3­ûË÷NGcèdÜ5 ÎIS›¤þ³û&ެ7ä8ùÕ™:[¯6Ùúà>® @’Fó®eÙ¥r³/fÐñ'|ø…³¶öz¯dß„öǾ×—}¡ùQD´l”×ͳéöÇÕÿb Ò_þ3Š`/ª/ø•z­¹IýçšoÉg7'ʾyŸÕ¸fó/û¿þßâ ·7/À“Ý¿À&±úa¹ .>M~61ä7ð˜æo=H6ß×|wX}61äTcÍ õš@xõ·äg@Žñe@@úü“Ö´½F~&1ä\ö™( ºê×ÿ\~1ʾ- ¨¦4|¾ù“VõYÄ ¨í›îxB½Ñ­ƒô瀮ìêj€ ÞõoÈñò3ˆ@Xv÷µ´¾K½9j¬œ(? P´|¬z-ò’¦ÖónùÙÃP€ü'Y›&ê% ÈA¼vŽüÜ銺¨æ-Kåÿ¯ÿóÿ^~ætE ]T0ñTõ²t³Æ½—ËÏ›®Š  ãÂ@Pbqdý‘'ËÏš®Š  .ý¼zyºIcÅòs¦+cèâ’'ïP¯Q@WkÖ;÷ùÓ•1tqÁÔ3ÔËÐÅ¢%ƒåçKWÇÐ %O.W¯U@IƒÖp”ülé꺡`Ê¿¨×+ ‹Ôoú½ü\鎺©xýmê5 ØG©Ùb½~‡Ëϔ› .ùŒzÝöQ8ëûòó¤»bèÆâõKÔk°—’§VXÓk?ùYÒ]1tcÁäÓÕë°7ÒÄúüƒüéκ9Þ÷DËÏ“ŸÝ@7çÿP󿇾ø7àuòó£»cȡƚêõ è pæ·åçF1ä7ümÖ6Bõš¼ŠxÃRkzõŸù ùÇJÿÐËF©×5`O’†õÏûÛêœKwŒKk»zœªHÙómÓ`»zyÚ-%?+ò,Z5Å«™GÇêR…êóª^߀ÝH·=VÚ+þµWcõŒ­5oè›êêR‰Z{Údójõ:¼TšØà¢ëψœ‹^°¾æyÏsêR•‚IŸR/uÀKD· •Ÿ Šâg¾¥æ_têjõ©RÕÓÕë`­MžyÀšÞÉÏ…¼Ë>î°I2º\ö…êS¥¼¡'Z[7êuÕGÖ÷~ù™ ÈwJöøQ-˜üÏ?V?˜ªU¿þ꥕V_ØZÝ3hî²?Á?Öv :âu¦uùªÜ7Þ¥^ÿPIÙë¯i;@ˆŠVO¬µÔ2ÞÈ·óEÀœó/ø€µI¬ÞP-ÐúcÞ#?dõÚÏ&Ï?qSíÏü ?6Wþ *W€|ÕçŸ#í7²ŸPþÚnÔõ>ÈÆÏÜŸý×ÿþí/\àƒä¶ªõ>Ð&›îQïp^êo³Þð·ê_×[ôE‹zg’O×^m«õô†üÕõ®jÙUlä«÷¸+‰m0å³ò×sS€ü'YìœVë(è §î굪~àU­>ïÇêíΪÏ;[þ:nŠPÛkl¼þ¶­ÖÚ×wxh~0â¤s循õêaãuóÔ{œÝ>RÿÞRŒêKGdý9­S‡ó£€Z­‡7ü­w«ÿUÍx4W €Nˆ˜Õ¼Ö½úõÛ ðª¯[Ç¿­í­ímµ#½Áoܤþ‡T5ü‡¬ëê=n|ã¿Ï!ò×mS”+̆»&Öö•ù}í83à˜êPU«_ûõ¾€BK·?n½Áo”¿^›ä;Å&Þ³×Zk{ֺŽÖO2^÷¼úVÕ÷]©Þ_PHi°ÝúcÞ-6(˜ø ›ìÚ4ÇZ{`­+ymµãÍ c7ªÿU½k`òÌê}ÅG6¸ø4ùk´)@á•geoû_Ðî¥~÷Õ¶ßÔŽð†œp¯úZÕßr¦þsêíÅ&6œñMùk³Q×ÚÓÖ÷‹mýo­»50âí}vµöä:9L>ÝÚ¤¡Þv •¦6œóßò×d#Îz¢m‡Dê?tYòƼ7N‚ç·[k·•­Æ¦ûž¦}¹L;³<ÍøF=œõý]á¼³Ÿ­/ê³>ºû’ÅÉú¥£lÝÿ†µödõ¹ ¨UÛÿ”‘w”9ÓIEND®B`‚‰PNG  IHDR ü›ÉXì pHYsèèµ{Rk IDATxœìÝwØgu}çÿ (bÆ%1‰ébÔM¢1Q×Ä5Ũ)–˜]ה͵n*i¿¬){Ï 3Ã0âФ7A@E•2t‘¦ a¤0Ôaøžo?ç½×ÜlüY@¦ÜŸïû[ëzþ÷»v÷úÝç|ΜÃËûþ€Q«ë¨\ƒë>½sv‹ÎñïŽjÿWEkùNÑú?? ¥V­zIÔ÷^}—bpÙÁÑš[”þ.#©PËwŠê€WGç„÷Dïœeóß³6}×€,?ö3³£ûh n9;zk–Fû¨ß4ìÓØVíõ£Q?ðì;˜0ý‹÷MŸ‘4â–ïíc~kþÌ:X»fþûŒ‚Á ¯®c¸î«Ñ;wE´}C´?%ÿ#¬ô$µ?úÓÑl¸=ûî&Tÿ½Òßk$%¶ø)Ñ>ìMÑ;oe ×}mþû”`ðÀ¨1¸å¬è|öFkçd•¶ öþ?Í£÷dßEÀ„럷"ýýFÒ˜´ê£sÊÿŠÁÚs"ã?ŽÁÛdpÛ…ÑýÜ_Fkå ó?¤J[Qûà×EÓ~0ûV¦Dïì¹ô÷IcÖª—D÷´¿‰á_É>¢˜l±ºýpô/;8ªý_•ÿÁTÚ†:‡½)šî#Ù·0ezgþkúûޤñ¬Zýòè¿GÔ­û³*&”Á›­¾çÊèœôÇÑZºcúÇQi[ëó¶ˆ~;û¶¦Tïô¿Kï‘4Æíöôèœüg1¼÷šìã € cðÀ“ÜzA´?þöhÍ-Êÿ*-@ã~7bÐ;µ€iÖ4Ñ;õ¯Òß$íC~5×.¢®³O.&€ÁOhpéQðšôžÒBÖ=ùO"êaöíÌ‚¦‰îgÿ<ý=HÒdTôºÜ|FöÉÀ˜3øàñ£ßaoJÿÈ)-tÝÏýEDã-ŒPSG÷¤¤¿IšœªC~%k×dŸ^Œ)ƒ?¾exï5Ñ>ò­é5¥õÎü×ì[ ˜Uõ0:ÇÿAú{‘¤Éª}ì;cøÀ7²O0ÆŒÁQWF÷ó­ÅOIÿ)•¨wƇ²o3`Ö {Ñ9ú7Óß$MXKž:ÿÝ®î<’}Š0& þfY]GÿŠ#¢µâyù/¥Í-ŠþÅ«³ï4€yM÷‘hìóß•$M^«^ýk>}Œ0 þfTýàZ¾W30öÛ7ûVøMu´÷}Eþ;“¤‰¬ýñ·G½áŽì£ €D³¦®£wÑ>ÑÚíé(¥¢c¿KöϾÛWóðmQíùÃùïN’&³åωþWÌ>ÊHbð0Cê÷Dû˜·å””Jý¾²_öíð}Õ÷ßÕ/ʇ’4±uŽWÔÕÙÇ#fð0#×}&Z»¿ ýC¤T4¿Ù˜ õ—FµìYùïR’&·=8ß<7û8`„ þ¦Ý°Ý/ýïüÒHÆ~dßq[d¸vM´–>-ÿJÒä¶xûè¿GD]giŒ€ÁÀ´ÿ ßÃÞ”ÿÑQ*ÝÜ¢\vpö-°UWŸ­¹íòß­$MtÞuwcö‘@aSjxÇW¢õáJÿÐ(ä7û]z`ö-°Mú—~,ÿýJÒÄWí»K ¸9ûH  ƒ?€)Ô¿ö¤híöŒôŒÒ(ê_ðáì[`AôÏ]–þŽ%i Zñ¼ÜzAö‘@!S¦wÁžþ f¦þ«²o9€Õ;õ¯Òßµ$MA»==מœ}¤P€ÁÀ´¨‡Ñõ4CõÏÙ-û®Xxõ0:ǽ3ýKÒ4·]ô¾²ö©À3ø˜õ :'ÿiþGDiDõ¾øOÙw@9ýv´y}ú»—¤é¨ç4 0U þ&Ý Þ“þáPU½/ü}ö]P\Óº/ÚûüTú;˜¤é¨û¥ÿ}¬°@ þ&Ù ícý™ÍN½Óþ&¢i²ï<€‘¨ï»>ªÝŸ—þ.&i:êžùoÙÇ Àà`’ÿŒï‰ïKÿP(ªî§ßÑÔÙwÀH o=?ZKŸ–þN&i:ê·2ûX`üL¢ºŽÎgþGúBiTuŽ{çüÈ` ®>!Zs‹ÒßÍ$MG½‹öÉ>ÖØ¨û¹¿Hÿ0(ªÎáoŽè·³o;€TýóV¤¿ŸIš’æ¶‹þUŸÈ>ÖØJ¦wþù¥Õ>àÕÑtξíÆBïÔ¿LO“4%-Ù!k×dklƒ?€ Ò¿ú“óÿ Üô‚Òjô§£yôÞìÛ`|Ôƒèý[éïk’¦£jå bxÿMÙ'[Èà`B n»(ZKwLÿ(¢j¯fÃÙ·ÀØiºçzö{›¤é¨úèÏD]=˜}´° þ&@ýÈ]ÑZõ’ô€Ò(ªöxaÔ÷ߘ}ÛŒ­æ‘»¢Úó‡Óßß$MGí¿=¢®³66“ÁÀ¸ô¢}èÓ?üI£¨Z¾SÔë®È¾ëÆ^}÷•ÑZöÌô÷8IÓQïÜÙÇ›Éà`ÌuOý«ô~ÒHÚíé1¼õ¼ì[`b ®;9Zs‹òßç$M~sÛÅà_Ê>ÖØ c¬õ‰ùû¤Q´ø)1¼áÔì[`âôÖ,Χ“4U«^õ£ë³5ž„ÁÀ˜ª7Ü­ÏKÿÐ'onQ ¾zdö-0™š&ºŸ|_þ»¤©¨}ì;³O5ž„ÁÀ8ª‡Ñ>â×Ó?ðI£¨ÿå}²ï8€ÉÖoGû _J¿“4õ/?4ûTàû0øC½óW¥Ø“FQÿœ¥Ù·ÀTh6ÜÕ/JÏ“4ùUËžõƒ·dk<ƒ?€13¼ï†h-Ý1ýÞTºÞi“}»L•áíEkéÓÒß÷$M~í£~3ûHà üŒÛŸò=ôéô¤ÒuŽ{çüõÀÂ|íèôw>IÓQÿªOdi<ƒ?€1Ò»äÀôyRéÚ¿.¢_eßnS«÷…H÷“4ùU«^uõ`ö‘Àw1øõÆ{¢µìÙéò¤’µW¿<šêìÛ `ºÕÃèóÛé&¿îçþ2ûDà»üŒ‰ÎÉ–þO*YµÇ £~ðæì[ `&4ÝG¢½ßÏ¥¿ JšðoÃ{¯É>Òø6c`x×ÑšÛ.ÿžT¨jÙ³¢^wEö­0SêûoŠj÷祿JšìÚÿìã €ocð0Ú‡½)ýÃTô ~Ãç²o3€™4¼åÌù÷²ôwCIÝàæ3²3þƒ?€dƒëOIÿ`'•lpÅaÙ·ÀLë­Yœþn(i²küºì£ €ÿÇà S]GuÀ«Ó?ØI¥êù/ÙwMcÞ–þŽ(i²Üô…ìÓ ƒ?€\ý«OLÿP'•ª{»çÿ£ùšöCQ}ä'Òß%MníC^Ÿ}”`ð¨Dµúéꤵþåˆ~;û.àÛÔë¾­¥;¦¿3JšÜßøRöQ0ó þ’ô¯ùtú:©DÕÞ/‹æÑ{³o1ÇàªcÓß%Mn£~#û˜yIªƒ_ŸþNZèªåÏŽúž¯gß^|ÝS>˜þþ(irúöÊà ÁðŽKÒ?ÌI ÞâícxãiÙ·OfÐöA¯Í”4‘u?÷¿²O1€™fð sü»Ò?ÌI Ýಃ³o-6S³áö¨Vîœþ.)iÛíQWdc3Ëà`ÄêGÖEkÉSó?ÌI Xïô]³o-¶ÐpíšùßÖžýN)iòê}e¿ì# `füŒXïœeé䤅¬sÔoDÔƒì[ €­Ð?oEú{¥¤É«}Ð/e_3Ëà`”êa´özYú9i¡j¯~y4퇲ï,¶VÓD÷øw¥¿_Jš¼†w_•}‚Ì$ƒ?€|ã‹é⤅ªÚýyQßSömÀ6j:Gõ‘OÏ”4Yõ¾øOÙÇÀL2ø¡Î§ÞŸþ!NZoÛ¾}K°@ê».‹Ö’òß7%MLÕž?Q×ÙÇÀÌ1ø•~;ZËwJÿ'-DýKȾ£X`ý ÷Lß”4Y ï¼,ûè˜9#2¸î³éअ¨û¹¿È¾(¡i¢sÌÛÒß;%MN½³þ-ûä˜9#Ò9ñ}éà¤m­}è¯F {Ù·…4­û¢úð¥¿JšŒÚûþlö±0s þFaÐóç|5ñUþÁh6®Ë¾›(lxëyÑZ¼}ú{¨¤É¨~è›ÙÇÀL1øÁÚsÒ?¼IÛÔÒ£¾óÒì[ €é­Yœÿ.*i"|õˆì# `¦üŒ@÷KÿœþáMÚ–Wž}0JM#ß’þ>*iüë~ê¿eŸX3Åà`ªý^™þáMÚÚz§ïš}  y䮨Vîœþ^*i¼«V½8¢®³,€™aðPX½ñžhÍ-Jÿð&mMÃß1ìgßF$Þøyß5$=iÃõ×gW3Ãà °þµ'¥p“¶¦j¯‰¦µ>û Yï‹ÿ˜þŽ*i¼\ùñì£ `füÖýâ?¥p“¶¸¥O‹ú®Ë²oÆÁ°íƒ^›ÿ®*ilë}þo³O*€™aðPXuð/§p“¶´Áå‡dß:Œ‘桵Q­xNúûª¤ñ¬}Èë³)€™aðPR¿­%;¤p“¶¤îÉš}ç0†6ýÉÎìwVIcÚÒ#†ýìc `&ü4¼ëòümÒÔ>àUý*ûÖ`Lu?ù¾ôwWIãYýàÍÙGÀL0ø(¨ÅéڤͭZñܨ¼%û¶`Œ5‡£ÚëGÒßa%_Ã?Ÿ}D̃?€‚º§ÿ}ú‡6i³š[Ãë>“}Ë0†·œ9ÿ™þ.+i¬ê_´wöñ0 þ jù_Ò?´I›Sï¬Ͼ]˜ ½Ïÿmú»¬¤ñª{ÊÿÌ>šf‚Á@A­=ý‰£ÞQ³o&I¿í}6ýVÒøÔ9ê7²O&€™`ðPÊ ­ÅÛ§h“¾_ÕªGóè=Ùw ¨¾ûkÑZ²Cú»­¤ñ¨½ÿ+³%€™`ðPÈð›Ó?²Iß·¹íb¸öìì[€ Ö?oEþû­¤±¨ÚýùÙGÀL0ø(dpó™éÙ¤ïWÿÜåÙ· “®©£sø›Óßq%G›þÜ7eüÒ¿âˆôlÒÕ9ê7æÿ£ l«úÁ[¢Zþìôw]Iù5ßš}$L=ƒ?€Bzçï‘þMz¼ªU/ŽfãÝÙ·SdpÅáéï»’ò«ï½&û8˜z…t¿øÿ¥`“¾§¹íbxËYÙ·S¨{Â{òß{%¥VßqqöQ0õ þ éœü§éؤï®î²ì[€)ÕT÷Gµê%éï¾’òÞrföQ0õ þ i÷»éؤo¯sä["š:ûÖ`Š ¯ÿlúû¯¤¼ל} L=ƒ?€BÚG¼%ý›ôU+wŽfãºìÛ€Ðý䥿KÊipÍ'³ €©gðPHûÐ7¤`“æ›[Ã>—}K0#šê¨V½8ÿ}XÒÈ\ó©ì#`êüRôÚôlÒ¦z§ïš};0c6~²ß‡%¾ÁµŸÎ>~¦žÁ@!Õ¯NÿÀ&µ÷eD¿};0ƒº'¼;ý½XÒh\{RöÑ0õ þ ©öÝ%ý›f¼eÏŒú¾ë³ofTóè½Q­|Aþû±¤‘eðPžÁ@!Õ¾?›þM³ÝàŠÃ²ofÜàªãÒß%.ƒ?€ò þ 1øSfÝß›} À¼ÎqïLO–4š þÊ3ø(ÄàOYU{¾4šöƒÙ·Ìk6ÞÕîÏK_–T>ƒ?€ò þ 1øSJsÛÅpíÙÙ—?|‡Á׎Êg–T<ƒ?€ò þ 1øSF½/þcö¥«sÌÛÒß›%•Íà <ƒ?€B þ4êÚûíÑog_úð¸šë¢ZñÜô÷gIå2ø(Ïà ƒ?´¥O‹úž«²/{ø¾—šÿ-©Xåübð§QÖ¿p¯ìKž\ÓDçÈÿ’þ-©Låübð§QÕ9ìMõ0û’€ÍR?ðh-Ý1ý}ZÒÂgðPžÁ@!EÕŠçD³áöì˶HÿœÝÒß©%-|åübð§Q4øÚÑÙ—:l¹a/Ú¾HS—Á@y…ü©tãÞ™}™ÀVÞz~´æ¥¿_KZ¸ þÊ3ø(ÄàO%«V¾ šGïɾÌ`›tOþ“ôwlI —Á@y…ü©dƒ«O̾Ä`›5ÕQíñÂô÷lI “Á@y…ü©TOü~öå fðÕ#Óßµ%-Låübð§mú­Mk}öå §i¢sä[Òß¹%m{åübð§ ®;9ûÒ€WßS´–>-ý½[Ò¶eðPžÁ@!Z躟þïÙ—5Ó;{.ýÝ[Ò¶eðPžÁ@!Zø?å{_öe å ºÑ^ýòôwpI[ŸÁ@y…üi!ó±€Y0üæ¹Ñš[”þ.iëò  <ƒ?€B þ´PuŽûÝìËF¦ûé÷§¿‹KÚº þÊ3ø(ÄàO Qµûó£yôžìËF¦yôÞ¨V<7ý\Ò–gðPžÁ@!ZˆW“})ÀÈõ¿üÑôwrI[žÁ@y…üi[ëó¶ìËrÔƒhïÿóéïæ’¶,ƒ?€ò þ 1øÓ¶T-ß)š ·g_Æf¸vMúû¹¤-Ëà <ƒ?€B þ´-õ/=0û€tÝÞ“þŽ.ió3ø(Ïà ƒ?mmíC^ÑÔÙ—0¤k6Ü­eÏLW—´yü”gðPˆÁŸ¶ª%;D½þºìËÆFoÍ’ü÷uI›•Á@y…üikꟳ[ö¥ ã¥ßŽjïKg—ôäü”gðPˆÁŸ¶´ö¾¯ˆt³/];›FDÙïí’ž<ƒ?€ò þ 1øÓ5·] o¿(û²€±Õ9ú·òßß%}ß þÊ3ø(ÄàO[R﴿ɾd`¬Õ믋֒§¦¿ÃKzâ þÊ3ø(ÄàO›[õáЦ³!û’€±×ûÂß§¿ÇKzâ þÊ3ø(ÄàO›ÛðÆÓ²/W˜›þsÕ/J——ôøü”gðPˆÁŸ6§î ïξT`¢ ®8<ý}^ÒãgðPžÁ@!zÒ–=3š wd_ª0Yš:Ú½6ÿ½^Ò÷dðPžÁ@!z²ú|8û2€‰Tßqq´æ¥¿ÛKúÎ þÊ3ø(ÄàO߯ö~»D ûÙ—)L¬Îñþ~/é;3ø(Ïà ƒ?=as‹bøÍs²/Q˜hõƒ·DkÉùïù’¾•Á@y…üé‰êžôÇÙ—'L…Þçÿ6ý=_ÒÿŸÁ@y…üéñª–ïÍÆ»³/O˜ MuT+ž“þ¾/é± þÊ3ø(ÄàOWÿÒ³/M˜*ýó÷Hß—ôXåübð§ï®ý±_Œ¨‡Ù—&L—A'ª½~4ý½_’ÁÀ(übð§ïhnQ o» û²€©4¸êØüwI#`ðPˆÁŸ¾½î§ßŸ}IÀôjšhôKéïÿÒ¬gðPžÁ@!úV»=#š ·g_’0Õ†·ž—ÿ @šñ þÊ3ø(ÄàOÿQÿÜåÙ—#Ì„ÎqïLÿ Íråübð§MU{ýhD¿Ê¾`&Ô÷ß­%OMÿ Íjåübð§MùÈ £Õ;õ/Ó¿H³šoaåübð§Î¿ž}ÀÌiZ÷Eµ|§ôïÒ,fðPžÁ@!3Þâí£¾çëÙ—!̤þ¹Ëó¿ H3˜Á@y…üÍvÝS>˜} ÀÌjzFµÇ‹Ò¿H³–Á@y…üÍnÕ²gE³ñîìKfZÿËû¤#f-ƒ?€ò þ 1ø›Ýúçì–}ùƒNT{ýHúwi–2ø(Ïà ƒ¿ÙlÓŸ jº³/?`ÓæïòCÒ¿H³”Á@y…üÍfƒË;ô€ÿP£½úåéß ¤YÉà <ƒ?€B þf¯ö¾¯ˆ¨Ù—ðmW—þÍ@š• þÊ3ø(ÄàoöÞøùìËønMí^þÝ@š… þÊ3ø(Äào¶êþæìKxÃë?›þí@š… þÊ3ø(Äào†š[õ]—g_rÀišhüËùߤ)Ïà <ƒ?€B þf§î‰˜}¹ObxËYéߤiÏà <ƒ?€B þf¤ÅÛG}ßõÙ—°:G¾%ÿ[‚4Åü”gðPˆÁßlÔýÌÿȾԀÍTßyi´æ¥O¦5ƒ?€ò þ 1ø›–ìÍCß̾Ԁ-Ð9öùߤ)Íà <ƒ?€B þ¦¿Þé»f_fÀªï½:ZsÛ¥W¦1ƒ?€ò þ 1ø›ò–=3šGïɾ̀­Ðýäûò¿-HS˜Á@y…üMw½³þ-û¶R½þ:¿åO*Á@y…üMoÕŠçFÓ~0û¶A÷„w§c¦-ƒ?€ò þ 1ø›Þúç­È¾¼€mTßsU´æ¥g¦)ƒ?€ò þ 1ø›âßî×y8ûò@ç¸ßMÿÖ MSåübð7õÏ]–}i ¤^÷U¿åOZÀ þÊ3ø(ÄàoúªV<Ço÷€)Óùøï¤s¦%ƒ?€ò þ 1ø›¾zk–d_VÀ«ï¼$ý›ƒ4-ü”gðPˆÁßtU-ß)šöCÙ—P@ç¨ßHÿö MCåübð7]õΞ˾¤€B†·9ýÛƒ4 ü”gðPˆÁßôT-{V4ÕýÙ—PPçˆ_Kÿ!Mzåübð7=õÎú·ìË (l¸vMú7iÒ3ø(Ïà ƒ¿)i·gøí~0#:‡½1ÿ[„4Áü”gðPˆÁßtÔ;ýï²/%`D†7)ý[„4Éü”gðPˆÁß´ä©Ñ<|[ö¥ŒPûÐ_Íÿ&!Mhåübð7ùuOþ“ì˱᧥“&5ƒ?€ò þ 1ø›ðæE}ï5Ù—0jMí_“ÿmBšÀ þÊ3ø(Äào²ë÷»Ù—dðõO¤›&1ƒ?€ò þ 1ø›ì†·_”} Yêa´÷ùÉôïÒ¤eðPžÁ@!“[ç°7e_>@²þÅû¦£&-ƒ?€ò þ 1ø›Ü†7~>ûò²õ«¨VîœþBš¤ þÊ3ø(Äào2kï·KDÓd_>Àè=—þ­Bš¤ þÊ3ø(Äào2\~Hö¥,¤a?šë¢¾ï†¨ï¼4†·œƒk>ƒ+þ—÷‰Þš%ÑûÂ?D÷³ÝßûuŽy[tŽzëãwìÛûÿî¤?Žî)œÿ?£wƇ¢ÞŠè_°*—ÃëO‰áíE}ÿMÑt6dÿÿ `+4­û¢µÛÓÓ¿WH“’Á@y…üM^›þLOôÛÙ—°9šú±!ß]—Çð†ScpÙAÑ[³x~¸·iŒ×>àÕQ­zq´æ¥ÿ+= IDATã[-Ù!ªÿÐüÿÛ:Gÿft?ógÑ?wy ¾~|Ôw^2?(ÆOïÔ¿Ìÿw„4!ü”gðPˆÁßäÕ;ëß³/à»G}náÚ³cpÙÁÑûâ?Eç¿íMÿÎZú´ô;”¨Zþìhøšèÿ®è}éŸcðµ££¾çªùßT䨼%Z‹·Oÿw‚4 ü”gðPˆÁß„µd‡ùß$ö£¾÷ê\uìüÈ­ó‰ßöþ¯ŒÖÒóÿ0.-Ùá±!àÉ2ÿ§ˆ‡k×DÓ~0û'3£{âæÿ{@š€ þÊ3ø(Äào²ê~ú¿g_20šÎÃ1¼õ¼è_¼ïüŸ´mì¦ö·õ¢ê#?Ý“þ8Wõý7fÿx`jÕw]žþÜ—&!ƒ?€ò þ 1ø›¬êuWd_20ušöC1¼é Ñ[³dþOñV{ÿXú3Ú«V½$º'¼g~PYß}eD=̾ `jtŽ|Kú³^÷ þÊ3ø(ÄàorêþŸ³/˜|Mõ½×ÄàòCûÍ}›þ-4·(ý9?ëU»??ºŸúo1øúñþ0l£á7¾˜þl—Æ=ƒ?€ò þ 1ø›œ†×}&ûr€ÉÓÔQßóõùß$×9þ¢Z¹sú3]OÒâí£sØ›¢Áª¨×_›}Àäišhðêügº4Æü”gðPˆÁßdTíý2ê6SóÐ7cpÙÁÑ=þ]Q­|Aús\Ûúï ‹Þéõ—d_Z01W—þ —Æ9ƒ?€ò þ 1ø›Œúç¯Ì¾T`l5½GcxéÑ;í¯£ýÑŸNn«\í}~*zkG}ß Ù—Œ·aþ<˜ýì–Æ5ƒ?€ò þ 1ø›€–>-šÖúìKÆJóÈ]1¸ì èó¶ùgeúóZ#¯ý±_ˆþE™¿€ïµé9™ý¼–Æ5ƒ?€ò þ 1øÿºŸ~öec¡^môÏ]íƒ~)Zs‹ÒŸÑ“æ¶‹ÎÇ'†7žÑÔÙ—)Œ¦ópTËž•ÿ¬–Æ0ƒ?€ò þ 1øÿê;.ξL uä×[³$Úûí’þLÖøWíùÒèñ¡h¹3ûÒ€±Ð;í¯ÓŸÏÒ8fðPžÁ@!ã]ûÀ×d_"0rõßxläçß)ÚÚ–ìÝOý×ÞvAöå ©êûoô›‘¥ÇÉà <ƒ?€B þÆ»Áå‡f_"0Mõ@ô/=0Ú‡üJúóWÓUûÀÿƒ«OŒ¨‡Ù—9¤èóÛéÏciÜ2ø(Ïà ƒ¿ñ­Zñ܈^+û€rêA o85:ŸøýùßÈ–ýìÕt×þèOÇàŠÃ"†½ì+FjxÓÒŸÃÒ¸eðPžÁ@!ã[ïô¿Ë¾< ˆæ¡µÑ;ëߣúð¥?o5{U{¾4ú}$šÞ£Ù·ŒFÓD{õËÓŸÁÒ8eðPžÁ@!ã[½þÚìËN=˜ÿj£Þ­¹íÒŸ³RµòÑ?w™á3¡ÉéÏ^iœ2ø(Ïà ƒ¿ñ¬}ȯd_° šÎÃÑ¿xuT{¿,ýù*=^ÕÊ£ÁªˆA7ûv€rúUT»??ý¹+Kåübð7ž ®8<ûÒ€mRßóõè~æÏ¢µtÇô窴9µ÷ùÉ|ýøˆ¦Î¾} ˆÞÿ1ýy+Kåübð7~UËžMwcö¥[exÛ…Ñ9öÑš[”þL•¶¦ö~?ƒk>•}+À‚k¾5Z‹·OÖJãÁ@y…ü_ÝÏþyöe[¦ibxÓéÑ9ìMéÏQi¡êý›QßcöÝ ªó‰ßKÆJãÁ@y…ü_õ_ɾ,`ó4u o85Ú½6ýù)iÉS£wú®~û2ScøÍsòŸ¯ÒdðPžÁ@!ãU{ßWd_ð䆽\yL´W¿<ýÙ)¢jÏ—Î_ó0 Ú¼*ýÙ*egðPžÁ@!ãUÿËûd_ðĆýè_²TþÁôg¦”Qçèߊúþ›²ïDØ&ƒ+K¦JÙü”gðPˆÁßµd‡hªû³/ ø^Mƒ«OŒö>?•ÿ¼”²[ú´èŸ»<¢dß™°uúí¨V¾ ÿ™*%fðPžÁ@!ãS翟}9À÷~óœhôÚôç¤4nµ?ö‹Qß{uö- [¥w濤?K¥Ì þÊ3ø(Äào|\wröåßR¯¿.º'¾7ýù(uKž½3>1ìeß²°Eš ·GkñöùÏR))ƒ?€ò þ 1øªÝŸ1èf_Í#wF÷”úÀÒÔ>àUQßýµìÛ¶Hç˜ßN†JYü”gðPˆÁßxÔýÜ_d_ ̺~õØŸv[ºcúsQšÈ–ìýó÷ˆhêì»6ËðúSòŸŸRRåübð7Õw\œ})0Æ7žÕÞ?–þ<”¦¡Î¿ÍÆuÙ·5<¹zÕž/MvJü”gðPˆÁ_~í}~*¢i²/fЦQR÷¤¤? ¥i«Úã…1¼é Ù·8<©Þš%éÏM)#ƒ?€ò þ 1øË¯ÎnÙ—³¦DÿâÕQ-vúsPšÚæEïô]#†½ì;žPóÈÑZü”üç¦4â þÊ3ø(Äà/¹¹EÑ<´6û2`† o¿(Úûÿ|þ3Pš‘Ú½Ö¿÷kOü^úóRuåübð—[çÐ7d_̈¦ý`t?ûçócóìçŸ4kU»??†·œ™} ÀãÚôg賟•Ò¨3ø(Ïà ƒ¿Üú—} 0†·œÕž?œþÜ“fºÅÛGÿ‚UÙÇ|¯¦Žê#?žÿ¬”F˜Á@y…ü%6·]4×e_L³A'zg|hþ™“þÜ“4_÷“ѯ²OøýóvOFJ£Ìà <ƒ?€B þòêù–ì?S¬¾÷êhðªôç¤ï­}àk¢yøÖìc¾¥yôÞh-yjú3RUåübð—øañ²ƒ³üL£zýóVø¶Ò˜Wíñ¢ÞvAö‰ßÒ=ñ½éÏGiTü”gðPˆÁ_R‹ŸMk}ö€)³é7†uÿÏùÏ9I›×’bpÕqÙGÌ®=;ÿÙ((ƒ?€ò þ 1øË©sôoeÿè˜2ƒ¯Õ²g¥?ã$mas‹¢Áªì#"š&Ú«&ÿÙ( ƒ?€ò þ 1øKú¨øµ£²ôL‹A7z§ïšþl“´mu?ûçõ ûD`Æõ/Ú;ý™("ƒ?€ò þ 1øKhÉÑ´ÌþÑ0šGîŒöÁ¿œÿl“´`¿ºénÌ>Z˜aMõ@´–î˜þL”JgðPžÁ@!£¯sìÛ³ìLá-gFµrçô皤…mÓˆ·iÝ—}Ä0cšëbxý)Ñ;ëßüS3‘Á@y…ü%|PüêÙ?v&YÓDÿ‚UÑZ¼}ú3MR™Ú«_͆;²O¦TÓ{4†·]ý‹WG÷¤D{¿]ÒŸ}Ò¨3ø(Ïà ƒ¿·x{¿±€­¶éO}vOxwþóLRñª½_õƒ7g;Lºzõúkcpå1Ñ;}×hì£5·]úsNÊÎà <ƒ?€B þF[çð7gÿȘPõú뢽úgÒŸe’FWµçK£¾ïúìã€IÑ4QßS ®:ö±qß!¯ÖÒÓŸgÒ8fðPžÁ@!£­ñ¾Ù?r&P}ÇÅQ­Ü9ý9&iôU{¼(껯Ì>†CMçáÞrVôÖ,‰Î±ïðïEi 2ø(Ïà ƒ¿6·(š ·gÿȘ0›þC”ßÌ"ÍvÕŠçΘ]MïÑÞvaô/^Ý“>íývI>I“œÁ@y…ü®öA¿”ýã`Âô/Ú;ZsÛ¥?Ã$åW-v oÿrö±À( ûQ¯ûj .;(ºŸù³hïÿÊh-Þ>ýY$MSåübð7ºúçížýã`R4Mô¾ôÏéÏ.IãUµ|§¨ï¼4û„`5×Åð†S£wƇ¢s袵Û3ÒŸ9Ò´gðPžÁ@!£«¾ï†ì7“`ÐþÜ’4ÆÞwÝÙ'[©é<Ã[Ίޚ%Ñ9öQíñÂôg‹4‹ü”gðPˆÁßhj¯þ™ì5 ©ˆö¡¿šþÜ’4ÞU+wŽúÞk²,žDÓ{4†·žý ÷Šî‰ïjï—¥?C$=–Á@y…ü¦Þÿ1ûG À˜kZ룽ÿϧ?³$MFÕ/ŠzýuÙGÿ¡F½þÚ\yLôNßõ±?Í»d‡ôç…¤ÇÏà <ƒ?€B þFÓpíÙÙ?jÆXóè=ÑöL–´…U{¾4êoÉ>ÂfÒ¦ówðõã£÷…xlÜ·Û3ÒŸ ’6?ƒ?€ò þ 1ø+_µ|§ˆa/ûG À˜j½7Úûý\úóJÒdV}ä'æGÔÓt6Äð¶ £ÁªèûŽùß²š}þKÚ¶ þÊ3ø(Äà¯|Ýß›ýc`œ³ß~»¤?«$Mv›þxÓy8ûH˜Ã~Ô뮈þÅ«£{Òû·ÚÜ¢ô³^ÒÂfðPžÁ@!#ø€øµ£³ÌŒ¡æ‘;£½ÏO¥?§$MG#~-bÐÍ>Ú&K=Œzýµ1¸ò˜è¾ëcšwÉégº¤òü”gðPˆÁ_áæ¶›ÿSðíš wûIZðºŸ|_DSgqc«Ù¸.†7œ½5K¢sÔ[£µì™ég·¤œ þÊ3ø(Äà¯líƒ_—ý#` ³_õ‘ŸHFIšÎ6ý†*"šêþÞô…蟳4:Ǿ=ª=^˜~FKŸ þÊ3ø(Äà¯lýsvËþ0FšöCÑÞÿ•éÏ'IÓ]ÿ‚UÙÇÀhõ«Þ~Qô¿¼Ot?õ_£½ÏO¦ŸÅ’Æ;ƒ?€ò þ 1ø+[}×eÙ?bÆÅ ÃÞ”þl’4Ímç?bÓ«F}ïÕ1¸âðèžòÁhøšh-~JþÙ+i¢òo%€ò þ 1ø+WµòMý#`4utOxOú³IÒ µÛÓ£¾óÒìÓ`›5×Åð†S£·fItŽ}GT»?/ÿŒ•4ñü”gðPˆÁ_¹ºŸ|_ö€1Ñ;}×ôç’¤Ù«úðF³áŽì#`³5ÝGbxÛ…Ñ¿xutO|oT«^œ~–JšÎ þÊ3ø(Äà¯à‡Ã+Ïþñ0úç.O&IšÝÚþ§ˆ^+û(ø^Ã~Ôë¯Áå‡D÷¤D{¿]¢5·(ýÜ”4ü”gðPˆÁ_¹š‡oÍþñlpÕ±þõ¤ô:ÇÿÁüŸÈÔ<´6W3ÿ›;‡¾!ZKŸ–~>JšÝ þÊ3ø(Äà¯LíÕ/ÏþÑlxóÑZü”ôg’$mªwæ¿d‹À ÙôçÄ7iz_úçèñkQ-vú9(IßžÁ@y…ü•iÓo,`vmú-¯ÕÊÓŸG’ô­æÅàšOfÀjºÄð¶ £ñêèžøÞ¨V½$ÿÌ“¤'Éà <ƒ?€B þÊ4¼ñ´ì-YúíhìÒŸE’ôÝUËžõúk³OI`’ ûóçÈàòC¢{Ò¢½ß.ÑšÛ.ý|“¤-Íà <ƒ?€B þ ´ä©ó¿á€ÙÔýäå?‹$é j¯þ™h:²J`B4­Á•ÇÌÿûΡoˆÖÒÓÏ1IZˆ þÊ3ø(ÄàoáëöÆì+Iúíþ’¤'«ó‰ßhšì#3Í#wÆàº“£wƇ¢sįGµ|§ôóJ’JeðPžÁ@! _ïì¹ì+ †k×DkñSÒŸC’´9õÏ[‘}l‰šîÆÞvaô/^=ÿ§y«üxú¹$I£Ìà <ƒ?€B þ¾á-geÿX±æáÛ¢Z¹sú3H’6»ÅÛÇðæ3²O`ݨï¼$ú—ì??îkïûŠhÍ-Ê?‡$)1ƒ?€ò þ 1ø[à–ìѯ²¬ŒÒ°íýbþ3H’¶°jE³q]ö) ,¤¦Žú¾ëcpå1Ñ;í¯£}ðëæßS³ÏI· þÊ3ø(ÄàoaëöÆì)#ÖûÒ?§?$ikëþæˆz˜}”[©Ùxw o85zk–DçØwDµòéçŠ$MBåübð·°õÎþ?Ù?RFhxÛó3ûù#IÛRÿœ¥ÙÇ)°šîÆÞvaô/^ýØŸæÝo—ôóC’&5ƒ?€ò þ 1ø[؆·œ•ý#`DšÎ†¨ö~Yú³G’¶¹¹íb¸öììcøvõ êõ×ÎÿiÞî)|lÜ7·]þy!IS’Á@y…ü-`Kvˆèµ²¤ŒH÷ÓïÏöHÒU­zq4Þ“}´ÂÌj6®‹Á5ŸŠÞé»FçÐ7Dk·§§Ÿ ’4Íü”gðPˆÁßÂÕ9ìÙ?NFdÓÊ~îHÒB×9æ·#š:ûˆ…©×l¼;†7œ½5K¢sì;¢Z¹súý/I³–Á@y…ü-\½3ÿ5ûÇ À4ÜÕîÏKîHR‰ú_þhö1 S¥énŒá7Ïþ«¢{ü»¢ÚëGÒïsI’ÁÀ(übð·p oü|ö€Òš&:G½5ý™#IÅZºcÔë¯Í>ma2 ûQ¯û¿ìÝy°åuyçñ¡A£–Æ,.ItŒšÅD'‰YŒ[2ã:SSC,ì&ƘEMÜ’Q³ÜnvA6i€ (»€‚6i‘-lMsÏzÏù}§hjj&uïí>çüÎsŸßé~½ªÞÿ#ßÛç)Ÿê{mé_uDéžöç¥}ÈËÊüܪü?×’¤EüÄ3øbð7¥æv*Uû¡ìç ØÂuŸÍ¿9’Üã#¥²ÐÉþÈ…Æ«6ßýįæ=ÿc¥sÔkËüîOMÿó+I-ƒ?€xA þ¦øEØ®Uí‡Kkßç¤ßIZ‰zç4ûc¥êä¥[þV÷ô?—’¤©eðÏà ˆÁß”¾$¼î³ÙO @ á®Þ2~ɾ7’´’µöþ–¿Ý¶kÃ…2¼ÿƲ°þøÒ;ûOüjÞ5ONÿó'IŠÍà žÁ@ƒ¿é4|ð{ÙO @”áBiþòô[#IuO{gö§0LÕð¡[Ë·>Wzç|¨´zM™ßý©éÎ$I+ŸÁ@<ƒ?€ õkíûœìg PÿòƒÒo$e6øÎÙÅ0‘ª³© 6\Xz­)v-­}ŸþçI’ÔŒ þâü1ø«_礷e?#AªÇî-­½ž™~k$)³Ö~?åWûÒ|½ù2ØxYé_qpéžúŽÒ>ä¥e~n§ô??’¤ffðÏà ˆÁ_ýú—î—ýŒéžöçéwF’šP÷K™ý‘ ÿÏp¡ ï½¾,\sÔ–ŸÍöa¿\æWïœþçD’4;üÄ3øbðW¿Áí—d?#†|·Ì¯Þ%ýÎHRS|ïÜìfvPÕæ»Ëàæ³žøÕ¼Ç½©Ìïþ´ô?’¤ÙÎà žÁ@ƒ¿šÍ­*U÷Ñìg @çsoÍ¿3’Ô Z¼ TÝÍÙÏlçªÎ¦'~5ï¥kKç„]Kkßç¤ÿìK’¶¿ þâü1ø«Wû—f?!†?¸ºÌÏí”~g$©iuÏ|oöG4Û“A¿ ï¾¶ô¯8¸tO}Ç–ÿåþJ’V"ƒ?€xA þêÕ=íÙO@€Î±oH¿1’ÔÈæv*ƒï=ûcšY4”á½ß* ×]ºgüuiö+e~õ.ù?Ó’¤2ƒ?€xA þêÕ¿êðì'`Ê·žŸ~_$©Éµ~I) Ýìk®Ú|wÜ|Vé]´æ‰_ͻפÿìJ’ô3øˆgðÄà¯^ÿÊG¶#UUÚG¾2ý¾HRÓë_²gö'6 Ru-ƒ—=ñ«yOþýÒZûÜôŸQI’¶–Á@<ƒ?€ 5Zód³ Àvfá¦Óòï‹$ÍB»=¥ ü^öÇ6úí2¸ã¥ùA¥û…?.íOþlþÏ£$IcfðÏà ˆÁßäµ?ýŠìç`ÊÚë^•~_$iVê|æ¿lù›QÙŽ exÿeaýñ¥wöJç¨×–ùÝ~(ýgO’¤ºüÄ3øbð7yÝ3ß“ý|LÑ`ã¥é·E’f­…õÿ’ýñÍU›î( 7~±ôÎûû-ƒÎÖOOÿ“$)"ƒ?€xA þj|1xõ‘ÙÏÀuN|Kúm‘¤Y«µï³KÕz0û#œ Tí‡ËàÖóJÿ’=JçÄß)­µÏMÿy’$i¥2øˆgðÄàoò†w]™ý|LÉðï–ù¹Ué·E’f±î™ïÍþg[ý'~5ï5ëJ÷Ôw”ö!/u÷$I;tñ þ‚üMØêKé·²Ÿ€)é~é¯òo‹$Íjs«Ê𮫲?ÊùÿTßVÖ_zg tŽzm™ßí)ù?'’$5(ƒ?€xA þ&ëñ¿€íC5¿!„$Õ¬ýéW”R ³?ÒwHÕæ»Ëàæ³Jï¢5¥s®¥µ÷¥ÿ[zg½o˯Hž_ó¤ô÷”$i{Íà žÁ@ƒ¿ÉªæïÏ~:ꪪÒ>ø%é7E’¶«VïR†÷};û¾ñªGP7^z|¼tŽ}CiíùÃùo'IÒ”Á@<ƒ?€ ã×Úï'³Ÿ €)l¸0ý¦HÒöXç¸7eÄ7JÕÙT·}µô¿¶wé|î­¥µßO¥¿‘$I;zñ þ‚üŸÿ€ °}èœô¶ô›"IÛkƒ›Ï*;¤áBÞcYX|éžñîÒ>ä¥e~nUú{H’¤ŸÁ@<ƒ?€ ã×;ûƒÙÏ@MÕæ»Ëüš'¥ßIÚ^kògJôÊŽpOnøBéýÒ9êµe~÷§¦ÿ»—$IÛÎà žÁ@ƒ¿ ¾¼f]ö³PSï¢Õé÷D’¶÷úW\¶·qßà;g”Þ…ÿ¸åoýníõÌôÇ’$i² þâü1ø¿Á—g?uTÃÒ:àé÷D’¶÷Z{ÿh©Z–YTõ+ƒ—m-vO}Ç¿š·ÿN%IÒt2øˆgðÄàoüªÎ#ÙÏ@ ƒ[ÏO¿%’´£ôø¯ºm¼áBÞcYXü–Þö¿^æçV¥ÿ»“$IqüÄ3øbð7^­ýŸ—ýdÔÔý§ßIÚaZó¤2|໥1ªª ¸¥,\Âã¾u¯*ó»ýPþ¿'I’´¢üÄ3øbð7^Ïþ·ì' †ª³©ÌïþÔô{"I;R“Þ–÷¹ÿؽepóY¥wÑšÒ9a×ÒÚçYéÿ>$IR~ñ þ‚üWïœg?5,\ýéô["I;\s;•áW„ÆWÝÍepû%¥é~¥ûùß-­þcþÿvI’ÔÈ þâü1øóËÀkÎ~2jèýÛé·D’vÄ:GÿÖt?Ðý2¼û›[†ÜÝÓßUÚ‡¼¬Ì¯Þ9ý§$Iš þâü1ø¯ÁÆK³Ÿ € U›î,ós«Òo‰$í¨ n>sòÏðÍw?ñ«yÏÿXéõÚ2¿ûÓÒÿ÷H’¤ÙÍà žÁ@ƒ¿ñªæïÏ~2&Ô¿ì€ô;"I;ríƒ_RÊpa›Ÿ×Uç‘2Øpaé]´¦tNص´ö}vú?»$IÚ¾2øˆgðÄàoôZ{=3û¹¨¡}į¥ßIÚÑ[¸öèÿáÜ›/ƒ—•þ—î©ï(íC^ZæçvJÿç”$IÛwñ þ‚ü^ûÓ¯È~.&4|ð{éwD’ôJkÿç•…«,ÝÓÿ¢´ý¥2¿zçô&I’´ãeðÏà ˆÁßèu¿ø§ÙÏÀ„ú—®M¿#’$I’¤fdðÏà ˆÁßèõ/Ù#û¹˜P{Ý«Óïˆ$I’$©ÙÔAŽ IDATüÄ3øbð7Æ7œ’ý\L š¿¿ÌÏ­J¿#’$I’¤fdðÏà ˆÁßè ïYŸý\L`áÚ£Óoˆ$I’$©9üÄ3øbð7bs;•ª÷Xös0ΉoÉ¿#’$I’¤ÆdðÏà ˆÁßhµÖ>7û©˜ÄB·Ìïþ´ô;"I’$IjNñ þ‚üV{Ý«³Ÿ € nûjú ‘$I’$5+ƒ?€xA þF«û…·g?èÿ±ô"I’$IjVñ þ‚üVï«ÿœýTL }į¥ßI’$IR³2øˆgðÄàoÄ/¿yLöS0¦ªõ@™Ÿ[•~C$I’$IÍÊà žÁ@ƒ¿ÑÜ~qöS0¦…oŸœ~?$I’$IÍËà žÁ@ƒ¿ÑªÙ˜ýTŒ©wÖÿJ¿’$I’¤æeðÏà ˆÁß­yR)ÃAöS0¦ö¡¿”C$I’$IËà žÁ@ƒ¿m×:ðÅÙÏÀ˜ªÎ¦2?·*ý†H’$I’š—Á@<ƒ?€ Û®sÌ볟 €1 n9'ý~H’$I’š™Á@<ƒ?€ Û®{êŸe?cê]øOé÷C’$I’ÔÌ þâü1øÛv½ ÿ1û™Óã;köý$I’$53ƒ?€xA þFøðê#³Ÿ €qTUiíõÌôû!I’$Ijfñ þ‚üm»Á-gg?c>pKúí$I’$57ƒ?€xA þ¶Ýð¾og?cXøÖIé·C’$I’ÔÜ þâü1øÛvUç‘ìg` ½óþ>ývH’$I’š›Á@<ƒ?€ [¯µÇÓ³Ÿ€1uŽy}úý$I’$57ƒ?€xA þ¶^ûS¿ýDŒ£ªJkïM¿’$I’¤æfðÏà ˆÁßÖëûÆì'` Õ¦;Óo‡$I’$©ÙüÄ3øbð·õº_ü“ì'` ƒ[ÏK¿’$I’¤fgðÏà ˆÁßÖëûwÙOÀú—”~;$I’$IÍÎà žÁ@ƒ¿­×¿ì€ì'` Ý3Þ~;$I’$IÍÎà žÁ@ƒ¿m|ùwý ÙOÀ:Gÿvúí$I’$5;ƒ?€xA þ¶Þ`Ã…ÙOÀZû<+ývH’$I’šÁ@<ƒ?€ [oxß ÙOÀˆªÖéwC’$I’Ôü þâü1øÛzUëÁì'`Dû®J¿’$I’¤ægðÏà ˆÁßVZó¤Rª*û‰Ñ §äßI’$IRã3øˆgðÄàoùZû?/ûyCÿÒµé·C’$I’Ôü þâü1ø[¾öa¿’ý<Œ¡{æ{Òo‡$I’$©ùüÄ3øbð·|ãÞ”ý<Œ¡óÙÿš~;$I’$IÍÏà žÁ@ƒ¿åëžòGÙÏÀÚÿ|úí$I’$5?ƒ?€xA þ–¯÷å÷g?£ªª2¿ÛSÒo‡$I’$©ùüÄ3øbð·|ý‹wË~FTµH¿’$I’¤ÙÈà žÁ@ƒ¿åë_yXöó0¢á}7¤ß I’$IÒldðÏà ˆÁßV¾øûöÉÙÏÀˆ.L¿’$I’¤ÙÈà žÁ@ƒ¿åÜvQöó0¢…õÿ’~7$I’$I³‘Á@<ƒ?€ Ë7¼g}öó0¢þe¤ß I’$IÒldðÏà ˆÁßòU|?ûyQïÜ¤ß I’$IÒldðÏà ˆÁßòUG²Ÿ€u¿ðöô»!I’$Iš þâü1ø[¦¹U¥TÃìç`DãÞœ;$I’$I3‘Á@<ƒ?€ K×ÚëG²Ÿ€1´?ýé·C’$I’4üÄ3øbð·t­O¼0ûiCû“?“~;$I’$I³‘Á@<ƒ?€ K×>üåÙOÀZ{ÿXúí$I’$ÍFñ þ‚ü-]ç˜×e? £ªª2¿zçôÛ!I’$Iš þâü1ø[ºÎçÞšý4Œ¨êlJ¿’$I’¤ÙÉà žÁ@ƒ¿¥ëžúŽì§`DÕ#ßO¿’$I’¤ÙÉà žÁ@ƒ¿¥ëžùžì§`DÃ{Ö§ß I’$IÒìdðÏà ˆÁßÒõÎýHöÓ0¢Á÷¿ž~7$I’$I³“Á@<ƒ?€ K×ûê?g? #Üz^úÝ$I’$ÍNñ þ‚ü-]ÿk{g? #ÜtzúÝ$I’$ÍNñ þ‚ü-]ÿòƒ²Ÿ€-|ëséwC’$I’4;üÄ3øbð·Ì—~׬Ë~F´píÑéwC’$I’4;üÄ3øbð·Ì—~ëÿ%ûiQÿŠO¥ß I’$IÒìdðÏà ˆÁŸ/ýf]ÿÒµéwC’$I’4;ùî žÁ@ƒ¿¥ÜrNöÓ0¢ÞEkÒï†$I’$iv2øˆgðÄàoé·_’ý4Œ¨wþÇÒï†$I’$iv2øˆgðÄàoé†?¸:ûiQïÜ¿K¿’$I’¤ÙÉà žÁ@ƒ¿¥ÞwCöÓ0¢Þ9J¿’$I’¤ÙÉà žÁ@ƒ¿¥«¾-ûiQï+›~7$I’$I³“Á@<ƒ?€ KW=voöÓ0¢ÞYïK¿’$I’¤ÙÉà žÁ@ƒ¿¥«ºf? #êžùžô»!I’$Iš þâü1ø[º2\È~FÔýÒ_¥ß I’$IÒìdðÏà ˆÁß­yRö³0†îéïÊ¿’$I’¤™Éà žÁ@ƒ¿Åµözfö³0†î©–~;$I’$I³“Á@<ƒ?€ ‹kíó¬ìg` Ý/þiúí$I’$ÍNñ þ‚ü-®µö¹ÙÏÀº§½3ývH’$I’f'ƒ?€xA þ×Úï'³Ÿ€1tOÿ‹ôÛ!I’$Iš þâü1ø[\kÿçg? cèžñ×é·C’$I’4;üÄ3øbð·¸Ö/È~ÆÐ=ó½é·C’$I’4;üÄ3øbð·¸Ö'^˜ý,Œ¡÷å¿I¿’$I’¤ÙÉà žÁ@ƒ¿Åµ|qö³0†ÞÙL¿’$I’¤ÙÉà žÁ@ƒ¿Åµú¹ìg` ½s?’~;$I’$I³“Á@<ƒ?€ ‹kü’ìg` ½óþwúí$I’$ÍNñ þ‚ü-®ý©_Ì~ÆÐ»àãé·C’$I’4;üÄ3øbð·¸ö¡ÿ)ûYCï¢Õé·C’$I’4;üÄ3øbð·¸öa¿œý,Œ¡ÿõ}Óo‡$I’$iv2øˆgðÄàoqíÃ_žý,Œ¡ùAé·C’$I’4;üÄ3øbð·¸ö¿žý,Œaáê#Óo‡$I’$iv2øˆgðÄàoqíO¿"ûYÃÂúãÓo‡$I’$iv2øˆgðÄàoqí#_™ý,Œaá†SÒo‡$I’$iv2øˆgðÄàoqí£^“ý,ŒapóYé·C’$I’4;üÄ3øbð·¸ÎÑ¿•ý,Œa°á‚ôÛ!I’$Iš þâü1ø[\çèßÎ~Æ0ØxYúí$I’$ÍNñ þ‚ü-ίô˜-û¯M¿’$I’¤ÙÉà žÁ@ƒ¿Åµ?ýÙÏÀ†ÿöôÛ!I’$Iš þâü1ø[\ûð—g? c¨½+ývH’$I’f'ƒ?€xA þ×>äeÙÏÀªî£é·C’$I’4;üÄ3øbð·¸öÁ?Ÿý,Œ£–ù¹Ué÷C’$I’4üÄ3øbð·¸Ö/Ê~ÆÔÚó‡Óï‡$I’$i62øˆgðÄàoq­ýŸŸý,ŒéñÏîìû!I’$Iš þâü1ø[\kís³Ÿ€1µÝ3I’$IÒˆüÄ3øbð·¸ÖÞ?–ý,Œ©}ä+Óï‡$I’$i62øˆgðÄàoq­=Ÿ‘ý,Œ©sÜ›Óï‡$I’$i62øˆgðÄào‰v{Jö³0¦îç7ÿ~H’$I’f"ƒ?€xA þ–hõ.ÙÏÀ˜º§¿+ÿ~H’$I’f"ƒ?€xA þ–®TUöÓ0†Þ9N¿’$I’¤ÙÈà žÁ@ƒ¿¥+ƒ~öÓ0†þ%{¦ßI’$IÒldðÏà ˆÁßÒ•~+ûiCÿª#Òo‡$I’$i62øˆgðÄàoéªÎ¦ì§` ß>9ývH’$I’f#ƒ?€xA þ–®j=ý4Œa°áÂôÛ!I’$Iš þâü1ø[ºjó=ÙOÀ†÷\—~;$I’$I³‘Á@<ƒ?€ KW=òýì§` Õ#Óo‡$I’$i62øˆgðÄàoé†÷ߘý4Œ¡ê=–~;$I’$I³‘Á@<ƒ?€ K7¼ëªì§`Lókžœ~?$I’$IÍÏà žÁ@ƒ¿¥Ü~qöÓ0¦ÖÚŸH¿’$I’¤ægðÏà ˆÁßÒ n>+ûiSû—¥ßI’$IRó3øˆgðÄào™/ý¾uRöÓ0¦Îgþsúý$I’$5?ƒ?€xA þ–ùÒïÚÏd? cê~þ÷Òï‡$I’$©ùüÄ3øbð·tý+Î~ÆÔûòûÓï‡$I’$©ùüÄ3øbð·tý¯íý4Œ©Éé÷C’$I’Ôü þâü1ø[ºÞ…ÿ˜ý4Œiášué÷C’$I’Ôü þâü1ø[ºÞÙÌ~Æ4øÎé÷C’$I’Ôü þâü1ø[ºî—þ2ûiÓðÎM¿’$I’¤ægðÏà ˆÁßÒuOù£ì§`LÕ÷§ßI’$IRó3øˆgðÄàoé:'ìšý4Œ«ßJ¿’$I’¤ægðÏà ˆÁßÒuŽy}öÓ0ÖOO¿!’$I’¤fgðÏà ˆÁßÒµüÍì§`íOþLú ‘$I’$5;ƒ?€xA þ–®}ÈK³Ÿ€ ´zMú ‘$I’$5;ƒ?€xA þ–®õ‰ŸÎ~&Ð9émé7D’$I’Ôì þâü1ø[ºÖ>?žý4L wÖûÒoˆ$I’$©ÙüÄ3øbð·Lkžœý4L ÿµ½óoˆ$I’$©ÑüÄ3øbð·|¥7Ÿý<ŒiáºãÒï‡$I’$©ÙüÄ3øbð·|Õ¦;³Ÿ€1 6\~?$I’$IÍÎà žÁ@ƒ¿åÞû­ìç`LÃûoJ¿’$I’¤fgðÏà ˆÁßò n¿$ûySÕÙ”~?$I’$IÍÎà žÁ@ƒ¿åÜtzöó0ÖOO¿!’$I’¤æfðÏà ˆÁßV¾ø»ö3ÙÏÀÚÿ|ú ‘$I’$57ƒ?€xA þ–¯ÙþÙÏÀ:Ǽ>ý†H’$I’š›Á@<ƒ?€ Ë׻ಟ€ t¿ø§é7D’$I’ÔÜ þâü1ø[¾î™ïÍ~&Ð;ÿ£é7D’$I’ÔÜ þâü1ø[¾îÉý<L ŧÒoˆ$I’$©¹üÄ3øbð·|ãÞœý<Làñÿp“}C$I’$IÍÍà žÁ@ƒ¿åkñëÙÏÀ†w]™~C$I’$IÍÍà žÁ@ƒ¿åkøâìç`Õæ{Òoˆ$I’$©¹üÄ3øbð·|­½~$ûy˜DU•ùÝž’~G$I’$IÍÌà žÁ@ƒ¿­4·ª”á û‰˜@û“?›G$I’$IÌà žÁ@ƒ¿­WµÊ~"&Ð9öé7D’$I’ÔÌ þâü1øÛzÇnÍ~"&Ð=ý]é7D’$I’ÔÌ þâü1øÛzÃ\ýDL ñné7D’$I’ÔÌ þâü1øÛzƒ[ÎÉ~"&°pÝqé7D’$I’ÔÌ þâü1øÛÆ—×—ýDL`pÛEé7D’$I’ÔÌ þâü1øÛzýK×f?>´!ý†H’$I’š™Á@<ƒ?€ [¯w·³Ÿ€I ze~nUú‘$I’$5/ƒ?€xA þ¶^÷ oÏ~"&ÔÚï'Óïˆ$I’$©yüÄ3øbð·õ:Ǿ!û‰˜P{Ý«Òïˆ$I’$©yüÄ3øbð·õÚ‡¼,û‰˜P÷”?L¿#’$I’¤æeðÏà ˆÁßÖkíûìì'`B½ó?–~G$I’$IÍËà žÁ@ƒ¿m4·S)ƒ~ö30…«Ì¿#’$I’¤ÆeðÏà ˆÁß¶«6ß“ýLL`°á‚ô"I’$Ij^ñ þ‚üm»á=볟 € Ú~C$I’$IÍËà žÁ@ƒ¿m7¸õ¼ìg`Ã…2¿z—ô;"I’$IjVñ þ‚üðàú㳟 € µ|Qú‘$I’$5+ƒ?€xA þ¶]ÿÒý²Ÿ € uŽ}cú‘$I’$5+ƒ?€xA þ¶]ïÜd?êžñ×éwD’$I’Ô¬ þâü1øÛvÝ/þIö30¡þ×÷I¿#’$I’¤feðÏà ˆÁß¶ë÷¦ìg`B ß>9ýŽH’$I’š•Á@<ƒ?€ Û®}è/e?þàêô;"I’$IjVñ þ‚üm»Ö¾ÏÉ~&&TµH¿#’$I’¤feðÏà ˆÁßÍ­*eÐÏ~*&ÔÚë™ù·D’$I’Ô˜ þâü1ø­ê‘ÙOÀ„Ú‡¿<ýŽH’$I’š“Á@<ƒ?€ £5¸ãÙOÀ„º'ýÏô;"I’$IjNñ þ‚üø%à·OÎ~*&Ô;ÿ£éwD’$I’Ôœ þâü1ø­þed?Z¸öèô;"I’$IjNñ þ‚üVïœe?|ÿkéwD’$I’Ôœ þâü1ø­îç7û©˜Pµùîô;"I’$IjNñ þ‚üVûÈWf?“ªªÒÚãéé·D’$I’ÔŒ þâü1ø­ÖþÏË~*jhö+é·D’$I’ÔŒ þâü1ø±Õ;—2\È~.&ÔýüïåßI’$IR#2øˆgðÄàoôªMwf?ê]ðéwD’$I’ÔŒ þâü1ø½Á—g?Zøæ±éwD’$I’ÔŒ þâü1øã‹ÀNÉ~.&4ØxYú‘$I’$5#ƒ?€xA þF¯ÿ³Ÿ € UÝ—~G$I’$IÍÈà žÁ@ƒ¿Ñëóáìç †ÖžÏH¿%’$I’¤ü þâü1ø½îÉ¿Ÿý\ÔÐ>üWÓo‰$I’$)?ƒ?€xA þF¯½îÕÙÏ@ Ý“ÿ ý–H’$I’ò3øˆgðÄàoôZû??û¹¨¡wá?¥ßI’$IR~ñ þ‚üÑê]J²Ÿ € -¬?>ÿ–H’$I’Ò3øˆgðÄào¼ªMwf?Þueú‘$I’$ågðÏà ˆÁßx 6^šýdL¨êlJ¿#’$I’¤ü þâü1øóËÀõÇg?5´ÖþDú-‘$I’$åfðÏà ˆÁßxõ/Þ-ûɨ¡sÌëÒo‰$I’$)7ƒ?€xA þÆ«{Ú;³Ÿ €ºg¾'ý–H’$I’r3øˆgðÄào¼:Ÿù/ÙO@ ýË?™~K$I’$I¹üÄ3øbð7^­^ýdÔ0¸åœô["I’$IÊÍà žÁ@ƒ¿1[½s)ƒ^ö³0¡êáÛóo‰$I’$)5ƒ?€xA þÆoøÐ†ìg`RÕ°ÌïþÔô["I’$IÊËà žÁ@ƒ¿ñl¸0ûÙ¨¡}Ø/§ßI’$IR^ñ þ‚üMð…à5Ge?5tOþƒô["I’$IÊËà žÁ@ƒ¿ñë]ðÙÏ@ ½¯Î¥ßI’$IR^ñ þ‚ü_÷”?Ê~6jX¸þÄô["I’$IÊËà žÁ@ƒ¿ñk¯{Uö³PÃðîkÓo‰$I’$)/ƒ?€xA þƯµö¹ÙÏ@½ù2?·Sú=‘$I’$ådðÏà ˆÁßd=>`vµö~ú-‘$I’$ådðÏà ˆÁßd ï¿1û騡sÜ›Óo‰$I’$)'ƒ?€xA þ&kðݯd?5ôÎþ`ú-‘$I’$ådðÏà ˆÁßdõ¯<4ûé¨aášué·D’$I’”“Á@<ƒ?€ “Õ;çÃÙO@ ƒ;¾‘~K$I’$I9üÄ3øbð7Y'û騡j?œ~K$I’$I9üÄ3øbð7YíOýBöÓPSkíO¤ßI’$IÒÊgðÏà ˆÁß„­yr)ÃAöóPCçØ7æßI’$IÒŠgðÏà ˆÁßäUß–ý|ÔÐûÊߦßI’$IÒÊgðÏà ˆÁßä n=/ûù¨¡Õé·D’$I’´òüÄ3øbð7yý+Í~>j|ÿëé·D’$I’´òüÄ3øbð7y½³?ý|ÔPµL¿%’$I’¤•Ïà žÁ@ƒ¿Éëÿß³Ÿ€šZû>'ýžH’$I’V6ƒ?€xA þ&¯ýÉŸÍ~>jêóºô{"I’$IZÙ þâü1ø«Ñê]Jô²Ÿ€zg½/ÿžH’$I’V4ƒ?€xA þê5|à–ì' †þ•‡¥ßI’$IÒÊfðÏà ˆÁ_½ßýJöPÃàö‹Óo‰$I’$ie3øˆgðÄà¯^ýËÊ~Bj¨»/ý–H’$I’V6ƒ?€xA þêÕ;ë}ÙO@M­}ž•~O$I’$I+—Á@<ƒ?€ õê÷æì' ¦Î1¯K¿'’$I’¤•Ëà žÁ@ƒ¿zµ>ñÂì' ¦Þ—ÿ&ýžH’$I’V.ƒ?€xA þj6·ª”…Nö3PÃÂ5ëòï‰$I’$iÅ2øˆgðÄà¯~ÃûoÊ~FjÜqyú-‘$I’$­\ñ þ‚üÕoð3²Ÿ€ªî£e~n§ô{"I’$IZ™ þâü1ø«_ÿÒµÙÏ@M­Oütú=‘$I’$­Lñ þ‚üÕ¯{ÚŸg?#5uNøé÷D’$I’´2üÄ3øbðW¿ö‘¯Ì~Fjê]ðñô{"I’$IZ™ þâü1ø«_kÏ.¥ª²Ÿ€®?1ýžH’$I’V&ƒ?€xA þ¦Sµùîì§ †á½ßJ¿%’$I’¤•Éà žÁ@ƒ¿é4¸í¢ì§ ŽA¯Ì¯yrú=‘$I’$ÅgðÏà ˆÁßtê_yXöSPSû—¥ßI’$IR|ñ þ‚üM§Þ—ߟý”ÔÔ=åÓï‰$I’$)>ƒ?€xA þ¦SçØ7d?%5õ/Ù3ýžH’$I’â3øˆgðÄào:µöû©ì§ ¦ÁwÎH¿'’$I’¤ø þâü1ø›^Uç‘ìç †êáÛÒo‰$I’$)>ƒ?€xA þ¦×ð®+³Ÿ€:ªª´ö|Fú=‘$I’$ÅfðÏà ˆÁß¿(¼î¸ìç ¦ö‘¿™~O$I’$I±üÄ3øbð7½zç4û9¨©û¥¿J¿'’$I}ûÂz IDAT’¤Ø þâü1ø›^ß’ýœÔÔ¿òÐô{"I’$IŠÍà žÁ@ƒ¿éÕ>è粟€š/M¿'’$I’¤Ø þâü1ø›b«w.e¡›ý¤ÔPu6•ù¹òoŠ$I’$),ƒ?€xA þ¦Û𾲟€šZŸøéô{"I’$IŠËà žÁ@ƒ¿iYøÅì' ¦Î‰oI¿'’$I’¤¸ þâü1ø›ný‹wË~Rjê}u.ýžH’$I’â2øˆgðÄàoºuOþýì' ¦ÇÿÃOö=‘$I’$ÅeðÏà ˆÁßtk곟€š†~/ýžH’$I’â2øˆgðÄàoÊ­Þ¥”…nö³PG5,­=žžS$I’$I!üÄ3øbð7ý†÷^Ÿý¬ÔÔ^÷ªô{"I’$IŠÉà žÁ@ƒ¿€/ ¯?1ûY¨©{æ{Òï‰$I’$)&ƒ?€xA þ¦_ï‚g?+5õ¯:"ýžH’$I’b2øˆgðÄàoúuNØ5ûY¨ipÇ7Òï‰$I’$)&ƒ?€xA þ¦_ë/Ì~Vjªº›ËüÜNé7E’$I’4ý þâü1ø hn§RuÍ~Zjjøâü›"I’$Išzñ þ‚üÅ4¼ó_³Ÿ€š:'½-ýžH’$I’¦ŸÁ@<ƒ?€ A_^{töÓPSÿâÝÒï‰$I’$iúüÄ3øbðSïœe?-5 n:=ýžH’$I’¦ŸÁ@<ƒ?€ 1uŽ}cöÓPSõðmé÷D’$I’4ý þâü1ø‹©µö¹ÙO @]UUZ{ÿhúM‘$I’$M7ƒ?€xA þâªæÿ-ûy¨©sÌëÒï‰$I’$iºüÄ3øbð×àö‹³Ÿ€šzç~$ýžH’$I’¦›Á@<ƒ?€ qõÿõìç ¦…ëOH¿'’$I’¤éfðÏà ˆÁ_\Ý3ß“ý¼Ô4¼ÿ¦ô{"I’$Išnñ þ‚üÅÕ>ê5ÙÏ @]ÃA™ßýié7E’$I’4½ þâü1ø‹«µç3J©†ÙO @Míu¯N¿)’$I’¤éeðÏà ˆÁ_lÇ6d?15õ¾üþô{"I’$Iš^ñ þ‚üÅ6¸éôì' ¦…k?“~O$I’$IÓËà žÁ@ƒ¿Øz­É~bjÞýÍô{"I’$Iš^ñ þ‚üÅÖùÜ[³Ÿ€º½2¿Û¥ßI’$IÒt2øˆgðÄà/¶Ö/Ê~b¦ }ø¯¦ßI’$IÒt2øˆgðÄà/¸¹JÕÙ”ýÌÔÔýÒ_æßI’$IÒT2øˆgðÄà/¾ÁÆË²Ÿ€šúW–~O$ýöî=úóý„‹µ‚híÛã´VÛ®ÌÒ33öxiÚ5=Ï=“Î,{ÆÎ´ væŒÓ®©é¬±=ÓI AÁ•K¼`D„  ˆoÑx J "(D ·Øæ÷Ý÷ýýœ•ä8­ ?’ìïû÷þ}÷~<Özþ¯ì¿÷F_ä÷÷$I’¤F2øˆgðÄà/¾ƒ#Úm|ßÎô{"I’$Ij&ƒ?€xA þâë}è5Ù3“TenÕñé7E’$I’4yñ þ‚üÅ×¹ä%Ù3 èlXš~S$I’$I“gðÏà ˆÁß´æ¤RêqöG À„zWŸ–S$I’$IgðÏà ˆÁßÂ4~ø®ì€ >óæô{"I’$Iš<ƒ?€xA þèD¼ýªì€ ¾ññô{"I’$Iš<ƒ?€xA þ¦þM™ýQ0¡º»¿Ì­\’~S$I’$I“eðÏà ˆÁßÂÔ½ü·³?jPÿÜô›"I’$Iš,ƒ?€xA þ¦êMÏÉþ¨h@ï}ÿ*ý¦H’$I’&Ëà žÁ@ƒ¿…«®Éþ¸˜Ðà“g§ßI’$IÒdüÄ3øbð·pîýdöÇ À„Fw]Ÿ~O$I’$I“eðÏà ˆÁßÂ5ع>ûã`BõÓï‰$I’$i² þâü1ø[¸z×üaöÇ @ªuÏN¿)’$I’¤cÏà žÁ@ƒ¿…«ó¶fÜ4 »yyúM‘$I’${ñ þ‚ü-`«N(eØÍþȘPûªü›"I’$I:æ þâü1ø[ØÆÜ’ý‘0¡ÑL¿'’$I’¤cÏà žÁ@ƒ¿þoÞ˜ý‘0¡zÿÞô{"I’$I:ö þâü1ø[Øú[ÿ$û# Õ"ý¦H’$I’Ž-ƒ?€xA þ¶Î¥/ÍþÈh@÷²—§ßI’$IÒ±eðÏà ˆÁßwæÓJ²?v&Ô¿ñ¿åßI’$IÒ1eðÏà ˆÁßÂ7ÞwGöÇÀ„†_y_ú=‘$I’$[ñ þ‚ü%üŠ·]žý±0¡ñÃw¥ßI’$IÒ±eðÏà ˆÁßÂ׿áuÙ;“ªëR­=%ý¦H’$I’Ž>ƒ?€xA þ¾î»+ûc ÝwüFúM‘$I’$}ñ þ‚ü-|ÕÙ?vèO† ÝúÛV¤ßI’$IÒÑgðÏà ˆÁ_Nõþ{³?z&4üÒeé÷D’$I’tôüÄ3øbð—ÓèŽdôLhü/§ßI’$IÒÑgðÏà ˆÁ_Ný­Ìþè˜ÔxXæÎxjúM‘$I’$]ñ þ‚üåÔݼ<û£ K^œ~S$I’$IG—Á@<ƒ?€ 9UëžýÑЀþuÿ9ý¦H’$I’Ž.ƒ?€xA þòª<˜ýñ0¡á—Þ“~O$I’$IG—Á@<ƒ?€ yîº>ûã`Bã}w¤ßI’$IÒÑeðÏà ˆÁ_^ƒO¬Éþø˜T=.ÕÚSÒoŠ$I’$éÈ3øˆgðÄà/¯î{ÿeöÇ@ºïü'é7E’$I’täüÄ3øbð—WuÞÏfü4 ÿ‘?O¿)’$I’¤#Ïà žÁ@ƒ¿Üê¿ùvö`BÃÛߟ~O$I’$IGžÁ@<ƒ?€ ¹ölÍ~L¨~ìé÷D’$I’täüÄ3øbð—[ûêì'@ªs~2ý¦H’$I’Ž,ƒ?€xA þrënþçÙO€t7½"ý¦H’$I’Ž,ƒ?€xA þr«Îýéì'@ú[™~S$I’$IG–Á@<ƒ?€ ùÕß½/û0¡Ñž­é÷D’$I’tdüÄ3øbð—ßèŽd?&TøNú=‘$I’$Yñ þ‚üå׿é/³Ÿ ¨Îû¹ô›"I’$Izò þâü1øË¯ûž–ý h@÷ŠW¥ßI’$IÒ“gðÏà ˆÁ_~ÕÙÏ*¥®³Ÿ|êé7E’$I’ôäüÄ3øbð·8ªûFöS`B£{nJ¿'’$I’¤'Ïà žÁ@ƒ¿ÅÑðö«²Ÿª»ß-s+—¤ßI’$IÒüüÄ3øbð·8êßøúì§@:oy~úM‘$I’$ÍŸÁ@<ƒ?€ ‹£î»ÿiöS ½«~?ý¦H’$I’æÏà žÁ@ƒ¿ÅQuÖ3J©ëìçÀ„Ÿ}KúM‘$I’$ÍŸÁ@<ƒ?€ ‹§ñ#_Ë~LhôÍϤßI’$IÒüüÄ3øbð·x~ùŠìçÀ¤U™[uBúM‘$I’$=qñ þ‚ü-žú7¼.û9ЀÎÛ^˜~S$I’$IOœÁ@<ƒ?€ ‹§î;ÿIös ½þ‡ô›"I’$Izâ þâü1ø[­”ñ0ûY0¡á®Mù7E’$I’ô¸üÄ3øbð·ø?ø•ìgÀ„ÆÝ™~O$I’$IŸÁ@<ƒ?€ ‹¯á—.Ë~Lª—jí)é7E’$I’ôÃüÄ3øbð·øê_÷§ÙÏ€tßõ›é7E’$I’ôÃüÄ3øbð·øê\úÒìg@úù‹ô›"I’$Iúá þâü1ø[„ñÔRFƒì§À„†·_•S$I’$I?”Á@<ƒ?€ ‹³ñ·we? &Tï¿7ýžH’$I’~8ƒ?€xA þgÃ[Þ‘ý4h@uÎO¥ßI’$IÒ÷gðÏà ˆÁßâ¬wíg? ÐÝôÊô›"I’$Iúþ þâü1ø[œu.þÕì§@úÛW¥ßI’$IÒ÷gðÏà ˆÁß"mõSJö²Ÿ}õºü›"I’$Iú¾ þâü1ø[¼¿usöó`BõÓï‰$I’$éû3øˆgðÄàoñ6øÂÛ³Ÿ ¨Þô¿¤ßI’$IÒßfðÏà ˆÁßâ­wÍf?лâwÒoŠ$I’$éo3øˆgðÄàoñÖÙ°4ûyЀÁ§ÎI¿)’$I’¤¿Íà žÁ@ƒ¿EÜÊ%¥îîÏ~"LhôõåßI’$IÒÿÌà žÁ@ƒ¿ÅÝèëÛ³Ÿª»ß-s+K¿)’$I’¤ÃüÄ3øbð·¸|êÙO€t6üƒô›"I’$I:œÁ@<ƒ?€ ‹»î¯Ê~"4 ÷Áÿ~S$I’$I‡3øˆgðÄàoqW­;5û‰Ð€áÍÓoŠ$I’$épñ þ‚ü-þê¿þVö3`Bã¿’~O$I’$I‡3øˆgðÄàoñ7ºãÙÏ€IÕãR­=%ý¦H’$I’ þ‚Á@ƒ¿Å_ÿ£oÈ~&4 ûîßJ¿)’$I’$ƒ?€…`ðÄàoñwp @ûõoúïé7E’$I’dð° þ‚ü-þªµO?ô« h·ÑžkÓoŠ$I’$Éà`!ü1økGã}wd?&TÏíK¿'’$I’$ƒ?€…`ðÄ௠¿tYöS ÕùÏM¿)’$I’4ëüÄ3øbð׎ú[ÿ$û©Ð€ÞU¿Ÿ~S$I’$iÖ3øˆgðÄà¯u.zQöS ƒ¦ßI’$Išõ þâü1økI«O,eÐÉ~.Lh|ÿòoŠ$I’$Íxñ þ‚üµ§ñ};³Ÿ “ ÊÜ™?š~S$I’$i–3øˆgðÄà¯= v®Ï~.4 ³ñ×ÒoŠ$I’$Írñ þ‚üµ§ÞU¿Ÿý\h@ÿ†ÿš~S$I’$i–3øˆgðÄà¯=u.x^ös ÃÛߟ~S$I’$i–3øˆgðÄà¯E­\Rêê‘ì'À„êý{óoŠ$I’$Ípñ þ‚üµ«Ñ×nÈ~24 Z÷ìô›"I’$I³šÁ@<ƒ?€ íjðñ3³Ÿ è^ñªô›"I’$I³šÁ@<ƒ?€ íª»yyö“ ƒOŸ›~S$I’$iV3øˆgðÄà¯]Uçüdö“ £{?™~S$I’$iV3øˆgðÄà¯}Õ}#ûÙ0©AUæV~S$I’$i3øˆgðÄà¯} ¿reö³ ·ÿ£ô›"I’$I³˜Á@<ƒ?€ í«Ã벟 èoý“ô›"I’$I³˜Á@<ƒ?€ í«ûŽßÈ~64`ø¥÷¤ßI’$IšÅ þâü1økag>­”ñ0ûé0¡ñÃ_Í¿)’$I’4ƒüÄ3øbð×ÎÆß¹-ûé0©º.Õ<ý¦H’$IÒ¬eðÏà ˆÁ_;Þ|iöÓ ÝM¯H¿)’$I’4küÄ3øbð×Îzü²Ÿ èo_~S$I’$iÖ2øˆgðÄà¯uÞöÂì§@F_»!ý¦H’$IÒ¬eðÏà ˆÁ_K[u|©û²Ÿª»ûËÜÊãòïŠ$I’$ÍPñ þ‚üµ·Ñ½ŸÊ~>4 sᯤßI’$Iš¥ þâü1økoƒçe?лæÓoŠ$I’$ÍRñ þ‚üµ·Þ•¯Î~>4`øÅ‹ÓoŠ$I’$ÍRñ þ‚üµ·êMÏÉ~>4`üí]é7E’$I’f)ƒ?€xA þÚ]ý7ßÎ~BLj<*Õš“ÓoŠ$I’$ÍJñ þ‚üµ»Ñžk³Ÿ è¾ë7ÓoŠ$I’$ÍJñ þ‚üµ»þMÿ=û ЀþGß~S$I’$iV2øˆgðÄà¯Ýu/{yö £;?˜~S$I’$iV2øˆgðÄà¯ÝUkO)¥g?#&TÏíK¿)’$I’4+üÄ3øbð×þÆÝ™ýŒh@õ濟~S$I’$i2øˆgðÄà¯ý ¿tYö3 ½÷ÿëô›"I’$I³Á@<ƒ?€ í¯¿õO²Ÿ |ö‚ô›"I’$I³Á@<ƒ?€ í¯sÑ?Î~F4`|ßÎô›"I’$I³Á@<ƒ?€ SÐêKt²Ÿ“öÊÜê§äßI’$Išò þâü1ø›ŽFßüLöS K_–~S$I’$iÚ3øˆgðÄào:|ö‚ì§@úùóô›"I’$IÓžÁ@<ƒ?€ ÓQïýÿ:û)ЀÑL¿)’$I’4íüÄ3øbð7UçÿBöS uõp™[¹$ý®H’$IÒ4gðÏà ˆÁßôTx0û9ЀÎú_J¿)’$I’4ÍüÄ3øbð7=¾z]ös ½üQúM‘$I’¤iÎà žÁ@ƒ¿é©ÿ±ÿ‘ýœhÀð–w¦ßI’$Išæ þâü1ø›žºïù?³Ÿ ?üÕô›"I’$IÓœÁ@<ƒ?€ ÓSuÖ3K©ÇÙO €IÕu©Îù©ô»"I’$IÓšÁ@<ƒ?€ ÓÕÁ? €öë¾÷_¦ßI’$IšÖ þâü1ø›®†»6e?)0Øq^úM‘$I’¤iÍà žÁ@ƒ¿éªÝÎ~R4`ôÍϦßI’$IšÖ þâü1ø›®:ÿjö“  Ã^™;ã©éwE’$I’¦1ƒ?€xA þ¦¬Õ'–2èd?+Ð}ǯçßI’$IšÂ þâü1ø›¾Æ÷íÌ~V4 ÿÑ7¤ßI’$IšÆ þâü1ø›¾;×g?+0úêué7E’$I’¦1ƒ?€xA þ¦¯ÞU¿—ý¬h@Ýy¬Ì­<.ý®H’$IÒ´eðÏà ˆÁßôչ೟ élXš~W$I’$iÚ2øˆgðÄào:«çöe?-ÐûÐL¿)’$I’4müÄ3øbð7îÚ–ý´hÀðKïI¿)’$I’4müÄ3øbð7õ·¯Î~Z4`üèÝé7E’$I’¦-ƒ?€xA þ¦³î¦Wd?-R­;5ý®H’$IÒ4eðÏà ˆÁßtVý¬Rê:ûyЀÞ¿“~W$I’$iš2øˆgðÄàoz?òµìç@Ÿ9?ý¦H’$IÒ4eðÏà ˆÁßô6¼msöó ãû¿~S$I’$iš2øˆgðÄàozëøµÙÏ €&Œeî̧¥ßI’$Iš– þâü1ø›Þ:—¼8ûyÐî»~3ý®H’$IÒ´dðÏà ˆÁß·ú)¥ {ÙO €ôoúËü»"I’$IS’Á@<ƒ?€ ÓÝøþ/d?10ºëúô›"I’$IÓ’Á@<ƒ?€ ÓÝàs²Ÿ ¨»ûËÜÊãÒïŠ$I’$MCñ þ‚üMw½«OË~b4¤óÖ¤ßI’$Iš† þâü1ø›î:Wʰ{Dÿ\0Øq^þþ–dðÏà ˆÁßìÖß¾:ûùÐñC{ÒïŠ$I’¤£¯:뙥{ÙËýï4£=['ú ‚Ùÿ}Ú’Á@<ƒ?€ ³[wÓ+³Ÿ ªÖ=;ý¶H’$Izâª5'—îÆe¥¿mEîÚTÆûv7úÏÛ7¦ÿwlKñ þ‚üÍnÕÙÏ*¥®³Ÿ é]õ{é·E’$IÒÿߪJgÃÒÒÛrzì\_ÆÜRÊxúÏÃ]•ÿß»%üQý÷º IDATÄ3øbð7Û½;û ÐáÍ—¦ßI’$iV«ÖZº›——Á§Ï-£½;JT ÿÏ»¯NÿëЖ þâü1ø›í†·]žýhÈø‘¯¥ßI’$iªÎzfé^öòÒß¾ºŒöl-õÜCe1}õÃémÚ’Á@<ƒ?€ ³]ÿïÍ~‚4¨:ïgÓo‹$I’4U­9©t7.+ým+Êpצ2Þ·»”º.‹ÑèëËÿëÕ’ þâü1ø›í:—¼8û РÞÕ§¥ßI’$©µ­:¾t6,-½-§—ÁÎõ‡5ï¨_ÚbôÍÏæÿ5lIñ þ‚üÍx«ŸRʰ—ý hÈð–wæßI’$©%UëN-ÝÍËÿjÞ{n*eP•6?pkú_Ó¶dðÏà ˆÁŸÆ÷>ûÐñ£÷¤ßI’$i1VõŒÃ¿š÷Æ×—Ñž­¥žÛW¦Íø¡;Óÿ:·%ƒ?€xA þ4Øyaö3 AÕ›ÿ~úm‘$I’R[}bé\ô¢Òß¶¢ wm*ã}»K©ë2íêǾ‘ÿ×¾%üÄ3øbð§ÞÕ§e?CÔÛòé·E’$IZ°V_:––Þ–ÓË`çú2Ú»£”Q¿Ì¢úÀwò?–dðÏà ˆÁŸ:ý¶H’$IGÕêK碕þ¶e¸kSïÛ]J]gµn¹•Çå–-Èà žÁ@ƒ?ìà¯Á`zô>ðGé·E’$IzÂV_:o}Aé}àß—áÍ—–ñ·w•2fž sgþhþçÛ‚ þâü1øÓÁº›^‘ýhÐÁ?%û¶H’$Iß«Zwjén^~è_8<ô«y;eežZÕš“Ó?ï6dðÏà ˆÁŸVý,¿&`ŠÔß½/ý¶H’$i6«ÖžRº—þÕ¼·_Uêf=ž)ÕYÏHmÈà žÁ@ƒ?}¯ñ#_Ë~Ž4¨sÁ/¦ßI’$Myg<µt.}Yéoû³2üò{ýo ‹@õÆÏ-Èà žÁ@ƒ?}¯ám—g?GÔûÐL¿-’$Iš®ªóŸ[z[N/ƒëËhïŽR†½ì¯½ü€êœŸL'mÈà žÁ@ƒ?}¯þ‡_›ýhÐð+W¦ßI’$µ·jÝ©¥»yyéo_]F{¶–ºóhöW\Ž@uîϤ¿6dðÏà ˆÁŸ¾Wç’g?GTW—¹•Ç¥ßI’$-þªµ§”îÆe¥¿mEîÚTêý÷fåUçýlú{jCñ þ‚üé¶ú)~À”é¼íÍ¿/’$IZ\­>±t6,-½½æÐ¸o¼ow)õ8û«+ ©Þôœü7Ö‚ þâü1øÓßm|ÿ糟$ êßð_Óo‹$I’r«Îném9½ v®/£½;Jv³¿¦¨:ÿÒß\2øˆgðÄàO·ÁÎ ³Ÿ$ ݵ-ý¶H’$iáªÖZº›——þöÕe´gk©;f%eu.x^ú;lCñ þ‚üéïÖ»ú´ì' @ƒêþC¿²-û¾H’$©ùªµO/ÝËJÛŠC¿š·~ìÙ_?Y:ë9ým¶!ƒ?€xA þôw;øo0]þŸÀÙ÷E’$I¶ê„ÒÙ°ôЯæÞ|iïÛ]J=ÎþªÉ"tð¤¿×dðÏà ˆÁŸ¾¯•KJ]=œý,hPûªüû"I’¤£þÕ¼½+_];×—ÑÞ¥ »Ù_+i‰Î[_þ~ÛÁ@<ƒ?€ úÁFw]Ÿý,hÐèÞO¥ßI’$Í?îën^^úÛW—Ñž­¥®Éþ I‹uÞþÓßt2øˆgðÄàO?ØÁÿƒ€)2ê—¹5'¥ßI’$ý½R­9¹t7.+ým+ÊpצÿšÔ¹øWÓßy2øˆgðÄàO?XwÓ+²Ÿ% ë¾çŸ¥ßI’¤™kÕ ¥³aiém9ýЯæ?pK)õ8û«!S®sÉKòß~ 2øˆgðÄàO?Xuö³J©ëì§ @ƒ;ÎK¿/’$I³ð«y{W¾úиo´wG)ƒNö×@fPg㯥ÿ½Ð† þâü1øÓã5~äkÙO€¸5ý¶H’$MÛ¸¯{ù¿(ƒOžUF÷|´ÔÝýÙ_ùàî;~#ýï6dðÏà ˆÁŸ¯ám›³Ÿ&MªÇ¥zãO¤ßI’¤6V­9¹t7.+ým+Êpצ2Þ·;ûÛ<¡ƒo5ûï™6dðÏà ˆÁŸ¯þušý4hXï}ÿwú}‘$IZô­:¡t6,-½-§úÕ¼ãn9ô/O@[t.}iþßG-Èà žÁ@ƒ?=^‹5ûiаá/N¿/’$I‹ª•KJç-Ï/½«O;<î»og)Ãnö×6˜Hç’çÿ½Õ‚ þâü1øÓã¶úÄRUöó AãGïο/’$I‰Ug=³t/{yéo_]F{¶–zî¡ì¯hиÎE/Jÿ{­ üÄ3øbð§'j´÷ÓÙÏ€†Uç?7ý¾H’$-HkN*ÝËJÛŠ2ܵ©Œ÷í.¥®³¿ŽA¸ÎÛÿaþß-Èà žÁ@ƒ?=Qƒçe?OÖ»öÓï‹$IRã­:¡t6,-½-§úÕ¼£½;Jõ³¿zAŠÎ[_ÿ÷d 2øˆgðÄàOOTïŠßÉ~ž4lxÇ5é÷E’$iÒªu§–îæå‡5ï=7•2¨²¿fÁ¢ÑÙðÒÿmCñ þ‚üi¾ÿ€éRw÷úp²oŒ$IÒ‘VõŒÒ½ìå‡Ç}{¶–zî¡ì¯T°¨u.ü•ô¿oÛÁ@<ƒ?€ š¯ú»ßÌ~¢4¬séËÒï‹$IÒã¶æ¤Òݸ¬ô·­(Ã]›ÊxßîRê:ûë´Jç-ÏÏÿ{¹üÄ3øbð§ù~åÊì' @Ãþé8Ù÷E’$inÕñ¥³aiém9½ v®/£½;Jõ³¿*Aëu.øÅü¿¿[Á@<ƒ?€ š¯þõÿ%û‰аÑ7?“~_$IÒìU­;µt7/?ü«y﹩”A•ýµ¦RõæŸOÿû½ üÄ3øbð§ùê\úÒì' @ÓÆÃRõŒô#I’¦·ƒß5ýjÞ__F{¶–zn_ö7 ˜Õ›ž“þ3  üÄ3øbð§y;ãGJö²Ÿ) ë^ñªü#I’¦£Õ'–ÎE/*ým+Êpצ2Þ·»”ºÎþº3«:ïgó.´ ƒ?€xA þôdïû\ö3 aƒ/\”~_$IR [u|élXZz[N/ƒëËhïÿ’,2Õ¹?“ÿ³¢üÄ3øbð§'kðÙ ²Ÿ) ?zOú}‘$I‹¿jÝ©¥»yyéo_}øWóv÷gžDuÎO¥ÿìhCñ þ‚üéÉê]ù»ÙÏ€ÕùÏM¿1’$iñT­=¥t7.;ü«yo¿ªÔÌþºƒê?žþó¤ üÄ3øbð§'«zÓs²Ÿ)z×þqú‘$IIù£¥³ñ×JÿúÿR†_~o?zwöW !ÕYÏÌÿÓ‚ þâü1øÓ‘Tÿõ·²Ÿ* ÞqMú}‘$I ЪãKgÃÒÒÛrzì\_F{w”2ìe‚ÌñÔüŸ;-Èà žÁ@ƒ?IG!L—ºûÝ2·ê„ô#I’šÿSÚ{ïûWe°ã¼2º÷“¥îÈþÚ,”º.s+—¤ÿjCñ þ‚üéHêä/²Ÿ*º—¥ßI’tìUkO9tÏûÛV”áíW•úÀw²¿^™†ÝôŸKmÉà žÁ@ƒ?IÝwüzöS Àà“g¥ßI’t„­>ñð¯æýÐkÊpצ2Þ·»”zœýuXDêîþüŸU-Éà žÁ@ƒ?Qg<µ”Q?û¹аñ·æßI’ô¸Uç?·ô¶œ^;×—ÑÞ‡þä.€ùüS>³vµ%ƒ?€xA þt¤¿usös iu]ªu§¦ßI’f½ƒ÷¸»yyéo_]F{¶–ºóhö· …êǾ‘þó¬-üÄ3øbð§#mð¹ ÙÏ€½-~c$Iš¥ªµO/ÝËJÛŠC¿š÷à@  ã‡îLÿ×– þâü1øÓ‘Ö»ú´ìç @€áWÞ—~c$IšÚVP:–úռÛ/-ã}»K©ÇÙç˜Rão)ÿç^K2øˆgðÄàOGZuþs³Ÿ+êÎcenÕñéwF’¤iù禃ã¾ÁÎõe´wG)Ãnö©fÈø¾é?Û’Á@<ƒ?€ :šêf?Yt.}Yú‘$©mUëN-ÝÍËKûê2Ú³µÔÕ#Ù'˜q£¯oOÿÙØ– þâü1øÓÑ4Úsmö“ Ààãg¦ßI’sÕÚ§—îÆe¥¿mEîÚTêǾž}¾~Èè®mé?/Û’Á@<ƒ?€ :šúý³Ÿ,Æßúbú‘$iÑ´ê„ÒÙ°ôЯæÞ|iïÛ]J=Î>×OjxÇ5ù?C[’Á@<ƒ?€ :šºïúß³Ÿ,êq©Îù©ô;#IRÖ¯æí]ùê2ع¾Œöî(eÐɾÌÇdøå÷¦ÿLmKñ þ‚üé¨ZsR)ãaö³ @ïê›g$IZ€q_wóòÒß¾ºŒöl-uõHö hÌð–w¦ÿœmKñ þ‚üéh{Wö³ €? D’4mUkN.ÝËJÛŠ2ܵéð¯æ˜bƒÏ¿-ýgo[2øˆgðÄàOGÛð‹g?[ÔÕÃenåqéwF’¤cjÕ ¥³aiém9ýЯæ?pË¡_Y0KŸysþÏã–dðÏà ˆÁŸŽ¶Þ–?È~¶é\ò’ô;#IÒ“¶rIé¬ÿ¥C¿Ž~°óÂ2¾ïs¥ »Ùg ÝàkóF·$ƒ?€xA þt´u.øÅìg @ÁÇÏL¿3’$ý`Õ¹?Sº›——þöÕe´gë¡?•€ÖÿÈŸ§ÿÌnKñ þ‚üéXªÿæÛÙO€ãnM¿1’¤Ù®Zsrén\VúÛV”á®Me¼owöyhÞ‡^“þs¼-üÄ3øbð§cixÇ5ÙO€u]ªó~.ýÎH’f¤U'”Ά¥¥·åô2ع¾Œ¸¥”ñ(û´Vïýÿ&ÿg{K2øˆgðÄàOÇRÿ†×e?]‚øSA$IQUëN=ô«yŸ>·Œöî(ePeŸ=€©ÒÝôÊôŸõmÉà žÁ@ƒ?KK_šýt2Úsmú‘$µ¿ê¬g–îe//ýí«ËhÏÖRÏ=”}â¦ÞÁ_‰žýó¿-üÄ3øbð§cjõ‰þ4€i5蔹3Ÿ–k$IíiÍI‡F&ým+Êpצ2Þ·ûЯ‰`auÞú‚ü›Ð’ þâü1øÓ±6Úûéìç @î_ý_éwF’´H[u|élXZz[N/ƒëÿjÞQ?ûtpðç{ÓsòïDK2øˆgðÄàOÇÚàSçd?_‚ ¾pQú‘$-¾†·]~èO‚`qªÎþ±ô[Ñ– þâü1øÓ±Öݼ<ûù¤þî}enå’ô[#IZ\ÕûïÍ>Q<‘º>ô§°fߊ¶dðÏà ˆÁŸŽµƒÿÖx©ÇÙO€ ·½0ýÖH’Wuwöyà Ôýéw¢MüÄ3øbð§I?tgö Hÿ¦¿L¿3’¤EÔÊãü ?‹Xý×ßÊ¿-Êà žÁ@ƒ?MÒð–wd?a‚ŒïÛ™~g$I‹§ê¬gfŸ&æqð_Ê̾mÊà žÁ@ƒ?MRïš?Ì~ÂD©Ç¥:÷§Óo$iqTÿ Ù— €yŒïÿ|ú­hSñ þ‚üi’:oy~ö Pïš—~k$I‹£ÎÛÿQöY`£»oL¿mÊà žÁ@ƒ?MÔÊ%¥žÛ—ýŒ2Ü}uþ­‘$-ŠºïúÍì³À<زoE›2øˆgðÄàO“6ºóƒÙÏ€ uÿ@™;ã©é·F’”_÷ŠWeŸ%æ1¼õ]é·¢MüÄ3øbð§Iëä/²Ÿ1º›ÿyú­‘$å×»ö?eŸ$æ1øôºô[Ѧ þâü1øÓ¤u6þZö3 Ððæé·F’”_ÿcÿ#û$0þÿ-ýV´)ƒ?€xA þ4qgüH)ÃnöS H=·¯Ì­<.ÿÞH’Rì¼0û$0Þþ(ýV´)ƒ?€xA þÔD£o~&û)èàŸæš}k$I¹ ¿|Eö9`ÝË;ýV´)ƒ?€xA þÔDƒO¯Ë~Ê:øs>ûÖH’rÝsSö9`K_–~+Ú”Á@<ƒ?€ j¢îåÿ"û)hüèÝé·F’”Ûø;·eŸ#æÑyËóÓoE›2øˆgðÄàOMT½ñ'J©ëìç @ Žï ’4ÓÕó@ö)`ÕYÏL¿mÊà žÁ@ƒ?5Õøá¯f?gõ?ú†ô[#IJjå’RFýìSÀý¬N¿-Êà žÁ@ƒ?5ÕðÖwe?gïû\ú­‘$åTûÓÙg€yÔ¾“~+Ú–Á@<ƒ?€ jªÞþ}ös R]—꼟K¿7’¤…¯sÑ?ξBÌcüàíé·¢müÄ3øbð§¦ê¬ÿåìç @°Þµÿ)ýÞH’¾îå¿}‚˜ÇèŸH¿mËà žÁ@ƒ?5ÖÊ%¥®Î~Ò}í†ü{#IZðzzMö `ÇkÙ·¢müÄ3øbð§&íÙšý¤ˆ4”êìK¿7’¤…mð‰5Ù€y ¾pQú­h[ñ þ‚ü©Éú7¾>ûI¬·åÒï$iaÞú®ìóÀ<³³oEÛ2øˆgðÄàOMÖ}ǯg?i‚ö\›~o$I ÛèîdŸæÑßögé·¢müÄ3øbð§F;ã©¥ »ÙÏ€HÃn©Ö>=ÿæH’¬ñƒ·g_æÑ»ú´ô[Ѷ þâü1øSÓö~:ûY¬wÕï¥ßIÒÂU÷dŸæÑ}÷o¥ßжeðÏà ˆÁŸšnð‰µÙÏ€`ÿϱì{#IZ˜ªs~2ûìð$:þJú½h[ñ þ‚ü©éº—ýÙÏ€hƒªÌ­9)ýæH’âë\òâì«À“¨Öž’~/Ú–Á@<ƒ?€ j¼5'•2d?m‚õ®|uþÍ‘$…×»òw³Oó8øk׳oE3øˆgðÄàOïÿ|öÓ Øð+W¦ßIR|ý_Ÿ}r˜Çøá¯þìÝyüu}çý†U«u©û¸£¨ƒ3N­Zomét´÷èèÝ]tZµu:3ö®vÚjkmµ¿$ìKKXÂ.BX…PvYdG-b BÎuöëúÞ_˜{(ÉoûžÏ9çz>×mÂù^ßœ‹w~¿}WŒbùüdbð§u¯Ü7ú£ À ~’È®/ ¿s$Iyëݰ4úÊ`3ú÷^~WŒbùüdbð§µNüdôG€h}ç÷ÃïIRÞú+/Œ¾n،ޭ'†ß£˜Á@~™ü)GÅ/M©ìG¼ÈÌ\”¤ñ¯\·2úº`3ºWí~WŒbùüdbð§\•Ýýñ ³ªõDj,|Aø#IÊÔ‚íR*{Ñ× ›Ñ9ÿoãï‹Ìà ?ƒ?€L þ”«îŒþx0­“ÿ üΑ$婹äÝÑ× [Ð>åSá÷Å(fðŸÁ@&ÊÕä€ñ×»ýÔð;G’”§öÉ}ͰÍ£>~_Œbùüdbð§\{½2¥ªŠþˆ[·HÅn/¿w$Is_ç’oDß2lA±ÿ[Âï‹QÌà ?ƒ?€L þ”³ò‘;¢?â @û´? ¿s$Is_ï–oG_1lNU¥ÆÂíÃï‹QÌà ?ƒ?€L þ”³îõ‡GÄ€þŠsÂïIÒÜW>x]ôÀfTµáwŨfðŸÁ@&ÊYûÔÏDÄ„~'{¾<üÞ‘$ÍmUk}ô Àf”ÿ(ü®Õ þò3øÈÄàO9+ö}]ôG€iŸõçá÷Ž$iî*ö{}ôÕÀôï>?ü¾Õ þò3øÈÄàO¹+ûIôÇ€èßsqø#Iš»Z'|"új` z7~_Œjùüdbð§Üõn:&úcÀ ”ýTìóšð{G’47u.þ§è›€-è\ôõðûbT3øÈÏà ƒ?å®}ÆŸFÌι_¿w$IsSïG'G_+lAûÔτߣšÁ@~™ü)wÅþoŽþ˜0 ýUW†ß;’¤¹©\s{ôµÀ4ø`ø}1ªüägð‰ÁŸQµ~UôG€A¨ªT,~kø½#Iše ·O©ß¾UØ‚bïWÅß#šÁ@~™üiõn9!ú£À€t.ùFø½#Iš]ÍÃ5ú:`K:ðûb”3øÈÏà ƒ? ¢öwÿ{ôG€)×®¿w$I³«}æŸE_'lAùÈá÷Å(gðŸÁ@&DÍwŒþ¨0@Í¥ï¿{$I3¯{Ý¡ÑW [Ðÿñ¹á÷Å(gðŸÁ@&TÕ“EÜî5‡ß;’¤™W®¾!ú*` º×. ¿/F9ƒ?€ü þ21øÓ êݶ,úãÀ€Tµ©±`Ûð»G’4ƒnŸR¯}•° ¾gŒpùüdbð§AÕYþ¥è;Ô:ñ“áw$iú5ø`ôÀ´Nþƒð;c”3øÈÏà ƒ? ªæ’wGÜ ÉŸì}÷H’¦_ç_þWôÀ4{oø1Êüägð‰ÁŸÖļT5‰þÈ0(½V*öxYüý#IšV½[Nˆ¾A˜Öžå}gðÁ@&dý;ÏŠþÈ0@í³þ<üî‘$M¯òÑ»£¯¶ j=~_Œzùüdbð§AÖ9ïo¢?ò Pÿ¾+ÂïIÒÔ+öü唪*úú` ÊŸÝ~gŒzùüdbð§AÖ<ô=Ñy©ªR±x‡ðûG’4µZ'ýnôÍÀLþ…è;cÔ3øÈÏà ƒ? ´‰y©j¬þØ0@ÝËw¿$ISª{Õ¢èk€)è~ïð;cÔ3øÈÏà ƒ? ºÞí§Eì jÃêÔ˜¿uøý#IÚråꢯ ¦ }æÂïŒQÏà ?ƒ?€L þ4è:Ëÿ2úcÀ€µ¾ýñðûG’´ùŠÝ^œRÙ‹¾2˜‚æ‘ ¿7F=ƒ?€ü þ21øÓ kôÎè=6ùÓ]£ïIÒækÿ±èë€)*özEø½1êüägð‰ÁŸ"ª6<ýÑ`úTìýªðûG’ôüu¯Ø#ú¶` ªÆÚð;c2øÈÏà ƒ?EÔ»å„è>Ö9ÿoÃïIÒó×_ueôUÀôï¿:ü· þò3øÈÄàOµÏúoÑ}¬\s{øý#Izžv{QJ½vôUÀôn:&þÞƒ þò3øÈÄàO‹ÞýÑ @séÂï IÒ³kô;ÑWSÔ¹ðká÷Æ8dðŸÁ@&Šª\wOôÇ€ëݰ4üþ‘$=»îu‡F_LQë¤ß ¿7Æ!ƒ?€ü þ21øST½Šþø0`UûÉTìþKáw$é™ùË8££yÐ;ÃïqÈà ?ƒ?€L þUû´?Žþø }öÿ ¿ƒ$IOW,~kôÕÀTõ»©±`Ûð»c2øÈÏà ƒ?EUìýꔪ*ú0`å÷†ßA’¤§ëœûåè«€)*ýqø½1.üägð‰ÁŸ"+¹#ú yÄÃï IÒSõW,¾˜¢þŠsÂï²H IDATqÉà ?ƒ?€L þY÷Ú%ÑG€½~I’~!5nŸªÎÆèk€)ê^µ_üÝ1&üägð‰ÁŸ"k}ç÷¢ºÍTìùËá÷$Õ½Ö‰ŸŒ¾˜†öwÿ{øÝ1.üägð‰ÁŸ"+öxiJe/ú sÁWÃï!Iª{½›Ž‰¾˜†æ‘ ¿;Æ%ƒ?€ü þ21øStå×D”ëV¦ÆÄ¼ð{H’jÛü­SÕX}0UU•ŠÝ_ŒIùüdbð§èº—í} Ò:î£á÷$ÕµÖ1ÿ1ú`Êu÷„ßã”Á@~™ü)ºÖÑ¿} 2ùÙ¢ï!IªkÝ} 0 ý»Î¿;Æ)ƒ?€ü þ21øSxó·IU{CôQ BÙOÅâ·ÆßE’TêÇリ†Éß}wŒSùüdbð§a¨¿byôQ H÷ªýÂï!Iª[ÍÃ5úñÀ4µ—í~ŒSùüdbð§a¨sÞ_G‚T­õ©ØíÅáw‘$Õ©î•ûF?þ˜¦æAï¿?Æ)ƒ?€ü þ21øÓ0Ô\²SôQ Pgù_†ßE’T›&¶JÕD?ú˜Žn35æo‡ŒQùüdbð§a©Úð`ôq HùèÝ›(Ñw‘$Õ¡Ö±ÿ)ú±À4•«o¿?Æ-ƒ?€ü þ21øÓ°ÔûáñÑÇ€@­ã?~IRêÝtLô#€iêÝ|løý1nüägð‰ÁŸ†¥öéŸ>êß}~ø]$Icߤªµ>ú‘À4uÎÿÛø;dÌ2øÈÏà ƒ? KÅ>¯I©ª¢Qª*5ý¹D’²Ö>åSÑO{f uÜGÂïqËà ?ƒ?€L þ4L•ÿ(úH¨wÃÒð»H’ƹþ]ß~Ô0ÅÞ¯¿CÆ-ƒ?€ü þ21øÓ0Õ½zÿè#@¤^kÓO|¾$i›‹¤~'úIÀ4U¿CÆ1ƒ?€ü þ21øÓ0Õ:þcÑG€`Ý+ö ¿$ië\ôÑxf ÏÅáwÈ8fðŸÁ@&ªv}aJÝfô± PÕ|<»ÿRü$IãÔļT®[ýˆ`ºWíŒaùüdbð§a«¿ò¢èc@°Î_ ¿$iœj}ë·£íÌP{Ù.á÷È8fðŸÁ@&¶&GÔ[µauj,Ø.üN’¤q©wûiÑvf¨XüÖð{d3øÈÏà ƒ? [Í%;E †@ûÌ/„ßI’4û¼&¥~'ú±À TÍu›~-{ô]2Žüägð‰ÁŸ†±jýªè£@°ríŠÔ˜Ø*üN’¤Q¯sñ?F?Ò˜¡þÊ Ãï‘qÍà ?ƒ?€L þ4Œõn<2úh0Zßù½ð;I’Fºù[§êñ{£çÌP÷Š=âï’1Íà ?ƒ?€L þ4ŒµOþÃè£À(ºÙ¯0“¤YÔ^öéèG9³à/ÀäËà ?ƒ?€L þ4Œ»¿$¥~7úx0Z'~2ü^’¤Q­|àÚèÇ8³Pì÷úð»d\3øÈÏà ƒ? kýUWF†@ùÐM~ÊŸ$Í ÖÑ;G?˜…jãÃáwÉ8gðŸÁ@&Ö:—|3úx0$Zßþ/á÷’$Zý»ÎŽ~|0 ýç„ß%ãœÁ@~™üiXkþ¾èãÀðSþ$iz5Ü1¥ªŒ~|0 Kç‡ß'ãœÁ@~™üih›˜—ªk¢C¢uüÇâï&I‘z7,~l0K~Êuæ»Òà ;ƒ?€L þ4Ìõn9!úˆ0$Ê® ¿—$i*öymJÝfôc€Y*ö~uø2Îüägð‰ÁŸ†¹öéŸ>" ‘Ö‰Ÿ ¿›$iØëþàÀèÇ5³T­_~ŸŒ{ùüdbð§a®Øë•)Ueô1`H”knK‰­Âï'IîŸîWD?®˜¥Þ§‡ß)ãžÁ@~™üiØ+¼>ú˜0DÚ§ýIøÝ$IÃZ÷šƒ¢ÓÌÎEÿ~§Œ{ùüdbð§a¯séüècÀ©Öß— ¶ ¿Ÿ$iØ*ö}]JÝfôc€9Ð<êÃá÷ʸgðŸÁ@&öš‡¿/ú˜0d:ç~9ü~’¤a«{í’èÇ3s¡×N…/¿WÆ=ƒ?€ü þ21øÓÐ71/UVG†HÕx$»ÿRü%IC’Ÿî0>ú«® ¿WêÁ@~™üiêÝtLôQ`Èt.ùføý$IÃRïÆ#£ËÌ‘î•û†ß+uÈà ?ƒ?€L þ4 µNþƒè£À©ÚO¦bŸ×†ßQ’]sÉN)•½èÇ2s¤uÒï„ß-uÈà ?ƒ?€L þ4 »½8¥^;ú¸0d&¢Uô%IÑõW^ý8`®TU*ö~UøÝR‡ þò3øÈÄàO£Rÿž‹£ æ*Sóð÷…ßQ’Uë„OD?‰˜CåÚ»Âï–ºdðŸÁ@&•:çýMôq`õï½,üŽ’¤æoÊ5·G?†˜C½›ŽŽ¿_j’Á@~™üiT*ï}\R­ïü~ø=%Iƒ®³üKÑ_æXûÌ/„ß/uÉà ?ƒ?€L þ4J•þ8úÈ0„Êu+ScÁvá÷”$ ªb—¦ªñHôã€9Ö<èáwL]2øÈÏà ƒ?RÝ«÷>2 ©Î…~OIÒ ê^»$ú± À«kScb^øS— þò3øÈÄàO£Të¸D†U·HÅþo¿«$)wÍ¥ïO©ìG?u˜cý;Ï ¿cê”Á@~™üi¤Z°mªZë£ Cjò?Ú…ßU’”³ù[§ò¡›£·dйàïâï™eðŸÁ@&µz·Ÿ}lb­>~WIR®:|5ú1 @&Í#?~ÏÔ)ƒ?€ü þ21øÓ¨Õ>óÏ¢ C¬zü§©±ë Ãï+IšëŠEoJUgcôc€ &ŸïÛ…ß5uÊà ?ƒ?€L þ4j{½"¥²}tbÝËw¿¯$i®ë¯8'úñ @&ý»Ï¿gê–Á@~™üiëßwEôÑ`˜õÚ©yð»Âï+Iš«ÚËv‰~²Q篅ß5uËà ?ƒ?€L þ4Šu.øjôÑ`È•^—ó·¿³$i¶ûþ›TE?VȨyø¯†ß7uËà ?ƒ?€L þ4Š‹wˆ>:Œ€Îù_ ¿³$iVMÌKý»Ï‹~œQÕ\—[Åß95Ëà ?ƒ?€L þ4ª•kn>> »n‘šî~gIÒLëœûWÑOR2›žEß7uÌà ?ƒ?€L þ4ªu¯Ø#úø0ú÷ÿÀOL‘4’5x{ª:££dÖYþ¥ð;§Žüägð‰ÁŸFµæÒDFÄäOÈŠ¾·$iZÍß&•^ýø`š¿+þÞ©aùüdbð§‘mb^ª6¬Ž>BŒ‚Nïö•4Ru/ß-úÉ ÀTO>~çÔ5ƒ?€ü þ21øÓ(×»aiô`D”Ý” ¶ ¿»$iKµŽûHJe?ú± Àôn9!üÞ©kùüdbð§Q®õíG!FH÷Š=Âï.IÚ\Å¢7¦ª±6úq À€´ÏüBøÝS× þò3øÈÄàO#Ý‚íRÕÞ}ŒU™ZÇþVüý%IÏÕ‚mSÿþ«£Ÿ” P±ÿ›ãfðŸÁ@&õz·Ÿ}Œ!Õ†S±çËÃï/Iúùº×ýˆ`€ÊÇ~~÷Ô9ƒ?€ü þ21øÓ¨×>íO¢#¦wÛ²ðûK’þuíÓþ8úÑÀ€õn<2üþ©sùüdbð§Q¯Øãe)õ»ÑG €Ó9÷¯Âï0Iš¬¹d§Tu6F?°ö²]Âï :gðŸÁ@&‡ú÷\}”5½vjñkáw˜¤zWìõÊT®[ýD`ÐÊÞ¦¿À}Õ9ƒ?€ü þ21øÓ8Ô>çÿ>JŒ ê‰6m¢ï1I5mÁv©ïåÑBôïû~ü=Tó þò3øÈÄàOãP±ÏkR*ûÑÇ €Ô¿û¼Ô˜Ø*ü.“T³&æ¥Þ­'F?Ò¹øãgðŸÁ@&—&ÿv<ÌDçÒùá÷˜¤zÕ½|÷èGš‡þ‡ð»¨îüägð‰ÁŸÆ¥Îy}œUU•ÚË>~—IªGíSÿë¦çõT=ù³M?é5ú>ª{ùüdbð§q©Øï þÃ)3Vu6¦æ¡ï ¿Ï$w­c+¥~'ú‘@ ÞMÇ„ßG2øƒ?€L þ4N•\}¤aÕúU©ØûÕá÷™¤ñlò×7VÍÇ£ukŸü‡áw’ þÁà ƒ?S ÿ>úH0âú÷]‘ ¶ ¿Ó$WÍ%ïNUñhô#€hýn*vIø½$ƒ?€A0øÈÄàOãT±ÿ[üZ_f­wÛ)©11/ü^“45x[ªž|(úÑÀèß{Yø½¤§2øÈÏà ƒ?[åC7G+Æ@÷Š=Âï4I£_±ßRõø½Ñ4†D篅ßMz*ƒ?€ü þ21øÓ¸Õ¹äÑÇ €1Ñ9÷Ëá÷š¤Ñ­ØûU©\{Wô£ €!Ò<äß…ßOz*ƒ?€ü þ21øÓ¸Õ<èÑÇ €qQöRëÄO†ßm’F¯b¯W¦òáE?Å"Õ„ßOz:ƒ?€ü þ21øÓ8V®¹=úh0.ºEj½søÝ&it*öy­±ÏÒ»áˆð;JOgðŸÁ@&Ç:—.ˆ>ZŒ‘ªµ>5û•ðûMÒðWìÿ–T®»'ú±Àj}ç÷Âï)=Á@~™üikòï¢c¦j¬MMn’´™š½sÓ¯k€g驱ë/†ßUz:ƒ?€ü þ21øÓ¸V®]}¼3“Cžbÿ7‡ßq’†¯æaïMUã‘èÇCªçYáw•ž™Á@~™üi\ók}È¡Z¿*‹ß~ÏIžšK?ªâ±èÇC¬}úçÂï+=3ƒ?€ü þ21øÓ¸Ö<ø]ÑÇ €1U=þÓT,zSø]')¾ÖI¿“R§ýX`˜õ»©Øóåáw–ž™Á@~™üiœ+¾5úˆ0¦ü¤?Ií³¿˜RÙ‹~0äú+/ ¿³ôì þò3øÈÄàOã\çâŒ>bŒ1?éOªió·IÝë~0":Ëÿ2þîÒ³2øÈÏà ƒ?s“?y)UUô1`ŒUOÜŸšî~çILÅn/NýÿKô£€QQ•©Ø÷uá÷—žÁ@~™üiÜ+¼.ú˜0æªkRóÐ÷„ßy’òVì÷†Tþì–èG#¤|àšðûKÏÁ@~™üiÜëœÿ•èc@ TÅc©¹ôá÷ž¤<µŽúõMã^˜ŽÎEÿ~‡é¹3øÈÏà ƒ?{Å~¯ßô+t ·ª½!µŽûHøÝ'i›˜—:|5¥~7úÀj¸cü]¦çÌà ?ƒ?€L þT‡ú÷}?ú¨PýNjŸþÙð»OÒì+vÿ¥Ô»ý´è§ #ª\s[ø]¦çÏà ?ƒ?€L þT‡:Ë¿}Ô¨“ªJK„ß’f^ó°_I底ÑOFX÷²]Ãï3=ùüdbð§:Tìýª”Ê^ôq fz7ó· ¿%M¯öŸO©[D?Bq“ãñè;MÏŸÁ@~™ü©.õW^}ܨ¡Þg¦Æ®/ ¿%m¹b·§Þ~l0ªÇïM‰yáw›ž?ƒ?€ü þ21øS]jŸõçÑÇ €š*¼nÓO›¾ %=Í#?”ÊÇ~ý¸`Lt¿¿WøÝ¦ÍgðŸÁ@&ªKÅ/K©×Ž>rÔT¹îžÔ<àíá÷¡¤ŸkÁ¶©sé‚”Ê~ôc€1Ò<ô=ñwœ6›Á@~™ü©Nõï:;úÈPcÕÆ5©uôÎá÷¡¤§jöÞT®¹=úÑÀ˜)×Þ~ÇiËüägð‰ÁŸêTû”?Š>rÔ]ÙK‹¾~'Jµnþ6›Îaêw¢ŸŒ¡Î÷&âï:m1ƒ?€ü þ21øS­Z¸}ªšG;H½[OL]1þn”jVóŸÊ¯‹~0Æšî~ßiËüägð‰ÁŸêVïÆ#£lR>|k*ï~7Jµh×_LKø©~dU®¾1þÎÓ”2øÈÏà ƒ?Õ­ÖÑ;G;ø?ªæºÔ:þcá÷£4εNüRµ~Uôq :ü]ø½§©eðŸÁ@&ª]óRõø½ÑGžVöS÷²…©1›ø{R£š¼-õrAô  .ª2‹Þ~ÿijüägð‰ÁŸêX÷òÝ£zðܺEêœûåM?‘6ú¾”F®‰y©}êMÕã?>ÉÔPgù—âïBM9ƒ?€ü þ21øS]+¼>úøÀóêßsq*ö{Cø})JÍ£>œú÷ÿ úèPWe/{¿:ü>ÔÔ3øÈÏà ƒ?յι}ü`³ªÖ©}úçÂïLi˜k.Ù)õn?-ú¸PsýŸ\~'jzüägð‰ÁŸêZ±×+Sêw£ lÑ䘩Øïõáw§4L‹Þ˜z?üVJU}D µÏüBøÝ¨éeðŸÁ@&ªsýçDA˜’ªýdê\ðw©±`ÛðûSЬØçµ©{õþ)u›ÑÇžÒ-R±ûKÂïHM/ƒ?€ü þ21øSk/Û%úÀ´”þ8µ¾õÛáw¨4èŠEoJÝk2ô`èôn=1üžÔô3øÈÏà ƒ?Õº…/HUk}ô1€™ýšß}^—J™+ïðÔЯ׎>vðœZÇ}$ü¾Ôô3øÈÏà ƒ?Õ½ÞGEC˜‘ÉÑzç_þWjÌß&ü>•æºæ¡ïI½ÛNI©ìG5x^ÕúU©1±Uø½©égðŸÁ@&ª{Í#?} `VÊGïNíS?“óÂïUi¶µŽýO©¿âœ”ª*úhÀu/Û5üîÔÌ2øÈÏà ƒ?éRùÈÑGf­|äŽÔ^¶Kø½*M»…/Hí3>ŸÊ‡}Œ`êª*5x[ü=ªeðŸÁ@&Ò/¤Î…_‹>Š0gÊ®ÝôSÒ¢ïWiK‹wHÝ+÷IUñXô±€iëß{yø]ª™gðŸÁ@&Ò/¤bŸ×¤ÔïFG˜Sý{.IÍÃß~ÏJ?_ë¨_O½ÛOK©ìG˜±ö™~§jæüägð‰ÁŸôTý»ÎŽ>Ž0÷ª*õï>/µŽûHø]«zW,zcê\òT>zwô©€Y«:Sc·…߯šyùüdbð'=Uë¤ß>ŽUùð­©}ÆçScÁ¶á÷®jÒ¤ö²]RÅò”Ê^ô€9Ó»ùØø{V³Êà ?ƒ?€L þ¤ÿÝümRõäÏ¢$dWm|8u.]Š=_ÿj,›üUÒ½LUûÉè;dÑ:zçðûV³Ëà ?ƒ?€L þ¤§ë^¹oô‘€©ÚR÷êÅ©XüÖð;X£_sÉ»S÷òÝRµþ¾è6dU®[™óÂï^Í.ƒ?€ü þ21ø“ž®yÐ;Rªªèc ƒU•©¿êªÔ>û‹©±Û‹ÂïcNÍ%;múi‘åÚ»¢?Å00K¾~köüägð‰ÁŸôÌú÷_}, LÕZŸº×žšK?~'k›ØjÓ¯0ìþàÀT­_ýq€Á+û©XôÆø;Y³Îà ?ƒ?€L þ¤gÖ>ëÏ£% …rÍí©sþWR±÷«Âïg¶pûÔ:þ?§Þ G¤jãšè%„ê¯X7kN2øÈÏà ƒ?é™»½8UÑG†G¿“úwŸ—ÚßýÆuúU½çÿmêß}~JÝ"úC£uÂ'ÂïiÍMùüdbð'=»ÞÍÇEMNU™ú«®J‹¾žš½#üÎÖÜTìõŠÔ^¶KêÝx¤_Õ Ï£zâþÔ˜¿uø½­¹Éà ?ƒ?€L þ¤g×:ú7¢&Œ„ò¡›Sç{ÿœšKÞ~kíö¢Ô:î#©{ùî©|ðú”Ê~ôG †^ç⊿Ã5güägð‰ÁŸôÜ•Ü}<`¤Tß›z7“Ú§6ûþ›ð»\OWìûºÔ>åS©ûƒS¹ú†”Ê^ôÇFK¿“н_~§kî2øÈÏà ƒ?é¹ëœ÷×ÑÇFZõøO7ýŠØöŸOÅ~¯¿ÛëT±x‡MÿÜ'ÿù—Ü‘RUE`¤õ~trøý®¹Íà ?ƒ?€L þ¤ç®Øãe)u‹è# 㡪R¹æ¶Ô½æàÔ>íORóàw¥ÆÄVá÷ýÈ71/5x{j/ûtê^¹Oêßsqªšë¢ÿmÀØió›ñ÷¾æ4ƒ?€ü þ21ø“ž¿ÞÍÇFQ[Ugc꯺*u¯]’Úg~!5}OjÌß&üþ濌Ð:ú7Rûœ¿HÝëIýû®HU{Cô¿F{“?-7úÏšû þò3øÈÄàOzþšK?}D ^z­T>x}êÝpDêœÿ•Ô:éwRsòÏ« ·ÿsÁ@š¿Mjð¶ÔúöÇSçÜ¿Ú4†ì¯¼(UVGÿ›€Úš¼“ÃÿŒ 9Ïà ?ƒ?€L þ¤ÍW>tSô1ª*UO<ú÷^–z7:ÿcjŸò©Ô<콩ØûÕ›~µmôŸ¦Ô®/|jÐwìo¥öš:ß›ØôÿOå…©|ôî”úÝèÒÀÏýDâb—ÆÿBsžÁ@~™üI›¯ýÝÿ}L€-©ÊT5Ùô+÷&ÕmïŽÓS÷ºCS÷²…›~*OûÔϤַ~;5—¾?5_jü®T,Þ!û½!{¾|S›ý3Á‚íþÏÿ\±è›þw›¼ý©ÿ[‡¿/µŽûhjŸòG›þÜйðïS÷Š=S÷úÃRïÎ37ýÚâÉ1ßä`-½ /¡<üägð‰ÁŸ´…v{QªZODU`@&‡yUóñMõÖ<üWãßK(Kùüdbð'm¹ÉŸÔGùàuáï#”/ƒ?€ü þ21ø“¶\sÉN)UUôq¤}Ú‡¿P¾ þò3øÈÄàOšZýUWEW`ª «ScÁ¶áï"”/ƒ?€ü þ21ø“¦VûôÏEW`:ýCø{åÍà ?ƒ?€L þ¤)¶pûT5ÖFY §n‘н^ÿBY3øÈÏà ƒ?iêu¯Z}d€Œº×þþAù3øÈÏà ƒ?iê‹wH©*£-CU¦æ;†¿Pþ þò3øÈÄàOš^ýçD[ ƒÉïüÑï4˜ þò3øÈÄàOš^­ã>}l€ ZÇþVø{ &ƒ?€ü þ21ø“¦_ùð¢.0‡&¿ë7&æ…¿sÐ`2øÈÏà ƒ?iúµÏþbôÑæPûŒÏ‡¿oÐà2øÈÏà ƒ?iíúÂTE_`TOþ,5lÿ¾AËà ?ƒ?€L þ¤™Õ½rßèã ÌÎ%ß Ï ÁfðŸÁ@&ÒÌ*½)¥²}„€Ùè©Øë•áï4Ø þò3øÈÄàOšy^Àhë^»$üý‚¼ÓG™üI3¯uÌoFa`¦úÝTìÿæð÷ |ùüdbð'Í®rõÑǘÞÍÇ…¿WPLùüdbð'Í®öYÿ-úÓU•©¹d§ð÷ ŠÉà ?ƒ?€L þ¤Y¶pûTm\}”€ièÝqzü;…eðŸÁ@&ÒÀçb·ëIDATìë^¾{ôQ¦¡¹ôýáï—Á@~™üI³¯Ø÷u)õÚÑǘ‚þÊ Ãß%(6ƒ?€ü þ21ø“æ¦ÞMÇDg` ZÇüfø{¿Ç1øÈÎà ƒ?injôΔª2úH›Q>pmø;ÅgðŸÁ@&ÒÜÕ_±<úH›Ñ:ñ“áïŸÁ@~™üIsWëè£4ð<ʇoM‰yáïŸÁ@~™üIs[ùÀ5ÑÇxíS?þÞ@ÑÁ@~™üIs[ûä?Œ>ÖÀÏ)½;5æoþÞ@ÑÁ@~™üIsÜÄV©\{WôÑþ•öiÿÎ@C“Á@~™üIs_ûœ¿ˆ>ÚÀÿV>r禿 ý¾@ÓÁ@~™üIZ¸}ª6>}¼€ÉŸîwʧâßh¨2øÈÏà ƒ?)Oïýsôñ€Ú+×Üæ§ûéYüägð‰ÁŸ”§bÏ_NUgcô€Zkô»áï4|üägð‰ÁŸ”¯î5Gq¨­ò¡›Rcb^øû _ùüdbð'嫨ÿ-)•½ècµÔúö 7 áÌà ?ƒ?€L þ¤¼õn9!ú˜@í”\þN@ÛÁ@~™üIyk¸cJe?ú¨@­´Žûhø; oùüdbð'å¯w۲裵Ñ_uUø» wùüdbð'对äÝ)Ueôq€ZhóÃßh¸3øÈÏà ƒ?i0õï<+ú¸ÀØëßsqø; ùüdbð' ¦æaïM©ª¢<Œ¯ªJÍÃßþ@ßÁ@~™üIƒ«÷yÑGÆVï֓¿ûk42øÈÏà ƒ?ip5ø`ô‘€ñÔï¤æo ÿî¯ÑÈà ?ƒ?€L þ¤ÁÖ¿ç’ècc§{õþáßù5:üägð‰ÁŸ4ØšG}8úØÀX©ZëS±×+¿ókt2øÈÏà ƒ?iðõïû~ôÑ€±Ñ¹ðkáßõ5Züägð‰ÁŸ4øZßú¿£>Œ…jÃêÔØõÿëk´2øÈÏà ƒ?)¦þýWGyí3þ4ü;¾F/ƒ?€ü þ21ø“bjð‰èã#­|øÖÔ˜Ø*ü;¾F/ƒ?€ü þ21ø“âêß÷ýèGŒ¬Öñÿ9ü»½F3ƒ?€ü þ21ø“âj½sô#FRÿÞË¿×kt3øÈÏà ƒ?)¶þ=—D?`´TejöÞðïôÝ þò3øÈÄàOŠ­¹ô)UUô£FFï¦c¿Ïk´3øÈÏà ƒ?)¾þŠåÑ UûÉTìûºðïòí þò3øÈÄàOНyÈ¿ßô눀Íë\ðÕðïñý þò3øÈÄàOŽz·-‹~ÀP+×Þ• ¶ ÿ¯ÑÏà ?ƒ?€L þ¤á¨yàŽ)•½èG ­Ö·?þý]ã‘Á@~™üIÃSïæc£ 0”úwþ½]ã“Á@~™üIÃS±èM)õÚÑ.ýΦŸŒý½]ã“Á@~™üIÃU÷ºC¢ 0TºWìþ}]ã•Á@~™üIÃU±ÏkSêÑ Õ†Õ©ØíÅáß×5^üägð‰ÁŸ4|u¯Ü7úÑC¡}úç¿§kü2øÈÏà ƒ?iø*öxYªŠÇ¢ªÿRcb^ø÷t_ùüdbð' gó¿ýx€8U™š‡¿/üû¹Æ3ƒ?€ü þ21ø“†´Û¥rÝÊèG„è^wHüwsmùüdbð' oíeŸŽ~DÀÀUNÅ/ ÿ^®ñÍà ?ƒ?€L þ¤!nb^êßuôcª½l—øïäë þò3øÈÄàOîšGþ_)UUô£¢¿òÂðïâÿ þò3øÈÄàOþzwžý¨€üºÍT,Þ!ü{¸Æ?ƒ?€ü þ21ø“†¿ÉÿØ‘úèÇdÕ¹èëáßÁU þò3øÈÄàOº×.‰~\@6åšÛScÁ¶áß¿U þò3øÈÄàOн^™ªÖÑ ˜{U•ZGýzøwoÕ§þŠåÑŸz€±gðIqðNá/Ø$M­É_mã¦wãQáß¹U¯ú+/ŒþØŒ=ƒ?€LŠC%ü›¤)¶ð©Z¿*ú±s¦*ÝôSíÿs«Võï½<ú£0ö þ2)–þZø 6IS¯}úç¢0gÚ§6ü»¶êWùÀ5Ñ}€±gðIóèÃ_°IšF[¥òÁë£0ký{.Žÿž­ZVþì–è?ÀØ3øȤyÜo‡¿`“4½šGüZJUýø€«ÚO¦bÿ7‡ÇV=«žx úŒ=ƒ?€LZ'ÿQø 6IÓ¯wóqј±ö9þÝZõ-u›ÑG`ìüdÒ:û‹á/Ø$M¿bïW§ªµ>úÓÖÿ饩11/ü»µjÚn/Š>µ`ðIûâoÄ¿d“4£:çýMô#¦¥êlLÅþo ÿN­úV,zSô1¨ƒ?€L:W/É&i†Íß&•kn‹~ŒÀ”u–ÿeü÷iÕºæQŽ>µ`ðI÷Ö“Â_²Išy­ã>ý€)éß{™_å«ðÚ§6ú(Ô‚Á@&½UW…¿d“4»zwœý(€Íë4Ró€·…‡–:ßûçèÓP ™” É&iv‹Þ¸é?œÀ°êœûåðïÏÒd½›>µ`ðKU¥ ¶Ñ&ivùÛé «þ}W¤ÆÄVáߥÉ&?ägðQqà;Â_´Iše _ªÇý8€gò«|5dUÍuѧ  þ2j~ç÷Ã_´Iš}­ïü^ôãž¡sÞ_‡_–þÿŠýÞ}$jÃà £ö÷懿l“47õï>?ú‘›ôï¹Ä¯òÕPÕ:ñ“ÑÇ 6 þ2êÞqFøË6IsSóÀSêµ¢+ÔÜä¯M-ö{}ø÷dé_×¹øŸ¢@müdÔleøË6IsWç{ÿýX æÚ§~&üû±ôóõW,>µaðSY¦Æî/ á&iŽZ°]*¹#úÉ@Mõ~x|üwcé盘—ªâÑèãP™5ÿxüK7IsVóˆ¦T•Ñj¦züÞTìþ’ðïÅÒÏ×\²Sôñ¨ƒ?€Ì:—ïþÒMÒÜÖ»áˆèG uRöSë¨_ÿ>,=Wí³ÿgô ¨ƒ?€Ìz?½<ü¥›¤¹­Øã¥©zò¡èÇ 5ÑõJ5Äõn[}DjÅà ·N‘6.Ø.üÅ›¤¹­½ìÓÑOj \}Cj,Ø6ü{°ôœÍß:UÍuÑÇ V þ yÜGã_¾Išóú+–G?^gÝ"5zgø÷_éùšüUÓ –ÁÀt®Ú?ü囤¹¯Xô¦Tu6F?bSí³¿þÝWÚ\Ý+öˆ>&µcð0ýGV„¿|“”§Îýˆ` MþTùèï¼Ò–*þQôQ¨ƒ?€iìÿÖðp’24›Tþì‡ÑÆHµáÁTìõÊøï¼Òfjüo£ @-ü Hû¯…¿„“”§æÒ÷§Tö£3Œƒ²—ZGïþ]WÚRÝËv>-µdð0 ýÕ7‡¿„“”¯î5E?f‹ÿ)ü;®4•ÊG}\jÉà`€ŠÞþ"NR¦v{Q*×Ýý˜`„õrAjLlÿWšÊo; „ÁÀµ/ùføË8Iùjó›)Ueô£€TmXн_þÝVšJ½Žˆ>2ÿ_{÷þ{w]p<”"WâT\@¶‰2³8 g °-þÂKÜÛ²-»Ä%3Ùs.£_¾í¸”R´T –ZgÄqäVQÁŽ.(·Ò)±÷–ï9Ÿsý|^ Ûƒòýž~Ïyó=GòüÎû¼_ys`\Yø rÇÆ˜:ï€ôœ¤þÕ~à ÙW £¦*£ñ•ßMÓJÓjÑáQ5÷dŸ€±eá`ÀŠÕ†·ÒœnáaQn[—}Õ0BZþB#Tó–¿Í>2cÍÂÀ€µtCúPNRk\ý1í À´t×ßµóÒß²Òt+7?œ}lÆš…?€Aë´¢vÑÛÓs’ú[ûþ¥Ù· C®zùŨ_|túVšnÕ§g€±gá AsíDúpNRŸ›<8Ê-Od_7 «ªŒÆW~/ÿý*Í îºogŸ€±gá A9µ5¦&IÐIêoÅÊS"Ênö•Àj­=/ýÝ*ͤbù¯GTUöÑ{þ’4n='}H'©ÿµï½$ûº`ÈtŸYµóÒ߬ÒLê>¼ÊÂ@¢rçObjâ ô¤þ×¾çÂì+€LUÍëÏJŸJ=}‘±ª²O¯²ð¬qË'Ó‡v’ÐäÁQ¾ôXö•@’ö}KòߦRu7®Í>>ü ÉÊ]/ÄÔä!éƒ;Iý¯X~RD»ž}í0`¯,LÕ&L—J3­yí'²¯aá`4×.HÞIL­Û?•}å0@ÕîMQ¿øíéïQiÆMÕÎ粯aá`´êQ[òîü!ž¤Ô}êÖì[€AhQ\õáôw¨ÔK­µçeŸ ^‡…?€!Ñ~üºô!ž¤ÁT¿è¨¨^~1ûÚ Ïš7ÿMúTê¥bÙ{÷.¬0|,ü ‹ªŠbõéÃB¼ C¤»}CLMš?Ô“4Ú÷]š}íÐÝçïÚù¥¿;¥^jÞvNö`,ü ™Ö}—¦õ$ ¨óßå‹?̾v˜EÕÎQ¿è¨ü7§ÔCõ¥ÇEÕØ}ŒØ æìFýªßJîILŲ#Zµì›€YðÊ¢TqùûÓßšROMÌî¦û³oÂÂÀên_µEGäù$ ¤æ­ŸÌ¾vØ_e7ל™þÆ”z­}÷ÂìSÀ4XøRí‡W¥ù$ ®Î“ß̾vØ­5禿-¥^k¬:uïÒ*ÃÏÂÀk\Vú°OÒ`ª_pdT»7e_;ô óˆ/njt«/>&ª=›³Ódá`ˆUÅΨ-=>}è'i05VŸîÛô#¦»þΨMÌOSJ=uþAÑÝtö1`,ü ¹îÏ©…‡åÿ$ ¤Ö÷þ9ûÚ`šÊ­OïýÅöì·¤Ôk퇮Ì>FÌ…?€Ð~ìßÒ‡’Ô‚yÑ]wGöµÀ›¨êÛ¢~Ù ùïH©Çš·“}Œè…?€Ñüöß§% ¦ú…o‹j×óÙ×o¤ÛŠÆªSÓßR¯5®93¢ìdŸ$z`á`T”Ý(¾þéÃ@Iƒ©Xñ‘ˆN3ûæàu4¿ùWéïF©×Š«>Uk*ûÐ# £¤UúГӇ‚’SëöOgß:¼FëßÏO/J½V|þW£šz)û°,üŒ˜rjKÔ/;!}8(i0u¿6ûÚàUGV¥¿¥^«/=.ªÝ›²ûÉÂÀ*wmŠÚ¥Ç¥ %  E‡G¹åÉìk`ìu×ݵ‰ùùïD©‡ê‹‰rÛ3ÙÇ€Y`á`Du·®‹Úâw¤ %õ¿bùIQµ¦²¯€±UnþÁÞ/de¿¥^ª_ò®(·>}Œ˜%þFX÷çODí¢£Ò‡†’ú_ó–}匥rÇú¨_|tú»Pê¥úe'Dµscö1`YøqÝ-OEí’w¥%õ¿öCWf_9c¥ªo‹bÙ{Ó߃R/—¿?ª=?Í>FÌ2 s@wû†¨-=>}ˆ(©ÏM¼÷o¤€V-Š/œÿ”z¨Xùѽ «Ì=þæˆr÷æ¨/{_ú0QR«/=>ªúöì+`n+;ѸæÌô7 ÔKÍÎŽè4²O}bá`©ŠQ|ùôô¡¢¤þÖXujD·•}åÌY­Û?þö“z©uÇg"ª2ûÐGþæšN+7ýeúpQRk­97û¶˜“ÚwO¦¿ù¤·èðè<~möñ`,üÌQ­ÿ¸0¦Î; Ø(©ou^™}ÕÌ)í¯HëI3­Xvb”[žÈ>> ˆ…?€9¬³î;Q»ðméCGI}êü·D÷ù{³¯€9¡óè×¢¶`^þ[OšAÍëþ(ªæžìãÀYø˜ãÊ]/D}ÅÉéÃGIý©~Ñ/EµscöU0ÒºOݵ‰ùéo-¢Ó̾V†FUìˆâŠßH¯I¯Û‚yѼáO¢ÜúTöQ`ÈYøàÿj7£õýË£¶øùƒNIûUóQUÙ· @ºªØÅUJ§Iÿ¯‰ù{ßïå–'² #¯¯ÓŠÎÃ+-þI#^ë®Ïeß&©ªÆî(¾trúûLúÅêÿòÖhÝñ™¨v=Ÿ}D1þØ·Ví‡VD}Ù‰éƒPI½ÕùÁŠì› EÕØÅŠ¤¿Ë¤ÿ®¸òƒÑ~ð‹Q5_Î>Œ( LOYFçé5Q¬>#¦†`8*iMÝgÖdß"ƒÿe?Ë~‚ê­Û?å‹d æ ÌXwÛ³Ñ\;µ%¿œ>0•4Íå ÿ™}} ðo|;ÿ-¦ñmáaѼþ£ûôífö‘`±ð@ïºèûãÀ˜°ðÀìë¶£óÜ=ѼósQ¿ò7cj°’þ·Æ—OóKÀœS5_ŽâêßIsinV_rl4¾úñh}÷¢ó£ë¢ÚýBöG€1eှ+ë;¢óôšhÞõOQ¬:-¦&MÒJãÞ+¿@U•}=ÌÚ²_ã꥿µ4¢MÌúâc¢X~R4VŸÍ›ÿ:Úw/ŒÎ£_‹îó÷ù¥|†Š…?¯ìFw뺽Ü\» ×~"êË?µEGäx¥1ªuçg³o€YQíÞÝ ß“öݦ¢|ñ‘èn~8ºÛ×G¹cC”Å®ì/ÄLü…ˆkXPº)›IEND®B`‚‰PNG  IHDRp€ô4ù pHYsèèµ{Rk IDATxœìÝy˜¥gYàa!›Š ¢(ˆŒ¢ˆ *.¢¸à6êê ƒ£Î:*ƒ3½%}!û¾5Y¡³Bö=!!{gß÷}O:]g?ç{çªjÒÝï[ÝUõ|ß9÷}]¿¿ø‡¼ßyÏsò¤êÔw% qFÕipë7RïÂRç„¿L­?˜¦–¿>MýßïÒ<ÔÚåmiôÄ­ÑÖ©j=™Úû¼7|^ª†-}jøs3Ÿ{혷}sæs$ÐLßý(0è¦Ág§îÙ_Z»¬YüòøR{w¦ê™{¢_°AÕšÇR{¯ Ÿ›j@‹_>³Ôéžý/ip×¹) zÑ/_ ÔØð±S÷ÌNS;|wü°ŸÀ¦?W«Š~@KmTË_—:'ý·4¸÷âè—0a53ýc­½KvN­=4~ OpíýzæGÒ IªçH­Ýß>GÕÌZ{½;õ.Ù-ºÏG¿”u°Àšuž›ùÝdße_秪ó\ôK6JõÜý©µÛÛÃç©ÜöoHÝs§Qëéè—3ðïXà@ ~âfæ×¤¶Ý:~X+uŽühJýVôË6Éè©;Rkç·†ÏU5¼í^›ºç,J©»&ú% Xà@¬þõ_MS;ùpU—:ÇüÞÌFÀ8=z}j-]ø|Õ´ë¤ÁÍ'E¿¤aâYà@€á·¥öá¿?ŒõâåͰýÒ€95¼ï’4µl«ð9«ñ¨}Ô'ÒÈ_ç„08°Àú«ŽLSË^>€õB÷“7Œ­á]g§©%¯Ÿ·ZÛ½&õ¯;&úe ÉÈô·ùwŽÿ³ð¡«×Yñ) :Ñ/˜WƒëIS‹6Ÿ»Ÿ:_ÿó”zSÑ/m˜(8°†ÞZ_~Wø Õw|ðð“7Lþe{†Ï^W­}2ž¾+ú¥ ÃæÙàž ÓÔvÛ„X½¸Î‘ó“7LœÞ9ÿ'|kÌÚñ{Òðák£_Ú0,p` n9ÙְοžR¿ýò€…WU©{Â_„ÏbW­m·Nƒ;ÏŽ~uÃØ³ÀyÒ¿ê4µøeáU/®sø¯YÞ0Ù†½Ô9üWÃg²Æ¬e[¥Á-§D¿ºa¬YàÀ<è¯:ÊÖ°öLUoMôËÂUÝÕ©½ïûÂg³Æ¬%[¤ÁgD¿¼alYàÀ›þñQª³~µ÷yoªÚOG¿< 6ªÕ¥Ö.o ŸÑ¿?3>|èêè—7Œ% ˜CÃ.OSÛ¾:|pêŵ÷xgªž$úåµ3zøš™ï/‰žÕ³vxS>y{ôËÆŽÌ‘ÑÓw§©å¯˜zQ­¿7UÏÜýò€ÚÞ~ZšZüòð™­ñªõåw¥QguôËÆŠÌ…A/µü¹ðA©ïøà°üuiôȪèWÔ^ÿ²=Ãç¶Æ¯ÎqýÒ†±bs {Úçä¾£e¯JÃû¿ýÒ€ÆèžüÙøù­±«ÍÑ/m8°‰·žš¦m>õïZòŠ4ô`v†ýÔ9ì#ñs\ãÕ¶¯NÃÇo‰~uÃX°ÀM0šz2MmÿÆøÁ¨Z´yÜx|ôK©šz"µv{{ü<×XÕ:èçS¢_ÞÐx8° :'}&| êÅõ¿µ{ôËmôøÍ©µÝkÃgºÆ«þµ+¢_ÚÐx8°‘†^1óÓÑÃP/4ý»ûÀ¦Þr’Ï9šÓZ;}OµŸ~iC£YàÀÆ Rkߟ „z¡ÎÑ¿ÒhýÊ€±Ñ?Yø|×xÕ=ýï£_ÖÐh8°ú«Ž €z¡ö?“Ro*úe㥥ÎQŸŸó£–¼"ž{ ú• e³5¦Ö^š©µËÛRµú¡èWŒ¥ªóljïñÎðy¯ñ©{ú?D¿¬¡±,p`–ú7>ø´¶é/X=vCôKÆÚèÑëÓÔ²W…Ï}G­í^“F­§£_ÖÐH80K­ý~*|ðiúGp·HûΉ~9ÀD\Lüì×ØÔ»`yôKÉfapçÙáOk\sxôË&JïÔ¿ ŸÿZ;oJÃAôKÇf¡süxú®Ô;ý Ñ/˜<Ã~êü¡ðÏwýŠ†Æ±ÀB£îóißÿ¯sįÏüw`áUÏ=ZÛ¿!üó€š_ç¤ÏD¿œ¡q,p PÿšÃÃݤ×Úý©j=ýR€‰6¼í›ijÑf០ÔìZÛ¿>¥A7úå b…Ú‡ýjø ›šô¿XðøMÑ/`úûpNû\øg5¿Ám§E¿”¡Q,p Do*M-yEø›Ømž†·žý*þÍ ›Úû¿?þ3‚]÷ôˆ~%C£Xà@Áí§‡¸I®áöÑ/à;Œž¾3µ¶{møç5·öŒ~C£Xà@î™ÿ>à&µî±¿ŸRUE¿€uÜøµðÏ jpK¶˜ùIw ŒhíÿÓñnkïýã†:Ô\÷Äÿþ™AÍmp÷yÑ/ah Èé®IS‹_>Ü&­Ö¶[§Ñ·F?} §7•Ú_þ‘ðÏjf½ wˆ~CcXà@ÆðákÂÛ$6Xõ•èG=|õ̯ÃD~PóêžüÙè—/4†dô¯;&|°MZ½oü]ôcf©wÞ’ðÏj^#?ý҅ưÀŒî¹>Œ,dí>0ó§I€† fþªPôg 5«é_¿ÊXà@Fç¸ÿ>Ø&¥Öö¯OÕ3÷D?r`#ž¾kæ{ì¢?S¨A-yEJ£aôKÁ2ÚýBü`›„m–†·žý¸€M4¸ò€øÏjT£©'£_¶Ð8ÑÚû½áCmêõÅèG Ì…ªJ£>þÙBÍiôü#ѯZh ȘÚííáCmÜkü 3¿7Œ‡êùGRkû7„ÆP3=soôKÁ2¦¶cøPç¦O~ôÔјcƒU+Â?g¨ }„"81µtËð¡6Î ®;:úó¤sÌï†ÖPý>vSôKÁ2¢Ú8×=þÏ¢/0ªÕ¦ÖòmÂ?s¨Þ½>ú¥ `Ñm\kíúý©j?ýx€y6¸úÐðϪw8PÆ2¢ÚX¶hó4¼÷ÂèG ,Ί߈ÿü¡Úfe,p #z c½ó–D?V`UÏÝŸZÛ½&ü3ˆê™”±ÀŒè6nµúy2&PÿŠýÂ?‡¨žYà@ Ȉhãö'ëgîŽ~¤@„j”Úý\øçÕ/ (cÑmœ\y@ôã»!M-Ù"ü3‰ê•”±ÀŒè6.uû•”ª*úqÁzgþcøçÕ+ (cÑm,ÚöÕiôô]Ѩƒ~+µvGüçÕ& (cÑmšþÒB€3¼ýôðÏ'ªO8PÆ2¢ZÓëö¿:¼D÷Øßÿœ¢zde,p #z 5ºe¯J£§ïŒ~„@ UÏ?’ZË·‰ÿ¼¢ð,p ŒdD´&׿|ßèÇÔXÿ[»…^Q|8PÆ2¢ZSëü¡”ªQôãêl4Hí}Þþ¹E±Yà@ Ȉhlé+Óè©;¢ÐÃ;ÏŠÿì¢Ð,p ŒdD´&Ö¿`»èÇ4Hç˜ß ÿü¢¸,p ŒdD´¦ÕÞóGSt£Ð Õs÷ÏüñƒèÏ1ŠÉÊXà@Fô@kT‹6KÃ{Î~d@õÎ]ÿYF!Yà@ ȈhMª{Òg¢ÐTývjíööðÏ3Zø,p ŒdD´¦ÔÚñ»SÕ~:úq 6¸ñkáŸi´ðYà@ ȈhMipÝQÑ C>þ¹F ›”±ÀŒèÖ„:‡þrJUý¨€10zðò™ïÕ‹þ|£…ËÊXà@Fô@«}K·L£'n~LÀé÷ÇñŸq´`Yà@ Ȉhu¯þÒèGŒ™ê™»ÓÔ’W„ÎÑÂde,p #z Õ¹Ö.ß—Ro*úc¨wú߇ÖÑÂde,p #z Õ¹ÁuGG?`LUígRk‡7†ÞÑüge,p #z ÕµöþïO©E?`Œõ¿µ[øgÍ8PÆ2¢Z-[´YÞwIô£ÆÝ ›Z»¿#þ³æ5 (cÑ­ŽMÿe€…0Xµ"ü³æ7 (cÑ­v-yE=}Wôc&E5Jí}ßÿHó–”±ÀŒèV·zg}1ú‘fpÓÊðÏ@š¿,p ŒdD´:ÕÚñÍ©ê<ýH€ISU©}àÃ? i~²À28=ÐêÔàÊ¢0¡†wžþYHó“”±ÀŒèV—Ú{¼3¥Ñ úq¬sØGÂ?iî³À28=ÐêÒô_€ˆ4¼ÿ[៉4÷Yà@ Ȉhu¨ýåñÓ7@-tV|<ü³‘æ6 (cÑ­ ®?&ú1Ì=|MšZ´Yøç#Í]8PÆ2¢Ztí½ß“R5Š~ ÿ_gÅo„FÒÜee,p #z E7¸ñøèGð"£¾þIs—”±ÀŒèY{Ÿ÷úé –:‡ÿZøg%ÍM8PÆ2¢ZdÛOŒ>~€uò©Æ' (cÑ-ªö~?•RUE?Àzuý¥ðÏLÚô,p ŒdD´¨†·œ}ô4¼ûÜðÏLÚô,p ŒdD´ˆÚ{¾ËwßÐ9äÃ៴iYà@ Ȉh ®<0úØŠ o?=ü³“6- (cÑm¡kíøæ”úíèc(ÖÞï'Ã?Ciã³À28=кþùË¢`V«¾þJŸ”±ÀŒè¶ -{UªZOF90ú­T­y4ž¼=¾z¦é/Þu΋=xÅÚÿýé»Rõ콩ꭉþ4ѰŸZ»þ@üg)mT8PÆ2¢ÚBÖ;õo¢¨»~{æƒöðæSÿ²½Rïìÿº+?•:‡ÿZjïýžÔÚáijñË7íýhÙV©µë÷§ö?“:_ùÍÔ=å¿§þ%»¦ÁÍ'¤Ñ£×YòëÔ¿ôË៥´qYà@ Ȉh Ö¢ÍÓè©;¢¨‰ªýLÞsþÌ¿uOþlêö+3K•©E›Õàýj³ÔÚý‡R÷ØßŸùµÏá-'§êù‡£ 6½Ümmÿúø÷(Í: (cÑm¡êûÉè£"—5·}#õÎ]”:GÿNjíöƒáïIS{w¦î ™×>ó+YÀäéóÂß‹4û,p ŒdD´…jxÿ¥ÑG ,êÙûÒຣf~5©½Ï{g~/ú=h>jïù®Ô;ãÒðîóf¾ÕšÇÒÔÒW†¿ÿhvYà@ Ȉh Q{ÿ÷G30ŸzSixë)©{Ê_Oì—|¶–o“º'üEÞyVJ£aôæÑô{]ô{Žf—”±ÀŒè¶ ®:(ú˜96zúÎÔ¿lÏÔ9ò£ijé–áï3uªµÓ[Rï´ÏûS£'o«Ç÷u©8ïÇPÆ2¢Ú|×ÚvëTuWG30ªÕ®]Úü¡ð÷–¦ÔÞÿ§×.±ûíèÇ̡Ί‡¿¿¨< (cÑm¾›þ1c ¹ª©ÇSÿò}Sçû/ΛPkÇïNý󗦪õTô#æÀðŽ3ÂßWTž”±ÀŒ±˜_}ÄÀF=|uê®üTšZ²EøûÈXµí«Sï´ÏÍü4Ð`U•Ú{½;þ=EEYà@ ȈhóYûÀŸ>^`–î»é—S{¯ ÿû–n9ó=9ÕÔÑØHý+ö‹/QQ8PÆ2¢Ú|6¸æ°èã ¿¸{ògÓÔ²­Âß7&­Öv¯Mý ¶MUoMô˘¥é{ÛZþºð÷å³À28=ÐæóOêNÿia ¾F¬Jݯý§4µøeáï“^kç·¦ÁuGÏüZн3þ!üýCù,p ŒdD´ùª÷¿‹>Z`=†÷]²ö/¨øRâÚÕ9ô—Óè±£_"@¡ê™{,Á”±ÀŒñ”×E-ð¦£~+üýA™–l‘zgÿï”Ýè— P sÌïÅ¿ohƒYà@ ȈhóQ{ï÷D+ðïT«Zû7þ+qãÞKG^ýò2†wþ~¡ ge,p #z ÍGý‹vˆ>V`Zojæ'9|9qƒ[üòÔ;ûK) ûѯ&`CR|Ž¿Ðz³À28=Ðæ¼E›¥êÙ{£&ÞðÖSSk·ŒOМÔ>àgÒè黢_VÀzô/Þ9ü}BëÏÊXà@Fô@›ë:‡|8úHa¢ÍüºÔWÿ0ü½@óó'Ç×ýÖ¡j=™¦–¾2ü}BëÎÊXà@Fô@›ëúWì}¤0™ªQê_²kšZöªð÷Ío½Ó¿ÒhýоC÷ø? к³À28=Ðæ´Å/OÕÔãÑG §zîþÔ9ì#ñïZ°:‡þ’÷[¨™á½…¿7hÝYà@ ȈhsYç+¿}œ0q«V¤ÖòmÂ￾ÖîïH£Çnˆ~ ÿÎô_‹~oÐK³À28=Ðæ²ÁuGG'LŒªólê÷Gá÷^ñß‹3¼ëœè—#ð¯ú—íþ¾ —fe,p #z ÍYË^•ªÞšèㄉ0zâÖÔÞëÝñ÷^õhñËÓઃ£_–À¿.×}Yý²À28=Ðæªé¿zÌ¿éŸtó/zI‹6Ký‹vŒ~yÂDªž{ nZ™zgýóÚï#[ºeü{‚^””±ÀŒè6W V}%ú(a¼ û©÷Íÿ~×Uïzg)ú• cÿ6ûÎNý —§ÎÑ¿“Z;¿5üÞ+Ÿ”±ÀŒè6'-~YªZOE%Œ­é_Oì¬øø»®FÔ;õofþ¬<°‰Fƒ4zü¦™/‹ïžüÙµ_P¼hóð;®Ùge,p #z ÍEC9úalU«Jí}ß~ÏÕ¬¦ÿe3UUôËš£¥Ñã7§ÁµG¦Þ©›Ú| M-Ù"ü.kn²À28=Ðæ¢þ¥{D#Œ¥éÿòÛÚõÂ︚Y÷¤ÏXâÀzTÏ?œ†·žšzç-I£>‘Z;¼1üÎjþ²À281Cñ黢ÆÎðþKSkùëÂï·š]~)C¸ªó\Þ}nê_¸}êó{©µó÷†ßM-l8PÆ2¢Ú¦ÖÞûÇ£ÆÎð¾KRk»×„ßoGÓ?acØK£¯HýË÷IÝ•ŸNí½~l毴EßCÅfe,p #z mj½sþ%úa¬XÞh>\y@ôKæíW¡7Ÿz§}.uþPšZúÊðû¦úee,p £ññoG!Œá=¤©m_~¯5†-ÙbæOCã¿·æ–“gþãQçˆ_O­åÛÄß-5" (cÑmSjíôªæÈè¡«RkÛ­ÃïµÆ·Öv¯õ/14FÕ]†÷œŸúí˜:Ç~2µvy[øRsóÞe,p #z mJÝ•ŸŠ>> Õ3w§ÖNß~§5þMykõÜÑ/yx±Ñ`æ¯î V­˜ùU¨öþ?¦m~_4>Yà@ Ȉh›ÒàÚ#¢¯j=™Ú{¾+ü>krjïóÞ™¿ÊáÂû¬/®ýÞše[…ß w8PÆ2¢Ú¦T=wôñA³õ[©}ÀÂï²&¯Î‘›ù©˜oÕšGÓðÖSRïœÿ“:G~4µ–¿.üõ¯ÉËÊXà@Fô@ÛØÚ_þ‘裃ÆëžðáwY“[ïì/E_ÆLÕ[3ó—ôú—í9ókÖí½ßþ:—¦³À28=Ð6¶î)}tÐhýKv ¿Çšðm–†·œ}§ï­Yü²ø×µ´Ž,p ŒdD´mpãñÑG5¼û¼4µøåá÷XjmÿúT=sOô• ‘ß[óªðׯTš”±ÀŒè¶Q-Ú,USOD4RµúÁÔÚáMñ÷Xúצ¿‡) ºÑWƒ©Ö<¶vYsïKjmÿ†ðש´)Yà@ ȈhS{ßÿ}lÐLU•:+~#üKßYïÔ¿¾DéM½ô{kmþš”æ2 (cÑmcêñÑÇÔ¿tðû+­¯Áª¯D_æÛhø¢ï­™ùU¨%¯íIó”±ÀŒè¶1 oûFô±AãLÿKÓÔÒW†ß_i}µ¶Ý:ž¼=úª0‡FOߕכz§á_¿·f«ð×™‘”±ÀŒè¶QßÓz2úØ YFƒÔÞï§âﯔ©}ÐÏÏü”Í3ýÝtÃÛ¾™zç-IO­Þþz’ê’”±ÀŒè6ÛÚ{¾+úÈ qüꔚTÿ¢£¯ 9¾·FšU8PÆ2¢Úlë®ütô‘A£TÏ?’ZË· ¿»RqK·L£Çnˆ¾:üß[#mr8PÆ2¢Úlë_±_ô‘A£tû£ð{+Ͷö~?™Ò°}}&RõüÃkÿ„÷ô¯BñëijÛW‡¿¤¦ge,p £qðák¢ cx÷¹áwVÚØzç-޾Bcoú;冷Ÿžúç/M¯üfjíøÝáÏ]Ç,p ŒdD´YµìU3_Æ ¨ªÔ>ðƒñ÷VÚØ¿<º2ú&a?¾Ú÷ÖHYà@ Ȉh³©sè/E4Æà¦•áwVÚÔÚ{ÿ¸_¥ÚØï­yì†4¸úÐÔ=ù³3¿’6½‹~žÒ¤fe,p #z Í¦ÞY_Œ>.h†Ñ0µ÷zwø•æ¢þ…ÛGߨf}oÍQŸH­í_þÜ$½”±ÀŒè6›7Ÿ}\ÐÓ-&ú¾JsÖ²W¥êÙ{£¯UmTí§ÓðŽ3Rÿüek—5;¾9þIÚ`8PÆ2¢ÚlªV?}\ÐŒï¾Ùç½á÷UšË:GÿvšHývÞéÚï­9þÏR{’fŸ”±ÀŒèVZkû7D4ÂðöÓÂï«4 o=%»ê™»g~‚®wÚçRç३¥[†Ÿ»¤MÏÊXà@Fô@+­sدD4Bç°„ßWi>jíú)õ¦Ò¸ð½5Òäde,p #z •Ö;íóÑGµ7ý'‚£ïª4ŸõÎù—ÔDUwuÞwÉÚ_…:îRk§·„Ÿ¥¤…ËÊXà@Fô@+mpõ!ÑGµ7ýÑwUš×–¼"ž¸5ÕÚ “F|;õ/Û+u¿þ穽ç»ÒÔ¢ÍâÏNRX8PÆ23ø¼"ú¨ ÖªÖS¾/CQgÅÇS½¿·æ•ág$©^Yà@ ȈhE-Ú|¬¾÷æCÿ[»ÅßUiÞyVM¾·æ ág!©þYà@ Ȉh%Mÿø9°aí½ß~W¥…ª½ïûR çõNUÝç_øÞš•ŸJ­ÝßþÏ-©™Yà@ Ȉh%u¿úÑǵ6¼÷¢ð{*-tƒkŸ»K4¤Ñã7Íü*T÷äÏ®]ˆ.Ú<üŸQÒxde,p #z •Ô?iô1A­Mÿt@ô=•ºÖ.ß—R¿5û SÒè‰[Ö~oÍ7þ.µøÀÌ—#GÿóHß,p ŒdD´’7}LP_ƒNjm÷šð{*EÔ¿`Ûì©V?”†·œ”zg)uÿµÔZ¾MøÿoI“•”±ÀŒF ½GVEÔÖô¿˜FßQ)ªÖ¶[§êùGÖû½5¾JR²À28=ÐJšþ@¬[÷ë~G¥È:G~4uW~:µ÷z·ï­‘TË,p ŒdD´\­¾'úˆ ¾†½ÔÚþõá÷T’$­? (cÑ-WçàEÔÖð¶o†ßQI’´á,p ŒdD´\Ó?¬[÷¤Ï„ßQI’´á,p ŒdD´¹ø #0©Z»¿#üŽJ’¤ ge,p #z å\lôA-UÏ=~?%IR> (cµx]}DPKƒk ¿Ÿ’$)Ÿ”±ÀŒè–«j?}DPKÝþ2ü~J’¤|8PÆ2¢Ú†j-ß&úx ¶Z»½=üŽJ’¤|8PÆ2¢Ú†jïõîèãZªž½/ü~J’¤²,p ŒdD´ Õ9â?FÔÒকá÷S’$•ee,p #z m¨î }¨¥îÊO…ßOI’Tž”±ÀŒè¶¾Ú{ýXôÑËz IDAT@-uûHøý”$IåYà@ Ȉhë«}ð/D ÔR{¿Ÿ’$©< (cÑm}uŽúDôÑ@ýTUšZ¶Uøý”$IåYà@ Ȉhë«»òÓÑGµSM=~7%IÒì²À28=ÐÖWïô/D ÔÎè‘kÃï¦$Iš]8PÆ2¢Úúꟿ,úh v†·}3ünJ’¤Ùee,p #z ­¯þåûF ÔÎຣÃï¦$Iš]8PÆ2¢Úú\lôÑ@í ®< ünJ’¤Ùee,p #z ­¯ágF ÔNÿâÃï¦$Iš]8PÆ2¢ÚúÞiôÑ@íôÎ]~7%IÒì²À28QßAw]ôÑ@íôNû|øÝ”$I³ËÊXà@FmÝSwD ÔN÷Äÿ~7%IÒì²À28=ÐÖWµúÁè£Úé~õÃï¦$Iš]8PÆ2¢ÚúªÚOG ÔNçÈ…ßMI’4»,p ŒdD´õ•úíè£Úéòáð»)I’f—”±ÀŒè¶ÎmžRUE ÔNçàÅßOI’4«,p ŒdD´uÕÚvëècZ²À‘$©yYà@ Ȉh몵ãwG Ô’Ž$IÍËÊXà@Fô@[W­Ý~0úX –|Ž$IÍËÊXà@Fô@[Wí=ß},PK8’$5/ (cÑm]µ÷ú±ècZ²À‘$©yYà@ Ȉh몽÷G Ô’Ž$IÍËÊXà@Fô@[Wí}~"úX –:‡übøý”$I³ËÊXà@Fô@[Wí}ÿCô±@-YàH’Ô¼,p ŒdD´uÕÞï§¢j©sè/‡ßOI’4»,p ŒdD´uÕ>àg¢j©säÇÂï§$Iš]8PÆ2¢Úºjø³ÑǵÔýê„ßOI’4»,p ŒdD´uÕ>èç¢j©»òÓá÷S’$Í. (cÑm]uþPô±@-õNý›ðû)I’f—”±ÀŒè¶®ÚÿBô±@-õÎü§ðû)I’f—”±ÀŒè¶®|¬[ï¼%á÷S’$Í. (cÑm]ù3â°nýKv ¿Ÿ’$ivYà@ Ȉh몽Ï{£j©Åþá÷S’$Í. (cÑm]µ÷üÑècZ¬Z~?%IÒì²À28=ÐÖUk÷Š>¨¥ÁM+Ãï§$Iš]8PÆ2¢ÚºjíúýÑǵ4¼óÌðû)I’f—”±ÀŒè¶®Z;½%úX –F^~?%IÒì²À28=ÐÖUk‡7F ÔRõÌÝá÷S’$Í. (cÑm]µ–o},PKU÷ùðû)I’f—”±ÀŒè¶Î–m},P[SK·Œ¿£’$©8 (cÑm-Ú,¥Ñ0úh –Z»¼-þŽJ’¤â,p ŒdD´õ5ý«"ÀKµ÷û©ðû)I’ʳÀ28=ÐÖWµæÑè£ZêùÑðû)I’ʳÀ28QÛA÷ô]ÑGµÔýú¿Ÿ’$©< (cÑÍ ƒÙéþ…ðû)I’Êó¹ÊXà@Fô@[_Ãû/>¨¥þ…ËÃï§$I*ÏÊXà@Fô@[_ûΎ>¨¥ÁU…ßOI’Tž”±ÀŒè¶¾†·œ}4PKÛO ¿Ÿ’$©< (cÑm} ®;:úh –†÷]~?%IRy8PÆ2¢Úú\y`ôÑ@-Mÿ…¶èû)I’ʳÀ28=ÐÖWÿ¢£êiÐMS‹6 ¿£’$©, (cÑm}õÎúçè£Újíøæð;*I’ʲÀ28=ÐÖW÷¤ÏD ÔV{ÿ÷‡ßQI’T–”±ÀŒè¶¾º_ýƒè£Úêó»áwT’$•ee,p #z ­¯Îa¿}4P[½oüð;*I’ʲÀ28=ÐÖW{¿ŸŒ>¨­þÅ;…ßQI’T–”±ÀŒè¶¾Z»þ@ôÑ@m ®?&üŽJ’¤²,p ŒdD´õÕÚvëè£ÚÞwqø•$IeYà@ Ȉh* {ÑǵT={oøý”$IeYà@ ȈhªZóXôñ@= {ijÑæáwT’$å³À28Qëa÷øMÑǵÕÚù­áwT’$å³À28=Ð6Ôðîó¢j«}ÀÂï¨$IÊge,p #z m¨ÁõÇFÔV÷Øß¿£’$)Ÿ”±ÀŒè¶¡ú—î}~G%IR> (cÑmCõÎúbôñ@mõ/Û3üŽJ’¤|8PÆ2¢Ú†êžð—Ñǵ5¼í›áwT’$å³À28=Ð6TgÅÇ£jkôÄ­áwT’$å³À28=Ð6T{ÿ÷GÔ× ›¦¿,üžJ’¤ ge,p #z m¨Ö.ß}"¨­þÅ;‡ßQI’´á,p ŒdD´\Ã[O>"¨­ÁÍ'„ßQI’´á,p ŒdD´\ý+ö>"¨­Ñ£×…ßQI’´á,p ŒdD´\½sþ%úˆ ¶ªÞš4µh³ð{*I’ÖŸ”±ÀŒè–«»òÓÑGµÖÚé-á÷T’$­? (cÑ-×ôŸIÖ¯sð‡Âï©$IZ8PÆ2¢Z®ö—$úˆ Öº'üEø=•$IëÏÊXà@Fô@˶l«è#‚Zë_°mü=•$IëÍÊXà@Fô@+©j=}LP[ƒë ¿£’$iýYà@ ÈhÄÐ{dUô1Amº*üŽJ’¤õge,p #z •4¼åäèc‚Úò§Ä%Iªw8PÆ2¢ZIýK¿}LPk­]¿?üžJ’¤uge,p #z •Ô;íóÑǵÖ9ò£á÷T’$­; (cÑ­¤ÎÑ¿}LPkÓKÎè{*I’Ö”±ÀŒèVR{ŸŸˆ>&¨µÁ•†ßSI’´î,p ŒdD´’ZÛn}LPkÃ{/ ¿§’$iÝYà@ Ȉh¥U­'£ j«šz"üŽJ’¤uge,p £1ƒï¡+£ j­µÃ›Âï©$Izi8PÆ2¢Ziƒ¿}TPkC>~O%IÒK³À28=ÐJë_¼SôQA­uOþoá÷T’$½4 (cÑ­´é9Ö¯éá÷T’$½4 (cÑ­´Îa‰>*¨µág„ßSI’ôÒ,p ŒdD´ÒZ»|_ôQA­UÏÞ~O%IÒK³À28=Њ[´YJ½©èã‚úªªÔÚvëø»*I’^””±ÀŒèføÁÜiïÿþð{*I’^œÏ°PÆ2¢ÚlÜ´2ú¸ Öº_ÿÏá÷T’$½8 (cÑm6õ/Ú1ú¸ Öú.¿§’$éÅYà@ Ȉh³©{â_EÔÚàæÂï©$Izq8PÆ2¢Úlêò‹Ñǵ6zêŽð{*I’^œ”±ÀŒè6›Z;½%ú¸ ÞªQšÚöÕáwU’$½”±ÀŒè6Ûªîêè#ƒZkø³á÷T’$½”±ÀŒÆ À/>2¨µîIŸ ¿§’$é…,p ŒdD´Ù6¸æðè#ƒZë_¶Wø=•$I/de,p #z Í¶Þ™ÿ}dPkÃ{.¿§’$é…,p ŒdD´ÙÖYññè#ƒZ«ÚO‡ßSI’ôB8PÆ2¢ÚlkíöƒÑGµ×ÚåûÂïª$IZ›”±ÀŒè6ëm–ªîóÑǵ6ý“jáwU’$Íde,p £‘CðÁ+¢ j­wÖÃï©$IZ›”±ÀŒè¶1 ®="úØ Ö×~O%IÒÚ,p ŒdD´©wæ?EÔÚè±Âï©$IZ›”±ÀŒè¶1u¾ò›ÑÇõ6ì§©%¯¿«’$ÉJYà@Fô@Û˜Z»½=úØ öÚû¾/ü®J’$ (eÑm£ò—¨ «ûõ?¿«’$É Yà@FcáCWFÔZÿâÃï©$I²ÀR8=Ð6¶ÁµGFÔÚðŽ3Âï©$I²ÀR8=Ð6¶ÞYÿ}tPkÕó‡ßSI’d¥,p #z ml£~+úè öZ;¼)ü®J’4éYà@ Ȉh÷wDÔ^ç°_ ¿«’$Mz8PÆ2¢ÚF·hó”zSÑǵÖ;íóñwU’¤ ÏÊXà@F£‡áCWEÔÚô—}GßSI’&= (cÑmS¬Z}|Pk£Çn¿§’$Mz8PÆ2¢Ú¦ä/QAÆh¦–¾2ü®J’4ÉYà@ Ȉh›RgÅoDÔ^ûÀŸ ¿«’$Mr8PÆ2¢Ú¦ÔÚñÍÑǵ×=å¯Ãïª$I“œ”±ÀŒè¶©Uk>B¨µÁ•†ßSI’&9 (cÑmSÞqFôB­º2üžJ’4ÉYà@ Ȉh›Zÿ¢£êmÐMSK¶¿«’$Mj8PÆ2¢Ú¦ÖýÚŸD!Ô^{ß÷…ßUI’&5 (cÑmSkïõcÑGµ×=á/Ãïª$I“š”±ÀŒè¶É-ÚF¨µá}‡ßSI’&5 (cÑm.\y@ô1B­Mÿ”ÚôO«EßUI’&1 (cÑm.êžò×Ñǵ×Þó]áwU’¤IÌÊXà@Fô@›‹Ú~0ú¡ö¦ÿb[ô]•$i³À28=Ðæ¤e[¥4F%ÔZÿâãïª$I˜”±ÀŒ±ŒOÜ}”PkûΠ¿§’$Mb8PÆ2¢Ú\5¸þØè£„Z«ZO…ßSI’&1 (cÑm®êõÅ裄ÚkíöƒáwU’¤IËÊXà@Fô@›«:G~,ú(¡ö:Çü^ø]•$iÒ²À28=ÐæªÖŽoŽ>J¨½þùËÂïª$I“–”±ÀŒè6—UÏ?}œPkÃÛ¾~O%Iš´,p ŒdD´¹lxûéÑÇ µV=ÿpø=•$iÒ²À28=Ðæ²þE;D'Ô^kçï ¿«’$MR8PÆ2¢Ú\Ö=î¢j¯sÌï†ßUI’&) (cÑm.kíþŽèã„Úë_¸<ü®J’4IYà@ Ȉhs]5õDô‘B­ ï<+üžJ’4IYà@ ȈhsÝðÎ3£j­j?¦m~W%Iš”,p ŒdD´¹nú×C€ kïñÎð»*IÒ¤de,p #z Íuc?}¤P{ݯýIø]•$iR²À28=ÐæºÖ®ß}¤P{ýoí~W%Iš”,p ŒdD´ù¨Zóhô±B­ ï»8üžJ’4)Yà@ ȈhóÑð¶oF+Ô[¿•¦¿<ü®J’4 Yà@ ȈhóQÿü¥ÑÇ µ×Þç½áwU’¤IÈÊXà@Fô@›:Gÿvô±BíuOü«ð»*IÒ$de,p #z ÍG­Þ}¬P{ý+ö¿«’$MB8PÆ2¢Ú|U­~(úh¡ÖF]~O%Iš„,p ŒdD´ùjxËÉÑG õ6쥩¥[†ßUI’Æ= (cÑm¾ê»(úh¡öÚ| ü®J’4îYà@ ȈhóUgÅÇ£j¯wê߆ßUI’Æ= (cÑm¾jíð¦è£…Ú\{Dø]•$iܳÀ28=Ðæ³êÙû¢jmôøMá÷T’¤qÏÊXà@Fô@›Ï7­Œ>^¨·j”ZÛ½&ü®J’4ÎYà@ ȈhóYïì/E/Ô^çÐ_ ¿«’$s8PÆ2¢Ú|Ö9â?F/Ô^ïŒÿ~W%Iç,p ŒdD´ù¬µýRªªè#†ZÜp\ø]•$iœ³À281öó©;¢j­zæîð{*IÒ8ge,p #z ÍwƒëŽŽ>b¨·ªJ­Þ~W%I×,p ŒdD´ù®wÚç¢j¯³âãáwU’¤qÍÊXà@Fô@›ïÚý\ôCíõÏ_~W%I×,p ŒdD´yoé–) ºÑÇ µ6¼óÌø»*IÒ˜fe,p c"†æCWF3ÔZÕy6M-Ú<ü®J’4ŽYà@ Ȉh Qÿò}£j¯½×»Ãïª$I㘔±ÀŒè¶uW~:ú˜¡öº'þUø]•$i³À28=Тöž?}ÌP{ƒ+ ¿«’$c8PÆ2¢Ú‚´h³TµŸ‰>j¨µÑ£×ÅßUI’Æ0 (cÑm¡ÞuvôQC½†©µíÖáwU’¤qËÊXà@Fô@[¨úl}ÔP{Ã>~W%I·,p ŒdD´…ªsôoG5Ô^ïìÿ~W%I·,p ŒdD´…ªµã›£joxËIáwU’¤qËÊXà@Fô@[Ȫgï‹>n¨µjêñð{*IÒ¸ee,p #z -dƒ¿}ÜP{­ÝÞ~W%I§,p ŒdD´…¬wÆÿŠ>n¨½î×þ$ü®J’4NYà@ Ȉh Yç_Œ>n¨½þ¥_¿«’$S8PÆ2¢Ú‚¶ìU)ÑGµ6zàÛñwU’¤1ÊÊXà@Æä Ðë¢êmÐMSK· ¿«’$K8PÆ2¢ÚB7¸ê è#‡ÚkøÁð»*IÒ¸de,p #z -tÝ“þkô‘CíõNû|ø]•$i\²À28=кö>?}äP{ƒë ¿«’$K8PÆ2¢Ú‚·hóTuWG;ÔZõÌ=ñwU’¤1ÉÊXà@Fô@‹hxÏÑǵ×Úé-áwU’¤qÈÊXà@Fô@‹¨ñÎÑǵ×9æwÃïª$Iã”±ÀŒèQ÷«}ìP{ý‹v¿«’$C8PÆ2¢ZD­]Þ}ìP{Ã{ο«’$C8PÆ2¢ZTÕóG=Ô[¿¦–¼"ü®J’Ôô,p ŒdD´¨†·œ}ôP{í>~W%Ijz8PÆ2¢ZT½³¿}ôP{½Óÿ>ü®J’Ôô,p ŒdD´¨:‡ÿjôÑCí nZ~W%Ijz8PÆ2¢ZT­í^“R5Š>~¨µjÍcáwU’¤¦ge,p c¢‡éã7G?Ô^{w†ßUI’šœ”±ÀŒèÙàÚ#¢j¯»òÓáwU’¤&ge,p #z EÖ;õo¢jopÕAáwU’¤&ge,p #z EÖÞÿýÑǵ7zü¦ð»*IR“³À28=ÐB[²EJývô#€z«ªÔÚþ ñ÷U’¤†fe,p #z E7¼ÿÒèGµ×9ê·Âïª$IMÍÊXà@Fô@‹®éÑj¯ÑáwU’¤¦fe,p #z E×ýÚŸD?¨½á}‡ßUI’šš”±ÀŒè]k÷Š~PƒnšZºeø}•$©‰Yà@ Ȉhu¨šz<ú1@íµúùð»*IR³À28=ÐêÐð¶oF?¨½Þ™ÿ~W%Ijb8PÆ2¢Zê·8ú1@í o9)ü®J’ÔÄ,p ŒdD´:Ô9òcÑj¯j=™¦m~_%IjZ8PÆ2¢Zj-]JUý( öÚ{¾+ü¾J’Ô´,p ŒdD´º4zòöèGµ×=ñ¯Âïª$IMËÊXà@Fô@«KƒU_‰~P{ƒ« ¿«’$5- (cÑ­.õ¾ñwÑjoôämáwU’¤¦ee,p #z Õ¥öˆ~PU•Z;¾9ü¾J’Ô¤,p ŒdD´Ú´d‹”úíèǵ×ýêÆßWI’””±ÀŒèV§F|;úq@íõ/ß'ü®J’Ô¤,p ŒdD´:Õ¿lÏèǵ7zì†ð»*IR“²À28=ÐêT÷ø?~ÐŒïÁÙáMá÷U’¤¦de,p #z Õ©Öî?ý8 ºÇþ~ø}•$©)Yà@ Ȉhu«šz<ú‘@íõ/Û+ü®J’Ô”,p ŒdD´º5¼í›ÑjoôèuáwU’¤¦de,p #z Õ­Þy‹£ Ô_5J­Þ~_%IjB8PÆ2¢ZÝêù±èGÐ9æ÷Âï«$iB[¶Ujü ©wúR÷¸?Žÿÿ“ÉÊXà@Fô@«[­å¯›ù+;À†õ/Ý#ü¾J’& Å/Kí½ß“º+?•ú—홆÷]’Ò ûÂ<ºb¿øÿ™,p ŒdD´:6zòöèǵ7zäÚð»*I¿Z;¿5uŽúDê·$ o=5Uíg68×þÿ9—”±ÀŒèVÇ«¾ýX ߃³ýëÃï«$©¹µ¶{mêü¡Ô;ísipãñ©Zóè¬ÇÑàúcÃÿ9rYà@ Ȉhu¬÷ÿýX :Gÿvø}•$5¤%[¬ýU¨“?›«V¤Ñã7ÍüÇ€M5¼ùÄø¶L8PÆ2¢ZkðèÇÐÿÖná÷U’TÏZ»ÿÐw|oMg^fÑðŽ3ÂÿYsYà@ ȈhµlÉ)õÛÑjoôÐUñ÷U’TÃï­yzÁfÑðž ÂÿùsYà@ ȈhumôÀ·£ Ôßh8ó—Û¢ï«$iájm÷š¾·fÕŠT=sOì(zðòð3Éee,p #z Õµé÷ò:GýVø}•$ÍS‹_þÿÿ„÷ઃæì{kæÒôr$üœ2Yà@ Ȉhu­{üŸF?h„þ%»„ßWIÒ´hóÔÞëÝ©{Â_¤þåû¦ÑCW¦4쥺=y{üÙe²À28=ÐêüÅ{@ÞèÁ+Âï«$i¾·¦õTj¢é_áŠ>Ë\8PÆ2¢Zm[´YªZOF?¨¿Ñ µ¶{mü•$­·ÖòmRçð_K½³¿”†·œ”ªçNã¢zîþðóÍee,p #z Õ¹áí§E?h„ÎÑ¿~_%IÍùÞš¹T­~(þÌ3Yà@ Ȉhu®wÞâèÇпl¯ðû*I“ü«PÝãþhæ0 ï»$¥~;M’jÍ£áÏ —”±ÀŒèVç:G~,úñ@#Œž¸%ü¾JÒ$4.ß[3—ª©'ŸK. (cѭε–¿.¥ªŠ~DЭ]Þ~g%iœjm»uêü¡Ô;ísi°jÅÚ_…â%ªöÓáÏ*—”±ÀŒèV÷¦ÿ4%7ýgg£ï«$Ã÷ÖLÿ*Ôèá«Çú{kæRÕy.þùe²À28=ÐêÞ`ÕW¢4ÂຣÂï«$5íW¡úï4‘ß[3—ªÞšðç™ËÊXà@Fô@«{½oüèGP­y,M-Ú,üÎJR%»sįÿ»ï­y2ú-{¼ôÛáÏ8—”±ÀŒèV÷Ú| úAc´÷ù‰ð;+I‘µ¶{Mêö‘Ô;óŸÒক©zîè·æñ7è„?÷\8PÆ2¢Zí[²…k†B½Óÿ>þÎJRä÷ÖŒ†ÑoÅ“§7ÿZÈde,p #z 5¡áýߊ~LÐÃÛO ¿¯’´pß[ÓŠ~ÛeúWx»«Ã_¹,p ŒdD´&ÔÿÖnÑ šó_A—n~g%iο·fê‰èwXÖ£ê<þzÉee,p #z 5¡îWÿ0ú1Actýåð;+I³jÛW§ÎÁJ½Ó>—«V¤Ñã7¥TUÑo§ªZOÅ¿†2Yà@ ȈhM¨µó÷F?&hŒþÛ…ßYIZo‹_ö¢ï­™ùU¨a/ú­“MPM=ÿºÊde,p #z 5¥jõƒÑ aôÀ·Ãï«$}ç÷ÖÌü*Ô]çøÞš1T­y4üu–ËÊXà@Fô@kJƒ~TÐ £ajmÿúð;+iòj-ßfí¯BõÅýޚǣßYÕê‡Â_{¹,p ŒdD´¦Ô;ãE?*hŒÎ±Ÿ ¿³’Ƽ%[¤öþ?í{kHÕs÷Ç¿3Yà@ ȈhM©}ð/D?*hŒþû…ßYIcÔâ—§ö¾ïKÝ“>“W’F^—ÒhýVGMTÏÜÿÍde,p #z 5¦¥¯ô%‡PhôÔñwVRckíþŽÔýÚJýo힆÷]œRo*úm=qKøk6—”±ÀŒèÖ¤F^ý¸ 1Ú{üpø•ÔÀï­YóXôÛ 3zøšð׫§xÁ IDATq. (cÑ­IMÿ¹Q Ìô÷RDßYI5Ë÷Ö0†÷_ÿÚÎde,p #z 5©îñý¸ 1†wž~g%¶øe©½÷{Rwå§fþÈð¾KRt£ßšCûϽg²À28=КTk··G?.hŽA7µ¶Ý:üÞJZ˜Z;¿5uŽúDê·dí¯BµŸ‰~bB oûføë?—”±ÀŒèÖ´ª5F?2hŒÎÑ¿~g%Í}­í^»ö{k¦êÆã}o ¡7­ ¿¹,p ŒdD´¦5¼å¤èG1¸ò€ð;+i¾·fúW¡Nþ¬ï­¡–×O2Yà@ ȈhMkú¯deªç¿³’fWk÷ò½54ÊàêCÂïM. (cÑ­iuý¥èGÒÞç'Âï­¤u×ÚõûS÷«ú÷\ªîóÑo0kýË÷ ¿K¹,p ŒdD´Æµl«”†½èÇÑ;ëŸãï­¤oͪ©zöÞè·˜ý —‡ß¯\8PÆ2¢Z=xEôcƒÆÞ{aø•&®u~oÍ(úíæÅô¯·‡ß¹L8PÆ2¢Zë_ºGôcƒæ RkùëÂï­4Yß[Ó‰¾ù°`º§ü÷ð;˜ËÊXà@Fô@kbÓß”ë÷Çá÷V›mž:Ç~2õ/Ú1 ï9?UÝÕÑWBuÿ³ø{™ÉÊXà@Fô@kb­¾'ú±A£ ®="üÞJãRk§·D_i¨•ÎQŸ¿—¹,p ŒdD´¦V=swô£ƒÆ¨¦Ÿù©è{+Cí½<úJC­tùÅð{™ËÊXà@Fô@kjƒU_‰~tÐ(í>~o¥qhú_V´÷ýá÷2—”±ÀŒèÖÔº§üuô£ƒF響4üÞJãPç˜ß¾ÎP+­Ýß~/sYà@ ȈhM­½Ï{£4ÊèÑëÂï­4uOü/Ñ×j¥µýÂïe. (cÑ­±-Ú,Uí§£4J{wÆß]©áõÎü§è« õ1Ì|&‹¾—¹,p ŒdD´&7¼ýôèÇÒ;óÃï­Ôôúï}•¡6ª5…ßÉ’,p ŒdD´&×;÷ÿF?>h”áý—†ß[©é ®:8ú*CmŒ»1üN–de,p #z 5¹Îa¿ýø YªQjíüÖð»+5¹áÍ'Fßd¨á½†ßÉ’,p ŒdD´F·ìU) ûÑ¥{Ê¿»Rƒ=tUô5†ÚÜôõfÜ[ (bÑ­éù ³3¼ó¬ð{+5¹jêñèk µ1¸ò€ð;Y’”±ÀŒèÖôú—íý¡Y†ýFüÉW©–-}eJU}‹¡6úl/ ²À28=К^÷¸?Š~„Ð8Ý•Ÿ ¿»RkùG¢¯/ÔJïô/„ßË’,p ŒdD´¦×Úé-ÑgúKX£ï®ÔÄ:‡ÿjôõ…Zéÿ§á÷²$ (cÑm=y{ôc„fé·ÓÔ¶¯¿»RÓêžøWÑ·j¥sè/…ßË’,p ŒdD´qhpõ!ѧ{ìï‡ß]©iõÎ[}u¡VÚ{¼3ü^–de,p #z CÓßçÌÎຣÂï®Ô´W}u¡V¦–m~/K²À28=ÐÆ¡Ö®?ý¡qªÎ³ijÉ+Âï¯Ô¤†÷\}u¡^s¤÷²$ (cÑm\ªž½7úQBãtŽþð»+5©jê‰èk µ1zìÆð;Yš”±ÀŒè6. V­ˆ~”Ð8ƒŽ ¿»RSjíð¦è+ µ2¼ó¬ð{Yš”±ÀŒè6.uOú¯ÑšgÐI­åÛ„ß_© uûHô…Z\sxø½,ÍÊXà@Fô@—Ú{üpô£„Fê®ütøý•šPïÔ¿¾®P+ý ·¿—¥Yà@ ȈhãTõüÃÑgxç™áwWjBý+ö‹¾®P+Ý“?~/K³À28=ÐÆ©Á _~œÐ<£ajíô=á÷Wª{Ã{/Œ¾­P+#þcø½,ÍÊXà@Fô@§z§þMôã„Fê}ó†ß_©îù Tðbí/ÿHø½,ÍÊXà@Fô@§Ú{¿'úqB#¼<üþJu®µÓ[¢¯)ÔK5JSK· ¿›¥Yà@ ȈhcÕ¢ÍR5õxô#…FjÒI•ºÎ±ŸŒ¾¢P+Õê‡Âïål²À28=ÐÆ­ÁÍ'D?Rh¤Þ¹‹Âï¯T×ú—ì}E¡V†÷]~/g“”±ÀŒè6nõþ_{w}w]ßyÜ$@Q©Tm‹‚޵UœÑVª­GfZZkÖŽ¶UÖÓžÖVí U»ø[²',YXbYˆ@ °“’°%DY [ößý.÷»½{îU"I>ßßïwï}}—çãœç9óÇœ93óý|îûË»¿Ü»â›êG ”RúÒcòûKTÔ’Mw©¯(P(ñ/’ßËáÄȇà hUË?ïýêG ”–?÷$ù&*\ãÍâ@}=B‰VMÒßÍaÄȇà h•«o¬eÞvõcJ)ºçý&*Xþù¿§¾š@á„W}E~7‡  8€ƒz U±ø‘+Ô(¥,Øm ¯•ßa¢"Õ¼á4õÕ ÇŸÿùÝN,p€|XàêVÅÂkþQýXÒ —}I~‡‰Š_޼š7õò»9œXàù°ÀÔ­Šù3ß©~¬@i•í—Eˆº]¶w›úZ…’y/ËïåpcäÃpP´ª–ízFýhÒòÏ~¯ü!ÿÜßQ_G pʸègäÃpP´ª¯[¨~´@iE«gÊï0QjÞò_êëN¼vün78@>,põ@«jáþFýhÒjý’[cðPù=&R—n^£¾Ž@á4oüVùî2  8€ƒz U5oú[̲LýxÒ ð×ò{L¤Ì›ö&³4Q_E p‚‹?%¿ŸÃ ÀA=Ъ\úÂCêÇ ”Vòô*ù&RÖúE6¯æÏ>Q~?‡  8€ƒz U¹hõ,õãÊ+ËÌŸ}‚ü©Š¹B} â‰|kô“ßÏáÆȇà hU.¸è“êÇ ”Zô£3ä÷˜HÒÀxËÂ=ê+Nºu­þ~Ž 8@>,põ@«rÞ¤#Ì’HýˆÒÊ‚]í{¤¾ËD½.X|Šúú…?°X~?G  8€ƒz U½dÓjõ#J­¹â›ò{LÔëâû端PHÍëÿŸü~Ž$8@>,põ@«zÑÊ êG ”Z¶ëkô$¿ËD=ýçSÞvõÕ )Xô ýA,p€|XàêVõ‚S?b ôÂK?+¿ËD½*\úõ• Ë›öfùI,p€|XàêVùÆ›5êÇ ”Zºùný]&êQñ#ËÔW(¤¬ñ¢ü~Ž48@>,põ@«CÉ׫3PzþüÈï2Q·kýu%Mõu )Ùp‹üŽŽ48@>,põ@«CÍëÿUý˜Ò‹r¥ü.u»æMßQ_5 °¢;gÈïèHcäÃpP´:äÏ>Aý˜òËRóg/¿ÏD]«oŒ¥ÛŸTß4 °ÂËþJOG  8€ƒz Õ¥tÇSêG ”^t÷Ùò»LÔ­‚ŧ¨¯PhÞY¿%¿§# ÀA=ÐêRë?<ŒR˜wúqòûLԒǯSß0 °2Gû¯ÔÔ÷t¤±Àòa8¨Z] –œª~Ô@%D÷œ#¿ÏDΟ}bûŸ Ø·äÉä÷t4±Àòa8¨Zmšp˜Yä©7P~IÓ¼³~S§‰:X¼vúf…­š$¿§£‰ ÀA=ÐêTòÄ õã*!^{ü>u*oƯµÿy €ý .ù ù]M,p€|XàêV§š×}]ý¸jH"~‘Š*S´f¶úF…çÍx«ü®Ž&8@>,põ@«S­_OÐñú%ò;M4ÚZÿQj‘¯¾N@¡e{¶ÈïêhcäÃpP´º•¾ü„ú‘Õ&æÏyüN&~¡p‹ºT~WG  8€ƒz Õ­hõ,õ#*#~ørù&iÞ™ïà»o€š+¾!¿¯£ ÀA=ÐêVpáÿQ?r :²Ì‚(¿×D#©õWÜüó> ¿¯£ ÀA=Ðj×à!–5‡Ô¨Œô…‡­Ñþn #Þ‡Û HÖzgªÂg<  8€ƒz Õ±ä±åêÇTJsù×ä÷š(w}c,Ù´Z}m€RH6Þª¿³ˆ ÀA=ÐêXë?6tNæï4oê1ò»M”§ðª¯¨¯ PÑÊAùíD,p€|XàêVǼ3Þ®~ì@åÄ÷}O~·‰\ySßhYã%õuJ#Xü¿å÷¶±Àòa8¨Z]K_|Dýèêý¬øÜ“äw›è@Å,Vß <’ȼIGÈïm'bäÃpP´º­š¤~ô@夛ï¶Fÿ8ùý&ÚWÁ¢OðÅÅÀ0´¾+J}o;  8€ƒz ÕµÖ_ è¼æß’ßo¢_Í›|”e»7©¯P*Ѫ‰ò»Û©Xàù°ÀÔ­Îe;ŸV?~ zâÐüsÞ'¿ßD¿\üàRõÍJ'XøGò»Û©Xàù°ÀÔ­ÎE«g©?PI鶬1p°ü޵ /ÿ¼úJåùÖ,põ@«{ÁE¦>@¥Å?¹Ò}cäwêU󺯫>PZ™·Ýýãä÷¸“±Àòa8¨Zí<IJpú•Vµ?ŧb,9µýOøŒLüà%ò{ÜéXàù°ÀÔ^cñC—©PmYÚþjõ]§êçŸ÷ËšCê”ZxÅäw¹Ó±Àòa8¨µ~bösêcÔâOò½³~S~ß©ºyg¾Ã²=Ï©:PnYjÞ´7Éïs§cäÃpP4zMûKV-ÕG¨¼tÛz¾Ô˜º’7ã×,Ýñ”úˆ¥—n¹W~Ÿ»  8€ƒz ÑOK¿N}€ZHž^Ùþî)õ§êäM~}{9`ôš· Èït7bäÃpP4úiῪ> @m´¾wªÑ7V~ï©üySÞ`és÷«4PUûùðŸÇȇà hôÓZÿÞÛÒD}€Úˆî9G~ï©ÜyÓÞÌ_Þ”5^¬ìr ÀA=Ðè%ÏÜ®>@­4oý®üÞS9óÎx›¥/?®>Â@¥ÄkÈïv·bäÃpP4úEÍåÿ¤>@í4oúŽüîS¹ògŸhÙ®gÕG¨œà¢?“ßïnÅȇà hô«ÿŒ*V  v¢;§Ëï?•£`þÉ–5^RY r²æ5•ßñnÅȇà hôÊ’§nR  –Xâ«ðÊ/›%MõQªûåò¸çÝŠ ÀA=Ðè•…WýúHµýètùg°þqí€î /ÿ¼þ®w18@>,põ@£WæM~½YªP[ñZcà`ùg矶&nVK ÚâмIGÊï{7cäÃpP4zuÉcËÕǨµdÃ-•ÿ r\ðQËönUG ò’'VÈï{·cäÃpP4zuáþF},€ÚKŸ»ß¼éo‘ þƒ¬y[?_*ôHëŸËï}—cäÃpP4zuÞÄ×™Ežúhµ—íÜhþœwË?¨·?žn¹W}ô€zýó©)oßýnÇȇà h´ïâ/Q ­%N¸Ç‚¥Ÿ–&P—ëkÍß0‹|õ‘j%yìýýïA,p€|XàêFû.Xrªúhø¹,ûéÏŒ÷“6PçóÏý]K6­VŸ2 –ªþëS? ÀA=Ðh?õdÙÐóêãà—$OÝdÞôcõŸÔ‘Z_T­™ÍwÝ*͆5&.ÿ,èE,p€|XàêFû/Z=S}<üŠÌ{ÙÂ¥Ÿ‘>Ð(êká•_¶lï6õqj-~èRýçAbäÃpP4ÚþÜ“ÔÇÀ~Äÿ _¼Yµ‚ŧXºm½úø0³àâOÉ?z  8€ƒz ‘cà¿øˆúˆØl÷f /ýKùç¹óç}È’·© €ŸÉüÖÙ¼IGÈ?7è5\øÇ–<{§úTØÖ_Å©?'z  8€ƒz ‘»ä©ÕÇ@N™·Ýš7}Ç“vÔ®ÁC-\öEþC (¸Ö?—^ô8>—€|XàêFîÂËþ¯ú˜¦lÏ ¯þ{k ,ÿ ©zþÌã-ºë,Ë‚]êÇ ‡æÿ&ÿÜèu,p€|XàêF9ßþébå“ =oÍÛÌ›r´þ³¤JM8ÌÂËþÊ’ ·ðÏL2Icó¦«ÿ éq,p€|XàêFùŠÖÌQ£…{-Z=˼3CþyRÚúǵ<^ÿ}³fCýHŒ@ëKÅåŸ%‚Xàù°ÀÔòåŸû»ê£ ²´ý½Vá埫ÕO莸ñ,9ÕâµXÖxIýôŒR°ôÓúÏA,p€|XàêFÃþ[ש €ÊüÝ}¶ùßû_Öè#ÿŒ)JÞÔ7¶\ñ/¶,Ø­~L:$Û»­¶ß Æȇà h”¿æµÿ¢>.º$Û½ÙâûÏ·à¢OÖï?púÇ™?÷ƒí_ïj§M«€.ˆVMÔÞˆbäÃpP4ÊŸ7å f‘¯>2º¬õ¥å­ïy ¯ü²yg¼]þÙÓñ&nÁÂ[óÖ¾ö?'k}?€ŠKóÎx›þóG  8€ƒz ÑðŠ×-R=–îØÐþ˜ðŠ¿5λ­Ñ7VþY”»ñæÏ=©½ŒŠÖ̶ô¹ûø  †’Ç®Ñ cäÃpP4^þ¼« ±¬9dɳ?jÿ:]k1Òú\h}oŒôóiÂkÍ?ç·-¸øÏ­yÓ·-~ðK_x˜e €¶Ö—‘«ß¡”±Àòa8¨à%`Ûêc €²`—¥[×ZüÐeÝ1Íš×ÿ«…W|Á‚ ÿØüóÞoÞé¿nÞ¤#‡õyÓúßïõ[æÏûßÿS —}±ýntÇT‹\jéæ»-zAýÿt–íÜX®¿ìÆ»  8€ƒz Ñð ¯þõ±P­_xÊü–íy®ýXíÿµ¿Ó,òÔÿWP!­/(W¿;©cäÃpP4~ÞÄ×YîQ€‹|ó¦#wRÇȇà h4²¢{çªÀÅ÷Í“¿3!8@>,põ@£‘åŸû;꣰Yfþœ÷ÈߙР 8€ƒz ÑÈKž½S}|ö)yb…ü]©(±Àòa8¨¼ðÒϪÀ>‹O‘¿+%8@>,põ@£QÔ?βO«À+¤/,põ@£ÑåM9Ú,òÔÇ -Û»Õƒ‡ÈߑР 8€ƒz Ñè‹ï?_}ŒÚš7œ&7*Z,p€|XàêF£Ï?û½íŸêPÊüæM:BþnT´Xàù°ÀÔ:S²ñVõQ5­”¿18@>,põ@£Î,ùõQuÖl˜7õù;QcäÃpP4êàËÁ¶õêãj*ºëLù»PQcäÃpP4ê\á²/ª¨£84oÆ[åïBE ÀA=Шƒ lÙîMê#j&ºç\ý{PcäÃpP4êlÍþ¿úH€:‰óNÿuù;P‘cäÃpP4êp·ÌÛ®>V &¢Õ3õï? ÀA=ШóEwLU+P—_žšþù»OÑcäÃpP4ê|­)‹|õÑÝ9]þÞS†Xàù°ÀÔºS´fŽúh€ ËšCæM{“ü§ ±Àòa8¨u'ïôãÚ?é РѪ‰ò÷²Äȇà hÔ½âû¾§>^ ‚²ÆKæM:Rþ®S–Xàù°ÀÔº—wÆÛÍ’¦úˆ€Ši^ûÏò÷œ2Åȇà hÔÝâu ÕG TH¶s£5ÆËßqÊ  8€ƒz Qwógo–Æêc*"¼ô³ò÷›²Åȇà hÔýâõßW3Pé–{¬Ñ7FþnS¶Xàù°ÀÔºŸwæoð]8`Ô‚…—¿×”18@>,põ@£Þß7O}Ô@‰%þPþ>SÖXàù°ÀÔz“7ã­f‘¯>n ŒâÐüYï’¿Ï”58@>,põ@£Þ­ž¥>n „¢U“äï1eŽ ÀA=ШwyS±,Ü«>r D²=[¬1ñpù{L™cäÃpP4êmÑíSÔG”Hxùçåï/e ÀA=Ш·y“_o™¿S}ì@ $ÏÞÉφw 8@>,põ@£Þ×¼á4õ±E—&æŸ÷ù{KbäÃpP440ÞÒÔGX´f¶þ¥"±Àòa8¨ijý{v€}Éön3oòQò÷•ªÄȇà h$ªoŒ¥›×¨( pégôï*Š ÀA=ÐHW°àcêã &yüZù;JÕJ_xXýXR`84úÇɇéJ½Z}@Q4æùùûIÕJwlT?Y XàIGʇéògŸh–Dêc  yã·äï&U,m¼¬~´@)°À3Ž“5Ò­ž¥>†@,ݺÖýÉßKª˜Å¡úñ¥ÀpðfŸ(j¤Í›tdû×&@M%MóÏyŸü¤’ ¢~º@i°À¼¹ÿS?ØH^xÕWÔGˆ4oí“¿‹T5oú±êÇ ” ÀÁ_rª|°Qêké–{ÔÇôXºík ¬©hÁU?b 4XàáŠoÊ#îͲT}$@¯¤±ùsO’¿ƒT¹ðê¿W?e 4Xàѽs僊S¼n¡úH€iÞ6 ÷¨zÑ]gª3P,p‡xãJù`£âäM{³eÁ.õ±]–n]Ç?êAÉãת5P,p‡tÏVù`£b^óêc º)òÌŸóù;GJwoV?m 4Xà94f'nT úÆZ²é.õ±]Ò\þ5ýûF ògŸ ~Ô@©°Àr®ø‚|ÀQ±òÏ~¯YÒTMÐaÉS7Z£oŒü]£5—ÿ“úq¥ÂÈ!Z·H>à¨xE·OQMÐA™÷²yÓ•¿cÔ¥ø‘+Ô(8@é®gåŽ Ø„Ã,Ýñ”úx€ .þ”þý¢.õµ´ñ’ú‘¥ÂÈÉ›õ.ý £Â,>Å,ËÔÇŒRtï\ù{E }BýÈÒaäÞÚ/tTÌâõKÔÇŒBºm½5•¿SÔ)ÞŸ€ácä”îxš/´£}æM~½e{¶¨(¬9dþœwËß'jÕÄÃ- ÷ª=P:,p€að矬xTÈ‚‹>©>ž`B~m´ç…˾¤~ì@)±À†!ºï|ùÀ£âÆŸP.ñ}óäïu,Ùt—úѥĆ4²Æ”£åCŠüO©žSSCúüùÞAÁ«=PZ,p€aj®œ |TÜ‚ïÿ©úˆ‡,Øe>¿0*)yz¥úñ¥Å¦,ØmIGɇ·xÝBõ1û“e,ý´ü}¡Žùçÿ¾ú饯ðæÿ”@*nÞä£,Û½I}LÀ>D+åï u-Ùx›úñ¥ÆÔÛÁwáÐ |Ì,MÔGü’äñk­Ñ7VþžPÇÂË?§~ü@é±ÀF(ºÿù ¤bÝ>Y}LÀϤ۟lÿà€úý Žy“ްt÷õJ0RYfþù‘D*pýYºùnõI ö²æùg¿WÿnPÓ¢5³ÕIëM\IDATG¨8À($Ï?dC}ãäC‘Š›?óxËÂ½ê£ @}e©—ü…ü ®ùçÿžY«OP ,p€Q oí—F*vá²/ª)µÕ¼ñ[òwºæM9ÚÒϨP,p€ÑJSó"Tìâ/QŸTj'~`±ü ¶õ±äÑ«ÕG¨8@¤{_°Æôcõƒ’ ýÓâ鎧ÔG€ÚHž¹Ããåïu­yÓ·ÕG¨8@‡ÄWò}8tÀüóÞoùê£ @å¥;6˜7õòÙ_ׂ‹ÿÜ,‰ÔǨ8@§Z¼oŒ|hRq øUõ1 Ò2§ùsÞ-Ÿùu-¸à£fMO} €JbtXóŽiòÁIÅ.^·H}L¨¦8h/Ô³¾®ùç¼ÏRo‡ú•Åè‚ð†Óä” Ü„×Zúüƒêc @µd©…—~V?çkZ믞Ò=[Õ§¨48@7d™…Ë¿&¤TÜüÙ'XîQŸT*£¹âòù^×üù±´ñ²ú•Çè¢æªI|'í·Öÿ”°µì£ýètù\¯kÁÅŸâ;o€atY¼n!¿NEû-º}²úˆPjñƒ—ð?0Õ¼öŸÍ’X}€Ú`ô@üÄõÖ˜r´|ÈRëkÉcר(¥”´Þ±ÆëçyÍò&eñ׫?P;,p€Iwo1þÈ./oâë,}á!õ TÒÍk¬1ñpù¯[þÜZ²ýIõãj‰ÐKIláÍÿiCßåÏ|é•ù3·Ìçg7È#ݺ¶ýW êù]«±æ­ß5‹Cõãj‹ ?s§ygÿ¶~S¡ }Â,åß‘p éKš7õùÜ®SÁ’Sù« Xà*IlÍÕ³¬1éHùP¦âÔ¼îëê“ @ae;Ÿ6ïôãäóº.ù3ßiñO~¨~ì~† –î}Þ‚«¾jCýɇ4£èÞóÔÇ€ÂÉöliÿ“cõœ®Cþ9ï³èÇó S@Á°À "ݵÉÂkÿņ“m×?Î’Ç–«$…‘íy®ý× ò]ñ‚ þÀâG¯6KSõ#°,p€‚I‡^lÑqc\ë&nés÷©#rÙÞ­æÏz—~6W´ÖÿßF+ùŽ XàE•¦o¸Í‚+¿l‰Gȇ;õ>oú[,Û¹Q}Ð.ofŸ ŸÉ•jà` æŸÜþE©dÓõ#0 ,p€2hú?¾ÂÂN33l¨o¬~øSOògŸh™·]}è¹lï¶öTÏâR7xˆùgÿ –~Úš·ü—ÅOÞ`©-€b”Pêï²øÑk¬¹j²˾dÞ¼[còô/ Ô•üù'›E¾úØÐSѺEÞømruÓ¿[óŽiÖ¼ç\‹¸Ð¢G–Y¼ñ6KwlàKˆ«–ÿÀ­M®ìÎIEND®B`‚‰PNG  IHDR ä’Ú.|Ç pHYsèèµ{Rk IDATxœìÝiÔe]ç{+3‘QáreDiÁ¾€ ÔF–ÛŠrm@»[» *}[ŸRI%d2#I ! $L„‰2‡ÌCe¨¡*gŸqïýïUOPAB¨ª½Ïó?Ãç³Öw-^ð‚ÅÙCí]¿:ç‡ÆaЉòžŠá×þþ"ºGþJtö~It–oø!)§…­btù!Ùg0aª‡nŠbÏä?³Hj·ï¡Ö¼4ºGþjô¿°s ¿vD”÷\1(²/;̰ÊþÀl¨¾-†W}2ú§} Š_å[ç¿t•¾³åÛÄèêc³O`BU^ÅÏËv‘4þ–o½øþªÚcxÕ±Q=rGö%€bÀ©úbtýg£wêŸFç£?žÿ"UzªVnåõŸÍ>m€ WÝwU»ýHþ3Œ¤¥oï—DïÔ?‹Ñ §FôϾ0Å òØdUç¡^~Xtúµè¬Ø.ÿE©´)­Ú1Ê[ÎÎ>}€)QÝûµ(v}Vþ³Œ¤¼VnÝ£}ñ'n«â[Ù—%¦ŒAO­ÿx ¯<:ºÇüæâO~¦¿•6£‰VÞyQöYL™êîK£XýŒôgIЊí¢{ÌÛbxÕ'#Eöå €)`À“*¸.úgÿ]tv}Nþ‹Oi *v{NT÷\–}*Sª¼ë’(vyzú³¤ jõ3£÷¹?‰rí׳/QL0ƒ<þU9Œá7ŽâŸËÁ)5¨Øë…Q=x]öL¹ò¶ó¢³êiéÏ8’&¯â°7ÅðÚ“"ÊQö¥ € c@Tý 1¸äcÑÙûÅé/3¥¦k^Õ·¾™}Z3¢¼õ‹ÑY¹Cú³Ž¤ mÍKß«EÿñìË `žõÁWöð³´š™ºû½*êÇîÎ>³€S~ó¬è¬Ü>ý™GÒ·Û,¾g‹A‘}É ™AÀ<1¸xMtv^þËJ©¥ºýlÔ³Ï.`F®?%:Ë·Iö‘4áíùÂ\vPĨŸ}Ù ‰AÀœÝpZtö~IþËI©Åº‡¼!êâ[Ù§0ãFW…­ÒŸ$M~Å>?ÃkN̾lÀ `N”÷^ÝÃßœþ2Rj»ÞÇßuCö)̉áe¥?IšžºGþJ”÷#ûÒÀ2ȘqUo}ôOÿsÿ‚_3Yïè_v³O3`Î Îýûôç!ISÔŠm£ÎG"F½ìËKÀ `†núBt>úãù/¥1Ô;â—"ìÓ ˜Sƒ3vN.’4]û¼’}) %ySntçEÑÙóé/¥qÖ=ìMÆxÀD«×ßÅš—¦??IšÎн2ʮ;”Ѓ<€)6ü§ƒ£³bÛô†Ò8ëöƨûë³O7€¨zè¦(öx^ús”¤é¬XýÌÝpZö¥ €† ò¦QUEÿK+Ò_Jã®{ðë¢ö“-À©î¿:Š]Ÿþ<%iJ[¾u ¾z@ö¥ € ò¦Í ˆÞ§Þ•ÿrPsÝCÞuïÑì3`³•·~Ñ7ÚKjTÿ¬GTeöå €-`0Eªî#QúÆô‚Ò¸ëüzߌLµÑ•G¥?[Išîz'þAD9̾œ°™ ò¦DU|+Šƒßþ"Pw݃~6êâ[Ù§@cƒ/-¤?cIšîºŸüíˆa7ûrÀf0ȘՆû£8àgÒ_JK3Æ{(û”hG]Gÿ”÷§?kIšîºŸøÍˆA‘}E`äL¸jýÚ(ö}Eú‹?iÜuüc<`ö”ƒèõ«éÏ\’¦»îQoõ²¯hlƒ<€ VuÖE±ÿ«Ó_øIã®»ïOD½amö)0u}tzmú³—¤é®{Ü;#Êaö% €À `BUÝG£8øõé/ú¤qW|ôEQ?r{ö)0Võú{£øèÿþ &iºë}æ#ª2û’ÀS0ȘDƒ"ŠÃÞ”þ‚OwÅÏjÝÙgÀ’¨Ö^Å.OO“4Ýõ¿°söå €§`0iª*z'¾'ýÅž4îŠ]ŸÕÚ+²Ï8€%UÞ|ft–o“þL&iº|õ€ìË߇AÀ„éŸõ7é/ô¤±·jÇ(ï¼0ûtH1ºâˆüç2IÓÝò­ctãiÙ—3ž„AÀ^~XþËÊ[ÏÍ>ÝR ÎùHþ󙤩®XýÌ(¸6ûrÀ¿a0!Ê».ΊíÒ_äIcmùÖQ^ÿÙìÓ _]GÿÄßÏN“4Õûɨz볯h|ƒ<€ Pm¸?:{½(ýž4Ö–-þ,ß6êE÷ПÏ^“4Õu{gDUe_Ñø6ƒ<€lå0ºGü‡ôwÒ¸^°[öÙ0qêõ÷F±× ÓŸÙ$Mwƒ‹÷ɾœðmyÉúçþCú ;iÜ NÿóìS `bUk¯ˆÎªÓŸÝ$Mq+¶òžʾœ`ktçEÑY¾uþ ;iŒõOzODígSžÊèêcÓŸß$MwÅ~?1(²/gsÏ  IÕ}4:{¿$ýE4ÎzGýZĨŸ}ºL…Á9IŽ“4ÝõÏøËìKÀÜ3ÈHÒ;ù}é/è¤qÖ=ô"ìS `zÔUôŽ{Gúóœ¤)naYŒnûröÕ `®ä$}óìü—sÒë~ì•QeŸjS§îoˆîÿ.ý¹NÒôÖÝïUÃ^öå `nä,µA':k^–þbNWÅî?ÕC7gŸiS«~ôŽ(öx^úó¤émpÞŠìKÀÜ2ÈXbý3þ*ý…œ4¶V=-Ê».É>ͦ^yûùÑY±mþsž¤élåöQ®»1ûR0— ò–PùÀµÑY¾Mþ 9i-,‹Ñ7>•}š̌ѕGæ?ëIšÚºŸøÙ—1€¹d°„ºG½5ýEœ4®†¯É>ÅfÎàô?OÞ“4½¾yvöe `îä,‘Ñu§¤¿€“ÆÕÆ¿ ` ÊaôŽüåôç>IÓY÷ ×F”£ì+À\1ÈX £~û¼<ýœ4ŽzǾ=¢*³Ï2€™UwŒâ£/Jþ“4 ¯øxöe `®ä,Áe¥¿x“ÆQ÷à×E=x<û˜yÕ=—EgÅvéÏ’¦¯bï/þƒa–†AÀ¸ »ÑÙË¿b×ìµñÛêõ÷dŸascxÙéÏ‚’¦³á׎Ⱦ„Ì ƒ<€1\¼&ý…›ÔvÅêgFuÿ7²O/€¹Ó?åÒŸ %M_Å>/(‡Ù—0€¹`0Nƒ":»?/ý…›Ôj+¶‹ò¶ó²Ï.€ù4,¢{ÐkóŸ %M]ï"û 0 òÆhpÙ?¦¿h“ZmaYŒ¼¼HU?zG»ýHþ3¢¤©ª{àk²/_sÁ `\ª*Šý^•þ¢Mj³á—WfŸYDDyÓ磳°Uús¢¤éjtûùÙ—/€™g0&£ë?—þ‚Mj³þIëìS €oœû÷éÏŠ’¦«ÞñïʾtÌ<ƒ<€1é~ü-é/ؤ¶ê}ü-å0û´à;UeôŽþõôgFISÔò­£zôÎì«ÀL3ȃrÝÑYX–ÿ‚Mj¡bÍK£î¬Ë>­xu÷á(öyYú³£¤éipþêìKÀL3ȃþ™J±&µQ±úQ=pmö)ÀS¨î»*:«ž–þ )i:ê~ì•U•}é˜Yymö¢³ûsÓ_¬I[¾u”7Ÿ‘}F° F_;,ÿ9RÒÔ4ºãÂìËÀÌ2ÈhÙðÚϤ¿P“ÚhxñšìÓ €ÍÐ?é=éÏ’’¦£þi–}ɘYy-ë}ê]é/Ô¤¦õOyö©ÀfªGw¿W¥?SJšüŠ=žQ޲/[3É  EUo}tV=-ý…šÔ¤Þá;EŒúÙ§[ Z{EtVnŸþl)iòó³µãaТáÕÇ¥¿H“šTìýâ¨;fŸJ40¼äcéÏ—’&¿ÁYʾ\Ì$ƒ<€uûOé/Ò¤-nÕÓ¢Z{eöi@Su½ãÞ‘ÿœ)i¢+öyyöÕ `&ä´eÔÎ.OO‘&mi£+Ê>‹hIÝ}$Š5/IÖ”4ÙUß–}¹˜9y-Ýznú 4iKœù×Ù§-+ï¼0:Ë·Iæ”4¹¾vxö¥ `æä´¤æ‡Ò_ I[Rï¨_¨FÙ§c0<uús§¤É­âïg_¦fŽA@KŠý_þMÚÜ6þ|Q]<”}ú0.u½£~-ýùSÒdVìñüˆªÊ¾R̃<€TuÑYX–þMÚ¬VîÕ½_Ë>}³úñ¢ØóùÏ¡’&²ò[ß̾L̃<€Œn85ýÅ™´¹®>.ûÔ`‰”·œ…­ÒŸE%M^£oŸ}‰˜)y-èŸõ7é/ΤÍið…¿È>mXbƒs>’þ<*iòœù×Ù—'€™bЂîá;¥¿8“6µîaoŠ(Ù§ K­F÷Ð_H.•4YõŽxsöÕ `¦ä4U¢³jÇôgÒ¦Tìñü¨×ß“}Ö¤zøÖ(V?#ýùTÒäT¬~fö¥ `¦ä4T>xCúK3i“ZØ*Ê[ÎÉ>eH6ºüÐügTIUýøýÙ—&€™aÐÐðšÒ_˜I›ÒðÂ=³O&DïØ·§?§JšœÊÛÏϾ,Ì ƒ<€†úçþ}ú 3éÕ;îu}º0!êκ(öü±ôçUI“ÑÆoΠy u?õ;é/̤§ª»ï+¢î=–}ª0aÊ>—þÌ*i2œõáìKÀÌ0Èh¨8ègÓ_˜Iß·•;DußUÙ§ ªÿÙÿšÿì*)½þIïɾÌ ƒ<€†:«Ÿ™þÂLú~ù¹žÒ ݽ2ýùURn½¿%ûj03 ò¨Š‡Ó_–I߯þ ïÎ>E˜å]—DgùÖéϱ’òÚ8Ì y ”k¯LY&}¿—¨uCö)À”œû¿ÓŸe%åUìòôìËÀÌ0Èh`tÓé/ˤïiåöQ­½2ûô`šT£èòsùÏ´’ÒÚx 9ƒ<€†_?&ýE™ôo]~Hö©ÀªÖÝUOK®•”SÝ{4û20 ò\¼oú‹2é;ëŸðîìÓ€)6üêé϶’rª×ß“} ˜ y ôÏýûôeÒ?×Ý÷Q÷×gŸL³ºŽÞÑoMÆ•´ômü–Lš3Èh úÿHQ&-¶bÛ¨î¹,û”`ÔÞÅ.OÏÖ•´¤U÷}=ûò0 òè}îOÒ_”I^°köéÀ ^vPú³®¤¥­ºïªìKÀL0Èh wòûÓ_”I½#ÞQ•Ù§³ÄO×JsWuÿÕÙW€™`Ð@ïÄ?HQ¦ù®ØõÙQ?zgö©À ª¹ÝO×JsTuÿ7²/;3Á  Þñÿ9ýE™æ»Ñ5'dŸ̰á%Kö•´4ä´Ã  Þ§Þ•þ¢Ló[ÿ”÷gŸ̺ºŠÞ¿”þ ,iüä´Ã  ƒs¨ZwctVîþl,i<ä´Ã  ƒ<-eŮϊúÑ;²{æØð‚]ÓŸ%'ƒ<€vä4`§¥lôã³yæ]5Šî!oHF–Ô~yí0ÈhÀ OKUÿä÷eî°¨ºÿêè¬Ø6ýYYR»ä´Ã  ƒ<-EÅ>/º¿>ûp€18ç#éÏË’ÚÍ  y äiì-ß&ª»¿š}¨ÀwQìó²üçfI­eЃ<€ ò4î_ú‡ìÞTyËÙéÏÍ’ÚË  y äiœuúÙˆr}˜À÷Õ?áÝéÏÏ’ÚÉ  y äil­Ø6ªµWdâð”êÇïb×gç?GKjœA@; ò0ÈÓ¸^°köá ›dxÙAéÏÑ’šgЃ<€ ò4Žº¿.¢fÞ°iê*º‡½)ýyZR³ òÚaЀAžZoåöQ=x]ö¡ ›¥zàšè¬Ø6ÿ¹ZÒgЃ<€ òÔvË×dÖ°Eg}8ý¹ZÒ–gЃ<€ òÔf½ÃwZü™˜JƒNk^’þ|-iË2Èh‡A@yj÷§j¯Ï>¤ ‘òæ3óŸ±%mQyí0ÈhÀ Om5¼pÏìÃZÑ;Þûi3Èh‡A@yj£î?þûˆr˜}8@+ê ÷E±ë³ÒŸ·%m^yí0ÈhÀ O[±mT÷_}(@«†—î—ÿÌ-i³2Èh‡A@yjÚà¼åÙ‡1´¯E÷ ×¦?wKÚô òÚaЀAžšÔÝÿ§#F½ìÃÆ¢¼í¼ôgoI›žA@; ò0ÈÓ·°U”w]’}ÀXõ?ý»ùÏà’6)ƒ<€vä4`§-mpÖ‡²_»úÑ;£³jÇôçpI?8ƒ<€vä4`§-©Xó’¨g¾°$†_^™þ,.égЃ<€ ò´%•·œ“}èÀÒv£ØçeéÏã’ž:ƒ<€vä4`§Í­Êû³[Xr£ëOI&—ôÔä´Ã  ƒ\ ÝàÌ¿JF—ôää´Ã  ƒŠ½^˜ÿ¬.é{2Èh‡A@yÚ”†—îŸ}¨ÀÄ]ydú³º¤ïÍ  y äéÕ=øõU™}¨À䨫èú éÏì’¾;ƒ<€vä4`§§la«¨î½<û0€‰SÝsYt–å?»Kú— òÚaЀAžžªÁéÌ>D`bõ?ó‡éÏî’þ5ƒ<€vä4`§ïW±ûF]|+û€‰U¯¿':«ž–þ /é‰ òÚaЀAž¾_£¯"ûð€‰78çïÒŸá%=‘A@; ò0ÈÓ“Õ;âÍu}xÀÄ«{F±ûsÓŸå%ä´Å  ƒ<}OË·‰êþ«³M˜ÃK÷Ïž—dЃ<€ òôoœý7Ù‡%L—rݽ2ý™^š÷ òÚaЀAž¾³â£/Šzðxöa SgtÝÉéÏõÒ¼gЃ<€ òô®>.û€©Õ;âÍéÏöÒ `æ /^“þÜ/Í[yí0ÈhÀ o¾+oú|ö!³iÔbÍKÓŸý¥yÊ  y äÍo½£=ûð€™6úúÑéÏÿÒ@šƒ òÚaЀAÞü5øâÿÊ>ì`®”7Ÿ‘þ>@š‡ òÚaЀAÞ|Uìþܨ{ev0wzKú{iÖ3Èh‡A@yóÕðÒý³9˜K奿f=ƒ<€vä4`7?û¼ä`nõ>ñéï¤YÎ  y äÍO£kOÌ>Ü`®U÷~-: ËÒßH³šA@; ò0È›º¿>¢®³7˜{½ã½‹‘Æ•A@; ò0È›Êož•}¨¿%ïÁ뢳|ëôwÒ,fЃ<€ òf¿ÞoÎ>Ì€ïÐÿÌI_ Íbyí0ÈhÀ oö+ï¸ û0¾CýèÑY±]ú;iÖ2Èh‡A@y³]ebÀ“èŸöô÷Ò¬eЃ<€ òf¸…eQ­½2ûžD½þÞè¬Ü!ÿý4Cä´Ã  ƒ¼Ù­Âïe^ÀSœþçéï¤YÊ  y äÍhË·ŽjÝ Ù‡ðêÇîŽÎŠíòß#H3’A@; ò0È›Íú'¿/ûÐ6AÿÔ?M ÍJyí0ÈhÀ oF¿ï¡›²-`ÔÝå[ò¤–2Èh‡A@y³Wÿ3ÿ%û°6Cÿ³œþ>Aš… òÚaЀAÞ ~;Þº³+`3TßåÛä¿W¦<ƒ<€vä4`7[õOzOö!lßxŸý^Ašö òÚaЀAÞ µ°UT\›}H[ úÖ7¿ù>ýý‚4Åä´Ã  ƒ¼Ù©»³' þ‰¿Ÿþ~Ašæ òÚaЀAÞŒ´°Ì G˜rÕƒ×/~~ú{iJó~  y äÍFýOÿnö¡´ ÿéÿœþžAšÖ òÚaЀAÞlTÝ÷õìC hAußU‹ß„Ÿý®AšÆ òÚaЀAÞô×ûÄofF@‹zǽ3ý}ƒ4ä´Ã  ƒ¼é¯¼ýËÙ‡Тj핾%OÚ‚ òÚaЀAÞt×=ôç³!` zŸü­ô÷Ò´eЃ<€ ò¦»òúÏfBÀ”w^˜þÞAš¶ òÚaЀAÞôÖÝïUu•}cÒ=üÓß?HÓ”A@; ò0È›ÞFW™}øc´ñ›ñ³ß?HÓ”A@; ò0țΊ¾(¢d>À8Õut÷ÿéô÷Ò´dЃ<€ ò¦³áE{g:À}íðô÷Ò´dЃ<€ ò¦¯bõ3¢î=–}èK­*£î>ò½=vWÔÿóÆÿ0cF½(ö|Aúûi2Èh‡A@yÓ×àŒ¿Ì>l€ÍU£^oT÷\å §Æð²ƒbø•ÝcpÎG¢ÚŸEÿÄ?ˆÞ'+zG¼9º½6Š5/b·çDgaÙýy¡ØõÙQìö#Qìóòè~ì•Ñ=øõÑ;â—¢wü»¢Úbð¥…~õ€}ãø(o;/ª®‰ú|)]{ IDATñû#ªQöÿSÀ“Øøç†ì÷Ò4dЃ<€ ò¦¬å[Gõð­Ù‡ ðê:êÇî^¶müI¹Áy+¢êŸDïØ·G÷ÿŸ'¾Ñf ‡uKÞŠm£»ïOD￱8Ü^´wŒ®?%ªû®Šº¿!ûÿi˜[uïÑÅoÌOÿ³‚4áä´Ã  ƒ¼éª÷©ßÉ>d`nÕëï‰òöóŸÝów‹ß6×=ð5ÑY¹CúŸ–ªbçEïÈ_^üÆÞÑ•GEµöʈrýÑÀ\œõ¡ô? H“žA@; ò0È›®Ê;¾’}ÈÀÌ«{-Þs7þ¤kÿsÿmñç^;«vLÿsÀD«Þ¯‰þÉïáÅk¢¼ã‚ˆa7ûc€™üÇï»é÷~i‚3Èh‡A@yÓS÷à×e.0sê k£¼ñô^¸çâ ¬{À«£³°Uú}ê[¾ÍâqpÆÎ1ºö¤¨»gÔ0ú§¼?ÿ>/Mpyí0ÈhÀ oz]õÉìæZÝ}$ʛόÁyË£wô¯G±ë³ÓïïsÓÂVÑýÇÿÄ@ïúS¢îoÈ>`*U\…eù÷viB3Èh‡A@yÓQ±× #ÊAöáS¥~äö]yTôOù£èîÿSþòz’Z±]ôŽ~k /Ý/ª‡oÉ>T`ªôŽýíü{¹4¡ä´Ã  ƒ¼éhxþêìC&^ýÈm1ºòÈèŸü¾(ö~qúý[›^w¿WÅà¬Gyû—#ªQö¡­¼ã‚ô{·4©ä´Ã  ƒ¼)hÅvQ?þ@ö¡“gЉòÖscpÎG¢{À«óïÙj¥b·çDÿä÷.~¶Q×ÙGL¤îaoJ¿gK“˜A@; ò0È›üú'þAöa£zàš^°[ô>þ¢³|›ôû´Æ[±æ%1øâÿZüÜ€5ºîäôû´4‰ä´Ã  ƒ¼É¯¼óÂìÃòT£(o;/güeû¼,ý¾¬¼º¾&†îõã÷g•¯*£XóÒôû³4iä´Ã  ƒ¼É®{Ðk³Xz£~”7ž¾ø³¥¾4û~¬ kŶÑ?áÝQÞ~¾Ÿ´`® /Ú;ÿ¾,MXyí0ÈhÀ o²]~hö!K?ÂÛõYé÷`MGÝý~ò‰oÍ+¾•}À’«{F±ËÓÓïÇÒ$eЃ<€ ò&·bõ3£<ž}ˆÀøÔu”w|%úŸûïQìúìô{¯¦¸]~xñ8ª¸&û¨€%58ýƒù÷ai‚2Èh‡A@y“Ûàóÿ3ûð€±¨Ö݃/ýCk^š~¿ÕŒµ°,zǽ#ª»/Í>Ì`ITënX¼ÿ¥ßƒ¥ É  y äMnÕƒ×eОQ/Fמ½£ßê/µ$õßiñg7~#̲Þ'~#ý¾+MJyí0ÈhÀ o2ë}ü-Ù‡´¢Z{EôOû@»>+ýþªù¬{ðëbtÝg"ê*ût€±(o>#ý~+MJyí0ÈhÀ o2]}lö¡[®<ñmx‡ï”~O•þ¹îþ?½x\ÀÌ©ëèîÿSé÷Zi2Èh‡A@y“ׯoŠa‘}hÀf«¿?†îÅG_”~?•¾_ÝÃÞådŸ.ЪáWH¿ÇJ“A@; ò0È›¼ŸÿÙ‡l–êk¢ÿ™?ŒÎŠmÓï£Ò¦Ö;îQ=x]öé­¨ûÿ_öýUÊÎ  y äM^Õ}_Ï>,`“”w]½ãÞ…eé÷Oi‹Z¾uôOù£¨×ß›}:@cƒ3ÿ*ÿÞ*%gЃ<€ ò&«îÁ¯Ï>$à*ï¼(zǾ=ý¾)µÖªcpÞŠˆr}zÀ«½cqlž~_•3Èh‡A@y“ÕðŸÎ>$àÉÕU”7žÝC>ý~)«î~?å-çdŸm°Å¿½xî©RVyí0ÈhÀ o‚ZµcԽDz ønå0FW||q¨”~¯”–¨þIï‰zÃÚì³6[yÛ—Òï£Rfyí0ÈhÀ orêŸü¾ìÃþU]ÇèÚ“¢û±W¦ß#¥ŒŠÕψá%ûFTeöÙ›®®£{àϤßG¥¬ òÚaЀAÞäTÞþåìÕ·Ÿï§i¥o×=ìMQ=tSöi ›lôµÃÒïŸRVyí0ÈhÀ o2*ö~qD]e̹jÝ Ñ?á÷Òï‹Òĵr‡^¸§oË`: »Qìöœüû§”A@; ò0È›ŒçþïìC€9V¯¿'ú§þit–o~O”&¹îaoŒjÝÙ§,ü@ƒÏÿÏôû¦”‘A@; ò0È›ŒüÅ.êÞ£18ûo¿ý+û^(MM«žÃ‹×øvc&ZõÀµù÷L)!ƒ<€vä4`—_÷ПÏ> ˜Cå§Gñѥߥi­wä¯D½amö© ßWïðÒï—ÒRgЃ<€ òò^v`öaÀ©¾%zŸøôûŸ4 {­àI®údú½RZê òÚaЀA^r+¶º³.û0` »18oEtVnŸÿ“f©…e18cçˆr}–ÀwõÇãé÷Ji 3Èh‡A@y¹õŽ{gö!À(oÿrt÷ÿ©ôûž4Ëuù¹¨¾5ût€ï28ëÃé÷Hi)3Èh‡A@y¹®ûLö!À «7¬þ ¿—~¿“æ¥b×gGyãiÙ§>ü‹ê¡›¿Í5û)-Uyí0ÈhÀ /¯bõ3>ÆatÅÇ£XýÌôû4w-lÃ/¯Š¨ëìË,êõ«ù÷Gi‰2Èh‡A@yyõO~oöÇÀ ª;ë¢÷©ßI¿ÏIó^ïØßŽº÷Xö%btí‰é÷Ei©2Èh‡A@yy•7}!ûã`Æ”·œÅ^ÿWú=NÒu÷{UTën̾40ïÊa{½0ý¾(-Eyí0ÈhÀ /§b×gG”ƒì€Y1ìÆàŒ£³°,ý'é»ÛøÓÑå§e_%˜sƒ/þÿé÷Di)2Èh‡A@y9õ?ûÇÙ=3¢ºûÒèîûŠô{›¤§hùÖ1¼tÿìËs¬~äöè,l•O”ÆœA@; ò0ÈËiãO @#å0_ú‡è,ß&ý¾&iÓœõ¡ˆºÊ¾z0§zǼ-ý^(;ƒ<€vä4`·ô»?7¢eôL±º³.zGýjú=MÒæ×;þ]‹?3 K­¼áÔôû 4î òÚaЀAÞÒ×?íÙ;S¬¼ó¢(özaúýLÒ–×=ì‹ÃZXRUÅÞ/N¿JãÌ  y ä-}åí_ÎþؘRÃK÷‹ÎŠmÓïe’š×Ýÿ§¢~ôŽìË s¤zøÖè÷Îô{ 4Î òÚaЀA^ÆÏÕ–Ù;ÓfЉþIïI¿Ij·bÏDõÀ5ÙWfÐÆob-oúB Î[½cÞÅî?š~ß“–"ƒ<€vä4`·´õ?÷ß²?r¦Lõð-Ñ=ð5é÷0Iã©Øí9QÝýÕìK Ó¬FµöŠÅoSîŸüÞèðêè,,K¿ÇIä´Ã  ƒ¼¥­¼éóÙ9S¤¼áÔ(v}VúýKÒx+V?3Ê;/̾ä0 ªQT÷_£+Žˆþçþ{tzmt–o“~/“&%ƒ<€vä4`·t»<=bÔËþȘ¿á¤³°UúýKÒµjÇ(o9'ûÒÀ„©7¬òÆÓŸøéÙ£ß]~8ÿž%Mpyí0ÈhÀ oéêŸøûÙ7Ó ®cpöߦ߷$%´b»]JöU€$uï±(ï¼(†î½cßÅž?–o’¦,ƒ<€vä4`·t®ùtöÇ À¤v£w¼{³4×­Ø6Fמ˜}5`܆E”w]ÃKöþIï‰î¾?‘’f ƒ<€vä4`·D­Ü>êþúì€ VwŽÞ¿”Ï’”ßò­ctÍ Ù—%ÚR•Q=x]Œ®:&gì½ÃwZ|O~¿‘f0ƒ<€vä4`·4õŽýíì€ V?r{t÷{UúýJÒµbÛ(o<=ûòÀ¨7¬]¼†Î[ñÄOÏîöœüûŠ4'ä´Ã  ƒ¼¥itÅÙ5ªº÷ò(öü±ô{•¤ låQÞúÅìË?à[ŽËožÃówyb|·ÇóóïÒgЃ<€ ò– …e‹ÿ:þ­ò¶/Eg—οWIšÜVíåíçg_®ØhØò®Kbxé~Ñ?éÿ‹î¾¯È¿OHú® òÚaЀAÞøëüúì€ TÞq1ž¤MåÝñ•ìËÀÜ©¹-FWƒ3vŽÞá;Egåöù÷IO™A@; ò0ȃó–gÌL˜ò–³£³êié÷(IÓS±ë³¢ºÿêìËÀ̪»+F×}&gÿmô>þ–(V?#ýÚ/ió3Èh‡A@yKð"ðÞ˳?f&Hùͳ¢³r‡ôû“¤é«Øë…Q?zGöe `êÕýõQÞyÑ?={ÂïE±ç Ò¯ñ’ÚÉ  y ä·bçGÔUöÇ À„(o>ÓOR£ºû¾"êÇȾœLrÕƒ×Åèk‡Eÿä÷F÷€WGga«ô빤ñdЃ<€ òÆ[ÿ³œý0!Ê›Ï0Æ“ÔJÝC~.êÁãÙ—5€‰T?r[Œ®:&gì½Ãwòç/iÎ2Èh‡A@yãmtíIÙ1 ¼áÔè¬Ø.ý¾$ivêó¶Åo}˜gõú{btý)18ç#Ñ;òW¢XýŒôë³¤Ü òÚaЀAÞ[±mÔýõÙ1ÉÊ;.ˆÎÊíóïK’f®þÉëìËÀ’¨{Eyë¹1¼`·è}ê?E±× ӯÒ&/ƒ<€vä4`7¾6þë|æ[õÀ5Qìúìô{’¤ÙmøåUÙ—:€öúQÝsY /;0ú'¿7ºû½*: ËÒ¯¹’&?ƒ<€vä4`7¾†_Ù#ûã ù'ÔŠ½<ý~$iÆ[X£o|*û’ÐH½amŒ®=)gì½ÃwŠÎÊò¯¯’¦2ƒ<€vä4`7Æ€k¯ÈþxHRwŽîþ?~/’4'­Ü!ª»¿š}éØäñ]yãé18oEôŽ}{»ÿhþuTÒÌdЃ<€ òÆS±ûs#ê*ûã ð½#Þœ~/’4_{¾ êÇîʾ|—º¿!Ê;/Šá¥û=ñÓ³¼:ýz)i¶3Èh‡A@yã©Ò{²?Z2TeôÿÓïC’æ³C—º÷Xö•˜WÕ(ª¯‹ÑUÇDÿÔ?}b|·°UúµQÒ|eЃ<€ òÆÓèÊ£²?Z Nÿ`ú=HÒ|×;¿ºŽê¡›btÕ'cð…¿ˆî¡¿•Û§_%É  y ä§ú±»³?Z–ØèòCÒï?’´±Áy˳/‰ÀŒ©7Üå§Çà¼Ñ;öíQìþÜôk$=Yyí0ÈhÀ ¯ý6þ,ó¥ºû«¾FÒä´°,Fן’}i¦T=x<Ê;/Šá¥ûEÿä÷>ñÓ³Ù×5IÚÄ òÚaЀA^û Îü«ì€%T?~}QúýG’¾³bõ3¢ZwCö%˜tÕ(ª¯‹ÑUÇÄàŒ£{ð룳°Uú5L’¶4ƒ<€vä4`×~åMŸÏþXX*å z‡ï”~'«{À¿[ü¦+€EuÕC7ÇèêcŸßöÆè¬Ü!ýZ%ImfЃ<€ òZnùÖQ÷ÍþXX"ƒÓ?˜§¨wü»G8ÀüÙølZÞzn Î[½cßÅîÏM¿&IÒ¸3Èh‡A@yíÖ=ä Ù)Kdtå‘é÷IÚ”†¯É¾dcV÷7DyÇ1¼è£ÑÿôïF±÷‹Ó¯=’”‘A@; ò0Èk·ÁYÎþHXÕÚ+üÄ›¤éiŶQÞuIö¥hK9Œjí•1ºüèö£{àÏ,~[{úµF’& ƒ<€vä4`×nåMŸÏþH·aÝý^•~Ï‘¤Í©ØûÇ£.¾•}¶@½am”7žƒs>½ÃwŠÎªÓ¯)’4©ä´Ã  ƒ¼[¾uÔ½G³?RƬÚòï9’´õŽ}{D]g_F§°ñ™²¼õÜœ·bñœ-öx^úµC’¦)ƒ<€vä4`×^ÝCÞýq0få-gGgaYú=G’¶´áWȾ”ÿlЉò΋bxé~Ñ?ù½Ñ=àÕþœ!I 3Èh‡A@yí58ëÃÙ'cTE±ç Òï7’Ô¨•ÛGµöÊìK*ÌŸªŒêÁëbtÕ118cç'~zvÅvù×Iš± òÚaЀA^{•7žžýq0FýOÿnú½F’Ú¨»ïODÝ_Ÿ}Y…™VoX»øŒ¸øÓ³G¿5:«vL?÷%i2Èh‡A@y-µ°UÔÝG²?NÆdtÅù÷Ij±þÉï˾´Ą̂;뢼é OŒïŽy[»?7ý—¤yÍ  y äµS÷ÀŸÉþ(“ú‘Û¢Øåéé÷Ij»Ñµ'e_baú :QÞyQ /Þ'ú'þ~û¼,ý\–$ýkyí0ÈhÀ ¯ú§ýYöG À˜ô>ù[é÷IGŮώú±»³/³0¹ª2ª¯‹ÑUÇÄÿaïΣï®ë;‚¥.tÑ2¥vŽv¦=Ž–ÚkÇÚŠmí¨µ S§­ŽÖêxô8§Ô±‹KÛÓþvƒˆ„ [ÍÈZ ²JP‰‰ì  ‘Ú°$‚T–äw÷{¿ß9IΙ?ú[î÷{?Ÿû{“<ç<ÿ‡¼“ûñüx™Û»æÃegÍ¡åìŠÂÿìJ’Î  ƒ<€yyÜó¹èS0ƒû. c$išuÎ{kYEôÇ-4B±}k9ܼn÷WÏž÷–röè…ÿ•$ÕË  ƒ<€yyÚùu†ì]Šîö²õÉþÆHÒ´ëcuôG.,¹¢óì½eeÙY{XÙZypøŸEIRzyyä$0ÈKoç¸`ïÓ»æ/ÃßIZ’Ž|~9zâ[Ñ»0=Ã~9ÚzgÙß´ªì^~xÙ^}H9;³_üŸ=IRö òò0ÈH`—^÷¢?Š>#™¶Ý]Î.^ø#IKUûô×î-Áo4Ü50ÜùÙ²û…–íÓ^ãM—¤}(ƒ<€< òä¥×ÿúIÑg §bT¶Ïúµð÷E’–ºþWމþ†ÚŠí[ËáæueoýŠÝ_={Ü‹Ãÿ,I’â2ÈÈà  A^†ô=vkôÈhpû™áo‹$…´â_]K£ÝçÊá– »¿zö’w–­•Çÿ¹‘$5*ƒ<€< òä%vä—å°}F2þ‡þÖñÅ¿/’TûŒ×•åhýq eÙo—ÃG6îß]öž²}ò+Âÿ|H’šŸA@y òÒjŸùúèQoýòð·E’¢ëß²2úã˜}PñôÃåàž ÊÞ5.;kÝõ~Šþ³ IÚó2ÈÈà  A^Z½«?}B2)f¿_¶Žù‘ð·E’Â;ò‡ËÑ“÷G,³+¶o-‡›×•½õ+ÊÎÚÃÊÖq/‰ÿ}/IÚ+2ÈÈà  A^Z;ÿö;ÿFžèwE’õ7A†ÑÍì%_?ܲa÷WÏ^òβµò§ÂK’öÞ òò0ÈH`—øC¾ï?}B2(žÙâ«ñ$éßÔÿÆêègö4Ãþ®¿]qpÇYe÷òÃËöêCÊÙ™eá¿—%IûNyyä$0È›¼_kX£èA÷Š÷†¿+’ÔÄÿ½[<÷XôG4 V<ýð®¿5|çß2ÛYsh9{äóÃßJ’öí òò0ÈH`7ys~+ú|d0zê;åìòç…¿+’ÔĺýQôÇ4 QlßZ7¯+{ëW”µ‡•­ã^þûS’¤›A@y ò&¯wÃÇ£Ï@Ý‹ßþ¦HR“nþbôG5K¬è<[úrÙÿêqeç·—­~:ü÷¡$IU2ÈÈà  AÞä î¿<ú|døª½Ùåû‡¿)’ÔäZ'¾¬,z;¢?²™–Ñ =yÿ®¯ží~áƒe{õ!åì̲ðßw’$M’A@y ò&¯xúŸ£Ï@¢Þº?O$iO¨wí_Gd“C1*Gß`×ø®wõ_”í3¥œ]q@øï/I’re‡A@ƒ¼ÉjûãeYÑç AÑzªœ=ê…áoŠ$í-ß¿m½+ú£›šŠí[ËáW•½ÿ¾ìœûæ²uìÅÿ^’$iŠääaÀ o²:ç¼)út$ê­_þžHÒžTûŒ×íúÖh¦¢»½nÙPö7­*»—¾û«gðûF’¤¥Ì  ƒ<€y“å+»öpƒNÙZypø{"I{Zƒ»Îþg§Ñ =yÿ®¯ží~჻Çw3ËÂH’A@y ò&kp÷ùѧ Aÿ¶ÓÃßIÚk}â'Ë¢óLôÇø>ùÕ³ƒû.+{×|¸ì¬9´œ=êá¿$Ijbyyä$0È›ô‡{÷FŸ€I£²}ò+ÂßIÚSÛ9 czŠíÛÊáæu»¾Z½³ö°²uüAá7—$iOÉ  ƒ<€y´â€²ö¢OÀ„ß¾"þ-‘¤=¹åûû?¨dRôv”Ã-Êþ¦Ue÷òÃwõlô}%IÚƒ3ÈÈà  A^ýÚ§½&úl$ØõU xO$iO®óÙß(Ë¢ˆþHß³ ûåh뻾6½{Åÿ*Û«¡œY~KI’ö¦ òò0ÈH`W¿î•ï‹>m»;ü‘¤½¥Á7/ŒþXo®¢(GO=Xîýü®¯ømŸõkåì‘Ï¿™$I{{yyä$0È«_ãÉÑg`BÝ«>þŽHÒÞRëÄ—•e¿ýÑÞÅŽï•ÃÍëÊÞMÿXvÎ[Ù:îÅá÷‘$i_Ì  ƒ<€yõ>tcôÙ˜@Ñy¦œ=úEáïˆ$íMõ¿rL¹¯)z;Êá– eÓª²{ùáe{õ!åìÌ~á·$Iy¹ä$0È«_±}kôÙ˜@ã§ÃßIÚÛj}àÞý¿Gƒrôäýåàž v}õlgÍ¡åìŠ ÿu—$Ióg‡A@ƒ¼zíüê)öLíS^þŽHÒÞX÷Ê÷•{‹Ñ¾[¾yaÙ»ö¯Êöš7”³G½ ü×W’$UÏ  ƒ<€yõêœýÆè“0á#ÃßIÚk›YVŽ¿£ÜÓgËáC_.{ëW”µ‡•­Oü»ø_KI’””A@y òêÕýâÿŽ>è^õð7D’öæ:ŸýͲÑz³åpˆ²¿iUÙ½üð²½úrvf¿ð_7I’”7ƒ<€< òäÕ«¿é”è“PW¿U¶ŽùÑð7D’öö†\U6ÂhP޶ÝSî8«ì^õþ²ý™ÿ\Î.ß?ü×G’$M?ƒ<€< òäÕkøðúè“PÓàžÏ…¿’´/Ô^õŸvá–Z±}k9ܼn÷WÏž÷–rö¨†ÿZH’¤˜ òò0ÈH`W¯bÇ÷¢O@Msßþ~HÒ¾Òο•nšŠÙï—ïÙ=¾ûÜï•­ã ÿw–$IÍÉ  ƒ<€yÕk÷âèsPS±}›¯)”¤%¬uÂK˲7›çC¼ß*‡[6”ý¯ŸTv/}wÙ:é?†ÿûI’¤fg‡A@ƒ¼êµÏúÕèsPSÓªð÷C’öµú_9¦þöhXŽž¼¿ÜsAÙ»æÃegÍ¡åìŠÂÿ]$IÒž•A@y òª×½â½Ñç ¦ö™¯?$i_«uôe±ã‰E?Ÿ‹í[Ëáæu»¿zvíaeëØÿç–$I{~yyä$0È«^ÿ«ÇEŸ €Ч.ggö ?$i_lçßr÷ÿ?»ÏíþêÙ[Vîß­<8üŸO’$íääaÀ ¯zƒûÿ)ú\ÔÐÿÚ'ÂßIÚg[q@Ù½ô]eûÓ?ÿÏ"I’ö™ òò0ÈH`WãzO|+ú\Ôàëj%I’$ißÊ  ƒ<€y›YV–ývô¹¨¨ØñÄ®Ïîð÷C’$I’´dääaÀ ¯Z­OýLô©¨apÇYáo‡$I’$ii3Èêß IDATÈà  A^µ:çÿvô©¨¡³ö÷ÃßI’$IÒÒf‡A@ƒ¼jõÖ}*ªêÍ–³G½ üí$I’$-myyä$0È«VÉѧ ¢áw¾þnH’$I’–>ƒ<€< òäUkðí+¢O@E½kþ2üÝ$I’$-}yyä$0È«øÃ¼mwGŸ €ŠÚ§ü|ø»!I’$IZú òò0ÈH`W­¢óLô©¨ xîñð7C’$I’“A@y òÆ×:îÅÑg ¢Á]熿’$I’¤˜ òò0ÈH`7¾öé¯>uÿéOÃß I’$IRLyyä$0È_÷âwDŸ €ŠZ'¾<üÝ$I’$Åd‡A@ƒ¼ñõnøxô™¨ xîñð7C’$I’—A@y òÆ×¿í´è3PÁà[—„¿’$I’¤¸ òò0ÈH`7¾áw®Ž>ô®þPø›!I’$IŠË  ƒ<€yU~woô™¨ }ÚkÂß I’$IR\yyä$0È_Ñú×è30No¶œ]¾ø›!I’$IŠË  ƒ<€yc:ê…Ñ' ‚á#_3$I’$I¡ääaÀ oñÚ«^}"*èo:%üÍ$I’$Åf‡A@ƒ¼Åëœ÷–èPA÷Š÷†¿’$I’¤Ø òò0ÈH`·xÝ+ß}"*hŸúêð7C’$I’›A@y ò¯·~yô‰§ß*g—?/üÍ$I’$Åf‡A@ƒ¼ÅÜqVô‰côØ­áï…$I’$)>ƒ<€< òä-Þpóºè0Æà®sÃß I’$IR|yyä$0ÈóC¼Çïˆ>cô®ÿXø{!I’$IŠÏ  ƒ<€y‹W<÷Xô‰£³ö°ð÷B’$I’ŸA@y òif¿²ö¢OÀ­“~6þÍ$I’$…g‡A@ƒ¼…kPôygÐ)g—ïþfH’$I’â3ÈÈà  AÞµO}uôyc´ížð÷B’$I’ÔŒ òò0ÈH`·póÞ}ÆÜwYø{!I’$IjFyyä$0È[¸îå‡GŸ€1ú>þ^H’$I’š‘A@y ò®wÝG¢ÏÀ½uG„¿’$I’¤fd‡A@ƒ¼…ëß²2ú<ŒÑ¹àwÂß I’$IR32ÈÈà  AÞ î:'ú<ŒÑ>åUáï…$I’$©ääaÀ oᆛ¿}SåìQ/ /$I’$IÍÈ  ƒ<€y 7|dcôyXD±}[ø[!I’$IjNyyä$0È[äxO=}1zì¶ð·B’$I’Ôœ òò0ÈH`·pEûéèó°ˆá_+$I’$IÍÉ  ƒ<€y ´üyeYÑç`ƒÛÏŒ/$I’$IÉ  ƒ<€yó×Zypôi£ó‘áï…$I’$©9ääaÀ oþÚ«‰> côÖýyø{!I’$IjNyyä$0È›¿ÎšC£OÀ ÿGø{!I’$IjNyyä$0È›¿ÎÚß> c´ÏúÕð÷B’$I’Ôœ òò0ÈH`7ÝËÞ}Æhô³áï…$I’$©9ääaÀ oþzWÿEôi£uì…¿’$I’¤æd‡A@ƒ¼ùë}ù¢OÀbFÃrvfYø{!I’$IjNyyä$0È›¿þ†OFŸ€Eí„¿’$I’¤fe‡A@ƒ¼ùܱ&ú4,bôƒ‡Âß I’$IR³2ÈÈà  AÞü î»,ú4,bôøáo…$I’$©YääaÀ oþ†ß½!ú4,bøÐáo…$I’$©YääaÀ oþ†lŒ> ‹Üwiø[!I’$IjVyyä$0È[à‡wÛîŽ> ‹Üyvø[!I’$IjVyyä$0È[à‡wO=}Ñß´*ü­$I’$5+ƒ<€< òäÍ_ñì£Ñ§`ý¯}"ü­$I’$5+ƒ<€< òäÍ_Ñú×èÓ°ˆÞúåáo…$I’$©YääaÀ oþÊ~;ú4,¢wýGÃß I’$IR³2ÈÈà  AÞ<Í,+Ë¢ˆ> ‹è­;"þ½$I’$5*ƒ<€< òäÍÓÑ/Š> ct¯|_ü{!I’$IjTyyä$0È›[ëøƒ¢ÏÀÝKßþ^H’$I’š•A@y òæÖ:ñåÑg`ŒÎ…o/$I’$IÍÊ  ƒ<€yskŸòªè³0Fç‚ß /$I’$IÍÊ  ƒ<€yskŸþÚè³0Fçüß/$I’$IÍÊ  ƒ<€ysëœýÆè³0FçÜ7‡¿’$I’¤fe‡A@ƒ¼¹íü[—h¶Î9o /$I’$IÍÊ  ƒ<€ysë\øöè³0Fçì_/$I’$IÍÊ  ƒ<€ysë^ö'Ñg`Œöš7„¿’$I’¤fe‡A@ƒ¼¹u¯zôY£}æëÃß I’$IR³2ÈÈà  AÞÜz_ú?Ñg`Œöÿ5ü½$I’$5+ƒ<€< òäÍ­wÝG¢ÏÀíÓ9ü½$I’$5+ƒ<€< òäÍ­wÃÇ£ÏÀþ†ú,ŒÑùÜï…¿’$I’¤fe‡A@ƒ¼¹õoY}Æè|þ¿‡¿’$I’¤fe‡A@ƒ¼¹õ7œ}Æè^üÇáï…$I’$©YääaÀ oný¯Ÿ}ÆèþÓŸ†¿’$I’¤fe‡A@ƒ¼¹õ7ž}Æè^õþð÷B’$I’Ô¬ òò0ÈH`7·þ7VGŸ€1zW(ü½$I’$5+ƒ<€< òäÍ­ëg¢ÏÀ½ë?þ^H’$I’š•A@y òæÖ¿íôè³0F蓮ð÷B’$I’Ô¬ òò0ÈH`7·ÁgEŸ€1ú_=.ü½$I’$5+ƒ<€< òäÍmpçÙÑg`ŒþÆO‡¿’$I’¤fe‡A@ƒ¼¹ î:'ú,Œ1¸ýŒð÷B’$I’Ô¬ òò0ÈH`7·Ák¢ÏÀƒ»Ï /$I’$IÍÊ  ƒ<€ysëßú™è³0Æà¾ËÂß I’$IR³2ÈÈà  AÞÜú›VEŸ€1†^þ^H’$I’š•A@y òæÖßpbôYcøÈ×Ãß I’$IR³2ÈÈà  AÞÜú_;>ú,Œ1zâ[áï…$I’$©YääaÀ oný›Š> cÏl /$I’$IÍÊ  ƒ<€ysëÝ4}Æ(ÚO‡¿’$I’¤fe‡A@ƒ¼¹õnü»è³0ÎhXÎÎìþfH’$I’š“A@y òæÖ»î#Ñg ‚Ù£_þfH’$I’š“A@y òæÖ»æÃÑg ‚Ö / 3$I’$IÍÉ  ƒ<€ysë­ûóè³PA{Õ+Ãß I’$IRs2ÈÈà  AÞܺW} ú,TÐ>ãuáo†$I’$©9ääaÀ onÝ+Þ}*èœ÷Öð7C’$I’Ôœ òò0ÈH`7·îeï‰> t/}wø›!I’$IjNyyä$0È›[÷’wFŸ€ zëŽ3$I’$IÍÉ  ƒ<€ysë\ô‡Ñg ‚ÞM3áo†$I’$©9ääaÀ onµ‡EŸ€ úO3$I’$IÍÉ  ƒ<€ysëœÿ¶è³PÁàž Âß I’$IRs2ÈÈà  AÞÜ:ç¼)ú,T0üΗÂß I’$IRs2ÈÈà  AÞÜÚg¼.ú,T0ztSø›!I’$IjNyyä$0È›[{õ!Ñg ‚ÑS†¿’$I’¤æd‡A@ƒ¼¹µN|yôY¨ h=þfH’$I’š“A@y òæÖ:þ'¢Ï@£a9;³,üÝ$I’$5#ƒ<€< òäÍÓ‘?}*j÷’øwC’$I’Ôˆ òò0ÈH`7åh}*h¯zeø›!I’$IjFyyä$0È›¿¢ólôi¨ óÙß3$I’$IÍÈ  ƒ<€yóWlß}*è^òÎð7C’$I’ÔŒ òò0ÈH`·Àïžz0ú4TлúCáo†$I’$©ääaÀ oÞm»;ú4TÐÿÊ1áo†$I’$©ääaÀ oþ†[6DŸ€ wžþfH’$I’š‘A@y òæoø¯‹>  7¯ 3$I’$IÍÈ  ƒ<€yó7¸ÿòèÓPÁè±ÛÂß I’$IR32ÈÈà  AÞü î>?ú4TP<³%üÍ$I’$5#ƒ<€< òäÍ_ÿ¶Ó¢O@ƒNø›!I’$IjFyyä$0È›¿þ†OFŸ€ŠZÇühø»!I’$IŠÏ  ƒ<€yó×[¿<ú4TÔ>ùáï†$I’$)>ƒ<€< òäÍ_ïºDŸ€Š:ŸýÍðwC’$I’ŸA@y òæ¯{Õ¢O@EÝËþ$üÝ$I’$Åg‡A@ƒ¼ùë^üÇѧ ¢Þõ 7$I’$IñääaÀ oþ:çüVôi¨¨¿ñäðwC’$I’ŸA@y òæ¯}Úk¢O@Eƒû. 7$I’$IñääaÀ oþZ'¾<ú4T4|dcø»!I’$IŠÏ  ƒ<€yó×:úÀèÓPQñÌ–ðwC’$I’ŸA@y ò®ö¢Ï@Ã~9;³,üÝ$I’$Åf‡A@ƒ¼…+fŸŒ>µ>ñ“áï†$I’$)6ƒ<€< òä-ò¼ïoŽ>µOû¥ðwC’$I’›A@y òùÞ£›¢Ï@Eµ‡…¿’$I’¤Ø òò0ÈH`·pÃï|)ú<TÔýÂÃß I’$IRlyyä$0È[¸Á½k£Ï@Eý› 7$I’$I±ääaÀ oáú›N‰> î:7üÝ$I’$Åf‡A@ƒ¼…ëß|dôy¨høðúðwC’$I’›A@y ò®wÍ_FŸ€ŠF?ønø»!I’$IŠÍ  ƒ<€y ×½üðèóPÕ°WÎÎ, ;$I’$IqääaÀ oá:k‹>5´NxiøÛ!I’$IŠË  ƒ<€y ×^ó†èóPCû¬_ ;$I’$IqääaÀ oáÚ§ü|ôy¨¡{é»ÂßI’$IR\yyä$0È[¸Öñ?}jè]ÿ±ð·C’$I’—A@y òif¿²ö£O@Eý[O;$I’$IaääaÀ oñŠç> 7¯ 7$I’$IqääaÀ oÌñ¶Þ}"*}ïÞðwC’$I’—A@y òoøàµÑ' ¢¢óLø»!I’$IŠË  ƒ<€y‹7¸û¼èPCëØ ;$I’$I1ääaÀ oñú·¬Œ>5´OýÅð·C’$I’“A@y ò¯wí_GŸ€:Ÿÿƒð·C’$I’“A@y ò¯{Ù{¢O@ ½kÿ*üí$I’$Åd‡A@ƒ¼ÅëœûæèPCÓ)áo‡$I’$)&ƒ<€< òä-^{õ/DŸ€†ß¹:üí$I’$Åd‡A@ƒ¼ÅkPô‰¨aôä·ÃßI’$IRLyyä$0ÈÓÌ~e9ìGŸ €ª]ŸÝáï‡$I’$iÉ3ÈÈà  AÞøŠíÛ¢Ï@ ­~:üí$I’$-}yyä$0È«ðƒ¼m÷DŸ €:g¿1üí$I’$-}yyä$0Èßð»×GŸ €º—ÿYøÛ!I’$IZú òò0ÈH`7¾Á=DŸ €zëW„¿’$I’¤¥Ï  ƒ<€yãëßrBô™¨ap÷ùáo‡$I’$ié3ÈÈà  AÞøz×ýMô™¨a¸eCøÛ!I’$IZú òò0ÈH`7¾î¥ïŠ>5Ï=þvH’$I’–>ƒ<€< ò䯳æÐè3PGQ”³G½ üý$I’$-myyä$0È_ëÄ—GŸ €šÚ« ?$I’$IK›A@y ò*´üye9FŸ €:Ÿÿƒø÷C’$I’´¤ääaÀ ¯ZÅö­Ñ§ †Þu ;$I’$IK›A@y ò*þ0ï±Û¢O@ ƒÛÏ ;$I’$IK›A@y òª5øöѧ †áÃëÃßI’$IÒÒf‡A@ƒ¼jõ7­Š>5Ï>þvH’$I’–6ƒ<€< òäU«wýÇ¢O@EQÎõ‚ð÷C’$I’´tääaÀ ¯ZÝKß}*jjŸúêð÷C’$I’´tääaÀ ¯Z³ß}*jê\ä“$I’¤})ƒ<€< òäU«õ©ÿ}*jêÝðñð÷C’$I’´tääaÀ ¯b+~¨,‹Qô¹¨apçÙñï‡$I’$iÉ2ÈÈà  A^õŠß‹>5 ÿå«áo‡$I’$ié2ÈÈà  A^è=~{ô¹¨¡Ø¾5üí$I’$-]yyä$0È«ÞðÛWFŸ €:Š¢ló#áï‡$I’$ii2ÈÈà  A^õúßX}.jjæ¿„¿’$I’¤¥É  ƒ<€yÕëÝðñèsPS÷’w†¿’$I’¤¥É  ƒ<€yÕë^ö'Ñç ¦ÞMÿþ~H’$I’–&ƒ<€< òäU¯½æ Ñç ¦Á½kÃßI’$IÒÒd‡A@ƒ¼êµNxiô¹¨iôøíáï‡$I’$ii2ÈÈà  A^fö+Ë~+údÔPt·ïúüC$I’$ISÏ  ƒ<€y5¨÷ýÍÑ' ¦Ö ?þ~H’$I’¦ŸA@y òê5|ðÚè“PSçÜÿþ~H’$I’¦ŸA@y òêÕ¿í´è“PSoÝáï‡$I’$iúääaÀ ¯^½ë?}2jêo:%üý$I’$M?ƒ<€< òäÕ«{ñ;¢O@MÃïÞþ~H’$I’¦ŸA@y òêÕ>ý—£O@MÅ3[ÂßI’$IÒô3ÈÈà  A^½Zǽ$údÔUeëèÃßI’$IÒt3ÈÈà  A^ýŠÎ³Ñg ¦öi¯ ?$I’$IÓÍ  ƒ<€y“ü`ïÞè³PS÷Òw‡¿’$I’¤éf‡A@ƒ¼ú ¸*úlÔÔ[¿"üý$I’$M7ƒ<€< òäÕ¯¿ñÓÑg ¦Á·.?$I’$IÓÍ  ƒ<€yõë]óáè³PÓhÛÝáï‡$I’$iºääaÀ ¯~µ‡EŸ €ºú­rvfYø"I’$Iš^yyä$0È«_ûÔWGŸ € ´NúÙð7D’$I’4½ òò0ÈH`7AG¿(úlL`çßpþ†H’$I’¦–A@y ò&«˜}2útÔÔ»áoÃßI’$IÒô2ÈÈà  AÞ„?Ü{tSôé¨ip÷ùáï‡$I’$izääaÀ o²vŽ:سŒ¿=üý$I’$M/ƒ<€< òäMVïËÿ}:j*z;ÊÙ™ýÂßI’$IÒt2ÈÈà  AÞdu/ùŸÑ§`­OýLø"I’$IšNyyä$0È›¬öi¿}:&ÐùÜï…¿!’$I’¤éd‡A@ƒ¼Éj}`YEôù¨©wýGÃßI’$IÒt2ÈÈà  AÞä;¾}>jÜunøû!I’$IšNyyä$0È›¼á–[¢Ï@M£Çn ?$I’$IÓÉ  ƒ<€y“7¸ëœèóPSÑÛQÎÎìþ†H’$I’òg‡A@ƒ¼ÉëÝøwÑç`­_þ†H’$I’òg‡A@ƒ¼Éë^ôGÑç` ~'ü ‘$I’$åÏ  ƒ<€y“×>õ£ÏÀz×ýMø"I’$IÊŸA@y ò:êeYŒ¢O@Mƒ;ÏŽC$I’$IÙ3ÈÈà  A^ZųFŸ€šFn ?$I’$Iù3ÈÈà  A^Zþ9ú„ÔTt·—³3û…¿!’$I’¤¼ääaÀ /­ÁgEŸ€ ´>õ3áoˆ$I’$)oyyä$0ÈK«wýG£OÀ:k C$I’$Iy3ÈÈà  A^Z ß}B&лñïÂßI’$IRÞ òò0ÈH`—Vû”Ÿ>!|óÂð7D’$I’”7ƒ<€< òä%¶â€² ¢Ï@M;ÿ#Mø"I’$IÊšA@y ò2ü ï©£Ï@]ÃÞ®Quô"I’$IÊ—A@y òÒ>ð…è30öê_C$I’$Iù2ÈÈà  A^zý¯}"úŒL {é»ÂßI’$IR¾ òò0ÈH`—^÷Š÷FŸ€ ô¿rLø"I’$IÊ—A@y òÒkŸù+Ñg`;¿r<ú ‘$I’$åË  ƒ<€y鵎ùѲ,ŠèSPSñôÃáoˆ$I’$)_yyä$0ÈËSñÜãѧ ®bT¶Ž>0ü ‘$I’$åÉ  ƒ<€yy>ôåèS0_;ý†H’$I’òd‡A@ƒ¼<õ¿±:ú”L {ÕûÃßI’$IRž òò0ÈH`—§Þº#¢O ÀúOC$I’$Iy2ÈÈà  A^ž:çüVô)˜Àðá›ÂßI’$IRž òò0ÈH`—§ÖÊŸŠ>%(v<þ†H’$I’òd‡A@ƒ¼|í§£Ï ÀZ+C$I’$IéääaÀ /ãüÝ}N&Ð9ï­áoˆ$I’$)=ƒ<€< òäåkp×9Ñç`½ë?þ†H’$I’Ò3ÈÈà  A^¾z×,úœL`pïÚð7D’$I’”žA@y òòÕY{Xô9˜Àè‰o¹œ˜ IDAT…¿!’$I’¤ô òò0ÈH`—¯ö§.úœLbØ/gWþŽH’$I’Ò2ÈÈà  A^Æ–ï_–ýVôI˜@û´×Ä¿#’$I’¤¤ òò0ÈH`—ù‡~[ïŒ>)è^þgáoˆ$I’$)-ƒ<€< òäåmp÷ùÑ'`ý¯Ÿþ†H’$I’Ò2ÈÈà  A^Þz×,ú¤L`øðMáoˆ$I’$)-ƒ<€< òäå­sÁïFŸ€ ­§ÂßI’$IRZyyä$0ÈË[ëÄ—EŸ€ µNxiø;"I’$Iš<ƒ<€< òäå¯è<}V&йàwÂßI’$IÒäääaÀ /Ã-¢Ï Àz7ümø"I’$Iš<ƒ<€< òäåopûÑg`ƒo^þ†H’$I’&Ï  ƒ<€yùë]ý¡è³0Ñ“÷‡¿!’$I’¤É3ÈÈà  A^þ:ç¼)ú¬Lb4(g|~ø;"I’$Iš,ƒ<€< òäå¯uüAÑg`BíÓ_þŽH’$I’&Ë  ƒ<€yÓ©Øñ½èÓ0î•ï C$I’$I“e‡A@ƒ¼é4|èÆèÓ0þ¦Uáoˆ$I’$i² òò0ÈH`7úOŽ>-þË×ÂßI’$IÒdääaÀ o:u¯zôi˜@Ñ}®œYþŽH’$I’êg‡A@ƒ¼éÔ>óõѧ`Bí“_þŽH’$I’êg‡A@ƒ¼éÔ:úÀ²,Šèó0î¥ï G$I’$Iõ3ÈÈà  AÞô*žþçèó0þ-+ÃßI’$IRý òò0ÈH`7½†›¿}^&0üî áoˆ$I’$©~yyä$0È›^ý¯}^&P´þ5ü ‘$I’$ÕÏ  ƒ<€yÓ«{ñ;¢Ï À„Z'¾,ü‘$I’$ÕË  ƒ<€yÓ«}ò+¢Ï À„:¾=ü‘$I’$ÕË  ƒ<€ySlfYYôvDŸ€ ôo>2þ‘$I’$ÕÊ  ƒ<€ySþ!àc·FŸ€ 7¯ C$I’$Iõ2ÈÈà  AÞtÜqVô‰˜@ñÜcáoˆ$I’$©^yyä$0È›n½uGDŸ€ µVþŽH’$I’ªg‡A@ƒ¼éÖYshô‰˜Pçü·…¿#’$I’¤êääaÀ oºµŽù‘²,Šè30ÞþŽH’$I’ªg‡A@ƒ¼éW<ýpô™˜Àà¾ËÂßI’$IRõ òò0ÈH`7ý†ß¾2úÌL`ôƒ‡ÂßI’$IRõ òò0ÈH`7ýú7}f&QeëØG$I’$IÕ2ÈÈà  AÞôë\ô‡Ñg`BÿÇÞ½GÛ}Öu_½q‘› âtÔPP©ãxaféÔQYŽ—ˆ,â,AG™Š¢ËËœ6mè…^Ò”¶4-mCZzK¡¤¦-´¶iKï&¤´ —–¦—„Ò³ï{ÿžY'EBš¦¿ç9ç»{¿^k½ÿ‡ž'绥³?ð_Ãïˆ$I’$éÀ2È(à  ƒAÞü×:ùû£ÌÔÔ»ú/Âïˆ$I’$éÀ2È(à  ƒAÞ´ô TuŸŒþQPÃ`óãïˆ$I’$é€2È(à  ƒAÞÂ4üâÍÑ?jjíØ~C$I’$I–A@y ò¦þígDÿ¨¨c4L³Ë_~G$I’$IÏœA@y ò¦îGÿ8úG @Mí³:üŽH’$I’ž9ƒ<€2 ò2ä-Lscš©·þOÃïˆ$I’$é™3È(à  ƒAÞuô·íþÚCšgp×9ñwD’$I’ôŒä”aÁ oÿÁG?ýã †ÑCw‡ßI’$IÒ3gP†A@ƒ¼…k𙋢ÜÔ1ì¥Ù™ç„ßI’$IÒþ3È(à  ƒAÞÂÕ»ö¯¢ÜÔÔ>ã'Âïˆ$I’$iÿä”aÁ oáêœ÷KÑ?njê~ø…ßI’$IÒþ3È(à  ƒAÞÂÕZñÒ”ª*úG@ ýÛN¿#’$I’¤ýgP†A@ƒ¼…­Úµ=úG@ Ã/Þ~C$I’$IûÏ   ƒ<€ y Ûð?ý# Ž~+Í.;$üŽH’$I’ž>ƒ<€2 ò2ä-l½ë—FÿȨ©}ÚkÂïˆ$I’$éé3È(à  ƒAÞÂÖY»8úG@MÝË7üŽH’$I’ž>ƒ<€2 ò2ä-l­¿'úG@Mý›O ¿#’$I’¤§Ï   ƒ<€ y _õÔ#Ñ?vjÞ¿1ü†H’$I’ž>ƒ<€2 ò2ä-|Ãû®þ±PCÕÙ•f—~G$I’$IûÎ   ƒ<€ y _ÿÆã¢ìÔÔ:ù•áwD’$I’´ï òÊ0ÈÈ`·ðu/yKô€šº¿)üŽH’$I’öA@y ò¾ö)¯Šþ±PSÿ†cÃïˆ$I’$ißä”aÁ / ¥§ªûdô€†ÿtuü‘$I’$í3ƒ<€2 ò2äÅ4Ü~Sô€ªÖcá7D’$I’´ï òÊ0ÈÈ`SÿÖ•Ñ?zjjôŠð;"I’$IúÖ òÊ0ÈÈ`S÷Š?ˆþÑPS÷’7‡ßI’$IÒ·fP†A@ƒ¼˜Ú§ÿ‡è=5õ7~G$I’$IßšA@y ò‚ZzpªzOEÿø¨aøÀ'ãïˆ$I’$é[2È(à  ƒA^\Ã훢üÔPu¿¾{X}G$I’$IßœA@y òâêßrjô€šÚ§½&üŽH’$I’¾9ƒ<€2 ò2äÅÕ½ü÷¢üÔÔ]÷ûáwD’$I’ôÍä”aÁ /®öi?ýã ¦þm§‡ßI’$IÒ7gP†A@ƒ¼À–”ªÎ×¢Ÿ5Œ¾|[ü‘$I’$}Syeäd0È‹møÀ'£Ÿu :ivæ9áwD’$I’ô òÊ0ÈÈ`[Ó{£Ÿ5µÏüÉð;"I’$IúFyeäd0È‹­{éoG?jê~ôÃïˆ$I’$éä”aÁ /¶ö)¯Š~Ô4¸ëÜð;"I’$IúFyeäd0È néA©j?ý ¨aî_ô„ßI’$IÒ¿dP†A@ƒ¼ø†_¸.úPÇh˜f—¿ üŽH’$I’ödP†A@ƒ¼øú7ý ¨©³zQø‘$I’$íÉ   ƒ<€ yñu/þïÑÏ€šzW¿3üŽH’$I’ödP†A@ƒ¼øZ'½"úPÓà3…ßI’$IÒž òÊ0ÈÈ`7U³F?j=þùð"I’$IÚ“A@y òÆ£á築~ ÔQU©µâ¥áwD’$I’dPŠA@ƒ¼ñ¨ÿÉc¢Ÿ5uÎ}ø‘$I’$ä”bÁ o<ê\ôÆè§@M½ÿ]ø‘$I’$ä”bÁ oúÙPÓèKŸ ¿#’$I’4©ä”aÁ ¯yµŽ}IJÕ(úéPÇ ›fznø-‘$I’¤IÌ   ƒ<€ yÍlôè¶è§@Mí³:üŽH’$IÒ$fP†A@ƒ¼f6¸ç‚è§@M½ ~G$I’$i3È(à  ƒA^3ë]õgÑO€šŸùPø‘$I’¤IÌ   ƒ<€ yͬ}ÖŽ~:ÔTí| üŽH’$IÒ$fP†A@ƒ¼†6óœ”Ýèç@M­ã¿;þ–H’$IÒ„eP†A@ƒ¼æ6úòmÑÏ€š:ýfø‘$I’¤IË   ƒ<€ yÍ­ëiÑÏ€šú7¾'üŽH’$IÒ¤eP†A@ƒ¼æÖ½üw£Ÿ5 øDø‘$I’¤IË   ƒ<€ yÍ­}Ê«¢ŸuõfÓì²CÃo‰$I’$MRyeäd0ÈkpKJUë±è'@Mí÷ýXü-‘$I’¤ Ê   ƒ<€ yÍnøOWG?!jê~ôÃïˆ$I’$MRyeäd0ÈkvýOý„¨ip÷yáwD’$I’&)ƒ<€2 ò2ä5»Îš_~BÔ4zô³áwD’$I’&)ƒ<€2 ò2ä5»ÖŠ—¥TUÑÏ€:ª*µV¼4ü–H’$IÒ¤dP†A@ƒ¼æ7zâ¾èg@M ~9üŽH’$IÒ¤dP†A@ƒ¼æ7øÌEÑÏ€šz—…ßI’$Iš” òÊ0ÈÈ`×üzŽŒ~FÔ4¼ïcáwD’$I’&%ƒ<€2 ò2ä5¿öÙ?ýŒ¨©ê>™f—~K$I’$i2È(à  ƒAÞtÔsSt£Ÿ5µÏøñø["I’$IA@y ò&£ÑWîˆ~JÔÔ»êÏÂïˆ$I’$MByeäd0È›Œú·ý”¨ið™…ßI’$Iš„ òÊ0ÈÈ`7u×-‰~JÔT=ùåð;"I’$I“A@y ò&£öÊŒ~Jdh½÷ûÂo‰$I’$5=ƒ<€2 ò2äMHKJUëñèç@MÝË~'þ–H’$IRÃ3È(à  ƒAÞä4¼ïÚèç@MýÛÞ~G$I’$©éä”aÁ orêryôs ¦ÑÛÃïˆ$I’$5=ƒ<€2 ò2äMNµ¿ýœ¨k4L­c_~K$I’$©Éä”aÁ orj÷]ÑÏ € ~9ü–H’$IR“3È(à  ƒAÞdUí| úIPSÿG‡ßI’$Ijryeäd0È›¬÷^ý¤¨ixÿõáwD’$I’šœA@y ò&«ÞÕïŒ~RÔÕ›M³Ë ¿%’$I’ÔÔ òÊ0ÈÈ`7YµWÿLô“ CûÌ׆ßI’$Ijjyeäd0È›°Žz^JÃ^ô³ ¦Þ†?¿%’$I’ÔÐ òÊ0ÈÈ`7yº+úYPÓ`ËeáwD’$I’ššA@y ò&¯þígD?+jªžújø‘$I’¤¦fP†A@ƒ¼É«{ÅD?+2´N~eø-‘$I’¤&fP†A@ƒ¼É«}ÚG?+2t/ÿ½ð["I’$IMÌ   ƒ<€ yØÒƒRÕÙý´¨ipÇYñ·D’$I’˜A@y ò&³á®‹~ZÔ4zdKø‘$I’¤&fP†A@ƒ¼É¬ñÑO €ºª*µV¼,ü–H’$IRÓ2È(à  ƒAÞdÖ¹ð7¢Ÿ:üµð["I’$IMË   ƒ<€ y“Y븗G?-2ôoX~K$I’$©iä”aÁ or«vm~^Ô4|ð†ð;"I’$IMË   ƒ<€ y“Û`Ë¥ÑÏ €ºúí4;óœð["I’$IMÊ   ƒ<€ y“[ïšwE?/2´ßÿSá·D’$I’š”A@y ò&·Î9¯‹~^d˜VGßI’$IjRyeäd0È›àŽ~~JÃ~ô ¦á?~8þ–H’$IRƒ2È(à  ƒAÞd7zøžè'@MÕìŽð;"I’$IMÊ   ƒ<€ y“ÝàŽ³¢ŸÚ§¾:ü–H’$IRS2È(à  ƒAÞd×½â­ÑO € s¿Ç£o‰$I’$5%ƒ<€2 ò2äMvíÓ^ýÄÈ0¸ëœð["I’$IMÉ   ƒ<€ yÞÒƒRÕÙý̨iôègão‰$I’$5$ƒ<€2 ò2äM~Ãû¯~fÔUU©uÜw…ßI’$IjByeäd0È›üú7¬ˆ~fdè\ø†ð["I’$IMÈ   ƒ<€ y“ßÜ€æêßtBø-‘$I’¤&dP†A@ƒ¼É¯uÜË£Ÿ†_¼9ü–H’$IR2È(à  ƒAÞtTíÚýÔ¨kÐM³G=/ü–H’$IÒ¸gP†A@ƒ¼éh°åÒè§@†Î9¯ ¿%’$I’4îä”aÁ o:ê]ó®è§@†ÞÇÿ.ü–H’$IÒ¸gP†A@ƒ¼éhîoV ¹†Ÿ¿&ü–H’$IÒ¸gP†A@ƒ¼)éèç§4ìG?7jªzO¥Ùe‡ÆßI’$Iã òÊ0ÈÈ`7=¾'ú¹¡}Ö ¿%’$I’4Îä”aÁ ozÜqVôs Cïšw…ßI’$Iç òÊ0ÈÈ`7=u¯xkôs Ãð³W†ßI’$Iç òÊ0ÈÈ`7=µO{Môs CÕ~"Í.=8üžH’$IÒ¸fP†A@ƒ¼)jéA©êìŠ~rdhŸþ£ñ÷D’$I’Æ4ƒ<€2 ò2äMWÃû¯~rdè]õŽð["I’$IãšA@y ò¦«þ +¢Ÿ[. ¿%’$I’4®ä”aÁ oºê\ø†è'@†ê©¯îþ òè{"I’$Iã˜A@y ò¦«Öq/~rdj¯ü¡ð{"I’$Iã˜A@y ò¦¯j×öèg@†î•o ¿%’$I’4Žä”aÁ oúl¹4úÙa°ùƒá·D’$I’Æ1ƒ<€2 ò2äM_½kÞýìÈP}íKá·D’$I’Æ1ƒ<€2 ò2äM_s^ýìÈÔ:éá÷D’$I’Æ-ƒ<€2 ò2äMaG[J£AôÓ CwÝïÇßI’$IóVkÅKSç‚_N½ëßwþŸ§)ä”aÁ o:=|OôÓ ƒ!'I’$MP3‡¥öª#R÷Ê·§Áæ5i´ckJÕè_>ÿW­Çãÿ36$ƒ<€2 ò2äMgƒ;Ί~zd=q_ø-‘$I’T£¥ïß]ñÖÔ¿ýÌ4zè®”†ýýÿ½ÙøÿÜ É   ƒ<€ yÓÙÜÿè @³µNüÞð{"I’$iÿµN8í5ÑO€LÝË/üžH’$IúF­c^”:«¥Þ†#wõlµóbŸÿggžþ߯ ä”aÁ oJ[zPª:»¢ŸwO$I’¤imÙ¡{¾zvÝ’4¸óì4Ú±u÷ßd7_ZǼ8þ¿s2È(à  ƒAÞô6¼ÿúèç@†jçýá·D’$Iš¦¯ží^òæÔ¿uenߔҠ³ Ÿÿ[Çwø?ƒ&dP†A@ƒ¼é­Êèç@¦ÖIÿ>üžH’$I“8¾ë¬]œzgÒpÛúTµþèï³ÿfP†A@ƒ¼é­sᢟ™ºë~?üžH’$IM®uÌ‹Rgõ¢ÔÛpdl^³ûo¢GíÓ~8üŸU2È(à  ƒAÞôÖ:îåÑÏ€Lƒ{ο'’$IRcZvhj¯:"u×-Iƒ;ÏN£[SªF© ÚgüDü?¿dP†A@ƒ¼é®Úµ=ú ¡úÚò ¡ IDATÃo‰$I’4Î_=Û½äÍ©ëÊ4ܾ)¥~;5Uûìÿþϳ ä”aÁ oºl¹4ú ©uÒ+Âï‰$I’4ã»ÎÚÅ©·q& ·­OUë±4I:çýbø?ã&dP†A@ƒ¼é®wÍ»¢Ÿ ™ºþÃð{"I’$-d­å/LÕ‹RoÑi°yÍž¯žpþZø?÷&dP†A@ƒ¼é®sÎ뢟 ™æþdô=‘$I’æ­e‡¦öª#RwÝ’Ý_=;zè®”ªQš6Ý‹ßÿ³h@yeäd0È›òŽ~~JÃ~ô3 Cõµ/ÅßI’$©ðWÏöo:> ·oJ©ßŽþÈ=º—ÿnøÏ¦ ä”aÁ O£‡ï‰~†djŸòá÷D’$Iz¶µŽýöÔ9ÿõ©·q& ·­OUë±èÖc«û‘? ÿy5!ƒ<€2 ò2äipÇYÑÏ€Lþåœ$I’ƽÖò¦ÎêE©·áÈ4ؼ&vlþÝ(½«Þþ3lByeäd0ÈS÷Š·F?C2 >}aø=‘$I’þ¥™ÃRûŒŸHÝþIÜ}^=²%¥Ñ0úcs£õ®ýëøŸk2È(à  ƒAžÚ§½&ú©úúÃá÷D’$IÓ[ë„ÃSgíâÔ¿éø4ܾ)¥~+ú#òÄé}üoÃÎMÈ   ƒ<€ yš]zPª:»¢Ÿ"™Ú+0þ¦H’$iâkû’Ô9ÿõ©·q& ·­OÕì£Ñ…§Bïºÿþ³oByeäd0ÈÓ\Ã/\ýÈÔýè‡ßI’$MXË_:çþ\ê]ó®4ØriªvmþØ;µæáï¡ä”aÁ OsõoXýÈ4÷/H£ï‰$I’ܲCR{Õ©»nIêߺrÏWÏ{ÑsùÿúŸ8:þ4 ƒ<€2 ò2äi®Î…oˆ~ŠdªZ§Ù¥‡ßI’$5£Ö ‡§ÎÚÅ{¾zvîoÎï·¢?Ò²ýŽ 3MÈ   ƒ<€ yš«uÜË£Ÿ"´ß÷cá7E’$IãWëØ—¤ÎêE©÷±¿IÃmëS5»#ú£+ÏRÿÆãÂßQ2È(à  ƒAžþ¹j×öèç@¦Þ5~O$I’ÜÌa©}ækSoÑi°yMíØšRUET%SÓ‰ño«ä”aÁ OÿÜ`Ë¥ÑÏ€LÃÚ~O$I’´€-;$µW‘ºë–¤þ­+Ópû¦”†½è¥ÌƒþÍ'Ç¿·dP†A@ƒ<ýss«ÍVõžÚý7¢DßI’$ÍO­Oµ‹SoãÌž¯žíìŠþÊ™\F¿¿&dP†A@ƒ<ýss^ý( ³zQøM‘$IR~­c^¼û³]ïc³g|÷Ô#Ñ5 Ô¿íôð7Ù„ òÊ0ÈÈ`§éèç§4ìG?I2õ6.‹¿)’$IzvÍ–Úg¾6õ6™›×¤ÑŽ­)UUôGKÆHÿö3ãßi2È(à  ƒAžþu£‡ï‰~’d>xcø=‘$IÒ~ZvHj¯:"u×-Ùý5¤Ãí›Rt£?F2æwžÿvA@y òô¯ÜqVô“ ×°—f—¿ ü¦H’$iO­Oµ‹SoãÌž¯žmïŒþÄH î:7ü-7!ƒ<€2 ò2äé_×½â­ÑO€:ü·ð›"I’4µŽyqê¬^´ç«g·\–ª§¾ýÑ 1¸çüð÷Ý„ òÊ0ÈÈ`§]û´×D?I èo:1ü¦H’$M|3‡íùêÙ+ßž›×¤ÑŽ­)U£è‚L¨Á§×Æ¿ùdP†A@ƒ<}SKJUgWô³ Óè¡»ãoŠ$IÒ„Õ:ùûSwÝ’Ô¿uenߔҠý±)2øÌ‡Âÿ 4!ƒ<€2 ò2äiï†_¸.úY«¥Ö{¾#ü¦H’$5µÖ{¿/u/~SêßtB>ðÉTu¿ý )7ØriøŸ‹&dP†A@ƒ<í]ÿ†ÑÏ€æþrôM‘$IjB­c^”:«¥Þ†#wõlµëÁèrð-ü y–A@y ò´w #úYP@ÿö3ÃoŠ$IÒØ5sXj¯:"u¯|ûîñÝhÇÖÝ»0Œ»Á§/ŒÿóÓ€ òÊ0ÈÈ`§½k÷]ÑÏ€F>ü¦H’$…¶ôà=ã»+þ õo?#¾rgJÃ~ôÇ4¨e°ùƒñ¦A@y ò´¯FO|!úiP@ëäW†ßI’¤…ªuÂᩳvqêmœIÃmëSÕ~"úã3¸çüð?cMÈ   ƒ<€ yÚWs_ƒ@óu¯|[øM‘$IšZǼ(uV/J½ GîþêÙjçѽ`^ î:7üÏ]2È(à  ƒAžöUïªwD?M l¹,ü¦H’$e·ìÐ=_=»nIÜyvíØšR5Šþ¨ jîí‡ÿYl@yeäd0ÈÓ¾jŸùÚè§ @U{gš]vHø]‘$Iz¶_=Û½äÍ©ëÊ4ܾ)¥A'úc„ÜqVøŸÍ&dP†A@ƒ<í³™ÃRê·¢Ÿ'´ßÿSñwE’$i?ã»ÎÚÅ©·q& ·­OUëñèO0–ú·½/üÏk2È(à  ƒAžž®áö›¢Ÿ'ô®wøM‘$Iš«µü…©³zQêm82 6¯ÙóÕ³ÀéjUøŸá&dP†A@ƒ<=]ý›Nˆ~ž0|ðÆð›"I’¦°e‡¦öª#RwÝ’Ý_=;zè®”ªQôG#h¬þ-§Æÿ¹n@yeäd0ÈÓÓÕýÐoE?OJ R똇ßI’4ù_=Û½äÍ»ÇwÃí›Rê·£?ÁDéß|RøŸó&dP†A@ƒ<íï_¦0:¾!ü®H’¤É©uü¿Iµ‹SoãLn[ŸªÖcÑw`âõ7þg¿ ä”aÁ Oû«Úµ=ú‰P@ÿ¶ÓÃoŠ$Ijf­å/LÕ‹RoÑi°yMíØýѦRÿÆãÂ4!ƒ<€2 ò2äi î½$ú‰PÀè± ¿)’$©-;4µW‘ºë–ìþêÙÑCw¥4F”æy7¬ˆÿÑ€ òÊ0ÈÈ`§ýÕ»úÑO€BZ'¿2ü®H’¤ñªuÂỿz¶Óñi¸}SJývôGàiô?¹<üwF2È(à  ƒAžöWû쟎~¢Ò½òmáwE’$ÅÕ:öÛSçü×§ÞÆ™4ܶ>U³F<ž…¹?»Ñ¿GšA@y ò´ßŽznJƒnô3 €ÁÖËãïŠ$IZZË_˜:çþ|ê]ûWi°å²TíÚýQÈÔ»~iøï–&dP†A@ƒ<=S£/ÝýL( jïL³Ë ¿+’$©pËMíUG¤îº%©ëÊ=_=;ìEô ë]û×ñ¿oA@y òôLõo9%ú™PHûý?~W$IR^íS~ u/ûÔ¿åÔ4üâÍ)õÛÑ1€Ðû‡ÿþû§ ä”aÁ OÏT÷’·D?S ém\~W$IÒ×:ö%©³zQê}ìoÒpÛúTÍîˆþ8é~äÂ'5!ƒ<€2 ò2äé™j½÷ßE?S }éSáwE’$=MË_°g|·áÈ4ؼ&vlM©ª¢?>c¢{ùïÅÿžj@yeäd0ÈÓT=ù•è§ @ £aj½ç;ÂïŠ$ISß²CR{Õ©»nIêߺ2 ·oJiØ‹þ¤Œ±îÅoŠÿÝÕ€ òÊ0ÈÈ`§i°u]ôS îe¿~W$Iš¶Z'ž:k§ÞÆ™4üÂu)õ[Ñ €†é¬ýõðßeMÈ   ƒ<€ y:z×þUôS ¹¯À‹¾+’$Mr­c_²ç«g?ö7i¸m}ªfwDŸ`tÎû¥ðßoMÈ   ƒ<€ y::ç¼.ú©PH5ûhš]zpøm‘$i"š9,µÏ|mêm8r÷è}´ckJU}î Ô^ý3ñ¿óA@y òt@õ¼”†½èç @!sÃðÛ"IRÓZvHj¯:"u×-Iý[W¦áöM) ºÑg˜í32þ÷`2È(à  ƒAž´ÑWîˆ~®Ò»þÝáwE’¤q¯uÂᩳvqêmœÙóÕ³íÑ'˜bsƒàèß‹MÈ   ƒ<€ y:ÐúŸZý\(døÅ›ÃïŠ$IãT똧ÎêE{¾zvËe©zê‘ès ðMZ'¿2üwe2È(à  ƒAž´îeÿ3ú¹PÊh˜Z+^~[$I iæ°=_={åÛÓ`óš4Ú±5¥ªŠ¾Îû5÷·v†ÿþl@yeäd0ÈÓÖ:ùû£Ÿ+u/yKøm‘$iÞ[vÈžñݺ%©ëÊ4ܾ)¥A7ú /ü®H’Tº¹¿Aª³vqêmœIÃmëSÕÞ}rŠ˜=êyá¿c›A@y òôl~öÊè' @!s#ëÙ¥…ßI’êÖ:æÅ©³zQêm82 ¶\æÿ˜\Uå³ûfP†A@ƒ<=›zÿ»è' @Aí3~<ü¶H’t@Ͷç«g¯|{l^“F;¶¦T¢O)ÀÂtâ7$ƒ<€2 ò2äéÙÔ9÷磟,Í ­£o‹$IßÒÒƒ÷Œï®xkêß~f=tWJÃ~ôÙSµÿÝÜ òÊ0ÈÈ`§gÕÑÏOiØ‹~¶2üâÍñ·E’4õµN8ýt(¨ó_¿-’¤ñ­uÌ‹Rgõ¢ÔÛpdl^“ª÷GŸ.€©Ò¿ýÌð[Д òÊ0ÈÈ`§: >½6úéPPÿæ“Âo‹$iLZvhj¯:"u×-Iƒ;ÏN£[SªFѧ `ªõo:>þ>4$ƒ<€2 ò2ä©NÝþIôÓ  ÑcŸ ¿-’¤ñhîoÀ`¼ô®ûûðûД òÊ0ÈÈ`§:µOÿÑè§ @aíS_~_$Iñ ·}4ú$°—ÞUï¿MÉ   ƒ<€ yªÕÒƒSÕÞý|(¨wõ_ÄßIRxÃoŒ>IìeîkÄ£ïCS2È(à  ƒAžê6üü5ÑÏ€‚†÷_~[$Iñ¹7ú$°—ÎE¿~š’A@y òT·ÞõïŽ~¾”4ì§Ö±ß~_$I±U_ûRôE`/üBø}hJyeäd0ÈSÝæþÇ`&K÷’7‡ßIRlU÷ëÑ瀽´ÏüÉðûД òÊ0ÈÈ`§Ú-Áî¿M €É1¸ç‚øû"IŠkÙ¡)UUô9`/íS^#’A@y ò”Óè+wF?a ªZ¥Ùe‡„ßIRL­/‹>EìC븗‡ßˆ¦dP†A@ƒ<åÔ¿ueô °Î¹?~_$I1µO}uô`fznøhJyeäd0ÈSNÝKÞý„(¬Ë)á÷E’Sgõ¢è3À^ªî“á÷¡Iä”aÁ O9µNø·ÑO€Âª]†ßIRL‹Þ}†ØKµóþðûФ òÊ0ÈÈ`§Üª]Û£Ÿ1…µß÷Ãï‹$iáë^ù¶èÀ^F_¾=ü>4)ƒ<€2 ò2ä)·Ág.Š~ÆÖ»~iø}‘$-|½ëþ>ú°—áçþ!ü>4)ƒ<€2 ò2ä)·Þú?~Æ6zè®ðû"IZøú·œ}‚ØËàž ÂïC“2È(à  ƒAžrk¿ïÇ¢Ÿ1ó uÒ+ÂoŒ$iaó·_ŒŸþÍ'…߇&eP†A@ƒ4)ƒ<€2 ò2ä©D½3ÑO€Ò†ýÔZñÒð#IZ¸ªöÑ×€½t.zcø}hRyeäd0ÈS‰:ç¿>ú)0º—ÿnø‘$-PG??úì°s^#”A@y òT¢Öò¦4D?g l¹,üÆH’¦ö)?}v؇öÊ ¿MÊ   ƒ<€ y*Õè¡»£Ÿ3…U½§ÒìQÏ ¿1’¤ù¯sÎÏFŸö¡õžï ¿MÊ   ƒ<€ y*Uÿ¶Ó£Ÿ3ó sÑÃoŒ$iþë^ö;Ñ'€½†ivéÁá7¢Iä”aÁ O¥ê^úÛÑÏ€y0øôÚð#Išÿz×¼+úä°—jöÑðûд òÊ0ÈÈ`§RµÞû}ÑÏ€yPu¾–fznø‘$Íoý›OŽ>9ìeôè¶ðûд òÊ0ÈÈ`§’U»Œ~Ò̃ÎÚ_¿1’¤ùm°u]ô¹`/Ãí7…߇¦eP†A@ƒ<•l°ùƒÑO€y0¸û¼ð#IšßFÝ}nØËàÞ‹ÃïCÓ2È(à  ƒAžJÖýÈE?iæAÕÙ•fgž~g$IóWÕÞ}nØKÿæ“ÂïCÓ2È(à  ƒAžJÖ>õÕÑO€yÒ¹à—ÃïŒ$i~jû’è3À>ô®ùËðÑ´ òÊ0ÈÈ`§ÒU_(úY0wž~c$IóSûŒ>3ìC÷Òß¿MË   ƒ<€ y*ÝàÞK¢Ÿ5ó j=–f—~g$Iåë\ôÆè3À>tÎùÙðÑ´ òÊ0ÈÈ`§ÒõÖÿiô³`žtÎûÅð;#I*_ï꿈>1ìCû”¿MË   ƒ<€ y*]{ÕD?kæIÿö3ÂïŒ$©|ýO­Š>1ìÃìÑß~#š–A@y òT¼¥¥jöÑè§ À<¨¾þpš]zpü­‘$mxßµÑ'€½Tíá÷¡‰ä”aÁ OóÑð?ý´˜'üBø‘$•­Úµ=ú¼°—Ñ#[ÂïC3È(à  ƒAžæ£ÞÕïŒ~ÚÌ“Áï¿3’¤‚ýü”ªQôy`/Ãû>#˜A@y ò4µÏø‰è§ À<©ÚO¤Ù™ç„ßIR™Úïû±èÓÀ> î>/üF41ƒ<€2 ò2äi^Zzpª:»¢Ÿ7󤳿Wão$©HÝKÞ}V؇þ dž߈&fP†A@ƒ<ÍWÃÏýCôó`ž îùìÝyÔg]ï’´¥LDQA”á¨?9Lý¡€‚ =*8¡âá¬ãQG=N?=Ï“¤Iç¶”6iKÛPÚÒ ZJZÒ¹…N´Ð)mÓ‰6¥Sš&ÙóÞ÷}ýVåh!ÓÜ×Þß½ïýz­õþK\ºè¾î+ûî'ÏsRø=#IÊSwõlôµÀVt¿ô±ð;b3ÈÈà  ƒ< «îWþ!úã À”©±ô9áw$©zýož}­°íS~+üŽ˜Ä òò0ȨÀ OêµâmÑo†¨}ª?CHR*ÖÝ}¥°­o ¿#&1ƒ<€< ò*0ÈÓКÝ-•ÝÍÑq†¤ëéñw$©Z³»¥ÔoG_)lEóÀŽ¿'&0ƒ<€< ò*0ÈÓ0¬½8ú#À°ôš©¹ÏóÃïIÒ®×:òÑ· [Óo§ÆÌÂð{b3ÈÈà  ƒ< ³îWÿOôG€!êœñGáw$i×ëœñ¡è«€­(žX~GLjyyäT`§aÖ>î£?â ÑàÎsÃïIÒ®×»bÿè«€­ÜsQø1©ääaPAž†Ú’g§ÔkEÌ–A75÷ýøûF’´K î:?ú&`+úׯ¿#&5ƒ<€< ò*0ÈÓ°ÜyôÇ€!êœûÑð»F’´k•޾FØŠîWþ1üŽ˜Ô òò0ȨÀ OîwéÒè9C4xðšð»F’´ómù §Œ§Îç?üž˜Ô òò0ȨÀ Oî}Â{¢?æ SY¦Öa¯ ¿o$I;—?§Œ¯ÖŠ·†ß“šA@yäiè-}nJƒnôG€!ê®^ßH’vªî%ÿ}}° Íý_~OLjyyäT`§QT|ûÚè:CT¬_›3 ÂïIÒüÜqNôõÀÖtáwÄ$g‡A@yE½+öþ¨0d­•{‡ß7’¤ùWnZ}u°Åc·…ß“œA@yäiµW½?ú£Àõ®;:ü¾‘$ͯæÁ?}m° ƒ5ç…ß“œA@yäi5—í•R1ˆþ¸0Dek}j,yvø#IÚqÓ>}m° ½¯~OLryyäT`§QU¬»1úãÀµOõç Iš„zW}e° Ý ÿ6üž˜ä òò0ȨÀ O£ªwõ¡Ñw†lpûÂïIÒŽÜwiô•À6tNý@ø=1ÉääaPAžFUûs¿ýq`ØÝÔÜï%áwŽ$i;-Þ=¥n#úÆ`ZG¿)þ®˜à òò0ȨÀ O£ª¹ü…)ƒè<CÖ½àáwŽ$iÛµVî}U°Íe{…ß“œA@yäi”]ý‘`ÈŠGo ¿o$IÛ®û•Œ¾*؆rÓºð{bÒ3ÈÈà  ƒ<²ÞûGäÖ1o ¿s$I[op×ùÑ×Û0¸ïÒð{bÒ3ÈÈà  ƒ<²öI¿ý‘`ú×~çH’¶Òì¢T¶7D_lƒ?GWÏ  ƒ<€ ò4Ò–>7¥~'úcÀ•í§çžùá÷Ž$鵎~SôÀvt/øDø]1éääaPAžFÝàþ+¢?öŒ@笇ß9’¤g¶eèÀøj¯z_ø]1éääaPAžF]wõâè=#0¸ï²ð;G’ôÌwœ}=°ÍC_~WLzyyäT`§Q×>þÑ{F¡,Së°Ÿ ¿w$IÿÖâÝSÙÙ};°-ýNjÌ.Š¿/&<ƒ<€< ò*0ÈÓÈ[¼GJÝFôG€è]¾<þÞ‘$ÍÕþÌ»£¯¶£xôÖð»¢ääaPAž"Üó•è>#PnZ—³»…ß;’¤g¥ÞûE_ lGÿ¶³ÂïŠ:d‡A@yЍ{ñ?Eô‘ö©þ¬!IãPñÈ7¢¯¶ÃO—ÎtßädaPAž"j­xkôG€¬½8üÞ‘¤i¯yÀËR*Ëè+€íèœõáðû¢ääaPAžBš]”Êö†è?£P–©uøOÅß=’4ÅuÎúÓèÛ€Øò—£ï‹:d‡A@yŠjpç¹ÑF¤wÕÁá÷Ž$Msýož}°Íå/ ¿/êA@yä)ªîùýñ`DÊæ“©±dÏð»G’¦²Å»ûéÔc®Üühü}Q“ òò0ȨÀ OQµŽ|côÇ€Úòë£ïIšÆÚ'ýjôÀ î»,ü¾¨KyyäT`§ÈÊEFdðà5á÷Ž$Mcý뉾ØÞµ‡‡ßuÉ  ƒ<€ òYÿæUÑG€j}úçÃïIšªf¦rÓ#Ñv óÅÿgÔ$ƒ<€< ò*0ÈSd3ÿ$ú0BýëW„ß=’4MµVîýè`Z+Þ~gÔ%ƒ<€< ò*0ÈSdÍ^–RYFF¥#¼{ƒ IDAT×LÍý~0üþ‘¤i©wÕÁÑO~v¤,RcŸç…ßuÉ  ƒ<€ ò]ñè­ÑÇ€ê^ô÷áw$MKÅwE?öØâÉ»Ãï‹:e‡A@yŠ®wÍaÑÇ€*Ÿ~05fw ¿$©îµŽ~Sô#€yèßvVøQ§ òò0ȨÀ OѵW½?ú0bÓ~7üþ‘¤º×»úÐèÇ=óÐ]½8üΨSyyäT`§ð–>7¥~'ú(0Bƒ®Š¿$©ÎÍ,L寇£÷ÌCûTïærf‡A@y‡÷]}±Ö1o ¿$©®µOü•èÇ<óÔ:ì'Ãï:e‡A@y‡º—üsôQ`Äú7¯ ¿$©®õ¿qRôc€ùè6æ~ªiô½Q§ òò0ȨÀ OãЖŸ’À”tSó€—‡ßA’T»–ì™ÊöÓÑOyæ¡xèëñ÷FÍ2ÈÈà  ƒÏ ¿ƒ$©N îº úñÀð/!%)_ÍC~<¥²ˆ~´0Oíϼ;üî¨[yyäT`§±ú—‡Lré±x÷ð{H’êPïòåÑuæ«,Ssß¿;ê–A@yäiœ*žX}$Ð9óOÂï IšøfwKå¦uÑtæ©X¿6þî¨ayyäT`§qªwíáÑG€Å£ßJ™á÷$MrS?ý8`'ô¿uZøÝQÇ òò0ȨÀ OãT{Õû£AÚŸýõð{H’&¹Á=_‰~”°ºþï𻣎ääaPAžÆª¥ÏI©×Š>Üyü=$IZóПH©,¢åì„öñï ¿?ê˜A@yäiÜÜsQô± HkåÞá÷$Mb½+Œ~„°3Ê"5—í~Ô1ƒ<€< ò*0ÈÓ¸Õ½ào¢Aw]~IÒ¤Õ\ö‚T¶7D?ÂØ Åc·‡ßuÍ  ƒ<€ ò4nµŽx}ô± PkÅ[Ãï"Iš¤ü…€ÉÓ¿yUøýQ× òò0ȨÀ OãX¹áè£@ÁšóÂï!Iš˜f¥ò©{£Ýì¤î—ÿ*þ©iyyäT`§q¬ÃÊè£@ Ö1o ¿‹$iêœþ‡ÑlvAkåÞáwH]3ÈÈà  ƒ'ü©kyyäT`§q¬¹l¯”½èã@ Ö1o¿$iœkæÝÑjvAñÈÍáwH3ÈÈà  ƒÜñÅð»H’ƹÁ]çG?ªØý¿CêœA@yäi\ë^òÏÑÇ€He™Z+ß~IÒ8¶å§ˆnyN0y:çþEø=Rç òò0ȨÀ OãZëè7E‚ î¿<ü>’¤qlpÏEÑhvÑ–÷Ñ÷H3ÈÈà  ƒ"+¾an¤}'IÒ¸4X{qô£€]ä'@?ƒ<€< ò*0ÈÓ8×>õw¢c sÚï†ßI’4ùéx“­wù¾áwIÝ3ÈÈà  ƒá—£ ã¢,Sû¸_¿›$i5zeJÝFô“€ŠÊÍß ¿S¦%ƒ<€< ò*0ÈÓD´x÷Tv6FÆDñÐu©1³ þ~’¤!׿yUô#€ ú·~§LKyyäT`§IiËËkø®ÎY~7IÒ0kÿιŸ Àäë^ð7á÷Ê´d‡A@yš”:g$ú¸0FÊæ©¹ß†ßO’4”Çn~ÔIë˜7Çß-S’A@yäiRjîÿC)•Eô‘`Œô¯?&ü~’¤aÔ]=ýˆ —n#5ï~·LKyyäT`§Iªxèºè#À8)‹ÔZñ¶ðûI’rÖúäkSê·£Ÿ°d2¸ïÒð»eš2ÈÈà  ƒ:Œ©-¿ò1úž’¤y7»[*¾ýµèG'CP¶Ö§ÆÌÂø»fÊ2ÈÈà  ƒ}tc3>~WIÒ|ꮞ~d0$ýÛÏ¿g¦1ƒ<€< ò*0ÈÓ$ÖÜçù)õÛÑÇ€1þi$~u­¤q¯µâm) zÑL†¤û¥…ß5Ó˜A@yäiR¬ùrôñ`Œ î¿Â¯“4¶5÷ýTn¸?úQ ÀµŽx]ø}3ääaPAž&µÎ9ÿ3úø0æºý]ø}%Iß×ÌÂ4¸ûÂèG$CTnZßLiyyäT`§I­yÀËR*‹è#À8ôR똷„ßY’ôë]º4úéÀõoþlø}3­ääaPAž&¹âÛ_‹>BŒ¹âñ;RcésÃï,IÚRûÄ÷¦T ¢ Yçì„ß9ÓšA@yäi’ë^üOÑG€ пñ¸ð;K’š‡üX*›OF?æÁ¯ ¿w¦5ƒ<€< ò*0ÈÓ$×:âõÑG€ Ñ9û¿…ß[’¦¸%{¦â¡ë¢…Œ@ñÄšø{gŠ3ÈÈà  ƒFLþ­§‡ß]’¦§ÎÙ‰~ì0JÝFj,yvøý3ÍääaPAžêP±~môQ`‚t/úûð»KRýkÿΔúèG#4¸óÜðûgÚ3ÈÈà  ƒ<Õ¡ÞUE%&IY¤öÉ¿~Iªo­#^—ÊÖSÑO;F¬sîGÃï iÏ  ƒ<€ òT‡Z+ß}”˜0eûéÔ:âõáw˜¤úÕ<àe©|êÞèÇš‡üXø=4íääaPAžjÑÌ‚T>ý`ôq`”OÝ—šû½$þ“T›šË_”ŠG¾ýx @ñØmá÷ òr1ȨÀ Ou©wíáÑÇ € 4X{Ij,Þ=ü“4ù5—½ ]ýX HïêCÂï"ääbPAžêRû¸_Œ>NL¨þ7O™ûi«Ñw™¤ nésÒà¾Ë¢gjŸðËñ÷‘ ò21ȨÀ Oµifa*7=}¤˜P½K—Æße’&³Å»§Áš/G?ÆTv7§Æ’gÇßI2ÈÈÄ  ƒ<Õ©þõÇD)&X÷K ¿Ë$MX³‹Rÿ[Ÿ~|lpûâï$Íe‡A@yªSíß}¤˜dE?µ?ûëá÷™¤ iv·¹_y sþgü½¤¹ òò0ȨÀ OµjvQ*G+&Y¯•ÚÇ¿+þN“4Þ-Þ#õo?;ú‰À˜hüªø»IsääaPAžêVÿ¦ÏD+&\Ù~:µŽþÏáwš¤1mŸç¥ÁÚK¢UŒ‰â‘›ãï&ýß òò0ȨÀ Ouk˯€ªÊæ©uÄëÃï5IãUsù‹ÒàÁk¢QŒ‘îêÙðûIÿžA@yä©v-Þ#•­õÑG €(7>œš‡¾:þn“45÷i*ùFô£ €1Ó:êgÃï(ý{yyäT`§:Ö¿ñ¸è£@M”OÛ(ORjô#©xüÎèGc¦X¿6üŽÒ33ÈÈà  ƒ<Õ±ö‰ï>ZÔl”×:ì5á÷›¤˜¶üä£òé£EŒ¡ÞU…ßSzfyyäT`§Z6»(•›>^ÔˆQž4µW½/•Ñ ÆTkåÞáw•ž™A@yä©®õ¾~Tôñ f¶ü„¬Ö'_~ÇIMÝ ÿ6¥²ˆ~ô0¦ÊÍßI™…á÷•ž™A@yä©®µûÅèã@ mù ¬­£~.üž“4ÄfùËìPÿúcâï,}_yyäT`§Ú6³ •ˆ>bÔPÙz*µV¾=þ®“”½æ²¤Áš/G?f˜í“~5üÞÒ÷g‡A@yªs½«>bÔTÙÙ˜ÚÇ¿+ü®“”¯Ö§þS*žXýx`”í ©±xð»KߟA@yä©ÎµŽyKô ÎúÔ9ýÃï;IÕëœù')uÑO&Dÿ–Ï…ß]ÚzyyäT`§ºW¬¿'ú˜Pge™º_ù‡ðûNÒ.¶äÙ©wíáÑO&Lç´ÆßaÚjyyäT`§º×»|ßècÀØ2èiÌ, ¿÷$Í¿æÁ¯JÅC×E?>˜4½Vjìó¼ð{L[Ï  ƒ<€ òT÷ZGýlô1`Jôo;+5–ì~÷IÚqíÏýf*[OE?6˜@ƒ;Î ¿Ç´í òò0ȨÀ OÓPñØíÑG €)1¸ï²Ô\þ¢ð»OÒ6ZúÜÔûú§æ~Ý4ìŠÎYŽ¿Ï´Í òò0ȨÀ OÓPwõlôQ`ŠÝ6÷«0£ï?IϬµâ­©xbMô#€IÖo§æ²½Âï4m;ƒ<€< ò*0ÈÓ4Ô:ü§¢S¦ÜøPjõsáw ¤g¥Æâ=Rïòå)ýèG®Û™ñ÷š¶›A@yäiZ*¾>ú¸0múíÔ9û#áw 4͵Ž|c*ÖÝý4 &:§~ ünÓö3ÈÈà  ƒ‘‹w¿ó´Ã òò0ȨÀ OSÕ’=SÙÞ}ì î:?5|EüÝ(Mx­O¾6 Ö^}¤¨¹ÞuG‡ßyš_yyäT`§i«ãqÑÇæ”›¿“Ú'ÿFøÝ(MbÍå/L½+HiÐ>ÊLöñï ¿û4¿ òò0ȨÀ OÓVûøwE;x†þÍ«RsŸç‡ß‘ÒD´x÷Ô9çÏýzZF¦Ü´.5fÆßšWyyäT`§©kfA*Ÿº/úèÀ3”î÷“W¤í5³ u>ÿ{©X¿6ú¸0ezWjÞääaPAž¦±ÞåûF=ø~Å õ®Ø/5–ì~WJãTû„_Nź£O(SªuÌ›ÃïBÍ?ƒ<€< ò*0ÈÓ4Ö:âuÑG¶©XOj¯zø})E×:êçÒàî £$S¬xòîðûP;—A@yäiZ+¾!úøÀv îüRjòãáw¦4êZŸþRÿÖ3R*ËècÀ”ë^ò/á÷¢v.ƒ<€< ò*0ÈÓ´Ö=ÿãÑÇv¬×LÝÕ‹ScɳÃïNiص}ÇÜÆBY¤æÁ¯ ¿µsääaPAž¦µæþ?”Ò }`^ŠÇïLíÞ~JÃh˯hŠO¿“ú7¯J­#^~ÇjŠZ²gê|þ÷ÒàÎ/¥T ¢Oì²îE¯j—3ÈÈà  ƒ<éY©óÅ?‹>Š_YÌ£Ú'¾7ü®U%í±ïHýV¦²³)úÕýÔ<ðñw¬v9ƒ<€< ò*0È“ž•šË^ÊîæèãCS~_+OyyäT`'=³ö)¿},`¬•ÇSÿ'ÎýšÓæA¯ ¿»õ=-Þ#µVîºý]ÜqÎÜ?/`ÛÊMëæ~‚lø®,ääaPAžô=Í.J冢&LÔ¯¶íß¼*uÎùóÔ<èGâïò)«¹ì©}â{Swõâ4X{IJ½VôG&JïÒ%á÷¹òe‡A@yÒ÷×]=}4`2•e*»-õ¾vdjŸòÛ©yà‡ßëµjɳSë˜7Ïû7¬LÅ£·¦TÑÿÔ`r}¡ fääaPAžôýmùõ{[^ÊÕ•›¿“wŸz—-KíS'5ù±ð»~jîÿÒÔ>á—S÷Ë•ú7ŠïÜ’Ò ýjepÇÃï|åÍ  ƒ<€ ò¤­7¸ý ÑÇj«l­Ÿûõª½+LÓÿ µ>ýó©¹l¯ðûäÍ,œ(nù•³s?šz_ÿTÜ»:•Ç£ÿÀThŸôkñPÖ òò0ȨÀ OÚzí“~5úxÀÔ)¥âÛצþ-'§îêÅ©sæ§ÖÊ·Ïý´¸è?ìjÍý^’ZG¿iîWøvÏÿëÔ»æ°4¸ãœTõ3©yà+Rcv·¡ý¡¹üE©yèOÌýT¿-ÿ7;§~ u¾øg©ûÕ™¹Ÿp׿í̹ÿ‹'Ö¤ÔkFÿ×lC÷¢¿÷ ìääaPAž´í¶¼œ&WÙÙ”ÊÖS©ÜüT>uo*Öß“Šu7Î5¸ïÒ¹_›ûÛ2¢û·ÿYñäÝsÿùrÃÿú¿ßzÊO³€:éwæ~Šmô{åÏ  ƒ<€ ò¤m·åå|ê·£)Qÿ–“Ãß9h8ääaPAž´ýúß<%ú˜µV¼-ü}ƒ†“A@yäIÛ¯}Ü/FS “ÁƒW‡¿kÐð2ÈÈà  ƒ¶À<ßþ.A£Ë  ƒ<€ ò¤«¹l¯Tv6F]`:§ÿaø».ƒ<€< ò*0È“v¾Þ׊>ºÀ”O;5ïþA£Ë  ƒ<€ ò¤¯õÉצTÑÇØŽîŸ‡ Ñf‡A@yÒ®5¸ûÂèã lCÙ|25÷y~øû6ƒ<€< ò*0È“v­öª÷G_`º_ w Ñg‡A@yÒ.6³ ß}„€ïQv6¥æ¾/Žw ‘g‡A@yÒ®×=ï/£0ð=zWþÎ@1ääaPAž´ë5÷y~*ÛOGcà»úÔ<ð‡Ãß(&ƒ<€< ò*0È“ªÕ»úèc ü›ÞuG‡¿+P\yyäT`'U«yÐ+St£2P Rë°×„¿+P\yyäT`'U¯óªè£ S¯ógÃß(6ƒ<€< ò*0È“ª×úÔJ©,£3L¯²œû~ýŽ@±ääaPAž”§Á]Dg˜ZƒÛ¿þn@ñääaPAž”§ög~)ú8ÀÔj­Ü;üÝ€â3ÈÈà  ƒ<)_ÅÃ7Di˜:ƒµ‡¿Ðxd‡A@yR¾:Ÿÿýè# S§µòíáï4ääaPAž”±ÙE©XOô±€©1Xóåø÷› òò0ȨÀ OÊ[÷¼ÿ}¬`j´V¼5ü]€Æ'ƒ<€< ò*0È“2·ô¹©l<}´ öw|1þ=€Æ*ƒ<€\æ×2IDAT< ò*0È“ò×»tIôÑ€z+ËÔ:êçÂßh¼2ÈÈà  ƒ<)Íý~0¥n#úx@mõo==üû¿Æ/ƒ<€< ò*0È“†SïºOGo¨§bZG¾!ü»¿Æ/ƒ<€< ò*0È“†SóàW¥4èFq¨þ-'‡ï×xf‡A@yÒðêßtBô€úýt¼Ã:ü;¿Æ3ƒ<€< ò*0È“†Wë°×¤Tô£9ÔÆ–¿üý}_ã›A@yäIíËç¢9Ôà—š‡¾:ü»¾Æ7ƒ<€< ò*0È“†[ëÈ7¤TÑG&^ÿúáßó5ÞääaPAž4üú·}Ô`²õZ©yЄÇ×xg‡A@yÒðkùF?%*è]º4üû½Æ?ƒ<€< ò*0È“FÓàÎs£;L¤²ñxj.Û+ü»½Æ?ƒ<€< ò*0È“FSëè7¥T–ÑG&N÷K ÿ^¯ÉÈ  ƒ<€ ò¤Ñ5¸ûÂè#¥xâ®ÔX¼{øwzMFyyäT`'®ÖÊ·Gy˜(Ó>þ}^““A@yäI£mpïêèc¡xèë©1³ ü»¼&'ƒ<€< ò*0È“F[û3ïŽ>ö0ÚÇýBø÷xMVyyäT`'¾ÁýWD}kƒ;¾þý]“—A@yäI£¯}ì;¢>Œ¯bZG¾!üû»&/ƒ<€< ò*0È“bÜsQôñ€±Ô»îèðïíšÌ òò0ȨÀ OŠ©uÌ›S*ËèGŒ•²»95xyø÷vMfyyäT`'Å5¸ý Ñ+Ý‹ÿ)üûº&7ƒ<€< ò*0È“âjùÆ”Ê"ú1c¡X¿65–<;üûº&7ƒ<€< ò*0È“bëßò¹èÇŒ…öç~3ü{º&;ƒ<€< ò*0È“bkö“) zÑ5X{IøwtM~yyäT`'Å׿áØèGÄôRëˆ×…?×äg‡A@yR|̓^™R¯ý8€½« ÿn®zd‡A@yÒxÔ»öˆèÇŒ\Ùx,5—¿0ü{¹ê‘A@yäIãQsÿ—¦²³)ú‘#ÕùÂÿN®úd‡A@yÒøÔ»bÿèGŒL±îÆÔ˜Yþ}\õÉ  ƒ<€ ò¤ñ©¹ï‹SÙÞýX€á+ËÔZùöðïâªWyyäT`'WݯüCôc†®ÿ“¿ƒ«~ääaPAž4f-Ù3•ˆ~4ÀД©yà+⿃«vääaPAž4~uÎø£èG M÷¼¿ ÿî­zf‡A@yÒ6³ _ýx€ìЇoHÙEñß½UË òò0ȨÀ OÏÚÇ¿3úñyƒÔ:úMáß¹Uß òò0ȨÀ Oßwžýˆ€lz×þ][õÎ  ƒ<€ ò¤ñ­uøO§4èE?& ²rÓºÔ\þÂðïÚªwyyäT`'w½ëŽŽ~L@eíS~;ü;¶êŸA@yäIã]sÿJegSô£vÙàÎsÿ_k:*ýVôÇ  ò*0ȓƿî%ÿý¨€]Rv7§æÁ¯ ÿn­é¨xbMôG  ò*hŸö»á/Ê$í ¥ÏIåÓF?.`§u/üßñß«55•îþÈÔ‚A@í3þ(üE™¤×9û#Ñ Ø)[~}hcñîáß©5=•›‰þØÔ‚A@í³?þ¢LÒ<šY˜ŠïÜýÈ€ù)‹ÔZñ¶øïÓšªÊæ“ÑŸ|€Z0Ȩ }Î_„¿(“4¿ÚÇ¿+¥²Œ~lÀõ®="ü{´¦¯4èFôjÁ  ‚Η?þ¢LÒüëë´èÇlW±~mjìó¼ðïК®šËöŠþèÔ†A@ÝÕKÂ_–Iš̓^™ÊîæèGl]YÌý„÷èïÏš¾š‡¾:úÓPyt¿~TøË2I;W÷’Ž~tÀVõ¾vdø÷fMg­oþøÔ†A@½o}>üe™¤lɳS±þžèÇ/™+e™ÚŸù¥ðïËšÞº_úXô)¨ ƒ<€ Ýþ²LÒ®5XóåèGÌé}ý¨ðïÉšîzW} jà  Šn+5f„¿0“´óµ{MJýNôS€)Wn¸?5—½ ü{²¦»þígG€Ú0Ȩ¨qÀËÃ_˜IÚµzWìý`ÚUí ï ÿ~,ënŠ> µaPQsÅÛÃ_˜IÚÅ–>7•O?ý`Jõ®;:þ»±4³0¥n#ú8Ô†A@Eí3þ8þ¥™¤]®sƇ¢#L¡rÃ~U­Æ¢Ö'_}jÅ  ¢î•†¿4“T¡™ipÿѦ‰_U«1ªsê¢O@­äTÔ¿ûÂð—f’ªÕ:êgS*úѦDïšÃ¿ Kß­wé’è#P+y i&©z½«Ž~œ0ŠG¿•Kö ÿ,}·Á_Š>µbAc¿—„¿8“T±}ž—Ê ÷G?N¨³~'µ>õ3ñߥï6³ •Í'£O@­ädÐ:ù7â_žIª\{Õû¢'ÔX÷‚¿ ÿî+ýÇZG¾1úXÔŽA@Ý+öy&)Oý[O~¤PCƒµ—¤ÆÌÂðï½Ò¬sî_D €Ú1ÈÈ ÿUá/Ï$å©yÀËSÙÞýX FÊÖúÔ<èG¿óJß[ÿ–“£@íääÐë¤Í‹÷&)Oþv89uNÿƒðïºÒ÷5³0•›>µcIëøwÇ¿D“”§™…iðÀUÑj ÿ“â¿çJ[©uÌ[¢@-ädÒ½òÀð—h’òÕ:ü§Sêw¢-L°ò©ûRsÙ^áßq¥­Õ]=}DjÉ  “Á£·…¿D“”·ÞåË£-LªbÚǾ#ü»­´­Šo-ú”Ô’A@Fƒ~4üEš¤Œ-Ù3OÞýh`õ.Û'þ{­´š¿*¥²Œ>&µdQçKÿ+üe𤼵OxÔì”Áý—§Æì¢ðï´Ò¶ê^ôwÑÇ ¶ ò2êßUøË4Iùëß¼*úñÀ„(§æA¯ ÿ.+m¯bÝÑG ¶ òr*ŠÔ8Ð W©n5÷{I*7?ý„`Ü•EjŸôkáßc¥íÕ:ì'£O @­ädÖ¹àoÂ_ªIÊ_ûsÿ5úñÀ˜ë]¾<üû«´£z—ï}TjÍ  ³ÁÃ7…¿T“4œúß<%úÀ˜ÜEjÌîþÝUÚn³»¥rÓºèãPkyCÐüô›â_®IÊ^sù‹R¹ñáèG c¦l­O̓_þ½UÚQíS~;ú¸ÔžAÀô®_þrMÒpò«kx†²HíUï ÿ¾*ͧÁ]çGŸ€Ú3È‚¢³95öy~ø 6IéóªèÇ c¢wÅ~áßS¥ùÔ:ü§ç¤ —AÀtÎýhøK6Ié¹ï‹S¹i]ôc€`ƒ®JÙÝ¿§Jó©ãqÑG`*ä I±þÞ´yfaø‹6Ié}⯤T–Ñ‚”­õ©yÈ…?•æSó€—¥ÔoG€©`0DíS~'üe›¤áÕ¿é„èÇ Ê"µW½/ü{©4ßzWì}j¦†AÀ º>üe›¤áÕ\þÂT>ý`ô£€ë^üÿ…'•æ[s¿—¤²³)úØL ƒ<€!kÿîð—n’†Wû¤_ó«k¦Èàö/¤ÆÌ‚ðï£Ò|ë]}hô±˜*yCÖàšð—n’†[ÿ†c£5Œ@ñÄš¹Ÿ–ý=TšoÍ_‘R¯}t¦ŠAÀ´>ûëá/ß$ ¯æ²½R¹áèG CTv6¦ÿ¿½ûÿµ»®8ZJ†ÆL™ ºlQ4ÆE7³%8·Å%˲dÁÅÍj²_Lü’‘eÙ¢Évo¿**Pä‹_HWke|—V,_ü†UÀN(•–R XÁ¶´çû9ŸÏçµpCŒÃRî¹½ç¾Î¹çñHžÿÁ}¿“×»¯žOsí™é3¨ÔO½mWe€±c!`O?µ!x€“4¸Z×¼7¢,²¯¡ª¢uýÙé³§ÔOÍËÿØ[@ yó¤µqYú#œ¤ÁÖݺ*ûª`º[W§ÏœR¿{îÎ>:cÉBÀ<)ìúªSÓâ$ °É£ØûÝìë€9TìÚõÉÅù3§ÔGí çd€±e!`uîžJŒ“4Ø—œUûpöuÀ(ìŠÆù¯KŸ5¥~j¬~MT‡÷e€±e!`>uÛÑøì¥?ÊIlíÿ”}Ûp¼:õh^þÎôSê·Þ¯Ì>=cÍBÀ<ëí¾+jCð0'i°õúJöuÀlUU´¿öáôÙRê·Öµï›þû …<€­?šþ8'i>sðñìë€YèÞ}^ú\)õÝÊ“£|ngöñ{ò”­ÃQ¿èôüG:I­yå{"Šnö•@zoŠúÄ¢ô™Rê·Þ?Ÿ}|°§·óŸ®•Æ Î]“Ù× 3T>µmúWƲgI©ßZ7| ûøð" y‰Ú·ž›þX'iÀM,Šâñ­Ù× ¯ :òL4Ö¼)Ž”ú¬±æô¨¿Ì>B¼ÈB@¦n;—½3ýÑNÒ`k\üûQµeß8¼œN=šëÞ>?J}·|IOÜ—}‚ø5ò’ûŽšO¡H ¾ö†s²¯ަ*£}Ã?¦ÏÒlêþàòìÀKXȽŸnŠÚ<àIlÝû×e_7¼Dgó§ÓçEi6µ7.Ë>>……<€!ѾãßÓñ$ ¸K£|j[öuÀ‹z^—?+J³¨ùù?‹èµ²Ga!`X”E4¿øþôÇ™>J}·|Iôþ÷kÙÇ€>XÈr½ŸnŠÚÄâüÇ?I«sç§²¯€­{Ï鳟Ôw+–FïáMÙÇ€>YȽíüRž´›8Á§g¤÷Ðúé¹+}ö“ú¨±úÔ(ÿvöñ`,䌈ޣ·EmÅ«Ó% ¦Æù¯‹êàîì«`A)vm‰úò“Òg>©ŸSoˆrßýÙÇ€Y²0BzßõU§¦? JLÍuïŽèµ²¯€¡|æÁh¬~Mú¬'õSsí™þÃÀˆ³0bŠŸoúš7§?JLí˲¯€‘WÞ5oJŸñ¤~j}ñýQµeŽ“…<€T~:W¼+ý‘PÒ`êÞ{Qö50²ªæh®}[úl'õSçæODÝìãÀ°0ªÚõh~åÒ %  ÉÅQì¼=û–9U§Í«þ<®“fÚªS¢÷Ðúì£À²0ʪ*:ß^µ‰Eù‡’æ´Æy¯òÙÙ· Àè赦?ù™=ÏI3­yé[¢Ü¿=ûä0Ç,ä,½Ý[£>uZú#¢¤¹­qÉQ5~™}Å ¿²ˆöW?˜>ÇI3­ýõLÿ¢# …<€¢<´7šWŸ•þ˜(ink}ùo§ÿa €—Q•ÑÞ¸,}~“fRã‚×Gñð7²O d!`!)‹èl=?j“'¦?.Jš»:wü[öí0´:7<}n“fRëú³£:òLö‘`À,ä,@žmѸô­éŒ’æ®Þ_ξZ†Ngó§Óç5é•j¬9=ŠGnÌ>.Ì y U·í-ÿµÉ%鎒æ K£|òûÙ7 ÀÐèÞ3•?«IÇjòÄèÜvnTíÃÙÇ€yd!`+žûY4¯ý«üHIÇ]ãÂ7Fõü“Ù× @ºîýëÒg4éXµ¾ô7Qîßž}TH`!`”etü¥¨_ø»é‘’ޝæ•Ñmfß*iz­úÄ¢ôùL:ZÍËÞÅÏîÈ>&$²0FÊv-Ú[þ3j+^•þ8)iöµ7|(¢ª²¯€yW<ò?ÓŸ͞ˤ—Ö\û¶èmÿÌ>&$³0†ÊCOFëÆFͶ4²uîüTöU0¯ŠGo‰úò“Òç1饿ˆ×ûÉõñø yc¬<´7Ú·þKÔŒ yü¦²ŒÞc[¢õÕFmrIþç¤cÖ˜zC”˾9æTñØ–ñ”VósoÎ]ËÍÛôÍBÇTÙû.‰Æ•ï‰Ú<†J:z͵gFÕ<}ẻb×fËxšßVž­ëþ.ºß[Õ¡'²#ÌB3VÜ{?óârÞ ù¥’þ_­kþ"¢×ʾ*ŽK±kKÔW¾:}ÆÒoÅÒh]}Vt¾ùÓ  æi抅<f¥¬=Ý×Gk㲨O–ÿˆ*iºö†s"ª2ûŠ˜•b÷·,ãiî[±4šW¼+Ú_ÿHt¿sq{¿Ñkgÿ¹°@YÈàøUU¿x$º?úB´6ýs4.}«ÏÛJ‰½ð¿ûFM±û®éφfÏTÁVÏü^4×ýI´®?;:·ÿëô§g‹7Eù쎈¢›ýç À±À@”­#Qìý^ô¶]í›?Í/üuÔ/þƒ¨M,Τ•Æ îýWd_}yáWË^ø\­ôr•O~?ʧÅÓDy`W”Ïï‹è6³ÿt ~Ýÿª•­’} ¯IEND®B`‚‰PNG  IHDR ÚoúŒÜ pHYsèèµ{Rk IDATxœìÝy´fu}çû.@PAÅ)N‰Ñ$’ÄØ1ÞhŒ:FÓ­IîrH{íkìÌ“M\IŒÉmO5PŨL‚ 2DIe’A˜ç d°ª¨ªg?óÞß»ê`ì¨v çœï3¼^k½ÿꕵ:9{8¿‡Oç?°ÍÊ5÷ÄàÖ3£wñ²èœüž({]´Vì­ý'iäëý–¨:gßFs§ßŽÎ±¿“~Þ’4b­Ømös»ÎÉïÞ%ËcpëYQ®ûvö &ÆÊþÿŒ›²³>w}9º.‰ö±oÖòg瞥­¬óoÿ-¢_dßVs¯×šÜgŸ»$AËŸíã~7z-‰ÁÝDÙÝý€±d€MÊA V_Ý þw‡¿>Z‹·Ï?KsP÷sï‹ö³ï0€ySu7DûÈ7¥Ÿ¿$Y‹wˆâð_‰î‹á}WÎ~>43@€:½Vôo<%:§üQ´V<'ÿÐ+Íqݳþ:¢*³ï4€y·é+GÛGüJú9LÒ·÷s£ó¹÷Eÿ¦ÏGôü%Yx2(ðïúíèß|Ú£“e»äl¥yª÷•‰¨ªì;`ÁTí5ÑþäëÒÏc’& ¥»DçsÿO n9#¢ßÉ~¼ÀH1@`ê ¹5ºçÿs´ö~^þVšÏfEÿ²}³o9€UñX´ý…ü³™¤Éiù®Ñ9ã/¢üîõÙ8 (L§A7ú×…ïÖ´4³] ¾uDöªÚøp´þ¹ü3𤉫}Ô¯GÿúÏF zÙ:Hc€ÀT);GïkŸˆÖ¾/I?”J ÖâícpͱٷÀH0B‘4¯­zat/\e±&ûq ΀©P®0º_Üsö;ZÓ¡ÒB¶x‡Üxrö-0RªÇï‹â€ŸÌ?³IšÜ–?;ºç$ÊÖ£Ù<X0(L´²õXtÏÿçh-Ý9ÿÐ)-tKvŒÁ-§g߆#ÉEÒ‚´l—èžÿQ€©`€ÀD*;ë£û•ÿÏ_<Ñô¶t§Þñ¥ì[`¤•ß»3Š}_œ†“4ù-ß5z_]Ñ+²}0o P˜,eý뎟ý®ÕôC¥”ÕÒcx÷Ùw#ÀX(¾)нŸ›–“4íû’è_{|DUe?þ`Π01«/â“¿œˆ”+–?;†«/ϾÆÊ¦sÔ¦¿$™}¦“4=µ~K ¼6ûñsÊ€±W¶×E÷‹ÿ+Z3Û¥¥ÌŠ»Fù¯gß’cix÷W¢µdÇô³¤)jñ³ŸkFwcö#æ„ cmpÛ9ÑÚï¥ù‡EiÆ'÷#û–kƒ>ë¸HZøø©ø:e&€ c©,ÖDç”ÿž8”F bÅnQ>ð­ìÛ`"ô¯<(ýœ'i ›Yݳþ&¢Wd?`« 0v†÷}mö_¤ ¥QŸÜÿÍìÛ`¢ô.üXúyOÒtVô³1|ðšìÇ lÆÇ Ýóÿٟ•¾_±÷s¢|ðêì;`"uÏúëôsŸ¤)m¯§GïŠ#ª*ûQ[Ä€±Pn|8ÚŸþ­üß4"ùÚ€yV•Ñýœ¯ÿ•”WûßÞe{möÓ6› #oðíË¢µÏ‹Ò|Ò¨T¬|^”]›}kL¾a/:Ç¿-ý(iÊ¿’ç‘[³Ÿ†°Y Pi½¯­%OK?èI#õ—O|0À‚©z£ý©_M?JšÞŠåÏŽÁ-gd? ‘ £©D÷œ¥jÙ.1\}yöÝ 0uªÎºhöKùçBIÓÛÌ¢è]º*ûqOÉ€ÑÓÝí?ÿP'RÆ'©ªõ÷G±ßKóχ’¦ºî¹Ž(‡ÙD¨e€ÀH)7>Åá¯O?ÈI#ÕÒbxïÅÙ·'ÀÔ+¾qö«0Òω’¦ºÎIïŠèw²‰ðc P冇¢8xôœ4R-Ù1†·1ûöàû†÷^2{VK?/JšêÚŸþÍ(»²‰ðC P åÚoGqàO§ܤ‘jÉÓbxÛÙÙ·'?bpͱùgFIS_û¨_²³>û‘?`€@ºá£·Gkß—¤ؤ‘ŸÜò…ìÛ€'Ñ»p&ÿì(iê+>õÆ(Û벉0Ë€TåºÕÑÚÿåé5i¤šÙ.7|6ûöà©TUtOÿ`þRÒÔ7;Bñu<ŒÒTëˆÖ?•~@“Fª™E1øÖ§²oO6ǰãÞš–”4õµýˆ~'û©À”3@ E¹ñ‘(ú¹ôƒ™4jõ/Û7ûö` TÝõÑ>ìµéçIIjæg‡qÅ€·éÏA‡½.ý@&Z›¾?€ñS­[ž/N?WJR笿Ê~$0Å PXXå ÚŸùƒôƒ˜4jõÎùPöÝ À6(¼&ŠeÏL?_JR‰L)T÷ì¿M?€I£V÷´?ލÊìÛ€m4¼ãKÑZ¼Cú9SÒ”7³] nùBö#€)d€À‚é]q@þáK±º§¼7¢fߞ̑Á·ŽH?kJRkÙ.1|ðÚìG"SÆ€1¸ûBÿHú‘:Ç¿=bØË¾=˜c½ó?’~攤âÀWFÙ^›ýH`Š 0ïÊu÷Ekåîé.i”jñ†¨z³oOæCUFç3~ö”¤ö¿½#¢ôÕÏ, æW¿Åá¿’~Ð’F©ö'^Uë‘컀yTu7DûÐ_L?ƒJRï««²‰L æU÷‹ÿ+ý€%RÅ~/‰jÝêì[€P­ûv«žŸ~•4å-Þ!†÷}-û‘À0@`Þ î•4ÝÍ,ŠÁmçd?˜`(̹þu'榤Q:Ø_böm @¶rcÿKþ9UÒTWìÿ²(»²ŸˆL(æTÙz,Z+ŸŸ~’F¥þeûdß–Œˆª½&ÚUúYUÒt×=÷ÃÙC&” sªsêûÓPÒ¨Ôõ½ºüˆòÑÛ¢X±kú™UÒ·xû>pUö〠d€ÀœÜy^þáI‘:ŸýÈr˜}[0‚†·qö?gŸ]%Moí#Þà³+æœ scØâà=ÒNÒÈà{­ì»€Ö¿|¿ôó«¤é®íñÙB&Œ s¢wÅÇÓLÒ(ÔþøOGÕz$û–` tÏø³ôs¬¤é­Øï%ÝÙB&ˆ Û¬l=­»¥˜¤ìŠ}^ÕÚ{²oIÆÅ 3ûW4³Ï³’¦·ÞÅK³Ÿ„L¶Y÷ì¿K?(Ié-Û%ʾ•};0fªu«£X¹{þ¹VÒTV,{f”Î~0! PØ&åºÕÑÚëéé%)µ™íbxë™Ù·#cjxÏ…ÑZ¼}þùVÒTÖ=ÿ#ÙA&„ Û¤ó…?M? IÙõ¿ö‰ì[€1×ÿêŠôó­¤)þ˾þ sÀ€­6üÞÑZò´ü’”X÷Œ?Ͼ˜Uݓޕ~Ε4u¿ü/ÙOA&€ [­sÚ§Œ¤Ì:'ü׈r}+0!ªÎºhüUéç]IÓW±üYQk²ƒŒ9¶Jµþh-Ù1ý`$eÕ>d¨:gߊL˜òᣵtçôs¯¤é«wÙ¾Ù@Æœ [¥{Þ?¥ˆ¤¬Š}^Õã÷e߆L¨Á ŸM?ûJš¾Šý_1ìg?c(l±²³>ZËwM?I)-Ý)Êû¿‘}0ázçü]þXÒÔÕ¿éÔìÇcÌ€-Ö»âãé!)¥™íbpËéÙ· Ó`Ø‹ö‘oÊ? Kšª:G¿%ûéÀ3@`‹ý\úAHʨÿÕÙ·S¤ÚðPû¾8ý<,iº>rköã€1e€ÀÜ{IúHʨ{Ê{#ª*û`Ê ï½8Z‹wH?KšžzüïìGcÊ€-Ò9õýé i¡kþËý"ûö`Jõ/Û7ýl,iz*ö{IÄpýè`  °ÙÊâ{ÑÚëé i¡Ü›þä1¤©ªè|æÒÏÈ’¦§Á]_Î~ò0† PØlýož~ð‘´¥;Eyÿ7³o=ˆª½6Š^‘V–4uÏø³ìÇcÈ€ÍÖþôo¥|¤kfQ n8)û¶€(ïÿF´–<-ÿÌ,iâ+Vî1ìg?ö3(l–rÃCÑZ¼}úÁGZ¨z-ɾíàÇô¿º"ýÌ,i:Ü{Iö#€1c€Àfé}ýÐô´PuOz×ì÷kÀÈ©Êè÷Öô³³¤É¯wîßg?ñ3(l_¿£i©}ÈÏGÕÝ}ËÀ“ª6~7Š}^˜~†–4ÙþTöã€1c€@£²³>ZKvL?ðHó]±÷s¢\sWö-†÷^ìë’%Í{åš»³wŒ n>=ý #Í{3ÛÅðö/fßn°Ùz_ù—ü󴤉npÕQÙ:ƈ :güyúAGšïú—®Ê¾Õ`Ë”ƒèõæô3µ¤É­û¹ÿžý¤`Œ Ð¨µßKÓ:Ò|Ö=ù=U•}«À«¿oö+e³ÏÖ’&³bÕó#Ê2ûQÀ˜0@à) ¿wWú!GšÏÚ¿&ªîúì[ ¶Úðös¢5³(ýŒ-i2+¿wgöc€1a€ÀSê_wBúGš¯6ý ±rÍÝÙ·l³Þ9J?gKšÌ7|6ûÀ˜0@à)uÎø‹ôŽ4/ÍlÃ;Î;Å`n ºÑ>ü—óÏÛ’&®Þ—>œý„`L ð”ŠC~>ý€#ÍG½ g²o/˜SåcwD±ì™égnI“Uç¨7g?Þ(<©²óøì_‰È>àHs]çø·ETeö-snpÕQéçnIÖ²]"JŸ¥ÐÌ€'5X}yþáFšãŠý_UñXöíó¦{ò»ÓÏß’&«êñïd?Ú(<©Þ7K?ØHsÚ^OòoeßZ0¯ªÖ£Qìó¢üs¸¤‰ix÷Ù6Æ€ Oªsæ_¥l¤¹lpÕ‘Ù·,ˆáçEkfQúY\ÒdÔÿÆ¡Ù5Æ€ Oª}䯥l¤¹ª{ú³o)XPÝ3ÿ"ý<.i2êó¡ìGcÀ€'ÕZ¹{úÁFš‹Ú‡ýRD¿}KÀ‚ªz£ýñW¥ŸË%ß™ýH`  P¯»1ýP#ÍEŲgFùèmÙw¤(¸*ZKž–~>—4Þµ}öã €1`€@­áwoL?ÔHsÑàú³o'HÕ»p&ý|.i¼+ö}qö£ €1`€@­Ámg§j¤m­{Ö_eßJ¯DûS¿š~N—4ÆÍl7û,€§b€@­Þ×Í?ÔHÛPû°_Št²o% åc·GkéÎéçuIã[µáÁìG#΀ZÝ >–~ ‘¶¶bÙ3£|ô¶ìÛFJÿ‡¥ŸÙ%o>o ‰ µºgýMúFÚÚן˜} Àè©ªèœøŽôs»¤ñ¬|àªì§#΀Z“ß›~ ‘¶¦îY•}ûÀȪZD±êéçwIã×ðÞ‹³aŒ8jµýô´¥µ{mÄ “}ûÀHÜüùô3¼¤ñkxÛÙÙ/Fœ µŠOþrúFÚ¢–î壷fß:0º§øë·’¶¬Á§d?ºq(Ô*Þ#ý@#mIƒ«Î¾m`lTÅc¾ŠGÒ5¸ésÙ.Fœ µŠ¿*ý@#mnÝ“ß}ËÀØÜpRú™^Òø4¸éÔìÇ#΀Z­ý^–~ ‘6§bÿ—EÕ^“}ËÀXêžô®ô³½¤ñÈ€&(Ôj­zaúFjlñ1¼ïŠìÛÆVµñ»QìýÜü3¾¤‘opóç³YŒ8jµö~^úFjªɲì[ÆÞàºÒÏø’F?š PËE£^çè·D”Ãì[&B糘~Ö—4Ú ÐÄ€Z(å6ýiàjýýÙ· LŒMçìbÅ®ég~I£› M P¨e€¢Qnpã)Ù·LœÁÕG§Ÿù%n(41@ –ŠFµîiœ}{Àdªªèÿöô³¿¤ÑÌ€&(Ô2@Ñ(Vìÿ²¨Úk³o˜XÕºÕQ,Vúg’F/š PËE#×Ìv1¼÷’ì[&^ÿ›‡ç iä2@ ‰ µ P4jõ¾ò¯Ù·LÏWñ÷»éŸH­ Phb€@-RíOþçˆa/û¶€©Q®¹;ZKwNÿL@Òèd€@j hdÚëQ>|cö-S§Ù>ùŸ H™ Phb€@-Jý+ξ`: ûÑ>ôÓ?4 ÐÄ€Z(…:Çþ—Ùïr”÷#Z3Û¥F )?š PËEÙËŸÕºÕÙ·L½î™™þ9¤ü Phb€@-e7¸ú˜ìÛˆˆªóxûþDúg’r3@ ‰ µ P”Yç¸ßõÕ;0B7|6ýóI¹ ÐÄ€Z(ʪX±[TëïϾ€±éŒdn )/š PËEYmúUÀè)×Ü­¥;¥v )'š PËEu>û‡Ù—>ðú—,Oÿü@RN(41@ –ŠºbåîQm|8ûҞʰíCöHÿAÒÂg€@j h¡Ütjöel†áêË¢5³(ý³I › M P¨e€¢…¬ó™ßϾä€-ÐýŸ¤ž ia3@ ‰ µ P´P+vjýÙ—<°ªöš(V=?ýsI — M P¨e€¢…jpíñÙ—;°×—þ¹‚¤…Ë€&(Ô2@ÑBÔ9þíÙ—:°µª*:ÇüFúç ’&š PËEóÞ²]¢Z{Oö¥lƒò‘›£µx‡üÏ$Í{(41@ –Šæ»þ7ϾÌ€9Ð;ûoÓ?g4ÿ ÐÄ€Z(šÏÚGýZDUf_æÀ¨Úk£X¹{úç ’æ7š PËEóÖÒ¢üÞÙ—80‡ß:"ÿ3Ióš M P¨e€¢ùªéªì˘kUí#~%ýsIó— M P¨e€¢ù¨}Øk#†ýì˘Ãû¾­™EéŸ?HšŸ Phb€@-Íy3ÛEù+³/m`uO}þg’æ%š PËEs]ï¼̾¬€yVmünËŸþ9„¤¹Ï€&(Ô2@Ñ\VðЍz³/k`ô/]•þY„¤¹Ï€&(Ô2@Ñ\6¼ëËÙ—4°P†½hô3éŸGHšÛ Phb€@-ÍUÝÓ?˜}9 lxû9éŸIHšÛ Phb€@-ÍEÅÊÝ£j=š}9 :'¾#ý³ Is— M P¨e€¢¹hpýg²/e Iù½;£µ×ÓÓ?Ÿ47 ÐÄ€Z(ÚÖ:ÇüFDUe_Ê@¢Þ—?šþ…¤¹É€&(Ô2@Ñ6µdÇ(½5û2’U½QìûâüÏ*$ms(41@ –ж¥ÞWþ5ûFÄàê£Ó?«´í ÐÄ€Z(ÚÚŠý_Ñke_ÂÀ¨(‡Ñ>ôÓ?³´m ÐÄ€Z(ÚÚ†·ž™}ù#fxÇ—Ò?³´m ÐÄ€Z(Úš:'ü^ö¥ Œ¨ÎñoKÿìBÒÖg€@j h‹[ºSTkïɾt€U~÷†hÍl—ÿ†¤­Ê€&(Ô2@Ñ–Ö¿dyöe Œ¸îéÿ3ý3 I[— M P¨e€¢-©ý‰WG ºÙ—-0âªõ÷GkéÎéŸeHÚò Phb€@-mIÃÛ¿˜}Éc¢wáÇÒ?Ë´å ÐÄ€Z(ÚÜ:ǽ5ûrÆHÕÛÅ>/JÿLCÒ–e€@j h³Z¼C”Üœ}¹c¦ÿÍÃó?×´E ÐÄ€Z(ÚœzçýCö¥ Œ£ríC~>ý³ I›Ÿ M P¨e€¢¦ŠUϪ³.ûRÆÔð¶³Ó?ß´ù ÐÄ€Z(jjpÕQÙ—)0æ:ÇþNúg’6/š PËEOUû“¯›ýS¹Û¢|èºhÍl—þY‡¤æ Phb€@-=i3‹bøíK³/Q`Bt?ÿÿæÞ!©1š PËEOV÷”?ʾ<€ R­½7ZKvLÿÌCÒSg€@j ¨¶%;F¹æîì˘0½³ÿ6ÿsIO™ M P¨e€¢ºzçýCö¥ L jÃCÑZºsúg’ž<š PËE?Z±b·¨Šïe_šÀ„êÿ‘ôÏ?$=y(41@ –Š~´þd_–ÀÛô_ŠåÏNÿ DR}(41@ –ŠþcÅ?1èf_–À„ë_¼Wúç ’ê3@ ‰ µ PôÜpRö% Lª·1ŠU/Hÿ,DÒg€@j èßkòuU™}IS¢ùþ韇Húñ Phb€@-ý{Ã{.̾€i2èD±ßKÓ?‘ôàÐÄ€Z(ÚTçÄwd_ŠÀ|ëˆôÏE$ýp(41@ –ŠZ3ÛEùÐuÙ—"0†ýhü§ó?‘ôƒ Phb€@-uO}öeL±Áu'¤>"éÿd€@j Ly‹·ò±Û³/C`šUe´{mþç$’f3@ ‰ µ P¦»î™‘} ÄàæÓÒ?'‘ôD(41@ –Ê·×3¢zü;Ù— @DUEûS¿šÿy‰$ PËezë}éÃÙ—À ï:?ýóI(43@ –ÊtV,{fTξü~Hçè_OÿÜDšö Phb€@-”é¬wáDz/=€3¼ãK韛HÓž M P¨e€2}+v‹ª½6ûÒ¨Õ>â 韟HÓœ M P¨e€2}õ¿º"û²xRÃÛÎJÿüDšæ Phb€@-”éªX±kTuÙ—ÀSjþúôÏQ¤iÍ€&(Ô2@™®ú/;ä n>-ýsiZ3@ ‰ µ P¦ì¯Ÿ´×f_rͪ*Ú‡½6ýói3@ ‰ µ P¦§ÞE‹³/7€Í6¸ñ”ôÏS¤iÌ€&(Ô2@™ŽŠåÏŽª½&ûrØ|UíC!ýsiÚ2@ ‰ µ P¦£Þ…˾ԶØàúÓ?W‘¦-š PËeò+–=3ªÖ£Ù—À–+‡Ñ>ègÒ?_‘¦)š PËeòë}å_³/3€­6¸æØôÏW¤iÊ€&(Ô2@™ð–î쯟ãmØâÀŸÊÿœEš’ Phb€@-”É®wîžÙ—À6\udúç,Ò´d€@j Lp‹wˆjÝêìK `nþ ʯÈÿ¼Eš‚ Phb€@-”É­{Ú²//€9ÓÿÆa韷HÓ M P¨e€2¡Í,Šòá³//€¹3èF±ï‹ó?w‘&<š PËe2ë|æ÷³/-€9׿tUúç.Ò¤g€@j LfÃû®È¾´æ\Õ]ÅŠ]Ó?{‘&9š PËeòêýëÙ—À¼éÿO響H“œ M P¨e€2y o?'û²˜7Õú¢µdÇôÏ`¤IÍ€&(Ô2@™¬Ú‡ü|DUe_­Pà IDATVóª{úÓ?‡‘&5š PËe²\}tö%L¨ª³.ªu«£|øÆ(¼:†÷^û/øáî:?7úC o=ã‰ÿ·Õ—ÍþÏ•ÜÕÚ{¢ÚøpTíµå û5` •Ü­™EéŸÅH“˜ M P¨e€29+wè·³/)` T­Gg‡$Ã;¾ƒk‹þ%Ë¢wÎßE÷”?ŠÎñoö‘ošýËjÅþ/‹bÅ®óÿ»Ì’£Øï%Ñ>ì—¢süÛ¢ûùÿ½/}8ú_]ƒ«‰ámgÅð¾¯Íþ¹}í øwß™þyŒ4‰ ÐÄ€Z(“SïÂe_NÀ(ö¢|ìöÞvvô¯80zçîÝ“ßí£~-Š^­½žžþ{Ë6µ×3¢}ȳÿÁiÓÿný+ŽáíçÌþe•t²ÿ¯, á·/ÍÿÝDšÀ Phb€@-” iÉŽQmx(ûrʰåcwÄðŽs£ÿµOÌþõ’M9¤8ð•ÑZ¼}þï&YÍ,šý¿A÷¤wEÿâ¥1¼ǫ̃Ö};û§Ì£ö‘oÌÿDš° Phb€@-”ɨ{Ú²/%`žl™ïø5éïxMOí#~%7Q•Ù·L¤ÁµÇ¥¿ï¥q΀&(Ô2@¿zç$û²€±Võ6ÆàšOGç˜ßŒÖÌvéïvMoíƒ~&W1ìeß0YÝ(V½ ý]/k(41@ –ʘ5³]Tkï;l`l¿b§{æ_F±üYùïté?TìóÂè]´$ªÎãÙ· LŒÞ…3éïxi\3@ ‰ µ PÆ«ÎñoϾd`¬TuÑÿú!Ñ>ìµéïqis¾j±ñÒ¨Úk³o{Õ†‡¢µdÇô÷»4Ž ÐÄ€Z(ãÕà¦S³/ åcwDïÜ=£µl—ô÷·´¥{?'ú—íÑogßJ0ÖºŸÿéïui3@ ‰ µ PÆë_ÄnúcàITe ï¾ :'¾3Z3‹ÒßÝÒ¶Vì÷’\udD9Ⱦ»`l¿‚1û}.c(41@ –ÊøÔ;ï²/IUwCô¿ö‰(xEúûZšÚ¿&†·|!¢ª²o7;í#ߘþ.—Æ-š PËe|*¹%ûr€‘Rmx0z_ù—(Vì–þž–¢Mÿm¸úòì[ÆÊà†“ÒßáÒ¸e€@j ŒGí#ß”}©ÀÈ(»=º_ø“h-Ù1ý--x3‹¢{Ú¢ÚøÝì[ÆÃ°?ûµvéïpiŒ2@ ‰ µ PÆ£Á5ŸÎ¾T ݦ¿¶é?¼·ïþn–Ò[¶Kô.Z1ìeßš0òú_]‘ÿî–Æ(š PËeô+–=3ªî†ìKÒ”ßôýáÉöéïeiÔjöZ_Ë ªâ±h-Ý)ý½-K(41@ –Êè×=ãϳ/HQ>zktO~ÏìWŽd¿¥ÑÿZž?ŽjãÃÙ·-Œ¬îþ4ÿ-I(41@ –ÊèW~çÊìËTµîÛÑ=ýú‹'ÒV¬|^ nølö- #©üîõéïji\2@ ‰ µ PF»ö'^QUÙ— ,ˆªõHôÎùP´–ì˜þ–ƹÎgÿï¨6~7û–€‘Ó9æ7ÒßÓÒ8d€@j ŒvýK–e_"0ÿ†½è_yP+vM÷J“R±b·\udöÝ #eÓ_ Ë~GKã M P¨e€2ÂÍ,Šjí=Ù—Ì«ámgGqà+ó߻҄Ö9ñQ­ ûV€Ñ0ìE±êéïgiÔ3@ ‰ µ PF·ÎÑoɾ<`Þ”\í#ߘþ¾•¦¡båóbpóiÙ·=Œ„ÞùI7K£ž M P¨e€2º ®>:ûò€9Wµ×FïÜ=£µxûôw­4muOû@D¿È~ @ªrÍÝÑšÙ.ý½,r(41@ –ʈ¶×3¢ê¬Ë¾<`îTe ®;!ŠUÏÏÏJS\û=¢|øÆì'¤ê÷Öôw²4Ê ÐÄ€Z(£Y÷”?ʾ4`Δ]íÃ_Ÿþ~•ôý–íƒkŽÍ~4@šM_M—þ>–F8š PËe4ÞþÅìK¶]¿½‹–DkÉŽéïVI?^÷ä÷ø«{L§rž?‘þ.–F5š PËeô*V½ bØÏ¾4`› ï¾ Š_™þ^•ôÔµ?ñê(¹9û‘ ®wáÇÒßÃÒ¨f€@j Œ^½³ÿ&û²€­Vu×G÷Œ?KŸJÚüŠåÏŠá­gd?>`AUëVGkñöéïai3@ ‰ µ PF¯á·/;,`ëÿêÉþ/O—JÚŠfEï˨ÊìG ,˜Î‰ïÈK#˜ M P¨e€2Zû¾8¢f_°eúÅì¸nÍl—þ.•´mmúqUçñì§ ,ˆámg§¿{¥QÌ€&(Ô2@­zçþ}ö%[¤¼ÿ›Ñþø«Òß¡’æ®ö!{Dù½;³/0ÿÊ¡¿à'Õd€@j ŒVÃû¾–}IÀæ©Êè_º*ZKž–þþ”4÷{?'†÷\”ý¤€y׿dYú{Wµ Phb€@-”Ñ©ØÿeU•}I@£jãÃÑ9þíéïNIóÜ’cpý‰Ù˜WÕ†‡Œª¥É€&(Ô2@zçÿSöå†w}9Š•»§¿7%-P3‹¢éÊìGÌ«îIïÊçJ#” M P¨e€2:•^}9À“«ªè_¶O´oŸþΔ´ðu¿ð§Ã~ö“æmdý®•F)š PËe4*|¥¯ß`dUÝ Ñ=ùÝéïKI¹uŽÛìó&NUEû¯N×J£’ M P¨e€2õ¾üÑìKj•ßèÃxI?¨}Ä¢j=’ýh€mS•Q>z[ ®;!zç|(ÚŸú¿¢µdÇô÷¬4* ÐÄ€Z(£Qyÿ7³/ø1ƒNŠÖ²]Òß“’F«öA?Õúû³Q°Ùª Åð¶³£wÑ’èœøÎ(VúüõÑZ¼}ú{LÒÿÉ€&(Ô2@É«Xö̈~;û`ZUÕìŸ3Ï~JšÀ¯ãyðêì'#¤Úðà_¥óåFç¨7GkéNéï+IO M P¨e€’W÷äwgÿø˜VÃ^tO}ú»PÒdV¬zþì¿l`úT~blráLtŽ{{?'ý½$iË3@ ‰ µ Pr×›ýã`õ‹è÷»éïAI“]±Ï‹¢|ìöì'ó¨êmŒá·¿ýË÷îÉï‰bÿ—§¿$ÍM(41@ –JR3ÛEµñ»Ù?~¦q|rìïä¿%MEÅ~/‰rÍÝÙO>æB9˜ýëVƒëNˆÞ¹{>ñU:KvL×HšŸ Phb€@-”œÚG¼!ûGÀ´éµ¢óéßJJš®Š~2ª f?ØBåš»bpÃIÑûÒ‡Ÿ›,Ý)ý"iá2@ ‰ µ Prê_¼4ûGÀÔO~;ýý'i:kú Qµ×f? xUçñÞ}Aô.ZßŪ¤¿;$åf€@j äT>xuö€iá/ŸH:ÇüFÄ “ýD ×ŠáêË£åAÑ=íÑ>dhÍ,JOH­ Phb€@-”…¯Ø÷ÅU•ý£`ŸH¡:Ÿùƒˆr˜ýd˜å0ÊGnŽÁu'DïÜ=Ÿø*%;¦¿$~(41@ –ÊÂ×=ãϲìLÉŸRoù¦ô÷ž$ýǺgýUöã`bUŒámg?ñU:ǽ5ZKwNîKÏ Phb€@-”„Ü-§gÿؘtýöÿÂuÞ{’ô£õ/Y–ý”{UñX ï87úïûoQ¬Ü=ýù.ir2@ ‰ µ P¸%;FÕÝýc`’•ÃÙ¯¹HçIÒ“5³(ןý´ý"†«/þ×>ÝϽ/Š_™ÿ,—4Ñ ÐÄ€Z( [çÓ¿ý#`ÂõÎùPúûN’[ò´Þ{qö#`ô”Ã(¹9×½s÷|â¯Úíõôü綤©Ê€&(Ô2@YØú—®Ìþ‘0Áz-I×IÒæV¬|^”kîÊ~t¤ª6<ÃÛΞý=®sâ;£X±[úóY’ Phb€@-”…­|ðêì9jpÕQéï9IÚÒÚÿ\TuÙP€Qu×?ñU:WÝSÞÅ>/LKR](41@ –ÊÂþ ϨÊì9hxû9ÑZ¼Cú»N’¶¦Îq¿Q²¥skØâ«t®:2º§} ڇ쭙EéÏ\IÚœ Phb€@-”…«û¹÷eÿ¸˜@åý߈ֲ]Òßs’´-uÏø³ìÇ)ÀÖ+‡OŒM®;!zçî£Þ­½žžþl•¤­Í€&(Ô2@YÀƒÛ5ŸÎþq0aÊïÝÅÞÏMÇIÒ\ÔÿÆ¡ÙU€ÍR=~ßìœíÿ‘èó›Q,{fú3T’æ2š PËeáªÿNö€ Rõ6FûÐ_H¿IÒœµx‡~û«ÙW€Ru×ÇpõåÑ¿ò èžòÞ(öyQþóR’æ9š PËeajüšì5“¤ª¢{Ê¥¿ß$i®+öyaTëÈ~ÊÓjØâ«t®:2º§} ڇ쭙íÒŸ’´Ð ÐÄ€Z( SïÜ¿ÏþQ0Aú—®L·IÒ|Õ>òƒnö£˜ÕÚ{bpÝ Ñ;wÏèõæhíõŒôg $B(41@ –ÊÂ4¼íìì5bx×ùÑZ¼}ú»M’æ³ÞÙ›ý¸&̦¯ÅÜrzô¾üÑè|ú·£Xþ¬ôg$j(41@ –Ê´xû¨:ë²ÔL€jÝ·£X¹{þ»M’ Á5ŸÎ~ìcªênˆáêË£åA³_¥SøSéÏ4I§ Phb€@-”ù¯}øë³ÌL‚^+Ú‡½6ý½&I ÖÒ¢|ðšì§/0êÝ(ïÿFô¿~ÈìØ¤}ÐÏFkfQþ3L’Æ8š PËeþë÷Ù?f&@÷sïK§IÒBWøÊ¨:g?‚QQ•Q>zk ®=>zçü]´xC´–ì˜þ¬’¤IË€&(Ô2@™ÿ†·Ÿ“ýc`Ì ®>&ý}&IYuO~OöcHRmx0†·½‹–DçÄwF±Òg’´ ÐÄ€Z(óÜâí£ê¬Ëþ10ƪµ÷D±üYùï4IJlð­Oe?ŽyVu7ÄpõåÑ¿ò Ù¯ÒÙô²Ÿ=’4­ ÐÄ€Z(ó[ûð×gÿˆgUc~#ý}&IéíõŒ(º.û© Ì•rå#7Çຢ{æ_Fû=¢5³]þ³F’4› M P¨e€2¿õÎûÇì1c¬ñÒôw™$JíO¼zö/$ãùU:ƒ›NÞ¹{Fç¨7GkéNéÏIÒ“g€@j Ìo›¾«¶FùàÕÑZò´ôw™$RÝÓ?˜ýxTš= ÷.ZßÅÊÝÓŸ’¤-Ë€&(Ô2@™ÇoUg]ö€qÔ/¢}ÐÏæ¿Ë$iÛô•Àh¨ºëcxïÅÑ¿lŸèžô®(ö{iú3B’´í ÐÄ€Z(óWû“¯Ëþñ0¦ºgýuú{L’FµbÙ3£\sWö£¦O9ˆò‘›gG`›¾J§}øë£5³]ú3A’4÷ ÐÄ€Z(óWïì¿Éþñ0††w}9Z3‹Òßc’4ÊuŽ~KD9Ì~dÃ䪪(»#ןøÄØäÈ7Fk¯g¤ßû’¤…É€&(Ô2@™ÇƒÚ ŸÍþñ0nÝhô3éï0I‡ú—®Ê~jÃÄØôõ±Ã»/ˆÞEK¢sâ;£X¹{ú=.IÊË€&(Ô2@™¿ªu«³¼Œ™Þ…3éï/I›–<-ʾ•ý膱Sõ6ÆpõåÑ¿ò èžöh²Gþý,I© Phb€@-”ù©Ø÷'²´Œ™ò{wúÓö’´…µ~MD¿ý‡ÑU¢|äæ\wÂ_¥søë£µxûô{W’4Ú ÐÄ€Z(óS÷”÷fÿh3þkúûK’Ʊ޹Ÿý‡‘Qmx0†·½/4:G½9ZKwN¿G%Iã— M P¨e€2?õ¿ö‰ì-cdpãÉéï.IÛfÅ𞋲å°àªÇðösf¿Â¯sÂïE±÷sóïGIÒDd€@j ÌOåWeÿhUwýìW·e¿»$iœ+xETÝ Ùt˜?½V W_ý+Šîiˆö!{ÌŽ¯²ï=IÒdf€@j ÌCKwŽö³´ðÿ³wçÑw×õǬt<ÚÖŠ­]´ÓéT:gº¶¶ÚÑn¶t¬ÓÛÚRëœvÆqÁ.ÔVg~$A$ …ÈÓD”%Ⱦ$Y‚‘MÙ!BP1„ßÝ—ïœ$ÇŽó‘Ͻ¿ß½ß÷'ù=ç<ÿíÁ|.yŸ«¯þ~°gè\ôÞøÛ%I{A‹ÞýW:LÆ _ ¶}¹êݶ¦ê¬?d÷¯ÒY¼_ø¿c’¤…“ 9($ L¾Öé¯~Vö;ÿÇ¥ÙÞ~»$i¯hfŸªÿàµÑµÃØß¼¯êm9«ê\òw»Ç&K÷ÿ÷I’´ 3@ Ç€$”É×¹ô£Ÿ€=DkÝ…ß-IÚ›j¬|U5ì<ý×;|WÃÖöÝ¿JgÃòªµö ª±ìeáÿÞH’ô c€@’ʾ ÝqNô³°òýáŸOI’JÌ€’ P&W㘟ˆ~N ×<ñÃï•$-´Gþ`5œ}2úP³aó›Uÿ+Ÿ¯º×¾{l²ü€ðÏ¢$I{J(ä d€2¹Zg½5ú9(Xÿþ+Ão•$-ÔÚç½#ú 0Mýîî_¥sË)Uû܃«æª«Ù™EáŸ;I’öÔ PÈ1@ Éeru¯^ýœ¬µæÍá·J’l3‹ªþWGŸ&aÐß=6¹uuÕ¾à]»ºØâ}ã?c’$íE c€@’ÊäÚù»Ä eðÄþ?±%)¸?cçOÊ`Ï2ܱu×w­ÎU‹wÿ*ü@øgI’¤½=r PH2@™\ÃíD?'…Úù«¢ï”$é{ªî¦•Ñ'ç0l?]õÚXuo8¶jŸý_«Æò—‡f$IZˆ c€@’ÊdjùƒÑO @¡†O?VÍ.Þ/üVI’¾§j|øE»~¢èwwÿ*[N©Úç¼ë'ÔÌÎìþ‘$I(ä d€2™Z«ßý”ªsÙÂï”$éÿµsì@ý†OÝ_õn[SuÖRµN}]5»ä{Ã? ’$) 9($ L¦Î¥‡F?%¶wT#^~§$IÏjfQÕðÚè±WÛùSfúw_Xu®Z\µÖT5>òñï.I’F΀’ P&ô¥ìöµÑO @º×4üFI’þÿšÇÿ\U úÑgb¯0lm¯ú÷]Qu¯ýHÕZ÷–ª±âGÂßW’$Í/r PH2@™Lƒ'îˆ~JJ3TÍþëð%IJ×½ñøèK±çéwªÁ£7UÝ?¾ëW5û™]?Q&ú-%IÒd3@ Ç€$” ´äU5èE?%…éß{Iü’$}×Gþ`5l>}.Ê5Tƒ'ï®z·­©:½§jžüªÙÅû…¿›$Iš~(ä d€2ÿšÇÿûèg @­µ…ß(IÒs×¹äo£ÏE1†;¾Võï¾°ê\µx× Û9Љ~I’“ 9($ Ì¿ö9ýŒf¸ýájö°ç…ß(IR¦ÅûVƒ¯ßS-4ÃÎ3Uÿ¡U÷†cwÿ*UÆ¿…$I*&r PH2@™Ýkˆ~F Ó¹üƒá÷I’4Z­3ÿ°Ú«õ;Õà±›«îÇWíóÞQ5{u5;³OøŸ»$I*7r PH2@™ý»>ýŒ”dЫ+~8ü>I’F¯ÿÕ˪½ÅpÇÖªwÇ9Ugý!UëÔ×U³K_þç+I’ö¬ PÈ1@ Éeþ ¾ñ•èg  ý»/ ¿M’¤ñÚù+hv÷4Ã_Ûuw:W-®ZkªG¾4üÏR’$íù c€@’Ê<[ò½U5èG?#iõÖøû$I»Þ-§T%vž©úm¬º7[µÏ=x×h&úÏL’$í c€@’ÊüjžðóÑO@A†³OV³‹÷ ¿O’¤ñk,?`×È£ýn5غ¹êÚŠ%¥ IDATÞtbÕ>ﯪ檟­fgö ÿ3’$I #r PH2@™_íÏüyôPá·I’4÷ºW/ ¹Ã[wÿ*Ëþ©júºjvé Ãÿ,$IÒÂÍ€’ PæW÷º#£Ÿ€‚ìüÉXÑ·I’4÷~Q5|扩ފÿ÷wM®œ©ZŸüݪñ‘ïÿÏ-I’ôì PÈ1@ Ée~õï÷હêÀjvfQøFI’¤çÊ€’ Pæ×`ÛÑO@!:W~—$Ihñ¾Õà_ÿ zÕ`Û—«ÞmkªÎúCvÿ*ÅûÅÿç‘$I3r PH2@™G3ûTU¯ý„¢yìOÇß&IÒDjŸý¶ìßûÃ[wÿ*«W­3~«š]ºø?·$IÒ$2@ Ç€$”¹×Xù“ÑÏ@![7‡ß%IÒ›YT ¹áÿþ=?lm¯ú÷]±{l²ö ª±ì‡âÿ%I’¦” 9($ Ì½Öšß‹~> ѹìáwI’4ÙšÇÿÜ®Ÿ„Ò8æ•áÿ,’$Iuf€@Ž I(s¯³þýÑÏ@!üúI’$IÒÞ’ 9($ Ì½îM'D?l»3ü&I’$I’4© PÈ1@ Éeîõï¿2úù(@÷º#Ão’$I’$I“Ê€’ PæÞpû#ÑÏ@š§¼6ü&I’$I’4© PÈ1@ ÉeŽ-}aU ‡ÑÏ@°á3W³3ûÄß%I’$I’&” 9($ Ì­æª£Ÿ€ôn]~“$I’$Išd(ä d€2·ZkŠ~: ÐþôŸ†ß$I’$I’&™ 9($ Ì­ÎúC¢Ÿ€hÃAÕXö²ð›$I’$IÒ$3@ Ç€$”¹Õ½þcÑO@°ÁÖ[Ãï‘$I’$I“΀’ PæVÿ®ÏE?Áº×- ¿G’$I’$M:r PH2@™[ƒ'¾ýtk­~cø=’$I’$iÒ c€@’ÊܶwD?‘zíjvÉ÷†ß#I’$I’& 9($ Œ_cÙE?Áúo ¿G’$I’$M#r PH2@¿æÉ¯‰~6‚u7¬¿G’$I’$M#r PH2@¿öÙo‹~6‚µÖ½%üI’$I’4 PÈ1@ Éeü:—ýlDwý:¶è{$I’$IÒ42@ Ç€$”ñëÞp\ô³hðä]á·H’$I’¤ie€@Ž I(søvçyÑÏ@ Þ­«Ão‘$I’$IÓÊ€’ PÆoðØ-ÑÏ@ Î…ï¿E’$I’$M+r PH2@¿á3G?š'¿&üI’$I’4­ PÈ1@ ÉeÌïWUÃAô³eЯf—î$I’$IšR(ä d€2^•¯Š~2 ß~‹$I’$Išf(ä d€2^­Ó_ýdê}ñŒð[$I’$IÒ43@ Ç€$”ñjŸóöè' Pçâ÷…ß"I’$I’¦™ 9($ ŒWçÒŒ~2µ>ñ›á·H’$I’¤if€@Ž I(ãÕÝ´2úÉÔXö²ð[$I’$IÒ43@ Ç€$”1¿|mYýd6¿~‡$I’$Išv(ä d€2^ý®Ž~2‚ôÞ~‡$I’$Išv(ä d€2^ƒ'ïŠ~2‚ô6Ÿ~‡$I’$Išv(ä d€2^ÃæSÑO@Îçÿ>üI’$I’4í PÈ1@ ÉeŒ–¼ ª†Ãè' HkÍ›ão‘$I’$IS΀’ PF¯qÌ+£Ÿ €@ÍþTø-’$I’$iÚ c€@’Êè5Oymôse8Øõ“°¢o‘$I’$IÓ΀’ PF¯µî-ÑÏ@áÓ†ß!I’$I’êÈ€’ PF¯ý¹¿‰~.‚ôÚ~‡$I’$Iª#r PH2@½ÎåŒ~.‚ôn[~‡$I’$Iª#r PH2@½î¦•ÑÏ@îÕKÂï$I’$Iud€@Ž I(c|ñºmMôs¤}Þ;Âï$I’$Iud€@Ž I(£×¿çâèç Hëÿ1üI’$I’TG(ä d€2zƒÇnŽ~.‚4û™ð;$I’$IR c€@’Êè Ÿz ú¹Ò8âÅáwH’$I’¤:2@ Ç€$”ѶwD?z­ð$I’$IR] c€@’ʈ-yAôSdçOÀ ¿C’$I’$Õ” 9($ ŒVcÅG?A|!üI’$I’TW(ä d€2ZÍUF?Azwž~‡$I’$Iª+r PH2@­æ©¿ýTéÞtBø’$I’$©® PÈ1@ Ée´ZkÞýTé^½4üI’$I’TW(ä d€2ZísÞýT鬸’$I’$©® PÈ1@ Ée´:¾;ú©Ò>÷/Ãï$I’$Iue€@Ž I(£Õ¹âCÑO@Ö™~‡$I’$Iª+r PH2@­î†ÑO@Öi¿~‡$I’$Iª+r PH2@ñK×-§D?Aš«~6üI’$I’TW(ä d€2â—®/ýTiõŠð;$I’$IR] c€@’Êhõï½$ú©2»ô…áwH’$I’¤º2@ Ç€$”Ñê?x]ôS¡ß ¿A’$I’$Õ™ 9($ ŒÖ`ë­ÑO@€aó©ð$I’$IR c€@’Êh ¾~oôS`¸ckø ’$I’$©Î PÈ1@ Ée´vþ,<ƒo~5üI’$I’Tg(ä d€2ZÃöÓÑO@€Áã[Âo$I’$Iuf€@Ž I(#4³¨ªýè§ ÀàÑãï$I’$I5f€@Ž I(#´tÿèg Hÿ«ãï$I’$I5f€@Ž I(ùË^ýLéßsqø’$I’$©Î PÈ1@ É%_cå«¢Ÿ € ;ÿK·è;$I’$IR c€@’J¾æª£Ÿ € ½Û׆ß!I’$I’êÌ€’ Pò5OüÅèg Hï‹g„ß!I’$I’êÌ€’ Pò5Oýµèg HoóéáwH’$I’¤:3@ Ç€$”|­ÕoŒ~&‚ôn9%üI’$I’Tg(ä d€’¯õ/¿ýLéÞtbø’$I’$©Î PÈ1@ É%_묷F?Aº_X~‡$I’$Iª3r PH2@É×>çÏ¢Ÿ € Ýë?~‡$I’$Iª3r PH2@É×>ÿÑÏ@î¦cÂï$I’$Iuf€@Ž I(ù:þÏèg HwÊð;$I’$IR c€@’J¾Îú÷G?Aº×- ¿C’$I’$Õ™ 9($ äë|þ¢Ÿ € (’$I’¤…– 9($ äë\úÑÏ@îÆ£Âï$I’$Iuf€@Ž I(ù:—ýSô3¤»ieø’$I’$©Î PÈ1@ É%_çŠE?Aº7~‡$I’$Iª3r PH2@É×¹òG?Aº7~‡$I’$Iª3r PH2@É×¹ê°èg Hïæ“Âï$I’$Iuf€@Ž I(ùºW/‰~&‚ôn95üI’$I’Tg(ä d€’¯{ÍáÑÏ@Þ­«Ãï$I’$Iuf€@Ž I(ùº×ýLéݶ&üI’$I’Tg(ä d€’¯{ݲèg Hïö3Ãï$I’$Iuf€@Ž I(ùºVD?Azwœ~‡$I’$Iª3r PH2@É×Ýxtô3¤÷…áwH’$I’¤:3@ Ç€$”|Ýë?ýLéßwEø’$I’$©Î PÈ1@ É%_÷†c£Ÿ € ý‡7…ß!I’$I’êÌ€’ Pòu¿°*ú™2غ9üI’$I’Tg(ä d€’¯{ãñÑÏ@Á¶;Ãï$I’$Iuf€@Ž I(#|áºù¤èg Èð©Âï$I’$Iuf€@Ž I(#|áºå”èg ÈpÇ×Âï$I’$Iuf€@Ž I(#|áÚ|Zô3dØúVø’$I’$©Î PÈ1@ Ée„/\·œýLDéµÃï$I’$Iuf€@Ž I(ùº7ýLD«Ù™}Âo‘$I’$Iue€@Ž I(ùº7ýLj|øEá·H’$I’¤º2@ Ç€$”|ÝMÇD?G½"üI’$I’TW(ä d€’¯{ݲèg Pó¸W‡ß"I’$I’êÊ€’ Pòu¯9<ú™Ô<ù5á·H’$I’¤º2@ Ç€$”|+g¢Ÿ €@­3~;üI’$I’TW(ä d€’¯sù£Ÿ €@íOýqø-’$I’$©® PÈ1@ É%_çÒC£Ÿ €@íóß~‹$I’$Iª+r PH2@É×Yÿþèg ÐÎ;}‹$I’$Iª+r PH2@É×¹ðÝÑÏ@ Î•3á·H’$I’¤º2@ Ç€$”|íÏýMô3¨»ñ¨ð[$I’$IR] c€@’J¾öyýLêÝ|rø-’$I’$©® PÈ1@ É%_û3ýLê}éSá·H’$I’¤º2@ Ç€$”|í³ßýLêßwyø-’$I’$©® PÈ1@ É%_묷F?[7‡ß"I’$I’êÊ€’ PòµÖýL~ëÁð[$I’$IR] c€@’J¾Ö'7ú™4lï¿E’$I’$Õ• 9($ äk­~Sô3lvñ~á÷H’$I’¤:2@ Ç€$”|­Ó~#ú™ÖX~@ø=’$I’$©Ž PÈ1@ É%_ó¤_Ž~&‚5W~$I’$Iª#r PH2@É×<îÕÑÏ@°Öi¿~$I’$Iª#r PH2@É×8úÇ£Ÿ €`­uo ¿G’$I’$Õ‘ 9($ äk|䢟 €`íóÿ[ø=’$I’$©Ž PÈ1@ Ée„–¼ ú™Ö¹ôÐø{$I’$IR  c€@’ÊhUƒ^ôS¨{ݲð[$I’$IR c€@’Êh [Û£Ÿ €@½[W‡ß"I’$I’êÈ€’ PFk¸ckôS¨ïúð[$I’$IR c€@’Êh ¾~oôSh°usø-’$I’$©Ž PÈ1@ Ée´_ûbôShøô£á·H’$I’¤:2@ Ç€$”Ñê?´1ú©ˆÔïT³3‹Âï‘$I’$IÓ΀’ PF«ÿ•ÏG?Áùþð{$I’$IÒ´3@ Ç€$”Q¿týTk÷3á÷H’$I’¤ig€@Ž I(#~éºmMôS¬uúÂï‘$I’$IÓ΀’ PF«{Ó ÑO@°öÙo ¿G’$I’$M;r PH2@­îÆ£¢Ÿ €`‹ß~$I’$Išv(ä d€2Z«G?Áº×~$I’$Išv(ä d€2ZK~*‚õ6Ÿ~$I’$Išv(ä d€2Zí ÞýTëß}aø=’$I’$iÚ c€@’Êhµ?óÑO@°ÁÖÍá÷H’$I’¤ig€@Ž I(£ÕZ{PôSløÌá÷H’$I’¤ig€@Ž I(£Õ<õ×¢Ÿ €hÃA5»xßð›$I’$IÒ43@ Ç€$”Ñj÷êè§ £,ü&I’$I’4Í PÈ1@ Ée´Ëˆ~* Ð<åµá7I’$I’¤if€@Ž I(#¶x¿è§ íOýqüM’$I’$iŠ c€@’ÊèUÙèç Xgý!á÷H’$I’¤if€@Ž I(£7ÜþHôs¬»aEø=’$I’$iš c€@’Êè ßý\ëÝ~fø=’$I’$iš c€@’Êèõ¸&ú¹¶óDß#I’$I’¦™ 9($ Œ^ÿÎó£Ÿ €`ƒ¯ß~$I’$Išf(ä d€2ƯͧG?Ñ:³á÷H’$I’¤if€@Ž I(£×ÝxTôsP€Æ/¿I’$I’$M+r PH2@½ÎåŒ~. Ð\õ³á7I’$I’¤ie€@Ž I(£×¾à]ÑÏ@ZkÞ~“$I’$IšV(ä d€2zí³ßý\`ç 1ú&I’$I’4­ PÈ1@ ÉeôZgüvôsP€îuG†ß$I’$I’¦• 9($ Œ^óÄ_Š~. ÐÛ².ü&I’$I’4­ PÈ1@ Éeô+2ú¹(@ÿ¡á7I’$I’¤ie€@Ž I(£×8â%ÑÏ@†Û ¿I’$I’$M+r PH2@£™}ªjÐ~2¢ úÕìâ}ãï’$I’$ISÈ€’ PÆkøÌÑO@Ǽ2ü&I’$I’4 PÈ1@ Ée¼o‰~2 Ð:ýõá7I’$I’¤id€@Ž I(ãÕ¿ïòè' ís¿I’$I’$M#r PH2@óË×ík£Ÿ €t®ø_á7I’$I’¤id€@Ž I(ãÕÝxtô“P€Þ-§†ß$I’$I’¦‘ 9($ ŒWçÒC£Ÿ €ô¿ziøM’$I’$i c€@’ÊxµÏ=8úÉ(ÀàÉ»Ão’$I’$IÓÈ€’ PÆ«õÉ߉~2JÐkU³3‹Âï’$I’$I“΀’ PÆ«yüÏE?…h¬ø‘ð»$I’$IÒ¤3@ Ç€$”ñj,yô“PˆÖi¿~—$I’$Išt(ä d€2f‡=¯ª†ƒèg ísÿ2þ.I’$I’4á PÈ1@ Éeü†³OF?è\µ8ü&I’$I’4é PÈ1@ ÉeüOÜýl wÛšð›$I’$IÒ¤3@ Ç€$”ñëßeô³P€þCÃo’$I’$I“΀’ Pæðìö3£Ÿ € wl ¿I’$I’$M:r PH2@¿î¦•ÑÏ@ †ÃjvéþáwI’$I’¤If€@Ž I(ã×¹ìÑÏ@!š« ¿K’$I’$M2r PH2@¿öyïˆ~6 ÑZûáwI’$I’¤If€@Ž I(ã×Zó{ÑÏ@!:¿/ü.I’$I’4É PÈ1@ Éeüš'üBô³Pˆîõ ¿K’$I’$M2r PH2@¿Æ²—E?…èßõ¹ð»$I’$IÒ$3@ Ç€$”94³¨ªz­è§ ƒ'¾—$I’$Iš`(ä d€2·†OÝýt” 3»k˜}—$I’$IšT(ä d€2·ú^ýt¢±âGÂï’$I’$I“Ê€’ Pæø%ìö3£Ÿ€B´NCø]’$I’$iR c€@’ÊÜênXýt¢ýÙ¿¿K’$I’$M*r PH2@™[‹Þýt¢»aEø]’$I’$iR c€@’ÊÜj­û£è§ ý;Ï¿K’$I’$M*r PH2@™[Í)úé(Äà‰;Âï’$I’$I“Ê€’ PæVcùÑO@)ºÍjvfŸðÛ$I’$IÒ$2@ Ç€$”96³¨ªzíèç £,þ6I’$I’4 PÈ1@ Éeî Ÿz úù(DkõÃï’$I’$I“È€’ Pæ^ÿÁ뢟€B´/øáwI’$I’¤Id€@Ž I(óø"¶e]ôóPˆî¦cÂï’$I’$I“È€’ Pæ^wÊèç ý»/¿K’$I’$M"r PH2@™{‹ßý|bðä]áwI’$I’¤Id€@Ž I(s¯uÖ[£Ÿ€Rô;ÕìaÏ ¿M’$I’$Í7r PH2@™{Í“~9úù(Hã˜W†ß&I’$I’æ› 9($ Ì½Æò—G?i}òwÂo“$I’$IóÍ€’ PæÑÌ>»~åìÔ¹è½ñ·I’$I’¤yf€@Ž I(ókðÍû¢Ÿ€Btoüxø]’$I’$i¾ c€@’ÊüêßwEôPˆ7!ú.I’$I’4ß PÈ1@ Éež_Æn95ú (ÄðéGÃï’$I’$IóÍ€’ PæWçŠE?!¥«Æáÿ*ü6I’$I’4Ÿ PÈ1@ Ée~µÏù³è'  Í)ü6I’$I’4Ÿ PÈ1@ Ée~5OymôPö9o¿M’$I’$Í'r PH2@™_åD?!é^½4ü6I’$I’4Ÿ PÈ1@ ÉeþUÙèg ½;>~—$I’$IšO(ä d€2ÿÛîŒ~F 1x|Kø]’$I’$i> c€@’Êüëßsqô3PŠ^«š=ìyá·I’$I’¤¹f€@Ž I(ó¯{ãÇ£Ÿ€‚4V¾*ü6I’$I’4× PÈ1@ Éeþu>ÿÑÏ@AZkÞ~›$I’$Išk(ä d€2ÿÚgýçèg  Kþ6ü6I’$I’4× PÈ1@ Éeþ5Oø…èg  ½›O ¿M’$I’$Í5r PH2@™#^ýŒ¤ÿÀ5á·I’$I’¤¹f€@Ž I(“iØúVôSPˆá3‡ß%I’$I’æš 9($ L¦ÁÖ[£Ÿ€‚4ŽxIøm’$I’$i. c€@’Ê„¾”Ýy^ôSPæ)¿~›$I’$IšK(ä d€2™º›Ž‰~J Òþì_‡ß&I’$I’æ’ 9($ L¦ÎEï‰~J ÒÝ´2ü6I’$I’4— PÈ1@ Ée2µÖü^ôSPþW/ ¿M’$I’$Í%r PH2@™LÍþTôSPáöGÂo“$I’$IsÉ€’ P&ÔaÏ«ª~'ú9(ÅpX5Žxqü}’$I’$iÌ PÈ1@ Éer ¾~oôsPæÉ¯ ¿M’$I’$› 9($ L®þ=G?'iŸÿÎðÛ$I’$IÒ¸ c€@’Êäê^ÿ±èç  ÝG‡ß&I’$I’ÆÍ€’ P&WçÂwG?'éß»>ü6I’$I’4n(ä d€2¹ZgüvôsPá· ¿M’$I’$› 9($ L®Æ1¯Œ~NJ2V¿(ü>I’$I’4N(ä d€2Áfö©ª^+úI(Hó¤_‰¿O’$I’$‘ 9($ L¶Á¶;£Ÿ€‚´Ï{Gøm’$I’$iœ PÈ1@ Ée²õïú\ô“Pî†á·I’$I’¤q2@ Ç€$”ÉÖÝxtô“Pþ=…ß&I’$I’ÆÉ€’ P&[ûsÿ=úI(Èð©ûÃo“$I’$Iãd€@Ž I(“­õ‰ßŒ~RJ2T³‡_ø}’$I’$iÔ PÈ1@ Ée²5ŽúÑè' 0Í“~9ü>I’$I’4j(ä d€2áfUUg6úY(Hû¼¿Š¿O’$I’$˜ 9($ L¾Áã[¢Ÿ€‚t7­ ¿M’$I’$š 9($ Lã Ú¹ÑÏ @Aú_½,ü6óxôÓPÞÍ'‡ß&I’$I’FÉ€’ P¦Sÿ«£Ÿ€‚ô¾>ü6I’$I’4J(ä d€2º7ý´dØÞQÍÎ, ¿O’$I’$å2@ Ç€$”éÔ¹ø}ÑO @aGÿxø}’$I’$)— 9($ L§Ö¿ý´¦µöÂï“$I’$I¹ PÈ1@ Ée:5ŽzEôÓP˜Îåÿ~Ÿ$I’$IÊe€@Ž I(ÓkØÚý¼¤wû™á·I’$I’¤\(ä d€2½Þý¼dðø–ðÛ$I’$IR.r PH2@™âµÛÖD?/%éwªÙÅû†ß'I’$I’ž+r PH2@™^Ëÿ9úy(LsÕá÷I’$I’¤çÊ€’ P¦WkÝ[¢Ÿ€Â´?ý'á÷I’$I’¤çÊ€’ P¦WóØŸŽ~^ Ó½öˆðû$I’$IÒse€@Ž I(Sì°çWU¯ýĤÏEñ÷I’$I’¤çÈ€’ P¦Û`Û—£Ÿ€‚ ·?~›$I’$Iz® PÈ1@ ÉeÚ_ÖÎ~b Ó8Òí•$I’$•› 9($ L·î5Ž~b Ó:ý á÷I’$I’¤ï– 9($ L·ö9o~b ÓYHø}’$I’$é»e€@Ž I(Ó­yÂ/D?1…éÝú‰ðû$I’$IÒwË€’ P¦ÜÒVÕ ýÌdðØ-ñ÷I’$I’¤ï’ 9($ L¿Á7¾ýÌ”¤×ªf{~ø}’$I’$)• 9($ L¿þçG?3…i÷êðû$I’$IR*r PH2@™~Ýk~f ÓþôŸ†ß'I’$I’R c€@’ÊôkŸý¶èg 0Ýë–…ß'I’$I’R c€@’Êôk®:0ú™(LÿÞKÂï“$I’$I© PÈ1@ É¥†{~UõÚÑO @A†O?Ÿ$I’$IJd€@Ž I(õ4x|KôSP˜Æ‘/ ¿O’$I’$}g(ä d€RÓ—¶-뢟€Â´V¿1ü>I’$I’ô c€@’J=u.ÿ`ôSP˜Î%~Ÿ$I’$IúÎ PÈ1@ É¥žZgþaôSP˜Þ?~Ÿ$I’$IúÎ PÈ1@ É¥ž+_ýÔfðµ/†ß'I’$I’¾3r PH2@©©™EÕ°½#ú¹(I¯]Í.Þ7þFI’$I’ô¬ PÈ1@ É¥¾Þýܦùñ~Ÿ$I’$Izv(ä d€Rã·Í§G?7…iæ/Âï“$I’$IÏ΀’ Pê«sÉßE?7…én:&ü>I’$I’ôì PÈ1@ É¥¾ZgüVôsP˜þýW…ß'I’$I’ž 9($ ÔWcùË£Ÿ€Â ›OU³3‹Âo”$I’$Iß΀’ Pêm8ûdô“P˜Æ1?~Ÿ$I’$Iúv(ä d€Roý®‰~r ÓZ÷Gá÷I’$I’¤og€@Ž I(õÖýªè' 0Ý«—„ß'I’$I’¾ 9($ Ô[û³ýä¦÷á÷I’$I’¤og€@Ž I(õÖ<éW¢Ÿ€Â ·?~Ÿ$I’$Iúv(ä d€RsK_XUƒ~ô³P˜Æ‘/¿Q’$I’$ 0’ PêoðäÝÑÏ@aZ«ß~Ÿ$I’$IÚ™ 9($ |ûÒÙÑÏ@a:—~Ÿ$I’$IÚ™ 9($ Ô_çŠE?;…éÝ~fø}’$I’$ig(ä d€R­µýìf°íÎðû$I’$IÒÎ PÈ1@ É¥þGýhô³PšA¿š]ºø’$I’$É€’ Pb6¾ýô¦yòkÂï“$I’$I(ä d€Sÿ«£Ÿ€Â´/xWø}’$I’$É€’ Pbê^ÿ±è§ 0½›O¿O’$I’$ c€@’JLíóßýôfðèMá÷I’$I’$r PH2@‰©yâ/F?=¥é6«ÙÞ~£$I’$I ;r PH2@ jÉ ªªß~~ Ó\u`ü’$I’$-è PÈ1@ É%®Á¶/G??…iæÏÃï“$I’$iag€@Ž I(_䶬‹~~ ÓÝ´2ü>I’$I’v(ä d€Wç²D??…é?pMø}’$I’$-ì PÈ1@ É%®Ö'7úù(̰ýt5;³Oø’$I’$-Ü PÈ1@ É%®ÆŠŽ~~ ÔüØ¿ ¿Q’$I’¤…› 9($ Ä6œÝý 0íOÿIø}’$I’$-Ü PÈ1@ É%¶þ}—G(LwãQá÷I’$I’´p3@ Ç€$”غ–G(Lÿþ+Ãï“$I’$iáf€@Ž I(±íü5 ðlÃæSÕìÌ¢ð%I’$IZ˜ c€@’JlÍc:ú#@+2üFI’$I’f(ä d€ÜÌ>Õ°½#úc@aÚŸú/ñ7J’$I’´ 3@ Ç€$”øúmŒþP˜îuG†ß'I’$IÒÂÌ€’ Pâë~aUôÇ€Âô¿zYø}’$I’$-Ì PÈ1@ É%¾öùïŒþP˜aãá÷I’$I’´03@ Ç€$”øš'ü|ôÇ€5Žþñð%I’$IZx c€@’J-Þ·ªz­è…iõÖø%I’$IZp c€@’J ¶ÞýQ 0Ýk>~Ÿ$I’$I /r PH2@)£ÞæÓ¢? ¦ï%á÷I’$I’´ð2@ Ç€$”2ê\øîè…În ¿O’$I’¤…— 9($ ”Qó”_þ(P ÆQ¯¿Q’$I’¤…• 9($ ÒÒý«jÐþ8P˜Ö™ÿ)þFI’$I’T(ä d€RNƒ'ïŠþ8P˜îÕKÂï“$I’$iae€@Ž I(åÔÛ².úã@aúw_~Ÿ$éÿ°w÷Ñ{×õçj«z¬#Ng:ÞµÆufª8ÛÒñtªÕµË9nu\«]Üv·µSkñtœYÇ&?$á&J0"rT) 4*£"F„`Aƒî”›ˆ D~×ýu}?{’Œ³®ûÁ7Éõþ|¿¿ÇãœçÿŠŸßï}/r-J’$iIe€@‰ Y(õ4úÜŠ~T¦yðžðû$I’$IZZ Pb€@–J= >úŠèç@…z«ž~£$I’$IK'J PÈ2@©§ÞqOO©i¢Ÿ•œ÷Úð%I’$IZ: Pb€@–J]5?º3úIP™ñå+Âï“$I’$iéd€@‰ Y(u5Ù¾!úIP™é·/ ¿O’$I’¤¥“ %(d ÔÕèóïŽ~T¦éߟ—í~£$I’$IK#J PÈ2@©«ÁÙý$¨Pÿäç‡ß(I’$IÒÒÈ€² PêªwÜÓSjšèg@e†þqø’$I’$- P(1@ Ë¥¾f÷ßý,¨ÌøªÕá÷I’$I’´42@ Ä€,”úš|ócÑÏ€ÊLw\~Ÿ$I’$IK#J PÈ2@©¯Ñçþsô³ 6ã^Z\~@ø’$I’$u?J PÈ2@©¯ÁGþ]ô³ Bý¾(üFI’$I’ºŸ %(d ÔWoåÁ)5³è§@e†Ÿø³ð%I’$Iê~(” e€Rg³ûn~Tf|Íiá÷I’$I’Ôý P(1@ Ë¥Î&ß8/úiP™ÙÝ׆ß'I’$IR÷3@ Ä€,”:}ö?F? j3¥Åcž~£$I’$IÝ΀² Pêlðá—G? *Ô?ýðð%I’$Iêv(” e€Rg½cŸšÒlý<¨ÌhãÛÂo”$I’$©Û Pb€@–J½ÍvÞý<¨Ìäëg‡ß'I’$IR·3@ Ä€,”z›l[ý<¨Ìlçöðû$I’$Iêv(” e€Ro£MGG?jÓÌRoÅAá7J’$I’ÔÝ P(1@ Ë¥Þúk'úyP¡Á‡_~£$I’$IÝÍ€² P*î=¿œÒlýD¨Ìè³ïŒ¿Q’$I’¤Îf€@‰ Y(u7ûþ7¢Ÿ•™|ócá÷I’$I’ÔÝ P(1@ Ë¥î&_ûHô 2Í·‡ß'I’$IRw3@ Ä€,”ºm|[ô 6M“zǻߒ$I’¤}“ %(d Ô]ÿŒ—E?*48çÕá7J’$I’ÔÍ P(1@ Ë¥òŽyRJÓQô3 2£/ü]ü’$I’$u2J PÈ2@©¿Ù=_‹~&TfzÓÅá÷I’$I’ÔÍ P(1@ Ë¥þ&מýL¨Lóà÷Âï“$I’$©› Pb€@–Jý /~kô3 B½UÏ ¿Q’$I’¤îe€@‰ Y(õ×?í·¢Ÿ œ÷Úð%I’$Iê^(” e€Ò‚Li2ˆ~*Tfü¥•ñ7J’$I’Ô¹ P(1@ Ë¥;{MôS 2Óo_~Ÿ$I’$IÝË€² PÚÑøšE?*ÓôïO‹Ëö ¿Q’$I’¤ne€@‰ Y(íhø‰ÿ#ú©P¡þÉÏ¿Q’$I’¤ne€@‰ Y(í¨ê‹£Ÿ ^øÇá7J’$I’Ô­ P(1@ Ë¥%-ß?¥Ñbôs 2ã«VÇß(I’$IR§2@ Ä€,”ö4ýΗ£Ÿ •™î¸2ü>I’$I’º• %(d ´§ñÖD?j3î¥Åå„ß(I’$IRw2@ Ä€,”ö4Üð–èç@…ú|Qø’$I’$u'J PÈ2@iOýS‹~.Thø‰? ¿Q’$I’¤îd€@‰ Y(-jÙR3|0úÉP™ñ5§Åß(I’$IRg2@ Ä€,”v5½óŠè'@efw_~Ÿ$I’$IÝÉ€² PÚÕøªÕÑO€ÚLGiñ˜'…ß(I’$IR72@ Ä€,”v5¼èÍÑO€ õÏxYø’$I’$u#J PÈ2@iWý÷¿0úÉP¡ÑÆ·…ß(I’$IR72@ Ä€,”–µl¿Ôô~ýl¨ÌäëgÇß(I’$IR'2@ Ä€,”ö5ýÖg£Ÿ •™íÜ~Ÿ$I’$IÝÈ€² PÚ×ø‹ï‰~6Ô¦™¥ÞŠƒÂo”$I’$©ý Pb€@–Jû¬?2úÙP¡ÁG~/üFI’$I’ÚŸ %(d ´¯Þ ¿ýl¨Ðèóÿ%üFI’$I’ÚŸ %(d ´³æGwF?*3½é“á÷I’$I’Ôþ P(1@ Ë¥Mn¸0úéP™fqgø}’$I’$µ?J PÈ2@ig£Ï¾3úéP¡ÞIÿ,üFI’$I’Ú %(d ´³ÁYÿ6úéP¡á…o ¿Q’$I’¤vg€@‰ Y(-í=¿œÒlý|¨ÌøË'Çß(I’$IR«3@ Ä€,”ö6ûþõÑÏ€ÊÌîÚ~Ÿ$I’$Ií΀² PÚÛäÚµÑÏ€ÚL†iñ˜'…ß(I’$IR{3@ Ä€,”ö6¼ø/¢ŸêŸñoÂo”$I’$©½ Pb€@–J{ëŸú/£ŸmzGø’$I’$µ7J PÈ2@iqË÷OÍè¡è'@e&ß8?þFI’$I’Z› %(d ´»éWD?!*Óý´¨PÿôÃÃo”$I’$©î P(1@ Ë¥› ?õ—ÑO € .y{ø’$I’$Õ %(d t³þ‡þUôÓ B“ëׇß(I’$IRÝ Pb€@–JG[¾J£Åèç@ef÷;þFI’$I’ªÎ€² PºÛtÇ•ÑÏ € õNxVø’$I’$Õ› %(d t·ñU'E?/*4Xdø’$I’$Õ› %(d t·áÇÞý¼¨Ðøòá7J’$I’To(” e€ÒÝz'ýZôó BÓÛ. ¿Q’$I’¤z3@ Ä€,”n×<ôýè'@ešáOÒâ²'„ß(I’$IR Pb€@–J·›Þü©è'@…ú§¾8üFI’$I’êÌ€² PºÝè²ÿ;ú‰P¡á§þCø’$I’$Õ™ %(d t»ÁÙ¯Œ~bTh²íÜð%I’$Iª3J PÈ2@év½•§ÔÌ¢Ÿ•i¸=üFI’$I’êÌ€² Pºßì7E?3*Ô[uhø’$I’$Õ— %(d t¿É×ÏŽ~fThxþëÂo”$I’$©¾ P(1@ Ë¥û6þUô3 Bã«N ¿Q’$I’¤ú2@ Ä€,”î×?í·¢ŸšÝµ5üFI’$I’êË€² P–@ ¦4îE?5j3¥Å÷üRü’$I’$U• %(d ,¦ß¹*ú©P¡ÁY¿~£$I’$Iue€@‰ Y(K£ñ—OŽ~jThtéÿ~£$I’$Iue€@‰ Y(K£á…oŒ~jThzÓÅá7J’$I’TW(” e€²4ê­~nôS BMï¾´¸l¿ð;%I’$Iª'J PÈ2@Y:5ÝýܨPÿý/ ¿Q’$I’¤z2@ Ä€,”¥Óô–K¢Ÿ~üOÃo”$I’$©ž P(1@ Ëeé4úÂßE?7*4¹vmø’$I’$Õ“ %(d ,ç¼*ú¹P¡ÙÎíá7J’$I’TO(” e€²tê­<$¥fýä¨MÓ¤ÞqÏ¿S’$I’¤:2@ Ä€,”¥Õì¾[¢Ÿ¬{Mø’$I’$Õ‘ %(d ,­&ÛÖE?9*4¾|Eø’$I’$Õ‘ %(d ,­F—üuô“ BÓ;¾~£$I’$Iud€@‰ Y(K«þé/~rÔh´˜—~§$I’$Iñ Pb€@–Êká‰)MÑÏ€ í)†ß)I’$IRx(” e€²ôšÝµ5úÙP¡Ñ¦w„ß(I’$IR|(” e€²ôo]ýì¨Ð®À}£$I’$Iñ Pb€@–ÊÒkxÑ›¢Ÿjº7üFI’$I’â3@ Ä€,”¥Woõ󢟕êŸü‚ð;%I’$IŠÍ€² P–fÍâÎè§@…†Ÿø³ð%I’$IŠÍ€² P–fÓ[7E?=*4¹îÃá7J’$I’› %(d ,ÍF›—G?=*4»ïÖð%I’$IŠÍ€² P–fƒuÿSôÓ FM“z'þ£ð;%I’$IŠË€² P–f½ãž±ûÿd€Ÿ7<ÿuáwJ’$I’— %(d ,Ýf?üVôó Bã/Ÿ~£$I’$Iq Pb€@–ÊÒmrýúèç@…fw5üFI’$I’â2@ Ä€,”¥Ûè’·G??j4›¤ÞŠƒÂï”$I’$)&J PÈ2@YºõO?<úùP©ÁÙ¯ ¿S’$I’¤˜ P(1@ Ëe ·ðÄ”&ƒè'@…F›âï”$I’$)$J PÈ2@YÚÍîº:ú P¡éí_¿Q’$I’¤˜ P(1@ Ëei7Þº&ú P£ÑbZ\80üNI’$I’æŸ %(d ,톽9ú P©þ采ß)I’$IÒü3@ Ä€,”¥]ÿäçG?A*5úÌ߆ß)I’$IÒü3@ Ä€,”%Þ²ýRÓ»/úP¡É¿S’$I’¤¹g€@‰ Y(šÞº)úP¡fñ»‡ŠÑwJ’$I’4ß P(1@ ËE£ÍË£Ÿ!•ê¯ùð;%I’$Išo(” e€¢Á9¯Ž~†TjøÉ?¿S’$I’¤ùf€@‰ Y(ê­<$¥¦‰~ŠTh²íÜð;%I’$Išo(” e€¢]Í~ø­è§@…šß~£$I’$IóÍ€² P´«Éõ룟"•êôkáwJ’$I’4¿ P(1@ ËE»]òöè§@¥†Þ~§$I’$IóË€² P´«þé‡G?E*5¹î¬ð;%I’$Iš_(” e€¢Ý-˜Ò¸ý¨Ðì‡ßŠ¿S’$I’¤¹e€@‰ Y(úi³»®Ž~ŽTª·ê9áwJ’$I’4Ÿ P(1@ ËE?m¼uMôs Rà ß~§$I’$IóÉ€² PôÓ†½9ú9P©ñ5 ¿S’$I’¤ùd€@‰ Y(úiý“Ÿý¨ÔìÞÂï”$I’$i> Pb€@–Š~¶fqgô“ FM“z'<+üNI’$I’ö}(” e€¢Ÿmz³B* IDATë¦è' @¥çÿQø’$I’$íû P(1@ ËE?Ûhóòè' @¥Æ_>9üNI’$I’ö}(” e€¢ŸmpΫ£Ÿ$•šÝóµð;%I’$IÚ÷ Pb€@–Š~¶ÞÊCRjšèg @fÓÝw"úVI’$I’öm(” e€¢Ÿovß­ÑÏ€J ÎýÃð;%I’$IÚ· Pb€@–Š~¾É¶s£Ÿ%•_¹*üNI’$IR©Þ ÏJ½÷þjø޶f€@‰ Y(úùF—¼=úYP©Ù][Ãï”$I’$ý:ö)i°öˆ4Úttšl[—f;·ïþŠéÑeÿ5þ?[K3@ Ä€,ý|ýÓ~–Ôj:Þýw£o•$I’¤%ÚòýSÿ”ÃÒpÃQi¼uMšîØ’Òt”ýÛ—ñå+âÿó¶4J PÈ2@Ñÿ¯…'¦4D?M*58ûâo•$I’¤%QoõsÓðÂ?Nã«V{øï]ÆWþŸ¿­ Pb€@–ŠrÍîº:úiP©ñ—V†ß)I’$IÝ«·òà=_¥sé»Òôæ©YÜùøþÞå+§†ÿwjk(” e€¢\»þSÈ™~çËáwJ’$IRË[80õO{Im::M¶­K³ÛSjš½ú÷.“¯}$þ¿gK3@ Ä€,å^ô¦è§ @­f“Ô[qPø­’$I’Ô’–ïŸú§–†ŽÚý/=íþ*ÉpŸÿ­ËäçÅÿwoi(” e€¢\ý“Ÿý4¨ØàœW‡ß*I’$IuÖ[uh¬?26/ìù*þ!ß2½ñá-Úš %(d èáz¼ß³ @w¯8!üNI’$IН·âii°öˆ=_¥sÃE©yèÞT‹é­Ÿ ÿëÓÖ P(1@ ËE×ôÖMÑÏ€J;û•ð;%I’$iÎ-¸ç«t.~kšl[—f;·§Ô4©VÓ;.ÿkÖÒ P(1@ ËE×hóòèç @­f“Ýÿ¦cô­’$I’´Z¾ÿž±É†£Òxëš4ݱ%¥É0µÉ쮫ãÿ:¶4J PÈ2@ÑÃ58çÕÑÏ€Š Ö½&üVI’$IÚ;õVšëL£Í izóÆÔôHm7ûþõá]Ûš %(d èáê­<¤ê?F€Xã+W…ß*I’$I¾]šá`íi´éè4¹á¢Ô<ôýÔE³ûn ÿkÝÖ P(1@ ËE¿¨Ù}·F?Q*5»û«áwJ’$IR¡…÷|•ÎÅoM“mëÒlçö”šYZ š'þ¯K3@ Ä€,ý¢&ÛÎ~¢Ôj6Ýý§eEß*I’$Iÿo½ÕÏKà G¥ñÖ5iºcKJ“AZªšÅáÿ{´5J PÈ2@Ñ/jtÉÛ£Ÿ(ÛõñÑ·J’$IZªõVºû3ùhóBšÞ¼15ýû£ÿ¡*ÍðÁðÿÚš %(d èÕ?ýðè' @ÅÆW~«$I’¤¥PoÅAi°öˆ4Útôî¯Òi¸#úoê7›„ÿïÖÖ P(1@ ËE¿°…S÷£Ÿ)•šÝóµø[%I’$u­å¤þ)‡íþ*ɵg¦ÙÎí)5³èÿ­´ë¯eøÿž-Ì€² PTjv×ÕÑÏ€Z5³Ô;îéá·J’$IjûWé ?ö†4Þº&MwlIi2ˆþ¤ß½cŸþ¿o3@ Ä€,•Úõ?àá Î{mø­’$I’ÚRï½ÿ8 Îÿ£4¾â„4½}sj†?‰þHßi½ãý³ÏÇ’ %(d ¨Ôð¢7E?S*6þòÉá·J’$Iª±ÞŠƒÒ`íi´éè4Ù¶.5Üýñ}Ééð+áï  Pb€@–ŠJõV?/ú™P±Ù÷¶…ß*I’$)¼å¤þ)‡¥á†£ÒäÚ3ÓlçöÝ_YI¬Þ‰ÏŽ-Ì€² PTlÙ~©éÝýT¨U3óÇZK’$iiµl¿ÔÿÀo¿òÁ4ûîWRš £?™“Ñ{ï¯Æ¿—f€@‰ Y(z$MoÝýT¨Øð‚ׇß*I’$i_Õ[uh¬?26/¤éÍSÓûaôGp¡ÞI¿þ~Ú˜ %(d è‘4Ú¼<ú©P±ñ5§…ß*I’$ioÔ;ö©i°öˆ4Úttšl[·ç«th­]_-ý¦Ú˜ %(d è‘48çÕÑO€ŠÍî»5üVI’$Iºå¤þ)‡íù*­kÒìžëvÅ$ÝÑÿ ãßY 3@ Ä€,=’z+I©i¢Ÿ+óG[K’$©-_¥3¾òÄ4ݱ%¥q?úc4ûXÿ¿þîÚ˜ %(d è‘¶ëßn€‡3üøÿ~«$I’¤Ÿý—ig¿26/¤éÍSÓ»/ú#3ú§ü‹ð·ØÆ P(1@ ËE´É¶s£Ÿ+Ûu'¢o•$I’–f½cŸškH£MG§É¶ui¶s{ôÇc*Ñ?õÅáï³ Pb€@–Ši£KÞý\¨Xóà=á·J’$IK å¤þ)‡¥á†£Òxëš4»çº”fÓèÃTªÿ¡ÿf[˜ %(d è‘Ö?ýðèç @å|¿º$I’öv½U‡¦Áú#ÓøÊÓtÇ–”ƽ轴Hÿô—†¿á6f€@‰ Y(zÄ-˜Ò¸ýd¨Øè’¿Ž¿W’$Ijm½•‡¤ÁÙ¯L£Í izóÆÔ,þ ú#.-×?ãß„¿ë6f€@‰ Y(z4Íîº:úÉP±éŸ¿U’$IjIÇ>% Ö‘F›ŽN“mëÒlçö”š&ú#-Ó_û;ño½… Pb€@–ŠM»¾[N3øQZ\¾ø½’$IRe-ß?õO9, 7µûŸ-ìþ*é(úã+KÀàÃ/ÿ-Ì€² Pôh^ô¦è' @å|Ǻ$I’z«MƒõGîù*Û.KiÜ‹þ˜Ê5øÈ¿ ÿyhc(” e€¢GSoõó¢Ÿ,•]ú®ð{%I’¤ùÕ[yðž¯Ò¹ô]izóÆÔ,îŒþH ÿÝàìW†ÿŒ´1J PÈ2@Ñ£Í?Hà™Þöùð[%I’¤}Ô©ÚKÒhÓÑi²m]šíÜžRÓD…‡58çÕñ?7-Ì€² Pôh›Þòéèg @ÍÆý´xÌ“Ãï•$I’gËHýSÿe^üirÝYiöýo¤4›DÚ„Ge°î5ñ?K-Ì€² Pôhm^ýl¨œïY—$Ij_½ÕÏMà ߘÆW­NÓ[R-F¬„ÇmpΫ¶ژ %(d èѶëoÜà_¾"ü^I’$éáë­<8 Ö‘F—¾+MoÞèëvé¬ÁG_þóÖÆ P(1@ ËE¶ÞÊCRjfÑO€ŠÍîº:ü^I’$é¿õž_Þ36ùÌߦÉ7/HÍ·G\„¹ñ§3>¶ P(1@ ËE¥ÙΣŸ.5›MSï¸g„ß+I’¤%×òýSÿ”ÃÒpÃQi¼uÍž¯Ò™ £?B˜Á‡_ÿsÙ P(1@ ËE¥ÉuŽ~ºTnxÁëÃï•$IR×ë­:4 Ö™F›ö|•NÿèP•]úOôÏi3@ Ä€,=–†Ÿüóè§ @å&_=#ü^I’$u©ÞЧíù*MG§É ¥æ¡{£?òAõúgþvøÏn3@ Ä€,=–ú|QôÓ rÍî ¿W’$I­máÀ=_¥sñ[ÓdÛº4Û¹=¥¦‰þˆ­Ó?ãeñ?Ï-Ì€² Pô˜Zö„Ô ~ý|¨\ÿäÄß,I’¤Ú[¾ÿž±É†£Òxëš4ݱ%¥É0ú£tBÿ´—ÄÿŒ·0J PÈ2@ÑcmzÛeÑÏ€Ê6¾-ü^I’$ÕVoÕ¡i°þÈ4Ú¼¦7oLMÿèmÐYýýëðŸù6f€@‰ Y(z¬/?6úùP¹éMŸ ¿W’$I‘õV<- Ö‘F›ŽN“.JÍCßþˆKJÿÔ‡ÿhc(” e€¢ÇÚàÜ?Œ~¾T®>˜ ¿Y’$IsiáÀ=_¥sñ[ÓdÛº4Û¹=¥fý‘ –´þ_ÿ»¡… Pb€@–Šk½ãž‘RÓD?a*78ëwÃo–$IÒ¾¨·úyi¸á¨4Þº&MwlIi2ˆþèüœþþyøïŠ6f€@‰ Y(z<Íî»5ú P¹ñß~¯$I’o½U‡¦Áú#ÓhóBšÞ¼15ýû£?f@ͯ‡ÿþhc(” e€¢ÇÓ®?R~‘Ù]W‡ß+I’¤GSoÅAi°öˆ4Útôî¿ïm¸#ú#ðõO~Aøï”6f€@‰ Y(z<6þUô v³éî¯m‹¾Y’$IÙ–ú§¶û«t&מ™f;·§ÔÌ¢?A{IoõsãÏ´0J PÈ2@Ñã©ÿ¡ý„h᯿Y’$I?ý*áÇÞÆ[פéŽ-)MÑ•€}¨÷¾þ{§ Pb€@–ŠWË÷OÍè¡èg @å&_=#þfI’¤%96¬?26/¤éÍSÓûaôÇ"`ÎzïýÕðßEmÌ€² Pôx›Þqyô3 rÍî ¿W’$©ÛõVœ}E}þÝizÓ'S󓻣?èøìðßOmÌ€² Pôx_qBô3 úïaøÍ’$Iiù©Êai¸á¨4¹öÌ4Û¹=¥fýq¨Ð®qZøï¬f€@‰ Y(z¼ Î{mô3 F—üuøÍ’$I-lÙ~©¿æ7vMÆ_ù`š}÷+)M†Ñm€–X<æIñ¿ÇZ˜ %(d èñÖ;áYÑÏ€˜ÞrIøÍ’$Iõ×[uh¬?26/¤éÍSÓ»/úc ÐVÍ,üwZ[3@ Ä€,íšn~ÊÔn´˜yrøÍ’$IõÔ;ö©i°öˆ4Úttšl[·ç«tö–q/ü÷\[3@ Ä€,í&ß8/ú)Ѓ³ÿ üfI’¤ –ú§¶ç«t¶®I³{®Ûý§ì+Mÿþøß}-Í€² P´7}úo¢Ÿ2-0¾juøÍ’$Ióý*ñ•'¦éŽ-)ûÑE€%¦yðžðß…mÍ€² P´7êŸ~xôS f?¸)üfI’¤½_oå!ipö+ÓhóBšÞ¼15½û¢?v¤Ùý·…ÿ~lk(” e€¢½Ò»¿WJz«Ÿ·$IÒc®wìSÓ`íi´éè4Ù¶.Ívnþxµë÷Sôï̶f€@‰ Y(Ú[íþ#• `ø©¿ ¿Y’$é¶ü€Ô?å°4ÜpTo]“f÷\—ÒlýqàÙõ;+ü÷hK3@ Ä€,í­Æ[ÞýœhéM‡ß,I’”¯·êÐ4Xd_yâžÉÀŸt ´Ø®ßcÑ¿WÛš %(d ho5¼àõÑÏ€6-¦Åcž~·$IZêõV’g¿26/¤éÍS³øƒèO {Õô¶ËÂ×¶5J PÈ2@ÑÞª·ê9ÑÏ€–|ô÷Ãï–$IKªcŸ’kH£MG§É¶ui¶s{JMý‘`ŸšÞrIüïß–f€@‰ Y(Ú›5?¾+úIÐã-ï ¿Y’$u¶åû§þ)‡¥á†£Òxëš=_¥3EŸ€¹›ÜpQüïä–f€@‰ Y(Ú›Mn¸0úIг{o¿Y’$u¥ÞªCÓ`ý‘{¾Jç¶ËR÷¢O=@&ÛÎ ÿÝÖ P(1@ ËE{³Ñgþ6úIн÷ýÓð»%IRÛê­úŠð»%IÒ¾®·òà4X{D]ú®4½ycjº7ú, £Mï¿mÍ€² P´·œ÷¿D?kZbüå“Ãï–$I{µ…Sÿ´—¤Ñ¦£ÓdÛº4Û¹=¥¦‰>¹KÒðãZš %(d ho×;þ™þ+ÈìþÛÂï–$I¹åû§þ)‡¥á†£Òxëš4ݱ%¥É0ú¼ðß Ï]ü­hi(” e€¢}Ñì‡ßŠ~Ú´DÍo„ß-I’I½U‡¦Áú#Óhóž¯Òé?}Føg¿2üv´5J PÈ2@Ѿhòõs¢Ÿ6-1úì;Ãï–$I?_oÅÓÒ`í{¾J熋RóнÑ'€G©úáá÷¤­ Pb€@–ŠöEËÿ"úiÐÓ;¾~·$IK¼…÷|•ÎÅoM“mëÒlçv_+ Ðþ´ÅÇž %(d h_´ëÞÀ#2›¤ÞÊCÂo—$iéÔ[ý¼4ÜpTo]“¦;¶¤4F_Cö]_}sÚš %(d hŸ´l¿Ôôï~Þ´ÄðÂ7Æß.IRçë¿ÿ…©>}ö˜“ÅcŸ~{Úš %(d h_5½åÓÑÏ€–˜\¿>ünI’ºß`íÑ'€y™Mvÿ RÑ·§­ Pb€@–ŠöU£Ï¿;úyлþÔ¬Åå„ß.IR·¬ÿŸ£Oóü{Œ nO[3@ Ä€,í«~yôó Egýnøí’$u»á?üoÑç€9i~tgøÝis(” e€¢}Ö{~)¥é(ú‰Ðã+Nˆ¿]’¤N7ºäíÑç€9™}ÿáw§Í Pb€@–Šöe³ï~%ú‰Ð³{o¿[’¤n7úÂßEŸ;ædºãÊð»Óæ P(1@ ËEû²ñU«£Ÿ8-Ò[ýÜðÛ%Iênã-ï‹>uÌÉô–O‡ß6g€@‰ Y(Ú— Ï]ô Ev}5Bôí’$u·ÉugEŸ:ædòóÃïN›3@ Ä€,íËz'>;ú‰Ð"ÓÛ. ¿]’¤îæÿLX:&_=#üî´97€² P´¯›Ý[ô3 -¦ãÔ[yHøí’$u³é—G_:æd|Å áw§Í Pb€@–Šöu“mçF?sZdø~»$IÝlöƒ›¢Ïs2úì ¿;m΀² P´¯~ê/£Ÿ9-2¹á¢ðÛ%IêfMï¾è3Àœ 7¼%üî´9J PÈ2@Ѿ®ÿÁE?sZ¤=”yrøý’$u¬åû§4›FŸ9ædpîÆßžg€@‰ Y(Úç-Û/5ýû£Ÿ:-âK’öv½~%ú¼0Gý3^~{Úœ %(d hMoýLôS E&מ~»$IݪÊ¿ˆ>oÌQoõsÃoO›3@ Ä€,Í£Ñeÿ5ú©Ð"ÍC÷¦ÅeO¿_’¤î4øÈïEŸ7樷â ðÛÓæ P(1@ ËEóÈ?ìàÑêŸùÛá÷K’Ô†{Côi`^&Ãð»Óö P(1@ ËEsé=¿”ÒtýÜh‘ñ•'Æß/IRg}úo¢OsÒüäîð»Óö P(1@ ËEójv÷W£Ÿ;-2ûá·Âo—$©;í6°4̾·-üî´=J PÈ2@ѼùýÑÏ€–éà7Ãï—$©M¶}Ö˜“ém—…ß¶g€@‰ Y(šWà þ}ôs eF—¾+ü~I’ºÑôöÍÑg €9™|ó‚ð»Óö P(1@ ËEóª·ê9ÑÏ€–™Ýuuøý’$u£ÙnŽ>kÌÉø+§†ß¶g€@‰ Y(šgÍwD?yÚ¤iRï}ÿ$ü~I’Ú_3|0úª0'£Í áw§í Pb€@–ŠæÙäú¿~ò´ÌhÓÑá÷K’Ôîz+ž}Θ£Ñ%~{Úž %(d hž6þUô“ e¦w^~¿$Ií®ÿ}Θ£á…o ¿=mÏ€² P4Ïú§¾8úÉÐ6Í,õN|vø “$µ·ÁÙ¯Œ¾fÌÑ࣯¿=mÏ€² P4×–=!5ýû£Ÿ=-³ëOÐ ¿a’¤Ö6üäŸGŸ2æ¨ÿÁÿ!üö´=J PÈ2@Ѽ›Þü©èg@ËLoÿBøý’$µ·ñ—Ž‹>eÌQ︧‡ßž¶g€@‰ Y(šw£Ï¾3úÙÐ6³iêð¬ð&Ijg“oœ}ɘ—q?üît!J PÈ2@ѼëŸþÒèg@ /þ‹ð&Ijg³»¶FŸ1ædvÿmáw§  Pb€@–ŠæÞòýS3øqôÓ e¦ßþ\ü “$µ²æ¡ïGŸ1ædºãÊð»Ó… P(1@ ËEM¿õÙè§@ÛLÇ©wÜ3Âo˜$©eó䔚&úŠ0'“o^{: %(d (¢Ñçßýôh¡áÇÿ4ü†I’ÚUÿ¿}¾˜£ñU«ÃoO2@ Ä€,EÔ_û;ÑO€šÞrIø “$µ«Áº×DŸ/æhô¹ÿ~{º %(d (¤…'¦4îE?Úf2L½•Çß1IRkm::úz0GËÞ~{º %(d (ªé훣Ÿ?-4Üð–ð&IjOãkN‹>]ÌÑàÃ/¿=]È€² PÕhóBôó …¦·~&ü†I’Ú“á;ÀÒÒ?ùá·§  Pb€@–Š¢|ä÷¢Ÿ?m4›¤Þ Ï ¿c’¤vÔWÌÑøŠãÃoOW2@ Ä€,E7ûî5Ñ?´QÓ¤Þêç†ß1IR½5Ü}­˜£á§þCøíéJ(” e€¢èÆ[Þýc@K>ÿ_Âï˜$©Îz+Ú=V`éœóêðûÓ• P(1@ ËEÑ Öýc@K;·-üŽI’ꬿöw¢ÏsÖ_óëá÷§+ Pb€@–Š¢ë­<8¥Ù4úG€–êŸrXø-“$Õ×®¯a` iš´xÌ“ÃïOW2@ Ä€,ÕÐì{_þQ ¥Æ—~Ç$Iõ5¾æCÑ' €9j¼'üöt)J PÈ2@Q ·®‰þQ ¥šÝ™—í~Ë$Iu5ýÎUÑ' €9Úõ{?úöt)J PÈ2@Q Ï]ô-6X{Dø-“$UÔ²ýR3üIôy`Ž&×ÿ}üýéP(” e€¢êÿÌÝßÕ ÅäÚ3Ão™$©žú'¿ ú40gã/­ ¿?]Ê€² PTK³7Fÿ8ÐRMÿ´xÌ“Âo™$©Ž†ÿð'ѧ €9~òÿ ¿?]Ê€² PTKãkN‹þq Å†¼>ü–I’êh¼uMôY`ÎýýðûÓ¥ P(1@ ËEµ4¼ð£h±éM‡ß2IRÍîÚ}–˜³Þêç…ߟ.e€@‰ Y(ª¥ÞªC£h³é8õŽfø=“$·p`Jã~ôU`žfÓÝ¿ÿÃoP‡2@ Ä€,ÕÔìþoGÿHÐb£o ¿e’¤Øú§¿4ú0gÍv„ߟ®e€@‰ Y(ª©ÉuŽþ‘ Åfw]~Ë$I±í#°´Lï¸<üþt-J PÈ2@QM 7¼%úG€–ë¯ùð{&IŠkòõ³£Os¶ëwôýéZ(” e€¢šêôkÑ?´ÜøòcÃï™$)®ÙnŽ>EÌÙhóBøýéZ(” e€¢Új¸=úÇ€k~ü´¸ì á÷L’4ÿz'<¢tb IDAT+¥¦‰>EÌÙpÃQá7¨k Pb€@–ŠjkrÝYÑ?´ÜàœW…ß3IÒü^ðï£Oúg¼,üu-J PÈ2@Qm /zsô-7ùæÇÂï™$iþ·~ ú ·òðÔµ P(1@ ËEµÕ;ñùc³x|¦£Ô;þ™á7M’4ßfßÛ}˜³æ¡{ÃïO3@ Ä€,ÕØlçÑ?´ÜèÓ~Ï$Ió«·òà”fÓèóÀœMï¼"üu1J PÈ2@Q¿òÁè Znvï7Ãï™$i~ Ö}z0¹vmø êb(” e€¢žÿºè : Úo…ß4IÒ|_¹*úì`ôÙw†ß .f€@‰ Y(ª±ÞqÏH©™EÿxÐrãk>~Ó$Ióiv÷W£Ïvý XÑ7¨‹ Pb€@–ŠjmvÏ×¢<h¹fðã´øž_¿i’¤}[ïøg°,Qý“_~‡º˜ %(d ¨ÖÆ[Þýã@ /zsøM“$íÛvý®` šŽÒâòÂïP3@ Ä€,ÕÚ`Ýk¢<è€é_ ¿i’¤}ÛdÛºès@€Ùn ¿A]Í€² Pþöî;ú³º¾ó¸3EŒ‰%Å41Kq-‰kÌjšÆM9‰›¬)žh¢›Ä]ýÍÀ4:Ò¤W) J‘*¥#½ƒÌ0ßû­÷ÞÏžù™Aîp§ü¾¿÷ýÞïãqÎó¯=Ç=»ð¹Ÿ¹—×ü~ÏQCË–¼ ¥|}Dhî¯ ¿×$IcjfA*Ÿz(úª @~Ëéñ÷PK3@ Ž • PÔäò{/>"´Àðò}Ãï4IÒxê~ö¿D_3^¼[ø=ÔÖ P¨c€@%5¹áEK£-PöžL]Ÿ~¯I’æ¾Áùÿ'úš Hÿ´¿ ¿‡Úš u P¨d€¢&×;úíÑG€–ðqZ’ÚY~÷×£¯‚tûð{¨­ PÇ€J(jt»&´ÄèšÃÂï5IÒÜ•ßrzôÕ@ü®¯…ßCm΀:(T2@QÓëüºèc@K”ƒµ)[öÂð»M’4íºMJƒNôÕ@áûÅßE-΀:(T2@Qã›Y8ûcU`. ÎúHüÝ&IÚìz'þ~ô•@ þ—þ:ü.js(Ô1@ ’Š&¡Ñ'GZ¢xôæÔ™Y~·I’6¯ÑõÇD_)êúÆð»¨Í PÇ€J(š„ú_ú›è£@‹ôŽygøÝ&IÚŒm™Êì±èë€(e‘:K¶¿Zœ u P¨d€¢I(ÛûÑG€Éo;+ün“$mz½£ß}•¨øÞwÂg€@* hRZ÷qæDY¦î~?~·I’6­Ñ5‡Eß$ÝüÅð»¨í PÇ€J(š”†W}\h‘á7¿Û$I›Ðâ­S™}/ú ÐàÂÅñ÷QË3@ Ž • P4)õNúƒèã@‹”ý§R¶ì…á÷›$iãò^Àº» ú>j{(Ô1@ ’Š&¥lÙ)£è#@‹ ÎùçðûM’´q­ûµ L·î¾?~µ=ê PÉE“Tqß7¢ -R>ywê,Ú"ü~“$mXÙÒíSv£¯" :©3³0üNj{(Ô1@ ’Š&©áEK¢ -Ó;ñ}á÷›$iÃêéo¢¯ ‚­ûËIÑ÷Ñ4d€@* h’êñ–è#@Ëäw]~¿I’6¬uÏl¦ÛèÚ#Âï£iÈ€:(T2@ÑDµx«TöŸŠ>6´L÷7Äßq’¤g-Ûëå)•Eô•@°ÁÙÿ~'MC(Ô1@ ’Š&­ü¶³£ -³îãjôý&Izö†_Û5úº zG¾5üNš† P¨c€@%MZƒ•>6´M‘§îg~6üŽ“$­§E[¦rÍÑ· -ß)þ^š‚ P¨c€@%MZÝý~>úØÐB£« ¿ã$IÕõN|_ô5@”OÜ~'MK(Ô1@ ’Š&±ò‰;£m3ê§l—„ßq’¤g–¯:'ú– F7~'MK(Ô1@ ’Š&±ÑÕ‡DZhxñŠð;N’ôô²½^>û«Ò`pÞ¿†ßKÓ’ u P¨d€¢I¬wâïGZ¨ì¯IÙ²†ßs’¤4üú²è뀆èõ¶ð{iZ2@ Ž • P4‰eK·K)DZhpî'Âï9IÒ¿·hËT>õ`ôÕ@”eÊ–í7MI(Ô1@ ’Š&µü®‹¢-T®y uvy^ø='IzNêŸò'Ñ× Q<¶*ü^š¦ P¨c€@%Mjƒó?}|h©ÁY ¿ç$IÏIÅýWF_ 4Äè›Ç‡ßKÓ” u P¨d€¢I­ûÙ_‰>>´T¹ú¾ÔÙå¹áw$Ms½#ß}Ð ƒ• ¿›¦)ê PÉEÛÌ¿€±éŸñwñw$Mqù­gF_4Hïð7‡ßMÓ” u P¨d€¢Intý1ÑG€6ÿ”Å[‡ßu’4u÷û¹”Ê"ú* )ŠB´XÿË¿ë$i]sXô@ƒÜ~7M[(Ô1@ ’Š&¹lùN³ Æ¡\}¯Ÿ‚"Ió\¶ÛÎ) »ÑW 2ºî¨ðûiÚ2@ Ž • P4é÷}#úÐbý/ýMø]'IÓÔð¢%Ñ~fpæ?„ßOÓ– u P¨d€¢Ioøµ]¢-V>ywêìòÜðûN’¦¡lùŽ©ì­Ž~ôÐ0ÝCß~GM[(Ô1@ ’Š&½îa¿}Œh¹Áʆßw’4 /ZýÈ iòAx@(Ô1@ ’Š&¾E[¤2û^ôQ ÅÊΣ)[º]ü'I-.[¾S*ûk¢ù4LñàµáwÔ4f€@* ¨ ¾ubôQ å.¿ï$©Í ¿¾<úQ@ ¯Ø?üŽšÆ P¨c€@%µ¡þ©}”h¹r°6e»í~çIRËVüH*ûOE?êh þÉ¿§¦1ê PÉEm([¾cJÅ(ú8ÐrÃË÷ ¿ó$© /^ýˆ ¡²=_~OMc(Ô1@ ’ŠÚR~Ï%ÑÇ €¶õS¶×ËÃï}¤˜ýÏÿqø½'I“\ïè·G?Êh°²¿&um~_Mk(Ô1@ ’ŠÚTïs¿}¤˜åw¥Î.Ï ¿û$i"›Y˜Š¯‹~”Ð`ùªsâï«)΀:(T2@Q«Úu›”†Yô±`J ÎÿdüÝ'IXÿËÿ+ú@à .øTø}5Í PÇ€J(j[ùmgE+¦èÇ‚g»¿8üI*[º]*×>ý ázG½-üΚæ P¨c€@%µ­Á™}¬˜"£k ¿û$i’^þ™èG7M—SgɶáwÖ4g€@* ¨me{½,¥²Œ>ZL‹²LÝÃß~ÿIÒ$Ô=èµ)£è'7 WÜUø5í PÇ€J(jcÅ#7F-¦HñÈM©³x«ðûO’ÝÌÂTÜeô#€ 0¼|ßø{kÊ3@ Ž • PÔÆ†¯ˆ>ZL™Á9ÿ~ÿIR“¬üXô£€ Ñÿü…ß[Óž u P¨d€¢6Ö;üÍÑG €)SöŸJÙž/ ¿%©‰­{>®{N@­²LÙî/¿»¦=ê PÉE­lfa*×>}¼˜2ë>҆ߒÔÀò[N~D0!ÖýZåè{K(Ô3@ ’ŠÚÚ躣¢S¨wÜ»Ãï@IjR½ßýh`‚ ¯Ø/üî’ õ P¨d€¢¶Ö;á½ÑÇ €)T>yOÊ–n~JRÊV¼ÈO&`£¬ûž}É€z(T2@QkÛu›”è#À^upü=(I ȼ`£yÊ–í~É@=* ¨Íåßþrô`•eêóÛá÷ $EÖÿÒ_G?˜0ÅýW†ß_ú~(Ô1@ ’ŠÚ\ÿôE1¦TùäÝ)[ò‚ð»P’"Êöù©Tö×D?Š˜0ËW„ßaú~(Ô1@ ’ŠÚ\¶âGR*FÑÇ €)5¼bÿð»P’æ½™…)¿ûëÑ`&Pï˜wÆßcšÍ€:(T2@QÛËï¹$ú˜0­Ê"õŽøÍð»P’æ³ÁùŸŒ~ú0‰FýÔÙu›ð{LßÏ€:(T2@QÛœû‰ècÀ+Ÿ¸+eK·¿%i>êò†”òAô£€ ”ßuQø=¦d€@* ¨íu÷ý™ècÀ”Ýp\ø}(Iã.[¾ãìè6Åà«3áw™~ u P¨d€¢i¨xô–è£À”ëŸú?ÂïCI[3 S¾êœèG-¬{ø›âï3ýG(Ô1@ ’Ц¡áÅ+¢S®ì­NÙÞ¯¿%i .\ý˜`‚•ƒµ©³x«ðûL?È€:(T2@Ñ4Ô=ô×¢¤üžKRgÑá÷¢$Íe½£ß‘R‘G?b˜`ùª•á÷™žž u P¨d€¢©hfa*Ÿz(ú¸€ßm/©Ue{½<•ÙcÑV&ÜàÜO„ßizz(Ô1@ ’Ц¥ÑÕ‡F7˜ý)ë~Z@ô½(I›Ý.ÏMÅýWF?UhîA¯¿×ô´ P¨c€@%MK½ãÞ}Ü`VÙy4e{üxøÝ(I›ÜÌ‚4ºásÑSZ \óÀì½~·éi PÇ€J(ššo•ÊîÑGf÷}cön ¿%i\¸8ú1 @KŒ®="ü^Ó33@ Ž • P4Mù[š4ÉðÒ=ÃïFIÚØú§üIJeý %ú'ýaøÝ¦gf€@* hšêø¾è#?P–>¸Kš¨zG¼%¥Q?úé @[äÔ-Ý>ü~Ó33@ Ž • P4Uíò¼Tö×D;øa7u~]ü)I5eûüt*;ß~jÐ"ù]_ ¿ßT u P¨d€¢iktãÉÑÇž¦|òž”í¶sø)Ië+[¾S*[ý¸ e_ù—ð;NÕ PÇ€J(š¶ú'¿?úØÀ3äw_œ:‹·¿'%é-Ù6å÷^ý˜ …ºþRü=§Ê P¨c€@%M]»>?¥A'úèÀ3Œ®;:þž”¤ÿÜâ­Sþs£´P¹ú¾ø{NëÍ€:(T2@Ñ4–ßrzôÑ€Jƒs?~OJÒl‹·Jù­gF?h©ÑÕ‡ÆßuZo(Ô1@ ’Ц±þþ,úè@µ²œ½§¢ïJISÞÌÂ4úÖIÑODZ¬wâûâï;­7ê PÉEÓX¶t»”F½èãÕòAêýöðûRÒ”6³ ®9,úI@›åƒÙo3áwžÖ› u P¨d€¢i-¿íìèãëUöV§î¯ ¿/%M_ÃK÷Š~Ðrù„ßwzö P¨c€@%MkýÓ?}üàY•OÜ•²=~<üΔ4%Í,0>`^ Îýxü½§gÍ€:(T2@Ñ´–-ÛaöG¾@“Þœ²þ¼&iÆ'WìýÈ`Jt÷ÿ…ø»OÏš u P¨d€¢i.¿ãüè#µŠ®NÙÒíÂïMI-mÑ–iô­£uL‰âñ;âï>Õf€@* hšëŸñ·ÑG6H~ï婳dÛð»SRËZ¼uÝrZô#€)2¼tÏøûOµ PÇ€J(šæ²Ý~4¥b} `ƒä·5û‹£ïOI-iɶ)¿ã‚èGS¦wø›ãï@Õf€@* hÚËo?/úÀËW­L]ž~Jšì²e;Ìþd%˜OåÚGRgfaø=¨ú P¨c€@%M{ýÓ?} `£äßþ’Ÿ„"i“Ëö~E*¹1úQÀ]}hø=¨ Ë€:(T2@Ñ´·îo¦Q?ú(ÀFñ“P$mJÝCߘʵG?˜R½c'ü.Ô†e€@* HÏIù­gDEØh~Ф©òûSv£]L©²·ÚŸ]'(ê PÉEzNêŸú§ÑG6I~ç…)[ò‚ð»TR³¬ühJeýÈ`оyBø}¨ Ï€:(T2@‘ž“:K¶MiЉ>ްIò{.IÙÒíãïSIÍkÑ–itõ!Ñ)HýÏÿQü½¨ ΀:(T2@‘¾ßè¦S£#l²â«S¶|§ðûTRsÊV¼(åw]ýx€Ù_ç§öMV(Ô1@ ’Šôýú'ýaôq€ÍRê PÉEúO-Þ*•Ù÷¢%̲Hƒsþ)þ~•4Öú§ýUJÃnô* ÎþÇð»RŸ u P¨d€"=½Ñ5‡GK˜SÃË÷M™…áw¬¤¹-[¾c}ë¤èG ¬_Y¤l¿3µñ PÇ€J(ÒÓëýŽèc sntËi©³ë6á÷¬¤¹©wÌo§rÍýÑxVù]_ ¿3µi PÇ€J(Òµh‹T®}8úhÀœËïþzÊVø³Ÿ4Ñ-Ù6®>$¥²Œ~¤@­þ—?wj“2@ Ž • P¤g¶îW@•«ïKÝCÞ~×JÚøº‡ýz*[ý€ “Ÿ'8ê PÉEzf݃5úhÀøŒz©úÿ ¿o%m`‹·Jƒ §TäÑOØ`ùmgÇß¡Úä P¨c€@%©ºâÑ›£'ŒÕðÌþ‡íè;WÒúëù[þ\ ÀDêáÏÃïQmz(Ô1@ ’ŠTÝàüOFO»üÞËR¶ÇKÂï]IO/[¾S]sXJeý˜€7ê¥léöá÷©6=ê PÉEª.Ûó'ü˜s¦BùÔƒ©{Øo„ß½’ž“:3 Rÿ‹‘Êì±èGl²ÑM§Æß©Ú¬ P¨c€@%iýåw^}D`~äƒ4øÊ¿¤ÎÌÂðûWšÖº¿.÷_ý4€ÍÖ?éÃïUm^(Ô1@ ’Š´þú§(úˆÀ¼*î»"u÷}eø,MSÙ²¦áûùé{´BÙ_“:»n~¿jó2@ Ž • P¤õ·î÷§a}L`^•ý§RÿË¿‡¥Ö·x«Ù³V®}$úØÀœ]Lü«Í΀:(T2@‘ž½Ñ'GS‘¯:'e{¼$ü.–Z×Ì‚Ô?ùý©xüöècs®wì»âïZmv(Ô1@ ’ŠôìõŽOô1€0eçÑÔ;ñ}á÷±Ô–º‡¿)å÷^}´`,ÊÎwSgÑ–á÷­6?ê PÉEªiÑ–³ÿñ ¦ýG©g+^/KZ÷À_Jùª•ÑGÆjxÕÁáw®æ&ê PÉEªoxÅþÑG•ÝÇSÿŒ¿M™…áw³4)eûüt]wtJE}„`ìzGüføÝ«¹É€:(T2@‘êëòúè£ Q¤OWvMýÓþÊßvÕÔ×;üÍ)_uNô‘€e‘²½^~kî2@ Ž • P¤ k݇“ª÷_™zG½-ü¾–æµ™©wìï¤üî¯GA•ß~^ü½¬9Í€:(T2@‘6¼üö¯DYh´üžKS„ßÙÒ8Ë–¼ õ¿üáT1ÐxÅ£·ÄßßK(Ô1@ ’Š´ñ^}t`¢­»Kû_ü‹Ùÿà}¯KÝ^•†—ìžÊµD ˜(ƒ¯üïð{\ãÉ€:(T2@‘6¾ÁY‰>ºÐ Åãw¤ÁʦήÏ¿ß5}¿b§ÿå§âÁë¢L¦b”²=^~§k< PÇ€J(ÒÆ—-ß1¥a7úø@k”ÙcixÑ’”íýŠð{^-œöW)_µrö?š›.¿í¬ð»]ãË€:(T2@‘6­Ñ·NŒ>¾Ð>e‘ò{.ýÉ%Û†ß÷šü²/šýuOù­g¦”¢ÿ €ÖèŸô‡á÷¼Æ— u P¨d€"mZ½£ß}| ÕÊÞ“ixÕÁ©{ÈëÃï}MVÙÞ?™ç~<å÷^6;jæVÙùnê,Þ:üÎ×ø2@ Ž • P¤Mlfa*Ÿ¼;úÀT(¹1 Îù§”íö£ñPóšYºýr\ð©Tqg]sXêñ/R¶çOÄÿùA)ÛmçÔ;þ÷Òð’ÝS~Ï¥)úÑÿš5_ýtøŸ!4? PÇ€J(Òæ7üú²è£ l¨²LÅÃßJÃ+ö›ýòÙî/ÿ³DÛË–n—zGüæì¯Ó]l*[ýo°±ò¡Ÿ,7E PÇ€J(Òæ—íýŠ”Š<ú8›ñãäG71 Îû×Ô;êm)[¶CøŸ/&µl¯—¥Þ±ïJƒ¯üK}ë¤TÎÀ*Ÿ¼'å·ž™†__žú' uxuêìòÜð?s4¢E[¤lŸŸN½cçû?ÕäšÃR~ïå©ì­ŽþÇŒIïè·ÇÿDó– u P¨d€"ÍM½ã/ú8ãVä©xüŽ”¯:' /Û'õÏø»Ô;î¿¥îþ¿:»îÏ+K¶MÙž/MÝ_“zǼ3õ¿ðçipÎ?§á%{¤ÑõǦü;ç¦âÑ›S9Xýÿ•@ƒ¬ûóBøwÍk(Ô1@ ’Š4w .øTô‘&A1JeçÑÙ¿M\æ¤{دÇOQx(Ô1@ ’Š4Þ|*ú˜Ô*¸:ü;Šš‘ u P¨d€"·lÅ‹Rõ¢:À³êŸüðï(jF(Ô1@ ’Š4þF×}ÔÖkݯî,Þ*üŠš‘ u P¨d€"¿îg%ú¨¬×à+ÿ;üû‰š“ u P¨d€"ÍOùÝGw€g(ûkR¶l‡ðo'jN(Ô1@ ’Š4?õ?ÿGÑÇà†__þÝDÍÊ€:(T2@‘æ©E[¤ò‰»¢<À ³”í¶süw5*ê PÉEš¿çýkô‘øÃ+öÿ^¢æe€@* HóW¶|Ç”ècR>LÙÞ¯ÿ^¢æe€@* HóÛèêC£=@]wTøw53ê PÉEšßº¼:¥²Œ>úÀ4+‹ÔÝïçÿ“¨™ PÇ€J(Òü—¯:'úèSltÓ©áßGÔÜ P¨c€@%iþëõ¶è£L±îÁ¯ ÿ>¢æf€@* H1÷_}ü€)´î'³FQ³3@ Ž • P¤˜ú' úøS¨wÄ[¿‹¨Ù PÇ€J(RP‹¶HÅã·G?€)RÜ÷øo"j|(Ô1@ ’Š×à¬D?€)ÒûÜï†Qó3@ Ž • P¤Àv}~*³Ç¢À(¼.ufÄQã3@ Ž • P¤Ø.Ž~ S wü{¿ƒh22@ Ž • P¤Ø²å;¥4èD? €+¸ÆO?Ñg€@* Hñ ¯<(úQ´Xï˜ßÿþ¡ÉÉ€:(T2@‘âËöù©”ŠQôãh¡üÞË¿}h²2@ Ž • P¤f4ºé”èÇÐB½£þkøwMV(Ô1@ ’ŠÔŒº‡¼>úq´L~ç…áß<4y PÇ€J(RsÊïúZô#h‘Þ‘¿þ½C“— u P¨d€"5§Þ±ïŠ~$-‘çÜðošÌ P¨c€@%©Y\ýXZ {诅çÐdf€@* HͪwÂ{£ À„Ëo=#ü‡&7ê PÉEjX3 RñàµÑ`R•eê~öWâ¿qhb3@ Ž • P¤æÕÿüG?€ µn<ýmC“ u P¨d€"5°™…©xô–èÇ0iŠqWôch¸²óÝ”-Ý>þ[†Z‘ u P¨d€"5»þý˜npÖG¿a¨= PÇ€J(Òü”'ï‰~T U>qgê,Þ:þ†Z“ u P¨d€"5¿ÁÙÿý¨ªÿù? ÿv¡ve€@* HÐ.ÏKåSF?.€†)î¿2ufÄ»P«2@ Ž • P¤ÉhpîÇ£@ÃôŽøÍðoj_(Ô1@ ’Š4A?eÍýÑ  !ò[Nÿ^¡Vf€@* H“Óà̈~dMPä©{À«Â¿U¨ PÇ€J(Òµx«T>qgôc6¼êàøïjm(Ô1@ ’Š4YõOûËèǨì¯IÙî/ÿF¡öf€@* HÖ¢-RñÝoG?:€ ƒs?ÿ}B­Î€:(T2@‘&¯þɈ~tŠï}'uvynø· µ;ê PÉEšÀf¤â¡ë£À<ë÷îøïj}(Ô1@ ’Š4™õŽÿ½èÇ0ò[Ïÿ¡éÈ€:(T2@‘&·â¾+¢!À|È©»ßÏ…‹Ðtd€@* H“[ïÈߊ~„ó`xñŠðïšž P¨c€@%i²Ëï¼0ú1ŒQ¹öá”-Ý>ü„¦'ê PÉEšìº‡¼!¥²Œ~”cÒÿŸ‡Ðte€@* H“_~ë™Ñ` Šû®H™áß4] PÇ€J(Òä×=èµ)•Eôã˜Ke‘º‡¼>ü»ƒ¦/ê PÉEjG£Ž‹~œshtÍááß4 PÇ€J(R;ÊözYJÃnô#˜eïÉ”í¶sø÷Mg(Ô1@ ’ŠÔž†¯ˆ~¤s Æß…gÐôf€@* Hí)[º]*×>ýX6CñÀÕ©3³0ü;ƒ¦7ê PÉEjWƒ³>ýX6U1JÝÏþ—ðï šî P¨c€@%©e-Ú2Þýh6ÁðÒ=ã¿-hê3@ Ž • P¤öÕ;ñ÷£-ÀF*Wß›²%/ÿ®  PÇ€J(R;Ëï¼0úñl„Þ ï ÿž ­Ë€:(T2@‘ÚY÷Ð7¦T–Ñ`Œnþbø·éÿg€@* Hímô­“¢1@²ÿTÊö|iøwéÿ—ûKÑÇ€†3@ ’ŠÔÞ²}~*¥Q?ú1<‹ÁÊ…Cþsùªs¢ g€@¥Îî?þB#i| /Ý+ú1¬Gñ൩³h‹ðïÒ.¿óÂè£@àP©³×+Â_h$¯l٩̾ý¨~XY¤î¡¿þí@úáò{/‹>4œ •²Ïü\ø ¤ñ68矢5À^±ø7©ªâ«£ g€@¥ì€W‡¿ÐHs‹¶LÅ#7F?n€W>ywÊ–nÿÍ@ª¨xüöè#@àP);ä á/4’Æ_ï˜wF?n€uÊ2õŽ~Gø·i}•ÝÇ£O g€@¥î±ï ¡‘4?n9-ú‘SoxÕÁáߤõ¶hËÙ‘<*õNý³ø—IóR¶×ËRt¢;0µÊ'ïñ«wÔè²ÝvŽ>&L*õÏþhøK¤ùkpáâèÇLï¯Þ9æ·Ã¿ HÏV÷€WEŸ&€ •_Û5ü¥FÒ<¶ë6©|â®èGLÑ5‡Åjê÷îè£À0@ ÒðšÃÃ_j$Ío½“þ úÑS¥\}_Ê–nþM@ªkpæßG&€ •F·ŸþR#iþË¿snôã¦Fï¸ÿþ-@Ú†—î}\˜(TÊ¿w{øK¤ù¯»ÿ/¦”£AÐz£kÿ mh£›N>2Lª©3³0üÅFÒü7¼lïè'´Z¹æþ”-{aø7iC+º>úØ0 PX¯Îž/ ±‘4ÿ­ûÝÓåÚ‡£AÐZ½ãÞþþ/mp‹¶LiÔ‹>6LÖ«{ÌoÇ¿ÜH ©Ú_F?‚ •F×þÞ/mLÝ^}l˜(¬WÿÜO„¿ÜH jfAÊï¹$ú1íûÕ;ËwŒï—6¢þ©ÿ#úè0! PX¯áõÇ…¿ÜHŠ«{ð¯¦TŒ¢EÐEžzG¼%ü}_ÚØ†¯ˆ>=LÖ+è›á/7’b^¶Oô£ZaÝÄ~Ï—6¥üÎ £Â€õ ÒÚÅ[‡¿àH lɶ©|òžè§L´âÁëRÇw6Mb‹¶LiЉ>BLžU÷°7Å¿äH ­wÜ»£E0¹F½Ô=ð—Âßï¥M©{è£OÄ€gÕÿÊ¿†¿äHŠotÓ©Ñ#˜Hƒ3ÿ!ü½^ÚÔç~<ú0A PxV£oŸþ’#)¾l—¤²÷dô# &J¾jeêÌ,¯—6µüÛ_Š>FLžU‘=žÖ~ÚK²¤ç¤Á™ýH€‰Qv¾›²Ý,ü}^Úäo•ÊÞêè£À1@ VvÐkã_v$Å7³0å÷^ýH€‰Ð;á½ñïòÒfÔ;êmÑÇ€ c€@­þyŸ Ù‘ÔŒºþRJù0ú±6ºúÐðwxis^ºgôQ` Pkt÷¥á/;’šÓðëË£KÐXÅc«RgɶáïïÒæVLÝÃ~#ü]𫆗ì}ª˜P(l°Ñ­g…¿üHj^£›¿ýx€0ƒ¯üKø»¹4g-Þ:•k‰>VL(6\>J=~<þ%HR£ÊV¼È‡ ¦R¾jeêÌ,7—æªþÉï>VL06Jÿ‚O…¿Ij^½ßýx€yU®¹ö/eD¿“KsY~ÇùÑG € f€ÀF)ž¸'­ý´¿Õ!é™nü|ô# æG1J½Ãßþ..ÍeÝ}_™RYDŸ.&˜ ­{ì»Â_†$5¯lŤríÃÑ(»Áyÿþ.Íu£«‰>ZL86Úè¶•á/C’šYï„ÿýˆ€±ÊW“:3 ÃßÁ¥¹,Ûm甆ÝèãÀ„3@`“dþrøK‘¤f6úæ Ñ(‹rÍý)[ñ¢ðwoi®^´$úxÐ(l’áuÇ„¿IjfÙòRùÔCÑ)˜[ù uSø{·4×eK^Êì±è@  °iòaêìùÒð—#IͬwüïE?¥`NõÏø»ð÷mi .øTôñ % PØdƒË>þr$©¹n8.ú1sbtÝÑáïÙÒ8Ê–íÊîÑG €–0@`Ó {~ Фõ–-{a*Wßý¤€ÍRb´ˆ ›exÕ!á/I’š[ïs¿›RYF?ª`“”ï¦l¯—‡¿_Kã(ÛmçTöŸŠ>f´ˆ ›'¦lŸŸY’Ô܆W}6úI¯ÈSïØß ¯–ÆÕèÚ#£O-c€Àf~ëóá/K’ܮۤâÑ›£U°Qç~"þZS݃_—RYD3ZÆ€9Ñ=â-á/M’š[÷€W§4ìF?ª`ƒŒnô®Ôâf¤üžK¢-d€ÀœÈ¸.­ýô‚ø—'Im°òcÑ*¨UnL)æM±æ¡ÔÙëåá/a’š[¶l‡T>qgôã €–)»§îg~6ü½WgÙÞ?™ÊµG7¦˜ ó*ä–ÔY¶CøË˜¤fÿM4êE?®h‹Q/õŽü­ð÷]iœeËwJÅw¿}Ú˜r(Ì»Ñ]§µ‹·)“ÔÜúgümô£ €6(‹Ô?ùýáï¹Ò8Ë–nŸŠû¯Š>m`€@Œá§¤µ3 Ã_Î$5·Ñ Ÿ‹~T0á+?þ~+µ%Û¦üžK£Ì2@ ÌðúãÒÚO/ˆI“ÔÌvÝ&Ýý¨`B /Ý3þÝVg‹·Nùªs¢üB ¯=*­~Q“ÔØºŸùÙTö×D?ª˜0£?Ÿ:~ú®Úþ“On?/ú¨ÀÓ npùgŒP$­·þɈ~L0Aò;/œýÉÑï³Ò¸Ê–û¾}Ôà Ph„Ñ5‡ùu<’ÖÛðŠý£SL€â‘›R¶l‡ð÷Xi\e»¿Ø¯, ± PhŒá7OLkmþ'©-ÞÚßìàY•«ïMÙž?ÿ+©îþ¿ŠÇïˆ>j°^(4ÊèÛg¤µ»lþ2'©ye{½,•G£S4PÙ}"uxUø»«4®zG½mößsh2'¿ïªÔÙíÅá/u’šW÷ð7¥4êG?¦h’|zG¿#üUWýÓþjößsh:©xâî”íïo­Hzfý/ýMô# €¦(òÔÿü‡¿«JciñVixÅ~ѧ 6˜ UöV§î±ïŠѓԸ†ß8 ú@´²Lý/ÿ¯ðwTie{þDÊï½,ú”ÀF1@ ÙŠ"õ¿:“Ö~zAøKŸ¤µhË”ßùÕè'ç~"þýTC½£ßžÊµD1Øh(L„Ñm+SgÙŽá/’šS¶|§T<~{ô㠀Ë–„¿—JsÞâ­ÒàÂų¿Z &‘ £xâî”úëñ/‚’S÷€W§²ÿTôã €y4¼bÿð÷Qi®ëðªTZ0¦, 0éå¿íެûþ䃣¤ÄÍ›ű©¯$ÆXqäû¡?Ø'Ÿ;¥Ñ6ç’¨õ<ͳ‡S+Ph Eõº¢¼ðÚôƒ¤¤de‹gD³t2õÀ)ŽÿÙ[W'Ÿ7¥ÑV]ùðÐïZ™ZJ‘ Dmý¬(uLM>TJJSuÅZêë€Q*ú÷FöÎõÉçLi4UºgF¾o}êã…ZRÞ¿/*Ÿ>¥ 0dJºøÕ>6¢ÙL}0BÅ@_d‹nL>_J#­²üÞÈ÷®ó|€¶b€–Vß•OžH>pJºøÕ¿~=õÀ"[tSò¹RIÕUE¾£ÅÚ’ÚB~tÇÐ"Š7¢HíÕàö婯†»|²xFòyRV—Emõ QœØú@RPh+ù龨­%JÓÓ¦’Æ¿ŽK#ÿyMê«€ ÐüãPdKoM?KJXeÙ1øÝ»Ñ,ÿžúøÀ„`€¶T”ú£¾yA”ßœ|P•4ÎÍ¿"Šc;R_;ü‡æ™ƒ‘-ñœF¿ìí뢶öå(ŽnK}l`±€@{+Šhüº%ªk^ŠRçåÉXIã÷p¨èK}ãð/šg{ó‰&tÙÂk¢öÕó‘ï]‘¦>20aY@€¿åÓÑØùaT>~4Js¦$l%m•îˆfe õUÀ??»³ä–ä3£ô·æL‰J÷̨oz3òC["ŠF꣓‚8Ï'z·wGeÕãÞŒ"µPÕŠhTS_1xó‰&RS£²ü¾¨o˜==Ñ,÷§>0)Y@€ÿS¯Dcÿƨmx5²ew¥ˆ%ªZÏ3Í"õÍÐÖšgD¶ô¶ä3¢Ú°yÓ‡–Mj«_ŒÁ­K#?¸9¢^N}$ %X@€a*ʧ¢ñóÚ¨õÎŽÊŠ£Ô9=ýà,iXÕ{_K}•´­æ¹£Qyÿö䳡Z°¹Ó"{tÝÕ•Dí‹ç¢¾éhì\ùo¢è‹È}NÆ‹­"üÔþüé˨}ÛÕÏžŠ¬ëž(/¸*ýÐ-é¼ nëJ}{´íÛOŠã»¤Ñubw4ÏüÅÀ(J'£¨žKýÓ€hwïLãàºÀîQIEND®B`‚‰PNG  IHDRÐÚ•‡.7 pHYsèèµ{Rk IDATxœìÝy°¥u}çñC£²(A—’¸TbÌÄ ÑÉdÌâÄ)±2•Ä3“¤*©,3©0S™q&[¯tC7;´¬²¥„a³QDAÀeQ–FhVYʶ ŸçlÏyÎoêžRðÛtßÛ÷ÞßyÎy½ªÞÿø×sÎíçÜóûx9§•€ÑúÑÿ 0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€: è0 @À€¾—ê¦êþ«Rï†5©sÉGSyæ{R±öµ©XÚ’šÝ²%©Ûi¹o1€©Ðûâßç?Jjvk_;Ú&g6Ê™­rf³¬·?šûå­ñ è³P—[SµéêÔýÂ_§öÙïMÅêƒóßÒB´âå©úæ§rßrS¥wíÇòŸ%M^«m™Ý/üÍhÛœÙ8Ùsô—PwŸOÕýW¦îUÿ5•§ül*–í“ÿ¼´Ð­: ølîÛ`*õ6‘ÿ\(i²[¶Ïhëì^õßF¥žº;s¿ô5ú‹ÔÛ6§ÞWKísß—Š•ûåÿ--båêƒÓàÑs߆Ók8LÝ«þ<ûùPÒµr¿Ô>ï×SïæãS½ý‘ܯ‚cÇ€>úóÇSï–“Rû¬ã¯Ì5µ•Gšêïü¿Ü·#3#ú•–ýœ(i:ýuú—VŒþИiÐ{EêßqžÑ\šya<î°ToÙ”û®àêAê^ú_²Ÿ%MqË–Œ>;½׆”ªNšVS7 ž¾+u¯þ _*}¿öI?†Ï>žûÖàÅê*u/þHös£$kIÝG¤ú™o¥i3z]§ê¡ëRû“ÊÿM£Ú§¼= Ÿ{2÷ À® ú©ó©ßÊ~~”¤âûÍ|¢GµéªÑæ: &{@ï·Sÿö3SyÒÛ²ÿÃ’Æ­ö©‡§a±%÷] Àî z©óÉßÈ~Ž”¤âŸT®ÿ¹ÑGd§ª›&ÙdèUw4œǼ!û?$ikŸþ®4,·æ¾S˜Íˆ¾áƒÙÏ“’T¼¸cߘz·œ4±Cúd èU/õïú‡Tÿ–üÿp¤1­ó‰_JÃîs¹ïVf«_¦Î¹¿–ý\)IEÔqoýQsTi’LÌ€^Ýe*Oü©üÿP¤1®sÞûRê¹oWæhØÛ™Úg¾;ûùR’Š]T®Gª61MŠÆèƒ-›RÛÂ$í¶Î†Œ¾€f›ùHÎöú–ýœ)IÅKÔþä‡Ò`ëC©é; ×gS÷³™Šå/ËþA÷f¾±}æóò˜ ÃgŸHåq?™ý¼)IÅKµr¿Ô½îoSª:©©9 WlLű‡åÿ 5 ÎšØ/q˜fõ¶‡R¹îµÙÏ’Tì¦ò„·¦jó—R5j@¯Ë­©sÅŸfÿKM©ûéßNiÐÏ}ë°@êgîNåšC²Ÿ?%©Ø]ËöIK´ñ6I«I_Zýšü?h©!u/úã9À<|ýècrŸC%©Ø“Ž=,UÞ˜šbüô^™ºý?Ù¸RCê^ô»Æs€)2Øt•Ԝ–-m¾©ÿïìë}ðÔ©<ùgòÿ@¥Õ½ø#)ÕUîÛ€EV}ãl€(©Q•g¾'ÕÛNãllôþR±êÀì?D©IϦ[ÿƵÙϦ’TÌ¢rõÁ©ºïŠ4®Æo@ïwRçÊ?Ëþƒ“šV÷’ÏH½k?–ýŒ*IÅlZ¶$õ¾|dJuÆÍX èÃçžLåïÎÿ“šø™çÆsf ‡©{ùe?«JR1ËÚþVª;Ï¥q26úà™o޾5÷IjZ H©êæ¾…'õ`ôÇV¹Ï¬’T̲rý;R½ãñ4.Æb@¯ü|*Ž|UöŽÔ´:>h< VuRçœ_Î~v•¤b¶{X<ó­4²èýÛÏJÅò—åÿ¡H «sþ¯§Ôoç¾…cÃö¶Ô>åíÙϰ’T̲rÍ!©Úü¥éÐ{7®ËþƒšXç¿”†½9o_b¸ãÑT®{mö³¬$³mÅ+RußåÓ9 ÷n\›ÿ 5°öYÿ: »Ïçºuh ú©o¤âÈWf?ÓJR1ÛV¼<õïùÌ èuºŸûŸùŸx©µOû…4lo_ôÛ€æ<°1Ë÷Í~¶•¤b¶-ß7õï8:ôî5ÿ#ÿ.5°ö©‡ÏØ+ý¯­Ï~¾•¤b.-[’úw_8Ùz÷º¿ËÿDK ¬}âO¥áÎgóv`Bõ>÷WÙϹ’TÌ¥åû¦êžK's@ïÝ|Bþ'Xj`å±o}á Ì‹aºýNöó®$sýbÑ??YzïkÏÿÄJ ¬\÷ºTo}p1nS¦I¿Úgýbös¯$s¨\}P1ÿ&5°þÍ'Ì÷í³Ò½ü³Ÿ%©˜CåêƒÒà»÷÷€^=zãè#(r?YRÓê]÷7óy+ÀÜTÔ>ó=ÙÏÉ’TÌ¡rý;F/>–zÝÞžŠã~2û“$5­îeÒp8_·"ì•áÎgRy쳟—%©˜CÝ«ÿb<ôÎÅÿ)û“#5­Î…^Ðo €¹¨Ÿ¾3«Ì~n–¤b.ß3øÀÆñÐûwœ—ÿ‰‘Vû¬_L©_ÎÇ-ó®º÷²Ñ•ûü,IÅ,+y}ª‹ïÇ€^oÛœŠ#_•ýI‘šTûÔÃÓ°óì¼ÜİPz_üûìghI*æPç¢ßƒ½®SûÜ÷e2¤&Užð–4|þéy¹`A ëÔùÔÈ~––¤bU÷_™w@ïãœìO‚Ԥʣ_ê-›öúÆ€Å2ìíLíS>û™Z’ŠYVwXª{;ó èõóO§bÍe¤Æ´ê€4xü潺a ‡áŽÇR¹ö'òŸ­%iéìê~î¯ò è‹>’ýÁKiù¾ipßå{u³@NƒÇnJÅŠWä?cKÒÒYîrOݱ¸zõðõù¸Ô ú·ž2ç›ÆEuçùÙÏØ’T̲Î9¿²ˆz]¥òã>÷JÚÓz_øë9ß 0nz×ü÷ìgmI*fYuß‹3 ÷o;#ûƒ•šR÷3ÿ9¥ápN7'Œ¥ºJóþ]ö3·$³¨}òÛRªz ; ×í©8ú5Ù¬Ô„:çþZJƒÙß”0î†Å–TwXö³·$³¨7‡YžÕ€ÞýâÒìRjBíõ?—†gg}C@SÔß¹-+÷Ë~—¤b+×½.¥^¹0z]|/G”ýAJã^yôkR½mó\Þ{@£T·û¨_I­FÕ»åä…л×þïìNûVîŸê'nË{h¤îå”ÿ<.IK÷¬ò˜×Ïê¯Ð÷h@¯w~7«^™ýÁIcݲ}RõÍOïÍ{hžª“Ú§¿+ÿ¹\’–îY½¯­Ÿß½{íÿÉþ ¤q¯ãÚ½y»5ÜñX*~uö³¹${Pyü›RTó4 ww¦â¨C³?(iœ›ùÏÕ`š 6_—Šåûf?£KR±õï½l~ôÞ-'e0Ò8×9ç—Sôæã½4ZïúåÙÏé’Tì馷×z]¥ò„·f0Ò¸Ö>åíiØÞ>Oo3 á†uêlø`öóº${Ðà;·ïÝ€>óg칄4®Í|¶[½mó|¾Í€Æ¶·¥òø7g?·KR±›ºWüÉÞ èíóߟýAHcÙŠ—§ÁÃ×Ïçû ˜õ3w§bÕùÏï’´tו«N©WÌm@¯·=œŠeK²?i«n?c!Þ_ÀÄ¨î¾ ûù]’ŠÝԿ낹 èÝëþ.ûÅKãXoã ñ¾&N÷Ê?Í~Ž—¤â%êœÿþ9 èƒ~*Ö½>ûÅKcyCÕÕ½­€ SuRûÔóŸç%©ØUË–¤zÇã³Ы¯ÍáÒ˜Õ>ùgÒ°½}!ßVÀÄ©·=”ÊÕe?×KR±‹ú·œ8»½sùg¿hiܾP þî} ù~&Võ­‹²Ÿí%©ØE³ß;‹½ê¥â¨C³_´46-ß7 ¾}Í¿•€ÉÖ½ìóŸñ%ié.>Æåù§÷l@¯¸&ÿKcTÿ–“ã}L´aoçèãQsŸó%©ª¾qöž è>¾EúǺ—ýÁb¼‡€©P?sw*VîŸý¼/IÅ‹ê\øá=Ðë:ë^Ÿýb¥q¨}Ú¿H©_.Ò[˜ýÛNË~æ—¤âEÍ|ÙñÌÇ›¿ä€>xêÎì*CåѯNÃí,æû˜ÝK>šýì/IÅ‹ªŸ¸õ¥ôÞWŽÊ~‘Rö–¿, ¹a1ß7ÀTvv¤ò„·äß$ié?Ö¿aõKèíOüÛì)å®ÿµõ‹ùž¦Rýäí©XñŠì;€$߯sĀÞ+½hiê󥡰xú7“} ¤â­ÜÿG>ý‡zõð—ó_ ”±öi¿R¿ãýL§á0u.üpöM@’ŠïW?}g< ÷nX“ýâ¤\•k< Ÿ}"Ç[˜jÃbK*yCöm@’Š¥­T}ý¬x@oÿò_œ”¥eKÒà¡ks¼GRJƒG¿’Šåûæß$M}Ý+þ$Ðë:kÉ~qRŽú_9*ÓÛàz×ýmö@’Ú§þ£ú`ëCÙ/LÊQç‚ß}ÞY]¥öÿ*ûV iÊ[¹_Jõà…zuïÿÍaÒ"Wÿæ4,·æ|küõ–ûS±ê€ì›¤én¸ýáè½ëWd¿(iQ[¹ªŸº#ç{ пõ”ü»¤©nðík^8 w>ýÛÙ/JZ̪;ÎËù^Ø•á0u6|0ûv izëßrâ ôò¤·e¿(i±ê^õç9ß»1|îÉTuhö AR+Mû~Øšù@ô™FÏ}QÒbÔ>ã_¦Tu³¾ v¯ºç’ì;‚¤é¬sÁ‡~øZÔªŸ}"ûI‹Q¹æ|0Þº—þ~ö=ARkêjŸþGoÌ~AÒbTÝ{YÖ_úÀì ;Ϧòø7eß$µ¦ªrÝë~ø:Ôêß¹!ûI ]oãYás3xì¦T,ß7û¶ ©5=-[’R]^ƒZ½/™ÿ‚¤¬}ú»|î94XïÚeß$µ¦ªé+;K IDATáóO^ZÝÏþeö‹‘ªrõA©þÞ·sÿžöFÕMíSϾ3HjMMõ–M£—ŸVç’ßË~1ÒBU}óÓ¹Åó þX¹ö­ARk*ªŸüúèµ§Õ>ÿýÙ/FZˆ|î9L–þW˾7HjMEƒGn½î´ÊÓÞ™ýb¤ùÎçžÀÖ©sίdß$µ&¾Á¦«G/;­âø7g¿i>+|Uª·>˜ûW:°êm›S±êÀìûƒ¤ÖDW}ëâÑkN«X÷ºì#ÍgÕ]rÿ.PÿÖ“³ï’ZS2 uhö‹‘æ«îÅÿ1÷ïp`1>Êåì÷fß!$MÀ¾ê•Ù/FšÊÞš†Ýçrÿ Aý½o§bÕÙ÷I­‰¬ºç’ÑkM«XñŠì#íuË_–ê'nÍý»XDý¯›“”&±êžÏŒ^gZŲ}²_Œ´·õoZ—ûw6°ØêAjŸùî컄¤Öècp1ÒÞÔ9÷WG¿0€éSoÙ”Š•ûgß'$µ&*º&¢rí§áóOåþ] dÔÿÊšì…¤ÖDe@×D4ØtuîßÑ@nu•Ú§¿3ûN!©õÿÙ»óhËêúÎû»DpE‚vc¢¦É`̤¤ãLÚ´m3˜šØm4FÃÓ±;ÑŽ5EU1HQÌS12a¦˜ç©™y¦€ª:ûÌgÿžu ±¬ºPÜsîýž½Ïë½ÖëŸ^Y½’ wŸºµoª :¥×<ëo£Ï³$I’$I‘zOÞžjó^¾WY%Ð)µú÷~>­µÑ·Y’$I’$P­óÂ7 «:å5w³Ô{ôúè›,I’$I’FñU.|(~»RÙÐ)­ö¥ ¢Ï±$I’$IÑzO¬Lµy›‡ï@VjtJ©~Ðo¦ÔmGßbI’$I’4µ.ú¿áPntJ'ßå©·ê¾è,I’$I’F½N3Õ÷ýÅð-ÈJË€Nétn><úüJ’$I’¤’Ô}ðŠT›3+|ϲR2 S*ã>}w%I’$IRÉjžöWᛕ’ÒÈw{*Ö>}s%I’$IRÉ*òçR¾hÛðmÈJÇ€Néþe•$I’$Iz­un9"|Û²Ò1 S Í“?}g%I’$IR™+ŠÔX¾SøÆd¥b@gäåK¶ïÿU+I’$I’¤Aê=ûÃT›¿EøÖd¥a@gäuï:=ú¾J’$I’¤ŠÔºdvøÖd¥a@g¤5Oÿrô]•$I’$IUªÓLõ¥ß<€¬ 茬|w¥¢þ|ôY•$I’$I«ûãËRmάðíÈFžÑ4gVêþèüè{*I’$I’*ZóäÏÇïÀÈ3 3’šg}-úŽJ’$I’¤ W¬}*å ·ß@€l¤Ð9ù’w¦¢ñBô•$I’$I¯sãÁá;4:#§{ÏYÑ÷S’$I’$CE/5Ý1| ²‘e@g¤4Oýbôé”$I’$IcT賓ڼÍÃ7 ItFF¾x»TäÏEßMI’$I’4fµ.üvø.d#É€ÎÈèÜyJô½”$I’$IãX;OùžïßF€läÐ ã>}*%I’$IÒ×¹ýøð}ÈFŽpùnoMÅêÇ¢ï¤$I’$Ió‡,|'²‘b@'\çÖ£¢ï£$I’$IRê=±2Õæn¾•ÙÈ0 ª±|§”Š"ú>J’$I’$õkýõð½ÈF†8 ¶J½U÷GßEI’$I’¤—+ê«R¾ûÛãw`$Ð Ó¾zïè›(I’$I’´^íßM€l$Ð Q?à×Rêu¢ï¡$I’$IÒúõº©¾ÿÃ÷ g@gæÍÝ,õ¿%úJ’$I’$MZ÷á«SmάøH‘ è̸ÖEÿ7úJ’$I’$½jÍ“?¾£Y(:3ª¾ÏûRj×£ïŸ$I’$IÒ«V¬~,廼1|O²0tfΜY©ûÀ%Ñ·O’$I’$i£k_¾0~SR:3¦yÆW¢ož$I’$IÒk«ÛJõ¥ïßU€,„‘/Þ.õç£Ož$I’$IÒk®{ÏÙáÛ …0 3#:+‰¾u’$I’$IS®qÌ'Ã÷ ›qt¦]ãð¥TÑwN’$I’$iÊõž½7Õæm¾³ÙŒ2 3½æn–zOÞ}ã$I’$I’®õ/¿µ3ʀδj]øíèÛ&I’$I’4”Šúª”/Ü&|o²c@gÚä{þÇT´ÖFß6I’$I’¤¡Õ¾rqøæd3ƀδéÞuzôM“$I’$InFÊ÷úÙðÝÈf„iÑ8êÑçL’$I’$iZêÜv\øöd3€Îð-Ø2Ï?}Ë$I’$I’¦§¢Hõƒ~3~ƒÒt3 3tíËv‰>c’$I’$IÓZ÷Ç—…o0@6í è U¾÷{ûï“$I’$Iªzã>¾ÅÙ´2 3T~q¨$I’$I—zÏÞ›jó6ßc€lÚКÆò¢ï–$I’$IÒŒÖ:ûëá› M:Ã1wÓÔ{êŽè›%I’$I’4£µgR¾ë›ã· M:CÑ:ç›Ñ÷J’$I’$)¤öå»…o3Àô0 3°|áÖ©ÈŸ¾U’$I’$I1µë)ßóÝá µ¯ß?úLI’$I’$…Ö¹õ¨ðȆ΀Î@êËvH©×‰¾Q’$I’$I±½T?ð7· *:é>pIôy’$I’$I‰º÷_¾ÕÙPЙ²ÆñŸ‰¾K’$I’$I#UcùÇÃ7 :S3w³Ô{æîè›$I’$I’4Rõ»1ÕæÌŠßn€4 t¦¤uÎ7¢ï‘$I’$IÒHÖ8îÓáÛ …×,ßõM©XûTô-’$I’$IÉzOý Õæl¾áÙÀ è¼fíËw‹¾C’$I’$I#]óäÏ…o8@60:¯I¾ä)µjÑ7H’$I’$i¤ë=÷£T›·yø–d1 óštnY}$I’$I’JQ󌯄o9À` èl´ú~¿’R¯}{$I’$I’JQ±ú±T[°eø¦dSf@g£uï» úîH’$I’$•ªÖ¹ÿ_ø¦dSf@g£4Žø½è{#I’$I’TºŠÚ3)ßõMáÛM‰W7gVê=~sô½‘$I’$I*e­‹¿¿ïi* 輪æ‰}g$I’$I’J[Ñx!å · ßx€ì53 óÊænšzOß}g$I’$I’J]ûò…ñ;^+:¯¨yÚ_GßI’$I’¤òת¥|ñvá[½&t&7oóT<ÿ@ôy‘$I’$IªDík—Æï=@z- èLªuÎ7£ïŠ$I’$IRuê¶R¾÷Ï…o>@¶Ñ èlØ‚­R±æ‰è³"I’$I’T©:7¿ûicÐÙ ÖE߉¾'’$I’$IÕ«ÛNù^ï ß~€c@g=ùnoIE}Uô9‘$I’$Iªdí ߀l£ÐYOû²]¢ïˆ$I’$IRuë4S¾Ç߀€ìUÐYÿ§Ï/DŸI’$I’¤J×¾vßðÈ^•u´/]}?$I’$I’ª_§‘ò%ï ß‚€ìÐù©wŸ?}>$I’$I’Æ¢öÕ{…ïA@öŠ è¼¬µbnôÝ$I’$IŸÚyʽ#|²IÐéËw}s*ꫢφ$I’$IÒXÕ¾rqø.d“2 Ó׺ø»Ñ÷B’$I’$iüjÕR¾hÛðmÈ6È€Nªíò†TÔž‰>’$I’$IcYû²]ã÷! mˆÔºè;ÑwB’$I’$il+š«S¾pëðÈÖc@wýŸ>:úNH’$I’$u­óâw"`=ô1×:ÿGßI’$I’¤±¯¨?Ÿò]ß¾Ù: èãlÞæ©xñ‘èû I’$I’¤‰ŸB¿øŸã÷" ý$úkžñ•è» I’$I’¤­ÈŸKù®o ߌ€ìeôq5g“Ô{æîè» I’$I’¤Ÿ¨uá?ÅïF@ú7ô1Õ<ñO£ï$I’$I’~ª¢ötª-Ø2|;²>ú˜ê=r]ô=$I’$IÒjýwáÛõÐÇPcùÇ£ï€$I’$I’&©xþÇ©6w³ð È èã¨{ÿEÑw@’$I’$I¯Pó¤?߀̀>nêû0¥¢ˆ¾’$I’$Iz…zO¬ ß‘€Ì€>n:wœýü—$I’$IÒFÔX¾Sø–ã®c@ù^?›R¯ýì—$I’$IÒFÔ½ï‚ð= Æ]Ç€>>ÚWïýÜ—$Iš¼v=kŸJ½ç~”zÝ”º÷_œ:wžš:·,Oík—¦öe»¤Öÿ'5Ïü›Ô<é³ÿîÄ?K#=õC?šêþFjö;/ý¿÷é—þçOÿrjžùÕþÿ_­ ¿ÚWìžÚW.N›MÝ»ÏH݇®J½gïMEýù诈$I÷Š¢ÿ:ÞèM jcÌ€>&ò]ߔЯ‹Ñ}I’4Žuš©xá¡Ô}øšþ Þ¾vßÔºè;©yê—^º—íòÝÞþyiƒæmžò%ïLõý55ŽüƒÔ<å/ûÃ{û†S÷¾ SoÕ})uÛÑ_aI’Tá:·ÿ™f/ú˜h»sôó^’$U¸¢¾*õ½¾ÿx­sSóäÏ¥úA¿•òEÛ†švs7KùÞ?—Ë?ÞÿÉöþO³ÿàäÔ{æn¯Ï“$Iƒ×ëô_Ëþ™f'ú8˜»iê­º?úq/I’Ê^»ÞµJçöRûÒýŸÆ®üá”/Ü&þóΨZ°UªüÛ/ ë7º_Šæšè’’$©dM¼Î.üs ÌOô1Ð8þ3ÑÏyI’T²ŠµOöiÕÄOS÷š|Ùý?”þ\S sf¥ú÷~¾ÿîöö•KRï‘k½F’$½r­šZ€Ù1 èc ûàÑyI’4ªõº©xþÔ½çìÔZ1/5ŽýTÊ—lþùeì,Ø*5ݱÿKM'þYøÝ5’$é§k]2'þ3 Ì?ôŠ«ð¡èç»$IµŸ,¿ûÌÔºðŸRãðßí·ÑŸWØ€y›§ú!éÿÂÒ‰¿ 0ñ‹X%IÒxWÔžNµ[ÆNÙãÅ€^q•ÇD?ß%IRTE‘zOßÙ÷vóäÏ÷Ñeôg¦h—7ô_Ë×¹éÐT¬y<úß,I’Tëì¯Ç.ÙãÅ€^aý:u[ÑÏvI’4“ƒùS?Híë÷ë¿_;_ôŽðÏ#LÓ;Ôüõþ_ãî=zCJE/úßý¯°$Irý_?Ÿ7 6 èÕ}`Eô³\’$ PoÕý©}Õž/ýÇ‘÷\2ˆ9›¤Æ‘¿Ÿ:wžšR¯ý¯¶$IBw=ü3Ìô ªïûŸ¼ÿR’¤V¼ð`j_»45ݱÿ‹"£?SP=ùâŸI­ ¿ŠŽþ×]’$ R¯Ûu[ôg ¨zµ¯[ý—$I¯å'ͯØ=ÕøPøgÆÈÜÍRó„?IÝû/öƒ’$•´‰Wµ…¦€ÙÕg@¯˜‰÷¢£Ÿá’$é*ê«Rû†SýÐúIsÂÕ—¾ÿ¥ÀhçÑß’$é5TÔŸOµ[…–€ZÅÐ+¦yÖ×¢Ÿß’$iCuš©{×é©qügRmÞëÂ?3ÀOËm›Ú—ï–ŠÆ Ñß-’$i#›Ø¢?C@­â èÓ{òöèg·$Iú‰zÏÞÛçôÄ8ý96öo4¶ÎÝ9«‹þö‘$I¯Rïé»üF˜=½ è2ñ×À%IÒÔª¥Î­G¾ôË@Gà3LÉü×§ÖÙ_OÅó?ŽþŽ’$I¯PãÈ?ˆÿܳ«Ë€^![–G?³%Iëú?m~Î7S¾ë›Ã?ÀPáèé_NÅ‹D‹I’¤ Ô½÷œøÏ 0»º èUúå¡­µÑÏlI’Ư¢—º÷_œÇ~Ê_Ÿ¥Úæ½.5Ïüj*jOG×I’¤Ÿ¬(R}éâ?+Àìj2 WÄÄÌH’¤™«h®Ní«÷NùÞï ÿ3)ßí-©}ù”Úyô·¡$Iú×Ú×îþje@¯ˆÞc7F?«%I‹ŠµO¦ÖŠy)_¸uøý‡H¿·}åâ”:ÍèoKI’ƾ¢¹¦ÿ‡ÜÑŸ VAô ¨ïÿ«ÑÏiI’*_ïÉÛSóÔ/¥Ú¼ÍÃo?Œ’úÒ÷§îÏ‹þ•$iìk»søç¨U½&þšŽ$Išžz\—Ç|ÒûÍáU4ŽÿL*^x(ú[V’¤±­·ê¾T›³Iøg¨UŒ½ìæo‘ŠüÙèg´$I•«ûðÕ/ýbÐè[e²`Ëþ+ŽR§ý-,IÒXæó+dCg@/¹æÉŸ‹~6K’T©º?¾45ÿXø‡2«ïó¾Ô½ï‚èogI’Æ®îý…€ZÅÐK®ûÀ%ÑÏfI’*QïÑëScùÇÃo;TIó„?IÅêG£¿½%IŸŠ"Õ—íþjb@/±|¯÷ôŒ’$iêõžúAjÿGáwª*ßí-©sËÑßê’$M¿ÿP«z‰µ.þnô3Y’¤Ò6ñË›§|Á/Z‚Ò8ú¿úitI’f¢V­ÿØÑ·ja@/±Þ3÷D?’%I*_­Zÿ—Nü²Ãè[ã&ßõÍ©sÓ!þ¥$IÓ\ëœo†ß}¨U„½¤ê8úY,IR¹*z©³òè”/þ™ð;ã®qÔ'Rñâ#ÑOI’*[ï™»Ãï=Ô*€^Ríë÷~K’Tš&~év}Ù/…ßoà§Þ~ÛqÑI’*[ãÐÃï=Ô*À€^Fó^—ŠüÙèç°$I#_±æñÔ<õ‹ñ·˜ÔÄ÷hÑZý¸$©ruV~ç¡Vôjÿ™èg°$I£]·Ú×.Mù®o ¿ÛÀ««/ý@ê=±2úÉ!IRµê4S¾hÛð;µ’3 —Pç®Ó¢Á’$lÝ_šêKß~¯×hþëSû†£!’$UªÖùߊ¿ñ0»Ü è%“/ܦÿ'ˆ’$iÝŠÆ ©uîΩ6g“ð{ ö·-‹úªèGŠ$I•¨·ê¾T›3+ü¾C­Ä è%Ó<ëo£Ÿ½’$\;NLùâíÂï40ù^?›zÝýh‘$©5–ï~Û¡Vbô’é>teôsW’¤‘ú%¡cÿ[ø}¦Áü×§ÎmÇF?f$I*}|?þ®Ãìò2 —H¾ä)½èç®$I#Ñć˜|÷·…ßg`z5ÏüjÿK’¤)Öm§|Éöá7j%e@/‘ÖyÿýÈ•$)¼¢ötjžð'áw˜9÷ÿ½/I’¦Vë¢ï„ßs¨•”½Dz\ý¼•$)´î]§§|Ѷá7˜yùÞïM½§îˆ~ I’TÊŠçœjs6 ¿çP+!zIä{½'¥¢ˆ~ÞJ’S;Oͳ¾~Xù.oL;O~"I’TÊGÿaø-‡Z ÐK¢uá·£Ÿ³’$…Ô{úÎTßïWÂo10"æÌJ­ó¢M’$•®îÝgÄßq˜]>ô’è=~sôsV’¤™­(Rûš}Rmþáw=­ùû”zÝè'•$Iå©×Iùï ¿áP+z Ô¿÷óÑXI’f´¢¹:5Oúlø F[ãøÏô_ñ$I’6®‰¿Å}¿¡V2ôh]2;úù*IÒŒÕ{âÖþGß_ ê8µ§£]’$•¢bõ£©6wÓðû µ1 —@ï©;¢Ÿ¯’$ÍHíôÊà5«ïó¾Ô[uô#L’¤‘¯·ê>¿_f¿6ôüÇ€$I•¯ÓHÍÓþ*üîå•/zGê=~KôÓL’¤‘iâohuïý—ÔZ175ŽþÔïþ¶ð{ µ2 ¸Ö…ߎ~ÞJ’4­kï¿‚!úæå—ïö–Ô}øšèÇš$I3_«–º]•Ú×.MÍS¿˜êËvHµ9³Âo3Ô*À€>âz^ý–$iÚšºò%Û‡ß[ BvyCêÞQôãM’¤é«×M½§ïL•G§Ö¹;§Æ¡;¦Ú¼×Åß`˜]Mô–/ygJEýX–$iZêܲÜ}`zÌ}ÿ¯¬K’T…ŠçH;NL­óþ!5ûT[°Uü­…ÙãÀ>ÂZç|#ú-IÒð+ŠÔZ1/üÎ7oó—ÿcG’¤²T4^|éU,W.Nc?Õÿá7Æ\Ç€>ºº\ýÜ–$i¸uš©yòçÃo,0&ænÚÿÛ.’$dÝvê=~³÷–ÃìÑf@QùÂmúRI’ªRQ{:ÕùHøÆÌœMRçæÃ£’¤qoâ½åOÞÞ¿IÍ3ÿ&Õ÷ÿ`ªÍÝ,þNéÕÐGTó´¿Š~´K’4´ŠLõ¥ï¿¯Àè·ý(”$QÅšÇS÷ž³û¯.쿊e··ÆßC M…}Duï>3úY/IÒPê=õƒ”ïñ®ðÛ Œ¹‰×¹Ü~Bô#Q’TÁŠæê—Þ[>ñ*–“>›òÅÛÅß= ‹}-Ø*¥v=úù/IÒÀu|YÊw{Küm˜0oóÔ½ûŒèG£$©Ìµë©ûð5©}Í>©yòçRý{¿߀4 è#¨qÜ>’$ ÜÄߦªÍ}ø]XǼץîÏ~DJ’ÊòÞò§~:·‘šg}-Õø÷–Ãìñc@AŽ>’$ T玓ú?é}S&ÑÏ‹~TJ’Fý½å ·Ž¿Y@Šf@5sf¥âÅG¢o†$IS®sËòþ»†Ão*À+Y°Uê>|uô#S’TQ>uï» µ/Û¥ÿ&ï-j“0 ˜úþŒ¾!’$M¹öõû÷ÿ08úžlŒ|á6©÷ôÑNIÒt×i¤Þ#×¾ôK>OùËTßç}>³icÐGLëâïFŸI’¦Tç¦Cý‡P:ùïJÅ E?B%IC¬xþÔYytj»sjº£ßˤAÐGÌÄŸˆJ’T¶&~±’ñ(«ú²RQ_ý(•$ å½åÛ„ß «úÉw[ÿ7µ¯[ÖËëK?ào<)‚}„tî81úBænšŠúóÑ'K’¤ªûàå~PYí+G?f%©Ò«KÝ»NO­‹¾“ËwJù®oöÔ&a@õC>}¿$IÚ¨zOÞ–òÝÞ~;¦ÍœY©sÇIÑ[Iªè{Ëßÿœ˜½ñ è#¢uÉœè›&IÒ«Ö[uʽ#ünL»]ÞzßýØ•¤rÕm¥Þ£7¤öõû¥æ©_Jõ}ÑïËRÙÐGÄÄŸÆJ’4Êùs/ýò¦¸›3!_²}*V?ýø•¤‘­XóxXj»sjºcª-Ø2üÙ P2úÈw}SJÝvôÝ“$iòº­Ô8â÷Âo&ÀL«øë)µjÑOaI ¯XóDêÞsvj­˜—Ç~*廿-ü P›ôÐ8þ¢ï $I“W©yÊÂï%@”æ ’RÑ‹~KÒŒU´Ö®óÞòú²Ÿŵ ôо~ÿèÛ(IÒ¤µ.™~+¢ùE’*[·zÝ”Ú7š§ýÕKc¹÷–¤c@½ç~}.%IÚ`;OMµ9³Âo%@¸9³úÏDIªÂ{Ëû¯b¹ðÛÞ[0ûÕЃå{½'úvJ’´ÁzO¬Lµ]Þ~+Féwõž¹;úñ,I]±öÉŸzoùÛߥµ’1 kžùÕè{*IÒzkŸJùžÿ1üNŒšúÒ¤¢¹:ú1-Iëå½åÙ´0 ‡ÿø~ô•$iÝzÔ8ì?‡ßH€QÕ<é³ý_°,I¡ï-ü–Ô¹ñ Ô<ýË©¾ì—Rmî¦áÏG€ZÐ#Í™Õÿ ?I’F©Öùߊ¿‘#®}ÕÑkIcýÞò­ÂŸƒµ1a@4ñש$I¥º÷œå—†lŒ¹›¦î}D?¶%U°¢ñBêÞñ¿¿·|ѶñÏ<€ÙãË€¨uö×£ï²$I/×{îG)ßõÍá÷ ,òEïHÅš'¢ß’ÊþÞò¯Hí«öì¿*ßëgßmdë0 ‡~ñ½ÿ\’4"õ:©~ðo‡ßF€²iþ±”zÝ觸¤2Ôë¦ÞÓw¦ÎÊ£SëÜ_z˼ׅ?ÇÈ^‘=Š÷ŸK’F¨ÖÅÿJª}é‚èǸ¤Q~oùÄ«XŽü}ï-˜]Nô Þ.I•º_Ý—oôm(­9›¤î—D?Î%V4^L݇®Jí+ÿë{Ëßÿl ƒ=Hëì¿‹¾ï’$õß»YÿÞ/„ßE€²Ëo—еOF?Ö%ÍD­ÚKcùµKSóÔ/ö@Î/aÈ*Ë€ö…÷þsIR|ÍÓþ: ®™ IDATü&TEãè?L©(¢í’†™÷–Œ½Ž=€÷ŸK’F îÝgÄßD€Ši_µGôã]Ò0ß[¾ËŸ+d¡ èêK?ý™@’4ækžHùîo¿‰•3oóÔ{üæèǼ¤¨ÈŸMÝž—Ú—ÎOc>™òEÛÆ?CH£Æ€ yúÿˆþœ I犢ÿšè{PUõ}ÿSJízôÓ^ÒOÖÎû¿8½}Í÷Róû‘ò½ßþ¬ +zÄý–#¢?:H’ƸÎÊcÂo!@ÕµÎùfôã^ß6ôÞòù[„?ÈJÉ€ ÷ì½Ñ'$IcZÑx1åK¶¿…•7gVêþðÜèǾ4~ï-?öS)_¸uü3€Tô6ñ¾Ù‰¿:/IRDͳþ6üŒ‹|É;S‘?ýè—*UÑ\º]•Ú×.MÍ“>›òÅÛ…¯Uš}†5Žûtôç IÒ˜Ö{ì¦T›»iø-'þ8úñ/•·nû¥W±ÜtHjžúÅT_¶CÿowD_ú k_¹8ú#ˆ$i+z©~ðo‡ßA€q4ñfI¯^ñüÞ[@5ôÖ}èÊèÏ$’¤1¬}ݲð0®òÝÞ’ŠÕFŸi¤*^|8uî<%µ.øÇÔ8üc)ßõMáß«PÛúLš¿EJFôçIÒ˜U¬}2廽5þŒ±ÆÑÿ5úH#ôÞòŸ ÿž€ÚF2 Ï ú!‰þÜ"IÚßÿ‹ð@–:·}¤é¯ÓH½G®Kík÷MÍS¾êKßï½å¤23 Ï Öyÿ+ú£Œ$iÌšøØèûÀKò…[§bÍѧA^E/õž¾+un=2µÎþ»T?è7SmÞæáßkP"úL~±ï81úã$iÌjñ{á÷€×8öSѧAšrÅšÇS÷ž³Skżþ¿ËùÂm¿§ 6Í è3¨·êþèÏ;’¤1ªû£óÃoëëÜ~|ô‰^µ¢¹æßß[~êS¾÷Ï…ï@-€}†LüÉ|*ŠèÏ@’¤q©(RýÀ_¿¬/ßým©XûTô¥þ½^'õž¾3uVšg~5Õ—íjs6 ÿ^€Ú0 ÏÆQÿ%ú#‘$iŒêÜqRøí`rÍ“>}*4Îï-æîþXÞ:ç©~Ðo¥Ú¼×…O@mDÐgHë’ÙÑ“$IãR¯›êûþbøíà•M¼KZšñ÷–ïþ¶ð÷ V"ôÒ½ç¬èÏM’¤1©sãÁáw€W—ïùîT´ÖFŸ Uø½åýW±ŒÀ¿ëP+1ú ™øSI’¦½N#å{ü‡ð»ÀÆi]ðÑ—CeÍ{Ë Íú È÷xWôG+IÒ˜Ô¾vßð»Àk0w³Ô{beôùШW©÷콩³ò˜Ôú—¿Oõƒ?œjó·ˆÿ÷fWŸ}4Nøãè[’¤q¨×MùÞï ¿{¼6¿Äqâ.ý[Åš'~ê½åoÿ÷jcÊ€>Ú—ïýùK’4uî81üæ05íë÷># jâ=øÞ[ÙÈ2 Ï€î½çD&“$Aõƒ~3üæ05ù®oö{“Æ¡n;õ¿9µo805Oûkï-€Ù£Ï€>ŠÕEL“$U¼î/ ¿w ¦yòç¢Ï‰†ÜÄŠô_Årá·SãÐSmÁ–áÿžÙkb@Ÿfù¢m£?³I’Æ Æ1Ÿ ¿y nâDUÎŠÆ ©{ÿÅÞ[³«Å€>ÍGý—èÏq’¤Š×{æý "êË~©ÿšvÞ[ÙØ0 O³Ö…ÿýÙN’Tñš§9üÞ0<£¬F¨^'õž¾3uVZçîüÒ«Xæmþï Íúto?>úãž$©ÂkŸJµù¯¿w ûŠ>}bƶõß[¾Uø¿@Æ€>ÍzÏÜýùO’TáZ}'üÖ0|ÍÓþ:úÄŒEEãÅuß[¾hÛðö@6R èÓiÁ–)õºÑŸ %IU­§|áÖñ÷€á›3+u¾&úÒT«V-u¼"µ¯Þ+5Oúó”ïõ³ñÿœ€4ê èÓ¨~ðoGD”$U¸Î͇…ß:¦OýÀ_O©èEŸ›ò¾·ü‰•©sÓ!©yÆÿLõý~%ÕænþÏÈJÇ€>šg|%úc£$©ÂÕüð[Àôêܲ<úÜ”ë½å¯b9ò÷½·HÃb@ŸFíkö‰þ)Iªh½G® ¿sL¿|ñv©h®Ž>;£÷Þò‡®Jí+ÿë{ËßþÏ È*Ë€>º÷_ýÙR’TÑš§~1üÎ03Z—ÌNc[·zßœÚ×.íß¾ú²úï‡þgdcÀ>ŠÕEÜ”$U°"6Õæ¿>üÎ0Cl™ŠIcñÞò'oïÿŽæ™“êû0ÕænÿõÒ83 O“|··Fü”$U´‰W„Eß9fVóäϧJ¿·|âU,»½5üë Pû)ôiÒ8ìw¢?J’*Zÿ'òFàÖ0ƒæÌJ݇¯Nemâ=îë¼·|ñvñ_S€Ù¯Î€>Mšg}-ú3ª$©‚õ¿%üÆ£~ÈGR*Š4òyo90»: èÓ¤}í¾Ñ[%I¬õ/~ãˆÿ¸‘©×M½§îH[ŽèÿQý€_óÞr U‰}štXýQV’Tµº­”ïþöð@œ|ï÷öïÁȼ·|áÖá_€Ú42 O“bí“aj%IÕ¬s×iá÷ €x협»SÔW¥î}¤öe»xo9Æ•}Lü†$Iîy⟆ß8âå‹¶íÿRΡ¿·üé;Sç¦C~â½å›„ÿß P f@Ÿ®_î#IÒ+škRmÁ–á7€Ñ0ñ •îÊó¤ÎÊ£SëÜSãÐSmþáÿ7ÔF}4OýÒæI’^ª³ò˜ðûÀèÈwyãF¿6rý÷–oþ¿?@­$ èÓ }ùnÓ<£H’Æ­Æ1Ÿ ¿oŒ–ÖÙ·Á¿±Ô}èªÔ¾viÿU,ù^ï ÿß Vbôiü¢J’4ŒŠü¹T›·yø}`ÄÌÛ#µ¯[–š§|!Õ—¾?ÕæÌŠÿß `vuЧAïÉÛ£·IR…êܲ<ü¶@m Їmά”ÚyôÖ"IªPãÿ(þ¾Àìñc@²|ÏwGï,’¤*Õ®§Ú.o¿oPCô!kùÑS‹$©Buï9;ü¶@mLЇ¬uÎ7¢·IR…jžñ?ÃoÔÆ”}ÈÚ×ì½µH’ªRÑKùâíÂoÔÆ”}Ⱥ÷œ=·H’*Rïñ›ÃïÔÆ˜}ÈzOݽ·H’*RûŠEáw jcÌ€>dEkmôÞ"IªHå;…ß5¨1úå‹Þ½µH’ªR;Oµù[„ß6¨1úÕþpôÜ"IªHÝž~×`Üu èÃÓüþ_Dï-’¤ŠÔ:ïÂŽ}xZÿsôÞ"IªHõ>~×`Üu èCübÞ|XôÞ"Iª@EsuªÍÝ4ü®À¸ëЇ§ûÀ%Ñ›‹$©uï»0ü¦™}˜z«îÞ\$I¨µb^øM2úÐÌ™•R§½¹H’*PcùNñw Hô!Éo½·H’ªP¯“ò]Þ~׀̀>,õ#zr‘$U Þã7‡ß4 ë3 Iã„?ŽÞ\$I¨sãÁá7 Èú èCÒ:wçèÍE’Tšg~5ü¦YŸ}HÚWí½¹H’*ÐÄ+Á¢oõЇõ…¼ã¤èÍE’Töº­T›¿EøM²>út¾&zv‘$•¼Þã·„ß3 {™}HЉÞ]$I%¯sóaá÷ È^f@†9›¤ÔmGï.’¤’×:çñ7 HÿÆ€>ùâí¢7IRjñ{á7 È^f@‚úþŒÞ\$I(_ü3á7 È^f@‚ÆQŸˆÞ\$I%¯h¼~Ï€lô!hžö×Ñ»‹$©äu¾&üžÙ: èCкè;Ñ»‹$©äun>,üžÙ: èCоfŸèÝE’TòZç+üžÙ: èÃø"Þqbôî"I*yc>~Ï€lô!è>xyôî"I*yõ¥¿g@¶úôž½7zw‘$•¹¢Hµù¯¿g@¶ú¢§IR‰+Ö<~Ë€l=ôAÍÛ¼ÿ“ƒ’$MµîÃWÇß3 ý4ú€ò%ÛGï.’¤’×¹í¸ð{dë1 ¨¾ß¯Dï.’¤’×¾l×ð{dë1 ¨±|§èÝE’Tòš§ÿð{dë1 ¨yÒg£wIRÉkùûá÷ ÈÖc@Pëì¿‹Þ]$I%¯¾l‡ð{dë1 ¨µbnôî"I*yùÂmÂï­Ç€> öuË¢wIR™ë4Smάð{dë1 ú¼ý„èéE’T⊠¿e@¶Aôuï»0z{‘$•¸Þ£7„ß2 Û ú€zݽ½H’J\÷î3Ãom}@½ç~½½H’J\çÆƒÂom}@EíéèíE’TâÚ—.¿e@¶Aô¥n+z{‘$•¸Ö¹;‡ß2 Û ú vyCôî"I*yÍS¿Ï€´!ôäKÞ½»H’J^ãØO…ß3 Û úêËvˆÞ]$I%¯qèŽá÷ È6È€>€ú¡Þ]$I%oâc£ïm}c>½»H’J^¾dûð{dd@@óäÏEï.’¤’W[°eø=² 2  yæW£wIR™ë4ÂoMÊ€>€Öyÿ=½H’J\±ö©ð[d“2  µbnôö"I*qÅó?¿e@6)úÚW.‰Þ^$I%®÷ôá· È&e@@û†¢·IR‰ë=vcø-²IÐùâ­<:z{‘$•¸îƒW„ß2 ›”}/Þ]§Eo/’¤×ýÑùá· È&e@@÷¾ £·IR‰›øƒØè[d“2  ûð5ÑÛ‹$©Äun;.ü–Ù¤ èè=y{ôö"I*q› ¿e@6)úzÏý(z{‘$•¸öuËÂoMÊ€>€âÅG¢·IR‰k_½wø-²IÐPÔž‰Þ^$I%®}Õá· È&e@@Ñ\½½H’J\ûŠÝÃoMÊ€>€ÔmGo/’¤×¾l×ð[d“2 OÕœM¢wIRÉk_:?þži2ô©Z°Uôî"I*y­KæÄß3 MÆ€>EùÂm¢wIRÉk]üÏá÷ È&e@Ÿ¢|É;£wIRÉk]øíð{d“2 OQ¾÷{£wIRÉk]ðÂïMÊ€>Eõ¥ˆÞ]$I%¯uþ·ÂïMÊ€>Eõe;Dï.’¤’ç'Ð iô)ªï÷ËÑ»‹$©äy:d#Í€>Eõý5zw‘$•¼ÖÅÿ~Ï€lRô)ªðkÑ»‹$©äµVÌ ¿g@6)úÕüèÝE’TòÚ—.¿g@6)úÕú­èÝE’TòÚ—ï~Ï€lRô)ªüáèÝE’TòÚW, ¿g@6)úÕýhôî"I*yí«ö¿g@6)ú5ûèÝE’TòÚWï~Ï€lRô)jþ»Ñ»‹$©äµ¯Ý7üžÙ¤ èSÔ8âÿÞ]$I%¯}Ãá÷ È&e@Ÿ¢ÆòGï.’¤’×¹eyø=²IЧ¨qäDï.’¤’×¹ãÄð{d“2 OQã¨ODï.’¤’×½ûŒð{d“2 OQã˜OFï.’¤’×½ï‚ð{d“2 OQãØOEï.’¤’×}ðòð{d“2 OQã¸OGï.’¤’×{ô†ð{d“2 OQãøÏDï.’¤’×{êŽð{d“2 OQóÄ?Þ]$I%¯÷ÜÂïMÊ€>EÍÿ,zw‘$•¼bõ£á÷ È&e@Ÿ¢Æ ½»H’J^‘?~Ï€lRô)jû©èÝE’TöÚyø=²IЧ¨qÔ'¢gIRªÍÝ,ü¦ÙЧ¨±|§èÍE’Tò…[‡ß4 Û ú5ûÏÑ›‹$©å{¾;ü¦ÙЧ¨~ÈG¢7IRªï÷Ëá7 È6È€>Eõƒ~3zs‘$U ú¡ ¿i@¶Aô)ªïÿÁèÍE’TGÿaøM² 2 OQ}ÙÑ›‹$©5Oúóð›dd@Ÿ¢ú>ï‹Þ\$I¨yÆWÂom}Šò½Þ½¹H’*Pëüo…ß4 Û úå{¼+zs‘$U ÖŠyá7 È6È€>Eù¢wDo.’¤ Ô¾z¯ð›dd@Ÿ¢|áÖÑ›‹$©un><ü¦ÙЧ(ßåÑ›‹$©uï:=ü¦ÙЧjþÑ›‹$©u¼<þ¦iC èS5wÓèÍE’TzOý þ¦iC èHE/zw‘$•¼bÍá÷ È6È€>€ÔmEï.’¤²×m…ß3 Û úR«=»H’*Pm—7„ß4 [}Eþ\ôæ"Iª@ùžï¿i@¶úЉÞ\$I¨~À‡Âo­Ç€>€Þ3÷Do.’¤ ÔXþñð›dë1  ÷ØMÑ›‹$©5Oúóð›dë1  ûàåÑ›‹$©µÎþzøM²õÐÐýá¹Ñ›‹$©µ.þnøM²õÐúâ}?zs‘$U ö5û„ß4 [}/Þ-Ë£7IRêÜ~BøM²õÐоnYôæ"Iª@ÝV„ß4 [}í+Eo.’¤ Ô{úÎð›dë1  uÉìèÍE’TŠüÙð›dë1  uÞ?Do.’¤*T©6oóð»dë0  yæßDO.’¤Š”/Ù>ü®Ù: èhžüùè½E’T‘êüZø]²uÐÐ8þ¢÷IREjõ‰ð»dë0  ±üãÑ{‹$©"5OýRø]²uÐP?ä#Ñ{‹$©"µ.øÇð»dë0  ¾ß/Gï-’¤ŠÔ¾z¯ð»dë0  ßûç¢÷IREêÜvlø]²uÐ/Ú6zo‘$U¤îý…ß5 [‡} ¶ŠÞ[$I©÷ôñw H?É€>ˆ9³Rê¶£7IR*êÏÇß5 ý$ú€ŠÚ3Ñ›‹$©"ÕvyCø]²—ÐÔ{öÞè½E’T‘êû¼/ü®ÙË èê=r]ôÞ"IªHÃ?~×€ìeôuxnôÞ"IªHÍ“?~×€ìeôA¿€·½·H’*Rë‚ ¿k@ö2ú€Ú×-‹Þ[$I©}íÒð»d/3 ¨}é‚è½E’T‘:wž~×€ìeôµÎû_Ñ{‹$©"õ¹6ü®ÙË èjžú¥è½E’T‘Š¿k@ö2ú€Çý÷è½E’T•ºíT›³Iøm²>ú€‡î=·H’*T¾x»ðÛd}ôÕ—í½µH’*Tý€…ß6 ë3 (_²}ôÖ"IªPã>~Û€¬Ï€>¨ù[Do-’¤ Õ:çñ· H èCÚyôÞ"IªHí«ö¿k@Ög@‚bõ£Ñ{‹$©"uî8)ü®YŸ}zOݽ·H’*Rï‘ëÂïõЇ ûàåÑ{‹$©"kž¿k@Ög@‚îÝgDï-’¤ªTý_P}ۀ̀>”/â-GDÏ-’¤ UÿÞ/„ß6 3 CûÊ%Ñ[‹$©B5–ï~ۀ̀> ­ó¿½µH’*Tóô/‡ß6 3 CóäÏGo-’¤ ÕZ1/ü¶™}Ë?½µH’*Tç–åá· È èÃPßï—£·IR…ê>pIøm2ú0ä‹¶ÞZ$Iª·ê¾ðÛdô¡˜³IJ½NôÞ"IªJfÿ¶„ß7súpkžˆž[$I*_²}øm€q×1 GÑ[‹$©BÕýhøm€q×1 G÷¾ ¢·IR…jžò…ðÛã®c@ÒråÑÑ[‹$©BµVÌ ¿m0î:ôáh_µGôÖ"IªP[ ¿m0î:ôáhÿ¿£·IR…ê>xEøm€q×1 ÇÄ»j%IVÅêGÃoŒ»Ž}8GþAôÖ"IªRE‘jó_~ß 6Æ èCRßÿW£§IRŪïû‹á÷ jcÌ€>$ùâí¢wIRÅjóÉðûµ1f@–¹›¦ÔëFo-’¤ Õ:ç›ñ÷ f/úkŸŠÞZ$Iª}õÞá· jcÌ€>D½'oÞZ$Iª{÷á· jcÌ€>DÝû/ŠÞZ$Ijâf£oÔÆ˜}˜_Ì[ŒÞZ$Iªh­ ¿mPcô!j_¶kôÖ"IªXù¢w„ß7¨)ú5ÏúZôÎ"IªXõC>~ß 6¦ èCÔ8ö¿Eï,’¤ŠÕ<å/ÃïÔÆ”}ˆêû0zg‘$U¬ö¥óÃïÔÆ”}ˆò…ÛDï,’¤ŠÕ¹ýøðûµ1e@²ÔªEo-’¤ Õ{ìÆðÛµ1e@²Þ³?ŒÞZ$Iªh¼~Û 6¦ èCÖ}`EôÖ"IªXùîo¿oPCôaAo=*zg‘$U¬ú!ÿOø}€Ú2 ÙÿÏÞ}‡Ûu—wÞÆ–LÓ 0yÓÈCp˜ÀLBI˜B2’ð&d˜Ä”00 ÉP’£#[’›lã&w˲c¹7¹Ûr“ ®’«Ü»±p—Ûo÷½×z¯sL(¶l«œ½Ÿ½~ëþ\×ý¿-­gë+iîŠÑ;‹$)³ÚÇ!ü¾@ª!ú kŸü•èE’”YÝ æ‡ß7H5d@Ÿa­Ã?½³H’2«wýÑá÷ R ÐgXsŸßŒÞY$I™5X³*ü¾@ª!ú kìðúèE’”YEû©ðû©† èCPvÑ[‹$)³;½)ü¾@ªú ½-zg‘$eVë …ß7H5c@‚þ]çGï,’¤ÌjŸøÅðû©f èÃøA½æ°èE’”YÝ w¿ojÆ€>ÝÛGï,’¤Ìê­>.ü¾@ªútNùjôÎ"IʬÁ×…ß7H5c@‚ÖៈÞY$I¹Õk•irVø€T#ô!hîõ®è™E’”aÝ~9üÆ@ªú0l÷ò²,ŠèE’”Y­Ã>ã`¢> èCR<ý`ôÎ"IʬÎÿ~ß Õˆ}H÷]½³H’2«wå~á÷ RЇõ{Ý‘Ñ;‹$)³úw]~ß Õˆ}Hº+¶ÞY$I™U<õÃðû©F èCÒ^¶MôÎ"IʰƂ׆ß8H5a@’Ö’Fo,’¤ kîÿ_Ão¤š0 Ió{¿½±H’2¬}üÂo¤š0 ËÜ-ÊrÐÞY$I™5õ=6ÂoLÔƒ}ˆŠ'îÞY$I™Õ»ñ„ðû©& èCÔ¿{EôÎ"IʬÁC7†ß7H5a@æîÕK¢wIRnõ;ešœ~ã Õ€}ˆ:çÍžY$IÖÜýíá7R Ї¨}ü¢7IR†µ–~*üÆ@ªúµúpôÆ"IʰÎYÿ~ã Õ€}ˆ ·ŠÞX$IÖ[µ8üÆ@ªú0ÍÙ¼,{íèE’”Yƒû.¿q0‘?ú ½-zg‘$eVÑ~²Ls6 ¿q2g@²þígGï,’¤ k,|kø€”9úu¯Ø7zc‘$eXëÐÿ~ã e΀>d3¿½±H’2¬sÆ?„ß8H™3 Yké§¢7IR†õ®: üÆ@Êœ}Èš{¾#zc‘$eXÿÞKÂo¤ÌЇmîKËrЋÞY$I™U´¿q0‘7úkïŒÞY$IÖØùÍá7RÆ è#пý¬èE’”a­Cþ üÆ@ʘ}º—ï½±H’2¬sú¶Ù:8 IDAT7Âo¤ŒÐG`jà$i¦ë]¹_ø€”1ú´û£èE’”aý»/ ¿q2f@æ÷~-zc‘$eXÑx4üÆ@ʘ}&g—e¿½³H’2¬±Ó›âïLäÉ€>"ƒGo‹ÞX$IÖZü‘ð)SôéßrZôÆ"IʰΩ_ ¿q2e@‘î÷wÞX$IÖ½bŸð)Sôéœò÷Ñ‹$)Ãúw¯¿q2e@‘Ö’Eo,’¤ +š…ß8H™2 Hc×_ŠÞX$I™ÖØùÍáwR† è£2gó²ìµ¢7IR†Mý+§ð;ù1 Ðàᛢ7IR†uÎüfø€”!úõo>9zc‘$eXoÕ!á7R† è#Ô½x—èE’”aƒû¯ ¿q2d@¡öI½±H’r¬Û˜þ^ÑwRf è#Ô<ðÑ‹$)Óšßûµð;)3ôj,xmô¾"IÊ´Ö‘~ç eÆ€>bÅÓFo,’¤ ëœ7~ã eÆ€>bý».ˆÞX$I6uУo¤ÌÐG¬{žÑ‹$)Ãß~ã eÆ€>bÓ¾½±H’rlÐ+Ó¶/ ¿s2b@±Ö’EO,’¤Lkîó›áwRF è#ÖX¸Uô¾"IÊ´öñ~ç eÄ€>js6+‹ö“Ñ‹$)úíç`"ôƒû¯ŒÞX$IÖ¿õŒð)#ôˆôk‹ÞX$IVZK>½¯H’2­wÍ¿…ß9He@ß½¯H’2mðàõáwREÐÇDÑx$zc‘$娠W¦m_~ç U}Lôï^=±H’2­¹ßûÂï¤ 2 ‰îå‹¢÷IR¦µ—m~ç U}L´Oþrô¾"IÊ´îû„ß9Hd@Í~;z_‘$eÚà¾KÃï¤ 2 ‹y[–e1ˆÞX$I9ÖIeš³yü­€‰j1 ‘Á£·EO,’¤LkîñÃ金1 ‘Þêã¢÷IR¦µù‹ð;©b èc¤sîœè}E’”iÝ‹v¿s*Æ€>FZKÿ8z_‘$eZÿö³Ã金1 ‘Æ®ÿOô¾"IÊ´¢ñHø€T1ôq2g³²h®ÞX$I™ÖXøÖø[Õa@3ý»/ŒÞW$I™Ö:ü“áwR…ÐÇL÷²½¢÷IR¦uοs*Ä€>fÚ'ýmô¾"IÊ´Þ'„ß9Hb@3ÍýÞ½¯H’2­X{gø€T!ôq³ÝËËrЋÞX$I9VecûŸ¿u0Q ô14xø¦è‰E’”i­ƒ/üÎ@ªúê]tô¾"IÊ´Îÿ~ç U„} u–7z_‘$eZïšÃÂ金0 ¡Ö¿ý÷è}E’”iƒo¿s*€>† ß½¯H’rmÐ/Ó¼-Ão¤ 0 ©¢ñHôÄ"IÊ´æ¿~ç U€}LõïÆzW½¯H’2­wÕáwÒ˜3 ±©¿(IÒ0¬Y~ç 9úkîÿ_£÷IR®õ;eÚöçÂo¤1f@gÛ½¼,½è‰E’”iÍ}+þÖÀÄø2 ¹ÁC«£÷IR¦µ—m~ç 1ú˜ë]{xô¾"IÊ´Þ•û…ß9HcÌ€>æ:g~3z_‘$eÚàþ+Ãï¤1f@s­Å¿½¯H’r­×.ÓÜ-Âo¤1e@s¯-Ë¢ˆžX$I™Ö\´uø­€4¦ èP¬½+z_‘$eZûÄÿ~ç )zôV½¯H’2­{ù¢ð;iLÐ+ sοFï+’¤LÜwYø€4¦ èÐú·ÿ½¯H’r­Û,Óäìð[i Ð+ ±ó›£çIRÆ5÷~wø­€4† èQ<ý@ô¾"IÊ´ö ~ç !zEôo=#z_‘$eZ÷ò½Ãï¤1d@¯ˆîŠí£÷IR¦ùF¢ð’u2 WDû¨ÏFï+’¤œ¿‘èÜ-Âo¤1c@¯ˆÆn¿=¯H’2®¹Ïo†ß:HcÆ€^!Ez8z_‘$eZû¤¿ ¿sÆŒ½Bú·Ÿ½¯H’2­wåþáwÒ˜1 WHwÅ‚è}E’”iƒ5+Ãï¤1c@¯Ö‘½¯H’r­ß)Ó¶?~ë z…4vy[ô¼"Iʸæ~ï¿uƈ½bЧˆÞW$I™Ö9å«áwÒ1 WLÿ–Ó¢÷IR¦õV-¿sƈ½bºço½¯H’2mðÀuáwÒ1 WLké§¢÷IR® úeš·eø­€4& èÓØé¢çIRÆ5ü@ø­€4& èT>z_‘$eZïú£Âï¤1`@¯¨ÎòïFï+’¤Lï ¿u6’½æ:gýsô¶"IʸΩÿ;üÖÀÆ2 ×\ëàßÞV$I×»îÈð[i#Ðën»W”å ½¯H’2­xüžø[Ç€N9xàÚè}E’”q…[…ß:HÁ€NÙ»ê€èmE’”qí£?~ë m:eû¤¿ÞV$I×ýþîá·ÒF0 S6÷~wô¶"IʸÁýW†ß:HÁ€N™æl^í'£÷IR®õ»Óß´:üÞÀĆ1 3­×ùÑóŠ$)ãZÿ^ø­€´ èLë^´Sô¶"IʸÎ9ÿ~ë m :ÓZGþiô¶"Iʸþ-§…ß:HȀδÆÎoŽÞV$IW4×NÏè{€ÎOÞ½¯H’2®¹ç;Ão¤ `@ç'_ 7ž½­H’2®}Òß…ß:HÀ€ÎuÎþVô¶"IʸުCÂo¤ `@çÇZ‹?z[‘$eÜà‘[Âo¤ `@ç'æmY–ƒ^ô¾"Iʵ¢(;þ‡ø{ëÇ€ÎÏù+á·Ò‹0 ³Ný›NŠÞV$I×»viø­€ô" è¬Sgùw¢·IRÆOÜ~ë ½:ëÔZü‘èmE’”y]~1üÞ@ztÖ©1ÿUe9èGo+’¤Œkûùð{éÐy^ƒoˆÞV$I×½bŸð[éÐy^½U‹£·IRÆ ¼>üÖ@ztžW{Ù—¢·IRÎEÙØþuá÷žçÕ\´uô´"IʼÖ៿wž‡ç79«,:OGo+’¤Œë^¸cü½€‰u3 ó‚úw_½­H’2®ÏÅá·Òó0 ó‚º/ŒÞV$I9×k—iÛ—…ß;Hë`@çµúLô´"IʼÖA¿wÖÁ€Î jìò¶è]E’”yåß ¿wÖÁ€Î‹*žZ½­H’2®ëéá·Ò:ÐyQý›NŠÞV$IW´ž(Óä¬ð{éY 輨ÎòïDo+’¤Ìk.Ú:üÞ@z:/ªµø#Ñ»Š$)ó:§}=üÞ@z:/ª1ÿUe9èGo+’¤Œë­>.üÞ@z:ëeðà ÑÛŠ$)ãŠôp™æl~ï ý:륷òàèmE’”yÍ=ß~ï ý:륽ìKÑ»Š$)óÚ'9üÞ@ú)tÖKsÑÖÑ»Š$)óz×. ¿w~Šõ39«,:OGo+’¤Œ+žüAü½€‰Ÿ0 ³Þúw_½­H’2¯±Û¯„ß;H?b@g½u/^½«H’2¯}Âÿ ¿w~Ä€Îzkõ™è]E’”y½U‡„ß;H?b@g½5n½«H’2oðØá÷ÒÐÙ ÅSk¢·IRæ5vy[ø½€d@gCõo:)zW‘$e^ûØ¿ ¿w èl¨ÎòïDï*’¤Ìë]¹_ø½€d@gCµ$zW‘$eÞà¡Ãï$:ª1ÿUe9èGo+’¤œ+в±ãÃoô èl¨Áƒ7DO+’¤Ìkù?Âïô èl¨Þʃ£wIRæu/Ý3üÞTÒ¶?W6÷~wüÇD èl°ö²m¢wIRæ ~xuø½¨‚ÆÎo.ÛGÿYÙ½t²ÏÅeÙk•Åã÷„ÿw¥LÐÙ`ÍE[Gï*’¤Ü+ecÁkÃoÀ¸å­Ã?YvΛ[öo>¥,®û·TO?þßš2a@gÃMÎ*ËNñ’"Iª[­¥ŸŠ¿yA ^S¶ùƒ²³ü»eÿ¦“ÊâÉû×û÷SEûÉðÿþ” :¥÷…CœL$I*Ëî%»†ß;€‘˜œ]6÷zWÙ>þ¯ËÞU”ƒ‡VOÿËܮ߉ÿšÈƒÒ½xáÌ-$’$­£ÁšUá÷`$ï-ï6gü÷TSo‘ˆþÿL0 ³QÚG}fÆQK’ôœ÷ oÿóá7`fß[þÈH~K•æmþÿž2`@g£4n5’_è’¤z×:âÓá7`}5æ½²løÁ²sú7ÊÞ5‡=ó*– ;¼>üÇ#eÀ€ÎFÛo\ IÒÆÔýþîá÷àÅÞ[>õ*–Áš•›öÞònê/À†ÿMTŸÖ¿ñÄèç€$)ó?¼&üÞüô«Xºí4´÷–ÏdÍÝßþc–2`@g£u–'ú9 IªÃ{ÐwxCøÍꥱàµekÉGGþÞò™¬¹÷o„ÿ8¦ ÐÙh­Å‰~H’jPëÈ? ¿y@¾Æé½å3Ysÿÿþc›2`@g£5濪,ýèg$)óº—î~ó€Œß[žé¾Õ:øwã¼'ªÏ€Î&ñ‹ñ?wÕg@gÓLÎ*‹ÎÓÑÏIRæMým’ð›Œô½åÓ¯b¹ãœZ½·|&ëœòÕðŸË”:›¬÷…ÑÏIRÞƒ¾Ó›Âo0³ ^óÌ«XÎþöÞ[þPôï>²©sæ7Ã~S èl²îÅ £Ÿ’¤Ô>æÏÃo°‰ï-?èCÓÃnïú£Ëbí]Ñ¿ÍȺÎ9ÿÿs>Q}t6Yû¨ÏD?$I5¨{žá7XOÞ[^÷ümã¿&ªÏ€Î&k,Ü*úy IªAƒ‡o¿yÀz¾·¼“¢ QûºÌÿºH0 3#Š'ï~&H’jPcç·„ß<¨»ç¼·ü飫 uÔ½p‡ð¯•”:3¢ã‰ÑÏIR jûù𛵲Ý+žËÏøÇ²wÝ‘åà±;¢[ õ¬{ÑÎñ_?Õg@gFt–'ú™ IªA½•‡ß<¨Õ{Ë{íèßh#ë^²kü×ÔDõЙ­Å‰~&H’jPñø=á7²|oùÔ«Xšk£?òkë~÷𯱔:3¢1ÿUe9èG?$I5¨±Û¯„ß=¨šÆüW?ó*–Ó¿1=zoyþu/Û+üë.eÀ€ÎŒ9ü×LÊ€7õ§[’$ ½~§Ló¶ ¿{Ôä½åG£?KTÿ–ÓÂ¥ Йq³¿ý|$Õ¤Ö¡~÷¨¾ÆüW—­Cþß²³ü;Ó1п®Wõo;3ü×VÊ€×Zü‘èçƒ$©&u/Ú9üîP1Þ[®šÔ¿õŒø_oÕg@g(ßmºô£Ÿ’¤4X³*üî0ÆælV6÷øÓcy÷²½ÊÁ./Ë^;úc¬4’¼Âå%3€ÎP ¸.ú!IªCÅ lìð†ð»À¸¾·ü‘èO¬RX¾‰èKf„¡˜ú'P’$¢öQŸ ¿{Äü ø©×ÈN}/¶Þ'”Å÷E4•ƪþM'…ÿ:M0 3í¿ýŒ$Õ¤Þ•û‡ß=F÷Þòî¥{”ƒ5+½·\z‘z«ÿµ;Q}t†¢¹ç;¢Ÿ’¤šT<~wøÝ`8¯bé^´SÙ¿çâ²ì6£?vJ•«wÃ1á¿–S è ÇœÍÊ¢ùXôsB’T“š»¿=þö°Q ^[¶–|ô'ï-OG¼”²¨wݑ῾S è Mÿ¶3£Ÿ’¤šÔ9õkáw€ט÷ʲuàËÎéß({×VZ]–EýqRʲ޵KÃͧ К©?9–$iõoZ~÷xá÷–O¿Š¥ßþè(Õ¦©?¤ LTŸ¡iú‡ÑÏ IRM*ÚO•iîᷠΞûÞòFôÇD©Öõ®^þ\H0 3Ôw˜ùŽØ’¤QÕ:èCá· . ^ã½åÒ˜×[ypø³"eÀ€ÎP º1úY!IªIÝó· ¿{Yš·¥÷–K¬wÕñωê3 3T½U‹£Ÿ’¤š4¸ï²ð»Py“³ÖñÞòNôG=IQïÊýâŸ)Õg@g¨Ú˶‰~VH’êÒ _6¶]øí¨â{˧_ÅrÇ9Þ[.eT÷òEáϘ”:CÕÜû7¢Ÿ’¤Õ>ê³á·`¬ß[>õ*–³¿ý£÷–?ýñMÒë^¶Wøs'eÀ€ÎpÍÙ¼,ZOD?/$I5É;þ~dîesßßòÞr©Æu¿¿{ü³h¢ú è Ýô?“$iß~÷Æâ½å½vôG3IÁu/Ù5þù4Q}t†®{Áüèç…$©F5w{øíÙ{˧^ÅÒz<ú#˜¤1¬{ñÂðçUÊ€¡kþ‰èç…$©FuNýZøí˜)^_¶û£²sÞdÙ¿å4ï-—´Þu/Ü1ü–2`@g$ÇÞ{Ö$I£ªÓ²ðÛ°Q¼·\Ò 6õ¯TŸkÕg@g$ÞýÌ$Õ¤¢ýÔôo>£oÀ òÞrIC®sö·ãŸuÕg@g$¦þä\’¤QÕ:øwÃoÀOkìò‹eû¨Ï–Ý‹w)ûw¯(‹ÎÓÑ™$e^çôÿþìK0 3S¾ýÌ$Õ¨î…;„ß> ¾ó_]¶üà3¯b¹áزxúèG’jXûä/‡?S èŒDsŸ÷F?3$I5jðÃkÂoP£÷–O½ŠeÙ—~ê½åƒèC’T¶ÿBü3r¢ú èŒÆä,ÿ’´ÎÚG.ü™™2`@gd¦Þñ&IÒ¨jŸøÅðÛT[cç7—­Ã?YvΛ[öo>¥,šEÄ‘¤õ®µôSáÏÑ”:#Ó½pÇèç†$©Fõn8&üöÕјÿªŸ¼·üšÃÊbí]Ñg$i“j-ùXø³5eÀ€ÎÈ´ŽøtôsC’T£ŠæÚ2MοÀ¿·üø¿.{Wà½å’²¬uЇ㟷Õg@gd;¾1ú¹!IªYS‹,úþñ¼·\Rkî÷¾ðçoÊ€‘òOà$I£¬{ÁüðÛ¿·¼ñhôGI ©¹÷»ÃŸÉ)tFªwÝ‘ÑÏIR¬Y~û€áñÞrIzþšßûµðçtÊ€‘šúP#IÒÈ*Šé¿…}ÿ€09Û{Ë%ij,|kü³{¢ú èŒTs¿÷G?;$I5«}üÂï°á¦þ¼}ôŸýä½åÝfôÇ IªT^þ,O0 3Zs·ð¡G’4Ò¦^~ÿ€ä½å’4ó¥y[†?ßS èŒ\ÿÞK¢Ÿ’¤U4+Óä¬ðû<£1ï•?óÞòéW±H’f<¿zÉŒ0 3rÝKv~~H’jVó€ß¿P÷÷–O½Šeê|{o¹$ ~'þLäÁ€Îȵúlô#D’T³ºço~ÿ N¯bé^´“÷–KR`EûÉð›2a@g䦾°$I£lpÿ•á÷²Ë—þqÙ]± ìß~vY´>ù’¤U<õÃð;‘2a@'DñøÝÑÏIR*ec§_¿PUÞ[.IÕjððÍá·#e€NˆÞµK£Ÿ#’¤šÕ>ñ‹á÷*ûÞòA?ú”K’6 Á®ˆ¿'y0 ¢sÊW£Ÿ#’¤šÕ[}|øý€qä½å’”_ý;–‡ß—” :!š‹Þý‘$Õ¬¢ót™¶ý¹ð‘ ^[¶–|´ìœ7·ìß|JY¤‡£O´$iù D/™1tbÌÙ¼,ZOD?K$I5«µäcñ7FeÞ–Ï}oyQDŸcIÒê­:$þMäÁ€N˜þígE?K$I5kê=®Ñ÷†brÖϼ·|úU,ýNôé•$Õýþîñ·i"tÂtΛŒ~–H’jV±öÎðû3ùÞòéW±ÜqNYvÑgV’4FuÏß.üV¥LÐ Ó:䢟%’¤ÖÜóá76Èv¯([‡bz éßzFY4>§’¤1¯sÖ?Ç߯‰<Љ3o˲ô¢Ÿ'’¤šÕ9ëÿÆß@ØSßÃC’¤ ©½l›ðû•2a@'Ô`ͪèç‰$©fõï^~ÿ`C´þ³èó)IªXícþ<ü~¥LÐ Õ½l¯èç‰$©n úec‡×‡ß@X_íe_оž’¤ŠÕ:ìãá÷+e€N¨©? “$iÔµýËðë«sö·¢O§$©b5ü@øýJ™0 ª±ð­ÑÏIR ë]»4üÀúê®Ø>útJ’*Vsïw‡ß¯” :áŠ'î~¦H’jVÑ|¬L“³Ão ¬îûDŸNIRÅjìò¶ðû•2a@'\ïº#£Ÿ)’¤Ö:èÃá7ÖGïº#¢Ï¦$©b5¼&ü~¥LÐ ×9õkÑÏIR ë^´sø €õÑ¿å´è³)IªREQ¦9›‡ß¯” :ášû¼7ú±"IªaƒGn ¿°>ú÷~?úlJ’*TÑ~*üv¥ŒЉ79kú¶$I£®¹ç;âï ¼ˆÁ#·FŸLIR…šú~ƒÑ·+eÄ€ÎXèß±<úÙ"Iªaåß ¿ðbŠÖãÑ'S’T¡kV†ß®”:c¡sÞÜèg‹$©† î»,üÀ š»Åô»l%IZßú·Ÿ¿&òa@g,´–|,úÙ"IªcEQ6¾5üÀóiìü–èk)IªX½k—†ß¯”:c¡1ï•e9èE?_$I5¬}ò—Ãï <Ÿæ¢­£O¥$©bu/Ý#ü~¥ŒÐƒ^ý|‘$Õ°þ­g„ß@x>­%>•’¤ŠÕ9w"ü~¥ŒÐÝËE?_$Iu¬×.ó_~`]ÚÇþeô¥”$U¬öÉ_ ¿_)#tƆ†’¤¨ÚG.üÀºtNÿFô™”$U¬öQŸ ¿_)#tÆFc—_Œ~¾H’jZïº#Âï ¬K÷‚ùÑgR’T±Z‹?ü~¥ŒÐ+Å÷E?c$I5¬h=Q¦¹/ ¿ƒðl½«—DŸIIRÅjîõŸÂïWʈ±Ò»þèègŒ$©¦µ–|,üÀ³õo?;úDJ’*Vc§7…߯”:c¥sÚ×£Ÿ1’¤š6õͬ£ï <Ûà¡ÕÑ'R’T¥Š¢Ls·¿_)#tÆJsßÿý˜‘$Õ´âÉûË4g³ð[?­h=}"%Iªh® ¿])3tÆËäì²è<ý¬‘$Õ´æ~ï¿…ðï¶{yôi”$U¬Ác·Ç߯‰¼Ð;ý;Ï~ÖH’jZ÷¢Âï ü»æîo>’¤Š5¸ïÒðû•2c@gìtÏß.úY#IªiÅÚ»Âï ü»ÖÁ¿}%I«óÉá÷+eÆ€ÎØiúߢŸ5’¤×Üç½á·¦´ý|ôY”$U¬ÞªÅá÷+eÆ€ÎØiÌuYúÑÏIRMë®X~ `JçìoEŸEIRÅê^¼0ü~¥ÌÐKƒ5«¢Ÿ7’¤š6xäÖð;SºWì}%I«sæ7ÃïWÊŒ±Ôýþ÷¢Ÿ7’¤×ÜûÝá·ú·}%I«}Ì_„߯”:c©uÄŸD?o$I5®sÞÜð[ƒGn‰>‰’¤ŠÕ:èÃá÷+eÆ€ÎXjlÿº²,ÑÏIRMƒ’¤ŠÕ]±}øýJ2 3ÖÚÇýUô³G’Tóš{üzø= ~¦¾œ$IR甿¿_)CtÆZcáVÑÏIRÍëœ;'üP/ß}þ$I¬uħÃoXʱW¬½+úù#Iªqƒ‡o¿…ÔKë GŸ?IRkî÷þð–2d@gìõ®>4úù#Iªyͽ#üPíeÛDŸ>IRk,|kø K2 3öÚ'þ¯èç$©æuW,¿‡ÔG÷’]£OŸ$©j úešœ~ÃR† 茽æ÷~5ú$IªyÅÚ;Ë4g³ð›@=ôo95úôI’*VñÔšðû•2e@§Š'ï~I’jž÷ 0*ƒÇn>{’¤Š5X³2ü~¥LЩ„ÞuGD?‡$I5¯{Éná÷€˜·eYƒè³'IªXý›OŽ¿ay2 S í“¿ý’$Õ¼é9góð›@ÞšüvôÉ“$U°î¥{†ß°”):•ÐÜóÑÏ!I’ÊÖA¿‰ä­½ìKÑçN’TÁ:güCø K™2 S s6+‹ôPô³H’TóºWìÈZ÷òEÑçN’TÁZGüIø K™2 S½ÕÇG?‹$I5¯H—irvøM _ý{.Š>w’¤ Ö\´uø K™2 SÓ¿ý,’$©lú‡á7€ŒÿåmëñèS'Iª`¯‰¿cy2 SS’&IRt½k—†ßDòÔØõ—¢Ïœ$©‚͵á7,eÌ€NuÌÙ¼,šE?“$Iu¯Û(ó_ÈNkéG_9IR¬Y~ÃRÆ èTJÿæ“£ŸI’$•íþ&ü&ŸÎy“Ñ'N’TÁz7ž~ÃRÆ èTJ笎~&I’Töï<7ü&Ÿþ­§GŸ8IRë^²kø K3 S)ÍýÞýL’$©,‹AÙØåmáw€¼é¡è 'Iª`Sÿwø K3 S-“³Ë¢ýTôsI’¤²sö·âï"Ùhìö+ѧM’TÑZ‡"üŽ¥ŒЩœþígE?—$I*Ý~ÈGû˜¿ˆ>m’¤ŠÖÜë?…ß±”1:•Ó9ç_¢ŸK’$M×Üç7Ãï"yè^²[ôY“$U´Æ¼W†ß±”1:•Ó:ðƒÑÏ%I’¦›;¢ï"yèß{IôY“$U°©ïŸ}ÃRæ èTÏÜ—–e·ý|’$陫“³ão#Õ69»,;)ú¬I’*Øà—Çß±‰¼Щ¤þçE?Ÿ$Iš®uØÇÃï"Õ6õJ0I’6¦ÞõG‡ß±”9:•Ô9wNôóI’¤é|``SuNûzô9“$U´îE;…ß±”9:•Ô:èCÑÏ'I’ž©ß);¼!ü6P]½ÕÇG_3IREkŸô·áw,e΀N5ÍÝ¢,:OG?£$Išnêo†ßFªiÎfÓßSC’¤iê/™†ß²‰¼Щ¬þmgF?£$Išnðàõáw€jjîùÎè3&IªpÿCø-K™3 SY³¿ýŒ’$éÇ5÷ýÏá·€êiŸüåè&IªhEó±ð;–jÀ€Ne5÷{_ôsJ’¤×½|Qøm zz×.>a’¤Š6¸ïÒð;–jÀ€NuMÎ*‹æÚèg•$IÓ­'Ê´Ý+âï#•R«àÝû.Ÿ’¤Ñ©yÆßE.FXãø? ŸeÙd®‘®~ÐÛ£Ï*øOe™êû½1|>J’F£Îm§DO.FXýÀ·…ϲl ²@×h7gV*7¬Œ>¯àíKÄÏGIÒðç;ØE7eówŒŸg³«ŸºF¾Î-'DYðŒrÝÃ)›»]ø|”$ w#Þ=²aÅš{ÂgY6&Y käkžñéè3 ž¥qÜGÂç£$i¸kgaô¸`„u—Ÿ>˲1É]#_}¿7EŸYð,Ý»Ï Ÿ’¤á®xäûÑã €Öþî¾á³,“,ÐU‰ÊµDŸ[ðì/ÝÿÍáóQ’4œå‹_šRYDO+FØÄ¢çY6&Y «unøzô¹ÏÒ¾biø|”$ gÍoý¯è1Àˆkùþðy–IèªDÍS>}nÀ³”Ùê”Íß1|FJ’†¯ÎMÇD)F\¾ô•áó,“,ÐU‰ò½^}nÀFšßúxøŒ”$ Yó¶Oecmôˆ`„•§âçÙìñÉ]•©X}GôùÏÒ}àŠðù(I®ßø½èñÀˆë>øÝðy–QèªLí«ˆ>¿`#õƒ~1|FJ’†§Î÷‹MŒ¸öµ‡†Ï³lŒ²@Wejûáèó 6Ò¾æ ð)I’æl“Êõ+¢G#®uÖgãgÚìñÉ]•)_¸kJÝvôÝŸ0ßýùásR’_ýð_‹KT@ã«ÿ-|¦ec”º*U÷+£Ï0ØHëÛÿøŒ”$Å×¾rïè‘À¨+Ë”/zQøLËÆ( tUªÖ%s£1ØHñÄÝ“¶='%I±ß=’qåÚÂçY6fY «Rù“H†Uã›>'%IqÕ~gô( ºË¿>Ó²1Ë]Õjî¶©¬?}–ÀFº÷œ?'%Iaµ¯Ü+zPíË…Ï´l̲@WåêÞqzôY+ËT?à­ásR’МmRùÔCÑ“€ hžô±ø¹6{¼²@Wåšø¢6Fï>'%Iƒ¯ñµßŽAT„åÔžº*W}Ù[¢Ï2è­§|ñKÂg¥$i°u®?*zPfÊæn>ײ1Ë]•¬\{ô‘=µ.øBøœ”$ °ù;¥²±6züPÅŠëãçÚìñË]•¬óƒ#£Ï4è©|êAŸ‘¤1ªyâG£Gѹáëás-Ã,ÐUÉ&¾P†UóÄ?Ÿ•’¤ÁÔ½ãôè±@E´Îû—ð¹–aèªdùâ—¦TÑçôT•§¢Ï7ؤÎ-'ÄÏKIҌԹõ¤è1@…´/]>Û²1Í]•®{ÇÑçlZÑMõýÞ>/%Iý-_üÒ”:Íè)@…4Žýpø|ËÆ4 tUºÖYŸ>ß`³Ú×>/%Iý­uÁ£Ç “ïùªðù–ièªtù>¯>ß`óÚyÊ—¼,|fJ’ú”/ ÏÊuÇÏ·Ù㛺*_ñøòès6«ý…áóR’ÔŸG0z¬P1·(ŽžoÙg®Ê×¾zYô9›U6×¥|Ÿ Ÿ™’¤­¯{ßÅÑc€Ši]ôåðù–qèª|£ÿ úœ€çÔ¾t~øÌ”$m]õƒß‘RYF*¦ñߟqÙg®ê·`ç”Úõè³6«l<åSè’4âun:&zœP5e™òÅ/ ŸqÙg®±¨{ÏÑÇ<§Ö%sÃg¦$izå{½:¥n+z”P1å“÷…ϸq¯c®q¨uÞ?GŸwðœÊÆÚ”/zQøÜ”$myí+÷Ž#TPçÖ“Âgܸױ@×8T?ðmÑçL‰/’¤Ñ+_¸ëä­¸ ßZçÿ[øœ÷:è—ʵDŸyðœÊúšÉELôÜ”$M=ñ ÀLiõ[ásnÜëX k\ê\wxô™SÒºè?Âç¦$iŠÍß)•ëWDª¨,R¾è…ñ³nÌëX k\jÿ§ÑÇLý^è{¼8|vJ’ž»Ö9Ÿ‹TT±úÎð9§šºÆ§|á Rê¶£Ï>˜’öåKÂg§$i Ÿ>_÷HôÈ ¢:7?ë”,Ð5Vuï¿,ú쀩iç)ßógÃg§$iÓµÎýÇèi@…µÎþ‡ðY§šºÆ«‰o.€QÑùþaá³S’´‰Üû€V?ä]ñóNÉ]cUýÀ·EŸ}0uE'Õø…ðù)IÚ¸Öyÿ=%¨°²µ!es· ŸwªY kü*ÖÜ}À”un9!|vJ’~ª;ûô93ª{ï…ñóNi" t]íï}ÀÔ•eªúîðù)IúÏÜ€™Ö¾t~ø¼Sm2 t]£?}ÀéÞsAøü”$ý¨|ñKSÙX=¨¸Æ×ÿ{øÌSm2 t_ówœ¼Œ’Æ1ŠŸ¡’¤Ô¾æàè‘@ÕÝ”/Ü5|æ©6™ºÆ²îgF…°EŠÇ—§lÞöá3T’ƹú²ÝRê¶£GW¬¸>|æ©öLèËšg|:ú,€-Ö:çóá3T’ƹîòoGÆÀÄ÷÷EÏ<ÕžÉ]cY¾ç«&¿” FIYròÞ»ÑsT’ƱÆQ¿=Í“>>÷T{& tmÅ£7FŸ‡°Å|E’š³ÍäŸÓÀ ä{ÿ\üìSúqèÛÚßY}À–+:©~À[Ãç¨$SÍÓÿ6úô`L”O=>÷T{VèÛê‡ÿZô™ÓÒ½û¼ð9*IãR¾Ç‹S™­Ž>ú›Ÿ}ª=+ tos¶Ie¶*ú\€iiÿ§ñ³T’Æ ÎõGEùŒ‘ÖYÿ7|ö©öì÷èç:7~3ú\€i)×=œòÝŸ>K%©Ê5¾úßR*Ëè#€1R?øáóOµge®±nâ[`Tµ¯Ü;|–JRe›·C*VÝ}Ô0FÊæº”ÍÝ6~*ýdèëòE/J©ÛŽ>`ú_(zÐ/†ÏSIªb­‹gGŸòŒ™î=ç‡Ï?Õ6Ê]c_÷¾K¢ÏG˜¶îƒßMÙœYáóT’ªT}¿7¥ÔiDñŒ™Ö_Ÿªm”ºÆ¾Ö9Ÿ‹>`«4Oûdø<•¤*Õ½÷¢è£€1T?ô—Ãg je®±/ßçõÑç#l•2"åK^>S%© 5OÿÛèc€1TÖŸtÿóÙÙº4»–Š•7EŸ“°Uºwœ>O%iÔË÷}C*›ë£tÆP÷öÓÂç j=³@—f×RûÒÑç$lµæ >S%id›³MêÞyôQÀ˜j}ûïãg¡R¯,Ð¥‰/ :ôÝÑç$lµ2Ü­\$išµ.úrô1À«ðÖðY¨ZÏ,Ð¥§+×Þ}VÀVëÜ|\øL•¤Q«~È»Rê¶¢pÆT¹á±”Í™>U뙺ôtíkŠ>/ /ÇÿIø\•¤‘iþN©xìÖ裀1ֹ騸y¨´©,Ð¥§k|ýw£ÏKè‹rý£)_ü’ðÙ*I£PûêeÑÇ6c®yÚ'Ãç¡j›Ì]úqó¶Oecmô™ }ѹýÔøÙ*IC@w§E IDAT^ãØ§T–ÑG6c.ßçõá3QµMf.ýD›>3 oš§ÿmøl•¤a-ßçu©ÌŸˆ>ªså“÷…ÏDÕ6›ºô5OúXô¹ ýÓÊR}ÙnáóU’†ò¾ç+~}J@ê\wDü\TÚ\èÒO”ïþü”:Íè³úfbA”ÍÛ!|ÆJÒ0Õ¹þ¨èã&5Oú‹ð¹¨Úæß7X KÏ®{ÏùÑg'ôUû²EáóU’†¥‰Û[ÀP(Ë”/}eølTm³Y K?Uë¬ÏFŸÐ_E75¾öÛá3V’¢«ò®”ÚõèS&Ý>U{Î,Ð¥Ÿ*ßëÕ“ÿª¤ÜðXÊ÷üÙð9+IQå{üÌäµÀ°h_µø|Tí9³@—zT<òýè3ú®{ÿå)›»]øœ•¤7oûÔ½ïâècž¥ñß‹Ÿ‘JÏ•ºÔ£Ö_Œ>C`F´¯Ø3|ÎJÒ ë|ÿ°èãž­•¥lþNá3Rµç~a.m\¾ïÏG£03Ê25Žÿ“ðY+Iƒªuá—¢O^ØH÷γÂg¤jSÊ]ÚDÅÊ›¢ÏR˜eýÉTßïá³V’fºæ‰õýF ¥ÖYŸ Ÿ“ªM) tiµ.ž}–ÀŒ)Vß™òE/ Ÿ·’4SÕ{OJí<ú¸€žò}^>+U›RèÒ&ª/Û-ú,€Õ½û¼”ÍÝ6|æJR¿›XJ”‹>f §bÕíá³Rµ)g.m¦bõÑg*̨öå‹Ãç­$õ³|ñK¼`¨µ¿»Oø¼TmÊY K›©ý…Ñg*̬²LÍo}<|æJR?ʾ \}²Àf5¾öÛá3Sµ)g.m¦ú!¿}¦ÀÌk×Sý+¿>w%i«Z°Kê>peô‰ ›U6×§lÞñsSiªY KÏQ±æžè³f\™?žêû¿9|îJÒ´š·CêÞunôQ Ï©{ûiñsSiK²@—ž£ö{FŸ­0Åš{S¾äåá³W’¶¨¹Û>sa îyÆßÅÏN¥-É]zŽ&þ¤ÆEñ𵓷Aˆž¿’4¥æl“:7}tÀ”å{¿6~~*mIèÒs5gV*Ÿz0ú|€éÜ~êäR*|KÒæš3+u®;"úÈ€)+»%~~*mièÒj_µô Õ¾öÐðù+I›½mËõGE•°E&n>C•¶4 ti 5¾úÑg, \ûò%á3X’6jÞîyÀHjù›ñsTiK³@—¦ÒœmR¹~Eô9 ׺ðßãç°$ý¸ù;¦î§G°ÅÊü‰”ÍÝ.~–*mièÒk_spôY ƒW–©uÖgÃç°$å wMÝû/‹>`Z:7|#|–ª6­,Ð¥)Ö8òýÑg-Ä(‹Ô<åá³XÒø–ïñâT<|môiÓÖ8î#áóTµie.mÉm\Ö=}Þ@Œ¢›š'ÿUü<–4våK_™ŠÇn‰>`úZYÊì>SU›VèÒÔ¾j¿è#b—è>‰.i€Õü/©\{ôé[¥sÛ)á3Uµig.mAõ¯ü×è3bY¢KP¯ÿn*k£O=ØjÍ“ÿ2|®ª6í,Ð¥-iάT>ùÃèsb¹‹¤®yæÿI©èDŸv°õºí”/zQølUmÚY K[Xûò%ÑG/Ä+ËÔ:ûÂ粤Š5gVj]2/ú„€¾éÞs~ü|UÚš,Ð¥-¬~È/EŸ½0ú8€þ*‹”ïùªð9«ÚVe.M£ö¥ó£`*í«ö›¼õBôŒ–4¢_š­Š>Ơ®Ÿ³ªmuèÒ4ª/Û-ú €¡Ó¹í””Íß)|NK¡û_ðÅÉ/&€*r»ÃZ%²@—¦Y±ò¦ès†N÷‡—¦|Ñ‹Âç´¤á._ü’Ô½ëÜè# fT}Ù[Âg®j[º4ÍZ~)ú€¡T¬º-å{¿6|VKÎꇽ'•kï>ª`F+oŸ¹ªõ% tišåû¾!¥²Œ>`(•ëW¤ú!¿>¯% WÍ3>R·}DÀŒ›øþ¼è¹«Z_²@—¶¢âák¢ÏcZecmjõðy-i8nÙÒ¹ýÔèc ¦~ð;Âç¯j}É]ÚŠZçþSôy íÛJÍo}<|fKŠ«ñßOåºG¢O#˜bõáóWµ¾e.mEùž¯J©,¢Ïene™Z—Ì ŸÛ’Ü‚]Rûêen{ÀØi]<;~+õ+ ti+ëþðÒèsFBçºÃS6ÇðÙ-iækùþT>ùÃècBÔ÷sø,V­oY K[Yó´OFŸË02Š?Hù>¯ Ÿß’f¨ù;¥öKS*ºÑÇ „(¹.~+õ3 ti+˾ ¥v=ú|€‘QnxlòÓ©Ñ3\R«öžT¬º-úˆ€P­óþ%|&«Ö×,Ð¥>Ô¹åÄèóFKÑI­ ¾>Ã%m}ù¢þè^ç>uÀ¸+‹”ïõšðÙ¬Z_³@—úPã˜?Š>¢`$un>>e»?/|–KšþûàrÝÃÑG …îý—‡ÏfÕúžºÔæmŸÊlUô9 #©xôÆ”ïûóñó\Ò”«ð ©{ß%ÑÇ •ÖYŸ ŸÑªõ= t©Oµ¿w`ô9 #«l®KÍ3>>Ï%=G vN­Kæ¥ÔiF0\ŠNÊ—¼<~V+õ; t©_šlÎí§¦|ñKÃ纤kûÇ©\{ô1C©{Ïùá³ZµÉ]êcŪۢÏky·E›XÔEÏuIÿùA‘î/>`¨5Oùëð™­ÚŒd.õ±ÖE_Ž>¯ 2:7òÝŸ>ߥq-ßûµ©sÝá)•EôqíÓHù¢†ÏnÕf$ t©åû¼ÎôÑÄí"G¾?|ÆKãT¾ø%©}ÅR÷9€-¸ aôüVmƲ@—ú\÷þË¢Ïm¨–¢›ÚWîíÓèÒL·`—É¿¨œøR_`êš'~4~Ž+ÍTèRŸkžþ©ès*©\÷pjžðgá³^ª\óvHÍ3?“Êõ+¢_æ0r&þÃóÄ„ŸçJ3•ºÔçò…/H©]>¿ ²&¾Ì°~àÛÂg¾4òÍß15Ïøt*Ÿz(úe #«sÝñ3]i&³@—fð…Ìn;µ¯^æ¶.Ò4šxÝ´Îù\*×?ýJ€‘W?ü×Âg»j3šº45Žýpôù c¡\÷Hjžò‰ðÙ/Ê_J¶.øb*ëk¢_ºP Åãw¥lάð¯ÚŒf.ÍDó¶Oå†Ç¢ÏqÝ»ÎIõÿKü{iË—¾2µ¯Ü+•­ Ñ/U¨”Ö…ÿ>çU›ñ,Ð¥ª}åÞÑç8Œ—²˜|s›ïóºð÷Ò0T?ôÝ©sÝá)µóèW'TOY¤|ïŸ Ÿ÷ªÍxèÒ U?à­ÑG9Œ§vžÚ—í‘òE/ ? ¼y;¤æ·>žŠ‡¾ýJ€JëÞunüÜWDèÒ æÂâ”Íõ©}ÅR‹tEùÒWüèþæëŽ~éÀXhžøÑðù¯Ú@²@—f°æéŸŠ>Ï`ìM|abë¢/§|á®áï ¤~×8â}©sË )uÛÑ/5«÷—ÙüÃߨ6,Ð¥lâB=µ²èsxúB§ýÝS¾äeá來þ´ù¹ÿ˜Š•7E¿¬`,µ¯98üý€jË]šá:7|#ú\~R§™:7êû½)ü}‚4åæï˜ÇüÑ.à|ÚBÕýåø÷JƒÊ]šáG¾?ú\zé¶'o}Q?ü½áï¤M5ñül_{h*ëOF¿b€”RñØ-áïThèÒL7gV*ž¸;ú|6£xøÚÔüÖÇS6o‡ø÷ûò½.µ.úT<¾<ú¥ü”Ö¹ÿþ^Aµf.  Ö…_Š>߀)(×?šÚ—-Jù>¯ÿ ñ*ß÷çSëüMÅCW§T–Ñ/ —n;åK^þ¾Aµf.  |¯W§Tt£y`ªÊ"uï½(5OühÊæmþ^B^šŸó¹Ô}àJKsÝ;Nÿ ÚÀ³@—TwùÙÑç<0 å†ÇRûªýSýw…¿ŸÐè7ñ¥cíËöHÅê;£ŸÚÀšøBïè÷ª < ti@5ÿÓèsØJÅc·¦Ö_Hù^¯ o¡iÁ.©qôSûêe©\û@ôS˜¦‰9žÍÝ6þ½…Ò ³@—Õ¼R™­Ž>ï€>)VÝ–Z—ÌKõýÞÿ>CCwk–æŸNÝ;ÏJ©Óˆ~ª}0ñßÑï1T É]`í«ö‹>ï€~+ËÔ}ðªÔ:ï_R}ÿ7‡¿ßÐàË—¾"5OþËÔ¹ñ›©Ü°2ú ô[·•ò¥¯ Ï¡ZHèÒ«ôöè#˜aÅãËSûʽRãÈ÷û3ߊ–/zQj|óSûŠ¥©xô_ ×¹åÄð÷ª…e. ¸‰O¨ã¡lmHÝ{/J­s>—ò}ßþ>DÓ+ßóU©yâG'ïc^¬øAJeýÔ¨qÔÂߨ–º4àš§|"úÜ‚kîIíkMÍ“þ"å{þløûõhî¶©~è»Sëì˜ü´Y¹î‘è§ ¨X}GÊæÌŠ¢•º4èæï”Êü‰èó’…z熯§æ©“êü‚‹³A7gÖä—ÀN~ºüò%“-P6×G?-€!Ò:çóñïY”"³@—jwŸèóBeã©É%nû²=Rã¸ÿ‘ò½^þ¾¥2Íß)Õy×ä_¶¿»oêþð;“¿o€Mjç“ß}þ>F)2 t) ú²·ø²)`JÊúšÔýᥓ÷ßnžöÉT?ì=)Ûýyáïg†¶ÝŸ—ê¿35OúXjgaêÜ~j*ž¸;¥¢ýO Œ˜ÎõGÅ¿·QŠÎ] ª{ßÅÑsaåSM¾Ÿh_{Èä—”6Žþàn3§ð÷93]¾ô©~د¤æ ÿ3µ.øbêüàÈÔ½ÿ²T®_ýÏTÈÄûè÷=ª…g.Õ<áÏ¢çPQåúGSñÐÕ©sóñ©}Åž©uî?¦æ·þWjùþÉ%{¾p×ð÷B½šx\õe»¥ÆWãGËñoÿ}j_º`òÓ_·¶)_žR§ýëÆ@ñÈuáïTŠ,Ð¥¨æm?yq ¢ÓüÑ¢}Õm©ûÀ•©{癓_hÚþÞ©}ÅÒÔºè?Rë¼IÍ3>šßúøämN4qoöÆ×·wßø½gþw“ñw©uÖg'?%Þºdîäÿßö5§ÎMǦî]ç¤îƒW¥bõ©Ü°Òb*ÍÓÿ6~w¤4 Y Kµ/[=ø _4î;g”=ºX¾÷k}¡Ài_}@øÎHµ¡É] ®»üÛÑs€ e‘êû½1|_¤ÚÐd.×8æ¢G)¥î§‡ïŠTª,Ð¥èæl“ʵ÷GÏ€±×8òýñ»"¥aÊ]‚Z}9z>ŒµbÅõá;"Õ†. tiÊ—¾2¥n;zNŒ­æÉ¾#Rmè²@—†¤Î­'EÏ €±T®_‘²y;„ï‡Tº,Ð¥!©qÄû¢gÀXj]ø¥ðÝjC™º4D|?z^Œ—vžòÅ/ ß ©6”Y KCTó”¿Žc¥óýÃÂwBª mèÒ05o‡TnX=7ÆCY¦úoß ) kèÒÕ¾tAôè Ýåg‡ï‚Tê,Ð¥!+ßóU)u[Ñó ò_ûð]jCº4„un:6z~TZñØ­)›3+|¤ÚPg. aõ¯üjô ¨´æiŸ ß©6ôY KCZñÐ÷¢ç@%•V¦lþNáûÕ†> tiHkžôѳ ’ZçýsøîGµ‘È]Öæn—ÊuGÏ€J)ëkR¾ûóãw?J£º4ĵ.úrôL¨”Ö%sÃw>ªLèÒ—/~iJFô\¨†V–òÅ/ ßù¨62Y KC^çú¯E€Jh_¹Wø®Gµ‘Ê]òê‡üRôl}FÊ÷|Uø®Gµ‘Ê]º÷]=bFZûÚCÃw<ª\èÒÔ8úƒÑ3`tÝTßïMá;ÕF. tiD*½1zÔŒ¤ÎMÇ„ïvTÉ,Ð¥©yÊ'¢g Àè)ËT?èíá»ÕF2 tiTš·}*Ÿz0z䌔îgÄïu”F5 ti„j÷ÏÑ3`¤ÔøõðŽj#›º4Bå wMecmôÜ Ýû. ßç¨6ÒY K#Vûò%ѳ`$4ŽüÍð]Žj#º4båK_‘R§=†Z÷Þ Ã÷8ª|èÒÖùÁ‘Ñ3`¨ÕoøGµ‘Ï]ÁêËvK©,¢çÀPê.?;|£Z%²@—F´îgFÏ"€áS–©~د„ïnT«DèÒˆÖøêoD#€¡Ó½ý´ð½j•É]áº^=“†ëÓç¿3|g£Ze²@—F¸Æñ=–†Fç–Ã÷5ªU* ti”›³M*Vß=›âÝT?à­ñû¥*e.xÍ“ÿ*z<„ëÜøÍð=j•Ë]õæn›ŠÇQ±Ÿ>_¶[üžF©jY K¨yÚ'£Ç@˜ÎŽ ßϨVÉ,Ð¥*4oûT®½?zV ^·ò}ß¿ŸQªbèREjžù¢ÇÀÀµ¯=4|/£Ze³@—ªÒüS¹î‘è™00ekCÊ—¾2~/£TÕ,Ð¥ Õ:çóÑs ``Z—Ì ßǨVé,Ð¥*5§T®4zv̸2[•ò…»Æïc”ªœºT±Zçÿ[ôü˜qÍ3?¾‡Q­òY KUk÷ç¥2[=ÃfLñøò”ÍÝ.~£Tõ,Ð¥ ÖºèËÑs `Æ4ŽûHøþEµ±È]ª`ù¤²þdô,è»â¡«S6gVøþEµ±È]ªhíKDÏ3€¾«ñëá{ÕÆ& t©¢å{¼8•ÍõÑ3  o:·¾sQm¬²@—*\û²EÑs  ?ºíT_ö–ð}‹jc•ºTáòE/Je}MôxØjík ßµ¨6vY K¯uÑ—£çÀV)[R¾ôá{ÕÆ. t©âå»??•Ùªè90m­‹g‡ïXTË,Ð¥1¨uî?EÏ9€i)Ÿz(e»?/|¿¢ÚXf.Cówš6£¦yâGãw+J㚺4&5ÏüLô¼Ø"Ý®LÙœYá{ÕÆ6 ti\š·}*ÖÜ=÷¦¦è¦úÁïˆß©(sèÒÕ<åÑ£`JÚ×¾K‘:èÒ5g›T¬¼9zþlVY_“òÅ/‰ß¥hìëX KãUó„ÿ=6«uÖgÃw(Rf.asf¥âák£ç @OŪÛR6w»øŠ4Û]ËGÿAô,è©qÔÂw'RötèÒ˜Ö½ÿ²èyð,[N ß™HÙOd.i#3z&ü§vžò½_¾3‘²ŸÈ]ãºËÏŽ“ZÏ ß•HÙOe.qõ~!¥¢=€1W>õ`Êì¾+‘²ŸÊ]ó:×=#€1×8î#á;)둺4æåK^žÊæºè9 Œ©îí§…ïG¤lY KJ­KæFÏJ`µ²”ïóúð݈”m" tI)[°s*Ÿz(zdc¦uî?ÆïE¤Ù›Î]ÒdÍÓÿ6zfc¤XysÊæn¾‘²Íd.éGÍÙ&Þ=;€qP©~ø{ã÷!ÒìÍg.é™G0z|c ý½Ã÷ R6…,Ð%=«î½FÏP ÂÊõ+R¾ðá;)›BÛNž|ÞZ Kš¬~ð;R*ºÑ³¨¨æ ¾ÿ²)Ö½óÌÉçmmâþÇÑFÒpÔ¹áëѳ¨ îò³Ã÷R¶uï>oò¹[Ëæïþ`$ Gù^¯N©•EÏT JÚyÊ÷ýù𽇔mAÝ^:ùô­e»??üÁHžÚ—-Š«@…´.øBø¾Cʶ°îƒWM>kÙ/ 0’†§|ᮩܰ2z¶P!üIî_ýg¾8 —ö•{…ï0¤¬µ¿»ï3ÏëZ÷¡ï…? IÃ_ç–B‡00ä·nY°søþBÊúP÷öÓžyn׊ «Â¤á/ßë5©lmÆÀ*‹T?â×ÃwRÖ§ŠGo|æé]›ø?Ù‚ç…?(IÃ_ëÂ/EŽc`µ¿»OøÎBÊúÕÜíRê4ž½@Ï~gü“4üÍß1OÜ9“€!2±'È쿳f÷§úo{Ös|rÞ8ù¯Â˜¤Ñ¨q̇¢f20LŠnjñ¾ð]…”õ±æIÛxÞºÂ7äJšzÝåߎÍÀh_¶(|G!e}®}Ù/Ð;wŸþÀ$Nù>¯O©•EÍg XñÈ÷S6oûð…”õ¹î]çl¼@/Ö¯ `’F«Öùÿ5£€Hí<Õ—í¾›²~7g›TÖ×l¼@Ÿíõšø(itš»]*V\1¦€@Í3?¿—f÷¿úÁïØèùþ̽q⟇?@I£Uý°÷L~a0ºw›²9³ÂwR6µÎúì¦è­«€’F¯öÕ zVÊluÊ—¾"|!e3Tç¦c7½@﮸!üJ½ò…»¦ò©‡=³€A*ËÔ8æCá{)›©æÌJåºG6½@Ÿ¸ C¶û®ñTÒÈÕ8î#žÚÀ µ¯=$|ÿ e¾ÿù³è)¥ú±þ@%fÝÛOǪ̂X}gÊì¾{²¬uá¿?÷½}íaáTÒh–ïùªT6ÖjvƒPtRý+¿¾w²®{ÿåϽ@/Ö>þ@%n­oÿý Æ70­ ¿¾o²._ô¢”ºíç^ OÈx[ø–4¢ÍÙ&_3ˆù ̰‰Oäfs·ß7H³g¶æ)½É×ÁF ôæù_À’F·úÁïœüó.`t•Ùê”ïõêð=ƒ”  î]çN}Þ}äúð,i´k_±çLÏq`¦”ejûáðý‚”  |ñK7yû–ž ô ù~o à’F¸»¤òÉûfr”3¤}ùâøÝ‚4{05Ïøôf_=èÍ‹¾þÀ%v£>RYÌÔ,f@÷+S6w»ð½‚” ¨‰{ýoñ½»òÖð.iôkïÀ™šç@Ÿ•ùã)ßë5áû)Põe»MÞ²h‹èòCÞþHñì’Š'™ôý¾ç¿Kf®öw÷yΗÆ&èík ÿ$~õ#~=¥¢Ûï±ôQûò%á;)dóvHe¶jú ô¢±>e žÿƒHùÚWíßï¹ôI÷Áïºï¹Æ®æI›Òëc“ ô Ó?þƒHª@ówJŪÛû5×€>)ëO¦|Ÿ×Åï¤Ùƒ­xè{[¿@ï>r}ø"©¹• á}ÏùPøÎ@Ê\ãÈ÷Oùe²Ùú„úQ¿þIªFí+÷ÞÚÑôIûŠ=ÃwRPwùÙý[ w–ŸþIªH vNÅê;·v¾ý¸ïù¼íãwÒìÁV?ðm“}Ñ·ú„ü w„ÿ`’ªQý+ÿÕ­\ P¹aeÊ÷zuøŽ@ÊêÜ|ܽ^¦´@oßptø&©:µ¯X:Ýln;5Žx_øn@ʪôö”Ê¢ÿ ô‰O‹æËv ÿ%U¤ù;¦â±[§9é€éjõã÷Ò옺·Ÿ¶Å¯™©-Ð'>…~Óqá? ¤êT?ä]“ÿÕŒÎMÇ„ï¤,¨ú¡¿¼XÒ—ÌIDATE÷>ßâz*Š”øöðTRujgáZÀ–+Vü eów ßHYPÝ{/šÖk§¶Eÿ•êöÓÃPIjÞö©xøši^ÀÔ”ùã)ßçuñ{ivLãþÇ´_?[´@ŸPÿêûÃ`IÕ)ß÷çSÙ\7íC ØŒ¢›ßøýðë)‹ü.¾'îܽ»âÆ´aÎ6ñ?¸¤ÊÔ<õOû6­uÞ¿„_÷KY`­‹¾¼U¯¡-^ Ohœñéð\RµêÜrÂVfÀ³un=)esf…_óKYPùÞ¯MekÃàèE¾&e{¼8ü ©:å‹^˜Êµ÷oÕüH±úΔ/|Aøõ¾”Ö½ó¬­~-Mk>¡sÝáá¿IÕªqÄû&ïÍL_ÙX›êû½)ü:_Êkžò‰¾¼ž¦½@Oe™êG~ ü!©Zµ/ß—Ã ÆöKCþƒðë{) ,_òòTæ/Ð'¾Pô‰{Ò†ù;‡ÿB$U¨¹Û¥îƒWõ倀qÓ:çóñ×öÒìØ:·Ò·×ÔV-Ð'´®Ü;ü"©Zåû¾!•§úsÊÀ˜è|ÿ°ðkz) ®yú§úúºÚêz*ŠT?ê·Â1’ªUóÄöå€qнÿò”ÍÛ!üz^Ê›¸÷Ù\?d ô‰úS§l‡ÿ‚$U«ÎMÇô㈀J+_žò=~&ü:^Ê"›¿c*½¡ï¯¯¾,Ð'´o=9þ—$©Rå _Ê'ïë×1•SÖפúþo¿†—²àÚ×:#¯±¾-Ð'4NÿTø/JRµªþÞ”ŠN?*¨†n;5Žú@øµ»”×<íÿ›±—Y_è©ÝHù¡ï ÿ…IªV­ ¾Ð×£ ª yæg¯٥,¸ú!ïJ©]‘úÄ=—Ö>˜²Å/ ÿÅIªPsf¥îgôû¸€‘Õþî>ñ×ëÒìØò%/OåSÍèk­ï ô û¯Lænþ ”TòE/JÅš{gâÈ€‘Ò½ëÜ”ÍÝ6üZ]Ê"[°s*ºzÆ_o3²@ŸÐºê€ø_¢¤JU?ôÝ)u3ulÀÐ+VÞœò…»†_£KYds·ØÝ fl>¡yÎçã™’*U󌿛Éc †V¹aeÊ÷y]øµ¹”׾栽îftžŠ"5ŽÿÓð_¨¤jÕ¹ñè=º`Ø”Íõ“™}M.eÁµ.üÒ@_{3»@ŸÐª§üð_ ÿÅJªP vIÅc·ÌøñC¡ÛNoü~üõ¸4;¶Ö9ŸøËoæèD¯¯Mù!þ ™¤þUßÿÍ©l<5ˆ# â”ejžú7á×áRÜÄë`âõPÉú„bÃê”ðÖð_´¤êÔ<ñ£ƒ: Dë¢ÿ¿þ–²àš§|"¥²y l>¡XÿXÊ—íþ —TÚW/ä1Ó¹îððën) ®yæg–ç_ O(Ö>˜òýÞþ‹—T‘æíЇ¾7è£ fT÷Ž3R6wÛøëniv\­ ¾rÛ–Ðú„býÊ”øöðIÕ(ßûçR™?qœ@ß]²;‡_oKYTsf¥öå‹Ó0Y O(ëO¦ü+ïÿÇT‰_û”ŠnÔ‘}Q¬¹'åK^~-…5o‡Ô¹ñè4,ÂèŠÆúTÿÚïÄÿ£HªD­‹gGi°UÊ +S¾ï¯¯¥¨ò=^œº÷_–†Iè}R·§}2üGRš3+un=)úT€-V6×§ú¡ïŽ¿¶–‚ªï÷¦T<~W6ñ ô§µ.[’6 Á?”¤oÁ.©xôÆè# ¶ì¦ßøýøkj)¨Æ1š¼å÷0šú„ö­'§ v ÿ“4Úå{¿6•Ùªè# ž[ÑMÍ“>~--…4wÛÔþΔÊ2 «¡Z O讼5åû¿%þOÒH×øêo¤ÔmEi°ie™š§*üZŠ(_ò²Ô½÷Â4ì†nþã/mœðgáÿˆ’F»æ©}œÀ&µÎÿ·ðkg)¢Æ×ÿ{*×=’FÁP.Ð'•ej]¹oÚ0o‡ðPI£[ûšƒ¢O3ØHûÒá×ÌÒÀ[°óv5C|Ë–ÑY ?­ûèM)?àmñÿ¸’F³¹Û¥î}—DeðŒöÕË⯗¥Wÿʯ¦bõiÔ ý}R»‘šç!m˜=+üZÒè•ïñâT¬¹'ú$€Ô¹ñè”ÍÙ&üZYX vIí+–N~aî(úÓ:÷^’ò}ßÿ.iäªôöT6×GcŒ±Îm'§lî¶á×ÈÒ jûÇ©\÷pe#µ@ŸÔª§æÿž6ÌÝ.ü i´j÷‘”Ê"ú` uï9?e¾ëOcR}Ùn©»üÛ© Foþ´îÊ[R~ø¯…?$V­‹¾}|0fº\9y‹èkbi·Ñm_½,¥n;UÅÈ.Ð'•ejßt\Êöú¹ð'‡¤iάԹõ¤èÓ €1Q¬¸>å‹^=,Íd vN­óþ9•ù©jF{þc­zj]º e žÿd‘4ü-Ø%_}rPqŪÛS¾äeñ×ÁÒL5§Ô:çó©Ü°2UU5èO+Ö¯Lͳ?—6ÌÛ1þÉ#i¨Ë—¼<kî>¶¨¨bõ)_úŠðë_i&Êw~jó¹T®_‘ª®R ô+6¬JÍó¿6Ìß)üÉ$ix«ï÷ÆTf«¢,*¦xü®”ïù³á×½R¿Ë—¾2µ.™—Êúš4.*¹@ÿ±â©GRó¼MÙB÷™’Ô»ú¿žR»}\PÅãËS¾ç«Â¯w¥~Ö8â}©sÓ1•úrЩªôýÇŠæ†Ô¹îð”ïÿ–ð'›¤á«qì‡S*ºÑG#®xânŸœ6ÌÙ6üI(ixjûOÑ'#Ìò\U(_ø‚Ô<ù¯R÷γÆòÓæ½Œ×ý'ëM­Ë–¤|¿7…?1% Gí«ˆ>šAÅš{R¾×«Ã¯k¥é”/~ÉÓKó3Sê4£_NCglè?©ûØm©yñ\·x‘ƽ9Û¤Îí§FIŒrí)ßçõñ×´ÒT›»mªúË©uÁS÷Þ‹|Òü9X ÿ”î#×§æE³S~è{Ò†Ù³âŸÐ’Û‚SñÐ÷¢"F@ùä})ßûçâ¯e¥Í”ïþüÔøÚo§ÖÅsR÷®sSÙx*ú¥3R,Ð7£ÈO훎K“?‘²½_þd—4˜ò%/›üó;Øüòüµá×°ÒO6ñœl|ó'?]Þ¹éØT¬¼)¥¢ýriè[ X·"µo=95Ïù|Ê¿ò_Ó†»„¿($ÍLõýÞ”Êluô±À*ŸüaÊ÷ñaK öË=ó}ßê‡ýJjýÁÔ<ù/SëüMíkNÝåg§bÕí)µëÑ/J²@ßE‘ºOÜ›:·šZ—.Hÿ<å‡ýJÊ¿,üE%iëË¿òÞ”ZyôIÀÞµ Xs¯43mX•Š|M*Üje(X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èЃ:ô`=X @èÿ¯;€ äOýØ!F€O @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è:A @è°ïÓƒã¥6œyaIEND®B`‚‰PNG  IHDR99Œƒ… pHYsèèµ{RkwIDATxœåÚklEðŪñQ¢ ‘j|DÅÆøEâ+š¨|0ñ‰1&êƒFMÔÄÓ^éµTO ¢´PJ V¨B+¶Ai}P´•‹DªXŠô‘ÖBmgwvö13kbú¸ëíÍ,t×û'û©×™ùÝìÍÌˆ†ˆ†\Aº£‡A·>’()[0ã2êîl6×m…õCUÊö‘éW¢tÛr¸Ç{½ÿÓœ‘øy …ZÊ˨Z Î&–°¦çÓ¶•L¿Jç{¨µËÒ×.§'ªp´æßPZw?4Rrvê¬< îÀcøßÇ —_àúê"héþhµW"̱»·øBêe R#wo8G¨Ã9膛ä‘έˆBœ¾½rHúþ²@â€}°VÇzØûkávz—ÐêÛ²G:Éõšk‰A¯¸4õ¨ýÖ5ÁÔ#z3ÙR/ØT©Rw`?ô×/Î<(ÍÛ]$]×Gàô4y_&‰åùGš=¢9½ì|ÿ“µÅ;Öe.ØÒáôµÁÚ»fýÃÐW_á»|}:ÒjG ™Í$ý_#âùà'z'}SÜ¡Ÿ`wVÃÜñ$Œu׃ÄNϺ\’én‘ºby(Ùºñf°æA«o‰Ÿ+]ñƒäãÒH«­"ÐÆ4$\GÉŸŠ2–•˜Ÿ>dÉ9JHöÙ3@Ÿ©´±¾^d¡NǤ‘vWM4îèïÒHç׿h #{¤‘îð/Ñ@Ú]5ÒH1ýˆÁ+ôHöÅËòHÆ{7†IëîUBеfè‘ú—(!ÅEè‘DL#ƒÒH÷èwÑ@:‡vÊw%# E§…iµ®T|*¯ ?’n¹G i6¬?Rm‘Ò>P~$ƒÏXŸ4’Ò>X¯Ô›zÅesƒŠåyc­½;3’5¿ „4?~ôÔôRâ"o a-Åp’àÆñSYú½ª¥JH{߆àA«z=Ävþ še>wý Ŷùe>Þ¯<_o^öùs°»?ðÞfó@ïÙã)ž-ÿl‡JèÆ[”v×&麟·ûCZß”+!­ïßVBª<ÛZëý!Ån‘J”nÙX¸1*]7Ûõ’?¤x±ÅÍq%¨ùáRH1À¨„n¾Ó'2€m<±§AŠÏÈY4ÏÛÜ‘çÐË/ôdOC5VÛê¬Vk‰R}nç”ò2"õÄb¥­ƒ)ïdgÙCôêŠçûÛÆËÖRœÒ»e{šDÜcû¼•¨tòï^°¾*'Ãê•pcíÕÙ#Í­aœÚ:>1x¹NŠw¿¾â6óVÝt»$Rôæö'ö8ÉÆÔ¿u™îØÙôÞìïDXÃÙŒ5W¦n{b14có]¾†vï”V#íɈ9ËÞ(ýä1hÎp$žï ʾ|aËäu*™Ñ‹p'†&êݶDœ¿™õÀìBØ¿íBXb÷~ ]ܦ—O¹ôÊë`î|®þWŽÏþ¿GCD›ëœŠü̬­yPÖéÐIEND®B`‚‰PNG  IHDRî6Ê×3 pHYsèèµ{Rk IDATxœìÝy¼Ýw]çñ_ÚRÚ²É* ƒ  €Š вˆÂ(cU@ÄqÐAQQdP³§iºÓ}KJ÷…îû¾Ñ}O÷%ÝÓ–¶IÓœ}ù}çqn«¶%IOnó=¿çóñxýãÃ?nnÎçÜ7é¹ç yEô¼8Ã2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ2`¸@ wÈ€á0Ü †;dÀp€ îÃ20ºÃ½ÛN½û˜:WïŸZgü¿Ô8tëTßåí©6w³T›]hšª/~uê?pyôß>l”þ£ËR}Û×…ÿ\Õ7w³Tÿî;RãÐ?H­3¾9±9{÷_–R¯“FÕè ÷~/õ]–:W훚GþIª-zeü_hŪ/yC꯸>ú‘S¢ÿÈ ©¾íkþ*³¾,5úÔ¾hIê=tõÄFáý÷Ø-©uî¼TÛñgâÿ¢*\}û7Mü댓þŠë&þkrôÏYeÜöoN­S¿–z_WÍáÞo=Ú—í–ê{ýjü_†Rc—ŸKåª{# 0í/½­/|yøÏ[å_}ï¤öå{¤ÔZ3þýß|jâ?;Ô¿&ü¯gjìö®T®~h&0ãz÷_j¼+MY‹_;ñŠ‘~ýÉñîýÚã©uæ·RÍÁŒT½ßŸÊúã3ñ€p½»ÏIµù[„ÿüÕµèU©uο§~cå ÷~?u®9`â•„cõ¼šK?œÊæSÓú×£¦wë Þ¡NiÊ[ò“©sÃaù÷ÞŠRc¿ßˆÿFêÇjîÿ›©l==]õ0Òº×?ÕæÌ ÿy¬ñ«±ôc©÷èÍ ÷~7µÏ›çÍŽò¿´·c~¡FEç’Â&kL›ÿÒÔ¾x‡”Êr´‡{Í£©qð'ã¿aZký>ä_ÚàYí³¾þ³Yã[ãû¿Ÿúõ'Fs¸wï9/Õ¶{cø7IëùEÔúÅ ÈBY¦Ö þ3ZcÜ?º÷]:ZÃ}ð~–µ9›Äs´Öû~Ð/¢ÀÚô{©yø§ÃVkŒ›·yêÜxÄh ÷‰÷eþ†h5öz_*3û£•nsâ¢fkŒ›3+µ/Ý9p¸÷»©yâßÄ#´Î{½7•SüÚ*GƒŸ—]!üg·Æ»ÖYß îƒÿ¬tôÂÿðZw=ßã_Ú`ôŸ¼+Õ—¼>üg¸Æ»Ö™ßœÙáÞ:íŸÂÿÐZw]~.•O¯˜ôƒªªÿÐU©¶`«ðŸåïÚ—ì43ý}þ‚ð?¬Ö]}û7§råòI=€”z·œjs7 ÿ™®1nάԽþéî«ö‹ÿƒjÕ¿&õ]¶Áàù:?Ü%üçºÆ¼y›O¼ú´ ÷Þ—§Ú¼—Äÿ!µÖê _žú^1™ç&`-Ú§ü}øÏwwõ%¯OýÕMípï7V¦ÚNo ÿÃiÍÛ<õîþ‡ÐÚkÿå©~NÖ£sÉŽá?ÿUŒuí+öœÜpïÞyfø¯µ×<ðã)õÚÓñœ¬Gë„¿ß*ƶúâW§þšÇ6p¸wš©¾óφñúñ{¾'•­ÕÓø”¬S·™û| |¨Ûš'~eÆ{çÊ}¿h­ãSQŸº:ŸŽ€Q>õÀÄûoGïãÙ¼—¤þªû†îýnªïüsñ_´žW}Ñ+RÅõ3ðt¼˜Þ=çúeU¥éªuÚׇîë ÿbõ‚ænšz·<ÏCÀ:,ŠßJcÙ—¥~íñîe?Õw{Wü«çÕ½z¿|†R–©yØ„ï•ùP¦ç wï$3zµOÿç™| 6@Ùz:5v{gø^P1–¿Û˜ú½u÷æ1_ ÿ"õ_5þ䋾?«ÿÈ©¶`«ðÝ bìê.¿pýµÆ§¤ŽPõß–Êú¿¶ =Ýkß*Æ®ÖI_]ûpï\{Pø§ç¼ƒÌ£Ë"žw€IjûçáBÅXUßöu)uÛ?>Ü}"ü‹S‘js6I½ÛNŠzÎ6æõ=~K(SÝ»ÎzÁpï4Rmþá_˜ŠÔ¹pqàS°1ú_“jó_¾'TŒM­³ÿõùý{×Ùá_”ŠÔ:â³o-ä«sÙ®á›BÅØÔ<à£Ïîƒ%ýEU½Æ^ïM©]‹|ž¦êýÝÿtø¶P1ÍiJæ ÷ú¾¿ÿEU¸úâW§rÕ½ÑO3À)ëO¤úŽÿ-|c¨‹º÷]2ñ¸*&^ß>w³ð/¨²Í™•z·ýüL±Þò &Þt"|k(å^ûÒ]&SE¿˜*×>û;ÑÏ+À4iŸùÍð­¡"ûÚ§ýãÄã©è,;6ü‹©jÍ>æ“Q`œu[©±ç¯„oY×<ì&NEû‚Eá_L«/yC*Ÿ~8úé˜fýÇnIµ[†oÙÖØã—'KEÓ§|Å|ÈÒÝgG?3¤séNñûC)×ê _>ñ8*K?þÅT­Î‹¢Ÿ?€™TöSóÀ‡oÙÖo®NEÝë®f´æ!Ÿš8^ ZÊÕ¥úâׄoYÖ¯=žŠúÎ?þ…T¥ú?5ñ¾®@5u¯ÿ~øQ‘eýÕ§¢¶íëÿʼ®ýžs£Ÿ/€`>UUµIÔ_u_*ü–óÌÔ>ë[ÑÏÀ¼«ÜàSÓ£·‰Š¬ê=qg*ŸÜý…Œ{½ßŸR¯ý<Œˆî5„ïYÕ{ì–TDcß‚­RÿG·E??#¦yÈïÅï¥\êÿèVÃ}ºë^½ôó0‚ʧîOõE¯ß**²ÈpŸæ¿|°.Ý«ö ß+*²ÈpŸÆ¼õ#ð¢ÊÒ3) “á>]yëG`HýÇïHµù[Äï¥QÎpŸ¦Ú§ýcôs‘ÎùóÃ÷‹Š‘ÎpŸ†ê;¿-•í5Ñ÷ä¤×NÝÞ¾cTŒl†ût¼DæÞ £OÈPïÞ‹’Ï×QmîS\ûÔ¯Eß<±Öq¾gTŒd†ûVßé­^"l”Á;ÒÕ·}]ø®Q1rîSÕœY©w÷ÙÑ·Œî5Äo¥QËpŸ¢Ú'ÿ]ôãôÞîK?¾oTŒT†ûT½D¦õtô‰c¤ÿè²T›»YøÎQ12îSñ™{΋¾m` µOþjüÖQ• ÷¬õƒ¿Œ¾i`L•'ý¢ªþ3Ã}#ªoûÚTÖ~}ÓÀë\¹WøæQ1îQ÷ºƒ£owý^jìõÞðÝ£"<Ã}’5øèÄo|L·Þý—úDU%Ã}2ÍÛ|â0SZÇ|!~)Ef¸O¢öyó¢o¨˜rõC©¶ðeá;HEX†ûÖøî;Rê6£o¨ öysÃ·Š° ÷ ~Ïös£o¨¨²½&Õ·Sü&RŠÈp߀¼g;­{Õ¾á›HEH†ûÕ·y•÷lâõ»©±û»Ã·‘ŠÏp²Î%;FŸ)À„Þí§†o#3žá>Dõ6¥n+úFþSóàO„o$3šá>DÝ›‹¾M€çé?rCªÍÙ$|'©˜± ÷©¹ô#Ñw °V­ã¾¾•TÌX†ûúš3+õº*ú&Öª\uïÄ'º‡o&¥™Èp_O­ãþ"úÖ«}òß…o&3’á¾®l™Ê§î¾E€õ*Ÿ^‘j ¶ŠßNJÓᾎÚçÍ‹¾C€¡´Ïü—ðí¤bÚ3Ü×R}û7§Ô®Eß ÀPÊú©¾è•áJÅ´f¸¯¥Î•{GßÀ¼Z zC©˜Ö ÷Tßñ->l ÈNÙ^“êKÞ¾¥TL[†û ê^½ôÝLJç’÷”ŠiËpNõ~&¥^;úæ&§ÛLõíß¾©TLK†ûsê^wpô¹l”Î%;„o*Ó’áþl]ÞžR¿}k§]Kõ%¯ßV*¦<ÃýÙº7}fS¢sáâðm¥bÊ3ÜÿÚ¾ëÏû×v`¼ÞafÛ×…o,Sšá>ø×ö›ŽŒ¾/€)Õ9AøÆR1¥U~¸7vwJe?ú¶¦TÙ\•êÛ¼*|k©˜²*?Ü»×}WÓ¢}îœð­¥bʪôp¼Ï©OIÆUÙx2Õ½"|s©˜’*=Ü;-‰¾'€iÕ>ãá›KÅ”TÝá¾ðe©¬?}KÓª\ý`ªÍÛ<~{)ml•îíÓ¿}G3¢uÜ_„o/]5‡ûÜÍR¹êÞèr×®¥þnK½{/LÝKKwšøGÖq_JÍÃÿ(5üxjìýþTßùg'ÞO¹¾øÕÿÙà¿ú žê‹^ùÌÿmç·¥Æ.?7ñÿß<àc©u䟤ö)ŸÚçÍK+öL½ÛNJýG—¥Ô©Gÿ© õ½)ÕæÌŠß`JS%‡{ëèÏGß‹n+õW\—ºËŽN ·I­üejìÿ¡'>øÅúæÒ§Ö‰_I+÷N½û˜ÊÖÓÑß)`Ä5ùTøS±QUr¸÷º:úv€TÖO½»ÏIKvL­c¿˜{üÒÄ¡‹~Ϊ9³&>ºuüÿIÝëNý'ïŽþv#¦·ü‚øç*¥©rýyàoEß 0"/sé^{à3ÿŠþÝw„??Muõíß<ñºÖÁ-| @c߆?7©˜t•î½[OŒ¾ Hÿ‰;Sç²]SóðO§ú’7„?Íhs7›xÍ}燻¤ò釣ÿ*€ Ý›>Ršl•îõ~:¥~7úf€™Òm¥Þ]g¥öiÿ”»¼=ü9hdš³IjôÛ©{Íþ%ª¦ß›øEøðç!¥ÉT©á>xw`¼•í5©{ãáïêòïÜ¢õ4‹‰—Óô¸<ú¯˜!ƒÿòþÜ£4™ª3ÜçnšÊ§ˆ¾`ºþeýÖ&Þ1ª¶`«øç›Lkìõ¾Ô½zÿ”ºÍè¿Q`•­Õ©¾èáÏ9*6¸Ê ÷æa}'Àü+qëø/§ú6?þ3NÕ·{cê\¼ýÄw`<µOûÇðç\e†{ïöS£o˜ª—Â\½ßÄ¿G?¯Œ{ƒÿAÔ>wv*+£ÿÚiøeýÁï»D?Ϩؠ*1Üë;ýÌÄ/cùê?vËÄ'‰>i4ú9¥jÕ¿fâ_àS§ý0¦PóÐß~Q±AUb¸w.X}ÀF¼fðR7Õ=ïÌ5xßûTö£À¼ëVôóŠŠ jü‡ûÜÍR¹ú¡èÛ6Pï¾KRóЭãŸCôc5öþUïBc¢±Ç/‡?§¨º±îÍ#>}ÀèÝqÚÄ0Œ~îЋ4g“Ô>ù«^ÿ™ë^µOüó‰Ò°ýpïÝ~JôMCè?xejø[áÏÚ°êÛ¿)õn;9úáLV»–ê‹_þ\¢b¨Æz¸~¡*õÚÑ'¬G¹ê¾Ô:îK^Þy­£>—ÊúÑ'`¼5d‘Mc=Ü['ýmô-ëy[ÇößHµy/ ®ÐÔTßþÍ©wϹÑ-`ïÚýü¡b¨Æz¸÷î»8ú€µ¼´¢¾ã[Ÿ#4 Í™5ñ¯w©×‰~˜ yÀGãŸ?”*;Ü£ •eôÏQ®\î}ƒ+Rsé‡S¹úÁè‡0¤îG„?o¨¨îpoŸõíèþCY¦Îe»¦Ú‚­ÂŸ4sÕ·ûIÿårÑm¥ú’ׇ?o¨¨æpï?rcô ƒÍ¾æ‘Ôüþÿ NPPs7K‹·‹~ChŸù/ñÏJ•îÝ1ú± þ禣&ÞÝ)ú9AñµNüJJýnôCXþ“wy‡¯Ù£ÝX÷Î…‹£ûPmíÚ3oñ8Ïš‡|jâÝ„€ÑÕ<ø“áÏ**4ÜçÌšø8 Fÿ‰;}„¶ÖÙàSq/ŸFSwÙ1áÏ*ª3Üû| ú1•Õ»õÄTßæUáÏíê;½5õŸ¼;úá <ûò˜î‡§öé_Oý#Õlþ¡¢:ýsÁÂè€ê)û©}οym¤6èÚúÌœ²öXêÝ~JjŸ775ù=¿ƒ4;¿Æn¸{7˜aÝVjýgá·¯üŒ†þƒWF?‚a<µk©wß%oÅ;ø£Æîïö+³óo¬†{}§Ÿ‰>¨”²ñdjîÿ›á·¯|«oó©ÿð5ÑeÈ[¿›ú+®OÝ«÷K­þê™ß3š»iø}«˜òÆj¸O|Ì60#ÊU÷¦Ænï ¿{Ëx¿6ú! Ù(Ÿ~8õn;9µÏ›—š‡ÛÍ®Nc5Ü{wŸ}KP ýG—¥úvo ¿yOƒOlôšwøqeíG©wÇiÏŒôïÿÏTßöuá÷ª"¬±îƒw²H½Nô}ÁØü‰ÅÖtTßþMÞΗjëÔŸy]ú¥;OüîP}ç·…ß¥Š‘jl†{ë˜/DŸŒ½Ák(ýk¦³ÆnïšøÝ {ý^ê?vsê^ÈÄK}'~_hÞæá7¨b¤›áÞ½éÈè„ Œö׆ߺƿæÒL¼[ŒíëÒÝzâw;¢oMEvÇpŸ÷’T6WEß$Œ­þã·û—vÍh­cþWJeýЇI)ëO¤Þ§§Îù RóÐßOõ%o¿)cÑX ÷æÒGß(Œ­òéŸt}çª^ƒõ‚‘×ëL¼¥©÷KWm‹á>øÏNÀÔ+[O§Æ^ï ¿qU·Î•{EŸ¬ÿuéó_~'**ÓX ÷Þ½EŸ2ŒŸ^'5úðûVÅ›»YêÝyFô5PQåªûRwÙ1©}æ7Só€¥ú—Çß„R•˸/ØÊ/1Á4hŸüÕøû–þãšž¼;ú$sekõ3oÅ8xÉËQŸóYJ£Xöýù½ß¾u;Ýë¿~ÛÒskìùž”:èÓ`œ^—>xÉËÕû=çu雄?Î¥Ú¸÷Î%;DŸ?Œ•þŠëRmÁ–á·-½°ÖI}dª\y×¥+CÙ÷ÁorS÷ÑÚõ~:ü®¥u5ø¯A°>åS¤îÍÇ¥öYßJÍ+Õ½"üq+Õ¦¨¬‡ûàuƒßð¦FëÈ?¿ki½-ØrâÃÀà?Þùê?_—~Ü—¼u­Ò¸—õpoñÙèç ƒ×zFß´4Lï¾câ ©¯K—RÖýsÅžÑO#0úOÞåmΔU­£ÿ,úl˜Ne?õ»%u¯û^jŸüw©±Ï&>%=úq'Õ‚Ëz¸÷¹!ú©ò×ï¥Æ~ ¿giCëÞpXôõ0EÊÕ¥Þ-ǧöÙßI̓~;Õ½2üñ%ÕF°|‡û—¥ÔïF?×@ö:—ïÏÒ$Ïið‹ˆdþºôßþX’j™”ípü/r`ã”k™?Ñ÷,M¶æÁŸL©,£O‰uéwŸy]úõ‡¤Ö‰_ñºtivE‡{ûœ‹~:‚ì ^'}ËÒÆÖ½zÿèSâYåÓ§î²cžó~é[„?>¤Ú•ípïÝzbôód­w÷9áw,MEƒ÷é.WÝ}R•é½[O˜ø‡´æÁŸHõm^þXjc^¶Ã½\óhôsä«,Sc¯÷…ß±4U5—~xâH˜e{Íó^—>ñ’—ø{—j+Ëá^ßùg£ŸÃ kÝ¿ciªŒJ¦öu郗¼4ö~¿×¥K³G£,‡{ëØ/F?­A¾úÝÔØõÂïXšòl•ʕˣ/,Ï—¼ÜvrjŸõíg^—¾`Ëø¿KIil†{ç²Ý¢Ÿç [>!Uã\óð?Š>±‘V>½"õn;)µÏù÷ÔüÞÿð®RÒì¼Êr¸÷¼2ú¹òÔïzÏd}ƒ=æÙ÷K_~Aê\¼}jùÇ©¾ã ÿ»‘TTl¸ÏÝ,¥n3úù²Ô½éÈø–¦¹úŽoI©]K©ê¯KŸ»iøß…¤¢ÚÃ}ð›ìÀä4öý`ø K3QûÜÙiœy]ºTT²ì†{ëèÏG?_B–zËÏ¿_iÆš·yêÿè¶4Êæª‰Ï]hŸ7/5Ý:Õ—¼>þû+)E”Ýpï\¸Môs(d©yȧÂïWšÉš|lâ3 ²Ò®ýøû¥Ï™þ½”TŒDÙ ÷ÁoæÿÄ~ø«’uo:*ôëÒW\—ºWí›ZÇ95öøe¯K—”Æj¸—«î‹~ª…ì´ÏúVøíJÕwøé”:4R¯K¼äåàOL¼ï|ô÷GR‘UY ÷ú¢Wæ÷Ÿ=!Z¯“êÛ½1ü~¥¨U\U IDATo‡8ÓÊæSϼäåâíž}]ú¿’ŠìËj¸7—~xÆŸ|!wÝeDŽ߮ÙàC†ÊúãÓwd^—.iöÌ”ÕpoŸüÕé{â…1Õ<ø“á·+E7xoó)Ñï=ïýÒ'ÞŠqÞæá>IE%Êj¸w®Ükjžx¡"¿R›³IøíJáÍ{ÉÄ/ioð ­\>ñÁeí3¾1ñ_}½.]R-°¬†ûà}¨áu.Ù1ün¥Q©uÄg×{/^—.©6âe5Ü˧˜±Á㠱߯‡ß­4Jõî»ø™ãèuRÿák¼.]RÊ©|†ûü-R*ûÑ;²Q®~Б^P}ç·¥Æ^ïMµ¹›…-’T×á>ø×`xƒIŒ¾[I’TTo¸7ûÃèYi.ýHøÝJ’¤¢zý}ú?Gï ÈÆà=«½›Œ$IÅX•Íp÷V0¼îÍdž߬$I*ª9Ü{w½… íSþ!üf%IRQÍá^®¼'z A6»ÿbøÍJ’¤¢‚Ã}ÞKRêw£·d¡¬ýÈÛ@J’4{üÊb¸ÞwŽ×·K’TŒeY ÷æÒGo!ÈFû”¿¿YI’TTs¸·Žþ³è-Ùhìûká7+I’Šj÷ö߈ÞB‡²Ÿê _~³’$©¨æpï\ºsô‚,ôŸ¸3ü^%IRQÝáÞ½éÈè=YèÞ|\ø½J’¤¢ºÃ½wßÅÑ{²Ð>o^ø½J’¤¢ºÃ݇/ÁpšG|&ü^%IRQÝáž:è=Yhìòöð{•$IE5‡{}ñk¢·ä¡ßKµ¹›…߬$I*ª9Ü»¿;zAÊÕ…ß«$I*ª;Ü›K?½‡ ý. ¿WI’TTx¸þéè=Yè.;&ü^%IRQÝáÞ:þËÑ{²0ø ²è{•$IEu‡{ûÌoFï!ÈBûô¿WI’TTw¸w.\½‡ ­£>~¯’$©¨îpï^µOô‚,4öûPø½J’¤¢ÂÃ}Ù1Ñ{²Ðøî;ÂïU’$Õî½{ÎÞC…úvo ¿WI’TTw¸÷W\½‡ µ…/ ¿WI’TTw¸—+—Gï!}e?ÕæÌ ¿WI’TTx¸×‹žD0òÊæSá·*I’ŠŠ÷öšèM#¯\ý`ø­J’¤¢ÚÃ=õ{Ñ›FÞà£oU’$Uy¸Ïß"zAú^¯’$)Uv¸×¿:zAo›}¯’$©¨ðpßá§¢÷d¡wÇiá÷*I’Šê÷Á'A/Îp—$©ûF{¸ïù+Ñ{²`¸K’TŒ}£=Ü÷ûPô‚,î’$cßH÷æA¿½‡ ½;N¿WI’TTx¸ïw£÷dÁp—$©ûF{¸ò©è=Y0Ü%I*ƾÑî‡n½‡ †»$IÅØ7ÚÃý°?ŒÞCÃ]’¤ño´‡û៎ÞCÃ]’¤bìéáÞ:â³Ñ{²Ð»ë¬ð{•$IE…‡ûQŸ‹ÞC…Þ}—„ß«$I**<Üþ|ô‚,ôW\~¯’$©¨ðp?æEï!ÈBÿ‰;ÃïU’$îÇþyô‚,”O?~¯’$©¨òpÿbô‚,”­Õá÷*I’Š ÷£þ4zAú½ð{•$IEu‡{óˆÏDÏ!ÈFmþKÃoV’$î‡n½… õů ¿YI’TTt¸ïw£·d£¾ã[ÂoV’$îývô‚l4v{WøÍJ’¤¢¢Ã}éG¢·d£±ÏÂoV’$Õîý~=z A6š"üf%IRQÑá¾÷û£·d£uÌÂoV’$î{¾'z A6Ú§~-üf%IRQÑá¾Û»¢·d£sÁÂð›•$IE5‡{}§Ÿ‰ÞBîUû„߬$I**:Ü·}mô‚lto>.üf%IRQÍá^›¿Eô‚lôî½(þf%IRªæpŸ]¤ÔïFï!ÈÂà˜£ïU’$Õîekuô‚,”õÇÃïU’$îO¯ˆÞC‡²Ÿjs7 ¿YI’TTs¸÷Ÿ¼+zA6êK^~³’$©¨èp_q}ô‚l4vwøÍJ’¤¢šÃ½wÿ¥Ñ[²Ñ<àcá7+I’ŠŠ÷»ÎŒÞBÖQŸ ¿YI’TTs¸w—½… íÓÿ9üf%IRQÑá~Õ¾Ñ[²Ñùá.á7+I’Šj÷ÎEK¢·d£{ó±á7+I’Šj÷öYߊÞBþ—‡ß¬$I*ª9Ü['üuô‚l”« ¿YI’TTt¸ñÙè-ùè÷RmÞKÂïV’$ÕîÍ?=… +õß~·’$©¨Þpoìù+Ñ;²ÒÜÿ7ÃïV’$Õîƒ=†×:úÏÂïV’$î _½ƒ +í3¿~·’$©¨Þp”zíè-Ùè\¶[øÍJ’¤¢šÃ½\ý`ô‚lôn9>üf%IRQÍáÞøšè-Ùè?tuøÍJ’¤¢šÃ½wÇiÑ[²Q®y$üf%IRQÍáÞ½ö è-ù(û©6‹ð»•$IEõ†{ç¢%ÑS²ÒØíáw+I’Šê ÷öé_ÞA•æ¡[‡ß­$I*ª7Ü[Ç|!zAVÚ§ýSøÝJ’¤¢zýyÐoGï ÈJçòÝÃïV’$ÕîÝ1zAVzwœ~·’$©¨Þp¯oûÚèYé?qgøÝJ’¤¢zý6gVJÝVô‚|ô:©6w³øÛ•$I©ZÃ}v‘ʕˣ§d¥¾óÛÂïV’$Õî½{/ŠÞA•æÁŸ ¿[I’TTo¸wo<ó_¢gd§±ë/„ß®$I*ª5Ü›G|&zAvš‡ÿQøíJ’¤¢Zý±Ç/Eo ÈNûìï„ß®$I*ª5Ük ¶œø4H`xÝ뉿]I’”ª5Üg©|êþèYé?tUøÝJ’¤¢zýwϹÑ;²R¶×L|€YôíJ’¤¢ZÃÝ[B†«ïðÓá·+I’Šj ÷ö߈Þ@æÁŸ ¿]I’TTk¸7Ý:zAvÚ§=üv%IRQ­áÞØíѲӽöÀðÛ•$IEµ†{mÞæ)õ»Ñ;²ÒèêøÛ•$I©ZÃ}ð…?qgô‚¼tê©6wÓðÛ•$IEµ†{ï¶“¢gd§±ë/„ß®$I*ª5Ü;m½ ;­£>~»’$©¨ÖpoûçѲӹ`aøíJ’¤¢Zý±÷¯Fo ÈNïÖÃoW’$Õîµ[¦ÔïEï ÈJ¹òžøÛ•$I©ZÃ}ðÅ?ywô‚¼”eª/zeøíJ’¤¢ZýwÛÉÑ3²ÓØÿ7ÂoW’$Õî‹–Do ÈN뤿 ¿]I’TTk¸·ŽûRô‚ìt®Ø3üv%IRQ­áÞØûýѲӻïâðÛ•$IEµ†{mÁV)•ýèY)›O¥ÚœYñ÷+I’Ru†ûì"•+—Gï ÈN}Ç·„ß®$I*ª5Ü{·Ÿ½ ;ÍC·¿]I’TTk¸w.Þ>zAvÚçü[øíJ’¤¢Zýõƒÿ½ ;Ý›Ž ¿]I’TTk¸7öù@ô‚ìô»%üv%IRQ­áîe`úÝT›¿EüýJ’¤Táîe`R{ÿjøíJ’¤¢Zýwû©Ñ²Ó:á¯ÂoW’$ÕîKvˆÞ@Î{†ß®$I*ª5ܽ³ l¸þ—…ß®$I*ª5Ü{½/zA~:õT›»iøýJ’¤¢:ý6oó”zíèÙiìö®øû•$I©:Ã}ðyä†è ÙiûÅðÛ•$IEµ†{÷ºïEo ÈNçÒÂoW’$ÕîíÓÿ9zAvzËÏ¿]I’TTk¸7üxô‚ì”ÍU©6gVøýJ’¤¢:ý¾ÍO¤T–Ñ;²SßùgÃïW’$ÕîƒÊU÷Eo ÈNëÈ?¿]I’TTk¸÷n=1zAv:n~»’$©¨ÖpoŸ7/zAvzwœ~»’$©¨Öpoþéè Ù)k…ß®$I*ª5Üë;½5zA–êÛ¿9ü~%IRQá>x[»²±2zAvš‡þ~üýJ’¤Tá>øÕåDo ÈNûÜ9á·+I’Šj ÷ο½ ;½[Ž¿]I’TTk¸·~ð—Ѳ3ø „èÛ•$IEµ†{c¯÷Fo ÈR}Ûׅ߯$I*ª3Ükó6O©×ŽÞ@æÁŸˆ¿_I’T¡á>øC­¸>zAvÚgþKøíJ’¤¢Zý{ÝÁѲӽñˆðÛ•$IEµ†{ûô¯Go ÈNÿ‰;ÃoW’$ÕîÍ>½ ?e™ê‹_~¿’$©¨Îp¯/zEJe?zAvü‚ª$IÅÈ6–Ãý™?ØmѲÓ>û_ÃoW’$ÕîÝÞ@Ÿ *IR1²íp÷ ª°áÊՆ߮$I*ª5Ü›K?½ Kõíß~¿’$©¨Îp¯-Ø*¥~7zAvš‡ýAüýJ’¤Tá>øÃ=º,zAv:, ¿]I’TTk¸ûUØp½;Ï¿]I’TTk¸·Où‡è Ù)O¦ÚœYá÷+I’Šê ÷Æ~¿½ Kõß~¿’$©¨Îp¯Íß"¥^'zAvZGýiüýJ’¤Tá>ø®¸>zAv:—ì~»’$©¨Öpï^s@ô‚ìôî½0üv%IRQ­áÞ>ù«Ñ²S¶×¤ÚÜMÃïW’$Õî}þ{ô‚,5vÿÅðû•$IEu†{mÞæ)u[ѲÓúÁ_Æß¯$IJÕîƒ?äÃ×Do ÈNçʽÂoW’$ÕîÝ«öÞ@þCW…ß®$I*ª5Ü['þßè ùéµSmþKÃïW’$Õî½Þ= K}>~¿’$©¨Îp¯Í{IJFô‚ì ÞN5ü~%IRªÎpüA¼"zAvº×~»’$©¨Öpï\¾{ô‚ìô]~»’$©¨ÖpoûçÑòÓï¥ú—‡ß¯$I*ª3Ü»þ|ô‚,5øXøýJ’¤¢:ý6gV*ëODo ÈNû¬oÇ߯$IJÕԻëÌè ÙéÝr|øíJ’¤¢ZýsÁÂè Ù)Ÿ^~»’$©¨Öpoºuô‚,Õw|KøýJ’T«x•îõ%¯Þ?¥ÖQ~¿’$Õ*^¥†û råòè Ùé\ºsøíJ’T«x•îÝ›ŽŠÞ@Þý? ¿]I’j¯rý}Æ7¢7ä§ÛJµù/ ¿_I’j®rý¹ôÃÑ²ÔØç¿‡ß¯$Iµ W¹á^[°eJ½Nô‚ì´OýZüýJ’4»ºUo¸þÐ+®‹Þ@î ‡…ß®$Iµ WÉáÞ½jßè Ùé?ywøíJ’T«p•î­ã¿½ Kõí~2ü~%IªU´J÷Æî¿½ KÍÃþ ü~%IªU´J÷ÚœMRÙZ½ ; ·‰¿_I’fW³j÷ÙEê-??zAvz÷œ~»’$Õ*Ze‡{ç¢%ѲS¶žNµ¹›†ß¯$Iµ VÙáÞ<â3Ñ²ÔØã—ÂïW’¤Z«ìp¯oÿ¦èýYjð×á÷+IR­‚Uv¸*W?½ ;Ýk–†ß®$Iµ VéáÞ½åѲÓtYøíJ’T«`•îí³¿½ ?e?Õ·yUøýJ’T«X•îÍ?= K̓?~¿’$Õ*V¥‡{}Ñ+Rê÷¢7d§}ο‡ß¯$IµŠUéá>ñ xìæè ÙéÝvrøíJ’T«X•îÝkŒÞ@²þxªÍ™~¿’$Õ*Tå‡{뤿‰Þ@¥Ænï ¿_I’jªòý±×û¢÷d©uÂ_…߯$Iµ Uùá^›»YJíZô‚ìt¯=(þ~%Iš] ÷ÙEêÝwIô‚ìôŸ¸3üv%IªU(Ã}v‘:—î½ KõíÞ~¿’$Õ*’á>øÕ£?½ KÍ#>~¿’$Õ*’á>ø ¦Þ½ KKw ¿_I’jÉp¶rͣѲÓàòðÛ•$©V‘ ÷gëÝ~Jô‚üô:©¶`«ðû•$©V ÷gkŸ;'zA–š|4ü~%IªU ÃýÙšßûÝèýYjŸóoá÷+IR­îÏVßæ'R*Ëè ÙéÝqZøýJ’T«@†ûs¿ß½ ;esUªÍÙ$ü~%Iªy†ûsêÞphô‚,5öø¥ðû•$©6æîÏ©}ê×¢÷d©uÒ߄߯$Iµ1ÏpN}?½ KÝë¿~¿’$ÕÆ<Ãý¹ÍÛ<¥n+zAvÊ•ËãïW’¤ÙãáþÂoȃWDo ÈR}‡Ÿ ¿_I’jcœáþ‚:—í½ K­£>~¿’$ÕÆ8ÃýµŽýbôþ,u.Û5ü~%Iªq†û jìòöèýYê?tuøýJ’Tã ÷6gV*ëGo ÈO¿›ê _Ã’$ÍÏ ÷µÔ»ãôè Yjô;á÷+IRmL3Ü×Rû¼yÑû²Ô9AøýJ’TÓ ÷µÔ<ä÷¢÷d©wïEá÷+IRmL3Ü×R}ñkR*Ëè ùé¶RmÁ–á7,IRm 3Ü×õyò®è Yjø[á÷+IRm 3Ü×Q÷†Ã¢÷dið;"Ñ÷+IRm 3Ü×QûÔ¯EïÈRoùá÷+IRm 3Ü×QcßFïÈS·™jó·¿aI’jc–á¾®æm>ñ‹vÀ†kðÑø–$iöxe¸¯ï›óàÑû²Ô>onøýJ’T¦¹›¥ú’×ÇCd¸¯§Îå»GïÈRïžsÃïW’¤ÚZªoÿ¦Ô;ü~%IcøºôÛNNece%7Ëp‘`:õ‰·U¾aIR^Õ½ò™×¥^ò²ì˜T®ytÚdõî¿4üÏ=L†û‹Ô<äSÓþ`qÕØïCá7,Iñ×¥^òrâW6øuéS©ÿðµñß‹!2Ü_¤úâׄ<€`´Ïþ×ð–$çëÒ§Rÿ±[â¿?Cd¸óMzò®)}p@Uôî:3ü~%Iãùºô©T®¼'üû5L†ûuo8lJPe{ÍľaIÒôV_üêÔüÞÿHísg?3Ò×<’rR>ýpø÷p˜ ÷!jŸúµèÇd«±ï¯…ß°$iº_—ÞO9+kÅ_‡Èp¢Æ¾Œ~@ B:o~Ã’Tµ—¼´ŽúÜsÞ/½ý£`´õÚágÃd¸Yc—·G?¤ [ý×…ß°$Uæuéõ'¢ŸöóÓï…ÿ=“á>lsf¥²þxôà òT–©¾äõñw,Icöºô‰—¼0%¢ÿn‡Ép߀zwœ>5 ¨ ÖÑŸ¿aIÊ*¯KŸQµ9›Äÿ¿H†û4øOPÀät¯Y~Ã’4²Í™•»þÂÄH¼!FÿÁ+¼õ «ÍÝ,þqð"îPóß‹~LA¶ÊU÷…ß°$îëÒ½7ZmάðÇÅ‹e¸oÈ‘móþl„Á/yGß±$Ítõ…/÷ºôQWöÃ'Ãd¸OâLNû䯆߰$ÍÔëÒoÅØøÿè—ƒ~7þ±3D†ûÖ½ö è‡d«{ËÂoX’¦ã%/‹·{æýÒ;è§Z&£Û , “á¾µNüʤ@JesUªÍÝ4üŽ%i²/™mü ¯KGzøãk˜ ÷ ¬±ç{¢ZµÆ¾ ¿cIz±¼.½ZÊöšðÇÜ0îÚœMRÙZýø‚lµÏù·ø;–¤õ¼.}â%/½NôÓ%3¨l>ÿ8"Ã}õî97úñÙê-??ü†%U»]z=ú©‘`eãÉðÇå0sá6Ñ/Èû€¾,üŽ%U£ú’7<3ÒÏ_zwž11Ðà…ÊÚ«Ãd¸O¢Á0yƒ3‹¾cIcØÂ—¥æMí3þ_ê.;zâƒß`åSÄ?~‡ÈpŸDõm_›RYõ@~Üà5¤Ñw,)óænº–×¥·£ŸÞÈTÿ‰;ãÓCd¸Oö÷ä]Ñ1ÈV¹òžð–”çëÒ'ÞŠñîs¼.)ÕäÆðÇø0{ý÷§öÓøî;ÂïXÒhVßæUϼãYß~æýÒkE?e1æú^þ¸&Ã}’µOþ»èÇd­}ú×ÃïXÒ4ï%©±÷ûŸÿ~é^ŽÊ ëÝ{Qü- ‘á>É{ÿjôc ²Ö»ë¬ð;–4Ãy]:#ª—ÉÏ$Ã}ÒO>›¥Ô®E?Î _ÝVª/zEü-Kš™×¥^òÒ\ýÌkÕ»õÄð{&Ã}#üg`òš‡ÿQøKššê‹^ùü×¥¯y4ú)†Ö½é¨ð&Ã}#|â0yÝ«÷ ¿cI“hÁ–ÏŒôÓ¿žº7‘úOÞýt¥{Ý÷âïjˆ ÷¨yØnÜ£*®\ý`ªÍ™~Ë’6ðuéÝVôÓL©Î{ÄßÚîQ}Û×ùÍwØH=ß~Ë’ÖóºôÆÊè§ ˜v · ¿½a2Ü7öøøíÑ5ÈZûìï„ß±T«úëÒoŸì˜T®y$ú)B´Ïúvø=“ᾑu¯=(ú±YëÝwqøK•y¿ôÁK^NüÊsÞ/½ý#¡uÒ߯ßèîYë„¿Š~¬AÞúÝT_üêð[–ƹÁË^R¯}í0²ZÇ~1üN‡ÉpßÈ»½3ú±Ùkýùð[–ƹ£ÏFZóЭÃït˜ ÷mάTÖ~ýxƒ¬ þ³}ø-Kc\ïžs£ÏFZséGÂït˜ ÷©xB¼íäèÇdmð?~ks6 ¿ei\미.úÌa¤5öü•E6R¹ryü-Kãú3 X·^;›Oñ6ܧêùÀåëyDãôC)§êÛ¿9ú´a¤•O?~§Ãf¸OQKwŠ~ÜAö:çÏ¿eiÜjìñËѧ #­ÿÈáw:l†ûÕ<â3Ñ;È^NOžR.5úèÓ†‘Ö[~~ø›á>EÕ—¼!úqc¡±ëχ߳4NµŽÿrôYÃHëÞtTø›á>•ßÌ'ïŠ~ìAöÚgþKø-KãTû¼yÑg #­sÅžáw:l†ûÖ½î{Ñ=È^ÿËÂoY§º×}Ö0Òrúý*Ã} kø£{¿²?ñ.Ñ÷,K½»ÎоjiíS¿~§Ãf¸OaÝÞý؃±Ð>åïÃïY—úß}Ò0ÒZGþI>÷l¸OmåÓ+¢½Þ=ç†ß²4.ùÔTX¿Æþ¿~§Ãf¸OqÝeǼÈÃxQýnªoûºð{–r¯¾ík£¯F^}§·†ßê°îS\û”ˆ~üÁXhýà‡ß³”{½Þ}Ê0ÚÊ2Õæ¿4üV‡ÍpŸê'IŸPS¢wÛÉá÷,å^ë¨?>eieýñð;Ý ÷©îÿ·wçQ“–å€÷-qKL\²¨‰Ñ“1‰YLfÆh’‰‰‰'ÉäœdÆÄÑ,3IÌL4NNLz¥šMm@d“FD1 Š€ì ȪJCËÒ@ÓlBÓõÖ^õÌ©‰ý}ýUÝï]u]çüü‡?¬¯Þç~ê×Uï²b·2¬î^‡_¿;þ™?|¦E§{ÞšèI†ZÜù•ð9]H÷ ¤ÿõS¢×!Ì„ö)>Ï"™Ó»öÄè1†Zëo:-|NÅ}éœñîèu3¡óáó,’9ƒ»¿=ÆPk½+ŽJ6ÓŠû’§ù¡Ÿ^‡0;c:àEá3-’2«ž8>å øþºçï?« ˆâ>‰¬Ü£ [<Æ2vVçÌŠŸi‘„q³x|í“Þ>« ‰â>¡ô7¾È¹ IDATËx<ƒ­W‡Ï³HÆ´?ù'Ñã µ×Úø†ðY]H÷ ¥sÖ?G¯E˜ÍC^>Ó"Ù2:xlÕû~,|VÅ}Biñ+³T€Õ½`ïð™É–þu'E.ÔÛ _«ö ŸÕ…DqŸTVíYJ§½$a& ï¿eüŒ„ð¹I”áƒ[£GêÿÙ²|Yª(îLÿ›çD¯I˜Í#_>Ó"YR½ïÇ£Gj¯ÓùᳺÐ(îLçÜ•ÑkfF÷҆ϴH–´OxkôÈBíõ®:&|VÅ}‚iýúè5 3cظ;ݹˆ"Qé~ùÐè‘…Ú뜻*|VÅ}’YýäRºÍèu 3£õñ·ÄϵH‚ ¶^=®P{íÿ<ßl+î“MóÙÑëfFÿúÏ…Ï´HÝS­}ÆønÀckþKáóºÐ(îŽû¹ÃJuàKÂçZ¤ÎióÑ“ )Tëž>¯ â>á4{môº„™’ñœD‘iÆàñ wl ŸÕÅDqŸtVîQ†Íûvb ;c¸ý¶ñ\…϶HMÓ¿é¼è1…Úëß|Aø¬.&ŠûÒ»îÓÑëfJ룿>×"µÌ^O+¥×ŽQ¨½ÞåGÄÏë"¢¸O!Ïþmôú„™ÒÿúÉás-RÇ´>öûÑã )tÎxwø¼.&ŠûÒÜðŠèõ ³eÐ+Õ~/ Ÿm‘ºÅýÛaç´ŽûÝðy]L÷)eøÀ–\JÀÎèœý¯ás-R· ï¿9z4!…æû2|^Å}J=VX:ÃoÝT+vŸm‘º¤yèk¢Çrè6ÓÞä@qŸRÚ'¼5z™ÂÌi}ä·Âg[¤.éž·&z$!…ÁW„Ïëb£¸O)Õ~?\Êp½Va¦ô¯?5|¶Eê’Á¶k¢GRè]ytÞ9Wܧøfßu]ôZ…Ù2”æA?>Û"Ñinxyô4BÓß>³‹â>Åt/98z­ÂÌé]vxøl‹DÇi2°óZß>³‹â>Å´>þ–,+`§ôZ¥Ú÷áó-™Á½7DO"¤Q­~ÞYWܧ—jݳÆ÷Ÿ–VçÜ•áó-•摯‹AHc¸ãÎð™Ý•(îÓ~÷\½faæ wl+ÕOŸo‘ˆô.;,z!þæ³ÃgvW¢¸O9Ýó×F¯Y˜Ií“ÿ2|¾E¦j¯§—a{{ôøAÝ/>·»Å}Êñ“&LÆàžë=Iæ.íSþ*zô •ö'ÿ$|nw%Šû´³r2¬î^·0“ZǾ)~ÆE¦˜Áí—G¤Ò|ÿOäžyÅ}úé}õøèu 3©Óùáó-2­4{môÈA*Ãæ·JcÅná³»+QÜÒ>ñÏ¢×.̬ÖÑ¿>ã"ÓHïšOF¤Òß|VøÜîj÷€TëŸ7~â#°ôú·~)|ÆE&êÀ—º½0,P÷‚½ÃgwW£¸G½ñ·}y¡ë ØI­c;|ÆE&™îÅ¢Ç Òiÿá³»«Q܃Ò=ouôú…™5º`/ûyŒ"ß/Õ>Ï-ÃÎŽè1ƒtª^>¿»Å=(ÍÃ1zýÂLk}ü-ás.2‰t¿°oôxA:ÃÆ]á³»QÜ£²b÷ñ"&c°í÷u—Ùü¶½ý`ôxA:ý¯Ÿ>¿KÅ=0½¯½Ža¦µÿíÃç\d)Ó½hÿ豂”:ŸOøü.E÷À´?õ§ÑëfÚàîo”ƪ=Ãg]d)Ríÿ£¥t«è±‚”šG¾.|†—"Š{`ª½°”A?z-ÃLëœþ®ðYYŠø•©×.ÕO Ÿá¥ˆâ}¶\½œa¦Î®öûáðYÙ•4}çÀ"õoùBø /U÷àtÎY½žaæõ®:&|ÖE»‹°8£;1…ÏñEqNó°_ˆ^Ï0û†ÃÒ<â—Ãç]d1iúmÑ©µŽ{sø/U÷è¬Ø­ wܽ¦aNÊäö’+Õ>Ï)ÃÆÝÑãy ‡ã9Šžå¥Šâ^ƒô®<:zYÃ\hŸòWáó.²ô®Ü=6ÿ™Ë—ÍL÷dô0yÃêžR­^øÌ‹ìLZß8þ¶X¼îÅÂgy)£¸×!«ŸäIx0%ý¯Ÿ?ó"“jݳËð[£ÇÒk}ì÷Âçy)£¸×$½k>½¶an´OxkøÌ‹zL ¿Aüàèy^Ê(î5Iû“½¼an [÷ŸB=÷"OÕ†¥1¸íÒðy^ê(î5Iµö¥ôZÑkæFóÙã»:EϾÈw§ù—•aëèñ€™Ð½`ïð™^ê(î5JÓéÑkæJç³>÷"gÍSÊ`ëUÑc3£µññs½ÄQÜk”Ñ­ê€)ê4Jó Ÿ Ÿ}‘QzW4z"`vôZã GÏõRGq¯QªõÏ_HLÏhª=ÿ2ßé|îï£GfJóYás=‰(î5Kÿ–/D¯u˜Ï[D:ß]‚Ò:öM¥ zÑc3¥sú»Âg{QÜk–ÑB¦¯sÖ{Ãç_æ/ÍC^åbT˜€æ†W„Ï÷$¢¸×,Õ/^ë0ŸýÒúÈ ßd~Rð¢2Ü~[ôʇ™3üÖ7Ãç{RQÜkw€Ãæ}¥ùþŸßdöSíû‚2¸çúè%3©{éÃg|RQÜk˜Î9+¢×<Ìõ75Õ¾?¾Èì¦Z÷¬2¸ãÊè¥3«õÑß ŸóIEq¯é9@œÑ¯^ÕÚg†ï2{ÝÁhô4G`’·|jø¬O*Š{M3¸÷†è¥s­ÿÍsKcõ“Â÷™T{ÿ`Üöåè¥ 3­Ãá³>É(î5M÷ ûE¯}˜{½kO(•{„ï’?£Ó¯Û¾½¤aæufü‰ØŠ{MÓ<ì¢×>0*ïWn,»‡ï ’7Õ/ñ+*LÃpPªý^>ó“Œâ^ãØè¡z_ûDi¬|Bøž ùÒüàÏ–á[¢—0Ì…Á–‹Ãg~ÒQÜkœîë¢gxHïšO•ƪ=Ã÷É“ÖñPJ·Š^º07:Ÿÿ¿ás?é(î5NóWGÏð]z×}º4V=1|oúgT F?ÛÓÓÜðòðÙŸt÷šgp×µÑs|—þ¦ÓJc¯§…ï RßÛ=ö®ùdô2…¹3¸ëÚðùŸF÷šÇØ ~·_>~òeôþ õJó Ÿòe éž¿Wø0(î5Oó/‹žàQ îÛ<žÏè=Bê‘öIow>;j~èçÂ÷iDqOƆz6ï+­£~-|¸TëŸ7¾öˆý"¥Qƒý`QܤsÆ?FÏðýt›¥}Â[Ã÷ ™~Zûý2ܱ-zÂÜëÎÉi2£(î Rí÷Ã¥ úÑs<†îŹ]ä<}Ë~ÕG¢—ðæÁ¯ ߦÅ=Iú7žùõ ÔTÿ–‹ÆÿÐŽÞ/dBY±[iŸøgeXݽԀ‡ îüJüÞ0Å(îI2ú)¨¿Ñ©­ý^øž!K›æ¡¯)ƒÛ.^^À¿Ó9ëŸÃ÷‡iFqÏ’½žV†ÿ~½5Õ»úØñ=½Ã÷Ù¥Tûÿhé]~„ӡކÃRøÒð}bšQÜ¥wõG£GX€á·¾YZþOá{‡,<Õºg—îö_| ÔÓ`Ë%á{Å´£¸'Jë#¿=#ÀB ‡ã «õÏßCäñS­}féœõÞ2¬î^9ÀãèœúÎð=cÚQÜ3eÅîe¸ýöè9aغ¿tNûߥ±rø½D¾'Õ>Ï)sWïÍ$Ðï”jŸç†ïÓŽâž,Ý‹ö` ¶^]ZÇþvø^"ßNuÀ‹K÷¢\CÉô®ùTøþÅ=Yš^>þéÈm°åâÒ:úõá{ʼ¦u䯎?øË ½€Ehû¦ð}$"Š{ÂôoýRô¼K¤ýçJóˆ_ßWæå‚ÓögþWl»&ú°»`øàs{Ú¡âž0í“ÿ"zf€%6¸ãŠñÃ}æõÃhbY±{ióãÛs–N#ú0K {áúø½%(Š{ÂŒî í|L˜Mƒûn,Sÿ®T랾פ͊ÝJóð_,Ý/X†n>¤ÀknxEü>Å=izWnŒž`’ºÍÒûÊq¥µñ ão£÷œÚgåã{æw/ÞP†Ü}ô€ éßú¥øý&0Š{Ò´ŽúµèÙ¦dø­›J÷¼Õ¥yÈ«Ã÷ž:¥ÚûKûßþ¸ô®8ª wl‹>LÀ´?ý¶ð½'2Š{֬ح î¹>z~€€SiFOôlñ+ó÷Müª=Çwƒéž¿WÜvi)ƒ~ôá¦hô`´Æš§ÄïEQܧóù÷DÏh¸ãÎñé4í“ÞQª÷ýXøž4‰§˜Žîyß=méßt~)Ý*ú-®[iÔ`oŠŒâž8£'†•^+zŽ€RÓ»òèÒ>ù/KóC?_«ž˜g?ÛûJëÃÿ¹t>÷÷ãS_w~Õ7êÀÿ7–æ^¾WEGqOžÑ·mªß-ƒ­W•Þ.Sß9þöºùþŸŸr²g­Ø}ü¤ÒQAoŸôöÒ½pŸÒ¿þT“«¿ù¬ðÎÕ¨A÷äq‘*°`ƒ^Ü·¹ôoý0‹:gÿkx×jÔ$Šû¬Ciÿ‡Ñ3°$ZÇüfx·jÔ,Šû,eåã''d6¸ëÚï}~„Å}ÆÒùü{¢g `—Œž®Ý©5Œâ>c©Ö=»”N#zÞeøÀ–ÒXõÄðNÕ¨a÷Lï²Ã¢g`Q:Ÿûûð.Õ¨i÷ÌèÖIn d3lÜUkžÞ¥5â>£éo:-zö¤sö¿„w¨F£¸ÏhZG¿>zövÚ°½}|­^t‡jÔ8Šû g°å’èØ)Ý ÷ ïNšGqŸá´?ñ_£gàñu¥ZÿüðîÔ¨y÷YÎÊ=ÊྣGà1u/\ß›–×?ŠûŒ§óÙ¿žE€ïkØÙQªõÏ ïLQÜg=«Ÿ\†;¶EÏ$À£êž·&¾/-ÏÅ}Ò9gEôL|aó[î$³|磸ÏAªuÏ*ÃÖýѳ ð³ÿ5¼'5EqŸ“t/X=›V÷–jí3Â;R#Q÷9IµÏsÆÔAçŒw‡÷£F²(îs”îEûGÏ(@Þsi¬~Rx7j$‹â>G©ö}A)Ý*zV€9×þÔŸ†÷¢FÂ(îs–îÅ¢g˜cƒ­W—ÆŠÝÃ;Q#a÷9Kµÿ”ÒkGÏ,0§ZßÞ‡I£¸Ïaº—=³Àêo:-¼5GqŸÃTûþP)FôìódÐ/ÍC^Þƒ‰£¸Ïiº_Ø7z|€9Ò»ì°ðþÓHÅ}N3z¼ðè1Ó6êÕ>Ï ï?äQÜç8sWFÏ10:§¾3¼÷4f Šû§Úëéeظ+z–€6¸ëºÒXù„ðÞÓ˜(îsžÎçß=ÏÀ k}ä·ÂûNcF¢¸Ï{Ö<¥ ·ß=ÓÀ ê]{B|×Y>;QÜ¥´?ý?¢ç˜5ݪT¾$¼ç4f(Š»Œ;<¸ãÊèñfHçÌŠï8Ëg+Š»ŒÓ:úף瘃mהƪ=ÃûMcÆ¢¸ËÃéßpFôœÙ ¥u䯆÷šÆ Fq—‡3z ñèqċջüˆðNÓ˜ÑôïÙT–ù)C¾“ÞŽžw ©áŽm¥ÚûÂûLcF3Ø~GYÖXç –o§Úï…¥tÑs$Ô>ῇw™Æ §´w”eý_þB¤>éœý/Ñs$ÓßtZx‡iÌrVîQÊ`P–U½2þÅH}²ê‰epϦèù’¶(Õ¾nL0ÕºgßëeÕá¿þb¤^i÷æè=H¢}ÒÛûKcÆS½ïÇÇïõ²æÇ~/üÅHýÒ¿þsÑûPsýM§‡w–Ƥuìoßïeí3Þþb¤~i¾ÿ'Jéµ£÷ ¦œ"³ljéœþã÷|Y÷ò£Â_ŒÔ3Ý ×Gï @MµOzGxWiÌIz—6~Ï—õn¹(üÅH=Síõô2Ü~[ô¾Ôñ.2+v ï*9Iÿ¦óÆïû²Aãîð#õMû½752lÜ]ª}_ÞQó’»—Q_Y6úŸÆ/ŽQRÛô¿ñ™è=¨‰–›”i¦yèxø½÷Ö‰o QRߌ.<¶ŒÜ#€è]vxx/iÌY:g¼û‘Ž{Õ±á/Jr\Í Ì§Á}›Kµöá¤1Ç·è÷Á·‡¿(©yVîQ·_¹_QúÝÒ<ìµñ}dùœeåÊ µý‘Å}¤ÚðŠø'µNóC?WÊ µeA:gÿKxiÌaZǾéÇááâÞ>gEø‹“ú§ûÅ÷Eì@þgŽïlÝAs˜Þ×>ñèŽïîÇ)Ÿ5O-ƒ{oˆØ7€)îØVª}(¾ÌaªµÏ,¥Óxôâ>Ò<âuá/RêŸæ‘¯+eПöÞLÓpPZßÞ;æ5í“ÿò{É#Š{÷²#Â_¤äH÷K˜æÖLYçœåá}cž3Ørñc÷aëÒXûÌð* ²æ)epϦiîÀ”ô7Ÿå¼öåqiýúG=.(î#í³Þþb%Gœ2³g¸ýöRíû‚ðž1Ïéóœ+îƒÆ½¥±æiá/Xr¤{ÑÓØC€ièwKë¨_ ïóœæ¿ü}Ï÷÷‘öéï Ñ’$«Ÿ\wc’[0%íÏüÏøn1çéßpÆÂŠû`ûÖ²cÍSÃ_¸äHóC?_J¿3É}˜°ÞïóžÖq¿û˜ÇèQ‹ûHçÂõá/^ò¤sæ?Mb¦`°õªñ'¢ûDcÞoüqßæÅ÷Òï•êWÇÿ’#+v/ýÍgO`+&iXÝ[ª_ß%æ<Ý ö~Ücµì12¹ùBOS•Nµß ˰ºg)÷`Ò£~ø?‡wˆyOó Ÿ.¥×Þµâ>ÒúôÛÃÿÉ“ÖÇß²T[ 0aí“ÿ"¼;Ì}V?¹ôï¸j§Ž×ã÷Òn”ê ŸŽÿ£$Mz—¶[ 0I£[:GwYVz—±ÓÇlÙNýŠrç5eÇj,ÈNfÍSËà®ëve/&¨ÿÏz2êòø´?õßtÜvª¸ô®<&ü“~ *îeÐ/­ÿAø+yÒýò‡¼(€¥7ú%¼yØ/„wƒyOµþy¥¿È§Î/¬¸ô:¥yÌo†ÿÑ’$«ö,ƒ-/jqKdüåë[â{Áœ§ZûŒÒ¿í²EÆe‹:ö­KuèÏ…ÿñ’#£‡: ›÷-z‘»`8,í“ÞÞæ=Õ>Ï)½[¾¸K‡rQÅ}dм¿4úáo‚äH룿SÊp°K‹X¸Î9+Â{À¼§:ð%¥××wùX.º¸u[¥uü†¿’#Ýó÷Úå ì¼ÞåG†þÏ{šüÙ2Ø~û’Ï]+î#ƒ~iæoÂßI»—þ×OY’… ìĽÚW>!þóŽÓ>þÇg©,•]/îé\zhÙ±êIáoÔÿ¢ŒÁ¶k–jÙ¢Óù¥±ÆÃ3QYýäÒýò¡K~\—¬¸ô·]Wªƒ&þÍ’ú_¬Ú¸{)—ðÁÖ«KµîÙáŸ÷óšæ†——þWMäØ.iqk7JëÄ·…¿iRï´6¾¡”AoÉ—̳ѯڣ»—DÎÏeV=±tÎzo)íÉ=9~é‹ûCz›Ï-ÕA?ÿ&JmÓ9õ“Z~0w÷m.Õ~/ ÿ|Ÿ×/$ûÛ®ø1žXqë¶KçüueÇjçXÉ£gtµ;°k†ÛoŸŠý¹>oiü3¥{í‰S;Γ-îÜkiô޲cåžáo°Ô,«ö,ýÍgMcÀL>¸µ47¼"þ3}ŽÒ<ìµ¥wÝIã»+NÓTŠûw ¸­´Oû?eÇš§†¿áRŸTkŸYw~ušKfÂpÇ¥éÔä2•¬Ú³´Ž{séÝxfØñžjqÿŽAãžÒ9o¯R}àeñAj‘jÿ)Ãí·E,GHi¸c[iüÊðÏðYOóð_,ÝK.ƒwEò˜âþÝú[.-íÏþ]iìóÜð#Áƒqȫ˰½=zI@í wϯŽþìžÅTûÆIEND®B`‚‰PNG  IHDRÚЉ}±_ pHYsèèµ{Rk IDATxœìÝw´fw]èfR…P¢(ED¹HU;?šâµßËõ¢rQX¨WTÔëÕ«°¼r¦$“ɤ’N©„Þ!…R ¤÷LÊRgBê”<ûé{~kê¥$™33gïÏS^¯µÞkñkÖ‚Ùû»>ó=Ÿó<Ï &K¿ǯ‹þMÇF÷âÅÑ9õCÑþì;¢µ÷+£µh›h}òy’ž£bÏŠrÍÙo2LœjÝQìûcéÿö—¤yoãÝûÞ¯š½‹ïœöáÙ»ùþÇÅðáë#úìã€yö¼ùþhNÙYƒ{.ˆÞe{Dç¤?Œâ€×GkѶùÿ¨Æ´bŸòñ»²_m˜XÕSߌbŸW¥ßHRc-Ú6Šß“þ(z—-Áª £ì¬Ï>ŽØ mÆH¹öèßt|tÏùXÿ”O¨‘æ±ö¯j݃ٯ9L¼ò‰{¢Øëåéw’”Ö¢m¢8ä§£{ÎßDÿæ¢t/ 0V,ÚŒ²a?÷]Ý >Å¡?­™ùÿ&°öa?UëÑì7¦FùøÝQìõ#éw’42íûšèœù1Xy¶¯›qmFLÙ~*ú7íã/Z»íœ?ÜK^çÈwFÕõQ­Ð´ò[·F±|×ô»I¹–îíÏÿ×èßt\”uÙÇ5ßâ À(è³[êSÿ$ZKwÊâ¥)©süïDôÛÙ'L­ò‘›£Øã%éw’4²-Ù>ÚŸûèßtl”¿00 ,Úd)Ë|ã’èœôGÑZ²Cþ°.MYÝS>8ûõl@®òák£X¶Kú]$|KwŠÎ)ƒû.Ï>º¦šE€†•O+z—¯ˆbÿ׿åÒ”Ö=û¯"ª2û8þÍð¯E±Û¤ßHÒ¸Tð“Ñ»rß([eáSÇ¢ @C†_“?­ÅÛ¥àÒ4×;ÿ#ª*ûH¾Çð¾Ë|­º$mnK¶Î©Šáš›³q€©aѠZõåÙïOM¶%EïÂOdŸ ÀsÞ{‘¯Y—¤-¬}įÄ`åÙ³?› >mêP¢Ã1QðúôÁZÒ·ë_¶,ûdæ`x÷y³ŸÐ}— IãZqðOEÿÖ“"* 7u°h0ŸÊ2ú·žŧ^—>HKú·fDÿ«ûeŸÀf°l#I[_qàgfánæ—E€ùúЍÛOâ 7§Î’¾gÉæšÃ²O` n?5Z‹¶Í¿_¤1¯8ìçbpÏùÙÇ:Àİh°•†_íϼ=}P–ô=-Ú&7•}D[apóñÑšY˜Ï IPû¨÷Äð‘[²v€±gÑ` •ëWGçÌ¿˜ýa~öp,é–lnú\ö1̃þÕçß5HÒ¤´hÛÙŸm”O?š}¼Œ-‹6›kЋÞå{Fk·Èˆ%}‹·‹ágdŸÀ<ê}ù_òï$i’Úã%ѿ氈²Ì>âÆŽE€Í0\}c‡þLþ,éÙ—lVž™}T󭪢{ÖGóï$iÂ*Žøå~ëöìS`¬X´˜‹^Ý >îk¢¤‘_²9+û´êR•Ñ=éòï $iÒZüüè^ð‰ÙOô`Ó,ÚlÂàÞ‹£µï庒ž½%ÛÇð®/f@ÝÝèýkùw’4¿%†_Ÿ}ÒŒ<‹6ÏfЋîÅ‹£5³0}¸•´‰O²¹óììhJ¿ˆög~%ÿNB’&±EÛF÷âEå0û´YmžÁðÑ•Qú3ù­¤9,Ùœ“}d «ŠÇ£}àòï&$iBkõž(×=”}ÜŒ$‹6ߣwõ¡ÑZºcú+i-Ù!†÷œŸ}dIªuF±Ï«òï($iRÛã¥1XyVöq0r,Úü»~;:§$p•´é–lûÎÍ>5€då÷D±âeùw’4©Í,ˆî²|€‘aÑ`ã?È×ÞÅaoËX%m:K6Àw(¾6ŠÝ_g!I\ûÈwEùô·²|€‘`јzƒ»¾­e/JR%ÍqÉfÕÙÇ0b†÷^4{o~w!I“ܾ¯‰áš›²|€tm€©Ö»bïhÍ,ÌN%mºÅÛù$àY n?5Z‹¶É¿Ã¤InéN1XyVö‘Ê¢ 0ÊAtÏùXþ@*in-Ú&·ž”}r#npã±ÑšY—!I“Ü¢m¢wÕÙG>@‹6ÀÔ)»¢}Üo墒6cÉæÄì£ýK—æßgHÒÔ=ï#ª2ûØhœE`ª”ëWGqÈ[Ó‡OIslfa nú\öÑŒ“ªŠîéɿפ)¨sâû#úì“ Qm€©Q®½?Šý_›>tJšc3 bpí§³` ûÑ9æ×óï7$i jû½"ûähŒE`*”kï‹Ö¾¯I6%ͱ™Ñ¿úì£cUw}´ùéü{Iš‚ÚŸ}G”õÙG?@#,ÚoøèÊhíõòô!SÒÜë_±WöÑL€jÃê(öyUú]‡$MCí#~%ÊöÚ죠vm€‰6|äÖh-ß5}¸”4÷úW¬È>:€ R®¹)ŠÝ_~ç!IÓPñ韲³.û訕E`b Ÿ¸'Z+~8}¨”4÷zýköÑL á=çGkѶéw’4 GürD÷é죠6m€‰T®} Zû¼:}˜”4÷zçþMöÑL°ÁõG¦ßHÒ´Ô>ú½ýNöÑP ‹6ÀÄ)7<ŧ^—>DJš{ÝÓ>Q•ÙÇ0áz_þ—ô{Iš–:'ü·ˆa?ûè˜wm€‰ROFqàÒ‡GIs¯{â(‡ÙÇ0 ª*º§|0ý>D’¦¥ÎY™}òÌ;‹6Àäô¢}ô¯¥’æ^ç˜÷F ºÙ§0M†½è¸G”¤Æê]¹oöÉ0¯,Ú“¡,£sÚ‡Ó‡EIs¯}Ä/GôZÙ§0…ªÎºhü–ôûIšŠfÆàöÓ³~€ycј݋犒æ\ûзFÕ~*ûè¦Xµö¾(Vüpú=‰$MEKwŒáƒWgýó¢ 0öú7>Z3 ò‡DIsª}Л¢*Ï>:¢|øÚhí¶sú}‰$MCÅ^/òéG²~€­fÑkÃ57GkéNé᤹Uì÷š¨6¬Î>:þÃðγ£µh›ô{Iš†ÚŸ}GİŸ}ôl‹6ÀØ*‹'£ØïÇÓ‡BIs«X¾k”ß•}t|Ÿþ•{§ßHÒ´Ô=ÿŸ²}€­bÑOå0ÚŸûíôaPÒÜ*vA”«¯Ï>9žU÷Ì?O¿C‘¤©hfAôo;5ûØØbm€±Ô»dIþ (in-Ù>†ß¸8ûØxnƒN´ø¥ü»Iš‚Še»Äð‰UÙ'?À±hŒÁýWúÎdi\šYƒÛNÉ>6æ¤zú‘(öyUþŠ$MAÅao‹ô²~€ÍfÑ+e{m´öyuúð'inõ¯:0ûØØ,嚣µÛÎé÷*’4 õ.]š}ìl6‹6ÀXéœòÁô¡OÒÜêû0¦·Ÿ­™é÷+’4ñ-Ú6†~=ûØØ,m€±Ñ¿õäüOÒœêžýWÙGÀVé]üÉô;Iš†Úû¿6Êî†ìc`Î,Úc¡\¿:Z»ï’>ìIÚtÝ“þ0¢*³ €­SUÑýÂï§ßµHÒ4Ô=ï³O}€9³hŒ…Î ÿ-}È“´é:G¾+bÐÍ>2æG¿íÃÞ–~ç"ISñR«oÈ>õæÄ¢ 0ò+ÏÎð$m²öAoŠªýTö‘0¯ªµ÷G±ç¥ß½HÒ¤×þôÏG ÙÇ>À&Y´FZÙ^­½^ž>ÜIz^Õº² €Z øZ´–lŸ~#I“^ïëeù›dÑi3ÿ"}¨“ôÜËv‰ò[·fµÜpTú=Œ$MzÅî/Œrýêì#à9Y´FÖÆïâlÍ,Lê$=G‹ŸÃ{¿œ}\4¢÷¥¿Ï¿‘¤ ¯súŸf÷ÏÉ¢ 0²ÚŸ}Gú0'é9šYƒ›ŽË>*šS£ó¹ßο—‘¤Infa ¾>ûÄxVm€‘Ô¿åÄüANÒsÖ¿bEöQиª³6ÚüdúÝŒ$MrcÞ›}Ü<+‹6ÀèéÑÚçGÓ‡8IÏ^÷ì¿Ì>)Ò”ßÅî/L¿£‘¤Inpç¹ÙÇ=À3²hŒœÞW–¥o’ž½Î ï›ý˜d€i6¸õ¤ô{IšäÚ½É]40’,Ú#¥l¯Ö²§o’ž¹öao‹èµ² €‘Ð;ïÒïk$i’ëßzröQð},Ú#¥{Ñ'Ó‡6IÏ\±÷+¢Zÿpö10:ÊAtŽ|Wú½$Mj>ÕEm€‘Q¶Ön/HÚ$}Åî/ˆò‘[² €‘S=ý­Ù_Pʾ¿‘¤I­Û©ÙG=Àw±hŒŒîÿœ>¬Iz†mûÎÍ>"FVùàUÑZ¼]þ=Ž$M`íƒßìSm€‘bÑ eñD´vÛ9}X“ôýõ¯9,ûˆyý«H¿Ç‘¤Imp§_F‡E`$ô.Ý-}H“ôýõÎÿÇìã`ltOûpú}Ž$MbcÞ›}Äü‹6@¾~'Z+~8}H“ôÝuŽÿÇ °9z­Ù¯8ɾב¤Il¸ææìS`–E ]ÿºÏ¦g’¾»öa?;{1Àæ)Ÿ¸'Še»¤ßïHÒ¤Õ=ë£ÙG<À,‹6@®²ŒâÀ7¦g’þ_Å>¯ŠjÃêìÓ`l ï8#Z3 Òïy$i¢ZºS”ÅÙG<€E ×`Õ—ó3Iÿ¯ÝvŽrÍÙGÀØë]ø‰ü»Iš°ú_Ý/ûx°häêœøþô¡LÒ¿5³ ·ž”},L†ªŒÎ±ÿ9ÿÎG’&¨öÁoÎ>Ý,ÚyÊÖcÑZ²}úP&éÛõ¿²{ö±0Qªâ‰(öý±ô{I𤆫oÈ>Þ)gÑHÓ»|Eú0&éÛuO|DUe §|è¿p(IóXïKŸ}´S΢ £,£øÔJÆ$=/ÚŸþùˆ~;ûT˜Xý«I¿’¤I©X¾kÄ ›}´SÌ¢ bpßå郘¤çE±×Ë£Ú°:ûH˜xÝ/ü~ú]$MJÃ;ÏÉ>Ö)fÑHÑ=û¯Ó‡0iê[²ÃìGP¿ª³6Šý^“'$IP÷ôdëÀ³h4¯FkŧaÒT7³ ·œ}L•¿ôÔZ¼]þÝ$yÅò—F ûÙÇ:0¥,ÚÜ{Qú&M{½KeS©ÅŠô»!Iš„†ß¸$ûH¦”E q³>š>|IÓ\ç„÷ETUöQ0ª2:ÇþFú‘${½sÿ&ûD¦”E Yå ZËwM¾¤i­}à¢ênÈ> ¦ZÕz4н~$ý®H’ƹbïWfçÀ”²h4jøÀ×Ò/iZ+vA”­Ì>ØxWzßeÑZ´Mú‘$såãweçÀ²h4ª{Ñ'Ó‡.i*›YûÎÍ>ø½‹Ý—JÒÖÔ¿æÐ죘Bm€F‡½-}è’¦±þe˲_¾WUFçè_M¿;’¤q­û…ßÏ>É)dÑhLùô£³Ÿª‘=tIÓVç„÷ETUöÀ3¨Ö?Åò]Óï$i+–½(b8È>Ê)cÑhLÿÆãÒ.iÚjô¦¨º²_žÃðÎs¢5³ ý.I’Ʊòáë²q`ÊX´Ó9ýOÓ‡-iš*öxq”O®Ê~õ˜ƒÞyÿ;ý>I’Ʊþ×Ê>Â)cÑhLñ©×¥[ÒÔ4³0†w}1ûµ`®†ýhñKù÷J’4fuOûPö L‹6@#ÊÖc>úTj°þe˲_{6Sùä½QìþÂô»%I§Úüdöñ L‹6@#+ÏJ´¤i©süïFTeökÀÜvJúý’$U3 ¢ê¬Í>¾)bÑhD÷‚çZÒÔÞÿ'¢j?•ýʰºgüYú=“$SÃo\œ}tSÄ¢ Јö‘ïJ²¤‰oéŽQ®¹)ûu`+U½§g¡*ý¾I’Ƥþ•ûdÝÀ±h4¢µìEéC–4é n8:ûU`ž”^­EÛ¤ß9IÒ8Ô=ófÛÀ±hÔ®\{ú€%Mzݳÿ2ûU`žõ.ú×ô{'I‡:Ÿ}Gö‘ L‹6@íwž“>`I“\ûзFôÛÙ¯:ó­Dûð_H¿’¤Q¯Øó³Ol`ŠX´j×ûʲôKšÔŠ=^ÕSßÌ~ͨIùØÑZºSú=”$zUûÉì#˜m€ÚuNþ@úp%Md3 cxÏùÙ¯85ë_}pþ]”$xåƒWe×À”°hÔ®8ìméÕ4‰õ/]’ýzЄªŠÎ±¿‘~%I£ÜàÖ“²Ok`JX´j×Úã%éÕ4iuŽzOD9Ì~½hHµauË_š~/%I£ZÿkûgÕÀ”°hÔªì¬O¬¤I«Xñ²¨6¬É~½hØðŽ3Òï¦$iTë]ðÏÙÇ40%,Úµ®¹9}°’&ª™…1¼÷¢ìW€$ÝÓ>œG%I#X÷Ô?Î>¢)aѨÕ`åY郕4Iõ/]šýZ¨ê®bßK¿§’¤Q«sÔ{²h`JX´jÕûúÁ郕4)uŽyoDUf¿Ö$Þwùì'gßWIÒ(Õ>ð ÙÇ30%,Úµê^<“>XI“P±âeQmX“ýJ0"z~<ýÎJ’F©bïWfÍÀ”°hÔª{ö_§VÒØ7³0†÷^”ý:0JÝhòÓùwW’4"Ë^”}2S¢ P«ÎI˜>XIã^ÿÒ¥Ù¯2#¨|ôŽh-Ý1ýþJ’F¢EÛfËÀ”°hÔª}ô¯åVÒ×9ê=å0ûU`Dõ¿º_ú–$J1èdËÀ°hÔª8ä­éC•4®+^ÕÓd¿ÆŒ²ªŒÎgß‘~—%I£PÕz,ûT¦€E VÅ~?ž>TIcÙÌ‚Þs~ö+ À(Ÿ¸'ZKwʿӒ¤äªõeÉÀ°hÔªµ×+Ò‡*ië]ðOÙ¯/cÄWHIÒÆE›‡³c` X´jÕZ¾kúP%[íÃÞ1ìe¿¾ŒÝWHýéw[’”Yµauöi L‹6@­Z»¿0}¨’ƪÝvŽòñ»²_]ÆÐÆ{¥Ö’òï¸$)©jÚ죘m€ZùG´y n:.ûµ`Œõ/ß3ýŽK’²ªžþVö1 L‹6@­Z‹¶Iª¤q©{êg¿²Œ»ríOÿ\ú]—$edÑh‚E VÙ•4.ûýxTÝõÙ¯, |l¥O—4•Y´š`ѨUö@%E‹¶òÁ¯g¿®LþWvË¿÷’¤†³h4Á¢ P«ìJ‡úWì•ýª0i†ýhúÖô»/Ij2‹6@,ڵʨ¤Q¯óÙwDTeö« À*¹9Z‹ŸŸ~&IMeÑh‚E VÙ•4ÊË^Õº²_S&XïâO¦ßƒIRSY´š`ѨUö@%rƒ[¾ýŠ0醽hü–ô»0Ij"‹6@,ڵʨ¤Q­{ʳ_O¦D¹æF_!%i*²h4Á¢ P«ìJÅŠ½_UûÉì×€)Ò»ðé÷b’Twm€&X´j•=PI#×ÌÂ~ã’ìW€i3èFû 7åßIRY´š`ѨUö@%Z½ þ9ûµ`J•]­EۤߑIR]Y´š`ѨUö@%RíC~jö7‡ Kï‹—~O&IueÑh‚E VÙ•42-Ù>ÊGnÉ~%˜rUwC{¿"ÿ¾L’jÈ¢ Ћ6@­²*iTêu¿ì×f n?-ý¾L’êÈ¢ Ћ6@­²*iê|æíå0ûu€ÿÐùüï¥ß›IÒ|gÑh‚E VÙ•”Þn;GùäªìW¾Kµî(vûüû3IšÇ,ÚM°hÔ*{ ’²\ûéìמQÿнÒïÏ$i>³h4Á¢ P«ìJʬsô¯ETUökϬDûз¦ß£IÒ|eÑh‚E VÙ•”U±l—Ù߀QV>tM´f¦ß§IÒ|dÑh‚E VÙ•”ÕàÆc³_?˜“îÙ•~Ÿ&Ió‘E  m€ZeTRFÏÿ^ö«sVu×G±×ËÓïÕ$ik³h4Á¢ P«ìJjºbùK£zú‘ìW6Ëà–/¤ß­IÒÖfÑh‚E VÙ•Ôtƒ[OÊ~í`‹tŽÿôû5IÚš,ÚM°hÔ*{ ’š¬{âû³_9Øbå“÷FkéŽé÷l’´¥Y´š`ѨUö@%5û•QxÆ[ÿ²eéwm’´¥¹§š`ѨUö@%5ÕàæÏg¿n°õ†½hôÆôû6IÚ’,ÚM°hÔ*{ ’š¨ó¹ßÎ~Õ`Þ ï¿2Z3 ÒïÝ$is³h4Á¢ P«ìJª»b÷FµîÁìW æU÷Ì?O¿{“¤ÍÍ¢ Ћ6@­²*©îמýšÀ¼«ÚOF±ç¦ß¿IÒædÑh‚E VÙ•Tg£ÞQUÙ¯ÔbpÝéwp’´9Y´š`ѨUö@%ÕÖÒ¢|rUö+õ©Êhþ ùwq’4Ç,ÚM°hÔ*{ ’êªÿµOe¿^P»òÁ«¢5³ ý>N’æ’E  m€ZeTRµÿňr˜ýz@#º§}(ýNN’æ’E  m€ZeTÒ¼·dû(½#ûÕ€ÆTÖD±û òïæ$iY´š`ѨUö@%ÍwýK—d¿Vиþ{¥ßÍIÒ¦²h4Á¢ P«ìJšÏÚ¾>bÐÍ~­ yÃ^´øÉô;:Iz®,ÚM°hÔ*{ ’æ­™…1|à«Ù¯¤Þûåü{:IzŽ,ÚM°hÔ*{ ’æ«Þ¹›ý:@ºÎç/ý®N’ž-‹6@,ڵʨ¤ù¨ØëåQuÖe¿N®zêÑZ²Cú$=Sm€&X´j•=PIóÑpåYÙ¯ŒŒÞEÿ7ýÎN’ž)‹6@,ڵʨ¤­­{ò²_#-ý"Š}_~w'Iß›E  m€ZeTÒÖTìñC9<ƒÁ-_H¿¿“¤ïÍ>Ћ6@­²*ikÜxLö+#«sÔ»Óïð$é;³h4Á¢ P«ìJÚÒ6^DUe¿B0²ÊGoÖ¢mÓïò$éß³h4Á¢ P«ìJÚ¢–ìå“«²_y½sÿ&ÿ>O’þ-‹6@,ڵʨ¤-©é’ìWÆBÕ~*Šå»¦ßéIÒÆ,ÚM°hÔ*{ ’6·öþ¯t²_ýkK¿×“¤Y´š`ѨUö@%mnû¿”ýÚÀx)‡Ñ>øÍéw{’dÑh‚E VÙ•´9uO|ö+cix×Óï÷$É¢ Ћ6@­²*iÎ-Ý)ªµ÷g¿20¶:Ǽ7ÿžOÒTgÑh‚E VÙ•4×úWî“ýºÀX+¹9Z3 Óïú$Mom€&X´j•=PIs©}Л"†ýìׯ^÷´§ß÷IšÞ,ÚM°hÔ*{ ’6ÙÌ‚~ó+Ù¯ L„jýó_Óž~ï'i*³h4Á¢ P«ìJÚTÝÓ?’ýšÀDé]ôÓïý$Mgm€&X´j•=PIÏU±Ç‹£j=šýšÀD©º¢Xñ²ôû?IÓ—E  m€ZeTÒsÕ¿úàìW&RÿšCÓïÿ$M_m€&X´j•=PIÏVû 7F”ƒìW&S9˜½ƒË¾”4]Y´š`ѨUö@%=[ÃUf¿0ц+ÏJ¿”4]Y´š`ѨUö@%=SÝ/ü~ö«S¡sô¯¥ßJšž,ÚM°hÔ*{ ’¾¯%ÛGùäªìW¦B¹æÆhÍ,Ì¿”4Y´š`ѨUö@%}o½‹þ5ûµ€©Ò=åƒé÷®¥¹î IDAT‚’¦#‹6@,ڵʨ¤ï¬ØûQõžÎ~-`ªTëŠÖÒÓï%M~m€&X´j•=PIßÙàæã³_ ˜J½ ?ž~?(iò³h4Á¢ P«ìJú÷ÚGürDUe¿0•ªÎÚ(–ïš~O(i²³h4Á¢ P«ìJšmfa”]“ý:ÀTë_u`þ]¡¤‰Î¢ Ћ6@­²*icÝÓ?’ý*Ã~ûýxú}¡¤ÉÍ¢ Ћ6@­²*©µÛÎQmX“ý*1¸ésùw†’&6‹6@,ڵʨ¤Þ%‹³_àßUe´ù©ô{CI“™E  m€ZeTšîŠ=(ªî†ì×øƒ;NO¿;”4™Y´š`ѨUö@¥énpÝÙ¯ð½ª*Ú‡ÿbúý¡¤ÉË¢ Ћ6@­²*Moí_Q²_à W]~‡(iò²h4Á¢ P«ìJÓÛðÎs²à9tŽzwú=¢¤ÉÊ¢ Ћ6@­²*Mg#ß™ýè›0|à«éw‰’&+‹6@,ڵʨ4…Í,ˆòÁ«²}`:ÇýVþ¢¤‰É¢ Ћ6@­²*M_ÝSþGöcÌQùÈ-ÑšY˜~¯(i2²h4Á¢ P«ìJSÖâí¢|òÞìÇØ Ýߟ·(i"²h4Á¢ P«ìJÓUïüÿ“ýÈ›©|üîh-Ú6ý~QÒøgÑh‚E VÙ•¦§bÙ.QOd?òÀèžþ‘ô;FIãŸE  m€ZeTšžú—.Í~Ü€-T­½?ZK¶O¿g”4ÞY´š`ѨUö@¥é¨X¾kTÝõÙ;°zç|,ý®QÒxgÑh‚E VÙ•¦£þW÷Ë~Ô€­TmX­¥;¥ß7Jß,ÚM°hÔ*{ ÒäWìõòˆ~;ûQæAï‚N¿s”4¾Y´š`ѨUö@¥ÉopíáÙ90OªöSQ,{Qú½£¤ñÌ¢ Ћ6@­²*MvÅ~¯‰ö²s`õ/]’~÷(i<³h4Á¢ P«ìJ“ÝàæÏg?âÀ<«º¢XþÒôûGIã—E  m€ZeTšÜÚ¿9¢*³q ý¯ì–~)iü²h4Á¢ P«ìJ“ÛpåYÙ7P“ª»>Š=^œ~)i¼²h4Á¢ P«ìJ“YûÓ?QUÙ7P£Þ%‹Òï"%Wm€&X´j•=Pi2®º ûÑjVµŸŒb÷¦ßGJŸ,ÚM°hÔ*{ ÒäÕ>ü³k !½/ÿKú¤¤ñÉ¢ Ћ6@­²*M^û¿”ýX ©Š'¢Øýé÷’’Æ#‹6@,ڵʨ4YµûÙˆªÊ~¬€õ.ø§ô»IIã‘E  m€ZeTš¬†wž“ýH ÛøƒóÖÒÒï'%~m€&X´j•=Pirjú3>ͦTïKŸ~G)iô³h4Á¢ P«ìJ“Ópå™Ù3¤Ú°&ZKwL¿§”4ÚY´š`ѨUö@¥É¨}ð›#ª2ûqõÎý›ô»JI£E  m€ZeTšŒwœžý(ɪuFkñvé÷•’F7‹6@,ڵʨ4þµz“O³fuÏúhú¥¤ÑÍ¢ Ћ6@­²*ƒÛNÉ~Œ€Q­{À§ÚHzÖ,ÚM°hÔ*{ Òx×>ðõ>Íø.Ý3þ4ýîRÒhfÑh‚E VÙ•Æ»Á Gg?ÂÀˆ)Ÿ¼7Z‹¶M¿¿”4zY´š`ѨUö@¥ñ­ØûÃ^ö# Œ î©’~‡)iô²h4Á¢ P«ìJã[ÿ«ûe?¾Àˆ*Ÿ¸'Z‹¶I¿Ç”4ZY´š`ѨUö@¥ñ¬Øã%Qu7d?¾Àëžüô»LI£•E  m€ZeTÏz—,Ê~t€W~ëÖhÍ,H¿Ï”4:Y´š`ѨUö@¥1léNQµË~t€1Ð9î7óï4%Lm€&X´j•=Piüê}ñï²[`L ¿qIú¦¤ÑÉ¢ Ћ6@­²*Y‹¶jí}Ù-0FÚ‡ÿbþݦ¤‘È¢ Ћ6@­²*WÝÓ>”ýÈcfpÛÉéw›’F#‹6@,ڵʨ4FÍ,ˆrÍMÙ,0nÊa´÷mþ§¤ô,ÚM°hÔ*{ ÒøÔ9î·²W`Lõ¯94ýŽSR~m€&X´j•=Pi|®º0ûq S9ŒªýTTO}cö“ËÕ×ÇðÞ‹¾¿;ωÁm§|w·žƒ›ŸýÏûϛýï•_;ûglüóªµ÷}ûÏînÈþ_ @]úí(öüÁô{NI¹Y´š`ѨUö@¥ñ¨}Л"ª*ûq`>TUTO?2»,3¼ë‹1¸þ³Ñ¿tIôÎû‡èžùçÑ=é¢sÌ{£}ø/DûÀ×G±×Dk·›AoÅŠ—ÍΡ£ÞÝ“ÿ(zçþmô/]:û›Ðƒ;NáýWDùØÊ¨ŠÇ³ÿ`Ž6ÎsÙw’r³h4Á¢ P«ìJãÑàºÏd?ªÌÅ å£wÄpÕ1¸ñØè_¶lvA¥sÂû¢}Ä/E±÷+£µøùéóå¼·x»hðºè÷›Ñ;çcÑÿê~1\yf”ÜÑkeÿ­ðoªâ‰æ—¸%Tm€&X´j•=Piô+–ï:û±®Œˆa/ÊÇîŒágÏ.”tÏþ«ÙO )ö}u´f¦Ï£Øì§ãñËÑ=õg‹zxdz_Y@óz_ü»ôùPR^m€&X´j•=Piôë]üÉìÇ`*Uë˜ýj§þ×öŸý”–Î1¿Å~¯‰Ö¢mÒgÄI©X¶Kt>ûŽÙö ®?2ʇ¯‹t²ÿê&Zµö¾h-Ú6}””“E  m€ZeTñoÕ†5Ù)ÀäBÍš›bpã1Ñ;ïGç¨÷D±Ç‹ógÁimѶÑ>èMÑ=åƒÑ¿ê€(WßQ³Ÿ€‰²qÖJŸû$¥dÑh‚E VÙ•F»îiÎ~D&JÕYÃû¯œ]àèžõÑè|æíÑZ²CúÜ§ç®Øíf¿ž«wÉâÞ{‘O½ØJå#·DkfAúœ'©ù,ÚM°hÔ*{ Òh7ûÛ»l‘ª÷t ¿ù•è_¶Gt>ÿ_¢ØçUéóæ©%;DçÈwÎ~ÍêpÕ³×lžÎ±ÿ9®“Ôxm€&X´j•=Pitëù®ìÇ`¬”߃›Ž‹Þ9íC~:Z‹¶IŸéÔP‹·›ýÄ›þ×>å“«²E€±°ñ“Óç8IgÑh‚E VÙ•F·áʳ²O€‘V=õ\wDtOûO«ÑwUì÷ã³_ 6¼óœˆa/ûQYíÃÞ–>»Ij6‹6@,ڵʨ4šû½&¢f?ž#¥|leô¯94º'ýA+^–>³i<*–í2ûÌ n<6ªâñìÇ`¤ n=1}^“Ôlm€&X´j•=Pi4ë_¹wö£ ®ê==û‰$?™¤Ø÷Õé3š& EÛDç3oŸý$¤ª»!ûÈW£½ÿOäÏi’Ë¢ Ћ6@­²*`Kvð›¶Àt*‡1|àkÑ»dQ´ÿÅÙ¥ˆôÙL“ÛÒ¢{ÊÿðõRÀÔë_}pþl&©±,ÚM°hÔ*{ ÒèÕ=íÃÙ%@sz­ÜqztOÿH{þ`ú,¦é¬XþÒèžý—1¼ïòˆªÌ~+šÕ/¢Øã%é3™¤f²h4Á¢ P«ìJ£WùÐÕÙ%@­ªõÇàÚãó¹ßžý4¿ìùKúΊ}~töS•6>§Ó¢wÁ?§Ïa’šÉ¢ Ћ6@­²*VíC&û‘¨Eµþ¡è_u@t>óöhÍ,HŸ»¤M6³0:Ǽ÷Û_-UUÙ¯@­ªuDkѶù3˜¤Ú³h4Á¢ P«ìJ£Õà†£³I€yS­{Ðr&¢öþ¯þ+¢*Ï~­jÓ=ñ¿§Ï]’êÏ¢ Ћ6@­²*N¿9úíìG`«T­Ç¢ÿõƒ¢}Ä/Y®ÑäµtÇèžñ§Q>|mö«0ï†÷_‘?oIª=‹6@,ڵʨ4:õÎÿÇìÇ`Ë :1¸íäè|þ÷¢µøùés•ÔD—Ɇ+ÏòµRÀDÙøÕöÙs–¤z³h4Á¢ P«ìJ#ÒÌÂ(Ÿ\•ý8Ì]UÅð¾Ë£{æŸG±l—üyJJª}ЛbpÓç"ÊAö[ °Õ7“>_Iª7‹6@,ڵʨ4uŽûÍìG`N6^Èõ¯: Ú¿9}†’F©bßWϾÑ/²_S€-7èF±âe鳕¤ú²h4Á¢ P«ìJ£ÑìGÎŒªªŒáÝçE÷ ¿ï«¡¤M´ñSýË—GÕY—ýæl‘ÞÅ3é3•¤ú²h4Á¢ P«ìJù{ýˆ™F÷Ók¾²{ûühúÌ$[¿Rm㩪îúìW`³TVGkñvéó”¤z²h4Á¢ P«ìJùõ¾ü/Ù!Àw)W_ݳ>­¥;¦ÏJÒ¸W,iô¯X1èd¿ÚsÖ=åƒés”¤z²h4Á¢ P«ìJÉÍ,ˆò‰{²C€ˆa/·cÞ›?#IX±Ï«bpÝå0ûm˜Óò}öü$©ž,ÚM°hÔ*{ Rn£ÞýS®j?ýË–E±âe鳑4 µ~K ïúbö«°Ií#~)}v’4ÿY´š`ѨUö@¥Ü7ŸýSªZ{_ô¾ô¿¢µÛÎé3‘4müÁÕð¾Ë³€g5¸õÄô™IÒügÑh‚E VÙ•ò*–íÑ/²A`Ê”knŠîiŠÖ¢mÓç!IÏ‹Îñ¿Õº²€ïW¢Øû•éó’¤ùÍ¢ Ћ6@­²*åÕ;÷o³?`Š øêìô³g IÏÐn;Gï’ÅÃ^öQð]6~Ílú¬$i^³h4Á¢ P«ìJy•knÌ~ü€)0¼ÿJ 6Ò˜Ô>àu1\uaö±ðªâñh-Ý1}N’4Y´š`ѨUö@¥œÚ‡½-ûѦaÁæè_MŸ{$mé×I=˜}ŒÌêžñgéó‘¤ùË¢ Ћ6@­²*åÔ¿æ°ìG˜ä¯ˆ:òé󎤭Ì×I#¢üÖmÑšY?Iš—,ÚM°hÔ*{ RBKwŒª³.ûÑ&LùÐ5Ñ9æ½ù³Ž¤y­}ÈOG¹æ¦ì#˜r#ß•>IšŸ,ÚM°hÔ*{ RóuOþ@öcLòÑÛ£sÂûü†©4É-~~ô/]1ìg9À”ÞqFþL$i^²h4Á¢ P«ìJÍ7¼ûKÙ0ª «£{ÆŸFkfaú|#©™Ú‡¾5ÊGnÎ>~€iT¢Øû•éó¤­Ï¢ Ћ6@­²*5[±çÍþ£`‹õ‹è_±"ŠÝ_>ÛHJhѶѻðÃ^öiL™Þ%‹óg!I[E  m€ZeTj¶ÞyÿýÈ㪪bpÛ)Qìûêô™FR~íƒßåê²O&`ŠTëš]úÍžƒ$m]m€&X´j•=P©ÙÊ57f?rÀÞE´ý™ôYFÒˆµøùÑÿÊîå0û˜¦Dç„ÿš?IÚª,ÚM°hÔ*{ Rsµzcö㌙êéG¢{Ú‡¢5³ }–‘4ºuŽzwTëÎ>²€)0¼û¼ôÙGÒÖeÑh‚E VÙ•š«Å^Ù0.ÊAô¯: ŠÝ_˜>ÃHŠå»Æð®/fŸ^À¤«Ê(ö{Múì#i˳h4Á¢ P«ìJ µh¿a ÌÉð›—Î~^úü"iüšY½ þ)bØÏ>Ê€ Ö¿|yþÜ#i‹³h4Á¢ P«ìJÍÔ9æ×³5`ÄUµÑ=룾&JÒV×þôÏEùäªìc ˜PHßZüüô™GÒ–eÑh‚E VÙ•šipÓç²5`„ n;%Š=(}f‘49müê¹Á-_È>Þ€ Õ=éÒçI[–E  m€ZeTj ÝvŽª÷tö£Œ jí}Ñ9î7óçI[ïœù*)`Þ ¿qIúœ#i˲h4Á¢ P«ìJõ×=ùÙ0jª*ú_?hv!7{V‘4ùuŽ|gT­G³O>`’TU´x]úœ#ió³h4Á¢ P«ìJõ7\yVöcŒjíýÑ9úWÓgIÓU±÷+¢|èšì#˜ ý+÷IŸq$m~m€&X´j•=P©ÞŠÝ_1èd?fÀˆÜt\»¿ }F‘4¥-Ù!7“}¢*ž˜/ÒgI›•E  m€ZeTª·îiÎ~Ä€P­(:ÇþFúl"Iëÿ"ÊaöÑL€î©’>ÛHÚ¼,ÚM°hÔ*{ R½ ï>/û’ ï8#Šå/MŸK$é;ëùΨZf‘À˜ÞEú\#ió²h4Á¢ P«ìJõUìñ’ˆa?û²ô‹èžõé3‰$=[íý"ÊÇïÊ>-€1×>øÍés¤¹gÑh‚E VÙ•êkãÖ€éT~ë¶hü–ôyD’6U±Ç‹cxßåÙÇ&0Æú_?(}¦‘4÷,ÚM°hÔ*{ R} ï½(ûñšVUÑÿÚ§¢µdûôYD’æÜ’bpû©Ù'(0¦ªÎÚh-Ý)¦‘4§,ÚM°hÔ*{ R={þ`D9È~¼€UÝõÑ=éÒçIÚ¢fDï’ÅÙG)0¦ºgüYþ<#iNY´š`ѨUö@¥zêó±ìG hP¹æÆhïÿé3ˆ$mm½/ý¯ˆªÌ>V€1S>tMú#inY´š`ѨUö@¥zÞwyö£4dpÓqÑZºcúü!IóUç„÷EôÛÙÇ+0fÚ‡ýlú#iÓY´š`ѨUö@¥ù¯Xñ2¿ Ӡߎ>{HRµ?ó+QOdŸ´À¨ö¢|øÚè_}HtOûp´|C´f¦Ï0’6E  m€ZeTšÿºgÿeöcÔ¬ZÿP´?ýóés‡$ÕÙÆ˜UVg¹ÀØ8 n;eök&;Ÿy»Oõ”Æ8‹6@,ڵʨ4ÿ W]ýX5Þåì'ØeÏ’ÔDÅ~¯‰ê©of½@ƒª kbxç9Ñ»dqtŽÿÝ(–ïš>“Hš¿,ÚM°hÔ*{ ÒüV,ÛeöcS€É4¸îˆh-Þ.}æ¤&+öùÑ(Ÿ¸'ûjPõžžýe‚þUD÷´Eû 7¦Ï’êÍ¢ Ћ6@­²*ÍoÝS>˜ýHu(³_™=kHRVÅ^/òÑ;²Oc`k ûQ®¾>ú×ÝÓ?òí¥š™…és†¤f³h4Á¢ P«ìJóÛàöÓ²)`žUÝ Ñ9þwÒç IÊ®Øã%Q>tMö± ÌQµaõ·¿êÂODç3oÖÒÓç IùY´áÿgïΣ=­ëÏ[ j¢¢qIŒ1I›6$Q[»31˜¥£g¦“ÆtætŒIºé>&;Ó‰LOÚŽ™™T]vŠMŠQŠM,ˆ,@–j)PR"[–€ R,–ÈVüöåùΩ[™ã–ª{ßïç>ÏózŸóú_ù>ÜÏGùP7Irh#)kÑ 3tè¾) ;ÑŸ”$IšaÕ“¦ÞGÞ¿g,¡_—;¹ïúèÏ’$釪ú§ÉÝŸMÃõs©¿öÀÔ=êá{°49´‘T"‡6’²½P1;ýs7ús’$I3lÇŸÚÐ]ùêð`©éöâ4¹÷ÚèÓ’$µ¶jøTšÜ{Mm86 >ùû©{ÜëÂ÷ >ÚH*‘CIY‹^¨˜ñ­gGN’$iFíøãÕý±êÏqlãO¶‘$)“Qšn½%oüh\ü¾Ô;ùSgÅžá»P_m$•È¡¤¬E/TÌȊ秪ûHôç$I’fÐxÓ9©3·Wü~°ÄuÿÑ4}ðÆèÛ’$5ªjûÖùÃÿáÕJý5¤Î¡/ Ÿù@³8´‘T"‡6’²½P1ý³Þý)I’¤4Ú¸*u–/ ß-ê¢{ÄKÓtëÍÑ?¾%IªeUÿñ4¹û³i¸~.õטºGÿXølšÏ¡¤9´‘”µè…ŠÙm<)úS’$I‹©ªÒðþ{øNPG;þ¡àtÛæèŸä’$-í†4¹÷Ú4úâñipþ¤îñ?>Ãvrh#©Dm$e-z¡bF‹éc÷DJ’$i¡M'i°î?…ïuÖ]ùê4}ä®èŸè’$-¦ã4}hSßtZ\ò§©wò/¥ÎŠ=Ãç5Àm$•È¡¤¬E/T,^oõþÑŸ‘$IZh“Q|ò÷Ã÷ €&èûiúèÝÑ?Ù%I*^µ}kšÜyÙÎ_uö»RçІÏe€gâÐFR‰ÚHÊZôBÅâ ¯ú`ôg$I’Ò¸Ÿúç¾;|—h’¿£zâþèŸð’$e«ê|'M¾~åΣšs~;uzEøüØm$•È¡¤¬E/T,ÞäÞk¢?#I’´»º©ÿñÿ5|hêŸúYõþI/IÒ⛌ÒtëÍi´qU¬;h~Æu–/ Ÿµ‹áÐFR‰ÚHÊZôBÅâtxéüÿà–$I5jØIý3~=|h²þšRõ¢âK’´ëMÇiúðíi|óéip韥Þ)oNÏŸ©³æÐFR‰ÚHÊZôBÅâ .xoô'$I’v§Q/õÏú­ð  úkœÿ‡–’$-Ūí[ÓäÎËvþ ¨µÎÿ uѳ ‡6’JäÐFRÖ¢*g¼éÑŸ$IÚÕ&ÃÔÿÄï„ïm²ã×l¤ªŠž’¤–W žL“-Ò躕;jV¾*|FDqh#©Dm$e-z¡b–ζèOH’$íê‘ÍÚã÷€~îo£§€$©MMFiºõæ4Ú¸jþà³·zÿÔY¾,|,m$•È¡¤¬E/T,\ï´·G>’$iWšŒRÿÜw‡ïm6ºá”èi IjbÓIš~û+i|Ë™ið©ÿšzyKê¬x~øÜXÊÚH*‘CIY‹^¨X¸Ñþ|$IÒsUMÓà¢ÿ¾7´Þò=ÒxóEÑSA’TóªÇ·¤ñW/Lë>˜úgüzêöâøP3m$•È¡¤¬E/T,Üô¡[£?I’ô ¯ø@øÎÀ?:tß4}àËÑ£A’T“ªÞ£iòÍ«Òè ‡ÍÿØîÊWÅÏ2€ph#©Dm$e-z¡bavüûTUÑŸ$Iz–†ëçÂw~Pwå«SõÄ}Ñ#B’´ÔšŒÒtÛæ4¾é´4XwPê­Þ?u–/ Ÿ[MäÐFR‰ÚHÊZôBÅÂìø’$ié6ºáäð}€§×;åÍ©>=*$IQM';jn9+ >õç©wê[Sgn¯ðùÐm$•È¡¤¬E/T,ÌøÖG:’$éšÜuyê¬Ø3|_à™õÏùíùÐ*Ij~Õö­irçeóâäü¯€:r¿ð9Ðfm$•È¡¤¬E/T,p}òèOG’$=MÓoJÃ^¾+ð܆W}0zlH’f\5Øž&[6¤ÑÆUó¿ª{üëÃç ?È¡¤9´‘”µè…ŠÝ×;ù£?I’ô4U}+uW¾*|W`×oüXôø$-´Éh節ºé´ù£šÞêýSgùá³€gçÐFR‰ÚHÊZôBÅî~ú¯¢?I’ôCU½GSoÕ?ߨMs{¥É=Ÿ‹#’¤]¨zìž4ÞtN^ypê¯9 uÙ'~ްÛÚH*‘CIY‹^¨Ø}“¯ÿCôg#I’¾¿É(õÏøð€…é¹ßü?¼•$-vüÚôÉ×.NÃÏüMêŸù¯S÷ð Ÿ̆CI%rh#)kÑ »inèÏF’$}_ƒOýyüŽÀ¢ôNySJ£nôH‘¤VV ¶§É– i´qÕü¯€êžðÓás€|ÚH*‘CIY‹^¨Ø=ý³ÞýÉH’¤ïktÃ)áû³1¸ð£ÇŠ$5¿é8M·mžÿPƒKߟz«÷Oå{„ÏÊqh#©Dm$e-z¡b÷Œ®[ýÉH’¤l²åºù?m.z?`vFOŠ/’Ô¨ªí[Óø«¦á•§þšRç}ÂÖË¡¤9´‘”µè…ŠÝ3ÝzKô'#I’vüƒÇ¾•ºG½<|7`Ææöšÿõ%’¤…ÕLî¸$ ?ûÿÌÿ©ÌÝ#^ÿs€%Ç¡¤9´‘”µè…Š]×=r¿”ªiô'#I’ÆýÔ;õmá»ytW¾*UO>=m$iIW Ÿš?Lm\•ëÚùÿáâ IDAT+ –ÀÏp–>‡6’JäÐFRÖ¢*v]ÿ¼ß‹þ\$IRJipÉ ß È«wÚ¯¤4FIZMÇiºmso:gþW@Í/ß#üg5õäÐFR‰ÚHÊZôBÅ®]bôç"IRëßvnøN@ÃËÿ"zìHRد€õÂù£šþšRçÐ}Ã&Ðm$•È¡¤¬E/TìºéC›¢?I’ZÝôÛ_IC_¾PÎø¶µÑãG’²Vm(Mî¼, ×Ï¥þÚS÷¨W„ÿì ÙÚH*‘CIY‹^¨Ø5Ý#÷K©šF.’$µ·a'õNzcøN@YÝÃ^œ¦Ü=…$i&UçÒdˆ4Ú¸* Ö”z«÷ÿ9 @û8´‘T"‡6’²½P±kúçý^ô§"IR«\ü¾ð}€½SÞ”Ò¨=Š$i÷šŽÓtÛæ4ÞtÎü¯€êú¶ÔY±gøÏTph#©Dm$e-z¡b׌®?1úS‘$©µ7_¾ kxŢǑ$=kÕö­;ÔÕJý5¤Î¡û†ÿ쀧ãÐFR‰ÚHÊZôBÅ®™>´)úS‘$©•UOÜŸºG¾,| ÞäkG%Iš¯ê?ž&w6 ×Ï¥þÚS÷è ÿ »Ê¡¤9´‘”µè…Šç¶ãî¥jý©H’Ô¾¦“Ô[ó«á»Kç›Uo‰žN’ZV5|*Mî½&6—ŸüýÔ=îuá?`1ÚH*‘CIY‹^¨xnýó~/ú3‘$©•®=*|`ié}ì—Sš £G”¤¦6§é¶Íi¼éœ4¼òà¿jnïðŸ}0Km$•È¡¤¬E/T<·Ñõ'F&’$µ®é¶¯¥Î!û„ï,=ëÿ:zLIjHÕö­irçe;ÔÙïJC_þ3rsh#©Dm$e-z¡â¹M·Þý™H’Ô®&£Ô;õ­á;KÔòeir÷g£§•¤šUu¶¥É]W¤áú©οIÝ£^ÿó 8´‘T"‡6’²½Pñ캇½xþ –$IåÚñ?¢w–¶î±?‘ªÞ£Ñ#KÒRmØI“-Òhãª4XwPê­ÞþH/úg,m$•È¡¤¬E/T<»þYïŒþD$IjUÓ‡oK¹½Âw–¾Á=¶$-…¦ãùr|Óš4¸äOSï”7¥ÎŠ=ÃFÀRåÐFR‰ÚHÊZôBųÛñ;º%IR¡ªiêööðù@}Œo?/zzI*\µ}kšÜyÙüÿgÓ?û]©sè Ã@8´‘T"‡6’²½Pñì&ß¼:ú‘$©5®?1|öP/Ý#^’ªÇ·D0I™ªúOìüP×­Lýµ¦îѯ ÿ¹uçÐFR‰ÚHÊZôBųX¾Çüÿ¡#I’òW=q_êöâøù@íôOÿµ”¦“èQ&i±MFiºõæ4Ú¸* Ö”z«÷OåËÂÆ@Ó8´‘T"‡6’²½PñÌvüNoI’T¦þÚ>û¨¯Ñe’v§é$M¾=o># .ý³Ô;åÍ©³âùá?K  ÚH*‘CIY‹^¨xfÃËþ[ôç!IR+šÜqiøÜ æyÁü?´—´4«¶oM“;/KÃõs;Ô/ÿ¹-åÐFR‰ÚHÊZôBÅ3ßvnôç!IRó÷S÷„Ÿ ŸûÔ_ï#o™ÿÕ3’b«ºßM“o|:>èΣš£_þóø‡6’JäÐFRÖ¢*žeÙ|üÞèÏC’¤Æ·ãÀDÏ|šcÇ\‘T°É(M·ÞœFW¥ÁºƒRoõþ©³|YøÏà™9´‘T"‡6’²½PñôºÇüxô§!IR㫞¸?u{QøÜ AVú/SšŽ£ÇœTûª'îKãÍ¥áUÿ3õÏøÔ=ìÅá‹çÐFR‰ÚHÊZôBÅÓm8.úÓ$©ÑM¸Á¯ ›ÑµGE:©VUƒ'Ódˆ¿êü÷¤îÊW‡ÿ} äáÐFR‰ÚHÊZôBÅÓ›Ü{Mô§!IR£›ÿUK`æÐP‡¼`þWÜHzš&£¿ê¦ÓÒ`ÝA©·zÿÔY¾Güß·@m$•È¡¤¬E/T<å{Ìÿ›\’$)OãÍëâç=×ûØÿ’Òt=ö¤ðªÇîIãMç¤á•ïdŸð¿?€8m$•È¡¤¬E/TüS½Õ¿ýYH’ÔÜ&£Ô;ñ áó€v}ñøèÉ'­Ú¾5Mî¼, ×Ï¥þÚS÷ÈýÂÿ>–‡6’JäÐFRÖ¢*þ©ÁßÿçèÏB’¤Æ6¾ñ£á³€9tß4ýî7¢ÇŸ”¥ªÿxšÜý™4ºæˆÔ?÷wS÷˜×Äÿ=,ym$•È¡¤¬E/TüS£/$ú³$©™M†©{üëÃg=íÒ?ó7Sªªè)(-®é8M·mžÿPƒKߟz«÷ŸÿÕ×ÑõãÐFR‰ÚHÊZôBÅ?5}ðÆèÏB’¤F6úÒêð9@;o[=¥Ýªzìžù£šá•§þšRç}Âÿ>šÁ¡¤9´‘”µè…Š2·wJãAôg!IRó÷S÷ØŸˆŸõ´R÷¨—§ªûHô4”ž¶jûÖ4¹ó²4\?—úkœÿ^£ÿžšË¡¤9´‘”µè…ŠÔû迌þ$$Ijd£ëO Ÿó´Ûàâ?‰‡RªúO¤É=ŸK£kJýó~/uùñð¿7€vqh#©Dm$e-z¡â /ÿ‹èOB’¤æ5¥îq?>çh¹åËÒäžõÑSQmj:NÓm›çÔàÒ÷§ÞêýSgùñ/­æÐFR‰ÚHÊZôBÅßzvô'!IRãoúDøŒ€z'ý|J“aôhT«ª4ýÎó{Ïðò¿L½ýòü¯§Žþæ~˜CI%rh#)kÑ ?húí¯D’$5®ÞGÞ>ãàÿ7úÂaÑ£Q ¨ÚþPšÜyY®ŸKýµ¦îQ/ÿ¶v…CI%rh#)kÑ ßçÌÿj I’4»&ß¼*~ÆÀ÷;äóòˆ´«UçÒdˆ4Ú¸* Ö´óW@EÇ äÐFR‰ÚHÊZôBÅ÷ôN}[ôç IRãêŸý®ð?lÇ|’ž¶é8M·mNãMç¤á•Ïÿå{„³³âÐFR‰ÚHÊZôBÅ÷ .ùÓèÏA’¤F5}øöÔY¾,|ÆÀÓíï£G¥–@Õö­;ÔÕJý5¤Î¡û†›99´‘T"‡6’²½Pñ=£NŽþ$IjTƒ‹þCø|€gÒ=î'Sv¢Ç¥ V=õðΣšõs©¿öÀÔ=êáß!@im$•È¡¤¬E/T|ÏŽß·.I’fSõä©3·Wø|€g3üÜòè‘©LUçæÿwþhãª4XwPê­Þ?ü{X ÚH*‘CIY‹^¨øGË—¥jðdôç IRc~ú¯âç;<—C^¦|=zlj±MÇiºmso:' ¯<8õN}[ê¬Ø3þûX‚ÚH*‘CIY‹^¨Ø©wâ¢?I’ÓŽãÕî/ Ÿï°+úç¾;ztj7«¶oÝù+ ®þPê¯9 u}aøwPm$•È¡¤¬E/Tì48ÿ=ÑŸ‚$IitÝ1á³vÇä®Ë£Ç§ž¡ªÿxšÜýÙ4\?—úkLÝ£,ü{¨3‡6’JäÐFRÖ¢*v]sDô§ IR3šŒR÷Ø×†ÏvؽÿlJã~ôm}Õð©4¹÷Ú4ÚpÜü¿Ó=þ§Â¿ €¦qh#©Dm$e-z¡b§É]WD ’$5¢ñæ‹Âç:,Äè ‡GÑv5§éC›Òø¦ÓÒàâ?I½“)uVìþ4CI%rh#)kÑ ÿ¸X>ù@ô§ IR#êŸù¯Ãç:,Èa/JÕö­Ñ£´±M½;oÿ»4ü‡ÿžúkHC÷s€rh#©Dm$e-z¡ây©{ÄKRªªèOA’¤Ú7ýΩ³|Yøl€…üýާ¨ê?‘&[6¤Ñu+Sí©{ô+Ã߀ÚH*‘CIY‹^¨x^ê­ùÕèÏ@’¤F4¼âáseùiúàÑ#µ^MFiºõæ4Ú¸* Ö”z«÷wx °„9´‘T"‡6’²½Pñ¼4¸ôÏ¢?I’j_5|jþO‰‹žë0“ßzúôM'iºmso:' ¯õçÑŸ€$Iµnrç§Âç9d³bÏ4ýÎi©V žL“-vþ ¨óß“º+_ÿ× €%Í¡¤9´‘”µè…ªíF_Zý H’Tëú÷¿‡ÏsÈiðÉŸ–D£^šÜwýΣš ÿ8õ>üÏÂÿÚP?m$•È¡¤¬E/Tm7¹g}ô' IRm«z¥ÎÜÞáó²Z¾,MïÿRÙ!;¤é·¿šÆ·œ5ÿ'±öN}kêÌíÿ×€Úsh#©Dm$e-z¡j»jûCÑŸ€$Iµm|óéá³JèŸþkYgjµ}kšÜyY®ŸKýµ¦î‘/ ÿï @39´‘T"‡6’²½PµY÷ðI©ª¢?I’j[ÿ¬ß ŸçPÊä®Ëg2?«Á“i²eÃÎ_uþ{Rwå«Ãÿ»Ðm$•È¡¤¬E/TmÖ;õmÑÏ/IRm«žz8uVì>Ï ”ÞIoLi:Þ½9¥é¶Íi|Óii°î Ô[½ê,ß#ü¿ íåÐFR‰ÚHÊZôBÕfƒ ÿ(úù%Iªm£'…Ïr(m|Ë™Ï:«ÇîIãMç¤á•§þšRç}Âÿ3À÷sh#©Dm$e-z¡j³áú¹èç—$©¶õNû•ðY¥uùñ”FÝùYXmßš&w^6ÿ¿-ûkLÝ#÷ ÿÏÏÅ¡¤9´‘”µè…ªÍÆ·Ÿýü’$Õ²ê‰ûRgù²ðYQ¿†¸{ÌkÂÿsÀB8´‘T"‡6’²½PµÙtëÍÑÏ/IR-}iuø`÷9´‘T"‡6’²½PµY5x2úù%Iªeý³Þ>ÇØ}m$•È¡¤¬E/Tmµãù–$I»_Õ"uæöŸåì>‡6’JäÐFRÖ¢ª¶êŸù›ÑO/IR-ß~^ø`aÚH*‘CIY‹^¨Újpéû£Ÿ^’¤Z6¸à½ás€…qh#©Dm$e-z¡j«Ñ†c£Ÿ^’¤ú5¦î/ Ÿã,ŒCI%rh#)kÑ U[7¯‹~zI’j×äžõá3€…sh#©Dm$e-z¡j«éC·F?½$Iµkø™¿ Ÿá,œCI%rh#)kÑ U[UýÇ£Ÿ^’¤ÚÕ;õ­á3€…sh#©Dm$e-z¡j£î‘ûE?»$Iµ«ê~7u–ï>ÇX8‡6’JäÐFRÖ¢ª6êú¶èg—$©v¿òÉðÀâ8´‘T"‡6’²½PµÑàü÷D?»$IµkpñŸ„ÏpÇ¡¤9´‘”µè…ª†Wÿuô³K’T»ºÇ½.|†°8m$•È¡¤¬E/Tm4¾ñ£ÑÏ.IR­š~÷áó€Åsh#©Dm$e-z¡j£É7¯Ž~vI’jÕø–3Ãç7‹çÐFR‰ÚHÊZôBÕFÓG¿ýì’$ÕªÁÅ>¿X<‡6’JäÐFRÖ¢ªÖY±gJ“aô³K’T«z'½1~†°hm$•È¡¤¬E/TmÓ=öµÑO.IR­ªº¤Îòeá3€Åsh#©Dm$e-z¡j›Þio~rI’jÕäŽKÂç7³áÐFR‰ÚHÊZôBÕ6ƒóÿ úÉ%IªUë>>¿˜ ‡6’JäÐFRÖ¢ª¶~ú¯¢Ÿ\’¤ZÕ[ó«áó€Ùph#©Dm$e-z¡j›ÑÆUÑO.IR}šŽSçÐ}Ãç7³áÐFR‰ÚHÊZôBÕ6ã¯ý}ô“K’T›¦ß>»˜‡6’JäÐFRÖ¢ª¶™>xcô“K’T›Æ·œ>»˜‡6’JäÐFRÖ¢ª¶©¶?ýä’$Õ¦áå>»˜‡6’JäÐFRÖ¢ªV™Û+¥jýä’$Õ¦ÞioŸßÌŒCI%rh#)kÑ U›t}ôsK’TŸ¦“Ô9ìEáó€Ùqh#©Dm$e-z¡j“þé¿ýÜ’$Õ¦é¶Íá³€Ùrh#©Dm$e-z¡j“Á…ýÜ’$Õ¦ñmkÃg7³åÐFR‰ÚHÊZôBÕ&ÃOÿèç–$©6 ?ó7á³€Ùrh#©Dm$e-z¡j“цc£Ÿ[’¤ÚÔ?ïß…ÏnfË¡¤9´‘”µè…ªMvü I’´kõN|Cøì`¶ÚH*‘CIY‹^¨Údr÷g£Ÿ[’¤z4¦ÎŠç‡ÏnfË¡¤9´‘”µè…ªM¦ßþjôsK’T‹¦ßþJøÜ`öÚH*‘CIY‹^¨Ú¤ê~7ú¹%IªEã¯^>·˜=‡6’JäÐFRÖ¢ªÖ˜Û;¥ªŠ~nI’jÑèó‡ÄÏnfΡ¤9´‘”µè…ª-ºÇ¾6ú©%IªMƒ Þ>»˜=‡6’JäÐFRÖ¢ª¶è}ô_E?µ$Iµ©wê[Ãg7³çÐFR‰ÚHÊZôBÕýs7ú©%IªMÝ#_>»˜=‡6’JäÐFRÖ¢ª¶\úþè§–$©Uƒ'Ãç6y8´‘T"‡6’²½PµÅðsýÔ’$Õ¢é÷…Ïmòph#©Dm$e-z¡j‹ÑÆUÑO-IR-šÜqIøÜ ‡6’JäÐFRÖ¢ª¶ßvnôSK’T‹F×8|n‡CI%rh#)kÑ U[L¾yUôSK’T‹†W>·Èá¤9´‘”µè…ª-¦[o‰~jI’jQÿÜw‡Ïmòph#©Dm$e-z¡j‹êñ-ÑO-IR-êüKás€<ÚH*‘CIY‹^¨Ú"ºÑO-IR-êù²ð¹ @m$•È¡¤¬E/T­pè¾ÑÏ,IR=Rgù²øÙ @m$•È¡¤¬E/TmÐ=îuÑÏ,IR-ª¿7|nCI%rh#)kÑ UôN}[ô3K’T‹¦÷)|nCI%rh#)kÑ Uô?þ¿E?³$IµhrÇ%ás€|ÚH*‘CIY‹^¨Ú`páE?³$Iµh|ãGÃç6ù8´‘T"‡6’²½PµÁðò¿Œ~fI’jÑpýŠð¹ @>m$•È¡¤¬E/Tm0üÜßF?³$IµhpéûÃç6ù8´‘T"‡6’²½PµÁhÃqÑÏ,IR-êŸûîð¹ @>m$•È¡¤¬E/Tm0¾iMô3K’T‹z§ýJøÜ ‡6’JäÐFRÖ¢ª6o¾(ú™%IªE½U?>·ÈÇ¡¤9´‘”µè…ª &w&ú™%IªEÝ£,|nCI%rh#)kÑ UL¼1ú™%IªE¹½Ãç6ù8´‘T"‡6’²½PµÁô»ßˆ~fI’–|Õð©ð™ @^m$•È¡¤¬E/TmPu¾ýÌ’$-ùª'îŸÙäåÐFR‰ÚHÊZôBÕi2Œ~fI’–|Óo%|f—CI%rh#)kÑ Uãö¢è'–$©Mî½6~n•CI%rh#)kÑ UÓuyMôK’T‹&w~*|n—CI%rh#)kÑ UÓõVý\ôK’T‹Æ·ž>·ÈË¡¤9´‘”µè…ªézùÑO,IR-m<)|n—CI%rh#)kÑ UÓõÏøõè'–$©®=:|n—CI%rh#)kÑ UÓõÏùíè'–$© ׯŸÛäåÐFR‰ÚHÊZôBÕtƒóßýÄ’$Õ¢áU ŸÛäåÐFR‰ÚHÊZôBÕtƒ‹ßýÄ’$Õ¢áå>·ÈË¡¤9´‘”µè…ªé†W| ú‰%IªE;ŽS£ç6y9´‘T"‡6’²½P5Ýð3ÿwôK’T‹¼7|n—CI%rh#)kÑ UÓ®9"ú‰%IªEýs7|n—CI%rh#)kÑ UÓ6®Š~bI’jQÿìw…Ïmòrh#©Dm$e-z¡jºñÍgD?±$Iµ¨¿æ€ð¹ @^m$•È¡¤¬E/TM7¾ý¼è'–$©õN}køÜ /‡6’JäÐFRÖ¢ª¦›|íâè'–$©õVÿBøÜ /‡6’JäÐFRÖ¢ª¦›|ýÊè'–$©õNzcøÜ /‡6’JäÐFRÖ¢ª¦›Ü³>ú‰%IªE½ß>·ÈË¡¤9´‘”µè…ªé&÷]ýÄ’$Õ¢î ?>·ÈË¡¤9´‘”µè…ªé¦[o‰~bI’jQ÷øŸ ŸÛäåÐFR‰ÚHÊZôBÕtÓm_‹~bI’jQ÷Ø×†Ïmòrh#©Dm$e-z¡jºê±{¢ŸX’¤ZÔ=æ5ás€¼ÚH*‘CIY‹^¨š®Ú¾5ú‰%IªEÝ£_>·ÈË¡¤9´‘”µè…ªéªîw£ŸX’¤ZÔ=êåás€¼ÚH*‘CIY‹^¨š. ;ÑO,IR-êñÒð¹ @^m$•È¡¤¬E/TM—¦ãè'–$©uÿ‘ð¹ @^m$•È¡¤¬E/T¶|YôóJ’T›º‡½8~v•CI%rh#)kÑ U£Ííý¼’$Õ¦îá??»ÈÊ¡¤9´‘”µè…ªÑ}aôóJ’T›ºG¾,~v•CI%rh#)kÑ U“íø7ó%IÒ®Õ=êá³€¼ÚH*‘CIY‹^¨š¬{ä~ÑÏ+IRmê®|uøì /‡6’JäÐFRÖ¢ª&ë®|UôóJ’T›ºÇþDøì /‡6’JäÐFRÖ¢ª&Ûñ %IÒ®Õ=îuá³€¼ÚH*‘CIY‹^¨š¬{üOE?¯$Iµ©{ÂO‡Ïnòrh#©Dm$e-z¡j²Þ‡6úy%IªM½ß>»ÈË¡¤9´‘”µè…ªÉz«þyôóJ’T›z'½1|v—CI%rh#)kÑ U“õNþÅèç•$©6õVÿBøì /‡6’JäÐFRÖ¢ª&ëò¦èç•$©6õNysøì /‡6’JäÐFRÖ¢ª&Ûñ %IÒ®Õ;õmá³€¼ÚH*‘CIY‹^¨š¬÷‘·D?¯$Iµ©¿æ€ðÙ @^m$•È¡¤¬E/TMæÐF’¤]¯Ö;Ãg7y9´‘T"‡6’²½P5Yï#ÿ"úy%IªMýµ†Ïnòrh#©Dm$e-z¡j2‡6’$ízƒóß>»ÈË¡¤9´‘”µè…ªÉÚH’´ë Ö>»ÈË¡¤9´‘”µè…ªÉz§¾5úy%IªMƒKß>»ÈË¡¤9´‘”µè…ªÉÚH’´ë ¯<8|v—CI%rh#)kÑ U“9´‘$i×^ý¡ðÙ @^m$•È¡¤¬E/TMÖ;õmÑÏ+IRm®Ÿ ŸÝäåÐFR‰ÚHÊZôBÕdm$IÚõF×­ ŸÝäåÐFR‰ÚHÊZôBÕd~u”$I»ÞhãIá³€¼ÚH*‘CIY‹^¨š¬wÊ›£ŸW’¤Ú4¾é´ðÙ @^m$•È¡¤¬E/TMÖ;ù£ŸW’¤Ú4¾mmøìñÀ_c IDAT /‡6’JäÐFRÖ¢ª&ëôóÑÏ+IRmšÜqiøì /‡6’JäÐFRÖ¢ª&ë­ú¹èç•$©6M¾õùðÙ @^m$•È¡¤¬E/TMÖûðÏF?¯$IµiºõæðÙ @^m$•È¡¤¬E/TMÖ=þõÑÏ+IRmš~÷á³€¼ÚH*‘CIY‹^¨š¬{ÜOF?¯$IµiÇÿÉ=»ÈË¡¤9´‘”µè…ªÉºÇüxôóJ’TŸF½ðÙ @^m$•È¡¤¬E/TMÖ]ùªèç•$©VuæöŸßäãÐFR‰ÚHÊZôBÕdÝ£^ý¼’$ÕªîQ/ŸßäãÐFR‰ÚHÊZôBÕdÝ#_ý¼’$Õªîñ¯ŸßäãÐFR‰ÚHÊZôBÕdÝÃ^ý¼’$ÕªÞ)o ŸßäãÐFR‰ÚHÊZôBÕhs{E?¯$Iµªú;âç7Ù8´‘T"‡6’²½P5]ªªè'–$©6õ?ñ;á³€|ÚH*‘CIY‹^¨š.ÑO,IRm\ð‡á³€|ÚH*‘CIY‹^¨š®ê?ýÄ’$Õ¦Á§þ<|vCI%rh#)kÑ UÓUïD?±$IµiøÙÿ7|vCI%rh#)kÑ UÓUO>ýÄ’$Õ¦ÑOŸÝäãÐFR‰ÚHÊZôBÕtÕc÷D?±$Iµi|ëÇÃg7ù8´‘T"‡6’²½P5Ýô;wD?±$Iµirçeá³€|ÚH*‘CIY‹^¨šnúðmÑO,IRmšÜw}øì ‡6’JäÐFRÖ¢ª¦›>ðåè'–$©6M¹+|vCI%rh#)kÑ UÓM¶\ýÄ’$Õ¦ªóðÙ @>m$•È¡¤¬E/TM7ùæÕÑO,IR}šŽSgù²ðù @m$•È¡¤¬E/TM7¹ãÒè'–$©Vuxiøü ‡6’JäÐFRÖ¢ª¦ßþwÑO,IR­êžð3áó€<ÚH*‘CIY‹^¨šn|óÑO,IR­ê}ô_…Ïoòph#©Dm$e-z¡jºÑ 'G?±$Iµªο ŸßäáÐFR‰ÚHÊZôBÕt£ëމ~bI’jÕàÂ?ŸßäáÐFR‰ÚHÊZôBÕtÃõsÑO,IR­^ñðù @m$•È¡¤¬E/TM7¼ú¯£ŸX’¤Z5úÂááó€<ÚH*‘CIY‹^¨šnÇ¿•/I’v½ñMkÂç7y8´‘T"‡6’²½P5Ýà’?~bI’jÕäÎO…Ïoòph#©Dm$e-z¡jºÁ…ýÄ’$Õªé7„Ïoòph#©Dm$e-z¡jºþyÿ.ú‰%IªUÕã÷†Ïoòph#©Dm$e-z¡jºþYïŒ~bI’êÕ¨>¿Èá¤9´‘”µè…ªézûåè'–$©vuÿ‘ðÀì9´‘T"‡6’²½P5]蘭~bI’jWïÄ7„ÏpfÏ¡¤9´‘”µè…ªéºÇ¾6ú‰%Iª]ýÓß>Ø=‡6’JäÐFRÖ¢ª¦ëñ’è'–$©v >ùïÃg8³çÐFR‰ÚHÊZôBÕx+öL©ª¢ŸY’¤Z5¼ì¿ÅÏpfΡ¤9´‘”µè…ª Ò¨ýÌ’$ÕªÑç ŸßÌžCI%rh#)kÑ UX%IÚ½Æ7~,|~0{þ™‰¤9´‘”µè…ª ¦~3ú™%IªU“;. ŸßÌžCI%rh#)kÑ ULº5ú™%IªUÓû7†ÏofÏ¡¤9´‘”µè…ª &÷^ýÌ’$Õªê±o…ÏofÏ¡¤9´‘”µè…ª &w]ýÌ’$Õ«ñ u–/ ŸáÌ–CI%rh#)kÑ UŒ7}"ú™%Iª]Ý£^>Ø-‡6’JäÐFRÖ¢ª6m\ýÌ’$Õ®Þ)oŸáÌ–CI%rh#)kÑ U ×ÏE?³$Iµ«ÿ‰ß ŸáÌ–CI%rh#)kÑ U ¯<8ú™%Iª]ƒKÿ,|†0[m$•È¡¤¬E/Tm0¸è?F?³$IµkÇŸ=Ø-‡6’JäÐFRÖ¢ª6è¯ý·ÑÏ,IRíß´&|†0[m$•È¡¤¬E/TmÐ;ííÑÏ,IRíš|ýÊðÀl9´‘T"‡6’²½PµAï¤7F?³$Iµkúðmá3€Ùrh#©Dm$e-z¡jƒîѯŒ~fI’jWÕ}$|†0[m$•È¡¤¬E/T­0·WJUýÔ’$Õ«ªJCö‰ŸãÌŒCI%rh#)kÑ U[TƒíÑO-IRíêžðÓá3€Ùqh#©Dm$e-z¡j‹ê‰û¢ŸZ’¤ÚÕ_s@ø `vÚH*‘CIY‹^¨ÚbúЦ觖$©v ÎÿƒðÀì8´‘T"‡6’²½PµÅä[Ÿ~jI’j×ðþ¯ðÀì8´‘T"‡6’²½PµÅxóºè§–$©v¾x|ø `vÚH*‘CIY‹^¨Úb|óéÑO-IRíõ‚ðÀì8´‘T"‡6’²½PµÅèºc¢ŸZ’¤Ú5}à†ðÀì8´‘T"‡6’²½PµÅð3ýÔ’$Õ®jûCá3€Ùqh#©Dm$e-z¡j‹Á§þkôSK’T¿ª*uÙ'|Ž0m$•È¡¤¬E/Tm18ÿ=ÑO-IR-ë}øŸ…Ïqfá¤9´‘”µè…ª-úg¿+ú©%Iªeý³~+|Ž0m$•È¡¤¬E/TmÑ;õ­ÑO-IR-\ü¾ð9Àl8´‘T"‡6’²½PµE÷ø×G?µ$Iµl¸~.|Ž0m$•È¡¤¬E/TmÑ=üG£ŸZ’¤Z6¾å¬ð9Àl8´‘T"‡6’²½PµI÷£Ÿ[’¤Ú5¹g}ø `6ÚH*‘CIY‹^¨Ú¤z|KôsK’T»¦~3|†0m$•È¡¤¬E/Tm2}àËÑÏ-IRýš Sgùás€Åsh#©Dm$e-z¡j“É—E?·$Iµ¬{ÌkÂç8‹çÐFR‰ÚHÊZôBÕ&ã›O~nI’jYï´_ Ÿã,žCI%rh#)kÑ U›Œ®9"ú¹%Iªeƒóÿ |ްxm$•È¡¤¬E/Tm2¼âÑÏ-IR-^õ?Ãç8‹çÐFR‰ÚHÊZôBÕ&;þm|I’´ûn89|ްxm$•È¡¤¬E/TmÒ?ã7¢Ÿ[’¤Z6¹ëòð9Àâ9´‘T"‡6’²½PµIï¤7F?·$Iµlºmsø`ñÚH*‘CIY‹^¨Ú¤{ÄK£Ÿ[’¤z6ê¥Îòeá³€Åqh#©Dm$e-z¡j›4D?¹$Iµ¬{ÌkÂç8‹ãÐFR‰ÚHÊZôBÕ6Õ÷G?¹$Iµ¬¿æ€ð9Àâ8´‘T"‡6’²½PµÍôÁ›¢Ÿ\’¤Z6XwPø`qÚH*‘CIY‹^¨Úfr×ÑO.IR-®Ÿ Ÿã,ŽCI%rh#)kÑ UÛŒo93úÉ%Iªeã[?>ÇX‡6’JäÐFRÖ¢ª¶]{Tô“K’TË&[® Ÿã,ŽCI%rh#)kÑ UÛ ¯ü?£Ÿ\’¤ZV=ù@ø`qÚH*‘CIY‹^¨ÚfpÁF?¹$Iõ¬ªRç}Âg9 çÐFR‰ÚHÊZôBÕ6ý33úÉ%Iªm½“Þ>ËX8‡6’JäÐFRÖ¢ª¶éôóÑO.IRmëâwÂg9 çÐFR‰ÚHÊZôBÕ6Ý#÷‹~rI’jÛðò¿ Ÿå,œCI%rh#)kÑ Uë,_–Òdýì’$Õ²ÑOˆŸå,˜CI%rh#)kÑ UUO>ýì’$ղɗ†ÏqΡ¤9´‘”µè…ª¦÷)úÙ%IªeÓ‡oŸã,œCI%rh#)kÑ U7_ýì’$Õ²jøTø`áÚH*‘CIY‹^¨Úhtý‰ÑÏ.IRmëýÊðYÀÂ8´‘T"‡6’²½PµÑðÓÿ#úÙ%Iªm½ÓÞ>ËX‡6’JäÐFRÖ¢ª6\ðÞèg—$©¶ Öý§ðYÀÂ8´‘T"‡6’²½PµQoͯF?»$Iµmô…ÃÃg9 ãÐFR‰ÚHÊZôBÕFÝã^ýì’$Õ¶ñWΟå,ŒCI%rh#)kÑ U+­x~JÓIôÓK’T˦[o‰Ÿå,ˆCI%rh#)kÑ U[UÛ·F?½$Iµ¬lŸã,ŒCI%rh#)kÑ U[MørôÓK’TÛº+_>ËØ}m$•È¡¤¬E/Tm5Þ¼.úé%IªmýÓß>ËØ}m$•È¡¤¬E/Tm5Ú¸*úé%Iªmƒ‹ß>ËØ}m$•È¡¤¬E/Tm5¼êƒÑO/IRm]{Tø,`÷9´‘T"‡6’²½PµÕà‚?Œ~zI’jÛxóEá³€ÝçÐFR‰ÚHÊZôBÕVýÓßýô’$Õ¶é÷…ÏràÿcïÞ£v/ë:³!ƒ²ƒS“kjåXv0mÖäL™Sæ4­i*ÓZÍ45æd:SY“•3gØ P@9š"j€ ‚ Š„ÊA!<`H ’j(>÷ùð›…´1ö³÷~®ësÿ®ûõ^ëõÿÞÜ׳¾ß›õ…gØmm$ÕÈ¡¤¢¥ªu58ò±é^’¤þ6Ùì67vÄç9»Ç¡¤9´‘T´ôBµ¶zD×-æé_’¤Þ6xÙ·åç9»Å¡¤9´‘T´ôBµÎ–wß–þø%Iêm£×üx|–°{ÚHª‘CIEK/Tëlñ™¦?~I’zÛøìçÇg9»Ç¡¤9´‘T´ôBµÎækúã—$©·M/}Y|–°{ÚHª‘CIEK/TëlzÙ1é_’¤ÞvÏÁjz–°{ÚHª‘CIEK/Tëlò®?Jü’$õ¶Åç>Ÿåì‡6’jäÐFRÑÒ Õ:Ÿñ+é_’¤þ6v›ûÆç9[çÐFRÚH*Zz¡Zg£“Ÿ–þø%Iêuƒ#¿#>ÏØ:‡6’jäÐFRÑÒ Õ:ñ˜ôÇ/IR¯½þ§ãó€­sh#©Fm$-½P­µ}»n6N?I’zÛä¼ßËÏs¶Ì¡¤9´‘T´ôBµîwÜ~’$õ¶é•ÇÇg9[çÐFRÚH*Zz¡Zwó/L?I’zÛü¦‹ã³€­sh#©Fm$-½P­»Ù‡^~’$õ¶åÝ·Åg9[çÐFRÚH*Zz¡Zw“ ÿ4ý$IêuƒÃŸçlCI5rh#©hé…jÝOVú H’Ôë†'þp|ž°5m$ÕÈ¡¤¢¥ªu7<ñ)é' IR¯Ÿùœø<`kÚHª‘CIEK/Tënpø£ÓO@’¤^7½ä°ø<`kÚHª‘CIEK/TìÓ-'_N?I’zÛìÚ3ã³€­qh#©Fm$-½P±O·øüµég IRo»gަg9[ãÐFRÚH*Zz¡bŸnþ‰·§Ÿ$Iým>é6üªø<`×ÚHª‘CIEK/TìÓM/?6ý $Iêu×w|ž°km$ÕÈ¡¤¢¥*öé&çÿAúH’ÔëF§>3>ÏØ5‡6’jäÐFRÑÒ ût£7ýBúH’Ôë&ü¯ø<`×ÚHª‘CIEK/TìÓ {RúH’Ôëf:)>ÏØ5‡6’jäÐFRÑÒ ûtƒÃ¾1ý $Iêuó›/ÏsvÍ¡¤9´‘T´ôBÅ?,–Ã;ÓOA’¤Þ¶Üüûø,`×ÚHª‘CIEK/TÜkqëÕé§ IR¯¼ä›ãó€‡çÐFRÚH*Zz¡â^³kß’~ ’$õºáI?Ÿç<<‡6’jäÐFRÑÒ ÷š¾ïˆôS$©×Ï~~|žððÚHª‘CIEK/TÜkrîo§Ÿ‚$I½núþ£âó€‡çÐFRÚH*Zz¡â^£Sžž~ ’$õºù ïŒÏsžCI5rh#©hé…Š{ ù¾ôS$©×-¿tK|žððÚHª‘CIEK/TüƒûwÝbž~’$õ·å²öù™ÀCrh#©Fm$-½Pñ–Ë»nN?I’zÝðħÄç9Í¡¤9´‘T´ôBÅ}æ7^”~’$õºñ[=>Ïxhm$ÕÈ¡¤¢¥*î3½ò¸ôs$©×MßwD|žðÐÚHª‘CIEK/TÜgrþï§Ÿƒ$I½n~ýùñyÀCsh#©Fm$-½PqŸÑ©ÏH?I’zÝò®›ã󀇿ÐFRÚH*Zz¡â>ã¿7ý$IêwËe78ôëã3€çÐFRÚH*Zz¡â9è]7Ÿ¦Ÿ„$I½nx“ó3€åÐFRÚH*Zz¡âþwܘ~’$õºñYÏ‹ÏsœCI5rh#©hé…Šû›ÿíé'!IR¯›^ú²ø<àÁ9´‘T#‡6’Š–^¨¸¿éåǦŸ„$I½nþ‰wÄç9Ρ¤9´‘T´ôBÅýMÞñ»é'!IR¯[ÞyS|žðàÚHª‘CIEK/TÜßèõ?~’$õ»å¢Û<ä‘ñ™À9´‘T#‡6’Š–^¨¸¿ÁQK? I’zßðøŒÏtÈ¡¤9´‘T´ôBÅÿçÀýºn>I? I’zÝøÌçäg:àÐFRÚH*Zz¡â·"ý,$IêuÓ¿:<>Ïx ‡6’jäÐFRÑÒ 4ÿÄÛÓÏB’¤^7¿îœø<àÚHª‘CIEK/T<ÐôýG¥Ÿ…$I½nqÇñyÀ9´‘T#‡6’Š–^¨x É¹/H? I’úÝrÑmòÈøLàþÚHª‘CIEK/T<Ðèu?™~’$õ¾á OŽÏtîÏ¡¤9´‘T´ôBÅ Žøçég!IRï¿õ×ã3€ûsh#©Fm$-½Pñ 6öíºé0ý4$IêuÓ¼tR|¦p‡6’jäÐFRÑÒ ³lÞ}[úyH’Ô럾,>ϸCI5rh#©hé…Š‡6ÿä{ÒÏC’¤^·ßÝmnìˆÏtîåÐFRÚH*Zz¡â¡M¯xUúyH’ÔûG~G|¦p/‡6’jäÐFRÑÒ mòößI?I’zßèÔgÆg:÷rh#©Fm$-½PñÐFñïÓÏC’¤Þ7¹ðOã3€{9´‘T#‡6’Š–^¨xhƒ—}[úyH’ÔûfyS|¦p/‡6’jäÐFRÑÒ »X8Gw¥Ÿˆ$I½nñ¹Æç9÷rh#©Fm$-½Pñð·\‘~"’$õ»ù´Û<è«ã3‡6’êäÐFRÑÒ oöׯK?I’zßðØïÏtÚHª“CIEK/T<¼É»þ8ýD$Iê}ãÓŸŸé8´‘T'‡6’Š–^¨xx£7þ|ú‰H’Ôû¦—Ÿé8´‘T'‡6’Š–^¨xxÃW|Oú‰H’Ôûæ×Ÿé8´‘T'‡6’Š–^¨Ø…÷ëºÙ8ýL$IêuË;?™Ÿé8´‘T%‡6’Š–^¨ØµÅç>š~&’$õ»å²úõñ™°îÚHª‘CIEK/TìÚìcg¤Ÿ‰$I½otÒSã3`Ý9´‘T#‡6’Š–^¨Øµé{I?I’zßäÜÄg:Àºsh#©Fm$-½P±kã3~%ýL$Iê}³žŸéëΡ¤9´‘T´ôBÅ® {Rú™H’ÔûŸ¾<>ÓÖCI5rh#©hé…Š-8økºn¹H?I’úÝd³ÛÜØ7?×Ö˜CI5rh#©hé…Š-.žwÞ”~*’$õ¾á+¾'>ÓÖ™CI5rh#©hé…Š­™_^ú©H’ÔûÆù‹ñ™°ÎÚHª‘CIEK/TlÍô}ž~*’$õ¾é{‰Ït€uæÐFRÚH*Zz¡bkÆg=7ýT$Iê}óëΉÏt€uæÐFRÚH*Zz¡bk†Çÿ`ú©H’Ôû–w}*>ÓÖ™CI5rh#©hé…Š-:økºn1O?I’úÝrÙ {T~®¬)‡6’jäÐFRÑÒ [·øÂߦŸ‹$I½otòÓâ3`]9´‘T#‡6’Š–^¨ØºùÇßš~.’$õ¾ÉÛÿg|¦¬+‡6’jäÐFRÑÒ [7}ï!éç"IRï›]ur|¦¬+‡6’jäÐFRÑÒ [7>í—ÓÏE’¤Þ·¸åÊøLXWm$ÕÈ¡¤¢¥*¶nxìÓÏE’¤þ7v›îŸëëÈ¡¤9´‘T´ôBÅn8ð«ºn6N?I’zßðèÇçç:Àrh#©Fm$-½P±{ŸýHúÉH’ÔûîùuŒé™°ŽÚHª‘CIEK/TìžÙGÞ”~2’$õ¾é%‡Åg:À:rh#©Fm$-½P±{&ýYúÉH’ÔûæŸx{|¦¬#‡6’jäÐFRÑÒ »gôÆŸO?I’zßò‹ŸŽÏt€uäÐFRÚH*Zz¡b÷ Žz\úÉH’ÔDƒ—|s|®¬‡6’jäÐFRÑÒ »icG·ß~6’$õ¾Ñkÿ]~®¬‡6’jäÐFRÑÒ »oqËég#IR÷{ñ™°nÚHª‘CIEK/Tì¾ÙÕ¯M?I’zßì¯_ŸéëÆ¡¤9´‘T´ôBÅÿég#IRï[ÜvM|¦¬‡6’jäÐFRÑÒ »oôºÿ~6’$õ¿ù¤Ûܹ|®¬‡6’jäÐFRÑÒ »oð²oM?I’šhxÜ¿ŠÏu€uâÐFRÚH*Zz¡bÑÁíé§#IRï¿õ×ã3`8´‘T#‡6’Š–^¨Ø3óO]’~:’$õ¾éåÇÆg:À:qh#©Fm$-½P±g¦W¼*ýt$Iê}ó›ßŸéëÄ¡¤9´‘T´ôBÅžŸó›é§#IRï[Žïî67öÏu€uáÐFRÚH*Zz¡bÏ _ý#é§#IR _ñ=ñ¹°.ÚHª‘CIEK/Tì¡CÙuËEúùH’ÔûƧýR~®¬ ‡6’jäÐFRÑÒ {nqÇ éç#IRï›þÕKâ3`]8´‘T#‡6’Š–^¨Øs³kÏL?I’zßüúóã3`]8´‘T#‡6’Š–^¨Øs“wo¤Ÿ$I½ïž¹“žé롤9´‘T´ôBÅž½ñçÓÏG’¤&¼ôŸÅç:À:ph#©Fm$-½P±çG~GúùH’ÔD£SžŸëëÀ¡¤9´‘T´ôBÅ^ØØÑ-Gw¥Ÿ$I½orÑŸåç:Àph#©Fm$-½P±wæ7_š~B’$õ¾ÙÇΈÏt€uàÐFRÚH*Zz¡bïL¯xeú I’ÔûwÜŸéëÀ¡¤9´‘T´ôBÅÞŸýüô’$©ÿ-—ÝàÐoˆÏu€Ö9´‘T#‡6’Š–^¨Ø;Þœ~B’$5Ñèä‹Ïu€Ö9´‘GØ¥z IDATT#‡6’Š–^¨ØKM×-æég$IRãwós qm$ÕÈ¡¤¢¥*öÞâï¯K?#I’zßìêׯg:@ëÚHª‘CIEK/Tì½ÙGOK?#I’zßâ¶¿ŽÏt€Ö9´‘T#‡6’Š–^¨Ø{“‹þ,ýŒ$IêóI·yÐWÇç:@ËÚHª‘CIEK/Tì½Ñ©ÏH?#I’šhxÜ“âs em$ÕÈ¡¤¢¥*öÞàÏ¿=ýŒ$Ij¢ñ[ÿ[|®´Ì¡¤9´‘T´ôBÅ6-¦ƒÛÓOI’¤Þ7½üØøLh™CI5rh#©hé…Ší1¿éâôS’$©÷Íÿîñ™Ð2‡6’jäÐFRÑÒ ÛcúW¤Ÿ’$Iýo:è6Ü/>×ZåÐFRÚH*Zz¡b{ŒÏz^ú)I’ÔDÃcŸŸë­rh#©Fm$-½P±=†ÇÿëôS’$©‰Æg>'>×ZåÐFRÚH*Zz¡b›ìÜ¿ëæÓôs’$©÷Ýóëãs Qm$ÕÈ¡¤¢¥*¶ÏâsK?'I’zßüæKã3 Um$ÕÈ¡¤¢¥*¶ÏìšSÒÏI’¤Þ·œ|¹ÛÜØ7>×ZäÐFRÚH*Zz¡bûLÎÿýôs’$©‰†G?>>×ZäÐFRÚH*Zz¡bûŒ^óãéç$IRÏxv|®´È¡¤9´‘T´ôBÅöú ]·\¦Ÿ”$I½oúþ#ãs Em$ÕÈ¡¤¢¥*¶×âŽÓOJ’¤Þ7¿éâøLh‘CI5rh#©hé…Ší5»ö-é'%IRï[޾ØmnìˆÏu€Ö8´‘T#‡6’Š–^¨Ø^“‹þ,ý¤$Ij¢áË¿;>×ZãÐFRÚH*Zz¡b{NyzúII’ÔDãÓ~9>×ZãÐFRÚH*Zz¡b{ túII’ÔDÓK_Ÿë­qh#©Fm$-½PQ`I½û¶ô³’$©÷Ío¼(>ÓZãÐFRÚH*Zz¡bûͯ?/ý¬$Iê}ËáÝæÆŽø\h‰CI5rh#©hé…Ší7}ï¡ég%IR ŽúÎø\h‰CI5rh#©hé…Ší7~óJ?+I’šhü—¿Ÿë-qh#©Fm$-½P±ýîù¯ï%IÒÞ7½äÅñ¹Ð‡6’jäÐFRÑÒ lìè–Ã;ÒOK’¤Þ7¿áù¹Ð‡6’jäÐFRÑÒ eÌoº8ý´$Iê}ËÁíñ™Ð‡6’jäÐFRÑÒ eLßTúiI’ÔDƒ#Ÿë­ph#©Fm$-½PQÆø-¿š~Z’$5ÑèM¿Ÿë­ph#©Fm$-½PQÆðØ'¦Ÿ–$IM4}ï!ñ¹Ð ‡6’jäÐFRÑÒ …¸_×Méç%IRï›_^~®4¡¤9´‘T´ôBE9‹O_ž~^’$õ¾å—?Ÿé­ph#©Fm$-½PQÎôÊãÓÏK’¤&üù·Çç:@ ÚHª‘CIEK/T”3~ÛÿH?/I’šhôæÿŸë-ph#©Fm$-½PQÎð„J?/I’šhzÉañ¹Ð‡6’jäÐFRÑÒ í< ëæÓô“$©÷Íoxg~®4À¡¤9´‘T´ôBEY‹Ûþ:ýÄ$Iê}ËáÝæÆŽø\è;‡6’jäÐFRÑÒ eÍ®:9ýÄ$Ij¢ÁQߟë}çÐFRÚH*Zz¡¢¬ñ9¿•~b’$5Ñø´_ŠÏu€¾sh#©Fm$-½PQÖð„'§Ÿ˜$IM4½ôeñ¹Ðwm$ÕÈ¡¤¢¥* Û¹×ͧég&IRï›ò=ù¹Ðsm$ÕÈ¡¤¢¥*Ê[ÜvMú™I’Ôû–£/v›ûÆç:@Ÿ9´‘T#‡6’Š–^¨(ovÕÉég&IR þÞø\è3‡6’jäÐFRÑÒ åÏù­ô3“$©‰Æg<;>×úÌ¡¤9´‘T´ôBEyÞœ~f’$5Ñô/Ïu€>sh#©Fm$-½PQÁÎý»n>M?5I’zßüæKós ÇÚHª‘CIEK/TÔ±¸íšôS“$©ÿMÝæûÅç:@_9´‘T#‡6’Š–^¨¨cvÕkÒOM’¤&ûýñ¹ÐWm$ÕÈ¡¤¢¥*ꘜû‚ôS“$©‰Æg=7>×úÊ¡¤9´‘T´ôBEÞœ~j’$5ÑôŠWÆç:@_9´‘T#‡6’Š–^¨¨dçþ]7Ÿ¦Ÿ›$I½oñéËós §ÚHª‘CIEK/TÔ³¸íšôs“$©ÿÍFÝæAˆÏu€>rh#©Fm$-½PQÏìª×¤Ÿ›$IM4<îIñ¹ÐGm$ÕÈ¡¤¢¥*Ꙝû‚ôs“$©‰Æg??>×úÈ¡¤9´‘T´ôBE=Ã8ýÜ$Ij¢ÙOŒÏu€>rh#©Fm$-½PQÑÎý»n>M?9I’zßâÖ«òs ‡ÚHª‘CIEK/TÔµ¸íšô““$©ÿÍ'_9`MÏu€¾qh#©Fm$-½PQ×ìª×¤Ÿœ$IM4<áÉñ¹Ð7m$ÕÈ¡¤¢¥*êšœû‚ô““$©‰î™©é¹Ð7m$ÕÈ¡¤¢¥*êžøÃé''IRÍ®~m|®ôCI5rh#©hé…ŠÊvÐuóiúÙI’ÔûŸûh~®ôŒCI5rh#©hé…Šú·^~v’$õ¿Å¼òuñ¹Ð'm$ÕÈ¡¤¢¥*ê›}ðÄô³“$©‰F¯ù·ñ¹Ð'm$ÕÈ¡¤¢¥*êŸýßÓÏN’¤&š¼óÇç:@Ÿ8´‘T#‡6’Š–^¨¨oøªH?;I’šhö±Óãs OÚHª‘CIEK/T¸_×M6ÓOO’¤Þ·¼ó¦ü\è‡6’jäÐFRÑÒ ó¿û@úéI’ÔDƒÃŸë}áÐFRÚH*Zz¡"czÙÑé§'IRN}F|®ô…CI5rh#©hé…ŠŒñ[~5ýô$Ij¢éÅ;ãs /ÚHª‘CIEK/Td ~|úéI’ÔDóëÏ‹Ïu€¾ph#©Fm$-½P²±£[ŽîJ??I’zßrð…¯ÌÕølè‡6’jäÐFRÑÒ 9óO¾'ýü$Ij¢ÁQ‹Ïu€>ph#©Fm$-½P‘3½ô¥éç'IROÿ/ñ¹Ðm$ÕÈ¡¤¢¥*rÆùŸÓÏO’¤&š¾ÿÈø\è‡6’jäÐFRÑÒ 9ƒ#›~~’$5ÑüæKãs ÚHª‘CIEK/T„ÚÍϧŸ $Iýo:è6üªø\Xum$ÕÈ¡¤¢¥*²æ×Ÿ—~‚’$5ÑðU?Ÿë«Î¡¤9´‘T´ôBEÖôâé'(IRÏ~~|®¬:‡6’jäÐFRÑÒ Y£SŸ™~‚’$5ÑìC¯ŽÏu€UçÐFRÚH*Zz¡"kpø£ÓOP’¤&ZÜvM|®¬:‡6’jäÐFRÑÒ yË/~:ý %Iê‹y·yÈ#ãs`•9´‘T#‡6’Š–^¨È›}ü¬ô3”$©‰F'=5>×V™CI5rh#©hé…Š¼É…’~†’$5Ñäü?ˆÏu€UæÐFRÚH*Zz¡"oôºŸL?CI’šhö‘7Çç:À*sh#©Fm$-½P‘78ì»n¹L?EI’zßâŽãs`•9´‘T#‡6’Š–^¨X ‹Û¯O?EI’úßrÙ ^òÍñ¹°ªÚHª‘CIEK/T¬†Ù‡OM?EI’šhtÊÏÄç:Àªrh#©Fm$-½P±&ç½0ý%Ij¢É{ŒÏu€UåÐFRÚH*Zz¡b5 O|Jú)J’ÔDóO¼=>×V•CI5rh#©hé…Š±sÿ®›ÓÏQ’¤Þ·Üüûü\XQm$ÕÈ¡¤¢¥*VÇâ3L?GI’šhpäcãs`9´‘T#‡6’Š–^¨XÓ+^•~Ž’$5Ñø´_ŽÏu€UäÐFRÚH*Zz¡buŒÏznú9J’ÔDÓ÷Ÿë«È¡¤9´‘T´ôBÅêó„ôs”$©‰æ÷þø\XEm$ÕÈ¡¤¢¥*VÈÆŽn9º+ý$%IêÓa·yÐWçg;ÀŠqh#©Fm$-½P±ZæŸ|wúIJ’ÔDÃã0>×VCI5rh#©hé…ŠÕ2½äÅé')IRMÎýíø\X5m$ÕÈ¡¤¢¥*VËèM¿~’’$5ÑìšSâs`Õ8´‘T#‡6’Š–^¨X-ƒ—}kúIJ’ÔD‹Û?Ÿë«Æ¡¤9´‘T´ôBÅêY~é–ô³”$©ÿ-—ÝàÅÿ$>×V‰CI5rh#©hé…ŠÕ3ûøYég)IR^ÿSñ¹°JÚHª‘CIEK/T¬žÉ…’~–’$5Ñä=Æç:À*qh#©Fm$-½P±zF¯ý‰ô³”$©‰æ×ŸŸë«Ä¡¤9´‘T´ôBÅêúõ]·˜§Ÿ¦$I½o9øB·¹±#>ÛV…CI5rh#©hé…ŠÕ´øüµé§)IR _þ]ñ¹°*ÚHª‘CIEK/T¬¦ÙÕ‘~š’$5ÑøŒgÇç:Àªph#©Fm$-½P±š&ç¾ ý4%Ij¢éeÇÄç:Àªph#©Fm$-½P±š†Çÿ`úiJ’ÔD‹[®ˆÏu€UáÐFRÚH*Zz¡bEôˆ®›ÓÏS’¤þ7w›;÷ÏÏv€àÐFRÚH*Zz¡buÍÿîéç)IR O|J|®¬‡6’jäÐFRÑÒ «kúW¤Ÿ§$IM49ï…ñ¹° ÚHª‘CIEK/T¬®ñÏN?OI’šhö‘7Åç:À*ph#©Fm$-½P±º†/ÿîôó”$©‰wÜŸë«À¡¤9´‘T´ôBÅ ÛØÑ-_H?QI’úßrÙ ^òOó³ Ì¡¤9´‘T´ôBÅj›ÿíé'*IRÞð³ñ¹æÐFRÚH*Zz¡bµM/>8ýD%Ij¢{fjz®¤9´‘T#‡6’Š–^¨Xm£SŸ‘~¢’$5Ñü†wÆç:@šCI5rh#©hé…ŠÕ68ü[ÒOT’¤&ZŽîê67öÏv€$‡6’jäÐFRÑÒ «oyçMég*IR ~||®$9´‘T#‡6’Š–^¨X}³ž–~¦’$5ÑøÌ_‹Ïu€$‡6’jäÐFRÑÒ «orÁ‹ÒÏT’¤&š^y\|®$9´‘T#‡6’Š–^¨X}£“Ÿ–~¦’$5ÑâÖ«ãs É¡¤9´‘T´ôBEüµ]·˜¥Ÿª$Iýo1ë‡|]~¶„8´‘T#‡6’Š–^¨è‡ÅmפŸª$IM4zÍÇç:@ŠCI5rh#©hé…Š~˜}èÕé§*IRM.ü“ø\Hqh#©Fm$-½PÑ㳟Ÿ~ª’$5ÑüoÞŸë)m$ÕÈ¡¤¢¥*úaøª™~ª’$5Ñróóñ¹âÐFRÚH*Zz¡¢'ܯ[N¾œ~®’$5Ñà¨Çåg;@€CI5rh#©hé…Šþ˜ê¯ÒÏU’¤&¿å¿Æç:@‚CI5rh#©hé…Šþ˜¾ïˆôs•$©‰¦W¼2>×ÚHª‘CIEK/TôÇø´_J?WI’šhqëUñ¹àÐFRÚH*Zz¡¢?G>6ý\%Ij£ù´Û<økã³ 6‡6’jäÐFRÑÒ ý²¼û¶ô“•$©‰F'?->×jsh#©Fm$-½PÑ/óëÎM?YI’šhò®?ŠÏu€ÚÚHª‘CIEK/TôËäÝé'+IRÍÿæìø\¨Í¡¤9´‘T´ôBE¿Œ^ÿSé'+IR-¿üÙø\¨Í¡¤9´‘T´ôBE¿ {T×-—ég+IR ŽüŽøl¨É¡¤9´‘T´ôBEÿ,n¿>ýl%Ij¢ñ¿Ÿë59´‘T#‡6’Š–^¨èŸÙ5oH?[I’šhzÙ1ñ¹P“CI5rh#©hé…Šþ™¼ýwÒÏV’¤&Z|æƒñ¹P“CI5rh#©hé…Šþžðäô³•$©æÓnóà¯Ïv€ZÚHª‘CIEK/TôÐAèºé0ýt%Ij¢ÑÉ?–Ÿí•8´‘T#‡6’Š–^¨è§Å§/O?]I’šhòÎ?ŒÏu€ZÚHª‘CIEK/TôÓô²£ÓOW’¤&š}ü¬ø\¨Å¡¤9´‘T´ôBE?ÏxvúéJ’ÔDË»o‹Ïu€ZÚHª‘CIEK/TôÓðåß•~º’$5ÓàÈÇÆg;@ m$ÕÈ¡¤¢¥*zjcG·Üž~¾’$5Ñøôgåg;@m$ÕÈ¡¤¢¥*úk~ýùéç+IRM/;:>×jph#©Fm$-½PÑ_“÷”~¾’$5Ñâ–+ãs ‡6’jäÐFRÑÒ ý5:ågÒÏW’¤6šOºÍÄg;@im$ÕÈ¡¤¢¥*úkðâoêºå2ý„%Ij¢ÑÉ?Ÿí¥9´‘T#‡6’Š–^¨è·Å7¤Ÿ°$IM4y×Çç:@im$ÕÈ¡¤¢¥*úmöá7¦Ÿ°$IM4ÿ›·Åç:@im$ÕÈ¡¤¢¥*úmrÞ ÓOX’¤&Znï67vÄg;@Im$ÕÈ¡¤¢¥*úmxâSÒOX’¤fý½ñÙP’CI5rh#©hé…ŠžÛ¹×ÍÆég,IRÏz^~¶äÐFRÚH*Zz¡¢ÿ·\™~Æ’$5ÑìC'Åç:@Im$ÕÈ¡¤¢¥*úozù±ég,IR->ÿñø\(É¡¤9´‘T´ôBEÿßò«ég,IR-—ÝàÅߟí¥8´‘T#‡6’Š–^¨è¿á+¾'ýŒ%Ij¦Ñ~6>ÛJqh#©Fm$-½PÑ€Ýrð…ôS–$©‰¦—–Ÿí…8´‘T#‡6’Š–^¨hÃü†w¦Ÿ²$IM4¿éâø\(Å¡¤9´‘T´ôBE¦œ~Ê’$µÑd³Û<èñÙP‚CI5rh#©hé…Š6ŒÞð³é§,IR3 Oø¡øl(Á¡¤9´‘T´ôBE/ùæ®[.ÓÏY’¤&šœ÷Âøl(Á¡¤9´‘T´ôBE;–w~2ýœ%Ij¢ÙGO‹Ïu€ÚHª‘CIEK/T´cö‘7§Ÿ³$IM´üÒgâs ‡6’jäÐFRÑÒ 혜ÿûéç,IR3 ŽxL|¶l7‡6’jäÐFRÑÒ í¾úGÒÏY’¤fŸþ¬ølØnm$ÕÈ¡¤¢¥*²ó€®›OÒOZ’¤&š^~l~¶l3‡6’jäÐFRÑÒ mY|æCé'-IR-n½*>×¶›CI5rh#©hé…Š¶L¯xUúIK’ÔF‹Y78äëâ³`;9´‘T#‡6’Š–^¨hËøÌ_K?iI’šiôÚŸˆÏv€íäÐFRÚH*Zz¡¢-ãŸ~Ò’$5ÓäÝÿ7>Û¶“CI5rh#©hé…ŠÆlìè–Ã;ÓÏZ’¤&š_~~¶l#‡6’jäÐFRÑÒ í™ßxaúYK’ÔDËÑ]ÝæÆ¾ñÙ°]ÚHª‘CIEK/T´gúÞCÓÏZ’¤fûýñÙ°]ÚHª‘CIEK/T´gtê3ÓÏZ’¤f¿í7â³`»8´‘T#‡6’Š–^¨hÏàðoI?kI’šivÍâ³`»8´‘T#‡6’Š–^¨hÓò®O¥Ÿ¶$IM´¼ó¦ø\Ø.m$ÕÈ¡¤¢¥*Ú4ûèié§-IR3 ŽxL|¶l‡6’jäÐFRÑÒ mš\ð¢ôÓ–$©™Æ§?+>Û¶ƒCI5rh#©hé…Š6NzjúiK’ÔLÓ+^ŸíÛÁ¡¤9´‘T´ôBE£vÐuóiúyK’ÔD‹Ï~8?Û¶CI5rh#©hé…Šv-n½:ý¼%Ij£å¢ö¨ølØ[m$ÕÈ¡¤¢¥*Ú5ûà éç-IR3Nyz|¶ì-‡6’jäÐFRÑÒ íŸõ¼ôó–$©™¦—¼8>Ûö–CI5rh#©hé…Šv yBúyK’ÔLóOýU|¶ì-‡6’jäÐFRÑÒ  ÛØÑ-Gw¥Ÿ¸$Im4w›;÷ÏÏw€½àÐFRÚH*Zz¡¢mó/J?qI’šixÒÆg;ÀÞph#©Fm$-½PѶé%‡¥Ÿ¸$IÍ4y×Çg;ÀÞph#©Fm$-½PѶÑ>ýÄ%Ij¦ùuçÆg;ÀÞph#©Fm$-½PѶÁáN?qI’ši9¼³ÛÜØ7>ßö”CI5rh#©hé…Šö-ïº9ýÌ%Ij¦á+ÿE|¶ì)‡6’jäÐFRÑÒ í›}ìôô3—$©™ÆçüV|¶ì)‡6’jäÐFRÑÒ í›\ð¢ô3—$©™f~c|¶ì)‡6’jäÐFRÑÒ íôÔô3—$©™îù•ŒéÙ°§ÚHª‘CIEK/T¬tÝ|š~ê’$5ÓàˆÇäç;Àph#©Fm$-½P±·^~ê’$5ÓøŒ_‰Ïv€=áÐFRÚH*Zz¡b=Ì>xBú©K’ÔLÓ+‹Ïv€=áÐFRÚH*Zz¡b=ŒÏz^ú©K’ÔL‹Ï~$>Ûö„CI5rh#©hé…Šõ0<æ é§.IR;-ÝàÅߟï»Ë¡¤9´‘T´ôBÅšØØ·[޾˜~î’$5ÓèÔgäç;Ànrh#©Fm$-½P±>æ7^”~î’$5ÓôÒ—Æg;Àîrh#©Fm$-½P±>¦—–~î’$5ÓâÓ—Åg;Àîrh#©Fm$-½P±>Foü¹ôs—$©æÓnóGÆç;Àîph#©Fm$-½P±>‡?:ýÜ%IjªÑë~2>ßv‡CI5rh#©hé…Šõ²¼ëæô“—$©™¦Ÿí»Ã¡¤9´‘T´ôBÅz™}ìôô“—$©™æŸº$>Ûv‡CI5rh#©hé…Šõ2¹àEé'/IR;ÍÆÝæÎâó`«ÚHª‘CIEK/T¬—ÑIOM?yI’šjtòÓâó`«ÚHª‘CIEK/T¬™tÝ|š~ö’$5Óä¢ÿ“Ÿï[äÐFRÚH*Zz¡bý,n½:ýì%Ij¦ù ïŠÏv€­rh#©Fm$-½P±~¦WŸ~ö’$5Óròånó GÄç;ÀV8´‘T#‡6’Š–^¨X?㳞—~ö’$5ÕðÄŽÏw€­ph#©Fm$-½P±~†Ç߶¡¤9´‘T´ôBÅÚØÑ-Gw¥Ÿ¾$IÍ4¿îÜü|؇6’jäÐFRÑÒ ëi~ãEé§/IR3-G_ì6Ü/>ßvÅ¡¤9´‘T´ôBÅzš^rXúéK’ÔTÃ㞟ï»âÐFRÚH*Zz¡b=Þøsé§/IRSMÎ{a|¾ìŠCI5rh#©hé…Šõ48üÑé§/IRSÍ®=3>ßvÅ¡¤9´‘T´ôBÅúZÞõ©ôó—$©™–›ßmnìˆÏw€‡ãÐFRÚH*Zz¡b}Í>zZúùK’ÔTÃcžŸïÇ¡¤9´‘T´ôBÅúš\ð¢ôó—$©©Æçüf|¾<‡6’jäÐFRÑÒ ëktÒSÓÏ_’¤¦š}äÍñù«hpØ£ºÑ몛\ôºùuçtÓËŽŽÿ™Ö•CI5rh#©hé…Š5¶ó€®›OÓ?’$5ÓòKŸÉÏwH;èÝðØ'vã·ýF7»æ”nñù=w:ö IDATk»n¹¸ßwèùÇßšÿs®)‡6’jäÐFRÑÒ ëmqëÕéI’šjpÔãâójºç»ðøÌç|åÿR3¿ù}]7íòûóüo/ˆÿ¹×•CI5rh#©hé…Šõ6½òøô€$IM5~ë¯Çç;”2xÙ·v£SŸÙMÞsP7¿îÜn9¼c¾?Ïozoüï²®ÚHª‘CIEK/T¬·ñYÏMÿH’ÔT³kÞŸï°‡~}7:é©Ýä¼~åW@-ï¼iÛ¾?/n¹"þ÷[Wm$ÕÈ¡¤¢¥*ÖÛð˜ïKÿH’ÔTË/ÝŸï°Ûüªnxì¿ò+ fzu·øüµ]·\ûþ¼øì‡óç5åÐFRÚH*Zz¡bÍmìè–Ã;Ó?’$5Õðåߟñ°‹_5>í—ºéeGwó›ß×u³QÕï΋ۯÿ3XWm$ÕÈ¡¤¢¥*˜ßxaúÇ@’¤¦ŸýÿØ»w;ëòÀûrßZ뤭öR¯Ú–NµS;o«´ÛÒvÚÒ·G§í´\íÔ¶¶VqtZvvNÑ9H@0FŽF…`8‚Q ‡hD1`8p?뼞ß{íÄ–SÎÙÏï^ëy>ŸëúþJ~ë¾7ÜÙë¯Ãç»$I’$IO?ªi/;:uWM¦Áú©,‰þÑ9•ßþÿKSshäàШTôB%õ>¿ ú@­ôo?/|¾K’$I’šY1ïÐÔ^rdê®<6õ×.ÝöP#¨œz(üÿ«¦æÐÈÁ¡ P©è…Jjâw¢ŸÔJùäáó]’$I’Ô€f˜Z‹HåÇlý ¨á¦[R*‡i”'ãÿÿkhm€Ú•Š^¨¤âøˆ~P;­E¯ Ÿñ’$I’¤ú}Tç·l=ªl\R¯•ÆÖ°þÿgSshäàШTôB%MWnÙý V:—¾-|¾K’$I’Æû¨¦½ìèÔ]5™ëW¤²x8ÕÍôoä‰þÿ¹‰9´rphT*z¡’¦ëßqaôS€ZéßqAø|—$I’$GżCS{É‘©»òØÔ_»4 7¯KM0ý¿;úÿû&æÐÈÁ¡ P©è…Jš®{ù»£ŸÔJ9µ9MMì>ã%I’$I#ÖìSkñ©³ü˜­_5ÜtKJÃAj¢âø—Åÿóh`m€Ú•Š^¨¤éZKÞý vZ§üDøŒ—$I’$ÆW@õn8! 6®N©×Šþqud'½"üŸOshäàШTôB%mmÎ Rô¢ŸÔJwÅßÇÏxI’$IR¶Š/IísJÝU“i°~E*§ŠþÑt¤µ½6üŸYshäàШTôB%ý{ÃM_‰~P+ý;/Ÿï’$I’¤ŠšwHj/92uW›úk—¦áæu)•eô¢c¥uêëãÿ960‡6@m€JE/TÒ¿×»éôèçµ2ý7§&ö Ÿñ’$I’¤}lö©µøˆÔY~Lê­Y´í+ Ýè;Ç^ë#?ÿ϶9´rphT*z¡’þ½Î§þ"ú9@í´ÿdøŒ—$I’$íYÅÂY©½ìèm_uÏ5)õŠè/k©ýÑ7‡ÿ³nbm€Ú•Š^¨¤¯uÊG?¨îeïŸñ’$I’¤W,8<µÏ=jÛQÍú[;)y´—þ÷ðþMÌ¡ ƒC RÑ •ôMì—ÊÖcÑOj¥¿nyüŒ—$I’$mkÞ!©½äÈÔ]ylê¯]š†›×¥T–Ñ?:6Vûüßÿ3ÑÀÚ98´*½PIOopÏÕÑOj¥,ISû‡ÏxI’$Ij\³H­ÅG¤ÎòcRoÍ¢4ظ:¥A7úÇDž¦sñŸÆÿ9i`m€Ú•Š^¨¤§×»n~ô“€Úiúúð/I’$Iu¯8ùÕ©sÑŸ¤Þ'o;ªéÑ?² OýeøŸ›&æÐÈÁ¡ P©è…JzzíOüNô“€Úé®|WøŒ—$I’¤:U,8|ÛW@]õ¾4X¿"•S›£ôc/t>ýWá–š˜C ‡6@¥¢*ééÇÿ@ô“€Ú|í3á3^’$I’ƶɃRëô7¤îÊcSíÒ4ܼ.¥²ŒþQйäoâÿ|50‡6@m€JE/TÒ³+·lˆ~P+eëÑ45±øŒ—$I’¤‘oö©µøˆÔY~Lê­Y´í+ úèë¨HçÒ¿‹ÿ3×ÀÚ98´*½PIϮDžÑÏj§uúÏ„ÏxI’$IµŠ…³R{ÙÑ©»jrÛW@µ·DÿøFFÝËþ!üÏ`shäàШTôB%=»îåïŽ~P;Ý+ÿ)|ÆK’$IRdÅü§ö’#·}Ôûýlý³ý粉y{@m€JE/TÒ³k-ySô³€ÚÜ}eøŒ—$I’¤lM”Z§¿aÛQÍÚ¥i¸y]Jeý£#¦{Å{âÿ¬60‡6@m€JE/TÒsšó‚”Ýè§õÒ+ÒÔœƒãç¼$I’$Ít³H­ÅG¤ÎòcRoÍ¢4ظ:¥~'ú§0Æ€ßþ“C ‡6@¥¢*i{ 7Ýý4 vÚgÿRøŒ—$I’¤}­X8+µ—º«&Ó`ýŠT¶‹þq‹1Õ½úÿ†ÿynbm€Ú•Š^¨¤íÕ»é´è§µÓ»vnøŒ—$I’¤=©˜ÿâÔ^r䶯€ºóâT~÷Áè­¨‘î5ÿþg¼‰9´rphT*z¡’¶WçSý4 v÷Ý>ã%I’$i‡M´í+ .ùÛÔ_»4 7¯K©Fÿ(EuWÍŽÿsßÀÚ98´*½PIÛ«uÊG? ¨Ÿaëßžó’$I’4]qò«Sgù1©·fQl\R¿ýS ã7¿ÆäÐÈÁ¡ P©è…JÚnûùne¨@ûã¿?ç%I’$5®bá¬Ô^vtꮚLƒõ+RÙz4úÇ#H½Ï/MÌ¡ ƒC RÑ •´£÷\ý< vz7ž>ã%I’$Õ»bþa©½äÈÔ]yìÖ¯€*»7úG!Ø®ÞõLJ¿—&æÐÈÁ¡ P©è…JÚQ½ëæG?¨áƒ·…ÏxI’$I5jö©µøˆ­_Õ¿ùÌ4ܼ.¥rý£ì–ÞêãßPshäàШTôB%í¨é_% ̰²LÅ /Ÿó’$I’ƳâäWo=ªé­Y”W§ÔoGÿ”{Ío}É¡ ƒC RÑ •´£Šã_ý< –:ýqøœ—$I’4ú gmýËpÝU“i°~E*‹G¢œ5}0ýΚ˜C ‡6@¥¢*igùþf˜yý›—„ÏxI’$I£U1ÿ°Ô^rdê®<6õ×.MåcߌþÑ*×ûÒ‡Ãß^shäàШTôB%í¬þF?¨éa=ã%I’$6ûÀÔZ|ÄÖ¯€êß|fn^—R9ŒþQ²ëÝtzü{l`m€Ú•Š^¨¤Õ½üÝÑOj©8ùUás^’$IR¾¯€ê\ø–­_“3ظ:¥^+úG Ó‡fÑﳉ9´rphT*z¡’vVkÉ›¢ŸÔRç3o Ÿó’$I’ª9ªi/;:uWM¦Áú©,‰þñFVÿ–³ÃßlshäàШTôB%í´¹/LiЋ~&P;ýÛÏŸó’$I’ö©bþ‹Sû£¿œºW½/ ¾úéT>qô0Vú·žþŽ›˜C ‡6@¥¢*iW 7ÝýL vÊ©Íijb¿ð9/I’$i7›}`j->"u–³õ+ ¶þ;³rý£ŒµþWΉÛ Ì¡ ƒC RÑ •´«z7ýL –Zþ©ð9/I’$i;Mì—Z‹^›:ŸüóÔ[sJ~ë‹)õÛÑ?B@íøê¨˜Ú98´*½PI»júoé3¯»ò]ás^’$IÒóR±à%©}îQ©»j2 Ö¯Heñpô Ðý›Ï ÿMÌ¡ ƒC RÑ •´«ZúÑègµ4øúeás^’$IjZÅüÃRû£oNݫޛúë–§òñoEÿhÕÿò០MÌ¡ ƒC RÑ •´Ë&öKåÔCÑOj§ì<™¦&ŠŸõ’$IR]›}`j->bëolî­Y”†›nIi8ˆþQøžÞ—Nÿœh`m€Ú•Š^¨¤ÝiúoÜ3¯}ö/…ÏyI’$©. g¥ö²£Sï†Ò`ãê”zEôÊìDoÍ)áŸMÌ¡ ƒC RÑ •´;u?÷oÑOj©wÝüð9/I’$cÅ‚—¤ö¹G¥îªÉ4X¿Âod†1ÔûÂÃ?Kš˜C ‡6@¥¢*iwjŸó«ÑOjixÿMás^’$Iùæ’ÚKŽLݕǦþÚ¥i¸y]Je½Îû¨wãâ?_˜C ‡6@¥¢*iw*ææû«  ÃA*Þÿ}á³^’$I™fZ‹HåǤޚEÛ¾jÐÞÜ ônXÿ™ÓÀÚ98´*½PI»Ûð;wD?¨¥Î…o Ÿó’$IRTÅÂY©½ìèm_uÏ5)õŠèȤwýqáŸAMÌ¡ ƒC RÑ •´»õo^ý\ –¦glôœ—$I’rT,8|ÛW@]õ¾4X¿"•S›£×q Pïó Â?—š˜C ‡6@¥¢*iwë|ú¯¢Ÿ ÔR¹ecøœ—$I’f¼ÉƒRëô7¤îÊcSíÒ4ܼ.¥²Œ^¿Ò»vnügUshäàШTôB%ín­S~"ú¹@mµýXø¬—$I’öºÙ¤Öâ#Rgù1©·fQl\Ò ½f#nú+ãÂ?¿˜C ‡6@¥¢*i·›Ø/•­Ç¢Ÿ ÔR÷²wÄÏzI’$i7+ÎJíeGoýäƒ{®I©;½Rc¨û¹ ÿ µ‘:ËI½5‹Ò`ãê”úèµhî•ÿÿYØÀÚ98´*½PI{R±à%)•ÃègµÔ»n~ø¬—$IR}+ÎJíeG§îªÉm_Õz,z®{Å{Â?›˜C ‡6@¥¢*iO>ôµègµ4¼ÿ¦ð9/I’¤zTÌqj/9rÛW@Ýy±ÿ¨ Œ¤îÊw…^613ÈÁ¡ P©è…JÚÓú_9'úÙ@= ©xÿ÷…ÏzI’$Y“mû ¨Kþ6õ×.MÃÍëR*Ëèí`—ºŸ}güghshäàШTôB%íiÓÿÒ¨Fç·„ÏzI’$vÅɯNåǤޚEi°quJýNô °Wº+Þþ™ÚÄÚ98´*½PI{ZëÔ×E?¨­þ-g…ÏzI’$NÅI¯L þ0õVŸ˜>ŸÊΓÑ++ÀŒ™þKÑŸ³MÌ¡ ƒC RÑ •´ÇMìŸÊÎÑOj©Ü²1~ÖK’$)¤bþ‹S{É‘©»òØÔ¿óâT~÷Áèõ RÓ¿+ú³·‰9´rphT*z¡’ö¦Á7WE?¨­Ö¢ Ÿõ’$Iª¸ÉƒRkñ[›CíÒ4ܼ.¥r½Šdåë“crhäàШTôB%íM½Ï/ˆ~:P[Óƒ9zÖK’$i›ØÛQͧþ2õn:- ¿}sJƒ^ôÚ ®ý‰ß‰ÿŒn`m€Ú•Š^¨¤½©½ìèè§µ5¸ëòðY/I’¤½¯X8kë¿;鮚Lƒõ+RÙz4zÅIís ÿÌnbm€Ú•Š^¨¤½©8î¥)•eôó€zêµÒÔ܆Ï{I’$íºbþa©½äÈ­¿•pú+ ÊÇîÞ&ÆFû¬_ÿobm€Ú•Š^¨¤½møèÝÑÏj«ý±ßŸõ’$IzV³ÜöPËIý›ÏLÃÍëR*‡Ñ«#ÀØjñ³ñŸí Ì¡ ƒC RÑ •´·õo[ý| ¶zk…ÏzI’¤¦7ýP ß²u7l\R¿½&ÔJkñO†Ö71‡6@m€JE/TÒÞֽ좟ÔÖðá»Âg½$IRÓŽjÚËŽNÝU“i°~E*‹G¢WB€Úk}ð5áŸÿMÌ¡ ƒC RÑ •´·µNÿ™èçµæ_8J’$US1ÿ°Ô^rdê®<6õ×.ÝöPdWœøCá3¡‰9´rphT*z¡’öºÙ¦ÔŠ~BP[ÝoŸ÷’$IãÞìSkñ©³ü˜Ô¿ùÌmG5å0zÕ`úÐæýß?'˜C ‡6@¥¢*i_l¸>ú @m ¾~Yø¬—$Iǯ€ê\ø–Ô[³( 6®N©×Š^ëØ©¹/ ŸMÌ¡ ƒC RÑ •´/õnXý„ ¾ºSijÎÁáó^’$i”jÚËŽNÝU“i°~E*‹‡£78öÀÔÄþ᳤‰9´rphT*z¡’ö¥öù¿ý„ ÖÚç>ï%I’F¡bÞ¡©½äÈÔ]ylê¯]ºí+ _ƒnølijm€Ú•Š^¨¤}©8áåÑOj­wãÉáó^’$){³L­ÅG¤Îòc¶~ÔpÓ-)•ÃèÕ €T¶Ÿ7 Í¡ ƒC RÑ •´¯•[6D?#¨­á毆ÏzI’¤\_Õ»á„4ظ:¥^+z  bÓÇÑó§©9´rphT*z¡’öµþD?#¨µâ?>ï%I’fªbÁK¶~=fwÕd¬_‘Ê©‡¢×-”[6†Ï¤¦æÐÈÁ¡ P©è…JÚ׺+ßýŒ Ö:—¾-|ÞK’$íMżCS{É‘©»òØÔ_»4 7¯‹^­Çևϩ¦æÐÈÁ¡ P©è…JÚ×Zù¹ègµ6øÚ%áó^’$i—Í>0µ‘:ËI½5‹¶}Ô ½J0¢†¬Ÿ] Í¡ ƒC RÑ •´ÏM>?¥~;ú)@}u§ÒÔœƒãg¾$IÒÓ*ÎJíeG§Þ 'l;ªéÑ[cdø­/†Ï²¦æÐÈÁ¡ P©è…Jš‰†ßZý” ÖÚýåðy/I’š[±àðÔ>÷¨Ô]5™ëW¤rê¡èõ€17¸÷ÚðùÖÔÚ98´*½PI3QïÆ“£ŸÔZoõ‰áó^’$5¤y‡¤öÙ¿”ºWüŸÔ¿ó¢TnÙ½ PCƒ»VÆÏ¼†æÐÈÁ¡ P©è…Jš‰:çÿAôS€Zn^>ï%IR ›}`jöÓ©sÉߦþ-g§áwîHi8ˆ^}h€þÄÏÁ†æÐÈÁ¡ P©è…Jš‰Š^ý” öZ|MøÌ—$Iã]±pVj/;zÛW@ÝsMJ½"zÅ ¡ú_þHø\ljm€Ú•Š^¨¤™jøè=ÑÏ j­ûÙw†Ï{I’4> Oí%G¦îUïKƒõ+R9µ9z€ÿà+’ãrhäàШTôB%ÍTýµK£ŸÔÚàî+Ãç½$IÑ&J­Óߺ+Ýúóùô×N¦²Œ^_`‡ºŸû·øùÙÐÚ98´*½PI3UçÒ·E?'¨·~'ó Ÿù’$)¸Ù¤Öâ#Rgù1©·fQl\Ò ½©À™> Ÿ© Í¡ ƒC RÑ •4Sµ>üŸ£ŸÔ^ûüߟù’$)oÅÂY©½ìèÔ]5¹í+ Ú[¢WØgOýEøŒmjm€Ú•Š^¨¤kb¿T¶~RPký[ÎŽŸù’$©²Šù/Ní%G¦îUïÛvTã?„PSþ"I\ö ‡6@¥¢*i&Üuyô“€Z+§6§©‰ýÃg¾$Iš&J­Óß°õ«3úk—¦áæu)•eôºY´ÏùÕøYÜÐÚ98´*½PI3Y÷š~RP{­3þkøÌ—$I{ØìRkñ©³ü˜Ô[³( 6®N©ß‰^+ L댟ŸÏ Í¡ ƒC RÑ •4“µ?úæè'µ×»vnøÌ—$I»Wû¬_Lƒ ×§²ûÝèFJkÑ…Ï馿ÐÈÁ¡ P©è…JšÑæ¾0¥A7úY@­ 7Ý?ó%IÒnÕ½üÝÑ«Œ¤â„ÿ>§›šC ‡6@¥¢*i¦~ûËÑÏ ê­,Sqâ‡Ï|I’´ë¦ð\Ss_>§›šC ‡6@¥¢*i¦ë}áCÑÏ j¯sÉ߆Ï|I’´ëzkN‰^`ô ûá3ºÉ9´rphT*z¡’fºÎ…o‰~VP{ƒõ—†Ï|I’´ëúk—F¯ 0rÊâ‘ðÝäÚ98´*½PI3]±ð£ŸÔ_¯å×lK’4MÇÏT>voøŒnrm€Ú•Š^¨¤**·lˆ~ZP{íÿVøÌ—$I;o°áúè•FÎðÁÛÂgt“shäàШTôB%UQÿ¶OD?-¨½ÞM§…Ï|I’´ó†Þ½2ÀÈ™>DžÑMΡ ƒC RÑ •TEÝý´ öÊÇ¿•¦&ö Ÿû’$iÇMÏkà™_¿,|F79‡6@m€JE/TRµN}]ôÓ€Fhúúð¹/I’v\Ùy"z]€‘Ó¿ý¼ðÝäÚ98´*½PI•4±*ÛG?/¨½îªÙñs_’$m¿Ù¦T–Ñ댜þ—ψŸÓ Ρ ƒC RÑ •TUƒ»¯Œ~^P{ÃM_ Ÿù’$iû'¼£›žC ‡6@¥¢*©êÊÇï‹~fÐíe¿>÷%IÒS 6\½ÀÈ)Ÿ¸?|F7=‡6@m€JE/TRÕõo??ú™@#ôo9+|îK’¤§nþjôz#gøàmá3ºé9´rphT*z¡’ª®{Ù?D?3h„rjsšš}@øì—$IÛ*ÛG¯0r÷\>£›žC ‡6@¥¢*©êZ§ýtô3€Æh-ySøì—$IÏKSó‰^ `$Mÿôð9ÝðÚ98´*½PI•7û€Tvžˆ~jнÆÏ~I’”Z‹^½ÀHê}qqøœnzm€Ú•Š^¨¤Mÿ:P zÃGïŸû’$éy©ýÑ_Ž^ `$uWM†Ïé¦çÐÈÁ¡ P©è…JÊQïÚ9ÑO £uÊO„Ï~I’š^瓽ÀHê®x{øœnzm€Ú•Š^¨¤µÏýµè§ѽæ_Âg¿$IM¯{å?E¯0’:ýqøœnzm€Ú•Š^¨¤óKi8ˆ~nÐÃn Ÿý’$5½ÞšS¢WIís~%|N7=‡6@m€JE/TR®†¬~nЭ¾&|öK’Ôäúë–G¯0’Z§¾.|N7=‡6@m€JE/TR®z_:5ú¹@ct¯zoøì—$©É ¿µ&z€‘T,œ>§›žC ‡6@¥¢*)W‹ÿ4ú¹@c ï¿)|öK’ÔäÊ-£×ISsŸÓMÏ¡ ƒC RÑ •”«â¤WD?7h޲LÅI¯ Ÿÿ’$5²ÉƒRö£·9eûñø9-‡6@m€JE/TRÎÊ-¢Ÿ4F÷òw‡Ï~I’šXqò«£×IǾ>§åÐÈá P©è…JÊYíÇ£Ÿ4Æà¾Ãg¿$IM¬}ίD¯0’÷\>§åÐÈá P©è…JÊYç’¿‰~rа¯zEøü—$©iu>óÖè-FRíÒð9-‡6@m€JE/TRÎZ‹~,úÉ@£t?ûÎðù/IRÓê]7?z€‘Ô»þøð9-‡6@m€JE/TRÖ&ö³Ä@Fƒ ŸŸÿ’$5¬þmŸˆ^`$ùË £‘GäàШTôB%宿nyô³€æ(‡©X8+|þK’Ô¤÷}!z€‘Ô9ÿÂç´Úy8´*½PI¹ë®|Wô³€Fé\úwáó_’¤&U>¹)züÀHjùóáøÿðr IDATsZm€<Ú•Š^¨¤ÜµNÿ™èg2¸çšðù/IRcšó‚­¿Qx®â¤WÄÏj9´²phT*z¡’²7û€T¶~zÐÃ~*Žûþø@’¤ÔZôcÑ“FS9LS“ÏŸÕrhäáШTôB%E4¸ëòè§ÒùÌ[Ãç¿$IM¨ý‰ß‰û0’Ê©ÍásZÛrhäàШTôB%EÔ½úŸ£Ÿ4Êàî«Âç¿$IM¨{å?E}IÃn ŸÓÚ–C ‡6@¥¢*)¢öY¿ýô Y†ƒTœðòð@’¤º×¿åìè©#iðõËÂç´¶åÐÈÁ¡ P©è…J iÎÁ)õZÑÏ¥»âíñ;€$I5opßÑ#FRÿæ3Ãç´¶åÐÈÁ¡ P©è…JŠj°áúèç2={£ç¿$Iu¯,Žù0’º«&Ãç´¾·¯8´2phT*z¡’¢ê]7?úù@³”e*Nzeø IR]+Þÿ}ÑÓFVç3>«µ-‡6@m€JE/TRTíýzôó€Æé^ñžð@’¤ºÖZò¦èQ#«ýñß ŸÕÚ–C ‡6@¥¢*)ªbÞ¡) ûÑOexÿMá;€$Iu­ó鿊õ0²Z§ýtø¬Ö¶Ú98´*½PI‘ ¿}sô€Æi}èGÃwI’êXÑcFVqüËÂgµ¶åÐÈÁ¡ P©è…JЬwãÉÑO§{Í¿„ï’$Õ±ÁúK£Ç<Œ¦A7MMì>«µ-‡6@m€JE/TRdíOüÑOgø;ÂwI’êX¹eCô˜€‘TnÙ>§õ´Å¡ C RÑ •Y±à%) Ñϧµø'Ã÷I’êT±àð”Ê2zÄÀHl¸>|Vë©Ú98´*½PIÑ Xý  qz×Í ß$IªSí³~1z¼ÀÈêßú±ðY­§rhäàШTôB%E×û‡¢Ÿ!4ÎðÑ{ÂwI’êT÷²ˆï0²º«&ÃgµžÊ¡ ƒC RÑ •]û¼ß‹~†ÐH­Óß¾H’T—ú7Ÿ=Ú`du>õá³ZOåÐÈÁ¡ P©è…JŠ®xÿ÷¥T£Ÿ"4NoõIá{€$Iuiø­5Ñ£FVûìÿ>«õTm€Ú•Š^¨¤QhøàmÑO§|rSšš}@ø IÒØ7±*»ßí0²Š“^?¯õ9´rphT*z¡’F¡ÞšS¢Ÿ"4RûÜ£Â÷I’ƽև~4z¤Àèôü%Ë¡ ƒC RÑ •4 uÎÿƒè§Ô_»4|$iÜë\ð‡Ñ#FÖðÑ{Âgµž™C ‡6@¥¢*i*Ž{iJå0ú9@ãLÍÅÔ¼CÂwI’ƹÞuó¢G:Œ¬Á7?>«õÌÚ98´*½PI£Òð;wD?Gh¤Î'ÿ,|$iœÜ}Uô8€‘Õ¿å¬ðY­gæÐÈÁ¡ P©è…J•z_\ý ‘w_¾H’4¶Mì—Êâ‘èq#«{Í¿ÆÏk=#‡6@m€JE/TÒ¨ä;í H9Lʼn?¾ H’4޵½6z’ÀHë\ü?Ã絞™C ‡6@¥¢*iT*Ž{éÖÿÐä×½âÿ„ï’$cOþyô€‘Ö:óáóZÏÌ¡ ƒC RÑ •4J ¿sgô“€F>x[ø IÒ8Ö[sJô€‘V,œ>¯õÌÚ98´*½PI£TïKŽ~’ÐX­S_¾ H’4n ¿õÅ裫ßNSû…Ïk=3‡6@m€JE/TÒ(չ࢟$4Voõ‰á»€$IcÕäA)õZÑ#FÖð¡õñóZÏÉ¡ ƒC RÑ •4JÇ¿,¥²Œ~–ÐHå“›ÒÔìÂ÷I’Æ¥Ö?=¾`¤ îº<|^ë¹9´rphT*z¡’F­áæuÑÏ«}ï’$KÝ=º`¤õn:=|^ë¹9´rphT*z¡’F­Þ—N~–ÐXýÛ–…ï’$KÓsرîUï Ÿ×znm€Ú•Š^¨¤Q«sÁF?Kh®^‘Ї‡ï’$Cåã÷EOni þ(|^k;;ŒC ‡6@¥¢*iÔ*Ž{iJå0úi@cu.}[ø> IÒ¨Wœüªè‘ #¯õ០ŸÙznm€Ú•Š^¨¤QløÀÚè§ 5¼ÿ¦ð]@’¤Q¯ó©¿ˆÙ0ÚÊaššûÂð™­çæÐÈÁ¡ P©è…JÅz7~ úi@£µN}}ø> IÒ(׿åìèq #­Ü²!|^kû9´rphT*z¡’F±ö²ßŽ~šÐh½/|0|$i”>òèq #mp÷•áóZÛÏ¡ ƒC RÑ •4ŠóKiЋ~žÐXeñHššspøN IÒ(V,œ=ª`äõÖ, ŸÙÚ~m€Ú•Š^¨¤Qmø­5ÑÏ­sÁ…ï’$b‹þ$zLÀÈë®øûð™­íçÐÈÁ¡ P©è…JÕzŸ_ý< Ñw]¾H’4Šõn:-zLÀÈkŸó+á3[ÛÏ¡ ƒC RÑ •4ªMÿ Rqâ‡ï’$ZÃÍ뢧4Œ>·µóÚ98´*½PIãP÷²ˆ~ªÀô¿0½vnø^ IRö&Je{Kô€±Ðýì;ãg·všC ‡6@¥¢*ij-zmôSRJå“lýÑ»$I9kì×£G0ŒöG9|vkç9´rphT*z¡’Æ¥rˆèç ¤”:çÿAø^ IRÎú_>#züÀØ(ŽYøìÖÎshäàШTôB%Ký[ÎŽ~®@JipÏ5á{$IÙšØ?•OnŠ¿0¦gføìÖ.shäàШTôB%K‹þ$ú¹ÓÊrë×:Fï’$å¨uæ£'/ŒÁ7®ŸÝÚum€Ú•Š^¨¤qiúWަrýd€”Rï  ß $IÊQÑcÆFoõIá³[»Î¡ ƒC RÑ •4N ¸5úÉÓ¿Ô¦ód*æ¿8|7$©ê†ß=v`lt–>»µëÚ98´*½PI㔿I££ûÙw†ï’$UYëÃÿ9zÜÀXiúúðù­]çÐÈÁ¡ P©è…J§Úçýd€ï>ò45±ø~ IRUuWMF[ƒ^ššspøüÖ®shäàШTôB%Us^R¯ýl€ïi/;:~?$©¢†=zÔÀØ~çÎðÙ­ÝË¡ ƒC RÑ •4n î¹&úÙß3=—£wI’ª¨õ‘ÿ7zÌÀXéß~^øüÖîåÐÈÁ¡ P©è…J·ºW½7úÙOÓ:õuáû$I3]oÍ)Ñ#ÆJ÷êÿ>¿µ{9´rphT*z¡’Æ­Öiÿ%úÙOÓ¿ùÌðý@’¤möþì¡ö²ßŽŸáÚ­ì9@m€JE/TÒØ5±_*§Š~ºÀ¿ëµRqÜKãwI’f¨öÒߌž®0vŠ“^>õ{9´rphT*z¡’ƱþF?]àiüŠpIRêßö‰èÑ c¥loÙú$£g¸v/‡6@m€JE/TÒ8ÖùÌ[£Ÿ.ð4åßNS“…ï’$ísóIe÷»Ñ£ÆÊ`Ãõñ3\»C ‡6@¥¢*i+NzeôÓž¥sñŸ†ï’$íkOþyôH€±Ó»é´ð®ÝÏ¡ ƒC RÑ •4® þzôóžføÀ­áû$IûÚàî«¢G*ŒÎ¥o ŸáÚýÚ98´*½PIãZïK§F?_àYÚûõðA’¤½­8ùU)•Ãèq c§uæÃç¸v?‡6@m€JE/TÒ¸Ö>ïw£Ÿ/ð,ƒo~.|G$ioë]\ô(€ñS–©˜ÿâð9®ÝÏ¡ ƒC RÑ •4®óKiЋ~ÂÀ³´ÎøÙð=A’¤=nò T~÷Áè1 cgøèÝñs\{”C ‡6@¥¢*iœlø|ôž¥çÅá;‚$I{Zç‚?Š¡0–ú·Ÿ>ǵg9´rphT*z¡’ƹîÕÿý„€gRëC?¾'H’´' î¹&z‚ÀXê^ñžð9®=Ë¡ ƒC RÑ •4εNû/ÑOØŽþ—Ïß$IÚÝŠ“_R9ŒŸ0–ÚgÿRø,מåÐÈÁ¡ P©è…Jë&öKå“D?càÙúT,œ¿+H’´õnX=9`<•ÃTÌ?,|–kÏrhäàШTôB%{ý[?ýŒ€íè}~Aøž IÒ.›|~*§6GMKÃÍëâg¹ö8‡6@m€JE/TҸ׹øO£Ÿ1°eë1³Q’4òu.ú“è‘ c«¿viø,מçÐÈÁ¡ P©è…J÷Šã¾ë¯(FO÷êß$IÚYÃû¿=.`lu/{Gø,מçÐÈÁ¡ P©è…JªCÃûoŠ~ÊÀv”Å#~«$idkŸýߢG%ŒµÖ™?>ϵç9´rphT*z¡’êPïÚ¹ÑOØîUï ß$IÚ^ƒõ+¢Ç$Œ¯A/MÍ}aø<מçÐÈÁ¡ P©è…JªC­%oŠ~ÊÀ”Åé˜whø¾ IÒÓk-z­¯!€}0|àÖðy®½Ë¡ ƒC RÑ •T‹fÊÖ£ÑÏØî•ÿ¿/H’ô´ú7Ÿ=`¬õo^>ϵw9´rphT*z¡’êRÿ΋¢Ÿ3°~«$i”*ŽYJ½Vôx€±Ö¹äoÃgºö.‡6@m€JE/TR]ê|ú¯¢Ÿ3°Ý+Þ¾/H’4]ïÚ9ÑcÆ^ëôŸ ŸéÚ»Ú98´*½PIu©X8+¥²Œ~ÒÀLÿ‹¼©¹/ ß$I oÎ üÇ%ØWývšš|~ü\×^erphT*z¡’êÔðÁÛ£Ÿ4°ÝËÿwø¾ IjvÝo‡0ö†÷ß>Óµ÷9´rphT*z¡’êToõ‰ÑO؉ò»¦©y‡„ï ’¤†6çàT>qô8€±×»é´ø¹®½Î¡ ƒC RÑ •T§Úçüjô“v¡{Í¿„ï ’¤fÖ½ìÑcj¡ó©¿ ŸëÚûÚ98´*½PIµjòù©ì~7úY;Q¶OÅq/ß$IÍjÎ ü6˜!­Å??Ûµ×9´rphT*z¡’êÖàk—D?k`z7, ß$Iͪ»òØèñµPvžHS³ŸíÚûÚ98´*½PIu«sÉßD?k`WúíTœôŠð½A’Ô¤ßfóíèéµ0¸ûÊøÙ®}Ê¡ ƒC RÑ •T·Š…³R*Ëè§ ìBÿæ3Ã÷IR3ê^þ¿£ÇÔF÷sá³]û–C ‡6@¥¢*©Ž ¸5úi»2¤Ö)?¾7H’ðÛlžÜ=õ 6ÚçüJü|×>åÐÈÁ¡ P©è…Jªc½ëæG?m`7ôï¼(|o$Õ»îï‰wPÃ~*æ>ßµo9´rphT*z¡’êXëÌŸ~ÚÀî(ËÔúÈÏ…ï’¤zVÌ?ÌH€4üöÍáó]ûžýÈÁ¡ P©è…Jªeû§rê¡èç ì†Á½×Æï’¤ZÖ[}bô˜€Zé­9%|¾kßshäàШTôB%ÕµþÚ¥ÑÏØMíó~/|w$Õ«âäW¥ÔïD8¨•Î…o ŸñÚ÷Ú98´*½PIu­sáÿˆ~ÞÀn*ûfššspøþ IªOý;/ŽoP;ʼn?>ãµï9´rphT*z¡’êZ±àð”½è'ì¦î•ÿ¾?H’êQëÌ7¦T–Ñ£ j¥|ìÞð¯™É¡ ƒC RÑ •Tç÷^ýÄ€ÝTvžLÅ /ß$IcÞÄ~ipߢÇÔNÿ¶eñs^3’C ‡6@¥¢*©ÎMÿÍx`|ôn:=|$wOþYô8€Zê\úwás^3“C ‡6@¥¢*©ÎµNù‰è'ì‰á µ>üSá;„$iL›ó‚TnÙ=Í –ü¬VŸÚ98´*½PIu¯|ì›ÑÏØƒ{®ß$IãY÷sÿ=Æ –ÊöãijbÿðY¯™É¡ ƒC RÑ •T÷z_\ýÌ€=Ô>ïwÃwIÒxÕúàkRêµ¢GÔÒàW„ÏzÍ\m€Ú•Š^¨¤º×þØoD?s`•ß—Šy‡†ï’¤ñip×ÊèñµÕ½æ_Ãg½f.‡6@m€JE/TRí›sp*;OF?u`õn8!~$E‹ÿgôØ€ZkôÍáó^3—C ‡6@¥¢*© ¾vIôSöÔ°ŸZ§¾.|$vÅ‚ÃSùä¦è©õ5襩¹/ Ÿùš¹Ú98´*½PIM¨sÉßD?u`/ 6\Ÿ¦&ö ß%$I£[ÿæ3£ÇÔÚðþ›Âç½f6‡6@m€JE/TR*þ`JeýÜ€½ÐùÔ_†ï’¤Ñ¬µäM)•ÃèQµæk}ë—C ‡6@¥¢*©)MÿÍ `ü”Å#©8îûÃw IÒˆ5ûÀ4|ð¶è1µ×>÷×âç¾f4‡6@m€JE/TRSê^ó/ÑÏØKÓ_ ½KH’F«îÕÿ=ž þú45÷Eás_3›C ‡6@¥¢*©)µÿdôsöVY¦ö¹G…ï’¤úù®ßŽžNP{ƒ ŸŸûšùÚ98´*½PIMjøÈ7¢Ÿ<°—ÊÇîMżCÃ÷ IRpsNÃoKÐÝU³ãg¿f<‡6@m€JE/TR“êÝøè'ìƒÞ>¾OH’bë­>)z@c´Ïú…ðÙ¯™Ï¡ ƒC RÑ •Ô¤Úgýbô“öE9Ü:Ï£w IRLÓÿ±/ ÑÓš¡;•¦&Ÿ>ÿ5ó9´rphT*z¡’ÕìR9õPô³öÁðá»ÒÔÜÆï’¤¬ Oå–Ñccp×åáó_ÕäÐÈÁ¡ P©è…JjZý[Ï~öÀ>êݰ0|§$å­¿öãÑã¥{å?†ÏU“C ‡6@¥¢*©iµÏû½ègì«r˜ZKÞ¾WH’òÔ>ÿ÷£'4NëôŸ ßTMm€Ú•Š^¨¤Æ5÷E)õZÑOØGÇÖoëá»…$©ÒŠ…?˜Êâ‘è±R¶MSû‡ïª&‡6@m€JE/TR¬_ýô€Ðÿòá{…$©Âf˜®7Ð8ýuËã÷U–C ‡6@¥¢*©‰u>óÖè§Ìöy¿¾[H’ª©wãÉÑc©»âíá{€ªË¡ ƒC RÑ •ÔÄŠã ¥á úù3 ,NÅÂYáû…$if›>¤Le=f ‘Z§üxø. êrhäàШTôB%5µÁ}7F?`† î¹:MMì¾_H’f¦Ö‡~4•íÇ£Ç 4RùäỀªÍ¡ ƒC RÑ •ÔÔºWþSôófPwå»Â÷ IÒ 4÷…iøÀÚè±Õ¿mYü> JshäàШTôB%5µÖ¢×F?`&õÛ©uêëÃw IÒ¾5ý÷€8Oÿ¯ð}@ÕæÐÈÁ¡ P©è…JjrÇÖG3høÈ7R1ÿÅá;†$iïê®øûèQW|àGÂwU›C ‡6@¥¢*©Éõn8!ú#˜aýuŸ ß1$I{^ëÌŸO©ß‰#ÐhÓ11z'Põ9´rphT*z¡’š\ë#?ýT »ò]á{†$i÷+N~U*§6Gh¼Þ'‡ïª>‡6@m€JE/TR£›Ø/•ßý1Ì´A/µ—¿kH’vÙôWþ ¿sGôäRJís ß T}m€Ú•Š^¨¤¦×[³(úc¨@ùø·RqÜ÷‡ï’¤4yPÜsuôȦu§ÒÔœƒã÷UžC ‡6@¥¢*©éµÏúÅè "ƒo\‘¦&öß7$IÛ¯ËÙÑ£øžÁ×. ß ”'‡6@m€JE/TRã›Ø?•OnŠþ(*Ò»á„ø}C’ôœºWÿsôˆž¦séÛÂ÷åÉ¡ ƒC RÑ •¤ç¥ÞM§Gê|ú¯Â÷ IÒSu.ø£”Êaôxž¦øÀ„ïÊ“C ‡6@¥¢*IÏKís~5ú£¨R¿Zù¹ðC’ô¼Ô:ãgSêÑ“xšáwî ß”/‡6@m€JE/T’ž—¦f˜Êâáè BåßNÅÂŒß;$©Áµág/A½Õ'†ï Ê—C ‡6@¥¢*IÛêßrvôÇP±á¦¯¤©¹/ ß;$©‰µ>øšT>¹)zÛÑþè›ÃwåË¡ ƒC RÑ •¤mµ—þfôÇAÿöóÒÔÄ~ệ$5©â¤W¤rˆèlGÙy"MM¾/(_m€Ú•Š^¨$}¯ÉƒRÙz,ú#È wýqñ»‡$5¤âø—¥áC_‹þèv ÿÕO…ï Ê›C ‡6@¥¢*IOÕ_ûñè “îeïß=$©î ^’†Üý‘ìDç3¾3(om€Ú•Š^¨$=Uû¼ßþHrRû¼ß ß?$©¶Í;$ î»1úÓØ™²Lʼn?¿7(km€Ú•Š^¨$=­9/ØúÄ@CôZ©uæãwIª[s_˜÷^ý)ìÂðÁÛâ÷eÏ¡ ƒC RÑ •¤gÖ¿ãÂè £éÁØúàkÂwIªMs_”w_ýñì†ÞõÇÇïÊžC ‡6@¥¢*IϬsá[¢?€ÌÊÇïKÅI¯ ßC$iÜ+æšß\ý±ì¦öY¿¾?(m€Ú•Š^¨$=«y‡lý  Y†›¿šŠã¾?~‘¤1mú3t¸é–ès`7•í-ijöá;„òçÐÈÁ¡ P©è…JÒs|õÓÑ @€áƒ·¥bÁKÂwI·ŠþS~çŽèq`ôo[¾C(&‡6@m€JE/T’ž[ç“ýÑl¸>MÍ}aø>"IãRqò«ÒðÑ{¢?¾€=Ô¹àÃ÷ÅäÐÈÁ¡ P©è…JÒs+æ¿Ø×G@ƒ îº?|'‘¤Q¯uʧò‰oGlÃÿßÞ}G{V—‡þÿ ذ›ØMì-–DM¢i&zÓÌÍÍŠzÕsM¹æzÑä—ú³œéô6C‘& ¢‚iR•A¤ƒ2ÒË0ÌwûÞÏ]sL²ÔP¦œ½Ÿï÷»_¯µÞÿe™µ\ìg=||Î9Àfv£³ü 黄rrh4Á¡ P«ì…JÒC7ºêøìñdÛ,Ý!}'‘¤I­{À¢êÜ=®€-0¾æÄô]By9´šàШUöB%é¡ëóîìñ$_{’ßl#IQï°·EÕ[—=¦€-Ô?áƒéû„òrh4Á¡ P«ì…JÒôô±Qõ×g ™ßl#I?YÿK1dg`K•ã(v~FúN¡¼ÚMphÔ*{¡’ôð®ø|öˆ&€cIú¢3·(g/ÉÉÀVÿìü½B©9´šàШUöB%éáë}î²G0!Æ×žìØFR€h¿ IDAT{[ö¸]u\ö(Àà”äïJÍ¡ Ї6@­²*IÐ’í£êÞ—=&€ 1¾éÜ(V옿£HRƒmüÓã[¾ž=‚€…PUQìñüôýB¹9´šàШUöB%é‘]zXö˜&HùË£Øéié;Š$5Qw¿×DµîæìÑ ,rí·Ò÷ åçÐh‚C VÙ •¤G®÷™ÿ’=&€ SÞ~Y»<3}O‘¤:ëñލzd\` ÎüÿÓw åçÐh‚C VÙ •¤GiñvQuîÊÀ„)ïº:ŠÝž“¿«HÒB7·(g~,¢gZ`uW¿2×Pzm€&8´j•½PIzô†ß: {ThãŸSñP-i–*V>9FWŸ=^€”w_“¾kh2rh4Á¡ P«ì…JÒ£×ûôod `BUÝûçw…ì}E’¶¶î§~1ªû¿Ÿ=V€š ÏÛ)}ßÐdäÐh‚C VÙ •¤Mhn›¨Öÿ0{\“jÔþÿ{þÎ"I[XÿøD »ÙÓ¨Q÷À7¦ïšŒÚMphÔ*{¡’´i /Ü;{\“¬ªbpú?§ï,’´9ËŸ£+¾=A€šmü!ÂÎÜ¢ôÝC“‘C  m€Ze/T’6­îA¿œ=.€)0\³jþ·áeï.’ôhuW¿"Ê;¯Ì›@†ßÜ7}÷ÐääÐh‚C VÙ •¤MlnQT÷ß”=2€)°ñ·Ct–î¿¿HÒÃÔÿÒ_F :ÙãhHï°ßJß?499´šàШUöB%iÓž¿söÈ¦Äø¦s£Xù”ôýE’~¼b—Ÿ‰ñ5_Α@ƒªoÎâmÓ÷MNm€&8´j•½PIÚôºû¿.{dS¤¼ëª(öxAú#Iëý§QuîÎ@Æh²rh4Á¡ P«ì…JÒæUÞ}MöئHµ~íü±nö#©½müíZ£Ëʇ@’îAoNßG4Y9´šàШUöB%ióœõñì±L›Agþ7Idï1’ÚWGõÀ­ÙSHRÞ÷½èÌ-JßI4Y9´šàШUöB%ióÚøç¢*³G0mª*†ì¹mÒ÷I-hÙãægŽw€vž»"/ÑÄåÐh‚C VÙ •¤Ío|óyÙ£˜Rã«¿Åò'¦ï3’f·Þ¡¿å½7d;`t÷{Mún¢ÉË¡ Ї6@­²*I›_ÿË=:€)VÞsoI ^±ÓÓb¸f•ßbÌ+ïünú~¢ÉÌ¡ Ї6@­²*I›_±âIÃnöø¦X5Øýcß—¾×HšæEÿøDUÜ“=Ú€ 28ëãù{Š&2‡6@ÚµÊ^¨$mY£+ÍÀ ]rpt–î¾ÛHšÎº¼>Ê[×d2`u÷~Iú®¢ÉÌ¡ Ї6@­²*I[Vïs”=>€Qþð’èîóÒôýFÒôT¬|r ¿¹oD9ÎaÀ*×~+}_ÑäæÐh‚C VÙ •¤-lñvþ…X8Ãn NýhþŽ#iâëõΨ֯͞ZÀ|õïÓwMnÞµ&8´j•½PIÚò†í—=B€³ñÏS;=5}Ï‘4yuxCŒo:'{L“®*£Øí9黋&7‡6@ÚµÊ^¨$my݃ޜ=B€T=pkôŽx{ú®#i2*öü¹]þ¹ùÿÑ àÑŒo:7}ÑdçÐh‚C VÙ •¤­«¼ûÚì1Ì¢ªŠÑ%G±bÇô}GRNÅNO‹á»FŒzÙ ˜"ý?”¾Çh²sh4Á¡ P«ì…JÒÖ5øÚ\öfXµî–èþ;é;¤[²} NýhT½uÙ#˜6ãa;?=ŸÑDçÐh‚C VÙ •¤­«Øëççâ 6UÃo}*Š•ONß}$ÕØÜ6Ñ?áƒó>`KŒ¯?5§ÑÄçÐh‚C VÙ •¤­o|ËÙ£hêÁÛ¢ô»ÒwI _ï¨?ŒòÎïf`Êõû³ô½F“ŸC  m€Ze/T’¶¾÷ ÉŸR-öü¹ôHÒV6·(zG½3ʵe`TýõÑYöøüGŸC  m€Ze/T’¶¾båS"F½ìq´É ƒ3þ5:K¶Oß…$mf‹·þ±ïòÎ+³' 0CFß>4ÏÑTäÐh‚C VÙ •¤…itÕñÙãh¡ò¾£Ì»Ów!I›Ð’ÇDÿøDyÏuÙ£˜AÝCÞ’¿ïh*rh4Á¡ P«ì…JÒÂÔûüg åNª»êeé;‘¤‡hÙãbpÊG¢zàÖìQ̨òžëçÿ,eúÞ£©È¡ Ї6@­²*I Ô’ÇDÕ¹+{¤m6Äpͪ(v~Fþn$)Š;ÆàŒñ?dµœù±ôÝGÓ“ýh‚C VÙ •¤…kø=³G @Tƒ 1¼`×ùÿ‘?{?’ÚXwï—̃U÷þìq´AUF±ÇóÓw MOm€&8´j•½PIZ¸ºû¾*{¤ü‡jý£ÿ忊ÎâíÒ÷$iæ›Û&zG½3Æ7žQUÙŸ?Ð"ãNËß…4U9´šàШUöB%ia+oýföXø Õº›£â‡ÜH5T¬xÒü÷UÞ}Mö§´Tÿ˜÷¤ïDš®ÚMphÔ*{¡’´°m|d˜DåÝ×FÿøDgñ¶é;“4íuW½<†kVE :ÙŸ6ÐbU÷¾è,}lún¤éÊ¡ Ї6@­²*I ÿ­Û€IVÞuUô}Ÿßp#mnKwˆþÑïŠñMçdÆó†ß: GÒÔåÐh‚C VÙ •¤…oô#³G À&ýI©Á©βǧïOÒ$×Ý÷U1¼`ר:wg¶?¡{àÓw%M_m€&8´j•½PIZøzŸþìѰÉ6>²ÎüX+Ÿ’¾GI“R±ûóæ¿‹r `•w^™¾3i:sh4Á¡ P«ì…JR Í-Šò¾³Ç Àf©btÉÁÑÝ÷Õùû””ÑÒÇFÿ˜wÇøÚ“#ÊQö' ðˆ§ýCþþ¤©Ì¡ Ї6@­²*Iõ48ëãÙã`ËTUŒ¿wVôŽzçüqö^%Õ]÷S¿4dVõÌþú6M9Šb×g¥ïQšÎÚMphÔ*{¡’TOÅîÏ(ÇÙ#`«”÷\7ÿ“²ÅÎOO߯¤kñ¶Ñ;ì·bøÍ}£Z¿6û3ØlãkOÊß©4µ9´šàШUöB%©¾Æ×Ÿš=bƨ£+Þo÷[n4½Ç5‡¼5†kVEµáŽì/ `«ô>ÿßò÷+Mmm€&8´j•½PIª¯þÑš=bêù-7gük»?/}ß’±eÞþ$F—Uo]ö§° ªÎ]ÑYò˜ü]KS›C  m€Ze/T’jlÉöQuîÎ3õ¨ÊßòõèŸø¡(V옿{Iÿ~\sÔ;cô#£ê?˜ý•,¸áù;çï\šêÚMphÔ*{¡’Toà ÷Î3õtbôÏÎ8l<6ÎÞÁԢ涉îoŒÁYñÍçGŒ‡Ù_@}ª2Š=.ÓTçÐh‚C VÙ •¤zëî÷šì1Ш¢gão™?ºYºCú>¦Ù«Øõg£Ì»ctÉÁQ=x[ö?ò_wJú.¦éÏ¡ Ї6@­²*IõW®ýVö¨HQõˆÑåGÍE+ž”¾—iJ[ö¸è}æwcø½¢¼ëªì¬Ò̳gïfšúÚMphÔ*{¡’Tý“þ&{Ôäbü½3cpÊGüº{=rK¶îÁ¿ƒÓÿyþŸ™õ²ÿéHW­»%:‹·ÍßÕ4õ9´šàШUöB%©þ6þôv5Ø=n&ÊÆßL2¼pŸè}ö¢³ü é;›÷å•O‰ÞQÃóvŠñÍçG »ÙÿxLœÁYŸHßÛ49´šàШUöB%©™F—œ=n&û·ÝÜtn Îúxtúåè,Þ.}S}müFýãþ,FåWFTeö?“m<ˆb×g¥ïqšÚMphÔ*{¡’ÔLÝÞ=n¦Ç ãGïÓ¿eKßç´…-}ltzs NýhŒ®übTÞ–ýOÀÔ}÷˜ü½N3“C  m€Ze/T’š«\{QöȘÞßxóƒ c¸fUô}t÷yiún§ÿ\±bÇèúk?:ª¹ì3QÞqED9Êþ§`êõû­ô]O³“C  m€Ze/T’š«ÿ¥¿È93£êÞãOáy+£ô»¢»êeÑ™Û&}çkE‹·‹îêWÌÿ÷>8{IŒ®:.Ê{®ó' jPÞ}Mtæå™ÚMphÔ*{¡’Ô`Ë?ÿ?P“A'ʵߊÑ%‡Äà+ÿoôÿí(v^þ8Å¿¡¦û©_Œþ1ï‰ÁYŸˆÑ_ˆòŽËçÃÍœúwé{¡f+‡6@ÚµÊ^¨$5ÛÆ?w@³ªÁ†(oûöü¡ÈàìÅÑ?ö}Ñ=ä-Qìöìvÿtðâmç‘z‡¼uþ¿“Á™‹Ñ¥‡Åø– <¾L‚aÅʧäïš©ìú@ÚµÊ^¨$5[wõ+#ª*{ôðïFýù?{4¾ñŒ]rðüŸBêŸø¡è}î¢{Л£Øý¹ÑYò˜ô=rs+v~Ft÷}Uô{[ô}ÿüOBÏß%F—õ£Cšu·DŒ‡ÙÿíðFßþtú^©ÙË¡ Ї6@­²*IÍ7¾éÜìÑÀfª:wGyÏõQÞúÍ_êüÁÊpÍêùÜÁWÿ~þ8§ÿÅ÷Fï ½#Þ݃uþÏ.{½è'ÛéiQìôÔÿÜ.?óÿwÝU/î§~)z‡þÚüÞÆÿÜÂiãÿŸG3ÿÿnüm‰£ïãkOž?ž)ï¼2ªos@0#º¾1ý-S³—C  m€Ze/T’šoãÿðpÊ^œþŽ©ÙÌ¡ Ї6@­²*I -ÙÞ¿Ì«ÿ¥¿ÌÇÔLæmh‚C VÙ •¤œ†çï’=~€ T÷FgÙãÓß05›9´šàШUöB%)§bÏF”ãìL˜áy+Óß/5»9´šàШUöB%)¯ñõ_ÍAÀ$£Øýyéo—šÝÚMphÔ*{¡’”Wïóœ=‚€ 2úÎgÓß-5Û9´šàШUöB%)±ÅÛFµî–ì1LˆîoÊ·ÔLçÐh‚C VÙ •¤Üg/ÎCÀßtnú{¥f?‡6@ÚµÊ^¨$åVìöœù¿» ´ÛÆ?5Ÿý^©ÙÏ¡ Ї6@­²*Iù¾{Lö(•÷ݹmÒß*5û9´šàШUöB%)¿î!oÉE@¢ÁWþ6ýRíÈ¡ Ї6@­²*I“Qù˳Ç ê­‹bùÓß(ÕŽÚMphÔ*{¡’4õÿ@ö8 /Ø-ý}RíÉ¡ Ї6@­²*IÒ’í£ÚpGöHšTŽ¢Øãùï“jMm€&8´j•½PIšœ†ç,ÍI@ƒFß=:ý]RíÊ¡ Ї6@­²*I“S±ËÏDŒúÙc hH÷ _N—T»rh4Á¡ P«ì…JÒd5ºü¨ì±4`üƒo¤¿Gª}9´šàШUöB%i²ê~ê³ÇЀþÑšþ©öåÐh‚C VÙ •¤É«¼uMöhjTÝSto—þ©öåÐh‚C VÙ •¤É«ÿÅ÷f& Fƒ“?œþ©væÐh‚C VÙ •¤ lñvQ­_›=ž€li!rh4Á¡ P«ì…JÒl×=øW³ÇLµÑ·Mç“*‡6@ÚµÊ^¨$Í~ãï•=ê`: ‹(vnúŸ´P9´šàШUöB%iöëø¦ˆªÊw0u†ç­Lß“2‡6@ÚµÊ^¨$µ£ñµ'g;˜*UqO+Ÿœþ¶'-dm€&8´j•½PIjGÝý~!¢*³GLÁ)Iד:‡6@ÚµÊ^¨$µ§ÑwÎy0Ê{®Î’íÓßô¤…Ρ Ð‡6@­²*Ií©»ÏK#ÊQöØ€‰×û줿çIuäÐh‚C VÙ •¤v5ºôðì±m|Ý)éïxR]9´šàШUöB%©]{¾0bÔÏ}0™Æƒè®zyú;žTWm€&8´j•½PIj_ËöÏ}0‘†ì–þ~'Õ™C  m€Ze/T’ÚW±Û³#†Eöø€‰²ñ¡Xùäô÷;©ÎÚMphÔ*{¡’ÔΆ_ß={üÀDéÿçéïvRÝ9´šàШUöB%©;?=ªþúì¡üá%Ñ™Û&ýÝNª;‡6@ÚµÊ^¨$µ·á9K³G ä«Êèôæô÷:©‰ÚMphÔ*{¡’ÔÞŠåOŒªswö€T£KK«“šÊ¡ Ї6@­²*IínpÆ¿dAHSõŒb·g§¿ÓIMåÐh‚C VÙ •¤–·ìqQ­ÿaö(€ƒÓþ!ÿNj0‡6@ÚµÊ^¨$ið•¿Í…иòÞ¢³t‡ô÷9©ÉÚMphÔ*{¡’¤Î’íç MzGþ~þÛœÔpm€&8´j•½PIÒÆúǼ;{@cÆ×ž”þ&'eäÐh‚C VÙ •$Í7·(Ê[×dD¨ß¨ݽ_’ÿ&'%äÐh‚C VÙ •$ý{݃%¢ª²Ç"ÔjðµO¦¿ÅIY9´šàШUöB%I?Þèªã³Ç"Ô¦¼çúè,Ý!ýNÊÊ¡ Ї6@­²*Iúñн^1dFXxU½Ã;ý NÊÌ¡ Ї6@­²*Iúé†kVgFXp£KO{“²sh4Á¡ P«ì…J’~ºb§§FÕ½/{<À‚©Š{£Øå™éooRvm€&8´j•½PIÒC58ã_³Ç#,˜þ Ls“&!‡6@ÚµÊ^¨$é![úبÖÝ’="`«o>?:s‹òßܤ È¡ Ї6@­²*Iz¸úÇýì [g<ˆîêW¦¿µI“’C  m€Ze/T’ô°ÍmåmßΓ°Å†ç.Ïg“&¨ª¸'û³ZÀ¡ P«ì…J’©Þ§3{LÀ)ï»qþO¤g¿±I“TÕ0ûÓZÀ¡ P«ÎâmÓ—*Iz¤Æ×žœ=*`³õŽx{úÛš4iŨŸýi-àШÕ×ô’&¼îª—G”£ìq ›ltùçÒßÕ¤‰knQDUež@ 8´jÕYñ¤üÅJ’¥ÑÅfKØ$Uï(v{vú›š4q-Ý!ûóZ¡ P«ÎÎÏÌ_¬$éQ*výÙ¨úë³G&<ªþ‰JO“&±bÅŽÙŸ'Ðm€Zuv{núb%I›ÒàôÊ™ðˆÆ7Ÿ¹mÒßÒ¤I¬ØýyÙŸ(Ðm€Z{½(}±’¤MjÉöQÞ}möØ€‡6,¢»÷‹óßѤ ­»ÿ벿R %Úµ*xCúb%I›ZgMxHƒS?šþ~&Mr½Ã'û3Z¡ P«îïH_¬$is_óåìÑ ?aüƒ ýÉ(éQêñ¿gª@K8´jÕûâ{Ó+IÚœŠ=^0ÿkx`bþdÔ>/M7“&½ÁÉÿ'ûkZ¡ P«þWþ6}±’¤Ímxβìñ ó_ýÿÒßˤihpöâìÏh ‡6@­g/I_¬$i³[ö¸¨ÖÝœ=Bh¹òÖ5ÑY¼mþ{™4.=,û“Z¡ P«ÁEû§/V’´%õþÓì @› »Ñ]õòôw2iZÿìì¯h ‡6@­Fמœ¾XIÒ–6¾ñôì1 @K NûÇô÷1išò[ʦ8´j5¾óªôÅJ’¶´îêWFŒ‡Ù£€–)×^äOFI›Óâí"ÊQö§ ´„C ^ýNtæå/X’´… /Ü;{’Ð&£~t÷}uú»˜4M{ý|ö— ´ˆC vŸ™¾`IÒ–V¬|rTîÌ¥´ÄàŒI“¦­ÞïÈþtqhÔ®8ðMé –$mMý>˜=Jh2JÚ²§ÿSöç ´ˆC v½ãþ,}Á’¤­jnQ”·~3{œ0ó2êUùoaÒ6ºì3Ù_0Ð"m€Ú .Ø=}Á’¤­­{à#ª2{¤0£gükú˜4­•·_–ý -âШÝè†3Ò,IZˆF—’=R˜Aã›ÏÎÜ6éï_Ò]U·I¢IDATT¶x»ùßЇ6@íÊïÈ_²$i*v~zT»³Ç*3¤ê=Åž/Lû’¦µî¾¯ÎþŒ–qh4¢³ó3Ó-IZˆúÇÿyöH`†ôûéo^Ò4×ÿò_gÆ@Ë8´Ñ=üíé‹–$-Hs‹bü½³²Ç*3`tÅòß»¤)otéáÙŸ2Ð2m€FôÏúdú¢%I Uwï—D »Ù£€)V­_ÅNOKë’¦½ò¾³?g eÚÝpZú¢%I Ùà¬OdV¦UUFïðßNã’¦½bןÍþšrh4¢ì­ sÛ¤/\’´`-Þ.Ê;.ϯL¡á»å¿oI3PÿèweÎ@ 9´Sì÷Úô…K’²î!o™ÿé#ØTåí߉ΒíÓß¶¤YhxÑ~ÙŸ4ÐBm€ÆôOúpúÂ%I Ýè⃲Ç+ÓbÔ‹î~¿þ¦%ÍJå}7fÕ@ 9´3¼ò¸ô…K’ºbåS¢zðöì Àœò‘ô÷,iVê®zYö' ´”C 1eo}lX¼]úâ%I ]ÿ˜÷dX&ÜøÆ3¢3·(ý-Kš•§þ]ög ´”C QÝC=}ñ’¤:_{röˆ`BUÅ=Qìöìô7,i–ßxzö§ ´”C QƒówI_¼$©ŽŠ=_1èdY&Pïóÿ-ýýJš¥ŠåOŒõ²?m ¥Úß~Eúò%Iu58í²Ç,ftÉÁéïVÒ¬Õ?ö}ÙŸ6Ðbm€fUUtöxAú&Iµ´x»(o»4{Ò0!Ê;¿eË·’f¬ñµ'eÞ@‹9´×?íÓ0Iª«îoŒ(ÇÙ£€lƒNtW¿2ý½JšµŠ•O‰õ³¿p ÅÚ¯½$} “¤:®Y•=jHÖ?þÏÓß©¤Y¬ÿ¥¿Èþ¼–sh¤(özqú"&IuU,bT÷?{ÔdôíO§¿QI³ÚøÆÓ³?q åÚ)úg~<}“¤:ëòÖˆªÌ·4¬¼ëªè,{|úû”4‹{À£rhL¬þIÎ_ê$©ÁzGþ^DUe_Fýèü+éïER›œù±ì/`“8´&VÕ½?:;==}±“¤&^¸Oöøh½þ‰ÿ+ýHjSÝU/‹õ²?}€MâИhÃKM_î$©Ñ–îå—g_€Ö}Û»´ÔhsÛÄø– ²?}€MæÐ˜lUÝÃÞ–¿äIRƒu÷}UİȞÀ­S®½hþ¡²ß‡¤658ùÿdú›Å¡ 0ñÆ÷~/6,}\ú¢'IM68ùÃÙã Uª~Å®ÏJ’ÚT±Ç ¢ê¯Ïþü6‹C`* ¾¾Gú²'IM7¾æÄìñ Ð Õ`Ct÷]ú{Ôº?uÓ9ÙŸ?ÀfshL‡rÅoÎ_ú$©ÁŠŸÕƒ·eO`€ÙV•ÑûÜM ’ÚÖàkŸÌþú¶ˆC`j”÷}?:ËwL_ü$©ÉzŸþÍùÇê18ýŸÒ߀¤¶Õ=ðMãaöç°EÚSexééËŸ$5Ýðë{d_€™4ºÌ›³ÔtÅò'Fyï ÙŸ?ÀshLÞß›¾JR£-Ù>ÊÛ.Í¿3e|óyóï.éo?R›š[£«OÈþü¶ŠC`êT½¢³çÏå/ƒ’Ô`ݽ_UÿÁì 0ªûoŠb—g¦¿ùHmkpÖdz?€­æÐ˜Jãµdž%;¤/„’Ôdý/ýeöø˜zUo]tW¿"ý­Gj[½ÏünD9Î[Í¡ 0µ†—™¾JRÓ.ûLöø˜^å8zŸýƒô7©m{¾0ªâžì ° ÚS­Ò‡Ó—CIj´åOˆò®«³Ç/ÀTœìMYjºbÅ“¢¼ãŠìÏ`Á8´¦ÛxÝC=}I”¤&ëîûêˆa‘=¦ÊpÍêôw©u-yLŒo<#ûóXPm€©W>xGtöxaþ²(I Ö?áf_€©1¾á´è,Þ6ýMGjUs‹btÙÙŸ?À‚shÌ„ñWGgåSò—FIj°Ñ¥‡g_€‰WÞye+Ÿœþ–#µ­ÁÙK²?€Z8´fÆè¦óbÃ’íÓGIj¬eŸ(à¡Uë×F±Çóóßq¤–Õ?ñCU•=jáИ)ÃË?&`”¤¦ê®~eTƒ Ùã`âT½¢»ß/¤¿ßHm«ü"ª2{ÔÆ¡ 0sߨ+}‰”¤&ëû¾ìÑ 0YFýèö¶ôw©mõ~WD9Ξµrh̤Á×÷H_&%©É†kVe^€ÉPUó¿Q#û½Fj[½Ïüîü‘À¬sh̬þYŸH_*%©±–<&Æ?øFöèH78íóßj¤–ÕûÜud´†C`¦õOÿ—ôåR’šªØõYQ=x[öèH3üÖéo4R+ÿ´ýx˜ýù4Æ¡ 0û¿"ÔO/HjQ½OÿfD9Êž¾]ùÅèÌm“þ>#µ©þIÿ;¢*³?€F9´ZapΊôeS’šjã¯Gh“ñÍçEgééï2R›œñ¯ó?ð Ð6m€Ö\t@løä¢ôÅS’jonÑüOp´Ay×ÕQìôÔü7©--Þ6†ßÜ7ûÓHãÐh•á¥Gùmó—PIª¹bÅŽóL³¬Z¿6Š=žŸþ#µéÝq|ý©ÙŸ>@*‡6@ëŒn<#:+ž”¾ŒJRÝu÷yiT½uÙc U}t÷]úŒÔ–ŠÝžåm—fúéÚ­4¾ã»ÑÙÝO9HšýzŸýƒˆªÌ» kÔÞaoK{‘ÚR÷à_‰êÁÛ²¿|€‰àÐh­rýíQ|êéË©$ÕÝàÌe\€…SŽ£Ì{Òß\¤¶4øÊßFŒÙ_>ÀÄph´Û ˆÞß›¾¤JR­Í-ŠÑ•ÇfO\€­WUÑÿò_ç¿·Hmhùbtù粿z€‰ãÐ`ã½ÍšÕ±añcò—VIª«åOˆòŽ+²Ç-ÀVœöùï,R ê®~E”w^™ýÉL$‡6ÿf¼ö’èìñ‚ôåU’êªØó…Q÷d[€-2ÿÇQuîÊþܦ‚C€‡1¾óê(ö}úr+Iu4ºøÀì1 ð¨Æ×|9:‹·KK‘fµb×gÅè;GfêSÅ¡ À#ö£ÿÕˆ sÛ¤/»’´ -yLŒo:'{Ê<¬ñ §EgÉöùï(Ò,6·(ú'~(ªÞºìO`ê8´ØãµG±ßkó_IZÀŠŸå}7fX€ÿd|ËÑYöøô÷iëî÷šßòõìÏ`j9´ØTãQ .Ü':Ëž¾KÒBÕ]ý ?µL”òŽË£Øé©éï&Ò¬Uìô´®YQ޲?s€©æÐ`3•÷}?ºGþ~úB,I UïÈß‹(ÇÙã Ê»¯‰bçg¤¿—H3Õ’ícpÚ?ú;€âÐ` n8-ŠÕ¯Ì_%iœúwÙch¹êþ›¢Øý¹éï$ÒÌ4·Mô}¿?°ÀÚlퟓºè€èìôôü…Y’¶²ÑÅeOU ¥ªo‹îÞ/N‘fæÀæ˜÷Dy×ÕÙŸ6ÀLrh°ÊîºèŸù±è,bþ-I[Úâíb|ÃiÙ#h™êÁÛ£»êåùo#Ò,Øý®(ï¼2û³˜imPÙ¹7ú_[å;æ/Ô’´+vŒòŽË³Ç)ÐÕ†;£»ï«ÒßD¤©néÑ?þQÞ}Mö' Ð mjPn¸;ú§ý“ßp#i*+öxþü¯k¨SµáŽè®~Eú[ˆ4­»=;†çíU÷¾ìÏ UÚÔ¨ê=ƒ v‹ÎîÏK_¸%isê~ê#ì1 Ìòo²YýÊô7iêZ¼môŽüý]u\Äxý)´’C€&Œ‡1¼üóQ|ê—ò—pIÚÄzŸû£ˆrœ=A€ãÏEI›_±×ÏÇðÜåQ=pkö' Ðzm6¾óªèŸþ/ÑÙéi鋹$=Zý“þ&{l3¤êÜÝý^“þæ!MCÅÎψþ‰Šñ-_¨ÊìÏ€ãÐ Ë ˆáeGF÷Ð_ °°KÒÃ5\³*{b3À‘ôè{¼ §~Ôq Àsh0Êu·ÆàÂ}¢{ð[ÝH𼿶‰Ñ•ÇfJ`êl~!ÿCš´–>6zG¼=†ìåmߎ¨ªìÏ€GáÐ`”÷߃¯ïÝCÞæ¶Í_ò%icKã›ÏË‘ÀªŠ{¢»ÿkóß7¤ ¨X±ãüaÍàìÅ1þÞ™Ãnö' Àfrh0ÁÊîº^y\ô¾ôWÑÙýyéÿ ©Ý+ŸåWfF`ŠTŽÑÝÿuéïRJËŸÝßý/ÿU /Ú?ÊÛ¿Q޳?K¶’C€)2¾ëš^rhôŽÿŸQìó²üIÔºŠÝŸÕúµÙ㘖#›^Ÿþž!ÕÚ’ÇDwïGïðßùÑAÍy+c|õ—¢¼ï{U™ýP‡6S¬ÜpwŒ®9)ú_›‹Þçÿ$н^>¹(ÿ_,$ÍtÝý^Uo]ö&YUÅàôžÿ9ÒÔuäïEÿ˜wÿ¨>ƒ“?ƒ¯}2†î£ïãëN‰òÖoFõÀ­~C @ 9´˜5ýNŒ×^Ãoö£œãþ,º‡üÚüŸžr„#i¡êúÃ^öĈ&ý_Hìò¢'ŠÕIEND®B`‚‰PNG  IHDR´´=Í2 pHYsèèµ{Rk«IDATxœíw”ÕÅÇC±Ähb#ßšˆî„TÎ)É}{º_qjõ0i&Ú»¬g’‹\“üVžÂ[T”Ü‹´ÿD;k¿oÈèK¸¾X©‹Ä`Ã4ö¨;’{eoPלIï¿“‹|4îŒgAXý~”Ì?/~,éZ2*à[`÷º„\fŒ3þ~©.ç¥ýÛE—Ë &;w,€TnSr¡í·‚Hu8+½ÿ8ïTˆv-§®1“a¼’çè…zcú…öçvÌt-ðm°z\h–Ðö «¢º´ áº) §Õë©jÉ(‚3òv3„æt ïÛ’ø4ŠÄ…¶ºÏ¶™¼Ïê-4N+d˜£Äö>°:ž¥§ÐÎ_Ö|†9ŠÿA'=…w,¬ù SƒoÕõ<½„æ£3Sþünz ny¯ÖÄd9^ ¬Ngë!´=ðJÈj¢¢Ï>–S(ƒeƒå9#ÞºÄà2¥`É@7L•ó†³oN®B‡k'AVᥠüxx%ÏË88×»®µÂ£”óÖ¬ ±s²‰Øú R­ÕÚêr.@èƒñÄ„›gƒ;þ¾´-á· N“ vâýÛ [p‹S[h¼qn4Q(¦vïK“€ö-dK‡lx í^¥¶ÐÑž5`*á–9`÷ùnF@BÏ‹!ª\ ¦ã ¾FM¡ñüÑDb÷¸S¥Y#—×Üøåj6©QQhaO0qBÝ÷û™ùâ½÷*˜Dlï…pS ø¥à ÿµšBGÕëÀ$ðç>“÷J¿PêY/ƒ–Deà—õwܽ$ë ë-´õÚ·À$¢ª•ô­bO¿¬èð«”oúSà¼~u½nc*#´[ü8˜B|°¬Î_#„“&·)„›f‚*Ä* X3¼™/€3ä:¥Zë6Jh\bcQο €Ú‚_¶øpÉÅq¸}þ‘S‡ íä¯2u-’:§‰<É7^òâ×%Έ[“íÖ¸U,Q_ÙVÞwW¨R¢BãŠ^ˆï–Ý*©‹_× léùàD{ÖB°|˜ìvdøiâí•Ús7˜n…A]øúÏWãC»t®$ŸFâ4_¾Ä¦˜tN°4¨±q'>P¿óÞ´ý1´Z¥«î†‚S:©‹Þ ä49öx<ôä&>þâ")¯|L¯ñyoŠJèxßVÐgدô¬žß{àÏdÿê÷’Ò^èܦúOõRdý"8B-¡± ¿î„§“œ#ÔBèŽ?¯+yÁ9B ¡qņî¸S!/8G¨!´7íIÐgðµäçE„žý è® ¡.8G¨!4žê6”¤.8G¨!t°d莲SE9y¡WŒÝÑñ‘7G$$ôÊÑ ;؃ºà¡ˆÐF¡Õ[jÅDB—ݱz\D^pŽPDèåÃ@wìþWœ#ú£! ;ÎÐëÉ Îj­Ã²ú/ÂsyÁ9B¡K AwÜÉ‘œ#Ô{"ë¶Ù¢.8G¨!4ö÷Õì²O]pŽPDè±ÚäRœ#ÔÛ?±e¯Eçz¡±£Žö„¾\I]tŽ çA˜€ÕýäEçz¡1±{t‡W­£S/¡£êõ ;î¤É‹Îj{ôéN¦·êåu…ö÷ÝáÞÂèÔKhìÚ©;ñäEç5„vFßÚÇ`u8“¼ðA/4n{fö «È ÏôBã.G¸7‰î¸“&/ÝÁ¾¨‚#×n*ÝÁ…¿ÔÁj·½Œh>ÃK²À„4Zh|0aΨßGÐ G6ð?èD>A/4÷.Ñpk)ù`p„B+Gƒöx)Hå6#Ž Ú›ö$˜€=ðJòáz¡ímÁ¼Y/“GÐ Ê;À·AwÂͳÉ„#j‚;–¹cî–Ûˆø {fPh|À²choÉi±Ô™± Ïçõ«Á›þ«ÇA|¸ê„¡Á™Ú_ð˜€3øòÁ5>yÍÁî{¸S… |8D{ÖÄQ­ãíZžY¡ñ§Á¼9yônX¬;¡øe½!Ü>¿A¢Ý«3+´Õí|0pû¸t/03/´ìy·L·¦–/qÇÝ#y2yÞ›N‚µi„6¡µ‰ÓIƒ%@g‚eoÐ펻Œ Áêt6¹ˆéJ¸n2èŒ?¯+ÐV ÁÜñ÷‘‹˜®D‹@g¼Y/щìV%‘Çäx ‘Lh|jd¾ V‡/“ËØØXÏ’+ÛuÆ|-ÐîÄ¿‚)¸“&²±q†ÞºƒœÈ„¶^û&˜Î󦲱ñJž­‰cùŒƒLhL’U2Jkÿ%X5t&Þ¿½ÎŸ51¡ƒ†‚)ø¥äR689§@œÚ:nœN/4ÎÊ2¹¹P^sz9³t~?¿;½Ð¦Lø?Š;éAr9³ñ !‚7È…Æà²Sˆ>Ý _§ÿüV;ûAwì~?TChnG0 ÷í?ÒKZxï> º»‡êu ITh{ÐÏÁ$äª ]ŽÒù­´™šÎIb‰ -¯°ï“ð¦ÿ“^Ö:Ä/-ð?è¬ÐòöÝ0‰Ø;,;úP [ë µiP«q†Ý¬–ÐÎèßiÈû¢9MÈÅ=i ZC´g-Aà@*¿¥ZBã¹¶Ø2 %w Ím*—U™BC6EM^hœ\¾aG«5_:·å#À$pŠ’B›4ûîBÜ·ÿ@/sAk7LÓ°{^¬¦Ð¸ÒØ”‹”ÿ# Áò™Ìv¿˜sÎ|Ñ®ò†Õ#B›ÔUéóÀGÌu☖䷒}4L=Px³ÿ­¶ÐÎ[w‚é`{,œLŸh-Û·mhã`,qÜ ÓŒ ]þuŸÆXWð"Ør]Z뇭¹üÒ¬¨aXǦ2´BãÓ«ùÝ ›Às[oö+`÷¿¢þ÷­ó[‚óær>LTµ² wÜ=zm÷þŽö‹5Jœª†pËð÷î3àN~HÞ!qÇÜîÄÀ›ú„”7X3áHgOCZªÕì«×˜mA2*4'›0Ìç_êF43-t6\2 $pe'T­„ÆxÑÞM ýÈŒÁK_o´_™Ú g™4`÷¾TO¡­‚Ó ¶>Mg9Í êØ]TI¡åQzÖKÔ5dT!pÀê~ÞBË£tªšº”Œfm ”Z¥Kž§®%CL|h—œ¼f„Ðø4,Þ¿º¦ !Ø ?Nºó¹4Bã\鱦¬'C½¢;ÍKÙìQ¿aÕ£‘GÁ툙,ÃK5xF]­Èâ¿°GÞF*´Ýÿ'r¢<“=¸Å%â’7¯+oAOR¡1x¥Ëda‚«æÃªU ¢½[è—åç·äGâY@| ¬Nç$7›þqFßI~”Æ}4tÝ’©¡'ÛÃ%ö+_>ò˜ÐaõF%z cë'ÆL¼©ÿHÌk@Ûšë0)4â/MÏóôF%·™Üׄ1‹`ÉÀädîtD{7×¼VЈ;ýir©±w\l泌;“áúwëÚŠ»ý†;ÊNx½„F¼²ÞòHI)µóæMrJ!£7QE™l„“ˆÌ}/?áÈü¹B#áÎeò1"¥Ônñ㙨9“Ñ'ËÀêpfúEîr.x‹Š‚“¯»<©ÐG +[òXEmàp~«ŒKí/ì•T½™Áfëö€¶rÃÌF§Ïe`½ÜiOB°i¦\ªUµ Í0ºÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3FÁB3`ÿå|ÛŒ â IEND®B`‚‰PNG  IHDRpTƒÎg pHYsèèµ{Rk IDATxœìÝwôeu}ïgEPQPc‰5Yšâ2±¥ÞK’ŸILûÅ´koúÍ/ê5¹Fî/Éw 3ÌÐ#]¤ H‘^ é]ÊÐû gŸ¾÷û·æ‹Å¦|÷~Ÿòx¬õü/÷&+žýÙ'^œï‹˜ƒ^ º>ú×Ý3¿í#~7нÞ­%¯ˆÖ¼HRõ÷}oT­G³O€ Ö;oaúÝŠ$MTK^ÅÞ?í#~/ºgmýkŒáÃ7D ûÙG>Р5ùß hP9ˆáýWEïÒ/F縿ˆbïŸÖÂç‘4[çÀFÕy2û¤Øh½³ÿOú‹$M|‹^2ûÏx:Çÿeô.Û+†\=ûÏ€€ÉdÀ“¢×ŠÁ·ÏŠî¹ £}ðG£µxëü/’ÖYçðߎ跳O €MÖ;ýŸÓïZ$iêÚáeÑ>ø×f iðí³#zEöë˜#0ÆÊ'îˆþûGû+¿­E[æaô‚uý3?yLŽªŠÞ)ÿ”~ç"ISÝ¢-gÿåÞÞËcxÿ•Ùo`pÀ8)1¸ãÜèžüÑÚí­ù_$mP½¯ÿcDUfŸ$s«ª¢{Òߦ߽H’ž©ØýíÑ=åÓ1¸ëå0û-luå0w_ÝS?­^—þÒ—´qõÎÚ>û4¨wÄñµ¿K¿ƒ‘$=«·‹ÎI7ûÏšÖžÕÀh3à€5|ä¦èžñÏÑÚù ù/wIß̼è_´kö‘P¿rÝcþ4ÿ>F’´îvyStÏüB ½5û<%½"úWí~9ÿ%.iÓ[°Y ®:0ûdhN9ˆîQ˜/#IzîfæEûÀEÿÚ##úì7ð} 8` ¹yöo‘µ–l“ÿÒ–47-Ø<ו}¼4o؋ο“?#IzávÜ6º§}.†;ûíp@®µo¬sÔ'fÿ-ýô´¤¹ká‹cpÓ ÙG @îˆãðßο§‘$­_3ó£ý•ߎÁÊ‹²ß 0Õ 8 iå07ŸÅþ¿ÿ2–4÷-zI o99û¤È×oGçàäß×H’6¨bŸ÷FÿšC#†ƒì7 LhJ9˜}Ù»¿=ýÅ+©¦vØ:†wž—}ÚŒŽ^+:~0ÿÞF’´Á+~"ú×QUÙo˜P·²œ}¹+Þ™þ¢•T_Å/‹á]çgŸ8£9âøò¯¤ßßH’6®â‹?õÌ£,³ß(0ñ 8 Fƒ›NŒbÏw¥¿X%Õ[±ã«¢¼ÿŠì#`dU'£½ßûÓïq$I_±ßbðí³²_)0Ñ 8 ÃGnŠö!¿‘þ"•TÅò×FùеÙÇÀÈ«ŠÇ£½çO¥ßçH’6­öÁáÃ7d¿V`"pÀ*[E÷ÔÏDkÁfé/OIõWìô#Qú’ °Þª§îb··¦ßëH’6±…[Ìþ3±²½:ûÕÅ€æÂ ½‹vÖ’Wä¿0%5R±ë›£|üöìÓ`ì”ÞÅòפßïH’æ å¯þ•_ލªì× LØDåC×D±ïûò_’šokµúîì#`b n<Þ¿$'IV±÷ÏÆðþ«²_10– 8`CôÛÏüêÆÌüô—Ÿ¤Œ_Þ¸+û˜8ƒk‹Ö̼ôûIÒ¶`óèž»0b8È~ÍÀX1à€õ4|øÆ(özwþ OR㻽Åx Fý –¥ßI’æ¾bÿ_ˆò –Ö—¼²ŒþûGkñVé/9IÍg¼ЌޙŸO¿ ’$Í}ÅÒm¢í‘Ù¯ ð<ÊÖcÑ>ôcé/6I9µ÷ø±¨ž¼7û(˜UÝ>•~'$Iª§Î×þ>¢ßÉ~ÛÀH3à€ç0|àêhíöÖô—™¤œŠÝÞÕ껳"€éR£{Ô¦ß I’ê©Øç=Q®r÷ÏÅ€Ö¡ÿ­C¢µø¥é/1I9µ÷øñ¨žº/û(˜NývtüÕô;"IRM-{M îþFöÛF’|¿a?ºg~!ÿÅ%)­b×7ûå €dU÷©hïûÞô»"IRM-Øû•© 8˜Zýk¾­›ç¿Œ$¥U,}e”\•}°×­™yéwJ’¤zïí‡÷^–ýÊ4L¥þ7÷ÖÌüô—¤¼ÖþìfyÿÙÇ wÞ‚ô{%IRý÷÷ƒ•g¿r …S§wÁNé/IÉí°u W^˜}°¡ª*º'|*ÿ~I’Tÿ=þ·ÏÎ~ë@ã 8˜*Ýsgò_8’r3ÞoÃ^tþHþ=“$©Þ¿4·žýÖFp05ºç.ÌÑHÊmÑ–1¼óÜìã€MTužŒöž?ß$Iª·E[Æà÷úL¦Bïâ=ò_0’r[°Y n<.û8`ŽTOÝÅ.?šï$Iª·Å[Åà_;Ð&^ï²½ò_,’r›™ƒëŽÌ>Ž˜cåߊb‡—åß?I’j­XºM øVökjgÀÁDëëÙp›ýR‘”ØÌ¼\±_öq@M†·­›çßCI’j­Xþš>rsökjeÀÁÄÜtâìŸLÈ~™HÊ­Ñ.ÙÇ5\±ú=”$©v}K”kÌ~í@m 8˜HÃû¯ŒÖ[ç¿D$¥Ö;w&û8 !½³¶O¿’$Õ_±Ï{#ºOg¿v LœrõÝÑZþÚô—‡¤Üz§|:û8 IUÝãþ<ý^J’T¯þßå0ûÍs΀ƒ‰RvžŒbÏw¥¿4$åÖ=þ/#ª2ûH iÃ^tþHúý”$©þºgmŸýÖ9gÀÁäô¢}ЇÒ_’rëõ «[€)VµŸˆöŠw¦ßSI’ê¯ÕAÙ¯˜SLŒî©ŸIIHÊ­sØÇfÿ- ¦[µêÎ(ü©mIšümÃû¯Ì~íÀœ1à`"ô¯9<ÿ!)µö—~!¢×Ê>Žå½—FkÑKÒï­$IõVìþ¶(‹Ç³_;0' 8{ïÖ[§¿$åÕÞó§¢òå €g\ó•ô»+IRýµûM^‰`ÀÁX+‹'¢Øýíé/Iy»ühT«WfGŒ¨Þ™ŸO¿Ã’$Õ_ïü²_9°É 8kíÃ'ýe )¯bÙvQ>zsöQÀ(+‡ÑùÊo¥ßeI’jnÁf1¸ëÙoØ$Œ­Þåûä¿$åµx«ÞsIöQÀ¨ºk¢½×»òï´$Iµÿj÷Ú_ð‡qeÀÁX>rÓì?¼Í~ HJjá1¼íô죀1R­º+Še¯Î¿Û’$ÕZç¸?Ï~åÀF3à`ü zQìûþôÃ_RR3óbpõ¡Ù'chx÷ÑZøâü;.IR­õ¯;*û•Å€ƒ±Ó=ãó釾¤¼ú—ì‘} 0Æú—ï~Ç%Iª·bé+£\}Oö+6˜ce°ò¢hÍÌO?ô%åÔ;çß³!&@÷äH¿ë’$Õ[ûðg¿n`ƒp0>ú(VüDúa/)§î‰QUÙ'“`ØÎAJ¿ó’$Õ[ÿÆã³ß8°A 8Ýsþ=ý—”Sç°ßŒ(ÙǤj?í=~<ýîK’T_Åί²½:û•ëÍ€ƒ±0|èºh-|qú!/©ùÚû¾/ªÞÓÙǨ|ôæ(–n“~&Iª¯î©ŸÉ~ÝÀz3à`ô•Ã(öÿ…ôÃ]Ró»¿-ª§Ê>…˜`ÃÛNÖ‚ÍÒïÂ$I553?†÷\šýºõbÀÁÈë]¾OþÁ.©ñŠeÛEùØ­ÙGS Áòôû0IR}µ÷ÿ¹ˆ²Ì~ÝÀ 2à`¤•ÅÑÚq»ôC]RÃ-~i ï¹8û`Štûdþ½˜$©¶úבýªdÀÁHëžúÙôÃ\RÃÍÌÁM'd?L›A'Úûÿ|þý˜$©–Š]~4¢×Ê~ÛÀó2à`d ¹9Z ·H?Ì%5[ÿò½³¦Tµæ(v~Cú™$©žzÿ¹,ûUÏË€ƒ‘Õ>ôc釸¤fëµ}öÑÀ”+ï½,Z _œ~W&IšûŠ%/r̓ٯxNŒ¤Á·ÏN?À%5[÷ØÿQUÙÇDÿÒé÷e’¤zêöÙì× <'FRáï JSUçËÿ-bÐÍ>zà{ºÇÿeú½™$©†må“÷e¿f` 89ƒ[¾žpKj¬b÷·GÕz4ûè€ÔkE{¯w¥ßŸI’æ¾ÞéŸË~ËÀ:p0ZÊ2Š}ߟ~hKj¦bÇm£|ìÖì“Ö©|üö(–n“~&IªáW8žº?û5?Ä€ƒ‘Ò¿á¸ü[R3-Ü"†wž—}ìÀóÞrr´fæåß§I’æ´Þÿ;û?Ä€ƒÑúõ=ý4ÍÌ‹Á5‡eŸ:°^zgmŸ§&IšÛo¥?ñΈ1à`d n=5ÿ –ÔH½sg²XUC#ý^M’4·õÿsiö~€#£}ЇÓiIõ×=ú"ª*ûÈ€ RG±Û[Óï×$IsW±ó"ÝìW |#¡|èCPš‚Úû} ¢_d9°QÊû¾­E/I¿g“$Í]ƒë¾šýzï1à`$tŽù³ôÃYR½»¿-ªÖ#ÙÇ l’þ7÷M¿k“$Í]íýÞŸýjï1à ]¹úžh-Ü"ýp–T_ÅÒWFùè-ÙÇ Ì‰îñ™~ç&Iš»†÷\šýjY¤ëžýo釲¤[°Y o;-û¨€¹3èD{ß÷æß½I’æ¤î‰ýfYäö£µóÒeIõÕ¿lÏì“æ\µze˶K¿“$mzÅ/‹²»&ûÕäÜtRú,©¾º'þUö1µÞzj´fæ§ßÃI’6½Á5‡e¿VÀ€ƒ\í¯üVúa,©ž:_þ•ˆa/û˜€ZõÎI¿‹“$mzƒ?’ýJò”«ï‰Ö‚ÍÒcIs_{‹ªx<û˜€úUetýô;9IÒ&63?ÊUwe¿U˜r¤é¿8ÿ –4çK^å#7e1ИªõH;¿>ýnN’´iõ¿±$û•”3à MñÅŸL?„%Íq3ócxë)ÙÇ 4nx×7üê´$yí}~6ûu”3à Åð¡ëÒ`Is_ÿâݳHÓ;çßÓïè$I›VµêÎì× SÌ€ƒݳÿ-ýð•4·uOøTöѹÊatúpú]$iãë_²GöÛ„)fÀAŠbO?|%Í]/ÿ·ˆa/ûh€tÕ“÷F±l»ô;;IÒÆÕùò¯d¿J˜b4nxÿU鯤¹«ØùõQ­y ûh€‘1¼í´hÍÌK¿»“$mD3ó£zú¡ìW SÊ€ƒÆuý @irZ´e”÷}3ûX€‘Ó;ýsù÷w’¤jpõ!Ù¯¦”+öyOú¡+in\u`ö‘£iØöþ?Ÿ~‡'IÚðºÇýyö[„)eÀA£Ê§žýÙ¡ìCWÒ¦×;åÓÙG Œ´ò‰;¢XòŠô»>`"õ/Ü9ýþO’ôü;¼,¢f¿2˜"4¢{Æ?§°’6¬µ‹¨IUFç ¥ßJ’ž¿jÕÙo ¦ˆhüÑôÃUÒú×^ñΨºOe0Ѫ§î‹bÇW¥ßJ’ž»ám§e¿.˜"4¢µì5釫¤õÿ9°ò‘›² ˜ ƒ«M¿”$=wýKöÈ~U0E 8¨]ùÔ髤õopÃ1ÙÇL•îÑœ~/(IZwÝ“ÿ!û5Á1à vƒÛÏH?X%­_½3þ%ûÈ€©SµWE±ë›Òï%I?\ç e¿&˜"Ô®wѮ髤®óå_‰ö³ ˜Jõÿ2ä̼ô{BIÒVìôºìWSÄ€ƒÚuNúÛôƒUÒ ù¨Ö<˜}\ÀTëòOéw…’¤g53/bÐÉ~E0% 8¨]ûàæ¬’ž»™ù1¼ãœì£t¢½çOçßJ’~ jÕ]Ùo¦„µ+vÿ±ôCUÒs×?qö1|GùÀ·¢µðÅé÷†’¤ÿjxÏÅÙ¯¦„õ*‡ÑZô’ôCUÒºëôáÙçýo,I¿;”$ýWƒŽÍ~50% 8¨U¹úžôUÒº+vú‘¨Ö<˜}LÏV•Ñ9ðƒéwˆ’¤gê_º"ûÍÀ”0à Vƒ»/H?P%­£™ù1¼ãœì#xÕª;£Xòòü»DIRôÎÚ>ûµÀ”0à VýëŽJ?P%ýpýóeÀ \y@ú]¢$éEÑ=éo²_ L jÕ»l¯ôUÒÖ9èCå0ûxÖC÷¨?L¿S”¤i¯{ÌŸf¿˜Ôª{îÂôUÒUìô#Q­y0ûhÖSÕz4Š^—~·(IÓ\çðg¿˜ÔªûõJ?P%}§™ù1¼ãììcØ@ÃÛψÖ̼ü;FIšÒ:þjö«€)aÀA­:Çüiú*é™úç/Ê>€ÔýÚߥß1JÒ´ÖÞ÷}Ù¯¦„µjòë骤Eç G”Ãì#ØHUïé(v{kú]£$McíïÈ~ 0% 8¨U±ßÒTiÚ+–½:ª§îÏ>€M4¼ãJE’*v}sö+€)aÀA­Š½Þ~ JSÝ̼Þüµì£˜#þ”Š$5ŸM1à VÅŠw¦¨Ò4×;õ3ÙÇ0‡ªîSQìú¦ô»GIš¦ŠÝÞ’}ü3% 8¨Uk··¥¨Ò´ÖÞë]ývö1Ì1JE’š­Øí­ÙG?S€ƒZµv~cú*Me‹¶Œòáë³ &Ý>•)ISR±ûÛ²}¦„µj-{uú*Mcƒ+È~ü€U'£ØåGÓï"%i*v{ö±Ï”0à V­%Û¤¨Ò´Õ=êÙ>ЀáÍ_K¿”¤i¨½ÇeùL jÕZòŠôUš¦Š]ßUû‰ìGhH÷Øÿž~/)I“žM1à VRƒÍÌá]ßÈ~ì€UÅãQìô#ù÷“’4ÁpÐjeÀ!5WÿüÅÙ<`pãqé÷“’4ÉpÐjeÀ!5Sû€_Š(‡Ù<¤{Ô'Òï)%iR3à )ÔÊ€Cj ¶ŽòñÛ³w QU<Åò׿ßWJÒfÀAS 8¨•‡Tƒoœý¨#`pÝWÓï+%i3à )ÔÊ€Cª·Î‘¿Ÿý˜#¤óÕ?H¿·”¤IË€ƒ¦pP+©¾ÖþbÕz$û1FHµæÁ(vÜ6ýþR’&)šbÀA­ 8¤šš™ÃÛNË~Ä€4¸úÐü;LIš  8hе2àê©wêg²o`„uŽü½ô{LIš” 8hе2àæ¾ö2¢ßÎ~¼€V=u_îè%iN2à )ÔÊ€CšãnåýWd?ÚÀè_¶gþ¦$M@4Å€ƒZpHs[ÿ‚åÙ50.ª2Ú_ú…ô{MI÷ 8hе2àæ®Î¿Q³k`Œ”|+Z 6K¿ß”¤q΀ƒ¦pP+iŽZ¼U”ßžýHc¨wúçòï8%iŒ3à )ÔÊ€Cš›ú—ïý8ãª×Šb··¦ßsJÒ¸fÀAS 8¨•‡´éuþHDUe?ÎÀÞtbú]§$k4Å€ƒZpH›V±äQ­^™ý( säï¥ßyJÒ8fÀAS 8¨•‡´i ®:0û1&Dõä½Qìð²ô{OI· 8hе2à6¾Î!¿îO§sªñnéwŸ’4npÐjeÀ!m\ÅÒWFõÔ}Ù00iÊa´÷yOú¨$S4Å€ƒZpH×àÚ#²_`B•÷_­›¥ßƒJÒ¸dÀAS 8¨•‡´áuŽü½ìG˜p½Sþ)ý.T’Æ%šbÀA­ 8¤ «Xöꨞ~8ûÑ&\Õ}*Š]Þ˜~'*IãM1à VÒ†5¸á˜ìǘƒŽM¿•¤qÈ€ƒ¦pP+iýëñ;Ù,0e:‡<ýnT’F=šbÀA­ 8¤õ«XºMTOÝŸýÈS¦Z½2Z;l~G*I£œM1à VÒú5¸úÐìǘRý –§ß‘JÒ(gÀAS 8¨•‡ôÂuþhDUe?®À´*ÑÞûgÒïJ%iT3à )ÔÊ€CzþŠ%/Ÿý‰B€LÃ{.‰Ö̼ô;SIÅ 8hе2àž¿þ7÷Í~LfuOøTú©$b4Å€ƒZpHÏ]çÀ_õ§S€‘Q=ýpK·I¿;•¤QË€ƒ¦pP+é9ZüÒ(¿=ûøý‹vÍ¿?•¤Ë€ƒ¦pP+iÝõ/Þ-ûñøaÃ~´¿øéw¨’4JpÐjeÀ!ýpíý.¢f?žë4üö™é÷¨’4JpÐjeÀ!=«›Gùà5Ù&Àóêù{ù÷©’4"pÐjeÀ!ý`½sg²K€T­º3Z‹¶L¿S•¤QÈ€ƒ¦pP+é¿j¯xGÄ “ýX¬—Þ¹ÿ‘~¯*I£M1à VÒwš™Ã;ÏË~$Ö_¿ÅnoÉ¿_•¤ä 8hе2àž©{òÿÌ~6Øàú£ÓïW%);šbÀA­ 8¤E±óë£ê¬Î~6Jç §ß³JRf4Å€ƒZpH/ŠáM'f?Š­|äÆh-Ø<ý®U’²2à )ÔÊ€CÓ^÷¨?Ì~ 6Yï”O§ß·JRV4Å€ƒZphš+–nÕS÷g?†›¬j¯ŠbùkÒï]%)#šbÀA­ 84Í ®< û˜3ƒ+öO¿w•¤Œ 8hе2àдÖ9ðƒU•ý̪Œö~H¿•¤¦3à )ÔÊ€CSÙ¢-£|ì¶ìÇ`Î ï¹$Z3óòïa%©Á 8hе2àÐ4Ö;oaö£P›îqž~+IMfÀAS 8¨•‡¦ò>èd?zµ©ž~8 ÷ÿ’¦(šbÀA­ 84m o?#û±¨]ÿÂÒïc%©© 8hе2àÐ4ÕItâ IDAT=êÙ@3(v{Kú½¬$5‘M1à VššoÕê•Ù@cב7+I dÀAS 8¨•‡¦¥þE»f?nͪªhï÷þôûYIª;šbÀA­ 84 µ÷üéˆa?ûqhÜðîÿL¿£•¤º3à )ÔÊ€Cß̼Þu~ö£¦sÄïæßÕJRpÐjeÀ¡I¯{§²3€Tåc·Fkáé÷µ’TW4Å€ƒZph’+–nÕš³3€t½¯ÿ?éw¶’TW4Å€ƒZph’ësßìG `$T­G£ðÏ$Mh4Å€ƒZphRkï÷þˆªÌ~ÄFFÿ?wL¿»•¤:2à )ÔÊ€CÙ̼®¼(ûñ-ýv»¾9ÿW’æ8šbÀA­ 84‰uÿ‹ìG `$ ®>4ýW’æ:šbÀA­ 84i;¼,ª5d?Z£©*£½ïûÒïr%i.3à )ÔÊ€C“Vÿ‚eÙÀHÞõô»\IšË 8hе2àÐ$UìþöˆA'û±y¯üVú®$ÍU4Å€ƒZph’Þ|Rö#0ÊGoŽÖ‚ÍÓïu%i.2à )ÔÊ€C“Rçàd?Nc¥ûµ¿O¿Û•¤¹È€ƒ¦pP+MD 6‹òáë³'€±Rµ‰bÉËóïx%i3à )ÔÊ€C“PïÔÏd?Jc©þ¢ô;^IÚÔ 8hе2àиWì¸mTÅãÙÀxê·£ØõMéw½’´)pÐjeÀ¡q¯ùÞÙÀX\u`ú]¯$mJ4Å€ƒZphœkïõ®ˆrýŒ·ríïL¿ó•¤Í€ƒ¦pP+sÃÛÏÈ~„&Âàú£Óï|%ic3à )ÔÊ€CãZç g?>“£ª¢½Ï{Òï~%ic2à )ÔÊ€CcÙÌü(¸*ûñ˜(Ã[OÉ¿ÿ•¤È€ƒ¦pP+cÝãÿ"ûјH?˜~,IšM1à V»mÕê•ÙÀD®¼0ÿX’60šbÀA­ 84nõÎÚ>û±˜hC~=ý.X’6$šbÀA­ 84N;¾*ªöÙ ÀD+ï¿2Z3óÒï„%i}3à )ÔÊ€CãTÿÒÙ ÀTèùûéwÂ’´¾pÐjeÀ¡q©Øýmƒnö#0ÊGnŒÖÌüô»aIZŸ 8hе2àи4¸áØìÇ`ªtûdúݰ$­O4Å€ƒZphjïÿsU•ý¸L•jÕ]ÑZøâô;bIz¡ 8hе2àÐ84¼û‚ìG`*uOþ‡ô;bIz¡ 8hе2àШ×9ì7³€©U­y Z‹_š~W,IÏ—M1à VéfæEyß7³€©Ö;ýŸóï‹%éy2à )ÔÊ€C£\÷è?Ê~D¦^U<Å’—§ßKÒseÀAS 8¨•‡F¶›EùèÍÙk…ãÜ™ü{cIzŽ 8hе2àШÖ=ñ¯²¾£ê<ÅŽÛ¦ßKÒº2à )ÔÊ€C#ÙÂ-¢ZugöãÀ÷é_°<ÿþX’Ö‘M1à VÅz§|:ûÑàÙúí(vycú²$=;šbÀA­ 84r-Þ*ª5f?¬Cÿ²=óï‘%éYpÐjeÀ¡Q«wöÿÉ~,x.ƒN;¿!ý.Y’¾?šbÀA­ 84JK·‰ªýDöcÀóè_¼{ú}²$}4Å€ƒZph”êcIö#À éQ,mú²$}7šbÀA­ 84*Ë^UïéìG€õпh—ô{eIún4Å€ƒZphTê_°<ûq`}õZQ,Múݲ$­Í€ƒ¦pP+BŲí¢ê®É~Øýÿ\š~¿,Ik3à )ÔÊ€C£ÐÚ/ùŒ—ªûT;¾*ýŽY’ 8hе2àPvÅÒWFÕYý(°zç-L¿g–$šbÀA­ 8”]ÿüÅÙ©ê<9û/êeß5Kšî 8hе2àPfÅÒm¢j¯Ê~ ؽsþ=ý¾YÒtgÀAS 8¨•‡2[ûÓzŒ·ªx<Š%/O¿s–4½pÐjeÀ¡¬Š%¯ðë¢wÖöé÷Î’¦7šbÀA­ 8”UïÜÿÈþø0Gªâ±(vxYúݳ¤éÌ€ƒ¦pP+e´öKüÚ/óLŽÞÿ’~ÿ,i:3à )ÔÊ€CõÎþ³?ú̱ê釢µø¥éwÐ’¦/šbÀA­ 8Ôx;lí×7&Tï´ÏæßCKšº 8hе2àPÓõNÿ\öÇ€šTkŒÖ¢-Óï¢%MW4Å€ƒZp¨ÑnÕê•Ù{jÔûú?æßGKšª 8hе2àP“uOøÙyjV=yo´¾8ýNZÒôdÀAS 8¨•‡kf^”ܘý‘ Ý“þ6ÿ^ZÒÔdÀAS 8¨•‡šªsÄïfÜhHµêÎh-Ø<ýnZÒtdÀAS 8¨•‡šjxÏ%ÙwÔ=î“éwÓ’¦#šbÀA­ 8ÔD?˜ýQ aåC×Íþyíì;jI“ŸM1à Vj¢ám§eÔHÐ9ôÿJ¿£–4ùpÐjeÀ¡ºkïýÊþ¨`xç¹é÷Ô’&?šbÀA­ 8TwƒëŽÌþ˜¨½ÿϧßUKšì 8hе2àP»¿-¢dÌH4¸þèôûjI“M1à Vª³þå{eÄÈV£ØýíéwÖ’&7šbÀA­ 8TWÅŽ¯Šª÷töG€п|ïô{kI“›M1à Vª«ÞY_ÈþxÀ¦ö¢zú¡(½9†÷\Ã[O‰Á5‡ÅàŠý¢áNÑ;w&zgþkt¿ö÷Ñ=î“Ñ=ú¢sØÇ¢sȯÍÖÞ÷}Ï´÷ÏÌþ‡ëª½Çÿ×Ýþ?ÿ½ÿ·¯üÖìÿÝÿ:z§~&zgm?ûß³Ùž1¸úÞrr W^å#7ÍþÏÃ~öÿ¶à¹õ‹(–¿&ýîZÒdfÀAS 8¨•‡jiÁæQ=yoöÇÖmÐjÕ1\ya ®?*ú—~1zçþÇìP¢søÇ£½ÿÏE±ë›¢µÃÖùß­7°bÉË£½âÑùò¯D÷˜?‰Þiÿ+ú,Ÿ ï:?Ê'@†þù‹Ò¿3KšÌ 8hе2àP­½(€,U÷©(¼&7ý‹w‹ÞiŸÎ‘¿íýÞÅN¯Kÿ¾œÞÌü(v~C´ø¥èûg³ã•Á5_‰ò¾Ë£j?‘ý¬*Öâ­ò¿Kš¸ 8hе2àP•÷^–ýÑ`ÂU'£¼ï›³¿,Ñ;çߢ{ÌŸ>óËË^þ}xÜ+–mí/ýbtOúÛè_º"†wžÕÓgÿGÀ„Xû糿óJš¼ 8hе2àÐ\·ö¢æJµæÁÞqvô/Ù#º'ÿCtú_ÑHjí8¦sðG¢wÆÿŽÁu_ò±Û"ª*û#À˜©VÝ5ûg¸³¿ßJš¬ 8hе2àÐ\7¸á˜ì5c¨ê®‰òÞKcpå—¢wʧŸj,Û.ýû­ž¿bÉ+fÿ³êùùÞtbTO?”ýQ` ¬ýS~Ùße%MV4Å€ƒZph.+v}sD9ÈþX0âªöªÞy^ô/Úå™?}²âÑš™Ÿþ}Vsôìþ¶è÷Éè_¾w”_ïW:ø!åƒW§o•4YpÐjeÀ¡¹lí<ü€~;†+/ŠþE»F÷¨OD±ûÛÓ¿·ªÙŠå¯™ýϾÿÍ}¢|ä¦ìO$#¢sȯ§W•49pÐjeÀ¡¹ªØáeQuVg¤HV­¾;×}5z§}6Úûÿ\´n‘þ]U£U±óë£{ÒßÄঢê=ý‘ ÉðŽ³Ó¿›Jšœ 8hе2àÐ\µöï”0eª*ʇoˆþå{=óë;¿>ý{©Æ¬E/™ý7/û—~1Ê'îÈþDаö>ïÉÿN*i"2à )ÔÊ€CsÒÌü(¿=ûã @#ƒë£ÙžÑ=ê£Xöêü¨Ú_ü‰èùùÞõˆrý‰ fƒëJÿ*i22à )ÔÊ€CsQç°e”¨Iµze ®<à™_Ø0ØPƒK_Ýcÿ,†·|=bØË~¨C9ˆb÷·¥÷”4þpÐjeÀ¡¹hxë)ÙeæJ¿ˆáçDï¬í£½ïûÒ¿kJßsÿÏŒ9ÊaöSÀZû Ùß7%4Å€ƒZphS+v{« T€1W>v[ô/Ú5:$Z‹^’þSz¾Š]ß½3ÿ5ʇ®Í~t˜ ý"Šeۥϔ4ÞpÐjeÀ¡M­áNÙc6TUFùÀUÑ;o¡_ÙÐX×Þó§f?Çåã·g?Ul‚Þ9ÿ–þÝRÒxgÀAS 8¨•‡6©E/‰ªõhöÇ€õýÓ(7ÝþGË_“ÿ]RšËfæÍþ‚ÌàÆã"†ýì§ € T=u_´n‘ÿ½RÒØfÀAS 8¨•‡6¥µƒ€ÖoÇð–¯Ï~o+–¼<ýû£ÔDÅN¯‹ÞYÛGµzeöÀèó'éß%%o4Å€ƒZphS*ï½,û# À³mHÏ43?:‡üÚìóU•ýdð†÷\’ÿRÒØfÀAS 8¨•‡6¶ö>ïÉþøð]Ã~ o99ºGÿQ´o•þ]QµÚ+Þý‹wª½*ûiày´÷û@úwGIã™M1à VÚØW}9ûã 0õÊû.Þ)ŸŽbÙ«Ó¿JcÑâ—F÷äÿÕª;³_Öapíáùß%e4Å€ƒZphc*–¾2¢×ÊþøL¥êÉ{£áNÑ^ñÎôï…ÒXÿy•Ã?åýWf?Ò|¿a?Š]Þ˜ÿ}QÒØeÀAS 8¨•‡6¦Þéÿœýј.ƒn n86:‡üZ´f楔&©µÏÕ𞋳Ÿr¾£þ¢ôÆ/šbÀA­ 8´ÁÍÌ‹ò±Û²?ºS¡|äÆèö¿¢ØqÛüïÒ„×9ðƒ1¼ýŒˆªÊ~ô¦ZõôÃÑZô’ôÆ+šbÀA­ 8´¡uúPöÇ`²õZ1øÖAÑþÒ/¦÷“¦±ö>ï‰Á ÇDTeöi0µºÇÿeú÷BIã•M1à VÚÐבý±˜HÕª;£wÖöQ,Û.ý;Ÿ¤E{ÏŸšýÓE4¯|ðêôÆ+šbÀA­ 8´!K_Ñ/²?¶e¸ò¢èýGÑZ°Yú÷=I?ÜÚ_ÃÞ}AöQ0u:ürúwAIã“M1à VÚz§|:û# 0ªîšè_¶g´W¼3ý;ž¤õhf^t¾úQ>zsöñ05ÖþZú÷@Ic“M1à VÚÖþl¯zúáè·0Š·Mÿn'i#š™?û‹9Õª»²€ÉW¢ØõÍùß%E4Å€ƒZph}kïû¾ì+ÀØ*¾!º'|*Z _œþ½NÒ´ø¥Ñ;ó_£j?‘}¼L´þËó¿ûI‹ 8hе2àÐú6¸b¿ì+ÀØ®¼(:‡|öÏ/dŸ“4÷;¾*ú—®ˆ(‡ÙÇ ÀDªÚ«¢µÃÖéßû$~4Å€ƒZph½ZüÒ¨:«³?®ccxÇ9ÑÞÿçó¿ÇIj¤ö¾ïò¾Ë³€‰ÔýÚߥß“4úpÐjeÀ¡õiíÏ}ðª*†·|=Úû} ýû›¤„fæG÷ø¿ˆªx,û4˜(å#7úUCI/˜M1à VZŸ†+/Ìþ¨Œ®ª|f¸±ï{Ó¿·IʯØqÛgþ¬JUfŸN£sðGÒ¿çIí 8hе2àÐ Õ^ñÎÙ›€g©ªÜpl´¿ø“éßÙ$^í/ýb”^}RL„á-'§¿“4ÚpÐjeÀ¡ªÑ.ÙS€‘3¼ý ¿¸!é…[°YôNýLD¯•}lŒ·ªœý‡³éßï$l4Å€ƒZpèy[°YTkÌþ˜ŒŒòÞË¢sЇó¿§I«ŠÝÞÃ;ÏË>ÂÆZÿ’=Ò¿×IÝ 8hе2àÐóÕ9ìcÙQ€‘P>tmt¾ò[éßÏ$q3ó¢wʧýÀFª:OFk‡­ó¿×IÉ 8hе2àÐó5¸îÈì(@ªµ¿FÖýÚßÏþ2Yöw3I“‘_ãØxÝ“þ&ýûœ¤ÑÌ€ƒ¦pP+=WÅ’WDô‹ì(@Ž~ý wšýN”ý½LÒ63ovVõžÎ>íÆJyÿùßå$d4Å€ƒZpè¹êžøWÙO€æUU n86ŠÝÞ’þ}LÒäWìþ¶Þu~öÉ0VÚû¾/ý{œ¤ÑË€ƒ¦pP+=W.€iSÞ{™‹@IÍ73?zgüKİ—} Œ…Á•䇓4rpÐjeÀ¡uUìòƈªÌþx4¢j?½Ó>;ûQ³¿‡IšÞÖÈÊ'¾}$Œ¼µ†ÎŸ»”ôì 8hе2àкêóoÙM€úUe ®9,ŠeÛ¥ÿ’¤µK^ƒkÈ>F^ïëÿ˜þÝMÒheÀAS 8¨•‡ÖUùèÍÙM€Z W^í½ßþ½K’ÖU÷¤¿‰èÙG%ÀÈ*º.ý;›¤ÑÊ€ƒ¦pP+=»ö~ÈþXÔ¦ê¬öçR$Eí/þD”]›}lŒ¬ö—~1ý;›¤ÑÉ€ƒ¦pP+=»þe{f,j1¼åëQìò£éß·$i½[´eô/]‘}|Œ¤ÁÕ‡æ_“42pÐjeÀ¡háQµÍþXÌ©êÉ{£sÄïä×’¤¬{ôGÕ]“}œŒ–~;Š·Mÿ®&i42à )ÔÊ€Cß_çðßÎþH̪œýu±bÉËÓ¿gIÒ¦ÖÞó§£|âÛÙ'+ÀHéþ¹ôïi’F#šbÀA­ 8ôý ®=<û# 0'ªÕwGç §¿’¤¹¬XòŠÙ?À3ÊGo‰Ö̼ôïi’ò3à )ÔÊ€CßkÑ–QužÌþHlšªŠÁ•_ò«’&·›EÿÂfÏ;":þjþw4IépÐjeÀ¡ïÖùêd6IµæÁèþñôïU’ÔDÝcþ$¢_d½é×}5ý»™¤ü 8hе2àÐw\TöÇ`£ ®>4Š¥Û¤§’¤&kïóž¨V¯Ì>‚r {Q,múw3I¹pÐjeÀ¡ÙoUïéì#À«ºOE÷¸O柒¤¤ŠeÛÅðÎs³c€T½³¾þ½LRnÿ?{÷®wYßù~8+j=·õ|ÙÃÐZmíÔ¶ŒÇ¢î‰ZgÆ©íH[§­Ç–º§ã83ve%@ œ4„ƒ„C8Q‚H0e H * F È!á9~÷\YÙ×ÞµUä¹ïïóü~¯÷u½þW×õ|…OÖJ*”‡²fÀÁ.½óþ}ôS”$IzÊî¿!µ{eø-n~Ÿ4¼ùôèoË’$Ia¹;µæöŒ¿Ë€0*•‡²fÀÁ.£;.Ž~Š’$IO¾ñ( ®_¾ð/,£ï(€iÒ¿âДª*ú»´$IRHݳÞ~q 8T*eÍ€ƒöáÏIiЉ~Š’$IOªêñûSwÕAá7À´ê­ûÔFƒèo×’$IÅÞqQø-Ä1àP© 8”5z¾/úJ’$=©F÷\“ÚË¿Ÿ¦]÷Ì·¦ªûxô·mI’¤²‡©}ÌO…ßb@ •Ê€CY3à`ôµË£Ÿ¡$IÒnú¥iüÍÑßÊ%I’еkÀÚZ¼Wø”gÀ¡Rp(kÍֻ裟 $IÒmôÍkS{ùKÂo&€YÖ>â¹itφèoé’$IY«Ú§Ñ×?›×.Yø‹‹Ñ7Pž‡JeÀ¡¬p4ÛhëeÑOP’$é6Ø´"µï~/ÔÂü¾ixûÑßÚ%I’&Ó F÷ß_úxê]ðû ÿÒ6üÞÂp¨TÊšGsµ{vJƒNô”$Iúþ†½Ô»ø?†ßJµ³x¯4¼åŒèïò’$IO­ñ(·oIÃÍkRÿŠCSwÕA©µd¿øÛ ˜:*•‡²fÀÑ\½óÞýü$I’¾¯jç¶Ô9õMáw@mÍí±ðŽ$I’¦ùÿ޶®Oý ó©»vQj/{~ü ̕ʀCY3àh®ámçD??I’¤ÿ¯]?þ¶½ü%á7@#F‰þ¶/I’”ªÎ#iôÏ¥ÁÛ=ÖX~@ü­Ì,•Ê€CY3àh¨ù}RÕ},úùI’$-4üêy©µäñ7@ƒô¯úhô·I’Ô¤FƒÝ¿ å¦ÓRoÝ!©³òÀ…aiôMÔ‡‡JeÀ¡¬p4SwÍïD?=I’¤”ªjáÇâú‡v1ú—há{±$IÒ¤«½' 7¯Iý+MÝU¥Ö’ýÂo Þ 8T*eÍ€£™†7­Š~z’$©é {©wáûÂï"€¦ë]ú”ªqô§‚$IšáªÛÒhëú…þ¯BYö‚ðh•Ê€CY3àh ¹=SõÄw£Ÿž$IjpUûáÝ+ú.`Aï¢?2â$IOª]¿š{t×Uið…ÃS÷ìw¦öò—„ß2»p¨TÊšGótOÿçÑÏN’$5¸ñ#w/üê蛀ï×»ø?úu*’$éûvÓø[—›NXø Š?ãW`SË€C¥2àPÖ 8šgð¥G?;I’ÔÐÆß½=µù©ð{€¬wÉŸqH’ÔàªGïIÃÍkRÿŠCwÿÔÄ%Ï¿Ož,•Ê€CY3àhžêÑoF?;I’ÔÀFßüBjñÜð[€m׿°‘$Iõ¯Ú¹-¶®Oý ó©»vQj/{Aøðtp¨TÊšG³tN~Cô““$I l¸åÂÔZ²_ø-À“Ó¿ê£Ñ’$i‚UÝÇÓèî«Óàºe©{λRû藆ߓfÀ¡Rp(kÍÒ¿f.úÉI’¤†5üò'SknÏð;€§f×߯•$I3ذ—Æܘ7ž˜zëI~.µæö¿-r3àP© 8”5ŽfÙu¸K’$•j°ñÿ `†íú[º’$iúÊðö ~ ZwÕA©µäá7@•Ê€CY3àhŽöQ/N©G?9I’Ô×/¿xúv}?—$IÓQµó;i´uýÂOÊê®]”ÚG¾0üV˜*•‡²fÀѽ‹þ(ú¹I’¤†Ô¿ê¿…ß>LÈÜixóéÑ-’$5®ª·#îÙ_<*uÏ}wjóSñwÀ3àP© 8”5ŽæØõcô$I’²VU©Å_…ß=LØâ½ÒðŽ‹¢?e$Iªoãaoß’†›×¤Þ¥H•¦ÖÜžñ7À 1àP© 8”5ކ˜ß'UÝÇ¢Ÿ›$IªsU•z—ýyüÝ@KŸ™F÷mŒþ´‘$iö«ª4~øki¸ùoSÿ3™:§¾)µ–ìÿY0ã 8T*eÍ€£ºgüËè§&I’êþ“7.ÿ‹ð›€¼ÚG<7¼5úSG’¤™ªÚù4Úº>õ7̧îÚE©}ä‹Â?ÓêÈ€C¥2àPÖ 8šapÃqÑOM’$Õ¸þU ¿w(£}ÌO¥ê±û¢?z$IšÊªþ ?±j°iEê­;d÷¯B™‚Ïo€&0àP© 8”5ŽfØõ#ù$I’rÔÿüÿ¿u(k׿Œª:DI’Ûx˜ÆÛ·¤áæ5©Å¡©sÊSknÏðÏi€¦2àP© 8”5Žúó%I’rÕ¿æoÂobtVýFJƒvôG‘$Ieªª4þÞ7ÒðÖ³w5NûõÔZòŒðÏcþþ}˜JeÀ¡¬pÔ_ÿŠ¿Š~f’$©† 6~ç«»ö_/üícI’êVÕ},î¾:õ7̧îÚE©}Ô‹Ã?wøwô×D IDATÑ 8T*eÍ€£þFw]ýÌ$IRÍÞrFjÍí~篿þƒÑK’$=­ªþitïui°ñ˜Ôûô¿Kíc_þù ÀSgÀ¡Rp(k5·ô™) :ÑÏL’$Õ¨ÑÖËRkñÞñwSc×Oe’$i&Óxû–4ܼfáW¡tW”Zóû„–ðôp¨TÊšG½u×ü«è'&I’jÔè›×ú=Ïüc‹÷J£¯]ý1%IÒ?ªÚ¹-¶®ßý«PVœZK÷ÿÜ •Ê€CY3਷Á ÇE?1I’T“ÆÛnIíß~ß0Ú‡ÿÄÂßh–$)ªªµ}aPØß°xá/¶µ|aøç#åp¨TÊšG½¿ûÕè'&I’jPµãÛ©}ÌËÂo¦[û¸W-üË3I’²×o¥Ñ}Ó`ÓŠÔ[wHê¬<0µæöÿ, އJeÀ¡¬pÔW{ùKRªªè'&I’f¼ª·#uNúÅðÛ€ÙÐYõ) {Ñ_’¤:5-ü”§áæ5©Å¡©»ê Ôšß7ü3€ébÀ¡Rp(kõÕ[÷‡ÑÏK’$Íz£Aê®~[ø]Àlé÷ïý…IÒ]µs[m]ŸúæSwõÁ©µtÿðÏ6¦Ÿ‡JeÀ¡¬pÔ×ðÖµÑÏK’$Íx½‹þ8ü¦`6 ®;"úcL’4UÝÇwÿ*”ë—§îÚE©}ÔO††0› 8T*eÍ€£¦æöHÕF?/I’4à ¾xdüMÀìšÛ#î¸8úãL’4M Ú»Ç7Ÿzç¿7µMüçµaÀ¡Rp(kõÔ9éõÑOK’$Íp£¯6µï~Ó0ÛÚ‡=;·ßý±&IŠh3¥A'úiI’¤Yk4HÝ3ÞËPKƒ/ýI'IúqtÒèþÒàKŸH½ ~ßà€©eÀ¡Rp(kõÓ]}pô³’$I3Xÿ³¿c¨±Å{ùi‘’4íGiüÝÛÓð–3Rï²?O“)µïÿO‚‡JeÀ¡¬pÔÏàº#¢Ÿ•$Iš±Fw^šZs{„ß1Ô[{Ù Rõè=Ñ{’¤ÿ·jç¶4Úº>õ7̧îÚE©½ìùáŸðã2àP© 8”5ŽúÙõ# %I’žlãï}#µÝ„Ò9éõ) ÚÑ’Ô¸ªÞŽ4ºoclZ‘zç½'µ—¿$ü3&É€C¥2àPÖ 8jféþ)úÑÏJ’$ÍJýVêœø ñ7 Ò»è¢?%©Þ »iü­M»Çþ‡ÔùÄO‡ï€Ü 8T*eÍ€£^º«Ž~R’$i†ê]ø¾ðû€fÞrfôÇ $Õ£jœÆÛ·¤áWV§þú¦Î)oL­ù}¿Ï@i*•‡²fÀQ/ƒëŽˆ~R’$iFÚõ/΢oì°g¥ñö;¢?%iæªvnK£­ëSÃ|ê®]”ÚË^ÿ=¦€‡JeÀ¡¬pÔËèþ¢Ÿ”$IšÆÜ•Ú‡?'üv Ù:+>¥A;úcQ’¦¶ª·3îÛ¸ûW¡¬;$µuø÷n˜V*•‡²fÀQ#K÷OiÔ~R’$iÚ RçÔ7Åß.ð7ÿ$õ.ý@ô'£$MGãáî_…²yÍÂ÷ÆÎÊSknÏðïÓ0+ 8T*eÍ€£>º«ßýœ$IÒ ÔÿÜ_‡ß-ð÷ o=;úãQ’ŠW=zÏÂX£Å¡©»ê ÔZòŒðïÇ0Ë 8T*eÍ€£>×ýœ$IÒ”7ºëªÔšÛ#ün€¿¯}øO,üz/IªkÕŽo§Ñ§þçÿ{êžùÖ…ï{Ñß{ n 8T*eÍ€£>F÷ßýœ$IÒWuOíc_~³ÀÒ9å) {Ñ—’ô´«z;Óè¾i°iEê­;$µMø÷Xh•Ê€CY3ਉ¥û§4êG?'I’4Åõ.|_üÍ?BÿŠ¿Šþ¸”¤§Öx˜ÆÛ·,ü*”Þ¥H•¦ÖÜžáßO ‰ 8T*eÍ€£ºgþVôS’$ISÜèÎKÂïø?šÛ#¶®þØ”¤\U¥ñC[ÆýËÿ"uNýÕÔšß7þ{'°À€C¥2àPÖ 8êapí’è§$I’¦´ªýpj/? ü^€'£}Ô‹SõăÑŸ’”ªßY•õ7̧îÚE©}ä ÿG?œ‡JeÀ¡¬pÔÃèîÏG?%I’4¥õÎ{Oø­OE÷ìwD|JjXUoG}óÚ4øâQ©{î»Sû˜—…/ž•Ê€CY3à¨Å{-üŸLI’¤ØèkŸ‰¿UàÇ0¼iUôǨ¤º6¦ñö-»Ê‡¦Î)oL­¹=ÿïO‡JeÀ¡¬p̾ÎÉoˆ~F’$i Û5ðô7˜Y‡=+þzôÇ©¤TíܶûW¡\õÑÔ]uPj-}fü÷8`â 8T*eÍ€cöõ/ÿPô3’$ISXýÃïx::Ÿü•”FƒèTI3Tõă»ÇæSwí¢Ô>òEáßË€2 8T*eÍ€cö o;7úI’¤)küÀ~ 4µ0øÂaÑ«’¦´ªÿDÝ·1 6­H½u‡¤ÎÊÿgq 8T*eÍ€cöUÝýŒ$IÒ45ê§ÎÊŸ¿Q`"æ÷Ião9úÓURt£Ao»% þ×)©wñûwß»‹÷ŠÿL •Ê€CY3à˜mí£_ý„$IÒ”5ØxLø“þ±»þ¦½¤æTíܶûW¡\õÑÔ]uPj-Ý?ü{0Ý 8T*eÍ€c¶õÎ{Oô’$ISöºÛ‡?'üF€Ië_þѳ’2U=ñÝÝckæR÷¬ßNíe/ÿžÌ•Ê€CY3à˜mƒM'D?!I’4Eõ.üá÷ d1·gÝ{]ôG­¤§[¿•F÷mLƒM+RoÝ!©³òÀÔšÛ#þ{ 0ó 8T*eÍ€c¶·Ýý„$IÒ”4ºÿKþá7µÖ>þÕ~•Š4KGi¼}Kn^“úWºûW¡Ìïþ½¨'•Ê€CY3à˜a‡=+¥Ñ ú I’¤ih`êp¨TÊšÇìÞ~~ôó‘$ISÐà ‡‡ß%PZÿªÿý,Õ³ñ(·oIÃÍkRÿŠCwÿ*”ù}ÃÿÌüŸp¨TÊšÇìªýfôó‘$IÁU­‡RÛ=@S•Êý_Šþ(–f¾jç¶4Úº>õ7̧îêƒSë°gÅÿùø1p¨TÊšÇljù¢”ª*úùH’¤àúëÿsø]Q:+>¥a/úãXš™ªöÃiôõϦÁµKR÷oÿïÔ>êÅáŽ&Å€C¥2àPÖ 8fSwÍ¿Š~:’$)¸]?«5¿Oø]‘ú×ÌE$KÓÙ F÷ß_úxêÿÞÔ>þ5á^r2àP© 8”5ŽÙÔß°8úéH’¤àz¿?ü&€póû¦ñö;¢?–¥ØÆ£4Þ¾% 7¯Iý+MÝU¥Ö’ýâÿ|dÀ¡Rp(k³iôµË£ŸŽ$I lüÈ]©µxïð›¦A÷ô7û5£jTÕÎmi´u}êo˜Oݵ‹R{ÙóÃÿD3àP© 8”5ŽÙT=ñ`ôÓ‘$Iõ.|_ø=Ódxó§¢?ž¥,U½it߯4Ø´"õÎ{Oj/? üÏÀ42àP© 8”5ŽÙÓ>öÑÏF’$6~øë~úüíe/HUk{ôÇ´ôô vÿ*”›NK½u‡¤ÎÊSknð?_³À€C¥2àPÖ 8fOïÓÿ6úÙH’¤ÀvýÃüè{¦Ñ®ŸP%ÍLãQ÷ö4¼åÌÔ»ì?¥Î)¿œZóû„ÿ9˜U*•‡²fÀ1{×ýl$IRPÕãßòöàGÝýùèkéVíÜ–F[×§þ†ùÔ]»(µ—=?üÏ @p¨TÊšÇìÝsMô³‘$IAõ?ó—á·L³ÎÇ_›Ò ý‘­†WuM£»®Jƒ/žºg¿#µ—¿$üÏ@Ýp¨TÊšÇì©ÚG?I’PÕþ^jö¬ð[¦]ÿš¿‰þØV“ Òxû–4¼é´…_u×Yy`jÍíþç i 8T*eÍ€c¶´}yô“‘$IAõ7,¿E`&Ìï›ÆÛïˆþèV«Æ okø•Õ©¿þƒ©sÊýz;€)aÀ¡Rp(k³¥{ö;£ŸŒ$IЍßJí#_~‹À¬èžùÖèOoÕ jç¶4Úº>õ7̧îÚE©½ìáo€Ì€C¥2àPÖ 8fKÿš¹è'#I’lZ~‡À¬Þ~~ôG¸f¨ªûxÝ}u\wDêžó®Ô>úÿ Ãþ5áwÌšö1/KUÿ‰èOrMcãaoß’†›×¤Þ¥H•¦ÖÜžáo€Ÿ‡JeÀ¡¬pÌ–ê±{£ŸŒ$I*ÜpË…á7̪þÕÿ3ú£\Sò«P†·_úWšº«J­%Ï›L–‡JeÀ¡¬pÌŽöÏK©ª¢ŸŒ$I*\gÕo„ß!0³æ÷Mㇿýq®ÂcÑÖõ©¿a>u×.Jí#_ÿÈ΀C¥2àPÖ 8fG÷Œ·D?I’T¸ñ·o ¿A`ÖuÏz{ôGº2Uõv¦Ñ}Ó`ÓŠÔ[wÈî_…2o€ò 8T*eÍ€cvô?ûáèç"I’ ×;ÿ½á7ÔÁhëeÑëzº‡i¼}Kn^“z—~`÷XcnÏð·Àt0àP© 8”5ŽÙ1üÊêèç"I’ Víx µæ÷ ¿A ÚÇ¿:¥A'úã]O¶ªZøÕ7ÃÍ›úŸùËÔ9õM©µd¿ðwÀô2àP© 8”5ŽÙ1~ðÖèç"I’ Ö¿ú†ßP'ƒk—D¼ë‡TíüNm]ŸúæSwí¢Ô>òEáï€ÙbÀ¡Rp(k3b~ß”Fýèç"I’J5ê§öò—Äß P'KŸ™ªÇïþ”o|Uog}óÚ4¸~yêûoRû˜—Å¿ fž‡JeÀ¡¬p̆Ή¯‹~*’$©`ÃÛÎ ¿? ŽzüAôÇ|³Óxû–4ܼ&õ¯84uNycjÍíþ¨•Ê€CY3à˜ ½óßýT$IRÁº§¿9üþ€ZšÛ#î¿!ú£¾¶U;·íþU(W}4uW´ðSO¿æ4‚‡JeÀ¡¬p̆Á~*’$©Pãíw,üË¥èûêªsÚ¯¥TUÑù3_Õ},î¾:õ7̧îÚE©}ä‹Â¿¶4—‡JeÀ¡¬p̆ÑG?I’T¨þú†ßPwï~:ú#¦ªúO¤Ñ}Ó`ÓŠÔ[wHê¬<0ükŸ‡JeÀ¡¬p̆ñÃ_‹~*’$©Ð¿iþœðÛê®}Ü+St¢?ú§³Ñ ¿ó•4üò'Sïâ÷§Î‰¿Z‹÷ ÿšÀbÀ¡Rp(k3`É~)‡ÑOE’$hxË™ñ·4ÄàºeÑýSQµs[m]ŸúW}4uW”ZK÷ÿÚÀSeÀ¡Rp(kÓ¯sÒ룟‰$I*T÷ô7‡ßÐíÞªßIMªê>žFw_úæSwí¢Ô>êÅá_˜•Ê€CY3à˜~½ þ ú™H’¤U~3µæö¿= Iz—üIªmýVÝ·1 6­H½u‡¤ÎÊÝÔ–‡JeÀ¡¬pL??ÒU’¤fÔ¿úcáw4ÎÜžiüÍiæþ{ o:ma”Ò9ñu©µx¯øÿ} •Ê€CY3à˜~£;/~&’$)wÕ8µ}yøÝMÔ=ëíiÖªvnK£­ëwÿ*”Õ§ÖÒýÃÿw€H*•‡²fÀ1ýÆÜýL$IRæFw]~s@“îþ|šÖªîã»ÊõËSwí¢Ô>ê'Ãÿ÷€icÀ¡Rp(kSné3S¢Ÿ‰$IÊ\ï‚ß¿; Á:§üòÂOÄ oÐÞ=Ö¸áøÔ;ÿ½©}ü«Ãÿ·€Y`À¡Rp(kÓ­sò¢Ÿˆ$IÊ]¿•Z‡=+üÞvNÙ`îU) {Ù>ó«ÛÒhëúÔß0¿ûW¡ñ¼ðÿÎP*•‡²fÀ1ÝúG?I’”¹îÙï ¿9€Ý›VLäó½êíØý«P®_¾{¬±ü€ðÿnPg*•‡²fÀ1݆·žýD$IRƪîc©µd¿ð›Ø­}ä‹RÕ}ü©} i¼íæ…ñGoÝ!©³òÀÔšÛ#ü¿ 4‰‡JeÀ¡¬pL·ñ·¿ýD$IRƆ7*üÞ¾_ÿêýðïñ(·oIÃÍkRÿŠCSwÕAƘ0 8T*eÍ€cºíú[¹’$©¾uW~oÿÀÒg¦jÇ ŸÕÕÎmi´u}êo˜ßý«P–=?þ?ðp¨TÊšÇôÚõûq%IR}«Z¥Öâ½Ãoàë|â§þyôàÉ1àP© 8”5ŽéÕýÔoF?I’”±á-g†ßP*•‡²fÀ1½z—üiôó$Iëžó®ð{êÀ€C¥2àPÖ 8¦×`ã1ÑÏC’$åjÐI­Ãž~o@p¨TÊšÇôm½,úyH’¤Líúœ¾5 . 8T*eÍ€czÚý<$IR¦z—üIø­uaÀ¡Rp(kSjñÞ)úÑÏC’$娧öòâï ¨ •Ê€CY3à˜Níã_ý4$IR¦ÆßÚ~k@p¨TÊšÇtêžù[ÑOC’$eª¿aqø­ubÀ¡Rp(kÓ©wÉŸF? I’”©Îi¿~k@p¨TÊšÇt\·,úiH’¤ UÝÇRkñÞá·Ô‰‡JeÀ¡¬pL§áW?ý4$IR††w\~g@Ýp¨TÊšÇt?pcôÓ$Iê]öŸÂï ¨•Ê€CY3à˜NUë¡è§!I’2´ëÿHFßP7*•‡²fÀ1}Ú‡=;úYH’¤ UÝ~g@p¨TÊšÇôéœøºèg!I’24¼iUøudÀ¡Rp(kÓ§{λ¢Ÿ…$IÊPoÝ!áwÔ‘‡JeÀ¡¬pLŸþg?ý,$IR†ÚÇ¿:ü΀:2àP© 8”5Žé3ØtBô³$I®Ú¹-üÆ€º2àP© 8”5Žé3Úº>úYH’¤ 7¼ý‚ðêÊ€C¥2àPÖ 8¦ÏøÁ[£Ÿ…$Išpý+ ¿1 ® 8T*eÍ€cúTG¢Ÿ…$IšpS~9üÆ€º2àP© 8”5Ž)³tÿè'!I’&\Õ"µïg@Mp¨TÊšÇt鬸™è'!I’&ÜèžkÂo ¨3•Ê€CY3à˜.ÝÕG? I’4á_<*üÆ€:3àP© 8”5ŽéÒ»øýÑOB’$M¸Þyï ¿1 Î 8T*eÍ€cºô7,Ž~’$iµMøufÀ¡Rp(kÓexóéÑOB’$M°ªûXjÍí~c@p¨TÊšÇt}ãsÑOB’$M°Ñ=Âï ¨;•Ê€CY3à˜.ãí[¢Ÿ„$Iš`ƒÇ„ßPw*•‡²fÀ1]ªÞŽè'!I’&Xïü÷†ßPw*•‡²fÀ1=Ú‡?'ú9H’¤ ×ùÄO‡ßPw*•‡²fÀ1=:'ü\ôs$I“lÐN­¹=Ão ¨;•Ê€CY3à˜Ý3ßý$IÒo»%ü¾€&0àP© 8”5Žéѻ࢟ƒ$Iš`Ã[Ï¿/  8T*eÍ€czô?÷×ÑÏA’$M°þÕ ¿/  8T*eÍ€cz 6ý$IÒëžûîðûšÀ€C¥2àPÖ 8¦ÇðÖµÑÏA’$M°Î ?~_@p¨TÊšÇôÝ}uôs$I“j4H­ù}Âï h•Ê€CY3à˜ãí[¢Ÿƒ$IšPãíw„ßÐ*•‡²fÀ1=ªö÷¢Ÿƒ$IšPÃ-ëÂo h •Ê€CY3à˜óû¦TUÑÏA’$M¨ÁŒ¿/ ! 8T*eÍ€c:´}EôS$I¬wÉŸ†ßÐ*•‡²fÀ1:§þjôS$I¬»úàðûšÂ€C¥2àPÖ 8¦C÷ìwD?I’4Á:mø}MaÀ¡Rp(kÓa×Y—$I5iü9á·4‡JeÀ¡¬pÄ«v|;úH’¤I4¥ÖÜá·4‡JeÀ¡¬pÄKýVô3$I¨j/ü®€&2àP© 8”5Ž`óûD?I’4¡ÆÜ[@p¨TÊšG¬ö‘/Š~’$iB¿}SømMdÀ¡Rp(k±ÚÇ¿&ú H’¤ 5ºëªðۚȀC¥2àPÖ 8‚?LNúÅè' I’&Ôð«ç…ßÐD*•‡²fÀüarÚ¯G?I’4¡†7Ÿ~[@p¨TÊšG¬îê·E?I’4¡›N¿- ‰ 8T*eÍ€#V÷ÜwG?I’4¡_<*ü¶€&2àP© 8”5ŽX½u‡D?I’4¡ú‡ßÐD*•‡²fÀ«¿þƒÑO@’$M¨þ• ¿- ‰ 8T*eÍ€#Ö®Ñ#I’êQÿò…ßÐD*•‡²fÀkpí’è' I’&Tïâ÷‡ßÐD*•‡²fÀkpÃqÑO@’$M¨Þùï ¿- ‰ 8T*eÍ€#Öð˧F?I’4¡ºg¿3ü¶€&2àP© 8”5ŽXÃ[ÏŽ~’$iBuW~[ÚmKm IDAT@p¨TÊšG¬Ñ—D?I’4¡º« ¿- ‰ 8T*eÍ€#Öè®+£Ÿ€$IšPS~9ü¶€&2àP© 8”5ŽX£{¯‹~’$iBuN|]ømMdÀ¡Rp(k±ÆÜý$IÒ„êœðOÃo h"•Ê€CY3àˆ5þÎæè' I’&TgÅÏ„ßÐD*•‡²fÀküÐÖè' I’&Ô®ÿ“}[@p¨TÊšG¬ê±{£Ÿ€$IšPíã^~[@p¨TÊšG¬ê‰£Ÿ€$IšPíc_~[@p¨TÊšG¬ªûXô$Iª}ôKÃo h"•Ê€CY3àˆ•†Ýè' I’&T{ùá·4‘‡JeÀ¡¬pÄJUý$IÒ„jù¢ðۚȀC¥2àPÖ 8-Ù/úË/I’&X{Ùóãï h •Ê€CY3àˆÓ>â¹Ñ_~I’4ÁÚî*aÀ¡Rp(kqÚGýdô—_’$M°öaÏ¿/ ‰ 8T*eÍ€#Nûè—Fù%IÒkö¬ðûšÈ€C¥2àPÖ 8â´{eô—_’$M0¿Bbp¨TÊš‡I’4™ÚËž~_@ù÷n*•‡²fÀøArÂÏEù%IÒkù¢ðûšÈ€C¥2àPÖ 8?HNü…è/¿$Iš`íå„ßÐD*•‡²fÀøArò¢¿ü’$i‚µ~iø}MdÀ¡Rp(k$Ÿü•è/¿$Iš`íc_~_@p¨TÊšGàÉi¿ýå—$I¬}ü«Ãï h"•Ê€CY3àˆÓ=ýÍÑ_~I’4Á:mø}MdÀ¡Rp(kqºgüËè/¿$Iš`?~_@p¨TÊšGœîê·Eù%IÒë¬<0ü¾€&2àP© 8”5Ž8Ý5¿ýå—$I¬sâëÂï h"•Ê€CY3àˆÓ]»(úË/I’&Xçä_ ¿/ ‰ 8T*eÍ€#އ$IõªsꯆßÐD*•‡²fÀ§{ö;¢¿ü’$i‚u?õ›á÷4‘‡JeÀ¡¬pÄéžýÎè/¿$Iš`ݳÞ~_@p¨TÊšGI’êU÷œw…ßÐD*•‡²fÀÇ€C’¤zÕ;ÿ½á÷4‘‡JeÀ¡¬pÄÙõ·t%IR}ê]üþðûšÈ€C¥2àPÖ 8âpH’T¯úë?~_@p¨TÊšGœî9¿ýå—$I¬ÿ¹ÿ~_@p¨TÊšGI’êUÿê…ßÐD*•‡²fÀÇ€C’¤z5øÂáá÷4‘‡JeÀ¡¬pÄéžûîè/¿$Iš`ƒŽ ¿/ ‰ 8T*eÍ€#އ$IõjpãIá÷4‘‡JeÀ¡¬pÄéžó®è/¿$Iš`Ã[Î ¿/ ‰ 8T*eÍ€#N÷ìwDù%IÒÞvnø}MdÀ¡Rp(kqºk~'úË/I’&ØèÎKÃï h"•Ê€CY3àˆÓ=ëíÑ_~I’4ÁF÷l¿/ ‰ 8T*eÍ€#N÷ÌߊþòK’¤ 6þöMá÷4‘‡JeÀ¡¬pÄéžñ–è/¿$Iš`ㇿ~_@p¨TÊšGœîéoŽþòK’¤ V=ñ`ø}MdÀ¡Rp(k$«~#úË/I’&Ù ~_@p¨TÊšGàÉ©oŠþòK’¤ ×Z¼wøMcÀ¡Rp(k$Ÿü•è/¿$IšpíeÏ¿1 i 8T*eÍ€#ðƒää_ŠþòK’¤ ×>î•á74‡JeÀ¡¬p~œøºè/¿$Išp»>ߣo h•Ê€CY3àü Yy`ô—_’$M¸îªƒÂo h•Ê€CY3àü ùÄOGù%IÒ„ë®ùðšÆ€C¥2àPÖ 8â´{eô—_’$M¸Þù¿~c@Óp¨TÊšGœöò—Dù%IÒ„ë]úgá74‡JeÀ¡¬pÄi/{~ô—_’$M¸þçþKøMcÀ¡Rp(k–îýå—$InpíÒøÆ€C¥2àPÖ 8-Þ;úË/I’&ÜàÆ“âo h•Ê€CY3àˆ•Æ£è' I’&Øð¶sÃï h•Ê€CY3àˆ•è' I’&Øè®«Âï h•Ê€CY3àˆUu~’$i‚·Ý~_@Óp¨TÊšG¬ªµ=ú H’¤ V=úÍðûšÆ€C¥2àPÖ 8bU+ú H’¤ Võv„ßÐ4*•‡²fÀküÈÝÑO@’$M¸Öü>á74‰‡JeÀ¡¬pÄoßý$IÒ„k/? üÆ€&1àP© 8”5ŽXãm7G?I’4á:'üÓðšÄ€C¥2àPÖ 8bî»>ú H’¤ ×]uPøMbÀ¡Rp(k±Fw]ý$IÒ„ëžýÎðšÄ€C¥2àPÖ 8bî¼$ú H’¤ ×»øýá74‰‡JeÀ¡¬pÄÞvNô$I®ÿ¹¿¿1 I 8T*eÍ€#ÖðæÓ£Ÿ€$Išpƒë–…ßÐ$*•‡²fÀk°é„è' I’&Üð˧†ßÐ$*•‡²fÀkpýòè' I’&Üp˺ðšÄ€C¥2àPÖ 8bõ7ÌG?I’4áF÷m ¿1 I 8T*eÍ€#VÿÊD?I’4áÆßûFøMbÀ¡Rp(k±ú—(ú H’¤ Wõv„ßÐ$*•‡²fÀ«wñû£Ÿ€$IÊPké3Ãï h •Ê€CY3àˆÕ;ÿ÷¢Ÿ€$IÊPû¸W…ßÐ*•‡²fÀ«»ö_G?I’”¡Î©¿~g@Sp¨TÊšG¬î§~3ú H’¤ uÏ~GøMaÀ¡Rp(kÁ&'ÿRô$Iê]ò§áw4…‡JeÀ¡¬pD˜¼6ú H’¤ õ¯þXøMaÀ¡Rp(k±Úˈ~’$)Cƒ¿[~g@Sp¨TÊšG°¥ûG?I’”¡áíçÇßÐ*•‡²fÀln”Æ£èg I’&ÜèÞëâï h•Ê€CY3àˆWu~’$iÂÚ~c@Sp¨TÊšG¼jÇÑÏ@’$M¸ªóhøMaÀ¡Rp(kñÆÝý $IÒ¤«ªÔZ²_øM`À¡Rp(kñÆü¯èg I’2Ô>æeáw4‡JeÀ¡¬pÄÝsMô3$Iê|òŸ…ßÐ*•‡²fÀotç%ÑÏ@’$e¨{Îï†ßÐ*•‡²fÀoø•ÕÑÏ@’$e¨¿þ?‡ßÐ*•‡²fÀoð¥OD?I’”¡ÁuËÂï h•Ê€CY3àˆ×ß0ý $IR††_9+ü΀&0àP© 8”5ŽxýÏ~8úH’¤ î¾:ü΀&0àP© 8”5Žx½‹þ8úH’¤ º3ü΀&0àP© 8”5ŽxÝs~7úH’¤ U½áw4‡JeÀ¡¬pÄëžñ–èg I’2Õ>ü9á·Ô‡JeÀ¡¬pÄëœü†èg I’2ÕYñ³á·Ô‡JeÀ¡¬pÄk÷ªèg I’2Õ=ó­á·Ô‡JeÀ¡¬pÄkñ¼èg I’2Õ»ð}á·Ô‡JeÀ¡¬pL¹=SªÆÑOA’$e¨ÕGão ¨9•Ê€CY3à˜U÷±è§ I’24ø»•áwÔ‡JeÀ¡¬pL‡ê±{£Ÿ‚$IÊÐðŽ‹Âï ¨;•Ê€CY3à˜ãm·D?I’”¡ñ7†ßPw*•‡²fÀ1Fw>ú)H’¤ U;¿3 î 8T*eÍ€c: ¿úéè§ I’r4¦Öâ½Âo ¨3•Ê€CY3à˜ƒOŒ~ ’$)Sí£_~k@p¨TÊšÇt\»$ú)H’¤LuNûµð[êÌ€C¥2àPÖ 8¦Cÿ3ý$IR¦zçÿ^ø­ufÀ¡Rp(kÓ¡wÁD?I’”©þ• ¿5 Î 8T*eÍ€c:tÏúíè§ I’25¸ñ¤ð[êÌ€C¥2àPÖ 8¦Cç“¿ý$IR¦F[ׇßPg*•‡²fÀ1ÚÇ¿:ú)H’¤L¼-üÖ€:3àP© 8”5ŽéÐ>ü'¢Ÿ‚$IÊTÕÛ~k@p¨TÊšÇôH£~ôs$I™jñÜð[êÊ€C¥2àPÖ 8¦GõăÑÏA’$eªsÒ/†ßPW*•‡²fÀ1=ÆÞý$IR¦ºk…ßPW*•‡²fÀ1=Fw>ú9H’¤Lõ/ÿPø­ueÀ¡Rp(kÓcxëÚèç I’25¸þèð[êÊ€C¥2àPÖ 8¦Çà†ã¢Ÿƒ$IÊÔ𫟿5 ® 8T*eÍ€czô¯üHôs$I™kSø­ueÀ¡Rp(kÓ£·î£Ÿƒ$IÊTµs[ø­ueÀ¡Rp(kÓ£{ÖoG?I’”«jœZóû†ßPG*•‡²fÀ1=:'¿!ú9H’¤ŒµMø½udÀ¡Rp(kÓ£½ü%ÑÏAúßì܉³ïw]ßñIH¦R¬‚VܨVT.:вHU,QkkÅÞ{³@ ÀMY ˜²‘@!;YH!"$$BBÂ%ç·/ßÎešNšf¹Ëy¿ßßï÷÷xÎ<þƒÏwÎûÎyÝÓH’âõ¼ò{úÈ€CYp(4ŽÙ¸Ûwþ¼º$IêgãSÿ¤þÞ€2àPV Í€£]–kߨ~’$)¨é'ö.¿5  8”•‡B3àh—Å×?[ý$$IRP³k-¿5  8”•‡B3àh—ù—>Vý$$IRPó[/-¿5  8”•‡B3àh—ÙgŽ«~’$)¨å}w”ßÐGÊÊ€C¡p´ËôÒ·W? I’Ø`ï'”ßÐ7ÊÊ€C¡p´ËäÜ7T? I’Øð]?S~o@ßp(+…fÀÑ.ãSþ¸úIH’¤ÀFǾ üÞ€¾1àPV Í€£]Fïÿ­ê'!I’›œõ7å÷ô‡²2àPhí2<ä窟„$I lzÙÁå÷ô‡²2àPhí28૟„$I lþ…3Ëï èeeÀ¡Ð 8ZfãnM³\T? I’ÔâÎêï èeeÀ¡Ð 8Úg9¸»úYH’¤¨¦ÃfmÃ.å÷ô‰‡²2àPhí³õæJ’¤þ68à©å÷ô‰‡²2àPhí3ÿòùÕÏB’$6:üWÊï èeeÀ¡Ð 8ÚgvÝ ÕÏB’$6>ùåå÷ô‰‡²2àPhí3½ì êg!I’›||Sù½}bÀ¡¬ 8šGûLÎýûêg!I’›]stù½}bÀ¡¬ 8šGûŒ?ðGÕÏB’$6¿å¢ò{úÄ€CYp(4ŽöñkÕÏB’$¶Ür{ù½}bÀ¡¬ 8šGû ü±êg!I’"[.›µ½_~s@_p(+…fÀÑB›¾«i–‹ê§!I’¾óßÔßÐÊÊ€C¡p´Óò¾;ªŸ†$I ltÜ‹Êï è eeÀ¡Ð 8ÚiqûUÕOC’$69çïÊï è eeÀ¡Ð 8Úiþ¹ÓªŸ†$I lvÕáå÷ô…‡²2àPhí4½ü]ÕOC’$6ÿò'Êï è eeÀ¡Ð 8Úir†$I l¹åöò{ú€CYp(4ŽvðeÕOC’$E¶\6k{OùÍ}`À¡¬ 8šG;Ž|NõÓ$IÁ 7?³üæ€>0àPV Í€£>­úiH’¤àÆ'¼¤üæ€>0àPV Í€£¥ö|ìwþ´º$Iêo“þCýÍ=`À¡¬ 8šG{-×î¬~’$)°ÙÕG•ßÐÊÊ€C¡p´×⫟ª~’$)°ù-•ßÐÊÊ€C¡p´×üs§W?I’Øò¾;Êï èeeÀ¡Ð 8Úkzùæêç!I’‚ìóÄò›ºÎ€CYp(4Žöš|ôªŸ‡$I nxÈÏ•ßÐuÊÊ€C¡p´×øƒÿµúyH’¤àÆ'þAùÍ]gÀ¡¬ 8šG{Žúõêç!I’‚›œ÷Æò›ºÎ€CYp(4ŽöòƒF’¤þ7»æèò›ºÎïÕ”•‡B3àh±=×4Ëeõ‘$IÍo½´þ怎3àPV Í€£Ý–kߨ~"’$)°­?ë«ï è:eeÀ¡Ð 8ÚmñµkªŸˆ$I nðæ'•ßÐeÊÊ€C¡p´ÛüógT?I’Üð°_,¿9 Ë 8”•‡B3àh·é囫Ÿˆ$I n|ò+Êoè2eeÀ¡Ð 8Úmrö몟ˆ$I nzÁ›Êoè2eeÀ¡Ð 8Úm|ÂKªŸˆ$I nvýÉå7t™‡²2àPhí6uDùÝ]bÀ¡¬ 8šG·,Çß®~2’$)¸ÅW.+¿9 K 8”•‡B3àè–Å×®©~2’$)¸åxK³¶a—ò»ºÂ€CYp(4Žn™}ö¤ê'#I’¼å‡Êïè eeÀ¡Ð 8ºezÁ›ªŸŒ$IJhô¾ÿT~w@Wp(+…fÀÑ-ãS^Yýd$IRB“³þ¦ü0àPV Í€£[†‡?»úÉH’¤„fW½§ü0àPV Í€£[û~_õ“‘$I Ío½¤ü0àPV Í€£{–Ã{ªŸ$I n9º·ü怮0àPV Í€£{·_Yýl$IRBƒžZ~w@p(+…fÀÑ=³ÏWýl$IRB£÷þ‡ò»ºÀ€CYp(4Žî™ž¿gõ³‘$I M>ò×åwt‡²2àPhÝ3þà˪Ÿ$IJhvå»ËïèeeÀ¡Ð 8ºgxØ/V?I’”Ðü–‹ÊïèeeÀ¡Ð 8ºgðæ'U?I’”ÐrpwùÝ]`À¡¬ 8šG7mý…Ž$Iêƒý ü3àPV Í€£›_ùdõÓ‘$I Žz^ùÝmgÀ¡¬ 8šG7Í>ýþê§#I’šœùšò»Ú΀CYp(4Žnš|쫟Ž$IJhzÅ¡åw´‡²2àPhÝ4>髟Ž$IJh~ó…åw´‡²2àPhÝ4O¬~:’$)©Á[~¨üö€63àPV Í€£»–÷}½úùH’¤„FGÿfùÝmfÀ¡¬ 8šGwÍo¹¸úùH’¤„&ç¼¾üî€63àPV Í€£»fW¿·úùH’¤„f×]~w@›p(+…fÀÑ]“þ¯êç#I’Z|õêò»ÚÌ€CYp(4Žîÿ{ÕÏG’$e45kS~{@[p(+…fÀÑ]Ãw>£úùH’¤¤†ýdùímeÀ¡¬ 8šG‡mÚ½iæÓê'$I’Ÿð’úÛZÊ€CYp(4Žn[Üõ…ê'$I’š||SùÝmeÀ¡¬ 8šG·Í?wZõ’$I Í®?¹ü2àPV Í€£Û¦î[ý„$IRB‹»n,¿; ­ 8”•‡B3àè¶ñÉ/¯~B’$)£Å¼YÛëñå·´‘‡²2àPhÝ6|÷¿«~B’$)©á¡{”ßÐFÊÊ€C¡ptÛ`ï'4ÍrYýŒ$IRBãS^Y~{@p(+…fÀÑ}Ë-·U?#I’”Ðôâ·–ßÐFÊÊ€C¡ptßü¦V?#I’”Ðü‹ç”ßÐFÊÊ€C¡ptßô²ƒ«Ÿ‘$IJh¹åöò»ÚÈ€CYp(4Žî›œñ—ÕÏH’$%5Ø÷Éå·´‡²2àPhÝ7:ê׫Ÿ‘$IJjtäsÊoheeÀ¡Ð 8ºo°ÿT?#I’”ÔäÌ¿*¿= m 8”•‡B3àè‡åàîê§$I’š]ùîò»ÚÆ€CYp(4Ž~˜ßziõS’$I Ío¹¸ü1àPV Í€£fŸ:²ú)I’¤„–£o5kv)¿= M 8”•‡B3àè‡ÉÙ¯«~J’$)©Á[¤üö€61àPV Í€£FÇ<¿ú)I’¤¤FÇüNùímbÀ¡¬ 8šG? |ZõS’$IIMÎ{cùímbÀ¡¬ 8šGOlصi¦Ãêç$I’š}öõ·´} IDATˆ‡²2àPhý±¸ãÚêç$I’ZÜucùÝmbÀ¡¬ 8šGÌ®;±ú9I’¤Œ–‹f°÷Êoh eeÀ¡Ð 8úcòñMÕÏI’$%5<ì—Êoh eeÀ¡Ð 8úc|âT?'I’”Ôøô?+¿= - 8”•‡B3àèá»þmõs’$IIM/ß\~{@[p(+…fÀÑ#{>¶i³ê'%I’šßrqýí-aÀ¡¬ 8šG¿,¾ñ¹ê'%I’ZŽ·4kv)¿=  8”•‡B3àè—ÙgOª~R’$)©Á?V~{@p(+…fÀÑ/“o¬~R’$)©Ñq/,¿=  8”•‡B3àè—ññ¿Wý¤$IRR[‡›Õ·´‡²2àPhý2<è'ªŸ”$IJjvÃ)å·´‡²2àPh=³ñ1M3V?+I’”Ðâ›7ÕßÐÊÊ€C¡pôÏâ«WW?+I’”ÑrÙ Ür`À¡´ 8šGÿÌ>ýþêg%I’’þìòÛªp(+…fÀÑ?“sþ®úYI’¤¤Æúoå·T3àPV Í€£Fïÿ­êg%I’’š]ùîòÛªp(+…fÀÑ?ƒ·þpõ³’$II-¾rYùíÕ 8”•‡B3àè§åèÞê§%I’2š¬5kv-¿= ’‡²2àPhý4¿õ’ê§%I’’¾ýéå·T2àPV Í€£ŸfWVý´$IRRãã¯üö€JÊÊ€C¡pôÓäÌ×T?-I’”Ôôü½Êo¨dÀ¡¬ 8šG?Žúõê§%I’’šîôòÛ*p(+…fÀÑOƒ}¿¯úiI’¤¤–÷Þ\~{@%eeÀ¡Ð 8úkyßÕÏK’$e´\6ƒ7}oùíU 8”•‡B3àè¯ùMçU?/I’”ÔèÈç–ßPÅ€CYp(4Žþš^úŽêç%I’’šœõ7å·T1àPV Í€£¿Æ§½ºúyI’¤¤f×]~{@eeÀ¡Ð 8úkøž_®~^’$)©ÅŸ)¿= Š‡²2àPhý5Øû M³\V?1I’”ÑbÖ¬íù¸òû*p(+…fÀÑoË{¾\ýÄ$IRRÃC÷(¿= ‚‡²2àPhý6ÿüÕOL’$%5>íOËo¨`À¡¬ 8šG¿M/Ü·ú‰I’¤¤¦—o.¿= ‚‡²2àPhý6>é¥ÕOL’$%5¿õ’òÛ*p(+…fÀÑoúú‰I’¤¤–“ûšµ »–ßÍ€CYp(4ŽžÛø˜¦™ªŸ™$IJjxÐOÔßÌ€CYp(4Žþ[Ü~Uõ3“$IIOúÃòÛ²p(+…fÀѳOYýÌ$IRRÓ ÷+¿= ›‡²2àPhý7ùðk«Ÿ™$IJjþÅsÊoÈfÀ¡¬ 8šGÿŽ|Nõ3“$II-×î,¿= ›‡²2àPhý7xÓ÷6ÍrYýÔ$IRRƒ~°üþ€LÊÊ€C¡p¬†å½·T?5I’”ÔèŸ~»üö€LÊÊ€C¡p¬†ùçϨ~j’$)©Éyo,¿= “‡²2àPh«aú‰}ªŸš$IJjvýËoÈdÀ¡¬ 8šÇjŸðŸ«Ÿš$IJjñÍ›ÊoÈdÀ¡¬ 8šÇj¾ãÇ«Ÿš$IÊj¹loúå÷d1àPV Í€cElصYNî«~n’$)©Ñ‘Ï©¿? ‰‡²2àPh«cñ•OV?7I’”Ôä#]~{@eeÀ¡Ð 8VÇìÊꟛ$IJjvÍûÊoÈbÀ¡¬ 8šÇꘜñß«Ÿ›$IJjqǵå·d1àPV Í€cuŒÿ•êç&I’²šO›µ=[~@eeÀ¡Ð 8VÇ`Ÿ'6ÍrYýä$IRRÃC~®üþ€ ÊÊ€C¡p¬–å=_ª~r’$)©ñ©¯*¿= ƒ‡²2àPh«e~éÕON’$%5½|sùí 8”•‡B3àX-“oª~r’$)©ÅW.+¿= ƒ‡²2àPh«etü‹«Ÿœ$IÊj:hÖ6îV~@4eeÀ¡Ð 8VËàÀ§U?9I’”Øð]?S~@4eeÀ¡Ð 8V̆]šåxKõ³“$IIOyeýýÁ 8”•‡B3àX=ó[/©~v’$)©ée—ßÍ€CYp(4ŽÕ3½âêg'I’’šßrqùíÑ 8”•‡B3àX=ãÓ^]ýì$IRRËÉ}ÍÚÆÇ”ßÉ€CYp(4ŽÕ3<ô竟$IJlxðO—ßÉ€CYp(4Ž´é»šf>©~z’$)©ñ_V@ eeÀ¡Ð 8VÓâŽk«Ÿž$IJjzÉå·D2àPV Í€c5Í®~oõÓ“$IIÍo¾ üö€HÊÊ€C¡p¬¦É‡_[ýô$IRRËñ–fmîå÷D1àPV Í€c5ŽøÕê§'I’¾ãÇËïˆbÀ¡¬ 8šÇjìý„¦Y.ªŸŸ$IJj|ÒKËïˆbÀ¡¬ 8šÇêZÜucõó“$IIM/~KùíQ 8”•‡B3àX]³ëN¬~~’$)©ù—>^~{@eeÀ¡Ð 8V×äÜ7T??I’”Ôrto³¶a—òû"p(+…fÀ±ºFGÿFõó“$I‰ |Zùý 8”•‡B3àX]ƒ}Ÿ\ýü$IRbã¿üþ€ÊÊ€C¡p¬¶å–ÛªŸ $IJjzá~å·D0àPV Í€cµÍ?ÿ¡ê'(I’’šñÜòÛ"p(+…fÀ±Ú¦çïYý%IRRËÁÝå·D0àPV Í€cµŽ{aõ”$I‰ Þö£å÷¬7eeÀ¡Ð 8VÛà­?Rý%IRb£ã_\~Àz3àPV Í€ƒåà®êg(I’’š~bŸòÛÖ›‡²2àPhÌo:¯úJ’¤¤æ7žU~{Àz3àPV Í€ƒéET?CI’”ÔríÎòÛÖ›‡²2àPhŒOziõ3”$I‰ ÞòCå÷¬'eeÀ¡Ð 8ô“ÕÏP’$%6:öå÷¬'eeÀ¡Ð 8XÛ°k³»ú)J’¤¤¦çïUÀ:2àPV Í€ƒ­æ·^Rý%IRRóÏ*¿=`=p(+…fÀÁVÓËßUý%IRRËÁ]å·¬'eeÀ¡Ð 8Øj|ꫪŸ¢$IJlð¶-¿?`½p(+…fÀÁVÃÍϪ~Š’$)±ñ /)¿?`½p(+…fÀÁwlÜ­i¦Ãêç(I’’š^¸_ýýëÄ€CYp(4î·¸íòêç(I’’šßt^ùíëÅ€CYp(4î7½âêç(I’’Z޾լmØ¥üþ€õ`À¡¬ 8š÷Ÿúªêç(I’¾ýéå÷¬eeÀ¡Ð 8¸ßp󳪟£$IJl|ÒKËïXÊÊ€C¡pðmÜ­i¦Ãê')I’’š^ò¶úûÖ‡²2àPh<Ðâ¶Ë«Ÿ¤$IJj~óå·¬eeÀ¡Ð 8x é‡T?II’”Ôrr_³¶a×òûv–‡²2àPh<ÐøÔWU?II’”ØðàŸ.¿?`gp(+…fÀÁ 7?«úIJ’¤ÄÆ'¿¼üþ€eÀ¡¬ 8šÿ»5ÍtXý,%IRRÓË®¿?`'p(+…fÀÁƒ-n»¢úYJ’¤¤æ·^Z~{ÀÎ2àPV Í€ƒ›^qHõ³”$IYMßù \Õ÷ì eeÀ¡Ð 8x°ñ©¯ª~–’$)±áæg–ß°3 8”•‡B3ààÁ†›ŸUý,%IRb[Ç›Õ÷ì eeÀ¡Ð 8øÿlÜ­i¦Ãê§)I’’š^qhýý;Á€CYp(4Êâ¶+ªŸ¦$IJjqû•å·ì eeÀ¡Ð 8x([ÿ'®$IZ‘æ“fmÏÇ–ß°£ 8”•‡B3àࡌOûÓê§)I’úóå÷ì(eeÀ¡Ð 8x(ÃÍϪ~š’$)±ñ‡þ¢üþ€eÀ¡¬ 8šiãnM3V?OI’”ÔìSGÔß°ƒ 8”•‡B3ààá,n»¢úyJ’¤¤_ûtùí;Ê€CYp(4ÎôŠC«Ÿ§$IÊj1kÖöz|ùý;€CYp(4Îø´?­~ž’$)±á{~¹üþ€aÀ¡¬ 8šgxÈÏV?OI’”ØäÌה߰# 8”•‡B3ààamÚ½if£ê'*I’’š]stýý;À€CYp(4Éâ¶Ë«Ÿ¨$IJjqç å·ìeeÀ¡Ð 8x$ÓËßUýD%IRVËE3pÐAÊÊ€C¡pðHƧ¼²ú‰J’¤ÄFG=¯üþ€íeÀ¡¬ 8šdøÎgT?QI’”ØäÜ7”ß°½ 8”•‡B3ààmصYŽ·T?SI’”Ôìú“ëïØNÊÊ€C¡pðhæ7_PýL%IRRËo}¥üö€íeÀ¡¬ 8šfzñ[«Ÿ©$IJlpÀSËïØÊÊ€C¡pðhÆ'ýaõ3•$I‰Ž}AùýÛÀCYp(4ÍàÀ§U?SI’”Øôû”ß°= 8”•‡B3ààQmØ¥Yî®~ª’$)©ùÏ­¿?`;p(+…fÀÁ¶˜ñœê§*I’’Z¿ùgõýÛÊ€CYp(4¶ÅÖ?¥.I’V§á;~¼üþ€meÀ¡¬ 8šÛbtÜ «Ÿª$IJlüÁ—•ß°­ 8”•‡B3à`[ xjõS•$I‰M/;¨üþ€meÀ¡¬ 8šÛjùí¯V?WI’”ÔüÖKËoØVÊÊ€C¡p°­æŸ;½ú¹J’¤¬f£fmÓîå÷l eeÀ¡Ð 8ØV“ýcõs•$I‰ Ý£üþ€maÀ¡¬ 8šÛjtôoV?WI’”ØøCQ~À¶0àPV Í€ƒm5xó¿lšå²úÉJ’¤¤fŸ:²üþ€maÀ¡¬ 8šÛcyÏ—ªŸ¬$IJjñõëÊoØÊÊ€C¡p°=f×Xýd%IRVËE3Øç‰å÷<eeÀ¡Ð 8Ø“s^_ýd%IRb£#ŸS~À£1àPV Í€ƒí1:ò¹ÕOV’$%¶u¼Y}À£1àPV Í€ƒí1Øû M³˜W?[I’”Ôì³'•ßðh 8”•‡B3à`{-úÙJ’¤¤–÷Þ\~{À£1àPV Í€ƒí5ûôû«Ÿ­$IJl°ß÷—ßðH 8”•‡B3à`{MÎ|Mõ³•$I‰Žy~ùýÄ€CYp(4¶×ð°_ª~¶’$)±éù{•ßðH 8”•‡B3à`»íùئ™«Ÿ®$IJj~ãYõ÷<eeÀ¡Ð 8؋ۯ¬~º’$)©åð›ÍÚ†]Êïx8ÊÊ€C¡p°#¦—o®~º’$)±ÁO+¿?àáp(+…fÀÁŽŸòÊê§+I’ŸôÒòûއ²2àPhìˆáÁ?Uýt%IRbÓK,¿?àáp(+…fÀÁÙ°k³}«úùJ’¤¤æ·\\ÀÃ0àPV Í€ƒ5¿é¼êç+I’²š›µM»—ßðP 8”•‡B3à`GM/xsõó•$I‰ Ý£üþ€‡bÀ¡¬ 8š;jtÜ‹ªŸ¯$IJlrÆ_–ßðP 8”•‡B3à`G xjõó•$I‰Í®9ºüþ€‡bÀ¡¬ 8š;c¹å¶ê',I’’Z|ãóå·<eeÀ¡Ð 8سN©~Â’$)«å²¼ùIå÷<˜‡²2àPhìŒÉ¹o¨~Â’$)±ÑÑ¿Q~Àƒp(+…fÀÁÎõ¼ê',I’›|lCùýfÀ¡¬ 8š;c°Ï›f1¯~Æ’$)©ù>\~Àƒp(+…fÀÁÎZÜy}õ3–$II-w7kv)¿?à 8”•‡B3à`gÍ®~oõ3–$I‰ |ZùýdÀ¡¬ 8š;krÆ_V?cI’”ØøT~Àp(+…fÀÁκGõ3–$I‰M/;¨üþ€2àPV Í€ƒ¶i÷¦™«Ÿ²$IJjñ•OÖßðÊÊ€C¡p°æ·^Zý”%IRV³q³¶çcË︟‡²2àPh¬‡é¥ï¨~Ê’$)±áa¿X~Àý 8”•‡B3à`=Œ?ð_ªŸ²$IJlòá×–ßp?eeÀ¡Ð 8X÷?½ú)K’¤Äf×[~Àý 8”•‡B3à`]lØ¥Yî®~Î’$)©Å7¿XÀÿaÀ¡¬ 8šëeþÏgW?gI’”ÕrÙ öý¾òû¶2àPV Í€ƒõ2=Ïêç,I’ýÓo—ß°•‡²2àPh¬—Ñ1ϯ~Î’$)±éù{•ß°•‡²2àPh¬—Á~ÿªú9K’¤Äæ_<§üþ€­ 8”•‡B3à`=-ïùrõ“–$II-G÷6kv)¿?À€CYp(4ÖÓ캫Ÿ´$IJlxÐO”ß`À¡¬ 8šëirö몟´$IJl|òËËï0àPV Í€ƒõ4:âW«Ÿ´$IJlzùæòû 8”•‡B3à`]íõÝM³˜U?kI’”Ôâö«êïVž‡²2àPh¬·Å×>]ý¬%IRVói³¶×ãËïV›‡²2àPh¬·ÙUï©~Ö’$)±ááÏ.¿?XmÊÊ€C¡p°ÞƧ½ºúYK’¤Ä&gýÏòû€ÕfÀ¡¬ 8šëm¸ù™ÕÏZ’$%6»îÄòû€ÕfÀ¡¬ 8šënãcšåä¾ê§-I’’ZÞ{sýýÀJ3àPV Í€ƒó›/¬~Ú’$)±Á?X~°º 8”•‡B3à Âôâ·T?mI’”Øèø—߬.eeÀ¡Ð 8ˆ0>ñ÷«Ÿ¶$IJlëx³úþ`up(+…fÀA„ÁÛ~´úiK’¤Äæ·\\~°º 8”•‡B3à ÊòÛ_«~Þ’$)«é°YÛô]å÷«É€CYp(4¢Ì?Fõó–$I‰ ßý å÷«É€CYp(4¢L>¶¡úyK’¤Ä&~mùýÀj2àPV Í€ƒ(£££úyK’¤ÄfŸ9¾üþ`5p(+…fÀA”Á›¾·i–Ëê'.I’’ZÞóåòû€ÕdÀ¡¬ 8š‘wÝXýÄ%IRbƒýŸR~°z 8”•‡B3à ÒìÚcªŸ¸$IJltÜ‹ÊïV‡²2àPhDš|䯫Ÿ¸$IJlzÑå÷«Ç€CYp(4" ßóËÕO\’$%6¿ùÂòû€ÕcÀ¡¬ 8š¡ö|lÓÌÆÕÏ\’$e56k›v¯¿AX)ÊÊ€C¡pmqûUÕÏ\’$%6<ôçËïV‹‡²2àPhD›^qHõ3—$I‰MÎ|MùýÀj1àPV Í€ƒhã“_QýÌ%IRb³k-¿?X-ÊÊ€C¡pmxðOU?sI’”Øòž/•߬eeÀ¡Ð 8·a—f9¼§ú©K’¤Äû?¥þ`ep(+…fÀA†ùM­~ê’$)±Ñq/,¿?XÊÊ€C¡paú‰}ªŸº$IJlzá~å÷«Ã€CYp(42ŒŽýÝê§.I’›ß|AùýÀê0àPV Í€ƒ ƒý¾¿ú©K’¤Ì¦ƒfmãnå7«Á€CYp(4²,ï½¹ú¹K’¤Ä†‡îQ~° 8”•‡B3à Ë캫Ÿ»$IJlræ_•߬eeÀ¡Ð 8È29ûo«Ÿ»$IJlví1å÷«Á€CYp(4²Œÿ•êç.I’[|ó¦òû€Õ`À¡¬ 8šiö|\Ó̧ÕO^’$%6ØÿêozÏ€CYp(42-¾zuõ“—$I‰Ž}Aùý@ÿp(+…fÀA¦Ù•ï®~ò’$)±é…û–ßôŸ‡²2àPhdŸòÇÕO^’$%6ÿò'ÊïúÏ€CYp(42 ßùŒê'/I’2››µM»—ß ô›‡²2àPh¤Ú°K³Ý[ýì%IRbÃwÿBý @¯p(+…fÀA¶ù—>Výì%IRb“üòû€~3àPV Í€ƒlÓ Þ\ýì%IRb³ëN,¿?è7eeÀ¡Ð 8È6:î…ÕÏ^’$%¶Ür{ùý@¿p(+…fÀA¶ÁþO©~ö’$)¹Á[¤ü ¿ 8”•‡B3à Âò[·V?}I’”Øø¤—–ßô—‡²2àPhT˜}öÕO_’$%6ýä;ËïúË€CYp(4*LÎy}õÓ—$I‰-¾zuùý@p(+…fÀA…Ñ¿Výô%IRf‹y3Øû å7ýdÀ¡¬ 8š%öúî¦Y̪Ÿ¿$IJlôÞ_ƒÐKÊÊ€C¡pPeñµOW?I’”ØäcÿX~ÐOÊÊ€C¡pPevÕ{ªŸ¿$IJl~ãYå÷ýdÀ¡¬ 8šUƧ¾ªúùK’¤Ä–£{›µ »–ß ô‡²2àPhT¾ëgªŸ¿$IJnëÏÿê€þ1àPV Í€ƒ2vm–ã-ÕŸ€$IJl|úŸ×ß ôއ²2àPhTšùüêO@’$%6»æèòû€þ1àPV Í€ƒJÓ ÷«þ$IRb‹»ÿ¹üþ  8”•‡B3à ÒèøW’$)¹ÁþO)¿AèeeÀ¡Ð 8¨48à©ÕŸ€$IJntÜ‹ÊoúÅ€CYp(4ª-·ÜVýH’¤Ä¦¿¥üþ _ 8”•‡B3à Úìú“«?I’”ØüÖKÊïúÅ€CYp(4ªMÎýûêÏ@’$e67k{>®ü ? 8”•‡B3à ÚèÈçV’$)¹ááÏ.¿AèeeÀ¡Ð 8(·÷÷4ÍbVý)H’¤Ä&ç¼¾þ 7 8”•‡B3à  _¿®úS$I‰Ío8µüþ ? 8”•‡B3à  fŸ:¢úS$I‰-×î,¿?èeeÀ¡Ð 8hƒñi¯®þ$IRr[ÿQ]}ƒÐÊÊ€C¡pÐÃÍϬþ$IRrã“_Q~ƒÐÊÊ€C¡pÐ Ó,'÷U’$)±Ù•‡Õß ô‚‡²2àPh´Åüæ ª?I’”ØâÎëËïúÁ€CYp(4ÚbzÑÕŸƒ$IÊl¹’;KÝ IDATlû>¹ü û 8”•‡B3à -Æ'¼¤ús$IÉŽýÝò€î3àPV Í€ƒ¶¼å_W’$)¹­«ú û 8”•‡B3à M–[n¯þ$$IRbó[/-¿?è>eeÀ¡Ð 8h“ù §V’$)³ù¤YÛë»ËoºÍ€CYp(4ÚdòѨþ$$IRr£#Ÿ[~ƒÐmÊÊ€C¡pÐ&££žWýIH’¤ä&ç½±ü Û 8”•‡B3à Mû<±ióêÏB’$%6ÿç³ËoºÍ€CYp(4ÚfqçõÕŸ…$IJl9ÞÒ¬m|Lù @wp(+…fÀAÛÌ®>ªú³$IÉ ùÙò€î2àPV Í€ƒ¶ŸþçÕŸ…$IJnrækÊoºË€CYp(4Úf¸ùYÕŸ…$IJnv݉å7ÝeÀ¡¬ 8ô¿Ù»÷h¿ëúÎ÷B R•j«Šµs¦®Þ&«Õvì™öÛjë,µ¥µ¶µíi›ÎY¶ÚöÌœÌ8§ç Ófï.ᢄ›1rRÀ؈\¢@4¢ QˆKP".Ù¿û÷÷ýœµ“éXÎNB²÷þ|Þßßo?k=ÿ÷’ÏÞï^ì_ÊÉ€CkbQª{»£ŸPPýÌ#ñ7ˆ$I’$I’F6J1à +5±êÁ›¢ŸPXëŒW…ß ’$I’$IÍ 8(Å€ƒ¬ 8ÔÄú›O‹~@aÝõ~ƒH’$I’$i43à ²2àPë^ú‡ÑO(lpëšðD’$I’$I£™¥p•‡šXëô‹~@aÃïÜ~ƒH’$I’$i43à ²2àPS«Ÿy$úy%Õuj½ï‡ÃoI’$I’$^”bÀAVjjÕ]WE? °ÎÅo ¿A$I’$I’4zpPŠYp¨©õ®{Oôó ëo>=ü‘$I’$IÒèeÀA)deÀ¡¦Ö¹à ÑÏ(løÍ/†ß ’$I’$I½ 8(Å€ƒ¬ 8ÔÔZ'Ò°Š~"@IU?Mð‚ð;D’$I’$I£•¥p•‡šÜð±;£ŸPØôoኾA$I’$I’4ZpPŠYp¨É ¾rAô ëݰ,ü‘$I’$IÒheÀA)deÀ¡&×½ú]ÑO(¬úƵá7ˆ$I’$I’F+J1à +5¹öY¯‰~"@auowšš8"ü‘$I’$IÒèdÀA)deÀ¡F7qDJ½©ègÖ>çµñwˆ$I’$I’F&J1à +5½êÁ›¢Ÿ PXïÓï¿A$I’$I’4:pPŠYp¨éõ7ŸýL€Âª»® ¿A$I’$I’4:pPŠYp¨éu/ýƒègV·ŸHSË¿C$I’$I’4pPŠYp¨éµN{eô3´ÏüÙð;D’$I’$I£‘¥p•‡F¡ú™G¢Ÿ PXoÃÿ~ƒH’$I’$i42à ²2àÐ(TÝuUôS ÜqYø "I’$I’¤ÑÈ€ƒR 8ÈÊ€C£Pïº÷D? °z÷£á7ˆ$I’$I’F#J1à +B ÞýT€íþdø"I’$I’¤ægÀA)deÀ¡Q¨uâÑ) «èçÖ½ê/ÃïI’$I’$5?J1à +JÃÇîŒ~.@aƒ­kÃoI’$I’$5?J1à +JƒÛÎ~.@aõ“†ß ’$I’$Ij~”bÀAV•ºW¿3ú¹Zïÿ_ÂïI’$I’$5;J1à +Jí³^ý\€ÝõKÂïI’$I’$5;J1à +L‹RÝÛýd€Â·®‰¿C$I’$I’Ôè 8(Å€ƒ¬ 84JUÞýd€Â†ß~ƒH’$I’$©ÙpPŠYph”êo>-úÉZ+_~‡H’$I’$©¹pPŠYph”ê^úÑOнìÂïI’$I’$57J1à +R­Ó^ýd€ý[Î ¿C$I’$I’ÔÜ 8(Å€ƒ¬ 84jÕO?ýl€Â†Ý~ƒH’$I’$©¹pPŠYphÔª¾~eô³J«ëÔ:å¥áwˆ$I’$I’š™¥p•‡F­Þuï‰~6@€ÎÅo ¿C$I’$I’ÔÌ 8(Å€ƒ¬ 84ju.xCô³ô?Fø"I’$I’¤ffÀA)deÀ¡Q«uâÑ) «è§6|ä¶ð;D’$I’$-Ж–Ú«~*u¯ø³øÿ,Úg”bÀAVņÝýt€Ò†Ujôâð;D’$I’$­“^’:½1õ6M¦jû†T·ÿŸE15qDø>ÍÌ€ƒR 8ÈÊ€C£Øà¶ó£Ÿ ³ö-áwˆ$I’$I¯Z+^”:kŽM½KÓ`ëÚ4ܹí€?1ý›Â£ÿ3kf”bÀAVźW¿3úéú7½/ü‘$I’$I#Üä‘©}ö/¤î'ÿ& ¾ráÞßø}ˆÛÞzß¿Šÿï¡pPŠYphkŸõêè§~ó‹áwˆ$I’$IZ+IuÇ¥þͧ¦jÇæ”ú­9ÿýDëôþßK33à ²2àÐH6±(Õ½ÝÑÏ(m8ðkJ%I’$IÒ>kô’Թ詷i2UÛ7¤zê;Yþz¢½ê§Ãÿ»jf”bÀAVÕªoŒ~>@€ÎÚ7‡ß!’$I’$)¸/L5Ç¦ÞÆ¥i°umîÜ–R]ù»‰öY¯‰ÿï¯pPŠYphTëß¼2úù¦åiô"I’$I’ 6±(µW/NÝõKR˪½…RõÂþn¢}î/Çÿo¢pPŠYphTë^úÑÏ0üÖ—ÂïI’$I’”¯ÖÊcRgÝq{? å¾ëSê·R“t.x}øÿFš™¥p•‡FµÖi¯Œ~>@„aµç3m£oI’$I’4÷Z'½xïG¡\{|ª¶oHõÔÎÔtµo ÿßM33à ²2àÐ(W?ýpôtÖývø"I’$I’±É#Sûœ×¦ÞÆ¥i°umîÜ–R]§QÓ¹ämñÿ[jF”bÀAV媯_ý„€ýͧ‡ß!’$I’$éM,JíÕ‹Swý’Ôß²*U;6§TõÒ8è^þ§ñÿûjF”bÀAV妥°ð ¾5ü‘$I’$Iß«µò˜ÔYw\êmšÜûQ('Ó¸ê^ùŽðÿ½53J1à +r ^ý„€Ã*µNzIø-"I’$IÒB¬uâ¤Îšc÷üK–{Æ»K IïSÿ)üÿÍÌ€ƒR 8ÈÊ€C£\kÅ‹öü`áé|üwÂoI’$I’ƾÉ#Sûœ×¦ÞÆ¥i°umîÜ–R]§…¬÷™¿‹ÿÿE32à ²2àШ7|ìŽègèþŒð;D’$I’¤±jbQj¯^œºë—¤þ–U©Ú±9¥A7ú¯§wÃ?Äÿ¥pPŠYphÔÜv~ô3 ¿}{ø"I’$IÒ(×ZyLê¬;.õ6Mîý(”ö®è÷GBÿÆ“Âÿ¿ÓÌ 8(Å€ƒ¬ 84êu¯~gô3"ÔÃÔ:å¥á·ˆ$I’$I£PëÄH5Çîý(”;/OõîG£²Y~+h33à ²2àШ×>ëÕÑÏÒ¹ø÷ÂoI’$I’×ä‘{? åêw¥ÁÖµi¸s[JuýcüØèéìøÿ5#J1à +|‹RÝÛý”€ÓŸÇ~‹H’$I’\ëŒW¥îú%{~N®vlNiÐþ‘}¬ ¾raøÿçš™¥p•‡Æ¡êÁ£Ÿ`øèWÃïI’$I’JÖZyLê¬;.õ6M¦jû†T·Ÿˆþñ|Á|í’ð?š™¥p•‡Æ¡þÍ+£Ÿ¡®Së”—…ß"’$I’$å¨uâÑ©³æØÔÛ¸tÏG¡ÔO>ý“8)¥ê®«Âÿlhf”bÀAV‡º—ü~ôS‚LßÑ·ˆ$I’$IsnòÈÔ^½8u¯~מ±Æpç¶”êaôÝìCuï5ñ^4#J1à +C­Ó^ý”€ ý/®¿E$I’$I:ÔZg¼*u×/Iý-«RµcsJƒNôؤéuþó£™pPŠYph\ªŸ~8ú9†Ý~‡H’$I’ô\ÿbç’·¥þMïKÕŸMu÷éè§™ƒá·n ÿ3¥™pPŠYph\ª¾~eôs"Ôujú#á·ˆ$I’$IÓµN<:uÖ›z—îù(”z×Ñ?93φÜþçL33à ²2àиԻöøèçé^ööð[D’$I’´›8"µW/ÞóQ(ƒ[ÏMÃÛRª‡Ñ?&“ÙðÛ[ãÿìiF”bÀAV—:¼>ú9Aú_:;ü‘$I’$­•Çìù—ú[V¥jÇæ”è‰ 0|ìŽð?‹š™¥p•‡Æ¥ÖŠ¥4¬¢Ÿ`ø»ÂoI’$IÒxÕZùŠÔ¹ø÷RÿÆ“Suÿ ©î<ýã/ 1Üùõð?Ÿš™¥p•‡Æ©éÕ+°0µNûÑð[D’$I’4ºÿ‚`gͱ©·qil]»÷£P`?†ßþgV33à ²2àÐ85¸í¼è'é^ñgá·ˆ$I’$iš8"µW/NÝõKö|Êð‘ÛRª‡Ñ?Ö2B†O|#þϱfdÀA)deÀ¡qª{Õ_E?) Èà+†ß"’$I’¤æÕZyLê^öö=cjÇæ”úíèaqõ®Âÿ\kf”bÀAV§Úg½:úIAê§ ¿E$I’$IñcκãRoÓdª¶oHuëñèWCõSß ÿ³®™pPŠYph¬šX”êî3ÑÏ ÒþÀOÄß#’$I’¤"µV¼(uÖ›z—¦ÁÖµi¸s[ô¥,õ3„ÿù×Ì 8(Å€ƒ¬ 84nUÞý¬€ ÝOþuø-"I’$IÊÐÄ©½zqê®_²ç£P†Ü–Ò°Šþ1”ªÞýXü›ÐŒ 8(Å€ƒ¬ 84nõo^ý¬€ ƒ;/¿E$I’$Ió÷Q(ý›OMÕŽÍ)õÛÑ?rÂÿ4ýÑ<ÑoD33à ²2àиսä÷£Ÿ¤n}7M-;<ü‘$I’$|­“^’:½1õ6M¦jû†TO}'úÇK8 º½+üÝhf”bÀAV·Z+_ý¬€@í³!ü‘$I’$í§/L5Ç¦ÞÆ¥i°umîÜ–R]Gÿ( ‡¤î>ÿ–4#J1à +cõÓG?- Hï3~‹H’$I’ž—¦&ŽHíÕ‹Swý’Ôß²jïG¡T½èaîzSñïK32à ²2àÐ86øú?F?- Huï5á·ˆ$I’$-ÄZ+IuÇíý(”û®O©ßŠþòtÂß›ffÀA)deÀ¡q¬wíñÑO ˆÒo¥©åÏ¿G$I’$iœkôâÔ¹è{ÇÛ7¤zjgôOƒPNÕƒš™¥p•‡Æ±Î¯~Z@ Îy¿~H’$IÒØ´â…©³æØÔÛ¸4 ¶®MÃÛRªëèý N=Œ—š‘¥p•‡Æ²/Li8ˆ~^@þg—Çß#’$I’4ŠM,JíÕ‹Swý’Ôß²*U;6§Tõ¢̃ƙZvXü{Õ³2à ²2àи6|ìŽèç™þ Æè[D’$I’F¡ÖÊcRgÝq{? å¾ë÷|,%ðܦ&Ž¿zv”bÀAV×·ý¼€(ÃAjxtø="I’$IMªuÒ‹÷~ʵǧjû†TOíŒþé FÖÔò燿i=;J1à +kÝ«þ*úy:kß~H’$IRX“G¦ö9¯M½KÓ`ëÚ4ܹ-¥ºŽþQ ÆÆÔ /ˆçzV”bÀAV×Úgþ\ôóõ?ÿþð{D’$I’Š4±(µW/NÝõKR˪=+™ÝèË`¬ùÍŸÍË€ƒR 8ÈÊ€CcÛ²ÃSÝ}:ú‰A†~5þ‘$I’¤ µV“:ëŽK½M“{? ¥ódô`°à´NzIø×=;J1à +sÕŸ‹~b@”ºN­÷ýpø="I’$Is©uÊKSgí›SoÓDªîþTª§vFÿ´L8Nþ¡ð¯zv”bÀAVçú7¯Œ~b@ îe~H’$IÒA7ydjŸóÚÔÛ¸4 ¶®MÃÛöŒÓæiôâø¯zV”bÀAVç:—¼-ú‰·ž~H’$IÒ>›X”Úgþlê^ùŽ4øòGÒðÛ·§4Dÿ¤Ö‰GÇѳ2à ²2àи$°p Ÿ¸/ü‘$I’¤þ»ÊκãRoÓdª¶oHu{WôLÀLðýá_Wôì 8(Å€ƒ¬ 84îÕOîˆ~f@ ÖûÿMø="I’$iaÕ:ùSç£oJ½þaïXc÷£Ñ?óljùQá_kôì 8(Å€ƒ¬ 84î î¸,ú™ºW¿+ü‘$I’4ÆM™Ú«ïùÙc°umîÜ–R=ŒþQÈljâˆø¯?zV”bÀAV÷zŸþ¯ÑÏ 4ØvEø="I’$i|jñªÔ]¿$õ·¬JÕŽÍ) :Ñ?ö¦–þõHÏ΀ƒR 8ÈÊ€Cã^û#¿ýÌ€@ÓŸ+=5±(ü&‘$I’4zµV“:ëŽK½M“{? ¥ýDô8@Ôuø×'ÍÌ€ƒR 8ÈÊ€Ccßä÷YÁÀ7=è ¿I$I’$5ºÖ‰G§ÎšcSoãÒ=…Rïz úG ©†Uø×,ÍÌ€ƒR 8ÈÊ€C ¡á7·D?5 Pï†eá÷ˆ$I’¤5qDj¯^¼ç£P·ž›†;·¥T£tFEÕ‹ÿ:¦pPŠYph!Ôÿ¢Ÿ¨Úqsø="I’$)ö£Pº—½=õ·¬JÕŽÍ~c/07ƒNø×5ÍÌ€ƒR 8ÈÊ€C ¡îeýÔ€HÃAjôâð›D’$IR™±FgÝq©·i2UÛ7¤ºõÝèŸH€qÓ› ÿZ§™pPŠYph!Ô:ýÇ¢Ÿ¬óñß ¿I$I’$Ío­N5Ç¦ÞÆ¥i°umªwÝý£°ÔÝg¿þif”bÀAVZ(ÕO?ýÜ€@ý[Î ¿G$I’$Í¡‰#R{õâÔ]¿$ n=7 wnK©Fÿ¨,@uçÉø¯‰š‘¥p•‡Jƒm룟høø=á÷ˆ$I’¤Cû(”îeoOý-«RµcsJývô{L4Sô×HÍÌ€ƒR 8ÈÊ€C ¥Þgþ.ú¹ÁZgüxøM"I’$ißcκãRoÓdª¶oHuëñèö«žúNø×MÍÌ€ƒR 8ÈÊ€C ¥Îy¯‹~n@°îÕï ¿I$I’¤…^kÅ‹Rgͱ©·qil]»÷£PFH½ûÑ穊™¥p•‡LËJ©êE?9 Ð`Ûñ7‰$I’´š8"µW/NÝõKö|Êð‘ÛRª‡Ñ?ÌIýôÃñ__5#J1à +-¤†9úÉêΓijbQøM"I’$ûG¡ôo>5U;6§ÔoGÿ0ïê§¾þõV33à ²2àÐBªÿÅÕÑOÖþÈ/…ß$’$IÒ8Ô:é%©sÑSoÓdª¶oHuëñès ˆúÉÿkf”bÀAVZHu/ÿÓè'ëݰ,ü&‘$I’F­ÖŠ¥ÎšcSoãÒ4غ6 wn‹>íÂÔ»îÿº¬™pPŠYph!Õ:ãUÑOVí¸9ü&‘$I’ÝÄ©½zqê®_’ú[V¥á#·¥4¬¢Oy€Æ~÷Þø¯Õš‘¥p•‡ZõîG£Ÿi8H­“^~“H’$IM©µò˜ÔYw\êß|jªvlN©ßоÚmøíá_»53J1à +-´ª»®Ž~v@°ÎÅo ¿I$I’¤ˆZ§þÈÞ±ÆçV¤êÞkRÝ~"ú<9Ó#ýõ\33à ²2àÐB«wÝ{¢Ÿ¬Ë™á7‰$I’”½/L5Ç¦ÞÆ¥i°uížà˜ê:úyÓ-þ5^32à ²2àÐB«sÁ룟løø=á7‰$I’4¯M,JíÕ‹Swý’Ôß²jïG¡T½èÓ`,U}>þë¾fdÀA)deÀ¡׊¦4D?= X댿K$I’¤9üCªîåÿ{êá{þAbê·¢Ol€£ºÿ†ðïÚ÷÷F(Á€ƒ¬ 8´~{kôÓ‚u?ù7á7‰$I’t0µNzñÞB¹öøTmßê©Ñç4À‚VÝý©ðï š™¥p•‡bý/ýô€`ÕöO†ß$’$IÒŒ&Lís^›z—¦ÁÖµi¸s[Ju}>ð/ ¶]ÿýB32à ²2àÐB¬»þ/¢Ÿ­7•¦–??ü.‘$IÒnbQj¯^œºë—¤þ–U©Ú±9¥ª})ð[?ÿ=D32à ²2àÐB¬½ê§¢ŸÐ #ü.‘$IÒ©µò˜ÔYw\êmšLÕ}×ï0z·® ÿž¢™pPŠYphA¶ì°T·~~@°þæÓãïI’$e­“^œ:kŽM½kOÕö ©ÞýXôù À<équø÷ÍÌ€ƒR 8ÈÊ€C µêžÑÏ6|ìÎð›D’$IcÐä‘©}ÎkSoãÒ4غ6 wnK©®£Ï]2éß¼2þ{fdÀA)deÀ¡…Zï†eÑÏh€Öéÿ:ü.‘$IÒ5±(µW/NÝõKR˪TíØœÒ }ÖPPÿ³'Ä?ÒŒ 8(Å€ƒ¬ 8´Pë\ôÆèç4@÷êw†ß%’$Ijn­•ǤκãRoÓäÞBiïŠ>aÖ»î½áߟ43J1à +-ÔZ'Ò°Š~‚@°êëW†ß%’$IjF­ uÖ»÷£Pî¼<Õ»‹>Wh Þ§ßþ=K33à ²2àÐBnús­î>³ç3Ë£ïI’$nòȽ…rõ»Ò`ëÚ4ܹ-¥ºŽ>OÝOþMü÷1ÍÈ€ƒR 8ÈÊ€C ¹ÁmçE?A :çÿzø]"I’¤¼µÎxUê®_’ú[V¥jÇæ”Ýè3€ÕýÇÿ#üûšffÀA)deÀ¡…\÷ª¿Œ~‚@ôo>5ü.‘$IÒüÕZyLê¬;.õ6M¦jû†T·Ÿˆ>9#ÝOüIø÷:ÍÌ€ƒR 8ÈÊ€C ¹é_“ 0|ôkáw‰$I’fWëÄH5Ç¦ÞÆ¥ipçå©Þýhôy À˜ë\üÖðïš™¥p•‡tËKu{Wô3¢Õujö£ñ·‰$I’Üä‘{þ…œîÕïJƒ­kÓpç¶”êaô5 ÀÓùè›â¿'jF”bÀAVZèU߸6ú нòáw‰$I’ž]ëŒW¥îú%©¿eUªvlNiЉ> uÎÿõð™¥p•‡zýÏ.~†@ ¶]~—H’$-äZ+IuÇ¥Þ¦ÉTmßêöÑ'"ìSû#ÿ>üû¦ffÀA)deÀ¡…^gí[¢Ÿ!Ðu÷é=¿’;ú6‘$IZµN<:uÖ›z—îù(”z×Ñç ´öY¯ÿ^ª™pPŠYph¡×:é%>+Ø£sÞ¯†ß&’$Ic×Ä©½zñžBÜznîÜæïbiíU?ÿýU32à ²2àž—†ßÙý€èßxrø]"I’4…Ò½ìí©¿eUªvlNiЉ>ó`^µNÿ±ðï·š™¥p•‡ô¼4¸ý¢è§4ÀðÛ·‡ß%’$I£Tkå+RçâßKý›NIÕý7¤ºóTôIÙµNyYø÷`ÍÌ€ƒR 8ÈÊ€Cz^ê^õWÑOh‚ºÞóoŒFß&’$IM¬uâ¤Î…¿‘z×½7U_¿2ÕO?}½@ˆ©åÏÿ¾¬™pPŠYpHÏÛó9¬Ó¦‡Ñ·‰$IRxGìùû’îú%ipë¹i¸s[Jõ0úT€xƒNü÷ií3J1à +éyijÙa©n?ý€¨îº*þ6‘$I*Üôo!ë^ööÔß²*U;6§ÔoGŸeÐHõÔÎðïÛÚw”bÀAVÒÞª»ÿ)ú9MЛJSË ¿M$I’rŽ5:ëŽK½M“©Ú¾!Õ­Ç£/0Ã'¾þ½\û΀ƒR 8ÈÊ€CÚÛôç·Lë¬}søm"I’4µV¼(uÖ›z—¦ÁÖµ{? ˜µá#·…@Ø[˜ IDAT×¾3à ²2àöÖ9ÿ×¢Ÿ#Ðý[Î ¿M$I’¹‰#R{õâÔ]¿dÏG¡Lÿ¦T£O++ÕŸÿž¯}fÀA)deÀ!ýNøþ”ª^ô“ ~ê¡øÛD’$é ? ¥ó©©Ú±9¥~;úŒ€±WÝuuø  }gÀA)deÀ!}¯á·n‰~’@C´ÏüÙðÛD’$éŸkô’Թ詷i2UÛ7¤zê;Ñç,HÓI}hßpPŠYpHß«ÿù3¢Ÿ$нëÞ~›H’¤…YkÅ‹Rgͱ©·qéžH4ܹ-¥ºŽ>»Úè 8(Å€ƒ¬ 8¤ïÕ½ä÷£Ÿ$ÐÕCŸ¿M$IÒhâˆÔ^½8u×/Iý-«ö~JÕ>…€ýèßxrüý }fÀA)deÀ!}¯Ö©/~’@S «Ô:åeá÷‰$IÏz×üß©zè )õÛÑWpz×~GhßpPŠYpHÏ®Þuô³búß„¾M$IÒx6|ôkѧ0 ½ ~GhßpPŠYpHÏn°õcÑÏhˆÁ—…ß&’$i<«Ÿz(úÔf¡{ùŸ†ßÚw”bÀAVÒ³ë~ò¯£Ÿ%Ðuç©45ydø}"I’ƯºûLô©ÌBgÝqáw„ö¥p•‡ôìÚgþlô³¤sÁÂïI’4fM,J©®£Ï`:çÿZü-¡}fÀA)deÀ!ýÿZvXªÛOD?M !úŸü}"I’ƪÖ)/>q€YjŸõšð[Bû΀ƒR 8ÈÊ€CšYuϧ£Ÿ&ÐÃÇï¿M$IÒxå.Àèjñãá·„ÜXÄ2à +if½ëÿ>úi ÒþàO†ß'’$i|jŸóÚèó˜¥éߤ}Kh?7–…p•‡4³éϺøg½O¿;ü>‘$IãSçÂߌ>o€Yšš<2ü–о3à ²2àöÑ /H©êG?O !ªû7Åß'’$ilê^úÑç 0ýVø¡ýgÀA)deÀ!í»áÃ_Ž~ž@STýÔ:é%á÷‰$IºW¾#úºf¡Þýhø¡ýgÀA)deÀ!í»þ–UÑÏhîå~ŸH’¤ñ¨wÍ‹>m€Y>~Oø¡ýgÀA)deÀ!í»îeo~ž@ƒ î¼<ü>‘$IãQÿ¦÷EŸ6À, ¿uKø¡ýgÀA)deÀ!í»ÖÊWD?O AêÞî4µü¨ðE’$~ƒ¯\}Ú³PÝý©ð;BûÏ€ƒR 8ÈÊ€CÚõ“F?Q A:û­ðûD’$~Õö Ñg 0 ƒÛ/ ¿#´ÿ 8(Å€ƒ¬ 8¤ý7øêÇ£Ÿ(Ð ƒ[Ï ¿O$IÒè7ýë×€ÑÓß|Zø¡ýgÀA)deÀ!í¿Þ†¿~¢@ƒÔ»KSË¿Q$IÒhWïº?ú¬f¡wíñáw„öŸ¥p•‡´ÿÚg½&ú‰ Ó>÷ ¿Q$IÒhWwŸ‰>i€Yè^õ—áw„öŸ¥p•‡t€–žêÎSÑÏhþͧÆß(’$it[þüès˜¥ÎÇ7þ–Ð~3à ²2à\õk£Ÿ)Ð ÃïÞ~ŸH’¤Ñ­uÚ+£Ï`–Úk~%ü–Ðþ3à ²2à\oÓDô3¦ý¡Ÿ ¿Q$IÒhÖ>çßEŸ2À,µWýTø-¡ÜYbÀAVÒë\ø›ÑÏh˜ÞµÇ‡ß(’$i4ë|ôMѧ 0K­“(ü–Ðþ3à ²2à\kÅ‹R¢Ÿ*Ð Ãon ¿Q$IÒhÖ½âÏ£O`6†UšZvxø-¡ýgÀA)deÀ!=wÃG¾ýT€&©‡©µò˜ðE’$^Ó¿É =õîÇÂï8J1à +é¹ëquôS¦{õ»ÂoI’4zù;MÃÛÂï8J1à +é¹ë~âO¢Ÿ*Ð0Õ=ÃoI’4z ¶­>c€Y¨¼1üŽÐ3à ²2àž»Öi?ýT€¦tSË--I’±á7¿}ų0=ÂŒ¾#tà 8(Å€ƒ¬ 8¤ƒ«~ê›ÑÏh˜îeo¿Q$IÒhåï`4 ¾ü‘ð;B΀ƒR 8ÈÊ€C:¸w\ý\€†|íâðE’$PËO©êGŸ0À,ôo<9þ–Ð3à ²2à®Þ§þsôs¦î>“¦–~§H’¤Ñ¨uêË£Ï`–zŸþ¯á·„œ¥p•‡tpµÏþ…èç 4Pçã¿~§H’¤Ñ¨}Îk£O`–ºWüyø-¡ç¸µ 8(Ä€ƒ¬ 8¤ƒlbÑžËà_ÜþÑø;E’$DÓÃO`4u>ú¦ð[B΀ƒR 8ÈÊ€C:øªû®~²@ÃÔ'ÓÔä÷…ß)’$©ùu?ù7ѧ 0KÓ¿I+ú–Ð3à ²2à¾þg—G?Y :kß~§H’¤æ×ÿ܉Ñg 0K­÷ÿ›ð[B΀ƒR 8ÈÊ€C:ø:þfô“hpÛyáwŠ$Ij~ƒ¯®‹>[€Yš:áá·„œ¥p•‡tð‚”ª^ô³¦n}7MM«H’¤FW=ôù賘…º½+üŽÐsgÀA)deÀ!ZÃoÝýl€šþM]ÑwŠ$Ijvõ3DŸ,À, wn ¿#ôÜpPŠYpH‡VóéÑÏh þ—Î ¿S$IRƒ[~TJõ0údf¡ºïºø[BÏ™¥p•‡thu>þ»ÑÏh z÷cijbQø­"I’šY{ÕOGŸ+À, n¿(ü–ÐAÜ[bÀAVÒ¡Õ:ùý3À>uÎÿõð[E’$5³ÎGß}ª³Ô¿ñäð[BÏ¥p•‡tè »#úé Ôÿâêð;E’$5³î'ÿ&úTf©÷©ÿ~Kè¹3à ²2à½þ—ÎŽ~º@ÕO?œ¦–~«H’¤æÕ¿ùÔèS˜¥Î%o ¿%ôÜpPŠYpH‡^÷ýt€†j¯ù•ð[E’$5¯ÁŸˆ>S€Yjä߇ßzî 8(Å€ƒ¬ 8¤C¯µò˜è§ 4Tÿóg„ß*’$©y þrô™ÌRë´W†ßzî 8(Å€ƒ¬ 8¤Ù5|â¾èç 4PýäŽ4µì°ð[E’$5«ºõÝè3˜z˜¦& ¿%ôÜpPŠYpH³kpûEÑÏh¨ö‡ÿ×ð[E’$5§Ö)/‹>O€Yªw?~Kèà2à ²2àfW÷ÊwD?_ ¡úŸø­"I’šSç¼×EŸ'À, ¹-ü–ÐÁeÀA)deÀ!Í®ö2úù U?ý­4µìðð{E’$5£îU}ž³Tmß~Kèà2à ²2àf_ýÌ#ÑOh¨Îy¿~«H’¤fÔß|ZôiÌÒàË¿%tppPŠYpH³opç'¢Ÿ0ÐPý[Î ¿U$IR3šþ7w€ÑÔ»aYø-¡ƒË€ƒR 8ÈÊ€Cš}½Oýçè' 4T=õ45qDø½"I’â>~OôiÌÒôG¡Eß:¸ 8(Å€ƒ¬ 8¤Ù×>ë5ÑOh°ÎEÿ!ü^‘$IÁM™RÕ>K€Yê¬}Kü=¡ƒÊ€ƒR 8ÈÊ€CšCËOuû‰èg 4Ôà¶óãïI’ZûC?}’sÐ>ëÕá÷„òî2à ²2àæVu÷§¢Ÿ1ÐPuçÉ4µüùá÷Š$IŠ«sñïEŸ$À´NyYø=¡ƒË€ƒR 8ÈÊ€Cš[½Ïü?ÑÏh°ÎÇ'ü^‘$Iqõ®=>úfkÐMSË ¿'tppPŠYpHs«}î/G?c Á_»8ü^‘$Iq ¶~,úf©~òÁð[BŸ¥p•‡4Ç&LuowôSjúN˜:áñ7‹$I iøèW£Ï`–ª›Ão |”bÀAVÒÜ«¾ñ™è§ 4X÷²? ¿W$IR@“G¦Tõ¢O`–_]Oè 3à ²2àæ^ïº÷F?e Á_ÿÇð{E’$•¯}Ö«£Ï`úŸ[~Oèn/ 1à +iîµ×üJôSšlÐI­“^~³H’¤²u¯øóè+˜ƒî•ï¿'tðpPŠYpHóô+Q{SÑÏh°îú¿ˆ¿Y$IRÑú›O‹>A€9è\ð†ð{BŸ¥p•‡4?U÷]ýœ€«îùtø½"I’ÊVÝ{Mô ÌA댿'tðpPŠYpHóSïú¿~Î@“ ©uê„ß,’$©\õîG£/`¶†ƒ45qDø=¡ƒÏ€ƒR 8ÈÊ€CšŸ:ç½.ú9 ×Û¸4üf‘$Iej½ï‡£O`ê' ¿'thpPŠYpHóÔä÷¥Ô›Š~Ò@ƒ ¾5þf‘$IEê\ôÆèÓ˜ƒêφß:´ 8(Å€ƒ¬ 8¤ù«ºïúè' 4\{õâð›E’$å¯÷éwGŸÀ ¾raø=¡CË€ƒR 8ÈÊ€Cš¿z7,‹~Ò@Ãõo:%üf‘$IùÜqiôÙÌÁôß÷Gß:´ 8(Å€ƒ¬ 8¤ù«sÞ¯F?i áê§JSË¿[$IRÞê]÷GŸÀt¯øóð{B‡–¥p•‡4M~_JýVô³®sÁëãïI’”­Ö)/M©®£O`:ç½.ü¦Ð¡eÀA)deÀ!ÍoÕŸ~Ö@à ¾rAøÍ"I’òÕùØoEŸÀµNûÑð›B‡–¥p•‡4¿õ6MF?k áêîÓiê„„ß-’$)OþnFÜ ëãOG0J1à +i~ëœÿëÑÏÝOüqøÝ"I’òTݳ1úÔæ`øø=á÷„=J1à +iž[þü”úíè§ 4\u÷?Åß-’$)KõÔÎèS˜ƒê׆ß:ô 8(Å€ƒ¬ 8¤ù¯zàsÑOhºá µN}yøÝ"I’æ·Ö¯Š¾2€9|ù#á7…=J1à +iþëvyôÓF@oã ¿[$IÒüÖýÄŸDŸÀõ®{OøM¡CÏ€ƒR 8ÈÊ€Cšÿ:¼!úi#`øÈmáw‹$IšßúŸ?#úÄæ¨û‰?¿)tèpPŠYpHZ~TJƒNôóF@{õâøÛE’$Í[ÕC_ˆ>/€9jä—Âo z”bÀAVRžª>ý¼€Ðß|zøÝ"I’æ©^RÕ‹>/€9j½ï_Åß:ä 8(Å€ƒ¬ 8¤<õ6MD?o`Ô»KS“G†ß.’$iîu.üÍèÓ˜£ºûtøM¡ÙeÀA)deÀ!å©sÞ뢟70":¿5üv‘$Is¯ÿÙåÑg0GÃo})ü¦Ðì2à ²2à25ydª{»£Ÿ80ªíŸŒ¿]$IÒœ«ølôYÌÑ`ëÇÂo Í.J1à +)_Õ½×D?q` ©µòá·‹$IšC“ß—R¿}UsÔ»þïãï Í*J1à +)_½kÿßè'ŒˆÞµÇ‡ß.’$iöuÖ}Nó {é†ßš]”bÀAVR¾ÚþÅè'Œˆáã÷¤©e‡…ß/’$ivõ®{oô9̃ö™?~WhvpPŠYpH›X”êö®ègŒˆÎy¯‹¿_$IÒ¬ò1ª0êaš:áûÃï Í.J1à +)oÕ]WE?s`D ¾raøí"I’fù/ptžŠ>%€9ªw=WhÖpPŠYpHyëýÓÿýÌ€QÑ›J­¿_$IÒ¡å#T`~wô“FHÝ}:µV¼(ü†‘$IûhùQ)õ[Ñç0OÚgÿ|ü}¡9eÀA)deÀ!•«ÿ¥s¢Ÿ<0bºW¿+ü†‘$I3ë¬ûíè3˜/u¦V¼0ü¾ÐÜ2à ²2àÊÕ½ô£Ÿ<0b†ß¾=ü†‘$I3ܺ&úLæIýÔC᷅枥p•‡T®ÖÉ?”Ò°Š~öÀˆiŸûËáwŒ$IúM,JõÔÎè˜'Õ½×Äßšs”bÀAVRÙ†9úÙ#fpûEá7Œ$Iú^ó-ú<æQÿæ•á÷…枥p•‡T¶þM§D?{`ÔôÛ{~“Wô#I’öÖÿ£¯`u¯øóðûBsÏ€ƒR 8ÈÊ€C*[ç‚7D?{`õ>ýîð;F’$í­Þõ@ôiÌ£öY¯¿/4÷ 8(Å€ƒ¬ 8¤Â-~J½©è§Œ˜áã÷¤©e‡Åß2’$-ðÚgÿ|ôY̧ª¿çïí£o ÍÃfÀA!deÀ!•¯º÷šè§Œ ÎÚ7‡ß1’$-ôúŸ[}óhøØá÷…æ'J1à +©|½kþ[ôÓFÐô4úŽ‘$i¡7|ìÎ蓘Gƒ¯~<ü¾ÐüdÀA)deÀ!•oúóôY]§ö‡þmø-#IÒB­ýŸˆ¾€yÖ»öøðCóu«pP†YpH-;,Õ»~þÀêéìø[F’¤Zïº÷DŸÀ<ë¬ûíðCó“¥p•‡Óô¯e8dýVjüCá·Œ$I 1Ÿã§uÚ+Ão ÍO”bÀAVRLÝüÑÏQ½Ïü]ø-#IÒB«}öÏGŸÀ<«Û»Âo Íã½fÀA!deÀ!ÅÔZùŠ=Ÿcp¨ê'w¤©‰#ÂïI’RýͧGŸÀ<«¼1üÆÐüeÀA)deÀ!Å5Üùõè/Àˆê^òûá·Œ$I ¦e‡§úéoEûæYÿ–3ãï Í[”bÀAVR\ý-ŠþŒ¨êÁ›ÂoI’J 3ú[?A÷êw…ßš¿ 8(Å€ƒ¬ 8¤¸:뎋þŒ°ö‡1üž‘$i!4øÊ…Ñßö€ Úçþrø¡ùË€ƒR 8ÈÊ€CŠ«uâÑ)Uýè/ÀˆÜþÑð{F’¤±oùQ©î<ým˜ou½çïèÃo Í[”bÀAVRlÓ¿þ`VÝÔ:õGÂïI’ƹîeýÈ Þuø¡ùÍ€ƒR 8ÈÊ€CŠ­wòè/ÀëîÄð{F’¤q®ÚþÉèo÷@Õׯ ¿34¿pPŠYpH±MÆÀlÕí'RkÅ‹ÂoI’Ʊ֩/÷ѧ0¦úŸ[~kh~3à ²2à‚›X”êö®è/Àë}úÝñ7$IcXïº÷F›2é^ú‡á·†æ7J1à +)¾é_Õ0[õSßLS“G†ß4’$UËOõ®û£¿Í™´Wýtü½¡yÍ€ƒR 8ÈÊ€CНûÉ¿ŽþRŒ¸îú¿¿i$I§:}Sô·w “º·{ÏX3úÞÐüfÀA)deÀ!Å×:ýÇ¢¿#nø»üå“$Ió˜ß– ã«zðÆð[CóŸ¥p•‡ÔŒ†ßÙýåquÇ…ß4’$C­S_žRÕþÖdÒß|zø½¡ùÏ€ƒR 8ÈÊ€CjFý/|0úË0âª7‡ß4’$C½þ!úÛ:Q÷~ohþ3à ²2àšQg훣¿c ½æWÂïI’Fºe‡§úÉ£¿¥Mÿƒþð›Cóž¥p•‡Ô–•R¿ý%qÕ]WÇß5’$pµo‰þvdT·ŸHSË ¿94ÿpPŠYpHÍ©º÷šè/ À¨«‡©ý¡~×H’4ªM!€ñUÝw}ø½¡<pPŠYpHÍ©·ñ¿DIÆÀ`ëÚð»F’¤Q¬uÆ«RVÑßÊ€Œú7~s(O”bÀAVRsjèg¢¿$ã`X¥öªŸ ¿m$Iµú·œý]ȬsÉÛÂoåÉ€ƒR 8ÈÊ€CjVõ®¢¿,c`ð• ÃïI’F©ÖÉ?˜êÞîèoá@f­Ó,üîPž 8(Å€ƒ¬ 8¤f5øòG¢¿,ãò[8>ø“á·$I£Rïú¿þî dVï~,üæP¾ 8(Å€ƒ¬ 8¤f5ýëÛæÃà¶óÃoI’F¢åÏOõ3ߎþÖ dVÝý©ø»CÙ2à ²2àšUëÄ£SªúÑ_€qPõS댿o$IjzÝ+ßý]( ·i2üîP¾ 8(Å€ƒ¬ 8¤æU=xcô—`L n]~ÛH’Ôè––†;·EË è¬ûíøÛCÙ2à ²2àšWïº÷FiÆ…ßÂ!IÒë|ì·¢¿[…´N}yøí¡|pPŠYpHÍ«}ö/DiÆÈàË ¿o$IjjÕý›¢¿UÔO=~w(o”bÀAVR[vXªw?ýåU/µNÿ×ñ7Ž$I «}ο‹þ. R}ýÊðÛC™o; 1à +©™ ¶®þòŒ¿…C’¤™Uw]ý-(¤wý¿=”7J1à +©™u/ÿÓè/À8©ú©ýŸ¿q$IjÔoߨëèïÐ@!‹þCøý¡Ì÷…p•‡ÔÌZ§¼,¥zý%#ƒ¯]~ãH’Ô”ª»?ý­(¥®Së”—†ßÊ›¥p•‡Ô܆ßúRô—`œÔÃÔ>ûçÃoI’¢køýö X@†O|#üþPÏ€ƒB 8ÈÊ€Cjn½MÑ_"€1SÝóéðG’¤èª»ÿ)ú[2PÐàö†ßÊŸ¥p•‡ÔÜÚç¼6úK0†:¼!üΑ$)ôgm¿}”îÕï ¿ATàÎ3à ²2àܲÃRýôÃÑ_&€13ý1mÓwFø­#IR@Ó¿ XXÚ«‡ß ÊŸ¥p•‡Ôì·ýeC‹ß~çH’Tºö‡Ño߀¦nïJSË¿CTàÖ3à ²2àš]ç’·E™ÆÐð±;ÓÔÄ¢ð[G’¤’U÷^ý-(¬ºûŸÂo•É€ƒR 8ÈÊ€Cjx+^˜Ò ý¥CÝüñ·Ž$I…ê\ðúèo½@€Þuï ¿CT&J1à +©ùU߸6úK0†ê§JS'|ø­#IRö–ž†ß¾=ú[/ sþ¯Åß"úÿØ»ï¸ÏêúÎû†f!öÅÕx'5FMâmÚ¦X’5&z»f]w’ML»]cÈš½f†Ä¡Dªˆc¡)E:¢CŸ†™ßùõs¾÷㺒¸(eÚuÎç”çóñxýµ}l‰ó¹¾ßÌ•ªÈ€ƒªpP*©þ¾úѧh©Ñÿ;ü­#IRÙ ÏúHô\ Ât”z»?=ü-¢j2à *”Ê€CªÙA/‹>@[³”ðâð÷Ž$I¥µûÓS±þî蟸@€üîËãß"ª,ªbÀA© 8¤f”?øÝès´ÔäúãÃß:’$•Õø¢Ý£ÔAÆ—þQupPJeÀ!5£ñeFŸ  ­Š<õ|Cø{G’¤ù.[ú¢”F½èŸ´@ÁÉþQupPJeÀ!5£Á±¿}.€¶ÿµ²3 Âß<’$Íg“oý#ˆR)Û÷'Âß#ª.ªbÀA© 8¤†´x‡T ‰>@‹ O{_üÏ‹]Ç IDAT›G’¤yªøëæþ–) ›ò¿þQÅï?*bÀA© 8¤æ4¹éôè“´X±þîÔÛýéáoI’æ£éª ¢´&×þQµpPJeÀ!5§á™Š>@ËÎû_áoI’¶µÙ¿U è¶áÿ<üM¢j3à *”Ê€CjN³¿¯Ï_ÿ ”©mLÙÒ]Ãß=’$mmÙ^ÏJņ5Ñ?R€`ýƒ_þ.QµpPJeÀ!5«üž+£ÏÐr“›ÏóH’´µ¯:<úG)¬ÈL½™áïU›U1à TR³]0}6€œøŽðw$I[ZÿÈ7¤”O£ŒÁ¦·~)ü]¢€· 1à TR³êñKÑgè€â‘;Sog„¿}$IÚìmŸò5×Gÿj`´âŸâß&ª<ªbÀA© 8¤†5³ VGŸ Æ_ß3þí#IÒf6:÷Ñ?:€š|ú7Ãß&ª>ªbÀA© 8¤æ5¹æ˜èÓtÁd˜úË^þö‘$iSe¾4¥Q/ú''P£^ê-Þ1ü}¢ê3à *”Ê€Cj^ƒß}:€Ž˜Þñ¹¿,úý#IÒS5½uyôL &¦+Ï ›(&ªbÀA© 8¤¶d§T 7DŸ #†§ þý#IÒ“4<í½Ñ?*€­ø§ð÷‰b2à *”Ê€Cjf“[ÎŒ>@GïKÙÞÏ ÿH’ô£eû#@¯:"ü$IêXKvJù}7FÿjjxÖGâß+ Í€ƒªpP*©Ùõ|Côº¨(Ò೿þ’$u§ñeFÿôjlöWŽG¿W›U1à TRÛYŠGï‰>%@½µ)Ûï'ãßC’¤Ö78ñí)yô> ¦Š‡W…¿WŸU1à TRó›ý+Ì"L¿svø[H’Ôî²_’Šì¡èy@M®9&üÍ¢ø 8¨Š¥2àšß೿}J€žý—áï!IRK[²sÊW_ý£¨¹áçßÿnQxTÅ€ƒRpH-hñ©<}N€®g©¿ìño"IRëš\ûéèŸr@ÝEÊöû©ðw‹â3à *”Ê€CjG“›>}N€ËW_—z‹w I’ÚÓð ýã h€üþ›Âß-ªGTÅ€ƒRpHíhxú¢Ï Ðqã‹÷ I’ÚQÿ°_œûž6e|ùÁáoÕ#ªbÀA© 8¤v”íõ씦ãè“tY‘§ÁqoI’š]¶×³R¾neôO5 !'¿+üý¢zdÀAU 8(•‡Ôž¦·}R€Ž+zkS¶ôEáï"IRC›Y¦ß9;úÇÐùdî_n èpPJeÀ!µ§ÑWþ.ú¤¤é—¦Þ¢íÃßF’¤æ5:ÿ_¢ŒMûçϼaT 8¨Š¥2àÚS¶t×”Š"ú¬¤ñ¥„¿$IÍjxêŸÌý:.€Í5:ÿ“áoÕ'ªbÀA© 8¤v•ßseôY˜•OyOøÛH’ÔŒúG¾!¥qýÓ h˜þᯠǨ>pPJeÀ!µ«Ñ¹Ÿˆ>+sŠÁ#sO¢ßG’¤z—øÒTl¼?úÇÐ0ņ5©7³ ü-£údÀAU 8(•‡Ô®²ƒ^}V~ _}]ê-Ù9ü$IªgÙ^ÏNù߉þq4ÐäºcÃß2ªWTÅ€ƒRpHí+_s}ôiøÉ·>þ>’$Õ°Å;¤émçGÿ˜jxêÇ¿gT« 8¨Š¥2àÚ×èü‰>-?dtî?†¿‘$IõjrõQÑ?ž€¦Ê's“Wô{FõÊ€ƒªpP*©}õ—½<ú´ü°"OƒßþN’$Õ£ÑùŸŒþÉ4Øôö¯‡¿gT¿ 8¨Š¥2àÚY¾öæèóðCŠÁ#©¿ìáï$IRlÃÏ¿?¥¢ˆþ±4ØhÅnáoÕ/ªbÀA© 8¤v6¾hIôyxœüÁï¥lïç„¿•$I1 >û{)M†Ñ?Ž€†ëúšðwê—U1à TR;›}ÀÔÑô¶óRoÑöáï%IRµ Ž{SJ“Aô! áŠGïI½™áoÕ/ªbÀA© 8¤ö6ûo¸ÔÑøÊÃÂßJ’¤êêýk©mŒþñ´ÀäšcÂß6ªgTÅ€ƒRpHím|ñ>Ñ'àIÎýDø{I’T~ýÃ~1ýuÑ?v€–œüGáïÕ3ªbÀA© 8¤öÖ?â—£O À“+Š4<ãƒáo&IRyõ—½<ïþ‰´Åt”²=w 㨞pPJeÀ!µ»âáUÑgàÉMGipÜ›ÃßL’¤ù/;à?¥bý]Ñ?i€™®º ü£úfÀAU 8(•‡ÔîÆ—}fžR1XŸú‡¾&üÝ$Iš¿²¥/JÅ÷GÿˆZftÎÇÃß9ªoTÅ€ƒRpHí®ô¯EŸ€M*¹3eûÿtøÛI’´íÍÞóü[£´-Ô?äUáoÕ7ªbÀA© 8¤–7³ ëïŽ>5›”ßSÊö~nüûI’´Õe¾$å}?úG ÐB³¿š-ú­£zgÀAU 8(•‡ÔþÆW}j6K~ÏU)Ûs—ð÷“$iËë/{…(ÍøªÃÃß;ªwTÅ€ƒRpHíoð™ßŽ>5›mºêÂÔ[²søJ’´ùõ]*zk£„-6øÜ„¿yTï 8¨Š¥2à:ÐÌv©Ø°&úÜl¶é­_J½EÛÇ¿£$I›¬äR‘=ý£h±b¸ÁÐ_›Ì€ƒªpP*©M®>2úÜl‘É 'Î Q£ßQ’¤'opÜ›Sõ¢d-7ùö©áïÕ?ªbÀA© 8¤n48öw¢Ï À›¡öf„¿¥$IopÒ;Sš ¢T0üüÿþöQý3à *”Ê€CêЯQyôÞè“°Å&×~ÚßÄ!I5køù÷§4Gÿˆº`2LÙž»„¿Tÿ 8¨Š¥2àºÓøòeÑ'`«Œ¯:ÜßÄ!I5iôµ¥TäÑ?€Ž˜~÷+áï5#ªbÀA© 8¤îÔ?ú×¢OÀV›\sŒ¿‰C’"[´0¯<4úÇÐ1ó>ÿR#2à *”Ê€CêP3 RñÈÑg`Gþ&IªºÙ¿¶|öß~¨T>MÙ¾/ ©pPJeÀ!u«ñ%ûGŸ€m2¾ê#Iª°ìÀ—¦|íÍÑçè é‡¿…Ôœ 8¨Š¥2àºUÿð×GŸ€m6¹á¤Ô[´}øÛJ’Ú^ÿ¨7¦bãýÑgè¨ÑWÿ!ü=¤ædÀAU 8(•‡Ô½ò¾}z¶ÙôÖ/¥Þ’ÃßV’ÔÖ†§þIJã~ô¹:,;ègÂßDjNTÅ€ƒRpHÝk|Ñîѧ`^L¿÷µÔÛýiáï+Ij[£¯þ}JE}æ€ËW_þ&R³2à *”Ê€Cê^ýC^}zæõw"gþ¹F’æ§ÝŸ–&ßú\ôiH£ fâßFjTTÅ€ƒRpHÝ,¿ïÆèó0oò{¯NÙ¾/cIR“›ý+Êó5×GŸt€9ýC!ü}¤feÀAU 8(•‡ÔÍFç2úüÌ«âáU©¿ìåáï,IjbƒÞ–ŠþºèS0'_·2ü}¤æeÀAU 8(•‡ÔͲƒ^–RQDŸ €yUd¥þ1¿þÖ’¤Æ4³ Vì–R‘GŸp€_²ü;IË€ƒªpP*©»ÍþUã­3ê¥Á‰ïkIRÝËöy~š~ï«ÑWàqúGÿjø[IÍË€ƒªpP*©»Îùxô (G>MÃ/ýUø{K’êÚà3¿•ŠGï¾ÖSlXz3Û…¿—Ô¼ 8¨Š¥2àº[¶ÿ ý5¹@«/Ùoî×D¿»$©V¿2嫟Òt}¢žÐøª#âßLjdTÅ€ƒRpHÝnzç%Ñg T“ëŽK½Å;„¿»$©#þémçGŸe€§48þ-áï&53ªbÀA© 8¤n7úòßDŸ!€ÒÍþ–™ö‘Ôᆧ¼'ÙƒÑçà)ïK½E ÃßNjfTÅ€ƒRpHÝ.Û÷)å“èSPºüþo§lé‹Âß_’TeÙž»¤É5GGŸ`€Í2¾üàð÷“š›U1à T’¦·}Š*Q<|{ê/{EøûK’ª¨̯§âáUѧ`³Í¾_¢ßPjnTÅ€ƒRpHžùáèSP™bøhœô‡áo0I*­%;§ñ%û¥”O£O.Àf+Öß•z3 âßRjlTÅ€ƒRpHÊöxfJ£^ô9¨N>M£»…¿Ã$i¾ëý«)à;ÑW`‹/Þ7ü-¥fgÀAU 8(•‡¤Ù&7ž}Ž*7ûêíþ´ð·˜$msþÖ  áú‡½6þM¥FgÀAU 8(•‡¤Ù'¼-ú„Èï¹2eKw IÒÖ68öwRþàw£Ï)ÀV›ýÄ¢ßTj~TÅ€ƒRpHškÑö©Øx_ôIQd¦Ág?þM&I[P¶÷sÒ䚣S*Šè3 °MFÌ„¿­Ôü 8¨Š¥2àô¿ù©è“§(æ~ý@oÑÂðw™$mªáiïMEïèË 0/úË^þ¾Ró3à *”Ê€CÒÔ?â—¢O@¸éÊsS¶ÏóÃßf’ôDõyUšÞ~Qô©˜7ùêëÂßXjGTÅ€ƒRpHzlùÚ›£Ï@¸âÑ{ÓàØß ›IÒ”íùãi|Ù)MÇÑ'`^ÎýÇð·–Ú‘U1à T’Û輎>Kõù•*—/K½Å;†¿Ñ$u»Á‰ïHÅú»£¯"Àü+Š”ø’ð÷–Ú‘U1à T’[vÀ‹S*òèÓPù½×¤þ§~.ü&©{õü•4½óÒè3PšÙ·Nô›KíÉ€ƒªpP*I?šß§ ðÃŠÑÆ4ü⟧Þ̂𷚤n ë'7œh\´ÞhùGÃß^jOTÅ€ƒRpHúцg}$ú4ÔÒt効ÿb5ú½&©¥íñŒ4Z±ÛÜh  õòIÊöý‰ø7˜Z“U1à T’~´lÏOiÜ>OµT Ö§áYþf“Ô¢ï†_ú«Tl¼/úÄT:‡©UpPJeÀ!鉚|ûÔèóPkÓï~%eK_þn“Ôàf¶KÃÓ?òu+£O@å†g~8þ=¦VeÀAU 8(•‡¤'jpâÛ£Ï@ýzs¿î ·haøûMR³ÿ–”¯¾.úŠĘ S¶×³ÂßdjWTÅ€ƒRpHzÂmŸŠÞÚèÐù=W¥þᯋÃIª}ƒãÞœ¦w^}¶BMnþBø»LíË€ƒªpP*IOÖøòƒ£O@sä“4¾|YÊöÜ%ü'©~ Žù4]uaô¥¨…Áçþ ü}¦öeÀAU 8(•‡¤'«ä¢O@ãÞ›†g|0õf„¿ç$Õd¸qûEѧ  6Š÷Íý ÐÑï4µ/ªbÀA© 8$=Uù·FŸ)€FšÞñÔ?ìµáï9IÍl—§¼{î×+ðÃÆ—ìÿ^S+3à *”Ê€CÒS5:ÿ“Ñg  ¹òi_uDÊöy^ø»NR-Þ1 Ïúˆ!<ÀSèüÊøw›Z™U1à T’žªlé®sÿÅ[¯è¯K£s>žzKvßIšÿ²=wI£sþg*½'úÜÔZ~÷áo7µ7ªbÀA© 8$mªé÷ω>U­0û_îÏþËÔ[´0ü'iÛËöa]¸xn¤À¦ÍýóP ÞqjgTÅ€ƒRpHÚTÃÓÞ}ªZ%_{ËÜ+ú'iëêñËiò­RÊ'Ñç 9&ƒ”íõìð·œÚ›U1à T’6ÙâS‘=}®ZgzÇ7Òà3¿ÿÞ“´é–윆g|0å÷^}:irãÉño:µ:ªbÀA© 8$mNãË—EŸ+€ÖšÞyiû»áo>IOüx|É~©è=}*mpü[ÂßvjwTÅ€ƒRpHÚœú‡¾&ú\´Þt幩ô¯†¿ý¤Î·haœôÎ4ýþ9)yôih¼bý]©7³]ü;O­Î€ƒªpP*I››¿* ÓÛ/JƒÏþ~øûOêäß¶ñõ=S±þîè3Ð*³o¬è·žÚŸU1à T’6·Ñò¿Ž>Y’ßwcžñÁÔ[´}ø[PjmKvNÃÓÞ›¦·ŸRQDÿ±hŸ¢HýýÙøwŸZŸU1à T’6·l¯g§4îGŸ-€ÎÉ×­œÓööxFø›PjE3 ÒàÓ¿™&׊Áúè?â­6½ãâø÷Ÿ:‘U1à T’¶¤É 'EŸ-€Î*†¦ñåËRvàKÃß…Rëüóitáâ¹QÕžõgáï@u#ªbÀA© 8$mIƒãÞ}¶È§irË™ið™ß Ju/Ûÿ…iôµ¥|õµÑr:§mLÙÏ ªpPJeÀ!i‹šYòu·EŸ.þ]þÀ­i´b·”íó¼ø·¢T“²}žŸ†g|0Mo]žR>‰þc ÐY“ëª;pPJeÀ!iK]¸(útð£&Ã4¹éô48þ-s£Ûè7£TuFõão T•pPJeÀ!iKËxqJE}¾xùÚ›Óèœÿ™²ý:üí(•YÙ+ÒhÅ?¥é]ßôÏ(53û79—«Ê 8¨Š¥2à´5MWž}¾Ø”"OÓ;/MóÿÒïV;šÙ.õøå4ºpqÊW_ý' €§0:÷ñïGu*ªbÀA© 8$mMÃÓÞ}¾ØÅpÃÜû+‹†¿'¥Í-Ûû9sÿü1¹î¸Tl¼?ú›c2œûwÑoIu+ªbÀA© 8$mU‹wLEö`ô `+ýuiò­ÒàÄw¤Þââß–ÒÔ?äUi´b·4½íü”¦ãè?2l¡É '†¿)Õ½ 8¨Š¥2à´µ/?8ú„°fG¹“kŽNƒãß:7Ò~cª›eKwMÃ3?<÷¡¿Øx_ô ¶Ñà˜ßcª{pPJeÀ!ikëúšèÀ|gizëò4<û/S¶ßO…¿7ÕÞ²=ž9÷ë|Æ—ì—òÕצTÑÿé`žä÷ÝþÞT73à *”Ê€CÒ¶”ß{Mô  ù4Mï¼$VüSêö‹©7³ üí©æ–íû‚48åÝi|ù²”¯¹~î?_´ÓhùGÃߟêfTÅ€ƒRpHÚ–†_üóè3@Š÷§É '¥á™JÙþ/ ‡ª¿åôÿš&W™òµ·ø6:¢nH™ÿÞIApPJeÀ!i›Ú㩬>eT,_{s_~pžúÇ)Û÷'âߥŠkÉN©ô¯¥Ñ×>–&7!ÞýO‚ÌxÃß§êlTÅ€ƒRpHÚÖÆW}Ê–?pkš\sL~á¿¥ì€ÿþFUI-Z˜ú‡¼* ¿ð§iüÍO¥üîËSš £ÿã@Mô{mü›UÍ€ƒªpP*IÛÚì\%2UlX“¦·.O£ §Á‰ïHÙ>Ï·j [´ý¿5Îø`_¾,Mï¼4¥Q/ú?ZÔÔô®oÆ¿aÕé 8¨Š¥2à4Í}Ì€'S)ð»irÉitÎÇÓàø·øÕ+uifAÊú™¹¡Í輞ûŸQ¾æz³[dvøþ¶U§3à *”Ê€CÒ|4ûW(À–*6Þ—¦+W¤ñ%ûÏýú•þ‘¿’2ÿœZNKvNýC! Nþ£4:÷irݱ)¿÷êTŒ6FÿÇ€†+²‡æÞ›áo^u:ªbÀA© 8$ÍKKvJEö`ôI %Š «Óôö‹Òäê#ÓèkKƒÏýAêüÊÔÛýiñoß7û«jú‡¿þßGÿ˜&W•¦«.HÅú»üÚCJ3¾ô€ð·°dÀAU 8(•‡¤ùjö‘e+6ÞŸò{®L“oŸ–Æ—ì—FË?š'½3õzcÊ–îšz‹w Ï{‹¶OÙþ/LýÃ_—'¼- ÏüP]0“&×~:MWž›ò¾“Ò8‹þ ]T©ÿ¯?ÿfVç3à *”Ê€CÒ|5ûH÷oõP³;\¾öæ4½í¼4¹ñ”4¾ò°4þús›ÇìøapÒ¦Á1¿1÷+E²ƒ^6÷7Wd{îRî›yfAÊö~NÊöûɹÿ3çþ¦ŒãÞ”†§¼' ¿øÿÎýãoì•ÆW>÷çéª çþßPôÖFÿ'<©Ù_‰ýmZšÍ€ƒªpP*IóÙìrh´Q/ýu©xxÕ\ùº•)_}í5½ýëizÛùizÇÅû_›kÝÊûß¿ñ¾TôN)ŸFÿ¿ J18åÝáߥ¥Ù 8¨Š¥2à4Ÿ Oýãè³@Š kRoñáߥ¥Ù 8¨Š¥2à4¯-Ú>VGŸ6J6ºpqü7iéß3à *”Ê€CÒ|7û»Åh±É0eûýTø÷hé?2à *”Ê€CÒ|—ðb¿ã Å&×þ-ZzlTÅ€ƒRpH*£é­Ë£Ï%éöÚðïÐÒc3à *”Ê€CR >÷Ñç €Lo;/ü´ô£pPJeÀ!©”f¶KÅ÷GŸ8æÙà„·Åƒ–~$ªbÀA© 8$•ÕèüOFŸ8æQþà÷æþ¾èïÏÒfÀAU 8(•‡¤²ÊöûÉ”¦£è3À<~é¯Â¿=KO”U1à T’ÊlrãÉÑg€yPô×¥ÞÏÿî,=QTÅ€ƒRpH*³þ¿}æ˜ãoìþÍYz² 8¨Š¥2àTvù=WFŸ:¶Åtœ²¥»†o–ž,ªbÀA© 8$•ÝðôDŸ:¶Áä[Ÿ ÿÖ,=UTÅ€ƒRpH*½Å;¤âÑ{¢Ï[©äâ¿5KO‘U1à T’ªhtÁLô¹`+Loÿzø7fiSpPJeÀ!©Š²}_Òd}òØBƒ“ÞþYÚTTÅ€ƒRpHªªÉõÇGŸ<¶@¾neêÍlþ}YÚTTÅ€ƒRpHªªþá¯>ylÑ—ÿ6üÛ²´9pPJeÀ!©Ê¦w^}öØ Åà‘”íñÌðïÊÒædÀAU 8(•‡¤*žú'Ñg€Í0¾dÿðoÊÒæfÀAU 8(•‡¤J[´0Ü}úx*“aÊöÿéøoÊÒffÀAU 8(•‡¤ª­Ø-úôðÆWþ-YÚ’ 8¨Š¥2àTuÙÞÏIiÔ‹><‘|:÷_†GK–¶$ªbÀA© 8$E4¹æ˜èóÀ˜|ë„ðoÈÒ–fÀAU 8(•‡¤ˆú‡¼:¥¢ˆ>…–ßs”“°H IDATUü÷bi2à *”Ê€CRtãoì} :mpÒ;ÿKÛ’U1à T’¢Ëöý‰”ÆýèsÐIùÚ[Rof»ðoÅÒ¶dÀAU 8(•‡¤:4¹æèèsÐIÃÓ?þXÚÖ 8¨Š¥2àT›‡U>>‰R<¼*õmþXÚÖ 8¨Š¥2àT—&·œ}:eø¥ÿþmXš 8¨Š¥2àT—úG¾!ú$tF±ñ¾Ô[²sø·ai>2à *”Ê€CRšÞyIôYè„Ñ9ÿ&,ÍWTÅ€ƒRpHªSƒ“þ0ú,´^Ñ{ e{<3ü›°4_pPJeÀ!©VÍ,HùÚ›£O#@«¾öÿÅ–æ1ªbÀA© 8$Õ­áY‰>­UlX“z»?-ü[°4ŸpPJeÀ!©v-Ù)VGŸG€V-ÿhüw`iž3à *”Ê€CR­Ø-ú<´N±þ®¹‰.ú°4ßpPJeÀ!©Že{þx*ë£O$@« ¿øçáߥ22à *”Ê€CR]_v`ô‰hâ‘;RoñŽáß~¥22à *”Ê€CR]Ë–¾(¥é(úL´ÂðÌ…÷•ÊÊ€ƒªpP*Iunò­¢Ï$@ãå}?õmþÍW*+ªbÀA© 8$Õ¹þ¡¿RQDŸJ€Fžþ_ÿ÷JefÀAU 8(•‡¤º7ýî—£O%@cåkoN½™í¿õJefÀAU 8(•‡¤º×?êѧ ±†§þIøw^©ì 8¨Š¥2àÔ„¦·}.'¿ÿÛþö u"ªbÀA© 8$5¡þ1¿}.gpÒ;ÿïJUdÀAU 8(•‡¤¦4½ãÑ' 1òÕצÞÌ‚ðo»RpPJeÀ!©) Ž{sôÉhŒÁ ÿ%ü»®TUTÅ€ƒRpHjRÓ»¾}6joö[jô÷\©Ê 8¨Š¥2àÔ¤'¼-úlÔÞàØß ÿž+U™U1à T’šV~ïÕѧ ¶¦ß9;ü;®TuTÅ€ƒRpHjZƒ“ß}:ê)Ÿ¦þ!¯ÿŽ+UU1à T’×Ì‚”ßwCôù¨ÉÕGÅÕ2à *”Ê€CRžöÞèó P/£^Êöÿéðï·RDTÅ€ƒRpHjd3Û¥üþ›¢O(@mŒ/ZÿíV Ê€ƒªpP*IMmø…ÿ}Bj¡è­M™ÿÎG΀ƒªpP*ImÑ”?ø½è3 n´ü¯ã¿ÙJpPJeÀ!©É ÏúHô5û/ºõïþ½VŠÌ€ƒªpP*Inñ©xøöèS fpÊ»ã¿ÕJÁpPJeÀ!©é ¿ôWѧ D~÷©7³ ü;­U1à T’ß’Rñè=Ñç rýc~=þ­Tƒ 8¨Š¥2àÔ†FËÿ:úœTjróáßf¥ºdÀAU 8(•‡¤V´x‡T<¼*ú¤T#Ÿ¤þÁ¯Œÿ6+Õ$ªbÀA© 8$µ¥á™Š>©•_yXø7Y©NpPJeÀ!©5-Z˜ò¾}VJUŒ6¦l¿ŸŠÿ&+Õ(ªbÀA© 8$µ©áiï>«¥]0þ-Vª[TÅ€ƒRpHjU3 R¾æúèÓ PŠbý]©·ûÓã¿ÅJ5Ë€ƒªpP*ImkpâÛ£O+@)†§¼'ü¬TÇ 8¨Š¥2àÔÆ¦w\}^æÕtÕ…áß^¥ºfÀAU 8(•‡¤66øôŽ>¯ó'Ÿ¦þ¡¯ ÿö*Õ5ªbÀA© 8$µµéª ¢O,À¼_~pø7W©ÎpPJeÀ!©­õ|CJE}f¶IÑ_—²}žþÍUªsTÅ€ƒRpHjsÓ[—GŸY€m2üÒÿÿÖ*Õ=ªbÀA© 8$µ¹Ùß ™Š<úÔl•|Í·RoÑÂðo­RÝ3à *”Ê€CRÛ›|û´èS °UŸùíðo¬R2à *”Ê€CRÛë/{yJù$úÜl‘ɧ„_•š’U1à T’ºÐäúã£Ï-Àæg);ð%áßV¥¦dÀAU 8(•‡¤.4û:i2Œ>¹›etþ¿„W•š”U1à T’ºÒøªÃ£O.À&¯J½%;‡S•š”U1à T’ºR¶ÿO§4êEŸ]€§48åÝáßS¥¦eÀAU 8(•‡¤.5ºpqôÙxRÓU„G•š˜U1à T’:ÕÏHņ5ѧàñ¦ãÔ?äUñßQ¥fÀAU 8(•‡¤®5<û/¢O/ÀãŒ/Ù?üû©ÔÔ 8¨Š¥2àÔ¹-Lùýߎ>¿?P¬¿+e{<3þû©ÔÐ 8¨Š¥2àÔÅ'¼-úüüÀà¤? ÿn*59ªbÀA© 8$uµémçEŸ`€4¹ùŒðï¥RÓ3à *”Ê€CRWëöÚ”Š<ú V 7¤lé®áßK¥¦gÀAU 8(•‡¤.7¹þ³Ñgè°ÑWþ.ü;©Ô† 8¨Š¥2àÔå²¥/JiœEŸb ƒòÕצޢ…áßI¥6dÀAU 8(•‡¤®7þÆÞѧèš|šúGürø÷Q©-pPJeÀ!©ëe{î’Š÷EŸc CÆßüTø·Q©MpPJeÀ!I?–FË?}Ž€Ž(½gî_,‹þ.*µ©þ¿þlôm:€ƒRpHÒÍýžÉ|í-Ñ'è€Á)ïŽÿ&*µ¬þ!¯Žþ£MGpPªÞžÏ ?¨’T‡'¿+ú$-7½uyø·P©õ}ôo:€ƒRõöy~øA•¤º4]uaôYÚjœ¥ì Ÿ ÿ*µ±þÑ¿ý'œŽ0à T½ý_~P%©V Ý">Í@ Îùxø7P©­ >óÛÑÄéJÕ;ÐÒS’Û䯓£O3Ð2ùýßN½Å;„ÿ”ÚÚàø·Fÿ1§# 8(U¶ìçê$Õ©ìÀ—¤4îGŸg -Š<õzcø·O©Í N|GôŸt:€ƒRe‡¾&ü JRÝ_´$ú<-1¾ì ðožRÛžñߣÿ¨Ó”*;ò áU’j×îOKÅ#wDŸh áò‡¾Ÿz»?=þ›§ÔòF_ûXôw:€ƒRõkøA•¤:6<õ£O4ÐdEžŸù­ðoRcïè?ñt„¥|þýáU’êÚtå¹Ñgh¨ñåË¿qJ]irõQÑäéJ5üò߆TIªkýƒ_™Òt}ª€†)¾=e{<3ü§Ô•&7ŸýÇžŽ0à T£ ‡TIªsãËŠ>Õ@ã~uÊo‡Û”ºÔôö¯Gÿɧ# 8(ÕèŠCê$Õ¹lÏ]R±aMô¹b|Å!áß5¥®•¯»-ú>aÀA©Æ7ž~P%©î Ïüpô¹À¯N‘Z´0¥é(ú?aÀA©&w\T%©îÍ,HùÝWDŸl ÎŠ" Žkü÷L©ce¼8úO?bÀA©òGî?ª’Ô„úGüÒÜï®x"ã+ ÿŽ)u±Ág~+ú?bÀA¹òtˆ¥]z@øa•¤&58öw¢O7P‡_rü[ÿWJnÉÎ)å“èk@‡pPºÉÊñÇU’–¿’ ºmrÍÑáß)¥®×?üõѧ€Ž1à tùÆ«$5­lé®)zÑ'¯»Í¯N‘jÐðÌGŸ:Æ€ƒJôöý‰ð+IMktÞ?GŸo jù$õú¿Ã¿OJú±4¾ì è‹@ÇpP‰þqo ?°’Ô¸mŸòûnŒ>á@…FÌÄ›”4×ôÎK¢OcÀA%†ç|<üÀJR|ú7S*Šè3T`z×7SoÑÂðï’’~,õ–ì”Òd}è*1¾ñÔø#+I mrݱÑg(Y1ܲƒ^þ=RÒ¿Õ?æ×£ÏdÀA%òõ÷†YIjjÙÞÏMEïèS”hxÖŸ…‹”ô­Ø-ú,ÐAT¦·ôÅá‡V’šÚð¬DŸq $Ó[Î ÿ)釛޺<ú4ÐATfðù÷‡ZIjl3 ÒôŽ‹£O90ÏŠ «S¶Ïóâ¿AJú?Í,HEöPôy ƒ 8¨ÌèŠCã­$5¸þ²W¤4FŸs`¾Eœð¶ðo’~¸þ¿}è(*3]sCø±•¤¦7¾xŸèsÌ“ñ7?þÍQÒãÿÉèó@GpPëÀš®º0õüw%Rm›\|ô™ Ã 8¨\vÔï$µ!+`h–¢¿.eKw ÿ¶(éIZ¼ãÜŸSˆbÀAåFî|%©%M¿ûåè³lŽ¢Hƒ“ÞþMQÒ“78ñíÑ—‚Ž3à rÓµ·†_IjKÙþ/LÅ`}ôi6a|ÙAáß%=u“NŒ>tœ!²C^~€%©-¾ü·Ñgx ù½WÏýj†èo‰’ž¢%;§bøhô¹ ã 81úúžñGX’ÚÒÌviz×7£O;ðŠþÃ);ð¥ñß%=eÃSÞ}.À€ƒÓ¿~„%©Mõþù”&ƒèó0Ç€ƒPƒÓÞ”%©e.øßÑç:mxÊ{¿JÚ¼ǽ)údÀpjrÛ…áGY’Z×âR¾æúè4¾üàøo„’6»É·O>ðÄ*Š”ýëφfIj[ýÃ~1¥é(úÊ@§ä÷^“zKv ÿ>(ióÊ–îê[:µbÀA¸ÑÅû‡gIjcã‹v>ñÐÅ`}ÊzYøwAI›ßø²£OüÂå½‡ÒÆÝŸ~ %©u-Þ1å÷Ý}æ †§þqü7AI›]¶×³R1|4útÀ1à †Ëÿ&üHKRëòª”&ƒè3­6¾âðo’¶¬ÑŠÝ¢O<޵¯[•6Îl~¨%©Îû_ÑgZ+¿÷šÔ[²Søw@I[ÐâS±auôù€Ç1à 6§¾7þXKR[´0åw_}æ uŠìÁ”ø’øo€’¶¨áÙ}>à pPÓ{® ?Ö’ÔÖ²ƒ^–ŠÑÆèSí‘OÓ೿þíOÒVüíß}Aà pP+ýcß´%©¥¾òwÑgZctî'¿ùIÚò|+§Î 8¨•éÝW¥58Ü’ÔÊf¤éÊs£O=4Þô–³æ¾·…ó“´eíþ´T#ð” 8¨¥Á)ï ?â’Ôæ&7}ê YŠ< N|{ø·=I[×øòeÑW6É€ƒZšÞKÚ8³0üKR[Ëöy~*6¬Ž>÷У …ד´uõ~eJÓqôM2à ¶†Ëÿ&ü˜KR›ÿÖ”Š"úÜ@íMo]žz3Û…Ó“´uM¿NôÍbÀAmý‡Soïç…tIjsãËŽ>÷PkùCßOÙ^Ïÿ–'iëœü®è3›Í€ƒZ]qhøQ—¤V·d甯½9úÜ@-£©È«â¿ãIÚúoàëVFŸØlÔ[>MÙ¡¯‰?î’Ôâú‡¼:¥É úâ@½Ežö¾ðïw’¶¾ñÅûF_Ø"ÔÞä¶ ÓÆxIjs£sÿ1úÜ@­Œ/Ù/ü»¤­¯øëSÊ'ѧ¶ˆ08ãCáG^’ZÝÌviºêÂèsµ0]uAê-ZÿÝNÒÖµhû”¯¾6ú”À3à òl]êíû“ñÇ^’Z\¶t×Tô×EŸ|•¯»-eû'iZ²SÊ×\}M`«pÐ(ù£kRoïçÆIjsKvNù}7FŸ|¨ÔhùGã¿ÍIڦƗ}J`›pÐ8“›Ï ?þ’ÔöúŸú¹TŒ6FŸ|¨ÄøŠC¿ÉIÚ¶Ÿý=¿"œÆ3à ‘_ü‹ð’Ôö†gÿEô¹€ÒMW®H½EÛ‡“´õeû¾ ÖDŸØf4Ó(KÙ²Ÿÿa ImorÓç£/>”&_{KÊözVøw8IÛТ…iºòÜèsó€ƒÆšÞwSÚ¸x§ø ’Ôâfÿáµxøöè“ó®ÈJýýÙðop’¶­ñÅûDŸ˜74ÚèòƒÃ(HRÛëý«)MÇÑ'æÏd˜ŸþÏáßÞ$m[ÃSÞ“RQD_˜74Þà̇ÿp¤¶7:÷£Ï=Ì›áÙþÍMÒ¶Õ_öŠT >'0¯ 8h¾Q?e‡½.ü‡„$µº™izëòè‹Ûl|ñ¾ñßÛ$mó¯ÿÎünô9ygÀA+äÜ•zûlµé-g¥ÞÌváßÚ$mC‹wHÓ•+¢Ï ”€ƒÖ˜¬øì‰¯®êG{Ëï¤ïÓ$-¬ö–óü¼7cÁÍÔëDùé÷¦?&’ÔäÊgF ºÙ^Qgë‡Ó÷h’V{óoEôÛÙã–…«.F±á—ÓIjrÝý‹ìq/«wï…éû3I «ýé÷FôŠìqËÆVMïbý»ÓIjrý‡6g{øý¯_—¾7“´°ÊMgEÝ9’=N`Y9à ñªÃû¢¸âéŒ$5¶Éã¢úî#Ùãf þëöhM¿7“4ïÊgÌ|Û>ŒŒ…êÐÓÑZ{rúc#IM­\wJÔíCÙã€1WíÛÅEoHß—IZØÏ¦Ô³Ç ¤pÀÁØüïžh­>)ýÑ‘¤¦ÖþÌïFÔuö¸`LUöDqéO§ïÉ$Í¿ö?ývD¯Ì'Æc¥:¸7Šu§¤?>’ÔÔz_™ÊõŒ¡ºx!Ê«NMßIší›~/¢ßÉ'Êc§zñÙ(6œ–þIR#›8*9{Ô0Nº­(7ýzþnLÒ¼ëlûHD5Èž&Îc©.F±é¬ôÇH’šX1ubÔ‡žÌõŒƒj0ó¿ö³wb’æÙÊѽgUö$¡á€ƒ±UµDyýoæ?L’ÔÀÊgFôÛÙ£€†ëlýpú.LÒ<›<.úÝš=F`¨8à`¼ úѾí#ù”$5°Î¿üIö” Á^ú_ûÙ;0Ió«¸ìg¢Ú÷µì1CǼô!ï+S1=•$5­ÞÎõÙ#€êýºôÝ—¤ùUn<#êÃOeJ8àûzßüç˜^õ“é–$5ª‰£cð{³G< 2øÖ¶™½SúîKÒœëÜög~~^…ø!ƒ§îÖê·§?^’Ô¤ŠK*êC{³G< 0xâžh]xlúÎKÒ›|}ôÚœ=B`è9à€SM?åugç?d’Ô ÊOþZD¯ÈñŒ°ê™¢¸è é».Is«\÷®¨ž}8{„ÀHpÀ/§Dç¾`Eú£&IM©sóDÔuö„`UÏ}3Š©Ów\’æVç–ó£.f8àUôwo‹ÖÅ'¤?n’Ô”zÛ×dvFLuàñ(V¿-}·%iö—œýo|&{|ÀÈqÀ¯¡:ðD”×þFúC'Ihâ¨|ûÎìÑÀˆ¨?ÅÚŸËßkIšuíÍçDýâ¾ìñ#ÉÌF5ˆî¿_ÓG§?z’Ô„ËëjÿîìÉÀ«[ÏGyÕ/¤ï³$Í®ââ7Fïþ ~JÀÌÁà™]Q\yjú(I£^qÅÏGÝÚŸ=ÖRuûp”לž¾Ç’4»Ú[΋úðSÙ£Fž˜«nÛ?Ó+_—þJÒ(×¾þìˆA/{ª0lº­hê=éû+I¯]±úíÑìÖì©á€æiðôFqõ¯¤?Œ’4ÊunûóìqÀ0éw¢}ùé{+I¯Ñªc¢{ÇÇf¾-X<8`!ýèî¸2Z“Çç?”’4¢õv®Ïžæ ƒj[þ(}_%éÕko>'ªçÍžÐH8`TžˆòÆ÷¥?˜’4’Mƒ=wer2ÕutnýÓü]•¤W¬Üpš].,1°ˆúßþbë)ý•¤Q«¸ä„¨öïÎã$éÞþÑô•¤—¯¸üÑÿÚ¦ˆªŸ=* ñpÀRü¬ÊŸŒÖÔ[ÒTI¥Êux!{Š°Ìº_þ‡ôÝ”¤ÿ_±æ¤è=puD¿“=&`l8à€%R•‡¢s×ßÅôäqé¬$JíO½'¢ßÎá,“Þ½“é;)I?Z±úmÑÛy•]-$pÀK¬j½ð½CŽ _ŸþàJÒ(Ô¹åüˆºÊß,±Þö5é»(I?¨\wÊ÷7zEöx€±å€–I5½ÿû‡Ǧ?À’4ì½ôµ™4Woûåé;(I?øfäþ£Ÿ¨Ù£ÆžXfÕ‘ïFçK­©ÓdIæú^Ÿ=²X½û>‘¾{’ƽââ7Fg뇢zöáì‘ü¥×‰ÞC7F±þÝé´$ e«Ž‰Áã_ÊžÖ,¢Þ¬Íß;Ic\yÍéÑßumÔ#Ùãx8 [UE÷¶(7ŸÓ¬H¸%i˜*.ySTÏ?–=©X½¯®Nß7IãX±æg£{ç_ÛµÂpÀC¤:¼/º÷]­µ'§?æ’4,kOŽzú¹ì Àôv¬Kß3IãT±æ¤èÞñ±ìÝQWÙ#˜%0¬ßÊñßwFûæ2b êIDATócúÂcÓyIÊ®ÜxfD·•=˜?›"-Oåú_Œî>îhF˜vÝræ'VÚŸûãhMŸþøKRVíßQõ³§2sÐÛqeú^IjlíÍçDoçUQz2ûÏX8`„Téè=rs´oþÃh]ò¦ü’´Ìu>ÿÁˆºÎÇÌ‚ã iq+.{k´oúý™oµ<µÃxƒrÀ£ªDïŽèܽ2ŠgÆô+Ò?8HÒrÔ½{eöà5ôv®ÖJ{ki¾ŸxK´¯?;ºÿö—ÑøÆ¨ìÉþ³–hˆªõBôý\tîø«(6ÓǤ¸¤¥ª¿ëÚì± À+è=pµã i6­ú‰(×2ó3(­ŠÞöËc°ç‹QùŸì?c ‰hªný'¿Ýû.ùÉ•âÊSczåëò?ŒHÒb4qT ¾µ-{ÒðcúߨÅÔ‰QL½Y¯.{kW¼s¦ò5ÊkNö çF糘ùî=«¢wÿ†è?rS önúÅg"ê*ûO28`œôÚ1Ø÷`ôÜ;ÿ&Ê-çE±á´hMŸÿ±’4×&‹êéû³'+@,†ÿcÁu^øIEND®B`‚‰PNG  IHDR ÚTâ- pHYsèèµ{Rk IDATxœìØ10 €°ú7ݺØÜÌó;xÇ€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€cï¾Ã-;Ë‚ÿïô„ª( ‚¢ ÂOPQQ ¢ò* ¾ŠŠ"zýPxUõ=gJ’I™:é$¤7’1 )¤÷2$“Fz›d2-kí¾Öó^{‘ÎLN¿÷Þëó¹®ïåøÇÉ™³ïgž{Î^»B, B, B, B, B, B, B, B, B, B,'je©ûèõ©}ãá©yÞ?¦úq¿•òý~"eKvLÙXMš·òe;§â‘k£_À÷è>xyÊvyqø}AÒZ²c‡ÓÛåôv:íHÝGoèïzx¾Ê/»OÝÚ7gþMÊ÷[ÊÆ·ŽÿVåÊ÷xm*žXýr&ѽÿâ”-Ý)üÞ i†-Ú¦¿óiœõéÔ¾åØÔýö·RÕUn!XÔ×¥öm§¤Æ•²= þ‡R•/_þ†T<}wôKØ‚î·ÎOÙ’Âï’樽~05ÎüëÔ¾ý´T4Ö§ª©ÄB°ØôDj]wPªñ¾”-Ú6þ‡NúNõ},•ëŒ~‰Sн뜔-Þ.ü!iŽ[´mªõþÔ¾~E*ž]›ª`d‚EsSjßtdÿ´÷«¡á?\Ò„êüT*7­‰~©ÓÐY}º_4‘F}9ẋRûæcFúÙƒ#·ì>¹:5/ø·”í¶sü‘´™ê+Þ•Êì©è— 0Õ§Y JUh——¦ÆY›ºßœFÍh,‹Nÿ=ßù¡ï‰ÿa‘^ Æ¿’ÊÆ†èW 0 [Žõ¡”R…ªþÞԹ㬔Šnýlå©uí)ßçÍá?ÒTjû›)µóèW0:7ž²ñ­Âï’®üËoMíM©ÓLÃl8‚fÿ›Ÿíùúðiª5Nø½”:èW0‡:7a)(U±åoH­«¿<´‹ÁÚн5øÆ#R¶üñðÒ4jžöçýŸ_`ô´¯Ú'üÎ!)¦|Ÿ·¤öªS*Ë4L†f!Øyà)?èáÐÒtkžów)•EôK˜G­‹ÇÂï’âÊW¼;uº* ‹_ëJ¯þQø¬4“Z|aèþ•˜™Þ/DßA$6¾Ujœþ©ØôDtƒ»,Šçž¸ËKâÿ@¥Ô:ÿŸ£_EÀB*‹Ô<åÃï"’‚ÛõåÏ}ðÈÿ‚Ð@.»O®Nùa¿ÿ(ͰÖùÿý2"t[©q̇Âï$’â«ó¡T¬{ ¢Ú@þVàÒ…ÿ¡I3­µòóѯ$ R;OõÃ9ün")¾|×—>÷Û‚f`‚ųO¦úW~7üJšMͳ?3п ,Œ2ÿvªðöð;ФÁ¨qÒÇR‘?“Å@,;÷]”²Ý_þ‡#ֹͦŸµ ¾«ÜøhÊ÷~Sø]EÒ€ô¥IÝÇoNƒ v!X©uõ—S¶x»ø?i5Ïú´e ð}ŠgîMùž¯ ¿³H–ì˜Ú7YÝ…`ÑÜ”_ýÃø?i–y›0°%Åc7öŸ#}w‘485ÏûÇ”ŠNµ‚ÅÆÇS~ð»Â¿ùÒlkžù×)•EÄË"Ý.íÿfPôFÒàT?ú©hl¨ÆB°»fUÊ–¿!ü›.Ͷ晟² ¦¬sû©)ß:ü.#©60å½3í…`羋S¶‹_“Öð×<ã/-€ik_õ¥ðûŒ¤Ú`µü ©»öÎÑ\vî>/eKwŠÿ&K³¬yò'Bßç ·Öyÿ~¯‘T¬vMꮹu´‚;ÏNÙ’⿹Ò,³ f­,RãĆßo$Õª|ÙΩûȵ£±ló¤”-Ú&ü›*ͶæÉO©èÎ÷K¨‚V–ê‡ü|ø=GRm Êw{yê>vãp/û¿¸x»ðo¦4ÛÇ|0¥Ns>_.@Å”ÙS©¾ï…ßw$Õª|÷W§î“«‡s!ع÷ë>R]#QýÐ÷¤²õì|½T€ +žº³ÿ6Áè{¤Ú`µçëSñÌ}õì½ß9[ú¢øož4Ëê½#•õuóñ2èë>x™çîKJË÷yK*²§‡c!X¬0e{¼6ü›&Ͷú¾oIå¦5sýø>ÛNNÙøVá÷ Iµª~Ø/§Ô®öB°¨¯Où?þÍ’f[¾×¦rÝsùòØ¢öe»…ß…$Õ®ÆI½9-t!Øm§úQ¿þM’f[¾ì•©xòö9{iLUó¬O‡ß‰$Õ®Ö¥» æB°yþ¿„s¤Y·Ë‹Sñȵsõ²˜ž¢“Ç|(þn$) T‹¶I{/¬…`çŽ3=ë@ÃßâíS÷[çÏÅK`ÆzlXßï­ñw$IiàÞÑ8G7›õB°»öΔ-}qø7Ešõ¦}õisò¢˜­â©»R¾Û+âïJ’Ò •úžþcûb‚VÊWü\ø7CšUã[¥Î‡ÏúÅ0—º÷^˜²EÛÆß™$¥Aªyñ¢Ø…`óü/„¤ÙÖ¾b¯Y¿æCûª}ÂïL’jƒÕ¢mS÷ákb‚û.NÙøÖñßiµ.üâ¬^@ó­yæ§ÂïN’jUýË?žRóÙ^6ŸMÙÞ?þ/ͦæYŸN©,güâXfjþÞð;”¤Ú@Õ<ÿ_v!Ø<ïsáÿÑÒlj÷Û)¿pR™?ò}Þ~—’T¬·?~óÂ,»\×ÿDÖðÿhi†ÕüéT66Ìè¥xbUÊvyqøJRm`ê}Øoêvæy!XtR~àÏ„ÿÇJ3-_þ†Tn|lÚ/€AÐY}zÊÆ· ¿[Iª LíëWÌïB°uÝÁáÿ‘ÒLËw}iÿ_Ô_ûÖë IDAT†YûÒ¥á÷+Iµ)ßã5©¨¯ŸŸ…`Q_—²e¯ ÿ”fÔâíR÷Þ grÖ –²LÍ“?Ï’”¥æ…ÿ>? ÁæÊÿþ'Í´ÎMGÎä˜HeëÙT?àíáw-IµÁhéN©ØððÜ.‹õ¥lÉñÿqÒ j]<6›s` Oß“òÝ^~ç’TˆgýíÜ.gþMø”4“š§üqÿ×éFQ÷γ}Ȉ¤Ôoñv©X÷ÀÜ,‹õ¦lñöñÿQÒ4kù¾”:͹8cVë ¿Iª DÍsþ~n‚Óÿ2ü?Fšnõýß–Êúº¹8[[ÑI£Þ~“T‹oÉ©ØøØì‚åÆÇüv †®|÷W§â™{çòxhe¶6åËß~“T ¯ùõÿœÝB°yÁ¿†ÿGHÓþTG®Ës`(^çA%¥Þ/J¥V>³…`ÑØ˜²]}Z‘†¨ñ­S÷Ž3çã\ í늿›IJѵoŒ¬²±!Õ÷}KøORmAjùk“/³=_þÅIß[¾Û+R¹îþˆ³`äݘ²ÅÛ‡ßý$Õæ½|——¤Ôí<!XÓ˜¢Þ.ú)©6'õ>E¼§–íñÚð/FÕ©qâG£Ï2¦£,SãØß ¿OJªÍºÖyÿØYײÝ^þŨåË(•ù·£2¦©\ÿPÊw}iø½RRmVµV~®ÿš®eK_þŨoº÷_}†0C½O' ¿[JJs³\´mø£Ñ¯uÁ¿FŸ]Ìö­ÃÇ|0ü~)©6ãZ+?ß9×¢¿~õïJ©ÛŠ>º˜¥â™û’wJµøP‘øb4Â-}Q*žº+úÌ`Ž´¯þrü]SRšI‚Z:7}V0—Ê"5ŽøÕðû¦¤Ú´³Ô¼×8ñ¢)æAñô=)[ºSø½SRmZYj^Ë÷úÁTæOGŸQÌ“ö•ËÃïž’jÓÊBPó×øV©{ÏEŸMÌ÷[‡oüTRšj‚š·Z|!úX`ô>D2[²cø=TRmJYj^ªü³)ušÑg ¤}ٲ𻨤ڔ²ÔÜ·dÇT|UÊÆ· ¿óJY³Ô«ïÿ“)ušÑç#¨yÊŸ„ß{¥¬‚YjóoÝÿ˜åÆÇR¾ËKâï¿ÒXµ²Ôfk­ü\ôÙÀˆk_¶,üþ+eËBP“–ïý¦T67EŸ Œºn+Õ÷{kø=XÊ*”… &­{÷yÑGѽëká÷`)«P‚ú¾š'},ú, b_ùpø}XÊ*’… žWïa®å†G¢Ï*¦xúž”-Þ>ü^,eÈBPÏ«}åÞÑgÕZùùð{±”U A}·ú?•R·=ÿ¨¨²¾.åË^~?–²ÏBPÏ5¾Uê>piôì âÚW.¿#Kc£… ú5ÏøËè™)u[©¾ï[ÂïÉR6ÂY*廾,•›ÖD|èë|óÄ𻲔p‚Jí뎞õð?Ê2Õû¥ðû²”h‚¯~ðϦTt£G=oN©ÓŒžÕ0§Çÿnø[ʆ4 Á¯³ú´è s®xò¶”o~ï–²!ÌBp„ë}òR*Ëè ó¢yò'ÂïÞR6„YŽpÝû/‰žÍ0oЧïIÙ¢mÃïßR6dYŽhc>=—`Þ5ÏüTø\ʆ, Á­xäÚè™ ó®\ÿPÊ–ì~—²!ÊBpkœøÑèy ¦uî?„ßÅ¥lˆ²µÆ·NÅ«¢g1,˜2[›ò]^'—Ɔ# Á«yÚŸEÏaXp­ ¾~'—²!ÉBp”Z¼]*ž¹/zÀ‚+Ÿ}2eK_7—Æ? Áªyög¢ç/„é-9¢ïæR6YŽJ‹·Kåú£g/„)7­IÙÒâïèÒØ`g!8"5Ïù»è¹ áZç~6üŽ.ež…à¨üvຢg.„+7<’²ÅÛÇßÕ¥±ÁÍBpjžõéèy £÷Œý軺” p‚ÃÞ¢mRñíoEÏZ冇ý– 4¶ù,‡¼æ™ŸŠž³0pz÷åè;»” h‚ÃþÛOß=c`àÏÜ—²EÛÆßÝ¥±ÁËBpˆkžþÑóVó´?¿»KÙf!8¬oŠ§îŠž­0°z÷æÞ»ëÂïðÒØ`e!8¤5Oú£è¹ ¯yʇßá¥lÀ²ÒŠG®ž©0ðеwôße}—²ÊBpkýÑó†Fï]vÑwy) ,‡°î}_ž¥04ŠÇn ¿ËKÙe!8dÕzgJe=K`¨ôÞm}§—²ÉBpÈêÜ~Jô €¡ÓýÖùáwz),‡¨|Ÿ7§Tt£g( ¥úÁ?~·—²ÈBpˆêÜpHô쀡ÕYu|øÝ^Ê Á!)ßýU)µóèÙ •W¶žMåÆÇRñÔ©xôºÔ½ï¢ÿéÞ RçöS'é”þÿíýï½ÿ¿ÞƒÍ‹ÇoNåºûS¹þ¡TÖ×¥ÔmEÿ§Àèë¶S¾÷›ÂïøRœ…àÔúúDMIå³O¦â‰U©{÷y©sÓ‘©}éÒÔ<çïSã„ßK#~µÿ^ù>?šòe;§l|ëy=ïóÝ^žêû½55ojœø©yöߦÖÅc©}Í~©óÍS÷á«û_/0sí«¿~Ç—²à,‡¡ÅÛõ˜¾2[Û_¤un9&µ.ú¿©yʧúa¿”ò½ß˜²ÅÛÇŸó3i—§ú?“'~4µÎÿçÔ¾î þƒÒËõF»`(~Û?_öÊøó\‹ËBpjžú¿£ç% ¶v½ÿ6ÜέÇõ£®yÊŸ¤úŠw÷ã.ú_èòÝ^‘Gýzj­ü|êÜ|tÿ­ÉÞŽ Ï×ûGÂè3[ʳ‚zà9½·Ìvï½0µ¯Ø+5OýÓT?àí)[´møy=Ð-Þ.ÕzGjžõéþÒ´\÷@ô#„ÿ}"[²cü-Åd!8à5Žø•è9 azÌè} GëÂ/¦Æ±¿•ò= ül•òåoè¿ ¡sÃ!©X»:¥²Œþã€Õ{fpôy,eAYxÕ§GÏHXe™Šµw¤Î ‡¦æéŸLù—~$ü®Rùî¯îÿÆeïÃKÊú3Ñ? 0ïŠo+e‹¶ ?ƒ¥, Á®wJE7zFÀüè¶úöѾryÿ}óÝ_~öê;-Ú¦ÿ.…öå{¤âÉÛ¢R`Þ4OúXü¹+-|‚\ï‚#õ€knMíË–¥Æ‘¿–²¥;…ŸµšZù—~8µV~.\ýSsªxôúðsVʲԖî”ÊüÛѳf§§î}õ—IùÞoŒ?_5ëò½ßôÜrpÍ­Ñ?]0'Gýzøù*e œ…à€Ö<ã/£g"ÌHñôÝ©}Õ>©qôR¶xûð3UóW}Å»Rûª/õ?ü†U÷®¯…Ÿ©R¶ÀYh½_[€¡P–©ûЕ©uÞ?¦|Ÿ7‡Ÿ¡ zæà‰MÝ{/L©,¢"`zÊ"Õ÷}Küy*-\‚ú¯í0芵«Së’Åþ­çÕûyh_±g*ó§£D`ÊÚW9ü •²ÌBpëÜrLô,€IOߓڗ.Iõý2ü¼Ô€·dÇþ#P¼ë€aP67¦|×—ÆŸŸÒØÂd!8`åËvî?€EïùpíköKÃß›²ñ­ÂÏJ _½ŸÞó™zo/€AÕ{üIô™)e ”…à€Õºà Ñ3R*:©{Ç™©qìo¦l|ëðóQ£Q}Å»Sgõiž3ÀÀ¾Âß{”U$ ÁAj|«T*¥n+úGž§ñ•‡Ÿ“R¶YP£Þ=û¨ê§ßwQjžüñ”-Þ.ütejÿ‘þ‡WEŸwÒ”[¼]j­ü\*[ÏF¿„¨ Ö_ˆ? ¥±ùËBpªòsѳ€Q^ÀY'Í´|ùRçÖã¢_NTL¹þ!ïªPå, Î ‡DÏ:FEY¦ÎêÓSý w†ŸoÒ\Ö8þw½€Õ{„Eôù'eó”…`tK_”ÊÆ†è9Àè>xyªúžø³Mš¯–ì˜Úߨ5¥¢ýr º|#þì“Ææ' Áàš§þïèÀ+Ö®öÖ`UªúŠw¥âÉÛ¢_zT@ý w„Ÿ{R6Y×ýÖùÑó €!Un|,5ÏþŒçÛ¨º:ráSê¶¢_ŠŒ°öõ+âÏuµuÉâ”-Ý)ü,“¢ëýæF±æ–è—%#ü÷®|×—…ŸwR6ÇYF~óÏÿçèÙÀ0)‹Ô¾î ”ïþªð3L¨oŸÚWìÙÀ\kžówñg46·YV<±*z®0$Š5·¦úa¿~vIƒ\ãèßHå¦5Ñ/WFLïî}ÆIÙg!Tý€ŸŠži ƒVÖNšçJS+ßã5©{ÏE¿r1õC!üŒ“²9ÌB0¨ö•{GÏ3\÷®¯¥|ï7†ŸYÒÐ5¾Uj­ü\JÝvôË€ѹù¨øóMšÃ,#Z´M*7==ÏPÅ3÷¦Æ±¿^IC^ýð_Nå†G¢_ÒŒ‚vžòÝ^~¶IÙe!PãèD2QÑIíoìš²%;†ŸUÒ¨”ïñÚÔ}ðòèW7# uÞ?†ŸkR6GYÔ¹éˆè9À€)×=GüJø%d‹¶}îSˆ`Чîì?–"ü\“ÆfŸ…àB·x»TæßŽžc έǥ|——ÄŸQÒˆ×<íÏSj×£_ò ±Æ¿~žIÙd!¸À5¾òáèùÀ€(³µ©qÂMR•ª¯xW*7<ýò`HuV~–IÙd!¸Àun96z~0ºwž•ò=^~.IU,ßëSñøÍÑc€aÔi¦|÷W‡ŸeR6Ë,²%;¤²±!z|¨lnJͳ?&IUo—§îÝçE†Pë‚/ÄŸcÒØì²\À'~4zn¨xúîT?àíá瑤ï´h›Ô¹áèÑÀ)ž¹/eã[ÇŸcÒØÌ³\À:·=·Ò;|pˆ4˜µV~.¥²Œ ‘Æ1 ?¿¤lY.TKwJeëÙè™ÀB+:ýÃ6ü’´ÅšgüUJÝvôÄ`ЕE*žº35ÏþÛð³KÊf‘…àÕ8ñ¢Ç ¬|ö‰Ô8ò}ág¤©Õ8îwRj×£G¤ÜøXÿÃàZ_ÿÔ8ú)ßíåáç•”ÍA‚ TçÖã¢ç ¨ûðUýO2>$M¯Æ¿šÊæÆè@Ї¿uº2µ¯Ù/5Oÿ¤g?+r‚ Ñ¢mSY&z¶°@Úט²ÅÛÅŸ?’fTýÐ÷¤²¾.z”0Ÿº­T³%Õ¾/ Áy*ßå%)ušÑ³€9Ò¹ý””-Ú6ü|‘485Oû³”Ê2z<„)ú¿Óºdqjÿ‘”ïñšðÙ,©6¥,ç©æWÿ0z60G:·l(iÒz¿P ­ìûŸû7¾Uø–T›Q‚óTçæ£¢Ç5s sÛI–’¶Xûê}£GÀÜ*º©X»:un=.µV~î¹·þ.Þ>|ÞJªÍY‚óÑøV©Ü´&z„0 2¾uü¹"i°ߺÿê\w޵þëŸ<÷O«F‚óP}Å»¢ç9³Ô}ð²”-Ù1üL‘4$-Ù¡ÿV:€AWfO¥î=+Ÿ{îßW>œòÝ_?C%¥…ÎBp>¾©_ÿèÀ,ôÞ"“/Û9ü<‘4\廿*ÏÜ=ÂþG·ŠÇoòÜ?Iib‚óP÷K£Ç>3Tn|,å{¿)ü,‘4œÕ÷ÿÉT6ÖG2 Š<÷OÒØÔ³œëvyqJfôQÀ ” ©~Ð;âÏIC]ãØßL©èD4`Ä•›OÝ»¾öÜ[ÿHÊw{Eøü“Tš,ç¸Þ3Bízjñ+á爤ѨyÖ§£§0BÊæÆþsJÛWìùÜòoÏ×…Ï9Iµ¡ÎBpŽk_ýåè³€é*‹Ôøêÿ ?C$VíkˆžnÀ0j×S÷á«úwËæ©šêû¾%|žIª\‚s\±öŽèã€iê½Õ&úü4‚-Ú¶ÿ‰åÓzîß’âç—¤4êYÎaùòŠ>N˜¦Þ³w²ñ­ÃÏI£Yïm}åÆG£G0¨Ïý[¶søœ’T«d‚sXóÌOEŸ/LCñô=)ßíåá燤Ѯ~è{|èTù¹×ì—š'<å{þ@ø<’¤ì;YÎaU'DŸ9LQÙÜ”êû¿-üìTšçü}ôØæS§‘ŠG®ynùwÚŸ¥ú—<|îHR¶…,ç°rÃ#ÑÇSQ–ý©>7$U«ÎMGFO?`Ž”ëî÷Ü?Ii˜³œ£êûþXô™Àµ/Û-üÜTÁ–옊ÇoŽÀ4õ~ñ£³úôÔºðßRã¨_Où®/Ÿ'’46»,ç¨æYŸŽ>§˜‚îý—øI¡ÿˆÜ{®0˜ÊÆúÔ½÷Âþ?6Nøý”ïõúð¹!IÙtej_³_ÿ­¿ù>?þú–¤lÀ³œƒz¿uÀ€*‹þ'FŸ’4Yͳþ&zJÂpé¶Rñèõ©}Ý©yú_¤úþ?™²ñ­Â_Ë’” Y‚sP¹þ¡èc€Íh_±Wø9!I[ªsû©Ñ£ú­¿½×ˆçþIRmN³œeù^?}F°ÅÓ÷¤lÉág…$m©|÷W§òÙ'¢G& Æsÿî<+µ.úÏÔ8ú)ßíåá¯OIÊF4 ÁYÖ<ù5hyV IDATÑç&›Ñ»LDŸ’4•ÇþfJe=6aÁ”­gŸ÷Ü¿úoJRV¡,gYï`ðt¾ybø!IÓ©}ýŠèÑ ó£è¤bíêÔ¹õ¸þ[ë+Þ²ñ­Ã_s’”U8 ÁYV·øoFÊ÷~SøÙ IsUûª/EOVFTÙXŸº÷]”Z—,Nã?’ò=^þó.Iª-h‚3,ÿÒDŸã|öUû„Ÿ ’4ço~êÎèñʰkeßÿÜ¿ñ­â¾%I)2 ÁÖ<écÑG;ßQ67ùíI#Yãˆ_é?¦üÜ¿5·¤Î ‡¦æ™êþŒçþI’ÒdYΰö•Ë£{¾£÷–§èsA’æ«öõ+¢Ç,ªÜôxêÞõµçÞú{ÌS¶ôEá?¯’¤ÚPd!8ú^}þл åO§|×—…Ÿ ’4_õf\¹ñ±èqK°²±á¹·þ^±çwžû÷ÚðŸMIRmh³œIã[§²¹1úïô~;påçãÏIšçš'"zܲ<÷O’46¿YÎ Þ @¼òÙ'R¶dÇðsA’¢î=+£Ç.óõÜ¿'V¥Î‡§æYŸNõƒÞá¹’¤4ßYΠæý×z¿@qцŸ ’´På_ú‘þoŽ1ÜÊu¤Îm'¥ÖùÿÜÿÐÏý“$eYΠöµDÿ=€V–òÝ_~&HÒBÖºðߢ§/Ó๒¤l@³œAÝ/þ»@嵯Ù?ü<¤oѶ©xò¶èÌdÚùsË¿«÷MÍSþ$åû¼9þçE’¤±É³œnã[õÿ¥€@E×EKReë½Í4•eô$®¶¢›Šµ«SçÖãRkåçRãð÷¦lÉá?’$eSÌBpšÕ÷ý±è¿~T^ïÙKÑç$EÖùæW£Gq¥”›OÝ»¾–Z—,~î­¿Ëvÿ$)›E‚Ó¬yÒÇ¢ÿ>PyõC!ü<¤Èò= •ÍÑãx$õ¾¯ý·þ^³_jžüñ”ïùºð?oI’²9ÎBpšµ¿±kôßQ*­{ÿ%ág$ B>`dtÛϽõ÷ÆÃRóôO¦úoï?"(úÏV’¤lž³œfݻϋþk @¥5Žûð³@’¢ÅÛ§â©»¢ÇòððÜ?I’Òg!8ÍÊFÿU ²Š§ïñ›’ô=5ŽùPôhX冇Sgõi©uÁ¿¦Æ‘¿–ò]^þç%IR6 YN£|÷WEÿ½ Òz‡VôY IƒV÷îsSÕ•õu©{ïýÇû4Nø½þ3£ÿ\$IÊ8 ÁiÔû—E‚´ë)_öÊð³@’­ú~?Ñ^µŸû·uøŸƒ$IÙe!8oÖ×þÿè¿þTVç¦#ÂÏIÔÚׯH£ª\wÿ„çþíþý–$)ò,§Qûºƒ¢ÿ>PYõï?$iPË÷|]*››Ò°ë=¯»sÇ©uáSã¨÷§|×—†o%IÊF0 ÁiÔ}ð²è¿#TRñämág€$ z­‹ÇÒ0é-0»]™Ú×ì×ëo¾Ï†%IÊ*’…à4*³§¢ÿÞPI½·‰EŸ’4ð-Ý©ÿɺ©è<÷Ü¿[Kͳ?ã¹’$Åf!8Åò=^ý×(€jê¶R¾ÇkÂÏI†šgüUå¦ÇSçöS=÷O’¤±ÁÌBpŠõžaÀÂë¬>=ü ¤¡i|ëT<~Ó‚/ÿºw}-µ.YœÇ$廿*þû I’Ò–²œê7êÜÏ.è_¬xNã„ß ?$i˜jóÁy›ÉecCêÞqj_¾{jœøÑ”/ÿ¡ðÿ^I’T›v‚SÌ' ,¼²þLÊo~HÒ°Õ½gåì‡p·•ŠG¯ïÿ=¸yú_¤úþoóÜ?I’ÆF# Á)Ö½ï¢Ùÿ¥ €iéÜxxøü—¤a¬·¼ë}Ǭžû·t§ðÿI’T›—,§ØÀ~bÀë=¿5zþKÒ°Ö¹ñ°ÍÎ×rÓš Ïý{uø×+I’j –…àTZºSJe±€W`z—ÕlÑ6ñg€$ iù¯Mesc*[ϦîCW¦ö5û¥æéŸLõÞþµI’¤Zh‚S¨~Ð;¢ïŕӾîÀðù/IÃ^¾×ë=÷O’$¥‰YN¡æÉ¾TNãè„ÏI’$IÊF0 Á©|“.‹¾TJÙØàÓ…%I’$il~²œB[¿}7¨”Î7O Ÿý’$I’”h‚S¨xäÚè»1@¥4Où“ðÙ/I’$IÙˆf!8…Êì©è»1@u”ïöòðÙ/I’$IÙˆf!ø廾4új P)݇¯ Ÿý’$I’”p‚/Pý wDß*¥uÉâðÙ/I’$IÙg!ø5NühôÝ Rê‡ÿrøì—$I’¤l„³|ÁoÐ?Eß*£lnLÙâíÂg¿$I’$e#œ…à Ô¾ö€èû1@etï<+|îK’$IR6âY¾@ݻϋ¾TFï·²£ç¾$I’$e#ž…à T¬½#ú~ PõC~>|îK’$IR6âY¾@©Gߪ¡{~ $I’$Í‚[(ßýÕÑ×c€Êè>piøÜ—$I’¤¬Yn¡úÁ?}?¨Œö7v Ÿû’$I’”U Á-Ô8á÷¢ïÇ•ÑøÊ‡Ãç¾$I’$eÈBpKßœs?}?¨Œ|ÏŸû’$I’”U Á-Ô¾bÏèû1@%” Ÿù’$I’”U$ Á-Ôùæ‰Ñwd€JèÞuNøÌ—$I’¤¬"Yn¡îCWDß‘*¡uÉâð™/I’$IYE²ÜB庢ïÈ•Ð8þ#á3_’$I’²Šd!¸¹Æ·J©ÓŒ¾#TB¾÷›âç¾$I’$U# ÁÍ”/{eôý ÊÖ³ý„‰žû’$I’”U$ ÁÍT?à§¢ïÈ•Pó%I’$)«P‚›©³ê„è;2Àè+‹”-Ù!|æK’$IRV¡,7S÷¾‹¢¯É#¯Üøhø¼—$I’¤¬bYn¦â‰oFß“F^÷¡+Âç½$I’$eËBp3õ~k€ùÕ¹õ¸ðy/I’$IYŲÜL©Gß“F^ûÒ%áó^’$I’²Še!8YKvˆ¾#TB󌿊Ÿù’$I’4V­,')ßëõÑwd€Jhýð™/I’$IYŲœ¤ú?}G¨„úþo Ÿù’$I’”U, ÁIjù¾è;2@%äËvŸù’$I’”U, ÁIjœøÑè;2Àèë4S6¾UøÌ—$I’¤¬bYNRóÌ¿Ž¾&Œ¼rýƒáó^’$I’² f!8Ù7å‚/Dß“F^ñȵáó^’$I’² f!8IíË–Eß“F^÷γÂç½$I’$eÌBp’:7}Oy Ÿ÷’$I’”U0 ÁIêÜ~jô=`äµ/ß#|ÞK’$IRVÁ,'©{ÿÅÑ÷d€‘׺ð‹áó^’$I’² f!8IÅš[¢ïÉ#¯yögÂç½$I’$eÌBp’ÊõEß“F^óä‡Ï{I’$IÊ*˜…à$•ÍMÑ÷d€‘×8æƒáó^’$I’² f!8±EÛ¤T–Ñ÷d€‘W?äçâg¾$I’$U/ Á 廾4úŽ P õ},|æK’$IRVÁ,'”ïùºè;2@%ôæmôÌ—$I’¤¬‚YN(ßçG£ïÈ•Ðûìè™/I’$IY³œPý€ŸŠ¾#TB¶hÛð™/I’$IY³œPýŸ¾#Œ¾n;|ÞK’$IRVÑ,'Ô8ò×¢¯É#¯llŸ÷’$I’”U4 Á 5Žûè{2ÀÈ+Ÿ}"|ÞK’$IRVÑ,'ÔüêFß“F^¹îþðy/I’$IYE³œPó´?¾'Œ¼bíêðy/I’$IYE³œPóìÏDß“F^±æ–ðy/I’$IYE³ÜÌ7€ùSï%I’$)«h‚êÞyvô=`äuïù¯ðy/I’$IYE³œP÷îs£ïÉ#ÏoJ’$IR-, Á uïY}OyÝû/Ÿ÷’$I’”U4 Á u¿u~ô=`äuøFø¼—$I’¤¬¢YN¨{ß×£ïÉ#¯ûÐáó^’$I’²Šf!8¡ÞÛØ˜_݇¯Ÿ÷’$I’”U4 Á u¸4úž 0òŠG¯Ÿ÷’$I’”U4 Á u¼<úž 0òŠÇo Ÿ÷’$I’”U4 Á uº2úž 0òŠ5·†Ï{I’$IÊ*š…à„zϵ`~OÞ>ï%I’$)«h‚*¹6úž 0òŠgî Ÿ÷’$I’”U4 Á Ý}OyåÆGÃç½$I’$eÍBpB½Ý0¿ÊüÛáó^’$I’²Šf!8¡bÍ-Ñ÷d€Ñ×ÊÂç½$I’$eÍBpBÅ«¢¯É£¯è†Ï{I’$IÊ*š…à„zŸ| ÀüËo>ó%I’$)«`‚*ÖÞ}G¨„|×—…Ï|I’$IÊ*˜…à„Š§îŒ¾#TB¾ç„Ï|I’$IÊ*˜…à„Šµ«£ïÈ•é‡Ãg¾$I’$eÌBpBÅš[£ïÈ•P?àíá3_’$I’² f!8¡â±¢ïÈ•P?ô=á3_’$I’² f!8¡â‘k¢ïÈ•Ð8æCá3_’$I’² f!8¡îƒ—Gß‘*¡yÒ…Ï|I’$IÊ*˜…à„º÷_}G¨„晟 Ÿù’$I’”U0 Á u¿u~ô Z+?>ó%I’$)«`‚êÞõµè;2@%´.Ÿù’$I’”U0 Á uî8#úŽ P í+—‡Ï|I’$IÊ*˜…à„:·}G¨„Î ‡„Ï|I’$IÊ*˜…à„:«Ž¾#TBç›'†Ï|I’$IÊ*˜…à„:7}G¨„îÝç…Ï|I’$IÊ*˜…à„:7}G¨„â‘kÂg¾$I’$eÌBpBíë޾#TBñôÝá3_’$I’² f!8¡ö5ûEß‘*¡ÌŸŸù’$I’”U0 Á µ¯Ü;úŽ P E7eã[‡Ï}I’$IÊ*–…à„Ú—ï}E¨Œ|ÙÎás_’$I’²Še!8¡ö¥K¢ïÇ•Qß÷-ás_’$I’²Še!8ñrá£ïÇ•Q?ôÂç¾$I’$U- Á‰ßs?}?¨ŒÆq¿>÷%I’$)«X‚jžñWÑ÷c€Êhžögás_’$I’²Še!8¡æÉ¾TFkåçÂç¾$I’$eËBpBã~'ú~ P½rŠžû’$I’”U, Á 5Ž|_ôý 2ÚׯŸû’$I’”U, Á ÕW¼;ú~ P;Οû’$I’”U, Á Õ÷û‰èû1@et¾*|îK’$IRV±,'”/Côý 2Šgî Ÿû’$I’”U, Á åËv޾TFÙÜ>÷%I’$)«X‚[¼]ôý R²¥/ŠŸý’$I’4V,')uÛÑ÷c€ÊÈ÷ùÑð¹/I’$IY…²œ¤²¾.ú~ PõÃ~1|îK’$IRV¡,'©Üøhôý 2'þAøÜ—$I’¤¬BYNRñÔ]Ñ÷c€Êhžý™ð¹/I’$IY…²œ¤âñ›¢ïǕѺx<|îK’$IRV¡,'©ûàeÑ÷c€Êh_wPøÜ—$I’¤¬BYNR÷îó¢ïǕѽó¬ð¹/I’$IY…²œ¤Îªã£ïÇ•Qû%I’$)«H‚“Ô<ý“Ñwc€J©òóá³_’$I’²Šd!8Iã?}7¨”Ɖ Ÿý’$I’”U$ ÁIªþËÑwc€JiûÙðÙ/I’$IYE²œ¤úþo‹¾TJûòÝÃg¿$I’$eÉBp’ò=_}7¨”έDžÏ~I’$IÊ*’…àd-Þ>ún P)Ýû/ŽŸý’$I’4V,7SÙz6ú~ PÅSw…Ï}I’$IÊ*’…àf*7<}?¨ŒÞ?ÂDÏ}I’$IÊ*’…àf*žX}?¨”|Ù+Ãg¿$I’$eÈBp3uøFôÝ Rêÿløì—$I’¤¬Yn¦ÎgDß*¥qâGÃg¿$I’$eÈBp3un:2ún P)­•Ÿ Ÿý’$I’”U ÁÍÔ¾ryôÝ RÚW})|öK’$IRV,7÷ùú¿Gß*¥³ú´ðÙ/I’$IY²ÜLÍ3ÿ:ún P)Åc7„Ï~I’$IÊ*…àfjÿ»Ñwc€J)Ÿ}2|öK’$IRV,7SýŸ‹¾TKY¦léNáó_’$I’²ÏBp3åËß}5¨œú~o Ÿÿ’$I’”x‚›kñöýßV`á4Žù`üü—$I’¤±ÑÎBp •õuÑwc€Jižõ7á³_’$I’²ÏBp OÝ}7¨”ö7v Ÿý’$I’”x‚[¨ûàeÑwc€Jé¬:!|öK’$IR6âYþ?öî<ܲª<ð°Å *ŽILÔŽÑLÚ±“vŒIwb«‰š¶cÚÄD3ª‰&F<&&&áÞª¢ŠQ EA™±˜E†b”d™e‹ªZg>gï~nŠPÃνßÞ{½¿çyÿ×KíõõUÝ}&6mpõ1ÑwcIʪÑ÷/ ?ûRÃYnFÿ[{Gß%)«Šõ÷…Ÿý©á,7÷ÃYµCôÝX’²«µìÙáç?@j0 ÁÍèžð·Ñ÷bIÊ®ö>¿~þ¤³ÜŒÎá}/–¤ìêñîðó 5˜…àf´÷ÿõè{±$eWïŸ ?ÿRƒYnFkŸ‹¾KRvM}¡SôùÌBps–>#ú^,IÙ5¼áëñç?@ƒYnAÑy4ún,IY5ºÿÚð³ 5˜…àŒ¼!ún,IyÕo—irQøùÊBp †·œ}5–¤ìjíþ’ðó 5”…à .?$ú^,IÙÕ9ð·ÃÏ€ÔP‚[Ð?o§è{±$eW÷¸†Ÿÿ©¡,· {ÒG£ïÅ’”]S}þ¤†²Ü‚ÎaKRv ®>&üüH e!¸í}_}/–¤ìÝsyøùÊBp Z»üdô½X’²«è­/Óä¢ðÈBpÊ~+ún,IÙÕÚíEáç?@j Ái=ô½è{±$eWçÀ7…Ÿÿ©,§axë9Ñ÷bIÊ®îñ ?ÿRYNÃàŠC£ïÅ’”]ýów ?ÿRYNCÿ¼£ïÅ’”]ƒkV†Ÿÿ©,§óC:ùãÑ÷bIʮѽW†Ÿÿ©,§¡søDß‹%)¿ú­2M. Ÿ©a,§¡½ïk£¯Å’”e­Ïü—ðÆBpZ»¾0úN,IYÖ9è-á3 5Œ…àtL.*Ë~;ú^,IÙÕ=ñïâgÀD³XNÓèᛢïÅ’”]ýÕ+ÂÏ€Ô0‚Ó4¼å¬è{±$e×ð†SÂÏ€Ô0‚Ó4¸ìÀè{±$e×è¡ï…Ÿÿ©a,§ûƒZµCô½X’òk4,ÓÒíÂg@j ÁiêûÑ×bIʲöÞ¯ Ÿ©A,§©ýÅÿ}'–¤,ëùžðÄBpšZ»½(úN,IYÖ[õŸá3 5ˆ…àtM.*Ë~+ú^,IÙ5¸âÐø0Ñ‚30zàºè{±$e×è΋ÃÏ€Ô ‚30¼ñÔè{±$eWÑy4üüH b!8ý‹¿}/–¤,›zkô H a!8“Öiÿ}'–¤,ëô–ðÂBpºGýqôX’²¬{ÒGÃg@j Áhï÷ºè;±$eYÿÂÏ…Ï€Ô‚3ÐÚùÑwbIʲáߟ©!,g¨è¬‰¾KRvkn ?ÿRCXÎÐèž+¢ïÅ’”_ŨL˶Ÿ©,ghxíñÑ×bIʲö~¯Ÿ©,g¨¿zÏè;±$eYwåûÃg@j Á™þÀNþxôX’²¬þ®á3 5€…à u~{ôX’²lxýIá3 5€…à µV¼<úN,IY6zø¦ðÀBp¦&·*ËA'ú^,Iy~ÓðŽÏŠŸõf!8 £®‹¾KR–µ÷}mø H5g!8 Sï±’$-|ݯýeø H5g!8 ý öˆ¾KR–õÏÛ9|¤š³œ…¾KR– ¯;!|¤š³œ…ÎAo¾KR–ú^ø H5g!8 ­ÏülôX’òl4,ÓŽÏ Ÿ©Æ,gcrQYöRôµX’²¬ý…WÇÏ€‰ú²œ¥Ñ}WE߉%)˺Çþyø H5f!8Kƒk‹¾KR–õÏ]>RYÎRÿü]£ïÄ’”e¾iàisb!8KÝ>}'–¤,óMÃO› ÁYêø¦è;±$åY1*Ó²íÃç@ª) ÁYjíö¢è+±$e[{ÿ7„Ï€TS‚sPt×E߉%)˺Çýuø H5e!8£»¿}'–¤,ë¯Þ3|¤š²œƒÁ•GD߉%)ˆ7>RMYÎå‡wÖDôX’²¬XwOø H5e!8Ý£þ8úN,IÙÖÚõ…ás Õ…à´÷þoÑ÷aIʶÎAo Ÿ©†,çbÉÓËr4ˆ¾KR–õNùDü˜¨ Á9=xcôX’²lpÉá3 Õ…à ¯;1úN,IY6¼ãÂðjÈBpŽúçï}'–¤,+ºëÊ4¹(|¤š±œ£îqŒ¾KR¶µV¼,|¤š±œ£öoŒ¾KR¶uûýð9jÆBpŽZËŸ[–E}'–¤,ëùïás ÕŒ…àkKR– ¾{xø H5c!8ÛWE߉%)ËF÷]>RÍXŽAÿâ}¢ïÄ’”g£A™–n>RXŽã‡xòÇ£¯Ä’”mí}_>RXŽAç ·F߇%)ÛºÇ}0|¤±ƒÖn/оKR¶õ/üløH5b!8&Eû‘è;±$eÙð–³Âg@ª Á1Þ±:úN,IYV´ Ÿ©F,ÇdpÉÑwbIʶÖî/ Ÿ©&,Çõƒüúÿ‹¾KR¶u}gøH5a!8&¾iX’âêùïás Õ„…à˜´vù©èû°$eÛણÂç@ª Á1*Öß}'–¤,Ýmø H5a!8FÛWE߉%)ÏFÃ2íøÌð9jÀBpŒú~.úJ,IÙÖÞïõás Õ€…àuOøÛèû°$e[÷ø…Ï€T‚cÔþâoF߇%)Ûú}>|¤°£Ö²g—eQD߉%)ˆ·ž>R XŽY±æ¶è;±$eYÑYS¦ÉEás Uœ…à˜ ¯?9úN,IÙÖÚãçÂç@ª8 Á1럿kô}X’²­sÄ»Ãç@ª8 Á1ë~í/£ïÃ’”mýs–†Ï€Tq‚cÖþ«£ïÃ’”mÃëO Ÿ©â,Çméve9D߉%)ËŠµwÆÏ€‰j³œ£®‹¾KR¶µvû™ð9*ÌBp ®>&ú>,IÙÖ9ä÷Âç@ª0 Áùø¡®Ú!ú>,IÙÖ;ó?Âç@ª0 ÁyÐ9ì]Ñ÷aIʶÁÕdžÏ€Ta‚ó µÇK£ïÃ’”m£‡o Ÿ©Â,çIÑz(úN,IyVek§ç…Ï€TQ‚»ìÉ“ IDATódxë¹ÑWbIʶΗß>REYΓþE{E߇%)ÛzßødøHe!8OºÇ(ú>,IÙ6¸â«ás U”…àRYÎç÷ŒOG߇%)Û—~)|¤ ²œGCÿwô}X’²mt÷eás U…à,IÙÖÿÖÞás UŒ…à<ë®ü@ô}X’²mxÇêð9*ÆBpžµ¿ðߣïÃ’”mEo}™&· Ÿ©B,çÛâmÊrЉ¾KR¶µ?ÿ_ãgÀDuX.€Ñ]—F߇%)ÛºÇþyøHb!¸—~)ú>,IÙÖ¿à3ás Uˆ…àBüOþXô}X’²mxËYás Uˆ…àhñ7£ïÃ’”mEû‘2M. Ÿ©",ÂŽÏ*ËÑ úN,IÙÖZñòøY0Q ‚ dtÿµÑ÷aIʶî‘ï Ÿ©",È໇G߇%)Ûúç.Ÿ©",ê}Ú¿D߇%)Û†7|=|¤Š°\ ¯üNô}X’²­X_øHa!¸@Z;=¿,‹"úN,IÙÖÚíEá³ U€…à*ÖÜ}–¤lë|õÿ„Ï€T‚ hpíqÑ÷aIʶުÂç@ª Á…üaŸ5}–¤l\³2|¤ °\@Ã~?ú>,IÙV,IùVek—Ÿ Ÿ)˜…à+Öß}%–¤lëò{ás ³\`Ãï}–¤l›z—kôHÁ,Xÿ¼¢ïÃ’”mÃëO Ÿ)˜…àëùGÑ÷aIʶ©×6DÏ€ÌBpµöxiô}X’²®õ™ÿ> R Á¾XD’âêñ‡ás ² 0¼áëÑ÷aIʶþy;‡Ï€ÈB0@ÿœ¥Ñ÷aIʶáÍg†Ï€ÈB0@çð?ˆ¾KR¶íGÊ4¹(|¤ ‚Z»½(ú>,IY×þì/…Ï€ÄB0H±ö®èû°$e[÷Ø?Ÿ)ˆ…`áu'F߇%)Ûú~6|¤ ‚Q?ø³&£ïÃ’”mÃÛ/Ÿ)ˆ…`ΡKR¾õ[eZ¼Mø,H,ƒ´vù©èë°$e]{Ÿ_ Ÿ)€…` bÍíÑ÷aIʶîñ Ÿ)€…` Á5+£ïÃ’”mƒKöŸ)€…`äÿÌÿˆ¾KR¶î¾,|¤‚:¿=ú>,Iù6ì—ié3Âg@Z`‚Z;¿ ,‹"úJ,IÙÖ>àá³ -0 Á`£‡o޾KR¶õNù‡ð9˜…`°ÁUGG߇%)Û—>Ò³Œþpú¿F߇%)ÛF÷_>Ò³ Ö9è­Ñ÷aIÊ·bT¶–?7|¤d!¬µü9.¤’¤˜:_~sø,H ÈB°FÞ}–¤lëþ©ð9…` ¾{xô}X’²mpõ1ás - Á è}ã“Ñ÷aIʶâ‘[Ãç@Z@‚Ð9ðMÑ÷aIʺ֮/ ŸiXVÁŽÏ*ËÑ0ú>,IÙÖ9ôÇÏ€‰…a!X£û¯‰¾KR¶õÎ^>Ò±¬ˆÁåG߇%)Û†7œ>Ò±¬ˆÞ)Ÿˆ¾KR¶ëï ŸiXVDû‹¿}–¤¬kíñÒðY€…`U,}FYûÑ÷aIʶî‘óÏB°BF÷\}–¤l럿køH ÀB°B—}–¤lÞrVøH ÀB°Bº'}4ú>,IÙVt-ÓäVá³ Í3 Á iïÿ†èû°$e]{¯W„Ï€4Ï,«déve9ìE߇%)Ûº_ûËøY01¿,+ft×%Ñ÷aIʶþE{…Ï€4Ï,+¦ñ>Ñ÷aIʶá†Ï€4Ï,+¦»òÑ÷aIÊ·~»LK¶ ŸiYVLûóÿ5ú:,IY×þ«Ãg@šG‚U3¹¨,:k¢ïÃ’”mÝ“þ>~LÌ Á Þ¼*ú>,IÙ6øÎWÂç@šG‚Ô?oçèû°$eÛèëÂç@šG‚Ô9âÝÑ÷aIÊ·¢([;¿ |¤yb!XA­Ý^}–¤¬ëòŽðY扅`E~?ú>,IÙÖ;{qøHóÄB°¢׬Œ¾KR¶ o<5|¤yb!XQ½3>}–¤l+Ú—irQø,HóÀB°¢:½%ú>,IY×Þëá³ Í ÁŠj-{vYކÑ÷aIʶîʄπ4,+ltßÕÑ÷aIʶþ·÷ ŸiXVØà;E߇%)ÛFw'|Ì Á ëžôÑèû°$åÛhP¦eۇπ4f‚ÖÞïuÑ×aIʺΗÿWø,Hcf!XeK¶-Ë~+ú>,IÙÖ;ý_ãgÀÄxYVÜðŽÕÑ÷aIʶÁ5+Ãç@3 ÁŠë_øÙèû°$e[±îîð9ÆÌB°âºÇþyô}X’²®µÇKÃg@# ÁŠkö£ïÂ’”uÝ£ß> ÒYVÝ䢲h=}–¤lë¯^? &ÆÇB°†7~#ú>,IÙ6õåNÑs ‘…` ôÎ^}–¤|tÊ´äéá³ ‰…` t¾ú¢¯Ã’”uíý=|¤1±¬Ö.?Y–E}–¤lëò‰ðYÆÄB°&ŠGn‰¾KR¶ ¾{XøHcb!Xƒ«ŽŠ¾KR¶¾)|¤1±¬‰Þ7>}–¤¬kíúÓá³ …`Mt¾ô[ÑwaIʺÎaï Ÿi ,ëbé3ÊrؾKR¶õÏ]? &æÎB°FF÷\}–¤lÞ¼*|¤1°¬‘Á%D߇%)ÛŠîº2-Þ:|¤9²¬‘î ޾KRÖµ÷ùÕðYæÈB°F¦.¢’¤¸º'ümø,Hsd!X'‹·.‹Þúèû°$eÛà²ãgÀÄÜXÖÌðÖs£ïÃ’”m£û® ŸiŽ,k¦ÿÍÝ¢ïÃ’”oŨl-nø,Hs`!X3Ý#ß}–¤¬ë|åwÃg@š Ášiíþ’è»°$e]oÕá³ Í…` kKR¶ ¯?9|¤9°¬¡áµÇG߇%)ÛŠô@øHs`!XC½3>}–¤¬köÃg@š% Áêô–è»°$e]÷k> Ò,YÖPkÙ³Ër4Œ¾KR¶õ¿µwø,H³d!XS£û®Ž¾KR¶îº$|¤Y²¬©Áe_޾KR¾ {eÚñ™á³ Í‚…`MuOüHôuX’²®óå7‡Ï€4 ‚5Õþ«£ïÂ’”u½Uÿ> Ò,XÖÕâ­Ë¢·>ú>,IÙ6¼ñÔøY01s‚56¼íüèû°$e[ÑYS¦É­Âg@š! Áë_ð™èû°$e]{Ÿ_ Ÿi†,k¬{ÔŸDß…%)ëº'ý}ø,H3d!Xc­=^}–¤¬\ñÕðYfÈB°æŠuwG߇%)ÛŠGn Ÿi†,knx݉Ñ÷aIʺÖg~6|¤°¬¹Þ™ÿ}–¤¬ëýÞðYfÀB°æ:_ùè»°$e]ÿ¢½Âg@š Ášk-NY£èû°$eÛè®KÃg@š ÁÝmô}X’òm4([Ëž> Ò4Y6Àà;_‰¾KRÖM½¾!z¤i²l€îI}–¤¬ë½8|¤i²l€ö¾¯¾ KRÖ o:#|¤i²l‚ÅÛ”e/E߇%)ÛŠîÚ2-Þ:~Ll™…`C o¿ ú>,IY×Þ÷5á³`:,¢¿zEô]X’²®wÊ?„Ï€4 ‚ Ñ=ú}ÑwaIʺÁ•G†Ï€4 ‚ ÑZñ²è»°$e]±öÎðY¦ÁB°AŠõ÷F߇%)ëZ{¼4|¤-°láõ'Eß…%)ëºÇüYø,H[`!Ø ½U;Dß…%)ëúï> ÒX6Hçà·Eß…%)ëF÷\> ÒX6Hk§ç•e1оKR¾†Îâèy6ÃB°aF\}–¤¬ëòŽðY6ÃB°a—}–¤¬ëŸ³cø,H›a!Ø0½“?}–¤¬ÞrVø,H›a!Ø0íý^}–¤¼ë¥2-Þ&|¤M°lš%Û–e¿}–¤¬kï÷úøy0±q‚ 4¼cuô]X’²®wê?†Ï€´ ‚ Ô¿ð³ÑwaIʺÁÕDŽπ´ ‚ Ô=æO£ïÂ’”uź»Ãg@Ú Áj­xyô]X’²¯µçχÏ€´‚ U¬¿/ú.,IY×ýÚ_…Ï€´‚ 5¼þäè»°$eÝà’ýÃg@Ú Á†ê­Ú!ú.,IY7ºïªðY6ÂB°¡:¿-ú.,IyWek矟éI,ªµÓó˲E_‡%)ë:‡ý~ø<HOb!Ø`£®‹¾ KRÖõ¿¹[ø,HOb!Ø`ƒË‰¾ KRÖ¾Qø,HOb!Ø`½“?}–¤¼öË´lûðyžÀB°ÁÚû½.ú*,IÙ×ùÊï†Ï€ô‚M¶d۲췢ïÂ’”uýsvŒŸ?b!ØpÃ;VGß…%)놷ž> ÒX6\õžÑwaIÊ»A§LKŸ>Òã,®{ôû¢¯Â’”}ß>Òã,®µâåÑ÷`IʾުÂç@zœ…`Šõ÷Eß…%)ë†7> Òã,30¼þäè»°$e]Ñ[¿á›ß£ç@²ÌÃÔ¯ªI’bkðÆðy,óÐ9ømÑ÷`IʾÞéŸ ŸÉB0­žW–Å(ú.,IY7õú†èy,ó1zàºè»°$e]Ñy´L‹·Ÿ= Á< .?8ú.,IÙ×Þ÷5áókrQÙÞë•ewåûËþ·ö.;‡¾3þÓD5Yf¢wòÇ¢ïÁ’”}½¯ÿ¿ðyMÑÚýÅeç°w•½³—lxEOÑzÐçï‰é±ÌD{¿×]%I?hpÍÊðyuÔZþœ²sÐ[ËÞŸ.×WkïÜâçïÞÿþ¿;U”…`.–l[–ýÖ\w%I›ªh=T¦É­âgTÙâmÊöÞ¯zìW/Ú«Ý}Ù¬¾,µwöâøÿ/Õd!˜‘á«çáz+IšIí}~-|@õ·ÿÍÝÊáí”e¿=–ÏÞýów ÿÿ–*ÊB0#ýÕ{Žå’$;ީÿ> Jk§ç—ƒß¶É÷þ³þ…Ÿ ÿÿ›*ÊB0#Ý£ß7o™$iz ¯=>|ÀBh-{vÙùÒomøKñÁ‡–£û¯YÐÏÞƒKöÿ¤Š²ÌHkÅËôÁ“$=µ¢ý°÷Ðø÷þmøÕßa?ô³÷àòCâ.Õd!˜™bý½¡£$©,Û_xuø<€ñ¾÷¯z_d:¸êèðŸSª( ÁÌ ¯?)úy”¤ì›¾Ñ󦫵Óó~ü½é²Mí@¢v©¢,3Ó[µCôó(IÙ7¼îÄðyµlû§¾÷¯(Ê:6¼ùÌøŸçD5Yffj£/IŠ­è¬)Óâ­Ãg™[¼õFÞû×+›ÒðöoÆÿŒ'ªÉB03­åÏ-ËbýLJRöµ÷{]øL Ï÷þmøÕß›WUò½ãlt×¥á?óTQ‚=p]ô3)IÙ×;íŸÃç ïßÔ¯þžñéÇßûw™[£û®ÿï*ÊB0CƒËŽ~&%)û†7œ>hˆ%Û–íý^߈÷þ³ÑÃ7Çÿ·™¨& Á uOúhô3)IÙWtõAf®áïýgÅÚ»âÿ{MT“…`†Úû¾6ú™”$M½Gpÿ_Ÿ T[kÅËËî1ZöW¯Øð%e/EŒ­MEûáðÿ~©¢,s´xˆ$U Þéÿ?¨ÔþØ{ÿÖßý‘µÖÝuáÿMSEYfjÃ?)–$…6¼ñÔðy@ïý›ÿú­øÿÎÕd!˜©þê=£KIʾ c¹x›ð™À¼÷oŸ_+»Ç¨\r@9ºçò² ¢?Ž6¿A7þ¿ýD5Yfª{ôû¢KIÒÔ{¿ø›á3€ñjíþâ²sØ»ÊÞÙKûÕßö#Ñ;ól4ÿ³*ÊB0S­/‹~,%ISï\µCøL` ïý›úÕß«-‹õ÷FÄÔ*Šð?©¢,3V¬»'úÑ”¤ìÞzNø<`ïýÛûUe÷Ä<á½£è”ÚLirQüŸ›‰ê±ÌØðú“¢ŸKIÒ°W¦eۇϞªµç/”Ý•ï/ûíõØ—sºÑŸ5ü³ûie!˜±ÞªÿŒ~.%IeYv~{øLÈÝSßû÷pôÇD¡´t»ð?[©‚,3ÖùÊïF?—’¤²,ûßÜ-|&䤵ü9?zï߇–ÅšÛ¢?jžòÛ8OÛ( ÁÌ@ï:¤øFw]>ÿÞ¿•ï/—~Ñ{ÿ2kêK_Âÿ NT…`æF\ýlJ’FòµóO„Ï€f¾÷¯ýiOµv~AøŸÉTA‚™\~pô³)Išzà‘>jÿÞ¿ÖCÑëT±Z»üTøŸÓTA‚™ëžôÑègS’4õÁ‹¿>jõÞ¿Gnþ§ÔÚígÂÿì¦ ²Ì\{ß×F?›’¤©ß~àúð™P‹·ñÞ?¥Öî/‰ÿó€1½÷¯—¢?ZHù5†Ÿ©¢,ù1ƒÞý¸J’ox݉ásØ2ïý“*Ú°~>¤Š²äÇ´–={Ã]’_Ñ]W¦%Û†Ïà v|ÖcË¿o|²\uTYö«¿'~¤\qh9ºÿš²,Šè)/iž›zÖÃÏŸ‰j²ä©&•EëÁèçV’ôxSï- Ÿ PÞû'éñFw_&MT“… 5¼ñÔèçV’ôxƒ+Ÿ PU­Ý_\v{WÙ;{I9¼þä²h?=º%U¤©¿ˆ>£REY²Q½³&£Ÿ[IÒ¿mñÖᳪ÷Þ¿{£Ç´¤ 7¼yUø¹•*ÊBêüöèçV’ô„ÚüFøl€ø÷þ¢G²¤5¼á”ø³l¢š,Ùäß¼¶’T¦~ *z6À|jíù Ozï_'züJªySÿ’8úlKe!È&mø8IR%Ýyqø\€ù{ïßÃÑ£VR\ñÕðó.U”… ›4¸ìÀègW’ôƒŠQÙÚõ§ÃgÌTkùs~ôÞ¿+-‹Gnžª’2ipé—ÂÏÀTQ‚lR÷„¿~v%IO¨{ì_„ÏجÅÛ<öÞ¿•ï/—~Ñ{ÿ$…Ö¿èóñçâD5Y²Ií½ÿ[ô³+IzB~å€*þêo÷è÷zJÖÿæîáçdª( A6mrQYtÖD?¿’¤Ç+ÒešÜ*~>¥§¼÷¯õPôh”¤ÍÖ?gÇð³3U”… ›5¼ùÌèçW’ô„Úû¿!|6ß{ÿ|á ¤:Ö;ó?ÂÏÓTQ‚lÖÔ6]’TzgM†ÏfÉÓËöþ¿^öNù‡Ç–\ç½’QïÔŠ?c'ªÉBÍêòŽèçW’ô„Fw^>hØ{ÿúíèñ&IóR÷ø¿ ?sSEY²Y­åÏ-ËÑ0ú–$ý bT¶v{Qø| ®ïý{0z’IÒ‚Õ=ò=áçpª( A¶htïw£ŸaIÒò7lLkÙ³½÷O’žPçà·…ŸÍ©¢,Ù¢þ·÷~†%IOhpÍÊðÙ@°ÅÛ”í½_UvW¾ïþŽî¾Ì{ÿ$éIµxcüy=QM‚lQ÷ký K’žPÑ[_¦¥Û…ÏþWûßÜÍ{ÿ$išµ÷zeøù*ÊB-j­xyô3,IzRƒß>˜­ž¿á×ܼ÷O’æÖÔ_¦DŸé©¢,™–bí]Ñϱ$é MýzXôl`<:_~sÙ;ý_ËÁ5_+‹Gïˆ1’Ô˜Ò²íÃÏøTQ‚LËàêc£ŸcIÒ*¹%|60Kž=R$©™†eš\ÎOT“… ÓÒ;õŸ¢eIÒ“jþWÂçsÓÚõ§£Ç‰$5²¢ýHøŸ*ÌBiiïÿ†ègY’ô¤¦~½,z>07í½^=N$©‘kn ?ãS…Y2=‹·Ùð­–’¤ê4¼í¼øùÀœ´xcô8‘¤F6º÷Êð3>U˜… Ó6¼õœèçY’ôÄFòµËO†Ïf¯sÈ;¢§‰$5²á턟ñ©Â,™¶þ¹Ë£ŸgIÒ“êûçáó€Ùëý¾èQ"IlxÃ×ÃÏøTa‚L[çÐwF?Ï’¤'5¸òˆðùÀìuOü»èQ"IlpÕQág|ª0 A¦­µÓó˲E?Ó’¤'TtÖ”iɶá3€ÙéñoÑ£D’Ùà’ÂÏøTa‚ÌÈ辫£ŸiIÒ“êüöðùÀìôW¯ˆ#’ÔÈúçí~Ƨ ³dF¦6ì’¤jÕ¿ø áó€Ù\qhô‘¤FÖûÆ'ÃÏøTa‚ÌHwåû£ŸiIÒ“*ÖÞU¦ÉEá3€™Þøè1"Ilj}Ƨ ³dFZ{þBô3-IÚHíýß>#˜¹Ñ]—FIjdS_Œ}Ƨ ³dÆŠu÷D?×’¤'Õ?wyø|`æŠ5·GIjdíý=üŒOf!ÈŒ ®Y ©MÑ IDATý\K’žÔ辫Âç3Wö[Ñ#D’YkÅËÃÏøTa‚ÌØÔ‹9%IÕ«ý¹_ŸÌÀŽÏŠ’ÔØZËžÎOT—… 3Ö>àÑϵ$i#õNûçðÀôy?·$ÍSƒnøŸ*ÎB™[²­_m¤ 6¼íüøÀ´u|Sôè¤FV¬½3üŒOg!Ȭ o;/úù–$=¹Ñ°líúÂðÀôtù³èÉ!IltÏág|ª8 Af¥þ.ÑÏ·$i#uÿPøŒ`zz§ýKôؤF6¼yUøŸ*ÎBYéöûÑÏ·$i# ¯?9|F0=ýÕ+¢Ç†$5²ÁUG…Ÿñ©â,™•ÖÎ/(ËbýŒK’žÜ [¶–?7|N°eƒ«ŽŽž’ÔÈúßÚ;üŒOg!Ȭî¿6ú—$m¤î±>#زáíD Ijd½³—„Ÿñ©â,™µÁ¥_Š~Æ%Iipíqá3€-+¹%zdHR#ëòág|ª8 Af­ûµ¿Š~Æ%I«ß*Ó²íÃç›±xë²ö¢'†$5²îÑï?ç'ªÍBYkíñÒèg\’´‰|¨¶Ö?=*$©±µ¿ô?ÃÏùTq‚ÌI±æ¶èç\’´‘¦^T=#شΗß=*$©±µV¼<üœOg!Èœ ®84ú9—$mê׆w|Vøœ`ãºÇ}0zRHR3+Š2-Ý.üœOg!ÈœtOøpô£.IÚD#ÿ(|N°qýs–F IjdEz üŒO5`!Èœ´?ûKÑϺ$i ¾{xøœ`ã—=&$©‘îýnøŸjÀB9+ÖÝý¼K’6RÑ]W¦¥ÏŸ<Õð¶ó£Ç„$5²á§†Ÿñ©,™³Á•GF?ï’¤MÔ9ì]ás€§*ÖÞ="$©‘ .ûrøŸjÀB9ëžôÑèç]’´‰¦¾ü)zNðãZËŸ³á¥÷’¤ñ×?wYø9ŸjÀB9kïýªèç]’´‰ŠîÚ2íøÌðYÀ´÷Côx¤ÆÖ=éïÃÏùT‚ÌÝ䢲H÷G?ó’¤MÔ=ò=ñ³€ê~í¯¢Gƒ$56¯ÌyÚ´X2ƒkVF?ó’¤M4¸ú˜ð9ÀôÏ]=$©±µ÷{]ø9ŸjÀB±èúÑϼ$iSõ[ekÙ³Ãg\}lôd¤ÆÖÚígÂÏùT‚ŒE{ß×D?ó’¤ÍÔ=ö/ÂgÝwUôX¤f6”ir«ðs>Õ€… ã1¹UY´‰~ô%I›hxýÉñ³€2-Þº,ûíè± I¬X{gü9?Q‚ŒÍÔeS’Tц½²µó Âg@îÚ{½2z"HRc}ÿ[áç|ª AƦwú§¢Ÿ}IÒfêžðáðY»î1=$©± ®:*üœO5a!ÈØ´xcô³/IÚLÃ›Ï Ÿ¹ëŸ·Sô8¤ÆÖ?—ðs>Õ„… ã³x›²è®‹~þ%I›j4ô­kÁ¼fG’æ¯î‰ ?çSMX2VÛN~þ%I›©wÊ'Âg@Ί5·EIjlCÞ~Χš°d¬z«þ3úù—$m¦Ñ‡Ï €\µvz~YEô(¤ÆÖþÜ/‡Ÿõ©&,«Î—~+úù—$m¡©o¸Œž9êøÛÑ#@’š[1*ÓÒíÂÏúT‚Œ×’§—e¿} H’6SÿÜåñó ãË—$iükï ?çSX2vÃ[ω>$I›©Xs{™&…Ï €Ü ®<2zHRcÞ~Aø9ŸjÄB±ëŸ³4ú$m¡Îo Ÿ¹=|sôñ/ImpÅWÃÏùT#‚Œ]ç+¿}H’¶ÐàÒ/…Ï €œ´vþ _("IóXÿÜeág}ª AÆoÇg–å }H’6SÑytÃy>32Ñ9ôÑG¿$5ºîñ~Ö§±d^ ïX}H’¶P÷è÷†Ï €\ôÎ^}ìKR£ëôÖð³>Õˆ… ó¢þ.Ñg$i ¯?9|^äbxÃ×£}Ijt­/?ëSX2/:‡ü^ôY IÚRÃ~ÙÚõ…á3 ñ&•EëÁèS_’šÛhP¦ÅÛÄŸ÷õa!ÈüX¶}Y{ÑG‚$i õNûçø™Ðpí½_}ÜKR£+¹5ü¬O5c!ȼÞ~Aô™ IÚB£û¯ ŸM×;ùcÑǽ$5ºá÷N ?ëSÍX2oúçì}&H’¦Qû€7†Ï €&\ydôQ/I®áçÂÏúT3‚Ì›ÎAo‰>$IÓhpÉá3 ÉŠG¿}ÔKR£ëžôÑð³>ÕŒ… ógéveÙoGŸ ’¤-Tt×–iÇgÅÏ €jö—¢yIj|ƒÞ~Þ§š±d^ o9+ú\$M£îÊ„Ï €&êÿ¡è#^’_k÷—„Ÿ÷©f,™W½Uÿ}.H’¦Ñð¶óÂg@ .?$úˆ—¤FWtוirQøyŸjÆByÕþâÿˆ>$IÓ©(6üZ[ôÜh”ÉEe±îîè^’Ýè®KãÏû‰ú±d~-Þfû©$IÕ¯ÞÎñs AÚ_xuôÑ.IoðÝÃÃÏûTC‚Ì»á §DŸ’¤i4õ¯X¦þ"'zn4E>Ú%©ñõÎ^~Þ§²dÞõNû—èóA’4ͺG¾'|n4ÅðÖs¢uIj|Ý£ß~Þ§²dÞµ÷}môù IšfÃ›Ï Ÿ°lû²t£uIj|S¯g?ó'êÇBù7¹UY´Œ>#$IÓýr‘½^?;j®søÿ>Ñ%©ù£2íø¬ð3?Õ… bpÍÊècB’4Íú«W„Ï €ºë{ßèã\’_±æöðó>Õ”… ¢wòÇ£Ï IÒ4+Z•ié3Âg@mM.*‹µwEç’Ôø†7æOÔ“… ¢ý¹_Ž>'$I3¨»òá³ ®Ú¼1ú—¤,ê_ø¹ð3?Õ”… ¦Xs[ôY!IšfÃ;. ŸuÕÿænÑǸ$eQ÷ø¿ ?óSMY²`—}9ú¬$Í ©o‰žu4zð†è#\’²¨½ßëÃÏüTS‚,˜îÑï‹>+$I3hpéÃg@Ý´?ÿ+ÑÇ·$åÑhè†'fÏBÓÚå'7|%¸$©&õÛÎîèùP'½U;DŸÞ’”E£®?óSY² Fw_}fH’fPïŒO‡Ï€:ñyW’¦Á5_ ?óSY² ¼`Y’êU±ö®2-Ù6|~ÔAûs¿}lKR6õΚ ?÷ëÌBÕ9ømÑg†$i†u~oøü¨ƒþ¹Ë¢lIʦÎï?÷SY²°–>cÃ;©$IõixÇêøùP£‡¾}dKR6µöüùðs?Õ˜… nxó™Ñç†$i†µxcøü¨²ö—þgôQ-IÙTtוirQøÙŸjÌB×;ý_£ÏIÒ |÷°ðùPeýoï}TKR6 ï¸0üÜO5g!È‚kïûšè³C’4Ó†½²µû‹Ãg@%-Ù¶,ZFŸÔ’”MƒK¿öOÔ›… orQY¤û£ÏIÒ ›ú¦øðPAÃÿ úˆ–¤¬êò‰ð³?Õœ… !W}~H’fXÑ][¶vz^ø ¨šá §DÑ’”Uß~ö§š³$D÷¸¿Ž>?$I³hê=°Ñ3 JZ{¼´,GÃèãY’ò©(ÊÖÎ/?ÿSÍY¢µÛ‹6<Ä’¤zU¬¿·LKŸ>Gª¢ÎŽÑG³$eÕèá›ÂÏþÔ‚„ÝûÝèsD’4‹º'|8|†TÂâ­ËâÑ;¢eIʪ©W…Ÿÿõg!H˜©—ÓK’ê×èÁÊ4¹UøˆÖ9âÝÑG²$eWï´?ÿSX¦sÐ[£ÏIÒ,ëùGás ÚðÆS£cIʮΗÿWøùŸÀB8Kž^ÝuÑg‰$iî¼8~Žjíù ¾LD’ºbT¶–?'|¤°$Ôðú“¢IÒ,ëòŽð9¥ñ>Ñǰ$e×èþkÂÏÿÔ‚„êüñèóD’4ËFß¿(|ŽDhíü‚²è­>†%)»—>RCXªµçÏGŸ'’¤9Ô9ømá³`¡õVí}üJR–õNùDø H a!H¸Ñƒ7FŸ)’¤Y6¼ãÂð9° –nWëî‰>~%)ËÚüFü˜h AÂõ/ú|ô™"IšC¯üNø,X(Ý>}ìJRž ûeÚñ™ás 5„… á:‡¾3úX‘$Í¡ámç‡Ï€1¹hà í%I ßèž+âçÀDsXoÇg•å }¶H’æPç ·ÆÏ€yÖ9â£[IʶÁe†ÏÔ ‚TÂð¦3¢ÏIÒÝùí ÿr&zžÌ뿼çŠèãV’²­{âßÅÏ‚‰æ°¤zßødôÙ"Išc#Þ>OæK÷È÷D³’”uíý^> RƒXR í½^}¶H’æØèëË´x›ð™0/ÿ:ðÞïF³’”o½äsæÄxYR£‡¾}ÄH’æX÷¸†Ï€qëõ'ÑÇ«$eÝð–³ÂgAj A*£Ñ^ÑgŒ$iŽkn/ÓÒíÂg Àxÿuà•ÑÇ«$e]ÿœ¥ñó`¢Y,©ŒÎÁo>c$Ic¨wê?…Ï€qéó§ÑǪ$e_çß Ÿ©a,©Ž¥Û•Ew]ô9#IšcEz líô¼ø¹0ŽÏ§Ü}¬JRÞ†ekùsãgÂD³XR)Ãk>j$Ic¨ÁgÂg À\õÎøtôq*IÙ7ºçŠðyÈBJéžðáè³F’4ކ½²ý¹_Ÿ+³ÕÚõ…eÑy4ú4•¤ìë_¼OøLH d!H¥´v{QYEôy#ICSÿê;z®ÌVÿÛûE£’¤²,»ÇüYøLH d!HåŒî¾,ú¼‘$©©/ŒŠž+3Õþü¯”åh}„J’ʲlíñÒð¹ÈBÊ™ú:qIRƒÞù²xëðÙ0ÃO>>%IS_V÷è÷ÃgBj( A*§}À£ÏIÒëžøwá³`º:Güaô±)Iz¼ÁUG…Ï…ÔP‚TÏäVe±þÞèsG’4¦ŠöÃ^Î>_¶dÙöe±æ¶ècS’ôx½S>?&šÉBJ|ç+ÑçŽ$iŒ ¾sPølØ’þ…Ÿ‹>.%IO¨½ïkÂgCj( A*©{ÔGŸ;’¤qVeçÀߟ/›ÒÞïue9FŸ–’¤Ç+ºë¼‹zbþXRI­åÏ)ËA7úü‘$±Ñ}W—iɶá3à)o]Žîº4ú˜”$=¡©/x ŸÍe!He ¿wZôù#Is½Ó?>_ž¬wê?E’¤'Õ;íŸÃçCj0 A*«{ÒG£ÏIҸ륲µçχÏ€höË¢·>út”$=)ï|Ú¼²¤²Z»¿dÃ;§$IÍjxë9eš\>gÒäVåð¶ó£EIÒ“*Zm8£ÃçÄDsYRi£».‰>‡$IóP÷ĄπÞYÑÇ¡$i# ®>6|F¤†³¤Òz«vˆ>‡$IóPÑ][¶öø¹ð9dþ­ÂÃ^ôq(IÚHS¯‹ž©á,©´ö>¿}I’æ©á-gùÕa ÆÒgløæsIR5kïõŠøY1Ñl‚TÞèᛣÏ"IÒ<Õ=þCásÈOÿ[{G’¤MT¬½3|N¤ XRyý ?}I’æ©¢»nÃ7|FÏ ÃÿÀ×IR…\qhø¬H°¤ò:_~sôy$IšÇ¦¾@*-Ù6|ÞÍ×Zñ² ß\)IªnÝã>>/R,©¾Å[—EëÁè3I’4õÏY?o€æ¿7ðîË¢;IÒjíñÒø™1Ñ|‚ÔÂÔ?–$5¸b´á_„GÏ ¹ß9(ú¤“$m¡Ñƒ7†Ï‹” Aj¡{ä{¢Ï%IÒú‘Àfjì÷úð3¥žaAeÅ/M©ª¢Ÿ[é\|`øY$)ö,ï¾&úQÀfª~qcø™RÏ4ƒ Æ¶þ¯¯Î¹+ÂÏ"IAïxïÍÑ † ûƒƒÂÏ•z¦5¶µÏü\ô³ €`í3>~IZ¸û½Á{LæÑï ?[ê™fÔØÖØë•ÑÏ.¢UUjô‰ð3IÒü×8äm©jÜýÔ`HªÖ}©¾ìIáçK=Ó ‚ëÊ[×D?ÈV•©õ¿ ?“$Í_Í#Þ‘ªötôÓ€!ê^ñµðó¥žqAuíÓÿ#úÀ¨Œ‚'~<ü\’4üZÇ~ ¥n3ú)ÀµŽûËð3¦žqAuÅî¿âÓ†x@U¥ö©ÿ~6I^íS?=ü˜0ÝV*v|zø9SÏ8ƒ Æ¾ÞMß‹~”0BÚg}!ül’´™-Ù*u.>0úqÀ<é]uJüY“ymƒ &â¿À#´Ï^~>Iš[ÅŠ_J½ëÎŽ~Œ0Zßüûðó&÷ÚA{ÅʤTö¢ŸgŒ˜Îù+ÃÏ(I³«Øóå©\·6úñÀ|*{©Øå¹ágNîµ ‚š„zןýH`uÎÛ%üŒ’4³š_ú£Të£Ì³Þ 熟9ª5õ?Y6¤sÑS}É–ág•¤4µ(µÏü\Je7úqÀð!pµ‘È ¨‰¨X±]J½vôs €Õ[»*Õ—?9ü¼’ô芟‘º?9!úÀ*öÜ>üüQÍ ¨É©wõiÑÏ5FXyËEÞ¯F¡¾)U÷\ýh`•·® ?TdÔÄÔúÆßD?ÛqåÝצÆ^¯ ?³¤Ükð‘”:èG ¬}ÖÂÏ Õ51;=3¥n3úùÀˆ«î¿-5øÍðsKÊõm^ºWý Hcß×…ŸEª 2j¢ê¿GlJÕžNÍ/ÿiø¹%åTó¨w¥ê¾[¢¿ýRÞvyøY¤ÚÃ5QµŽÿPô3€qÑë¤Ö7ÿ.üì’&½b‡§¥îN©ª¢¿ëÔ>ã³ág’jgÔdµlÛT5ï~Î0Fº—’êK·‰?ä ¬qÈï¤rýÕÑßæD«ªTìñ²ðsIµ‡3jâê^zDô£€1Ó»ñüT¬|Aø&MLËž”:çïšRÙ‹þö`”7_6)=2ƒ &®æo~Ö0†ªûoMC7ü“ƽæ—þ(•wþ4ú[€ÒþÖ?‡ŸOª=*ƒ &¯©-RuïÍÑÏ;ÆQÙõþ6Òëÿ”m÷ò£½W V•©Øõ—ÃÏ)Õ•APYç¼]¢yŒ±þÛOÔ—?%ü<“Æ¢%[¦ö©ŸNUë¾èo]FPïºoÇŸUJÍ ¨‰¬±ß룟yŒ¹êžëRó°ß?Ó¤Q®qà›SyËÅÑß®Œ°Öª?¯T{\AMlå­—F?÷we7uÎYžêK¶ ?פQªØíE©{é—¿Õk§bÅváç–jË ¨‰­}Ú¿F?ú˜åÏû¾6ül“¢+vxÚà}6«ÖýÑß–ŒÞ•'…Ÿ]ªm0ƒ &¶b—ç ~²†¢Û|àG¦¶?ã¤oéÖ©uâÇS5}Gôw"c¤õõÿ†)m(ƒ &ºÞÕ§E?ÿ˜0½kÏJ½_~ÆI ÒÔ¢Ô:þÃ÷Ô€Y郟,?Ë”6”AP]ëëý`u[©óS}ù“ÃÏ:i^šZ”šÇüY*~Iôwcªû£cãÏ3¥eÔd·ü)Þã€ySÝwKj÷ÁøóNVS[Šæ‘ïŒ?×”6–AP_÷²£¢ŸƒL¸Þ•'§bÏíÃÏùS}é6ñg ´‘Š]ž—Úg}>U÷ßý-À¤©ªÔØë•ágjO˜APYÔ>{iô#€ÌT÷Þ”Z'~ܯËh¤jø¦Ô½äÁO´À|èÝx~øy§Ú&3*‹ŠÝ^œRÙ‹~.¡þ{² >xdjQøy¨L[ºÍà5Ø»ö¬èo2ÐúæßÅŸ}J›Ê ¨lê]sFôs€Œ•·\”šG½Û0¨«ØíE©óR5}GôË€\´ë©Øñéág j›Ì ¨ljÿáèG#¤rýÕ©}ê§S}Ù¶ág£&°eÛ>ðÓ€WžœRÙ~¹™îeGÆŸ…J3É ¨|ZºMªŠõÑÏGèÿÔVÿ=n‹ŸFjìkøæÁ{V­û¢_Úd¬yø†Ÿ‰ªÍ(ƒ ²ªóýý¢Ÿð(U{z0ä4öyMø9©ñªØýWRûŒÏ¦òîk¢_ƪ{®÷Ö(‹Ç'ƒ ²ªqÀ£Ÿ‘°ae/õÖ®JÍcþ,Õ—l~fj4kìõŠÔ>ý?Ryó÷SªªèW-<¬}ö’ðsRµgTv•·]ýœ€'TMßž:î“ûÿzø¹©øŠ=_>xßÉÞMU•Š=·?3U›qAeWû”OE?*`ÆÊ[פ։÷‰}™ÕØïõƒ÷˜,×­~ À&õ~¶:üìTmV•]ÅŠ_J©ÛŒ~^Àì´ë©{ÙQüJ±O(ž¸ŠÛ¥Öq™ºkOÕ}·D¿Ú`Vš_}_øYªÚ¬2*˺W|-úy s×i¤Þ•'§Ö IÅNÏ ?W5‡–l9ødàþ‡‚ô®=+¥^'úUsÒÿYÞÿ¸6v•eÍ#ßýÌ€áè¶RïêÓRëÄ¥båóÃÏXm¼Æ>¯N­“>™z?ýfªš÷F¿r`(|˜Hm,3*Ϧ¶HÕ=×E?7`¸ª2•7_˜:ßÙ15x»_-ŽléÖ©qð[S{õ¿=0Nßýê€áëuR±ë/ÇŸ»J³Í ¨lkŸù¹èG'̯²;øP’Îù+SóÈ?NõeO ?'µb‡§ þŽûÒÿun?@º?ùïð3Xµ9eT¶»?xûŒbçg‡ŸÇc;þöû©}ê§S÷²#SyǃŸÎ€Ü þƒãœÍªÍ:ƒ ²Î‡‹»ê7¦ÞÚU©ýí©Ô<潩Øõ…áçóH}ðÇÞ¯J­c?Úß^œºW—ÊõWÿ ÿ‹ë¯Nõ©EñçµÒ\2*뚇ÿaô3FNuÿm©wÕ·Rç‚Ý‚Ñÿ¯ÿÅžÛ²è³{^Þëo¯W þŒýf霷ËÃßm—¥ÔmFÿSÀÈê¿Onø9®4× ‚Ê»©E©\·6ú9 ã¡×ü4@ÿS;}1µOý—Ô<æÏRã ßJÅî/IõåO±s~‹TìòÜÔØ÷uƒ_ñm}ý¯Rû¬/¤îšÃSïúsRõ‹ï³ÌR§‘ŠÛÅŸõJsÍ ¨ìë¿ÿ0$íú`h+o¹hðS†ý÷Øëÿ¤a{õgRëÄ?ÐñJ­ã>8øåþOæõb¿qà›{¾|Pc¿×?ü×ÿÄäÁÿ»£ÿdðÿoÐ7ÿnð?«ÿ?·ÿ¡)ÝK¿”zkOL½›¾›ÊuW¦ªXŸRUEÿmÀDê^vTø]^µÍÛB ‚ʽb§g¥Ô)¢Ÿ§0¿5ü.¯Úfe”ú.ré—¢Ÿ§0òÊ[/ ¿Ã«¶Ù¥ÅµÔ8ø-ÑÏTy­>~‡Wm³3JVÞº&ú¹ #«ºÿÖT_ºMøý]µÍÎ (=XÿÉ€ kŸõùð»»jCÉ (=X±ÃÓRÕº/úù £§ÓH»wù] IDATÅÎÏ ¿»«6” ‚Ò#ê\´ô#FN÷’CÂïìª -ƒ ôˆ{¿*¥ªŒ~ÎÀè¨ªÔØ÷uáwvÕ†–APzL½kN~ÔÀÈè]}Zø]]µ¡f”Sóè?‰~ÖÀÈhùÎð»ºjCÍ (=¶©E©\weôó•wüxpO¿«+ 3ƒ ´Ú§|*ú™ áZßüûð;ºjÃß= ‚Òã+vxZªš÷F?w LU_—ê˶ ¿£«6ô ‚ÒFê|oïèg/„霳<ün®Ú¼d”6R±ÇËR*{ÑÏ_Xx"»<7ün®Ú¼d”ž Þ•'G?‚`Áõk.úN®Ú¼e”ž æ‘ý €…Õë¤b÷—„ßÉU›· ‚Ò&*oÿQô£LwÍaáwqÕæ5ƒ ´‰Z'}"úY £ì¥Æ>¯¿‹«6¯¥Mµü)©jÜýH€y×ýñññ÷p¥ùÎ (͠ι+¢ŸÉ0ï¾)ü®Ú¼g”fP±ËóRê4¢ŸË0ozWŸ~ÿVmA2J3¬{É¡ÑÏf˜7ÍÃ~?üî­Ú‚d”fXÿMUSUF?Ÿ`èz7œ~ïVmÁ2J³¨·vUô3†®yô{Âïܪ-XAi5ýÝèg4 UyÛe©>µ(üέڂe”fYï¦ïF?«`hš_ùóð»¶j šAPšeͯ¾/úY CQÞºÆO.Î/ƒ 4Û¦¥òΟF?³`³yïÀZ–¥9ÔZõÑèg6l–òæ Ãïת…d”æÒ²'¥êþÛ¢ŸÝ0gÍ#Þ¿VŠÈ (ͱö™ÿýì€9éÝxAø½Zµ¸Mà (Í­bÇg¤ªyoô3f­yø†ß«U Ë (mF v‹~†À¬ô®=3ü>­ZhAi3*V>?¥Ný,€kò;á÷iÕB3J›YçÂ}¢Ÿå0#½«¾~V-<ƒ ´™»¾0¥n3ú™›Ô8ø-á÷hÕÂ3JC¨sñÑÏtxB½µ«ÂïϪDAi»¿$¥^;úÙVöRc¿×‡ßŸU‰ ‚Òê^ú¥èÇ;lP÷…ß›U™ ‚ÒjìõŠ”Ênô3¥jOÞÿ>úÞ¬ÚÈd”†X÷‡ÇD?çàQÚg/ ¿/«6R¥!ÖØ÷µ)Ueô³ªú©Øñéá÷eÕF*ƒ 4äº?>>úy­“>~OVmä2JC®±ßü” áÊõW¥úÒ­Ãïɪ\Aiê­]ýÜ sÍcß~?Vm$3JóPã‹¿æ§SÞüýTŸZ~?Vm$3Jó”÷ JóÐß ¿«6²¥yª±Ï«S*»Ñg™éþä„ð;±j#APšÇº—}“^;5ö~Uø}Xµ‘Î (ÍcÅ/M©ÛŠ>ÈDç¼]Âïª|Aižë\|@ôy@ªé;R±ã3ÂïÁª|Aiž+v}aJ"ú\`µNøHøXµ±È (-@ v>˜`åͦúÔ¢ðû¯jc‘APZ€ŠŸªÖ}Ñ瓨*Sãà·„ß}U› ‚ÒÕ9gyôÀê®9,üΫÚXe”¨b§g¦ª¸+úœ`‚ô­Xù‚ð;¯jc•APZÀÚg|6ú¬`‚´Oû×ð»®jc—APZÈ–?%UÓ·GŸL€rÝÚT_ºuü]WiÜ2J \ëÄGŸL€æÑï ¿ãª6–¥…nÉ–©¼ó§Ñçc¬·vUüýVi\3J5yoôÙÀ¸ê©Øãeáw[ÕÆ6ƒ TïÚ³¢ÆQ}33JA5öÿ”ª2ú`Œ”·ÿȉ(mnA)°îå_Ž>KU™‡¼-ü.«ÚØg”+v{Ñà½`S:}1ü«ÚDd”‚뜷Kô™Àˆ«¦oOÅNÏ ¿Ãª6¥àŠž™ªúºè³€Ö:îƒá÷WÕ&¦öêÏ ^WµúÔ¢ð/Fʵö)ŸŠ>[Q½«O ¿·ª6QµÏü¯Ák«V_ºMø#eÛ’­R¹nmôÀ¨é4R±çËãï­J“Tçœåƒ—W­¾ü©á_Œ”sÍcß}Ì0bÚg|6ü¾ªÚÄÕ9åàõU«¯Ø.ü‹‘r¯wùÑg #¢¼ãŠT_ºuø]U“WçÂ}¯±Z}å ÿ)÷ûÿzJe7úÌ ZÙMß~OUm"ë^þåÁˬVìóšð/FR-u.úbô±@°Îwv ¿Ÿª6±õ~¶zð:«5ý½ð/FR-+~)UõuÑgAú:Y_¶møýTµ‰­üù%ƒ×Z­ñ•?ÿb$=PëÄEŸ?DýªðA¿~/Um¢«î¹~ðr«5¿ù÷á_Œ¤›Ú"•·\} °À:çí'Ušè¦¶H©Û¼Þj­3?ÿIz¸Æ!oK©ª¢Ï"ˆ_V}*v{ñï¹Zç’Cÿ I®{ùÑ¡‡ ¤*SÓç;hñü×<ì~ÙպלþIztÅʤªu_è™Àüë\°[øTµ,jð׿îj½»® ÿ‚$=¾öêÏ„J̯rýU©¾üÉá÷OÕ²¨ÿ>•©¥^'M/Ù*ü‹’ô˜–n=x &PÙ¼‡|øÝS)—zWòð˯Öÿ?Šý~5ü‹’ôøšG¾3òx`žt.Ø=üΩZVU÷ÞôèA°ùõ¿ ÿ¢$m¸îONˆ<£²òö¦ú²'…ß7U˦b§g¥TUÛç­ ÿÂ$m¸b·ù€€IÑm¦Æ~o¿kª–UÍ#Þñ¨—á`ìþluø&iãµOùTÔQÀµOýtøSµìjŸ½ôñƒ`Ù¼/MOmþÅIÚHS[¤òæ £Î+† w황>µ(þŽ©”[½kÏzü ØçƒE¤Ñ®ñÅ_KýO`üTÅúTìúÂð»¥2lÉV©jÝ¿áA°uÒ'ã¿@IOXçü]#Î-6SëØ„ß)•gƒßú¸×ãÃ`ç‡_ ÿ%m¢åOIÕ=×-ô¹Àfè®9<þ>©l뜳lãƒ`9½.M/ö{ìÒ¨×<êÝ }v0Gýê(v|zø]RùVÞrñÆÁ¾âÀß ÿ"%mºîŽ]Èó €¹(»©qÈÛÂïÊ·bçç¤T•O<¶¾½$ü •´éŠ•ÏOUãî…<Ƙ¥öÙKÃïÊ»Ö7þvƒ¯ÍG ‚½›/ÿB%֪ͬ.ÔÀ,õn8oðé®ÑwGå]ïg«7=¦ªJõÝ_þÅJšAS‹Rﺳè(`¦ªúºTìö¢ø{£²®èÿºpÙÁ ØÿµáÕÿþKšY}_›R·µç3Q•©yô{Âï‹Rë¤Olôeú¸A°¼uMø,iæµÏøì|gÌPç¼Ãï‰R½ÿëÂ7}wæƒ`_±÷«Â¿hI3lÉ–©¼ùûóyž0½Ï÷¾J£Pc¿×?ákuƒƒ`û¼•á_¸¤™×Øç5)uóu¦° UãîTìásT‰:ßÛ{öƒ`9}gš^²uø/iæµWf¾Î5žHU¥æÑ~/”êý–m›ªâ®Ù‚}ͯ}0þ iæMm1øñtVç¼]âï„Òâj­úè&_³»×}'ü iv5öyuJbØgÑÿàï¨ú¨4µE*×]9÷A°¯8è-ñI³ª}ÚÿæÙÀFT{¼o Ò(ÕüêûfôÚ}ÂA°ó£¯…ÿA$Í2¿: 0ÿª25~OüPZü?õbu³ÁTöR±çËÃÿ0’fW±çö©jOé”à±Úg}!üî'ÕQó¨wÍøõûă`ÿ§/>(ü$iöµ¿õÏ›{¾°½µ«R}jQø½Oª?ÔÔ¢TÞrñðÁÔë¤úÛÇÿÁ$Í®©E©wí™›yÌðHåú«S±Ó3ãï|ÒâÙ¿wàÌÁþO ^zdøLÒu¸uÿ\Ï9¡¿jìûºð»žTdK¶JåW ¼—à>¯ÿJšu­>2Ç£€‡UUjûþð;žTLíSþiÖ/ç™ ‚)¥î5g„ÿ%Í­î¾:ë‡ÿ£sîNáw;©þ˜ŠÛ¥ª¸kþÁ¾Æ—ÿ4ü*iöõßߢúÅ ³~@RïšÓS}É–áw;©þ˜:0§×ô¬ÁÞ]פé¥Û„ÿa%;ÆÁo|H3WýâÆTìüœð;TLƒß:x›¿yûZg|6ü,inµÏ^:§@–:Ejìÿáw9©þØ–n“Ê;2ç—ö¬ÁÔi¦bïWÇÿÁ%;%[¦ÞMßó U•ZÇ8þ'-~|s–mÖË{öƒ`ÿFn8?M/^þ‡—4ûŠ=^–ªæ½›õà˜ts–‡ßߤújø¦”zí…ûZ'ÿcø_€¤¹Õÿ¯\lX÷ŠãR}ÊB©6zíðÔT®¿j³_ãs¿:¼ß¯ÆÿEHšSÝËÞìÀ¤)o]“êËŸ~g“꨻æð¡¼Îç>ö?uø¶úÔaiL+v|z*ï¾v(€IPÝ{s*v}aø}Mªo ÖñÚk}³Á¾ö÷öÿ ‘´QÞë çi0ƪötjðÆð{šTß@ýÞ0xŽÌ ØÿÔæ±ÿ‹‘4·Ú§ÿÇP&c«*Só«ï ¿ŸIõ Tìô¬TÞõ³¡¾äkCùýúÖt*ö}}ø_¤94µ(õÖž8ŒGÀXjŸñŸñw3iñZ²eê]õ­¡¿æ‡2öõÖÿ,Õw|fü_”¤¹ý×ï'd¨{ÙQáw2©¾‘:î;/¯û¡ ‚}ÝŸ­NÓK¶ ÿË’4û¾)¥ns˜€‘Ö»á¼T÷a©Z<šµWfÞ^ûCû:—þ&inµNüذ #©\U*v~vø=Lªo Öq¼·åØ ‚}­³‡ÿÅIš[ÝËŽœÇÀȨêëRc¯W†ß¿¤újõ®”º­yý˜—ApðÉë>þ(i-J*ïøñ¼<¢U­ûo™~÷’?¾æïX·óšŸA°¯,Só¿?þ)iö5öyÍà˜(½Njõîð;—Tß@ÍÃþ ¥v}A¾æoì+{©yü‡ÃÿB%;Öq9¯€UU©õ¿ ¿kIõ Ô<âí©jO/Ø·Ãü‚­ïFAi,›¯7Xhí³>~Ç’ê¨õµ¿H©×^Ðï‡ùúõaï)(_K·IåÍß_ÇÀ|éþà øû•´øñµNüØà7lÚ ‚ýhîêÏ„ÿEKš]Åî¿2ø.€qÔ[{bª/Ù2ün%ÕÙÔ©sþ®aß 7>¨{É!izÊ7¢4N5ý½ÿñe€ÍUÞrqªïðÔð;•Td˶MÝ+¾ú½±àƒ`_÷ÊSR}¹oHiœjô‰ˆÇÀœ”ë¯JÅÎÏ ¿KIõGTì¹}*o»,úÛ#fìëÝzyªïþ’ðI3¯sÑþQ €«î½)6XÍcÞ›ªÆ=i„ ‚}eý®Ô8êÝáÿ ’fØÒ­Sïús"O¨š¾#5öyuüýIZü`K¶Jsw|¾Æ¨ª*µÏÛ%M/^ÿ$i“+¶KåÝ×D?9§jÞ›¾)üÞ$Õñ+½/H£&~|P÷Ú³S}·‡ÿCIÚt/þZªÚÓÑ €‡õï(C~'ü¾$Õ¬uâÇFöî<2ƒàCK~óëÿ;üLÒ¦k~õ})Ueôc ¥^;5~Oø=Iª~*ðå©wÍi”Ô øÎ¿šê;?7üPÒ×þöTôãÈ]ÙüÀBôýHª/Ý:µÏü\JFu#9>ô#Íþ&MGÿcJÚxS‹R÷Ç_~\¹ªÊÔúïÿ7Rö5zw*ïüi#;>ò½‹}_þ+i#íðÔTÞvyô£ÈPû䌿)ëû¾.õ®>5›‘zÝÔ¾è€T_ñìðhI¯Øý%©š¾#úId¤}æ…ß…”÷§w×>ø•õq4ƒàƒÊÆ/RkõgÒô²'‡ÿÃKztƒ~;¥Ný˜2ÐùÎáw åY±ÇKS÷’CSêuÒ8«Að!åôºÔ:ý?Óô²mÃ_’þ§æ1ïÛÿ:Œ‡Î»…ß}”_Þ˜º—=öCàX‚)ï»mðƒõŸþÂô@íSþ)úÑL¨Î¹+Âï<ʨ¥[§æ±ïO½ë¿“&ÍX‚)[Ó©{É!©ØûUñ/Iƒÿb0Lïî~×Q5öyuꜿr¢ß+"Á‡•½Ô½ò”ÔøÊûÒô’­Â_@R¶Mm‘ºWýD&Dçü]ãï9šøËl¯þ·TÞüý”ƒÉ¡¼ÿöÔ>×TìÿÆð•”e˶M½Ï~cÎ{j^šZ4x_Àö™Ÿ{`,Ë”“‰©w×5©}îŠTð›i:ú'eT±b»T®»2úŒ)¿&¬aÖØë•©uÂ_>¤š¾=å,‹Að±DÒ¹ôÈÔ<îC©¾b»ð£4é{n?Ñï»ÌÎw÷ ¿Ïh¼¸yÌ{?Ø[»Ê½4÷AðQÊ2õnÿñàIš'üu*öz¥Ÿ ”æ¡ÆA¿•R»ýŒ‰Î÷ö¿Çh„[þäTìöâÔØÿ7RóÈw¦Öª¦Î¹;¥î¿’Ê›/LeãÑ/á‘—÷ ¸eóþÔ»éÂÁHØ:ùŸRãÈw >½xzé6ñ/xiŒk|ù½)õºÑßâÀ¨+{©÷ó5©÷óK¤Ô»sm*ï¾6•w_—Êân?l2$AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€F¾Ê ÒIDATŒ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2b€Œ #AȈA2òÿÛ±c`aóoºsÑ$ ¸y×ÀCB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A1 Ä€CB A˜Žr’\ãN.ùIEND®B`‚‰PNG  IHDR„°õB8 pHYsèèµ{Rk IDATxœìÝ{´¥u}ßñ3 ^(‰ÁxO¬Õšfi\mL­®$¶Ö$‰®M]Il­‰vŦé9se˜FnŠ„"‚ܹ㨠^PÀ8 \…A˜áÙ÷ýìoה̑ÂÌ9ç·Ÿï~½Özÿÿœ}ÎyxÎïÃì=¤6UúXX!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œA 9ƒ@r!€ä BÉ„’3$gHÎ œAh1ÔuÔ[7ÇàæÏDïó+¢sÆ[¢uì/Eµæ_D5=%i®–-Áµ'”þí€âFß­õ/(ÿ·º$ínkŒÖG_3Þ½/¬œ=3ßqv¾ã …gZ£mwGÿÆ3£{ÑÿˆÖq¯ŽjÕþåѤ&µü)1ø‡³Jÿ*ÀØ=x[´{nù¿Ù%i!Zµ´Žÿ•è^ô¾èßxVÔÛî.}ÛMÉ 4ê‡nþ5ÇEçì·Gu¸ÿ[CÚ­VîÃ[>[úׯNýƒïDëÐg—ÿÛ]’£õ/ŒÎÙïˆþµ'Dýð¥oÁ)„vŰƒï})º>øÃ·~›YRþ—CJPëàgÆðö«Jÿ†Àت°)Zë*þ7¼$-zë_4û®\ƒ[/èwJߎÉ ôDՃٴΧþ0ªUO+ÿÃ/%«µîg¢þþ·Jÿ¦ÀØ«ï»1Z‡XüoyI*Öê§ÏžÕ6ž1è–¾-7†AèñÔÃܲ!:ç¼3ªƒŸYþ‡\JZký £~à–Ò¿ñÐõ=ߘ}§ÒÓKRñ> :Ÿù“l¾löLŸŸÌ 4‡XÕ»ríì{ÿa–’×>ú¥1ò °k£ÐšŠÿm/IcÓ¡Ï™ý¨—ú¡ÛKߢǒAèÇÿ5ÐÆó£ý‰7Eµliù\ijûŠU÷—þí€ÆÞñåh­Ú¿øßø’4V-Û3Ú§ý—lº8b4*}«¡~'úßúx´ŽziùRi‚jôU1j=Pú7¼ýª¨VíWüo}IÇZúùè}åȈ^+&ÝÄBõö{£{ÙtTk|Ÿ´Øu>öšu·•¾ @ÃÍ—FµbŸâóKÒØ¶öYÑ»buÔÕbRMÜ ´ã›½ã=«•û–ÿ”&°Î‰ÿ!F½GJß á­¢Z±wñ¿ý%i¬[µ_t7ü¯¨[[cÒLÌ Tw¶EïʵQ­~zù8iBëœòƈ~»ôíÒn<7ªå{?¤±oÕþ³ÿx¤î<“"ÿ ÔoGïŠC¢ZýŒò?`Ò×=ý÷"†½ÒwHopã™QÍìQü,@’Ñ!?½¯1ìGv©¡ÁÆó£Zÿ¢ò?PÒ„×=ëmqC€q1¸æ¸âç’Ô¤ZG¾$›.ŠÌRBÃ-7Gû”ÿXüHÒTt?õŽˆzPú¶§ÿÅÕÅÏ$©iµÿï¯Çð¾›"£\ƒP¯ŠîgßÕ²¥Åh$ME÷üÿ1•¾3ÀÄê]üWÅÏ$©q­Ø;z_X1Èõi¡Áw¯ˆÖ‘ÿ²üŠ¤ÙºçýYĨ.}k€É6E÷3ï*~N IM¬uÌËcxçÕ‘E㡺µ5:ç¼3ª™%Å8$ý°Þá_À¸ö£sꛊŸHR#[¶4º—¼öÊš®ÑƒÐ`óåQúœò?’­{Þ»A0núíè|ì5ÅÏ $©©µŽ|I ï¾.š¬™ƒÐ ÝË—G5³GñI?ÊgÀøuŽö±¯,~~ Imٞѽ|YD=Œ&jÜ 4ܲ1ZþÃ%]Æ £jK´zIñsIjrí“^õÃwEÓ4jê_ÿɨVíWü›-é±õ.ùkc4ÄèÁÛ¢u賋Ÿ'HR£[s` 6_MÒŒAhØî†–ÿKÚ©ÞŽT¥¾ïÆh­9 ø¹‚$5ºe{FïʵÑc?ÕÛï¶¼“Æ÷_4¼ýª¨V>µøù‚$5½ÎÙoèU1îÆzÞ}]T‡þlño¦¤ë]ð—Þ&n¸é¨–ïUüœA’š^ë#¯ˆzÛx®ÐØBƒ[6DµêiÅ¿‰’v®û™wEŒêÒ· ` ®?-ª™=ŠŸ7HRã[÷ìÞóÍWc9õ®þHTË––ÿæIÚ©î§ÿÈÉô¿¼¾ø™ƒ$e¨uð3b°ù²Gã5Õut/ù@ño˜¤¹ëžõ_#êaé;°z¾·øÙƒ$¥hùS¢ÿÍSbÜŒÏ T¢sλÊ£$ÍYçô7G û¥ïÀBÕÑùäï?ƒ¤Í,‰ÞWŽŒq256cЧþ°ü7HÒœuNùOƒné;°Ðúíhÿêâg’”¥ÞVŸ(? ºÑöHc[çäߌtJß)€E2ªîö/.~&!IYênø`Œƒ²ƒP¿í“ßPü›!iî:'½~öÿ &K}ÿÆh­9 øÙ„$e©{ÙôBƒ^´OýíâßIs×>î—cÔÝ^ì”5¼ýKQ­Ø»ø…$e©wåº „v|fÐYo+þâKš»ö‡ÿMŒÚ[‹Ü€ñ1¸ñÌÙF/}V!I)šYý¯ÿý Busÿ´ü /iÎv¼Gðhû÷ýÖŒ§þkŠŸWHRšföˆþõŸœŒA¨{ñ_—Á%ÍYëðçÇèá;û¶Œ¹îyVüÜB’Ò´|¯ܲ!÷ Ô¿æ¸ò/´¤9k­ýé¨ïÿöbÞ€¦¨‡Ñ9ÍçKR5OµV?-†÷Þslº(ªe{‘%í\ëàgDýýo.Öíh Qw{´}Eñs IÊRký £Þ~o®Ahx÷uQ­Ü¯ø‹+iŽVîÃÛ¯ZŒ[Ðp£í÷̾å|ñó IJR룯ŠèU9¡zÛ=Q­;¨ø‹*iŽVìÃÛ>¿Ð· ‘ú¾gßm¤ø¹†$%©sÖ$„½hÿ«Å_LIs´lÏn0AºçÿyñsIÊRë°çFýÈ–f BÃ{oˆjåS‹¿x’v®wÉûâטDÃ~tNz]ñóIÊRûä7DÔuC¡~'ZþÅâ/š¤ëžýöˆÑÂÜL€É4joö/.~î!IYê}å¨f BÝ‹ÞWüÅ’´s“#bØ›ï_y€¨ïß­ƒŸQüüC’R´bŸÞ{ãxBƒ[6Ì~X}ñKÒcj÷˽j>ÝcøK¢Z¶´ø9ˆ$e¨}ì+#Ýñ„êêþ¨ÖTüE’ôØÚǼ|öŸn,´þ•k‹Ÿ…HR–º—þÝxB³ß^üÅ‘ôØZ‡??FÛ_s€Ç7E÷Sï(~&"I)Z¾W ¿ýx BƒM—a$=¦ïÛ[ß{Ã|üŠ‘¤ µûwõpL¡î#Q­añEÒµü)1¼íòy¹IöšˆAg—o iÔÝícþuñ3Iª^ÿ¦O/î Ô½|yñ/ZÒký²µ·îòM`1Ô?Ø4ûÁè¥ÏR$©jpí#^1è.Î T?²%ª•ûÿ¢%MEkÝA1zèö]úåXlƒ›Ï™ýŒÒg*’T5¸þ5Ç/Î Ô½äÅ¿XISQ­|jÔw~m—~ñJé}îƒåÏU$iº¹µÖ¿`—þ•Г„êm÷Dµrßâ_¬4ñÍ,‰Ág<é_x€âêat>þ†òç+’4ÝÜú׸°ƒP÷‚÷ÿ"%MEÿªÃžô/;À¸U[¢uØs‹Ÿ±HRÕÐZú¹ˆaa¡úá;£Z±wñ/Ršôºçþ鮞«ÆÚðÛÌž…?‘¤éfÕÛð7ó3µOz]ñ/FšÔzŸ_6ÏSл|ºøyŒ$U «µîgfßím·¡á·Zå¥BuOÿ½ˆQ=ŸÏTãmTGç”7?—‘¤ªa ¾}áî BÝ Sü‹&±ö±¯ˆèUóù8УöÖh}èEÅÏg$©jPÝ3ߺƒÐ°ÕÚgÿ"¤I«µî =|ç¿‘¤ª ¾uÊ“„Úþ)¦´hµyyŒºÛò¹  ÑúW\ü G’ª´ã­6Ÿð Tw·Ï~°}é‹–&¡ÖÁÏŒú[ú™  ÙFõìgc”>Ë‘¤jÜ[¹oD¯õÄ¡ÁÍç–¿`išÙ#†›.ZŒG&€ÆU[¢uè³ËŸéHÒôx7Ü|Ù„:ç½»øÅJ“PÿÊCãY áw¿Õ²¥ÅÏu$©ãz—þ턪ß_üb¥ìuNsÄh´ÏI©ì8è,}¶#IÕ×þûûÿ„†÷ÝTüB¥ìµ~YŒºÛë —zþ}ñ3IªÆµeKcÔ~ðñ¡Þ—×—¿P)q­5D½uób>"¤3zèöÙs–Òg=’TiÃç>þ Ô>õ·Š_¤”¶™=bø‹óÙ ­á¦ £šYRþÌG’¦Ç¯Þç>ø8ƒP]GµæÀâ)e­ÿ¥Cù± ·Þ…ï)~æ#IÕÖ9éõ?ynÙXü¥¬uÏxKÄh´ØÏD¹ ºÑ>ö•ÅÏ~$©³Z«Ÿ1ªç„úמPü¥ŒµzIŒºÛJ<¤Wo½uöà³ô$UcV}ÿƹ¡Î9ï,~qR¶Z«özËM%ž…&Æà›/~$IÕ˜µãÞ8ç Ô:æåÅ/NÊÖà†ÓK<Lœî¿_ü,H’ª1ªwÉûç„ú¨–ïUüâ¤Lõ.þ«B?“gÔ~0Z‡?¯ø™$UcRçÿyçAhxÏ7Š_˜”©öñ¯ŽöJ=ÿL¤áæK£šYRülH’ª1¨}ÄÏï<õ¿qrñ “²ÔZû¬m»»ÔsÀDë]øžâçC’TC3{D :„º—| ü…IZ¶töÿD A'Úþ…òçD’4]¾zËM„Ú'¿¡øEIêi]ÉÇ"¢¾ûZŸ™.IÓS1¼ù3„ZG¼¸øEIM¯sÚïDŒF%ŸuøGý/®.~^$IUáú_;æÑûâTÔèVì]ü¢¤&×:üy1j=Pô!€3ª£sâk‹ŸIRU°Þ¥ÿûÑÛâTÅÑ… IDATýÐÅ/HjtË÷Šá_)ú|ÀÎFÞ­ÕO+~$IÓeêžóÇÞ§ß»²øIM®ÿ•#Š>Øð“ ®ûXñó#Iª Õ9ù7½Nõ¿õñâ$5µÎ©¿åsƒÆ\÷Œß/~Ž$IUÚǼüÑ{áTïŠ5Å/Hjb>7 FÕýÑZwPñó$Iª¹÷¾2Õ½äÅ/Hj\>7 Q†·|6ª™%åÏ•$izñj­ÚÿÑûàTçÓÿ­øIMËç4O÷¼w?W’¤j1›Y1ªgïSíO¼©üI Êç4T¯ŠöQ/)~¾$IÕ"6ê=2{ œj÷êâ#5¥ÖúĨý`éGvQ}çW£Z¶´ø9“$U‹Ôhû÷gïS­#-âÒjÙž>7 Þgÿgù³&Iš^œên™½÷MU‡=¯øÅHM¨ÿÅÕ¥ŸU˜ƒn´~Yñó&IªuZû¬â#{_QK?ª0O¼uœ¤jBª·Þ:{ß›ª~fñ‹‘ƹ֚bôð¥ŸQ˜g½‹ßWüìI’ªE„VíWüb¤qn¸ñ¼ÒÏ&,„~+ÚG¼¸øù“$U X½uóì-oªZ¶gñ‹‘Ƶޅï-ýXÀ~÷‹QÍ,)~%IÕ5zð¶ÙûÝTé ‘ÆµöG~1bÐ)ýLÀëžÿçÅÏ¢$©Z  BÒãµbŸ¨ï½¡ô³‹¡WEëC?WþLJ’¦ç?ƒô8 ®=¾ôc‹hxÛç½uœ¤È˜AHú uNséç èžû'ÅϦ$©šç BÒµÖ>+FÕ–ÒÏ0ên‹ÖáÏ+~F%IÕ"H’$I’$iÌê=tKÊfîÿ0ýéYQ ͳÿ>úl I’$I’¤1­uÁ¿‡ßdÏÀBˆj<*®±6ú\ I’$I’¤q­§|Áá÷`ÙÓ°bìuo;;úH I’$I’¤1¯ûãï…߃dOÃBˆ±Ö<ý“ÑgI’$I’$U¤æÉ ¿Èž‚…c+Ÿ÷¢Tdk¢Ï’$I’$IªHŦ|ïç‡ß‹d›`!ÄØêÜrjô@’$I’$I«}å¢ð{1€l,„Kÿ,zöK’$I’$©Šõº©~È[ÃïDz_`!ÄØÉ÷~^*Öß=ú%I’$I’TѺ«–¥lbZø=@ös,„;닞ù’$I’$IªxÍS>~Oý !ÆJã˜?N©(¢ç½$I’$I’*^±þ¾”ÍyVø}@öY1>fï–ŠÇWFÏzI’$I’$©_{éìø;3€éY16ÚËFÏxI’$I’$éguš©~ÐëÃïÍ2 !ÆEýˆw¦ÔëFxI’$I’$éIuxVøÝ@f!ÄX˜±Cê=pCôl—$I’$I’6YãøÆß¡•WX1êZMDÏtI’$I’$é)ë­¹-e3w ¿GªÍBˆ‘V_ø†”:è™.I’$I’$=m­ïýsø]PmBŒ®‰i©û“%ѳ\’$I’$IzƊ憔ïûòø;5 U•…#«yÎç¢ç¸$I’$I’´Ùu®;&üN ¨U–…#iò§)ŠÆÚè.I’$I’$m~E‘ê‹ß~·Ô*ÉBˆ‘ÔýáYÑã[’$I’$IÚâz«¯MÙÄvá÷k@­r,„9Í“þ"znK’$I’$I[]ó¬O‡ß±µÊ±b´ÌÞ-kWEÏlI’$I’$i«+²‡S¾÷óãïÚ€T%BŒ”ö²ý£çµ$I’$I’´Íµ¯80ü® ¨UŠ…#£þõ·¤ÔmGÏjI’$I’$iÛë¶S}ᯇ߹µÊ°b4LLKÝ•GiI’$I’$iÊêÞöíø{7 U……#¡yæßFÏgI’$I’$iÊkóGáwo@­,„(½|î ú/Ú“$I’$I’Æ­Þ×§lb»ð;8 6ö,„(½Î5‡GÏeI’$I’$i`5OûDøP{B”Zý°w¤ÔëFÏdI’$I’$i`kïNÙ¬]Âïâ€ÚX³¢¼&¶K½û®ŠžÇ’$I’$IÒÀk}ÿßâïã€4Î,„(­ÖyŸžÃ’$I’$IÒP*kS>ïEáwr@mlYQJù>/îAI’$I’$©*µ—/ ¿—jcËBˆRê¬82zþJ’$I’$IíÛNõƒ^~7ÔÆ’…¥S?ô¿¥ÔëF_I’$I’$ièun==ü~¨% !J§{÷%ÑsW’$I’$I «qÔ{Ãïè€ñc!D©4Oýxô¼•$I’$I’BëÝwUÊ&¦…ßÕµ±b!DyÌÞ5kWEÏ[I’$I’$)¼æ)_¤qb!Di´—Ίž³’$I’$IR)*_™²Y;‡ßÙµ±a!D)äû½2¥V=g%I’$I’¤ÒÔ:ÿ+á÷v@mlXQ ›O‰ž¯’$I’$IR©*ê§|Þîáww@m,X®qä{R*Šèù*I’$I’$•®öå„ßßµ±`!D¬‰íRïë£çª$I’$I’TÎ:Í”ðšø{< : !B5ÏútôH•$I’$I’J]çºcÂïñ€Úȳ"Îì]S±îÞèy*I’$I’$•»^7Õ~cü}F™…aZM¥’$I’$IÒHÔ¹ù”ðû< 6Ò,„‘ïóâT4×GÏQI’$I’$i4*ŠT?ômá÷z@mdY¢}õaÑ#T’$I’$I©ºwœ~¯ÔF–…CW_øë)uÛÑóS’$I’$I¹ßø½ðû= 6’,„ºîmgGÏMI’$I’$i$뮺,ü~¨$ !†ª¾øwúÏ;•$I’$I’´u5Ž}_ø=P9B ÏÄ´Ô½çŠèy)I’$I’$t½ûWôïÚÂïû€4J,„šæ©=+%I’$I’¤±¨ñ­ÿ~ßÔFŠ…Ã1s§Ô{ì®è9)I’$I’$E½‡nIÙÄvñ÷~@B Eë¼ÏGÏHI’$I’$i¬jžö×á÷~@mdX1x³wMÅúû£ç£$I’$I’4Võ»3e3wŒ¿ÿÒ(°bàZ|5z6J’$I’$IcYóì¿¿ÿj#ÁBˆÊ÷~^*òG£ç¢$I’$I’4–V÷ŸÐ}ÔJÏBˆj_<'z&J’$I’$Ic]ëü/‡ßµÒ³b`òy/JEsCô<”$I’$I’ƺ"$å{='ü>¨•š…Ó¾|Aô,”$I’$I’*Që¢éá÷@­Ô,„ˆ|ß_I©]žƒ’$I’$IR%*ëR¾÷óÃïZiY1‹£g $I’$I’T©ZþWø½ P+- !¦\¾àµ)u[ÑóO’$I’$IªTEþ¨w é©X1å:7ž=û$I’$I’¤JÖúþ¿…ßµR²bJÕz}J½NôÜ“$I’$I’*Y‘?’ò9Ï¿'j¥c!Ä”êÜxBôÌ“$I’$I’*]ëü/‡ßµÒ±bÊÔ|ß’$I’$I’‚+žx0e³w ¿/j¥b!Ä”é\\ô¬“$I’$I’4ù[Bç}!ü¾¨•Š…S"_°‡ß’$I’$I’JR±þ¾”ÍÚ9üÞ¨•†…S¢sÝÑÑ3N’$I’$IÒÏÕ<ç³á÷†@­4,„Øfù¯I©ÛŠžo’$I’$I’~®bÝ=)›¹Søý!P+ !¶YgőѳM’$I’$IÒ&jžõéðûC V Bl“|ÿWûí I’$I’$©¤õ»+e3v¿Gjá,„Ø&kŽˆži’$I’$I’ž¦æ{†ß#µpBlµ|¿W¦ÔiFÏ3I’$I’$IOSï‘;R6cûðûD ÊBˆ­Ö¾|Aô,“$I’$I’´5OûDø}"P e!ÄVÉç¾0Í ÑsL’$I’$IÒfÔ[s[Ê&¶ ¿Wja,„Ø*­%3¢g˜$I’$I’¤-¨yòGÃïZ !¶ÜìÝR‘­‰ž_’$I’$I’¶ Þ÷ú-!˜^]Bl±Öy_ˆž]’$I’$I’¶¢Æ ¿_j!,„Ø23vHÅÚ»£ç–$I’$I’¤­¨»ê²ø;F E°b‹4ÏØ3zfI’$I’$IÚ†êGþ?á÷Œ@mè,„Ø|ÓRï¢ç•$I’$I’¤m¨ûóâï4lBl¶Éç‹J’$I’$IñŠ"Õ~cø}#P* !6[wÕ²èQ%I’$I’$i ê¬82ü¾¨ •…›¥¾øÝÑ3J’$I’$IÒTÕi¦|ß—‡ß;µ¡±b³tn95zDI’$iªjç©xâÁÔ{äG©·úÚ¾îÝ—¦î]>ÙßO[Nûe·ž¾ñÿ¾réÆÿÿoêÿâX*ê§Ô®Gÿ/”$IÒfÔ¾tŸð{G 64B<£|ÿW§ÔëDÏ'I’$ýbFÿ@?ùhßÉài/_˜Z?øÏÔ:÷Róô¿Iÿ,5¾ñû©~èÛR¾`”Ï}aÊfì0¼³äìÝR¾ï¯¤ú!oMcÿ¤ÿßÔúî?¥ö%{§ÎµG¥îmg§î=WôSEs}ôWS’$©rµ)ßë9á÷@m(,„xFíeûEÏ&I’¤ÊUÔK½û®NÝž•ÚW.J­ ÿ+5ÏüTj÷þT_ôæËœ§ÒäeDýßL“þ<µ¾÷/©}õaýßRê=ú㔺­è?I’¤±lòÜ}†ÃBˆ§•Ïyvÿ'$I’4õMž³z÷¯H›NJí‹ç¤æéŸLõ#Þ•òy»‡ŸKgÆö)?àWSã˜?JÍoÿïþoCuW^¼ñu’$IÚêŠõ÷¥læNñç= š…O«uÞ¢g’$IÒhWôRï‘;úïÞ™|TÚäoùÔÿNÊ÷yqøYo\ä¼&5NüHj-™‘:?ÿ¥áç/Jnb»T?ü·û ì=tsô__I’¤ÁUôR}áâÏ_@ !~Iëÿ=z$I’¦¶VÖ X낯¦ú¢7…Ÿ·m“‡ZKf¦ÞcwEÿÍ–$Išò&C:ú¼ÔÂBˆ'›±}*ÖÞ=w$I’¶¹Þƒ7¦ö%sSã¿—²™;ÆŸ³?ÓRã¨÷öÛ¬Èþ+/I’45u)Ÿÿ²ø³¦š…OÒ8ñ#Ñ#G’$iëêuSwÕ²¿ä1 ÛŒíSãØ÷¥Î ǧ¢¹!ú»A’$i›j/¾ÒT³âIº?þ^ô¼‘$IÚìŠæúÔ¹é[©yê_¥|ïç…Ÿ¥`R¾×sRëÜL½‡n‰þ‘$IÚªŠ'JÙ¬ÃÏU@mJYñSõ_×qœ$IR©kç©{û¹©yÆž)›ó¬ð3<úaïè?‡?µëÑß9’$I[TóÌO…Ÿ¥€Ú”²â§Ú—/ˆž3’$Iϼš½[ø¹ ¶T>÷©õÝ/¥âñ•ÑßM’$I›UïëÃÏP@mJY±Ñì]SQ,zÎH’$ý¬n;uo?'5OþhÊfí^‚©0±]jœð¡ÔýÑù)Eôw™$IÒÓÖ8ê½ñç' M !úšg}:z¾H’$õë=|kj]ðÕ”ïó’ð3 RýëoIŽO©×‰þ¶“$IÚd[O?3µ)c!D_ïþÑóE’$U¸bÃêÔ¾dnª/|Cø¹†-_°Gê\sxJFô·¢$IÒ“ëuR¾ÿ«ÃÏK@mJX‘êG¼+z´H’¤*VôR÷® Só”¥læŽág"ˆ6ù[q­%3SÑXýÝ)I’ôÓÚ—Í?'µ)a!Dê\wtô\‘$Iªx|ej]4=åû½"üe”Ï}Aÿ{¤ÈÖD»J’$õß;žÍÞ-üŒÔ¶™…PÅåsžŠæ†è¹"I’*PwÕ²¿ 4cûð3Œ„9Ïê¿O«h¬‹þö•$I¯yögâÏF@ÚVB×<ûï£ç‰$Iã&ð¤³bqª/zsø¹FU>o÷þ£Z¼cH’$EÕ{ø‡)›˜~.jÛÄB¨âz÷]=O$IÒÖ{ôÇ©uÞR¾×sÂÏ;0.ò¯MOì¿K’$iØ5ŽùãðóPÛ&BVÿú[¢çˆ$I³z«¯MÍ3öôX8 ú¢7¥Î-§E»K’¤ŠÕ½ýÜðsPÛ&BÖ¾â è9"I’Æ¡¢—º·};5Ž|Oøùª¤qô¤Þ7DH’¤ªTôRýÀ×…Ÿ€ÚV³ªªY;§"4zŒH’¤Q®ÛJkJõ…oˆ?Û@UÍØ¾ÿxÆ¢±6úA’$U É0?ÿikYUTóÔGÏI’4Ê‹ ŽOõ-üLl”ÏÛ=µ—/ô~!I’4Њ憔ïõÜð³PÛ*BÕ½ëÂèù!I’F­N3uV,Nù~¯ ?Ë›V?ü·Sïþk¢?-$IÒ×úÎÃÏ<@m«XUP¾àµ~rP’$m~FÿÑùü—…Ÿc€Í0c‡Ôúî—RÑXýé!I’ưޣ?NÙÄvñg m) ¡ j_<'znH’¤Q¨×IG¦|ÿW…Ÿ_€-—ÏiêÜ|Jô'‰$IÃ'|(ü¬Ô¶˜…PÕLLKÅÚ»£g†$I*sE‘:·œ–ê ßv¶Ùä…M±auô'‹$I£ºw^~Æj[ÌB¨bGÿAô¼$I%®û£óSý·†ŸY€©•Ï{‘ß’$ISWQø2˜>z,„*¦sÝ1ÑãB’$•°ÞšÛSㄇŸU€Ášü>÷ÛB’$i*j_~@øÙ¨m ¡*™½«ËJ’¤'Uäö_>?ùúð³ 0ùܤΊÅÑ?’$i þ-‘ÍÚ%ülÔ6›…P…4Oýxôœ$Ie©ÓLíKç¥|¯ç„ŸQ€Í“ÿßTdk¢?$IÒ×<ý“ág ¶Ù,„*dò’$IÝŸ\”ê¿1ülÄËç¿´ÿRhI’¤­©»jYøy¨m6 ¡ŠÈ÷yIJ½NôŒ$IëïKÍ3ö ?—%31­ÿèÈÔmGLI’¤¬þõ·ÄŸg€´9,„*¢uþW¢gƒ$IŠª]O­%3=ßxZoü^q,I’´%µ¯úzø9¨m ¡Šè=pCôl$Iuï¾4Õþð³0òy»§îçEtI’¤ªh¬KÙœg…Ÿc€Ú3²ª€ú¢7GÏI’4äŠÆÚÔ<û3ýGAEŸE€}„\§ýQ&I’F¤æYŸŽ?Ãé™XU@û²}£g‚$Ib›¾Õ`ômõÃ+ëî‰þH“$I#PïþkÂÏ.@íY»‰iþ'IREš|÷GãøÿþÆÆäryòÑ“’$IÏTý°·‡Ÿ]€ÚÓ²s#ß= $IÒêÜrZÊç¾0ü쌡;¤öeó£?æ$IRÉë¬XnÒÓ±sí+EÏI’4ÀŠ'J“þ<üÌŒ¿æéŸL©]þØ“$I%­h=‘ò½ž~fjOÉBhœMl—Š DÏI’4 :7Ÿ’òy»ÇŸ9€Ê¨/þÿÆ$IOYëÜ?¯µ§d!4ÆGÿaô $I¨hnHͳ?~Öª)ß÷WRïÞ+£? %IR ë=xSøY¨=% ¡1Ö¹æðè I’¦¸ÉKØ|Ááç  âfí’:7žý‘(I’JØäo‡ŸU€´)BãjƩȎþü—$ISUQ¤öò…)›¹cü9`ÒÄ´ÔZ23úÓQ’$•¬ÎõÇÅŸS€´)BcªqìŸDöK’¤)ªXj|ã÷ÃÏ›Ò<çs)õºÑ•’$©,µë)ŸûÂð3 Pû%BcªsÝÑÑý’$i ê®\šòù/ ?[<Æqïï¿ßL’$i²Öù_?Ÿµ_b!4ŽfúcÑŸû’$i[wÙü”ÍØ>þl°ê‡ÿv*žx(úÓS’$• ÞšÛû—>Ÿµ'±C>ý™/I’¶¡É÷6Ž}_ø™`Kå öH½Gîˆþ•$IÑõ:©~Ø;ÂÏ&@íI,„ÆPçºc¢?ò%IÒVֻ杖ï÷ŠðóÀÖÊçížz÷.þ8•$IC¬x|eêÜ|Jj}ïŸSã¨÷¦lγÂÏ$@í—X›Û§"$zH’¤­¨sã‰)›½küy`[ÍÞ-uïúAôǪ$I@Ec]ê®ZÖÄuã„§|þKãÏ@ÚBc¦qÌEÏI’´¥õ:©uÁWÃÏSjÖΩ{Û·£?a%IÒ¶Ôm§ÞêkS{ùÂÔïEá瀡˜˜ÖÔŒ$IŠ©h®ßøÞŸÉG¿ò1ïýéÕd!4FÚ—î=[$IÒfÔ¹î˜þc”¢ÏÃÖ¾xNôG°$IÕxïÏ÷¦ÎŠÅÞû¤Ÿg!4Fzkn7’$éé*ŠÔúÁ†Ÿ"µ/™ýi,IÒ˜½÷ç–þ5Ïù\ªöö”ÍÜ1|ÞµR²“›~I’TâzÔüöß…ŸÊ }ÙüèOeI’F2ïý²m`!4&ZMžG’$é©je©ñÍ? ?/”I{ÙþÑŸÎ’$Ø{^>¿ÚH³½Õ×FÏ(I’´‰ŠüÑT?â]ág€Ò™˜–:+ŽŒþ˜–$©u©wï•©½üàÔ<ý“©¾ð Þû¤©f!4òý^Ñ'$I*Wź{Rýàß?+”ÖÄv©sýqÑ×’$ ·¢—zÿ0u®?6µÎýÇT?ü·¼÷HÃ`!4šg&zŒI’¤_¨x|eÊì~N(½Û§ÎMߊþØ–$iˆïýyaüüRYîíçDÏ5I’ôsõÖÜÞÿ Þè3ÀH-…n>%úã[’¤m®hnøÙ{ÎØ3å ^?g¦od!4êfíÜQµ$I*G½nHù>/Ž?#Œš™;¥î]FŒK’´ùuš©wßU©}Õ×ûËŸþ㢽÷˜^^B#®qÜ¢GŸ$Iú¿õî»:ås_~>Uù^ÏI½Õ×FœK’´é÷þ¬¹-un8>µÎû|ªñÎþ3DÏN€l X¸ÉŸ@$Iñõ¸Þ2` Lþ–eï‘E¬K’*Þ/½÷gÞîá3 ÛFB#®÷Ø]ÑóQ’¤Ê×{ðFÿ@˜Bù‚=RñăÑï’¤Š¾÷§¾èMá³  ¡69œ$IRl½oJù¼…Ÿ ÆMý·¦¢±6+‘pn IDATúc^’4nõ:©÷ð­ýG¿5ÏþÌÆåÏÄvás  ¡Öúþ¿EPI’*Ýä?$'m}&Wcß—R·ýq/IÕŠ"õ¹#unøfj}ç‹©~Ä»R6kçðù±aÝ»/«’$U¶ÉCT¾ïËÃÏã®yêÇû/ò–$é™*6<ð ïýñ›üÙϱQùÞÏïÿŠ«$I~“ﵨøºðó@Ux:‚$i“ïýY¹4µ/›Ÿš'ýEÊ÷{eø¼ÈJÎBhD5OþhôÜ•$©’u©~èÛÂÏUÓY±8zH’JðÞŸÖw¿”ꇽÃ{¦o9 ¡åC’$Ô®§ÆQ¿~¨¤™;¦îO–DOIÒ*6¬Þøè· ¾šG¾'e³wŸCÓGŸ…Ј*_=›%IªV½nÿ9äÑg€*ËçížzÝ=$ISü8æþòç¢é©qÜR>÷áó SB#¨~Ðë£gµ$I•«õ/†Ÿ¨¥úÂ_OEýñè± IÚŠŠÖ©»jYj/_˜šgì™ê‹Þ”²‰iá³ « ¡Ô:ïóÑó[’¤JÕ^¶øüàgßøý”º­èñ IÚ‚÷þôý6sÇðU˜…ÐêÞvvôH—$©2un=Ý kJ¨ùí¿‹’¤§}ïÏná³€Ú“Xš;¤¢±.zÆK’T‰z÷]å¶%Ö^~pô¨¤JVd§îç¥Ö’©qüûïx‹ž Ôž‘…ЈiõÞè™/IR%*6<òý^>ûx3vHÝ•G IïZ™÷þLB#¦½tvô1@’¤ñ¯ÓHõ#Þ>÷xfù>/IÅúû¢'‡$G½î&Þû³Søg=µ)a!4bz÷.>H’4ÞEjžö×á3€ÍW?â])ušÑD’F÷½?Kf¦Æ±ïóÞ€éãÍBh„ä{??¥^'ú¬ IÒX×¾tŸð™À–kžóÙè"I¥®È֤qùóÍ?Mù¼…vP* ¡ÒøÖÿˆ>;H’4Öu²$e3¶ŸùlεGEI*GÝvê­¾Ö{H?ÏBh„´¯80ú8!IÒØ6ùþ‰|Ÿ‡Ï{¶Á¬Sïþk¢GŠ$ 7ïý`úæ±!½®>bH’4žuÛÿá\‚yÀ¶É÷Uÿ±H’T‰÷þœðáþ+¢?{¨ ¡‘Ï}AJE/úÌ!IÒX6ù“”ѳ€©Ó8îýþý$i,*òGS÷Gç§öÒÙ©q‡R¾ÏKÂ?c¨, ¡Ñ8ñ#ÑgI’ƲÎÏ ŸóL½ö¥ó¢GŒ$mYízêÞsyj_qPjžö‰T?ðuáŸ¥ÔÆŠ…Ðˆðþ I’ôÞ y»‡Ïy`Æ©»jYô¨‘¤ÍïϬã?;HãÌBhDx$IS\ÑK£ÿ0|Æ08ù~¯LEþHôÄ‘¤_~ïÏÜ„FP« ¡0ùrÀÉŸ‘$IS×äsØ£g<ƒ×øæŸ¦TÑcGR…*šëû¿¡Ø^¾05OùXÊç¿,ü³2 ¡ÑàýA’$Mm½{—÷%=ãà–4°:þÙ²¿ü9ýoRý ×‡æ@ö,„F€¼H’4…µóT_ø†ðùÀÍÜ1õî½2zIƒ&/Ò¼÷€lDYï’$iêj}ç‹á³€áË쑊ƺè1$i„*ÖÝ›:·ž‘Zü{jý)ßë9áŸem ¡’Ë÷~^ÿ¥×’$iÛë®\š²‰iáó€ÍÓ?=Š$•´¢±6uïúAj_²wÿÑýù¾/ÿÌ€lŠY•\ãøFŸ‰$IZYªøºðÙ@¬ÎÍ'GO$IÑuÛ©÷ð­©³bqjž±gª/zSÊ&¶ ÿ|€lÀ,„J®}ñœèc’$IcQëÜŸëÄË÷~~*ÖÝ=–$…¾÷g—ðÏ"ÈX•\÷'K¢ÏM’$|½û®òSŸüTãØ÷¥TÑãIÒ*6¬NÝÛÏM­%3Sã„§|ÞîáŸ9•„…P™ÍØ!­'¢ÏR’$vÝVª/zsü\ TÚËFO(IÛXÑܺ«–õ¿Ÿ'ý–/xmøg d%f!TbõÃÞ}¶’$iäk/>Ó(¡Y;§ÞC7G)I›[¯³ñ½?7ŸšgÆ{`ú–³*±Öw¾}Ü’$i¤ë=rGÿÂ/z¦PNõCßÖÿMRI%«(RoÍíßûsÞRýˆw¦læNáŸ8 ¡ëÜ|rôL’¤‘®qÜÂç9åÖúÁD+©òõßûsÛ·SëÂÿê¿ã+ßûy០! ¡+ÖÝ}&“$id›¼TˆžåŒ€‰íR÷žË£Ç–T™&ß•üóïýé?ú-ús¦Wƒ…PIåû¿:úŒ&IÒèÖix©0›­~ðoôg‡¤Á½÷§õÝ/õß•ì½?P c!TRÍÓ>}l“$idk/>Ë-“ª’4~»ýÜԺ૩qä{R6{×ðïm öSB%Õ^~pô9N’¤‘¬XÊfï>Ë13vH½Õ×F1id*6<º·Ÿ“Z~-5Žý“”ïýüøïc = ¡’êÝ{eôÙN’¤‘¬yÖÿ ŸãŒ¦ú!oM©ÛŠeRéòÞ¨ ¡2š¹cJízôyO’¤‘«÷ÐÍ)›±}ü,`dµ–ÌŒgRùÞûã|iX•Pý°·Gÿ$IÉÇ} |Ž0Ž».z¤ICË{ VB%Ô<ç³ÑçAI’F®î]†ÏpÆCýз¥ÔmG6iÊ+žxhãò碉þÒäs_þýÔ†ÆB¨„:×~#úŒ(IÒÈU_üîðÀøh_ºOôh“¶ý½?w_’ÚËöOÍS>–ò^þ}ÔBY•Ðäû$IÒæ×½ã;áó€13{×Ô{ì®è'mÕ{ú~›¹Sü÷ÊÄB¨lfïÖ?ÈI’¤Í¯~Ä;ãg8cgò‘ZR©ßû³dfjû¾þ]Bô÷ P+= ¡’iõ»ÑçJI’Fªîmߟߌ¯ÎÍ'G:U¼¢±.uW-KíËæ§Æ Nù>/ ÿ¾j#ÉB¨dZç%ú¬)IÒHU?ìíáó€ñ•ÏY*k£ÇªR+KÝU—¥ö夿©•ò~5ü{¨ ¡’ñÓg’$m~Ý». ŸÝŒ¿æ9Ÿ‹yÇz]ïýÒ0Y•Lï±;£¤’$Lã?>»¨€‰íR÷ž+¢ÇžF¼âñ•ým}ïŸSã¨÷zï†ÍB¨Dò½ž›RQDŸQ%I‰zÝ’²‰iáó€j¨ý-)uÛÑãO#’÷þY Y•ÈäOI’¤Í«yæ§Âg7ÕÒ¾lßèñ§2ÖÎ7.®805OýxÊìþw Û ¡i}ç‹ÑÇXI’F¢býýž±ÀðÍÞ-ë*Û{fíÿw`ú3³*‘ÎuGGm%I‰Zü{øÜ šš§}"z jˆV§îíç¦Ö’™ý6÷á²­d!T"½Õ×EŸu%I*}EsCÊ÷~~øÜ ºº+—FC  ¢¹~ã£ß–/LÍS>–òù/ ÿ»M! ¡²˜±CJFôùW’¤Ò×¾ü€ø¹ @¥Õ½)¥n;z$j[ê¶7>úmÅâÔ· }ÅAÑSQ››÷þ¤IB%Ñ<óSÑGdI’J_çÆÂg6LÊ÷zn*6<=µ‰¼÷ ¶IB%ѾâÀè3³$I¥¯~èÛÂg6üÿü`_|EýñÔ½óû©}ñ^©q⟥|þËÂÿ^d%e!T^J*IÒÓ7ù’çèy O21-uï¹"zDV§N#õî]žÚËNÍÓÿ&Õ¾Á{¦o> ¡’(êE­%I*uÍÓ>>¯àÕÿ­”Š^ô˜¿ŠÞÆ÷þ\ljû©~Ø;R6sÇð?o€l„Y•@¾ï¯Dµ%I*uE¶ÆËŸ(­Î ÇGÊ1|ïÏ Ãÿ\²1c!Tcÿ$úì-IR©k_²wø¼€§’ï÷Š”ZYô¸™Šæ†þ£`Û˦æ{¦|ÁkÃÿ ² °*Öù_Ž>K’TÞzÝ”ð«áóžÎäo¶hõ:ývÃñ©yögR}Ñ›R6±]øŸ@VAB%йö¨è#º$I¥mòñ1ѳžÑìÝR±þ¾”ªþÞŸ5·¥ÎõÇ¥ÖyŸOõÃ;e3wŠÿ³ M²*޽ˣí’$•¶Æ‰ ŸÕ°9š§2Uú½?óvÿ3 ö”,„¢MLKEc]ô9^’¤RV<ñPÊfî?¯`sLLK½û®NÕxïÏñ_oÒ–° –ïÿªès½$I¥­½lÿðY [¢¾øwR*Š4Òyï@GBÁÇ0ú¨/IRi«/zsø¬€-Õ¹å´42Eê­¹=unøfj÷…T?â])›µsø×€Ú”³ ÖúÞ¿Dÿ%I*e“܉žÓ°5ò¯M©ÛJe¬ØðÀ/¼÷çEá_/jCa!¬sÝÑÑÿ$©”5Ïù\øœ€­Õ¾êèQšŠæúÔ]¹4µ/›Ÿš'ýEÊ÷{eø×€Z ¡`½û®Šþ7‚$Iå«ÛJù܆ÏiØZù>/IEsÃgg;õî_‘ÚWššgþ­÷þ~‘…Pô@cíðþ IÒˆÔ½ã¼ð Ûjò±lƒªØ°zã£ß.øjjùž”ÍÞ5ü/µR³ ”ÏÙÀþq IÒ(×<í¯Ãç4l«|γSñăÛ<'°{×…Þû@ÚBßø½)¸2“$iÌjçý ´è9 S¡uî?nÑ,ZO¤îªe©½|ajž±çÆG¿•൑g!¨ùíÿ= ›4I’F·Îͧ„Ïh˜23vH½5·mzèõ:©÷ð­©sÃñ©õÝ/¥úaïHÙŒíãÿ›HãÈB(P{Ù~ýa“$ij|ë†Ïh˜JÍ“?úïýÙ-ü¿ €ZeXêÞvvð•›$Iåjò19Ù¬]Âg4L©‰i)ŸûÂøÿR•Yê­¹=úÞM’¤RÕ¹õôðù ! ¡(3¶O©Ûоw“$©T5OÿdüŒ˜>~,„‚Ôüµè;7I’ÊU¯›òy»‡Ïh€l Yiœð¡èk7I’JUwåÒðù ) ¡ ­ó¿}ï&IR©j}÷ŸÂç3@6¦,„‚´¯>4úÞM’¤R•/Ø#|>dcÊB(H÷GçGß»I’TšzÜ>›²1f!dòâK’$m¬}å¢ðÙ 1 ¡ÓRê4¢ïÞ$I*Mÿ,~>L_Bòý^}ï&IRyêuR¾×sÃç3@6Æ,„4ŽúÝè«7I’JSwÕeá³ sBšgüÑwo’$•¦ÖEá³ sBZKfFß½I’Tšê‹ß>›²1g! sÃñÑwo’$•£V–²;„Ïf€lÌY˜|W‚$IJ©û“‹Âç2@VB_ôõ÷Gß¿I’TŠÚKg‡Ïe€¬,„†mæN)½èû7I’JQã¸ÄÏf€éãÏBhÈò{Dß½I’TŽzÝ”ïý¼ðÙ U€…Ð5¾ñûÑ×o’$•¢Þ7„Ïe€¬",„†¬yú'£ïß$I*Eí«¾>—²Š°²Öþ#úþM’¤RÔ,úþM’¤RT?øás « ¡!ëÞq^ôý›$Iá­'R6cûð¹ U„…Ðõ¼1úN’¤ðº«–…Ïd€¬B,„†ý¯?}'IRxíå‡Ïd€¬B,„†iönÑ÷o’$•¢æ™ŸŠŸËÓ«ÃBhˆê =úþM’¤RTÿú[Âç2@V!BCÔ8æ£ïß$IН]OÙŒÂç2@V!BCÔ² ³Æ¹¹!úN’¤Ðòý_>² ³´‰íR*Šè{8I’BËfï?“¦W—…Ѐåsž}'IRlÝvø<¨ºÂBh°ò}_} 'IRhEcmø<¨ºÂBh°ê½>úN’¤ÐŠ «Ãç1@ÕBƒU?ômÑ÷p’$…Ö{ìÎðy Pu……Ð`5Žzoô=œ$I¡õº9|T]a!4Xã?}'IRh½û® ŸÇUWX VóäFßÃI’ZwåÒðy Pu……Ð`5ÏüÛè{8I’Bëþè»áó ê ¡Áj÷…è{8I’BëÜzzø<¨ºÂBh°Z?øè{8I’BëÜp|ø<¨ºÂBh°Úω¾‡“$)´Î5G„Ïc€ª+,„«½l¿è{8I’Bk/?8|T]a!4Xí+EßÃI’ZûŠÃç1@ÕBƒÕY±8úN’¤ÐÚËöŸÇUWX Öä‹´%IªríËæ‡Ïc€ª+,„«sË©Ñ÷p’$…Ö¾dnø<¨ºÂBh°º·Ÿ}'IRhí‹ç„Ïc€ª+,„«{çÑ÷p’$…ÖZ23|T]a!4XÝ»/¾‡“$)´Ö…_ ŸÇUWX Vᆱ¢ïá$I ­õƒÿŸÇUWX VïÁ£ïá$I ­õý ŸÇUWX Vï‘;¢ïá$I ­õ½ ŸÇUWX ç ,IRUkÿ•ðy Pu……Ѐ¿Àë‡“$)´Ö÷ÿ5|T]a!4à/ð†ÕÑ÷p’$…Öºà«áó ê ¡³5Ñ÷p’$…Öºðkáó ê ¡ëGßÃI’ZkÉŒðy Pu……Ѐ¿ÀÍ Ñ÷p’$…Ö^:;|T]a!4X©]¾‡“$)´ö%{‡Ïc€ª+,„+uÛÑ÷p’$…Ö¾tŸðy Pu……Ð`¥¢ˆ¾‡“$)´ö²ýÂç1@ÕB4cûè;8I’Âk_q`üL¨¸ÂBh€fí}'IRxíåÇÏd€Š+,„hönÑwp’$…×¾êø™ Pq……ÐYI’”:+ŽŒŸÉWX МgEßÁI’^ç†oÆÏd€Š+,„ÈBH’¤Ô¹å´ø™ Pq……Ðàäsž}'IRxÝ;Î ŸÉUWX Ž…$I)urQøL¨ºÂBhpò½ž}'IRxÝ{.ŸÉUWX Ž…$I)õV_>“ª®° !I’Rê­¹-|&T]a!48ù^Ͼƒ“$)¼âñ•á3 ê ¡Á±’$)¥â‰Ãg2@ÕBƒc!$IRJEc]øL¨ºÂBhpò9ÏŽ¾ƒ“$)¾N3|&T]a!4@³v‰¾‚“$©eÛÅÏe€éÕe!4H3wŒ¾“$©M>F5|.L¯. ¡AšØ.úþM’¤R”ï÷Êø¹ 0½º,„,Eôœ$IáÕ½)|&df!4`©×¾ƒ“$)¼úâw‡Ïd€¬Â,„,u[Ñwp’$…×8îýá3 «0 ¡Kízôœ$Iá5OþhøLÈ*ÌBhÐ_àÖÑwp’$…×<ë…Ïd€¬Â,„ýn¬¾ƒ“$)¼Öwÿ)|&df!4è/pþhôœ$Iáµ.šŸÉY…Y ú üăÑwp’$…×^¶øLÈ*ÌBhÐ_àu÷FßÁI’^çš#Âg2@VaBÖ{ìÎè;8I’ÂëÜtRøLÈ*ÌBhÀzß}'IRxÝ;¾>“² ³°Þêë¢ïà$I ¯{Ïåá3 «0 ¡ëÝ{eôœ$IáõÖÜ>“² ³°îÝ—DßÁI’^‘=>“² ³°î]?ˆ¾ƒ“$)¾^'eÓÂç2@VQBÖ½ã¼è+8I’JQ¾÷óÂç2@VQBÖ¹õŒèû7I’JQ¾àµás ª,„¬sÓIÑ÷o’$•¢úá¿>—²Š²°ÎõÇFß¿I’TŠÇ} |.de!4`í«¾“$©5OûDø\È*ÊBhÀÚËö‹¾“$©µÎûBø\È*ÊBhÀZKfFß¿I’TŠZKf„Ïe€¬¢,„¬õý¾“$©µ—>—²Š²°æ9Ÿ‹¾“$©un›² ²ú?ìÝw´¥uyèñ3h4&¹èŠ1ƘD½i&¦j²âé…D£©F1=÷ª1¦Ç•xÎÌPfBoƒE^E@@@ŠÒD†&R”)¿Ý÷~ß»†d%*Å)çìçÙïûù®õùسÝûyæœw~iu÷YôîM’¤4uxyøl(-ä ´Ä:{~GôîM’¤4õÞÿšðÙ PZÈAh‰uvnôîM’¤4õOú½ðÙ PZÈAh©-lW×U½“$)Eƒ3ß?›æÛÇAh êa7zÿ&IRІí>—J 9MãEî<½“$)E£«ŸË¥…„¦ñ"åsÑû7I’R4¾ùôð¹ PZÈAh &nŠÞ¿I’”¢É=—‡Ïe€ÒBBS0¹÷Êèý›$I)Úô<¢ç2@i!¡)ßyaôþM’¤ Jø\(-ä 4ã[ÎŒ^¿I’”¦²ÛsÂg3@i¡)}úÄèÝ›$IiêîÿÒðÙ PZÆAh F×¾?z÷&IRšzïMøl(-ã 4ÃOì½{“$)MýSþ(|6”–qš‚Áï‰Þ½I’”¦Á¹ÿ>›JË8MÁàÌwDïÞ$IJÓ¦ŸœžÍ¥e„¦ Ê›¢wo’$¥itãÉá³ ´ŒƒÐô>øëÑ»7I’Ò4¾û²ðÙ PZÆAh º‡ýtôîM’¤4UÝ>›JË8MAwÿ—EïÞ$IÊÓ¨_—…eáó ´ˆƒÐtVí½z“$)UÕÏŸ(ש IDATÏ¥E„¦aa»º®&Ñ»7I’ÒÔ=ä•ñó`¾=„¦õB÷¾½{“$)M½cwŸÍ¥E„¦üBK’¤ºîä¯Ãg3@i¡)™ÜmôîM’¤4 /Z>›J‹8MÉøŽó£wo’$¥itíûÃg3@i¡)ÝxrôîM’¤4ן>›J‹8MÉèêâwo’$¥iòÅÂg3@i¡)^¼*z÷&IRšªîÆðÙ PZÄAhJûçèÝ›$I©êìþÜðù PZÂAhJú§ÿeôÞM’¤Tuþ¡ðù PZÂAhJz'¾1zï&IRªzÇüfø|(-á 4%½üBôÞM’¤TõÏx[ø|(-á 4%ÝC~4zï&IRª†—¬ŸÏ¥%„¦¤³Ï‹£÷n’$¥jtÃñáó ´„ƒÐ´ìöœè½›$I©ß}Yü|˜o¡)ªGýèÝ›$Iiª¾'|6”–pšæ‹ýð=Ñ»7I’ò4×eÅáó ´€ƒÐMî»&zõ&IRª:û¾$|>”pš¢ñ­Þ»I’”ªÞ‘?>ŸJ 8MÑèºDïÝ$IJUí.áó ´€ƒÐ /Y½w“$)Uƒ Þ>ŸÚÀAhŠgÿ]ôÞM’¤T®9"|>”pš¢þ)oŠÞ»I’”ªñí ŸÏ¥„¦¨÷_ŒÞ»I’”ªÉ—nŸÏ¥„¦¨{ðEïÝ$IÊÕ°[—…eá3 4œƒÐuVí½v“$)]½^>£JÃ9MÓ²º¢÷n’$¥ª÷¾Ÿ‹ŸÑóÍæ 4íü‘û¢÷n’$¥ªÚ[Ãç3@i8¡)›Ü]ôÞM’¤T .\>ŸJÃ9MÙxý9Ñ{7I’R5úÔÃç3@i8¡)}êèè½›$I©ß}iø|( ç 4eÃK÷ŒÞ»I’”ªMÏ׋žÏ¥á„¦lpÎ?DïÝ$IÊUUÕe×o ŸÑ¥Á„¦¬ꛣ×n’$¥«{ІÏh€Ò`BSÖ;ê—¢wn’$¥«wìÎá3 4˜ƒÐ”uþáè›$IéœõÎð PÌAhÊ:«Ÿ½s“$)]ÃOì>£Jƒ9MÛ²º£÷n’$¥j|óéñ3`¾¹„"^ôG¿½w“$)U“/~:|>”s 0¹ÿÚè½›$I©ª…Ïg€Ò`BÆ7$zï&IRº:ÿñíá3 4”ƒP€á•k¢wn’$¥«{ÄÏ„Ïh€ÒPBç½;zç&IRºúkß>£JC9è¯Ý%zç&IRº®ŸÑ¥¡„ôŽ|môÎM’¤tn8>|F”†r ÐÝÿ¥Ñ;7I’Ò5¹÷ªð PÊA(ÂÊgÖuUEïÝ$IJUÕ}(~FÌ7“ƒPÔ _¾½w“$)]ÕÏ ŸÑ¥„‚Lî¿.zç&IRººGüLøŒ( ä d|ËÑ;7I’ÒÕ?í­á3 4ƒPáUïÞ¹I’”®áºÝÂg4@i ¡ ƒóÿ-zç&IRºF7ž>£J9Ùô+q$IÒ×6¹ÿÚð PÈA(H�s“$)]Uÿ‘ð PÈA(Hwÿ—EïÜ$IJYç?¾=|N”†qвòYu]UÑ;7I’ÒÕ{ßÏÅÏi€ùfqŠ|ñ;FïÜ$IJWÿC>£JÃ8š|áúè›$Ié^¼*|F”†q 4¾õ¬è›$Ié}æÔð PÆA(ÐðªC£wn’$¥kÓOÐFÏh€Ò0B¼'zç&IRºªÁcuYX>§Jƒ8êŸö'Ñ;7I’RÖÙë;Ãç4@i¡@½£~)zß&IRÊzøÅð9 PÄA(Pg¿ï‹Þ·I’”²þo ŸÓ¥A„"­Ø¡®'ãè›$Ié~ò€ø9 0ßBÑ_¹;zç&IRºÆ·>£Jƒ8ßµ.zç&IRºª‡î ŸÑ¥A„‚®;*zç&IR¾ªI]v}vøœ( á lpáòè•›$I)ëòÊð9 PÂA(Xÿ´·FïÛ$IJYÿä? ŸÓ¥!„‚õÞÿšè}›$I)ÛôS´Ñs 4„ƒP°ÎÞ/ŠÞ·I’”²Ñ§OŸÓ¥!„¢-,«ëQ/zç&IRº&÷_?§æ›ÁA(Ƀë£wn’$åkPÿ‡Ñs 4€ƒPãÛ?½r“$)e}^>§J8%0ºú°è}›$I)ëý«ás 4€ƒPƒóÞ½o“$)eƒ³Þ>§J8%Ð?ù£÷m’$¥lxåšð9 PÀA(îa?½o“$)eã;.ŸÓ¥„è¬~~ô¾M’¤”UÜ>§J8%QõÞ¹I’”¯ªª;»?7|N”ç ”Ää£Wn’$¥¬{èO†Ïi€2ã„’ßü‘è}›$I)ë¯Ý%|N”ç ”Äðò£÷m’$¥lxñªð9 PfœƒPƒ³ÿ.zß&IRÊ6ýmôœ(3ÎA(‰Þñ¯Þ·I’”²É—o ŸÓeÆ9%Ñ]óŠè}›$I9›Œë²òYá³ Ì0¡,vý¦º®&Ñ+7I’RÖ=ä•ñ³`~v9%R=roô¾M’¤”õO}søœ(3ÌA(‘ñFïÛ$IJÙpÝîás Ì0¡DFW½o“$)e£Ï~(|N”æ ”ÈàÜŠÞ·I’”²Éƒ·†Ïi€2Äéÿúè}›$I9›Œê²ò™á³ Ì(¡Dºý`ôºM’¤´u×üHø¬(3ÊA(“•ϬëÉ8zß&IRÊú§üQü¬˜ŸMBÉT_ù\ô¾M’¤” /Ú5|N”å ”ÌøŽó£÷m’$¥ltÓÚð9 Pf”ƒP2Ã+‰Þ·I’”²É†Ï†Ïi€2£„’œýwÑû6I’r6ÖeÅŽá³ Ì ¡dzÇî½n“$)m݃8|V”ä ”L÷€—GïÚ$IJ[ÿä?ŸÕe9e³|ûÇ%Ž$Izbƒ WÄÏj€ùÙã ”ÐdãíÑû6I’R6úÌ)ás Ì ¡„ÆëÏŽÞ·I’”²É†›Âç4@™AB /?(zß&IRÎÆÃº¬Ø1|V”ã ”Ðà¬wF¯Û$IJ[wÍ+Âg5@™1B õ>økÑ»6I’ÒÖ?õÃg5@™1B uöûÞè]›$Ii^¼*|V”ã ”ÑÂvu=êGïÛ$IJÙø–3ãg5ÀülqJjò¥[¢÷m’$¥¬zè®ð9 PfŒƒPRã›?½o“$)gUUwvnø¬(3ÄA(©á¥{F¯Û$IJ[÷ˆŸ ŸÕe†8%ÕÿПFïÚ$IJ[ÿô¿ ŸÕe†8%Õ=üUÑ»6I’Ò6¼üÀðY PfˆƒPRÝ¿åñg$H’¤'6¾óÂðY PfˆƒPbÕ£÷GïÛ$IJYÕy0|N”â ”ØøÎGïÛ$IJ[gÏ„Ïj€2#„^¹&z×&IRÚzGýrø¬(3ÂA(±Á™ïˆÞµI’”¶Á9>«ÊŒpJ¬wÔ/EïÚ$IJÛèÚ#Ãg5@™B‰uözaô®M’¤´Mî½*|V”á ”\Õ}(zß&IRÎ¥. Û…Ïj€2„’›ÜsEôºM’¤´uöû¾ðY Pf€ƒPr£ëŽŠÞµI’”¶Þ ¿>«Ê pJnð±‰ÞµI’”¶Áï ŸÕe8%×;þuÑ»6I’Ò6ºñ¤ðY Pf€ƒPrÝý_½k“$)m“ 7…Ïj€2„²[þŒºõ¢÷m’$ål2ªËÊgÅÏk€ùÜ„fÀä£×m’$¥­{èO„Ïj€’œƒÐ }æ”è]›$IiëøÏÃg5@IÎAh /Z½k“$)mÃË ŸÕ%9¡Ð?åMÑ»6I’Ò6¾ë¢ðY P’sšÝC^½k“$)mUwcø¬(É9Í‚•ϪëÉ8zß&IRÚ:{Wü¼˜ÏËAhFL6Þ½k“$)m½ã~+|V”Ä„fÄøæDïÚ$IJÛà‚ŸÕ%1¡1¼xè]›$Ii}æ”ðY PsšýSÞ½k“$)m“/Ý>«JbB3¢»æÑ»6I’ò6×e×g‡Ïk€’”ƒÐ¬X±C]Ñë6I’ÒÖ=ì§ãç5À|NB3dòÀg¢wm’$¥­ú_…Ïj€’”ƒÐ ÝxRô®M’¤´ ¯\>«JRB3dðñùè]›$Iiß}iø¬(I9ÍÞ oˆÞµI’”¶ª÷p]–…Ïk€’ƒÐ éîÿ²è]›$I©ëìû=áó $ä 4K¶«ëA‰ÞµI’”¶Þñ¯Ÿ×óù8͘É}×DïÚ$IJÛàã á³ $ä 4cFŸ::z×&IRÚF7>«JBB3fpî?EïÚ$IJÛdãíá³ $ä 4czüõè]›$Iy«&ug·oŸ×%¡ÓÙûEÑ«6I’R×=âgÃç5@IÆAhUÝÑ»6I’Ò68óíá³ $ã 4ƒÆw_½k“$)m£kŽŸÕ%¡4¼êÐè]›$Ii›Üwuø¬(É8Í ÁY½k“$)o£^]Vì>¯J"B3¨wäk£Wm’$¥®»æáó $â 4ƒ:«vŠÞ³I’”ºþÚ]Âç5@IÄAhFU~!z×&IRÚ†ŸØ/|V”D„fÔøöó¢wm’$¥m|ç…á³ $â 4£†—í½k“$)mU÷¡º,, Ÿ×% ¡Õ_û–è]›$I©ëìû’ðy P’pšQÝ5?½g“$)u½Þ>¯JB³jùöu=êGïÚ$IJÛð¢•ñó`>¡6ùÂõÑ»6I’Ò6¾åŒðY P’pša£O}0z×&IRÚª‡ï ŸÕ% ¡68ç¢wm’$¥®³úùáó $à 4ÃzGýRôžM’¤ÔõŽúåðy PpšaÕϋ޳I’”ºÁÇþ9|^”„f\õÈ}Ñ»6I’Ò6ºáøðY PpšqãõçDïÚ$IJÛdÃgÃg5@IÀAhÆ /ùè]›$Iy›Œë²ë³Ãç5@ æ 4ãú§¼)zÕ&IR꺇¿:|^”`B3®{ÐFïÙ$IJ]ÿŒ·…Ïk€ÌAhÖ-F];Ñ»6I’Ò6ºúðøy 0ËA¨&÷]½k“$)m“{¯ ŸÕ%˜ƒPŒ®=2z×&IRކݺ,ß>|^”@B 08û]Ñ«6I’R×=ø‡Ãç5@ ä Ô½#_½g“$)uýÓÞ>¯J ¡èìñmu]UÑ»6I’Ò6¼üÀðy P95Dõðç£wm’$¥m|÷¥á³ rjˆñ-gFïÚ$IJ[5x¬. Û…Ïk€ÄA¨!†ëvÞµI’”ºîA?>¯J¡†èŸôûÑ{6I’R×?õÍáó qjˆîþ/Þ³I’”ºá'ö Ÿ×%ˆƒPS,,««ÞÃÑ»6I’Ò6¾k]ü¼˜á Ô ãÏ]½k“$)mUÿ‘ÇÿEô¼(„døÉ¢wm’$¥®»ÿËÂç5@ à Ô ýÓþ$zÏ&IRêú§üQø¼(„¤»æG¢÷l’$¥nxé^áó pj’åÛ×õ°½k“$)mã;??¯æ§ÏA¨a&÷]½k“$)mU÷¡º,, Ÿ×eÊ„ftÍÑ»6I’R×Ùï{Ãç5@™2¡†éŸñ¶è=›$I©ëŸôûáó L™ƒPÃtuôžM’¤Ô /Y>¯Ê”95Í®ßTדQô®M’¤´o?/~^ÌO—ƒPM6ܽk“$)mUçËá³ L™ƒP®?6z×&IRê:û|wø¼(Sä Ô@ƒsþ!zÏ&IRêz'¾1|^”)rj Þ~!zÏ&IRê†ëvŸ×eŠ„¨³Ç·ÖuUEïÚ$IJÛxýÙáó L‘ƒPÃÿb%IÒ«{ |V”)rj¨ÑM§EïÚ$IJ]gï…Ïk€2%B 5¸à=Ñ{6I’R×;þõáó L‰ƒPCõŽÝ9zÏ&IRꆭ Ÿ×eJ„ª³ç ¢÷l’$¥n|ëGÃç5@™¡«ûbô®M’¤´UåKá³ L‰ƒPƒ×Ÿ½k“$)u}^>¯Ê85ØpÝîÑ{6I’R×?ñwÃç5@™¡ëð†è=›$I©^¼*|^”)pj°M¿G’$=uãÛÏ Ÿ×e „®zìè]›$Ii«ºë²°,|^”%æ ÔpãõçDïÚ$IJ]g¿ï Ÿ×e‰95ÜpÝîÑ{6I’R×?ùÃç5@YbB ×;á Ñ{6I’R7¼lïðy P–˜ƒPÃuöyqôžM’¤Ôïº(|^”%æ ÔÕcDïÚ$IJ[Õ¤. Û…Ïk€²„„Z`|۹ѻ6I’R×=ðûÃç5@YBB-0\·{ôžM’¤Ôõ×¾%|^”%ä Ô½Þ½g“$)uÃO>¯ÊrjÎ>/ŽÞ³I’”ºñÝ—…Ïk€²„„Z¢*¢wm’$åmØ©ËòíÃç5@Y"B-1¾íÜèU›$I©ë®yEø¼(KÄA¨%†ï½g“$)uýýYø¼(KÄA¨%z'¾1zÏ&IRê†W>¯Êqj‰Î>/ŽÞ³I’”ºÉ½W†Ïk€²D„Z¤*¢wm’$åmÔ«ËŠÂç5@YB-2¾íÜèU›$I©ë¾÷ÇÃç5@YB-2¼xè=›$I©ëä¯Ãç5@YB-Ò;ñÑ{6I’R7ºæˆðy P–€ƒP‹töùîè=›$I©›Ü]ø¼(KÀA¨eª²!z×&IRÞÆÃº¬|Vø¼(‹ÌA¨eÆëω^µI’”ºîᯠŸ×e‘9µÌpÝnÑ{6I’R78ëáó ,2¡–éÿºè=›$I©]Lø¼(‹ÌA¨e:{~GôžM’¤ÔM¾tKø¼(‹ÌA¨…ªGî‹ÞµI’”·ªª;{|[ø¼(‹ÈA¨…Æ7Ÿ½j“$)u½£~9|^”Eä ÔBƒ þ=zÏ&IRêçÿ[ø¼(‹ÈA¨…zGÿjôžM’¤Ô?ûáðy P‘ƒP uVý¯ÇŸ I’ž¼ê‘{Ãç5@YDB-5ÙxGô®M’¤ÔuöúÎðy P‰ƒPKn<)zÏ&IRêz'¼!|^”Eâ ÔRƒsÿ1zÏ&IRꆯ Ÿ×e‘8µTïÈŸÞ³I’”ºñç‡Ïk€²H„Új·çÔõd½k“$)mUïáº,l?³æ·ƒP‹M6ܽk“$)uÝ¿?|^”Eà Ôb£O½g“$)uýµ»„Ïk€²„Zlpæ;¢÷l’$¥nxùAáó ,¡ëþªè=›$I©›ÜsEø¼(‹ÀA¨ÍV>³®Gýè]›$Iyõê²bÇø™ 0¿m„ZnrÿµÑ«6I’R×=ô'Ãç5@ÙFB-7ºú°è=›$I©œùöðy P¶‘ƒPËõ?üÑ{6I’R7ºî¨ðy P¶‘ƒPËuùÑè=›$I©›l¸)|^”mä ÔvËŸQ׃½k“$)oÕ¤îìþ-ñ3`~ë9Q?ÿ‰èU›$I©ë}àÂç5@ÙBÔÃOî½g“$)uƒóþ5|^”mà DÝ?õ£÷l’$¥ntÓÚðy P¶ƒuwÿ—FïÙ$IJ]õðçÃç5@ÙBüç¡lˆÞµI’”ºÎ^/ Ÿ×e+9ñ¸ñú³£÷l’$¥®wüëÂç5@ÙJB¯Êrâkô?üÑ{6I’R7úÌ©áó l!!¾FwÍ+¢÷l’$¥®zøóáó l!!¾ÖÂvuÕ$z×&IRê:{}gü̘ß|B<Áø®uÑ{6I’R×;áwÂç5@ÙB<ÁðÒ½¢÷l’$¥nxÉêðy P¶€ƒOÐ?é÷£÷l’$¥n|ç…áó l!ž ³Ï‹£÷l’$¥®ê?Z—åÏŸÙe39ñ¤ªGïÞµI’”ºîšW„Ïk€²™„xRã›?½g“$)uýÓÿ2|^”Íä Ä“\ðžè=›$I©]ó¾ðy P6“ƒOªwô¯FïÙ$IJÝ䋟Ÿ×e39ñ¤:{|k]W“è]›$Iy›ŒëÎnß>³Êfpâ)M¼5zÕ&IRêzG¾6|^”Íà ÄS]LôžM’¤Ô Îû×ðy P6ƒƒOipÖ;£÷l’$¥nôÙ…Ïk€²„xJÝÃ_½g“$)uÕ£÷‡Ïk€²„xj+v¬ëQ?z×&IRê:{Wü̘zB<­É½WEïÙ$IJ]ÿ¤ß Ÿ×åpâi ¯88zÏ&IRꆗí>¯Ê7à ÄÓêŸöÖè=›$I©î’ðy P¾!žV÷ÀïÞ³I’”»a§.Ë·ŸÙåi8ñô–ÕU÷¡èU›$I©ëúñ3`þ©9ñ ï8?zÏ&IRêgýMø¼(OÃAˆohxñÑ{6I’R7ºá¸ðy Pž†ƒßPïø×GïÙ$IJÝdãáó < !¾¡Îžß½g“$)}=_>³ÊSpb³T>zÏ&IRê6ýDmô¼(OÁAˆÍ2ºimôžM’¤Ô /Y>¯ÊSpb³ Îû×è=›$I©ßµ.|^”§à ÄféùÚè=›$I¹”º,ß>|f”'á ÄæÙí9u=E¯Ú$IJ]÷½??³æŸÈAˆÍ6yàÆè=›$I©œùöðy Pž„ƒ›mtí‘Ñ{6I’R7ºþØðy Pž„ƒ›­Æÿ‹Þ³I’”ºÉÆÛÃç5@yBl¶î{,zÏ&IRî¬~~øÌ(_ÇAˆÍ·üu=(Ñ«6I’R×;î·ãg6Àü×rb‹Œï¾,zÏ&IRꆯ Ÿ×åë8±E†ŸØ7zÏ&IRêÆw]>¯Ê×qb‹ôOþÃè=›$I¹”º,ß>|f”¯â Äéìû’è5›$IéëòÊð™ P¾Šƒ[¬zô Ñ{6I’R×?ãmáó |!¶Øø–3¢÷l’$¥nd´ÄÁ IDATô©†Ïk€òU„Øbƒ Þ½g“$)u“ׇÏk€òU„Øb½£%zÏ&IRî¬~~øÌ(ÿÅAˆ-ÖÙã[뺚D¯Ú$IJ]ï¸ß ŸÙå¿8±U&_º9zÏ&IRê†ëvŸ×å¿8±U6=,[’$=uã;?>¯Êqb« Î|{ôžM’¤ÔUýGë²üá3 8±µº‡þDôžM’¤ôuyeøÌ(Blµ;Ôõ°½g“$)u›~¢6|fÌ;± ÆŸÿdôžM’¤Ôn8.|^!¶Åð“ûGïÙ$IJ]õÐ]áó 8±-ú§¼)zÏ&IRú:{½0|fTBl­Î~ß½c“$)}ý“~/|fTBl‹ê±¢÷l’$¥nø‰ýÂç5@å ĶßzVôžM’¤ÔMî¹"|^TBl‹ÁÇ¢÷l’$ån<¬Ë®ÏŸÙ@»9±Mzüµè5›$Iéë½ÿÿ„Ïl Ý„Ø&=¾­®«IôžM’¤Ô Î{wøÌÚÍAˆm6yðÖè=›$I©ßrFø¼ÚÍAˆm6ºþØè=›$I©«:ÖeaYøÌæZËAˆm68ëo¢÷l’$¥¯{àÿŸÙÀ\k9±Íº‡ýTôŽM’¤ôõ?üçá3˜k-!¶ÝŠêzØÞ³I’”ºÑ5Ù@ÝVB,ŠÉ=WDïÙ$IJÝdÃgÃç50×ZB,ŠáåFïÙ$IÊ]UÕU;…Ïl`®•„XýSß½f“$)}½cwŸÙÀ\+9±(ºû¿4zÇ&IRú†ï>³€¹VrbÑTeCôžM’¤ÔïZ>¯€¹Vrbьן½g“$)wÃn]Vì>³€¹ÖqbÑ .\½f“$)}ÝÃ~*|fs­ã Ä¢éóÑ;6I’Ò78û]á3˜k!MgÕNu]UÑ{6I’R7ºñäð™ ÌµŽƒ‹jòåÛ¢÷l’$¥®zä¾ðy ÌµŽƒ‹jtÃqÑ{6I’Ò×Ùç»Ãg60×*B,ªÁGÿ6zÇ&IRúú§þqøÌæZÅAˆEÕ=üUÑ;6I’Ò7¼ê½á3˜k!׊ëzÔÞ³I’”ºÉ??³€ºM„Xt“{¯ŠÞ³I’”»jRwVí>³€¹ÖpbÑ ¯88zÍ&IRúzÇýVøÌæZÃAˆE×_»KôŽM’¤ô /Y>³€¹ÖpbÑuxyôŽM’¤ôï¾,|fs­á Äâ[XVW/GïÙ$IÊݨ_—•ÏŠŸÛ@ÝB,‰ñmçF¯Ù$IJ_ïý¯ ŸÙÀ\+8±$†­ŒÞ±I’”¾Áùÿ>³€¹VpbIôŽÝ9zÇ&IRúÆ·~4|fs­à Ä’è¬~^]WUôžM’¤ÔU½¯Ôea»ð¹ Ì5žƒKf²ñŽè=›$Iéëò£á3˜k<!–ÌèÓ'DïØ$IJßàÌw„Ïl`®ñ„X2ƒ³ß½c“$)}£OŸ>³€¹ÆsbÉtuôŽM’¤ôUÜ>³€¹Æsbé¬|f]úÑ{6I’Ò×Ù÷%ñs¨›ÌAˆ%5¹÷ªè›$Iéë¯}KøÌæÍAˆ%5¼rMôŽM’¤ô®>,|fsæ Ä’ê¯Ý%zÇ&IRú&|&|fsæ Ä’êðòè›$Iù«ªº³úyás˜k,!–Ö²ºê|9zÍ&IRúzÇ¿.~nuS9±äÆ·½c“$)}ÃK÷ ŸÙÀ\c9±ä†­ŒÞ±I’”¾ñç?>³€¹ÆrbÉõŽÝ9zÇ&IRþƃºìúMás˜k$!–\gÕN?,[’$=}½#_>·€¹Frb*&ïˆÞ±I’”¾Á…ËÃg60×HBLÅèÓ'DïØ$IJßøŽ Âg60×HBLÅàìwEïØ$IÊß°S—;†Ïm`®q„˜Šîᯎ^±I’4uøÙð¹ Ì5ŽƒÓ±ò™u=êGïØ$IJßà¼wÇÏm n!¦frïUÑ;6I’Ò7^vøÌæÇAˆ©^qpôŽM’¤ôUýGê²üás˜k!¦¦¿v—è›$I3Q÷ПŸÛÀ\£815Ý^½_“$i&œó÷ás˜k!¦gaY]u¾½c“$)}ãÏ~8~nu“81UãÛÎÞ±I’”¾ª»±. Û…Ïm`®1„˜ªáE+£wl’$ÍDÝ5¯ŸÛÀ\c81U½c~3z¿&IÒL48óás˜k !¦ª³j§º®ªè›$IéÝxrøÜæÃAˆ©›l¼=zÇ&IRúªÇ¾>³€¹ÆpbêF7½c“$i&êðòð¹ Ì5‚ƒS78û]Ñû5I’f¢þé>·€¹Fpb꺇¿:z¿&IÒL4ºþ˜ð¹ Ì5‚ƒÓ·ò™u=êGïØ$IJ_õ•ÏÅÏm n!BLî½*zÇ&IÒLÔÙ÷%ásÝòíãÿ óíâ DˆáGï×$Iš‰ú§½5|nÀ6Y¾}Ý=ø‡ÿŽ;¼üÀzrÿµõ賊ÿsÍ·‹ƒ!úkß½_“$i&]ó¾ð¹ [¢³× ëÞq¿]/ݳß}Y]»Oø¾;¾ýcáÎÒ2B„èðò€•š$I³×äÁõásžJgÏÔ½ã_W×íöø‘§ênܬï»ãÏ]þg/-ã DŒ…euÕyp‰Wh’$5£ÎÞ/ŠŸÝ°ÛsêÞû~®œý®ztý1õdÃMu]U[õ]wÓsæÃÿ{æÛÅAˆ0ãõç,òºL’¤fÖ?õÍás€v?÷çñ_ý6,ÚwÝÉ7Æÿ7狃a†­\´I’šœç0­çþ .\Q︠®‡%ý®;ùòmáÿÍ¥e„Ó;æ7—ôE’¤¦4Ùx{øÜ 9:{|ëþê·óÞ]o9³®Ê†©×­¹7üu(-ã D˜Îª¶ú÷KJ’Ô¶:û|wøì ÝÏýYÌ6=c>üµ™o!BmúÏ’$é×_»KøÜ ¹åÏXÒçþ,jƒÿzÍ·‹ƒ¡F7ý±#IÒL4ºöÈð¹ @»Ÿû³¨MÆá¯_i!B >ú·Ñ;’$ÍD›þO[ôÜ ÝÏýYìÊŠÃ_×Ò"B„êþªèÏI’f¦Î¾/ ŸÝLÁŠêî¡?™î¹?‹]g÷o‰­çÛÃAˆX+v¬ëQ?úsG’¤™¨ÿ¡?ŸÝ,ýsZ²3íìù‚ø×¾=„7¹÷ªèÏI’f¢Ñ§ŽŸÛ,âs6ýê·îCu[ó›0æ¦ÊAˆpÃ+ŽþÜ‘$i&ªþ|øÜ`ómú•h?÷gÓ¯~ûÌ©uõØÑ_-SÕ=èÂÿŽJ‹8®¿ö-ÑŸ;’$ÍL}¿'|vðÏýÙô«ß>òýܟŬûÞ‹ÿ{›o!Âu÷YôçŽ$I3SÿÃ>»Z¯ÅÏýY̺Gülüßå|{8oaY]uŒþì‘$i&Úô¯ÌÂg7@ËxîÏÒÔûÀ/†ÿÝ–q"…ñús¢?{$Iš‰ª‡ï ŸÛízîÏ£¿ 6¶Þ±;‡ÿ}—q"…M—uI’´yu÷iøìhîs&Ñ_ûZSÿÄßÌ·‡ƒ)ôŽùÍèÏI’f¦þé>»fQg¿ïûºçþô¢¿âµºþÚ·„¿'J‹8‘Bgõó꺪¢?$Iš‰F7>»²ëìý]ÿÊðÒ=ëñ]ÕUÿÑè¯súºú§ÿeøû¤´ˆƒiL6Þýù#IÒLT=ú…ð¹ Ig÷çþÏs®?¦®º+ú«›6£M¿ª/ú½SZÄAˆ46ýkgI’´yuxyøì±|ûÿ|îÏio­G×á¹?3ÜàÌ·Ç¿ŸæÛÃAˆ4ýÛèÏI’f&ÿŠ h‹Î^/¬û'ÿçþ4°ÁYï •q"îᯊþü‘$ifÝxRøìXl½_T÷N|c=¼du=¾óºê?ýõKKØàœ¿Ï•q";Öõ¨ý$IÒLT• uYX?¿í¹?ÿ¹¬V{œûáïÃÒ"B¤2¹÷ÊèÏ I’f¦îš ŸÝ›Åsô$ >ö/ñïÍùöp"•áåEI’43ùÑz`fžû3ìF…RÂçÿ[ø{µ´ˆƒ©ô×¾%ú3H’¤™i|ëYá³`Óñ§wÜo׃ WÔã[ά«ÎƒÑ_—4# >>þþ--â D*Ýý_ý$IÒÌTõ­ËŠÂç7Ðݾùkžûóø¯~“¶²MGÄè÷ti!rYXæ_H’´uøÙøù 4þ¹?›~õÛäþk=÷G‹ÚpÝnñïóùöp"ñús¢?‡$Iš™üx=°Ø¿úmxéžžû£©4¼xUøû¾´ˆƒélú1AI’´yïZ>»€ÙÓÙãÛêÞÑ¿â¹? mÓñ1ú ¥E„H§wÌoDI’4;uÙí9áóþ?{woWYz|‡ÙyÀYkëTµWk­µ­W[[;h[ÛZ[mm«Vo¯¶u¸Þöj§œ d ŒÃæy&2ˆ€Ìˆ„! džB€ÙkÏk½÷s”2„$'9g?{­õý~>¿?oïrÞçÍ~ö^«©‘Í{U½îþ÷ѬQB¹²/O©(¢Ï"(ö!¿>¿%I’$ð{òAô?[`z?Ú=þoff}²ÒH–?xSôY¥Ñ»p§ðÙ-I’$iTÞû“Eÿ6ZïâÅáCÍe!¤‘¬¿âˆè³Jcüѳ[’$IRÀ{šDÿs6Kï’=Ãÿ®š5ÊBH#Y÷{_‹>‹ <Š¿%I’$Ma;¼àÙïýñš*¦Ù>ñk3ë“…F²Ö¾¿}@©tŽúdøü–$I’´‰ÍÚòiïý™xôÛ ýÏ ˜výåûÅÿýͬOBÍfo“R¿}@iô.Ý+~~K’$IšÔ{&ývËYÞûCmõ¯80üï±Y£,„4²åw]}@iä«o ŸÝ’$I’ž]6ÿ%?úíÌ}â½?«¢ÿù#£å!á£Íe!¤‘­wñâèóJ%Ûù áó[’$IjÖý½?û(uOÿçÔ¿æ˜T<|kô?`¤õWÿw;³>Yidë÷×Ñç”Jç„Ï…ÏoI’$©6yïl¶þU‡Åÿ-ϬOBÙZ»¿5ú<€Ré_uhøü–$I’ªZ¶Û›RçØ¿L½‹vKƒÛ/L©ÛŒþ'”žGÆ5†š…FºbíýÑg”FñØ=á³[’$Iªä{|FÓ¢ÅáïÍe!¤‘n|௵øáó[’$I*UsŸ÷øòçûÿ7õ¯>*åÝ}­‡Úè/ß/þ ˜YŸ,„4ÒuÏúÏè3 J¥û½¯…ÏoI’$©Tïýéw¢¯ñP[ýËö‰?fÖ' !tíƒ>}&@©Œÿº6z~K’$I£R¶ÓkSûð§î9³ô[ëáè+;ð½K÷ ?'š5ÊBH#]6ïE)åƒès Ê£ÛLÍ9Û†ÏpI’$iØeó^üø£ßNûzê_{œ÷þ@ ô~üð³£Y£,„4òå÷]}.@©´øpøü–$I’¦µÙ[?þè·“¾”úWšòU×¥TÑWq`’z?úvüy2³>Yiäë_¶oô¹¥Ò;~øü–$I’¦²l·7{ïTPï¢ÝÂÏ—f²ÒÈ×Yö…ès J%¿û²ðù-I’$MÝ{оbÓ¤÷ÃÃÏœf²ÒÈ×ZüŽès Ê¥ÈS¶ðá3\’$IšÔ{®:4kn‹¾MCÔ»pQø9Ô¬QBýÆfø&LRç˜OÇÏpI’$iƒïýÉ£¯Î@ Þù âϦ™õÉBH¥hpÓéÑg”JÿòýÃç·$I’êݳßûÓŽ¾&#¦wÞágU³FY©?3ØxÅ£w…ÏoI’$Õ'ïý6EïÜ9áçW³FY©µùhôÙ¥3þ¾è.I’¤ê•Í{ÑÓßûóð­ÑW_ ¤ºg…ŸiÍe!¤R”Í©gÊÀ$u¿÷µð.I’¤’7k«ÇßûsÂgSùRïý¦T÷¬ÿŒ?çfÖ' !•¦|ÕÊèó JeüQÑó[’$Iå{ô[ç˜Oyï0Ýü[ø¹×¬QB*Mý+Œ>Ÿ \ºÍÔœ³mø —$IRIÞû“=}ƒj¦{æ·ÂÏÂf²Riêœô¿£Ï'(öŸá’$IŠ/Ûá…O{ïÏģ߂uOÿ—ðó±Y£,„TšZKÞ}>@éôΟ>Ã%I’÷ÞŸñG¿å÷\î½?ÀHê~ÿñgæÌúd!¤ò4¶E*:FŸQP*ùÝËãg¸$I’¦¯±©µÇÛ_þüø;)¿ë’”úèk(ÀFÿÕbø9:³>Y©T n9+úŒ€r)ò”-|Eø —$IÒt½÷guô`“uNúRø¹Ú¬QB*U½óæEŸQP:c>>Ã%I’4ù¼÷¨ºÎ Ÿ ?k›5ÊBH¥ª}øEŸQP:ýËŸá’$IÚ@³·N­½ß—º§ücê_yðãËïý*ÎCÍBH¥*[¸}JE}N@©Ý;ñlùè9.I’¤g?ú­wá¢4¸ý‡)õZÑ×F€¡kñÇáçq³FY©tåÞ}N@é´–¼;|†K’$ÕµlþKSûàßýï÷þ4ˆ¾Œ„öÁ¿~F7k”…J×ø3s€Ééžù­ð.I’T‹vxÁ³ßûãi'ëÔÞÿ7âÏí™õÉBH¥küYºÀä n=7|†K’$U®Y[¥Öw~!uNølê]¼Çã~t£¯~¥ÑÚçWâÏò™õÉBH¥«µ×{£Ï)(ŸA/eó_>Ç%I’ªðÞŸ‰G¿ÝrVJ½,ú–Pj­%ï ?Û›5ÊBHåkÖ–©è®>« tÚG~"~ŽK’$•¤ñ/ÓxïÀôjíþÖðó¾Y£,„TÊ·}V@éô—/ Ÿá’$I#™÷þ„Èv~}ü ˜YŸ,„TÊzì}V@éÞ>Ã%I’›µ¥÷þŒˆláöñsaf}²R)kù§Ñg”Òø‡Ñs\’$i˜yïÀèÿ…fôœhÖ( !•²lÇWEŸUPJÝÓÿ%|ŽK’$Më{Æývæ¿>ñÞŸUÑ×/ÖcüW›Ñ³£Y£,„TÚŠ‡o>¯ t?=;|†K’$MI³·N­½ßç½?e5èÆÏ’™õÊBH¥­õQÑG”Ï ›²^>Ç%I’6û½?ýNôÍ €ÍPtŸ/3ë•…JÛø7€€ÉkñÇás\’$i£ßû3þè·öšè+Slü±žÑó¦Y³,„TÚZû¼?úÌ€Rê]ºwø—$Iú¯²y/~ü½?ã~»ö¸T¬½?úºÀknŸAÍše!¤ò6{ë”z­ès J§Xs[ü—$IõÌ{xB¾úÆø¹4³^Y©Ô î¸(úÜ€Rjíñöð9.I’*ž÷þ°ù}+âgÕÌze!¤R×»h×ès J©ûýo„ÏqI’Tñ÷þ´޾ò0Âò;>»š5ËBH¥®sôŸGŸ[PJƒ›Ï Ÿã’$©¼e ^–Ú‡|4uÏ{|ùã½?LÒàÖsÃçY³fY©ôß>6A¿š;¼ |–K’¤4g»ÔZúÇßû³âˆ”?x“÷þ°Ùן?ãfÖ+ !Uæ?b`rÚGþiø—$I£W¶Û›ŸñÞŸvôµ€ ê_uhøÌkÖ, !•¾þU‡EŸ]PJýåû…ÏqI’4jïýy(úŠ@Mô.Y>›5ËBH¥¯sò?DŸ]PJÅc÷¦æØŒðY.I’†S6ïE©½ßôÛU‡¦âá[£¯#ÔXïüá³±Y³,„TúZKÞ}v@iµöù•ðY.I’¦¡Y[¥Öw~aâÑoýåKS¾êº”Š<úêOêžù¯ñórf½²RùÛ"­‡£Ï/(¥ñÇÄÏrI’´ÙyïeÓ=åÃçg³fY© n:=úü€RÊï^>Ç%IÒf¾÷'{0úJ“Ö9î¯Ãgj³fY©uÏž}~@9EÊv~}ø,—$IûÞŸÇ?È€²ÿrCôœmÖ, !U¢ö¿}~@iu¾û÷á³\’$yïõÒ>à7ãgïÌze!¤j´Ã RÊûÑg”Òàú“âg¹$I5¯wÉ’”Ýèk Mk¯_ Ÿ¿Íše!¤Ê4þ`t›©9g»ðY.IRÜ~aô†*ÛíMáó·Y³,„T™zï}†@iµýXø,—$©Îå÷_}€¡Ên>›5ËBH•©ş£Ï0(­Þ%{†ÏrI’ê\ñè]Ñתæì­Ãço³fY©2e;½.ú €Ò*¹#|–K’TçŠîÚèë O¯>{›5ÌBH•ªXs{ôQ¥ÕZòîðY.IR-›µUJE}€¡)ÖÞ?gÖ/ !UªþÕGFŸePZÝü{ø,—$©Že _} €¡ÊWÿ$|þ6k˜…*U÷”Š>Ë ´w\>Ë%Iªc­Ýß} €¡Êï^>›5ÌBH•ªµç{¢Ï2(¯|0ñ åèy.IRÝjíý¾è[ Õà§ç„Ïßf ³RµÛ"íG¢Ï3(­Î‰ŸŸç’$Õ¬öÁ¿}€¡¬\>›5ÌBH•kpó™Ñç”–K¹$Iïş£¯0Tý+ Ÿ¿Íf!¤ÊÕ=gVôyåÕËRsîóÃç¹$Iuª{êW£o0T½‹v Ÿ¿Íf!¤ÊÕ>èw¢Ï3(µö>Ï%IªS½sçFªîþ-|þ6k˜…ª×/H)ïGŸiPZý+ŒŸç’$Õ¨Þ¥{GªÎwÿ>|þ6k˜…*Y~ï•Ñg”V‘=˜š³¶ Ÿç’$Õ¥þuÇGªö‘ŸŸ¿Íf!¤JÖ»dIô™¥ÖÞÿ7Âç¹$IuipÛùÑ£†ª½ÿ‡Âço³†Y©’uŽý«è3 JÍ >%I^ùª•Ñ£†ªµÇÛÃço³†Y©’e;¿>úL€R˺%|žK’T—ŠæÑ£†*[¸}øümÖ0 !U¶â‘;£Ï5(µÖ’w…ÏsI’*ߨ)åƒè±Ó&æ_ø žY¿,„TÙú×}´@©uÏž>Ï%IªzÙŽ¯Œù0T㿌ž¿Íšf!¤ÊÖ=õ«Ñg”Z~÷òðy.IRÕk-ywôÈ€¡Ê¸>|þ6kš…*[k¯÷FŸmPnE‘²]~&|¦K’TåÚ‡|4zâÀP n» |þ6kš…ªÛ¬-SÑy,ú|€Rëžú•ø™.IR…ë,ûbô¸€¡ê¯<1|þ6kš…*Ýà–³¢Ï7(µÁ-?Ÿç’$U¹îÙcÑㆪ¿|iøümÖ4 !UºÞ¹s£Ï7(·A/e ^>Ó%IªjýËö‰žö0T½ó„ÏßfM³R¥kòûÑç”^çø¿ Ÿé’$UµÁ 'Gzªîéÿ>›5ÍBH•.›÷â”òAô¥6X¹,|¦K’TÕò{®ˆõ0T>>›5ÍBH•/¿oEôåÖo§lÞ‹Âgº$IU¬X{ô¤€¡júáó·YÓ,„Tùz—î}Æ@éuŽùtøL—$©rÍÚ*¥"ó0T­}Þ?ƒgÖ3 !U¾Îq}Æ@éõ¯=6|¦K’Tµ²]~&zÄÀÐe»½)|7kš…*_¶Ë£Ï8(½¢»65ç>/|®K’T¥Úû(zÄÀÐy$y#, !Õ¢bÍíÑç”^û¨? Ÿé’$U©ñ—j@í¾l83¸YÓ,„T‹ú+>ë ôú+ŽŸé’$U©îÙcÑã†*_}cøümÖ8 !Õ¢ÎI_Š>ë ôŠÎc©9g»ð¹.IRUê_qPôx€¡üôœðùÛ¬qBªE­ÅïŒ>ë Ú‡<|®K’T•·ž=Ú`¨ÆŸä=›5ÎBHõhlF*š«¢Ï;(½þ•ÇÏuI’*R±æ¶èÑCÕ»pQøümÖ8 !Õ¦þÊ£Ï;(½¢½&5go>×%I*}³¶J)ïGvªîi_ŸÁ3ë›…jS÷û߈>ï Ú‡~,|®K’Tö²].z¤ÀÐuŽþ‹ðܬqBªM­½ß}Þ@%ô/ß?|®K’TöÚþߜዠIDATvôH€¡kí÷?Ãgp³ÆY©>ÍÚ2G£Ï<(½"[=ñ˜›ðÙ.IR‰ë,ûbôH€¡ÿ…lô nÖ8 !ÕªÁM§GŸyP íƒ~'|®K’TæÆ_ª µR©9gÛðܬqBªUݳþ3úØ€Jè/_>×%I*sƒëOŠç0TEóðù[÷ !Õ©öþ¿}î@%­‡Ssö6á³]’¤²–?pCô8€¡Êï½*|þÖ½ÂBHµjζ)õÛÑgTBû°?ŒŸí’$•±Y[¥4èErªÁON‹ŸÁ5¯°RÝÜ~aôÙ•пêÐð¹.IRkíñöè1C×_¾_ø ®{……êVïüùÑgTBÑy,5ç>/|¶K’T¶ÚGüIô€¡ë;'|×½ÂBHu«}ÈG£Ï>¨ŒÎQŸ Ÿí’$•­î™ßŠá0t“¾>ƒë^a!¤º•íð”ò~ôù•пöØðÙ.IRÙê_q`ô€¡kþñð\÷ !Õ±üžË£Ï?¨†~;eó^>Û%I*Sƒ;.Šžà0t­½Þ>ƒë^a!¤:ÖûÑîÑçTF縿Ÿí’$•©¢õPôø€¡Ë½&|×½ÂBHu¬}äŸFŸPƒN Ÿí’$•¥lç7Dn¾A75ǶŸÃu¯°R˼<¥"> ½‰Ù=ß%I*CíÃÿ(zrÀÐåÝ>ƒÕ°R}Ëï[}@et¾û¿Âg»$Ie¨{ÖDmºÁ-?ŸÁjX©¾õ.Þ#ú€Êp¹—$iãê_stôØ€¡ë/ß/|«a!¤úÖ>êÏ¢ÏA¨Ž|²E¯Ÿï’$zù×GOmºñ_ÈFÏ`5,„Tß²…Û{L¡î©_ Ÿï’$ts¶K)ïGlºÎqŸ‰ŸÃJBªuù}WGŸ…Pù]—†ÏvI’F¹ÖÞï‹×¢µô×Ãç°Bªw½'ú,€Ji-~Gø|—$iTë,ûBô¨€٢ׄÏa5,„Tï:G}2ú,€Jé7/|¾K’4ªõ~´{ô¨€áëµRslFøVÃBHõÎ{„`jknwÑ—$é9ÜþÃèQ C—?p}ø Vc" !Õ¾üþk£ÏD¨”öþ¿>ß%I¹fm™R·=¦`è?9-~+g!¤Ú×»dIô™•Ò_¾_ø|—$iÔjíõKÑ#Bô.Ý+|«1‘…j_ç迈> RŠö#©9÷yá3^’¤QªsÒ—¢G4„èžñÍð9¬ÆDBª}ÙŽ¯L©(¢ÏE¨”Î1Ÿ Ÿñ’$RýË÷Ïbü ùÑsX‰,„¤ñ÷­º.ú\€JÜpJø|—$i”Êï¿&z<@ˆÖÞï ŸÃjLd!$¿GèÒ½¢ÏE¨–¼Ÿ²E¯Ÿñ’$D;¼`b6@e ·ŸÅJãYIãÏr>æÓÑç"TN÷Ô¯†ÏxI’F¡öŽË¢è<>‡Õx2 !iâ=B¯ò!˜bù]—†ÏxI’F¡ñ—i@å÷]>‡Õx2 !é‰òU+£ÏG¨œÖâw„ÏxI’¢ë_wBôH€ƒNŸÃj<™…ôD½KöŒ> rz. Ÿñ’$…66#ÍUÑ#Bô.Þ#~+ýWBÒuŽþóèó*§X{_jÎÞ:|ÎK’Ukñ;£Ç1„éžú•ðY¬Æ“YIO”-xyJE}F@å´øãð9/IRT“¿=Š Lûàß ŸÅj<™…ô”ò{¯Œ># r×7|ÆK’UÅÑ£Âd;¿!|«ñdBÒSê]´kô Õ“÷S¶è5ás^’¤ˆŠGÄ£Ûœx—^ô,Vã¿ï%BÒ×>ü¢I¨¤îÿ/|ÎK’4ì²ÝÞ=‚ ÌøÓ˜¢g±OËBHzJÙ¼¥4èEŸ•P9ùê}3L’T»:'~>z@˜þ5G‡Ïb5ž–…ôŒò;/Ž>+ ’ZûýÏð9/IÒ0ë_~@ôø€0Ýsf‡Ïb5ž–…ôŒzçÏ>+ ’Æ?‹žó’$ ³ü¡›£Ç/„é÷™ðY¬ÆÓ²’žQû ß‰>+ ’ŠîډdzFÏzI’†Q¶ëÏE^ÕÚë½áóX§e!$=³9Û¥ÔoGŸ—PIe_ˆŸõ’$ ¡î)ÿ=v NQ¤l‡†Ïc5ž–…´Ž·ž}d@% nÿaøœ—$i ®?)zì@˜âÑ»Âg±ÏÊBHZGݳǢÏL¨¬Öâw†ÏzI’¦µÙ[§¢óhôÈ€0ƒŸž?•ž™…´ŽÚû(úÌ€Êê]¼Gø¬—$i:kðáèq ¡z—ì>ÕxVBÒºšµU*:EŸ›PIE{MjÎ}~ü¼—$išê]°0zÜ@¨î÷¾>ÕxVBÒs4¸éôès*«³ì á³^’¤é*¿÷ÊèQ ¡Ú‡ü~ø“ÕXgBÒzjíþÖèó*-àúÔ›>ó%IšŠúW=Z \ûÈO„Ïd5Ö™…´Š‡o>C ÒÚüfø¼—$iJÞCÛ| z¬@¸l·7ÇÏe¥ue!$m þòý¢ÏP¨´þÕG…Ï{I’6·ö¿=R Üø»ôšc[„Ïe5Ö™…´:Ç|*ú€jtS¶ÓkÃg¾$I›Sïâ=¢'*„ËïüqøLVã9³’6P¶pû”Š<ú,€Jë;7|æK’´9yÜ8¤Ô¿lßð™¬Æzî+BÒËï¹<ú,€JçBsÎvá3_’¤M©µ÷û¢G)Œ„î©_ ŸËjS òú+O Ÿù’$M¦þåûGO ƒ¿>—ÕXoBÒFÖ=ý_¢ÏT¨¾|²ÝÞ>÷%IÚ¨æl›Šöšèé #aü=ìá³Yi}YIYkÏ÷DŸ©P ½‹v Ÿû’$mL£ÿ›ÕXoBÒ$ê¯8"ú\€Zèžú•ð¹/IÒúʼ,¥~'zdÀhtSsöÖáóYõf!$M¢Î‰}´@-Œ_R›³¶ Ÿý’$=W“¾=.`dä÷­ŸÍjl0 !ie;¿>úl€Úèó©ðÙ/IÒs•ßùãèQ #£Õaá³Y f!$M²üë£ÏW¨…üîåás_’¤uÕÚó£Ç$Œ”îß ŸÏjl0 !i’õ.Þ#ú|€Úhô‘ðÙ/IÒ3ë]²gôˆ€‘Ò>ôcáóY f!$M²ö¡}¾@m n>3|öK’ô´æ>/­‡£G$Œ”lÇWÆÏh¥ e!$M¶¹ÏK©×Š>c 6Z{ÿrüü—$é‰:˾=`¤kn ŸÏjlTBÒ&4¸ùŒèsj£õQá³_’¤ÿ*¿ëÒèÑ#¥íqáóYÊBHÚ„ºßÿ¿Ñç,ÔG>H­Ýß>ÿ%Ijíù‹ÑSFN÷Ì ŸÑjlTBÒ&ÔZüÎèsj¥wÉ’ðù/IRïÒ½£G"ŒœöA ŸÑjlTBÒ&V¬¹=ú¬€úèe^R*I -Ûá…©è<=`´EÊæ¿4|N«±QYI›XùÒèãj¥wþüðù/IªoÝï}-zÀÈÉWÿ$|F«±ÑYI›Xç¨OFŸ·P+Ewmʾ"ü Iªa³¶LùC·DB9ýGÄÏi¥ÍBHÚIJy/NiЋ>s Vzçí~$Õ¯Î1ŸŠ0’ºßÿFøœVc£³’6£ÁmDŸ¹P+ãïnȼ,ü IªWù?Ž0’Úû(|N«±ÑYI›Q÷¬ÿˆ>s vzçÎ ¿H’êÓø]À:äƒÔÜáá³ZÎBHÚŒZ{ÿrô± µS´IÙü—†ß$Iõhpýw£GŒ¤üþkÃç´“ÊBHÚœÆf¤â±{£Ï^¨îÙcñ÷IRåk}ûm)yôØ€‘Ô¿â ðY­Æ¤²’6³þU‡EŸ½P;E{_ I’¦½Þ¥{G<YÝSþ)|V«1©,„¤Í¬sÜ_GŸ½PKݳg†ß$IÕ-Ûñ•)õ²èq#«µï¯…Ïk5&•…´™e _á h=”²ù/ ¿ H’ªYï‡;G:]ƒ^jÎÙ.|^«1©,„¤)(¿û²è#j©wÞ¼ð{€$©š_ü+ºk£ÇŒ¬üž+Â絓ÎBHš‚zçí}@=u›)[ôšð»€$©Zõ.Ú-zÂÀHë_¶oø¼VcÒYISPké¢Ï`¨­Þ%{†ß$IÕiü‹Þë×YöÅð™­Æ¤³’¦¢±-RÑ\}@= z©µû[âï’¤JÔûÑ·£'Œ¼Ö?>³Õ˜tBÒÕ¿ê°èsj«¿âðð»€$©üùulX‘­Nͱás[Ig!$MQcÿ2ú,€ú*òÔÚë—Âï’¤r×»xqôD€‘7¸þ»á3[MÊBHš¢²ù/™xd cpã÷Âï’¤ò–íôÚ”z­èq#¯{Æÿ ŸÛjlRBÒ6¸íüèój­}ào…ß$Iå¬ùþÑc J¡µôás[MÊBHšÂºg|3ú<€ZËïü±gYK’&]kÏ_L)D1}ývjÎÙ6|v«±IYISXkñ;£d¨½Îñ~'$•«ÁÍgF/(…Áí†Ïm569 !iŠËº%ú\€Z+½;5wxAø@’TŽÚ‡— öºçÌ¿H’JЬ­R¾êºè±¥1þEŠðù­´©YIS\ûFŸË@¯•²]Þ~/$vÝS¿=± <Š"e _>¿ÕØä,„¤©nζ©è®>ž öúW/$lÙü—¦"[=® 4òU+Ãç·›•…4 ®?)ú|Š"µ÷û`ø½@’4šõ~¸Kô¤€Ré/ß/|~kó²’¦¡ÎI_Š>Ÿ€ño°ÝyqjŽÍ¿H’F«Ö?ŸR¿=¦ T:'þ]ø Wc³²’¦¡lç×O|+ˆ×9á³áwIÒ56# ~zNôx€Òi}ûmñs\is²’¦©üÞ+£Ïh`üÉqÍU)[ð²ð»$i4êœøùèÑ¥S¬½?|†«±ÙYIÓTï¼yÑç4ð„þeû„ß $Iñe ^>ñE`rú+O ŸãjlvBÒ4ÕZúëÑç4ð_Š<µ–~ ü~ IŠ­ÅÑ J©{ú?‡Ïq56; !iºÛ"Í¢Ïjà ù=W¤æ¬-ãï’¤Úü¦w½À&jíû«á³\ÍÎBHšÆúW}VOÑ=íëá÷IR@³·Iùª•ÑcJ©h?âËu3«‘…4µüDôy üŽ InݳǢG”Öà†“Ãg¹S’…4Í}~J½Vô™ âO¢G TBñÈás])ÍBHRù×GŸáÀºEjú±ð»‚$ijÞá:þòk`óõ¯8(|¶«1¥YICªwÁŽÑg8ðŠÇîMÙŽ¯ ¿/H’6£±-Òà'ß)Pãÿ6~¾+MeBÒj-ýõè3Xñ›c3Âï ’¤M«{άèQ•’íüúðù®Æ”f!$ «±-&¾} Œ®ÎÉ_Ž¿3H’&]û ßI)D¨Œñ×_DÏw5¦< !iˆõ—ï}–ëÓËRkñ;Âï ’¤/ÛågRÑ| z‚@¥ô.Y>ãÕ˜ò,„¤!Ö>ü¢Ïr`ò{®HÍÙÛ„ß$IÑì­ÓàŽ‹¢GTNç¨OÆÏy¥©ÎBHfs¶KEwmôyl@ïÂEñ÷IÒÿö20ÅŠçÕ˜ò,„¤!×_ybô‘lH‘§ö¡~o$=wcÿ*zZ@%å÷\>çÕ˜–,„¤!×9ásÑg:°ŠlõÄ{)¢ï’¤g×úÎ/xúLOLhT6 !iÈe ·O)ïGŸëÀFÈïü±÷ IÒˆ•íøÊ'?̦^û€ß Ÿ÷jLKBR@ƒ[Ί>×€Ô»xqøÝA’ôDs¶Kƒ;~= ²ŠÎ£©9{ëø™¯4YIuNþ‡è³˜„Îñ~¤Ú76#õW= Òú×?ó•¦+ !) lÑ«SÊÑç;0‰oɵöøùð;„$Õ¹Þù ¢ÇT^gÙÂg¾Ó–…Ôà¶ ¢Ïw`òÕ7¦lþKÃï’TÇÆ?œ¦YQ¤l§×…Ï}5¦- !)¨îi_>â€IÜ|FjÎÚ2ü!IujüÅÖiÐPyù=W„Ï}5¦5 !)¨lç×OlÝ€ré]¸(ü!Iu©µø©h=}ô@-ôΛ>ûÕ˜Ö,„¤Àò;/Ž>ç€MÐ9þoÂï’Tõ²ßŠ5·EùPíý>>ÿÕ˜Ö,„¤Àº§ÿKô9lŠ~;µöýµð»„$UµlÇW¦|ÕÊèÓjcü¹ÍY[…ßÔ˜Ö,„¤À²ÝÞ}Ö›¨x잉o¯Gß'$©je ^–òûVDóP+ýkŽ¿¨1íYIÁå÷\}Þ›(_u]Êæ¿4ü>!I•iîóÓàöFïP;>Pšî,„¤àº?ø÷èóØ ƒ[ÏKÍ9Û†ß)$©ôÍ}^Üznô±õSä)[ôêø»€Òtg!$×úöÛ¢|`*¯06#ü^!I¥möÖipã©ÑÇ9ÔR~÷eñw¥ad!$@ùý×DŸûÀfê??üN!I¥lÖ–‹u FïÜ9ñ÷¥ad!$@ÝsfGŸûÀèœüåð{…$•ªY[¥þŠ#¢o¨µÖ¾¿'PFBÒÔZò®ès˜ Ež:ÇþUøÝB’JÑìmRÿºã£On¨µ"[šc[Äß ”†‘…4"å«oŒ>ÿ€©0è¦öa~·¤‘nîóÓàæ3£Ol¨½þŠÃãïJÃÊBH‘zç/ˆ>ÿ€©Òk¥ö¿_HÒ(–íðÂ4øé9Ñ'50þØë£ÿ<ün ÆÐ²’F¤ÖÞ¿}þS¨è<šZûüJøC’F©lá+R~ÏåÑG40®×šø¢Fôý@¡e!$PùC7G`ŠŸÇÝúÎÿ¿cHÒ(”íôº”¯º.úhž0¸á”ðûCÍBH¡zçÍ‹žÀ+š¤Ö’w‡ß3$)²lןõ81ÿ.üŽ ÆP³’F¨Ö’wEÏ`kï÷K!Iµ­µ×{SñèÝÑG1ðTyâQ®Ñ÷5†š…4bå÷_=€iP4WM|ù#ú®!Iì}èÇ&Þ©Œ–ÁOÏ ¿'¨1ô,„¤«{öÌèyLK!Iuª{Ú×SÊÑG/°ÝS¿~WPcèYI#VëÛo‹žÀt/…ö|OøC’¦­Y[¥þeûD·Às)Š”íòÆø;ƒÒ°³’F°üžË£Ç0ŠöšÔZúð;‡$MuÙ¼¥Áß‹>f€õÈï¾,üΠFHBÒÖ=ã›Ñs˜nÝfjü»á÷Išª²ßò{¯Š>]€ èþàßÃï j„d!$`ã?Ùÿé&Pq½VjþGáwIÚÜÆõX¬½?úT6Bkñ;Ãïj„d!$hƒ;~=€atSç˜O‡ß=$iSë~ïkg0úòÕ7†ßÔËBHѺ§}=z>ÃR©{æ·Âï’4Ù÷õ¯9:ú&¡wÁÂð;„â²’F´lÑkRÊÑ3¢ÞÅ{¤æØá÷IÚPãšÉW]}l“ÔÚçýá÷5²’F¸ÁOωžÀõWž˜šs¶ ¿‡HÒsÕ9á³)u›ÑÇ%0IÅ£w§æØŒð»„aYI#\ç¤/EÏ Àø»³…Û‡ßE$éiÍÙnâ—Œ@9õ.YŸPŠÌBHáÆ?Jƒ^ô¬ä÷_›²]~&ü>"IãµvkÊï[}4›¡}Ðï„ß)ÔÍBHñ?ù~ô¬‚Þ•ZKÞ~‘Tï:ßý_©è<}$›¡h®JÍY[…ß+ÔÍBHñ:'~>z^ŠîÚÔ>ä£áwIõ+ÛñUipýIÑÇ 0<.NM !iôËæ¿$¥~;zf‘úÔ9î3á÷Iõ©sô_¤"[}úS¤½ÿ‡Âïj„g!$• þu'DÏ ZQ¤îÙc©96#ün"©ºe ^–úW}âS¨xäÿŽPÏBH*Aí#ÿ4zn#bpã©)›÷âðû‰¤êÕ>ø÷&Þ]TKïÂÂïjŒDBRš½µÇ5OÊï»:e»½)þŽ"©Í}^ê]¸(¥">Þ€iÐÚë½ñ÷ ¥QÈBH*I½K÷ŠžÀ)š¤öA ¿£H*wíÃ?žŠ‡o>Ò€i’¯¾1ü¾¡ÆÈd!$•¤ÖÒDÏ`ÔäƒÔ=gvjŽm~W‘T®²_ŸúW}ŠÓlâß #p÷Pc$²’JT¾ú'Ñ3AƒŸž²_~W‘T‚foº§}=ݵÑG0­Å(JBR‰êž3+z†#ªXs{j-ýõðûŠ¤Ñ­}ào¥|ÕÊèã ’üÞ+ÃïjŒTBR‰Êvý¹”Š"z–£*ï?þHˆY[†ß[$NÙ¢W?þx8ÿ–€ZéžñÍð{ˆ#•…T²w\=K€7¸í‚”íòÆð{‹¤àfm•º§~%í5ÑÇ0lE‘²]6þ>¢4JYI%«sò?D ŠÖésì_†ß]$ÅÔ>êÏR¾úÆè£2þ¥òèûˆ#—…T²²/K©ß‰ž)@Iô¯=.e;¾2ü#i8µöýµ‰_ õ6þ+áè{‰#—…TÂ+—EÏ DŠæªÔ9ú/Âï0’¦¯ÖoŸX{OòÁÄ;£ï'jŒ\BRIÿ0YýkŽök!©be;½6õ/Û7¥¼}Ä#bpËYáw5F2 !©ŒÍÙ6­‡¢g PBEö`ê,ûBjŽÍˆ¿ÓHÚä²y/J½óvH©ÛŒ>V€ÓYöÅð»Š#™…TÒ&¾°‰·_˜Zßù…ð;¤É/‚º§}=kï‹>F€QÔk¥lþKÃï,jŒdBRIkï÷Áèñ”]¿3ñ ƒæÜç‡ßm$­¿ñÇ=öÎ_Šö#Ñ'0ÂúW~oQcd³’ÊÚØŒ”?tKôŒ* xôîÔ9á³#'`ÙŽ¯JÝsf§¢óhôQ”@ûÀß¿¿¨1²YI%®wîÜèTÈàÖóRkÏ_ ¿ãHj¤l·7¥þeûLü’`cknKͱ-Âï1jŒlBR‰Ëv{sJE=k€*Éï*Ìvzmø]Gªc­ÅïHý+I)ïGŸ@ÉôÎ~—Qc¤³’JÞàÖs£g PE½,õ.\”²ù/ ¿ïHuyGhÿÚã&–²“V©µû[Âï4jŒtBRÉëÿ·Ñ㨰¢¹*uOýJjÎÞ:üÞ#U­lÞ‹S÷{_KùêŸDÿ©%7þ¥ñè»#Ÿ…Töæ"•0 IDAT>/í5Ñ3¨¸â‘;Rç¤/¥æ¬­âï?RÉk}ûm¿À+ZGÿiÑ9á³áw5F> !©M¼l`H/ªµ’6¡±-RûàßMƒNñP`Jݵ)Ûá…ñ÷¥QÏBHª@­}Þ=w€šÉWߘ:'~Þ£ä¤ ”-zuêžñÍT<|kôŸ-PQýË¿ó¨QŠ,„¤Š”ß·"zö5T¬½/uÏ™=ñ.”èû42ÍÙ6µÿxê_{\Jƒ^ôŸ)Pqíý>ÿQ*CBREê~ÿѳ¨±"[ýøbhá+ÂïERT­¥˜xœ³wÃ’?xSjŽÍ¿©QŠ,„¤Š”-Ü>¥~'zu×ï¤þU‡¦Öž¿~?’†Q¶óëS÷´¯§ü¾«£ÿú€êžõá÷!5J“…T¡ú×=ƒž4øéÙ©}ÄŸ¤æØá÷$i*isç„ÏMü7žŠ<úO ¨«|²ß~7R£4YIª}ØF!€g)¾5uðï)[ôšðû’´©e ^–:'|6 ®ÿnJ½VôŸ@Ü|FøIRe!$U©±-RñÈѳ`ÝòAÜrVêó©ÔœµeüÝIÚˆÇ2O,n8%¥A7ú/ài:Çþeø}IRe!$U¬Þù ¢gÀknK½sç¤Öîo ¿?IO-Ûå©{ÚÿIƒÛ.˜XbŒ¢"{05çl~wR£TYIküC•TÑ3 `ãEÜñ£Ô9ù&É}—R=k-~Gêžù¯)¿û2wi zí~‡R£tYIlpÛùÑ3 `òú4X¹,uŽûLÊæ½(üN¥Š¿èè¿Hýåû¥bÍíÑÿåLNQ¤Ö·ß~§R£tYI¬sâç£ÇÀæé·'ÞÛ2þþ–lÞ‹ÃïW*y³¶L­½ß7ñ+ ñ÷X¥A/ú¿p€M6~Ÿ ¿_)•1 !©ŠÍ}~*:FÏ&€©[Ýxjêœô¥”íôºø»–JQ¶Û›Rçä/§þÊSÑ^ý_1À”éýçáw-5J™…TÑúË—FÏ&€©W)¿{yêž3+µözojŽÍ¿wi4Êv{óÄ/Êú—í›òoŠþ/`ZÝ“š³¶ ¿{©QÊ,„¤ŠÖÚë—¢çÀ´+š¤þµÇ=þë¡]Þ~Ó÷_˜øß½Õ¡ÞÔFïÜ9ñw1¥²f!$U¸ü®K£gÀPå«®K½‹÷H£>™²_~ÓÔ”Í{Qjòû€ ~zv*ºk£ÿS¾¼Ÿ²ß~7S£´YI®³ì‹Ñc TþÀõÒíÿ·)ÛõgÃïgÚˆfo=ñk÷ñ»lï’=S~ï•)åƒèÿ” ®ÿnü]M©ÌYIUnîó½@à)е÷§Á§N¼ƒ¨}èÇR¶pûø;[›ûüÔÚçý©sò—'wãï‡JýNô&#©}ÈGãïoJeÎBHªx½‹GÏ*€‘6þ¢þÊS÷œÙ©}ÔŸ¥l·7§æØŒð{\¥š½MjíùžÔ9î3©wÁÂ4¸þ¤”?tKJEý??@)Œßšc[Äßë”Êœ…TñZ‹ß=¯J§è<–wü(õ/? uÏøfjù§©µÇÛ'g}¿Ùfm™²ÝÞ”Úÿ^êžòO©÷£ÝÓàÆï¥|õO&žwÀ¦¿“†ß÷”Êž…Tƒ·=³ªaЛXp ~rZê]ºWêžù­Ô9æÓ©µï¯¦lÑ«Ãï}ÓÚìm&~=Õ>àésÂgS÷왩¿|¿4¸éô”?pCJƒnôÿ:ÕÔï¤lá+âïƒJeÏBHªAãæ`z­T<|ëį‹+—¥Þ%KR÷ì±ÔYöʼn_µ÷ÿÔúÎÿHÙN¯MÍ9ÛÅÞçl›²E¯™øEykéRû°?L>7ñíÓñ_÷ôWž·œ•òû¯x÷’ǻĿ—E¾¨F%²’êÐìmRÑ\=»x¦^–ŠGïJùC7§üžËÓàöN,aúןú+ŽHýåKï²}SïÂEî’=ÿûÿÍ5ÇL¼iüÿÞàö 'þïç«oLÅc÷Lüÿ @9´÷û`üç‹JUÈBHªIãå‘ßwuøçŠjT& !©&?ïÝc> <º§ücøçŠjT& !©F n>#z†¡h=œš;¼ ü3E5*“…T£ÚG~"zŽ¡wÁŽáŸ'ªQ©,„¤:5kËTHÙno ÿ¼PJg!$Õ¼þÊ£ÇÔZÿÚcÃ?'T£òYI5¯}À‡£çÔZk鯇N¨Få³’”ò{.žyPKùÝ—…>¨F-²’”:˾=÷ –:Ç|:üóA5j‘…¤Ôœ³m*ÖÞ=û Vò‡nIÍY[Å>¨T‡,„$MÔ;~ôü€Zé|÷ïÃ?T£6YIš(Ûéu) zÑ3j¡xô®Ôœ½Møç‚jÔ& !IOÖ¿æèè9µÐýþ7Â?T£VYIz²ÖÒDÏA¨¼"{0e;¼0üó@5j•…¤§•ßuiô<€Jëž=þ9 µËBHÒÓêÿ·Ñó*«è<–²/ ÿPÚe!$ééÍÞ&Ý= ’zîÿ R³’ô¬º?ø·è¹ÕÓï¤l§×…þ§F-³’ô¬²y/NEû‘èñ•Ò»t¯ðÏþÔ¨mB’ÖYï¢Ý¢ç#TG>H­Ýßþ¹ŸµÍBHÒ:Ëv~CJƒnô˜€Jè_uhøg~ªwB’ž³þU‡EÏI(¿¢H­%ï ÿ¼OõÎBHÒsÖZòî‰alºÁÊeáŸõI……¤õ5¸éôèy ¥ÖZúðÏù¤ÂBHÒújô‘èy ¥5¸ùŒðÏø¤¦…¤)¿ë’è¹ ¥ÔÚ÷×Â?ß“šB’6¦Î±=7 t7œþÙžÔ|" !InÖ–)è–èù åQ©µÏûã?Û“f>ž…¤ª{êW£G(”Få‰áŸéIͧd!$iãšûüTd«£ç(Œ¾"O­=ßÿ™ž4ó¿³’´ÑõÎ=J`äõ¯9:ü³<©ùŒ,„$mtÙÂíSê6£ç)Œ®|Z‹ßþYžÔ|FB’&UïÒ½£G*Œ¬þU‡††'5ב…¤IÕÚý-ßrž!ï§Öîo ÿ Oj®# !I“®¿âˆèÑ #§ùþáŸÝIÍçÈBHÒ¤j*òèù £cÐKÙno ÿìNj>GB’6©þuÇGXãïÞŽþÌNj®' !I›TkÏ÷¤TÑsâõÛ)Ûù áŸÙIÍõd!$i“Üprô¨€p½‹÷ÿ¬Njn !I›\kŸ_‰žµ«ÛL٢ׄV'57…¤ÍjpÓéÑ#þ?{wli]ßy¼›:"Q‰0ãî¸ÄI,MJ&îKÆ,'™1Æ8Ž5‰3FSNeœ1N™²úöính–šEP6‘° "Í"‹ŠfGššæ>ÏÙÏó›:WèÒ°õ½÷9çwÎ÷¾^Uoþ>wyžóÔïCß“ré\¼:ûTì@!I ª±á÷r¿ç@Uq*÷}Vö3:©Ø B’\ïÖ‹r¿÷Àȵ¿öñìgsR±ƒ„$-¸æñïÌýÞ #ÕßrS*¦wÉ~6';˜AHR-õn¿,÷{0ŒLëÔ÷f?““Š9d’TKÍÿ0÷{0ŒDÿ®ï¦bjiö39©˜C!IµÕ¿ëªÜïÅ0tÍcÞœý,N*æ˜AHRm5OþO¹ß‹`¨º7œ™ýN*æ‘AHR­õïù~î÷dŽ~75ÿÍìgpR1 B’j­uÚŸç~[€¡è\udöó7©˜g!Iõ6µSêßw]î÷f¨UÕžIåºçå?“VÌ/ƒ¤ÚkžòŸs¿?@­Ú­Ì~î& È $i(õïúnî÷h¨EUlN徿šýÌM*AHÒPjžø¹ß§ ­s>šý¼M*˜AHÒÐêÝviî÷jXþý7¦båÎÙÏÚ¤b„$ ­æ1oÎý~ ÒüÒe?g“Š2Ij½ŸžŸû=æ¥wãÙÙÏפ¢¦ B’†Zã ¿›RUå~éµSãÐWd?_“Šš2IzÝÎÌýö sÒ¹tmös5©¨1ƒ¤¡×øÜ¿K©ßËý;¤Úvw*×ìžý\M*jÌ $i$u¯9)÷û8ìÖW?˜ý©wÃYÙÏʤb„$åiz—ÔßrSî÷{³N™Êõ/ÍV&­~!IÙjúÞÜoù,bí >ýŒL*F”AHRÖz·_žû}€E¨¿ùúÙ¿b“û|L*F”AHRÖGï“RUå~ÿ`1©ú©yÌ›³ŸIÅ3IÊ^÷º¯ä~`é^½!û™˜TŒ8ƒ¤ì >¸/u[¹ŸXªrK*÷ß3û™˜TŒ8ƒ¤±¨sÅúÜÏ,­3þ[ö³0©ÈAHÒXTî·GªÊr?XoÓ%©˜Zšý,L*2d’46µÏÿdîg¢ê6SãÐWd?“ŠL„$OÓ»¦þƒ·ä~4  öÆ©üç_ÒŠ|UÛîš½ B’Æ¢Öé™ûÙ€`ú÷ÿ8«–g?û’ŠŒUÅæÙëaI1½Kö#Iƒ¿áÚ»ãÊÜÏDQU©ùÅwå?÷’Vä­j><{I,™Y½[ö#IƒÞ8ûF ÕýÁ ÙÏ»¤b |ŽÖÀ’bís²¿Iz¬Þ gå~V`ÂUå©<`¯ìg]R1¥ª?{],)Ø;û‹‘¤ÇjúŠ”º­ÜÏ L°Ö™ýœK*Æ¡é]·_KŠƒ^˜ÿIÒ/ÔùÖY˜\½[.œý¼êÜg\R1•þúökcIyØ«²¿ IúÅÊ5»§jÛÝY˜–4NþÓì/H’ž¨Þm—f}€`rônÝèOÅI+~¹ÖiïÛ~,ižùáì/H’žôŸ3ö»Y$˜”?÷¢ìçYR1fµÎýÛí×É’Ö7þ_ö$IOVçª#³>L0þZç|4û9–TŒa‹Wo¿N–´¿µ.û ’¤'«Üï×RUnÉú@Àøò§â¤%OZ÷‡_Ú~­,éüð¤ì/H’žªÖ¹ËúPÀ˜j©\ÿ²ìçWR1¦õn¿lû岤{ûÙ_$=eS;¥þÝßËúlÀø|>Jö³+iÅøVm»kûõ²¤¿ížì/H’ž®Æ†7¦TUY0½MûSqÒŠ§hz×”ªþökfÉà€ufzyþ&Isø{—,^U{&•ë_šý¼J*ƸÆa¯ü¥ëfÉà?塯ÌþÂ$éé*×íªæÃ¹ž3íú_ÙϪ¤bÌköç„_þÙ_˜$íHío|*×sc wÛ¥³Ÿ9ûœJ*ƼÎÅ«?µ.øtö&I;Ôô.©ÿs=oS»HϾ<ÿ•´büëÞpæã¡Î5§da’´£5Oø¹9ȨuÎßd?›’Š ©ÿà-„z÷]Ÿý…IÒ\ê^F®ç2èÝxNö3)©˜Ê5»§Tõ?¥^7ÍL/Ïþ%iG+×=/UÍ­™?¥ªØœÊu{g?“’Š ©yü;wý|J)•Ÿ]ö(Is©ýµúÙ€Q«ªÔüÒg?‹’Š ª½qÅ“BÍs>–ýJÒœšÚ)õî¸rÔ ŒPç»Gä?‡’VLV½›¿ñäƒPç‡_Îþ%i®5Žø­”zQ?‡0ýûoLÅêݲŸAIÅ$5µSªš?ù Ôè¶ü/R’æQç[ŒúY€aëuRã¨7d?{’Š «qäëžð’Ú> >?û •¤9·ú©ÿà-£z`Úßü‡üçNÒÖ>ïO?5Oû‹ì/T’æSóøwÎ~À “¯wûå©X¹,û™“Tùü Ç B«ŽÊþB%i¾u¯9iTÏ$ IÕܚʃ_”ý¬I*&±Õ»¥Ôm>ý Ôßzgþ+Ió¬ÜÏT•[FõlÀ´¾úÁìçLR1¡5Oú“'½¶~i({uö,Ió­uÖÿö3 CÒ½þŒìçKR1Áu¾ûù„ZÿüÉì/X’æÝÔÒÔÛtɰŸM¨Yõð©\ûœüçKÒŠ mjiªÚ´ãƒP÷– ó¿hIZ@Ã^•R·5ìgêÒï¥æqoÏ~®$\ãè}žò2{Ü ”ºíTìûìì/\’Rû¢é!>¡P§öÆ©ìçIR1áu®X?ÇA(¥ÔüÇ¿ÊþÂ%iAMïšú›oÖ3 5émº8+—å?O’VLøŸ‹{øŽ¹BÝ›ÎÏÿâ%i5{[JU5¬g¨zäÞT®Û;û9’TLxÍcßò´×ÛB©×IÅ~ÏÍþHÒBë\uäU¨åsƒ¾ø®ìçGR±HÎAŸxüÙ¸s>šý ¤·z·ÔðæºWX Ág@g?;’Vhõ3RÕxhþƒPwÓ¥ù¿Iª¡æqoO©ê×ýÌÀ<õn½ÈçI+ê©õÿ}‡®»'„ÊÃ^ý ‘¤:ê|ûðºžWX€ªØœÊ=ûy‘T©wÇ „Ú—œý ‘¤ÚþtÜ?­ë¹€ù¨ú©y»óŸI+bÔ8üÕ)UÕ¡þÌýifz×ì_$ÕQóØ·øÓqu.^ýŒH*é_FzÊAh yúû³A’TW+?»Ðçæ¡wÛ¥>7HZQ_å~{¤ª=Sß ÔÝtiö/J’jkõ3RËM }~`|n´¤öÚ~fN×áÓBåQûdÿÂ$©®~/¥~o¾Ï/ÌõsƒNüƒìgBR©UËSõȽõBëNÏÿÅIRu.?x¾0ÌAç’}³ŸIE°ZgdÎ×â Bƒÿ“¾8ä%Ù¿@Iª­U¿’ú÷ß8GvTïæ |n´¢æV.›×ÇbìØ ”Rjûðü_¤$ÕXã ¿“R¯3ç'O¯Úz{*÷ß3û­ÖYž×5¹ÃƒPj©8àßdÿB%©Î:—­›×Í€§Ð)SãÈ×e?û‘Â5½kª¶Þ6äAh𯄮84ÿ+Iu¶jyêßwݼn <±Ö™ÿÜG XûkŸ÷u9§A(uš©8èÙ¿`Iª³Æ‘¯÷§ãjÒ¹Ò?,Ša´êWRµí® B)¥îÕòÑ’TsKÖÌûF ÀÏõn»4Ó»d?ë‘"Ö¾ð3 º>ç< þ/úrý˲á’Tk+wNý;¿½ *Àb6ø— 庽óŸóH+úTµgF< þÉßÎÈþÅKRÝ•ë_šªÖ¶ÝT¥n+5ŽÞ'ûùŽµîµ§,ø2× 4Ð8áÝÙ¿’Tw­3>´à+ÀbÓ:û#ÙÏu¤¨56¼1¥ªÊ7õ~v]š™Z–ý!Iu×½æäß\ Ÿ;/-^+—¥þ=߯åZ÷ 4ÐúÚÇó3$©æÊ5»§þ?­å& YÿÎï¤bÕòìç9RÔÚçÿ}m×ë‚¡~ù`*öß3û7D’ê®qÌ›Rêwk»ÙDSÍÜ7ûA÷¹Ïq¤¨•ë_–R§Ah sÍ)Ù¿)’4ŒÚ­¬çN M¯“šÇ¾5ûù¶©¥©wëÆZ/ÛB“ÿ,ÿ7G’ênj§ÔÛtI·I€PZçþmþ³)p­³?Rûu[Ë Ôø®Tìû¬ìß Iª»ò§ª¹µŽ[%@+Í~f#E®<ä%©j><žƒÐ@窣²“$iµNÿ@]·J€‰ÖûÉ×S±rYöó)l+wN½;®Êõ[Û ”ª*5NzOþo–$ ¡îN¬ív 0‰ú›oHåÚgg?§‘"×¹dÍЮá%µÞfîOźçeÿ†IRí­yfêo¹©Î[&ÀĨÊ-©ñÙ—ç?£‘×<ö-)õ{“1 to:?ÍŒÁ7N’ê®qô>)õ:uß6Æ[·™Ǽ)ûÙŒ¹ò€½RõðC½”k„ZçýŸìß‹‘"×:ý#»¦‡6 t7}+ͬÜ9û7T’ê®ùÅßê¼äÔ¿ûêT¬Þ-ûŒ¹Æ‘¯O©]Ä„ÚWžý›*IèsñªaßBF®zäžTô‚ìg/Räʃ~#UÛîéµ=ôAh y懳s%i(Ÿ'tëÆQÜFF£]¤Æ~'ÿ¹‹¸rísRóõ#¿¼G2¥^'5Nxwöo²$ÕϨú©yêÉ~Þ"…nz×ÔÛtq–K|ÉÈþæds[*xmþo¶$Õ\óøwø+u¯Þ&ÙÄ B³ª*µ¯84ÍL/Ïþפ…ÔýÁ ¹ï¨@@ÕÖÛRyÐ ²Ÿ}H‘j÷¶Tm½=MºÉ„ÕûÙu©<â·³ÿHÒ¼[µ|öïøÔ¥zäÞÔøì¿Íî!Eiõ3Rç²Sê÷R9ÍêuRkãÊ4³biþ_ IšGåþ{¦þƒ·ä¾›TÍ­©qä볟wHQj÷öÔßò“ÉäBêÞzQ*׿<û/‡$ͧÆç_›ªÖ#¹o¥Àœ-4ŽÞ'û9‡åâîþðK³aÍÄB³ÚÔºàÓifåÎÙY$i®5OþÓ”ª~î;)0‰ºÍÔ<þÙÏ7¤‰oå²Ô:磩*·¤¨b B¿øÙBGÿûü¿8’4ÇÚ|:÷-˜4½NjžôžìçÒ¤×üâ»RÿgפèB B³úýÔ¹ê¨Tì¿Wö_"IšK³ÿ`GTýÔúêÍ~ž!MrÃ^™z?>7-ñ¡GU͇SëüO¥™é]³ÿRIÒµjyêÝqEîÛ'0îª*µÎýXþ³ iB+׿4uÿåø”úÝ´˜„„ÓðÖÔ<õ½if ~É$éé*Ø+õ¼%÷­cíó?™ý CšÄÊC^œºW3ûç£ðƒÐcú÷|?5¾ü'Ùá$ééjöªT5Ì}ÛÆPûŸÊ~v!MZÃ_ýèÔN‹Ù¢„Ó»÷ÚÔ<í}þŤ±®yì[Sê¶rß2€1Ò¾ð3ÙÏ,¤IªyÌ›S÷G_M©ßË}ùŽ…E7=¦wçU©yÚ_¤™©eÙ)%é‰jñ¡Ù¿ оàÓÙÏ*¤‰hÍ3S묧þ½?È}ÙŽE;=¦¿ížÔÚ¸2kŸ“ÿU’þU틦sß&€ÌÚWd?£Æ½Æ~7u¾}˜bx ‹~zL¿¹-µ¯<4•‡¿&û/®$mojiêþð˹o‘@&þLœô䕇¼8µÏÿûÔ¿ïG¹/Õ‰`z½;¾“šgýÏT¬Ù=û/´$Ó»¦Þ¦Kr߀ó/ƒ¤ÇWü¢Ô>ÿ“©çw|Ü„žB¿5“:ÿrBj|éÓÌÊ]²ÿ¢KZ¼•ûí‘ú›¯Ï}[F¤½q*ûy„4­\–Ǽ)u.Y“úwÏ´¡T5JïŸ'þQšY¹sþ‹@Ò¢«<ø…©ÚvWîÛ!0dƒÏÎ}!ekjijþêÔ:û#©{ý³góÔà 4ýÆÖÔùÑ?ÿ³r½ ÿ"iÑÔ8â·SÕÜšû6 IçâUÙϤQV®Ù=5}kjóRïÇ_KU¹%÷e–A¨½û®Oí+Ö§ÆÉ–Šý÷Ê~IŠ]óøw¤Ômå¾õ5üI¬ÜçÒ0‡ŸÆç_›Z§ÿeê\º6õn<'UÝêOÀAhz[~:ûÙCͳÿ&•G¾>ÍL/Ï~±IŠUë+ïO©êç¾Ý5é\²oöóiN­\6û¹×åþÏMÃ^™Þ˜š'½'µÎü«Ô>ÿ“©sùA³ò­÷ÕþÕϘ0B¿—z÷ÿdöÏ̵6N¥æ©ïŠŠµ{ä¿h%Mlíþ¿¹ïn@MŸ“"MB©ßÍ}¹0O!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ œA 8ƒ@p!€à BÁ„‚3gÎ ÀÿoÏhõO­=>¨Á€6!'„â„@œˆBqB NÄ !€8!'„â„@œˆBqB NÄ !€8!'„â„@œˆBqB NÄ !€8!'„ÖvÚž›E²yCÉIEND®B`‚‰PNG  IHDR €ÚxË6Í pHYsèèµ{Rk IDATxœìÝy´¥w]ç{« ’ &LE´%*ÚWQQ»EèÛ Þ¢6Ýh;Ò*,¯(ÞæÔI ©ÊL&’@32d„ÌsB*$•¤ª*UµŸ=?Ï÷®:AZ C çœïÞ¿ýz­õþ«W¯ÕZÏpž_rÎL°zíý1¸óœè]º4:§ý~TGüB´–ï­ÿˆ4òuŽ}[4'³o#€ÙÓoGç¸ßJÿÞ’4b-ßmæÜ®sÚû¢wÙ²ÜynÔë¿•ýÄ€t?’ýÿ˜/ugC îýrt/žŽöqoÖ²ç^KÛXç_þKD¿Ê¾­f_¯5ó¼ewIƒ–½8ÚÇÿvô.™ŽÁ}EÝݘý€ye @¹êA V]Ý‹þwTG¾)Z‹wÈ?”–f¡îgÿ(bØÏ¾ÃæLÓÝí£ßšþý%iÌZ¼cTG¾9º}<†^3s>%3 ,½Vôo==:§ÿA´–¿$ÿÐYšåºçþψ¦Î¾Óæ\Óy2ÚG½9ý;LÒ·ÏFç³ýÛ>Ñó—T((ã¯ßŽþíg>5ú\ºKþÁ²4Gõ¾ò±ˆ¦É¾ãæMÓ^íOþBú÷˜¤Z²Kt>û_cpÇÙýNöã f…(ck¸æÎè^øÑÚg÷üdi.›Zý+÷˾åR4ÕÑ>ügó¿Í$•Ó²]£sö_FýèÍÙ8Ø. Œ—A7ú7ÕÑoÍ?(–棩…1øÆQÙw@ªfÓcÑ>ô§ó¿Ñ$Wû˜_‹þͧD zÙ:Øj Œ…ºódô¾ú‰hí·gú¡°4o-Þ!7—}ûŒ#PIsÚÊ—G÷â騫µÙ;Øb Œ´zÃêè~áÃÑZ²Kþ!°4Ÿ-Þ1·ž–} Œ”æÉ£:ðÇò¿Ù$•Û²G÷ÂFÝz<û‘ÏÉ€‘T·žˆî…ÿ­%;çúJóÝô¢ÜqVöm0’Œ@%ÍKKw‰î…ÿä7‚0Ò @)ugCt¿òÿùŸšÜ–ìÃ{¾˜}+Œ´ú;ߌj¿WæÃI*¿e»Fïòå½*ûÑ?Ä€ÑP×Ñ¿é„h­|yþ¡®”Õ’cxßEÙw#ÀX¨»-ª}~4ÿ[NÒd´ßžÑ¿ñ„ˆ¦É~üÀ÷€n°êª¨>ù‹ù‡¸RbÕ²ÇpÕUÙ·#ÀXÙüµù/)dÓIšœÚǾ-†«oÌ~üÀ PÒÔíõÑýÂÿŠÖÔÂôƒ[)³jù®QûkÙ·$ÀXÞ÷•hM/Jÿ¶“4A-Þqæ\3º›²L8PR î:?Zû¿*ÿ°V…ñçC_Ͼ%ÆÚà–Sü¦’æ¿<÷]”ý`‚€0¯êjmtNÿÃüÃYiª–ïõÃßȾ-ŠÐ¿æôïûÎ(R÷Üÿ™þÝ'iBÛûùÑ»ú ˆ¦É~0! @˜Sõ¦Ç¢ý™ßÌ?|•F$ö`Ž5ut?û‡éß’&·ö¿¼+êöºì§!À€93øÖ•ÑÚ÷é®Ò¨T­Ø=êGn̾5Ê7ìEç„w¤Jšð? ¿æÎì§!…3`Nô¾vx´¦Ÿ—~Ð*Ôoþ\}Cö­ 01šÞ¦hê—Ò¿%MnÕ²ÇàŽ³³‡Ì€ÙU¢{þ‡ÒW¥‘jé.1\uUöÝ 0qšÎúhñóùß…’&·©Ñ»beöã€B€0{º›¢}ÒïäªJ£”ñ'@ªfÃCQíÿªüïCI]÷‚DÔÃìG"…1`VÔ›‹êÈ7¥¤J#Õ’bøÀ¥Ù·'ÀÄ«»uæO1§'Jšè:§¾'¢ßÉ~$PP¶[½ñ‘¨Ý+ýU©¦Åðî/dßž|×ðËf¾ÕÒ¿%MtíÏüFÔÝÙD a Àv©×}+ªƒ~"ýàT©¦ŸûÎ˾=øƒŽËÿf”4ñµùµ¨;²‰À€m6|üîhí·gú©4rãÏ;>Ÿ}{ð zOå;JšøªOýrÔíõÙDÆœ(Û¤^¿*Z¼&ý T©¦Æà–S²oOžMÓD÷¬?Éÿ†”4ñÍŒ@ý9x¶ƒ([­Ùðp´üñôRi¤šZƒo|*ûö`K ûÑ9þíùß’’&¾öq¿Ñïd?S l•zÓš¨ùéôƒQiÔê_¹_öí ÀVhº¢}ÄÓ¿'%©}òïÍ Ó`k€°Å6ÿ9¢êˆ_H?•F­ÞÅSÙ·'Û Y¿*ªý^™þ])Is?˜ýH` €°eêA´OþÝôƒPiÔêÿ¡ì»€íP¯¾!ª¥/Lÿ¾”¤ÞÕe?3 l‘îy“~*ZÝ3ÿ8¢©³oO¶Óðž/FkñŽéß™’&¼©…1¸ãóÙDƈ(Ï©wõù‡ŸÒˆÕ=ý}õ0ûö`– ¾qTú·¦$µ–îÃÕ7f? <«Á}û ÒÔ9áÃ^öí À,ë]øÑôoNIªz]ÔíuÙDÆ€(Ϩ^ÿ`´Vì‘~à)Rí£ÞMoSöí À\hêèœü»éßž’Ôþ—wEÔuöS€g ÀÓëw¢:òÍéÒ(ÕþÄOFÓZ“}w0‡šîÆhþséß ’Ô»|eö#€g ÀÓê~á¥pJ£TµÿžÑ¬_•}k0šõߊjåKÓ¿E%Mx‹wŒáƒ_Í~$0 @ø!ƒo^­©ùœÒˆT­Ø=ê5wdߚ̣áª+£5½(ý›TÒdWôº¨;²‰Œ(P¾OÝz•4ÙM-ˆÁ]çg?A |Oÿ¦“ò3¥Q:X¿ù¤ìÛ€lõ :Çý§üïTI]uÀ«£înÌ~"0b @˜Q·žˆÖŠ—¦dJ£RÿÊ}³oKFDÓ^íƒ_Ÿþ­*i²ë^ð‘ìÇ!#Æ€3ÞŸ~€)JÝsþ*û–`ÄÔßÕò]Ó¿Y%Mp‹wˆáÃ×e?! Äà›_Ê?¼”F¤Î)¿Q³oKFÐðî/Ì °²¿]%Mní£Þâì €ï1˜tÃ~T‡î•~p)Ìz¯•}W0ÂúWíŸþý*i²ëßxBö£€a 0ázWœ~`)Bíƒ"šÖšì[€1Ð=ûÏÓ¿c%MnÕþ{Ft7e?  ¬n=­å»¥XJÙUû¾<šu÷gß’Œ‹Agæ¯HdÏJšÜz—.É~0 @&X÷¼¿M?¨”Ò[ºKÔ#ûv`Ì4ëWEµbüïZIYµô…Qoz,ûQ@2P€ U¯_­½ŸŸ~P)¥6µ0†wž“};0¦†÷_­Å;äßJšÈº~4û1@2P€ ÕùüŸ¥PJÙõ¿ú‰ì[€1׿|yú÷­¤ þË6~ (ÀD3˜@Ãï|3ZÓÏË? ”ëžýÙ·"%hšèžúžôï\I“Y÷ËË~ È`uÎüãôƒI)³Î‰ÿwD=Ⱦ(DÓYíƒ_Ÿþ½+iòª–½(êjmöc€$ ¦Ùðp´¦¥LJYµÛ+šÎ“Ù·"…©»5ZKvNÿî•4yõ®Ü/û@P€ ÓýÒ?¤HJYUû¾"š'̾ (Ôà–SÒ¿}%M^Õ¯‰ö³$0˜ ugC´–íš~ )¥´d§¨úzöm@ázçÿmþ7°¤‰«ÛÙ?€LÞÕ§DJ)M-ŒÁgeß‚L‚a/ÚG¿5ÿ[XÒDÕ9ömÙO?€LêŸN?ˆ”2ê_¾<ûö`‚4‰j¿W¦Kš¬†kîÌ~ü0Ï @&ÄàËÒ ¥Œº§¿/¢i²oA&ÌðK£µxÇôïbI“Sï¢ÿýè`ž€LˆÎïO?€”æ»ö‘¿ѯ²o?&TÿÊýÒ¿%MNÕþ{F Ù>æ‘(À¨«ïDkï¤@Jó}à½ùOî@š¦‰ÎÉ¿›þ,irÜûåì'óÈ`ô¯=2ýàQš×–ìõC×fßzM{]T¾6ÿ[YÒDÔ=ûϳ{Ì#P€ ÐþÌo¦òó¿·%Wï‹É~Â0Ç @ Uö3éŒÒ\Ô»x*ûö€YU?qOTK_˜þÍ-©¬:Çüjöã €9f P ºóäÌoIÌ>`”f»Î ïˆhêì[ fÝàºcÒ¿»%ÖÒ]"jgi%3(Ð`ÕUù‡‹Ò,Wðšhª'²o/˜3ÝÓÞ›þý-©¬š'¿ýh`€¨÷õ#Ò¥YmïçGýð7²o-˜SMëñ¨ö}Eþw¸¤bÞwQö£ €9d P Î9L?X”f³ÁuGgßV0/†ßüR´¦¤‹K*£þ×Ï~¬0‡ @ Ô>úWÒ¥Ùª{ÖŸdßR0¯ºçüeú÷¸¤2êÿ¡ìGsÈ @­{¤,J³QûˆŸè·³o)˜WMoS´~}úw¹¤ñ¯sÒ»³iÌ!P€Òt7¥*J³Qµô…Q?~Wö)ꇯ‹ÖôóÒ¿Ï%wí#ß”ý8`€føè­é‡ŠÒl4¸ù¤ìÛ Rõ.žJÿ>—4ÞUû½2ûQÀ2(Ìà®óÒ¥í­{î³o%ÈW¢ý©_JÿN—4ÆM-œy–P&P€Âô¾vxþ¡¢´µøùˆA'ûV€‘P?qw´–ìœþ½.i|k6®Î~”0G @ Ó½èãéŠÒ¶V-}aÔß•}ÀHéýˆôovIã›ó6€r€¦{î_§(JÛÚàæ“²o!=M“Þ•þÝ.i<«¾.û)À1(Lç´÷¥(JÛR÷Üfß>0²šÖš¨V¾,ýû]Òø5|àÒìGsÄ 0íã~+ý@QÚÚÚG¼1bÐɾ}`¤ nÿ\ú7¼¤ñkx×yÙ/æˆ(@aªOþbú¢´U-Ù9êÇï̾u`,tO÷×_$m]ƒ[OÏ~t0G @ SºWú¢´5 ®?6û¶€±ÑTOøS𒶪ÁmŸÍ~t0G @ SüúôEiKëžöÞì[ÆÎà–SÓ¿é%OƒÛÎÈ~l0G @ ÓÚÿÕéŠÒ–TðêhÚk³oKÝSß“þm/i<2(—(@aZ+_ž~ (=g‹wŒáƒWgß.0¶šMFµÏæãKù·.û‘À1(LkŸÝÓ¥çªÙÒì[ÆÞà¦Ó¿ñ%~ å2(Œ¨F½Î±o‹¨‡Ù· ¡sÊï¥ëKí @Êe PPr›ÿ4]³á¡ìÛбù;»Z¾kú7¿¤ÑÍ \ …1Õ(7¸õôì[Š3¸þØôo~I£›(@¹ @ cªQ­{ægßP¦¦‰Î ïLÿö—4š€”Ë 0 Ū^M{]öíÅjÖ¯ŠjÙ‹ÒÏ$^ å2(Œ¨F®©…1|à²ì[Š×¿öÈüsI#—(@¹ @ cªQ«÷•ξ-`rþüñ¿~ i´2(—(@a @5Jµ?ù"†½ìÛ&F½ö¾h-Ù9ýL@Òèd P.P€Â€jdÚûQ?vkö-§å¾ùç’F&P€r€ÆT£RÿšC³o˜LÃ~´ÿ¹ô³I£‘(@¹ @ cªQ¨sÜŠhšìÛ&VýÐ×£5µ0ýŒ@R~ å2(Œ¨²«–½8šõ«²o˜xÝsþ*ýœ@R~ å2(Œ¨²\ÿéìÛˆˆ¦ódTûý»ô³I¹€”Ë 0 Ê¬süoûÓï0B·œ’~^ )7P€r€ÆTYUËw‹fÃCÙ·ð6ÿ›Ùç’ò2(—(@a @•Õæß(Œžzí½ÑZ²SúÙ¤œ @Êe PPeÔ9å÷²/}àYô/[–~~ )'P€r€ÆTó]µbh6=–}éÏfØ‹öa{¥Ÿ#Hšÿ @Êe PPÍwƒÛÎȾì€-0\ue´¦¤Ÿ%Hšß @Êe PPÍg“'û’¶B÷óš~ž i~3(—(@a @5_UËwfÃÃÙ—<°šöÚ¨V¾4ý\AÒüe P.P€Â€j¾ÜxBöålƒÁǧŸ+Hš¿ @Êe PPÍGÞ™}©Ûªi¢óé_O?_4?€”Ë 0 šó–îͺû³/u`;ÔknÖâóÏ$Íy å2(Œ¨æºþµGf_æÀ,è÷7éç ’æ>P€r€ÆTsYû˜_‰hêì˘M{]T+öH?o4·€”Ë 0 š³–ìõw¾™}‰³hð£òÏ$Íi å2(Œ¨æªþ+³/o`¶5u´zsú¹ƒ¤¹Ë \ …1Õ\Ô>âÃ~öå Ìáƒ_ÖÔ‚ôóIs“(@¹ @ cªYojaÔß¾&ûÒæP÷Œ÷çŸAHš“ @Êe PPÍv½/ý¿Ù—50ÇšMFµìÅéç’f?P€r€ÆT³Yuàk£émʾ¬€yпbeúY„¤ÙÏ \ …1Õl6¼÷ËÙ—40_†½hòSéç’f7P€r€ÆT³U÷¬?ɾœ€y6¼ûüô3 I³›(@¹ @ cªÙ¨Z±G4­Ç³/g Aç¤w¥ŸMHš½ @Êe PPÍFƒ›O$õw¾­½ŸŸ~>!iv2(—(@a @µ½u>ýëM“})‰z_þ§ô3 I³“(@¹ @ cªíjzQÔß™}ÉšÞ¦¨ö{eþY…¤íΠ\ …1ÕöÔûÊ?g_ÂÀˆ\lúY…¤íÏ \ …1Õ¶Vðšˆ^+ûFE=Œöá?—~f!iû2(—(@a @µ­ ï<'ûòFÌðž/¦ŸYHÚ¾ @Êe PPmKÿsö¥ Œ¨Î ïH?»´í€”Ë 0 Úê–ìͺû³/]`DÕÞ­©…ùg’¶)P€r€ÆT[[ÿ²eÙ—-0âºgýô3 IÛ–(@¹ @ cª­©ý‰ŸŒt³/[`Ä5ŠÖ’ÓÏ2$m} å2(Œ¨¶¦áÝ_Ⱦd€1Ñ»øãég’¶>P€r€ÆT[Zçø·g_®Àiz›¢Ú÷ég’¶.P€r€ÆT[Ôâ£^s{öå Œ™þµGæŸkHÚª @Êe PPmI½/ý}ö¥ Œ£zíÃ~&ýlCÒ–g P.P€Â€ê¹ªV¾4šÎúìKSûÎK?ߴ倔ˠ0 z®×“}™c®sÜo¥ŸqHÚ² @Êe PP=[íOþÂÌŸjØõ#7EkjaúY‡¤çΠ\ …1Õ36µ †ßº"û ÑýÜÏ?ïôœ€”Ë 0 z¦º§ÿAöå ¤Y÷@´¦¥ŸyHzö @Êe PP=mÓ‹¢^{_öå ¦wÞßäŸ{HzÖ @Êe PP=]½/ý}ö¥ ¨ÙøH´–ìœ~ö!é™3(—(@a @õƒUËw‹¦úNö¥ ªwáGÓÏ?$=s å2(Œ¨~°þÕf_–@Á6ÿ‡§Õ²§ŸHzú @Êe PPýÛª,bÐ;,€Âõ/Ý;ýDÒÓg P.P€Â€êß6¸åÔìK˜MoST+_–~"é‡3(—(@a @õ¯µ?ù M}I¢Õéç!’~8P€r€ÆTÿÚðþ‹³/G`’ :Qíÿªô3Iߟ(@¹ @ cªÍuNzWö¥L Á7ŽJ?‘ôý€”Ë 0 jM-Œú‘›²/E` ûÑ>ø'òÏG$}/P€r€ÆTÝ3ÞŸ}lpÓ‰éç#’þO å2(Œè„·x‡¨Ÿ¸;û2&YSGûˆ7染HšÉ \ …1ìºçüeö%ƒÛÏL?'‘ôT å2(Œè·÷ ¢yòÛÙ— @DÓDûS¿”^"É ` …1Üz_üHöåð=Ã{/L?/‘d P2P€Â€NfÕÒF³é±ìËàûtŽýµôsiÒ3(—(@a @'³ÞÅϾô~Èðž/¦Ÿ›H“ž(@¹ @ c:yUËw‹¦½.ûÒxZí£Þ’~~"Mr å2(ŒèäÕ¿|yöeðŒ†w›~~"Mr å2(ŒèdU-ß5šÎúìËàYµ|Sú9Š4©€”Ë 0 “UÿÒ%Ù—ÀsÜ~fú9Š4©€”Ë 0 öÛ?Ûë²/9€çÖ4Ñ>âéç)Ò$f P.P€Â€NN½Kg_n[lpëééç)Ò$f P.P€Â€NFÕ²GÓ^›}¹l¹¦Žöá?›~®"MZ å2(ŒèdÔ»øãÙ—ÀVÜ|Rú¹Š4i€”Ë 0 åW-}a4­Ç³/5€­W£}ÈO¥Ÿ¯H“”(@¹ @ cZ~½¯üsöe°Í,H® IDAT7—~¾"MR å2(Œhá-ÙÙoÿÆÛ°ÕA?žÎ"MH å2(ŒhÙõ.øpö%°Ý×~Î"MJ å2(ŒhÁ-Þ1šõ«²/1€Ùù- ¾6ÿ¼Eš€ @Êe PÐrëžùìË `Öô¿~Dúy‹4 €”Ë 0 …6µ êÇn;¼fÏ Õ~¯Ì?w‘ Ï \ …1-³ÎÉ¿“}i̺þ+ÓÏ]¤Ò3(—(@a @ËløàÕÙ—À¬kº¢Z¾kúÙ‹Tr å2(ŒhyuŽýµìË `Îô.ü‡ôó©ä @Êe PÐòÞ}~öe0gš GkzQúŒTj å2(ŒhYµû™ˆ¦É¾¬æT÷¬?I?‡‘JÍ \ …1-«ÁõÇf_R@¡šÎúhÖ¯Šú±[£^}} ¸,†÷]ôýÝ{a n;ãûÞyöSÿg«®œù¿W¯¹#šu÷G³é±hÚë"êAöÿhÀª×Ü­©ég1R‰€”Ë 0 åT­Ø#¢ß1дŸrïùb n<>ú—-ÞùÝÓÿ :'¼3ÚG¿uæ7‹W¼:ªå»ÎýÏ2Ó‹¢ÚÏhñóÑ9áÑýÜ‹Þ?ýË—ÇàúOÇð®scøàWgþÜ«ßvü«ÎIïN?‘JÌ \ …1-§ÞÅϾœ€Q0ìEýÄÝ1¼ë¼è_}Pô.øptO{o´ù•¨|m´ö~~úÏ-ÛÕÞ/ˆöa{Í >6ÿÏÖ¿æÐÞ}þÌoA'ûûÀ<~ëŠüŸM¤3(—(@a @ izQ4ɾœ€ù2ìGýÄ=1¼ç‚èõ3¿½sóoάz]´ïÿ³IVS fþwÐ=õ=Ñ¿tI ï<'šõßÊþ׿Pûè_ÎÿD*,P€r€Æ´Œºg~ ûRæÈæÿÈcøÍ/EÿŠ•ÑýìEûÐ7DkñŽé?ŒSÕòÝ¢ó™ßŒÞƒŽ‹úñ;³ÿY€Y2¸ã¬ôŸ5¤Ò2(—(@a @˨~øºìK Ø^õ šu÷ÏüéöÞ%Ó3â¼Úï•é?g”Zµò¥3ÿ;î_¹o W]1ìe_À¶hê§þ™øùB*%P€r€Ætüë|ú7²/#`Ôkï‹ÁÍ'GïüEû¨·Dkï¤ÿ\1ÉUË^ÿsô/ß'†^Q³/` ®;:ýg ©¤ @Êe PÐñoxçÙÙ—ð\†½™QaÿŠÑ9ùw£Zù²ôŸ!ôìUûühtÏx n95šöÚì+x6ƒNTû¾"ýç©” @Êe PÐñ®:èu~;ŒêàsÕUÑ¿lYtŽ{´–ìœþsƒ¶£Å;DçØ·Íü¹øú±Û²¯.àilþmÒf É \ …1ïúW˜} ßµyØ¿ú èœðƒÏ«ü±è]øQ?rSöe|WÓ^Õ²¥ÿœ •(@¹ @ c:Æ-ÙÉŸ#€DMõÜzZt?ÿ§Qí¿gþÏJ©}Ø^3¿éµYwö% ¯÷¥¿OÿÙ@*!P€r€Æt|Û<6æW½öÞ§~Ëç§cæÏ‚gÿ< jjA´~kô¿~x4­5Ù—*L¤fýªh-Þ1ÿçiÌ3(—(@a @Ç·úáë²/(_ÓDýеÑûÊÇf~Ócöû_cÒâ£{ê{bxßE3×0º§½7ÿgiÌ3(—(@a @dzö§~)ûÒ€¢ÕknÞ%ÓÑ>øõéï}w›¯¡þ•ûFS=‘}YÀD®º2ýý/{ å2(Œèx6¸ñ„ìKŠS¯¾>z_úû¨xMú»^¶d§è~þOg~£,0·ÚŸüùï~iŒ3(—(@a @ǯjÅîƒNö¥Ehž|0ú—ïíCßþŽ×äÔ>êÍ1¸íŒˆ¦Î¾ HƒOßKãœ(@¹ @ c:~õ.ühöec­émŠÁ Ÿ‰Î§#ZS ÓßíšÜÚ‡üT ®ÿtİ—}[@YݨV¾,ý]/k å2(Œè˜5µ0šud_60¶â½{Î_EµìEùïtéßTíûòè]2MçÉìÛŠÑ»x*ý/k å2(ŒèxÕ9áÙ— Œ•¦³>ú_;,ÚG¼1ý=.=WÕŠÝ£é’hÚë²o{ÍÆG¢5½(ýý.c å2(Œèx5¸íŒìKÆBýÄ=Ñ»àÃÑZºKúû[ÚÚª}^ý+÷è·³o%kÝÏý·ô÷º4Ž€”Ë 0 ãõ¡bÐ;d`t5u ï»(:'½;ZS ÒßÝÒöVí¿g ®;:¢dß]0–êÕ×§¿Ï¥qÌ \ …1Ÿz_úûìËFRÓÝý¯~"ª_›þ¾–æ¢ö¡oˆáŸhšìÛ ÆNûè_N—Kã–(@¹ @ c:>ÕkîȾ\`¤4WGï+‹jùnéïii>Ú<`®º*ûÖ€±2¸åÔôw¸4n€”Ë 0 ãQûè·f_*02ê'îŽîçÿ4ZÓ‹ÒßÑÒ¼7µ ºg~ šMfߊ0†ý¨öß3ÿ.Q å2(Œèx4¸á3Ù— ¤ÛüÛ°7ßZ‹wL7Ké-Ý%z—LG {Ù·&Œ¼þåËóßÝÒe P.P€Â€Ž~ÕÒFÓݘ}©@šú±Û¾;üÜ!ý½,Zí#ÞèÏÂÀshª'¢µd§ô÷¶4.€”Ë 0 £_÷ì¿È¾L EýøÑ=í÷gþäuöûXý? ÿÇÑlz,û¶€‘ÕýüŸå¿³¥1É \ …1ýêo_“}™À¼jÖ+ºgý¿ñSÚʪ»Çà–S²oaIõ£7§¿«¥qÉ \ …1íÚŸøÉˆ¦É¾L`^4­5Ñ;ÿCÑš^”þ–ƹÎ)ÿO4›;¥`ät>ýëéïii2(—(@a @G»þeK³/˜{Ã^ô¯9$ªå»¦¿{¥Rª–ïƒëŽÎ¾»`¤lþMÙÙïhi2(—(@a @G¸©Ѭ»?û€95¼ë¼¨z]þ{W*´ÎIïŠfÃÃÙ·:Œ†a/ª•/K?K£ž(@¹ @ c:ºuŽ}[öås¦~øºhýËéï[iªVìƒÛÏ̾í`$ô.ühú»Yõ @Êe PÐÑmpý±Ù—̺¦½.z|8Z‹wH×J“V÷ÌDô«ìǤª×Þ­©…éïei”3(—(@a @G´½_Mg}öå³§©cpÓ‰Q­|iþ{VšàÚ‡íõc·f? Uçø·§¿“¥QΠ\ …1ͺ§ÿAö¥³¦~äÆhù¦ô÷«¤ï¶t—Üp\ö£Ò n?3ÿ},p å2(Œèh6¼û Ù—l¿~;z—LGkzQú»UÒ×=í÷ýÖy&S=ˆj¿—þ.–F5P€r€ÆtôªV¾,bØÏ¾4`» ï»(ªƒ^—þ^•ôìµ?ñ“Q¯¹=û‘ó®wñÇÓßÃÒ¨f P.P€Â€Ž^½óþ:û²€mÖt7D÷ì?OŸJÚòªe/Šágg?>`^5ëWEkñéïai3(—(@a @G¯á·®È¾,`Ûëç¯I—JÚ†¦DïËÿÑÔÙ˜7“Þ•ÿ–F0P€r€Æt´ªö{eD=̾,`ëô«™áXkjaú»TÒöµyÓtžÌ~ªÀ¼Þu^ú»WÅ @Êe PÐѪwÁße_°UꇮöÁ¯O‡Jš½Ú‡íõw¾™ýx€¹Wý{éi2(—(@a @G«áƒ_;$`Ë4uô¯X­é祿?%Í~Õ>/‰áý—d?i`Îõ/[šþÞ•F-P€r€ÆttªxuDÓd_ðœšMEç„w¦¿;%ÍqÓ‹bpóIÙ˜SÍÆGüGMÒd P.P€Â€ŽN½ ÿ!ûr€ç4¼÷ËQ­Ø#ý½)ižšZý+Vd?z`NuO}Oþ;W¡ @Êe PÐÑ©^}}öåϬi¢å¾ÑZ¼Cú;SÒü×ýüŸE ûÙO"˜³ÿÈ)û]+R å2(ŒèhTô:þ€‘Õt7F÷´÷¦¿/%åÖ9á3Ï(NÓDû?™þ®•F%P€r€Æt4ê}ùŸ²/xZõc·úÿ —ô½ÚG½%šÖšìGlŸ¦Žúñ»bpÓ‰Ñ;ÿCÑþÔÿ­éEéïYiT2(—(@a @G£ú¡k³/ø!ƒ[NÖÒ]Òß“’F«ö!ÿ>š e?¢`‹5‰á]çEï’éèœôî¨V8“ž-P€r€Æ4¿jÿ=ýùwFK=˜ùíÔÙïHI£[uàk£^{_öÓ ~HÓÛÃUWEÿšC¢{æ¢}Ø^éïMiÜ2(—(@a @óëÿ·Ù—|OÓz<:ÇþZúûQÒèWíÿª¨Ÿ¸;û±À$ö£~øÑ¿ö“Ñ=ëO¢}è¢5µ0ý){ å2(Œh~Ãû/ɾ `F³îþhòSéïFIãSµòeQ?zsöã € Ñl\ƒÛΈÞŽÎ1¿­%;¥¿ ¥3(—(@a @s«Vì>ógv [ýе3C®ìw£¤ñ«Z¾[ÔßþZöc €Â4‰á]çEï’éèœôî¨Vì‘þΓ&%P€r€Æ4·Íž ² ï<'ZKvN/Jߪe/ŽúÛ×d?ÎSMwc ¸,úWîÝSßÕ¯N·I“œ(@¹ @ cšÛð®s³/&Üàúc£µxÇôw¢¤ñ¯Z¾kÔ#û±À¨«Q¯¹=78ó§ÜÛG¾)Z‹wHIú?€”Ë 0 yUK_Ñog_Lª¦™ùsšÙïCIþ9øÕ×g?á!ÍÆÕOý)÷/ÿStŽùÕh-Ù)ý}%éÙ3(—(@a @óêžöÞì~&Õ°Ý3ÞŸþ.”TfÕÊ—Îüf7&O³é±§ÆžOEç„wFµÏKÒßK’¶>P€r€Æ4ñ õ†ã²ÿù˜Dý*:Çÿvú{PRÙUû¾"ê'îÎ~â0‡šÞ¦~ëòè_u@tOûý¨xMúûGÒìd P.P€Â€&5µ0šMfÿó0‰ãÏã~+ÿ=(i"ªöß3êµ÷e?ù˜ õ`æ·;n:1z|ø©?å>½(ý]#in2(—(@a @sjõ–ìz&M¯Ïüfú;PÒdUøcÑl\ý`+ÕkïÁ-§Fï‹yjì¹d§ôwФùË \ …1Í©é’ìz&nüùÓß’&³öá?M{]ö“€gÐtžŒá}Eï’éèœôî¨V¾,ýÝ!)7P€r€Æ4§zõõÙÿôL ¿ùSÒÔùô¯G :ÙODz­®º*ú×Ý3?íÃöŠÖÔ‚ô÷„¤ÑÊ \ …1ÿªý^Ñ4ÙÿôLãOI#Tçäߨ‡ÙOF€ÉQ£^s{ n:1z|ø©?å>½(ý} iô3(—(@a @ç¿îÙžýÏÀ„ü)ÏöÑoMïIÒ¿­{î³Åj6®Žá]ç=õ§Ü{´–ìœþÜ—4ž€”Ë 0  ¨wœ•ýÏ@éúí§~ÃÓ¼÷$éë_¶4û) 0öšê‰ÞsAô/Ý;:ÿò_¢Z±Gúó]R9€”Ë 0 óÜô¢hº³ÿÙ(Y=œù3ËéïvGé飥{ñÛJëŒ_(准VIR¶ @ò2HÆtú îº8ú™Xâú;οg’Uçãÿ)úcRíÙ]wn)Ý«–—ö¦#Kó?äYd —(@2 SKÕ~"ú™XªÇï+Í÷='þ¦IR`ýÏŒþ8¦¬êì)ƒ]ÛJoûÚ}_å¾÷7GöHÒš(@^ É€N·Öé/‹~b–²jXÚg¿2üžIRx+žY†ßØý© Lʰ_†~¥ôwn,OýEi­;¼4æŠÿ¬‘$íË /P€d @§[÷ÒwF?1KXïê•á·L’êRëƒÿvßo–æW¹÷o» t·]ÚŽ(•Ï ÿL‘$ýó€äe Œètܹ%ú‰X¢†»w”ÆòCÂo™$Õ©Î…oŠþxæQíùƾÿ.ܽjyio:²4Ox~øg‡$i¼ @ò2HÆtŠsp©ÚOD?1KQ¯YZk<þ–IR Ûû•Ñ@=T§Êàþ«KïºÕ¥sÞï–æI?þ!IZ| y€$c:½Z§ýLôó°Du>ý–ð;&Iu­yìw•á·ï‰þ¨†ϰ_†~eß{ïW¹·NYiÌþ™ Iš| y€$c:½º[þ2úyX‚÷\^sËÂï˜$Õ¹öY¿RÊpý‘ yUU~óîÒ¿eÓþ±çúW”ÆŠg†ÿÝ—$Í&P€¼ @’1âJo=7úyXjúÒZûcá7L’–B½kWEjCUû‰2¸÷ŠÒ½jyio:²4Ox~øßqIR\ y€$c:½ª'vE?/KL÷ʹðû%IK¦å‡”áC7FtÃ’SuŸ.ƒ]ÛJoûÚÒÙ|Ti­;<þï³$©V€äe Œètjžø¢è§`‰~뫾ZU’ƬuÊKKéµ¢?¡¾†ý2|ô+¥¿sãþ¯r?ýe¥qÌÁáw%IõÎ /P€d @§Sçüß~Z–˜öÆ×…ß/IZŠu·¾#ú#j£Ú³» îÜRº—¿§´7Q+ŸþwT’´ô2ÈË ÐéÔûü£Ÿ€%¤ÿå‡ß.IZ²Í-+ƒû®Šþ(‡™«ž~¤ t¯œ+í¯-ÍãŸÿ÷Q’”"P€¼ @’1NÇnŠ~Z–ˆªóTižø¢ðÛ%IK¹æÉ?\ªÎžèt˜žn£ vm+½íkKgóQ¥µîð}ãçè¿{’¤œ€äe ŒèZùìR½è§`‰è^üWñ·K’Ô½ømÑé0ÃA>ú•Òß¹±t·½ÿ«Ü—þwL’tàd —(@2 “¯}ö+£Ÿ€%b︣qÌÁá·K’R4wPI’è @ò2HÆtòu/{wô³°D´Ïýð»%I™j®yI©ºOG¼Ã?«j?¹ÿ«Ü¯[]Ú›Ž,ÍU/ÿ{#IÒÿ›(@^ É€Nᤷ]ý¬,Çn,¹eáwK’²ÕÝúŽèxØoÐ+ÃÝ;JoûÚÒÙ|Ti­;Üí—$-‰ @ò2HÆtòUO<ý¬,ís^~³$)íWÁïº.úcžÍpP†~¥ôwn,Ý­Gïÿ*÷凯ÿ}$i€äe Œèdkžðüè'` ÜûÙð›%I™k­ýñRúíè{«¿¿ô¿|~é^ú7¥}Ö¯”Ʊßþç^’¤Ie —(@2 “­ý÷¿ý¤Ô]U•Ö™/¿Y’”½îUË£?ñI¢j?Y»¶•Þu«K{Ó‘¥¹ú°ð?ß’$M3P€¼ @’1lþGfæÓ¿í‚ð{%IDË-ÃÇîˆþØg©ôÊp÷ŽÒÛ¾¶t6UZë/¹eñž%Iša y€$c:Ùw]ý¤ÔÙpPZ§¼4ü^IÒRûìWîûÍËðOÊðѯ”þÎ¥»õèÒÞpDi¬xFøŸ[I’¢3ÈË ÐÉV5~Rj¬ËÇÂo•$hõo>'ú㟚¨öì.ƒ;·ìûæ†}_å~ü÷„ÿù”$©Ž€äe ŒèäjžüÃÑÏ @͵Nÿ¹ð{%IZ;·TÇ¢O3Vµ¾]_½´ô>wìþ±çêÃÂÿ,J’´T2ÈË ÐÉÕ>ï ÑÏ @ î»2üVIÒZçÂ7EŸ¦iÐÛÿUî7­/ÍG•ÖºÃKcnYøŸ;I’–j y€$c:¹zW¯ˆ~Nj¬½ñuá·J’Øæ–•ÁýWGŸ&a8Ø?ö¼ùœÒùô[öÿvíå‡Äÿ“$)Q y€$c:¹wn‰~NjjøÈm~™$·÷·BîýM‘,-ÕžÝûþ»V÷ªåû¿Êýøç…ÿY’$){ y€$c:¹ª'Œ~NjjïWGß)IÒ¿*½ë×DŸþUç©2ص­ô¶¯-ó¿4W¿0üÏŒ$Ib y€$c:™š'|oôSPSÕS•ÆòCÃo•$é_•æûž³ï7JRƒÞþ¯r¿i}él>jßohmÌþgD’$€df ŒèdjŸóëÑO @Mu/ÿÛð;%Iú?í2{Õã÷•þÎ¥»õèÒÞpDi¬xføŸI’ôOg —(@2 “©{Ù»¢Ÿ€ª:{Jó¸ï¿S’¤Ôܲ2xàšè‘ÚÞß²:¸sKé^µ¼´7YšÇ?/þÝ%IÒÈ€äe Œè„~(z˦è§ †zŸÿ@ø’$ýÿµNýéR†ƒè3‘BÕ~² î½¢ô®9¾´Ï}}ižø¢ð÷•$I‹Ë /P€d @'Óð‘#³7 IDATÛ¢Ÿ€º©†¥õ~£$Iÿt½N¾KÏ [†_ÿbéÝð¡ÒÙ|Tiòû~£jô[J’¤Éf —(@2 hÅ3Jö£Ÿ€šÜý™ø%Iúgkžð½¥j=}.ê«–ácw–þÎ¥{ñÛJëÌ_Ë 7I’4ý @ò2HÆtñµNý©èg †Ú›Ž ¿Q’¤¹îgþ:ú\ÔFµçepç–Ò½jù¾¶w ý>’$)&P€¼ @’1]| þ0ú¨™êɯ•Æ1‡ß(IÒ<-?¤ ¿yW9ÐTݧË`×¶ÒÛ¾vÿW¹¯;<þ-$IRm2ÈË ÐÅ×»æ¸èg fºŸ}oø}’$Vûc¿]RtËð¡Kï†SKçÂ7•Ö)/-¹ƒÂÿ¹K’¤úf —(@2 ‹opÇ'£Ÿ€:öKóÄï¿O’¤ÑÜsyÉ¢Ú³»ôo» t·]ÚŽ(•Ï ÿç+I’–V y€$cºø†ßújô3P#ƒ;·„ß&IÒxíý ô½þ¥¦Úó}w§{ÕòÒÞtdižðüð–’$iég —(@2 ‹lÅ3K¢Ÿ€iŸ÷†øû$I»þMëKUݧË`×¶ÒÛ¾¶t6µo´ýÏL’$åÌ /P€d @Wë´Ÿ‰~Bj¤jlßȲ½2ܽ£ô¾xzé\ø§¥µî'Kcî ðF’$éÀÈ /P€d @Wçþ8ú ¨‘ÞõkÂo“$iáõ®^r?ª=»÷•ûåï)í G”ÆÊg…ÿ³$In y€$cº¸zמý„ÔÈÞß }›$I ¯ù¾ç”êéG¦z+öþëï{^9WÚýÍÒ<þ{ÂÿsK’$ýã @ò2HÆtq n¿(ú ¨‰ácw†ß%IÒâë^ü¶É‡n£ vm+½íkKgóQ¥µîðÒ˜[þŸQ’$é_Ê /P€d @×ðÑÛ£Ÿ€šè^uLø]’$M å‡”á·¾:þ!öËðѯ”þÎ¥»õèý_å¾üÐøÿ<’$Icf —(@2 ‹hî Rúíè' &Zk,þ6I’&Rçü7Îû¹_íÙ½ÿ«Ü¯Z^Úù¥±òÙáÿ¾%I’&‘(@^ É€.¼æš‰~>jb¸{Gø]’$M°¹eeøàöÿý9_µŸ,ƒ{¯Ø?öÜtdi®ú¾ø’$ISÊ /P€d @^{ãk£Ÿ€šè^þ·áwI’4ÙZ§þô¾ßÚ<ùÅáÿ^$I’f™(@^ É€.¼îÖwD?5áëß%I’$IY2ÈË Ð…×ûâiÑÏ@ ½=ü&I’$I’4© @ò2HÆtá î»2úù¨Þµ'„ß$I’$I’&•(@^ É€.¼êÉ£Ÿ€h­EøM’$I’$iR€äe Œè[ù¬Rª*úùV=ýpiÌ—$I’$IšP y€$cº°Zë~:j ó9á7I’$I’¤If —(@2  «½éÈè§ :Ÿøƒð›$I’$IÒ$3ÈË Ð…ÕÝztôÓ­–檄ß$I’$I’&™(@^ É€.¬Þç?ýtî¾9üI’$I’4é @ò2HÆta îøTôÓ¬wíªð{$I’$IÒ¤3ÈË Ð…5|äËÑO@°ö9¯¿G’$I’$M:P€¼ @’1]XUgOôÓ©ß)Ï ¿G’$I’$M:P€¼ @’1¿æªï‹~6‚ ¾v}ø=’$I’$i€äe ŒèøµÎ|yô³¬w݉á÷H’$I’¤id —(@2 ã×9ÿÑÏ@°ö¹¯¿G’$I’$M#P€¼ @’1¿îeïŠ~6"UUi®ú¾ð{$I’$IÒ42ÈË Ðñëm?%úÙ4|ìŽð[$I’$IÒ´2ÈË Ðüôö £Ÿ €@ý›Ï ¿E’$I’$M+P€¼ @’1¿áC7E?º[Þ~‹$I’$IšV y€$c:~ÕÓG?Zg¾<üI’$I’4­ @ò2HÆtÌ–ZJ5Œ~6¢ ¥±òÙñ÷H’$I’¤)e —(@2 ãÕ\ó’è' Ððá[Ão‘$I’$IÓÌ /P€d @Ç«}ö+£Ÿ €@ý/}$üI’$I’4Í @ò2HÆt¼:üQô“¨{ÉÛÃo‘$I’$IÓÌ /P€d @Ç«{Ù»£Ÿ €@íÿjø-’$I’$iš€äe Œèxõ®_ýdj®zAø-’$I’$iš€äe Œè˜?ü¼õÜè' HÕúvø’$I’$iÚ€äe Œèx î¿:úÉ2øÚõáwH’$I’¤ig —(@2 ã5|ìŽè' HÇYáwH’$I’¤ig —(@2 ãUµ~2‚t/ý›ð;$I’$IÒ´3ÈË Ð1ZñŒRª*úÉÒÞøºø[$I’$IÒ”3ÈË ÐÑkžüâèç Pë?~‹$I’$Išv y€$c:z­õ¯ˆ~.¢TÃ}¿ :úI’$I’4í @ò2HÆtôÚç¾>ú¹R=õõð;$I’$IÒ,2ÈË ÐÑë|êÏ£Ÿ € ƒ]×…ß!I’$I’f‘(@^ É€Ž^÷³ï~.‚ôwn ¿C’$I’$Í"P€¼ @’1½Þõk¢Ÿ € ½«W„ß!I’$I’f‘(@^ É€ŽñƒÏ£Ÿ € ß~‡$I’$IšE y€$c:zƒ».‰~.‚´?ükáwH’$I’¤Yd —(@2 £7|èÆèç H딟¿C’$I’$Í"P€¼ @’1½êñû£Ÿ € Íãž~‡$I’$IšE y€$c:zUgOôs¡ß¿A’$I’$Í*P€¼ @’1±ψ~*‚ìý ÐáwH’$I’¤e —(@2 £Õ<ñû£Ÿ € ÿ~‡$I’$IšU y€$c:Z­u‡G?Aú·_~‡$I’$IšU y€$c:Z­ ¿ýTé}ñ´ð;$I’$IÒ¬2ÈË ÐÑjo|]ôS¤wõÊð;$I’$IÒ¬2ÈË ÐÑê\ðGÑO@îÖw„ß!I’$I’f•(@^ É€ŽVwË[£Ÿ € Í~‡$I’$IšU y€$c:ZÝ+þ.ú©ÒþØo‡ß!I’$I’f•(@^ É€ŽVﺣŸ € í³~9üI’$I’4« @ò2HÆtÄzÞ´>ú©ÒZ÷“áwH’$I’¤Ye —(@2 #þÐóËçG?Aš'ý@ø’$I’$iV€äe Œèh îþLôS¤±òYáwH’$I’¤Ye —(@2 £5xàÚè§  ~ƒ$I’$Iše y€$c:ZÃÝ7G?ªÖãá7H’$I’¤Yf —(@2 £5üæÝÑO@€jÏîð$I’$IÒ,3ÈË ÐÑÚ;àÀ3üö=á7H’$I’¤Yf —(@2 £UužŠ~* ¾5üI’$I’4Ë @ò2HÆt„æ–•2D?†_¿!þI’$I’4à @ò2HÆt„V>;ú™2¸ÿêø;$I’$IÒ 3ÈË Ðùk®zAô3dp×%áwH’$I’¤Yf —(@2 ó×\ó’èg ÈÞÿÑ+úI’$I’4Ë @ò2HÆtþZë~&‚ôoÙ~‡$I’$Iše y€$c:­Ó.ú™ÒÿÒGÂï$I’$I³Ì /P€d @篵ᗢŸ € ýg‡ß!I’$I’f™(@^ É€Î_ûœWG?Aú7­¿C’$I’$Í2P€¼ @’1¿ößÿVô3¤÷ÅÓÃï$I’$I³Ì /P€d @ç¯}Þ¢Ÿ € ½/¬ ¿C’$I’$Í2P€¼ @’1¿ÎýLé}þƒáwH’$I’¤Yf —(@2 ó×¹èÍÑÏ@Þõ'‡ß!I’$I’f™(@^ É€Î_wË_F?Az×~‡$I’$Iše y€$c:Ý­ïˆ~&‚ô®]~‡$I’$Iše y€$c:ÝKßýL1•$I’$h€äe Œèüu/{wô3¤·í¤ð;$I’$IÒ,3ÈË Ðùë^þžèg Hïú5áwH’$I’¤Yf —(@2 ó×½â € ½í§„ß!I’$I’f™(@^ É€Î_÷ÊÿýLéÝpjø’$I’$i–€äe Œèüu¯:&ú™Ò¿ñŒð;$I’$IÒ,3ÈË Ðùë]½"ú™Ò¿iCø’$I’$i–€äe Œèüõ>wlô3¤ó9áwH’$I’¤Yf —(@2 ó×»æ¸èg HçÆð;$I’$IÒ,3ÈË Ðùë]»*ú™Ò¿åcáwH’$I’¤Yf —(@2 ó×»îÄèg Hÿ¶ Âï$I’$I³Ì /P€d @篷íýÑÏ@Á[Âï$I’$I³Ì /P€d @ç¯÷ùD?A÷^~‡$I’$Iše y€$c:½ík£Ÿ € ƒ¯]~‡$I’$Iše y€$c:½/¬‹~&‚ wï¿C’$I’$Í2P€¼ @’1¿Þ §F?A†Þ~‡$I’$Iše y€$c:Â~$I’$Išf y€$c:zƒû?ý\Û{ ¢ï‘$I’$IÓÌ /P€d @GopûEÑÏ@°á7ï¿G’$I’$M3P€¼ @’1ãŸ;ÎŽ~.¢uá÷H’$I’¤if —(@2 £×ÛvRôsPÍãž~“$I’$IšV y€$c:zÝϾ7ú¹¨ÖºŸ ¿I’$I’$M+P€¼ @’1½Î§ßý\Ô@{ãëÂo’$I’$IÓÊ /P€d @G¯sþ£Ÿ €Øûˆ¾I’$I’$M+P€¼ @’1½öG^ý\Ô@ïÚÂo’$I’$IÓÊ /P€d @G¯uúË¢Ÿ €èßznøM’$I’$iZ€äe Œèè5×üHôsPƒ]ÛÂo’$I’$IÓÊ /P€d @G¯yÜwG?5P=ù`øM’$I’$iZ€äe ŒèÍTÊpýdDJcù!ñwI’$I’¤)d —(@2 ãU=ýHô“PÍ“_~“$I’$IšF y€$c:^Ço~2j }ö+Ão’$I’$IÓÈ /P€d @Çkpïg£Ÿ €èl>*ü&I’$I’4 @ò2HÆtÌ~Þ²)úɨîÿ#ü&I’$I’4 @ò2HÆt¼zÛÞýdÔ@ÿ¦ á7I’$I’¤id —(@2 ãÕ½ì]ÑO@ î¹,ü&I’$I’4 @ò2HÆt¼:›Š~2j`øØá7I’$I’¤id —(@2 ãÕþèoD?uÐo—ÆÜ²ð»$I’$IÒ¤3ÈË ÐñjúÓÑO@M4O|Qø]’$I’$iÒ€äe Œèx5W¿0úɨ‰öY¿~—$I’$Išt y€$c:fÇ\J5Œ~6j ³ùOâï’$I’$IÎ /P€d @ǯj<ýlÔ@÷ªåá7I’$I’¤Ig —(@2 ã7|ä¶èg ú;7†ß$I’$I’&(@^ É€Žßà¾+£Ÿ €ìÚ~“$I’$Išt y€$cº€€Þò±èg ª=»Ão’$I’$I“Î /P€d @ǯwýšèg ªª4V>;ü.I’$I’4É @ò2HÆtüº—ÿmô³P­u‡‡ß%I’$I’&™(@^ É€Ž_çÂ7E?5ÑÞôÃï’$I’$I“Ì /P€d @ǯ½ñµÑÏ@Mt/y{ø]’$I’$i’€äe ŒèøµNûÙèg &zŸÿ`ø]’$I’$i’€äe Œèø5W½ úÙ¨‰ÁŸ ¿K’$I’$M2P€¼ @’1]@sËJé·£Ÿ€>òåø»$I’$IÒ3ÈË Ð…U=~_ôÓPÝÆ¾ÿc@ô]’$I’$iR€äe ŒèÂj¢ùþŠ¿M’$I’$M P€¼ @’1]xÕã÷G?5Ñ>çÕáwI’$I’¤Id —(@2  oðÀµÑÏ@Mt>ýßÂï’$I’$I“È /P€d @ñƒÐ[Ï~>j¢wýÉáwI’$I’¤Id —(@2  ¯w݉ÑÏ@M îütø]’$I’$i€äe ŒèÂë^òöèç &†Ý~—$I’$IšD y€$cºðÚç½!úù¨‹A·4Ž98ü6I’$I’´Ø @ò2HÆtáµÎøùèç Fš'¿8ü6I’$I’´Ø @ò2HÆtá5W¿0úù¨‘öG#ü6I’$I’´Ø @ò2HÆtÍ´ï+`¯îÅ›$I’$IZd y€$cº¸†ß¾7ú ¨‰Þ  ¿K’$I’$-6P€¼ @’1]\ƒ{¯ˆ~BjbïMˆ¾K’$I’$-6P€¼ @’1]äCoÚý„ÔDõÔ×Ãï’$I’$I‹Í /P€d @W÷Š¿‹~BꢪJóØï ¿M’$I’$-&P€¼ @’1]\ þ0ú ¨‘Öé/ ¿M’$I’$-&P€¼ @’1]\­õ¯ˆ~Bj¤sÁ…ß&I’$I’“(@^ É€.®æê⟀é]½2ü6I’$I’´˜ @ò2HÆtñ•n#ú¨‰þmŸ¿K’$I’$-&P€¼ @’1]|ÃGo~Fjbøð­–p_ IDATáwI’$I’¤Åd —(@2 ‹op×%ÑÏ@]ôÛ¥qÌÁá·I’$I’¤…f —(@2 ‹¯wÇ¢Ÿ€i®yIøm’$I’$i¡€äe Œèâë^úÎèg FÚ_~›$I’$IZh y€$cºø:çýnô3P#ÝÏüuøm’$I’$i¡€äe Œèâkö³ÑÏ@ôo<#ü6I’$I’´Ð @ò2HÆtñ5{nô3P#ƒû?~›$I’$IZh y€$c:™ªöÑO @MTO?~—$I’$IZh y€$c:™†»oŽ~Jj¤yÜw‡ß&I’$I’’(@^ É€N臢·_ý”ÔHký/†ß&I’$I’’(@^ É€N¦Þõ'G?%5Òù䟅ß&I’$I’’(@^ É€N¦îÅo‹~Jj¤wýšðÛ$I’$IÒB2ÈË ÐÉÔÞøÚè§ F÷\~›$I’$IZH y€$c:™ZøÑè§ Fª' ¿M’$I’$-$P€¼ @’1PÇ\Ê ýœÔEU•æqÏ¿O’$I’$™(@^ É€N®á7ïŽ~Nj¤uæËÃo“$I’$Iãf —(@2 “kp×%ÑÏ @t.zsøm’$I’$iÜ @ò2HÆtrõ>ÿÁèç FzÛÞ~›$I’$I7P€¼ @’1\Ý-o~Njdp÷ÖðÛ$I’$IÒ¸€äe Œèäjä5ÑÏ @TOì ¿M’$I’$›(@^ É€N®æÉ/Ž~NꤪJó}Ï ¿O’$I’$“(@^ É€N°¹ƒJé·£Ÿ€iñ ñ÷I’$I’¤12ÈË ÐÉ6|ôöè' F:¾)ü6I’$I’4N y€$c:Ùw|*úI¨‘Þu'†ß&I’$I’ÆÉ /P€d @'[oÛû£Ÿ€Üuqøm’$I’$iœ @ò2HÆt²u>õÑO @Tß~›$I’$I'P€¼ @’1líÿjô“P'Õ°4ŽýÎðû$I’$IÒ¨€äe ŒèdkžôƒÑO @Í´Îøùðû$I’$IÒ¨€äe Œè„›[VJ·ý¬ÔHçÂ?¿O’$I’$˜(@^ É€N¾á÷F?+5Ò»~Møm’$I’$iÔ @ò2HÆt? Ýý¬ÔÈàžËÃo“$I’$I£f —(@2 “¯wíªèg Fª=ß¿M’$I’$š(@^ É€N¾ÎEoŽ~Vj¦yÂóÃï“$I’$I£d —(@2 “¯µþ£Ÿ€šiŸýªðû$I’¤ÿÅÞ½GÛ]—w$ÑÖJEWÛ‘Ö©U«m3.{¥–Ö+-Ó–Çv¬—:uVë´Ö¡ËéÅÚiÎ.A‚1r Ĉˆ¡QAåDÀ€cTŠGξïýûÎJ2Ì0 —žó|Ï~½Özÿ¯ìoòìÄœ&IÚ‹ @ò2HÆô»_gåþÑ+•\ôÖðû$I’$IÒÞd —(@2  SóÀÝÑ-}æ´ðÛ$I’$IÒÞd —(@2  ÓøÖK£?Z*2¾ýêðÛ$I’$IÒÞd —(@2  ÓðÚ“£?Z*Òôï/óË÷ ¿O’$I’$=^ y€$cº0 þá¿G´T¦óÎ ¿O’$I’$=^ y€$cº0õÎ:8ú£ 2½ ¿~Ÿ$I’$Iz¼ @ò2HÆtaêÿ#Ñ-•\ò7á÷I’$I’¤ÇË /P€d @®¦÷í耊Œnü@øm’$I’$éñ2ÈË Ð…kòµk£?^*2¹û¦ðÛ$I’$IÒãe —(@2  ø¥ÛÖG¼Ôd<(ó³KÃï“$I’$I•(@^ É€.\ƒKþ&úã 2ݵËÂï“$I’$I•(@^ É€.\½s^ýñP™þy¯ ¿O’$I’$=V y€$cºpu×¼4úã 2Ã\~Ÿ$I’$Iz¬ @ò2HÆt›YRʨýP‘ñ/Š¿O’$I’$=F y€$cº°Mæ¶GÄT¤ùöíá·I’$I’¤ÇÊ /P€d @ú/K7FÄT¦sŒÛ+I’$Iª7P€¼ @’1]؆—­ˆþˆ¨LïŒ~Ÿ$I’$Iz´ @ò2HÆtaëŸÿÆè€Ê 6~Ÿ$I’$Iz´ @ò2HÆtaëžü³Ñ1•Ýpfø}’$I’$éÑ2ÈË ÐîÈï-e2Žþ˜¨ÈäÎëâï“$I’$I’(@^ É€.|“{¿ý1P“Q¯ÌÏ, ¿O’$I’$=R y€$cºðo¾ úc 2ÝwÿTø}’$I’$é‘2ÈË Ð…oxÙQÑ3•éŸ÷úðû$I’$IÒ#e —(@2  _ÿÜßþ˜¨ÌðòcÃï“$I’$I”(@^ É€.|ݵˢ?f*3Þù±ðû$I’$IÒ#e —(@2 ‹ÐÌ’RFý耊4ß¹3þ>I’$I’ô€äe Œèâ4¹û¦è€ÊtŽùðû$I’$IÒÃ3ÈË ÐEúKӛΉþ¨¨Lï}¿~Ÿ$I’$Izx y€$cº8 .yGôG @e{[ø}’$I’$éá€äe ŒèâÔûÀ¿‹þ¨¨Ìè³g‡ß'I’$I’ž(@^ É€.NÕ/Œþ¨¨ÌäŸ>~Ÿ$I’$Izx y€$cºH-ß§4ýû£?nj2ê—ùÙ¥ñ7J’$I’¤‡d —(@2 ‹×äkŸŽþ¸¨L÷=/ ¿O’$I’$=4P€¼ @’1]Ä¿8½þŒè€Êôÿþ?‡ß'I’$I’š(@^ É€.^ƒ½-úã 2ëN¿O’$I’$=4P€¼ @’1]¼zgýqP™ñ-[Âï“$I’$IÍ /P€d @¯ÎqÏ‹þ¸¨LÓ½¯Ì/ß'üFI’$I’ô` y€$cº¸5ó߈þȨLç„„ß'I’$I’Ì /P€d @·ñ­—EäT¦wοO’$I’$=˜(@^ É€.nÃkÖFäTfxéá÷I’$I’¤3ÈË ÐÅ­ÿ‘?ŠþȨÌxÇGÃï“$I’$If —(@2 ‹[÷Ô£?r*Ó|ûöðû$I’$IÒƒ€äe Œè"wä÷–2GìT¦sÌÄß(I’$I’ @R3HÆtñ›|cGôÇ@ezï{Uø}’$I’$iW y€$cð¨Ÿ;7úc 2ƒOüeø}’$I’$iW y€$cºø >ù·Ñ;•Ýøðû$I’$IÒ® @ò2HÆtñëmøè€ÊLæn¿O’$I’$íÊ /P€d @¿ÎñÏþبÍd\æ|fø’$I’$É /P€d @cj:÷DôT¦{Ú/…ß'I’$I’ @ò2HÆ4¦ñ­—FôT¦ÿÑ? ¿O’$I’$€äe ŒhLëßýÑP™ÑgN ¿O’$I’$€äe ŒhLý ÞýÑP™É×® ¿O’$I’$€äe ŒhLÝS~.ú£ 6Ãn™ŸY~£$I’$IÓ(@^ É€uÄ3J£?~*Ó]»,þFI’$I’¦:P€¼ @’1k2·=úã 2ý¿ÿOá÷I’$I’4Ý€äe Œhà_¤ÞtNôÇ@e†W­¿O’$I’¤éÎ /P€d @ã\ü×Ñ?•ßzYø}’$I’$Mw y€$cWïìC¢?~*Óô¿Sæ—?-üFI’$I’¦7P€¼ @’1«³ê€è€ ußõ’ð%I’$IšÞ @ò2HÆ4¶f~.ú P™þy¯ ¿O’$I’¤éÍ /P€d @cå’è'@e†W~Ÿ$I’$IÓ›(@^ É€Æ6¼â¸è'@eÆ·|*ü>I’$I’¦7P€¼ @’1m×ù€‡jº÷•ùåû„ß(I’$IÒtf —(@2 ±u×¼4ú P¡Îê…ß(I’$IÒtf —(@2 Á-Ziú÷G?*ÓÿÐŒ¿Q’$I’¤©Ì /P€d @ãßveô3 2ÃË ¿O’$I’¤éÌ /P€d @ã^³6úP™ñ—/¿O’$I’¤éÌ /P€d @ãë_ð¦èg@ešÎ½á÷I’$I’4€äe Œh|Ý“&úP¡Î;4üFI’$I’¦/P€¼ @’1­ Ù¥¥ŒzÑO€Êô>øšø%I’$Išº @ò2HÆ´Ž&wÝý¨Ìð²á÷I’$I’4}€äe Œh®oôS 2ã ¿O’$I’¤éË /P€d @ëh°é-ÑO€Ê4ósá÷I’$I’4}€äe ŒhuOÿåè§@…:ÇÿHø’$I’$MW y€$cZIG>³”É8ú9P™Þþ}ü’$I’$MU y€$cZO“o|!ú9P™á¥G„ß'I’$IÒte —(@2 õ4ºéœèç@eÆ;6…ß'I’$IÒte —(@2 õ4øÄ_F?*ÓÜWø}’$I’$MW y€$cZO½÷½*ú9P¡Îª¿Q’$I’¤éÉ /P€d @ë©sôsJišè'@ezç¼:üFI’$I’¦'P€¼ @’1­«æ[_~TfxÙŠðû$I’$Išž @ò2HÆ´®FÛ7F? *3þòÅá÷I’$I’4=€äe Œh] .yGô“ 2M÷›e~ù>á7J’$I’4€äe Œh]õÎúè'@…º'¾8üFI’$I’¦#P€¼ @’1­«ÎÑÏ)¥i¢Ÿ•éŸ÷úð%I’$IšŽ @ò2HÆ´¾&ßüJô³ 2ëV‡ß'I’$IÒtd —(@2 õ5úܹÑπʌo»"ü>I’$I’¦#P€¼ @’1­¯Á'þ*úYP›a§ÌÏ, ¿Q’$I’¤ü€äe Œh}õÎ|eô³ BÝ÷¼,üFI’$I’òg —(@2 õÕYùìRšIôÓ 2ý Þ~£$I’$Iù3ÈË Ð:›Ü³3úiP™áµ§„ß'I’$IRþ @ò2HÆ´ÎF7ý4¨ÌäÎëÂï“$I’$) y€$cZgƒÿè§@mƃ2Ä3Âo”$I’$)w y€$cZg½3^ý4¨P÷ÔÃo”$I’$)w y€$cZg£žUÊdý<¨Ì`Ó[Âo”$I’$)w y€$cZo“¹›£Ÿ•}ö¬ðû$I’$IÊ(@^ É€ÖÛhÛúèç@e&sÛÃï“$I’$)w y€$cZoƒÍ‡G?jÓLJgÅ~á7J’$I’”7P€¼ @’1­·îº_‰~T¨wÆ+Âo”$I’$)o y€$cZqG>³”É(ú‰P™ÁÇÿ"þFI’$I’Òf —(@2 u7¹û¦è'@eFŸ;7ü>I’$I’òf —(@2 u7ºáÌè'@ešûn ¿O’$I’¤¼€äe ŒhÝ 6½%ú‰P›¦)cÜoI’$IÒÂd —(@2 u×=í£Ÿê}Hø’$I’$åÌ /P€d @+ïˆg”2D?*3øÔßÅß(I’$IRÊ @ò2HÆ´þ&wÝýL¨Ìø †ß'I’$IRÎ @ò2HÆ´þF×ýL¨Lsÿ?…ß'I’$IRÎ @ò2HÆ´þú¾9ú™P¡Îª¿Q’$I’¤|€äe ŒhýuOù¹èg@…zç¼:üFI’$I’òe —(@2 -hvi)£^ôS 2Ã\£$I’$Ié2ÈË Ðv4ùÚµÑO€ÊŒ¿|qø}’$I’$åË /P€d @ÛÑðÚ“£Ÿ •iºß,óË÷ ¿Q’$I’¤\€äe Œh;ê_ð_£Ÿ êžøâð%I’$IÊ•(@^ É€¶£îI/~*T¨ÞëÃo”$I’$)W y€$cÚ’fö-e0ý\¨ÌðªÕñ7J’$I’”*P€¼ @’1mOãÛ¯Ž~.Tf|Ûá÷I’$I’”+P€¼ @’1mOíïŽ~.ÔfØ)ó3KÂo”$I’$)O y€$cÚžúÿ ú¹P¡î{^~£$I’$Iy2ÈË ÐöÔ]»,ú¹P¡þo ¿Q’$I’¤<€äe Œh‹Zþ´Òôï~2Tfxí)ñ7J’$I’”&P€¼ @’1mWã¯^ýd¨ÌäÎëÂï“$I’$)O y€$cÚ®†W­Ž~2Ôf<(óG<#üFI’$I’rd —(@2 íªþ£Ÿ êžö‹á7J’$I’”#P€¼ @’1mWÝw½$úÉP¡Á¦·„ß(I’$IRŽ @ò2HÆ´e-ß§4{£Ÿ •}ö¬ø%I’$IJ‘(@^ É€¶¯ñ—>ýl¨Ìdn{ø}’$I’$åÈ /P€d @Û×ðÒ#£Ÿ µi&¥³b¿ð%I’$Ij y€$cÚ¾z~6T¨wæ¿ ¿Q’$I’¤ög —(@2 í«sìF?*4¸äoÂo”$I’$©ý€äe Œh;k¾õÕè§@eÆ_øHø}’$I’$µ?P€¼ @’1mg£ÏŸýt¨L3?~Ÿ$I’$IíÏ /P€d @ÛÙàãýt¨Pç„ ¿Q’$I’¤vg —(@2 í¬÷Þ_‹~:T¨ÞëÂo”$I’$©Ý€äe ŒhK;ò™¥LFÑÏ€Ê ¯>1þFI’$I’Z(@^ É€¶·ÉÝ7F?*3¹ckø}’$I’$µ;P€¼ @’1mo£ëÖE?j3ê—ù#ž~£$I’$IíÍ /P€d @Û[ÿÂ?Ž~>T¨{Ú/…ß(I’$IR{3ÈË ÐöÖ=é§£Ÿlþóð%I’$Ijo y€$cÚâfö-Íàè'@eF7}0þFI’$I’Z›(@^ É€¶»ñW/~BT¦¹ïÖðû$I’$Ijo y€$cÚî†W¾3ú P¡ÎqÏ ¿Q’$I’¤vf —(@2 í®îïG?!*Ô;çÕá7J’$I’ÔÎ @ò2HÆ´ÝuNø±è'@…†—~£$I’$IíÌ /P€d @Û_óÀ×£Ÿ•ßziø}’$I’$µ3P€¼ @’1mã/^ýŒ¨Í`¾ÌÏ, ¿Q’$I’¤öe —(@2 íoð©åÑÏ€ uOzyø’$I’$µ/P€¼ @’1m½³‰~FT¨á›Ão”$I’$©}€äe ŒhûëýÜRš&ú)P™Ñ g†ß(I’$IRû2ÈË ÐMîýRôS 2“¹›Ãï“$I’$©}€äe ŒhŽF7~ ú)P›¦)£Ÿ~£$I’$IíÊ /P€d @s4ØüçÑO € õÎþÍð%I’$IjW y€$cš£îéÿ*ú)P¡Á–™ð%I’$IjW y€$cš¤#¾§”ñ ú9P™ñÎÍñ7J’$I’Ôª @ò2HÆ4O“;¯‹~NT¦é~³Ì/ß'üFI’$I’Ú“(@^ É€æixíÉÑÏ € u×¼4üFI’$I’Ú“(@^ É€æ©ÿá?Œ~NT¨¿ñÂo”$I’$©=€äe Œhžºk—E?'*´ëß}£$I’$IíÉ /P€d @µ|ŸÒô¾ý¤¨Ìä®âo”$I’$©5€äe Œh®Æ·l‰~RÔf2*óG}_ø’$I’$µ#P€¼ @’1ÍÕðòc¢Ÿê½÷×Âo”$I’$©€äe Œh®z|Mô“ BƒOüUø’$I’$µ#P€¼ @’1ÍUgÕÑO € ¶o ¿Q’$I’¤vd —(@2 ùj¾sgô³ 2Íýw…ß'I’$IR;2ÈË Ð|o¾ úYP¡Î;ÿEø’$I’$ÕŸ(@^ É€ækpÉ;¢ŸêŸûÚð%I’$Iª?P€¼ @’1ÍWï}¿ý¬¨ÐðªÂo”$I’$©þ @ò2HÆ4_û•2G?-*3¾ýªð%I’$Iª?P€¼ @’1ÍÙdn{ôÓ 6£^™Ÿ}zø’$I’$Õ(@^ É€æltÙÑO € uO=0üFI’$I’êÎ /P€d @sÖÿè‹~ZThpÑ[Ão”$I’$©î @ò2HÆ4gÝ“&úiP¡ÑÂo”$I’$©î @ò2HÆ4i3û–2˜~^TfòÍ/Çß(I’$IRÕ€äe ŒhÞÆ·]ý¼¨PçØ ¿Q’$I’¤z3ÈË м ¯:!úyP¡Þ†CÃo”$I’$©Þ @ò2HÆ4oýs_ý¼¨Ðð²á7J’$I’To y€$cš·Î /ˆ~^Thü•O†ß(I’$IR½€äe ŒhîšîŽ~bT¦é§Ì/Zø’$I’$Õ™(@^ É€æn¼ã£ÑO € uOzyø’$I’$Õ™(@^ É€ænðÉ¿~bT¨ÿÑ? ¿Q’$I’¤:3ÈË ÐÜõÎ:8ú‰P¡Ñ¶÷‡ß(I’$IR€äe Œhî:+Ÿ]J3‰~fT¦¹ï–ð%I’$Iª3P€¼ @’1Íßä_ˆ~fT¨³ê€ð%I’$Iª/P€¼ @’1Íßè³gE?3*Ôÿàï†ß(I’$IR}€äe Œhþ›þ4ú™P¡áU'„ß(I’$IR}€äe Œhþº§ü\ô3 B“;¶†ß(I’$IR}€äe Œè4»´”a'ú©P›ñ Ìù½ñwJ’$I’TU y€$c:o¿*ú©P¡Þ{5üFI’$I’êÊ /P€d @§£áÕ'F?5*4¸ø¯Ão”$I’$©® @ò2HÆt:êŸ÷ºè§@…Æ_¸0üFI’$I’êÊ /P€d @§£ÎêF?5*Ôtî)óË÷ ¿S’$I’¤z2ÈË ®oŸG IDATÐé©yàëÑÏ € ußõ’ð%I’$Iª'P€¼ @’1žÆ_¼(ú¹P¡þ‡ÿ0üFI’$I’êÉ /P€d @§§Á§þ.ú¹P¡ÑuëÂo”$I’$©ž @ò2HÆtzêý›ÑÏ € M涇ß(I’$IR=€äe ŒèôÔY¹)Í$úÉP›¦)£Ÿ~§$I’$Iud —(@2 ÓÕäž/F?9*Ô[ÿ[á7J’$I’TG y€$c:]¶­~rThxÙŠð%I’$Iª#P€¼ @’1®ýYô“ Bã[/ ¿Q’$I’¤:2ÈË Ðéª{ê/D?9j4˜/ó3KÂï”$I’$)>P€¼ @’1²fŸ^ʨýì¨Ð®ÿ“@ø’$I’$…g —(@2 Ó×䎭ÑÏ€ 6ÿyø’$I’$Åg —(@2 Ó×pëšèg@…vý|Ñ7J’$I’Ÿ(@^ É€N_ýóßýì¨PóÀ×Ão”$I’$)>P€¼ @’1¾:«_ýì¨T÷Ä¿S’$I’¤Ø @ò2HÆt:kæç¢Ÿê_ð¦ð%I’$IŠÍ /P€d @§³ñÎÍÑO€ ®?#üFI’$I’b3ÈË Ðél°e&úéP¡É=;Ão”$I’$)6P€¼ @’1ÎzëÿmôÓ FMS:Çýóð;%I’$IŠË /P€d @§³ÎÑÏÝ=ò€‡ëðwÃï”$I’$).P€¼ @’1Þ&÷~)úùP¡áÕ'†ß(I’$IR\ y€$c:½nÜýü¨ÐäÎÏ„ß(I’$IR\ y€$c:½ .zkôó F“Q鬨/üNI’$I’b2ÈË Ðé­{êÑÏ€JõÎ:8üNI’$I’b2ÈË Ð)nö饌zÑO€ ¶ÌÆß)I’$IRH y€$c:ÝMî¸&ú P¡ñ-Ÿ ¿Q’$I’¤˜ @ò2HÆtºn]ý¨Ñ`¾ÌÏ. ¿S’$I’¤ÅÏ /P€d @§»þùoŒ~‚Tª{êáwJ’$I’´ø€äe Œèt×=ñÅÑO€J >ö¶ð;%I’$IZü @ò2HÆtÊ[¾Oi:÷D?C*4ºùÃñwJ’$I’´è€äe Œ¨Æ;7G?C*ÔÌc÷ÿQ úNI’$I’7P€¼ @’1Õ`ËLô3 RÝ5?~§$I’$I‹›(@^ É€ªwö!ÑÏ€Jõ?òGáwJ’$I’´¸€äe Œ¨:+÷/¥i¢Ÿ"m{ø’$I’$-n y€$cª]MîýRôS BÍ·ï¿Q’$I’¤ÅÍ /P€d @µ«Ñ¢Ÿ"•êœð‚ð;%I’$IZ¼ @ò2HÆT»\ôÖè§@¥úÿ üNI’$I’/P€¼ @’1Õ®º§ý¨Ôèú÷†ß)I’$IÒâe —(@2 ÚÝìÒR†Ýèç@…&÷~)þNI’$I’-P€¼ @’1ÕƒMî¸&ú9P©Îª¿S’$I’¤ÅÉ /P€d @õ`ík¢Ÿ#•êŸ÷ºð;%I’$IZœ @ò2HÆTÖ?ÿÑÏ€J ¯=9üNI’$I’'P€¼ @’1ÕƒuO|qôs R“¯>üNI’$I’'P€¼ @’1ÕCkæç¢Ÿ$5jšÒ9ö‡Âï”$I’$iá3ÈË P=´ñÎÍÑO€Jõ>øšð;%I’$IZø @ò2HÆTm°e&úIP©áÕ'†ß)I’$IÒÂg —(@2 zh½³‰~’Tjr× áwJ’$I’´ð€äe Œ¨Zgåþ¥4Mô³ F“ñî;}«$I’$I ›(@^ É€êáMîÙý,¨Tïý¿~§$I’$I ›(@^ É€êá¶½?úYP©á«Âï”$I’$=^c¨tŽ~ø޶f —(@2 zxƒ‹Þý,¨Ô䎭áwJ’$I’þŸŽú¾Ò[wPl>¼Œ¶­/“¹í¥4M|òÆÿgki y€$cª‡×=õÀèg @­ÆÃÝÿãjô­’$I’4¥Íì[ºk—•þÆÃÊpëš2¾íÊRƃGüãËð²ñÿy[š(@^ É€êÿkö饌zÑO€JõÎúø[%I’$i*ê¬~aéŸ÷ú2¼jõž±ç°³×v^uBøþ¶f —(@2 z¤&w\ý4¨ÔðW†ß)I’$Iùê¬|öžå~ñÛËxǦÒÌÏ=µ?»|ú¤ðÿNmÍ /P€d @õHíúZðHÆ·_~§$I’$µ¼Ù¥¥{ÊÏ—ÁæÃËhÛú2™Û^JÓ|Wÿì2ºáÌøÿž-Í /P€d @õHõÏCôÓ V“Q鬨/üVI’$IjI3û–îÚe¥¿ñ°Ýÿ§ãÝ?Ê}Ô_ð?ºŒn:'þ¿{K3ÈË P=RÝ_ý4¨XïìCÂo•$I’¤:ë¬: ô6Z[f÷ü(÷î}!nß|Aø?‹¶f —(@2 z´šù¹èç @¥†—~§$I’$Å×Yñý¥·î =?Êýóç—æ¯—ZŒw~,üŸO[3ÈË P=Z㛣Ÿ'•š|íÓáwJ’$IÒ"7»tÏr¿ðÍe´m}™Ìm/¥iJ­Æ·^ÿϬ¥€äe Œ¨­Á–™èç @­&£Ýÿ¦Ÿè[%I’$išÙwÏØsãae¸uMßve)£~i“É×Äÿsli y€$cªG«wö!ÑÏ€ŠõÖÿVø­’$I’ôÝ©³ê€ÒÛphl™-ã›JÓ½¯´ÝäîÃÿ¹¶5P€¼ @’1Õ£ÕY¹Õ?Æ €XÃ+V…ß*I’$IO¼]ÿ6ÿÞºƒÊ`óáeôùóKóÀÝ%£É=_ ÿgÝÖ @ò2HÆTÕäžÑO€JMîüLø’$I’ô8Í.Ýó£Ü/|sm[_&sÛKi&e4ß¾=þŸK3ÈË P=V£mï~¢Ôj2Þýo‹Ž¾U’$I’þoÕ/*ý‡•áÖ5e|Û•¥ŒzeZ5ósáŸG[3ÈË P=Vƒ‹ÞýD¨Xoáá·J’$IšÖ:«Øý|°e¶Œwl*M÷›ÑD¨JÓ¿?ü3jk y€$cªÇª{êÑO€Š ¯:!üVI’$IÓPgÅ~¥·î 2Ø|øîåÞÜwkôê7…nmÍ /P€d @õ˜Í.-eØ~¦Tjr× ñ·J’$IÊÖÌ’Ò]»l÷r]wz™Ìm/¥™Dýo¥]ÿ,Ã?Ïf —(@2 z¼&w\ýL¨U3)£Ÿ~«$I’¤¶ÿ(÷þ¹¯-íkÊø¶+Kõ¢¿é§Ñ9êYáŸo3ÈË P=^»þÇx4½s^~«$I’¤¶Ô9þGJ)ÃË-ã[¶”¦ÿè¯ô©uŽñwŸO&P€¼ @’1ÕãÕ?ÿ ÑÏ€Š ¯>1üVI’$I5ÖY±_é­;¨ 6^FÛÖ—æ¾[¢¿¾Oα?þÚ˜(@^ É€êñê¬~Qô3 b“Ú~«$I’¤ðf–”îÚe¥¿ñ°2ºîô2™Û^J3‰þº>õ:Ç=/þm´0P€¼ @’1Õã¶|ŸÒtî‰~ªÔª™ø±Š’$Iš®–ïSºïþÉÝcÏá§ßS&_ût)£~ô7sAçøçÇ¿—f —(@2 Ú›Æ;7G?U*ÖÿÐï…ß*I’$i¡ê¬: ô6Z[fËxǦÒtîþ Î^êœð‚ð÷ÓÆ @ò2HÆT{Ó`ËLôS bÃkO ¿U’$IÒw£ÎQÏ*½u•ÁæÃËhÛú=?ÊÖê¬~Qø›jc y€$cª½©wö!ÑO€ŠMîÙ~«$I’¤'ÜÌ’Ò]»lÏrߺ¦L”fýõšï¢î»^ÿÎZ˜(@^ É€joê¬Ü¿”¦‰~®TÌV”$IR[~”ûðŠãÊø¶+Kv£¿F³ÀºïþÉðwׯ @ò2HÆT{Û®»<šþ‡ÿKø­’$I’úfíupl™-ã›JÓ¹'ú+3ºkÿeø[lc y€$cª½m´íýÑÏ€ŠíºÑ·J’$IÓYç¨g•ÞºƒÊ`óáe´m}™ÌmþzL%º'½<ü}¶1P€¼ @’1ÕÞ6¸è­ÑÏ€Š5÷ß~«$I’4Í,)ݵËJãae¸uM™Üu})“qô×a*Õ=ùgãßl 3ÈË PímÝSŒ~®T®ûîŸ ¿W’$IÊUgÕ¥·áÐ2¼â¸2¾íÊR†è¯½´H÷Ô_ÃmÌ /P€d @µ×Í.-eØ~²TlpÑŸÅß+I’$µ¶ÎÊýKffiË`ËlïØTšùoDť座ýRø»nc y€$cª'ÒäŽk¢Ÿ,ß|Aø­’$IRK:êûJoÝAe°ùð2Ú¶¾Læ¶—Ò4Ñ_iI¦»îWâßz 3ÈË P=‘†[×D?Y*Öô¾Uægö ¿W’$Iª¬™}Kwí²ÒßxØî¿[Øý£Üǃ误LÞ¯ˆÿ-Ì /P€d @õDêŸÿ†è' @座þBø½’$IRlU”Þ†C÷ü(÷¯|²”a'úk*Sªwæ+Ã=´1P€¼ @’1Õ©³úEÑO€Ê .~{ø½’$IÒâÕYùì=?Êýâ·—ñŽM¥™Ÿ‹þJ ÿGffiô1P€¼ @’1ÕÍÿÀcå’ð[%I’¤jviéžòóe°ùð2Ú¶¾Læ¶—Ò4Ñ_AáQõÎ>$þ×M 3ÈË P=ÑÆ_ü‡èg @͆Ý2Ä÷„ß+I’$=Åf–”îI?]úþq]ÿÞ2¹û¦R&£èo›ð„ôÖÿVü¯¥f —(@2 z¢ ¶ÌD?[*×;ó•á÷J’$IO¬Îê–þy¯+ëV—ñmW–2˜þZ OYïìß ÿµÕÆ @ò2HÆTO´]qexÙŠð{%I’¤G¯³òÙ¥·î 2¸øíe¼cSiæç¢¿B‚è½ïUá¿ÞÚ˜(@^ É€ê‰ÖY¹)Í$úéP±Éׄß+I’$ýïŽ|æž±çÇÞVFŸûPiî»%úë",?àÉe —(@2 z2MænŽ~ºÔl2.£Ÿ~¯$I’¦®™}Kwí²ÒßxXn]³çG¹úÑß!LïŒWÄÿºla y€$cª'Óèú3¢Ÿ.•ëè÷Âï•$IRö:«(½ ‡–Á–Ù=?ʽ{_ô×@¨Ê®ûmô¯Ó6f —(@2 z2õ?òGÑO€Ê>sZø½’$IÊTgÅ÷ïùQî›/£ÏŸ_š¾ý•ª×=ý—Ãí¶1P€¼ @’1Õ“©ûž—E?]*×|ë«á÷J’$©µÍ.Ýó£Ü/|sm[_&sÛKišè¯xÐ:ÝÓ~1þ×s 3ÈË P=©–?­4½oG?_*×=ñÇão–$IRíÍì»gì¹ñ°2ܺ¦Œo»²”Q?ú«¤Ð=åçã·0P€¼ @’1Õ“mü•OF?_*7Øô–ð{%I’T[U”Þ†CË`ËlïØTšî}Ñ_Û ­îÉ?þk¾€äe Œ¨žlÃËŽŠ~¾Tnü…„ß+I’¤È:+¾¿ôÖT›/£ÏŸ_šîŽþŠS¥{ÒËÃhc y€$cª'[ïý¿ý|¨\Ó¿¿ÌÏ. ¿Y’$I‹ÒìÒ=?ÊýÂ7—Ѷõe2·½”fý• ¦Z÷=/‹ÿ½¡…€äe Œ¨žl£Ÿ[JÓD?a*×{﯆ß,I’¤…¨³úE¥¿ñ°2ܺ¦Œo»²”Q/ú«ð0ÝwÿTøïmÌ /P€d @õTšÜ³3ú P¹á¥G†ß+I’¤§ZgÕ¥·áÐ2Ø2[Æ;6•¦ûÍè¯YÀ^è®yiøïmÌ /P€d @õTÚõ#íà±Lî¸&ü^I’$=‘:+ö+½u•ÁæÃwÿ¹·¹ïÖè¯TÀ“Ô=ñÇÃOic y€$cª§Ò`ÓŸF?aj7—ÎÑÏ ¿Y’$IØÌ’Ò]»l÷r]wz™Ìm/¥™Dƒ¾K:«_ÿûL 3ÈË P=•º'ÿLô úú½ð›%I’ôàrïŸûÚ2ܺ¦Œo»²”Q/ú«°€:ïüÑðßwÚ˜(@^ É€ê)5³oiD?c*7úÌiñ7K’$M娳·áÐ2Ø2[Æ;6•¦soô×"`‘uŽ~øïEmÌ /P€d @õTßzYô3 rÍ·¾~¯$IRî:+Ÿ]zï{U\òŽ2þÂGJó;£¿è÷¼ðߟژ(@^ É€ê©6¼üØèg @ tßõ’ð›%I’’4³¤t×.+ý‡•Ñu§—ÉÜöRšIô× B»Æáá¿gµ0P€¼ @’1ÕS­wΫ£Ÿ1-0¸èÏÂo–$IjaË÷)Ý5?ñ¿Ø»óhKëúÎ÷2)Š(ÒƒŒÆnmcß8Ü(Ú!æ¦ãmÓ£­1WoŒ&+v4ƒ¹¦jb&L2"ˆÈT 2I1ƒLÊŒ(2ŸgÏ~~½ê™j8g÷óݯ×Z￲–½:îßþVŠç”5cÏÁ¥û–Ñ=—–2ìEÿÑh‰™Å/ˆÿka y€$cª ­ÚiÛè1-Pß|ZøÍ’$I“_µËv¥{ô{KÿÜE¥¾éÔÒTDÿ1h«fþÖÖ @ò2HÆTsQóÐmÑe&]¦Ì,Þ<üfI’¤É©ZòâÒ=xûÒ_¹C^sÔ¿Ê`® ªðï¹¶f —(@2 š‹†×ýQ ºGü~øÍ’$IA-Ü´töyý¿Ê}Õ^et?`¾4ã¿ûZš(@^ É€j.êŸþ™è2-0øÎá7K’$÷W¹.ܹÔw^TÊ ýG`Ê4Ýþ]ØÖ @ò2HÆTsQ瀷D”hÑýß ¿Y’$iî«–mUºG¼»ôÏ]Tê›N-Mõ@ô;ÊèÁ[ÿÛš(@^ É€jNZ´Y)ƒ*úã @ T{¼*þnI’¤õ®ZòâÒ=xûÒ_¹C^sT­¾!úOkÍ÷Sôwf[3ÈË PÍU³¿ÒžCï”O‡ß,I’´–-Ü´töy}éø±2XµWÝ{e)£:úkeÍwVø÷hK3ÈË PÍUƒ‹v‹þ8Ðõ÷N¿Y’$éé«vÙ®t~o\¸óÿ’Ÿßô´Øšï±èïÕ¶f —(@2 š«z_ý@ôÇ€6èÏ”™Å/¿[’$M{Õ²­J÷ˆw—þ¹‹J}Ó©¥™¹?úO sª¾õœðïÚ¶f —(@2 š«ª]^ýq %º‡¿3ünI’4U-Ù¢tÞ¾ôWîP†×UF«o(¥i¢ÿH0¯ê›O‹ÿþmi y€$cª¹¬yäîè4-0¸h×ð›%IRÚnR:û¼¾ôNüX¬Úë‰_å^÷£Ï?ÀØ ¯?!þ;¹¥€äe Œ¨æ²áõÇG¤hÑ}ׇß,I’²Tí²]éýÞ'~•û­ç”2¨¢O=ÀD^óåðïè¶f —(@2 šËúgümôG€–¨vûåð»%IRÛª–½ô‰_å~Ö?–ú¦SK3³:ú¤L¬á‡o·5P€¼ @’1Õ\Ö9èmÑiZ¢÷O†ß-I’&ºE›•Îþo*ý•;”á5G•ÑêJišèЃKö‰ÿ.oi y€$cª9mñ Jö¢?Ö´ÀðƯÇß-I’&¥…›–Î~¿1û/H ¯<¤Œ~üÝRFÃès Ðjƒ‹vÿ~oi y€$cª¹nt÷ªè5-ÐôýÉfÑwK’¤ˆª=^UzǨ ¾³G©ï¼°”þLôiH§ÿ­áß÷mÍ /P€d @5× .Ú-úc @KtWøÝ’$i¾«–½´tÞ¾ôÏúÇRßtji¿/úL…þÊφ߀¶f —(@2 šëºÇüqôÇ€–\¼gøÝ’$iN[´Yéìÿ¦Ò_¹C^sT­¾¡”¦‰>¹S©÷õÇß…–f —(@2 šëªÛøœ¬•у·†ß-I’Ö»…›”Î>¯/½?V«ö*õ•2ìEŸWþUïØ÷Çߊ–f —(@2 šF?ù~ôG€–èìõÚð»%IÒÚTí²]éýÞÒ?wѿʽóPôàYtxwøíhk y€$cªùhxõ‘ÑmZ¢æçÃï–$I?[µô%¥{ðöOü*÷ëO(Íã÷EŸLÖQ瀷„ß“¶f —(@2 šz'ÿeôG€–¨oÿvøÝ’$My‹6{âW¹Ÿü©2¼æ¨2Z}C)M}"Ø@~ÛÀúg —(@2 šÖüÃSX+£a©–m~»$IÓSµÇ«KïÄ•Áª½J}çE¥ {Ñ×€yPí²]øÍik y€$cªyiÁF¥é<ýñ %zÇ(þvI’Ò×ù—_šÞcÑg€1™Y²Eøíik y€$cªùª¾ùôè7-1üîÑáwK’”¿îÁÛGŸ<Æe4œý”£oO[3ÈË PÍWý³ÿ)úã @K¬ù©Ñ3 7 ¿]’¤Üuþ£è“À8ÿoŒ ¸=mÍ /P€d @5_uýÝè7-Ò=ä·Ão—$)w½¯ýYô¹`Lš‡ï¿;mÎ /P€d @5oíøÂRê~ôG€–\°Süí’$¥®Úÿ}î“ѯ ¿;mÎ /P€d @5Ÿî¹4ú#@KŒî»>ünI’r×ÿÖ?GŸ;Ƥ¾óÂð»Óæ @ò2HÆTóÙà;{DÄh‘jW…ß.IRÞí}ê“úæÓÃïN›3ÈË PÍg½cßý EÖüjÞèÛ%IÊÛðÊC¢Oc2¼öØð»Óæ @ò2HÆTóYµóÏGÄh‘úÖsÂo—$)oÆ,Ócxùáw§Í¹™y€$cªùnôà­ÑsÚ¢”jÙVá·K’”³úöó¢/c2¸`§ð»Óæ @ò2HÆTóÝðš/GÌh‘Þ×>~»$I9Ýÿ½è3À˜ôÏü\øÝis y€$cªù®wʧ£?æ´ÈðúÂo—$)gMõ@ô™`Lz'þyøÝis y€$cªù®³ï¯GÌh‘¦ÿx™Y¼yøý’$%ká&¥Œêè3À˜t¿ü_âoO‹3ÈË PÍ{ 6*MçÁè:-âÖJ’æºj§Ÿ‹>oŒQçÀ·†ßž6g —(@2 Gõ-gDÔh‘á…ß.IR®:ûüZôy`Œª=^~{Úœ(@^ É€jõÏùbôG€i¿¯Ì,Ø8ü~I’òÔ=ì?GŸ7ƨZºeøíis y€$cªqä¶°®:½-ü~I’òÔ;îƒÑ§ €qöÂïNÛ3ÈË P¥_XJÝþ¸Ð"ƒ wŽ¿_’¤4õOÿLôi`LšG~wÚž(@^ É€j\~xyôÇ€ýäûá·K’”§5ÿbÓaô£kÂïNÛ3ÈË P«ÁÅÿýq e:{¿.ü~I’r4¼æËÑg €1©o='üî´=P€¼ @’1Õ¸ê}õO¢?î´Lÿ¬ ¿_’¤Õ·„´ú IDAT}Ö“áu_ ¿;mÏ /P€d @5®ª]^ýq eFw_~¿$I9ÝSôY`L—î~wÚž(@^ É€jœ5Ýý‘ Mš¦T»ýRøý’$µ¿¦÷XôU`Lúç. ¿;mÏ /P€d @5ΆßýJôG€–é¯Ü!ü~I’Ú]µô%Ñç €1êŸö7á·§í€äe Œ¨ÆYÿÔ¿ŽþÈÐ2õ„ß/IR»ëìý£ÏcÔ;þCá·§í€äe Œ¨ÆYg¿ßˆþÈÐ6ͨT;ÿ|ø “$µ·îfŒQ÷ðw…ßž¶g —(@2 k 6.MçÁè=-³æ'H‡ß0IRkë}ã“ѧ €1êìû†ðÛÓö @ò2HÆT㮾é”è=-Sßö­ðû%Ijoƒó—GŸ2ƨZþ²ðÛÓö @ò2HÆTã®æç£?ö´Í¨.ÕNÛ†ß0IR;^{Lô%`\ð»“!P€¼ @’1Õ¸ëðæè=-Ô;ù/Ão˜$©î^}Æ“у·†ß €äe Œ¨ÆÞÂMJÓ}$ú£@ËÔ?øfü “$µ²æñGŸ1Ƥ¾óÂð»“!P€¼ @’1UDõ÷ÏŒþèÐ6õ TË·¿a’¤–µxóRš&úŠ0&Ãë¾{d —(@2 Š¨ö?Eôh¡Þ×?~Ã$Iíª³÷ë¢Ïc4øÎá·'C y€$cªˆ:¿=ú£@ Õ7Ÿ~Ã$Iíª{ÔFŸ/ƨÿÍ¿ ¿=2ÈË P…´èù¥ ªè?m3ì•jÙKãï˜$©5õWî}½£Þ ÿ=üödÈ /P€d @U}Û¹ÑZ¨w⟇ß0IR{\¶ôé`Œº‡þnøíÉ(@^ É€*ªþ¹‹¢?þ´P}Ëá7L’Ôžü‹gÓ¥³çkÂoO† @ò2HÆTQuûÏÑÚh4,ÕNÛ†ß1IR;j»7úr0F3K¶¿=2ÈË P…µxóR†Ýè'@ õNùtü“$M|ÕÒ-Kišè³À˜4‡ÂoO– @ò2HÆT‘Õw^ýh¡úöo‡ß0IÒä×9àÍÑ' €1­¾!üödÉ /P€d @ÙàüeÑO€6jF¥ÚõÂï˜$i²ë}í£Ñ €1ªpVøíÉ’(@^ É€*²î‘ï‰~´TågÃï˜$i²œ·$ú\0Fë ¿=Y2ÈË PEV-yq)õ úÐB£»/ ¿c’¤É®¾ñ¤èsÀ .X~{²d —(@2 ŠntÏeÑÏ€6jšRíñªð;&IšÜš‡n‹¾VŒQ ¿=Y2ÈË PE7¸h×èg@KõÏþBø“$MfÕÒ-gÿe¦G÷È?¿?Y2ÈË PE×=ú½ÑÏ€–ýèšð;&IšÌ:¿=úL0f½þCøýÉ’(@^ É€*ºjÙKKÕÑO€–êìóúð[&Iš¼Öü`¦HÓ”™Å›‡ßŸ,€äe Œ¨&¡Ñ®Ž~ ´Ôà¼%áwL’4y .ûRô‰`ŒšÇî ¿=™2ÈË PMBƒU{E?ZªyøŽ2³`£ð[&Iš¬ê»¾}¢£5ßûÑ·'S y€$cªI¨wìû£Ÿ-Ö=xûð[&Iš lTšÞ£Ñç €1~÷+ñ÷'Q y€$cªI¨Z±M)Mýh©á…ß2IÒäÔÙó5ѧ €1œ¿,üþdÊ /P€d @5)Vßýh©¦óP™Yü‚ð[&IšŒz_ûhôi`Ìzßø‹ðû“)P€¼ @’1Õ¤4¸lÿèç@‹õ¾úð[&IšŒ«öŠ>KŒY÷ðw†ßŸL€äe Œ¨&¥ÞñŽ~´Xý½“Ão™$i2ݽ*ú,0fÕ¯¿?™2ÈË PMJÕ.ÛE?Ú¬”jÅ6á÷L’Ü¢ÍJt¢¯ã4ªg¿ÿÃoP¢ @ò2HÆT“ÔèÁD? Z¬êÿ¿e’¤Ø:¼9ú0fÍÃw†ßŸl€äe Œ¨&©á•‡F? Zlt÷%á·L’Ûš€éRß~^øýÉ–(@^ É€j’êøçÑO€–ëìõÚð{&IŠkxõѧ€1[óÝ}²e —(@2 š¤ªÝ_ý$h¹ÁyKÂï™$)®Ñý7EŸ"Ƭî¢ðû“-P€¼ @’1Õ¤Õ)êøÖð[”9P€¼ @’1Uê}ã“ÑO€DºG¼;ü¶I’6 …›–¦z úœ¥•™%[ÄߣÄ€äe Œ¨ÚPµû+£Ÿ ‰Ô7Ÿ~Û$Ië_÷ðwFŸ~òýð[”=P€¼ @’1U[Zó—û0'š¦tözmøm“$­_Ã+о$Þpbø-Êž(@^ É€ª- .Û?ú¹Èà’}Âo›$i=ZôüÒT?‰>#ꟻ(þ%Ï /P€d @Õ–ºÇþ·èç@"Mï±R-{iø}“$­[þïÖÜ‚è{”=P€¼ @’1U[ª–mUÊhýdH¤Æß†ß7IÒºµæ×þ0Ý:{þjø=Êž(@^ É€ªMî¾$úÉHóðefá&á÷M’´vUK_RÊ }>ˆÔŸ)3 6¿IÙ3ÈË Pµ©ÁyK¢Ÿ Éty_ø}“$­]½o|2úllÍ¿}¦!P€¼ @’1U›êò;ÑO€dêÛÏ ¿o’¤µkÍw6Ómxå!á÷h2ÈË PµªE›•¦÷Xô³ ™Îo‰¿q’¤g­Úí—KiFÑ'€`ýÓ?~“¦!P€¼ @’1UÛªo>=úÙÌš¸}ß$IÏÞàÛ;FŸ &@÷Ðß ¿IÓ(@^ É€ªmõWîýlÈfT—οüûð'Iz†nZšG}-˜Õò­ãïÒd —(@2 j[½^ýlHhxùá7N’ôôuy_ô™`4Ý~“¦%P€¼ @’1Ukº-úéͰWª]¶ ¿q’¤§VßrFô•` ¯?!ü&MK y€$cª66¼ü€è§@Bƒ V„ß8IÒ“«vûåRFuô‰`ôÏú‡ð»4-€äe Œ¨ÚX÷˜?Ž~:$Ôô-Õ²—†ß9IÒOœ¿,ú<0!º‡½#ü.MK y€$cª6V-ݲ”ºý|H¨æçÃïœ$é_[¸ii»7ú40 š¦TË¶Š¿MS’(@^ É€ª­Õ·Ÿý|H¨yô‡efñæáwN’ô¼Ò;þCÑg€ 1zà–ð»4M€äe Œ¨ÚZÿì/D?’êŸö7áwN’ô¼2ºçÒè“À„~÷èð»4M€äe Œ¨ÚZçKÿ)úùTóÈÝefñ Âo$MsÝC/ú0Aú+?~›¦)P€¼ @’1Uk[°Qi»7ú Tï”¿Š¿u’4ÅÕ7} ˜ ݃·¿MÓ”(@^ É€ªÍ ¯>"ú ù§€.z~ø­“¤i¬³×(¥EŸ&Ũ.3K¶¿OÓ”(@^ É€ªÍõŽÿpô ±ÞÉŸ ¿u’4 ¯8(ú0AF÷]~›¦-P€¼ @’1U›«–o=ûS `>4Üå§€JÒ˜«vÚ¶”A'ú0A†W~Ÿ¦-P€¼ @’1UÛÝ}Iô3 ±Þ7>~ë$išœ·$ú«€ Ó?õ„ß§iË /P€d @Õöß^ýŒH¬yøŽ2³øá÷N’¦¡jùËJÓ}$ú«€ Ó9ð­á7jÚ2ÈË Pµ½ÎAo‹~F$×_¹Cø½“¤ihpÞÒè¯|&MÝ÷/dd —(@2 j} 7)Mõ“è§@bÍÌêR-Ý2þæIRâªå[—¦÷hôW>ftï•á7j3ÈË Pehxí1ÑO €äúç. ¿w’”¹ÁùË£¿ê˜@ƒU{‡ß¨iÌ /P€d @•¡Þ ‰~J$×ô/ÕNÛ†ßRªÝ_~%i>ꟻ(úk€kú—™E›…ß3ý4P€¼ @’1Õ4Ô9ðÿŒ~jPê;/,3 7 ¿‹’4—uW)£:ú+€«oY~Ïôä @ò2HÆTSÑ‚KóØ¢Ÿ”þ·ÄßEIš£ªÝ~¹4ÕÑ_­´\ÿÌχß4=9P€¼ @’1Õ´4¼üÀèç³?%oÍOË‹¾‹’´Á-~AÝsiô·* tö{cü]Ó“2ÈË PMKÝ£þ0ú¹À¬ffu©vyEøm”¤õnÁFexÍ—£¿NH yô‡³w%ü¶éI€äe Œ¨¦¦E›•¦óPô“€Y£»/™½Má÷Q’Ö£þ¹‹¢¿FHbxå!áwMOÍ /P€d @5Mù)EL’ÁE»†ßFIZ×zǨ”¦‰þ  ‰Þ±ï¿mzj y€$cªiª{Ìû¢ŸüTÓøÞ’ZU÷ß)eØ‹þö ‹zPª¥/ ¿ozj y€$cª©jñæ¥é=ýìà§ÒÙÿMñ7R’ž£jW—fæþèoM©oÿvø}ÓÓg —(@2 š¶†×ýìàIš‡ï,ÕNÛ†ßHIz¦ªå[—Ñ·D]Lÿ›~ãôô€äe Œ¨¦­ÞqŒ~vðõ”™EÏ¿“’ô”–lQê».Žþš ¡Î¾¿çô´€äe Œ¨¦®_TJ&úéÀS ¯:<þNJÒÿÞ¢ç—úûgF=PóÈÝñwNϘ(@^ É€j«o<)úéÀÓêŸù¹ð;)I³-Ú¬Ô7ýµ@RÃËŒ¿uzÆ @ò2HÆTÓXïk~zðôšföNEßJISÞ‚ËðÚc£¿H¬{Ìûâïž1P€¼ @’1Õ4V-ݲ”a7úùÀÓ«û¥{ø;Ã磻)mÁFexÅAÑß„dV÷gÿn&üæé3ÈË PMkõͧG??xFM÷‘ÒÙ÷ á÷RÒô5¸h·è¯@’«o='üÞéÙ3ÈË PMk½“>ýüàY5Ý^ª]^~3%MI 62þ`,úg~.þîéY3ÈË PMkÕ²­fåL²ÑêJµÂŸ×$aü¹jïè¯<¦Dgï×Åß>=k y€$cªi®¾õìè'ÏiôÃËKµtËð»))i 7-Ãk‰þª`JŒ¼5þöé93ÈË PMs½S>ý`­Ôw]\f–l~;%%kÑóËðƯGÅ0Eíÿôœ€äe Œ¨¦¹j§Ÿ+e4Œ~†°Vê›O›kEßOIIZ²E©o='ú« €)Ó=xûø¨çÌ /P€d @5íÕ?8+úÀZ«oYYf¿ ü~JjwÕ²­f²0ŒSóø}efÁÆáwPÏ(@^ É€jÚëô‰ègë¤þÞ7ü$PIë]µû+Ëè¾ë¢¿Ê˜BÃË ¿ƒZ» @ò2HÆTÓÞšŸ~T†½è§ëÄO•´>u|kiÿqôWSª{ä{Âo¡Ö.P€¼ @’1•žWê›N‰~аÎü$PIëR︖2èDu0¥šî#þìÚ¢ @ò2HÆTz^éð‘è§륾íÜR-yqø-•4ÙõWîPJ3ŠþÊ`Š ¿û•ð{¨µÏ /P€d @¥ç•™%[”ÒŸ‰~ް^ê;/,ÕÒ—ÄßSI“×ÂMËðò¢¿¦ ô¾úø»¨µÎ /P€d @¥'^Bôs€õ6úáå¥Z¾uø=•49U+¶)õíçE=@)ƒŽŸZß² @ò2HÆTz¢Þ±ï~ްAF÷]Wª]^~S%Å×9è·JóÈÝÑ_K0«¾é”ðÛ¨uË /P€d @¥mñæ¥é>ý$`ƒ4Ý[:û½1þ®J «wò§J©ûÑ_Gðoz_ÿÂï£Ö-P€¼ @’1•~Úðš/G?IØ`M÷áÒ=ô÷Â瘝ñV-ݲ ¯;.ú+žlT—jÅ6áwRë–(@^ É€J?­{ôE?I˜Ã^éÿáðÛ*i³Ã²è›+é™ëú»þ\ @+õ¾ögáwTëŸ(@^ É€JO_ÿì/D?O˜wõ]ß)Õ.Û…ß]IO®Z¾u^qP)Mý5ënØ-ÕÒ—„ßS­ y€$c*=}Õ®¿à×l0šÇî-ƒÞ~{%=¯Ì,بôNüXiª¢¿`½ ¯?!þ¦jƒ2È5¾² IDATË P陫o;7ú‰ÀxÔýÒÿæß—™‡ß_iZëìÿ¦2ºç²èoØ`½cß~Wµa€äe Œ¨ôÌõNúDô€±ݽªtö|Mø –¦©jÙKË`Õ^~ú<)4½GËÌŽ/ ¿¯Ú° @ò2HÆTz檥/)ePE?S«¦÷Xéü©ð;,¥oÑf³o­yü¾ègsfxõñ7Vœ(@^ É€JÏÞðºã¢Ÿ)„¨o9£T»l~‹¥t-بôŽû`=øƒègs®{äÄßZmp y€$c*={Ý£ÿ(ú™@˜ffuéó¾ð{,e©sðÛK}×w¢Ÿ6Ì‹fæþ2³pÓð{« Ï /P€d @¥çhᦳã˜ö_åY­Ø&þ.K-­³ï¯—ú–•ÑOæÕà²ýÃo®æ&P€¼ @’1•ž»Áª½£Ÿ*„k:–Þ)Ÿ.3 6¿ÍR[ªöxu^ux)£:ú À¼ëòÛá·Ws“(@^ É€JÏ]ç€7G?U˜£{¯*ƒ~+ü>K“\gÏ_-Ã+*e4Œ~²0£Ÿ|¿Ì,Ø(ükn2ÈË Pií­¾!ú¹ÀähFexÍQ~-¼ô3uöûÙ·á'~0múçüÿáwXs—(@^ É€JkךP€¼ @’1•֭ξoˆ~¶ÐNͨÔ7Z:½-üžKOÛÂMžøiŸ×UÊ Š~10ñF«oŒ¿ßš— @ò2HÆTZ÷F÷^ýt ÕÖÜÒÞ‰›ÜEßu©³ÏëËàÂKóø}ÑOZ¥ÿÍ¿ ¿ãšŸ @ò2HÆTZ÷ú§ýMôÓ€FÞZú+w(3;¾(ü¾kú~Å{ïäO•ѽWE?h§Ñ°T»l~Ó5?€äe Œ¨´îUË_VÊ ý| ¦z  Î[RªÝ_~ç•|ôùõ—ú–•³£`ýÕ7Ÿ~Û5€äe Œ¨´~ ¯=&úù@>ͨÔw^4û“g–l~ïÕþªÛ”Þ‰+õM§–R÷£?áFïØ÷‡ßyÍ_ y€$c*­_ÝÃßý| µ¦ûp\¶éðæð»¯vUíþ+¥æçJ}×wfGÅÀÜjfî/3‹ž~ó5€äe Œ¨´ž-ظ4ßý„`*Œî»®ôÏøŸ¥Úéçâÿ  ÉkÁF¥³ßo”þ9_,£{¯Šþ¸@zƒ wŽ¿ÿš× @ò2HÆTZÿúç.Œ~Â0]ê~©¿æì¯ˆ¯v~yøŸWµÓ¶¥÷µ–á5G•æñG2`z4£Ríñêð? h~3ÈË Piý«výÅRFuô3€éÔŒÊèÞ+KÿÜE¥³×kÃÿ\ ynᦥ³ÿ›fÿû^óß»_í1ê[Έÿsæ=P€¼ @’1•6¬úÖ³£Ÿ1°æ×Äÿø»OŒA÷{cøŸ4-ظtö}Cé¯Ü¡Ô7Ÿ^J&ú#”Rº_ù¯ñNмg —(@2 Ò†Õ;îƒÑÏøÍC·—ᕇ”Þ )Õ.Û…ÿyAkÑŽ/*ÝC¯ôÏùâìOkºDŒ€ŸÑ¼úÈ2zà–èO°®êŸ¬>E€äe Œ¨´áU»¿²”Qýœ€ øu¦ÃN,ý³þ¡t{G©–mþç‹¶VíöK¥{ä”þ7ÿ¾ ¯=¶Œ¸¹”fý_1°†×Ÿþç /P€¼ @’1•æ¦úæÓ¢Ÿ30‡š‡ï,õM§–ÁùËKï¸?-}~­Ì,~AøŸ9&¢…›”jW—î‘ïyâ§z^qP©ïº¸4ÝG¢ÿkæI÷ðwÆÿDcË /P€d @¥¹©{ô{£Ÿ30ßFu=xk©o9£ ¾³GéòW¥{ÔÿU:{¿®Ì,Þ<üÏ#sYµ|ëÒÙï¥û•ÿ»ôOÿL\¼g©o>ý‰ŸèY÷£ÿ›ÆhtÿMefÁFá>Ñø2ÈË PiŽZ¸ÉìO ¦WóØÊèîKfüà’}Jÿ[ÿ\z'}¢tþ£ÒÙÿM¥ÚýWJµô%q^Y²E©výÅÒÙ÷ ¥{Ä»KïkVúgüm\¸K^}d©¿f­¾¡4ýÇ£ÿW L5^ÿ{5P€¼ @’1•æ®þ9_Œ~Ò@Œ†¥™Y=ûÓ´F÷^Yê[Ï™ýéšÃëO(Ã+-ƒË¾Tîü¤úg¡ôÏúÇÙß^üäÿùE»ÎþöáÕGÌþg¬ùÏZóŸ9úáå³?±sÍÿ[¥Dÿÿh£A§TË_þw.o y€$c*Í]ÕÎ?o\¤1¼êðð¿oÑø3ÈË Pin[óS·2èðæð¿kQÀßo€¤e Œ¨4·uWô³Ø`õ†ÿ=‹b2ÈË PiŽ[°Q=pKôÓØ Ýcÿ[üß³($P€¼ @’1•æ¾þ™Ÿ‹~Úë­yøŽ2³p“ð¿cQL y€$c*Í}Õ²­JTÑÏ`½ôW~6üïW—(@^ É€JóÓ𚣢Ÿ7À:kº”jé–á·¢À¿×2HË Pi~êìÿ¦èç °ÎßÙ=üïU›(@^ É€Jó×èîUÑO`íêRíñªð¿SQl y€$c*Í_½ã?ýÄÖÚðúãÃÿ>Eñ€äe Œ¨4-Ü´4ÞýÌÖJç ßŠÿû…g —(@2 ÒüÖ?ç‹ÑÏà9~xyøß£h22ÈË Pi~«VlSʰýÔžUï¸? ÿ{MF y€$c*Íë~êϨyôž2³h³ð¿CÑdd —(@2 Òü×ùÒŠ~êϨÿÍ¿ ÿûMN y€$c*§úŽ ¢Ÿ;ÀS4½GKµl«ð¿;Ñäd —(@2 Òxê}õÑÏà)ç/ ÿ{MV y€$c*©…›”æ¡Û£Ÿ<ÀO ªRí´müß›h¢2ÈË Pi|õÏú‡è'ðo«öÿûM^ y€$c*¯jùËJéÏD?{€RêA©veøß—hò2ÈË Pi¼ /?0úÙ”áU‡…ÿ=‰&3P€¼ @’1•Æ[gŸ_+¥i¢Ÿ>0ÍšQéìõÚð¿'Ñdf —(@2 Òø«o9#úéSlxý á?¢ÉÍ /P€d @¥ñ×=ìÑOÿµw'NwÕçaÇ+Ø*6ŠqRC§Žƒ›´ÞÒÚ±Ó,Ž‹q´Ý4Ë84ã$žØÜÚmÌ+Àb3–X-Äb¨Y` ®ŠÙ±#H! ‰÷ž»žs~kOŒ hyïûœû»ŸÏÌ÷?Ðï™9÷MÀøj/~Wø~DÍÍ(@¾€dƨSµáæè猡þe’轈šP€|9ÈŒP)¦îÅŸˆ~þÀêœõ𽈚P€|9ÈŒP)¨Ù{¦jóšèŒ‘jýâw"j|@òå 3@¥¸zW}:zc¤sÞGÂ÷!j~@òå 3@¥ÀŽùÇ©.ž‹À¨žº#µ&fÄïCÔø€äË(@f€J±õ®Ÿ=€1Ð9ÿˆð=ˆF# ùr  RlÅ‚Rêµ¢G±êÉÛüú§v8 ùr  R|ý›¿= €Œu–~(|ÿ¡ÑÉ(@¾€dƨ_qÒ[RªÑãÈP¹nUøîC£•P€|9ÈŒP© î½$zêœóoÂ÷­€äË(@f€Jͨ½äÝÑãÈL¹öúð‡F/ ùr  Rs*»!z$éœýÁð}‡F/ ùr  Rsêœûáè‘d¢|deø®C£™P€|9ÈŒP©YUOÞ=€ ´Oÿõð=‡F3 ùr  R³ê\ð±è±Œ¸òÁåá;n@òå 3@¥†51#UOÝ=€QUשýÕ¿ãÐÈæ _@2ãTj^Ý‹þ0z4#ê‡Ç{Ñ» v@òå 3@¥6±Gªž¹?z<£¦*S{Ñañ» t@òå 3@¥fÖ½ô£Ç0b·¾ÓÐèç _@2ãTjh³÷LÕsG`TôÛ©XxpüNC#ŸP€|9ÈŒP©¹u/ÿ/Ñ#ýïÎ ße(€äË(@f€J nÎ^©ÞòXô˜®n=›ŠyûÆï2”E@òå 3@¥f×]þ©è14\ïªO‡ï0”O@òå 3@¥øÐžˆ@CÕ[Ö¦Öœ½ãwÊ& ùr  Róë]ý·Ñ£h¨îEÿ1|w¡¼r / ™q*@G¿6Õ/>=.€†©6ÜœZ3âwÊ* ùr  ÒhÔ[ydô¸¦sÖo„ï,”_@òå 3@¥úÐm¢GÐåý—Çï+”e@òå 3@¥Ñ©wåßD   ª2µ¾«Pž9È—P€Ì8•F¨9{¥zËÚè±ëß²8~O¡ls / ™q*VÝË>=6€@uw[*ŽSøŽBùæ _@2ãT±fgˆ@ÞÊ#ã÷Ê: ùr  ÒèÕ½øÑ£P=ÿHjýšðÝ„òÎ(@¾€dƨ4‚MÌHÕÆ;£Ç0Í:ËßK(û€äË(@f€J£YçüF`•.ßGhõ¿wlôH¦@wù_…ï4¾9È—P€Ì8•ò©˜÷úTOnŠ+Àn¨ž¼5µ&öß3h|s / ™q*åUïªOG`WUƒÔþê¿ ß/h¼s / ™q*eÖ왩zæþèÑì‚þ ãw û€äË(@f€JùÕ¹ð¢G °“ê­ëR1÷uá{É(@¾€dƨ”gåÚë£Ç °:|,|Ÿ ý0 ùr  RžµOoJu=b€0¸ï›á»éïs / ™q*åÛàž¯GàUÔÝS±ðàð=‚ô÷•\ý, ™q*å[qÒ[Rt£Ç ð z+>¾CþaåÃߊ~ ‰P€Ì´Žÿ™ð…¢¤áÕ¿ñ„è1¼Œê©ÛSköžáûéV®½>úi0$@2Ó:áçÊ’†W1¿TÏGà¥ê*µOÿõðÝôÒÊu«¢_Câ 3Å)o _(Jn½oý·èQ¼Dÿ¦SÃwÒO«zòÖèçÀ8ÈL±è°ð…¢¤!7{fª6­Ž7ÀÿW¿ðx*æ½>~g ý”ªÍk¢ŸCâ 3Å’÷„/% ¿ÎÒß7ÀÕuê|íwÂwÒËU·7G¿†Ä(@fÚç~8|¡(izÜYôÈ€±×¿eqøŽ@zÙfÏÜ~¤ @ž€d¦séŸÄ/%MKÅ ‡¤ÔkE[õ OøÓïjtÅqE?†È(@fºW&|©(iúê]?'zìÀøþé÷¥ ß H¯T{Ñ¡Ñ/€!r ™Þ Ç„/%McÇÌJõ–Ç¢GŒÁmgÄï¤W©³ìðè§À9ÈLÿ¶3Ã—Š’¦·Î×ÿ}ô耱Ro]ŸŠyû†ï¤W«wå_G?†È(@fk® _*JšþÊGVFeÿ6| íHýF?†È(@fÊçׄ/%MíSßžRÙA½Áíg…ï¤mpï¥ÑO€!r ›A/µ&ö_,Jšþú«NŒž@µzÛ†TÌCø@ÚѪwF?†È(@†Z _,JšþŠyû¦zòéèÙê,;<üû_ÚáfÏLiЉ~6 ‘P€ µ—~(~¹()¤îeŸŒA¥ÁKÿû¥©½èÐègÀ9ÈPwåç—‹’‚š˜‘Ê'¾=† ¿?ý¾`ÿøï~i'ê^úŸ£ŸCæ Cý;—…/%ÅÕ^üΔªAô(€í)•ýè±6¸õôðoxiwë߸0ú)0M€dlðøáËFIÍ©ÿD%h¬ê¹‡Skî>áßïÒîVmZýœ˜&@rVRkþ~á GI é˜Y©Ú¼&z2@ó”ýÔ^òžøowi7kùmѯ €iä sKþ(|é(©9u–þnôX€Æé­<2ü›]šŠzß™ˆ~NL# ™ÜwYøÒQR³Ü}~ôh€Æ(º:µ&f„¯KSQõÌ}ÑO €iä wýNjÍ}}øâQRs*Ž{cª‹ç¢§„«·®KÅ‚¿ե©¨}Ú?~RL3 c ó? _>JjVÝKþSôh€Xe?µÏø×áßèÒTÕÿþ—¢_ÓÌ(Àúíè§@ c¢ÚòDš<ʯHúÉ«/ŠQ0=ªAêœùþðoqi*kŸüÖ”ê*úuÀ(ÀiŸûáðe¤¤æUûOR=ùtôˆ€¡ë]û…ðïpiªܺ$úiÄ(À<´"|)©™u.øwÑ# †ª|ø[©5±Gø7¸4•Ç”R¿ý¼â`̧ýjøRRR3Ü}Aôˆ€¡¨·mHű†{KS]ÿ»s£Ÿ€Œ™þK×’’šY±à€T¿¸1zLÀÔ*{©}æû¿»¥©®˜ûºTÏE¿097e?µ¾œ”ÔÌ:ç4zJÀ”ê.ÿ«ðïmiõ®ûbôó ˜P€1Ô[uJørRRsܵ,zLÀ”Üñµðïlió÷Ku{Kô ˜P€qÔïøPI/[1ÿ ©Þº>zRÀn©6Þ™ZÇÌ ÿΖ†Qÿ»ó¢Ÿ à`LõoY¾¤”ÔÜ:ç}$¥ºŽU°KêÖ³©8á翯¥aTwPª»/F?3À(À¸*û©8éו’š[ÿ–¯FO*ØyU™:çþ^øwµ4¬·ŸýÊh c¬ÏEáËJI î˜Y©zæ¾èQ;¥·òsñßÔÒj/~WJuýÌh c®}Ö—–’š[{Ña)õÛÑ£ vÈ`µÿáY71#•O|?ú™Ð @Æ\ùäiò¨ñËKI­·â³Ñ£ ^UµiujÍÝ'ü;ZVÝoþYô3 a€:—ÿEøòRRÃ]â¡«¢G¼¬º½%µO~kü7´4¤ŠcLuë™è§@Ã8 U­çRëØט’š[qü›üGš©®RgÙááßÎÒ0ÜsaôK €°]ÿî ט’š]缤T×Ñã ~LïÛÿ+ü›Yfóˆ~f4”P~¤}ÞáËLIͮөѣ ~dpײðoei˜ Hõ¶ ÑO €†r ÀT[7¤Ö¼}ך’ÜѯMÕ¦ÕÑã R¹nUjýšøoeiˆ î¿,ú©Ð`@ø1ýÕ—„/5%5»ö¢CSê·£Çc¬~áñTwPø7²4̺Ë?ýÔh8 ü„Î¥¾Ü”ÔìzW}:zT0¦êî¶Ô^tXø·±4ÌÚ§¾=¥~ýÜh8 ü„ª;™Š“ß¾ä”Ôà&f¤òÁåÑã €qS•©sþGã¿‹¥!VÌ}]ªž¹/úµ0€ðS•ëoN“³÷ _vJjnÅqoLõ‹£Çc¤·â3áßÃÒP›˜‘÷_ýÔ@xYý[–Ä/<%5ºÎÙ¿™R5ˆWŒÁíg‡KîwÝßE?5FˆP^Qçò¿_zJjv½k¿=ªÈ\ùèu©5{fø7°4Ì:ç‘RUF?7FˆP^YÙOí3ß¾ü”ÔŠ•,ÙñIDATà&f¤òþË£§™ªž{( öÿþ•†X{ñ;SÝ›Œ~nŒ ¼ªjÛÆÔ:áç— ’š[1¿ToY=®ÈLÝޜڧüRøw¯4ÌŠ!Õ“OG?7FPvH¹éþÔš¿_ø2TR³©" :Ñã €\ :©söÿw¥aV,8 UÏ>ýÚQ@ØaƒÇ¾—&ç쾕ÔܺË?=ªÈA]¥îÅÿΕ†Y1oßTm¸%úµ0€°Sú«/I“{„/G%5·Á]çE*F\oÅgÿo¥¡6wŸT>qcôS`Ä9`§õï\–&š¿$•ÔÌŽ™•ªwE*FTÿÆ…ñß¶Ò0›³w*þVôS @Ø%ýÛÏI“Ñ‹RI­}Ê/¥º»-zT0b«/J-}F¹ÿòçšk£Ÿ™p À.ëýßSJzÙº"zL0Bʵ×oÿeÄèïYiX öOÕúD?52â€Ý2¸í ^ÒËÖ¿éÔè1À¨6Ý›Šùû…ÇJê8þM©ÚxWôS 3@Ømý»/L“³g†/Q%5°9{ûe ^Q½u]*¾9þVRíS%U›~jdÈ(SbðÀò4yô¬ðeª¤æUœpHª[ÏD)¨noIíE‡†»JêsÎomÿwÃà€)S®¿%µŽ{SøRURójŸù¾”Ýè1@“”½ÔùÚJê{ÙŸoÿwÃâ€)Umy<§úÕI?Y÷Šÿ=¢hŠªLÝ‹þ0ü[UJsöJý›¾ýÊ@˜rugkjŸûáøE«¤ÆÕÿÁ¢è@´ºNÝÿý—áߨÒ0*¾9•ëVE¿2Æ„P†£ªR÷;iò¨áKWI jöÌT®ýNô„ Poåçâ¿O¥!ÔùÚo§zrSô`Œ8`¨­H­ùû‡/_%5§bÁ©Ú¼&z< ÿݹáߥҔ7g¯Ô»~NJUýÄ3@ºjËã©8ý_Å/b%5¦ö¢ÃRÝ}1z<0ú7þ=*MuíE‡¦jãÑÏ €1å€éQRï†cÒäÄžáKYIͨsÁÇRª«èéÀ4ܹ4µ&f„‹JSÖì=Soå‘)õÛÑÏ €1æ€iU®¿%'¿5~A+©õ®ûbôX`È÷}sû±\ô7¨4Uµ¿3UOÝý´À(zEê^óy¿*iû¯¿ V_=•’rÍ5©5gïøïOi *æ¾.õW˜R5ˆ~Z°P”ïIÅ’÷†/n%w̬T=ykôH`ŠUëoÚ~0þÝ)ín3R÷â§zëºèg?Æ(±ª2õ~pZj-8 ~‘+)¬â„CR=¹)z"0Eª§îHÅü7„oJ»[çìnÿ÷ Mä€F¨ŠÍ©{õgÒäì™áK]I1uÎ|Jƒnô8`7UÏ>˜ŠãÞþ)íNí%ïNåCWG?'xE@h”òÙ‡Rû‚ßO“ XòJšþº—üQJu=ŠØEÕæ5©XøæðïKiWk/~g*¼Ò~€‘à€Fªžº=µÏ;"|á+iúë]û…èÀ.¨6?šŠ…‡WJ»Rgé‡RùÈJ‡ŸŒ 4Z¹áÖ퇠~T¯ú·,Ž?ììñç ‡„OJ;ÕѯIÝË>™ª§ï‰~B°K€0ÊçפîÕ›&ž¿–4üfï™Ê®ˆ=ì€ú…'RqÒ[â¿%¥¬}ꯤþ÷Ouë™èç»Å(#¥š|6õn˜—Z'ü|ø¢XÒ›»Oªž¼5zìð ê-¥âD{5¿âØSwù§RµáæègSÆ(£©ªÒàñS犿L“G¿6|,ixÿq¦Ú¼&zâðSÔ[×ùåO5ºbÁþ©ûÍ?KåƒW¦Tö£Ÿ L9 Œ¼ªõ|ÜvFjŸóÛirbðŲ¤©­ýå_Nu{sô¨à¥öýÄ_ÿf”~¬‰=R{É»Sïº/¦ò‰SªÑO†Ê(Ùý‰øþ-KR{éïùeP)£:g} ¥A'zÄà—?Õ¤fÏLíÅïJ½ŸIƒÕ§ºõlôó€iå€|õÚiðÈÊÔ]ñÙTœúöø…´¤Ýª{ñ'Rª«èÉ0Öê­ëSqÒ/†#j ;fÖöcÏîežú«NJåc7¤ÔkE? 倱QµžKƒ–§î5ŸOí3#M=+~q-i§ê]óߣG Àت·mHí“ÿYø·¡2lÎÞ©øÒϦöiïH³3u/ýãÔ»îïÒà¶3Sùè·SµyMJ¥?ç/å€ñU•©|î‘Ô¿÷©ûÙ©óõÿŠÓ~5µæí¿ô–ô²õo>-zzŒí¯VOÝ.í^Oß“ê-kSµùÑTMnJUg[ô?mH£êÿœ1 ¯H•‚ƒIEND®B`‚‰PNG  IHDRHHUí³G pHYsèèµ{RkIDATxœíÜylTEðE„z%FLÔñHT4@#ÑcAñŒú‡Š ‰¡ôZ–˶´ ¶¥ˆ,*(Ó *%$"‡X  ”–¾û˜¯™GÒ”ºÝ}o÷÷€÷›LÚ¤ÛyŸÝ7ofÞJH$l¤ðN$! O@޳i”¢±³“!g ï§Œ€y° ñ§« Jþ¨0Ç¢d'C-³yµkÂ#ñ_´ÊiS¤ˆÅÜ¿ñçL”ÌÛ=[ߢmšî>‡d6{éƒxŒýûvÈ©£B2­¤,ñzÅÄsŒ3£RK&@’3†„}²ð!0­qÛ€ºüYÿHóïƒöéƒá´ÕC„8ç@Nä H™{wx swDŠñÓ§t@ê7–‘ÂÔ(9wÒY‡Ê!bÌ}ócrß=ŽhC™|öÑ-0ä虳.Vk%˜òw°õjžÇFýñÆdžÕXmŋӒB7,u ôu“à\8\_´íó€Ò’ÀºÏ‘7Êik€ºô)ïäì[`\ bŸØ=Z<.)Ñ ùSÀj(Ž©n¦wÁ>UsßšHßøžX@JÞ¤@FÍ,±€äÙCI¬Æ‚¥H€!_ó«f9ž€œs-d@LùG< ëðPFÉ)Y›I ¤•O H¯œF düœ"ºø R «µR, >iÎôËd@ÎÅc‚ñYÅ“{É€À˜;Ï$¹!ñ´Ç bñ oÊÛ¾ H]ô)uä±€øzS/’ñ…þœâñŽúPF-%_‘ Œ¾ù±€´ò·H¬ƒßßø ¹÷{RæÞC Ä.¼îW_æ0wÎܨšá^ ³îv·ßõ Ä ë8AŠÄg,¯ HúM¾ùCwLjs¾ÕÀþçEô dµ¬%Ò+ß #- ê’'¡oš«¾ÎÙfÀ±<µÏ7Q5ƒÈjYCÿQÉNv7\ñM_öÉ=`FwL»Þ|©…cÈ·¿ñ·;%±ýËÀ6[D’Ó“ÎQóh+_&¢¼n´ïò ”Â÷ íe¬¦•¤@”Ú¾]€' cç×  ŸkŠiÇYï’1„tîÊØ•æH-|ž¬= ©úŒH[ûv ó瞀d>ÃØÝNÚÖõ—»‹5& Ôä÷‘øI÷.Vc ¨cÖåÅdlý˜~³iŸ:<iÄ×eWZÄ ¯ŸÝG‹·Ç6I›c(ˆHNì®’’DZ`lýÄû\Ñì¡W¶)³+÷“RF[õj @)Ì_— ¨ðE¾É›¿¡êV sϦìòÙ@êg]m!°¾€Tâý‹!ªv¸Á­ßÖ»cûÔ>°ÎÓ×Ûßâ¦/ ™z9èF‰¥¹S;$@Úê×ñºÌ7ÌÇg!Jøb‚’uG Œ›ýb‹Ç‡œlŠÇè?¾þxsGBR–>í HæǦRÄ{¬Ö‘OLe!™õ…¾”œ»À.ŸA¼†]:%{DÄîÄ:¶ÿ¸hÞñ¤uoØ·ð/WEÂ1j³z}û c0›½|ûËð«Š^=qÛ„V1ò‚C%ÿQhë&Á:±§ç_ß!  IEH(B@Ÿ†ýƒ$mŽ©IEND®B`‚‰PNG  IHDR ÚX¾V§ pHYsèèµ{Rk IDATxœìÝi¸eu}çíT‚j#¶±>Î5Æ¡3h;¤M÷£‰±M¢Iû$fè´f¶»¯ÄNg85PE1IQ@2©2((ƒD”y”Y (±ö¼÷Z¿çªcb;묪sÎo¯½ïûº>/“²ÖÚ{ýù²ÏO°0†ýÝsm ®ùLôÎúht>ýÎh¯{y´Vì­ú)©™-B ¯;>ûîh´áµÇFkfiþ;ž¤fµb×h¯{EtŽy×ìyãàšcctïu³çÀÂù©üÿ S¥ØtG ®=.z§ÿE´×ÿüì 1ýð]šÏV>)F7)ûV˜Ã«ŽŽÖÌ’üw=IÍoùgÏ#{§ÿe ®ýl›6d?â`¢ÚÀv*ZÌ\w?ÿûÑÚ÷ßå¨K X{õÓctÇEÙ·ÀD~ýãÆ¶’¦ýžÝ“ÿ ×EûÁìÇ4š¡-Ô0ºï†èŸ·g´?ñ‹ÑZ¶Sþ¹´µ÷~v¯Ê¾ý&Òà²uéï}’&¼e;Eûð_Žþù«ctÿMÙ=hC[¨P<|{ô/=0:‡¿)ÿP\ZäÚûþtßûföm0Ñ—®Mÿ“4=µzeôÎY£ûoÎ~ü@#ÚÀ£é=ƒoùý_®ƒÃo)£Îº—G¹yCöÝ0ç¯J”4}mûqÁUŸŠè·²ƒ0¶ mà‡Œ6^ÝS?­=Ÿ–~È-eÖYÿÚ([÷eß’S¥Î?¥¿JšÒVí½Óÿ"F÷\›ý(€±ch EÃ[¾Ïüzþ¶4u{C”í³ïL€©Ôÿêß§¿Jšî¶ýÊíð¦ÓfÏMC[¦Ù°ƒ¯íu/O?¼–Æ¥îo޲»9ûî˜jý3ÿGúû¡$µ~u ®úTİŸýX€T†¶LŸa?×|:Ú¼(ý°Z§ºG½5ÊÞÖì;€²Œþé‘þž(I³íÿü|ý£aöÓRÚ0=ŠQ ®>&Ú¼8ÿpZ³ºÇ¼+bÐɾKøWe½/ü·ô÷EIú×Ú½2ן4û|€ibh ÀT~÷üh¯múa´4Žu}wİ›}›ðãÊ"z'ýnú{£$ýpíÃÞÃ;.É~BÀ¢1´`¢›ïŒîç?Z3KÒ ¥q¬wâïDŒÙ·*e4ˆî1ïL”¤ifItOx_›îÈ~JÀ‚3´`2 {Ñ?wE´Vìšè,i½“ÿ ¢eß­T(ûDç¿þ)I?^{ÕÓ¢ÉÚˆÑ0ûQ ÆÐ€‰3ÚxU´}]ú!³4Îõ>÷#[€)ÛFçàŸMŸ”¤G«½þçct÷•ÙJX†¶LŽÞ#ÑûÒG¢5³4ý`Yçz_øãˆ²È¾c¨©ÜrW´÷~ú{¥$=jËŸ½s–Íþµ1˜$†¶L„Ñ]_ö/Ë?L–ƼÞþ›‘-@ƒÝí}þmúû¥$=VíC_£ûoÎ~\À¼1´ ÙŠ"ú—8ûk ÙÈÒ¸gd 0Š{¯öêg¤¿gJÒc¶òI³ç¶0 mh¬bËÝÑ9ò­ù‡ÆRêú!#[€ 2ºíÜh­Ø%ý}S’¯îñ¿Ewsö#vˆ¡-4¼ý¢híóœôƒb© õ¾øßl&ÐèÆS£µlçô÷NIz¼Úk_£ï}3û‘ ÛÍЀÆé_º.ZËŸ~@,5¡ÞiQ–Ù·- dxå‘ÑšY’þþ)IW{ÕÓbø­S²™°] mhŽA7ºŸÿýôCa©)õ¾ðÇ~É` .Ü;ýT’*›Y½sf" çU4‹¡-P´ŠÎQoË? –RïÄ÷G£ì[€EÒ?ëoÓßE%i.uOx_Ä “ýØ€93´`ìÝíu/O?–š5²fߺ,¦²ŒÞç/ýT’æRçè_‰²»)ûÉ sbh ÀXÝýh­Ù#ýàWjJÝϾ7b4ȾuÈ0ìE÷è·§¿›JÒ\jüª(¶Üýä€J†¶Œ­áGkÕné¾RSê~ú?ÏþKU¦WÙÛC^“þŽ*IsjÿÌþE3g†¶Œ¥áwÏÖžOÍ?è•R÷S¿1ìfߺŒrÓíÑÞç9é朗4§öû™=øìG'<&C[ÆÎðæ/EkÅ®ù¼RCêõ¶ˆA;ûÖ`Œw#Z{>%ýU’æÔ>?Å7e?:àQÚ0V†·žmd+Õ¨ó‰_ˆ²·5ûÖ` ¾}f´–íœþî*IsjßçFñÐmÙNø †¶ŒÑ†K£µÒ/­Hs­sÈk¢l?˜}ë0Ɔß8<ýýU’æZû€E±ecö£~„¡-ca´ñêh­~FúA®Ô”:k_åÖ{²o] Öߦ¿ÇJÒ\küª(Zd?:à mH7zàÛÑÚk÷ô\©)µ÷~”›7dߺ4EYDïÄ÷§¿ÏJÒ\ëþ¦ˆA'ûé ³ mHµí— Ú¾4ýàVjJí½÷ˆâþ³o]šfØîoN¯•¤¹Ö=á}E‘ýôC[ :³¿L}`+5¥öê§G±ñªì;€†*ÛFgÝËÓßo%i®õΙÉ~t€¡-IŠ"º'þNúA­Ô”Ú{>5Š;¿–}çÐpÅC·Ìþµ”ì÷\IšS3KbpͱÙN¦œ¡-)úî“H+5¥»Äè¶s²o[&DqçeÑZù¤ü÷]IšK+Ÿ£{®Í~t0Å mXtÃ[ωֲóh¥&4³4†ßü\öm À„Ùö®¹í—"Óß{%iµxqMÙN¦”¡-‹ªØ´!Zkž•~0+5¥Áeeß¶L¨þWÿ>ý½W’æZçØwGEö£€)dh Àâö£ýñ_H?•šÒ༕Ùw-“¬,¢{Ü{Òß%i®õ/Y›ýä` Ú°hz_ý‡ôƒX©)õOÿóì[€)Pö‰Î!¯I–¤9µb—Ý{]ö£€)ch À¢Þ~Q´–í”+5 îñ¿QŒ²o[¦D¹éöhï½Gúû°$Í¥öú×F {ÙN¦ˆ¡- ®èlŠÖþ/H?€•šP÷“ÿÑ¿(`Ñî¸8ZËŸ˜þ^,Is©÷•¿Ë~l0E mXpÝSþ(ýàUjB¿1ÊÞÖì[€)5üÆáéïÆ’4§–í£»®È~l0% mXPÃÛÎÖÌ’üƒWiÌkð¢(ù^ö- À”ëŸñWéïÈ’4—:ë.bØÏ~l0 mX8ýÖìx0ûÀU÷ÚkžÅßξc ¢E÷˜w¥¿+KÒ\ê_ü±ì§&SÀЀÓûòÿJ?h•ƾ•OŠÑ†K³oWø²ópt|iþ;³$UµòÉQ÷ˆ²Ì¾[`Nz'0ý]Z’ª\w|ö〠eh À¼ê_²6ý@U纟|GĨŸ}«Àœ•ýG¢sð«Òß©%éñê¬}qÄhýÈ`Ú0zDkïg§¨JãZç WFÙy8ûN€ÚŠ¿íÕOO·–¤Çkpõ§³—L C[æMÿ‚5é©Ò¸Ö^ó¬(º%û6€í6ºé´hÍ,IÇ–¤Çª³ö%~Õ€ygh À¼(z[£µæYé©ÒX¶b×(î¼,û6€ÖÿÊÿÎÏ–¤ÇipÍg²•LC[æEÿüÕé¨ÒX6³$†ß<)û€ùQ £{ô¯ä¿oKÒcÔ9è•E‘ý´`‚Ú°ãÝhíóœôTi\°Wö óªlÝíýž—þÎ-IÕð;_Î~T0A mØaƒo™~p*c½Sþ(ûö€QÜuy´Vì’þî-IV÷˜we?&˜ †¶ì˜¢ˆöA?›~p*[Ý£Þ1ìeß¡°`Wšþþ-IÚÌ’Ýwcöc€ ah À~ûŸóM¥1«³îeQvξ=`ÁõNþ`ú{¸$=Zý3þ*û À„0´`‡tŽ{Oú©4NµWíÅ}ßʾ5`q »Ñ9ìõéïã’ôãµ÷zfÄ “ý”`Ú°ÝŠ­÷DkùÒL¥±iÙN1úö™Ù·&,ªrÓíÑ^³{þ{¹$ýXƒëOÊ~D0 mØnýóW¥”JãÔàòC²oKH1ºùŒhÍ,M7—¤®{ì¯g?˜†¶lŸ²ˆÖÇþŸôƒRi\êö§Ùw%¤êõÿ¤¿ŸKÒ´lç(¶lÌ~<Ðp†¶l—áwÏÏ?$•Ƥî‘o‰õ³oKÈU £{Ä›ÓßÓ%é‡\vPöÓ€†3´`»ôNû³ôRijðÂ([÷gß’0ÊÍwF{Íîéïë’ô¯u~{ö£€†3´ ¾b­½Ÿ~@*e×^õ´(¾÷Íì;ÆÊèæ3¢5³$ý½]’f[¶SÜ—ýh Á m¨mxëÙù‡£Rv3Kctó—²oGKý3þ*ÿÝ]’þ¥áUGg?h0C[jëžúáôƒQ)»Á«³oE_Ã^t}]úû»$m«{Üod?h0C[jkí÷3é£RfÝϾ7¢,³oEkÅC·D{Õnéïñ’Ô^õ´ˆa?û±@CÚPËèÞëÒE¥Ì:½"ÊÞ–ì[axý‰éïò’´­Ñ†K³‰4”¡-µô/Ü'ý@Tʪ½×3g˜»Þ)”þN/Iƒó÷Ì~ÐP†¶ÔÒ9êmé¢RJ3Kcôí3³oAhž~+:½2ÿÝ^ÒT×=êmÙOCÊЀ¹ë·£µü‰é¢RFƒ ÷ξ ±Š{¯‹ÖŠ]Óßï%Mq+v‰ö²‡4¡-s6üîù‡¡RB½ã+¢,³oAh´Á‡¥¿ãKšîŠWf? h C[æ¬ÁšôƒPi±ëòêÙ?q ì¸Þ ïK×—4½mü@]†¶ÌYç3¿–~*-fíUO‹âþ³o=˜ewS´xaú;¿¤é¬÷…?Î~ Ð@†¶ÌMQDk¯“~*-Z3KbxÃ)ÙwLœâÎË¢µl§üwISWç×d?h C[æ¤xèÖôCPi1ëŸõÑìÛ&VÿœJ÷—4…-BÄhý a m˜“á _È?•©îÑo(†Ù·L®bOübú€¤é«xð;ÙO@ÆÐ€9韻"ýTZŒÚû<'Ê­³o9˜xÅC·D{ϧ¦ŸHš®F7Ÿ‘ýø a m˜“îñ¿~*-xËvŽÑeßn05—¯Ï?4U .Þ?ûÑ@ÃÚ0'íu/O?•ºÁ¥fßj0]Ê2ºÇ¼3ýL@ÒôÔ;õCÙO>ÆÐ€jÅ(Z+vI?•²Þ‰ïϾÓ`*•[7F{Íîég’¦£î1ïÊ~ìÐ0†¶T*·Ü~ø)-dµ/޲»9ûV€©5ºñ‹éç’¦£Îú×f?òhC[* o¿(ýðSZ°VìÅÆ«²o3˜z½Sþ0ÿœ@ÒÄ×Þ{ìÇ ch @¥ÁÕǤ~J ÕàŠC³o1`Û_Uê?µ/I?+4áÍ,‰õ³y4ˆ¡-•úç¯Î?ü” Þ‰ïϾ½€2ºýÂhÍ,M?34Ù•[îÊ~ÜÐ †¶Tê}é#éŸÒ|×Yûâ(»›³o/àÇô¿ò¿ÓÏ $MvÅý7f?êhC[*u?÷ÿ¥|JóÚŠ]¢Øxeö­<šÑ :cþù¤‰­¸ûëÙO:ÄЀJcþßôƒOi>\¾>û¶Gqß ÑZù¤ô3I“Ùè¶s³s4ˆ¡-•Ú‡ùMN½Þ—}Ks0¸äcéç’&³ÑM§e?âhC[*µxqúÁ§4µ?ö‚(»›²o)`.ŠQtÿåôóI“×ðú²Ÿp4ˆ¡-•Zûþ»ôƒOi‡[¶sŒ6\’};5Ü­•OÊ?W4Q ¯?1ûñ@ƒÚP©µfôƒOiGœ¿gö­l‡ÁEû¤Ÿ+Hš¬†ß<)ûÑ@ƒÚP©µêééŸÒŽÔ=ò-³nh bÿûôóI““¡-uÚP©µòÉéŸÒöÖÞë™QnÞ}; ¸ÿÆh­Ø5ýœAÒd4üæç²k4ˆ¡-•ZËŸ~ð)mo£¿˜} ó`pþžéç ’&#C[ê0´ ’¡­šZÿô¿È¾}€ùR £sØÒÏ$5?C[ê0´ ’¡­šXçWG :Ù·0Š{®qV%i‡3´ C[*ù—j\+v‰âÞë²o`ôÏ™É?{Ôè m¨ÃЀJ†¶jZƒKȾm€…2êGçפŸ?Hjn†¶Ôah @%C[5©îQo(‹ìÛX@Å=W;³’´ÝÚP‡¡-•üK 5¥öêgD¹yCö-,‚þWÿOúY„¤ffh @†¶T2´US^Böí,–a/:¿*ýÿûÙ· °ÈŠ».Ö²ÒÏ%$5+C[ê0´ ’¡­Æ½öþϲ»)ûVôÏüHúÙ„¤feh @†¶T2´ÕX7³4Fß=/û6’”½­ÑÞïyùg’“¡-uÚPÉÐVã\ÿË“}‹É†7œ’~F!©9ÚP‡¡-• m5®uzEÄ “}‹c {Ü{ÒÏ*$5#C[ê0´ ’¡­Æ²e;Gq×Ù·0&ÊÍ¢½çSóÏ,$}†¶Ôah @%C[cýsf²o `Ì .Þ/ýÌBÒøgh @†¶T2´Õ¸ÕYÿÚˆQ?ûÖÆM1ŒÎ¡¯K?»4ÞÚP‡¡-• m5V-b÷^—}[cª¸ûëÑšYš†!il3´ C[*Újœ\°Wö-Œ¹þéž~†!i|3´ C[*Új\êöúˆÑ û–Æ\ÙÛí}Ÿ›~–!i<3´ C[*Új,Z±k÷ߘ}; 1¼þÄüó Ic™¡-uÚPÉÐVãÐà¢}³o aºÇþzú™†¤ñËЀ: m¨dh«ì:‡þ|Äh}+ Snº#Z{>%ýlCÒxeh @†¶T2´UjËvŽâž«³o ¡ì•¾!i¬2´ C[*Ú*³þ¹Ë³o ÉŠatÖ¿6ýŒCÒødh @†¶T2´UVC^1êgß@Ãn¿0Z3KÒÏ:$G†¶Ôah @%C[¥4³4F.;ü€ ÑûÜòÏ;$E†¶Ôah @%C[eÔ?ë£Ù—>0AÊ-wG{ϧ¦ŸyHÊÏЀ: m¨dh«Å®sàK#ìK˜0ƒ öJ?÷”Ÿ¡-uÚPÉÐV‹ÚÌ’Ý~AöeL¢a/:k_’þ!)5C[ê0´ ’¡­³Þiš}ÉltÓééç’r3´ C[*Új±jïóœ(;g_òÀ„ë~æ×ÒÏA$åeh @†¶T2´Õb5¼á”ì˘ÅC·DkÅ.ég!’r2´ C[*Új1êûîìK˜"ý³>š~")'C[ê0´ ’¡­ºöªÝ¢Ürwö¥L‘²·5Úû>7ý\DÒâgh @†¶T2´ÕB7üÆáÙ—90…†×|&ý\DÒâgh @†¶T2´ÕBÖ=ê­e™}™Ó¨,£{ä[ÒÏG$-n†¶Ôah @%C[-X+v‰âþ³/q`Š÷\­e;埓HZ´ m¨ÃЀJ†¶Z¨¬Î¾¼¢wê‡ÓÏI$-^†¶Ôah @%C[-Du/‹ö²/o€(;E{Íîéç%’'C[ê0´ ’¡­¢Ñmçf_Ú?0øÚÁéç%’'C[ê0´ ’¡­æ»Þç/û²øQÅ(:¿*ýÜDÒÂgh @†¶T2´Õ|Ö^µ[”[7f_Ö?atÓiég'’>C[ê0´ ’¡­æ³m†`\u?ùŽôóI ›¡-uÚPÉÐVóUç×DÃìKà1÷\­™¥éç(’.C[ê0´ ’¡­æ¥™¥QÜyYöå P©÷ùßË?K‘´`ÚP‡¡-• m5õNýpö¥ 0'å–»¢µòÉéç)’&C[ê0´ ’¡­v´öšÝ£l?})ÌYÿ+—~¦"ia2´ C[*ÚjG~ãˆìË –²»9Úkž•~®"iþ3´ C[*ÚjGêúºˆb”}Ô6¸ì ô³IóŸ¡-uÚPÉÐV;Òèö ³/a€í3DgÝËÒÏW$Ío†¶Ôah @%C[mo½Ï} ûòØ!ÃNI?c‘4¿ÚP‡¡-• mµ]­|R”›îȾ|vX÷ȷ䟵Hš· m¨ÃЀJ†¶Úžç­Ì¾tæEq×ÑšY’~Þ"i~2´ C[*Úªníý&bÐξtæMï¤ßM?s‘4?ÚP‡¡-• mU7ÕÀ¤)þn´Vì’~î"iÇs~ @†¶T2´UºG½5¢,³/[€y×ÿòߤŸ½HÚñ m¨ÃЀJ†¶šs3K£¸çêìK`A”í£½úéùg0’v(C[ê0´ ’¡­æZï”?ʾ\Ôà¼ég0’v,C[ê0´ ’¡­æÔÊ'E¹yCöå ° Êþ#ÑÞûÙùg1’¶;C[ê0´ ’¡­æRÿìȾTÅàâýÓÏb$m†¶Ôah @%C[UÕÞ{(»›³/U€Å1ìF{¿ç¥ŸÉHÚ¾ m¨ÃЀJ†¶ªjpùúìË`Q ®8,ýLFÒöeh @†¶T2´ÕãÕYûâˆQ?û2X\£Áì¹HöÙŒ¤úÚP‡¡-• mõx o8%ûH1¼æ˜ô³Iõ3´ C[*Úê±êþKe™}‰ä(‹è¬ÿ¹ô3Iõ2´ C[*Úê±m¸$ûòHµí¯ýdŸÑHª—¡-uÚPÉÐVV÷³ï;4ò•et>þÆô³IsÏЀ: m¨dh«Ÿhfi÷^›}iŒ…Ñ-gåŸ×Hšs†¶Ôah @%C[ýx½“?˜}YŒ•îÑoO?³‘4· m¨ÃЀJ†¶ú‘–?!Їn;,ÆÊhÃ%ùç6’攡-uÚPÉÐV?\ÿô?Ͼ$ÆR÷˜w¥ŸÝHªÎЀ: m¨dh«´b×(·Ü•}IŒ¥âÞë¢5³4ÿ GÒãfh @†¶T2´Õ¿Öÿòßd_Žc­wÂo§ŸáHzü m¨ÃЀJ†¶ÚV{ϧFÙº/ûrkŽ×FkfIúYޤÇÎЀ: m¨dh«m¨«Ž IDATõÏ]ž})4B÷¸÷¤ŸåHzì m¨ÃЀJ†¶j¯Ù=ÊÞ–ìK Š»¿‘~ž#é±3´ C[*ÚjpÁêìË QºÇ¼+ýLGÒ£gh @†¶T2´îÚ«ŸewSöeÐ(Å_K?בôèÚP‡¡-• m§»Áy+³/A€Fê~êWÓÏv$ýd†¶Ôah @%CÛé­½úéQvξi´áÒôóI?™¡-uÚPÉÐvz럻<ûòh´îÑoO?ã‘ô£ÚP‡¡-• m§³öªÝ¢ì<”}ù4Úè¶sÓÏy$ýh†¶Ôah @%CÛé¬Î?e_z¡{ä[ÒÏz$ýß m¨ÃЀJ†¶ÓW{ϧFÙº?ûÒ˜£[ÎJ?ï‘ô3´ C[*ÚN_ý¯þ}öe0Q:G¼)ýÌGÒ÷3´ C[*ÚNY+Ÿeë¾ìË`¢Œn>#ÿÜGÒl†¶Ôah @%CÛéªÿ¥¿Î¾ä&RçãoL?û‘dh @=†¶T2´¢–íå¦Û³/9€‰4ºá ùç?’ m¨ÅЀJ†¶ÓSïäf_n“«,£³þçÒÏ€¤iÏЀ: m¨dh;%Í,‰â{×g_nmxý‰ùç@Ò”gh @†¶T2´ŽºÇ¾;ûR˜|Å(:k_’~$Ms†¶Ôah @%CÛéhtÇÅÙ—ÀT\¾>ý,Hšæ m¨ÃЀJ†¶“_çð_ʾ̦ǰí}þmú™4­ÚP‡¡-• m'¿ÑÍgd_fSepÞŠô3!iZ3´ C[*ÚNvƒ_Q–Ù—ÀT)ÛFkϧ¤Ÿ IÓ˜¡-uÚPÉÐv²^yTö%0oÊÎÃ?À8ëé¯Óφ¤iÌЀ: m¨dh;¹µ÷Þ#bØÍ¾Ä€iTŒ¢Üº1Š»¿£›N‹áÕŸŽÁ׎Áù«¢ÖG£wꇣwâïD÷˜wFçˆ7EçWG{ÿçG{¯gÎÖZùä¹ï™Yúýÿ»½÷ˆö/ŠÎA¯ˆÎaoˆîoŽî§~5ºÇÿfôNû³èŸ3ƒËŠáuÇÇè¶s£øÞõQ>roD1Ìþ_ ˜På¦Û£µlçô3"iÚ2´ C[*ÚNnÛÆ$ó®ßŠâÞëbtó—f=pÞŠèö§Ñ=î7f®í}:ZËvJÿ.T§öšÝ£³þµ³£ÜþYƒ+‹Ñ-_‰â¡["FƒìÿÅ€ë}îéßu¤iËЀ: m¨dh;¡­Øåû¿Ð°=íÙ1íð['Çà¢}¢÷Å?‰îQo‹ö¾ÏÍÿž³Ø-Û)Ú¼0ºŸ|Çì xv„»áÒ({[³ÿ) PÜsMþ÷iÊ2´ C[*ÚNf½“ÿ ûÒ ì<£ïžƒËÖEïÔE÷è_‰ö~ÏKÿ.Óˆf–FgíK¢wÂûbpÁêÝ|F”›ïÌþG Œ¡î§ÿsþwiŠ2´ C[*ÚNfÛ~-àÊ2ʇo‹á §Dÿœ™è÷žhìéßY&±öšÝ£{ÜoÄàâý£¸ëòˆb˜ýOH6ºõìôï(Ò4eh @†¶T2´¼ºG¿=û²2£(î½.†Wý3þ2ºGþ‡h¯Ú-ý;ÊÔ¶çS¢ûÉwÄà¼1úîyƒvö$èöúüï%Ò”dh @†¶T2´¼F7žš}Y‹¨l?£›ÏˆþÙÿÝOþÇh¯zZú÷=NËŸ#Þƒ Vû+0E†×Ÿ˜ÿ=Dš’ m¨ÃЀJ†¶“UgíK"Ê"û²P¹uc ¯ûlôNýPtÖ½<ýû‡v¬ö~ϋީŽÑM§ûµ[˜dÅ(Ú¼(ý»‡4 ÚP‡¡-• m'«Áeë²/)`ž•|/†×÷ýaí/Mÿ¾¡lÅ®Ñ=æ]1¸âÐ(·Ü•}éólpùúüïÒdh @†¶T2´ V>9ÊÎÃÙ—°£Ša¯Œþ¹Ë£sØ¢5³$ÿ{†¿™¥Ñ=âͳÿ!UÙº?ûªæÃ í½÷Èÿž!Mx†¶Ôah @%CÛÉiÛ¯ÜÍTnÞ0û gÝÏüZ´ö|Jú÷ Y+v‰îgÿK ¿yRÄ “}¹;`pÞŠüïÒ„gh @†¶T2´œŠ{¯Í¾œ€¹*ËùÕÚeÑ9ôuéß#Ԝګv‹ÞÉ£[Ïž½Ž€f)[÷ÍþG4Ùß)¤IÎЀ: m¨dh;mû³ÂÀ˜+‹Ý~AôÏøËhï÷¼ôïj~_ƒK>eç¡ì«¨¡wʦ&9C[ê0´ ’¡íd4¼îøìK x¬qíGÿÌD{ßç¦gЄ¶b—èøþïÿÊ-0öŠ{®Îÿþ Mp†¶Ôah @%CÛæ×ÞûÙ£~ö¥üâ®Ë£Æ_E{Ÿç¤WÐtÕ9ìõ1¼òȈ~+û6G÷Èÿþ½AšÔ m¨ÃЀJ†¶Í¯ö?f_FÀ¶¯Ý|g .Ú':ë^žþý@j¯Úmö—”ËGî;5€G1üÖçÓ¿/H“š¡-uÚPÉжá-Û)ÊͲ/#˜Zeÿ‘^utt|K´f–ä7~¼=ŸýþŸQn¹+ûv~X1ŒöþÏÏÿ® M`†¶Ôah @%CÛf×ýìɾ„`*w=z§~8Ú«ž–þ}@šSËŸ½/þI|;ûöþŶ¿†þAšÀ m¨ÃЀJ†¶Ínôí3³/!˜eoK ._õ¯Mÿ mw3K£wâû£¸÷Úì[ ¦^Ùy(Z+Ÿœÿý@š° m¨ÃЀJ†¶Í­½ßó"ŠQö%¯xð;ÑÿÊßE{õ3Ò?ÿ¥ykfÉ÷·Ý’}‹ÀTÛöWÒ¿H–¡-uÚPÉж¹õÏ]–}ùÀä*‹Ýzvt}÷ì 1ûs_Z°–?avàS>roö]S©¸ïß7¥yÎЀ: m¨dhÛÐf–F¹éöìË&Ï ƒË×Ggí‹ó?ï¥E¬½êi18oE”ýG²ïB˜:ÝO¾#ý»€4IÚP‡¡-• m›Y÷Sÿ)ûÒ€‰R¶î‹þ93Ñ^³{úç¼”Y{ïgÇàòC"Šaöm SctÓééߤIÊЀ: m¨dhÛ̆ן˜}éÀD(º5z§~8Z+vMÿ|—Æ©Î!¯‰Ñífߢ0ÊÂ_Tæ1C[ê0´ ’¡móÚöK{1ìe_:Ðhå÷}`»lçôÏviœëûî(7ß™}ËÀÄ\z`úç¾4)ÚP‡¡-• m›WÿŸÿWöeUÜwCôNþ ­T§=Ÿýs—GŒúÙ·0L¬²·5Ú«vËÿÜ—& C[ê0´ ’¡mó*¾÷Íì˧xàæèô»ÑšYšþY.5µÎúŸ‹ÑeßÎ0±ú_úëôÏ{i2´ C[*Ú6«Î'~1û’€F)7oˆÞÿÄ/ØJóÕÌ’èú¡({[²oo˜8Åßö†Ió¡-uÚPÉжY ®84û’€F([÷EÿÌÿ­»¤~K“Xûc/ˆÑ­_;Õ`ât?ókéŸóRÓ3´ C[*Ú6¨åOŒ²ý@ö%ãmÔÁe뢽úéùŸÝÒTüºí‡£ìm;ó`bŒn:-ÿ3^jx†¶Ôah @%CÛæÔýì{³/_e9û/SÛ¼0ý3[šÎ_·=;û)“¡Í~¶f¾KMÎЀ: m¨dhÛœ†7œ’}¹ÀXm¸4:Ÿø…ôÏj©5í¿n{ÚŸEÙ$û‘78ÏüÏv©ÁÚP‡¡-• m›Q{¯gF {Ù— Œ•²ý`ôÏüH´f–¦VKú~u/âžk²ÐhåÖ{œÙI;¡-uÚPÉ¡}3êŸþçÙ— ŒbƒËÖE{õÓÓ?£%=J+v™½G£,³ŸÐXÝã3ÿ3]jh†¶Ôah @%CÛf´íOb£;.ŠÎ!¯Nÿl–TݶPÙy8û±4ºå+éŸåRS3´ C[*ÚŽµ/ñk`L½²»9úg~$Z3KÓ?›%ͽöþ?£;.Î~„@ó”et|iúg¹ÔÄ m¨ÃЀJ†¶ãßà¼Ù— ¤~ëóÑÞ÷§Ó?“%mgËvŽÁ…küÇcPÓà¢}ò?Ç¥fh @†¶T2´ÿЇnɾL E¹uct{Oúg±¤ù©{üoFÙÛšýh€Æ([÷EkùÓ?Ã¥¦eh @†¶T2´ï:cö%)¶ý‹ÑöšÝÓ?‹%Íou/âþ›²1н“þkúç·Ô´ m¨ÃЀJ†¶ãÝàâý³/Xô_íêÿ[éŸÁ’®öªÝbtÓéÙh„ÑwÏOÿì–š–¡-uÚPÉÐvŒ›Yå¦;²/X4Ãoí½÷Èÿ –´ð-Û)ï—ýØ€ñW–Ñ9èùŸÝRƒ2´ C[*ÚŽo#Þ”}yÀât¢æGÒ?{%-~½“~7bÐÎ~ ÀX\º6ý3[jR†¶Ôah @%CÛñmpÙAÙ—,¸bã•ÑY÷²ôÏ]Iyu>þï£|ä{Ù#[ewS´V>9ý3[jJ†¶Ôah @%CÛ1mfi”[7f_°pÊ2ï­åOÌÿÜ•”^gí‹£xàÛÙO&[½Sþ0ýóZjJ†¶Ôah @%CÛñ¬{ÔÛ²/ X0ewsôŽÿ­ôÏ[IãU{¯£;.Ê~DÀXm¸4ý³ZjJ†¶Ôah @%CÛñlpÅaÙ—,ˆbã•Ñ>à…韵’Æ´»Äðú³U0–:‡¾.ÿ³Zj@†¶Ôah @%CÛ1lÙNQ¶î˾4`Þ .;(ZËŸ˜ÿY+i¼›Y:û¼~ÔàÂ5ùŸÓR2´ C[*ÚŽ_ݣߞ}YÀü´£wÒMÿŒ•Ô¬úgýmDYf?Á EÙÝ£ÛΉÁ{E÷³ïö¾ÏMÿl–š’¡-uÚPÉÐvü|íàìËæM¹ùÎè|ü韯’šYïÔE”Eö£ V1Œâ¾oÅðšc¢wꇣsðÏÎþÂ{öç°ÔÔ m¨ÃЀJ†¶cÖÌ’(7oȾ,`^Œn¿0Ú{?;ÿóUR£Ûö‹Ø1d?Ò`Þ”[7Îûg~$ºG¼9Z+vMÿ¼•&)C[ê0´ ’¡íxµíÿ` .?$ZËvNÿl•4õŽÿ­ˆQ?ûÑÛ5ªÝøÅèŸýÑýÔ¯F{õÓÓ?W¥IÏЀ: m¨dh;^ .\“}IÀŽ)F³¿Ì•ý™*iòêóΈA'û)©ì?£;.ŽÁeë¢wò£sðϦ~JÓ˜¡-uÚPÉÐv¼*î¿)û’€tûôÏSI“[÷È·DÙÛ’ý¸€ˆbÅ}ߊá5ÇÌþ‡fÃÞ­™¥éŸ•’ m¨ÇЀJ†¶ãSç Wd_°ÝÊ-wEgýkÓ?O%M~Ã9ÊÞÖìÇÓ¤,£xàæ^{lô¿ô×Ñ9ü—¢µb—ôÏDIž¡-uÚPÉÐv|êŸýÙ—ÃÿÏÞÝGý}×õ?IA ¸!¥ÂP›ha0dóˆuNˆsáL=2ç×Ýûú~¿Ç9Ïÿ¡Ÿ+¿7\}]W,Äì›w¤þ9Ï ¿¥’ºÓ`Ûû-Ú°êÇïOÕ]i¼{cîX—ú§Ÿ~û$Í?C[JÚeh»zšº5úËŠÍî¹Éð@RH÷ÿxJã^ôÇ wô7ªƒ{Òdï–4Ú¹> ¶ž~ã$-.C[JÚeh»:êŸóœc !4Iõ¥kRoÓñáwTRw^úÊ”¦£èCš¢š¤Ù¡Ï§ÉM¥Ñ_›[_zskÃ¥ÍЀ†¶dÚ®ŽFWÿfô—™Þv¹ÿ!iU4¼üUdžSð—Íüò±ÿÝ:¾æwÓàâ—¥Þ)O¿[’–?C[JÚe ³:ªþì#Ñ_ 0oÓ[¶ùÍ_’VUÃ+~!¥Ù4úã€@õð‘TÝu}ïÞ˜†;Ö¥þß~Ÿ$Ådh @ C[² mWA›ž’Ò¤ý¥ó2Ù{~êÍ­‰¿Ÿ’ô—½ÿWSªëèIV@=~Möœý‘ À"ÔG¥êÀ®4Þ½1 ·¿<õ6~[$5+C[JÚeh_ýÈ×¢¿ ào5ùì›Âï¥$Í»¹5iúùK¢?:˜‡zøhªîI“ÎLÃëRÿŒgÆßIÏЀ†¶dÚÆvô¯;€Õl²wKø½”¤â6>1U_úhôG(Þ¸÷­QíÞ-i´s}l=éØG„ß I­ËЀ†¶dÚÆ6þøF ÀßhrÓEÆ’šÛ©OM³{nŠþ(è¦Ù4Íî¿-MoÙ–Fúipá‹RoÃâoƒ¤Ndh @ C[² mc«Þý%­éþ÷§ÞÜÚð[)I‹©Æw¦Ùƒ_ŽþHh½ú᯦é¯Lãk? ßþã©·éøð ©»ÚPÂЀ,CÛ¸ú›Ÿ~ì7¼ÀjS}íÓ©wÊ“Ão¥$-Eƒ-?êÁCÑ­­Q÷HÕ—>š&Ÿ<% ßõsÇ~¨!ú³^’þ|†¶”0´ ËÐ6®Ñ{~)úù௘Þì‡A¢ï¤$-eÃwüDJÕ8ú# yªIšº5MönI£ëÓ`ëI©7·&üs]’þ¶ m(ah @–¡mà7|o¹8úùà/¨»7õÏyNø”¤åhôÁ×F̬n³êØ]M÷]–Æ×¼. ·œz§<)üó[’J3´ „¡-Y†¶qÕ%úùàÿ©‡¦Á…/ ¿’´œMn<7úã`Õ¨JÕ]i¼{cîXço5Ôš m(ah @–¡mLƒ7ÿÃè§€ÿo2H÷ÿxø}”¤eonmªî¸*úS`ÅÕ£ÇRupOšìÝ’FW¾:õÏ|Vüg²$-S†¶”0´ ËÐ6¦ñ®ßŠ~zø–Y•FWübøm”¤•ªê·§Ùý·Eú,Ÿj’f‡÷§é-§ÑÎõi°õ¤Ô›[þù+I+•¡-% mÈ2´©ºãCÑOÇŒ¯ýƒð»(I+]ÿÜ祺ÿ@ôG0Àâͪ4ûÆŸ¤éç/I£«3 .úaßë‘Ôù m(ah @–ùІ'¤zøhôÓ@šÞ~Eü]”¤ †—ütJ³iôG1@‘úÈ¡Tؕƻ7¦áŽu©¿ùé៧’´Ú2´ „¡-Y†¶+ßðí?ýìf÷ßžz§>5ü.JRdãëÞýq ð7ªG¥êàž4Ù»%®|uêŸù÷Â?7%© ÚPÂЀ,CÛ•oòÉMÑÏ@ÇÕƒ‡ÓàMß~%)¼¹5iú'ïþXH©š¤ÙáýizËÅi´s}l=)õæÖÆNJR3´ „¡-Y†¶+ßÑßFafU^úÊð{(I«¥þÿNšþÓèOg KêÙ±Ïé¶§ñ®ßJƒ·þߟ‘¤%ÌЀ†¶dù9+ܦãSªÆÑÏ@‡?þ‡ñ÷P’VYƒ-?êá£ÑÑ@KÕG¥êÀ®4Þ½1 w¬KýÍ'„îIR›3´ „¡-Y†¶+ÛpûË£Ÿ€›îßyì¯I¾‡’´¾ûçSªëèj áŽŽö«»®O“OoNÃwÿëÔ?ëÙáŸo’Ôµ m(ah @–¡íÊ6ùÔ£Ÿ€Ž:ú×÷Oýöð[(I«¹ÉçE\M2¥Ù=ŸK“Ï]F;×§Á–çû¡&IZÚPÂЀ,CÛ•­:¸'úÉè¢é( .|qø”¤U߯'¦ÙÝ{£?µUª>rèØxk|ÍëÒpÛÉ©wÊ“ã?·$I%C[JÚeh»‚m:þØÐ VÚøcÿ=þJRCêŸóÜTŠþèVÁ¨¶:°+woLÃëRÿôg„>I’æ—¡-% mÈ2´]¹†Û_ýÜtPuð†ÔÛp\ø”¤&5zÏ/E|+¨9ö7ÐLönI£ëÓ`ëIáŸC’¤…gh @ C[² mW®É§ÞýÜtL=|4õÏ}^ø ”¤&6½ù­ÑãÀr˜MÓìðþ4ÝwY]õŸ¿5ª[þ™#IZº m(ah @–¡íÊuô·ãÀJ½ïß…ß?Ijl§<9ÍîûBôG9°Hõ‘CÇWãk^—†ÛNN½MO‰ÿ|‘$-k†¶”0´ ËÐv…Út|JÕ8ú¹èéßÿ$©á ¶!üþIR:úWË«O=~üØß3Ù»%v®Oƒ­'…^H’VG†¶”0´ ËÐve_ÿGÑO @WÔu^ò/ÂoŸ$µ©êÀ®èOwè¶j’f‡nM“›.J£¼æ[£Ú¹µáŸ ’¤Õ™¡-% mÈ2´]™ª/}4ú©èˆé¾ËÂïž$µ­þß™êÇïþˆ‡Î¨:6p_÷†4ÜvrêmzJøç€$©9ÚPÂЀ,CÛhnMªE?5PMý³žû$©… /ûÙc¿5XZõð‘TÝu}ïÞ˜†;Ö¶Gÿy—$5;C[JÚeh»ü .xaô3У«#üîIR››Þ²-ú£­?žªƒ{Òdï–4Ú¹> ¶žtì‡S£ÿlK’Ú•¡-% mÈ2´]þŽŽž`¹Íî½9õæÖ†ß=Iju§>5ÍøRôG>4Ãlšf‡÷§é¾ËÒøš×¥á¶“}B’´"ÚPÂЀ,ÿ’k¾±»ï²èg ífU¼å%á7O’ºÐàâ—ûÜþ¢ÙCw¦éíïNãþ·4Øöc©·é)á^%IÝÌЀ†¶dÚ.õÃ_‰~fZîè_¿}ï$©KMn8+ú£BÕÃGSu×õi¼{cîX—úg|gøŸKI’þo†¶”0´ ËÐvyëŸù¬è' åêÇïOýÓž~ó$©Sò¤4;ü§Ñ'VƸ—ªƒ{Žý`Ïhçú4ØzRêÍ­‰ÿs(IÒß¡-% mÈ2´]Þ†WüBôÐr£÷ýJø½“¤.6Øöc)Õ³è3Kk6M³ûö¥é-§Ñ‡þC\ø¢ÔÛp\øŸ7I’J2´ „¡-Y†¶ËÛä†3£Ÿ€›ºÕo”“¤À&Ÿ}Sô)€E©JÕ]i¼{cnyêm:>üÏ•$I‹ÍЀ†¶dÚ.oÕW?ýÄ´ØðÒŸ ¿u’Ôé6Ÿf~9úÀ¼ÔÃGSupϱîX—úg<3þÏ$IË¡-% mÈ2´]ÆæÖ¤zøHôÐRÕ×>ë$Ii°íÇRªgÑgþ¢jrì7ßOönI£ëÓ`ëI~ ¾$©3ÚPÂЀ,CÛåkpþF?/-6¸øGÃo$é[M>wAôY ËfUšÝ{šÞúö4ºê?¥Á…/N½ Oÿs!IRT†¶”0´ ËÐvùíüµèç ¥ª;>~ç$I®SŸšêG¾}èˆúÈ¡Tؕƻ7¦áŽu©ÚwÄÿ$ieh @ C[² m—/¿Õ €e1«Ò`ë Âïœ$é/6|×ÏE_Z¨=–ªƒ{Òä†3¿5ª=óYá_ë’$­ö m(ah @–¡íò5»çsÑÏ @ M¿piø“$ýõýã°`Õ$ÍÝš&{·¤ÑÎõi°õ¤Ô›[þu-IRÓ2´ „¡-Y†¶ËÔÆ'¦4F?/mSMRÿÜï¿s’¤¿¶þÙß“êÑ‘èkA̪4ûÆŸ¤éçß™FWÿF¼å%©·á á_Ã’$µ!C[JÚeÏ:i& IDATh»< .ziôÓÐB~›­$­þÆ×ünô¹`ªJÕ]i¼{cîX—ú›Ÿþµ*IR[3´ „¡-Y†¶ËÓÑßHKª®ÓàÂ…ß8IR¦ Ç¥Ù½·D_ Õƒ‡SuçÇÒäS§¦áå¯Jý3Ÿÿu)IR‡2´ „¡-Y†¶ËôÍÜ[.Ž~ZZ¦úòµá÷M’4¿Žþ`DšM£O+¡š¤ÙáýÇþ?àhçú4ØzRêÍ­ ÿ”$©ËÚPÂЀ,CÛåivÏ碟€–nyø}“$Í¿ÉÞ-ѧƒ¥VϾ5ªýü%i¼ë¿¤ÁE/õÿ©%IZ…ÚPÂЀ,ÿRpÚp\J“~ôÓÐ"³ûoO½¹5ñ7N’4ïúoü»©>r_ô aê#‡Ru`WïÞ˜†;Ö¥þæ¿®$IR>C[JÚeh»ôý«B`)Þ÷ïÂï›$©¼Ñ^}B˜§zt$U÷ûMÄ£ëSÿ¼ï ÿú‘$I ËЀ†¶dÚ.}£÷ÿjô³Ð"õc÷¸×’ÔÔæÖ¤êà ѧ„¿¬š¤Ùáýiºï²4ºê?ûaÉÞÜÚø¯I’´$ÚPÂЀ,Ã¥o²çìèg EÆý½ðÛ&IZxƒ·¼$¥Y}N:­~ø+ÇFµãk^—†ÛNN½Sžþu!I’–/C[JÚeh»ôUw]ý¬´D=z,õO{Zøm“$-®éÍo>)Q9”ª»Òx÷Æ4ܱ.õOFøûK’¤•ÍЀ†¶dÚ.}uï›ÑÏ @KLn8+ü®I’_ó ©î?}VZ§>šª¯|"M>½9 ßýó©Öw…¿µ$IŠÏЀ†¶dÚ.mý³¿;úIh‹Y•úç>/ü¶I’–¦ÑÕ¿}Yš­§Ù=7¥Éç.H£¿–çÿ`êÍ­ WI’´ú2´ „¡-Y†¶KÛð]?ý¤´Duàêð»&IZÂ6—f÷ß}^š¡®Óì›ÒtßeiüáßNƒ·ýHêmü¶ø7”$IÈЀ†¶dÚ.mãë^ý¤´ÄðÒW†ß5IÒÒ6|çOEŸ—U©>r_ªìJãÝÓpǺÔ?ýáo%I’š›¡-% mÈ2´]âoâî»,úIhÙCw¥ÞÜÚð»&IZúŽþÆò.«Ç§êàž4Ù»%v®Oƒ­'…¿‰$IjW†¶”0´ ËÐvi›º5úIhñµ~Ó$IËÓàMߟÒt”:a6M³Ãûý@âøš×¥ÁE/õƒ$’$iÙ3´ „¡-Y†¶KØÜڔƽè' éªqêŸ~bü]“$-[“Ͼ9µN]§Ù_JÓÛv¤ñG~' .þÑÔ;åIáÿ¬%IR÷2´ „¡-Y†¶KWÿ¼¿ýœ´ÀtÿÎð›&IZÞú›Ÿžêþ©ÉêÇïOÕ]i¼{cîXç‡D$IÒªÉЀ†¶dÚ.]ÃË_ýœ´ÀpÇ¿ ¿i’¤åïèo}mŠzüxªîI“½[Òhçú4ØzRø??I’¤¿)C[JÚeh»t?þ‡ÑÏ @ÃÕGîK½ O¿i’¤hãÓì?K«N5I³CŸO“›.J£¾6 ¶¾ õ6ÿÏK’$ižÚPÂЀ,CÛ%üîm;¢Ÿ€†›ÜpVø=“$­\£+~1úô¤úÈ¡TØ•Æ×½! ·œz›Žÿç"I’´˜ m(ah @–¡íÒuô·>Àbø«¸%©cÍ­I³»÷®Ø©ÿÆ·FµŸ˜KÃK_™ú›Oˆÿg I’´ÄÚPÂЀ,CÛ%jnmJ“~ôsÐ`³ûöÅß3IÒŠ7|û?[–»ROÕ×>“&{ÎI£+_úç>/ü¿«$IÒJdh @ C[² m—¦£ÿÒc|ÝëÃï™$)¦êÀÕ‹;"³*ÍïOÓ}—¥ñ5¯KÃm'§ÞÆo ÿï%I’‘¡-% mÈ2´]š†Û_ý”4Y]§þ¹ß~Ï$I1 ÎÿÁ”fÓùŸ#‡Ru`WïÞ˜†Û_žz›Žÿï I’´Z2´ „¡-Y†¶KÓøÃ¿ý”4XõõÃo™$)¶é­ïøkoD=|4U÷¤É g¦áŽu©Æ3Ãÿ³J’$­æ m(ah @–¡íÒ4Ù{~ôSÐ`ãüNø-“$ÅÖ?û»SÝ UoH“ÏK£÷þrêŸ÷}áÿ¹$I’š–¡-% mÈ2´]šª/_ý”4U]§þYß~Ë$I’$IjC†¶”0´ ËÐviªþjôSÐP³{n ¿c’$I’$µ%C[JÚeh»ò¤”fUôSÐPãëÿ(þ–I’$I’Ô’ m(ah @–¡íâ\ðÂèg Á[_~Ë$I’$IjK†¶”0´ ËÐvñ®øÅèg ¡fÝ~Ç$I’$IjS†¶”0´ ËÐvñ¯{}ô3ÐP“Ͼ)üŽI’$I’Ô¦ m(ah @–¡í|ãöæ·E?# 5Üþòð;&I’$IR›2´ „¡-Y†¶‹¯ºëãÑÏ@M‡©·é)áwL’$I’¤6eh @ C[² mßì¡;£Ÿ€ªî¼.ü†I’$I’Ô¶ m(ah @–¡í"Ûp\JÕ8úh ñÇþ{ü“$I’$©eÚPÂЀ,CÛÅÕ?÷yÑO@C .|qø“$I’$©mÚPÂЀ,CÛÅ5|çOF?! T?þÔ›[~Ç$I’$Ij[†¶”0´ ËÐvq>øÚè' ¦_¼2ü†I’$I’ÔÆ m(ah @–¡íâš|êÑO@?üÛá7L’$I’¤6fh @ C[² mùMÛÛ.~Bhð–—„ß0I’$I’Ú˜¡-% mÈ2´]\Õ×oŒ~B¦I½ Ç…ß0I’$I’Ú˜¡-% mÈ2´]\õ£wG?! SÝy]øý’$I’$©­ÚPÂЀ,CÛE´á¸”fÓè' aÆ»7Äß0I’$I’Zš¡-% mÈ2´]xý³¿;úùh áö—‡ß0I’$I’Úš¡-% mÈ2´]xƒ‹_ý|4M]§þæÂo˜$I’$ImÍЀ†¶dÚ.¼Ñ•ÿ&úùh˜úᯄß/I’$I’Úœ¡-% mÈ2´]xãkÿ úùh˜£ÿ²/ú~I’$I’Ôæ m(ah @–¡í›ìÝý|4Ìøã~¿$I’$Ijs†¶”0´ ËÐvß°ýÓD? 3ÜþŠðû%I’$IR›3´ „¡-Y†¶ ovïÍÑÏ@ÃôO?1ü~I’$I’Ôæ m(ah @–¡í«»7úùhú±{Âo—$I’$ImÏЀ†¶dÚ.°¹µ)U“èç Aª;¯‹¿_’$I’$µýl4Äì¡;Ãï–$I’$I]ÊЀ†¶dÚ6·6¥zýl4ÄìÞ›ão—$I’$IÊЀ†¶dÚ–Õ?í;¢Ÿ €©î¼.üvI’$I’Ô¥ m(ah @–¡mYýsŸýd4Èô‹W†ß.I’$I’º”¡-% mÈ2´-kpá‹£Ÿ €™ÞüÖðÛ%I’$IR—2´ „¡-Y†¶e ßþÏ¢Ÿ €™|æŒðÛ%I’$IR—2´ „¡-Y†¶e /û—ÑO@ƒŒ¯{Cøí’$I’$©KÚPÂЀ,CÛ²FW¾:úÉhñ®ß ¿]’$I’$u)C[JÚeh[Ö胯~2dôׄß.I’$I’º”¡-% mÈ2´-kü‘߉~2dtå¿ ¿]’$I’$u)C[JÚeh[Öøãÿ3úÉháå¯ ¿]’$I’$u)C[JÚeh[ÖäÓ§E? 2¼ä_„ß.I’$I’º”¡-% mÈ2´-k²wKô“Ð ƒ‹_~»$I’$IêR†¶”0´ Ëж𛴷¾#úÉhÁ[þqøí’$I’$©KÚPÂЀ,CÛÂoÒ~ñÊè' A[~ üvI’$I’Ô¥ m(ah @–¡mYÕ]ÑO@ƒôÏyNøí’$I’$©KÚPÂЀ,CÛ²ª»®~2¤Æ3Ão—$I’$I]ÊЀ†¶dÚ–UÜýd4Hó á·K’$I’¤.eh @ C[² mËšÝ{sô“Ð ýÓž~»$I’$IêR†¶”0´ Ëж¬Ù7¾ýd4HÿÔo¿]’$I’$u)C[JÚeh[ÖìÁ/G? ÒÛô”ðÛ%I’$IR—2´ „¡-Y†¶eÕÞýd4Hoã·…ß.I’$I’º”¡-% mÈ2´-«î}3úÉhÞ†ãÂo—$I’$I]ÊЀ†¶dÚ–U‹~2$únI’$I’Ôµ m(ah @–¡mY©G?M1«Âï–$I’$I]ËЀ†¶dÚ4·&ú¹h’j»$I’$IêX†¶”0´ Ëж  Oˆ~.š¤šÄß.I’$I’:–¡-% mÈ2´-hã·E?MRÏâo—$I’$IËЀ†¶dÚtÊ“£Ÿ €†éÍ­‰¿_’$I’$u(C[JÚeh[ЩO~.¦·á ñ÷K’$I’¤eh @ C[² mç_ÿ'ú¹h˜Þ)O ¿_’$I’$u)C[JÚeh;ÿú§=-ú¹h˜Þ¦ãÃï—$I’$I]ÊЀ†¶dÚοþ梟 €†9úÛУï—$I’$I]ÊЀ†¶dÚοþé'F? Óßüôðû%I’$IR—2´ „¡-Y†¶ó¯Æ3£Ÿ €†9úCÑ÷K’$I’¤.eh @ C[² mç_ÿ¬gG? Ó?óYá÷K’$I’¤.eh @ C[² mç_ÿìïŽ~.¦ö÷„ß/I’$I’º”¡-% mÈ2´ýsžý\4ÌàMÿ ü~I’$I’Ô¥ m(ah @–¡íüëŸû½ÑÏ@à .xaøý’$I’$©KÚPÂЀ,CÛù×?ïïG? 3xë? ¿_’$I’$u)C[JÚeh;ÿŽþõßPbøŽŸ¿_’$I’$u)C[JÚeh;ÿ[žý\4ÌðÒŸ ¿_’$I’$u)C[JÚeh;ÿçÿPôsÐ0Ãwÿëðû%I’$IR—2´ „¡-Y†¶óo°õÑÏ@ÃŒÞûËá÷K’$I’¤.eh @ C[² mçßà‚ý\4Ìè¯ ¿_’$I’$u)C[JÚeh;ÿ¾8ú¹h˜ñ®ÿ~¿$I’$IêR†¶”0´ ËÐvþ .xaôsÐ0ãþ^øý’$I’$©KÚPÂЀ,CÛù7Øòüèç aÆ×ÿ¯ðû%I’$IR—2´ „¡-Y†¶óoð¦ï~.fò™3Âï—$I’$I]ÊЀ†¶dÚοþ9Ï~.frÓ[Âï—$I’$I]ÊЀ†¶dÚοþYÏŽ~.fzÛŽðû%I’$IR—2´ „¡-Y†¶ó¯ú‰ÑÏ@ÃTw\~¿$I’$IêR†¶”0´ ËÐvþõO{ZôsÐ0ÕW?~¿$I’$IêR†¶”0´ Ëж MÇG? 3;tküý’$I’$©CÚPÂЀ,CÛ‚6>1ú¹h˜Ùƒ_Ž¿_’$I’$u(C[JÚeh[ÐÜšèç aêÇ¿¿$I’$IêP†¶”0´ Ëж¬4›F?M2„ß.I’$I’º”¡-% mÈ2´-ëè` J¸µ’$I’$­\†¶”0´ Ëø§¬zôXô“Ð0ýÍ'„ß/I’$I’º’¡-% mÈ2´-«î?ýd4Lÿ¼ï ¿_’$I’$u%C[JÚeh[Výø7¢Ÿ €†\ôÒðû%I’$IRW2´ „¡-Y†¶eÕÝýd4ÌðÒŸ ¿_’$I’$u%C[JÚeh[VýðW£Ÿ €†½÷߆ß/I’$I’º’¡-% mÈ2´-köÀ—¢Ÿ €†ø¿†ß/I’$I’º’¡-% mÈ2´-kvxô“Ð0ãOÌ…ß/I’$I’º’¡-% mÈ2´-kvß¾è' a&Ÿ}søý’$I’$©+ÚPÂЀ,CÛ²fwÿqô“Ð0Ó}ï ¿_’$I’$u%C[JÚeh[Võ•ÝÑO@ÃTö‘ðû%I’$IRW2´ „¡-Y†¶eU®Ž~2æèoC¾_’$I’$u%C[JÚeh[øMÚÛ¯ˆ~2föà—Ãï—$I’$I]ÉЀ†¶dÚ~“ö–mÑO@ÃÔýÃï—$I’$I]ÉЀ†¶dÚ–5ù웣Ÿ €¦©g©7·6ü†I’$I’Ô… m(ah @–¡mY“OŸýd4PÿôÃo˜$I’$I]ÈЀ†¶dÚ–5þøÿŒ~2h°õá7L’$I’¤.dh @ C[² mËäw¢Ÿ €^òÓá7L’$I’¤.dh @ C[² mË}ðßG? 4z߯„ß0I’$I’º¡-% mÈ2´-kôÞ_Ž~2hüÑÿ~Ã$I’$IêB†¶”0´ Ëж¬áŽýd4Ðä3g„ß0I’$I’º¡-% mÈ2´-køÎŸŒ~2húùKÂo˜$I’$I]ÈЀ†¶dÚ–5xë?~2¨úÒ5á7L’$I’¤.dh @ C[² mËœÿCÑO@ÍÝ~Ã$I’$IêB†¶”0´ Ëж¬þ9Ï~2¨~ìžð&I’$IR2´ „¡-Y†¶eõ7Ÿýd4Q5N½¹5áwL’$I’¤¶gh @ C[² m ;åIÑO@Cõ7?=þŽI’$I’Ôò m(ah @–¡my©šD? 48ÿ‡Âo˜$I’$ImÏЀ†¶dÚ–W‰~6høÎŸ ¿a’$I’$µ=C[JÚeh[^ýؽÑÏ@Þÿ«á7L’$I’¤¶gh @ C[² mË›Þýl4Ðøº×‡ß0I’$I’Úž¡-% mÈ2´-¯:xCô³Ð@“½[Âo˜$I’$ImÏЀ†¶dÚ–WÝqUô³Ð@Óýï¿a’$I’$µ=C[JÚeh»€oÔ~a{ô³Ð@³»÷†ß0I’$I’Úž¡-% mÈ2´-orãyÑÏ@Õ~=ü†I’$I’Ôö m(ah @–¡myãOüïèg ‰ªIêÍ­ ¿c’$I’$µ9C[JÚeh[ÞøÃÿ5úÙh¨þ™Ï ¿c’$I’$µ9C[JÚeh[Þè}¿ýl4Ôࢿc’$I’$µ9C[JÚeh[Þð²Ÿ~6jxù«Âï˜$I’$ImÎЀ†¶dÚ–7xÛD? 5ºú7Ãï˜$I’$ImÎЀ†¶dÚ–7xó?Œ~6jò©7†ß1I’$I’Úœ¡-% mÈ2´-¯ú3¢Ÿ €†š~þ’ð;&I’$IR›3´ „¡-Y†¶ hÃq)ÕuôÓÐ@Õ‹¿c’$I’$µ8C[JÚeh»°êá#ÑO@;yGø “$I’$©ÍÚPÂЀ,CÛ…U?üÕè§ ‰&ýð&I’$IR›3´ „¡-Y†¶ kvèÖè§ ¡ú§?#üŽI’$I’ÔÖ m(ah @–¡íªîº>úéh¨ÁE?~Ç$I’$Ijk†¶”0´ ËÐv¡ß¬}oôÓÐPÃwÿ|ø“$I’$©­ÚPÂЀ,CÛ~³öæ·E? 5¾æwÃï˜$I’$ImÍЀ†¶dÚ.¬ÉgN~:jrãyáwL’$I’¤¶fh @ C[² mÖøÚ?ˆ~:jºgø“$I’$©­ÚPÂЀ,CÛ…5Ú¹>úéh¨Ù½·„ß1I’$I’Úš¡-% mÈ2´]XÃí¯ˆ~:ªî¿c’$I’$µ5C[JÚeh»°¾(úéhªºN½MLJß2I’$I’Ú˜¡-% mÈ2´]Xý3Ÿýt4Ø`ËóÃo™$I’$ImÌЀ†¶dÚ.° Ç¥4«¢Ÿ€†nEü-“$I’$©…ÚPÂЀ,CÛ…W÷G? 5úÐ ¿c’$I’$µ1C[JÚeh»ðfßøbôóÐP“O½1üŽI’$I’ÔÆ m(ah @–¡í«îº>úùh¨ém;Âï˜$I’$ImÌЀ†¶dÚ.â¶·]ý|4Tõõφß1I’$I’Ú˜¡-% mÈ2´]x“Ï‹~>ª~üþð;&I’$IR3´ „¡-Y†¶ o|Ý룟€¦ªëÔÛt|ø-“$I’$©mÚPÂЀ,CÛ…7úÀ¯G? 6Øú‚ð[&I’$IRÛ2´ „¡-Y†¶ oxÙÏF? 6¼üUá·L’$I’¤¶eh @ C[² mÞà-/‰~>l|Íï†ß2I’$I’Ú–¡-% mÈ2´]xý³¾+úùh°ÉÞ-á·L’$I’¤¶eh @ C[² mц'¤TÏ¢Ÿ€†ª슿e’$I’$µ,C[JÚeh»¸êþÑO@CÍï¿c’$I’$µ-C[JÚeh»¸ŽŽ¤`A&ƒÔ›[~Ë$I’$IjS†¶”0´ ËÐvqU_Ùý„4Xÿ¬g‡ß2I’$I’Ú”¡-% mÈ2´]ä7mo¿"ú h°á¶“Ão™$I’$ImÊЀ†¶dÚ.®ÉçF?! 6Ú¹>ü–I’$I’Ô¦ m(ah @–¡íâô÷¢Ÿ€ïÞ¿i IDAT~Ë$I’$IjS†¶”0´ ËÐvqÞóKÑO@ƒM÷]~Ë$I’$IjS†¶”0´ ËÐvq .þÑè' Áª¯ß~Ë$I’$IjS†¶”0´ ËÐvqõÏþžè' ÁêÞáð[&I’$IR›2´ „¡-Y†¶‹lÃq)ͦÑÏ@ƒõO{Zü=“$I’$©%ÚPÂЀ,CÛÅW?zwô3Ð`ƒ‹^~Ë$I’$IjK†¶”0´ ËÐvñÍîÞýŒ4Øè½ÿ6ü–I’$I’Ô– m(ah @–¡­oÜkü‰¹ð[&I’$IR[òýZJÚeh»ø&7žýŒ4Øtß»Âo™$I’$ImÉЀ†¶dÚ.¾ñµ¿ýŒ4Øìî?¿e’$I’$µ%C[JÚeh»øFW¾:úh°ºÿ`ø-“$I’$©-ÚPÂЀ,CÛÅ7¸øeÑÏ@Ãõ7Ÿ~Ï$I’$IjC†¶”0´ ËÐvñõÏyNô3Ðpƒ·ýHø=“$I’$© ÚPÂЀ,CÛ%hÃq)ͦÑO @ƒÞÿ«ñ÷L’$I’¤dh @ C[² m—¦ú±{¢Ÿ€›|ò”ð[&I’$IR2´ „¡-Y†¶KÓìî?Ž~Jlzû»Ão™$I’$ImÈÐø?ìÜyÐ¥e}çáj\@â nC´4ãĉ5Ac2N2‡ŠI™X–Arª0‘’Ä$Vœq¦Œ[e¢So/Ð4´È*È’F¦Ù7Yd',vGQÀfdGÖ¦Þ³Ÿóý)h¸Î±{„ß3I’$I’šž¡-9 mH2´OícÞý)h¸îÙ~Ï$I’$Ijz†¶ä0´ ÉÐv<µüÕèO @Ãõ¯9(üžI’$I’Ôô mÈah @’¡íøª{‹ÑŸ€Þvnø-“$I’$©éÚÃЀ$CÛñ5zô–èÏ @ƒ¿#ü–I’$I’Ôô mÈah @’¡íøÞþÝèÏ @“õâ²W†ß3I’$I’šœ¡-9 mH2´_ýõGDN®}Øná÷L’$I’¤&gh @C[’ mÇWï¢/FN®sÊÇÂï™$I’$IMÎЀ†¶$ÚŽ¯-ã(ؽK¾~Ï$I’$Ijr†¶ä0´ ÉÐv|µzwôç á?:1üžI’$I’Ôä mÈah @’¡íøj­Ü%úsÐp£û¿~Ï$I’$Ijr†¶ä0´ ÉÐv¼UÍÑŸ€ÛrG¢o™$I’$IMÎЀ†¶$ÚŽ·ÑÏýIh¸Öo ¿g’$I’$55C[rÚdh;æ_âÞrfô' á:Çýaø=“$I’$©©ÚÃЀ$CÛñÖ¿öèO @ÃuÏýLø=“$I’$©©ÚÃЀ$CÛñÖ;ÿ¿GR®Ý×Ãï™$I’$IMÍЀ†¶$ÚŽ·ÎÚ=£?) 7¼ãÂð{&I’$IRS3´ ‡¡-I†¶ã­}ø;¢?) W=ywø=“$I’$©©ÚÃЀ$CÛ1·b纮ªèÏ @“U£gîIøM“$I’$©ÚÃЀ$CÛñW=ýHôg áÚG½;üžI’$I’ÔÄ mÈah @’¡íøÝÿýèÏ @ÃuOÿdø=“$I’$©‰ÚÃЀ$CÛ ü"÷¦ïDV®õªð{&I’$IR3´ ‡¡-I†¶ã¯å¾ÑŸ€†ÞzNø=“$I’$©‰ÚÃЀ$CÛñ×=cŸèÏ @Þøiø=“$I’$©‰ÚÃЀ$CÛñ×^³{ôg éFÃzqÅ«Âoš$I’$IMËЀ†¶$ÚŽ¿Öª×GV Ð>òwÂoš$I’$IMËЀ†¶$ÚN¦ª½)úÓÐpÝÓö¿g’$I’$5-C[rÚdh;™F¬þ´4\ÿÊýÂï™$I’$IMËЀ†¶$ÚNè—¹7®þ´4Üà–3Ãï™$I’$IMËЀ†¶$ÚN¦ÞåK£?- 7züöð{&I’$IRÓ2´ ‡¡-I†¶“©{Ú'¢?-M7Ô‹Ëw ¿i’$I’$5)C[rÚdh;™Úßü½èO @ÚG¼+ü¦I’$I’Ô¤ mÈah @’¡ídj­Ü%úÓP€î©~Ó$I’$IjR†¶ä0´ ÉÐvrU‹F^®ÅŠð{&I’$IR“2´ ‡¡-I†¶“kxߵџ€†l<=üžI’$I’Ô¤ mÈah @’¡í¡û£¢?/ 7zìÖð{&I’$IR“2´ ‡¡-I†¶“«wéW£?/M7ì׋Ë^~Ó$I’$IjJ†¶ä0´ ÉÐvru×íýy(@ûˆß ¿i’$I’$5%C[rÚdh;¹ÚGýûèÏ @º§þyøM“$I’$©)ÚÃЀ$CÛ ¶ï¯ÔuUEb®ÕÊø›&I’$IRC2´ ‡¡-I†¶“­zê¡èO @à o;7üžI’$I’Ô” mÈah @’¡ídÞsUô' áª'ï¿g’$I’$5%C[rÚdh;á_êþð[ÑŸ€¦«ªºµï«Ãoš$I’$IMÈЀ†¶$ÚN¶ÞÅ_ŽþÄ }Ì{Âoš$I’$IMÈЀ†¶$ÚN¶ÎÚ=£?1èžýéð›&I’$IR2´ ‡¡-I†¶“­µúmÑŸ€ô¯ÿFøM“$I’$© ÚÃЀ$CÛ ·°C]÷[ÑŸ€†þìòø›&I’$IR2´ ‡¡-I†¶“oôðÑŸ€†«Z‡ß3I’$I’š¡-9 mH2´Â/voþßÑŸ€´Ø5ü¦I’$I’4ëÚÃЀ$CÛÉ×»|Yôg ãÿ8ü¦I’$I’4ëÚÃЀ$CÛÉ×]÷ñèÏ @zü]øM“$I’$iÖ3´ ‡¡-I†¶“¯}Ä»¢?3üð¸ð›&I’$IÒ¬gh @C[’ m§Ðòëz4ŒþÔ4Üèõñ7M’$I’¤ÏЀ†¶$ÚN§Ñ¦;£?5M×[¬v¿i’$I’$Ír†¶ä0´ ÉÐv: o??úSP€Öê·…ß4I’$I’f9C[rÚdh;ú×ý©(@çä†ß4I’$I’f9C[rÚdh;ºgýUô§ ½KÿWøM“$I’$i–3´ ‡¡-I†¶Ó©½f÷èO @7¯ ¿i’$I’$Ír†¶ä0´ ÉÐv:µV¾&úSP€Ñc·…ß4I’$I’f9C[rÚdh;½ª§ŽþÜ4ÝhX/®Ø9ü¦I’$I’4«ÚÃЀ$CÛé5¼ûŠèÏ @Úßüá7M’$I’¤YÍЀ†¶$ÚN¯þ†£¢?7èžýéð›&I’$IÒ¬fh @C[’ m§Wïüÿý¹(@ÿû‡‡ß4I’$I’f5C[rÚdh;½:'üIôç Ã{®¿i’$I’$Íj†¶ä0´ ÉÐvzµ¾ö¦èÏ @ªÎæzqaIø]“$I’$i3´ ‡¡-I†¶Ó­j=ýÉ(@ë·†ß4I’$I’f1C[rÚdh;݆÷\ýÉ(@çä†ß4I’$I’f1C[rÚdh;ÝúëŒþä wÙBøM“$I’$i3´ ‡¡-I†¶Ó­wÞ‹þä`°ñôð›&I’$IÒ,fh @C[’ m§[ç[ýÉ(À艟†ß4I’$I’f1C[rÚdh;ÝZû¿6ú“P‚jT·ö}uø]“$I’$iÖ2´ ‡¡-I†¶Ó¯úåƒÑŸ€´×ì~Ó$I’$Išµ mÈah @’¡íôÞyqôg Ýs?~Ó$I’$Išµ mÈah @’¡íôë_spôg ý G…ß4I’$I’f-C[rÚdh;ýºg~*ú³P€á}׆ß4I’$I’f-C[rÚdh;ýÚßü½èÏ@ªîSõâÂ’ð»&I’$IÒ,eh @C[’ mZ±s]W£èO@Z«ß×$I’$Iš¡ mÈah @’¡mL£MwFz Ð9åcá7M’$I’¤YÊЀ†¶$ÚÆ4¼õìèO@úW,¿i’$I’$ÍR†¶ä0´ ÉÐ6¦þ•ûEz 0¼õœð›&I’$IÒ,eh @C[’ mcêžúgÑŸ€T›ï ¿i’$I’$ÍR†¶ä0´ ÉÐ6¦öáïŒþô¢µê áwM’$I’¤YÉЀ†¶$Úµìu=ìE~ Ð9þýñwM’$I’¤ÉЀ†¶$ÚÆ5zäæèÏ@z})ü¦I’$I’4+ÚÃЀ$CÛÀ_øÞtJôç ƒ׆ß4I’$I’f%C[rÚdhWï’¯D~ 0ztcøM“$I’$iV2´ ‡¡-I†¶quþñO£??% ëÅ;‡ß5I’$I’f!C[rÚdhWë ·D~ Ñ>æ÷Ãïš$I’$I³¡-9 mH2´­j=ý(@÷œ¿ ¿i’$I’$ÍB†¶ä0´ ÉÐ6¶áÝWD? 0øço†ß4I’$I’f!C[rÚdh[ÿºC£ŸÝÿýð›&I’$IÒ,dh @C[’ mcëžù©è'@ ú­zqéËÂïš$I’$IÑÚÃЀ$CÛØÚG½;ú Pˆöa»…ß5I’$I’¢3´ ‡¡-I†¶Á-ß±®‡ýèg@º§í×$I’$I ÎЀ†¶$ÚÆ7zä'ÑÏ€ô¯9(ü¦I’$I’¡-9 mH2´opÓw¢ŸÞuiøM“$I’$):C[rÚdh_ï{ý (@Õz"ü¦I’$I’¡-9 mH2´¯s⣟…hô–ð»&I’$IRd†¶ä0´ ÉÐ6¾ÖoŒ~¢sòGÂïš$I’$I‘ÚÃЀ$CÛÙ¨zú‘è§@z—/ ¿i’$I’$Efh @C[’ mg£á]—D? 0¼å¬ð›&I’$IRd†¶ä0´ ÉÐv6ê_spôS Õæ{Âoš$I’$I‘ÚÃЀ$CÛÙ¨{Æ>ÑO€B´V½!ü®I’$I’•¡-9 mH2´ÚGþvôS >~×$I’$IŠÊЀ†¶$ÚÎHË^Q×Ã^ôs ½Kþ!þ®I’$I’”¡-9 mH2´Fßý(À–ÿ }Ó$I’$IŠÊЀ†¶$ÚÎNƒŸý(ÀhÓ]á7M’$I’¤¨ mÈah @’¡íìÔ»ðóÑÏ€TUÝÚÿuáwM’$I’¤ˆ mÈah @’¡íìÔ9…èÿþð»&I’$IRD†¶ä0´ ÉÐvvjí÷/Ÿù[`{õ.þrø]“$I’$)"C[rÚdh;[6Ýý$(Àà¦SÂoš$I’$IÚÃЀ$CÛÙj°ñôè'@Fß~Ó$I’$IŠÈЀ†¶$ÚÎV½K¿ý$(AUÕ­•»„ß5I’$I’¦¡-9 mH2´­:'}(úIPˆÎqï ¿k’$I’$M;C[rÚdh;[µØ5úIPˆÞ…_¿k’$I’$M;C[rÚdh;{UOý<úYP€ÁkÃoš$I’$IÓÎЀ†¶$ÚÎ^ÃÛ¿ý,(Àè±[Ãoš$I’$IÓÎЀ†¶$ÚÎ^ý+÷‹~” Õ­}_~×$I’$Išf†¶ä0´ ÉÐvöêžò_¢Ÿ…è»Gø]“$I’$išÚÃЀ$CÛÙ«µú×£Ÿ…è]ð¹ð»&I’$IÒ43´ ‡¡-I†¶3ØÂ’ºjoŠ~`ð£ãïš$I’$ISÌЀ†¶$ÚÎfû¯ˆ~`ôÈÍá7M’$I’¤ifh @C[’ mg³þµ«£Ÿ% ëÅ;‡ß5I’$I’¦•¡-9 mH2´Íº§2úiPˆöšÝÃïš$I’$IÓÊЀ†¶$ÚÎfíÃßý4(Dï¼Ï†ß5I’$I’¦•¡-9 mH2´Ñ–¾¬®û­èç@7×$I’$IšR†¶ä0´ ÉÐvv=°>úyP€Ñ#7‡ß4I’$I’¦•¡-9 mH2´ÝúŽŽ~”`4¬÷ý•ð»&I’$IÒ42´ ‡¡-I†¶³[÷ìOG? Ñ9vð»&I’$IÒ42´ ‡¡-I†¶³[û¨wG? Ñ»àïÂïš$I’$IÓÈЀ†¶$ÚÎpË^Q×ývô ƒׯß5I’$I’¦¡-9 mH2´íF¬~"`ôØmá7M’$I’¤idh @C[’ mg»þú#£Ÿ%¨ªºµr—ð»&I’$IÒ¤3´ ‡¡-I†¶³]÷¬¿Š~"¢óí? ¿k’$I’$M:C[rÚdh;ÛµxWô ½‹¿~×$I’$Išt†¶ä0´ ÉÐvÆ[ú²ºî-F? 0¸y]ü]“$I’$iÂÚÃЀ$CÛÙoxßµÑÏ€Œ6Ý~Ó$I’$Išt†¶ä0´ ÉÐvöë_ÿèg@ ªªn­z}ø]“$I’$i’ÚÃЀ$CÛÙ¯{Æ>ÑÏ€BtNø@ø]“$I’$i’ÚÃЀ$CÛÙ¯}ØnÑÏ€Bô.ùJø]“$I’$i’ÚÃЀ$CÛ´°C]uýT(Àà–3ãïš$I’$IÌЀ†¶$Ú6£á=WE? Pýâ¾ð›&I’$IÒ$3´ ‡¡-I†¶Í¨í!ÑO€B´Ø5ü®I’$I’4© mÈah @’¡m3êžö‰è§@!:ÿø§áwM’$I’¤Ieh @C[’ m›QûзG? Ñ»|iø]“$I’$iRÚÃЀ$CÛ†´°¤®Ú›¢Ÿ Þvnü]“$I’$iBÚÃЀ$CÛæ4üÙeÑÏ€TO?~Ó$I’$IšT†¶ä0´ Éж9õÿéÀèç@!Z½9ü®I’$I’4‰ mÈah @’¡msê®Û+ú¹PˆÎwþsø]“$I’$iÚÃЀ$CÛæÔZýëÑÏ€Bô¯Ü/ü®I’$I’4‰ mÈah @’¡m³ª‹~2`xçÅá7M’$I’¤Idh @C[’ m›Õ–al¯ª½©^\X~×$I’$Iw†¶ä0´ ÉжYõ¯Zýd(Dûë¿~×$I’$Iw†¶ä0´ ÉжYuNùXô“ ÝÓö¿k’$I’$;C[rÚdhÛ¬ZÿZô“ ýë ¿k’$I’$;C[rÚdhÛ¼ª§Ž~6`xßuá7M’$I’¤qgh @C[’ m›×ðöïF?JÐoûß’$I’¤â2´ ‡¡-I6Í«Åòèg@!ÚG½;ü®I’$I’4Î mÈah @’¡móêœü‘èg@!ºç~&ü®I’$I’4Î mÈah @’¡mójøÆèg@!?<.ü®I’$I’4Î mÈah @’¡m3«~ù`ôÓ £‡o ¿i’$I’$3C[rÚdhÛ̆·žýt(ÁhX·ö}uø]“$I’$i\ÚÃЀ$CÛfÖ»l!úéPˆÎqï ¿k’$I’$+C[rÚdhÛÌ:'}(úéPˆÞÅ_¿k’$I’$+C[rÚdhÛÌZ«Þýt(Äà'§†ß5I’$I’Æ•¡-9 mH2´mnÕæ{£Ÿ¨ž¼;ü¦I’$I’4® mÈah @’¡msl<#úùPˆÖ»†ß5I’$I’Æ‘¡-9 mH2´mn½K¾ý|(DgížáwM’$I’¤qdh @C[’ m›[ç„D? Ñ¿byø]“$I’$iÚÃЀ$CÛæÖÚÿµu]UÑO€ ï¸ ü®I’$I’4Ž mÈah @’¡m³mº+ú P€ªõD½¸°$ü®I’$I’´½ÚÃЀ$CÛf7¸y]ô ­Õo ¿k’$I’$mo†¶ä0´ ÉжÙõ.úRô ÝSÿ<ü®I’$I’´½ÚÃЀ$CÛf×ùÖD?! Ñ¿vuø]“$I’$i{3´ ‡¡-I†¶ oÅÎu=D?# 0¼÷Ÿâïš$I’$IÛ™¡-9 mH2´m~£‡oŒ~F” ·X/.}yø]“$I’$i{2´ ‡¡-I†¶Íoðƒ5ÑÏ€B´üð»&I’$IÒödh @C[’ m›_÷ìOG?# Ñ=çoÃïš$I’$IÛ“¡-9 mH2´m~í#;úPˆÁ ß¿k’$I’$mO†¶ä0´ Éж€–¾¬®zOG?% 0ztcü]“$I’$i;2´ ‡¡-I†¶e4¼çêè§@ ªQÝZ¹Kø]“$I’$é¥fh @C[’ m˨ÍÁÑO €BtŽÿãð»&I’$IÒKÍЀ†¶$Ú–QwÝ^ÑO €Bô.ýjø]“$I’$é¥fh @C[’ m˨uÈ[£Ÿ…Þvnø]“$I’$é¥fh @C[’ mË©zú‘èç@ªÅGÃoš$I’$I/5C[rÚdh[NÃÛ΋~NbËß”}×$I’$Iz)ÚÃЀ$CÛrê]¶ýœ(DwÝÇÃïš$I’$I/%C[rÚdh[N?ýœ(DÿÚÕáwM’$I’¤—’¡-9 mH2´-§ÖÊ×ÔuUE?) 0¼ïºð»&I’$IÒKÉЀ†¶$Ú–Õ艟F?)J0èÔ‹Ë^~×$I’$IÊÍЀ†¶$Ú–ÕàÆµÑO €B´þÝð»&I’$IRn†¶ä0´ Éж¬z|.úIPˆÞyŸ ¿k’$I’$åfh @C[’ m˪½f÷è'@!?>)ü®I’$I’”›¡-9 mH2´-¬å;Öõ ý¬(ÀèñÛãïš$I’$I™ÚÃЀ$CÛò=øƒèg@ ªªníÿÚð»&I’$IRN†¶ä0´ Éж¼úŽŠ~V¢sâÃïš$I’$I9ÚÃЀ$CÛòêžù—ÑÏ €Bô._~×$I’$IÊÉЀ†¶$Ú–Wû°Ý¢Ÿ…ÞqAø]“$I’$)'C[rÚdh[` Kꪳ9úiP€ªõÄ3w%ü¶I’$I’´ÚÃЀ$CÛ2þì²è§@!Ú_ÿ·áwM’$I’¤mÍЀ†¶$Ú–YÿêUÑO €BtOÛ;ü®I’$I’´­ÚÃЀ$CÛ2ëœò±è§@!ú×~×$I’$IÚÖ mÈah @’¡m™µzsôÓ £6„ß5I’$I’¶5C[rÚdh[nÕ/Œ~^”`دW¼¯Èl³ IDAT*ü®I’$I’´-ÚÃЀ$CÛrÞrVôó c÷¿k’$I’$mK†¶ä0´ ÉжÜz—üCô󠽋¾~×$I’$IÚ– mÈah @’¡m¹uŽôó ƒg„ß5I’$I’¶%C[rÚdh[n­ýþE]W£è'@ª§ ¿k’$I’$mK†¶ä0´ ÉжìFÞýÄ(Dëà~×$I’$IJeh @C[’ mËn𣢟…è®ûxø]“$I’$)•¡-9 mH2´-»ÞyŸ~b¢Ý¡áwM’$I’¤T†¶ä0´ ÉжìÚGÿnô £Ö‡ß5I’$I’RÚÃЀ$CÛÂ[öŠºî·£Ÿ%öêÅå;Åß6I’$I’¶’¡-9 mH2´-¿Ñý×G?3 Ñ^óÞð»&I’$IÒÖ2´ ‡¡-I†¶å׿þÑÏ €Bô.úbø]“$I’$ikÚÃЀ$CÛòëž¶wô3 ƒ§‡ß5I’$I’¶–¡-9 mH2´-¿ö×#ú™Pˆê©‡Âïš$I’$I[ËЀ†¶$ÚÎA KêªõxôS ­ƒÞÛ$I’$Iz‘ mÈah @’¡í|4¼ãÂè§@!ºëö ¿k’$I’$½X†¶ä0´ ÉÐv>ê]¾,ú©Pˆþµ«Ãïš$I’$I/–¡-9 mH2´:'}(ú©PˆÑýׇß5I’$I’^,C[rÚdh;µö]]WUôs ƒn½¸|ÇðÛ&I’$IÒ eh @C[’ mç§Ñ¦;£Ÿ…h¯Ù=ü®I’$I’ôBÚÃЀ$CÛùipãÉÑÏ €Bô.üBø]“$I’$é…2´ ‡¡-I†¶óSï‚ÏE?7 1øÉ©áwM’$I’¤ÊЀ†¶$ÚÎOícÞýÜ(Dõ‹ûÃïš$I’$I/”¡-9 mH2´£–ïX׃nô“ ­ƒÞÛ$I’$Iz^†¶ä0´ ÉÐv¾=°!úÉPˆîº½Âïš$I’$IÏÏЀ†¶$ÚÎWýõGD?9 Ñ¿îÐð»&I’$IÒó3´ ‡¡-I†¶óU÷ôOF?9 ±åoI¾k’$I’$=?C[rÚdh;_µ}{ô“ Ã~½¸bçðÛ&I’$IÒs3´ ‡¡-I†¶sÖÂ’ºj=ýì(Dç¸÷Åß6I’$I’ž“¡-9 mH2´¿†w^ýì(Dï’¯„ß5I’$I’ž›¡-9 mH2´¿úW¬ˆ~vbxûùáwM’$I’¤çfh @C[’ mç¯ÎÚ=£Ÿ…¨ZOÔ‹ KÂo›$I’$IÏfh @C[’ mç¯Öª××uUE?= Ñ>ì7Ão›$I’$IÏfh @C[’ mç³êÉŸE?= Ñ=ë¯Ãïš$I’$IÏfh @C[’ mç³ÁM§D?= 1øáqáwM’$I’¤g3´ ‡¡-I†¶óYïÂÏG?= 1zì¶ð»&I’$IÒ³ÚÃЀ$CÛù¬½æ½ÑO€RTUÝZõ†ðÛ&I’$IÒ– mÈah @’¡íœ¶|§ºö¢Ÿ…è¬ýpüm“$I’$ÉЀL†¶$ÚÎo£ýü(DÿêUáwM’$I’¤-ÚÃЀ$CÛù­¿þÈèç@!†÷\~×$I’$IÚ’¡-9 mH2´ßºgüEôó ýv½¸ì•á·M’$I’$C[rÚdh;¿µ¿ñióûá·M’$I’$C[rÚdh;Ç-,©«ö“ÑO€Bô.ü|üm“$I’$Í}†¶ä0´ ÉÐv¾ÞuIô [þCfô]“$I’$ÉЀ†¶$ÚÎwý+÷‹~‚¢zê¡ð»&I’$I’¡-9 mH2´ï:k?ý(Hë·†ß6I’$IÒ|gh @C[’ mç»Öÿ*ú Pîi{‡ß6I’$IÒ|gh @C[’ mU=ywô3 ýõG†ß5I’$IÒ|gh @C[’ m5¸y]ô3 £Ÿÿ8ü®I’$I’æ;C[rÚdh«Þ…_ˆ~†”¢Õ­•¯ ¿m’$I’¤ùÍЀ†¶$ÚªsìÑÏ€‚tNúPøm“$I’$Ío†¶ä0´ ÉÐV‹Ëwªëa?ú)PˆþU+ão›$I’$in3´ ‡¡-I†¶ÚÒè¡¢Ÿ"…Þsuø]“$I’$Ío†¶ä0´ ÉÐV[êo8:ú)PŠA·^\¾cøm“$I’$Íg†¶ä0´ ÉÐV[êžù©è§@AÚÇþ§ðÛ&I’$IšÏ mÈah @’¡­¶Ô>l·è§@AzßûûðÛ&I’$IšÏ mÈah @’¡­žia‡ºêü"ú9PˆáíçÇß6I’$IÒ\fh @C[’ mõlû.~Ž¢j?ùÌÿ‰#ú¶I’$I’æ/C[rÚdh«gë_µ2ú9Pöáï ¿m’$I’¤ùËЀ†¶$ÚêÙ:'4ú9Pî¹ÿ5ü¶I’$I’æ/C[rÚdh«gk°kôs  ƒO¿m’$I’¤ùËЀ†¶$Úê¹U›ï~’bËM‰¾k’$I’¤ùËЀ†¶$Úê¹ ~rjô“  ­ƒ-ü¶I’$I’æ+C[rÚdh«çÖ»è‹ÑO€‚tOûDøm“$I’$ÍW†¶ä0´ ÉÐVÏ­sìÑO€‚ô7~Û$I’$Ió•¡-9 mH2´ÕÿÓòêzØ~–bôðMñ·M’$I’4WÚÃЀ$C[=¿ÑC7D?KJQêÖþ¯ ¿m’$I’¤ùÉЀ†¶$Úêùõ7ý,(Hgížá·M’$I’4?ÚÃЀ$C[=¿î™ŸŠ~–¤õªðÛ&I’$IšŸ mÈah @’¡­ž_û°Ý¢Ÿ%Þ{Møm“$I’$ÍO†¶ä0´ ÉÐVÿ_ Kꪳ9úiPŠA·^\ñªøû&I’$Iš‹ mÈah @’¡­^¨á]—F?M Òùö…ß6I’$IÒ|dh @C[’ mõBõ¯Zý4(Hïò¥á·M’$I’4ÚÃЀ$C[½P“?ý4(Èðg—…ß6I’$IÒ|dh @C[’ mõBµØ5úiP’~«^\öÊðû&I’$I*?C[rÚdh««Ú|Oôó  í5ï ¿m’$I’¤ò3´ ‡¡-I†¶z±?95úyPÞ÷þgøm“$I’$•Ÿ¡-9 mH2´Õ‹Õ»è‹ÑÏ€‚ ï¸ ü¶I’$I’ÊÏЀ†¶$ÚêÅê»Gôó  U÷—õâÒ—…ß7I’$IRÙÚÃЀ$C[½hËwªëa?ú‰PöÑÿ!þ¾I’$I’ŠÎЀ†¶$Újkº!ú‰PÞ…_¿m’$I’¤²3´ ‡¡-I†¶ÚZý GG?Q 2¼å¬ðÛ&I’$I*;C[rÚdh«­Õ=ó/£Ÿ(©Ú›êÅ…Âï›$I’$©Ü mÈah @’¡­¶Vû°Ý¢Ÿ(…iñ[á÷M’$I’Tn†¶ä0´ ÉÐV[maI]u6G?S Ò;ï³ñ÷M’$I’Tl†¶ä0´ ÉÐV©†w]ýL(Èàæuá·M’$I’Tn†¶ä0´ ÉÐV©úW­Œ~¦¤zúáðÛ&I’$I*7C[rÚdh«T“?ýL(Lûз‡ß7I’$IR™ÚÃЀ$C[¥jø«ÑÏ€ÂtÏþtø}“$I’¤Y¨µr—ºsŸԽK¿Z÷¯9(üÏSB†¶ä0´ ÉÐVÛRµùžè§ @A?>)ü¶I’$IÒÔ[úòº}ø;êîûÔƒ¬©Gn¬ëjôV=zKüŸ±€ mÈah @’¡­¶¥ÁÍ뢟*©6ß~Û$I’$i¢-,©Û‡ýfÝ=ã/êþú#êÑêzØÛúÏJOÞÿç. C[rÚdh«m©wᢟ*…iòoÂï›$I’$«Ö×ÞTwÖ~¸î]¾¬Þv^]µžÈþ9©zêçáÿ%dh @C[’ mµ-uŽÝ#ú©P˜î™Ÿ ¿o’$I’ôRjíûêg~_Ö»àsõàÇ'Õ£G7Žå礪³9üŸ­„ mÈah @’¡­¶©å;Õõ°ý\(È–ÿ~ß$I’$)ÕÒ—×íÃßQwÏØ§î_ÿzôÐëºMè¥nü?oÚÃЀ$C[mk£‡nˆ~®¤úÅýá·M’$I’ž_ëkoª»ëözfT;¼÷šºî·§ú³ÒâÂáÿšž¡-9 mH2´Õ¶Ößptôs 0­Õo ¿o’$I’æ{TÛYûáºwù²zxÛyuÕz<úǤzqÅ«Âÿ½4=C[ø?ìÝ‹¿_u}çûr‹8Z­Ø{F«ci§Ósôœ£R{¦£sz¦“¶ö¢ã´¢¶£N§“zÆjk“ „€@ˆ‚MP $Hˆ¹@¹1„È=\’½~÷µ¾ç±Ã J¹¬¬dïýù­µžÏÇãõÀZ¿Ï/ðÎÞ ¨ÀЀR†¶ÚÕzç}4úq azçÿyø}“$I’ÔŽ²¯L݇¥þºÙi¸ieÊ·mNã(;êÕáÿ¬êž¡-UÚPÊÐV»Z礷E?®4ÌðÖUá÷M’$IR›»oê,;4õÖž—¦üÁ›RÊG©²%oˆÿçWó m¨ÂЀR†¶Úåæì•ŠÎöèG€)ž~0þ¾I’$Iª}Ù’CRwÕ¬4¸ú˜4Úº!¥A'ÕUç„7‡ÿó¬{†¶Tah @)C[Uit÷¥Ñ, Ó9ñ-á÷M’$IR}ʽ*uO_ꯟ—F[Ö¦bâÑÔ$e¿þϸîÚP…¡-¥ mU¥Á·F?²4Lï‚ÿ~ß$I’$i H݇¥þºÙi¸ieÊ·mN©(R“u¾ðŽøî5ÏЀ* m(eh«*uÏüèG€†~ç+á÷M’$IÒ4wßÔYvhê­9< 6.M£­RõSÛtOýõø5ÏЀ* m(eh«*e‹_ýÈÐ0ÅÓ…ß7I’$I3_¶äÔ]5+õ×ÏK£»/KiEÿñd,tOÿ×áÿnêž¡-UÚPÊÐVU+ž¼7ú± a:KÿYø}“$I’4}e‹NÝÓß÷̨vËÚTL<ýDZ5ù¥¢ÿ}Õ=C[ª0´ ”¡­ª6¼muôc @Ãô.üDø}“$I’4E-8 uW–úëf§á¦•)ß¶9¥¢ˆþcGmôV0þßaÍ3´  C[JÚªjý‹Žˆ~lh˜É¿Ä}ß$I’$íFs÷Ie‡¦ÞšÃÓ`ãÒ4Úº!¥Q?úµÖ[ó‘ø¯5ÏЀ* m(eh«ªuV¼;ú± aЉmibÎ^á7N’$IÒK—-9$uWÍJýõóÒèîËRdÑœhœÞ…ÿ÷\÷ m¨ÂЀR†¶ªÜüýS ¢]fò§`…ß8I’$IÏ–ý3©ûåß~fT{çºTdEÿ±¡úëf‡ÿ»¯{†¶Tah @)C[íNùƒ7E?º4Lí_†ß7I’$©µÍ{Yêœòö#Ïᦕ)ß¶9¥¢ˆþcB+õ/:"þy¨y†¶Tah @)C[íNƒN‰~th˜Éÿ}ß$I’¤V4wŸ¿Q¢·æð4ظ4¶nHiØ‹þ#ÿCÿâÿÿŒÔ–†›V¦|Ûæ”Š<úk8cdpõ’øç´æÚP…¡-¥ mµ'OÞýÐ0£{¯ ¿o’$IÒT•ÿ¦Ô[sxl\šF[7¤4ìFåfÌ ®ùløs[÷ m¨ÂЀR†¶Ú“†·­Ž~„hšQ?M,8 üÆI’$IUË–’º«f¥þúyi´em*:OD»¦†מþ,×=C[ª0´ ”¡­ö¤þEGD?Â4P÷Œß ¿q’$IÒK•-<0uW–úëf§á¦•©Ø~Oô×hbpݲðç»îÚP…¡-¥ mµ'uV¼;ú Ž ¿q’$IÒ³ÍÝ7u–šzkO×§|Ûæ”Š<úk3 5¸áäøg¾æÚP…¡-¥ mµGùÓ;Å7L¥üÁ›ãoœ$I’Z[vü›vŽj—¦ÑÖ ) »Ñ_‘i‘á·ÿ!ü¨{†¶Tah @)C[íiùƒ7E?Æ4M‘§ìèŸ ¿q’$Ij~Ù’CRwÕ¬Ô_?/¶¬MEöxô·aZnxÓ©áïEÝ3´  C[JÚjO›üuv0Õzgÿaø“$IR³Ê˜º+Kýu³ÓpÓÊTlÿAô×^xžáͧ…¿+uÏЀ* m(eh«=­wÞG£chpÃ)á7N’$I5n³ìÐÔ[sxÞ¸<åÛ6ïüÍ 0î&GàáïOÍ3´  C[JÚjOëœô¶èǀʻ3üÆI’$©>eKI½ÕHƒKÓh놔说°[†·žþ>Õ=C[ª0´ ”¡­ö¸9{¥¢³=úQ ²ãþ—ø;'I’¤±ÕvWÍJýõóÒhËÚTdGu…)3üÎYáïXÝ3´  C[JÚj*ÝuIô£ @õÎûÓð'I’¤Ø²…¥î—~3õ/ýtÝþµTüèþ诩0­†›¾þÞÕ=C[ª0´ ”¡­¦¢Áó£eÈÿ`–$IjYs÷Me‡¦ÞšÃÓ`ãÒ”?xSJEýµfÔð–ÓãßÅšgh @†¶”2´ÕTÔ]ùo¢e¨xúÁ41g¯ð;'I’¤ihÎ^©³ô­©wî‡Ó`ãI)¿ïº”†Ý诠nxó—âßÏšgh @†¶”2´ÕT”-zUJEý8Ð@ÏýJø“$IÒž—óúÔ]5+õ×ÏK£-kS‘=ýUÆÒðÆáïkÝ3´  C[JÚjªÊ»#úq úßüëð'I’¤je ^™º+Kýu³ÓpÓÊ”oÛýµjcøí/„¿ÃuÏЀ* m(eh«©jxËÑ3 4úþ7Ãoœ$I’^¢¹û¦Î²CSoÍái°qiʼ)¥|ý5jkpÃÉñïuÍ3´  C[JÚjªê]ø‰èÇ€&tÒÄüýÃïœ$I’ž)[rHꮚ•W“F[7¤4È¢¿1B£ ®[þž×=C[ª0´ ”¡­¦ªÎçÿEôã @CuO{oø“$IjcÙ¢W¥îéïKýõóÒhËÚTL<ýÕopí‰áï~Ý3´  C[JÚjÊš»O*ú;¢ihò§¥…ß9I’¤¦·à€Ô]qXꯛ†›V¦|Ûæ”Š"ú« ´Îàšãã?jž¡-UÚPÊÐVSÙèž+¢i(è–ð'I’Ô¨æî“:ËM½5‡§ÁÆ¥i´uCJ£~ô×>`rh»áØøÏˆšgh @†¶”2´ÕT6¸êèèG€&*Š”óúð;'I’Tײ%‡¤îªY©¿~^Ý}YJƒ,úð"W-ÿ̨{†¶Tah @)C[MeÝ37ú‘ ¡zçþIø“$IªCÙ¢ƒSwÅa©ɧÒhËÚTLl‹þ*T0¸ò¨ðÏ‘ºgh @†¶”2´ÕT–-~]ô# @C o9#üÎI’$] xfT»nvnZ™òm›wþ6 ¾ßZÿÙRó m¨ÂЀR†¶šêò'îŽ~¬h bÇÃibÎ^áwN’$)¬¹û¤Î²CSoÍái°qimÝÒ¨ý5 ˜býõóâ?ojž¡-UÚPÊÐVSÝðÖ3£kªó¹_ ¿s’$I3U¶äÔ]5kçènt÷e)õ'¢¿Ž3 ùœðÏŸºgh @†¶”2´ÕT×ÿú_E?Ö4Tÿ›~ç$I’¦£lÑÁ©»â°Ô¿äSi´em*&¶Eõ‚ô/û»ðϤºgh @†¶”2´ÕT×ùÂ;¢kjôýo†ß9I’¤=nÞËRç”·§þºÙi¸ieÊ·mN©(¢¿jc¢é§ã?§jž¡-UÚPÊÐVSÞ¼—¥4èD?Ú4Ñ “&Žüéø['I’´«ÍÝ'u>÷ÏSïü?O×§ü¡M)åÃèoUÀë_üÉøÏ®šgh @†¶”2´Õt4Úzuô£ @CuO_ø“$Iz±²%‡¤îªY©¿~^mY›ŠÎöè¯O@Íô¿ñ_Â?Ëêž¡-UÚPÊÐVÓÑ`ñÑ6 5¸zIø“$Iš,[xPê®8,õ×ÍÞ9ê*v<ýU h€Þÿ1üó­îÚP…¡-¥ m5õ¾òÑ6 •?|kø“$I-lÞËRgÙ¡©wÁÇÒpÓÊ”oÛœRQD5¨wî‡ã?ójž¡-UÚPÊÐVÓõ«2`ZEÊŽý¹ð['I’ÜÜ}žÕ®9< 6.M£­Rö¢¿-Ñ;ûâ?kž¡-UÚPÊÐVÓUñÔ£oª÷µ? ¿s’$©YY´»jVꯟ—F[Ö¦¢³=úëÐb“ŸGÑŸ‹uÏЀ* m(eh«éjxÛêèÇ€†n>7üÎI’¤z–-<(uW–úëfïb;ŽþjðÝÓÞþYY÷ m¨ÂЀR†¶š®úýxÐPEïG¾ÃH’¤òæ½,u–šz|, 7­Lù¶Í)yôW€—4ù—Â??kž¡-UÚPÊHEÓUgù;£o¬{ꯇß:I’4^eÇ¿)õÖž—¦ÑÖ ) »Ñ_Y*ëœòöðÏÓºgh @†¶”2´Õ´uäËSö¢qjpåQñ·N’$…•-9$uWÍJýõóÒhËÚTtžˆþz0%&wôglÝ3´  C[JÚj:Ëï».ú ¡òo¿s’$ifʸóW©÷×ÍNÃM+S±ýžè¯"Ófò§sGîÖ=C[ª0´ ”¡­¦³Áµ'F?â4UQìüIvÑ·N’$Mqs÷ÝùÓ{kO×§|Ûæ”Š<ú›ÀŒÉ–¼!þ³¸æÚP…¡-¥ m5õÎùwÑ8 Ö;ï£á·N’$íY“q¦·úi°qimÝÒ°ý TvÔ«Ã?›ëž¡-UÚPÊÐVÓYvÜ£qlxÛÙá·N’$UÕvWÍJýõóÒhËÚTdG;ó÷ÿ¼®{†¶Tah @)C[Mwň~Ìh¨¢³=MÌÝ'üÖI’¤ç—-<0uW–úëf§á¦•©Øþƒè¯µ01gïðÏðºgh @†¶”2´Õt7¼ý¼èÇ€ë,Wø­“$©õÍÝ7u–šzkO×§|Ûæ”Š<úk@ý {ñŸé ÈЀ* m(eh«é®ñ'£slpÅüð['IRÛÊ–’z«?—¦ÑÖ ) :Ñ_ ¡è>þß„ m¨ÂÐnÇW IDAT€R†¶šîº§¾'ú1 Áò¾~ë$Ijú¨¶»jVꯟ—F[Ö¦"{,úü4V±ãáðÏý&dh @†¶”2´Õ´7ÿ”FƒèG€¦*ò”-~]ü½“$©e LÝ/ýfê_ò©4¼ý¼TüèþèKÐ*Å“÷†ß‚&dh @†¶”2´ÕL4ùÓ`ºôÖ~ë$Iª]ó^–:_xGê¯ýË4¼åô”o»}ç_` NþÈmñ÷¡ÚP…¡-¥ m5 ®=1úQ Á†·­¿u’${Ù’CRwÕ¬4¸ú˜4Úº!¥A'ú„ðŒ~xMø½hB†¶Tah @)C[ÍD½³ÿ(úQ ÁŠîS¾ÓH’ôe‹^•º§¿/õ×ÏK£-kS‘=}®Ø£;×…ß&dh @†¶”2JÑL”óúèG€†ë~é7Ãï$Ie ^™º+Kýu³ÓpÓÊ”oÛ}–ØMÃÛο+MÈЀ* m(eh«™ªØ~Oôã@ƒ ®ùlø­“$iÚ›»oê,;4õÖž—¦üÁ›RÊGÑg€)2¼qyü­i@†¶Tah @)C[ÍTÃ[WE?î4XþØá·N’¤©.[rHꮚ•W“F[7¤4È¢O.Óh°áØðÛÓ„ m¨ÂЀR†¶š©z~"úq á:'¾%üÞI’´»e‹^•º§¿/õ×ÏK£-kS1ñhôi`†õ/ÿûð{Ô„ m¨ÂЀR†¶š©:ŸÿÕèÇ€†ë_tDø½“$i—Zp@ê®8,õ×ÍNÃM+S¾msJE}J6yÂoT2´  C[JÚjÆš³w*ºOE?ò4Øè—Çß;I’^¢þ%ŸJù#·¥”¢Ï&c¨wÞŸ†ßª&dh @†¶”2´ÕL6ºëâèG€& vþÚíè{'IÒ‹•ßw]ôµ`Œu¿òûá·ª ÚP…¡-¥ m5“õ/ŸýÈÐp½Õ¿w’$½XùcwDŸJÆX÷´÷†ßª&dh @†¶”2´ÕLÖ=í_E?ò4Üð–3Âï$I/V±ã‘èS Àë|áÿ¿UMÈЀ* m(eh«mÁ)åÃèÇ€+&Ms÷‰¿y’$½@iØ‹>•Œ±ÎÒ·†ßª&dh @†¶”2´ÕL—?xSôc@Ãu–¿+üÞI’ô¼æï}"sÙ1¯¿W ÈЀ* m(eh«™n°ñ¤èÇ€†\¹(üÞI’ôË–}"só_~¯š¡-UÚPÊÐV3]oõ£{.ø;á÷N’¤\ç¤_Š>‘Œ³|~«š’¡-UÚPÊÐV3]vìÏG?ö´@öÙ_¿y’$ýdåïŒ>Œ±¢óDø­jJ†¶Tah @)C[ET<¹5úÑ áúëf‡ß;I’~²î—;ú<0ÆŠí÷„ߪ¦dh @†¶”2´UDÃï|%úÑ áF÷\~ï$IúÉzçýiôy`Œå|;üV5%C[ª0´ ”¡­"êý?G?ú4]>JÙÑ?~ó$IúŸõ/ù›èëÀÝyQø­jJ†¶Tah @)C[EÔ9ù×¢}Z ·æ#á7O’¤ÿÙ`Ãqѧ€16Üôåð[Õ” m¨ÂЀR†¶ iî>©è>ýøÐpÃÛÏ‹¿y’$ý†·œ}cƒkŽ¿UMÉЀ* m(eh«¨Fw_ýøÐtƒ,MÌEøÍ“$i²Ñë¢/#c¬Ù߅ߪ¦dh @†¶”2´UTýõó¢Z {æï„ß‹Œ±îW~?üV5%C[ª0´ ”¡­¢Ê˜R>Š~h¸bb[š˜³wøÝ“$©èïˆ>‹Œ±î#üV5%C[ª0´ ”¡­"ËÚý ÐÝS=üæI’Ú]¶ð èsÀ˜ëœôKá÷ª)ÚP…¡-¥ mÙàúÏG¿´À`Ãqá7O’Ôî&ÇSðR²Å¯ ¿WMÉЀ* m(eh«Èz_ý÷ѯ-?qWøÍ“$µ»îiï>‡Œ³"Os÷ ¿WMÉЀ* m(eh«È²ãÞý Ðe¿~÷$Ií­·æ#ѧ€1Vd‡ßª&eh @†¶”2´UtÅî~ hþe~ó$Ií­é§£O!c,ìŽð[Õ¤ m¨ÂЀR†¶ŠnxÛêè׀ȼ9üæI’ÚÛàúÏGŸBÆØhë†ð[Õ¤ m¨ÂЀR†¶Š®ÿÿýÐÞ~÷$Iílô½ó£Ï clòNDߪ&eh @†¶”2´UtSþ÷è×€–è_üÉð»'Ijgùߎ>ƒŒ±áM§†ßª&eh @†¶”2´Uxs÷MEGô«@ ä÷_÷$I­¬øÑÑg€16¸ú˜ð[Õ¤ m¨ÂЀR†¶‡Fw]ý*ÐE‘²ãÞ~÷$I-ëÈ—§TäÑW€1Öÿæ_Çß«eh @†¶”2´Õ8Ô¿ì3ѯ-Ñ¿èˆð»'IjW¥o>Œ¹Þ9ÿ.ü^5)C[ª0´ ”¡­Æ¡î©ï‰~h‰Ñ¯ ¿{’¤vÕ=ãÿ‰>Œ¹Éÿ6}¯š”¡-UÚPÊÐVcó«Tè×€6(ò”-yCüí“$µ¦Þ…¾~Œ¹ìø7…ß«&eh @†¶”2´Õ¸4ºç[ѯ-Ñÿú_…ß=IR{\µ8úô0æ&æï~¯š”¡-UÚPÊÐVãÒàŠùѯ-1ù—;¢ïž$©= o;;úô0ÆŠÎá·ªiÚP…¡-¥ m5.uO{oôë@[yÊ–~û$Ií(¿ÿúèËÀ˹-üV5-C[ª0´ ”¡­Æ¦ù¯HiÔ~%h‰Þ…Ÿˆ¿}’¤VTLl‹>{Œ±Ñ]‡ßª¦eh @†¶”2´Õ85úáµÑ¯-1ºû²ð»'Ij~ÙÂS*Šè³ÀÞrzø½jZ†¶Tah @)C[Sƒ«G¿´E>LÙâ׆ß>IR³ë|áÑ€17¸rQø½jZ†¶Tah @)C[SÝ•ÿ&ú• Ez~"üöI’š]ïÜ?‰>wŒ¹þÚÿ~¯š–¡-UÚPÊÐVc÷kUóaôk@KŒî½2üöI’šÝà[ ¢Ïc®{Öï…ß«¦eh @†¶”2´Õ¸•?pcôk@[yÊŽý¹ðÛ'Ijn†>”é|áá÷ªi¹¿Tah @)C[[ƒkŽ~-h‘þEG„ß>IRsËþNô©`ÌeKÞ~¯š–¡-UÚPÊÐVãÖä¯Ë€™’ß}øí“$5´9{§4èDŸ:ÆY>Js÷‰¿Y ËЀ* m(eh«q+;êÕ;•7̔Π¿~ÿ$IÍ+;þŸFŸ8Æ\ñôƒá÷ª‰ÚP…¡-¥ m5ŽùõªÌ¤þ¥~û$IÍ«»òÿ>qŒ¹üÃïU3´  C[JÚj\·,úÕ E&ÿ‚Gôí“$5¯þÅŸŒ>qŒ¹Ñ– ÃïU3´  C[JÚjë­þ@ô«@Ët–ýrøý“$5«á­gFŸ7ÆÜ`ãIá÷ª‰ÚP…¡-¥ m5Že‹_—RQD¿´ÈàŠùá÷O’Ô¬òGn‹>oŒ¹þEÿ-ü^51C[ª0´ ”¡­ÆµüÑ-ѯ-’?qwøí“$5¨yû¥4êGŸ7Æ\÷¬÷Ç߬fh @†¶”2´Õ¸6¼qyôë@ËtNy{øý“$5£ÎçÿEôY &ïEôÍjb†¶Tah @)C[k½sÿ$úõ e×|6üþI’šQoÍG¢Ï5-:8üf51C[ª0´ ”¡­ÆµìØŸ~=h™bÇ#ibî¾á7P’TÿŽ‹>kŒ¹¢³=ü^55C[ª0´ ”¡­Æ¹bû¢_Z¦{Æo…ß?IRýÝuIôI`ÌåÞ~¯šš¡-UÚPÊÐVãÜðæÓ¢_Zfxë™á÷O’TÿЉG£Ocnxûyá÷ª©ÚP…¡-¥ m5Îõ¾ö¢_Úf¥láá7P’Tß²ãß}ͨÁ5Ÿ ¿YMÍЀ* m(eh«qÎÿ  BoÍGÂo $©¾õÎùPô) ú_ÿ«ð›ÕÔ m¨ÂЀR†¶÷Чî‹~Mh™ÑÝ—…ß?IR}\{Bô) º«þmøÍjj†¶Tah @)C[{ÃïœýšÐ6Ež²c>üJ’êÙè‡×D_2j ³ìÐð›ÕÔ m¨ÂЀR†¶÷z~<ú5 …ú—üMø ”$Õ°¹û¦ÔŸˆ>cÔÀÄ‚âïVC3´  C[JÚjÜëœô¶è׀ʷÝ~%Iõ«sòÿ}¨bb[øÍjr†¶Tah @)C[}söJÅŽG¢_Z¨sò¯ÅßAIR­ò9Øùýׇ߬&gh @†¶”2´UòLj0¸ö„ð(IªWÛ¿}¾¨ám«ÃoV“óߨÂЀR†¶ªCýµýªÐB“?QÝw%IR•òÇ¿}¾¨ÁU‹ÃoV“3´  C[J¨uNú¥èW€–êžõþð;(IªGÙ’C¢Ï5ÑûÚŸ…ß­&gh @†¶”2´U]*~ô@ôë@ ¶¬ ¿’¤zÔ;çCÑg €šè¬xwøÝjr†¶Tah @)C[Õ¥á­gF¿.´Q>LÙ’7„ßAIÒø7¸áäè«@MdG¿&ün59C[ª0´ ”¡­êRïü?~]h©þ¥Ÿ¿ƒ’¤ñ/ä»Ñ' €(:O„߬¦gh @†¶”2´U]Ê>û ѯ -•?vgš˜³Wø-”$oÙQ¯N©È£O50úáµáw«éÚP…¡-¥ mU§Ší÷D¿2´T÷Ô÷„ßAIÒøÖ=ëýѧ €šÞü¥ð»Õô m¨ÂЀR†¶ªSÛ¾ýÊÐRÃ[N¿ƒ’¤ñmpí ѧ €šè_ò©ð»Õô m¨ÂЀR†¶ªS½sÿ$ú• ­ú)[xPø-”$gù#ß¾TÔD÷¬ß ¿[MÏЀ* m(eh«:•ó³)Eôk@KõÎÿ‹ð[(I¿²cΟSØe“Þ~»šž¡-UÚPÊÐVu+ßv{ôk@Kå÷m ¿ƒ’¤ñ«÷µ?‹>QÔE>Lóö ¿]MÏЀ* m(eh«º5¸þóѯ -ÖùÜ?¿…’¤ñʘ€]•?vgøÝjCn3UÚPÊÐVu«÷•?ˆ~mh±Á '‡ßBIÒ5wŸTtžˆ>OÔÄhËÚøÛÕ‚ m¨ÂЀR†¶ª[ÙQ¯N©È£_Zªè=²…†ßCIÒxÔYþ®èÓ@ 6~»Ú¡-UÚPÊÐVu,ðæèW€ë]ð±ð[(IW}–¨‘Þù~»Ú¡-UÚPÊÐVulò§@”ü¡Má·P’4å÷]}–¨‘î©ï ¿]mÈЀ* m(eh«:ÖýòoG¿:´\gù;Ãï¡$)¶ì˜×§TäÑ' €É¿.ü~µ!C[ª0´ ”¡­êX¶à•)úѯ-6¼åŒð{(IŠ­wÁÇ¢Ï5Rt¶‡ß®¶dh @†¶”2´U]Ý{Uôë@› :);ú5á÷P’×讋£¯52º÷ÊðÛÕ– m¨ÂЀR†¶ªkýËÿ>úõ åúßüëð{(IŠ)[t°ß²@%ƒë?~¿Ú’¡-UÚPÊÐVu­³üѯ-—?qWš˜³WøM”$Í|½¯þqô fz|,ü~µ%C[ª0´ ”¡­jÛÜ}RÑ}2ú åº§ÿëø›(Išñ x¨ª³ü]á÷«-¹ÓTah @)C[Õ¹Ñí_‹~…h¹Ñß¿‡’¤îÈ—§¢÷tô  NŠ"e Œ¿a-ÉЀ* m(eh«:×_ûŸ¢_!Ú®ÈSçÄ·„ßDIÒÌÕ]5+úúP3Åö„߯6eh @†¶”2´Uëœð‹Ñ¯¤ÁuËÂo¢$iæÞzfôé f&+SôýjS†¶Tah @)C[Õ½bû=ѯ-7ùëóE‡ßDIÒ ´à€TôwDŸjfpÅüøÖ¢ m¨ÂЀR†¶ª{ÃWD¿Fú~%IÓ_ïÜGŸj¨wö…ß°6eh @†¶”2´UÝë­þ`ôk©xòÞ41wŸð»(IšÞFßÿfôÉ †:Kß~ÃÚ”¡-UÚPÊÐVu/;ú5)yô«©{Öï…ßEIÒô•-~]Jù0úÜP7ƒŽ¿”7ÃÚP…¡-¥ mÕ„òoŠ~• î¹"ü&J’¦¯þºÿ}j¨¡üo‡ß°¶eh @†¶”2´U\µ8úU€:ŸÿÕð»(Išžòûoˆ>3ÔÐðæÓÂoXÛ2´  C[JÚª uOûWѯì4Ü´2ü.J’¦¾ÎÒ·FŸjªÑ ¿cmËЀ* m(eh«FtäËSêOD¿NÒh²ÏþBüm”$Miƒ«—D_jjò/ˆGß±¶eh @†¶”2´USÝuqôë; ®=1ü.J’¦°yû¥bb[ôy ¦²Å¯¿e-ËЀ* m(eh«¦Ô¿èˆè× v*ú;RvÔ«Ão£$ijê­þ`ôi ¦Š=~ÇÚ˜¡-UÚPÊÐVM©³ìÐè× žÕ¿|Nøm”$MM£¬>+ÔÔè{ç‡ß±6fh @†¶”2´U“*žúaô+;ÙãibÁá·Q’´guNxsJE}V¨©þeŸ ¿emÌЀ* m(eh«&5¼qEô+Ïê¯ýËðÛ(IÚ³Ž‹>'ÔX÷Œß ¿emÌЀ* m(eh«&Õ;û£_)xV±ýž41wßðû(IÚÍæí—Š‰mÑ瀺*Š”ýšø{Ö m¨ÂЀR†¶jRÙ¢ƒSʇѯ<«w·Âï£$i÷ê}õßGŸêþïÆàžµ1C[ª0´ ”¡­šÖhëÕѯ<+ß¶9MÌÙ;ü>J’ª—ß}ô Æ†ß='ü–µ5C[ª0´ ”¡­šVÿ²ÏD¿Vð½³ÿ0ü>J’ªÕýÒ¿Œ>Ô\ÿâO†ß³¶fh @†¶”2´UÓê|áѯ¨¹É¿´}ÏÚš¡-UÚPÊÐVkÎÞ©˜ØýjÀstÏzü”$íR¥ÿ,¥">ÔYQ¤lÑÁá7­­ÚP…¡-¥ mÕĆ·®Š~µà9ò‡6¥‰9{…ßHIRyÃWDŸ j.tKø=ks†¶Tah @)C[5±Þ¹Ž~µàyºgþnø”$½tÙâ×¥4èDŸ jn¸éËá7­ÍÚP…¡-¥ mÕIJůõ«^;ùC·ø©¶’4æ ®˜}.h€þºÙá7­ÍÚP…¡-¥ mÕÔòoŠ~½àyº«f…ßHIÒ —-xe*²Ç¢O Ð]qXø]ks†¶Tah @)C[5µÁ•‹¢_/xžüá契9{‡ßIIÒóë_ú·Ñg€&ÈGibÁáw­ÍÚP…¡-¥ mÕÔº§¾'úõ€Ô;çCáwR’ô?ÍvâÑè@äß~×Úž¡-UÚPÊÐVmè>ýŠÀóäßw0I³ú—}&ú<ÐÛ¾~×Úž¡-UÚPÊÈCMnøÝs¢_1xA½ ?~'%IÏ”-<('¢O Ñ;ïOÃo[Û3´  C[JÚªÉõÖ|$ú€T<ýPš˜ÿŠð[)Iú©Ô¿|NôY A:'¾%ü¶µ=C[ª0´ ”¡­š\vôϤ”¢_3xAýK?~+%©íe‹öÓl˜2EöXš˜³Wø}k{†¶Tah @)C[5½ü¾Ñ¯¼ ¢³=eGý“ð[)Im®¿~^ô9 AFß;?ü¶ÉЀj m(eh«¦×¿ì3ѯ¼¨ÁÕKÂo¥$µµì˜×§¢÷tô) Aúÿ÷ðû&C[ª1´ ”¡­š^çä_‹~ÍàÅú©sÂ/†ßKIjcÛN¾4Lgù;Ãï› m¨ÆÐ€R†¶jCÅS?Œ~ÕàEMþOàè[)Im«óù_M)EŸšdÐIóö ¿q2´ C[JÚª o\ýªÀKê~ñ7Âï¥$µ©Ñ]—DôÐ0£­W‡ß7=“¡-UÚPÊÐVm¨{æïF¿jð’ò‡nIsö¿™’Ô†º«fEìÐ@ƒ«Ž¿qz&C[ª0´ ”¡­ZÑüýwþú>g½¯ý‡ø›)IMoî¾)ß¶9ú#€ê®ú·ñwN;3´  C[JÚª-î¼(úu€—Tìx$e  ¿™’Ôäú_ÿ«è{š¨(RvÔ«ÃÉЀ* m(eh«¶ÔÿúŽ~Ý ÔàÊ£Âo¦$5µlñkS‘=ýQ@åÛn¿súq†¶Tah @)C[µ¥ì¸7F¿nPnÔO“Þ~7%©‰ 7}9úS€†Þ¸"üÎé'n¾¡-ÚPÊÐVm*ß¶9ú•€R£»/ ¿™’Ô´º_ü¿wþZo˜½ó>~ëôã m¨ÂЀR†¶jSƒ«—D¿r°Kzç|(ünJRc:òå)tKôG; Ö9áÍñ÷NÏfh @†¶”2´U›ê~ñ7¢_9Ø%ÅÓ¥lÑÁá·S’šÐàŠùÑë4X±ãáð[§çfh @†¶”2´U«š»O*²Ç¢_;Ø%ƒ'ÅßNIªy¥oMiØþH Á†ß9+üÞé¹ÚP…¡-¥ mÕ¶†›VF¿v°kн`†¶Tah @)C[µµþ%ŸŠ~ý ²Ñ½W¥‰9{‡ßQIÇ7œý1 @‹ ®ÿ\øíÓ gh @†¶”2´U[ëœô¶è×vKÿÒ¿ ¿£’4nuÏzÿÎ_á 3¥û•ß¿zá m¨ÂЀR†¶js~­,µ”Sçþ¯ð;*IãRç„_LE÷©èOgÚ$¥ì¨~õÂÚP…¡-¥ mÕæW/‰~`·äOÜ•²…†ßRI ïÈŸNùC·D,Ð2ù7Æß@½h†¶Tah @)C[µ¹ÎŠwG¿‚°Û†7.¿¥’Ýð–Ó£?Žh¡ÁÕÇ„ß@½Ä÷C[*0´ ”¡­ZÝœ½S±ãáè×v[oõâï©$Õ»ðãÑôT÷Œß ¿ƒzñ m¨ÂЀR†¶j{Û¾ýÀn+²ÇSvÜÃï©$ÍtSÞžÒ°ý1 @úibÁá·P/ž¡-UÚPÊÐVm¯{æïD¿†°Gòû¯Oóö ¿©’4SeG½:OÞýñ @KîùVø-ÔKgh @†¶”2´U뛿*ú;¢_EØ#ƒë–ÅßTIš‰æí—F÷^ý± @‹õ/ù›ø{¨—ÌЀ* m¸ÂÕ IDAT(eh+MþÇ÷s¢_EØc½s?~S%iZ›³WnZýq @Ëu>÷+ñ7Q/™¡-UÚPÊÐVú©Ô[ýÁèWöØäOhïœôKáwU’¦«þú¹Ñµ´\ñ£ûwþÅ蛨—ÎЀ* m(eh+ýTʼ2¥A'úu€=–?òÝw-ú¶JÒT×ûê§Tѳ´ÜðÆåá7QåÚP…¡-¥ m¥g}ïüèצÄè{¤‰9{‡ßVIšªº§þzJÃ^ôÇ+¤îY¿~Už¡-UÚPÊÐVz¦Þ¹Ž~`Ê ¾µ ü¶JÒT”ÿ¦TL<ý± )ú)[x`ømTy†¶Tah @)C[陲Eïü&ÐE‘z«?~_%iOÊŽùÙ”?þýèOTØiôƒËÃo£v-C[ª0´ ”¡­ôãFw®‹~%`ê :©ó…w„ßWIÚ²E¯JùC·D’À³úßüÿÂï£v-C[ª0´ ”¡­ôãz_û³èW¦TñÔS¶ä á7V’ª”-<(å÷ßý ÏÑYvhøÔ®eh @†¶”2´•~\vôkRʇѯ%L©ü‘ï¦lÑÁáwV’v©ùû§Ñ=ߊþè€ç(ž¼7þFj—3´  C[JÚJÏmt÷eѯ%L¹Ñ=W¤‰yû…ßYIzÉæí—Fw|#ú#žgpÃÉñwR»œ¡-UÚPÊÐVzn½ ?ýZÀ´Þzfš˜³Wø­•¤lî>iøÝs¢?*àuWÍŠ¿•Úå m¨ÂЀR†¶ÒsËŽùÙ”òQô« ÓbpÅ‘á·V’^pd{ëªèHxaÃnšXp@ü½Ô.gh @†¶”2´•žßèÞ«¢_M˜6ý‹Ž¿µ’ôlóö3†`¬îº8þ^ªR¾[P…¡-¥ m¥ç×_7;úÕ€éSä©·æðð{+Ió÷O£;×E*ÀKê¯û¯ñ7S•2´  C[JÚJÏ/;öçR*ŠèצO>J½Õ¿¹’ZÜ‚ÒèîË¢?  Tvü?¿›ª”¡-UÚPÊÐVzáòû6F¿ž0½†½Ô=ý}á7WRûÊŽ~MÊøvô§ ”ʺ%ünªz†¶Tah @)C[é…›üµ€Ðxý‰Ô=õ=áwWR{ÊŽy}Êùnô§ì’þåsÂo§ªgh @†¶”2´•^¸lÉR*òèW¦]Ñßal+iFšüÕÛùwEìÀ.ë|îWÂ離gh @†¶”2´•^¼Ñ=ߊ~E`f ²ÔýÒo†ß^IÍ­³ü©ØñHô§ì²É¿}?µ{ÚP…¡-¥ m¥¯wá'¢_Q˜9ƶ’¦©ÞÙ”Ò ý)• ®^~Cµ{ÚP…¡-¥ m¥/[üÚ”òaôk 3¦èïHÝ/ýËð,©!ÍÙ+õ/Ÿ“RQD¼@eå¥Ú­ m¨ÂЀR†¶ÒK7ºëâè×fÖ°—ºg½?üKÿ{wté]×y¿:+!IX”G¢ (ʨŒë”ˆ "%Ì0ðèÌàèLáãŒ3HïÝYHÈž:é,$!+„„$: dOȾï['éNºÏ~Îu}§ú¦ôÁ1æê«û¾Ï÷\ç¼^Uïÿ´ÊÂþýÎ}~|úî–šÝÒ]bxãÚì ¶I¹é±h-Þ!ÿóTÛ”¡-uÚPÉÐVzñzgÿYö1€ñõ£wÚ‡Ò?‡%5³öê½btÿeÙ7l³ÁÕG¦žjÛ3´ C[*ÚJ/^{Õs¿ÙfN1šû 'ÙŸÅ’šUçð·Fñì=Ù7l—îñïNÿLÕ¶gh @†¶T2´•ªÝ~nöQ€eýoþ÷ôÏbIͨwæÇ"íì› ¶KÙÙàÍ´áÚP‡¡-•<KÕõ¾úï²*¤\uh´ïþ™,iB[¶k ®:$ûª€y1¼ñÄüÏVmW†¶Ôah @%C[i+ZþÒˆ~+û¸@ªÑmgGkùnùŸË’&ªöoˆâ‘«³¯(˜7ݯ| ýóUÛ—¡-uÚPÉÐVÚº†?8-û¸@ºâáïE{ŸW¥.KšŒº'ÿñÜ?¯ ScЉ֊ÝÓ?cµ}ÚP‡¡-• m¥­kËo3"Чn‹ö¯Oÿl–”Ø’bpÅe™}%À¼Ý~Nþ笶;C[ê0´ ’¡­´•-Û5ÊîsÙG&B¹éñèùKùŸÏ’Æ^ç 7Æè¡+²¯!X½Ó?œþY«íÏЀ: m¨dh+m}Ã×fY˜est×þaú糤1µxQôÎýdD¿•}ýÀ´£½âÇò?sµÝÚP‡¡-• m¥­¯»ö=ÙG&˨½3?–þ-iakø†ÝÿíìÔð§¥æj~2´ C[*ÚJ5Z²S”›ŸÈ>¶0q†×ãçJiJëö¡(;²¯Xpݓߟþ¹«ùÉЀ: m¨d!ÕkpÕ!ÙÇ&ÒèÁË£½ßO¤VKšŸÚû¾&F·Ÿ“}µÀX”ÝÑZ¶kúç¯æ'C[ê0´ ’¡­T¯ÎQïÈ>¶0±ÊçÎ1ïLÿ¼–´-^½³>eûéì+ÆfxýšüÏ`Í[†¶Ôah @%C[©~Å“·d]˜\Ã^ôÏÿTú絤úuÙ;F÷^œ}‹ÀØuÿ½ôÏaÍ_†¶Ôah @%C[©~ý‹?›}t`â o<1ZËwKÿÜ–´-iô/]1êg_0vek}´–ì”ÿy¬yËЀ: m¨dh+Õ¯}Àë#Ê"ûøÀÄ+½6:¿)ý³[Ò?_÷+ˆò¹‡³¯ H3øþéŸÇšß m¨ÃЀJ†¶Ò¶5zà;ÙÇšaЉþùŸŠÖâEéŸß’þÿÚ_ø™Ýu~ö é:Çþzúç²æ7C[ê0´ ’¡­´mõÎþóìã 2ºë‚hïÿÚôÏpiÖk¯|y ¾³jn³®|î!!l 3´ C[*ÚJÛ>P0N€zÊîÆèñ‘ôÏqi&[ºsôÎýd”›ŸÌ¾ `b ÖíŸÿ­yÏЀ: m¨dh+m{Ã[NÏ>ÂÐH[þ‹ïöê½Ò?Ë¥™hñ¢èö¡(ž½'ûèÀÄéùöüÏjÍ{†¶Ôah @%C[iÛëžô¾ì# þgz»kÞ•þy.MsÝ/ÿë(½&û¸ÀD*ž¾3ý³Z “¡-uÚPÉÐVÚŽ–îeë©ìc 6¼ù”hïÿÚüÏuiŠêþÖÝùìã mðíeéŸÙZ˜ m¨ÃЀJ†¶Òö5øÞaÙÇš¯ßŠþ¥K£µt—ôÏv©ÉuŽø…Þ¸6¢eŸj˜leƒÞ˜þÙ­…ÉЀ: m¨dh+m_/þJö1€©QÊ0=Êrî7r¶÷}Múg¼4ém¦î8/ûÔ@ãôÎúxúç¸.C[ê0´ ’¡­´ýõ/þlöQ€©Sv6Dÿ¼¿òóªô·xQtOz_/û˜@#•ýÍÑZ±{þgº,C[ê0´ ’á‚´ýµ?ÿSÅ(û8ÀT*ž¹;z_ýwÑZ¼Cúg¾”Ú²]ç~û^ñÄMÙÇmxýšüÏu-h†¶Ôah @%C[i~ÝuAöq€©VàuéŸûZø m¨ÃЀJ†¶ÒüÕ9ü­ÙGfVñØõs¿ ´µd§ôŸ ¤­©½zÏèûÉ=xyöñ€™0ºç¢ôÏ'C[ê0´ ’¡­4¿^›}¬`¦•îþEŸ‰öªW¤ÿ\ ý“–îÝ“Þ÷ÃñÇh}\`¦ôNÿpþÏK†¶Ôah @%C[i~ëŸ÷—ÙÇØ2¸í=ƒ«‰öç*ýç©sØ[b°n¿([ë³̤²û\´–ï–þ3Æ“¡-uÚPÉÐVšßÚ«öˆt²6ð÷FýÞ¸6:ÇþzúÏ š­:Gýr .[ÅÓwfŸ˜yÃk¾˜þ³Æ—¡-uÚPÉÐVšÿ†7œ}´€P¬¿#ú}&Úû¼*ýçMa‹wˆÎQïˆþ¥K£xú®ì?îÀèý«ù?+hlÚP‡¡-• m¥ù¯»æw³6ðb¹¿Ó=ᢵdÇôŸÔà–ìÝ5ïŠÁÕGF¹é±ì?ÙÀ (ž¼%ÿg5C[ê0´ ’¡­´-^å†û²7°¶Œ#—Ãß–ÿ3„Q{åË¢{ÊŸÄðú5Q¶ŸÉþ# Tèý¿¥ÿü ñfh @†¶T2´•¦þ¥K²7PSñÔ­Ñ¿tit{KúÏš ï£Þý‹>£{/Žõ³ÿ¨[©ìoŽöªWäÿ<¡±fh @†¶T2´•¦ö¯(‹ì#lÇ?1¼å/ÎtŽø…ôŸ+”ð³Üç2zgÿY pZ”í§³ÿ8Ûhxí±é?WhüÚP‡¡-• m¥…ktÏ…ÙG˜åÆbðýã{ü»£µt—ôŸ14ÿµW¾<º'¾7W4÷›€éÐ9ê—ÓÎÐø3´ C[*ÚJ WïÔfq`ž•½çctÛÙÑ?ï/£sпHÿyCÛþ¯ô¾úïcðý#¢xâæˆb”ýG ˜gÅ#ßOÿ™C9ÚP‡¡-• m¥léÎQnz<û˜ ¨Üp ¯=&z§ÿÛhïÿÚüŸ?ôO[²ctŽ|{ô¿þßbxóW¢|îáì?6ÀôÎúDþÏ!JÉЀ: m¨dh+-lƒËVfs`ŒŠgîŽáõ_ŽÞYÎAoLÿYdkþ§¢{òûcðíe1ºç¹ßB Ì–²³!ZËwKÿ¹D9ÚP‡¡-• m¥…ÿg‰ýSÄ0»ÊöÓ1ºëü¹Ñg÷¤?Šö¾¯Nÿùdª~Sí!{GïÔÆà»ûüpTÛz*ûÿåÀ\yPþÏ*JËЀ: m¨dh+-|£;ÎË>êÀ)Ÿä‡ãÛïî½Ó?ÃÞ­%;¥ÿÌ2±-Ù1Ú_ø™èžô¾è_ô™ÞtRß1ìfÿ¿˜DeC~6ÿg¥eh @†¶T2´•¾î‰ïÍ>êÀ¤õ£X{Œn?'ëö‹ÞÙÝc#Úû¿6ýg™±´ì%Ñ9øMÑ=þÝÑ?ï¯æ~ ÝèίGñôsÿÙl­Ñ}—äÿl£Ô m¨ÃЀJ†¶ÒZ¼C”È>î@S »Q¬¿#Fw3†×|1úßú_Ñ;ócÑ=á¢søÛ¢½ïk&øç Esÿ÷ukt×¼+zg|$úüsCÚá­gFñÈÕQn~"û?a`ŠôNý`þÏ@JÍЀ: m¨dh+§þÅŸÍ>îÀ4 ¢ÜôXOÞ£¾£ÛÏáõkbpÅÑ¿äsÑ¿èÓÑ;÷“sÝÞiŠî ¿Ýão®ÎQïxñŽyç?üÏvOù“¹ÿýÞ¹ÿ9úçýeô/úL ¾½<ß;,†7ž8÷[hG]ÅS·E¹éñˆb˜ýŸ 0C¶üüá½S†¶Ôah @%ÏÒxjï÷ãþÙc€4¸lEúò3´ C[*ÚJãkxËéÙG`:Ãhðºô÷ågh @†¶T2´•ÆWwÍïfy€©´å/8g¿ýh22´ C[*ÚJã­xê¶ìc0u:Ǽ3ýÝG“‘¡-uÚPÉÐVoý þ&ûØL•âÑkÒß|49ÚP‡¡-• m¥ñÖ^µGÄ }ô¦Fï´“þæ£ÉÉЀ: m¨dh+¿á 'd}€©Pn|0ZKvJïÑädh @†¶T2´•Æ_çè_Ë>úS¡áߦ¿õh²2´ C[*ÚJ9|?ûø4ZÙÛíU{¤¿óh²2´ C[*ÚJ9õÎøHöñh´ÁU‡¦¿ñhò2´ C[*ÚJI-Ý9Êç;š©,¢sÐóßx4qÚP‡¡-• m¥¼ú—.ɾitû9éo;šÌ m¨ÃЀJ†¶R^í}_1ìf_ÓýÒo§¿íh23´ C[*ÚJ¹ o8!ûh”â±ëÓßt4¹ÚP‡¡-• m¥Ü:GþRö5Ð(½3>’þ¦£ÉÍЀ: m¨dh+å7zðòì« ÊMEké.éï9šÜ m¨ÃЀJ†¶R~½Ó>”}4Bÿ›ÿ#ý-G“¡-uÚPÉÐVš€–ìåsg_­ì<í•/ËËÑDgh @†¶T2´•&£þ·þWöu0Ñú—.MÃÑägh @†¶T2´•&£öê=#ú­ì+`2õ[ÑÞçUéo8šü m¨ÃЀJ†¶Òä4¼öØì+`" .? ýíFÍÈЀ: m¨dh+MNÃ~>¢,³¯€É2ìE{ÿÿ'ýíFÍÈЀ: m¨dh+MV£û.;&ÊðÚcÒßlÔœ m¨ÃЀJ†¶ÒdÕ=ñ½Ù×Àä(FÑ9øMéo6jN†¶Ôah @%C[iÂZ¼(Š'nʾ&Âð¦“óßkÔ¨ m¨ÃЀJ†¶ÒäÕ;ëãÙW@¾²ŒÎáoK«Q³2´ C[*ÚJØÒ£|î¡ìë Õ莯å¿Ó¨qÚP‡¡-• m¥É¬áßf_©:Çþzúš—¡-uÚPÉÐVšÌÚ+_ewcöbtߥéï3jf†¶Ôah @%C[ir¬Û?ûŠHÑ]ó®ô·53C[ê0´ ’¡­4¹µ÷û‰ˆa7ûš«Ñƒ—§¿Ë¨¹ÚP‡¡-• m¥Énxýšìk`¬º_þ×éo2jn†¶Ôah @%C[i²ëúse‘}UŒÅè¾KÒßcÔì m¨ÃЀJ†¶Òä7ºóëÙWÀXtû­ô·5;C[ê0´ ’¡­4ùu¿ôÛÙWÀ‚ÝuAú;ŒšŸ¡-uÚPÉÐVjFÅÃWe_ ªsô¯¦¿Á¨ùÚP‡¡-• m¥fÔ;õO³¯ €3ºýÜô÷MG†¶Ôah @%C[©!-Ù1Šgîξ2æ_YFçÈ·ç¿¿h*2´ C[*ÚJÍ©wÎ̾2æÝ–adö»‹¦'C[ê0´ ’¡­Ô –î寲¯ €ùSÑ9âòß]45ÚP‡¡-• m¥fÕ?ï/³¯ €y3¼ù”ô÷MW†¶Ôah @%C[©a-Û5Êç;:¶_1ŠÎ¡?—ÿÞ¢©ÊЀ: m¨dh+5¯þù}ul·á ǧ¿³hú2´ C[*ÚJ lùnQn~2ûúØvÃ^´üéüwM]†¶Ôah @%C[©™õ/útöõ°ÍW˜þ¾¢éÌЀ: m¨dh+5´»GÙZŸ}…ÔVv7F{ŸW濯h*3´ C[*ÚJÍ­É粯€ÚúþÏôwMo†¶Ôah @%C[©¹µW¾<ÊΆìk`«•Ï?­å»¥¿«hz3´ C[*ÚJÍnpÙŠìk`«õÎühú{Ц;C[ê0´ ’¡­ÔìÚ«÷в·)û*¨T¯Š²¿9û:øgî¹0ý E³‘¡-uÚPÉÐVšŽW|!û:xae#ßžþ~¢ÙÈЀ: m¨dh+MGí}_eoSö•ðO o8!ýíD³“¡-uÚPÉÐVšžßÝ'ûJøÇ†ÝhðúôwÍN†¶Ôah @%C[izj¯Ú#ÊΆìkà Öí—þf¢ÙÊЀ: m¨dh+MWý‹ÿ.ûZ˜S¶Ÿžû‹ÁÙï%š­ m¨ÃЀJ†¶Ò”µb÷(7?™}µDïÜOæ¿•hæ2´ C[*ÚJÓWÿ‚¿É¾Z€W<~C´–ì˜þN¢ÙËЀ: m¨dh+MaË^åsg_/À¬*Ëè~é·óßH4“ÚP‡¡-• m¥é¬÷µ¿È¾^€5¼éäô·Ín†¶Ôah @%C[iJ[ºsÏÞ›}ųfÐŽö¯ÏÑÌfh @†¶T2´•¦·Þ™;b€Ó¿ø³éo"ší m¨ÃЀJ†¶Ò·dÇ(žº-ûšfD¹á¾h-{Iþ›ˆf:C[ê0´ ’¡­4ÝõNýÓìk˜ÝSþ$ý-D2´ C[*ÚJSÞâEQ%å5¼õÌìkh€âá«¢µx‡ô· ©ªÑ]çgÄЀJ›—¿4ýáSR^í/üLĨŸ}“¬FçÈ·§¿cH[Óè¾K³O bh @¥Öª=Ò>%å6¸êÐ쫘`ƒuû§¿_H[ÛèÁ˳ bh @¥Ö¾?žþð))·ö>¯Š²»1û:&P¹ñh­Ø=ýýBÚÚŠG®Î>64ˆ¡-•ZŸ]úç¤üúç*û:&MYFwí¦¿[Hu*ž¹;ûäÐ †¶Tjü¦ô‡OIÐ’¢xòÙW0A†×—ÿf!Õ¬ì<›}thC[*µ~gúç¤É¨{ÜoÎý¦€òùG£½jô÷ ©VKvŒ(‹ìã@ƒÚP©sâå?~Jš˜†·œž}- »ö=éïRÝÚû¾&ûèÐ0†¶TêžùñôÇOI“Sû€×Eô[ÙWhxýšô7 i[êúæìã@ÃÚP©÷Íÿ‘þø)i²ê_ò¹ì« HRnz,Ú«÷LŸ¶¥î }„hC[*õ×íŸþø)iÂZö’(ž½7ûztOú£ü· ië}í/² cÜwEIDATh @¥ÁNKü”4yuO~öõŒÙð†ãÓß$¤íi°n¿ìc@ÃÚPiôÈÕ韒&³Ñ]çg_QÀ˜”›öê=Óß#¤íixËéÙG €†1´ R±y}ú㧤ɬsÈÞ£~ö5ŒA÷ä?N‹¶·âÑk³ ch ÀVi­ø±ôPI“Ù`ÝþÙW°À†7®Mƒ¶»Å;Dô[ÙÇ €†1´`«´x{þ#¨¤‰¬½âÇ¢ÜôXö5,rÓãÑ^½Wú„´½u~Söq  mØ*Ý3>šþ*irëñ‘ìk X Ý“ÿ8ýíAšz§þiöq  mØ*ýËH•4Á-^£×e_UÀ<^{Lþ»ƒ4O ¾½<ûHÐ@†¶l•á=ßJ•4ÙuûùˆQ?ûºæIñô]ÑZ±{ú›ƒ4_îøZö±  mØ*Åæõé ’&¿ÁwVe_WÀ|(†Ñ9ú×Òߤykñ¢([ë³O dh ÀVk}þuù¡’&»e»F±þŽìë ØNýK>—ÿÎ ÍcÃÞ’}¬h(C[¶Z÷ô§?†Jšüº_úˆ²Ì¾²€m4zèÊh-Ù1ýAšÏzç~2ûhÐP†¶lµþ÷O •ÔŒ†7®Í¾²€mPö7Gçà7¥¿-Hó÷*¶•¡-[môøMé¡’šQ{ŸWFÙZŸ}m5õÎúxú»‚´•Ï=”}¼h(C[¶^1ŠÖÊ—§?ˆJjF[þ‹9 9†·|5ý=AZˆ:‡¿5ûxÐ`†¶ÔÒ=å颒šÓèÞ‹³¯-`+”Ï?:÷/Ôd¿%H Qÿ¢Og1ÌЀZ†×—þ(*©9u~Sİ›}u/¦,£»ö=éïÒB5ºÿ²ìS@ƒÚPKñücÑZ¼(ýaTRsê_ò¹ì« xƒ+J?ªöªWDŒúÙÇ €3´ ¶öá¿þ8*©A-Ý%Чn;º€Pj4œ¡-µžº#ýqTRó^{LöõüˆÞ™M/²öê½"Fýì£@ÃÚ°MÚ‡ý|ú#©¤fÕ^µG”›Ͼ¾€ˆ^{lú[´ÐõÎýÏÙG €)`h À6é{Eú#©¤æÕ=é}Ù×̼≛£µ|·ôwi¡=¸.û¸0 mØ&£§ïN$•Ô̆7œ}…ÀÌ*û›£sèÏ¥¿H ]çÐ7g7¦„¡-Û¬sìo¦?–Jj^íU¯ˆò¹‡³¯0˜I½3?šþ6 £Á•e7¦„¡-ÛlpÃÚôÇRIͬ{ü»#Ê2û€™2¼î¸ô7i,-Ý%ÊÖúì#À”0´`Ûõ;ÑZµgþ£©¤F6¼îKÙ·ÌŒâÉ[¢µü¥éïÒ8êñ‘ì#À1´`»ô¾ñ©ôGSIͬ½òåQ>÷Pö5ӯߊÎaoI ÆUñØõÙ§€)bh Àv­¿36nQúé¤fÖ=á÷#Ê2û*€©Ö;ócéoÒ¸êÿ{ÙG€)ch ÀvëœüþôÇSIÍmxÍÑÙ×L­áõ_Nÿî/³Ñ½ßÊ>vLC[¶ÛðÁ+ÒO%5·öÊ—E¹ñì« ¦NñÄÍÑZþÒôïþÒ¸êùvÿzóÎЀyÑ>æ_¥?¢JjnÝ5¿ë¿€yTv6Dç 7¦ç—ÆÙèös³SÈЀy1¼íœôGTIÍnpõ‘ÙWL‡²ˆîÚ÷¤×—ÆYç‹¿â/r° m˜7í/þjúcª¤·b÷(ž½'û*€Æë_üÙüïùÒ˜ÝsaöÑ`JÚ0o†w3ý1UR³ë~éwæ~ë°mF·Ÿ­Å‹Ò¿ãKã¬{Üoe=¦˜¡-óªsìo¦?ªJjvƒ+¾}•@#ëïˆöÊ—§·—ÆÚâ¢xäêìãÀ3´`^ X—ÿ°*©Ù-Û5ŠÇo̾ΠQÊÞ¦èúæüïõÒ˜ëõ‰ìãÀ”3´`ÞuOýPú㪤f·å¿ŒA;û:€f(ËèúÁôïóÒ¸k¯|Y”›Ï>L9C[æ]±ñ¡Ø¼l·ôGVIÍ®÷µ¿È¾Î ßYþ=^Êh°nÿìãÀ 0´`Aô.Y’þÈ*©ù oùjöumtï·¢µdÇôïðÒ¸ëþ¶ˆÑ û0 mXýv´xCúc«¤f×Þç•Q>ÿhö©Üp_´Wï•þý]{KvŒâÑk² 3ÂЀ3¼û¢üWI¯»æ]e‘}¥Àd´£sÄ/¦o—2ê_ø·Ù'€bh À‚êžù±ôGWIÍo°nÿìë &GYDïÔ?Mÿ¾.eÔ9èsCsC[TÑÙ­ý^›þø*©á-Ý9ŠG¾Ÿ}¥ÀDè_üÙüïêRFKvŠâ᫲ 3ÆÐ€7¸õ¬üXI¯sÈÞýVö•©†7ž­Å‹Ò¿§K ¾³*û0ƒ m‹îÙžþ+©ùõÎùOÙפ=te´–íšþý\ʨ{ÜoE£ìcÀ 2´`¯Œò¹‡³!3ÊЀ±=z}l^²sú£¬¤f×^µG”Ï=”}¥ÀØ”½MÑ9üméßÉ¥”¿™} ˜a†¶ŒUÿʃóf%5¾î—~Ç?Àl(FÑ=ñ½éßÅ¥¬ëöÏ>…Ì8C[Æ®{Ö'Òg%5¿þ·þwöu ®þ_§—²ê~åe™} ˜q†¶Œ_¿í#ÞžþH+©á-^£;¿ž}£À‚^stþ÷o)©ÎQ¿esö1C[rˆÖê½Òk%5»öê=£Üpö•óntß%ÑZºsúwo)£öoˆrÓãÙÇæÚføÀå±yé®é¶’š]çˆ_Œt²¯4˜7ÅÓwÎýåÒìïÜRFí•/≛³!üC[R ~pzlþÜ¢ôÇ[IÍ®÷µÿ’}À¼([OEç ‘þ][JiÙ®1ºÿ²ìcÿˆ¡-éúëöÏÀ•Ôø†7œ}Àö´£sÌ¿JÿŽ-¥´tçÝñµìSÿ„¡-¡wþ_ç?äJjv+vâ©[³¯3Ø6Å0º'ýQþ÷k)£%;Æð–¯fŸBxA†¶L†²œû§ßÓt%5ºÎ!{GÙ{>ûF€úocçüÇôïÕRJ‹Åðºã²O!ü³ m˜EÝ3>šÿ°+©ÑõNÿpömµô/]šþ}ZJiÉN1¼qmö€eh Àd)FÑ=íßæ?ðJjtƒïž}›ÀVÙò›<³¿GK)-Û5F·} ’¡-“9¶=ûÏóz%5·¥;Çè¡+²o3xQ£»ÎŸûžéߣ¥q·ü¥1ºç¢ì#[ÅЀÉT–ÑûƧò|%5¶ö¯²ýLöm/¨xäêh­Ø=ýû³4îÚû¾&ŠG¾Ÿ}`«Ú0Ñz—,Nø•Ôܺkÿpî·dÀ$)ž½'Úû¾:ý{³4î:‡¾9Ê ÷gA¨ÅЀ‰7¸î˱Ù?¡'ië_ôéìk þAÙ~::‡ìþ}YwÝ5»1û@m†¶4Âðž‹¢µòåéÁ’šÙ𦓲¯1ˆè·¢óÅ_Iÿž,»þ×ÿkÄh}`›ÚУ'oÖoH–ÔÀ–½$ŠG¯É¾Æ˜e£~tOøƒüïÈÒ8[±{ o:9ûôÀv1´ QŠÖ3Ñ9þ÷óˆ%5®öþ¯òùG²¯1fQ1ŠÞiÿ&ý»±4Î:¿)Š'}ú`»ÚÐÌÿbââ¿‹ÍðX,©YuŽþµˆa7û`–”eôÎúDúwbiœmù3_ö6eŸ>˜†¶4ÖðޝGkÕžéÆ’šUïÌe__ÌþùŸJÿ.,«öê½bxëÙÇæ•¡-V<÷htÖ¼+ýYR³\~@öõÀ è_²8ý;°4®ºÇ¿;ÊçÍ>v0ï mh¾²ŒáµÇÄæe»¥?&KjH‹wˆÑßȾ½˜bƒ«Íÿþ+¡öê=çÞg·¼ÓÀ42´`jŒž¸%ÚGýËô‡eIͨ½j(ž¾3ûê` ¯=6Z‹¥÷•ºÞÿ!ÊÖúì# ÊЀéRŒ¢ÅÁÑZ¾{ú#³¤É¯sÈÏFÙݘ}s0E†?85ZKvLÿÎ+-dÃߣ{/Î>n0†¶L¥bãCÑ9ñ½éÎ’&¿îÚ÷Ìô`{îüF´–îœþ]WZ¨Úû¾:WQ ³Œ¡-SmxÇ×£}ðÞéÐ’&»þ…›}]Ðp£û/‹ÖòÝÒ¿ãJ ÒòÝ¢áÿô/0“ m˜~£Aô¯<8Z«öÌ–4± ¯_“}[ÐPÅ#WG{åËÒ¿ÛJ 2°=ÿ¯£ÜüDö1€4†¶ÌŒ¢ýlô.ütl^þÒüjI“×Òctï·²¯*¦xìºh¯ö¼5e-iôÏÿT”›Ë>bÎЀ™S´žŽÞ%K¢µÂo‘ôÛòÛ‡ŠÇo̾¦hˆ-ß!Ûû¼2ýû¬4_µ÷}Mô/]eûéìãÃЀ™Ulzrî7ܶV¾"ý[ÒäÔþüOFùü#ÙW®xü†h¯Þ+ý{¬4uŽúå^¿&bØË>Z0q m˜yEos ¯=&Ú‡ülúƒ¶¤É¨sØÏGÙݘ}=0¡Š'nò›lÕøÚ«^½s?Åc×e)˜h†¶ð÷ŠQ o;':'¾76/Þ!ý¡[RnÝã/b4Ⱦ™˜0F¶jtË^ÝSþ$†7%bØÍ>NІ¶ðŠçþe+£uàÿ›ÿø-)­ÞY(Ëì+ € Qû@ãÚ@…Ñ“·Fï’%ÑþÂÏä?ŠK{ýK—f_CL€býíÑÞï'Ò¿§J[Ó–·ÌÞ¹ŸŒá-_²·)ûø@£ÚÀÖ*Ë>xEô.ø›húæôÇrIãkxý—³o OÞí}_þýTzÁ–ì#~1úçýU o:9ÊçÊ>20U m`ŠÁ5ÇD÷”Dkõ^ùê’®¥;Çèž‹²¯OÝí}_“ÿÝTÚÒŠÝ£sô¯Fïœÿƒ«‰Ñ}—úµ°À m`>”eŒžº#×}9ºgýÙÜo¼Ý¼x‡ü‡wIóV{åË£xâ¦ìÛ€1*žº-ÚûýxúwRÍFí•/‹ö?/þJt×þaôÎúD ¾½,†7®Ñßýáoª-FÙÇfŽ¡-,”~'ŠÇ®‹ÁõÇGï‚ÿã?Úï›—î’þh/iÛjþ'£|îáìÛ€1)7Ü7÷¾#ÍkOÝ:÷gkîÏWû™(ÚÏF ûÙÜ€xaÿ9 XÀ¡lIEND®B`‚‰PNG  IHDRàÑø6 pHYsèèµ{Rk IDATxœìÝy”¥u}çñK³4‹[tt4â’uÆÑ3QÏ$šäèѨ9ÙœÑÉè£ÇÌNb&‹£æ¤ª7@öE  (²)› ‹ Š‚`²4 ‚Ð4«4Ý¿O÷­FÒiD¿`ô 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d€„ 2@BHÈ  !$d¡úÁÛJÿ¦³J÷›û”ö©ï-­c^_ªýŸ_ªÙ¥šiHéjü+¥þÙ­Ñ—#6øéwJsÝSŸ;%%nîÌô€=Kë˜7”ö©6¦Ú¿éìRo¾=úG`*€ª·n*½ëO+¯ýíü_Òj¯§Ç_4ÒÖúÔ+ÊpËÆèK€1ÜöÍR­Ý=üùSÒ2l¯§—Ö±¿]:_ûûÒ¿áŒR?|OôÄ©eØFsÉzë??¿F5~IüE Ö:êµeØ| ú²`Ì?º°Tkv •¤æ¡/-íÓþ¼ô®9±ÔÕ}Ñ?§†àñÔuÜñÝÒ¹p¦4|ñ‘þ¹öçÞT†­ÑW(Kdpóy¥Z³2üyT’ivEiõºÒ½xuÜyÅüY.Íðs÷ü°t.Z]šÿjü_diÂjáJéµ¢/S–˜@ÒDwÀž¥s·Kÿ¶K?Ç0w{àÖÒùú?”ê Çÿe•&´Îiï+¥îG_®é_j©Víþ|*IOÔÜÇ·w.š-õæÛ¢lN„å;ô;¥wÝ)¥õ¹7ûxéIêžóáR†Ãè«€`ýkO*ÕªßS%éI›]QZÇ¿­ô¯?½”~·,WËn¨·Þ=ÿ¹þÕ'žÿ—Pš‚º|,ú²`‚ôpœL)iºÚï¹¥{ÉÚeù˃—Í0xà–ùϪÖîÿNš’þðXúW¶T³;„?·JÒvµfeiŸúÞ2¸÷Ʋ\¤w]]Z_ø7%i;ë]v@ôå Àë}÷SÎ[$Mg³+Jû‹ï,ƒ{®/Ù¥æþðæÖÿ%MÚÎfw(½Ë‹¾„˜½ïÿ+I‹îÛP²J7Ìývçö)ïvð/-¤Ù¥ձї1S¤÷ͽãŸg%i1­Ú©´Ïø`©·ÜU²É3t«Ò¹hµÏø—ÚªKÿÇG_ÉL¡îù‰®•¤Å¶nÒ¹hU)½VÉbú€º.½ëN)Õ/ˆÿ "Mk«w)ýëO¾š˜VÃaéœùÁøç[IEìYzIþ¡ìTƒn-­Ï¾1þ/„4Í­Þ¥ n<3úr`ÚÕƒÒùâ‹Ε¤Õ:áí¥Þ|{™fÓ9 z¥;÷KfÖîþ—@šþÃÿ¯D_ÑdÑk•ög~'þyW’FÕº=J÷[ûΜÓhê€Á]W—æáÿ1þ^šöÖ¬,ƒ gG_Ò$3l?TZG¼:þ¹W’fFWë˜7”Á·”i3=@]ÿÿõ¿feø¶”â_þßôÕè«€¤†Õ}¥uØËãŸ%if„­ÝmþŒzšLÅPoÝTZ'¼5þXJsøVôe @rÇî(Í_ÿ,I3£­}ò-uó2 &~èßpf©öþ¥ð?T)Ekv-ƒ[¾}Y°LÔ÷ü°4÷q®#)a¾° ~zy™t‰þÈŸoí[ªÙñ˜R†|æ?ê;¿Wšëžÿ\,I3#nÍʉÿH ‰æþûDë¸ß‹ÿ”2ýËÿ[/ˆ¾´X¦7ŸWªÕ;Ç?KÒÌèkŸñÁRzí2‰&nÜ}]©zqøš”ê3ÿo>7úÒ`™ë_{²Oz”¶æQ¯ÿ]¶“f¢€þ.,Õ^O ÿÃ’Ò´zç2¸ñ+Ñ—6Ìë]qdü³²$ÍŒ©ý¹ 6­/“db€ÞUŸñ_Á¤Q¶j§Òÿá—£/mx”îE3ñÏÌ’43žæ~ñyÿÇ—”I1@ç ÿƒ‘RµjÇÒ¿æÄèK~ÑpX:§ýYü³³$ÍŒ©5+Kïš“Ê$ˆêºtÎý?ñ R¦fw(ýïziÀôJû¸7Ç?CKÒ̘šÝ¡t¿{ø2ê~iŸþø?)S³;Ìž"LºagKiþªøgiIšãðíC–á0wøªÿê%ºÞe†\Ò°Ã-w–æ{†?OKR5ƺ—¬]FÀÜáÿßþM—²Õ»tÿ%¿œ`±ê»®*ÍuO ®–¤jŒu/;h u]Úg|0ü›-e«{ÑÌ’^Ê0Jƒ›Ï+ժŸ¯%©çGw_ùO‰€¹_øûÕÅ£¥duÏþË%»Œ`\úß?&ü[’ªq6»¢ô®=9çÐ9ÿÿƃ¥duN)ÃáR]Æ0V]çG’²·zçÒßpn® wåÑñßX)Yí“þdþwj@Ãaéœú?ß¹%©cͽžZ›ÖçæÖ Ÿá&¶öqo)¥ß÷å KoÐ-íϾ1üÙ[’ª1ÖÜÿ—KýÐÓ= 6^Uªµ{„3¥LµŽù­RºÕ8/]5l>PZ‡½<ü\’ª1Ö<â×Ké<<@½uS©ö{^ø7QÊTë¨×”ag˸.[˜õÏ~Tšû>;üY\’ª1Öþâ;K©ë)úÝÒ:æõáß<)S­Oþ»2lÞ?–K&Q}ÇwKµf×ðgrIªÆX÷ÛO×Ð9û¯Â¿iR¦š<¿ 7ß>ŽË&Zÿš/„?—KR5ÎVíTú·}k:€Þ5'ÆäD5÷~z©ï¾fÔ—*Lî >—¤jŒ5÷{n©·lœì`pßM¥Zç—þJ#kíãòQ^¦0}†uiáâŸÓ%if|µŽ{ËÈÀè€~·4zmø7IJÓêËàæsGv‰À4v¶–Öᯊ^—¤™ñÕ½ü““9tÎ÷_±¤‘5»Cé_ý¹Q]žÂpóm¥¹ï³ãŸÛ%ifL­Ùµ î¾n²€¹_PP­Ú1þ›#%©÷íƒFqi@:ƒÛ/-Õê]ŸÝ%©S­#ÿs)ýÎd ugk©|Qø7EÊR÷‚ä‬zWþü.IÕë^²n2€Î9ÿfHYê|ùÝ¥ ‡#¹¸ ³îY Ž—¤j\­YY÷Ý; îø®þ‘FTû³oÙí€ôê~iîMáÏó’T©Ög~·”ºúÒüä+¿ R†Z‡¿² Û›u1Àr3lý¬´ùµðçzIªÆToýçc€î7÷ ÿ⥠5|an½kQ2,Wõ½7”æ^O ¾—¤j 5÷û·¥n?´´@½õîR­{jø/M{ͽŸ^껯]ð ”2¸õ|S-)m >¾´@û´÷…ÑÒÔ·z—2øñE ¾x€Ñ»tÿøg}IšCkv-õƒ·-Í0¸óÊRÍ®ˆÿ¢¥invEéÿð”]´Àcëœò?âŸù%ifôµ¿üž¥ZǼ>ü‹•¦½Þ·^Ð <¾a÷áÒúÔî—¤jÔÍîP¯ïÐßpnü*My¯ü¯í¾P€mS?pËüïÜ‹~þ—¤jĵOúãñÍ£^þEJÓ\û„·•R÷·ûB¶ÝযÎÿkÙèsIªFý¿î¼r<@ÿúÓã¿@iŠ›û/ˆÃöC yßl§î ? ¤jĵO~Ç€º.ÍÃ_þÅIÓZsÿç•áCw,ð- °ÝêAiîMág’TúlZ?Ú ãWã¿0iZ[»[©ïüÞbÞ² 0l>Pš½8þl@’fFWç´÷vhû;á_”4•Í®(ƒÎXÌ{`æþQ^µfeü$ÍŒ¨Õ»”zë¦Ñ ƒßÿ‚¤)­÷íƒGñ^X„ÞG„ŸHR5º¯ÍÐþÒŸ†1Ò4Ö9óƒ£xŒ@猄ŸHR5¢šû>§”^kqÀpËÆR­Ú)ü‹‘¦­öqo.¥îò} °½fi}ú?…ŸHR5¢zל¸¸ {ñšð/Bš¶šÿj6ïå[`†›o/ÍO<+üì@’ªÔ>î-‹êA©|aø!MSͽžVê{¯ñÛ`TÎ.ÕìŠð3IªÛìŠRoþé€þ†sã¿išZµcÜ|î8Þ›#Ô½h6þA’f_ï›û,lhô'á/^š¦z—rïI€QÖ¥ý¹7…Ÿ%HRµÈZ‡½lû€ºõ`©Vïþâ¥i©sÆÆõ–ƒáÃ÷”æ~Ï ?S¤j‘ îºzû€ÞUŸ ÑÒ´Ô>ö·KtÇùžƒÁ­çû}’Ê´7÷±fÛ5´Ž{Kø‹–¦¡æA/.Ãê¾q¾ƨ{ÁGÃÏ$©ZD­Ã_¹í@]ÝWªÕ;‡¿hiÒkîõÔRß{ý¸ß‡ã4è•ÖÑÿ%üœA’ªE4¸ÿæmzWþb¥‰ov‡2¸áŒ¥xŒÙpóm¥¹÷3âÏ$ifaõ.;`Û€Öþ0üÅJ“^÷âUKñþX"ýN?o¤jµ{Ë6 ýN©Ö=%üÅJ“\ûø·–R–èí°TºgýïðsIªÒš]K鵞xèÿèÂø*Mp­Ã^V†íÍKùÞX*ýNiñëáç’T- ÁO¾ñÄ@缿 ‘Ò¤æ—þ@~õ·ÌŸDŸCHRµu/šyâ yø«Â_¤4±¿ô÷Ư,åû Hý ñg’4³}µyýãuëÁRÍ®‘Ò$Ö½xõR¿×uN{_øy„$UÛû{úÝÇúÎÒÖ>ñKÖï5€ ÃîÃ¥uØËÃÏ%$©ÚŽêMë{è|ýÂ_œ4iµù5¿ô–©úžëJµv·ðó Iª¶±þ÷~ì õ™ß qÒDµv÷Rß}MÄû `Bô¾wxü…$Íl[3ÿâ1€º_ªu{„¿8i’šû…?À27–ö o?§¤jjù¿8 î»)ü…I“T÷¬E½­&̰º·4÷}Nøy…$UOÖº=æ‡ËG ½ëN‰aÒ„Ôú§×•ÒïD¾¯&ÌàÆ3ÃÏ,$©Ú††[6>zè\8þ¢¤I¨¹Ï3Ëpóm‘ï'€ Õ9ýýág’T=Iƒ_üè uâ…¿()¼Ùepëù‘ï#€ 6ì>\Z‡üZü†$Í<~½+ŽxôÐôƒK*½oîù˜ƒÛ/-ÕªÃÏ1$©zœºçýí#?³¥”jõ.á/JЬ}ÂÛKÖ¡o €éÐýúÇÃÏ2$©zœ:§üé#?¯õ柆¿ )²æ{–aóþÐ7ÀôJë¨×†ŸiHRõµýíG~\5ú·}+üIa­Úiþ¿îlú¾Kµv·ø³ Išyt­C^òÈϪFoýñá/HŠª÷­}Cß,Ó«÷CÃÏ6$©úùÖîöÈÏ©F÷{Å¿ ) Ÿû,ÊpXÚǽ9üŒC’ªŸkØÙ2ÿcªÑ9ç¯Ã_Œ´ÔùÜ`†[6–æ>Ï ?ë¤ê_5÷³iN£ýå÷„¿iIó¹ÿÀõo8=þ¼C’fþ¥úþ ó?Ÿ­Þþb¤¥Ìçþ£Öñl%ÍLNõÆïÏÿlj4|Mø‹‘–ªö oó¹ÿÀÈ Û›ç?r8úìC’ª™Füäó?›̓5üÅHKQs¿ç–auoôû ©ÁÍ熟HR57l8gþçR£Úïyá/F{³;<ò—`\:§ÿyü9ˆ¤eßà‘`Ÿg…¿iÜu/øhôýX†í‡Jó€ç‡Ÿ…HZÞÍý¤9jÝSÂ_Œ4ÎZGþF)ƒnôýX&Î?‘´¼Ü|ÞüÏ£Fµfeø‹‘ÆUsÝSJ}ÿÍÑ÷}`™é|ùÝáç"’˶Á-_›ÿYÔ¨fW„¿i\õ×>ú~,CÃæý¥¹ïsÂÏF$5–ù0/FG/ý÷è{=°Œ nüJøùˆ¤Æ²Ì ÔµyIv¶Dßç€e®óÅw†Ÿ“Hj,» ÊÛêK½ñÊèû;@V÷–æ'þMüy‰¤²œ2(m½oì}oxDÿÚ“ÂÏK$5–U¥¬uÌo•R¢ïëÒ>ùáç&’Ë&€òµnR?pKôýà ·n*Í}ž~"©,‡ JWÿêÏFßËWÿLJŸŸHj,‹ JUû¤?޾‡<©¹3ŒèsIô”¦æ~Ï-ÃæýÑ÷o€'5ÜrgiîýôðóIÔ”£ÙÊ`Ã9Ñ÷n€mÖûÞ§ãÏT$•Ì”¢îÙ}ÏØ>ú´ŽþÍðsI´4õµ{Y)½fô-`»Õ›Ö—jÕNáç+’)3hº›]Q·_}¯X°î×þ>þŒERɘ@S]÷ë¾G,N¯YšÿJø9‹¤Fº šÚZŸü÷¥€ŠÎ{ IDATôÛÑ·h€EÜ|^øY‹¤Fº šÎVíTêWFß›F¦}ò;âÏ\$•L4•õ.Y}O©áÖM¥¹÷ÓÃÏ]$5ÒdÐÔÕ:âÕ¥ zÑ÷d€‘ë}çÐð³I44]­YYê{®‹¾ŒG=(­##þ FRÉ@SUïÒý¢oÃcUßuU©Ví~#©1õ45µþéuó+8@vÝsÿ:ü,FRcê3h:Z½K©ïùaô½`I ;[Kó€=ãÏd$•iΠ©¨wÉÚèû.À’ê_Zø™Œ¤ÆTgÐÄ×:üU¥ ºÑ÷\€%×>ñÂÏf$5¦6€&»U;•zã÷£ïµ!†›o/Õº=âÏh$•iÌ ‰®{ÁǢﳡzߨ+üŒFRc*3hbkö²Rz­è{,@¬~§´}iøY¤ÆÔeÐd6»¢ n¿4úö 07~%þ¼FR™¶ šÈºç|8ú¾ 0QÚ'¼=üÌFRcª2hâjøÂ2ìl¾§L”ú[JµfeøÙ¤ÆÔdÐÄ5¸é«Ñ÷S€‰Ô=ÿ#ág7’S“@UçËL¬¹OMhîÿ¼ð3I©È ‰©ù‰g•auoô}`¢õp|ø9ޤÆTdÐÄÔ_Bôý`ò ‡¥}ìÂÏr$5&>€&¢ögß8óàÉÕw]]ªÙág:’@ñ­Ý½Ô?ûQô}`ªtÎü‹øsIe’3(¼Þ·о_L¹ß¥ØÜûág;’›@¡µŽxu)u?ú~ 0•z—~¾#©1±תJ½i}ô}`zÕýÒ:ü•ñç<’Ê$fPXݯý]ô-`ê ~|qø9¤ÆDfPHÍýž[†í‡¢ï)t¾øÎðóI‰Ë ú?<%ú¾Æpóm¥Z³kø™¤ÆDeÐ’×>î-Ñ÷D€tºç$üÜGRc¢2hi[½K©ïß}?HgØÞ\šŸxVüù¤2)´¤u/^}/H«÷CÃÏ$5&&€–¬æA/*¥×Œ¾ä5è•Ö¡/ ?’Ô˜ˆ Z²Î޾¤×¿þÔðs I‰È %©}ò;¢ï}ËFû˜×‡ŸIj„gÐø[»{>ôÓèûÀ²Qßqy©fwˆ?’T"3hìõ¾±.úž°ìt¾ô®ðs!IÐ kÍ_àÿ>ø“R­Y~>$©–@cmî—Σ{Þß„ŸIj„eÐØjû†R†ÃèûÀ²5l=Xšû<3üœHR#$€ÆÓªK}÷5Ñ÷8€e¯wÙñgE’JD¥îYо·0gÐ-­C^~^$©±ä4òšûüR6ï¾µðÏúמ~f$©±ä4òz—2úžÀ¿6–Ö1¿~n$©±¤4ÒZŸzE)ƒ^ô- €Ÿ3¸ýÒð³#I%Í ‘6¸õüè{£ýùß??’ÔX² Yíãß}à Ôw_[ªÙáçH’K’@£ivE©7ý úÀ“è|é]ñgI’ÊRdÐHêœñè{Û ¾ÿæR­Ú)üùÑ·#Æ wÅ‘ágO’#Í movE©ï¾&ú^À8 z¥uÈKâÏ $•QeÐ6×9õ½Ñ·!ƨ¿þóágP’#Ë mkõÎ¥þÙ¢ïAŒS=(­Ã^%©Œ"€¶©îYоý°ú?8>ü,JRc$ôä­Ùµ ·Ü}ï`©þÀ¡/?“’T›@OZ÷¼¿¾í°„úW}&üLJRcÑôäÿúë]Ñ÷–Ò Wš½8þlJRYL=aÝóþ&úv@€ÞG†ŸMIj,*€žä³ÿ7Fßkˆ0è–æA/Š?£’Tš@[÷œGßfÔûî§ÂϨ$5œ@Ýš•e¸åÎè{ ü?öî<Ú²²<ðÿ.TEcŒslÛ$cÔÄÄØ‰Æ¶c:AãÐi;vô—DF»Íä°êÖÄPŤŒ”Œ2ŠŒÅ 3HA ƒ@1ÉXX EAQgŸùì÷·î!¢ìsž}Îþ|×úüÕ«W÷:ÖÝÏæ}î}O’$I’X¯•ò^V¤§Â€ÇÔYþùèñ"I’$I’¤ Ô½p·ð³* {J,øy󟕊n‹ž-’$I’$IªBÝ<å‹_f¤'Ë€ŸÓ>é³ÑcE’$I’$Iª{Á’ð3+ {Ò,øùßþßpkôL‘$I’$IR•ê4R¾ø¥ñgW@z2,x”öñŸŽ'’$I’$Iª`Ýó·?»²'Å€Ÿ˜™“뮞%’$I’$Iª`EûÁ”ïðÂø3, m. Ñ>ò¯¢çˆ$I’$I’*\çœùágX@¶Ù,xÄàŽ•Ñ3D’$I’$I®hmLùö¿~Žd›Å€¡Öïž’$I’$Iš€:g}=ü, È6‹ÿC¸éôèÙ!I’$I’¤ ¨h¬K…[‡ŸgÙ² 5÷~kJE=;$I’$I’4!µOú\ø™=! Rï꣣g†$I’$I’&¨bÃ-©1ïáçZ@ö¸,j.ßíõ) zÑ3C’$I’$IVû¨†ŸmÙ㲨¹Þ¥ûFÏ I’$I’$M`ƒµ—†ŸmÙ㲨±|ñKSê6£g…$I’$I’&´Öï ?ã²_È Æ:gÏDÏI’¤°Šö¦T<¸6 î½. ~|qêß|fê]sÌO¬Z–z«ö”îÊ=R÷‚%?±r‡ÿÏ~xøðÿÎìËuÿ泆¿ 7¸ó²áݸÅ· ÿß’$IšÆú7ž~Æd¿@]-xv*º;zFH’$•Ó ÷ðaþ/IýëOJÝKöþ²CûøO§ÖažZßúÃÔÜû­)ßõu)ßá…©13'äý+ßùU©¹ÏÛRëÐ?Míc?™:§}9u¿¿8õ.?(õ¯_>\ù}ÑŸ¦$IÒæW©¹×[âϺ€ôX,jª}ìÿŽ’$I›]ÑÚ˜kW¥ÞÕG¥îy‹Rû¤Ï¦ÖáLÍ¥ïHùN¿’3[„¿_•)ßþ©¹ôíÃ/Öëœñïÿ2˜ý˂ٿ(˜]vH’$U©Þ•ß²ÇdPSƒ»®Œž ’$Iªh?8¼6§wõÑ©{þö©}Üߦæþï~oQô»S¥ÌVjîþÆÔ>úc©{þ©Ã)ÿ~$I «ßMù.¯ŽOÒϲ¨¡Ù/g‘$I «×zø·ù/ûVêœüO©uÀ¥|ñËÂß‘&]¾ãKRë ÿš:ßû—áoá î¾*¥A?úmI’T“º}#ü}È~Ž@ ÍÞ‹+I’4ŽŠæ†Ô¿}Eê®Ü}xçýì•=³wáG¿ÕÆ¢ç¦ÖÁïOs毚]¾H’$¤N#å;¾8þýH?Í fšßxCJÅ z$H’¤)¬Øtgê_{|êœñ•Ô:ä)_òòðw~Æ‚­†_ˆÜ9{nêßtz*Ú›¢ÿÙH’¤)ªsÖ×ãßw€ôÓ,j¦ûƒ=£g$Iš†ú4øñÅÿfÿwþ:廼&ü=‡§`Þ3‡ß³0û]¾#J’$=ÝŠ‡îþÂAø;þ €É·ÿ¥TtŠž’$iëµRÿ¶óS÷ÜÃïòvÓiöËûÚ'}6õo89¥ný¯N’$M`³ïÑï4@ö €éœöåè I’&¥~wxà?{w|ë€÷8撝[§Ö·ÿ,u/YšŠ×Fÿ‹”$IÒྥÆÌñï2@šeP3sÒ`ýÑ3@’$U¸bÃ-©·jÿÔ>úc)ßþñï/TÇÌ©µìÝÃ+ŸŠ|}ô?UI’TñÚG}$þýH³,jbö‹ø$I’U·™ú×/Oí“>—òÝ^þ¾Â„XðìÔ:òé·ú»Ã«¡$I’~¶ÙïŠ gÒ, €šè_Rô³_’$U ¢±.õ.; µŽø‹ÔXøœðw&[¾ÝóSû¸O¥þÍg¦T ¢ÿyK’¤ Õ\öáï*@fPù®¯MiÐ~îK’¤À«}º,IÍýßå>VF&ßíW‡ÿΊƽÑÿä%IRê]}tøû YÔA÷û;F?ó%IÒ˜+¸}x_ûì½í³ßý>BÌßrø=ý›ÏJ©(¢$IRTƒ^Êwyuü» Ô\ß`Ê-xöðOý%IÒôWl\“ºß_œšKßÿs³ÔÜû·RïÒ}SÑÞýã!I’šý¥Ôè÷¨»¾Àtk÷E?ë%IÒ+Ú¦Þå¦Öïu½•þ®€Î©ÿ'ïˆþ‘‘$Ic¬È×§ÆÂ­ÃßE QcS®¿æ¢èg½$I*»A?õo8%µ¿ó×þƒŠÉ»èøO§Áú¢Š$IÒ˜jŸðwñï 0·¾,¦Xsï·F?ã%IR‰þxø%«ù®¯ Ï€§ef‹Ô:lÛ4øñÅÑ?V’$iÄ î¹ÆwRÁÜ8S¬wé~ÑÏxI’ôtëwRïšï¤ÖÁÿÍ?L¥Ö!’ú·žý“&I’FXëÀ?ç€FMYL«EÏÞ ,I’&³Ù»Ò;g~-å‹_ÿ^cÐúÖIý5FÿèI’¤Ô¿î„ðw hÔ”À”š½[U’$M^ƒ;/Kíc?™óŸþ>Z¿? îº2úGQ’$•Y1Hùn¯Ï€F YL©þí+¢í’$isëµRoÕ²ÔÜë-áïP óž‘ÚÇ}*×DÿtJ’¤’ê^¸kü;Ì­ €)ÔÜý×R*Šèçº$Iz‚ŠÖÆÔ]¹{ÊwzEøûTÒü-SûÄϤâ¡{¢\%IÒÓ¬h=òEÛÄ¿_ÀÜz±˜BÝ»D?Ó%IÒãTl¸%uNþBj,|Nø{L‚|û¤îŠSêw£|%IÒÓ¨³üóáïШ €i3ËT4ÖE?Ï%IÒc4¸çšÔþÎÿ^oþΨ¹ç›Rÿ–s¢”%IÒSlpïõ©13'ü5b0eÚG}4úY.I’~¦Á=W?üžþ¡­Ã¶õý’$Mh­C>þ.±˜2ýO‹~ŽK’¤ÿh°öÒÔ:üƒ~Ë F ßîyÃ/t-$I“ÕìÙUô{4jÄ`Šä»¼:¥A?ú9.IRí›ýÿÖá 7€:hîùæÔ¿õ¼è{I’´¹EjîþÆðwhÔ„Àéœ=ý—$©Ö î¿)µùDjÌlþ^µ23'µOúl*Ú›¢’$i3ê^¼WüûÌ­ €i13' îûQôó[’¤ZVlºsxøØ˜ÿ¬øw¨±|×צþ-gG?$IÒ4»´Ï·{~ø»4jÀ`J4÷Wô³[’¤úÕÍS÷‚%ûȣ߀Ÿúk€?ã¯$IªxåÿÿÞs§ŸÀ”è^²4ú¹-IR}*ŠÔ»æ˜áoG¿ó×7Ÿý´$I¿ ÁÝW…¿/@£,¦Áü-SѼ?ú¹-IR-šý²Ñæ>o‹ŸÿÀ›™3üíÂÔiD?:$IÒc4{£EøûÌnS }ä_E?¯%IªÇ=ÿÇ~rx =û'§¹û¯¥Á]WF?F$IÒÏÔ»âàð÷hL9 €)пî„èçµ$IÓ[¿›º+w÷%e0él5üYž½ÂK’$U¤n3å;¼(þ=æN/ € —ïøâ”úèǵ$ISÙìýáÍ=~=|ÞåþõlÑz úñ"I’þ£Îiÿ7üýSÌ`ÂuNþBôsZ’¤©«hnHí?㺘Rù.¯Ný5F?j$IÒì—ß{½÷n˜;:npÇ¢ŸÓ’$MU½–òÅ/ ŸñÀˆÍ{fê^°$¥býØ‘$©öµxOü»ÌN¬ùÍÿý|–$ij*6ÜšZ‡| |¾ãÕ:üC©h?ý’$©Öõ®>*üSÊ`‚uΞ‰~>K’4ùEê­Ú?åÛ=/|¶1š»¿1 î½.úi$IR}ëwR¾øeáïИBl°nuôãY’¤‰®ØtWj¶møLâÍ.û×ýX’$©¶uÎø÷ð÷hL! € ÕÜã×£ŸË’$Mt½kŽIù/ Ÿé@…ÌÌI3¾2üË I’4ÞŠ ·¤ÆÌñï0wºXL¨î¹ £ŸË’$MdE¾~xçwô,ª«}ôÇSê4¢W’$Õ®Ö!þ)c0¡ëoˆ~&K’4qõo>+å;½"|ŽÕ×Üû­©ØxGôcK’¤ZÕ¿öøðwhL € ÔÜçmÑÏcI’&«A/uΙïOŠ'%ßéWÒà®+¢Ÿ`’$Õ§A/å;¿2üSÄ`u¿¿8úq,IÒDÝ%ÚÜ÷wÂç70™òíž?üë!I’4ž:gÏ„ÏhL € 4¸ÿæèg±$IQÿú“|Ñ/ðôÍ{fê­ZýH“$©Í^Áט÷Œøùs§ƒÀ„iî÷Îèç°$I“qåÏ_I™9᳘3s†W‰I’¤Ñ×:üƒñ³æN € Ó]±Kô3X’¤ÊÿÆPsÿw…Ïl`:µOøûá’Q’$ ^+ îX™ÚÇýmøÌ‡Æ”°˜0³÷K’¤Ç®û)_ü²ðy L·ÖaÛ($IÒÓhÐOƒu«SïòƒRgù?¦æÒ·§Æüg…ÏyhL € ÒÜ緣͒$U¶ÞªýScþ–áó¨‡ÖïIE{Sô£O’¤‰©Øtgê_¿|x¥Þì2=ßáEáó5`0Aºç.Œ~VK’T½úá•Ñs¨Ÿæ¾¿›ŠæýÑOAI’*×ì’¼ûŠÔ]¹{jûÉ”ïúºð¹ š²˜ ƒ»¯Š~~K’T©ŠÆ½©µìÝá3¨¯Ùë Š|}ôãP’¤¸zí4¸ã©ûƒ=Sû»“š»¿15fæ„Ïh ²˜Ío¼!úq.IR¥ÜÓÃÿqQ9 Ô[s_OŃk£‹’$¥Ùï§ì]yhêœú¥‡gÁVá³È~! € Ñ9ãߣŸï’$U¦þš S¾ãKÂç3Àÿ“ïö«ÃI’¦)÷öC6ñ,&DÍEÑÏ|I’*Qïòƒ|Ù/PIù®¯MÅ·E?&%IzJ­©óY©{þ©uÄ_¤|§W„ÏV {Ú,&@¾äå)ƒè9 IRxÝ –¸O¨´|—×XH’ªß —ëV¯òiŸø™ÔÜóM©1³Eø²ÒYL€ÎòÏGI’b+ŠÔùÞ?‡Ïd€Íýþ®Ù+$IªJ³s©wÍ1î퇹õc0ú7='$IŠ«×Ní£?>žŒÙߤ,뢟 ’¤ºÞÛÝ ©sÖ×Së ÿšòí_>,Œ@ÅåÛ=/¥~'zvH’RÑyhø-Ñóà©hîý[©Èï‹~”J’¦¸¢ý`êßrNê~qjùá”ïüÊðùd•bPqí£>=K$I û²æ²?ŸÅOGsŸßNEóþèGª$iÊî퟽ʧ¹ôîíÒ±¨¸ÞåFI’ÆÞìoÌÿƒ¦³àéjîÿûÿh’$i³+Š4XCêýð°Ô9å‹©¹ßï¥Æ‚g‡Ï4 ›8U63Ç—‡I’jWñÐ=Ãk3Âç0@‰Z½oø&’$=VŦ»Rÿúå©sÎüÔ:lÛ”ïø’ðÙdSÁ ÂšûþNôü‘$iìÿáÓÜý×Âg0À(´¿û¿†¿Ñ)IªwE{Sêßz^ê^°SjùW)ßåÕá3 Ȧ–@…uÏ]=“$I[Ec]jîùæðù 0J“¿ý¸•$EßÛ?ïáóÈjàÂkWE)I’ÆRѸ75÷úÍðÙ 0Ý»D?v%I#jö*çáU>g|%µ–½;5n>w€z³¨¨|ÉËýy°$©­|á/P/3sR£¿’¤Þcû7Ÿõ“{û¿4~ÆÌ}4 €ŠjÿÿEÏ1I’Ærÿisßß Ÿ»c7ÿY©ÓéÑaIÒfVtJýÛÎþWû¨¦|—×ÄÏ€¹OÌ ¢z«žm’$¶^;µz_øÌˆ’/Ú& îº2úi,Iz¬{ûïº"õ.Ýoø šÃ«*ÝÛÌLU4hmŒw’$®A?µþXüÌ–ïôŠT<¸6ú©,Iµî‘{ûg¯ò9øý©±ð9áó Q € j.ûƒèÙ'IÒè*ŠáoREÏ[€ªhî÷ΔºÍè§³$Õ¢¢±.õo8%uΙ—Z‡þ÷”ïøâð9Ð! € êž» zJ’4²:gÏ„ÏZ€ªiõ‘”ŠAô#Z’¦«N#õo_‘º+wOíc?™š{¾iøEìÑÏ|€ÆYTÐàŽ•Ñ#R’¤‘Ô»ü ð9 PU³ RIÒSlÐOƒu«SïÊCSçÔ/¥Ö²w§Æü-ßí`“oÿKÃ/›‘$iÚêßzžÿx<3sRE?®%i"ro?@¶Y,*¦u䇣g¨$I¥7¸çš”oÿ‚ð9 Py ¶Jý5E?¶%©RùúÔ¿ñÔá•É­oÿYÊw|Iüó`îd°¨˜Þ¥ûFÏUI’J­ÈïKÍoü§ð 0)ò%¿œŠ×F?¾%)¦~7 î¼Ì½ýsËaP1ƒûo޵’$•W¿›Zþqø|˜4Íý?¥^;ú).Iã¿·Á³ÃŸÁ)bP!ùn¿=z%I*µöIŸ Ÿ¯“ª³üóÑqIݽý‡m;üÄèg-@cÊYTÈì!‰$IÓR÷â½Ãg+À¤ë]qpôã\’žò5³‡NÝs>|Ø¿øeáÏT€F YTHoõw£ç³$I¥4¸ã©1ËðÙ 0ñl•kWE?Ö%éñso?@ª* €ª˜™“ŠÆºè‘-IÒÓnvžå;¿*~¶L‰|—פ¢qoôã]’νýi’XTDsÏ7GpI’ž~ƒ~jüþð¹ 0mfŸ­³ÏXIwÅÆ5à :§ÿ[jðž”/Ú&ü™@¶Ù,*¢sò¢gº$IO»ÎÙsÃg*À´êœ3/ú1/iÊ+šRÿ¦ÓS÷¼íRëð¦|ÉËß}dO‹@Eô®9&zÎK’ô´êßv~jÌ{FøL˜Z3[¤þÍgE?î%MÓ½ý³Wù¬Úÿ§îíß"þY@*“@UîÿèžèÑ/IÒSnönê|§WÄÏT€)—/ùåTüY@6•,‚õ®88ú½C’¤'× ŸšKß>CxX¾h›4¸ÿ¦èé éåÞ~æÆ±6¸ïGѯ"’$=©º+v ŸŸ<ÚìÝà³ ZI¼·áÖáϲڲ”ïø’”Š"úÝD’¤Í®xàöáošFÏP~^÷‚%ÑcBª]Ŧ»Rÿúå©sÎüÔ:lÛáçG?  ñS,µŽøËèwI’žT³ÿa=?øæ?+ Ö^=*¤©­è<ô¨{û‡WùDÿÜÀÜÇg¨»bçè÷I’6»ÞÕG‡ÏN_sÏ7§ÔkE iòëwÓ`íªÔ½dŸÔ>îSîí M* €Èͅѯ4’$m^FÊw~Uøìà‰uNûrôÔ&«¢Hƒõ7¦ÞÞÛßÜÿ÷ScÁVá?ËÐ(@”Ïö›9’¤‰©sæ×âg'›gf‹Ô¿ý‚èÑ!U¶¢õ@êß|–{ûHu`¤µìÝ73Û= IDATÑï<’$mVƒûoö[p¦¹ûSê6£Gˆž{û¨»¾@ŒÎéÿý$IÒfÕ:üƒás€'¯sú¿Eiü÷ößyyê]ºojÿéáwb4æ=#üg,‚ôV7úÕH’¤'¬Ûùá3€§qïÓWlº3õ¯_ž:g|eøWö…ωÿ¹€¹Õb¤Ø¸&ú]I’¤Ç¯(Rsßß Ÿ™'¯æÒw¤T ¢GÆqoÿaÛ¦|‡†ÿ›²±³£ÖáŠ~”$é1›QÑs€ñë­Z=‚TB³ßéп}ÅÃWùý±”/ùåð[@V cÔ9g^ô{¡$I?×`ý ©1³Eøœ`üò^”Šü¾èQ¤'{oÿºÕ©·j÷öé‰XŒQïÚã¢_%Iú¹Ú'þCøŒ Nçä/D"=Nņ[RïÊCSçÔ/¥Ö²w§Æ‚g‡ÿ›²‰a0Fņ[£ß%IzTEc]j,Ü:|Fhf _\Ù{û_ÿïH“Ì`Lò힟RQD¿OJ’ô¨:gÏ Ÿ‘Äk.ûÿ½~oÿËÃÿÙÔ±“Öý~)IÒ£ë6S¾ã‹Ãg$Õ0{ÍŒFT¯•wü uWî‘Úßý›ÔÜýîíÒ8XŒÉì}’$U©Þ‡ÏGªcö7Ðg+]O³bë®ÎÙÎòϧ澿“óŸþ¿/Õ’À˜ô.; ú5T’¤GÕÜ÷wÃç#ÕÒ9ó«Ñãiâ*üqê]{\êœñ•Ô:ð‡×¿FÿïÐøc2ûçž’$U¥Á]W„ÏF*hþ–ipÿÍÑcª²íM?¹·ÿØO¦|·_ÿß `î/f03sRÑÚý®*IÒ#µÿtü| ’ÚG˜Ýs¦ÊVi°þ†á_*tNùbjî÷{©±àÙáŸ@£B,FmfÎðON%I ¯ßIùâ—ÆÏF&F¾h›Tò¯R¾Ë«Ã?€Æ²±Öa>ö—eI’«öQ Ÿ‹L ùÏJƒûoÝ€êwÓàÎËR÷’¥©}ܧRsÏ7»·`n9,F¬ó½Ý‹²$I›YÑ~05n>˜Lí£?^ÞLÚtçÃWùœñ•ÔZönó `îèXŒXïÒýJ{Q–$é©Ö»âð™À›™“wüàIÏŸ¢õ@êß|ÖOîí÷]4iœ,FýßzîŽq$IzrµýÓð™ÀdkðžÇ5Eç¡Ô¿}Eê®Ü=µýdjîù¦áâ úÿß³±Ù?o•$)²"_?¼¿9z&0ùú7žöðpôÒ`ÝêÔ»òÐÔ9õK_åcÖ¤ª±¡|Ñ6)Eì©$©öõVí>˜ù®¯MÍeàÞ~€¹“Á`„šKß}æ#I’ë`n=YŒPû˜ÿ}æ#Iªy³÷17l>€lì,F¨sÎüèsIRÍë]sLø<²#Ô»êˆèsIRÍk÷oÂç!…°¡ÁÚUÑç>’¤:7è¥|‡…ÏC a0BEsCôÑ$©Æõo=/|Y €É·Aô¹$©æuÎüZø<²0#Ò\úöèsIRÍk.}Gø<²0#Ò>ê#Ñç>’¤Wä÷¥ÆÌáóÈÂXŒHçô‹>û‘$Õ¸ÞÕG‡ÏB e0"ÝK–FŸýH’j\û„¿ Ÿ…@Ê`Ĭ$I廾6|Y( €¬¿1úìG’TÓŠ ·„ÏA g0 3[¤ÔkEŸÿH’jZïÊoÇÏB E³|çWEŸýH’j\û¤Ï†ÏB g0­oý—è³IRkîõ›á³ÈÂYŒ@û˜ODŸýH’jZÑÜ0¼Š.zY8 €èœñ•èóIRMëßprø²J°îÅ{EŸÿH’jZ笯‡ÏA « €Q|¨×Ÿ}þ#Iªi­ƒß>€¬,F`p×Ñç?’¤š–ïøâð9d•`0E¾>úüG’TÊn Ÿ@Ve[°UJE}$Iªa½ÕÇÆÏA U…@ÉšßüÏÑç?’¤šæ €€ÆO±(Yë ÷EŸÿH’jZë„ÏA « €’µýßÑç?’¤š–/~Yø²Ê°(Yç̯FŸÿH’jXÑX>€¬R,JÖ]¹{ô$©†õo;?|Y¥X”¬wõÑÑg@’¤Ö½diø ²J±(û½íûÑg@’¤Ö9å‹á3È*Å dƒõ7FŸI’jXëà÷‡Ï@ « €’í£Ï€$I5,ßù•á3È*Å L Ÿ}þ#Iªa³ËçÆÌœø9¤*±(Q¾Ûë£Ï€$I5l°öÒðd•cP¢Ö²wGŸI’jXïšï„Ï@ « €µúHô$©†u/X>€¬r,JÔ>ésÑg@’¤6;¢g UŽ@‰:çÌ‹>’$Õ°Ö!Ÿ@V9%ê®Ü#ú H’TÚ»¿1|YåX”¨wÕ‘Ñg@’¤ºU©±`«ðd•cPæ‡yó™ÑÇ@’¤šU<¸6|þY%Y”hpçåÑç@’¤š5¸ceøü²J²(Q±ñŽès IRÍê­>6|þY%Y”(u›Ñç@’¤šÕ½xïðùd•dP’|Ñ6Ñg@’¤Ö9{nø ²J²(I¾ëë¢Ï€$I5¬}Â߇Ï@ «$ €’4—¾#ú H’TÃZ‡m>€¬’,JÒ:øýÑg@’¤6»€Žž@VI%iõÑè3 IR ËwzEø ²J²(Iû„¿‹>’$Õ­¢HùÏ Ÿ@VI%éœþ¯ÑÇ@’¤šU´Ÿ@VY%éž·]ô9$©fn Ÿ@VY%é^¼Wô9$©f î¼<|þYeY”¤÷ÃâÏ$I5«ËÙáóÈ*Ë ¬ò†“£Ï$I5«·úØðùd•ePÖyûŠès IRÍê]ö­ðùd•eP’Á=×DŸI’jVwÅÎáóÈ*Ë $ÅÆ5Ñç@’¤šÕ9ëëáóÈ*Ë $E~_ô9$©fu–>|þYeY”$õ;Ñç@’¤šÕ>ö“áóÈ*Ë  ó·Œ>’$Õ°öQŸ@ª* €ä;¼(ú H’TÃZßþ³ðd•eP‚|—×DŸI’jXëÀ÷†Ï@ «, €4÷|Sô$©†5÷û½ðd•eP‚æ~ïŒ>’$Õ°æ^o Ÿ@VY%hô¾è3 IR k~ã?…Ï@ «, €´ÿPô$©†å;½"|YeY” ý¿Ž>’$Õ°|‡†Ï@ «, €´ÿtô$©†5l>€¬²,JÐYþÑg@’¤Ö˜÷Ìðd•eP‚Îi_Ž>’$Õ°ÆÌœðd•eP‚Ι_‹>’$Õ­¢Ÿ@Vi%èž» úH’T·½ðùd•fP‚îK¢$Iu«×Ÿ@Vi%è^ôÍèc IRÝêæáóÈ*Í ½K÷>’$Õ¬¢½)|þY¥Y” wÅÁÑç@’¤šU47„Ï? «4 €ô®>*úH’T³Š|}øü²J³(AïÚã¢Ï$I5«h¬ Ÿ@Vie|ˆ×Ÿ}$IªYþh< €2>ÄO>’$Õ,ß4ž€@âÍgFŸI’jVÑ~0|þY¥Y”ñ!Þznô9$©nuáóÈ*Í Œñö ¢$Iu«× Ÿ@Vi%ܱ2úH’T·½ðùd•fP‚ÁÚK£$Iu«(ÂçUš@ w]} $Iªa™9á3È*Ë ƒ{®‰>’$հƼg†Ï@ «, € î½.ú H’Tà ¶ Ÿ@VY%Ü{}ô$©†å‹¶ Ÿ@VY%¬¿!ú H’TÃò_>€¬²,J0Xcô$©†å;¿*|YeY”À@’QóoŸ@VY%°$EÔÜë-á3È*Ë ƒû~}$IªaÍýÞ>€¬²,J` IЍuÀ…Ï@ «, € î¿)ú H’TÃZ‡| |YeY”À@’Q눿Ÿ@VY%°$EÔþÎ_‡Ï@ «, €øIRDíã?>€¬²,J0¸÷ºè3 IR ë,ÿÇðd•eP‚ÁÝWEŸI’jXçô Ÿ@VY%ÜyYô$©†uÏ]>€¬²,J0øñÅÑg@’¤Ö½è›á3È*Ë ŒñöÑg@’¤Ö»üÀðd•ePƇxë¹Ñg@’¤Ö[ýÝðd•ePƇxÓÑg@’¤6;¢g U–@â §DŸI’jØàŽ•á3È*Ë Œñº¢Ï€$I5l°nuø ²Ê²(Aïšc¢Ï€$I5¬ØxGø ²Ê²(Aïª#¢Ï€$I5¬hm Ÿ@VY%è]yhô$©ŽƒÔ˜Ù"|Y%Y” wÙÑG@’¤š–o÷¼ð9d•dP‚î%K£Ï$I5-ßùUásÈ*É Ýì}þ#Iªiͽ+|Y%Y” {ánÑç?’¤šÖ:ð½ásÈ*É Ý –DŸÿH’jZû¨„ÏA «$ €tÏÛ.úüG’TÓÚ'þCø²J²(AçœùÑç?’¤šÖ9ó«ásÈ*É ³¾}þ#IªiÝ;‡ÏA «$ €tNÿ×èóIRMë]~`ø²J²(Agùç£Ï$I5­Ý ásÈ*É íãþ6úüG’TÓú·_>€¬’,JÐ>ê£Ñç?’¤š6Xwmø²J²(AëÐ?>ÿ‘$Õ´â¡»Ãç U’@ ZßúÃèóIR]ëwScfNø,²Ê±(AsŸ·EÿH’j\¾ÝóÂg!UŽ@ š»¿1úìG’TãòÝ^> €¬r,JïüÊè³IRkîÿ®ðYd•cP‚|ûDŸýH’j\눿 Ÿ…@V9e˜÷Ìè³IRkŸô¹øY¤ª±(Iêµ£Ï$I5­sÎüð9d•cP’¢yôù$©¦u/Y>€¬r,JRl\}þ#Iªi½k Ÿƒ@V9%Ü{]ôù$©¦õ×\>€¬r,J2X»*úüG’TÓ÷ß>€¬r,Êú o=/úüG’TÓŠö¦ð9d•cPÖyÃ)Ñç?’¤×XøœðYd•bP’ÞÕGGŸýH’j\¾ëëÂg!UŠ@Iz—}ö#IªqÍý~/|Y¥X”¤»rè³IRkþ¡ðYd•bP’î÷wŒ>û‘$Õ¸öIŸ Ÿ…@V)%éœùÕè³IRëž·(|Y¥X”¤}Òg£Ï~$I5nö»h¢g!UŠ@IÚG,úìG’Tãú7> €¬R,JÒ:øýÑg?’¤7¸çšðYd•bP’æÒ·GŸýH’j\ÑÜ> €¬R,J’ïúºè³IRÍk,znø<²Ê°(I¾ý ¢Ï}$I5¯ù7„ÏC « €²ÌÌIiЋ>û‘$Õ¸Ö‡@ª €ùúè³IRkó‰ðYd•aP¢Á}?Š>û‘$Õ¸Îéÿ> €¬2,J4øñÅÑg?’¤×½è›á³È*Ã`¦$Iõ®9&|YeX”¨wÕÑg?’¤×_sQø,²Ê°(Q÷â½£Ï~$I5®xàöðYd•aP¢îy‹¢Ï~$Iu®ßMyÏŸ‡@V %êœöåè£IRÍËw~Uø<²J°(Qû¸OEŸûH’j^kÙ»Ãç!U‚@‰Z‡(úÜG’TóÚÇ|"|Y%X”¨õ­?Œ>÷‘$ռΙ_ Ÿ‡@V %jîùæèsIRÍë]ºoø<²J°(Q¾Ó+¢Ï}$I5¯ã©áóÈ*Á L ¶Š>÷‘$Õ¼ÁºÕñóHU`P²¢½)úìG’TãŠÎCá³È*Á dƒû~}ö#Iªyù/ Ÿ‡@ΠìôöÑç>’¤š×Üç·Ãç!…³(Yoõ±Ñç>’¤š×:â/Âç!…³(Y÷’}¢Ï}$I5¯sê—Âç!…³(YçœyÑç>’¤š×½p×ðydá,JÖ>é³Ñç>’¤š×»æ˜ðydá,JÖ:â/£Ï}$I5o°öÒðydá,JÖÜÿ]Ñç>’¤šWäëÃç!…³(Y¾Ûë£Ï}$IJùvÏŸ‰@Ê l‹ž}æ#IRjîýÖø™¤H#PtŠ>÷‘$Õ¼Ö‘Ÿ‡@Ê`÷ß}î#IªyïýKø<²P£øP×\}î#IªyÝ‹÷Ÿ‡@Ê`êµÇGŸûH’j^ÿÆÓÂç!…²Þ¥ûFŸûH’jÞ`ý áóÈBYŒ@÷ÜÑç>’¤º×k§ÆÌá3ÈÂXŒ@gù?FûH’”ò]^>€,ŒÀ´ü«è3I’Rë€? Ÿ‰@Æ`ZËÞ}æ#IRj÷©ð™da,F ù7DŸùH’”ºç. Ÿ‰@Æ`=7úÌG’¤Ôûááñ3HQ,F¤hnˆ>÷‘$Õ¼þš‹Âç!…±‘Á=WGŸûH’j^ñÐÝáóÈÂXŒêƒ½ñ´èsIRÝ+Š”/Ú&|&Y €é­Ú?úØG’¤ÔÜû­á3ÈBXŒHçœyÑg>’$¥öQ Ÿ‰@Â`DÚÇ:úÌG’¤Ô9óká3ÈBXŒHëàÿ}æ#IRê]~PøL²#ÒÜã7¢Ï|$IJýÛW„ÏD a0"ù¢m¢Ï|$IJÅC÷„ÏD a0BEkcô¹$I)ßþá3ÈÆÎ`„÷\}æ#IRj.}{øL²±³Ç+IRdíïüð™dcg0B½Ë¾}æ#IRêœ=7|&ÙØYŒPçœùÑg>’$¥Þ•‡†ÏD ; €jŸðwÑg>’$¥Á+Ãg"Àµù“è3I’R‘¯Ÿ‰@6v#ÔÜóMÑg>’$ Ëwxaø\²±²¡|»çEŸ÷H’4¬¹ïï†ÏE + €+ÚFŸùH’”ÚÇ|"|&ÙXYŒØ`Ýêè3I’Rçœùá3ÈÆÊ`ÔðM§GŸùH’”zW>€l¬,F¬·jYô™$Iipçåá3ÈÆÊ`Ä:g~-úÌG’¤”:Ô˜™>€ll,F¬}ÌÿŒ>ò‘$iX¾Ë«Ãç"Àˆ5÷ÿýèóI’†µ~ø\²±±±|É/GŸ÷H’4¬sò?…ÏE  €1˜½wY’¤èºï>€ll,Æ`°îÚè3I’Rÿæ³Âg"À8>äN‰>ó‘$)@66c0{å‚$IáEÊm>€l,,Æ ó½Ž>ò‘$iXséÛÃç"…À´Žüpôy$IÃÚÇ|"|.ÙXXŒAsŸ·EŸ÷H’4¬{îÂð¹dca0ùö/ˆ>ï‘$iXïšï„ÏE  €1)ZDŸùH’”w_>€l,,Ædp×Ñg>’$¥Ôk¥Æ¼g„ÏE 9 €1é]{\ô‘$IÃòÝ~5|.ÙÈYŒI÷Â]£Ï{$IÖ:ôOÃç"œÀ˜tNþBôy$IÃ:§ýßð¹d#g0&­oÿYôy$IÃz—î>€lä,Ƥ¹ÇoDŸ÷H’4¬ûŠð¹d#g0. ·N©(¢Ï|$IJEsCü\Ò¨YŒQñÐÝÑg>’$ Ëwú•ð¹d#e0Î{Í…Ñç=’$ kô¾ð¹d#e0F½+Ž>ï‘$iXç”/†ÏE ) €1êœõõèóI’†u/Y>€l¤,ƨ}ôÇ¢Ï{$IÖ¿íüð¹d#e0Fͽß}Þ#IÒ°"_>€l¤,ÆiÑsS*Šè3I’†å‹_?€4*cVlº3ú¼G’¤a­ß>€ld,Æýßv~ôy$IÃ:Ë?>€ld,ƬwÙ·¢Ï{$IÖ½xïð¹d#c0f3þ=ú¼G’¤aý[Ï Ÿ‹@62cÖ:òÃÑç=’$ +º'|.ÙÈXŒYs¯ßŒ>ï‘$é‘ò_>€l$,ÆmáÖ)ƒèóI’†µø£øÙ¤Q°Pl\}Þ#IÒ°öIŸ Ÿ‹@6ú-gGŸ÷H’4¬»rð¹d#a {ÉÒèóI’†Í.¥£ç"„@€Î÷þ9ú¼G’¤aÅCw‡ÏE  €­Ã?}Þ#IÒ#å‹_>€¬tš{üzôY$IÔ:ðÃg#•Î Âü-Sô£Ï{$IÖ9õKñ³He³Rl¸%ú¼G’¤a½UËÂç"•Î ꃿéôèóI’† Óp IDATîøAø\²ÒYé®Ü#ú¼G’¤aE{SjÌÌ Ÿ@V* € í“>}Þ#IÒ#廾.|6Y©,‚´xOôY$IÔ:üƒá³ÈJe$_ü²è³I’©sæ×Âg#•Ê P‘ß}Þ#IÒ°ÞUG†ÏE +•@䇿æÂèóI’† î¹:|.Y©,õ.; ú¼G’¤‡ëwScþ–á³ÈJc¨ó½‰>îùÿÙ»óx»ëúÀÿ'„MQ±SíÏiu|Ôþ,ŽÚVÖª¸´:?—±3ÖêTeœ.ZGÇÖ¶jµ÷&!a_4„Ù!ì‚„ Ùd€†-,Âçìç|¿ó¸¡=ñx³Ü5ïs¾ßçëñxþ¯áæó>÷óÎýÜ\’¤«vè›Ãg#P™1êßýPô]$I½g|*|6•c¨zðoFßõH’Ô«uåÞá³¨Ì €H£Ûåy«}ß#IÒ†:wŸ?€|¦Xë>zKô}$IÊÖ­Ÿ‹@eÆXkßzjô}$I/”eyuÑKÃg#P™Áš—Ï‹¾î‘$©WíÈw„ÏF 2#,‚5NÿDô]$I½çþuøl*3 XíÐ7GßõH’Ô«uÝ’ðÙTf„@´ù;æy·}ß#IÒ†:þ0~6ùL°ݧ~}ß#IÒ†²ú3y>€Ê´Y €ÎÝçGß÷H’Ô«zÐkÃg#P™6 €кjÿè»I’zÕOþhøl*Óf0g.ú®G’¤^ÍŒ„ÏF 2m vä;¢ïz$IêÕ¾ã¬ðÙT¦Í`T½4ϳ,ú¾G’¤ ýrúèÙT¦Í`@dÏ<}ß#IÒ eݼºð%᳨L‹À€èÜó½èëI’zÕ–½3|6•i±­î}×#IR¯ÆyŸŸ@eZ,Dã¬ÏDßõH’Ô«µjiøl*Ób0 jKß}×#IR¯ÎÏ® Ÿ@eZ,Å‚ò¼Û޾ï‘$iCYc}žFçÄÏG Ÿ* €Ò}âîèûI’zU~]øl*Sf0@Úwœ}×#IR¯ú)>€Ê”Y æåó£ïz$Iê56—¢g#P™2 €Ò8íÏ¢ïz$IêÕ¹óœðÙT¦Ì`€ÔyCô]$I½²u„ÏF 2eƒdÞ܀ʔX ˜êA¯¾ë‘$ic­Zžæm>€Ê¤Y šÑ9yV6úºG’¤^µ%oŠŸ@>Y¨ûók£ïz$IêÕ8ë3᳨LšÀjßpTô]$I½Z×>€Ê¤Y  æE}×#IR¯Î—‡ÏF 2i¨~ìGßõH’Ô+«=>€Ê¤Y  êÞÿ.ú®G’¤¾ªþ‡ðùT&Å`@eÏ­‰¾ë‘$©Wý”…ÏF 2)ªsÏ÷¢ïz$IêÕºbAøl*“b0 ZWî}×#IR¯Î]ç…ÏF 2)ªqúŸGßõH’Ô+{ög᳨LŠÀ€ªò†è»I’úªîóŠðùT&Ì`PÍ››ç­jô]$I½êǽ?~>ùDY °îÃ?޾ë‘$©Wóûÿ>€Ê„Y °öGGßõH’Ô«ý““Ãg#P™0 €Ö¼ðËÑw=’$õꮽ3|6• ³`õ£ß}×#IÒÆº<íùâðùT&Ä`€U÷Ú5ϳ,úºG’¤^µ#ÿ |>• ±pÙ3FßõH’Ô«qþÂg#P™ €×¹ûüè»I’zµ|Døl*b0àZ+FßõH’Ô«»æúðÙT&Ä`À5Nûxô]$IkUó4onø|*[e0àjßþ£¯z$Iê«¶äMáó¨l•À Ý.ÏšÏGßõH’Ô«±|øùä[c0º?¿6ú®G’¤^­k‡ÏF ²UC ýã#¢ïz$IêÕyèêðÙT¶Ê`4/øbô]$I½Æž¦{¢.z>•-²µ£v¾ë‘$©¯Ú!oŸ@e‹,†ÁÂ]ò¼Û‰¾ë‘$©Wã¬OÇÏG ß €!Ñ}âîè»I’zµ®98|6•-²í[O¾ë‘$©WgõÊðÙT¶È`H4/ùZô]$I½²Æs~0Œ 6 €!Q?îýÑw=’$õUûÎëÃç#PÙ, €!QÝûWò<Ë¢ïz$IêÕ8ã“áó¨l–ÀÉžy(ú®G’¤^­«öŸ@e³,†Hç®s£ïz$IêÕyà᳨l–Ài^>/ú®G’¤^Ym]žFç„ÏG ²IC¤~òG£ïz$Iê«zðëÂç#PÙ$ €!R=àÕÑ÷<’$õÕ8íÏÂç#PÙ$ €!“=ÿxô]$I½Z?Ü'|6•M²2ûVDßõH’Ôkl.EÏF ²IC¦õÃ}£ïz$Iê•UŸ Ÿ@e“,†Lãô?¾ë‘$©¯êÿ!|>•q,†Lí;¯¾ç‘$©¯ú©ÿ-|>•q,†Í蜀Ê8C¨uí!Ñw=’$õÊž<|6•q,†PãìÏEßõH’ÔWõÀׄÏG ÒÇ`Õû½è{I’úò‹€ 2p,†Ñüò¼Ýˆ¾ë‘$©Wëʽãç#ÿ" €!Õ}øÇÑw=’$õêÜ·"|6•>Cªµêðè»I’zeµ§ó4:'|>• €!Õ8÷¯¢ïz$Iê«zðëÂç#Pé±R~°$iÐjœþçáó¨ôX «ysó¼U¾ë‘$©Wëêâç#ÿ €!ÖýùµÑw=’$õꬾ"|6• €!ÖºnIô]$I½²ÆsyÝ.|>• ,†Xãìÿ}×#IR_µÅ»…ÏG ²À«-ySô=$I}5Îútø|*X ³Ñíò¬±>ú®G’¤^­}'~>ù €!×yèªè»I’zuº:|6• ,†\ëGߎ¾ë‘$ic­jžæm>€ŠÀ°{kY’¤Aªvè›Ãç#P±vµÅ»EßóH’ÔWãìÏ…ÏG b0ôFçäYý™è»I’zµ®?,~>¹@tV_}×#IR¯îšëÃg#P±(‚ÖÕDßõH’´±v=OówŸPv €á×8ã“ÑW=’$õU[úÖðùe×±~µoÿVô=$I}5Îû›ðùe×±(È/®>}×#IR¯ö Ëâç#”\Ç :÷_}×#IR¯î#7…ÏF(»Ž@1´~¸Oô]$Ië´ò´`çðù©Ä, ¢qÚÇ£¯z$Iê«vä;Âç#¤³(ˆêA¯¾ç‘$©¯æ…_ŸJÌ @²´6ú®G’¤^í[N ŸJÌ @:÷^}×#IR¯îw‡ÏFH%fP ­• £ïz$IÚX–åÕ½^> •”@ÔOùXôU$I}Õ{ø|€TRR=à7¢ïy$Iê«yé7Ãç#¤’²(˜lý£Ñw=’$õêÜyNøl€TRÓ¹û‚è»I’z-¦£g#¤’²(˜æåó£ïz$I꫺ÿ¯‡ÏGH%dP0õ“>}Ï#IR_õSþ4|>@*! €‚©î÷ÿDßóH’ÔWëʽÃç#¤²( ì¹5Ñw=’$õêÜYøl€TBÔ¹ëÜè»I’zeõgó4º]ø|€T2ÔüÁHô]$I}Õï> •Œ@ÕOü/Ñ÷<’$õÕXþÙðù©d, ¨ºÏ+¢ïy$Iê«uÝ’ðù©d, *{æÁè»I’zu×\> •Œ@Aµï8+ú®G’¤µyZ°Sø|€T"Õ¼ôŸ£¯z$Iê«vÄï‡ÏGH%bPPõã?}Ï#IR_Í þwø|€T"UÝk×<ϲè»I’zµo>>|>@* €ë>}_ô]$I½ºkïŸJÄ ÀÚ·ž}×#IÒÆ²n^]ô²ðù©$, ¬yñW£¯z$Iê«~ì‡ÏGH%aP`µ£v¾ç‘$©¯æŠo„ÏGH%aPd vÎóN+ú®G’¤^í;–ÇÏG) €‚ë>rSô]$I½²g> •„@Áµ|Dô]$I}U÷ÿõðù©, ®qÎ_FßóH’ÔWý”? ŸJÀ àjKÞ}Ï#IR_­î> •€@Ñn—gç¢ïz$IêÕY}Eü|€‘â³(±‹I’¥¬±>Oóæ†ÏGHgP­«ö‹¾ë‘$©¯Ú¡oŸ Π§}<úžG’¤¾çþUø|€Tp%P=ð5Ñ÷<’$õÕ¾á¨ðù©à,J"[ÿHô]$I½ºÝ> œ@Itî:7ú®G’¤u;yuÑËÂç#¤³(‰æeߊ¾ê‘$©¯ú±> ˜@IÔÿ@ô=$I}5W|#|>@*0 €’¨îµkžgÝè»I’zuî<'|>@*0 €é>qwô]$I½²õ†ÏFHfP"í[NŒ¾ë‘$©¯ê¯Ÿ Ê Dš~)úžG’¤¾§}<|>@*( €©ñöè{I’új]}@ø|€TPe2Ç @É´®[}Õ#IR_µ¥o Ÿ È dg}&úžG’¤¾ç!|>@* €’©-þíè{I’újßt\ø|€T@e3:'ϪOEßõH’Ô«»öÎøù#ÅcPBûVDßõH’´±,Ë«{½<|>@* €j­\}Õ#IR_õãÞ> Œ@ ÕOþhô=$I}5/û—ðù©`,J¨ºï¯EßóH’ÔWçî Âç#¤‚±(©ì™‡¢ïz$Iê•¥µá³RÁX”Tûö3£ïz$Iê«zðëÂç#¤±(©æ%_‹¾ç‘$©¯ÆYŸŸ Ä ¤êÇüaô=$I}µ®?4|>@* €²Z¸KžwÛÑw=’$õê>rcü|€‘â°(±îc·FßõH’´±n{Â:z>@* €kßxtôU$I}Õy_ø|€T%Ö8ïóÑ÷<’$õÕ\ñðù© ,J¬¶ô-Ñ÷<’$õÕ¹ëÜðù© ,ÊlÞÜ@* €’kœñÉè{I’új]·$|>@* €’{fA’¤Aªûð áóRXgÏ?}×#IÒÆ:­<íùâðùiÈYwî¹0úªG’¤¾êG¿'|>@räÍŒFßóH’ÔWó’¯…ÏGHC΀¼~ŸDßóH’ÔWçÎsÂç#¤!g@^Ýëåyžu£ïz$Iê5öûi¢ç#¤!gÀÝ'ë‘$©¯êA¯ Ÿ†˜´o91úžG’¤¾g|*|>@blмðKÑ÷<’$õÕºöðùiˆY°Aíˆß¾ç‘$©¯îšUáóÒ³àówÈóV-ú®G’¤uZyÚóEñ3F†“=ÝŸ_}Õ#IR_õ£Þ> ) zZ×.޾ç‘$©¯æ%ÿ> ) zgþEô=$I}µï<;|>@RôÔ¾ý[Ñ÷<’$õ•=ÿxø|€4¤,ØhtNžUŸŒ¾ë‘$©¯êÁ¯‹Ÿ‘02|,èÓ¹÷¢è{I’új,ÿlø|€4„,èÓ¼|~ô=$I}µ|Dø|€4„,èS?ñ¿DßóH’ÔW÷±[Ãç#¤!d@ŸêÞÿ.ϳ,ú®G’¤eݼº×®á3Ò±`œîS?¾ê‘$©¯ú  Ÿ†Œã´rrô=$I}µ®X>  Æi~ïÿDßóH’ÔWçþËÂç#¤!cÀ8µ#ß}Ï#IR_Yóù<ÍÛ>|F@"Œ·`§@"lRëº%Ñ÷<’$õÕ¾õ”ðùiˆX°I³>}Ï#IR_Ù3†ÏGHCÄ€Mª}çõÑ÷<’$«zÀ«Ãg$¤!aÀ¦ÎɳêSÑ÷<’$õÕ8ýñ3F†ƒ[ýâ$iPjýè;áóÒ°`³ZWì}Ï#IR_Ý5«Âç#¤!aÀfÕ¿û¡è{I’úë´ò´ç‹Ãg$¤!`ÀfU÷ùÕ<ϲè«I’úªó‡á3Ò°`‹ºOß}Ï#IR_ÍK¿>  ¶¨}ë©Ñ÷<’$õÕ¹çÂðùiX°EÍ‹þ.úžG’¤¾²Úº<Î Ÿ‘œ[T[ö®è{I’ÆU;ä á3Ò€³`Ëì”çíFô=$I}5Îýëø #ƒÍ€­ê>|Cô=$I}µo>!|>@plUëúâïy$Iê«ûôýáóÒ€³`«Ë÷ˆ¾ç‘$i\Õý=|F@`lUmñnÑw<’$«qú'Âg$¤fÀÖÎɳںè{I’új]{HüŒ€‘ÁeÀ„tî[}Ï#IR_ÝGn Ÿ˜ÒZ¹(úžG’¤þº¼º×®á3Ò€²`Bê'}$úšG’¤qÕOø`øŒ€4 ,˜ê¾¯Œ¾ã‘$i\­• Ãg$¤eÀ„eëVGßóH’ÔWgõÊðùi@Y0aíÛN¾ç‘$©¿V-Oów Ÿ‘Ö¼ø«Ñ×<’$«¶ìá3Ò²`ÂjGí}Ç#IÒ¸š—üSøŒ€4€,˜¸;çy§}Ï#IR_»Î‹Ÿ‘02x,˜”î#7FßóH’ÔWV}2O£sÂg$¤cÀ¤´V-¾ç‘$i\µ%o Ÿ‘Œ“ÒX¾Gô$Iãjœ÷ùð iÀX0)µCÞ}Ç#IÒ¸Ú·|7|F@0LÎèœ<«­‹¾ç‘$©¯lÝêø #ƒÅ€IëÜiô=$Iãªðêð i€X0i­•‹¢ïx$IWãŒO†ÏHHÄ€I«Ÿô‘è;I’ÆÕºþÐð i€X0iÕ}_}Ç#IÒ¸ºý$|F@ LÉØ/[”$i ÊºyuŸ_ Ÿ‘„SÒ¾í´èkI’ÆU?ù¿†ÏHH€)i^üÕè;I’ÆÕºúÀð i@X0%µ£v¾ã‘$i\݇>#  ¦fÁÎyÞiFßóH’Ô_·W½4~NÀH< ¦¬ûÈÑ×<’$«~ÂÃg$¤`À”µV-¾ã‘$i\­+÷Ÿ‘€SÖX¾Gô$Iãê' ³`êFçäYm]ô5$IãªûGñsFbY0-ûVDßñH’4®æåóÃg$¤`LKkå¢è;I’ÆÕyàá3R0 ¦¥~ÒG¢ïx$I_«š§ù;†ÏIH,˜–꾯Œ¾â‘$i“ÕŽÚ=|N@ dÀ´eëVGßñH’4®æ¥ÿ># ²`ÚÚ·}Ç#IÒ¸:÷^># ²`Úšÿ}ô$IãÊÏåiÞÜð9 )ˆÓV[ö®è;I’6Yíð·…ÏIHA,˜¾;çy§}Ç#IÒ¸šßÿ‡ø9 À¦Íß1¯ùyóÂ/åí[NÌ«¼:þÓH±X0#ºÜ}Ç#IÒ¸:w>#xAuÿŸ7NÿDÞºvqÞyèêžϺ3òý[ý„Æÿÿ) fÆèœ<«­›‘¿è’$Íd;ωŸ“Cüný¤ä­«öÛä»ý3ÙØ“AÑÿSÁX0c:÷­˜µ¿ü’$Mµ¬ö´ß0Õý^µá²¿yùü¼s÷yV}r›~ÿÖ8ãSá©`,˜1­• ·é IÒD«-}Køœ(â»ý3YãìÏ…ÿ¹¤‚±`ÆŒm%IÄš5|N Ô»ýÝN>h5/øbüŸÕH±X0cªû¾2úŒ$i“uî>?|NĽÛ_͇¡æ÷ÿ!üÏ.Œ3*[·:úœ$i\YýÙ<Í›>'fZu¯—çõã?°ñÝþôD>¬5/ûVøŸg* fTû¶Ó¢Ï I’6Yíð·…ÏI€iY¸Ëøwû³,/Jc¿c4üÏx¤X,˜QÍ‹ÿ>úœ$i“5¿ÿás`ÂæÍí{·ÃS>f^äZWÿç>R,̨ڲwEŸ’$m²Î=†ÏI€­½Û¿á)Ÿû/šwûg²Öõ‡†ÿwHcÀÌZ°sá7‘’¤á,k¬ÏÓ¼íãg%PzÕ½v}á)Ÿßø×wû×FË4µo<&ü¿M* f\÷á¢Ï I’6Y툷‡ÏI dæï°áw’õÝþ™¬}ë)ñÿ½FŠÅ€׺þ°è³B’¤MÖ\ñõð9 X ßíŸÉÚwžÿßp¤X,˜qå{DŸ’$m²Î½‡ÏI Àïö7Sô·=CïÙ*3΀W[¼[ôY!IÒ&ËšÏoøñÛèY àÝþçþ§puV_þß9Œ3otNžÕÖEŸ’$m²Ú²wÆÏJ`°y·?¤îϯ‹ÿo?R,ÌŠÎ}+¢Ï I’6YóÒo†ÏI`ÀÞí?ôwòƹ•·oX–w½%Ï»íèo]JY÷‘›â¿FŠÅ€YÑZ¹0ú¼$i“uî»$|NònÿØS>^²˜ºý$üë#Œ³¢~Ò‡£Ï I’6]«š§ù;†ÏJ`öU½ì…wûÇžò¹ýLïöxÝÇoÿšIcÀ¬¨îûÊèóB’¤Í6ö @ô¬fØž/ÊkGíž7/ú»¼}ë)y÷éû¢¿õÐ$ë>qwü×ÑH±X0k²uDŸ’$m²æFÃç$0=Õƒ_—7–6o]»8ïþµœ Æ€Y5ö#]’$ jSÿ{ø¬€¡3oûÞí_þÙ¼}Ã2ïökÆÊêÏÄ}‹³ª¶x·èsC’¤ÍÖZµ4|VÀ0<åÓ8ýÞí׬—5Ö‡½§‚±`vÎɳںè³C’¤MÖ}òžøY ƒünõ©èí*S­jøßT0̺Î}+¢I’6[õÀׄÏJ„wû7<å#EÖn„ÿ½HcÀ¬k­\}tH’´ÙgÿÏðY ³Î»ý†ºíø¿+#ÅbÀ¬«Ÿôáè£C’¤ÍÖ¾å»á³fýÝþV-ú£·´õ²,üïN* f]ußWF’$m¶lý#á³föÝþ'£?fKSnìwŠFÿJbÀ6‘­{ úì$i³ÕyCø¬€‰¨.|‰wûUèÆž«Šþ{– Ä€m¢}ë©Ñg‡$I›­yá—Ãg%Œ3‡¼vøÛòæ_ÌÛ7ïÝ~•¢´`çø¿{#ÅaÀ6Ѽøï£ÏI’6[çÎsÂg%üÛS>­«öón¿J[š¿cøßÅT lµeïŠ>;$IÚlYm]žæÍ Ÿ—”Gu¿Wåõ“?š·V.Ê;÷]²á3©$O¥fÀ¶±`§}„H’´ù:Í ?š=/\Õ½vÍëÇ o^>?ïÜ}Až¥'¢?ÅJŪÝÿ{ž Æ€m¦zÐk£I’¶Xý» Ÿ— ˆ…»x·_ÚÖµjñ÷GŠÅ€m*{îáècD’¤Í6ö\]ô¬ À¼¹ymÉóÆòÏæ­k¿ð”O§ýñT*]Yóùøó`¤X,ئÚwž}ŽH’´Ùºkï Ÿ•l»wû7<åsÿeÞí—¤¬þløù Æ€mª¹âëÑçˆ$I[¬zàkÂç%3ünÿØS>+¾ñ¯ïö¯þÈ)i3eµuágF* ¶©úÑï>G$IÚbsþWø¼`Šæï×›wû¥!-«>ŽŒ‹ÛÖž/ÊóN+ú,‘$i³µo=5~^°uÞí— ×ØO脟-#ÅbÀ6×}äÆè³D’¤-ÿ‹“ÑíÂç%[x·ì)Ÿú3Ñ%ÍpÙúGÃÏšT0ls­ë>K$IÚbc?6=/ʬºèeýïö?ÿxôGDIÛ ì¹5áçO* ¶¹ÆYŸ‰>K$IÚbÍK¿>/Jûý’þµìÙŸÅŸI#ÅbÀ6WûöoEŸ%’$m±Îê+Âç%@iÞío7¢?þI²u«ãÏ©‘b± „Ý“$ tf^]ø’ðy P¸wûkë¢?éIàºOß~n¥‚± ÄØÐ—$i«÷Cáó`(ßí{Êçö3óìùÇ¢?ÒI²ºOÞ~–¥‚± Dó²oEŸ'’$m±±Iž—kÁÎymÙ»òæE—·rrÞ}ê§Ñß$ îwÅŸo#Åb@ˆúqÿ)ú<‘$i‹u×Þ>/Eõà×y·_Ò¬×}ì'áç]* b,Ü%Ï»íè3E’¤-V=ð5ñ3 üÝþ§£?–I*IÝ5ׇŸ©`,3¶Ñ“$ikœó—áó`6U÷zy^?þ?çÍËþ%ïÜ}~ž­4ú#˜¤×yðÊðs1ŒaÚ?>2úL‘$i‹µo?#|^̘ù;äµ%oÌç}>oßrbÞ]{GžgÝè\’Ôkì²:ü¬) Â4Îþ\ô™"IÒËjëò4oûð™ 03ïö×£?^IÒëÜunøÙ™ Æ€0µCÞ}¦H’´ÕêG½;|fLúÝþêSÑ£$iÒµo=5ü/€›·ý ïö/ÿlÞ¾a™wû%ºÖªÃãÏÝ‘b± ÔØ&J’4ÐeÙ†©ž™@9Œ}îhœþ‰ïö·jÑŸ†$i›ÕúÑ·ÃÏáT0„ªŸð'ÑçŠ$I[­±|ð™ wû%©¿Ö•{‡ŸÍ©`,UÝkW?º(Iøü"*`ºª _Ò÷nÿ†§|$I}5/Ÿ~^§‚± \wíÑg‹$I[lì—Ö§ysÃg&0|ïö=å3ö;…üã7IÚzÍK¾†‹áÚ7}¶H’´ÕjËÞ>3€Á~ʧuÕ~Þí—¤iÔüÞÿ ?ÓSÁX®qÞßDŸ-’$mµÖ{†ÏL ^u¿WýÒ»ýOFL‘¤Â4vO}Χ‚± \íÐ7GŸ-’$mµîšUá3ض¼Û/IÛ¶ÆYŸ ?ûSÁXot»<«?}¾H’´å²n^Ý÷×âç&°íÞíïv¢?HR©jœögñó`¤X,û/‹>_$IÚj³>>3€™áÝ~I¼ÆÎåèù Æ€ÐZ¹(ú|‘$i«µrrøÌ&¯º×ËóúñØønz"úc…$iÕ{øÌHcÀ@¨ŸôáèóE’¤­6vY0öt]ôܶònÿ1ïË›—üSÞ¾ýÌ<{æ¡è’¤ V?ú=ás$Œ¡ºÏ¯æy–EŸ1’$mµÚ‘>7€_x·é[óÆù_ÈÛ7›w¿Í»ý’4ÄÕ–¾%~¶Œ‹£ûÄ]ÑgŒ$I[­uÅ‚ð™ e·ÃS>c¿K®Uþh IšÁªÿfø¬IcÀÀhßxtô#IÒVë>rcøÌ€2¨îµk^?êÝysÅ7þõÝþµÑ$I³ÜØ+!Ñó'Œ£qöç¢ÏI’¶^–åÕ~#|n@¡,Üå…Ëþ‹¾’·o91﮽Ã3±’TÂÒüãgÒH±X00jßy}ô#IÒ„jœ÷7ás†Ö¼¹ymÉóÆòÏæ­k燮ÎóN3z¼K’¢kÕâgÔHñX08Fçø‘NIÒPÔ¹ûüø¹ C»ý’¤‰”=ÿXøÌJdÀ@éÜu^ôY#IÒÄþeÊž/Ÿ›0h¼Û/IšjÝ'ï Ÿc©€,(ÍK¾}ÖH’4¡êßýPøÜ€PówÈk‡¿Í»ý’¤©ûð ñ³m¤x,(µ£v>k$IšP­UKÃç&„¾ÛßnDcIRêo$IÚjÙ³?‹Ÿ›°t»5zôJ’ ^ç®sÃç]* Nçg×DŸ7’$M¨Úa¿>7`[ûÅŒ’$Ífí›OŸw©€,8­«ö>o$IšPÍ˾>7`[ð“Ú’¤Ù®uÝ’ðy— È€S?ù¿FŸ7’$M¨ÎÏ~>7`›<Õ*IÒ,׺r¯ø™7R< œê>¯Èó,‹>s$IÚzY7¯îûká³fSu¿WEO\IR j®øzøÌKdÀ@ê>yOô™#IÒ„j,ß#|nÀlªò†èq+I*Aóÿ6|楲` µo:6úÌ‘$iBµo?#|nÀlª-{gô¸•$• Æ™>óRY0çüeô™#IÒ„ÊÏåiþŽá³fKýÄÿ?zÜJ’JPý¤‡Ï¼T@ $?b*I¦êÇ |vÀliœñÉèQ+I*Aõ£ß>óRY0˜FçäYõÉèsG’¤ ÕºþÐøÙ ³¤yÁ£G­$©Õû½ð™— È€Õ¹û‚èsG’¤ •=÷ð†åuôì€Ùм|~ô¨•$• ê¿>óRY0°š+¾}îH’4áj‡¿-|vÀlh]Xô˜•$• ´`§ð™— È€U?ú=ÑçŽ$I®µraøì€ÙоýŒè1+I*xYc}ø¼KeÀàZ°Sž·Ñç$Iªûømñ³fAgõÊè1+I*xÙºÂç]*( Z÷ç×FŸ?’$M¸êÁ¯ Ÿ0Óºk’¤‚×]³*|Þ¥‚²` µ®>0úü‘$iÂ5/þjøì€™–¥µÑ#V’Tð:÷^>ïRAY0Ðê§üiôù#IÒ„ëóRAY0ðÆI’†¦V-O w ŸŸ0Æ~²M’¤Ùnì÷€FϼTP ?`ºÆ~·$I³]uŸW„ϼTP …±ß.IÒ0U?îýáó¦«ûð Ñ#U’TôºóRAY0êǼ/ú(’$iRµV>?`º²õFTIRÁËÒáó.˜ÃaÏåy§}I’4á²çÏÓ¼¹ñ3¦jÞÜ ÿ*S’¤Ù¬ûÄ]ñ3o¤¸,ÝŸ_}I’4©êÇüaøü€©ªðêèQ*I*A‡® Ÿy©À,­«ˆ>$IšT­ë–„ÏO˜ªúÑ勒¤Ô¾cyøÌKfÀШŸüÑèóH’¤I5ön²_fÀ°j,ß#z”J’JPëÚÅá3/˜C£º÷¯äyÖ>“$IšTµ£vŸ¡0ÍËçEQIR j®øzøÌKfÀPé>~[ô™$IÒ¤j]spøü€©hß||ô•$• ÆYŸ Ÿy©À,*­UK£Ï$I’&UöìÏó4:'|†ÀduV¯Œ£’¤T?öÃg^*0 †JãŒOEŸI’$MºÚoŸ¡0YÙ3EPIR ª-Þ-|楳`¨T÷ÿ÷Ñg’$I“®uÕ~á3&eÞöyÞmGPIR ª.ziüÜ). †N÷éû£Ï%I’&U¶nuøü€É¨üºèñ)I*AYc}øÌKgÀÐñ‹¨$IÃXmé[Ãg(LTýøDNIR ê>yOøÌKgÀÐiœó¿¢Ï&I’&]ëʽÃg(LTóÂ/ENIR ꬾ"|楂³`èÔ¾óúè³I’¤I—­{ O£sÂç(LDëº%Ñ£S’T‚Ú·|7|楂³`(eë‰>Ÿ$Ištµ#Þ>C`":÷_=6%I%¨uÕ~á3/œC©}ûÑç“$I“®uÍAá3&"{ögÑcS’T‚š}%|楂³`(5/ürôù$IÒ¤û ¶4º]ø€-ÚóÅyžu£Ç¦$©5NûxüÜ)6 †Rí°ß‹>Ÿ$IšRõcÞ>G`KjKß=.%I%©¶ì]ás/œÃit»<«=}FI’4éZ«–ÆÏQØ‚ÆŸŠ—’¤’T=èµás/œC«sÏ÷¢Ï(I’&]–žÈÓ¼íÃç(lNóòùÑãR’T†²,O v Ÿ{©à,ZÍ_>¦$IšRõþ$|ŽÀæ´o?#zTJ’Êò£`³`hÕŽüƒèsJ’¤)Õ¾é¸ð9 ›Ó}âîèQ)I*AÝGoŸy©,^ó¶Ï³Æúè³J’¤I—5žËÓ‚ãg)ü²=_”çÝNô¨”$• ögÇϽ‘â³ _À’$ [õS>>Gà—ÕŽx{ôˆ”$•¤Ö5…ϽT µæ¥ÿ}VI’4¥Ú·ž>Gà—5Îý«è)I*IÍ ¿>÷R X0ÔjËÞ}VI’4µš)O w Ÿ¥ð‹Z×.Žž’¤’T?é#ás/•€ÃÍï$ q3ÿ"~–À/è¬^=%I%©¶äMás/•€C¯sߊèóJ’¤)5öA,zŽÀ/ʪOEGIRIª.|IøÜK%`ÀÐk^ö­èóJ’¤©ÕíäÕý^>K`LõÀ×DOFIRIÊÒÚð¹—J€¡W;j÷è3K’¤)×üþ?„ÏRS?åcÑcQ’T’ºkV…ϽT ¿ù;løEŠ’$ cÝGo‰Ÿ¥0ö €¯Ü+z,J’JRû¶ÓÃç^* ¡sÿ¥Ñç–$IS®vèï„ÏRð}•$i[Õúá¾ás/•„…мì_¢Ï-I’¦\ëªýÃg)%7:'Ïjë¢G¢$©$5ÎÿBüì) ¡~ô{¢Ï-I’¦\¶þ‘<Í›>O(¯Úâݢǡ$©DÕOø`øìK%a@1ÌßÑï$ uõãÞ?O(­ÆòÏFBIR‰ª-þíðÙ—J€Âè<ðƒè³K’¤)×¾ù„ðY @yµ®[= %Ie)Ëò´`çðÙ—J€Âhþ`4úø’$iê5S^]ø’ðy @9u×\= %I%){îáð¹—JýÞèóK’¤iÕ8ëÓáó€’>©Ú®GAIRIêüìšøÙ7RÇ‚ò¼U>Ã$IšrûVÄÏSJ§vÔîÑ#P’T¢Ú?99|ö¥± P:÷_}†I’4õ²n^=èµáó€ri^úÏÑP’T¢ZWì>ûR‰XP(ÍK¿}†I’4­š—Ï Ÿ§”KçÞ‹£ÇŸ$©D5Îüá³/•ˆ…R;òÑg˜$IÓ*{æÁS(‰ysó¬þlôø“$•¨Úáÿ_üü) øáõ™èsL’¤iU?îýñ3€R¨ñûÑcO’T¦²,¯.|IøüK%b@átî¾ ú(“$iZµo=%|žPÍïÿCôØ“$•¨ì¹5á³/•Œ…Ó¼ø«Ñg™$IÓ«]Ï«{ÿJøL ø:w=õ$I%ªóÀÂg_* §vØïEŸe’$M»æÿ;|¦Pp£sò¬údôÈ“$•¨Öª¥ñóo¤\,(æ‡ØôDôy&IÒ´ê>rSüL Ðj‡ýnô¸“$•¬æE_ Ÿ©d,(¤öígFŸg’$M»ÚÒ·„ÏTŠ«yÉ×¢G$©dÕOø`øüK%c@!5ÎÿÛèóL’¤i׺öð™ @q½Ã,IÒ¶¬zÐkÃç_* ©¶ø·£Ï3I’¦]V{:O vŸ«ÐÂ]ò¼Ýˆu’¤2Õªåit»ø8R.VöÜšècM’¤i×8ëÓá3€â©Ÿô‘è'I*YÝÇn Ÿ©„,(¬ö-'FŸk’$M»ÎCW‡ÏTЧuý¡Ñ#N’T²Æ~ggôüK%d@a5Îþ\ô¹&IÒŒT;ôwÂç*ÅÒ}ê§ÑãM’T²Z+†Ï¿TBVõÀ×DŸk’$ÍH­UKÃç*ÅQ=ø7£G›$©„y޴€Bë>}_ôÙ&IÒ´ËÏåÕE/ Ÿ«Có‚/F6IR «ñöð˜JÈ€Bkß°,úl“$iFjœÿ…ð¹ @1tî½8z¬I’JXuÑËÂg`*! ­qúŸGŸm’$ÍHÝGo Ÿ« ¿±Ë—¼Ýˆk’¤’•­$|¦’² ÐªûüjžgÝè3N’¤©¶ìá³€áÖ8óD3IR ëÜwIø L%e@áu¹1úŒ“$iFjß|Bø\`¸µo?3zœI’JXëêÃg`*) ¯õÃ}£Ï8I’f¦VmÃO·EÏV†Ô‚ò¬±>zšI’JXcùñsp¤œ,(¼úqÿ)úŒ“$iÆj~ÿÃg+é~Ò‡£Ç˜$©¤Õ–¾5|¦’² øìœç­jô9'IÒŒ”=óPžæÍŸ¯ öMÇF1IRë¶7ÜÏEÏÁTR”Bç¾ÑG$I3VýÔÿ>[2óææYz"z„I’JXwíñsp¤¼,(…æ%ÿ}ÖI’4cu¼2|¶0\êÇþQôø’$•´öm§‡ÏÁTb”Bmé[¢Ï:I’f´±Ù=_í‰]’¤’Ö¼ì[ás0•˜å0:'Ïž,ú¼“$iÆjßt\ü|`8,Ø9ÏêÏD.IRI«Ÿô‘øY8R^ÿ—½;–ì. ½_‘ˆ„Qf™Q@QD¼¢ àp/ ¾¼ *\@}½êEÅ>=¤ÓÝ™É §½®€¦©Æ7ÿ8úÜ€kö{á3V’4~å»ýBJe=¦˜bC~;|N{] MSù‚ç§ÔmGŸ}0P½'tÑ3V’4~µ/\=¢˜fe™òÛ…ÏÃi¯k i«÷á#P)e™êûþJøŒ•$Qs¶H媥Ñ €)V>¶$~*Yhêj7}þÀÀu®ÿVøŒ•$Oc>=š˜rÝ›O Ÿ‡ªYhúªðîèó¯è¦úoŸ³’¤ñ¨{ÇÙÑ“ €)×:÷káóP5 Ma3›¥2[}ÀÀµ¸wüœ•$…—ïúšþb"5Žøƒð™¨š€¦³Îuߌ>`ðÚyÊ¿$|ÎJ’bk_´0z"0íz¼èEá3Q5 MgÍ“>} ÀP´ÎŸ>g%Iùð_Æ@ñèñ3Q©—€¦²|§—¥TÑg! \™?œ²ž>k%I15ýÓèQ©sãñá3Qµ~šÚŠ¥WGŸ…0­³¾>g%I1uïý~ô€Ô:ëËá3QµŸ>7°Ð´æ}1¨ªrõƒ)›¿mø¬•$¶úïŽAÐ×8ôýásQµ~šÚ‡¾/ú,€¡iùÏá³V’4Ú:7=~ ÿ¶Ûù‚íÂç¢jý,4ÝŽÕx<úH€¡(W/KÙümâç­$i$廿.¥¢=~ ËoŸ‹ª=™€¦ºÎÍ'GŸ‰04­ïþßðY+IMíí=v ¯sí7Âç¢jOf ©®ùÏEŸ‰04åªü€$MAù¦²µ:zì@Ÿ"ÕÆ* Muù®¯Ž>`¨Z§ÿCø¼•$ ·Ö¹ÿ=nàIõƒþGølTíÉ,4õõÞ— ªª\y_Êæm>o%ICjÞsú¿ñc¡èø-äÙã•€¦¾öe{D0T~ @’ª[ëôŒ3ð¤bÙuá³Qµ§e ©¯qäEŸ0Te¶<å ž>s%ICxõÿÊû£Ç <©sÕ!ñóQé©YHóž“R;>`¨Zç~-~æJ’ZëŒ/Fxšæ©>U{ZRïpÛw£ÏGª²ñxʽ(|æJ’”Wÿ0†êûþJüŒTzjRï•3§}!ú|€¡k_²søÌ•$ ¦Ö™ÿ=VàiÊæÊ”ÍÙ<|Fªö´,¤Ùµ”ïúêè3†¯Óèϼè¹+IÀ«ÿW-ž*ð4Ý;ÎŽŸ‘Jÿ= 鉊oˆ>'`è:W>s%I›Vë¬/Ex†Öy3á3Rµgd =QûâÅÑç$ _ÑIõ=ß>w%IW¾ÃóR¹úÁèiÏÐ8üƒásRµgd =Qãߎ>'`$:7>w%IWû¢Ç{%Ië_纣£Ç<«öö Ÿ“ª=kÒSjžðÉèóF¦yÊ_‡Ï^IÒúUßïWS*‹èÑϪyÜÇÃg¥jÏš€ô”ò…/ì¿gLƒÞ‡Hæ ¶ Ÿ¿’¤u×]rIôØ€5ê½M]ô¬TíÙŸCXHO¯»äÒè3F¦}ÑŽá³W’´öšÇþYô¸€5*WÜ>+U[cÒ«õ½>7`t:”ïö áóW’´†æn•ŠG~=-`zŸQ>/•Ö”€ôߪïóŽèsFªÍ ½¤ IDATsÃqáóW’ôìµ¾÷ÑcÖªuÚÂç¥jkÌ@z–ÊÇî‰>;`¤‡ |þJ’ž^¾ÛkSjeÑ#Öª¾ÏÛÃg¦jkÌ@z–Ú—ï}vÀHßž²y[‡Ï`IÒÕ½í»ÑãÖªl<–²™ÍÂg¦jk~>a =³ÆÑŽ>?`äZç~-|K’~Zó„¿Œ °NÝÛÏ Ÿ™ª­5 éÙš¿MJízô £Õ®§|÷×ÅÏaIšòò_ÊÕË¢§¬SëÜÿ Ÿ›ª­5 i uo=-ú €‘ë½ÝDô –¤i¯sÅÑãÖKãà÷†ÏMÕÖš€´†šßþÛè3B4ŽùXø–¤i­~ào¤TÑ£Ö©l­NÙÜ-Ãg§jkÍ@ZCùN/óÄ€©T>þ“”ïð¼ðY,IS×Ü­Rñà ÑcÖK÷ö3âg§Òº²ÖR÷ÞË¢ÏRÑþѾásX’¦­ö%;Gÿ°ÞZg}9|vª¶Î,¤µÔ:ç+Ñg)Ä(‹Ô8ôýá³X’¦¥Þ{(§¢}úÀz«ï÷Îðù©Ú:³ÖRýëoŠ>K L¹âno$I#¨wÖÞ}ìÀz+óGR6³Yø UmYHë¨xø¶è3´/Û#|KRÕë\sdôq¤sÓ‰áóSµõÊ@ZGÞ‡€4íotÈo‡ÏcIªjoý?Ñ'=l°Öi_Ÿ¡ª­WÒ:ªü[Ñg*„êý6\6›ð™,IU+_üÒTfË£yØ`õ=ß>GU[¯,¤u5³Y*W?}®@¨ö÷wŸÉ’T¥ff¥îígDï°ÁÊ•÷ÇÏQ¥õÍ@Z:W}¶@¬²Loü¯ð™,IU©õ½>Ù`£t®ýFøUm½³Ö£ÆÑ‰>[ \¹jiʽ(|.KÒ¤×8ìwS*:ÑÇ:l”æÉŸ Ÿ¥ª­wÒú4oëT6WEŸ¯®{Ë·ãç²$MpùN?ß_¨À¤Êw{møeó· ŸÏ’4)5¾õ'ýT€IÖ<îãá3Uµ Ê@Ú€º÷\}ÎÀØè\yPøl–¤I¨÷[Seseô± ›¦èö_ =WUÛ ,¤ ¨uæ¿Dµ0Vš'}:|>KÒ8×»(é½_2Lºâ'? Ÿ«ªmpÒ”ïúj¿¶ OÕ®§ú~ï ŸÑ’4–ÍÝ*uï¾ ú¤€h7?[•64 i+î¿"ú¼€±Ò{ek¾`»ð-IcÕ̬Թö¨è#¦¾ÿ»âç«Ò†f m`­s¾}ÞÀØéÜp\ÿ²+zNKÒ¸Ô¾`^ôÑ S®~0e3›…ÏWÕ68 iËw}ô™ c©õ½ÿŸÓ’45ÿ o @¥t®92|¾ª¶QYHQ±ìºèsÆOY¤Æ7?>§%)²Æ!¿“R§}"À@5ÿóð«ÚFe mD½=ž©l®Jõ½ß>«%)¢ú^oMeýÑ裫è¤|áöásVµÊ@Úˆê{¾%ú耱U>vOÊ¿$|^KÒ(Ëw}M*[}ÀÀu—\>gUÛè,¤¬xè–èóÆV÷®óS6wËðy-I£(ßù©xôÎ裆¢uî×Âg­j€´‘µ/Ü!úü€±Ö¹þ˜”ÍÌ ŸÙ’4ÌòE/NÅò›£\šú~ï Ÿ·ªmtÒFVß÷W¢Ï_{½…yôÌ–¤a•ïøs©XzUôQ CS®zÀ‹zfOvÒ&T<|{ô9 c¯uÚ߇ÏlIxó·MÝ%—D±0T«‹Ÿ¹J›’€´ µ/Ù)ú€ñWtSã[>·%i`ÍÝêɦ ÊšÇþYüÜUÚ”,¤M¨~À»£Ïa˜ekunFÏnIÈ+ÿ]þ0 ºíþÛÝ…Ï^¥MÉ@Ú”ff¥ò±%ÑÇ1L„2$Õ÷~[üü–¤,ßáy©{×yÑÇ)ŒD÷ž‹Âg¯j›œ€´‰µ/Û#ú<€‰Q®ZšòÝ_>¿%iC˽(÷_}ŒÀÈ´Îþ·ðù«Ú&g mbƒß}ÀD)¿7廾&|†KÒú–ïô²T,»>úø€‘ªïùæð¬Ú&g mj3›¥råýÑg2L”bùÍ)_ôâø9.Ië(ßíRñèÑÇ&ŒTñàá3Xµd o®xàÚþ[jDÏqIZSõ=ß’ÊÇ}\Àȵ/˜>‡UHÒªøžès&R±ôê”/|aø,—¤ÿ^}ÿw¥2[}L@ˆú~¿>‹UHÒ€*½3úl€‰ä7$[c>–R;> DùØ=)›™>UHÒ€j_¼8ú|€‰e i\jñÅ”Ê"úX€0íïï>UXÒ€ªï÷Îèó&ÿí€|0°¤¨æn™:W}@¸Æ!¿?—••€4ÀŠå7GŸÑ0ÑŠ‡nMù.¯ Ÿé’¦«|ÁóS÷ö3£@×ûü›lÎæá³Yµe °öó¢Ïi¨Ä{ŽÖ÷xCø\—4廿Πyà +ŸÍª 4 i€Õ÷úÅès*¡\yªïõÖðÙ.©Ú5}_*³‡¢<£>>ŸUhÒ€+–]}V@e~ý¸~À¯‡ÏvIlfVj󕔊NôQc£l®LÙ¼­ãç´Ò ³\ë{ÿ}^@u´²Ô8ú#áó]RuÊl—:7}ºÀØé\LøœVmàYHCxÑT–Ñg6TGÑMÍS?>ã%M~õý~5Þ}ªÀXj÷ñðY­ÚÀ³†PqßåÑg6TNû’úoÛ=ç%MfÍ“>R»}”Àxê4S¾àùáóZµg ¡ÖY_Š>¶ ’:×™²¹[†ÏzIÔümRçêâ/kÝÛNŸÙJÃÈ@Bù.¯J©,¢Ïn¨¤îíg¦|‡ç…Ï{Iã_}ÿ_KÅC·D[0öš'ÿUøÜVm(YHCª{ÏÅÑg7TV±ìú”ïòÊðy/iL›³EjóÕ”º­èã &ãívü¹øù­4Œ,¤!Õ:íï£o¨´rÅÝ©¾ç[Âg¾¤ñ*ßýõ©»äÒè# &F÷æSÂç·jCË@Rùâ—¤ÔmGŸáPieþHjö{ás_Ò43+µÎø'ô ¨yÜ'âç¸Ò°²†XïT€!+:ý·úˆžû’âÊw}MêÞu~ôi“§•¥l‡ç†ÏrÕ†–€4ÄzT`4:Wœ²¹[…ÏI#lfVjžòשl®Œ>‚`"u®ÿVüË`jtï½,廼*þ9€¤¡Wßë­©{÷ÑÇL´ÆÑ Ÿéª 5 iÈu®>,ú,€©Ræ§Æ‘þ@Òš¿Mj?7¥N3ú¸€‰VÖWø ÚÙÕÏ@rÃ~7ú<€éS–©}ÉN)›Ù,ü¹€¤ÁÕ{•bùØ=Ñ' Tç-4Ç`¾«6Ô,¤a7³Y*[}¦ÀTêÞynÊw~EüóI›T¾ÛkS÷ÖS£¨”ÆáŸñª = iµ/^}¦ÀÔ*¥æñþ|@ÒF4wËÔ:ã‹©l­Ž>J RÊÕËR6góøY¯4ì,¤Tßë£Ïu˜z+HÙümßHZff¥æ±–Їo>: ’Ú?Ø+~Þ+" iDK¯Š>Û`ê•+îJCßþ¼@Òš«ô›©»ä’èã*­7o£g¾j#É@Q­3þ)úlzÊ2u®<(e;<7üù¤ÿª¾×[SçÆ¢O¨¼ÞgUö~Û.zö«6’,¤•ïô²”ŠNô<¡xèÖT?è„?G¦½Þuw®:$¥¢},ÀTh_¼8|þ«6²,¤Ö½ýŒè3xª²HíË÷OùŽ/ž M[ù‚íRû¢…)µó蓦J}ß_  ÚȲFXó„¿Œ>ã€gQ®^–š'}:ü¹‚4-ÿ­s¾šÊú£Ñ}˜:Ń7„?Pm¤YH£lþ¶©l®Œ>ë€5è=9®ïùæøç REß³}é.©l®Š~¨ÀÔê}FeôsÕFš€4â:×}ÖkÓm§ööì¿J9úyƒT…ò]_ÓLy«Öm¥|ñKŸ¨6Ò,¤×8ì÷¢{`=”«HÍ“?›²™ÍŸ?H“X}7¦ÎU‡ö/€x›O~ ÚȳFÝ̬T®¸;úÌÖS±ôêÔ8â÷ãŸCHR}ÿw¥ÎõǤTt£¾ÀS4¾ùÇáÏTyR@­óçDŸùÀêÞynªï÷«áÏ#¤±lîV©yÜÇû`ü”«LÙÜ-ãŸ3(: )è}PSYDŸýÀ†*‹Ô¹îh,=Q¾óËSû‚y©\½,úÑ ¬EûÒ]ß7¨’€T÷Žs¢Ï~`S7žê_Søs )ìm~®<(¥N#úѬ‡ú>ïþ ZHRPÍã>}ö›ªÛîÈi}7„?·†ÞümRóä¿JÅÒ«¢yÀ(î»<þy„RTRTs·Jeþpô ¡,R÷ÖÓRýÀ߈Ž! áÕþíì™Êü‘èG°š§~>üù„jaYHµ°Wô ¬{ÇÙ©qøŸgH›R¾ûëSëü¹©\qWôC ØFÊw|Aøs Õ²ë½ÿPMŲëRó;ŸKÙümßsHëS¾`»Ô<éÓ©{ç¹)•eôC€ÎõÇ„?ÇP-4 )¸béÕѳ¢2{(µ/\ò_þ¼CzFs·LoüÏÔ¹þ[)µëÑ`ÀGþaüó ¥È,¤àZ§ÿCô,F¡èö_YÝ<îã)›³EøsMqóž“G$u®<(•ÙòèG0$åÊûS6góøçJ‘YHÁå ·ï¿0=ÊÇîI­óf§|çW„?Ñt”/x~jÿ©sã ©l­Ž~#оhÇðç ª…g A½÷c¦PY¤î’KûŸïð¼ðç$ªÞ Mzïéß»ôO­,ú»¥²Lõ=Þþ|Dµð,¤1¨qÄïG XÙ\•:ב‡Яjk£«ïóŽÔ:û_S÷®óR*:ÑßÖ@îíg†?/Qm,²Æ¡™Y©\qWôlÆD™?’:×~£ÿ>í½i ®¢±-_ôâþçJôßÏÿñŸDëc¢ñ͆?OQm,²Æ¤Öùs£g0†zÒÚ¹âÀÔøÆÿêxkôs7w«Ô8ì÷RûâÅ©Xzuÿm¤žª÷¢¿Qªì‰,¤1)ßíµ~€Ö®•¥îͧ¤æ)“òÅ/ þ¢4g‹Tßÿ]©uÆ?¥îm§{/`ZçÍÄ?‡Q—,¤1ª÷þlë¥,Rqÿ•©}ñ¢þ+³y[‡?—Ѧ×û0èÆÚÌKÝ;ÏMekuôw0Iºí”ïüòðç4ªMÒÕøÖŸD `Rµóþ‹ Zg}9Õüþ+Ç£ŸÛhÝå;¿"5ûDjÿ`¯Ÿ¾¥OÑþN&XçÆŸߨ6VYHãÔœÍ}x0½WŽwï8§ÿ+àCß—²ùÛÆ?×™òòÏïÿ[ôÞΧsÝÑ©\qwô· P1Ã?þœGµ±Ê@³Zçωž@T,».u®:$5¿óR}¿wú-!–ïôó©qÄï§Ö9_IŽMÅ÷û¼'`¨Š‡oKÙ̬ðçAªUÒþxït€¡ë4R±ôªÔ¹ú°þ«Ò{Ÿ%/|aøó¡I*_ô¢Ô8ôý©uÚRûòýS÷ž‹R™?ý/ L¡Ö™ÿþÜHµ±Ë@Ã:7Ÿ=3€)V®z uï¾0u®80µÎúRjõ¡Tßã)›»eøó¤ˆòE/î®Bó„O¦ÖùsSçúo¥â¾ËSY_ýOðSízÊnþ¼Iµ±Ë@ÃGüAôØx¦¢›ÊÇ–¤î=§ÎµßHí æ¥æÉ•GþQªïóö”/~iøó¨ jf³þ[õÔ÷yGjù‡©yÒgúŸ™Ð{›¤îg§â¡[ú® 0î:×ÿÜJi³Æ±™Y©xôŽèÙ°áºíT®¼¯ÿ ùîíg¦ÎußLíí“ÚÌï¿ÍPï’½yìŸöß¿qð{S}ÿw¥úoHù.¯ê¿jíg­íó ò_ð_ÿíÎ/Oùî¯Oõ}¹ÿÿÕ8üƒý…Dó¸O¤æ©—Zç|5µ/Ù)u®<(un¤ž¦ÛNù.¯ ¿»Rm¬³Æ¼Öéÿ=N3k ¿·Rmì³Æ¼|ÁóSÙ\=S#õÞ~o¥ÚØg M@«‰ž)Œ‰î=…ßW©6YHP}Ÿ·§T–ѳ€1ÐøÖŸ„ßW©6YHRo³ Àt+Wܲ9›‡ßU©6YHRó˜ÿ7z¾¬uú?†ßS©61YH“ÒœÍû^¦SÙx,å;Jµ‰Ì@šÀßüãè¹Àˆôî‚¢ï£T›È,¤IlfV*¾=zö0dÅò›S6³Yü}”Ò$f Mh­3ÿ9zþ0dÍ>~¥ÚÄf Mhù‚ç§²¹2z0$劻R6g‹ð{(Õ&6 i‚kÿpïè9À4¿ó¹ðû'Õ&: i‚«ïñÆ”Ê"z0`åêe)›÷œðû'Õ&: iÂëÞ~Fô<`ÀZg}9üÞIµ‰Ï@šð‡0z0@eýÑþç?Fß;©6ñYH¨XzUô\`@ZçÏ ¿oR­YH¨yü_DÏ%¡•¥|Ñ‹Ãï›T«DRš³y*½3z<°‰Úßß-þ®I©*YH©õÝÿ=ŸØfÊwyeø=“j•É@ªJó·Meþpô˜`#u®80þŽI©JYHª}áÑs €QtSýëo ¿_R­RYH*_üÒ”ÚõèqÀê\{TøÝ’j•Ë@ªX+ˆžWlè«ÿ÷|sø½’j•Ë@ªXùî¯ï &CçªCÃï”T«dRëÜtRôÜ`}tÛ)ßýuá÷IªU2 ©‚Õxwôè`=´/ß?ü.IµÊf U´î=GÏ/Ö¦ÓHù.¯ ¿GR­²YH­qôG¢GkÑþÁžáwHªU: ©ªÍÌJÅò›¢çkzõÿίˆ¿CRªrR…kžüWÑ£ €gѾt×ð»#Õ*Ÿ€Tåæn™ÊwGÏ3žª•¥|ñKãªž€Tñš§~>z¤ð틆ߩ6YHUoîV©|üÞè¹@J©l<žò…/Œ¿3Rš†,¤)¨uÆ£g½wÿ9nø]‘jS“€4 Í{N*W-žoS­l<–ò_W¤4-YHSRëìžqS­uÎWÃïˆT›ª,¤ii‡ç¦2{(zÎL¥råý)›¿mü‘Ò4e MQ­s¿=ë¦Róä젧 ©6uYHST¾`»TÖWDÏ;€©R,»>e3›…ß ©6uYHSVû‚yÑ3`ª4Žü£ð;!Õ¦2 iÊÊwü¹þ'Î0|Ý»/¿Rmj³¦°öÅ‹¢g@õ•Eªïÿ®ð» Õ¦6 i ˽(•­ÕÑ# Ò:×~¤éÎ@šÒÚßß=zTW·•òÝ_~¤éÎ@šÒò~>¥v=zTRûÒ]Â冷€4½µ/ûzô,¨œ²¾"å _~÷#u-¤é-_ü’T6WEÏD€Jiõåð{)³Ô¾xQôL¨Œò±{R6oëð;)³”ïø‚þ¯¥°éš'~*ü¾GÊžÈ@Rj7;z6L¼béU)›Ù,ü®GÊžÈ@RÊwx^*³åÑ3`r•eªøžð{){J’úµÎúRô˜˜XkŽ¿ß‘²ÿ–€¤Ÿ6ï9©\y_ô¬˜8esUÊw~yüýŽ4ûéYHz²æ©Ÿž—§uö¿†ßëHÙ³d 鿚»e*½3zfLŒâÑ;R6oëø{iö3³ô´š'}&znLŒÆQ ¿Ï‘²5d ééÍÙ<Ý=;Æ^÷¶Óãïr¤ÙkÎ@Ò3j÷ñèù 0Þº­TßóÍá÷8R¶–,$=³™Y©xàšè1 0¶Ú—ì‡#Í^{’žµÆÑŽž£c©\ý`Êl~#eëÈ@Òë.¹4zžŒæIŸ ¿·‘²õÈ@Ò«ø)•eôLÅO~Ðûäè{)[,$­µÎÇGÏU€ñP©~À¯‡ß×HÙzf i­å»¿.¥N3z¼„kÿhŸð»)Û€,$­³öe{DÏW€Påêe)ßñá÷4R¶YHZgùÂíS™?=gÂ4ûxø”m`’Ö«ÖY_Žž³!ºwœ~7#e‘€¤õkîV©xôÎèy 0ZízÊw}üÝŒ4{ó´Þ5ÿ‹è‘ 0R­s¾~'#e™€¤õofVêÞ{Yô܉bùM)›»eüŒ4{ã²´A5ùèÙ 0|e™¿7ü.FÊ6¡ÞçWôXHZﺷ|;z UçʃÂï`¤lëÞ}aÿû¹–ÍlþÅHšŒê{¾%¥n;z E™-Où†ßÁHÙ&ö³·ó®­ž»uø#irjÿhßèY 0Í?~÷"e¨Xzuÿ{º–íðüð/FÒä”/~I*GÏc€êÞsQÊff…ß½HÙ*¼±ÿ}]˽8ü‹‘4YµÎùjôLœN#Õ¿þ¦ð;)PÅ#?îkײ_þÅHš°æn•Їo‹ÍÑ:ç+ñ÷-ÒìÁUÖío×ò=ÞþÅHš¼G}(z6l²â¾ËS6góð»)Ts6O©,úßßµüÀ÷ÄA’&²îm§GÏh€×i¦úÞo ¿c‘²†çÏÔêG}8ü ’4™Õ÷xCÿ=ò&Që{ÿ~¿"e®¾×[Ÿü¯5NúLø$irk_´0tPlŒâþ+R6g‹ð»)pƒßûä÷y­yæ—¿ IÜümSùØ’Ð °Áoý³ÏÛãïU¤Ùƒ¯yÂ_>ù­^k]¼8ü ’4Ù5ÿóЙ °!Zçþgø}Š” ©Ö÷þãÉïõZûúcÿ I“_÷î C7Àú(¸&es· ¿K‘²!Õ¹òà'¿ßkÝ{þIšüê{¿-¥¢:ÀÖªÛJõ}Þ~"eC¬{ç¹O~Ë׊U†A’ªQû‡{‡Îp€µi7~"eC®xôÎ'¿çk½ÿY=Ûð/JÒä—/Ü>•ÙC‘sàY\ë­”*ßümR*ºO_ä{¿-þ “T‰šßþÛÈYðìoý³ï/‡ß›HÙ«ðëOûÖï/Çýyø&©"Íl–Šû¯ŒçÏÐ:Nü‰4{ø5Où›g.Zîþ…IªØ¦±,¢f:À“z/TôÖ?ʦ¤öö|æ sëéá_˜¤jչ꨹ÐW¶V§ú×ß~O"e#ª{×ùÏ\Ýþ…IªVù¦rõƒQó ÿY…Ñw$R6ªælžÊæªg.z²·ÿ%Uªæ 1ÛR÷–o‡ßHÙ«ï÷«Ïx<¹¨õáð/PRõêÞöÝQÏwü¬øEÁIDAT`Ê•Ùò”ïô²ð{)a­3¾¸æ@ë¢Eá_ ¤ê•ïöÚ”ZÙ¨ç<0­Ê25ŽöbgM__ó sÏ%á_ ¤jÖ:ç+£õÀ”jÿpïð») ¨\µtÍ €Ôn¦Õs· ÿ"%U°9[¤âkF<î€iSàà÷†¡’ªYýÀ÷¤T£š÷À´é¶ú‚}"eµÎþ·u/Z.ÿB%U·ööÕȦLï-ˆ£ï>¤,¨îÝ®{нÿêð/TRuËl—Ê•÷jîS¢»ä’”ÍÙ<üîCÊÊ<¿ÿ0ë\ô>!;Ûéçÿ`IÕ­qÌÇF4ú€iP6Kù®¯ ¿ó² šÇþéO_¤”'6ü –Tíº·|gس˜Íãÿ<ü®CÊëÜxüú/:7þKªvù®¯NesÕ°ç?Pq+ ¿ç²Àòž—R;_ÿ@j7R¶`»ð/\RµkñOC~ TYñà )›¿Mø‡”Ö<á“k}œ¬ç@…õÞY ¾ç›ãï7¤ÙãýVÛϺèÜzzø.©úÕ÷þ¥”:a=*ª÷ªçè{ ) ._ôâ”:Í _¤N+e;nþTýZç|eHO€*ê\ypø}†”A­³¾´ÎÇKm[´Óþ!ü i šÙ,u—\:èç@Þ˜²ùÛÆßgH³ã+–ß¼ñ €î²Âÿ’¦£úžoI©]ôs JZYªïõ‹á÷R65}ßz=lÖ¸èÉüÍð?ˆ¤é¨uÖ—õt¨ æ‰Ÿ ¿¿²1©sÝÑ›¾h_uXøDÒ½Ð=ê9P!«‰¿»fGù.¯L©ÛÚô@jå> XÒȪýM)µó=5ª xð†”Íß&üÞBÊÆ¤ö¥»¬÷ã§¶Î_­ùÞ×Âÿ@’¦§Ö™ÿ¼©Ï €ªð¾ÿRzjù‚íRÙx|p €bÕ²´zîÖá0IS’·žÐ<éÓñwÒìñ©uö¿nÐch €žÆ)ÿ_øLÒôTßã ý ?0½Ú?Ú7üŽBÊÆ©ùÛ¤rÕÒÁ/ºËoM«gÏŠÿJššZ§ÿãÆ>?&\÷Þï§lî–á÷R6FµÎúò?–ÖkÐÓ8îá@ISÔ̬Խ㜠>Ô€ÉV®^–ò]^7!ÍŸòž—Êlùð݇œVÏlþ•4=å»ýB*›«6ø`&T·‡üNø„”Y­ófoÔCj½=“ÿ*ü*iºjžúù:Ü€ÉÓ:í áwR6få‹^”ÊÆcÃ_+–¤Õs¼÷–¤¿Э§nÔLŽÎµGÅßCH³Ç¯öåûoôãjƒ=Íï~1ü,iºÊ¿¤ÿþ@5÷_™²yÏ ¿ƒ²1«¾ï/§TtG·(ë+R¶èÅápIÓUãÈ?L©,7ú°ÆS™?’òÝ_~÷ ecX÷î 7éñµÁ €žöå„ÿÁ%M_íïï¾I0fŠNjþð;)ÚÇ}|“bµHE‘òý~-ü/@Ò”5oëT~ï`NB`4º­Ô8ôýá÷ R6¦u®Æd,z;€ÕËS¶ó+Ãÿâ$M_kŽô‘l¬v=Õxwø}”iõ½ÞšÊæÊ¡> ¾èéþäò´zîVá’¦¬ùÛ¦âÁ†q¬¢,Rã˜ÅßH³Ç³|á SñȇþPÊ §}Í7Âÿ%M_õ¯¿iè›S`íZßû÷ð;)׿n•ºw?’ÇâÐ=ÍÓÿ1þ/SÒÔÕ<îÃ<Ú€µè\ë…ÁR¶¦f6KŽÙãq¨ €þ‡ó£ñ©’¦®ööêñÞÂ[ÊžÚ̬ÔúÞ¤TtÓ8»@Oç®óS¶è%ñÿˆ’*_óäÏFy0¶ÊæªT?àÝá?¿KãT¾`»Ô¹é¤4 ÆrÐS¬X’òý=üSRõkÿpïè#ÆO»ž‡ýnøÏíÒ8U?ø·R¹âî4)ÆvÐ×n¦Æw>þ*©âÍÙ"uï:/úÄ€ñÑm§ÆÑŽÿ™]—æn™Úî0öoù3Y €'´o<1e>a\Ò˽(Þ}Ü@¼¢›šÇÿEøÏêÒ¸TßóÍ©¸ïò4‰&bÐS¬z0ÕúPø?¶¤êVßë­©l<}Ü@œ²LMïÈ!¥~s¶H­3¾˜R+K“jb}e™Z—í•VÏÛ&þ_R%k|ó£)•Eôi!Zg}9ügsiªøžT,»>MºÉZ<¡xôîT?ò¿ $U³Ö¹ÿ}ÌÀÈõÞß<úgr)º|á SûGûT梹ø™Î ǧlÑK¿)$U¬™Y©sý1ÑGŒLûGûÆÿ<.E6g‹þÛ_•ÙC©J&zÐS䦿iŸVÏlÿM"©:Íß6K¯Ž>â`è:×Ñ1\øÏâRP£?œŠ‡nMU4ñ €Ÿé.¿%ÕüŸáß,’ªS¾ë«S¹zYôñCӹ餔ÍñÂZMgÃ~/u—\šª¬2 €Ÿéüø¬”ïýöðoIÕ¨~À¯Oô'½ÀštoûnÊænþ³·4ꇾ?uï¹(MƒÊ-úŠ¢ÿùù^¿þÍ$iòký‘”ŠnôÉÓ½ýŒ”ÍÛ:ügnidÍl–ßühêÞsqš&Õ\üLQ¤öõǦ|ϷƃIšèš§~>úD€èÞ~¦ËMOó·íßëßž¦QµOý€[NMõCßÿ 'ibk_¼8ú4€MÒýñY)›÷œðŸ±¥aWßûm©}Ù©ÌIÓl:OѽÿêÔ8á“iõœ-ÿ %MX3³Rçúc¢1Ø(Ý;Îqù¯J—/x~j~ûoSñ“F?ÜÆÆÔ-~¦¬¯H+Jù>¿þ)i‚š»UêÞu^ô¤{ç÷R6›øŸ«¥A7›þç7v®ýF*[«£jcgjOÕYrYjœò7)Ûññß°’ƾ|áö©X~sôÑë¥{ç¹.ÿU©òÅ/MÍÿwêÜtRJízôCl¬YrgêÜtrj]0?5Nødªô[ýßX=>IíuáŽÑ§<TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTÿ{v@€0¨jíñA @€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ A‚ $ H@€ AÖsdnõ‹×?`íIEND®B`‚‰PNG  IHDR T„ÈQ pHYsèèµ{Rk IDATxœìÝy´ee}ïk PD "ö&Æ1×£‰FMnbnOÌIkúäÞc“sM<É7Í®Ž*ŠDš¢! ½H'J#ˆŠ H¯€H_PPtÕ­¹ú5wÔ&±…¢ªöÚû7ßµžgŒÏgäŒs²çœ//_ö~Z0>£a þzôo:#º—ÌDç”ß‹êˆ7EkïDëߟ&©AuOûƒˆa/û­P”º·9:Ǽ=ýnG’¦²½_0ûï:§¼;º—,™ý÷QÃGn›ý÷SŒ×ÓÆü?`ºÆSÜý+ˆÎ'þ2ª#:ZËŸ˜–ô”uÏ~¯ÀØAuwc´W¿9ýŽG’ôŸ-öì¿§Úòï«úW9ûï¯ÜÌAÀ¶êU1¸ãÒè]º<Ú'¼3Z{=7ÿ€,i»ë]øÁˆºÎ~£­î¬ö?•~×#Iz’Vì1ûï³z—­ˆÁŸý÷\l;ƒ*€­=z{ô¯Z=û§ûZËüö)©èfEÿsûd¿V&†Q•$Բݢ}Ü/EïòU1Z÷µìO@ãT|»a?߸0ºçþmTþpþáVÒxZ¼s ®>*û 0qêÖºhúÚüûIÒvUôêèžÿ¾Ü~qÄhý9hƒ*€Ñ0w}nöÐØZõâô¬¤1·ä1¸ñÔì7 Àdª>ôcù÷@’¤kåžÑ9ãOcpó9³¿|ƒ*`Š ×\Ýóþ.Zû¼$ÿ *i~Zö¬Þö©ì× ÀÄ«7®ñ[ÿ%iÚ÷eÑýäßÇðþk²?-© ª€©2êlˆþU«£:ü ùRIóZµbÞýùì×ÀÔ¨7ÜÕ¯L¿’$§êðŸŠÞǨz4û°à ª€©0¼çŠèœùÏþ¶šìç¤ù¯Úû1Z{mö«`ꌽ=ªý¾?ý~H’4Æ–=;:gýÅì_˜UÀä gÿÖsµú-ùMI VµÏ‹côàÙo €©5z䶨ö}Yú=‘$i~~kUÿºã#†ƒìÏ À¼2¨&Ψ»éñ?ëwð¤*%-lÕ¾/Ѻ¯e¿†¦Þèá[£Úç%é÷E’¤yê€WÎþ9Àèµ²?9ó  ˜[þ~s÷¢ÖŠ=ò‘’¼êÀWFýØÙ¯"þÓèë£Úûùé÷F’¤ylïDïÒå1êlÌþ쌕A0¿‘ªwùªhíõÜüC£¤”Ú‡¼&êk²_G|—ÑÚë¢Z¹gúý‘$iž[¹gt/YlXL ƒ* \Ýͳ¿J´µêEù‡DIiµ?ôcQoº?ûÀ“­ùrT{íž~$IZ ßXuùªˆ~;ûó0'U@yFƒè_u”!•¤hþ†¨«‡³ßJ<…á]—GkÙné÷I’¤j¿—GÿúEÔuö'`‡TEÜyYT‡½>ÿ()½ö‘oŠºz$ûµÀ6Þz^´ï’~¯$IZ¸ª#ÞÃ{®Èþl7ƒ* £ ÷FçŒ?ÖÌ¢ôƒŸ¤ü:Ǽ=ꮿÃPšÁõ'Ekf§ôû%IÒ6³hößó6­Íþ l3ƒ* Ù½è]º,ZKŸ™ؓԈ:ǽ#¢_e¿ØAý+J¿c’$-|Õ^»GïK‡FŒ†ÙŸ"€§dP4Öðþk¢:ü é‡;IÍ©sìÏGÝÛœýz`Žzÿkú]“$)§ê¨Ÿáƒ_Íþl•AÐ<½Vt?ýÏÑZ¼súNRsêûξ˜ ½O¾?ýÎI’”Ô’§ÏþûÀ-­ ‰ ª€FÜ~q´öEþ!NR£ê|ô—#úíìWã4F÷”ßK¿{’$åU}øu1¼ÿÚì/À÷0¨šaЋî%K¢5³SúÁMR³êÿ+ÆT“j؋Π¿–~%IJþmU—,žÚ4…An¸îæ¨CþaMRãêÿ«ÆT“®_Eûè·¦ßEI’rkä1Úx_öW `–AªÝñÑZþìôš¤†Ž©ì×  ®‰ö¡¯M¿“’$%·òù1¸ùììÏ€AcÔÙ“7ÿP&©‘uþã¿E ºÙ¯*P½áÞ¨öÿÁô»)IRr3‹¢û©Œ²?MÀ3¨Üð¡[£:ôÇóc’Yç„_󛩦ÔèÑoDµÏ‹Óï¨$Iùµù¹m~ ûÓL)ƒ*`A ¾úñh-ÿ¾ô˜¤fÖ9ñ]~3À”ÝwuT{¹G–$=-Zûÿ` ï»:ûÓL!ƒ*`aŒ†Ñ½ðÿ›ýé/I¬sü¯S0kxÇ%ÑZºkú•$©-}fô¯ùhö§ ˜2UÀüë·£sÊ»ó[’[瘷GôZÙo+dxóÙÑZ¼KúÝ•$©uÏßì/qXUÀ¼µŠöQoM?`Ijní£ßuosöë €\w‚¿| IúfS~oö—9Ì7ƒ*`Þ ×}-ZüPúÁJRskõ³Qw7e¿®h°þe{¥ßcI’šSûØ_ˆQû±ìÏ0á ª€y1¸ãÒh­Ø#ý@%©¹µ|SÔ Ù¯+ Ð=û¯Òï³$IÍ©úÐkc´þîìÏ0Á ª€±Üz~´–í–~’ÔÜÚ‡ýDÔÕ#Ù¯+J1Fçc¿•~¯%IjPû½<†=û L(ƒ*`¬7Ÿ­¥»æ $5¶ö!?õæ³_W”¦ßŽöQ?›~¿%IjP«^ÃnÌþBÈ  ›þõ'Ekñ.ù'I­}ðD½imöë €BÕÕÃÑ>ä5é÷\’¤æT­zQ ×^—ý‰&ŒA0ý«VGkf§ô“¤æÖ>èÕQo¼/ûu@áFÞ>û/ϳï»$IÍ©Z±G ×|)ûLƒ*`LcªEé%IÍ­Úÿ£ÞpOöë € 1º÷KÑZö¬ô{/IRsªV>ÏoªÆÆ  ˜“þuÿá7SIÚjÕªÆè¡[²_WL˜á­çEkñ.é÷_’¤fý;‰áº›³?QÀ0¨vXÿ¦3üꤧü¯AFÜýº`Bõ¿üáô;0IRóþjÆhýÝÙŸ( pUÀÜöéh-Ý5ý@$©Á-{V ïþ|öë € ×ûäßçß…I’Uuà«b´imö' (˜A°Ýw]­e»¥„$5¸¥ÏŒáŸÉ~]0 FÃèœôßóïÄ$Iª:ìõ1êlÌþJ…2¨¶Ëð‘oDk豈$5¸%Oá-çf¿®˜&ýv´WÿLþݘ$©QµÿÕˆa?û+È  Øf£ÖÃQôêôƒ¤7³S n89ûuÀª7­jÿÌ¿#“$5ªÎ'þ2ûÈ  Ø6ývTGýlúGRƒ›Yƒ«Vg¿­˜b£u_jÅsóïÊ$Iª÷Åe¢€ÂTÛö÷çOþÝôƒŽ¤f×ÿÂÙo+ˆámŸŠÖâ]ÒïË$I jñÎ1¸å¼ìOPƒ*à)õ>³$ÿ#©Ñõ.™É~UÀ7 ®:2ýÎL’Ô¬ª½váC·f¢€BT[µe©ÝšÙ)ý€#©¹õÎûÛìW|ÞH¿;“$5«ö‡_Ñke¢€TOj´þ®h­Ü3ý`#©¹u>ö[³§EçÄw¥ß¡I’šUç´?ÊþB0¨žX¯Šêð7¤h$5·Îqïˆt³ßVð¤êî¦húãéwi’¤fÕ¿òˆìOÐpUÀêœþÇéIÍ­}ä›f/£ éFÜÕÊç¥ß©I’ÔÒ]c¸æªìOÐ`UÀ÷è_s\þ!FRckôê¨7?˜ýª€m6¼ýâh-Þ%ýnM’Ԝڽ*FþãqàITßaôèíÑZþ}éIͬÚ÷eQ¯¿+ûUÛ­ÿť߯I’šU÷œ¿Éþ< eP|˰Õê·¤\$5³jÅscôÀõÙo*ØaÝsþ:ýžM’Ô fÅà–s³?O@TßÔ½d&ÿÐ"©™-Û-†w>û5s3ìGç#¿˜ß&IjLÕªÅhÓÙ_( a ª€Yƒ»¿­Å;§X$5°Å»ÄðÖó³_S0u롨ø¡ü{7IRcêœü;ÙŸ' a ª€ˆ~'ªC~4ý "©¡¿êöº²ßR0V£oŒjùsòïß$IiðÕgž€1¨¢{ñ¿¥P$5³þ嫲_Q0/†7Ÿ­™Òïà$IͨÚ÷¥1j¯Ïþ< aPSnøÀ ÑZòŒôФæÕ=û½Ù¯(˜WýÏ®H¿‡“$5§îùïÏþ4 aPÓl4Œjõ[Ò&’šWçÄwEŒÙo)˜_uÝÓÿ8ý>N’ÔfvŠá=_Ìþ: `PS¬÷…ƒò%’Wû¨·Dô«ìW,Œ~;ÚG¾)ý^N’ÔŒÚGüTÄÐtÓΠ ¦ÔhóƒÑÚk÷ô‰¤fÕ>èUQ·Öe¿¢`AÕ›ÖFµß¤ßÏI’šQÿª£²?M@2ƒ*˜Rÿôƒˆ¤fUíý‚=r[öë RŒî¿&ZËž•~O'IʯZõ¢u6dš€DU0…†[þ¡pf§ôƒˆ¤µìY1º÷KÙ¯'H5¸éôhÍ,Ê¿¯“$¥×½è_³?K@"ƒ*˜6uí£ß–~‘Ô ïÃ[ÏÏ~;@#ô.üçü;;IR~Ëv‹Ñú{²?K@ƒ*˜2ýNÎ?|HjTý+Ï~5@sÔ£èœðké÷v’¤üºgþYöW HbPÓdЋÖ?”~ðÔœz—Ìd¿™ qêꑨܧK’fvŠá7f–€U0EúW‘èÔ˜º§þþ쟾×è룵ìYé÷x’¤üû`êTÁ´èw¢µß¤8$5£Î1ot³ßLÐhƒëOJ¿Ë“$5á·TÝýI˜AL‰Þ‡ä6$5¢êÀWFÝZ—ýZ€"ôÎû»ô;=IRnÝÓÿ(ûs,0ƒ*˜½*Zû¾,ý !)¿jåž1zøÖì·”cØÎ±?Ÿ~·'IÊþ-U7f‘€dPS ÷ùýó’ò[òŒÞyYö+ ŠSoZÕ¾/Í¿ã“$¥Õ=ãO³?GÀ2¨‚I7èEk¿H?`HÊopõQÙo$(ÖèÞ/Eké®é÷|’¤¤–<=FîÍþ Ä  &\ÿÚò’Òë]üoÙ¯#(^ÿËN¿ë“$åÕ»äß³?EÀ1¨‚ Wö“é I¹uO}wD=Ê~ÀDèžùgéw~’¤œªU/Œè·³?EÀ0¨‚ 6øÆ…é‡ I¹µüéˆ~•ý:€ÉÑkEûÐצßýI’r\ó‘ì/° ª`‚µOøÕô…¤¼ª_uë¡ìWLœÑC7Gµü9éw€’¤…¯}Øë³?CÀ0¨‚ 5|èÖhÍ,J?PHÊ©Úk÷­ûjö«&ÖàÆSÒï%I9 îþBög˜gU0¡ºŸúÇôƒ„¤¤fvŠá-çf¿†`âõÎû»üû@IÒ‚×=û½ÙŸ `žTÁ$t£µ÷ Ó’rê~ÿì·L‡a?:G¿-ýNP’´ð)$z­ì¯0 ª`õo<5ý!)§î™žý €©Ro¸7ªUþ#gIš¶7œœý æ‘AL öq¿”~€´ðmù/á¶ü†:`a ¿qa´fvJ¿#”$-\ã%ûóÌ#ƒ*˜0£Go÷mÒVðЍ[ë²_A0µz—̤ßJ’°Å;Çhýٟ`žTÁ„é]º,ÿð iA«–?'F\Ÿýú€éV¢ã/HHÒTÕ¿âàì¯0O ª`ÂTzmúÁAÒ6³(7–ýê¶lª6?Õ>/É¿7”$-Hc>ûÓ̃*˜ Ãu7§$-lýÏ®Ì~õßfx祳*ûîP’´-Þ9êÖºìO0 ª`‚t/þ÷üCƒ¤«{ê»#ê:ûÕ|—ÞÅÿ–~(IZ˜_96û³Ìƒ*˜ ÕÁ¯I?0HZ˜ÚG¾)¢ßÎ~íOd4œý3PÙ÷ˆ’¤ù¯sâ¯gu€y`PbôÀué‡I SµêEQo¸7ûµlE½ñ¾¨V½0ý>Q’4Ï-Ý5êî¦ìÏ0fU0!z—.Ï?,HšÿïÃ;/Ë~åÛ`xÇg¢µxçü{EIÒ¼6¼õüìO0fU0!ÚG½5ý  iþëéÐì× °zýKú½¢$i~ë]ðìÏ 0fU0FÕ£³¿µ&û  i~ëžùgÙ¯`{Ñ>Ú-I“\û°ŸÈþÚcfP Ã)é‡Ió[ûð7DôÛÙ¯`Ôîjåžé÷Œ’¤yjfQÔ›ÌþÜcdP sæŸç$Í[Õ>/ŽzãšìW 0ƒ¯ž™~×(Iš¿7žšý©ÆÈ  J7EkÕ‹Ó’æ©%OáÝŸË~ÓcÐýÄ_æß9J’æ¥îÙ•ý™ÆÈ  7|è–ôäù«åÙ¯`\úU´?ôcé÷Ž’¤ñ×þð벿2ÀTAáú_96ýp i~êžùçÙ¯`ÌFÞ­e»¥ß?J’ÆÜâ£îmÎþÌcbP…ëœõžüä±×^ý3ƒnö+˜ý/8ýR’4þ†w.ûŒ‰A®:ø5éIã­Z¹gÔëïÊ~½ó¥®£ó±ßL¿‹”$·þÌþÂcbPµŠÖÌ¢ôƒ¤1¶xçÞ~Qöë˜guõHTû}þ¤$iluOûÃìÏ 0&UP°ÁÍç¤ $·þgWd¿Z€2¼ýbÿá´$MPíƒ^•ýiÆÄ  Ö½dIú¡@Òøêœø®ˆz”ýjPï‚H¿›”$©™"úUö§ƒ*(Xûc¿•(4–ª^1û+¾€)3èFûïK¿£”$§Ñ×gY€10¨‚‚Uþpú@ÒZúÌÝMö+H2Z{]´–<#ÿ®R’4ç7–ýYÆÀ  JÕÝ<û+#³’æÞàšã²ß(@²þå«Òï*%Is¯ÙòìO 0UP¨á=W¤$ͽîÙïÍ~MP¢ó‘_H¿³”$Í­î’ýEÆÀ  Õ¿òÈôÀ¤¹Õ>ü'#úíì× Ðõú»¢Úk÷ô»KIÒŽ×>âÙŸ` ª PÝO} ý0 iÇ«Vîõcwf¿J€†\ûÑôûKIÒŽWíýüìO 0UP¨ÎÇ~;ý0 i›YÛÏÎ~ Õ=õ÷óï1%I;œ¿På3¨‚BU‡ýdúA@ÒŽÕ»ðƒÙ¯ Áêêá¨ö}iú]¦$iÇòWJ |UP¨ÖŠ=Ò’¶¿öê7G ûÙ¯ á†·_4ûÛî³ï4%IÛßðž/dF€92¨‚ÚëÓ’¶¿jåó¢^wö+(DïÜÿ•~¯)IÚþ7žý æÈ  4¼ÿÚôC€¤ílfQ o>;ûõ”dЉö¡?ž¿)IÚ®ú_<$û Ì‘Ahpó9é‡IÛWïÂÎ~uÝwu´–<=ýŽS’´íõ.þ×ìÏ0GUP þWŽM?HÚöÚ«ß1ìg¿:€Bõ/[ž~Ï)IÚözŸ|ö§˜#ƒ*(Pïò}Ò’¶­jåó¢^wök(Y=ŠÎ±?Ÿ~ß)IÚ¶ºg½'ûËÌ‘A¨ûéÿ7ý išYÛÏÎ~e ~쎨öú¾ü{OIÒSÖ=õÝÙŸ `Ž ª @³Þ“~ôÔõ.üçì×0AW~ï)Izê:'¼3û“Ì‘A¨}Òo¦$m½öÑoö³_À„éœø®ôûOIÒÖëóöìÏ0GUP öÑoO?Hzòª{D½þîìW0êM÷Gµòyé÷ ’¤'¯}ø²?ÀTAªÃ*ý éÉÜprök˜`ƒëOL¿•$=yíÃ^Ÿý©æÈ  Tú¤$=qݳÿ*ûLîÉ¿“~*IzâÚ‡ÿdög˜#ƒ*(PuðkÒ’¾·öÁ?uosö+˜õæ¢Z¹gú½¨$é{ó'ÿ |UP Öþ¯H?Hú®–×e¿€)2¸þ¤ü»QIÒ÷Ô>â§²?ÀTAZû¼4ý é;ëñCÙ¯` ùÓ’Ô¼ ª |UP ÖÊç§$}«Î ëìW0…êÖCQ­zQú=©$é[µxcöç˜#ƒ*(Pk¯ç¦$=^µïË¢®Î~-SlpÃÉéw¥’¤oÕ>òMÙŸ`Ž ª @URCšÙ)†w|&û•“;ÿÎT’4›A”Ï  dP%5£ÞÅÿšý:˜Uo~ ª•{¦ß›J’ ª`TA ª¤üÚ«ß1ìg¿¾ipíñéw§’$ƒ*˜UP ƒ*)¹åÏŽÑÃ_Ï~|Î ¿–‡*ISžA”Ï  dP%å6¸úèì×Àª7ÜÕ^ß—~*IÓœA”Ï  dP%åÕ9áuýxRý/8ý.U’¦9ƒ*(ŸAÈ JÊ©Zõ¨7?˜ý غzc~.ýNU’¦5ƒ*(ŸAÈ JÊix˹Ù?À6=üõh-Û-ý^U’¦1ƒ*(ŸAÈ JZøºçüMö£°]ú—ï~·*IÓ˜A”Ï  dP%-líƒ^uosö£°}FƒhñÆô;VIš¶ ª |UP ƒ*i[¼KŒÖ\™ýØìÑÚëfï9ÓïZ%iŠ2¨‚òTA ª¤…«ÙòìG`NzŸúÇô»VIš¦ ª |UP ƒ*iajùÓÃ~ö#07ý*ª_™~ç*IÓ’A”Ï  dP%-@ËŸ£G¿‘ý¸ŒÅð–sóï]%iJ2¨‚òTA ª¤ù¯åáÙ:ÀXuNþíô»WIš† ª |UP ƒ*i~ë÷ŽˆºÎ~Ôƪ޴6ªþƒ$ÍwUP>ƒ*(A•4U{íõ†{²s€yÑÿâ!é÷°’4éTAù ª @UÒü5¸æ¸ìG`þÔ£h¯~sú]¬$MrUP>ƒ*(A•4?uNüõìÇ`ÞîÿJ´ïœ~'+I“šA”Ï  dP%¿jÅQo\“ýx,ˆÞ'ߟ~/+I“šA”Ï  dP%¿Á 'g?Ú ¦înŠj¿H¿›•¤IÌ  ÊgP2¨’Æ[çc¿™ýX,¸Á×>ž~?+I“˜A”Ï  dP%¯jïD½ùÁìÇ Eç¤ÿž~O+I“–A”Ï  dP%¯ÁWÏÈ~¤ÒÔî‰jùsÒïj%i’2¨‚òTA ª¤ñÔ=ý³g€týÏïŸ~_+I“”A”Ï  dP%éOýµÖe?ÎùFƒhþ†ô{[Iš” ª |UP ƒ*iî n:=ûQhŒÑ}WEkñÎéw·’4 TAù ª @UÒÜêœôÙ1@ãôÎýŸé÷·’4 TAù ª @UÒŽW­xnÔïË~Œ§înŒj¿ïO¿Ç•¤Ò3¨‚òTA ª¤opíñÙ0@c n<5ýW’JÏ  ÊgP2¨’v¬Îñ¿Q×Ù0@£uŽÿ•ôû\I*9ƒ*(ŸAÈ JÚ–?;êÇîÈ~|oôÈmÑZºkþ½®$šA”Ï  dP%mý+È~tŠÑ»ðƒé÷º’TjUP>ƒ*(A•´}µ~kD=Ê~tÊѯ¢:àé÷»’TbUP>ƒ*(A•´-Ûmö×S°}7žšÇ+IfPå3¨‚TIÛ^ÿóûe?²Åê÷Žô{^I*-ƒ*(ŸAÈ JÚ¶Ú‡½>bØÏ~dŠ5Z÷µh-yzú}¯$•”A”Ï  dP%mC‹w‰Ñý×d?®Åë}êçßùJRATAù ª @UÒS×»ðƒÙ*ÀD¨»›¢Ú÷eé÷¾’TÃm³ IDATJUP>ƒ*(A•´õª_Ñke?ªcpý‰éw¿’TJUP>ƒ*(A•´•fÅðŽÏd?¦“¥®£sÌÛóï€%©€ ª |UP ƒ*éÉë~â/²Q€‰4Z{m´ïœ~,IMÏ  ÊgP2¨’ž¸jŸ—DÝ~,û˜XÝOüeú]°$5=ƒ*(ŸAÈ Jzâ7žýxL´ºµ.ª{¤ßKR“3¨‚òTA ª¤ï­óÿ-ûј ý/~',IMΠ ÊgP2¨’¾³j¯Ý£Þpoö£ 0†ýhò£éwÃ’ÔÔ ª |UP ƒ*é;ë_yxöc 0U†·žŸ~7,IMÍ  ÊgP2¨’¾Uçè·EÔ£ìÇ`êtNxgú±$51ƒ*(ŸAÈ JúÏÏ~$¦ÒèÑoDkÉ3òïŠ%©aTAù ª @UÒãõ>õÙ#ÀTë]ðô»bIjZUP>ƒ*(A•ô´¨öû¨»›²G€©VwÖGµê…éwÆ’Ô¤ ª |UP ƒ*éi1¸éôìG€ˆèéÐô;cIjRUP>ƒ*(A•¦½ÎG9û1࿌ÑþÐ¥ßKRS2¨‚òTA ª4Õ-Ý5Fßšýðm†_;+ÿþX’’A”Ï  dP¥i®÷™%Ù O sÌÏ¥ß!KR2¨‚òTA ª4­µzUÄ “ýðFk®ŒÖÌ¢ô»dIÊΠ ÊgP2¨Ò´6¼õ¼ìÇ€­èžö‡éwÉ’”A”Ï  dP¥i¬{òïd?z<…zý]ÑZºkú²$efPå3¨‚TiêZö¬Ù ùzŸþ§ü{eIJÌ  ÊgP2¨Ò´ÕÿܾÙÛ¨î¬jïç§ß-KRVUP>ƒ*(A•¦©öA¯Žt³;¶CÿŠƒÓï—%)+ƒ*(ŸAÈ JÓÔðëd?rl¯a/ÚÿHú³$edPå3¨‚TiZêœøëÙ;hpÓéé÷Ì’”‘A”Ï  dP¥©hÉ3bôð­ÙsÐ9úmù÷Í’´ÀTAù ª @Uš†zŸþ§ìG €9­ùr´f¥ß9KÒBfPå3¨‚TiÒ«V½(êΆìG €1èžò{é÷Î’´TAù ª @Ušô_96û1`LêÇîˆÖÒ]Óïž%i¡2¨‚òTA ª4ɵCD=Ê~Ì£Þÿ~ÿ,I •A”Ï  dP¥Inx×åÙcV·‹jåžéwÐ’´TAù ª @UšÔº§ÿQöãÀ<é~ÿô{hIZˆ ª |UP ƒ*MdËv‹zýÝÙóeØ‹öA¯Ê¿–¤yΠ ÊgP2¨Ò$Ö¿tYö£À<Üð±ôûhIšï ª |UP ƒ*MZÕþ/è·³-æ[=Šö‡_—~/-Ió™A”Ï  dP¥IkpÝ Ù dxóÙé÷Ò’4ŸTAù ª @Uš¤Ú‡½~ö¿H`z´zKúý´$ÍWUP>ƒ*(A•&©áíe?R,°áí§ßOKÒ|ePå3¨‚TiRêœðkÙI:ǽ#ýžZ’æ#ƒ*(ŸAÈ JÑÌN1Z{möã@’Ñš+£5³(ÿ¾Z’ÆœA”Ï  dP¥I¨{Ö{²%’uN|Wú}µ$;ƒ*(ŸAÈ JÅ·l·¨7Ü›ý(lôà³Ñ ýÞZ’ƘA”Ï  dP¥Òë]òïÙ Ñ=íÒï­%iœTAù ª @U*¹jÕ £înÌ~ŒhˆÑ#·Ekñ.é÷×’4® ª |UP ƒ*•\ÿÊó!¦û‰¿H¿¿–¤qePå3¨‚T©ÔÚ‡¼&bØÏ~„h˜zÃ=ÑZºkú=¶$#ƒ*(ŸAÈ J¥6øÚdzª÷É÷§ßcKÒ82¨‚òTA ªTìÁ±®³ªn=Õ^ß—~Ÿ-IsÍ  ÊgP2¨R‰ o¿(ûÑ ázýKú}¶$Í5ƒ*(ŸAÈ J¥Õ9æç² PwÖGµrÏô{mIšKUP>ƒ*(A•JkxÏÙ …èvEú½¶$Í%ƒ*(ŸAÈ J%Õ9é7²JÒkEµÏ‹Óï·%iG3¨‚òTA ªTL3‹b´öºìG€Âô¯88ÿŽ[’v0ƒ*(ŸAÈ J¥Ô=í³J4èDµÿËÓï¹%iG2¨‚òTA ªTD‹w‰ÑÃ_Ï~\(Ôàê£óïº%i2¨‚òTA ªTBÝOüeö£@Ɇý¨|eú}·$moUP>ƒ*(A•ß’gDýØÙ …ó[ª$•˜A”Ï  dP¥¦×»à²&ßR%©À ª |UP ƒ*5¹jùs¢Þü`öcÀ„ð[ª$•–A”Ï  dP¥&×»ðƒÙ“Äo©’TXUP>ƒ*(A•ÛògGÝZ—ýˆ0aW­Î¿—¤mÌ  ÊgP2¨RSë}úŸ²&õ·TðCé÷à’´-TAù ª @UjdKŸõ¦û³&Ôàª#óïÂ%i2¨‚òTA ªÔÄz| ûÑ`’ù-U’ É  ÊgP2¨R#;ÕÆû² &\ÿÊ#òïÄ%é)2¨‚òTA ªÔ´zç¿/û±` ºQíÿòô{qIÚZUP>ƒ*(A•ÕÒ]£Þ¸&û±`Jô¿thþݸ$m%ƒ*(ŸAÈ JMªwÞßf?L“A'ª}_š~?.IO–A”Ï  dP¥Æ´äéQ¯¿;û‘`Êô?·oþ¹$=IUP>ƒ*(A•šR÷œ¿É~˜F½VT{¿ ýž\’ž(ƒ*(ŸAÈ JùíTÝ™ý80¥ú—.Ë¿+—¤'È  ÊgP2¨RêžõžìG€)V·‹j¯ÝÓïË%é»3¨‚òTA ª”ÞÌN1zèæìG€)×»è_òïÌ%é»2¨‚òTA ª”]÷”ßÍ~ êꑨ–?'ýÞ\’¾=ƒ*(ŸAÈ JÙîýRöc³züCú½¹$}{UP>ƒ*(A•2ë÷KÙ|S½im´–>3ýþ\’þ+ƒ*(ŸAÈ J™ ¿ñéìG¾C÷œ¿I¿?—¤ÿÊ  ÊgP2¨RVíÃ^Q×Ù|‡ú±;£µx—ô{tIÚ’A”Ï  dP¥¬7–ýãO¨{ú¥ß£KÒ– ª |UP ƒ*eTøÃ£Aö?<¡Ñ7DkfQú}º$TAù ª @UÊhpÕêì}تΠïL¿O—$ƒ*(ŸAÈ J ]µÏ‹#úíì}تá]ŸM¿S—$ƒ*(ŸAÈ J ]ÿòUÙ?ö°MÚG¿5ý^]ÒtgPå3¨‚Ti!«öÚ=êΆì{Ø&Û?‘~·.iº3¨‚òTA ª´õ.ø@ö<l»ºŽö¡?ž~¿.iz3¨‚òTA ª´`-Þ9êÇîÌþ‘€fö¢Þü@Œº9F÷]ÃÛ/ŽáÍgÇàÆSbpõQÑÿÂÑÿìŠè]øÁÇûäßG÷ì÷>ÞÝSß½õNÿãoþŸïÿ¾oþÏÙò?³ÅA³ÿw n:-†·žÃ;/Ñý_™=ÇûM³L³ÁµÍ¿c—4µTAù ª @UZ¨º'ÿNö;,¼~õcwÄðž+F]µ:ú—.‹Þy;{Fî|ä¢}ØODµÿË£µüÙéçö­¶xç¨V½0Ú‡üh´zKtNúèžó×ÑûÌ’Ùÿw o9'Fk¾õÆû"êQöÿÏÀø ûŸÙ³Ïä’¦2ƒ*(ŸAÈ J ÕðîÏgÿ¸ÀxQ¯¿+†w^ƒëN˜ý-OÝsþ&:'¾ëñ‘ÔÊ=ÓÏái-yF´zUt>ò‹ÑýøÿýK—ÆàÚãcxÏ¢n=”ý¿9Øný+Î?gKšÊ ª |UP ƒ*-Dz«_Åhíµ1øêÑÿܾ³¿‘©óÑ_ž µ–<=ý¬]jÕŠ=¢½úgfÿLaÿ²å³ÿÿ;zøÖˆÑ0ûãð„êÞæ¨V>/ý,-iúòïÙ |UP ƒ*-DƒëOÊþQ€­ª7®‰á—DÿÊãwþûfGSÕ¯ˆÖÌ¢ôóôTµt×hþ†èžñ§ÑÿÜ>1¼ý¢¨ÛfÿxÀ¬ÞEÿ’f–4uTAù ª @Ušïªý¾öïË@Ôõ³ŽzpÕ‘Ñ;÷F瘟›ýmIÙçf=Å?WøÊèžò{Ñ¿|Õã#«îÆì%¦P½iíì}>–4]TAù ª @Ušïú—ïýcÀ”ª×ßï½Kþ=:'þzTûÿ`úùXcjf§høu³‚qpíñ1zøëÙ?nL‰îYïÉ?Kšª ª |UP ƒ*ÍkËžuõHö9S ~ìÎÜtZô.üàã®oïç矇µ U«^ÝS?úW£‡nÉþ‘`BÖ}ÍŸ—´ TAù ª @UšÏ¶ü×â0vý*†w]ýÏíýfTû¼$ýì«æUíûÒèžñ'1¸æ¸¨7ÝŸýS ÀÙòp³Ï»’¦'ƒ*(ŸAÈ JóÖÌ"ÿU8cQo\ƒëOŠÞyí#Þ­Å»äŸwU\íÃ^½ ÿ9†w|&bØËþ± `Ã;/M?ßJšž ª |UP ƒ*ÍWÞ™ýã @¡ê ÷Æàºÿˆî'þ"Ú½*ýl«É«Zþœèžò»³?guûÑìy 4û{4àl+iò3¨‚òTA ª4_ oûTö7…¨7Þ÷ø€ê¬÷Piá[¼Kt>ò‹Ñÿâ!Q¯¿;ûq ƒOÉ?ËJšŠ ª |UP ƒ*ÍG[þ%XÔ£ìošªßŽáíGïÂ>þ_uÏ,J?ÃJÿUûÐ×Fï3KbôèíÙO M6Fuà§Ÿ_%M~UP>ƒ*(A•æ£þÈþÑ aFÞ4{Nìÿ+ÑZ¶[ú™UzÊfEçè·EÿK‡FÝZ—ýÐ@[~Ëiú¹UÒÄgPå3¨‚Tiì-Û-êö£Ù?Údöbø £wîÿŠjÿ—çŸS¥¹þYÀ߃›Nt²Ÿ.¢îmŽjÅùçUIA”Ï  dP¥q×=ëdÿXd˰~pý‰Ñ=õÝQíµ{úÙTš¶ü ³î9£5Wf?r4@ïSÿ;ýŒ*i²3¨‚òTA ª4îF÷]ýc Àª7®™ý3üÂìoñÉ>J Yûˆ7Æà+ÇFô«ìG€$õcwDkñÎégSI“›A”Ï  dP¥qÖ^ýæìirDuôÛ¢5³Sú9TÊnËodëžýÞ=xcöã @‚ÎÇ~3ýL*ir3¨‚òTA ª4Î×ý# À<1¢’¶ã·Vmùg£a?û±` ï¼4ý*ir3¨‚òTA ª4®ª½_1èdÿH0FugÃìŸ3ëûóFTÒvVíûÒè]23;F`òµû‰ô3¨¤ÉÌ  ÊgP2¨Ò¸ê]øÁìgÆa4ŒáíG÷Ì?‹Öòg§Ÿ3¥â[òôÙçi´îkÙO7óhð•còÏž’&2ƒ*(ŸAÈ Jcif§¨»#ûÇ€9­¹2zç¿/ªU/Ì?_J“ØÌNÑ9ù·ctßUÙ;ó¡ßžýKéçNI—A”Ï  dP¥qÔ9ñ]Ù?ÊìèŸô»ú¨hþ“égJišêý¶Þrnö+€1ë]ô/égMI“—A”Ï  dP¥q4¼õüìe¶U]ÇðÎË¢{ÆŸDké3ÓÏ’Ò4×^ý31¼ùõ(ûÍÀÔ×ÌþÉçìs¦¤ÉÊ  ÊgP2¨Ò\«öyÄh˜ý£ ÀS¨[ë¢ÿ¹}¢}ð¤Ÿ!%}gíC_ƒëþÃ?[L€îi~¾”4YTAù ª @Ušk½Ï,Îþ1`+F÷_ݳß­e»¥Ÿ%m½ö‡~,7>û›ä(Óðž+ÒÏ•’&+ƒ*(ŸAÈ JsjfQŒ½=ûÇ€ï6ìÍŽ2:ý¿òÏŒ’¶»öê7ÏþiNÊ´åO;gŸ)%MNUP>ƒ*(A•æR磿œý# À·©7­ý ¢Õ>/I?+Jš{“~#FÞ”ýj`; ®?1ý,)ir2¨‚òTA ª4—7–ý# À–?ë÷ÈmÑûäûýY?i›Ù)º§¾;êÇîÈ~Õ°­†ý¨öûþü³¤¤‰È  ÊgP2¨ÒŽVíý‚ˆA7ûG`ªmù“`}öO1gŸ%ÍsKwÞˆºz8ûÕÀ6è_º4ÿ )i"2¨‚òTA ª´£m¹È A=Šá-çFû¨·¤Ÿ %-|ÕŠ=¢ÿÅC"FÃì·[Q·ÖEké3ÓÏ’ÊÏ  ÊgP2¨ÒŽ6Z÷Õì_€é2ìÇà+ÇFû W¥Ÿ%å×>â1Zóåì7[Ñ=óÏÓÏ’ÊÏ  ÊgP2¨ÒŽÔ>êg³t¦Ç°ƒëNˆöA¯N?JjX3‹¢{æŸÍþöšg´öÚü3£¤â3¨‚òTA ª´#mùÍ,Àêê£þöî=Úóÿ„‹ £.µVémÔÞm§¶®ßÔJ¯¿Úi×4¿ÚvJµµt:kïØþ¦휜„kPÐ…‘ `T.Q!«bÃÅ —Pˆ T€ˆÈ-Ù÷½¿ßÏo“±K[QÉyÞ{?žk=þ¯úáìwÉ+g—îë¿=üþêÖ=åY¾P’$©ÒúçþDø½äfP%åÏ JJ˜Aû«{âÓJ;Üýt%I’¦·ñ Œ®}Sé®>:üöòýKöæóŸŠþ)&I’¤¯h|ë%áw"›A•”?ƒ*)aUì¯Áû^ýl%I’¦³f\Æ7œ[ºoøŽð›Hlî2¸ì÷KÛ8ú§š$I’jÆþÿ<àI1¨’ògP%%Ì Šý5¹ûÚèg+I’4]µMßòîÒ[ó½á·0=º¯ÿ¶2¹}sôO8I’$•RF[W‡ß‡@^URþ ª¤„T±?zoüîRÚ6úÙJ’$MM“ÛÞ_zg½(üΦ×à=¿ë·UI’$×v¿T:«ž~9TIù3¨’fPÅþ}teô“•$IšŠš]7–þy?~ß³¡»úè2ù§Ë¢ôI’$Ítƒ¿~9TIù3¨’fPÅã6·¬4Þýd%I’R×îÙU—½¦tVß3gpÑq¥í=ý£P’$i&›Ü}mø=ädP%åÏ JJ˜AWÿÜŸˆ~®’$IyuËhëêÒ=ééáw0Ûü¶*I’¤¸|å;ðDTIù3¨’fPÅã5þôÛ¢Ÿ«$IR¾Ú¶Œoº tOÿÖð{à+ ÞûßK;ØýSR’$i¦}ê¬ð;ÈÇ JÊŸA•”0ƒ*—ù§”¶û¥èç*I’”ªæÞ›JoÝKão9€ÇÐ=㥹çÑ?.%I’f¦…A»ß\ ì/ƒ*)UR ªx<ïþõè§*I’”¦¶÷Pn>¡tV~Ç|C++Ã-ó¥´MôOI’¤™hpÙïÇ߀@*URþ ª¤„TñxLv\ýT%I’r|½ß¶õ¥{Ú7‡ßoû«ÁÏ—vïýÑ?I%I’¦¾æÞmá·‹A•”?ƒ*)aU|#ÝSŸSÊdýT%I’ª®Ùuãâ¿ÜŠ¾ÝžŒî뿽Lvnþ‘*I’4õùÿýaP%åÏ JJ˜AßÈðýýL%I’êmÔ[üª¬ÎüááwÀ±âÐ}_ØL¢ÂJ’$Mmãοû€4 ª¤üTI 3¨âi¾ðéèg*I’Te“»®*½5ß~¯ ýó~¦´~!úG­$IÒt6ê–îÉÏ ¿ù€ ª¤üTI 3¨âëé­ù¾è'*I’T]mç‹epéo‡ßj[÷´ç–É]þ±+I’4• ¯ø“ð{ÈÁ JÊŸA•”0ƒ*¾žÅ¯y$IÒ¿4¾å¢Ò=õ9áwÀ’™?¼Œ>uVô_I’¤©«¹ÿ–ø[HÁ JÊŸA•”0ƒ*¾žf÷g¢Ÿ¨$IRµ½‡üV*`¦-ü ,£^ôcI’¤©ª¿îØð;¨ŸA•”?ƒ*)aU<–Þ[8úyJ’$UÑäöÍ¥{ú·†ßgÑzg¿¸´ÜýcY’$ijoûûð¨ŸA•”?ƒ*)aU<–ÑÇO~ž’$I¡µýGÊà²×„ße5Y˜6÷|"úG´$IÒt4”îiß~ãu3¨’ògP%%Ì ŠÇÒô¹Ò;çÇÃo1€LúçÿÜâW¤J’$é‰×?ïgÃï: ^URþ ª¤„TñoÌ-+íÃ;£Ÿ¦$IÒ’6Þ¶¾tO|Zü-Pï-?TÚGî‰þQ.I’”¶ñ-…ßt@½ ª¤üTI 3¨â_[ø­ ’$I³R;x´ .úð »îþCivoþ±.I’”³É°tW?/ü¦êdP%åÏ JJ˜AÿÚèº7G?KI’¤%©Ùý™Ò[{Løý0-º'?³L>÷±èï’$I)~øuá÷P'ƒ*)UR ªø*s‡”öÑ/D?KI’¤%ùŠ¿Îª£âï/€i3ÿ”2¾ùÂèó’$IéjúÜâ¿£¿ç€êTIù3¨’fPÅWêŸ÷3ÑOR’$éà6ê•Áû^~wLµ¹ee¸e>ú'¾$IRºúë1þ–ªcP%åÏ JJ˜A_iôÉ·F?II’¤ƒVóžâ` 7ýq)Í$úÇ¿$IRÕµ½ËäŸÿ¡Œ>vbéõ¢ð¨A•”?ƒ*)aUü‹¹e¾îO’$Mm“Û®(Ý“žs̘Á»~­”É0úc@’$©ŽF½2¹ûÚ2ºnM\ò[¥÷Æï¿×€úTIù3¨’fPÅ—õÎyIôs”$I:ðµmm]]:s‡„ß[³já«kþðP’$iÖjº³Œ·­/ÃÍ'”þºcKgåá·A•”?ƒ*)aU|ÙhëéÑÏQ’$é€Ö÷–Á»=üÎàß•þ¹?YÚÁ£Ñ ’$I­vÏ®2Ù±© ·Ì—þ†å¥{ʳÂo0`:TIù3¨’fPÅ—5Üý%I’èßî½å‡Âo,¾úÚî—¢?"$I’žt CñÉΫ÷}ußEÇ•îê£Ão-`zTIù3¨’fPÅ‚Þ[~0ú)J’$°š{®+ÝÓž~cðoõÖSÚ=÷FTH’$=þ&£ÒìÞ^Æ×ŸS_¼g|­<°” ª¤üTI 3¨bÁpËŠè§(I’t@ßzqé¬zjø}Àcë­ù¾Ò>úùè I’¤ÇüÇãmëËpó ¥¿îØÒYydøýÌ6ƒ*)UR ªXÐÜ»-ú)J’$=¹Ú¶Œ¶®.¹eá·ßX÷Œç—æÁ;¢?=$IÒŒ×îÙU&;6•á–ùÒß°¼tOyvøð¯TIù3¨’fPE÷ŒD?CI’¤'×xP—þvø]Àþé¾þÛKóÀíÑŸ"’$iFjû”ÉW–ÑU§”þ;_^º§Kø=ðxTIù3¨’fPÅðý %I’žpmï¡Ò?÷'Ão*ž˜îë¿Íoª’$I¾ñ 4Ÿÿd}ò-e°ñøÅ¯ö¬ ª¤üTI 3¨b²óêèg(I’ô„j÷Ü[zoýáð{ €'§û†ï(íCŸ‹þX‘$IÉ¿ºo|ë%e¸ù„Ò_wlé¬<2üÆ8P ª¤üTI 3¨šmÝÕÏ+¥™D?CI’¤ýná·™ôÞø]á÷F÷Œç—öáÑ/’$)Éxj²cSn™/ý ËK÷Ôo ¿e&ƒ*)UR ªfÛà²ß~‚’$Iû]óùO•î©Ï ¿¥8°¾Š§Ý{_ôÇŒ$šsŒ IDATIª¨¶ÿH™Üù‘2úø©¥ÿÎ_Yüºàè›`©TIù3¨’fP5Û&·]ý%I’ö«…‘Þ=ééáw‡Q•$I3\3.Íîíe¼m}\öšÒ[{LéÌ~ŸD3¨’ògP%%Ì j†­zj)£nô”$IzÜ-|¥CgåñwUï­ÿ±´Ý/EìH’¤%øê¾ñ­—”áæJݱ‹ÿÎ:ú¨‘A•”?ƒ*)aU³«ÿ÷ÿ%úùI’$=îÆ·¼»tV~C°4zg½¨´½‡¢?~$IÒªÝsïâ_’n™/ý Ë};À~0¨’ògP%%Ì jv>ùÖèç'I’ô¸ßp®¯y˜A½s~¼”a'úcH’$ígí`O™|î£e´uu¼ë×J÷õß~WdfP%åÏ JJ˜AÕìj¾+úùI’$}ÃFŸ:Û˜ `†õÏÿ¹R&Ãè#I’ôX5ãÒìÞ^ÆÛÖ/~u_ïìûÿá0ƒ*)UR ªfSï-?ýô$I’¾a£­§‡ßMÄlüRÚ6úcI’$µmi¸½ŒoÞ°oûÁè,I’RÕîÙU&;6•á‡þ¦ô×[:«ŽŠÿLàq3¨’ògP%%Ì jöŒo¾0úÙI’$ý›þf´1G÷¤§—f× Ñ]’$UYÛÙ]&·]Q†™+ýõ¿¸øÑŸÝ<9URþ ª¤„T͘‡–¶û¥èg'I’ôUMv\^:+‹¿•H£»úy¥yðŽè0I’bvÊä®—ÑÕo(ƒ‹Ž+Ý3žþ ÀgP%åÏ JJ˜AÕlYøuÎ’$I55¹ëªÒYydø@>½7iûG”I’´45ãÒÜ»­Œ¯?§ Þ÷?Jï-?´øh£?8ø ª¤üTI 3¨š-£®Š~r’$IÿRsß?–îÉÏ ¿‘È«ÿöŸ.e2ŒþH“$é€×îÙU&;6•á–ùÒ¿àe¥³ê¨ðÏ]bTIù3¨’fP5[š{>ýä$I’küìâ×5EßGä·ð[:$IÊ\Û¤Lv^]F[W—þ†å¥{ÚsÃ?_¨‡A•”?ƒ*)aU³cá·?”fýä$I’J»÷¾Ò=ãá÷ÓctÝšè7I’_ÃξñÔ5g–Áů(Ý3_þ9 @Ý ª¤üTI 3¨šƒwÿ×èç&I’TʨWzç¼$ü6`ʬ8tñk‘$IªªfRšÝÛËxÛú2Ü|Bé¯;¶tæŸÿ¹ @*URþ ª¤„TÍŽñ§ßýÜ$IÒ¬×6¥ÿÎ_ ¿‹˜NÝ“ž^šûþ1úÓN’4õ{v-|‡[æKÿ‚—•Ήÿ>üó€ü ª¤üTI 3¨šíCwF?7I’4ã ßÿgá7Ó­{ÆóK»÷þèIÒ45•f× etÝš2Øx|é­=¦tæ–…æ0 ª¤üTI 3¨š ÃMýÔ$IÒ ·ð•¹CÂo"fÇà=ÿ-úãO’”µfRšûo)ãÞ^—½¦ôÎzQé¬8,ü³ €ÙeP%åÏ JJ˜AÕl˜üÓû¢Ÿš$IšÑš/î(ݓݜ,½Ñ§ÎŠþ”$%¨Ý³kñ/ ·Ìïûê¾Sžþ_É JÊŸA•”0ƒª°â°Òö‰~j’$ik{.~õpø=Àlš?¼Lvnþ8”$UT;x´Lv^½ï«û.:®tW?/þó ¾ƒ*)UR ª¦_ݱÑÏL’$Íb͸ôÏÿ¹ð[€ÙÖ]}ôâo‘$Í`“Qivo/ãëÏ)ƒÇ—ÞÚcJgnYøgì/ƒ*)UR ª¦ßè£+£Ÿ™$IšÁ†WüIø úçþäâªK’¦¸f²oúù2þÌ{ÊðCSúçýléžôŒðÏÈÀ JÊŸA•”0ƒª)¶ê¨R&Ãè'&I’f æ Ÿö7ÉHetÝ›£?>%iê¿|á/{Ž®[³øÕ}Ý3_þ³²2¨’ògP%%Ì jzõ/xYôó’$I3P;Ü[zoúžðÛöËüá¥ùü'£?F%i:jÆ¥Ù½½Œ·­/ƒË^Szk)¹CâÖÀ”0¨’ògP%%Ì jz>vRôó’$I3ÐàÒW…ß=ðDôÞø]¥í?ýQ*Iéj÷ì*ã[/)ÃÍ'”þºcKgå‘á?Ó`šTIù3¨’fP5½~¥¶$IÒÁl|Ó;Âox2ýq*IU×î¹·Lvl*Ã-ó¥¿ayéžúMá?»`ÖTIù3¨’fP5¥VUÊxý¼$IÒ×û¡èhI©vÏ®2Ù±© ·Ì—þ/+UGÅÿÜø? ª¤üTI 3¨š£­«£Ÿ“$Iš’ú~)ü¶€ÚtÏx¯þ“¦ ¶ÿH™ì¼zñߥõ7,/ÝÓžþóàë1¨’ògP%%Ì jzLvn~N’$i šÜ¾9ü®€Z ¯øÓèjIûÓ¨»o URþ ª¤„TM‡Áe¿ý”$IRòþ`¸{ú·„ß5ÁðýÑ-ÍTíàÑ}_Ý·uõ¾ñÔêç…ÿX*URþ ª¤„TM‡ñõ뢟’$IJÞÂßì¾i ÕWÿí¼:úã[šÎ&£Ò캡Œ®[S/½µÇ”Îܲøî‚TIù3¨’fP5š{oŠ~J’$)qíÞûJ÷ħ…ß4IïÍß_ʸý1.å®™”æþ[ÊøÆóÊàò?(½³^T:+ ÿç &URþ ª¤„TMUO]ü›{’$IO´áæâoHhøá×EŒK©jÞYÆ·^R†üËÒûOõ<URþ ª¤„Tå×[÷Òèg$I’×îÙµ8ÐŽ¾i ¥‡•æ¾›£?Î¥*k.~5æâW÷]t\é®>:þŸY€„ ª¤üTI 3¨Êo¸ùµÑÏH’$%n¸éÂïȬ÷¶+¥m¢?Ò¥Ø&£ÒìÞ^Æ×ŸS/½µÇ”Îܲð>¦A•”?ƒ*)aUùo¾0úI’¤¤µÜ]:+¿g »ñ§ßý±.-iíCw–ñ¶õ‹_Ý_w¬›à 2¨’ògP%%Ì *¿æKÿýŒ$IRÒï{uø-Ó {Ò3¿FWšÆÞödǦ2Ü2_ú–—î)Ïÿg`–TIù3¨’fP•[÷äg–Ò¶ÑÏH’$%¬}xgéÌ~ÏÀ´\üŠèwéI×ö.“Ï~¨Œ®:¹ô/üåÒ]}tø?[³Î JÊŸA•”0ƒªÜúü|ô’$II¾ÿÏÂo˜6“Û®ˆþˆ—“Qivo/ãëÏ)ƒÇ—ÞÚcJgîðŽøjURþ ª¤„Tå6üð뢟$IJXÛ} tNü÷á· L›î™/,eÔþ¨—þmmSšÝŸ)ã›ÞQ†›þxñåü¶R€ ª¤üTI 3¨Êm|ëÅÑOH’$%l¸eEøÓÊ_~R µ{v•ÉŽMe¸e¾ô7,/ÝSžþÏOŒA•”?ƒ*)aU¹5Üý„$IR²ÚáÞÒ=õ›Âï˜Zó‡—æþ[¢?ò5CµýGÊäŽ+ËèªSJÿ//ÝÓ¿5þŸƒ*)UR ªòêžø´Å_×.I’´?®}cøÓ®¿îØRÚ6úc_ÓX3.Íîíe¼m}\öšÒ[{LéÌþæ8x ª¤üTI 3¨Ê«·î¥ÑÏG’$ek2*Ý7|Gø³`|ó…ÑŸüÊ^Û”æ‹;ÇSÃ+þ´ôÞöŸJgþ)áo€¥eP%åÏ JJ˜AU^Ã+þ$úùH’¤d-üÁnô ³¢»úèůb“oíž{ËdǦ2Ü2_ú–ûšfTIù3¨’fP•×øúuÑÏG’$%kñ·TpÇÀ¬~ð¯¢?þUiípo™ì¼ºŒ®[Sß÷Õ}¼YêcP%åÏ JJ˜AU^Í®~>’$)Q“[Ãï˜9++Íý·DŸŠ®—f÷ö}_Ý·ù„Ò;ûÅ¥3wHüû ƒ*)UR ª’ZqX)ã~ôó‘$I‰ê¿ëWão˜Aýó.ú Ð×îÙUÆ·^²8žê¯;¶tV=5ü—A•”?ƒ*)aU9õÞòƒÑOG’$%ª}ø®ÒYqhø ³j¼ýÒès@©vϽe²cSn™/ý ËK÷Ôç„¿7¦‹A•”?ƒ*)aU9 .ýíè§#I’5ÜüÚðûfY÷ ßQʰ}èIÖ÷–ÉΫËèº5e°ñøÒ[{LøÛ`úTIù3¨’fP•Óèê7D?I’”¤v°§tOzFøý³nxåßEŸÚŸ&£Ò캡Œ>uv¼çwKoí”ÎÜ!áï€ÙcP%åÏ JJ˜AUN“;®Œ~:’$)I }»ÿ®tVQšïˆ> ôµjÛÒ|éŸËøæ Ëpó ¥wΗÎÊ#ãß TIS‘A•”0ƒªœÚΣŸŽ$IJRï-?~»û ÞõkѧöS{ï/“›Êð#ÿ«ôßñ ¥{ʳÂß<ƒ*)UR ªòéžöÜèg#I’’4¹ëãá· ðÕ&w~$úD˜­†2Ùyu]·¦ 6_zk)¹eáï/ƒ*)UR ªòéŸ÷³ÑÏF’$%ipñ+Ãoà«õÎzQ)m}&Lg͸4»·—ñ¶õ‹_Ý×_wléÌ?%üsx2 ª¤üTI 3¨ÊgxÅŸF?I’” vï}þ*5¾ñüèSa*j÷ìÚ÷Õ}[æKÿ‚—•Ϊ£Âÿ·€Í JÊŸA•”0ƒª|ÆŸþßÑÏF’$%hô±“Âïàkë®~^iFŸ ©jû”ÉWîOmX^º§}søÿް ª¤üTI 3¨Êg²skô³‘$Iµ×6¥{Æ Âïà± ?ò¿¢/†zvÿýÇèš3Êà¢ßp×0Ó ª¤üTI 3¨Ê§í=ýl$IRåMîüHøÍ|«žZÚ‡wFŸ ñ5“ÒìÞ^ÆÛÖ—áæJݱ¾¶¾‚A•”?ƒ*)aU¹tOÿ–è'#I’4¸ôUáw ð .ù­2kµ{v•ÉŽMû¾ºï‚—•Ϊ£Âÿw€šTIù3¨’fP•Ë¿h”$IúzµýGüÁ$d1·¬LLó]2Ùyum]]ú–—îiÏÿï’1¨’ògP%%Ì *—áæ×F?I’TyãëÏ ¿Y€Ç¯·î¥e*u÷§®9³ .~eéžùáÿÝÀ40¨’ògP%%Ì *—ñõ뢟Œ$Iª¼ÞÛ~,üföÏä3ï-©j&¥Ù½½Œ·­/ÃÍ'”þºcKgåáÿ=À42¨’ògP%%Ì *—ÉÝ×F?I’TqÍ·…ß+Àþë­ùÞRšq©µvÏ®2Ù±© ·Ìïû꾓ŸþßÌ ƒ*)UR ªriûG?I’Tqÿ.ü^ž˜…¯í­¡¶û¥2¹ýeôÑU¥¿á—J÷´ç†ÿw³Ì JÊŸA•”0ƒª<º§kôs‘$I5×¶¥{æ Ãoà‰éžþ-¥ ;K{?Œzer÷5etí›Êà’ß,½7~WøÀW3¨’ògP%%Ì *þy?ý\$IRÅ5÷\~¯OÎèc'ÄcaRšÝÛËxÛú2Ü|Bé¯;¶tVþŸøú ª¤üTI 3¨ÊcpùD?I’Tq 0}¯ON÷¤§—vïýä6h÷ì*“›ÊpË|éoX^º§<+ü?°ÿ ª¤üTI 3¨ÊctÍ™ÑÏE’$ÕZÛ,~=pô½–ÉΫËèº5epÑq¥»úèðÿÀaP%åÏ JJ˜AU“ÛÞý\$IR¥MîüHø­ ó‡—æÁÏ~þѾ¯î»þœ2Øx|é­=¦tæ‰ÿ¿8( ª¤üTI 3¨Ê£ùÒ?G?I’Tiƒ÷½:üVœÁ%¿ù/ŸóíCw–ñ¶õ‹¿¹ª¿îØÒYydøÿ}ÀÒ1¨’ògP%%Ì *‰ùÃKiÆÑÏE’$ÕX3.ÝS¿)þ^œ¹e¥ÿöŸ*Ý“žÿ Ê JÊŸA•”0ƒªzk¾/ú©H’¤J›Ü¹%üVƒ*)UR ªrè_øËÑOE’$UÚÂ×ÿDß*ÀÁaP%åÏ JJ˜AUÃþeôS‘$I•Ö=ó…á· ppTIù3¨’fP•ÃøúuÑOE’$UXsßÍáw pðTIù3¨’fP•Ã䮫¢ŸŠ$Iª°ÑGW…ß)ÀÁcP%åÏ JJ˜AUíÞû¢ŸŠ$Iª°ÞÙ/¿S€ƒÇ JÊŸA•”0ƒªúuO|Zô3‘$IÖ>úùÒ™[~«A•”?ƒ*)aUõë½å‡¢Ÿ‰$Iª°ñõëÂïàà2¨’ògP%%Ì ª~ýw¾<ú™H’¤ \t\ø\URþ ª¤„TÕoø?~&’$©¶šIéžòìð;8¸ ª¤üTI 3¨ªßèº7G?I’TYÍç?~£ŸA•”?ƒ*)aUõ›ÜvEô3‘$I•5ºêäð8ø ª¤üTI 3¨ª_³û3ÑÏD’$UVÿí?~£ŸA•”?ƒ*)aU•›[VʨýL$IRM ;¥³òˆø;8è ª¤üTI 3¨ª[wõÑÑOD’$UÖä¶÷‡ß(ÀÒ0¨’ògP%%Ì ªn½u/~"’$©²†üËðXURþ ª¤„TÕmpé«¢Ÿˆ$Iª¬Þ9/ ¿Q€¥aP%åÏ JJ˜AU݆™‹~"’$©¦F½Ò™Jø, ƒ*)UR ªê6¾ñüè'"I’*jr×Uá÷ °t ª¤üTI 3¨ªÛäs~"’$©¢FW~ŸKÇ JÊŸA•”0ƒªº5~6ú‰H’¤Šêÿý ¿O€¥cP%åÏ JJ˜AUÅæ–•2êE?I’TKm[º§<;þF–ŒA•”?ƒ*)aUõêžöÍÑÏC’$UTsÿ-á÷ °´ ª¤üTI 3¨ªW﬉~’$©¢Æ×¯ ¿O€¥eP%åÏ JJ˜AU½úï|yôó$I5¸ì5á÷ °´ ª¤üTI 3¨ª×ðŠ?~’$©¢zg¿8ü>––A•”?ƒ*)aUõm]ý<$IR-M†¥³òˆðûXZURþ ª¤„TÕküïŒ~’$©’š{o ¿M€¥gP%åÏ JJ˜AU½&;·F?I’TIãÎ ¿M€¥gP%åÏ JJ˜AU½Ú‡ïŠ~’$©’†›þ(ü6–žA•”?ƒ*)aU•š;¤”É0úyH’¤Jê½í?Åß'À’3¨’ògP%%Ì ªNÝÕGG? I’TK͸tV=5ü>–žA•”?ƒ*)aUuêýâè§!I’*©Ùý™ðÛˆaP%åÏ JJ˜AUú–G? I’TIãí—†ß&@ ƒ*)UR ªê4¸ì÷£Ÿ†$Iª¤ÑÇN ¿M€URþ ª¤„TÕiø‘¹è§!I’*ipÉo†ß&@ ƒ*)UR ªê4úÔYÑOC’$URï­?~›1 ª¤üTI 3¨ªÓø3ï‰~’$©†Ú¦tV=5ü6bTIù3¨’fPU§ÉÝ×F? I’TA̓w„ß%@ƒ*)UR ªêÔ>ô¹è§!I’*hrÛáw Ç JÊŸA•”0ƒª:•Q7úiH’¤ ]ýúð»ˆcP%åÏ JJ˜AU}º'=#úYH’¤J¼÷÷Âo ŽA•”?ƒ*)aUõé½ùû£Ÿ…$Iª¤þy?~›q ª¤üTI 3¨ªÏœJ’$-Ô=ãùá· Ç JÊŸA•”0ƒªú .~eô³$I5ÔŒKgÅaá· Ç JÊŸA•”0ƒªú 7¿6úYH’¤ jº3ü.bTIù3¨’fPUŸÑÇNŒ~’$©‚&wn ¿K€XURþ ª¤„Šlü© IDATTÕgô©³£Ÿ…$Iª ñ o¿K€XURþ ª¤„TÕg¼ýÒèg!I’*hxåß…ß%@,ƒ*)UR ªê3ùÜÇ¢Ÿ…$Iª Á¥¯ ¿K€XURþ ª¤„TÕ§¹ÿÖèg!I’*¨·î¥áw Ë JÊŸA•”0ƒªú´{î~’$©‚º¯ÿ¶ð»ˆeP%åÏ JJ˜AUeæ–•2E? I’]۔ΊÃâo ”A•”?ƒ*)aUuéžò¬è'!I’*¨Ý{ø]Ä3¨’ògP%%Ì ª.½7}Oô“$IÔÜwsø]Ä3¨’ògP%%Ì ª.½s~<úIH’¤ šüó?„ß%@<ƒ*)UR ªêҿ𗣟„$Iª ñM„ß%@<ƒ*)UR ªê2xïïE? I’TA£Ÿ~—ñ ª¤üTI 3¨ªËðƒý$$IR 7¿6ü.âTIù3¨’fPU—ÑÇNŠ~’$©‚¿"ü.âTIù3¨’fPU—Ñ'ßý$$IRõßþSáw Ï JÊŸA•”0ƒªºŒoÞý$$IRõÖ|oø]Ä3¨’ògP%%Ì ª.“›¢Ÿ„$Iª î)Ï ¿K€xURþ ª¤„TÕe²skô“$IѵMé¬84ü.âTIù3¨’fPU—æþ[¢Ÿ„$I ®í?~“u0¨’ògP%%Ì ª.í#÷D? I’\ûÐçÂo URþ ª¤„TÕ¥ì‰~’$)¸f×á7 Pƒ*)UR ª*²âÐRÚ6úIH’¤à&wn‰¿K€*TIù3¨’fPUî)ÏŽ~’$©‚ÆÛ7†ß%@ ª¤üTI 3¨ªG÷ÌïŒ~’$©‚Æ7œ~—u0¨’ògP%%Ì ª½³4ú9H’¤ ]ýú𻨃A•”?ƒ*)aUõè¿ý§£Ÿƒ$Iª á•~—u0¨’ògP%%Ì ªý Ë£Ÿƒ$Iª Áå~—u0¨’ògP%%Ì ªƒ‹_ý$IR .ù­ð»¨ƒA•”?ƒ*)aUõ¼ïD?I’TAýwþJø]ÔÁ JÊŸA•”0ƒªz 7¿6ú9H’¤ ê¿ãÂï URþ ª¤„TÕcxåßE?I’TAýs2ü.ê`P%åÏ JJ˜AU=F?5ú9H’¤ êýâ𻨃A•”?ƒ*)aUõ}bmôs$IÔ[{Lø]ÔÁ JÊŸA•”0ƒªzŒo|WøMÔàJÊŸA•”0ƒªJÌ-+¥m£Ÿƒ$I ®yðŽø»¨†A•”?ƒ*)aU•XydôS$IÔü6ê`P%åÏ JJ˜AU†ÿð?£Ÿ‚$Iª¤Áe¯ ¿M€:TIù3¨’fPU‡áþ<ú)H’¤J~à/Âo URþ ª¤„TÕaøþ?‹~ ’$©’†[æÃo URþ ª¤„TÕa¸é£Ÿ‚$Iª¤Ñ5g„ß&@ ª¤üTI 3¨ªÃàò?ˆ~ ’$©’Æ×¯ ¿M€:TIù3¨’fPU‡Áû^ý$IR%o¹(ü6ê`P%åÏ JJ˜AUïýïÑOA’$UÒäö„ß&@ ª¤üTI 3¨ªÃ`ãïD?I’TI“»¯ ¿M€:TIù3¨’fPU‡Á¥¯Š~ ’$©’šûo ¿M€:TIù3¨’fPU‡ÁůŒ~ ’$©’Ú‡ï ¿M€:TIù3¨’fPU‡Á»=ú)H’¤Jj{†ß&@ ª¤üTI 3¨ªCÿ]¿ý$IR-5ãðÛ¨ƒA•”?ƒ*)aUuèoXý$IREuV~Ÿñ ª¤üTI 3¨ªCÿÿ9ú)H’¤Šê®>:ü>âTIù3¨’fPU‡þÛ:ú)H’¤Šê­ùÞðûˆgP%åÏ JJ˜AUzç¼$ú)H’¤ŠZø—$Ñ÷ Ï JÊŸA•”0ƒª:ôÎú‘è§ I’*ªþÏ…ß'@<ƒ*)UR ªêÐ[ûÑOA’$UÔà¢ãÂï žA•”?ƒ*)aUuè½é{¢Ÿ‚$Iª¨Áå~Ÿñ ª¤üTI 3¨ªC÷ ÿ!ú)H’¤Š^ù·á÷ Ï JÊŸA•”0ƒª:tW?/ú)H’¤Š]sFø}Ä3¨’ògP%%Ì ªÝSžý$IREoº ü>âTIù3¨’fPU‰UGE?I’TQ“—Çß'@8ƒ*)UR ª*±âÐè§ I’*jr÷5ñ÷ ΠJÊŸA•”0ƒªz”fý$IR%5_Ü~›ñ ª¤üTI 3¨ªGv¢Ÿƒ$Iª¤¶³;ü6àÿgïΟv¿ëúŽ÷„PÄ\PÅQ)˜2êLdjmUŠK[±‚ˆ£QZu:"Šc[E«Þ''ÉIHY!È¢lä$@Bdç„„B +1‡“Å 9I÷µoÀP¶$g»ïûýy]×ã9óø>?¼çþ¾æºÿ”3¨’ò3¨’3¨jÇ´ó@õs$I­4Í–—Ö•ß'@-ƒ*)?ƒ*)0ƒªvL¾«ú9H’¤†êlt§À¢3¨’ò3¨’3¨jÇäÛªŸƒ$Ij¨Î?Z~Ÿµ ª¤ü ª¤À ªÚ1¹ïãÕÏA’$5Ô£(©¾O€ZUR~UR`Uíßõáêç I’ª÷Oÿµü>jTIùTITµcüϨ~’$©¡úgýNù}Ô2¨’ò3¨’3¨jÇø–÷V?I’ÔPƒóÿ¬ü>jTIùTITµcôÉ3ªŸƒ$Ij¨á¥”ß'@-ƒ*)?ƒ*)0ƒªvŒ®?©ú9H’¤†}ô­å÷ PË JÊÏ J Ì ªÃkÞRý$IRCoyOù}Ô2¨’ò3¨’3¨jÇðªÃ«Ÿƒ$Ij¨ÉÝW—ß'@-ƒ*)?ƒ*)0ƒªv /ÝPý$IRCM·ÝY~Ÿµ ª¤ü ª¤À ªÚ1¸øõÕÏA’$µÔ`¹ü>jTIùTITµcpÞk«Ÿƒ$Ij¬å¿­üFêTIùTITµ£öïW?I’ÔXÝ#ŸS~£u ª¤ü ª¤À ªÚÑ;íeÕÏA’$5V÷íÿ±üFêTIùTITµ£wò/W?I’ÔX½Ó³üFêTIùTITµ£ûÖŸ©~’$©±ú羦üFêTIùTITµ£{Ì¿­~’$©±—ì_~£u ª¤ü ª¤À ªÚÑ9ü‡ªŸƒ$Ij¬áµÇ—ß(@ƒ*)?ƒ*)0ƒªvt6>½ú9H’¤ÆÝ|NùÔ1¨’ò3¨’3¨jÈú'ÍfÓiõ“$I 5¾ëÃõ7 PÆ JÊÏ J Ì ª-³Árõ“$I 5yðŽòû¨cP%ågP%fPÕ–é?[ý$$IRCMûÛËï ŽA•”ŸA•˜AU[&_øtõ“$Iµ|À·–ß(@ ƒ*)?ƒ*)0ƒª¶Lþåúê'!I’«{ÔsËo †A•”ŸA•˜AU[Æw^Rý$$IRcõNzQùÔ0¨’ò3¨’3¨jËèæsªŸ„$Ij¬þ¦ýÊo †A•”ŸA•˜AU[FןTý$$IRc .~}ùÔ0¨’ò3¨’3¨jËðÃGT? I’ÔXë.¿Q€UR~UR`Um\²¾úIH’¤ÆÝ´©üFjTIùTITµeð¾?¯~’$©±&w_]~£5 ª¤ü ª¤À ªÚÒ?ûÕÕOB’$5Öôá»Êo †A•”ŸA•˜AU[z§¾´úIH’¤ÖgËK{•ß)ÀÚ3¨’ò3¨’3¨jKïÄV? I’Ô`C¿¿üNÖžA•”ŸA•˜AU[ºoù©ê'!I’¬{üO—ß)ÀÚ3¨’ò3¨’3¨jKç?\ý$$IRƒõN}Iù¬=ƒ*)?ƒ*)0ƒª¶tzZõ“$I Ö?÷5åw °ö ª¤ü ª¤À ª³´n6›Œ«Ÿ…$Ij¬áeÕß)Àš3¨’ò3¨’3¨jÏ´û`õ³$I5ºþäòX{UR~UR`Uí™|áÓÕÏB’$5ÖøŽ‹Ëo`íTIùTITµgr÷GªŸ…$Ij¬Éç>U~£kÏ JÊÏ J Ì ª=ãÛ.¨~’$©±¦Ýmå7 °ö ª¤ü ª¤À ªÚ3ºá”êg!I’¬sÐw”ß)ÀÚ2¨’ò3¨’3¨jÏpó‘ÕÏB’$5X÷Øç—ß)ÀÚ2¨’ò3¨’3¨jÏàƒWý,$IRƒõNyqù¬-ƒ*)?ƒ*)0ƒªöôÏýãêg!I’ìÑ¡úNÖ–A•”ŸA•˜AU{úg¼¢úYH’¤^qHù¬-ƒ*)?ƒ*)0ƒªöôNúÅêg!I’lô‰SËï`mTIùTITµ§û–Ÿª~’$©ÁÆ[¯*¿S€µeP%ågP%fPÕžÎá?Xý,$IRƒM¾»üNÖ–A•”ŸA•˜AUƒ6|Kõ³$I-6Ï–÷rý­¬ƒ*)?ƒ*)0ƒª6ÍËÕOC’$5XçM?R~§kÇ JÊÏ J Ì ªMÓm[ªŸ†$Ij°Þ‰/,¿S€µcP%ågP%fPÕ¦ÉÝ©~’$©Áú›~¯üNÖŽA•”ŸA•˜AU›Æ·¼·úiH’¤|ðïÊï`íTIùTITµitÝÛªŸ†$Ij°Go„ê;X;UR~UR`Um^v`õÓ$I 6¾ã¢ò;X;UR~UR`Umœÿ§ÕOC’$5Øäþ[Ëï`íTIùTITµ©Æ+ªŸ†$Ij±a§üNÖŽA•”ŸA•˜AU›z'üBõÓ$IÖ9äå· °6 ª¤ü ª¤À ªÚÔ=úyÕOC’$5Z÷ø”ß*ÀÚ0¨’ò3¨’3¨jSgãÓ«Ÿ†$Ij´þé//¿U€µaP%ågP%fPÕ®Ù°[ý<$IRƒ .úËò;XUR~UR`Uíš>´µúyH’¤^{\ù¬ ƒ*)?ƒ*)0ƒªvMî¹¶úyH’¤ß~aù¬ ƒ*)?ƒ*)0ƒªvo=¯úyH’¤›vBõó$I-6êÏ–—ö*¿U€ÕgP%ågP%fPÕ®á嫟‡$Ij´ÎŸ]~««Ï JÊÏ J Ì ª]ƒ ^Wý<$IR£õNüOå· °ú ª¤ü ª¤À ªÚÕ?ó•ÕÏC’$5ZÿÝP~««Ï JÊÏ J Ì ª]½_Xý<$IR£ /;°üVVŸA•”ŸA•˜AU»ºGÿxõó$I6úÄ©å· °ú ª¤ü ª¤À ªÚÕÙøÕÏC’$5Úäî«Ëo`õTIùTITµm6êW?I’Ô`Ó/~®üNVŸA•”ŸA•˜AUÛ¦ß]ýD$IR£uüöò[X]UR~UR`Um›Ü{]õ‘$IÖ}óO”ß*Àê2¨’ò3¨’3¨jÛø¶ ªŸˆ$Ij´Þ©/-¿U€ÕeP%ågP%fPÕ¶Ñõ'U?I’Ôhƒ ÿ¢üVV—A•”ŸA•˜AUÛ†—\ýD$IR£ ?rlù­¬.ƒ*)?ƒ*)0ƒª¶ Î{mõ‘$I6¾íüò[X]UR~UR`UmëúÒê'"I’mòù›Ëo`uTIùTITµ­{ܾÕOD’$µÚ°;[^ZW~¯«Ç JÊÏ J Ì ªm7|oõ‘$I ×9ìYå÷ °z ª¤ü ª¤À ª·´n6õªŸ‰$Ij´Þ‰/¬¿W€UcP%ågP%fPվɃÿ\ýL$IR£õßóGå· °z ª¤ü ª¤À ªÚ7ÞrYõ3‘$I6¼òÐò[X=UR~UR`Uí}âÕÏD’$5ÚèæsÊo`õTIùTITµoxŪŸ‰$Ij´Éç>Y~««Ç JÊÏ J Ì ª}ƒóÿ´ú™H’¤VvgËK{•ß+Àê0¨’ò3¨’3¨j_ï´ß¨~&’$©á:o|vù½¬ƒ*)?ƒ*)0ƒªöuAõ3‘$I ×;ù—Êï`uTIùTITµ¯ó†ï«~&’$©áúçþqù½¬ƒ*)?ƒ*)0ƒªKëf³Q¿ú©H’¤F~øMõ÷ °* ª¤ü ª¤À ª2L·ÝYýT$IR£o=·üVV‡A•”ŸA•˜AU†ñg®¨~*’$©Ñ&÷ßR~««Ã JÊÏ J Ì *Ãè§V?I’Ôj£þlyý“Êï`åTIùTITe^yhõS‘$I ×yÓ”ß+ÀÊ3¨’ò3¨’3¨Ê0¸àuÕOE’$5\ïÿsù½¬<ƒ*)?ƒ*)0ƒª ½Ó^VýT$IRà Î{mù½¬<ƒ*)?ƒ*)0ƒª %I’ôD 7U~¯+ÏwB)?ƒ*)0ƒª CŸYýT$IRÃo» ü^VžA•”ŸA•˜AUˆ¥u³Ù¨_ý\$IR£M¸½þ^VœA•”ŸA•˜AUŽé¶-ÕÏE’$µÚx8[ÞÿÉå÷ °² ª¤ü ª¤À ªrŒ·^Yý\$IRÃu|Nù½¬,ƒ*)?ƒ*)0ƒª£O¯~.’$©áz§¼¸ü^V–A•”ŸA•˜AUŽá•‡U?I’Ôpƒ ÿ¢ü^V–A•”ŸA•˜AUŽÁy¯­~.’$©áFý‡ò{XYUR~UR`U9ý7>’$I×xËeå÷ °² ª¤ü ª¤À ªrtÙ§ú¹H’¤†›n¿¯ü^V–A•”ŸA•˜AU ß2›M§ÕOF’$5\gãwÖß,ÀŠ1¨’ò3¨’3¨Êòè/OH’$=^Ý·þLù½¬ƒ*)?ƒ*)0ƒª,“»¯®~2’$©áúg¿ºü^VŽA•”ŸA•˜AU–ѧU?I’ÔpÃË.¿W€•cP%ågP%fP•exùÆê'#I’ntó9å÷ °r ª¤ü ª¤À ª²ôßóGÕOF’$5Üäó7•ß+ÀÊ1¨’ò3¨’3¨ÊÒ;ù—ªŸŒ$Ij¹ñ`¶¼~ïò›XUR~UR`UY:Gühõ“‘$I×=ê¹å7 °2 ª¤ü ª¤À ªÂ¬ß{6›ŒªŸ$Ij¸Þ;½þfV„A•”ŸA•˜AUžéCŸ©~6’$©áýeù½¬ ƒ*)?ƒ*)0ƒª<ã-—U?I’Ôp£P~¯+àJÊÏ J Ì *Ïèú“«Ÿ$Ij¸ñÖ«Êï`eTIùTITå|h©úÙH’¤†›.ß_~¯+àJÊÏ J Ì *OÓïU?I’ÔxC¾§üföœA•”ŸA•˜AUžÞÛ®úÙH’¤Æ{ô^¨¾Y€=gP%ågP%fP•§sسªŸ$Ij¼þ»ÿ°üföœA•”ŸA•˜AU ¥u³Ù¨Wýt$IRà ¯<¬þfö˜A•”ŸA•˜AU¦É·U?I’Ôpã[Ï-¿W€=gP%ågP%fP•i|ÇEÕOG’$5ÜäÛËï`ÏTIùTITe}ôªŸŽ$Ij¹Éh¶¼á)å7 °g ª¤ü ª¤À ª2 .~}õÓ‘$I×}óO–ß,Àž1¨’ò3¨’3¨ÊÔ?ó·«ŸŽ$Ij¼þ»^U~³{Æ JÊÏ J Ì *“ÃI’$í¨á¥”ß,Àžñ]PÊÏ J Ì *Sçï©~:’$©ñF7]~³{}ÿlÄ IDATÆ JÊÏ J Ì *×´»­úùH’¤†›|þæò{Ø3UR~UR`U¹&÷~´úùH’¤–gËûÿëò›Ø}UR~UR`U¹F7žVý|$IRãu}~ùÍì>ƒ*)?ƒ*)0ƒª\ÃK7T?I’Ôxý3»üfvŸA•”ŸA•˜AU®þ¦ýªŸ$Ij¼Á%û—ß,Àî3¨’ò3¨’3¨ÊÕ}ëÏT?I’Ôx£O½«üfvŸA•”ŸA•˜AU®ÎÁßUý|$IRãM>÷©ò›Ø}UR~UR`UÙ¦/T?!I’ÔrãÁlyýÞå7 °{ ª¤ü ª¤À ª²Mú I’¤Æë³OùÍìƒ*)?ƒ*)0ƒªl£N©~B’$©ñú§¿¼üfvA•”ŸA•˜AU¶Á‡þ¾ú I’¤Æ|h©üfvA•”ŸA•˜AU¶þ»^Uý„$IRãn<½üfvA•”ŸA•˜AU¶îñ?]ý„$IRãM>{cùÍìƒ*)?ƒ*)0ƒªlƒ¾£ú I’¤ÖõgËë÷.¿[€]gP%ågP%fP•oúÅÏU?#I’ÔxÝ£ŸW~³»Î JÊÏ J Ì *ßxëUÕÏH’$5^ï´—•ß,À®3¨’ò3¨’3¨Ê7ºþ¤êg$I’oðÁ¿-¿Y€]gP%ågP%fP•oð¿©~F’$©ñFŸ8µüfvA•”ŸA•˜AU¾þ¿UýŒ$IRãMîûxùÍì:ƒ*)?ƒ*)0ƒª|Ý·üTõ3’$I­7ìΖ×?©ünvA•”ŸA•˜AÕ8à[g³é´ú)I’¤ÆëõÜú»Ø%UR~UR`UóaúȽÕOI’$5^ÿô——ß,À®1¨’ò3¨’3¨šã-—U?%I’ÔxƒKÖ—ß,À®1¨’ò3¨’3¨š£ëÞ^ý”$IRãnÚT~³»Æ JÊÏ J Ì j> .ú«ê§$I’orÿ­å7 °k ª¤ü ª¤À ªæCï´ß¨~J’$©õ&ãÙòO-¿[€gP%ågP%fP5ºÇ>¿ú)I’¤€ºÇí[~·;Ï JÊÏ J Ì jNlxÊ—~uB’$é‰êŸýêú»ØiUR~UR`UócòàÕÏI’$5ÞðªÃËo`çTIùTITÍñ­çU?'I’ÔxãÛ/,¿Y€gP%ågP%fP5?†WVýœ$IRãM¹§üfvžA•”ŸA•˜AÕüè¿ûªŸ“$I ¨sðw—ß-ÀÎ1¨’ò3¨’3¨šÝ·ýlõs’$IõNø…ò»Ø9UR~UR`Uó£³ñ;«Ÿ“$I hpÞŸ”ß-ÀÎ1¨’ò3¨’3¨š/Óí÷U?)I’ÔxÃk/¿Y€cP%ågP%fP5_Æw^Rý¤$IRã·^Y~³;Ç JÊÏ J Ì j¾ ¯=®úII’¤Æ›öš-/­+¿[€3¨’ò3¨’3¨š/ƒóÿ¬úII’¤€:‡ÿPùÝì˜A•”ŸA•˜AÕ|éüËÕOJ’$Ô;åWËï`Ç ª¤ü ª¤À ªæKç°gU?)I’Ðࢿ*¿[€3¨’ò3¨’3¨š?ÓÞÃÕÏJ’$5Þè†SÊo`Ç ª¤ü ª¤À ªæÏäžk«Ÿ•$Ij¼É}/¿Y€3¨’ò3¨’3¨š?£ÿSõ³’$I­7êÏ–×ï]~·OÌ JÊÏ J Ì jþ .þëêg%I’ê³OùÝ<1ƒ*)?ƒ*)0ƒªùÓ;õ¥ÕÏJ’$Ô?ãåw ðÄ ª¤ü ª¤À ªæO÷èçU?+I’ÐðÒÊïà‰TIùTITÍ¡õ{Ïf£~õÓ’$I7¾å=õw ð„ ª¤ü ª¤À ªæÓäó7U?-I’ÔxÓm[Êoà‰TIùTITͧÑM›ªŸ–$Ij½étÖ9èiåw ðø ª¤ü ª¤À ªæÓ𲫟–$I ¨÷öŸ+¿[€ÇgP%ågP%fP5ŸúgýnõÓ’$I Î{mùÝ<>ƒ*)?ƒ*)0ƒªùÔ=nßê§%I’]÷¶ò»x|UR~UR`Usê€oͦ“êç%I’orÏ5õw 𸠪¤ü ª¤À ªæ×ô¡ÏT?/I’ÔzƒåÙòÒ^åw ðØ ª¤ü ª¤À ªæ×øö÷U?/I’P÷èç•ß-Àc3¨’ò3¨’3¨š_ë¯~^’$) þ¯(¿[€ÇfP%ågP%fP5¿úçü÷êç%I’^vPùÝ<6ƒ*)?ƒ*)0ƒªùÕ=þÕÏK’$4¾õ¼ò»xlUR~UR`Us쀧Îf“qõ“$I7}ø®ú»xLUR~UR`Uómò…OW?1I’Pçàï*¿[€ofP%ågP%fP5ßF7ŸSýÄ$IR@½_X~·ßÌ JÊÏ J Ì j¾ /= ú‰I’¤€¼®ün¾™A•”ŸA•˜AÕ|ëŸùÊê'&I’}ìÄò»øfUR~UR`Uó­{ì󫟘$I hrïuåw ðÍ ª¤ü ª¤À ªæÜú½g³Q¿ú™I’¤ÖvgËëŸT»_Ç JÊÏ J Ì jþM>{cõ3“$IuÙ§ün¾žA•”ŸA•˜AÕüÝxZõ3“$Iõßõªò»øzUR~UR`Uóoðÿ[ýÌ$IR@Ã+)¿[€¯gP%ågP%fP5ÿz§¾¤ú™I’¤€Æ·¿¯ün¾žA•”ŸA•˜AÕüëñ£ÕÏL’$4}äÞò»øzUR~UR`U `iÝlÚß^ýÔ$IR@CžQ»ÿŸA•”ŸA•˜AÕb˜ÜsMõS“$IõNúÅò»ø*ƒ*)?ƒ*)0ƒªÅ0ú؉ÕOM’$4¸ð/Êïà« ª¤ü ª¤À ªãG%I’vÔèãÿX~·_eP%ågP%fPµzÿø+ÕOM’$4¹ï†ò»ø*ƒ*)?ƒ*)0ƒªÅÐ9ô™ÕOM’$%4Ì–7<¥üv¾Ì JÊÏ J Ì jqL—ï¯~n’$) îqû–ß-À—TIùTIT-Žñ–˪Ÿ›$I ¨ÿî?,¿[€/3¨’ò3¨’3¨ZÃkÞ\ýÜ$IR@Ã[~·_fP%ågP%fPµ8ú羦ú¹I’¤€Æ[¯*¿[€/3¨’ò3¨’3¨Z½~¾ú¹I’¤€¦ƒ/Ζ—ö*¿]ƒ*i2¨’3¨ZOŸÍ¦Óê''I’êõÜòÛ0¨’æ!ƒ*)0ƒªÅ2}ø®ê''I’êŸùÊò»0¨’æ!ƒ*)0ƒªÅ2¾íüê''I’^qHùÝTIóA•˜AÕb^¾±úÉI’¤€ÆŸ~ùÝTIóA•˜AÕbéŸùÛÕON’$4]þ|ùÝTIóA•˜AÕbéý¼ê''I’BêúÌòÛA•”ŸA•˜AÕ‚YÚk6,W?;I’Pï”×ß.°à ª¤ü ª¤À ªÏäžk«Ÿ$I hðÁ¿-¿[`ÑTIùTIT-žÑuo¯~v’$) Ñ§Î*¿[`ÑTIùTIT-žÁùZýì$IR@“ï(¿[`ÑTIùTIT-žÞ ?_ýì$IRBÓ鬳ѭ• ª¤ü ª¤À ªOç §}é©$IÒŽêð å· ,2ƒ*)?ƒ*)0ƒªÅ4ݶ¥úéI’¤€ïûóò»™A•”ŸA•˜AÕbßòÞê§'I’]rù݋̠JÊÏ J Ì j1 /= úéI’¤€&÷ÝP~·À"3¨’ò3¨’3¨ZLýÓ_^ýô$IRBãÁlyÃSÊoXTUR~UR`U‹©{äsªŸž$I ©{Ü¾å· ,*ƒ*)?ƒ*)0ƒªµ´n6í?Rýü$IR@ýwÿAýí Ê JÊÏ J Ì jqïÚ\ýü$IR@Ã[~·À¢2¨’ò3¨’3¨Z\Ãk¯~~’$) ñÖ«ÊïXTUR~UR`U‹«îkªŸŸ$I hÚß>[^Ú«üv€EdP%ågP%fPµ¸ºoûÕÏO’$…Ô=ê¹å· ,"ƒ*)?ƒ*)0ƒªvà·ÍfÓIõ”$IõÏ|eýí È JÊÏ J Ì j±M¼£ú J’¤€†WZ~·À"2¨’ò3¨’3¨Zl£›Î®~‚’$) ñ?°ün€EdP%ågP%fPµØ—¬¯~‚’$) iwÛlyi]ùí‹Æ JÊÏ J Ì j±õNûê'(I’Bê¼éGÊoX4UR~UR`U‹íÑ£’$I;SÿŒß*¿]`ÑTIùTIT-¸¥u³iï¡êg(I’^~pýí Æ JÊÏ J Ì Šñg®¨~†’$) ñ•ß-°h ª¤ü ª¤À ªn>ªúJ’¤€¦ÊïX4UR~UR`UôÏ~uõ3”$I!uÞøìòÛ‰A•”ŸA•˜AÝ7ÿdõ3”$I!õN{Yùí‹Ä JÊÏ J Ì Šåõ{Ïf£^õS”$I /;°þv€bP%ågP%fPÅ£&÷~´ú)J’¤€Æ·]P~·À"1¨’ò3¨’3¨âQ£ëÞVý%IR@Ó/~®ün€EbP%ågP%fPÅ£ú羦ú)J’¤:‡=«üv€EaP%ågP%fPÅ£ºoý÷ÕOQ’$…Ô{篗ß.°( ª¤ü ª¤À ªø’ž:›MFÕÏQ’$4¸dÿúÛ„A•”ŸA•˜A_1ùüMÕÏQ’$4¾õÜò»…A•”ŸA•˜A_1ºáÕÏQ’$4}äÞò»…A•”ŸA•˜A_1¸ðU?GI’RçÐg–ß.° ª¤ü ª¤À ªøŠÞI/ª~Ž’$)¤Þ)/.¿]`TIùTITñOŸÍ¦Óê')I’|èïËoXUR~UR`U|­é¶;«Ÿ¤$I h|ó»ËïXUR~UR`U|­ÑMgW?II’Ðô¡­åw ,ƒ*)?ƒ*)0ƒ*¾ÖàƒWý$%IRH7|oùíóΠJÊÏ J Ì Š¯Õ{ǯU?II’RïŸþKùíóΠJÊÏ J Ì Š¯Õ9ôû«Ÿ¤$I ið¿)¿]`ÞTIùTITñ¦_ülõ³”$InÚT~·À¼3¨’ò3¨’3¨âo_õ³”$IM·ÝY~·À¼3¨’ò3¨’3¨â /ßXý,%IRBÓé¬sðw—ß.0Ï ª¤ü ª¤À ªøFý3~«úYJ’¤z'ÿrùíóÌ JÊÏ J Ì ŠoÔ9âǪŸ¥$I ipñ_—ß.0Ï ª¤ü ª¤À ªø&KëfÓî¶ê§)I’}ê¬úÛæ˜A•”ŸA•˜Ae¼å²ê§)I’šnÛR~·À<3¨’ò3¨’3¨â± 7Yý4%IRHCžQ~»À¼2¨’ò3¨’3¨â±ô7íWý4%IRH½S~µüv€yeP%ågP%fPÅcé³OõÓ”$I! >ô÷å· Ì+ƒ*)?ƒ*)0ƒ*ÓÒ^³i{õó”$IoyOýísÊ JÊÏ J Ì ŠÇ3Þzeõó”$IM¹§ün€yeP%ågP%fPÅãn>²úyJ’¤:‡ý@ùíóÈ JÊÏ J Ì ŠÇÓß´_õó”$I!õN}IùíóÈ JÊÏ J Ì ŠÇÓ=fŸêç)I’B^º¡üv€ydP%ågP%fPÅãZÚk6ío¯~¢’$) ñmÔß.0‡ ª¤ü ª¤À ªx"ã­WV?QI’Ðtùþò»æ‘A•”ŸA•˜AOd¸ùÈê'*I’Bê¼ñÙå· Ìƒ*)?ƒ*)0ƒ*žHÓ~ÕOT’$…Ô;ý7Ëo˜7UR~UR`U<‘î1ûT?QI’ÒðòƒËo˜7UR~UR`U<¡¥½fÓþöêg*I’ßqqýísÆ JÊÏ J Ì Šo½²ú™J’¤€¦ÝgËKëÊo˜'UR~UR`UìÈpó‘ÕÏT’$…Ô9âÇÊo˜'UR~UR`UìHÓ~ÕÏT’$…Ô?ó•å· Ìƒ*)?ƒ*)0ƒ*v¤{Ì>ÕÏT’$…4¼êðòÛæ‰A•”ŸA•˜A;´´×lÚß^ýT%IR@ã-—Öß.0G ª¤ü ª¤À ªØã­WV?UI’дÿÈ—ÆØÕ· Ì ƒ*)?ƒ*)0ƒ*vÆpó‘ÕOU’$…Ô=úÇËo˜UR~UR`UìŒþ¦ýªŸª$I éÑ»¡úv€yaP%ågP%fPÅÎè³OõS•$I! 7U~»À¼0¨’ò3¨’3¨b§,í5›ö·W?WI’ÐxëUõ· Ì ƒ*)?ƒ*)0ƒ*vÖxë•ÕÏU’$%4ìÌ–×ï]~»À<0¨’ò3¨’3¨bg 7Yý\%IRHÝ7ÿDùíóÀ JÊÏ J Ì ŠÕß´_õs•$I!õÏùå· Ìƒ*)?ƒ*)0ƒ*vV÷˜}ªŸ«$I ixÍ[Êo˜UR~UR`Uì´¥½fÓþöê'+I’šÜsMýísÀ JÊÏ J Ì Š]1þÌÕOV’$%4êÏ–7<¥üv€tUR~UR`UìŠá‡ßTýd%IRHÝã_P~»@:ƒ*)?ƒ*)0ƒ*vEÿ]¯ª~²’$)¤ÁyR~»@:ƒ*)?ƒ*)0ƒ*vE÷ÈçT?YI’Òèú“ËoHgP%ågP%fPÅ.YZ7›v¾Pýl%IR@“ÏßT»@8ƒ*)?ƒ*)0ƒ*vÕøŽ‹«Ÿ­$IJh:™uzZùíÉ ª¤ü ª¤À ªØUÃË7V?[I’R洛ß.Ì JÊÏ J Ì Š]Õ;íeÕÏV’$…4¸øõå· $3¨’ò3¨’3¨bWuÿÁêg+I’BÝ´©üv€dUR~UR`UìŽéö©~º’$) éÃw•ß-Ì JÊÏ J Ì ŠÝ1¾õÜê§+I’Bêöå· ¤2¨’ò3¨’3¨bw >´Týt%IRH½S_R~»@*ƒ*)?ƒ*)0ƒ*vGï”_­~º’$)¤áe–ß.Ê JÊÏ J Ì ŠÝÑ9ø»g³é´úùJ’¤€Æw\T~»@*ƒ*)?ƒ*)0ƒ*v×tÛ–êç+I’švœ-/­+¿] ‘A•”ŸA•˜A»kô©wU?_I’R÷ÈS~»@"ƒ*)?ƒ*)0ƒ*v×ࢿª~¾’$)¤þY¿[~»@"ƒ*)?ƒ*)0ƒ*vWï¤U?_I’ÒpóQå· $2¨’ò3¨’3¨bwuúŽÙl:©~Â’$) ñ]›ËoHdP%ågP%fPÅž˜ÜKõ–$I »³åýŸ\~»@ƒ*)?ƒ*)0ƒ*öÄè†wT?aI’R÷¸}ËoHcP%ågP%fPÅž\ðºê',I’BêŸûÇå· ¤1¨’ò3¨’3¨bOtßö³ÕOX’$…4úØ‰å· ¤1¨’ò3¨’3¨blø–Ùl<¬~Æ’$) Égo¬¿] ŒA•”ŸA•˜A{jrß ÕÏX’$%4Ï:~{ùíI ª¤ü ª¤À ªØS£ëÞ^ýŒ%IRH½_X~»@ƒ*)?ƒ*)0ƒ*öTÿ½ÿ³úK’¤ïÿ?å· $1¨’ò3¨’3¨bOuÛ·úK’¤FŸ<³üv€$UR~UR`Uì±ýŸ<› »ÕOY’$4ݶ¥þv€ UR~UR`U¬„ñ]›«Ÿ²$I ©ó†ï+¿] …A•”ŸA•˜A+a¸ù¨ê§,I’Bê½ó¿•ß. JÊÏ J Ì Š•Ð?ëwªŸ²$I ixé†òÛRTIùTIT±ºG>§ú)K’¤Æ·¿¯üv€UR~UR`U¬ˆ¥u³içêç,I’šv¾ð¥Û¡ü~€UR~UR`U¬”ñíV?gI’Rçˆ+¿] A•”ŸA•˜A+exé†êç,I’BêŸõ;å· $0¨’ò3¨’3¨b¥ôÞñkÕÏY’$…4¼úèòÛTIùTIT±R:‡<£ú9K’¤&w¤üv€UR~UR`U¬¤é¶;«Ÿ´$IJhÔŸ-oxJùí­3¨’ò3¨’3¨b%>yFõ“–$I!uÿáß•ß.Ð:ƒ*)?ƒ*)0ƒ*VÒàýÿ»úIK’¤¼®üv€ÖTIùTIT±’z'ü|õ“–$I!>qjùí­3¨’ò3¨’3¨bEðÔÙl<¬~Ö’$) ÉƒwÔß.Ð8ƒ*)?ƒ*)0ƒ*VÚ侪Ÿµ$IJh:uyFùí-3¨’ò3¨’3¨b¥>úÖêg-I’BêòâòÛZfP%ågP%fPÅJë¿çªŸµ$I ixé†òÛZfP%ågP%fPÅJë¾ù'«Ÿµ$I iüé÷—ß.Ð2ƒ*)?ƒ*)0ƒ*VÜÒ^³i{õÓ–$IM{Í–—ÖÕß/Ð(ƒ*)?ƒ*)0ƒ*VÃø3—W?mI’R÷èç•ß.Ð*ƒ*)?ƒ*)0ƒ*VÃðªÃ«Ÿ¶$I ©öï—ß.Ð*ƒ*)?ƒ*)0ƒ*VCÿŒWT?mI’Òðš·”ß.Ð*ƒ*)?ƒ*)0ƒ*VCç?\ý´%IRH“{¯+¿] UUR~UR`U¬–éöûªŸ÷ÿcïÞ£í¾ËûÎã[ZšÑ4é¤“Õ k&CfMH“T ¬®¸¤ˆX3d¦Ô”@HW+[’/â*dc,¹ØÈ²ƒ/±Â6 |‘¾"c ø&Ûø"ßϾïýûÎ:GÓ!€Ù:G:g?ûùí×{­×ÿ`ö÷œçˆuŠ$IJP¿[¦O}IøíãÈ JÊŸA•”0ƒ*KÿUÑoI’”¤æ¦7†ß.0Ž ª¤üTI 3¨b±t¾ü_¢?Þ’$)I/üÇðÛÆ‘A•”?ƒ*)aU,–Ö§'úã-I’’Ô»ë’ðÛÆ‘A•”?ƒ*)aU,–ƺW”R ¢?â’$)AÕ3÷‡ß.0Ž ª¤üTI 3¨b1 žøvôG\’$%©qæÏ‡ß.0n ª¤üTI 3¨b1õö\ý—$IIj]ôá· Œƒ*)UR ªXLÏ¿'ú#.I’’Ô½~]øíãÆ JÊŸA•”0ƒ*SóÜ߈þˆK’¤$õïùRøíãÆ JÊŸA•”0ƒ*Õ)/.¥×Žþ˜K’¤UíçÊôªcãï#URþ ª¤„T±Øß»5úc.I’’Ôܸ4üv€qbP%åÏ JJ˜A‹­{óYÑsI’”¤öï ¿]`œTIù3¨’fPÅbko{GôÇ\’$%©wë¹á· Œƒ*)UR ªXlÍÿ÷ÑsI’”¤Á#{Âo”Æ! IDAT'URþ ª¤„T±èVSªÖ3ÑuI’”¡A¿L¯91þ~€1aP%åÏ JJ˜A£Ð¿çKÑuI’”¤Öyo ¿]`\TIù3¨’fPÅ(t¯?-ú£.I’’Ô¹æýá· Œ ƒ*)UR ª…ÖÅoþ¨K’¤$õ¿yEøíã JÊŸA•”0ƒ*F¡qæ«¢?ê’$)IÕó…ß.0. ª¤üTI 3¨bTªgŒþ¸K’¤$5>üKá· Œƒ*)UR ª•Þ¾mÑwI’”¤ö¥~»À80¨’ògP%%Ì ŠQé\ûè»$IJRw÷†ðÛÆA•”?ƒ*)aUŒJëS¿ýq—$IIý\$IR¢š—†ß/p´ ª¤üTI 3¨"‹Þ¾Ë£Ÿ‹$IJTûª? ¿_àhTIù3¨’fPEkÞý\$IR¢z{. ¿_àhTIù3¨’fPE­ÿú¿F?I’”¨ê™ûÃï8ZURþ ª¤„T‘Æ©/-eЋ~2’$)Qý£øŽ‚A•”?ƒ*)aUd2xôÎè'#I’Õ¾ôÃï8URþ ª¤„T‘Iï¶MÑOF’$%ª{óÙá÷  ƒ*)UR ªÈ¤}Å»¢ŸŒ$IJÔÌßn}¿ÀÑ0¨’ògP%%Ì ŠLš_ýd$IR¦ªAi¬{Eø GÊ JÊŸA•”0ƒ*RYul©ÚÏE?I’”¨Ö–ß‹¿aàTIù3¨’fPE6ý{wF?I’”¨îõ§…ß/p¤ ª¤üTI 3¨"›î gD?I’”¨þý7„ß/p¤ ª¤üTI 3¨"›ÖÅo‹~6’$)S½v™>å§Ão8URþ ª¤„T‘Mcý’èg#I’’ÕÚ¼,ü†€#aP%åÏ JJ˜AUÏ>ýt$IR¢:_üëðûŽ„A•”?ƒ*)aUdÔÛwyôÓ‘$I‰êç á÷  ƒ*)UR ªÈ¨sÍû¢ŸŽ$IJTÕ~®L¯>.ü†€ù2¨’ògP%%Ì ŠŒZç½)úéH’¤d5ÏyCø óeP%åÏ JJ˜A)úÒR½èç#I’Õ¹ú½ñ7 Ì“A•”?ƒ*)aUd5xôÎèç#I’ÕÿÖ߆ß/0_URþ ª¤„T‘Uï¶MÑÏG’$%ªj>U¦W~ÃÀ|TIù3¨’fPEVí+Þý|$IR²šg½>ü†€ù0¨’ògP%%Ì Š¬š_ý|$IR²:ŸûóðæÃ JÊŸA•”0ƒ*ÒZul©ÚÏE?!I’”¨Þ]—Äß00URþ ª¤„T‘YÿÞÑOH’$%ªzþÑðûæÃ JÊŸA•”0ƒ*2ëÞpzô’$IÉjnø'á7 Ì•A•”?ƒ*)aUdÖºømÑOH’$%«ý·ÿGø seP%åÏ JJ˜A™5Ö/‰~B’$)Y½=†ß00WURþ ª¤„T‘]õìƒÑÏH’$%jævˆ¾_`® ª¤üTI 3¨"»Þ¾Ë£Ÿ‘$IJVãÿ~ÃÀ\TIù3¨’fPEvkÞýŒ$IR²ÚÛV„ß00URþ ª¤„T‘]ë¼7E?#I’”¬Þíç…ß00URþ ª¤„T‘Þ©/-eЋ~J’$)Qƒ'¾ÃÀTIù3¨’fPE Ùý”$IR²ë_~ÃÀáTIù3¨’fPEôn=7ú)I’¤dµ/}{ø ‡cP%åÏ JJ˜Auоâ]ÑOI’$%«{óÙá7 ŽA•”?ƒ*)aUÔAsã뢟’$IJÖà±½á7 ŽA•”?ƒ*)aUÔªcKÕ~.ú9I’¤LUUiœþâï€(kNŒÿÏÀaTIù3¨’fPE]ôïÝýœ$IR²Z¿-ü†‰ÕÇ—æÆ¥¥½mEéݶ© î+Õ³Æÿçâ° ª¤üTI 3¨¢.º7œýœ$IR²º_ýhø °ë—”ö%'—îî ¥`W)ÝæýÙHÕ|*ü?'‡gP%åÏ JJ˜AuѺø­ÑÏI’$%kððíá7 ÀBŒ§Z[——ÎΩÒß¿½T'çö‡#ÝFøvÏ JÊŸA•”0ƒ*êôÂ$IÒ¼ôKc{È£±ö¤ÒúÔo•Îÿºô¿yE©ž{èÈÿl¤”éUÇ„ÿwb8ƒ*)UR ª¨“êÙ¢Ÿ”$IJÖÌ¿½}ü ÕÇ—æÆ¥¥½mÅì¯î›ùÛ¶gFP Ùô)/ŽÿïÉPURþ ª¤„TQ'½}—G?)I’”¬îM ¿aþî¯îëÞxféØUJ·¹è6âoïURþ ª¤„TQ'kÞý¤$IR²ß~Ó§qæ«fÇSS¥¿{©O„üÙÈÌŽè gP%åÏ JJ˜AuÒ:ïMÑOJ’$e«”Æé¯ ¿c€új¬yYim^V:;V–Þž-epp_—þÇáÿ|ΠJÊŸA•”0ƒ*jåÔ—–2èE?+I’”¬ÖÅo¿c€zX}|in\ZÚÛV”îî eððí¥ úe\k~üµñÿÌÊ JÊŸA•”0ƒ*êfðÈžèg%I’’ÕýêÇÂo §Æú%³¿º¯{㙥`W)ÝfÉTóœ_ÿgÈpURþ ª¤„TQ7½[Ï~V’$)YƒGï ¿a€ñ×X÷ŠÒºàÍ¥³sªô÷o/Õôã%{ÍÍÿ<üŸ+ÃTIù3¨’fPEÝ´¯xgô³’$IÙªªÒ8ý„ß1ÀYsbim^V:;V–Þž-eppßìŸ!Ô­Öù¿ÿÏš¡ ª¤üTI 3¨¢nš_ý¬$IRÂÚó¯Ãï ÈêãJsãÒÒÞ¶¢two8ô«ûú2 µ¶þ«øþ eP%åÏ JJ˜Aµ³êØRµŸ‹~Z’$)YݯmŒ¿c€‘h¬_RZ[—úÕ}÷|©”n£LjíÏüQøÿ gP%åÏ JJ˜AuÔ¿wgôÓ’$IÉ<¶7ü†^cÝÏúÕ}×~ ô÷o/ÕôÁè?†«Ú—ÿIøÿF gP%åÏ JJ˜AuÔ½áôè§%I’²UU¥qÆÏ…ß1ÀQXsâ¡ñÔŽ•¥·gKÜ7û3¿~rí+ÿÏøÿÝÊ JÊŸA•”0ƒ*ê¨uñ[£Ÿ–$IJ˜¿âY}\in\ZÚÛV”îî ¥`W)ýNô/¤«óù÷ÄÿoÉPURþ ª¤„TQG3_ý´$IRº·|"üŽ^Xcý’ÒÚº¼tvN•þ=_*¥3ýG µ¨sí_…ÿoËpURþ ª¤„TQWÕ³D?/I’”¬ÁÁo†ß0À‹JcÝÏúÕ}×~ ô÷o/ÕôÁè?6¨m«Ãÿ÷f8ƒ*)UR ª¨«ÞÞË¢Ÿ—$IÊVUÍþM—Ñw L”©Jóœ7”ÎŽ•¥·gKÜ7û3ºFS÷†3â? eP%åÏ JJ˜AuÕ¹æ}ÑÏK’$%¬}éÛÃ鶴ÕÇ•æÆ¥¥½mEéîÞPúv•ÒkGÿqÀD×ýêÇâ? eP%åÏ JJ˜AuÕ:ïMÑÏK’$%¬wë'Ã廓Æú%¥µuyéìœ:ô«ûšOGÿ诩wë¹áŸ†3¨’ògP%%Ì ŠÚ:õ¥¥ zÑOL’$%kðÄ·ãïH¨±ö¤ÒÚ¼ìЯîÛ{Y©ž,úÇ|Í¡Þ×?þÙa8ƒ*)UR ª¨³Á#{¢Ÿ˜$IJXcý«ÃïkS'úÕ}W¾»ôöl)ƒƒûJ©ªèéuõö^ÿyb(ƒ*)UR ª¨³™¿¦V’$i¾µ/ûwáw ŒÕÇ•æY¯/í+ÞYz·~² ùz)ýnôïZ úû¯ŠÿŒ1”A•”?ƒ*)aUÔÙÌw’$Ió­wÛæð;¢4Ö/)­­ËKgçTéïß^ªæÓÑ?ªkëgGøgŽá ª¤üTI 3¨¢ÎfþºaI’¤ù6xò»áw ŒBcíI¥µyYéìXYz{/+ÕóFÿX®׿ûšðÏ!ÃTIù3¨’fPE­­:¶T­g£Ÿ™$IJXãC¿ËÀBš:aö_Dn_ùîÒÛ³¥ î+¥Dÿ®àú÷|)þ³ÉPURþ ª¤„TQwý{¿ýÌ$IRÂÚÛV„ß1pÄV{h<õÙ?-Ý[Î)ƒ‡o/¥ßþq[cXÿ¾¯Ä^Ê JÊŸA•”0ƒ*ê®{ÃéÑÏL’$%¬wÇùáw ÌUcý’ÒÚº¼tvN•þþí¥j>ý£µ’Ô¿ÿ†ðÏ/ÃTIù3¨’fPEݵ.~kô3“$I «ž} üŽ€ÒXûòÒÚ¼¬tv¬œýÕ}ÕÓ÷Eÿ­Äõ¸)ü3ÍpURþ ª¤„TQw3_ýÌ$IRÒšý•ð[€ ·úøC¿ºoÛŠÒ»mSÜWJ5ˆþ‘Y5jðà×â?ç eP%åÏ JJ˜A“`æo˜$Išoí«þ,üŽ`ò~u_û’“Kw÷†Ò?°«”^+úÇcÕ¼Á÷n ÿÜ3œA•”?ƒ*)aUL‚ÞÞË¢Ÿš$IJØÌ }ÇPïñTkëòÒÙ9Uúû·—ªñdôšÀßþΠJÊŸA•”0ƒ*&Aç꿌~j’$)a3=½êØð[€ük_^Z›—•ÎŽ•¥·gK©ž¾7úÇ^i¶Á£ß gP%åÏ JJ˜A“ uÞoF?5I’”´æ'þYø-@2«/ÍKK{ÛŠÒ»mSÜWJ5ˆþWzÁf>Ÿáo†¡ ª¤üTI 3¨b"œú’RúÝèç&I’6ó7]†ß2Œý¯îk_rréîÞPúv•ÒmFÿ8+͹ÁãûÃßÃTIù3¨’fPŤ<²'ú¹I’¤„õ¿ó…ð;€ñOµ¶./S¥¿{©ODÿè*Uƒ'¿þ®ΠJÊŸA•”0ƒ*&EïÖs£Ÿ›$IÊXgºLOýTø-Àè5Ö¼¬´6/++KoÏ–C¿ºOªYÕÓ÷†¿5†3¨’ògP%%Ì ŠIѾâÑÏM’$%­uÞ›ÂoÙêãKsãÒÒÞ¶böW÷ ¾½”jý#©´èUψ eP%åÏ JJ˜A“bæaI’¤#©û•SÂoçW÷uo<³ôì*¥ÛŒþñS ©zî¡ð÷ÈpURþ ª¤„T11VSªÖ3ÑON’$%læÖÃoŽXcÝ+Jë‚7—ÎΩÒß¿½T'¢ԔƦêû„¿Q†3¨’ògP%%Ì ŠIÒ¿÷ËÑON’$e¬ß-5/ ¿e8¼™ŸßZ›—•ÎŽ•¥·gKÜýS¥4ÖUÓÃß-ÃTIù3¨’fPÅ$é^Zô““$IIkmù½ð[€±úøÒܸ´´·­(ÝÝÊàáÛKô£„”RU5žŒË eP%åÏ JJ˜A“¤uñ[£Ÿœ$IJZ÷¦‡ß2“®±~Iim]^º7ž9ûëÙK·ý㢔¾ªõLøÛf8ƒ*)UR ª˜$3~.úÉI’¤¤ Ù~ËL’ƺW”Öo.S¥¿{©¦þÑPªeUûûáïá ª¤üTI 3¨bÒTÏ>ýì$IRƪª4ÎøÙð[ –ÖœXZ›—•ÎŽ•¥·gKÜ7ûs˜¤ÔmÆ `(ƒ*)UR ª˜4½½—E?;I’”´ö%'‡ß2é­>®47.-ím+Jw÷†C¿º¯ß‰þ‘OšÜúø¯ eP%åÏ JJ˜A“¦sõ_F?;I’”´Þ­ç†ß2Ù4>òšÒ¾ìß–îW?ZúÜTJ·ý㤿۠þu‚á ª¤üTI 3¨bÒ´ÎûÍèg'I’’6xêîð[`œ5ÖýÌ¡_ÝwíJÿöRMŒþQNÒáô¿v0œA•”?ƒ*)aULœS_:ûÃ$IÒ‘Ôøð/Åß3ã`͉³ÿkçê÷–Þ]—”êéû¢d“t$ù•cÏ JÊŸA•”0ƒ*&Ñàá;¢Ÿž$IJZûŠw†ß2#·ú¸Òܸ´´·­(ÝÝJÿÀ®Ù†¤ÔmÆa(ƒ*)UR ª˜DÝ[>ýô$IRÒzw^~Ë,¶Æú%¥µuyéìœ:ô«ûZÏDÿ8&i‘ª:χÍa8ƒ*)UR ª˜D3ÿ•$IÒ‘T=ÿh™^uLø=°P§¿²´¶üÞ¡ñÔ·?_ªéÇ£ô’4ªösá_‡ΠJÊŸA•”0ƒ*&Qóc¿ýô$IRâšgÿZø=pD¦N(ÍsÞP:;V–Þž-epp_)Uýc–¤ÀªæÓñ_›Ê JÊŸA•”0ƒ*&Òªcü[V’$éˆë\ó¾ø{àpVWš—ÎþýÝÝJÿÀ®Rzíè©$YUãÉø¯W eP%åÏ JJ˜A“ªÿíÏE??I’”´þÝ׆ß2?ª±~Iim]~èW÷íß>û·ÎHÒ᪦†ýb8ƒ*)UR ª˜T/ýçèç'I’²Ök•éS_~Ï“«±ö¤ÒÚ¼ìЯîÛ{Y©ž,ú'%II«¾ÿHø×4†3¨’ògP%%Ì ŠIÕ:ÿ·£ŸŸ$IJ\ë‚·„ß3À„˜:áЯî»òÝ¥·gKÜWJUEÿX$©&UÏ}/þëCTIù3¨’fPŤj¬}y)ƒ~ô”$IIëîú`ø=ÔSã#¯)ím+Jw÷†Ò?°«”^;úG I5®zöð¯{ gP%åÏ JJ˜A“lðØ]ÑOP’$%mðèá· _cý’ÒÚº¼tvN•þþí¥j>ý㎤ «zú¾ð¯… gP%åÏ JJ˜A“¬wÛ¦è'(I’²VU³ÿÇGô=äÑX{Rim^V:;VÎþê¾ê™û£²‘¤2xêžð¯ gP%åÏ JJ˜A“¬}Å;£Ÿ $IJÜÌ¯àˆ¾g€15uBin\ZÚW¾{v<58¸¯”jýcŒ$ýXƒ'¾ÿ5“¡ ª¤üTI 3¨b’5?þÚèŒAÑ{ IDAT'(I’×Ûsaø=Œ‡ÆG^3û/]two(ý»Jéµ¢d‘¤95xü[á_CΠJÊŸA•”0ƒ*&ÚªcJÕ|:úJ’¤¤UÏ?6{O„ß4ÀHÍüúïÖÖ女sªô÷o/Uó©èO$鈛ùô¢¿®2œA•”?ƒ*)aULºþÝ×D?CI’”¸æÙ¿~Ï‹§±ö奵yYéìX9û«ûª§ï‹þ1D’´Á£ßÿZËpURþ ª¤„T1éfþ-2I’¤#­sÍûÂï`¬>¾47.ýÕ}½Û6Íþ­-¥DÿØ!I‹Úà‘=ñ_Ê JÊŸA•”0ƒ*&]ëÓÿ2úJ’¤Äõï¾6üžŽüW÷µ/9¹two(ý»Jéµ¢Ĥ‘7xøöð¯Ç gP%åÏ JJ˜A“®±îþ-3I’täõZeúÔ—„ß4ÀáÇS­­ËgÿÆúþþí¥j<ýÓ„$Eƒ‡n ÿÍpURþ ª¤„TÁ‹ÊàñoE?EI’”¸Öo ¿g€h¬yYim^V:;V–Þž-‡~uŸ$é<øµð¯Û gP%åÏ JJ˜A¼¨ôî8?ú)J’¤Äuw}0üž€‰µúøÒܸ´´·­˜ýÕ}3¿ºÊßH/Is¯ÿÀMñ_ËÊ JÊŸA•”0ƒ*xQi_ùîè§(I’7xôÎð{&éW÷µ/9yv<Õ?°«”n3úGIJ]ÿþ¿¶3œA•”?ƒ*)aUð¢Ò<ëˆ~Š’$)sUUg¾*ü¦€:ާZýaé^¿®ôïùb©ZÏD_ÿ’T»ú÷]þõžá ª¤üTI 3¨‚•éUÇ–ªý\ôs”$I‰›ùõ"á7 $ÖXó²ÒÚ¼¬tv¬,½=[Êàà¾è3_’&¢þÝ׆`8ƒ*)UR ªàþ½_Ž~Ž’$)q½=†ß3ÆêãKsãÒÙ1aæW÷ ¾½”j}ÖKÒDÖÿÖ•ñßÊ JÊŸA•”0ƒ*8dæ¯ —$I:Òªç+Ó«Ž ¿i`lußÖå¥{㙥`W)Ýfô /IúÿêÝuIø÷ †3¨’ògP%%Ì  ™ùI’¤£©ù‰~Ó@´Æ™?_ZýAé^·¦ôᆭTͧ£OuIÒz_ÿtø÷†3¨’ògP%%Ì  iœþÊRª*úIJ’¤Äu¾ø×á7 ŒÔšKkó²ÒÙ±²ôöl)ƒƒûü›$%«wë'㿟0”A•”?ƒ*)aUðƒ'¿ý$%IRâú÷_~ÏÀ¢Y}|in\ZÚÛV”îî ‡~u_¿}†K’޲îW?ÿ=†¡ ª¤üTI 3¨‚èí¹0úIJ’¤Ì z¥±Î} @=4Ö/)­­ËKgçTéßó¥Rºè‹[’´uo8#ü{ÃTIù3¨’fP?ÐÙþ¤$IJ^ûoþuøMó5ó/´.xó¡ñÔþí¥š~<ú´–$¨™¯ýÑ߇ΠJÊŸA•”0ƒ*øæ9¿ý$%IRòz·m¿i`¨5'–Öæe¥³ceéíÙR÷•RUѧ´$)¨ÎµˆÿÞÄPURþ ª¤„TÁß±úøRuž~–’$)qÕs•éUÇÄß50cõq¥¹qiio[Qº»7”þ]¥ô;Ñg³$iŒš؆¿b(ƒ*)UR ªà‡õï¿>úYJ’¤ä5Ïz}øMÀdj¬_RZ[—úÕ}÷|©”n#ú<–$yí+ßþý‹á ª¤üTI 3¨‚Ö½ñÌèg)I’’×¹æýá7 õ×X÷3‡~ußµ(ýýÛK5}0ú–$%¬½íáßÓΠJÊŸA•”0ƒ*øa­‹ßý,%IRòú÷î ¿i¨™©Jóœ7ÌþZ¦Þž-epp_)U}úJ’jPû’“ã¿Ï1”A•”?ƒ*)aUðÃgü\ô³”$IÙëwJcíËÃï’Z}\in\ZÚÛV”îî ¥`W)½vô•+Iªi­‹þ þ{CTIù3¨’fP?®zæþè§)I’’׺ø­á7 94Ö/)­­ËKgçÔ¡_Ý×z&úœ•$MP­ Þþ½á ª¤üTI 3¨‚×ûÆßD?MI’”¼Þ­Ÿ ¿i?µ'•Öæe‡~ußÞËJõücѧ«$iÂk÷›áßΠJÊŸA•”0ƒ*øqÿ!úiJ’¤äUÏ>~Ólê„Ò<ç ‡ÆS{¶”ÁÁ}¥TUô©*IÒ53Ö ÿžÉPURþ ª¤„TÁkžû?G?MI’Tƒšmø]Àˆ¬>®47.-ím+Jw÷†Ò?°«”^;ú$•$é°5Ïz}ü÷Q†2¨’ògP%%Ì  ^ÀÔ ¥t›ÑÏS’$%¯sõ{ãïEcý’ÒÚº¼tvN•þþí¥j>}~J’tD5?úËáßWΠJÊŸA•”0ƒ*xaý¾ý<%IRòú÷|1ü¦àè5ÖžTZ›—úÕ}{/+ÕóFŸš’$-XþÃðïµ gP%åÏ JJ˜A¼°îMŽ~ž’$){½vi¬yYø]À}.J’Þôêã¿G3œA•”?ƒ*)aUð“UÏ=ýD%IRòª§ï ¿i&QcÝ+Jë‚·”Ηþsé↑Tß$ú4”$iüêw¿gsxURþ ª¤„TÁOÖÛ{iô•$I5¨¹áŸ†ß5µvÊ‹KóÜß(Ï¿§ôîÜZO|»”ªŠ>%IûªÆñßÇ9,ƒ*)UR ªà'ëìXýD%IR ê\ý—áw @4>òšÒÞ¶¢two(ý»Jéµ¢O>I’RV=}oø÷uÏ JÊŸA•”0ƒ*øÉšç¼!ú‰J’¤Ô¿ï+áw @VõKJkëòÒÙ9Uúû·—ªñdôy'IRm<òõðïõžA•”?ƒ*)aU0ÄêãKÕy>ú™J’¤ì z¥±îñ· À˜k¬}yim^6û·†÷öl™ý[3$IÒâÕ¿ÿúðïÿžA•”?ƒ*)aU0\ÿÞÑÏT’$Õ ö¥o¿kÆÊêãKsãÒÙ_Ý×»mSÜWJ5ˆ>Û$Iš¨fþöÇð›€Ã2¨’ògP%%Ì  †ë^·&ú™J’¤ÔÛsaø]ý«ûÚ—œ\º»7”þ]¥t›Ñ'š$I_ï΋ÂoÏ JÊŸA•”0ƒ*®µåw£Ÿ©$IªAUó©2½ú¸ðÛ`Tã©ÖÖ女sjöo¾¨OFŸc’$éêÞò‰ð»Ã3¨’ògP%%Ì  †k¬=©”A?ú©J’¤ÔÚ¼,ü¶Xh5/›½s:;V–Þž-‡~uŸ$IJQ÷†3Âo Ï JÊŸA•”0ƒ*8¼ÁcwE?UI’Tƒº7œ~וÕÇ—æÆ¥¥½mÅì¯î<|{)Õ úÌ’$IGXç‹ÿ)þ¾à° ª¤üTI 3¨‚ÃëÝúÉè§*I’jÐà±½áw À‘üê¾îg–þ]¥t›Ñ'•$IZÀ:Ÿûóð{ƒÃ3¨’ògP%%Ì  ¯}ùŸD?UI’T“þÇá· À iœñ³¥uÑ–îukKÿîkKÕz&út’$I‹ÜÌß:}ƒpxURþ ª¤„TÁá5>òßE?UI’T“:ŸûÂo€Ò»ë3ѧ’$Iq3cêè„Ã3¨’ògP%%Ì  æ¦zî{ÑÏU’$Õ þw¯¿k^ÈÌ"I’&«Ö§þ·ð„Ã3¨’ògP%%Ì  榷ïòèç*I’êP¯]k_~Ûü¨ÁC7G_J’$iÄ5Ïùõð„Ã3¨’ògP%%Ì  æ¦ó…¿ˆ~®’$©&µ.~[ømð£O|;úL’$I#®ùÑ_ ¿A8<ƒ*)UR ª`nšŸüŸ¢Ÿ«$IªI½ÛÏ ¿m~TõücÑg’$Iq3~6üá𠪤üTI 3¨‚9š:¡”n#úÉJ’¤T}ÿ‘2½ê˜øûàï˜ùÕÄ’$i²š>åÅá7‡gP%åÏ JJ˜AÌ]ÿ¾ë¢Ÿ¬$IªI3}ÛüÿN}Iôy$I’F]¯ƒ0'URþ ª¤„TÁÜu¯?-úÉJ’¤šÔÙ9~Ûü7õK¢Ï#I’4âªéÇÃoæÆ JÊŸA•”0ƒ*˜»Ö…¿ýd%IRM|ï¶ðÛà¿in\}I’¤7xêîð„9ÞjURú ª¤„TÁÜ5Nû{¥Tƒèg+I’êPU•ÆúW‡ß73š›Þ}I’¤7xøŽð„9ÞjURú ª¤„TÁü î‹~¶’$©&µ¯ú³ðÛ`†¿•[’¤É«ßuá7scP%åÏ JJ˜AÌOï¶MÑÏV’$Õ¤þw¾~ÛÌh_öï¢O#I’4âúû¯ ¿A˜ƒ*)UR ª`~ÚÛÞýl%IR]êµKcíIá÷ @ç }I’¤×»ãüð„¹1¨’ògP%%Ì  æ§ùÑ_Ž~¶’$©Fµ/ù7á÷ @÷úÓ¢Ï"I’4âº7®¿A˜ƒ*)UR ª`þªï?ýt%IRMê}ãâðÛ wÛæè³H’$¸Îµ~ƒ07URþ ª¤„TÁüõ¾ùÙè§+I’jRÕz¶LOýTø}L¶þ·þ6ú,’$I#®}Å»ÂoæÆ JÊŸA•”0ƒ*˜¿ÎÕï~º’$©Fµ.xKø}L¶þ7EŸD’$iĵ.úƒð„¹1¨’ògP%%Ì  æ¯yîoD?]I’T£º7Ÿ~ß“mðÄw¢O"I’4âš›Þ~ƒ07URþ ª¤„TÁ˜:¡”n#úùJ’¤šT=÷½2½ê˜ø˜XUë™è“H’$¸æÇ~5üan ª¤üTI 3¨‚#Ó?pcôó•$I5jæÆ¢ï`‚ÿűªŠ>‡$IÒˆk¬{EüœTIù3¨’fPG¦{ÃÑÏW’$Õ¨îukÃï`25Ö/‰>…$IÒ¨ôümÙ‰TIù3¨’fPG¦µuyôó•$I5jðØÞðû˜Lͳ-ú’$I#®zþÑð„yÜkURú ª¤„TÁ‘iœþJ¾$IZКýåð˜<­ó;ú ’$I#npp_ø ÂÜTIù3¨’fPGnðø·¢Ÿ°$IªQ«ÿ2ü¾&O{Û;¢Ï I’4âú÷]~ƒ0wURþ ª¤„TÁ‘ëÝ~^ô–$I5ªàÆðû˜’$) æ'þÇð;„¹3¨’ògP%%Ì  ŽÒ)/.¥×Š~Ê’$©FUçËô©/‰¿s€ÚóÎI’4™5>ôÂïÜlÒ$eP%%Ì  Ž^ÿ›¢Ÿ²$IªY­‹ß~ãõ׺ø­Ñg$I ȿȕ‹A•”?ƒ*)aUpôº7®~Ê’$©fõîÜ~ãõ×ÙþGŸ=’$iÔuá7ócP%åÏ JJ˜A½ÖÖåÑOY’$Õ¬ªõl™žú©ð;¨·îgFŸ=’$iÄUÏ¿A˜ƒ*)UR ªàè5Nû{¥Tƒèç,I’jVkë¿ ¿s€zëí½4úä‘$I#nðà×ÂoæÇ JÊŸA•”0ƒ*XƒÇîŠ~Î’$©fõî8?üÆêmð½[£OI’4âzû¶…ß ÌA•”?ƒ*)aU°0º7Ÿýœ%IRͪšOûµÀ¢ª¦>y$IÒˆë~mcø ÂüTIù3¨’fP £}éÛ£Ÿ³$Iªa­OÿNøÔÔš£OI’P狇0/URþ ª¤„TÁÂh¬_ýœ%IR ëݶ)üÎê©yÖë£OI’P{Û;Âïæy·TIé3¨’fP gðÔ=ÑOZ’$Õ¬ªñD™^}|øÔOkëòèSG’$Ô:ÿ·ÃïæÇ JÊŸA•”0ƒ*X8½¯_ý¤%IR k}ê·Âï ~:ŸOô™#I’j~üµáwócP%åÏ JJ˜A,œöïŠ~Ò’$©†uo>;üÎê§{ÓG¢ÏI’PcíIáwócP%åÏ JJ˜A,œæG%úIK’¤V=ÿh™^}\ø­ÔKÿ›WDŸ9’$iÔu¦ÃoæÏ JÊŸA•”0ƒ*XXÕ÷Ž~Ö’$©†µÎûÍð;¨—Á#_>q$IÒˆ<ùÝð„ù3¨’ògP%%Ì  Voï¥ÑÏZ’$Õ°îW?~ç5²ê˜RµŸ‹>q$IÒˆëßw]ü¼TIù3¨’fP «ó¹?~Ö’$©†UÏ>8û|Fß:@=4>ø£ÏI’Pï‡ß!ÌŸA•”?ƒ*)aU°°šgÿZô³–$I5ͯýJëü}ÚH’¤€º»>~‡0URþ ª¤„TÁ[ul©šOE?mI’Tú7ŸëµÐÙþï£OI’Pç ~‡0URþ ª¤„TÁÂëûsÑO[’$Õ°júñ2½úøð[ȯ»ûãѧ$I ¨}ÉÉáwógP%åÏ JJ˜A,¼Îµý´%IRMk]ðæð[ȯ÷5Ñg$I ¨µyYøÂüTIù3¨’fP ¯¹éÑO[’$Õ´Þíÿ5üÖò«ž9}ÖH’¤€þÙ»óhKï²ÎÛV@dRDDD]Ò"¶ ¢ ¨´¾N­ "ˆýªíÔ(*ž2V*ƒ™IBæ2’bBæ™2‘¡2d"I¥ •aÏ{?ϯ×9´È¡êÔÙû~k­Ïïê~W¯œß¾Ùù朗‡ß!Úü ª ?ƒ*HÈ JC+¶-eÐŽþñ¦PÝÝXZ+·‹¿w$IRÞV=½”ºŠ>k€I«ëÒZ¹}ü-¢ÍΠ ò3¨‚„ ª¤ñ4ºýüèo`Juýð[G’$å­³ÿë£Ï @ÝÞ~‡h‘÷›A¤gP TIãipÁÊèo`J ¯;6üÖ‘$IyëðûÑç  ºÿúð;D‹Ë  ò3¨‚„ ª¤ñÔ=ü—£¼€iÕo•ÖÏ ¿w$IRÎúç/¾f€£ug†ß!Z\UŸA$dP%©UÏ(eÔþ¦Tïøß¿w$IRʆ7}ʆ×~‡hqTA~UA•4¾F_¾,úG˜RÛ>~ëH’¤œUÞ}ʬ ¿C´¸ ª ?ƒ*HÈ J_ƒ‹vŽþ¦Õ°[Ú;¹å%IÒf¶êé¥T£èKÐ;å}ñ·ˆ•AägP TIã«{ä¯FÿˆS¬wò‡ß;’$)WþeÌ®îao ¿E䆃YeP TIclÕ3Jõ£Ì€)5ZwFü½#I’RÕ;õýÑ' ¤½ÇËÃo-.ƒ*ÈÏ  2¨’Æ[u÷åÑ?æÀ´ J{—ç…ß;’$)OƒË÷޾`€Õ°´–o~‹hqTA~UA•4ÞïýcL±Þi ¿w$IRžFw\}¾ê‡î¿C´ø ª ?ƒ*HÈ JoÝ£ÞýcL±Ñ†ß;’$)Ou{CôùÝ~~ø¢ÅgPùTABUÒxkïðÝ Ž`,꺴÷|EøÍ#I’š_{ÍK£/ ÈðšÃÂo->ƒ*ÈÏ  2¨’Æ_uÏÑ?êÀëŸû¯á÷Ž$Ij~Ý£ß}¶Aúçý[ø-¢ÅgPùTABUÒø\²:úG˜bÕ†uá÷Ž$Ij~ýsþ9úl‚ôNzOø-¢ÅgPùTABUÒøëõkÑ?êÀ”›ÿb-úæ‘$IÍnxã‰Ñ' ¤{È›Ão->ƒ*ÈÏ  2¨’Æ_{Çg•R £Ü€)6¸|Ÿð›G’$5»zã]Ñ' ¤½æ%á·ˆŸAägP TI“©º÷Êèw`ŠÕ­KkŶá7$Ijfí]_}®Q†½ÒšÛ*üÑâ3¨‚ü ª !ƒ*i2 .]ýãL¹î1¿~óH’¤fÖ=ö7¢O Hµa]ø-¢-Ë  ò3¨‚„ ª¤ÉÔ=æ]Ñ?îÀ”ÞxBøÍ#I’šÙà¢O ÈèKg…ß"Ú² ª ?ƒ*HÈ JšLí¾§”jý#L³a·´wzNøÝ#I’š×ü¿HfÓðʃÂomYUŸA$dP%M®êÞ«¢ä€)×;õýá7$IjXsËJÝþjô™éŸóÏñ÷ˆ¶(ƒ*ÈÏ  2¨’&×à²=¢ä€)7ºó¢ð›G’$5«Î¿ÿpô‰êðûá÷ˆ¶ðž3¨‚ô ª !ƒ*iruýèy`ÚÕuiïùŠð»G’$5§ÞI}¡:½1üÑ–ePùTABUÒäjïô=¥T£è{`ÊõÏýHøÝ#I’šÓàò}¢Ï P{׆ß#Ú² ª ?ƒ*HÈ JšlÕ}×DÿØS®ÚpkøÍ#I’šSu÷åÑç ¥ß*­¹eá÷ˆ¶,ƒ*ÈÏ  2¨’&Ûà²=£ì€Ð9è¿…ß=’$©­zz)Ã^ôi©Ö¯¿G´ÅTA~UA•4ٺǼ+úǘÃ+ ¿{$IR|ÝÃÞ}–F·ž~hË3¨‚ü ª !ƒ*i²µw|V)£Aô>0åêîÃ¥µêá·$IŠ­þŠè³4ÿW3¢ïmyUŸA$dP%M¾êîÏEÿè3 wò{ÃïI’Ûèöó¢O Pï´†ß#Úò ª ?ƒ*HÈ Jš|ƒ‹vŽþÑfÀèŽ ÃïI’ØŠmKé·¢O P÷зÄß$Úâ ª ?ƒ*HÈ Jš|Ý#Þý£Ì‚º.½^~ûH’¤˜:‡ü\ô5k¯þ¾ð›DKp×TAzUA•ÐÊíKv£ü€0¸h§øÛG’$…Ô?矣O PÝ}8üÑÒdPùTABURLó‚`ÜêGî-­å[‡ß>’$iòÖ}Šª{>~hi2¨‚ü ª !ƒ*)¦þùË£ü€Ñ=úá·$IšpË·.uwcô~áèø›DK’AägP TI1u?öóÑ?þÀŒ®=9üö‘$I“­sàOEŸ @°þ¹ ¿I´D·A¤gP TIA­Ø¶ÔýÇ¢Ÿ`Œú¥½ë âïI’4±úgþ]ôë÷;á7‰–&ƒ*ÈÏ  2¨’â}ñ3ÑO0#úgþ}øí#I’&—ï€Î~¯ ¿I´4TA~UA•WÿìŠ~€Q­_~ûH’¤ µrûRíèóˆTW 7Aø]¢%É  ò3¨‚„ ª¤¸ÀÀ$uzcøý#I’Æ_÷È_>;€`õCw„ß$Zºüû$ÈÏ  2¨’[¾u©;E?ÀŒ^upüý#I’ÆÞà²=£Ï ØüŸÿ¾I´tTA~UA•ÛèæS£Ÿ`FÔýÇJ{Çg‡ß?’$i¼Íÿ©_`¶ >ûïá7‰–.ƒ*ÈÏ  2¨’bëŸñ7ÑÏ0CzŸú_á÷$I_í5/>7€ð¿ÿ§+ƒ*ÈÏ  2¨’bëì÷ºèg˜!Õýׇß?’$i|õNý@ô¹4@÷°_ ¿K´tTA~UA•ÜܲR?vôSÌÎÁoŠ¿$IÒX®=)úÔ ½Û‹Ãï-]UŸA$dP%Å7¼á¸è§˜!Ã/~ÿH’¤1´|ëRw¾}jÁêÞ£ ÿ1wøm¢%Ë  ò3¨‚„ ª¤øz§}0ú)fɰWÚ»¾ ü’$IK[矋¾2€¨î½*ü.ÑßyUžA$dP%Å×Ù뇢Ÿ`ÆôÏúPø $I’–¶ÁE;EŸ@ ¯ÿxø]¢¥Í  ò3¨‚„ ª¤fTo¼+ú9fHõÕ/úõÿ’$MYÕú›¢O  úç/AŒ6 IDAT¿K´´TA~UA•ÔŒ†Wý3¦{į„ß@’$iiêìýêèÓhˆÞñ¿~›h‰o=ƒ*HÏ  2¨’šQï„?ˆ~€3\{rø $I’–¦þ9ÿ}Z ÑÙç5á·‰–6ƒ*ÈÏ  2¨’šQ{—ç—RWÑO0Kªai¯yIø$I’¶¼êžÏG_@ :¥µ|ëðÛDK›AägP TIÍ©úʵÑO0cúç/¿$IÒ–5?.u}V PÝwuøm¢¥Ï  ò3¨‚„ ª¤æ4¸d·è'˜1õ#÷”ÖòmÂï I’´øú§ÿUôI4ÄðšÃÃo-}UŸA$dP%5§îo‹~€ÔûÄo‡ßA’$iñn;'úœ¢ÿ™¿M´ôTA~UA•Ô Vn¿ð÷Í&itçEñw$IZTížSÊh}N Ñ=ü—Ãï-}UŸA$dP%5+ÿU)aþ‹¹è;H’$m~½“ÿ8úŒ¤½ë Ãï-}UŸA$dP%5«þYÿý,3hxíáw$IÚüF7}F Q?ö@øm¢ñdPùTABUR³êð†èg˜EÃ^i¯~Qø-$I’6½öŽÏ.eЉ¾"€†˜ÿ Ñ÷‰Æ“AägP TI knY©[룟`õÏ›‹¿…$IÒ&×;õÑçÐ ƒËö¿O4ž ª ?ƒ*HÈ Jj^ÃŽ‹~€4?ên­Ü.ü’$I›ÖèŽ £Ï AzŸü“ðûDãÉ  ò3¨‚„ ª¤æÕ;åÏ¢Ÿ`FõNzOø-$I’žºöš—”RWѧÐ Þ~£h<TA~UA•Ô¼Úk^ý43ªºïšð[H’$=uý³?}6MR Kkåöá7ŠÆ“AägP TIͬÚpkôǫ́Î!?~ I’¤'¯zà†è“hjýMá÷‰Æ—AägP TIÍlpÅþÑÏ0£†7ž~ I’¤'®³ÿODŸ @à o8>üFÑï?ƒ*HÏ  2¨’šY÷ãïŽ~€YU K{÷¿‡$IÒã7¸d·èkh˜þ¹ ¿Q4¾ ª ?ƒ*HÈ Jjf퟽ð/3" .Y~I’¤Çin«R?|wô©4L÷ØßŒ¿S4¶ ª ?ƒ*HÈ Jjn£/_ýD3ªîn,íŸ~I’¤o­{Ø[£Ï Ú{¼<üNÑø2¨‚ü ª !ƒ*©¹ .XýD3¬Ö‡Âï!I’ô­ ¯;&úD¦î>\ZsËÂï/ƒ*ÈÏ  2¨’š[÷7G?À «¹·´V<-ü&’$I_¯½ÓsJ´£O aFw]~§h¼TA~UA•Ôà–oSêÞ#ÑÏ0Ãz§¼/þ&’$I õÏü»èÓh á• ¿S4Þ ª ?ƒ*HÈ Jjv£›N‰~&€Vm¸µ´æ¶ ¿‰$IÒw•jýÚèÓh Þi~§h¼TA~UA•ÔìzŸú‹èg˜qÝ¿;ü&’$iÖëú Ñ'ÐP~2üVÑx3¨‚ü ª !ƒ*©ÙµwYô3̸êžÏ‡ßD’$ÍzÃëŽ> €&vKkŶ᷊ƛAägP TIͯzðæè§˜qÝý|øM$IÒ¬ÖÞåy ÿ²àÛUw.üVÑø3¨‚ü ª !ƒ*©ù >»WôS̸ѭ§‡ßD’$ÍjýÏüCô)4Ôàsû†ß*UŸA$dP%5¿î‘o~*€YW×¥³ßëÂï"I’f±jýMÑ—ÐP½OþIø­¢ñgPùTABUR‚Vn_Ê ý\3nxí‘ñw‘$I3V÷°·FŸ@ƒuö}mø½¢ñgPùTABURŽFëÎŒ~.€Y7”ö?~I’4K מ} U÷+­å[‡ß+UŸA$dP%卿ßE?exåAáw‘$I³R{ÏW”R¢?þ€†Ýyqø½¢ÉdPùTABURŽ:û¼&ú¹ø¿¥êåá·‘$I³ÐàŠý£?ù€\¶Gø½¢ÉdPùTABURžê‡n~2Êàó†ßE’$M{í¿wáÏø<‘Þ ~³h2TA~UA•”§á•~2JõK{ ¿$Išæúçý[ô'>Ðp½^~³h2TA~UA•”§îÇÿGô“°`þOEßF’$Mm+·+õ£_‰þ¸¬î>\ZsËâïM$ƒ*ÈÏ  2¨’òÔÞñY¥ŒÑÏ@)Ã^i¯yiø}$IÒ4Ö;õýÑŸô@Ãn;7üfÑä2¨‚ü ª !ƒ*)W£;/Š~6 >·oøm$IÒÔ5·¬Të×FÌ 7¸x—ø»EË  ò3¨‚„ ª¤\õÏù—ègàë†ÝÒ^ó’ðûH’¤iª{Ì»¢?á€zŸøíð»E“Ë  ò3¨‚„ ª¤\uxCô³ð ƒË÷¿$Iš¦Fw\ýñ$ÐÞýÂïM.ƒ*ÈÏ  2¨’’5·¬Ô~%úéø¯ßRµÛ‹ão$I’¦ ÎÁ?ýÉ$P· ¿[4á;Ñ  Ò3¨‚„ ª¤| ¯=2úéø†Áû…ßG’$MC£/ý±$0ºõ?ÂïM6ƒ*ÈÏ  2¨’òÕ;ñF?ÿe4(½~(üF’$)sƒßý‰$1¸`eøí¢ ߊUžA$dP%嫽ËóJ©FÑÏÀ7 ¯;&üF’$)s£ÛÎþ8’èóëá·‹&›AägP TI9«îþ\ôóð_êªtöÿ‰ðI’¤Œuysô'9H{õ‹ÂïM6ƒ*ÈÏ  2¨’rÖ?ïߢŸ€o1ºõôðI’¤Œn?/úcH¢úêÃoM>ƒ*ÈÏ  2¨’rÖ9à ÑÏÀwèöÖð;I’¤LùíTÀæ^sxøý¢ÉgPùTABURÒæ–•ú‘{¢Ÿ€o1ºëÒø;I’¤Dî¸ úãH¤wêûÃïM>ƒ*ÈÏ  2¨’ò6¼êè'à;tùõð;I’¤ ùíTÀæêìóšðF“Ï  ò3¨‚„ ª¤¼u?þîè'à;T÷__Zs[…ßJ’$5½ÑEl‰Ôí¯.üõŠèF“Ï  ò3¨‚„ ª¤ÄíðÌR†Ýègà;ôNú£ø[I’¤7ÿ6Çè–O‡ß0ŠÉ  ò3¨‚„ ª¤Ü¾tVô3ðê‡ï.­UÏ¿•$IjdË·)Õú›¢?®€dúgÿSü£ ª ?ƒ*HÈ JÊ]ÿ?þwô3ð¸úç~$üV’$©‰ùßòÀbtysø£˜ ª ?ƒ*HÈ JÊ]{ÏWD?#«î?VÚ»½8ü^’$©IµwzN©Û¢?¦€l†½ÒZ¹}ø-£˜ ª ?ƒ*HÈ JÊ_õàÍÑO Àã^sxø­$IR“\¶GôÇ3ÐèËŸ ¿c—AägP TIù\º&ú)x|uU:ý™ð{I’¤&ÔÞó• ¿]`s .Ù-ü–Q\UŸA$dP%å¯{è[¢Ÿ€'ÿ¯hç–…ßL’$E7\{rôÇ2T÷Øß ¿e—AägP TISÐòmJÝÝýœ<¡Þñ¿3I’Xçà7•R×ÑÉ@Fu]Ú»¾ üžQà-iPéTABUÒt4¼áøèçà ÕÝQZ+·¿™$I inY©î½2úãHªÚpkü=£Ð ª ?ƒ*HÈ JšŽz'ÿqôsð¤úçüsøÍ$IRD½SÞý1 $6¼æ°ð{F±TA~UA•4µwy~)Õ(úIxBuïÑÒ^ó’ð»I’¤Iÿïõº½!úcH¬wêûÃoÅfPùTABUÒôTÝ}yô“ð¤†7ž~3I’4Ɇ×ýñ $×ÙûÕá7b3¨‚ü ª !ƒ*izêŸû‘è'à)uyWøÝ$IÒ$êú–Rê:ú£Hlþ7]¶æ–…ß5ŠÍ  ò3¨‚„ ª¤é©sÀOF?)O©úÚm¥µrûðÛI’¤±¶r»R=xsôÇ.ÜèæÓâï…gPùTABUÒ5·¬ÔÜý¬<¥Á…;ÄßN’$±Á+£?n€)Ð?ûŸÂïÅgPùTABUÒt5¼êàègà© {¥³÷«Ão'I’ÆQgïYø¬ØRƒÞ~Û(>ƒ*ÈÏ  2¨’¦«îÑïŒ~V6Éè΋~Ãfôý$IÒ’6·¬Œn??úc˜u÷áÒZ¾uü}£ð ª ?ƒ*HÈ Jš²VnWêÞ£ÑO À&éðñ÷“$IKXï”÷E¼Sbtóiá·š‘AägP TIÓ×píÉÑO À&©ýJiïôœðûI’¤¥¨½úE¥noˆþx¦DÿŒ¿ ¿oÔŒ ª ?ƒ*HÈ Jš¾z'¿7úiØdë ¿Ÿ$IZŠF·|:úc˜"ý^~ߨTA~UA•4}µwþÞRªaôó°ÉºG½#ü†’$iKê}ê/¢?N€)R·Ö—ÖܲðGÍÈ  ò3¨‚„ ª¤éltÇ…ÑÏ À&«þriïø¬ðJ’¤ÅÔÞó•¥î=ýq L‘á Ç…ß8jNUŸA$dP%Mgý3ÿ.úyØ,ƒÏ~CI’´Ù-ߦTw_ý1 L™Þiç¨1TA~UA•4µ÷øÁèç`óÔuéñ+áw”$I›Sÿ¼¹èOP` ÍÿÌè;GÍÉ  ò3¨‚„ ª¤é­ºÿúè'`³Ôï,í¾;üŽ’$iSêøS¥ŒÑŸÀ”©þrø£fePùTABUÒô6¸p‡è'`³ .ß'üŽ’$é)[¹}©Ö¯þئÐðšÃâo5*ƒ*ÈÏ  2¨’¦·Î?ýÄl¾º*Ýý÷ð[J’¤'kpÅ~ÑŸ˜À”êôGá·Žš•AägP TISÜܲR?rOô3°¸?ý·“ÿ­"IjfÝ£~­”ºŽþ¸¦T{·‡ß;jVUŸA$dP%MwƒÏýÌ,ÊðºcÂo)I’¾½öî?Pêö†èI`JUÞ~ï¨yTA~UA•4ÝuüÕèg`Ñz'þaø=%IÒ7Z¹]©î½2úã˜bóV8üæQã2¨‚ü ª !ƒ*iÊ[±m©»£Ÿ€E©»—ö/¿©$Iú·ï*Ã+Šþh¦\÷¿~ó¨yTA~UA•4ý o8.ú©X´Ñ]—–Öò­Ão*IÒl7ÿ[ƪ®J{çï ¿{Ô¼ ª ?ƒ*HÈ Jšþz'üAôS°Eúç~$ü¦’$Íný^WÊ ýqL¹ê¾«Ãï53ƒ*ÈÏ  2¨’¦¿öNßSʨýÜ,ÞhP:½1ü®’$Í^íŸ]ª ë¢? €0¸tMøí£ffPùTABUÒl4ºíœèç`‹Ôï*í]ž~WI’f¨¹ee¸ö¤è@`Ft|{üý£FfPùTABUÒlÔ?ý¯¢Ÿ€-6ºù´…¹}[I’f£þgþOôG0+†½ÒÚá™á÷š™AägP TI³Q{÷—•R×ÑOÀëŸõá·•$iúëñ¶RªaôÇ0#æÿÊDôý£æfPùTABUÒìTÝ{eô“°åªaéú á·•$izëìó£¥înŒþÄfHÿÌ¿¿ÔÜ ª ?ƒ*HÈ Jšúg8úÉXõc”önß~_I’¦¯ö.Ï/Õ×n‹þ¨fLgï ¿ƒÔÜ ª ?ƒ*HÈ JšÚ{¾"úÉX2£;.(­å[‡ßX’¤)jåö¥ºûòè8`ÆÔÝ©ÑTA~UA•4[U÷_ýì,™Á…;†ßW’¤)in«2\{RôG0ƒWì ©ÑTA~UA•4[õÏ›‹~v–N]—Þñ¿~cI’ò7¸d·èO5`Fu~gø-¤fgPùTABUÒl5ÿwئʠS:þtø%IÊ[ï”?‹þ4fÕ°[Z«ž~©ÙTA~UA•4{UÞýô,©zã]¥½ë Ãï,IR¾º‡½µ”Q?ú£ ˜Q£/~&üRó3¨‚ü ª !ƒ*iö\¸CôÓ°äFw^\Z+¶ ¿µ$Iyêì÷ºRwŽþfXÿŒ¿ ¿‰Ôü ª ?ƒ*HÈ Jš½:û¿>úé‹á5‡‡ßZ’¤uözU©ýJôG0ãæo’è»HÍÏ  ò3¨‚„ ª¤Ù¬Ú°.úù‹þé~kI’š]{ÍKK½ñÎè,`ÆÕÝ~)GUŸA$dP%ÍfƒKVG??ãQ K÷È·‡ß[’¤fÖ^ý}¥úê£?­Êàò}Âo#åÈ  ò3¨‚„ ª¤Ù¬óÑŸ‰~~Ʀî=Z:¼!üæ’$5«öNÏ)ÕW®þ˜Xà?Ò¦fPùTABUÒŒ6·¬ÔïŠ~‚Ʀ~ô+¥½ÇÆß]’¤FÔÞñÙ¥º÷Êè'€¯tJkÕÓÃo$åÈ  ò3¨‚„ ª¤ÙmðÙ½¢Ÿ €±ªÖßTÚ;?7üî’$·êéetçEÑKß0ºõ?âo$¥É  ò3¨‚„ ª¤Ù­{È›£Ÿ €±Ýyqi­Ü.üö’$µâie´îŒè#€oÑ?ý¯âï$¥É  ò3¨‚„ ª¤nn«R?z_ô30vÃë?±ð'Ãï/IÒd[±mÝtJôÇÀwhïùÊø[Ii2¨‚ü ª !ƒ*i¶\±ô30óî8úö’$M°•Û—Ñ-ŸŠþøøÕƒ·ÄßJJ•AägP TI³]÷°_Œ~†&¦þòðûK’4vxf}éìè€Ç5¸lÏø{I©2¨‚ü ª !ƒ*iÆ[¾u©[F?EÓ?ãoão0IÒØjïôœRÝ}yôÇ Àêñ¶ð›I¹2¨‚ü ª !ƒ*Ië‰~Š&§®KïÔ„ß`’¤¥¯½ë Kõ•/DÒ<¡º»±´Vl~7)WUŸA$dP%©{äÛ£Ÿ"€ÉªF¥wÜÿ~‡I’–®öš—–êÁ[¢?ažÔð G‡ßMÊ—AägP TIšÿ¯aêöW£Ÿ#€Éõ†åá·˜$i‹ëìõC¥Þxgô' ÀSê~â·Âo'åË  ò3¨‚„ ª$Í7¼êàèç`ò†½Ò=æ]á·˜$iñuöùÑR?roô' ÀS´Kk‡g†ßOÊ—AägP TIš¯{Ø/F?G1Ò=âmá÷˜$ióëôF¿qHctÓ)á÷“rfPùTABU’šÛªÔÞý$Ä0ª’¤tÍÿÙÖº÷hô'À&ëôžðJ93¨‚ü ª !ƒ*IÿÙàò}¢Ÿ$€8FU’”¦Þ©(¥FrlºÑ ´w~nø¥œTA~UA•¤ÿ¬sÈÏE?I±Œª$©ÙÍ-+ýóWDZl¶ÑmçÄßRJ›AägP TIúFsËJ½ñ®èg ~TuÔ;âo3IÒ·¶êe¸ö¤èO €Eéú/ãï)¥Í  ò3¨‚„ ª$}sƒKv‹~–âú¥wÜï„ßf’¤¯×ÞíÅ¥º÷ÊèO€Å©ëÒ^óÒð›Jy3¨‚ü ª !ƒ*Iß\çÀŸŠ~–š¡•Þ)~ŸIÒ¬×9à ¥~øîèO€E«îþ\øM¥ÜTA~UA•¤o¯Ú°.úih†º.ý3ÿ.ü>“¤Y­wüï•2hGl‘þÙÿ~W)wUŸA$dP%éÛ\¸CôÓÐ(ý³?~£IÒLµ|ë2¸dõ° »ÎÞ¯Ž¿¯”:ƒ*ÈÏ  2¨’ôíuöý±è§  qæÿÅ~knYø­&IÓ^{×”ÑíçE?ûK¢Z¿6ü¾Rþ ª ?ƒ*HÈ JÒãU=pCôóÐ8Ã/]Z+¶ ¿Õ$iZëøS¥Þxgôs°dæÿ"Dô¥üTA~UA•¤Ç«îG¢Ÿ'€FÝú¥µêá÷š$M[½Ó>XʰýÌ,©ùÁxô¥üTA~UA•¤Ç«½ç+K©ëè'  ‘ª{>¿ð'©¢o6Iš†Ú;|w^wlôÓ°äêwùÓñZ’ ª ?ƒ*HÈ JÒUÝ{UôÐXÕƒ·”öî?~³IRæ:û¾¶Të×F?éc1øì¿‡ß[šŽ ª ?ƒ*HÈ JÒÕÿÌÿ‰~¢­~äÞÒ9à'Ãï6IÊXÿÓÿ)ÃnôS06ÝCß~si:2¨‚ü ª !ƒ*IOT{÷—ù³O¡î=ZºGýZøí&IYjïüÜ2¼ñÄèç`¬êÇî/­å[‡ß^šŽ ª ?ƒ*HÈ JÒ“5ºëÒèg  ùªQéú/Ão7IjzÝéÔÜýjŒÝàò}Âo/MOUŸA$dP%éÉêŸþ×ÑÏ@ƒË÷.­¹­Âo8Ij\+·+ƒKV—RWÑO5ÀDt~Sü ¦©É  ò3¨‚„ ª$=YíÕ/Zø lšá Ç—ÖÊíÃï8IjJý~¼T÷_ý<LL½ñ®Òš[~‡iz2¨‚ü ª !ƒ*IOÕèKgE?U©T÷]SÚ»¿,üŽ“¤Ð–oSúg¸”a/úY˜¨ÁÅ»Æßbšª ª ?ƒ*HÈ JÒSÕ;é=ÑO@:õ£÷•ÎAÿ-ü–“¤ˆ:ûþX©î½2ú)ÑÙÿõá÷˜¦+ƒ*ÈÏ  2¨’ô”íðÌR÷‹~®òöJï“ÏIÒ¤ò[©€W=xKüM¦©Ë  ò3¨‚„ ª$mJÃ/ý\¤5¸t÷…‘AôM'Iã¬sÀJuïUÑO.@¨þùËÃï2M_UŸA$dP%iSêñ+ÑÏ@j£;/.íݾ?ü®“¤%oÕ3Êà’Õ¥TÃè§ \gïWÇßgšº ª ?ƒ*HÈ JÒ&5·U©¹'úÉH­n=¸0T¿í$i‰êó®Ro¼+úyh„꾫Ãï3MgUŸA$dP%iS›ÿS5l¡jTúçüKiÍ- ¿ï$i±µ×¼´ מý¢4Jÿ¬…ßišÎ ª ?ƒ*HÈ JÒ¦ÖÙÿ'¢Ÿ,€©1ZwFiïúÂðO’6«•Û-ŒBK¿ýŒ4K]•öî/‹¿×4•TA~UA•¤Í©ºÿúèg `jÔ­õ .+úÆ“¤M©{ø/•jýMÑO'@#î¼8ü^ÓôfPùTABU’6§ù_Y Àªë2øì^ ¿õ%úÖ“¤Ç«½ç+ËèæÓ¢_K€Fëú/Ãï6MoUŸA$dP%isjïöâRªQôÓ0uªû¯+}_~ïIÒÖÞé9epéî¥ {ÑO$@³UCÒ]cÍ  ò3¨‚„ ª$mn£ÛÎ~º¦Ó°[úg¸´–o~óIšáVl[z§}páÏ’ðÔF_üLü §©Î  ò3¨‚„ ª$mn½“ßýtLµêîËKgï ¿û$Í^Ý¿»Tn~Ré}òOÃï8MwUŸA$dP%i³Ûᙥî?ý|L7¿­JÒëü¦2ºó¢è— Ÿa·´wòïÚ4Þ ª ?ƒ*HÈ JÒb^wLôó0F_¾¬töý±ðûOÒtÖ9à e´îÌè§ ­ÑM§„ßtšþ ª ?ƒ*HÈ JÒbêùöèç `vŒepÑN¥µêéáw ¤é¨óï?\†7WJ]E¿p©õŽÿÝðÛNÓŸAägP TIZTs[•ú‘{£Ÿ0€™R?tû°=ü””¶öž¯(ë.¥F?iéÕ¯•ÖÊíÃo]J5Œþñ` ÕÝ_ZË· ¿35»TA~UA•¤¥®οD?mŒQußÕ¥wÚKk‡g†ßžRS2¢˜^ƒKV‡ß›ší ª ?ƒ*HÈ JÒR×ÞíÅþÀ ¨»ËàŠýKç 7†ß RD½^Uúg}¨Œîº´”jý# À8ÔuéìóšðÛS³AägP TIG£[O~Þ˜ jí¥þŠÒÞó•á·¨4Î:û¾váŸõùßÔÀôÝqaø *TA~UA•¤qÔýÄoE?oD¨«…áÐ;åÏJ{çç†ß¥Ò–ÖÞñÙ¥÷‰ß.ë?VêGï‹þ `Âz'ü~øM*TA~UA•¤±´|›R?vô@¤j´ð§ÐúgüMiïú‚øUÚÄæÓÚü?·£ÛÎ-eÔþI ÈüwÜ­O ¿O%ƒ*ÈÏ  2¨’4®—íýÄУ~­;£ô>ù§¥½ó÷†ßªÒ7×^ý¢Ò;ñËðšÃJýÈ=Ñ?-4Äà¢ÃoUi>ƒ*ÈÏ  2¨’4®:û¼&ú‰ ‰ªQ©î»ºôÏ_Q:û¾6ünÕ ¶ê¥{ÄÛÊà’Õ ÿ,–ºŽþ© iꪴ÷xyüí*TÁT0¨‚„ ª$³êîÏE?s4\µa]\º{éú–…?}Ãjújïø¬Ò=ê ¿a`ôåËJ ¢ÿ± áF·ž~ÇJÿ™AägP TIg½SÞýÌI¿UF·[úg¸tüéÒš[~Ó*_íŸýß@5ºëÒ…?9 ›£{ô;ÃïZé?3¨‚ü ª !ƒ*IcmÕÓKÝy(ú© ©úá»ËðšÃJïÄÿYÚk^ߪyÍmU:û½®ôNý@^sx©¼ÙŸð`‹Ôï\¸3Ão]éÿePùTABU’ÆÝàò½£Ÿ:¦DõµÛÊðÚ#~jg¯W…ߺš|í]žÿõ?ßwÁÊ2úÒÙ¥î>ý%S¦߽Ò7gPùTABU’Æ]gŸõ_ˆ0õ£÷•á'–þY*ÝC¡´wøîðûWKW{·—î1¿^úç//£›O+õÃ_ŽþG€i7ê—öê…ßÂÒ7gPùTABU’&ÑèŽ £Ÿ;fA5*Õ7~ýÏ~ê-|éÜZ¹}ø=¬§hÅÓJgÿ×/üiÇÁÅ»”Ѻ3JýØýÑÿ40ƒ†7Kß–AägP TIšD½~?ú¹`–GVÞ\†7_úçüKéó®ÒÞýeá7ò̧öùÑÒ;îwJÿüe¸ö¤R=xK)Õ0úŸXÐ=ô-ñw³ômTA~UA•¤‰´âi¥n­~òàêîÆRÝóù2üÂQ¥î¿.Œ|:ûýxi­Ü.þ~ÎÜŠmKç߸t~géŸñ·epÅþeô¥³JýÐí ã6hªùÿ£5·,þ¦–¾-ƒ*ÈÏ  2¨’4©ïýäÀS««R?tGÝ~~^sx響¼ôN~oé~ì¿ý7[-ß:ü¶m‡g–ξ¯-Ý£ÞQz§}° .ܱ ¿ptÝyÑÂÿ»ùmSdÕ?ãoâïméq2¨‚ü ª !ƒ*I“ª½ç+þå¤6”ú‘{JuÏet˧Êðʃþ|]ïSQºÇþféü³¥³÷«K{—ç—ÖÜV9nõŸ[Ú{¾²t>ú3 ±wÊû~k×àò½ËðúO,Œ¥ªõ7•ºóPôÿëÀxô[¥½ÓsÂoséñ2¨‚ü ª !ƒ*I“l´îÌèg&ªî>¼ð››ª{¯*£ÛÎ)ÃO\øNë.ƒK×,ü†§þÙ.ýOÿåÂo|êôG¥wüï~£îÇß]ºG¼í;›ÿ QßôÿÝB'¿wáÿŒþgþaáÿÌùß;¸l…ÿ»æÿ´áð¦O.üæ­ê+×.üÿÓüŸ=J^ý±ðïÏ¥'Ê  ò3¨‚„ ª$M²ùMÒ9ð§Ã¿?—ž(ƒ*ÈÏ  2¨’4Ñ–o]êwE?}° º÷ÊøïÎ¥'É  ò3¨‚„ ª$MºþùË£Ÿ>XÐû䟄o.=YUŸA$dP%iÒµwûþRFƒèç€W?ö@i­Ü>ü{séÉ2¨‚ü ª !ƒ*I oúdôóÀŒëŸû‘ðïË¥§Ê  ò3¨‚„ ª$EÔ=òW£Ÿ?fÙ SÚ»ü{pi1TA~UA•¤¦Ô9à ÑO"ShtÛ¹áßK‹Í  ò3¨‚„ ª$5©Ñ]—D?‹L™îÑï ÿþ[ZlUŸA$dP%©IõŽûèg€)RmXWZs[…ÿ--6ƒ*ÈÏ  2¨’Ô¨–oSꇿý40%zŸú‹øï¾¥-È  ò3¨‚„ ª$5­þÙŽ~˜õc÷—Öª§‡ï-mIUŸA$dP%©iµw~n)ýVôó@rý³>þ·´¥TA~UA•¤&6¼êàèç€ÄêÎ×J{Çg…ß-miUŸA$dP%©‰uöý±Rê:ú‰ ©Á+ÿ떖"ƒ*ÈÏ  2¨’ÔÔF·ŸýDQ¿UÚ»T=pƒßN¥™È  ò3¨‚„ ª$elpÁªèç€@Ýc3ü»jiTA~UA•¤Œµwy^)ýVô @€ê¾«KknYøwÕÒ$2¨‚ü ª !ƒ*IY|þÀè'€Ý£~-ü;jiRTA~UA•¤¬µ÷|e)Õ(ú`‚ª»/ÿ~ZšdUŸA$dP%)sõ'E?£LP÷ð_ÿnZšdUŸA$dP%)sþLô3 À„Œîº4ü{iiÒTA~UA•¤ìî¼(ú)`º‡¾%ü;iiÒTA~UA•¤ìuyWôS À˜n;'üûh)"ƒ*ÈÏ  2¨’”¾¹e¥ºÿºèç€1êü¦øï£¥€ ª ?ƒ*HÈ JÒ4Ô;þ÷¢ŸSÆd´îŒðï¡¥¨ ª ?ƒ*HÈ JÒT4·U©¸1úI` :½1þ{h)(ƒ*ÈÏ  2¨’4-õNzOô“ ÀÝ|jø÷ÏÒÿmïN¼ý¬ë'eT°êqiµ¶ÕZœjí2ÓºÔŽSsœjíLVÇnœžN­ŽÓžÚÅ©÷& ˆÈ.²3 AA ("‹‰¸²E@YAÉý=¿ý÷|æ$éÑZ¶$÷÷Ëç÷<ÏëuÎûO¸ŸçˇOîm%æ  ªÏATƒ*IµivQŒ¾5{¬0.eí£_—¿–sPÕç  *ÈA•¤:Õ=gÿì± À˜ n<+}ï,eç  ªÏATƒ*IµjñQ>zWöh`¾FÃh¹_þÞYJÎATŸƒ*¨ U’êV÷¼¿Ì­ÌÓàš“Ó÷ÍÒ4ä  ªÏATƒ*IµkñžQ>vwöx`g :Q¬zYþ¾Yš‚TAõ9¨‚ rP%©Žõ.üpöx`'õ׬Hß3KÓ’ƒ*¨>UPAª$Õ²%{E¹ùþì À*Û£X¾oþžYš’TAõ9¨‚ rP%©®õ.úHöˆ`õ.ü?éûeišrPÕç  *ÈA•¤ÚvàÞQ¶6dY¶S¹ñÎh-yFþ~Yš¢TAõ9¨‚ rP%©Îõ¾òOÙc€íÔ=ëÒ÷ÊÒ´å  ªÏATƒ*Iu®Xúœ(Û³G-Octß7£5³0}¯,M[ª úTA9¨’T÷ú—=jx“ßš¾O–¦1UP}ª ‚TIª{Ų}¢ì<–=nxÃ¾K–¦5UP}ª ‚TIjBý5+³Ç-Od4Œö‘¯Iß#KÓšƒ*¨>UPAª$5¡bÅODٛ˹üƒoŸ¾C–¦9UP}ª ‚TIjJý+We\þµ~Å!/MßKÓœƒ*¨>UPAª$5¥bÅó£ìnÊ»ü‹þåKÓwÇÒ´ç  ªÏATƒ*IMªùÙc€ˆ([¢Xúœô½±4í9¨‚êsPä JR“*–=7Êö#Ù£ ñz|(}g,U!UP}ª ‚TIjZ½‹ÿ1{ô4Z¹ñŽh-Þ3}_,U!UP}ª ‚TIj\îåÜúìñ ÐXÏþ^þ®XªHª úTA9¨’ÔÄz~8{ü4ÒðŽKÒwÄR•rPÕç  *ÈA•¤F¶xÏ(7Þ™=‚še4ˆöQ¿˜¿#–*”ƒ*¨>UPAª$5µî¹ž=‚¥Õaé»a©j9¨‚êsPä JRc›]£‡oÉÃP¶ŠbÙ>ù»a©b9¨‚êsPä JR“ë®~_öh„-5 {',U1UP}ª ‚TIjt3»Åhýw²G1@­¸vë>6}',U0UP}ª ‚TIjzÓß=Šê«,£s›ÓwÁRUsPÕç  *ÈA•$-ˆÑ½Wgc€Z|ç3é;`©Ê9¨‚êsPä J’DçÔ·gc€Ú){sQòÒô°TåTAõ9¨‚ rP%IÛÞyyöH¨•ÞÅÿ˜¾û•ªžƒ*¨>UPAª$i[ãߘ=’jcôÈíÑZòŒôݯTõTAõ9¨‚ rP%I?jxÛ—²Ç2@-tN{gúÎWªCª úTA9¨’¤Õþä¯D”eöh¨´áí_Iß÷JuÉATŸƒ*¨ U’ôã n\=šªkØö¯NßõJuÉATŸƒ*¨ U’ôㇾ"bÐÍϕԿrUúžWªSª úTA9¨’¤Ç׿ê°ìñ P9å܃Q,óÿž¤qæ  ªÏATƒ*Iz|Åò}£l?’=¢*¥{öûÓ÷»RÝrPÕç  *ÈA•$=q½‹>’=¢*cx×W£5³0}·+Õ-UP}ª ‚TIÒ“´xÏ=r{ö˜˜~ƒn´xuþ^Wªaª úTA9¨’¤'¯»ú½Ùc`êõ.MßçJuÍATŸƒ*¨ U’ôÍ,ŒÑ=k³G5ÀÔ=|k´–ì•¿Ï•jšƒ*¨>UPAª$é©k÷e™=®¦OYFçä·¦ïq¥:ç  ªÏATƒ*Izú†ëÎÍ×Sgpí©éû[©î9¨‚êsPä J’ž¾öᯊö³G6ÀÔ(ÛD±ò…éû[©î9¨‚êsPä J’¶¯þÕGgl€©Ñ=gÿô½­Ô„TAõ9¨‚ rP%IÛW±òQv7em€tûÖDkfaúÞVjBª úTA9¨’¤í¯wñG³Ç6@®a/ÚGî—¾¯•šRû¸ßÈþ©æÉATƒ*IÚxf”Ý“=ºÒô¿º,W+5¨Î‰oÉþ±æÉATPkùóÒ’T¥ºŸûãìÑ bôÈ÷¶þÃÓì=­Ô¤:§¾=ûG˜'UPA­ƒ^œþ¤J5³[ŒîÿvöøØå:Ÿ~GþŽVjXÓÞ™ý£Ì“ƒ*¨ Öª—§?$©juNú­ìñ °K ®ÿlúnVjbÝ3~?ûǘ'UPAÅa¯JHRÞzaöØ%ÊΣQô¢ô½¬Ôĺ«ß—=€yrPTùïÓ’TÅÚG¼:bØËã×ýÂ_¤ïd¥¦Ö=÷ϳG0Oª ‚Šc~9ý IU­åªì10QÃ;.ÖÌÂô}¬ÔÔz4{ óä  *¨}üÓ’TÕŠ¥ÏŽróÙ£`"ÊÞ\ÿéô]¬Ôäüãn¨>UPAíÓÞ•þ¤*×ýÜer€‰èÿô¬Ôôמ’= €yrPÔ9gÿôG€$Uº™…1¼kMö8«á—ùSÒ4¼å‚ìqÌ“ƒ*¨ îE—þ¤ª×>æõ£aöH^+ÚŸøÙôÝ«¤1ºçëÙ˜'UPA½5¥?$© ¾ù©ì‘0½ >”¾s•´­ÑnË À<9¨‚ êûÄôG€$Õ¡bùó¢,~=Öæex÷×¢5³[úÎUÒ‚­v3ì±Ì“ƒ*¨ Áº/ä?$©&õÎÿ«ì±°óú…?õ'MQÅÁ/Éž À8¨‚ ÞwMúC@’jÓ좭ÿNöhØ)½ ?œ¿g•ôÃ:Ç¿1{,cà  *¨loLHRíþã¦,³Ç;ÀÞ}•?õ'MYݳߟ=€1pPÕZúÜôÇ€$Õ©ÁõŸÍí;ö§þ{eúnUÒ×»d&{:cà  *ª8ú—Ò’T§ŠC^eo.{¼l—Þÿ&}¯*éñ ®9){<cà  *ª}ú»Ó’T·zÿcöxxZ£{ÖFkvQúNUÒãÝóõ쌃*¨¨î…þ¤ÚµxÏ=|Köˆxrƒn´Ü/Ÿ*éñÍ,Œ²»9{Jcà  *ªÿÍOå?$©†u>ýŽìð¤z}$}*é‰+ý™ìŒ‰ƒ*¨¨áÝkÓ’T׆ß=?{Ì<Îðî«ü©?iŠëœþîì1Œ‰ƒ*¨ªn+æ>¶0ýQ Iu¬ý‰Ÿt²'=ÀôZÑ>ì•éûSIO^ïÒÅÙ“UPa[~edö£@’êZÿò¥Ùcà‡ºç쟾7•ôÔ n:;{Tcâ  *¬}ú»Ó’TÛxfŒ¹={ÔÄà¦ÏåïL%=må£we `LTA…u/™MHRëœúöìQ4\¹ùþ(VüDú¾TÒSWòÒìqŒ‘ƒ*¨°ÁºóÒ’T÷7œ™=*Ë­ÿð3{O*ééëžõÙ#UPa£ÖÃÑšY˜þ8¤:Wô¢(;f| úW–¾#•´}õ¯>*{dcä  *®8üçÓ’T÷z|({Ü 3zèæhðÌôý¨¤íkôÀuÙc#UPqsöOHRí›Ù-F÷|={äM1èFûè×åïF%mWÅÒçDŒ†Ù“#UPqýoŸ”þ@¤&Ôþä/û!`—è}éoÓw¢’¶¿ÎgþköØÆÌATÜðáÛÒ’Ô”úkÏû@Í ïZ³õ·ægïC%mý«ÎÀ˜9¨‚ª+ËhôâôG‚$5¡bé³£|ìžìÉÔTÙ~$ŠC~2}*iÇ*7Þ‘=>€1sP5ÐùüŸ¦?$©)u>ýŽì±ÔT÷¬?LßJÚ±Ú‡ÿ|öè&ÀAÔÀà†³Ò ’Ô¤7®Îý@Í ®=5}÷)iÇë}ño²Ç0ª FM17»{úcA’šRqЋ¢loÌÿ@M”ïŒbésÒwŸ’v¼áíg`TAM´OxsúcA’šT÷œý³G?P£atNxSúÎSÒŽW,Û'bÐÍž"À8¨‚šè}ueúƒA’ÕÌÂÞyYöø*®ÙùûNI;U÷óš=B€ qP51|ð¦ôƒ$5­öa¯Œè·³?@EmùG›­ÙEé»NI;×ð¶/e`BTAGì—þh¤¦Õ»ø£Ù㨠²õP¿$}Ç)iç*Vá7ó’ÔäxfŒ6¬Ëþ»J9ŠÎ§ß‘¿›”4¶ºçüYödv1UPsƒï^þÀ¤¦×>ö×"FƒìO° ô.]œ¾“”4ÆfÅèá[²G °‹9¨‚º+Ë(ŽØ/ÿ¡!I ¯ùÙ_`†ß=?Z3»¥ï#%/¿ šÉA4@ÿšSÒ’Ôøï£®Íþ$2zøÖ(–=7)i|-Þ3Êwf ƒ*h‚Ñ0ŠÃ_ÿआ×>â"ì¯0feo.ÚG¾&})i¼õÎÿ@öx’8¨‚†è_FúƒC’´ z_þûìO0NeÝ3ÿGúîQÒ˜[²W”›îÍž0@UУQG½6ÿá!IMovQ ïþZöW“þçï%½Þ—þ6{¼‰TAƒ n>7ýá!IZÅ¡¯ˆ²»)û³ÌÓðŽK¶þ#Ê죤ñV¬|a”G³G ÈA4IYFqìH€H’D÷œ?Ëþ*óP>zW+~"}×(iü ¾u|öˆ’9¨‚†Þ½6æ¦à"IZƒÏÊþ,;cЉö'%}Ç(iüµy}Äh˜=e€dª :«ß—þ‘$-ˆbù¾Q>vOögØA[~}ö~QÒšYûÖd` 8¨‚=v_Ìð¬ü‰$):§¼mëŸdª¡ÿõ#Ó÷Š’&Swõ{³G 0%TACõ._šþ ‘$m«ÕaÙŸ`; ï¾*Z‹÷Lß)JŲçF¹é¾ì1L UÐTýnŸø¹ô‡‰$iA´–<#Fë¯Ïþ2O¡œ[ÅÁ/Éß'JšHƒkOÉ3ÀqP 6¸åÂô‡‰$i[í#_1èd€'2ìGç„7¥ï%M¦ÎÉo(ËìILUÐp³ßŸþ@‘$m«÷Å¿Éþ,O û…¿HßJšPîåÆ;³Ç 0eTAÃZ?ˆÖŠä?T$IÑšYÃ[¿˜ýiþ•þÚ#òw‡’&VÿªÃ²Ç 0…TÑ¿þŒô‡Š$i[ÅÊD¹ùìO°å/ý}ï¢hÍîž¾7”4™:'þfÄh˜=j€)ä  Øª}ú»Ó,’¤muNú­ˆr”ýi€FmXŲ}Ò÷…’&S±|ß(»;{ÔSÊA°ÕhÓÑZñüô‡‹$i[ý+Êþ4@c•­ QúŠô=¡¤É5\wnö¨¦˜ƒ*à‡·\sSðx‘$-ØúkÄG÷¬Íþ4@ó û[‹|úŽPÒÄêÿìIL9UÀéžÿÁôŒ$i[Å¡?ewSö§¥û¹?Nß Jš\í#÷‹èÙ£˜rª€×ïFqÔkÓ2’¤muÏ|Oö—£¿fEúNPÒä*–>;FÝœ=j€ pP<Îpý1·d¯ô$i[ƒkNÎþ4@í o>'Z3»¥ï%M¨™…1\wnö¨*ÂAð„úל’ÿ¨‘$mëÀ½c´a]ö§jktÿ5[÷pé»@I«wÉDzG P!ª€'Õ=ÿ¯Ò6’¤mµ|¿éPn~ ŠU?•¾”4¹:§¼-b4Ì7@…8¨žÜ°íãÞþÀ‘$m«{Οe ^úE´ýÕôÝŸ¤ÉÕ>üUQ¶7fO bTOi´ùÁhü’ô‡Ž$i[ƒkOÍþ4@=”etW¿7}ç'ir+ž£Ü–=m€ rP<­áÝkcnñžéIÒ‚h¸wŒº)ûÓ•×»äcùû>I“ë€gÅèÞ«³G PQª€íҿᬘûØÂü‡$iÛ¯'înÎþ4@e n\­ÿßCªm3»ÅàæÏg ÂTÛ­·æàüÇ$ikÝÏýqög*iøý+¢µd¯ôŸ¤ÉÕÿú‘Ù£¨8UÀéž÷ô$i[ƒkNÊþ,@¥Œº9ŠåÏKßíIš\[þœ'À|9¨vÌhíÏüNúCH’ô/ÿýÁ²¿ P åæû£Xõ²ü½ž¤‰ÕûÒßf &T;®WDûø7¦?ˆ$I ¢}ø«¢ì<–ýe€©Vv7Eûè×¥ïó$M®ÞùQ–Ù㨠UÀNu6Eq쯥?Œ$I ¢sÚ»üG"<™a?:§¼-}'iru?ÿ'å({Ú5â  Øie{cþ5‡$MEý+Êþ,Àô)Ëè®~_úþNÒäê~î"FÃìiÔŒƒ*`^F­‡£8b¿ô‡’$5¾™Ýbø½/g`ªô.úHþîNÒÄêž÷—~30ª€ym^Åá?Ÿþ`’¤¦W¬|a”›îÍþ,ÀTè¯="}g'irõ.þhö˜jÌA0£â‘(Žýµô‡“$5½ö§þcÄ ›ýY€TÃïž­ÙEéû:I“©Ù’ì1Ôœƒ*`lFíG£}ÜÒP’Ôôz|0û“i†ß¿"ZKöJßÓIš@³»Çà[Çe TãÕ+¢}ÊÛóS’Ôðמ’ýE€]nôÐÍQ,^ú~NÒø+üw1¼å‚ì14„ƒ*`üúÝè|ö¿¥?ª$©Ñð¬=p]öv™rÓ}Q¬zYþnNÒØ+VýTŒÖ_Ÿ=f€qPLFYF÷’ÙôÇ•$5¹âã/²µ!û‹Wv7Eû˜_JßÉIí£_å¦{³Ç Ð0ª€‰êãØ˜›Y”þÐ’¤¦Ö9ù­£Aöç&gØÛºËÞÅIÝ3ßÑkeO T7¸íËÑZúœô—$5µÞÿ:ûS“QŽ¢»ú½é;8Icnv÷èíЭ ƒƒ*`—®¿1ZEþãK’Úàºÿ—ý)€ñ*Ëèž÷—é»7Iã­8øÅ1¼kMö„ÎA°ËŒ:›¢}ú»Óa’ÔÈ–ì£{¿‘ý)€±é}ùò÷n’ÆZç„7G¹ùìñà  ØÅÊ2z—s3»¥?È$©i«~*ʹ³¿0oý5+Ò÷m’ÆØì¢è}åŸ"Fƒìñ°•ƒ* ÅàŽË£µò…ù3IjXíãß1ìe`§õ¿qLúžMÒø*>þrâ˜:ª€4£GïŽöñoJ¤IRÓêÿìOì”ÁuŸŽ–¿‚!Õ¦îçÿ$Êî¦ìÑð8ª€\£aô¾º2æf÷H°IR“ê_}tövÈpݹњÝ=}·&iþ+_ƒ›ÎÎ+OÊA0†ëoˆâ¨_L¼IRcš]Ã[¿˜=þ`» ï¸4ZKöÊß«IšwÝ3ßekCöXxJª€éÑkG÷üÆÜ<ä$© Ë÷Ñ÷fOxJ£{ÖFëÀ½Ó÷i’æWû?·õ8  TSgpוQþêôG$5¡öᯊ²½1{ôÀ­ÿNËöIߣIšG‹÷ˆÞWþoD¿=R¶›ƒ*`: ûÑ[³2æï™ÿÈ“¤š×9å·#FƒìÉ?fôÈ÷¢8èEéû3IóÛ?º){œì0UÀTþà{Ñ>é­é=Iª{½ >˜=òà‡ÊM÷FññŸNß›IÚ¹ÚGüB o½0{”ì4UÀô+Ëè_÷™hüÒôÇŸ$Õ¹þ7>™=ñ ʹ£}Ø+Ó÷e’v¼bå cðÍOEŒ†Ù£`^TÕÑ+¢wéâ˜;àYéAIªe³»ÇðŽK²§= V¶7Fûè׿ïÊ$íPÅŠçGÿŠƒ¢ìÍe€±pPTÎè±û¢söûcn ‡’T·ŠeûÄhúìQ@•ÝMÑ>î×Ówd’¶¿bùó¢ÿÕåQv7g€±rPTÖðþë¢}Ú»VIÒ˜+}E”­‡²Ç< ²å£}üÒwc’¶¯bå ¢ù[!êÈAPyÃõ7DçŒßwX%Ic¬}ì¯Fô‹ì@ôZÑ9ñ-é;1IO_û?ýµ‡Ûµç  ¨á½ßŒö§ßá°J’ÆT÷ŒÿQ޲Ç;5Vöæ¢s›Òwa’žºÎIÿ)†·\`g 4†ƒ* v†Þsö¹Å{¦?.%©êõ.ú»ì±@­©Þœ¾“ôÄË÷Þ?ÿï­¿>{\ìrª€ÚÍ=½5+£uЋÓœ’Tåúß8&{¤P7ýbëo¼ÉÞ}Iú7Í,ŒÎñoŒÁ·Žógý€FsPÔ_¯ýoŸÅq¿‘ÿ•¤*6»{ ¿wQö4 .z­èœø–ü½—¤Ö>ò5Ñ¿lI”ïÈžSÁAÐ(à ·D÷¢¿ÖФ?L%©JKŸ£õßÉãÔá7SüÖô}—¤-GTûEïÒÅ1zèæìÉ0uTÍ4èEÿƳ£}ÚïÆÜâg¤?X%© ‡üd”›îÍžàT•?ó'å¶xèœô[Ñ_³ÒÀÓpPÐ+b°î¼èœýþ˜;àYùYIšò±T¶7fOnª¦ßŽÎÉÿ9}¿%5­âÐWD÷ ƒWGÙy4{T†ƒ*€eÔÙýë>3ÿ ZËŸ—þÈ•¤i¬sâ["ì‘ @•Ž©Nùíô½–TûfEû˜_ŠÞŒÁõ§Gùè÷³ú*ËAÀ“ cxÏÕÑ»ô€(>õë17³[þCX’¦¤î™ï‰(GÙ“€JS½-}Ÿ%Õ®Å{Dû¨_Œîê÷ný~ÃÛ¿ewsöO<@m8¨ØN[þÄÕ–? Øýò?Dû„7ÇÜ’½òË’”XïÂgf¦Ù Sßž¾Ç’*ÛÌÂ(~ItŽctÏþŸÑ»äc1¸þ³1zð†ˆa?û' ÖTì¬aÛo°úÚ¡ÑYý¾(ŽzmÌÍî‘ÿ¸–¤]XÿÊC²§1Óh4ˆîYÅò}%­|a‡þÌÖ¶üV©ö'ek[·ü†©ÞŠÞ¥‹£¿öˆ|ç´Þ~qŒ¾5bÐÍþIh,Uã>²zð¦è_Ft/þhtNÿ½(Žy}´–í›~ô Iifa ®?={ú@ŒËÿÐEg§/;¶IEND®B`‚‰PNG  IHDR––<qâ pHYsèèµ{Rk fIDATxœíyÅÀ›CD"Q‹HæÕ{5çË 5OD‹Wñ5èƒn_®ƤG÷Á²¢ë.˘إ<Ô?–ßœ}Ë#N%q)îñÝ ÷¾AŒ\“óùER™s»O õäÖ{nj˚ˆç‹% å5"—¹ðå_ªÊoÝìÐCüpþÁИRHÔ_×_ˆXZQvLm½Õø0?Øšÿb­KĈçAbêBä²–÷ÌŒ±¿ë1?p¬8ÓGÔgœ}ÐwcËœñÔ>¦Ýf‡ñazÿ›Á;¸®ç$€oå8æS,cìÏu¦6IÿÃr냳¥ˆ¼I`-z5V±ôQ?rY„_œ®ƒñö÷â뱆ÿÒËö}nˆNqpIM±ò€{äã«=! æÌ?ª!–µðeѹ"à?z¯ëåKï× ¼ÄÙ ÏEH_U(·XöÖñ¢sD¤‚¥Þÿ9ÅÂÚœÙ%Ô„o)§XNùѹ!ÒÁá‘Îȧ$–1ò‡Ô[eü£ár‰eˆwö8ׂ½{Ø›KÁÞ<ìíSÀ9´¼s_AÆÁ N ±Œ!wx.(kûåÒÖŠ\HŒí˜Ô+86‚9ãi°wΰ ðµ}勯é *ãžú¬¥ÿJû­§Zðµß°T¯“×ÂX+NK¬¼Êþ$¸§÷‚9ûYÿÂL >°58ŸÍ•1çþY¬X‰‰‚r¸ðõA+hI—Qq£ÃAEÜ£[ÄŠeò¨ÖÍ'Ê~©PýãMø•_E Ò^DgÿʪqVaSAbåÖO;ªàÙúà;c“ªF®IÉYAëX~±NŒšsº1¬m¤ÅI‹eŒnJ-´¾#v©ªßÁu&À÷d¹ÿ ƒEÆè \k’ËZ™Jàp0Æ<(LªêàøÆã&UgÏ|¿“½oKáÏŸ´X8I¨8• :©~ä5Œd¸gV€s`5ðuÀœö{Ћnÿ¬)‹…Ó V%ÈŽ{bhù×Ojuèƒn/q.õr¸ÿÆÆ7ƒ9§»ßXqoŠˆT,cø½ æÌg„'ôÒ°¿hò—¬E¯TýœG²Ã×ôžH L,cÔAvø¦QÂIÁŠ5ä.ûÓiÂIÁ‚‰…uB²ãZ/<‘,˜X¸»Cvðlyщ¤`)T7¤S·žûö& –¾X¸IAvðÑɤ`ÁÄRáÆ ,ÿL L,{ûdš}g n¦PàL,ܨ :™,ó¶9Ÿ/žL L,ÿBÉñÎ})<™,˜Xxqµôx轿%<¡,y±0T8 {VÑ ¥`ÁÄÂeÙ1çýUxB)X0±ì-ã@vøC„'”‚ ‹édÇÙ·\xB)X0±S~ ²ãiÇ…'”‚ /ôQYO¸Ó²,Ç-ûHbÚï„'•‚ Ç0²#ó9YZE ±øºþ ;Îޥ“JÁ‚‰…7 Ëþ\‹N* &–1ôP(o¥`á‹¥åÖ“¿Lgà§ÿAxbµ,À÷â!­Ùz¹#‹N,¾a0ÈŽ³w™ðÄjYÅÂCúeÏPWå-C#°Xx«– àm¢“«eq¤t‹=®ÉÉ•Ð0õÄrÊ‚ì`™èäjY)‰e­ÌÙqïž\-‹#%±”¸tkàû|[x‚µ,”ÄÂÆ“¼ŸYt‚µ,”ÄÂÀ»õd‡¯î)<ÁZ–FÊb©°íï`-K#e±¬/ìxæyº,G1±T¸±1Šžd- #e±ðš\àÈÕÍž×>àÖˆÄò7±®Ù¡ÃBXz‘×À_3g? ü÷«6.;ðµý¢‹¯Òci å7ß@9jöDxù9^‚Ž/?˜¿+÷„G&Ô©^‚ ºÁ4 QÁÜXËÞgÏ|ð*%SþÑðèÄÒ¶°Vä oDMt6­’hñßýsñÝÓûÒÊ©ýqItbaxç¾Ùq¬ß°9‚ÇE¶jNùÆÑŠeïœÒc'@+l"¾Ás¢ Ü­Î$.±ü±–ky6B8ÿ˜î¹­Ub4Ž\,Õ—y²/œâG½¤Ë´ßáqˆ…[Äd?ì"ÛáXáB['&=VÉŒ’öGã Ã|ïo¢sGÄPMk.xi3g>36.±ðð3çÀêÚž…múר„ÕÎ|ûä7YEY—›´Þ-œ¸ä2†Ü­\ùr¦cÍ1¼ö-ëŒëxM¢OíZ[¯…]å¼çEç’øö¶‰áµmAcàŸ¼ó««g”>T§\*Üy˜é8ׂVpm8mš[¬5}V×HU#×ȇ›£;”Çy´t¦Ôl©ˆ{|7è}Z„Óž…MÀZÕs94¼L¬êžKŸüø8­÷ ±Œ¹ðpŽL®e’ùŒ+¼²&”6,{ݶ”ý“%CŘN-©]KQ÷Õú¶´£<Ê:1¶cèWruïL”=úà;S‹amc\§ÊÄÜ¿|Ê7¿’’Š ‚ ‚ ‚ ‚ ‚ –:ÿ£”O—WU¹zIEND®B`‚{ "name": "Contao Manager", "short_name": "Contao Manager", "description": "The official tool to manage a Contao Open Source CMS installation.", "dir": "auto", "display": "standalone", "orientation": "any", "start_url": "/", "background_color": "#ffffff", "theme_color": "#ffffff", "icons": [ { "src": "android-chrome-36x36.png", "sizes": "36x36", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-48x48.png", "sizes": "48x48", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-72x72.png", "sizes": "72x72", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-96x96.png", "sizes": "96x96", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-144x144.png", "sizes": "144x144", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-256x256.png", "sizes": "256x256", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-384x384.png", "sizes": "384x384", "type": "image/png", "purpose": "any" }, { "src": "android-chrome-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" } ] }‰PNG  IHDR ì YŨ pHYsèèµ{Rk IDATxœìÝy´eu}ç}«5Î8úß^ã[¿Q•Ù=˜:»°ÊÞC1¼ôðè}í/£³Ó3óØ¥¥jnyŒ.Ü?û˜ åmçG±ÃSóß%M;=+zGÿU /;2¢ÿpö㦂Á.Ô5(btõqÑ;æÑÙþÉù‡èÒR·bË]|Hö0SÊ[¿Å¿ÿN(ivZµMt¿úÖ^rH”ý ÙAh-ƒ]ØL£›ÏÞº¿6ÒÕl·úI1þá‰Ù·#ÀLßxæü{Yú»¡¤Ùkû§Dïã[ÏÏ~@ëìÀ&(»Äà¼=£ØûUù‡âRrÉi|ÓÙÙ·%ÀL_êü¯^f¿#JšÝŠ}_ƒ ¾eïÁìG"´‚Á.<†rýMÑÿÖ§¢³ÃSÓÀ¥I¨ØñéQÞú½ì[€£Ýë¾U[§¿+Jšñ¶Jô¿ù±(×ßœýX€‰f° `|Û…Ñ;ê=ÑY±Eþ·4!;?;Ê;/ξ=ø ã«ÎÊ­Òß%i㳨·öý1¾óÒìG#L$ƒ]ø ã».ÞQïŽÎܲüni‚*Ö<7Ê»/ϾEx£+×EgÅ–é4ßܲè~õ­1¾ó’ìÇ#Lƒ]Ø8Ô½ûÊèóèÌ-Ï?Ж&¬b×çGyÏUÙ·)atÅÑþR¤Éjnùü#Œï½6û Á`€™Vv~ýo~Ì %=JÅî/Œòþë³oU6ÁèÂÒß#%éçZ¹UôŽýoQvîÍ~L@*ƒ]fÓhƒó>žš`-MhÝ=_ÕC·eß­l†áY;¦¿OJÒ#¶ã3æÏd£e?* …Á.3gtÃéQ|þWó¨¥ ®»÷+£zø®ìÛ€'}"ý½R’­bßÿãÛ.È~TÀ’3Ø`f”ÝõÑÿæÇ¢3·<ýPZšäº{½<ª wfß²ÔUUÑÿÆM¿”¤GmnyôŽýoQö7d?1`Éì0†W®‹ÎšçåDK^wïWEÕ¹'û– ©ñ0z‡½-ý=S’«b—Äèúog?1`Iì0ÕÊÞCó¿Ô}ð,µ¡î^¯ˆêỲo[ʰ½/ýÇô÷MIzÌæ–Íÿe´ö²Ÿš°¨ v˜Zã[Ïb_É?p–Z±.ÀtªúE÷ ¿•þÞ)IW±×+c|ç¥ÙMX4»LŸrƒÓWEgÅ–é‡ÌRêîû›Quî;sX$ÿf÷sþQ³¤´úI1¼ðÀìÇ&, ƒ]¦JÙ{0º‡¿=ÿ`YjIÝ}_Uñãì[€EV=pC»>?ý=T’6¥ÞÚ÷G ‹ìG',(ƒ]¦ÆøŽ‹£³û‹Ó“¥vuï˾uX"å]—E±ãÓÓßG%iS*öû(×ß’ýè€c° ÀT^zDtVo›~ˆ,µ¥îÞ¯Šªsoö­ Àßüù?9Ÿý^*I›ÔÎÏŽÑMgg?:`AìÐzƒó>¹åù‡ÇRKê~þW£Úpgö­ @’ñõ§FgåÓßO%i“Zµu /=<ûÑ ìÐ^ãAô¾þ_òŒ¥ÕýÜK£zèö컀d£‹‰Îܲô÷TIÚ¤æ–Åàì5ÙNhÄ`€V*û¢{ðåK-ªØýEQ=xKöí À„ž±:ý]U’6§þqÿ#¢g?> ƒ]Z§ì>ůO?–ÚTñÙ_Šê²o_&IUEÿþz‘¤vÕ;ú½ãaö6›Á.­R÷E±ßï¤ KmªXóÜ(ï½:ûö`‡Ñ;ä-éï®’´9õŽzwÄhý€Íb° @k”ÝÅ^¯H? –ÚT±ËsŒuxLUÿ¡èîóéï°’´9uûóˆQ/û ›Ì`€V(;÷F±×+Ó¥6Uìø´(ï¼8ûö ª wD±Û/§¿ËJÒæÔ=üíó¿m`° ÀÄ+»ë£øÂkÒ¥VµúI1¾ù;Ù·/-RÞ}Åü?þL§•¤Í¨wÌ"Êqö#—Á.“­ÿpt¿ø†ôC_©U­|bŒ¯ûVöÝ @ trtVl™ÿn+I›Qÿød?>àqì0¹Fýè~ùÓ{¥Vµr«_s|öÝ @‹.:(ÿýV’6³ÁÛg?>à1ì0™Ê2zë>”~È+µª¹å1ºìÈ컀)08íŸóßs%isš[ÃK¾šýø€Ge° ÀDœ¾2ÿ€WjSsËbtáÙ·.Ó¢ª¢¿îƒùï»’´9­Ú&F7Ÿ›ý€Gd° ÀÄÙø+LJ釻R‹ž»Gö­ À´õ£÷å7¥¿óJÒæTì²]”÷_Ÿý€Ÿc° ÀDßþýù_AÈ>Ô•ÚÔàôÙ·.Sªê>ݽ^‘þî+I›S±ï«#Eö#~ŠÁ.£,î‹Îî/J?Ì•ÚTÿ¸gߺL¹jýMó¿X™ý,I›Soíû³ŸðS v˜ å8º_yKú!®Ô¦zG¼sþÞ€Å6¾ùœè¬|bú»°$mNÃï1ûñ ÿÎ`€‰Ð?õŸÓo¥6Õ;øÍ£~ö­ À ^°_úû°$mV«¶‰ñ—d?>`žÁ.éF7[äÞJ-©»ï«£ê­Ï¾u˜AƒãÿGú{±$mNݽ_1(²Ÿ`° @®²û@tv{Aú¡­Ô–ºŸ{iTß}ë0«ÊQôþÃô÷cIÚœú'ýCöÓ vÈÕ;ú½é‡µR[*vý¿¢ZSöm ÀŒ«º÷ÏÿƒÒì÷dIÚäæ–ÇèúÓ³ŸÌ8ƒ]Ò /=<ÿ VjIÅNψòî˳o[˜WÞse;<5ý}Y’6µb·DÙßýø`†ì¢ìÜŸ~H+µ¢UÛÄøæs²o[ø)ãkO˜ÿÕÊô÷fIÚÄú'~"ûÑ À 3Ø EoíûÒg¥Öü¹¾+Öfß²ðˆ†ç¬Éw–¤MmÅ1¾ý¢ìG'3Ê`€%7ºöÄüƒY©% Ïû|ö- ©ìߦ¿?KÒ¦ÖÝÿw"Æ£ìG'3È`€¥5(¢³Û Óe¥648é²ïXx|£^tx]ú{´$mjƒó¿ýä`ì°¤g¬N?Œ•ÚPÿkÊì[6Iõð]QìöËéïÓ’´)»lew}ö£€c° À’©º=:Û?9ý0Všôzýþü¯@›”w^ÕOJ¯–¤M©ÿ­Oe?6˜1»,™ÞÚ÷¥ÂJ“^w¯WDÕ½?ûv€ZF—‘þn-I›ÔÊ'Æø¾ë²›Ìƒ]–Äø¶ £3·,ÿVšàŠ]ŸÕú›³oWhdpÂß§¿cKÒ¦Ô[ûþìG&3Ä`€%Ñ=ôOÒ_¥‰nõ¶QÞvAö­ ͇Ñ;èùïÚ’ôx­Ø"Æ÷^“ýÔ`Fì°èF7Ÿ›ð*MrsËc|õ±Ù·*,˜êá»æÿ’Lú;·$=NýuÊ~d0# vXtÝ/¿)ýÐUšä†ç}.û6€7¾ñŒè¬Ø2ý½[’ÿWv¯Í~d0 vXT£ÎÈ?p•&¸þqξM`Ñ ÏÙ5ýÝ[’¯þ7þKöã€`° À¢êò§é‡­Ò¤Ö;äO"ÊQöm ‹§ª¢Ô»ÓßÁ%é1[µu”îÌ~b0å vX4ã{®ŽÎܲüÃViëîýʨzë³oSXtÕàáù÷àìwqIz¬§¯Ê~\0å vX4½¯ÿMú!«4‰kžÕú›³oQX2å¯b‡§¦¿“KÒ£Uìòœˆa/ûq À3Ø`QlüóaÿŒXö!«4q­Þ6ÊÛ/̾E`É.ÿZþ{¹$=FËÍ~T0Å vXƒ3¶O?\•&®¹e1ºìÈìÛÒ NúDþû¹$=J½/ýÇìÇ$SÌ`€…WŽ£³Û ÓW¥IkpúŠì»r•£ùA\ö;º$=bsËb|ßuÙOJ¦”Á. nôÓòV¥ «ä»"ª2ûö€tÕÃwGñÙ_LW—¤GÊ?º`±ì°àzGüEú¡ª4Iu¿ð[ƒNö­ c|ó9ÑY±eú;»$ýlÅî/šÿ+r°Ð vXPeçÞè¬Ü*ýPUš”Š5Ï‹êÁ[³oM˜8óvLo—¤GjtãYÙH¦Á. jxÁþ釩ÒÄ´j›(oý^öm “©*£÷•?Η¤ŸipÒ'²ŸL!ƒ]T÷Ëÿ)ý0Uš”F—–}KÀD«:÷D±ëóÓßá%é'+vaDYf?"˜2»,˜rÃ]ÑY±Eúaª4 Ný§ì[Za|Ý)Ñ™[žþ./I?Ùøö‹²Lƒ]Ìàü}ÓQ¥I¨wèŸÍÿYO`Ólü‡¯Ùïó’ô“ ¾ý™ìG#SÆ`€ÓýÊ[ÒQ¥ìŠ=^Uq_öííRŽ¢÷Å7¤¿×KÒÿ®»ÿk³ŸŒLƒ]Æ ˆÎêmÓQ¥ÌŠíŸåÝWdßÐJÕƒ·F±ó³Òßï%i¾[DYÜŸýh`Šì° F×~3ÿUÊlnYŒ®X›}+@«¯=aþ;ý=_’>ó„_}löc€)b° À‚èÿ÷釧RfƒoÏe߆0'|4ý=_’6¶ñy Å`€Q|þWÓO¥¬z‡½5¢*³oC˜£~t¿ð[éïû’ÔÝûUÙOD¦ˆÁ.•îJ?8•²êîù²¨zë³oC˜*åý×E±ÃSÓßû%ÍxsË£ì=˜ýH`JìÐØèʯçœJ ;üB”÷^} ÀT]zXú»¿$o<3ûqÀ”0Ø ±þÉÿ~h*-ysËbtÅÚìÛ¦Zÿë i¦ž³kö£€)a° @cůK?4•–ºÁɟ̾õ`ú :ÑÝó×ÒÏ$Íný£Þý$`JìÐÌhU[§šJKYï ß³ï>˜ åíFgåVéç’f³îç^šý`JìÐÈø®ËÒL¥¥¬Xóܨ6Ü‘}ëÀLž±:ýL@ÒŒ¶b‹ˆQ?û1À0Ø ‘á%‡å˜JKÕŠ-c|ÓÙÙ·ÌžrÝ/ÿl@ÒLVÞsUöS€)`° @#ýoýcúa©´T ÏÝ#û–€™U=pC;üBúù€¤Ùk|Õ7²Lƒ]éò§é‡¥ÒRÔ?êÝU•}ËÀL}ÿÀô3I³×ðì³Lƒ]éìþâôÃRi±ëîùkQõ7dßn@Dôÿóô³I³Uÿ_ÿ{ö£€)`° @}å(:+·J?,•µUÛDyç%Ùwð¿T{£XóÜü3I3Sï°·e?ú˜»ÔV>pSúA©´Ø.:(ûV~ÆøšãÒÏ $ÍNÝý^“ýØ` ìPÛèÆ3ÓJ¥Å¬ô_fßfÀ£èûwég’f£b×çg?ò˜»Ô6üÁWÒJ¥Åª»×Ë£<œ}›bã{{÷s¿’~† iZ±ED9Ê~ìÐr»Ô68k§üƒRi1ZµM”w^’}‹£¼õ»óCºô³IS_Õ} û‘@ËìP[ÿ¤O¦’J‹Ñ袃²o/` ¾ý™ô³IÓ_õà-Ù;ZÎ`€Úzëþ:ýTZèúGÿeö­lŽrÝ~7ýLAÒtWÞsUöÓ€–3Ø ¶îaoK?$•²î^/jðpö­l¦òÞk¢³zÛô³IÓ[yÛùÙ:ZÎ`€ÚŠ/ýTZ°Vmå]—fßV@MÃs÷È?_4µoøvöc€–3Ø ¶bŸßL?$•ªá÷öξ¥€&ª2z½1ýŒAÒt6¾î”ì§-g° @mÅž/O?$•¢Þ¡QUÙ·ÐPùãkçÿŠNöYƒ¤ék|ý©Ù8ZÎ`€ÚŠ=^’~H*5­Xóܨ¾;ûvÈðì]ÒÏ$M_ãëOË~¼Ðr»ÔÖùì/¥’Jš[î ¦M9Šîþ¯Í?w4UoøvöÓ €–3Ø ¶Î.ÏI?$•š48õfßFÀ"(ï¾<:+Ÿ˜~ö iz2Ø )ƒ]jëìüìôCR©ni'ÆÃìÛX$Ã3·O?4=ìДÁ.µ쪭Û?%Êû~”} ‹©Ew¿ßN?‡4ìДÁ.µ쪭.;"ûö–@yçÅÑY¹UúY„¤ög° @S»Ôf°«6Ö_û¾ì[XBƒo&ýûKQuïϾu€¥4DwŸßH?—Ôî vhÊ`€Ú vÕªæ–Çø†Ó³o AyçÅÑY¹Uþù„¤Öf° @S»Ôf°«65øÖ?fß2@¢Á)ŸN?ŸÔÞ vhÊ`€Ú vÕ–º{¿*bÔ˾e€L£~t÷~eú9…¤vf° @S»Ôf°«V´j›(ï¾<ûv&Àø–ó¢3·<ÿ¼BRë2Ø )ƒ]j3ØUž÷ùì[˜ ýã>œ~^!©}ìДÁ.µìjÒëü截̾U€ RõÖG±æyéç’Ú•Á.MìP›Á®&¹b‡§Fõà-Ù· 0F—•~v!©]ìДÁ.µìj’ýààì[˜`½ÃÞš~~!©=ìДÁ.µìjRëö¶ìÛ˜pÕú›¢³ý“ÓÏ1$µ#ƒ]š2Ø 6ƒ]MbÅŽOê¡Û²o †gí”~–!©ìДÁ.µìj]vdö­´E9Šî¾¯N?Ï4ùìДÁ.µìjÒêñŽìÛh™ñÍ߉Îܲôs I“Á.MìP›Á®&©bçgGõðÝÙ·ÐBýcÿ6ýlCÒdg° @S»Ôf°«Ijtå1Ù·ÐRU÷þ(vyNúù†¤ÉÍ`€¦ v¨Í`W“Ríû²o åF—|5ýŒCÒäf° @S»Ôf°«I¨ØùÙQuîɾ€)Ð;øÍég’&3ƒ]š2Ø 6ƒ]MB£+ŽÎ¾€)QÞ÷£è¬Ú&ý¼CÒäe° @S»Ôf°«ìz‡ÿyömL™á«ÒÏ<$M^»4e° @m»Ê¬ØéQm¸3û6¦Í¨Ý=-ýìCÒde° @S»Ôf°«ÌF%û¦ÔøúÓÒÏ>$MV»4e° @m»Êªwð›#ª*û¦Xïˆw¤ŸHšœ vhÊ`€Ú v•ÒöOŽê²/`Êm<è¬Ú&ÿ,DÒDd° @S»Ôf°«Œ†çï›}é3bðí¹ô³I“‘Á.MìP›Á®–ºî¯¨ÊìK˜Ãn»¿0ýLDR~»4e° @m»ZÒV>1Ê{®Ê¾ì€3ºâèüsIéìДÁ.µìj)ž±:û’fTïËÿ)ýlDRn»4e° @m»Zªº{½û²ØtUÝ/ý\EÒâg° @S»Ôf°«…ltÉW³/i€Í6¾éìôsI‹ŸÁ.MìP›Á®ªÞA¿?ÿ‹4mÔ;âéç+’7ƒ]š2Ø 6ƒ]-H+¶Œò®Ë²/g€ÚÊ_•[埳HZ´ vhÊ`€Ú vµ NùTö¥ ÐØàø¤Ÿ³HZ¼ vhÊ`€Ú vÕ´bÍó¢ê?”})4Vuîbǧ¥Ÿ·HZœ vhÊ`€Ú vÕ´Ñ%_;ŒÌð¬ÒÏ[$-N»4e° @m»jR÷À×GTUöe °pF½(v{Aú¹‹¤…Ï`€¦ v¨Í`Wµ›[åmçg_ ntÉ¡ùg/’<ƒ]š2Ø 6ƒ]Õ­ÿõ¿É¾|GUFw¿ßN?‘´°ìДÁ.µìªNÅöO‰jÃÙ—/À¢ßxfúŒ¤…Í`€¦ v¨Í`Wuž³&ûÒXt½ÃÞš~#iá2Ø )ƒ]j3ØÕæVìñ’ˆQ?ûÒXtå½×DgÅ–éç1’&ƒ]š2Ø 6ƒ]mnã«Í¾l–Lÿ_ÿ{úyŒ¤…É`€¦ v¨Í`W›Sïà7g_²Kªzèöè¬Þ6ý\FRó vhÊ`€Ú vµÉÍ-òŽ‹²/Y€%78ù“ùg3’g° @S»Ôf°«M­¿îƒÙ—+@Šªøq;<5ý|FR³ vhÊ`€Ú vµI­Ú&ªõ7g_®i§¯È?£‘Ô(ƒ]š2Ø 6ƒ]mJƒS>}©¤ªzF±ó³ÒÏi$ÕÏ`€¦ v¨Í`WW±Ó3¢êÞŸ}©¤ž³&ý¬FRý vhÊ`€Ú võx ¿»Wöe 0†Ý(>û‹éç5’êe° @S»Ôf°«ÇªØã%£~öe 01†çï›~f#©^»4e° @m»z¬FW¬Í¾D&Ëx8ÿœ³Ïm$m~»4e° @m»z´º¼.¢ª²/Q€‰3ºøô³I›ŸÁ.MìP›Á®­ñgd_ž“©Gw¯W¤ŸßHÚ¼ vhÊ`€Ú võHõyKö¥ 0ÑFW¬M?Ñ´yìДÁ.µìê‘*o;?ûÒ˜lUÝý^“~Ž#iÓ3Ø )ƒ]j3ØÕÏÖ?ò]Ù—%@+ŒxbúYޤMÏ`€¦ v¨Í`W?ÕÜò(ïº,û²hÞ—þ ÿLGÒ&e° @S»Ôf°«Ÿ¬¿îCÙ—û +g IDAT$@«ŒoþNú™Ž¤MË`€¦ v¨Í`WÿÞÊ­¢zà†ìK uz_ù£ü³I›Á.MìP›Á®þwƒã?’}9´Òø–óÒÏv$=~»4e° @m»šoÕ6Q=t[öåÐZ½/ýAþ¤ÇÌ`€¦ v¨Í`Wœüÿe_Š­6¾áôô3IÁ.MìP›Á®æ]wÃÙ—"@ëõzcþY¤GÍ`€¦ v¨Í`Wƒ“?™}L…ñNN?ë‘ôèìДÁ.µìÎxó¿®{Göe05ºünþ™¤GÌ`€¦ v¨Í`w¶œøÿf_‚Se|í ég>’9ƒ]š2Ø 6ƒÝnÕÖQ=t{ö%0uºûÿNþÙ¤ŸË`€¦ v¨Í`wvœðÑìË`*¯úFúÙ¤ŸÏ`€¦ v¨Í`wF[¹UTëoξü¦SUEwßßÌ?’ôSìДÁ.µìÎfýã>œ}éLµÑG§ŸIúé vhÊ`€Ú vgõ×uoʾô¦[UFwŸ_Ï? ’ôïìДÁ.µìÎ^ýoü×ìË`&Œ.=<ý,HÒÿÉ`€¦ v¨Í`wÆš[å=We_v³¡GwÏ_Ë?’4ŸÁ.MìP›ÁîlÕ?ò]Ù—ÀL]|Hú™¤Ë`€¦ v¨Í`w¶*oýnö%0{¿²ûù_M?’d° @s»Ôf°;;õ¾ü¦ìË `&¾`úÙ$ƒ]š3Ø 6ƒÝÙi|Ý·²/7€Ù4êG±ëóÓχ¤YÏ`€¦ v¨Í`w6êîûꈪʾÜfÖð¬Òψ¤YÏ`€¦ v¨Í`w6]~Tö¥0ÓªÞƒQìø´ôs"i–3Ø )ƒ]j3ØþŠ=^Q޲/5€™78ù“égEÒ,g° @S»Ôf°;ý /øBöeÀÆ_Ù}ðÖè¬Ü*ý¼HšÕ vhÊ`€Ú v§»b§gF :Ù—Àæõ£ê>ðÓ=t{TÜðS•÷ý(Ê{¯þ·ÿºsÏü_”ãìÿíUÝÓÏŒ¤YÍ`€¦ v¨Í`wºœúOÙ—0ã6ŽhË»/ñOŒÑŽá9kbpÚ?Çà„F݇¢wÄ;£wðFw¿ßŽîç~%Š]¶‹Îª­ä»P±ãÓ¢ØéQìñ’è~î¥óÿ3z‡üIôù@ NúD ÏÚ)F?ørŒ¯9.Ê[¿åý×EÕßý2`ÊmünÔ™[–~n$Íb»4e° @m»SÜÊ­¢zè¶ìK ˜VU5ÿ'Ç7ž£KáÙ»ÄàÄGÿ¨ÿÝ/þßQìþÂÞ.y«ŸÝ}~=zG¼#'ýC Ïß'Æ?<)Ê_;ÿË¿Mõý³üï<Ò f° @S»Ôf°;½õ×þUöåLê¡Ûc|ã™1ºè œò©èùÑÝç7¢³j›ôï;)Í-b·DïËoŠÁñ‰Ñ÷Œò¶ "†Eöÿ«€Ùøý*ý{4ƒìДÁ.µìNoåíf_^@›~-÷b|Õ7bpúÊû•Ü}_=ÿK³ÙßiZÓŠ-¢»×+¢ô{cxΚÿèä¨6Ü™ýÿY`‚u÷mþwiÆ2Ø )ƒ]j3ØÎz½1ûÒ&Õxå=WÆè’CcpâÇ£÷•?ŠÂwÂE«Xó¼èí=1üîžQÞqQDUf_À„]yLúwiÖ2Ø )ƒ]j3ØÎ6þ>1èÄø¦³bxήÑ_û¾èîýªè¬Ø2ý»Ê,Wìü¬èþöž»G”·]Q޲¯ K9Žîç^šþýDš¥ vhÊ`€Ú v§¯b÷Íÿ>Àì)ïûQŒ.ùj ŽÿHt¿ð[ƹ-¨Øþ)Ñ;ì­1ºpÿ¨¼5û–ØÆïÙßG¤YÊ`€¦ v¨Í`wúÚøkmÀ ¨ª(ï¹2†çïý¯½'Š]ž“þ=DÍëîûêœöÏ1¾å<ÿ fÁ°ë{œ´„ìДÁ.µìNß/´U½³/+`‘”?¾6†çïý£ÞÅ.Û¥÷Ð"·ÛùÙÑ_÷Á]qtÄ “}ù‹dxæéß;¤YÉ`€¦ v¨Í`wºê÷áìK X@Õàá_Z Nüx»¿(ý»†[½mô{[Œ®X1d_šÀªºÌÿ#ìôïÒ d° @S»Ôf°;]•w]š}I mü<ßø+kÝ/:+¶Hÿ~¡ÉüåÝÁñ‰ñ-çFTUö% ,€ÿ@+û;†4 ìДÁ.µìNO½/¾!ûrêb|ý©1øæÇ¢Øý…éß)Ô®6^3ƒSÿg”?¾6ûJ(ï¿>:sËÓ¿[HÓžÁ.MìP›Áîô4ºìÈìË ØTÃnŒ®úzô~o;>-ý{„¦ ¹eÑ;øÍ1ºr]D9ʾ€z‡¿=ÿ;…4åìДÁ.µìNGÅ.ÛEŒúÙ—ðXF½_s|ô×}0Š~!ýûƒ¦·bÍóbpʧ£zð–ì«Ø ‡„Ùß#¤iÏ`€¦ v¨Í`w:œö/Ù—ðHÊQŒ¯ýfô×þUt¶rúwÍX+¶Œþ‘ïŠñõ§ETUöÝ<žªŠî>¿žÿBšâ vhÊ`€Ú v§ [DµþæìK ø å=WÎÿÂéÆ_:Mÿ® }æ óãŸÑ%‡ÎÈ€É5úþéߤiÎ`€¦ v¨Í`·ýõŽxgöelüA´‡ïŠá9k¢»×+Ò¿HV±Ç‹cxÁ~£^ö-<’aÅNÏLÿÎ Mk»4e° @m»ío|ý©Ù—Ì®rãž½#ÿ":+·Jÿ^ mjýyãÀ¼ê?”}?cã_jÈþ® Mk»4e° @m»í®Øã%U•}ÀÌ©º-§¯Œb·_Nÿ> 5©Øñé18í_¢êÞŸ}[ÿKõà-ÑY±eú÷i3Ø )ƒ]j3Ømwóv̾„`¦”w\ýuôkºšºŠíŸ2ÿk~UCömDDÿkïIÿ~ Mc»4e° @m»-nÅQ=xkö%ÓoÔÑ%‡FwßWçþK‹\±Ëv1KÚüz¿9ª wf?F ½ÆÿhMjÁ.MìP›Án Z±eTß}©@¾ñ0†gïÕÛæ>Kª]±ëóc|ÃéÙOh­Á)ŸNÿ<—ÚšÁ.MìP›Áîä×;ôO³/HWÞ~at÷ýÍôÏeI ÔŠ-bxîîÙhí_œèÌ-Ïÿ<—Z˜Á.MìP›Áîä7ºøìËrU÷œ5ÑY¹Uúg²¤…¯ô{#†Eö“Z§wÈŸ¤ŽKmÌ`€¦ v¨Í`wÂ[µuT½õÙ— ¤(ï¾<ºû½&ÿóXÒ¢ÖýˆjýMÙh•ñUßHÿ —Ú˜Á.MìP›Áîd×;üíÙ—,½rÃ3·÷«ºÒ UìòœßtvöÓÚ£EñÙ_Lÿ —Ú–Á.MìP›Áîd7ºìÈìK–Tõà-Ñ;èéŸÁ’Z±e ÏY“ý€Öœ¾"ÿó[jY»4e° @m»Üêm£êoȾD`Élü‡*ÅŽOËÿ –”Úà„¿(ÇÙ$˜xÕƒ·FgÅéŸÝR›2Ø )ƒ]j3ØÜúGýçìË–ÄÆ Ò_÷¡ôÏ^I“SïˆwD ‹ìÇL¼ÞáoOÿÜ–Ú”Á.MìP›Áîä6ºò˜ìË]yïÕÑÝû•韻’&¯î¿UçžìÇL´ñµßLÿÌ–Ú”Á.MìP›Áî„¶ý“#ìËÕè’C£³úIùŸ»’&¶b—Dùãk³W0¹ª2ŠÝ_”þ™-µ%ƒ]š2Ø 6ƒÝɬô{³/ X<Ã"ú_ÿëôÏ[Ií¨Øe»(oý^ö“ &Öð¬Ó?¯¥¶d° @S»Ôf°;™®\—}iÀ¢(ï¿>ºûüFúg­¤–µúI1¾ú_³a¯ªæ}~tÉWcðÍE÷€×EgÕÖùŸÕRK2Ø )ƒ]j3ØÀVo1èd_°àÆ75ÿK™éŸµ’ÚÙŠ-btñ!Ù2XRÕ†;c|Íñ18}eô{[Îò¤FìДÁ.µìN^½#Þ™}YÀ‚}ÿÀè¬Ø2ýsVRË›[Ãó÷É~¤À¢¨ÇøæïÄð»{FÝ£»÷+ó?{¥)Ë`€¦ v¨Í`wòò«aL•Q/úǼ?ýóUÒ”vÏû|öÓ š£¼ã¢^°_ô¿þ7ÑÝûUÑ™[žÿ9+My»4e° @m»ÖÊ­¢êÞŸ}YÀ‚¨Šû¢wÐïç¾JšÊ§|:û1›¬ÚpGŒ¯9~þó«÷Å7Dgõ¶éŸ¥Ò,f° @S»Ôf°;Yõ¾òGÙ—,ˆòþ뢻çËÒ?[%MwƒS>•ý¸€ŸSõÖÇøúÓbpúÊèö¶(vÙ.ý3SÒ¿e° @S»Ôf°;Y /øBö%o8ýÿgïΣö>ë:Ÿ¦e+²£ Î€2ÕÔã=Š+2 (J¨(¢È“4Ý7hº‘Ò%¤mè’’®¤- v¡)mhZZÚš–Pè’Þûò»æ4uœadé}]Ïó|Ÿßý{½ÎyÿO{=¹¿ô>Ÿ$©}ðsÂ瘝fÔ_·8¥ªŠþè ¡ªþ£it÷Õi°ñˆÔ;ë÷RûÈ—„ßFIß;ƒ]JìÍ`w5³[ªùzô~éŒÔZú¤ø»*©Qõ×ýuôÇM0¦ñŽ-i¸yÕ®ß0Ò]¹·ÿï+Õ,ƒ]JìÍ`wáÔùø/Gÿ8@‘ÁV¤ÖÌ¢ð›*©™õ/ù»èA¦Lµs{m]›úë—¦î©û¤Ö²=Ã爐 v(e° @6ƒÝ…Ó`ÃáÑ?§ªRÿò ¿¥’4¸rYô'"5Uµv¤Ñm¥þú%©»ê ©}ÈóÂÙÏ`€R»d3Ø]8w|9úÇ&7¥Þy~G%éÿ4ØpXô'# ]¿•FÛ6¤ÁçJ½³ßžÚGýxøý’4?ìPÊ`€l» £öG~"úGòƺkö ¿£’ôÿço¯àߌGi¼cKn^•úë§îʽSké“Ão•¤˜ v(e° @6ƒÝ…Qÿ3ÿ+úG&3ì¥îéo ¿¡’ô]›Ù- ¯;1ú“€Õƒ_MÛÏJý‹ÿ6uOzMj-Û3þ.IZ0ìPÊ`€l» £Ñ—Fÿ(À7h§îi¯ ¿Ÿ’ô}›Y”†·œý‰ Àªº§Ñ¶i°á°Ô]½ojú‚øû#iAg° @)ƒ]²ì.€xzJÃnô<ñ±îÉ¿?%鉴ÿSÓèî«£?9˜ ƒöããÜÏ$õ>õ©ý‘ÿg$Õ.ƒ]JìÍ`7¾îoŽþ1€'fÔOÝO¾1üvJÒ$µ|fßwcô'(“ÒxÇ–4ܼ*õ×-NÝ•{§ÖþO ¿)’êŸÁ.¥ vÈf°ßð†“¢ à‰uWï~7%)§öá/JÕCwG’ð=T;·§ÑÖµ©¿~é®ÿÏÙ>èÙá·CÒtf° @)ƒ]²ì7³[ª¹7úǾ¿Ñ uOÿø»)Iu–ÿTªÚD¢4^ÕþVÝ~q\¹,uWÿvjú‚ð!©9ìPÊ`€l»±uŽ{eô|U•zkö ¿™’4uNüÅ”ú­èOV€ætÒèžÏ§Á5G§Þ9ïH¾4üHjv»”2Ø ›ÁnlýÏ~8úG¾¯þeÿ~/%i6ëžñ攪qôÇ+ÀôÒø·¤áON½ ß»ë7)·–ìþ¹/Iÿo»”2Ø ›ÁnðÄÛ6DÿÀ÷4¸ö¸ð[)IsQÿ²FÄÔ^µs{m]›úë—¦îê}Sûà焾KÒÊ`€R»d3Ø«}à3R ¢à»Þò©ÔšY~/%i®^ÿñèZ€Ú¨z¤Ñ¶i°iyêý¶Ô>ì…áŸã’”“Á.¥ vÈf°W÷ô7E??|W£»®J­ýŸ~+%iN[ú¤4ºëÊè\€…g4Hã[výƆޚýRgÅ^~#—¤©É`€R»d3Økð/‹~~øwÆß¸%µzvø”¤ù¨}ðsÓø[_‰þèU=øÕ4ܼ*õ×-NÝ•{§ÖþO ÿ|–¤¹Ê`€R»d3ØküÀíÑÏß¡zäë©}ä‹Ão¤$Ígc^žªÎƒÑÁó¢Ú¹=¶®MýõKSwõ¾»~ãBôç°$Íg»”2Ø ›ÁnLí£~,úéà;T½ÿuÇ àNJÒ|×=íu)GÑųªê>”Fw^žW”º§¿)µQøç­$Eg° @)ƒ]²ìÆÔ»àÏ£Ÿþ¯ªJ½³~/ü>JRdýËÿ)úÓ ßx˜Æ;¶¤áæU©wÁ{ÿX3‹Â?[%i¡e° @)ƒ]²ìÆ4¼åœè§€3¸ê€ðÛ(IáÍìæÿ§µQ=øÕ]ãÜþºÅ©»rïÔÚÿ©ñŸ£’Tƒ v(e° @6ƒÝ€–잪η£ŸvÝqÙ®Û~%iÔ>à‡vý • Iµs{m]›úë—¦îê}Sûç…^JR]3Ø ”Á.Ù vç¿Î ¯Ž~vØeüí;Rû g‡ßFIZHuŽù/©êíŒþˆªê>¼kL6¸úàÔ=ãÍ©}ø ÿ\”¤iÊ`€R»d3Øÿú—~ úÙ UýGSçc?~%i!Ö=ãwSªªèj`Ú‡»þTïáæU©wÁ{RgÅ^©5³(ü3P’¦9ƒ]JìÍ`7àKáÛ>ýì4]U¥ÞÙo¿‰’´|îÐèOk`ÊT;·§á-ç¤þºÅ©»rïÔZö´ðÏ:IjZ»”2Ø ›Áî<·d÷]½%Dl8,þ&JÒBoÉîit×UÑÙ@ǹ£[/Hý+>”º§î“Ú=+þsM’d° @1ƒ]²ìÎo~!úÉh¸Ñ=×ì¡EßDIªCíÃ~8UÞýÑ ,pUÿÑ4Ú¶1 6-O½5û¥ÎнÂ?¿$Iß=ƒ]JìÍ`w~ë_úè' Éú­Ô9úeá÷P’êTwÕRªÆÑŸàÀB1¦ñŽ-i¸yUê¯[œ:Ç¿*µf…VI’žX»”2Ø ›Áî<!|Ûg¢Ÿ€ë÷§á·P’êØ`ÃáÑá@jçö4Úº6õ/û`ê®Ü;µ–=-ü3I’”ŸÁ.¥ vÈf°;-Ù=U݇¢Ÿ€†ÝzAü-”¤º¶d4ºçšèr`ŽUÞÿø8wýÒÔ]½ojûÎD’¦.ƒ]JìÍ`wþêœðêèç ¡ªÖŽÔ>ì‡Ão¡$Õ¹ö‘/NUû[ÑéÀ,©ú¦Ñ¶i°iyê­Ù/uVìþ9#Išû v(e° @6ƒÝù«éßG?7MTU©»ú·Ãï $MCý‰›}®53¦ñŽ-i¸yUê¯[œ:Ç¿j×ß‚ý™"Išÿ v(e° @6ƒÝyü2xë…ÑÏ @ ®=.üJÒ45¼îÄèvàë+ixÓé©¿î¯Sç㿜Zû?5ü³C’´02Ø ”Á.Ù vç©™ÝRÕ~ ú¹h˜ñ7·¦Ö²=ãï $MS<}×XªG¿‘F[צþggR÷´×§öÁÏÿœ$-Ø v(e° @6ƒÝù©sÌË£Ÿ€¦©ªÔ=ù×Ão $Mcã_•ÒhýIÍÓo¥Ñ¶i°iyê­Ù/uVìµë7ÈF&H’ê“Á.¥ vÈf°;?õÎÿ³è§ a†7ž~ÿ$iš\¹ôG=L·ñ(wlIÃÍ«RÝâÔ]¹wj-}rø¯}IR½3Ø ”Á.Ù vç§áO‰~j¤ê|;µ}Aøý“¤©nÉiüµ/DäÃÔ¨vnO£­kSýÒÔ=uŸÔZ¶gü¯sIÒÔe° @)ƒ]²ìÎOãn~j¤wÁŸ‡ß>IjBþçTõvFìCíT݇ÓhÛÆ4ØpXê®Þ×o4’$Í[»”2Ø ›ÁîÜ×>ä?¤TUÑO @CŒï½.µf…ß?IjJ½ ÿ"ú£¶~ëñqî¦å©·f¿ÔY±WjÍìþkW’ÔÌ v(e° @6ƒÝ¹¯{úïD?3M1¦Î±¯¿}’Ô¨fvK£;.¾°0Œ‡i|ÿMixýÊÔ;ÿÝ©sìϦ֒=âJ’ô¯ìPÊ`€l»sß`ÃáÑÏ @C ®ùhøÝ“¤&Ö>âGRÕ}(ú À¼«vnO£­kSýÒÔ=uŸÔ:àéá¿%Iú~ìPÊ`€l»óð%ð¶ÑÏ @TÜ›Ú>#üîIRSë]øÞèSsªj?F·_œWŸ|cjúüð_w’$MšÁ.¥ vÈf°;Ç-}RJƒNô3нóþ$þîIR“›Ù-î¸,úÀì Òxû i°iyê­Ù/uVìµëg<ü×™$I…ìPÊ`€l»s[çøŸ~b`üÀm©µdð»'IM¯}Ô¥ª·3ú,ÀdÆ£4Þ±% 7¯Jýu‹SwåÞ©µÿSÂ=I’4ìPÊ`€l»s›¿€ùÐ;ó-á7O’ôxý‹þ2ú,À÷UíÜžF[צþú¥©»zßÔ>ø9á¿n$Iš¯ v(e° @6ƒÝ¹mxÃ'¢Ÿ€)7¾÷zEµ$-¤f¥ÑÝWGŸØ¥ê=’FÛ6¦Á¦å©wöÛRû°Žÿ5"IR`»”2Ø ›ÁîÜ6¾ÿ¦è'`ÊuOÝ'üÞI’¾³ÎG_šÒ }"hšA'î¹æñqî9¸ëç0úׂ$I -ƒ]JìÍ`w[¶gJãaô0ÅFw^ï$Ißµþg?}&˜fãQïØ’†›W¥þºÅ©»rïÔp‘o© IDATÚÿ)á?÷’$-ô v(e° @6ƒÝ¹«{Ò¯D?/Ó¬ªRçÄ_ ¿w’¤ïÑÒ'§ñŽ/G_ ¦Dµs{m]›úë—¦îê}SûàçÄÿŒK’Tà v(e° @6ƒÝ¹«Éû£Ÿ€)6Ürnø­“$}ÿº'½f×o°€IT½GÒhÛÆ4Ø´<õÎ~[jöÂðŸeI’¦%ƒ]JìÍ`wî~éÌèç`šÿtÝc_~ë$I?¸á 'E_ ²a7¿ö…4ØtLêûÎÔYþ“©5³[øÏ­$IÓšÁ.¥ vÈf°;w¿}Gôó0¥Fw\~ç$IO¬öÁÏMUkGôé`!¨Æi¼ãËixã©©¿ö}©s«Ské“ÂF%IjR»”2Ø ›ÁîÜÔ>èÙþê[æL÷Ô}Âo$é‰÷ØŸœJóT;·§ÑÖµ©¿~iê®Þw×x;úgQ’¤¦g° @)ƒ]²ìÎMÝOüjôÓ0¥Æ÷ß~ç$I“7ºóŠèªºïzãÁÕ§î¿›Ú‡¿(ügN’$ýû v(e° @6ƒÝ¹©ñßD?-Sªwî…ß9IÒäuŽ~YJÃ^ôa6Œ‡i¼cKn^•z¼'uVì•Z3‹ÂÆ$IÒÎ`€R»d3Ø›†7žý´L¡ê‘¯§ÖÒ'…ß9IR^ƒ ‡GŸ2T;·§á-ç¤þºÅ©»rïÔÚÿ©á?K’$)/ƒ]JìÍ`wnß·9úi˜BýKÞ~ã$Iùµø¡T=roô9áŒsG[צþú¥©»zßÔ>äyá?7’$iö2Ø ”Á.Ù vç ¥ONiÔ~Z¦LÕ{$µzVü“$Õ;çÑ'…Uõv¦Ñ¶i°iyê­Ù/uVìþó!I’æ6ƒ]JìÍ`wöë÷Êèg` =öרGß8IÒì4ºëÊè³Ò<ãaïØ’†›W¥Þïy|œ;³(ügA’$Ío»”2Ø ›Áîì×;ïO¢Ÿ€i3¤ö‘/¿q’¤Ù©³â§w}¶3wªÛÓð–sRÝâÔ]¹wj-{Zø»K’¤ø v(e° @6ƒÝÙopÍÑÑÏ À”Þtzø}“$Ínþ»aöT;ïK£[/Hý+þ9uOýÍÔ>èÙáï+I’f»”2Ø ›Áî|é{×UÑÏ À”é¬üoá÷M’4»µzVªZߌ>1µSõv¦Ñ]W¦Á†ÃRïÌ·¤ö?þ–’$©>ìPÊ`€l»³_Õ~ úY˜"ãûo ¿m’¤¹©wá_DŸ™…môñÿŒ’$IAìPÊ`€l»³øeï]WE?'S`øÅ“Ãoš$)¶î'ߘwDFƒ4Þ~ClZžzköK{¥ÖÌnáÿ<’$I %ƒ]JìÍ`wöªvn~N¦@÷Ôß ¿i’¤ŒIÆ£4Þ±% 7¯Jýu‹SwåÞ©µôÉáÿ»%I’r»”2Ø ›ÁîìÔ>ð)UUôsPsU뛩µdð»&IНsÂ/|Çc<öG[צþú¥©»zßÔ>èÙáÿ%I’ê–Á.¥ vÈf°;;uŽÿùè§` ®=.ü¦I’N½óþ$uWÿvjúüðÿ-’$IÓÁ.¥ vÈf°;;õÎyGôS0º§üFøM“$I’$iZ3Ø ”Á.Ù vg§ÇþZZ(QuN­¥O¿i’$I’$Mk»”2Ø ›Áîì4üÒÑO @Í=vK¢ï™$I’$IÓœÁ.¥ vÈf°;;·ßý”Ô\ïS¿~Ï$I’$Išæ v(e° @6ƒÝÙ©ê=ý”ÔÙ¨ŸÚ=+üžI’$I’4ÍìPÊ`€l»åµ}~ô3Ps£;¯¿g’$I’$M{»”2Ø ›Ány)ú¨¹þ¥¿g’$I’$M{»”2Ø ›Ány½OýAô3Psc_~Ï$I’$Išö v(e° @6ƒÝòúW|(ú¨±ªµ#µfv ¿g’$I’$M{»”2Ø ›ÁnyÃNŠ~FjlxÓéá·L’$I’¤&d° @)ƒ]²ìú’€X½O¿+ü–I’$I’Ô„|— @)ƒ]²ì–W=øÕèg ÆÚGühø-“$I’$© ìPÊ`€l»…-Ù#¥Ñ ú¨©Ç~ÓGø-“$I’$©!ìPÊ`€l»eµ?òÑO@ 7¯ ¿e’$I’$5%ƒ]JìÍ`·¬î)¯~Bj¬wá{Ão™$I’$IMÉ`€R»d3Ø-«÷é?Ž~Bj¬³â§Ão™$I’$IMÉ`€R»d3Ø-«ÿÙ™è' ¦ªÎƒ©5³(ü–I’$I’Ô” v(e° @6ƒÝ²†×¯Œ~BjjtÛEáwL’$I’¤&e° @)ƒ]²ì~Á{ûÅÑO@Mõ?ûáð;&I’$IR“2Ø ”Á.Ù vËïØý„ÔTwÕo…ß1I’$I’š”Á.¥ vÈf°[VÕ{$ú ¨©öa/ ¿c’$I’$5)ƒ]JìÍ`7¿öψ~>jªzäÞð;&I’$IRÓ2Ø ”Á.Ù vóë¬øéèç ¦F[/ ¿c’$I’$5-ƒ]JìÍ`7¿îª7D?5Õ_¿4üŽI’$I’Ô´ v(e° @6ƒÝüzç¿;úù¨©îéo ¿c’$I’$5-ƒ]JìÍ`7¿ÇþtDÈÑ>êÇÃï˜$I’$IMË`€R»d3ØÍopíñÑÏ@ Ú©5³(üŽI’$I’Ô´ v(e° @6ƒÝ‚/wo=?úù¨¡ñö/†ß0I’$I’š˜Á.¥ vÈf°›ßøk_ˆ~>jhxÓéá7L’$I’¤&f° @)ƒ]²ìæW=twôóPCý+þ9ü†I’$I’ÔÄ v(e° @6ƒÝüÒ ý|ÔP÷Ìÿ~Ã$I’$Ijb»”2Ø ›Án^탟ýtÔT瘗‡ß1I’$I’š˜Á.¥ vÈf°›×cc+˜Øx”ZKŸ~Ç$I’$Ijb»”2Ø ›Án^ÝS^ýtÔPõð=á7L’$I’¤¦f° @)ƒ]²ìæÕ;çÑO@ î¾:ü†I’$I’ÔÔ v(e° @6ƒÝ¼úÿMôÓPCÃO ¿a’$I’$55ƒ]JìÍ`7¯ÁUF?5Ô_¿$ü†I’$I’ÔÔ v(e° @6ƒÝ¼†×ýtÔPoÍÿ¿a’$I’$55ƒ]JìÍ`7¯á–5ÑO@ uOú•ð&I’$IRS3Ø ”Á.Ù v3¿Ø½ëªè§ †ÚG¾8ü†I’$I’ÔÔ v(e° @6ƒÝ¼Æ;¶D?uSSkÉá7L’$I’¤¦f° @)ƒ]²ìæU=úè§ f»Ñ÷K’$I’¤&g° @)ƒ]²ìf4³[JãaôÓP3ãû6Çß0I’$I’œÁ.¥ vÈf°;y탟ýlÔÐè+—„ß0I’$I’šœÁ.¥ vÈf°;y£_ýlÔÐðÆÓÂo˜$I’$IMÎ`€R»d3ؼΉ¿ýlÔÐàs‡„ß0I’$I’šœÁ.¥ vÈf°;yÝÓ^ýlÔPÝâð&I’$IR“3Ø ”Á.Ù v'¯÷©ß~6j¨wöÛÃo˜$I’$IMÎ`€R»d3ؼޅï~6j¨{ò¯‡ß0I’$I’šœÁ.¥ vÈf°;yýË>ýlÔP縟 ¿a’$I’$59ƒ]JìÍ`wòŸ;$úÙ¨¡öQ?~Ã$I’$Ijr»”2Ø ›Áîä ®=>úÙ¨¡öÏ ¿a’$I’$59ƒ]JìÍ`wò†_:3úÙ¨›ñ(µfv ¿a’$I’$59ƒ]JìÍ`7ãKÝÛ/Ž~6j¦j+ü~I’$I’Ôô v(e° @6ƒÝÉmSô³P3ãoß~¿$I’$Ijz»”2Ø ›Áîä¿qKô³P3ã{¯¿_’$I’$5=ƒ]JìÍ`wòª‡îŽ~6jftçá÷K’$I’¤¦g° @)ƒ]²ìN^Õ~ úÙ¨™Ñ­ç‡ß/I’$I’šžÁ.¥ vÈf°;yiØ~6jfø¥3Âï—$I’$IMÏ`€R»d3ذ%{D?54¼áñ7L’$I’¤†g° @)ƒ]²ìNVû gG?54øÂŠð&I’$IRÓ3Ø ”Á.Ù v'«}ÄF?54ØpXø “$I’$©éìPÊ`€l»“Õ9æåÑO@ õ×/ ¿a’$I’$5=ƒ]JìÍ`w²:'¼:úɨ¡þeÿ~Ã$I’$Ijz»”2Ø ›ÁîduOþµè' †úýUø “$I’$©éìPÊ`€l»“Õý䣟 €êÿgá7L’$I’¤¦g° @)ƒ]²ìNVïÌ·D?5Ô;÷á7L’$I’¤¦g° @)ƒ]²ìNVïœ?Œ~2j¨wÎ;Âo˜$I’$IMÏ`€R»d3جÞyýdÔPïì·‡ß0I’$I’šžÁ.¥ vÈf°;Yýµï‹~2j¨wÖ[Ão˜$I’$IMÏ`€R»d3جþ%ï~2j¨{Æ›Ão˜$I’$IMÏ`€R»d3جþŠ~2j¨{úï„ß0I’$I’šžÁ.¥ vÈf°;Yƒ+—E?5ÔýäÃo˜$I’$IMÏ`€R»d3جÁ†Ã¢Ÿ €êžöúð&I’$IRÓ3Ø ”Á.Ù v'k°iyô“PCÝS÷ ¿a’$I’$5=ƒ]JìÍ`w²†×ýdÔP÷”׆ß0I’$I’šžÁ.¥ vÈf°;YÃë?ýdÔÁ®$I’$IñìPÊ`€l»“5¼áÑO@ uO{]ø “$I’$©éìPÊ`€l»“5üâ)ÑO@ uWýVø “$I’$©éìPÊ`€l»“5¼ñ´è' †º«÷ ¿a’$I’$5=ƒ]JìÍ`w²†7­Ž~2j¨{Æï†ß0I’$I’šžÁ.¥ vÈf°;YÃ/ýdÔP﬷†ß0I’$I’šžÁ.¥ vÈf°;YÛϊ~2j¨wöÛÃo˜$I’$IMÏ`€R»d3جá-çD?5Ô;çá7L’$I’¤¦g° @)ƒ]²ìNÖpËšè' †zç¾3ü†I’$I’Ôô v(e° @6ƒÝ ¿ÐýòyÑO@ õ>ý®ð&I’$IRÓ3Ø ”Á.Ù v'üB÷Ö ¢Ÿ €êÿîð&I’$IRÓ3Ø ”Á.Ù v'üB÷¶‹¢Ÿ €ê_ôWá7L’$I’¤¦g° @)ƒ]²ìNø…îí뢟 €ê_úð&I’$IRÓ3Ø ”Á.Ù v'üB÷+—D?5Ô_¿$ü†I’$I’Ôô v(e° @6ƒÝ ¿Ð½óòè' †Ÿ;$ü†I’$I’Ôô v(e° @6ƒ]_è0÷×|4ü†I’$I’Ôô|¿ @)ƒ]²ìNø…î]WF?54¼î„ð&I’$IRÓ3Ø ”Á.Ù v'üB÷îÏE?54¼ñÔð&I’$IRÓ3Ø ”Á.Ù v'üBwÛÆè' ††7Ÿ~Ã$I’$Ijz»”2Ø ›Áî„_èÞóùè' †F[/ ¿a’$I’$5=ƒ]JìÍ`wÂ/t·mˆ~2jhtÇeá7L’$I’¤¦g° @)ƒ]²ìúB€¹7Ú¶1ü†I’$I’Ôô|¿ @)ƒ]²ìNø…î—F?54¾osø “$I’$©éìPÊ`€l»~¡{ÛEÑO@ U~5ü†I’$I’Ôô v(e° @6ƒÝ ¿ÐýòyÑO@ UíÂo˜$I’$IMÏ`€R»d3جá-ŸŠ~2êhÔ¿a’$I’$5=ƒ]JìÍ`w²†7ýdÔTkÿ§†ß1I’$I’šœÁ.¥ vÈf°;YÃO‹~2jª}è Âï˜$I’$IMÎ`€R»d3جá 'E?5ÕùèKÃï˜$I’$IMÎ`€R»d3جÁµÇG?5Õ9þçÃï˜$I’$IMÎ`€R»d3جÁ¦c¢Ÿ €šêžükáwL’$I’¤&g° @)ƒ]²ìNÖàóGE?5Õ=ýMáwL’$I’¤&g° @)ƒ]²ìNÖàs‡F?5Õ;÷áwL’$I’¤&g° @)ƒ]²ìNÖàÊeÑO@Mõ×¾/üŽI’$I’Ôä v(e° @6ƒÝÉêv&úɨ©ÇnHô“$I’$©ÉìPÊ`€l»“Õ¿ü£Ÿ €š\stø“$I’$©ÉìPÊ`€l»“Õ¿ä €šn^~Ç$I’$Ijr»”2Ø ›Áîdõ×-Ž~2jjtÛgÂï˜$I’$IMÎ`€R»d3جþÚÿýdÔÔøk›Âï˜$I’$IMÎ`€R»d3جÞýdÔÔøÛÃï˜$I’$IMÎ`€R»d3جޚý¢Ÿ €šªÚ„ß1I’$I’šœÁ.¥ vÈf°;Y½3ßýdÔÕx”Z3‹Âo™$I’$IMÍ`€R»d3جîi¯~2j¬}ðsÂo™$I’$IMÍ`€R»d3جîI¯‰~2j¬óÑ—†ß2I’$I’ššÁ.¥ vÈf°;Yã~.úɨ±Î‰¿~Ë$I’$Ijj»”2Ø ›ÁîduŽ~Yô“PcÝU¿~Ë$I’$Ijj»”2Ø ›ÁîdµQô“Pc½5û…ß2I’$I’ššÁ.¥ vÈf°;YíŸýdÔXÿÒ¿¿e’$I’$55ƒ]JìÍ`w–ìýdÔØ`ã‘ñ·L’$I’¤†f° @)ƒ]²ìN^v£Ÿ €šnþdø“$I’$©©ìPÊ`€l»“Wµ¿ýlÔÔèŽËÂï˜$I’$IMÍ`€R»d3ؼêá{¢Ÿ €šßSø“$I’$©©ìPÊ`€l»“7Þñåèg ¦ªGï¿c’$I’$55ƒ]JìÍ`wòÆ÷^ýlÔÕx”Z3‹Âo™$I’$IMÌ`€R»d3ØÍøR÷®+£Ÿ €kúüð[&I’$IR3Ø ”Á.Ù v3¾Ô½í¢èg Æ:û™ð[&I’$IR3Ø ”Á.Ù v'oxóÙÑÏ@uOùð[&I’$IR3Ø ”Á.Ù v'oxÃ'¢Ÿ €ëó‡á·L’$I’¤&f° @)ƒ]²ìNÞ`Ó1ÑÏ@õ/þÛð[&I’$IR3Ø ”Á.Ù v'opõÁÑÏ@ 6~Ë$I’$Ijb»”2Ø ›Áîäõ¯øPô³PcÛV‡ß2I’$I’š˜Á.¥ vÈf°;yý‹þ2úÙ¨±Ñ]W†ß2I’$I’š˜Á.¥ vÈf°;y½sÞýlÔØøÛÃo™$I’$IMÌ`€R»d3ؼîª7D?uÖo…ß2I’$I’š˜Á.¥ vÈf°;y1úÙ¨¹öAÏ ¿g’$I’$5-ƒ]JìÍ`wò:G¿,úÙ¨¹ÎнÂï™$I’$IMË`€R»d3ؼö!Ï‹~6j®{ê>á÷L’$I’¤¦e° @)ƒ]²ìf´d÷”ªqôÓPc½O¿+þžI’$I’Ô° v(e° @6ƒÝ¼ªîCÑO@õ¯øPø-“$I’$©iìPÊ`€l»yUÞýtÔØàÚãÂo™$I’$IMË`€R»d3ØÍk¼ý†è§ ÆF·^~Ë$I’$IjZ»”2Ø ›Ánæ»w^ýtÔØøÞëÃo™$I’$IMË`€R»d3ØÍkx˧¢Ÿ€«vÞ~Ë$I’$IjZ»”2Ø ›Án^ÃëNŒ~:êlò%á÷L’$I’¤&e° @)ƒ]²ìæÕ¿ôÑO@ÍuOzMø=“$I’$©IìPÊ`€l»yõÎwôÓPs½sÿ(üžI’$I’Ô¤ v(e° @6ƒÝ¼zg¾%ú騹þåÿ~Ï$I’$IjR»”2Ø ›Án^Ý“=ú騹áu'†ß3I’$I’š”Á.¥ vÈf°›WçØWD?57ºýâð{&I’$IR“2Ø ”Á.Ù vójù’è§ æÆ;¾~Ï$I’$IjR»”2Ø ›Án^í~(ú騻~+üžI’$I’Ô¤ v(e° @6ƒÝüZ@‰öÁÏ ¿g’$I’$5%ƒ]JìÍ`7¿êÁ»¢Ÿ€šë÷Êð{&I’$IRS2Ø ”Á.Ù vóí ÑÏ@ÍuÏxsø=“$I’$©)ìPÊ`€l»_îÞzAôóPsýu‹Ãï™$I’$IMÉ`€R»d3ØÍox݉ÑÏ@Í >Tø=“$I’$©)ìPÊ`€l»ù ®\ý|ÔÜp˹á÷L’$I’¤¦d° @)ƒ]²ìæ×_û¾èç æÆ÷^~Ï$I’$IjJ»”2Ø ›Án~½³Þý|Ô\Õúfø=“$I’$©)ìPÊ`€l»ùuOzMôó0Ú>#ü¦I’$I’Ô„ v(e° @6ƒÝü:G¿,úù˜c6ü¦I’$I’Ô„ v(e° @6ƒÝüÚ>3úù˜Ý3Þ~Ó$I’$IjB»”2Ø ›ÁnYiЉ~Bj®ÉûÃï™$I’$IMÈ`€R»d3Ø-«zh[ôPsƒùXø=“$I’$© ìPÊ`€l»e¿~môPs£Û×…ß3I’$I’šÁ.¥ vÈf°[øïÖ £Ÿ€šóÖð{&I’$IR2Ø ”Á.D™Á IDATÙ vË^¿2ú ¨»a7µf…ß4I’$I’¦=ƒ]JìÍ`·¬ÁUF?!S }Ä„ß4I’$I’¦=ƒ]JìÍ`·¬þEý„LîI¿~Ó$I’$Išö v(e° @6ƒÝ²zg¿-ú ˜½O¿+ü¦I’$I’4íìPÊ`€l»eu?ñ«ÑOÀ\¹øM“$I’$iÚ3Ø ”Á.Ù vËê,ÿÉè'` oZ~Ó$I’$Išö v(e° @6ƒÝ–íý„LÑ=Ÿ¿i’$I’$My»”2Ø ›ÁnyUçÛÑÏ@ÍU;ï ¿g’$I’$M{»”2Ø ›Ányãû¿ýŒÔ]U¥ÖO¿i’$I’$Ms»”2Ø ›Áî,|É{Ûg¢Ÿ€)Ð9ögÃoš$I’$IÓœÁ.¥ vÈf°[Þ𺣟€)Ð;ë­á7M’$I’¤iÎ`€R»d3Ø-¯ÿÙG?#S ù?†ß4I’$I’¦9ƒ]JìÍ`·¼Þ§ÿ8ú˜Ã/ž~Ó$I’$Išæ v(e° @6ƒÝòº§îýŒLѶ á7M’$I’¤iÎ`€R»d3Ø-¯³ü§¢Ÿ€)P=zøM“$I’$iš3Ø ”Á.Ù vg¡žýŒL‰öψ¿k’$I’$Mi»”2Ø ›ÁîìTuŒ~J¦@ç¸W†ß4I’$I’¦5ƒ]JìÍ`wvãæè§` ôÎ~{øM“$I’$iZ3Ø ”Á.Ù vgé‹ÞÛ×E?%S Å?‡ß4I’$I’¦5ƒ]JìÍ`wv^ÿñè§ä³wïÁ—×õ}ÇgAÑ¥&Ó4Rئc£icŒV3NjÆ[.šiŒ×©&:©ÆK[µ6&Zg~»À¢²°@nŠ,7¹ƒì¢(‚ Âr1Üa¹¥”«ÜE`ýûåÛÙÎÐa(—åó9ç÷>ç}™çÿË|?3ïÙà mæßàŠ£Âoš$I’$IY3Ø –Á.Å v'SïKÑŸ€†·_~Ó$I’$IÊšÁ.µ v(f°;™ºßú«èO @ãåûÃoš$I’$IY3Ø –Á.Å v'SçÈ·EJ’híùÂð»&I’$IRÆ v¨e° @1ƒÝÉÔ>àÑŸ€$Ú‡¾6ü®I’$I’”1ƒ]jìPÌ`w2µöx~ô§ ‰îÉÿ)ü®I’$I’”1ƒ]jìPÌ`wr;ENè»&ü¦I’$I’”1ƒ]jìPÌ`wrî½&úsÀàêãÃoš$I’$I3Ø –Á.Å v'øcï gDNÝuyøM“$I’$)c»Ô2Ø ˜Áîäê_t@ôç ƒÞr³¼´*ü®I’$I’”-ƒ]jìPÌ`wrõ¾ûߣ?'I´öùõð»&I’$IR¶ v¨e° @1ƒÝÉÕ9îÏ¢?'ItŽ|[ø]“$I’$)[»Ô2Ø ˜ÁîäjôªèÏ @½ï|*ü®I’$I’”-ƒ]jìPÌ`wrµÖ¾ úsDÿ’ƒÂïš$I’$IÙ2Ø –Á.Å v'Û¸ý`ô' mÿ1ú¦I’$I’”-ƒ]jìPÌ`w²îº,ú“Àø‘;Ãoš$I’$IÙ2Ø –Á.Å v'Û`Ë)ÑŸ€ Æã¦µvçð»&I’$IR¦ v¨e° @1ƒÝÉÖ¿`ïèO @íC^~×$I’$IÊ”Á.µ v(f°;Ùzg|2ú“D÷”†ß5I’$I’2e° @-ƒ]ŠìN¶ÎÑýIH¢ÿÃ=Âïš$I’$I™2Ø –Á.Å v'[û€ßŒþ¤$1¸öäð»&I’$IR¦ v¨e° @1ƒÝ ·Ûs›f<Žþ¬$0º÷šø»&I’$IR¢ v¨e° @1ƒÝÉ7Þzwôg ƒA§Y^½cø]“$I’$)K»Ô2Ø ˜Áî~ô½ýÂèÏ @­}ÿUø]“$I’$)K»Ô2Ø ˜Áîä\õÍèÏ @cÞ~×$I’$IÊ’Á.µ v(f°;ùú?\ýYH¢wÖçÂïš$I’$IY2Ø –Á.Å v'_÷ôDV’\~Dø]“$I’$)K»Ô2Ø ˜Áîäëlxsôg ‰Ñ‡ß5I’$I’²d° @-ƒ]ŠìN¾Öú—EV’wi–—V…ß6I’$I’2d° @-ƒ]ŠìN¡¥šfЉþ´$ÑÚç×ão›$I’$I 2Ø –Á.Å v§Óèþë£?-ItŽú£ð»&I’$IR† v¨e° @1ƒÝ)ýð{æèO @½ï~6ü®I’$I’”!ƒ]jìPÌ`w:õ7¯þ´$1¸ìðð»&I’$IR† v¨e° @1ƒÝéÔÝôñèO @ÃÛ/ ¿k’$I’$eÈ`€Z»3ØN#ÞýiHbÜy¸Y^Z~Û$I’$Iš÷ v¨e° @1ƒÝéÔÚû%ÑŸ€DZ{¿8ü¶I’$I’4ïìPË`€b»SjiUÓô–£?/ItŽ|[üm“$I’$iÎ3Ø –Á.Å v§×èÞk¢?/IôÎüLø]“$I’$iÞ3Ø –Á.Å v§×àºÓ¢?/I .ýZø]“$I’$iÞ3Ø –Á.Å v§Wÿü½¢?/I o» ü®I’$I’4ïìPË`€b»Ó«{úG¢?/IŒÛ?¿k’$I’$Í{»Ô2Ø ˜Áîôê|ãÑŸ€DZëv ¿m’$I’$Ís»Ô2Ø ˜Áîôjíõ¢èÏ @" o ¿m’$I’$Ís»Ô2Ø ˜Áîtw·Fb’èùéð»&I’$IÒ.ü¶I’$I’4ìPË`€b»+_û WEvÝ·%ü¶I’$I’4ìPË`€b»íöœ¦ ¢?=YŒÍònÏ¿o’$I’$Íx»Ô2Ø ˜ÁnL£û¯þô$Ò>äwÃo›$I’$I³žÁ.µ v(f°ÓàÚ“£?=‰t¿õWá·M’$I’¤YÏ`€Z»3Ø©wîšèO@"ý ÿ>ü¶I’$I’4ëìPË`€b»1uOxwô§ ‘á-ç…ß6I’$I’f=ƒ]jìPÌ`7¦öþ/þô$2n?~Û$I’$Išõ v¨e° @1ƒÝ VïØ4ývôç ‘Ö>/¿o’$I’$Íp»Ô2Ø ˜Án\£».þü$Ò9îÏÂo›$I’$I³œÁ.µ v(f°×àÊ££??‰ôÎ]~Û$I’$Išå v¨e° @1ƒÝ¸zßÿ»èÏ@"Ãë7†ß6I’$I’f9ƒ]jìPÌ`7®Î1oþü$2~è¶ðÛ&I’$IÒ,g° @-ƒ]ŠìÆÕÚç¥ÑŸ€dZîº$I’$IOšÁ.µ v(f°ØÒªfÜþyô ‘Ά7Çß7I’$I’f4ƒ]jìPÌ`7øâ[ýH¤÷½¿ ¿m’$I’$Íj»Ô2Ø ˜Ánlý‹Œ~$2¸êØðÛ&I’$IÒ¬f° @-ƒ]ŠìÆÖ=ý#ÑO€DF÷m ¿m’$I’$Íj»Ô2Ø ˜ÁnlíC_ýÈd4l–w^ø}“$I’$i3Ø –Á.Å vƒÛýŸ4Íhý H¤}Øëâï›$I’$I3˜Á.µ v(f°ßèþ룟‰t7~,ü¶I’$I’4‹ìPË`€b»ñ ®9!úÈà ¿m’$I’$Íb»Ô2Ø ˜Án|½³¿ý HdtÇÅá·M’$I’¤YÌ`€Z»3دsÌÛ£Ÿ™ô[ÍòêÃï›$I’$I³–Á.µ v(f°_kïG?’iðŠðû&I’$IÒ¬e° @-ƒ]ŠìÎFãÖÑO€Dº' ü¶I’$I’4kìPË`€b»³ÑðŸýH¤ÁÞá·M’$I’¤YË`€Z»3ØúîýHdxó9á·M’$I’¤YË`€Z»3غ§}8ú)ȸõ³ðÛ&I’$IÒ¬e° @-ƒ]ŠìÎFíƒ'ú)Lkï—„ß7I’$I’f)ƒ]jìPÌ`wFZ³SÓ {ÑÏ€D:ßüñ÷M’$I’¤Ê`€Z»3ØF÷^ýH¤Þná·M’$I’¤YÊ`€Z»3ØW}3ú9ÈðÆo‡ß6I’$I’f)ƒ]jìPÌ`wvêõ·ÑÏ€DÆ[ï ¿m’$I’$ÍR»Ô2Ø ˜ÁîìÔ9꣟ɴÖí~ß$I’$Iš• v¨e° @1ƒÝÙ©µ×¯E?’éûŽðû&I’$IÒ¬d° @-ƒ]ŠìÎVã­wG? éý`)ü¶I’$I’4+ìPË`€b»³ÕðÆïD? ^¿1ü¶I’$I’4+ìPË`€b»³Uÿ‡k£Ÿ‰Œ¾#ü¶I’$I’4+ìPË`€b»³U÷øwE? ’i}埇ß7I’$I’f!ƒ]jìPÌ`w¶jíû/£ŸÉtŽþãðû&I’$IÒ,d° @-ƒ]ŠìÎXK«šqûÁèg@"½s¾ß$I’$Iš v¨e° @1ƒÝÙkxËyÑÏ€D[N ¿m’$I’$ÍB»Ô2Ø ˜ÁîìÕß¼oô³ ‘ñC·†ß6I’$I’f!ƒ]jìPÌ`wöêžòÑÏ€dZî½$I’$I»T3Ø ˜ÁîìÕ>ð•ÑÏ€d:G¾5ü¾I’$I’Á.µ v(f°;ƒ­Þ±iú­è§@"½ï>þ¾I’$I’œÁ.µ v(f°;›î¼$úiÈàÚ“Âo›$I’$IÑìPË`€b»³Yÿ'‡D? =xsøm“$I’$):ƒ]jìPÌ`w6ënüëè§@&ãqÓúÒ/‡ß7I’$I’"3Ø –Á.Å vg³ö¡¯~$Ó9âMá÷M’$I’¤È v¨e° @1ƒÝm·ç4Ͱý<H¤wÖçâï›$I’$IìPË`€b»³Ûèž«£Ÿ‰ ®>>ü¶I’$I’™Á.µ v(f°;» ®8*úyÈèÃo›$I’$I‘ìPË`€b»³[ïÌÏD?2›Öž/ ¿o’$I’$Ee° @-ƒ]ŠìÎno¼1úyLgÛÃï›$I’$IQìPË`€b»³[kíÎM3E?é}ÿóá÷M’$I’¤¨ v¨e° @1ƒÝÙnôÀMÑO€D[N ¿m’$I’$Ee° @-ƒ]ŠìÎvƒ«‹~"$2~øöðÛ&I’$IRT»Ô2Ø ˜Áîl×ûÞÿˆ~"$ÓÚëEá÷M’$I’¤ˆ v¨e° @1ƒÝÙ®ó7F?’éûŽðû&I’$IRD»Ô2Ø ˜Áîl×ÚãùM3F?韷[ø}“$I’$)"ƒ]jìPÌ`wöÝw]ô3 ‘áMg†ß6I’$I’"2Ø –Á.Å vg¿Á•GG?/ß~Û$I’$IŠÈ`€Z»3Øýzg~:ú™Lký®á÷M’$I’¤•Î`€Z»3ØýÚ_Cô3 ™î ï ¿o’$I’$­t»Ô2Ø ˜Áî´ûóšf4ˆ~*$Ò?]ü}“$I’$i…3Ø –Á.Å vç£Ñ½×D?Þr^øm“$I’$i¥3Ø –Á.Å vç£Á墟 ‰Œ»[›å¥Âï›$I’$I+™Á.µ v(f°;õ¾ý_£Ÿ É´øÍðû&I’$IÒJf° @-ƒ]ŠìÎGíÃ^ýTH¦{ê_†ß7I’$I’V2ƒ]jìPÌ`wNÚí¹M3ìG?é_|`ü}“$I’$i3Ø –Á.Å vç§ÑÝWD?Ýqqøm“$I’$i%3Ø –Á.Å vç§Á¥_~.d2è4Ëkž~ß$I’$IZ© v¨e° @1ƒÝù©»éãÑÏ€dÚ¿:ü¾I’$I’´RìPË`€b»óSû×D?’énüXø}“$I’$i¥2Ø –Á.Å vç¨5Ïþ¿ÿ÷å0)ƒË¿o’$I’$­P»Ô2Ø ˜Áî|5úé?D?ÝsUøm“$I’$i¥2Ø –Á.Å vç«þO‰~2d26Ë{üRø}“$I’$i%2Ø –Á.Å vç«îé‰~2$ÓþúÂï›$I’$I+‘Á.µ v(f°;_µzUô“ ™Þ™Ÿ ¿o’$I’$­D»Ô2Ø ˜ÁzǦ鷢Ÿ ‰ ®úfü}“$I’$i2Ø –Á.Å vç¯ÑE?=pSøm“$I’$i%2Ø –Á.Å vç¯þÅF?2›Öž/ ¿o’$I’$M;ƒ]jìPÌ`wþêžöáèg@2 o ¿o’$I’$M;ƒ]jìPÌ`wþjø[ÑÏ€dzg!ü¾I’$I’4í v¨e° @1ƒÝ9li‡fÜÝýtHdpÝiñ÷M’$I’¤)g° @-ƒ]ŠìÎgÃÛÎ~:$2~øŽðÛ&I’$IÒ´3Ø –Á.Å vç³þ…ûE?’i­Û%ü¾I’$I’4Í v¨e° @1ƒÝù¬{Ê£ŸÉtŽýÓðû&I’$IÒ43Ø –Á.Å vç³öþÿ&úéLÿ¼ÝÃï›$I’$IÓÌ`€Z»3ØÓ–V5ãÎCÑÏ€D†7}7þ¾I’$I’4Å v¨e° @1ƒÝùmxËyÑÏ€DÆ­Âo›$I’$IÓÌ`€Z»3Øßúìý|H¦µþeá÷M’$I’¤ie° @-ƒ]ŠìÎoÝ“Þý|H¦{â{Ãï›$I’$IÓÊ`€Z»3ØßÚûýFôó ™mÿëíÑ÷M’$I’¤ie° @-ƒ]ŠìÎqK«šqëgÑO€D†·ü0þ¾I’$I’4¥ v¨e° @1ƒÝùnxóÙÑO€DÆÝ­ÍòÒá÷M’$I’¤id° @-ƒ]ŠìÎwý9ú Lû€W„ß7I’$I’¦‘Á.µ v(f°;ßuOxwô ™î© ¿o’$I’$M#ƒ]jìPÌ`w¾k­ß5ú Lÿ’¯†ß7I’$I’¦‘Á.µ v(f°;ÿqoô3 ‘Ñ—„ß6I’$I’¦‘Á.µ v(f°;ÿ o8#úÉ Û,¯Ù)ü¾I’$I’4é v¨e° @1ƒÝù¯÷ƒ¥èg@2íC~7ü¾I’$I’4é v¨e° @1ƒÝù¯sÔE?#’énúxø}“$I’$iÒìPË`€b»ó_ëK¿Ò4ãqôS ‘ÁåG„ß7I’$I’&Á.µ v(f°›£Ñ7E?%Ý·%ü¶I’$I’4é v¨e° @1ƒÝ ®:6ú)ÉxÔ´Öî~ß$I’$Išd»Ô2Ø ˜ÁnŽzg~:ú)LgÃ[Âï›$I’$I“Ì`€Z»3ØÍQûk¿ý”H¦wÎÃï›$I’$I“Ì`€Z»3ØMÒnÏišA7ú9Èð†Mñ÷M’$I’¤ f° @-ƒ]ŠìæiôÓK£Ÿ‰Œ—ï ¿m’$I’$M2ƒ]jìPÌ`7OýŸýœH¦µ~×ðû&I’$IÒ¤2Ø –Á.Å vóÔ=íÃÑÏ €dº'¾/ü¾I’$I’4© v¨e° @1ƒÝ<µxEôs ™þæ}Ãï›$I’$I“Ê`€Z»3ØMÔÒªfÜy(úIÈðöÍñ÷M’$I’¤ e° @-ƒ]ŠìæÊÎLT¿Ý,¯Ù)ü¾I’$I’4‰ü~ @-ƒ]Šìæªÿã/G?)’iòšðû&I’$IÒ$2Ø –Á.Å vsÕ9îÑO €dzgü—ðû&I’$IÒ$2Ø –Á.Å vsÕZ·Kô“ ™Á•G‡ß7I’$I’&‘Á.µ v(f°›¯ñ#wF?+=pcøm“$I’$iìPË`€b»ù\wZô³ “ñ¸i}é—Ãï›$I’$IµìPË`€b»ùêý…èg@2£þ0ü¾I’$I’T›Á.µ v(f°›¯Î†7G?+’é»:ü¾I’$I’T›Á.µ v(f°›¯ÖÚ4Íhý´ã$ëp IDATHdxÓ™á÷M’$I’¤Ú v¨e° @1ƒÝœîÛý´HdÜúY³¼´*ü¾I’$I’T“Á.µ v(f°›³Á墟ɴ÷ûðû&I’$IRM»Ô2Ø ˜ÁnÎzg|2úiL÷ä„ß7I’$I’j2Ø –Á.Å vsÖ>ä5ÑO €dú~ß$I’$IªÉ`€Z»3ØMÚšg7M¿ý¼Hdtç%ñ÷M’$I’¤Š v¨e° @1ƒÝ¼î¸(úyÉ Û,ïöœðû&I’$IRi»Ô2Ø ˜ÁnÞúíý¼H¦}ØëÃï›$I’$I¥ìPË`€b»yëžüèç@2½3?~ß$I’$I*Í`€Z»3ØÍ[{¿ý¼Hfp͉á÷M’$I’¤Ò v¨e° @1ƒÝÄ-­jÆ­ŸE?1?|{ü}“$I’$©0ƒ]jìPÌ`7wÃü^ô ™ÖÞ/¿o’$I’$•d° @-ƒ]Šìæ®ÞîÑO €dºÇ¿+ü¾I’$I’T’Á.µ v(f°›»Î±ïˆ~b$Ó¿`Ÿðû&I’$IRI»Ô2Ø ˜ÁnîZ_ùÕè'@2ÃÛ7‡ß7I’$I’J2Ø –Á.Å vó7þù-ÑÏ €LfyÍNá÷M’$I’¤gšÁ.µ v(f°›¿Á5'F?3’iúïÃï›$I’$IÏ4ƒ]jìPÌ`7½ïýMô3 ™Þ™Ÿ¿o’$I’$=Ó v¨e° @1ƒÝüuÿýèg@2ƒkN¿o’$I’$=Ó v¨e° @1ƒÝh÷ç5ÍhýÔHdüЭñ÷M’$I’¤g˜Á.µ v(f°»î¾2ú©LkÝ.á÷M’$I’¤g’Á.µ v(f°» .ýZôS ™Îñ~ß$I’$Iz&ìPË`€b»‹Q÷[ÿ9ú©Lÿ‚½Ãï›$I’$IÏ$ƒ]jìPÌ`w1jõßF?5’Þv~ø}“$I’$é™d° @-ƒ]Šì.HK;4ãî#ÑÏ €LúífyÍNñ7N’$I’¤íÌ`€Z»3Ø]œ†·œýÜH¦}èkÃï›$I’$IÛ›Á.µ v(f°»8õü•èç@2½ï|*ü¾I’$I’´½ìPË`€b»‹Sçø?~n$3¸ú¸ðû&I’$IÒöf° @-ƒ]Šì.N­u»D?7’ÿü–ðû&I’$IÒöf° @-ƒ]Šì.VãGîŒ~r$ÓÚëEá÷M’$I’¤íÉ`€Z»3Ø]¬[N~r$Ó9îá÷M’$I’¤íÉ`€Z»3Ø]¬zßÿ»è'@2ýó×…ß7I’$I’¶'ƒ]jìPÌ`w±ê|ã¢ŸÉ oýqø}“$I’$i{2Ø –Á.Å v¬=~©iFƒèg@&ýv³¼f§ø'I’$IÒÓd° @-ƒ]Šì.^£{¯‰~v$Ó>ìõá÷M’$I’¤§Ë`€Z»3Ø]¼—ýìH¦÷Ýφß7I’$I’ž.ƒ]jìPÌ`wñêžþÑèg@2ƒ-§„ß7I’$I’ž.ƒ]jìPÌ`wñjôÛÑÏ€dÆ[ï ¿o’$I’$=]»Ô2Ø ˜Áî¶zÇfÜÝýôH¦µþeñ7N’$I’¤§È`€Z»3Ø]̆·þ(úéL÷”†ß7I’$I’ž*ƒ]jìPÌ`w1럿.úéLÿ’ƒÂï›$I’$IO•Á.µ v(f°»˜uOxwôÓ ™ÑÝW†ß7I’$I’ž*ƒ]jìPÌ`w1kíý’è§@6£aÓZ»sø“$I’$éÉ2Ø –Á.Å v·ñ#?~~$Ó9ò­á÷M’$I’¤'Ë`€Z»3Ø]܆×}+úùLïÜÕá÷M’$I’¤'Ë`€Z»3Ø]Üzg!úùÌð~ß$I’$Iz² v¨e° @1ƒÝÅ­sÄ›¢ŸÉŒ»4Ë«w ¿q’$I’$=Q»Ô2Ø ˜ÁîâÖZû‚¦ £Ÿ É´úíð'I’$IÒe° @-ƒ]Šì.v£û¶D?A’énúDø}“$I’$é‰2Ø –Á.Å v»ÁåGD?A’\yLø}“$I’$é‰2Ø –Á.Å v»îÆE?A’=xsø}“$I’$é‰2Ø –Á.Å v»öÁ¿ýH¨µn—ð'I’$IÒã3Ø –Á.Å v¼Õ;6Mo9úL÷øwÅß8I’$I’—Á.µ v(f°«ámçG?C’é_°Oø}“$I’$éñìPË`€b»Ú6ª€IÝqQø}“$I’$éñìPË`€b»êžøÞèg@6ƒn³¼ÛsÃoœ$I’$IÍ`€Z»3ØUkŸ—F?Cêþûá7N’$I’¤Çf° @-ƒ]Šìj[ã­wE?E’éý…ðû&I’$IÒc3Ø –Á.Å vµ­áõ£Ÿ"É oüNø}“$I’$é±ìPË`€b»ÚVïœ/F?E’wj–—v¿q’$I’$=šÁ.µ v(f°«mu6¼%ú)Pû«ÿ.üÆI’$I’ôh»Ô2Ø ˜Á®¶ÕZû‚¦¢Ÿ#ÉôÎødø“$I’$éÑ v¨e° @1ƒ]=Úèþ룟#É ®>.ü¾I’$I’ôh»Ô2Ø ˜Á®mpÅ‘ÑÏ€dÆÜ~ß$I’$Iz4ƒ]jìPÌ`WÖÝô‰èç@B­õ»†ß8I’$I’¶e° @-ƒ]ŠìêÑÚ¿:ú9P÷”†ß8I’$I’¶e° @-ƒ]ŠìêÿµúYMÓoE?I’éÿäø'I’$I’Á.`° @1ƒ]=¶á훣Ÿ$ÉŒî½6ü¾I’$I’´-ƒ]jìPÌ`W­¿yßè' @6ãqÓúÒ¯„ß8I’$I’ v¨e° @1ƒ]=¶î‰ï‹~’$Ô9öOÃoœ$I’$I»Ô2Ø ˜Á®[ký®ÑO€„úçï~ã$I’$I2Ø –Á.Å võøÆ[ïŽ~–$3¼}sø}“$I’$É`€Z»3ØÕãÞ°)úYÍ Û,ïöÜð'I’$IZì v¨e° @1ƒ]=¾Þ9_Œ~–$Ô9ü?„ß8I’$IÒbg° @-ƒ]ŠìêñuŽ|kô³ ¡mÿAHô“$I’$-v»Ô2Ø ˜Á®_kíÎM3E?M’Þtfø“$I’$-v»Ô2Ø ˜Á®ž¨Ñý×G?M’wn–Wï~ã$I’$I‹›Á.µ v(f°«'jpÅ‘ÑO€„Ú½*üÆI’$I’7ƒ]jìPÌ`WOTwÓ'¢Ÿ& õ¾ýßÂoœ$I’$iq3Ø –Á.Å võDµ~uôÓ ¡Áµ'…ß8I’$IÒâf° @-ƒ]Šìê [ý¬¦é-G?O’ÿâžø'I’$IZØ v¨e° @1ƒ]=YÃÛ.ˆ~ž$ÔÞÿåá7N’$I’´˜ìPË`€b»z²ú›×G?Oênüëð'I’$IZÌ v¨e° @1ƒ]=YÝßý<Hhpå1á7N’$I’´˜ìPË`€b»z²Zëw~ž$4~øŽð'I’$IZÌ v¨e° @1ƒ]=Uã­wG?Qj­Yø“$I’$-^»Ô2Ø ˜Á®žªá ›¢Ÿ( uOýPø“$I’$-^»Ô2Ø ˜Á®žªÞ9_Œ~¢$4¸ìðð'I’$IZ¼ v¨e° @1ƒ]=U o‰~¢$4úÙ?†ß8I’$IÒâe° @-ƒ]Šìê©j­}AÓŒGÑÏ€„ZëþEø“$I’$-V»Ô2Ø ˜Á®ž®Ñ}×E?Sêžôþð'I’$IZ¬ v¨e° @1ƒ]=]ƒË7D?Sêÿäàð'I’$IZ¬ v¨e° @1ƒ]=]ÝMŸˆ~¦$4º÷Úð'I’$IZ¬ v¨e° @1ƒ]=]íƒ_ýLÈh¿à;{'€² vµ§õ¯úTôã @†)[thø“$I’¤ªeKg¦îª9;“ÈÎqî ›²?:õ¯žþ¿¯ ìP•Á.¥ìjOë~ößG?®4T÷sï ¿s’$I’´7e‹_™ºç¼;õ×M¤|óšTL>6­n\wTøÿæ&d° @U»”f°«=-[tHJÅ(ú‘ ë ¿s’$I’´Ûœº+f§þÚyi¸qemÛ”RQìÛ?7Ýxbü?‡d° @U»”f°«½i´í®èG€=üð'I’$I;[°ê,Ÿ•z«ç¦Á†e)ߺ>¥¼ýǦ4¸ù´ø6 È`€ª v(Í`W{Óð¶ÏF?²4Ñ(OÙâÃÂïœ$I’¤ö•-™º«æ¤þº‰”ßwUJƒ,£á7Ï ÿgÕ„ v¨Ê`€Ò vµ7õ.ýhô# @Cíø?È£ïœ$I’¤f—-~eꮘúW|"å›×¤br[ª‹á„ÿókB»Te° @i»Ú›:§þRô# @C n8!üÎI’$IjP¦Îi‡§þÚyi¸qemÛ”RQ¤ºÊï¾$þŸi2Ø *ƒ]J3ØÕ^µ`ÿ”ú“Ñ- 4zä¶ø;'I’$©ž-Ø?u–ÏJ½ÕsÓ`ò”o]ŸRÞOM’ûŠøÎ È`€ª v(Í`W{[¾õúèÇ€&*F);êUáwN’$IÒø—-™º«æ¤þº‰”o^“Šî“©éò¾þϽ ìP•Á.¥ìjoÜp|ôc @Cu?ÿ‡áwN’$IÒx•-:4uWÌNý+>ñÜ8÷ÙGS¾%üßE2Ø *ƒ]J3ØÕÞÖ»ðÑ- 5¸ñ¤ð;'I’$)°‰Sç´ÃSí¼4ܸ2¶mJ©(¢ÿ¨2FÞÿï§ìP•Á.¥ìjoËŽû©èÇ€†}ïöð;'I’$iµ`ÿÔY>+õVÏMƒ ËR¾u}JÃ^ôKÆÖè‰oÇÿ;k@»Te° @i»*SñÌ#Ñ.MT)óÝD’$IjdÙÒ™©»jNꯛHùæ5©èlþH­O?þï° ìP•Á.¥ìªLùÝ—D?º4Tïü÷…ß9I’$IÕÊšº+f§þÚyixçE©xöÑè?jÔ^‘}?üßk2Ø *ƒ]J3ØU™úW~2úÑ ¡ÿ¸<üÎI’$IÚ‹&Lå³Rï’¤áÆ•i´mÓÎßžÁëOÆÿ»n@»Te° @i»*S÷³ïŠ~th¨Ñ£w†ß9I’$I»iÁþ©³üRïâÿš†·œžFÜ–R>ˆþcD;Œ†ñÿþÁ.UìPšÁ®Ê”-:$¥QýøÐDE‘²c^~ë$I’$ýXÊ–ÎLÝUsRÝDÊ7¯IEç‰è?1´WQ„?MÈ`€ª v(Í`WeÛùë `ô.xø“$I’Úø´»+f§þÚyi¸qe*ž| úüˆÉù3Ÿ“ºg° @U»”f°«² o;;úñ ¡7Ÿ~ç$I’¤FwħÎgþÍsãÜÛW¥Ñã÷îü ®Œ·É‰㟚g° @U»”f°«²õ.ýhôã @C¿'üÎI’$IM*;á­©·znlX–ò­ëSv£¿öSÂä/ –êžÁ.UìPšÁ®ÊÖ9õ—¢_,;öMá·N’$IªcÙÒ™©»jNꯛHùæ5©è<ýõž)2¹ðàðç«îìP•Á.¥ìªt öO©?ýÐP½Õÿ%þÖI’$Ic^¶èÔ]1;õ×ÎKÃ+S±}KôWy¦Q¶èÐðg®îìP•Á.¥ìªJùÖë£ajÇØ úÎI’$IcÕ‚Rgù¬Ô[=7 ¿ñ™4Ú¶)¥býÕ}(;êUñÏaÍ3Ø *ƒ]J3ØU•ë‹~„h¨â™GÂïœ$I’Y¶tfê]ø4ذ,å[×§4ìFM'Xæ¿åVÎ`€ª v(Í`WUê]ðþèG€ë,û¹ð['I’$í«qnwÕœÔ_7‘òÍkR‘}?úë8c([òºðgµîìP•Á.¥ìªJÙqoŽ~„h°þš¿ ¿u’$IÒT—-:$uWÌNýµóÒpãÊ4Ú¶)ú«75‘-}Cøó[÷ v¨Ê`€Ò vUµ¿²¦Ãð®/…ß9I’$©R Hå³RoõÜ4ذ,¹5¥býU›šÚñ—çßéšg° @U»”f°«ªåw_ýÐPE÷É4¹`ÿð['I’$íiÙÒ™©wávŽsó­ëSt¢¿VÓ Ùño ÆëžÁ.UìPšÁ®ªÖ¿ò“Ñ1 Ö9ý—Ão$I’´»qnwÕœÔ_7‘òÍkR‘=ýõ™†ëœø¶ðç¾îìP•Á.¥ìªjÝϾ+ú1 ÁúW|"üÖI’$IÙÂW¤îŠÙ©¿v^n\™FÛ6EU¦…:Ë~6ü]¨{»Te° @i»ªZ¶è”Fyô£ @Cå÷]~ë$I’Ô²:Ëg¥Þê¹i°aY=rkJÅ(ú«1¤ÎÉ?ÿ~Ô<ƒ]ª2Ø 4ƒ]ME~ª Óf¥É#^~ë$I’Ôܲ¥3SwÕœ4¸~IÊ·®OiЉþ »Ô9åÃß—ºg° @U»”f°«©hxÛÙÑ2 Ö=û·Âo$I’šQ¶ø°Ô=çÝ©¿n"å›×¤bò±è¯»°Ç:§þRø;T÷ v¨Ê`€Ò v5õ.ùHô£ @ƒ ®]~ë$I’T¿²…¯HݳSí¼4ܸò¹ßTÑ_o¡´Îi‡‡¿WuÏ`€ª v(Í`WSÑŽŸîÓeôà†ð['I’¤1oÁ©³|Vê­ž›–¥|ëú”òAôWY˜R»Õ3Ø *ƒ]J3ØÕ”´à€”ú“Ñ3M5¦lÑ¡ñ÷N’$IcSçÄŸN½‹>”7ž”òïܘҠý­¦]çÔw†¿{uÏ`€ª v(Í`WSUþÀuÑ3 Ö]5'üÖI’$)¦lñ+S÷œw§þº‰”o^“ŠÉÇ¢¿žBˆÎ)ïëžÁ.UìPšÁ®¦ªÁõK¢glǯ5޾u’$IÚ-<8uÏüÔÿÚߤá_HÅ“D…±Ñ9åãßÑšg° @U»”f°«©ªûù?Š~œh°Ñ¶»Âo$I’¦¸û§ÎòY©·zîο •o]ŸRÞþê c«sòÛãßÛšg° @U»”f°«©*;æµÑ3 —÷æð{'I’¤òeKg¦îª9©¿n"å÷]•Ò ‹þŠ µÒYö³áïqÝ3Ø *ƒ]J3ØÕTVlßýHÐ`½‹?~ë$I’´ge‹_™º+f§þŸHùæ5©˜Üýuj¯sâÛÂßíºg° @U»”f°«©lø­ó£ilxÇá·N’$I»hâÀÔ9íðÔ_;/ 7®L£m›R*Šè¯Ð8Ùño‰ßkžÁ.UìPšÁ®¦²ÿÇL—"{’†W¦Ñ¶M)£è¯S@ÝŒ†ñŸg È`€ª v(Í`WÓÕè¡›£o®sÚáá÷N’$éGËNxkê­ž›–¥|ëú”†Ýè¯M@½gÂ?ßšÁ.UìPšÁ®¦«Á†“£o®Õ§Âï$IjwÙ±oJÝóÿ8 ¾~LÊï_—ŠÞÓÑ_‘€†*& ÿÌkB»Te° @i»š®z}0úñ áò­×‡ß;I’Ôž²E‡¤îŠÙ©¿v^n\™Ší[¢¿-R<õ`øç`2Ø *ƒ]J3ØÕt•ÿ–èÇ€¦å);êÕá7O’$5°¤ÎòY©·zn~ã3i´mSJÅ(úÛÐb£Çïÿll@»Te° @i»šÎŠg¿ýˆÐp½ Þ~ï$IRýË–ÎL½ ?–¥|ëú”†Ýè¯9Ï3úÞ·Â?+›Á.UìPšÁ®¦³üî/G?â4ÜðÖ³Âï$Iªß8·»jNꯛHùæ5©È¾ý•à%º9üó³ ìP•Á.¥ìj:ë_ñ‰èG€†+žùnšœ?#üæI’¤ñ,[øŠÔ]1;õ×ÎKÃ+ÓhÛ¦è¯/¥ä\þ™Ú„ v¨Ê`€Ò v5uÏúÍèG€è|ú ¿y’$i Zp@ê,Ÿ•z«ç¦Á†eiôÈ­)£è¯*S"ÿöåñŸ³ È`€ª v(Í`WÓÚ‘?‘Òhý˜Ðp;~¢{øÍ“$Iû¼léÌÔ»ð;ǹùÖõ) :Ñ_K¦M~÷%៻MÈ`€ª v(Í`WÓÝè‘Û¢s.ßrmø½“$IÓ?Îí®š“úë&R¾yM*²Ç£¿‚ìSÃ;.ÿ,nB»Te° @iŒâÆ IDAT»šî7Ÿý˜Ðtù e‹_~ó$IÒÔ”-|Eꮘúkç¥áÆ•i´mSô· €pÃožþùÜ„ v¨Ê`€Ò v5ÝõVÏ~Ìhîù~ó$IR‰:Ëgíü³ã`ò4zäÖ”FyôW €±3¼åôøÏìd° @U»”f°«é®sÒÏD?æ´À🠿y’$é¥Ë–ÎLÝUsÒàú%)ߺ>¥A'úk@- n<)ü3¼ ìP•Á.¥ìjÚ›?#“E?ê4\ñôCñ7O’$=¯lña©{λSÝDÊ7¯ñgC€ _?:üs½ ìP•Á.¥ìj_”ßó•èG€è,ÿ…ð›'IRk[xpꮘúkç¥áÆ•i´mSJEýõ 1vüå‡ðÏúd° @U»”f°«}Qÿêˆ~Ôhþå~ó$IjE Hå³RoõÜ4ذ,å[×§”÷£¿ 4ZÿŠÇþ7 ƒ]ª2Ø 4ƒ]틺Ÿý÷Ñ:-ß¿.üæI’ÔÄ:'þtê]ôÁ4¸ñ¤”熔è³Ð:;~‚yô=hB»Te° @i»Úe‹Ii”G?î4]Þßys¢ïž$Iu.;浩»ê÷Óàš#SþO_KEöýè @J©wñ‡ÃoD2Ø *ƒ]J3ØÕ¾jôÝoF?î´@ïü÷…ßýÈÐE‘²cß~÷$IÚÛ²¥3SwÕœÔ_7‘òÍkRÑ}2úª0Fyšœ?#üN5!ƒ]ª2Ø 4ƒ]íË:§ýëèG€–è]ò‘ð»'IÒK6¿Ô_· å÷\–ŠÉmÑç€1µã/p„߬†d° @U»”f°«}Ú‚ýSÑ{&ú± vüTÂð»'IÒK”õªè“ @ On ¿YMÉ`€ª v(Í`Wû:ÿQ€}bÐI“GþDøÝ“$éÅÊNxkôÅ FÞ~³š’ÿ6 @U»”f°«}Ýàš#£{Z¢»ê÷Ãïž$I/Vç´}.¨|ëúð›Õ” v¨Ê`€Ò vµ¯ëžû¢{ZbpóiáwO’¤«ûÙwEŸKj ¿wmøÍjJ»Te° @i»Ú×e‹Mi”G?ú´@ñÔƒirþŒðÛ'IÒîêÿ¾ès @ ï¸ üf5%ƒ]ª2Ø 4ƒ]E4úÞíÑ>-Ñùôÿ~÷$IÚ]½‹?}*¨á-g„߬¦d° @U»”f°«ˆ7ŸýèÐý«þ>üîI’´»ú_û›èS @ Ö~³š’Á.UìPšÁ®"ê}ñ?G?ú´ÄèÁ ¿{’$í®Á5GFŸJj õüð›Õ” v¨Ê`€Ò vQvü[¢}Ú¢¥léÌðÛ'IÒ®ÜtJô¥ úkç…߬¦d° @U»”f°«¨Š§Š~üh‰Þ¥ ¿{’$íªáFŸIj`Ço«Š¾YMÉ`€ª v(Í`WQ ï¼(úñ %ò{¿~÷$IÚUù–k¢Ï$5Ð=÷=á7«)ìP•Á.¥ì*ªþÚ¿Š~üh‹a/e‹ ¿}’$ýh£G’Ô@ç´ÃÃoVS2Ø *ƒ]J3ØUTÓ9úñ Ezþ§ðÛ'IÒV<ûhô‰ ²ã~*üf5%ƒ]ª2Ø 4ƒ]…µà€TôŸ~h‰á·>û$IúŸ›?#¥Ñ0úDP“GþDüÝjH»Te° @i»Š,ßrMô+@KݧÒäÄAá·O’¤.;êÕÑç€:tÂoV“2Ø *ƒ]J3ØUdƒkE¿´H÷œß ¿}’$ýse?}¨â©ï„߬&e° @U»”f°«Èº+7ú E7}:üöI’ôÏuÏüõèÓ@ Œ¹-üf5)ƒ]ª2Ø 4ƒ]E–->,¥býÐÅÓ¥Éù3ÂïŸ$I;ê]ð'ѧ€Èï»2üf5)ƒ]ª2Ø 4ƒ]E7zôŽè×€éœþËá·O’¤õ×΋>‹ÔÀðöóÂoV“2Ø *ƒ]J3ØUtÃ[Έ~ h‘Áµ‹ÂoŸ$I;\¿4ú,Pƒ ËÂoV“2Ø *ƒ]J3ØUt½Õs£_Zdôèá·O’¤íø‰‰ðRúWÏ¿YMÊ`€ª v(Í`WÑe'¼5ú5 e:'þtøý“$)¿]ôI úkþ"üf5)ƒ]ª2Ø 4ƒ]CÅ3ß~h‘þ¿}’$¿7ú$P½ Þ~³š”Á.UìPšÁ®Æ¡á¦Õѯ-2zèæðÛ'IRÑ6ú$Pݳ+üf5)ƒ]ª2Ø 4ƒ]Cý¯þ¿Ñ¯mR);þ_†ß?IR{Ë¿2úPS~1ün5)ƒ]ª2Ø 4ƒ]C3~%úU eú_ýëðû'Ijo“>úPׇْ߭&e° @U»”f°«±hâÀ”ú“ѯ-’ç†øû'IjmÝ•¿} ¨ƒ¢ØùßÍ¢ïV“2Ø *ƒ]J3ØÕ¸”ßwUôë@›£”-}Cøý“$µ³þš¿ˆ¾„Ô@ñì£á7«iìP•Á.¥ìj\ê_=?úu eú_ùoá÷O’ÔÎ×/>ƒÔÀè»ß ¿YMË`€ª v(Í`WãR÷¬ý:Ð2ù–kÃïŸ$© ï¼(ú Pù=—…߬¦e° @U»”f°«±éˆ—¥4ìF¿´I1JÙ’×Çß@IRë=|Kô †ßøLøÍjZ»Te° @i»§ò¾ýJÐ2½K?~ÿ$Ií«È>Ô@ÝDøÍjZ»Te° @i»§×.Œ~%h™ü¾+ÃïŸ$©]e‹‰>ÔDï’?¿[MË`€ª v(Í`WãT÷œwG¿´Íh˜²cþEø ”$µ§Î)~ÔD÷sï ¿[MË`€ª v(Í`WcÕƒSÊѯ-Ó»øÃñ7P’ÔšºçýÇèÓ@MtN}gøÝjZ»Te° @i»·Fnˆ~-h™üÞ¯†ß?IR{ê_þwѧ€šÈŽymøÝjZ»Te° @i»·×/‰~-h›|²£_~%IíhxÛÙÑ—€:ÈûirþŒð»Õ´ v¨Ê`€Ò v5nu?÷Þè×€ê]ò‘ð(IjGùwnˆ>{Ô@ñäÖð›ÕÄ v¨Ê`€Ò v5ne‹Mi”G¿´L~ÿºð(IjGEöxôÙ òïÜ~³š˜Á.UìPšÁ®Æ±Ñ#·E¿´M1JÙÒ7„ß@IR³ËŽzuôÅ &†›¾~·š˜Á.UìPšÁ®Æ±Á'F¿´Pí¼ð(Ijv¿}Á†eáw«‰ìP•Á.¥ìjë~þ¢_ Zhôà†ð(Ijv½‹?}þŸ¿[MÌ`€ª v(Í`WãXvôkvþjrاŠ"eÇ¿%üJ’šÛàú%Ñ×€šè­ž~·š˜Á.UìPšÁ®ÆµÑ£wF¿´Ÿb%IšÎò{.‹>uÔD÷³ï ¿[MÌ`€ª v(Í`WãÚà¦OG¿´Ðè»ß ¿’¤æV<õ`ô© &:'ýLøÝjb»Te° @i»×zþ§è×€–ê,Ÿ~%IÍ+;êÕÑ'€º(Fiòˆ—…ß®&f° @U»”f°«q-[òúè×€–ꯛ¿ƒ’¤æÕ=û·¢O5Q<ýPøÝjj»Te° @i»çFßýŠÐB£Çï ¿’¤æÕ_;/úÄPùÖëÃïVS3Ø *ƒ]J3ØÕ87üÆŠèW€–êœúÎð;(IjVÃ[ÏŒ>oÔÄpãçÂïVS3Ø *ƒ]J3ØÕ8×ûâŸF¿"´Ôà†ãÃï $©Y¾%ú¼PƒkŽ ¿[MÍ`€ª v(Í`Wã\v웢_ZªxöÑ4¹à€ð[(IjH öOiEŸ7j¢wñ¿] Í`€ª v(Í`Wã^±}Kôk@KuÏ}Oø”$5£ÎÉo>kÔH÷ìß¿]MÍ`€ª v(Í`WãÞð›çF¿&´ÔðöóÂï $©õVÿ—è³@dÇ¿%üv55ƒ]ª2Ø 4ƒ]{½‹?ýšÐVƒ,e‹ ¿…’¤ú7¸éÓÑW €º Óä‚ÂoWS3Ø *ƒ]J3ØÕ¸×9ñmѯ -¶ã'"FßBIRý=|KôI &Ší[ÂïV“3Ø *ƒ]J3ØU*žz0úU ¥òû® ¿ƒ’¤šwÄËRö¢O5‘ß¿.þv58ƒ]ª2Ø 4ƒ]Õ¡á·Î~Uh«b”²cß~ %Iõ­sƯF_3jdxÛÙá·«ÉìP•Á.¥ìªõ.ý¿£_Z¬ùß…ßBIR}ë_ö±èS@ô¯þ‡ðÛÕä v¨Ê`€Ò vU‡:'ÿ|ô«@‹¶m ¿…’¤ú6Üø¹èS@ô¾ø§á·«ÉìP•Á.¥ìªÍŸ‘ŠÉmѯ -Ö9õ—âï¡$©–Û}ƨ‘~»šœÁ.UìPšÁ®êÒpÓ£_Zlpã‰á·P’T¿²£2¥¢ˆ>cÔHvìÃïW“3Ø *ƒ]J3ØU]ê¯ù‹è×€+&K“…ßCIR½êžÿÇÑ' €:tÒäüýÂïW“3Ø *ƒ]J3ØU]êœüöè×€–ëÿ¾ð{(IªWƒOŠ>_ÔÈè{ß ¿]MÏ`€ª v(Í`WuªxúáèW€Ëï]~ %IõjôÈmÑç €Þù…ðÛÕô v¨Ê`€Ò vU§†·¯Š~eh³b”²ãÞ~%Iõ([üÊ”Fyôõ F×. ¿_MÏ`€ª v(Í`Wuªwñ‡£_Z®Õ§Âï¡$©uWý~ôÙ fz_üÏá÷«éìP•Á.¥ìªNeÇýTô+@ËÛ·¤Éù3Âo¢$iü\¿$úlP3Ó9ü~5=ƒ]ª2Ø 4ƒ]Õ­bûýѯ -×=ë7Ãï¡$iü=¸!údP3Ù¢CÃïWÓ3Ø *ƒ]J3ØUÝÞzfôk@Ë 7~.üJ’Æ»lÑ!)åƒè“@Ï<~¿ÚÁ.UìPšÁ®êVï¢E¿6´Ý “²Å‡…ßDIÒøÖýüF_+j&ßrMøýjC»Te° @i»ª[Ù’×¥Tѯ-×»ô£á7Q’4¾ n>-úTP3Ã[N¿_mÈ`€ª v(Í`Wul´í®èW€–=|Kø=”$oÅöû£O5Óÿê_‡ß¯6d° @U»”f°«:6¸é”èWRç´ÃÃo¢$iüê,ûÙè@ uWþ^ø kC»Te° @i»ªc½óßýê@ÞzføM”$_ýË>}¢¨¡ì„~ÃÚÁ.UìPšÁ®êXvÔ«S*Fѯm7ÈRvÔ«Âï¢$i¼Êï¹,úBP7Ã^š\°ø kC»Te° @i»ªk£ï~3úõ€ÔÿÊ ¿‰’¤1jâ TôŸ>OÔÌèÑ;ãoXK2Ø *ƒ]J3ØU]¬?.úõ€4ÚvWøM”$OÝs~'ú4PCÃM«ÃoX[2Ø *ƒ]J3ØU]ë®ü½è×vêžõ›áwQ’4 n>5ú,PCƒëŽ ¿amÉ`€ª v(Í`WµmáÁ)åýèWÒð[çÇßEIR|óg¤â釣Ï5ÔûâŸÆß±–d° @U»”f°«:—?p]ô+;ÿI¶äuáwQ’[ç3ÿ&ú"PSSÞ~ÇÚ’Á.UìPšÁ®ê\ÿª¿~…`§þ•ÿ_ø]”$Å6¸~iô9 ŽòAšœ8(ü޵%ƒ]ª2Ø 4ƒ]չοý ÀNÅö-irþ~á·Q’×èñ{£Ï54zôŽðÖ¦ v¨Ê`€Ò vUë쟊ÎѯìÔ=ï?ÆßFIRHå¿}†¨©áí«ÂïX›2Ø *ƒ]J3ØUÝÞõ¥è×vÊï_~%I1õ¯þ‡è3@Mõ¯øxøkS»Te° @i»ª{½K?ýÀtNyGøm”$íûFÜ}‚¨©îçÞ~ÇÚ”Á.UìPšÁ®ê^çÄ·E¿FðÃ[Ï ¿’¤}[çä·GŸj,;öá·¬MìP•Á.¥ìª Ûï~•à9Ã^ÊŽymøm”$í»×-޾>ÔTÑy"ü޵-ƒ]ª2Ø 4ƒ]5¡á7>ý*Àô¯úTøm”$í£æÏHÅö-ѧ€šÊ·\ËZ–Á.UìPšÁ®šPïÂD¿JðÅ3¤É‰ƒÂï£$iúëžùëÑg€l89ü–µ-ƒ]ª2Ø 4ƒ]5¡ì¨W¥4Ê£_'øÞE ¿’¤éoxËéÑ'€ë}ùÿ ¿emË`€ª v(Í`WMiôð7¢_'øw)ú6J’¦¹‰ƒR‘}?úäPc3~5þžµ,ƒ]ª2Ø 4ƒ]5¥ÁuGE¿Nð<ÏüÛðû(Iš¾ºŸÿÃèS@£”-|Eø=k[»Te° @i»jJݳ;úu€çÉïº8ü>J’¦¯á¦Õѧ€=q_ø-kc»Te° @i»jL¥ÔŸŒ~¥à‡Š"u–ÏŠ¿‘’¤)/[òº”òAô¥ Æ†w})üžµ1ƒ]ª2Ø 4ƒ]5©üÞ¯F¿Rð<Ã[Ï ¿’¤©¯å'£O 57¸æˆð{ÖÆ v¨Ê`€Ò vÕ¤ú_ýëèW žoØKÙÒ7„ßHIÒ6F=ñíè @ÍuÏûƒø›Ö v¨Ê`€Ò vÕ¤:'¿=ú•€\¿4üFJ’¦®î¹ï‰>-4@¶tføMkc»Te° @i»jZÅöû£_+xž¢÷tÊ~#%ISÓð®/EŸj®xúáð{ÖÖ v¨Ê`€Ò vÕ´†·œýZÀ ô¯øxø”$U/[òú”òAôY æò»¿~ÓÚšÁ.UìPšÁ®šV÷óýZÀ Ï>š&øñð;)IªVÿª¿>)4ÀŽ{}ÓÚšÁ.UìPšÁ®šV¶è?ñ €±Ô»äÏÃï¤$©B HÅ“[£Ï Ð]ù»ñw­¥ìP•Á.¥쪉å\ýjÀ ìyMN~'%Iåê]ô¡èS@CdÇü‹ð»ÖÖ v¨Ê`€Ò vÕÄúW~2úÕ€]ê]üáð;)I*×è¡›£Ï Plß~ÓÚœÁ.UìPšÁ®šXçÔwF¿Z°KÅöûwþJõè[)IÚ»ºgÿvô  !†w~!ü®µ9ƒ]ª2Ø 4ƒ]5²ù3RñÌw£_/Ø¥Þ—þ,þVJ’öªüžË¢Ï Ñ¿üïÂïZ›3Ø *ƒ]J3ØUS~óÜè× viôÄ}~Ê®$ըβŸK©EŸbÇOm¾mmÎ`€ª v(Í`WM­wÑ£_/Ø­Þê¹á·R’´g o=3úlÐE‘²Å‡…ß¶6g° @U»”f°«¦–ý“~ ckôø½irÁþá÷R’ôâeK^—Ò°}6hˆÑã÷„ß¶¶g° @U»”f°«&7zèæèW v«÷Å? ¿•’¤opýÒès@ƒ o?/ü¶µ=ƒ]ª2Ø 4ƒ]5¹Á5GF¿b°[Åö-irâ ð{)IÚýoí(úÏFŸ ¤¿ö¯Âï[Û3Ø *ƒ]J3ØU“ë¬øµèW ^TÍ_†ßKIÒ®Üp|ô™ aº+f‡ß·¶g° @U»”f°«F·`ÿTdß~Í`·Šg¾›&3%IÏ+[òº”Yô™ IòAš<ò'Âo\Û3Ø *ƒ]J3ØUÓÞ~^ôk/ªÕ§Âï¥$éù n8!ú<Ð0£‡n ¿o2Ø :ƒ]J3ØUÓë]ôÁè× ^TÑ}*eG¿&üfJ’ž+[òz?]€)·ã/ƒDß8ìPÁ.¥ìªéeG½*¥Ñ0úU€5¸~iøÍ”$=×àÆ“¢Ï Ô;ÿ}á7N»Tg° @i»jCùÖë£_5xqƒNÊŽ}cøÍ”¤¶·ã³xÇg2Lµ?Á=úÎÉ`€ê v(Í`Wm¨Å'¢_5xIÃ[Ï ¿™’Ôö†ß<7úÐ@£'î ¿qz.ƒ]ª2Ø 4ƒ]µ¡Î)¿ýªÀK+F©sÚááwS’ÚZçÔwîü,€©¶ã/„Dß9=—Á.UìPšÁ®ÚRñäѯ¼¤|˵á7S’ÚšÓ¥wÉŸ‡ß9¹÷L ƒ]J3ØU[Üôéè× öHïü÷…ßMIj[;>{`ºt–Ï ¿uz.ƒ]ª2Ø 4ƒ]µ¥îÊß‹~Ý`ÛïO“G¼,üvJRkš8(¾ÿOÑÿ4TÑÙž&çïï´3ƒ]ª2Ø 4ƒ]µ¦#~<¥AýÊÀé_ññøÛ)I-©ÿµÿý±@ƒå÷|%üÖé‡ìP•Á.¥ìªMå›×D¿r°GŠîS);æµá·S’š^vôkRÑy"úc€ë_ùÉð{§f° @U»”f°«6Õ»ô£Ñ¯ì±á7V„ßNIjzÃ[ÏŒþ¸ áºgý»ð{§f° @U»”f°«6•-}CJEýÚÀž)F©ó™~?%©©uÏüu>`zåý4yäËÃož~˜Á.UìPšÁ®ÚÖè{·G¿v°ÇFÞ‘&~?%©qM”FÛîŠþ˜ áFnˆ¿yz^»Te° @i»j[ƒëŽŠ~í`¯ô×þUøý”¤¦Õ¿ú¢?ÞhÁúãÂožžŸÁ.UìPšÁ®ÚVgůE¿v°WŠÞÓ);öá7T’šRçÄŸNiЉþx ºŸÿÃð»§çg° @U»”f°«Ö5¿T<û½èWöÊðÎ/ÄßPIjHù}WF¬Ð£~O%iËŽzU*¶ßý1 @ å÷~5üj÷ìP•Á.¥ìªí½3ú5€òŠ"uÏûƒð{*IcÕü)¿û’èOhZªù߯ßBí6ƒ]ª2Ø 4ƒ]µ½Áu‹£_C¨¤˜|,eK^~S%i\ê_=?ú£€ëœúÎð[¨Ýg° @U»”f°«¶×9ý‹~  ²üÛ—ïü‰’ÑwU’¢ë~ö])òèeZªè<‘&çï~µû v¨Ê`€Ò vÕúæÏHÅÓG¿ŠPYÿ²ÅßUI ,;öM;ê8DnZ~õâìP•Á.¥ìJ?–†·œý*@uÃ^êœvxø]•¤&Lùwnˆþ$ åúkþ2þ&êE3Ø *ƒ]J3Ø•~,uWþnô«S¢Ø~Ê~[%i_7¸é”è`H“~&ü&êÅ3Ø *ƒ]J3Ø•~,Mñ²TtŸŠ~`Jäw_’&çψ¿¯’´ÚñÓ  Úèûÿ~õÒìP•Á.¥ìJÏ5¼ý¼èצLÿò¿ ¿­’´Ï~[Æhý± i°aYø]ÔKg° @U»”f°+=W÷ü?Ž~`ꌆ©{æo„ßWIšÎ:ËÁoÊ`ltÏ}OømÔKg° @U»”f°+ýÿùòTôŸ~%`ÊÏ<’²¥oˆ¿±’4 íø|+žz0ú£ž3ÈÒä?~õÒìP•Á.¥ìJ?lxçEѯ$L©Ñ#·îüK)Ñ7V’¦´#_žFÝý ?ßó•øû¨=Ê`€ª v(Í`Wúa½/üïѯ$L¹áÆÏ…ßXIš²æï—ò»¿ýÑ ÏÓ_ó—ñ7R{”Á.UìPšÁ®ôò…¯HiЉ~-`Êõ/ÿ»ð;+I•›?# n>5ú#^ ;á_ÅßIíQ»Te° @i»ÒóËï¾$úµ€©WŒRwÕœð;+IU|ý˜èOSxÑcw‡ßHíy»Te° @i»Òóë­žýZÀ´(ºO¥Î)￵’T¦þÕÿý1 »4¸á„ð;©=Ï`€ª v(Í`Wz~ÙâW¦”÷£_M˜Å3¤ì¸7‡ß[IÚ›ú—},úãv«{λÃo¥ö<ƒ]ª2Ø 4ƒ]é…å÷~5úÕ€i3Ú¶)e‹ ¿·’´'õ¾ôg)EôG'ìZ2Mñ²ð{©=Ï`€ª v(Í`Wza½/ÿŸÑ¯&L«|˵†’ƾÞ’Ò(þÈ€ÝÊï¾$ü^jï2Ø *ƒ]J3Ø•^XvôO¦4F¿ž0­†W¦Éù3Âï®$íªÞùïK)DTÀ‹ê]úÑ𛩽Ë`€ª v(Í`WÚuþã=m0øÇåá7W’~´ÞE2Ö ²ãÿeøÝÔÞå¿ùP•Á.¥ìJ»®¿æ/¢_OØ'úë&Âï®$=ï{x1Šþh€—4zôÎ𻩽Ï`€ª v(Í`WÚuÙ’×¥4Ê£_QØ'ú—ÿmøí•¤þO©(¢?` ®]~;µ÷ìP•Á.¥ìJ»/àëѯ(ÿ£½{×´¬ï{¿gŒ§5Vã)BmLŒ±»Mbj㎩IZ³c“hbkÕº5ɶºScÜqÍ 3 Ì ÃQ‘ƒœAå(ÈiÌ ‚rNÎÀ°žû9ß÷¯¯™ôÚ€3÷½Öó{ï÷ëõù¯Í?Îu=ë¹üºV0Uݯ| ý³WÒìÖ¿b¿ì›vHû¨7¥~jÇ3Ø )ƒ]j3Ø•ž¾Þš}D`tÊatÏ|oú篤knIô¯;,û€R=qï¶Ï°ôÏQíp»4e° @m»ÒÓWð"ÊAö1€vß“þ,iFZ¾K n>!ûæ€ÖÿÖ¡ùŸ£ª•Á.MìP›Á®ôÌ ï¾4û˜ÀèG»gýIúg°¤é®XµG ï¼(ûÆ€Z:ǽ5ý³Tõ2Ø )ƒ]j3Ø•ž¹î¹Ì>¦0zF»’±âàWEù؆ì›j©ŠÇ£µlçôÏSÕË`€¦ v¨Í`WzæŠÕÏö²*ŒžÑ®¤E¨s̯l:À¤Üt\úç©êg° @S»Ôf°+ýä†w\}T GUEïÂ¥KšŽº§ÿAD¿}³@#“Þ™þ™ªúìДÁ.µìJ?¹îYœ}T w´{ñ'Ó?%MpsK¢wɧ¶Ý'0ɪÞ|´VìšÿÙªÚìДÁ.µìJ?¹bÕ~3¯ÿÍ•éŸÉ’&¯båscpûiÙW,ˆÁú3Ò?[Õ,ƒ]š2Ø 6ƒ]iû|÷¬ìã éú×­e;¥.KšŒÚ‡íåc²¯.X0Ý3þ(ýóUÍ2Ø )ƒ]j3Ø•¶¯îiïÎ>®0†΋־ÏIÿl–4ÞuÏúãm6¦Æ Ū=Ó?cÕ,ƒ]š2Ø 6ƒ]i;[±kTÝ-ÙGÆBùÀõQðâüÏgIã׊gGÿ[‡f_S°à†w^˜ÿ9«ÆìДÁ.µìJÛßàÖ“³,ŒrÓÝÑþÜkÓ?Ÿ%OÅgÿñ¶A?L£î¹Jÿ¬Uó vhÊ`€Ú v¥í¯sòïdY+ÕüÃÑ>êMéŸÑ’òë|ùßDÕÞœ}-Àâ(‡Q¬Ù+ýóVÍ3Ø )ƒ]j3Ø•v å»DÕÞ”}l`¼ôZÑ9éùŸÓ’rÚw·è_µ&¢*³o#X4[GžéŸ¹Z vhÊ`€Ú v¥kpÓqÙÇÆO9ˆîyNÿœ–4ÚÚ_ø?£|üÎì]÷Ü¥îja2Ø )ƒ]j3Ø•v¬Î—Þž}l`âç³.Œ½jþ‘èûkéŸÛ’š×>âQÞ]öµ£×/¢XùÜôÏb-\»4e° @m»R½Ê‡oË>¾0þÊAô._¾í7sfvKªÑÊÝ·áö²oH1¸ýôüÏc-h»4e° @m»R½z2ûøÀÄÞqA«ŸŸþù-iûëœü;Q=yöõ©:§¼+ý3Y ›Á.MìP›Á®T¯bíK#Êaö€‰Qnº;ÚŸÿgéŸá’ž¹öç^û/;2 ]Õy2Z+vMÿlÖÂf° @S»Ôf°+Õox÷׳0L–rý«ÖDkù³Ò?Ç%ýXûî½Ë—G :Ù7Œ…ÁwŽÏÿ|Ö‚g° @S»Ôf°+Õ¯{ö¿Ï>Â0‘ÊoŒöº×§–Kú?¢5·$º§ÿ»¨6ÿ ûj€±Ò9áùŸÓZð vhÊ`€Ú v¥­Ü=ªÞ|ö1€É4èDï’OEkniþgº4£µ¿ðÏcxïÕÙ·ŒªõX´–íœþY­…Ï`€¦ v¨Í`WjÖàÖ/gc˜hû¿Å?“þ™.ÍR[Ãõ`ý™ÙÇÆVÿú#Ò?¯µ8ìДÁ.µìJÍÚúç€fªöæèžùÞôÏuiÚ+|Y n:.¢f{kc-ýs[‹“Á.MìP›Á®Ô°e;EõÔÆì£ Saxç…QôÊüÏwiÊ*ö{^ô¯Ü?¢_ds{Õ“÷Gkniúç·'ƒ]š2Ø 6ƒ]©yýkÉ>Ê0=úíè]¾Ù01úW¬Nÿ ×âe° @S»Ôf°+5¯}ä/fe˜:å÷úSÄRÍŠ5{EÿªµQuŸÊ>Ê0Yª*Ú‡¾.ý³\‹—Á.MìP›Á®´0•Üž}œ`* ï¸ Šƒ^‘þY/MBÅgÿqô¿uhD¿È>º0‘†÷]“þy®ÅÍ`€¦ v¨Í`WZ˜z—üeöq€éÕkEïë­}wKÿ̗Ʊö!¯‰ÁMÇE {Ù§&Z÷Ü¥®kq3Ø )ƒ]j3Ø•¦bíK"ÊAö‘€©V=õPtÏÿH´–ï’þÙ/CíÏ¿%·Q³'L¾^+ŠU{¦¾kq3Ø )ƒ]j3Ø•®­²X|Õ÷F÷¼GkÙNéŸÿÒÈ[þ¬èžþï¶ýÉn`á n91ÿs^‹žÁ.MìP›Á®´puNý½ì# 3¥|ôo· [sKÒ»bÍOGï’OEµåÁì£S©óÅ·¥Þkñ3Ø )ƒ]j3Ø•°e;G5ÿpö±€™S>p}tŽÿüŸ¤E¨}Ô/mû1ìg5˜ZÕ÷Dkniúç¾?ƒ]š2Ø 6ƒ]iaë_ýÙìc 3këùÞùÒÛÓšVì÷¼èž÷á(7Þ’}¬`&ô¿±"ýó_£É`€¦ v¨Í`WZØÚ‡þ\ö±€™W>|Û¶±ckÅ®é?HÛÝÜÒmƒóm¿M·×Ê>F0;ª*Šƒ_•ÿ³€F’Á.MìP›Á®´ð•÷_—}´€­Û‹ùG¢wùò(V¿ ýçééj¯Û{Û¿Óê‰{³ ̤á.Oÿy@£Ë`€¦ v¨Í`WZøºçý§ì£ ü=Uo>7~!Ú‡¾.ýçikÅêçoû-ÐÃ{¯Î>0óºg¿/ýg.ƒ]š2Ø 6ƒ]iá+VíáÏÀ8*1XFtŽ{k´æ–¤ÿÌ éžýïcxÇÃ~öi¶þ»º[¢µr÷ôŸ4º vhÊ`€Ú v¥Åipó ÙÇxåãwFï’OEqÀ‹ÓnÐôVìÿÂm¿µïïFº½ìöÀÜtlúÏ m»4e° @m»Òâ´õ7÷`ÐÁí§EçÄߊֲÒ†ÐäWôŠè]ôñÞ{UDUfÿ žAû˜‘þ³ƒF›Á.MìP›Á®´HÍ-‰òGßÏ>âÀ¨žÚýkŽöoÌÿYBUû°}¢wé§£|ðÆˆªÊþ§ l‡ò‘ÛÓ†Ðè3Ø )ƒ]j3Ø•¯­£ `r½Ë梽îõé?Shü*öatOÿƒÜt\T[Èþç ÔлàOÓ¦Ðè3Ø )ƒ]j3Ø•¯bíK#Êaö1j¼{Ø>é?_(©e;GçØ_‹þ7WEùÀ·ýŒ®ê>Ū=óÆÐÈ3Ø )ƒ]j3Ø•·á÷þ&û˜ ¨ÜtWô¯=$:Çÿ«m#ÎìŸ5´xµyMô.øh 7œUwKö?=` n8:ýg åd° @S»Ôf°+-nSÞ•}Ì€ERužˆÁí§G÷+ˆâ³/Oÿ¹C Z¶s´þåè]ôñ|÷¬¨žÚ˜ýÏ XDí#Þ˜ÿó‡R2Ø )ƒ]j3Ø•¹e;Gµå죌@ùØÑ¿î°è|ùw£Øï§òÑÓ¶õO`wNxGô¿±o pyD¯•ýÏ‘á}צÿ,¢¼ vhÊ`€Ú v¥Å¯wùò죌ZUFùð­Û¼ÝÓÞÅš½Ò&™Ùæ–F{Ýë£{æ{£ýáQn¼%¢fÿ ’tÏ~_þÏ'JË`€¦ v¨Í`WZüŠ_Q²;¬Ütw n?-z}":Çþj´ö}NúÏ)S×ò]¢}ÄÏG÷œ÷oKï»&ªÞ|öôÀ˜¨ŠEkÅ®ù?³(-ƒ]š2Ø 6ƒ]i4 7œ›}Ü€qS¢|ø¶Üzrô.þdt¾ôùM¼ÛÛ²¢}èë¢{ÚïGï²¹¬?#ÊG¿1ìgÿ§ Œ±þÕŸÍÿ9F©ìДÁ.µìJ£©sÂ;²;0!ªÖ£1üá7bpÃç£÷µÿ/:'þëhòêm#ÕìŸiFÚÜÒ(zEtŽÿèžÿ‘è_sP ï8?ÊÇ6D ºÙÿ1“¦ª¢}ÈkòÆQj»4e° @m»Òˆš[ºíÏ`Ô6ìmûybëÈ`pÓqÑ»ì3Ñ=ëO¢sÜ[£½îõQ¬Ú#ÿgžímÙÎQ¬}I´xctNzgtÏûOÑÿæªÜrR ï¹"ªÍ?ôÛr€5¼ë’üŸ”žÁ.MìP›Á®4ºz—üeö‘¦]¿ˆrÓ]1¼÷ên87ß9~Ûo¦í}ýÿÞî¸m »õ·Ö¶ú¥hþ†(~Uû¿(ŠÕÏÿ»žaø[¬Úóþ¿[³×¶ÿ¿[ÿolý¿ÕùâÛ¢sÂoF÷ô?ˆîùÿOô.ùTô¯Zƒ¿ƒõgnû­Áå£ßÝö„F­sê勵 )?ƒ]š2Ø 6ƒ]itmÂøóÍ£U=µ1ZËwIR~»4e° @m»ÒhÜvjö±˜)½Ë—§¿ i<2Ø )ƒ]j3Ø•F[縷f{€Ù1èF±ö%éoB vhÊ`€Ú v¥ÑW>²>ûèÌ„ÁÍ_J Òød° @S»Ôf°+¾Þ…Ë>ú3¡}ä/¤¿i|2Ø )ƒ]j3Ø•F_±ßó"z­ìã0Õ†?¸<ýHã•Á.MìP›Á®”Óà;_Ì>þS­sò錄i¼2Ø )ƒ]j3Ø•rjýæìã0µÊÇïŒÖÜÒô7 W»4e° @m»R^åý×e_S©wÁGÓß~4~ìДÁ.µìJyuÏ|Oö0uªöæh­Ü=ýíGã—Á.MìP›Á®”Øò]¢Úò@ö50UúWÿÌ`€¦ v¨Í`WÊ­wÙg²¯€é1ìGñÙ—§¿ùh<3Ø )ƒ]j3Ø•r+xqÄ “}L…Á­_NïÑøf° @S»Ôf°+å7øÎñÙWÀThþ-éo=ß vhÊ`€Ú v¥üÚGþBöU0ñ†÷^•þΣñÎ`€¦ v¨Í`W†÷\™}L´Î©¿—þÆ£ñÎ`€¦ v¨Í`Wº§ý~öu0±ÊMwGkÙNéo<ï vhÊ`€Ú v¥1iÙNQmþaö•0‘ºç~0ÿ}GcŸÁ.MìP›Á®4>õ.ùËì+`âT[ˆÖòg¥¿íhü3Ø )ƒ]j3ؕƧbõó#z­ìk`¢ô.üÏéï:šŒ vhÊ`€Ú v¥ñjpÃ糯€‰Q?ŠbåsÓßt4ìДÁ.µìJãUû°}"ª*ûj˜½Ë>“þž£ÉÉ`€¦ v¨Í`W¿†w=ûj{UwK«ŸŸþ–£ÉÉ`€¦ v¨Í`W¿:'½3ûj{ý«Ö¦¿ãh²2Ø )ƒ]j3ؕư¹%Q>|köõ0¾(Ö¾$ÿG•Á.MìP›Á®4žuÏùÙ×ÀØê_Dúû&/ƒ]š2Ø 6ƒ]iL[¾KTOÞ—}EŒŸrÅA¯Ì¿ÑÄe° @S»Ôf°+o½‹ÿKö0v·œ˜þn£ÉÌ`€¦ v¨Í`WߊU{DÕy"ûšUíÃßþn£ÉÌ`€¦ v¨Í`WïúW­Í¾&ÆÆðo¿’þ^£ÉÍ`€¦ v¨Í`W/ö²¯ €ñøíºGþbú{&7ƒ]š2Ø 6ƒ]iü|çøì« Ýà»g§¿Óh²3Ø )ƒ]j3ؕƿöº×GTeöu§*£}Äϧ¿Óh²3Ø )ƒ]j3Ø•&£á÷¾š}]¤ÜvjúûŒ&?ƒ]š2Ø 6ƒ]i2ê÷Öìë G9Üöˆ²ßg4ùìДÁ.µìJ“Syÿ·²¯ €‘Ü|Bú»Œ¦#ƒ]š2Ø 6ƒ]irêžöûÙWÀh ûÑ>äÕéï2šŽ vhÊ`€Ú v¥ jni”?ú~öµ02ƒÉ“ÑÔd° @S»Ôf°+MVÝó>œ}mŒÆ ÅA¯HÑôd° @S»Ôf°+MXËw‰ê‰{³¯€E׿þˆü·MU»4e° @m»ÒäÕûêŸg_‹kЉâÀŸI‡Ñte° @S»Ôf°+M`+vꩇ²¯€EÓ¿öü7M]»4e° @m»ÒdÖûÚ_d_‹£×ŠbÍ^éï/š¾ vhÊ`€Ú v¥ måîQµ˾B\ÿª5ùo/šÊ vhÊ`€Ú v¥É­wé§³¯€Uµ7G±úéï.šÎ vhÊ`€Ú v¥É­XµgTíMÙ×À‚é]ôñô7Mo»4e° @m»Òd×»|yö5° ª'î‰ÖŠg§¿·hz3Ø )ƒ]j3Ø•&»b¿çEÕy"û*h¬{æ{ÒßZ4ÝìДÁ.µìJ“_ÿŠÕÙW @#åÆ[¢5·4ýEÓÁ.MìP›Á®4ùû¿0ªÞ|öuP[çøßHcÑôg° @S»Ôf°+MGýkʾNj~ïoÒßV4ìДÁ.µìJÓQ±f¯ˆ~;ûJØ1å0Ú‡¿!ýmE³‘Á.MìP›Á®4=õ¯;,ûJØ!ƒï|1ýME³“Á.MìP›Á®4=k_ê·ì“£ßŽâÀŸISÑìd° @S»Ôf°+MWýkʾV¶KÿŠÕéo)š­ vhÊ`€Ú v¥éªØÿEQu·d_-Ϩ*b¿ç¥¿¥h¶2Ø )ƒ]j3Ø•¦¯þ7Wf_-ϨwáÇÒßP4{ìДÁ.µìJÓ×ÖßNSµ7e_/ÿ ò± ÑZ¾KúŠf/ƒ]š2Ø 6ƒ]i:ë]úWÙ× À?¨sâo¥¿h63Ø )ƒ]j3Ø•¦´•»G5ÿpöð¿n87ÿÝD3›Á.MìP›Á®4½õ.üXöð? ºÑþÜkÓßL4»ìДÁ.µìJSÜògEµù‡Ù× À6ý+öË/ÑLg° @S»Ôf°+MwÝs?”}ÍDµåÁ(V>7ý­D³Á.MìP›Á®4å-Û)ÊÇ¿—}Õ3®{æ{òßI4óìДÁ.µìJÓ_÷Ì÷f_5À ÞwM´æ–¤¿‘H»4e° @m»Ò 4·4ʇo;n€YT•Ñ>úÍùï#’Á. À`€Ú v¥Ù¨sÊ»²¯` n8:ý]DúïìДÁ.µìJ3ÒÜ’(øvö•̪½9 ï£ vhÊ`€Ú v¥Ù©sÜ[³¯`†ô¾úçéï!ÒßÏ`€¦ v¨Í`Wš­†wœŸ}í3 |d}´–íœþ"ýý vhÊ`€Ú v¥Ùª}èÏE ûÙW0ͪ*:_ü—éï Òg° @S»Ôf°+Í^ýo™}õSlpÓ±éïÒ?”Á.MìP›Á®4{¼8ªî–ìë˜BUñ£(¼9jL3Ø )ƒ]j3Ø•f³Þ×ÿ:ûú¦P÷ì÷¥¿{HO—Á.MìP›Á®4£í»[TOÞ—}SdxÏÑš[’ÿî!=M»4e° @m»ÒìÖ=çýÙW0-Ýh¯{}ú{‡ôLìДÁ.µìJ3ÜÜÒ(º)û¦@ïòåùoÒOÈ`€¦ v¨Í`Wší:_z{ö5L¸òñ;£µâÙéïÒOjøÃod&œÁ.µìJÞyQöUL°Îñ¿‘þ¾!mOÃû®É>.L8ƒU]_S3IDAT]jkðÒI%åÖ^·wD9È¾Ž€ 4¸åÄô· i{+¼1ûÈ0á v¨­uàËÓI%å7¸éØìë˜0U{S~!€&¨ò‘Û³ Î`€ÚŠƒ_þH*)¿bÍ^QuŸÊ¾’€ Ò=÷ƒéoÒŽT>þ½ìcÀ„3Ø ¶bÝÞ餒ƣÞesÙW0!†÷^­¹%éïÒŽT=y_öÑ`ÂìP[qÄÓI%I+ž徟}-ã®_Dûs¯ÍËv°èµ²OÎ`€ÚÚÇüjú#©¤ñ©sʿ;–€1×»èãéoÒ·b×ì£À0Ø ¶ö)ïÊ(•4V ï¼(ûjÆTyÿ·¢µl§ô÷ iG+ü™ìãÀ0Ø ¶ÎW>˜þP*i¼jòšˆA7ûzÆÍ íu{§¿]Hujù Ù'€)`° @mÝK>•þP*iüê_}`öõŒ™Þ×þ"ýÍBª[ç„ßÌ>BLƒ]jë]}`úC©¤ñ«XµGTO=”}Ec¢¼ÿ[ÑZ¶Sú›…T·îyÎ>FLƒ]jëßúåô‡RIãY÷ì÷e_QÀ8t£}Ø>éoR“úW}’˜»Ô6¼ïÚô‡RIcÚÜ’Þseö5$ë]üÉüw ©aƒõgd%¦€Á.µ•O=œþP*i|kù‹å0ûª’”\­e;¥¿QHM+¼!û80 v¨¯ªb~Ů饒ƷÁ GgßT@†A7Ú‡í“þ6!-DU{sö‰` ìÐHqèëÓK%oÅþ/Œª½)ûªF¬wé_¥¿KH QñÙ—g'¦„Á.tNû¿ÓL%w½ þ4ûªF¨|ð†h-Û9ýMBZˆ:'½3ûH0% vh¤wùòôSIcÞ²¢ÜxKöuŒÂ íÃßÿ!-P½K?}ª˜»42øÛ¯¤?˜Jÿ:ÇüJDUf_YÀ"ë}õÏÒß!¤…lpÛ)ÙÇ €)a° @#妤?˜JšŒ7~!ûÊÑ𮋣5·$ý BZÈÊMwg-¦„Á.ÍTU´Vî‘þh*iü+öû©¨æξµ€EPµ‹bÍ^éïÒB¶õß4,ƒ]kÿöô‡SI“Q÷Œ?̾²€EÐùò¿IwºîiïÎ>ZLƒ]ë]¾<ýáTÒä4¼ã‚ìk X@ƒ>ŸþÞ -Fýk?—}¼˜"»46¸ûëé§’&§â WFôZÙW°ÊÇïŒÖÊÝÓߤŨ|ðÆì#À1Ø ¹n+æçvJ<•49õ.þdöÍ4U¢ýù–þÎ -FÅþ/ЍÊìSÀ1Ø`AG¿%ýUÒµlç(7Þ’}u ô.ûLþƒ´HuÏúãì#À”1Ø`At/[–þ€*i²jýËå0ûújÞwm´–ù«[šÞ·~9û˜0e vXÃû¯O@•4yõ¯;,ûúvPÕ›öç^›þ® -ZsK£j=š}Ô˜2»,Œ²ŒÖêæ?¤Jš¨ŠU{Dµåì ØÝsÞŸþ¦ -fícþEö1` ì°`:g¾7ý!UÒäÕ9å]Ù×°·šþ– -výo­Ë>jL!ƒ]LýYé©’&³á†s³¯0à'(7ÝŪ=ÓߤEmniTO=”}ܘB»,œ~'Z+÷ÈP•4qk_UçÉì[ x:ƒn´üÅô7i±ëÿ¯²OSÊ`€Õ9ó½éª’&³Þ;€§Ñ=ÿ#éoÒ(ÜðùìãÀ”2Ø`A 6œŸþ *iB›[û.ξƀ3Xfþ»4ŠöÝ-ªöæì#À”2Ø`aõ»ÑZý‚ü‡UIYqÐ+£ê>•}“ÿM¹é®(Ví™þf ¢î9ïÏ>rL1ƒ]\÷§?¬JšÜºç}8û¶t£}Ô›Òß ¤Q5¼ïÚìSÀ3Ø`Á ½cÛŸ¶Ï~\•4¡Í-‰á÷¿–}•ÀÌë]ð§ùïÒˆj¯Û;ûÈ0å vXíc~5ýUÒäV|öåQužÌ¾Ê`f ÖŸ™þ> ²þ·Ì>vL9ƒ]Eÿ–“ÓX%MvÝs?˜}•ÀL*7ÝÅ~ÏKFU±ÿ‹"úEöÑ`Êì°8†ýh­}YúC«¤Énxç…Ù·Ì–A7ÚGýRú›€4ÊúßX‘}ò˜»,šÞ•¤?´Jšìе/ª½9û:€™Ñû꟧¿H#mßçDU<ž}ô˜»,š²ýD´V>7ÿÁUÒD×=ç?d_g0·šþ º­#uƒ]U÷¢O¤?¸Jšü†û•ìë ¦ZùðmÑZ¹{ú€4ÒVìÕ–³3Â`€EU>ù`Ì/vþ뤉®XûÒ¨Ú›²¯4˜JU{s´yuú÷iÔõ.þ/ÙÇ€b° À¢ë^øŸÓ^%M~ݳþ$û:€éS•Ñ9ééßû¥QW¬|nT­G³O 3Ä`€EWÎ?­}ý9=IÍn8/ûJ€©Òûú_§ß—2ê]6—}ü˜1»ŒD÷’¿J€•4ù¼8ª§6f_i0†wœ­¹%éß÷¥QWø²¨zóÙG€c° ÀHTíÍÑZý‚ô‡XI“_ç„wDTUöµ­|ìŽ(Ví™þ=_Êhpë—³ 3È`€‘é]dúC¬¤é¨í!ÙWL¬­¿Y´}Ø>éß樓Ú_øçþÇà¤0Ø`tÊa‡ÿÓôYISЊgG¹ñ–ì[ &OUEçÔßËÿn/e´l§(¼1û0£ v©Á=WÇ|ö£¬¤©¨½nïˆ~‘}­ÀDé_±_úwz)«ÞEŸÈ>‚Ì0ƒ]F®sú¦?ÌJšŽºç$ûJ€‰1¼ëâhÍ-Mÿ>/eTü³½Vö1`†ì0råü£ÑZý‚ôZIÓÑpÃyÙ׌½rÓÝQx“Ó¬6·$†w_š} ˜q»¤èß|bþ#­¤©¨ØÿEQ=õPöµc«ê<íu{§‡—²ê~åÙÇ vÈÓ>ùwÓj%MGã~=¢*³¯5?å0:'ÿvúww)«ö!¯Žª»%û$€Á.yÊ'îÖ~?•þ`+i:ê_}`öµc§÷Õ?KÿÎ.¥µ|—(¼!ûÀ6»¤ê¯?+ÿÑVÒôü0|;ûZ€±1¸éØüïëRbý«ÖdCø vH×9ç?¦?ÜJšŽÚ‡þ\D¯•}­@ºá]—DkÙÎéßÕ¥¬:'üfDUfEø vÈ×mEñ¹×¥?àJšŽºç~(ûV€TåcwD±ßO¥G—²*zETÅãÙGþ»Œ…áÆ[c~Åné¹’¦£Áú3²¯5H±u¤XüªôïæRZûî寛³"üo vý[OÉÌ•4+Ÿåc²¯5­a?:_|[ú÷r)³ÁÍ_Ê>‰ð2Ø`¬t/úDúƒ®¤é¨}ø"úEöµ#Ó=çýéßÇ¥Ìz—|*ûÀÓ2Ø`¼ Ñö[@$-Pݳߗ}«ÀHô¯Z“þ=\ʬ{æ{"ª*û(ÀÓ2Ø`ìTíÍQ¬Û;ýWÒt4¸ñ Ù×,ªá†s£5·4ý;¸”Uç¸_t³"<#ƒ]ÆR¹ùÞh­ùéô‡^ISЊ]£|è;Ù×,Šò룵ïsò¿KIµû'Û~ Œ;ƒ]ÆÖðÁïDkßÝÓ|%M~ÅA¯ˆªøQöµ ªÜtwköJÿÞ-eÕ>ä5Q=õPöQ€íb° ÀX|ÿ’˜_þ¬ô‡_I“_ç”QUÙ×,ˆªõh´yuú÷m)«â WFõäýÙG¶›Á.co°áü˜_¶sú°¤É¯ÕÚì+ «zóÑ>úÍéß³¥¬Š_ÕædEØ!»L„þwωù¹Ò‚%MxËvŽá=Wf_iP_9ÜöWdÒ¿cKI½"ÊMweŸDØa»LŒþ-'ÇüÜÒôaI“]±ö%QÍ?’}¥ÀŽ«ªè~åéß­¥¬Ú‡íÕ–³O"Ôb° ÀDl8?æ—?;ýaXÒd×ù⿌(ÙWìÞeséß©¥¬ÚG½)ªÖcÙÇj3Ø`â ¾ÿµ˜_±[ú±¤É®wé§³¯3ØnƒIÿ.-eÕ9ñ·¢ênÉ>†ÐˆÁ.ipÏÕÑZõ¼ô‡bIÜÜ’ÞqAöu?Ñð{_Ö²ó¿KK uÏÿˆ¿”ÀT0Ø`b ÿ~‡¼&ýÁXÒäV¬Ú#ÊGÖg_gð´ÊoŒÖÊÝÓ¿CK#onIô._ž}`Áì0Ñʧ‰âè·ä?KšØÚ‡¼:ªö¦ìë þ7妻¢8àÅéߥQW¬~~ ¿÷7ÙG”Á.“¯×ŽÎiïND–4¹u¾ôvZ€±Rmy0Šƒ6ý;³4êÚG½)ªÍ?Ì>‚°à v˜U½k?óËvNP–4™õ.üXöMÛTÅãÑ>lŸôïÊÒ¨ëžý¾ˆ~‘}`Qì0U?¼2Zk~:ýaYÒd6¸ñ Ù×3®ên‰öÑoNÿŽ,²bÕžÞe˜z»LrËCÑ>æWÓ™%M`ËŸÃû®É¾Æ˜Uý":ÇþZþ÷ci„uŽûõ¨ž¼/ûôÀ¢3Ø`:•Ãè}suÌ/Û9ýÁYÒdU¬ÙËIÀè {Ñ9ñ_§/–FÖŠ]£ÕÚˆªÌ>}0»Lµá7Fñ¹×å?>Kš¨ÚGþBD¯•}…0+ÊatÏøÃôïÃÒ¨Úú›¤ËÇ6dŸ<)ƒ]¦_¯ˆîßü¿1?·4ý!ZÒäÔ=ý"ª*û`ÚUUt¿òôïÁÒ(*V??7çÍ€™d° ÀÌÞÿí(ÿ§éÒ’&§þ7We_]L¹ÞEOÿþ+-zsK£{š$ûÈ@ƒ]f˰½+ˆù»æ?RKÿæ–ÆpÃyÙ7Sªwùòüï¾Ò"×ùâÛ¢ÜxKöq€t»Ì¤ò‰û¢sÆÅülŸn87û¨ÀØ0Ø`¦ ï».Уߒþx-i¼+þÙ¨Zf_YL‰ÁMÇEknIú÷]i1j¯{} n;%¢*³Œƒ]¨ªèß~FëöNÌ–4¾µþåˆ~‘}c0á7)ZsKÓ¿çJ ]{ÝÞ1¸õäˆr˜}Ì`,ìÀW–1Øp~‡ÿ|ú㶤ñ¬sòoG”ƒìÛ € 5¸ý´h-Û)ýû­´uŽù•¬?ÓP~ƒ]øqå0ú·žÅ‘oJì–4~õ¾úgÙ·hpËIƺšžö}NtÏy”oÉ>Z01 và î¹::§½;æý™BI¯þÕf_OLÁú3¢µlçôï³RÓÚ‡íý«ÖDÕÞ”}¬`âìÀv>þýè~í/¢µÿ‹ÓÅ%AsKcpûéÙW`pÛ)~³®&ºâàŸÞ%å÷e'˜h»°#½è¯?+Ú'ü–ߺ+Íz+vá½WeßJŒ±Ám§ëj"+~Uô.þd”Þ}Œ`jì@MeëGÑ¿ùÄhŸôÛ1?ç¿x‘f±bõ ¢|ìŽìë€14øîYÑZ¶súwWi»Úw·è|éíÑ¿jM”Ý”}|`*ìÀ(·lŒÞu‡Gû„wÄüŠ]óØ%ôÏBVód_CŒ‘Áú3Œu5Öû¿0:'ÿNô¯Ü?†÷\1èd˜z»°Ðú|ÿ’è^ô‰({CÌfIú¼¤Å­}ô›#z­ìÛ€10X¦±®ÆîlÜùòïFïÒOÇàöÓþî¯UUöQ€™c° ‹¬ê<ƒï]ݯ&Ú_|[´Ví™þH/iáÛú[i¢f_9$|÷ìh-ß%ý;ªf¤åÏŠbíK¢}ø¢sܯG÷´wGï¢ODÿ[ëbxÇQ>r{T½ùìcü7» Ü|O îøjô®8 :güQG½9Zû¿(ÿ‘_R£z|4ûz QùðmQ>t“´°m¼%ªÍ?ØVùÔÆ(‹MQv¶dÿsbÇüWžö€lø8£\IEND®B`‚‰PNG  IHDR$$ᘘ pHYsèèµ{RkÝIDATxœí˜[HaÇG¢¨‡.RQÐCô=D­Dˆ²Ûc¯ùØK½¸ëš®HQ‹hIëª(¶a,ˆ]Ö ÊTÚ cK3·­vÅÛÎ÷í\OÌ K³»³s6œ¡ÿp^æræw¾ï|ß9ß0̲ D¥Û‰ÇM8WBÂΨÆVoéW–ZB¨1õ 9WñEIWi!C}gBš›å«AŠ|³Äu^Éeg€>¼ÐÏúÓ_äûëÁT I uû²‘[œ!÷öϤ.Ü? Ëæ€8ÖÈsxJ$Ž¿Å{•e~ €îqèÈl2 ÇWN«¼â.µ0ÅrcÂQú™}îà“{¨í>h2èË@;±ÔâlÐŽ®­2 þ° 1ýw(;’¨uʨ?JþsÖÍÅv ÜÆ˜ë@˜Û”SÁ.Qk«vd b;‚Ñp½3F]¥¹ÈgwÊÏ'õµ(½½MÖAøñÐAï‡Z”|B· ÇTÒÊÌ! S†P ÒšC @Ù;µòæ¯ÿKßqo¥VA?U`NĤœáA]ù–é6–”É!3ÿrÈÆ9o˜¡ƒ^Sêþ,×}¼'‹ë²6¶À|÷G’^½¿å‡¬“ˆéÚѵ¶üêá•æÝ(f ~òM¡o—æ-Œ$1k°{œz;b]`³Å:ÐNl%?ÄŸßþû»\5ÛòZ‡!½¦Ä¼RÝì¤üëxs.£Ÿþ”=³AZ1„™¹þPKV P¶Or¿£dx‹ëBÝl[ô3…(ÄŒÔM`€ÑxŸÜ›º L@Yý4t&ÆaöÄu)u˜@–0dH Ô `óHˆ@;]ÀyCPñ]q‡p‚³…·öûVEþHê&0 Àh8@˜ÿ4u˜ W@ e¿KÝ&½×¶¶ÀµÁhy-¨x) eï\ê&0 @ÙéG •ÿFÝ&HkÆ 0ÏQ7Iäœ –ø¤^Ô`?í4bú‹Ô`‰–¶òB-yÝXêF0 €láaH-L¡n“°Îég‹¨Á$iÕh Éæ m3˜ Ìy @Ó' a 9 2‡@Zû u3Ø@Ö„ªv£P S©›Á$¥`Þñĉô a9E†C@ Ëݱk i˜X3P7„9dÓÜëQÈ['P7„=äA\‘‡@+Í¥n“°ö þBØS±€ìÛbI˜ù uS˜@ŽŽ`IZýuS˜@+]U=øKû1wÚfæ’7´²Í ä%@-ÉA`4žo“Ï2‡! å$1P=°ÐÌüù¿È¤6hò¦¯KÂì¾Ô m5b;™m$“T’ªJ–Ó­¤Ä:`kB’œMßä«‚äKËß7Í6ׯ‚Ì ùiŽ 6‘EÒŽm f6Ù 5ÇkíøF0„‹!ë—3ˆyc Šæy4Ó“{ƒzh9u']íI‡u€Ä’¸ä-4â‚W© ­¶Hˆ–Ô?2јÅ=$e¿ç É:Ã@i¬!Ö›Ï Ê®é(}Ó¢œ ¡ÿu°$-†@«ØŽÒaÆýÎÓÌXÒÊ6¹n>?ùf”l RÍ+P\Û0‹x€a€ðÓ£®0Ëï#H;¹3ð`€yÅ V£Rÿ\쀘 ŸÚƒÒ@³à `fϘÒ5æ?åÎÕ¿ômÀyÓ €T¢²{b".´ÕNÌüHõ0ÈPÚR6hPøîl©û³Bg~b¦4$µvä&(˜'§¯–ºo~À7 ;AvÜ0_¥¯U)hÒÚO†´[ÌFsÕ# ¹½Í­=ÂÀO¹-›¾™Þü„0ë‘ÖÛ×ÄÌ—ÌedRד†H¾u«> €„zhЖQ[aîÖ‘²—òÖïÌG’× •oC;ÏÔš¤Õº3‘¯-Šì%p“nt ­jí~2+²Í¡Ü)²{䩹Èg¾ÈªëÌéü¹ƒšÞ’,ònàð©|ëéŠôóÅ–Kïóþ»ÁÇ%õ´þ!·–ÞˆŠ³¯jBK“A˜÷„eßø¹ýŸòÌÙPœcáµ¶ä_Ú=–(õI9£¾q €ÙtgiÇ7Ú;Õ×ä¢ôáMŸ³MíÜ1„˜a;é5‡Ÿr«-¿¤õŸ\ù ó¢Á|ZÔaÇ"̇P8ɨ¯²·>=H¹ÑùЩٗµÅœ‘c„ô¨2.¹Ì%v׃ ~Îã’.5T@y»™«2ñ\r¤ÒZð3îS„”gÅ£ Õ})¯¹ôEzOž¥Ý!|uJ¶Ÿ’iE¼gØUg¦ó7Í'}OV>¹Ón„àÕ)ʳÜå =ð_VßSÒceG@¸¦¶Ý7ÃdK¼s ØýNÍ^Чߩà/ú/g|`8£/Õó&ÊŽ„hÝœ,kÏä@¼µì>Çã Ú[€S}ÄÖ®¶åŒ÷okðçõ¼xiwÓ`¢õO©¿¶ öÐó ¶wDÎÐÓwÅì- l¨F,=“ Áò‘èrª+èø«¢ð9ý¥ƒ´½X°¨<§â0øøOü]NåLÃXõ~Dìî«ò$-/âͽ »ÞL>D8£¿ƒ.§5ðl5@AãD-/àŒ¹ j=cÌ&Ù÷.þ^Þ nXÂòÓÔÿc9–ØŽ]g¦ƒDëçUÒUNïé¿‚#¤Tÿã²# Ú¸¤£ua Á¯»UN§¦«â¸TÿÓàűëʤo3ä‹xr޾Dšÿ¡;á*€$I¥6 >ÑÆ¥`•tÅ‘sÔ×Ò“Ó®é~à(hùy^1Z-Òp†_€¶I-9ÕS!¢+ÔäºÅn7¥Ý!ÞÖØ±—Ä-"¾2üºßƒóÐ7Œþ"j‘SÞ¯Ñ]AƒÛ¹"§ú޹,§/²+DMuê6E>Gè“Sþû= ˆübaŸ#4Ê)ûv®Ÿ‘‡ÍbŸ#ôÊ)WúP$l|½ø¡WNw€"²Ç=vñ‹-ÎsÕQ•Á‹ÃÀ›{·~9í>Ç$1P„{( m±+OwÂUà/,ƒ¨©N B?L°|¤~9eäÙæÉåÛˇOÅ1ê´<Þ½6Njñá0K*Ãc²‘3l  _›Žÿ‡¥–Ònà ¿@õÍ’?ÏÑÆ¥‘ŸíWNÈFNoöo€"<ß)yàƒ7ý&– i1°3ë8ŠœÎˆ‹€*ÎÈ‹Ñ0%vå -?ÏÏþãà}âNmuÏìÊ)[r'^3PÄêÏèR ¤ühp«/W\ÂÕS!Ùûv¦uÏìžS&ÚðP$zóY|QˆÜ'¦If£u™ ¾$òÁîs¾@)Æ|xÓÁ ƒ!Ú¸À·À4‚eC³“Ó­¹¨âMýmœ¦º7G¯?©õ>1M‚E÷g'§Ýï’Û…%rn[°N]¦\Ôs¢™ÉIy»pâì!}Œ_wPC®ÎTN¹˜‚*nõwÑ%ëh‚Eå@ ·æšlåôfÿ¨,„.Y‡/ Õ@ gÔ׳•S>M ŠZ¥DôlöxËË@ 9FÉTN™äý@Ù  [´¼SÚ tÓgK]ÎpåD Jøê|ÙòŒ3òb F¼« GNoÖí@–ÀQÏ—±…Ë«Þsï‚BmE™ºœöàÏe¼9¿C.ŸDæ5‚çûâÈ)“õ"‚4‘‡€É…,ØÒåt!èÿ)Õ^‡^í-xrÊ'”q'_‹.^.ñæÞ …¼LQ‹œîä^@Ù [¼\omrøVÎOã´È©pMiÅ4rs¶|V.´‰Þy>çϨGNy£ÞT”‰w¬«ìt ­¶RÚ]½?Š‹ûãËéÍù-PÇî_ø"önÙ%*ùœ¥MN»ê ²Kè8Æímwù6@IB/¯Æ½Úä¤Ü\ö£O3ì¾'¡KiÉ/ü ³ÕžT‰ÞZ˜ßQ§œòéB@î¾ÿ´}â÷ÖeügÿnŽœ²7ùŸöƒD¯?VùQ(b:#¿ªVMQ'ß¶“Zå”Q;ý 9 "O¯ËLÌ’.-«Ü¨o_•ÿ—R·œT»´G²o“j< ýjùP–“BGÅÕ.§êBG|B¾I á+ãÁ®:3õzIñ£µ“íÜ×&I¬¢'§Œì‹S„®j«"§w:u•ö%5§Jub=§eGê’…œTÌæƒ°È½<Þ¬;Àyø[ê£U-JºªQ·ê[ùÄÔ–dÊSC¹âM»Ñ\9U/¥æÍPtÄ$Î^Hì0²ëFfLj—i°œ„{Ç3Cv¬ë¨3™É)§`ŠõêQ¬$Þ~Õ~Ûx9e—Á®C¨@¦rÊQ©¼c ŸÄk»ß©tä,èi%¦Ó“îèròÕ³ðIl»âXzrª«gã$ìú1È䌕SNDÂb¦5Ñ;‹S;¡¤EÎòÜW'§• ¾¢Æ&ôÔÉ*i9âŒí Ârnærʵ‘r…S8ø˜po+îŒ[@85½²—S.§›zv=™”ˆ6-K½…¤¿t0ˆ`E5Šœ2áš™iÕ‡A"qßïÐ’¸Ã%Þ³Dlï«ç¸{Àéª';C”$÷±ëR÷Â9¸’MÈüú>hWO¹¤Š¡I°¤*}'JºB´­ñ9Á·ÁÕMP~îN¨©NK«r¿¾òÐkˆCË÷m«ê,AË*Ø•à…H¼µ!¯ ¹Æu'@·–S½hó°¾EP¹u”ï?Í'Þ³AutIõï_Ú üÅý[m%ÿ?9þ’`UfßéÂ×ýÐP¦}äÜ´ì^Úß¼¤ 85×@´ãµ6_O´ûF¼fVMwÚ`¿¬Œöl»³îø˜ò0hN‹ £zt*ÎÄ;óvð—‚ø0{¨Ú•“a°a9ca9ca9ca9ca9ca9ca9ca9ca9ca90•ÿ{Ëw¹À¦IEND®B`‚‰PNG  IHDRHHUí³G pHYsèèµ{Rk¤IDATxœíœylUǧ-Vð@[¯Äˆ1^A$i¼0ŠŒÑÄD%x$¦^1*ž11ô.-´Ki…ÒƒZAŽ ˆ-`m¨D¡kKHŠ¥ZhQ¶ÝvæÍý~æ I…ºíÎìþ†vŸûM~Ù&û~ï³³ïýæ÷û½„°Â +¬1$'G*UñÅRAÜ€˜KÅ…—`1Tk*À3ÞÍôï—ro5Fž‹ˈ¥RAœW®Š/dL†à²Ùíb‚þLkX¡$³» ¤ôKýÎË—‘ò'Ú BPª^-·gW„¢Œ¶í &FIþöíU‚”7Mòw¡²q.„²ÔŸHZyWS&Ž~ÑÒÊýÒ2T +îr)ëZ*ŒzAr4˜]û™½‡@LšàìZtŒ H«Ož¤~÷ òùMº <‰H™WàÒ[ å’Y ¥]‚ à )}2`JÛéú$Î+ ²|* eã\έ¼Ìâ®!oñ¤p_€äÒ‡PÉE39´úQ\@kžâ Yq'* eÓ+|’r®G¤Ö.à ˜: ÞXÌ @euÁóûÔ,† ód3 *ýÍ ½¥0%åLá ¶+¼öi¾)•/£RHà Y~;* ½µ’/@,iN•4@æé#œbYÅŽÝh€€R+ÏÄ ­a)rÚã¾±„7¦ÔšùDroA¤ú†/@¬EÉi4@¬À¾“@l¡þ£0Eò¦òˆU$0¥lyƒ/@òÚgPé¿ÿ@²¯³HZt5* Ú×1æÎ™_úd+g®VÏ·Ðé`µîÚÄŒzŽ¢BbË1’|UóS¶¼iuŒ˜½­VûŸÑ) ½y* ¥ò%÷a$EÉŸJU<èû Á<ñ+€©ÛòÏ1 µz>* ½ùkü¿JF¬ÕpÅš¾ŒŽªƒAu½9D g ·¿±Ûºýcך-ü“£QsÔLòêGPa>7íu%°~¡€)½i5* Ì€vø` úýg€)–k ªãìlK™ˆš»Rë’œ"…÷¢90äHõû(€äuϺš?·HdÆÁTG¨÷¸ÕÅ Äôs$Ž"é³Mo,li{s‚¤n{¿ÙtضÉÈÏeg<¢ lx!°¿óÇÐPÝÑöåHL޶ª¤è2uP·½k?W”:éL›25Ñ]‘Ë P‚ÚÏùà–X‘€5y³Âר$ï6k7¥'\Ÿz»|°ŽäþEŸŽÕ®ÿ¾ÁŠIŒÎ=@û¹>îHÅMG€DìrÐx‘.[©@rù“ð:?æÈbîFàE¬˜ -¼Ì ” m±E3}&›BQÊæ×FŸoö*H˦ú=7/3v€$Ô¥·nò¿1•>씊y¥NI™Wè†Píë)#Æïr¢Ô¥d ¤dV›SHdÕ}ÖýP xY\å޼ùõ_þ}û‹ D(/æKùÓûÄŒÓîÛR”šäñð¦Ûfhyýóª¸äÓ—I¹7ërÙì¥>5i _ÆVXa…–`Sÿ5~9-”æÝìIEND®B`‚‰PNG  IHDR<<:üÙr pHYsèèµ{RkIDATxœå›khEÇ·*ñE|~Q[QQŠRÁ¢XE¥UPQÄñ~ Þ¼šÖ$jú²Ú&6ij“ª5HÛT«1MmÄD4Ñ”V´”±MmóØ™Ù×ì_f}@îͽwîžÛd×û‡ómwÏüvfçqÎY&&&…,Ùqˆ–§`–Ÿ3a¤ZÉép÷oET$»Ó·5Ù– ±íqȱ¡à^¶ ¶êšô7Ï‚Û[¨Éh…Yr†t«™)FaØ{Ê2^ètV#ªr¾X® l& Øû*aðúi/ïÞø>"+éAl¼S˜7-†ÁÖÏ›zT_ß<†¨Ë?yfùÙzÀ÷¦öúw .²Û4`±ù>ÄI¾=ŒÈÐÀr°;ÿbÇ!‡ûóÙHÞŸï|ùz8`þö-yk„€ýÉK`5W¦,u|ÝMp{‚‰'òÅ(XÅìÜÎ*ºwéÁn[ ³´(ë[ wÃç'èÀ£ƒ s–"z–°Þ4§õ‘×Þ8\ß…8 ïP[°‹¦E`Õ—†›´øª«éßRךœ`ÿ5kÇ3S?е ýN÷ZX-O‚¯¾6ø$ÂøàÉÀ¢ù!­ôÀª.Õáé„?>÷À6Ø¿Q7fÙYáž§l·-%ñz?FkTÈž ìölœÖ½ítO&Õ0ŒðÁð®âì÷ÏÎÞe1ëá¾&°ÛóN¼€®Õ$`o`W¼€íöb°ê°õÑÓä ü©^Kó ,êæƒª”“Q”ÙŠ ÈÀbëÃñ69Žåt”Ç Øûi7 Øûq{¼€½ô(bœ€EóbPÅ^½0>ÀìµËÉÀbÓ=ñ6ÕÄ5þwâéÿ6qñtÀÔC„w¸#^À6q‹ ‡iE,#,Ò€ðÚÛgÐ,>-ÈgfËÏ Â­ÙŸ¾<í€*\+¶<{O)¼þA¶Ãn}.;°2yô°rxJá*f{Vr¿ß ÿÄá©_|«&05뜜ÊÎÌ`iø†y°[Ÿàä±~í¼µ½óY=`kûP¥†V Oxvè6X>¡Ì×\GV½AV{ó|m‚x&`e*A5ÓÃ:Ý·©+þæ úÀÔÀ<õ|ÌWÎ¥9÷œI/<+°ÊRåýòUh`g_%É·î›ü³³çç%am}ðXˆÞUCF‘ûmmnÀÊä`Ø·ÆÀ×ߪ ˪.t};»³”¤‘·óŠæaïöŸŽî7‰rÝýÙ¯`pÀ8+ûÑðºè|}¿hÿÑØýuù_$½`Í&ÅãÙ'@ŠrÍUQ¬|iú$Í|»¿>ZÇÿáüŸ3•koˆ(ËìWð 8`̔Ǣ{ãñÑ:åÏ£±ê5ù/wI•júK1h¯Ï>JR•÷=ŠÛ¥ßÕH’¾§]vŒÖ±¿Ý«Šò釲_À³0à€1Ðøæè\°<Šƒ~.K6ËKÚ¤ZGÿvD¯•}¤Œ…þ½Gcù¶éw6’¤giÉfQ¬~Ot.\ýGoË~eßeÀIÊ'ïÎ埋æê÷濤%Õ®}ÂEô»ÙG ÀXéß}^4–o“~w#IzþŠ}ßíó–FÿÑÛ³_0Ó 8`„ÊgŽÎ%»G±ÿ;Ó_Ä’®Î×þ&b0È>bÆRÿ[ÿe[¥ßáH’6®â€ŸŽÎe{GÙx,û3Ç€†­ìGïγç§Xcé–é/]I [çü%Ù§ ÀØëßvZ4–n‘~—#IªÐ²­¢uüDïîó#Ê2ûU3Á€†ùÓ6.\=ß”ÿ‚•´ðÍ-Šî¥{d5£wó‰ÑX²yþ½Ž$©rÅÞo‰Î%«üT2X`ýÇ¿í¯ýM4–o›þ2•4ÄñÆûd7§wóWŒ8$iÒ*ÇWþGô¹5û•SÉ€HïÞK¾ókR–l–ÿò”4¼æGïÚò€‰Õ»îÈù;–ô{IÒ¦7·8š_úPôî»4ûµSÅ€jêÝqfþLþ‹RÒð[²yô¾ytö±0ñzW<ÿSNÓï{$Iµkò Ñ»çÂìW L¨ñ7š‡þRúKQÒˆZºåüïi`aqHÒtÕ\ý^C¨É€*êÝwY4{úKPÒ[¶uôoÿZöñ0uº—í•÷#IZÐ6üj•þƒ×f¿b`"pÀF*Ÿúv´¾ò?,Â¥Ykù¶Ñ¿ëœì#`juÎ_š$IZØæEëØß‹ò©û²_30Q 8à…´Ÿ‰öyKçÿ~úËNÒhÛéÅÑ¿ç‚ìS`êuÎüÛü» IÒ·Ӌ£}Þ’ˆn3ûUÁ€žKYF÷Ú#¢±êÕù/7I#¯Øy‡(¸2û$˜ ƒ2Ú'üaú$i8{½9z·œ’ý¶±gÀÏ¢ÿøÑ<ìýé/3I9+_åš«²"€ÙÒïFëK¿‘~7$I^Í/þz”O};ûcË€¾W¿‹wõëR¤™õñÆÕÙ§Àlê6£uÈϧßI’†W±bûè\þ¹ˆ²ŸýÖ±cÀßÕðº(öWúKKRò¯M1ÞH5h­‹æþ?™~W$InÍÕïò‘Û²_;0V 8 ×‰ö9ŸÆ’ÍÒ_T’ò*vÙ1ʵ7dŸHlq<ý`{½)ýÎH’4ä–oË÷‰ ²_=0 8˜iåwG±ú=ù/'I©»¾"ʵßÌ>’øåwE±êÕéwG’¤á×<üW¢\¿&ûÕé 8˜YÝëŒÆò§¿$Áxãá³$žÅ†{› ¿ö6ûI’4‚vÙ1z·žýêTÌœ²x"šG8ÿ%$)½b×WoŒ¹þ½Íÿˆýì»$IÒš[í¯ýMD¯ýúÌ”ríõQìõæü—¤ôŒ7&Gÿ¶Ó£±dóô;%IÒh*öW”OÝ—ýú‘3à`fto8:;ù•)’þm¼qSö±@½ŽŠÆÜâô»%IÒ¥ÊÝçg¿~`¤ 8˜~ýÎüZJÉH‹Š]_å#·dŸLl‚îe{¥ß/I’FØÒ-¢óõý²_?02Lµ²ñX4ù…ü—‹¤±¨ØååQ®ýföÑ@ sþ)ýžI’4ÚZ'}"¢×É~ÁÐp0µÊ'îŠâsoM¡HŠ•/rÍUÙGu Ñ>õ/Òï›$I£­yØbÐZ—ý‚¡2à`*õî»,;¿<ýE"i<*VlåßÈ>šX(e?ÚÇünú½“$i´ûý_Q®»?û-CcÀÁÔéÞô•h,ß&ý"iLZ¾môï½(ûh`¡u›Ñ<ø½ù÷O’¤Ñ¶êÕÑðÚì· …S¥sù>ј[”ÿâ4>ã{.È>š’AãÑhîý–ü{(IÒÈòvïy“écÀÁÔè\¼kúËBÒµtËèßqFöÑÀ ž¼;Š]_™%ImË·Þ·ÎÊ~ Á‚2à`*oHúñÆm§gMŒHùÀ•ó—~/%ImK·ŒÞ-'g¿†`Áp0ÙÊ2ÚgümþËAÒø´d³èÝt|öéÀˆõnþJ4æçßOI’FÛÒ-¢{Ó Ù¯!XL®²ŒÖ©ŸÌ)HŸŒ7fZ÷²=óï¨$I£oÉæÑ½ñ¸ì×ÔfÀÁÄjŸõ™ü—¤ñinQô®>8ûh Yçk“W%I}K·ˆÞm_Í~ A-L¤ö¹ÿœÿ4VmøÛe?ZG8ý¾J’”Ðòm¢w÷Ùo"ØdLœÎe{åþ’ƪî…;eMŒ“n3š«ß~o%I}ÅŠí£ÿÀ•Ùo"Ø$L”Î×÷K?ô%W³þ!ûh` žYÅžoL¿¿’$¾b——Gÿᛳ_EP™£wÛéÑX²Yú/i|jŸôñˆÁ ûx`L•ÞÅÎ;¤ßcI’F߆_ùôÚìWTbÀÁDè?pU4vzqúA/i|jû‘ùßg ϧïÅÑX¶Uú}–$iôüTD§‘ý*‚fÀÁØ+Ÿº7»¾2ý€—4>µ¾ü[ýnöñÀ„èÝx\4æ¥ßkI’F_ë!”ÉaÀÁX+›OEñùO?Ø%O­Ã?ÑkeOL˜îE+Óï¶$I9µÏùlök6Šã«ìEó°¤è’ƧæêwÇ óLöéÀ„jŸògéw\’¤œº7ý‚dÀÁØjŸõ™ôƒ\ÒøÔÜï1h>™}40ÉÊ^´Žü¯éw]’¤„vzqô¾)ûMÏË€ƒ±Ô»åd¿PÒÿ©Øýu1XwöÑÀ´ŸŽ¦_Ý-I3YsŸ·FÙZ—ý*‚çdÀÁØé?z[4vÚ.ý—4»ì壷eML‘Á“÷Ìß;eß}I’F_óËÿODYf¿ŠàYp0V6,ފϽ5ýà–4+¶‹rÍUÙGS¨×¹ÑX²yú˜$iôu.Û;û5ÏÊ€ƒ±Ò:á¿§ؒƤ¥[Dÿγ²%¦X÷Š}óïÁ$I9ñÀ•Ù¯!øŒîM_É?¬%Gs‹£wãqÙÇ3 }Ú'óïÃ$I#¯¹ïÛ#:Eök¾c¡\w4V¾,ý –4u¯Ø'ûX`Vô»Ñ:ìýéwb’¤Ñ×>ãÓÙo!ø>ä+ûÑ<ì—ÓhIãQçü¥Ù§3fP<ͽ$ýnL’4âæEïŽ3³_Cðp®sáÊüÃYÒXÔ>í/³$fTùðQ¬Ø.ýŽL’4ÚŠÝ_eóÉì×Ì3à Uÿᛣ±l«ôƒYR~ícoþ'ò@–þ­§Fcnqú]™$i´µNùóìWÌ3à ÷W§ü¾ôYR~­C1¢×Ê>• ºíœ~_&Iqs‹£wߥٯ 0à OçŠ}ócIé5?ÿc1ð£ÉƒA´Oø£ô{3IÒhk~þÇ#zíì·3΀ƒåS÷Ec§—¤Ä’r+vû¡xm4–o›Ÿ&IY­c~'ûõà 3à`´zí(ö~KúÁ+)±¹EÑ»îÈìÓ6Jï¦æï´ÒïÕ$I#«w×yÙ¯f”#Õ¹xUú+)·îÅ»dEPIçœJ¿W“$®æþïŒ(ûÙ¯f#S>½6;m—~àJÊ«}Ú_fEPÝ ŒÖQJ¿_“$®îõ_Ê~û0ƒ 8™ÖIŸH?h%åµá_p£ìeE°I­§¢¹÷¤ß³I’FS±ûk#:ì×3Æ€ƒ‘è?|s4–l–~ÐJÊ©yÐÏFt‹ì£j)º>Ë·I¿o“$¦Îe{e¿z˜1ŒD똤°’r*ö|c žy8û€Ñ»áËéwn’¤ÑT¬zuDÇ_Pet 8ºþÚoFcnqú+iô+¶òá³!XPÓÿ*ýîM’4š:—ï“ýÚa†p0tÍ£~3ý`•”Ð’Í£×9ÙG,¼~7Z¿/ÿN’4ôŠÝ^ã§p02 Uÿ«¢1·(ý`•4úºW}ÀÐ Ö?Å®¯H¿‡“$ ¿Î×?ŸýÚaFp0TÍ/þzú*iôuÎú‡ìㆮ÷yÑX²Yú}œ$i¸{¼>¢×É~í0 8šþÚýô ikõ¡ˆ²Ÿ}ÀHt/Þ5ýNN’4üºß<&û•à 0à`hZ'}<ý •4Úš¼+¢ÓÈ>~`tƒhû‘ô»9IÒpk®~wö‡`ÀÁP”O¯Æ²­ÓRI£«Øýµó¿÷fÍ ýt4÷}{ú$i¸õïÿzö+‡)gÀÁP´Ïùlú*it+¶‹rí ÙG¤)½mþž,û®N’4¼Ú'üQöë†)gÀÁÂk?•;¤ ’FԒ͢ǙÙ'¤ë}ó˜üû:IÒðZºE”ë×d¿n˜b,¸îՇ䞒FV÷òÏe;06:g|*ýÎN’4¼ºíœýªaŠp°àŠ6ýà”4šÚ'}<ûÈ€ñÒïFë_H¿»“$ §æç~4¢,³ß6L)Tí7ÓMI£©uÈÏGôÚÙÇŒÁ3k£Øí‡Òïð$Ié¼ÿŠìW SÊ€ƒÕ>ý¯ÓLIïØó1h<’}äÀØêûòh,Ý2ý.O’´ðµOûdök†)eÀÁÂéÑXù²ôSÒp+VlåÃ7eŸ80öº—î‘~Ÿ'IZøŠ•/ÿ³QXh,˜îõG¥–’†ÜÜâèßþÕìã&Ã`­£>”¯'IZðz7—ý–a p°`š_üõôƒRÒpë^º{öQeÐ|"Š=Þ~·'IZØÚÇ}4ûÃ2à`A”Å~—Ÿ4åµOüXöQ©ïÅÑX²YúŸ$iá*vzID·™ýŠaÊp° ºW’~HJ^̓ßÑkg50±º,K¿ç“$-l~í< Í€ƒÑ<âWÓHIÃiÃw<ópö1“­ìGë°÷§ß÷I’®öÉ’ývaÊpP[Ùx4K6O? % ¡e[G¹æªìc¦Â†¿(U¬zuþ½Ÿ$iA*vyyD¿›ýzaŠpP[÷šCÓGIéwý—²˜*ý;ÎŒÆÜ¢ô»?IÒÂÔ¿ïÒìW SÄ€ƒÚZÇünúÁ(iáëœùwÙÇ L¥ÎYÿ~ÿ'IZ˜º,Ï~­0E 8¨§ßÆŠ—¦Œ’¶Öáˆ({Ù' L§²̓ߛ~(Iª_ëÐ_Ì~«0E 8¨¥wÏE釢¤…­Øã 1h<š}¼ÀT¬»?ŠÿSú} $©fK·Œè4²_+L jiŸýù‡¢¤…kÙÖQ®¹:ûh€™Ð»ùÄü;AIRíúwž•ýJaJpPK±ßÿ~ JZ¸zב}¬ÀLéœþWé÷‚’¤zuÎúLöë„)aÀÁ&+FcnQú(iaêœùwÙÇ Ìž^+š_ø‰ôûAIÒ¦×<èç²ß&L 6Yï–SÒCI SëðÿQö²˜IåãߊbÅvé÷„’¤MlÙV½vöë„)`ÀÁ&kŸõ™üÃPRíŠ=߃â±ì#fZïº#Óï %I›^ùà5Ù¯¦€›¬XýžôƒPRÍ–mí Œ‰ö‰œg(IÚ¤ºWýa p°iº­ù?øÍ>%Õ«w͡٧ ðo:hîû¶ô{CIRõÚ'"û-Â0à`“ôî»4ý”T¯öÉ’}”ÿAùÐuÑXºeúý¡$©ZÍýÞ‘ý a p°I:—í~JÚôšû¿3¢×Ê>J€gѽx×ô;DIRÅ–lÑkg¿B˜pl’Ö‰ÿoþ!(i“*vÞ!OÞ}ŒÏePFëÐ_J¿K”$U«|ä–ì7΀ƒMRìÿÎôPÒ&4·(ú·ž’}„/`ðä=Q¬Ø>ÿNQ’´Ñõo99ûõÁ„3à º~7˶N?%U¯sþ’ìØH½kO¿S”$m|~ÔaÀAeý‡oN?ü$U¯uø‰(ûÙGPAû¸¦ß-J’6®öIÏ~m0á 8¨¬ûÍcÒ?IÕ*öx} ŠÇ² ¢ ÷zÅn¯I¿c”$½pÍÕïÉ~m0á 8¨¬}Þ\úá'©B˶Šò+³`õï83s‹òï%IÏ[±ë+³_L8*k}åc釟¤¯{åþÙÇPSçô¿J¿k”$½@s‹"úìWÌ€ƒÊšÿ|þá'i£Úðû1€)Ð-¢¹ÏN¿s”$=ƒußÎ~c0Á 8¨¬±ÛkÓ>I/\sï‰Ak]ö‘,òÁk£±t‹ô»GIÒsWÞÿõì×Ì€ƒjzíhÌ-N?ø$½@˶šÿ—9`ºt/Xžÿ(IzÎz·œ”ýª`‚pPIÿño¥z’^¸î•dÀ0”½h®~Oú¤$éÙë~ã Ùo &˜•ôî:/ýГôüµûoÙG0DåwFc§§ßEJ’~°ÎysÙ¯ &˜•t¿yLú¡'é¹kîý–´ÖeÀõ®^~)IúÁ:gþmö+‚ fÀA%¯ï—~èIzŽ–måƒ×fÀˆ´¾ü[ù÷’’¤ï«}ÊŸf¿˜`TÒ>oiú¡'éÙë^y@öŒÐ ñh«^•~7)Iú÷ÚÇÿ~öë fÀA%íÓÿ:ýГôƒµûhöñ$èßvZúý¤$éßkõ¡ìWÌ€ƒJZÇÿAú¡'éûkîý–´×g@’öÉ’~O)IúN­C1ûµÀ3à ’æL?ô$}OK·ŒrÍÕÙGhÐZÅî¯Ë¿¯”$Eó€we¿˜`TÒ<ø}釞¤¯{éÙÇ0úwœ‘~_)IzQ4÷ÿÉìWÌ€ƒJŠ&ýГôZGþjÄ Ì>€1Ñ>ñcé÷–’4ë5÷göë€ fÀA%Å~"ýГô¢(v}e ž~(ûHÆÈ õT»¿6ýþR’f9¿B…: 8¨¤Ø÷í釞4óÍ-Šþí_Í>€1Ô¿íôü;LIšášüTö«€ fÀA%Å^oN?ô¤Y¯ó¯Ÿ}c¬}ü¤ßcJÒ¬Ö<ð§³_L0*iìþºôCOjÌúÝêw²`Œ ŠÇ£XõªôûLIšÅ 8¨Ã€ƒJ«^“~èI³Z±ÓK¢|ü[ÙÇ0z7Ÿ~§)I³XóÀŸÉ~0Á 8¨Ä€CÊ«wÝ‘ÙG0AÚÇ~$ý^S’f-ê0à )§öqÿ-ûñ&Ì ñh»¾"ý~S’f)ê0à iô{½)íõÙ?0z7•~Ç)I³”upP‰‡4âæGÿÞ‹²}`‚µŽþpþ]§$ÍHÔaÀA%ÒhëœûÏÙ=0áO?ÅÎ;¤ßwJÒ,dÀATbÀ!®æïŠèw²{` ô®=<ýÎS’f!ê0à iD-Û:ʇoÊ~ä€)Òúâ¯åß}JÒ”gÀATbÀ!¦î7¾ý¸Sf°~M+_–~ÿ)IÓœupP‰‡4üZGþjÄ`ý¸S¨wÕAéw ’4ÍpP‡•pHíØeÇ<ýPö£L«Á`þ/‘eß…JÒ´fÀATbÀ! ·þ-'g?æÀ”peöc ̸þgäß—JÒ”dÀATbÀ!-\óþ%û‘˜×>ö#éw¦’4 pP‡•pH Só ?Ñïd?ÒóϬbåËÒïN%iÒ3à *1à ¥[F¹ö†ìÇàût¯< ÿþT’&<ê0à ©~Ý‹Vf?Ê?hPFsõ{ÒïP%i’3à *1àêÕ<à]ýnö£ ð¬Ê‡oŒÆ’ÍÓïR%iR3à *1àj´l«(¹9û1x^3>Ÿ*IšupP‰‡´éu/Û3ûxAƒöú(vmúª$MbÔaÀA%Ò¦Õ<èç"Ê~ö# °Qz7Ÿ~¯*I“˜upP‰‡´ ùÕ)Àj}é7òïW%iÂ2à *1àª×½hçìG ²ò‰;£±lëô;VIš¤ 8¨Ã€ƒJ 8¤j5¿ðýnö£ °Iº,K¿g•¤IÊ€ƒ: 8¨Ä€CªÐ’Í£|ðšìÇ`Óõ;ÑÜ÷mù÷­’4!pP‡•pH_çÜÿýÈÔÖ¿ëœôûVIš” 8¨Ã€ƒJ 8¤kÃ"=z­ìG`A´ùÝô{WIš„ 8¨Ã€ƒJ 8¤hnqô¿}Yöã °`ëîÆòmóï_%iÌ3à *1à^¸Î™—ý¨,¸ÎùKÓï_%iÜ3à *1àž¿b¯7Å óLö£ °ðºÍ(ö|cú=¬$sÔaÀA%Òó4·(ú÷\ý˜ Mïæóïb%iŒ3à *1àž»ö©žýˆ ]ëÈÿš~+IãšupP‰‡ôì«^ƒæ“Ù(ÀЕÜ¥[¤ßËJÒ8fÀATbÀ!={~l À¬èœñéô{YIÇ 8¨Ã€ƒJ 8¤¬uÔ‡²M€‘´×ÏÿdâìûYI· 8¨Ã€ƒJ 8¤ï¯X±} Ö?ýhŒ\ïšCÓïh%iÜ2à *1྿ÞUf?–9e4úÙô{ZI§ 8¨Ã€ƒJ 8¤¯¹ú=óÿ‚0«Ê5WGcnqú}­$KÔaÀA%Òw[¶U”Ü’ýH¤kŸôñü;[I“ 8¨Ã€ƒJ 8¤ïÔ½pEöã0Ï<ÅÊ—¦ßÛJÒ8dÀATbÀ!½(šû½#¢ßÉ~ÆF÷²=Óïn%i2à *1àÐÌ7·8úß¾<ûQ/eoþ/¿¥ßáJRrÔaÀA%šõ:g|*û1Ký;ÏN¿Ã•¤ì 8¨Ã€ƒJ 84Ë«^ƒåbÛÞ IDATÖºìÇ`lµŽþpú]®$efÀATbÀ¡Y®wãqÙ ÀXùÙÿAï¦Òï%i!2à *1àÐD·|›¬»?û1à? ¢yÀ»òï‘%©fÔaÀA%šä:çþsö#ÀsèßqFú=²$ÕÍ€ƒ: 8¨Ä€C“Z±ë+bÐ^Ÿýðrs4–l–~Ç,IU3à *1àÐ$Õ>ö÷²6QûÄ¥ß3KRÕ 8¨Ã€ƒJ 841-Ù<ÊÇnÏ~dØDƒ'ïŽÆÒ-òï›%©BÔaÀA%š”Ú§üiöã@MíÓþ2ý¾Y’ªdÀATbÀ¡‰hé–1xòžìÇ€šO?åÛæß;KÒFfÀATbÀ¡I¨sƧ³Hç_ÿ>ýÞY’66ê0à };½8Ï<œý¨°@ÅcQ¬Ø>ÿþY’6"ê0à {sÿ9û1`uÎ_’~ÿ,I“upP‰‡Æ¹båËbÐ|"û1` Zë¢Øååé÷Ð’ôBpP‡•phœë^´sö#Àt/Ù-ýZ’^(ê0à kŪWEtÙÃÒ-¢Øõ•é÷Ñ’ô|pP‡•ph\ë^±oöãÀu/Y•~-IÏ—upP‰‡Æ±b7DôÚÙÃÖiD±ë+Òï¥%é¹2à *1àÐ8Ö»ö°ìG€é^¸"ý^Z’ž+ê0à [ͽßQö² FdÐ^ÅÎ;¤ßOKÒ³eÀATbÀ¡q«wÝÙ#Ö9iúý´$=[ÔaÀA%§Š½Þì§oÌ Ak]+_–~O-Iÿ1ê0à S½kÍ~$HÒ9÷§ßSKÒÌ€ƒ: 8¨Ä€CãR±Ç"úìG€$ƒâñ(Vl—~_-Iß›upP‰‡Æ¥ÞÕ«³’uÎþ_é÷Õ’ô½pP‡•ph*öx½Ÿ¾@ ŠÇ¢Øé%é÷Ö’ôopP‡•phê^y@ö£À˜èœùwé÷Ö’ôopP‡•p(»b·×DôZÙcbðÌÚh,ß&ýþZ’6dÀATbÀ¡ìºßØ/û1`Ìt¾úÿ¥ß_KÒ† 8¨Ã€ƒJ 8”þÓ7ºÍìÇ€13Xÿ@4–m•~-IÔaÀA%ʬ{Å>Ùcª}Ú'Óï±%É€ƒ: 8¨Ä€CY«^å§oðœOÝ¥[¤ßgKší 8¨Ã€ƒJ 8”U÷â]²?þŒ¹öÉ’~Ÿ-i¶3à *1àPFÅŠíbÐz*ûãÀ˜+Ÿ¸+K6O¿×–4»pP‡•p(£ÎÙÿ+û£À„hŸøÇé÷Ú’f7ê0à ¼e[Åàé³?úLˆò‰;£±d³üûmI3™upP‰‡F]ûÔ?ÏþØ0aÚ'üaúý¶¤ÙÌ€ƒ: 8¨Ä€C#mnq”+ûcÀ„)¾1s‹òï¹%Í\ÔaÀA%eíã>šý‘`Bµ¾ôé÷Ü’f/ê0à ²rÍÕÙy&TÿÞ‹Óï¹%Í^ÔaÀA%U­#>˜ýq`µ~_ú}·¤ÙÊ€ƒ: 8¨Ä€C£ª÷yÙw&\ÿ¶ÓÒï»%ÍVÔaÀA%EÍý2b0Èþ¸0éƒhî÷Žô{oI³“upP‰‡FQ零?êL‰Þõ_L¿÷–4;pP‡•phØ{þpDÙËþ¨0-úÝù»çìûoI³‘upP‰‡†]÷²=³?æ0ƒÖS1xòž(¼&úw½‹ÞÕ«£{Ù^ѽhetÎþÇèœþ?£}ò'¢}ÜG£õ¥ßˆÖ¿2_óÀŸŽæ?5ÿ닽Þü¼møÏÌÿgø©hþïþw|pþ¿³}ÒÇ£óÕ¿žÿßê^¼Kt¯Ø'z×ý[Oþ}—DùÈ-1xfmD¿“ýÿ.¨¥{žé÷ß’f#ê0à  ³bÅv1h­Ëþ˜À&4‰òÁk£ûW£wíaѽpEtÎøT´ÿýhúKÑÜ÷íQì²c4æOÞ÷õ^ÍÏýh´ùùùñdžÿ»ºí½ëŽŒþ]çFùø·"zíìðì:ï|ƒïÖ’¦;ê0à  ³ À0¶ÊÞüOÌèß}^ô®>8:çþs´OüãhöþùaCcÙÖéߩӛ[Ån¯‰æê÷ÌV:ç|6z×ýo_ƒâ±ì‚̸îËò¿3Kšú 8¨Ã€ƒJ 84´æGùÄ]Ùqf]Ù‹ò±;¢Ûiѽt÷hŸöÉù_7ÒÜûG¢±t‹üïÍ^±óÑ<èçæuK÷Ò=¢çÙ1X¿&ûŸ:3b踱|ÛôïÅ’¦;ê0à  «ÖÑ¿ýñ`–tQ®¹*z׳ÿ1ZG8šû¾ÍH#qØÑ:ä¢óµ¿™ÿ•,åÃ7E”ýìO S¨súÿLÿþ+iº3à *1àаêß{QöÇ€iý‰Þ½›NˆÎysÑ:æw¢¹÷[æ\öw`½@Ë·æÁïýΨã†/Ïÿú¨«|âÎh,Ù,ÿû®¤©Í€ƒ: 8¨Ä€Cè¹ÿ;³?ÚLƒ~'ʯÞ5‡Dçô¿šÿUåÛ¤ßÕÂUìöšhó»Ñ½lÏ(ï¿b~ UµýHúw[IÓ›upP‰‡†Qïú/f´˜4ƒrþ×lô®>8Ú§üY4xW4–n™þÝV£­Øé%Ñúâ¯G÷’Ýæ%Ž_»ÀÆØ0Îþ.+iz3à *1àÐ0þ݆¿) ÏgÐ|2úwœó—DëˆF±bûôï²¿Š•/ÿ59½kÁ3k³?¶Œ±ÖÁïKÿþ*i:3à *1àÐB×½pEöÇ€14Xwô®ÿR´Oþ“hîû¶hÌ-Jÿîª knQ4üé蜿4Ê5WG ÙkÆHÿÖSò¿³JšÊ 8¨Ã€ƒJ 8´ -Û:G³?ÖŒÁºoÏÿj½öÉŸˆb¯7çWÕÔU¬zõü ¨wËI1h?ý‘ Û Œæ>oMÿž*iú2à *1àÐBÖ>éãÙi’ ŠÇ¢wã±ßl¼)ý»©f¬¥[Îÿ*žî•̘M½«Ìÿn*iê2à *1àÐBV®¹*û# À¨”ý(¼&º—¬ŠÖ¿%›§•æ[²ÙügrÃO€ñ“9fL¯ŪWå'•4UpP‡•ph¡òò˜~ƒõk¢wÕAÑ:æw¢X±}úwPéÛéÅÑ>á¢û×"úÝìG€è^°,ÿ{¨¤©ÊŸQ‡•ph¡ê]wDöÇ€!(¹ù;?eãà÷EcnQú÷NiS+vÞ!Ú'~,úw1d?Z É ñh4–mþýSÒôdÀATbÀ¡…¨ØååÝföÇ€…ÐïDÿγ£óÕ¿Žb7¤×”†Q±ç£{ÑÊ<³6û‰`Ú'}<ý;§¤éÉ€ƒ: 8¨Ä€C Qç¬Ïd”¨£×žÿ©3>Å.;¦¿”FÖ’Í¢uÔoú©S¦|èºüïš’¦&ê0à ÕnnQ”+û£ À¦Œ6n;}þWJ+_šÿ½RJ®¹Ï[ç]РùDöÓ Àhò éß1%MGÔaÀA%ª[ë‹¿–ý1`c•½èßq†Ñ†ô|íôâhŸúQ>t}ö @ ½›¿’ÿÝRÒTdÀATbÀ¡ºõoÿjöÇ€P®¹::g|:ŠU¯Jÿþ(MRÍÕïŽÞM'D ÊìÇ€ªÊ^{¼!ý;¥¤ÉÏ€ƒ: 8¨Ä€Cu*öüሲŸý1àY Ö?Ý+ö‰æþ?™þ½QšôнÞ<ÿ?ûã 0“ÊGn‰ÎéÅŠíÒ¿Jún˶ŠÎŸŽAãÑì#€gÑ:âWò¿3JšØ 8¨Ã€ƒJ 8´){½)bPf|fÇ Œþ]çFë¨ßô7Ǥqn§Ïÿ:£A{}ö©À÷èßþÕü&6ê0à mJÝ‹vÎþèÌ„Ak]t¯Øg~@›ýPÒÆWì²ct/YÑkg#l0DsŸ·¦O”4™pP‡•p¨rK6Áú5Ù]€©V>vG´Oûd4–o“ÿýOÒ&×ÜûG¢wã±ó`@® ãøì&3ê0à U­õåßÊþØL­òÁk¢}âÇ¢±d³ôï}’®æ~ïˆÞM'd13mÐ~:Š•/Mÿn(iò2à *1àPÕú·žšý±˜.ƒ2z·œÍÕïIÿ®'i¸µŽø`”Þ–}ê̬ΟJÿN(iò2à *1àP•ŠÝ^Qö²?¶Ó¡ßÞ5‡Fós?šþ=OÒ[ºetÎþLjN#û˜9åãߊÆÜâüï„’&*ê0à U©sÎg³?²“¯ß‰Þõ_ŒæÞoIÿ~')¯b·š? ­ÖQJÿ.(i²2à *1àÐF7·h~ @áÆÕ«£Øýuùßí$M­ÃÞå#7gŸP3£×9éß%MVÔaÀA%ÚØZ‡ýröÇ`2u›Ñ½|ï(V½:ý;¤1þµ*çü“_«0 ƒA4?ÿcùß%MLÔaÀA%ÚØz7•ýq˜,ýnô®:0ŠÝ_›þ]NÒdTìñúèÝ|böé0õ6ü»Zöw?I““upP‰‡6¦båKçÿæ(aPÎ_‹½Þœþ=NÒdÖ>ö#1h<’}šL¯N#ŠwHÿÞ'i22à *1àÐÆÔ>åϲ?ªão0ˆþ­§Ds¿w¤“4ù»ì½Ë>Ù¦Vç¬HÿÎ'i22à *1àÐÆÔ¿÷âì*ÀX+ï¿"š«ßþ½MÒôå§q GùÄ]ј[œþ}OÒøgÀATbÀ¡ªØó‡çÿ6)?h°îþhŸø±hÌ-JÿÞ&izÛðã½{W¯Î>ò¦N눦ד4þpP‡•pè…êœ7—ý1;ƒÎ3Ñ9i4–mþ}MÒìÔ:ê7cðôƒÙG ÀÔèÝ|búwõ/¢1·8ýû™$}oÍ}ßåÚ²I€‰6Xw4–l–þÝNÒøfÀATbÀ¡çlé1(Ëþˆä){ѽbŸ(V¾4ÿ»™$=W˶ž?«Øt­£~3ÿ{¤±Í€ƒ: 8¨Ä€CÏUëèßÎþx¤éßwi4?ÿãéßÉ$ick÷Ñ´ÖeŸ©û×Ò¿ÏIß 8¨Ã€ƒJ 8ô\õn9)ûã 0rþð³sƧüºIY±Ç¢ÿí˳R€É3(£Øó‡Ó¿ÏIÏ 8¨Ã€ƒJ 8ôl;ïÑkg<FªÛéQìñúôïb’T«%›Gçü¥óÀÆë^¸Sþw9Ic™upP‰‡ž­öiŸÌþhŒÌ`ýšhýáôï`’´µ¾ü[~¥ @ƒ§ŠÆÒ-Ò¿ÇI¿ 8¨Ã€ƒJ 8ôlõï½(û£ 0|ƒAô®9$ŠÛ§ÿ’¤aÔÜ÷mQ>v{öi 01ÚÇ~$ý;œ¤ÿŸ½{¾»®ï|?€\u´*V§·k;Æ©íÔYGGNÇiët9ÅVÏŒ]¶3´]ÓU/­Ãñ´¢žþráÂÕ!¢˜1TF¹E`D@¢ 4A ·dß/ßÏYùåX«BòûøÉo¿¿{ïÇs­Çÿ ~ûMx%ûŸÕއJ2àPVü°æiÿ"¥á úiJ’$ÍkÕîGRû¢ß ¿½æ[ó¤žßú\ô]I’¤±h°íÚðû ¨•dÀ¡¬ 8øaÝ/¼/úYJ’$Íký».KÍS^~wŒÌÌA©{Í )UÃèÁ’$Iõ®ªRëC¿¿µbÀ¡’ 8”•?løàW£Ÿ¥$IÒ¼Tí~4µ/y[ø½¥}Ñ[RÕy&úDZ$IR­ëÝtZøÝÔ‹‡J2àPVüSÍ3~nva,I’4iíùú€æÒ£Ãï-€h­üJªž¼/úDz$IRm«¥ÆâÃÃï6 > 8T’‡²2ààŸê^ý×ÑOR’$éÀÖk¥Î•￳ꤹô¥i°íºèŸÐ’$Iµ­sÙ„ßl@}p¨$eeÀÁ?5Üq{ô“”$I:` wnN­s^~cÔÒÂCRÿÖEÿ¨–$Iªeƒûoˆ¿×€Ú0àPIÊÊ€ƒïiýªèç(I’t`ªªÔ¿íüÔXrTøPwÝkNðUš’$IÏRkÅ«Ão5  8T’‡²2àà{º×}0ú9J’$W5¿›Ú«'ü¶'Ëÿ$¥A/úG¸$IR­êm\~§õ`À¡’ 8”•ß3|ôÎèç(I’TÔð¡ÛRó¬W†ßUã¨ýÉÿ#Uí§£”K’$Õ¦ªý”?Ù˜eÀ¡’ 8”•{´>üo¢Ÿ¢$IRQ³_™²è°ð» `œµ>òoSõôƒÑ?Ò%I’jÓž?©,úFâp¨$eeÀÁ½/-‰~Š’$I?VUgWê\úûá÷À¤hžöSiøð¦èï’$IµhøàWÃï3 ž‡J2àPVì1ܹ9ú)J’$e·ç+àZgÿBø-0iš'ÿD|ûËÑ?æ%I’Fß°Ÿ†ß‘ú·ž—:ÿ?fÿ„²èÛ ˆgÀ¡’ 8”•­ýbô3”$IÊn°emjžôÂð[ `b-:,õï¾<úǽ$IÒ¼VíÚ1ûï—Ýõ‹RûÂ7¥Æ’£âï0 v 8T’‡²2à {í¢Ÿ¡$IÒÜ«ªÔ»iYjÌ~GL¼…‡¤þ¦UÑ?ù%I’HUûé4ØvÝÞ±ÆêcSóÔ—Åß[ÀX0àPIÊÊ€ƒáC·F?CI’¤9Uuv¥öÅo ¿Ÿ¦nÄqûÑ’$Iyui°}Cêm\ž:kŽK­ Rcæ øÛ K*É€CYpL·æé?3û»X%I’êÞðñ{SëÃÿ&ü~˜J3¥ÞWWDH’$={Ã~>òÔ¿meê|îOSëœ×ÌŽPÃo(`bp¨$eeÀ1ݺŸÿŸÑOP’$i¿ ¸95—~;L»Þ—G$H’$¥j׎4زvïW¡\ø¦ÔXrTøL6•dÀ¡¬ 8¦ÛàÛ_Š~‚’$Iû¬Ç…©±è°ð» €½º×œýÑ I’¦¨ªýôÞ¯B¹iYj¯>65OýÉð{˜>*É€CYpL¯æÒ—ÎþÑr’$Iµ¬ªf7•ï(¨ŸîÚ?O©FRH’¤IkÐK÷§ÞÆå©³æ¸ÔZ±À¿µ`À¡’ 8”•Çôê\þ'ÑÏO’$éÙë·Sç3ï¿—xn+ß5;¶“$Iú±Òð‘o¦þí¤Î–Zçüjj,|^øðl 8T’‡²2à˜^ƒ-WF??I’¤©j?•Úÿð[ €ýë~þFlH’¤1©zêþÔ¿ë3©ûÅ¿Úûï|'>?ü–˜+•dÀ¡¬ 8¦SóÄÌþÎVI’¤:Uíz8µ>úká·s×ýÂû¢?>$IRͪ:ϤÁö {¿ åÒ·§æ²—‡ß,% 8T’‡²2à˜NK?úéI’$ý@Ã'¶¥ÖÙ¯ ¿“È·çwÒJ’¤)mÐK÷ïk¬9.µV,H™ƒÂï€É€C%p(+ŽéÔÿæÅÑOO’$é~çk©¹ôèð €_ïË'EœH’¤ùn8HÃGïJý¯"u®|Wj}ôߥÆÂç…ß!óÍ€C%p(+Ž)´ðTµžˆ~z’$I³ ¶];ûõná7ÅzNþX‘$I°êéRógS÷êÿ•ڼѿ»SË€C%p(+ŽéÓþøoD?;I’¤Ù÷|>5~pàqH’4žUgÒ`û†½_…réÛSsÙ+Âï €º0àPIÊÊ€cúônZýì$I’Rÿ®Ï¤Æ¢CÃo#°™ƒRïkçFÌH’¤}5è¥áÎÍ©Ûù©³æ¸ÔZ± 5fŽ¿#jÊ€C%p(+Žé3|ôÎèg'I’¦¼þŸšýZ·è»€y2spêó’èI’´§j¸w¬qÇ…©»ö=©uîké2p¨$eeÀ1]šgü\ô““$ISÞžßáåwvLE‡¦ÁÖ«£?v$Išºª];Ò`ËÚÔ]¿(µW›š§¼$þ.s*É€CYpL—îÚ?~r’$iŠëÝrÎì­}0Í“þyîøzôÇ$I[Õ~* ¶]›z7œœÚýnjžæ×û惇J2àPVÓepœ$IšÒú_ÿ„?y` 5O}Y>~oôÇ$Iãß°¿÷«P6­J+Þ™Z+øwÆÊ! IDAT,€1àPIÊÊ€cŠ,92¥^3úÉI’¤)lÏw-û…E€éÕ<ëçSµû‘è#I’ƪêÉûfÇÝuǧöÊcRcñáŸéÓÊ€C%p(+ŽéѾè-ÑÏM’$Maý»>“  ¿…ˆÕ:ç5³Ì»$IúѪ];Ò`ËÚÔ]¿(µW›šK_þÙ À÷p¨$eeÀ1=z_;7ú¹I’¤)«ç§7øGí ߔҠýñ$IRhUûé4¸ïúÔ»qij_üÖÔ<í§Â?£Ø7•dÀ¡¬ 8¦GõÔöèç&I’¦¨Á¶kScÑaá7õÒùÌ;Rª†ÑS’$¦a? wnžý*”ÎïL­ |½$À2àPIÊÊ€czþ¨ZI’¤Q5ؾ!5–~POÝkþ&ú£J’¤_U¥ác[RÓߥîUïM­ó^—‹ÿÜ œ‡J2àPVÓÁ/ŽI’¤Q5|ôÎÔ<åÅá÷õÖ¿íüè,I’Šªv=œ[Ö¦îúE©½úØÔ\úÒðÏW懇J2àPVÓa°íºè§&I’¦ áÛRó4÷%s°èÐ4øö—¢?º$IšSUw÷ìŸ4ØÛ¸|ëŠÔ˜98üÞ`‚,<$ ¶^ý'Iƒ†ßý‡ÔÿæÅ©»îÿN­•oH%GÆŽ0± 8T’‡²2à˜lýo¬Ž~b’$i>ö­Ô<ùEá·“§yÊ‹Óð‰mÑu’¤UµŸJƒm×¥îúE©½úØÔ<õeáŸWL•dÀ¡¬ 8&ØÌA©Úõpô“$IVÕz"µÎ~Uü­ÀÄjóš”zÍèý‘)Iµ¨ê<3ûõ‡³_…réÛSsÙËãNÀ„1àPIÊÊ€cÂ,|^ª:»¢Ÿ•$IÓ†ßý‡Ô<ññ7 ìÇžßM^=uôG§$¶AoïW¡Üv~ê¬9.µV,˜µEÿL€IgÀ¡’ 8”•Çdi­|Cô“’$IãÚ°?û/£Ñ÷ ÌUë¼×ÍþÇLIšÔª'ïKýM«RwÝñ©½ò˜ÔX|xøÏ^˜F*É€CYpL–îuŒ~R’$iLÛóýØÑ· äê^ûèPI: U»v¤Á–µ³wy{õ±©yÊKÂÆ{p¨$eeÀ1Y[¯‰~R’$i >|Gj,:4ü–€l3§Á¶k£?J%)«ªýÔì¯ãõ¾|Rj_ô»©¹ìñ?O€çdÀ¡’ 8”•ÇYxHª:»¢Ÿ”$I·úÔúȯÄß2ðcjžö/RÕünô'ª$={ƒ^îÜœú·Ÿ:kŽK­ fÇgÑ?;€¹3àPIÊÊ€cr´Îýõèç$I’ưî5'„ß1Pª}ñ[£?R%i¶êÉûRÓªÔ]w|j¯<&5þ3(cÀ¡’ 8”•Çäè^õÞèç$I’ƬáŽÛgÿ¯è;„þŸŠþh•4eUÏ|'õï¾|vÝþÄo¦æI/ ÿYx*É€CYpLŽþŸŽ~N’$iœögÿ¯è”æ‰/HÃ'¶FÂJšÐö|uñ`û†ÔÛ¸|ö«Pšg½2üç0*É€CYpLŽê食“$I£z7~¿À¶çë Òpý1+iÜöÓpçæÙ¯Bé\ñÎÔZ± 5fÿÄ0àPIÊÊ€c24Oÿéè§$I’ƨê©ûSãÄç‡ß00z7-‹þ¨•4fU»v¤þ]—¥îºãg‡`ÅG„ÿ,êÀC%p(+ŽÉÐùÌ;¢Ÿ’$I£ÚŸú?Ãï˜7‹MÇnþ¸•TÓª]§Á–µ©»~Qj¯>65—¾4þçPk*É€CYpL†ÞWWD?%I’4&õ¿yIøíó­µâÕ)õÛÑ»’‚«:ϤÁ}ëSïÆSSû’·Íþ)¶Ñ?Ÿ€ñcÀ¡’ 8”•ÇdîøzôS’$IcPÕÝí­˜Ý/¼/ú£WÒ(tgÿôÞ-ç¤ÎåœZþåÔ˜98üg0þ 8T’‡²2àÍ_Ò°ý”$IÒÔ½æ„ðÛFfæà4¸ÿÆè_IóTµkGêßuYê®;>µW“KŽŒÿ¹L$•dÀ¡¬ 8Æ_ûÂ7E?#I’4 ŸØš‹¿]`”šg½2¥n#úcXRaÕ®‡Ó`ËÚÔ]¿(µW›šKÿùL•dÀ¡¬ 8Æßžq•$IÚ_í¿ûÏáw Dè~ñ/£?†%e~íß`û†ÔÛ¸÷§ÑÏG’$Õ´îUï ¿U îú·žý‘-®á wnNýM«RwÝñ©½ò˜ÔXtXø?‡ãÀ€C%p(+Žñåš$IÒ³U=ý`j,><üV€ºkžü¢TíÚýÑ-ÍK{Þö`ËÚ½_…rá›RcÉQáÿÌŒ+•dÀ¡¬ 8Æ×pÇíÑÏG’$հΕï¿S`\t>óŽèn©¸ªùxÜ»nïXãïþsj.=:üŸ-€IbÀ¡’ 8”•ǘZ|DJƒ^ôó‘$I5«Úýèì~«ÀÜóùèpiî z³¿©§·qyê¬9.µV,H™ƒÂÿ9˜d*É€CYpŒ§Öù¯~:’$©†u¯ù›ð;ÆMóÌ™R·ý1.ýhÃAîÜœú›V¥îºãS{å1¾* €‡J2àPVã©{Õ_D?I’T³ªÎ3©yò‹ÂïGÝkßýQ.¥j׎4زvïW¡¬>65Oþ‰ð60àPYÊÊ€c<õoÿxôÓ‘$I5«wãÒðÆÖÂç¥áÛ¢?Î5eãÛÁö {¿ åÒ·§æ²—ÇÿsÀ³2àPIÊÊ€c< º5úéH’¤:Õo§æ²W„ß(0ÎZ+ßRUEªkëµÒà›Sï+JËþ µÎþ…ð÷ÀÜp¨$eeÀ1†>oö?ÒH’$}¯þ­‹¿Q`ôïøTôǺƽá wnNýM«RwÝñ©½ò˜ÔX|xøÛàÇgÀ¡’ 8”•Çøi­xuô³‘$Iuª¦Öò~£À$Øó5UûéèOwQÕÓ¤þæÏ¦îÕÚ¼15O|Aø;àÀ2àPIÊÊ€cütÖýl$IRl¹2ü>€IÒýÂÿýñ®šVužIƒíRoãòÔ¹ôí¾Â`Jp¨$eeÀ1~z7Ÿýl$IRjâ?…ß'0Q>/ ùfôG¼¢ôö~ÊmçÏþfšÖŠ©1spüû`ä 8T’‡²2à?ƒû®~6’$©& ½35f ¿O`Ò´?þ¿§TUÑõaÕ“÷¥þ¦U©»îøÔ^yLj,>"üP*É€CYpŒŸªùxô³‘$I5©³æÂo˜Tý;?ýQ¯yªÚµ# ¶¬MÝõ‹R{õ±©yÊKÂßõeÀ¡’ 8”•ÇxižñsÑOF’$Õ¤j÷£©±øððû&UóôŸNUwwôG¾ «:»Ò`û†ÔÛ¸|ö«Pšg½2üm0^ 8T’‡²2à/í‹Þýd$IRMê^ÿ·á· Lºî5'Dä+§~' ¿sKê}uEê|ö¿§Öò_òus3àPIÊÊ€c¼t¯Ÿ‰~2’$© º©¹ìåá· L¼E‡¥áã÷DòëÙª†iøØ·RÿŽO¥îÚ?ŸýEõÆ¢Cãß Ç€C%p(+ŽñÒß¼&úÉH’¤Ô¿óÓáw L‹öê߉þèמ½Æ3¥ÁÝŸº×¾?µ?ù[©yÒ ÃßÓÁ€C%p(+Žñ2|üÞè'#I’jPûã¿~—À4l½:ú㪪:»Ò`û†ÔÛ¸µW“KŽ ÿ{ ûbÀ¡’ 8”•Çøè|ö¿E?I’Tƒ?NÜ÷½@Œæ©/KUûéès`¬ªv=œ[Ö¦îúE©½úØÔ\úÒð¿Ë€C%p(+ŽñÑ»á”èç"I’‚ëßú±ð›¦Y÷š¿‰>j[Õy& ¾ý¥Ô»ñÔÔ¾äm©yúÏ„ÿý€Á€C%p(+Žñ1Øreôs‘$IÁíù—Å蛦ڢÃÒð‰­Ñ'A|Ã~îÜœú›VÍ~JëÜצÆÌÁñ`p¨$eeÀ1>†Ol‹~.’$)°=ÿ‘$úþYê|ú¿¦i«ÚµcïW¡\sBj¯<&5–þ÷FÅ€C%p(+Ž1±ä¨”ªaôs‘$Iu¿øWñ7 0kpÿiR«v?²w¬±~Qj¯>65—þ×"p¨$eeÀ1ZçþzôS‘$I‘ z©¹ìåá7 °Wëcÿ>¥ªJã^ÕÙ•ßþrêÝtZê|ú¿¤æ?þ×êÆ€C%p(+ŽñÐYóGÑOE’$6øÖá÷ðƒúw~:UÃþìW²õ7­JÝuǧֹ¯M…‡„ÿu€º3àPIÊÊ€c<ìù0’$izk_ü{á÷ðƒšg½2¥~'Õµj׎½_…rÍ ©½ò˜Ù¯gþkãÈ€C%p(+Žñ0¸çªè§"I’‚ªš§Æ¢CÃïàGõ¾º"Õ¡j÷£³¿vн~&µ?õÛ©yÊKÂÿÚÀ¤0àPIÊÊ€cµW“‹ ÿßüx 8T’‡²2ਿ=œª$Iš¾z7ž~‡yZç¿>5N|~øÿàÀ1àPIÊÊ€£þªÆcÑÏD’$Ô:ï ¿C`Úp¨$eeÀQoÍS^ýD$IR@ÕîGScæàð[¦‡J2àPVõÖ:ïuÑOD’$Ô¿õ¼ð;0àPYÊÊ€£Þ:kþ(ú‰H’¤€Ú«Þ~‡*Ë€CYpÔ[£Ÿˆ$IqUwwj,>"ü 8T–‡²2਷þ]—E?I’4âú›×„ß À^*É€CYpÔÛpÇ×£Ÿˆ$Iq{¾B-úö2àPIÊÊ€£ÞªöSÑOD’$²ªJÍe¯¿A€½ 8T’‡²2ਯæ)/Ž~’$iÄ Þ~ƒßgÀ¡’ 8”•G}µÎ}môó$I#®wÓiá7ð}*É€CYpÔWçÓÿ5úyH’¤×¾ðMá7ð}*É€CYpÔW÷š¿‰~’$i”õÛ©±äÈðø>•dÀ¡¬ 8ê«ëÇ¢Ÿ‡$Iaƒ­×„ßÀ2àPIÊÊ€£¾[¯Ž~’$i„u¯þëðûøA*É€CYpÔ×ðñ{£Ÿ‡$Ia­þZøýü •dÀ¡¬ 8jjæà”úèç!I’FTÕ~jöó?ü~€‡J2àPVõÔ<ãg£Ÿ†$Iaƒ{×…ßÀ2àPIÊÊ€£žÚ¼1úiH’¤Ö½îƒá÷ð£ 8T’‡²2ਧÎåý4$IÒÛ3ÞŒ¾?€eÀ¡’ 8”•G=u×/Œ~’$iT z©±ä¨ðûøQ*É€CYpÔSÿöG? I’4¢†n ¿=€ggÀ¡’ 8”•G= ¶^ý4$IÒˆêm8#üöž‡J2àPVõ4ܹ9úiH’¤Õ¾ämá·ðì 8T’‡²2ਧªóLôÓ$I#ªyš{ êÊ€C%p(+Žúižü¢èg!I’FTµûÑðÛxn*É€CYpÔOë#ÿ6úYH’¤5¸çóá·ðÜ 8T’‡²2ਟöª7G? I’4¢z_Z~{ÏÍ€C%p(+Žúé\ñÎèg!I’FTûâß ¿=€çfÀ¡’ 8”•Gýô¾|Rô³$I#ªyúÏ„ßÀs3àPIÊÊ€£~úw|*úYH’¤T5v†ßÀ¾p¨$eeÀQ?ƒûÖG? I’4‚÷~!üîöÍ€C%p(+Žú>¶%úYH’¤Ô»á”ð»Ø7•dÀ¡¬ 8ê§ê<ý,$IÒê\ö‡áw°o*É€CYpÔÌ’£¢Ÿ„$IQ­þ»øÛØ'•dÀ¡¬ 8ê¥uö«¢Ÿ„$IEÕ05N|~øí웇J2àPVõÒ^yLô“$I#¨zòÛáw°*É€CYpÔKçÓÿ%úIH’¤4¸w]øÝ쟇J2àPVõÒ½ê½ÑOB’$ ÞÍg†ßÀþp¨$eeÀQ/½NŽ~’$iu>÷§áw°*É€CYpÔKÿö ¢Ÿ„$IA­óÿCøÝ쟇J2àPVõ2¸çªè'!I’FPó”‡ßÀþp¨$eeÀQ/Ã_~’$iž«šß ¿9€¹1àPIÊÊ€£^ª];¢Ÿ„$Išç†;n¿9€¹1àPIÊÊ€£FfNiØ~’$ižëoþlüÝ̉‡J2àPVõÑ\ztôs$I#¨·áŒð»˜•dÀ¡¬ 8ꣵbAôs$I#¨»öÏÃï`n 8T’‡²2à¨öÿ1ú9H’¤Ô^õæð»˜•dÀ¡¬ 8ê£sÉÿý$IÒj}ø—Ãï`n 8T’‡²2à¨ÎïŒ~’$i¾«ªÔXrTøÝ̇J2àPVõѽîƒÑÏA’$ÍsÕîGÂo`î 8T’‡²2à¨ÞÍgE?I’4Ï ¿sKøÍ̇J2àPVõÑßôwÑÏA’$Ísý»/¿9€¹3àPIÊÊ€£>÷~!ú9H’¤y®÷µ†ßÀÜp¨$eeÀQÇn‹~’$ižë^?~ssgÀ¡’ 8”•G}TOÝý$IÒ<×¹âÏÂo`î 8T’‡²2ਪ»;ú9H’¤y®½úØð›˜;•dÀ¡¬ 8jbñÑOA’$ ÖÇþ}üÝÌ™‡J2àPVõÐ<í§¢Ÿ‚$IAÍÓ:üîæÎ€C%p(+Žzh­Xý$IÒ|WU©±èÐð»˜;•dÀ¡¬ 8꡵ò ÑOA’$ÍsUã±ð›ÈcÀ¡’ 8”•G=´W½9ú)H’¤ynøè]á7Ç€C%p(+Žzè\ö‡ÑOA’$Ísƒo)üæòp¨$eeÀQݵï‰~ ’$ižëß}yøÍä1àPIÊÊ€£º×~ ú)H’¤y®ûá7Ç€C%p(+ŽzèÝ´,ú)H’¤y®·áŒð›ÈcÀ¡’ 8”•G=ôo=/ú)H’¤y®{ÝÃo ‡J2àPVõпóÒè§ I’æ¹îÚ÷„ß@•dÀ¡¬ 8êa°õêè§ I’æ¹ÎgÞ~sy 8T’‡²2ਇáwn‰~ ’$ižkê·Ão ‡J2àPVõ0|lKôS$Ió\ëü*©êA IDATׇß@•dÀ¡¬ 8ê¡zæ¡è§ I’æ¹Öò~sy 8T’‡²2ਇªýtôS$Ió\óÔ—…ß@•dÀ¡¬ 8ê! ûÑOA’$ÍsÅG„ß@•dÀ¡¬ 8j`É‘ÑÏ@’$ÍwÕ05fŠ¿;€,*É€CYpÄÛóÇ©K’¤ ¯Û¿9€|*É€CYpÄkžõÊèg I’湪ùxøÍä3àPIÊÊ€#^ë#¿ý $IÒ•dÀ¡¬ 8âu¿øWÑÏ@’$Ísý;/ ¿9€|*É€CYpÄë^ÿ·ÑÏ@’$Ísý;. ¿9€|*É€CYpÄëÝprô3$Ió\ÿ¶•á7Ï€C%p(+Žx½›ÏŒ~’$ižëßú±ð›ÈgÀ¡’ 8”•G¼Þ-‰~’$ižëÝrNøÍä3àPIÊÊ€#^ÿöG?I’4Ïõ6~8üæòp¨$eeÀ¯ÿÕÑÏ@’$Ís½¯œ~sù 8T’‡²2àˆ×ßüÙèg I’æ¹Þ†3Âo Ÿ‡J2àPVñ÷\ý $IÒ<×»ñÔð›ÈgÀ¡’ 8”•G¼Á¶ë¢Ÿ$Išçz7œ~sù 8T’‡²2àˆ7ؾ!úH’¤y®÷¥%á7Ï€C%p(+ŽxÇn‹~’$ižë®_~sù 8T’‡²2àˆ7|ô®èg I’æ¹îuÿoøÍä3àPIÊÊ€#Þð»ÿý $IÒ<×½öá7Ï€C%p(+ŽxÕS÷G?I’4Ïu¯}øÍä3àPIÊÊ€#^õÌw¢Ÿ$Išçº×}0üæòp¨$eeÀ¯Úýhô3$Ió\÷ú™ð›ÈgÀ¡’ 8”•G¼ªùÝèg I’æ¹Þ—‡ß@>•dÀ¡¬ 8âUí§£Ÿ$Išçz_>)üæòp¨$eeÀ/uÑÏ@’$Ís½O ¿9€|*É€CYpÄKýNô3$Ió\oÃéá7Ï€C%p(+Žxi8ˆ~’$ižëÝ|VøÍä3àPIÊÊ€#ØÌAÑO@’$ ÞÆåñwÍ€C%p(+Ž`‹‹~’$iõn9'þî²p¨$eeÀlÉQÑO@’$ þ­‹¿;€l*É€CYpÄjžôÂè' I’FPÿ¶•áwÏ€C%p(+ŽXÍS^ý$IÒêý“áwÏ€C%p(+ŽXÍS^ý$IÒêoZ~wù 8T’‡²2àˆÕ\úÒè' I’FPÿÎKÃï Ÿ‡J2àPV± 8$IšŽ[® ¿;€|*É€CYpÄj.=:ú H’¤4ØvmøÝä3àPIÊÊ€#–‡$IÓÑ`ûMáwÏ€C%p(+ŽXÍS_ý$IÒ>t[øÝä3àPIÊÊ€#–‡$IÓÑpçæð»ÈgÀ¡’ 8”•G,I’¦£áÛÂï Ÿ‡J2àPV±š§þdô$I#¨Úµ#üîòp¨$eeÀË€C’¤é¨j=~wù 8T’‡²2àˆÕ\öòè' I’FQ¯~wù 8T’‡²2àˆeÀ!IÒ”TU©1sPøíä1àPIÊÊ€#–‡$IÓScÉ‘á·Ç€C%p(+ŽXÍ¥GG?I’4¢š'ÿDøíä1àPIÊÊ€#Vó”G?I’4¢š§ýTøíä1àPIÊÊ€#Vó¤F?I’4¢ZúÅðÛÈcÀ¡’ 8”•G°Ÿý$IÒˆjûÚøÛÈbÀ¡’ 8”•G°ÅGD?I’4¢ÚŸøÍøÛÈbÀ¡’ 8”•G°E‡F?I’4¢Úÿ^üíd1àPIÊÊ€#ØÌÁÑO@’$¨Îšãâo ‹‡J2àPVñRUE?I’4‚ºWýEøÝä1àPIÊÊ€#^ö£Ÿ$IAÝkß~wy 8T’‡²2àˆ—úèg I’FPï†SÂï ‡J2àPVñR¯ý $IÒêÝò‘ð»ÈcÀ¡’ 8”•G¼ª³+úH’¤Ôß´*üîòp¨$eeÀ¯j=ý $IÒ|ëŠð»ÈcÀ¡’ 8”•G¼ª±3úH’¤4¸o}øÝä1àPIÊÊ€#^õôƒÑÏ@’$ áC·…ß@•dÀ¡¬ 8â ŸØý $IÒ>~oøÝä1àPIÊÊ€#ÞpçÝÑÏ@’$ j×ÃáwÇ€C%p(+ŽxÇïˆ~’$iõ;áwÇ€C%p(+Žxÿý $IÒˆj,9*üöæÎ€C%p(+ŽxƒûoŒ~’$iD5ÏøÙðÛ˜;•dÀ¡¬ 8â ¶]ý $IÒˆj}ô×Âo`î 8T’‡²2àˆ7¸çªèg I’FTû“¿~{sgÀ¡’ 8”•G¼þÝ—G?I’4¢:—¾=üöæÎ€C%p(+Žxýo^ý $IÒˆê\ù®ðÛ˜;•dÀ¡¬ 8âõï¸0úH’¤Õ½îƒá·0w*É€CYpÄëßz^ô3$I#ªwó™á·0w*É€CYpÄë}åCÑÏ@’$¨=òVôí̇J2àPVñz7.~’$iD ¶\~{sgÀ¡’ 8”•G¼îõ3ÑÏ@’$¨Á7‡ßÀÜp¨$eeÀ¯ûÅ¿Š~’$iD Û~{sgÀ¡’ 8”•G¼îÚ÷D?I’4¢ªÆÎðÛ˜;•dÀ¡¬ 8âu.ÿãèg I’FÕ°Ÿ3…ßÀÜp¨$eeÀ¯séïG?I’4š'¿(üþæÆ€C%p(+ŽxíÕ¿ý $IÒkýªðû˜•dÀ¡¬ 8âµ?ù[ÑÏ@’$°ÖÊ7„ßÀÜp¨$eeÀ¯uþˆ~’$i„µ/y[øý̇J2àPVñZçüjô3$I#¬så»Ãï`n 8T’‡²2àˆ×úÐ/F?I’4ºë…ßÀÜp¨$eeÀ¯yúOG?I’4Âz_;7üþæÆ€C%p(+ŽxÍ“_ý $IÒëß}yøý̇J2àPV5°ð”ª*ú)H’¤5xàæøû˜•dÀ¡¬ 8ê!õšÑOA’$¨á[Ão`n 8T’‡²2ਇj÷£ÑOA’$¨ª³+üöæÆ€C%p(+ŽzØó;q%IÒôÔXrTøý쟇J2àPVõ0|øŽè§ I’FXóÌ~ûgÀ¡’ 8”•G= î¿1ú)H’¤Ö:ïuá÷°*É€CYpÔÃàž«¢Ÿ‚$Iaí‹~7üþöÏ€C%p(+Žzèó’è§ I’FXçŠ? ¿?€ý3àPIÊÊ€£ú·ý$IÒë^ÿ·á÷°*É€CYpÔCïæ3£Ÿ‚$Ia½[>~ûgÀ¡’ 8”•G=t×/Š~ ’$i„õ76üþöÏ€C%p(+Žzè~ñ/£Ÿ‚$IaÃ7†ßÀþp¨$eeÀQ¿ÿÑOA’$°êéÂï`ÿ 8T’‡²2ਇö%o‹~ ’$i” z©1spø 웇J2àPVõоàÑOA’$¸æ²—‡ß À¾p¨$eeÀQ­üJôS$I#®uî¯‡ß À¾p¨$eeÀQÍÓ&ú)H’¤×¾è-á7°o*É€CYpÔÄ’£¢Ÿ‚$Iq+߃ûdÀ¡’ 8”•G}¤~'ú9H’¤Öûò‰á÷°o*É€CYpÔGµû‘èç I’FXÿ럿?€}3àPIÊÊ€£>†;ïŽ~’$i„ ¶^~ûfÀ¡’ 8”•G} ¸9ú9H’¤6|ô®ðûØ7•dÀ¡¬ 8êc°emôs$I#¬j=~ûfÀ¡’ 8”•G}ô7­Š~’$iÄ5–~ƒÏÍ€C%p(+Žúè}åCÑÏA’$¸ÖÙ¿~ƒÏÍ€C%p(+Žúè®_ý$IÒˆk_ðÃoà¹p¨$eeÀQÝ«Þý$IÒˆë\öá7ðÜ 8T’‡²2à¨Îgÿ[ôs$I#®{õ_‡ß Às3àPIÊÊ€£>Ú«Þý$IÒˆëm\~ƒÏÍ€C%p(+Žúhÿúèç I’F\ÿîËÿ?öîÅÛ÷º®óø:¨ixëf5+Ëœ¢Ë²œœi53ZL3eSM¥¥’cå¬iZ™M÷4› ŠrQ䦨€ "Eá ¢ˆrõˆ€¢àÜ¿ûmÖÉÅÈåçs>{ï×ç÷û=žk=þƒÏwí7k¿{–¾A€gÀ¡š 8T”G;º¯ÿ‰ôs$IÜäÖOÆoàÁp¨&eÀÑŽÎOJ?I’´ÁMW¿¿A€gÀ¡š 8T”GCö~äl6¦Ÿ„$IÚàV÷{lþvÈ€C5p¨(޶Lûw¥Ÿ„$IÚງýTüvÌ€C5p¨(޶L·Ý”~’$iƒë½íWã7°cªÉ€CEp´erÛ§ÒOB’$mpýÓÿ$~ƒ;fÀ¡š 8T”G[Æ_8?ý$$IÒ7ܺ%~ƒ;fÀ¡š 8T”G[FW½;ý$$IÒ7ºüíñØ1ÕdÀ¡¢ 8Ú2ºäÈô“$IÜøÆÇo`Ç 8T“‡Š2àhËð‚Íé'!I’6¸é¶ã7°cªÉ€CEp´epæKÓOB’$mt“ÑluïGÆïà 8T“‡Š2àhKÿ¤ç¥Ÿ„$I Ô9è‡ãwð@ªÉ€CEp´¥wÔ³ÒOB’$êý‹ñ;x ÕdÀ¡¢ 8ÚÒ}ݧŸ„$I Ô?åâwð@ªÉ€CEp´¥³åñé'!I’ ÎýÇø<‡j2àPQí™ ;ég!I’6¸Ñ%oŽß Àp¨&eÀÑžé¶ÓÏB’$mpãëÏŽß Àp¨&eÀÑžÉÍŸH? I’´ÁMn¿:~ƒdÀ¡š 8T”G{Æ×œž~’$i£vf«+›âwp_ªÉ€CEp´gté[ÒÏB’$ê¼æãwp_ªÉ€CEp´g¸u¿ô³$IºG=3~‡÷eÀ¡š 8T”G{gýyúYH’¤@ýw¿(~‡÷eÀ¡š 8T”G{ú'ý^úYH’¤@ƒ­Äïྠ8T“‡Š2àhOïè_J? I’htÙqñ;¸/ÕdÀ¡¢ 8ÚÓ=tô³$IÆ7^¿C€û2àPM*Ê€£=-OH? I’hú›ãwp_ªÉ€CEp´i6즟†$IÚ覓Ù꾉ß!À·p¨&eÀѦ鶛ÒOC’$ê¾þ'ãwðmªÉ€CEp´iò¥‹ÓOC’$êÿëñ;ø6ÕdÀ¡¢ 8Ú4¾öÌôÓ$Igýyü¾Í€C5p¨(Ž6.=*ý4$IR áEÇïàÛ 8T“‡Š2àhÓpë–ôÓ$IÆWŸ¿C€o3àPM*Ê€£Mƒ³^–~’$)ÐäËŸŽß!À·p¨&eÀѦþ»~?ý4$IR iÿîø|›‡j2àPQmê³gúiH’¤Pž¿E€o1àPM*Ê€£MÝ×ýXúiH’¤PÝ#ÿ}ü¾Å€C5p¨(ŽFíûèÙl:M?I’¨Ê^ù[øªÉ€CEp´kºz{úyH’¤@ƒó^¿C€o1àPM*Ê€£]“[/K?I’htÙ±ñ;øÕdÀ¡¢ 8Ú5¾öŒôó$IÆ7~8~‡ßbÀ¡š 8T”G»†‘~’$)ÐôîÛâwð-ªÉ€CEp´kpî?¦Ÿ‡$I ÕÙòøø-p¨.eÀÑ®þ©/N?I’ª{ÄÏÅoÀ€Cup¨(ŽvõŽý•ôó$I¡úïúýø-p¨.eÀÑ®îë~<ý<$IR¨Áy¯Œß"€‡ê2àPQ Û÷1³Ùtš~"’$)ÐèSoÍß"€‡ª2àPQm›v¾–~"’$)Ðø‹ÅïÀ€Cup¨(޶Mn»<ýD$IR éêíñ;0àP]*Ê€£mãëÎJ?I’ª³ÿã·,;ÕdÀ¡¢ 8Ú6¼øMé'"I’Bußôïâ·,;ÕdÀ¡¢ 8Ú68ïŸÒOD’$…êŸüÂø-Ë΀C5p¨(޶õßóGé'"I’B >´¿E`Ùp¨&eÀѶÞqÿ9ýD$IR¨Ñåoß"°ì 8T“‡Š2àh[÷õ?‘~"’$)ÔäæOÄoXvªÉ€CEp4nóîé'"I’BM;wäoXrªÉ€CEp´oÚ½3ýL$IR¨Î«¾'~‹À23àPM*Ê€£}“/_‘~&’$)T÷È_ˆß"°Ì 8T“‡Š2àhßøº÷¥Ÿ‰$I Õ÷‹â·,3ÕdÀ¡¢ 8Ú7ºäÈô3‘$I¡†ì¿E`™p¨&eÀѾÁ‡VÒÏD’$…]qBü€efÀ¡š 8T”Gûúïùãô3‘$I¡&·~2~‹À23àPM*Ê€£}½ãž~&’$)Ô´÷lueSü€eeÀ¡š 8T”Gû:‡üëô3‘$IÁ:þPü€eeÀ¡š 8T”ÇØçQ³Ùdœ~*’$)ÔöÿWü€%eÀ¡š 8T”Ç|˜n»)ýT$IR¨Á™/ß"°¬ 8T“‡Š2à˜ã¶¦ŸŠ$I 5üøañ[–•‡j2àPQóaô©·¦ŸŠ$I 5þÜ9ñ[–•‡j2àPQóapþÞé§"I’BM¿ñÅø-ËÊ€C5p¨(ŽùÐ?õÅé§"I’RM§³Î~‹ß#°Œ 8T“‡Š2à˜½£1ýT$IR°îψß#°Œ 8T“‡Š2à˜(ýT$IR°þ){ÅïXFªÉ€CEp̉•M³Ù¨—~.’$)Ôð‚}ó÷,!ÕdÀ¡¢ 8æÇäk×§Ÿ‹$I 5ºò¤ø-ËÈ€C5p¨(Žù1þÜ9éç"I’BMn»<~‹À22àPM*Ê€c~Œ.92ý\$IRªaw¶º²[ü€ecÀ¡š 8T”Çüœóòôs‘$IÁ:?%~À²1àPM*Ê€c~ôßõüôs‘$IÁzoûµø=ËÆ€C5p¨(Žùᇃ$IËÝàýÿ'~À²ñ;:ÕdÀ¡¢ 8æGçÕß—~.’$)Øðâ#â÷,ÕdÀ¡¢ 8æË´wúÉH’¤Pã/œ¿E`Ùp¨&eÀ1_&_¹2ýd$IR¨éÝ·ÆoX6ªÉ€CEpÌ—ñµg¦ŸŒ$I ÖÙò„ø=ËÄ€C5p¨(Žù2üøaé'#I’‚mÿÅô=ËÄ€C5p¨(Žù2xÿ_¦ŸŒ$I Ö?õã÷,ÕdÀ¡¢ 8æKï„ßN?I’løáâ÷,ÕdÀ¡¢ 8æK÷OO?I’l|íñ{–‰‡j2àPQó¥³åñé'#I’‚Mîü|ü€ebÀ¡š 8T”Çü™vîH?I’”j:™­nÞ=~À²0àPM*Ê€cþL¾tqúÙH’¤`Ý#ž¿G`Yp¨&eÀ1FŸ~gúÙH’¤`ýw¿(~À²0àPM*Ê€cþ Îß'ýl$IR°á…¯Šß#°, 8T“‡Š2à˜?ýSþ ýl$IR°ñ5ïß#°, 8T“‡Š2à˜?~HH’´ÜMîølü€eáwsªÉ€CEpÌŸÎþOL?I’”l2ž­nþÎøMËÀ€C5p¨(Žù4í|-ýt$IR°îÿMü€e`À¡š 8T”Ç|šÜüñôÓ‘$IÁú§ì¿G`p¨&eÀ1ŸFŸz[úéH’¤`í[â÷,ÕdÀ¡¢ 8æÓà¼J?I’ltõ{â÷,ÕdÀ¡¢ 8æSÿ]ÏO?I’lòµëâ÷,ÕdÀ¡¢ 8æS÷ˆg¤ŸŽ$IJ6ÍV÷}tü&€EgÀ¡š 8T”Ç|êì÷¸Ùl:M?I’¬{øÏÆoXtªÉ€CEp̯é7¿œ~>’$)XÿäÄïXtªÉ€CEp̯ñMI?I’lxÁæø=‹Î€C5p¨(Žù5ºìØôó‘$IÁFW¿G`Ñp¨&eÀ1¿ç¾"ý|$IR°ÉW¯‰ß#°è 8T“‡Š2à˜_ýŸ›~>’$)Ùd4[Ý÷Ññ›™‡j2àPQó«{øÏ¦Ÿ$I ×}ÃÓâ7 ,2ÕdÀ¡¢ 8æØæÝg³é4ý„$IR°þ»žŸ¿I`p¨&eÀ1ߦw})ý„$IR°á›ã÷,2ÕdÀ¡¢ 8æÛø† ÒOH’$_}Zü€EfÀ¡š 8T”Ç|]ú–ô’$IÁ&w~.~À"3àPM*Ê€c¾ >øwé'$I’’M'³Õý¿I`Qp¨&eÀ1ßz'üvú I’¤pÝ7ÿ|ü&€EeÀ¡š 8T”Ç|ëöÓé'$I’ÂõO{Iü&€EeÀ¡š 8T”ÇœÛ÷ѳÙdœ~F’$)Øð¢Cò7 ,(ÕdÀ¡¢ 8æßôë_H?#I’lüùsã÷,*ÕdÀ¡¢ 8æßøº÷¥Ÿ‘$I 6½û¶ø=‹Ê€C5p¨(Žù7üèAég$I’ÂuxRü&€EdÀ¡š 8T”ÇüëŸö?ÓÏH’$…ëûËñ›‘‡j2àPQó¯{Ô3ÓÏH’$…œõ²øM‹È€C5p¨(Žù×Ùÿ»ÒÏH’$…]ú–øM‹È€C5p¨(ŽÅ0ýæWÒOI’$ñcñ{‘‡j2àPQ‹a|ÃÖôS’$IÁ¦ý»g«+›â7 ,ÕdÀ¡¢ 8Ãðâ7¥Ÿ’èš0Ó IDAT$I ×9ø)ñ›‡j2àPQ‹að¾¿H?%I’®÷ŽßŒß$°h 8T“‡Š2àX ½·þ×ôS’$Iáç¾"~“À¢1àPM*Ê€c1t|rú)I’¤p£O¿3~“À¢1àPM*Ê€cA¬lšMûw¥Ÿ“$I 6ùòù›Œ‡j2àPQ‹crË%éç$I’’³Õ}¾#~“À"1àPM*Ê€cqŒ.?>ýœ$IR¸îž¿I`‘p¨&eÀ±8ç¾"ýœ$IR¸þÉ/ˆß$°H 8T“‡Š2àX½~'ýœ$IR¸áÖ-ñ›‰‡j2àPQ‹£ûúŸL?'I’n|Íéñ›‰‡j2àPQ dïGÎfãAúII’¤`Ó¯!“À1àPM*Ê€c±Ln¿:ý¤$IR²étÖÙò„øM‹Â€C5p¨(ŽÅ2ºêÔô“’$IázG=+~“À¢0àPM*Ê€c± ·nI?)I’npæKã7 , ÕdÀ¡¢ 8KÿÝ/J?)I’nté[â7 , ÕdÀ¡¢ 8K÷Mÿ6ý¤$IR¸ÉÍŸˆß$°( 8T“‡Š2àX0›wŸÍ¦“ô³’$IÉ«³Õ•Ýòw ,ÕdÀ¡¢ 8ÏtÛMég%I’ÂuÝ#~“À"0àPM*Ê€cñŒ¯?;ý¬$IR¸þI¿¿I`p¨&eÀ±x†œ~V’$)Üpë~ñ›‡j2àPQ‹§ÚKÒÏJ’$…_{Fü&€E`À¡š 8T”ÇâñCD’$M·Ý¿I`øÝ›j2àPQ hóî³Ùt’~Z’$)Ùt:ë¼ê»ów Ì9ÕdÀ¡¢ 8ÓäÎÏ¥Ÿ–$I ×;fÏøMó΀C5p¨(ŽÅ4¾æ½é§%I’ ÎzYü&€ygÀ¡š 8T”ÇbnÝ’~Z’$)Üè“GÇo˜wªÉ€CEp,¦þÉ/L?-I’nrË%ñ›æ‡j2àPQ‹©{øÏ¤Ÿ–$IJ7ìÎV÷~Dü.€yfÀ¡š 8T”Ç‚ÚçQ³Ùx~^’$)\÷°ŸÊß%0Ç 8T“‡Š2àX\“¯|&ý¼$IR¸þ»ž¿I`žp¨&eÀ±¸FWž”~^’$)ÜðÂWÅo˜gªÉ€CEp,®Áyÿ”~^’$)Üøº÷Åo˜gªÉ€CEp,®Þ ¿~^’$)Üô7Ço˜gªÉ€CEp,®îë~,ý¼$IRu^ý½ñ»æ•‡j2àPQ le·Ùl°š~b’$)\ïØ_Îß%0§ 8T“‡Š2àXl“[.I?1I’nðþ¿Œß$0¯ 8T“‡Š2àXl£ËŽK?1I’nû=¾I`^p¨&eÀ±Øø›ô“$Iá&·~2~“À¼2àPM*Ê€c±õÞöké'&I’Òú³Õ}¿K`p¨&eÀ±Ø:þPú‰I’¤ê¾ñéñ»æ‘‡j2àPQ‹oÚ¹#ýÌ$IR¸þ{þ(~“À<2àPM*Ê€cñoüpú™I’¤pÿI`p¨&eÀ±ø†‘~f’$)ÜøÆ ã7 Ì#ÕdÀ¡¢ 8ßàÌ—¦Ÿ™$I 7íß5[]Ù¿K`Þp¨&eÀ±øzÇì™~f’$©:‡<5~—À¼1àPM*Ê€cñu^õÝég&I’¨âsãw ÌÕdÀ¡¢ 8–Ãô®/¥Ÿš$I 7ܺ%~“À¼1àPM*Ê€c9Œ¯ú©I’¤pãëΊß$0o 8T“‡Š2àXÿ:ýÔ$IR¸é]·Äo˜7ªÉ€CEp,‡þÉ/H?5I’Ô@×ü@ü.€ybÀ¡š 8T”ÇrèöSé§&I’¨÷¶_ß%0O 8T“‡Š2àX{?b6vÒÏM’$…œóù»æˆ‡j2àPQËcrË%éç&I’®<)~“À<1àPM*Ê€cyŒ>ytú¹I’¤p“¯^¿I`žp¨&eÀ±<ïû‹ôs“$I馓Yg¿ÇÅɀCEp,Þ1{¦Ÿ›$Ij î[þcü.€yaÀ¡š 8T”Çòèìÿ]³Ùtš~r’$)ÜàÌ—Æï˜ªÉ€CEp,—é¶›ÒON’$…]zTü&€yaÀ¡š 8T”Çr_{FúÉI’¤p“[.ß$0/ 8T“‡Š2àX.íû¥Ÿœ$IJ7êÏV÷yTü.€y`À¡š 8T”ÇréŸô¼ô““$I Ô=ügãw ÌÕdÀ¡¢ 8–K÷u?ž~r’$©ú§¾8~—À<0àPM*Ê€cɬì6›¾™~v’$)Üðc¯Ëß%0 8T“‡Š2àX>“›?‘~v’$)Üø†­ñ›æ‡j2àPQËgtÉ‘ég'I’ÂM{Ûf«+›âw ´Î€C5p¨(Žå38óÏÒÏN’$5Pçàß%Ð:ÕdÀ¡¢ 8–O÷¨g¦Ÿ$Ij Þ‰¿¿K uªÉ€CEp,ŸÎ–ÇÏfÓIúéI’¤pà ÷ß%Ð:ÕdÀ¡¢ 8–ÓäÎϧŸž$I 7¾þìøM­3àPM*Ê€c9®~OúéI’¤pÓÕÛã7 ´Î€C5p¨(Žå48ŸôÓ“$I Ô9ðÉñ»ZfÀ¡š 8T”Çrêð;é§'I’¨÷Îÿ¿K eªÉ€CEp,§Î!OM?=I’Ô@à öß%Ð2ÕdÀ¡¢ 8–Ôʦٴ÷ôó“$IáÆ×•¿K aªÉ€CEp,¯ñ¦ŸŸ$I 7½ûÖøM-3àPM*Ê€cy ?vhúùI’¤ê¼Ö=Æ€C5p¨(ŽåÕ?õÓÏO’$5Pï¿¿K UªÉ€CEp,¯îá?“~~’$©Z‰ß%Ð*ÕdÀ¡¢ 8–ØÞ˜Í†ô”$IáÆ×œž¿K QªÉ€CEp,·É—.N?AI’nú›ã7 ´Ê€C5p¨(Žå6ºäÈô”$I Ô9àûãw ´È€C5p¨(ŽåÖ?ãOÓOP’$5PïøçÄïh‘‡j2àPQË­{ä/¤Ÿ $Ij Áy¯Œß%Ð"ÕdÀ¡¢ 8–ܾ™ÍÆÃô3”$IáFWš¿K AªÉ€CEp0ùÊgÒÏP’$…›n»1~“@‹ 8T“‡Š2à`tùÛÓÏP’$5PçÕß¿K 5ªÉ€CEp08û¯ÓÏP’$5Pï­ÿ%~—@k 8T“‡Š2à wÌJ?CI’Ô@ƒs^¿K 5ªÉ€CEpÐÙò„Ùl:M?EI’nô™“ãw ´Æ€C5p¨(¶›~ý é§(I’ÂMîü|ü&€Öp¨&eÀÁv£«Þ~Š’$)Ýt:ë¼ê»ãw ´Ä€C5p¨(¶œ÷ÊôS”$I Ô;öWâw ´Ä€C5p¨(¶ëÿëé§(I’hðÁ¿‹ß%ÐÕdÀ¡¢ 8Ø®óšH?EI’Ô@£+NŒß%ÐÕdÀ¡¢ 8¸ÇôîÛÒÏQ’$…›|íºøM-1àPM*Ê€ƒ{Œ¯ú9J’¤tÓ鬳ÿãw ´Â€C5p¨(î1¼pÿôs”$I Ô;fÏø]­0àPM*Ê€ƒ{ôO|nú9J’¤|àoâw ´Â€C5p¨(îÑ9ä©éç(I’htʼnñ»ZaÀ¡š 8T”ÿßʦٴûõô“”$Iá&w|6—@# 8T“‡Š2ààÞÆ7\~’’$)Ýt:ëìÿ]ñ»Z`À¡š 8T”÷6¼èàô“”$I Ô;îÙñ»Z`À¡š 8T”÷Ö?e¯ô“”$I 48çåñ»Z`À¡š 8T”÷Ö=tô“”$I 4ºêÝñ»Z`À¡š 8T”÷±²i6ímK?KI’nºíÆü] 0àPM*Ê€ƒûß°5ý,%IRuxRü.€4ÕdÀ¡¢ 8¸¿áE§Ÿ¥$Ij Þñωß%fÀ¡š 8T”÷×?e¯ô³”$I 4øÐÿß%fÀ¡š 8T”÷×=tô³”$I 4¾æôø]iªÉ€CEpð+›fÓÞ¶ôÓ”$Iá¦wÝ’¿K Ì€C5p¨(vd|ÃÖôÓ”$I Ôy­[€åfÀ¡š 8T”;2¼èàôÓ”$I Ô{çoÅïH2àPM*Ê€ƒ韲WúiJ’¤^°9~—@’‡j2àPQìH÷Ð=ÒOS’$5Ðøú÷ÇïH2àPM*Ê€ƒZÙ4›ö¶¥Ÿ§$I 7]ýjþ.€ ÕdÀ¡¢ 8x0㶦Ÿ§$Ij ÎA?¿K Å€C5p¨(Ì𣥟§$Ij þIÏ‹ß%bÀ¡š 8T”¦ò ÓÏS’$5ÐðïŽß%bÀ¡š 8T”¦{èéç)I’hüùsãw ¤p¨&eÀÁƒZÙ4›ö¶¥Ÿ¨$I 7í~ý_î‚ømªÉ€CEpðPÆ7lM?QI’Ô@Ý×ýXü.€ÕdÀ¡¢ 8x(Ô~¢’$©ú'¿0~—@‚‡j2àPQ<”í¿¬‘$IÚ>êLß%`À¡š 8T”¥{èé'*I’hûŸUKß%`À¡š 8T”ieÓlÚÛ–~¦’$)Ü´÷lue·ümÌ€C5p¨(Îöq+I’Ô=ì§ãw l4ÕdÀ¡¢ 8x8Ûÿæ½$IRÿÔÇïØhªÉ€CEpðpú'¿0ýL%IR ?þúø]Í€C5p¨(N÷Ð=ÒÏT’$5Ðø‹‹ß%°Ñ 8T“‡Š2ààa­lšM»w¦Ÿª$IJ7ìÎV÷yTþ6€ dÀ¡š 8T”;cüùóÒOU’$5P÷ˆgÄïØHªÉ€CEp°3†> ýT%IRõÏøÓø]É€C5p¨(vFÿÄ禟ª$Ij Ñ'‰ß%°‘ 8T“‡Š2à`gtúáôS•$I 4ùòñ»6’‡j2àPQì¬é7¿œ~®’$)Ýd<ëì÷¸ø]Å€C5p¨(vÖøº÷¥Ÿ«$Ij Þ1{ÆïØ(ªÉ€CEp°³çï“~®’$©øÛø]Å€C5p¨(vVï¿‘~®’$©FW¾+~—ÀF1àPM*Ê€ƒÕ9àIéç*I’húõâw lÕdÀ¡¢ 8(1ýÆÓOV’$5Pç€ïß%° 8T“‡Š2à ÄèªSÓOV’$5Pïíÿ-~—ÀF0àPM*Ê€ƒƒs_‘~²’$©çï¿K`#p¨&eÀA‰ÞqÏN?YI’Ô@ãëß¿K`#p¨&eÀA‰ÎþOœÍ¦“ô³•$Iá¦;f«+›â· ¬7ÕdÀ¡¢ 8(5ùÚõég+I’¨sÈSãw ¬7ÕdÀ¡¢ 8(5ºâ„ô³•$I Ô?ùñ»Ö›‡j2àPQ”œýWég+I’hxÑÁñ»Ö›‡j2àPQ”êõ¬ô³•$I 4¾é#ñ»Ö›‡j2àPQÛ¼ûl6¥Ÿ®$IJ7ìÌV÷~dþ6€udÀ¡š 8T”»bò•+ÓOW’$5P÷Oß%°ž 8T“‡Š2à`WŒ.;6ýt%IRõßû¿âw ¬'ÕdÀ¡¢ 8؃3ÿ,ýt%IR.}Kü.€õdÀ¡š 8T”»¢ûæŸO?]I’Ô@“Û.ß%°ž 8T“‡Š2à`—ìó³Ù¨Ÿ~¾’$)Ýd4[Ýï±ùÛÖ‰‡j2àPQìªÉ-—¤Ÿ¯$Ij ÞQÏŠß%°^ 8T“‡Š2à`W /~SúùJ’¤œý×ñ»Ö‹‡j2àPQìªþi/I?_I’Ô@£+NŒß%°^ 8T“‡Š2à`Wußð´ôó•$I 4¹ósñ»Ö‹‡j2àPQ첕ÝfÓþ]é',I’ÒM§³Î«¿7›À:0àPM*Ê€ƒã/œŸ~Â’$©zÇ?'~—Àz0àPM*Ê€ƒÃ~Â’$©Z‰ß%° 8T“‡Š2à FÿÄ禟°$Ij ñugÅïXªÉ€CEpP£sà“ÓOX’$5Ðtõöø]ëÁ€C5p¨(jMï¾5ýŒ%IRuyjü.€µfÀ¡š 8T”µÆ×¼7ýŒ%IRõO~aü.€µfÀ¡š 8T”µçþcúK’¤~ìÐø]kÍ€C5p¨(jõŽ{vúK’¤šÜüñø]kÍ€C5p¨(juöâl6¤Ÿ²$IJ7êÏV÷}tü6€µdÀ¡š 8T”kaòÕkÒOY’$5P÷Í?¿K`-p¨&eÀÁZ}êmé§,I’hpÖËâw ¬%ÕdÀ¡¢ 8X ƒ³þ<ý”%IR>ýŽø]kÉ€C5p¨(Ö‚\’$i{“;>¿K`-ù=˜j2àPQ¬‰}5› »éç,I’ÒM§³Î«¿7›À1àPM*Ê€ƒµ2¹ùéç,I’¨wüsâw ¬ÕdÀ¡¢ 8X+Ö~Î’$©çï¿K`­p¨&eÀÁZé¿û¤Ÿ³$Ij ñõgÇïX+ªÉ€CEp°Vº¯ÿ‰ôs–$I 4íÞ9[]Ù¿M`-p¨&eÀÁšYÙ4›vîH?iI’Ô@ÝC÷Èß&° 8T“‡Š2à`-?wNúIK’¤Úþ§ÕÒw ¬ÕdÀ¡¢ 8XKíû¥Ÿ´$Ij á?¿K`-p¨&eÀÁZê½ó·ÒOZ’$5Ðä–Kâw ¬ÕdÀ¡¢ 8XK¾?ý¤%IR ‡³ÕÍß¿M –‡j2àPQ¬µé¶›ÒÏZ’$5P÷-ÿ!~—@-ÕdÀ¡¢ 8Xk£Ïœ’~Ö’$©gÿUü.€ZªÉ€CEp°Öüûô³–$I 4ºò¤ø]µ 8T“‡Š2à`­õŽÙ3ý¬%IRM¿~Cü.€ZªÉ€CEp°æ6ï>›MFé§-I’¨óšÈß&PÁ€C5p¨(ÖÃäËW¤Ÿ¶$Ij Þ;~3~—@ ÕdÀ¡¢ 8X£O~Ú’$©†[·Äï¨aÀ¡š 8T”ë¡úÿN?mI’Ô@ãÏŸ¿K †‡j2àPQ¬‡î?—~Ú’$©¦½oÌVWv‹ß&°« 8T“‡Š2à`]ìýˆÙl°š~Þ’$©º‡ýtþ6€]dÀ¡š 8T”ëe|ÓGÓÏ[’$5Pÿ=¿K`Wp¨&eÀÁz^tpúyK’¤]òæø]»Ê€C5p¨(ÖKÿ䤟·$Ij ÉmŸŠß%°« 8T“‡Š2à`½tyjúyK’¤šŒf«›wß&°+ 8T“‡Š2à`=MWoO?qI’Ô@½cöŒß%°+ 8T“‡Š2à`=¯{_ú‰K’¤œóòø]»Â€C5p¨(ÖÓàü}ÒO\’$5ÐøšÓãw ì ÕdÀ¡¢ 8XO½ãŸ“~â’$©¶ÿYµô]»Â€C5p¨(ÖSçUß3›M§ég.I’¨sÈSã· ”2àPM*Ê€ƒõ6¹óség.I’¨ÊÄï(eÀ¡š 8T”ëmtÅ ég.I’høÏ‡Çï(eÀ¡š 8T”ëmpö_¥Ÿ¹$Ij É-—Æï(eÀ¡š 8T”ë­{Ô3ÓÏ\’$µÐx8[ݼ{ü6€ªÉ€CEp°îö}Ì¿üÂF’$©wô/åo(`À¡š 8T”arëeé§.I’hpÎ?Äï(aÀ¡š 8T”axñ›ÒO]’$5ÐøêÓâw ”0àPM*Ê€ƒÐ?í%é§.I’húͯÄï(aÀ¡š 8T”¡û†§¥Ÿº$Ij¤ÎÁ?¿M`gp¨&eÀÁ†XÙm6íß•~î’$©ú§ì•¿M`'p¨&eÀÁFßpAú¹K’¤~â ñ»v–‡j2àPQl”áG^“~î’$©&·\¿K`gp¨&eÀÁFéø»éç.I’Zh<œ­nÞ=~›ÀÎ0àPM*Ê€ƒÒyí¿J?wI’ÔH½£1~›ÀÎ0àPM*Ê€ƒ4½ëKé'/I’hðÁ¿ß%°3 8T“‡Š2à`#®~OúÉK’¤Ú~¤ïتɀCEp°‘çüCúÉK’¤šÞ}[ü.€aÀ¡š 8T”©wì/§Ÿ¼$Ij¤ÎÁO‰ß&ðp 8T“‡Š2à`Cí÷ØÙl2J?{I’Ô@ý“_˜¿Màap¨&eÀÁF›|åÊô³—$I 4üøëãw <ÕdÀ¡¢ 8Øh£O~ö’$©&_º8~—ÀÃ1àPM*Ê€ƒÖ?ýOÒÏ^’$µÐx8[ÝüñÛŠ‡j2àPQl´îŸž~ö’$©‘zG=+~›ÀC1àPM*Ê€ƒ ·÷#fÓÁ7ÓO_’$5Ðà›¿Mà!p¨&eÀAÂøÆ ÓO_’$5ÐèªSãw <ÕdÀ¡¢ 8H~äµé§/I’hz÷­ñ»Š‡j2àPQ$ôOz^úéK’¤Fêü”ømÆ€C5p¨(:>9ýô%IR#õOÙ+~›Àƒ1àPM*Ê€ƒ”íÿËtI’¤á?¿KàÁp¨&eÀAÊøš÷¦Ÿ¿$Ij É­—Åïx0ªÉ€CEp28÷éç/I’Zh2žu¶<>~›ÀŽp¨&eÀAJïØ_I?I’ÔH½ãž¿M`G 8T“‡Š2à eû¿´Ýþ/n%I’Z‰ß&°#ªÉ€CEp4¹ýªô' I’hüÙÄïØÕdÀ¡¢ 8H]vlú$I 4íß5[]Ù-~›Àýp¨&eÀARÿŒ?M’$©‘º‡ÿLü6€û3àPM*Ê€ƒ¤î?—þ$IR#mv¦o¸?ÕdÀ¡¢ 8ˆÚû³Ù`5ýH’¤]~|þ6€û1àPM*Ê€ƒ´ñMI’$©&w~.~—Àýp¨&eÀAÚð£¥?I’ÔH×ü`ü6€{3àPM*Ê€ƒ´þ»~?ýH’¤Fêð;ñÛîÍ€C5p¨(Ò:ýHú3$I4üèñÛîÍ€C5p¨(Z0½û¶ô§ I’hN„l IDATüÅÅï¸7ÕdÀ¡¢ 8hÁøÚ3ÒŸ‚$Ij¡Q¶ºïcâ· ÜÀC5p¨(Z08ï•éOA’$5R÷¨gÆo¸‡‡j2àPQ´ wܳӟ‚$Ij¤Áÿ.~›À= 8T“‡Š2à -ŸÍ¦“ôç I’hüÿØ»÷x»ëúÎ÷"D­B¥3N§8í©zÚi›éت}L;M§¶êÃÚœ¶óèáQÏL3¶Zϱ—ô2cNM6„ˆDn!JD F‡‹A0•KD ¤T.QÊÅ€EI"É^—ߺü¾ç±“™±êÚI¾ù­µ?¿µÖóùx¼þWÈwïÏïdÝ÷‰ðÛD’$I’$Iú_pP…Y 8T—ú{ï~@ ”³{ÂïI’$I’$éeÀAd1àP]êÞ}iôsj¢y΄ß&’$I’$IÒ\TaÀAÕ¥bó;¢ŸPíMÿ9ü6‘$I’$I’æ2à  ²p¨.5/|môsj¢ûņß&’$I’$IÒ\TaÀAÕ¦™E)uÑO¨þ“÷Äß&’$I’$I’pÅ€Cuª÷Ø­ÑO¨ƒ²Ÿïù¾ðÛD’$I’$I2à  ²p¨Nun=;úI5ÑÚð¦ðÛD’$I’$I2à  ²p¨Nµ¯üè'ÔDçæUá·‰$I’$I’dÀAd1àPjœõŠè'ÔDï‘›ÂoI’$I’$É€ƒ* 8ÈbÀ¡ºUÎî‰~@ ”Åþ4»ò¸ðÛD’$I’$IÓUpÅ€Cu«÷ÀuÑϨ‰æ~&ü6‘$I’$IÒtgÀAd1àPÝ*nzwô³j¢øôŸ‡ß&’$I’$Išî 8¨Â€ƒ,ª[­Kßý,€šèîÜ~›H’$I’$iº3à  ²p¨n5V¿4¥²ý4€(÷?~›H’$I’$iº3à  ²p¨Žõ÷=ý4€šhžû£á·‰$I’$I’¦7ª0à ‹‡êXwdžè§ÔDû¿~›H’$I’$iz3à  ²p¨Ž›ÿ(úi5ѽëÃá·‰$I’$I’¦7ª0à ‹‡êXó?ý4€šèï{0ü6‘$I’$IÒôfÀAd1àP-›Y”R§ý<€šh¬q³J’$I’$)&ª0à ‹‡êZÿñíÑϨ‰öå¿~›H’$I’$i:3à  ²p¨®un;7úy51wDß&’$I’$IšÎ 8¨Â€ƒ,ªkí«þŸèçÔDÿî¿M$I’$I’4pP…Y 8T×g¿*úyuÑï¦Æi'„ß'’$I’$Iš¾ 8¨Â€ƒ,ªsåìžè'ÔDëÒׇß&’$I’$Iš¾ 8¨Â€ƒ,ªs½>ýD€šè|î”ðÛD’$I’$IÓ—UpÅ€Cu®¸iEôj¢÷ÈMá·‰$I’$I’¦/ª0à ‹‡ê\ë²7F? .ŠÙ4;³(ü>‘$I’$IÒteÀAd1àPk¬>1¥²ýL€šh~ðß„ß'’$I’$Iš® 8¨Â€ƒ,ª{ý}D? &ŠÏüeøm"I’$I’¤éÊ€ƒ* 8ÈbÀ¡º×ݱ!ú™5Ñ»ïá·‰$I’$I’¦+ª0à ‹‡ê^qÝG? &ÊÆ¾4»â˜ðûD’$I’$IÓ“UpÅ€Cu¯ùŸ‰~&@4×þXø}"I’$I’¤éÉ€ƒ* 8ÈbÀ¡Ú7³(¥N3ú©5ѾæâïI’$I’$MMTaÀACýÇ·G? &ºw_~›H’$I’$iz2à  ²phêÜvnôSj¢ÿÔCá·‰$I’$I’¦'ª0à ‹‡Æ¡ö•o‰~*@4Ö¼<ü>‘$I’$IÒtdÀAd1àÐ8Ô8û•ÑO¨‘ö'‡ß'’$I’$IšŽ 8¨Â€ƒ,—ÊÙ½ÑϨ‰ÎöóÂoI’$I’$MGTaÀAK½®‹~.@Mô¿¶#ü6‘$I’$IÒtdÀAd1àиTÜ´"ú¹uQöScõ‰á÷‰$I’$I’&?ª0à ‹‡Æ¥ÖeoŒ~.@´6. ¿O$I’$I’4ùpP…Y 84.Íý)Û¹?m 0§³í}á÷‰$I’$I’&?ª0à ‹‡Æ©þ¾¢Ÿ Pý¯Þ~›H’$I’$iò3à  ²phœêîØýd€ºèwSã´ÂïI’$I’$MvTaÀASÅæ?Š~2@´.}Cø}"I’$I’¤É΀ƒ* 8ÈbÀ¡qªyá뢟 P#›O ¿O$I’$I’4ÙpP…Y 84VÍ,J©ÓŒ~6@Mô¾ò…øûD’$I’$IUpÅ€CãVÿñíÑϨ‹n;Ížò¢ðûD’$I’$I“›UpÅ€CãVç¶s£Ÿ P#­‹)ü>‘$I’$IÒäfÀAd1àиվò-ÑϨ‘â¦á÷‰$I’$I’&7ª0à ‹‡Æ­ÆÙ¯Œ~6@ô¾1ü>‘$I’$IÒäfÀAd1àÐ8Vî2úéuÑi¤Ù™„ß'’$I’$IšÌ 8¨Â€ƒ,Çz\ýt€i^ôsá÷‰$I’$I’&3ª0à ‹‡Æ±â¦wG? FŠëÿ*ü>‘$I’$IÒdfÀAd1àÐ8ÖºìÑO¨‘ÞŸ ¿O$I’$I’4™pP…Y 84Ž5VŸ˜RÙ~>@M”­gÓìÊcÃoI’$I’$M^TaÀAký}D? Fš¼&ü>‘$I’$IÒäeÀAd1àиÖݱ!úù5R|úÏÃïI’$I’$M^TaÀAkÅæ?Š~>@tï»:ü>‘$I’$IÒäeÀAd1àиּðuÑϨ‘²±/Í®8&üF‘$I’$IÒdeÀAd1àÐØ6³(¥N3ú 5Ò\÷¯âoI’$I’$MTTaÀAs½Çn‹~B@›ß~ŸH’$I’$¶ÏOÍó~"µ¯~kêÜ~~ê|î”øÿMš7ª0à ‹‡Æ¹ÎmçD?! Fº÷\~ŸH’$I’$}g5'¥ÖÆ¥©Ø:“z»6§²ñoû=Þý׆ÿoÔüpP…Y 84ε¯|Kôj¤|îká÷‰$I’$Išî§Zë—¤bËòÔݱ!•O?rØßÓè=t}øÿnÍŸUpÅ€Cã\ãìWF?! fšçþhø"I’$I’¦¤™¤æÿM*®ûãcþÞûS*ûÙ¿ŸÑÛ}KüÿÍ›UpÅ€Cã^¹ÿÉègÔHûÚ? ¿O$I’$IÒä~JûŠ“SgûÚÔÛ½-¥Ns(¿ŸÑÿ‡/†ÿÓüpP…Y 84îõ¸.ú5ÒýòÇÂïI’$I’4cÖÆ¥©Ø:“z»6§²±od¿ŸÑòžðÿ¿š?ª0à ‹‡Æ½â¦wG?# FÊç¾~ŸH’$I’¤ñª±êøÔZ¿$[–ü(”=;ô÷3úO=þÏ@ógÀAd1àи׺ô ÑϨ™æÚ ¿Q$I’$IRM[y\j®[œÚ›–ø(”þw¦TöC/£üæ?ÄÿsѼpP…Y 84î5V¿4ü°ê¥ýÉÿ7üF‘$I’$Iõú(”Î-g¤Þîm)uš©nÊÆ7Âÿ9iþ 8¨Â€ƒ,š„ú{wE?% Fº÷\~ŸH’$I’¤…¯±úÄÔºôõ©Ø:“z»6§²±/…N#üŸæÏ€ƒ* 8ÈbÀ¡I¨{÷eÑO ¨‘rvOš]qLø"I’$I’FWcÕñ©µ~I*¶,OÝRÏÎ4¶Ê~ø?OÍŸUpÅ€C“P±ù¢ŸP3Íó~"üF‘$I’$ICjåq©¹nqjoZ–:Ûצþw¦Ôï¥I2;ó‚øÎ˜UpÅ€C“PóÂ×E?% fæžÑ7Š$I’$I:ºkNJ­KSç–3Ro÷¶12é«_þÏ]ƒ3à  ²ph"šY”R§ýœ€éÞ{Uü"I’$I’[cõ‰©uéëS±u&õvmNåìÞ4güóðœUpÅ€C“Rï±Û¢ŸP#s¿Ù3»â˜ðE’$I’$ý£V½$µÖ/IÅ–å©»cCêïÙ™RYFÿ6B-4ÎzEü¿ Ì€ƒ* 8ÈbÀ¡I©sÛ9ÑÏ ¨™æû2üF‘$I’$ij[ylj®[œÚ›–¥Îöµ? ¥WDÿvAm5Ïûñøg˜UpÅ€C“RûÊ߉~N@Í×ýIø"I’$IÒ´ÔXsRjm\zð£P¾1¥N#ú·ÆJó‚ׄÿ;Ôà 8¨Â€ƒ,š”æþj1€¬{ßÕá7Š$I’$I“XcõK~ÊõïJ½]›S9»'ú·Æ^sýχÿ{Õà 8¨Â€ƒ,š¤ÊýOF?) FÊæSivÅóÃoI’$I’ƺ™E©yáëR±eyêîØú{v¦T–Ñ?öOœÖ%¿ÿïZ3à  ²ph’š[ùücÍó_~£H’$I’46­<65×-NíMËRgûÚÔÛ½-¥^ýãýThmüõøÿ˜UpÅ€C“TqÓ»£ŸP3Å–? ¿Q$I’$Iªk5'¥ÖÆ¥©Ø:sð£PZÏDÿ(?µÚ—ÿvø¯ ΀ƒ* 8ÈbÀ¡Iªu颟P3½û¯ ¿Q$I’$IªCÕ/M­õKRqý»Ž5|,y­´?þ»á¿F48ª0à ‹‡&íøLe?úY5R6ŸJ³+ž~§H’$I’´ Í,JÍ _—Š-ËSwdžÔß³3¥²Œþ1Ch_ó¶ø_7˜UpÅ€C“Vï®ègÔLó‚ׄß(’$I’$¬•ǦæºÅ©½iYêl_›z»·¥ÔmGÿ8N¦âSÿkI3à  ²phÒêÞ}Yô³j¦øÌ_†ß(’$I’$ «ÆY?œÚWœœ:ÛÎL½¯|!•Åþ轂â³ï ÿµ¥ÁpP…Y 84i›ßý¬€š™û\ßèE’$I’¤£©qÚ÷¦Öú%? åÞ«R¹ÿÉ賑â†ÿþëMƒ3à  ²phÒj^øÚègÔLÙzöÀ_'}§H’$I’tÈfü(”kßžº;6¤þž)•eôÕ,âÆ¿‰ÿ5¨pP…Y 84qÍ,J©ÓŒ~Z@Í4/|]ü"I’$IÒ?ªqö«R{Ó²ÔÙ¾6õvoK©ÛŽþñ™@ÅÖ•á¿&58ª0à ‹‡&±Þc·F?- fŠÏþ×ðE’$I’4½5Îü¡Ô¾ü·Sç–5©÷èÍ©l?ý£25Ó¹yUø¯S ΀ƒ* 8ÈbÀ¡I¬sÛ9ÑO ¨™ÞƒŸ¿Q$I’$IÓQã´Rký’TlY~à£PÊg¾ýc1c óù÷„ÿÚÕà 8¨Â€ƒ,šÄÚWþNôÓꦘM³3/¿S$I’$IÖÌ¢Ô\·8µ¯}û±FÏΔÊ~ôOÁŒ¡Î-gÄÿzÖÀ 8¨Â€ƒ,šÄg½"úi5ÔúÐ/„ß)’$I’¤ñ®qö«R{Ó²ÔÙ¾6õvoK©ÛŠþq— ÑÙvfø¯o ΀ƒ* 8ÈbÀ¡I­Üÿdôój¦Ø:~£H’$I’Ƨƚ“RkãÒ?OövmNeó©èm™`sýk^ƒ3à  ²phR›;¦þ±Þî[ÂoI’$IR=kœvBj­_’Š-Ë|Jùô£Ñ?Æ2e:ÛÏ œUpÅ€C“ZqãßD?/ nzEj¬:>üN‘$I’$·ò¸Ô\·øÀG¡tï¸(õ÷ìL©ìGÿÔÊ”ëÜ~~üÛÐÀ 8¨Â€ƒ,šÔZ—¾>úy5ÔÚð¦ð;E’$I’´ð…Ò¾âäÔÙ¾6õvoK©ÛŠþñ¾K÷‹+œUpÅ€C“ZcõK-¦€ïÒÙvfø"I’$IíX£µqi*¶Îø¨í²ñèEáˆtïXþ~48ª0à ‹‡&¹þÞ]ÑO ¨™þ×î¿Q$I’$IÃiîc2[ë—¤bËòÔݱáàG¡À˜êÞõáð7¥ÁpP…Y 84Éuï¾,ú‰uS–©ñÞ~§H’$I’2[y\j®[œÚ›–ø(”þwú[˜™(sÿM#üi`TaÀAMrÅæwD?1 †æ>÷8úN‘$I’$þ£Pæ~~›kôvoK©ÓŒþqFªû¥áïNƒ3à  ²ph’k^øÚè'ÔP÷‹ ¿S$I’$Iß>Öhm\šŠ­3©·ks*û¢t„×½çòð·¨ÁpP…Y 84ÑÍ,J©Óˆ~f@ÍôŸz(þN‘$I’¤)­±êøÔZ¿$[–§îŽ ©¿ggô‰P Ý{¯ ŸœUpÅ€C“^ï±[£ŸPC³^~§H’$IÒÄ·ò¸Ô\·8µ7-;ðQ(ý'îL©ß‹þ‘j©{ßÕñoV3à  ²phÒëÜzvô3j¨ý‰ß¿S$I’$iR? ¥sË©·{[Jfô06z÷_þ†58ª0à ‹‡&½ö•¿ýÌ€ê~é£áwŠ$I’$sÕ'¦Ö¥¯OÅÖ™ÔÛµ9•³{£Ôƒ±Ö{àºðw­ÁpP…Y 84éÍýõèß©Üÿdš]qLø­"I’$IcѪ—¤Öú%©Ø²wêk(߈þÑ øŸzÞþ5Bƒ3à  ²phj]úúè§ÔPÙz6Í®<6üV‘$I’¤‘´ê%©µ~I*¶,OÝRÏΔÊ2úG1`þŽúfÀAd1àÐ4ÔXýÒ”Ê~ôsj¨ùÁŸ ¿U$I’$©r+KÍó*µ¯ýÃÔ½óC©ÿõ/§ÔïEÿÈdè=|Cü× Ì€ƒ* 8ÈbÀ¡iéÀºà;7üuø"I’$I¹5Öœ”Z—¦bëLê=|cJFôW@E½¿ÿLø× ΀ƒ* 8ÈbÀ¡i©{çÅÑÏ ¨¡Þ#[ÃïI’$I:TÓ_–ZyóÁ±Æƒ[RÙØý£0½>þõFƒ3à  ²phZj_ó¶èçÔQ·}às¡£oI’$I:ÐÌ¢Ô¼ðu©Ø² ¥|úÑèŸ,ŽJçöóÿ¦jpTaÀAMc½GoŽ~z@Mµ6¼)üV‘$I’4O+KÍu‹|J÷Ž‹RÏΔÊ~ôCÑùÛuñ_g50ª0à ‹‡¦±ÎÞýô€šêÜzvø­"I’$é[…Ò¾âäÔÙ¾6õvoK©ÛŠþ‘`d:·þuWƒ3à  ²phk}ì7£ŸPSý'ï ¿U$I’¤ik´6.MÅÖ™ÔÛµ9•oDÿx° ü¡’úfÀAd1àÐ4Öxï÷G?= ÆïûÁð{E’$Išä§Zë—¤bËòÔݱ!•O?ýc@¸Î¶÷…}Öà 8¨Â€ƒ,šÖüP̧}õ[ÃoI’$ibZy\j®[œÚ›–¥î¥þž)•ýè³ væ>þ=ük¶fÀAd1àдÖýòÇ¢ŸPSÝ/}4üV‘$I’Æù£PÚWœœ:ÛצÞîm)ušÑ'>ÀXè|þ=á_Ã58ª0à ‹‡¦µâSýü€š*ûÒìŠç‡ß+’$IÒ8Œ5Z—¦bëLêíÚ|à–àètn^þu]ƒ3à  ²phZóÍ8”æ¯ ¿W$I’¤:ÕXu|j­_’Š-ËSwdžƒ…ÀÐ7­ÿZ¯ÁùoJTaÀAMm3‹Rê4¢Ÿ PSÅõW$I’¤¨V—šë§ö¦e> ¥ÿÄ)•ýè3`¢Ÿ}gü× Ì€ƒ* 8ÈbÀ¡iîÀgp Ð{ä¦ð[E’$IZèBéÜrÆÁß3ë4£Or€©S\÷'áß48ª0à ‹‡¦¹Î¶3£Ÿ PWÝvš]õ’ð{E’$Iv3~ µ>ú©sói©÷Ðõ©l>}}Rj_ó¶ðïœUpÅ€CÓ\ûòߎ~‚@Íý Äè{E’$IªRcÕñ©µ~I*¶,OÝRÏÎè3€y´?þ»áß748ª0à ‹‡¦¹Æš—G?A Æ:·Ÿ~¯H’$IGÜÊãRsÝâÔÞ´,u¶¯Mý'îL©ß‹>«8Bsè4ü{‰fÀAd1àдW>ûxô3jª|úÑð[E’$Iš¯Æš“ü­q[ÎH½ÝÛRê4¢Oh*hmüõðï-œUpÅ€CÓ^÷Þ«¢Ÿ!Pc͵ÿ2ü^‘$I’«OL­K_ŸŠ­3©·ks*g÷FŸÊ Yë’_ ÿ~£ÁpP…Y 84íŸùËègÔX±åÏÂïI’$MY«^’Zë—¤bËòÔݱ!õ÷ìL©,£OcF¬¹þçã¿i`TaÀAM{Í‹þmô3j¬÷÷Ÿ ¿W$I’4Á­<65×-NíMËRgûÚƒ…Ò+¢Ï`4/|mü÷% Ì€ƒ* 8ÈbÀ¡©ï”¦ÔmG?E ®º­4{ê‹ãoI’$MD5'¥ÖÆ¥? åáSê4¢/^jbnÐý}Jƒ3à  ²pHÏKý¯Þý€kmøµð{E’$IãWcõK~ÊõïJ½]›S9»'ú´ Æg¿2ü{—gÀAd1àžw௧˜Ogûyá÷Š$I’jÞÌ¢Ô¼ðu©Ø²O˜@³§¼(ü{žgÀAd1àV>÷Dôsj¬¸îOÂïI’$¾Æê—¦Öú%©¸þ]©·ks*÷?}Š0 Ê2Í®8&üû gÀAd1àÖ»ïÑϨ±ÞŸ ¿W$I’4äf¥æ…¯KÅ–å©»cCêïÙyà? À‚ë¶â¿/jÞ 8¨Â€ƒ,ÒÁŠëÿ*ú9uÖi¦ÙS¿'üf‘$IÒQ¶òØÔ\·8µ7-KíkSo÷¶”ºíè+([ÏįԼpP…Y 8Ô–¥5 IDAT¤ƒµ.þÅèçÔ\ë²7†ß,’$I:²kNJ­KS±uæàG¡4ŸŽ>'`^ås_ ÿÞ©ù3à  ²pHÿ³S¿'¥^'úI5Ö¹íÜø›E’$IßUã´ïM­õK~ʽW¥rÿ“ѧ#d)Ÿ~4üû©æÏ€ƒ* 8ÈbÀ!}«þwE?I Æú{w…ß+’$ISßÌ¢ƒ…ríÛSwdžÔß³3¥²Œ> ’þžûâ¿ÇjÞ 8¨Â€ƒ,Ò·êÜ~~ô“j®qö«ÂoI’¤ijîþjoZ–:ÛצÞîm)uÛÑ'! ÝÜ0þž«ù3à  ²pHߪýñß~’@Í›ß~³H’$Mj5'¥ÖÆ¥©Ø:“z»6§²ùTôù ¢÷Ømá߇5TaÀAé[5Ïù‘è' ÔÜÜHˆ¾Y$I’&¡ÆêSë²7¦â¦w§Þ®O¦rÿ×£O=Ó{øÆðïÍš?ª0à ‹‡ôí•ûŸŒ~–@³iö”†ß,’$IcÕ)/JÍ‹~.[–§î—6¦þ¾S*ËèËj£{ßÕñ߯5oTaÀAéÛ›;’¥µáMá7‹$IRkœýªÔÞ´,u¶¯M½ÝÛRê¶¢O8¨µî]—„ÿÖüpP…Y 8¤o¯øÌ‰~–@ÍunøÍ"I’T—kNJ­KS±uæÀÇ͕ͧ¢Ï5;s£Çèïéš?ª0à ‹‡ôíÍýuž‡R>ûXøÍ"I’Qã´Rký’ƒ…²cC*Ÿ~4ú4€‰Ð¹yUø÷yÍŸUpÅ€CúŽf¥ÔiD?M æšïÿÉø»E’$i”­<.5×->ðQ(Ý;.Jý=;S*ûÑgL¤â³ÿ5þ{¿æÍ€ƒ* 8ÈbÀ!}w½Ý·D?M æŠþ[øÍ"I’4ìBi_qò¿Â½·{[JÝVôÉS£}íÛÃoÍŸUpÅ€Cúî:_xoôÓjnî?jDß,’$IUÆ­KS±u&õvmNeãÑçLµö•o ¿4TaÀAé»›û €Cê÷Rãô—…ß-’$I‡«±êøÔZ¿$[–§îŽ ? ¨•Ö†_ ¿4TaÀAé»k¼çû|¦+pXsŸ}·H’$}[+KÍu‹Ü)s…ÒâN¿Çc`nl~GhÞ 8¨Â€ƒ,Òàú{ï~ž@Íuï¹"üf‘$IÓÝÜG¡´¯8ùÀXcî#ÞR§}"G¡ùþ~Whþ 8¨Â€ƒ,Òàºw~(úy5W¶žI³3‹ÂïI’4]5×þXê=|Ã[˜ ³~8üÆÐ!î/*0à ‹‡4¸öÕ¿ý<€1Ðúð/‡ß-’$iºj}ì7£O `È«O ¿14TaÀAipÍs4úyc sëYáw‹$Iš®ÚW¿5ú†©,ÓìÊcÃo ÍŸUpÅ€Cš§ǤrvOôj®¿ïø»E’$MUÅ–?‹>€!*‹ýá÷…UpÅ€Cš¿Þý×F?Q` ÌýÍ]Ñw‹$IšžŠ­3Ñç0DåsO„ß:tTaÀAiþŠÏ¾3ú‰c øô_„ß-’$izêÜvnôù Qïýá÷…UpÅ€Cš¿æúŸ~¢Àè=rSøÝ"I’¦§îÝ—FŸ?Àõ¿z{ø}¡CgÀAd1àÑ)/L©ÛŠ~¦@Ýõ:©±úÄøÛE’$ME½û¯‰¾~€!ê=|Cø}¡CgÀAd1à]ï±[£Ÿ)0ÚWœ~·H’¤é¨÷èÍѧ0DÝ›Âï :ª0à ‹‡tè:·¬‰~¦ÀèîØ~·H’¤é¨ÿµѧ0DÝ»>~_èÐpP…Y 8¤C×úèoD?S` ”}ivå±á·‹$Išüʧ>}€!êl_~_èÐpP…Y 8¤C×8ýe)•eôSÆ@ëâ_ ¿]$IÒäW¶ž‰>{€!ê|îÔðûB‡Î€ƒ* 8ÈbÀ!¾þ¾¢Ÿ*0:·~·H’¤ of‘?h¦øô_Äß:dTaÀAéðÍ}þÀá”Ï|%ün‘$I“]cÍË£O`ÈÚÿÝðC‡Î€ƒ* 8ÈbÀ!¾ö5ýT€1Ñ|ÿ¿¿]$IÒäÖ<ÿ§¢Ï`ÈZÞ~cè07˜pÅ€C:|Íó~<ú©c¢¸iEøí"I’&·Ö¥¯>w€!k^øºðC‡Î€ƒ* 8ÈbÀ!A+ŽIåìÞèç ŒþwÆß.’$ibk_õ£Ï`Ègýpø¡CgÀAd1àŽ¬Þ®ÍÑÏe™gþPøí"I’&³bËŸE_;ÀÍ®zIø¡CgÀAd1àŽ¬âúwE?W`L×ýIøí"I’&³ÎçWGŸ:À0ušá÷…ŸUpÅ€C:²Zú…èç Œ‰ÞÃ7†ß.’$i2ëÞqQô© Qùìãá÷…ŸUpÅ€C:ÂNyaJÝvô“ÆA¯“ïù¾øûE’$M\½û>}éCÔâ®ðûB‡Ï€ƒ* 8ÈbÀ!yýÇ·G?Y`L´?þŸÂoI’4yõvo‹>s€!ê=t}ø}¡ÃgÀAd1àŽ¼Î¶3£Ÿ,0&º÷^~»H’¤É«¿ïè3¢î—ÿGø}¡ÃgÀAd1àŽ¼ÖÇ~+úÉc¢,ö§ÙS^~¿H’¤Éªl?}æCÔÙ¾6ü¾Ðá3à  ²pHG^ãô—¥T–ÑÏ­¼9ü~‘$I“Sã´¢Ï`ÈŠ›V„ß:|TaÀA)¯þ7þ>úÙc¢{ÇEá·‹$Išœšçýxôy Yû“ÿ_ø¡#¸Ã 8¨À€ƒ,R^Ý»/‹~¶À˜(÷?™fWo€!k_þ‡ß:|TaÀA)¯öµýl€1Ò¼è߆ß/’$i2joúÏѧ 0d­ÿûðC‡Ï€ƒ* 8ÈbÀ!åÕ\·8úÙc¤sËá÷‹$IšŒŠëß}ÚCÖ|ÿO†ß:|TaÀA)³Ǥ²ùTôÓÆDùô#ñ÷‹$Išˆ:·¿?ú´†¬qÆ?¿1tø 8¨Â€ƒ,R~½>ýt€1Ò<ÿ§ÂïI’4þuï»:ú¬†©,ÓìÌ¢ðC‡Ï€ƒ* 8ÈbÀ!åWÜð×ÑO#›W…ß/’$iüëõöè³¢²ùtø}¡#Ë€ƒ* 8ÈbÀ!å׺ø£Ÿ.0Fúû¿_$IÒøW~ó«Ñg 0Dýoü}ø}¡#Ë€ƒ* 8ÈbÀ!E§~OJ½"úùc¤¹nqü #I’Æ·ÏO©×‰>i€!ê?¾=þÆÐeÀAd1àŽ®¹Ã àH[W†ß/’$i|kœùCÑç 0d½]›Ão YTaÀAéèêܲ&úùc¤ÿõ/‡ß/’$i|óq®0yº_ü`ø¡#Ë€ƒ* 8ÈbÀ!]­K£Ÿ/0fšçýxø #I’ƳöÕo>e€!ó·uŽOTaÀAéèj¼çûR*ûÑO#Åÿ=ü†‘$IãY±u&ú”†¬}Í„ß:² 8¨Â€ƒ,ÒÑ7÷W¡©þw…ß/’$i<ëÞ}Yô) Ykï…ß:² 8¨Â€ƒ,ÒÑ×¹ýüè' Œ™æ9ÿgø #I’ƯÞW>}ÆCÖ<ÿÕá7†Ž,ª0à ‹‡tôµ¯üè' Œ™â³ï ¿a$IÒøU>ûXô Yãô—…ß:² 8¨Â€ƒ,ÒÑ×8㢟00fú_½=ü†‘$IcÖÌ¢”ú½è3¦^‘fWgèˆ2à  ²pHÕê?õPô3ÆIY¦ÆY?~ÃH’¤ñiî#Ø€ÉR>ó•ðC÷˜pÅ€CªV÷®K¢Ÿ10fŠOÿyø #I’ƧÖ%¿}¾CÖ{ìÖðCGžUpÅ€CªVûêß‹~ÆÀ˜éíÞ~ÃH’¤ñ©}ÍÛ¢Ï`Ⱥ;?~cèÈ3à  ²pHÕòטÙÊ~j¬yyø#I’ƣζ÷E_/Àun;7üÆÐ‘gÀAd1àªW>÷DôSÆLñ©? ¿a$IÒxÔÛõÉèÓ²âú¿ ¿1täpP…Y 8¤êuï¹"ú)cÆgÝJ’¤#­¿ïÁèÓ²öÇÿSø¡#Ï€ƒ* 8ÈbÀ!U¯¸î£Ÿ20nÊ25ÎzEø#I’jÞÌ¢”zè˲և9þÎÐgÀAd1àª×<ÿÕÑOCþºTI’t¸šçýxôÉŒ@sí¿ ¿3”q“pPY 8¤!´â˜T6ŸŠ~ÎÀ˜é?qWü#I’j]ëc¿}²#ÐXu|ø¡#Ï€ƒ* 8ÈbÀ! §Þ®ÍÑÏCÍó~"üŽ‘$Iõ­¸þ]Ñç 0deû›á7†ò2à  ²pHéøì;£Ÿ30†Š­+ÃïI’Tߺw]}®CÖß{ø¡¼ 8¨Â€ƒ,Òpj^ôsÑÏCý½»ÂïI’TßzÝ}®CÖ{ä¦ðCypP…Y 8¤!5³(¥b6úIc¨yþ«ãoI’TËÊÆ7¢O`Ⱥ;6„ßÊË€ƒ* 8ÈbÀ! ¯¹Õ,@®ÎN¿c$IRýj¼÷ŸEŸ)Àtn9#üÎP^TaÀAix7­ˆ~ÒÀ*Ÿ~$Í®8&ü–‘$IõªuɯDŸ)À[–‡ßÊË€ƒ* 8ÈbÀ! ¯ÖÅ¿ý¤€1Õüàφß2’$©^ŸùËèÖÇ~3üÎP^TaÀAiˆò”:Íèg Œ¡ÎmçÄß2’$©Vuï¾4úDF yþO…ßÊË€ƒ* 8ÈbÀ! ·Þ£7G?k` •Ï}-Í®<6ü–‘$Iõ©ÿµ»£O`«_~g(/ª0à ‹‡4ÜŠ­3ÑÏS­‹)ü–‘$I5iåq)u[Ñç 0deó©ø;CÙpP…Y 8¤áÖúð¿~ÖÀ˜êüÝ…á·Œ$IªGÍuÿ*ú4F ÿÄáw†Žâ63à ²pHCî”ù2ÀQ)g÷¦Ù™Eñ÷Œ$I ¯}å[¢O`º;7…ßÊÏ€ƒ* 8ÈbÀ! ¿ÞW>ý´€1ÕÚ¸4ü–‘$Iñu¾ðÞè³ζ3Ãï ågÀAd1à†_çs§F?m`Luï½2ü–‘$IñõÜ}–#P\÷Çáw†ò3à  ²pHïuɯD?m`\u[©±úÄð{F’$ÅV~ó«ÑW 0­¼9üÎP~TaÀAiú=)uÛÑÏSíkÞÏH’¤°§ÿÓès‘æºÅá·†ò3à  ²pH£©·û–èç Œ©ÞW>~ËH’¤¸æþd.0Ê2Ížúâð[CùpP…Y 8¤ÑÔ¹yUôóÆUY¦ÆÙ¯ ¿g$IRLÅÖ™èkrÿ“áw†Ž.ª0à ‹‡4šZ—üjôóÆXqã¿g$IRL½·DŸ"ÀôÿÛð;CG—UpÅ€CQ§¾8¥n;ú‰cª¿ïÁø{F’$…TÎî‰>E€èÞsyø¡£Ë€ƒ* 8ÈbÀ!®ÞîmÑOcs¿9}ÏH’¤…­qö«¢O`D:_8=üÖÐÑeÀAd1àFWç󫣟80Æ:».üž‘$I [ûÊ·DŸ Àˆ´¯}{ø­¡£Ë€ƒ* 8ÈbÀ!®Ö¥oˆ~âÀ+g÷¦Ù™Eá7$IZ¸:·ž}‚#2÷ß ¢o ]TaÀAi„úâ”zEô3ÆXkãÒø›F’$-X>Ž&WóÜ ¿5ttpP…Y 8¤ÑÖ{ì¶ègŒ±î½W†ß3’$iZylJÅlôùŒBÙO³§¼0þÞÐQeÀAd1àF[çóï‰~æÀ8ë¶Rcõ‰á7$I}Í ~:úòF¤üæWÃo U¸Ó 8¨À€ƒ,Òhk]öÆègŒ¹ö5o ¿i$IÒè+6¿#úìFdîcÒ¢o }TaÀAiÄúâ”zEôSÆØÜG²…ß4’$iäuï¹<úìF¤»ã#á·†Ž>ª0à ‹‡4úz»o‰~êÀ˜kž÷á7$ImåsODŸÀˆ7½;üÖÐÑgÀAd1àF_çs§D?u`Ìu¶½/ü¦‘$I£«yÎDŸÀµ¯89üÞP…[Í€ƒ 8ÈbÀ!¾ÖÅ¿ýÔ€1Wî2ÍÎ, ¿k$IÒhj_óÑç0BÍó_~oèè3à  ²pH ÐÌ R*f£Ÿ;0æZûÍø»F’$¤îÝ—EŸÀ¨”ý4{ê‹Ãï }TaÀAiaê=|CôsÆ\o×'ÃoI’4šÊ§>5€)ŸÙ~k¨ZTaÀAia*nøëè猻~75Ö¼<ü®‘$Iíñ¾Œ¾2€ê=ôÙð{CÕ2à  ²pH Sóƒ?ýÜ€ P\ÿ®ð»F’$ ·öÇ7úÄF¨³ý¼ð{CÕ2à  ²pH ÔÊcSÙz&úÉc®¿ïÁ4»â˜øÛF’$ ­îEŸÀ›ÿ(üÞPµ 8¨Â€ƒ,ÒÂÕÛµ9úÉ õ¡_¿k$IÒðêï{ ú¼F¨uéëÃï UË€ƒ* 8ÈbÀ!-\ŧÿ"úÉ {×%áw$IN÷ý`ôiŒØÜ÷ûè›CÕ2à  ²pH WóüŸŠ~òÀ$(fSã´ÂoI’T½öµo¾,€Q*f}êdÀAd1à°Ǥrvoô³&@ûš?ˆ¿m$IRåº÷]}V#Ôâ®ð{CÕ3à  ²pH [÷Þ«¢Ÿ=0úo¿k$IRÅV—ÊÖ³Ñg0BÝ{.¿9T9ª0à ‹‡´°›ßýì€ Ѽà§ÃoI’tôµ>ô Ñç0bÅÖ™ð›CÕ3à  ²pH [síE?{`Btþî‚ðÛF’$}›O‹>'€k_ù–ð›CÕ3à  ²pH _ùͯF?}`”íçRã´ÂoI’ttõÿáŽès±æ¯ ¿9T=ª0à ‹‡´ðuw|$úé¢}íÛÃoI’”_ãô—¥Tö£O `”Ê25V~w¨zTaÀAiákâ÷£Ÿ>0!ú_ÿRøm#I’òk_õ£Ï`ÄÊg¿94œ 8¨Â€ƒ,ÒÂ×8óÿˆ~úÀi^ôsá÷$IÊ«»cCô ŒXïáÃo 'ª0à ‹‡Sÿ©‡£Ÿ?0!ºw_~ÛH’¤ŒV›ÊÙ½Ñ'0bÛÏ¿;4” 8¨Â€ƒ,RLÝ;.Š~þÀ¤è4Sãô~ßH’¤#«uñ/F_À(¶,¿;4œ 8¨Â€ƒ,RLí+NŽ~þÀ)>ó—á÷$I:²:·}:  uéÂï 'ª0à ‹‡ÓÜŸ’Me?úK0!úO=”fW~ãH’¤ÃW>ýhôé,€Æ{¿?üîÐp2à  ²pHqõÿáŽè/Ài]ò«á÷$I:tÍ _}2  œÝ~whˆ7œpÅ€CŠ«ó…Ó£¿¤»óãá÷$I:t›O‹>€Ð{ø†ð»CÃË€ƒ* 8ÈbÀ!ÅÕúð/G &I¯“k^~ãH’¤ùë?yOôÅ,€Îmç„ß^TaÀA)°™¤TÌF&Hçs§Äß8’$i`Ís~$úTHûêß ¿=4Ä;΀ƒ 8ÈbÀ!ÅÖ{è³Ñ_€IûŒÝS^~ãH’¤ï®¸þ¯¢O`4/|møí¡áeÀAd1àb+>ó_¢¿ ¦}õ[ÃoI’ôÝõÿÛè3Xý^š=õ{Âo /ª0à ‹‡[óüWG&Lÿkw‡ß8’$éÛk¼ï_¤Tö£Ï`ô÷î ¿=4Ü 8¨Â€ƒ,Rp+ŽIåþ¯G)&LëCÿ.þΑ$Iÿ»â³ïŒ>€Ò½çŠðÛCÃÍ€ƒ* 8ÈbÀ!Å×ýòÇ¢¿¦»sSø#I’¾Uÿë_Š>€RÜø7á·‡†›UpÅ€CН}õïE)&M¿—g¿2üΑ$IÏKÍu‹£/`µ>úá÷‡†|ÏpPY 8¤š|.Àu¶~çH’¤ç¥ÎÞ} ¨qÖ+Âï 7ª0à ‹‡Tú{ïþrL˜²õLj¬:>üΑ$iª[qL*ŸùJôY,²ýÜïÿá7ˆ†šUpÅ€CªGíçE9&P±ùáwŽ$IÓ\ëâ_Š>€Ô{ìÖðûCÃÏ€ƒ* 8ÈbÀ!Õ£ÖGÿ¯è/Àêï{0Í®x~ø­#IÒ´Ö½c}ô9, Îß]~høpP…Y 8¤zÔ8í„”zè/ ÀjmxSø­#IÒT6ó‚T6ŸŠ>€äoÂœÌ 8¨Â€ƒ,R}êí¾%úK0z]~çH’4µþLj>€Öúп ¿A4ü 8¨Â€ƒ,R}*¶®Œþ’L¨æ¯ ¿u$Iš¶z÷}"úRY¦ÆêÃo ?ª0à ‹‡TŸšë>úK0¡º÷\~ëH’4M5Îø• S¦|fwø ¢ÑdÀAd1àjÔÊãRÙz6úË0‰úÝÔ8ûUñ÷Ž$ISRqãßD÷XïëÂo&ª0à ‹‡T¯º÷]ýe˜PÛÏ¿u$IšŠV@Ëå÷^éoá$i– NþÛèå@ ü¡›Âß#šÿ 8¨Â€ƒR 8¤z7¾ýÜè3L€Þá÷H’Ô¸¦§üᛣŒF×ÿ&ѼgÀA”bÀ!Õ»Á_Œ>ÀÈï½ÂßÂ!IRÉúGýQôp ØàÔÏ…¿I4ÿpP…¥pHõ®»ï¢Ï0!z‡½?üí#IR“ßyQôo XïÀ·…¿I4ÿpP…¥pH5ojQ*6¬Ž>ÀÈï¾4þí#IRCšþ—5À„ËÇ)ÛöYáïÍTaÀA)Rý]uhô©&Dïð„¿}$IjBãÛÎŽþ± ËøNø›D “UpPЇTÿúÇ~4úT"¿ÿºÔ™Zþþ‘$©Îõxkôl FWþ.…Æ IDATÑÂdÀA”bÀ!Õ¿lå6)yô¹&Dÿ¸…¿$IªsãÛΉþq ÔÀàä¿ —ha2à  J1àšQ~×%Ñç˜ÅÚ[SgéfáïI’êXï wDÿ¨j¢»ßÃß&Z˜ 8¨Â€ƒR 8¤f4øÖÿ‹>Àñ_I’ôÄo?7úÇ4PÃÌü0ApP…¥pHͨ»ï¢Ï0AŠÎ)[±uøH’¤:Õ;ø]Ñ?¢€šßvvøÛD —UpPŠ‡Ô¦¥býÝÑ'˜ ƒ3¿ÿ’$©Fo?/úÇ3PÃsV„¿M´ppP…¥pHÍitùÑ'˜ Eï‘”­|^øH’¤:Ô;ä=Ñ?š€éö;áï-\TaÀA)RsêùÑ'˜0à V…¿$IªCù]GÿXê¢ÈS¶ÝsÂß'Z¸ 8¨Â€ƒR 8¤µí3Sõ£Ï0I†Ý”­zIü;H’¤ÀúGÿèŸÈ@ä÷_þ>ÑÂfÀA”bÀ!5«ñÍߌ>À„]uhøH’¤°–>#åßý㨑áe_Ž£hA3à  J1àšÕà?þ>úl“¦(Rw¿7†¿ƒ$IŠhðÍÿý“¨™þq £ha3à  J1àšU¶ëË£Ï0ò».N©Eáo!I’²lûŸIE÷áèÃ@Íd»¼,ü¢…Í€ƒ* 8(Å€Cj^ùš¢O0ú_ýHø;H’¤…lxéÞÑ?~€š)½7ü¢…Ï€ƒ* 8(Å€Cj^à VEŸ`Ü•:Ë·  I’´u÷xuJãaô_ fF×þNQÀÛЀƒ 8(Å€Cj^½ûíèÓL¨Á™_  I’´¿wrô] †ÿñ÷áï-|TaÀA)R[²i*zë¢Ï0ŠÁ†”íô¢ø÷$IóXï wDÿÈjªûå_«há3à  J1àšÙô_ÓatåÁáo!I’æ­©Å)¿÷Êè·@ :3ÿeø{E žUpPЇÔÌúÇ<ú|“ªÈýG’¤Ö68éÓÑ?i€šßú­ð·Šb2à  J1àšY¶r›”òqô &T~÷e3ÿ…rô›H’¤¹,Ûñ…~e)ð¤†g/ ¯(&ª0à ©¹åw]}B€ Ö?ááï!I’æ²ÑõÇFÿxj¬wÈ{Âß+ŠÉ€ƒ* 8(Å€Cjnƒ3¿}B€ VtNÙÏI’4õûè­@åã”m÷ìð7‹b2à  J1àš[wß_‹>!À„]ypø›H’¤Ê-ß*koþ± ÔX~ßUño…eÀA”bÀ!5¸©E©Xwô&YQ¤Þo‹I’T¡áù;EÿDjnxé>áoÅeÀA”bÀ!5»Ñ·÷‹>#À„Ëï¿>u–nþ.’$i6u÷ùÕ”ÆÃè§@Íõþáï¾ 8¨À€ƒR 8¤f×;ìýÑg ¾ùOáï"I’J7µ8ï¼(úÇ(PwEž²•ÛÄ¿]–UpPЇÔð–mžŠþ£Ñ§˜tÃ,e»ü|üÛH’¤ NútôOP ò{¯ ·(6ª0à ©ù®?6ú”¤ñßI’´±e»¼,½G¢| 0¼p—ð·‹b3à  J1àš_ÿ¸EŸ€ýc?þ6’$i£~uÊmgGÿØbúW™‡¿_šUpPЇÔü²íž“Òx}NR‘=”²ÿ[øûH’¤§jpú¢dM‘R¶bëð÷‹b3à  J1àÚÑøÖ³¢Ï ÀŒñ '†¿$Iz²º{½6¥Q/úÇ%Ðã;/ ¿(>ª0à © NùLô9ø‘þÑþ>’$éq-Û<嫯þ1 4Èðìåño…gÀA”bÀ!µ£l——¥TÑ'`F‘=˜²^þF’$éÇ^°sôH azÿöÛáoÅgÀA”bÀ!µ§|õ5Ñ'àGF×þ>’$é‡õ|[Jù8úÇ#Ð$ÃlæoðŠ~Ç(>ª0à ©= Ï^}R£wÔ‡ÂßH’$eÛ=;ëîˆþ±4Ìø–3Âß1ªGTaÀA)R{ê~ù×£O ÀcV§l‡ç‡¿“$I“Ýèêâ$ 48ã_Âß1ªGTaÀA)R»*ÖÝ}VcüýSSgjQø;I’4™õûXôB ¡ºû½1ü-£zdÀA”bÀ!µ«á¥{GŸ€Çéã¯ÃßI’¤É«»÷ëf~w=@YEï‘ÔY²Iø{FõÈ€ƒ* 8(Å€CjW½CÞ}Vo˜¥îž¯ +I’&§lÅÖ)_scôO@ ¡Æ7œþžQ}2à  J1àZÖÒÍRÑ]}Z'¿ïªÔYúŒø÷’$©ýM-J£ïý£h°Á)Ÿ‰Ó¨6pP…¥pHíktíQѧà Ïß1ü­$IjƒÓ¿ý#h¸îÞ¿þ¦Q}2à  J1àÚWÿ«‰>-O¬ÈSïàw†¿—$Ií­{À[R£â Vt˜ù½¢ß5ªOTaÀA)RûÊVütJãAôyxBÅú»S¶r›ð7“$©}e;ýl*6¬ŽþQ4Ü躣Ãß5ªWTaÀA)R;ßüÍèóð¤¦ß*©Åáo&IR‹Z²iß~^ô8 ú'~2þm£ZeÀA”bÀ!µ³ÁI}^žÒà¬%áo&IR{^¸kô6 %²_þ¶Q½2à  J1àÚY¶êÅ3¿c ¶Š<õywø»I’Ôüú'~*ú§Ðùýׇ¿mT¿ 8¨Â€ƒR 8¤ö6¾ó¢èð”ŠÎš™áiô»I’ÔÜz½=¥ñ úGÐÃów ߨ~pP…¥pHímpÚç£O ÀÓÊïº$u–>#üí$Ij^ݽ~9½uÑ?Ê€™‡F¿qT¿ 8¨Â€ƒR 8¤ö–íòó)Eô™xZà v;I’šU¶ÃóSþð-Ñ?€)úëSgéfáïÕ/ª0à ©Ýå÷\}fž^Q¤þ1þv’$5¤å[¥üžoGÿôZfôݯſsTË 8¨Â€ƒR 8¤v78ã_¢Ï ÀÆvg>ˆD¿Ÿ$I5ojñÌ¿\˜kýþ*þ­£ZfÀA”bÀ!µ»î>3­xôÞ”íô¢ð7”$©¾MÿÚ-€9W)[õâð·Žê™UpPЇÔþòÕ×FŸ€6¾ó¢ÔY¶yøJ’T¿úßø?Ñ?¦€–ÊW_þÖQ}3à  J1àÚßà¬%ѧ ”ÑÕ‡…¿¡$IõªwÔ‡RÊGÑ?¢€–ž·2ü½£úfÀA”bÀ!µ¿î^¯>5¥ Ný‡ðw”$©õ}oJ£~ô& Åz¾-üÍ£úfÀA”bÀ!MFùš£Ï @9ù8õ{ø;J’[ï w¤4ìFÿTZ¬è­K%›†¿{Tß 8¨Â€ƒR 8¤ÉhxîvÑç ¼a–ºûýfø[J’ÓôÏ€¢ÿhôO# åF×5üÝ£zgÀA”bÀ!MFÝ}ß}nf¥è¬IÝÝ^þž’$-lÝ}~5݇£  ÿµ?û¨ÞpP…¥pH“Sþð-Ñ'`Vò57¤lûŸ OI’¦îî¯LņÕÑ?~€IP)ÛéEáïÕ;ª0à irž¿Sôɘµñç§Î²-ÂßT’¤ù-Ûù¥©XwGô`Bä÷^þþQý3à  J1à&ëw4ÙèºcRgjqø»J’4?e«^œŠµ·Fÿ¸&ÈðÜíÂß@ªTaÀA)Ò5µ(Ü}v*^´{ü»J’4/óFþðÍÑ?f€ Ó=à-áï Õ?ª0à i²šþM78kiø»J’4we»¼,åßýã˜0Ewmê,Ù$ü-¤úgÀA”bÀ!MV½+úì̉Á©ÿþ¶’$U¯»Ç«R±þîè+À]{Tø[HÍÈ€ƒ* 8(Å€C𰦧âÑû¢O@uE‘ú_ÿËø÷•$iÖu÷z­ÿÓ?æOÂßCjFTaÀA)Òä5¼lßèÓ07òqêóáð÷•$©|Ýý~3ÙCÑ?I€I5ê¥lÅÖáo"5#ª0à iòêôöèÓ0wƃÔ;ìwÂßX’¤¯wÈ{R1Øý˜`ãïþ&Rs2à  J1à&ôר¬¿'úüÌQ?õÿ`ü;K’ô´õŽüÙÿâ Rÿëþ.Rs2à  J1à&³áÅ{DŸ€¹5ì¦Þ¡ï gI’ž¼þ7þzæ×_„ÊÇ)Ûáùáo#5'ª0à i2ëîÿ¦èó0OÇÂßZ’¤ŸhjQœµ4ú§ÀŒñmçĿԨ 8¨Â€ƒR 8¤ mjQ*ÖÝ}‚枇$Õ«¥ÏH£kŽˆþéð#ƒS>ÿFR£2à  J1à&·áù;FŸ €ùaÄ!Iµ(Ûþ¹i|û¹Ñ?#Ûõåáï$5+ª0à irëîû†è0†]#I ¬»Û+R¾æÆèŸ‘ß{Eø;IÍË€ƒ* 8(Å€Cšìò57DŸ!€ù“Rÿø‡¿¹$iÒêø[©è¬‰þ)ð8ƒ3¿þVRó2à  J1à&»áÙË¢ÏÀüÊÇ©Â_…¿»$iRêŸøÉ”ÆÃèëð„º{ýrø{IÍË€ƒ* 8(Å€Cšìº{¾&ú Ì¿¢HƒS?þö’¤V·d“4<Çè‹ð¤ò‡nŠ3©‘pP…¥pHÊW_}ŠÄô¿XŒ~{IRËVn“Æ·œ}æžÒð¼ÂßMjfTaÀA)’g|1ú,˜á…»¦ÎÔ¢ð7˜$µ¥îþoJÅú»£Ï;ÀÓêî÷›áo'53ª0à IÙ®¿0ó׊LŠÑ5G¤ÎÒÍÂßa’Ôôú'~*¥ñ ú¬<­bý=ÆüšuTaÀA)’¦Ëï¾,ú,¨ñͧ§lÛg…¿Ã$©‘-ß*®:4ú”l´áeûÆ¿¡ÔØ 8¨Â€ƒR 8$M78íóÑç`Áå÷\ž²^þ“¤&ÕÝó5)_}mô (¥wð»ÂßQjnTaÀA)’¦ËV½$¥">I .覙_)ý“¤&Ôÿú_¤4Ì¢O7@)Ew­_£©JpP…¥pHúaã;Î>I!Š ÷§î~o IR]›þ•S£«ÿ=ú\ÌÊèêÃÂßSjvTaÀA)’~Øà¤OGŸ$€8Ã,õŽüÃð7™$Õñcuþà÷£¯4À¬õÿ`ø›JÍ΀ƒ* 8(Å€CÒËvx~Jù(ú,Ä)Š48ýŸÃße’T‹¦§Á)ŸIi<ˆ¾Î}Ê3âßVjtTaÀA)’~¼ñ-gDŸ%€pË÷H%›„¿Í$)ªl——¥ñíçEŸc€ÊF—ïþ¶Ró3à  J1àôãõ¿þ—Ñg  Æ7œ²mŸþ>“¤…®ÿõ¿HE}ô˜½ƒßþ¾Ró3à  J1àôãe+~zæ÷¿R~ÿu)Ûõåáo4IZˆ²_˜Æ7œ}zæLñè}þvEÍITaÀA)’~²ÑuÇDŸ&€Ú(²‡ü[’Z_ÿ˜§¢ûpôɘSËvg©pP…¥pHúÉz‡ ú4ÔËx˜'ýMø;M’æºlÕ‹Óøû§D_Y€yÑÝÿMáï-µ#ª0à Ikéf©è<}žjgtÅ©³l‹ø÷š$Umjqœüw©è¯>­ó¢X{[êL-Šw©pP…¥pHz¢†—ì}žj)¿ïêÔÝíáï5IšmÝ}~5åw]}NæÕðÜíÃß]jOTaÀA)’ž(€'7ý_¬÷þãð7›$•jù–ipÖҔƃè3 0ïº{¿.þý¥Öäß™P…¥pHz²ò57FŸ(€ú*Š4¼`ç™_?ýn“¤§«Ô¥bÝÑ—`Aä|'üý¥veÀA”bÀ!éÉœù¥èP{ù=—§îî¯ »IÒ5}ŸÆß?%úT,¨éoÛÑï0µ+ª0à IOV¶ËËR*òè3P{EÿÑÔ?ñSáï7IúQË·úÁ¯Kõ£O$À‚3²×\gÀA”bÀ!é©ß~^ô™hŒÑuG§l»ç„¿á$MpS‹SÿkžŠGï>‰!ò{¾ÿ&Së2à  J1àôTõOøDô™h”bÝ©wð;Ãßq’&¯éÛ“ßwUô58íóáï2µ/ª0à IOU¶Ý³Sv£O@³E]¾ÊVlþž“Ôþº{¼*®?6úòÄ+ò”­zqøûLíË€ƒ* 8(Å€CÒÓåC ÀìkoM½ûíð÷œ¤v–íô³ixÙ—S£Ï@-LÿJðè7šÚ™UpPЇ¤§«wÄïEŸ*€æ*Š4¼d¯”mû¬ðw¤v”mÿÜ4iõ3¦lå6ño6µ2ª0à IÓðÒ½£Ï@+Œ¿ûu¿“YR¹–o™§|6Þ}Âjk|ãIñï6µ6ª0à ISw¿ßŒ>W­QôMƒS>“:K6 çIªù߸qÚçS±auôÙ¨½ÞQŠ¿©µpP…¥pHÚØò¿}²Z%_sCêúÞðwž¤šµí3gF^þÆ €Sd¥Î²ÍãßqjmTaÀA)’6¶Á·¦¢O@ûE]wtÊvþ¹ð÷ž¤Ø²ífæï*²£/@£ /Þ#ü-§vgÀA”bÀ!icËv}ùÌ¿`` :ið­ÿ—:˶÷IZزU/IËvKÅ`Cô%h¤î>¯Ó©ÝpP…¥pH*Óø¶³£Ï@«ëîHýã?ž:S‹Ãß~’æ·îž¿”FWœÒx}z+¿ïªðwÚŸUpPЇ¤2MÿËæ_þÀwSÿ˜‡¿ÿ$Í}½ÞšÆ7žäo8˜ƒÿøûð÷ÚŸUpPЇ¤R-ß2½G¢OÀÄßrfêîû†øw ¤j-ß*õOüÔÌ8 €92¤låóâßzj}TaÀA)’Ê6úöW¢OÀd)Š4úÎq©»÷¯„¿%•+ÛåeixÞÊTdE_€Ö™þß“¢ß{šŒ 8¨Â€ƒR 8$•­»ß£OÀd*Š™_»ÐÝçõáoBIOÑÔâÔ;äÝitý±)å£èËÐZ½ÿÝø·Ÿ&"ª0à I³)¿ÿºèó0¹òq]sDêîñêðw¡¤ÿ*[¹Mœþ…T¬½5úJ´^ñè}©³dÓð7 &#ª0à I³ipêç¢ÏEþƒ_­ò•ßJý·mú¾4ºî˜”Fýè«01†çïÿÔÄdÀA”bÀ!i6e+Ÿçã$@Œï¸ õÿ`êL- +J“P¶ê%ipú?§bímÑü&RwÏ_ jr2à  J1à4ÛFß9>ú„ðò{.Oý¯~$u–nþ^”ÚV¶bëÔ?þÏÒø¶³S*Šè?î+¿ë’ð·¡&+ª0à I³­÷ï¿}ÂxņÕipÖÒ”­Ü&üÝ(5º%›¤Þ!ïN£«KÅ`CômRJý?ÿNÔDeÀA”bÀ!iÖ-Ù$ëï‰>c<•a7.? u÷þ•ø÷£Ô”¦¥îþoJÃK÷NEgMôŸb~ܰ›²ížÿfÔDeÀA”bÀ!©JÃs·>cl¤ñíç¦þqKe[„¿#¥ZŽ6ö{c^°s*ÖÝýÇ€'1ºöÈø·£&.ª0à IUÊvý¿û aŠÞº4º|ÿÔÝûuáïI)ºî^¿<óë†ò‡nŠþ£ ÀF˜þõvÑoHM^TaÀA)’ª6ý_rÐLãÛÏKý¯ýï”mû¬ðw¥´ -Ù4õ~W^¼§¿i aŠGîL©ÅñoJM\TaÀA)’ª6ýÁ€†õÒèúcSïðÎü îè7¦4§-ßjæŸíé¿y¦è<ý§ €Yœù¥ø·¥&2ª0à I•[¾U*úë£Ïs¤xôÞ4¼`Uêîóúø·¦4˺»½" þãïÓø¦ÓRõ£ÿXPÕx˜²ü;-ÅdÀA”bÀ!i.]~@ô9`ënOË÷H½Þþ攞²å[Îü>ôáù;¦üïFÿÑ`ŽMÿáoNMlTaÀA)’æ¢îþoŠ>g̳üÁï¥á9+üͪGS‹fþYœö?ø[6†Ýè?"Ì£ÞÁjb3à  J1à4Wù¯Ü&G±îŽ4º|ÿÔ;üƒ©³lóð·¨&£é¿2»̇gþÙ+ÖßýÇ€2=&ŸðF¿G5¹pP…¥pHš«§}>ú¤ è?šFß9>õ¿ö¿S¶ã —ª=e»¾|柫ѕ§üá[¢ÿQ ÈàÔÏ…¿M5ÙpP…¥pH𫲕ÏKiÔ‹>k+ÖÞ:ó7$LÿM ÙŠ­Ãß©jNÙ®¿úÇüÃÆÚÛ¢ÿQ †Ý”mÿ3áoUMvTaÀA)’æ²Ñ5‡GŸ5êdÔKã[ÎLƒÓ¿ºû¿)u–lþfU=ʶ}VêôŽ48óKiü½“S‘=ýO+54ý·±E¿]%ª0à IsYFŸ5êlÐùÁ ã¬%©wÐÛSgù–áoX-@K6Iݽ^›úÇÿY^ö唯¾&¥|ýO# ÐÝïñïYM|TaÀA)’æºüþë¢OM1¤ü®‹Óðâ=Rÿ¸¥îî¯L©EáoZUhéf©»ï¯¥þ×ÿ2 /Ýgæ¾i˜Eÿ“@å÷^ÿ¾• 8¨È€ƒR 8$Íuƒ“>}Úh°¢»6o>= ÏY‘zG}(e»þ‚QGMËvzQêòž48õsitÅ)¿÷Š”Fýè„h‰þ‰Ÿ óJÓpP…¥pHšë²?ŠÁ†èó@‹ýõi|ç…3¿~£ÿÿ“ºû¿yæÝýöˆ¦¥lçŸK½ƒß™'ÿm}{¿4¾ãü™¡ Ì—¢÷HêlûÌø÷°dÀAE”bÀ!i>]~@ôy`ޛƷ=3*˜þ[ z‡½?uwûÅÔY²Iø›¸q#U/I½ƒÞ>ó_9Ïß)¾ûµüzÄa7úÌL á¥{Ç¿“¥ÿÌ€ƒ* 8(Å€CÒ|Ôýò¯GŸ7&Ùx˜Šµ·¦ñ­g¥Ñ•¥Á·¦Rÿø§Þ¿5ó·It–>#üͼeÛ>+u÷ü¥Ô;ô½©Â'Òðìåitõai|Û93ÿÿ”ƃèÿ‰Àct÷zmø;ZúaTaÀA)’æ«üîË¢O<©¢³&å÷_ŸÆ·œ‘FWÿ{^°* Ný‡ =ÿ@êð–ÔÝó5)ÛᩳdÓð÷õZ²iÊvx~êîñªÔÝï©wèûRÿ«š'ÿ]ž³íÌ߆7¾ñ)¿ë’T¬»Ãß @ãŒo?/þÝ-ýXTaÀA)’æ«þ×ÿ"úÄÀœ)úëgùƒßKù½W¤ñíç¦ñͧ§ÑõÇÎüm£Ë÷OË÷LÃówü¯Î[™§ÿóãûÖÔcÿÏMwñ3ÿwŒ®=*¾s\ßræÌ‡ëéÿ·ò57¤â‘»R1Øýÿ 0ïúÇ~4üû¶ôãpP…¥pHš·–o™ŠîÚè3@CÙƒ©³lóøïÛÒeÀA”bÀ!i>›þ¯`c ÏÛ!ü»¶ô“pP…¥pHšÏ¦gx*ŠèS@Ý壔íüÒðïÚÒOfÀA”bÀ!i¾›þÝàðTF×þ=[z¢ 8¨Â€ƒR 8$Íwýc?}꨹îþo ÿž-=QTaÀA)’æ½¥ÏHEçès@Mï¼(þ[¶ô$pP…¥pHZˆ†çï}îY³@ IDAT¨©þÑþ[z² 8¨Â€ƒR 8$-DÙ®/O©È£O5S¬»#u–lþ[z² 8¨Â€ƒR 8$-Tã›N‹>yÔÌà´Ï‡¿–ž*ª0à I Uïˆß>yÔHÑ4eÛ=;üûµôTpP…¥pHZ°¦§üá[¢Ï51¼h÷øo×ÒÓdÀA”bÀ!i!œú¹è³@äãÔÝíÿ[KO—UpPЇ¤…,[±u*úë£OÁFßýZø7kic2à  J1à´Ð /Ý'úô¬wào…¯–6&ª0à I ]w÷W¦TäÑç€ ù½W„«–66ª0à Io:-úü¤ìGÿSK›UpPЇ¤ˆz‡½?úü XOê,Ý,ü;µ´±pP…¥pH ijQÊ×Ü}X`ƒÓÿ9þµT"ª0à IQ Nþ»èÀBf)[ù¼ðïÓR™ 8¨Â€ƒR 8$E•mû¬Tô‰>ƒ,áeû†›–ÊfÀA”bÀ!)²áE»EŸAB>NÝÝ_þ]Z*›UpPЇ¤È²]~~æÑ@»®=2ü›´4› 8¨Â€ƒR 8$E7¾ñѧ€ùT©»÷ë¿GK³É€ƒ* 8(Å€CRt½ƒß} ˜GÓÿ!_ô·hi¶pP…¥pHªCùêk£Ï!ó¤{À[¿CK³Í€ƒ* 8(Å€CRêŸø©èsÀ<ßzVø7h©JTaÀA)’jÑò-S‘=}˜c½CÞÿ ZªUpPЇ¤º4<§è“ÀÊïùvø·g©jTaÀA)’êR¶óKSÊGÑg€9Ò;êCáßž¥ªpP…¥pHªS£ëŽŽ>‹Ì|Í ©3µ8ü»³T5ª0à Iuª»ÏëS*ŠèÓ@Eýã?þÍYš‹ 8¨Â€ƒR 8$Õ­ñ­ßŠ>TP•<…¢¿>eÛÿLø7ei>2à  J1àT÷F—}*x ó—…K–æ+ª0à Iu¯»Ç«R*òès À(zëR¶ýsÿ%Kó•UpPЇ¤&4¾á„ès Àœù¯áߥùÌ€ƒ* 8(Å€CRêî÷Æès ÀO(²S¶bëðoÈÒ|fÀA”bÀ!©)ï¼0údðcßü§ðoÇÒ|gÀA”bÀ!©)õŽüƒè“ À*6¬Nå[…;–æ;ª0à IijQÊønôÙ`úoß8å³ñߥÈ€ƒ* 8(Å€CR“êŸð‰è³ 0ñŠGïKå[†3–"ª0à IjÙæ©Xwôé˜hƒ“þ&þ{±´@pP…¥pHjZÓ-1ŠGîœùí¢¿K •UpPЇ¤Æµl‹™¿ž€…×?á¯â¿K ˜UpPЇ¤&6øæ?EŸO€‰“?|Kê,Ý,ü±´pP…¥pHjdÛ>35Ñ'`¢ôÿ³øïÃÒgÀA”bÀ!©© ÎüRô ˜ùC7¥Î’Mÿ K UpPЇ¤¦–­øéTt×FŸQ€‰ÐÿꟆ–"2à  J1àÔä†g/>£­—ßwuêL-ÿ&,EdÀA”bÀ!©ÉeÛ='½G¢O)@«õywø÷`)*ª0à IMoxÞѧ µÆß?5ü;°™UpPЇ¤¦—­|^*¢Ï)@ûyêîû†ðïÀRdTaÀA)’ÚÐðÂ]£Ï)@댮<8üû¯UpPЇ¤6”íøÂ”†Ýè“ Ð£^Êv~iø÷_):ª0à ImixéÞÑ' 5†ç­ ÿî+Õ!ª0à Im)[õ’”Fýè³ ÐxEö`ʶ{vøw_©pP…¥pHjS£Ë÷>«78å³áß{¥ºdÀA”bÀ!©MMÿ>Æ4FŸV€Æ*ÖÞ–:Ë6ÿÞ+Õ%ª0à Imktաѧ ±ú_ýHøw^©NpP…¥pHj[Ý=^•R>Ž>¯“ßóíÔ™ZþWªSTaÀA)’ÚØèêâÏ+@ãô~gø÷]©npP…¥pHjcÙ.?ŸÒx}bc|ãIáßv¥:fÀA”bÀ!©­¾ý•è Ð ù8u÷zmøw]©ŽpP…¥pHjkÙN?›Ò0‹>³µ7ºü€ðoºR]3à  J1àÔæ†î}fêmÐIÙN/ ÿž+Õ5ª0à Im.[¹M*úFŸZ€Úœù¥ðo¹R3à  J1àÔö†ç¬ˆ>µµT¬½5u–mþWªsTaÀA)’Ú^¶Ý³SÑ}8úÜÔNïÈ? ÿ†+Õ=ª0à I“ÐàŒ/FŸ[€Zßú­ðo·R2à  J1à4mûÌTl¸?úäÔC>Jݽ_ÿíVj@TaÀA)’&¥Á)Ÿ>¹µ0¼h÷ðo¶RS2à  J1à41-Û<Ü}vBR¶Ýsâ¿ÙJ É€ƒ* 8(Å€CÒ$Õ?ñ“Ñg Tÿ„O„«•š”UpPЇ¤‰jÉ&)ð{ѧ D~ßU3ßIÿÕJ Ê€ƒ* 8(Å€CÒ¤Õ?îcѧ`áEêø¶ðo´RÓ2à  J1à4qM-Nùêk¢Ï/À‚]sxü÷Y©pP…¥pHšÄzG}(úü,˜b°!e«^þmVjbTaÀA)’&µüîK£O0À‚œñÅðo²RS3à  J1à4©õ}oô ˜wù÷¤Î²ÍÿÉJMÍ€ƒ* 8(Å€CÒ$7¾ùôè3 0¯zGü~ø·X©ÉpP…¥pHšäºûüjJù8úÌ‹ñ-g†‡•šžUpPЇ¤IotÕ!ѧ`îú©»Ç«Ã¿ÁJMÏ€ƒ* 8(Å€CÒ¤—­zqJƒNô9˜S󗇕ÚUpPЇ$ýTž»]ô9˜3ùC7¥Î²-¿½JmÈ€ƒ* 8(Å€C’~*eÛ>+VGŸd€9Ñ;äÝáß]¥¶dÀA”bÀ!I?hpÒßDŸd€ÊF×þ½UjSTaÀA)’ôŸ-Ù$å|'ú,ÌZÑ]›²^ÿ½UjQTaÀA)’ô_õŽøýè³ 0ký?þUj[TaÀA)’ôØÆ·~+ú4”–ß}iêL-ÿÆ*µ-ª0à IzlÝ}ßR‘GŸg€—RwŸ×‡_•Ú˜UpPЇ$=¾ÑµGFŸg€6ÑO«wøÿ§Jm®wÐÛ£ÿ˜Ó`”ÒYõ’ð£'Iu,Ûî9©ÈŒ>ÓOjtýWÿ¥Jm¯wèû¢ÿ¨Ó`”’íú áGO’êÚà”ÏFŸi€'Tô×§lՋÿ£Jm¯wÄïEÿq§Á 8(%Ûã5áGO’jÛÒÍRþÐMѧàq'}:þª4õþãè?î4˜¥dû¼>üèIRó0ê&¿û²Ô™ZþýTš„úÇþÏè?ò4˜¥d_ùïáGO’jÝÔ¢4¾ýÜès ðãaêîûkñßN¥ ©Â'¢ÿÔÓ`”Ò=à­áGO’ê^w¯×¦”¢O6@ž½,ü›©4I Îøbô{Ì€ƒRº‡¼'üèIR^ºwôÉ&\¾úÚÔYúŒðï¥Ò$5¼`çè?ú4˜¥ô¾ú§áGO’šP¶ýsSÑY}¶€I•R÷+¿þ­Tš´FWý§Ÿ3à ”þÉ~ô$©)õOüTôÙ&ÔðœáßH¥Ilü½“£ÿøÓ`”28kiøÑ“¤Æ4µ8åw_}º€ “¯¹!u–mÿTšÀò».‰>4˜¥ .Ù+üèIR“êîÿ攊"ú|õ«Sþ{ø·QiR˾9ú Ð`”2¼öèð£'IMktõaÑç˜Ãs·ÿ&*MlS‹Sõ£Ï fÀA)£[ÎŒ?|’Ô°²_˜Šþúè´\þÀwSgÙæáßD¥I-[õ’è3@ÃpPÊøÁ›ÂŸ$5±Áiÿ}€6+òÔ=à-áßB¥I®wàÛ¢/ gÀA9£ÁÌ_ý}ü$©q-Ù4å÷_}Å€–ž¿cüwPiÂëÿgѧ€†3à ´ÎN/ ?~’ÔÄz¿+ú„-”?ø½ÔY¾eø7PiÒœµ4úÐp”Ö=à·ÂŸ$5µñw¿}Æ€6ÉÇ©»ÿ›Ã¿}Jú©4ºêÐè‹@ÃpPZï¸ÿ~ü$©©e;¿4¥a}Ê€–^°*ü»§¤”ß{EôI á 8(­ÿ­©ðã'IMnxö²èS´@þà÷ýê©.-ÙÄÀIe”6¼ö¨ø(IMnù–©Xw{ô9š¬ÈSïÀ·Åï”4SwÏ×D_ZÀ€ƒÒÆ÷7üJRÓëõGÑçh°á;‡ç”ô_õùpôY  8(o´„³Öÿæ¡$µ©ÁIŸŽ>í@Íäß’²[‡¿”ôÄe+·I©(¢O-aÀÁ¬nøFøA”¤V5µ8åw]}Þ€ºÈG©»ÿ›ã¿]JzÒúÇ~4úRÐ"ÌZž=œ:S‹Â¢$µ©î¾o˜ù_ʆg/ ÿf)é©]}Xô© E 8¨$Û÷ áGQ’ÚÖðÂ]¢Ï;,¿çòÔYºYø÷JIOÑÔâTl¸?ú\Ð"TÒ?ã_ã£$µ­å[Íü^K`B :©»Ç«â¿UJzʺ_ùèkAËpPÉèŽ Ã£$µ±ÞAïH©(¢Ï< Â'¿QJzúg-‰>´ŒÕäãÔÙî¹áÇQ’ژߛ“g|à áß&%m\ù]—DŸ ZÆ€ƒÊzÇ|$ü8JRËV>/5ÑgX Å£÷¥lå6áß&%=}ÙÎ/õ7i3ç 8¨lxÕaáR’ÚZÿØÿ}怅g~µrô7II×à´Œ¾´•åÝuiÃÒg„IIjkãOŠ>õÀ<œµ$ü[¤¤/¿÷Šè³A p0'º‡0üHJR›ÿ¶b°!úÔód|Û9©³d“ðo‘’6®în¿è×§0/ 8˜ë?”’Ôæ§|6úÔ󠨰:e;¾0ü¤¤opæ¿FŸZÊ€ƒ9‘÷M–m~,%©µM-Nã;/Œ>÷À\*òÔ;ø]ñß%•*à;Ñ׃–2à`ÎôŽú£ðc)Im®»Ç«Rv£Ï=0G†g/ ÿî(©\ÝÞ}:h1æÌðúã¦$µ½Á7ÿ)úÜs`|ÛÙ©³d“ðoŽ’Ê5ºêèóA‹p0wÆÃÔñ;Ú$i~ó«T ñŠÎ)ÛéEñß%•*ÛîÙ) ³èB‹p0§úßüBøá”¤¶×Ýó5)zÑ'˜"O½CßþQRù'ÿmô¡å 8˜Sã‡nNjp<%©í Îü×è“ÌÂðœáß%Í®|õ5Ñ'„–3à`Îuzgøñ”¤Ö·dÓ”ßsyôÉJß~^ê,Ù$þû¢¤Òõz{ô ap0ç†×~@%iêîó«)ÑgØEgMÊV½8ü»¢¤Ù5þþ)Ñg„ `ÀÁÜ Rg§…QIš„g-‰¾úÀÓ)òÔ;ô}áß%Í®î^¯M©(¢/ À€ƒy18§ðC*Ió«Tî¾,úìðÿÛ»óg»ëò€ãA‘E[-"XeZ¬S—Z—2¶E­SK]ÆÎè¸ÌtpÔ©tœÖŽËŽSî% Y0 ‚"(²É2 ÈRD0H  F¢!“rÏ÷ìßïÓ!¶ÎÙ’{î}Î9ß×kæý'äùÜ<÷¹ç<¹îõÇåï%íq½ÛÏÊ#Ô„fDÕÚùÏK¦’T‡š'½*¢×ÊýÀèo¸a×beï%íYÅñ/ñuæÌ̘öUŸO¨’T—:W}.{ìSíÜÅñ‡¤ï%íyÝ›¾œ=J¨̘rǯcjòÙéCU’jÑij¢ÿ‹ë²G?ðúÝh­zkþîPÒ÷ØVt‹ìiB8à`Fµ.ühú`•¤ºT,ûÓ¨Ú;³G?Ë>•¾3”4½º·œ’=J¨̨rûŸÂ!I³Xû’£³G?Ô^oíêô]¡¤éU,=4¢×Î'ÔŒf\ëâO¦XIªSý{¯ÈýP[僷GcÞ¾é{BIÓ«wÛÙã„rÀÁŒ+ÙSÇî“>d%©.Ç¿$ªæ¶ìñµS5ŽbéËÒw„’¦WóÄWD”½ì‘B 9à`V´/ÿôA+IuªýÍd~¨—²­³ÿ!}7(iúõ×_–=Q¨)ÌŠrçC15o¿ôa+Iuê±ïÙfGçªÏ¥ï%M¿ÖÙGfj̳¦óƒéW’êTqÜDõȆìñc¯·î¼ô} ¤4¹w”ý,{¤Pc8˜=ÝvË^ž?x%©FµV¾y×G73£Ü¼.ó÷OßJš~+?›=R¨9̪îßI¼’T·º×/Ìÿ0–ªæöhžàW¥q¨X|PT­G²Ç 5瀃Y×<ëéX’j÷‘o¿º%{üÀx©Êh­~wþþOÒ@ê­ûFöT̾þæ;bjb¯ô!,Iuªù•?è4²Ÿ«ÿ3}ï'i0µÎ}OöH]p¢}ÕçÓ±$Õ­ÎeŸÊÿ0úë/ÆÄœôŸ¤éW,x~T;6fØÅ9:EË|'œ$Íjs¢¿þ²ìFZùðÝ»~᛾ï“4º·.Ï+ð;8HÓ»ÿÚ˜‚¡,IuªXt`T;7e?0’ªbk4OðªÒ¸ÔZõÖˆªÌ-ð;8HÕºø“éƒY’êV댷E”ýì'FK¿­3ÿ>}¿'i0óˆrëgOøpªjíˆÆñ/IÐ’T·º×—ýÀHi_ôñô½ž¤ÁÕûé×³Ç ü¤ëýü{1uÌœô!-Iµjrïè?pSö#¡{ãñù;=I«}áG³Ç ‘ý@ºÎµ“é»:Iƒ«XôGQmÿEöhgÄC©|dc4½(} KRÝê­='û €4½uçEcbNúžNÒ€š»Oô7\Ÿ=ZàsÀÁÐêýò¦˜šÜ;°KRš¿”[îÊ~`Ö•›n‹Æ¼ýòwt’ÓÄœè­]=Z`·8à`¨un>)¸KRÍjžüêˆN#û €YSíx Š%§ïæ$ ®î ‹²G ì6 ½öŸIð’T·Ú~4{üÀ¬¨:SÑüêëÒwr’WûÒÍ-°Gp0üÊ2Zç½?}ÐKRÝêýäÌìfV¿­sÞ•¾‹“4¸Zç¾7¢ìeOØ#8 ÝV4W‘>ð%©VÍ}n”®Í~`fTU´/úDþNÒÀj­|³¯g¤9à`d”ßDqâ+Ò¿$Õ©æI¯Œª½3û €ë\3‘¾“4¸š+Øõ•H0Êp0RÊG6FãË’þHRj}ãŸvý5Œ‹Þš•é{7Iƒ«¹üõQ5·g˜6ŒœþÖû¢±äô‡@’êT÷¦eÙã¢ÏåјÜ;}ç&i05OymTÅÖìÑဃ‘Ôß²>‹^”þ HRmšÜ;únÈÿ0-å¯n‰Æ¼ýò÷m’Rsù¢j<œ=Z``p0²ú›ïˆÆÂ¦? ’T—Š%/ŽêÑ_gØ#å¶û¢X|PúžMÒ`jžþ¦¨šÛ²G ”FZÓí>‰C’f±Öª·Dô»ÙãvK5õPËK߯IL­³ŒèÙ£Î#¯ÿð=ÑøÒKÓ IªK+?“=úà™ëÑ\ñ7é{5Iƒ©õõ÷EôZÙ“f„ÆB¹}CË^žþ`HR]êÝq~ö耧×ïFëœw¥ïÓ$ ¦Îwÿ-¢ìgO˜18å£FqòkÒIªCÅü¢ÜrWöè€'WUѾèãé»4Ihr¯èÞü•ì©3Îc¥,¶Eså[òIªAÍ_Uë‘ìÑO¨sÍDúMÒš¿ô×_–=R`V8à`üô:ÑúöQù‰$Õ ÖYïôqu Þš•é»3IÓ¯8þ(7Ý–=R`Ö8à`Ÿ=ꨉjç¦]Ÿ ›½“´g_úãèßwuö(¡á€ƒZ*wnŽæÙÿ˜þ(IÒ¸Ö»mUö¨`ÌUÅo¢yòkÒwa’ö¬ö7?àk¹áqpP_U½5+bjî¾é”$]Ç>;ú®ÏžôŒ©ªýh4O;<&i·+–½µçdJ8¨½þCwFñÕ×¥?V’4n‹ŒrÛ}Ùc€qÓmF댷¥ï¿$ífs¢}áQ>už‚xL·í«‰©Égç?^’4F5¿ú—QµwfOyÆE¿­ÕïNß{IÚ½š'½*ú¿¼1{‚ÀÐsÀû4ŽæŠ#Ò1I§Z__DUfxF]ÙöùJßwIzæ žÝ—DôÚÙF‚x¼ªŠîíçD㸤?j’4.u¾÷…ìéÀ(«ªh_rtúžKÒ3lâY¿ýº”©ÍÙÓFŠx壛¢õ­Ž©ìN’ƤÞíggvFTçÊϦï·$=³Z_{{”›×e I8àiô7ÞÅŠ¿Mì$iä›»Oô¸){¬0bº?˜›¿Û’ô´5O;<ú÷^‘=2`¤9à€gúµ*ë¾¥‡¦?~’4Ê‹ŠjûýÙS€Ñýá é;-IO]óÔ7Fýe»~ŸLØÝVtn\E¦?†’4ª5OzeTÍíÙ€!×ýÑÉј˜“¾Ï’ôÄ5—¿>úw_âpÈì‰v#:?<1‹_œþ8JÒ(Ö:ãï"zíìiÀê­YéxCÒZ+ßì7`†8à€r”þXJÒ¨Õ¾à#~Àà÷8Þ†°cŸí Šò¡Ÿek8`ÊöTtn>)Še‡å? ’4Bu¯›Ÿ=Â"½ŸæxC¢ûÝW÷ºQM=”= pÀ •eôî¾4š_{Gúƒ*I#ÑÄœè­]=½½ÛΈÆÄ³òwVRÝ›»O´Ïÿ`ôï»Ú§(Ã,sÀ3¤¿ñÖh}û¨˜š»oþC+IÃÜÜ}¢ÿ˳Ç6‰|mŠ”ÜÄœh®<"º·œUs{öH€ÚrÀ3¬l=½5+¢¹âˆüÇW’†´bá £üͽÙ#€½Ÿœé“7¤¤š'¿::×å¶û²Gà€fWÿÁŸFûòOGcÉÁé²$ [Íþ,ªÆ–ìQ À,r¼!ÍróöÖÙGF÷æ¯DµccöÇd(Ëèmø¯ÿ=æ8$ÿ±–¤!©yÚáQu¦²§4³ wûYŽ7¤Y¨XvX´/9:z?ûVTíÙÿô§à€²•ýèÝ]´¿ûïQ,{yú#.IÙµV¿;¢ìeOgfã i†šÜ;š§¾1:—:zëÎó)0bpÀéo½/:·,æ¹ïƼýózIJ¨}Ñ'"ª*{$0zkÏq¼! êXãäWGû‚G÷ú…Ñ¿ÿZŸp #Î ³^'z¿¸!:×/Œæê÷Dcá ó¤YªsÍDö`ÀzkWGcr¯ôÝ“4J‹ŠæéoŠöùŠÎ÷¾½Ÿžåƒk#úìÒÀ€9à€QRUÑßrwt׬ŠÖÅÿÅéù¤ÿà I3UïǧgO^¤¿þÒ(ÅÂHõlÉÁQ,;lWÍ坿©­3ÞíóÞíKŽŽÎ÷¿Ý›¾¼ë+†ú÷\å–;#ºEö?]`9à€QWUQn»?zw]ëDë‚üö°cñ‹Óñ*IÓnr¯]ÿ±ˆ1÷?u·ºßñ IEND®B`‚‰PNG  IHDR ¬KæŒ pHYsèèµ{Rk IDATxœìÝO¬ågAÇáRP•HA`aBPbpa aÁŽº0*bL ìÝÀ†©3´Ni,”–ˆ¨‘T–¦XËÆPþ$%´T d )Z )R¤i9çž{î=ç¾f®ÆÚμ÷~æy’ï~缿äý}î™Kpì]2û<}@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ € @@€ €Ž»ÝÍ·ÿaìÝ÷çc÷Sï«[~w,ÿì5cqúбx×%fÙòªËÇæ›wÍ>q¸ˆlðÏcyí˦ߙ™ÙyØé¾S\}üM‡ï÷¾ü‡ïϾ{äx#O<:öøÛ±þÜɱºù·Çò½¯‹—Î? Ìì¼nyÍ‹Æö;_™}pÚ>öcùž—L¿#33³ ´—Žåû~q¬nþÃw’û߸}lŸxtö㈧@p„mÿõ_ÆÞ™›ÆêïÞ6–7¼rþÞÌ.ø–×¾tl¿wÿì》=¸ö¥ÓïÊÌÌlâÞ󒱺åc}Ïõcóè—ÇØnf?žø GÈæ±ë{Þ?vþú cqÕåó¿Èf6u;ïÿåqðø#³&Ûï?pøK•³ïÌÌÌìˆìªŸ;ùõ±¾÷ƱùÁC³SüÀLëåØèÓ‡ÿ¯†¿ð7³ßο2žüÎìS þÓÙ_ª\ž¾búÝ™™™Á]÷òÃ_5ß»ÿÖ±]=1û‘uQ\`ÛÝ'ÇÞ×o;ó›cqòùó¿Œfvä¶úË׃Õã³+øo¶ß=3–§_8ýÍÌÌŽðN]6Vû­±wÿÇÇX/f?º.:€ aogì?øÉ±ºíÍcqê§çéÌìÈnõá׃õfŸZð‰ÌÌìœwê²±ó‘ß{gnc×û Apí?ò…±úÄ[¼ô7³sÚî­¿7Æf=ûè€ÿÓöÑûÆòªË§ß©™™Ù1Ú»f¬nëØ|ûÞÙ±4À3l»|l¬ï~ßXÞðÊù_"3;6Û½ãícl7³08g›G¾0ïöpfföÔ·üÀ«ÆúÞÇv燳g9€gÈþ7??V·þþXœ|Þô/Œ™¯­ÿþÇ88˜}ŒÀS¶yø³cqòùÓïØÌÌì˜îÔecuیͷ¾8û‘–!x:¶›±ÿà'ÇòC¯ÿå0³c¹õïœ}’ÀÓ²yèNgffO{Ë?ýµ±wæ¦16û³mÇšàÿa»û䨻ïCcyý/Mÿ"˜Ùñ—ÿTl¾qûX\ùœéwnffØu/ë{®c½˜ýx;–OÁÙÿƒb÷3ï‹«_0ÿƒofÇw'ž5öî¾nö‘Ϩý¯}t,N\:ÿþÍÌÌ;}ÅXßuõágsîçàì‡jýùk¼ø7³gæåÿo˜}¬Ày±ÿÕÞM¿‡33³ÎþøçßÕŽõröcîXüo֋ß—X\óâùl3;þ»òÙcÿ«5ûd€ójïÞçßÅ™™YóΆ{;³uGšà²Ý{_úàX\óóó?ÈfÖØ•Ïû_ÿØìÓ .ˆ½»®ž'gffÍýÉ/Œ½3c»ý¸;’ÿÅþßËüêü®™uöGÏû|böñÔúÎwÌ¿›33³ì–|õØäîÙ»#Gð¶k¬n{óôª™Åvòycóà³8¸ðÆîoŸGgffÝxÖXÝòÆÃw½ü;Àz1vï|çáKºéP3kíÔOÍß}ÊÿÆÞ}Ç[v—…þß3©ª "¢ÈõÊ•+Š(*6¼ˆÊÕ‹¢ˆ•kA~zðw™3-mRI#É„TRH!…„4’@:é•4Òˤ’6³Ö®k¯ç¾æ ‘–dÊ9ûÙ{¯÷ûõúü)îSf­'ßõœ½<Ã*ºÇüaþY$iª+·{aôÎ_1èEÓ5z`pçyQ~濤ÿBJšÖ‡ÿçf_æ _ÕÎç;ÿÌN’4õ•{¿)ª{/&käÀ°ýxtNú›Ù·„Èþ%”4…yø߭ߎÎç~9ÿìN’4ý-Þ4º_þÇöÖD5n`pÓ—¢ØùÕù¿x’¦÷áÿ_;ÔÀØ©;OF{¿ŸÉ?Ó$5£Ý~<·}%š¦1 ÃâÑèýü_4IS[¹üQÝ}AöåÆV½æ¡hûh^IÒ¨šYÝSþ>¢_FS4b`pûÙþê_Òþ_˜}¹€±W?qw”»üHú™ž$©9•{½!ª®&˜î€A/ºç,‰bfaú/•¤)nùVQÝùµì+LŒáÃ7F¹ÃåŸíI’šÓÒ-¢wþNÃ*¦ÙÔ.Tk‡‡}ß’ÿ‹$iª+·{aT÷\”}É€‰3¼÷’(–=?ýŒO’Ô¬Ú‡½'†«Œi5• ý뎞ý‹Üì_I øËÿ»Î˾äÀĪnùr‹7Í?ë“$5«¯Šêž‹cM×@ÕŒbfAþ/¤©®ÜîE1¼÷ëÙW=˜xƒkt®/I}‹7ýöGL™©Y®y(Ú¿3ÿEÒÔçá?Ì­þ…»¤ŸûI’šYç„¿ˆtbZLÅ@uï×£Øy›ô_IÓ_¹üSû–0©wÆÿI?ÿ“$5³r¿Ÿá÷Ä4˜ø€þ ÇG±ìyé¿’вçGuçW³/{0ê:º'þEþ9 $©™í´uT÷_“n¢zçíàs$¦¥[FuûÙÙ—=˜nU?:‡¿7ÿ(IjlÝ/ÿcİŠI3Q Ã5E¹ÏKÿaKjH‹7Á7ŽÏ¾ô@# »-Ê~8ÿœP’ÔØ:Ç8¢Ä$™˜€áê¢Üûé?dI iñ&1¸öÈìK4ÚðþË£X¾Uþy¡$©±u¾ðƒ^LЉX>~W”»ÿDúWRCšYƒ+̾ôQÝòåÙwëL?7”$5¶öç;¢ßŽI0ö Õ#7G±ó6é?TI ifAô/Û/ûÒ|‡µ°“~v(IjtíƒÞÃîêwc½P=x};½"ý‡)©Aÿ/Ý'ûÒü½¯ü[þ¢$)š¾Ý51ÎÆv zôÖ(V¼2ý‡(©9õ/X‘}éžI]G÷„¤Ÿ#J’š]ûà_ëË€áwG±ë¦ÿð$5§ÞٟξôÏ¥êGç°w§Ÿ'J’š]ûÈ÷ÏÞ“ÆÑØ-ÔOÝÅn?žþC“Ôœz§~,ûÒ¬£ºód´÷ySú¹¢$©ÙuŽû“ˆaãf¬†kŽr¯mÓX’šS÷‹ލ‡Ù—?`=ÿ˜°Üe›ôóEIR³ë~éïbÜŒÍÀ°ód”ûü·ô’¤æÔýÂÿËÍ,๠ï¿<ŠeÏO?g”$5»î931NÆc`Ћö¡ïJÿáHjNC3bÐ;ú¡ºåËQ,Þ$ý¼Q’ÔàfDÿêÃb\ŒÅ@÷K›ÿƒ‘Ô˜Ú+!¢Wd_ú€9пh·ô3GIRÃ[²Y n?'ÆAú@ïkÛçÿ@$5¦ö¾?uûñìK0‡z§~,ýìQ’ÔìÊ~(ªGniö@ÿúc£˜Y˜þÃÔŒÚ{þdÔkʼìóaXEçÈ÷§ŸAJ’š]¹ûëb¸æáf.T÷~=Š¥[¦ÿ$5ç‚[¯^•uÉæYÝ]=û Ùg‘’¤f×>èU¿Y ÃÕF±ó6éß|IͨÜùÕQ?~gÆå¡ú©û¢ÜÅóIR+µî™ŸhÐ@ÕŸÝzÈþ¦KjFåö/Žá׌üRä>puË·J?›”$5¸™Ñ¿áøf,tOû§üo¸¤f´ìyQÝ}Á¨/s@²Á'D1³0ÿŒR’ÔØÊí^ÕÃ7M÷@ÿº£Ó¿Ñ’ÒâMf‡| ™ú_[žN)Ijtí}ÞÑ+¦s zøFo¹#i4Í,ˆÁU‡ŒêòŒ£ºŽîqÊ?¯”$5ºÎ‰9… ýN”û¾%ý›+©õ/Øy$—6`Ì :Ñ^ùöô3KIR³ë_ìt-tÏø—ôoª¤:õƒÚ IDATfÔ;õc£¸¬¢^ó`”»þhúÙ¥$©¹•;¾<†O­šŽ€Á_‹bfaú7UÒô×=þO"êá|_Ö€ 3|àš(—¿ ý S’ÔÜÚ‡¾+b8œì€aùX»¼&ý›)iúëñ?"ªþ|^Ò€ VÝt’?X”$Ef½K?;Ù £~?ý›(iúkø‹ýr>/gÀ蟿Súy¦$©Á-ß*ªGoÌ€þõÇä%M}í½ßuû±ùº”S¦{܇ÒÏ5%IÍ­sÐ;çõ£æe`X~+Š^‘þÍ“4Ý•;¿:ê'ï™Ë0­hïÿséç›’¤æÖ¿êÐÉZè|ñ#éß4IÓ]¹Ý‹bøàµóq ¦\½zÕìeŸsJ’šY¹ãËb¸æáÉXÜqn3 Ò¿i’¦¸%›EuûWæúò4ÈðÞK¢XºEþy§$©‘uOøó XèQîþºôo–¤)nfA ®9|N/]@3 ®>,ÿÌS’ÔÜg^·Ÿ=Þ Ý³>•ÿ’4Õõ/X1——- áz§þCú¹§$©™µ÷Ú6¢êçÀð±Û½Uޤy­û¥ÿ=W—,€o¢s竮J’šYïëûŒç@ûÈßMÿæHšÞ:G¼/bXÍÕ% àiuû±hïñéç ’¤æUîøò¶Ÿ¯€Áíç¤c$MoíÞÑ+æârð ¼.Šå[¥Ÿ‡J’šWï¬OŽÑÀpå>oNÿ¦HšÎÚ{þdÔå£srÁx6ƒŽbfAú¹¨$©a-Ù<ªoÝ6 ýËöËÿ†HšÊÊ[Gýøsr±X½3ÿ5ýlT’Ô¼ºÇ~p zE;mþÍ4…-ß*†÷_1':€u6DçßÈ?#•$5«™Q=pmî@ïüùßIÓ×̨n:i£/p¢n?åî?žV*IjTÝ/üAÞÀ°»:Š8ý› iúê_¼ÇF_Ü6Æðk¢XöüôóRIRÃÞàÁërz_]–ÿ 4uuOú뺨Ì•ÁµG¤Ÿ™J’šU÷ØŽ~`Ø~<Ší_’þÅKš®:‡ýÖìçkŒ‹Þ)—~v*IjØGe?xýhºg:ÿ —4Uµ÷ysÔݧ6øb0/ª^´üÅô3TIò=hNÝã>4€îš(¶iú-iz*W¼2ê'îÞà À|ª×<å.Û¤Ÿ¥J’ÒâMc¸ÏÎÖ{ wñgò¿`IÓÓ²çÇðþË7è0*ÕÝF±d³ü3UIR#êõ©, Qìöãé_¬¤)ifa nx]ËžŸ~Ö*IšþªÛÏžŸ€Î1Lÿâ$M~åº|tCfj€±1¸î¨ôóVIÒô×=öæ~`X<ÅÒ-Ó¿8I“]¹Ý‹bøð76tž+Ý“ÿ&ýÜU’4å-Ý2†åcs»Ð»h·ü/LÒd·x“¨n=mcfi€ñ2èF{¿·æŸ¿J’¦ºÁåûÏí@¹×¶é_”¤É®ÿõ½7fŒKõwG¹ãËÒÏ`%IÓ[{åÛçn`p×é_¤É®{òG7v†[Õ-§F1³ ý,V’ÔšÚ†Ü<7 ã?œþÅHšÜ:ÿjDÕŸ‹`lõÎúdúy¬$©5µõ¾òos°Ð+¢X¶Uú#i2+wû±¨‹Gæh|cÃAt|Gú¹¬$©5µÏÝ6z ý±é_ˆ¤É¬Üî…1|膹Æ^ýÔ}QîøòôóYIRk*>xíÆ-tŽþ@ú!i›YÕͧÌåÜ 0ª[O‹bfAþ9­$)¦­Þ¹K6|`Ø]Ų祒&¯þE»ÍõÌ 01zg~"ýœV’ÔšºÚû¼yÃúוþHš¼º'|d®ge€ÉRõ£½òÒÏk%I­©køè­¶Ð>âwÒ_¼¤ÉªýÙÿÑoÏǸ 0Qê'ïrÇ—§ŸÛJ’ZSUÿ‚7` WD±tËô/ir*WlõS÷ÍÓ¨ 0yª[NbfAúù­$©55uú•õ_Ü|jú —4A-Ù,ª»Î›¯`bõÎü×ü3\IRLMK6ŸýƒþõZèžò÷ù/\ÒÄÔ¿tßùœ&WÕöÊ·§ŸãJ’ZSSuÛ™ë·Pîþºô-i2ê~ñÏæs4˜xõ“÷D¹ÃKÓÏs%I­©¨wæ'Ö} zä–ô,i2jï÷3ýö|ÏÆopÃqégº’¤Öô<£[×€ÞÅŸIÁ’Æ¿rÅÖQ?uß|ÏÄS£{â_¦ŸíJ’Z“ß̨ËG×m }Ø{ò_°¤ñnÉæQÝ}á(æa€éÑ+¢½×OåŸñJ’bÒÜxÂ:, Ql÷¢ô+i¼\¾ÿˆ¦a€é2|èú(–n™~Î+IjMt½³>ùÜ Õª«Ó_¨¤ñ®{ÂGF5L¥þ%{¦ŸõJ’Z]çà_{î€Þ¥û¦¿PIã[{åÛ#ÝQÍÀÓ©®£sÄûÒÏ|%I­‰­Üî…õðÙ:ÇþQú •4ž•;¾,ê'îå 0µêòÑ(w~uúÙ¯$©5± ¹éÙŠ]^“þ"%a3 £ºí¬QξS¯ºë¼(o’,IŠIlpÍáϼ0|òÞô(i<럷èç^€Fè}åßÒÏ€%I­‰¬wêÇžy`ðÒ_ ¤ñ«säûg? €yPõ¢½ß[ÓÏ‚%I­‰«ó¹_~æ€î9KÒ_ ¤ñªÜíÇ¢n?6êq Q†Ýåò¤Ÿ K’ZU¹Ó+žy }Ô勵@IcÔÒ-c¸êªQϹԿl¿üsaIRLZßûǼO/”»¿.ýÅIŸW’1ã4ÖÚdÍ>–$µ&ªá½_ÿ Ý5QÌ,Lq’Æ£î—þ6i¼h®ºx$ʯL?#–$µ&¦ÁÕ‡}ÿ@uÏÅé/LÒxÔÞÿç"ݬù ÑªÛÎŒbfAúY±$©5õ¾òÿÿ@ÿò•é/LR~åŽ/‹ú‰»³æZ"¢wê?¤ŸK’ZQ÷è|ÿ@÷ÌO¤¿0IÉÍ,œÝ, Y¿í½ßn,IŠq¯½ÿÏ~ÿ@ç þÂ$åÖ;g&k”à{ ¸&Š%›§ŸK’Zc]¹ó«¿ Üï­é/LR^ƒÞ1¬²æX~€þù;¥ŸK’ZãÝâM¾ë9ßì@±Ãå¿0I)•;½"êÕ«2gX~z8û\ÙçÈ’¤ÖXW¯~àé[GkØy*ýIJjfaT·•:¿ðÌêÇïŒr»æŸ'K’b\®ºòéûF«zðºô$)§Þ¹‹SWžÛàòÒÏ“%I­±­ºù”§ï­Áͧ¤¿ I£¯sð¯~×ç0¦ê::‡¿7ý\Y’ÔËWøô-£Õ¿ò ô$i´•;½"êÕ«RçUÖÝÚÏw.w|Yúù²$©5võ/ÚíéûE«wþŠô$i„Í,Œê¶³RUÖ_uã‰ùgÌ’¤·ú_]úô½¢Õ=óé/HÒèê»8u@`ÃuûPú9³$©5VõÎüÄÓ÷‰VçÄ¿LA’FSç wF «ÔဠWwžˆr×פŸ7K’ZcS÷Kûô}¢Õ>òýé/HÒüWîôЍW¯JLØxÕígG1³ ýÜY’Ô‹ºÇÿéÓ÷ˆVûÀ_JA’æ¹™…QÝvVê@ ÀÜé~éçŸ=K’bêõ{OßZåÞoLA’F÷¹L¾º»:ÊÝ~,ýüY’ÔJ¯sØ»Ÿ¾?´ÊÝ"ýIš¿Úû½5¢ê¥¢Ì½êίú(IR|×@±ËkÒ_¤ù©\þ‚>zkê ÀüéòwégÑ’¤VjÃ~ëéûB«Øéé/HÒü4¸öˆÔÁ€yÖ+¢½‡w{–¤&×9ü=OßZÅö/IA’æ¾îÿ,uæ`4|€$5»Îáï}úžÐ*–o•þ‚$Ímk·=ëîS©'£Ó;õÒϦ%I­”:Ÿÿí§ï­bñ¦é/HÒ¶d³Þwiê  ÀˆõËhïñúü3jIRä.ŒÁ ’4wõ/Ü%uÆ Gu×yQÌ,L?§–$µFZçˆÿñô½À€4Eu{wD=L0ÈÓûò?¦ŸUK’Z#Í€4…•+¶Žz̓©ƒ%ÉzE”»¿.ýÌZ’ÔY¤ikfATß<#u¦`tCK6O?ó–$µæ, Ò„ÕÞûƒNêPÀtèýéôsoIRkβ MR‹7áý—§ƒL‘A7Ú{ýTþù·$)æ" ÒÕ;wIêÀô©î:/Š™égà’¤ÖFg@šÚŸ}KDÕO˜NÝ>’~.Ijmt¤Ihé1|èúÔá€éU—ߊr§W䟇K’bc² M@ý V¤~L¿Á5ŸO?—$µ6* Ò˜×^ùöˆa•:ôÐ Cß•~..Ijmp¤qné–1|øÆÔa€æ¨Ÿ¸+Šå[åŸK’bC² qýKöLôhžþyÛ§ŸK’Z”iLëøŽˆz˜:äÐ@U/Ú{m›~N.Ij­w¤qlùV1|ì¶Ôù€æªî:?Š™ùçå’¤XŸ,HcØàŠ•©ƒtÿÓôórIRk½² YCßQשCÔkŠr‡—¦Ÿ›K’ZëœiœZ¾UÔß‘:ÐÀè_¶_þÙ¹$)Ö5 ÒÕ¿tßÔA¾K=ŒöÊ_H??—$µÖ) Ò˜´v€Z;HÀ8>x]‹7M?G—$µž3 Ò8´t‹>rSêϤwÚÇóÏÒ%Iñ\YÆ þ…»¤nðlêîê(wÙ&ý<]’ÔzÖ,Hɵ÷ÿÙˆá up€ç2¸áØô3uIRëY³ e¶xÓ>puêÀëªsØo埭K’♲ %ÖÿêÒÔA ÖÇðá£X²Yúùº$©õ³ %ÕÞkÛˆA7uP€õÕ;ã_ÒÏØ%I­˜)£Å›ÄðþËS4Øuwu”;¿:ÿ¬]’ß›)¡ÞYŸLÎ`c ®=2ý¬]’Ôú¾,H#®½Çë#úíÔÁ 6J]Gç _I?s—$µ¾+ Ò(›YÕíg§Îd0†#Š%›åŸ½K’â?² °îI:ŒÀ\êöñô³wIRëé,H#ª\ñʨۧb0—êîSQîüªô3xIRk6 Òˆ|ãøÔ! æÃàªCÒÏà%I­Ù,H#¨säûS‡/˜7uí•oO?‹—$µ,Hó]¹Ý‹¢~ê¾ÔÙ æÓpÕUQÌ,L?“—¤¦×± ÍoýËöKº`º'üyú™¼$5½ŽiþZû–GQS.…zÍCQnÿâô³yIjr Ò<µt‹>|cê°£Ô¿`Eþù¼$5¸Ži~êmyê#Wõ¢½çO¦ŸÑKRÑÐ,HóP{¯ŸŠtSg,ÈPÝtrú9½$ Í€4×Í,Œêž‹R‡+ÈÔ9ü=ùçõ’´¨yYæ¸Þ©Kª Ûðá£X¼iú™½$ Ë€4‡•+¶ŽºóDêPã wÚÇÓÏí%©hX¤9lpí‘©ÃŒ‹ºýx”;¾<ýì^’Še@š£:ÿjD]§S0Nú—}6ýü^’Še@š‹–l>ûyFÀwVÑÞçMùçø’´¨Yæ ÞWþ-u~€qUÝzZú9¾$ É€´‘•»¾&êÞšÔá ÆYç°ßJ?Ï—¤¢Y6²ê¦“R‡&wk?F·X¼iú™¾$Sži#Z»±<·îÉM?×—¤bʳ mhËžõãw¤K0)êâá(·{Qþù¾$-šÞ,HXÿkËS%˜4ýóvH?ß—¤bг m@í=^1è¤I0q(w{mú9¿$Sšiªn==u>€I5¸öÈôs~I*¦4 ÒzÖ=æS#˜huíÞ–~Þ/IÅf@ZŸ–=/ê'îN‹`ÒUw_˜æ/I‹¦/ ÒzÔ;wIê@Ó¢sÔ寧ûKR1eYÖ±r—‰è©ÃL‹á£·D±d³ôóI*¦( Ò:6¸þ˜ÔA¦M÷K›~þ/IÅe@Z‡ÚþbD]§A0mêâá(·{aúsI*¦$ Òs5³0†÷_‘:À´ê»$ÿY€$-šŽ,HÏQ÷ä¦>0ÍêÞš(W¼2ýy€$SéY*·{QÔkL|`Úõ/Û/ý™€$SéYê_¼GêÀ0D{¯mÓŸ HR1áYž¡ö^?QõSçhŠÁ'¤?¤b³ =CÕ­§§:Ð4ß‘þ|@’Š Î€ôÿ0€Ñ¨î¹(ý$œé{[²Y ½5uÀ€¦êù;ùÏ $iÑdf@úžz§}tC3 ÓŸHR1Y¾£r»F]<œ:Ø@Óu¿øáôg’TL`¤ï¨ÁŠÔˆ¨Ÿ¸+Š¥[¤?7¤b² ý{å.ÛDôËÔø¶Þ©Kv IÅ„e@ú÷מ:Èÿ©.™ýèÞìç’TLP¤E­hïûÓõ0u¾[ïìO§?C¤b‚² -jEuûWRàûÕ'£ÜñeéÏ$ß’5¾ÎáïI^€gÖ¿`çôg ’TLHÔìfÆð«SàY :Qîúšüg ’´hü³ F×=ñ/Sg๠®X™þLA’Š È€šÛ²çGýÔ}© °ª~´÷x}þ³IZ4ÞYPcëýéÔYXwƒkO¶ IŘg@¬Ü釣î>•:¨ëaXE{¯mÓŸ1HR1ÆYP#ë_ü™ÔXƒŽMÆ IÅg@«Üe›ˆ~;u@6@]Gû³oIÖ IŘf@kpåçRg`ÃU7œþ¬A’Š1Í€Uû3ÿ%b8HL€Ó>àçÓŸ9HR1†YP£\ÿ…ÔØxÕ7ÏHæ IÅf@©½Ï›#êaê@ÌÎA¿’þìA’Š1Ë€Suó)©ƒ0wª»/Hö IŘe@¨}ÀÛ"ê:uæVç_O!IÅe@¨ºãÜÔ˜{Õ=§?ƒ¤bŒ² ©¯sèo¦Àüéöîôg’TŒI4õ ïýzêàÌŸá½—¤?‹¤bL² ©®sÔï¥Àüëú®ôg’TŒA4½Í,Œáƒ×¦Àüó.’Ԛ̀¦¶î±”:l£Ó9ô7ÓŸMHR‘œMg3 bøÐõ©ƒ0:Õ=ç?Ÿ¤E¹YÐTÖ=æS‡ `ô:‡üFú3 I*³ éüëÿ¯M0€Ñó.’š^Ç€¦­îÑH.€üÔA˜Ç®Ÿ}þþ D’Í]4uoêLŸµʲŸHR1‡YÐDTÝvVê$è·£^½*†ßúf W]Õ]çEõÍ3bpÃq1¸êàè_ºoô/X1[ïìÿ½³>½³>Ý“?º^õÎü×ÿ¿ýTôÏßéÛÿ›—™ýÿµö¿Gª{.ŠáWGýøQ—ߊ¨ëìï0ª»/H"IÅf@c_{ï7:\€I7¬¢^ó` ¼.ªÛÎŒÁ5ŸþE»Gî #ßÏýr´÷yS”;¿:ŠeÏKÿo‘çªÜᇢ½Çë£}ÀÛ¢sø{¢{üŸDïôŽþE»ÅàÚ#¢ºãœ>|cÔíDz¿ûÀ³èøŽôÿ¾¤b޲ ±opÅ©7~à9T½¨¿sö/gÖ>øžý‹üS?6ûP¿½ßÏD¹bë(f¦ÿ·EjK·Œöžÿ5:‡½;º'ÿMô¿¶ÝìDu÷…Q?u_öO­ºù”üÿf¤Es“uåŽ/Ÿ}ÛO W½æ¡Þ{I ®;jöáu÷Ä¿ˆÎAïŒr××x¸?-ß*ÚŸ}Ktù_Ñ;ûÓ1¸æðÞwiÔݧ²ô0ýêzö݈Óÿ»@’m|4ÖõÎY”zÏ€FtgߢíçÞÏ>ä?îCÑÞï­Q.Aú4¹r·×Fçó¿½³>9û®ÃUWÍþ¬€¹3¸êàôÙ_’Š9ȀƷ%›G½úÔ>Líƒþ®ž}»þµ•×>\.w¿äŸ¤–löíw 8鯢Ù~1¼ï2K°1Ý(w~ÁÝà IDATUþ¬/I‹6. Ûº_ü³Ô{=Lƒú‰»£ºé¤oÿEÿ1ÿ+Ú{mÅâMÓç}Í×RÀÞ©ÿƒkŒúñ;³ý`¢ôÏß1®—¤E—mkÿ" XGuÃÇn‹Á ÇFï¬OEçÐwE¹ãËÒçzå¶ö/˜ºG úíÃUWF «ìßT[uûq&)&= Ë:½3õ&ãníÇeU7ž½3ÿ5:ÿj”Û¿8}Ž×øWnÿ’èùþè_ü™>xmD=ÌþU€±Ò;íãés»$‘eÕM'§Þà`¬TýÞwiô/Ù3ºÇýq”»½6}f×t´ö]"Ö~4ÄàªC¢^½*û7Ò­ý(-›&©˜à,hìjïñþ €F«»«£ºõ´èõÉèøŽ(–n™>§«Í,ˆö¾?=û{WÝùÕÙÅh¢î±ÌŸÏ%iцe@cWÿÒ}Roì0r½"ªÛÏŽÞ¹K¢sèoF±dóô¹\*–o#Þƒkºódö¿™áýWäÏã’´hò ±ªÜî…QwŸJ½±À¼ë—QÝzzôÎü×hïÿsQ,Þ$}—žµ¥[Dçð÷Äàòý£^óPö¿ ˜wƒÞ™?‡KÒ¢õπƪީÿzC€ùR?~G ®X9ûÕÞÒ_ÝÌÂÙ¦è_²gÔkÌþ§ó¢ºåÔüÙ[’­4V º!õ†s¥.‰ÁuGE÷„D¹ó«Ògmi^Z¼it{w ®:ØÇ0]ê:Ú{m›?sKÒ¢õˀƦÎA¿’z/€µv¡µÞÑ>àçgÿJ:{Æ–FÚ²çE÷Ø?ŠêÖÓ"†Uö?GØhƒ+?—?gKÒ¢õˀƦÁõǤÞÈ`½ QÝqnôNÿ§(w]úL-KåŠWFïŒÿÇ®ÏþW ®ßŽr§NŸ¯%©X,h,Zû–¨QõSïã°NzE n86ºÇ}(Ê^š>KKãÞÚwÄ\yÐ쿘4½s¥ÏÔ’T¬G4õÎ]œz€gÕoGuó)Ñý⇣\þ‚ôùYšÄÊí^Ý“?ÃUWfÿ‹€uVG±t‹ôyZ’ŠuÌ€ò[¼iÔOÝ—z€ïã¡¿4oµ÷{k ®X9ûï ÆÝÚÿ.Ìž¡%©XÇ,(½îÑH½qÀÓ|ãøèýûQ,{^ú¬,M{劭gß®^ý@ö¿~xFÃUW¥ÏÎ’T¬c”^uÇ9©7n®®£ºûÂÙ·&/·Iú|,5²%›E÷¸?ž=X€qÔ9èWòçfIZôÜYPjí½~jöÀF­~âîè_°"Ú{¼>}.–ôŸu|ÇìÇoøoEÆIuÓIé³²$ë¥Ö¿d¯Ô6ÍRwŸŠÁåD{åÛÓgaIÏ^{Ÿ7ÇàšÃ#ª~ö¥"†U”»¿.}N–¤â9² ¼–=?êöã©÷kša¸êÊo¿ÅÿòäÏÁ’Ö«r×þ%{F :Ù—ní\š=KRñYPZÝ“þ:õF Àt«ËoEÿâÏD{ï7¤Ï¾’6¾r—‰þ×÷Žè·³//4TÝ]åö/NŸ%©x–,(­á}—¦Þ¨˜NÕ]çE÷Ø?Šbéé3¯¤¹¯\ñÊè_¼‡ERôNÿçô™X’ŠgÉ€Rjïó¦Ô4S¦_ÆàÊÏE{ߟNŸu%¦r—mbpùþU?û @ƒÔßÅâMÒçaI*ž! Jiöó`#Õ«WEïÜ%QîøòôWRNån¯Á+#†Uö% €†èõ»és°$Ͼ¥[Ì~+l¨êŽs¾}àâ¯.$ý{í½ßÕͧd_žhÈ“fÏ¿’TÓJßÚ+!ª{.ξb0åÚû¼9}ö•¤âd@#¯ºýìÔ›2“¥î®žý©r×MŸe%MH3 ¢{ÌFýøÙ—0¦Tÿ²ýòç^IZôýYÐH+wÿñˆz˜zS`2ÔOݽ³>åö/NŸc%MhK·ŒÞ93ývö% €)S÷ÖD¹ýKòg^IZôÝYÐHëmyê €ñ7üÖ7£{â_D±dóôùUÒô,£W7)ûòÀ”éþOé³®$ß“®™…Q?yOêÍ€ñµö­º»'4ŠÅ›æÏ®’¦²Î!¿ÃGnξÜ0%†Ý>ûì#{Ε¤â;² ”_6øÇ¿Ý/~8ŠÅ›¤Ï¬’Ð’Í£wÚÇ#zEöå€)Ðùüoçϸ’´è?³ ‘UÝxbêM€ñ2|àêèýûQÌ,HŸU%5¯r÷×Eu˩ٗB&\õÍ3Òg[I*¾# I劭#ª~êM€ñ°öí·»Çü¡ÿ’Æ¢Îï›ýØ uí=ÿkú\+IÅ¿g@#©wæ'Rï¿ä«Ÿ¸+º'|Ä[ýK¿–=/úî1¬²/•L þ%{åÏ´’´èÛYÐH>tCêÍ€–•¤E4‚ú—ì™zÓ`Ćƒ\±2Ê^‘>‹JÒ†æÝXkgÇbfAú+I š×oõšSoºŒNuûÙÑÞçMùs¨$ÍÕ»\°Â»°N:ŸûåüVRãëXШ~Á˜^ÇoŒÎáïMŸ?%i>j¯|»wà9 ®;:}v•¤ŽÍgƒëI½Ù0¿Ö¾ÛS÷Ä¿ˆbfaúì)IóÚ²çEÿ¢Ý"êaö¥€qUõ¢\±uþì*©Ñu,h¾*·{QD¿z¯`ž Ñ¿dÏ(·qúÜ)I£¬sȯG½úì«0cªwöÿMŸY%5»ŽÍWÝ“þ:õ& Àü¨î:/Úû¼9}Þ”¤¬Ê^Õ7ÏȾ0†ê'ï‰bñ&é3«¤æf@óVu×ù©7YæÖÚ¿xí~ñÃQÌ,HŸ5%)½™Ñ;íãU?ûò À˜éñ¾üyUR45 š—ÊÝ~,¢®So°ÌáÛý_¸K”Ë_>gJÒ¸Õ9ð³åÿ¡ºõ´ô9URs³ y©w΢ԛ+scøÀ5ÑÞÿgÓçKIçÊí_ƒëɾd0.ê:Ú{¼>}N•Ôjd4/ ¹9õÞ ÀFê—Ñ;ëS>·P’Ö£µ“²öú ý V¤Ï§’ZÌ€æ¼ö?ŸzS`ãT·žån¯MŸ+%ikö-1|ì¶ìK9Éêâ‘(–n‘>ŸJj5. šóú_ß;õ¦ À†©‹‡£{܇ÒçIIšôÊ^Õmgf_ÖHÖ=þOÓgSI­Æe@sŲ̂W¯J½¡°þª[¾åίʟ'%iZZ¼ÉìÛ¾®ýüWš©ºëüü¹TR4- šÓ:‡üzêÍ€õSwžˆîÉMŸ#%iZëûÁˆ~™}¹ I{ï7¦Ï¤’ZÊ€æ´Á+So¤¬»ê›gD¹Ë6é3¤$M{í}:êÇï̾ì ñéó¨¤V£² ¹kñ¦³Ÿ Àx«;Oú«IqåŽ/‹êŽs²oŒX]~+Š¥[¦Ï£’ZÉ€æ¬Îa¿•z`Ý>°ÜõGÓgGIjdK6‹þ¥ûdß ±îñ’?‹JЦd@sÖàªCRo <‹á zç,Šbñ&és£$5½î‰1èfß‘ê®óÒgPI­Æd@sÓ’Í£n?–z૟¸;:¾#f”$=]{å/D]>š}‹`DÚ{¿!}•ÔjD4'uŽüÔ'?Øà†ã¢Üþ%éó¢$éûkïµíì’Ó¯Ñnéó§¤V#² 9ipí©7N¾[Ý[ã3%i*w~U ¸:û¶À<[ûîOÅÒ-ÒçOI­©Ï€6¾¥[FÝ}*õÆ À>rs´÷ySþœ(IZ·–oÕ-_ξ}0ϺÇýqþì))¦= Úèº_øŸ©7LþÓàšÏÏ>HÊž%IëÙâMbpùþÙ·æQuçWóçNI1íYÐF·öseH6èDﴧφ’¤«wÖ§"ê:û®ðÿØ»óx¿êòÐ÷;A­ζõ:œzætPi{Ú¢çöX«µ/jOí±Ú£©m=µÕjj{¬ÚÞìì„y”!BP ‚ŒQ d ˆÑ8ˆ@4 ƒ fÂ÷7¯ßúžWvîõ–[öñÙk­÷çõzÿ¯!Ùëù=ûÙkgí™Ú'¾.|æFjÍ»æŸË¹ß }XJ’$5½áƒ·çöI¿?°[t¿ü—9ýèÇ‹$I’vseë¡ñY/zÞFjÍ»Äëÿ%I’b+6^’[‡>'|.`÷êœù¶\öžˆ~ÌH’$igë·sñãoæþ7OÈÝ þ<·?óKá3&0ÒØ%ƒ›¿úü”$Ijle™û_?*§ÑÙá3!{Fûs¿1þSb’$Išá ‹<ܲ!Ö/ÿõ|eå´p¿ðyi$ì¼±§ç²óhè3U’$©‰mû‰Ðmob ŸØãÚ'¿!—éèG$I’þMåÖ͹ظ2÷VåÎYçÖá„Ïéÿá€ÖYþŽÐ¬$IR>|gnö—ÃgAöžö‰¯Íåã÷F?‚$I’YÙ}<›ÖäþÚŹ{Þ»s먗†Ï‡iØiƒu§†>t%I’šVqçU¹uøóÃç@ö¾m¿3¶|tSô£H’$©Þ :yxÏÚíßì¿ð}¹}ÂkÂç@€´ƒ°sFgçò‰ûCŸÃ’$IMjpÃiã¿‚)| LëØ—çჷG?’$I’jSùÈ]y°~yî­š—;ËÊiáþá3@ÚEØ)ÓÞúP–$IjLe9þ;£ç?f†ÖQ/ÉÃûoŽ~:I’$U®rëæ\l\9þ»sÖÁÞ°äºrÀNéó3¡jI’¤FÔK¹ó¥ÿ>û0³´? òíè§”$IÒŒ­ìnÍŦ5Û_å¿bnnÿªð í%Ø)å#w‡>¼%I’šð“ í¥†Ï}ÌL­Ãž›‹#úq%I’ß ;~Ùÿ֒ܽðý¹½ø?æ4:+|^HA°ÃÚ'¿>ôY.I’T÷†?½eü÷»lû,ܽøC¹½dNN£³Ãg*€TØ!½+>:H’$Õ±þõGä4:+|Ö ÚZG¿,úaôcM’$éÉ•e>°qü›ý½K?šÛ§üfNcû†ÏN©¦°CŠ»¯ $I’jUYæÞåÿ>ãP­c_žËGîŽ~ÂI’¤WnÝœ‹\œ{WÿkîœñÖÜ:ì¹á3@jLÛ¶‡t.ú¡ƒƒ$IR­¾ùéGÃg<ê§uìÿ‘ËGý¤“$I ¨ì=‘‹MkríâÜ]1wû«ügÀ<ÐdLW÷ü÷„’$IµiXäî—ÿ2|¾ ¾ÚŸù¥ñŸ¾“$IÚm y¸eÃöWù¯š—ÛKÌitvøÜÀÈ“8`Ú¶=Ô%I’´‹½Ü=÷¿‡ÏvÔß¶ŸÀ+ÛG?ù$IR+Ë<|ðö<øÞY¹wÙÇrûÔßÊiá~áó #SrÀôŒÎÎeÚ:oH’$U¾A7w¾ôßâg;£}ÊoæÜKÑO@I’4Ã+Ÿ¸?WæÞê±Ü9ëàÜ:â…ás #;ÅÓÒ>õ·C‡I’¤Ê×oçο>×Ð<³ÿhü•½’$IÛ*»[sq÷u¹ÿõ£s÷Ü?Í­c_>¯0²Û8`Zú_;,t ‘$IªtEoü'(¢g:š«{áûÇ_å+I’Öp‡[6ŒÿŠßÞªy¹½ôÀœì>›0²Ç8`Z†÷/tF‘$Iªô7ÿÏ~gø<½«ÿïè§¢$IÚÕ[7o•ÿ•ŸÊeå´è™á3#{•¦Ô:úçý”€$IÒÎ4,r÷¼? ŸçàÿÕ_»8úé(I’vSeçÑ\Üyuî­ë\ëÈ…ÏŒ„sÀ”º—ümè#I’TÙoþŸÿÞðYždtvÜzAôSR’$íh½”‹MkÆùº+ææö’99ΊŸ-È3¦Tl¼$t®‘$Iª\å0w/øás<¥…ûåâîk£Ÿ–’$i¢†ƒ<¼o}|÷”ÜýÊ_çög%§ûÄÏä*pÀäî?~Y(I’¤é×[ù‘ø9&Ñ:ì¹yxÿ÷¢™’$iÛ÷û¾3n>'÷.ÿxî,;(§EÏŸ©,Lª³üBI’¤ªÕ»f4|†€éhó ¹Üº9úÑ)IR£*Ó¹¸í²Ü[=–;Ëß‘[G¼ |&`¤V0©þ7O†$I’ªTÿÛ'…Ïo°#ÚKßèÍ’$í©z)›ÖäþÚŹ»bnn/™“Óè¬ðç?#µæ€I ·|?t>’$IªJƒïÓèìðù vT÷œwå\£¥’$U»a‘‡[6äÁúå¹·jÞöWùíþœ`¤q0é«%I’4uÛ^ߘ<-|~€Õ»ú_£§’$Uªò‘»óà–ssï«ÿ”;§½)§EÏ ž@rÀdº_ù«ÐJ’$© 7ߘ[‡<+|v€]5XÿÅèǪ$I3²²óØöWùý¨Ü9ëàÜ:òÅáÏmHpÀ„7Ÿ:TI’$ÍôÊÇïÍ­c~1|n€Ýblß\Ü}]ôãU’¤ØŠ~n¾!÷×.ÎÝss{ÉœœFgÅ?§`þô8à©ÎÊeÚ:gI’$ÍäÊîã¹}Ò¯ÆÏm°µŽxA>|GôcV’¤½Ó°ÈÃ-ò`ýòÜ[5/w–”ÓÂýŸÇvžR{éCç.I’¤]ÑÏ3Þ>³ÀžÐ>ñu¹ì<ý´•$i·WnÝœ‹+soõØöWù~@øsÒn性Իò“¡ƒ˜$IÒŒ­,swÅ_„Ïk°'u–ÿAÎÃAôSW’¤®l?œ‹~5÷¯]´ý›ýG¾8üù i/pÀS*îº&t8“$Iš©õ¯?2|V€½¡wÅ?G?v%Iš^Eû«üך»+ææö’9ã¿æ6úY )€þ½EÏȹß×$I’fbÅWä´`Ÿøy ö†ÑYypëùÑ_I’žÜ°ØþÍþõËsoÕ¼ÜYvPN ÷‹nÀü™ÁOýš?I’$=©ásë°ç†Ïj°7µyVþôÖèǰ$©Á•[7çbãÊÜ[=¶ýUþ‡þ|€4ƒ9àßéãøÐN’$i&þîÈö ¯ ŸÓ ¶g`Ùy4úq,Ij@e÷ñ\lZ“ûkçîyïέ£^þ€T1øw\öK’$ý›†Eî,GøŒ‘:gÿQÎå0ú©,IªSEû«üך»+ææö’99Îæ@ª8<ɶ‹Ê\–¡sŸ$IÒLª÷Õÿ>£ÀLпîÐèDz$©ª•Ã<Üòý<¸éŒÜ[ùáÜ^z`NcO¶@ª!£ÀŒ0:;·¯Š~›ÀLÔ>éWsî·¢ŸÖ’¤ˆ†ƒ<ܲ!Ö/ÏÝ‹?”ÛK挿!&úÙŒüŒ~¦uôËr.ËÐùQ’$i&Ô]ñá³ÌdÝ/ úq-IÚÓ•Ã<|àãßìï]ú÷¹ý¹ßÈilßðg02)üL÷ü÷†Î“’$I3¡ÁºeásTÁ¶oI’êSùø½¹øÁE¹wÕ¿äÎéoÉ­CŸþ¬Fv˜~fðÝSBLI’¤è†[¾ŸÓ¢g†ÏeP ‡üÜøO†J’ªWÙÝš‹MkríâÜ]17·ŽuüsÈ»ƒ~føàm¡C§$IRhƒnnŸüúð™ ª¤ýÙ_ιߎ~ŠK’&k8ÈÃ-ÆßÜÒ½øC¹½dNN£³ÃŸ!ÀÈá€q­£_:ƒJ’$E×»ô£á3TQ÷’¿‹~ŒK’þMåÖÍypë¹·j^î,;(§EÏV#{Æu/øóСT’$)²âöËs>“@U nþRôã\’Y¹õ¾\l\™{«Çr笃s눆?€‘P7øî)¡ƒª$IRäOÇX’À®iöÜ<|øÎèǺ$Õº²»5w_›û_?*wÏyWnó‹á_ÿ€‘Çã†Þ:¼J’$EÕYþŽðY ê ý¹_ϹèE?Ú%© y¸eC¬_>þ*ÿöÒsþµ™ñ[G¿,t–•$IŠj°îÔðY ê¤wù?F?Þ%©²o&•ÿ•ŸÊeå´èá_Ó€‘Jr@îžÿÞÐáV’$)¢òÑåÖ¡ÏŸÅ VFgåbã%ÑyIšÑ•OÜ¿ý›ý×ÌÏ3ß–[‡ÿõÈuá€ÜÿÎÒÐW’$i¯W–ã‹¶è9 ê¨uÄ s¹õ¾è§½$͈Ê޹ش&÷×.ÎÝss{Éœð¯ÓÀH­9 ï¿9t–$IÚÛõ¿µ$|€:Ûvh·íàN’Õp‡[6äÁúå¹·j^n/=0§û„MFÅ@õ}NÎÃ"t.–$IÚ›•Ü•Ó!?>‡@Ýyã ¤º7|øŽ<¸ùK¹·êr{Ùïä´èá_{:š­sæÛC‡dI’¤½WÿÀ^²è™yøàmÑ~IÚ-•GsqçÕ¹·z,wÎ:8·Ž|Qü×Y€ùÿž€†ë_»(tp–$IÚ›m{gôüM²íõ×¹èG’´cõR.6­Éýµ‹swÅÜÜ^2'§ÑYá_SÒ48h¸â®kBgiI’¤½UÙzÈOé@€ÞêÑc€$MܰÈÃ-Æ…{«æåβƒrÛ7ük'@ÚIšlÁ>¹ìn ¯%I’öVÝ ß?@-xZÞó­èQ@’Æ+·nÎÅÆ•Û_åÆ[Ç]Iø×I€ù»€kŸü†Ða[’$ioUÜqEøìMÖ>á5ã¯Ô–¤½Y™ÈÅm—mÿfÿòwäÖ/ ÿzö0 Ö»ìc¡¸$IÒ^©èåöâÿ3|ö€¦ë^ü¡è©@R+úy¸ù†Ü_»8wWÌÍí%srþµ íelp˹¡3¹$IÒÞ¨ýás°]qۥѣ¤:4äáý7çÁ §åîÅ“Û'ýÚø¯‰þf V>vOèœ.I’´§+ÿInò¬ð¹ Ø®uôËrÙ~$zDT±Ê­›s±qåöWùŸñÖœù¹ð¯gi†rÐP­c~!th—$IÚuÏOøÜùõ9-xZø×#€T3jø“ï„Îû’$I{²Á §…Ï[ÀäºÿMôÈ iVnÝœ‹+soõØöWù~@ø×€ÔšhlßœÝÐ’$I{¬~;·ŽùÅø™ ˜Üè¬\ÜqEôä i7´íÛ~×ø«üÏ{wnõ’ø¯1ó›É@µ?÷ë¡$I’ödýk†Ï[Àô´Ž{E.»[£ÇI;RÑÏÃ-ò`Ý©¹»bnn/™3~Ðýõ€‘q¨·òáŸ$I’öTeÚ’[‡>;|Þ¦¯·ò#Ñ#„¤I*¹+Ö/ϽUórgÙA9-Ü/üë#rÐ@ƒOýÐ I’´§ê^ü¡ðY ؉_pçÕÑc„¤mßìߺ9WæÞê±Ü9ëàÜ:üùñ_#È;Â@ zkè I’¤=Ñð¡æ´àiá³°ãÚŸù9÷[Ñã„Ô¨ÊΣ¹¸ãÊÜ¿îÐÜ9û¹uÔKÿ0²Ë4Lëgå<,B?\H’$í•sÎ IDAT‰º¾/|Öv^ïÊOER}+úy¸eC¬;5wWÌÍí%srþÝÎ@Ãt>ÿ…~Ö$IÚ ¼=§û„ÏZÀ.Xð´<¼o}ôX!Õ¢ò‘»ò`ýòÜ[5/w–”ÓÂýãÿ÷ Ó»â¡>$I’öDÝóß>g»®}Êoæ\£G ©R•[7çbãÊÜ[=–;gœ[‡??üß2#a4ÌàÖóC?H’$íî¶½ÊÔëK >úßY=^H3¶²»5›ÖäþÚÅã¯òoÿªð³ŒÌ(fÛë¿$I’êT÷Ü? Ÿ±€Ý§uØss¹õ¾èCНèåáO¾“ûßþìø7ûÛ'¾6§ÑYáÿF™Ñ4H눆~f‘$IÚÝ Øè§ÿ †¶ýz©‰¯òÜzAî­š—;ËÊiáþáÿ© ÒYþŽÐ1’$I»»î—?>c{Fqۥѣ†´ÇÚö–‹bãÊÜ[=–;gœ[G¼ üß#µà Az׌†~°‘$IÚ•Ý“ÓØÓÃg,`Ïh÷Êœû­è‘CÚåÊî㹸kuî_dîœó'¹uÌ/„ÿû`¤¶4Hñý¯„~Ø‘$IÚõ.ÿxø|ìY½+?=rH;Öp‡[6äÁúåã¯òo/=Я¬ ïM¤|ä®ÐÏ?’$I»«²õPnò¬ðù ØÃ<-ï¿9zôžº²ÌÃo˃õ_̽Ë>–Û§üçœîÿï€Fë8h†ÖaÏÿP"I’T‡ú×. Ÿ¯€½£½ìwì44#*·Þ—‹+soõXîœupnñÂðþ4Dçóÿ%ô’$IÒn«ß²l€†ÙöÖÒÞ¬ìnÍÅÝ×åþ×ÎÝsÞ•[Ǿ<üߤipÐÛ~G®$IRêçäðÙ Ø»ZG½$—Ç¢ÇÕµá ·lȃõËsoÕ¼Ü^z`N£³ÃÿÞ@Ú bpÓ¡Ÿ£$I’vKe™Û'¾6|¶ö¾ÞWÿ)zQM*·nÞþ*ÿ+?•;ËÊiÑ3Âÿ~@ÚM4Äð¾õ¡¬$I’vGÅm—†ÏU@OËßÞ=ލb•GsqçÕ¹·z,wÎ:8·Ž|Qüße˜¿ç8h‚±}s.z¡¶$I’vGÓß?[a:§½yü@ÒSÖK¹Ø´&÷×.ÎÝss{ÉœœFg…ÿ½€´9h€öÉoýì%I’´;Úö¸ÀàÖó£ÇÍ„†ƒ<ܲ!Ö/ϽUó¶¿Êlß𿟂9h€îWþ*ôó˜$IÒî¨ûå„ÏU@¼Ö1¿˜ËÞÑ£‰öråÖ͹ظrû«üÏxkN‹žþwÒ ä ¶½öL’$©Ê•Oü4§…û…ÏUÀÌлêÓÑã‰ö`eÚ’‹Û.Í½Õ rgùäÖ/ÿ;©"4@ñ£ëC?´I’$íjýk†ÏTÀ 2¶o>x[ôˆ¢ÝQ/åbÓšñ`鮘›ÛKæøµO0ç9¨»ÑY¹ì<ú9N’$i—Æ_õ>W3Jç‹=¥hGòðþïåÁºe¹{Ñsû¤_ÍiÁ>á— Õˆ€šk÷ŠÐÏu’$I»Zñý¯„ÏTÀÌTÜqEô¨¢I*¹+n97÷.ÿÇÜ9íM9-zføßH5ç æ\ÃK’¤ª×9ý÷Âg*`fjŸøºñŸ*W|eç±í¯òÿúQ¹sÖÁ¹uä‹Ãÿ~@j 5×»âŸC?üI’$íJÇïð;`€Iõ¿³4zdi^E?7ßûkç¹½dŽ™ æÏ jnpÓ™¡Ÿ%I’v¥Þ埧€™­uä‹rÙy4zl©oÃ"·lȃõËsoÕ¼ÜYvPN ÷ ÿïŒ<%57¼w]ègDI’¤®ßέß>O3_ïŠODO.µ©Üº9WæÞê±í¯ò?ìyáÿ}€‘isPg£³sî¥Ð’$I;ÛàÆÓãç) î—‡ß=¾T®²õP.n¿<÷¯]4¾$lùâøÿ–@Þj¬uü«C?DJ’$íJÓÞ>OÕÑ=ç]ÑãËÌ®èçáæríâÜ]17·—ÌÉitVø7`d·rPc³ÿ(ôs¥$IÒÎV>r—…4°ÃŠ»®‰cfFÃ"·lȃõËsoÕ¼ÜYvÐø[¢ÿû#{œ€ë]õéÐÏš’$I;[ïê Ÿ¥€êiŸüúœËanZåÖ͹ظ2÷VåÎYçÖá„ÿ·FB8¨±Áú/†~ø”$IÚ©†EnûòðY ¨¦ÁMgä:W¶ÉÅWäþu‡Œ¿ý±uÔKÂÿÌ€‘Ã@ ï»)ô©$IÒδm¡=GÕÕ:úçsî·r-*úÛ_å¿îÔÜ]17·—ÌÉitvøŸ102c9¨«ÑÙ9÷Û¡ŸQ%I’v¦îù¥€Jë_d®bå#wåÁúå¹·j^î,;(§…û‡ÿY#•â ¦ÚŸù¥Ð¬’$I;ûJ[‹n`Wµ{^.[å™\ùØ=y°aEî]ùÉÜùÂïæÖ¡ÏÿsF*Ï@Mu¾ôÇ¡b%I’v¦Á §…ÏQ@=ô¾úOy¦TvÍÅWåþ×˳ߙ[G¿,üÏ©%5Õ»êÓ¡l%I’v¦Îéo Ÿ£€šÛwü•ú{½á ·l•÷âåö’9㿪1üÏÈMà ¦7ž¾÷?àJ’$íBå÷ç´`Ÿð9 ¨î…ïßó3Ì#w³¿·j^î,;ȯ3r$5Uüø{ü®$IÒvqø ÔÌèì<Ü|ãn›WÊ­›s±qeî­˳έ#^ÿÿ`þÿÇ@M•­wÛ‡[I’¤½QûÔß Ÿ¡€úéœùöšMÊîÖ\lZ3~¤Ø]17·ŽUøÿ€45Ô:ü€Ý¸Š—$IÚó•nÊitVøÔSqçÕ“#ÃAnÙ0þ*ÿîÅÊí%sÆßý¿ í 5´í§ç$I’ªTÿú#Âg( ¾Ú'ýZÎåðI¯òÜzAî­š—;ËÊiáþáÿÒnà †º+þ"hu/I’´sµO~}ø Ô[÷Â÷åÎoͭÞþ¿ í!j¨ÿµÃBø’$I;RùèÂç'€Tjh°áÂÐ%¾$IÒŽÔÿæ áó@ª54¼ÿæÐ%¾$IÒŽÔùÂï†ÏO©ÔÍèìœû­Ð%¾$IÒt+Ûç´àiñ3ÀüêsP3­ã^ºÄ—$IÚ‘ë¿>?¤špP33~?t‰/I’´#uÏýïáó@ª 5Ó»ôïC—ø’$IÓnÐÍ­CŸ>?¤špP3ýoºÇ—$IšnÅ¿>;¤qP3Å. ]äK’$M·ÞªŸR8¨™áýß ]äK’$M·ö’9á³@ª5Sv]äK’$M§òñ{Ãç&€T3j¤uÄ Cù’$IÓmpÓá³@ª5ÒþÜo„.ò%I’¦[÷‚ÿ>;¤šqP#Ýóߺȗ$IšVe™[G½4|vH5ã FzW}:t—/I’4†÷­Ÿ›R 9¨‘ÁºSC—ù’$IÓ©ÿõ£Ãç&€TCj¤¸óªÐe¾$IÒtê,ÿƒð¹ Õ€>|gè2_’$iʆEnöÜð¹ Õ€ºX°OÎE?tŸ/I’4UÃûÖÇÏMóëÉ@M´Ž{eè2_’$i:õ¿ýÙð¹ Õ”€šè|áwC—ù’$IÓ©{ÁŸ‡ÏM©¦ÔD÷Ë]æK’$M§Ö±/Ÿ›RM9¨‰Þ5óC—ù’$ISU>º)|fH5æ &ëN ]èK’$MÕà{g‡ÏL©ÆÔDqûå¡ }I’¤©ê­üpøÌjÌ@M ï¿9t¡/I’4Uí¥o Ÿ™R9¨‰²óXèB_’$iÒŠ^Ncû†ÏL©ÆÔ@ëg…îó%I’¦jxïºð™ Õœ€hŸøºÐ…¾$IÒT ¾{JøÌjÎ@ tÎ|[èB_’$iªº(|fH5ç º}0t¡/I’4Uí¥†ÏL©æÔ@ÿÚ…¡ }I’¤I+z9-Ü/|fH5ç 7~!t§/I’4YÃûn Ÿ—R8¨âΫB—ú’$I“5¸á´ðy 5€€nù~èR_’$i²z+?>/¤pPeçÑÐ¥¾$IÒdu>ÿ_Âç%€Ôªnáþ¡ }I’¤©jù¢ø™ `~ý9¨¸Öq¯ ]èK’$MVÙz(|^H á âÚ§þvèR_’$i²ŠM_Ÿ—RC8¨¸Î9ºÔ—$Iš¬ÁºSÃç%€Ô*®·ò#¡K}I’¤Éê]þñðy 5„€Šë_»(t©/I’4Y3ß>/¤†pPqƒuËB—ú’$I“Õ:öåáó@jWl\ºÔ—$Iš¨²÷DN£³Âç%€Ô*nxïwCû’$I5¼w]ø¬Ä@Å•ÿ$t±/I’4Qƒ[Î Ÿ•Rƒ8¨²ÑY9½Ðž$IÒDõ¯?2~^˜ß*¬uÄ C—ú’$I“Õ½äoÃç%€Ô *¬½ä?….õ%I’&«sæÛÃç%€Ô *¬ó…ÿºÔ—$Iš¬ö ¯ Ÿ—Rƒ8¨°îyï]êK’$MX9Ìiá~áó@jÖ[ùáн¾$IÒD•ÿ$|VH ã Âz«„.ö%I’&ªØ´&|VH ã ÂúkO ]ìK’$MÔ`ýÃg%€Ô0*lpó9¡‹}I’¤‰ê_»(|VH ã ÂŠ;® ]ìK’$MT÷¢†ÏJ©aTØð¾›Bû’$IÕYþŽðY 5Œ€ +»'t±/I’4Qí“ß>+¤†qPa¹ß]ìK’$MT먗†ÏJ©aTTëg….õ%I’&lXä´`Ÿðy 5Œ€Šj÷Êн¾$IÒD•OÜ>+¤rPQíÏýzèb_’$i¢†÷Ý>+¤rPQ3ߺؗ$Iš¨â‡_ Ÿ•R9¨¨îùï ]ìK’$MÔàÆÓÃg%€Ô@*ª{Éß….ö%I’&ªÿµÃÃg%€Ô@*ªwÕ§Cû’$IÕ»ìcá³@j Õ¿þˆÐž$IÒDuÏû³ðY 5€Š|÷s¡‹}I’¤‰êœþ{á³@j 5¸åÜО$IÒDµ—¾1|VH ä ¢ŠÛ/]ìK’$MTëøW…ÏJ©TÔ𞵡‹}I’¤‰jö¼ðY 5€Š>ðƒÐž$IÒSVs>+¤rPQåÖûBwû’$IOUÙ~$|NH å ¢r¿ºÜ—$IzªÊGî Ÿ“RC9¨¢±}Cû’$I5Ü|cü¬0¿™TP먗„.ö%I’&ª¸ëšðY 5”€ jŸðšÐž$IÒD 6¬Ÿ•RC9¨ öÒ7†.ö%I’&j°nYø¬Ê@uN{sèb_’$i¢úkŽ Ÿ•RC9¨ Îòw„.ö%I’&ª·z,|VH å ‚ºç½;t±/I’4Q½+þ9|VH å ‚º_ù«Ðž$IÒDõ.ýhø¬Ê@õ.ûXèb_’$i¢º_ùëðY 5”€ ê]õ/¡‹}I’¤‰êžÿÞðY 5”€ êí°Ðž$IÒDu¾ôÇá³@j(Ôÿæ ¡‹}I’¤‰êœñûá³@j(4¸á´Ðž$IÒDuN{Sø¬Ê@ n97t±/I’4Qí¥o Ÿ•RC9¨ â¶KCû’$IÕ>ñµá³@j(TÜ}]èb_’$i¢Zǽ"|VH å ‚†?ùNèb_’$i¢ZG¾8|VH å ‚†?½%t±/I’4Q­CŸ>+¤†rPAÇ~ºØ—$Iš¨´pÿðY 5”€ *»'t±/I’4Qiìéá³@j(T¦Bû’$I•Fg‡ÏJ©¡TPÙݺؗ$Iš¨è9  É:ª'½Ðž$IÒS6,Âç$€&ë8¨˜ÑÙ¡{}I’¤ +zñ³@ƒuTÌ¢g†îõ%I’&¬ßŽŸ•¬ã ZZ‡??t¯/I’4Qeï‰ðY  É:ª¥uôχ.ö%I’&ªì<>+4YÇ@µ´Žuèb_’$i¢ÊöÃá³@“uTK{ɜО$IÒD•éðY  É:ª¥}òBû’$IU>qø¬ÐdÕÒ>õ·Bû’$IU>~oø¬ÐdÕÒ9íÍ¡‹}I’¤‰*ÿIø¬ÐdÕÒ9ý-¡‹}I’¤‰*·Þ>+4YÇ@µtÎ|[èb_’$i¢Ê´%|Vh²Ž€jé|ñCû’$IU¶ Ÿ•š¬ã Z:g¿3t±/I’4QeçÑðY  É:ª¥{λBû’$IUöžŸ•š¬ã Zºç¿'t±/I’4aývø¬ÐdÕÒ½ð}¡{}I’¤ +zá³@“uTK÷ËÝëK’$MذŸ•š¬ã Zº}0t¯/I’4Yѳ@“uTK÷’¿ ]êK’$MVZ°Oø¼Ê@Åô.ýhèR_’$i²Òؾáó@j(Ó»üã¡K}I’¤ÉJ‹ž>/¤†rP1½¯þ¯Ð¥¾$IÒdµ}vø¼Ê@Åô®øDèR_’$i²Z‡=/|^H å bzWüsèR_’$i²ZG½$|^H å bH’¤™\ë¸W„ÏK©¡TLïÊO†.õ%I’&«}âkÃç%€ÔP*Æ€$IšÉµO~}ø¼Ê@Å8$I3¹ö©¿>/¤†rP1½+?ºÔ—$Iš¬Îéo Ÿ—RC9¨’$i&×ùâ†ÏK©¡TŒI’4“ëžû§áó@j(Ó»êÓ¡K}I’¤Éê^øþðy 5”€Šq I’frÝ‹þgø¼Ê@Åô®ú—Ð¥¾$IÒdõ.ûXø¼Ê@Å8$I3¹Þ•Ÿ Ÿ—RC9¨¿@’$Íäz«ÇÂç%€ÔP*¦wå§B—ú’$I“Õ¿þÈðy 5”€Šé]ñ‰Ð¥¾$IÒdõ¿yBø¼Ê@Åô.ÿxèR_’$i²ë–…ÏK©¡TLï²….õ%I’&kp˹áó@j(Ó[ù‘Ð¥¾$IÒd·¯ Ÿ—RC9¨˜î%ºÔ—$Iš¬bÓšðy 5”€Šé^ô?C—ú’$I“5¼ÿ{áó@j(ÓýÊ_….õ%I’&«|äîðy 5”€Šé®ø‹Ð¥¾$IÒd•­‡Âç%€ÔP*¦{áûB—ú’$I“VôÃç%€ÔP*¦{þ{Cwú’$IS•=#|fH ä bºç½;t¡/I’4U­£^>3¤rP1Ýs޺З$Išªö ¯ Ÿ™R9¨˜ÎÙï ]èK’$MU{éá3@j Óùâ†.ô%I’¦ªó…ÿ>3¤rP1Ó/t¡/I’4U/ýqøÌÈ@ÅtN{SèB_’$iªº+æ†ÏL©TLû”ß ]èK’$MUïÒ¿Ÿ™R9¨˜öI¿ºÐ—$IšªÞUÿ>3¤rP1í_ºÐ—$IšªþšcÂg&€Ô@*¦uü«Cú’$IS5¸áóá3@j Ó:æBú’$ISUüà¢ð™ 5€Šiù¢Ð…¾$IÒT?º>|fH ä bZ‡>'t¡/I’4UÃ-Âg&€Ô@ªfáþ¡ }I’¤©*Ÿ¸?~f˜ß<ªftVèB_’$iÊŠ^üÌ0¿yTP.ú¡;}I’¤©jò¬ð™ 5Œ€ *{O„.ô%I’¦ªuÜ+Âg&€Ô0*¨l=ºÐ—$IšªöÉoŸ™RÃ8¨ ò±{Bú’$ISÕ9ã­á3@j4|ð¶Ð…¾$IÒTuÏOøÌÆ@ ï»)t¡/I’4U½•Ÿ™RÃ8¨ âÇß ]èK’$MUïšùá3@jTÜyuèB_’$iªúßüLøÌÆ@/ ]èK’$MÕ`ýòð™ 5Œ€ ÜrnèB_’$iªŠÛ. Ÿ™RÃ8¨ Á_]èK’$MÕðžo…ÏL©aTPÿÛ'….ô%I’¦ª|äîð™ 5Œ€ ê¯9&t¡/I’4eýVøÌÆ@õ¯]ºÏ—$IšN­Cž>7¤qPA½+?ºÌ—$IšNíÏü‡ð¹ 5ˆ€ ê­šºÌ—$IšNíe¿>7¤qPAÝ‹>ºÌ—$IšNsþ$|nH â ‚ºçýYè2_’$i:u/ù»ð¹ 5ˆ€ ê,Gè2_’$i:õV…ÏM©ATPç´7….ó%I’¦Sÿ;KÃç&€Ô *¨}Ò¯….ó%I’¦Óàû_Ÿ›Rƒ8¨ Öñ¯]æK’$M§âÇߟ›Rƒ8¨ Ö‘/ ]æK’$M§áÃw„ÏM©ATÑÂýC—ù’$IÓ©ìnŸ›æ7‡€ŠÊE?t¡/I’4Ò¢g†ÏM©!TTÙ~$t™/I’4Zǽ2|nH á ¢ÊÇ~ºÌ—$IšNíSþsøÜÂ@E zkè2_’$i:uÎ~gøÜÂ@E ïYºÌ—$IšNÝ‹ÿ&|nH á ¢Š;® ]æK’$M§Þ5£ás@j5ذ"t™/I’4ß=%|nH á ¢7|>t™/I’4ŠÛ. Ÿ›RC8¨¨þ7Ž ]æK’$M§á}7…ÏM©!TÔ¶ß§+I’4Ó+Ó–ð¹ 5„€Šê]ö±Ðe¾$IÒ´*Ëœî>;¤pPQÝsCwù’$IÓ­uÜ+Âg'€Ô*ªsö….ò%I’¦[{Ùï„ÏN©TTç´7‡.ò%I’¦[÷¼w‡ÏN©TTû³¿ºÈ—$Išn½Ë?>;¤pPQ­c_ºÈ—$Išný5džÏN©TTëÐg‡.ò%I’¦Ûàæ/…ÏN©TXB—ù’$IÓ©øÑ×Âç&€Ô*¬l=ºÌ—$IšNÇR8¨°mËtI’¤_¿>7¤pPaÃ{×…îò%I’¦[ëðÂg'€Ts*¬¸óªÐE¾$IÒtkö—Ãg'€Ts*lpËy¡‹|I’¤éÖ9óíá³@ª9ÖÿÎÉ¡‹|I’¤éÖýÊ_‡ÏN©æä+Èž IDATTXÿºCBù’$IÓ­wÍhøìjÎ@…õVýCè"_’$iº Ö>;¤šsPaÝ ßºÈ—$IšnÅW„ÏNÀÿfïÞŸ-+Ëï£ñ–/8FGÇIbéX¥N/¹X“Œ&Qk4*3“IbbtâTcÅr’h’sh ›»€ ´rmA. \‘[Ó Ø@°mÞ}ß{­©6–#r;{½çœg¯µ?ߪÏ?pÎþá©§žZo €¹fsPcÝ޺ȗ$IZhãû7…ÏN©áÔXgíBù’$I nПRÃ9¨±Î!¿ºÇ—$Iš¤öêç‡ÏO©ÁÔX{Ÿç„.ñ%I’&©s䯄ÏO©ÁÔÙüвCù’$I ­{Ê{âç'€¹ærPsEº?t‘/I’´Ðúç~4|vH æ æÆ÷ߺȗ$IZhƒ+ ŸRƒ9¨¹Ñ]—‡.ò%I’Úð–3Âg'€Ô`jn´i}è"_’$i¡ï¹6|vH æ æ†×ºÈ—$IZhEº?|vH æ æ÷ ]äK’$MRZõÌðù 5”€šëŸûÑÐ%¾$IÒ$u{eøüÊ@ÍõNý£Ð%¾$IÒ$u?û»áó@j(5×=þ­¡K|I’¤Iê­ÿPøüÊ@ÍuŽxmè_’$i’—ì>?¤†rPsíý_ºÄ—$Iš¤áõ'†ÏO©¡ÔÝʧ”e1]äK’$-´Ñ–ñóÀ\39h€¢³-t‘/I’´ÐŠí[Âg'€ÔP`|ÿ­¡‹|I’¤7”iå®áó@j  0Úriè_’$i’Ú¾4|~H ä †7ŸºÄ—$Iš¤îq¿>?¤rЃ« ]âK’$MRï̆ÏO©4Ààâ=C—ø’$I“4ظOøüÈ@ô¿ø—¡K|I’¤IÞprøüÈ@tOyOè_’$i’Æw5|~H ä :G¿)t‰/I’4IEº/|~H ä Úý‡Ð%¾$IÒ¤µ÷~vø Æ@ìù´²,ŠÐ%¾$IÒ$uŽxMü 0×,¢è|?t‰/I’4IÝ“ß>?¤†qÐãû7….ñ%I’&©ÞÇÂç'€Ô0btdžÐ%¾$IÒ$ ®úTøüÆ@C o89t‰/I’4I£o~)|~H ã !—ºÄ—$Iš¤ñý·†ÏO©a4Dÿ˺ė$Iš¨a·Ló»„ÏP©A4Dï´÷…îð%I’&­}ÀKÂg(€Ô ¢û™·„.ð%I’&­{ì›Ãg(€Ô ¢sø«Cø’$I“Ö;ãýá3@j ÑÞ÷çBø’$I“6¸x¯ð 5ˆ€)ú‡.ñ%I’&ixý‰áó@j 2~`sè_’$i’Fw]>?¤qÐ £;. ]âK’$MRñÐwÂç'€Ô døõφ.ñ%I’&ª(Ê´ê™á3@j 2¸dïо$IÒ¤uŽxMø Â@ƒô¾ð¡ |I’¤Ië­Û=|†H á ¡ÿLI’¤:Ô¿àá3@j Ò9ⵡ |I’¤I^w\ø Â@ƒ´W?/t/I’4i£;¿>C¤†pÐ0堺ė$Iš¤âá{Ãç'€Ôfü½o….ñ%I’&­½÷³Ãg(€ÔftdžÐ¾$IÒ¤u>ýŸÃg(€Ôfxý ¡ |I’¤Ië}î†ÏP©4Ì`㾡 |I’¤Ië_øOá3@j Óÿâ_†.ð%I’&møõφÏP©4L÷¤w†.ð%I’&mt×á3@j ÓùôëBø’$I“V¤ûÃg(€Ô¦½úù¡ |I’¤*µ÷yNøjÎ@•ƒNè_’$iÒ:Gýjø jÎ@·ÝºÀ—$Iš´Þ©>C¤šsÐ@£o_ºÀ—$Iš´þ†•á3@ª9 4¼þÄо$IÒ¤ ¿ñ/á3@ª9 4¸tuè_’$iÒÆ[¯ Ÿ¡RÍ9h þÿ*t/I’4iEçûá3@ª9 Ô=é]¡ |I’¤*µ÷}nøjÌ@uŽüåÐå½$IR•:kß>G¤sÐ@í5/]ÞK’$U©wÚûÂç(€Tcšh~EY»¡ |I’¤I\²*~Ž˜«/ 5Þv[è_’$iÒ†7>C¤sÐP£Û/ ]àK’$MÚøÞÂg(€TcjøµcBø’$I7ì–iå®ás@ª) Õ¿àB÷÷’$IUjüòð9 Õ”€†êú‡¡Ë{I’¤*uOx[øjÊ@CuŽ~Sèò^’$©Jýs?>G¤šrÐPíý^º¼—$IªÒðš£Âç(€TS¬ì§Ð¾$IÒ¤¾}Iø jÊ@ƒï»%t/I’4iÅÃ÷†ÏP©¦4Øhó9¡ |I’¤*µ÷yNøjÈ@ƒ ®úTèò^’$©Jµo Ÿ£R 9h°þy ]ÞK’$U©wúŸ†ÏQ©†4X÷”÷„.ï%I’ª4ظoøjÈ@ƒu>ýºÐå½$IR•†·œ>G¤rÐ`í}~6ty/I’T¥ñ}·„ÏQ©†4\ÑݺÀ—$Iš¸Q¿L+Ÿ>G¤šqÐpãï|=t/I’T¥Î')|ŽH5ã áv¾¡+I’T·º'½3|ŽH5ã á—º¼—$IªRÿË>Gø©f4\ÿì‡.ï%I’ª4¼öØð9 ÕŒ€†ëžøŽÐå½$IR•Fw^>G¤šqÐpÃ^º¼—$IªRÑþ^øjÆ@Óíõô²,ŠÐ¾$IR•Ú«Ÿ?KÌÕ‡€P<|oèò^’$©JÝc~#|ŽH5â`Œï¾2ty/I’T¥ÞY>G¤q0†7œº¼—$IªÒàòƒÃç(€T#fÀ`㾡Ë{I’¤*¾u^øjÄÀ Øùù\I’¤ºU;ty/I’T¥Ñ7¿>G¤šp0#Wº¼—$IªR±}KøjÂÀŒèñ/C—÷’$I•*в½÷³Ãg)€TfD÷3o ÝÝK’$U­sÔëÃg)€TfDûÀ—†.î%I’ªÖ;ãýá³@ª³b~—²tB—÷’$IU|eÿøY `nú9˜!ãûn]ÞK’$Ui´ùìð9 Õ€€2ÚtVèò^’$©JÅ÷R 8˜!ƒË]ÞK’$Uª—iÕ3Ãg)€4åÌÞú…îî%I’ªÖ9òWÂg)€4åÌîq¿º¸—$IªZïô? Ÿ¥Ò”s0CÚ¼8tq/I’TµÁ¥«Ãg)€4åÌ’ùeÑ8ty/I’T¥Ñ­_ˆŸ¥æ¦›€3¾÷¡Ë{I’¤*·Ý>G¤)ç`Æ o>-ty/I’T©b\¦½ž>K¤)æ`Æì|?W’$©Žu>ýºðY M13¦wæB÷’$IUëöÇá³@šbfL÷Øß ]ÜK’$Um°qŸðY M13¦½ß C÷’$IUm:+|–HSÌÀ *º†.ï%I’ª4þÞ·Âç(€4ÅÌ ñ=×….ï%I’*UŒË´ê™á³@šRfÐðÆÏ…îî%I’ªÖ9êWÃg)€4¥Ì Á%«B÷’$IUëùðY M)3¨wúŸ„.î%I’ª6¸üàðY M)3¨sô›B÷’$IUÝv~ø,¦”€Ô^ý¼ÐŽ$IRÕŠ‡¾>K¤)å`Fm¡Ë{I’¤ªµW??|–HSÈÀŒß}eèâ^’$©jÝã~+|–HSÈÀŒ^w\èâ^’$©jý³ÿ:|–HSÈÀŒêùïB÷’$IU^³6|–HSÈÀŒêþË ]ÜK’$Umt×á³@šBfTç_]ÜK’$U­è=T¦ùáó@š2fÕü.e9è„.ï%I’ªÖ>èeñóÀÜtq0ÃÆ÷Þº¸—$IªÚÎ!6z–HSÆÀ ÞôùÐŽ$IRÕú|"|–HSÆÀ \¼gèâ^’$©jÃoœ>K¤)ã`†õ>ÿ¡‹{I’¤ªí|Ê(z–HSÆÀ ëñšÐŽ$IRåFý2íñSáó@š"fÙž?]–ãQèî^’$©jÃÿSü<07≠ñ¶ÛC÷’$IUÛùœQô,¦ˆ€7Ú|Nèâ^’$©jƒKöŸ¥Òq0ã—º¸—$IªÚhÓúðY M3®wæC÷’$IUÛù”Qô,¦ˆ€×9ú×B÷’$I•+Æe{Õ³Âç)€4%̸ö>Ï ÝÛK’$åÔYû†ðy M ”ÅÃß ]ÜK’$UmçsFѳ@š(Gß¾$tq/I’TµÁŸ Ÿ¥Ò”p@9¸úÈÐŽ$IRÕFwlŸ¥Ò”p@Ù?ç#¡‹{I’¤ªíï…ÏRiJ8 ìÿÖÐŽ$IRNí^>O¤)à€²}ÀKB—ö’$I9uO|Gø<¦€Ê4¿¢,z;B÷’$IUë_ð‰øy `.ž~`ü¯×„.î%I’ª6¼q]ø,¦€~`xý ¡‹{I’¤ªïß>K¤)à€Øùé\I’¤Z6•i¯g„ÏS)˜þí‡pò»C÷ö’$I9uŽúÕðy sÀt}EèÒ^’$)§Þ™ Ÿ§R0ü›•»–å º¸—$IªÚàÊÃâç)€¹Xø‘ñ=×….î%I’ª6Ú²1|–HÁð#ÃëO]ÜK’$U­èn/ÓüŠðy rÀôÏÿûÐŽ$IRNí_>O¤@øÿ?†ßº´—$IÊ©{Ò;Ãç)€È?Ò>ð߇.í%I’rê_øOáó@ ä€GØù~®$IRÞtjø,9àFw]º¸—$IªÚøo†ÏR)axÍÚÐŽ$IRåŠqÙ^õ¬ðy qÀ#ôÏùHèÞ^’$)§ÎÚ7†ÏS)ˆùƒ8î·C—ö’$I9õÖ(|žHAðíÕÏ]ÚK’$å4¸êˆðy qÀ£7tq/I’TµÑ—…ÏR)ˆetÇE¡‹{I’¤ª½eš_>O¤x”Á•‡†.î%I’rjüòðy pÀ£ôÎúóÐ¥½$IRNÝ“ß>O¤x”ÎÑo ]ÚK’$åÔß°2|žHð(íUÏ*Ë¢]ÜK’$UmxËáó@ à€ÇTlߺ¸—$IªÚxÛíá³@ à€Ç4Ú|vèâ^’$©rŸlïýìðy -3<¦Á¥kB÷ö’$I9uùðy -3<¦Þiï ]ÚK’$åÔ?û¯Ãç)€´Ìð˜:G¼6ti/I’”ÓðÚŸ§Ò2sÀcÛóie9†.î%I’ª6¾çºøy `ny9àqïߺ¸—$IªÜ¨_¦=ž>O¤eä€Ç5¼éÔн½$IRN;Ÿ4Šž§Ò2rÀãêoØ#ti/I’”SïŒ? Ÿ§Ò2rÀãê­Û=ti/I’”ÓàÊCÃç)€´Œð¸:‡¾"ti/I’”ÓhË¥áó@ZFx|ó»”e?….î%I’ªVôv”i~EüL0·<ð„Æ[¯]ÜK’$åÔ>ø?†ÏSi™8à ¿vLèÒ^’$)§ÞºÝÃç)€´Lð„úg8ti/I’”Ó`ã>áó@Z&xBÝcߺ´—$IÊi´ùœðy -<¡öÞ?S–Eº¸—$IªZñÐ=áó@Z&xRÅö-¡‹{I’¤œÚû½0|žHËÀOj´i}èÒ^’$)§îg/|žHËÀOjpñ^¡K{I’¤œúç<|žHËÀOªwÊ{C—ö’$I9 oü\ø<–žTç_ ]ÚK’$å4~à›áó@Zxró+Ê¢·#tq/I’T¹b\¶W=+~¦˜[ZXñÝW†îí%I’rêóëáó@ZbXá5G….í%I’rêŸýáðy -1,Hï º´—$IÊixí±áó@ZbXÎÑ¿º´—$IÊi|ϵáó@ZbX˜UÏ,Ëbº¸—$IªÜ°W¦=~*~¦˜[:X°ñ¶ÛC÷ö’$I9uŽxMø<–lxË¡K{I’¤œzg¼?|žHKÈ Öß°2ti/I’”ÓàŠO†ÏSi 9`Áº'ÿ~èÒ^’$)§Ñ–áó@ZBX°öÁ/]ÚK’$åTt·—i~EøL–ˆn~Åç’$Iu­sÈ/ÄÏTsKÃÝyYèÒ^’$)§ÞçþGø<–ˆ&2¸êˆÐ¥½$IRNƒKׄÏSi‰8`"½õ ]ÚK’$å4ºý‚ðy -L¤³ö ¡K{I’¤œŠÎ¶2ͯŸ©ÒpÀdözzYŽG¡‹{I’¤œÚ½,~¦˜[|˜ØøÍ¡K{I’¤œz§¼7|žHKÀÞôùÐ¥½$IRNƒû„ÏSi 8`bý þ!ti/I’”Óè[ç…ÏSi 8`bÝÏþ^èÒ^’$)§¢ý@ø<–€&Ö^³[èÒ^’$)·ö/ Ÿ©Ò"s@%ÅŽ ]ÚK’$åÔ=ù÷Ãç)€´ÈPÉhóÙ¡K{I’¤œï>O¤Eæ€J—¬ ]ÚK’$å´ó˜1zžH‹Ì•tOyOèÒ^’$)§âá{Ãç)€´ÈPIû —….í%I’rkïÿ¢ð™ -"TVt¶….í%I’rÚ9GÏSi9 ²ÑB—ö’$I9õ7¬ Ÿ§Ò"r@eƒË ]ÚK’$å4Ú´>|žH‹È•õNý£Ð¥½$IRNÅŽ­áó@ZD¨¬sØ«B—ö’$I¹µ÷{aøL‰ª›ß¥,ú‡.í%I’rêžð¶ø™ `nq8 Ëøî+C—ö’$I9õ/ü§ðy -d\ýéÐ¥½$IRNÃ[Ο§Ò"q@–ÞYº´—$Iʩؾ%|žH‹ÄY:GþrèÒ^’$)·öêç‡ÏTi8 ÏO-ËQ?ti/I’”S÷øß‰Ÿ©æò9 Ûø;ׇ.í%I’rê_ð‰ðy -d^÷™Ð¥½$IRNÛN Ÿ§Ò"p@¶þ9 ]ÚK’$å4Þv{ø<²uýÍÐ¥½$IRVEQ¶÷}nøL29 [{ճʲ‡îí%I’rê~濆ÏT)“Åøo†.í%I’rêùoÃç)€”É‹bxãçB—ö’$I9 o\>O¤LXýó?º´—$IÊi¼í¶ðy erÀ¢èÿ;¡K{I’¤¬Š¢l¯~^øL28`Qì\˜K’$Õ¹Ñ3@Êà€ES=|žH°húÍ….í%I’r*¶ß>O¤ X4ÝÞº´—$IÊ­½f·ð™ Uä€EÓ^ó‚Ð…½$IRnÝß>S¤Š°¨Š[C—ö’$I9õ7¬ Ÿ§REXT£Mg….í%I’rÝú…ðy Uä€EÕ¿h.ti/I’”Sñð½áó@ªÈ‹ª{ÂÛC—ö’$I¹µ÷ÿùð™ Uà€EÕ^ó‚Ð…½$IRnÝ“Þ>S¤ °èŠ[C—ö’$I9 .Y>O¤ °èF›Ö‡.í%I’r}óÜðy Uà€E׿h>ti/I’”SÑ~ |žH8`ÑuOx{èÒ^’$)·öA/ Ÿ©Ò„°èÚk^º°—$IÊ­·n÷ð™ MÈK¢Ø±5ti/I’”ÓàÒ5áó@š–ÄhÓúÐ¥½$IRN£Û/ Ÿ§Ò„°$ú͇.í%I’r*º–i~EøL&à€%Ñ=áí¡K{I’¤Ü:‡übøL&à€%Ñ^³[èÂ^’$)·ÞçÿWøL&à€%SìØº´—$IÊipùAáó@š€–ÌhÓúÐ¥½$IRN£-Ãç)€4,™þEó¡K{I’¤œŠþÃešß%|¦H ä€%Ó=ñ¡K{I’¤Ü:‡½*|¦H ä€%Ó^³[èÂ^’$)·Þé>S¤rÀ’*vl ]ÚK’$å4¸òÐðy -–ÔhÓúÐ¥½$IRN£»®Ÿ§Ò9`Iõ/š]ÚK’$e5h—iåSÂg*€´XRÝߺ³—$IÊ­sÄkÂg*€´XRíý^º°—$IÊ­wæÃg*€´XrÅŽ­¡K{I’¤œW>O¤pÀ’ÝrfèÒ^’$)§ñ¿~-|žH à€%׿ðC—ö’$IYeÚëéá3@zXrÝã'tg/I’”[gíÃg*€ô$°äÚûþ\YEèÒ^’$)§þ9 Ÿ©Ò“pÀ²o»-ti/I’”ÓðúÃç)€ô$°,†7® ]ÚK’$å4~`sø<ž„–Eÿ¼….í%I’²*в½ÏsÂg*€ô°,ºÇ¾9tg/I’”[÷ø·†ÏTé 8`yìõŒ²B—ö’$I9õ/üÇø™ `îñ9`ÙŒï»9ti/I’”ÓhÓYáó@zX6ïº4éðý IDAT´—$IÊ©xè;áó@zX6ý/þUèÒ^’$)·ö/Ÿ©ÒãpÀ²éõúÐ…½$IRnÝSÞ>S¤Çá€å³ÇSËrØ ]ÚK’$å4¸tuüL0÷ذ¬Æ÷\º´—$IÊitÇEáó@zXVÃkŽ ]ÚK’$åTt,Óü.á3@z XV½3?º´—$IÊ­sØ+Ãg*€ô°¬:G¼&ta/I’”[ïô? Ÿ©ÒcpÀòZ¹kYöSèÒ^’$)§ÁUŸŠŸ©æÍËnt×å¡K{I’¤œÆ[¯ Ÿ§ÒcpÀ²\ñÉÐ¥½$IRVÃ^™ö|ZøL~‚–]ï´?ÝÙK’$åÖ9êõá3@ú XvC_º°—$IÊ­ÿÅ¿ Ÿ©ÒOpÀò›_QÝí¡K{I’¤œ†_?>~¦˜{$„ÝqQèÒ^’$)§ñ}·„ÏSé'8 ÄàÒ5¡K{I’¤¬ŠqÙÞûgÂg*€ôc¢·n÷н$IRnÝã~;|¦H?Æ!Ú¾4ta/I’”[ÿü‡ÏTéÇ8 LñðwC—ö’$I9 o>=|žH?ÆaF›Ï ]ÚK’$åTS$Dëóë¡ {I’¤Üz§ýqøLnÏŸ.ËÑ ti/I’”ÓેÇÏTs˜ã{® ]ÚK’$å4Þzuø<0 †×º´—$IÊjÔ/ÓžO Ÿ©ºˆÖ;ó¡;{I’¤Ü:G¿)|¦è: ZçðW‡.ì%I’rëéoÂg*€®ÂÍïR½¡K{I’¤œ†7œ?S3¯ë€i0úöÅ¡K{I’¤œŠïß>Ot0 _Ù/ti/I’”[{Íná30Ûº˜½u»‡.ì%I’rÛ9XGÏTÀlë:`´xIèÂ^’$)·Á%«Âg*`¶u0-Їî ]ÚK’$å4ºíüðy ˜m]L‹Ñ¦³B—ö’$I9Ýíešß%|¦f—¦Fÿ ]ÚK’$åÖ9ì•á30»05ºÇ¿5ta/I’”[ïŒ÷‡ÏTÀìrÀÔhïó³eYŒC—ö’$I9 ®>2|¦f—¦Êøþ[C—ö’$I9ï¹.|žf—¦ÊðëŸ ]ÚK’$e5”i¯g„ÏT@k&9`ªôÏþpèÎ^’$)·î1¿>S­™ä€©Ò9êõ¡ {I’¤Üúç},|¦Z3ÉÓe§–å°º´—$IÊixÓçãg* œE˜:ã­W….í%I’r*¼+|žZ3ÉSgðÕÃC—ö’$I¹µ÷ÿùð™ hÍLÞiï ]ØK’$åÖ=ù÷Ãg* 5s0u:‡¾"ta/I’”ÛàÒÕá3К9˜>ó+Ê¢ý½Ð¥½$IRN£;6ÄÏT@9k0•F·º´—$IÊ©è=T¦•»†ÏT@k¦8`* .Ù;ti/I’”[çðW‡ÏT@k¦8`*uOzgèÂ^’$)·ÞYÿ;|¦Z3ÅS©½f·Ð…½$IRnï>S­™â€©Ul¿3ti/I’”ÓøÞÂç) 5S0µ†7º´—$IÊj<*Û«ž>S­™á€©Õÿòß…îì%I’rëþó Ÿ©€ÖÌpÀÔÚ¹0—$Iªsýóÿ>|¦Z3ÃÓkÕ3Ër< ]ÚK’$å4¼åŒø™ (g…¦Úø»7†.í%I’r*º'|žZ3ÃSmxí?‡.í%I’rkð’ð™ hÍLµÞúÿº°—$IÊ­·î¿‡ÏT@k&8`ªu>ýºÐ…½$IRnƒËŸ©€ÖLpÀt[¹kYöSèÒ^’$)§Ñ]WÄÏT@9 0õFw^º´—$IÊjØ+ÓžO Ÿ©€Vã9`êíül®$IRë¬}cøL´ÏS¯÷ù?]ØK’$åÖ?÷£á3Ðj<L½öÁ/]ØK’$å6¼ñsá3Ðj<ÔB‘î ]ÚK’$åTS­Fs@-´÷}nYEèÒ^’$)§Ñ]—‡ÏT@«ÑPãm·….í%I’²vË´ÇSÃg* ÕX¨á '‡îì%I’rë¬}CøL´ËµÑ?÷£¡ {I’¤Üú_ú›ð™ h5–j£s̯‡.ì%I’rÞ¸.|¦Zå€úØó§Ër4]ÚK’$åTl¿3~¦ʦr@­Œï¹.ti/I’”[{ÿ…ÏT@«‘P+ƒ« ]ØK’$åÖ;å½á3Ðj$ÔJïŒ? ]ØK’$å6¸ì€ð™ h5’j¥sØ«Bö’$I¹î¼,|¦Zä€z™_QÝí¡K{I’¤¬2íñÔø¹ (›Æµ3ºýÂн$IRn£^>S­Æq@í 6—$IÊ­ÎGÂg* Õ8¨îIï ]ØK’$å6¼á”ð™ h5Žj§½f·Ð…½$IRnÅö-á3ÐjÔR±ýÎÐ¥½$IRníýþ]øL´Åµ4¼éÔÐ…½$IRnÝ“ß>S­Fq@-õÏû¿¡ {I’¤Ü_Ù?|¦Zâ€ZêûæÐ…½$IRn£-—†ÏT@«QPO{=£,ÇÃÐ¥½$IRVƒN™öø©ø¹ (›Âµ5þÎõ¡;{I’¤Ü:GþJøL´Ãµ5¼fmèÂ^’$)·þÙ>S­Æp@mõÎü`èÂ^’$)·á7N Ÿ©€Vc8 ¶:‡¿:ta/I’”[ñýo‡ÏT@«1P_ó»”EoGèÒ^’$)·ö/ŽŸ«€² Pk£;6„.ì%I’rë­Û=|¦Zà€Z\º&ta/I’”ÛàòƒÃg* Õ¨µîÉï]ØK’$å6¾û«á3ÐjÔZ{ÿ….ì%I’² Ê´×3Âç* U{¨½bÇÖн$IRnÝcß>S­Ús@í o>=ta/I’”[ÿü‡ÏT@«öP{ý/ÿ]èÂ^’$)·Ñ­_Ÿ©þ{÷ow]ßùþ„j«ˆµWÚŽ¶N¯´öÔñÔÖæÑ«œNÛGN[ÛêÔ¶x¦3­:¶Íœi[Æì$ ábC„ˆÁE.©B4Þ0^Œ — ‚÷€†«Âþ­ûú}Î#;#röú­õY—çëñxþÏ%ùþÞë—oÖ^bÒ¹ÀÄkž÷›©/ì%I’­*U‡¤ï* ˜h.0ùNxJD¿›úÒ^’$iÐë~&W1É\`*ôïøtê {I’¤Ak½ë¯Ó7PL4˜ Ý«7¤¾°—$I´î5oNßT@1Ñ\`*´Þý7©/ì%I’­¿ÿÆôMͦBãÌ社°—$I¸ªŠòÄg¤ï* ˜X.0VUë©ïì%I’íÀ8OßU@L*˜½/}4õ…½$IÒ u>vbú¦ЉåS£³cmê {I’¤A;p¡1{SÅÄr€©ÑºàOR_ØK’$ \§ óß•¾«€b"¹ÀÔ(Où±Ô÷õ’$IuÔxÓ/§ï* ˜H.0Uªo|5õ…½$IÒ µ·ý÷ôMɦJïÆw¥¾°—$I´î ¥o* ˜H.0UÚ|Mê {I’¤A«î¿-}SÅDr€©Ò|Ëo§¾°—$Iª£òÔg¦ï* ˜8.0UÊÕGDô{©/ì%I’­uñKÓwPL˜:ý¯ÝúÂ^’$iÐ:Wž™¾©€bâ¸ÀÔé^s^ê {I’¤Aëßvmú¦ЉãS§uéËS_ØK’$ \¿å OMßU@1Q\`ê4Þø¤¾¯—$Iª£æÆßIßU@1Q\`úÌÑ^H}a/I’4hí¯ÊßU@L˜J½};R_ØK’$ ZïsïOßT@1Q\`*uvžšúÂ^’$iЪÖ7baÕ¡é» (&† L¥Ö;ÿ,õ…½$IR5Îü…ô]æRyê3S_ÖK’$ÕQë²W¤ï* ˜.0µªûoK}a/I’4hÝë7§o* ˜.0µz7]šúÂ^’$iЪû¾œ¾©€bb¸ÀÔj_~\ê {I’¤:*Oýwé» (&‚ L­æÆ¦¾¬—$Iª£ÖÅ/MßU@1\`j•«ˆ¨ú©/ì%I’­såÓwPL˜jýý7¦¾°—$I´þŸNßT@1\`ªu¯Ý˜úÂ^’$iàª~”'>#}WÅØs€©Öºì•©ïë%I’ê¨ù¶?HßU@1ö\`ª5ÎznêËzI’¤:ê|ü¤ô]cϦÛܲˆöBê {I’¤AëíÛ‘¿«€w.0õz·\‘úÂ^’$iàºÍX8þIé» (Æš L½Î§§¾¯—$Iª£æ†åé» (Æš L½Ö…/I}Y/I’TGíýsú®бæS¯<íY©/ë%I’ê¨wó{ÒwPŒ5˜ Õw¤¾°—$I´ªqo,¬:4}WÅØr€™ÐÛ{Yê {I’¤:jœùœô]cËfBûòÿ™ú²^’$©ŽÚ[ÿ[ú®бå3¡yþ1©/ë%I’ê¨ûéw¤ï* [.0Ê5GFTýÔö’$IƒV}ã+é» (Æ– ÌŒþ7¥¾°—$Iª£òÔg¦ï* K.03º×Ÿú²^’$©ŽZÿEú®бä3£uÙ+S_ÖK’$ÕQ窳ÓwPŒ%˜³ž›ú²^’$©Žú_ûLú®бä³cnYD§L}a/I’4pUå‰ÏÈßV@Œ˜)½[®H}_/I’TGÍÍ+ÒwPŒ˜)+NO}Y/I’TG¿>}WÅØq€™Òºð%©/ë%I’êèÀ·eï* ;.0SÊÓž•ú²^’$©–º­X8þÉéÛ (ÆŠ ÌœêþÛSß×K’$ÕQóÍ¿ž¾«€b¬¸ÀÌéí½,õe½$IRµ/?.}WÅXq€™sàe¹$IÒ¤×ûìûÒwPŒ˜9ÍóI}Y/I’TGUëþX˜[–¾­€bl¸ÀÌ)W?-¢ê§¾°—$Iª£ÆÙÏKßV@16\`&õï¼)õe½$IRµßÿé» (Ɔ ̤îuç§¾¬—$Iª£ÞM—¦ï* .0“Z—½2õe½$IRU{baÕ¡éÛ (Æ‚ ̤ÆYÏM}Y/I’TW3Ÿ“¾­€b,¸Àlš[Ñ^H}Y/I’TGí÷ü]þ¶b¸ÀÌêíÛ™ú²^’$©Žº7\”¾«€b,¸ÀÌê\qZêËzI’¤:ª¸#}WÅXp€™Õºð%©/ë%I’ꪱî§Ó·P¤s€™Užö¬Ôõ’$IuÕºôoÓ·P¤s€™VÝ{êËzI’¤:êî~[ú®Št.0Óz{/K}Y/I’TGÕ×oMßU@‘ÎfZûòãR_ÖK’$ÕUyÚ§o+ Hå3­¹ñ…©/ê%I’ꪵåeéÛ (R¹ÀL+WQõS_ÖK’$ÕQ÷šóÒ·P¤r€™×¿ó¦Ô—õ’$IuÔ¿ûsé» (R¹ÀÌë^w~êËzI’¤º*×þHú¶Š4.0óZ—½2õE½$IR]µ.úOéÛ (Ò¸ÀÌkœõÜÔõ’$IuÕ¹ê¬ômi\€¹eí…Ô—õ’$IuÔÿÚ ùÛ ˆ,.Àk‹èíÛ™ú²^’$©–ª*Ê×ÿ`ú¶Š.Àk‹è\qZê»zI’¤ºj^ð¢ôm)\€×Ѻð%©/ê%I’êªó‰7¤o+ Há¼¶ˆò´g¥¾¨—$Iª«þmצo+&ÌüwEãœçG¹æéùÿ,Ä \€oªî¿=õe½$IR-õ{>¨ð˜ÊµGEëÂGg׺èíÛÑm.¾Z:p ûŸb .À7õö^–ø¦^’$©¾šoûƒômÀøüasóŠhoŸÞÞ­Q•w?ú{¥ó~#ýŸ—b .À7µ/?nD¯ä%I’†[gÇÉéÛ €Ñ+Oxj47,ö¶•Ñݽ)úû÷<¡÷JÍ·þÇôЏßÔÜøÂ!¼~—$I}ý[?™¾­²ùãñ¦_ŽöÖWE÷º·FÿU ÷JÍwüqþ¿1à›ÊÕG |(J’$Eýn”«Ÿ–¾¯¨÷«ü[¾8:»ÖEoßΈN£ö×J­‹þ<ýß“b .À·X¼%I’457ý~ú¶`éØßܼ"ÚÛ磷wkTå]#y§Ôú·ÿœþïN1à[t¯Ý8’ÃS’$iØuv¬MßV|gå Oæ†åÑÞ¶2º»7Eÿž´wJí­ÿ-ý¿Å@\€oѺì•iª$IRõ¿ú©ômÀ·™[õGGk˱‹_å߿횈~/Æ¥öûÿ1ÿ¿1à[4Îznê¡*I’T[ý^”kžž¾¯fÙÿú*ÿÎŽ“£·ogD§ã\ûòãÒÿ›Q ÄøVsË"Ú ©«$IR]ûéû `FøËÍó‰ööùèíÝÕÂ1iu>zBúGЏßfñö•$IÒÔ¹â´ôm0•NxJ47,ö¶•Ñݽ)úû÷DTULz§æÿ·%á|›/Ê%I’¦¡?C.{[L¼¹eÑXt´¶]ëþeÒ^;¦±Î•gæÿ÷&á|›Ö…/N=X%I’j«ß‹òÄïMßW“¤\{T47¯8øUþ_¸<¢SƬԽæ¼ôÿþq¾Myê3SVI’¤:k¾ýÓ÷À¸*×Íó9ø‡ý{·Fµ°?f¹î§ß‘þÿ„b .À#¨î¿=õp•$Iª«Î'Þ¾­ÆÂ O‰æ†åÑÞ¶2º»7EÿžˆªÊ~}3Vuoü·üÿOÄ \€GÐÛ{Yêá*I’TWýÛw§o+€‘›;,ëŽÖ–c£³k]ôöíŒèµ³_ÕŒ}½Ï¾/ÿÿ1à´/?.õp•$Iª­ªåIß—¾¯†©\{T47¯8øUþ_¸<¢Sf¿•™Èz_úHúÿKЏ ¹ñ…©‡«$IR5ßñÇéû  .åš#~•ÿ_½½[£ZØŸýúejêßúÉôÿ¿qA¹úˆÅ¿-'I’4 uv‘¾¯–dþðhœý¼ho[ÝÝ›¢¿ODUe¿n™Úúw\Ÿÿÿœ„ ð(úûoL=`%I’êªǧӷÀw4wX4Ö­-ÇFg׺èíÛÑme¿Z™©úwÝœÿ뀄 ð(º×nL=`%I’j«ª¢<éûÓ÷À·*×ÍÍ+¢½}þàWù7ïË~‹2óU_¿%ý×Å@\€GѺ쩬$IRµÞù§éû ˜]åê§EsÃòƒ_åÃÅQ=ðµì×%z„ª…ýé¿V(â<ŠÆYÏM=`%I’ê¬så™éû ˜ó‡GãìçüÃþÝ›¢¿Ïâ7jü«Z÷çÿú!á<š¹eí…ÔCV’$©®|ÐNßWÀô™;,ëŽÖ–c£³k]ôöíŒè¶²_…h©õ:ù¿¦ˆA¸añ!%I’4 UU”'ÿPú¾&[¹ö¨hn^ííóÑÛ»5ªÆ½Ùo=Tsþ’lö¯3Š%sCçŠÓRXI’¤:k]ø’ô}LŽrõÓ¢¹aùÁ¯ò¿á⨸#ûõ†FPyÂSÓíQ,™ ðZ¾8õ€•$Iª³ÎUg§ï+`Lÿähœû‚ƒØýÛ£÷ç¿QP³WyÒ÷åÿz$–Êx å©ÏL=`%I’ê¬çMéû åéÏŽÖ–c£³kÝÁ‰Ümf¿ºÐ˜T¾þÒ}R,™ ðT÷ß–zÈJ’$ÕY¹öGÒ÷0ZåÚ£¢¹yE´·ÏGoïÖ¨÷d¿¢ÐWžüÃé¿f)–Ìøz7]šzÈJ’$ÕYë¢?OßWÀ𔫈æ†å¿Ê÷¦¨îýRöëMXå)?šþë˜bÉ\€ï }ùq©‡¬$IRu¯>7}_59þIÑ8çW¢ýÞˆîî·Eÿ®›#ª*ûõƒ&¼ò´gåÿÚ&–Êøš_˜zÈJ’$ÕYÿžÏ§ï+`iÊÓŸ­-ÇFg׺èíÛÑmf¿jÐvà×Yö¯uŠ%sÇWåDÕO=h%I’ê¬<íÇÓ7ðØÊµGEsóŠhoŸÞÞ­Q•wg¿RÐŒÔø×ŸJÿõO±d.ÀãÐßcêA+I’Tg­wýuú¾ú—›–G{ÛÊèîÞÕ½_Ì~} ®qÆÏ¦ÿž X2àqè^»1õ •$Iª³îõoOßW0³æ–EcýÑ‹_åß½úÜèïß㛈5V5Öÿ|þïb©\€Ç¡uÙ+RZI’¤:«øZ,¬:$}cÀ¬|•ëÂGg׺èíÛÑid¿³Æ1ý÷ Å’¹Cã¬_J=h%I’êîÀß4ÈÞX0Øßܼ"ÚÛ磷wkTåÝÙ¯¤'\ã¬ç¦ÿ^¢X2àñ˜;,¢½zØJ’$ÕYû½ÿ¿±`‚•'<5š–G{ÛÊèîÞtð«ü¥)¨ñ¦ÿ3ý÷Å’¹SoߎÔÃV’$©Îz7]š¾¯`bÌ-[ü6½Ö–c¿Ê¿Û5U?ûã½4”çüJþï9b©\€Ç©sÅi©‡­$IRUͯ/~ËQöÆ€qþ*ÿÎŽ“£·ogD§‘ýQ^Y ¿–þ{bÉ\€Ç©uá‹S[I’¤ºkœóüôÙÊ5OæùÇD{û|ôönª¼+û#»”ZóÍ¿žþû’bÉ\€Ç©<õ™©‡­$IRݵ?ô/é F©<á©Ñܰ<ÚÛVFw÷¦èïß“ýñ\»šoù­ôß«Kæ<Õý·¥¸’$IuÖûâ‡Ó÷ Íܲh¬?:Z[ŽÎ®uѿ횈~/ûã¸4ö57¾0ÿ÷/±T.ÀлéÒÔW’$©ÖºÍXxÝw§o,¨C¹ö¨hn^'GoßΈN™ýÉ[šÈšoýÝôßÏKæ<¾&W’$išr£€IT®yz4Ï?&ÚÛ磷wkT wfÄ–¦¦æ¦ßOÿ=N±d.ÀÐÜø;©®$IRÝu>~RúÆ€ÇtÂS¢¹ay´·­ŒîîMÑß¿'¢ª²?RKSÛoÒHÿ}O,• 𔫈¨ú©‡®$IRõ¿rUúÆ€ÍõGGk˱ÑÙµîàWù÷ÚÙŸ¥™ªùŽ?Î? ˆ¥ržÛv¨ IDAT þþS]I’¤Zë÷¢<ñ{Ó7³©\{Ôâß6^ü*ÿ/\Ñ)³?)K3_ëš~6P,™ ðu¯Ý˜zèJ’$Õ]ó”¾±˜~åš#~•ÿ_½½[£ZØŸý‘XÒ#Ôºð%éçÅ’¹OPë²W¤º’$Iu×ùäúôÀ”™?<g?/ÚÛVFw÷¦èïßQUÙ%=ŽZ¿4ÿ !–Êx‚gýRê¡+I’Tw~ÄQöÆ`‚ÍõGGk˱ÑÙµ.zûvFôÚÙw%-±Ö%•®Kåz_¸Ü;siÊjýÛÿ“~ÎP,™ °½};R^I’¤ºs³€GRžôýÑÜôûÿ°ÿæ÷FµpgöGXIC®õ®¿N?{(–ÌX‚ÎÎSS^I’¤ºë^»1}clþðhœý¼ho[ÝÝ›¢¿ODUed•4âZ[^–Kå,Aë–zðJ’$Õ]õõ[Ò7#4wX4Î|N´Þý_£{õ¹Ñ¿}wD¿›ýñTÒä›"‹‰æ,A¹öGR^I’¤aÔxÃO¦ï,†£\{T47¯8øUþ{·FÕ¸7ûc¨¤1­uÑŸ§ŸYKæ,Qõ¯¤¾’$Iu׺ì•é €Á•'>#š›~/Ú^½›ßÕÂþ윒&¨Ö…/I?Ç(–ÌX¢îžKR_I’¤ºëîÙ’¾±x‚æÆú££uéË£»{Sô÷ªì˜’&¸Ö;ÿ4ÿl#–ÊX¢öûÿ)õð•$Iª»ªyßâÏ€ÌÞY<ºòôgGk˱ÑÙµ.zûvFt[Ù'%MYÍ ^”~ÖQ,™ °DÍ ËS_I’¤aÔ8÷WÓw•kŠææÑÞ>½½[£jÜ›ý±QÒ Ô|û¦ŸKæ,ÕñOŽèµS`I’¤ºkoŸËßY3¨\ý´Å¿xÖÞ¶2º7\ÕwdD”4£øäì3‘bÉ\€ô¿rUê,I’Tw¾>2{cL½ùã±þèh]úòèîÞýý{"ª~öGBIZ¬¹é÷óÏIb©\€tv‘zK’$Õ^¿åš#ÓwÀ4)Ov´¶]ë/^G·™ýéO’µæ[7ýܤX2`­‹_šzK’$ £æ;þ(}gLªríQÑܼ"ÚÛ磷wkT{²?æIÒª¹ñ…ég)Å’¹(Oÿ‰ÔX’$iu®|cúΘåê#¢¹ay´·­\ü*ÿêÞ/e¤“¤k¾å·ÓÏWŠ%sT=pGê!,I’Twý»?—¾±ÆÎܲh¬?zñ«ü»WŸýý{"ª~öG8Iª½æy¿‘æKå ¨wÓ»SaI’¤atàçSfï,€ì¯òo]øâèìZ½};#ºÍìj’4’|³IöL±d.À€Ú|Mê!,I’4ŒZ—½"}gŒòû››WD{û|ôönª¼;ûc™$¥Õ8÷éç2Å’¹jž÷›©‡°$IÒ0êîÙ’¾³†¡\}Äâßnmo[ÝÝ›~•¿$éÁçz{·FÕ¸'{zK’4ò:Wž™þL¦ˆ 0$>,H’$Mk³Ÿ—¾·`©ÊÕGDsÃòho[¹ø WÕ}_Ξؒ$E§¤?§)â IyÒ÷ùù_’$ijk_þ?Ó÷<.ó‡GcýÑѺô勨ßß¿'¢êgOjI’ƲÎGOÈvƒp†¨ÏçSiI’¤aÕ»åŠô­¤<ýÙÑÚrltv­‹Þ¾Ýfö|–$ibj_~\ú³œb .Àu¯ßœzHK’$ ­~/ÊŸ‘¾·˜måÚ£g{û|ôönªqOöR–$i¢k¿ÿÓŸïq†¨ýž¿K=¤%I’†Yë—¤ï-fG¹úˆhnXím+¿Ê¿º÷KÙ“X’¤©«½õUéÏ|ЏCÔ8û?¤Ò’$Iì{íÆô½À”š[õG/~•÷ês£¿ODÕÏžÀ’$M}­wýuþ á ÓܲˆöBêA-I’4¬ªU‡äo.¦â«ü[¾8:»ÖEoßΈn3{îJ’4“µ.~iú. ˆ 0d½/<õ –$If³~)}o0yØßܼ"ÚÛ磷wkTåÝÙ³V’$}³æ/Jß q†¬³cmêA-I’4ÌÚú—ô½Àø*W?-š'ÚúçèÝø®¨¾ñÕì +I’£æ[ÿcú~ ˆ 0dÍwüQêA-I’4Ìzûv¤ï-ÆÄüáÑxÓ/G{ë«¢{Ý[£çMU?{²J’¤'PãÜäo b.À•'}DU¥Ö’$IC«ß‹ò¤ïKß\ä|•ëÂGg׺èíÛÑid¯SI’4`õG§o Џ#пûs©‡µ$IÒ0k]üé{ €áÿasóŠhoŸÞÞ­Q•weÏPI’4„ÊS~,}wP Ä_y&I’4­u?}AúÞ >å Oæ†åÑÞ¶2º»7EÿžìÉ)I’FT¹úié[„b .À´.{Eêa-I’4̪ƽ±0·,}s°s˿귵åØÅ¯òïßvÍây’$I3XÕ…U‡æïb.À4Î|Nêy-I’4ìšçýfúæàñ•gÇÉÑÛ·3¢ÓÈž’’$iLªš_Oß*sFaÕ¡‹3N’$iZëì<%sðåš§Góüc¢½}>z{·Fµpgöl”$Ic\õõ[Ó÷ ÅÀ\€é}îý©‡¶$IÒ0ëßySúÞ˜i'<%š–G{ÛÊèîÞýý{"ª*{&J’¤ êÀ~Hß4Ä \€ioŸK=´%I’†]ã ?™¾¹fÂܲh¬?:Z[ŽÎ®u¿Ê¿×Ξƒ’$iÂëߺ+çƒrFäÀ×­I’$Msímÿ=}sL£ríQÑܼâàWùáòˆN™=ý$IÒvàÛ¬³wÅÀ\€)OxjD¿›zpK’$ ³Þ>”¾¹&]¹æÈÅ¿H²ø‡ý{·FµpgöÌ“$I3R÷†‹Ò·ÅÀ\€êß¾;õà–$Ij½v”«Ÿ–¾¹&Í uà…{uß—³$Išáº×¼9}Q Ì¡ÎUg¥Ü’$IîõÎ?Kß\“¦qÆÏfÏ8I’¤è\qZú.¢˜ 0B­Kþ*õà–$IvÝëÎOß\“¦qî¯fÏ8I’¤ÅA”½‹(æŒPyú³SnI’¤awàgÔ.¬:4}wL’æ¦ßËžq’$IÑ~ßÿ›¾‹(ß–.ÀhU÷ßžzxK’$ »ƒ-{sL’ÖEž=á$I’¢õ®ÿ’¾‹(æŒX÷ÆK=¼%I’†]磫Ó7À$i]öÊì 'I’­wþYú.¢˜ 0bí÷ÿSêá-I’4ìú·ïNß\“¤ý¡Éžp’$IÑ|ëï¦ï"й#Ö8÷©‡·$IÒ(*O{Vúî˜'gÏ7I’¤hœó+黈b`.À¨ÿ¤ˆn3õ—$Iv¾Æ6}wLˆî§ÎÉžo’$IÑ8ãçÒwÅÀ\€½[®H=À%I’†]ïæ÷¦o.€IÑýÌ…ÙóM’$)ÊS~4}Q ÌHÐÙyJê.I’4ô:XxÝ÷¤ï.€IÐûü²×›$IR”'<5}Q ÌHмàE©¸$IÒ(j¾ýÓwÀ$èåÊìé&I’f½ª «IßEs”'ÿPê.I’4Šº×¾%}wL‚þ]7gO7I’4ãUÍûÒ7E-\€$ý{>ŸzK’$ »jáÎX˜;,}wŒ»ª¼;{ºI’¤¯ºïË雈¢.@’îuç§ä’$I£¨ùæ_Oß]cmnYDUeÏ6I’4ãõ¿ú©ü]DÔÁHÒz÷ߤä’$I£¨sÅié» `œ•'ÿpöd“$IŠÞgß—¾‹(já$iœñ³©¹$IÒ(êßó…ôÝ0Îg>'{²I’$Ew÷ÛÒwE-\€,«Yü¹¸’$IÓ^ãÌ_Èß^cª¹ñw²çš$IRt®8=}QÔ³/]€<½›.M=Ì%I’FQûïMß]ãªuÑÊžk’$IѾü¸ô]DQ  Qû¯N=Ì%I’FQÿ«W§ï.€qÕ~ÏßgÏ5I’¤h]úòô]DQ  Qãܤæ’$I#©ª¢<õߥo/€qÔùÈë²×š$IR4/xQú.¢¨… iþ»":eê.I’4ŠÚïù»üí0†:W=Õ$I’¢ùæ_OßEµp’õ¾üñÔ]’$iõ¾ð¡ôÝ0Žº{.Éžj’$IÑ8ãçÒwE-\€d˜z K’$¤^'Ê¿7}{Œ9D’$Cåë }QÔÂHÖ|Û¤è’$I£ªuñ_¤o/€qÓßcöL“$I³^Õ…¹ÃÒwE-\€dåš§/¬’$IÓ^÷†‹Ò·À¸©š÷eÏ4I’4ãUå]雈¢6.Àèí3©»$IÒ(ªÚÄÂñONß^cãuß“=Ñ$I’¢çÞü]DÔÅ«ÎN=Ø%I’FUsÓï§o/€qÑø×ŸÊžg’$IÑÛ·3}QÔÆ­Kþ2õ`—$IUÝO“¾½ÆEó-¿•=Ï$I’¢wÓ»ÓwE}ÓÈWžöã©»$IÒ¨ªøZ,¬:4}Œ)D’$CÝ«7¤ï"ŠÚ¸c¢úú­©‡»$IÒ¨jœû«éÛ `´?ðêìi&I’Ÿ”¾‹(j㌉îgÞ™z¸K’$ªÎޓӷÀ8è|â_³§™$IR´ßÿO黈¢6.À˜h¿÷RwI’¤QUÝûÅôí0º{.Éžf’$IÑÚò²ô]DQ`L4Îznêá.I’4ÊgýRúþÈÖ»åÙ³L’$)šoûƒô]DQ`\ÌUó멼$IÒ¨ê|tuþþHVÝ·/{–I’$Eãœç§ï"ŠÚ¸c¤÷ù¦ð’$I£ª×ÍéÛ ÕªC"º­ìY&I’åéÏÎßFD]\€1ÒÞ>—zÀK’$²ÆúŸOß_YÊ×ÿ`ö“$IZ¬\ý´ômDQ`Œ4ßòÛ©¼$IÒ(;pù1{di¼é—³ç˜$IRD¯¾‹(j匓×}÷âA+I’4 õ¿ö™üý¤uáK²ç˜$IRT÷íKßEµrÆLÿÖ]©½$IÒ(kœñ³éû Cûƒÿ_ö“$IŠÞ-ŸHßEµrÆLgÇÉ©½$IÒ(k_~\úþÈÐýÔ›²§˜$IRt÷\’¾‹(jåŒñoJI’¤i¯Ûµéû CïsïÏžb’$IÑÙuFú.¢¨• 0fÊ5GFô{©‡½$IÒ(k¼áß§o0€Qëßusö “$IŠö_“¾‹(j匡þ×§ö’$I£¬ýW§ï/€‘ZuHD·™=Ã$I’¢uÉ_åo#¢N.Àê\yfêa/I’4Êú_¹2}ŒR¹öG²'˜$IÒbÍ¿“¾(j匡օ/I=ì%I’FZUEyÚ³Ò7À¨46üZö“$IZ¬±îgÒ·E­\€1Tžü釽$IÒ¨k¿ï¤o0€Qi]ò—ÙóK’$i±rõéÛˆ¢V.À˜êßóùÔ_’$i”õn¹"}ŒJûï͞_’$IQµîOßEµsÆT÷Ú·¤ú’$I#­ê/þ,Üì 0 ÝkÎË^_’$IÑ¿ëæô]DQ;`Lµþí?§ú’$I£®ýž¿Oß`£ÐÛ·#{zI’$Eï‹ÛÓwEí\€1UžþìÔC_’$iÔõ¾ü±ô 0 ÕÂþìé%I’Ýëßž¾‹(j猱ê_I=ø%I’FþcNùÑô 0Lå‰ÏÈ^]’$I‹uvœœ¾(j猱îg.L=ø%I’F]û}ÿ#}ƒ SãÜdO.I’¤ÅÚÛV¦o#ŠÚ¹c¬ýž¿K=ø%I’F]ÿ+W¦o0€aj½ë¯³'—$IÒb­wþYú6¢¨ 0Æg>'õà—$Iʨñ†ŸLßaÃrà«v%I’Æ¡ßL”½(j猳U‡DUÞzøK’$ºö‡þ%‡ Iï¦wgÏ-I’¤ÅÊÓž•¾(j猹ÞÞ­©‡¿$IÒ¨ëßq}ú–þ7eÏ-I’¤ˆªŠ…㟔¾(j猹ö^zþK’$eÔXÿóé;  vsË"zíì©%I’ÕÂþümD ƒ 0æçüJê@’$)£ÎG^—¾ÃêÖX÷ÓÙ3K’$i±þí»Ó·ÅP¸ãnnYTíR’$I£®Ïòw@Íšoÿ¿³g–$IÒb½ÏnKßFÃÙœ.Àøë}ñéI’¤Œgÿ‡ôP'?êQ’$KÝkÞœ¾(†Â˜íís©I’¤Œ:;Ö¦ï0€:u¯ßœ=±$I’ë|äøômD1.Àhž÷©I’¤Œª¯ß «Ißbuéßñéì‰%I’´XëÝÿ5}Q … 0 ŽRD§‘ú $Iʨ±á×ò·@æèµ³ç•$IÒbÍ/ÌßGÄ0¸¢÷¥¤>$I’2ê|r}ú¨C㿘=­$I’¬<ýÙéûˆb(\€ ÑÞ>Ÿú $IʨzàŽX˜;,}‹ ªuÉ_eO+I’¤ƒõ{‹ßN”½(†Â˜Í·üVê³@’$)+_ILƒÎÎS²g•$IÒbÕ}ûÒ·Åи“âø'Et›©I’¤ŒºWoÈßbê}þÙ³J’$i±Þ—?–¾(†Æ˜ dI’¤Y«jÜ»x2{‹ ¢ºÿöìY%I’´X÷º·¦o#Š¡q&Hç#ǧ>$I’²j]ð'é[ `©Ê×ÿ@öœ’$Iz°ööùô}D14.Ài¾å·S’$IYõnzwúXªæùÇdÏ)I’¤kmyYú>¢Þöt&ÈñOŽè6S ’$I)õÚQžôýù{ ` ÚïÿÇì5%I’ô`Íó~#}Q 0az_þxêCA’$)«öÖW¥o1€¥èîÞ”=¥$I’¬<õ™éûˆbh\€ Óùè ©I’¤¬ú·îJßbKÑ¿soö”’$I:X¯ s‡¥ï#Š¡q&Lsã SŸ ’$I™5Öýtúx"Ê5GFTýì%I’´XÿžÏ§ï#Š¡r&Íë¾;¢ÛJ}8H’$eÕùÈñù{ à hžLö„’$Iz°Þ.OßGÃÝŸ.ÀäéíÛ™úp$Iʪºï˱°êô=ðxµ/?.{BI’$=X÷ê éûˆb¨\€ ÔùØšÔ‡ƒ$IRfÍ ËÓ÷ÀãÕ»éÝÙóI’$éÁ\NÌÞGCåL æùÿWêÃA’$)³î§ÎIßcWuÿmÙóI’$éÁZ¿4}Q • 0‰^÷=½vêB’$)«ªqo,ÿ¤üMð”§üXöt’$IzHs_¾‘(†Ê˜P½[>‘ú€$IʬuÁŸ¤ï1€ïäÀf‘$I§Ê“8}#Q • 0¡:;1õ!I’”ÙŸ¥›½Ç¾“ÎŽ“³g“$IÒÿ®Óˆ…U‡¤o$Š¡r&Tó­¿›úŒ$IJ­×Žò¤ïOßd¥÷¥d¯&I’¤ëßySú>¢:`R½î{_|K’$Íjí­¯ÊßdfÕ¡Qµ¾‘=™$I’¬÷Ù÷åo$bØ\€ Ö¿uWêƒB’$)³þ­ŸLßc¦ñÆ_ÌžK’$I©sÕÙé‰bè\€ ÖùØšÔ…$IRvõG§o2€GÒ~ÏßgO%I’¤‡ÔþÀ«Ó7Åй¬yþ1© I’¤ì:;OMßd¤{ÃÅÙSI’$é!5ßñÇé‰bè\€Ivü“#ºÍÔ‡…$IRfÕÂþX˜?<—|›êþÛ³§’$IÒCjœñsé‰bè\€ ×ûÒGS’$IÙ¹½Œ›ÆºŸÉžH’$I­ß…㟔¾“(†Î˜píís©Ï I’¤ìz{·¦o2€oÕºôåÙI’$é!õïþ\úF¢ `Â57,O}`H’$¥×ïF¹öGÒwÀÿÒ½~söB’$IzH½›ß“¾‘(F˜tsË¢jÝŸúÐ$IÊ®ý¡ÎßeßT}ý–ìy$I’ô:Wœ–¾‘(F˜½Ï¾/õ¡!I’”]ÿ®ÏÆÂªCÒw@yÚgO#I’¤‡ÕºôoÓwÅH¸S ýW§>4$I’Æ¡æ›=}—´¶¼,{I’$=¬æy¿‘¾“(F˜³Ÿ—úÐ$I‡º×Ÿ¾Ëº×œ—=‹$I’Vyò¥ï$Š‘p¦ÁªC£jÜ›úà$IJ¯½åê#ò{I’$=¤ªy_úF¢`Jôn|WêÃC’$ij½ûoÒw0»ÊÓ"{I’$=¬þW®LßI#ãL‰ö{ÿ!õá!I’4õoÝ•¾Ë€ÙÕÞúªì9$I’ô°º»7¥ï$Š‘q¦Dcýϧ><$I’Æ¥Æú£Ó·0›z{/ËžB’$I«}ùqé;‰bd\€i±ê¨¸#õ"I’4uvžš¿Í€Ù3xT­odO!I’¤‡ÕzçŸæo%bT\€)Òýô©I’¤q¨Z¸3ŽRú6fKó¼ßÌžA’$IXãÌ_HßJ£Û¥.Àôh]ú·©I’¤q©uñKÓ·0[:}ö’$IzxU?ŽrúV¢`Š4ÞðïSŸ!’$IãRoߎômÌ–þí×eO I’¤‡UÝûÅôD1R.À”©îûrêƒD’$i\òõvÀ¨”'ÿPDUeÏI’¤‡ÕûìûÒ·ÅH¹S¦{íÆÔ‰$IÒ¸Ô¹òÌôm֖̆—eOI’¤G¬ó‰MßJ#åL™Ö–cS$’$IãRÕº?ÊÕG¤ï3`úu?ýŽìé#I’ôˆµ.{eúV¢)`Ê”§ühêƒD’$iœj]ú·éû ˜r«jáÎìÙ#I’ôˆ5ßòÛù{‰%` õïº9õa"I’4.õo߾̀éÖØðkÙ“G’$éQ+ו¾—(FʘB«ÎJ}˜H’$SsžŸ¾Ï€éÕÙyJöÜ‘$IzÔ¸°êô½D1R.Àj^ð¢ÔŠ$IÒ8Õ½vcú>¦WÿžÏgÏI’¤G¬ÿ•ÿŸ½û޶ë.¼ä†S ¦$”@èeH2 ï˜0“À’I&„$+¡$fH@WͶ,¹a¹á^pÅ6¸á*ÜKÜ{ŽwÉ–÷>uïý{×½æullI÷J÷Þgïs>Ÿµ¾ÿe%èÞçÑÙÏ9ç’ð]I­YÏ€4„åÛ¾<¥²*µÑo§|»W†ïh’$iøjïþ¾èM`µ—ï¾/©5ë9†´òÞ‹C‡ @ôNùçðýL’$ _½3çE¯9«Õ;ù›áû’Z³žiH럽MèP¨“ò‘›|ç$IšöÊ®Š^sV«sÀ ß—ÔšõHCZgÿ…€ºé°uøŽ&I’†§|§7§TUÑ+Àjå‹_¾3©5ë9†µù§ª÷Tè`¨“ÁõÇÄïh’$ihÿŠ!€ºªVݾ/©’iˆ+nþYèp¨•²HùÎo ßÑ$IÒpTÜu^ôv°ZÅ-§„ïKj…ä@âz'ÿSèp¨›þyKÃw4I’ÔüòÅ[NÔUÿ¼%á;“Z!9†¸önï .uSµW¤lÑæá{š$IjvÝãþ>z­X£î1Ÿß™Ô É€4äUOÞ:`ê¦{ÂWÂw4I’ÔìŠ[O‹^iÖ¨½ÇÂw&µBr yƒ« 0uS>zKÊÆæ„ïi’$©™åÛ¿&¥r½Ò¬^ÑOÙüMÂ÷&µBr yÝcþ*tÆÔQçàÿ¾§I’¤fÖ;埣W€5*º6|gR+,Ò—/Ù*¥ª 4uSÜrrøž&I’šYyßeÑ« À ®>,|gR+,Ò4~éÀ³TUj/{gøž&I’šUû¿½Å¬Uïôï†ïMj…å@úì:hê¨ñá{š$IjVý³E¯0kÕ9ä“á{“Za9F ñ_ôüŠ~žòí^¾«I’¤æT>ö‹è `­òÞ¾7©–iZøâ”ÝÐaPG½S¿¿«I’¤FÔÞ÷÷¢W€µªÚ‡ïMj…æ@‘Š;Î8uT­¼+eó6 ßÕ$IRýë_²gôê°Vãσ¢÷&µBs H½åß 8uÕ9âOÃw5I’TóæoœªüÑèµ`­úï¿;)Eæ@‘Ú?üÏ¡ ®Ê{/ ßÕ$IR½ëöéè•`RºÇ)|wR+vwu Hó6œøÞž¯³ßGã÷5I’TÛ×½®LJ{Ÿ…ïNj…æ@¡×:tꪸù¤ð]M’$Õ³|ÉkS*úÑë ÀÚUeʽ$|R+4ÒÕ=þË¡s ¶ª*µw{Oø¾&I’êWoù÷¢7€I)¿-|wR+<Ò•ïô¦ÐÁPgƒ+ß×$IRÍÛ U+ïŒ^S&epÃOâ÷'¥èH#VùÈM¡Ã ¶Š~Êw|cø¾&I’êSçOFo(“Ö;ã_Ã÷'µÂs Xý :|ê¬á.áûš$IªOÅÇG¯'“Ö9èáû“Zá9F¬Î!:|j­—¥|ñ«Âw6I’_¾ôuŸÐU•òí^¾C©žiÔZ°iJý¥Vír )õÏZ: š¤{ägÃ÷7I’4=y÷?Ðdý‹wß§Ôª]$¥ö¾¿: š¤|ô–”ÍÛ(|‡“$IëW{Ù»|-"ÐhÝŸüMøN¥Vír )eó6LU{Eèh’îq_Œßá$IÒz5¸öÈè•`½´woøN¥Vír i¢ÁµG…)€&©VÝŸ²…/ßá$IÒºÕÞíÝÞý4ZÕ}râ žÑ{•ZµË€¤‰ºÇ~!tP4Mï´ï„ïp’$iÝ\wtô*°^Š[O ߩԪe$M”o÷Ê”Ê"tX4ÉøW(åÛ½"|“$IS«½Û{¼ûh¼ÞÏÇÂ÷*µj™IÏTÞsQè°hšþÙÛ„ïp’$ij ®?6z…Xo¶߫Ԫe$=Soù÷C‡@ãô²”/ymø'I’&W{÷÷z÷?Ð|å å‹^¾[©UËHz¦öWMÔ¿xð=N’$M®â†ŸF¯ë­¼ï²ð½J­Úæ@Òsªž¸;th4NÑOí]Þ¾ÇI’¤5×ÞûwSªªèÍ`½õ/Ú5|·R«¶9ôœ—î:´šhpÍá{œ$IZCcsRq÷…Ñ+À´èõ¿â÷+¥ºæ@ÒsêöéСÐHU•:û}4|—“$I/\÷ǽ-L›|‡7„ïWjÕ6’žÛÂÍRê硃  ‰Êû/OÙØñûœ$Iznó7Iåã·E¯ Ó¢ZqGü~¥TçHz^Å-§„/€¦êóWỜ$Izn½Ó¿½"L›ÁÕ‡†ïWjÕ:’žW勞…/€¦ªž¼/e‹6ßç$IÒÓåÛ¿:U'¢W€iÓ=á+á;–ZµÎ€¤ç•ïøÆÐáÐd½3ç‡ïs’$ééú—ì½L«öîï ß±Ôªu$½`åÃׇ0€Æê·'*£÷9I’F½ö²w¦T¢7€i3þÉFÙØá{–ZµÎ€¤¬ÞÒÐ!Ðdƒ«~¾ÏI’4ê·œ½L«â–SÂw,µjŸI/Xgÿ…1€F«ªÔÙ÷#á;$I£ZçÀGoÓ®·üûá{–ZµÏ€¤nÞF©j¯dMVÜ}aÊÆæÄïu’$Zó7IåÃ7D¯Ó®sÀÖñ»–RÝs iµ ®9"t4]÷˜¿ ßé$IµzË¿½L¿¢Ÿ²E›‡ïZjÕ>’VÛø Ö¬»ê©‡R¾Ý+Â÷:I’F¥ö.oK©ßŽ^¦]yï%á»–ZÈ€¤Õ–o÷Ê”Ê"t 4]ÿ’=Ã÷:I’F¥â–“£G?ÀŒè_¸Kø®¥V#r iw-ë¡*S{Ÿ…ïu’$ {Ýc>=õfL÷Èÿ¾o©ÕˆHZc¾7`ý•÷_ž²y†ïv’$ kù¶[¤jÕÑ#`ÆäK_¾s©ÕˆHZcí=Þ:ІEïgßßí$IÖ—í=êfLùø­áû–ZÉ€¤µV­¸#t° ƒªûdÊ—¾>|·“$iØjïý»_¹0¬—í¾s©Õ˜HZký‹–…6€a1¸æˆðÝN’¤¡jÞF©|ðêè0£º?þóø½K©)9´Ö:~ö‹”-Ü,~Ç“$©áµw{wJƒNôh˜QåC׆ï]j5*’&ÕàêÃBÀ0響cø~'IR£›¿q*ï»4z¤̸þ…?ˆß½”š”I“ª{ÔçBÀP©ÊÔÙ÷#á;ž$IM­îâèi0+:‡}:|÷R«Q94©òE/ñ±zÓ¨|䦔-Ø4|Ï“$©iÑ¥²ˆå3¯,R¾íËÃ÷/µ•I“®øÅ©¡s`ØŒ¿{1zÇ“$©Q-Ú<•ß=ÂfEyïÅñû—RÓr iÒuOøJè :å µøŸÃ÷rcʼ(|ד$©îuÿ“è± 0«:}"|S«q94¥Ê{/ vèÖ‚ð=O’¤:—oÿêT=õPôȘ=ƒnÊn¾‡©Õ¸HšR½åß wC©è§ößõ$IªkÅM'FOk€YUÜqvø¦V#s iJµw{OèÀVåC×¥lÁ¦áûž$Iu«{ü—£Ç4À¬ëý|,|S«‘94åÊÇ~:ô†Uÿ¢]Ãw=I’êT{÷÷¦ÔÏ£G4À¬kïû{ỘZÌ€¤)׿`çС0´ªjâiÑûž$IµhÑæ©|äÆèé 0ëªÞS)›¿qü>¦ÔÄHšrý?:ø†Y•=œò%[…ï|’$E7¸êGÑc DqËÉỘZÍ€¤©7oÃTe„?€aVÜrJÊÆæÄï}’$Õ=þËÑã LïÔ ßÇÔjl$­Sƒ+ ~î{ÂWÂw>I’"jïùÁ”úíèQ f|ŠÞÉÔjl$­SÃ?:ü†Þ “Ú»¿7|ï“$i6Ë·{eªVÜ=…ÂTùc)Û |/S«±9´n-ÚÜ5>À +ï¿"e ^¿ûI’4ÍÛ0·ž=~B ®?&~/Sjr$­sÅM'†A€Qпxð½O’¤Ù¨îöÑc \ïį†ïej5:’Ö¹îq:FE÷ǾûI’4“uø³”ª*zä„kÿà7Ãw3µIë\¾d«”ª2tŒ‚ª÷Tj/{gøþ'IÒLÔÞý}©ê®Š·áÊÇo ßÍÔj|$­WÅç†C€QQ>zsÊ·yiøþ'IÒt–/Þ2•ß=fj¡ѲðýL­Æç@ÒzÕ;ù›¡Ã`” ®9"|ÿ“$iÚš¿I*î<'z¼ÔFç?ŒßÑ”šžIëU¾Ã|GÀ,êÿåðP’¤éhpÕ¢Ç*@}ôÛ)[¸YøŽ¦Vãs i½+ïù÷Й0RÔÞë·Âw@I’Ö§ÞòïEOT€Z)nþYøŽ¦ÖPä@Òz×;í;¡C`ÔT+ïœøÎäè=P’¤u©{ô_ú4A€_Ñ;éká{šZC‘Ië]¾Ó›ýÃ`–w?ñÝÉÑ» $IS©³ÿÇRt£Ç(@í´wykø®¦ÖPä@Ò´TÞEè`Eƒ+ ß%IšlíÝÞªöŠèñ P;å#7…ïjj M$MK¾» FïÄ ß%IZ[ùÒ×¥jå]Ñc –ú쾯©5494-µw}GèpYE?uØ:|”$iuåÛ¾<•^=1j«sÐßÙÔšHš¶Ê‡® £ªj?žÚ»¼-|”$éy-Ü,w=*ê«—¥lÁ‹â÷6¥aÉ€¤i«Ö‚Ð 0ÊÆ1óm^¾J’ôLó7NÅ-'GH€Z+n:!~oS¦Hš¶Ú»¿/tHŒºâ–SR6o£ð½P’¤llƒ4¸öÈèÑP{Ýþ!~wS¦HšÖÊGo ”£npù~á;¡$iÄ›“ú—ì=!ßéMñû›Ò0å@Ò´Ö?wqè  ¥ÞÏÇÂ÷BIÒèÖ?oiô(hÌ×ùEïnj ]$Mkí½~;tXRªªÔýÉ߆¤Ñ«ÎvÑS 1úç﾿©5t94íU+n˜¤”Š~êüỡ$itꟽ(zú4J瀭Ãw8µ†.’¦½þ;…LžVuŸLí=>¾J’†¿ÞòïG=€Æý›=›¿Iø§ÖÐå@Ò´×ÞçáC€ÿP=y_Êw~KøŽ(IÞzg΋wSÜðÓð=N­¡Ì€¤éolNªž¸'tpðÊÇoKùÒ×Ç¤¡«ÖÂè1ÐHÝ㾾˩5”94#õÿ}·ÐÁ Às•]—òů ß%ICÒØœÔ¿`çèñÐLU•òÞ¿Ó) c$ÍHýÿŸÐÙ Àó•÷]šòm^¾+J’†àáÿEË¢Ç@£ÿ}¾Ó) k$ÍLó6LÕS…Pž¯¸ãì”-Ø4~_”$5³y¥Á•G3€Fë-ÿ^ü^§4¬94c .ýaèà…7Ÿ”²ù‡ï‹’¤†µ`ÓTÜtBôh¼ö²wÅïvJÚI3–¯¨¯ÁµGM¼‹3zg”$5£|Û-Rqç9Ñã  ñÊGn ßíÔêHš¹Æ6HÕ“÷…RVopý1Ž$Ik-ßþ5©|àÊè±0úçl¾ß©5Ô94£õ/Ú5t°fƒkLÙ¼ Ã÷FIR=kïòÖT>ö‹èq04Ú{ÿ—ðO­¡Î€¤­½Ï‡B)k7¸îhŸ Iz^ã/NWÙÃÑc `hŒjr66'|ÏSk¨s if›“ªw„TÖ΀$éÙuÿLJýxuè|`êʯIù’­ÂwIIÒô×;éë)ýèQ0ô×¾û©5294kõÎø·Ð Àº)½%å;½)|Ÿ”$MS _œW=^FF÷˜ÏÇï€J£’I³V¾óo¤TU¡C€uS­z µ÷üOá;¥$iýÊw|ãÄW¼0KŠ~Ê·{Eø¨ÖÈä@Ò¬VÞ{Ièœ`ÝU•©³ÿÇÂwJIÒºÕùѧRÕ^=NFJqëiá{ Z#•I³ZïÔo‡ZÖÓ “:Güiø^)IšBó6Lý³·I©*£§ÀÈéžð•ø}Pi”r iVË—¾Þ MW^À¤†”/Ù*·=9FSU¦|éëÂwBµF*’f½â®óBç-Ó£Ö‚ðÝR’´ú:‡|2UÙ#Ñã`dw_¾ª5r94ëõNüÇÐ Àô\q`Êæo¾cJ’žÕ¼Rÿ¼¥)UUô˜i½Ó¾¿*Z$Ízùö¯I©„]¦OqÛò”o»Eøž)Ij¥ö.oKå½Gª*å;¿%|?Tkär )$ß?0\ʇ¯OùNo ß3%i”ëû…TõžŠ Œÿ;ùÞ‹Ã÷CµF2’Bê÷÷¡ƒ€éW­z µ÷úíð]S’F­|ñ–©¸ñ¸è1À³ôNùVøž¨ÖHæ@RHùv¯H©è…_¦ßø;O;?úTø¾)I£RçO¦ê©£ýð«ÿ¿ã¯‡ïŠjd$…åÝ Cª,Rïôï†ï›’4ÌåÛ¼, .ÛgâÅeꥸëüð}Q£›Iauø³Ð ÀÌ\sDÊn¾wJÒ°Õ9ø¤ê‰{¢Í°½“¾¾3jts )®ù›¤*,t0³Ê®LùŽoŒß=%iò®€¨Ê”/}}øî¨ÑÍ€¤Ð—î:‡˜yÕªûS{ïß ß=%©Éu~ô)ïúh€â޳ÃwGv’"ëì÷ÑÐA À,tSïäo†ïŸ’Ô´ò%¯Mƒ«‰þ-À$uOøJø©Ñ®ã@RhcsRµâöÐa Àì)nøiÊ·Ý"~•¤º76'uý‚¯Îh’²Hùö¯‰ß%5ÒuHŠ®ÖÂÐy Àì*¹1µw{wø*Iu­½ûûRyÏEÑ¿®˜¢â¶3ÂwI©ã@Rtíüfè@`öU½§R÷˜Ï‡ï¢’T§òm^–úìœRÑþ5 À:èþäoÃwJ©ã@R*ï½8t(cpÝÑ)ßöåáû¨$…ÜÿQŸKÕ÷DÿZ`] :¾òN©9T‹z'}-t.§Zygêìû‘ðT’"jïñTÜu~ô¯b¦áÀ=z·”2’êR¾xË”Š^èp PÑO½åßKÙ¼ ÃwSIšòí_ú—ì•RYDÿ`tÿLøŽ)e$Õ©â¦B‡3ñŠ;ÏIùNoßM%iÆZ°iêþSÕy"úW.Ó¤j¯HÙ‚ÅïšÒ\’jÔø÷@êç©wúwS6¶AøŽ*IÓYçÐ?JÕŠÛ£Ë0Í—í¾kJÙ/s ©>-Ø4U•¡C€ú(n==å;¾1~O•¤õ¬³ßGSyïÅÑ¿V˜!¶ß9¥ì—9T«—ï:¤¨—ªûdêÿå”Í ßU%iªµw{w\wtJUýë€R­º?eó6 ß=¥ì—9T«:û,tPPãOØù7Â÷UIšL㿯W–RUFÿú`†õÏß1|ÿ”²gå@R½›“ª•w†kjªŸ§ÞéßMÙüã÷VIzò¥¯KýKöL©èGÿÆ`–´÷ü`ø*eÏÊ€¤ÚÕ?gÛÐa @½•]›Úû|8|o•¤ÿ¿|ûפþyK&•­ŸFï¢Rö+9T»Ú»¾#t`ÐU™ú—ì•òm_¾¿JÝò¥¯Oý‹–¥ÔoGÿV @ï”ßI¥ìWr ©–•÷]:´h†ªýxêüÍ”ÍÛ0|‡•4:åK¶úå;þ=øYE?åÛ¿:|7•²_É€¤ZÖûÙ7B¸”' IDATç6ÍRÞEêìû‘ð=VÒp×Þõíipù~) ºÑ¿öVÜðÓðýTÊ^ ’jÙøÕÜøõLZU¥ÁÕ‡¥|‡7„ï³’†«ö' ®?fâëG`\ç°?ßS¥ìr ©¶7:¼h¨^–úg-Hù¢—„ï´’š]ç O¤â¶åѿը™ê©‡R6ãð}UÊ^ ’j[ç°O‡pšÿ‚Lïį¦lÞFá»­¤5“Ô=ö¯SùÀ•ѿƨ©þ;Åï­ÒÜ΀¤ú6o£T­º?tˆÐ|壷¤îQŸKÙØœøWR­¿Š®wúwSõä½Ñ¿¶¨¹öïß_¥l59Tëúç- â âî S瀭Ãw\IõjüÅÛÁ¤4èDÿš Êû. ßa¥l 9TëÚ»¾=¥ª æ —âî RçÀßßu%ÌÿQŸKÅmËý›€)éøñû¬4wõ9TûÆ_ €éVÜu¾OF¬|éë}Ì?ë®è¥|ñ«Â÷Z)[C$Õ¾îOÿ.tž0ÜŠ[OOý?¾÷Jš¡æm˜:?úT*n:1¥²ˆþ•@ƒ ®=*~¿•æ®9’êߢÍSÕ]:Ô~åýW¤î±_HÙØñ;°¤õ.ßñן~·ÿÊ;£½0$:ÿAøž+ekÉ€¤F4¸â€Ð¡Àè(ºîéC€ù‡ïÁ’¦Ø‚MS÷¨Ï¥â¶å)UUô¯†Hõä}Ÿ.¾óJsלI¨³ïGB;£§ZyWêòÏ)ßæeáû°¤546'uöû¯ipÙ¾©ê>ý«€!Õ?wqüî+Í]{$5¦ò‘C‡;£iü먗í“Ú»½;|'–ôµ—½+õΜŸÊÇo‹þ5Àh/{gø,e“È€¤Æ4þݦ*'>V¼sèM¼ã8z?–F±|éëSïäo¦â®ó£#0BŠ»/ß…¥l’9Ô˜ò%¯M©„y7þéT½“ÿ)åÛ½2|O–Fáß‚½ÿ1wœRYDÿø0‚ºÇ}1|/–²Iæ@R£*n:!tÈÀs ºipÝÑ©sÐ'|*€4å‹_•ºÇ~!7è€XývÊ·}yøŽ,e“Ì€¤FÕ9üOBç<¬ñSNùVÊo¾7KM,ßñ©÷³ox§?µ2¸êGỲ”M!’šÕ¼RõÔƒ¡ÃÖ¨,RqÛò‰w/g _¿CK5®½Û»Sïôï¦â®óSªªèŸ^xžÎþ ß›¥l 9Ô¸úçï:ì`²ªöã©É^©½Ï‡Ã÷h©Íß8uüxê_´kªVÞý# kT>r“¯{SjZ$5®ö²w…|Xåc¿Hý³¦öîï ß©¥Ù,ßñ×S÷ø/¥â†Ÿ¦ª»*úG&mükÞ¢÷i)›b$5²òž‹B‡>¬jÅï€îìû‘ðÝZšöæm˜Ú{ývê9?•÷_î£ýh¦A7å‹·Œß¯¥¹SË€¤FÖ=î‹¡s¦ó#%ûg/Jí½~ËGKª™ÍIíÝß7ñî¨â–“SÕ{*úÇ ÖÛàêCãwmiîÔs ©‘å‹^âE%†N•=œW’ºG}nbçÞ»¥Õ•/yíÄßÓÁeû¤êÉ{£t`ÚuöûhøÞ-eëImpÅ¡ÃfT/KÅÇ¥îqŸò¥¯ß¿5Úå;ÿFêþäo&þV>~kôǪòáÂwp)[ÇHjlí}>ºÀlªVÜ>ñnë‰OØv‹ð}\#ðÀÿØ/<ýÿ•wFÿõ€YÕ;ù›á;¹”­c$5ºò+C—QôRqç9©·üû©½Ï‡S6ãðÝ\Ímüë&:l=ñ÷©¸ù¤TåFÿ €8ývÊ·{Eøž.eë˜I®{Â?„îP ý<·Ÿ™zgÎO?ž²…/ßÕUÓÆæ¤ö®oOÝcÿ:õ/Ù+•^RYDÿ €Ú\uHüÞ.Í]÷Hjü;Uªî“¡ËÔNÑOå=¥þù;¦î‘ŸMùŽo ßÝм S{·w§î1•úî2ñ©Uç‰è¿Pkã_?¾ËKs×=’ßø»V€5«žz07˜z?Kƒÿ åÛ½2|—×4¶ðÅ©ýÃßIÝŸþ]ê_¼{*î¾0¥^ý×¥¼ÿŠøÝ^š»~9ÔøÚ{¼?t!€¦ªVÝŸŠÛ–§þE»¦î±_˜x·øø»Æ£w|­¡ù?ý®þ£>7ñ•ƒëŽNåÃ×û˜ãµá;¿4wýr i(šxw °þúy*ï½$ .ß/õNûNêöé‰ïŒð½÷LcL|mCçÀßOÝþ!õ/Ø)7ŸÊGoN©Dÿ €¡TµWL|²Vø¿¤¹ë—ICÑø»•€Tô'@?ˆîŸ¿Cêÿ¥Ô9è¿?}°àEáÿ&hZù¶/Ÿø4³ñ‹ÞI_KýówLÅÇ=ýnþA7ú¿m9ý vÿw‚”MC$ G 6MUþXèr#«ªžþ:»/Hƒ«Kýs¶K½¿š:‡ÿIjïó¡”ïøë£s$0o£”/}}jïùŸRçGŸJÝŸüMêñoipéSqóÏ&ðWÝUÑÿÏV•©½ËÛâÿ=!Í]ÿHšÆ?¨¯ñ£ÝñàÅmËÓàš#Rÿâ=RÿìE©wÊ·&”¿¾³ßG'¾ã>ßá×R¾Ý+&¨‡ücþ&ÿûóÞüôÃü¶N#þtâ;A{§þKꟽÍÄŸpÍ᩸ý̧ìgGÿ¿XÅ/N Æ!eÓ”ICÓøGŽ¿ó2e1ñ}œÕ“÷¥jÅí©¼ÿò‰Æ žÓ ?MƒëŽ^mÅ-'?÷þÎsžþÏzø†‰ÿÜ*4U•Ñÿ׳lü9ú‡”MS$ UÅí?]€æ¨VÞ•²y†?ß²iÊ€¤¡ª{ägC 9z§7üÙ†”Mc$ Wó6JÕªûC— úí”/~Uü³ iîôå@ÒÐÕ?{›Ð}¨¿Áeû†?Ó²i΀¤¡+ßñ×S*‹Ð¥¨·öï¦!eÓœICYqóI¡KP_ÅmËßeHÙ ä@ÒÐÿrx¶Î¡þ,CÊf ’†³± RµòÎÐ娟òñ['ž#„?ËæN$ m½åß] €úéýìáÏ0¤l†r ihË—¼6¥¢ºDõQuW¥|›—…?òÊ€¤¡npÍ¡‹Pý‹v v!e3˜IC]{Ÿ….@MTejïòÖðgR6ƒ94ô•÷^ºOñ7ü$ü™…”Íp$ }Ýc>ºPñÚûþ^ø3 )›áHþæoœª'ï ]*€8å}—Æ?¯æÎ|$D½3ç….@œî‘Ÿ V!e³I#Q¾ý«StB— `öU+ïLټŸUHÙ,ä@ÒÈ4¸òàИ}½“¿þŒBÊf)’F¦öž ]0€ÙUµW¤|ÑKŸQHÙ,å@ÒHUÜu~è¢Ìžþ¹Û‡?›²YÌ€¤‘ª{ÔçB `–ý”ïðkáÏ&¤ls i´š·Qªž¸'tßfÞàªCâŸKHsg7’F®Þÿºp3¬ªR{÷÷†?“²Y΀¤‘+ßî)õ²Ð½˜9ÅM'„?²€HÉ—íºx3§³ïGŸEHY@$díÝÞ3ññ?Àp)î:/ü9„”å@ÒÈVÜ~fèL¿ñ ÑÏ ¤,(’F¶ÎẀӫ|èÚ”Í !eA94ºmª·‡."ÀôéóùøçÒܸHéz§~;t¦GõÄ=)›¿qø³) Ì€¤‘.ßæe©ê>ºë¯wÒ×ß;HYp$|ý‹w]H€õSe§lá‹ÃŸ9HYp$|ùÎoI©„.&Àºëñ¯áϤ¬9¤¹­4¸ö¨ÐÅX7U牔o»Eø³)«A$in+µ÷ø@JUº S×?kAøs)«I$é—·Ÿº SÔËR¾xËðg RV“HÒ/ëò‡¡; 05ýó–„?_²å@’žUùÀU¡‹ 0IƒNÊ—¾.üÙ‚”Õ(’ô¬ºÇ~!tW&§Ѳðç RV³HÒ³›¿qªž¸;taÖ¢è§|§7Å?WæÖ+’ô+õNývèάÙà²}ß'HY s I¿Ú¢ÍS•?º¸kx÷ÿÎo‰ž Í­_$éꟻ8tw^Øà²}Ÿ#HYMs I/P¾d«”ÐøÞý/¥5å@’VÓàòýBw๗îþü@ÊjœIZMí]ß‘RU†.2À³Þý¿Ó›ÃŸHYs Ik¨¸ñøÐ]xZÿ’½ÂŸHYÍs Ik¨³ïGB—`üÝÿ=ïþ—æ®=’´–Š»/ Ýi`Ôõ/Ù3üy”5 ’´–:‡&t©€‘6ñîÿ7…?/²ä@’ÖÖØ©|ôæÐÝFUÿâÝãŸHs›‘IšDÝ㿺ÜÀHê·S¾ÃŸHYCr I“iÁ¦©Zu莣¦ÞÒøgÒÜæä@’&Yï”o….90JªÞS)ßþÕáϤ¬A9¤É¶ðÅ©Ê]v`TôΜÿl@šÛ¬HÒêþÝÐeFA•?–òm^þ\@Ê–IšJ‹6OUþhèÒîwÚÿ‰& Ím^$iŠõΜºôÀ0«V=0ñµ¼ÑϤ¬9¤)–o»Eª:+C—V½“¾þ,@ÊšIZ‡úgoºüÀ0ªVÞ™²ù›„?²†æ@’Ö¡|ñ«RÕ]ºÀ°éý—áϤ¬Á9¤u¬þ¡K “ò«R6¶AøëÿRÖàHÒ:–/Ù*¥~º À°èô‰ð×þ¥¬á9¤õ¨Ñ®¡Ë ƒâ–SÂ_ó—²!È€$­GùÒ×¥4è„.EÐhU™Ú{~0ü5)‚HÒz6¸ô‡¡{4ÙàŠÃ_ë—²!É€$­gùŽoL©è….GÐHƒÎÄëìѯõKÙä@’¦¡Á„îGÐDýs‡¿Æ/eC”Iš†Ú»¼5¥rº$@“Tù£)ßv‹ð×ø¥lˆr IÓÔàêCC%h’ÞÉÿþÚ¾” Y$išj/{gJUº,@T+îHÙ‚…¿¶/eC–IšÆ×ý8ta€&èþøÏÃ_Ó—²!Ì€$McíÝß—RU….MPgå}—¦llNøkúR6„9¤inpÝÑ¡‹ÔYçÀ‡¿–/eCšIšæÚ»¾=¥rº<@7þ:¾” q$i\ypèµS©½Û{Â_ײ!΀$Í@ùNoJ©è…îQP'ƒËö ý^ʆ<’4Cõ/Ù+t‘€Úè·S¾Ã¯…¿v/eCžIš¡ò¥¯K©Ÿ‡îSP½3燿n/e#IšÁúìºP@´êÉ{S¶hóð×ì¥lr I3X¾xËTuŸ ]¬ R÷Çþz½”H$i†ëŸ½(t±€(å=¥llNøkõR6"9¤.ßv‹Tµ]°`ÖUejïý_Â_§—²Ê€$ÍB½3þ5tÇ€Ù6¸âÀð×ç¥lÄr I³Ñ¢ÍSõÔƒ¡‹Ì–ª÷TÊ—¾.þõyiîhå@’f©ÞÉß ]¶`¶Œ2nôëòR6‚9¤Ùjþ&©ZqGèÂ3­Zq{Êlÿº¼4wôr I³X÷¸/†.]0Ó:‡&üõx)ÑHÒl6oÃT>zsèâ3¥¸íŒø×⥮ã@’f·îѺ|ÀŒ(z©½ë;Â_‡—F¹ŽIšåÆ6HåƒW‡î`0Ýúç-‰ ^ñ:$iöÿþ#ÕS¦|›—…¿þ.z’SyïÅ¡ËL—îÑÿ;üuwI-’Uç O„.c0Š;ÏIÙØœð×Ý%µHRdÅ­§….e°^Ê"µ÷ø@øëí’Z9¤ÀÚ{¼?¥ª ÝÍ`]õ/ZþZ»¤Ö39¤àWºœÀº¨V=òm_þ:»¤Ö39¤àòÞR¿º¤ÀTuüçᯱKj='’TƒúçﺤÀT·žþÚº¤Öór I5hü#’ªü±Ðe &¥ßNí]ÞþÚº¤Öór I5©wÚwB÷5˜ŒÞÿþšº¤Ö æ@’êÒ‚MSµò®Ð¥ Ö¤|øú”Íß$þ5uIé…r I5ª{ì_‡.n°ZU•:ü·ð×Ò%µV›IªSc¤ò+C÷7x!ƒË÷‹]RZS$©f_O@Tùc)_¼eøkè’ZkÌ€$Õ°â¦B9x¶î±_í\Rk­9¤ÖÞõ)ýÐeÆ·Ÿ™²±9á¯Kj­5’TÓú- ]è º©½ìᯙKjMªîö̯IªQùâW¥ª½"t¯`´õΜþz¹¤Ö¤ëþø/žùùmeó6 ÿI’þ£Þ©ÿºØ0ºÊÇ~‘²›†¿V.©5éº?ù›g~†[O-Ø,ü$IzVó7™X°`¶uüýø×É%¥©Ô=þKÏü ·²m¶ÿI’ž[÷Èÿºà0zWþú¸¤Ö”ëôõg~Ž[Ùö¯ ÿI’ž_q×y¡‹££j?žrÏ ¥Ôô¯—ne;üZøH’ôüÚ?ü”ª2tá`4túwᯋKj­S½åß{æg¹•ïüá IÒ 7¸â€Ð…€áWÜþó”Í M\Rkê_°ó3?Ï­|Ù»Âÿ@’¤._²UªºO†.~ ¯ª»*å;½)üõpI­unpÕ!ÏüL·ò}>þ’$­¾Þiß ]þ^Ýþ!üupI­õª¸ùgÏüL·Ú‡~:ü$IZCó7Iå£7‡.€ Ÿâö3}ô¿4·ù•÷^üÌÏu«ó“¿ ÿI’Ö\çÐÿ7t `Èô²ÔÞå­á¯Kj­wåã·=ó£Ýêžúð?$ií·œº 0èµ¢uâÏ'?Ó–Ô}S‹¢jï|ü sù_§p’¤=®³î}©Þ20tý? ¹V÷ªÇýÌÏ º7ž’üÁI’fÑÔ^QnùFŠ÷ŒÔÜ`ó†™säägÙ’bµ?÷{O<èß]ò'Iš]­SÿMD9HñÞ€:ôÿꃒŸaKjŒ­îU‡=ñ lïšùû© $ivõo>-ÅÛGjª{Ù_%?»–Ôký;ÏâÀPóØW&€’¤ÙU,ß?ªbû¤ß?PCƒ{×ûå_é°ü+·}çÉ­µïLþ%I³¯sá!“~ @Í Y¬Xõ’ägÖ’ãíˆ}#Êþ“:W~<ýƒ”$;©E1øÞW'ý^€éœ÷‡éÏ«%Ÿkê?<á5àŸ½;ÎOþ %Is«µú ˆ~g’ï%¨‰þ7?•üœZRc"u¯üøSÊG¾—üAJ’æ^ïëË'ù~€¨vÜÅ‘ÏK~F-©1‘›.êÀPsÕË’?PIÒ;bß™7z,e?ZkÞ”þ|ZRL¤©½¢j=òô€ö¹ïIÿ`%Is®ýÙßžÔÛJë^½4ù¹´¤ÆÄjüKOz=ø©@wÃIɬ$i4õïº`ï+H¨|è–h.Ý;ù™´¤ÆÄê^òáÝ”[¿™üÁJ’FS±ê¥QuvMâý% TÝéhðÚäçÑ’­Çy»7ˆrÍeÏMþ€%I£©{ÙG&ð€:ëÞ—üZRc²-YUë‘ÝDDë3¿•þAK’FÓ’Å3ÿ@^w)ý´¤˜tíÓßò”×†Ç º×›üAK’FWëä_ŠôÆù>€ ªšGqô‹“Ÿ?KjL¼Þ×Ú³Ààá{’?hIÒhë]{ô8ßk0)Uí³ß‘üÜYR#IåÖ[÷l0Ô<îÕɸ$i„±o”Ü;®·›LHҟ9KŠGÿÜÌh‹?˜üÁK’F[ûÌ·=íM€ú*¾kæ¾RŸ7Kj$©sá!O{xÂ@ÿž‹“?xIÒèëßúéq¼ç`ÜúhòËÉÏ™%5’5ØtùìÑiÆôÒg&’¤ÑV,ß/ªéŒá'ãÔýûÿ•üŒYR#éÿñÄ ;Ë@D´Ö¾3ù“$¾Îùÿ}Ôï;£Áw.‰æÔ¢äçË’Éê\ôþݺ^<é ÷­s’? IÒxÜsÑ(ß{0&Õ£›£X¾òseI¤ î»jn€™?pij“?IÒè+V½4ªö£#| ÀÈ zÑZó¦ägÊ’I+V¾(¢ìÏqíÏÿAò'#IOÝK>4ª· ŒA÷²$?K–ÔH^÷’ïöuã)½;/Hþd$IcjjQ ¾û•Q¼`Ä/9ÇM~–,)RW>tËhÑkGsÙó’?!IÒx*Ž{UTÝé¼`TªG7G±â€ägÈ’Ék|ð]?žz0ü3_ü“äOJ’4¾º—ýÕ\Þ‡0Jƒn´>ùÆägÇ’µ¨ói£ô¸>ù“’$±©½bpÿ5sy; Àˆt/ÿßéÏ%E-Zöœ¨:»F;*>ñ¯Ó?9IÒØ*Ž?0¢ÛœíûQF`°ñÒhN-J~f,©Q‹:ëÞ·ÇבÝt7œ”üÉI’Æ[÷Ë3›÷£Œ@µó(–ï—ü¬XR£6•[¾1ž@ÙÚÓ‡ï›ü J’Æü§¸n6ïK˜‹A/Z§¿9ý9±¤¨K­Ó~mV—“Ý µ/xoò')Io­ÕEôÛ³º¡0;Ý/4ùù°¤F­êßõÅñ›¿‘üIJ’Æ_wýÇfuC`Ï ¾sI4§%?–Ô¨MÅñF”ƒñ†Zk|ôˆ$-Œ?pí¬n*ì¾+¼Ž· IDATêÑ-Q¬8 ý¹°¤¨Sý›O›õueý»×%²’¤É,˪îô¬o.<²íÓß’üý°¤¨[ÅQ/ˆªõÈdÑëDså‹“?yIÒø+ŽyYT­sºÑðÏÊ|;šËž“üüWR£võ¾~Ôœ¯1Y}$É5«’?yIÒdê\xÈœo6ÄÌ/\µNxMòs_IÚU¬xaTÇÒ ¢ÛŠæÑ/Iþ"H’&Sÿî ç|ÃXЪ2Úg¿#ùy¯¤F-ë]üH.5³ 7NJþ"H’&S±òEQ5É`!ê^ùñäg½’µ¬Xõ’ˆ^‘v½N4yyòC’4™:ç¾{$7€…fpϺhN-J~Î+©QËz7:²ëÍìà ÀÍk’¿’¤ÉÕÿÖÚ‘Ý€‚rû¦(Žz~òó]IZÖúÄë#Ê~=1èEqük’¿(’¤É4|“Zí¼d7!€œUÇ¢uÒ/&?Û•Ô¨mƒ{×ôº3·ÀðSî¼ ù‹"Iš\íÓßQFsÈUUÍüiÕÔgº’µ­óùwüÒ3çÀPë3¿•üÅ‘$M®Þ5+FqûÈVïëG%?˕Ԩo‡ïÕŽïÕs0øáÝ1=µ8ý‹$IšLKžåƒ7âÁw¿Í%þïLRãIë^uØX®?# u.þPòI’4¹Z«Šè£ºd¡Úq_Ë÷O~†+©QÛŠã^ÑmÖ{PµvDÓÅL’TÝK>4ªÛÀü×kEëÔ7$?»•Ô¨uƒ{¯Ûehd€¡î§$±$IljQ 6^:Ê[ À¼Õù§?·•u®sá!c½te­Óß’üE“$M®bå‹¢šþÁHo'óMoà ÉÏk%5j]±â…QÛçÑ "ßÓKŸ™üÅ“$M®öÚ߉¨ªQßRæ…Á}WGsÉ3’ŸÕJjÔºþ_ûõh䀡îWLþâI’&[oÉ㸥ÔZ¹}SË÷K~F+©ÞµÏù¯¹&eƒ~§üJòQ’4ÁV”ß¿m,·€:ªZDkõ/¤?Ÿ•T늕?Õôçñ`¸Øz{Lû¨IZPµNxmTÇÆuk¨A/ÚgþFòsYI5ojQ 6]6±KÓØC+Kÿ‚J’&ZçÂCÆyk¨…ÎÅL~+©þu¯ø?½6u0ó§Ö¼)ù‹*Išlýo}n¬·€”zNH~+©þµN}CÄ ›Ñ "Ê[¢yÔ ’¿¸’¤ÉU,{n”Û7û0qƒør4—,N~+©æ-{N”Û7Nü5öÀPÿŽóÓ¿À’¤‰Ö:íW'¾j§òợ8êùÉÏ_%Õ¿þç&¹NMd0Ô¾à½É_dIÒdë®?tR·€±ªŠíÑ:á5ÉÏ]%Õ¿î—ÿ&Ùµjb€²ýX«JþbK’&ØÔ^1¸÷ŠIÝjƣߎÖéoNæ*©öµ?ýŸ"Ê~þ€¡Á¶MÑ<òg’¿è’¤ÉU¬|QT»šäí`tª*:>éZÒaO_qì+¢jnKzÉšè`¨ÏÅ1}Ø¢ä/¾$irµ?õï“®Ýf«÷µ#“Ÿ±Jš¾O”Ýœú’5ùÀPçʧÿH’&Z÷+›â–0ký».ˆæ”_l•Ôxê¦EÿŽs£’ ¢,£uö;Ò!$I“kjQ ¾sq’ÛÀž*·ÞÍeÏI¶*©öõ®=:ꢑì¢ÙÚÅê×%ÿbH’&W±â…Qíz0Õ­`·T»ŠbÕK“Ÿ©Jª‹Þu’l0Tî¸?š+_œü‹"Iš\­5ÿ.bÐKyûxr½V´>ùÆäg©’ê_ûìwD”ý¨“¤€¡Áƒ·ÄôÏNþÅ‘$M®îúCSß~¯Dûs¿—ü URýkö«ÝfÔMòÀPãe1=µ8ùI’4¡¦Åàž‹Rß~~J÷Ò¿L~*©öµVÕô£Žj1êÝtZò/”$ir+ˆêÑÍ©o?3z_;2ù¹©¤ú×:áµQ=¶5êª6€¡ÎUSÉ¿`’¤É5ü;ZÑ菉ý \ÿÖ3g>¹4õ™©¤zWûЍvÞuV«ÀPgýÇ’á$I“«sñŸ§¾õ Ø`ÓåÑ\òŒäg¥’ê]qÌË¢Úq_Ô]íCKþ"ùP’4¹ú·}6õ­X€Ê‡n‰bÙs“Ÿ‘JªwŪ—D¹}c̵DUEû¢$ÿBJ’&ÔáûD¹õ›©ï>ÀRíø^G¿8ýù¨¤ZW÷Ê(¹7æ‹z†Ê2Ú_øÉ¿ ’¤ÉT`T­©ï>ÀP5·EëÄŸO~.*©ÞµNz]T»Œù¤¾€¡ríu–ü +IšLíµ¿Q•©ï>@Îz­hþæäç¡’ê]ëÔ7ÌŒ…æ›z†ª*:—4ùX’4™z_[–úÎäjøË§çü~òsPIõ®}Æ[£j?óQý?ѽfeò/´$iMíƒM—§¾íê^úéÏ@%պι0óI!óÕ¼ u¯?1¦kðE—$·bÅQí| õmÈÈðÓGSŸ}JªwݯüíÌ'ÔÏgój0Ô»í¬˜^²wò/¾$i¼µNù•ˆ^‘ú¶d ë§£9µ(ù¹§¤š¶tï™ëDæÝ`¨ÿÀõÑ\ñÂôß’¤±Öù§¾åóÜðOŽ6—<#ùy§¤zV,ß/÷]¹˜—€¡Á¶Q`òoIÒxë]wlê[0O•ÝŲç&?ç”TÏZŸx}”Û7FNæí`¨lnÖš7'ÿÆ$±%‹cðݯ¤¾åóL¹}S+6ý§¤ZÖ9ÿ¢êNGnæõ`F¯í þgòoIÒø*–ïÕŽûRßq€y¢ztsǾ"ùÙ¦¤¶tïèݰ:r5ÿ?Ñ¿eML/Ù;ý7Œ$i,µNúŨ:»Rßn€š«šÛ¢uÒë’ŸiJª_Å1/‹Áæë#gÙ †[nŒæ1ÿ*ù7Ž$iõ¨“~'ÚŸùÍôç—’jUë´_‹rûÆXHòüDÿ Ñ<îÕÉ¿±$I£­8òg¢|øîÔ· Ê~´Ïùýäç–’jÔ’Åѽòãƒ^,4Y†ÊöcÑ^÷þôßd’¤‘V÷ª¨šÛRßf€”ª*:_úÓäç•’êSë䃣|ð¦X¨²ü£Þ]FsùÉ¿á$I£«}ƯG º©o1@"ÝËÿ:ù9¥¤štľѽzé‚ü­ÿ9*w}?ÚŸWúo>IÒÈê¬û³Ô· î•—ü|RR=jŸõö¨vÞŸú²T jðúw¯‹æª—%ÿF”$¦Þ†SßZ€ ê]»*ù¹¤¤ôǾ"úwœ—ú’T+ r0£[DçŠCczj¯äߘ’¤9¶dq 6^šúÎL@ÿÖ3£9µ(ý¹¤¤tñìè®ÿXTÝéÔ—¤ÚY¸€Ÿl¹1Š“NÿM*IšSÅQÏrÛ=©o+Àõ¿}N4ýr§´p›Ú+:Õc[S_ŽjkÁf”eôn9#š+_œþ›V’4ëZ'¼&ªâG©ï*À ¾sI4—îüRRšÚgþF”[¿™úRT{ÿBÙ~,:ëÿoL/}Vòo`IÒìjú?F º©o)À î»:š‡ï“üüQRšsÿÁýפ¾ ÍO Üq´Ï}OL×àZ’´ç ?þÈÃ`óõQ,{nòsGI“­}Æ[c𽯦¾Í;Oa°õ¶h­}§!€$ÍÃz_[–ú6ÌÑ`ó†(Ž|^òóFI“«}æÛbpßU©/?ó–Àn|ÿÛÑ>÷݆’4ŸšZýÛÏN} f©ÜrCGþLú³FIãoéÞÑ9ï=Q>xcêKϼg°[nŠÖgÿ‹!€$Í—V ¸6õíØCå–oøÏiT,ß/ºë?Õ®‡R_v²a0 ƒÜí/þIL/}fò IÒSW¬8 ÊýCê[°›†¿\õüäg‹’ÆWë“oŒþ-k¢êN§¾ädÇ`Ê釣sÕ’h.? ù‰$éÉ+Ž?0ªæÃ©oÀÓ(·ÞÅòý“Ÿ)J}ÅQ/ˆÎEˆòû·¥¾ÔdÍ`ºEôn:-Š“Nþƒ#IzâÚgüzD¿úŽ<‰ò¡›gþƒ0õY¢¤¶ô™Ñ>ûѿ㼈~'õefA0±ÁïŠÎ‡FÓ:M’jWç¼?Œ¨ªÔ· àÿ3ü`¿ù/eÒ’ÅÑ>ý-Ñ»aµOçMÀ`œŸ pÛYÑ:ã­1ú‡L’ôOu¯ü»Ôwà_(·~3Šåû%?;”4‡ŽxöÓÿÖ3£j=’ú²² L@ùèƒÑÝpb´Ö¼Ù@’jPR߀™ßü¿=Š$?3”´çÇ‹>ý;¿Uw:õ償0˜°rçæè^w|Ÿü·Æ’”ª%‹cpϺԷXÐ|ì¿4¿*Žut.xoôo9=ªG·¤¾„ð$ *§·EÿŽó£½îýÑ<úç’ÿÐJÒ‚êð}bðÀu©o° •?ø–ßü—êÜ’gDë¯ÿñoøß~VT;ïO}Ù`7ÔE9ˆÁ–£{õ?þSKöNÿƒ-I™7\—ÛîI}€ÅþKõª8öåÑ>ëíÑ]hô¿µvæOsÄ ›úRÁ,ÔU¯ýû¯‹î5«¢µöÑ\ñÂä?ü’”cÅq¯Œê±­©¯ú°€þóßÿyHíð}¢µú hö·£sñŸGѿãÜ(·|#ªöÎÔ—FÌ`lÛ½Û×FçŠC£uÖÛ£yÌËÓ_0$)ƒZ§ürT]©/óµá\çü?Šög~SÒlZû»Ñ9ï=?nÝûf>ž¿{ɇ£»þcѽê°èm81ú·ŸƒM—EùàQ>r¯ÿà_€ æ¹²µsæ“z7Ë?íÏ¿+ŠSÞÍåû'ÿ5IšOµ>ý¶ˆ~'õe`Ö È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`0€ @ È€dÀ2`ðÿÚµ†AþUï:Þ€ÿ  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€\õe~IDAT @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ Àþ;×Uù¬ˆIEND®B`‚‰PNG  IHDRçF⸠pHYsèèµ{Rk »IDATxœíiÕ€[@‚‰5¨e± •ĄĔÑ@UM¥Ô„”Ù+¥¥˜Ä$šU-g‡aßA`a‡A=À°(›Ã¾ [±ï˜à0€·÷å¤Î Ãö^¿×Ë=M߯êüœž×§¿ÞnŸ{I” ,‘H$I!’B $ „H)$R Iø¹úY0k‚6º#°²¶À ”ü£°ØGû•’Ë0ç¿ì˜ø²¶ Uv³f¸ú9ð%µq4°w†óŠšƒ½eü5ÿ±$žÆÌã‘èbô¸ ¬Íã2äº`Ì}5¼ˆòl$M’L¸蓟W¢Œ½¶@ÆÒâPÿ‘µfHÆý—„€¥6â±Ø%2Wö¾\ çèZ`…7…÷–†‘‰¼sÇAí}o¼5·nç%´ÊÎá]âf¾ÀïÑ’øp¯VÔ"V‰ô)]øÿVÐà°®>ZÅã¶cê$±VôŒ÷*Tr ¸ÆyP¬ AµW;~9•Âó@ÿT¬Ù{«A1–¼|cE-øeT"ïü PËoM kÓXPôÙ]oÈü Xpê$±k'Æ&6+ú¬—mDþ-Çj܉xô‰?ŽG ú¤Nm/Éxg+û}¬ååWþv ¬ee´Ò~Y¾²SÆ6@í÷Eº9{æ‹N‘$ ö– 4Ò'=“í·K(๠ û:1 o÷äVÑ©‘øÄÙ5—–@òê“0<´w¾IG ÷ØZ¸apmpë÷sä#pvÍùì_¯°žÞ7 ö¶*é•!ÉxZ=ØÛ§1ç÷  {XqËŒû« zŒÙ/ƒ³w!/àJ,®Ú€/‰È®‰ÃóÀÙ³Œª.Y…ÉjÿÁZ7œ_µ’ˆU3P¬@j÷Ïð ¸$C ø©%̤iCÚƒ{²’†§7„>:“@ÆœW )x¬Œ©Ï‡~Æ5Fik°7¤a„ðájùâö7WÜÓ»2ú”ŸO¦Úï ¡ >âvœ}‹ÀZÖüc½¹èýË[ µÛ§ùG9ªà™/:‘ìBïÿ6÷°up®kõ`0¦ÿ†^†9GO¸@ze' Œ>îÂÉš„shEÆßë9À× 0çÿôQO+i%ü7G*¹ðo@¼µR;[µá¯ØÞ¹c`ïœæ¢7øg ¼š‹þ}± do¨ª`I­è$²kI4ê P{ß#üwÇV¨ÂoÉR¾rÿ» HâX±{ÈPr,(â~¼WxYÊ#»@¥m€ò—vÑ d)¬©½>T±7ž@–òÈ*jQÅ^?RxYÊ#»@8ï(ÖÚ¡ÂÈRÙñm ŠU3@xYÊ#ÑÉ[˜’„[X Š½mªð²”Gv†= TÁrÑ d)ì x¨‚E'¥<²õ¼¨"G¢•ŒD—´²Ø:¹R–²ð÷-ÌÖ*Bë e€/¼†Ã@¬»D–âðWÎqt5Pç>‰N"Kqø«HÜñ>PÅ c‘t©@”Û6a'DÑId)Eõó_ªà4^ÑId)ÓzÆ?TñŒsòU¾€¸@jÿ€2jßû…'’¥4üMm.lFz,(îG2”ÂWùº@³úÂÉRþWçØ9¨"k£úY+zåÉD'’¥4ü/05ãw@Kå]„E'“¥0| D¹2ц~Ux2Y Ãÿ"›Å-I·vÂ+¤èd²FN«´º'6Uðs‹èd²FNÙߪ`Å€èd²FN™sÿ´¤[O(KYä$Vñ8PFú5á e)‹Üš­”¶&ÝhĘù‚ð„²”EÎÝz(·ø¶ÖžP–²È½ÝÓæq@9OL¡/éiÛHô’¹, Q^l » %\pQKÊMçÌ…žT–¢È¯é.ái>8ƒDtRYŠ"/°U°£è¤²E^ád>Ê`×щe)‰¼ÂöÑ”1Þû…ðIJ”D^á4Oý¨"¿Ì+ÄÂþ{æUÜã„'–¥$òˆT£Ù+q,PËÚ O.KAä->öû@}üÓ“ËRy D½ ¦µªð䲤EQsІ´çm;q¨Æ9¼ Ì¥ÑD}²¡{b£øR@;°!vÆ.ÐØ ÚÓÎ\•Gke¯èÂ¥UÈâ: –ß.ü 1"w l·}ZííÓÀûäT(Ý dÌz (£O~Nøc"¢´5_úÏ\ð:Ø['ƒ[¿/²«@á\,Ê`má³ þç–0§_á6#WíÀõy¨‚Õ“ÂpA¸¡öý<U?ã/ Ρåà™ŸDšCkUßÂÅýK€2¸¶ÑóÜr’\WìÀYË»eÌÿY¸ÌO”´âÅp\–ÚIàžÞày¢Óík<¾RÆÙ¿X¼ÙÃÓê"æ¼W£HíñYgJÆÏÝo.Ë„Ó~­@Øô„2ÆÔçÅKRÌò}Ü£ˆòœyÇBDKÂ2„>º#$u¶o(Ó ¤1¨Ýn. »ÞAXð:Pß#¿©Pǘù¢pQØuÂÞ2È®ÁMþ0ÂpOïÊ8‡W …]/wu;"î6Ç'vP&çñ‡UѲ°+Bíÿ PÅ®Ÿ@ø¦CŠ}æÍÅoUÌÅoÆ'Úó.^BAþaºÇÂ¥aMÂ=Y TÑ'ü(>0°su¬eeÂ¥a x}Ç[¾Ÿ“-TÌEou<½_-EËÃð„;¸ ¨‚5D¾Žy˜a]Jðópuïý(co¿@ný~HÙ†è£ µïýd?ž^ Ô„dÕ „$à©§AðPüòt»•ôzÛÏ?½ï#^Ù’Î*‰³ð^í~Ð¤ŽŸÄÈâe®gBRpOnµW»ÈåÑ=LzÒ\ŠÈ¢ˆW)–C’ðÎàK÷E"OQs0çþ!òÚå0Ñ?"V <Û‡c‚õa /î ëJlTuáW¸$›¹ìg$Q_/Þ¹ãüó‚ÚóîüNžÁð™žxUK"æ¼?ÑȘÝkƒsh˜KÞæCú8»ã²?JÛ€Úû^Ð+;1ç°7U‚wæ $KËù¥"2ðƒòj®yƒõß„•ž¹çȰ7TÚ!IÌå.CÚÓHüÚ36$8»çåuŒ#ˆúRx’&WŸÑg[Jhc÷ñ\ ~Ú»PtŽ$×ñr8"6ò;òYˆ(ÙVßð'Ð쮑 „“û$ôMƒÎ—3kb,~+–lŒ+¡ƒ>é™ÀÇÕÚZеnDäq[—ˆÎ™äö¦1¡SçØ:PÜú±ÄŠ[‚{jÛÅ}«F³MYöuWéÕÀuAÁjOÄ"Ž7Ÿþs#ci ½óPŽ¥±èM¾I.}(¾©¿Ö‡¥¢Ó˜ZŒÖÀjWo¸$ßxõ¿â‘¨°8>™ÇTb…µzñÍ`79~áýLŸõR,©}î󽨵$¤ÑæÂfÁ[Y[°wκlÛ—º€µ~$°ò;"—ˆæ°õÒ#É„³¯XÉ-ÁטïsêêöW „¸ZeÔFwaë$ì.(G©£í†W{,Ë5X¿@õ$Õÿçèšëþk $‘øE $ „H)$R I ¤@’@H$I!’B $ ü­8dògdIEND®B`‚‰PNG  IHDR22?ˆ± pHYsèèµ{Rk IDATxœíš}hVUÇošRA¤ %‚¬“H-ƒJƒAÑ)e”(†ó ‘gn«ù²Tr¾,7­fé@æ^tK¬Å02”)й©˜/˜–æ ¹{^î˹ß8§’=>o÷žçÙv‚}á÷×}ž{Ÿ{Î÷¼üε¬! ©ÿÄ[>\B·½ð;Yÿ°c:ÎíN{Y7€ ¾wÕ½Ñ{{.}Cæ*sæ­E‹„³wa©]< vÌJ Þð †r´rBʼ¢xxkQÌ"•“T?`_¾ƒ)ñÇ)Øewg…¡[&õZvɈ¤ dõX7¯Â¹‡7f!«€•ꂺ Æ( UÏdùä¾d¶}:L“éLj Åw@\9’£ú—†¾ âꉼx}13<­ž’Cö¼“»@k¦©‘$Ñscàþ´6' ÿlKxõ096ØŽYYMɾ~ðxøûâZ¼ãµà{¨ DtŸ×â`; ³÷ÿ†³oaú¼{®Àïj„óý2Õ•d‚aî™BÊGiAH„…øÏ‡þ¥ƒØ_ê¿îÁ•`»^©(ˆvŸt tësZ ¼q^ô‡ËI.M7±sá»ßÒQæÎSBv^@çélxÌ0æùz avÿ‡a&ªAa; µ@xýÛfÐê©Z Î¥fŠ-ïØ6³@옅€÷Dñ£æˆx‡F“0Ø+î4 Ä;Z­7ozÒ,®9—ðú9fÐ-“´@ÜCë̱KF. â_>dHÌÒÛêzvé]f¸G6ë-U¶Ï0 „âüØä+ `—Ý“„~ö¨ˆÿë~|ã÷‚Õ<çÛÅðN쀸֩žI7>‘DîÜògd€ßÌÏÄX2ôógá´,REqýtÚúsfYi<ÛªÕ*¬öe½7¾v¼* 9ÐD¨²ÈÞ“Äi[>  HUõ×)•D6­Žd—Ôé^²’Y.éã¡4 ²R¨ã)V÷zd¹KÄ;B€ÈäÉ:-Y´W  ¡»¡ó:¶†á ïBWÎw…3yùý×Ïh=ƒï~3ˆ<<ï葜ýK2áèæ§UëiÉwo=+ˆê^] ÈEâ·ÃàÍ€VMYÿˆªöó¦÷ÿÞs8›ô:÷$¾ôl ì«—`¢Øm뺬 ÚÛß~”±=Ù $ÅahB«Ô¾c$<å­d?†E6LHy<à•Îz˜ §myê©zjÅß‹e+ñ“5"è‰*„f_Ò‘žŠ’‘pÛK‹Ô׬yþ"Z3-NÖgvÅC #ffffff ‰PNG  IHDR00Wù‡ pHYsèèµ{RkÈIDATxœí™[l QÇGĽB‚¨‰4ñ†'$n‰ *‚ô…âòŠÖ–ªF¥¥.Š*QµUZBÓFƒ†¸”¸«;q)[¤3sævæ/g°míîìœÙjGÒò½ìåœÿïìù¾³çAèP‡b|¾8R¼ä´”“ Š©qS„`HýA?ÞE[ÊxU 1­{ -"5Ì+)^zŠydÿâÒp”Òû€¾»öþ bj§È¿ƒœJ.ĬaZ¸7õ‡%hO©e«¢H¹cT!©zn%Ú]:œ;Æ`K_!/nh2¼ ãéy{€ô>¡úíÃð’Hþ4çòÎÑ5\Of~{­&Jér(E ¬}låR cÏ+œhU›ÜoüÅ¿(båwýüÐ%9g¤37“˜?ÞAÊNˆ^12‚ꢎGÏ¡ß+„z~-ȉ7õpö HÛ†¸Z rlVTóÁº7 0i¼XãIÔJHÁ H[8+€žÂmž­–“§y(%ÉPN.„”=‚ë{QÜÔ~ýÖÁ˜Mˆ­P±ž@«Îô@¥@­Üøh×÷x l7;¤< øqз5Þ y“¹X÷ €”9n$e õ€˜"À”þéIüÏŒ—UÜjÅïhW²¸ôû~ï(EIÜì¦g¤ìÜ0M«x@d‰,Ös3¹Þ0ž]àЮíð€V•Æ @ßßlÃÛƒŸ¼K„ Ó¹@uHé½[×ìæ^Ö•R-_ ½¶ôóƒàtìö€õCYbòŠéÞ°¯+ä} ž]ýNþ¯»y³«gÈ\v,hýcnýö!WæµêL« ǵXy“ìô›û¹L9`­$/}[Ã=—¼c”=€R8nÄò‡ `c˜äß$Ô¶Z"°¦)KL^/*¹È±ÙÜs°dúŒÀÂxsnä8™Óº~¨åŸõn¨—Ö¹0¥/V+ÑÖüæž0q5¾rb¾3iûpÛRf A¾[wl¶[–èx(g–Álxán\µ±Åyc `m£º‹ˆI:±ö¬ñú è×g1u©ÃuA¢ü©ðŒ 5¤Ký JoÓm2·¶´k9a«eć|BÞ=ÎUImMÑ@µÚ!»Ç%•D+yÚåŒös¯Š÷&†õ¥”¯9"À¿ 3)ZxRÊN ?èn:1;CZÞ ¡Mƒ äD’*nég##Þ”ö&ŠJÙš<b|Îß¡ýꊯuÎ'IEND®B`‚‰PNG  IHDR szzô pHYsèèµ{Rk­IDATxœå—]HQÇÇ"¢èÃz°"1²{ê­H(衇žŠˆ úxˆÂ‘ŠzÈÕ6wY³ME¨°Å"sí‘l[Â2ê¡/!]2(J$ÅŠÒµæÌÏ{⎥c³3w¥|è÷efî9¿{ïî¹Wþ{‘;%ÅP“¯ˆešíô\ÔßÅ1SÒ­(úfǶ48Ÿ/K¥Gç©ÖZo fZJg… À„¨-ë¹íz"CCéâ:;„N@ ©ôÍDÔû»Ü”Îòô3ÔJG ’H’«[P}BT!­¾Òå ÎÆ—>nµ+˜ÒPRÃz¤$™²íG-E%v ¥º‚ÔPµœ?òOQôe¥4“éŸ[ÂWÔ߯P}àGÒ´ !”ãøýÒ¸™  Ü-uæÇ›·säè®é'H e'àæ>ïH¤ˆ¿ñ“Þ@8  >»à€X1ÑÐ]ô'” HGÞ»Pù{Ê= cZ"Ê]©vµwʽã\¹u·w¤qÓ¿7¢ßZ +rh|êýû¤å³Qª/D¨\4@di¸Ç} ¨\:­„p.åë;P}\ú‡‡¦™M?Õ­±h/ÒðÁnRÙˆú›v¤?†ã@õJ;€|c/@ïkã°ÑòÅvå˜Óì*M§wðe¡ñùµkš°›Pü탡—\z­§Ù±ü²¢ÅíÿªÉ@‰å0ƒt_A¨Z69{gW˜'&våI¾}ЂKÒ>ã±ß–¹èØ é~‰’Q„3 œDö7<¿„^I‰Ÿ°lDóQ€pîä­ÈbF*d<9ÛXåÈS_HÒ^|˜]“þ„®mUÑÐEFš16˜„šU†Ȧ¬AýZPîŸÚ?ÓWÓ™×OlBˆí†IEND®B`‚‰PNG  IHDRçF⸠pHYsèèµ{Rk ÅIDATxœíw”ÕÀ‡ib‚±äh¢1Æp4&”Óõä˜@’ƒ$D“H‚Ç’†Ä”£Ñí´¥Ww¥,ìËâR¤-—"%,ei¡W!°Á]ïôòå|£ì ûæ½73÷æþÎùþ}ïÍ7¿wgæÎwï'I@ @ @ òê×:¨szÏW ;_`ùm–)AÊ‘•æ¶) ð½²êç#™Èoã(…ëÕŠÞóز×Ú{’G›ÿ»©lðm¶/? »)˜;K}LÀÅq@›ÿl8]ŽÁ·ÛÚ‚ç&_WÈÉÉP§ÿx—o_ˆòìšõÑ üǶ@-{2\‰2%PËzî€&ŸH-j­Ÿ_dl@ÖWa( u ]"mnŸWÉ£W¾Ü—e5ñí ôÕYW¨ 0œ‹§AzW¸e7}MÞS )E]ê}³s~_÷-ëÄz`ÙÍB•HúýZWcÅ«ý}”‰˜Zˆ©\ÆX7$ÜQ(·hû|IÒæõ-ñãå‚vîp*à„ã€ZÚ-T‰ô5¹#%µ¼×†´?,»™;Œ øâ\:ò [CH[þ…’\Ú}_ú&æpNà2fÍŒðZòÒFI)éöït>D)ì `  à:ã'! ÔoSzå¶ûÜÞù\ƒóÁI`ù7ÓÈX;èÚß. ‚Q•O[ eôÅ#;eL 䟧+u°’wŠ 0wN§):³G¢ß. €cƒ2á+ÄÊjöÙ]¼S#ðˆµ-Äè1”7¾FG û½-pÃ`›`×ëä»`í_øQY厰ŽznÌÝå4R‹‡(ã(u`î©máïA™ð°œæ¯2æÐ<Ö¡enWd±-PF}¿@fÍLˆŽÖÁ¥ •÷J(Lc!¼Œº£V16Žæ+<ðÓn\”À©|ÕâgÒ”qÁ>[QÃQ/ø>;”@ÚÂ!*8¬´ÙOûþkˆ¼V`nŸ QC[ð?¬ãk! ا·‚<¬Cpò\úÒ—! ÷}x‡¯6”‰ßà#{ùŠÀwëðrwtC’õ߆ÖÉ`lZÅ3îë¦ Ý³@Ú¬ŸuðQœåµUöqà jèØص{ÝK©ûTYØ XÎM¡·gÌêI@ýž'ô• WFVXǪ‚=ÆKgÜYe,ÞÃzyÐgøo²ÙçeÔY?åžLyÄç|›|Äϱ¯£j€;óõæ¼/eäŸr_ÊQÿùd:·Oò`ª`ŸÚ Ʀ± ÍéíN^ú¹F»@jñc@µäÜÉ®ëøºF¯SÔÝ/@¯| ÔIß–Û’ûoT }Ù_*xi¥öoU ;5ŒØÎÅ÷ÀÜ7ô¯¸¯p4çýûBȬžTÁ’ZÞIdÿO¢Ißyh{„@8·B÷@ ‘,¦áI û¿û$–ú¼‡)yÀ"öû‡¸'Å< ”×(¿iç@óH(\ðY Š¹c÷²˜GBpR‹*æÖ7¹'Å< „ëÞ‰blÏ=,æ‘X ¢.@cã(î d1H $.aR.a€*æîÙÜÈb‰šðPËx'Å< 4ê~  .pä@óH<4äN Š˜‰–"0ÛÈbªäJ9XÌÂÛ»0Sªp­ƒžr.œª`Ý ï$²‡·rŽS›€*¸ö‰wYŒÃ[EâÞ¹@}ÕëÜ“Èbž¢Ü¶ ;!òN"‹qx+ª¯ìTÁe¼¼“ÈbÞ–õ”vª8ÚEñ(ŸI\ yä½@yøÝÜÉbÞ–6gež »Å‘)IðQ¾v/PE_þwî‰d1 ï»sì›TµÑ}ŒuƒòŽd¼ÉbÞ7˜š÷[ ‹!»]„y'“Å0< D¹2QÆ?Ä=™,†á}“Íœæ¤[;áÉ;™,†‘Ô.­ö™í@|ÝÂ;™,†‘”@æ¶É@¬àLÃHJ }Ñöt3î e1‹¤R&> ”QÆ?Ì=¡,f‘\³•¼V¤hóûrO(‹Y$Ý­‡r‹ocËî e1‹äÛ=í(ªˆub}HßH›Z¤·Ìeqˆòf ˆßÝhDHþ „›ZRn:§/û÷¤²EjMw /óÁ$¼“Êb) „½¨¨‚mx'•Å(RóQ»æðN,‹I¤$¶¦ŒöÖ/¹'–Å$R—Ñ8òû@ñf^".öÏ8X T±OWsO,‹I¤,©F³×b ç·áž\ƒHY uÚ@µ´;÷ä²DÊQoƒilÆ=¹,j‘Ý”qݶ8UcØúêÌ`¢¾ØÐ>³ÿ ɤØ»?chìí(õŸÈ£±¾ 8pk²Øȃnå~’‘À+6çÃ>­æž p><çK7€´ÒÞ~(£–õä~âÈkåný§/ý ˜»ÊÀ®;XUZáZ,Ê`mî'33üû?—_ág&îÚûóP«'¹ŸàLC~hå?w¬ãkÁÑ? 4‡Æ†á „ŠGVepo£ç¾å,¹®Øi d¬”Ñ—ôã.ó¹-Ýb8W–š™`Ÿ?à8¼Óìc<>RÆ:²’¿™‰ÃQê€"úâ?+<ø6ÿ”F_k lË]ÖXnl¬Uü*X0°é e´ÙOó—$3šå1jɃˆòšyçBxK uÊ÷ ª«}}H›ók Î@p wQØu'ü¨‚O‚ „ïT¨£Í–»(ì:aîœd÷àN4xø!†}þPÆ:±ž»(ìz¹«Ý±ÿ³#<°ƒ2iǽYå- »&ä‘÷UÌšá „O:Ô¡Øg^_ùO Š¾òÕð’‡Üá–P¿™|;wiØaŸ­ª¨Óž@Ø9‡:FU>wiXßñ’ïåÏæ«@úŠW€:ŽzÁ-yËÃðw¬ ¨‚5D^ŽÁW°.% x¹9 :´·~”1w–†/†]w¢@¢)ú C~7Ù—§—Á5.GCpä󠌺?|yÜBz¿í†ûŸ¡íù¤?QW•„Yx/lëNhRÇËb`¹e®œ‚¨`ŸÝrA»ÀåQÆ<@zƒÒdŠÈ‚È­RQ©?ên݈<ÙMA_ô‡Àk—ýDû _ðß9,ŒwrÝâ.¿Fb­¼—;ÂE œØLæ8ˆú6xá\<í¾^‡Ü™ÚŸgìƒîJOÕ¢ˆ¾øÏ4Ò¼‘Æ6Á:¾ôU¯»Sú¸ºãª?òZƒ<ô.P‹má‹`n/§þDCIú¡"0ð‰ƒòn®)ƒõß„7•Hü$=P%†Y=1­„\î2®#-”±_¦½bCЀu`qj·*A D}+<Á£OQWšájKm̽sR>¿ äŽB‡–ñΑàzXFR‡\RÞüº¸"J¢Ý7< $—vߤ@¸¸O@oÒ4ÝõrÚ’þïJjYÏõaÔÀ`c\Ô™=Ò>¯úêì¹’VñLIÐ}ôe™¼s&øsûT®,[‹HÆœ>]ˆå4ûÜîËÇ àV&Z²ìéªRÐ@©¿GB”qÕ…!Î7_þs#c( ¼ñU_Î¥ööóÇ\y\*zÿ&”Që…ÞÉãÆØ¢ù´GV+G«¾Ý +Ñ´'V…"QVXG×ðÎeì0üÚ½?ç&Ð6-’®r¤ yòwªÃHÖÁófןf›³2Ò?oùmÀXWP!5†Vöä6°­´DîkSõ!=‚ư/–Û"ýó5ù»ŠQ=¥Ÿä…KÅÝîPgö˜¡Œ¸–åßl%v³ÔÁöNÃÑ Å’ 6â^G)ꪪsû06΀æžä@ @ @ò“ÿA嫟œ(]=IEND®B`‚getStatus()) { $problem->setStatus(500); } if ('' === $problem->getTitle()) { $code = $problem->getStatus(); $problem->setTitle(Response::$statusTexts[$code] ?? 'unknown status'); } try { $content = $problem->asJson(); } catch (JsonException $exception) { $problem = new ApiProblem($exception->getMessage()); $content = $problem->asJson(); } parent::__construct($content, $problem->getStatus(), \array_merge($headers, ['Content-Type' => 'application/problem+json'])); } /** * Creates a ApiProblemResponse from exception. */ public static function createFromException(\Throwable $exception, bool $debug = \false) : self { $headers = []; if ($exception instanceof ApiProblemException) { $problem = $exception->getApiProblem(); } else { $problem = new ApiProblem($exception->getMessage()); if ($exception instanceof HttpExceptionInterface) { $problem->setStatus($exception->getStatusCode()); } if ($exception instanceof ProcessOutputException || $exception instanceof ProcessFailedException) { $problem->setStatus(Response::HTTP_BAD_GATEWAY); $problem->setDetail($exception->getProcess()->getErrorOutput() ?: $exception->getProcess()->getOutput()); } if ($debug) { $problem['debug'] = $exception->getTraceAsString(); } } if ($exception instanceof HttpExceptionInterface) { $headers = $exception->getHeaders(); } return new self($problem, $headers); } } check(); unset($xdebug); if (\function_exists('ini_set')) { @\ini_set('display_errors', 1); @\ini_set('zlib.output_compression', 0); // Set user defined memory limit if ($memoryLimit = \getenv('COMPOSER_MEMORY_LIMIT')) { @\ini_set('memory_limit', $memoryLimit); } else { $memoryInBytes = static function ($value) { $unit = \strtolower(\substr($value, -1, 1)); $value = (int) $value; switch ($unit) { /** @noinspection PhpMissingBreakStatementInspection */ case 'g': $value *= 1024; // no break (cumulative multiplier) /** @noinspection PhpMissingBreakStatementInspection */ case 'm': $value *= 1024; // no break (cumulative multiplier) case 'k': $value *= 1024; } return $value; }; $memoryLimit = \trim(\ini_get('memory_limit')); // Increase memory_limit if it is lower than 1.5GB if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) { @\ini_set('memory_limit', '1536M'); } unset($memoryInBytes); } unset($memoryLimit); } // Workaround PHP bug on Windows where env vars containing Unicode chars are mangled in $_SERVER // see https://github.com/php/php-src/issues/7896 if (\PHP_VERSION_ID >= 70113 && (\PHP_VERSION_ID < 80016 || \PHP_VERSION_ID >= 80100 && \PHP_VERSION_ID < 80103) && Platform::isWindows()) { foreach ($_SERVER as $serverVar => $serverVal) { if (($serverVal = \getenv($serverVar)) !== \false) { $_SERVER[$serverVar] = $serverVal; } } } Platform::putEnv('COMPOSER_BINARY', \realpath($_SERVER['argv'][0])); // Always create kernel to initialize the application $kernel = new ApiKernel('@symfony_env@' === 'prod' ? 'prod' : 'dev'); $input = new ArgvInput(); switch ($input->getFirstArgument()) { // This "test" command is only for the dev version, if the Phar is compiled this is done in the stub.php case 'test': die(\json_encode(['version' => \PHP_VERSION, 'version_id' => \PHP_VERSION_ID, 'sapi' => \PHP_SAPI])); case 'composer': $application = new ComposerApplication(); $argv = $_SERVER['argv']; \array_shift($argv); $input = new ArgvInput($argv); break; default: $application = new ApiApplication($kernel); } $application->run($input); getConfigDir() . \DIRECTORY_SEPARATOR . 'uploads.json', $filesystem, $kernel->getTranslator()); } } getConfigDir() . \DIRECTORY_SEPARATOR . 'users.json', $filesystem, $kernel->getTranslator()); } /** * Gets the application secret. */ public function getSecret() : string { $this->initialize(); if (!isset($this->data['secret'])) { $this->setSecret(\bin2hex(\random_bytes(40))); } return $this->data['secret']; } /** * Sets the application secret. * * @param string $secret */ public function setSecret($secret) : void { $this->initialize(); if (empty($secret)) { throw new \InvalidArgumentException('Secret cannot be empty.'); } $this->data['secret'] = (string) $secret; $this->save(); } public function hasUsers() : bool { $this->initialize(); return isset($this->data['users']) && \is_array($this->data['users']) && [] !== $this->data['users']; } /** * Gets all users. * * @return array */ public function getUsers() : array { $this->initialize(); if (!$this->hasUsers()) { return []; } $users = []; foreach (\array_keys($this->data['users']) as $username) { $users[] = $this->getUser($username); } return $users; } /** * Returns whether a user with the given username exists. */ public function hasUser(string $username) : bool { $this->initialize(); return isset($this->data['users'][$username]); } /** * Gets the user by username or null if it does not exist. */ public function getUser(string $username, string|null $scope = null) : User|null { $this->initialize(); if (!isset($this->data['users'][$username])) { return null; } $data = $this->data['users'][$username]; $user = new User($data['username'], $data['password'] ?? null, $scope ?? $data['scope'] ?? null); if ($data['totp_secret'] ?? null) { $user->setTotpSecret($data['totp_secret']); } if ($data['passkey'] ?? null) { $user->setPasskey($data['passkey']); } return $user; } /** * Creates user from given username and plaintext password but does not add it. */ public function createUser(string $username, string $password, string|null $scope = null) : User { $this->initialize(); $encodedPassword = $this->passwordHasherFactory->getPasswordHasher(new User($username, null))->hash($password); return new User($username, $encodedPassword, $scope); } /** * Adds a user to the configuration file. */ public function addUser(User $user) : void { $this->initialize(); $username = $user->getUserIdentifier(); if (isset($this->data['users'][$username])) { throw new \RuntimeException(\sprintf('Username "%s" already exists.', $username)); } $this->data['users'][$username] = $user->jsonSerialize(); $this->save(); } /** * Replaces a user in the configuration file. */ public function replaceUser(User $user) : void { $this->initialize(); unset($this->data['users'][$user->getUserIdentifier()]); $this->addUser($user); } /** * Update properties of a user in the configuration file. */ public function updateUser(string $username, array $data) : void { $this->initialize(); if (!isset($this->data['users'][$username])) { throw new \RuntimeException(\sprintf('Username "%s" does not exist.', $username)); } if (isset($data['password'])) { $data['password'] = $this->passwordHasherFactory->getPasswordHasher(new User($username, null))->hash($data['password']); } $this->data['users'][$username] = \array_merge($this->data['users'][$username], $data); $this->save(); } /** * Deletes a user from the configuration file. */ public function deleteUser(string $username) : void { $this->initialize(); unset($this->data['users'][$username]); $this->save(); } public function getWebauthnOptions(string $key) : string|null { $this->initialize(); if (($this->data['webauthn'][$key]['expires'] ?? 0) < \time()) { return null; } return $this->data['webauthn'][$key]['options'] ?? null; } public function setWebauthnOptions(string $key, string $value) : void { $this->initialize(); $this->data['webauthn'][$key] = ['options' => $value, 'expires' => \strtotime('+5 minutes')]; $this->save(); } public function deleteWebauthnOptions(string $key) : void { $this->initialize(); unset($this->data['webauthn'][$key]); $this->save(); } /** * Gets tokens from the configuration file. */ public function getTokens() : array { $this->initialize(); if (!isset($this->data['tokens']) || !\is_array($this->data['tokens'])) { return []; } $data = []; foreach ($this->data['tokens'] as $id => $payload) { $data[] = \array_merge(['id' => $id], $payload); } return $data; } /** * Gets token payload by ID (hashed token value). */ public function getToken(string $id) : array|null { $this->initialize(); if (!isset($this->data['tokens'][$id])) { return null; } return \array_merge(['id' => $id], $this->data['tokens'][$id]); } /** * Finds token payload by unhashed token value. */ public function findToken(string $token) : array|null { $this->initialize(); return $this->getToken(\hash('sha256', $token)); } /** * Creates a token for given username. */ public function createToken(string $username, string $clientId, string $scope = 'admin', bool $oneTime = \false) : array { $this->initialize(); if (!$this->hasUser($username)) { throw new \RuntimeException(\sprintf('Username "%s" does not exist.', $username)); } if (!$oneTime) { foreach ($this->getTokens() as $payload) { if ($payload['username'] === $username && $payload['client_id'] === $clientId) { $this->deleteToken($payload['id']); } } } $token = \bin2hex(\random_bytes(16)); $id = \hash('sha256', $token); if (isset($this->data['tokens'][$id])) { throw new \RuntimeException(\sprintf('Token with ID "%s" already exist.', $id)); } $data = ['username' => $username, 'client_id' => $clientId, 'scope' => $scope]; if ($oneTime) { $data['grant_type'] = 'one-time'; $data['expires'] = \strtotime('+30 seconds'); } $this->data['tokens'][$id] = $data; $this->save(); return \array_merge(['id' => $id, 'token' => $token], $this->data['tokens'][$id]); } /** * Deletes a token from the configuration file. */ public function deleteToken(string $id) : void { $this->initialize(); unset($this->data['tokens'][$id]); $this->save(); } public function createInvitation(string $scope = 'admin') : array { $this->initialize(); $token = \bin2hex(\random_bytes(16)); $id = \hash('sha256', $token); if (isset($this->data['tokens'][$id])) { throw new \RuntimeException(\sprintf('Token with ID "%s" already exist.', $id)); } $data = ['scope' => $scope, 'grant_type' => 'invitation', 'expires' => \strtotime('+1 week')]; $this->data['tokens'][$id] = $data; $this->save(); return \array_merge(['id' => $id, 'token' => $token], $this->data['tokens'][$id]); } protected function initialize() : void { parent::initialize(); $hasChanges = \false; if ([] !== $this->data && (!isset($this->data['version']) || (int) $this->data['version'] < 2)) { throw new \RuntimeException('Unsupported user.json version'); } if (!isset($this->data['version'])) { $this->data['version'] = 2; $hasChanges = \true; } foreach ($this->data['tokens'] ?? [] as $id => $token) { if (isset($token['expires']) && $token['expires'] < \time()) { unset($this->data['tokens'][$id]); $hasChanges = \true; } } foreach ($this->data['webauthn'] ?? [] as $key => $data) { if (($data['expires'] ?? 0) < \time()) { unset($this->data['webauthn'][$key]); $hasChanges = \true; } } if ($hasChanges) { $this->save(); } } } getConfigDir() . \DIRECTORY_SEPARATOR . 'manager.json', $filesystem, $kernel->getTranslator()); } } */ abstract class AbstractConfig implements \IteratorAggregate, \Countable { /** * @var array|null */ protected array|null $data = null; private bool $deleted = \false; public function __construct(private readonly string $file, private readonly Filesystem $filesystem, private readonly Translator $translator) { } /** * Returns the config. */ public function all() : array { $this->initialize(); return $this->data; } /** * Returns the config keys. */ public function keys() : array { $this->initialize(); return \array_keys($this->data); } /** * Replaces the current config by a new set. */ public function replace(array $data = []) : void { $this->initialize(); $this->data = $data; $this->save(); } /** * Adds config options. */ public function add(array $data = []) : void { $this->initialize(); $this->data = \array_replace($this->data, $data); $this->save(); } /** * Returns a config option by name. */ public function get(string $key, array|bool|float|int|string|null $default = null) : array|bool|float|int|string|null { $this->initialize(); return \array_key_exists($key, $this->data) ? $this->data[$key] : $default; } /** * Sets a config option by name. */ public function set(string $key, array|bool|float|int|string $value) : void { $this->initialize(); $this->data[$key] = $value; $this->save(); } /** * Returns true if the config option is defined. */ public function has(string $key) : bool { $this->initialize(); return \array_key_exists($key, $this->data); } /** * Removes a config option. */ public function remove(string $key) : void { $this->initialize(); unset($this->data[$key]); $this->save(); } /** * @return \ArrayIterator */ public function getIterator() : \ArrayIterator { $this->initialize(); return new \ArrayIterator($this->data); } public function count() : int { $this->initialize(); return \count($this->data); } /** * Saves current data to the JSON config file. */ public function save() : void { if ($this->deleted || null === $this->data) { return; } try { $this->filesystem->dumpFile($this->file, \json_encode($this->data, \JSON_PRETTY_PRINT)); } catch (IOException $exception) { $this->throwNotWritable($exception); } } public function delete() : void { $this->deleted = \true; try { $this->filesystem->remove($this->file); } catch (IOException $exception) { $this->throwNotWritable($exception); } } protected function initialize() : void { if (null !== $this->data) { return; } if (!$this->filesystem->exists($this->file)) { $this->data = []; return; } $data = \json_decode(\file_get_contents($this->file), \true); if (!\is_array($data)) { throw new \InvalidArgumentException('The config file does not contain valid JSON data.'); } $this->data = $data; } private function throwNotWritable(\Throwable $throwable) : void { $problem = (new ApiProblem($this->translator->trans('error.writable.config-file', ['file' => $this->file]), 'https://php.net/is_writable'))->setDetail($this->translator->trans('error.writable.detail')); throw new ApiProblemException($problem, $throwable); } } getConfigDir() . \DIRECTORY_SEPARATOR . 'config.json', $filesystem, $kernel->getTranslator()); } public function config() : PartialConfig { return new PartialConfig($this, 'config'); } public function repositories() : PartialConfig { return new PartialConfig($this, 'repositories'); } public function allowPlugins() : void { $config = $this->config(); if (\true !== $config->get('allow-plugins')) { $config->set('allow-plugins', \true); } } protected function initialize() : void { if (null !== $this->data) { return; } parent::initialize(); // Make sure the config is in the correct subkey if (!$this->has('config') || [] === $this->get('config')) { $config = $this->all(); unset($config['config']); $this->replace(['config' => $config]); } } } */ class PartialConfig implements \IteratorAggregate, \Countable { public function __construct(private readonly AbstractConfig $parent, private readonly string $key) { } /** * Returns the config. */ public function all() : array { return $this->parent->get($this->key, []); } /** * Returns the config keys. */ public function keys() : array { return \array_keys($this->parent->get($this->key, [])); } /** * Replaces the current config by a new set. */ public function replace(array $data = []) : void { $this->parent->set($this->key, $data); } /** * Adds config options. */ public function add(array $data = []) : void { $this->replace(\array_replace($this->all(), $data)); } /** * Returns a config option by name. */ public function get(string $key, array|bool|float|int|string|null $default = null) : array|bool|float|int|string|null { $data = $this->all(); return \array_key_exists($key, $data) ? $data[$key] : $default; } /** * Sets a config option by name. */ public function set(string $key, array|bool|float|int|string $value) : void { $this->replace([$key => $value]); } /** * Returns true if the config option is defined. */ public function has(string $key) : bool { $data = $this->all(); return \array_key_exists($key, $data); } /** * Removes a config option. */ public function remove(string $key) : void { $data = $this->all(); unset($data[$key]); $this->replace($data); } /** * @return \ArrayIterator */ public function getIterator() : \ArrayIterator { return new \ArrayIterator($this->all()); } public function count() : int { return \count($this->all()); } } getConfigDir() . \DIRECTORY_SEPARATOR . 'auth.json', $filesystem, $kernel->getTranslator()); } /** * Returns the GitHub OAuth token from the config file. */ public function getGithubToken() : string|null { $this->initialize(); if (!isset($this->data['github-oauth']['github.com'])) { return null; } return (string) $this->data['github-oauth']['github.com']; } /** * Stores the GitHub OAuth token in the config file. */ public function setGithubToken(string $token) : void { $this->initialize(); $this->data['github-oauth'] = ['github.com' => $token]; $this->save(); } /** * Adds basic authentication info for given domain. */ public function setBasicAuth(string $domain, string $username, string $password) : void { $this->initialize(); $this->data['http-basic'][$domain] = ['username' => $username, 'password' => $password]; $this->save(); } /** * Deletes basic authentication for given domain. */ public function deleteBasicAuth(string $domain) : void { $this->initialize(); if (!isset($this->data['http-basic'][$domain])) { return; } unset($this->data['http-basic'][$domain]); $this->save(); } } $userProvider */ public function __construct(private readonly UserProviderInterface $userProvider, private readonly UserConfig $userConfig, JwtManager $jwtManager, Filesystem $filesystem, ApiKernel $kernel) { parent::__construct($jwtManager, $this->userConfig, $filesystem, $kernel); } public function supports(Request $request) : bool { if (!parent::supports($request) || !$request->request->has('token')) { return \false; } $token = $this->userConfig->findToken($request->request->get('token')); return $token && 'one-time' === ($token['grant_type'] ?? null); } public function authenticate(Request $request) : SelfValidatingPassport { $token = $this->userConfig->findToken($request->request->get('token')); if (null === $token || 'one-time' !== ($token['grant_type'] ?? null)) { throw new AuthenticationCredentialsNotFoundException(); } $this->tokenId = $token['id']; $userBadge = new UserBadge($token['username'], $this->userProvider->loadUserByIdentifier(...), ['scope' => $token['scope']]); return new SelfValidatingPassport($userBadge); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName) : Response { $this->userConfig->deleteToken($this->tokenId); return parent::onAuthenticationSuccess($request, $token, $firewallName); } } '@contao_manager.webauthn.serializer', '$authenticatorAttestationResponseValidator' => '@contao_manager.webauthn.authenticator_attestation_response_validator', '$authenticatorAssertionResponseValidator' => '@contao_manager.webauthn.authenticator_assertion_response_validator'])] class WebauthnAuthenticator extends AbstractBrowserAuthenticator { /** * @param UserProviderInterface $userProvider */ public function __construct(private readonly SerializerInterface $serializer, private readonly AuthenticatorAttestationResponseValidator $authenticatorAttestationResponseValidator, private readonly AuthenticatorAssertionResponseValidator $authenticatorAssertionResponseValidator, private readonly UserProviderInterface $userProvider, private readonly UserConfig $userConfig, JwtManager $jwtManager, Filesystem $filesystem, ApiKernel $kernel) { parent::__construct($jwtManager, $this->userConfig, $filesystem, $kernel); } public function supports(Request $request) : bool { return parent::supports($request) && $request->request->has('passkey'); } public function authenticate(Request $request) : Passport { $rpEntity = $this->createRpEntity($request->getHost()); if ($request->request->has('username') && (!$this->userConfig->hasUsers() || $request->request->has('invitation'))) { if ($this->userConfig->hasUser($request->request->get('username'))) { throw new UnprocessableEntityHttpException('Username exists.'); } $user = $this->createUser($rpEntity, $request->request->get('username'), $request->request->get('passkey'), $request->request->get('invitation')); $userBadge = new UserBadge($user->getUserIdentifier(), $this->userProvider->loadUserByIdentifier(...)); return new SelfValidatingPassport($userBadge); } $authenticatorAssertionResponse = $this->serializer->deserialize($request->request->get('passkey'), PublicKeyCredential::class, 'json')->response; if (!$authenticatorAssertionResponse instanceof AuthenticatorAssertionResponse) { throw new BadRequestException(); } $username = $authenticatorAssertionResponse->userHandle; $userBadge = new UserBadge($username, $this->userProvider->loadUserByIdentifier(...)); $credentials = new CustomCredentials(function (AuthenticatorAssertionResponse $response, User $user) use($rpEntity) : bool { $passkey = $user->getPasskey(); $challenge = \bin2hex($response->clientDataJSON->challenge); $requestOptions = $this->userConfig->getWebauthnOptions($challenge); if (!$passkey || !$requestOptions) { throw new AuthenticationCredentialsNotFoundException(); } $this->userConfig->deleteWebauthnOptions($challenge); try { $publicKeyCredentialSource = $this->serializer->deserialize($passkey, PublicKeyCredentialSource::class, 'json'); $publicKeyCredentialRequestOptions = $this->serializer->deserialize($requestOptions, PublicKeyCredentialRequestOptions::class, 'json'); $this->authenticatorAssertionResponseValidator->check($publicKeyCredentialSource, $response, $publicKeyCredentialRequestOptions, $rpEntity->id, $user->getUserIdentifier()); return \true; } catch (\Exception $e) { throw new AuthenticationException($e->getMessage(), $e->getCode(), $e); } }, $authenticatorAssertionResponse); return new Passport($userBadge, $credentials); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) : Response { if ($exception instanceof InvalidTotpException) { return new JsonResponse(['username' => $exception->getUser()?->getUserIdentifier(), 'totp_enabled' => \true], Response::HTTP_UNAUTHORIZED); } return parent::onAuthenticationFailure($request, $exception); } public function getCredentialOptions(string $host, string|null $username) : string { $challenge = \random_bytes(32); $rpEntity = $this->createRpEntity($host); if (null === $username) { $options = new PublicKeyCredentialRequestOptions($challenge, $rpEntity->id, userVerification: PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_REQUIRED); } else { $options = new PublicKeyCredentialCreationOptions($rpEntity, new PublicKeyCredentialUserEntity($username, $username, $username), $challenge, [ PublicKeyCredentialParameters::create('public-key', Algorithms::COSE_ALGORITHM_ES256K), // More interesting algorithm PublicKeyCredentialParameters::create('public-key', Algorithms::COSE_ALGORITHM_ES256), // || PublicKeyCredentialParameters::create('public-key', Algorithms::COSE_ALGORITHM_RS256), // || PublicKeyCredentialParameters::create('public-key', Algorithms::COSE_ALGORITHM_PS256), // \/ PublicKeyCredentialParameters::create('public-key', Algorithms::COSE_ALGORITHM_ED256), ], new AuthenticatorSelectionCriteria(userVerification: AuthenticatorSelectionCriteria::USER_VERIFICATION_REQUIREMENT_REQUIRED)); } $serialized = $this->serializer->serialize($options, 'json', [AbstractObjectNormalizer::SKIP_NULL_VALUES => \true, JsonEncode::OPTIONS => \JSON_THROW_ON_ERROR]); $this->userConfig->setWebauthnOptions(\bin2hex($challenge), $serialized); return $serialized; } private function createUser(PublicKeyCredentialRpEntity $rpEntity, string $username, string $data, string|null $invitation = null) : User { $scope = null; if ($invitation) { $token = $this->userConfig->findToken($invitation); if (null === $token || 'invitation' !== ($token['grant_type'] ?? null)) { throw new AuthenticationCredentialsNotFoundException('Invitation not found.'); } $scope = $token['scope']; } elseif ($this->userConfig->hasUsers()) { throw new AccessDeniedException(); } $authenticatorAttestationResponse = $this->serializer->deserialize($data, PublicKeyCredential::class, 'json')->response; if (!$authenticatorAttestationResponse instanceof AuthenticatorAttestationResponse) { throw new BadCredentialsException(); } $challenge = \bin2hex($authenticatorAttestationResponse->clientDataJSON->challenge); $creationOptions = $this->userConfig->getWebauthnOptions($challenge); if (!$creationOptions) { throw new BadCredentialsException(); } $this->userConfig->deleteWebauthnOptions($challenge); $publicKeyCredentialCreationOptions = $this->serializer->deserialize($creationOptions, PublicKeyCredentialCreationOptions::class, 'json'); $publicKeyCredentialSource = $this->authenticatorAttestationResponseValidator->check($authenticatorAttestationResponse, $publicKeyCredentialCreationOptions, $rpEntity->id); $user = new User($username, null, $scope); $user->setPasskey($this->serializer->serialize($publicKeyCredentialSource, 'json')); $this->userConfig->addUser($user); if ($invitation) { $this->userConfig->deleteToken($token['id']); } return $user; } private function createRpEntity(string $host) : PublicKeyCredentialRpEntity { if ('127.0.0.1' === $host) { $host = 'localhost'; } return new PublicKeyCredentialRpEntity('Contao Manager ' . ApiKernel::MANAGER_VERSION, $host); } } $userProvider */ public function __construct(private readonly UserProviderInterface $userProvider, private readonly UserConfig $config) { } public function supports(Request $request) : bool { if ($request->headers->has('Contao-Manager-Auth')) { return \true; } $authentication = $this->getAuthenticationHeader($request); return \is_string($authentication) && 0 === \stripos($authentication, 'bearer '); } public function authenticate(Request $request) : SelfValidatingPassport { $token = $this->config->findToken($this->getToken($request)); if (null === $token || 'one-time' === ($token['grant_type'] ?? null)) { throw new AuthenticationCredentialsNotFoundException(); } $this->tokenId = $token['id']; $userBadge = new UserBadge($token['username'], $this->userProvider->loadUserByIdentifier(...), ['scope' => $token['scope']]); return new SelfValidatingPassport($userBadge); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) : Response|null { return null; } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName) : Response|null { $token->setAttribute('authenticator', static::class); $token->setAttribute('token_id', $this->tokenId); return null; } /** * Gets the authentication header from request or HTTP headers. */ private function getAuthenticationHeader(Request $request) : string|null { if ($request->server->has('HTTP_AUTHORIZATION')) { return $request->server->get('HTTP_AUTHORIZATION'); } if ($request->server->has('REDIRECT_HTTP_AUTHORIZATION')) { return $request->server->get('REDIRECT_HTTP_AUTHORIZATION'); } if (\function_exists('getallheaders')) { $headers = \getallheaders(); if (isset($headers['authorization'])) { return $headers['authorization']; } } return null; } private function getToken(Request $request) : string { if ($request->headers->has('Contao-Manager-Auth')) { return $request->headers->get('Contao-Manager-Auth'); } $authentication = $this->getAuthenticationHeader($request); if (\is_string($authentication) && 0 === \stripos($authentication, 'bearer ')) { return \substr($authentication, 7); } throw new AuthenticationCredentialsNotFoundException(); } } */ class UserProvider implements UserProviderInterface, PasswordUpgraderInterface { public function __construct(private readonly UserConfig $config) { } public function loadUserByIdentifier(string $identifier, array $attributes = []) : UserInterface { $user = $this->config->getUser($identifier, $attributes['scope'] ?? null); if (null === $user) { $ex = new UserNotFoundException(\sprintf('Username "%s" does not exist.', $identifier)); $ex->setUserIdentifier($identifier); throw $ex; } return $user; } public function refreshUser(UserInterface $user) : UserInterface { if (!$user instanceof User) { throw new UnsupportedUserException(\sprintf('Instances of "%s" are not supported.', $user::class)); } return $this->loadUserByIdentifier($user->getUserIdentifier()); } public function supportsClass(string $class) : bool { return User::class === $class; } public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword) : void { if (!$user instanceof User) { throw new UnsupportedUserException(\sprintf('Instances of "%s" are not supported.', $user::class)); } $this->config->replaceUser(new User($user->getUserIdentifier(), $newHashedPassword, $user->getScope())); } } scope ??= 'admin'; if (!\in_array($this->scope, self::SCOPES, \true)) { throw new \InvalidArgumentException('Invalid scope'); } } public function getUserIdentifier() : string { return $this->username; } public function getPassword() : string|null { return $this->password; } public function eraseCredentials() : void { $this->password = null; } public function getPasskey() : string|null { return $this->passkey; } public function setPasskey(string|null $passkey) : void { $this->passkey = $passkey; } public function getScope() : string { return $this->scope; } public function getRoles() : array { return self::rolesFromScope($this->scope) ?? []; } public function getTotpSecret() : string|null { return $this->totp_secret; } public function setTotpSecret(string|null $secret) : void { $this->totp_secret = $secret; } public function jsonSerialize() : array { return ['username' => $this->username, 'password' => $this->password, 'passkey' => $this->passkey, 'scope' => $this->scope, 'totp_secret' => $this->totp_secret]; } public static function rolesFromScope(string|null $scope) : array|null { if (null === $scope || !\in_array($scope, self::SCOPES, \true)) { return null; } return ['ROLE_' . \strtoupper($scope)]; } public static function scopeFromRoles(array $roles) : string|null { $scopes = \array_map(static fn(string $role) => \strtolower(\substr($role, 5)), $roles); $scopes = \array_values(\array_intersect(self::SCOPES, $scopes)); if ([] === $scopes) { return null; } return $scopes[0]; } } $userProvider */ public function __construct(private readonly UserProviderInterface $userProvider, private readonly JwtManager $jwtManager) { } public function supports(Request $request) : bool { return $this->jwtManager->hasRequestToken($request) && null !== $this->jwtManager->getPayload($request); } public function authenticate(Request $request) : Passport { $credentials = $this->jwtManager->getPayload($request); if (null === $credentials) { throw new AuthenticationCredentialsNotFoundException(); } $userBadge = new UserBadge($credentials->username, $this->userProvider->loadUserByIdentifier(...), ['scope' => $credentials->scope ?? null]); return new SelfValidatingPassport($userBadge); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName) : Response|null { $token->setAttribute('authenticator', static::class); return null; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) : Response|null { return null; } } kernel->getConfigDir())) { return \false; } return '/api/session' === $request->getPathInfo() && $request->isMethod(Request::METHOD_POST); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName) : Response { // Reset lock counter $this->filesystem->dumpFile($this->kernel->getConfigDir() . \DIRECTORY_SEPARATOR . self::LOCK_FILE, '0'); $token->setAttribute('authenticator', static::class); $user = $this->userConfig->getUser($token->getUserIdentifier()); $scope = User::scopeFromRoles($token->getRoleNames()); $json = ['username' => $token->getUserIdentifier(), 'scope' => $scope, 'limited' => $scope !== User::scopeFromRoles($user?->getRoles())]; if ($user?->getPasskey()) { $json['passkey'] = \true; } else { $json['totp_enabled'] = (bool) $user?->getTotpSecret(); } $response = new JsonResponse($json, Response::HTTP_CREATED); $this->jwtManager->addToken($request, $response, $token); return $response; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) : Response { // Increase lock counter $this->filesystem->dumpFile($this->kernel->getConfigDir() . \DIRECTORY_SEPARATOR . self::LOCK_FILE, (string) (self::getLockCount($this->kernel->getConfigDir()) + 1)); return new ApiProblemResponse((new ApiProblem())->setStatus(Response::HTTP_UNAUTHORIZED)); } public static function isLocked(string $configDir) : bool { return self::getLockCount($configDir) >= 3; } private static function getLockCount(string $configDir) : int { return (int) @\file_get_contents($configDir . \DIRECTORY_SEPARATOR . self::LOCK_FILE); } } resolved = \true; if (null === $user->getTotpSecret()) { return $this->resolved = \true; } if (!TOTP::createFromSecret($user->getTotpSecret())->verify($this->code)) { $exception = new InvalidTotpException(); $exception->setUser($user); throw $exception; } return $this->resolved = \true; } public function isResolved() : bool { return $this->resolved; } } $userProvider */ public function __construct(private readonly UserProviderInterface $userProvider, private readonly UserConfig $userConfig, JwtManager $jwtManager, Filesystem $filesystem, ApiKernel $kernel) { parent::__construct($jwtManager, $this->userConfig, $filesystem, $kernel); } public function supports(Request $request) : bool { return parent::supports($request) && $request->request->has('username') && $request->request->has('password'); } public function authenticate(Request $request) : Passport { if (!$this->userConfig->hasUsers()) { $user = $this->userConfig->createUser($request->request->get('username'), $request->request->get('password')); $this->userConfig->addUser($user); } elseif ($request->request->has('invitation')) { $token = $this->userConfig->findToken($request->request->get('invitation')); if (null === $token || 'invitation' !== ($token['grant_type'] ?? null)) { throw new AuthenticationCredentialsNotFoundException(); } $user = $this->userConfig->createUser($request->request->get('username'), $request->request->get('password'), $token['scope']); if ($this->userConfig->hasUser($user->getUserIdentifier())) { throw new UnprocessableEntityHttpException('Username exists.'); } $this->userConfig->addUser($user); $this->userConfig->deleteToken($token['id']); } $userBadge = new UserBadge($request->request->get('username'), $this->userProvider->loadUserByIdentifier(...)); $passport = new Passport($userBadge, new PasswordCredentials($request->request->get('password'))); if ($this->userProvider instanceof PasswordUpgraderInterface) { $passport->addBadge(new PasswordUpgradeBadge($request->request->get('password'), $this->userProvider)); } $passport->addBadge(new TotpBadge($request->request->getString('totp'))); return $passport; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) : Response { if ($exception instanceof InvalidTotpException) { return new JsonResponse(['username' => $exception->getUser()?->getUserIdentifier(), 'totp_enabled' => \true], Response::HTTP_UNAUTHORIZED); } return parent::onAuthenticationFailure($request, $exception); } } cookies->has(self::COOKIE_AUTH)) { return null; } try { return JWT::decode($request->cookies->get(self::COOKIE_AUTH), new Key($this->users->getSecret(), 'HS256')); } catch (\Exception) { return null; } } /** * Checks if the request has a JWT cookie. */ public function hasRequestToken(Request $request) : bool { return $request->cookies->has(self::COOKIE_AUTH); } /** * Checks if the response has a JWT cookie. */ public function hasResponseToken(Response $response) : bool { return $this->hasCookie($response); } /** * Adds JWT auth cookies to the given response. */ public function addToken(Request $request, Response $response, TokenInterface $token) : void { $payload = ['iat' => \time(), 'exp' => \strtotime('+30 minutes'), 'username' => $token->getUserIdentifier(), 'scope' => User::scopeFromRoles($token->getRoleNames())]; $response->headers->setCookie($this->createCookie(JWT::encode($payload, $this->users->getSecret(), 'HS256'), $request)); } /** * Clears the JWT cookie in the response. */ public function removeToken(Request $request, Response $response) : void { if (!$request->cookies->has(self::COOKIE_AUTH)) { return; } $response->headers->clearCookie(self::COOKIE_AUTH, ApiKernel::isPhar() ? $request->getBaseUrl() . '/' : '/', null, $request->isSecure()); } /** * Returns whether the response has a cookie with that name. */ private function hasCookie(Response $response) : bool { $cookies = $response->headers->getCookies(); foreach ($cookies as $cookie) { if (self::COOKIE_AUTH === $cookie->getName()) { return \true; } } return \false; } /** * Creates a cookie configured for Contao Manager. */ private function createCookie(string $value, Request $request) : Cookie { return Cookie::create(self::COOKIE_AUTH, $value, 0, ApiKernel::isPhar() ? $request->getBaseUrl() . '/' : '/', null, $request->isSecure(), \true, \false, Cookie::SAMESITE_STRICT); } } restoreBackgroundProcess('composer-remove'); parent::__construct($process); } catch (\Exception) { $arguments = \array_merge(['composer', 'remove'], $this->removed, ['--no-update', '--no-scripts', '--no-ansi', '--no-interaction']); $process = $processFactory->createManagerConsoleBackgroundProcess($arguments, 'composer-remove'); parent::__construct($process); } } public function getSummary() : string { return 'composer remove ' . \implode(' ', $this->removed); } } restoreBackgroundProcess('clear-cache')); } catch (\Exception) { parent::__construct($processFactory->createManagerConsoleBackgroundProcess(['composer', 'clear-cache', '--no-interaction'], 'clear-cache')); } } public function getSummary() : string { return 'composer clear-cache'; } } restoreBackgroundProcess('dump-autoload')); } catch (\Exception) { parent::__construct($processFactory->createManagerConsoleBackgroundProcess(['composer', 'dump-autoload', '--optimize'], 'dump-autoload')); } } public function getSummary() : string { return 'composer dump-autoload'; } public function getDetails() : string|null { $total = $this->getTotalClasses($this->process->getOutput()); if (null !== $total) { return $this->translator->trans('taskoperation.dump-autoload.result', ['count' => $total]); } return ''; } private function getTotalClasses(string $output) : string|null { $lines = \explode("\n", $output); foreach ($lines as $line) { if (\preg_match('{Generated optimized autoload files containing ([\\d.]+) classes}', $line, $match)) { return $match[1]; } } return null; } } restoreBackgroundProcess('composer-install'); $retries = (int) $this->taskConfig->getState('install-retry', 0); if ($retry && $retries < 4 && $process->isTerminated() && !$process->isSuccessful()) { $process->delete(); $this->taskConfig->setState('install-retry', ++$retries); throw new \RuntimeException('Install process failed, restarting'); } parent::__construct($process); } catch (\Exception) { $arguments = ['composer', 'install', '--no-dev', '--no-progress', '--no-ansi', '--no-interaction', '--optimize-autoloader']; if ($this->dryRun) { $arguments[] = '--dry-run'; $arguments[] = '--no-scripts'; $arguments[] = '--no-plugins'; } if ($environment->isDebug()) { $arguments[] = '--profile'; $arguments[] = '-vvv'; } $process = $processFactory->createManagerConsoleBackgroundProcess($arguments, 'composer-install'); // An install task should never need 5min to install $process->setTimeout(60 * 5); parent::__construct($process); } } public function getSummary() : string { $summary = 'composer install'; if ($this->dryRun) { $summary .= ' --dry-run'; } return $summary; } public function getDetails() : string|null { if (!$this->isStarted()) { return null; } if ($this->isRunning() && ($attempt = (int) $this->taskConfig->getState('install-retry', 0)) > 0) { return $this->translator->trans('taskoperation.composer-install.retry', ['current' => $attempt + 1, 'max' => 5]); } if ($this->isSuccessful()) { $output = $this->process->getOutput(); if (\str_contains($output, 'Nothing to install or update')) { return $this->translator->trans('taskoperation.composer-install.nothing'); } $operations = $this->getPackageOperations($output); if (null !== $operations) { return $this->translator->trans('taskoperation.composer-install.result', $operations); } } return ''; } private function getPackageOperations(string $output) : array|null { // Package operations: 6 installs, 85 updates, 0 removals $lines = \explode("\n", $output); foreach ($lines as $line) { if (\false !== ($pos = \strpos($line, 'Package operations:'))) { $operations = \substr($line, $pos); if (\preg_match('{Package operations: (\\d+) installs, (\\d+) updates, (\\d+) removals}', $operations, $match)) { return ['installs' => $match[1], 'updates' => $match[2], 'removals' => $match[3]]; } } } return null; } } restoreBackgroundProcess('composer-update')); } catch (\Exception) { $arguments = \array_merge(['composer', 'update'], $this->packages, ['--with-dependencies', '--no-install', '--no-scripts', '--no-dev', '--no-progress', '--no-ansi', '--no-interaction', '--optimize-autoloader']); if ($this->dryRun) { $arguments[] = '--dry-run'; $arguments[] = '--no-scripts'; $arguments[] = '--no-plugins'; } if ($environment->isDebug()) { $arguments[] = '--profile'; $arguments[] = '-vvv'; } parent::__construct($processFactory->createManagerConsoleBackgroundProcess($arguments, 'composer-update')); } } public function getSummary() : string { $summary = 'composer update'; if ([] !== $this->packages) { $summary .= ' ' . \implode(' ', $this->packages); } $summary .= ' --no-install'; if ($this->dryRun) { $summary .= ' --dry-run'; } return $summary; } } restoreBackgroundProcess('composer-require'); parent::__construct($process); } catch (\Exception) { $arguments = \array_merge(['composer', 'require'], $this->required, ['--no-update', '--no-scripts', '--prefer-stable', '--sort-packages', '--no-ansi', '--no-interaction']); $process = $processFactory->createManagerConsoleBackgroundProcess($arguments, 'composer-require'); parent::__construct($process); } } public function getSummary() : string { return 'composer require ' . \implode(' ', $this->required); } } restoreBackgroundProcess('composer-create-project')); } catch (\Exception) { $folder = \uniqid('contao-'); $arguments = ['composer', 'create-project', $this->package . ($this->version ? ':' . $this->version : ''), $folder, '--no-install', '--no-scripts', '--no-dev', '--no-progress', '--no-ansi', '--no-interaction']; if ($isUpload) { $arguments[] = '--repository=' . \json_encode(['type' => 'artifact', 'url' => $this->environment->getArtifactDir()]); } if ($this->environment->isDebug()) { $arguments[] = '--profile'; $arguments[] = '-vvv'; } $process = $processFactory->createManagerConsoleBackgroundProcess($arguments, 'composer-create-project'); $process->setMeta(['folder' => $folder]); parent::__construct($process); } $this->publicDir = $taskConfig->getState('public-dir'); if (null !== $this->publicDir) { return; } if ($kernel->getProjectDir() === $kernel->getPublicDir()) { throw new \RuntimeException('Cannot install without a public directory.'); } $taskConfig->setState('public-dir', $this->publicDir = $kernel->getPublicDir()); } public function getSummary() : string { return 'composer create-project ' . $this->package . ($this->version ? ':' . $this->version : ''); } public function run() : void { parent::run(); if ($this->process->isSuccessful() && !$this->isInstalled()) { $folder = $this->process->getMeta()['folder'] ?? null; if ($folder) { $fs = new Filesystem(); $files = Finder::create()->exclude(['__MACOSX'])->notName(['theme.xml', '.DS_Store'])->ignoreVCS(\true)->ignoreDotFiles(\true)->depth(0)->in($folder); foreach ($files as $file) { $fs->copy($file->getPathname(), \dirname($file->getPath()) . \DIRECTORY_SEPARATOR . $file->getFilename()); } $fs->removeDirectory($folder); // write public-dir in composer.json try { $file = $this->environment->getComposerJsonFile(); $json = $file->read(); $json['extra']['public-dir'] = \basename((string) $this->publicDir); $file->write($json); } catch (\RuntimeException) { // ignore } $this->process->setMeta(['installed' => \true]); } } } public function isRunning() : bool { return parent::isRunning() || $this->isStarted() && !$this->hasError() && !$this->isInstalled(); } public function isSuccessful() : bool { return parent::isSuccessful() && $this->isInstalled(); } private function isInstalled() : bool { return (bool) ($this->process->getMeta()['installed'] ?? \false); } } changes->getUpdates()) { $summary .= \implode(' ', $this->changes->getUpdates()); } $summary .= ' --no-install'; if ($this->changes->getDryRun()) { $summary .= ' --dry-run'; } return $summary; } public function getDetails() : string|null { $job = $this->getCurrentJob(); if (!$job instanceof CloudJob) { return ''; } switch ($job->getStatus()) { case CloudJob::STATUS_QUEUED: return $this->translator->trans('taskoperation.cloud.queued', ['seconds' => $job->getWaitingTime(), 'jobs' => $job->getJobsInQueue() + $job->getWorkers(), 'workers' => $job->getWorkers()]); case CloudJob::STATUS_PROCESSING: $seconds = $this->taskConfig->getState('cloud-job-processing'); if (!$seconds) { return ''; } $seconds = \time() - $seconds; return $this->translator->trans('taskoperation.cloud.processing', ['seconds' => $seconds]); case CloudJob::STATUS_ERROR: return ''; case CloudJob::STATUS_FINISHED: $seconds = $this->taskConfig->getState('cloud-job-finished', \time()) - $this->taskConfig->getState('cloud-job-processing'); $profile = $this->getFinalProfile($this->getOutput()); \preg_match('{Memory usage: ([^ ]+) \\(peak: ([^)]+)\\), time: ([0-9.]+s)\\.}', $profile, $match); return $this->translator->trans('taskoperation.cloud.finished', ['job' => $job->getId(), 'memory' => $match[1] ?? '', 'peak' => $match[2] ?? '', 'time' => $match[3] ?? '', 'seconds' => $seconds]); } return ''; } public function getConsole() : ConsoleOutput { $console = new ConsoleOutput(); $job = $this->getCurrentJob(); if ($this->exception instanceof CloudException) { return $console->add(\sprintf("> The Composer Resolver Cloud failed with status code %s\n\n %s", $this->exception->getStatusCode(), $this->exception->getErrorMessage())); } if ($this->exception instanceof RequestException && 404 === $this->exception->getStatusCode()) { return $console->add(self::CLOUD_ERROR); } if ($this->exception instanceof \Exception) { return $console->add($this->exception->getMessage()); } if (!$job instanceof CloudJob) { if ($this->hasError()) { $console->add(self::CLOUD_ERROR); } return $console; } $title = '> Resolving dependencies using Composer Cloud ' . $job->getVersion(); switch ($job->getStatus()) { case CloudJob::STATUS_QUEUED: break; case CloudJob::STATUS_PROCESSING: if ($this->environment->isDebug()) { $console->add($this->getOutput(), $title); } else { $console->add($title); } break; case CloudJob::STATUS_ERROR: $console->add(\sprintf("%s\n\n# Cloud Job ID %s failed", $this->getOutput(), $job->getId()), $title); break; case CloudJob::STATUS_FINISHED: $output = $this->getOutput(); $seconds = $this->taskConfig->getState('cloud-job-finished', \time()) - $this->taskConfig->getState('cloud-job-processing'); $profile = $this->getFinalProfile($output); \preg_match('{Memory usage: ([^ ]+) \\(peak: ([^)]+)\\), time: ([0-9.]+s)\\.}', $profile, $match); $console->add($output, $title); $console->add("# Job ID {$job->getId()} completed in {$seconds} seconds\n# " . $profile); break; default: throw new \RuntimeException(\sprintf('Unknown cloud status "%s"', $job->getStatus())); } return $console; } public function isStarted() : bool { try { return null !== $this->taskConfig->getState('cloud-job'); } catch (\Exception $exception) { $this->exception = $exception; return \true; } } public function isRunning() : bool { try { return $this->isStarted() && null === $this->taskConfig->getState('cloud-job-successful'); } catch (\Exception $exception) { $this->exception = $exception; return \false; } } public function isSuccessful() : bool { return (bool) $this->taskConfig->getState('cloud-job-successful', \false); } public function hasError() : bool { return \false === $this->taskConfig->getState('cloud-job-successful'); } public function continueOnError() : bool { return \false; } public function run() : void { try { if (null === $this->taskConfig->getState('cloud-job')) { // Retry to create Cloud job, the first request always fails on XAMPP for // unknown reason $attempts = (int) $this->taskConfig->getState('cloud-job-attempts', 0); if ($attempts >= 5) { $this->taskConfig->setState('cloud-job-successful', \false); $this->output = self::CLOUD_ERROR; return; } $this->taskConfig->setState('cloud-job-attempts', $attempts + 1); $this->job = $this->cloud->createJob($this->changes, $this->environment); $this->taskConfig->setState('cloud-job', $this->job->getId()); return; } if (null !== $this->taskConfig->getState('cloud-job-successful')) { return; } $job = $this->getCurrentJob(); if (!$job instanceof CloudJob) { return; } if ($job->isSuccessful()) { try { $lockJson = $this->validateComposerFiles($job); $this->filesystem->dumpFile($this->environment->getLockFile(), $lockJson); $this->taskConfig->setState('cloud-job-successful', \true); } catch (\Exception $e) { $this->taskConfig->setState('cloud-job-validation-error', $e->getMessage()); $this->taskConfig->setState('cloud-job-successful', \false); } } elseif ($job->isFailed()) { $this->taskConfig->setState('cloud-job-successful', \false); } } catch (\Exception $exception) { $this->exception = $exception; $this->output = self::CLOUD_ERROR; } } public function abort() : void { $this->taskConfig->setState('cloud-job-successful', \false); } public function delete() : void { try { $this->output = $this->taskConfig->getState('cloud-job-output', ''); $this->cloud->deleteJob((string) $this->taskConfig->getState('cloud-job')); } catch (\Exception $exception) { $this->exception = $exception; } } public function getSponsor() : array|null { if (!$this->job instanceof CloudJob) { return null; } return $this->job->getSponsor(); } private function getCurrentJob() : CloudJob|null { if ($this->job instanceof CloudJob) { return $this->job; } if (null === $this->taskConfig->getState('cloud-job')) { return null; } try { if (\is_array($content = $this->taskConfig->getState('cloud-job-status'))) { $this->job = new CloudJob($content); if (null !== $this->taskConfig->getState('cloud-job-successful')) { $this->output = $this->taskConfig->getState('cloud-job-output', ''); return $this->job; } $lastUpdated = \time() - (int) $this->taskConfig->getState('cloud-job-updated', \time()); $isProcessing = (int) $this->taskConfig->getState('cloud-job-processing', 0) > 0; if ($isProcessing && $lastUpdated <= 5 || $lastUpdated <= 10) { $this->output = $this->taskConfig->getState('cloud-job-output', ''); return $this->job; } } } catch (\Exception $exception) { // do nothing } try { $this->job = $this->cloud->getJob((string) $this->taskConfig->getState('cloud-job')); } catch (\Exception $exception) { $this->exception = $exception; if ($exception instanceof CloudException && $exception->isClientError()) { $this->taskConfig->setState('cloud-job-successful', \false); } return $this->job; } if (!$this->job instanceof CloudJob) { return null; } $this->taskConfig->setState('cloud-job-status', $this->job->jsonSerialize()); $this->taskConfig->setState('cloud-job-updated', \time()); if ($this->job->isProcessing() && !$this->taskConfig->getState('cloud-job-processing')) { $this->taskConfig->setState('cloud-job-processing', \time()); } if (!$this->taskConfig->getState('cloud-job-finished') && ($this->job->isSuccessful() || $this->job->isFailed())) { $this->taskConfig->setState('cloud-job-finished', \time()); } return $this->job; } private function getFinalProfile(string $output) : string { // Memory usage: 353.94MB (peak: 1327.09MB), time: 160.17s $lines = \array_reverse(\explode("\n", $output)); foreach ($lines as $line) { if (\false !== ($pos = \strpos($line, 'Memory usage:'))) { return \substr($line, $pos); } } return ''; } private function getOutput() : string { if (null !== $this->output) { return $this->output; } $job = $this->getCurrentJob(); if (null === $job) { return $this->output = self::CLOUD_ERROR; } try { $this->output = $this->cloud->getOutput($job); if (null === $this->output) { $this->output = self::CLOUD_ERROR; } else { if ($validationError = $this->taskConfig->getState('cloud-job-validation-error')) { $this->output .= "\n–––––––––––––––––––––––––––––––––––––––––\n\n"; $this->output .= $validationError; } $this->taskConfig->setState('cloud-job-output', $this->output); } return $this->output; } catch (\Exception) { return $this->output = self::CLOUD_ERROR; } } /** * The composer.json of a cloud job must be identical to the local file. If that * is not the case, either an incorrect job is trying to be installed, or the * local composer.json was modified after the cloud job was started. Both cases * are not valid and unsupported. */ private function validateComposerFiles(CloudJob $job) : string { try { $remoteJson = JsonFile::parseJson($this->cloud->getComposerJson($job)); $localJson = $this->environment->getComposerJson(); if ($remoteJson !== $localJson) { $this->logger?->error('The composer.json file of the cloud job does not match the local composer.json', ['local' => $localJson, 'remote' => $remoteJson]); throw new \RuntimeException('The composer.json file of the cloud job does not match the local composer.json'); } $remoteLock = $this->cloud->getComposerLock($job); $lockContent = JsonFile::parseJson($remoteLock); Validator::createFromComposer($this->environment->getComposer(\true))->validate($lockContent); } catch (ValidationException $throwable) { $this->logger?->error('Failed validating composer.lock from cloud job: ' . $throwable->getMessage(), ['composerJson' => $remoteJson, 'composerLock' => $remoteLock]); throw $throwable; } return $remoteLock; } } translator->trans('taskoperation.install-uploads.summary'); } public function getDetails() : string|null { $files = \array_map(static fn($config) => $config['name'], $this->uploads); return \implode(', ', $files); } public function getConsole() : ConsoleOutput { $console = new ConsoleOutput(); if (!$this->isSuccessful()) { return $console; } $installed = $this->taskConfig->getState($this->getName() . '.files'); if (!empty($installed)) { $console->add(\implode('', \array_map(fn($upload): string => '- ' . $this->translator->trans('taskoperation.install-uploads.console', $upload), $installed))); } return $this->addConsoleOutput($console); } protected function doRun() : bool { $installed = []; foreach ($this->uploads as $config) { $target = \basename((string) $config['package']['dist']['url']); // Ignore if a file is already installed, so it's not deleted on failed operation if ($this->filesystem->exists($this->environment->getArtifactDir() . '/' . $target)) { continue; } $this->filesystem->copy($this->environment->getUploadDir() . '/' . $config['id'], $this->environment->getArtifactDir() . '/' . $target); $installed[$target] = ['name' => $target, 'package' => $config['package']['name'], 'version' => $config['package']['version']]; } $this->taskConfig->setState($this->getName() . '.files', $installed); return \true; } protected function getName() : string { return 'install-uploads'; } } translator->trans('taskoperation.remove-artifacts.summary'); } public function getDetails() : string|null { return \implode(', ', $this->files); } protected function doRun() : bool { foreach ($this->files as $file) { try { $this->filesystem->remove($this->environment->getArtifactDir() . '/' . $file); } catch (IOException) { // Ignore if file could not be deleted } } return \true; } protected function getName() : string { return 'remove-artifacts'; } } filesystem->remove($this->environment->getVendorDir()); return \true; } protected function getName() : string { return 'remove-vendor'; } } translator->trans('taskoperation.remove-uploads.summary'); } public function getDetails() : string|null { $files = \array_map(static fn($config) => $config['name'], $this->uploads); return \implode(', ', $files); } protected function doRun() : bool { foreach ($this->uploads as $config) { $this->uploadsConfig->remove($config['id']); try { $this->filesystem->remove($this->environment->getUploadDir() . '/' . $config['id']); } catch (IOException) { // Ignore if file could not be deleted } } return \true; } protected function getName() : string { return 'remove-uploads'; } } environment; } protected function doRun() : bool { $this->filesystem->remove($this->getCacheDir()); return \true; } protected function getName() : string { return $this->name . '@' . $this->getCacheDir(); } /** * Gets the Contao cache directory for current environment. */ private function getCacheDir() : string { return $this->kernel->getProjectDir() . '/var/cache/' . $this->environment; } } isSuccessful()) { return $this->translator->trans('taskoperation.self-update.success', ['new' => $this->updater->getOldVersion()]); } return $this->translator->trans('taskoperation.self-update.detail', ['old' => $this->updater->getOldVersion(), 'new' => $this->updater->getNewVersion()]); } protected function doRun() : bool { return $this->updater->update(); } protected function getName() : string { return 'self-update'; } } addConsoleOutput(new ConsoleOutput()); } public function isStarted() : bool { return null !== $this->taskConfig->getState($this->getName()); } public function isRunning() : bool { return TaskStatus::STATUS_ACTIVE === $this->taskConfig->getState($this->getName()); } public function isSuccessful() : bool { return TaskStatus::STATUS_COMPLETE === $this->taskConfig->getState($this->getName()); } public function hasError() : bool { return TaskStatus::STATUS_ERROR === $this->taskConfig->getState($this->getName()); } public function continueOnError() : bool { return \false; } public function run() : void { // Inline task should never need more than 60secs to complete. Assume something // went wrong. $started = (int) $this->taskConfig->getState($this->getName() . '.started', 0); if ($started > 0 && $started + 60 < \time()) { $this->taskConfig->setState($this->getName(), TaskStatus::STATUS_ERROR); $this->taskConfig->setState($this->getName() . '.error', 'Inline operation did not complete within 60 seconds.'); return; } // Do not start the inline task again if it has been started if ($this->isStarted()) { return; } $this->taskConfig->setState($this->getName(), TaskStatus::STATUS_ACTIVE); $this->taskConfig->setState($this->getName() . '.started', \time()); $success = null; \register_shutdown_function(function () use(&$success) : void { if (null === $success) { $this->taskConfig->setState($this->getName(), TaskStatus::STATUS_ERROR); } }); try { $success = $this->doRun(); } catch (\Throwable $throwable) { $this->taskConfig->setState($this->getName() . '.error', $throwable->getMessage()); $success = \false; } if ($success) { $this->taskConfig->setState($this->getName(), TaskStatus::STATUS_COMPLETE); } else { $this->taskConfig->setState($this->getName(), TaskStatus::STATUS_ERROR); } } public function abort() : void { if ($this->isRunning()) { $this->taskConfig->setState($this->getName(), TaskStatus::STATUS_ERROR); } } public function delete() : void { // Do nothing } /** * Adds the exception message to the console output. */ protected function addConsoleOutput(ConsoleOutput $console) : ConsoleOutput { if ($error = $this->taskConfig->getState($this->getName() . '.error')) { $console->add((string) $error); } return $console; } /** * Gets the name to store this operation state in the config file. */ protected abstract function getName() : string; /** * Executes the operation and returns whether it was successful. * * @throws \Exception */ protected abstract function doRun() : bool; } output; } /** * Adds output to the console log. */ public function add(string $output, string|null $title = null) : self { if (null !== $title) { $output = \sprintf("%s\n\n%s", $title, $output); } if ('' === $output) { return $this; } if ('' !== $this->output) { $output = $this->output . "\n\n" . $output; } $this->output = $output; return $this; } } 'SIGHUP', 2 => 'SIGINT', 3 => 'SIGQUIT', 9 => 'SIGKILL', 15 => 'SIGTERM']; private bool $abort = \false; public function __construct(protected readonly Process|ProcessController $process) { } public function getDetails() : string|null { return ''; } public function getConsole() : ConsoleOutput { $console = new ConsoleOutput(); if (!$this->process->isStarted()) { return $console; } $console->add($this->process->getOutput() . $this->getProcessError(), '$ ' . $this->process->getCommandLine()); return $console; } public function isStarted() : bool { return $this->process->isStarted(); } public function isRunning() : bool { return $this->process->isRunning(); } public function isSuccessful() : bool { return $this->process->isSuccessful(); } public function hasError() : bool { return $this->abort || $this->process->isTerminated() && $this->process->getExitCode() > 0; } public function continueOnError() : bool { return \false; } public function run() : void { if (!$this->process->isStarted()) { $this->process->start(); } } public function abort() : void { $this->abort = \true; if ($this->isRunning()) { $this->process->stop(); } } public function delete() : void { $this->process->delete(); } protected function getProcessError() : string { $output = ''; if ($this->process->isTerminated()) { $signal = ''; if ($this->process->hasBeenSignaled()) { $signal = $this->getSignalText($this->process->getTermSignal()); } elseif ($this->process->hasBeenStopped()) { $signal = $this->getSignalText($this->process->getStopSignal()); } if ($this->process instanceof ProcessController && $this->process->getForker() instanceof InlineForker) { $output = <<<'OUTPUT' # WARNING: INLINE PROCESS EXECUTION # Background processes are not support by your server/shell. # The operation might have be affected by script runtime (e.g. stop after 30 seconds). # OUTPUT; } $output .= \sprintf("\n# Process terminated with exit code %s\n# Result: %s%s\n", $this->process->getExitCode(), $this->process->getExitCodeText(), $signal); } return $output; } private function getSignalText(int|null $signal) : string { if (isset(self::SIGNALS[$signal])) { return \sprintf(' [%s]', self::SIGNALS[$signal]); } return \sprintf(' [signal %s]', $signal); } } state; } public function continueOnError() : bool { return \true; } protected function getName() : string { return 'maintenance-' . $this->state; } protected function doRun() : bool { $process = $this->processFactory->createContaoConsoleProcess(['contao:maintenance-mode', $this->state, '--no-interaction']); $process->run(); return $process->isSuccessful(); } } restoreBackgroundProcess($processId)); } catch (\Exception) { parent::__construct($processFactory->createContaoConsoleBackgroundProcess(['contao:backup:create'], $processId)); } } public function getSummary() : string { return 'vendor/bin/contao-console contao:backup:create'; } } restoreBackgroundProcess($processId)); } catch (\Exception) { parent::__construct($processFactory->createContaoConsoleBackgroundProcess(['cache:warmup', '--env=' . $environment], $processId)); } } public function getSummary() : string { return 'vendor/bin/contao-console cache:warmup'; } } version = $taskConfig->getOption('version'); $this->publicDir = $taskConfig->getState('public-dir'); if (!\in_array($this->version, self::SUPPORTED_VERSIONS, \true)) { throw new \InvalidArgumentException('Unsupported Contao version'); } if (null !== $this->publicDir) { return; } if ($kernel->getProjectDir() === $kernel->getPublicDir()) { throw new \RuntimeException('Cannot install without a public directory.'); } $taskConfig->setState('public-dir', $this->publicDir = $kernel->getPublicDir()); } public function getSummary() : string { return 'composer create-project contao/managed-edition:' . $this->version; } protected function getName() : string { return 'create-project'; } protected function doRun() : bool { $protected = [$this->environment->getJsonFile(), $this->environment->getLockFile(), $this->environment->getVendorDir()]; if ($this->filesystem->exists($protected)) { throw new \RuntimeException('Cannot install into existing application'); } $this->filesystem->dumpFile($this->environment->getJsonFile(), $this->generateComposerJson($this->taskConfig->getOption('version'), (bool) $this->taskConfig->getOption('core-only', \false))); return \true; } private function generateComposerJson(string $version, bool $coreOnly = \false) : string { $coreBundle = ''; if ($this->isDevVersion($version)) { $version .= '.x-dev'; $coreBundle = ', "contao/core-bundle": "' . $version . '"'; } else { $version .= '.*'; } if ($coreOnly) { $require = <<=')) { $publicDir = \basename((string) $this->publicDir); $script = '@php vendor/bin/contao-setup'; } else { $publicDir = 'web'; $script = 'Contao\\\\ManagerBundle\\\\Composer\\\\ScriptHandler::initializeApplication'; } return <<restoreBackgroundProcess($processId)); } catch (\Exception) { parent::__construct($processFactory->createContaoConsoleBackgroundProcess(['contao:backup:restore', $this->file], $processId)); } } public function getSummary() : string { return 'vendor/bin/contao-console contao:backup:restore ' . $this->file; } } restoreBackgroundProcess($processId)); } catch (\Exception) { parent::__construct($processFactory->createContaoConsoleBackgroundProcess(['cache:clear', '--env=' . $environment, '--no-warmup'], $processId)); } } public function getSummary() : string { return 'vendor/bin/contao-console cache:clear --no-warmup'; } } 'tasks'])] class CloudResolver implements LoggerAwareInterface { use LoggerAwareTrait; private const API_URL = 'https://www.composer-resolver.cloud'; public function __construct(private Request $request) { } /** * Creates a Cloud job for given composer changes. */ public function createJob(CloudChanges $changes, Environment $environment) : CloudJob { $environment->reset(); $data = ['composerJson' => $environment->getComposerJson(), 'composerLock' => $environment->getComposerLock(), 'platform' => $environment->getPlatformPackages(), 'localPackages' => $environment->getLocalPackages()]; $command = $changes->getUpdates(); $command[] = '--with-dependencies'; $command[] = '--profile'; if ($environment->isDebug()) { $command[] = '-vvv'; } $body = \json_encode($data); $headers = ['Composer-Resolver-Client: contao', 'Composer-Resolver-Command: ' . \implode(' ', $command)]; if (null !== $this->logger) { $this->logger->info('Creating Composer Cloud job', ['headers' => $headers, 'body' => $body]); } $content = $this->request->postJson(self::API_URL . '/jobs', $body, $headers, $statusCode); switch ($statusCode) { case 200: case 201: case 202: // Location redirect to fetch the job content return new CloudJob(JsonFile::parseJson($content)); case 400: throw new CloudException('Composer Resolver did not accept the API call', $statusCode, $content, $body); case 503: throw new CloudException('Too many jobs on the Composer Resolver queue.', $statusCode, $content, $body); default: throw $this->createUnknownResponseException($statusCode, $content, $body); } } /** * Gets job information from the Composer Cloud. */ public function getJob(string $jobId) : CloudJob|null { if ('' === $jobId) { return null; } $content = $this->request->getJson(self::API_URL . '/jobs/' . $jobId, ['Composer-Resolver-Client: contao'], $statusCode); return match ($statusCode) { 200, 202 => new CloudJob(JsonFile::parseJson($content)), default => throw $this->createUnknownResponseException($statusCode, $content), }; } /** * Deletes a cloud job and returns whether it was successful. */ public function deleteJob(string $jobId) : bool { if ('' === $jobId) { return \false; } $content = $this->request->deleteJson(self::API_URL . '/jobs/' . $jobId, ['Composer-Resolver-Client: contao'], $statusCode); if (204 === $statusCode) { return \true; } throw $this->createUnknownResponseException($statusCode, $content); } /** * Gets the composer.json file. */ public function getComposerJson(CloudJob $job) : string { return $this->getContent($job->getLink(CloudJob::LINK_JSON)); } /** * Gets the composer.lock file or null if the cloud job was not successful. */ public function getComposerLock(CloudJob $job) : string|null { if (!$job->isSuccessful()) { return null; } return $this->getContent($job->getLink(CloudJob::LINK_LOCK)); } /** * Gets the console output for a cloud job. */ public function getOutput(CloudJob $job) : string|null { if ($job->isQueued()) { return null; } return $this->getContent($job->getLink(CloudJob::LINK_OUTPUT)); } private function getContent(string $link) : string { $content = $this->request->getJson(self::API_URL . $link, ['Composer-Resolver-Client: contao'], $statusCode, \true); if (200 === $statusCode) { return $content; } throw $this->createUnknownResponseException($statusCode, $content); } private function createUnknownResponseException(int|null $statusCode, string|null $responseBody, string|null $requestBody = null) : CloudException { return new CloudException('Composer Resolver returned an unexpected status code', (int) $statusCode, (string) $responseBody, $requestBody); } } remove[$packageName]); $this->require[$packageName] = $version ? $packageName . '=' . $version : $packageName; $this->addUpdate($packageName); } public function getRequiredPackages() : array { return $this->require; } public function removePackage(string $packageName) : void { unset($this->require[$packageName]); $this->remove[$packageName] = $packageName; $this->addUpdate($packageName); } public function getRemovedPackages() : array { return $this->remove; } public function setUpdates(array $updates) : void { $this->updates = []; foreach ($updates as $packageName) { $this->updates[$packageName] = $packageName; } } public function addUpdate(string $packageName) : void { $this->updates[$packageName] = $packageName; } public function getUpdates() : array { return \array_values($this->updates); } public function setDryRun(bool $dryRun) : void { $this->dryRun = $dryRun; } public function getDryRun() : bool { return $this->dryRun; } } result['jobId']; } public function getStatus() : string { return $this->result['status']; } public function getLink(string $name) : string|null { return $this->result['links'][$name] ?? null; } public function getSponsor() : array { return $this->result['sponsoredBy']; } public function getWaitingTime() : int { if (self::STATUS_QUEUED !== $this->result['status']) { return 0; } $currentPos = $this->result['queuePosition'] ?: $this->result['stats']['numberOfJobsInQueue']; return (int) \round($currentPos * $this->result['stats']['averageProcessingTimeInMs'] / 1000 / \max($this->result['stats']['numberOfWorkers'], 1)); } public function getJobsInQueue() : int { return (int) $this->result['queuePosition'] ?: $this->result['stats']['numberOfJobsInQueue']; } public function getWorkers() : int { return (int) $this->result['stats']['numberOfWorkers']; } public function getVersion() : string { return isset($this->result['stats']['appVersion']) ? 'v' . $this->result['stats']['appVersion'] : ''; } public function isQueued() : bool { return self::STATUS_QUEUED === $this->getStatus(); } public function isProcessing() : bool { return self::STATUS_PROCESSING === $this->getStatus(); } public function isSuccessful() : bool { return self::STATUS_FINISHED === $this->getStatus(); } public function isFailed() : bool { return self::STATUS_ERROR === $this->getStatus(); } public function jsonSerialize() : array { return $this->result; } } getCode(); } /** * Returns the Cloud error message or the exception message as fallback. */ public function getErrorMessage() : string { $message = $this->getMessage() . "\n\nResponse:\n" . $this->responseBody; if ($this->requestBody) { $message .= "\n\nRequest:\n" . $this->requestBody; } return $message; } public function isInvalid() : bool { return $this->getStatusCode() < 100 || $this->getStatusCode() >= 600; } public function isInformational() : bool { return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200; } public function isSuccessful() : bool { return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300; } public function isRedirection() : bool { return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400; } public function isClientError() : bool { return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500; } public function isServerError() : bool { return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600; } } composer = null; } /** * Returns whether debug mode is activated. */ public function isDebug() : bool { return $this->kernel->isDebug(); } /** * Gets path to the directory where all Contao Manager related information is stored. */ public function getBackupDir() : string { return $this->kernel->getConfigDir(); } public function getBackupPaths() : array { return [$this->getJsonFile() => \sprintf('%s/%s~', $this->getBackupDir(), \basename($this->getJsonFile())), $this->getLockFile() => \sprintf('%s/%s~', $this->getBackupDir(), \basename($this->getLockFile()))]; } public function createBackup() : bool { if (!$this->filesystem->exists($this->getJsonFile())) { if (null !== $this->logger) { $this->logger->info('Cannot create composer file backup, source JSON does not exist', ['file' => $this->getJsonFile()]); } return \false; } if (null !== $this->logger) { $this->logger->info('Creating backup of composer files'); } foreach ($this->getBackupPaths() as $source => $target) { if ($this->filesystem->exists($source)) { $this->filesystem->copy($source, $target, \true); if (null !== $this->logger) { $this->logger->info(\sprintf('Copied "%s" to "%s"', $source, $target)); } } elseif (null !== $this->logger) { $this->logger->info(\sprintf('File "%s" does not exist', $source)); } } return \true; } public function restoreBackup() : bool { if (null !== $this->logger) { $this->logger->info('Restoring backup of composer files'); } foreach (\array_flip($this->getBackupPaths()) as $source => $target) { if ($this->filesystem->exists($source)) { $this->filesystem->copy($source, $target, \true); $this->filesystem->remove($source); if (null !== $this->logger) { $this->logger->info(\sprintf('Copied "%s" to "%s"', $source, $target)); } } elseif (null !== $this->logger) { $this->logger->info(\sprintf('File "%s" does not exist', $source)); } } return \true; } /** * Gets path to the composer.json file in the Contao root. */ public function getJsonFile() : string { return $this->kernel->getProjectDir() . \DIRECTORY_SEPARATOR . 'composer.json'; } /** * Gets path to the composer.lock file in the Contao root. */ public function getLockFile() : string { return $this->kernel->getProjectDir() . \DIRECTORY_SEPARATOR . 'composer.lock'; } /** * Gets the directory where Composer installs its packages to. */ public function getVendorDir() : string { return $this->kernel->getProjectDir() . \DIRECTORY_SEPARATOR . 'vendor'; } /** * Gets the directory where uploads are stored to. These are temporary and only * until they are installed as artifact or provider. */ public function getUploadDir() : string { $dir = $this->kernel->getConfigDir() . '/uploads'; $this->filesystem->mkdir($dir); return $dir; } /** * Gets the path where artifacts are installed to. Artifacts are ZIP files that * contain Composer packages. * * @see https://getcomposer.org/doc/05-repositories.md#artifact */ public function getArtifactDir() : string { $dir = $this->kernel->getConfigDir() . '/packages'; $this->filesystem->mkdir($dir); return $dir; } /** * Gets list of file names in the artifacts directory. */ public function getArtifacts() : array { $files = []; $finder = (new Finder())->files()->depth(0)->in($this->getArtifactDir()); foreach ($finder->getIterator() as $file) { $files[] = $file->getFilename(); } return $files; } /** * Gets the Composer instance. */ public function getComposer(bool $reload = \false) : Composer { $this->composerConfig->allowPlugins(); if (null === $this->composer || $reload) { $this->composer = Factory::create(new NullIO(), $this->getJsonFile()); $this->fixManagerPlugin(); } return $this->composer; } /** * Gets whether the Cloud resolver is enabled in the Manager configuration. */ public function useCloudResolver() : bool { return !$this->managerConfig->get('disable_cloud', \false); } public function getComposerJsonFile() : JsonFile { $file = $this->getComposer()->getConfig()->getConfigSource()->getName(); return new JsonFile($file); } public function getComposerJson() : array { $json = $this->getComposerJsonFile()->read(); $repositories = $this->getComposer()->getConfig()->getRepositories(); unset($repositories['packagist.org']); if ([] !== $repositories || !empty($json['repositories'])) { $json['repositories'] = []; foreach ($repositories as $repository) { if (isset($repository['url'])) { $repository['url'] = $this->normalizeRepositoryPath($repository['url']); } $json['repositories'][] = $repository; } } return $json; } public function getComposerLockFile() : JsonFile { return new JsonFile($this->getLockFile()); } public function getComposerLock() : array { $locker = $this->getComposer()->getLocker(); if (!$locker->isLocked()) { return []; } return $locker->getLockData(); } public function getPlatformPackages() : array { $platformOverrides = $this->getComposer()->getConfig()->get('platform'); $platform = []; foreach ((new PlatformRepository([], $platformOverrides))->getPackages() as $package) { if (\in_array($package->getName(), ['composer-plugin-api', 'composer-runtime-api'], \true)) { continue; } $platform[$package->getName()] = $package->getVersion(); } return $platform; } public function getLocalPackages() : array { $packages = []; $repositories = $this->getComposer()->getRepositoryManager()->getRepositories(); $dumper = new ArrayDumper(); foreach ($repositories as $repository) { if ($repository instanceof ArtifactRepository || $repository instanceof PathRepository) { foreach ($repository->getPackages() as $package) { $dump = $dumper->dump($package); if (isset($dump['dist']['path'])) { $dump['dist']['path'] = $this->normalizeRepositoryPath($dump['dist']['path']); } // see https://github.com/composer/composer/issues/7955 unset($dump['dist']['reference']); $packages[] = $dump; } } } return $packages; } public function mergeMetadata(array $package, string|null $language = null) : array { if (isset($package['source']) || \preg_match('{https?://}', $package['dist']['url'] ?? '') || empty($package['extra']['contao-metadata-url'])) { return $package; } try { $headers = []; if ($language) { $headers[] = 'Accept-Language: ' . $language; } if ($package['version'] ?? null) { $headers[] = 'Contao-Package-Version: ' . $package['version']; } $metadata = JsonFile::parseJson($this->request->getJson($package['extra']['contao-metadata-url'], $headers), $package['extra']['contao-metadata-url']); if (\is_array($metadata)) { // Make sure only allowed keys are preserved in metadata $metadata = \array_intersect_key($metadata, \array_flip(['title', 'description', 'homepage', 'suggest', 'support', 'funding', 'abandoned', 'logo'])); // Do not allow custom logo URLs since they could track the Contao Manager user/browser if (isset($metadata['logo']) && \preg_match('{https?://}i', (string) $metadata['logo'])) { unset($metadata['logo']); } return \array_merge($package, $metadata, ['private' => \true]); } } catch (\Exception) { } return $package; } private function normalizeRepositoryPath(string $path) : string { if (null === $this->composerFs) { $this->composerFs = new \Composer\Util\Filesystem(); } $normalizedPath = $this->composerFs->normalizePath($path); if (\str_starts_with($path, './')) { return './' . $normalizedPath; } return $normalizedPath; } /** * Fix order of repositories if the latest manager-plugin is not installed. * * @see https://github.com/contao/manager-plugin/pull/59 */ private function fixManagerPlugin() : void { $repoManager = $this->composer->getRepositoryManager(); // Skip if contao/manager-plugin was found in a version newer than 2.13.3 (the // last before the bugfix) if ($repoManager->getLocalRepository()->findPackage('contao/manager-plugin', '> 2.13.3')) { return; } $ref = new \ReflectionProperty($repoManager, 'repositories'); /** @var array $repositories */ $repositories = $ref->getValue($repoManager); $changed = \false; foreach ($repositories as $k => $repo) { if ('composer repo (https://repo.packagist.org)' === $repo->getRepoName()) { unset($repositories[$k]); $repositories[] = $repo; $changed = \true; break; } } if ($changed) { $ref->setValue($repoManager, $repositories); } } } a:35:{i:0;O:51:"Symfony\Component\Config\Resource\DirectoryResource":2:{s:61:"Symfony\Component\Config\Resource\DirectoryResourceresource";s:83:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller";s:60:"Symfony\Component\Config\Resource\DirectoryResourcepattern";s:8:"/\.php$/";}i:1;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:109:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Config/AuthController.php";}i:2;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:113:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Config/ComposerController.php";}i:3;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Config/ManagerController.php";}i:4;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:108:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/ConstraintController.php";}i:5;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:114:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/AccessKeyController.php";}i:6;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/BackupController.php";}i:7;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:122:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/DatabaseMigrationController.php";}i:8;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:120:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/InstallToolLockController.php";}i:9;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:114:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/JwtCookieController.php";}i:10;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:120:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/MaintenanceModeController.php";}i:11;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:102:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/FileController.php";}i:12;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:101:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/LogController.php";}i:13;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/CloudController.php";}i:14;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:120:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/LocalPackagesController.php";}i:15;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:122:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/MissingPackagesController.php";}i:16;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:118:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/RootPackageController.php";}i:17;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:121:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/UploadPackagesController.php";}i:18;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:114:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/AdminUserController.php";}i:19;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:113:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/ComposerController.php";}i:20;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/ConfigController.php";}i:21;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/ContaoController.php";}i:22;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:113:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/DatabaseController.php";}i:23;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/OpcacheController.php";}i:24;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/PhpCliController.php";}i:25;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/PhpWebController.php";}i:26;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/PhpinfoController.php";}i:27;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:115:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/SelfUpdateController.php";}i:28;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:105:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/SessionController.php";}i:29;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:102:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/TaskController.php";}i:30;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:102:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/UserController.php";}i:31;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:86:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/ApiKernel.php";}i:32;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:106:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/vendor/symfony/http-kernel/Kernel.php";}i:33;O:72:"Symfony\Component\DependencyInjection\Config\ContainerParametersResource":1:{s:84:"Symfony\Component\DependencyInjection\Config\ContainerParametersResourceparameters";a:0:{}}i:34;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:133:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Resources/cache/Contao_ManagerApi_ApiKernelProdContainer.php";}} 'LaZhPOO', 'container.build_id' => '4aa78b0e', 'container.build_time' => 1749109567, 'container.runtime_mode' => \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], \true) ? 'web=0' : 'web=1'], __DIR__ . \DIRECTORY_SEPARATOR . 'ContainerLaZhPOO'); [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController::putGithubToken'], [], [['text', '/api/config/auth/config/auth/github-oauth']], [], [], []], 'contao_managerapi_config_composer__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController'], [], [['text', '/api/config/composer']], [], [], []], 'contao_managerapi_config_manager__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController'], [], [['text', '/api/config/manager']], [], [], []], 'contao_managerapi_constraint__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController'], [], [['text', '/api/constraint']], [], [], []], 'contao_managerapi_contao_accesskey__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController'], [], [['text', '/api/contao/access-key']], [], [], []], 'contao_managerapi_contao_backup__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController'], [], [['text', '/api/contao/backup']], [], [], []], 'contao_managerapi_contao_databasemigration__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController'], [], [['text', '/api/contao/database-migration']], [], [], []], 'contao_managerapi_contao_installtoollock__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController'], [], [['text', '/api/contao/install-tool/lock']], [], [], []], 'contao_managerapi_contao_jwtcookie__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController'], [], [['text', '/api/contao/jwt-cookie']], [], [], []], 'contao_managerapi_contao_maintenancemode__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController'], [], [['text', '/api/contao/maintenance-mode']], [], [], []], 'contao_managerapi_file__invoke' => [['file'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController'], [], [['variable', '/', '[^/]++', 'file', \true], ['text', '/api/files']], [], [], []], 'contao_managerapi_log_listfiles' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::listFiles'], [], [['text', '/api/logs']], [], [], []], 'contao_managerapi_log_retrievefile' => [['filename'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::retrieveFile'], [], [['variable', '/', '[^/]++', 'filename', \true], ['text', '/api/logs']], [], [], []], 'contao_managerapi_log_deletefile' => [['filename'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::deleteFile'], [], [['variable', '/', '[^/]++', 'filename', \true], ['text', '/api/logs']], [], [], []], 'contao_managerapi_packages_cloud_getclouddata' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::getCloudData'], [], [['text', '/api/packages/cloud']], [], [], []], 'contao_managerapi_packages_cloud_writeandinstall' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::writeAndInstall'], [], [['text', '/api/packages/cloud']], [], [], []], 'contao_managerapi_packages_localpackages__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController'], [], [['text', '/api/packages/local']], [], [], []], 'contao_managerapi_packages_localpackages__invoke_1' => [['name'], ['name' => null, '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController'], ['name' => '.+'], [['variable', '/', '.+', 'name', \true], ['text', '/api/packages/local']], [], [], []], 'contao_managerapi_packages_missingpackages__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController'], [], [['text', '/api/packages/missing']], [], [], []], 'contao_managerapi_packages_rootpackage__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController'], [], [['text', '/api/packages/root']], [], [], []], 'contao_managerapi_packages_uploadpackages_read' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::read'], [], [['text', '/api/packages/uploads']], [], [], []], 'contao_managerapi_packages_uploadpackages_upload' => [[], ['form-data' => \true, '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::upload'], [], [['text', '/api/packages/uploads']], [], [], []], 'contao_managerapi_packages_uploadpackages_delete' => [['id'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::delete'], [], [['variable', '/', '[^/]++', 'id', \true], ['text', '/api/packages/uploads']], [], [], []], 'contao_managerapi_server_adminuser__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController'], [], [['text', '/api/server/admin-user']], [], [], []], 'contao_managerapi_server_composer__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController'], [], [['text', '/api/server/composer']], [], [], []], 'contao_managerapi_server_config_getconfig' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::getConfig'], [], [['text', '/api/server/config']], [], [], []], 'contao_managerapi_server_config_setconfig' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::setConfig'], [], [['text', '/api/server/config']], [], [], []], 'contao_managerapi_server_contao_handle' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::handle'], [], [['text', '/api/server/contao']], [], [], []], 'contao_managerapi_server_contao_update' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::update'], [], [['text', '/api/server/contao']], [], [], []], 'contao_managerapi_server_database_handle' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::handle'], [], [['text', '/api/server/database']], [], [], []], 'contao_managerapi_server_database_write' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::write'], [], [['text', '/api/server/database']], [], [], []], 'contao_managerapi_server_opcache_getopcache' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::getOpcache'], [], [['text', '/api/server/opcache']], [], [], []], 'contao_managerapi_server_opcache_deleteopcache' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::deleteOpcache'], [], [['text', '/api/server/opcache']], [], [], []], 'contao_managerapi_server_phpcli__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController'], [], [['text', '/api/server/php-cli']], [], [], []], 'contao_managerapi_server_phpweb__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController'], [], [['text', '/api/server/php-web']], [], [], []], 'contao_managerapi_server_phpinfo__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController'], [], [['text', '/api/server/phpinfo']], [], [], []], 'contao_managerapi_server_selfupdate__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController'], [], [['text', '/api/server/self-update']], [], [], []], 'contao_managerapi_session_getsession' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getSession'], [], [['text', '/api/session']], [], [], []], 'contao_managerapi_session_getwebauthnoptions' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getWebauthnOptions'], [], [['text', '/api/session/options']], [], [], []], 'contao_managerapi_task__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController'], [], [['text', '/api/task']], [], [], []], 'contao_managerapi_user_listusers' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listUsers'], [], [['text', '/api/users']], [], [], []], 'contao_managerapi_user_createuser' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createUser'], [], [['text', '/api/users']], [], [], []], 'user_get' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveUser'], [], [['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_replaceuser' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::replaceUser'], [], [['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_deleteuser' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteUser'], [], [['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_setpassword' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setPassword'], [], [['text', '/password'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_gettotp' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::getTOTP'], [], [['text', '/totp'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_setuptotp' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setupTotp'], [], [['text', '/totp'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_deletetotp' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteTotp'], [], [['text', '/totp'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_listtokens' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listTokens'], [], [['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_createtoken' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createToken'], [], [['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_retrievetoken' => [['username', 'id'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveToken'], [], [['variable', '/', '[^/]++', 'id', \true], ['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_deletetoken' => [['username', 'id'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteToken'], [], [['variable', '/', '[^/]++', 'id', \true], ['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], 'contao_managerapi_user_inviteuser' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::inviteUser'], [], [['text', '/api/invitations']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController::putGithubToken' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController::putGithubToken'], [], [['text', '/api/config/auth/config/auth/github-oauth']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController'], [], [['text', '/api/config/composer']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController'], [], [['text', '/api/config/composer']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController'], [], [['text', '/api/config/manager']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController'], [], [['text', '/api/config/manager']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController'], [], [['text', '/api/constraint']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController'], [], [['text', '/api/constraint']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController'], [], [['text', '/api/contao/access-key']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController'], [], [['text', '/api/contao/access-key']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController'], [], [['text', '/api/contao/backup']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController'], [], [['text', '/api/contao/backup']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController'], [], [['text', '/api/contao/database-migration']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController'], [], [['text', '/api/contao/database-migration']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController'], [], [['text', '/api/contao/install-tool/lock']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController'], [], [['text', '/api/contao/install-tool/lock']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController'], [], [['text', '/api/contao/jwt-cookie']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController'], [], [['text', '/api/contao/jwt-cookie']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController'], [], [['text', '/api/contao/maintenance-mode']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController'], [], [['text', '/api/contao/maintenance-mode']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController' => [['file'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController'], [], [['variable', '/', '[^/]++', 'file', \true], ['text', '/api/files']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController::__invoke' => [['file'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController'], [], [['variable', '/', '[^/]++', 'file', \true], ['text', '/api/files']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::listFiles' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::listFiles'], [], [['text', '/api/logs']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::retrieveFile' => [['filename'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::retrieveFile'], [], [['variable', '/', '[^/]++', 'filename', \true], ['text', '/api/logs']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::deleteFile' => [['filename'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::deleteFile'], [], [['variable', '/', '[^/]++', 'filename', \true], ['text', '/api/logs']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::getCloudData' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::getCloudData'], [], [['text', '/api/packages/cloud']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::writeAndInstall' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::writeAndInstall'], [], [['text', '/api/packages/cloud']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController'], [], [['text', '/api/packages/missing']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController'], [], [['text', '/api/packages/missing']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController'], [], [['text', '/api/packages/root']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController'], [], [['text', '/api/packages/root']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::read' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::read'], [], [['text', '/api/packages/uploads']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::upload' => [[], ['form-data' => \true, '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::upload'], [], [['text', '/api/packages/uploads']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::delete' => [['id'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::delete'], [], [['variable', '/', '[^/]++', 'id', \true], ['text', '/api/packages/uploads']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController'], [], [['text', '/api/server/admin-user']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController'], [], [['text', '/api/server/admin-user']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController'], [], [['text', '/api/server/composer']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController'], [], [['text', '/api/server/composer']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::getConfig' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::getConfig'], [], [['text', '/api/server/config']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::setConfig' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::setConfig'], [], [['text', '/api/server/config']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::handle' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::handle'], [], [['text', '/api/server/contao']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::update' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::update'], [], [['text', '/api/server/contao']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::handle' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::handle'], [], [['text', '/api/server/database']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::write' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::write'], [], [['text', '/api/server/database']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::getOpcache' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::getOpcache'], [], [['text', '/api/server/opcache']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::deleteOpcache' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::deleteOpcache'], [], [['text', '/api/server/opcache']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController'], [], [['text', '/api/server/php-cli']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController'], [], [['text', '/api/server/php-cli']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController'], [], [['text', '/api/server/php-web']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController'], [], [['text', '/api/server/php-web']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController'], [], [['text', '/api/server/phpinfo']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController'], [], [['text', '/api/server/phpinfo']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController'], [], [['text', '/api/server/self-update']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController'], [], [['text', '/api/server/self-update']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getSession' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getSession'], [], [['text', '/api/session']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getWebauthnOptions' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getWebauthnOptions'], [], [['text', '/api/session/options']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController'], [], [['text', '/api/task']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController::__invoke' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController'], [], [['text', '/api/task']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listUsers' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listUsers'], [], [['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createUser' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createUser'], [], [['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveUser' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveUser'], [], [['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::replaceUser' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::replaceUser'], [], [['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteUser' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteUser'], [], [['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setPassword' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setPassword'], [], [['text', '/password'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::getTOTP' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::getTOTP'], [], [['text', '/totp'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setupTotp' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setupTotp'], [], [['text', '/totp'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteTotp' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteTotp'], [], [['text', '/totp'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listTokens' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listTokens'], [], [['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createToken' => [['username'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createToken'], [], [['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveToken' => [['username', 'id'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveToken'], [], [['variable', '/', '[^/]++', 'id', \true], ['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteToken' => [['username', 'id'], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteToken'], [], [['variable', '/', '[^/]++', 'id', \true], ['text', '/tokens'], ['variable', '/', '[^/]++', 'username', \true], ['text', '/api/users']], [], [], []], '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::inviteUser' => [[], ['_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::inviteUser'], [], [['text', '/api/invitations']], [], [], []]]; [[['_route' => 'contao_managerapi_config_auth_putgithubtoken', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController::putGithubToken'], null, ['GET' => 0, 'PUT' => 1, 'PATCH' => 2], null, \false, \false, null]], '/api/config/composer' => [[['_route' => 'contao_managerapi_config_composer__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController'], null, ['GET' => 0, 'PUT' => 1, 'PATCH' => 2], null, \false, \false, null]], '/api/config/manager' => [[['_route' => 'contao_managerapi_config_manager__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController'], null, ['GET' => 0, 'PUT' => 1, 'PATCH' => 2], null, \false, \false, null]], '/api/constraint' => [[['_route' => 'contao_managerapi_constraint__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController'], null, ['POST' => 0], null, \false, \false, null]], '/api/contao/access-key' => [[['_route' => 'contao_managerapi_contao_accesskey__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController'], null, ['GET' => 0, 'PUT' => 1, 'DELETE' => 2], null, \false, \false, null]], '/api/contao/backup' => [[['_route' => 'contao_managerapi_contao_backup__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController'], null, ['GET' => 0], null, \false, \false, null]], '/api/contao/database-migration' => [[['_route' => 'contao_managerapi_contao_databasemigration__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController'], null, ['GET' => 0, 'PUT' => 1, 'DELETE' => 2], null, \false, \false, null]], '/api/contao/install-tool/lock' => [[['_route' => 'contao_managerapi_contao_installtoollock__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController'], null, ['GET' => 0, 'PUT' => 1, 'DELETE' => 2], null, \false, \false, null]], '/api/contao/jwt-cookie' => [[['_route' => 'contao_managerapi_contao_jwtcookie__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController'], null, ['GET' => 0, 'PUT' => 1, 'DELETE' => 2], null, \false, \false, null]], '/api/contao/maintenance-mode' => [[['_route' => 'contao_managerapi_contao_maintenancemode__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController'], null, ['GET' => 0, 'PUT' => 1, 'DELETE' => 2], null, \false, \false, null]], '/api/logs' => [[['_route' => 'contao_managerapi_log_listfiles', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::listFiles'], null, ['GET' => 0], null, \false, \false, null]], '/api/packages/cloud' => [[['_route' => 'contao_managerapi_packages_cloud_getclouddata', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::getCloudData'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_packages_cloud_writeandinstall', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController::writeAndInstall'], null, ['PUT' => 0], null, \false, \false, null]], '/api/packages/local' => [[['_route' => 'contao_managerapi_packages_localpackages__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController'], null, ['GET' => 0], null, \false, \false, null]], '/api/packages/missing' => [[['_route' => 'contao_managerapi_packages_missingpackages__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController'], null, ['GET' => 0], null, \false, \false, null]], '/api/packages/root' => [[['_route' => 'contao_managerapi_packages_rootpackage__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController'], null, ['GET' => 0], null, \false, \false, null]], '/api/packages/uploads' => [[['_route' => 'contao_managerapi_packages_uploadpackages_read', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::read'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_packages_uploadpackages_upload', 'form-data' => \true, '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::upload'], null, ['POST' => 0], null, \false, \false, null]], '/api/server/admin-user' => [[['_route' => 'contao_managerapi_server_adminuser__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController'], null, ['GET' => 0, 'POST' => 1], null, \false, \false, null]], '/api/server/composer' => [[['_route' => 'contao_managerapi_server_composer__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController'], null, ['GET' => 0], null, \false, \false, null]], '/api/server/config' => [[['_route' => 'contao_managerapi_server_config_getconfig', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::getConfig'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_server_config_setconfig', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController::setConfig'], null, ['PUT' => 0], null, \false, \false, null]], '/api/server/contao' => [[['_route' => 'contao_managerapi_server_contao_handle', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::handle'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_server_contao_update', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::update'], null, ['POST' => 0], null, \false, \false, null]], '/api/server/database' => [[['_route' => 'contao_managerapi_server_database_handle', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::handle'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_server_database_write', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::write'], null, ['POST' => 0], null, \false, \false, null]], '/api/server/opcache' => [[['_route' => 'contao_managerapi_server_opcache_getopcache', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::getOpcache'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_server_opcache_deleteopcache', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController::deleteOpcache'], null, ['DELETE' => 0], null, \false, \false, null]], '/api/server/php-cli' => [[['_route' => 'contao_managerapi_server_phpcli__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController'], null, ['GET' => 0], null, \false, \false, null]], '/api/server/php-web' => [[['_route' => 'contao_managerapi_server_phpweb__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController'], null, ['GET' => 0], null, \false, \false, null]], '/api/server/phpinfo' => [[['_route' => 'contao_managerapi_server_phpinfo__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController'], null, ['GET' => 0], null, \false, \false, null]], '/api/server/self-update' => [[['_route' => 'contao_managerapi_server_selfupdate__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController'], null, ['GET' => 0], null, \false, \false, null]], '/api/session' => [[['_route' => 'contao_managerapi_session_getsession', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getSession'], null, ['GET' => 0, 'POST' => 1, 'DELETE' => 2], null, \false, \false, null]], '/api/session/options' => [[['_route' => 'contao_managerapi_session_getwebauthnoptions', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController::getWebauthnOptions'], null, ['GET' => 0, 'POST' => 1], null, \false, \false, null]], '/api/task' => [[['_route' => 'contao_managerapi_task__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController'], null, ['GET' => 0, 'PUT' => 1, 'PATCH' => 2, 'DELETE' => 3], null, \false, \false, null]], '/api/users' => [[['_route' => 'contao_managerapi_user_listusers', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listUsers'], null, ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_user_createuser', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createUser'], null, ['POST' => 0], null, \false, \false, null]], '/api/invitations' => [[['_route' => 'contao_managerapi_user_inviteuser', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::inviteUser'], null, ['POST' => 0], null, \false, \false, null]], ], [ // $regexpList 0 => '{^(?' . '|/api/(?' . '|files/([^/]++)(*:29)' . '|logs/([^/]++)(?' . '|(*:52)' . ')' . '|packages/(?' . '|local(?:/(.+))?(*:87)' . '|uploads/([^/]++)(*:110)' . ')' . '|users/([^/]++)(?' . '|(*:136)' . '|/(?' . '|password(*:156)' . '|to(?' . '|tp(?' . '|(*:174)' . ')' . '|kens(?' . '|(*:190)' . '|/([^/]++)(?' . '|(*:210)' . ')' . ')' . ')' . ')' . ')' . ')' . ')/?$}sDu', ], [ // $dynamicRoutes 29 => [[['_route' => 'contao_managerapi_file__invoke', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController'], ['file'], ['GET' => 0, 'PUT' => 1], null, \false, \true, null]], 52 => [[['_route' => 'contao_managerapi_log_retrievefile', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::retrieveFile'], ['filename'], ['GET' => 0], null, \false, \true, null], [['_route' => 'contao_managerapi_log_deletefile', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController::deleteFile'], ['filename'], ['DELETE' => 0], null, \false, \true, null]], 87 => [[['_route' => 'contao_managerapi_packages_localpackages__invoke_1', 'name' => null, '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController'], ['name'], ['GET' => 0], null, \false, \true, null]], 110 => [[['_route' => 'contao_managerapi_packages_uploadpackages_delete', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController::delete'], ['id'], ['DELETE' => 0], null, \false, \true, null]], 136 => [[['_route' => 'user_get', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveUser'], ['username'], ['GET' => 0], null, \false, \true, null], [['_route' => 'contao_managerapi_user_replaceuser', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::replaceUser'], ['username'], ['PUT' => 0], null, \false, \true, null], [['_route' => 'contao_managerapi_user_deleteuser', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteUser'], ['username'], ['DELETE' => 0], null, \false, \true, null]], 156 => [[['_route' => 'contao_managerapi_user_setpassword', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setPassword'], ['username'], ['PUT' => 0], null, \false, \false, null]], 174 => [[['_route' => 'contao_managerapi_user_gettotp', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::getTOTP'], ['username'], ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_user_setuptotp', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::setupTotp'], ['username'], ['PUT' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_user_deletetotp', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteTotp'], ['username'], ['DELETE' => 0], null, \false, \false, null]], 190 => [[['_route' => 'contao_managerapi_user_listtokens', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::listTokens'], ['username'], ['GET' => 0], null, \false, \false, null], [['_route' => 'contao_managerapi_user_createtoken', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::createToken'], ['username'], ['POST' => 0], null, \false, \false, null]], 210 => [[['_route' => 'contao_managerapi_user_retrievetoken', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::retrieveToken'], ['username', 'id'], ['GET' => 0], null, \false, \true, null], [['_route' => 'contao_managerapi_user_deletetoken', '_controller' => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController::deleteToken'], ['username', 'id'], ['DELETE' => 0], null, \false, \true, null], [null, null, null, null, \false, \false, 0]], ], null, ]; a:35:{i:0;O:51:"Symfony\Component\Config\Resource\DirectoryResource":2:{s:61:"Symfony\Component\Config\Resource\DirectoryResourceresource";s:83:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller";s:60:"Symfony\Component\Config\Resource\DirectoryResourcepattern";s:8:"/\.php$/";}i:1;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:109:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Config/AuthController.php";}i:2;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:113:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Config/ComposerController.php";}i:3;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Config/ManagerController.php";}i:4;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:108:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/ConstraintController.php";}i:5;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:114:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/AccessKeyController.php";}i:6;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/BackupController.php";}i:7;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:122:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/DatabaseMigrationController.php";}i:8;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:120:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/InstallToolLockController.php";}i:9;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:114:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/JwtCookieController.php";}i:10;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:120:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Contao/MaintenanceModeController.php";}i:11;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:102:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/FileController.php";}i:12;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:101:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/LogController.php";}i:13;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/CloudController.php";}i:14;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:120:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/LocalPackagesController.php";}i:15;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:122:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/MissingPackagesController.php";}i:16;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:118:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/RootPackageController.php";}i:17;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:121:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Packages/UploadPackagesController.php";}i:18;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:114:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/AdminUserController.php";}i:19;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:113:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/ComposerController.php";}i:20;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/ConfigController.php";}i:21;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/ContaoController.php";}i:22;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:113:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/DatabaseController.php";}i:23;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/OpcacheController.php";}i:24;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/PhpCliController.php";}i:25;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:111:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/PhpWebController.php";}i:26;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:112:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/PhpinfoController.php";}i:27;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:115:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/Server/SelfUpdateController.php";}i:28;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:105:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/SessionController.php";}i:29;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:102:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/TaskController.php";}i:30;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:102:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Controller/UserController.php";}i:31;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:86:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/ApiKernel.php";}i:32;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:106:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/vendor/symfony/http-kernel/Kernel.php";}i:33;O:72:"Symfony\Component\DependencyInjection\Config\ContainerParametersResource":1:{s:84:"Symfony\Component\DependencyInjection\Config\ContainerParametersResourceparameters";a:0:{}}i:34;O:46:"Symfony\Component\Config\Resource\FileResource":1:{s:56:"Symfony\Component\Config\Resource\FileResourceresource";s:133:"/Users/aschempp/Projects/Contao/contao-manager/contao-manager-1.10.3/api/Resources/cache/Contao_ManagerApi_ApiKernelProdContainer.php";}}= 7.4 when preloading is desired use _ContaoManager\Symfony\Component\DependencyInjection\Dumper\Preloader; if (\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], \true)) { return; } require \dirname(__DIR__, 3) . '/vendor/autoload.php'; (require __DIR__ . '/Contao_ManagerApi_ApiKernelProdContainer.php')->set(\_ContaoManager\ContainerLaZhPOO\Contao_ManagerApi_ApiKernelProdContainer::class, null); require __DIR__ . '/ContainerLaZhPOO/RequestPayloadValueResolverGhost8d82153.php'; require __DIR__ . '/ContainerLaZhPOO/getServicesResetterService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_UserValueResolverService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_UserCheckerLocatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_SecurityTokenValueResolverService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_RouteLoader_LogoutService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Listener_UserProviderService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Listener_UserChecker_ApiService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Listener_PasswordMigratingService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Listener_CheckAuthenticatorCredentialsService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Listener_Api_UserProviderService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_HelperService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Firewall_Map_Context_ApiService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Firewall_EventDispatcherLocatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Firewall_Authenticator_ApiService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_EventDispatcher_ApiService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_ChannelListenerService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Authenticator_ManagersLocatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Authenticator_Manager_ApiService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_AccessMapService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_AccessListenerService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Access_RoleHierarchyVoterService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecurity_Access_AuthenticatedVoterService.php'; require __DIR__ . '/ContainerLaZhPOO/getSecrets_VaultService.php'; require __DIR__ . '/ContainerLaZhPOO/getRouting_LoaderService.php'; require __DIR__ . '/ContainerLaZhPOO/getPropertyInfo_SerializerExtractorService.php'; require __DIR__ . '/ContainerLaZhPOO/getMonolog_Logger_TasksService.php'; require __DIR__ . '/ContainerLaZhPOO/getMonolog_Logger_SecurityService.php'; require __DIR__ . '/ContainerLaZhPOO/getMonolog_LoggerService.php'; require __DIR__ . '/ContainerLaZhPOO/getErrorControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getDebug_ErrorHandlerConfiguratorService.php'; require __DIR__ . '/ContainerLaZhPOO/getContainer_GetRoutingConditionServiceService.php'; require __DIR__ . '/ContainerLaZhPOO/getContainer_EnvVarProcessorsLocatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getContainer_EnvVarProcessorService.php'; require __DIR__ . '/ContainerLaZhPOO/getCache_SystemClearerService.php'; require __DIR__ . '/ContainerLaZhPOO/getCache_SystemService.php'; require __DIR__ . '/ContainerLaZhPOO/getCache_SecurityIsGrantedAttributeExpressionLanguageService.php'; require __DIR__ . '/ContainerLaZhPOO/getCache_GlobalClearerService.php'; require __DIR__ . '/ContainerLaZhPOO/getCache_AppClearerService.php'; require __DIR__ . '/ContainerLaZhPOO/getCache_AppService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_VariadicService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_UidService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_SessionService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_ServiceService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_RequestAttributeService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_RequestService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_QueryParameterValueResolverService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_DefaultService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_DatetimeService.php'; require __DIR__ . '/ContainerLaZhPOO/getArgumentResolver_BackedEnumResolverService.php'; require __DIR__ . '/ContainerLaZhPOO/getTemplateControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getRedirectControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getTaskManagerService.php'; require __DIR__ . '/ContainerLaZhPOO/getUpdateTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getSetupTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getInstallTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getSelfUpdateTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getRebuildCacheTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getBackupRestoreTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getBackupCreateTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getDumpAutoloadTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getClearCacheTaskService.php'; require __DIR__ . '/ContainerLaZhPOO/getServerInfoService.php'; require __DIR__ . '/ContainerLaZhPOO/getSelfUpdateService.php'; require __DIR__ . '/ContainerLaZhPOO/getRequestService.php'; require __DIR__ . '/ContainerLaZhPOO/getWebauthnAuthenticatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getUserProviderService.php'; require __DIR__ . '/ContainerLaZhPOO/getTokenAuthenticatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getPasswordlessAuthenticatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getLoginAuthenticatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getJwtAuthenticatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getContaoConsoleService.php'; require __DIR__ . '/ContainerLaZhPOO/getContaoApiService.php'; require __DIR__ . '/ContainerLaZhPOO/getConsoleProcessFactoryService.php'; require __DIR__ . '/ContainerLaZhPOO/getSysTempDirCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getSymlinkCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getSessionCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getProcessCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getPhpExtensionsCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getMemoryLimitCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getIntegrityCheckFactoryService.php'; require __DIR__ . '/ContainerLaZhPOO/getGraphicsLibCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getAllowUrlFopenCheckService.php'; require __DIR__ . '/ContainerLaZhPOO/getTranslatorService.php'; require __DIR__ . '/ContainerLaZhPOO/getExceptionListenerService.php'; require __DIR__ . '/ContainerLaZhPOO/getUserControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getTaskControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getSessionControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getSelfUpdateControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getPhpinfoControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getPhpWebControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getPhpCliControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getOpcacheControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getDatabaseControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getContaoControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getConfigControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getComposerController2Service.php'; require __DIR__ . '/ContainerLaZhPOO/getAdminUserControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getUploadPackagesControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getRootPackageControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getMissingPackagesControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getLocalPackagesControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getCloudControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getLogControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getFileControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getMaintenanceModeControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getJwtCookieControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getInstallToolLockControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getDatabaseMigrationControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getBackupControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getAccessKeyControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getConstraintControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getManagerControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getComposerControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getAuthControllerService.php'; require __DIR__ . '/ContainerLaZhPOO/getUploadsConfigService.php'; require __DIR__ . '/ContainerLaZhPOO/getManagerConfigService.php'; require __DIR__ . '/ContainerLaZhPOO/getComposerConfigService.php'; require __DIR__ . '/ContainerLaZhPOO/getEnvironmentService.php'; require __DIR__ . '/ContainerLaZhPOO/getCloudResolverService.php'; require __DIR__ . '/ContainerLaZhPOO/get_ServiceLocator_Y_Xs7MwService.php'; require __DIR__ . '/ContainerLaZhPOO/get_ServiceLocator_AH5O6SdService.php'; require __DIR__ . '/ContainerLaZhPOO/get_ServiceLocator_EZsc_DOService.php'; $classes = []; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\SecurityBundle'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\MonologBundle'; $classes[] = '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ServiceLocator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Config\\AuthConfig'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\EventListener\\JsonRequestListener'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerInterface'; $classes[] = '_ContaoManager\\Webauthn\\Denormalizer\\WebauthnSerializerFactory'; $classes[] = '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatementSupportManager'; $classes[] = '_ContaoManager\\Webauthn\\AuthenticatorAttestationResponseValidator'; $classes[] = '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStepManager'; $classes[] = '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStepManagerFactory'; $classes[] = '_ContaoManager\\Webauthn\\AuthenticatorAssertionResponseValidator'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\System\\Request'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Process\\PhpExecutableFinder'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\InstallTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\SetupTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\UpdateTask'; $classes[] = '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\Clock\\Clock'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter'; $classes[] = '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AdapterInterface'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessor'; $classes[] = '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AbstractAdapter'; $classes[] = '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarProcessor'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\IsGrantedAttributeListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\ErrorHandlerConfigurator'; $classes[] = '_ContaoManager\\Monolog\\Logger'; $classes[] = '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ErrorController'; $classes[] = '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer'; $classes[] = '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer'; $classes[] = '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcher'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Filesystem\\Filesystem'; $classes[] = '_ContaoManager\\Symfony\\Component\\Runtime\\Runner\\Symfony\\HttpKernelRunner'; $classes[] = '_ContaoManager\\Symfony\\Component\\Runtime\\Runner\\Symfony\\ResponseRunner'; $classes[] = '_ContaoManager\\Symfony\\Component\\Runtime\\SymfonyRuntime'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernel'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory'; $classes[] = '_ContaoManager\\Monolog\\Handler\\FingersCrossedHandler'; $classes[] = '_ContaoManager\\Monolog\\Handler\\ErrorLogHandler'; $classes[] = '_ContaoManager\\Monolog\\Processor\\PsrLogMessageProcessor'; $classes[] = '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy'; $classes[] = '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\PhpDocExtractor'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\PhpStanExtractor'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ReflectionExtractor'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\SerializerExtractor'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestStack'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\Router'; $classes[] = '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\RequestContext'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\XmlFileLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\Config\\FileLocator'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\YamlFileLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\PhpFileLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\GlobFileLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\DirectoryLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ContainerLoader'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\AttributeRouteControllerLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeDirectoryLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeFileLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Psr4DirectoryLoader'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault'; $classes[] = '_ContaoManager\\Symfony\\Component\\String\\LazyString'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManager'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\AffirmativeStrategy'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\RoleHierarchyVoter'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\RoleHierarchy'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AccessListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessMap'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ChainRequestMatcher'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\PathRequestMatcher'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticatorManager'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationChecker'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ChannelListener'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\FirewallListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Logout\\LogoutUrlGenerator'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AuthenticatorManagerListener'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallMap'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallContext'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ExceptionListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\HttpUtils'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallConfig'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserProviderListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckCredentialsListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\PasswordMigratingListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserCheckerListener'; $classes[] = '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactory'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Routing\\LogoutRouteLoader'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorage'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUserChecker'; $classes[] = '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Serializer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\UnwrappingDenormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ProblemNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\UidNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateTimeNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ConstraintViolationListNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\MetadataAwareNameConverter'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateTimeZoneNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateIntervalNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\FormErrorNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\BackedEnumNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DataUriNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\JsonSerializableNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ArrayDenormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoCacheExtractor'; $classes[] = '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoExtractor'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorFromClassMetadata'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\XmlEncoder'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonEncoder'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\YamlEncoder'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\CsvEncoder'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\CacheClassMetadataFactory'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactory'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\LoaderChain'; $classes[] = '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\AttributeLoader'; $classes[] = '_ContaoManager\\Psr\\Cache\\CacheItemPoolInterface'; $classes[] = '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter'; $classes[] = '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerInterface'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter'; $classes[] = '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener'; $preloaded = Preloader::preload($classes); $classes = []; $classes[] = '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator'; $classes[] = '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher'; $preloaded = Preloader::preload($classes, $preloaded); services['router'] ?? self::getRouterService($container); return $container->privates['security.firewall.map.context.api'] = new \_ContaoManager\Symfony\Bundle\SecurityBundle\Security\FirewallContext(new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['security.channel_listener'] ?? $container->load('getSecurity_ChannelListenerService')); (yield 1 => $container->privates['security.firewall.authenticator.api'] ?? $container->load('getSecurity_Firewall_Authenticator_ApiService')); (yield 2 => $container->privates['security.access_listener'] ?? $container->load('getSecurity_AccessListenerService')); }, 3), new \_ContaoManager\Symfony\Component\Security\Http\Firewall\ExceptionListener($container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage(), $container->privates['security.authentication.trust_resolver'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver(), new \_ContaoManager\Symfony\Component\Security\Http\HttpUtils($a, $a), 'api', NULL, NULL, NULL, $container->privates['monolog.logger.security'] ?? $container->load('getMonolog_Logger_SecurityService'), \true), NULL, new \_ContaoManager\Symfony\Bundle\SecurityBundle\Security\FirewallConfig('api', 'security.user_checker', NULL, \true, \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider', NULL, NULL, NULL, NULL, ['_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator', '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator', '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator', '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator', '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator'], NULL, NULL)); } } services['container.get_routing_condition_service'] = (new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), [], []))->get(...); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\ComposerController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['security.user_checker_locator'] = new \_ContaoManager\Symfony\Component\DependencyInjection\ServiceLocator(['api' => #[\Closure(name: 'security.user_checker', class: '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUserChecker')] fn() => $container->privates['security.user_checker'] ??= new \_ContaoManager\Symfony\Component\Security\Core\User\InMemoryUserChecker()]); } } privates['console.command.secrets_list'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsListCommand($container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService'), $container->privates['secrets.local_vault'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault(\dirname(__DIR__, 4) . '/test-dir/.env.prod.local')); $instance->setName('secrets:list'); $instance->setDescription('List all secrets'); return $instance; } } privates['console.command.secrets_remove'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsRemoveCommand($container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService'), $container->privates['secrets.local_vault'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault(\dirname(__DIR__, 4) . '/test-dir/.env.prod.local')); $instance->setName('secrets:remove'); $instance->setDescription('Remove a secret from the vault'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\GraphicsLibCheck($container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\PhpCliController(); } } privates['security.authenticator.managers_locator'] = new \_ContaoManager\Symfony\Component\DependencyInjection\ServiceLocator(['api' => #[\Closure(name: 'security.authenticator.manager.api', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticatorManager')] fn() => $container->privates['security.authenticator.manager.api'] ?? $container->load('getSecurity_Authenticator_Manager_ApiService')]); } } services['_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\TaskDeleteCommand($container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'] ?? $container->load('getTaskManagerService')); $instance->setName('task:delete'); $instance->setDescription('Deletes the current task if it is not active.'); return $instance; } } privates['.console.command.secrets_encrypt_from_local.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('secrets:encrypt-from-local', [], 'Encrypt all local secrets to the vault', \false, #[\Closure(name: 'console.command.secrets_encrypt_from_local', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsEncryptFromLocalCommand => $container->privates['console.command.secrets_encrypt_from_local'] ?? $container->load('getConsole_Command_SecretsEncryptFromLocalService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController'] = new \_ContaoManager\Contao\ManagerApi\Controller\ConstraintController(); } } privates['argument_resolver.backed_enum_resolver'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\BackedEnumValueResolver(); } } \true, '.Contao\\ManagerApi\\Command\\AboutCommand.lazy' => \true, '.Contao\\ManagerApi\\Command\\IntegrityCheckCommand.lazy' => \true, '.Contao\\ManagerApi\\Command\\ProcessRunnerCommand.lazy' => \true, '.Contao\\ManagerApi\\Command\\TaskAbortCommand.lazy' => \true, '.Contao\\ManagerApi\\Command\\TaskDeleteCommand.lazy' => \true, '.Contao\\ManagerApi\\Command\\TaskUpdateCommand.lazy' => \true, '.Contao\\ManagerApi\\Command\\UpdateCommand.lazy' => \true, '.Psr\\Container\\ContainerInterface $parameter_bag' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\ApiApplication' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\AboutCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\TaskAbortCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\TaskDeleteCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\TaskUpdateCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Command\\UpdateCommand' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Composer\\CloudResolver' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Controller\\Packages\\CloudController' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\EventListener\\CheckTotpListener' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\EventListener\\ExceptionListener' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\EventListener\\JsonRequestListener' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\EventListener\\LocaleListener' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\EventListener\\SecurityListener' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Process\\ConsoleProcessFactory' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\ClearCacheOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\CreateProjectOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\DumpAutoloadOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\InstallOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\RemoveOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\RequireOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Composer\\UpdateOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Contao\\BackupCreateOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Contao\\BackupRestoreOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Contao\\CacheClearOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Contao\\CacheWarmupOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Contao\\CreateContaoOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Contao\\MaintenanceModeOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Filesystem\\InstallUploadsOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveArtifactsOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveCacheOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveUploadsOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveVendorOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\TaskOperation\\Manager\\SelfUpdateOperation' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Packages\\InstallTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Packages\\SetupTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\Packages\\UpdateTask' => \true, '_ContaoManager\\.abstract.instanceof.Contao\\ManagerApi\\Task\\TaskManager' => \true, '.cache_connection.GD_MSZC' => \true, '.cache_connection.JKE6keX' => \true, '.console.command.about.lazy' => \true, '.console.command.assets_install.lazy' => \true, '.console.command.cache_clear.lazy' => \true, '.console.command.cache_pool_clear.lazy' => \true, '.console.command.cache_pool_delete.lazy' => \true, '.console.command.cache_pool_invalidate_tags.lazy' => \true, '.console.command.cache_pool_list.lazy' => \true, '.console.command.cache_pool_prune.lazy' => \true, '.console.command.cache_warmup.lazy' => \true, '.console.command.config_debug.lazy' => \true, '.console.command.config_dump_reference.lazy' => \true, '.console.command.container_debug.lazy' => \true, '.console.command.container_lint.lazy' => \true, '.console.command.debug_autowiring.lazy' => \true, '.console.command.event_dispatcher_debug.lazy' => \true, '.console.command.router_debug.lazy' => \true, '.console.command.router_match.lazy' => \true, '.console.command.secrets_decrypt_to_local.lazy' => \true, '.console.command.secrets_encrypt_from_local.lazy' => \true, '.console.command.secrets_generate_key.lazy' => \true, '.console.command.secrets_list.lazy' => \true, '.console.command.secrets_remove.lazy' => \true, '.console.command.secrets_set.lazy' => \true, '.console.command.serializer_debug.lazy' => \true, '.console.command.yaml_lint.lazy' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Composer\\CloudResolver.0.Contao\\ManagerApi\\Composer\\CloudResolver' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\EventListener\\CheckTotpListener.0.Contao\\ManagerApi\\EventListener\\CheckTotpListener' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\EventListener\\ExceptionListener.0.Contao\\ManagerApi\\EventListener\\ExceptionListener' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\EventListener\\JsonRequestListener.0.Contao\\ManagerApi\\EventListener\\JsonRequestListener' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\EventListener\\SecurityListener.0.Contao\\ManagerApi\\EventListener\\SecurityListener' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Process\\ConsoleProcessFactory.0.Contao\\ManagerApi\\Process\\ConsoleProcessFactory' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Security\\WebauthnAuthenticator.0.Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Packages\\InstallTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Packages\\SetupTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskInterface.0.Contao\\ManagerApi\\Task\\Packages\\UpdateTask' => \true, '_ContaoManager\\.instanceof.Contao\\ManagerApi\\Task\\TaskManager.0.Contao\\ManagerApi\\Task\\TaskManager' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Composer\\CloudResolver' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Process\\ConsoleProcessFactory' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\ClearCacheOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\CreateProjectOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\DumpAutoloadOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\InstallOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\RemoveOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\RequireOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Composer\\UpdateOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Contao\\BackupCreateOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Contao\\BackupRestoreOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Contao\\CacheClearOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Contao\\CacheWarmupOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Contao\\CreateContaoOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Contao\\MaintenanceModeOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Filesystem\\InstallUploadsOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveArtifactsOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveCacheOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveUploadsOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveVendorOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\TaskOperation\\Manager\\SelfUpdateOperation' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Packages\\InstallTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Packages\\SetupTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\Packages\\UpdateTask' => \true, '_ContaoManager\\.instanceof.Psr\\Log\\LoggerAwareInterface.0.Contao\\ManagerApi\\Task\\TaskManager' => \true, '_ContaoManager\\.instanceof.Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController.0.Contao\\ManagerApi\\Controller\\Packages\\CloudController' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\AboutCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\TaskAbortCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\TaskDeleteCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\TaskUpdateCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\Console\\Command\\Command.0.Contao\\ManagerApi\\Command\\UpdateCommand' => \true, '_ContaoManager\\.instanceof.Symfony\\Component\\EventDispatcher\\EventSubscriberInterface.0.Contao\\ManagerApi\\EventListener\\LocaleListener' => \true, '_ContaoManager\\.instanceof.Symfony\\Contracts\\Service\\ResetInterface.0.Contao\\ManagerApi\\ApiApplication' => \true, '_ContaoManager\\.instanceof.Symfony\\Contracts\\Service\\ServiceSubscriberInterface.0.Contao\\ManagerApi\\Controller\\Packages\\CloudController' => \true, '_ContaoManager\\.instanceof.Symfony\\Contracts\\Service\\ServiceSubscriberInterface.0.Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory' => \true, '.security.command.debug_firewall.lazy' => \true, '.security.command.user_password_hash.lazy' => \true, '.security.request_matcher.AMZT15Y' => \true, '.security.request_matcher.LBzTDsp' => \true, '.security.request_matcher.gjnNpJn' => \true, '.security.request_matcher.j_9S1dW' => \true, '.service_locator..Fs8Kd7' => \true, '.service_locator.6.du8Yx' => \true, '.service_locator.7ILhJfy' => \true, '.service_locator.87TIfbn' => \true, '_ContaoManager\\.service_locator.87TIfbn.Contao\\ManagerApi\\Controller\\Packages\\CloudController' => \true, '.service_locator.9gXQpqd' => \true, '.service_locator.9gXQpqd.router.default' => \true, '.service_locator.BvkMlPl' => \true, '.service_locator.Ct6lrWe' => \true, '.service_locator.EZsc.DO' => \true, '.service_locator.H.Zsu_s' => \true, '.service_locator.IMte7nJ' => \true, '.service_locator.JkQTEiI' => \true, '.service_locator.MlbgBlB' => \true, '.service_locator.NBUFN6A' => \true, '.service_locator.QRKZpFh' => \true, '.service_locator.VdCFd8p' => \true, '.service_locator.WxpRori' => \true, '.service_locator.XXv1IfR' => \true, '.service_locator.Xbsa8iG' => \true, '.service_locator.Y_BuwMO' => \true, '.service_locator.aH5O6Sd' => \true, '.service_locator.bJ.4HC5' => \true, '.service_locator.cUcW89y' => \true, '.service_locator.cUcW89y.router.cache_warmer' => \true, '.service_locator.dQN8Fd3' => \true, '.service_locator.e_.xxAP' => \true, '.service_locator.gcBfhm4' => \true, '.service_locator.lLv4pWF' => \true, '.service_locator.tpD_zef' => \true, '.service_locator.uPlitoC' => \true, '.service_locator.uoIixGa' => \true, '_ContaoManager\\.service_locator.uoIixGa.Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory' => \true, '.service_locator.w7.f4fT' => \true, '.service_locator.y.Xs7Mw' => \true, '_ContaoManager\\Contao\\ManagerApi\\ApiApplication' => \true, '_ContaoManager\\Contao\\ManagerApi\\ApiKernel' => \true, '_ContaoManager\\Contao\\ManagerApi\\Command' => \true, '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudChanges' => \true, '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudException' => \true, '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudJob' => \true, '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver' => \true, '_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment' => \true, '_ContaoManager\\Contao\\ManagerApi\\Config\\AuthConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Config\\PartialConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Controller' => \true, '_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener' => \true, '_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener' => \true, '_ContaoManager\\Contao\\ManagerApi\\EventListener\\JsonRequestListener' => \true, '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener' => \true, '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener.inner' => \true, '_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener' => \true, '_ContaoManager\\Contao\\ManagerApi\\Exception\\ApiProblemException' => \true, '_ContaoManager\\Contao\\ManagerApi\\Exception\\InvalidJsonException' => \true, '_ContaoManager\\Contao\\ManagerApi\\Exception\\InvalidTotpException' => \true, '_ContaoManager\\Contao\\ManagerApi\\Exception\\ProcessOutputException' => \true, '_ContaoManager\\Contao\\ManagerApi\\Exception\\RequestException' => \true, '_ContaoManager\\Contao\\ManagerApi\\HttpKernel\\ApiProblemResponse' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ZipCheck' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\DisownForker' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\InlineForker' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\NohupForker' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\WindowsStartForker' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\PhpExecutableFinder' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\ProcessController' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\ProcessRunner' => \true, '_ContaoManager\\Contao\\ManagerApi\\Process\\Utf8Process' => \true, '_ContaoManager\\Contao\\ManagerApi\\Resources' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\TotpBadge' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\User' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider' => \true, '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => \true, '_ContaoManager\\Contao\\ManagerApi\\System\\Request' => \true, '_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate' => \true, '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\ClearCacheOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\CloudOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\CreateProjectOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\DumpAutoloadOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\InstallOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\RemoveOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\RequireOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\UpdateOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\ConsoleOutput' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\BackupCreateOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\BackupRestoreOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CacheClearOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CacheWarmupOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CreateContaoOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\MaintenanceModeOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\InstallUploadsOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveArtifactsOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveCacheOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveUploadsOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveVendorOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Manager\\SelfUpdateOperation' => \true, '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\SponsoredOperationInterface' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\InstallTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\SetupTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\UpdateTask' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskConfig' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager' => \true, '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskStatus' => \true, '_ContaoManager\\Contao\\ManagerApi\\Tests' => \true, '_ContaoManager\\Psr\\Cache\\CacheItemPoolInterface' => \true, '_ContaoManager\\Psr\\Clock\\ClockInterface' => \true, 'Psr\\Container\\ContainerInterface $parameterBag' => \true, '_ContaoManager\\Psr\\EventDispatcher\\EventDispatcherInterface' => \true, '_ContaoManager\\Psr\\Log\\LoggerInterface' => \true, 'Psr\\Log\\LoggerInterface $cacheLogger' => \true, 'Psr\\Log\\LoggerInterface $consoleLogger' => \true, 'Psr\\Log\\LoggerInterface $phpLogger' => \true, 'Psr\\Log\\LoggerInterface $requestLogger' => \true, 'Psr\\Log\\LoggerInterface $routerLogger' => \true, 'Psr\\Log\\LoggerInterface $securityLogger' => \true, 'Psr\\Log\\LoggerInterface $tasksLogger' => \true, '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security' => \true, '_ContaoManager\\Symfony\\Component\\Clock\\ClockInterface' => \true, '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderInterface' => \true, '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => \true, '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => \true, '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ReverseContainer' => \true, '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter' => \true, '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => \true, '_ContaoManager\\Symfony\\Component\\Filesystem\\Filesystem' => \true, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Request' => \true, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestStack' => \true, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Response' => \true, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => \true, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\UriSigner' => \true, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\UrlHelper' => \true, '_ContaoManager\\Symfony\\Component\\HttpKernel\\Config\\FileLocator' => \true, '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => \true, '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => \true, '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernelInterface' => \true, '_ContaoManager\\Symfony\\Component\\HttpKernel\\KernelInterface' => \true, '_ContaoManager\\Symfony\\Component\\HttpKernel\\UriSigner' => \true, '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactoryInterface' => \true, '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasherInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyDescriptionExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInitializableExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyReadInfoExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyWriteInfoExtractorInterface' => \true, '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => \true, '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => \true, '_ContaoManager\\Symfony\\Component\\Routing\\RequestContext' => \true, '_ContaoManager\\Symfony\\Component\\Routing\\RequestContextAwareInterface' => \true, '_ContaoManager\\Symfony\\Component\\Routing\\RouterInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManagerInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationCheckerInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\RoleHierarchyInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\Security' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserProviderInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationUtils' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\UserAuthenticatorInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Http\\FirewallMapInterface' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Http\\HttpUtils' => \true, '_ContaoManager\\Symfony\\Component\\Security\\Http\\Session\\SessionAuthenticationStrategyInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\DecoderInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\EncoderInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorResolverInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactoryInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\PropertyNormalizer' => \true, '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerInterface' => \true, '_ContaoManager\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => \true, '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\NameBasedUuidFactory' => \true, '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\RandomBasedUuidFactory' => \true, '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\TimeBasedUuidFactory' => \true, '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\UlidFactory' => \true, '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\UuidFactory' => \true, '_ContaoManager\\Symfony\\Contracts\\Cache\\CacheInterface' => \true, '_ContaoManager\\Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => \true, '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => \true, 'argument_metadata_factory' => \true, 'argument_resolver' => \true, 'argument_resolver.backed_enum_resolver' => \true, 'argument_resolver.controller_locator' => \true, 'argument_resolver.datetime' => \true, 'argument_resolver.default' => \true, 'argument_resolver.query_parameter_value_resolver' => \true, 'argument_resolver.request' => \true, 'argument_resolver.request_attribute' => \true, 'argument_resolver.request_payload' => \true, 'argument_resolver.service' => \true, 'argument_resolver.session' => \true, 'argument_resolver.uid' => \true, 'argument_resolver.variadic' => \true, 'cache.adapter.apcu' => \true, 'cache.adapter.array' => \true, 'cache.adapter.doctrine_dbal' => \true, 'cache.adapter.filesystem' => \true, 'cache.adapter.memcached' => \true, 'cache.adapter.pdo' => \true, 'cache.adapter.psr6' => \true, 'cache.adapter.redis' => \true, 'cache.adapter.redis_tag_aware' => \true, 'cache.adapter.system' => \true, 'cache.annotations' => \true, 'cache.app.taggable' => \true, 'cache.default_clearer' => \true, 'cache.default_doctrine_dbal_provider' => \true, 'cache.default_marshaller' => \true, 'cache.default_memcached_provider' => \true, 'cache.default_redis_provider' => \true, 'cache.early_expiration_handler' => \true, 'cache.property_access' => \true, 'cache.property_info' => \true, 'cache.security_expression_language' => \true, 'cache.serializer' => \true, 'cache.validator' => \true, 'cache_clearer' => \true, 'clock' => \true, 'config.resource.self_checking_resource_checker' => \true, 'config_builder.warmer' => \true, 'config_cache_factory' => \true, 'console.command.about' => \true, 'console.command.assets_install' => \true, 'console.command.cache_clear' => \true, 'console.command.cache_pool_clear' => \true, 'console.command.cache_pool_delete' => \true, 'console.command.cache_pool_invalidate_tags' => \true, 'console.command.cache_pool_list' => \true, 'console.command.cache_pool_prune' => \true, 'console.command.cache_warmup' => \true, 'console.command.config_debug' => \true, 'console.command.config_dump_reference' => \true, 'console.command.container_debug' => \true, 'console.command.container_lint' => \true, 'console.command.debug_autowiring' => \true, 'console.command.event_dispatcher_debug' => \true, 'console.command.router_debug' => \true, 'console.command.router_match' => \true, 'console.command.secrets_decrypt_to_local' => \true, 'console.command.secrets_encrypt_from_local' => \true, 'console.command.secrets_generate_key' => \true, 'console.command.secrets_list' => \true, 'console.command.secrets_remove' => \true, 'console.command.secrets_set' => \true, 'console.command.serializer_debug' => \true, 'console.command.yaml_lint' => \true, 'console.error_listener' => \true, 'console.messenger.application' => \true, 'console.messenger.execute_command_handler' => \true, 'console.suggest_missing_package_subscriber' => \true, 'container.env' => \true, 'container.env_var_processor' => \true, 'container.getenv' => \true, 'contao_manager.webauthn.authenticator_assertion_response_validator' => \true, 'contao_manager.webauthn.authenticator_attestation_response_validator' => \true, 'contao_manager.webauthn.ceremony_step_manager_factory' => \true, 'contao_manager.webauthn.creation_ceremony' => \true, 'contao_manager.webauthn.request_ceremony' => \true, 'contao_manager.webauthn.serializer' => \true, 'contao_manager.webauthn.serializer_factory' => \true, 'controller.cache_attribute_listener' => \true, 'controller.is_granted_attribute_listener' => \true, 'controller_resolver' => \true, 'data_collector.security' => \true, 'debug.debug_handlers_listener' => \true, 'debug.file_link_formatter' => \true, 'dependency_injection.config.container_parameters_resource_checker' => \true, 'error_handler.error_renderer.html' => \true, 'error_handler.error_renderer.serializer' => \true, 'error_renderer' => \true, 'error_renderer.html' => \true, 'error_renderer.serializer' => \true, 'exception_listener' => \true, 'file_locator' => \true, 'filesystem' => \true, 'fragment.handler' => \true, 'fragment.renderer.inline' => \true, 'fragment.uri_generator' => \true, 'http_cache' => \true, 'http_cache.store' => \true, 'locale_aware_listener' => \true, 'locale_listener' => \true, 'logger' => \true, 'monolog.activation_strategy.not_found' => \true, 'monolog.formatter.chrome_php' => \true, 'monolog.formatter.gelf_message' => \true, 'monolog.formatter.html' => \true, 'monolog.formatter.json' => \true, 'monolog.formatter.line' => \true, 'monolog.formatter.loggly' => \true, 'monolog.formatter.logstash' => \true, 'monolog.formatter.normalizer' => \true, 'monolog.formatter.scalar' => \true, 'monolog.formatter.wildfire' => \true, 'monolog.handler.file' => \true, 'monolog.handler.fingers_crossed.error_level_activation_strategy' => \true, 'monolog.handler.main' => \true, 'monolog.handler.null_internal' => \true, 'monolog.http_client' => \true, 'monolog.logger' => \true, 'monolog.logger.cache' => \true, 'monolog.logger.console' => \true, 'monolog.logger.php' => \true, 'monolog.logger.request' => \true, 'monolog.logger.router' => \true, 'monolog.logger.security' => \true, 'monolog.logger.tasks' => \true, 'monolog.logger_prototype' => \true, 'monolog.processor.psr_log_message' => \true, 'name_based_uuid.factory' => \true, 'parameter_bag' => \true, 'process.messenger.process_message_handler' => \true, 'property_accessor' => \true, 'property_info' => \true, 'property_info.cache' => \true, 'property_info.cache.inner' => \true, 'property_info.php_doc_extractor' => \true, 'property_info.phpstan_extractor' => \true, 'property_info.reflection_extractor' => \true, 'property_info.serializer_extractor' => \true, 'random_based_uuid.factory' => \true, 'response_listener' => \true, 'reverse_container' => \true, 'router.cache_warmer' => \true, 'router.default' => \true, 'router.request_context' => \true, 'router_listener' => \true, 'routing.loader.annotation' => \true, 'routing.loader.annotation.directory' => \true, 'routing.loader.annotation.file' => \true, 'routing.loader.attribute' => \true, 'routing.loader.attribute.directory' => \true, 'routing.loader.attribute.file' => \true, 'routing.loader.container' => \true, 'routing.loader.directory' => \true, 'routing.loader.glob' => \true, 'routing.loader.php' => \true, 'routing.loader.psr4' => \true, 'routing.loader.xml' => \true, 'routing.loader.yml' => \true, 'routing.resolver' => \true, 'secrets.decryption_key' => \true, 'secrets.local_vault' => \true, 'secrets.vault' => \true, 'security.access.authenticated_voter' => \true, 'security.access.decision_manager' => \true, 'security.access.role_hierarchy_voter' => \true, 'security.access_listener' => \true, 'security.access_map' => \true, 'security.access_token_extractor.header' => \true, 'security.access_token_extractor.query_string' => \true, 'security.access_token_extractor.request_body' => \true, 'security.access_token_handler.oidc' => \true, 'security.access_token_handler.oidc.jwk' => \true, 'security.access_token_handler.oidc.signature' => \true, 'security.access_token_handler.oidc.signature.ES256' => \true, 'security.access_token_handler.oidc.signature.ES384' => \true, 'security.access_token_handler.oidc.signature.ES512' => \true, 'security.access_token_handler.oidc_user_info' => \true, 'security.access_token_handler.oidc_user_info.http_client' => \true, 'security.authentication.custom_failure_handler' => \true, 'security.authentication.custom_success_handler' => \true, 'security.authentication.failure_handler' => \true, 'security.authentication.listener.abstract' => \true, 'security.authentication.session_strategy' => \true, 'security.authentication.session_strategy.api' => \true, 'security.authentication.session_strategy_noop' => \true, 'security.authentication.success_handler' => \true, 'security.authentication.switchuser_listener' => \true, 'security.authentication.trust_resolver' => \true, 'security.authentication_utils' => \true, 'security.authenticator.access_token' => \true, 'security.authenticator.access_token.chain_extractor' => \true, 'security.authenticator.form_login' => \true, 'security.authenticator.http_basic' => \true, 'security.authenticator.json_login' => \true, 'security.authenticator.manager' => \true, 'security.authenticator.manager.api' => \true, 'security.authenticator.managers_locator' => \true, 'security.authenticator.remote_user' => \true, 'security.authenticator.x509' => \true, 'security.authorization_checker' => \true, 'security.channel_listener' => \true, 'security.command.debug_firewall' => \true, 'security.command.user_password_hash' => \true, 'security.context_listener' => \true, 'security.event_dispatcher.api' => \true, 'security.exception_listener' => \true, 'security.exception_listener.api' => \true, 'security.firewall' => \true, 'security.firewall.authenticator' => \true, 'security.firewall.authenticator.api' => \true, 'security.firewall.config' => \true, 'security.firewall.context' => \true, 'security.firewall.context_locator' => \true, 'security.firewall.event_dispatcher_locator' => \true, 'security.firewall.lazy_context' => \true, 'security.firewall.map' => \true, 'security.firewall.map.config.api' => \true, 'security.firewall.map.context.api' => \true, 'security.helper' => \true, 'security.http_utils' => \true, 'security.impersonate_url_generator' => \true, 'security.ldap_locator' => \true, 'security.listener.api.user_provider' => \true, 'security.listener.check_authenticator_credentials' => \true, 'security.listener.login_throttling' => \true, 'security.listener.password_migrating' => \true, 'security.listener.session' => \true, 'security.listener.user_checker' => \true, 'security.listener.user_checker.api' => \true, 'security.listener.user_provider' => \true, 'security.listener.user_provider.abstract' => \true, 'security.logout.listener.clear_site_data' => \true, 'security.logout.listener.cookie_clearing' => \true, 'security.logout.listener.default' => \true, 'security.logout.listener.session' => \true, 'security.logout_listener' => \true, 'security.logout_url_generator' => \true, 'security.password_hasher' => \true, 'security.password_hasher_factory' => \true, 'security.role_hierarchy' => \true, 'security.route_loader.logout' => \true, 'security.security_token_value_resolver' => \true, 'security.untracked_token_storage' => \true, 'security.user.provider.chain' => \true, 'security.user.provider.concrete.contao_manager_user_provider' => \true, 'security.user.provider.in_memory' => \true, 'security.user.provider.ldap' => \true, 'security.user.provider.missing' => \true, 'security.user_authenticator' => \true, 'security.user_checker' => \true, 'security.user_checker.api' => \true, 'security.user_checker.chain.api' => \true, 'security.user_checker_locator' => \true, 'security.user_password_hasher' => \true, 'security.user_providers' => \true, 'security.user_value_resolver' => \true, 'security.validator.user_password' => \true, 'serializer' => \true, 'serializer.denormalizer.array' => \true, 'serializer.denormalizer.unwrapping' => \true, 'serializer.encoder.csv' => \true, 'serializer.encoder.json' => \true, 'serializer.encoder.xml' => \true, 'serializer.encoder.yaml' => \true, 'serializer.mapping.cache.symfony' => \true, 'serializer.mapping.cache_class_metadata_factory' => \true, 'serializer.mapping.cache_class_metadata_factory.inner' => \true, 'serializer.mapping.cache_warmer' => \true, 'serializer.mapping.chain_loader' => \true, 'serializer.mapping.class_discriminator_resolver' => \true, 'serializer.mapping.class_metadata_factory' => \true, 'serializer.name_converter.camel_case_to_snake_case' => \true, 'serializer.name_converter.metadata_aware' => \true, 'serializer.normalizer.backed_enum' => \true, 'serializer.normalizer.constraint_violation_list' => \true, 'serializer.normalizer.data_uri' => \true, 'serializer.normalizer.dateinterval' => \true, 'serializer.normalizer.datetime' => \true, 'serializer.normalizer.datetimezone' => \true, 'serializer.normalizer.form_error' => \true, 'serializer.normalizer.json_serializable' => \true, 'serializer.normalizer.object' => \true, 'serializer.normalizer.problem' => \true, 'serializer.normalizer.property' => \true, 'serializer.normalizer.uid' => \true, 'serializer.property_accessor' => \true, 'slugger' => \true, 'time_based_uuid.factory' => \true, 'ulid.factory' => \true, 'uri_signer' => \true, 'url_helper' => \true, 'uuid.factory' => \true, 'validate_request_listener' => \true]; services['_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\ProcessRunnerCommand(); $instance->setName('background-task:run'); $instance->setDescription('Execute a background task'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator'] = new \_ContaoManager\Contao\ManagerApi\Security\JwtAuthenticator($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] ?? self::getJwtManagerService($container)); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\ContaoController($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi'] ?? $container->load('getContaoApiService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['security.access_map'] = $instance = new \_ContaoManager\Symfony\Component\Security\Http\AccessMap(); $instance->add(new \_ContaoManager\Symfony\Component\HttpFoundation\ChainRequestMatcher([new \_ContaoManager\Symfony\Component\HttpFoundation\RequestMatcher\PathRequestMatcher('^/api/session(/options)?$')]), ['PUBLIC_ACCESS'], NULL); $instance->add(new \_ContaoManager\Symfony\Component\HttpFoundation\ChainRequestMatcher([new \_ContaoManager\Symfony\Component\HttpFoundation\RequestMatcher\PathRequestMatcher('^/api')]), ['ROLE_USER'], NULL); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\IntegrityCheckFactory((new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck', 'getAllowUrlFopenCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck', 'getGraphicsLibCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck', 'getMemoryLimitCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck', 'getPhpExtensionsCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck', 'getProcessCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck', 'getSessionCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck', 'getSymlinkCheckService', \true], '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck', 'getSysTempDirCheckService', \true]], ['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck' => '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck']))->withContext('_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory', $container)); } } privates['console.command.container_debug'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ContainerDebugCommand(); $instance->setName('debug:container'); $instance->setDescription('Display current services for an application'); return $instance; } } privates['.console.command.container_debug.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:container', [], 'Display current services for an application', \false, #[\Closure(name: 'console.command.container_debug', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ContainerDebugCommand => $container->privates['console.command.container_debug'] ?? $container->load('getConsole_Command_ContainerDebugService')); } } services['event_dispatcher'] ?? self::getEventDispatcherService($container); if (isset($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator'])) { return $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator']; } $b = new \_ContaoManager\Webauthn\CeremonyStep\CeremonyStepManagerFactory(); $c = new \_ContaoManager\Webauthn\AuthenticatorAttestationResponseValidator(NULL, NULL, NULL, NULL, $a, $b->creationCeremony()); $d = $container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService'); $c->setLogger($d); $e = new \_ContaoManager\Webauthn\AuthenticatorAssertionResponseValidator(NULL, NULL, NULL, NULL, $a, $b->requestCeremony()); $e->setLogger($d); return $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator'] = new \_ContaoManager\Contao\ManagerApi\Security\WebauthnAuthenticator((new \_ContaoManager\Webauthn\Denormalizer\WebauthnSerializerFactory(new \_ContaoManager\Webauthn\AttestationStatement\AttestationStatementSupportManager()))->create(), $c, $e, $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] ?? self::getJwtManagerService($container), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['kernel'] ?? $container->get('kernel', 1)); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Contao\JwtCookieController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi'] ?? $container->load('getContaoApiService')); } } privates['router.cache_warmer'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\CacheWarmer\RouterCacheWarmer((new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['router' => ['services', 'router', 'getRouterService', \false]], ['router' => '?']))->withContext('router.cache_warmer', $container)); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Contao\BackupRestoreTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } services['console.command_loader'] = new \_ContaoManager\Symfony\Component\Console\CommandLoader\ContainerCommandLoader(new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand' => ['privates', '.Contao\\ManagerApi\\Command\\AboutCommand.lazy', 'getAboutCommand_LazyService', \true], '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => ['privates', '.Contao\\ManagerApi\\Command\\IntegrityCheckCommand.lazy', 'getIntegrityCheckCommand_LazyService', \true], '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => ['privates', '.Contao\\ManagerApi\\Command\\ProcessRunnerCommand.lazy', 'getProcessRunnerCommand_LazyService', \true], '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand' => ['privates', '.Contao\\ManagerApi\\Command\\TaskAbortCommand.lazy', 'getTaskAbortCommand_LazyService', \true], '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand' => ['privates', '.Contao\\ManagerApi\\Command\\TaskDeleteCommand.lazy', 'getTaskDeleteCommand_LazyService', \true], '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand' => ['privates', '.Contao\\ManagerApi\\Command\\TaskUpdateCommand.lazy', 'getTaskUpdateCommand_LazyService', \true], '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand' => ['privates', '.Contao\\ManagerApi\\Command\\UpdateCommand.lazy', 'getUpdateCommand_LazyService', \true], 'console.command.about' => ['privates', '.console.command.about.lazy', 'get_Console_Command_About_LazyService', \true], 'console.command.assets_install' => ['privates', '.console.command.assets_install.lazy', 'get_Console_Command_AssetsInstall_LazyService', \true], 'console.command.cache_clear' => ['privates', '.console.command.cache_clear.lazy', 'get_Console_Command_CacheClear_LazyService', \true], 'console.command.cache_pool_clear' => ['privates', '.console.command.cache_pool_clear.lazy', 'get_Console_Command_CachePoolClear_LazyService', \true], 'console.command.cache_pool_prune' => ['privates', '.console.command.cache_pool_prune.lazy', 'get_Console_Command_CachePoolPrune_LazyService', \true], 'console.command.cache_pool_invalidate_tags' => ['privates', '.console.command.cache_pool_invalidate_tags.lazy', 'get_Console_Command_CachePoolInvalidateTags_LazyService', \true], 'console.command.cache_pool_delete' => ['privates', '.console.command.cache_pool_delete.lazy', 'get_Console_Command_CachePoolDelete_LazyService', \true], 'console.command.cache_pool_list' => ['privates', '.console.command.cache_pool_list.lazy', 'get_Console_Command_CachePoolList_LazyService', \true], 'console.command.cache_warmup' => ['privates', '.console.command.cache_warmup.lazy', 'get_Console_Command_CacheWarmup_LazyService', \true], 'console.command.config_debug' => ['privates', '.console.command.config_debug.lazy', 'get_Console_Command_ConfigDebug_LazyService', \true], 'console.command.config_dump_reference' => ['privates', '.console.command.config_dump_reference.lazy', 'get_Console_Command_ConfigDumpReference_LazyService', \true], 'console.command.container_debug' => ['privates', '.console.command.container_debug.lazy', 'get_Console_Command_ContainerDebug_LazyService', \true], 'console.command.container_lint' => ['privates', '.console.command.container_lint.lazy', 'get_Console_Command_ContainerLint_LazyService', \true], 'console.command.debug_autowiring' => ['privates', '.console.command.debug_autowiring.lazy', 'get_Console_Command_DebugAutowiring_LazyService', \true], 'console.command.event_dispatcher_debug' => ['privates', '.console.command.event_dispatcher_debug.lazy', 'get_Console_Command_EventDispatcherDebug_LazyService', \true], 'console.command.router_debug' => ['privates', '.console.command.router_debug.lazy', 'get_Console_Command_RouterDebug_LazyService', \true], 'console.command.router_match' => ['privates', '.console.command.router_match.lazy', 'get_Console_Command_RouterMatch_LazyService', \true], 'console.command.serializer_debug' => ['privates', '.console.command.serializer_debug.lazy', 'get_Console_Command_SerializerDebug_LazyService', \true], 'console.command.yaml_lint' => ['privates', '.console.command.yaml_lint.lazy', 'get_Console_Command_YamlLint_LazyService', \true], 'console.command.secrets_set' => ['privates', '.console.command.secrets_set.lazy', 'get_Console_Command_SecretsSet_LazyService', \true], 'console.command.secrets_remove' => ['privates', '.console.command.secrets_remove.lazy', 'get_Console_Command_SecretsRemove_LazyService', \true], 'console.command.secrets_generate_key' => ['privates', '.console.command.secrets_generate_key.lazy', 'get_Console_Command_SecretsGenerateKey_LazyService', \true], 'console.command.secrets_list' => ['privates', '.console.command.secrets_list.lazy', 'get_Console_Command_SecretsList_LazyService', \true], 'console.command.secrets_decrypt_to_local' => ['privates', '.console.command.secrets_decrypt_to_local.lazy', 'get_Console_Command_SecretsDecryptToLocal_LazyService', \true], 'console.command.secrets_encrypt_from_local' => ['privates', '.console.command.secrets_encrypt_from_local.lazy', 'get_Console_Command_SecretsEncryptFromLocal_LazyService', \true], 'security.command.debug_firewall' => ['privates', '.security.command.debug_firewall.lazy', 'get_Security_Command_DebugFirewall_LazyService', \true], 'security.command.user_password_hash' => ['privates', '.security.command.user_password_hash.lazy', 'get_Security_Command_UserPasswordHash_LazyService', \true]], ['_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand' => '?', '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => '?', '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => '?', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand' => '?', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand' => '?', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand' => '?', '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand' => '?', 'console.command.about' => '?', 'console.command.assets_install' => '?', 'console.command.cache_clear' => '?', 'console.command.cache_pool_clear' => '?', 'console.command.cache_pool_prune' => '?', 'console.command.cache_pool_invalidate_tags' => '?', 'console.command.cache_pool_delete' => '?', 'console.command.cache_pool_list' => '?', 'console.command.cache_warmup' => '?', 'console.command.config_debug' => '?', 'console.command.config_dump_reference' => '?', 'console.command.container_debug' => '?', 'console.command.container_lint' => '?', 'console.command.debug_autowiring' => '?', 'console.command.event_dispatcher_debug' => '?', 'console.command.router_debug' => '?', 'console.command.router_match' => '?', 'console.command.serializer_debug' => '?', 'console.command.yaml_lint' => '?', 'console.command.secrets_set' => '?', 'console.command.secrets_remove' => '?', 'console.command.secrets_generate_key' => '?', 'console.command.secrets_list' => '?', 'console.command.secrets_decrypt_to_local' => '?', 'console.command.secrets_encrypt_from_local' => '?', 'security.command.debug_firewall' => '?', 'security.command.user_password_hash' => '?']), ['about' => 'console.command.about', 'integrity-check' => '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand', 'background-task:run' => '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand', 'task:abort' => '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand', 'task:delete' => '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand', 'task:update' => '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand', 'self-update' => '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand', 'assets:install' => 'console.command.assets_install', 'cache:clear' => 'console.command.cache_clear', 'cache:pool:clear' => 'console.command.cache_pool_clear', 'cache:pool:prune' => 'console.command.cache_pool_prune', 'cache:pool:invalidate-tags' => 'console.command.cache_pool_invalidate_tags', 'cache:pool:delete' => 'console.command.cache_pool_delete', 'cache:pool:list' => 'console.command.cache_pool_list', 'cache:warmup' => 'console.command.cache_warmup', 'debug:config' => 'console.command.config_debug', 'config:dump-reference' => 'console.command.config_dump_reference', 'debug:container' => 'console.command.container_debug', 'lint:container' => 'console.command.container_lint', 'debug:autowiring' => 'console.command.debug_autowiring', 'debug:event-dispatcher' => 'console.command.event_dispatcher_debug', 'debug:router' => 'console.command.router_debug', 'router:match' => 'console.command.router_match', 'debug:serializer' => 'console.command.serializer_debug', 'lint:yaml' => 'console.command.yaml_lint', 'secrets:set' => 'console.command.secrets_set', 'secrets:remove' => 'console.command.secrets_remove', 'secrets:generate-keys' => 'console.command.secrets_generate_key', 'secrets:list' => 'console.command.secrets_list', 'secrets:decrypt-to-local' => 'console.command.secrets_decrypt_to_local', 'secrets:encrypt-from-local' => 'console.command.secrets_encrypt_from_local', 'debug:firewall' => 'security.command.debug_firewall', 'security:hash-password' => 'security.command.user_password_hash']); } } services['cache.app'] = $instance = new \_ContaoManager\Symfony\Component\Cache\Adapter\FilesystemAdapter('Pla-qETyhq', 0, $container->targetDir . '' . '/pools/app', new \_ContaoManager\Symfony\Component\Cache\Marshaller\DefaultMarshaller(NULL, \false)); $instance->setLogger($container->privates['monolog.logger.cache'] ?? self::getMonolog_Logger_CacheService($container)); return $instance; } } privates['console.command.secrets_set'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsSetCommand($container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService'), $container->privates['secrets.local_vault'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault(\dirname(__DIR__, 4) . '/test-dir/.env.prod.local')); $instance->setName('secrets:set'); $instance->setDescription('Set a secret in the vault'); return $instance; } } privates['security.command.user_password_hash'] = $instance = new \_ContaoManager\Symfony\Component\PasswordHasher\Command\UserPasswordHashCommand($container->privates['security.password_hasher_factory'] ?? self::getSecurity_PasswordHasherFactoryService($container), ['_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\PasswordAuthenticatedUserInterface']); $instance->setName('security:hash-password'); $instance->setDescription('Hash a user password'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] = $instance = new \_ContaoManager\Contao\ManagerApi\Process\ConsoleProcessFactory($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo'] ?? $container->load('getServerInfoService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.console.command.config_dump_reference.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('config:dump-reference', [], 'Dump the default configuration for an extension', \false, #[\Closure(name: 'console.command.config_dump_reference', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ConfigDumpReferenceCommand => $container->privates['console.command.config_dump_reference'] ?? $container->load('getConsole_Command_ConfigDumpReferenceService')); } } services['cache.app_clearer'] = new \_ContaoManager\Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer(['cache.app' => $container->services['cache.app'] ?? $container->load('getCache_AppService')]); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController'] = new \_ContaoManager\Contao\ManagerApi\Controller\UserController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container), $container->services['router'] ?? self::getRouterService($container), $container->privates['security.helper'] ?? $container->load('getSecurity_HelperService'), $container->privates['security.password_hasher_factory'] ?? self::getSecurity_PasswordHasherFactoryService($container)); } } privates['console.command.router_debug'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\RouterDebugCommand($container->services['router'] ?? self::getRouterService($container), $container->privates['debug.file_link_formatter'] ??= new \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter(NULL)); $instance->setName('debug:router'); $instance->setDescription('Display current routes for an application'); return $instance; } } targetDir = \dirname($containerDir); $this->parameters = $this->getDefaultParameters(); $this->services = $this->privates = []; $this->syntheticIds = ['kernel' => \true]; $this->methodMap = ['event_dispatcher' => 'getEventDispatcherService', 'http_kernel' => 'getHttpKernelService', 'request_stack' => 'getRequestStackService', 'router' => 'getRouterService', 'security.token_storage' => 'getSecurity_TokenStorageService']; $this->fileMap = ['_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand' => 'getAboutCommandService', '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => 'getIntegrityCheckCommandService', '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => 'getProcessRunnerCommandService', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand' => 'getTaskAbortCommandService', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand' => 'getTaskDeleteCommandService', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand' => 'getTaskUpdateCommandService', '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand' => 'getUpdateCommandService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController' => 'getAuthControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController' => 'getComposerControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController' => 'getManagerControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController' => 'getConstraintControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController' => 'getAccessKeyControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController' => 'getBackupControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController' => 'getDatabaseMigrationControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController' => 'getInstallToolLockControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController' => 'getJwtCookieControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController' => 'getMaintenanceModeControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController' => 'getFileControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController' => 'getLogControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController' => 'getCloudControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController' => 'getLocalPackagesControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController' => 'getMissingPackagesControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController' => 'getRootPackageControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController' => 'getUploadPackagesControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController' => 'getAdminUserControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController' => 'getComposerController2Service', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController' => 'getConfigControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController' => 'getContaoControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController' => 'getDatabaseControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController' => 'getOpcacheControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController' => 'getPhpCliControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController' => 'getPhpWebControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController' => 'getPhpinfoControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController' => 'getSelfUpdateControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController' => 'getSessionControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController' => 'getTaskControllerService', '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController' => 'getUserControllerService', '_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator' => 'getTranslatorService', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => 'getRedirectControllerService', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => 'getTemplateControllerService', 'cache.app' => 'getCache_AppService', 'cache.app_clearer' => 'getCache_AppClearerService', 'cache.global_clearer' => 'getCache_GlobalClearerService', 'cache.security_is_granted_attribute_expression_language' => 'getCache_SecurityIsGrantedAttributeExpressionLanguageService', 'cache.system' => 'getCache_SystemService', 'cache.system_clearer' => 'getCache_SystemClearerService', 'cache_warmer' => 'getCacheWarmerService', 'console.command_loader' => 'getConsole_CommandLoaderService', 'container.env_var_processors_locator' => 'getContainer_EnvVarProcessorsLocatorService', 'container.get_routing_condition_service' => 'getContainer_GetRoutingConditionServiceService', 'debug.error_handler_configurator' => 'getDebug_ErrorHandlerConfiguratorService', 'error_controller' => 'getErrorControllerService', 'routing.loader' => 'getRouting_LoaderService', 'services_resetter' => 'getServicesResetterService']; $this->aliases = []; } public function compile() : void { throw new LogicException('You cannot compile a dumped container that was already compiled.'); } public function isCompiled() : bool { return \true; } public function getRemovedIds() : array { return require $this->containerDir . \DIRECTORY_SEPARATOR . 'removed-ids.php'; } protected function load($file, $lazyLoad = \true) : mixed { if (\class_exists($class = __NAMESPACE__ . '\\' . $file, \false)) { return $class::do($this, $lazyLoad); } if ('.' === $file[-4]) { $class = \substr($class, 0, -4); } else { $file .= '.php'; } $service = (require $this->containerDir . \DIRECTORY_SEPARATOR . $file); return \class_exists($class, \false) ? $class::do($this, $lazyLoad) : $service; } protected function createProxy($class, \Closure $factory) { \class_exists($class, \false) || (require __DIR__ . '/' . $class . '.php'); return $factory(); } /* * Gets the public 'event_dispatcher' shared service. * * @return \Symfony\Component\EventDispatcher\EventDispatcher */ protected static function getEventDispatcherService($container) { $container->services['event_dispatcher'] = $instance = new \_ContaoManager\Symfony\Component\EventDispatcher\EventDispatcher(); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener'] ??= new \_ContaoManager\Contao\ManagerApi\EventListener\CheckTotpListener(), '__invoke'], 0); $instance->addListener('kernel.exception', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener'] ?? $container->load('getExceptionListenerService'), '__invoke'], 10); $instance->addListener('kernel.request', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\JsonRequestListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\JsonRequestListener'] ??= new \_ContaoManager\Contao\ManagerApi\EventListener\JsonRequestListener(), '__invoke'], 20); $instance->addListener('kernel.response', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener'] ?? self::getSecurityListenerService($container), '__invoke'], 0); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: 'security.listener.user_provider', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserProviderListener')] fn() => $container->privates['security.listener.user_provider'] ?? $container->load('getSecurity_Listener_UserProviderService'), 'checkPassport'], 1024); $instance->addListener('kernel.request', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener'] ?? self::getLocaleListenerService($container), 'setDefaultLocale'], 100); $instance->addListener('kernel.request', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener'] ?? self::getLocaleListenerService($container), 'onKernelRequest'], 16); $instance->addListener('kernel.finish_request', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener'] ?? self::getLocaleListenerService($container), 'onKernelFinishRequest'], 0); $instance->addListener('kernel.controller_arguments', [#[\Closure(name: 'argument_resolver.request_payload', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver')] fn() => $container->privates['argument_resolver.request_payload'] ?? self::getArgumentResolver_RequestPayloadService($container), 'onKernelControllerArguments'], 0); $instance->addListener('kernel.response', [#[\Closure(name: 'response_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener')] fn() => $container->privates['response_listener'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\ResponseListener('UTF-8', \false), 'onKernelResponse'], 0); $instance->addListener('kernel.request', [#[\Closure(name: 'validate_request_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener')] fn() => $container->privates['validate_request_listener'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\ValidateRequestListener(), 'onKernelRequest'], 256); $instance->addListener('kernel.controller_arguments', [#[\Closure(name: 'exception_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener')] fn() => $container->privates['exception_listener'] ?? self::getExceptionListener2Service($container), 'onControllerArguments'], 0); $instance->addListener('kernel.exception', [#[\Closure(name: 'exception_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener')] fn() => $container->privates['exception_listener'] ?? self::getExceptionListener2Service($container), 'logKernelException'], 0); $instance->addListener('kernel.exception', [#[\Closure(name: 'exception_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener')] fn() => $container->privates['exception_listener'] ?? self::getExceptionListener2Service($container), 'onKernelException'], -128); $instance->addListener('kernel.response', [#[\Closure(name: 'exception_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener')] fn() => $container->privates['exception_listener'] ?? self::getExceptionListener2Service($container), 'removeCspHeader'], -128); $instance->addListener('kernel.controller_arguments', [#[\Closure(name: 'controller.cache_attribute_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener')] fn() => $container->privates['controller.cache_attribute_listener'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\CacheAttributeListener(), 'onKernelControllerArguments'], 10); $instance->addListener('kernel.response', [#[\Closure(name: 'controller.cache_attribute_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener')] fn() => $container->privates['controller.cache_attribute_listener'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\CacheAttributeListener(), 'onKernelResponse'], -10); $instance->addListener('console.error', [#[\Closure(name: 'console.error_listener', class: '_ContaoManager\\Symfony\\Component\\Console\\EventListener\\ErrorListener')] fn() => $container->privates['console.error_listener'] ?? $container->load('getConsole_ErrorListenerService'), 'onConsoleError'], -128); $instance->addListener('console.terminate', [#[\Closure(name: 'console.error_listener', class: '_ContaoManager\\Symfony\\Component\\Console\\EventListener\\ErrorListener')] fn() => $container->privates['console.error_listener'] ?? $container->load('getConsole_ErrorListenerService'), 'onConsoleTerminate'], -128); $instance->addListener('console.error', [#[\Closure(name: 'console.suggest_missing_package_subscriber', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber')] fn() => $container->privates['console.suggest_missing_package_subscriber'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\EventListener\SuggestMissingPackageSubscriber(), 'onConsoleError'], 0); $instance->addListener('kernel.request', [#[\Closure(name: 'debug.debug_handlers_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener')] fn() => $container->privates['debug.debug_handlers_listener'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\DebugHandlersListener(NULL, $container->getEnv('bool:default::key:web:default:kernel.runtime_mode:')), 'configure'], 2048); $instance->addListener('console.command', [#[\Closure(name: 'debug.debug_handlers_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener')] fn() => $container->privates['debug.debug_handlers_listener'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\DebugHandlersListener(NULL, $container->getEnv('bool:default::key:web:default:kernel.runtime_mode:')), 'configure'], 2048); $instance->addListener('kernel.request', [#[\Closure(name: 'router_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener')] fn() => $container->privates['router_listener'] ?? self::getRouterListenerService($container), 'onKernelRequest'], 32); $instance->addListener('kernel.finish_request', [#[\Closure(name: 'router_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener')] fn() => $container->privates['router_listener'] ?? self::getRouterListenerService($container), 'onKernelFinishRequest'], 0); $instance->addListener('kernel.exception', [#[\Closure(name: 'router_listener', class: '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener')] fn() => $container->privates['router_listener'] ?? self::getRouterListenerService($container), 'onKernelException'], -64); $instance->addListener('kernel.request', [#[\Closure(name: 'security.firewall', class: '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\FirewallListener')] fn() => $container->privates['security.firewall'] ?? self::getSecurity_FirewallService($container), 'configureLogoutUrlGenerator'], 8); $instance->addListener('kernel.request', [#[\Closure(name: 'security.firewall', class: '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\FirewallListener')] fn() => $container->privates['security.firewall'] ?? self::getSecurity_FirewallService($container), 'onKernelRequest'], 8); $instance->addListener('kernel.finish_request', [#[\Closure(name: 'security.firewall', class: '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\FirewallListener')] fn() => $container->privates['security.firewall'] ?? self::getSecurity_FirewallService($container), 'onKernelFinishRequest'], 0); $instance->addListener('kernel.controller_arguments', [#[\Closure(name: 'controller.is_granted_attribute_listener', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\IsGrantedAttributeListener')] fn() => $container->privates['controller.is_granted_attribute_listener'] ?? self::getController_IsGrantedAttributeListenerService($container), 'onKernelControllerArguments'], 20); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: 'security.listener.check_authenticator_credentials', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckCredentialsListener')] fn() => $container->privates['security.listener.check_authenticator_credentials'] ?? $container->load('getSecurity_Listener_CheckAuthenticatorCredentialsService'), 'checkPassport'], 0); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LoginSuccessEvent', [#[\Closure(name: 'security.listener.password_migrating', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\PasswordMigratingListener')] fn() => $container->privates['security.listener.password_migrating'] ?? $container->load('getSecurity_Listener_PasswordMigratingService'), 'onLoginSuccess'], 0); return $instance; } /* * Gets the public 'http_kernel' shared service. * * @return \Symfony\Component\HttpKernel\HttpKernel */ protected static function getHttpKernelService($container) { $a = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver($container, $container->privates['monolog.logger.request'] ?? self::getMonolog_Logger_RequestService($container)); $a->allowControllers(['_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController']); $a->allowControllers(['_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController', '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController']); return $container->services['http_kernel'] = new \_ContaoManager\Symfony\Component\HttpKernel\HttpKernel($container->services['event_dispatcher'] ?? self::getEventDispatcherService($container), $a, $container->services['request_stack'] ??= new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack(), new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver(new \_ContaoManager\Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory(), new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['security.user_value_resolver'] ?? $container->load('getSecurity_UserValueResolverService')); (yield 1 => $container->privates['security.security_token_value_resolver'] ?? $container->load('getSecurity_SecurityTokenValueResolverService')); (yield 2 => $container->privates['argument_resolver.backed_enum_resolver'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\BackedEnumValueResolver()); (yield 3 => $container->privates['argument_resolver.uid'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\UidValueResolver()); (yield 4 => $container->privates['argument_resolver.datetime'] ?? $container->load('getArgumentResolver_DatetimeService')); (yield 5 => $container->privates['argument_resolver.request_attribute'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver()); (yield 6 => $container->privates['argument_resolver.request'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver()); (yield 7 => $container->privates['argument_resolver.session'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver()); (yield 8 => $container->privates['argument_resolver.service'] ?? $container->load('getArgumentResolver_ServiceService')); (yield 9 => $container->privates['argument_resolver.default'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver()); (yield 10 => $container->privates['argument_resolver.variadic'] ??= new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver()); }, 11), new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver' => ['privates', 'argument_resolver.backed_enum_resolver', 'getArgumentResolver_BackedEnumResolverService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver' => ['privates', 'argument_resolver.datetime', 'getArgumentResolver_DatetimeService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => ['privates', 'argument_resolver.default', 'getArgumentResolver_DefaultService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver' => ['privates', 'argument_resolver.query_parameter_value_resolver', 'getArgumentResolver_QueryParameterValueResolverService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => ['privates', 'argument_resolver.request_attribute', 'getArgumentResolver_RequestAttributeService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver' => ['privates', 'argument_resolver.request_payload', 'getArgumentResolver_RequestPayloadService', \false], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => ['privates', 'argument_resolver.request', 'getArgumentResolver_RequestService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => ['privates', 'argument_resolver.service', 'getArgumentResolver_ServiceService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => ['privates', 'argument_resolver.session', 'getArgumentResolver_SessionService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver' => ['privates', 'argument_resolver.uid', 'getArgumentResolver_UidService', \true], '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => ['privates', 'argument_resolver.variadic', 'getArgumentResolver_VariadicService', \true], '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver' => ['privates', 'security.security_token_value_resolver', 'getSecurity_SecurityTokenValueResolverService', \true], '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver' => ['privates', 'security.user_value_resolver', 'getSecurity_UserValueResolverService', \true]], ['_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver' => '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver' => '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver'])), \false); } /* * Gets the public 'request_stack' shared service. * * @return \Symfony\Component\HttpFoundation\RequestStack */ protected static function getRequestStackService($container) { return $container->services['request_stack'] = new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack(); } /* * Gets the public 'router' shared service. * * @return \Symfony\Bundle\FrameworkBundle\Routing\Router */ protected static function getRouterService($container) { $a = new \_ContaoManager\Monolog\Logger('router'); $a->pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); $container->services['router'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Routing\Router((new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['routing.loader' => ['services', 'routing.loader', 'getRouting_LoaderService', \true]], ['routing.loader' => '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderInterface']))->withContext('router.default', $container), 'kernel::loadRoutes', ['cache_dir' => $container->targetDir . '', 'debug' => \false, 'generator_class' => '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator', 'generator_dumper_class' => '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper', 'matcher_class' => '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher', 'matcher_dumper_class' => '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper', 'strict_requirements' => \true, 'resource_type' => 'service'], $container->privates['router.request_context'] ?? self::getRouter_RequestContextService($container), $container->privates['parameter_bag'] ??= new \_ContaoManager\Symfony\Component\DependencyInjection\ParameterBag\ContainerBag($container), $a, 'en'); $instance->setConfigCacheFactory(new \_ContaoManager\Symfony\Component\Config\ResourceCheckerConfigCacheFactory()); return $instance; } /* * Gets the public 'security.token_storage' shared service. * * @return \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage */ protected static function getSecurity_TokenStorageService($container) { return $container->services['security.token_storage'] = new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage(); } /* * Gets the private '.service_locator.tpD_zef' shared service. * * @return \Symfony\Component\DependencyInjection\ServiceLocator */ protected static function get_ServiceLocator_TpDZefService($container) { return $container->privates['.service_locator.tpD_zef'] = new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['security.firewall.map.context.api' => ['privates', 'security.firewall.map.context.api', 'getSecurity_Firewall_Map_Context_ApiService', \true]], ['security.firewall.map.context.api' => '?']); } /* * Gets the private 'Contao\ManagerApi\Config\UserConfig' shared autowired service. * * @return \Contao\ManagerApi\Config\UserConfig */ protected static function getUserConfigService($container) { return $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] = new \_ContaoManager\Contao\ManagerApi\Config\UserConfig($container->privates['security.password_hasher_factory'] ?? self::getSecurity_PasswordHasherFactoryService($container), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } /* * Gets the private 'Contao\ManagerApi\EventListener\LocaleListener' shared autowired service. * * @return \Contao\ManagerApi\EventListener\LocaleListener */ protected static function getLocaleListenerService($container) { return $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener'] = new \_ContaoManager\Contao\ManagerApi\EventListener\LocaleListener(new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\LocaleListener($container->services['request_stack'] ??= new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack(), 'en', $container->services['router'] ?? self::getRouterService($container), \false, [])); } /* * Gets the private 'Contao\ManagerApi\EventListener\SecurityListener' shared autowired service. * * @return \Contao\ManagerApi\EventListener\SecurityListener */ protected static function getSecurityListenerService($container) { return $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener'] = new \_ContaoManager\Contao\ManagerApi\EventListener\SecurityListener($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] ?? self::getJwtManagerService($container), $container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage(), $container->privates['security.authorization_checker'] ?? self::getSecurity_AuthorizationCheckerService($container)); } /* * Gets the private 'Contao\ManagerApi\Security\JwtManager' shared autowired service. * * @return \Contao\ManagerApi\Security\JwtManager */ protected static function getJwtManagerService($container) { return $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] = new \_ContaoManager\Contao\ManagerApi\Security\JwtManager($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container)); } /* * Gets the private 'argument_resolver.request_payload' shared service. * * @return \Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestPayloadValueResolver */ protected static function getArgumentResolver_RequestPayloadService($container, $lazyLoad = \true) { if (\true === $lazyLoad) { return $container->privates['argument_resolver.request_payload'] = $container->createProxy('RequestPayloadValueResolverGhost8d82153', static fn() => \_ContaoManager\RequestPayloadValueResolverGhost8d82153::createLazyGhost(static fn($proxy) => self::getArgumentResolver_RequestPayloadService($container, $proxy))); } return $lazyLoad->__construct($container->privates['serializer'] ?? self::getSerializerService($container), NULL, NULL) && \false ?: $lazyLoad; } /* * Gets the private 'cache.property_access' shared service. * * @return \Symfony\Component\Cache\Adapter\AdapterInterface */ protected static function getCache_PropertyAccessService($container) { return $container->privates['cache.property_access'] = \_ContaoManager\Symfony\Component\PropertyAccess\PropertyAccessor::createCache('1NjyGAMkS0', 0, $container->getParameter('container.build_id'), $container->privates['monolog.logger.cache'] ?? self::getMonolog_Logger_CacheService($container)); } /* * Gets the private 'cache.property_info' shared service. * * @return \Symfony\Component\Cache\Adapter\AdapterInterface */ protected static function getCache_PropertyInfoService($container) { return $container->privates['cache.property_info'] = \_ContaoManager\Symfony\Component\Cache\Adapter\AbstractAdapter::createSystemCache('tSousJviQW', 0, $container->getParameter('container.build_id'), $container->targetDir . '' . '/pools/system', $container->privates['monolog.logger.cache'] ?? self::getMonolog_Logger_CacheService($container)); } /* * Gets the private 'cache.serializer' shared service. * * @return \Symfony\Component\Cache\Adapter\AdapterInterface */ protected static function getCache_SerializerService($container) { return $container->privates['cache.serializer'] = \_ContaoManager\Symfony\Component\Cache\Adapter\AbstractAdapter::createSystemCache('JH3627xnJR', 0, $container->getParameter('container.build_id'), $container->targetDir . '' . '/pools/system', $container->privates['monolog.logger.cache'] ?? self::getMonolog_Logger_CacheService($container)); } /* * Gets the private 'controller.is_granted_attribute_listener' shared service. * * @return \Symfony\Component\Security\Http\EventListener\IsGrantedAttributeListener */ protected static function getController_IsGrantedAttributeListenerService($container) { return $container->privates['controller.is_granted_attribute_listener'] = new \_ContaoManager\Symfony\Component\Security\Http\EventListener\IsGrantedAttributeListener($container->privates['security.authorization_checker'] ?? self::getSecurity_AuthorizationCheckerService($container), NULL); } /* * Gets the private 'exception_listener' shared service. * * @return \Symfony\Component\HttpKernel\EventListener\ErrorListener */ protected static function getExceptionListener2Service($container) { return $container->privates['exception_listener'] = new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\ErrorListener('error_controller', $container->privates['monolog.logger.request'] ?? self::getMonolog_Logger_RequestService($container), \false, []); } /* * Gets the private 'monolog.handler.main' shared service. * * @return \Monolog\Handler\FingersCrossedHandler */ protected static function getMonolog_Handler_MainService($container) { $a = new \_ContaoManager\Monolog\Handler\ErrorLogHandler(0, 'DEBUG', \true); $a->pushProcessor(new \_ContaoManager\Monolog\Processor\PsrLogMessageProcessor()); return $container->privates['monolog.handler.main'] = new \_ContaoManager\Monolog\Handler\FingersCrossedHandler($a, new \_ContaoManager\Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy('error'), 0, \true, \true, NULL); } /* * Gets the private 'monolog.logger.cache' shared service. * * @return \Monolog\Logger */ protected static function getMonolog_Logger_CacheService($container) { $container->privates['monolog.logger.cache'] = $instance = new \_ContaoManager\Monolog\Logger('cache'); $instance->pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $instance; } /* * Gets the private 'monolog.logger.request' shared service. * * @return \Monolog\Logger */ protected static function getMonolog_Logger_RequestService($container) { $container->privates['monolog.logger.request'] = $instance = new \_ContaoManager\Monolog\Logger('request'); $instance->pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $instance; } /* * Gets the private 'parameter_bag' shared service. * * @return \Symfony\Component\DependencyInjection\ParameterBag\ContainerBag */ protected static function getParameterBagService($container) { return $container->privates['parameter_bag'] = new \_ContaoManager\Symfony\Component\DependencyInjection\ParameterBag\ContainerBag($container); } /* * Gets the private 'router.request_context' shared service. * * @return \Symfony\Component\Routing\RequestContext */ protected static function getRouter_RequestContextService($container) { return $container->privates['router.request_context'] = \_ContaoManager\Symfony\Component\Routing\RequestContext::fromUri('', 'localhost', 'http', 80, 443); } /* * Gets the private 'router_listener' shared service. * * @return \Symfony\Component\HttpKernel\EventListener\RouterListener */ protected static function getRouterListenerService($container) { return $container->privates['router_listener'] = new \_ContaoManager\Symfony\Component\HttpKernel\EventListener\RouterListener($container->services['router'] ?? self::getRouterService($container), $container->services['request_stack'] ??= new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack(), $container->privates['router.request_context'] ?? self::getRouter_RequestContextService($container), $container->privates['monolog.logger.request'] ?? self::getMonolog_Logger_RequestService($container), \dirname(__DIR__, 4) . '/test-dir', \false); } /* * Gets the private 'security.access.decision_manager' shared service. * * @return \Symfony\Component\Security\Core\Authorization\AccessDecisionManager */ protected static function getSecurity_Access_DecisionManagerService($container) { return $container->privates['security.access.decision_manager'] = new \_ContaoManager\Symfony\Component\Security\Core\Authorization\AccessDecisionManager(new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['security.access.authenticated_voter'] ?? $container->load('getSecurity_Access_AuthenticatedVoterService')); (yield 1 => $container->privates['security.access.role_hierarchy_voter'] ?? $container->load('getSecurity_Access_RoleHierarchyVoterService')); }, 2), new \_ContaoManager\Symfony\Component\Security\Core\Authorization\Strategy\AffirmativeStrategy(\false)); } /* * Gets the private 'security.authorization_checker' shared service. * * @return \Symfony\Component\Security\Core\Authorization\AuthorizationChecker */ protected static function getSecurity_AuthorizationCheckerService($container) { return $container->privates['security.authorization_checker'] = new \_ContaoManager\Symfony\Component\Security\Core\Authorization\AuthorizationChecker($container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage(), $container->privates['security.access.decision_manager'] ?? self::getSecurity_Access_DecisionManagerService($container), \false, \false); } /* * Gets the private 'security.firewall' shared service. * * @return \Symfony\Bundle\SecurityBundle\EventListener\FirewallListener */ protected static function getSecurity_FirewallService($container) { $a = $container->privates['security.firewall.map'] ?? self::getSecurity_Firewall_MapService($container); if (isset($container->privates['security.firewall'])) { return $container->privates['security.firewall']; } $b = $container->services['event_dispatcher'] ?? self::getEventDispatcherService($container); if (isset($container->privates['security.firewall'])) { return $container->privates['security.firewall']; } return $container->privates['security.firewall'] = new \_ContaoManager\Symfony\Bundle\SecurityBundle\EventListener\FirewallListener($a, $b, new \_ContaoManager\Symfony\Component\Security\Http\Logout\LogoutUrlGenerator($container->services['request_stack'] ??= new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack(), $container->services['router'] ?? self::getRouterService($container), $container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage())); } /* * Gets the private 'security.firewall.map' shared service. * * @return \Symfony\Bundle\SecurityBundle\Security\FirewallMap */ protected static function getSecurity_Firewall_MapService($container) { $a = $container->privates['.service_locator.tpD_zef'] ?? self::get_ServiceLocator_TpDZefService($container); if (isset($container->privates['security.firewall.map'])) { return $container->privates['security.firewall.map']; } return $container->privates['security.firewall.map'] = new \_ContaoManager\Symfony\Bundle\SecurityBundle\Security\FirewallMap($a, new RewindableGenerator(function () use($container) { (yield 'security.firewall.map.context.api' => NULL); }, 1)); } /* * Gets the private 'security.password_hasher_factory' shared service. * * @return \Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactory */ protected static function getSecurity_PasswordHasherFactoryService($container) { return $container->privates['security.password_hasher_factory'] = new \_ContaoManager\Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactory(['_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\PasswordAuthenticatedUserInterface' => ['algorithm' => 'auto', 'migrate_from' => [], 'hash_algorithm' => 'sha512', 'key_length' => 40, 'ignore_case' => \false, 'encode_as_base64' => \true, 'iterations' => 5000, 'cost' => NULL, 'memory_cost' => NULL, 'time_cost' => NULL]]); } /* * Gets the private 'serializer' shared service. * * @return \Symfony\Component\Serializer\Serializer */ protected static function getSerializerService($container) { $a = $container->privates['property_info.reflection_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor(); $b = new \_ContaoManager\Symfony\Component\PropertyAccess\PropertyAccessor(3, 2, $container->privates['cache.property_access'] ?? self::getCache_PropertyAccessService($container), $a, $a); $c = $container->privates['serializer.mapping.cache_class_metadata_factory'] ?? self::getSerializer_Mapping_CacheClassMetadataFactoryService($container); $d = new \_ContaoManager\Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter($c); $e = new \_ContaoManager\Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor(new \_ContaoManager\Symfony\Component\PropertyInfo\PropertyInfoExtractor(new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['property_info.serializer_extractor'] ?? $container->load('getPropertyInfo_SerializerExtractorService')); (yield 1 => $container->privates['property_info.reflection_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor()); }, 2), new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['property_info.phpstan_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor()); (yield 1 => $container->privates['property_info.php_doc_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor()); (yield 2 => $container->privates['property_info.reflection_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor()); }, 3), new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['property_info.php_doc_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor()); }, 1), new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['property_info.reflection_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor()); }, 1), new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['property_info.reflection_extractor'] ??= new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor()); }, 1)), $container->privates['cache.property_info'] ?? self::getCache_PropertyInfoService($container)); return $container->privates['serializer'] = new \_ContaoManager\Symfony\Component\Serializer\Serializer([new \_ContaoManager\Symfony\Component\Serializer\Normalizer\UnwrappingDenormalizer($b), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\ProblemNormalizer(\false, translator: NULL), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\UidNormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\DateTimeNormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer([], $d), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\FormErrorNormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\BackedEnumNormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\DataUriNormalizer(NULL), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer(NULL, NULL), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\ArrayDenormalizer(), new \_ContaoManager\Symfony\Component\Serializer\Normalizer\ObjectNormalizer($c, $d, $b, $e, new \_ContaoManager\Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata($c), NULL, [], $e)], [new \_ContaoManager\Symfony\Component\Serializer\Encoder\XmlEncoder(), new \_ContaoManager\Symfony\Component\Serializer\Encoder\JsonEncoder(NULL, NULL), new \_ContaoManager\Symfony\Component\Serializer\Encoder\YamlEncoder(NULL, NULL), new \_ContaoManager\Symfony\Component\Serializer\Encoder\CsvEncoder()], []); } /* * Gets the private 'serializer.mapping.cache_class_metadata_factory' shared service. * * @return \Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory */ protected static function getSerializer_Mapping_CacheClassMetadataFactoryService($container) { return $container->privates['serializer.mapping.cache_class_metadata_factory'] = new \_ContaoManager\Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory(new \_ContaoManager\Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory(new \_ContaoManager\Symfony\Component\Serializer\Mapping\Loader\LoaderChain([new \_ContaoManager\Symfony\Component\Serializer\Mapping\Loader\AttributeLoader(NULL)])), \_ContaoManager\Symfony\Component\Cache\Adapter\PhpArrayAdapter::create($container->targetDir . '' . '/serialization.php', $container->privates['cache.serializer'] ?? self::getCache_SerializerService($container))); } public function getParameter(string $name) : array|bool|string|int|float|\UnitEnum|null { if (isset($this->buildParameters[$name])) { return $this->buildParameters[$name]; } if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters))) { throw new ParameterNotFoundException($name); } if (isset($this->loadedDynamicParameters[$name])) { return $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name); } return $this->parameters[$name]; } public function hasParameter(string $name) : bool { if (isset($this->buildParameters[$name])) { return \true; } return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters); } public function setParameter(string $name, $value) : void { throw new LogicException('Impossible to call set() on a frozen ParameterBag.'); } public function getParameterBag() : ParameterBagInterface { if (!isset($this->parameterBag)) { $parameters = $this->parameters; foreach ($this->loadedDynamicParameters as $name => $loaded) { $parameters[$name] = $loaded ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name); } foreach ($this->buildParameters as $name => $value) { $parameters[$name] = $value; } $this->parameterBag = new FrozenParameterBag($parameters); } return $this->parameterBag; } private $loadedDynamicParameters = ['kernel.runtime_environment' => \false, 'kernel.runtime_mode' => \false, 'kernel.runtime_mode.web' => \false, 'kernel.runtime_mode.cli' => \false, 'kernel.runtime_mode.worker' => \false, 'kernel.build_dir' => \false, 'kernel.cache_dir' => \false, 'router.cache_dir' => \false, 'serializer.mapping.cache.file' => \false]; private $dynamicParameters = []; private function getDynamicParameter(string $name) { $container = $this; $value = match ($name) { 'kernel.runtime_environment' => $container->getEnv('default:kernel.environment:APP_RUNTIME_ENV'), 'kernel.runtime_mode' => $container->getEnv('query_string:default:container.runtime_mode:APP_RUNTIME_MODE'), 'kernel.runtime_mode.web' => $container->getEnv('bool:default::key:web:default:kernel.runtime_mode:'), 'kernel.runtime_mode.cli' => $container->getEnv('not:default:kernel.runtime_mode.web:'), 'kernel.runtime_mode.worker' => $container->getEnv('bool:default::key:worker:default:kernel.runtime_mode:'), 'kernel.build_dir' => $container->targetDir . '', 'kernel.cache_dir' => $container->targetDir . '', 'router.cache_dir' => $container->targetDir . '', 'serializer.mapping.cache.file' => $container->targetDir . '' . '/serialization.php', default => throw new ParameterNotFoundException($name), }; $this->loadedDynamicParameters[$name] = \true; return $this->dynamicParameters[$name] = $value; } protected function getDefaultParameters() : array { return ['kernel.project_dir' => \dirname(__DIR__, 4) . '/test-dir', 'kernel.environment' => 'prod', 'kernel.debug' => \false, 'kernel.logs_dir' => \dirname(__DIR__, 4) . '/test-dir/contao-manager/logs', 'kernel.bundles' => ['FrameworkBundle' => '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle', 'SecurityBundle' => '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\SecurityBundle', 'MonologBundle' => '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\MonologBundle'], 'kernel.bundles_metadata' => ['FrameworkBundle' => ['path' => \dirname(__DIR__, 4) . '/vendor/symfony/framework-bundle', 'namespace' => '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle'], 'SecurityBundle' => ['path' => \dirname(__DIR__, 4) . '/vendor/symfony/security-bundle', 'namespace' => '_ContaoManager\\Symfony\\Bundle\\SecurityBundle'], 'MonologBundle' => ['path' => \dirname(__DIR__, 4) . '/vendor/symfony/monolog-bundle', 'namespace' => '_ContaoManager\\Symfony\\Bundle\\MonologBundle']], 'kernel.charset' => 'UTF-8', 'kernel.container_class' => 'Contao_ManagerApi_ApiKernelProdContainer', 'event_dispatcher.event_aliases' => ['_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => 'console.command', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => 'console.error', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => 'console.signal', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => 'console.terminate', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => 'kernel.controller_arguments', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => 'kernel.controller', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => 'kernel.response', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => 'kernel.finish_request', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => 'kernel.request', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => 'kernel.view', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => 'kernel.exception', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => 'kernel.terminate', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\AuthenticationSuccessEvent' => 'security.authentication.success', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\InteractiveLoginEvent' => 'security.interactive_login', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\SwitchUserEvent' => 'security.switch_user'], 'fragment.renderer.hinclude.global_template' => NULL, 'fragment.path' => '/_fragment', 'kernel.secret' => '', 'kernel.http_method_override' => \true, 'kernel.trust_x_sendfile_type_header' => \false, 'kernel.trusted_hosts' => [], 'kernel.default_locale' => 'en', 'kernel.enabled_locales' => [], 'kernel.error_controller' => 'error_controller', 'debug.file_link_format' => NULL, 'debug.error_handler.throw_at' => 0, 'router.request_context.host' => 'localhost', 'router.request_context.scheme' => 'http', 'router.request_context.base_url' => '', 'router.resource' => 'kernel::loadRoutes', 'request_listener.http_port' => 80, 'request_listener.https_port' => 443, 'data_collector.templates' => [], 'security.role_hierarchy.roles' => ['ROLE_ADMIN' => [0 => 'ROLE_INSTALL'], 'ROLE_INSTALL' => [0 => 'ROLE_UPDATE'], 'ROLE_UPDATE' => [0 => 'ROLE_READ'], 'ROLE_READ' => [0 => 'ROLE_USER']], 'security.access.denied_url' => NULL, 'security.authentication.manager.erase_credentials' => \true, 'security.authentication.session_strategy.strategy' => 'migrate', 'security.authentication.hide_user_not_found' => \true, 'security.firewalls' => [0 => 'api'], 'security.logout_uris' => [], 'monolog.use_microseconds' => \true, 'monolog.swift_mailer.handlers' => [], 'monolog.handlers_to_channels' => ['monolog.handler.main' => NULL], 'console.command.ids' => []]; } } privates['.console.command.cache_pool_prune.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:pool:prune', [], 'Prune cache pools', \false, #[\Closure(name: 'console.command.cache_pool_prune', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolPruneCommand => $container->privates['console.command.cache_pool_prune'] ?? $container->load('getConsole_Command_CachePoolPruneService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\TaskUpdateCommand($container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'] ?? $container->load('getTaskManagerService')); $instance->setName('task:update'); $instance->setDescription('Updates the current task and returns the status information.'); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController'] = new \_ContaoManager\Contao\ManagerApi\Controller\TaskController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'] ?? $container->load('getTaskManagerService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Contao\MaintenanceModeController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController'] = new \_ContaoManager\Contao\ManagerApi\Controller\FileController($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['.service_locator.y.Xs7Mw'] = new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['processFactory' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory', 'getConsoleProcessFactoryService', \true], 'serverInfo' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo', 'getServerInfoService', \true]], ['processFactory' => '_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory', 'serverInfo' => '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo']); } } services['kernel'] ?? $container->get('kernel', 1)); $c = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Routing\AttributeRouteControllerLoader('prod'); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\XmlFileLoader($b, 'prod')); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\YamlFileLoader($b, 'prod')); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\PhpFileLoader($b, 'prod')); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\GlobFileLoader($b, 'prod')); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\DirectoryLoader($b, 'prod')); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\ContainerLoader(new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['kernel' => ['services', 'kernel', 'getKernelService', \false], 'security.route_loader.logout' => ['privates', 'security.route_loader.logout', 'getSecurity_RouteLoader_LogoutService', \true]], ['kernel' => '?', 'security.route_loader.logout' => '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Routing\\LogoutRouteLoader']), 'prod')); $a->addLoader($c); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\AttributeDirectoryLoader($b, $c)); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\AttributeFileLoader($b, $c)); $a->addLoader(new \_ContaoManager\Symfony\Component\Routing\Loader\Psr4DirectoryLoader($b)); return $container->services['routing.loader'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader($a, ['utf8' => \true], []); } } privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] = new \_ContaoManager\Contao\ManagerApi\Composer\Environment($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'] ?? $container->load('getManagerConfigService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig'] ?? $container->load('getComposerConfigService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\Request'] ?? $container->load('getRequestService'), $container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService')); } } privates['security.listener.user_checker.api'] = new \_ContaoManager\Symfony\Component\Security\Http\EventListener\UserCheckerListener($container->privates['security.user_checker'] ??= new \_ContaoManager\Symfony\Component\Security\Core\User\InMemoryUserChecker()); } } services['services_resetter'] = new \_ContaoManager\Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter(new RewindableGenerator(function () use($container) { if (\false) { (yield '_ContaoManager\\Contao\\ManagerApi\\ApiApplication' => null); } if (isset($container->services['request_stack'])) { (yield 'request_stack' => $container->services['request_stack'] ?? null); } if (isset($container->services['cache.app'])) { (yield 'cache.app' => $container->services['cache.app'] ?? null); } if (isset($container->services['cache.system'])) { (yield 'cache.system' => $container->services['cache.system'] ?? null); } if (\false) { (yield 'cache.validator' => null); } if (isset($container->privates['cache.serializer'])) { (yield 'cache.serializer' => $container->privates['cache.serializer'] ?? null); } if (\false) { (yield 'cache.annotations' => null); } if (isset($container->privates['cache.property_info'])) { (yield 'cache.property_info' => $container->privates['cache.property_info'] ?? null); } if (isset($container->services['security.token_storage'])) { (yield 'security.untracked_token_storage' => $container->services['security.token_storage'] ?? null); } if (\false) { (yield 'cache.security_expression_language' => null); } if (isset($container->services['cache.security_is_granted_attribute_expression_language'])) { (yield 'cache.security_is_granted_attribute_expression_language' => $container->services['cache.security_is_granted_attribute_expression_language'] ?? null); } if (isset($container->privates['monolog.handler.main'])) { (yield 'monolog.handler.main' => $container->privates['monolog.handler.main'] ?? null); } }, fn() => 0 + (int) \false + (int) isset($container->services['request_stack']) + (int) isset($container->services['cache.app']) + (int) isset($container->services['cache.system']) + (int) \false + (int) isset($container->privates['cache.serializer']) + (int) \false + (int) isset($container->privates['cache.property_info']) + (int) isset($container->services['security.token_storage']) + (int) \false + (int) isset($container->services['cache.security_is_granted_attribute_expression_language']) + (int) isset($container->privates['monolog.handler.main'])), ['_ContaoManager\\Contao\\ManagerApi\\ApiApplication' => ['reset'], 'request_stack' => ['?resetRequestFormats'], 'cache.app' => ['reset'], 'cache.system' => ['reset'], 'cache.validator' => ['reset'], 'cache.serializer' => ['reset'], 'cache.annotations' => ['reset'], 'cache.property_info' => ['reset'], 'security.untracked_token_storage' => ['reset'], 'cache.security_expression_language' => ['reset'], 'cache.security_is_granted_attribute_expression_language' => ['reset'], 'monolog.handler.main' => ['reset']]); } } services['cache.security_is_granted_attribute_expression_language'] = \_ContaoManager\Symfony\Component\Cache\Adapter\AbstractAdapter::createSystemCache('k5ofOjY0eB', 0, $container->getParameter('container.build_id'), $container->targetDir . '' . '/pools/system', $container->privates['monolog.logger.cache'] ?? self::getMonolog_Logger_CacheService($container)); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\OpcacheController(); } } privates['console.command.assets_install'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\AssetsInstallCommand($container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), \dirname(__DIR__, 4) . '/test-dir'); $instance->setName('assets:install'); $instance->setDescription('Install bundle\'s web assets under a public directory'); return $instance; } } privates['serializer.mapping.cache_warmer'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\CacheWarmer\SerializerCacheWarmer([new \_ContaoManager\Symfony\Component\Serializer\Mapping\Loader\AttributeLoader(NULL)], $container->targetDir . '' . '/serialization.php'); } } privates['_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator'] = new \_ContaoManager\Contao\ManagerApi\Security\LoginAuthenticator($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] ?? self::getJwtManagerService($container), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['kernel'] ?? $container->get('kernel', 1)); } } privates['security.event_dispatcher.api'] = $instance = new \_ContaoManager\Symfony\Component\EventDispatcher\EventDispatcher(); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: 'security.listener.api.user_provider', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserProviderListener')] fn() => $container->privates['security.listener.api.user_provider'] ?? $container->load('getSecurity_Listener_Api_UserProviderService'), 'checkPassport'], 2048); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: 'security.listener.user_checker.api', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserCheckerListener')] fn() => $container->privates['security.listener.user_checker.api'] ?? $container->load('getSecurity_Listener_UserChecker_ApiService'), 'preCheckCredentials'], 256); $instance->addListener('security.authentication.success', [#[\Closure(name: 'security.listener.user_checker.api', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserCheckerListener')] fn() => $container->privates['security.listener.user_checker.api'] ?? $container->load('getSecurity_Listener_UserChecker_ApiService'), 'postCheckCredentials'], 256); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener')] fn() => $container->privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener'] ??= new \_ContaoManager\Contao\ManagerApi\EventListener\CheckTotpListener(), '__invoke'], 0); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: 'security.listener.user_provider', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserProviderListener')] fn() => $container->privates['security.listener.user_provider'] ?? $container->load('getSecurity_Listener_UserProviderService'), 'checkPassport'], 1024); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent', [#[\Closure(name: 'security.listener.check_authenticator_credentials', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckCredentialsListener')] fn() => $container->privates['security.listener.check_authenticator_credentials'] ?? $container->load('getSecurity_Listener_CheckAuthenticatorCredentialsService'), 'checkPassport'], 0); $instance->addListener('_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LoginSuccessEvent', [#[\Closure(name: 'security.listener.password_migrating', class: '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\PasswordMigratingListener')] fn() => $container->privates['security.listener.password_migrating'] ?? $container->load('getSecurity_Listener_PasswordMigratingService'), 'onLoginSuccess'], 0); return $instance; } } services['cache.system'] = \_ContaoManager\Symfony\Component\Cache\Adapter\AbstractAdapter::createSystemCache('v3ByTFWe16', 0, $container->getParameter('container.build_id'), $container->targetDir . '' . '/pools/system', $container->privates['monolog.logger.cache'] ?? self::getMonolog_Logger_CacheService($container)); } } privates['monolog.logger'] = $instance = new \_ContaoManager\Monolog\Logger('app'); $instance->useMicrosecondTimestamps(\true); $instance->pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $instance; } } privates['.console.command.cache_pool_delete.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:pool:delete', [], 'Delete an item from a cache pool', \false, #[\Closure(name: 'console.command.cache_pool_delete', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolDeleteCommand => $container->privates['console.command.cache_pool_delete'] ?? $container->load('getConsole_Command_CachePoolDeleteService')); } } privates['monolog.logger.security'] = $instance = new \_ContaoManager\Monolog\Logger('security'); $instance->pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\UpdateCommand($container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate'] ?? $container->load('getSelfUpdateService')); $instance->setName('self-update'); $instance->setDescription('Updates Contao Manager to the latest version'); return $instance; } } pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $container->services['debug.error_handler_configurator'] = new \_ContaoManager\Symfony\Component\HttpKernel\Debug\ErrorHandlerConfigurator($a, NULL, 0, \false, \false, NULL); } } privates['.Contao\\ManagerApi\\Command\\TaskDeleteCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('task:delete', [], 'Deletes the current task if it is not active.', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\TaskDeleteCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand'] ?? $container->load('getTaskDeleteCommandService')); } } privates['security.access.authenticated_voter'] = new \_ContaoManager\Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter($container->privates['security.authentication.trust_resolver'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver()); } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\ProcessCheck($container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController'] = new \_ContaoManager\Contao\ManagerApi\Controller\SessionController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container), $container->privates['security.helper'] ?? $container->load('getSecurity_HelperService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] ?? self::getJwtManagerService($container), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator'] ?? $container->load('getWebauthnAuthenticatorService')); } } privates['security.listener.password_migrating'] = new \_ContaoManager\Symfony\Component\Security\Http\EventListener\PasswordMigratingListener($container->privates['security.password_hasher_factory'] ?? self::getSecurity_PasswordHasherFactoryService($container)); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Manager\SelfUpdateTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate'] ?? $container->load('getSelfUpdateService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.console.command.serializer_debug.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:serializer', [], 'Display serialization information for classes', \false, #[\Closure(name: 'console.command.serializer_debug', class: '_ContaoManager\\Symfony\\Component\\Serializer\\Command\\DebugCommand')] fn(): \_ContaoManager\Symfony\Component\Serializer\Command\DebugCommand => $container->privates['console.command.serializer_debug'] ?? $container->load('getConsole_Command_SerializerDebugService')); } } services['cache.global_clearer'] = new \_ContaoManager\Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer(['cache.app' => $container->services['cache.app'] ?? $container->load('getCache_AppService'), 'cache.system' => $container->services['cache.system'] ?? $container->load('getCache_SystemService'), 'cache.serializer' => $container->privates['cache.serializer'] ?? self::getCache_SerializerService($container), 'cache.property_info' => $container->privates['cache.property_info'] ?? self::getCache_PropertyInfoService($container), 'cache.property_access' => $container->privates['cache.property_access'] ?? self::getCache_PropertyAccessService($container), 'cache.security_is_granted_attribute_expression_language' => $container->services['cache.security_is_granted_attribute_expression_language'] ?? $container->load('getCache_SecurityIsGrantedAttributeExpressionLanguageService')]); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\TaskManager(new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask'] ?? $container->load('getClearCacheTaskService')); (yield 1 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask'] ?? $container->load('getDumpAutoloadTaskService')); (yield 2 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask'] ?? $container->load('getBackupCreateTaskService')); (yield 3 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask'] ?? $container->load('getBackupRestoreTaskService')); (yield 4 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask'] ?? $container->load('getRebuildCacheTaskService')); (yield 5 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask'] ?? $container->load('getSelfUpdateTaskService')); (yield 6 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\InstallTask'] ?? $container->load('getInstallTaskService')); (yield 7 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\SetupTask'] ?? $container->load('getSetupTaskService')); (yield 8 => $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\UpdateTask'] ?? $container->load('getUpdateTaskService')); }, 9), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['security.authorization_checker'] ?? self::getSecurity_AuthorizationCheckerService($container), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $container->privates['console.error_listener'] = new \_ContaoManager\Symfony\Component\Console\EventListener\ErrorListener($a); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Packages\UploadPackagesController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig'] ?? $container->load('getUploadsConfigService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi'] = new \_ContaoManager\Contao\ManagerApi\Process\ContaoApi($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\MemoryLimitCheck($container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } privates['.security.command.debug_firewall.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:firewall', [], 'Display information about your security firewall(s)', \false, #[\Closure(name: 'security.command.debug_firewall', class: '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Command\\DebugFirewallCommand')] fn(): \_ContaoManager\Symfony\Bundle\SecurityBundle\Command\DebugFirewallCommand => $container->privates['security.command.debug_firewall'] ?? $container->load('getSecurity_Command_DebugFirewallService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\SysTempDirCheck($container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } privates['.console.command.secrets_remove.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('secrets:remove', [], 'Remove a secret from the vault', \false, #[\Closure(name: 'console.command.secrets_remove', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsRemoveCommand => $container->privates['console.command.secrets_remove'] ?? $container->load('getConsole_Command_SecretsRemoveService')); } } privates['argument_resolver.query_parameter_value_resolver'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\QueryParameterValueResolver(); } } privates['.Contao\\ManagerApi\\Command\\TaskUpdateCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('task:update', [], 'Updates the current task and returns the status information.', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\TaskUpdateCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand'] ?? $container->load('getTaskUpdateCommandService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\ConfigController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'] ?? $container->load('getManagerConfigService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo'] ?? $container->load('getServerInfoService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate'] = new \_ContaoManager\Contao\ManagerApi\System\SelfUpdate($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'] ?? $container->load('getManagerConfigService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\Request'] ?? $container->load('getRequestService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } services['_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\TaskAbortCommand($container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'] ?? $container->load('getTaskManagerService')); $instance->setName('task:abort'); $instance->setDescription('Aborts the current task and returns the status information.'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver'] = $instance = new \_ContaoManager\Contao\ManagerApi\Composer\CloudResolver($container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\Request'] ?? $container->load('getRequestService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.console.command.secrets_decrypt_to_local.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('secrets:decrypt-to-local', [], 'Decrypt all secrets and stores them in the local vault', \false, #[\Closure(name: 'console.command.secrets_decrypt_to_local', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsDecryptToLocalCommand => $container->privates['console.command.secrets_decrypt_to_local'] ?? $container->load('getConsole_Command_SecretsDecryptToLocalService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Contao\AccessKeyController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi'] ?? $container->load('getContaoApiService')); } } privates['property_info.serializer_extractor'] = new \_ContaoManager\Symfony\Component\PropertyInfo\Extractor\SerializerExtractor($container->privates['serializer.mapping.cache_class_metadata_factory'] ?? self::getSerializer_Mapping_CacheClassMetadataFactoryService($container)); } } privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] = new \_ContaoManager\Contao\ManagerApi\Security\UserProvider($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container)); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\PhpWebController($container->privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory'] ?? $container->load('getIntegrityCheckFactoryService')); } } privates['.Contao\\ManagerApi\\Command\\AboutCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('about', [], 'Displays information about Contao Manager and the current server', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\AboutCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand'] ?? $container->load('getAboutCommandService')); } } privates['console.command.container_lint'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ContainerLintCommand(); $instance->setName('lint:container'); $instance->setDescription('Ensure that arguments injected into services match type declarations'); return $instance; } } privates['.console.command.about.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('about', [], 'Display information about the current project', \false, #[\Closure(name: 'console.command.about', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\AboutCommand => $container->privates['console.command.about'] ?? $container->load('getConsole_Command_AboutService')); } } privates['.console.command.router_match.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('router:match', [], 'Help debug routes by simulating a path info match', \false, #[\Closure(name: 'console.command.router_match', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\RouterMatchCommand => $container->privates['console.command.router_match'] ?? $container->load('getConsole_Command_RouterMatchService')); } } services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] = new \_ContaoManager\Contao\ManagerApi\I18n\Translator($container->services['request_stack'] ??= new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack()); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\SelfUpdateController(); } } privates['router.request_context'] ?? self::getRouter_RequestContextService($container); return $container->privates['security.channel_listener'] = new \_ContaoManager\Symfony\Component\Security\Http\Firewall\ChannelListener($container->privates['security.access_map'] ?? $container->load('getSecurity_AccessMapService'), $container->privates['monolog.logger.security'] ?? $container->load('getMonolog_Logger_SecurityService'), $a->getHttpPort(), $a->getHttpsPort()); } } privates['argument_resolver.variadic'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver(); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Config\ManagerController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'] ?? $container->load('getManagerConfigService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Contao\BackupController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService')); } } privates['security.helper'] = new \_ContaoManager\Symfony\Bundle\SecurityBundle\Security(new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['request_stack' => ['services', 'request_stack', 'getRequestStackService', \false], 'security.authenticator.managers_locator' => ['privates', 'security.authenticator.managers_locator', 'getSecurity_Authenticator_ManagersLocatorService', \true], 'security.authorization_checker' => ['privates', 'security.authorization_checker', 'getSecurity_AuthorizationCheckerService', \false], 'security.firewall.event_dispatcher_locator' => ['privates', 'security.firewall.event_dispatcher_locator', 'getSecurity_Firewall_EventDispatcherLocatorService', \true], 'security.firewall.map' => ['privates', 'security.firewall.map', 'getSecurity_Firewall_MapService', \false], 'security.token_storage' => ['services', 'security.token_storage', 'getSecurity_TokenStorageService', \false], 'security.user_checker_locator' => ['privates', 'security.user_checker_locator', 'getSecurity_UserCheckerLocatorService', \true]], ['request_stack' => '?', 'security.authenticator.managers_locator' => '?', 'security.authorization_checker' => '?', 'security.firewall.event_dispatcher_locator' => '?', 'security.firewall.map' => '?', 'security.token_storage' => '?', 'security.user_checker_locator' => '?']), ['api' => new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator', 'getJwtAuthenticatorService', \true], '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator', 'getLoginAuthenticatorService', \true], '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator', 'getPasswordlessAuthenticatorService', \true], '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator', 'getTokenAuthenticatorService', \true], '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator', 'getWebauthnAuthenticatorService', \true]], ['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator' => '?', '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator' => '?', '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator' => '?', '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator' => '?', '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => '?'])]); } } privates['security.listener.user_provider'] = new \_ContaoManager\Symfony\Component\Security\Http\EventListener\UserProviderListener($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService')); } } privates['.console.command.yaml_lint.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('lint:yaml', [], 'Lint a YAML file and outputs encountered errors', \false, #[\Closure(name: 'console.command.yaml_lint', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\YamlLintCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\YamlLintCommand => $container->privates['console.command.yaml_lint'] ?? $container->load('getConsole_Command_YamlLintService')); } } privates['secrets.vault'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\SodiumVault(\dirname(__DIR__, 4) . '/test-dir/config/secrets/' . $container->getEnv('string:default:kernel.environment:APP_RUNTIME_ENV'), \_ContaoManager\Symfony\Component\String\LazyString::fromCallable($container->getEnv(...), 'base64:default::SYMFONY_DECRYPTION_SECRET')); } } privates['console.command.config_dump_reference'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ConfigDumpReferenceCommand(); $instance->setName('config:dump-reference'); $instance->setDescription('Dump the default configuration for an extension'); return $instance; } } privates['console.command.cache_warmup'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CacheWarmupCommand($container->services['cache_warmer'] ?? $container->load('getCacheWarmerService')); $instance->setName('cache:warmup'); $instance->setDescription('Warm up an empty cache'); return $instance; } } privates['security.access.role_hierarchy_voter'] = new \_ContaoManager\Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter(new \_ContaoManager\Symfony\Component\Security\Core\Role\RoleHierarchy($container->parameters['security.role_hierarchy.roles'])); } } privates['argument_resolver.request_attribute'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver(); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Contao\BackupCreateTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.Contao\\ManagerApi\\Command\\ProcessRunnerCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('background-task:run', [], 'Execute a background task', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\ProcessRunnerCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand'] ?? $container->load('getProcessRunnerCommandService')); } } privates['console.command.cache_pool_delete'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolDeleteCommand($container->services['cache.global_clearer'] ?? $container->load('getCache_GlobalClearerService'), ['cache.app', 'cache.system', 'cache.validator', 'cache.serializer', 'cache.annotations', 'cache.property_info', 'cache.property_access', 'cache.security_expression_language', 'cache.security_is_granted_attribute_expression_language']); $instance->setName('cache:pool:delete'); $instance->setDescription('Delete an item from a cache pool'); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController'] = $instance = new \_ContaoManager\Contao\ManagerApi\Controller\Packages\CloudController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager'] ?? $container->load('getTaskManagerService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService')); $instance->setContainer((new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['http_kernel' => ['services', 'http_kernel', 'getHttpKernelService', \false], 'parameter_bag' => ['privates', 'parameter_bag', 'getParameterBagService', \false], 'request_stack' => ['services', 'request_stack', 'getRequestStackService', \false], 'router' => ['services', 'router', 'getRouterService', \false], 'security.authorization_checker' => ['privates', 'security.authorization_checker', 'getSecurity_AuthorizationCheckerService', \false], 'security.token_storage' => ['services', 'security.token_storage', 'getSecurity_TokenStorageService', \false], 'serializer' => ['privates', 'serializer', 'getSerializerService', \false]], ['http_kernel' => '?', 'parameter_bag' => '?', 'request_stack' => '?', 'router' => '?', 'security.authorization_checker' => '?', 'security.token_storage' => '?', 'serializer' => '?']))->withContext('_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController', $container)); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\SetupTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Packages\SetupTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver'] ?? $container->load('getCloudResolverService'), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig'] ?? $container->load('getUploadsConfigService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.console.command.secrets_set.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('secrets:set', [], 'Set a secret in the vault', \false, #[\Closure(name: 'console.command.secrets_set', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsSetCommand => $container->privates['console.command.secrets_set'] ?? $container->load('getConsole_Command_SecretsSetService')); } } services['Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Controller\TemplateController(NULL); } } privates['console.command.cache_pool_invalidate_tags'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolInvalidateTagsCommand(new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['cache.app' => ['privates', 'cache.app.taggable', 'getCache_App_TaggableService', \true]], ['cache.app' => '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter'])); $instance->setName('cache:pool:invalidate-tags'); $instance->setDescription('Invalidate cache tags for all or a specific pool'); return $instance; } } privates['.console.command.event_dispatcher_debug.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:event-dispatcher', [], 'Display configured listeners for an application', \false, #[\Closure(name: 'console.command.event_dispatcher_debug', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\EventDispatcherDebugCommand => $container->privates['console.command.event_dispatcher_debug'] ?? $container->load('getConsole_Command_EventDispatcherDebugService')); } } privates['.console.command.cache_pool_list.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:pool:list', [], 'List available cache pools', \false, #[\Closure(name: 'console.command.cache_pool_list', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolListCommand => $container->privates['console.command.cache_pool_list'] ?? $container->load('getConsole_Command_CachePoolListService')); } } privates['console.command.event_dispatcher_debug'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\EventDispatcherDebugCommand($container->privates['.service_locator.BvkMlPl'] ?? $container->load('get_ServiceLocator_BvkMlPlService')); $instance->setName('debug:event-dispatcher'); $instance->setDescription('Display configured listeners for an application'); return $instance; } } privates['argument_resolver.service'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\ServiceValueResolver(new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController::__invoke' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController::__invoke' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::handle' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::update' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::handle' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::write' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController::__invoke' => ['privates', '.service_locator.y.Xs7Mw', 'get_ServiceLocator_Y_Xs7MwService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController::__invoke' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController::__invoke' => ['privates', '.service_locator.EZsc.DO', 'get_ServiceLocator_EZsc_DOService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController:__invoke' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController:__invoke' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController:handle' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController:update' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController:handle' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController:write' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController:__invoke' => ['privates', '.service_locator.y.Xs7Mw', 'get_ServiceLocator_Y_Xs7MwService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController' => ['privates', '.service_locator.y.Xs7Mw', 'get_ServiceLocator_Y_Xs7MwService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController:__invoke' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController' => ['privates', '.service_locator.aH5O6Sd', 'get_ServiceLocator_AH5O6SdService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController:__invoke' => ['privates', '.service_locator.EZsc.DO', 'get_ServiceLocator_EZsc_DOService', \true], '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController' => ['privates', '.service_locator.EZsc.DO', 'get_ServiceLocator_EZsc_DOService', \true]], ['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController::__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController::__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::handle' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController::update' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::handle' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController::write' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController::__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController::__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController::__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController:__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController:__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController:handle' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController:update' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController:handle' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController:write' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController:__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController:__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController:__invoke' => '?', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController' => '?'])); } } privates['.console.command.cache_pool_invalidate_tags.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:pool:invalidate-tags', [], 'Invalidate cache tags for all or a specific pool', \false, #[\Closure(name: 'console.command.cache_pool_invalidate_tags', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolInvalidateTagsCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolInvalidateTagsCommand => $container->privates['console.command.cache_pool_invalidate_tags'] ?? $container->load('getConsole_Command_CachePoolInvalidateTagsService')); } } privates['.console.command.cache_warmup.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:warmup', [], 'Warm up an empty cache', \false, #[\Closure(name: 'console.command.cache_warmup', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CacheWarmupCommand => $container->privates['console.command.cache_warmup'] ?? $container->load('getConsole_Command_CacheWarmupService')); } } services['cache.system_clearer'] = new \_ContaoManager\Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer(['cache.system' => $container->services['cache.system'] ?? $container->load('getCache_SystemService'), 'cache.serializer' => $container->privates['cache.serializer'] ?? self::getCache_SerializerService($container), 'cache.property_info' => $container->privates['cache.property_info'] ?? self::getCache_PropertyInfoService($container), 'cache.property_access' => $container->privates['cache.property_access'] ?? self::getCache_PropertyAccessService($container), 'cache.security_is_granted_attribute_expression_language' => $container->services['cache.security_is_granted_attribute_expression_language'] ?? $container->load('getCache_SecurityIsGrantedAttributeExpressionLanguageService')]); } } privates['.service_locator.BvkMlPl'] = new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['event_dispatcher' => ['services', 'event_dispatcher', 'getEventDispatcherService', \false], 'security.event_dispatcher.api' => ['privates', 'security.event_dispatcher.api', 'getSecurity_EventDispatcher_ApiService', \true]], ['event_dispatcher' => '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcher', 'security.event_dispatcher.api' => '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcher']); } } privates['monolog.logger.tasks'] = $instance = new \_ContaoManager\Monolog\Logger('tasks'); $instance->pushHandler($container->privates['monolog.handler.main'] ?? self::getMonolog_Handler_MainService($container)); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\AdminUserController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\IntegrityCheckCommand($container->privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory'] ?? $container->load('getIntegrityCheckFactoryService')); $instance->setName('integrity-check'); $instance->setDescription('Performs integrity check for the Contao Manager'); return $instance; } } privates['.console.command.assets_install.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('assets:install', [], 'Install bundle\'s web assets under a public directory', \false, #[\Closure(name: 'console.command.assets_install', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\AssetsInstallCommand => $container->privates['console.command.assets_install'] ?? $container->load('getConsole_Command_AssetsInstallService')); } } privates['security.firewall.event_dispatcher_locator'] = new \_ContaoManager\Symfony\Component\DependencyInjection\ServiceLocator(['api' => #[\Closure(name: 'security.event_dispatcher.api', class: '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcher')] fn() => $container->privates['security.event_dispatcher.api'] ?? $container->load('getSecurity_EventDispatcher_ApiService')]); } } privates['console.command.serializer_debug'] = $instance = new \_ContaoManager\Symfony\Component\Serializer\Command\DebugCommand($container->privates['serializer.mapping.cache_class_metadata_factory'] ?? self::getSerializer_Mapping_CacheClassMetadataFactoryService($container)); $instance->setName('debug:serializer'); $instance->setDescription('Display serialization information for classes'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\PhpExtensionsCheck($container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } privates['argument_resolver.default'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver(); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Config\AuthController(new \_ContaoManager\Contao\ManagerApi\Config\AuthConfig($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem())); } } privates['argument_resolver.datetime'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\DateTimeValueResolver(new \_ContaoManager\Symfony\Component\Clock\Clock()); } } privates['argument_resolver.uid'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\UidValueResolver(); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Contao\InstallToolLockController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['.Contao\\ManagerApi\\Command\\UpdateCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('self-update', [], 'Updates Contao Manager to the latest version', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\UpdateCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand'] ?? $container->load('getUpdateCommandService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Config\ComposerController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig'] ?? $container->load('getComposerConfigService')); } } privates['argument_resolver.session'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver(); } } services['cache_warmer'] = new \_ContaoManager\Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate(new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['config_builder.warmer'] ?? $container->load('getConfigBuilder_WarmerService')); (yield 1 => $container->privates['router.cache_warmer'] ?? $container->load('getRouter_CacheWarmerService')); (yield 2 => $container->privates['serializer.mapping.cache_warmer'] ?? $container->load('getSerializer_Mapping_CacheWarmerService')); }, 3), \false, $container->targetDir . '' . '/Contao_ManagerApi_ApiKernelProdContainerDeprecations.log'); } } privates['router.request_context'] ?? self::getRouter_RequestContextService($container); return $container->services['Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Controller\RedirectController($container->services['router'] ?? self::getRouterService($container), $a->getHttpPort(), $a->getHttpsPort()); } } privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig'] = new \_ContaoManager\Contao\ManagerApi\Config\UploadsConfig($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Contao\DatabaseMigrationController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->services['kernel'] ?? $container->get('kernel', 1)); } } privates['console.command.yaml_lint'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\YamlLintCommand(); $instance->setName('lint:yaml'); $instance->setDescription('Lint a YAML file and outputs encountered errors'); return $instance; } } privates['config_builder.warmer'] = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\CacheWarmer\ConfigBuilderCacheWarmer($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator'] = new \_ContaoManager\Contao\ManagerApi\Security\PasswordlessAuthenticator($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager'] ?? self::getJwtManagerService($container), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['kernel'] ?? $container->get('kernel', 1)); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Composer\ClearCacheTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Packages\RootPackageController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService')); } } privates['cache.app.taggable'] = new \_ContaoManager\Symfony\Component\Cache\Adapter\TagAwareAdapter($container->services['cache.app'] ?? $container->load('getCache_AppService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] = new \_ContaoManager\Contao\ManagerApi\Process\ContaoConsole($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'] = new \_ContaoManager\Contao\ManagerApi\Config\ManagerConfig($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['security.user_value_resolver'] = new \_ContaoManager\Symfony\Component\Security\Http\Controller\UserValueResolver($container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage()); } } privates['.console.command.debug_autowiring.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:autowiring', [], 'List classes/interfaces you can use for autowiring', \false, #[\Closure(name: 'console.command.debug_autowiring', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\DebugAutowiringCommand => $container->privates['console.command.debug_autowiring'] ?? $container->load('getConsole_Command_DebugAutowiringService')); } } privates['security.command.debug_firewall'] = $instance = new \_ContaoManager\Symfony\Bundle\SecurityBundle\Command\DebugFirewallCommand($container->parameters['security.firewalls'], $container->privates['.service_locator.tpD_zef'] ?? self::get_ServiceLocator_TpDZefService($container), $container->privates['.service_locator.BvkMlPl'] ?? $container->load('get_ServiceLocator_BvkMlPlService'), ['api' => [$container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator'] ?? $container->load('getLoginAuthenticatorService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator'] ?? $container->load('getWebauthnAuthenticatorService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator'] ?? $container->load('getPasswordlessAuthenticatorService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator'] ?? $container->load('getJwtAuthenticatorService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator'] ?? $container->load('getTokenAuthenticatorService')]], \false); $instance->setName('debug:firewall'); $instance->setDescription('Display information about your security firewall(s)'); return $instance; } } privates['security.listener.check_authenticator_credentials'] = new \_ContaoManager\Symfony\Component\Security\Http\EventListener\CheckCredentialsListener($container->privates['security.password_hasher_factory'] ?? self::getSecurity_PasswordHasherFactoryService($container)); } } privates['.console.command.cache_pool_clear.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:pool:clear', [], 'Clear cache pools', \false, #[\Closure(name: 'console.command.cache_pool_clear', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolClearCommand => $container->privates['console.command.cache_pool_clear'] ?? $container->load('getConsole_Command_CachePoolClearService')); } } privates['console.command.cache_clear'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand(new \_ContaoManager\Symfony\Component\HttpKernel\CacheClearer\ChainCacheClearer(new RewindableGenerator(fn() => new \EmptyIterator(), 0)), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); $instance->setName('cache:clear'); $instance->setDescription('Clear the cache'); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\PhpinfoController(); } } privates['console.command.cache_pool_list'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolListCommand(['cache.app', 'cache.system', 'cache.validator', 'cache.serializer', 'cache.annotations', 'cache.property_info', 'cache.property_access', 'cache.security_expression_language', 'cache.security_is_granted_attribute_expression_language']); $instance->setName('cache:pool:list'); $instance->setDescription('List available cache pools'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator'] ?? $container->load('getWebauthnAuthenticatorService'); if (isset($container->privates['security.authenticator.manager.api'])) { return $container->privates['security.authenticator.manager.api']; } return $container->privates['security.authenticator.manager.api'] = new \_ContaoManager\Symfony\Component\Security\Http\Authentication\AuthenticatorManager([$container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator'] ?? $container->load('getLoginAuthenticatorService'), $a, $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator'] ?? $container->load('getPasswordlessAuthenticatorService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator'] ?? $container->load('getJwtAuthenticatorService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator'] ?? $container->load('getTokenAuthenticatorService')], $container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage(), $container->privates['security.event_dispatcher.api'] ?? $container->load('getSecurity_EventDispatcher_ApiService'), 'api', $container->privates['monolog.logger.security'] ?? $container->load('getMonolog_Logger_SecurityService'), \true, \true, []); } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\AllowUrlFopenCheck($container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Contao\RebuildCacheTask($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['security.authenticator.manager.api'] ?? $container->load('getSecurity_Authenticator_Manager_ApiService'); if (isset($container->privates['security.firewall.authenticator.api'])) { return $container->privates['security.firewall.authenticator.api']; } return $container->privates['security.firewall.authenticator.api'] = new \_ContaoManager\Symfony\Component\Security\Http\Firewall\AuthenticatorManagerListener($a); } } privates['.console.command.secrets_generate_key.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('secrets:generate-keys', [], 'Generate new encryption keys', \false, #[\Closure(name: 'console.command.secrets_generate_key', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsGenerateKeysCommand => $container->privates['console.command.secrets_generate_key'] ?? $container->load('getConsole_Command_SecretsGenerateKeyService')); } } privates['.console.command.router_debug.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:router', [], 'Display current routes for an application', \false, #[\Closure(name: 'console.command.router_debug', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\RouterDebugCommand => $container->privates['console.command.router_debug'] ?? $container->load('getConsole_Command_RouterDebugService')); } } privates['console.command.cache_pool_clear'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolClearCommand($container->services['cache.global_clearer'] ?? $container->load('getCache_GlobalClearerService'), ['cache.app', 'cache.system', 'cache.validator', 'cache.serializer', 'cache.annotations', 'cache.property_info', 'cache.property_access', 'cache.security_expression_language', 'cache.security_is_granted_attribute_expression_language']); $instance->setName('cache:pool:clear'); $instance->setDescription('Clear cache pools'); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController'] = new \_ContaoManager\Contao\ManagerApi\Controller\LogController($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['container.env_var_processor'] = new \_ContaoManager\Symfony\Component\DependencyInjection\EnvVarProcessor($container, new RewindableGenerator(function () use($container) { (yield 0 => $container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService')); }, 1)); } } privates['security.listener.api.user_provider'] = new \_ContaoManager\Symfony\Component\Security\Http\EventListener\UserProviderListener($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\InstallTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Packages\InstallTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver'] ?? $container->load('getCloudResolverService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } services['container.env_var_processors_locator'] = new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['base64' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'bool' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'const' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'csv' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'default' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'defined' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'enum' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'file' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'float' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'int' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'json' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'key' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'not' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'query_string' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'require' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'resolve' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'shuffle' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'string' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'trim' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true], 'url' => ['privates', 'container.env_var_processor', 'getContainer_EnvVarProcessorService', \true]], ['base64' => '?', 'bool' => '?', 'const' => '?', 'csv' => '?', 'default' => '?', 'defined' => '?', 'enum' => '?', 'file' => '?', 'float' => '?', 'int' => '?', 'json' => '?', 'key' => '?', 'not' => '?', 'query_string' => '?', 'require' => '?', 'resolve' => '?', 'shuffle' => '?', 'string' => '?', 'trim' => '?', 'url' => '?']); } } privates['_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener'] = new \_ContaoManager\Contao\ManagerApi\EventListener\ExceptionListener($container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService'), \false); } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\SymlinkCheck($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\System\\Request'] = new \_ContaoManager\Contao\ManagerApi\System\Request($container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck'] = new \_ContaoManager\Contao\ManagerApi\IntegrityCheck\SessionCheck($container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Packages\MissingPackagesController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService')); } } privates['console.command.secrets_generate_key'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsGenerateKeysCommand($container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService'), $container->privates['secrets.local_vault'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault(\dirname(__DIR__, 4) . '/test-dir/.env.prod.local')); $instance->setName('secrets:generate-keys'); $instance->setDescription('Generate new encryption keys'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\UpdateTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Packages\UpdateTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver'] ?? $container->load('getCloudResolverService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig'] ?? $container->load('getUploadsConfigService'), $container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService'), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem(), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.console.command.secrets_list.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('secrets:list', [], 'List all secrets', \false, #[\Closure(name: 'console.command.secrets_list', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsListCommand => $container->privates['console.command.secrets_list'] ?? $container->load('getConsole_Command_SecretsListService')); } } privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig'] = new \_ContaoManager\Contao\ManagerApi\Config\ComposerConfig($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['filesystem'] ??= new \_ContaoManager\Symfony\Component\Filesystem\Filesystem()); } } privates['console.command.secrets_encrypt_from_local'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsEncryptFromLocalCommand($container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService'), $container->privates['secrets.local_vault'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault(\dirname(__DIR__, 4) . '/test-dir/.env.prod.local')); $instance->setName('secrets:encrypt-from-local'); $instance->setDescription('Encrypt all local secrets to the vault'); return $instance; } } privates['security.access_listener'] = new \_ContaoManager\Symfony\Component\Security\Http\Firewall\AccessListener($container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage(), $container->privates['security.access.decision_manager'] ?? self::getSecurity_Access_DecisionManagerService($container), $container->privates['security.access_map'] ?? $container->load('getSecurity_AccessMapService'), \false); } } privates['console.command.cache_pool_prune'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CachePoolPruneCommand(new RewindableGenerator(function () use($container) { (yield 'cache.app' => $container->services['cache.app'] ?? $container->load('getCache_AppService')); }, 1)); $instance->setName('cache:pool:prune'); $instance->setDescription('Prune cache pools'); return $instance; } } privates['.security.command.user_password_hash.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('security:hash-password', [], 'Hash a user password', \false, #[\Closure(name: 'security.command.user_password_hash', class: '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Command\\UserPasswordHashCommand')] fn(): \_ContaoManager\Symfony\Component\PasswordHasher\Command\UserPasswordHashCommand => $container->privates['security.command.user_password_hash'] ?? $container->load('getSecurity_Command_UserPasswordHashService')); } } privates['security.route_loader.logout'] = new \_ContaoManager\Symfony\Bundle\SecurityBundle\Routing\LogoutRouteLoader([], 'security.logout_uris'); } } privates['.console.command.config_debug.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('debug:config', [], 'Dump the current configuration for an extension', \false, #[\Closure(name: 'console.command.config_debug', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ConfigDebugCommand => $container->privates['console.command.config_debug'] ?? $container->load('getConsole_Command_ConfigDebugService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Server\DatabaseController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi'] ?? $container->load('getContaoApiService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole'] ?? $container->load('getContaoConsoleService')); } } privates['console.command.secrets_decrypt_to_local'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\SecretsDecryptToLocalCommand($container->privates['secrets.vault'] ?? $container->load('getSecrets_VaultService'), $container->privates['secrets.local_vault'] ??= new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Secrets\DotenvVault(\dirname(__DIR__, 4) . '/test-dir/.env.prod.local')); $instance->setName('secrets:decrypt-to-local'); $instance->setDescription('Decrypt all secrets and stores them in the local vault'); return $instance; } } services['_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController'] = new \_ContaoManager\Contao\ManagerApi\Controller\Packages\LocalPackagesController($container->privates['_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment'] ?? $container->load('getEnvironmentService')); } } services['_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand'] = $instance = new \_ContaoManager\Contao\ManagerApi\Command\AboutCommand($container->services['kernel'] ?? $container->get('kernel', 1), $container->privates['_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo'] ?? $container->load('getServerInfoService')); $instance->setName('about'); $instance->setDescription('Displays information about Contao Manager and the current server'); return $instance; } } privates['.Contao\\ManagerApi\\Command\\TaskAbortCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('task:abort', [], 'Aborts the current task and returns the status information.', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\TaskAbortCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand'] ?? $container->load('getTaskAbortCommandService')); } } privates['security.security_token_value_resolver'] = new \_ContaoManager\Symfony\Component\Security\Http\Controller\SecurityTokenValueResolver($container->services['security.token_storage'] ??= new \_ContaoManager\Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage()); } } privates['_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator'] = new \_ContaoManager\Contao\ManagerApi\Security\TokenAuthenticator($container->privates['_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider'] ?? $container->load('getUserProviderService'), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig'] ?? self::getUserConfigService($container)); } } privates['console.command.debug_autowiring'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\DebugAutowiringCommand(NULL, $container->privates['debug.file_link_formatter'] ??= new \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter(NULL)); $instance->setName('debug:autowiring'); $instance->setDescription('List classes/interfaces you can use for autowiring'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo'] = new \_ContaoManager\Contao\ManagerApi\System\ServerInfo(new \_ContaoManager\Contao\ManagerApi\Process\PhpExecutableFinder($container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService')), $container->privates['_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig'] ?? $container->load('getManagerConfigService')); } } privates['console.command.router_match'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\RouterMatchCommand($container->services['router'] ?? self::getRouterService($container), new RewindableGenerator(fn() => new \EmptyIterator(), 0)); $instance->setName('router:match'); $instance->setDescription('Help debug routes by simulating a path info match'); return $instance; } } privates['.Contao\\ManagerApi\\Command\\IntegrityCheckCommand.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('integrity-check', [], 'Performs integrity check for the Contao Manager', \false, #[\Closure(name: '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand')] fn(): \_ContaoManager\Contao\ManagerApi\Command\IntegrityCheckCommand => $container->services['_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand'] ?? $container->load('getIntegrityCheckCommandService')); } } privates['.service_locator.aH5O6Sd'] = new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['serverInfo' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo', 'getServerInfoService', \true]], ['serverInfo' => '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo']); } } services['request_stack'] ??= new \_ContaoManager\Symfony\Component\HttpFoundation\RequestStack(); return $container->services['error_controller'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ErrorController($container->services['http_kernel'] ?? self::getHttpKernelService($container), 'error_controller', new \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer($container->privates['serializer'] ?? self::getSerializerService($container), \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer::getPreferredFormat($a), new \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer(\_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer::isDebug($a, \false), 'UTF-8', $container->privates['debug.file_link_formatter'] ??= new \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter(NULL), \dirname(__DIR__, 4) . '/test-dir', \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer::getAndCleanOutputBuffer($a), $container->privates['monolog.logger'] ?? $container->load('getMonolog_LoggerService')), \_ContaoManager\Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer::isDebug($a, \false))); } } privates['.service_locator.EZsc.DO'] = new \_ContaoManager\Symfony\Component\DependencyInjection\Argument\ServiceLocator($container->getService ??= $container->getService(...), ['updater' => ['privates', '_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate', 'getSelfUpdateService', \true]], ['updater' => '_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate']); } } privates['.console.command.cache_clear.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('cache:clear', [], 'Clear the cache', \false, #[\Closure(name: 'console.command.cache_clear', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand => $container->privates['console.command.cache_clear'] ?? $container->load('getConsole_Command_CacheClearService')); } } privates['argument_resolver.request'] = new \_ContaoManager\Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver(); } } [parent::class, 'serializer', null, 530], "\x00" . parent::class . "\x00" . 'translator' => [parent::class, 'translator', null, 530], "\x00" . parent::class . "\x00" . 'validator' => [parent::class, 'validator', null, 530], 'serializer' => [parent::class, 'serializer', null, 530], 'translator' => [parent::class, 'translator', null, 530], 'validator' => [parent::class, 'validator', null, 530]]; } \class_exists(\_ContaoManager\Symfony\Component\VarExporter\Internal\Hydrator::class); \class_exists(\_ContaoManager\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); \class_exists(\_ContaoManager\Symfony\Component\VarExporter\Internal\LazyObjectState::class); if (!\class_exists('_ContaoManager\\RequestPayloadValueResolverGhost8d82153', \false)) { \class_alias(__NAMESPACE__ . '\\RequestPayloadValueResolverGhost8d82153', '_ContaoManager\\RequestPayloadValueResolverGhost8d82153', \false); } privates['console.command.about'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\AboutCommand(); $instance->setName('about'); $instance->setDescription('Display information about the current project'); return $instance; } } privates['_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask'] = $instance = new \_ContaoManager\Contao\ManagerApi\Task\Composer\DumpAutoloadTask($container->privates['_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory'] ?? $container->load('getConsoleProcessFactoryService'), $container->services['_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator'] ?? $container->load('getTranslatorService')); $instance->setLogger($container->privates['monolog.logger.tasks'] ?? $container->load('getMonolog_Logger_TasksService')); return $instance; } } privates['.console.command.container_lint.lazy'] = new \_ContaoManager\Symfony\Component\Console\Command\LazyCommand('lint:container', [], 'Ensure that arguments injected into services match type declarations', \false, #[\Closure(name: 'console.command.container_lint', class: '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand')] fn(): \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ContainerLintCommand => $container->privates['console.command.container_lint'] ?? $container->load('getConsole_Command_ContainerLintService')); } } privates['console.command.config_debug'] = $instance = new \_ContaoManager\Symfony\Bundle\FrameworkBundle\Command\ConfigDebugCommand(); $instance->setName('debug:config'); $instance->setDescription('Dump the current configuration for an extension'); return $instance; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default '%kernel.debug%' * @param ParamConfigurator|bool $value * @return $this */ public function debug($value) : static { $this->_usedProperties['debug'] = \true; $this->debug = $value; return $this; } /** * @default null * @param ParamConfigurator|'none'|'short'|'full' $value * @return $this */ public function traceLevel($value) : static { $this->_usedProperties['traceLevel'] = \true; $this->traceLevel = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function traceHeader($value) : static { $this->_usedProperties['traceHeader'] = \true; $this->traceHeader = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function defaultTtl($value) : static { $this->_usedProperties['defaultTtl'] = \true; $this->defaultTtl = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function privateHeaders(ParamConfigurator|array $value) : static { $this->_usedProperties['privateHeaders'] = \true; $this->privateHeaders = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function skipResponseHeaders(ParamConfigurator|array $value) : static { $this->_usedProperties['skipResponseHeaders'] = \true; $this->skipResponseHeaders = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function allowReload($value) : static { $this->_usedProperties['allowReload'] = \true; $this->allowReload = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function allowRevalidate($value) : static { $this->_usedProperties['allowRevalidate'] = \true; $this->allowRevalidate = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function staleWhileRevalidate($value) : static { $this->_usedProperties['staleWhileRevalidate'] = \true; $this->staleWhileRevalidate = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function staleIfError($value) : static { $this->_usedProperties['staleIfError'] = \true; $this->staleIfError = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function terminateOnCacheHit($value) : static { $this->_usedProperties['terminateOnCacheHit'] = \true; $this->terminateOnCacheHit = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('debug', $value)) { $this->_usedProperties['debug'] = \true; $this->debug = $value['debug']; unset($value['debug']); } if (\array_key_exists('trace_level', $value)) { $this->_usedProperties['traceLevel'] = \true; $this->traceLevel = $value['trace_level']; unset($value['trace_level']); } if (\array_key_exists('trace_header', $value)) { $this->_usedProperties['traceHeader'] = \true; $this->traceHeader = $value['trace_header']; unset($value['trace_header']); } if (\array_key_exists('default_ttl', $value)) { $this->_usedProperties['defaultTtl'] = \true; $this->defaultTtl = $value['default_ttl']; unset($value['default_ttl']); } if (\array_key_exists('private_headers', $value)) { $this->_usedProperties['privateHeaders'] = \true; $this->privateHeaders = $value['private_headers']; unset($value['private_headers']); } if (\array_key_exists('skip_response_headers', $value)) { $this->_usedProperties['skipResponseHeaders'] = \true; $this->skipResponseHeaders = $value['skip_response_headers']; unset($value['skip_response_headers']); } if (\array_key_exists('allow_reload', $value)) { $this->_usedProperties['allowReload'] = \true; $this->allowReload = $value['allow_reload']; unset($value['allow_reload']); } if (\array_key_exists('allow_revalidate', $value)) { $this->_usedProperties['allowRevalidate'] = \true; $this->allowRevalidate = $value['allow_revalidate']; unset($value['allow_revalidate']); } if (\array_key_exists('stale_while_revalidate', $value)) { $this->_usedProperties['staleWhileRevalidate'] = \true; $this->staleWhileRevalidate = $value['stale_while_revalidate']; unset($value['stale_while_revalidate']); } if (\array_key_exists('stale_if_error', $value)) { $this->_usedProperties['staleIfError'] = \true; $this->staleIfError = $value['stale_if_error']; unset($value['stale_if_error']); } if (\array_key_exists('terminate_on_cache_hit', $value)) { $this->_usedProperties['terminateOnCacheHit'] = \true; $this->terminateOnCacheHit = $value['terminate_on_cache_hit']; unset($value['terminate_on_cache_hit']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['debug'])) { $output['debug'] = $this->debug; } if (isset($this->_usedProperties['traceLevel'])) { $output['trace_level'] = $this->traceLevel; } if (isset($this->_usedProperties['traceHeader'])) { $output['trace_header'] = $this->traceHeader; } if (isset($this->_usedProperties['defaultTtl'])) { $output['default_ttl'] = $this->defaultTtl; } if (isset($this->_usedProperties['privateHeaders'])) { $output['private_headers'] = $this->privateHeaders; } if (isset($this->_usedProperties['skipResponseHeaders'])) { $output['skip_response_headers'] = $this->skipResponseHeaders; } if (isset($this->_usedProperties['allowReload'])) { $output['allow_reload'] = $this->allowReload; } if (isset($this->_usedProperties['allowRevalidate'])) { $output['allow_revalidate'] = $this->allowRevalidate; } if (isset($this->_usedProperties['staleWhileRevalidate'])) { $output['stale_while_revalidate'] = $this->staleWhileRevalidate; } if (isset($this->_usedProperties['staleIfError'])) { $output['stale_if_error'] = $this->staleIfError; } if (isset($this->_usedProperties['terminateOnCacheHit'])) { $output['terminate_on_cache_hit'] = $this->terminateOnCacheHit; } return $output; } } _usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function secret($value) : static { $this->_usedProperties['secret'] = \true; $this->secret = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('secret', $value)) { $this->_usedProperties['secret'] = \true; $this->secret = $value['secret']; unset($value['secret']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['secret'])) { $output['secret'] = $this->secret; } return $output; } } _usedProperties['prefixSeed'] = \true; $this->prefixSeed = $value; return $this; } /** * App related cache pools configuration * @default 'cache.adapter.filesystem' * @param ParamConfigurator|mixed $value * @return $this */ public function app($value) : static { $this->_usedProperties['app'] = \true; $this->app = $value; return $this; } /** * System related cache pools configuration * @default 'cache.adapter.system' * @param ParamConfigurator|mixed $value * @return $this */ public function system($value) : static { $this->_usedProperties['system'] = \true; $this->system = $value; return $this; } /** * @default '%kernel.cache_dir%/pools/app' * @param ParamConfigurator|mixed $value * @return $this */ public function directory($value) : static { $this->_usedProperties['directory'] = \true; $this->directory = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function defaultPsr6Provider($value) : static { $this->_usedProperties['defaultPsr6Provider'] = \true; $this->defaultPsr6Provider = $value; return $this; } /** * @default 'redis://localhost' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultRedisProvider($value) : static { $this->_usedProperties['defaultRedisProvider'] = \true; $this->defaultRedisProvider = $value; return $this; } /** * @default 'memcached://localhost' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultMemcachedProvider($value) : static { $this->_usedProperties['defaultMemcachedProvider'] = \true; $this->defaultMemcachedProvider = $value; return $this; } /** * @default 'database_connection' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultDoctrineDbalProvider($value) : static { $this->_usedProperties['defaultDoctrineDbalProvider'] = \true; $this->defaultDoctrineDbalProvider = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function defaultPdoProvider($value) : static { $this->_usedProperties['defaultPdoProvider'] = \true; $this->defaultPdoProvider = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Cache\PoolConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Cache\PoolConfig : static) */ public function pool(string $name, mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Cache\PoolConfig|static { if (!\is_array($value)) { $this->_usedProperties['pools'] = \true; $this->pools[$name] = $value; return $this; } if (!isset($this->pools[$name]) || !$this->pools[$name] instanceof \_ContaoManager\Symfony\Config\Framework\Cache\PoolConfig) { $this->_usedProperties['pools'] = \true; $this->pools[$name] = new \_ContaoManager\Symfony\Config\Framework\Cache\PoolConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "pool()" has already been initialized. You cannot pass values the second time you call pool().'); } return $this->pools[$name]; } public function __construct(array $value = []) { if (\array_key_exists('prefix_seed', $value)) { $this->_usedProperties['prefixSeed'] = \true; $this->prefixSeed = $value['prefix_seed']; unset($value['prefix_seed']); } if (\array_key_exists('app', $value)) { $this->_usedProperties['app'] = \true; $this->app = $value['app']; unset($value['app']); } if (\array_key_exists('system', $value)) { $this->_usedProperties['system'] = \true; $this->system = $value['system']; unset($value['system']); } if (\array_key_exists('directory', $value)) { $this->_usedProperties['directory'] = \true; $this->directory = $value['directory']; unset($value['directory']); } if (\array_key_exists('default_psr6_provider', $value)) { $this->_usedProperties['defaultPsr6Provider'] = \true; $this->defaultPsr6Provider = $value['default_psr6_provider']; unset($value['default_psr6_provider']); } if (\array_key_exists('default_redis_provider', $value)) { $this->_usedProperties['defaultRedisProvider'] = \true; $this->defaultRedisProvider = $value['default_redis_provider']; unset($value['default_redis_provider']); } if (\array_key_exists('default_memcached_provider', $value)) { $this->_usedProperties['defaultMemcachedProvider'] = \true; $this->defaultMemcachedProvider = $value['default_memcached_provider']; unset($value['default_memcached_provider']); } if (\array_key_exists('default_doctrine_dbal_provider', $value)) { $this->_usedProperties['defaultDoctrineDbalProvider'] = \true; $this->defaultDoctrineDbalProvider = $value['default_doctrine_dbal_provider']; unset($value['default_doctrine_dbal_provider']); } if (\array_key_exists('default_pdo_provider', $value)) { $this->_usedProperties['defaultPdoProvider'] = \true; $this->defaultPdoProvider = $value['default_pdo_provider']; unset($value['default_pdo_provider']); } if (\array_key_exists('pools', $value)) { $this->_usedProperties['pools'] = \true; $this->pools = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Cache\PoolConfig($v) : $v, $value['pools']); unset($value['pools']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['prefixSeed'])) { $output['prefix_seed'] = $this->prefixSeed; } if (isset($this->_usedProperties['app'])) { $output['app'] = $this->app; } if (isset($this->_usedProperties['system'])) { $output['system'] = $this->system; } if (isset($this->_usedProperties['directory'])) { $output['directory'] = $this->directory; } if (isset($this->_usedProperties['defaultPsr6Provider'])) { $output['default_psr6_provider'] = $this->defaultPsr6Provider; } if (isset($this->_usedProperties['defaultRedisProvider'])) { $output['default_redis_provider'] = $this->defaultRedisProvider; } if (isset($this->_usedProperties['defaultMemcachedProvider'])) { $output['default_memcached_provider'] = $this->defaultMemcachedProvider; } if (isset($this->_usedProperties['defaultDoctrineDbalProvider'])) { $output['default_doctrine_dbal_provider'] = $this->defaultDoctrineDbalProvider; } if (isset($this->_usedProperties['defaultPdoProvider'])) { $output['default_pdo_provider'] = $this->defaultPdoProvider; } if (isset($this->_usedProperties['pools'])) { $output['pools'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Cache\PoolConfig ? $v->toArray() : $v, $this->pools); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function hincludeDefaultTemplate($value) : static { $this->_usedProperties['hincludeDefaultTemplate'] = \true; $this->hincludeDefaultTemplate = $value; return $this; } /** * @default '/_fragment' * @param ParamConfigurator|mixed $value * @return $this */ public function path($value) : static { $this->_usedProperties['path'] = \true; $this->path = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('hinclude_default_template', $value)) { $this->_usedProperties['hincludeDefaultTemplate'] = \true; $this->hincludeDefaultTemplate = $value['hinclude_default_template']; unset($value['hinclude_default_template']); } if (\array_key_exists('path', $value)) { $this->_usedProperties['path'] = \true; $this->path = $value['path']; unset($value['path']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['hincludeDefaultTemplate'])) { $output['hinclude_default_template'] = $this->hincludeDefaultTemplate; } if (isset($this->_usedProperties['path'])) { $output['path'] = $this->path; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default '_token' * @param ParamConfigurator|mixed $value * @return $this */ public function fieldName($value) : static { $this->_usedProperties['fieldName'] = \true; $this->fieldName = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('field_name', $value)) { $this->_usedProperties['fieldName'] = \true; $this->fieldName = $value['field_name']; unset($value['field_name']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['fieldName'])) { $output['field_name'] = $this->fieldName; } return $output; } } _usedProperties['headers'] = \true; $this->headers[$name] = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function vars(ParamConfigurator|array $value) : static { $this->_usedProperties['vars'] = \true; $this->vars = $value; return $this; } /** * The maximum number of redirects to follow. * @default null * @param ParamConfigurator|int $value * @return $this */ public function maxRedirects($value) : static { $this->_usedProperties['maxRedirects'] = \true; $this->maxRedirects = $value; return $this; } /** * The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function httpVersion($value) : static { $this->_usedProperties['httpVersion'] = \true; $this->httpVersion = $value; return $this; } /** * @return $this */ public function resolve(string $host, mixed $value) : static { $this->_usedProperties['resolve'] = \true; $this->resolve[$host] = $value; return $this; } /** * The URL of the proxy to pass requests through or null for automatic detection. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function proxy($value) : static { $this->_usedProperties['proxy'] = \true; $this->proxy = $value; return $this; } /** * A comma separated list of hosts that do not require a proxy to be reached. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function noProxy($value) : static { $this->_usedProperties['noProxy'] = \true; $this->noProxy = $value; return $this; } /** * The idle timeout, defaults to the "default_socket_timeout" ini parameter. * @default null * @param ParamConfigurator|float $value * @return $this */ public function timeout($value) : static { $this->_usedProperties['timeout'] = \true; $this->timeout = $value; return $this; } /** * The maximum execution time for the request+response as a whole. * @default null * @param ParamConfigurator|float $value * @return $this */ public function maxDuration($value) : static { $this->_usedProperties['maxDuration'] = \true; $this->maxDuration = $value; return $this; } /** * A network interface name, IP address, a host name or a UNIX socket to bind to. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function bindto($value) : static { $this->_usedProperties['bindto'] = \true; $this->bindto = $value; return $this; } /** * Indicates if the peer should be verified in a TLS context. * @default null * @param ParamConfigurator|bool $value * @return $this */ public function verifyPeer($value) : static { $this->_usedProperties['verifyPeer'] = \true; $this->verifyPeer = $value; return $this; } /** * Indicates if the host should exist as a certificate common name. * @default null * @param ParamConfigurator|bool $value * @return $this */ public function verifyHost($value) : static { $this->_usedProperties['verifyHost'] = \true; $this->verifyHost = $value; return $this; } /** * A certificate authority file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cafile($value) : static { $this->_usedProperties['cafile'] = \true; $this->cafile = $value; return $this; } /** * A directory that contains multiple certificate authority files. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function capath($value) : static { $this->_usedProperties['capath'] = \true; $this->capath = $value; return $this; } /** * A PEM formatted certificate file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function localCert($value) : static { $this->_usedProperties['localCert'] = \true; $this->localCert = $value; return $this; } /** * A private key file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function localPk($value) : static { $this->_usedProperties['localPk'] = \true; $this->localPk = $value; return $this; } /** * The passphrase used to encrypt the "local_pk" file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function passphrase($value) : static { $this->_usedProperties['passphrase'] = \true; $this->passphrase = $value; return $this; } /** * A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function ciphers($value) : static { $this->_usedProperties['ciphers'] = \true; $this->ciphers = $value; return $this; } /** * Associative array: hashing algorithm => hash(es). */ public function peerFingerprint(array $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\PeerFingerprintConfig { if (null === $this->peerFingerprint) { $this->_usedProperties['peerFingerprint'] = \true; $this->peerFingerprint = new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\PeerFingerprintConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "peerFingerprint()" has already been initialized. You cannot pass values the second time you call peerFingerprint().'); } return $this->peerFingerprint; } /** * The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cryptoMethod($value) : static { $this->_usedProperties['cryptoMethod'] = \true; $this->cryptoMethod = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function extra(ParamConfigurator|array $value) : static { $this->_usedProperties['extra'] = \true; $this->extra = $value; return $this; } /** * @template TValue * @param TValue $value * @default {"enabled":false,"retry_strategy":null,"http_codes":[],"max_retries":3,"delay":1000,"multiplier":2,"max_delay":0,"jitter":0.1} * @return \Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig : static) */ public function retryFailed(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig|static { if (!\is_array($value)) { $this->_usedProperties['retryFailed'] = \true; $this->retryFailed = $value; return $this; } if (!$this->retryFailed instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig) { $this->_usedProperties['retryFailed'] = \true; $this->retryFailed = new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "retryFailed()" has already been initialized. You cannot pass values the second time you call retryFailed().'); } return $this->retryFailed; } public function __construct(array $value = []) { if (\array_key_exists('headers', $value)) { $this->_usedProperties['headers'] = \true; $this->headers = $value['headers']; unset($value['headers']); } if (\array_key_exists('vars', $value)) { $this->_usedProperties['vars'] = \true; $this->vars = $value['vars']; unset($value['vars']); } if (\array_key_exists('max_redirects', $value)) { $this->_usedProperties['maxRedirects'] = \true; $this->maxRedirects = $value['max_redirects']; unset($value['max_redirects']); } if (\array_key_exists('http_version', $value)) { $this->_usedProperties['httpVersion'] = \true; $this->httpVersion = $value['http_version']; unset($value['http_version']); } if (\array_key_exists('resolve', $value)) { $this->_usedProperties['resolve'] = \true; $this->resolve = $value['resolve']; unset($value['resolve']); } if (\array_key_exists('proxy', $value)) { $this->_usedProperties['proxy'] = \true; $this->proxy = $value['proxy']; unset($value['proxy']); } if (\array_key_exists('no_proxy', $value)) { $this->_usedProperties['noProxy'] = \true; $this->noProxy = $value['no_proxy']; unset($value['no_proxy']); } if (\array_key_exists('timeout', $value)) { $this->_usedProperties['timeout'] = \true; $this->timeout = $value['timeout']; unset($value['timeout']); } if (\array_key_exists('max_duration', $value)) { $this->_usedProperties['maxDuration'] = \true; $this->maxDuration = $value['max_duration']; unset($value['max_duration']); } if (\array_key_exists('bindto', $value)) { $this->_usedProperties['bindto'] = \true; $this->bindto = $value['bindto']; unset($value['bindto']); } if (\array_key_exists('verify_peer', $value)) { $this->_usedProperties['verifyPeer'] = \true; $this->verifyPeer = $value['verify_peer']; unset($value['verify_peer']); } if (\array_key_exists('verify_host', $value)) { $this->_usedProperties['verifyHost'] = \true; $this->verifyHost = $value['verify_host']; unset($value['verify_host']); } if (\array_key_exists('cafile', $value)) { $this->_usedProperties['cafile'] = \true; $this->cafile = $value['cafile']; unset($value['cafile']); } if (\array_key_exists('capath', $value)) { $this->_usedProperties['capath'] = \true; $this->capath = $value['capath']; unset($value['capath']); } if (\array_key_exists('local_cert', $value)) { $this->_usedProperties['localCert'] = \true; $this->localCert = $value['local_cert']; unset($value['local_cert']); } if (\array_key_exists('local_pk', $value)) { $this->_usedProperties['localPk'] = \true; $this->localPk = $value['local_pk']; unset($value['local_pk']); } if (\array_key_exists('passphrase', $value)) { $this->_usedProperties['passphrase'] = \true; $this->passphrase = $value['passphrase']; unset($value['passphrase']); } if (\array_key_exists('ciphers', $value)) { $this->_usedProperties['ciphers'] = \true; $this->ciphers = $value['ciphers']; unset($value['ciphers']); } if (\array_key_exists('peer_fingerprint', $value)) { $this->_usedProperties['peerFingerprint'] = \true; $this->peerFingerprint = new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\PeerFingerprintConfig($value['peer_fingerprint']); unset($value['peer_fingerprint']); } if (\array_key_exists('crypto_method', $value)) { $this->_usedProperties['cryptoMethod'] = \true; $this->cryptoMethod = $value['crypto_method']; unset($value['crypto_method']); } if (\array_key_exists('extra', $value)) { $this->_usedProperties['extra'] = \true; $this->extra = $value['extra']; unset($value['extra']); } if (\array_key_exists('retry_failed', $value)) { $this->_usedProperties['retryFailed'] = \true; $this->retryFailed = \is_array($value['retry_failed']) ? new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig($value['retry_failed']) : $value['retry_failed']; unset($value['retry_failed']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['headers'])) { $output['headers'] = $this->headers; } if (isset($this->_usedProperties['vars'])) { $output['vars'] = $this->vars; } if (isset($this->_usedProperties['maxRedirects'])) { $output['max_redirects'] = $this->maxRedirects; } if (isset($this->_usedProperties['httpVersion'])) { $output['http_version'] = $this->httpVersion; } if (isset($this->_usedProperties['resolve'])) { $output['resolve'] = $this->resolve; } if (isset($this->_usedProperties['proxy'])) { $output['proxy'] = $this->proxy; } if (isset($this->_usedProperties['noProxy'])) { $output['no_proxy'] = $this->noProxy; } if (isset($this->_usedProperties['timeout'])) { $output['timeout'] = $this->timeout; } if (isset($this->_usedProperties['maxDuration'])) { $output['max_duration'] = $this->maxDuration; } if (isset($this->_usedProperties['bindto'])) { $output['bindto'] = $this->bindto; } if (isset($this->_usedProperties['verifyPeer'])) { $output['verify_peer'] = $this->verifyPeer; } if (isset($this->_usedProperties['verifyHost'])) { $output['verify_host'] = $this->verifyHost; } if (isset($this->_usedProperties['cafile'])) { $output['cafile'] = $this->cafile; } if (isset($this->_usedProperties['capath'])) { $output['capath'] = $this->capath; } if (isset($this->_usedProperties['localCert'])) { $output['local_cert'] = $this->localCert; } if (isset($this->_usedProperties['localPk'])) { $output['local_pk'] = $this->localPk; } if (isset($this->_usedProperties['passphrase'])) { $output['passphrase'] = $this->passphrase; } if (isset($this->_usedProperties['ciphers'])) { $output['ciphers'] = $this->ciphers; } if (isset($this->_usedProperties['peerFingerprint'])) { $output['peer_fingerprint'] = $this->peerFingerprint->toArray(); } if (isset($this->_usedProperties['cryptoMethod'])) { $output['crypto_method'] = $this->cryptoMethod; } if (isset($this->_usedProperties['extra'])) { $output['extra'] = $this->extra; } if (isset($this->_usedProperties['retryFailed'])) { $output['retry_failed'] = $this->retryFailed instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailedConfig ? $this->retryFailed->toArray() : $this->retryFailed; } return $output; } } _usedProperties['code'] = \true; $this->code = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function methods(ParamConfigurator|array $value) : static { $this->_usedProperties['methods'] = \true; $this->methods = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('code', $value)) { $this->_usedProperties['code'] = \true; $this->code = $value['code']; unset($value['code']); } if (\array_key_exists('methods', $value)) { $this->_usedProperties['methods'] = \true; $this->methods = $value['methods']; unset($value['methods']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['code'])) { $output['code'] = $this->code; } if (isset($this->_usedProperties['methods'])) { $output['methods'] = $this->methods; } return $output; } } _usedProperties['sha1'] = \true; $this->sha1 = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function pinsha256(mixed $value) : static { $this->_usedProperties['pinsha256'] = \true; $this->pinsha256 = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function md5(mixed $value) : static { $this->_usedProperties['md5'] = \true; $this->md5 = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('sha1', $value)) { $this->_usedProperties['sha1'] = \true; $this->sha1 = $value['sha1']; unset($value['sha1']); } if (\array_key_exists('pin-sha256', $value)) { $this->_usedProperties['pinsha256'] = \true; $this->pinsha256 = $value['pin-sha256']; unset($value['pin-sha256']); } if (\array_key_exists('md5', $value)) { $this->_usedProperties['md5'] = \true; $this->md5 = $value['md5']; unset($value['md5']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['sha1'])) { $output['sha1'] = $this->sha1; } if (isset($this->_usedProperties['pinsha256'])) { $output['pin-sha256'] = $this->pinsha256; } if (isset($this->_usedProperties['md5'])) { $output['md5'] = $this->md5; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * service id to override the retry strategy * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function retryStrategy($value) : static { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = $value; return $this; } /** * @template TValue * @param TValue $value * A list of HTTP status code that triggers a retry * @return \Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig : static) */ public function httpCode(string $code, array $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig|static { if (!\is_array($value)) { $this->_usedProperties['httpCodes'] = \true; $this->httpCodes[$code] = $value; return $this; } if (!isset($this->httpCodes[$code]) || !$this->httpCodes[$code] instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig) { $this->_usedProperties['httpCodes'] = \true; $this->httpCodes[$code] = new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "httpCode()" has already been initialized. You cannot pass values the second time you call httpCode().'); } return $this->httpCodes[$code]; } /** * @default 3 * @param ParamConfigurator|int $value * @return $this */ public function maxRetries($value) : static { $this->_usedProperties['maxRetries'] = \true; $this->maxRetries = $value; return $this; } /** * Time in ms to delay (or the initial value when multiplier is used) * @default 1000 * @param ParamConfigurator|int $value * @return $this */ public function delay($value) : static { $this->_usedProperties['delay'] = \true; $this->delay = $value; return $this; } /** * If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries) * @default 2 * @param ParamConfigurator|float $value * @return $this */ public function multiplier($value) : static { $this->_usedProperties['multiplier'] = \true; $this->multiplier = $value; return $this; } /** * Max time in ms that a retry should ever be delayed (0 = infinite) * @default 0 * @param ParamConfigurator|int $value * @return $this */ public function maxDelay($value) : static { $this->_usedProperties['maxDelay'] = \true; $this->maxDelay = $value; return $this; } /** * Randomness in percent (between 0 and 1) to apply to the delay * @default 0.1 * @param ParamConfigurator|float $value * @return $this */ public function jitter($value) : static { $this->_usedProperties['jitter'] = \true; $this->jitter = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('retry_strategy', $value)) { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = $value['retry_strategy']; unset($value['retry_strategy']); } if (\array_key_exists('http_codes', $value)) { $this->_usedProperties['httpCodes'] = \true; $this->httpCodes = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig($v) : $v, $value['http_codes']); unset($value['http_codes']); } if (\array_key_exists('max_retries', $value)) { $this->_usedProperties['maxRetries'] = \true; $this->maxRetries = $value['max_retries']; unset($value['max_retries']); } if (\array_key_exists('delay', $value)) { $this->_usedProperties['delay'] = \true; $this->delay = $value['delay']; unset($value['delay']); } if (\array_key_exists('multiplier', $value)) { $this->_usedProperties['multiplier'] = \true; $this->multiplier = $value['multiplier']; unset($value['multiplier']); } if (\array_key_exists('max_delay', $value)) { $this->_usedProperties['maxDelay'] = \true; $this->maxDelay = $value['max_delay']; unset($value['max_delay']); } if (\array_key_exists('jitter', $value)) { $this->_usedProperties['jitter'] = \true; $this->jitter = $value['jitter']; unset($value['jitter']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['retryStrategy'])) { $output['retry_strategy'] = $this->retryStrategy; } if (isset($this->_usedProperties['httpCodes'])) { $output['http_codes'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailed\HttpCodeConfig ? $v->toArray() : $v, $this->httpCodes); } if (isset($this->_usedProperties['maxRetries'])) { $output['max_retries'] = $this->maxRetries; } if (isset($this->_usedProperties['delay'])) { $output['delay'] = $this->delay; } if (isset($this->_usedProperties['multiplier'])) { $output['multiplier'] = $this->multiplier; } if (isset($this->_usedProperties['maxDelay'])) { $output['max_delay'] = $this->maxDelay; } if (isset($this->_usedProperties['jitter'])) { $output['jitter'] = $this->jitter; } return $output; } } _usedProperties['scope'] = \true; $this->scope = $value; return $this; } /** * The URI to resolve relative URLs, following rules in RFC 3985, section 2. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function baseUri($value) : static { $this->_usedProperties['baseUri'] = \true; $this->baseUri = $value; return $this; } /** * An HTTP Basic authentication "username:password". * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function authBasic($value) : static { $this->_usedProperties['authBasic'] = \true; $this->authBasic = $value; return $this; } /** * A token enabling HTTP Bearer authorization. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function authBearer($value) : static { $this->_usedProperties['authBearer'] = \true; $this->authBearer = $value; return $this; } /** * A "username:password" pair to use Microsoft NTLM authentication (requires the cURL extension). * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function authNtlm($value) : static { $this->_usedProperties['authNtlm'] = \true; $this->authNtlm = $value; return $this; } /** * @return $this */ public function query(string $key, mixed $value) : static { $this->_usedProperties['query'] = \true; $this->query[$key] = $value; return $this; } /** * @return $this */ public function header(string $name, mixed $value) : static { $this->_usedProperties['headers'] = \true; $this->headers[$name] = $value; return $this; } /** * The maximum number of redirects to follow. * @default null * @param ParamConfigurator|int $value * @return $this */ public function maxRedirects($value) : static { $this->_usedProperties['maxRedirects'] = \true; $this->maxRedirects = $value; return $this; } /** * The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function httpVersion($value) : static { $this->_usedProperties['httpVersion'] = \true; $this->httpVersion = $value; return $this; } /** * @return $this */ public function resolve(string $host, mixed $value) : static { $this->_usedProperties['resolve'] = \true; $this->resolve[$host] = $value; return $this; } /** * The URL of the proxy to pass requests through or null for automatic detection. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function proxy($value) : static { $this->_usedProperties['proxy'] = \true; $this->proxy = $value; return $this; } /** * A comma separated list of hosts that do not require a proxy to be reached. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function noProxy($value) : static { $this->_usedProperties['noProxy'] = \true; $this->noProxy = $value; return $this; } /** * The idle timeout, defaults to the "default_socket_timeout" ini parameter. * @default null * @param ParamConfigurator|float $value * @return $this */ public function timeout($value) : static { $this->_usedProperties['timeout'] = \true; $this->timeout = $value; return $this; } /** * The maximum execution time for the request+response as a whole. * @default null * @param ParamConfigurator|float $value * @return $this */ public function maxDuration($value) : static { $this->_usedProperties['maxDuration'] = \true; $this->maxDuration = $value; return $this; } /** * A network interface name, IP address, a host name or a UNIX socket to bind to. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function bindto($value) : static { $this->_usedProperties['bindto'] = \true; $this->bindto = $value; return $this; } /** * Indicates if the peer should be verified in a TLS context. * @default null * @param ParamConfigurator|bool $value * @return $this */ public function verifyPeer($value) : static { $this->_usedProperties['verifyPeer'] = \true; $this->verifyPeer = $value; return $this; } /** * Indicates if the host should exist as a certificate common name. * @default null * @param ParamConfigurator|bool $value * @return $this */ public function verifyHost($value) : static { $this->_usedProperties['verifyHost'] = \true; $this->verifyHost = $value; return $this; } /** * A certificate authority file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cafile($value) : static { $this->_usedProperties['cafile'] = \true; $this->cafile = $value; return $this; } /** * A directory that contains multiple certificate authority files. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function capath($value) : static { $this->_usedProperties['capath'] = \true; $this->capath = $value; return $this; } /** * A PEM formatted certificate file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function localCert($value) : static { $this->_usedProperties['localCert'] = \true; $this->localCert = $value; return $this; } /** * A private key file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function localPk($value) : static { $this->_usedProperties['localPk'] = \true; $this->localPk = $value; return $this; } /** * The passphrase used to encrypt the "local_pk" file. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function passphrase($value) : static { $this->_usedProperties['passphrase'] = \true; $this->passphrase = $value; return $this; } /** * A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function ciphers($value) : static { $this->_usedProperties['ciphers'] = \true; $this->ciphers = $value; return $this; } /** * Associative array: hashing algorithm => hash(es). */ public function peerFingerprint(array $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\PeerFingerprintConfig { if (null === $this->peerFingerprint) { $this->_usedProperties['peerFingerprint'] = \true; $this->peerFingerprint = new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\PeerFingerprintConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "peerFingerprint()" has already been initialized. You cannot pass values the second time you call peerFingerprint().'); } return $this->peerFingerprint; } /** * The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cryptoMethod($value) : static { $this->_usedProperties['cryptoMethod'] = \true; $this->cryptoMethod = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function extra(ParamConfigurator|array $value) : static { $this->_usedProperties['extra'] = \true; $this->extra = $value; return $this; } /** * @template TValue * @param TValue $value * @default {"enabled":false,"retry_strategy":null,"http_codes":[],"max_retries":3,"delay":1000,"multiplier":2,"max_delay":0,"jitter":0.1} * @return \Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig : static) */ public function retryFailed(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig|static { if (!\is_array($value)) { $this->_usedProperties['retryFailed'] = \true; $this->retryFailed = $value; return $this; } if (!$this->retryFailed instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig) { $this->_usedProperties['retryFailed'] = \true; $this->retryFailed = new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "retryFailed()" has already been initialized. You cannot pass values the second time you call retryFailed().'); } return $this->retryFailed; } public function __construct(array $value = []) { if (\array_key_exists('scope', $value)) { $this->_usedProperties['scope'] = \true; $this->scope = $value['scope']; unset($value['scope']); } if (\array_key_exists('base_uri', $value)) { $this->_usedProperties['baseUri'] = \true; $this->baseUri = $value['base_uri']; unset($value['base_uri']); } if (\array_key_exists('auth_basic', $value)) { $this->_usedProperties['authBasic'] = \true; $this->authBasic = $value['auth_basic']; unset($value['auth_basic']); } if (\array_key_exists('auth_bearer', $value)) { $this->_usedProperties['authBearer'] = \true; $this->authBearer = $value['auth_bearer']; unset($value['auth_bearer']); } if (\array_key_exists('auth_ntlm', $value)) { $this->_usedProperties['authNtlm'] = \true; $this->authNtlm = $value['auth_ntlm']; unset($value['auth_ntlm']); } if (\array_key_exists('query', $value)) { $this->_usedProperties['query'] = \true; $this->query = $value['query']; unset($value['query']); } if (\array_key_exists('headers', $value)) { $this->_usedProperties['headers'] = \true; $this->headers = $value['headers']; unset($value['headers']); } if (\array_key_exists('max_redirects', $value)) { $this->_usedProperties['maxRedirects'] = \true; $this->maxRedirects = $value['max_redirects']; unset($value['max_redirects']); } if (\array_key_exists('http_version', $value)) { $this->_usedProperties['httpVersion'] = \true; $this->httpVersion = $value['http_version']; unset($value['http_version']); } if (\array_key_exists('resolve', $value)) { $this->_usedProperties['resolve'] = \true; $this->resolve = $value['resolve']; unset($value['resolve']); } if (\array_key_exists('proxy', $value)) { $this->_usedProperties['proxy'] = \true; $this->proxy = $value['proxy']; unset($value['proxy']); } if (\array_key_exists('no_proxy', $value)) { $this->_usedProperties['noProxy'] = \true; $this->noProxy = $value['no_proxy']; unset($value['no_proxy']); } if (\array_key_exists('timeout', $value)) { $this->_usedProperties['timeout'] = \true; $this->timeout = $value['timeout']; unset($value['timeout']); } if (\array_key_exists('max_duration', $value)) { $this->_usedProperties['maxDuration'] = \true; $this->maxDuration = $value['max_duration']; unset($value['max_duration']); } if (\array_key_exists('bindto', $value)) { $this->_usedProperties['bindto'] = \true; $this->bindto = $value['bindto']; unset($value['bindto']); } if (\array_key_exists('verify_peer', $value)) { $this->_usedProperties['verifyPeer'] = \true; $this->verifyPeer = $value['verify_peer']; unset($value['verify_peer']); } if (\array_key_exists('verify_host', $value)) { $this->_usedProperties['verifyHost'] = \true; $this->verifyHost = $value['verify_host']; unset($value['verify_host']); } if (\array_key_exists('cafile', $value)) { $this->_usedProperties['cafile'] = \true; $this->cafile = $value['cafile']; unset($value['cafile']); } if (\array_key_exists('capath', $value)) { $this->_usedProperties['capath'] = \true; $this->capath = $value['capath']; unset($value['capath']); } if (\array_key_exists('local_cert', $value)) { $this->_usedProperties['localCert'] = \true; $this->localCert = $value['local_cert']; unset($value['local_cert']); } if (\array_key_exists('local_pk', $value)) { $this->_usedProperties['localPk'] = \true; $this->localPk = $value['local_pk']; unset($value['local_pk']); } if (\array_key_exists('passphrase', $value)) { $this->_usedProperties['passphrase'] = \true; $this->passphrase = $value['passphrase']; unset($value['passphrase']); } if (\array_key_exists('ciphers', $value)) { $this->_usedProperties['ciphers'] = \true; $this->ciphers = $value['ciphers']; unset($value['ciphers']); } if (\array_key_exists('peer_fingerprint', $value)) { $this->_usedProperties['peerFingerprint'] = \true; $this->peerFingerprint = new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\PeerFingerprintConfig($value['peer_fingerprint']); unset($value['peer_fingerprint']); } if (\array_key_exists('crypto_method', $value)) { $this->_usedProperties['cryptoMethod'] = \true; $this->cryptoMethod = $value['crypto_method']; unset($value['crypto_method']); } if (\array_key_exists('extra', $value)) { $this->_usedProperties['extra'] = \true; $this->extra = $value['extra']; unset($value['extra']); } if (\array_key_exists('retry_failed', $value)) { $this->_usedProperties['retryFailed'] = \true; $this->retryFailed = \is_array($value['retry_failed']) ? new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig($value['retry_failed']) : $value['retry_failed']; unset($value['retry_failed']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['scope'])) { $output['scope'] = $this->scope; } if (isset($this->_usedProperties['baseUri'])) { $output['base_uri'] = $this->baseUri; } if (isset($this->_usedProperties['authBasic'])) { $output['auth_basic'] = $this->authBasic; } if (isset($this->_usedProperties['authBearer'])) { $output['auth_bearer'] = $this->authBearer; } if (isset($this->_usedProperties['authNtlm'])) { $output['auth_ntlm'] = $this->authNtlm; } if (isset($this->_usedProperties['query'])) { $output['query'] = $this->query; } if (isset($this->_usedProperties['headers'])) { $output['headers'] = $this->headers; } if (isset($this->_usedProperties['maxRedirects'])) { $output['max_redirects'] = $this->maxRedirects; } if (isset($this->_usedProperties['httpVersion'])) { $output['http_version'] = $this->httpVersion; } if (isset($this->_usedProperties['resolve'])) { $output['resolve'] = $this->resolve; } if (isset($this->_usedProperties['proxy'])) { $output['proxy'] = $this->proxy; } if (isset($this->_usedProperties['noProxy'])) { $output['no_proxy'] = $this->noProxy; } if (isset($this->_usedProperties['timeout'])) { $output['timeout'] = $this->timeout; } if (isset($this->_usedProperties['maxDuration'])) { $output['max_duration'] = $this->maxDuration; } if (isset($this->_usedProperties['bindto'])) { $output['bindto'] = $this->bindto; } if (isset($this->_usedProperties['verifyPeer'])) { $output['verify_peer'] = $this->verifyPeer; } if (isset($this->_usedProperties['verifyHost'])) { $output['verify_host'] = $this->verifyHost; } if (isset($this->_usedProperties['cafile'])) { $output['cafile'] = $this->cafile; } if (isset($this->_usedProperties['capath'])) { $output['capath'] = $this->capath; } if (isset($this->_usedProperties['localCert'])) { $output['local_cert'] = $this->localCert; } if (isset($this->_usedProperties['localPk'])) { $output['local_pk'] = $this->localPk; } if (isset($this->_usedProperties['passphrase'])) { $output['passphrase'] = $this->passphrase; } if (isset($this->_usedProperties['ciphers'])) { $output['ciphers'] = $this->ciphers; } if (isset($this->_usedProperties['peerFingerprint'])) { $output['peer_fingerprint'] = $this->peerFingerprint->toArray(); } if (isset($this->_usedProperties['cryptoMethod'])) { $output['crypto_method'] = $this->cryptoMethod; } if (isset($this->_usedProperties['extra'])) { $output['extra'] = $this->extra; } if (isset($this->_usedProperties['retryFailed'])) { $output['retry_failed'] = $this->retryFailed instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig\RetryFailedConfig ? $this->retryFailed->toArray() : $this->retryFailed; } return $output; } } _usedProperties['code'] = \true; $this->code = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function methods(ParamConfigurator|array $value) : static { $this->_usedProperties['methods'] = \true; $this->methods = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('code', $value)) { $this->_usedProperties['code'] = \true; $this->code = $value['code']; unset($value['code']); } if (\array_key_exists('methods', $value)) { $this->_usedProperties['methods'] = \true; $this->methods = $value['methods']; unset($value['methods']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['code'])) { $output['code'] = $this->code; } if (isset($this->_usedProperties['methods'])) { $output['methods'] = $this->methods; } return $output; } } _usedProperties['sha1'] = \true; $this->sha1 = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function pinsha256(mixed $value) : static { $this->_usedProperties['pinsha256'] = \true; $this->pinsha256 = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function md5(mixed $value) : static { $this->_usedProperties['md5'] = \true; $this->md5 = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('sha1', $value)) { $this->_usedProperties['sha1'] = \true; $this->sha1 = $value['sha1']; unset($value['sha1']); } if (\array_key_exists('pin-sha256', $value)) { $this->_usedProperties['pinsha256'] = \true; $this->pinsha256 = $value['pin-sha256']; unset($value['pin-sha256']); } if (\array_key_exists('md5', $value)) { $this->_usedProperties['md5'] = \true; $this->md5 = $value['md5']; unset($value['md5']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['sha1'])) { $output['sha1'] = $this->sha1; } if (isset($this->_usedProperties['pinsha256'])) { $output['pin-sha256'] = $this->pinsha256; } if (isset($this->_usedProperties['md5'])) { $output['md5'] = $this->md5; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * service id to override the retry strategy * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function retryStrategy($value) : static { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = $value; return $this; } /** * @template TValue * @param TValue $value * A list of HTTP status code that triggers a retry * @return \Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig : static) */ public function httpCode(string $code, array $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig|static { if (!\is_array($value)) { $this->_usedProperties['httpCodes'] = \true; $this->httpCodes[$code] = $value; return $this; } if (!isset($this->httpCodes[$code]) || !$this->httpCodes[$code] instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig) { $this->_usedProperties['httpCodes'] = \true; $this->httpCodes[$code] = new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "httpCode()" has already been initialized. You cannot pass values the second time you call httpCode().'); } return $this->httpCodes[$code]; } /** * @default 3 * @param ParamConfigurator|int $value * @return $this */ public function maxRetries($value) : static { $this->_usedProperties['maxRetries'] = \true; $this->maxRetries = $value; return $this; } /** * Time in ms to delay (or the initial value when multiplier is used) * @default 1000 * @param ParamConfigurator|int $value * @return $this */ public function delay($value) : static { $this->_usedProperties['delay'] = \true; $this->delay = $value; return $this; } /** * If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries) * @default 2 * @param ParamConfigurator|float $value * @return $this */ public function multiplier($value) : static { $this->_usedProperties['multiplier'] = \true; $this->multiplier = $value; return $this; } /** * Max time in ms that a retry should ever be delayed (0 = infinite) * @default 0 * @param ParamConfigurator|int $value * @return $this */ public function maxDelay($value) : static { $this->_usedProperties['maxDelay'] = \true; $this->maxDelay = $value; return $this; } /** * Randomness in percent (between 0 and 1) to apply to the delay * @default 0.1 * @param ParamConfigurator|float $value * @return $this */ public function jitter($value) : static { $this->_usedProperties['jitter'] = \true; $this->jitter = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('retry_strategy', $value)) { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = $value['retry_strategy']; unset($value['retry_strategy']); } if (\array_key_exists('http_codes', $value)) { $this->_usedProperties['httpCodes'] = \true; $this->httpCodes = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig($v) : $v, $value['http_codes']); unset($value['http_codes']); } if (\array_key_exists('max_retries', $value)) { $this->_usedProperties['maxRetries'] = \true; $this->maxRetries = $value['max_retries']; unset($value['max_retries']); } if (\array_key_exists('delay', $value)) { $this->_usedProperties['delay'] = \true; $this->delay = $value['delay']; unset($value['delay']); } if (\array_key_exists('multiplier', $value)) { $this->_usedProperties['multiplier'] = \true; $this->multiplier = $value['multiplier']; unset($value['multiplier']); } if (\array_key_exists('max_delay', $value)) { $this->_usedProperties['maxDelay'] = \true; $this->maxDelay = $value['max_delay']; unset($value['max_delay']); } if (\array_key_exists('jitter', $value)) { $this->_usedProperties['jitter'] = \true; $this->jitter = $value['jitter']; unset($value['jitter']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['retryStrategy'])) { $output['retry_strategy'] = $this->retryStrategy; } if (isset($this->_usedProperties['httpCodes'])) { $output['http_codes'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptions\RetryFailed\HttpCodeConfig ? $v->toArray() : $v, $this->httpCodes); } if (isset($this->_usedProperties['maxRetries'])) { $output['max_retries'] = $this->maxRetries; } if (isset($this->_usedProperties['delay'])) { $output['delay'] = $this->delay; } if (isset($this->_usedProperties['multiplier'])) { $output['multiplier'] = $this->multiplier; } if (isset($this->_usedProperties['maxDelay'])) { $output['max_delay'] = $this->maxDelay; } if (isset($this->_usedProperties['jitter'])) { $output['jitter'] = $this->jitter; } return $output; } } $value * * @return $this */ public function paths(ParamConfigurator|array $value) : static { $this->_usedProperties['paths'] = \true; $this->paths = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('paths', $value)) { $this->_usedProperties['paths'] = \true; $this->paths = $value['paths']; unset($value['paths']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['paths'])) { $output['paths'] = $this->paths; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cache($value) : static { $this->_usedProperties['cache'] = \true; $this->cache = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function enableAnnotations($value) : static { $this->_usedProperties['enableAnnotations'] = \true; $this->enableAnnotations = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function enableAttributes($value) : static { $this->_usedProperties['enableAttributes'] = \true; $this->enableAttributes = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function staticMethod(ParamConfigurator|array $value) : static { $this->_usedProperties['staticMethod'] = \true; $this->staticMethod = $value; return $this; } /** * @default 'validators' * @param ParamConfigurator|mixed $value * @return $this */ public function translationDomain($value) : static { $this->_usedProperties['translationDomain'] = \true; $this->translationDomain = $value; return $this; } /** * @default null * @param ParamConfigurator|'html5-allow-no-tld'|'html5'|'strict' $value * @return $this */ public function emailValidationMode($value) : static { $this->_usedProperties['emailValidationMode'] = \true; $this->emailValidationMode = $value; return $this; } /** * @default {"paths":[]} */ public function mapping(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Validation\MappingConfig { if (null === $this->mapping) { $this->_usedProperties['mapping'] = \true; $this->mapping = new \_ContaoManager\Symfony\Config\Framework\Validation\MappingConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "mapping()" has already been initialized. You cannot pass values the second time you call mapping().'); } return $this->mapping; } /** * @default {"enabled":true,"endpoint":null} */ public function notCompromisedPassword(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Validation\NotCompromisedPasswordConfig { if (null === $this->notCompromisedPassword) { $this->_usedProperties['notCompromisedPassword'] = \true; $this->notCompromisedPassword = new \_ContaoManager\Symfony\Config\Framework\Validation\NotCompromisedPasswordConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "notCompromisedPassword()" has already been initialized. You cannot pass values the second time you call notCompromisedPassword().'); } return $this->notCompromisedPassword; } /** * @template TValue * @param TValue $value * A collection of namespaces for which auto-mapping will be enabled by default, or null to opt-in with the EnableAutoMapping constraint. * @example [] * @example ["validator.property_info_loader"] * @return \Symfony\Config\Framework\Validation\AutoMappingConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Validation\AutoMappingConfig : static) */ public function autoMapping(string $namespace, array $value = []) : \_ContaoManager\Symfony\Config\Framework\Validation\AutoMappingConfig|static { if (!\is_array($value)) { $this->_usedProperties['autoMapping'] = \true; $this->autoMapping[$namespace] = $value; return $this; } if (!isset($this->autoMapping[$namespace]) || !$this->autoMapping[$namespace] instanceof \_ContaoManager\Symfony\Config\Framework\Validation\AutoMappingConfig) { $this->_usedProperties['autoMapping'] = \true; $this->autoMapping[$namespace] = new \_ContaoManager\Symfony\Config\Framework\Validation\AutoMappingConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "autoMapping()" has already been initialized. You cannot pass values the second time you call autoMapping().'); } return $this->autoMapping[$namespace]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('cache', $value)) { $this->_usedProperties['cache'] = \true; $this->cache = $value['cache']; unset($value['cache']); } if (\array_key_exists('enable_annotations', $value)) { $this->_usedProperties['enableAnnotations'] = \true; $this->enableAnnotations = $value['enable_annotations']; unset($value['enable_annotations']); } if (\array_key_exists('enable_attributes', $value)) { $this->_usedProperties['enableAttributes'] = \true; $this->enableAttributes = $value['enable_attributes']; unset($value['enable_attributes']); } if (\array_key_exists('static_method', $value)) { $this->_usedProperties['staticMethod'] = \true; $this->staticMethod = $value['static_method']; unset($value['static_method']); } if (\array_key_exists('translation_domain', $value)) { $this->_usedProperties['translationDomain'] = \true; $this->translationDomain = $value['translation_domain']; unset($value['translation_domain']); } if (\array_key_exists('email_validation_mode', $value)) { $this->_usedProperties['emailValidationMode'] = \true; $this->emailValidationMode = $value['email_validation_mode']; unset($value['email_validation_mode']); } if (\array_key_exists('mapping', $value)) { $this->_usedProperties['mapping'] = \true; $this->mapping = new \_ContaoManager\Symfony\Config\Framework\Validation\MappingConfig($value['mapping']); unset($value['mapping']); } if (\array_key_exists('not_compromised_password', $value)) { $this->_usedProperties['notCompromisedPassword'] = \true; $this->notCompromisedPassword = new \_ContaoManager\Symfony\Config\Framework\Validation\NotCompromisedPasswordConfig($value['not_compromised_password']); unset($value['not_compromised_password']); } if (\array_key_exists('auto_mapping', $value)) { $this->_usedProperties['autoMapping'] = \true; $this->autoMapping = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Validation\AutoMappingConfig($v) : $v, $value['auto_mapping']); unset($value['auto_mapping']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['cache'])) { $output['cache'] = $this->cache; } if (isset($this->_usedProperties['enableAnnotations'])) { $output['enable_annotations'] = $this->enableAnnotations; } if (isset($this->_usedProperties['enableAttributes'])) { $output['enable_attributes'] = $this->enableAttributes; } if (isset($this->_usedProperties['staticMethod'])) { $output['static_method'] = $this->staticMethod; } if (isset($this->_usedProperties['translationDomain'])) { $output['translation_domain'] = $this->translationDomain; } if (isset($this->_usedProperties['emailValidationMode'])) { $output['email_validation_mode'] = $this->emailValidationMode; } if (isset($this->_usedProperties['mapping'])) { $output['mapping'] = $this->mapping->toArray(); } if (isset($this->_usedProperties['notCompromisedPassword'])) { $output['not_compromised_password'] = $this->notCompromisedPassword->toArray(); } if (isset($this->_usedProperties['autoMapping'])) { $output['auto_mapping'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Validation\AutoMappingConfig ? $v->toArray() : $v, $this->autoMapping); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function limiter(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Framework\RateLimiter\LimiterConfig { if (!isset($this->limiters[$name])) { $this->_usedProperties['limiters'] = \true; $this->limiters[$name] = new \_ContaoManager\Symfony\Config\Framework\RateLimiter\LimiterConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "limiter()" has already been initialized. You cannot pass values the second time you call limiter().'); } return $this->limiters[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('limiters', $value)) { $this->_usedProperties['limiters'] = \true; $this->limiters = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\RateLimiter\LimiterConfig($v), $value['limiters']); unset($value['limiters']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['limiters'])) { $output['limiters'] = \array_map(fn($v) => $v->toArray(), $this->limiters); } return $output; } } _usedProperties['interval'] = \true; $this->interval = $value; return $this; } /** * Amount of tokens to add each interval * @default 1 * @param ParamConfigurator|int $value * @return $this */ public function amount($value) : static { $this->_usedProperties['amount'] = \true; $this->amount = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('interval', $value)) { $this->_usedProperties['interval'] = \true; $this->interval = $value['interval']; unset($value['interval']); } if (\array_key_exists('amount', $value)) { $this->_usedProperties['amount'] = \true; $this->amount = $value['amount']; unset($value['amount']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['interval'])) { $output['interval'] = $this->interval; } if (isset($this->_usedProperties['amount'])) { $output['amount'] = $this->amount; } return $output; } } _usedProperties['lockFactory'] = \true; $this->lockFactory = $value; return $this; } /** * The cache pool to use for storing the current limiter state * @default 'cache.rate_limiter' * @param ParamConfigurator|mixed $value * @return $this */ public function cachePool($value) : static { $this->_usedProperties['cachePool'] = \true; $this->cachePool = $value; return $this; } /** * The service ID of a custom storage implementation, this precedes any configured "cache_pool" * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function storageService($value) : static { $this->_usedProperties['storageService'] = \true; $this->storageService = $value; return $this; } /** * The algorithm to be used by this limiter * @default null * @param ParamConfigurator|'fixed_window'|'token_bucket'|'sliding_window'|'no_limit' $value * @return $this */ public function policy($value) : static { $this->_usedProperties['policy'] = \true; $this->policy = $value; return $this; } /** * The maximum allowed hits in a fixed interval or burst * @default null * @param ParamConfigurator|int $value * @return $this */ public function limit($value) : static { $this->_usedProperties['limit'] = \true; $this->limit = $value; return $this; } /** * Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function interval($value) : static { $this->_usedProperties['interval'] = \true; $this->interval = $value; return $this; } /** * Configures the fill rate if "policy" is set to "token_bucket" */ public function rate(array $value = []) : \_ContaoManager\Symfony\Config\Framework\RateLimiter\LimiterConfig\RateConfig { if (null === $this->rate) { $this->_usedProperties['rate'] = \true; $this->rate = new \_ContaoManager\Symfony\Config\Framework\RateLimiter\LimiterConfig\RateConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "rate()" has already been initialized. You cannot pass values the second time you call rate().'); } return $this->rate; } public function __construct(array $value = []) { if (\array_key_exists('lock_factory', $value)) { $this->_usedProperties['lockFactory'] = \true; $this->lockFactory = $value['lock_factory']; unset($value['lock_factory']); } if (\array_key_exists('cache_pool', $value)) { $this->_usedProperties['cachePool'] = \true; $this->cachePool = $value['cache_pool']; unset($value['cache_pool']); } if (\array_key_exists('storage_service', $value)) { $this->_usedProperties['storageService'] = \true; $this->storageService = $value['storage_service']; unset($value['storage_service']); } if (\array_key_exists('policy', $value)) { $this->_usedProperties['policy'] = \true; $this->policy = $value['policy']; unset($value['policy']); } if (\array_key_exists('limit', $value)) { $this->_usedProperties['limit'] = \true; $this->limit = $value['limit']; unset($value['limit']); } if (\array_key_exists('interval', $value)) { $this->_usedProperties['interval'] = \true; $this->interval = $value['interval']; unset($value['interval']); } if (\array_key_exists('rate', $value)) { $this->_usedProperties['rate'] = \true; $this->rate = new \_ContaoManager\Symfony\Config\Framework\RateLimiter\LimiterConfig\RateConfig($value['rate']); unset($value['rate']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['lockFactory'])) { $output['lock_factory'] = $this->lockFactory; } if (isset($this->_usedProperties['cachePool'])) { $output['cache_pool'] = $this->cachePool; } if (isset($this->_usedProperties['storageService'])) { $output['storage_service'] = $this->storageService; } if (isset($this->_usedProperties['policy'])) { $output['policy'] = $this->policy; } if (isset($this->_usedProperties['limit'])) { $output['limit'] = $this->limit; } if (isset($this->_usedProperties['interval'])) { $output['interval'] = $this->interval; } if (isset($this->_usedProperties['rate'])) { $output['rate'] = $this->rate->toArray(); } return $output; } } |mixed $value * * @return $this */ public function adapters(mixed $value) : static { $this->_usedProperties['adapters'] = \true; $this->adapters = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function tags($value) : static { $this->_usedProperties['tags'] = \true; $this->tags = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function public($value) : static { $this->_usedProperties['public'] = \true; $this->public = $value; return $this; } /** * Default lifetime of the pool * @example "300" for 5 minutes expressed in seconds, "PT5M" for five minutes expressed as ISO 8601 time interval, or "5 minutes" as a date expression * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function defaultLifetime($value) : static { $this->_usedProperties['defaultLifetime'] = \true; $this->defaultLifetime = $value; return $this; } /** * Overwrite the setting from the default provider for this adapter. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function provider($value) : static { $this->_usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @example "messenger.default_bus" to send early expiration events to the default Messenger bus. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function earlyExpirationMessageBus($value) : static { $this->_usedProperties['earlyExpirationMessageBus'] = \true; $this->earlyExpirationMessageBus = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function clearer($value) : static { $this->_usedProperties['clearer'] = \true; $this->clearer = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('adapters', $value)) { $this->_usedProperties['adapters'] = \true; $this->adapters = $value['adapters']; unset($value['adapters']); } if (\array_key_exists('tags', $value)) { $this->_usedProperties['tags'] = \true; $this->tags = $value['tags']; unset($value['tags']); } if (\array_key_exists('public', $value)) { $this->_usedProperties['public'] = \true; $this->public = $value['public']; unset($value['public']); } if (\array_key_exists('default_lifetime', $value)) { $this->_usedProperties['defaultLifetime'] = \true; $this->defaultLifetime = $value['default_lifetime']; unset($value['default_lifetime']); } if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('early_expiration_message_bus', $value)) { $this->_usedProperties['earlyExpirationMessageBus'] = \true; $this->earlyExpirationMessageBus = $value['early_expiration_message_bus']; unset($value['early_expiration_message_bus']); } if (\array_key_exists('clearer', $value)) { $this->_usedProperties['clearer'] = \true; $this->clearer = $value['clearer']; unset($value['clearer']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['adapters'])) { $output['adapters'] = $this->adapters; } if (isset($this->_usedProperties['tags'])) { $output['tags'] = $this->tags; } if (isset($this->_usedProperties['public'])) { $output['public'] = $this->public; } if (isset($this->_usedProperties['defaultLifetime'])) { $output['default_lifetime'] = $this->defaultLifetime; } if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['earlyExpirationMessageBus'])) { $output['early_expiration_message_bus'] = $this->earlyExpirationMessageBus; } if (isset($this->_usedProperties['clearer'])) { $output['clearer'] = $this->clearer; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function enableAnnotations($value) : static { $this->_usedProperties['enableAnnotations'] = \true; $this->enableAnnotations = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function enableAttributes($value) : static { $this->_usedProperties['enableAttributes'] = \true; $this->enableAttributes = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function nameConverter($value) : static { $this->_usedProperties['nameConverter'] = \true; $this->nameConverter = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function circularReferenceHandler($value) : static { $this->_usedProperties['circularReferenceHandler'] = \true; $this->circularReferenceHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function maxDepthHandler($value) : static { $this->_usedProperties['maxDepthHandler'] = \true; $this->maxDepthHandler = $value; return $this; } /** * @default {"paths":[]} */ public function mapping(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Serializer\MappingConfig { if (null === $this->mapping) { $this->_usedProperties['mapping'] = \true; $this->mapping = new \_ContaoManager\Symfony\Config\Framework\Serializer\MappingConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "mapping()" has already been initialized. You cannot pass values the second time you call mapping().'); } return $this->mapping; } /** * @param ParamConfigurator|list $value * * @return $this */ public function defaultContext(ParamConfigurator|array $value) : static { $this->_usedProperties['defaultContext'] = \true; $this->defaultContext = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('enable_annotations', $value)) { $this->_usedProperties['enableAnnotations'] = \true; $this->enableAnnotations = $value['enable_annotations']; unset($value['enable_annotations']); } if (\array_key_exists('enable_attributes', $value)) { $this->_usedProperties['enableAttributes'] = \true; $this->enableAttributes = $value['enable_attributes']; unset($value['enable_attributes']); } if (\array_key_exists('name_converter', $value)) { $this->_usedProperties['nameConverter'] = \true; $this->nameConverter = $value['name_converter']; unset($value['name_converter']); } if (\array_key_exists('circular_reference_handler', $value)) { $this->_usedProperties['circularReferenceHandler'] = \true; $this->circularReferenceHandler = $value['circular_reference_handler']; unset($value['circular_reference_handler']); } if (\array_key_exists('max_depth_handler', $value)) { $this->_usedProperties['maxDepthHandler'] = \true; $this->maxDepthHandler = $value['max_depth_handler']; unset($value['max_depth_handler']); } if (\array_key_exists('mapping', $value)) { $this->_usedProperties['mapping'] = \true; $this->mapping = new \_ContaoManager\Symfony\Config\Framework\Serializer\MappingConfig($value['mapping']); unset($value['mapping']); } if (\array_key_exists('default_context', $value)) { $this->_usedProperties['defaultContext'] = \true; $this->defaultContext = $value['default_context']; unset($value['default_context']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['enableAnnotations'])) { $output['enable_annotations'] = $this->enableAnnotations; } if (isset($this->_usedProperties['enableAttributes'])) { $output['enable_attributes'] = $this->enableAttributes; } if (isset($this->_usedProperties['nameConverter'])) { $output['name_converter'] = $this->nameConverter; } if (isset($this->_usedProperties['circularReferenceHandler'])) { $output['circular_reference_handler'] = $this->circularReferenceHandler; } if (isset($this->_usedProperties['maxDepthHandler'])) { $output['max_depth_handler'] = $this->maxDepthHandler; } if (isset($this->_usedProperties['mapping'])) { $output['mapping'] = $this->mapping->toArray(); } if (isset($this->_usedProperties['defaultContext'])) { $output['default_context'] = $this->defaultContext; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * Throw an exception if an entry is missing from the manifest.json * @default false * @param ParamConfigurator|bool $value * @return $this */ public function strictMode($value) : static { $this->_usedProperties['strictMode'] = \true; $this->strictMode = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function versionStrategy($value) : static { $this->_usedProperties['versionStrategy'] = \true; $this->versionStrategy = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function version($value) : static { $this->_usedProperties['version'] = \true; $this->version = $value; return $this; } /** * @default '%%s?%%s' * @param ParamConfigurator|mixed $value * @return $this */ public function versionFormat($value) : static { $this->_usedProperties['versionFormat'] = \true; $this->versionFormat = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function jsonManifestPath($value) : static { $this->_usedProperties['jsonManifestPath'] = \true; $this->jsonManifestPath = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function basePath($value) : static { $this->_usedProperties['basePath'] = \true; $this->basePath = $value; return $this; } /** * @param ParamConfigurator|list|mixed $value * * @return $this */ public function baseUrls(mixed $value) : static { $this->_usedProperties['baseUrls'] = \true; $this->baseUrls = $value; return $this; } public function package(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Framework\Assets\PackageConfig { if (!isset($this->packages[$name])) { $this->_usedProperties['packages'] = \true; $this->packages[$name] = new \_ContaoManager\Symfony\Config\Framework\Assets\PackageConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "package()" has already been initialized. You cannot pass values the second time you call package().'); } return $this->packages[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('strict_mode', $value)) { $this->_usedProperties['strictMode'] = \true; $this->strictMode = $value['strict_mode']; unset($value['strict_mode']); } if (\array_key_exists('version_strategy', $value)) { $this->_usedProperties['versionStrategy'] = \true; $this->versionStrategy = $value['version_strategy']; unset($value['version_strategy']); } if (\array_key_exists('version', $value)) { $this->_usedProperties['version'] = \true; $this->version = $value['version']; unset($value['version']); } if (\array_key_exists('version_format', $value)) { $this->_usedProperties['versionFormat'] = \true; $this->versionFormat = $value['version_format']; unset($value['version_format']); } if (\array_key_exists('json_manifest_path', $value)) { $this->_usedProperties['jsonManifestPath'] = \true; $this->jsonManifestPath = $value['json_manifest_path']; unset($value['json_manifest_path']); } if (\array_key_exists('base_path', $value)) { $this->_usedProperties['basePath'] = \true; $this->basePath = $value['base_path']; unset($value['base_path']); } if (\array_key_exists('base_urls', $value)) { $this->_usedProperties['baseUrls'] = \true; $this->baseUrls = $value['base_urls']; unset($value['base_urls']); } if (\array_key_exists('packages', $value)) { $this->_usedProperties['packages'] = \true; $this->packages = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\Assets\PackageConfig($v), $value['packages']); unset($value['packages']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['strictMode'])) { $output['strict_mode'] = $this->strictMode; } if (isset($this->_usedProperties['versionStrategy'])) { $output['version_strategy'] = $this->versionStrategy; } if (isset($this->_usedProperties['version'])) { $output['version'] = $this->version; } if (isset($this->_usedProperties['versionFormat'])) { $output['version_format'] = $this->versionFormat; } if (isset($this->_usedProperties['jsonManifestPath'])) { $output['json_manifest_path'] = $this->jsonManifestPath; } if (isset($this->_usedProperties['basePath'])) { $output['base_path'] = $this->basePath; } if (isset($this->_usedProperties['baseUrls'])) { $output['base_urls'] = $this->baseUrls; } if (isset($this->_usedProperties['packages'])) { $output['packages'] = \array_map(fn($v) => $v->toArray(), $this->packages); } return $output; } } _usedProperties['email'] = \true; $this->email = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function phone($value) : static { $this->_usedProperties['phone'] = \true; $this->phone = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('email', $value)) { $this->_usedProperties['email'] = \true; $this->email = $value['email']; unset($value['email']); } if (\array_key_exists('phone', $value)) { $this->_usedProperties['phone'] = \true; $this->phone = $value['phone']; unset($value['phone']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['email'])) { $output['email'] = $this->email; } if (isset($this->_usedProperties['phone'])) { $output['phone'] = $this->phone; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Messenger\RoutingConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Messenger\RoutingConfig : static) */ public function routing(string $message_class, array $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\RoutingConfig|static { if (!\is_array($value)) { $this->_usedProperties['routing'] = \true; $this->routing[$message_class] = $value; return $this; } if (!isset($this->routing[$message_class]) || !$this->routing[$message_class] instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\RoutingConfig) { $this->_usedProperties['routing'] = \true; $this->routing[$message_class] = new \_ContaoManager\Symfony\Config\Framework\Messenger\RoutingConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "routing()" has already been initialized. You cannot pass values the second time you call routing().'); } return $this->routing[$message_class]; } /** * @default {"default_serializer":"messenger.transport.native_php_serializer","symfony_serializer":{"format":"json","context":[]}} */ public function serializer(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\SerializerConfig { if (null === $this->serializer) { $this->_usedProperties['serializer'] = \true; $this->serializer = new \_ContaoManager\Symfony\Config\Framework\Messenger\SerializerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "serializer()" has already been initialized. You cannot pass values the second time you call serializer().'); } return $this->serializer; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Messenger\TransportConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Messenger\TransportConfig : static) */ public function transport(string $name, string|array $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig|static { if (!\is_array($value)) { $this->_usedProperties['transports'] = \true; $this->transports[$name] = $value; return $this; } if (!isset($this->transports[$name]) || !$this->transports[$name] instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig) { $this->_usedProperties['transports'] = \true; $this->transports[$name] = new \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "transport()" has already been initialized. You cannot pass values the second time you call transport().'); } return $this->transports[$name]; } /** * Transport name to send failed messages to (after all retries have failed). * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureTransport($value) : static { $this->_usedProperties['failureTransport'] = \true; $this->failureTransport = $value; return $this; } /** * Reset container services after each message. * @default true * @param ParamConfigurator|bool $value * @deprecated Option "reset_on_message" at "messenger" is deprecated. It does nothing and will be removed in version 7.0. * @return $this */ public function resetOnMessage($value) : static { $this->_usedProperties['resetOnMessage'] = \true; $this->resetOnMessage = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function stopWorkerOnSignals(ParamConfigurator|array $value) : static { $this->_usedProperties['stopWorkerOnSignals'] = \true; $this->stopWorkerOnSignals = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function defaultBus($value) : static { $this->_usedProperties['defaultBus'] = \true; $this->defaultBus = $value; return $this; } /** * @default {"messenger.bus.default":{"default_middleware":{"enabled":true,"allow_no_handlers":false,"allow_no_senders":true},"middleware":[]}} */ public function bus(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig { if (!isset($this->buses[$name])) { $this->_usedProperties['buses'] = \true; $this->buses[$name] = new \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "bus()" has already been initialized. You cannot pass values the second time you call bus().'); } return $this->buses[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('routing', $value)) { $this->_usedProperties['routing'] = \true; $this->routing = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Messenger\RoutingConfig($v) : $v, $value['routing']); unset($value['routing']); } if (\array_key_exists('serializer', $value)) { $this->_usedProperties['serializer'] = \true; $this->serializer = new \_ContaoManager\Symfony\Config\Framework\Messenger\SerializerConfig($value['serializer']); unset($value['serializer']); } if (\array_key_exists('transports', $value)) { $this->_usedProperties['transports'] = \true; $this->transports = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig($v) : $v, $value['transports']); unset($value['transports']); } if (\array_key_exists('failure_transport', $value)) { $this->_usedProperties['failureTransport'] = \true; $this->failureTransport = $value['failure_transport']; unset($value['failure_transport']); } if (\array_key_exists('reset_on_message', $value)) { $this->_usedProperties['resetOnMessage'] = \true; $this->resetOnMessage = $value['reset_on_message']; unset($value['reset_on_message']); } if (\array_key_exists('stop_worker_on_signals', $value)) { $this->_usedProperties['stopWorkerOnSignals'] = \true; $this->stopWorkerOnSignals = $value['stop_worker_on_signals']; unset($value['stop_worker_on_signals']); } if (\array_key_exists('default_bus', $value)) { $this->_usedProperties['defaultBus'] = \true; $this->defaultBus = $value['default_bus']; unset($value['default_bus']); } if (\array_key_exists('buses', $value)) { $this->_usedProperties['buses'] = \true; $this->buses = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig($v), $value['buses']); unset($value['buses']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['routing'])) { $output['routing'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\RoutingConfig ? $v->toArray() : $v, $this->routing); } if (isset($this->_usedProperties['serializer'])) { $output['serializer'] = $this->serializer->toArray(); } if (isset($this->_usedProperties['transports'])) { $output['transports'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig ? $v->toArray() : $v, $this->transports); } if (isset($this->_usedProperties['failureTransport'])) { $output['failure_transport'] = $this->failureTransport; } if (isset($this->_usedProperties['resetOnMessage'])) { $output['reset_on_message'] = $this->resetOnMessage; } if (isset($this->_usedProperties['stopWorkerOnSignals'])) { $output['stop_worker_on_signals'] = $this->stopWorkerOnSignals; } if (isset($this->_usedProperties['defaultBus'])) { $output['default_bus'] = $this->defaultBus; } if (isset($this->_usedProperties['buses'])) { $output['buses'] = \array_map(fn($v) => $v->toArray(), $this->buses); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * The message bus to use. * @default 'messenger.default_bus' * @param ParamConfigurator|mixed $value * @return $this */ public function messageBus($value) : static { $this->_usedProperties['messageBus'] = \true; $this->messageBus = $value; return $this; } public function routing(string $type, array $value = []) : \_ContaoManager\Symfony\Config\Framework\Webhook\RoutingConfig { if (!isset($this->routing[$type])) { $this->_usedProperties['routing'] = \true; $this->routing[$type] = new \_ContaoManager\Symfony\Config\Framework\Webhook\RoutingConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "routing()" has already been initialized. You cannot pass values the second time you call routing().'); } return $this->routing[$type]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('message_bus', $value)) { $this->_usedProperties['messageBus'] = \true; $this->messageBus = $value['message_bus']; unset($value['message_bus']); } if (\array_key_exists('routing', $value)) { $this->_usedProperties['routing'] = \true; $this->routing = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\Webhook\RoutingConfig($v), $value['routing']); unset($value['routing']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['messageBus'])) { $output['message_bus'] = $this->messageBus; } if (isset($this->_usedProperties['routing'])) { $output['routing'] = \array_map(fn($v) => $v->toArray(), $this->routing); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function resource($value) : static { $this->_usedProperties['resource'] = \true; $this->resource = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function type($value) : static { $this->_usedProperties['type'] = \true; $this->type = $value; return $this; } /** * @default '%kernel.cache_dir%' * @param ParamConfigurator|mixed $value * @return $this */ public function cacheDir($value) : static { $this->_usedProperties['cacheDir'] = \true; $this->cacheDir = $value; return $this; } /** * The default URI used to generate URLs in a non-HTTP context * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function defaultUri($value) : static { $this->_usedProperties['defaultUri'] = \true; $this->defaultUri = $value; return $this; } /** * @default 80 * @param ParamConfigurator|mixed $value * @return $this */ public function httpPort($value) : static { $this->_usedProperties['httpPort'] = \true; $this->httpPort = $value; return $this; } /** * @default 443 * @param ParamConfigurator|mixed $value * @return $this */ public function httpsPort($value) : static { $this->_usedProperties['httpsPort'] = \true; $this->httpsPort = $value; return $this; } /** * set to true to throw an exception when a parameter does not match the requirements * set to false to disable exceptions when a parameter does not match the requirements (and return null instead) * set to null to disable parameter checks against requirements * 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production * @default true * @param ParamConfigurator|mixed $value * @return $this */ public function strictRequirements($value) : static { $this->_usedProperties['strictRequirements'] = \true; $this->strictRequirements = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function utf8($value) : static { $this->_usedProperties['utf8'] = \true; $this->utf8 = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('resource', $value)) { $this->_usedProperties['resource'] = \true; $this->resource = $value['resource']; unset($value['resource']); } if (\array_key_exists('type', $value)) { $this->_usedProperties['type'] = \true; $this->type = $value['type']; unset($value['type']); } if (\array_key_exists('cache_dir', $value)) { $this->_usedProperties['cacheDir'] = \true; $this->cacheDir = $value['cache_dir']; unset($value['cache_dir']); } if (\array_key_exists('default_uri', $value)) { $this->_usedProperties['defaultUri'] = \true; $this->defaultUri = $value['default_uri']; unset($value['default_uri']); } if (\array_key_exists('http_port', $value)) { $this->_usedProperties['httpPort'] = \true; $this->httpPort = $value['http_port']; unset($value['http_port']); } if (\array_key_exists('https_port', $value)) { $this->_usedProperties['httpsPort'] = \true; $this->httpsPort = $value['https_port']; unset($value['https_port']); } if (\array_key_exists('strict_requirements', $value)) { $this->_usedProperties['strictRequirements'] = \true; $this->strictRequirements = $value['strict_requirements']; unset($value['strict_requirements']); } if (\array_key_exists('utf8', $value)) { $this->_usedProperties['utf8'] = \true; $this->utf8 = $value['utf8']; unset($value['utf8']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['resource'])) { $output['resource'] = $this->resource; } if (isset($this->_usedProperties['type'])) { $output['type'] = $this->type; } if (isset($this->_usedProperties['cacheDir'])) { $output['cache_dir'] = $this->cacheDir; } if (isset($this->_usedProperties['defaultUri'])) { $output['default_uri'] = $this->defaultUri; } if (isset($this->_usedProperties['httpPort'])) { $output['http_port'] = $this->httpPort; } if (isset($this->_usedProperties['httpsPort'])) { $output['https_port'] = $this->httpsPort; } if (isset($this->_usedProperties['strictRequirements'])) { $output['strict_requirements'] = $this->strictRequirements; } if (isset($this->_usedProperties['utf8'])) { $output['utf8'] = $this->utf8; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function fallbacks(ParamConfigurator|string|array $value) : static { $this->_usedProperties['fallbacks'] = \true; $this->fallbacks = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function logging($value) : static { $this->_usedProperties['logging'] = \true; $this->logging = $value; return $this; } /** * @default 'translator.formatter.default' * @param ParamConfigurator|mixed $value * @return $this */ public function formatter($value) : static { $this->_usedProperties['formatter'] = \true; $this->formatter = $value; return $this; } /** * @default '%kernel.cache_dir%/translations' * @param ParamConfigurator|mixed $value * @return $this */ public function cacheDir($value) : static { $this->_usedProperties['cacheDir'] = \true; $this->cacheDir = $value; return $this; } /** * The default path used to load translations * @default '%kernel.project_dir%/translations' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultPath($value) : static { $this->_usedProperties['defaultPath'] = \true; $this->defaultPath = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function paths(ParamConfigurator|array $value) : static { $this->_usedProperties['paths'] = \true; $this->paths = $value; return $this; } /** * @template TValue * @param TValue $value * @default {"enabled":false,"accents":true,"expansion_factor":1,"brackets":true,"parse_html":false,"localizable_html_attributes":[]} * @return \Symfony\Config\Framework\Translator\PseudoLocalizationConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Translator\PseudoLocalizationConfig : static) */ public function pseudoLocalization(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Translator\PseudoLocalizationConfig|static { if (!\is_array($value)) { $this->_usedProperties['pseudoLocalization'] = \true; $this->pseudoLocalization = $value; return $this; } if (!$this->pseudoLocalization instanceof \_ContaoManager\Symfony\Config\Framework\Translator\PseudoLocalizationConfig) { $this->_usedProperties['pseudoLocalization'] = \true; $this->pseudoLocalization = new \_ContaoManager\Symfony\Config\Framework\Translator\PseudoLocalizationConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "pseudoLocalization()" has already been initialized. You cannot pass values the second time you call pseudoLocalization().'); } return $this->pseudoLocalization; } /** * Translation providers you can read/write your translations from */ public function provider(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Framework\Translator\ProviderConfig { if (!isset($this->providers[$name])) { $this->_usedProperties['providers'] = \true; $this->providers[$name] = new \_ContaoManager\Symfony\Config\Framework\Translator\ProviderConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "provider()" has already been initialized. You cannot pass values the second time you call provider().'); } return $this->providers[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('fallbacks', $value)) { $this->_usedProperties['fallbacks'] = \true; $this->fallbacks = $value['fallbacks']; unset($value['fallbacks']); } if (\array_key_exists('logging', $value)) { $this->_usedProperties['logging'] = \true; $this->logging = $value['logging']; unset($value['logging']); } if (\array_key_exists('formatter', $value)) { $this->_usedProperties['formatter'] = \true; $this->formatter = $value['formatter']; unset($value['formatter']); } if (\array_key_exists('cache_dir', $value)) { $this->_usedProperties['cacheDir'] = \true; $this->cacheDir = $value['cache_dir']; unset($value['cache_dir']); } if (\array_key_exists('default_path', $value)) { $this->_usedProperties['defaultPath'] = \true; $this->defaultPath = $value['default_path']; unset($value['default_path']); } if (\array_key_exists('paths', $value)) { $this->_usedProperties['paths'] = \true; $this->paths = $value['paths']; unset($value['paths']); } if (\array_key_exists('pseudo_localization', $value)) { $this->_usedProperties['pseudoLocalization'] = \true; $this->pseudoLocalization = \is_array($value['pseudo_localization']) ? new \_ContaoManager\Symfony\Config\Framework\Translator\PseudoLocalizationConfig($value['pseudo_localization']) : $value['pseudo_localization']; unset($value['pseudo_localization']); } if (\array_key_exists('providers', $value)) { $this->_usedProperties['providers'] = \true; $this->providers = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\Translator\ProviderConfig($v), $value['providers']); unset($value['providers']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['fallbacks'])) { $output['fallbacks'] = $this->fallbacks; } if (isset($this->_usedProperties['logging'])) { $output['logging'] = $this->logging; } if (isset($this->_usedProperties['formatter'])) { $output['formatter'] = $this->formatter; } if (isset($this->_usedProperties['cacheDir'])) { $output['cache_dir'] = $this->cacheDir; } if (isset($this->_usedProperties['defaultPath'])) { $output['default_path'] = $this->defaultPath; } if (isset($this->_usedProperties['paths'])) { $output['paths'] = $this->paths; } if (isset($this->_usedProperties['pseudoLocalization'])) { $output['pseudo_localization'] = $this->pseudoLocalization instanceof \_ContaoManager\Symfony\Config\Framework\Translator\PseudoLocalizationConfig ? $this->pseudoLocalization->toArray() : $this->pseudoLocalization; } if (isset($this->_usedProperties['providers'])) { $output['providers'] = \array_map(fn($v) => $v->toArray(), $this->providers); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Workflows\WorkflowsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Workflows\WorkflowsConfig : static) */ public function workflows(string $name, mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig|static { if (!\is_array($value)) { $this->_usedProperties['workflows'] = \true; $this->workflows[$name] = $value; return $this; } if (!isset($this->workflows[$name]) || !$this->workflows[$name] instanceof \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig) { $this->_usedProperties['workflows'] = \true; $this->workflows[$name] = new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "workflows()" has already been initialized. You cannot pass values the second time you call workflows().'); } return $this->workflows[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('workflows', $value)) { $this->_usedProperties['workflows'] = \true; $this->workflows = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig($v) : $v, $value['workflows']); unset($value['workflows']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['workflows'])) { $output['workflows'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig ? $v->toArray() : $v, $this->workflows); } return $output; } } _usedProperties['auditTrail'] = \true; $this->auditTrail = $value; return $this; } if (!$this->auditTrail instanceof \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\AuditTrailConfig) { $this->_usedProperties['auditTrail'] = \true; $this->auditTrail = new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\AuditTrailConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "auditTrail()" has already been initialized. You cannot pass values the second time you call auditTrail().'); } return $this->auditTrail; } /** * @default 'state_machine' * @param ParamConfigurator|'workflow'|'state_machine' $value * @return $this */ public function type($value) : static { $this->_usedProperties['type'] = \true; $this->type = $value; return $this; } public function markingStore(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\MarkingStoreConfig { if (null === $this->markingStore) { $this->_usedProperties['markingStore'] = \true; $this->markingStore = new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\MarkingStoreConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "markingStore()" has already been initialized. You cannot pass values the second time you call markingStore().'); } return $this->markingStore; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function supports(ParamConfigurator|string|array $value) : static { $this->_usedProperties['supports'] = \true; $this->supports = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function supportStrategy($value) : static { $this->_usedProperties['supportStrategy'] = \true; $this->supportStrategy = $value; return $this; } /** * @param ParamConfigurator|list|mixed $value * * @return $this */ public function initialMarking(mixed $value) : static { $this->_usedProperties['initialMarking'] = \true; $this->initialMarking = $value; return $this; } /** * Select which Transition events should be dispatched for this Workflow * @example workflow.enter * @example workflow.transition * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function eventsToDispatch(mixed $value = NULL) : static { $this->_usedProperties['eventsToDispatch'] = \true; $this->eventsToDispatch = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Workflows\WorkflowsConfig\PlaceConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Workflows\WorkflowsConfig\PlaceConfig : static) */ public function place(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\PlaceConfig|static { $this->_usedProperties['places'] = \true; if (!\is_array($value)) { $this->places[] = $value; return $this; } return $this->places[] = new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\PlaceConfig($value); } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Workflows\WorkflowsConfig\TransitionConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Workflows\WorkflowsConfig\TransitionConfig : static) */ public function transition(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\TransitionConfig|static { $this->_usedProperties['transitions'] = \true; if (!\is_array($value)) { $this->transitions[] = $value; return $this; } return $this->transitions[] = new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\TransitionConfig($value); } /** * @param ParamConfigurator|list $value * * @return $this */ public function metadata(ParamConfigurator|array $value) : static { $this->_usedProperties['metadata'] = \true; $this->metadata = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('audit_trail', $value)) { $this->_usedProperties['auditTrail'] = \true; $this->auditTrail = \is_array($value['audit_trail']) ? new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\AuditTrailConfig($value['audit_trail']) : $value['audit_trail']; unset($value['audit_trail']); } if (\array_key_exists('type', $value)) { $this->_usedProperties['type'] = \true; $this->type = $value['type']; unset($value['type']); } if (\array_key_exists('marking_store', $value)) { $this->_usedProperties['markingStore'] = \true; $this->markingStore = new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\MarkingStoreConfig($value['marking_store']); unset($value['marking_store']); } if (\array_key_exists('supports', $value)) { $this->_usedProperties['supports'] = \true; $this->supports = $value['supports']; unset($value['supports']); } if (\array_key_exists('support_strategy', $value)) { $this->_usedProperties['supportStrategy'] = \true; $this->supportStrategy = $value['support_strategy']; unset($value['support_strategy']); } if (\array_key_exists('initial_marking', $value)) { $this->_usedProperties['initialMarking'] = \true; $this->initialMarking = $value['initial_marking']; unset($value['initial_marking']); } if (\array_key_exists('events_to_dispatch', $value)) { $this->_usedProperties['eventsToDispatch'] = \true; $this->eventsToDispatch = $value['events_to_dispatch']; unset($value['events_to_dispatch']); } if (\array_key_exists('places', $value)) { $this->_usedProperties['places'] = \true; $this->places = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\PlaceConfig($v) : $v, $value['places']); unset($value['places']); } if (\array_key_exists('transitions', $value)) { $this->_usedProperties['transitions'] = \true; $this->transitions = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\TransitionConfig($v) : $v, $value['transitions']); unset($value['transitions']); } if (\array_key_exists('metadata', $value)) { $this->_usedProperties['metadata'] = \true; $this->metadata = $value['metadata']; unset($value['metadata']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['auditTrail'])) { $output['audit_trail'] = $this->auditTrail instanceof \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\AuditTrailConfig ? $this->auditTrail->toArray() : $this->auditTrail; } if (isset($this->_usedProperties['type'])) { $output['type'] = $this->type; } if (isset($this->_usedProperties['markingStore'])) { $output['marking_store'] = $this->markingStore->toArray(); } if (isset($this->_usedProperties['supports'])) { $output['supports'] = $this->supports; } if (isset($this->_usedProperties['supportStrategy'])) { $output['support_strategy'] = $this->supportStrategy; } if (isset($this->_usedProperties['initialMarking'])) { $output['initial_marking'] = $this->initialMarking; } if (isset($this->_usedProperties['eventsToDispatch'])) { $output['events_to_dispatch'] = $this->eventsToDispatch; } if (isset($this->_usedProperties['places'])) { $output['places'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\PlaceConfig ? $v->toArray() : $v, $this->places); } if (isset($this->_usedProperties['transitions'])) { $output['transitions'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Workflows\WorkflowsConfig\TransitionConfig ? $v->toArray() : $v, $this->transitions); } if (isset($this->_usedProperties['metadata'])) { $output['metadata'] = $this->metadata; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['type'] = \true; $this->type = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function property($value) : static { $this->_usedProperties['property'] = \true; $this->property = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function service($value) : static { $this->_usedProperties['service'] = \true; $this->service = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('type', $value)) { $this->_usedProperties['type'] = \true; $this->type = $value['type']; unset($value['type']); } if (\array_key_exists('property', $value)) { $this->_usedProperties['property'] = \true; $this->property = $value['property']; unset($value['property']); } if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['type'])) { $output['type'] = $this->type; } if (isset($this->_usedProperties['property'])) { $output['property'] = $this->property; } if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } return $output; } } _usedProperties['name'] = \true; $this->name = $value; return $this; } /** * An expression to block the transition * @example is_fully_authenticated() and is_granted('ROLE_JOURNALIST') and subject.getTitle() == 'My first article' * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function guard($value) : static { $this->_usedProperties['guard'] = \true; $this->guard = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function from(ParamConfigurator|string|array $value) : static { $this->_usedProperties['from'] = \true; $this->from = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function to(ParamConfigurator|string|array $value) : static { $this->_usedProperties['to'] = \true; $this->to = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function metadata(ParamConfigurator|array $value) : static { $this->_usedProperties['metadata'] = \true; $this->metadata = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('name', $value)) { $this->_usedProperties['name'] = \true; $this->name = $value['name']; unset($value['name']); } if (\array_key_exists('guard', $value)) { $this->_usedProperties['guard'] = \true; $this->guard = $value['guard']; unset($value['guard']); } if (\array_key_exists('from', $value)) { $this->_usedProperties['from'] = \true; $this->from = $value['from']; unset($value['from']); } if (\array_key_exists('to', $value)) { $this->_usedProperties['to'] = \true; $this->to = $value['to']; unset($value['to']); } if (\array_key_exists('metadata', $value)) { $this->_usedProperties['metadata'] = \true; $this->metadata = $value['metadata']; unset($value['metadata']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['name'])) { $output['name'] = $this->name; } if (isset($this->_usedProperties['guard'])) { $output['guard'] = $this->guard; } if (isset($this->_usedProperties['from'])) { $output['from'] = $this->from; } if (isset($this->_usedProperties['to'])) { $output['to'] = $this->to; } if (isset($this->_usedProperties['metadata'])) { $output['metadata'] = $this->metadata; } return $output; } } _usedProperties['name'] = \true; $this->name = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function metadata(ParamConfigurator|array $value) : static { $this->_usedProperties['metadata'] = \true; $this->metadata = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('name', $value)) { $this->_usedProperties['name'] = \true; $this->name = $value['name']; unset($value['name']); } if (\array_key_exists('metadata', $value)) { $this->_usedProperties['metadata'] = \true; $this->metadata = $value['metadata']; unset($value['metadata']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['name'])) { $output['name'] = $this->name; } if (isset($this->_usedProperties['metadata'])) { $output['metadata'] = $this->metadata; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['sender'] = \true; $this->sender = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function recipients(ParamConfigurator|array $value) : static { $this->_usedProperties['recipients'] = \true; $this->recipients = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('sender', $value)) { $this->_usedProperties['sender'] = \true; $this->sender = $value['sender']; unset($value['sender']); } if (\array_key_exists('recipients', $value)) { $this->_usedProperties['recipients'] = \true; $this->recipients = $value['recipients']; unset($value['recipients']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['sender'])) { $output['sender'] = $this->sender; } if (isset($this->_usedProperties['recipients'])) { $output['recipients'] = $this->recipients; } return $output; } } _usedProperties['value'] = \true; $this->value = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('value', $value)) { $this->_usedProperties['value'] = \true; $this->value = $value['value']; unset($value['value']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['value'])) { $output['value'] = $this->value; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function accents($value) : static { $this->_usedProperties['accents'] = \true; $this->accents = $value; return $this; } /** * @default 1.0 * @param ParamConfigurator|float $value * @return $this */ public function expansionFactor($value) : static { $this->_usedProperties['expansionFactor'] = \true; $this->expansionFactor = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function brackets($value) : static { $this->_usedProperties['brackets'] = \true; $this->brackets = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function parseHtml($value) : static { $this->_usedProperties['parseHtml'] = \true; $this->parseHtml = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function localizableHtmlAttributes(ParamConfigurator|array $value) : static { $this->_usedProperties['localizableHtmlAttributes'] = \true; $this->localizableHtmlAttributes = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('accents', $value)) { $this->_usedProperties['accents'] = \true; $this->accents = $value['accents']; unset($value['accents']); } if (\array_key_exists('expansion_factor', $value)) { $this->_usedProperties['expansionFactor'] = \true; $this->expansionFactor = $value['expansion_factor']; unset($value['expansion_factor']); } if (\array_key_exists('brackets', $value)) { $this->_usedProperties['brackets'] = \true; $this->brackets = $value['brackets']; unset($value['brackets']); } if (\array_key_exists('parse_html', $value)) { $this->_usedProperties['parseHtml'] = \true; $this->parseHtml = $value['parse_html']; unset($value['parse_html']); } if (\array_key_exists('localizable_html_attributes', $value)) { $this->_usedProperties['localizableHtmlAttributes'] = \true; $this->localizableHtmlAttributes = $value['localizable_html_attributes']; unset($value['localizable_html_attributes']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['accents'])) { $output['accents'] = $this->accents; } if (isset($this->_usedProperties['expansionFactor'])) { $output['expansion_factor'] = $this->expansionFactor; } if (isset($this->_usedProperties['brackets'])) { $output['brackets'] = $this->brackets; } if (isset($this->_usedProperties['parseHtml'])) { $output['parse_html'] = $this->parseHtml; } if (isset($this->_usedProperties['localizableHtmlAttributes'])) { $output['localizable_html_attributes'] = $this->localizableHtmlAttributes; } return $output; } } _usedProperties['dsn'] = \true; $this->dsn = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function domains(ParamConfigurator|array $value) : static { $this->_usedProperties['domains'] = \true; $this->domains = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function locales(ParamConfigurator|array $value) : static { $this->_usedProperties['locales'] = \true; $this->locales = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('dsn', $value)) { $this->_usedProperties['dsn'] = \true; $this->dsn = $value['dsn']; unset($value['dsn']); } if (\array_key_exists('domains', $value)) { $this->_usedProperties['domains'] = \true; $this->domains = $value['domains']; unset($value['domains']); } if (\array_key_exists('locales', $value)) { $this->_usedProperties['locales'] = \true; $this->locales = $value['locales']; unset($value['locales']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['dsn'])) { $output['dsn'] = $this->dsn; } if (isset($this->_usedProperties['domains'])) { $output['domains'] = $this->domains; } if (isset($this->_usedProperties['locales'])) { $output['locales'] = $this->locales; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function collect($value) : static { $this->_usedProperties['collect'] = \true; $this->collect = $value; return $this; } /** * The name of the parameter to use to enable or disable collection on a per request basis * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function collectParameter($value) : static { $this->_usedProperties['collectParameter'] = \true; $this->collectParameter = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function onlyExceptions($value) : static { $this->_usedProperties['onlyExceptions'] = \true; $this->onlyExceptions = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function onlyMainRequests($value) : static { $this->_usedProperties['onlyMainRequests'] = \true; $this->onlyMainRequests = $value; return $this; } /** * @default 'file:%kernel.cache_dir%/profiler' * @param ParamConfigurator|mixed $value * @return $this */ public function dsn($value) : static { $this->_usedProperties['dsn'] = \true; $this->dsn = $value; return $this; } /** * Enables the serializer data collector and profiler panel * @default false * @param ParamConfigurator|bool $value * @return $this */ public function collectSerializerData($value) : static { $this->_usedProperties['collectSerializerData'] = \true; $this->collectSerializerData = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('collect', $value)) { $this->_usedProperties['collect'] = \true; $this->collect = $value['collect']; unset($value['collect']); } if (\array_key_exists('collect_parameter', $value)) { $this->_usedProperties['collectParameter'] = \true; $this->collectParameter = $value['collect_parameter']; unset($value['collect_parameter']); } if (\array_key_exists('only_exceptions', $value)) { $this->_usedProperties['onlyExceptions'] = \true; $this->onlyExceptions = $value['only_exceptions']; unset($value['only_exceptions']); } if (\array_key_exists('only_main_requests', $value)) { $this->_usedProperties['onlyMainRequests'] = \true; $this->onlyMainRequests = $value['only_main_requests']; unset($value['only_main_requests']); } if (\array_key_exists('dsn', $value)) { $this->_usedProperties['dsn'] = \true; $this->dsn = $value['dsn']; unset($value['dsn']); } if (\array_key_exists('collect_serializer_data', $value)) { $this->_usedProperties['collectSerializerData'] = \true; $this->collectSerializerData = $value['collect_serializer_data']; unset($value['collect_serializer_data']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['collect'])) { $output['collect'] = $this->collect; } if (isset($this->_usedProperties['collectParameter'])) { $output['collect_parameter'] = $this->collectParameter; } if (isset($this->_usedProperties['onlyExceptions'])) { $output['only_exceptions'] = $this->onlyExceptions; } if (isset($this->_usedProperties['onlyMainRequests'])) { $output['only_main_requests'] = $this->onlyMainRequests; } if (isset($this->_usedProperties['dsn'])) { $output['dsn'] = $this->dsn; } if (isset($this->_usedProperties['collectSerializerData'])) { $output['collect_serializer_data'] = $this->collectSerializerData; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @return $this */ public function resource(string $name, mixed $value) : static { $this->_usedProperties['resources'] = \true; $this->resources[$name] = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('resources', $value)) { $this->_usedProperties['resources'] = \true; $this->resources = $value['resources']; unset($value['resources']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['resources'])) { $output['resources'] = $this->resources; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default '%kernel.project_dir%/config/secrets/%kernel.runtime_environment%' * @param ParamConfigurator|mixed $value * @return $this */ public function vaultDirectory($value) : static { $this->_usedProperties['vaultDirectory'] = \true; $this->vaultDirectory = $value; return $this; } /** * @default '%kernel.project_dir%/.env.%kernel.environment%.local' * @param ParamConfigurator|mixed $value * @return $this */ public function localDotenvFile($value) : static { $this->_usedProperties['localDotenvFile'] = \true; $this->localDotenvFile = $value; return $this; } /** * @default 'base64:default::SYMFONY_DECRYPTION_SECRET' * @param ParamConfigurator|mixed $value * @return $this */ public function decryptionEnvVar($value) : static { $this->_usedProperties['decryptionEnvVar'] = \true; $this->decryptionEnvVar = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('vault_directory', $value)) { $this->_usedProperties['vaultDirectory'] = \true; $this->vaultDirectory = $value['vault_directory']; unset($value['vault_directory']); } if (\array_key_exists('local_dotenv_file', $value)) { $this->_usedProperties['localDotenvFile'] = \true; $this->localDotenvFile = $value['local_dotenv_file']; unset($value['local_dotenv_file']); } if (\array_key_exists('decryption_env_var', $value)) { $this->_usedProperties['decryptionEnvVar'] = \true; $this->decryptionEnvVar = $value['decryption_env_var']; unset($value['decryption_env_var']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['vaultDirectory'])) { $output['vault_directory'] = $this->vaultDirectory; } if (isset($this->_usedProperties['localDotenvFile'])) { $output['local_dotenv_file'] = $this->localDotenvFile; } if (isset($this->_usedProperties['decryptionEnvVar'])) { $output['decryption_env_var'] = $this->decryptionEnvVar; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function magicCall($value) : static { $this->_usedProperties['magicCall'] = \true; $this->magicCall = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function magicGet($value) : static { $this->_usedProperties['magicGet'] = \true; $this->magicGet = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function magicSet($value) : static { $this->_usedProperties['magicSet'] = \true; $this->magicSet = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function throwExceptionOnInvalidIndex($value) : static { $this->_usedProperties['throwExceptionOnInvalidIndex'] = \true; $this->throwExceptionOnInvalidIndex = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function throwExceptionOnInvalidPropertyPath($value) : static { $this->_usedProperties['throwExceptionOnInvalidPropertyPath'] = \true; $this->throwExceptionOnInvalidPropertyPath = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('magic_call', $value)) { $this->_usedProperties['magicCall'] = \true; $this->magicCall = $value['magic_call']; unset($value['magic_call']); } if (\array_key_exists('magic_get', $value)) { $this->_usedProperties['magicGet'] = \true; $this->magicGet = $value['magic_get']; unset($value['magic_get']); } if (\array_key_exists('magic_set', $value)) { $this->_usedProperties['magicSet'] = \true; $this->magicSet = $value['magic_set']; unset($value['magic_set']); } if (\array_key_exists('throw_exception_on_invalid_index', $value)) { $this->_usedProperties['throwExceptionOnInvalidIndex'] = \true; $this->throwExceptionOnInvalidIndex = $value['throw_exception_on_invalid_index']; unset($value['throw_exception_on_invalid_index']); } if (\array_key_exists('throw_exception_on_invalid_property_path', $value)) { $this->_usedProperties['throwExceptionOnInvalidPropertyPath'] = \true; $this->throwExceptionOnInvalidPropertyPath = $value['throw_exception_on_invalid_property_path']; unset($value['throw_exception_on_invalid_property_path']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['magicCall'])) { $output['magic_call'] = $this->magicCall; } if (isset($this->_usedProperties['magicGet'])) { $output['magic_get'] = $this->magicGet; } if (isset($this->_usedProperties['magicSet'])) { $output['magic_set'] = $this->magicSet; } if (isset($this->_usedProperties['throwExceptionOnInvalidIndex'])) { $output['throw_exception_on_invalid_index'] = $this->throwExceptionOnInvalidIndex; } if (isset($this->_usedProperties['throwExceptionOnInvalidPropertyPath'])) { $output['throw_exception_on_invalid_property_path'] = $this->throwExceptionOnInvalidPropertyPath; } return $output; } } _usedProperties['dsn'] = \true; $this->dsn = $value; return $this; } /** * Service id of a custom serializer to use. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function serializer($value) : static { $this->_usedProperties['serializer'] = \true; $this->serializer = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function options(ParamConfigurator|array $value) : static { $this->_usedProperties['options'] = \true; $this->options = $value; return $this; } /** * Transport name to send failed messages to (after all retries have failed). * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureTransport($value) : static { $this->_usedProperties['failureTransport'] = \true; $this->failureTransport = $value; return $this; } /** * @template TValue * @param TValue $value * @default {"service":null,"max_retries":3,"delay":1000,"multiplier":2,"max_delay":0} * @return \Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig : static) */ public function retryStrategy(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig|static { if (!\is_array($value)) { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = $value; return $this; } if (!$this->retryStrategy instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig) { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = new \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "retryStrategy()" has already been initialized. You cannot pass values the second time you call retryStrategy().'); } return $this->retryStrategy; } /** * Rate limiter name to use when processing messages * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function rateLimiter($value) : static { $this->_usedProperties['rateLimiter'] = \true; $this->rateLimiter = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('dsn', $value)) { $this->_usedProperties['dsn'] = \true; $this->dsn = $value['dsn']; unset($value['dsn']); } if (\array_key_exists('serializer', $value)) { $this->_usedProperties['serializer'] = \true; $this->serializer = $value['serializer']; unset($value['serializer']); } if (\array_key_exists('options', $value)) { $this->_usedProperties['options'] = \true; $this->options = $value['options']; unset($value['options']); } if (\array_key_exists('failure_transport', $value)) { $this->_usedProperties['failureTransport'] = \true; $this->failureTransport = $value['failure_transport']; unset($value['failure_transport']); } if (\array_key_exists('retry_strategy', $value)) { $this->_usedProperties['retryStrategy'] = \true; $this->retryStrategy = \is_array($value['retry_strategy']) ? new \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig($value['retry_strategy']) : $value['retry_strategy']; unset($value['retry_strategy']); } if (\array_key_exists('rate_limiter', $value)) { $this->_usedProperties['rateLimiter'] = \true; $this->rateLimiter = $value['rate_limiter']; unset($value['rate_limiter']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['dsn'])) { $output['dsn'] = $this->dsn; } if (isset($this->_usedProperties['serializer'])) { $output['serializer'] = $this->serializer; } if (isset($this->_usedProperties['options'])) { $output['options'] = $this->options; } if (isset($this->_usedProperties['failureTransport'])) { $output['failure_transport'] = $this->failureTransport; } if (isset($this->_usedProperties['retryStrategy'])) { $output['retry_strategy'] = $this->retryStrategy instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\TransportConfig\RetryStrategyConfig ? $this->retryStrategy->toArray() : $this->retryStrategy; } if (isset($this->_usedProperties['rateLimiter'])) { $output['rate_limiter'] = $this->rateLimiter; } return $output; } } _usedProperties['format'] = \true; $this->format = $value; return $this; } /** * @return $this */ public function context(string $name, mixed $value) : static { $this->_usedProperties['context'] = \true; $this->context[$name] = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('format', $value)) { $this->_usedProperties['format'] = \true; $this->format = $value['format']; unset($value['format']); } if (\array_key_exists('context', $value)) { $this->_usedProperties['context'] = \true; $this->context = $value['context']; unset($value['context']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['format'])) { $output['format'] = $this->format; } if (isset($this->_usedProperties['context'])) { $output['context'] = $this->context; } return $output; } } _usedProperties['defaultSerializer'] = \true; $this->defaultSerializer = $value; return $this; } /** * @default {"format":"json","context":[]} */ public function symfonySerializer(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\Serializer\SymfonySerializerConfig { if (null === $this->symfonySerializer) { $this->_usedProperties['symfonySerializer'] = \true; $this->symfonySerializer = new \_ContaoManager\Symfony\Config\Framework\Messenger\Serializer\SymfonySerializerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "symfonySerializer()" has already been initialized. You cannot pass values the second time you call symfonySerializer().'); } return $this->symfonySerializer; } public function __construct(array $value = []) { if (\array_key_exists('default_serializer', $value)) { $this->_usedProperties['defaultSerializer'] = \true; $this->defaultSerializer = $value['default_serializer']; unset($value['default_serializer']); } if (\array_key_exists('symfony_serializer', $value)) { $this->_usedProperties['symfonySerializer'] = \true; $this->symfonySerializer = new \_ContaoManager\Symfony\Config\Framework\Messenger\Serializer\SymfonySerializerConfig($value['symfony_serializer']); unset($value['symfony_serializer']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['defaultSerializer'])) { $output['default_serializer'] = $this->defaultSerializer; } if (isset($this->_usedProperties['symfonySerializer'])) { $output['symfony_serializer'] = $this->symfonySerializer->toArray(); } return $output; } } _usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @default 3 * @param ParamConfigurator|int $value * @return $this */ public function maxRetries($value) : static { $this->_usedProperties['maxRetries'] = \true; $this->maxRetries = $value; return $this; } /** * Time in ms to delay (or the initial value when multiplier is used) * @default 1000 * @param ParamConfigurator|int $value * @return $this */ public function delay($value) : static { $this->_usedProperties['delay'] = \true; $this->delay = $value; return $this; } /** * If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)) * @default 2 * @param ParamConfigurator|float $value * @return $this */ public function multiplier($value) : static { $this->_usedProperties['multiplier'] = \true; $this->multiplier = $value; return $this; } /** * Max time in ms that a retry should ever be delayed (0 = infinite) * @default 0 * @param ParamConfigurator|int $value * @return $this */ public function maxDelay($value) : static { $this->_usedProperties['maxDelay'] = \true; $this->maxDelay = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('max_retries', $value)) { $this->_usedProperties['maxRetries'] = \true; $this->maxRetries = $value['max_retries']; unset($value['max_retries']); } if (\array_key_exists('delay', $value)) { $this->_usedProperties['delay'] = \true; $this->delay = $value['delay']; unset($value['delay']); } if (\array_key_exists('multiplier', $value)) { $this->_usedProperties['multiplier'] = \true; $this->multiplier = $value['multiplier']; unset($value['multiplier']); } if (\array_key_exists('max_delay', $value)) { $this->_usedProperties['maxDelay'] = \true; $this->maxDelay = $value['max_delay']; unset($value['max_delay']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['maxRetries'])) { $output['max_retries'] = $this->maxRetries; } if (isset($this->_usedProperties['delay'])) { $output['delay'] = $this->delay; } if (isset($this->_usedProperties['multiplier'])) { $output['multiplier'] = $this->multiplier; } if (isset($this->_usedProperties['maxDelay'])) { $output['max_delay'] = $this->maxDelay; } return $output; } } $value * * @return $this */ public function senders(ParamConfigurator|array $value) : static { $this->_usedProperties['senders'] = \true; $this->senders = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('senders', $value)) { $this->_usedProperties['senders'] = \true; $this->senders = $value['senders']; unset($value['senders']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['senders'])) { $output['senders'] = $this->senders; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function arguments(ParamConfigurator|array $value) : static { $this->_usedProperties['arguments'] = \true; $this->arguments = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('arguments', $value)) { $this->_usedProperties['arguments'] = \true; $this->arguments = $value['arguments']; unset($value['arguments']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['arguments'])) { $output['arguments'] = $this->arguments; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function allowNoHandlers($value) : static { $this->_usedProperties['allowNoHandlers'] = \true; $this->allowNoHandlers = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function allowNoSenders($value) : static { $this->_usedProperties['allowNoSenders'] = \true; $this->allowNoSenders = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('allow_no_handlers', $value)) { $this->_usedProperties['allowNoHandlers'] = \true; $this->allowNoHandlers = $value['allow_no_handlers']; unset($value['allow_no_handlers']); } if (\array_key_exists('allow_no_senders', $value)) { $this->_usedProperties['allowNoSenders'] = \true; $this->allowNoSenders = $value['allow_no_senders']; unset($value['allow_no_senders']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['allowNoHandlers'])) { $output['allow_no_handlers'] = $this->allowNoHandlers; } if (isset($this->_usedProperties['allowNoSenders'])) { $output['allow_no_senders'] = $this->allowNoSenders; } return $output; } } _usedProperties['defaultMiddleware'] = \true; $this->defaultMiddleware = $value; return $this; } if (!$this->defaultMiddleware instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\DefaultMiddlewareConfig) { $this->_usedProperties['defaultMiddleware'] = \true; $this->defaultMiddleware = new \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\DefaultMiddlewareConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "defaultMiddleware()" has already been initialized. You cannot pass values the second time you call defaultMiddleware().'); } return $this->defaultMiddleware; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Messenger\BusConfig\MiddlewareConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Messenger\BusConfig\MiddlewareConfig : static) */ public function middleware(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\MiddlewareConfig|static { $this->_usedProperties['middleware'] = \true; if (!\is_array($value)) { $this->middleware[] = $value; return $this; } return $this->middleware[] = new \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\MiddlewareConfig($value); } public function __construct(array $value = []) { if (\array_key_exists('default_middleware', $value)) { $this->_usedProperties['defaultMiddleware'] = \true; $this->defaultMiddleware = \is_array($value['default_middleware']) ? new \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\DefaultMiddlewareConfig($value['default_middleware']) : $value['default_middleware']; unset($value['default_middleware']); } if (\array_key_exists('middleware', $value)) { $this->_usedProperties['middleware'] = \true; $this->middleware = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\MiddlewareConfig($v) : $v, $value['middleware']); unset($value['middleware']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['defaultMiddleware'])) { $output['default_middleware'] = $this->defaultMiddleware instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\DefaultMiddlewareConfig ? $this->defaultMiddleware->toArray() : $this->defaultMiddleware; } if (isset($this->_usedProperties['middleware'])) { $output['middleware'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Messenger\BusConfig\MiddlewareConfig ? $v->toArray() : $v, $this->middleware); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * The message bus to use. Defaults to the default bus if the Messenger component is installed. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function messageBus($value) : static { $this->_usedProperties['messageBus'] = \true; $this->messageBus = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function dsn($value) : static { $this->_usedProperties['dsn'] = \true; $this->dsn = $value; return $this; } /** * @return $this */ public function transport(string $name, mixed $value) : static { $this->_usedProperties['transports'] = \true; $this->transports[$name] = $value; return $this; } /** * Mailer Envelope configuration */ public function envelope(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Mailer\EnvelopeConfig { if (null === $this->envelope) { $this->_usedProperties['envelope'] = \true; $this->envelope = new \_ContaoManager\Symfony\Config\Framework\Mailer\EnvelopeConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "envelope()" has already been initialized. You cannot pass values the second time you call envelope().'); } return $this->envelope; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\Mailer\HeaderConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\Mailer\HeaderConfig : static) */ public function header(string $name, mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\Mailer\HeaderConfig|static { if (!\is_array($value)) { $this->_usedProperties['headers'] = \true; $this->headers[$name] = $value; return $this; } if (!isset($this->headers[$name]) || !$this->headers[$name] instanceof \_ContaoManager\Symfony\Config\Framework\Mailer\HeaderConfig) { $this->_usedProperties['headers'] = \true; $this->headers[$name] = new \_ContaoManager\Symfony\Config\Framework\Mailer\HeaderConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "header()" has already been initialized. You cannot pass values the second time you call header().'); } return $this->headers[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('message_bus', $value)) { $this->_usedProperties['messageBus'] = \true; $this->messageBus = $value['message_bus']; unset($value['message_bus']); } if (\array_key_exists('dsn', $value)) { $this->_usedProperties['dsn'] = \true; $this->dsn = $value['dsn']; unset($value['dsn']); } if (\array_key_exists('transports', $value)) { $this->_usedProperties['transports'] = \true; $this->transports = $value['transports']; unset($value['transports']); } if (\array_key_exists('envelope', $value)) { $this->_usedProperties['envelope'] = \true; $this->envelope = new \_ContaoManager\Symfony\Config\Framework\Mailer\EnvelopeConfig($value['envelope']); unset($value['envelope']); } if (\array_key_exists('headers', $value)) { $this->_usedProperties['headers'] = \true; $this->headers = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\Mailer\HeaderConfig($v) : $v, $value['headers']); unset($value['headers']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['messageBus'])) { $output['message_bus'] = $this->messageBus; } if (isset($this->_usedProperties['dsn'])) { $output['dsn'] = $this->dsn; } if (isset($this->_usedProperties['transports'])) { $output['transports'] = $this->transports; } if (isset($this->_usedProperties['envelope'])) { $output['envelope'] = $this->envelope->toArray(); } if (isset($this->_usedProperties['headers'])) { $output['headers'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\Mailer\HeaderConfig ? $v->toArray() : $v, $this->headers); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|7|6|4|1 $value * @return $this */ public function defaultUuidVersion($value) : static { $this->_usedProperties['defaultUuidVersion'] = \true; $this->defaultUuidVersion = $value; return $this; } /** * @default 5 * @param ParamConfigurator|5|3 $value * @return $this */ public function nameBasedUuidVersion($value) : static { $this->_usedProperties['nameBasedUuidVersion'] = \true; $this->nameBasedUuidVersion = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function nameBasedUuidNamespace($value) : static { $this->_usedProperties['nameBasedUuidNamespace'] = \true; $this->nameBasedUuidNamespace = $value; return $this; } /** * @default null * @param ParamConfigurator|7|6|1 $value * @return $this */ public function timeBasedUuidVersion($value) : static { $this->_usedProperties['timeBasedUuidVersion'] = \true; $this->timeBasedUuidVersion = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function timeBasedUuidNode($value) : static { $this->_usedProperties['timeBasedUuidNode'] = \true; $this->timeBasedUuidNode = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('default_uuid_version', $value)) { $this->_usedProperties['defaultUuidVersion'] = \true; $this->defaultUuidVersion = $value['default_uuid_version']; unset($value['default_uuid_version']); } if (\array_key_exists('name_based_uuid_version', $value)) { $this->_usedProperties['nameBasedUuidVersion'] = \true; $this->nameBasedUuidVersion = $value['name_based_uuid_version']; unset($value['name_based_uuid_version']); } if (\array_key_exists('name_based_uuid_namespace', $value)) { $this->_usedProperties['nameBasedUuidNamespace'] = \true; $this->nameBasedUuidNamespace = $value['name_based_uuid_namespace']; unset($value['name_based_uuid_namespace']); } if (\array_key_exists('time_based_uuid_version', $value)) { $this->_usedProperties['timeBasedUuidVersion'] = \true; $this->timeBasedUuidVersion = $value['time_based_uuid_version']; unset($value['time_based_uuid_version']); } if (\array_key_exists('time_based_uuid_node', $value)) { $this->_usedProperties['timeBasedUuidNode'] = \true; $this->timeBasedUuidNode = $value['time_based_uuid_node']; unset($value['time_based_uuid_node']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['defaultUuidVersion'])) { $output['default_uuid_version'] = $this->defaultUuidVersion; } if (isset($this->_usedProperties['nameBasedUuidVersion'])) { $output['name_based_uuid_version'] = $this->nameBasedUuidVersion; } if (isset($this->_usedProperties['nameBasedUuidNamespace'])) { $output['name_based_uuid_namespace'] = $this->nameBasedUuidNamespace; } if (isset($this->_usedProperties['timeBasedUuidVersion'])) { $output['time_based_uuid_version'] = $this->timeBasedUuidVersion; } if (isset($this->_usedProperties['timeBasedUuidNode'])) { $output['time_based_uuid_node'] = $this->timeBasedUuidNode; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @return $this */ public function path(string $namespace, mixed $value) : static { $this->_usedProperties['paths'] = \true; $this->paths[$namespace] = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function excludedPatterns(ParamConfigurator|array $value) : static { $this->_usedProperties['excludedPatterns'] = \true; $this->excludedPatterns = $value; return $this; } /** * If true, any files starting with "." will be excluded from the asset mapper * @default true * @param ParamConfigurator|bool $value * @return $this */ public function excludeDotfiles($value) : static { $this->_usedProperties['excludeDotfiles'] = \true; $this->excludeDotfiles = $value; return $this; } /** * If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default) * @default false * @param ParamConfigurator|bool $value * @return $this */ public function server($value) : static { $this->_usedProperties['server'] = \true; $this->server = $value; return $this; } /** * The public path where the assets will be written to (and served from when "server" is true) * @default '/assets/' * @param ParamConfigurator|mixed $value * @return $this */ public function publicPrefix($value) : static { $this->_usedProperties['publicPrefix'] = \true; $this->publicPrefix = $value; return $this; } /** * Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. * @default 'warn' * @param ParamConfigurator|'strict'|'warn'|'ignore' $value * @return $this */ public function missingImportMode($value) : static { $this->_usedProperties['missingImportMode'] = \true; $this->missingImportMode = $value; return $this; } /** * @return $this */ public function extension(string $extension, mixed $value) : static { $this->_usedProperties['extensions'] = \true; $this->extensions[$extension] = $value; return $this; } /** * The path of the importmap.php file. * @default '%kernel.project_dir%/importmap.php' * @param ParamConfigurator|mixed $value * @return $this */ public function importmapPath($value) : static { $this->_usedProperties['importmapPath'] = \true; $this->importmapPath = $value; return $this; } /** * The importmap name that will be used to load the polyfill. Set to false to disable. * @default 'es-module-shims' * @param ParamConfigurator|mixed $value * @return $this */ public function importmapPolyfill($value) : static { $this->_usedProperties['importmapPolyfill'] = \true; $this->importmapPolyfill = $value; return $this; } /** * @return $this */ public function importmapScriptAttribute(string $key, mixed $value) : static { $this->_usedProperties['importmapScriptAttributes'] = \true; $this->importmapScriptAttributes[$key] = $value; return $this; } /** * The directory to store JavaScript vendors. * @default '%kernel.project_dir%/assets/vendor' * @param ParamConfigurator|mixed $value * @return $this */ public function vendorDir($value) : static { $this->_usedProperties['vendorDir'] = \true; $this->vendorDir = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @deprecated Option "provider" at "asset_mapper" is deprecated and does nothing. Remove it. * @return $this */ public function provider($value) : static { $this->_usedProperties['provider'] = \true; $this->provider = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('paths', $value)) { $this->_usedProperties['paths'] = \true; $this->paths = $value['paths']; unset($value['paths']); } if (\array_key_exists('excluded_patterns', $value)) { $this->_usedProperties['excludedPatterns'] = \true; $this->excludedPatterns = $value['excluded_patterns']; unset($value['excluded_patterns']); } if (\array_key_exists('exclude_dotfiles', $value)) { $this->_usedProperties['excludeDotfiles'] = \true; $this->excludeDotfiles = $value['exclude_dotfiles']; unset($value['exclude_dotfiles']); } if (\array_key_exists('server', $value)) { $this->_usedProperties['server'] = \true; $this->server = $value['server']; unset($value['server']); } if (\array_key_exists('public_prefix', $value)) { $this->_usedProperties['publicPrefix'] = \true; $this->publicPrefix = $value['public_prefix']; unset($value['public_prefix']); } if (\array_key_exists('missing_import_mode', $value)) { $this->_usedProperties['missingImportMode'] = \true; $this->missingImportMode = $value['missing_import_mode']; unset($value['missing_import_mode']); } if (\array_key_exists('extensions', $value)) { $this->_usedProperties['extensions'] = \true; $this->extensions = $value['extensions']; unset($value['extensions']); } if (\array_key_exists('importmap_path', $value)) { $this->_usedProperties['importmapPath'] = \true; $this->importmapPath = $value['importmap_path']; unset($value['importmap_path']); } if (\array_key_exists('importmap_polyfill', $value)) { $this->_usedProperties['importmapPolyfill'] = \true; $this->importmapPolyfill = $value['importmap_polyfill']; unset($value['importmap_polyfill']); } if (\array_key_exists('importmap_script_attributes', $value)) { $this->_usedProperties['importmapScriptAttributes'] = \true; $this->importmapScriptAttributes = $value['importmap_script_attributes']; unset($value['importmap_script_attributes']); } if (\array_key_exists('vendor_dir', $value)) { $this->_usedProperties['vendorDir'] = \true; $this->vendorDir = $value['vendor_dir']; unset($value['vendor_dir']); } if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['paths'])) { $output['paths'] = $this->paths; } if (isset($this->_usedProperties['excludedPatterns'])) { $output['excluded_patterns'] = $this->excludedPatterns; } if (isset($this->_usedProperties['excludeDotfiles'])) { $output['exclude_dotfiles'] = $this->excludeDotfiles; } if (isset($this->_usedProperties['server'])) { $output['server'] = $this->server; } if (isset($this->_usedProperties['publicPrefix'])) { $output['public_prefix'] = $this->publicPrefix; } if (isset($this->_usedProperties['missingImportMode'])) { $output['missing_import_mode'] = $this->missingImportMode; } if (isset($this->_usedProperties['extensions'])) { $output['extensions'] = $this->extensions; } if (isset($this->_usedProperties['importmapPath'])) { $output['importmap_path'] = $this->importmapPath; } if (isset($this->_usedProperties['importmapPolyfill'])) { $output['importmap_polyfill'] = $this->importmapPolyfill; } if (isset($this->_usedProperties['importmapScriptAttributes'])) { $output['importmap_script_attributes'] = $this->importmapScriptAttributes; } if (isset($this->_usedProperties['vendorDir'])) { $output['vendor_dir'] = $this->vendorDir; } if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function sanitizer(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Framework\HtmlSanitizer\SanitizerConfig { if (!isset($this->sanitizers[$name])) { $this->_usedProperties['sanitizers'] = \true; $this->sanitizers[$name] = new \_ContaoManager\Symfony\Config\Framework\HtmlSanitizer\SanitizerConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "sanitizer()" has already been initialized. You cannot pass values the second time you call sanitizer().'); } return $this->sanitizers[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('sanitizers', $value)) { $this->_usedProperties['sanitizers'] = \true; $this->sanitizers = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\HtmlSanitizer\SanitizerConfig($v), $value['sanitizers']); unset($value['sanitizers']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['sanitizers'])) { $output['sanitizers'] = \array_map(fn($v) => $v->toArray(), $this->sanitizers); } return $output; } } _usedProperties['logLevel'] = \true; $this->logLevel = $value; return $this; } /** * The status code of the response. Null or 0 to let Symfony decide. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function statusCode($value) : static { $this->_usedProperties['statusCode'] = \true; $this->statusCode = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('log_level', $value)) { $this->_usedProperties['logLevel'] = \true; $this->logLevel = $value['log_level']; unset($value['log_level']); } if (\array_key_exists('status_code', $value)) { $this->_usedProperties['statusCode'] = \true; $this->statusCode = $value['status_code']; unset($value['status_code']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['logLevel'])) { $output['log_level'] = $this->logLevel; } if (isset($this->_usedProperties['statusCode'])) { $output['status_code'] = $this->statusCode; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default 'session.storage.factory.native' * @param ParamConfigurator|mixed $value * @return $this */ public function storageFactoryId($value) : static { $this->_usedProperties['storageFactoryId'] = \true; $this->storageFactoryId = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function handlerId($value) : static { $this->_usedProperties['handlerId'] = \true; $this->handlerId = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function name($value) : static { $this->_usedProperties['name'] = \true; $this->name = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cookieLifetime($value) : static { $this->_usedProperties['cookieLifetime'] = \true; $this->cookieLifetime = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cookiePath($value) : static { $this->_usedProperties['cookiePath'] = \true; $this->cookiePath = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function cookieDomain($value) : static { $this->_usedProperties['cookieDomain'] = \true; $this->cookieDomain = $value; return $this; } /** * @default null * @param ParamConfigurator|true|false|'auto' $value * @return $this */ public function cookieSecure($value) : static { $this->_usedProperties['cookieSecure'] = \true; $this->cookieSecure = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function cookieHttponly($value) : static { $this->_usedProperties['cookieHttponly'] = \true; $this->cookieHttponly = $value; return $this; } /** * @default null * @param ParamConfigurator|NULL|'lax'|'strict'|'none' $value * @return $this */ public function cookieSamesite($value) : static { $this->_usedProperties['cookieSamesite'] = \true; $this->cookieSamesite = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function useCookies($value) : static { $this->_usedProperties['useCookies'] = \true; $this->useCookies = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function gcDivisor($value) : static { $this->_usedProperties['gcDivisor'] = \true; $this->gcDivisor = $value; return $this; } /** * @default 1 * @param ParamConfigurator|mixed $value * @return $this */ public function gcProbability($value) : static { $this->_usedProperties['gcProbability'] = \true; $this->gcProbability = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function gcMaxlifetime($value) : static { $this->_usedProperties['gcMaxlifetime'] = \true; $this->gcMaxlifetime = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function savePath($value) : static { $this->_usedProperties['savePath'] = \true; $this->savePath = $value; return $this; } /** * seconds to wait between 2 session metadata updates * @default 0 * @param ParamConfigurator|int $value * @return $this */ public function metadataUpdateThreshold($value) : static { $this->_usedProperties['metadataUpdateThreshold'] = \true; $this->metadataUpdateThreshold = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function sidLength($value) : static { $this->_usedProperties['sidLength'] = \true; $this->sidLength = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function sidBitsPerCharacter($value) : static { $this->_usedProperties['sidBitsPerCharacter'] = \true; $this->sidBitsPerCharacter = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('storage_factory_id', $value)) { $this->_usedProperties['storageFactoryId'] = \true; $this->storageFactoryId = $value['storage_factory_id']; unset($value['storage_factory_id']); } if (\array_key_exists('handler_id', $value)) { $this->_usedProperties['handlerId'] = \true; $this->handlerId = $value['handler_id']; unset($value['handler_id']); } if (\array_key_exists('name', $value)) { $this->_usedProperties['name'] = \true; $this->name = $value['name']; unset($value['name']); } if (\array_key_exists('cookie_lifetime', $value)) { $this->_usedProperties['cookieLifetime'] = \true; $this->cookieLifetime = $value['cookie_lifetime']; unset($value['cookie_lifetime']); } if (\array_key_exists('cookie_path', $value)) { $this->_usedProperties['cookiePath'] = \true; $this->cookiePath = $value['cookie_path']; unset($value['cookie_path']); } if (\array_key_exists('cookie_domain', $value)) { $this->_usedProperties['cookieDomain'] = \true; $this->cookieDomain = $value['cookie_domain']; unset($value['cookie_domain']); } if (\array_key_exists('cookie_secure', $value)) { $this->_usedProperties['cookieSecure'] = \true; $this->cookieSecure = $value['cookie_secure']; unset($value['cookie_secure']); } if (\array_key_exists('cookie_httponly', $value)) { $this->_usedProperties['cookieHttponly'] = \true; $this->cookieHttponly = $value['cookie_httponly']; unset($value['cookie_httponly']); } if (\array_key_exists('cookie_samesite', $value)) { $this->_usedProperties['cookieSamesite'] = \true; $this->cookieSamesite = $value['cookie_samesite']; unset($value['cookie_samesite']); } if (\array_key_exists('use_cookies', $value)) { $this->_usedProperties['useCookies'] = \true; $this->useCookies = $value['use_cookies']; unset($value['use_cookies']); } if (\array_key_exists('gc_divisor', $value)) { $this->_usedProperties['gcDivisor'] = \true; $this->gcDivisor = $value['gc_divisor']; unset($value['gc_divisor']); } if (\array_key_exists('gc_probability', $value)) { $this->_usedProperties['gcProbability'] = \true; $this->gcProbability = $value['gc_probability']; unset($value['gc_probability']); } if (\array_key_exists('gc_maxlifetime', $value)) { $this->_usedProperties['gcMaxlifetime'] = \true; $this->gcMaxlifetime = $value['gc_maxlifetime']; unset($value['gc_maxlifetime']); } if (\array_key_exists('save_path', $value)) { $this->_usedProperties['savePath'] = \true; $this->savePath = $value['save_path']; unset($value['save_path']); } if (\array_key_exists('metadata_update_threshold', $value)) { $this->_usedProperties['metadataUpdateThreshold'] = \true; $this->metadataUpdateThreshold = $value['metadata_update_threshold']; unset($value['metadata_update_threshold']); } if (\array_key_exists('sid_length', $value)) { $this->_usedProperties['sidLength'] = \true; $this->sidLength = $value['sid_length']; unset($value['sid_length']); } if (\array_key_exists('sid_bits_per_character', $value)) { $this->_usedProperties['sidBitsPerCharacter'] = \true; $this->sidBitsPerCharacter = $value['sid_bits_per_character']; unset($value['sid_bits_per_character']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['storageFactoryId'])) { $output['storage_factory_id'] = $this->storageFactoryId; } if (isset($this->_usedProperties['handlerId'])) { $output['handler_id'] = $this->handlerId; } if (isset($this->_usedProperties['name'])) { $output['name'] = $this->name; } if (isset($this->_usedProperties['cookieLifetime'])) { $output['cookie_lifetime'] = $this->cookieLifetime; } if (isset($this->_usedProperties['cookiePath'])) { $output['cookie_path'] = $this->cookiePath; } if (isset($this->_usedProperties['cookieDomain'])) { $output['cookie_domain'] = $this->cookieDomain; } if (isset($this->_usedProperties['cookieSecure'])) { $output['cookie_secure'] = $this->cookieSecure; } if (isset($this->_usedProperties['cookieHttponly'])) { $output['cookie_httponly'] = $this->cookieHttponly; } if (isset($this->_usedProperties['cookieSamesite'])) { $output['cookie_samesite'] = $this->cookieSamesite; } if (isset($this->_usedProperties['useCookies'])) { $output['use_cookies'] = $this->useCookies; } if (isset($this->_usedProperties['gcDivisor'])) { $output['gc_divisor'] = $this->gcDivisor; } if (isset($this->_usedProperties['gcProbability'])) { $output['gc_probability'] = $this->gcProbability; } if (isset($this->_usedProperties['gcMaxlifetime'])) { $output['gc_maxlifetime'] = $this->gcMaxlifetime; } if (isset($this->_usedProperties['savePath'])) { $output['save_path'] = $this->savePath; } if (isset($this->_usedProperties['metadataUpdateThreshold'])) { $output['metadata_update_threshold'] = $this->metadataUpdateThreshold; } if (isset($this->_usedProperties['sidLength'])) { $output['sid_length'] = $this->sidLength; } if (isset($this->_usedProperties['sidBitsPerCharacter'])) { $output['sid_bits_per_character'] = $this->sidBitsPerCharacter; } return $output; } } _usedProperties['allowSafeElements'] = \true; $this->allowSafeElements = $value; return $this; } /** * Allows all static elements and attributes from the W3C Sanitizer API standard. * @default false * @param ParamConfigurator|bool $value * @return $this */ public function allowStaticElements($value) : static { $this->_usedProperties['allowStaticElements'] = \true; $this->allowStaticElements = $value; return $this; } /** * @return $this */ public function allowElement(string $name, mixed $value) : static { $this->_usedProperties['allowElements'] = \true; $this->allowElements[$name] = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function blockElements(ParamConfigurator|string|array $value) : static { $this->_usedProperties['blockElements'] = \true; $this->blockElements = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function dropElements(ParamConfigurator|string|array $value) : static { $this->_usedProperties['dropElements'] = \true; $this->dropElements = $value; return $this; } /** * @return $this */ public function allowAttribute(string $name, mixed $value) : static { $this->_usedProperties['allowAttributes'] = \true; $this->allowAttributes[$name] = $value; return $this; } /** * @return $this */ public function dropAttribute(string $name, mixed $value) : static { $this->_usedProperties['dropAttributes'] = \true; $this->dropAttributes[$name] = $value; return $this; } /** * @return $this */ public function forceAttribute(string $name, ParamConfigurator|array $value) : static { $this->_usedProperties['forceAttributes'] = \true; $this->forceAttributes[$name] = $value; return $this; } /** * Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. * @default false * @param ParamConfigurator|bool $value * @return $this */ public function forceHttpsUrls($value) : static { $this->_usedProperties['forceHttpsUrls'] = \true; $this->forceHttpsUrls = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function allowedLinkSchemes(ParamConfigurator|array $value) : static { $this->_usedProperties['allowedLinkSchemes'] = \true; $this->allowedLinkSchemes = $value; return $this; } /** * Allows only a given list of hosts to be used in links href attributes. * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function allowedLinkHosts(mixed $value = NULL) : static { $this->_usedProperties['allowedLinkHosts'] = \true; $this->allowedLinkHosts = $value; return $this; } /** * Allows relative URLs to be used in links href attributes. * @default false * @param ParamConfigurator|bool $value * @return $this */ public function allowRelativeLinks($value) : static { $this->_usedProperties['allowRelativeLinks'] = \true; $this->allowRelativeLinks = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function allowedMediaSchemes(ParamConfigurator|array $value) : static { $this->_usedProperties['allowedMediaSchemes'] = \true; $this->allowedMediaSchemes = $value; return $this; } /** * Allows only a given list of hosts to be used in media source attributes (img, audio, video, ...). * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function allowedMediaHosts(mixed $value = NULL) : static { $this->_usedProperties['allowedMediaHosts'] = \true; $this->allowedMediaHosts = $value; return $this; } /** * Allows relative URLs to be used in media source attributes (img, audio, video, ...). * @default false * @param ParamConfigurator|bool $value * @return $this */ public function allowRelativeMedias($value) : static { $this->_usedProperties['allowRelativeMedias'] = \true; $this->allowRelativeMedias = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function withAttributeSanitizers(ParamConfigurator|array $value) : static { $this->_usedProperties['withAttributeSanitizers'] = \true; $this->withAttributeSanitizers = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function withoutAttributeSanitizers(ParamConfigurator|array $value) : static { $this->_usedProperties['withoutAttributeSanitizers'] = \true; $this->withoutAttributeSanitizers = $value; return $this; } /** * The maximum length allowed for the sanitized input. * @default 0 * @param ParamConfigurator|int $value * @return $this */ public function maxInputLength($value) : static { $this->_usedProperties['maxInputLength'] = \true; $this->maxInputLength = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('allow_safe_elements', $value)) { $this->_usedProperties['allowSafeElements'] = \true; $this->allowSafeElements = $value['allow_safe_elements']; unset($value['allow_safe_elements']); } if (\array_key_exists('allow_static_elements', $value)) { $this->_usedProperties['allowStaticElements'] = \true; $this->allowStaticElements = $value['allow_static_elements']; unset($value['allow_static_elements']); } if (\array_key_exists('allow_elements', $value)) { $this->_usedProperties['allowElements'] = \true; $this->allowElements = $value['allow_elements']; unset($value['allow_elements']); } if (\array_key_exists('block_elements', $value)) { $this->_usedProperties['blockElements'] = \true; $this->blockElements = $value['block_elements']; unset($value['block_elements']); } if (\array_key_exists('drop_elements', $value)) { $this->_usedProperties['dropElements'] = \true; $this->dropElements = $value['drop_elements']; unset($value['drop_elements']); } if (\array_key_exists('allow_attributes', $value)) { $this->_usedProperties['allowAttributes'] = \true; $this->allowAttributes = $value['allow_attributes']; unset($value['allow_attributes']); } if (\array_key_exists('drop_attributes', $value)) { $this->_usedProperties['dropAttributes'] = \true; $this->dropAttributes = $value['drop_attributes']; unset($value['drop_attributes']); } if (\array_key_exists('force_attributes', $value)) { $this->_usedProperties['forceAttributes'] = \true; $this->forceAttributes = $value['force_attributes']; unset($value['force_attributes']); } if (\array_key_exists('force_https_urls', $value)) { $this->_usedProperties['forceHttpsUrls'] = \true; $this->forceHttpsUrls = $value['force_https_urls']; unset($value['force_https_urls']); } if (\array_key_exists('allowed_link_schemes', $value)) { $this->_usedProperties['allowedLinkSchemes'] = \true; $this->allowedLinkSchemes = $value['allowed_link_schemes']; unset($value['allowed_link_schemes']); } if (\array_key_exists('allowed_link_hosts', $value)) { $this->_usedProperties['allowedLinkHosts'] = \true; $this->allowedLinkHosts = $value['allowed_link_hosts']; unset($value['allowed_link_hosts']); } if (\array_key_exists('allow_relative_links', $value)) { $this->_usedProperties['allowRelativeLinks'] = \true; $this->allowRelativeLinks = $value['allow_relative_links']; unset($value['allow_relative_links']); } if (\array_key_exists('allowed_media_schemes', $value)) { $this->_usedProperties['allowedMediaSchemes'] = \true; $this->allowedMediaSchemes = $value['allowed_media_schemes']; unset($value['allowed_media_schemes']); } if (\array_key_exists('allowed_media_hosts', $value)) { $this->_usedProperties['allowedMediaHosts'] = \true; $this->allowedMediaHosts = $value['allowed_media_hosts']; unset($value['allowed_media_hosts']); } if (\array_key_exists('allow_relative_medias', $value)) { $this->_usedProperties['allowRelativeMedias'] = \true; $this->allowRelativeMedias = $value['allow_relative_medias']; unset($value['allow_relative_medias']); } if (\array_key_exists('with_attribute_sanitizers', $value)) { $this->_usedProperties['withAttributeSanitizers'] = \true; $this->withAttributeSanitizers = $value['with_attribute_sanitizers']; unset($value['with_attribute_sanitizers']); } if (\array_key_exists('without_attribute_sanitizers', $value)) { $this->_usedProperties['withoutAttributeSanitizers'] = \true; $this->withoutAttributeSanitizers = $value['without_attribute_sanitizers']; unset($value['without_attribute_sanitizers']); } if (\array_key_exists('max_input_length', $value)) { $this->_usedProperties['maxInputLength'] = \true; $this->maxInputLength = $value['max_input_length']; unset($value['max_input_length']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['allowSafeElements'])) { $output['allow_safe_elements'] = $this->allowSafeElements; } if (isset($this->_usedProperties['allowStaticElements'])) { $output['allow_static_elements'] = $this->allowStaticElements; } if (isset($this->_usedProperties['allowElements'])) { $output['allow_elements'] = $this->allowElements; } if (isset($this->_usedProperties['blockElements'])) { $output['block_elements'] = $this->blockElements; } if (isset($this->_usedProperties['dropElements'])) { $output['drop_elements'] = $this->dropElements; } if (isset($this->_usedProperties['allowAttributes'])) { $output['allow_attributes'] = $this->allowAttributes; } if (isset($this->_usedProperties['dropAttributes'])) { $output['drop_attributes'] = $this->dropAttributes; } if (isset($this->_usedProperties['forceAttributes'])) { $output['force_attributes'] = $this->forceAttributes; } if (isset($this->_usedProperties['forceHttpsUrls'])) { $output['force_https_urls'] = $this->forceHttpsUrls; } if (isset($this->_usedProperties['allowedLinkSchemes'])) { $output['allowed_link_schemes'] = $this->allowedLinkSchemes; } if (isset($this->_usedProperties['allowedLinkHosts'])) { $output['allowed_link_hosts'] = $this->allowedLinkHosts; } if (isset($this->_usedProperties['allowRelativeLinks'])) { $output['allow_relative_links'] = $this->allowRelativeLinks; } if (isset($this->_usedProperties['allowedMediaSchemes'])) { $output['allowed_media_schemes'] = $this->allowedMediaSchemes; } if (isset($this->_usedProperties['allowedMediaHosts'])) { $output['allowed_media_hosts'] = $this->allowedMediaHosts; } if (isset($this->_usedProperties['allowRelativeMedias'])) { $output['allow_relative_medias'] = $this->allowRelativeMedias; } if (isset($this->_usedProperties['withAttributeSanitizers'])) { $output['with_attribute_sanitizers'] = $this->withAttributeSanitizers; } if (isset($this->_usedProperties['withoutAttributeSanitizers'])) { $output['without_attribute_sanitizers'] = $this->withoutAttributeSanitizers; } if (isset($this->_usedProperties['maxInputLength'])) { $output['max_input_length'] = $this->maxInputLength; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * The maximum number of connections to a single host. * @default null * @param ParamConfigurator|int $value * @return $this */ public function maxHostConnections($value) : static { $this->_usedProperties['maxHostConnections'] = \true; $this->maxHostConnections = $value; return $this; } public function defaultOptions(array $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptionsConfig { if (null === $this->defaultOptions) { $this->_usedProperties['defaultOptions'] = \true; $this->defaultOptions = new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptionsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "defaultOptions()" has already been initialized. You cannot pass values the second time you call defaultOptions().'); } return $this->defaultOptions; } /** * The id of the service that should generate mock responses. It should be either an invokable or an iterable. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function mockResponseFactory($value) : static { $this->_usedProperties['mockResponseFactory'] = \true; $this->mockResponseFactory = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Framework\HttpClient\ScopedClientConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpClient\ScopedClientConfig : static) */ public function scopedClient(string $name, mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig|static { if (!\is_array($value)) { $this->_usedProperties['scopedClients'] = \true; $this->scopedClients[$name] = $value; return $this; } if (!isset($this->scopedClients[$name]) || !$this->scopedClients[$name] instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig) { $this->_usedProperties['scopedClients'] = \true; $this->scopedClients[$name] = new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "scopedClient()" has already been initialized. You cannot pass values the second time you call scopedClient().'); } return $this->scopedClients[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('max_host_connections', $value)) { $this->_usedProperties['maxHostConnections'] = \true; $this->maxHostConnections = $value['max_host_connections']; unset($value['max_host_connections']); } if (\array_key_exists('default_options', $value)) { $this->_usedProperties['defaultOptions'] = \true; $this->defaultOptions = new \_ContaoManager\Symfony\Config\Framework\HttpClient\DefaultOptionsConfig($value['default_options']); unset($value['default_options']); } if (\array_key_exists('mock_response_factory', $value)) { $this->_usedProperties['mockResponseFactory'] = \true; $this->mockResponseFactory = $value['mock_response_factory']; unset($value['mock_response_factory']); } if (\array_key_exists('scoped_clients', $value)) { $this->_usedProperties['scopedClients'] = \true; $this->scopedClients = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig($v) : $v, $value['scoped_clients']); unset($value['scoped_clients']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['maxHostConnections'])) { $output['max_host_connections'] = $this->maxHostConnections; } if (isset($this->_usedProperties['defaultOptions'])) { $output['default_options'] = $this->defaultOptions->toArray(); } if (isset($this->_usedProperties['mockResponseFactory'])) { $output['mock_response_factory'] = $this->mockResponseFactory; } if (isset($this->_usedProperties['scopedClients'])) { $output['scoped_clients'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\HttpClient\ScopedClientConfig ? $v->toArray() : $v, $this->scopedClients); } return $output; } } _usedProperties['log'] = \true; $this->log = $value; return $this; } /** * Throw PHP errors as \ErrorException instances. * @default false * @param ParamConfigurator|bool $value * @return $this */ public function throw($value) : static { $this->_usedProperties['throw'] = \true; $this->throw = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('log', $value)) { $this->_usedProperties['log'] = \true; $this->log = $value['log']; unset($value['log']); } if (\array_key_exists('throw', $value)) { $this->_usedProperties['throw'] = \true; $this->throw = $value['throw']; unset($value['throw']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['log'])) { $output['log'] = $this->log; } if (isset($this->_usedProperties['throw'])) { $output['throw'] = $this->throw; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * The message bus to use. Defaults to the default bus if the Messenger component is installed. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function messageBus($value) : static { $this->_usedProperties['messageBus'] = \true; $this->messageBus = $value; return $this; } /** * @return $this */ public function chatterTransport(string $name, mixed $value) : static { $this->_usedProperties['chatterTransports'] = \true; $this->chatterTransports[$name] = $value; return $this; } /** * @return $this */ public function texterTransport(string $name, mixed $value) : static { $this->_usedProperties['texterTransports'] = \true; $this->texterTransports[$name] = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function notificationOnFailedMessages($value) : static { $this->_usedProperties['notificationOnFailedMessages'] = \true; $this->notificationOnFailedMessages = $value; return $this; } /** * @return $this */ public function channelPolicy(string $name, ParamConfigurator|string|array $value) : static { $this->_usedProperties['channelPolicy'] = \true; $this->channelPolicy[$name] = $value; return $this; } public function adminRecipient(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Notifier\AdminRecipientConfig { $this->_usedProperties['adminRecipients'] = \true; return $this->adminRecipients[] = new \_ContaoManager\Symfony\Config\Framework\Notifier\AdminRecipientConfig($value); } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('message_bus', $value)) { $this->_usedProperties['messageBus'] = \true; $this->messageBus = $value['message_bus']; unset($value['message_bus']); } if (\array_key_exists('chatter_transports', $value)) { $this->_usedProperties['chatterTransports'] = \true; $this->chatterTransports = $value['chatter_transports']; unset($value['chatter_transports']); } if (\array_key_exists('texter_transports', $value)) { $this->_usedProperties['texterTransports'] = \true; $this->texterTransports = $value['texter_transports']; unset($value['texter_transports']); } if (\array_key_exists('notification_on_failed_messages', $value)) { $this->_usedProperties['notificationOnFailedMessages'] = \true; $this->notificationOnFailedMessages = $value['notification_on_failed_messages']; unset($value['notification_on_failed_messages']); } if (\array_key_exists('channel_policy', $value)) { $this->_usedProperties['channelPolicy'] = \true; $this->channelPolicy = $value['channel_policy']; unset($value['channel_policy']); } if (\array_key_exists('admin_recipients', $value)) { $this->_usedProperties['adminRecipients'] = \true; $this->adminRecipients = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Framework\Notifier\AdminRecipientConfig($v), $value['admin_recipients']); unset($value['admin_recipients']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['messageBus'])) { $output['message_bus'] = $this->messageBus; } if (isset($this->_usedProperties['chatterTransports'])) { $output['chatter_transports'] = $this->chatterTransports; } if (isset($this->_usedProperties['texterTransports'])) { $output['texter_transports'] = $this->texterTransports; } if (isset($this->_usedProperties['notificationOnFailedMessages'])) { $output['notification_on_failed_messages'] = $this->notificationOnFailedMessages; } if (isset($this->_usedProperties['channelPolicy'])) { $output['channel_policy'] = $this->channelPolicy; } if (isset($this->_usedProperties['adminRecipients'])) { $output['admin_recipients'] = \array_map(fn($v) => $v->toArray(), $this->adminRecipients); } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @return $this */ public function format(string $name, mixed $value) : static { $this->_usedProperties['formats'] = \true; $this->formats[$name] = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('formats', $value)) { $this->_usedProperties['formats'] = \true; $this->formats = $value['formats']; unset($value['formats']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['formats'])) { $output['formats'] = $this->formats; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default 'php_array' * @param ParamConfigurator|'none'|'php_array'|'file' $value * @return $this */ public function cache($value) : static { $this->_usedProperties['cache'] = \true; $this->cache = $value; return $this; } /** * @default '%kernel.cache_dir%/annotations' * @param ParamConfigurator|mixed $value * @return $this */ public function fileCacheDir($value) : static { $this->_usedProperties['fileCacheDir'] = \true; $this->fileCacheDir = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function debug($value) : static { $this->_usedProperties['debug'] = \true; $this->debug = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('cache', $value)) { $this->_usedProperties['cache'] = \true; $this->cache = $value['cache']; unset($value['cache']); } if (\array_key_exists('file_cache_dir', $value)) { $this->_usedProperties['fileCacheDir'] = \true; $this->fileCacheDir = $value['file_cache_dir']; unset($value['file_cache_dir']); } if (\array_key_exists('debug', $value)) { $this->_usedProperties['debug'] = \true; $this->debug = $value['debug']; unset($value['debug']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['cache'])) { $output['cache'] = $this->cache; } if (isset($this->_usedProperties['fileCacheDir'])) { $output['file_cache_dir'] = $this->fileCacheDir; } if (isset($this->_usedProperties['debug'])) { $output['debug'] = $this->debug; } return $output; } } _usedProperties['strictMode'] = \true; $this->strictMode = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function versionStrategy($value) : static { $this->_usedProperties['versionStrategy'] = \true; $this->versionStrategy = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function version($value) : static { $this->_usedProperties['version'] = \true; $this->version = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function versionFormat($value) : static { $this->_usedProperties['versionFormat'] = \true; $this->versionFormat = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function jsonManifestPath($value) : static { $this->_usedProperties['jsonManifestPath'] = \true; $this->jsonManifestPath = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function basePath($value) : static { $this->_usedProperties['basePath'] = \true; $this->basePath = $value; return $this; } /** * @param ParamConfigurator|list|mixed $value * * @return $this */ public function baseUrls(mixed $value) : static { $this->_usedProperties['baseUrls'] = \true; $this->baseUrls = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('strict_mode', $value)) { $this->_usedProperties['strictMode'] = \true; $this->strictMode = $value['strict_mode']; unset($value['strict_mode']); } if (\array_key_exists('version_strategy', $value)) { $this->_usedProperties['versionStrategy'] = \true; $this->versionStrategy = $value['version_strategy']; unset($value['version_strategy']); } if (\array_key_exists('version', $value)) { $this->_usedProperties['version'] = \true; $this->version = $value['version']; unset($value['version']); } if (\array_key_exists('version_format', $value)) { $this->_usedProperties['versionFormat'] = \true; $this->versionFormat = $value['version_format']; unset($value['version_format']); } if (\array_key_exists('json_manifest_path', $value)) { $this->_usedProperties['jsonManifestPath'] = \true; $this->jsonManifestPath = $value['json_manifest_path']; unset($value['json_manifest_path']); } if (\array_key_exists('base_path', $value)) { $this->_usedProperties['basePath'] = \true; $this->basePath = $value['base_path']; unset($value['base_path']); } if (\array_key_exists('base_urls', $value)) { $this->_usedProperties['baseUrls'] = \true; $this->baseUrls = $value['base_urls']; unset($value['base_urls']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['strictMode'])) { $output['strict_mode'] = $this->strictMode; } if (isset($this->_usedProperties['versionStrategy'])) { $output['version_strategy'] = $this->versionStrategy; } if (isset($this->_usedProperties['version'])) { $output['version'] = $this->version; } if (isset($this->_usedProperties['versionFormat'])) { $output['version_format'] = $this->versionFormat; } if (isset($this->_usedProperties['jsonManifestPath'])) { $output['json_manifest_path'] = $this->jsonManifestPath; } if (isset($this->_usedProperties['basePath'])) { $output['base_path'] = $this->basePath; } if (isset($this->_usedProperties['baseUrls'])) { $output['base_urls'] = $this->baseUrls; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * API endpoint for the NotCompromisedPassword Validator. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function endpoint($value) : static { $this->_usedProperties['endpoint'] = \true; $this->endpoint = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('endpoint', $value)) { $this->_usedProperties['endpoint'] = \true; $this->endpoint = $value['endpoint']; unset($value['endpoint']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['endpoint'])) { $output['endpoint'] = $this->endpoint; } return $output; } } $value * * @return $this */ public function paths(ParamConfigurator|array $value) : static { $this->_usedProperties['paths'] = \true; $this->paths = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('paths', $value)) { $this->_usedProperties['paths'] = \true; $this->paths = $value['paths']; unset($value['paths']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['paths'])) { $output['paths'] = $this->paths; } return $output; } } $value * * @return $this */ public function services(ParamConfigurator|array $value) : static { $this->_usedProperties['services'] = \true; $this->services = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('services', $value)) { $this->_usedProperties['services'] = \true; $this->services = $value['services']; unset($value['services']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['services'])) { $output['services'] = $this->services; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @return $this */ public function resource(string $name, ParamConfigurator|string|array $value) : static { $this->_usedProperties['resources'] = \true; $this->resources[$name] = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('resources', $value)) { $this->_usedProperties['resources'] = \true; $this->resources = $value['resources']; unset($value['resources']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['resources'])) { $output['resources'] = $this->resources; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default {"enabled":null,"field_name":"_token"} */ public function csrfProtection(array $value = []) : \_ContaoManager\Symfony\Config\Framework\Form\CsrfProtectionConfig { if (null === $this->csrfProtection) { $this->_usedProperties['csrfProtection'] = \true; $this->csrfProtection = new \_ContaoManager\Symfony\Config\Framework\Form\CsrfProtectionConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "csrfProtection()" has already been initialized. You cannot pass values the second time you call csrfProtection().'); } return $this->csrfProtection; } /** * @default null * @param ParamConfigurator|bool $value * @deprecated The child node "legacy_error_messages" at path "form" is deprecated. * @return $this */ public function legacyErrorMessages($value) : static { $this->_usedProperties['legacyErrorMessages'] = \true; $this->legacyErrorMessages = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('csrf_protection', $value)) { $this->_usedProperties['csrfProtection'] = \true; $this->csrfProtection = new \_ContaoManager\Symfony\Config\Framework\Form\CsrfProtectionConfig($value['csrf_protection']); unset($value['csrf_protection']); } if (\array_key_exists('legacy_error_messages', $value)) { $this->_usedProperties['legacyErrorMessages'] = \true; $this->legacyErrorMessages = $value['legacy_error_messages']; unset($value['legacy_error_messages']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['csrfProtection'])) { $output['csrf_protection'] = $this->csrfProtection->toArray(); } if (isset($this->_usedProperties['legacyErrorMessages'])) { $output['legacy_error_messages'] = $this->legacyErrorMessages; } return $output; } } _usedProperties['password'] = \true; $this->password = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function roles(ParamConfigurator|string|array $value) : static { $this->_usedProperties['roles'] = \true; $this->roles = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('password', $value)) { $this->_usedProperties['password'] = \true; $this->password = $value['password']; unset($value['password']); } if (\array_key_exists('roles', $value)) { $this->_usedProperties['roles'] = \true; $this->roles = $value['roles']; unset($value['roles']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['password'])) { $output['password'] = $this->password; } if (isset($this->_usedProperties['roles'])) { $output['roles'] = $this->roles; } return $output; } } _usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function baseDn($value) : static { $this->_usedProperties['baseDn'] = \true; $this->baseDn = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function searchDn($value) : static { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function searchPassword($value) : static { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function extraFields(ParamConfigurator|array $value) : static { $this->_usedProperties['extraFields'] = \true; $this->extraFields = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function defaultRoles(ParamConfigurator|string|array $value) : static { $this->_usedProperties['defaultRoles'] = \true; $this->defaultRoles = $value; return $this; } /** * @default 'sAMAccountName' * @param ParamConfigurator|mixed $value * @return $this */ public function uidKey($value) : static { $this->_usedProperties['uidKey'] = \true; $this->uidKey = $value; return $this; } /** * @default '({uid_key}={username})' * @param ParamConfigurator|mixed $value * @return $this */ public function filter($value) : static { $this->_usedProperties['filter'] = \true; $this->filter = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function passwordAttribute($value) : static { $this->_usedProperties['passwordAttribute'] = \true; $this->passwordAttribute = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('base_dn', $value)) { $this->_usedProperties['baseDn'] = \true; $this->baseDn = $value['base_dn']; unset($value['base_dn']); } if (\array_key_exists('search_dn', $value)) { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value['search_dn']; unset($value['search_dn']); } if (\array_key_exists('search_password', $value)) { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value['search_password']; unset($value['search_password']); } if (\array_key_exists('extra_fields', $value)) { $this->_usedProperties['extraFields'] = \true; $this->extraFields = $value['extra_fields']; unset($value['extra_fields']); } if (\array_key_exists('default_roles', $value)) { $this->_usedProperties['defaultRoles'] = \true; $this->defaultRoles = $value['default_roles']; unset($value['default_roles']); } if (\array_key_exists('uid_key', $value)) { $this->_usedProperties['uidKey'] = \true; $this->uidKey = $value['uid_key']; unset($value['uid_key']); } if (\array_key_exists('filter', $value)) { $this->_usedProperties['filter'] = \true; $this->filter = $value['filter']; unset($value['filter']); } if (\array_key_exists('password_attribute', $value)) { $this->_usedProperties['passwordAttribute'] = \true; $this->passwordAttribute = $value['password_attribute']; unset($value['password_attribute']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['baseDn'])) { $output['base_dn'] = $this->baseDn; } if (isset($this->_usedProperties['searchDn'])) { $output['search_dn'] = $this->searchDn; } if (isset($this->_usedProperties['searchPassword'])) { $output['search_password'] = $this->searchPassword; } if (isset($this->_usedProperties['extraFields'])) { $output['extra_fields'] = $this->extraFields; } if (isset($this->_usedProperties['defaultRoles'])) { $output['default_roles'] = $this->defaultRoles; } if (isset($this->_usedProperties['uidKey'])) { $output['uid_key'] = $this->uidKey; } if (isset($this->_usedProperties['filter'])) { $output['filter'] = $this->filter; } if (isset($this->_usedProperties['passwordAttribute'])) { $output['password_attribute'] = $this->passwordAttribute; } return $output; } } users[$identifier])) { $this->_usedProperties['users'] = \true; $this->users[$identifier] = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\Memory\UserConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "user()" has already been initialized. You cannot pass values the second time you call user().'); } return $this->users[$identifier]; } public function __construct(array $value = []) { if (\array_key_exists('users', $value)) { $this->_usedProperties['users'] = \true; $this->users = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Security\ProviderConfig\Memory\UserConfig($v), $value['users']); unset($value['users']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['users'])) { $output['users'] = \array_map(fn($v) => $v->toArray(), $this->users); } return $output; } } |string $value * * @return $this */ public function providers(ParamConfigurator|string|array $value) : static { $this->_usedProperties['providers'] = \true; $this->providers = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('providers', $value)) { $this->_usedProperties['providers'] = \true; $this->providers = $value['providers']; unset($value['providers']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['providers'])) { $output['providers'] = $this->providers; } return $output; } } _usedProperties['algorithm'] = \true; $this->algorithm = $value; return $this; } /** * @param ParamConfigurator|list|mixed $value * * @return $this */ public function migrateFrom(mixed $value) : static { $this->_usedProperties['migrateFrom'] = \true; $this->migrateFrom = $value; return $this; } /** * Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. * @default 'sha512' * @param ParamConfigurator|mixed $value * @return $this */ public function hashAlgorithm($value) : static { $this->_usedProperties['hashAlgorithm'] = \true; $this->hashAlgorithm = $value; return $this; } /** * @default 40 * @param ParamConfigurator|mixed $value * @return $this */ public function keyLength($value) : static { $this->_usedProperties['keyLength'] = \true; $this->keyLength = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function ignoreCase($value) : static { $this->_usedProperties['ignoreCase'] = \true; $this->ignoreCase = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function encodeAsBase64($value) : static { $this->_usedProperties['encodeAsBase64'] = \true; $this->encodeAsBase64 = $value; return $this; } /** * @default 5000 * @param ParamConfigurator|mixed $value * @return $this */ public function iterations($value) : static { $this->_usedProperties['iterations'] = \true; $this->iterations = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function cost($value) : static { $this->_usedProperties['cost'] = \true; $this->cost = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function memoryCost($value) : static { $this->_usedProperties['memoryCost'] = \true; $this->memoryCost = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function timeCost($value) : static { $this->_usedProperties['timeCost'] = \true; $this->timeCost = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function id($value) : static { $this->_usedProperties['id'] = \true; $this->id = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('algorithm', $value)) { $this->_usedProperties['algorithm'] = \true; $this->algorithm = $value['algorithm']; unset($value['algorithm']); } if (\array_key_exists('migrate_from', $value)) { $this->_usedProperties['migrateFrom'] = \true; $this->migrateFrom = $value['migrate_from']; unset($value['migrate_from']); } if (\array_key_exists('hash_algorithm', $value)) { $this->_usedProperties['hashAlgorithm'] = \true; $this->hashAlgorithm = $value['hash_algorithm']; unset($value['hash_algorithm']); } if (\array_key_exists('key_length', $value)) { $this->_usedProperties['keyLength'] = \true; $this->keyLength = $value['key_length']; unset($value['key_length']); } if (\array_key_exists('ignore_case', $value)) { $this->_usedProperties['ignoreCase'] = \true; $this->ignoreCase = $value['ignore_case']; unset($value['ignore_case']); } if (\array_key_exists('encode_as_base64', $value)) { $this->_usedProperties['encodeAsBase64'] = \true; $this->encodeAsBase64 = $value['encode_as_base64']; unset($value['encode_as_base64']); } if (\array_key_exists('iterations', $value)) { $this->_usedProperties['iterations'] = \true; $this->iterations = $value['iterations']; unset($value['iterations']); } if (\array_key_exists('cost', $value)) { $this->_usedProperties['cost'] = \true; $this->cost = $value['cost']; unset($value['cost']); } if (\array_key_exists('memory_cost', $value)) { $this->_usedProperties['memoryCost'] = \true; $this->memoryCost = $value['memory_cost']; unset($value['memory_cost']); } if (\array_key_exists('time_cost', $value)) { $this->_usedProperties['timeCost'] = \true; $this->timeCost = $value['time_cost']; unset($value['time_cost']); } if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['algorithm'])) { $output['algorithm'] = $this->algorithm; } if (isset($this->_usedProperties['migrateFrom'])) { $output['migrate_from'] = $this->migrateFrom; } if (isset($this->_usedProperties['hashAlgorithm'])) { $output['hash_algorithm'] = $this->hashAlgorithm; } if (isset($this->_usedProperties['keyLength'])) { $output['key_length'] = $this->keyLength; } if (isset($this->_usedProperties['ignoreCase'])) { $output['ignore_case'] = $this->ignoreCase; } if (isset($this->_usedProperties['encodeAsBase64'])) { $output['encode_as_base64'] = $this->encodeAsBase64; } if (isset($this->_usedProperties['iterations'])) { $output['iterations'] = $this->iterations; } if (isset($this->_usedProperties['cost'])) { $output['cost'] = $this->cost; } if (isset($this->_usedProperties['memoryCost'])) { $output['memory_cost'] = $this->memoryCost; } if (isset($this->_usedProperties['timeCost'])) { $output['time_cost'] = $this->timeCost; } if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } public function chain(array $value = []) : \_ContaoManager\Symfony\Config\Security\ProviderConfig\ChainConfig { if (null === $this->chain) { $this->_usedProperties['chain'] = \true; $this->chain = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\ChainConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "chain()" has already been initialized. You cannot pass values the second time you call chain().'); } return $this->chain; } public function memory(array $value = []) : \_ContaoManager\Symfony\Config\Security\ProviderConfig\MemoryConfig { if (null === $this->memory) { $this->_usedProperties['memory'] = \true; $this->memory = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\MemoryConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "memory()" has already been initialized. You cannot pass values the second time you call memory().'); } return $this->memory; } public function ldap(array $value = []) : \_ContaoManager\Symfony\Config\Security\ProviderConfig\LdapConfig { if (null === $this->ldap) { $this->_usedProperties['ldap'] = \true; $this->ldap = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\LdapConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "ldap()" has already been initialized. You cannot pass values the second time you call ldap().'); } return $this->ldap; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('chain', $value)) { $this->_usedProperties['chain'] = \true; $this->chain = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\ChainConfig($value['chain']); unset($value['chain']); } if (\array_key_exists('memory', $value)) { $this->_usedProperties['memory'] = \true; $this->memory = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\MemoryConfig($value['memory']); unset($value['memory']); } if (\array_key_exists('ldap', $value)) { $this->_usedProperties['ldap'] = \true; $this->ldap = new \_ContaoManager\Symfony\Config\Security\ProviderConfig\LdapConfig($value['ldap']); unset($value['ldap']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['chain'])) { $output['chain'] = $this->chain->toArray(); } if (isset($this->_usedProperties['memory'])) { $output['memory'] = $this->memory->toArray(); } if (isset($this->_usedProperties['ldap'])) { $output['ldap'] = $this->ldap->toArray(); } return $output; } } _usedProperties['pattern'] = \true; $this->pattern = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function methods(ParamConfigurator|string|array $value) : static { $this->_usedProperties['methods'] = \true; $this->methods = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function security($value) : static { $this->_usedProperties['security'] = \true; $this->security = $value; return $this; } /** * The UserChecker to use when authenticating users in this firewall. * @default 'security.user_checker' * @param ParamConfigurator|mixed $value * @return $this */ public function userChecker($value) : static { $this->_usedProperties['userChecker'] = \true; $this->userChecker = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function requestMatcher($value) : static { $this->_usedProperties['requestMatcher'] = \true; $this->requestMatcher = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function accessDeniedUrl($value) : static { $this->_usedProperties['accessDeniedUrl'] = \true; $this->accessDeniedUrl = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function accessDeniedHandler($value) : static { $this->_usedProperties['accessDeniedHandler'] = \true; $this->accessDeniedHandler = $value; return $this; } /** * An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface" * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function entryPoint($value) : static { $this->_usedProperties['entryPoint'] = \true; $this->entryPoint = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function provider($value) : static { $this->_usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function stateless($value) : static { $this->_usedProperties['stateless'] = \true; $this->stateless = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function lazy($value) : static { $this->_usedProperties['lazy'] = \true; $this->lazy = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function context($value) : static { $this->_usedProperties['context'] = \true; $this->context = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Security\FirewallConfig\LogoutConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\FirewallConfig\LogoutConfig : static) */ public function logout(mixed $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\LogoutConfig|static { if (!\is_array($value)) { $this->_usedProperties['logout'] = \true; $this->logout = $value; return $this; } if (!$this->logout instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\LogoutConfig) { $this->_usedProperties['logout'] = \true; $this->logout = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\LogoutConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "logout()" has already been initialized. You cannot pass values the second time you call logout().'); } return $this->logout; } public function switchUser(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\SwitchUserConfig { if (null === $this->switchUser) { $this->_usedProperties['switchUser'] = \true; $this->switchUser = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\SwitchUserConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "switchUser()" has already been initialized. You cannot pass values the second time you call switchUser().'); } return $this->switchUser; } /** * @param ParamConfigurator|list $value * * @return $this */ public function requiredBadges(ParamConfigurator|array $value) : static { $this->_usedProperties['requiredBadges'] = \true; $this->requiredBadges = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function customAuthenticators(ParamConfigurator|array $value) : static { $this->_usedProperties['customAuthenticators'] = \true; $this->customAuthenticators = $value; return $this; } public function loginThrottling(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\LoginThrottlingConfig { if (null === $this->loginThrottling) { $this->_usedProperties['loginThrottling'] = \true; $this->loginThrottling = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\LoginThrottlingConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "loginThrottling()" has already been initialized. You cannot pass values the second time you call loginThrottling().'); } return $this->loginThrottling; } public function x509(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\X509Config { if (null === $this->x509) { $this->_usedProperties['x509'] = \true; $this->x509 = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\X509Config($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "x509()" has already been initialized. You cannot pass values the second time you call x509().'); } return $this->x509; } public function remoteUser(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\RemoteUserConfig { if (null === $this->remoteUser) { $this->_usedProperties['remoteUser'] = \true; $this->remoteUser = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RemoteUserConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "remoteUser()" has already been initialized. You cannot pass values the second time you call remoteUser().'); } return $this->remoteUser; } public function loginLink(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\LoginLinkConfig { if (null === $this->loginLink) { $this->_usedProperties['loginLink'] = \true; $this->loginLink = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\LoginLinkConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "loginLink()" has already been initialized. You cannot pass values the second time you call loginLink().'); } return $this->loginLink; } public function formLogin(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\FormLoginConfig { if (null === $this->formLogin) { $this->_usedProperties['formLogin'] = \true; $this->formLogin = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\FormLoginConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "formLogin()" has already been initialized. You cannot pass values the second time you call formLogin().'); } return $this->formLogin; } public function formLoginLdap(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\FormLoginLdapConfig { if (null === $this->formLoginLdap) { $this->_usedProperties['formLoginLdap'] = \true; $this->formLoginLdap = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\FormLoginLdapConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "formLoginLdap()" has already been initialized. You cannot pass values the second time you call formLoginLdap().'); } return $this->formLoginLdap; } public function jsonLogin(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\JsonLoginConfig { if (null === $this->jsonLogin) { $this->_usedProperties['jsonLogin'] = \true; $this->jsonLogin = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\JsonLoginConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "jsonLogin()" has already been initialized. You cannot pass values the second time you call jsonLogin().'); } return $this->jsonLogin; } public function jsonLoginLdap(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\JsonLoginLdapConfig { if (null === $this->jsonLoginLdap) { $this->_usedProperties['jsonLoginLdap'] = \true; $this->jsonLoginLdap = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\JsonLoginLdapConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "jsonLoginLdap()" has already been initialized. You cannot pass values the second time you call jsonLoginLdap().'); } return $this->jsonLoginLdap; } public function accessToken(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessTokenConfig { if (null === $this->accessToken) { $this->_usedProperties['accessToken'] = \true; $this->accessToken = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessTokenConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "accessToken()" has already been initialized. You cannot pass values the second time you call accessToken().'); } return $this->accessToken; } public function httpBasic(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\HttpBasicConfig { if (null === $this->httpBasic) { $this->_usedProperties['httpBasic'] = \true; $this->httpBasic = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\HttpBasicConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "httpBasic()" has already been initialized. You cannot pass values the second time you call httpBasic().'); } return $this->httpBasic; } public function httpBasicLdap(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\HttpBasicLdapConfig { if (null === $this->httpBasicLdap) { $this->_usedProperties['httpBasicLdap'] = \true; $this->httpBasicLdap = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\HttpBasicLdapConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "httpBasicLdap()" has already been initialized. You cannot pass values the second time you call httpBasicLdap().'); } return $this->httpBasicLdap; } public function rememberMe(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMeConfig { if (null === $this->rememberMe) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMeConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "rememberMe()" has already been initialized. You cannot pass values the second time you call rememberMe().'); } return $this->rememberMe; } public function __construct(array $value = []) { if (\array_key_exists('pattern', $value)) { $this->_usedProperties['pattern'] = \true; $this->pattern = $value['pattern']; unset($value['pattern']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if (\array_key_exists('methods', $value)) { $this->_usedProperties['methods'] = \true; $this->methods = $value['methods']; unset($value['methods']); } if (\array_key_exists('security', $value)) { $this->_usedProperties['security'] = \true; $this->security = $value['security']; unset($value['security']); } if (\array_key_exists('user_checker', $value)) { $this->_usedProperties['userChecker'] = \true; $this->userChecker = $value['user_checker']; unset($value['user_checker']); } if (\array_key_exists('request_matcher', $value)) { $this->_usedProperties['requestMatcher'] = \true; $this->requestMatcher = $value['request_matcher']; unset($value['request_matcher']); } if (\array_key_exists('access_denied_url', $value)) { $this->_usedProperties['accessDeniedUrl'] = \true; $this->accessDeniedUrl = $value['access_denied_url']; unset($value['access_denied_url']); } if (\array_key_exists('access_denied_handler', $value)) { $this->_usedProperties['accessDeniedHandler'] = \true; $this->accessDeniedHandler = $value['access_denied_handler']; unset($value['access_denied_handler']); } if (\array_key_exists('entry_point', $value)) { $this->_usedProperties['entryPoint'] = \true; $this->entryPoint = $value['entry_point']; unset($value['entry_point']); } if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('stateless', $value)) { $this->_usedProperties['stateless'] = \true; $this->stateless = $value['stateless']; unset($value['stateless']); } if (\array_key_exists('lazy', $value)) { $this->_usedProperties['lazy'] = \true; $this->lazy = $value['lazy']; unset($value['lazy']); } if (\array_key_exists('context', $value)) { $this->_usedProperties['context'] = \true; $this->context = $value['context']; unset($value['context']); } if (\array_key_exists('logout', $value)) { $this->_usedProperties['logout'] = \true; $this->logout = \is_array($value['logout']) ? new \_ContaoManager\Symfony\Config\Security\FirewallConfig\LogoutConfig($value['logout']) : $value['logout']; unset($value['logout']); } if (\array_key_exists('switch_user', $value)) { $this->_usedProperties['switchUser'] = \true; $this->switchUser = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\SwitchUserConfig($value['switch_user']); unset($value['switch_user']); } if (\array_key_exists('required_badges', $value)) { $this->_usedProperties['requiredBadges'] = \true; $this->requiredBadges = $value['required_badges']; unset($value['required_badges']); } if (\array_key_exists('custom_authenticators', $value)) { $this->_usedProperties['customAuthenticators'] = \true; $this->customAuthenticators = $value['custom_authenticators']; unset($value['custom_authenticators']); } if (\array_key_exists('login_throttling', $value)) { $this->_usedProperties['loginThrottling'] = \true; $this->loginThrottling = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\LoginThrottlingConfig($value['login_throttling']); unset($value['login_throttling']); } if (\array_key_exists('x509', $value)) { $this->_usedProperties['x509'] = \true; $this->x509 = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\X509Config($value['x509']); unset($value['x509']); } if (\array_key_exists('remote_user', $value)) { $this->_usedProperties['remoteUser'] = \true; $this->remoteUser = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RemoteUserConfig($value['remote_user']); unset($value['remote_user']); } if (\array_key_exists('login_link', $value)) { $this->_usedProperties['loginLink'] = \true; $this->loginLink = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\LoginLinkConfig($value['login_link']); unset($value['login_link']); } if (\array_key_exists('form_login', $value)) { $this->_usedProperties['formLogin'] = \true; $this->formLogin = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\FormLoginConfig($value['form_login']); unset($value['form_login']); } if (\array_key_exists('form_login_ldap', $value)) { $this->_usedProperties['formLoginLdap'] = \true; $this->formLoginLdap = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\FormLoginLdapConfig($value['form_login_ldap']); unset($value['form_login_ldap']); } if (\array_key_exists('json_login', $value)) { $this->_usedProperties['jsonLogin'] = \true; $this->jsonLogin = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\JsonLoginConfig($value['json_login']); unset($value['json_login']); } if (\array_key_exists('json_login_ldap', $value)) { $this->_usedProperties['jsonLoginLdap'] = \true; $this->jsonLoginLdap = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\JsonLoginLdapConfig($value['json_login_ldap']); unset($value['json_login_ldap']); } if (\array_key_exists('access_token', $value)) { $this->_usedProperties['accessToken'] = \true; $this->accessToken = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessTokenConfig($value['access_token']); unset($value['access_token']); } if (\array_key_exists('http_basic', $value)) { $this->_usedProperties['httpBasic'] = \true; $this->httpBasic = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\HttpBasicConfig($value['http_basic']); unset($value['http_basic']); } if (\array_key_exists('http_basic_ldap', $value)) { $this->_usedProperties['httpBasicLdap'] = \true; $this->httpBasicLdap = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\HttpBasicLdapConfig($value['http_basic_ldap']); unset($value['http_basic_ldap']); } if (\array_key_exists('remember_me', $value)) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMeConfig($value['remember_me']); unset($value['remember_me']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['pattern'])) { $output['pattern'] = $this->pattern; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } if (isset($this->_usedProperties['methods'])) { $output['methods'] = $this->methods; } if (isset($this->_usedProperties['security'])) { $output['security'] = $this->security; } if (isset($this->_usedProperties['userChecker'])) { $output['user_checker'] = $this->userChecker; } if (isset($this->_usedProperties['requestMatcher'])) { $output['request_matcher'] = $this->requestMatcher; } if (isset($this->_usedProperties['accessDeniedUrl'])) { $output['access_denied_url'] = $this->accessDeniedUrl; } if (isset($this->_usedProperties['accessDeniedHandler'])) { $output['access_denied_handler'] = $this->accessDeniedHandler; } if (isset($this->_usedProperties['entryPoint'])) { $output['entry_point'] = $this->entryPoint; } if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['stateless'])) { $output['stateless'] = $this->stateless; } if (isset($this->_usedProperties['lazy'])) { $output['lazy'] = $this->lazy; } if (isset($this->_usedProperties['context'])) { $output['context'] = $this->context; } if (isset($this->_usedProperties['logout'])) { $output['logout'] = $this->logout instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\LogoutConfig ? $this->logout->toArray() : $this->logout; } if (isset($this->_usedProperties['switchUser'])) { $output['switch_user'] = $this->switchUser->toArray(); } if (isset($this->_usedProperties['requiredBadges'])) { $output['required_badges'] = $this->requiredBadges; } if (isset($this->_usedProperties['customAuthenticators'])) { $output['custom_authenticators'] = $this->customAuthenticators; } if (isset($this->_usedProperties['loginThrottling'])) { $output['login_throttling'] = $this->loginThrottling->toArray(); } if (isset($this->_usedProperties['x509'])) { $output['x509'] = $this->x509->toArray(); } if (isset($this->_usedProperties['remoteUser'])) { $output['remote_user'] = $this->remoteUser->toArray(); } if (isset($this->_usedProperties['loginLink'])) { $output['login_link'] = $this->loginLink->toArray(); } if (isset($this->_usedProperties['formLogin'])) { $output['form_login'] = $this->formLogin->toArray(); } if (isset($this->_usedProperties['formLoginLdap'])) { $output['form_login_ldap'] = $this->formLoginLdap->toArray(); } if (isset($this->_usedProperties['jsonLogin'])) { $output['json_login'] = $this->jsonLogin->toArray(); } if (isset($this->_usedProperties['jsonLoginLdap'])) { $output['json_login_ldap'] = $this->jsonLoginLdap->toArray(); } if (isset($this->_usedProperties['accessToken'])) { $output['access_token'] = $this->accessToken->toArray(); } if (isset($this->_usedProperties['httpBasic'])) { $output['http_basic'] = $this->httpBasic->toArray(); } if (isset($this->_usedProperties['httpBasicLdap'])) { $output['http_basic_ldap'] = $this->httpBasicLdap->toArray(); } if (isset($this->_usedProperties['rememberMe'])) { $output['remember_me'] = $this->rememberMe->toArray(); } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function rememberMe($value) : static { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function successHandler($value) : static { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureHandler($value) : static { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function realm($value) : static { $this->_usedProperties['realm'] = \true; $this->realm = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function tokenExtractors(ParamConfigurator|string|array $value) : static { $this->_usedProperties['tokenExtractors'] = \true; $this->tokenExtractors = $value; return $this; } /** * @template TValue * @param TValue $value * @example "App\\Security\\CustomTokenHandler" * @return \Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig : static) */ public function tokenHandler(mixed $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig|static { if (!\is_array($value)) { $this->_usedProperties['tokenHandler'] = \true; $this->tokenHandler = $value; return $this; } if (!$this->tokenHandler instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig) { $this->_usedProperties['tokenHandler'] = \true; $this->tokenHandler = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "tokenHandler()" has already been initialized. You cannot pass values the second time you call tokenHandler().'); } return $this->tokenHandler; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('remember_me', $value)) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value['remember_me']; unset($value['remember_me']); } if (\array_key_exists('success_handler', $value)) { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value['success_handler']; unset($value['success_handler']); } if (\array_key_exists('failure_handler', $value)) { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value['failure_handler']; unset($value['failure_handler']); } if (\array_key_exists('realm', $value)) { $this->_usedProperties['realm'] = \true; $this->realm = $value['realm']; unset($value['realm']); } if (\array_key_exists('token_extractors', $value)) { $this->_usedProperties['tokenExtractors'] = \true; $this->tokenExtractors = $value['token_extractors']; unset($value['token_extractors']); } if (\array_key_exists('token_handler', $value)) { $this->_usedProperties['tokenHandler'] = \true; $this->tokenHandler = \is_array($value['token_handler']) ? new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig($value['token_handler']) : $value['token_handler']; unset($value['token_handler']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['rememberMe'])) { $output['remember_me'] = $this->rememberMe; } if (isset($this->_usedProperties['successHandler'])) { $output['success_handler'] = $this->successHandler; } if (isset($this->_usedProperties['failureHandler'])) { $output['failure_handler'] = $this->failureHandler; } if (isset($this->_usedProperties['realm'])) { $output['realm'] = $this->realm; } if (isset($this->_usedProperties['tokenExtractors'])) { $output['token_extractors'] = $this->tokenExtractors; } if (isset($this->_usedProperties['tokenHandler'])) { $output['token_handler'] = $this->tokenHandler instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandlerConfig ? $this->tokenHandler->toArray() : $this->tokenHandler; } return $output; } } _usedProperties['secret'] = \true; $this->secret = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function service($value) : static { $this->_usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function userProviders(ParamConfigurator|string|array $value) : static { $this->_usedProperties['userProviders'] = \true; $this->userProviders = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function catchExceptions($value) : static { $this->_usedProperties['catchExceptions'] = \true; $this->catchExceptions = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function signatureProperties(ParamConfigurator|array $value) : static { $this->_usedProperties['signatureProperties'] = \true; $this->signatureProperties = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig : static) */ public function tokenProvider(string|array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig|static { if (!\is_array($value)) { $this->_usedProperties['tokenProvider'] = \true; $this->tokenProvider = $value; return $this; } if (!$this->tokenProvider instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig) { $this->_usedProperties['tokenProvider'] = \true; $this->tokenProvider = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "tokenProvider()" has already been initialized. You cannot pass values the second time you call tokenProvider().'); } return $this->tokenProvider; } /** * The service ID of a custom rememberme token verifier. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function tokenVerifier($value) : static { $this->_usedProperties['tokenVerifier'] = \true; $this->tokenVerifier = $value; return $this; } /** * @default 'REMEMBERME' * @param ParamConfigurator|mixed $value * @return $this */ public function name($value) : static { $this->_usedProperties['name'] = \true; $this->name = $value; return $this; } /** * @default 31536000 * @param ParamConfigurator|int $value * @return $this */ public function lifetime($value) : static { $this->_usedProperties['lifetime'] = \true; $this->lifetime = $value; return $this; } /** * @default '/' * @param ParamConfigurator|mixed $value * @return $this */ public function path($value) : static { $this->_usedProperties['path'] = \true; $this->path = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function domain($value) : static { $this->_usedProperties['domain'] = \true; $this->domain = $value; return $this; } /** * @default false * @param ParamConfigurator|true|false|'auto' $value * @return $this */ public function secure($value) : static { $this->_usedProperties['secure'] = \true; $this->secure = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function httponly($value) : static { $this->_usedProperties['httponly'] = \true; $this->httponly = $value; return $this; } /** * @default null * @param ParamConfigurator|NULL|'lax'|'strict'|'none' $value * @return $this */ public function samesite($value) : static { $this->_usedProperties['samesite'] = \true; $this->samesite = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function alwaysRememberMe($value) : static { $this->_usedProperties['alwaysRememberMe'] = \true; $this->alwaysRememberMe = $value; return $this; } /** * @default '_remember_me' * @param ParamConfigurator|mixed $value * @return $this */ public function rememberMeParameter($value) : static { $this->_usedProperties['rememberMeParameter'] = \true; $this->rememberMeParameter = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('secret', $value)) { $this->_usedProperties['secret'] = \true; $this->secret = $value['secret']; unset($value['secret']); } if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('user_providers', $value)) { $this->_usedProperties['userProviders'] = \true; $this->userProviders = $value['user_providers']; unset($value['user_providers']); } if (\array_key_exists('catch_exceptions', $value)) { $this->_usedProperties['catchExceptions'] = \true; $this->catchExceptions = $value['catch_exceptions']; unset($value['catch_exceptions']); } if (\array_key_exists('signature_properties', $value)) { $this->_usedProperties['signatureProperties'] = \true; $this->signatureProperties = $value['signature_properties']; unset($value['signature_properties']); } if (\array_key_exists('token_provider', $value)) { $this->_usedProperties['tokenProvider'] = \true; $this->tokenProvider = \is_array($value['token_provider']) ? new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig($value['token_provider']) : $value['token_provider']; unset($value['token_provider']); } if (\array_key_exists('token_verifier', $value)) { $this->_usedProperties['tokenVerifier'] = \true; $this->tokenVerifier = $value['token_verifier']; unset($value['token_verifier']); } if (\array_key_exists('name', $value)) { $this->_usedProperties['name'] = \true; $this->name = $value['name']; unset($value['name']); } if (\array_key_exists('lifetime', $value)) { $this->_usedProperties['lifetime'] = \true; $this->lifetime = $value['lifetime']; unset($value['lifetime']); } if (\array_key_exists('path', $value)) { $this->_usedProperties['path'] = \true; $this->path = $value['path']; unset($value['path']); } if (\array_key_exists('domain', $value)) { $this->_usedProperties['domain'] = \true; $this->domain = $value['domain']; unset($value['domain']); } if (\array_key_exists('secure', $value)) { $this->_usedProperties['secure'] = \true; $this->secure = $value['secure']; unset($value['secure']); } if (\array_key_exists('httponly', $value)) { $this->_usedProperties['httponly'] = \true; $this->httponly = $value['httponly']; unset($value['httponly']); } if (\array_key_exists('samesite', $value)) { $this->_usedProperties['samesite'] = \true; $this->samesite = $value['samesite']; unset($value['samesite']); } if (\array_key_exists('always_remember_me', $value)) { $this->_usedProperties['alwaysRememberMe'] = \true; $this->alwaysRememberMe = $value['always_remember_me']; unset($value['always_remember_me']); } if (\array_key_exists('remember_me_parameter', $value)) { $this->_usedProperties['rememberMeParameter'] = \true; $this->rememberMeParameter = $value['remember_me_parameter']; unset($value['remember_me_parameter']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['secret'])) { $output['secret'] = $this->secret; } if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['userProviders'])) { $output['user_providers'] = $this->userProviders; } if (isset($this->_usedProperties['catchExceptions'])) { $output['catch_exceptions'] = $this->catchExceptions; } if (isset($this->_usedProperties['signatureProperties'])) { $output['signature_properties'] = $this->signatureProperties; } if (isset($this->_usedProperties['tokenProvider'])) { $output['token_provider'] = $this->tokenProvider instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProviderConfig ? $this->tokenProvider->toArray() : $this->tokenProvider; } if (isset($this->_usedProperties['tokenVerifier'])) { $output['token_verifier'] = $this->tokenVerifier; } if (isset($this->_usedProperties['name'])) { $output['name'] = $this->name; } if (isset($this->_usedProperties['lifetime'])) { $output['lifetime'] = $this->lifetime; } if (isset($this->_usedProperties['path'])) { $output['path'] = $this->path; } if (isset($this->_usedProperties['domain'])) { $output['domain'] = $this->domain; } if (isset($this->_usedProperties['secure'])) { $output['secure'] = $this->secure; } if (isset($this->_usedProperties['httponly'])) { $output['httponly'] = $this->httponly; } if (isset($this->_usedProperties['samesite'])) { $output['samesite'] = $this->samesite; } if (isset($this->_usedProperties['alwaysRememberMe'])) { $output['always_remember_me'] = $this->alwaysRememberMe; } if (isset($this->_usedProperties['rememberMeParameter'])) { $output['remember_me_parameter'] = $this->rememberMeParameter; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function rememberMe($value) : static { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function successHandler($value) : static { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureHandler($value) : static { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value; return $this; } /** * @default '/login_check' * @param ParamConfigurator|mixed $value * @return $this */ public function checkPath($value) : static { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useForward($value) : static { $this->_usedProperties['useForward'] = \true; $this->useForward = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @deprecated Option "require_previous_session" at "form_login" is deprecated, it will be removed in version 7.0. Setting it has no effect anymore. * @return $this */ public function requirePreviousSession($value) : static { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value; return $this; } /** * @default '/login' * @param ParamConfigurator|mixed $value * @return $this */ public function loginPath($value) : static { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value; return $this; } /** * @default '_username' * @param ParamConfigurator|mixed $value * @return $this */ public function usernameParameter($value) : static { $this->_usedProperties['usernameParameter'] = \true; $this->usernameParameter = $value; return $this; } /** * @default '_password' * @param ParamConfigurator|mixed $value * @return $this */ public function passwordParameter($value) : static { $this->_usedProperties['passwordParameter'] = \true; $this->passwordParameter = $value; return $this; } /** * @default '_csrf_token' * @param ParamConfigurator|mixed $value * @return $this */ public function csrfParameter($value) : static { $this->_usedProperties['csrfParameter'] = \true; $this->csrfParameter = $value; return $this; } /** * @default 'authenticate' * @param ParamConfigurator|mixed $value * @return $this */ public function csrfTokenId($value) : static { $this->_usedProperties['csrfTokenId'] = \true; $this->csrfTokenId = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function enableCsrf($value) : static { $this->_usedProperties['enableCsrf'] = \true; $this->enableCsrf = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function postOnly($value) : static { $this->_usedProperties['postOnly'] = \true; $this->postOnly = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function formOnly($value) : static { $this->_usedProperties['formOnly'] = \true; $this->formOnly = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function alwaysUseDefaultTargetPath($value) : static { $this->_usedProperties['alwaysUseDefaultTargetPath'] = \true; $this->alwaysUseDefaultTargetPath = $value; return $this; } /** * @default '/' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultTargetPath($value) : static { $this->_usedProperties['defaultTargetPath'] = \true; $this->defaultTargetPath = $value; return $this; } /** * @default '_target_path' * @param ParamConfigurator|mixed $value * @return $this */ public function targetPathParameter($value) : static { $this->_usedProperties['targetPathParameter'] = \true; $this->targetPathParameter = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useReferer($value) : static { $this->_usedProperties['useReferer'] = \true; $this->useReferer = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failurePath($value) : static { $this->_usedProperties['failurePath'] = \true; $this->failurePath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function failureForward($value) : static { $this->_usedProperties['failureForward'] = \true; $this->failureForward = $value; return $this; } /** * @default '_failure_path' * @param ParamConfigurator|mixed $value * @return $this */ public function failurePathParameter($value) : static { $this->_usedProperties['failurePathParameter'] = \true; $this->failurePathParameter = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function csrfTokenGenerator($value) : static { $this->_usedProperties['csrfTokenGenerator'] = \true; $this->csrfTokenGenerator = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('remember_me', $value)) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value['remember_me']; unset($value['remember_me']); } if (\array_key_exists('success_handler', $value)) { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value['success_handler']; unset($value['success_handler']); } if (\array_key_exists('failure_handler', $value)) { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value['failure_handler']; unset($value['failure_handler']); } if (\array_key_exists('check_path', $value)) { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value['check_path']; unset($value['check_path']); } if (\array_key_exists('use_forward', $value)) { $this->_usedProperties['useForward'] = \true; $this->useForward = $value['use_forward']; unset($value['use_forward']); } if (\array_key_exists('require_previous_session', $value)) { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value['require_previous_session']; unset($value['require_previous_session']); } if (\array_key_exists('login_path', $value)) { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value['login_path']; unset($value['login_path']); } if (\array_key_exists('username_parameter', $value)) { $this->_usedProperties['usernameParameter'] = \true; $this->usernameParameter = $value['username_parameter']; unset($value['username_parameter']); } if (\array_key_exists('password_parameter', $value)) { $this->_usedProperties['passwordParameter'] = \true; $this->passwordParameter = $value['password_parameter']; unset($value['password_parameter']); } if (\array_key_exists('csrf_parameter', $value)) { $this->_usedProperties['csrfParameter'] = \true; $this->csrfParameter = $value['csrf_parameter']; unset($value['csrf_parameter']); } if (\array_key_exists('csrf_token_id', $value)) { $this->_usedProperties['csrfTokenId'] = \true; $this->csrfTokenId = $value['csrf_token_id']; unset($value['csrf_token_id']); } if (\array_key_exists('enable_csrf', $value)) { $this->_usedProperties['enableCsrf'] = \true; $this->enableCsrf = $value['enable_csrf']; unset($value['enable_csrf']); } if (\array_key_exists('post_only', $value)) { $this->_usedProperties['postOnly'] = \true; $this->postOnly = $value['post_only']; unset($value['post_only']); } if (\array_key_exists('form_only', $value)) { $this->_usedProperties['formOnly'] = \true; $this->formOnly = $value['form_only']; unset($value['form_only']); } if (\array_key_exists('always_use_default_target_path', $value)) { $this->_usedProperties['alwaysUseDefaultTargetPath'] = \true; $this->alwaysUseDefaultTargetPath = $value['always_use_default_target_path']; unset($value['always_use_default_target_path']); } if (\array_key_exists('default_target_path', $value)) { $this->_usedProperties['defaultTargetPath'] = \true; $this->defaultTargetPath = $value['default_target_path']; unset($value['default_target_path']); } if (\array_key_exists('target_path_parameter', $value)) { $this->_usedProperties['targetPathParameter'] = \true; $this->targetPathParameter = $value['target_path_parameter']; unset($value['target_path_parameter']); } if (\array_key_exists('use_referer', $value)) { $this->_usedProperties['useReferer'] = \true; $this->useReferer = $value['use_referer']; unset($value['use_referer']); } if (\array_key_exists('failure_path', $value)) { $this->_usedProperties['failurePath'] = \true; $this->failurePath = $value['failure_path']; unset($value['failure_path']); } if (\array_key_exists('failure_forward', $value)) { $this->_usedProperties['failureForward'] = \true; $this->failureForward = $value['failure_forward']; unset($value['failure_forward']); } if (\array_key_exists('failure_path_parameter', $value)) { $this->_usedProperties['failurePathParameter'] = \true; $this->failurePathParameter = $value['failure_path_parameter']; unset($value['failure_path_parameter']); } if (\array_key_exists('csrf_token_generator', $value)) { $this->_usedProperties['csrfTokenGenerator'] = \true; $this->csrfTokenGenerator = $value['csrf_token_generator']; unset($value['csrf_token_generator']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['rememberMe'])) { $output['remember_me'] = $this->rememberMe; } if (isset($this->_usedProperties['successHandler'])) { $output['success_handler'] = $this->successHandler; } if (isset($this->_usedProperties['failureHandler'])) { $output['failure_handler'] = $this->failureHandler; } if (isset($this->_usedProperties['checkPath'])) { $output['check_path'] = $this->checkPath; } if (isset($this->_usedProperties['useForward'])) { $output['use_forward'] = $this->useForward; } if (isset($this->_usedProperties['requirePreviousSession'])) { $output['require_previous_session'] = $this->requirePreviousSession; } if (isset($this->_usedProperties['loginPath'])) { $output['login_path'] = $this->loginPath; } if (isset($this->_usedProperties['usernameParameter'])) { $output['username_parameter'] = $this->usernameParameter; } if (isset($this->_usedProperties['passwordParameter'])) { $output['password_parameter'] = $this->passwordParameter; } if (isset($this->_usedProperties['csrfParameter'])) { $output['csrf_parameter'] = $this->csrfParameter; } if (isset($this->_usedProperties['csrfTokenId'])) { $output['csrf_token_id'] = $this->csrfTokenId; } if (isset($this->_usedProperties['enableCsrf'])) { $output['enable_csrf'] = $this->enableCsrf; } if (isset($this->_usedProperties['postOnly'])) { $output['post_only'] = $this->postOnly; } if (isset($this->_usedProperties['formOnly'])) { $output['form_only'] = $this->formOnly; } if (isset($this->_usedProperties['alwaysUseDefaultTargetPath'])) { $output['always_use_default_target_path'] = $this->alwaysUseDefaultTargetPath; } if (isset($this->_usedProperties['defaultTargetPath'])) { $output['default_target_path'] = $this->defaultTargetPath; } if (isset($this->_usedProperties['targetPathParameter'])) { $output['target_path_parameter'] = $this->targetPathParameter; } if (isset($this->_usedProperties['useReferer'])) { $output['use_referer'] = $this->useReferer; } if (isset($this->_usedProperties['failurePath'])) { $output['failure_path'] = $this->failurePath; } if (isset($this->_usedProperties['failureForward'])) { $output['failure_forward'] = $this->failureForward; } if (isset($this->_usedProperties['failurePathParameter'])) { $output['failure_path_parameter'] = $this->failurePathParameter; } if (isset($this->_usedProperties['csrfTokenGenerator'])) { $output['csrf_token_generator'] = $this->csrfTokenGenerator; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function rememberMe($value) : static { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function successHandler($value) : static { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureHandler($value) : static { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value; return $this; } /** * @default '/login_check' * @param ParamConfigurator|mixed $value * @return $this */ public function checkPath($value) : static { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useForward($value) : static { $this->_usedProperties['useForward'] = \true; $this->useForward = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @deprecated Option "require_previous_session" at "json_login_ldap" is deprecated, it will be removed in version 7.0. Setting it has no effect anymore. * @return $this */ public function requirePreviousSession($value) : static { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value; return $this; } /** * @default '/login' * @param ParamConfigurator|mixed $value * @return $this */ public function loginPath($value) : static { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value; return $this; } /** * @default 'username' * @param ParamConfigurator|mixed $value * @return $this */ public function usernamePath($value) : static { $this->_usedProperties['usernamePath'] = \true; $this->usernamePath = $value; return $this; } /** * @default 'password' * @param ParamConfigurator|mixed $value * @return $this */ public function passwordPath($value) : static { $this->_usedProperties['passwordPath'] = \true; $this->passwordPath = $value; return $this; } /** * @default 'ldap' * @param ParamConfigurator|mixed $value * @return $this */ public function service($value) : static { $this->_usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @default '{username}' * @param ParamConfigurator|mixed $value * @return $this */ public function dnString($value) : static { $this->_usedProperties['dnString'] = \true; $this->dnString = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function queryString($value) : static { $this->_usedProperties['queryString'] = \true; $this->queryString = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function searchDn($value) : static { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function searchPassword($value) : static { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('remember_me', $value)) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value['remember_me']; unset($value['remember_me']); } if (\array_key_exists('success_handler', $value)) { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value['success_handler']; unset($value['success_handler']); } if (\array_key_exists('failure_handler', $value)) { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value['failure_handler']; unset($value['failure_handler']); } if (\array_key_exists('check_path', $value)) { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value['check_path']; unset($value['check_path']); } if (\array_key_exists('use_forward', $value)) { $this->_usedProperties['useForward'] = \true; $this->useForward = $value['use_forward']; unset($value['use_forward']); } if (\array_key_exists('require_previous_session', $value)) { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value['require_previous_session']; unset($value['require_previous_session']); } if (\array_key_exists('login_path', $value)) { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value['login_path']; unset($value['login_path']); } if (\array_key_exists('username_path', $value)) { $this->_usedProperties['usernamePath'] = \true; $this->usernamePath = $value['username_path']; unset($value['username_path']); } if (\array_key_exists('password_path', $value)) { $this->_usedProperties['passwordPath'] = \true; $this->passwordPath = $value['password_path']; unset($value['password_path']); } if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('dn_string', $value)) { $this->_usedProperties['dnString'] = \true; $this->dnString = $value['dn_string']; unset($value['dn_string']); } if (\array_key_exists('query_string', $value)) { $this->_usedProperties['queryString'] = \true; $this->queryString = $value['query_string']; unset($value['query_string']); } if (\array_key_exists('search_dn', $value)) { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value['search_dn']; unset($value['search_dn']); } if (\array_key_exists('search_password', $value)) { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value['search_password']; unset($value['search_password']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['rememberMe'])) { $output['remember_me'] = $this->rememberMe; } if (isset($this->_usedProperties['successHandler'])) { $output['success_handler'] = $this->successHandler; } if (isset($this->_usedProperties['failureHandler'])) { $output['failure_handler'] = $this->failureHandler; } if (isset($this->_usedProperties['checkPath'])) { $output['check_path'] = $this->checkPath; } if (isset($this->_usedProperties['useForward'])) { $output['use_forward'] = $this->useForward; } if (isset($this->_usedProperties['requirePreviousSession'])) { $output['require_previous_session'] = $this->requirePreviousSession; } if (isset($this->_usedProperties['loginPath'])) { $output['login_path'] = $this->loginPath; } if (isset($this->_usedProperties['usernamePath'])) { $output['username_path'] = $this->usernamePath; } if (isset($this->_usedProperties['passwordPath'])) { $output['password_path'] = $this->passwordPath; } if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['dnString'])) { $output['dn_string'] = $this->dnString; } if (isset($this->_usedProperties['queryString'])) { $output['query_string'] = $this->queryString; } if (isset($this->_usedProperties['searchDn'])) { $output['search_dn'] = $this->searchDn; } if (isset($this->_usedProperties['searchPassword'])) { $output['search_password'] = $this->searchPassword; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default 'Secured Area' * @param ParamConfigurator|mixed $value * @return $this */ public function realm($value) : static { $this->_usedProperties['realm'] = \true; $this->realm = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('realm', $value)) { $this->_usedProperties['realm'] = \true; $this->realm = $value['realm']; unset($value['realm']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['realm'])) { $output['realm'] = $this->realm; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig : static) */ public function oidcUserInfo(string|array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig|static { if (!\is_array($value)) { $this->_usedProperties['oidcUserInfo'] = \true; $this->oidcUserInfo = $value; return $this; } if (!$this->oidcUserInfo instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig) { $this->_usedProperties['oidcUserInfo'] = \true; $this->oidcUserInfo = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "oidcUserInfo()" has already been initialized. You cannot pass values the second time you call oidcUserInfo().'); } return $this->oidcUserInfo; } public function oidc(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcConfig { if (null === $this->oidc) { $this->_usedProperties['oidc'] = \true; $this->oidc = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "oidc()" has already been initialized. You cannot pass values the second time you call oidc().'); } return $this->oidc; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('oidc_user_info', $value)) { $this->_usedProperties['oidcUserInfo'] = \true; $this->oidcUserInfo = \is_array($value['oidc_user_info']) ? new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig($value['oidc_user_info']) : $value['oidc_user_info']; unset($value['oidc_user_info']); } if (\array_key_exists('oidc', $value)) { $this->_usedProperties['oidc'] = \true; $this->oidc = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcConfig($value['oidc']); unset($value['oidc']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['oidcUserInfo'])) { $output['oidc_user_info'] = $this->oidcUserInfo instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\AccessToken\TokenHandler\OidcUserInfoConfig ? $this->oidcUserInfo->toArray() : $this->oidcUserInfo; } if (isset($this->_usedProperties['oidc'])) { $output['oidc'] = $this->oidc->toArray(); } return $output; } } _usedProperties['baseUri'] = \true; $this->baseUri = $value; return $this; } /** * Claim which contains the user identifier (e.g. sub, email, etc.). * @default 'sub' * @param ParamConfigurator|mixed $value * @return $this */ public function claim($value) : static { $this->_usedProperties['claim'] = \true; $this->claim = $value; return $this; } /** * HttpClient service id to use to call the OIDC server. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function client($value) : static { $this->_usedProperties['client'] = \true; $this->client = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('base_uri', $value)) { $this->_usedProperties['baseUri'] = \true; $this->baseUri = $value['base_uri']; unset($value['base_uri']); } if (\array_key_exists('claim', $value)) { $this->_usedProperties['claim'] = \true; $this->claim = $value['claim']; unset($value['claim']); } if (\array_key_exists('client', $value)) { $this->_usedProperties['client'] = \true; $this->client = $value['client']; unset($value['client']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['baseUri'])) { $output['base_uri'] = $this->baseUri; } if (isset($this->_usedProperties['claim'])) { $output['claim'] = $this->claim; } if (isset($this->_usedProperties['client'])) { $output['client'] = $this->client; } return $output; } } _usedProperties['claim'] = \true; $this->claim = $value; return $this; } /** * Audience set in the token, for validation purpose. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function audience($value) : static { $this->_usedProperties['audience'] = \true; $this->audience = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function issuers(ParamConfigurator|array $value) : static { $this->_usedProperties['issuers'] = \true; $this->issuers = $value; return $this; } /** * Algorithm used to sign the token. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function algorithm($value) : static { $this->_usedProperties['algorithm'] = \true; $this->algorithm = $value; return $this; } /** * JSON-encoded JWK used to sign the token (must contain a "kty" key). * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function key($value) : static { $this->_usedProperties['key'] = \true; $this->key = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('claim', $value)) { $this->_usedProperties['claim'] = \true; $this->claim = $value['claim']; unset($value['claim']); } if (\array_key_exists('audience', $value)) { $this->_usedProperties['audience'] = \true; $this->audience = $value['audience']; unset($value['audience']); } if (\array_key_exists('issuers', $value)) { $this->_usedProperties['issuers'] = \true; $this->issuers = $value['issuers']; unset($value['issuers']); } if (\array_key_exists('algorithm', $value)) { $this->_usedProperties['algorithm'] = \true; $this->algorithm = $value['algorithm']; unset($value['algorithm']); } if (\array_key_exists('key', $value)) { $this->_usedProperties['key'] = \true; $this->key = $value['key']; unset($value['key']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['claim'])) { $output['claim'] = $this->claim; } if (isset($this->_usedProperties['audience'])) { $output['audience'] = $this->audience; } if (isset($this->_usedProperties['issuers'])) { $output['issuers'] = $this->issuers; } if (isset($this->_usedProperties['algorithm'])) { $output['algorithm'] = $this->algorithm; } if (isset($this->_usedProperties['key'])) { $output['key'] = $this->key; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function rememberMe($value) : static { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function successHandler($value) : static { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureHandler($value) : static { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value; return $this; } /** * @default '/login_check' * @param ParamConfigurator|mixed $value * @return $this */ public function checkPath($value) : static { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useForward($value) : static { $this->_usedProperties['useForward'] = \true; $this->useForward = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @deprecated Option "require_previous_session" at "json_login" is deprecated, it will be removed in version 7.0. Setting it has no effect anymore. * @return $this */ public function requirePreviousSession($value) : static { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value; return $this; } /** * @default '/login' * @param ParamConfigurator|mixed $value * @return $this */ public function loginPath($value) : static { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value; return $this; } /** * @default 'username' * @param ParamConfigurator|mixed $value * @return $this */ public function usernamePath($value) : static { $this->_usedProperties['usernamePath'] = \true; $this->usernamePath = $value; return $this; } /** * @default 'password' * @param ParamConfigurator|mixed $value * @return $this */ public function passwordPath($value) : static { $this->_usedProperties['passwordPath'] = \true; $this->passwordPath = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('remember_me', $value)) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value['remember_me']; unset($value['remember_me']); } if (\array_key_exists('success_handler', $value)) { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value['success_handler']; unset($value['success_handler']); } if (\array_key_exists('failure_handler', $value)) { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value['failure_handler']; unset($value['failure_handler']); } if (\array_key_exists('check_path', $value)) { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value['check_path']; unset($value['check_path']); } if (\array_key_exists('use_forward', $value)) { $this->_usedProperties['useForward'] = \true; $this->useForward = $value['use_forward']; unset($value['use_forward']); } if (\array_key_exists('require_previous_session', $value)) { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value['require_previous_session']; unset($value['require_previous_session']); } if (\array_key_exists('login_path', $value)) { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value['login_path']; unset($value['login_path']); } if (\array_key_exists('username_path', $value)) { $this->_usedProperties['usernamePath'] = \true; $this->usernamePath = $value['username_path']; unset($value['username_path']); } if (\array_key_exists('password_path', $value)) { $this->_usedProperties['passwordPath'] = \true; $this->passwordPath = $value['password_path']; unset($value['password_path']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['rememberMe'])) { $output['remember_me'] = $this->rememberMe; } if (isset($this->_usedProperties['successHandler'])) { $output['success_handler'] = $this->successHandler; } if (isset($this->_usedProperties['failureHandler'])) { $output['failure_handler'] = $this->failureHandler; } if (isset($this->_usedProperties['checkPath'])) { $output['check_path'] = $this->checkPath; } if (isset($this->_usedProperties['useForward'])) { $output['use_forward'] = $this->useForward; } if (isset($this->_usedProperties['requirePreviousSession'])) { $output['require_previous_session'] = $this->requirePreviousSession; } if (isset($this->_usedProperties['loginPath'])) { $output['login_path'] = $this->loginPath; } if (isset($this->_usedProperties['usernamePath'])) { $output['username_path'] = $this->usernamePath; } if (isset($this->_usedProperties['passwordPath'])) { $output['password_path'] = $this->passwordPath; } return $output; } } _usedProperties['path'] = \true; $this->path = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function domain($value) : static { $this->_usedProperties['domain'] = \true; $this->domain = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function secure($value) : static { $this->_usedProperties['secure'] = \true; $this->secure = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function samesite($value) : static { $this->_usedProperties['samesite'] = \true; $this->samesite = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function partitioned($value) : static { $this->_usedProperties['partitioned'] = \true; $this->partitioned = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('path', $value)) { $this->_usedProperties['path'] = \true; $this->path = $value['path']; unset($value['path']); } if (\array_key_exists('domain', $value)) { $this->_usedProperties['domain'] = \true; $this->domain = $value['domain']; unset($value['domain']); } if (\array_key_exists('secure', $value)) { $this->_usedProperties['secure'] = \true; $this->secure = $value['secure']; unset($value['secure']); } if (\array_key_exists('samesite', $value)) { $this->_usedProperties['samesite'] = \true; $this->samesite = $value['samesite']; unset($value['samesite']); } if (\array_key_exists('partitioned', $value)) { $this->_usedProperties['partitioned'] = \true; $this->partitioned = $value['partitioned']; unset($value['partitioned']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['path'])) { $output['path'] = $this->path; } if (isset($this->_usedProperties['domain'])) { $output['domain'] = $this->domain; } if (isset($this->_usedProperties['secure'])) { $output['secure'] = $this->secure; } if (isset($this->_usedProperties['samesite'])) { $output['samesite'] = $this->samesite; } if (isset($this->_usedProperties['partitioned'])) { $output['partitioned'] = $this->partitioned; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default '_switch_user' * @param ParamConfigurator|mixed $value * @return $this */ public function parameter($value) : static { $this->_usedProperties['parameter'] = \true; $this->parameter = $value; return $this; } /** * @default 'ROLE_ALLOWED_TO_SWITCH' * @param ParamConfigurator|mixed $value * @return $this */ public function role($value) : static { $this->_usedProperties['role'] = \true; $this->role = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function targetRoute($value) : static { $this->_usedProperties['targetRoute'] = \true; $this->targetRoute = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('parameter', $value)) { $this->_usedProperties['parameter'] = \true; $this->parameter = $value['parameter']; unset($value['parameter']); } if (\array_key_exists('role', $value)) { $this->_usedProperties['role'] = \true; $this->role = $value['role']; unset($value['role']); } if (\array_key_exists('target_route', $value)) { $this->_usedProperties['targetRoute'] = \true; $this->targetRoute = $value['target_route']; unset($value['target_route']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['parameter'])) { $output['parameter'] = $this->parameter; } if (isset($this->_usedProperties['role'])) { $output['role'] = $this->role; } if (isset($this->_usedProperties['targetRoute'])) { $output['target_route'] = $this->targetRoute; } return $output; } } _usedProperties['limiter'] = \true; $this->limiter = $value; return $this; } /** * @default 5 * @param ParamConfigurator|int $value * @return $this */ public function maxAttempts($value) : static { $this->_usedProperties['maxAttempts'] = \true; $this->maxAttempts = $value; return $this; } /** * @default '1 minute' * @param ParamConfigurator|mixed $value * @return $this */ public function interval($value) : static { $this->_usedProperties['interval'] = \true; $this->interval = $value; return $this; } /** * The service ID of the lock factory used by the login rate limiter (or null to disable locking) * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function lockFactory($value) : static { $this->_usedProperties['lockFactory'] = \true; $this->lockFactory = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('limiter', $value)) { $this->_usedProperties['limiter'] = \true; $this->limiter = $value['limiter']; unset($value['limiter']); } if (\array_key_exists('max_attempts', $value)) { $this->_usedProperties['maxAttempts'] = \true; $this->maxAttempts = $value['max_attempts']; unset($value['max_attempts']); } if (\array_key_exists('interval', $value)) { $this->_usedProperties['interval'] = \true; $this->interval = $value['interval']; unset($value['interval']); } if (\array_key_exists('lock_factory', $value)) { $this->_usedProperties['lockFactory'] = \true; $this->lockFactory = $value['lock_factory']; unset($value['lock_factory']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['limiter'])) { $output['limiter'] = $this->limiter; } if (isset($this->_usedProperties['maxAttempts'])) { $output['max_attempts'] = $this->maxAttempts; } if (isset($this->_usedProperties['interval'])) { $output['interval'] = $this->interval; } if (isset($this->_usedProperties['lockFactory'])) { $output['lock_factory'] = $this->lockFactory; } return $output; } } _usedProperties['checkRoute'] = \true; $this->checkRoute = $value; return $this; } /** * If true, only HTTP POST requests to "check_route" will be handled by the authenticator. * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function checkPostOnly($value) : static { $this->_usedProperties['checkPostOnly'] = \true; $this->checkPostOnly = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function signatureProperties(ParamConfigurator|array $value) : static { $this->_usedProperties['signatureProperties'] = \true; $this->signatureProperties = $value; return $this; } /** * The lifetime of the login link in seconds. * @default 600 * @param ParamConfigurator|int $value * @return $this */ public function lifetime($value) : static { $this->_usedProperties['lifetime'] = \true; $this->lifetime = $value; return $this; } /** * Max number of times a login link can be used - null means unlimited within lifetime. * @default null * @param ParamConfigurator|int $value * @return $this */ public function maxUses($value) : static { $this->_usedProperties['maxUses'] = \true; $this->maxUses = $value; return $this; } /** * Cache service id used to expired links of max_uses is set. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function usedLinkCache($value) : static { $this->_usedProperties['usedLinkCache'] = \true; $this->usedLinkCache = $value; return $this; } /** * A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function successHandler($value) : static { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value; return $this; } /** * A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureHandler($value) : static { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value; return $this; } /** * The user provider to load users from. * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function provider($value) : static { $this->_usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function alwaysUseDefaultTargetPath($value) : static { $this->_usedProperties['alwaysUseDefaultTargetPath'] = \true; $this->alwaysUseDefaultTargetPath = $value; return $this; } /** * @default '/' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultTargetPath($value) : static { $this->_usedProperties['defaultTargetPath'] = \true; $this->defaultTargetPath = $value; return $this; } /** * @default '/login' * @param ParamConfigurator|mixed $value * @return $this */ public function loginPath($value) : static { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value; return $this; } /** * @default '_target_path' * @param ParamConfigurator|mixed $value * @return $this */ public function targetPathParameter($value) : static { $this->_usedProperties['targetPathParameter'] = \true; $this->targetPathParameter = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useReferer($value) : static { $this->_usedProperties['useReferer'] = \true; $this->useReferer = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failurePath($value) : static { $this->_usedProperties['failurePath'] = \true; $this->failurePath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function failureForward($value) : static { $this->_usedProperties['failureForward'] = \true; $this->failureForward = $value; return $this; } /** * @default '_failure_path' * @param ParamConfigurator|mixed $value * @return $this */ public function failurePathParameter($value) : static { $this->_usedProperties['failurePathParameter'] = \true; $this->failurePathParameter = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('check_route', $value)) { $this->_usedProperties['checkRoute'] = \true; $this->checkRoute = $value['check_route']; unset($value['check_route']); } if (\array_key_exists('check_post_only', $value)) { $this->_usedProperties['checkPostOnly'] = \true; $this->checkPostOnly = $value['check_post_only']; unset($value['check_post_only']); } if (\array_key_exists('signature_properties', $value)) { $this->_usedProperties['signatureProperties'] = \true; $this->signatureProperties = $value['signature_properties']; unset($value['signature_properties']); } if (\array_key_exists('lifetime', $value)) { $this->_usedProperties['lifetime'] = \true; $this->lifetime = $value['lifetime']; unset($value['lifetime']); } if (\array_key_exists('max_uses', $value)) { $this->_usedProperties['maxUses'] = \true; $this->maxUses = $value['max_uses']; unset($value['max_uses']); } if (\array_key_exists('used_link_cache', $value)) { $this->_usedProperties['usedLinkCache'] = \true; $this->usedLinkCache = $value['used_link_cache']; unset($value['used_link_cache']); } if (\array_key_exists('success_handler', $value)) { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value['success_handler']; unset($value['success_handler']); } if (\array_key_exists('failure_handler', $value)) { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value['failure_handler']; unset($value['failure_handler']); } if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('always_use_default_target_path', $value)) { $this->_usedProperties['alwaysUseDefaultTargetPath'] = \true; $this->alwaysUseDefaultTargetPath = $value['always_use_default_target_path']; unset($value['always_use_default_target_path']); } if (\array_key_exists('default_target_path', $value)) { $this->_usedProperties['defaultTargetPath'] = \true; $this->defaultTargetPath = $value['default_target_path']; unset($value['default_target_path']); } if (\array_key_exists('login_path', $value)) { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value['login_path']; unset($value['login_path']); } if (\array_key_exists('target_path_parameter', $value)) { $this->_usedProperties['targetPathParameter'] = \true; $this->targetPathParameter = $value['target_path_parameter']; unset($value['target_path_parameter']); } if (\array_key_exists('use_referer', $value)) { $this->_usedProperties['useReferer'] = \true; $this->useReferer = $value['use_referer']; unset($value['use_referer']); } if (\array_key_exists('failure_path', $value)) { $this->_usedProperties['failurePath'] = \true; $this->failurePath = $value['failure_path']; unset($value['failure_path']); } if (\array_key_exists('failure_forward', $value)) { $this->_usedProperties['failureForward'] = \true; $this->failureForward = $value['failure_forward']; unset($value['failure_forward']); } if (\array_key_exists('failure_path_parameter', $value)) { $this->_usedProperties['failurePathParameter'] = \true; $this->failurePathParameter = $value['failure_path_parameter']; unset($value['failure_path_parameter']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['checkRoute'])) { $output['check_route'] = $this->checkRoute; } if (isset($this->_usedProperties['checkPostOnly'])) { $output['check_post_only'] = $this->checkPostOnly; } if (isset($this->_usedProperties['signatureProperties'])) { $output['signature_properties'] = $this->signatureProperties; } if (isset($this->_usedProperties['lifetime'])) { $output['lifetime'] = $this->lifetime; } if (isset($this->_usedProperties['maxUses'])) { $output['max_uses'] = $this->maxUses; } if (isset($this->_usedProperties['usedLinkCache'])) { $output['used_link_cache'] = $this->usedLinkCache; } if (isset($this->_usedProperties['successHandler'])) { $output['success_handler'] = $this->successHandler; } if (isset($this->_usedProperties['failureHandler'])) { $output['failure_handler'] = $this->failureHandler; } if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['alwaysUseDefaultTargetPath'])) { $output['always_use_default_target_path'] = $this->alwaysUseDefaultTargetPath; } if (isset($this->_usedProperties['defaultTargetPath'])) { $output['default_target_path'] = $this->defaultTargetPath; } if (isset($this->_usedProperties['loginPath'])) { $output['login_path'] = $this->loginPath; } if (isset($this->_usedProperties['targetPathParameter'])) { $output['target_path_parameter'] = $this->targetPathParameter; } if (isset($this->_usedProperties['useReferer'])) { $output['use_referer'] = $this->useReferer; } if (isset($this->_usedProperties['failurePath'])) { $output['failure_path'] = $this->failurePath; } if (isset($this->_usedProperties['failureForward'])) { $output['failure_forward'] = $this->failureForward; } if (isset($this->_usedProperties['failurePathParameter'])) { $output['failure_path_parameter'] = $this->failurePathParameter; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function connection($value) : static { $this->_usedProperties['connection'] = \true; $this->connection = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('connection', $value)) { $this->_usedProperties['connection'] = \true; $this->connection = $value['connection']; unset($value['connection']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['connection'])) { $output['connection'] = $this->connection; } return $output; } } _usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @template TValue * @param TValue $value * @default {"enabled":false,"connection":null} * @return \Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig : static) */ public function doctrine(array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig|static { if (!\is_array($value)) { $this->_usedProperties['doctrine'] = \true; $this->doctrine = $value; return $this; } if (!$this->doctrine instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig) { $this->_usedProperties['doctrine'] = \true; $this->doctrine = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "doctrine()" has already been initialized. You cannot pass values the second time you call doctrine().'); } return $this->doctrine; } public function __construct(array $value = []) { if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('doctrine', $value)) { $this->_usedProperties['doctrine'] = \true; $this->doctrine = \is_array($value['doctrine']) ? new \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig($value['doctrine']) : $value['doctrine']; unset($value['doctrine']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['doctrine'])) { $output['doctrine'] = $this->doctrine instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\RememberMe\TokenProvider\DoctrineConfig ? $this->doctrine->toArray() : $this->doctrine; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function rememberMe($value) : static { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function successHandler($value) : static { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failureHandler($value) : static { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value; return $this; } /** * @default '/login_check' * @param ParamConfigurator|mixed $value * @return $this */ public function checkPath($value) : static { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useForward($value) : static { $this->_usedProperties['useForward'] = \true; $this->useForward = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @deprecated Option "require_previous_session" at "form_login_ldap" is deprecated, it will be removed in version 7.0. Setting it has no effect anymore. * @return $this */ public function requirePreviousSession($value) : static { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value; return $this; } /** * @default '/login' * @param ParamConfigurator|mixed $value * @return $this */ public function loginPath($value) : static { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value; return $this; } /** * @default '_username' * @param ParamConfigurator|mixed $value * @return $this */ public function usernameParameter($value) : static { $this->_usedProperties['usernameParameter'] = \true; $this->usernameParameter = $value; return $this; } /** * @default '_password' * @param ParamConfigurator|mixed $value * @return $this */ public function passwordParameter($value) : static { $this->_usedProperties['passwordParameter'] = \true; $this->passwordParameter = $value; return $this; } /** * @default '_csrf_token' * @param ParamConfigurator|mixed $value * @return $this */ public function csrfParameter($value) : static { $this->_usedProperties['csrfParameter'] = \true; $this->csrfParameter = $value; return $this; } /** * @default 'authenticate' * @param ParamConfigurator|mixed $value * @return $this */ public function csrfTokenId($value) : static { $this->_usedProperties['csrfTokenId'] = \true; $this->csrfTokenId = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function enableCsrf($value) : static { $this->_usedProperties['enableCsrf'] = \true; $this->enableCsrf = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function postOnly($value) : static { $this->_usedProperties['postOnly'] = \true; $this->postOnly = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function formOnly($value) : static { $this->_usedProperties['formOnly'] = \true; $this->formOnly = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function alwaysUseDefaultTargetPath($value) : static { $this->_usedProperties['alwaysUseDefaultTargetPath'] = \true; $this->alwaysUseDefaultTargetPath = $value; return $this; } /** * @default '/' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultTargetPath($value) : static { $this->_usedProperties['defaultTargetPath'] = \true; $this->defaultTargetPath = $value; return $this; } /** * @default '_target_path' * @param ParamConfigurator|mixed $value * @return $this */ public function targetPathParameter($value) : static { $this->_usedProperties['targetPathParameter'] = \true; $this->targetPathParameter = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useReferer($value) : static { $this->_usedProperties['useReferer'] = \true; $this->useReferer = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function failurePath($value) : static { $this->_usedProperties['failurePath'] = \true; $this->failurePath = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function failureForward($value) : static { $this->_usedProperties['failureForward'] = \true; $this->failureForward = $value; return $this; } /** * @default '_failure_path' * @param ParamConfigurator|mixed $value * @return $this */ public function failurePathParameter($value) : static { $this->_usedProperties['failurePathParameter'] = \true; $this->failurePathParameter = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function csrfTokenGenerator($value) : static { $this->_usedProperties['csrfTokenGenerator'] = \true; $this->csrfTokenGenerator = $value; return $this; } /** * @default 'ldap' * @param ParamConfigurator|mixed $value * @return $this */ public function service($value) : static { $this->_usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @default '{username}' * @param ParamConfigurator|mixed $value * @return $this */ public function dnString($value) : static { $this->_usedProperties['dnString'] = \true; $this->dnString = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function queryString($value) : static { $this->_usedProperties['queryString'] = \true; $this->queryString = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function searchDn($value) : static { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function searchPassword($value) : static { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('remember_me', $value)) { $this->_usedProperties['rememberMe'] = \true; $this->rememberMe = $value['remember_me']; unset($value['remember_me']); } if (\array_key_exists('success_handler', $value)) { $this->_usedProperties['successHandler'] = \true; $this->successHandler = $value['success_handler']; unset($value['success_handler']); } if (\array_key_exists('failure_handler', $value)) { $this->_usedProperties['failureHandler'] = \true; $this->failureHandler = $value['failure_handler']; unset($value['failure_handler']); } if (\array_key_exists('check_path', $value)) { $this->_usedProperties['checkPath'] = \true; $this->checkPath = $value['check_path']; unset($value['check_path']); } if (\array_key_exists('use_forward', $value)) { $this->_usedProperties['useForward'] = \true; $this->useForward = $value['use_forward']; unset($value['use_forward']); } if (\array_key_exists('require_previous_session', $value)) { $this->_usedProperties['requirePreviousSession'] = \true; $this->requirePreviousSession = $value['require_previous_session']; unset($value['require_previous_session']); } if (\array_key_exists('login_path', $value)) { $this->_usedProperties['loginPath'] = \true; $this->loginPath = $value['login_path']; unset($value['login_path']); } if (\array_key_exists('username_parameter', $value)) { $this->_usedProperties['usernameParameter'] = \true; $this->usernameParameter = $value['username_parameter']; unset($value['username_parameter']); } if (\array_key_exists('password_parameter', $value)) { $this->_usedProperties['passwordParameter'] = \true; $this->passwordParameter = $value['password_parameter']; unset($value['password_parameter']); } if (\array_key_exists('csrf_parameter', $value)) { $this->_usedProperties['csrfParameter'] = \true; $this->csrfParameter = $value['csrf_parameter']; unset($value['csrf_parameter']); } if (\array_key_exists('csrf_token_id', $value)) { $this->_usedProperties['csrfTokenId'] = \true; $this->csrfTokenId = $value['csrf_token_id']; unset($value['csrf_token_id']); } if (\array_key_exists('enable_csrf', $value)) { $this->_usedProperties['enableCsrf'] = \true; $this->enableCsrf = $value['enable_csrf']; unset($value['enable_csrf']); } if (\array_key_exists('post_only', $value)) { $this->_usedProperties['postOnly'] = \true; $this->postOnly = $value['post_only']; unset($value['post_only']); } if (\array_key_exists('form_only', $value)) { $this->_usedProperties['formOnly'] = \true; $this->formOnly = $value['form_only']; unset($value['form_only']); } if (\array_key_exists('always_use_default_target_path', $value)) { $this->_usedProperties['alwaysUseDefaultTargetPath'] = \true; $this->alwaysUseDefaultTargetPath = $value['always_use_default_target_path']; unset($value['always_use_default_target_path']); } if (\array_key_exists('default_target_path', $value)) { $this->_usedProperties['defaultTargetPath'] = \true; $this->defaultTargetPath = $value['default_target_path']; unset($value['default_target_path']); } if (\array_key_exists('target_path_parameter', $value)) { $this->_usedProperties['targetPathParameter'] = \true; $this->targetPathParameter = $value['target_path_parameter']; unset($value['target_path_parameter']); } if (\array_key_exists('use_referer', $value)) { $this->_usedProperties['useReferer'] = \true; $this->useReferer = $value['use_referer']; unset($value['use_referer']); } if (\array_key_exists('failure_path', $value)) { $this->_usedProperties['failurePath'] = \true; $this->failurePath = $value['failure_path']; unset($value['failure_path']); } if (\array_key_exists('failure_forward', $value)) { $this->_usedProperties['failureForward'] = \true; $this->failureForward = $value['failure_forward']; unset($value['failure_forward']); } if (\array_key_exists('failure_path_parameter', $value)) { $this->_usedProperties['failurePathParameter'] = \true; $this->failurePathParameter = $value['failure_path_parameter']; unset($value['failure_path_parameter']); } if (\array_key_exists('csrf_token_generator', $value)) { $this->_usedProperties['csrfTokenGenerator'] = \true; $this->csrfTokenGenerator = $value['csrf_token_generator']; unset($value['csrf_token_generator']); } if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('dn_string', $value)) { $this->_usedProperties['dnString'] = \true; $this->dnString = $value['dn_string']; unset($value['dn_string']); } if (\array_key_exists('query_string', $value)) { $this->_usedProperties['queryString'] = \true; $this->queryString = $value['query_string']; unset($value['query_string']); } if (\array_key_exists('search_dn', $value)) { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value['search_dn']; unset($value['search_dn']); } if (\array_key_exists('search_password', $value)) { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value['search_password']; unset($value['search_password']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['rememberMe'])) { $output['remember_me'] = $this->rememberMe; } if (isset($this->_usedProperties['successHandler'])) { $output['success_handler'] = $this->successHandler; } if (isset($this->_usedProperties['failureHandler'])) { $output['failure_handler'] = $this->failureHandler; } if (isset($this->_usedProperties['checkPath'])) { $output['check_path'] = $this->checkPath; } if (isset($this->_usedProperties['useForward'])) { $output['use_forward'] = $this->useForward; } if (isset($this->_usedProperties['requirePreviousSession'])) { $output['require_previous_session'] = $this->requirePreviousSession; } if (isset($this->_usedProperties['loginPath'])) { $output['login_path'] = $this->loginPath; } if (isset($this->_usedProperties['usernameParameter'])) { $output['username_parameter'] = $this->usernameParameter; } if (isset($this->_usedProperties['passwordParameter'])) { $output['password_parameter'] = $this->passwordParameter; } if (isset($this->_usedProperties['csrfParameter'])) { $output['csrf_parameter'] = $this->csrfParameter; } if (isset($this->_usedProperties['csrfTokenId'])) { $output['csrf_token_id'] = $this->csrfTokenId; } if (isset($this->_usedProperties['enableCsrf'])) { $output['enable_csrf'] = $this->enableCsrf; } if (isset($this->_usedProperties['postOnly'])) { $output['post_only'] = $this->postOnly; } if (isset($this->_usedProperties['formOnly'])) { $output['form_only'] = $this->formOnly; } if (isset($this->_usedProperties['alwaysUseDefaultTargetPath'])) { $output['always_use_default_target_path'] = $this->alwaysUseDefaultTargetPath; } if (isset($this->_usedProperties['defaultTargetPath'])) { $output['default_target_path'] = $this->defaultTargetPath; } if (isset($this->_usedProperties['targetPathParameter'])) { $output['target_path_parameter'] = $this->targetPathParameter; } if (isset($this->_usedProperties['useReferer'])) { $output['use_referer'] = $this->useReferer; } if (isset($this->_usedProperties['failurePath'])) { $output['failure_path'] = $this->failurePath; } if (isset($this->_usedProperties['failureForward'])) { $output['failure_forward'] = $this->failureForward; } if (isset($this->_usedProperties['failurePathParameter'])) { $output['failure_path_parameter'] = $this->failurePathParameter; } if (isset($this->_usedProperties['csrfTokenGenerator'])) { $output['csrf_token_generator'] = $this->csrfTokenGenerator; } if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['dnString'])) { $output['dn_string'] = $this->dnString; } if (isset($this->_usedProperties['queryString'])) { $output['query_string'] = $this->queryString; } if (isset($this->_usedProperties['searchDn'])) { $output['search_dn'] = $this->searchDn; } if (isset($this->_usedProperties['searchPassword'])) { $output['search_password'] = $this->searchPassword; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default 'Secured Area' * @param ParamConfigurator|mixed $value * @return $this */ public function realm($value) : static { $this->_usedProperties['realm'] = \true; $this->realm = $value; return $this; } /** * @default 'ldap' * @param ParamConfigurator|mixed $value * @return $this */ public function service($value) : static { $this->_usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @default '{username}' * @param ParamConfigurator|mixed $value * @return $this */ public function dnString($value) : static { $this->_usedProperties['dnString'] = \true; $this->dnString = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function queryString($value) : static { $this->_usedProperties['queryString'] = \true; $this->queryString = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function searchDn($value) : static { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value; return $this; } /** * @param ParamConfigurator|mixed $value * @return $this */ public function searchPassword($value) : static { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('realm', $value)) { $this->_usedProperties['realm'] = \true; $this->realm = $value['realm']; unset($value['realm']); } if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('dn_string', $value)) { $this->_usedProperties['dnString'] = \true; $this->dnString = $value['dn_string']; unset($value['dn_string']); } if (\array_key_exists('query_string', $value)) { $this->_usedProperties['queryString'] = \true; $this->queryString = $value['query_string']; unset($value['query_string']); } if (\array_key_exists('search_dn', $value)) { $this->_usedProperties['searchDn'] = \true; $this->searchDn = $value['search_dn']; unset($value['search_dn']); } if (\array_key_exists('search_password', $value)) { $this->_usedProperties['searchPassword'] = \true; $this->searchPassword = $value['search_password']; unset($value['search_password']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['realm'])) { $output['realm'] = $this->realm; } if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['dnString'])) { $output['dn_string'] = $this->dnString; } if (isset($this->_usedProperties['queryString'])) { $output['query_string'] = $this->queryString; } if (isset($this->_usedProperties['searchDn'])) { $output['search_dn'] = $this->searchDn; } if (isset($this->_usedProperties['searchPassword'])) { $output['search_password'] = $this->searchPassword; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default 'SSL_CLIENT_S_DN_Email' * @param ParamConfigurator|mixed $value * @return $this */ public function user($value) : static { $this->_usedProperties['user'] = \true; $this->user = $value; return $this; } /** * @default 'SSL_CLIENT_S_DN' * @param ParamConfigurator|mixed $value * @return $this */ public function credentials($value) : static { $this->_usedProperties['credentials'] = \true; $this->credentials = $value; return $this; } /** * @default 'emailAddress' * @param ParamConfigurator|mixed $value * @return $this */ public function userIdentifier($value) : static { $this->_usedProperties['userIdentifier'] = \true; $this->userIdentifier = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('user', $value)) { $this->_usedProperties['user'] = \true; $this->user = $value['user']; unset($value['user']); } if (\array_key_exists('credentials', $value)) { $this->_usedProperties['credentials'] = \true; $this->credentials = $value['credentials']; unset($value['credentials']); } if (\array_key_exists('user_identifier', $value)) { $this->_usedProperties['userIdentifier'] = \true; $this->userIdentifier = $value['user_identifier']; unset($value['user_identifier']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['user'])) { $output['user'] = $this->user; } if (isset($this->_usedProperties['credentials'])) { $output['credentials'] = $this->credentials; } if (isset($this->_usedProperties['userIdentifier'])) { $output['user_identifier'] = $this->userIdentifier; } return $output; } } _usedProperties['provider'] = \true; $this->provider = $value; return $this; } /** * @default 'REMOTE_USER' * @param ParamConfigurator|mixed $value * @return $this */ public function user($value) : static { $this->_usedProperties['user'] = \true; $this->user = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('provider', $value)) { $this->_usedProperties['provider'] = \true; $this->provider = $value['provider']; unset($value['provider']); } if (\array_key_exists('user', $value)) { $this->_usedProperties['user'] = \true; $this->user = $value['user']; unset($value['user']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['provider'])) { $output['provider'] = $this->provider; } if (isset($this->_usedProperties['user'])) { $output['user'] = $this->user; } return $output; } } _usedProperties['enableCsrf'] = \true; $this->enableCsrf = $value; return $this; } /** * @default 'logout' * @param ParamConfigurator|mixed $value * @return $this */ public function csrfTokenId($value) : static { $this->_usedProperties['csrfTokenId'] = \true; $this->csrfTokenId = $value; return $this; } /** * @default '_csrf_token' * @param ParamConfigurator|mixed $value * @return $this */ public function csrfParameter($value) : static { $this->_usedProperties['csrfParameter'] = \true; $this->csrfParameter = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @deprecated The "csrf_token_generator" option is deprecated. Use "csrf_token_manager" instead. * @return $this */ public function csrfTokenGenerator($value) : static { $this->_usedProperties['csrfTokenGenerator'] = \true; $this->csrfTokenGenerator = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function csrfTokenManager($value) : static { $this->_usedProperties['csrfTokenManager'] = \true; $this->csrfTokenManager = $value; return $this; } /** * @default '/logout' * @param ParamConfigurator|mixed $value * @return $this */ public function path($value) : static { $this->_usedProperties['path'] = \true; $this->path = $value; return $this; } /** * @default '/' * @param ParamConfigurator|mixed $value * @return $this */ public function target($value) : static { $this->_usedProperties['target'] = \true; $this->target = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function invalidateSession($value) : static { $this->_usedProperties['invalidateSession'] = \true; $this->invalidateSession = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function clearSiteData(ParamConfigurator|string|array $value) : static { $this->_usedProperties['clearSiteData'] = \true; $this->clearSiteData = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig : static) */ public function deleteCookie(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig|static { if (!\is_array($value)) { $this->_usedProperties['deleteCookies'] = \true; $this->deleteCookies[$name] = $value; return $this; } if (!isset($this->deleteCookies[$name]) || !$this->deleteCookies[$name] instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig) { $this->_usedProperties['deleteCookies'] = \true; $this->deleteCookies[$name] = new \_ContaoManager\Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "deleteCookie()" has already been initialized. You cannot pass values the second time you call deleteCookie().'); } return $this->deleteCookies[$name]; } public function __construct(array $value = []) { if (\array_key_exists('enable_csrf', $value)) { $this->_usedProperties['enableCsrf'] = \true; $this->enableCsrf = $value['enable_csrf']; unset($value['enable_csrf']); } if (\array_key_exists('csrf_token_id', $value)) { $this->_usedProperties['csrfTokenId'] = \true; $this->csrfTokenId = $value['csrf_token_id']; unset($value['csrf_token_id']); } if (\array_key_exists('csrf_parameter', $value)) { $this->_usedProperties['csrfParameter'] = \true; $this->csrfParameter = $value['csrf_parameter']; unset($value['csrf_parameter']); } if (\array_key_exists('csrf_token_generator', $value)) { $this->_usedProperties['csrfTokenGenerator'] = \true; $this->csrfTokenGenerator = $value['csrf_token_generator']; unset($value['csrf_token_generator']); } if (\array_key_exists('csrf_token_manager', $value)) { $this->_usedProperties['csrfTokenManager'] = \true; $this->csrfTokenManager = $value['csrf_token_manager']; unset($value['csrf_token_manager']); } if (\array_key_exists('path', $value)) { $this->_usedProperties['path'] = \true; $this->path = $value['path']; unset($value['path']); } if (\array_key_exists('target', $value)) { $this->_usedProperties['target'] = \true; $this->target = $value['target']; unset($value['target']); } if (\array_key_exists('invalidate_session', $value)) { $this->_usedProperties['invalidateSession'] = \true; $this->invalidateSession = $value['invalidate_session']; unset($value['invalidate_session']); } if (\array_key_exists('clear_site_data', $value)) { $this->_usedProperties['clearSiteData'] = \true; $this->clearSiteData = $value['clear_site_data']; unset($value['clear_site_data']); } if (\array_key_exists('delete_cookies', $value)) { $this->_usedProperties['deleteCookies'] = \true; $this->deleteCookies = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig($v) : $v, $value['delete_cookies']); unset($value['delete_cookies']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enableCsrf'])) { $output['enable_csrf'] = $this->enableCsrf; } if (isset($this->_usedProperties['csrfTokenId'])) { $output['csrf_token_id'] = $this->csrfTokenId; } if (isset($this->_usedProperties['csrfParameter'])) { $output['csrf_parameter'] = $this->csrfParameter; } if (isset($this->_usedProperties['csrfTokenGenerator'])) { $output['csrf_token_generator'] = $this->csrfTokenGenerator; } if (isset($this->_usedProperties['csrfTokenManager'])) { $output['csrf_token_manager'] = $this->csrfTokenManager; } if (isset($this->_usedProperties['path'])) { $output['path'] = $this->path; } if (isset($this->_usedProperties['target'])) { $output['target'] = $this->target; } if (isset($this->_usedProperties['invalidateSession'])) { $output['invalidate_session'] = $this->invalidateSession; } if (isset($this->_usedProperties['clearSiteData'])) { $output['clear_site_data'] = $this->clearSiteData; } if (isset($this->_usedProperties['deleteCookies'])) { $output['delete_cookies'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Security\FirewallConfig\Logout\DeleteCookieConfig ? $v->toArray() : $v, $this->deleteCookies); } return $output; } } _usedProperties['strategy'] = \true; $this->strategy = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function service($value) : static { $this->_usedProperties['service'] = \true; $this->service = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function strategyService($value) : static { $this->_usedProperties['strategyService'] = \true; $this->strategyService = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function allowIfAllAbstain($value) : static { $this->_usedProperties['allowIfAllAbstain'] = \true; $this->allowIfAllAbstain = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function allowIfEqualGrantedDenied($value) : static { $this->_usedProperties['allowIfEqualGrantedDenied'] = \true; $this->allowIfEqualGrantedDenied = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('strategy', $value)) { $this->_usedProperties['strategy'] = \true; $this->strategy = $value['strategy']; unset($value['strategy']); } if (\array_key_exists('service', $value)) { $this->_usedProperties['service'] = \true; $this->service = $value['service']; unset($value['service']); } if (\array_key_exists('strategy_service', $value)) { $this->_usedProperties['strategyService'] = \true; $this->strategyService = $value['strategy_service']; unset($value['strategy_service']); } if (\array_key_exists('allow_if_all_abstain', $value)) { $this->_usedProperties['allowIfAllAbstain'] = \true; $this->allowIfAllAbstain = $value['allow_if_all_abstain']; unset($value['allow_if_all_abstain']); } if (\array_key_exists('allow_if_equal_granted_denied', $value)) { $this->_usedProperties['allowIfEqualGrantedDenied'] = \true; $this->allowIfEqualGrantedDenied = $value['allow_if_equal_granted_denied']; unset($value['allow_if_equal_granted_denied']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['strategy'])) { $output['strategy'] = $this->strategy; } if (isset($this->_usedProperties['service'])) { $output['service'] = $this->service; } if (isset($this->_usedProperties['strategyService'])) { $output['strategy_service'] = $this->strategyService; } if (isset($this->_usedProperties['allowIfAllAbstain'])) { $output['allow_if_all_abstain'] = $this->allowIfAllAbstain; } if (isset($this->_usedProperties['allowIfEqualGrantedDenied'])) { $output['allow_if_equal_granted_denied'] = $this->allowIfEqualGrantedDenied; } return $output; } } _usedProperties['requestMatcher'] = \true; $this->requestMatcher = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function requiresChannel($value) : static { $this->_usedProperties['requiresChannel'] = \true; $this->requiresChannel = $value; return $this; } /** * use the urldecoded format * @example ^/path to resource/ * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function path($value) : static { $this->_usedProperties['path'] = \true; $this->path = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } /** * @default null * @param ParamConfigurator|int $value * @return $this */ public function port($value) : static { $this->_usedProperties['port'] = \true; $this->port = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function ips(ParamConfigurator|string|array $value) : static { $this->_usedProperties['ips'] = \true; $this->ips = $value; return $this; } /** * @return $this */ public function attribute(string $key, mixed $value) : static { $this->_usedProperties['attributes'] = \true; $this->attributes[$key] = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function route($value) : static { $this->_usedProperties['route'] = \true; $this->route = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function methods(ParamConfigurator|string|array $value) : static { $this->_usedProperties['methods'] = \true; $this->methods = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function allowIf($value) : static { $this->_usedProperties['allowIf'] = \true; $this->allowIf = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function roles(ParamConfigurator|string|array $value) : static { $this->_usedProperties['roles'] = \true; $this->roles = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('request_matcher', $value)) { $this->_usedProperties['requestMatcher'] = \true; $this->requestMatcher = $value['request_matcher']; unset($value['request_matcher']); } if (\array_key_exists('requires_channel', $value)) { $this->_usedProperties['requiresChannel'] = \true; $this->requiresChannel = $value['requires_channel']; unset($value['requires_channel']); } if (\array_key_exists('path', $value)) { $this->_usedProperties['path'] = \true; $this->path = $value['path']; unset($value['path']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if (\array_key_exists('port', $value)) { $this->_usedProperties['port'] = \true; $this->port = $value['port']; unset($value['port']); } if (\array_key_exists('ips', $value)) { $this->_usedProperties['ips'] = \true; $this->ips = $value['ips']; unset($value['ips']); } if (\array_key_exists('attributes', $value)) { $this->_usedProperties['attributes'] = \true; $this->attributes = $value['attributes']; unset($value['attributes']); } if (\array_key_exists('route', $value)) { $this->_usedProperties['route'] = \true; $this->route = $value['route']; unset($value['route']); } if (\array_key_exists('methods', $value)) { $this->_usedProperties['methods'] = \true; $this->methods = $value['methods']; unset($value['methods']); } if (\array_key_exists('allow_if', $value)) { $this->_usedProperties['allowIf'] = \true; $this->allowIf = $value['allow_if']; unset($value['allow_if']); } if (\array_key_exists('roles', $value)) { $this->_usedProperties['roles'] = \true; $this->roles = $value['roles']; unset($value['roles']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['requestMatcher'])) { $output['request_matcher'] = $this->requestMatcher; } if (isset($this->_usedProperties['requiresChannel'])) { $output['requires_channel'] = $this->requiresChannel; } if (isset($this->_usedProperties['path'])) { $output['path'] = $this->path; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } if (isset($this->_usedProperties['port'])) { $output['port'] = $this->port; } if (isset($this->_usedProperties['ips'])) { $output['ips'] = $this->ips; } if (isset($this->_usedProperties['attributes'])) { $output['attributes'] = $this->attributes; } if (isset($this->_usedProperties['route'])) { $output['route'] = $this->route; } if (isset($this->_usedProperties['methods'])) { $output['methods'] = $this->methods; } if (isset($this->_usedProperties['allowIf'])) { $output['allow_if'] = $this->allowIf; } if (isset($this->_usedProperties['roles'])) { $output['roles'] = $this->roles; } return $output; } } _usedProperties['accessDeniedUrl'] = \true; $this->accessDeniedUrl = $value; return $this; } /** * @default 'migrate' * @param ParamConfigurator|'none'|'migrate'|'invalidate' $value * @return $this */ public function sessionFixationStrategy($value) : static { $this->_usedProperties['sessionFixationStrategy'] = \true; $this->sessionFixationStrategy = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function hideUserNotFound($value) : static { $this->_usedProperties['hideUserNotFound'] = \true; $this->hideUserNotFound = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function eraseCredentials($value) : static { $this->_usedProperties['eraseCredentials'] = \true; $this->eraseCredentials = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @deprecated The "enable_authenticator_manager" option at "security" is deprecated. * @return $this */ public function enableAuthenticatorManager($value) : static { $this->_usedProperties['enableAuthenticatorManager'] = \true; $this->enableAuthenticatorManager = $value; return $this; } /** * @default {"allow_if_all_abstain":false,"allow_if_equal_granted_denied":true} */ public function accessDecisionManager(array $value = []) : \_ContaoManager\Symfony\Config\Security\AccessDecisionManagerConfig { if (null === $this->accessDecisionManager) { $this->_usedProperties['accessDecisionManager'] = \true; $this->accessDecisionManager = new \_ContaoManager\Symfony\Config\Security\AccessDecisionManagerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "accessDecisionManager()" has already been initialized. You cannot pass values the second time you call accessDecisionManager().'); } return $this->accessDecisionManager; } /** * @template TValue * @param TValue $value * @example "auto" * @example {"algorithm":"auto","time_cost":8,"cost":13} * @return \Symfony\Config\Security\PasswordHasherConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Security\PasswordHasherConfig : static) */ public function passwordHasher(string $class, string|array $value = []) : \_ContaoManager\Symfony\Config\Security\PasswordHasherConfig|static { if (!\is_array($value)) { $this->_usedProperties['passwordHashers'] = \true; $this->passwordHashers[$class] = $value; return $this; } if (!isset($this->passwordHashers[$class]) || !$this->passwordHashers[$class] instanceof \_ContaoManager\Symfony\Config\Security\PasswordHasherConfig) { $this->_usedProperties['passwordHashers'] = \true; $this->passwordHashers[$class] = new \_ContaoManager\Symfony\Config\Security\PasswordHasherConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "passwordHasher()" has already been initialized. You cannot pass values the second time you call passwordHasher().'); } return $this->passwordHashers[$class]; } /** * @example {"memory":{"users":{"foo":{"password":"foo","roles":"ROLE_USER"},"bar":{"password":"bar","roles":"[ROLE_USER, ROLE_ADMIN]"}}}} * @example {"entity":{"class":"SecurityBundle:User","property":"username"}} */ public function provider(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Security\ProviderConfig { if (!isset($this->providers[$name])) { $this->_usedProperties['providers'] = \true; $this->providers[$name] = new \_ContaoManager\Symfony\Config\Security\ProviderConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "provider()" has already been initialized. You cannot pass values the second time you call provider().'); } return $this->providers[$name]; } public function firewall(string $name, array $value = []) : \_ContaoManager\Symfony\Config\Security\FirewallConfig { if (!isset($this->firewalls[$name])) { $this->_usedProperties['firewalls'] = \true; $this->firewalls[$name] = new \_ContaoManager\Symfony\Config\Security\FirewallConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "firewall()" has already been initialized. You cannot pass values the second time you call firewall().'); } return $this->firewalls[$name]; } public function accessControl(array $value = []) : \_ContaoManager\Symfony\Config\Security\AccessControlConfig { $this->_usedProperties['accessControl'] = \true; return $this->accessControl[] = new \_ContaoManager\Symfony\Config\Security\AccessControlConfig($value); } /** * @return $this */ public function roleHierarchy(string $id, mixed $value) : static { $this->_usedProperties['roleHierarchy'] = \true; $this->roleHierarchy[$id] = $value; return $this; } public function getExtensionAlias() : string { return 'security'; } public function __construct(array $value = []) { if (\array_key_exists('access_denied_url', $value)) { $this->_usedProperties['accessDeniedUrl'] = \true; $this->accessDeniedUrl = $value['access_denied_url']; unset($value['access_denied_url']); } if (\array_key_exists('session_fixation_strategy', $value)) { $this->_usedProperties['sessionFixationStrategy'] = \true; $this->sessionFixationStrategy = $value['session_fixation_strategy']; unset($value['session_fixation_strategy']); } if (\array_key_exists('hide_user_not_found', $value)) { $this->_usedProperties['hideUserNotFound'] = \true; $this->hideUserNotFound = $value['hide_user_not_found']; unset($value['hide_user_not_found']); } if (\array_key_exists('erase_credentials', $value)) { $this->_usedProperties['eraseCredentials'] = \true; $this->eraseCredentials = $value['erase_credentials']; unset($value['erase_credentials']); } if (\array_key_exists('enable_authenticator_manager', $value)) { $this->_usedProperties['enableAuthenticatorManager'] = \true; $this->enableAuthenticatorManager = $value['enable_authenticator_manager']; unset($value['enable_authenticator_manager']); } if (\array_key_exists('access_decision_manager', $value)) { $this->_usedProperties['accessDecisionManager'] = \true; $this->accessDecisionManager = new \_ContaoManager\Symfony\Config\Security\AccessDecisionManagerConfig($value['access_decision_manager']); unset($value['access_decision_manager']); } if (\array_key_exists('password_hashers', $value)) { $this->_usedProperties['passwordHashers'] = \true; $this->passwordHashers = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Security\PasswordHasherConfig($v) : $v, $value['password_hashers']); unset($value['password_hashers']); } if (\array_key_exists('providers', $value)) { $this->_usedProperties['providers'] = \true; $this->providers = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Security\ProviderConfig($v), $value['providers']); unset($value['providers']); } if (\array_key_exists('firewalls', $value)) { $this->_usedProperties['firewalls'] = \true; $this->firewalls = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Security\FirewallConfig($v), $value['firewalls']); unset($value['firewalls']); } if (\array_key_exists('access_control', $value)) { $this->_usedProperties['accessControl'] = \true; $this->accessControl = \array_map(fn($v) => new \_ContaoManager\Symfony\Config\Security\AccessControlConfig($v), $value['access_control']); unset($value['access_control']); } if (\array_key_exists('role_hierarchy', $value)) { $this->_usedProperties['roleHierarchy'] = \true; $this->roleHierarchy = $value['role_hierarchy']; unset($value['role_hierarchy']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['accessDeniedUrl'])) { $output['access_denied_url'] = $this->accessDeniedUrl; } if (isset($this->_usedProperties['sessionFixationStrategy'])) { $output['session_fixation_strategy'] = $this->sessionFixationStrategy; } if (isset($this->_usedProperties['hideUserNotFound'])) { $output['hide_user_not_found'] = $this->hideUserNotFound; } if (isset($this->_usedProperties['eraseCredentials'])) { $output['erase_credentials'] = $this->eraseCredentials; } if (isset($this->_usedProperties['enableAuthenticatorManager'])) { $output['enable_authenticator_manager'] = $this->enableAuthenticatorManager; } if (isset($this->_usedProperties['accessDecisionManager'])) { $output['access_decision_manager'] = $this->accessDecisionManager->toArray(); } if (isset($this->_usedProperties['passwordHashers'])) { $output['password_hashers'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Security\PasswordHasherConfig ? $v->toArray() : $v, $this->passwordHashers); } if (isset($this->_usedProperties['providers'])) { $output['providers'] = \array_map(fn($v) => $v->toArray(), $this->providers); } if (isset($this->_usedProperties['firewalls'])) { $output['firewalls'] = \array_map(fn($v) => $v->toArray(), $this->firewalls); } if (isset($this->_usedProperties['accessControl'])) { $output['access_control'] = \array_map(fn($v) => $v->toArray(), $this->accessControl); } if (isset($this->_usedProperties['roleHierarchy'])) { $output['role_hierarchy'] = $this->roleHierarchy; } return $output; } } _usedProperties['useMicroseconds'] = \true; $this->useMicroseconds = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function channels(ParamConfigurator|array $value) : static { $this->_usedProperties['channels'] = \true; $this->channels = $value; return $this; } /** * @template TValue * @param TValue $value * @example {"type":"stream","path":"\/var\/log\/symfony.log","level":"ERROR","bubble":"false","formatter":"my_formatter"} * @example {"type":"fingers_crossed","action_level":"WARNING","buffer_size":30,"handler":"custom"} * @example {"type":"service","id":"my_handler"} * @return \Symfony\Config\Monolog\HandlerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig : static) */ public function handler(string $name, mixed $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig|static { if (!\is_array($value)) { $this->_usedProperties['handlers'] = \true; $this->handlers[$name] = $value; return $this; } if (!isset($this->handlers[$name]) || !$this->handlers[$name] instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig) { $this->_usedProperties['handlers'] = \true; $this->handlers[$name] = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "handler()" has already been initialized. You cannot pass values the second time you call handler().'); } return $this->handlers[$name]; } public function getExtensionAlias() : string { return 'monolog'; } public function __construct(array $value = []) { if (\array_key_exists('use_microseconds', $value)) { $this->_usedProperties['useMicroseconds'] = \true; $this->useMicroseconds = $value['use_microseconds']; unset($value['use_microseconds']); } if (\array_key_exists('channels', $value)) { $this->_usedProperties['channels'] = \true; $this->channels = $value['channels']; unset($value['channels']); } if (\array_key_exists('handlers', $value)) { $this->_usedProperties['handlers'] = \true; $this->handlers = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig($v) : $v, $value['handlers']); unset($value['handlers']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['useMicroseconds'])) { $output['use_microseconds'] = $this->useMicroseconds; } if (isset($this->_usedProperties['channels'])) { $output['channels'] = $this->channels; } if (isset($this->_usedProperties['handlers'])) { $output['handlers'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig ? $v->toArray() : $v, $this->handlers); } return $output; } } _usedProperties['type'] = \true; $this->type = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function id($value) : static { $this->_usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default 0 * @param ParamConfigurator|mixed $value * @return $this */ public function priority($value) : static { $this->_usedProperties['priority'] = \true; $this->priority = $value; return $this; } /** * @default 'DEBUG' * @param ParamConfigurator|mixed $value * @return $this */ public function level($value) : static { $this->_usedProperties['level'] = \true; $this->level = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function bubble($value) : static { $this->_usedProperties['bubble'] = \true; $this->bubble = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function appName($value) : static { $this->_usedProperties['appName'] = \true; $this->appName = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function fillExtraContext($value) : static { $this->_usedProperties['fillExtraContext'] = \true; $this->fillExtraContext = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function includeStacktraces($value) : static { $this->_usedProperties['includeStacktraces'] = \true; $this->includeStacktraces = $value; return $this; } /** * @template TValue * @param TValue $value * @default {"enabled":null} * @return \Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig : static) */ public function processPsr3Messages(mixed $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig|static { if (!\is_array($value)) { $this->_usedProperties['processPsr3Messages'] = \true; $this->processPsr3Messages = $value; return $this; } if (!$this->processPsr3Messages instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig) { $this->_usedProperties['processPsr3Messages'] = \true; $this->processPsr3Messages = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "processPsr3Messages()" has already been initialized. You cannot pass values the second time you call processPsr3Messages().'); } return $this->processPsr3Messages; } /** * @default '%kernel.logs_dir%/%kernel.environment%.log' * @param ParamConfigurator|mixed $value * @return $this */ public function path($value) : static { $this->_usedProperties['path'] = \true; $this->path = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function filePermission($value) : static { $this->_usedProperties['filePermission'] = \true; $this->filePermission = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function useLocking($value) : static { $this->_usedProperties['useLocking'] = \true; $this->useLocking = $value; return $this; } /** * @default '{filename}-{date}' * @param ParamConfigurator|mixed $value * @return $this */ public function filenameFormat($value) : static { $this->_usedProperties['filenameFormat'] = \true; $this->filenameFormat = $value; return $this; } /** * @default 'Y-m-d' * @param ParamConfigurator|mixed $value * @return $this */ public function dateFormat($value) : static { $this->_usedProperties['dateFormat'] = \true; $this->dateFormat = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function ident($value) : static { $this->_usedProperties['ident'] = \true; $this->ident = $value; return $this; } /** * @default 1 * @param ParamConfigurator|mixed $value * @return $this */ public function logopts($value) : static { $this->_usedProperties['logopts'] = \true; $this->logopts = $value; return $this; } /** * @default 'user' * @param ParamConfigurator|mixed $value * @return $this */ public function facility($value) : static { $this->_usedProperties['facility'] = \true; $this->facility = $value; return $this; } /** * @default 0 * @param ParamConfigurator|mixed $value * @return $this */ public function maxFiles($value) : static { $this->_usedProperties['maxFiles'] = \true; $this->maxFiles = $value; return $this; } /** * @default 'WARNING' * @param ParamConfigurator|mixed $value * @return $this */ public function actionLevel($value) : static { $this->_usedProperties['actionLevel'] = \true; $this->actionLevel = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function activationStrategy($value) : static { $this->_usedProperties['activationStrategy'] = \true; $this->activationStrategy = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function stopBuffering($value) : static { $this->_usedProperties['stopBuffering'] = \true; $this->stopBuffering = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function passthruLevel($value) : static { $this->_usedProperties['passthruLevel'] = \true; $this->passthruLevel = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function excluded404s(ParamConfigurator|array $value) : static { $this->_usedProperties['excluded404s'] = \true; $this->excluded404s = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\ExcludedHttpCodeConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\ExcludedHttpCodeConfig : static) */ public function excludedHttpCode(mixed $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ExcludedHttpCodeConfig|static { $this->_usedProperties['excludedHttpCodes'] = \true; if (!\is_array($value)) { $this->excludedHttpCodes[] = $value; return $this; } return $this->excludedHttpCodes[] = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ExcludedHttpCodeConfig($value); } /** * @param ParamConfigurator|list $value * * @return $this */ public function acceptedLevels(ParamConfigurator|array $value) : static { $this->_usedProperties['acceptedLevels'] = \true; $this->acceptedLevels = $value; return $this; } /** * @default 'DEBUG' * @param ParamConfigurator|mixed $value * @return $this */ public function minLevel($value) : static { $this->_usedProperties['minLevel'] = \true; $this->minLevel = $value; return $this; } /** * @default 'EMERGENCY' * @param ParamConfigurator|mixed $value * @return $this */ public function maxLevel($value) : static { $this->_usedProperties['maxLevel'] = \true; $this->maxLevel = $value; return $this; } /** * @default 0 * @param ParamConfigurator|mixed $value * @return $this */ public function bufferSize($value) : static { $this->_usedProperties['bufferSize'] = \true; $this->bufferSize = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function flushOnOverflow($value) : static { $this->_usedProperties['flushOnOverflow'] = \true; $this->flushOnOverflow = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function handler($value) : static { $this->_usedProperties['handler'] = \true; $this->handler = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function url($value) : static { $this->_usedProperties['url'] = \true; $this->url = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function exchange($value) : static { $this->_usedProperties['exchange'] = \true; $this->exchange = $value; return $this; } /** * @default 'log' * @param ParamConfigurator|mixed $value * @return $this */ public function exchangeName($value) : static { $this->_usedProperties['exchangeName'] = \true; $this->exchangeName = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function room($value) : static { $this->_usedProperties['room'] = \true; $this->room = $value; return $this; } /** * @default 'text' * @param ParamConfigurator|mixed $value * @return $this */ public function messageFormat($value) : static { $this->_usedProperties['messageFormat'] = \true; $this->messageFormat = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function apiVersion($value) : static { $this->_usedProperties['apiVersion'] = \true; $this->apiVersion = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function channel($value) : static { $this->_usedProperties['channel'] = \true; $this->channel = $value; return $this; } /** * @default 'Monolog' * @param ParamConfigurator|mixed $value * @return $this */ public function botName($value) : static { $this->_usedProperties['botName'] = \true; $this->botName = $value; return $this; } /** * @default true * @param ParamConfigurator|mixed $value * @return $this */ public function useAttachment($value) : static { $this->_usedProperties['useAttachment'] = \true; $this->useAttachment = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function useShortAttachment($value) : static { $this->_usedProperties['useShortAttachment'] = \true; $this->useShortAttachment = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function includeExtra($value) : static { $this->_usedProperties['includeExtra'] = \true; $this->includeExtra = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function iconEmoji($value) : static { $this->_usedProperties['iconEmoji'] = \true; $this->iconEmoji = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function webhookUrl($value) : static { $this->_usedProperties['webhookUrl'] = \true; $this->webhookUrl = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function team($value) : static { $this->_usedProperties['team'] = \true; $this->team = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function notify($value) : static { $this->_usedProperties['notify'] = \true; $this->notify = $value; return $this; } /** * @default 'Monolog' * @param ParamConfigurator|mixed $value * @return $this */ public function nickname($value) : static { $this->_usedProperties['nickname'] = \true; $this->nickname = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function token($value) : static { $this->_usedProperties['token'] = \true; $this->token = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function region($value) : static { $this->_usedProperties['region'] = \true; $this->region = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function source($value) : static { $this->_usedProperties['source'] = \true; $this->source = $value; return $this; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function useSsl($value) : static { $this->_usedProperties['useSsl'] = \true; $this->useSsl = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * * @return $this */ public function user(mixed $value) : static { $this->_usedProperties['user'] = \true; $this->user = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function title($value) : static { $this->_usedProperties['title'] = \true; $this->title = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } /** * @default 514 * @param ParamConfigurator|mixed $value * @return $this */ public function port($value) : static { $this->_usedProperties['port'] = \true; $this->port = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function config(ParamConfigurator|array $value) : static { $this->_usedProperties['config'] = \true; $this->config = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function members(ParamConfigurator|array $value) : static { $this->_usedProperties['members'] = \true; $this->members = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function connectionString($value) : static { $this->_usedProperties['connectionString'] = \true; $this->connectionString = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function timeout($value) : static { $this->_usedProperties['timeout'] = \true; $this->timeout = $value; return $this; } /** * @default 60 * @param ParamConfigurator|mixed $value * @return $this */ public function time($value) : static { $this->_usedProperties['time'] = \true; $this->time = $value; return $this; } /** * @default 400 * @param ParamConfigurator|mixed $value * @return $this */ public function deduplicationLevel($value) : static { $this->_usedProperties['deduplicationLevel'] = \true; $this->deduplicationLevel = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function store($value) : static { $this->_usedProperties['store'] = \true; $this->store = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function connectionTimeout($value) : static { $this->_usedProperties['connectionTimeout'] = \true; $this->connectionTimeout = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function persistent($value) : static { $this->_usedProperties['persistent'] = \true; $this->persistent = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function dsn($value) : static { $this->_usedProperties['dsn'] = \true; $this->dsn = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function hubId($value) : static { $this->_usedProperties['hubId'] = \true; $this->hubId = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function clientId($value) : static { $this->_usedProperties['clientId'] = \true; $this->clientId = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function autoLogStacks($value) : static { $this->_usedProperties['autoLogStacks'] = \true; $this->autoLogStacks = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function release($value) : static { $this->_usedProperties['release'] = \true; $this->release = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function environment($value) : static { $this->_usedProperties['environment'] = \true; $this->environment = $value; return $this; } /** * @default 0 * @param ParamConfigurator|mixed $value * @return $this */ public function messageType($value) : static { $this->_usedProperties['messageType'] = \true; $this->messageType = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function parseMode($value) : static { $this->_usedProperties['parseMode'] = \true; $this->parseMode = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function disableWebpagePreview($value) : static { $this->_usedProperties['disableWebpagePreview'] = \true; $this->disableWebpagePreview = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function disableNotification($value) : static { $this->_usedProperties['disableNotification'] = \true; $this->disableNotification = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function splitLongMessages($value) : static { $this->_usedProperties['splitLongMessages'] = \true; $this->splitLongMessages = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function delayBetweenMessages($value) : static { $this->_usedProperties['delayBetweenMessages'] = \true; $this->delayBetweenMessages = $value; return $this; } /** * @default 1 * @param ParamConfigurator|int $value * @return $this */ public function factor($value) : static { $this->_usedProperties['factor'] = \true; $this->factor = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function tags(ParamConfigurator|string|array $value) : static { $this->_usedProperties['tags'] = \true; $this->tags = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @deprecated ".console_formater_options" is deprecated, use ".console_formatter_options" instead. * * @return $this */ public function consoleFormaterOptions(mixed $value) : static { $this->_usedProperties['consoleFormaterOptions'] = \true; $this->consoleFormaterOptions = $value; return $this; } /** * @default array ( * ) * @param ParamConfigurator|mixed $value * * @return $this */ public function consoleFormatterOptions(mixed $value = array()) : static { $this->_usedProperties['consoleFormatterOptions'] = \true; $this->consoleFormatterOptions = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function formatter($value) : static { $this->_usedProperties['formatter'] = \true; $this->formatter = $value; return $this; } /** * @default false * @param ParamConfigurator|bool $value * @return $this */ public function nested($value) : static { $this->_usedProperties['nested'] = \true; $this->nested = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\PublisherConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\PublisherConfig : static) */ public function publisher(string|array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PublisherConfig|static { if (!\is_array($value)) { $this->_usedProperties['publisher'] = \true; $this->publisher = $value; return $this; } if (!$this->publisher instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PublisherConfig) { $this->_usedProperties['publisher'] = \true; $this->publisher = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PublisherConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "publisher()" has already been initialized. You cannot pass values the second time you call publisher().'); } return $this->publisher; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\MongoConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\MongoConfig : static) */ public function mongo(string|array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\MongoConfig|static { if (!\is_array($value)) { $this->_usedProperties['mongo'] = \true; $this->mongo = $value; return $this; } if (!$this->mongo instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\MongoConfig) { $this->_usedProperties['mongo'] = \true; $this->mongo = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\MongoConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "mongo()" has already been initialized. You cannot pass values the second time you call mongo().'); } return $this->mongo; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig : static) */ public function elasticsearch(string|array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig|static { if (!\is_array($value)) { $this->_usedProperties['elasticsearch'] = \true; $this->elasticsearch = $value; return $this; } if (!$this->elasticsearch instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig) { $this->_usedProperties['elasticsearch'] = \true; $this->elasticsearch = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "elasticsearch()" has already been initialized. You cannot pass values the second time you call elasticsearch().'); } return $this->elasticsearch; } /** * @default 'monolog' * @param ParamConfigurator|mixed $value * @return $this */ public function index($value) : static { $this->_usedProperties['index'] = \true; $this->index = $value; return $this; } /** * @default 'logs' * @param ParamConfigurator|mixed $value * @return $this */ public function documentType($value) : static { $this->_usedProperties['documentType'] = \true; $this->documentType = $value; return $this; } /** * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function ignoreError($value) : static { $this->_usedProperties['ignoreError'] = \true; $this->ignoreError = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\RedisConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\RedisConfig : static) */ public function redis(string|array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\RedisConfig|static { if (!\is_array($value)) { $this->_usedProperties['redis'] = \true; $this->redis = $value; return $this; } if (!$this->redis instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\RedisConfig) { $this->_usedProperties['redis'] = \true; $this->redis = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\RedisConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "redis()" has already been initialized. You cannot pass values the second time you call redis().'); } return $this->redis; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\PredisConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\PredisConfig : static) */ public function predis(string|array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PredisConfig|static { if (!\is_array($value)) { $this->_usedProperties['predis'] = \true; $this->predis = $value; return $this; } if (!$this->predis instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PredisConfig) { $this->_usedProperties['predis'] = \true; $this->predis = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PredisConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "predis()" has already been initialized. You cannot pass values the second time you call predis().'); } return $this->predis; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function fromEmail($value) : static { $this->_usedProperties['fromEmail'] = \true; $this->fromEmail = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function toEmail(ParamConfigurator|string|array $value) : static { $this->_usedProperties['toEmail'] = \true; $this->toEmail = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function subject($value) : static { $this->_usedProperties['subject'] = \true; $this->subject = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function contentType($value) : static { $this->_usedProperties['contentType'] = \true; $this->contentType = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function headers(ParamConfigurator|array $value) : static { $this->_usedProperties['headers'] = \true; $this->headers = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function mailer($value) : static { $this->_usedProperties['mailer'] = \true; $this->mailer = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig : static) */ public function emailPrototype(string|array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig|static { if (!\is_array($value)) { $this->_usedProperties['emailPrototype'] = \true; $this->emailPrototype = $value; return $this; } if (!$this->emailPrototype instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig) { $this->_usedProperties['emailPrototype'] = \true; $this->emailPrototype = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "emailPrototype()" has already been initialized. You cannot pass values the second time you call emailPrototype().'); } return $this->emailPrototype; } /** * @default true * @param ParamConfigurator|bool $value * @return $this */ public function lazy($value) : static { $this->_usedProperties['lazy'] = \true; $this->lazy = $value; return $this; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig : static) */ public function verbosityLevels(array $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig|static { if (!\is_array($value)) { $this->_usedProperties['verbosityLevels'] = \true; $this->verbosityLevels = $value; return $this; } if (!$this->verbosityLevels instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig) { $this->_usedProperties['verbosityLevels'] = \true; $this->verbosityLevels = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "verbosityLevels()" has already been initialized. You cannot pass values the second time you call verbosityLevels().'); } return $this->verbosityLevels; } /** * @template TValue * @param TValue $value * @return \Symfony\Config\Monolog\HandlerConfig\ChannelsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Monolog\HandlerConfig\ChannelsConfig : static) */ public function channels(mixed $value = []) : \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ChannelsConfig|static { if (!\is_array($value)) { $this->_usedProperties['channels'] = \true; $this->channels = $value; return $this; } if (!$this->channels instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ChannelsConfig) { $this->_usedProperties['channels'] = \true; $this->channels = new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ChannelsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "channels()" has already been initialized. You cannot pass values the second time you call channels().'); } return $this->channels; } public function __construct(array $value = []) { if (\array_key_exists('type', $value)) { $this->_usedProperties['type'] = \true; $this->type = $value['type']; unset($value['type']); } if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('priority', $value)) { $this->_usedProperties['priority'] = \true; $this->priority = $value['priority']; unset($value['priority']); } if (\array_key_exists('level', $value)) { $this->_usedProperties['level'] = \true; $this->level = $value['level']; unset($value['level']); } if (\array_key_exists('bubble', $value)) { $this->_usedProperties['bubble'] = \true; $this->bubble = $value['bubble']; unset($value['bubble']); } if (\array_key_exists('app_name', $value)) { $this->_usedProperties['appName'] = \true; $this->appName = $value['app_name']; unset($value['app_name']); } if (\array_key_exists('fill_extra_context', $value)) { $this->_usedProperties['fillExtraContext'] = \true; $this->fillExtraContext = $value['fill_extra_context']; unset($value['fill_extra_context']); } if (\array_key_exists('include_stacktraces', $value)) { $this->_usedProperties['includeStacktraces'] = \true; $this->includeStacktraces = $value['include_stacktraces']; unset($value['include_stacktraces']); } if (\array_key_exists('process_psr_3_messages', $value)) { $this->_usedProperties['processPsr3Messages'] = \true; $this->processPsr3Messages = \is_array($value['process_psr_3_messages']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig($value['process_psr_3_messages']) : $value['process_psr_3_messages']; unset($value['process_psr_3_messages']); } if (\array_key_exists('path', $value)) { $this->_usedProperties['path'] = \true; $this->path = $value['path']; unset($value['path']); } if (\array_key_exists('file_permission', $value)) { $this->_usedProperties['filePermission'] = \true; $this->filePermission = $value['file_permission']; unset($value['file_permission']); } if (\array_key_exists('use_locking', $value)) { $this->_usedProperties['useLocking'] = \true; $this->useLocking = $value['use_locking']; unset($value['use_locking']); } if (\array_key_exists('filename_format', $value)) { $this->_usedProperties['filenameFormat'] = \true; $this->filenameFormat = $value['filename_format']; unset($value['filename_format']); } if (\array_key_exists('date_format', $value)) { $this->_usedProperties['dateFormat'] = \true; $this->dateFormat = $value['date_format']; unset($value['date_format']); } if (\array_key_exists('ident', $value)) { $this->_usedProperties['ident'] = \true; $this->ident = $value['ident']; unset($value['ident']); } if (\array_key_exists('logopts', $value)) { $this->_usedProperties['logopts'] = \true; $this->logopts = $value['logopts']; unset($value['logopts']); } if (\array_key_exists('facility', $value)) { $this->_usedProperties['facility'] = \true; $this->facility = $value['facility']; unset($value['facility']); } if (\array_key_exists('max_files', $value)) { $this->_usedProperties['maxFiles'] = \true; $this->maxFiles = $value['max_files']; unset($value['max_files']); } if (\array_key_exists('action_level', $value)) { $this->_usedProperties['actionLevel'] = \true; $this->actionLevel = $value['action_level']; unset($value['action_level']); } if (\array_key_exists('activation_strategy', $value)) { $this->_usedProperties['activationStrategy'] = \true; $this->activationStrategy = $value['activation_strategy']; unset($value['activation_strategy']); } if (\array_key_exists('stop_buffering', $value)) { $this->_usedProperties['stopBuffering'] = \true; $this->stopBuffering = $value['stop_buffering']; unset($value['stop_buffering']); } if (\array_key_exists('passthru_level', $value)) { $this->_usedProperties['passthruLevel'] = \true; $this->passthruLevel = $value['passthru_level']; unset($value['passthru_level']); } if (\array_key_exists('excluded_404s', $value)) { $this->_usedProperties['excluded404s'] = \true; $this->excluded404s = $value['excluded_404s']; unset($value['excluded_404s']); } if (\array_key_exists('excluded_http_codes', $value)) { $this->_usedProperties['excludedHttpCodes'] = \true; $this->excludedHttpCodes = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ExcludedHttpCodeConfig($v) : $v, $value['excluded_http_codes']); unset($value['excluded_http_codes']); } if (\array_key_exists('accepted_levels', $value)) { $this->_usedProperties['acceptedLevels'] = \true; $this->acceptedLevels = $value['accepted_levels']; unset($value['accepted_levels']); } if (\array_key_exists('min_level', $value)) { $this->_usedProperties['minLevel'] = \true; $this->minLevel = $value['min_level']; unset($value['min_level']); } if (\array_key_exists('max_level', $value)) { $this->_usedProperties['maxLevel'] = \true; $this->maxLevel = $value['max_level']; unset($value['max_level']); } if (\array_key_exists('buffer_size', $value)) { $this->_usedProperties['bufferSize'] = \true; $this->bufferSize = $value['buffer_size']; unset($value['buffer_size']); } if (\array_key_exists('flush_on_overflow', $value)) { $this->_usedProperties['flushOnOverflow'] = \true; $this->flushOnOverflow = $value['flush_on_overflow']; unset($value['flush_on_overflow']); } if (\array_key_exists('handler', $value)) { $this->_usedProperties['handler'] = \true; $this->handler = $value['handler']; unset($value['handler']); } if (\array_key_exists('url', $value)) { $this->_usedProperties['url'] = \true; $this->url = $value['url']; unset($value['url']); } if (\array_key_exists('exchange', $value)) { $this->_usedProperties['exchange'] = \true; $this->exchange = $value['exchange']; unset($value['exchange']); } if (\array_key_exists('exchange_name', $value)) { $this->_usedProperties['exchangeName'] = \true; $this->exchangeName = $value['exchange_name']; unset($value['exchange_name']); } if (\array_key_exists('room', $value)) { $this->_usedProperties['room'] = \true; $this->room = $value['room']; unset($value['room']); } if (\array_key_exists('message_format', $value)) { $this->_usedProperties['messageFormat'] = \true; $this->messageFormat = $value['message_format']; unset($value['message_format']); } if (\array_key_exists('api_version', $value)) { $this->_usedProperties['apiVersion'] = \true; $this->apiVersion = $value['api_version']; unset($value['api_version']); } if (\array_key_exists('channel', $value)) { $this->_usedProperties['channel'] = \true; $this->channel = $value['channel']; unset($value['channel']); } if (\array_key_exists('bot_name', $value)) { $this->_usedProperties['botName'] = \true; $this->botName = $value['bot_name']; unset($value['bot_name']); } if (\array_key_exists('use_attachment', $value)) { $this->_usedProperties['useAttachment'] = \true; $this->useAttachment = $value['use_attachment']; unset($value['use_attachment']); } if (\array_key_exists('use_short_attachment', $value)) { $this->_usedProperties['useShortAttachment'] = \true; $this->useShortAttachment = $value['use_short_attachment']; unset($value['use_short_attachment']); } if (\array_key_exists('include_extra', $value)) { $this->_usedProperties['includeExtra'] = \true; $this->includeExtra = $value['include_extra']; unset($value['include_extra']); } if (\array_key_exists('icon_emoji', $value)) { $this->_usedProperties['iconEmoji'] = \true; $this->iconEmoji = $value['icon_emoji']; unset($value['icon_emoji']); } if (\array_key_exists('webhook_url', $value)) { $this->_usedProperties['webhookUrl'] = \true; $this->webhookUrl = $value['webhook_url']; unset($value['webhook_url']); } if (\array_key_exists('team', $value)) { $this->_usedProperties['team'] = \true; $this->team = $value['team']; unset($value['team']); } if (\array_key_exists('notify', $value)) { $this->_usedProperties['notify'] = \true; $this->notify = $value['notify']; unset($value['notify']); } if (\array_key_exists('nickname', $value)) { $this->_usedProperties['nickname'] = \true; $this->nickname = $value['nickname']; unset($value['nickname']); } if (\array_key_exists('token', $value)) { $this->_usedProperties['token'] = \true; $this->token = $value['token']; unset($value['token']); } if (\array_key_exists('region', $value)) { $this->_usedProperties['region'] = \true; $this->region = $value['region']; unset($value['region']); } if (\array_key_exists('source', $value)) { $this->_usedProperties['source'] = \true; $this->source = $value['source']; unset($value['source']); } if (\array_key_exists('use_ssl', $value)) { $this->_usedProperties['useSsl'] = \true; $this->useSsl = $value['use_ssl']; unset($value['use_ssl']); } if (\array_key_exists('user', $value)) { $this->_usedProperties['user'] = \true; $this->user = $value['user']; unset($value['user']); } if (\array_key_exists('title', $value)) { $this->_usedProperties['title'] = \true; $this->title = $value['title']; unset($value['title']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if (\array_key_exists('port', $value)) { $this->_usedProperties['port'] = \true; $this->port = $value['port']; unset($value['port']); } if (\array_key_exists('config', $value)) { $this->_usedProperties['config'] = \true; $this->config = $value['config']; unset($value['config']); } if (\array_key_exists('members', $value)) { $this->_usedProperties['members'] = \true; $this->members = $value['members']; unset($value['members']); } if (\array_key_exists('connection_string', $value)) { $this->_usedProperties['connectionString'] = \true; $this->connectionString = $value['connection_string']; unset($value['connection_string']); } if (\array_key_exists('timeout', $value)) { $this->_usedProperties['timeout'] = \true; $this->timeout = $value['timeout']; unset($value['timeout']); } if (\array_key_exists('time', $value)) { $this->_usedProperties['time'] = \true; $this->time = $value['time']; unset($value['time']); } if (\array_key_exists('deduplication_level', $value)) { $this->_usedProperties['deduplicationLevel'] = \true; $this->deduplicationLevel = $value['deduplication_level']; unset($value['deduplication_level']); } if (\array_key_exists('store', $value)) { $this->_usedProperties['store'] = \true; $this->store = $value['store']; unset($value['store']); } if (\array_key_exists('connection_timeout', $value)) { $this->_usedProperties['connectionTimeout'] = \true; $this->connectionTimeout = $value['connection_timeout']; unset($value['connection_timeout']); } if (\array_key_exists('persistent', $value)) { $this->_usedProperties['persistent'] = \true; $this->persistent = $value['persistent']; unset($value['persistent']); } if (\array_key_exists('dsn', $value)) { $this->_usedProperties['dsn'] = \true; $this->dsn = $value['dsn']; unset($value['dsn']); } if (\array_key_exists('hub_id', $value)) { $this->_usedProperties['hubId'] = \true; $this->hubId = $value['hub_id']; unset($value['hub_id']); } if (\array_key_exists('client_id', $value)) { $this->_usedProperties['clientId'] = \true; $this->clientId = $value['client_id']; unset($value['client_id']); } if (\array_key_exists('auto_log_stacks', $value)) { $this->_usedProperties['autoLogStacks'] = \true; $this->autoLogStacks = $value['auto_log_stacks']; unset($value['auto_log_stacks']); } if (\array_key_exists('release', $value)) { $this->_usedProperties['release'] = \true; $this->release = $value['release']; unset($value['release']); } if (\array_key_exists('environment', $value)) { $this->_usedProperties['environment'] = \true; $this->environment = $value['environment']; unset($value['environment']); } if (\array_key_exists('message_type', $value)) { $this->_usedProperties['messageType'] = \true; $this->messageType = $value['message_type']; unset($value['message_type']); } if (\array_key_exists('parse_mode', $value)) { $this->_usedProperties['parseMode'] = \true; $this->parseMode = $value['parse_mode']; unset($value['parse_mode']); } if (\array_key_exists('disable_webpage_preview', $value)) { $this->_usedProperties['disableWebpagePreview'] = \true; $this->disableWebpagePreview = $value['disable_webpage_preview']; unset($value['disable_webpage_preview']); } if (\array_key_exists('disable_notification', $value)) { $this->_usedProperties['disableNotification'] = \true; $this->disableNotification = $value['disable_notification']; unset($value['disable_notification']); } if (\array_key_exists('split_long_messages', $value)) { $this->_usedProperties['splitLongMessages'] = \true; $this->splitLongMessages = $value['split_long_messages']; unset($value['split_long_messages']); } if (\array_key_exists('delay_between_messages', $value)) { $this->_usedProperties['delayBetweenMessages'] = \true; $this->delayBetweenMessages = $value['delay_between_messages']; unset($value['delay_between_messages']); } if (\array_key_exists('factor', $value)) { $this->_usedProperties['factor'] = \true; $this->factor = $value['factor']; unset($value['factor']); } if (\array_key_exists('tags', $value)) { $this->_usedProperties['tags'] = \true; $this->tags = $value['tags']; unset($value['tags']); } if (\array_key_exists('console_formater_options', $value)) { $this->_usedProperties['consoleFormaterOptions'] = \true; $this->consoleFormaterOptions = $value['console_formater_options']; unset($value['console_formater_options']); } if (\array_key_exists('console_formatter_options', $value)) { $this->_usedProperties['consoleFormatterOptions'] = \true; $this->consoleFormatterOptions = $value['console_formatter_options']; unset($value['console_formatter_options']); } if (\array_key_exists('formatter', $value)) { $this->_usedProperties['formatter'] = \true; $this->formatter = $value['formatter']; unset($value['formatter']); } if (\array_key_exists('nested', $value)) { $this->_usedProperties['nested'] = \true; $this->nested = $value['nested']; unset($value['nested']); } if (\array_key_exists('publisher', $value)) { $this->_usedProperties['publisher'] = \true; $this->publisher = \is_array($value['publisher']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PublisherConfig($value['publisher']) : $value['publisher']; unset($value['publisher']); } if (\array_key_exists('mongo', $value)) { $this->_usedProperties['mongo'] = \true; $this->mongo = \is_array($value['mongo']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\MongoConfig($value['mongo']) : $value['mongo']; unset($value['mongo']); } if (\array_key_exists('elasticsearch', $value)) { $this->_usedProperties['elasticsearch'] = \true; $this->elasticsearch = \is_array($value['elasticsearch']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig($value['elasticsearch']) : $value['elasticsearch']; unset($value['elasticsearch']); } if (\array_key_exists('index', $value)) { $this->_usedProperties['index'] = \true; $this->index = $value['index']; unset($value['index']); } if (\array_key_exists('document_type', $value)) { $this->_usedProperties['documentType'] = \true; $this->documentType = $value['document_type']; unset($value['document_type']); } if (\array_key_exists('ignore_error', $value)) { $this->_usedProperties['ignoreError'] = \true; $this->ignoreError = $value['ignore_error']; unset($value['ignore_error']); } if (\array_key_exists('redis', $value)) { $this->_usedProperties['redis'] = \true; $this->redis = \is_array($value['redis']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\RedisConfig($value['redis']) : $value['redis']; unset($value['redis']); } if (\array_key_exists('predis', $value)) { $this->_usedProperties['predis'] = \true; $this->predis = \is_array($value['predis']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PredisConfig($value['predis']) : $value['predis']; unset($value['predis']); } if (\array_key_exists('from_email', $value)) { $this->_usedProperties['fromEmail'] = \true; $this->fromEmail = $value['from_email']; unset($value['from_email']); } if (\array_key_exists('to_email', $value)) { $this->_usedProperties['toEmail'] = \true; $this->toEmail = $value['to_email']; unset($value['to_email']); } if (\array_key_exists('subject', $value)) { $this->_usedProperties['subject'] = \true; $this->subject = $value['subject']; unset($value['subject']); } if (\array_key_exists('content_type', $value)) { $this->_usedProperties['contentType'] = \true; $this->contentType = $value['content_type']; unset($value['content_type']); } if (\array_key_exists('headers', $value)) { $this->_usedProperties['headers'] = \true; $this->headers = $value['headers']; unset($value['headers']); } if (\array_key_exists('mailer', $value)) { $this->_usedProperties['mailer'] = \true; $this->mailer = $value['mailer']; unset($value['mailer']); } if (\array_key_exists('email_prototype', $value)) { $this->_usedProperties['emailPrototype'] = \true; $this->emailPrototype = \is_array($value['email_prototype']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig($value['email_prototype']) : $value['email_prototype']; unset($value['email_prototype']); } if (\array_key_exists('lazy', $value)) { $this->_usedProperties['lazy'] = \true; $this->lazy = $value['lazy']; unset($value['lazy']); } if (\array_key_exists('verbosity_levels', $value)) { $this->_usedProperties['verbosityLevels'] = \true; $this->verbosityLevels = \is_array($value['verbosity_levels']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig($value['verbosity_levels']) : $value['verbosity_levels']; unset($value['verbosity_levels']); } if (\array_key_exists('channels', $value)) { $this->_usedProperties['channels'] = \true; $this->channels = \is_array($value['channels']) ? new \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ChannelsConfig($value['channels']) : $value['channels']; unset($value['channels']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['type'])) { $output['type'] = $this->type; } if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['priority'])) { $output['priority'] = $this->priority; } if (isset($this->_usedProperties['level'])) { $output['level'] = $this->level; } if (isset($this->_usedProperties['bubble'])) { $output['bubble'] = $this->bubble; } if (isset($this->_usedProperties['appName'])) { $output['app_name'] = $this->appName; } if (isset($this->_usedProperties['fillExtraContext'])) { $output['fill_extra_context'] = $this->fillExtraContext; } if (isset($this->_usedProperties['includeStacktraces'])) { $output['include_stacktraces'] = $this->includeStacktraces; } if (isset($this->_usedProperties['processPsr3Messages'])) { $output['process_psr_3_messages'] = $this->processPsr3Messages instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ProcessPsr3MessagesConfig ? $this->processPsr3Messages->toArray() : $this->processPsr3Messages; } if (isset($this->_usedProperties['path'])) { $output['path'] = $this->path; } if (isset($this->_usedProperties['filePermission'])) { $output['file_permission'] = $this->filePermission; } if (isset($this->_usedProperties['useLocking'])) { $output['use_locking'] = $this->useLocking; } if (isset($this->_usedProperties['filenameFormat'])) { $output['filename_format'] = $this->filenameFormat; } if (isset($this->_usedProperties['dateFormat'])) { $output['date_format'] = $this->dateFormat; } if (isset($this->_usedProperties['ident'])) { $output['ident'] = $this->ident; } if (isset($this->_usedProperties['logopts'])) { $output['logopts'] = $this->logopts; } if (isset($this->_usedProperties['facility'])) { $output['facility'] = $this->facility; } if (isset($this->_usedProperties['maxFiles'])) { $output['max_files'] = $this->maxFiles; } if (isset($this->_usedProperties['actionLevel'])) { $output['action_level'] = $this->actionLevel; } if (isset($this->_usedProperties['activationStrategy'])) { $output['activation_strategy'] = $this->activationStrategy; } if (isset($this->_usedProperties['stopBuffering'])) { $output['stop_buffering'] = $this->stopBuffering; } if (isset($this->_usedProperties['passthruLevel'])) { $output['passthru_level'] = $this->passthruLevel; } if (isset($this->_usedProperties['excluded404s'])) { $output['excluded_404s'] = $this->excluded404s; } if (isset($this->_usedProperties['excludedHttpCodes'])) { $output['excluded_http_codes'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ExcludedHttpCodeConfig ? $v->toArray() : $v, $this->excludedHttpCodes); } if (isset($this->_usedProperties['acceptedLevels'])) { $output['accepted_levels'] = $this->acceptedLevels; } if (isset($this->_usedProperties['minLevel'])) { $output['min_level'] = $this->minLevel; } if (isset($this->_usedProperties['maxLevel'])) { $output['max_level'] = $this->maxLevel; } if (isset($this->_usedProperties['bufferSize'])) { $output['buffer_size'] = $this->bufferSize; } if (isset($this->_usedProperties['flushOnOverflow'])) { $output['flush_on_overflow'] = $this->flushOnOverflow; } if (isset($this->_usedProperties['handler'])) { $output['handler'] = $this->handler; } if (isset($this->_usedProperties['url'])) { $output['url'] = $this->url; } if (isset($this->_usedProperties['exchange'])) { $output['exchange'] = $this->exchange; } if (isset($this->_usedProperties['exchangeName'])) { $output['exchange_name'] = $this->exchangeName; } if (isset($this->_usedProperties['room'])) { $output['room'] = $this->room; } if (isset($this->_usedProperties['messageFormat'])) { $output['message_format'] = $this->messageFormat; } if (isset($this->_usedProperties['apiVersion'])) { $output['api_version'] = $this->apiVersion; } if (isset($this->_usedProperties['channel'])) { $output['channel'] = $this->channel; } if (isset($this->_usedProperties['botName'])) { $output['bot_name'] = $this->botName; } if (isset($this->_usedProperties['useAttachment'])) { $output['use_attachment'] = $this->useAttachment; } if (isset($this->_usedProperties['useShortAttachment'])) { $output['use_short_attachment'] = $this->useShortAttachment; } if (isset($this->_usedProperties['includeExtra'])) { $output['include_extra'] = $this->includeExtra; } if (isset($this->_usedProperties['iconEmoji'])) { $output['icon_emoji'] = $this->iconEmoji; } if (isset($this->_usedProperties['webhookUrl'])) { $output['webhook_url'] = $this->webhookUrl; } if (isset($this->_usedProperties['team'])) { $output['team'] = $this->team; } if (isset($this->_usedProperties['notify'])) { $output['notify'] = $this->notify; } if (isset($this->_usedProperties['nickname'])) { $output['nickname'] = $this->nickname; } if (isset($this->_usedProperties['token'])) { $output['token'] = $this->token; } if (isset($this->_usedProperties['region'])) { $output['region'] = $this->region; } if (isset($this->_usedProperties['source'])) { $output['source'] = $this->source; } if (isset($this->_usedProperties['useSsl'])) { $output['use_ssl'] = $this->useSsl; } if (isset($this->_usedProperties['user'])) { $output['user'] = $this->user; } if (isset($this->_usedProperties['title'])) { $output['title'] = $this->title; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } if (isset($this->_usedProperties['port'])) { $output['port'] = $this->port; } if (isset($this->_usedProperties['config'])) { $output['config'] = $this->config; } if (isset($this->_usedProperties['members'])) { $output['members'] = $this->members; } if (isset($this->_usedProperties['connectionString'])) { $output['connection_string'] = $this->connectionString; } if (isset($this->_usedProperties['timeout'])) { $output['timeout'] = $this->timeout; } if (isset($this->_usedProperties['time'])) { $output['time'] = $this->time; } if (isset($this->_usedProperties['deduplicationLevel'])) { $output['deduplication_level'] = $this->deduplicationLevel; } if (isset($this->_usedProperties['store'])) { $output['store'] = $this->store; } if (isset($this->_usedProperties['connectionTimeout'])) { $output['connection_timeout'] = $this->connectionTimeout; } if (isset($this->_usedProperties['persistent'])) { $output['persistent'] = $this->persistent; } if (isset($this->_usedProperties['dsn'])) { $output['dsn'] = $this->dsn; } if (isset($this->_usedProperties['hubId'])) { $output['hub_id'] = $this->hubId; } if (isset($this->_usedProperties['clientId'])) { $output['client_id'] = $this->clientId; } if (isset($this->_usedProperties['autoLogStacks'])) { $output['auto_log_stacks'] = $this->autoLogStacks; } if (isset($this->_usedProperties['release'])) { $output['release'] = $this->release; } if (isset($this->_usedProperties['environment'])) { $output['environment'] = $this->environment; } if (isset($this->_usedProperties['messageType'])) { $output['message_type'] = $this->messageType; } if (isset($this->_usedProperties['parseMode'])) { $output['parse_mode'] = $this->parseMode; } if (isset($this->_usedProperties['disableWebpagePreview'])) { $output['disable_webpage_preview'] = $this->disableWebpagePreview; } if (isset($this->_usedProperties['disableNotification'])) { $output['disable_notification'] = $this->disableNotification; } if (isset($this->_usedProperties['splitLongMessages'])) { $output['split_long_messages'] = $this->splitLongMessages; } if (isset($this->_usedProperties['delayBetweenMessages'])) { $output['delay_between_messages'] = $this->delayBetweenMessages; } if (isset($this->_usedProperties['factor'])) { $output['factor'] = $this->factor; } if (isset($this->_usedProperties['tags'])) { $output['tags'] = $this->tags; } if (isset($this->_usedProperties['consoleFormaterOptions'])) { $output['console_formater_options'] = $this->consoleFormaterOptions; } if (isset($this->_usedProperties['consoleFormatterOptions'])) { $output['console_formatter_options'] = $this->consoleFormatterOptions; } if (isset($this->_usedProperties['formatter'])) { $output['formatter'] = $this->formatter; } if (isset($this->_usedProperties['nested'])) { $output['nested'] = $this->nested; } if (isset($this->_usedProperties['publisher'])) { $output['publisher'] = $this->publisher instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PublisherConfig ? $this->publisher->toArray() : $this->publisher; } if (isset($this->_usedProperties['mongo'])) { $output['mongo'] = $this->mongo instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\MongoConfig ? $this->mongo->toArray() : $this->mongo; } if (isset($this->_usedProperties['elasticsearch'])) { $output['elasticsearch'] = $this->elasticsearch instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ElasticsearchConfig ? $this->elasticsearch->toArray() : $this->elasticsearch; } if (isset($this->_usedProperties['index'])) { $output['index'] = $this->index; } if (isset($this->_usedProperties['documentType'])) { $output['document_type'] = $this->documentType; } if (isset($this->_usedProperties['ignoreError'])) { $output['ignore_error'] = $this->ignoreError; } if (isset($this->_usedProperties['redis'])) { $output['redis'] = $this->redis instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\RedisConfig ? $this->redis->toArray() : $this->redis; } if (isset($this->_usedProperties['predis'])) { $output['predis'] = $this->predis instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\PredisConfig ? $this->predis->toArray() : $this->predis; } if (isset($this->_usedProperties['fromEmail'])) { $output['from_email'] = $this->fromEmail; } if (isset($this->_usedProperties['toEmail'])) { $output['to_email'] = $this->toEmail; } if (isset($this->_usedProperties['subject'])) { $output['subject'] = $this->subject; } if (isset($this->_usedProperties['contentType'])) { $output['content_type'] = $this->contentType; } if (isset($this->_usedProperties['headers'])) { $output['headers'] = $this->headers; } if (isset($this->_usedProperties['mailer'])) { $output['mailer'] = $this->mailer; } if (isset($this->_usedProperties['emailPrototype'])) { $output['email_prototype'] = $this->emailPrototype instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\EmailPrototypeConfig ? $this->emailPrototype->toArray() : $this->emailPrototype; } if (isset($this->_usedProperties['lazy'])) { $output['lazy'] = $this->lazy; } if (isset($this->_usedProperties['verbosityLevels'])) { $output['verbosity_levels'] = $this->verbosityLevels instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\VerbosityLevelsConfig ? $this->verbosityLevels->toArray() : $this->verbosityLevels; } if (isset($this->_usedProperties['channels'])) { $output['channels'] = $this->channels instanceof \_ContaoManager\Symfony\Config\Monolog\HandlerConfig\ChannelsConfig ? $this->channels->toArray() : $this->channels; } return $output; } } _usedProperties['enabled'] = \true; $this->enabled = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function dateFormat($value) : static { $this->_usedProperties['dateFormat'] = \true; $this->dateFormat = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function removeUsedContextFields($value) : static { $this->_usedProperties['removeUsedContextFields'] = \true; $this->removeUsedContextFields = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('enabled', $value)) { $this->_usedProperties['enabled'] = \true; $this->enabled = $value['enabled']; unset($value['enabled']); } if (\array_key_exists('date_format', $value)) { $this->_usedProperties['dateFormat'] = \true; $this->dateFormat = $value['date_format']; unset($value['date_format']); } if (\array_key_exists('remove_used_context_fields', $value)) { $this->_usedProperties['removeUsedContextFields'] = \true; $this->removeUsedContextFields = $value['remove_used_context_fields']; unset($value['remove_used_context_fields']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['enabled'])) { $output['enabled'] = $this->enabled; } if (isset($this->_usedProperties['dateFormat'])) { $output['date_format'] = $this->dateFormat; } if (isset($this->_usedProperties['removeUsedContextFields'])) { $output['remove_used_context_fields'] = $this->removeUsedContextFields; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function hostname($value) : static { $this->_usedProperties['hostname'] = \true; $this->hostname = $value; return $this; } /** * @default 12201 * @param ParamConfigurator|mixed $value * @return $this */ public function port($value) : static { $this->_usedProperties['port'] = \true; $this->port = $value; return $this; } /** * @default 1420 * @param ParamConfigurator|mixed $value * @return $this */ public function chunkSize($value) : static { $this->_usedProperties['chunkSize'] = \true; $this->chunkSize = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('hostname', $value)) { $this->_usedProperties['hostname'] = \true; $this->hostname = $value['hostname']; unset($value['hostname']); } if (\array_key_exists('port', $value)) { $this->_usedProperties['port'] = \true; $this->port = $value['port']; unset($value['port']); } if (\array_key_exists('chunk_size', $value)) { $this->_usedProperties['chunkSize'] = \true; $this->chunkSize = $value['chunk_size']; unset($value['chunk_size']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['hostname'])) { $output['hostname'] = $this->hostname; } if (isset($this->_usedProperties['port'])) { $output['port'] = $this->port; } if (isset($this->_usedProperties['chunkSize'])) { $output['chunk_size'] = $this->chunkSize; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function password($value) : static { $this->_usedProperties['password'] = \true; $this->password = $value; return $this; } /** * @default 6379 * @param ParamConfigurator|mixed $value * @return $this */ public function port($value) : static { $this->_usedProperties['port'] = \true; $this->port = $value; return $this; } /** * @default 0 * @param ParamConfigurator|mixed $value * @return $this */ public function database($value) : static { $this->_usedProperties['database'] = \true; $this->database = $value; return $this; } /** * @default 'monolog_redis' * @param ParamConfigurator|mixed $value * @return $this */ public function keyName($value) : static { $this->_usedProperties['keyName'] = \true; $this->keyName = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if (\array_key_exists('password', $value)) { $this->_usedProperties['password'] = \true; $this->password = $value['password']; unset($value['password']); } if (\array_key_exists('port', $value)) { $this->_usedProperties['port'] = \true; $this->port = $value['port']; unset($value['port']); } if (\array_key_exists('database', $value)) { $this->_usedProperties['database'] = \true; $this->database = $value['database']; unset($value['database']); } if (\array_key_exists('key_name', $value)) { $this->_usedProperties['keyName'] = \true; $this->keyName = $value['key_name']; unset($value['key_name']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } if (isset($this->_usedProperties['password'])) { $output['password'] = $this->password; } if (isset($this->_usedProperties['port'])) { $output['port'] = $this->port; } if (isset($this->_usedProperties['database'])) { $output['database'] = $this->database; } if (isset($this->_usedProperties['keyName'])) { $output['key_name'] = $this->keyName; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } /** * @default 9200 * @param ParamConfigurator|mixed $value * @return $this */ public function port($value) : static { $this->_usedProperties['port'] = \true; $this->port = $value; return $this; } /** * @default 'Http' * @param ParamConfigurator|mixed $value * @return $this */ public function transport($value) : static { $this->_usedProperties['transport'] = \true; $this->transport = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function user($value) : static { $this->_usedProperties['user'] = \true; $this->user = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function password($value) : static { $this->_usedProperties['password'] = \true; $this->password = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if (\array_key_exists('port', $value)) { $this->_usedProperties['port'] = \true; $this->port = $value['port']; unset($value['port']); } if (\array_key_exists('transport', $value)) { $this->_usedProperties['transport'] = \true; $this->transport = $value['transport']; unset($value['transport']); } if (\array_key_exists('user', $value)) { $this->_usedProperties['user'] = \true; $this->user = $value['user']; unset($value['user']); } if (\array_key_exists('password', $value)) { $this->_usedProperties['password'] = \true; $this->password = $value['password']; unset($value['password']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } if (isset($this->_usedProperties['port'])) { $output['port'] = $this->port; } if (isset($this->_usedProperties['transport'])) { $output['transport'] = $this->transport; } if (isset($this->_usedProperties['user'])) { $output['user'] = $this->user; } if (isset($this->_usedProperties['password'])) { $output['password'] = $this->password; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function method($value) : static { $this->_usedProperties['method'] = \true; $this->method = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('method', $value)) { $this->_usedProperties['method'] = \true; $this->method = $value['method']; unset($value['method']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['method'])) { $output['method'] = $this->method; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } /** * @default 27017 * @param ParamConfigurator|mixed $value * @return $this */ public function port($value) : static { $this->_usedProperties['port'] = \true; $this->port = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function user($value) : static { $this->_usedProperties['user'] = \true; $this->user = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function pass($value) : static { $this->_usedProperties['pass'] = \true; $this->pass = $value; return $this; } /** * @default 'monolog' * @param ParamConfigurator|mixed $value * @return $this */ public function database($value) : static { $this->_usedProperties['database'] = \true; $this->database = $value; return $this; } /** * @default 'logs' * @param ParamConfigurator|mixed $value * @return $this */ public function collection($value) : static { $this->_usedProperties['collection'] = \true; $this->collection = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if (\array_key_exists('port', $value)) { $this->_usedProperties['port'] = \true; $this->port = $value['port']; unset($value['port']); } if (\array_key_exists('user', $value)) { $this->_usedProperties['user'] = \true; $this->user = $value['user']; unset($value['user']); } if (\array_key_exists('pass', $value)) { $this->_usedProperties['pass'] = \true; $this->pass = $value['pass']; unset($value['pass']); } if (\array_key_exists('database', $value)) { $this->_usedProperties['database'] = \true; $this->database = $value['database']; unset($value['database']); } if (\array_key_exists('collection', $value)) { $this->_usedProperties['collection'] = \true; $this->collection = $value['collection']; unset($value['collection']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } if (isset($this->_usedProperties['port'])) { $output['port'] = $this->port; } if (isset($this->_usedProperties['user'])) { $output['user'] = $this->user; } if (isset($this->_usedProperties['pass'])) { $output['pass'] = $this->pass; } if (isset($this->_usedProperties['database'])) { $output['database'] = $this->database; } if (isset($this->_usedProperties['collection'])) { $output['collection'] = $this->collection; } return $output; } } _usedProperties['vERBOSITYQUIET'] = \true; $this->vERBOSITYQUIET = $value; return $this; } /** * @default 'WARNING' * @param ParamConfigurator|mixed $value * @return $this */ public function vERBOSITYNORMAL($value) : static { $this->_usedProperties['vERBOSITYNORMAL'] = \true; $this->vERBOSITYNORMAL = $value; return $this; } /** * @default 'NOTICE' * @param ParamConfigurator|mixed $value * @return $this */ public function vERBOSITYVERBOSE($value) : static { $this->_usedProperties['vERBOSITYVERBOSE'] = \true; $this->vERBOSITYVERBOSE = $value; return $this; } /** * @default 'INFO' * @param ParamConfigurator|mixed $value * @return $this */ public function vERBOSITYVERYVERBOSE($value) : static { $this->_usedProperties['vERBOSITYVERYVERBOSE'] = \true; $this->vERBOSITYVERYVERBOSE = $value; return $this; } /** * @default 'DEBUG' * @param ParamConfigurator|mixed $value * @return $this */ public function vERBOSITYDEBUG($value) : static { $this->_usedProperties['vERBOSITYDEBUG'] = \true; $this->vERBOSITYDEBUG = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('VERBOSITY_QUIET', $value)) { $this->_usedProperties['vERBOSITYQUIET'] = \true; $this->vERBOSITYQUIET = $value['VERBOSITY_QUIET']; unset($value['VERBOSITY_QUIET']); } if (\array_key_exists('VERBOSITY_NORMAL', $value)) { $this->_usedProperties['vERBOSITYNORMAL'] = \true; $this->vERBOSITYNORMAL = $value['VERBOSITY_NORMAL']; unset($value['VERBOSITY_NORMAL']); } if (\array_key_exists('VERBOSITY_VERBOSE', $value)) { $this->_usedProperties['vERBOSITYVERBOSE'] = \true; $this->vERBOSITYVERBOSE = $value['VERBOSITY_VERBOSE']; unset($value['VERBOSITY_VERBOSE']); } if (\array_key_exists('VERBOSITY_VERY_VERBOSE', $value)) { $this->_usedProperties['vERBOSITYVERYVERBOSE'] = \true; $this->vERBOSITYVERYVERBOSE = $value['VERBOSITY_VERY_VERBOSE']; unset($value['VERBOSITY_VERY_VERBOSE']); } if (\array_key_exists('VERBOSITY_DEBUG', $value)) { $this->_usedProperties['vERBOSITYDEBUG'] = \true; $this->vERBOSITYDEBUG = $value['VERBOSITY_DEBUG']; unset($value['VERBOSITY_DEBUG']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['vERBOSITYQUIET'])) { $output['VERBOSITY_QUIET'] = $this->vERBOSITYQUIET; } if (isset($this->_usedProperties['vERBOSITYNORMAL'])) { $output['VERBOSITY_NORMAL'] = $this->vERBOSITYNORMAL; } if (isset($this->_usedProperties['vERBOSITYVERBOSE'])) { $output['VERBOSITY_VERBOSE'] = $this->vERBOSITYVERBOSE; } if (isset($this->_usedProperties['vERBOSITYVERYVERBOSE'])) { $output['VERBOSITY_VERY_VERBOSE'] = $this->vERBOSITYVERYVERBOSE; } if (isset($this->_usedProperties['vERBOSITYDEBUG'])) { $output['VERBOSITY_DEBUG'] = $this->vERBOSITYDEBUG; } return $output; } } _usedProperties['id'] = \true; $this->id = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function host($value) : static { $this->_usedProperties['host'] = \true; $this->host = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('id', $value)) { $this->_usedProperties['id'] = \true; $this->id = $value['id']; unset($value['id']); } if (\array_key_exists('host', $value)) { $this->_usedProperties['host'] = \true; $this->host = $value['host']; unset($value['host']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['id'])) { $output['id'] = $this->id; } if (isset($this->_usedProperties['host'])) { $output['host'] = $this->host; } return $output; } } _usedProperties['code'] = \true; $this->code = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function urls(ParamConfigurator|array $value) : static { $this->_usedProperties['urls'] = \true; $this->urls = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('code', $value)) { $this->_usedProperties['code'] = \true; $this->code = $value['code']; unset($value['code']); } if (\array_key_exists('urls', $value)) { $this->_usedProperties['urls'] = \true; $this->urls = $value['urls']; unset($value['urls']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['code'])) { $output['code'] = $this->code; } if (isset($this->_usedProperties['urls'])) { $output['urls'] = $this->urls; } return $output; } } _usedProperties['type'] = \true; $this->type = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function elements(ParamConfigurator|array $value) : static { $this->_usedProperties['elements'] = \true; $this->elements = $value; return $this; } public function __construct(array $value = []) { if (\array_key_exists('type', $value)) { $this->_usedProperties['type'] = \true; $this->type = $value['type']; unset($value['type']); } if (\array_key_exists('elements', $value)) { $this->_usedProperties['elements'] = \true; $this->elements = $value['elements']; unset($value['elements']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['type'])) { $output['type'] = $this->type; } if (isset($this->_usedProperties['elements'])) { $output['elements'] = $this->elements; } return $output; } } _usedProperties['secret'] = \true; $this->secret = $value; return $this; } /** * Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. Note: When using the HttpCache, you need to call the method in your front controller instead * @default null * @param ParamConfigurator|bool $value * @return $this */ public function httpMethodOverride($value) : static { $this->_usedProperties['httpMethodOverride'] = \true; $this->httpMethodOverride = $value; return $this; } /** * Set true to enable support for xsendfile in binary file responses. * @default false * @param ParamConfigurator|mixed $value * @return $this */ public function trustXSendfileTypeHeader($value) : static { $this->_usedProperties['trustXSendfileTypeHeader'] = \true; $this->trustXSendfileTypeHeader = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function ide($value) : static { $this->_usedProperties['ide'] = \true; $this->ide = $value; return $this; } /** * @default null * @param ParamConfigurator|bool $value * @return $this */ public function test($value) : static { $this->_usedProperties['test'] = \true; $this->test = $value; return $this; } /** * @default 'en' * @param ParamConfigurator|mixed $value * @return $this */ public function defaultLocale($value) : static { $this->_usedProperties['defaultLocale'] = \true; $this->defaultLocale = $value; return $this; } /** * Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). * @default false * @param ParamConfigurator|bool $value * @return $this */ public function setLocaleFromAcceptLanguage($value) : static { $this->_usedProperties['setLocaleFromAcceptLanguage'] = \true; $this->setLocaleFromAcceptLanguage = $value; return $this; } /** * Whether to set the Content-Language HTTP header on the Response using the Request locale. * @default false * @param ParamConfigurator|bool $value * @return $this */ public function setContentLanguageFromLocale($value) : static { $this->_usedProperties['setContentLanguageFromLocale'] = \true; $this->setContentLanguageFromLocale = $value; return $this; } /** * @param ParamConfigurator|list $value * * @return $this */ public function enabledLocales(ParamConfigurator|array $value) : static { $this->_usedProperties['enabledLocales'] = \true; $this->enabledLocales = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function trustedHosts(ParamConfigurator|string|array $value) : static { $this->_usedProperties['trustedHosts'] = \true; $this->trustedHosts = $value; return $this; } /** * @default null * @param ParamConfigurator|mixed $value * @return $this */ public function trustedProxies($value) : static { $this->_usedProperties['trustedProxies'] = \true; $this->trustedProxies = $value; return $this; } /** * @param ParamConfigurator|list|string $value * * @return $this */ public function trustedHeaders(ParamConfigurator|string|array $value) : static { $this->_usedProperties['trustedHeaders'] = \true; $this->trustedHeaders = $value; return $this; } /** * @default 'error_controller' * @param ParamConfigurator|mixed $value * @return $this */ public function errorController($value) : static { $this->_usedProperties['errorController'] = \true; $this->errorController = $value; return $this; } /** * HttpKernel will handle all kinds of \Throwable * @default null * @param ParamConfigurator|bool $value * @return $this */ public function handleAllThrowables($value) : static { $this->_usedProperties['handleAllThrowables'] = \true; $this->handleAllThrowables = $value; return $this; } /** * @default {"enabled":null} */ public function csrfProtection(array $value = []) : \_ContaoManager\Symfony\Config\Framework\CsrfProtectionConfig { if (null === $this->csrfProtection) { $this->_usedProperties['csrfProtection'] = \true; $this->csrfProtection = new \_ContaoManager\Symfony\Config\Framework\CsrfProtectionConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "csrfProtection()" has already been initialized. You cannot pass values the second time you call csrfProtection().'); } return $this->csrfProtection; } /** * @template TValue * @param TValue $value * form configuration * @default {"enabled":false,"csrf_protection":{"enabled":null,"field_name":"_token"}} * @return \Symfony\Config\Framework\FormConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\FormConfig : static) */ public function form(array $value = []) : \_ContaoManager\Symfony\Config\Framework\FormConfig|static { if (!\is_array($value)) { $this->_usedProperties['form'] = \true; $this->form = $value; return $this; } if (!$this->form instanceof \_ContaoManager\Symfony\Config\Framework\FormConfig) { $this->_usedProperties['form'] = \true; $this->form = new \_ContaoManager\Symfony\Config\Framework\FormConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "form()" has already been initialized. You cannot pass values the second time you call form().'); } return $this->form; } /** * @template TValue * @param TValue $value * HTTP cache configuration * @default {"enabled":false,"debug":"%kernel.debug%","private_headers":[],"skip_response_headers":[]} * @return \Symfony\Config\Framework\HttpCacheConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpCacheConfig : static) */ public function httpCache(array $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpCacheConfig|static { if (!\is_array($value)) { $this->_usedProperties['httpCache'] = \true; $this->httpCache = $value; return $this; } if (!$this->httpCache instanceof \_ContaoManager\Symfony\Config\Framework\HttpCacheConfig) { $this->_usedProperties['httpCache'] = \true; $this->httpCache = new \_ContaoManager\Symfony\Config\Framework\HttpCacheConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "httpCache()" has already been initialized. You cannot pass values the second time you call httpCache().'); } return $this->httpCache; } /** * @template TValue * @param TValue $value * esi configuration * @default {"enabled":false} * @return \Symfony\Config\Framework\EsiConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\EsiConfig : static) */ public function esi(array $value = []) : \_ContaoManager\Symfony\Config\Framework\EsiConfig|static { if (!\is_array($value)) { $this->_usedProperties['esi'] = \true; $this->esi = $value; return $this; } if (!$this->esi instanceof \_ContaoManager\Symfony\Config\Framework\EsiConfig) { $this->_usedProperties['esi'] = \true; $this->esi = new \_ContaoManager\Symfony\Config\Framework\EsiConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "esi()" has already been initialized. You cannot pass values the second time you call esi().'); } return $this->esi; } /** * @template TValue * @param TValue $value * ssi configuration * @default {"enabled":false} * @return \Symfony\Config\Framework\SsiConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\SsiConfig : static) */ public function ssi(array $value = []) : \_ContaoManager\Symfony\Config\Framework\SsiConfig|static { if (!\is_array($value)) { $this->_usedProperties['ssi'] = \true; $this->ssi = $value; return $this; } if (!$this->ssi instanceof \_ContaoManager\Symfony\Config\Framework\SsiConfig) { $this->_usedProperties['ssi'] = \true; $this->ssi = new \_ContaoManager\Symfony\Config\Framework\SsiConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "ssi()" has already been initialized. You cannot pass values the second time you call ssi().'); } return $this->ssi; } /** * @template TValue * @param TValue $value * fragments configuration * @default {"enabled":false,"hinclude_default_template":null,"path":"\/_fragment"} * @return \Symfony\Config\Framework\FragmentsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\FragmentsConfig : static) */ public function fragments(array $value = []) : \_ContaoManager\Symfony\Config\Framework\FragmentsConfig|static { if (!\is_array($value)) { $this->_usedProperties['fragments'] = \true; $this->fragments = $value; return $this; } if (!$this->fragments instanceof \_ContaoManager\Symfony\Config\Framework\FragmentsConfig) { $this->_usedProperties['fragments'] = \true; $this->fragments = new \_ContaoManager\Symfony\Config\Framework\FragmentsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "fragments()" has already been initialized. You cannot pass values the second time you call fragments().'); } return $this->fragments; } /** * @template TValue * @param TValue $value * profiler configuration * @default {"enabled":false,"collect":true,"collect_parameter":null,"only_exceptions":false,"only_main_requests":false,"dsn":"file:%kernel.cache_dir%\/profiler","collect_serializer_data":false} * @return \Symfony\Config\Framework\ProfilerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\ProfilerConfig : static) */ public function profiler(array $value = []) : \_ContaoManager\Symfony\Config\Framework\ProfilerConfig|static { if (!\is_array($value)) { $this->_usedProperties['profiler'] = \true; $this->profiler = $value; return $this; } if (!$this->profiler instanceof \_ContaoManager\Symfony\Config\Framework\ProfilerConfig) { $this->_usedProperties['profiler'] = \true; $this->profiler = new \_ContaoManager\Symfony\Config\Framework\ProfilerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "profiler()" has already been initialized. You cannot pass values the second time you call profiler().'); } return $this->profiler; } /** * @template TValue * @param TValue $value * @default {"enabled":false,"workflows":[]} * @return \Symfony\Config\Framework\WorkflowsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\WorkflowsConfig : static) */ public function workflows(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\WorkflowsConfig|static { if (!\is_array($value)) { $this->_usedProperties['workflows'] = \true; $this->workflows = $value; return $this; } if (!$this->workflows instanceof \_ContaoManager\Symfony\Config\Framework\WorkflowsConfig) { $this->_usedProperties['workflows'] = \true; $this->workflows = new \_ContaoManager\Symfony\Config\Framework\WorkflowsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "workflows()" has already been initialized. You cannot pass values the second time you call workflows().'); } return $this->workflows; } /** * @template TValue * @param TValue $value * router configuration * @default {"enabled":false,"cache_dir":"%kernel.cache_dir%","default_uri":null,"http_port":80,"https_port":443,"strict_requirements":true,"utf8":true} * @return \Symfony\Config\Framework\RouterConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\RouterConfig : static) */ public function router(array $value = []) : \_ContaoManager\Symfony\Config\Framework\RouterConfig|static { if (!\is_array($value)) { $this->_usedProperties['router'] = \true; $this->router = $value; return $this; } if (!$this->router instanceof \_ContaoManager\Symfony\Config\Framework\RouterConfig) { $this->_usedProperties['router'] = \true; $this->router = new \_ContaoManager\Symfony\Config\Framework\RouterConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "router()" has already been initialized. You cannot pass values the second time you call router().'); } return $this->router; } /** * @template TValue * @param TValue $value * session configuration * @default {"enabled":false,"storage_factory_id":"session.storage.factory.native","cookie_httponly":true,"gc_probability":1,"metadata_update_threshold":0} * @return \Symfony\Config\Framework\SessionConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\SessionConfig : static) */ public function session(array $value = []) : \_ContaoManager\Symfony\Config\Framework\SessionConfig|static { if (!\is_array($value)) { $this->_usedProperties['session'] = \true; $this->session = $value; return $this; } if (!$this->session instanceof \_ContaoManager\Symfony\Config\Framework\SessionConfig) { $this->_usedProperties['session'] = \true; $this->session = new \_ContaoManager\Symfony\Config\Framework\SessionConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "session()" has already been initialized. You cannot pass values the second time you call session().'); } return $this->session; } /** * @template TValue * @param TValue $value * request configuration * @default {"enabled":false,"formats":[]} * @return \Symfony\Config\Framework\RequestConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\RequestConfig : static) */ public function request(array $value = []) : \_ContaoManager\Symfony\Config\Framework\RequestConfig|static { if (!\is_array($value)) { $this->_usedProperties['request'] = \true; $this->request = $value; return $this; } if (!$this->request instanceof \_ContaoManager\Symfony\Config\Framework\RequestConfig) { $this->_usedProperties['request'] = \true; $this->request = new \_ContaoManager\Symfony\Config\Framework\RequestConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "request()" has already been initialized. You cannot pass values the second time you call request().'); } return $this->request; } /** * @template TValue * @param TValue $value * assets configuration * @default {"enabled":false,"strict_mode":false,"version_strategy":null,"version":null,"version_format":"%%s?%%s","json_manifest_path":null,"base_path":"","base_urls":[],"packages":[]} * @return \Symfony\Config\Framework\AssetsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\AssetsConfig : static) */ public function assets(array $value = []) : \_ContaoManager\Symfony\Config\Framework\AssetsConfig|static { if (!\is_array($value)) { $this->_usedProperties['assets'] = \true; $this->assets = $value; return $this; } if (!$this->assets instanceof \_ContaoManager\Symfony\Config\Framework\AssetsConfig) { $this->_usedProperties['assets'] = \true; $this->assets = new \_ContaoManager\Symfony\Config\Framework\AssetsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "assets()" has already been initialized. You cannot pass values the second time you call assets().'); } return $this->assets; } /** * @template TValue * @param TValue $value * Asset Mapper configuration * @default {"enabled":false,"paths":[],"excluded_patterns":[],"exclude_dotfiles":true,"server":false,"public_prefix":"\/assets\/","missing_import_mode":"warn","extensions":[],"importmap_path":"%kernel.project_dir%\/importmap.php","importmap_polyfill":"es-module-shims","importmap_script_attributes":[],"vendor_dir":"%kernel.project_dir%\/assets\/vendor"} * @return \Symfony\Config\Framework\AssetMapperConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\AssetMapperConfig : static) */ public function assetMapper(array $value = []) : \_ContaoManager\Symfony\Config\Framework\AssetMapperConfig|static { if (!\is_array($value)) { $this->_usedProperties['assetMapper'] = \true; $this->assetMapper = $value; return $this; } if (!$this->assetMapper instanceof \_ContaoManager\Symfony\Config\Framework\AssetMapperConfig) { $this->_usedProperties['assetMapper'] = \true; $this->assetMapper = new \_ContaoManager\Symfony\Config\Framework\AssetMapperConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "assetMapper()" has already been initialized. You cannot pass values the second time you call assetMapper().'); } return $this->assetMapper; } /** * @template TValue * @param TValue $value * translator configuration * @default {"enabled":false,"fallbacks":[],"logging":false,"formatter":"translator.formatter.default","cache_dir":"%kernel.cache_dir%\/translations","default_path":"%kernel.project_dir%\/translations","paths":[],"pseudo_localization":{"enabled":false,"accents":true,"expansion_factor":1,"brackets":true,"parse_html":false,"localizable_html_attributes":[]},"providers":[]} * @return \Symfony\Config\Framework\TranslatorConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\TranslatorConfig : static) */ public function translator(array $value = []) : \_ContaoManager\Symfony\Config\Framework\TranslatorConfig|static { if (!\is_array($value)) { $this->_usedProperties['translator'] = \true; $this->translator = $value; return $this; } if (!$this->translator instanceof \_ContaoManager\Symfony\Config\Framework\TranslatorConfig) { $this->_usedProperties['translator'] = \true; $this->translator = new \_ContaoManager\Symfony\Config\Framework\TranslatorConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "translator()" has already been initialized. You cannot pass values the second time you call translator().'); } return $this->translator; } /** * @template TValue * @param TValue $value * validation configuration * @default {"enabled":false,"enable_attributes":true,"static_method":["loadValidatorMetadata"],"translation_domain":"validators","mapping":{"paths":[]},"not_compromised_password":{"enabled":true,"endpoint":null},"auto_mapping":[]} * @return \Symfony\Config\Framework\ValidationConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\ValidationConfig : static) */ public function validation(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\ValidationConfig|static { if (!\is_array($value)) { $this->_usedProperties['validation'] = \true; $this->validation = $value; return $this; } if (!$this->validation instanceof \_ContaoManager\Symfony\Config\Framework\ValidationConfig) { $this->_usedProperties['validation'] = \true; $this->validation = new \_ContaoManager\Symfony\Config\Framework\ValidationConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "validation()" has already been initialized. You cannot pass values the second time you call validation().'); } return $this->validation; } /** * @template TValue * @param TValue $value * annotation configuration * @default {"enabled":false,"cache":"php_array","file_cache_dir":"%kernel.cache_dir%\/annotations","debug":false} * @return \Symfony\Config\Framework\AnnotationsConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\AnnotationsConfig : static) */ public function annotations(array $value = []) : \_ContaoManager\Symfony\Config\Framework\AnnotationsConfig|static { if (!\is_array($value)) { $this->_usedProperties['annotations'] = \true; $this->annotations = $value; return $this; } if (!$this->annotations instanceof \_ContaoManager\Symfony\Config\Framework\AnnotationsConfig) { $this->_usedProperties['annotations'] = \true; $this->annotations = new \_ContaoManager\Symfony\Config\Framework\AnnotationsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "annotations()" has already been initialized. You cannot pass values the second time you call annotations().'); } return $this->annotations; } /** * @template TValue * @param TValue $value * serializer configuration * @default {"enabled":true,"enable_attributes":true,"mapping":{"paths":[]},"default_context":[]} * @return \Symfony\Config\Framework\SerializerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\SerializerConfig : static) */ public function serializer(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\SerializerConfig|static { if (!\is_array($value)) { $this->_usedProperties['serializer'] = \true; $this->serializer = $value; return $this; } if (!$this->serializer instanceof \_ContaoManager\Symfony\Config\Framework\SerializerConfig) { $this->_usedProperties['serializer'] = \true; $this->serializer = new \_ContaoManager\Symfony\Config\Framework\SerializerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "serializer()" has already been initialized. You cannot pass values the second time you call serializer().'); } return $this->serializer; } /** * Property access configuration * @default {"enabled":true,"magic_call":false,"magic_get":true,"magic_set":true,"throw_exception_on_invalid_index":false,"throw_exception_on_invalid_property_path":true} */ public function propertyAccess(array $value = []) : \_ContaoManager\Symfony\Config\Framework\PropertyAccessConfig { if (null === $this->propertyAccess) { $this->_usedProperties['propertyAccess'] = \true; $this->propertyAccess = new \_ContaoManager\Symfony\Config\Framework\PropertyAccessConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "propertyAccess()" has already been initialized. You cannot pass values the second time you call propertyAccess().'); } return $this->propertyAccess; } /** * Property info configuration * @default {"enabled":true} */ public function propertyInfo(array $value = []) : \_ContaoManager\Symfony\Config\Framework\PropertyInfoConfig { if (null === $this->propertyInfo) { $this->_usedProperties['propertyInfo'] = \true; $this->propertyInfo = new \_ContaoManager\Symfony\Config\Framework\PropertyInfoConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "propertyInfo()" has already been initialized. You cannot pass values the second time you call propertyInfo().'); } return $this->propertyInfo; } /** * Cache configuration * @default {"prefix_seed":"_%kernel.project_dir%.%kernel.container_class%","app":"cache.adapter.filesystem","system":"cache.adapter.system","directory":"%kernel.cache_dir%\/pools\/app","default_redis_provider":"redis:\/\/localhost","default_memcached_provider":"memcached:\/\/localhost","default_doctrine_dbal_provider":"database_connection","default_pdo_provider":null,"pools":[]} */ public function cache(array $value = []) : \_ContaoManager\Symfony\Config\Framework\CacheConfig { if (null === $this->cache) { $this->_usedProperties['cache'] = \true; $this->cache = new \_ContaoManager\Symfony\Config\Framework\CacheConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "cache()" has already been initialized. You cannot pass values the second time you call cache().'); } return $this->cache; } /** * PHP errors handling configuration * @default {"throw":false} */ public function phpErrors(array $value = []) : \_ContaoManager\Symfony\Config\Framework\PhpErrorsConfig { if (null === $this->phpErrors) { $this->_usedProperties['phpErrors'] = \true; $this->phpErrors = new \_ContaoManager\Symfony\Config\Framework\PhpErrorsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "phpErrors()" has already been initialized. You cannot pass values the second time you call phpErrors().'); } return $this->phpErrors; } /** * @template TValue * @param TValue $value * Exception handling configuration * @return \Symfony\Config\Framework\ExceptionConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\ExceptionConfig : static) */ public function exception(string $class, array $value = []) : \_ContaoManager\Symfony\Config\Framework\ExceptionConfig|static { if (!\is_array($value)) { $this->_usedProperties['exceptions'] = \true; $this->exceptions[$class] = $value; return $this; } if (!isset($this->exceptions[$class]) || !$this->exceptions[$class] instanceof \_ContaoManager\Symfony\Config\Framework\ExceptionConfig) { $this->_usedProperties['exceptions'] = \true; $this->exceptions[$class] = new \_ContaoManager\Symfony\Config\Framework\ExceptionConfig($value); } elseif (1 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "exception()" has already been initialized. You cannot pass values the second time you call exception().'); } return $this->exceptions[$class]; } /** * @template TValue * @param TValue $value * web links configuration * @default {"enabled":false} * @return \Symfony\Config\Framework\WebLinkConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\WebLinkConfig : static) */ public function webLink(array $value = []) : \_ContaoManager\Symfony\Config\Framework\WebLinkConfig|static { if (!\is_array($value)) { $this->_usedProperties['webLink'] = \true; $this->webLink = $value; return $this; } if (!$this->webLink instanceof \_ContaoManager\Symfony\Config\Framework\WebLinkConfig) { $this->_usedProperties['webLink'] = \true; $this->webLink = new \_ContaoManager\Symfony\Config\Framework\WebLinkConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "webLink()" has already been initialized. You cannot pass values the second time you call webLink().'); } return $this->webLink; } /** * @template TValue * @param TValue $value * Lock configuration * @default {"enabled":false,"resources":{"default":["flock"]}} * @return \Symfony\Config\Framework\LockConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\LockConfig : static) */ public function lock(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\LockConfig|static { if (!\is_array($value)) { $this->_usedProperties['lock'] = \true; $this->lock = $value; return $this; } if (!$this->lock instanceof \_ContaoManager\Symfony\Config\Framework\LockConfig) { $this->_usedProperties['lock'] = \true; $this->lock = new \_ContaoManager\Symfony\Config\Framework\LockConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "lock()" has already been initialized. You cannot pass values the second time you call lock().'); } return $this->lock; } /** * @template TValue * @param TValue $value * Semaphore configuration * @default {"enabled":false,"resources":[]} * @return \Symfony\Config\Framework\SemaphoreConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\SemaphoreConfig : static) */ public function semaphore(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\SemaphoreConfig|static { if (!\is_array($value)) { $this->_usedProperties['semaphore'] = \true; $this->semaphore = $value; return $this; } if (!$this->semaphore instanceof \_ContaoManager\Symfony\Config\Framework\SemaphoreConfig) { $this->_usedProperties['semaphore'] = \true; $this->semaphore = new \_ContaoManager\Symfony\Config\Framework\SemaphoreConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "semaphore()" has already been initialized. You cannot pass values the second time you call semaphore().'); } return $this->semaphore; } /** * @template TValue * @param TValue $value * Messenger configuration * @default {"enabled":false,"routing":[],"serializer":{"default_serializer":"messenger.transport.native_php_serializer","symfony_serializer":{"format":"json","context":[]}},"transports":[],"failure_transport":null,"reset_on_message":true,"stop_worker_on_signals":[],"default_bus":null,"buses":{"messenger.bus.default":{"default_middleware":{"enabled":true,"allow_no_handlers":false,"allow_no_senders":true},"middleware":[]}}} * @return \Symfony\Config\Framework\MessengerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\MessengerConfig : static) */ public function messenger(array $value = []) : \_ContaoManager\Symfony\Config\Framework\MessengerConfig|static { if (!\is_array($value)) { $this->_usedProperties['messenger'] = \true; $this->messenger = $value; return $this; } if (!$this->messenger instanceof \_ContaoManager\Symfony\Config\Framework\MessengerConfig) { $this->_usedProperties['messenger'] = \true; $this->messenger = new \_ContaoManager\Symfony\Config\Framework\MessengerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "messenger()" has already been initialized. You cannot pass values the second time you call messenger().'); } return $this->messenger; } /** * @template TValue * @param TValue $value * Scheduler configuration * @default {"enabled":false} * @return \Symfony\Config\Framework\SchedulerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\SchedulerConfig : static) */ public function scheduler(array $value = []) : \_ContaoManager\Symfony\Config\Framework\SchedulerConfig|static { if (!\is_array($value)) { $this->_usedProperties['scheduler'] = \true; $this->scheduler = $value; return $this; } if (!$this->scheduler instanceof \_ContaoManager\Symfony\Config\Framework\SchedulerConfig) { $this->_usedProperties['scheduler'] = \true; $this->scheduler = new \_ContaoManager\Symfony\Config\Framework\SchedulerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "scheduler()" has already been initialized. You cannot pass values the second time you call scheduler().'); } return $this->scheduler; } /** * Enabled by default when debug is enabled. * @default false * @param ParamConfigurator|bool $value * @return $this */ public function disallowSearchEngineIndex($value) : static { $this->_usedProperties['disallowSearchEngineIndex'] = \true; $this->disallowSearchEngineIndex = $value; return $this; } /** * @template TValue * @param TValue $value * HTTP Client configuration * @default {"enabled":false,"scoped_clients":[]} * @return \Symfony\Config\Framework\HttpClientConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HttpClientConfig : static) */ public function httpClient(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\HttpClientConfig|static { if (!\is_array($value)) { $this->_usedProperties['httpClient'] = \true; $this->httpClient = $value; return $this; } if (!$this->httpClient instanceof \_ContaoManager\Symfony\Config\Framework\HttpClientConfig) { $this->_usedProperties['httpClient'] = \true; $this->httpClient = new \_ContaoManager\Symfony\Config\Framework\HttpClientConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "httpClient()" has already been initialized. You cannot pass values the second time you call httpClient().'); } return $this->httpClient; } /** * @template TValue * @param TValue $value * Mailer configuration * @default {"enabled":false,"message_bus":null,"dsn":null,"transports":[],"headers":[]} * @return \Symfony\Config\Framework\MailerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\MailerConfig : static) */ public function mailer(array $value = []) : \_ContaoManager\Symfony\Config\Framework\MailerConfig|static { if (!\is_array($value)) { $this->_usedProperties['mailer'] = \true; $this->mailer = $value; return $this; } if (!$this->mailer instanceof \_ContaoManager\Symfony\Config\Framework\MailerConfig) { $this->_usedProperties['mailer'] = \true; $this->mailer = new \_ContaoManager\Symfony\Config\Framework\MailerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "mailer()" has already been initialized. You cannot pass values the second time you call mailer().'); } return $this->mailer; } /** * @default {"enabled":true,"vault_directory":"%kernel.project_dir%\/config\/secrets\/%kernel.runtime_environment%","local_dotenv_file":"%kernel.project_dir%\/.env.%kernel.environment%.local","decryption_env_var":"base64:default::SYMFONY_DECRYPTION_SECRET"} */ public function secrets(array $value = []) : \_ContaoManager\Symfony\Config\Framework\SecretsConfig { if (null === $this->secrets) { $this->_usedProperties['secrets'] = \true; $this->secrets = new \_ContaoManager\Symfony\Config\Framework\SecretsConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "secrets()" has already been initialized. You cannot pass values the second time you call secrets().'); } return $this->secrets; } /** * @template TValue * @param TValue $value * Notifier configuration * @default {"enabled":false,"message_bus":null,"chatter_transports":[],"texter_transports":[],"notification_on_failed_messages":false,"channel_policy":[],"admin_recipients":[]} * @return \Symfony\Config\Framework\NotifierConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\NotifierConfig : static) */ public function notifier(array $value = []) : \_ContaoManager\Symfony\Config\Framework\NotifierConfig|static { if (!\is_array($value)) { $this->_usedProperties['notifier'] = \true; $this->notifier = $value; return $this; } if (!$this->notifier instanceof \_ContaoManager\Symfony\Config\Framework\NotifierConfig) { $this->_usedProperties['notifier'] = \true; $this->notifier = new \_ContaoManager\Symfony\Config\Framework\NotifierConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "notifier()" has already been initialized. You cannot pass values the second time you call notifier().'); } return $this->notifier; } /** * @template TValue * @param TValue $value * Rate limiter configuration * @default {"enabled":false,"limiters":[]} * @return \Symfony\Config\Framework\RateLimiterConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\RateLimiterConfig : static) */ public function rateLimiter(mixed $value = []) : \_ContaoManager\Symfony\Config\Framework\RateLimiterConfig|static { if (!\is_array($value)) { $this->_usedProperties['rateLimiter'] = \true; $this->rateLimiter = $value; return $this; } if (!$this->rateLimiter instanceof \_ContaoManager\Symfony\Config\Framework\RateLimiterConfig) { $this->_usedProperties['rateLimiter'] = \true; $this->rateLimiter = new \_ContaoManager\Symfony\Config\Framework\RateLimiterConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "rateLimiter()" has already been initialized. You cannot pass values the second time you call rateLimiter().'); } return $this->rateLimiter; } /** * Uid configuration * @default {"enabled":true,"name_based_uuid_version":5} */ public function uid(array $value = []) : \_ContaoManager\Symfony\Config\Framework\UidConfig { if (null === $this->uid) { $this->_usedProperties['uid'] = \true; $this->uid = new \_ContaoManager\Symfony\Config\Framework\UidConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "uid()" has already been initialized. You cannot pass values the second time you call uid().'); } return $this->uid; } /** * @template TValue * @param TValue $value * HtmlSanitizer configuration * @default {"enabled":false,"sanitizers":[]} * @return \Symfony\Config\Framework\HtmlSanitizerConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\HtmlSanitizerConfig : static) */ public function htmlSanitizer(array $value = []) : \_ContaoManager\Symfony\Config\Framework\HtmlSanitizerConfig|static { if (!\is_array($value)) { $this->_usedProperties['htmlSanitizer'] = \true; $this->htmlSanitizer = $value; return $this; } if (!$this->htmlSanitizer instanceof \_ContaoManager\Symfony\Config\Framework\HtmlSanitizerConfig) { $this->_usedProperties['htmlSanitizer'] = \true; $this->htmlSanitizer = new \_ContaoManager\Symfony\Config\Framework\HtmlSanitizerConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "htmlSanitizer()" has already been initialized. You cannot pass values the second time you call htmlSanitizer().'); } return $this->htmlSanitizer; } /** * @template TValue * @param TValue $value * Webhook configuration * @default {"enabled":false,"message_bus":"messenger.default_bus","routing":[]} * @return \Symfony\Config\Framework\WebhookConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\WebhookConfig : static) */ public function webhook(array $value = []) : \_ContaoManager\Symfony\Config\Framework\WebhookConfig|static { if (!\is_array($value)) { $this->_usedProperties['webhook'] = \true; $this->webhook = $value; return $this; } if (!$this->webhook instanceof \_ContaoManager\Symfony\Config\Framework\WebhookConfig) { $this->_usedProperties['webhook'] = \true; $this->webhook = new \_ContaoManager\Symfony\Config\Framework\WebhookConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "webhook()" has already been initialized. You cannot pass values the second time you call webhook().'); } return $this->webhook; } /** * @template TValue * @param TValue $value * RemoteEvent configuration * @default {"enabled":false} * @return \Symfony\Config\Framework\RemoteeventConfig|$this * @psalm-return (TValue is array ? \Symfony\Config\Framework\RemoteeventConfig : static) */ public function remoteevent(array $value = []) : \_ContaoManager\Symfony\Config\Framework\RemoteeventConfig|static { if (!\is_array($value)) { $this->_usedProperties['remoteevent'] = \true; $this->remoteevent = $value; return $this; } if (!$this->remoteevent instanceof \_ContaoManager\Symfony\Config\Framework\RemoteeventConfig) { $this->_usedProperties['remoteevent'] = \true; $this->remoteevent = new \_ContaoManager\Symfony\Config\Framework\RemoteeventConfig($value); } elseif (0 < \func_num_args()) { throw new InvalidConfigurationException('The node created by "remoteevent()" has already been initialized. You cannot pass values the second time you call remoteevent().'); } return $this->remoteevent; } public function getExtensionAlias() : string { return 'framework'; } public function __construct(array $value = []) { if (\array_key_exists('secret', $value)) { $this->_usedProperties['secret'] = \true; $this->secret = $value['secret']; unset($value['secret']); } if (\array_key_exists('http_method_override', $value)) { $this->_usedProperties['httpMethodOverride'] = \true; $this->httpMethodOverride = $value['http_method_override']; unset($value['http_method_override']); } if (\array_key_exists('trust_x_sendfile_type_header', $value)) { $this->_usedProperties['trustXSendfileTypeHeader'] = \true; $this->trustXSendfileTypeHeader = $value['trust_x_sendfile_type_header']; unset($value['trust_x_sendfile_type_header']); } if (\array_key_exists('ide', $value)) { $this->_usedProperties['ide'] = \true; $this->ide = $value['ide']; unset($value['ide']); } if (\array_key_exists('test', $value)) { $this->_usedProperties['test'] = \true; $this->test = $value['test']; unset($value['test']); } if (\array_key_exists('default_locale', $value)) { $this->_usedProperties['defaultLocale'] = \true; $this->defaultLocale = $value['default_locale']; unset($value['default_locale']); } if (\array_key_exists('set_locale_from_accept_language', $value)) { $this->_usedProperties['setLocaleFromAcceptLanguage'] = \true; $this->setLocaleFromAcceptLanguage = $value['set_locale_from_accept_language']; unset($value['set_locale_from_accept_language']); } if (\array_key_exists('set_content_language_from_locale', $value)) { $this->_usedProperties['setContentLanguageFromLocale'] = \true; $this->setContentLanguageFromLocale = $value['set_content_language_from_locale']; unset($value['set_content_language_from_locale']); } if (\array_key_exists('enabled_locales', $value)) { $this->_usedProperties['enabledLocales'] = \true; $this->enabledLocales = $value['enabled_locales']; unset($value['enabled_locales']); } if (\array_key_exists('trusted_hosts', $value)) { $this->_usedProperties['trustedHosts'] = \true; $this->trustedHosts = $value['trusted_hosts']; unset($value['trusted_hosts']); } if (\array_key_exists('trusted_proxies', $value)) { $this->_usedProperties['trustedProxies'] = \true; $this->trustedProxies = $value['trusted_proxies']; unset($value['trusted_proxies']); } if (\array_key_exists('trusted_headers', $value)) { $this->_usedProperties['trustedHeaders'] = \true; $this->trustedHeaders = $value['trusted_headers']; unset($value['trusted_headers']); } if (\array_key_exists('error_controller', $value)) { $this->_usedProperties['errorController'] = \true; $this->errorController = $value['error_controller']; unset($value['error_controller']); } if (\array_key_exists('handle_all_throwables', $value)) { $this->_usedProperties['handleAllThrowables'] = \true; $this->handleAllThrowables = $value['handle_all_throwables']; unset($value['handle_all_throwables']); } if (\array_key_exists('csrf_protection', $value)) { $this->_usedProperties['csrfProtection'] = \true; $this->csrfProtection = new \_ContaoManager\Symfony\Config\Framework\CsrfProtectionConfig($value['csrf_protection']); unset($value['csrf_protection']); } if (\array_key_exists('form', $value)) { $this->_usedProperties['form'] = \true; $this->form = \is_array($value['form']) ? new \_ContaoManager\Symfony\Config\Framework\FormConfig($value['form']) : $value['form']; unset($value['form']); } if (\array_key_exists('http_cache', $value)) { $this->_usedProperties['httpCache'] = \true; $this->httpCache = \is_array($value['http_cache']) ? new \_ContaoManager\Symfony\Config\Framework\HttpCacheConfig($value['http_cache']) : $value['http_cache']; unset($value['http_cache']); } if (\array_key_exists('esi', $value)) { $this->_usedProperties['esi'] = \true; $this->esi = \is_array($value['esi']) ? new \_ContaoManager\Symfony\Config\Framework\EsiConfig($value['esi']) : $value['esi']; unset($value['esi']); } if (\array_key_exists('ssi', $value)) { $this->_usedProperties['ssi'] = \true; $this->ssi = \is_array($value['ssi']) ? new \_ContaoManager\Symfony\Config\Framework\SsiConfig($value['ssi']) : $value['ssi']; unset($value['ssi']); } if (\array_key_exists('fragments', $value)) { $this->_usedProperties['fragments'] = \true; $this->fragments = \is_array($value['fragments']) ? new \_ContaoManager\Symfony\Config\Framework\FragmentsConfig($value['fragments']) : $value['fragments']; unset($value['fragments']); } if (\array_key_exists('profiler', $value)) { $this->_usedProperties['profiler'] = \true; $this->profiler = \is_array($value['profiler']) ? new \_ContaoManager\Symfony\Config\Framework\ProfilerConfig($value['profiler']) : $value['profiler']; unset($value['profiler']); } if (\array_key_exists('workflows', $value)) { $this->_usedProperties['workflows'] = \true; $this->workflows = \is_array($value['workflows']) ? new \_ContaoManager\Symfony\Config\Framework\WorkflowsConfig($value['workflows']) : $value['workflows']; unset($value['workflows']); } if (\array_key_exists('router', $value)) { $this->_usedProperties['router'] = \true; $this->router = \is_array($value['router']) ? new \_ContaoManager\Symfony\Config\Framework\RouterConfig($value['router']) : $value['router']; unset($value['router']); } if (\array_key_exists('session', $value)) { $this->_usedProperties['session'] = \true; $this->session = \is_array($value['session']) ? new \_ContaoManager\Symfony\Config\Framework\SessionConfig($value['session']) : $value['session']; unset($value['session']); } if (\array_key_exists('request', $value)) { $this->_usedProperties['request'] = \true; $this->request = \is_array($value['request']) ? new \_ContaoManager\Symfony\Config\Framework\RequestConfig($value['request']) : $value['request']; unset($value['request']); } if (\array_key_exists('assets', $value)) { $this->_usedProperties['assets'] = \true; $this->assets = \is_array($value['assets']) ? new \_ContaoManager\Symfony\Config\Framework\AssetsConfig($value['assets']) : $value['assets']; unset($value['assets']); } if (\array_key_exists('asset_mapper', $value)) { $this->_usedProperties['assetMapper'] = \true; $this->assetMapper = \is_array($value['asset_mapper']) ? new \_ContaoManager\Symfony\Config\Framework\AssetMapperConfig($value['asset_mapper']) : $value['asset_mapper']; unset($value['asset_mapper']); } if (\array_key_exists('translator', $value)) { $this->_usedProperties['translator'] = \true; $this->translator = \is_array($value['translator']) ? new \_ContaoManager\Symfony\Config\Framework\TranslatorConfig($value['translator']) : $value['translator']; unset($value['translator']); } if (\array_key_exists('validation', $value)) { $this->_usedProperties['validation'] = \true; $this->validation = \is_array($value['validation']) ? new \_ContaoManager\Symfony\Config\Framework\ValidationConfig($value['validation']) : $value['validation']; unset($value['validation']); } if (\array_key_exists('annotations', $value)) { $this->_usedProperties['annotations'] = \true; $this->annotations = \is_array($value['annotations']) ? new \_ContaoManager\Symfony\Config\Framework\AnnotationsConfig($value['annotations']) : $value['annotations']; unset($value['annotations']); } if (\array_key_exists('serializer', $value)) { $this->_usedProperties['serializer'] = \true; $this->serializer = \is_array($value['serializer']) ? new \_ContaoManager\Symfony\Config\Framework\SerializerConfig($value['serializer']) : $value['serializer']; unset($value['serializer']); } if (\array_key_exists('property_access', $value)) { $this->_usedProperties['propertyAccess'] = \true; $this->propertyAccess = new \_ContaoManager\Symfony\Config\Framework\PropertyAccessConfig($value['property_access']); unset($value['property_access']); } if (\array_key_exists('property_info', $value)) { $this->_usedProperties['propertyInfo'] = \true; $this->propertyInfo = new \_ContaoManager\Symfony\Config\Framework\PropertyInfoConfig($value['property_info']); unset($value['property_info']); } if (\array_key_exists('cache', $value)) { $this->_usedProperties['cache'] = \true; $this->cache = new \_ContaoManager\Symfony\Config\Framework\CacheConfig($value['cache']); unset($value['cache']); } if (\array_key_exists('php_errors', $value)) { $this->_usedProperties['phpErrors'] = \true; $this->phpErrors = new \_ContaoManager\Symfony\Config\Framework\PhpErrorsConfig($value['php_errors']); unset($value['php_errors']); } if (\array_key_exists('exceptions', $value)) { $this->_usedProperties['exceptions'] = \true; $this->exceptions = \array_map(fn($v) => \is_array($v) ? new \_ContaoManager\Symfony\Config\Framework\ExceptionConfig($v) : $v, $value['exceptions']); unset($value['exceptions']); } if (\array_key_exists('web_link', $value)) { $this->_usedProperties['webLink'] = \true; $this->webLink = \is_array($value['web_link']) ? new \_ContaoManager\Symfony\Config\Framework\WebLinkConfig($value['web_link']) : $value['web_link']; unset($value['web_link']); } if (\array_key_exists('lock', $value)) { $this->_usedProperties['lock'] = \true; $this->lock = \is_array($value['lock']) ? new \_ContaoManager\Symfony\Config\Framework\LockConfig($value['lock']) : $value['lock']; unset($value['lock']); } if (\array_key_exists('semaphore', $value)) { $this->_usedProperties['semaphore'] = \true; $this->semaphore = \is_array($value['semaphore']) ? new \_ContaoManager\Symfony\Config\Framework\SemaphoreConfig($value['semaphore']) : $value['semaphore']; unset($value['semaphore']); } if (\array_key_exists('messenger', $value)) { $this->_usedProperties['messenger'] = \true; $this->messenger = \is_array($value['messenger']) ? new \_ContaoManager\Symfony\Config\Framework\MessengerConfig($value['messenger']) : $value['messenger']; unset($value['messenger']); } if (\array_key_exists('scheduler', $value)) { $this->_usedProperties['scheduler'] = \true; $this->scheduler = \is_array($value['scheduler']) ? new \_ContaoManager\Symfony\Config\Framework\SchedulerConfig($value['scheduler']) : $value['scheduler']; unset($value['scheduler']); } if (\array_key_exists('disallow_search_engine_index', $value)) { $this->_usedProperties['disallowSearchEngineIndex'] = \true; $this->disallowSearchEngineIndex = $value['disallow_search_engine_index']; unset($value['disallow_search_engine_index']); } if (\array_key_exists('http_client', $value)) { $this->_usedProperties['httpClient'] = \true; $this->httpClient = \is_array($value['http_client']) ? new \_ContaoManager\Symfony\Config\Framework\HttpClientConfig($value['http_client']) : $value['http_client']; unset($value['http_client']); } if (\array_key_exists('mailer', $value)) { $this->_usedProperties['mailer'] = \true; $this->mailer = \is_array($value['mailer']) ? new \_ContaoManager\Symfony\Config\Framework\MailerConfig($value['mailer']) : $value['mailer']; unset($value['mailer']); } if (\array_key_exists('secrets', $value)) { $this->_usedProperties['secrets'] = \true; $this->secrets = new \_ContaoManager\Symfony\Config\Framework\SecretsConfig($value['secrets']); unset($value['secrets']); } if (\array_key_exists('notifier', $value)) { $this->_usedProperties['notifier'] = \true; $this->notifier = \is_array($value['notifier']) ? new \_ContaoManager\Symfony\Config\Framework\NotifierConfig($value['notifier']) : $value['notifier']; unset($value['notifier']); } if (\array_key_exists('rate_limiter', $value)) { $this->_usedProperties['rateLimiter'] = \true; $this->rateLimiter = \is_array($value['rate_limiter']) ? new \_ContaoManager\Symfony\Config\Framework\RateLimiterConfig($value['rate_limiter']) : $value['rate_limiter']; unset($value['rate_limiter']); } if (\array_key_exists('uid', $value)) { $this->_usedProperties['uid'] = \true; $this->uid = new \_ContaoManager\Symfony\Config\Framework\UidConfig($value['uid']); unset($value['uid']); } if (\array_key_exists('html_sanitizer', $value)) { $this->_usedProperties['htmlSanitizer'] = \true; $this->htmlSanitizer = \is_array($value['html_sanitizer']) ? new \_ContaoManager\Symfony\Config\Framework\HtmlSanitizerConfig($value['html_sanitizer']) : $value['html_sanitizer']; unset($value['html_sanitizer']); } if (\array_key_exists('webhook', $value)) { $this->_usedProperties['webhook'] = \true; $this->webhook = \is_array($value['webhook']) ? new \_ContaoManager\Symfony\Config\Framework\WebhookConfig($value['webhook']) : $value['webhook']; unset($value['webhook']); } if (\array_key_exists('remote-event', $value)) { $this->_usedProperties['remoteevent'] = \true; $this->remoteevent = \is_array($value['remote-event']) ? new \_ContaoManager\Symfony\Config\Framework\RemoteeventConfig($value['remote-event']) : $value['remote-event']; unset($value['remote-event']); } if ([] !== $value) { throw new InvalidConfigurationException(\sprintf('The following keys are not supported by "%s": ', __CLASS__) . \implode(', ', \array_keys($value))); } } public function toArray() : array { $output = []; if (isset($this->_usedProperties['secret'])) { $output['secret'] = $this->secret; } if (isset($this->_usedProperties['httpMethodOverride'])) { $output['http_method_override'] = $this->httpMethodOverride; } if (isset($this->_usedProperties['trustXSendfileTypeHeader'])) { $output['trust_x_sendfile_type_header'] = $this->trustXSendfileTypeHeader; } if (isset($this->_usedProperties['ide'])) { $output['ide'] = $this->ide; } if (isset($this->_usedProperties['test'])) { $output['test'] = $this->test; } if (isset($this->_usedProperties['defaultLocale'])) { $output['default_locale'] = $this->defaultLocale; } if (isset($this->_usedProperties['setLocaleFromAcceptLanguage'])) { $output['set_locale_from_accept_language'] = $this->setLocaleFromAcceptLanguage; } if (isset($this->_usedProperties['setContentLanguageFromLocale'])) { $output['set_content_language_from_locale'] = $this->setContentLanguageFromLocale; } if (isset($this->_usedProperties['enabledLocales'])) { $output['enabled_locales'] = $this->enabledLocales; } if (isset($this->_usedProperties['trustedHosts'])) { $output['trusted_hosts'] = $this->trustedHosts; } if (isset($this->_usedProperties['trustedProxies'])) { $output['trusted_proxies'] = $this->trustedProxies; } if (isset($this->_usedProperties['trustedHeaders'])) { $output['trusted_headers'] = $this->trustedHeaders; } if (isset($this->_usedProperties['errorController'])) { $output['error_controller'] = $this->errorController; } if (isset($this->_usedProperties['handleAllThrowables'])) { $output['handle_all_throwables'] = $this->handleAllThrowables; } if (isset($this->_usedProperties['csrfProtection'])) { $output['csrf_protection'] = $this->csrfProtection->toArray(); } if (isset($this->_usedProperties['form'])) { $output['form'] = $this->form instanceof \_ContaoManager\Symfony\Config\Framework\FormConfig ? $this->form->toArray() : $this->form; } if (isset($this->_usedProperties['httpCache'])) { $output['http_cache'] = $this->httpCache instanceof \_ContaoManager\Symfony\Config\Framework\HttpCacheConfig ? $this->httpCache->toArray() : $this->httpCache; } if (isset($this->_usedProperties['esi'])) { $output['esi'] = $this->esi instanceof \_ContaoManager\Symfony\Config\Framework\EsiConfig ? $this->esi->toArray() : $this->esi; } if (isset($this->_usedProperties['ssi'])) { $output['ssi'] = $this->ssi instanceof \_ContaoManager\Symfony\Config\Framework\SsiConfig ? $this->ssi->toArray() : $this->ssi; } if (isset($this->_usedProperties['fragments'])) { $output['fragments'] = $this->fragments instanceof \_ContaoManager\Symfony\Config\Framework\FragmentsConfig ? $this->fragments->toArray() : $this->fragments; } if (isset($this->_usedProperties['profiler'])) { $output['profiler'] = $this->profiler instanceof \_ContaoManager\Symfony\Config\Framework\ProfilerConfig ? $this->profiler->toArray() : $this->profiler; } if (isset($this->_usedProperties['workflows'])) { $output['workflows'] = $this->workflows instanceof \_ContaoManager\Symfony\Config\Framework\WorkflowsConfig ? $this->workflows->toArray() : $this->workflows; } if (isset($this->_usedProperties['router'])) { $output['router'] = $this->router instanceof \_ContaoManager\Symfony\Config\Framework\RouterConfig ? $this->router->toArray() : $this->router; } if (isset($this->_usedProperties['session'])) { $output['session'] = $this->session instanceof \_ContaoManager\Symfony\Config\Framework\SessionConfig ? $this->session->toArray() : $this->session; } if (isset($this->_usedProperties['request'])) { $output['request'] = $this->request instanceof \_ContaoManager\Symfony\Config\Framework\RequestConfig ? $this->request->toArray() : $this->request; } if (isset($this->_usedProperties['assets'])) { $output['assets'] = $this->assets instanceof \_ContaoManager\Symfony\Config\Framework\AssetsConfig ? $this->assets->toArray() : $this->assets; } if (isset($this->_usedProperties['assetMapper'])) { $output['asset_mapper'] = $this->assetMapper instanceof \_ContaoManager\Symfony\Config\Framework\AssetMapperConfig ? $this->assetMapper->toArray() : $this->assetMapper; } if (isset($this->_usedProperties['translator'])) { $output['translator'] = $this->translator instanceof \_ContaoManager\Symfony\Config\Framework\TranslatorConfig ? $this->translator->toArray() : $this->translator; } if (isset($this->_usedProperties['validation'])) { $output['validation'] = $this->validation instanceof \_ContaoManager\Symfony\Config\Framework\ValidationConfig ? $this->validation->toArray() : $this->validation; } if (isset($this->_usedProperties['annotations'])) { $output['annotations'] = $this->annotations instanceof \_ContaoManager\Symfony\Config\Framework\AnnotationsConfig ? $this->annotations->toArray() : $this->annotations; } if (isset($this->_usedProperties['serializer'])) { $output['serializer'] = $this->serializer instanceof \_ContaoManager\Symfony\Config\Framework\SerializerConfig ? $this->serializer->toArray() : $this->serializer; } if (isset($this->_usedProperties['propertyAccess'])) { $output['property_access'] = $this->propertyAccess->toArray(); } if (isset($this->_usedProperties['propertyInfo'])) { $output['property_info'] = $this->propertyInfo->toArray(); } if (isset($this->_usedProperties['cache'])) { $output['cache'] = $this->cache->toArray(); } if (isset($this->_usedProperties['phpErrors'])) { $output['php_errors'] = $this->phpErrors->toArray(); } if (isset($this->_usedProperties['exceptions'])) { $output['exceptions'] = \array_map(fn($v) => $v instanceof \_ContaoManager\Symfony\Config\Framework\ExceptionConfig ? $v->toArray() : $v, $this->exceptions); } if (isset($this->_usedProperties['webLink'])) { $output['web_link'] = $this->webLink instanceof \_ContaoManager\Symfony\Config\Framework\WebLinkConfig ? $this->webLink->toArray() : $this->webLink; } if (isset($this->_usedProperties['lock'])) { $output['lock'] = $this->lock instanceof \_ContaoManager\Symfony\Config\Framework\LockConfig ? $this->lock->toArray() : $this->lock; } if (isset($this->_usedProperties['semaphore'])) { $output['semaphore'] = $this->semaphore instanceof \_ContaoManager\Symfony\Config\Framework\SemaphoreConfig ? $this->semaphore->toArray() : $this->semaphore; } if (isset($this->_usedProperties['messenger'])) { $output['messenger'] = $this->messenger instanceof \_ContaoManager\Symfony\Config\Framework\MessengerConfig ? $this->messenger->toArray() : $this->messenger; } if (isset($this->_usedProperties['scheduler'])) { $output['scheduler'] = $this->scheduler instanceof \_ContaoManager\Symfony\Config\Framework\SchedulerConfig ? $this->scheduler->toArray() : $this->scheduler; } if (isset($this->_usedProperties['disallowSearchEngineIndex'])) { $output['disallow_search_engine_index'] = $this->disallowSearchEngineIndex; } if (isset($this->_usedProperties['httpClient'])) { $output['http_client'] = $this->httpClient instanceof \_ContaoManager\Symfony\Config\Framework\HttpClientConfig ? $this->httpClient->toArray() : $this->httpClient; } if (isset($this->_usedProperties['mailer'])) { $output['mailer'] = $this->mailer instanceof \_ContaoManager\Symfony\Config\Framework\MailerConfig ? $this->mailer->toArray() : $this->mailer; } if (isset($this->_usedProperties['secrets'])) { $output['secrets'] = $this->secrets->toArray(); } if (isset($this->_usedProperties['notifier'])) { $output['notifier'] = $this->notifier instanceof \_ContaoManager\Symfony\Config\Framework\NotifierConfig ? $this->notifier->toArray() : $this->notifier; } if (isset($this->_usedProperties['rateLimiter'])) { $output['rate_limiter'] = $this->rateLimiter instanceof \_ContaoManager\Symfony\Config\Framework\RateLimiterConfig ? $this->rateLimiter->toArray() : $this->rateLimiter; } if (isset($this->_usedProperties['uid'])) { $output['uid'] = $this->uid->toArray(); } if (isset($this->_usedProperties['htmlSanitizer'])) { $output['html_sanitizer'] = $this->htmlSanitizer instanceof \_ContaoManager\Symfony\Config\Framework\HtmlSanitizerConfig ? $this->htmlSanitizer->toArray() : $this->htmlSanitizer; } if (isset($this->_usedProperties['webhook'])) { $output['webhook'] = $this->webhook instanceof \_ContaoManager\Symfony\Config\Framework\WebhookConfig ? $this->webhook->toArray() : $this->webhook; } if (isset($this->_usedProperties['remoteevent'])) { $output['remote-event'] = $this->remoteevent instanceof \_ContaoManager\Symfony\Config\Framework\RemoteeventConfig ? $this->remoteevent->toArray() : $this->remoteevent; } return $output; } } 'Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController', 1 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AbstractConfigController', 2 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController', 3 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController', 4 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController', 5 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController', 6 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController', 7 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController', 8 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController', 9 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController', 10 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController', 11 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController', 12 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController', 13 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController', 14 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController', 15 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController', 16 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController', 17 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController', 18 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController', 19 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController', 20 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController', 21 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController', 22 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController', 23 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController', 24 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController', 25 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController', 26 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController', 27 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController', 28 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController', 29 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController', 30 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController', 31 => '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController', 32 => 'JsonSchema\\Entity\\JsonPointer', 34 => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver', 35 => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController', 36 => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController', 37 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver', 38 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface', 39 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver', 40 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver', 41 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver', 42 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver', 43 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver', 44 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver', 45 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver', 46 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver', 47 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver', 48 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver', 49 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver', 50 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver', 51 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver', 52 => 'Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface', 53 => 'Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver', 54 => 'Symfony\\Component\\HttpKernel\\Controller\\ControllerReference', 55 => 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', 56 => 'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface', 57 => 'Symfony\\Component\\HttpKernel\\Controller\\ErrorController', 58 => 'Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver', 59 => 'Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver', 60 => 'Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface', 61 => 'Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver', 62 => 'Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver', );services: _defaults: autoconfigure: true autowire: true public: false bind: $debug: '%kernel.debug%' kernel: synthetic: true public: true tags: - routing.route_loader _ContaoManager\Contao\ManagerApi\: resource: '../../*' exclude: '../../{Command,Controller,Resources,Tests}' _ContaoManager\Contao\ManagerApi\Command\: resource: '../../Command' public: true _ContaoManager\Contao\ManagerApi\Controller\: resource: '../../Controller' public: true tags: ['controller.service_arguments'] ############################## # Additional configuration # ############################## _ContaoManager\Contao\ManagerApi\ApiKernel: '@kernel' # Service is public for ApiKernel::getTranslator() _ContaoManager\Contao\ManagerApi\I18n\Translator: public: true _ContaoManager\Contao\ManagerApi\Task\TaskManager: arguments: - !tagged app.task contao_manager.webauthn.serializer_factory: class: _ContaoManager\Webauthn\Denormalizer\WebauthnSerializerFactory arguments: - !service { class: _ContaoManager\Webauthn\AttestationStatement\AttestationStatementSupportManager } contao_manager.webauthn.serializer: class: _ContaoManager\Symfony\Component\Serializer\SerializerInterface factory: ['@contao_manager.webauthn.serializer_factory', 'create'] contao_manager.webauthn.ceremony_step_manager_factory: class: _ContaoManager\Webauthn\CeremonyStep\CeremonyStepManagerFactory contao_manager.webauthn.creation_ceremony: class: _ContaoManager\Webauthn\CeremonyStep\CeremonyStepManager factory: ['@contao_manager.webauthn.ceremony_step_manager_factory', 'creationCeremony'] contao_manager.webauthn.request_ceremony: class: _ContaoManager\Webauthn\CeremonyStep\CeremonyStepManager factory: ['@contao_manager.webauthn.ceremony_step_manager_factory', 'requestCeremony'] contao_manager.webauthn.authenticator_attestation_response_validator: class: _ContaoManager\Webauthn\AuthenticatorAttestationResponseValidator arguments: $ceremonyStepManager: '@contao_manager.webauthn.creation_ceremony' calls: - setLogger: ['@logger'] contao_manager.webauthn.authenticator_assertion_response_validator: class: _ContaoManager\Webauthn\AuthenticatorAssertionResponseValidator arguments: $ceremonyStepManager: '@contao_manager.webauthn.request_ceremony' calls: - setLogger: ['@logger'] imports: - { resource: config.yaml } monolog: handlers: main: type: rotating_file path: "%kernel.logs_dir%/api.log" level: INFO channels: ['!event', '!security', '!request'] max_files: 10 services: contao_manager.webauthn.ceremony_step_manager_factory: class: _ContaoManager\Webauthn\CeremonyStep\CeremonyStepManagerFactory calls: - setSecuredRelyingPartyId: [ [ 'localhost' ] ] imports: - { resource: config.yaml } monolog: handlers: main: type: fingers_crossed action_level: error handler: file file: type: error_log imports: - { resource: services.yaml } # The secret is only required to sign fragment URLs which is not used framework: secret: '' default_locale: en router: resource: kernel::loadRoutes type: service security: password_hashers: _ContaoManager\Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' providers: contao_manager_user_provider: id: _ContaoManager\Contao\ManagerApi\Security\UserProvider firewalls: api: stateless: true provider: contao_manager_user_provider custom_authenticators: - _ContaoManager\Contao\ManagerApi\Security\LoginAuthenticator - _ContaoManager\Contao\ManagerApi\Security\WebauthnAuthenticator - _ContaoManager\Contao\ManagerApi\Security\PasswordlessAuthenticator - _ContaoManager\Contao\ManagerApi\Security\JwtAuthenticator - _ContaoManager\Contao\ManagerApi\Security\TokenAuthenticator role_hierarchy: ROLE_ADMIN: ROLE_INSTALL ROLE_INSTALL: ROLE_UPDATE ROLE_UPDATE: ROLE_READ ROLE_READ: ROLE_USER access_control: - { path: ^/api/session(/options)?$, roles: PUBLIC_ACCESS } - { path: ^/api, roles: ROLE_USER } cs: integrity: allow_url_fopen: title: 'Služba PHP "allow_url_fopen" není na tomto serveru spuÅ¡tÄ›na.' process: title: 'Funkce PHP "proc_*" není k dispozici na tomto serveru.' detail: 'Funkce "proc_open" a "proc_close" jsou nezbytné pro spouÅ¡tÄ›ní příkazů na pozadí. Dotázejte se VaÅ¡eho poskytovatele, proÄ není daná k dispozici. Správce Contaa nebude moct bez toho fungovat správnÄ›.' intl: title: 'Rozšíření PHP Intl není na tomto serveru spuÅ¡tÄ›no.' detail: 'Contao 4 vyžaduje rozšíření PHP Intl pro mezinárodní záležitosti.' openssl: title: 'Rozšíření PHP OpenSSL není na tomto serveru spuÅ¡tÄ›no.' detail: 'Správce Contaa vyžaduje rozšíření OpenSSL, aby mohl stahovat soubory pÅ™es zabezpeÄené pÅ™ipojení (https).' dom: title: 'Rozšíření PHP DOM není na tomto serveru spuÅ¡tÄ›no.' detail: 'Contao 4 vyžaduje rozšíření PHP DOM pro zpracování dokumentů XML.' xmlreader: title: 'Rozšíření PHP XMLReader není na tomto serveru spuÅ¡tÄ›no.' detail: 'Contao 4 vyžaduje rozšíření PHP XMLReader pro zpracování dokumentů XML.' graphics_lib: title: 'Není dostupná žádná knihovna PHP na zpracování obrázků.' detail: 'Contao 4 vyžaduje pro zpracování obrázku jedno z následujících rozšíření: GD, Imagick nebo Gmagick.' symlink: title: 'Metoda pro vytvoÅ™ení symlinků buÄ není dostupná nebo nefunguje správnÄ›.' session: title: 'Sezení PHP nelze zahájit.' memory_limit: title: 'NedostateÄné množství pamÄ›ti pro PHP.' detail: 'VaÅ¡e nastavení PHP dovoluje (na příkazovém řádku) jen omezené akce kvůli omezení pamÄ›ti {limit}. Ta není dostateÄná pro chod Composeru a neÅ¡lo automaticky zvýšit paměť. Kontaktujte prosím VaÅ¡e poskytovatele služeb.' systempdir: title: 'Nelze zapisovat do doÄasné složky systému.' detail: 'Nejspíš jde o problém s Vaším nastavením služeb. UjistÄ›te se, že open_basedir dovoluje přístup k doÄasné složce nebo zda je sys_temp_dir správnÄ› nastavená.' zip: title: 'Rozšíření zip a příkazy unzip/7z chybÄ›jí.' boot: composer: invalid: 'Schéma ověření composer.json: {exception}' config: php_cli: not_found: 'Tato cesta neobsahuje platné binární PHP.' incompatible: 'Tato verze je verze PHP {cli}, ale Váš server je ve verzi {web}.' error: 'Chyba pÅ™i validaci binární PHP.' cloud: platform: 'Platforma nemusí být nastavená v composer.json.' cache: 'Položky meziúložiÅ¡tÄ› nemusí být nastavené v composer.json.' task: setup_packages: title: 'Instalování aplikací Contaa' install_packages: title: 'Nainstalovat vÄ›ci závislé na Composerovi' update_packages: title: 'Aktualizují se balíÄky' dump_autoload: title: 'VyÄistit Autoloadera Composeru' clear_cache: title: 'Vyprazdňování meziúložiÅ¡tÄ› Composeru' rebuild_cache: title: 'PÅ™etváří se meziúložiÅ¡tÄ› Contaa.' self_update: title: 'Spustit samoaktualizaci Správce Contaa' backup_create: title: 'Vytváření uložení databáze' backup_restore: title: 'Obnovení uložené databáze' taskoperation: self-update: detail: 'Aktualizování {old} na {new}' success: 'Aktualizovat na {new}' install-uploads: summary: 'Instalují se nahrané soubory' console: 'Nainstalovaný artefakt pro {package} (verze {version}) [do balíÄků/{name}]' remove-uploads: summary: 'Smazat nahrané soubory' remove-artifacts: summary: '' composer-install: retry: 'Nový pokus {current}/{max}' nothing: 'Neexistuje nic k nainstalování Äi aktualizování' result: 'nainstalováno: {installs}, zaktualizováno: {updates}, smazáno: {removals}' dump-autoload: result: 'Vygenerované optiomalizované autoload soubory obsahují poÄet tříd: {count}' cloud: queued: 'Proces zaÄne za {seconds} s. (souÄasný {jobs} proces - poÄet uživatelů: {workers})' processing: 'Doba aktivity: {seconds} s' error: 'VyÅ™eÅ¡ení závislostí nevyÅ¡lo' finished: 'DokonÄení: {seconds} s. Využití pamÄ›ti: {memory} (vrchol: {peak}), doba: {time}.' upload: error: file: 'Tento soubor není platný nebo neobsahuje žádnou composer.json.' json: 'Soubor composer.json neobsahuje žádná platná data JSON,' schema: 'Ověření schématu composer.json selhalo,' partial: 'Nahrání souborů nebylo dokonÄeno.' error: writable: root: 'Správce Contaa nemůže zapisovat do koÅ™enového adresáře na "{path}".' directory: 'Správce Contaa nemůže vytvoÅ™it adresář "{path}".' config-file: 'Správce Contaa nemůže zapisovat do konfiguraÄního souboru v "{path}".' detail: 'Vypadá to, že Váš webový server není správnÄ› nastavený. Pokud chcete nainstalovat Contao, nastavte prosím koÅ™enový dokument na VaÅ¡em webovém serveru. Jinak se jistÄ›te, že jsou přístupová práva nastavená správnÄ›. Pokud si nejste jistí, obraÅ¥te se na správce webových služeb.' br: integrity: allow_url_fopen: title: 'An arventennoù PHP "allow_url_fopen" n''eo ket gweredekaet war ar servijer.' process: title: '' detail: '' intl: title: 'N''eo ket hegerz an astenn PHP Intl.' detail: 'Contao 4 a c''houlenn an astenn PHP Intl evit ma vo etrebroadel.' openssl: title: 'N''eo ket hegerz an astenn PHP OpenSSL.' detail: 'Manager contao a c''houl an amzer openssl evit pellgargañ restroù dre ur gevreadenn dirinegañ (https).' dom: title: '' detail: '' xmlreader: title: '' detail: '' graphics_lib: title: '' detail: '' symlink: title: '' session: title: 'N''hall ket bezañ kroget an dalc''h PHP.' memory_limit: title: '' detail: '' systempdir: title: '' detail: '' boot: composer: invalid: '' config: php_cli: not_found: '' incompatible: '' cloud: platform: '' cache: '' task: setup_packages: title: '' install_packages: title: '' update_packages: title: 'Oc''h hizivaat ar pakadoù' dump_autoload: title: '' clear_cache: title: '' rebuild_cache: title: 'Oc''h adsevel krubuilh Contao' self_update: title: '' taskoperation: self-update: detail: '' success: '' install-uploads: summary: '' console: '' remove-uploads: summary: '' composer-install: retry: '' nothing: '' result: '' dump-autoload: result: '' cloud: queued: '' processing: '' error: '' finished: '' upload: error: file: '' json: '' schema: '' partial: '' error: writable: root: '' directory: '' config-file: '' detail: '' es: integrity: allow_url_fopen: title: 'La configuración de PHP "allow_url_fopen" no está habilitada en el servidor.' process: title: 'Las funciones PHP "proc_ *" no están disponibles en el servidor. ' detail: 'Las funciones "proc_open", "proc_close", "proc_get_status" y "proc_terminate" son necesarias para ejecutar tareas de línea de comandos en segundo plano. Consulte con su proveedor de alojamiento por qué este método no está disponible; el Contao Manager no se ejecutará correctamente sin él. ' intl: title: 'La extensión PHP Intl no está disponible.' detail: 'Contao 4 requiere la extensión PHP Intl para fines de internacionalización.' openssl: title: 'La extensión PHP OpenSSL no está disponible.' detail: 'El Contao Manager requiere la extensión OpenSSL para descargar archivos a través de una conexión cifrada (https).' dom: title: 'La extensión PHP DOM no está disponible. ' detail: 'Contao 4 requiere la extensión DOM de PHP para analizar documentos XML.' xmlreader: title: 'La extensión PHP XMLReader no está disponible.' detail: 'Contao 4 requiere la extensión XMLReader de PHP para analizar documentos XML.' graphics_lib: title: 'No hay biblioteca de procesamiento de imágenes PHP disponible.' detail: 'Contao 4 requiere la extensión GD, Imagick o Gmagick para procesar imágenes.' symlink: title: 'El método de enlace simbólico PHP no está disponible o no funciona correctamente.' session: title: 'La sesión de PHP no se pudo iniciar.' memory_limit: title: 'Límite insuficiente de memoria de PHP.' detail: 'Su configuración PHP solo permite {limit} memoria (en la línea de comando). Esto no es suficiente para ejecutar Composer y no fue posible aumentar este límite automáticamente. Por favor, póngase en contacto con su proveedor de hosting para obtener asistencia.' systempdir: title: 'No se puede escribir en el directorio temporal del sistema.' detail: 'Probablemente esto sea un problema con su configuración de alojamiento. Asegúrese de que open_basedir permita el acceso al directorio temporal o que el sys_temp_dir esté configurado correctamente.' zip: title: 'Faltan la extensión zip y los comandos unzip/7z.' boot: composer: invalid: 'validación del esquema composer.json: {exception}' config: php_cli: not_found: 'Esta ruta no contiene un binario PHP válido.' incompatible: 'Este binario es una versión de PHP {cli}, pero su servidor web es la versión {web}.' error: 'Error al validar el binario PHP.' cloud: platform: 'La plataforma no debe configurarse en composer.json.' cache: 'Las propiedades de caché no deben configurarse en composer.json.' task: setup_packages: title: 'Instalación de la aplicación Contao' install_packages: title: 'Instalando dependencias del Composer' update_packages: title: 'Actualizando paquetes' dump_autoload: title: 'Autocargador de clases de dumping Composer' clear_cache: title: 'Limpiar el caché del Composer' rebuild_cache: title: 'Reconstruyendo de caché de Contao' self_update: title: 'Autoactualización de Contao Manager ' backup_create: title: 'Creando una copia de seguridad de la base de datos' backup_restore: title: 'Restaurar la copia de seguridad de la base de datos' taskoperation: self-update: detail: 'Actualización de {old} a {new}' success: 'Actualizado a {new}' install-uploads: summary: 'Instalación de cargas' console: 'Artefacto instalado para {package} (versión {version}) [a paquetes / {name}]' remove-uploads: summary: 'Eliminando cargas' remove-artifacts: summary: '' composer-install: retry: 'volviendo a intentar {current}/{max}' nothing: 'Nada que instalar o actualizar' result: '{installs} instalado, {updates} actualizado, {removals} eliminado' dump-autoload: result: 'Archivos de carga automática optimizados generados que contienen {count} clases' cloud: queued: 'En cola, comenzando en aprox. {seconds} segundos (actualmente {jobs} trabajos en {workers} trabajadores)' processing: 'Activo durante {seconds} segundos.' error: 'No se pudieron resolver las dependencias' finished: 'Completado en {seconds} segundos. Uso de memoria: {memory} (pico: {peak}), tiempo: {time}.' upload: error: file: 'El archivo no es válido o no contiene un composer.json.' json: 'El composer.json no contiene datos JSON válidos.' schema: 'La validación del esquema composer.json ha fallado.' partial: 'La carga del archivo no se completó.' error: writable: root: 'El Contao Manager no pudo escribir en el directorio raíz en "{path}". ' directory: 'Contao Manager no pudo crear el directorio "{path}".' config-file: 'Contao Manager no pudo escribir un archivo de configuración en "{file}".' detail: 'Parece que su servidor no está configurado correctamente. Si está a punto de instalar Contao, configure el DocumentRoot de su servidor web. De lo contrario, asegúrese de que los permisos de acceso a archivos sean correctos. Si no está seguro de cómo solucionar este problema, comuníquese con su proveedor de alojamiento para obtener asistencia.' pt: integrity: allow_url_fopen: title: 'A função PHP "allow_url_fopen" não está ativada no servidor. ' process: title: 'As funções "proc_*" do PHP não estão disponíveis no servidor.' detail: 'As funções "proc_open", "proc_close", "proc_get_status" e "proc_terminate" são necessárias para executar tarefas de linha de comando em segundo plano. Verifique com o seu fornecedor de alojamento porque é que este método não está disponível; o Gestor de Contacto não funcionará correctamente sem ele.' intl: title: 'A extensão PHP Intl não está disponível.' detail: 'O Contao 4 necessita da extensão PHP Intl para propósitos de internacionalização.' openssl: title: 'A extensão PHP OpenSSL não se encontra disponível.' detail: 'O Contao Manager necessita da extensão OpenSSL para receber ficheiros através de uma ligação encriptada (https).' dom: title: 'A extensão PHP DOM não se encontra disponivel.' detail: 'O contao 4 necessita da extensão PHP DOM para reconhecer documentos XML.' xmlreader: title: 'A extensão PHP XMLReader não está disponível.' detail: 'O contao 4 necessita da extensão PHP XMLReader para reconhecer documentos XML.' graphics_lib: title: 'Nenhuma biblioteca de processamento de imagens PHP está disponível. ' detail: 'O Contacto 4 requer ou a extensão GD, Imagick ou Gmagick para processar imagens.' symlink: title: 'O método PHP symlink não está disponível ou não funciona correctamente.' session: title: 'A sessão PHP falhou ao iniciar.' memory_limit: title: 'Memória limite PHP insuficiente.' detail: 'A configuração PHP atual apenas permite {limit} de memória (na linha de comandos). Estes recursos não são suficientes para executar o Composer e não é possível aumentar este limite automaticamente. Por favor contacte o seu fornecedor de conteúdo para assistência.' systempdir: title: 'Impossível escrever no directório de memória de sistema temporário.' detail: 'Isto é muito provavelmente um problema com a configuração do seu alojamento. Certifique-se de que o open_basedir permite o acesso ao directório temporário ou de que o sys_temp_dir está correctamente configurado.' zip: title: '' boot: composer: invalid: 'composer.json schema validation: {exception}' config: php_cli: not_found: 'Este caminho não contém um binário PHP válido. ' incompatible: 'Este binário é uma versão PHP {cli} mas o seu servidor web é versão {web}.' error: '' cloud: platform: 'A plataforma não pode estar configurada em composer.json .' cache: 'Propriedades de cache não podem estar configuradas em composer.json .' task: setup_packages: title: 'A instalar aplicação Contao' install_packages: title: 'A instalar dependências composer' update_packages: title: 'A atualizar pacotes' dump_autoload: title: 'Compressor de descarga classe Autoloader' clear_cache: title: 'A limpar Cache Composer' rebuild_cache: title: 'A reconstruir Cache Composer' self_update: title: 'Contao Manager Auto-atualização' backup_create: title: '' backup_restore: title: '' taskoperation: self-update: detail: 'A atualizar de {old} para {new}' success: 'Actualizado para {new}' install-uploads: summary: 'Instalação de uploads' console: 'Artifact instalado de {package} (versão {version}) [para packages/{name}]' remove-uploads: summary: 'Remoção de uploads' remove-artifacts: summary: '' composer-install: retry: 'tentando de novo {current}/{max}' nothing: 'Nada para instalar ou actualizar' result: '{installs} instalado, {updates} actualizado, {removals} retirado' dump-autoload: result: 'Geração de ficheiros de carga automática optimizados contendo classes {count}.' cloud: queued: 'Em fila de espera, começando em aproximadamente. {seconds} secundos (actualmente {jobs} empregos em {workers} trabalhadores)' processing: 'Activo durante {seconds} segundos.' error: 'Falha na resolução de dependências' finished: 'Concluído em {seconds} segundos. Utilização de memória: {memory} (pico: {peak}), hora: {time}.' upload: error: file: 'O ficheiro é inválido ou não contém um composer.json .' json: 'O composer.json não contém dados JSON válidos .' schema: 'O composer.json não passou a validação de schemas.' partial: 'O upload de ficheiros não completou com sucesso.' error: writable: root: 'O Gestor de Contacto não pôde escrever para o directório raiz em "{path}".' directory: 'O Contao Manager não pôde criar o directório "{path}".' config-file: 'O Contao Manager não pôde escrever um ficheiro de configuração para "{file}".' detail: 'Parece que o seu servidor não está configurado correctamente. Se está prestes a instalar o Contao, por favor configure o DocumentRoot do seu servidor web. Caso contrário, certifique-se de que as permissões de acesso ao ficheiro estão correctas. Se não tiver a certeza de como corrigir isto, contacte o seu fornecedor de alojamento para obter apoio.' de: integrity: allow_url_fopen: title: 'Die PHP-Einstellung "allow_url_fopen" ist auf dem Server deaktiviert.' process: title: 'Die PHP "proc_*" Funktionen ist auf dem Server nicht verfügbar.' detail: 'Die Funktionen "proc_open", "proc_close", "proc_get_status" und "proc_terminate" sind notwendig, um Kommandozeilentasks im Hintergrund auszuführen. Bitte frage bei deinem Hosting-Anbieter nach, warum die Funktionen nicht verfügbar sind; der Contao Manager läuft nicht ohne sie.' intl: title: 'Die PHP Intl-Erweiterung ist nicht verfügbar.' detail: 'Contao 4 benötigt die PHP Intl-Erweiterung für die Internationalisierung der Anwendung.' openssl: title: 'Die PHP OpenSSL-Erweiterung ist nicht verfügbar.' detail: 'Der Contao Manager benötigt die OpenSSL-Erweiterung, um Dateien über eine verschlüsselte Verbindung (https) herunterzuladen.' dom: title: 'Die PHP DOM-Erweiterung ist nicht verfügbar.' detail: 'Contao 4 benötigt die PHP DOM-Erweiterung, um XML-Dokumente zu parsen.' xmlreader: title: 'Die PHP XMLReader-Erweiterung ist nicht verfügbar.' detail: 'Contao 4 benötigt die PHP XMLReader-Erweiterung, um XML-Dokumente zu parsen.' graphics_lib: title: 'Keine PHP Bild-Bibliothek verfügbar.' detail: 'Contao 4 benötigt entweder die GD-, Imagick- oder Gmagick-Erweiterung, um Bilder zu verarbeiten.' symlink: title: 'Die PHP Symlink-Methode ist nicht verfügbar oder funktioniert nicht korrekt.' session: title: 'Die PHP-Session konnte nicht gestartet werden.' memory_limit: title: 'Ungenügendes PHP Memory-Limit.' detail: 'Deine PHP-Konfiguration erlaubt nur {limit} RAM (auf der Kommandozeile). Das ist nicht genug, um Composer auszuführen, und das Limit konnte auch nicht automatisch erhöht werden. Bitte kontaktiere deinen Hosting-Anbieter.' systempdir: title: 'Konnte nicht in den temporären Systemordner schreiben.' detail: 'Dies ist höchstwahrscheinlich ein Problem mit deiner Serverkonfiguration. Stelle sicher, dass entweder open_basedir den Zugriff auf den temporären Ordner erlaubt oder dass sys_temp_dir korrekt gesetzt ist.' zip: title: 'Die PHP ZIP-Erweiterung und die unzip/7z-Commands sind beide nicht verfügbar.' boot: composer: invalid: 'composer.json Schema-Validierung: {exception}' config: php_cli: not_found: 'Der Pfad enthält kein gültiges PHP-Binary.' incompatible: 'Dieses Binary beinhaltet PHP {cli}, der Webprozess verwendet jedoch PHP {web}.' error: 'Fehler beim Validieren des PHP-Binary.' cloud: platform: 'Die Plattform darf in der composer.json nicht konfiguriert sein.' cache: 'Cache-Einstellungen dürfen in der composer.json nicht konfiguriert sein.' task: setup_packages: title: 'Contao wird installiert' install_packages: title: 'Installieren von Composer-Abhängigkeiten' update_packages: title: 'Pakete werden aktualisiert' dump_autoload: title: 'Schreibe Composer-Autoloader' clear_cache: title: 'Leeren des Composer-Caches' rebuild_cache: title: 'Neuerstellung des Contao-Caches' self_update: title: 'Aktualisiere Contao Manager' backup_create: title: 'Erstelle Datenbank-Backup' backup_restore: title: 'Datenbank-Backup wird wiederhergestellt' taskoperation: self-update: detail: 'Aktualisiere von {old} nach {new}' success: 'Aktualisiert auf {new}' install-uploads: summary: 'Installiere hochgeladene Pakete' console: 'Artefakt für {package} (Version {version}) [nach packages/{name}] installiert' remove-uploads: summary: 'Entferne hochgeladene Dateien' remove-artifacts: summary: 'Entferne hochgeladene Pakete' composer-install: retry: 'Versuch {current}/{max}' nothing: 'Keine Aktualisierungen' result: '{installs} installiert, {updates} aktualisiert, {removals} entfernt' dump-autoload: result: 'Autoload-Dateien für {count} Klassen generiert' cloud: queued: 'Berechnung startet in ca. {seconds} Sekunden (aktuell {jobs} Aufgaben auf {workers} Servern)' processing: 'Aktiv seit {seconds} Sekunden.' error: 'Abhängigkeits-Auflösung fehlgeschlagen' finished: 'Erfolgreich nach {seconds} Sekunden. RAM-Verbrauch: {memory} (Spitze: {peak}), Dauer: {time}.' upload: error: file: 'Die Datei ist ungültig oder enthält keine composer.json.' json: 'Die composer.json enthält keine validen JSON-Daten.' schema: 'Die composer.json Schema-Validierung ist fehlgeschlagen.' partial: 'Der Upload wurde nicht abgeschlossen.' error: writable: root: 'Der Contao Manager kann das Wurzelverzeichnis unter "{path}" nicht beschreiben.' directory: 'Das Verzeichnis "{path}" konnte nicht angelegt werden.' config-file: 'Die Konfigurations-Datei unter "{file}" konnte nicht geschrieben werden.' detail: 'Es scheint als wäre dein Webserver nicht korrekt konfiguriert. Falls du gerade Contao installierst, stelle sicher, dass der DocumentRoot richtig konfiguriert ist. Andernfalls stelle sicher, dass die Dateiberechtigungen korrekt sind. Falls du dies nicht selber reparieren kannst, frage am besten bei deinem Hosting-Anbieter.' it: integrity: allow_url_fopen: title: 'L''impostazione PHP "allow_url_fopen" non è abilitata sul server.' process: title: 'Le funzioni PHP "proc_*" non sono disponibili sul server.' detail: 'Le funzioni "proc_open", "proc_close", "proc_get_status" e "proc_terminate" sono necessarie per eseguire compiti da linea di comando in background. Verifica con il tuo fornitore di hosting perché questo metodo non è disponibile; il Contao Manager non funzionerà correttamente senza di esso.' intl: title: 'L''estensione PHP Intl non è disponibile.' detail: 'Contao 4 richiede l''estensione PHP Intl per l''internazionalizzazione.' openssl: title: 'L''estensione PHP OpenSSL non è disponibile.' detail: 'Il Contao Manager richiede l''estensione OpenSSL per scaricare i file su una connessione criptata (https).' dom: title: 'L''estensione PHP DOM non è disponibile. ' detail: 'Contao 4 richiede l''estensione PHP DOM per analizzare i documenti XML. ' xmlreader: title: 'L''estensione PHP XMLReader non è disponibile.' detail: 'Contao 4 richiede l''estensione PHP XMLReader per analizzare i documenti XML. ' graphics_lib: title: 'Non è disponibile una libreria di elaborazione delle immagini PHP.' detail: 'Contao 4 richiede l''estensione GD, Imagick o Gmagick per elaborare le immagini.' symlink: title: 'Il metodo PHP symlink non è disponibile o non funziona correttamente.' session: title: 'Non è stato possibile avviare la sessione PHP.' memory_limit: title: 'Limite della memoria PHP non sufficiente.' detail: 'La configurazione PHP consente solo la memoria {limit} (sulla riga di comando). Questo non è sufficiente per eseguire Composer e non è stato possibile aumentare automaticamente questo limite. Si prega di contattare il proprio fornitore di webhosting per il supporto.' systempdir: title: 'Impossibile scrivere sulla cartella temporanea di sistema.' detail: 'Questo è molto probabilmente un problema con la vostra configurazione di hosting. Assicurarsi che open_basedir permetta l''accesso alla directory temporanea o che sys_temp_dir sia configurato correttamente.' zip: title: '' boot: composer: invalid: 'Convalida dello schema composer.json: {exception}' config: php_cli: not_found: 'Questo percorso non contiene un PHP valido.' incompatible: 'Il PHP è una versione {cli} ma il tuo server web è una versione {web}.' error: 'Errore durante la convalida del PHP binary.' cloud: platform: 'La piattaforma non deve essere configurata in composer.json.' cache: 'Le proprietà della cache non devono essere configurate in composer.json.' task: setup_packages: title: 'Installazione dell''applicazione Contao' install_packages: title: 'Installazione delle dipendenze del composer' update_packages: title: 'Aggiornamento pacchetti' dump_autoload: title: 'Dumping Composer Class Autoloader' clear_cache: title: 'Cancellazione della cache del compositore' rebuild_cache: title: 'Ricostruzione di Contao Cache' self_update: title: 'Auto-aggiornamento del Contao Manager' backup_create: title: 'Creazione del backup del database' backup_restore: title: 'Ripristino del backup del database' taskoperation: self-update: detail: 'Aggiornamento da {old} a {new}' success: 'Aggiornato a {nuovo}' install-uploads: summary: 'Installazione uploads' console: 'Installate modifiche per {package} (versione {version}) [su pacchetti / {name}]' remove-uploads: summary: 'Rimuovi uploads' remove-artifacts: summary: '' composer-install: retry: 'riprova {current}/{max}' nothing: 'Niente da installare o aggiornare' result: '{installs} installato, {updates} aggiornato, {removals} rimosso' dump-autoload: result: 'Generati file di caricamento automatico ottimizzati contenenti {count} classi' cloud: queued: 'In coda, a partire da circa {seconds} secondi (attualmente {jobs} jobs {workers} attivi)' processing: 'Attivo per {secondi} secondi.' error: 'Verifica delle dipendenze non riuscita' finished: 'Completatio in {seconds} secondi. Utilizzo della memoria: {memory} (peak: {peak}), tempo: {time}.' upload: error: file: 'Il file non è valido o non contiene un composer.json.' json: 'Composer.json non contiene dati JSON validi.' schema: 'La convalida dello schema composer.json non è riuscita.' partial: 'Il caricamento del file non è stato completato.' error: writable: root: 'Il Contao Manager non poteva scrivere nella directory principale in "{path}".' directory: 'Contao Manager non è stato in grado di creare la directory "{path}".' config-file: 'Contao Manager non ha potuto scrivere un file di configurazione "{file}".' detail: 'Sembra che il tuo server non sia configurato correttamente. Se stai per installare Contao, configura la document root del tuo server web. In caso contrario, assicurarsi che le autorizzazioni di accesso al file siano corrette. Se non sei sicuro di come risolvere questo problema, contatta il tuo provider di hosting per supporto.' pl: integrity: allow_url_fopen: title: 'Ustawienie PHP "allow_url_fopen" nie jest włączone na serwerze.' process: title: 'Funkcje PHP "proc_*" sÄ… niedostÄ™pne na serwerze.' detail: 'Funkcje "proc_open", "proc_close", "proc_get_status" i "proc_terminate" sÄ… konieczne do wykonywania zadaÅ„ w linii komend w tle. Skonsultuj z administratorem serwera, dlaczego te funkcje sÄ… niedostÄ™pne; Contao Manager nie bÄ™dzie dziaÅ‚aÅ‚ bez nich prawidÅ‚owo.' intl: title: 'Rozszerzenie PHP Intl jest niedostÄ™pne.' detail: 'Contao 4 wymaga rozszerzenia PHP Intl w celach umiÄ™dzynarodowienia.' openssl: title: 'Rozszerzenie PHP OpenSSL jest niedostÄ™pne.' detail: 'Contao Manager wymaga rozszerzenia OpenSSL w celu pobierania plików przez szyfrowane połączenie (https).' dom: title: 'Rozszerzenie PHP DOM jest niedostÄ™pne.' detail: 'Contao 4 wymaga rozszerzenia PHP DOM do czytania dokumentów XML.' xmlreader: title: 'Rozszerzenie PHP XMLReader jest niedostÄ™pne.' detail: 'Contao 4 wymaga rozszerzenia PHP XMLReader do czytania dokumentów XML.' graphics_lib: title: 'Nie ma dostÄ™pnej biblioteki PHP do przetwarzania obrazków.' detail: 'Contao 4 wymaga rozszerzenia GD, Imagick lub Gmgick do przetwarzania obrazków.' symlink: title: 'Metoda PHP symlink jest niedostÄ™pna lub nie dziaÅ‚a prawidÅ‚owo.' session: title: 'Sesja PHP nie mogÅ‚a zostać uruchomiona.' memory_limit: title: 'NiewystarczajÄ…cy limit pamiÄ™ci.' detail: 'Twoja konfiguracja PHP pozwala tylko na {limit} pamiÄ™ci (w linii komend). To nie wystarczy na uruchomienie Composera i automatycznie podniesienie limitu nie byÅ‚o możliwe. Skontaktuj siÄ™ z hostingodawcÄ….' systempdir: title: 'Nie udaÅ‚o się zapisać do tymczasowego katalogu systemowego.' detail: 'To jest prawdopodobnie problem z konfiguracjÄ… hostingu. Upewnij siÄ™, że open_basedir pozwala na dostÄ™p do tymczasowego katalogu lub, że sys_temp_dir jest poprawnie skonfigurowane.' zip: title: '' boot: composer: invalid: 'walidacja composer.json: {exception}' config: php_cli: not_found: 'Ta Å›cieżka nie zawiera prawidÅ‚owego PHP binary.' incompatible: 'Ta wersja PHP binary to {cli}, ale wersja na serwerze to {web}.' error: 'Błąd podczas sprawdzania poprawnoÅ›ci pliku wykonywalnego PHP.' cloud: platform: 'Platforma nie może być skonfigurowana w composer.json.' cache: 'WÅ‚aÅ›ciwoÅ›ci cache nie mogÄ… być skonfigurowane w composer.json.' task: setup_packages: title: 'Instalowanie Aplikacji Contao' install_packages: title: 'Instalowanie Pakietów Composera' update_packages: title: 'Aktualizowanie pakietów' dump_autoload: title: 'Generowanie Klas Autoloader Composer''a' clear_cache: title: 'Czyszczenie Cache Composera' rebuild_cache: title: 'Przebudowywanie Contao cache' self_update: title: 'Auto-Aktualizacja Contao Manager' backup_create: title: 'Tworzenie kopii zapasowej bazy danych' backup_restore: title: 'Przywracanie kopii zapasowej bazy danych' taskoperation: self-update: detail: 'Aktualizowanie z {old} do {new}' success: 'Aktualizuj do {new}' install-uploads: summary: 'Instalowanie zaÅ‚adowanych plików' console: 'Zainstalowano artifact dla {package} (wersja {version}) [w packages/{name}]' remove-uploads: summary: 'Usuwanie zaÅ‚adowanych plików' remove-artifacts: summary: '' composer-install: retry: 'ponawianie {current}/{max}' nothing: 'Nic od instalacji lub aktualizacji' result: '{installs} zainstalowane, {updates} zaktualizowane, {removals} usuniÄ™te' dump-autoload: result: 'Wygenerowano zoptymalizowane pliki autoload zawierajÄ…ce {count} klas' cloud: queued: 'Dodane do kolejki, startuje za okoÅ‚o {seconds} sekund (aktualnie {jobs} zadaÅ„ w {workers} kolejkach)' processing: 'Aktywne od {seconds} sekund.' error: 'Nie udaÅ‚o siÄ™ rozwiÄ…zać zależnoÅ›ci' finished: 'UkoÅ„czone w {seconds} sekund. Użycie pamiÄ™ci: {memory} (szczyt: {peak}), czas:{time}.' upload: error: file: 'Plik jest nieprawidÅ‚owy lub nie zawiera composer.json.' json: 'Plik composer.json nie zawiera poprawnych danych JSON.' schema: 'Walidacja struktury composer.json nie powiodÅ‚a siÄ™.' partial: 'Wgrywanie pliku nie zostaÅ‚o zakoÅ„czone.' error: writable: root: 'Contao Manager nie mógÅ‚ wykonać zapisu w głównym katalogu w "{path}".' directory: 'Contao Manager nie mógÅ‚ stworzyć katalogu "{path}".' config-file: 'Contao Manager nie mógÅ‚ zapisać pliku konfiguracyjnego w "{file}".' detail: 'WyglÄ…da na to, że twój serwer nie jest poprawnie skonfigurowany. JeÅ›li zamierzasz teraz instalować Contao, skonfiguruj katalog główny serwera www - document root. Sprawdź również, czy uprawnienia do zapisu plików sÄ… prawidÅ‚owe. JeÅ›li nie wiesz jak to naprawić, skontaktuj siÄ™ z administratorem serwera, aby uzyskać wsparcie.' fa: integrity: allow_url_fopen: title: 'تنظیم PHP "allow_url_fopen" در سرور ÙØ¹Ø§Ù„ نیست.' process: title: '' detail: '' intl: title: 'Ø§ÙØ²ÙˆÙ†Ù‡ PHP Intl موجود نیست.' detail: '' openssl: title: 'Ø§ÙØ²ÙˆÙ†Ù‡â€ŒÛŒ PHP OpenSSL موجود نیست.' detail: '' dom: title: '' detail: '' xmlreader: title: '' detail: '' graphics_lib: title: '' detail: '' symlink: title: '' session: title: '' memory_limit: title: 'محدویت Ø­Ø§ÙØ¸Ù‡â€ŒÛŒ PHP ناکاÙÛŒ' detail: '' systempdir: title: 'قادر به نوشتن دایرکتوری سیستم موقت نیست.' detail: '' boot: composer: invalid: '' config: php_cli: not_found: 'این مسیر شما یک باینری PHP معتبر نیست.' incompatible: 'این باینری PHP نسخه‌ی {cli} است اما وب سرورتان نسخه‌ی {web} است.' cloud: platform: '' cache: '' task: setup_packages: title: '' install_packages: title: '' update_packages: title: 'بروزرسانی بسته‌ها' dump_autoload: title: '' clear_cache: title: '' rebuild_cache: title: '' self_update: title: '' taskoperation: self-update: detail: '' success: '' install-uploads: summary: '' console: '' remove-uploads: summary: '' composer-install: retry: '' nothing: '' result: '' dump-autoload: result: '' cloud: queued: '' processing: '' error: '' finished: '' upload: error: file: '' json: '' schema: '' partial: '' error: writable: root: '' directory: '' config-file: '' detail: '' sv: integrity: allow_url_fopen: title: 'PHP-inställningen "allow_url_fopen" är inte aktiverad pÃ¥ servern.' process: title: 'PHP "proc_*"-funktionerna är inte tillgängliga pÃ¥ servern.' detail: 'Funktionerna "proc_open", "proc_close", "proc_get_status" och "proc_terminate" är nödvändiga för att köra kommandoradsuppgifter i bakgrunden. Kontrollera med din värdleverantör varför den här metoden inte är tillgänglig; Contao Manager kommer inte att fungera korrekt utan den.' intl: title: 'PHP Intl-tillägget är inte tillgängligt.' detail: 'Contao 4 kräver PHP Intl-tillägget för internationaliseringsändamÃ¥l.' openssl: title: 'PHP OpenSSL-tillägget är inte tillgängligt.' detail: 'Contao Manager kräver OpenSSL-tillägget för att ladda ner filer över en krypterad anslutning (https).' dom: title: 'PHP DOM-tillägget är inte tillgängligt.' detail: 'Contao 4 kräver PHP DOM-tillägget för att tolka XML-dokument.' xmlreader: title: 'PHP XMLReader-tillägget är inte tillgängligt.' detail: 'Contao 4 kräver PHP XMLReader-tillägget för att tolka XML-dokument.' graphics_lib: title: 'Inget PHP-bildbehandlingsbibliotek är tillgängligt.' detail: 'Contao 4 kräver antingen tillägget GD, Imagick eller Gmagick för att bearbeta bilder.' symlink: title: 'PHP symlink-metoden är inte tillgänglig eller fungerar inte korrekt.' session: title: 'PHP-sessionen kunde inte startas.' memory_limit: title: 'Otillräcklig gräns för PHP-minne.' detail: 'Din PHP-konfiguration tillÃ¥ter endast {limit}-minne (pÃ¥ kommandoraden). Detta räcker inte för att köra Composer och det var inte möjligt att automatiskt öka denna gräns. Kontakta din värdleverantör för support.' systempdir: title: 'Det gÃ¥r inte att skriva till den tillfälliga systemkatalogen.' detail: 'Detta är troligen ett problem med din värdkonfiguration. Se till att antingen open_basedir tillÃ¥ter Ã¥tkomst till den temporära katalogen eller att sys_temp_dir är korrekt konfigurerad.' zip: title: 'BÃ¥de zip-tillägget och kommandona unzip/7z saknas.' boot: composer: invalid: 'composer.json schemavalidering: {exception}' config: php_cli: not_found: 'Den här sökvägen innehÃ¥ller inte en giltig PHP-binär.' incompatible: 'Den här binära filen är en PHP-version {cli} men din webbserver är version {web}.' error: 'Fel vid validering av PHP-binären.' cloud: platform: 'Plattform fÃ¥r inte konfigureras i composer.json.' cache: 'Cacheegenskaper fÃ¥r inte konfigureras i composer.json.' task: setup_packages: title: 'Installerar Contao-applikationen' install_packages: title: 'Installera Composer Dependens' update_packages: title: 'Uppdaterar paket' dump_autoload: title: 'Dumping Composer Class Autoloader' clear_cache: title: 'Rensa Composer Cache' rebuild_cache: title: 'Bygger om Contao Cache' self_update: title: 'Självuppdatering för Contao Manager' backup_create: title: 'Skapar säkerhetskopiering av databas' backup_restore: title: 'Ã…terställer säkerhetskopiering av databas' taskoperation: self-update: detail: 'Uppdaterar frÃ¥n {old} till {new}' success: 'Uppdaterad till {new}' install-uploads: summary: 'Installerar uppladdningar' console: 'Installerad artefakt för {package} (version {version}) [till package/{name}]' remove-uploads: summary: 'Tar bort uppladdningar' remove-artifacts: summary: '' composer-install: retry: 'försöker igen {current}/{max}' nothing: 'Inget att installera eller uppdatera' result: '{installs} installerat, {updates} uppdaterat, {removals} borttaget' dump-autoload: result: 'Genererade optimerade autoload-filer som innehÃ¥ller {count} klasser' cloud: queued: 'Kö, med start om ca. {seconds} sekunder (för närvarande {jobs} jobb pÃ¥ {workers} arbetare)' processing: 'Aktiv i {seconds} sekunder.' error: 'Det gick inte att lösa beroenden' finished: 'Klart pÃ¥ {seconds} sekunder. Minnesanvändning: {memory} (peak: {peak}), tid: {time}.' upload: error: file: 'Filen är ogiltig eller innehÃ¥ller inte en composer.json.' json: 'Composer.json innehÃ¥ller inte giltig JSON-data.' schema: 'Composer.json-schemavalideringen misslyckades.' partial: 'Filuppladdningen slutfördes inte.' error: writable: root: 'Contao Manager kunde inte skriva till rotkatalogen pÃ¥ "{path}".' directory: 'Contao Manager kunde inte skapa katalogen "{path}".' config-file: 'Contao Manager kunde inte skriva en konfigurationsfil till "{file}".' detail: 'Det verkar som om din server inte är korrekt konfigurerad. Om du är pÃ¥ väg att installera Contao, vänligen konfigurera DocumentRoot för din webbserver. Se annars till att filÃ¥tkomstbehörigheterna är korrekta. Om du är osäker pÃ¥ hur du Ã¥tgärdar detta, kontakta din värdleverantör för support.' en: integrity: allow_url_fopen: title: 'The PHP setting "allow_url_fopen" is not enabled on the server.' process: title: 'The PHP "proc_*" functions are not available on the server.' detail: 'The "proc_open", "proc_close", "proc_get_status" and "proc_terminate" functions are necessary to run command line tasks in the background. Check with your hosting provider why this method is not available; the Contao Manager will not run correctly without it.' intl: title: 'The PHP Intl extension is not available.' detail: 'Contao 4 requires the PHP Intl extension for internationalization purposes.' openssl: title: 'The PHP OpenSSL extension is not available.' detail: 'The Contao Manager requires the OpenSSL extension to download files over an encrypted connection (https).' dom: title: 'The PHP DOM extension is not available.' detail: 'Contao 4 requires the PHP DOM extension to parse XML documents.' xmlreader: title: 'The PHP XMLReader extension is not available.' detail: 'Contao 4 requires the PHP XMLReader extension to parse XML documents.' graphics_lib: title: 'No PHP image processing library is available.' detail: 'Contao 4 requires either the GD, Imagick or Gmagick extension to process images.' symlink: title: 'The PHP symlink method is unavailable or does not work correctly.' session: title: 'The PHP session could not be started.' memory_limit: title: 'Insufficient PHP memory limit.' detail: 'Your PHP configuration only allows for {limit} memory (on the command line). This is not enough to run Composer and it was not possible to automatically increase this limit. Please contact your hosting provider for support.' systempdir: title: 'Unable to write to the temporary system directory.' detail: 'This is most likely a problem with your hosting configuration. Make sure that either open_basedir does allow access to the temporary directory or that the sys_temp_dir is correctly configured.' zip: title: 'The zip extension and unzip/7z commands are both missing.' boot: composer: invalid: 'composer.json schema validation: {exception}' config: php_cli: not_found: 'This path does not contain a valid PHP binary.' incompatible: 'This binary is a PHP version {cli} but your web server is version {web}.' error: 'Error validating the PHP binary.' cloud: platform: 'Platform must not be configured in composer.json.' cache: 'Cache properties must not be configured in composer.json.' task: setup_packages: title: 'Installing Contao Application' install_packages: title: 'Installing Composer Dependencies' update_packages: title: 'Updating Packages' dump_autoload: title: 'Dumping Composer Class Autoloader' clear_cache: title: 'Clearing Composer Cache' rebuild_cache: title: 'Rebuilding Contao Cache' self_update: title: 'Contao Manager Self-Update' backup_create: title: 'Creating database backup' backup_restore: title: 'Restoring database backup' taskoperation: self-update: detail: 'Updating from {old} to {new}' success: 'Updated to {new}' install-uploads: summary: 'Installing uploads' console: 'Installed artifact for {package} (version {version}) [to packages/{name}]' remove-uploads: summary: 'Removing uploads' remove-artifacts: summary: 'Removing uploaded packages' composer-install: retry: 'retrying {current}/{max}' nothing: 'Nothing to install or update' result: '{installs} installed, {updates} updated, {removals} removed' dump-autoload: result: 'Generated optimized autoload files containing {count} classes' cloud: queued: 'Queued, starting in approx. {seconds} seconds (currently {jobs} jobs on {workers} workers)' processing: 'Active for {seconds} seconds.' error: 'Failed resolving dependencies' finished: 'Completed in {seconds} seconds. Memory usage: {memory} (peak: {peak}), time: {time}.' upload: error: file: 'The file is invalid or does not contain a composer.json.' json: 'The composer.json does not contain valid JSON data.' schema: 'The composer.json schema validation failed.' partial: 'The file upload was not completed.' error: writable: root: 'The Contao Manager could not write to the root directory at "{path}".' directory: 'The Contao Manager could not create the directory "{path}".' config-file: 'The Contao Manager could not write a config file to "{file}".' detail: 'It looks like your server is not configured correctly. If you are about to install Contao, please setup the DocumentRoot of your web server. Otherwise make sure the file access permissions are correct. If you are unsure how to fix this, contact your hosting provider for support.' ja: integrity: allow_url_fopen: title: 'サーãƒãƒ¼ã®PHPã®è¨­å®šã§"allow_url_fopen"ãŒæœ‰åйã§ã¯ã‚りã¾ã›ã‚“。' process: title: 'PHPã®"proc_"é–¢æ•°ãŒæœ‰åйã§ã¯ã‚りã¾ã›ã‚“。' detail: 'ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ã‚³ãƒžãƒ³ãƒ‰è¡Œã®ã‚¿ã‚¹ã‚¯ã‚’実行ã™ã‚‹ãŸã‚ã«"proc_open"ã€"proc_close"ã€"proc_get_status"ã€"proc_terminate"ã¨ã„ã£ãŸé–¢æ•°ãŒå¿…è¦ã§ã™ã€‚ã“れらã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒä½•故利用ã§ããªã„ã‹ã‚’ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›è€…ã«ç¢ºèªã—ã¦ãã ã•ã„ã€ã“れらãªã—ã§ã¯Contao Managerã¯æ­£ã—ã動作ã—ã¾ã›ã‚“。' intl: title: 'PHPã®Intl拡張を利用ã§ãã¾ã›ã‚“。' detail: 'Contao 4ã¯å›½éš›åŒ–ã®ç›®çš„ã®ãŸã‚ã«PHPã®Intl拡張を必è¦ã¨ã—ã¾ã™ã€‚' openssl: title: 'PHPã®OpenSSL拡張を利用ã§ãã¾ã›ã‚“。' detail: 'Contao Managerã¯æš—å·åŒ–ã—ãŸæŽ¥ç¶š(https)ã§ãƒ•ァイルをダウンロードã™ã‚‹ãŸã‚ã«OpenSSLæ‹¡å¼µãŒå¿…è¦ã§ã™ã€‚' dom: title: 'PHPã®DOM拡張を利用ã§ãã¾ã›ã‚“。' detail: 'Contao 4ã¯XMLドキュメントã®è§£æžã®ãŸã‚ã«PHPã®DOM拡張を必è¦ã¨ã—ã¾ã™ã€‚' xmlreader: title: 'PHPã®XMLReader拡張を利用ã§ãã¾ã›ã‚“。' detail: 'Contao 4ã¯XMLドキュメントã®è§£æžã®ãŸã‚ã«PHPã®XMLReader拡張を必è¦ã¨ã—ã¾ã™ã€‚' graphics_lib: title: 'PHPã®ç”»åƒå‡¦ç†ã®ãƒ©ã‚¤ãƒ–ラリãŒä½•も利用ã§ãã¾ã›ã‚“。' detail: 'Contao 4ã¯ç”»åƒã‚’処ç†ã™ã‚‹ãŸã‚ã«GDã€IMagickã€Gmagickã®æ‹¡å¼µã®ã„ãšã‚Œã‹ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚' symlink: title: 'PHPã®symlinkメソッドを利用ã§ããªã„ã‹ã€æ­£ã—ã動作ã—ã¾ã›ã‚“。' session: title: 'PHPã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‹å§‹ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚' memory_limit: title: 'PHPã®ãƒ¡ãƒ¢ãƒªã®åˆ¶é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚' detail: 'PHPã®è¨­å®šã¯(コマンド行ã§ã¯){limit}ã®ãƒ¡ãƒ¢ãƒªã ã‘を許å¯ã—ã¦ã„ã¾ã™ã€‚ã“ã§ã¯Composerを動作ã•ã›ã‚‹ã®ã«å分ã§ã¯ãªãã€åˆ¶é™ã‚’自動的ã«å¢—ã‚„ã™ã“ã¨ã‚‚ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°ã®æä¾›è€…ã«é€£çµ¡ã—ã¦ã‚µãƒãƒ¼ãƒˆã‚’求ã‚ã¦ãã ã•ã„。' systempdir: title: 'システムã®ä¸€æ™‚ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚' detail: 'ホスティングã®è¨­å®šã«å•題ã®å¯èƒ½æ€§ãŒã‚‚ã£ã¨ã‚‚高ã„ã§ã™ã€‚open_basedirãŒä¸€æ™‚ディクトリã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¦ã„ã‚‹ã‹ã€sys_temp_dirãŒæ­£ã—ã設定ã•れã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。' zip: title: 'zipæ‹¡å¼µã¨unzip/7zコマンドã®ä¸¡æ–¹ãŒã‚りã¾ã›ã‚“。' boot: composer: invalid: 'composer.jsonã‚¹ã‚­ãƒ¼ãƒ ã®æ¤œè¨¼: {exception}' config: php_cli: not_found: 'ã“ã®ãƒ‘ã‚¹ã«æœ‰åйãªPHPã®å®Ÿè¡Œãƒ•ァイルãŒã‚りã¾ã›ã‚“。' incompatible: 'ã“ã®å®Ÿè¡Œãƒ•ァイルã¯PHPã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯{cli}ã§ã™ãŒã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ã§ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯{web}ã§ã™ã€‚' error: 'PHPã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã®æœ‰åŠ¹æ€§ç¢ºèªã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚' cloud: platform: 'プラットフォームã¯composer.jsonã«æ§‹æˆã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。' cache: 'キャッシュã®å±žæ€§ã‚’composer.jsonã«æ§‹æˆã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。' task: setup_packages: title: 'Contaoアプリケーションをインストール中' install_packages: title: 'Composerã®ä¾å­˜é–¢ä¿‚をインストール中' update_packages: title: 'パッケージを更新' dump_autoload: title: 'Composerã®ã‚¯ãƒ©ã‚¹ã®ã‚ªãƒ¼ãƒˆãƒ­ãƒ¼ãƒ€ãƒ¼ã‚’書ã出ã—中' clear_cache: title: 'Composerã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去中' rebuild_cache: title: 'Contaoã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’å†ä½œæˆ' self_update: title: 'Contao Managerã®è‡ªå·±æ›´æ–°' backup_create: title: 'データベースã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を作æˆä¸­' backup_restore: title: 'データベースã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を復元中' taskoperation: self-update: detail: '{old}ã‹ã‚‰{new}ã«æ›´æ–°ä¸­' success: '{new}ã«æ›´æ–°å®Œäº†' install-uploads: summary: 'アップロードã—ãŸãƒ•ァイルをインストール中' console: '{package} (ãƒãƒ¼ã‚¸ãƒ§ãƒ³ {version})ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«éŽç¨‹[packages/{name}ã«å­˜åœ¨]' remove-uploads: summary: 'アップロードã—ãŸãƒ•ァイルを削除中' remove-artifacts: summary: 'アップロードã—ãŸãƒ‘ッケージを削除中' composer-install: retry: 'å†è©¦è¡Œä¸­ {current}/{max}' nothing: 'インストールやアップデートã¯ãªã—' result: '{installs}個をインストールã€{updates}個をアップデートã€{removals}個を削除' dump-autoload: result: '{count}個ã®ã‚¯ãƒ©ã‚¹ã‚’å«ã‚€æœ€é©åŒ–ã—ãŸè‡ªå‹•読ã¿è¾¼ã¿ã®ãƒ•ァイルを生æˆ' cloud: queued: 'キューã«è¿½åŠ ã—ç´„{seconds}ç§’ã§é–‹å§‹äºˆå®š (ç¾åœ¨{workers}個ã®ãƒ¯ãƒ¼ã‚«ãƒ¼ã«{jobs}個ã®ã‚¸ãƒ§ãƒ–)' processing: '{seconds}秒動作中' error: 'ä¾å­˜é–¢ä¿‚ã®è§£æ±ºã«å¤±æ•—' finished: '{seconds}ç§’ã§å®Œäº†ã€‚メモリã®ä½¿ç”¨: {memory} (最大: {peak})ã€æ™‚é–“: {time}。' upload: error: file: 'ファイルãŒç„¡åйã€ã¾ãŸã¯composer.jsonã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。' json: 'composer.jsonãŒæ­£ã—ã„JSONã®ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。' schema: 'composer.jsonã‚¹ã‚­ãƒ¼ãƒžã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸã€‚' partial: 'アップロードã—ãŸãƒ•ァイルã¯å®Œå…¨ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚' error: writable: root: 'Contao Managerã¯"{path}"ã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚' directory: 'Contao Managerã¯"{path}"ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚' config-file: 'Contao Managerã¯æ§‹æˆãƒ•ァイルを"{file}"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚' detail: 'サーãƒãƒ¼ã‚’æ­£ã—ãæ§‹æˆã§ãã¦ã„ãªã„様ã§ã™ã€‚Contaoをインストールã—よã†ã¨ã—ã¦ã„ã‚‹å ´åˆã¯ã€Webサーãƒãƒ¼ã®DocumentRootを設定ã—ã¦ãã ã•ã„。ãã†ã§ãªã„å ´åˆã¯ãƒ•ァイルã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ãŒæ­£ã—ã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ã“れを修正ã™ã‚‹æ–¹æ³•ãŒã‚ã‹ã‚‰ãªã„å ´åˆã¯ã€ãƒ›ã‚¹ãƒ†ã‚£ãƒ³ã‚°æä¾›è€…ã«é€£çµ¡ã—ã¦ã‚µãƒãƒ¼ãƒˆã‚’求ã‚ã¦ãã ã•ã„。' ru: integrity: allow_url_fopen: title: 'ÐаÑтройка PHP "allow_url_fopen" отключена на Ñервере.' process: title: 'Функции PHP "proc_*" недоÑтупны на Ñервере.' detail: 'Функции "proc_open", "proc_close", "proc_get_status" и "proc_terminate" необходимы Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ‡ командной Ñтроки в фоновом режиме. Узнайте у вашего хоÑтинг-провайдера, почему Ñтот метод недоÑтупен, Contao Manager не будет корректно работать без него.' intl: title: 'РаÑширение PHP Intl недоÑтупно.' detail: 'Contao 4 необходимо раÑширение PHP Intl в целÑÑ… интернационализации.' openssl: title: 'РаÑширение PHP OpenSSL недоÑтупно.' detail: 'Contao Manager необходимо раÑширение OpenSSL Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов по зашифрованному Ñоединению (https).' dom: title: 'РаÑширение PHP DOM недоÑтупно.' detail: 'Contao 4 необходимо раÑширение PHP DOM Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° XML-документов.' xmlreader: title: 'РаÑширение PHP XMLReader недоÑтупно.' detail: 'Contao 4 необходимо раÑширение PHP XMLReader Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° XML-документов.' graphics_lib: title: 'Библиотека обработки изображений PHP не доÑтупна.' detail: 'Ð”Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ изображений Contao 4 требует раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ GD, Imagick или Gmagick.' symlink: title: 'Метод PHP symlink недоÑтупен или работает неправильно.' session: title: 'Ðе удалоÑÑŒ запуÑтить ÑÐµÐ°Ð½Ñ PHP.' memory_limit: title: 'ÐедоÑтаточный предел памÑти PHP.' detail: 'ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ PHP позволÑет иÑпользовать только {limit} памÑти (в командной Ñтроке). Этого недоÑтаточно Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Composer и автоматичеÑкое увеличение Ñтого предела невозможно. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ обратитеÑÑŒ к вашему хоÑтинг-провайдеру.' systempdir: title: 'Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать во временный ÑиÑтемный каталог.' detail: 'ВероÑтно, Ñто проблема Ñ Ð½Ð°Ñтройкой вашего хоÑтинга. УбедитеÑÑŒ, что open_basedir разрешает доÑтуп к временному каталогу или sys_temp_dir наÑтроен правильно.' zip: title: 'РаÑширение zip и команды unzip/7z отÑутÑтвуют.' boot: composer: invalid: 'composer.json проверка Ñхемы: {exception}' config: php_cli: not_found: 'Путь не Ñодержит верный бинарный файл PHP.' incompatible: 'Двоичный файл PHP верÑии {cli}, а веб-Ñервер верÑии {web}.' error: 'Ошибка проверки двоичного файла PHP.' cloud: platform: 'Платформа не должна быть наÑтроена в composer.json.' cache: 'СвойÑтва кеша не должны быть наÑтроены в composer.json.' task: setup_packages: title: 'УÑтановка Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Contao' install_packages: title: 'УÑтановка завиÑимоÑтей Composer' update_packages: title: 'Обновление пакетов' dump_autoload: title: 'Дампинг автозагрузчика клаÑÑа Composer' clear_cache: title: 'ОчиÑтка кеша Composer' rebuild_cache: title: 'ПереÑтроение кеша Contao' self_update: title: 'ÐвтоматичеÑкое обновление Contao Manager' backup_create: title: 'Создание резервной копии базы данных' backup_restore: title: 'ВоÑÑтановление резервной копии базы данных' taskoperation: self-update: detail: 'Обновление Ñ {old} до {new}' success: 'Обновлено до {new}' install-uploads: summary: 'УÑтановка загрузок' console: 'УÑтановлен артефакт Ð´Ð»Ñ {package} (верÑии {version}) [к пакетам/{name}]' remove-uploads: summary: 'Удаление загрузок' remove-artifacts: summary: 'Удаление загруженных пакетов' composer-install: retry: 'Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° {current}/{max}' nothing: 'Ðечего уÑтанавливать или обновлÑть' result: '{installs} уÑтановлено, {updates} обновлено, {removals} удалено' dump-autoload: result: 'Созданы оптимизированные файлы автозагрузки, Ñодержащие клаÑÑÑ‹ {count}' cloud: queued: 'Ð’ очереди, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ð¿Ñ€Ð¸Ð±Ð»Ð¸Ð·Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ Ñ {seconds} Ñек. (ÑÐµÐ¹Ñ‡Ð°Ñ {jobs} задач в {workers} воркерах (workers))' processing: 'Ðктивен в течение {seconds} Ñек.' error: 'Ошибка Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑтей' finished: 'Завершено за {seconds} Ñек. ИÑпользование памÑти: {memory} (пик: {peak}), времÑ: {time}.' upload: error: file: 'Ошибка файла или отÑутÑтвует composer.json.' json: 'Файл composer.json не Ñодержит допуÑтимых данных JSON.' schema: 'Ошибка проверки Ñхемы composer.json.' partial: 'Загрузка файла не была завершена.' error: writable: root: 'Contao Manager не Ñмог запиÑать в корневой каталог "{path}".' directory: 'Contao Manager не Ñмог Ñоздать каталог "{path}".' config-file: 'Contao Manager не Ñмог запиÑать файл конфигурации "{file}".' detail: 'ВероÑтно, Ñервер наÑтроен неправильно. ЕÑли вы ÑобираетеÑÑŒ уÑтановить Contao, уÑтановите корневой каталог документов веб-Ñервера. Ð’ противном Ñлучае убедитеÑÑŒ, что права доÑтупа к файлам указаны правильно. ЕÑли вы не знаете, как Ñто иÑправить, обратитеÑÑŒ за помощью к Ñвоему хоÑтинг-провайдеру.' sr: integrity: allow_url_fopen: title: 'Опција PHP "allow_url_fopen" није омогућена на Ñерверу.' process: title: 'Функције PHP "proc_*" ниÑу доÑтупне на Ñерверу.' detail: 'Функције "proc_open", "proc_close", "proc_get_status" and "proc_terminate"  Ñу неопходне за извршавање задатака командне линије у позадини. Проверите Ñа Ñвојим провајдером хоÑтинга зашто ниÑу доÑтупне; Contao Manager без њих неће радити иÑправно.' intl: title: 'ЕкÑтензија PHP Intl није доÑтупна.' detail: 'Contao 4 захтева Intl екÑтензију ради потреба интернационализације.' openssl: title: 'ЕкÑтензија PHP OpenSSL није доÑтупна.' detail: 'Contao Менаџер захтева OpenSSL екÑтензију ради преузимања фајлова преко заштићене конекције (https). ' dom: title: 'ЕкÑтензија PHP DOM није доÑтупна.' detail: 'Contao 4 треба екÑтензију PHP DOM да би могао да обрађује XML документе.' xmlreader: title: 'ЕкÑтензија PHP XMLReader није доÑтупна.' detail: 'Contao 4 треба екÑтензију PHP XMLReader да би могао да обрађује XML документе.' graphics_lib: title: 'Ðије доÑтупна нити једна PHP библиотека за обраду Ñлика.' detail: 'Contao 4 треба GD, Imagick или Gmagick да би могао да обрађује Ñлике.' symlink: title: 'Метода PHP symlink није доÑтупна или не ради иÑправно.' session: title: 'PHP ÑеÑија није покренута.' memory_limit: title: 'Ðедовољан лимит меморије за PHP.' detail: 'Ваша конфигурација PHP дозвољава употребу {limit} меморије (у командној линији). То није довољно да би Композер радио, а није уÑпело ни аутоматÑко повећање лимита. Контактирајте вашег провајдера ради подршке.' systempdir: title: 'ÐеуÑпешан ÑƒÐ¿Ð¸Ñ Ñƒ привремени ÑиÑтемÑки директоријум.' detail: 'Ово је вероватно узроковано конфигурацијом хоÑтинга. Проверите да ли open_basedir дозвољава приÑтуп привременом директоријуму, и да ли је sys_temp_dir иÑправно конфигуриÑан.' zip: title: '' boot: composer: invalid: 'composer.json schema validation: {exception}' config: php_cli: not_found: 'Ова путања не Ñадржи валидан PHP binary.' incompatible: 'Овај binary је намењен верзији PHP {cli} док је на вашем веб Ñерверу верзија {web}.' error: 'Грешка приликом валидације PHP binary.' cloud: platform: 'Платформа не Ñме бити конфигуриÑана у composer.json.' cache: 'Подешавања Cache-а не Ñмеју бити конфигуриÑана у composer.json.' task: setup_packages: title: 'ИнÑталирање Contao апликације' install_packages: title: 'ИнÑталирање Композер завиÑноÑти' update_packages: title: 'Ðжурирање Пакета' dump_autoload: title: 'Пражњење Composer Class Autoloader-а' clear_cache: title: 'Пражњење Композер Cache-а' rebuild_cache: title: 'Поновно креирање кеша' self_update: title: 'Contao Manager аутоматÑко ажурирање' backup_create: title: 'Креирање резервне копије базе података' backup_restore: title: 'Обнављање копије базе података' taskoperation: self-update: detail: 'Ðадоградња Ñа {old} на {new}' success: 'Ðжурирано на {new}' install-uploads: summary: 'ИнÑталирање преузетих фајлова' console: 'ИнÑталиÑани артифакти за {package} (верзија {version}) [to packages/{name}]' remove-uploads: summary: 'Уклањање преузетих фајлова' remove-artifacts: summary: '' composer-install: retry: 'покушај {current}/{max}' nothing: 'Ðема ништа за инÑталацију или преузимање' result: '{installs} инÑталирано, {updates} ажурирано, {removals} уклоњено' dump-autoload: result: 'Generated optimized autoload files containing {count} classes' cloud: queued: 'Убачено у редоÑлед, почиње за око {seconds} Ñекунди (тренутно {jobs} задатака у {workers} поÑлова)' processing: 'Ðктивно {seconds} Ñекунди.' error: 'ÐеуÑпешно разрешавање завиÑноÑти' finished: 'Завршено за {seconds} Ñекунди. Употреба меморије: {memory} (peak: {peak}), time: {time}.' upload: error: file: 'Фајл је неиÑправан или не Ñадржи composer.json.' json: 'Composer.json не Ñадржи иÑправне JSON податке.' schema: 'Валидација composer.json schema није уÑпела.' partial: 'Преузимање фајла није завршено.' error: writable: root: 'Contao Manager не може да пише у root directory на путањи "{path}".' directory: 'Contao Manager не може да креира директоријум "{path}".' config-file: 'Contao Manager не може да пише у конфигурациони фајл "{file}".' detail: 'Чини Ñе да Ваш Ñервер није иÑправно конфигуриÑан. Ðко планирате да инÑталирате Contao, подеÑите DocumentRoot на Вашем мрежном Ñерверу. У Ñупротном будите Ñигурни да Ñу дозволе за приÑтуп фајловима иÑправне. Ðко ниÑте Ñигурни како то да урадите, контактирајте Вашег хоÑтинг провајдера.' fr: integrity: allow_url_fopen: title: 'Le paramètre PHP "allow_url_fopen" n''est pas activé sur le serveur.' process: title: '' detail: '' intl: title: 'L''extension PHP Intl n''est pas disponible.' detail: 'Contao 4 nécessite l''extension PHP Intl à des fins d''internationalisation.' openssl: title: 'L''extension PHP OpenSSL n''est pas disponible.' detail: 'Contao Manager requiert l''extension OpenSSL pour télécharger des fichiers via une connexion cryptée (https).' dom: title: 'L''extension PHP DOM n''est pas disponible.' detail: 'Contao 4 nécessite l''extension PHP DOM pour analyser les documents XML.' xmlreader: title: 'L''extension PHP XMLReader n''est pas disponible.' detail: 'Contao 4 nécessite l''extension PHP XMLReader pour analyser les documents XML.' graphics_lib: title: 'No PHP image processing library is available.' detail: 'Contao 4 requires either the GD, Imagick or Gmagick extension to process images.' symlink: title: 'La méthode PHP symlink n''est pas disponible ou ne fonctionne pas correctement.' session: title: 'La session PHP n''a pas pu être démarrée.' memory_limit: title: 'Limite de mémoire PHP insuffisante.' detail: 'Votre configuration PHP permet uniquement {limit} de mémoire (en ligne de commande). Ce n''est pas suffisant pour exécuter Composer et il n''a pas été possible d''augmenter automatiquement cette limite. Veuillez contacter votre hébergeur web pour obtenir de l''aide.' systempdir: title: 'Impossible d''écrire sur le répertoire temporaire du système.' detail: 'C''est probablement un problème avec votre configuration d''hébergement. Assurez-vous que open_basedir permet d''accéder au répertoire temporaire ou que sys_temp_dir est correctement configuré.' zip: title: '' boot: composer: invalid: 'composer.json schema validation: {exception}' config: php_cli: not_found: 'Ce chemin ne contient pas de binaire PHP valide.' incompatible: 'Ce binaire est une version PHP {cli} mais votre serveur web est en version {web}.' error: '' cloud: platform: 'Platform ne doit pas être configurée dans composer.json.' cache: 'Les propriétés du cache ne doivent pas être configurées dans composer.json.' task: setup_packages: title: 'Installation de l''application Contao' install_packages: title: 'Installation des dépendances de Composer' update_packages: title: 'Mise à jour des packages' dump_autoload: title: 'Vidage de l''autoloader de Composer' clear_cache: title: 'Effacer le cache de Composer' rebuild_cache: title: 'Reconstruction du cache de Contao' self_update: title: '' backup_create: title: '' backup_restore: title: '' taskoperation: self-update: detail: 'Mise à jour de {old} vers {new}' success: '' install-uploads: summary: 'Installation des uploads' console: 'Artifact installé pour {package} (version {version}) [to packages/{name}]' remove-uploads: summary: 'Suppression des uploads' remove-artifacts: summary: '' composer-install: retry: 'réessayer {current}/{max}' nothing: 'Rien à installer ou à mettre à jour' result: '{installs} installés, {updates} mis à jour, {removals} supprimés' dump-autoload: result: 'Fichiers d''autoload optimisés générés contenant {count} classes' cloud: queued: 'En attente, débute dans environ {seconds} secondes (actuellement {jobs} jobs sur {workers} workers)' processing: 'En cours depuis {seconds} secondes.' error: 'La résolution des dépendances a echoué.' finished: 'Terminé en {seconds} secondes. Usage mémoire: {memory} (Pic: {peak}), Temps: {time}.' upload: error: file: 'Le fichier n''est pas valide ou ne contient pas de fichier composer.json.' json: 'Le fichier composer.json ne contient pas de données JSON valides.' schema: 'Le schéma du fichier composer.json n''est pas valide.' partial: 'L''upload du fichier a échoué' error: writable: root: 'Le Contao Manager n''a pas pu écrire dans le répertoire racine "{path}".' directory: 'Le Contao Manager n''a pas pu créer le répertoire "{path}".' config-file: 'The Contao Manager n''a pas pu créer un fichier de configuration dans "{file}".' detail: 'Il semble que votre serveur n''est pas configuré correctement. Si vous êtes sur le point d''installer Contao, veuillez configurer la racine du site sur votre serveur Web. Sinon, assurez-vous que les autorisations d''accès aux fichiers sont correctes. Si vous ne savez pas comment résoudre ce problème, contactez votre fournisseur d''hébergement pour obtenir de l''aide' lv: integrity: allow_url_fopen: title: 'PHP iestatÄ«jums "allow_url_fopen" serverÄ« nav iespÄ“jots.' process: title: 'ServerÄ« nav pieejamas PHP "proc_*" funkcijas.' detail: 'Funkcijas "proc_open", "proc_close", "proc_get_status" un "proc_terminate" ir nepiecieÅ¡amas, lai fona režīmÄ palaistu komandrindas uzdevumus. Noskaidrojiet pie sava hostinga pakalpojumu sniedzÄ“ja, kÄpÄ“c šī metode nav pieejama; bez tÄs Contao Manager nedarbosies pareizi.' intl: title: 'PHP Intl paplaÅ¡inÄjums nav pieejams.' detail: 'Contao 4 ir nepiecieÅ¡ams PHP Intl paplaÅ¡inÄjums internacionalizÄcijas vajadzÄ«bÄm.' openssl: title: 'PHP OpenSSL paplaÅ¡inÄjums nav pieejams.' detail: 'Contao Manager ir nepiecieÅ¡ams OpenSSL paplaÅ¡inÄjums, lai failus lejupielÄdÄ“tu Å¡ifrÄ“tÄ savienojumÄ (https).' dom: title: 'PHP DOM paplaÅ¡inÄjums nav pieejams.' detail: 'Contao 4 ir nepiecieÅ¡ams PHP DOM paplaÅ¡inÄjums, lai analizÄ“tu XML dokumentus.' xmlreader: title: 'PHP XMLReader paplaÅ¡inÄjums nav pieejams.' detail: 'Contao 4 ir nepiecieÅ¡ams PHP XMLReader paplaÅ¡inÄjums, lai analizÄ“tu XML dokumentus.' graphics_lib: title: 'Nav pieejama neviena PHP attÄ“lu apstrÄdes bibliotÄ“ka.' detail: 'Lai apstrÄdÄtu attÄ“lus, Contao 4 nepiecieÅ¡ams paplaÅ¡inÄjums GD, Imagick vai Gmagick.' symlink: title: 'PHP simbolu metode nav pieejama vai nedarbojas pareizi.' session: title: 'NevarÄ“ja uzsÄkt PHP sesiju.' memory_limit: title: 'Nepietiekams PHP atmiņas ierobežojums.' detail: 'JÅ«su PHP konfigurÄcija atļauj tikai {limit} atmiņu (komandrindÄ). Ar to nepietiek, lai palaistu Composer, un nebija iespÄ“jams automÄtiski palielinÄt Å¡o limitu. LÅ«dzu, sazinieties ar savu hostinga pakalpojumu sniedzÄ“ju, lai saņemtu atbalstu.' systempdir: title: 'Nevar rakstÄ«t sistÄ“mas pagaidu direktorijÄ.' detail: 'VisticamÄk, tÄ ir problÄ“ma ar jÅ«su hostinga konfigurÄciju. PÄrliecinieties, vai open_basedir ļauj piekļūt pagaidu direktorijai, vai arÄ« sys_temp_dir ir pareizi konfigurÄ“ta.' zip: title: '' boot: composer: invalid: 'composer.json shÄ“mas validÄcija: {exception}' config: php_cli: not_found: 'Å is ceļš nesatur derÄ«gu PHP binÄru.' incompatible: 'Å is binÄrs ir PHP versija {cli}, bet jÅ«su tÄ«mekļa serveris ir versija {web}.' error: '' cloud: platform: 'Platforma nedrÄ«kst bÅ«t konfigurÄ“ta composer.json.' cache: 'KeÅ¡atmiņas rekvizÄ«ti nedrÄ«kst bÅ«t konfigurÄ“ti composer.json.' task: setup_packages: title: 'InstalÄ“ Contao lietotni' install_packages: title: 'Composer atkarÄ«bu instalēšana' update_packages: title: 'Atjaunina pakotnes' dump_autoload: title: '' clear_cache: title: 'IztÄ«ra Composer keÅ¡atmiņu' rebuild_cache: title: 'PÄrbÅ«vÄ“ Contao keÅ¡atmiņu' self_update: title: 'Contao Manager paÅ¡atjauninÄÅ¡ana' backup_create: title: '' backup_restore: title: '' taskoperation: self-update: detail: 'Atjaunina no {old} uz {new}' success: 'AtjauninÄts uz {new}' install-uploads: summary: 'AugÅ¡upielÄdes instalēšana' console: 'InstalÄ“ts artefakts {package} (versija {version}) [uz packages/{name}]' remove-uploads: summary: 'AugÅ¡upielÄdes noņemÅ¡ana' remove-artifacts: summary: '' composer-install: retry: 'atkÄrtots mēģinÄjums {current}/{max}' nothing: 'Nekas nav jÄinstalÄ“ vai jÄatjaunina' result: '{installs} instalÄ“ts, {updates} atjauninÄts, {removals} noņemts' dump-autoload: result: 'Izveidoti optimizÄ“ti autoload faili, kas satur {count} klases' cloud: queued: 'Ierindots, sÄks aptuveni pÄ“c {seconds} sekundÄ“m (paÅ¡laik {jobs} darbi uz {workers} darbiniekiem).' processing: 'AktÄ«vs {seconds} sekundes.' error: 'NeizdevÄs atrisinÄt atkarÄ«bas' finished: 'Pabeigts {seconds} sekundÄ“s. Atmiņas izmantoÅ¡ana: {memory} (maksimums: {peak}), laiks: {time}.' upload: error: file: 'Datne ir nederÄ«ga vai nesatur composer.json.' json: 'Composer.json nesatur derÄ«gus JSON datus.' schema: 'Composer.json shÄ“mas validÄcija neizdevÄs.' partial: 'Failu augÅ¡upielÄde netika pabeigta.' error: writable: root: 'Contao Manager nevarÄ“ja rakstÄ«t uz saknes direktoriju adresÄ“ "{path}".' directory: 'Contao Manager nevarÄ“ja izveidot direktoriju "{path}".' config-file: 'Contao Manager nevarÄ“ja uzrakstÄ«t konfigurÄcijas failu uz "{file}".' detail: 'IzskatÄs, ka jÅ«su serveris nav pareizi konfigurÄ“ts. Ja gatavojaties instalÄ“t Contao, lÅ«dzu, iestatiet sava tÄ«mekļa servera DocumentRoot. PretÄ“jÄ gadÄ«jumÄ pÄrliecinieties, ka failu piekļuves atļaujas ir pareizas. Ja neesat pÄrliecinÄts, kÄ to novÄ“rst, sazinieties ar savu hostinga pakalpojumu sniedzÄ“ju, lai saņemtu atbalstu.' tr: integrity: allow_url_fopen: title: 'Sunucuda "allow_url_fopen" PHP ayarı etkinleÅŸtirilmemiÅŸ.' process: title: 'Sunucuda "proc_*" iÅŸlevleri kullanılamıyor.' detail: '"proc_open", "proc_close", "proc_get_status" ve "proc_terminate" iÅŸlevleri arka planda komut satırı iÅŸlemlerini yapmak için gereklidir. Barındırma hizmeti saÄŸlayıcınıza bu yöntemlerin neden kullanılamadığını sorun. Bunlar olmadan Contao Manager düzgün ÅŸekilde çalışmaz.' intl: title: 'PHP Intl eklentisi kullanılamıyor.' detail: 'Contao 4 uluslararası özelliklerinin çalışabilmesi için PHP Intl eklentisi gereklidir.' openssl: title: 'PHP OpenSSL eklentisi kullanılamıyor.' detail: 'Contao Manager, ÅŸifrelenmiÅŸ bir baÄŸlantı (https) üzerinden dosyaları indirebilmek için OpenSSL eklentisine gerek duyar.' dom: title: 'PHP DOM eklentisi kullanılamıyor.' detail: 'Contao 4, XML dosyalarını okuyabilmek için PHP XML Reader eklentisine gerek duyar.' xmlreader: title: 'PHP XML Reader eklentisi kullanılamıyor.' detail: 'Contao 4, XML dosyalarını okuyabilmek için PHP XMLReader eklentisine gerek duyar.' graphics_lib: title: 'Kullanılabilecek bir PHP görsel iÅŸleme kitaplığı bulunamadı.' detail: 'Contao 4, görselleri iÅŸlemek için GD, Imagick ya da Gmagick eklentisine gerek duyar.' symlink: title: 'PHP symlink yöntemi kullanılamıyor ya da düzgün ÅŸekilde çalışmıyor.' session: title: 'PHP oturumu baÅŸlatılamadı.' memory_limit: title: 'PHP bellek sınırı yetersiz.' detail: 'PHP yapılandırmanız yalnızca {limit} bellek kullanımına (komut satırında) izin veriyor. Bu deÄŸer, Composer çalıştırmak için yetersiz ve bu sınır otomatik olarak artırılamadı. Destek almak için barındırma hizmeti saÄŸlayıcınızla görüşün.' systempdir: title: 'Geçici sistem klasörüne yazılamadı.' detail: 'Bu sorun büyük olasılıkla barındırma hizmeti yapılandırmanızla ilgilidir. open_basedir tarafından geçici klasöre eriÅŸme izin verildiÄŸinden ya da sys_temp_dir parametresinin doÄŸru yapılandırıldığından emin olun.' zip: title: 'zip eklentisi ile unzip/7z komutlarının ikisi de eksik.' boot: composer: invalid: 'composer.json ÅŸema doÄŸrulaması: {exception}' config: php_cli: not_found: 'Bu yolda geçerli bir PHP binary dosyası bulunamadı.' incompatible: 'Bu binary dosyası bir PHP {cli} sürümü. Ancak site sunucunuzun sürümü {web}.' error: 'PHP binary dosyası doÄŸrulanırken sorun çıktı.' cloud: platform: 'Platform, composer.json içinden yapılandırılmamalıdır.' cache: 'Ön bellek özellikleri composer.json içinde yapılandırılmamalıdır.' task: setup_packages: title: 'Contao uygulaması kuruluyor' install_packages: title: 'Composer bağımlılıkları kuruluyor' update_packages: title: 'Paketler güncelleniyor' dump_autoload: title: 'Composer sınıf otomatik yükleyicisi indiriliyor' clear_cache: title: 'Composer ön belleÄŸi temizleniyor' rebuild_cache: title: 'Contao ön belleÄŸi yeniden oluÅŸturuluyor' self_update: title: 'Contao Manager kendi kendine güncelleme' backup_create: title: 'Veri tabanı yedeÄŸi oluÅŸturuluyor' backup_restore: title: 'Veri tabanı yedeÄŸi geri yükleniyor' taskoperation: self-update: detail: '{old} sürümünden {new} sürümüne güncelleniyor' success: '{new} sürümüne güncellendi' install-uploads: summary: 'Yüklemeler kuruluyor' console: '{package} ({version} sürümü) için [to packages/{name}] artifaktı kuruldu' remove-uploads: summary: 'Yüklemeler kaldırılıyor' remove-artifacts: summary: '' composer-install: retry: 'yeniden deneniyor {current}/{max}' nothing: 'Kurulacak ya da güncellenecek bir ÅŸey yok' result: '{installs} kuruldu, {updates} güncellendi, {removals} kaldırıldı' dump-autoload: result: '{count} sınıf içeren iyileÅŸtirilmiÅŸ otomatik yükleme dosyası üretildi' cloud: queued: 'Kuyrukta, yaklaşık {seconds} saniye içinde baÅŸlayacak (ÅŸu anda {workers} iÅŸlem üzerinde {jobs} görev yapılıyor)' processing: '{seconds} saniyedir iÅŸleniyor.' error: 'Bağımlılıklar çözümlenemedi' finished: '{seconds} saniyede tamamlandı. Bellek kullanımı: {memory} (en fazla: {peak}), süre: {time}.' upload: error: file: 'Dosya geçersiz ya da composer.json dosyasını içermiyor.' json: 'composer.json dosyasında geçerli bir JSON verisi bulunamadı.' schema: 'composer.json ÅŸeması doÄŸrulanamadı.' partial: 'Dosya yüklemesi tamamlanamadı.' error: writable: root: 'Contao Manager "{path}" yolundaki kök klasöre yazamadı.' directory: 'Contao Manager "{path}" klasörünü oluÅŸturamadı.' config-file: 'Contao Manager "{file}" dosyasına yapılandırmayı yazamadı.' detail: 'Sunucunuz doÄŸru yapılandırılmamış gibi görünüyor. Contao kuracaksanız, lütfen site sunucunuzun kök belge klasörüne kurun. Yoksa dosya eriÅŸim izinlerinin doÄŸru olduÄŸundan emin olun. Bu sorunu nasıl düzelteceÄŸinizden emin deÄŸilseniz, destek almak için barındırma hizmeti saÄŸlayıcınızla görüşün.' nl: integrity: allow_url_fopen: title: 'De PHP instelling "allow_url_fopen" is niet ingeschakeld op de server.' process: title: 'De PHP "proc_*" functies zijn niet beschikbaar op de server.' detail: 'De functies "proc_open", "proc_close", "proc_get_status" en "proc_terminate" zijn nodig om opdrachtregeltaken op de achtergrond uit te voeren. Neem contact op met uw hostingprovider waarom deze methode niet beschikbaar is; De Contao Manager wordt niet correct uitgevoerd zonder deze methode.' intl: title: 'De PHP Intl extensie is niet beschikbaar.' detail: 'Contao 4 vereist de Intl extension voor internationalisering.' openssl: title: 'De PHP OpenSSL extensie is niet beschikbaar.' detail: 'Contao Manager vereist de OpenSSL extensie om bestanden over versleutelde verbindingen (https) te downloaden.' dom: title: 'De PHP DOM extensie is niet beschikbaar.' detail: 'Contao 4 vereist de PHP DOM extensie om XML-documenten te parsen.' xmlreader: title: 'De PHP XML Reader extensie is niet beschikbaar.' detail: 'Contao 4 vereist de PHP XMLReader extensie om XML-documenten te parsen.' graphics_lib: title: 'Er is geen bibliotheek voor PHP-beeldverwerking beschikbaar.' detail: 'Contao 4 vereist ofwel de GD, Imagick of Gmagick-extensie om afbeeldingen te verwerken.' symlink: title: 'PHP-symlink methode is niet beschikbaar of werkt niet correct.' session: title: 'PHP-sessie kan niet worden gestart.' memory_limit: title: 'Limiet PHP-geheugen onvoldoende.' detail: 'Uw PHP-configuratie staat alleen {limit} geheugen toe (op de opdrachtregel). Dit is niet genoeg om Composer uit te voeren, het was niet mogelijk om deze limiet automatisch te verhogen. Neem contact op met uw hostingprovider voor ondersteuning.' systempdir: title: 'Tijdelijke systeem directory niet beschrijfbaar.' detail: 'Er is waarschijnlijk een probleem met uw hostingconfiguratie. Zorg ervoor dat open_basedir toegang geeft tot de tijdelijke directory, of dat sys_temp_dir correct is geconfigureerd.' zip: title: '' boot: composer: invalid: 'composer.json schema validatie: {exception}' config: php_cli: not_found: 'Dit pad bevat geen geldige PHP binary.' incompatible: 'Dit binary is een PHP versie {cli} maar uw webserver is versie {web}.' error: 'Fout bij het valideren van het PHP-binaire bestand.' cloud: platform: 'Platform mag niet geconfigureerd zijn in composer.json.' cache: 'Cache instellingen mogen niet geconfigureerd zijn in composer.json.' task: setup_packages: title: 'Contao-applicatie installeren' install_packages: title: 'Composer Afhankelijkheden Installeren' update_packages: title: 'Pakketten bijwerken' dump_autoload: title: 'Dumping Composer Class Autoloader' clear_cache: title: 'Composer Cache Wissen' rebuild_cache: title: 'Contao Cache opnieuw opbouwen' self_update: title: 'Contao Manager Zelf-update' backup_create: title: 'Databaseback-up maken' backup_restore: title: 'Databaseback-up herstellen' taskoperation: self-update: detail: 'Bijwerken van {old} naar {new}' success: 'Update naar {new}' install-uploads: summary: 'Uploads installeren' console: 'Artefact geïnstalleerd voor {package} (version {version}) [to packages/{name}]' remove-uploads: summary: 'Uploads verwijderen' remove-artifacts: summary: '' composer-install: retry: '{current} / {max} opnieuw proberen' nothing: 'Niets om te installeren of bij te werken' result: '{installs} geïnstalleerd, {updates} bijgewerkt, {removals} verwijderd' dump-autoload: result: 'Gegenereerde geoptimaliseerde autoload-bestanden met {count} classes' cloud: queued: 'In de wachtrij, beginnend over ca. {seconds} seconden (momenteel {jobs} banen voor {workers} workers)' processing: 'Actief gedurende {seconds} seconden.' error: 'Het oplossen van afhankelijkheden is mislukt' finished: 'Voltooid in {seconds} seconden. Geheugengebruik: {memory} (piek: {peak}), tijd: {time}.' upload: error: file: 'Het bestand is ongeldig of bevat geen composer.json.' json: 'De composer.json bevat geen geldige JSON-gegevens.' schema: 'De validatie van het componer.json-schema is mislukt.' partial: 'Het uploaden van het bestand is niet voltooid.' error: writable: root: 'Contao Manager kon niet schrijven naar de hoofdmap op "{path}".' directory: 'Contao Manager kon de directory "{path}" niet aanmaken.' config-file: 'Contao Manager kon geen configuratiebestand naar "{file}" schrijven.' detail: 'Het lijkt erop dat uw server niet correct is geconfigureerd. Als u op het punt staat Contao te installeren, stel dan de DocumentRoot van uw webserver in. Zorg er anders voor dat de toegangsrechten voor bestanden correct zijn. Als u niet zeker weet hoe dit op te lossen neem dan contact op met uw hostingprovider voor ondersteuning.' zh: integrity: allow_url_fopen: title: 'æœåŠ¡å™¨æœªå¯ç”¨PHP设置"allow_url_fopen"' process: title: '' detail: '' intl: title: 'PHP扩展Intlä¸å¯ç”¨' detail: 'Contao 4 系统需è¦ä½¿ç”¨PHP Intl扩展æ¥è¿›è¡Œå›½é™…化' openssl: title: 'PHP扩展OpenSSLä¸å¯ç”¨' detail: 'Contao Manager需è¦ä½¿ç”¨OpenSSL扩展æ¥é€šè¿‡åŠ å¯†é“¾æŽ¥(https)下载文件。' dom: title: 'PHP DOM扩展ä¸å¯ç”¨ã€‚' detail: 'Contao 4 éœ€è¦ PHP DOM 扩展æ¥è§£æžXML文档。' xmlreader: title: 'The PHP XMLReader 扩展ä¸å¯ç”¨ã€‚' detail: '' graphics_lib: title: '没有有效的PHP图片处ç†åº“,' detail: 'Contao 4 éœ€è¦ GD, Imagick 或 Gmagick 扩展æ¥å¤„ç†å›¾ç‰‡ã€‚' symlink: title: 'PHP符å·é“¾æŽ¥æ–¹æ³•ä¸å¯ç”¨æˆ–无法正常工作。' session: title: 'PHP session无法å¯åŠ¨ã€‚' memory_limit: title: 'PHP内存é™åˆ¶ä¸è¶³' detail: '当å‰PHPé…置仅å…许 {limit} 内存 (在命令行中)。该内存设置无法满足è¿è¡ŒComposer,该设置无法自动调整增加é™åˆ¶ã€‚请è”系主机æä¾›å•†æä¾›ç›¸å…³æ”¯æŒã€‚' systempdir: title: '系统临时目录无法写入' detail: '很有å¯èƒ½æ˜¯ä¸»æœºçš„é…置问题。请确ä¿open_basedirå…许访问临时目录,或者sys_temp_dir已正确é…置。' zip: title: '' boot: composer: invalid: 'composer.json schema验è¯: {exception}' config: php_cli: not_found: 'è¯¥è·¯å¾„æ²¡æœ‰åŒ…å«æœ‰æ•ˆçš„PHP二进制文件' incompatible: 'PHP二进制文件版本 {cli}Â ä½†æ˜¯å½“å‰æœåŠ¡å™¨ç‰ˆæœ¬ä¸º {web}' error: '' cloud: platform: 'ä¸å¾—在composer.json中é…置平å°ã€‚' cache: 'ä¸å¾—在composer.json中é…置缓存属性。' task: setup_packages: title: '安装Contao应用' install_packages: title: '正在安装Composerä¾èµ–' update_packages: title: '包更新中' dump_autoload: title: '' clear_cache: title: '正在清ç†Composer缓存' rebuild_cache: title: 'Contao 缓存é‡å»ºä¸­' self_update: title: '' backup_create: title: '' backup_restore: title: '' taskoperation: self-update: detail: '从 {old} 更新到 {new}' success: '' install-uploads: summary: '' console: '已安装的artifact类型 for {package} (版本 {version}) [to packages/{name}]' remove-uploads: summary: '' remove-artifacts: summary: '' composer-install: retry: '' nothing: '' result: '' dump-autoload: result: '' cloud: queued: '' processing: '' error: '' finished: '' upload: error: file: '文件无效或者没有包å«composer.json。' json: 'composer.jsonæ²¡æœ‰åŒ…å«æœ‰æ•ˆçš„JSONæ•°æ®ã€‚' schema: 'composer.json schema验è¯å¤±è´¥ã€‚' partial: '上传文件未完æˆã€‚' error: writable: root: '' directory: '' config-file: '' detail: '' getDefinition()->addOption(new InputOption('disable-events', null, InputOption::VALUE_NONE, 'Disables the event dispatcher.')); } /** * Gets the Kernel associated with this Console. */ public function getKernel() : ApiKernel { return $this->kernel; } public function doRun(InputInterface $input, OutputInterface $output) : int { $this->registerCommands(); if ('self-update' !== $this->getCommandName($input) && !$input->hasParameterOption(['--disable-events'], \true)) { $this->setDispatcher($this->kernel->getContainer()->get('event_dispatcher')); } return (int) parent::doRun($input, $output); } protected function getDefaultCommands() : array { $commands = parent::getDefaultCommands(); $commands[] = (new Command('composer'))->setDescription('Run Composer within Contao Manager'); return $commands; } private function registerCommands() : void { if ($this->commandsRegistered) { return; } $this->commandsRegistered = \true; $this->kernel->boot(); $container = $this->kernel->getContainer(); $this->add($container->get(ProcessRunnerCommand::class)->setName('run')); $this->add($container->get(AboutCommand::class)); $this->add($container->get(IntegrityCheckCommand::class)); $this->add($container->get(TaskAbortCommand::class)); $this->add($container->get(TaskDeleteCommand::class)); $this->add($container->get(TaskUpdateCommand::class)); $this->add($container->get(UpdateCommand::class)); if ((!\Phar::running(\false) || $this->kernel->isDebug()) && $container->has('console.command_loader')) { $this->setCommandLoader($container->get('console.command_loader')); } } } CloudJob::STATUS_QUEUED, 'queuePosition' => $queuePosition, 'stats' => ['averageProcessingTimeInMs' => $avgTime * 1000, 'numberOfJobsInQueue' => $queuePosition, 'numberOfWorkers' => $workers]]); $this->assertSame($expected, $job->getWaitingTime()); } public static function waitingTime() : iterable { (yield [12, 30, 6, 60]); (yield [10, 10, 5, 20]); (yield [3, 25, 8, 9]); } } assertSame(1, $result); $this->assertSame($line, $matches[0]); $this->assertSame($datetime, $matches['datetime'], 'DateTime does not match'); $this->assertSame($channel, $matches['channel'], 'Channel does not match'); $this->assertSame($level, $matches['level'], 'Level does not match'); $this->assertSame($message, $matches['message'], 'Message does not match'); $this->assertSame($context, $matches['context'], 'Context does not match'); $this->assertSame($extra, $matches['extra'], 'Extra does not match'); } public static function logMessages() : iterable { (yield ['[2024-08-20T00:41:04.411801+02:00] request.INFO: Matched route "tl_page.32". {"route":"tl_page.32","route_parameters":{"_controller":"Contao\\FrontendIndex::renderPage","_scope":"frontend","_locale":"de","_format":"html","_canonical_route":"tl_page.32","pageModel":{"Contao\\PageModel":[]},"_route":"tl_page.32","_route_object":{"Contao\\CoreBundle\\Routing\\Page\\PageRoute":[]}}} []', '2024-08-20T00:41:04.411801+02:00', 'request', 'INFO', 'Matched route "tl_page.32".', '{"route":"tl_page.32","route_parameters":{"_controller":"Contao\\FrontendIndex::renderPage","_scope":"frontend","_locale":"de","_format":"html","_canonical_route":"tl_page.32","pageModel":{"Contao\\PageModel":[]},"_route":"tl_page.32","_route_object":{"Contao\\CoreBundle\\Routing\\Page\\PageRoute":[]}}}', '[]']); (yield ['[2024-08-20T00:00:05.476105+02:00] app.ERROR: Github\\Exception\\RuntimeException: Bad credentials in vendor/knplabs/github-api/lib/Github/HttpClient/Plugin/GithubExceptionThrower.php:137 Stack trace: #0 vendor/php-http/httplug/src/Promise/HttpFulfilledPromise.php(31): Github\\HttpClient\\Plugin\\GithubExceptionThrower->Github\\HttpClient\\Plugin\\{closure}(Object(Nyholm\\Psr7\\Response)) #1 vendor/knplabs/github-api/lib/Github/HttpClient/Plugin/GithubExceptionThrower.php(28): Http\\Client\\Promise\\HttpFulfilledPromise->then(Object(Closure)) #2 vendor/php-http/client-common/src/PluginChain.php(44): Github\\HttpClient\\Plugin\\GithubExceptionThrower->handleRequest(Object(Nyholm\\Psr7\\Request), Object(Closure), Object(Http\\Client\\Common\\PluginChain)) #3 vendor/php-http/client-common/src/PluginChain.php(59): Http\\Client\\Common\\PluginChain->Http\\Client\\Common\\{closure}(Object(Nyholm\\Psr7\\Request)) #4 vendor/php-http/client-common/src/PluginClient.php(87): Http\\Client\\Common\\PluginChain->__invoke(Object(Nyholm\\Psr7\\Request)) #5 vendor/php-http/client-common/src/HttpMethodsClient.php(148): Http\\Client\\Common\\PluginClient->sendRequest(Object(Nyholm\\Psr7\\Request)) #6 vendor/php-http/client-common/src/HttpMethodsClient.php(107): Http\\Client\\Common\\HttpMethodsClient->sendRequest(Object(Nyholm\\Psr7\\Request)) #7 vendor/php-http/client-common/src/HttpMethodsClient.php(55): Http\\Client\\Common\\HttpMethodsClient->send(\'GET\', \'...\', Array, NULL) #8 vendor/knplabs/github-api/lib/Github/Api/AbstractApi.php(92): Http\\Client\\Common\\HttpMethodsClient->get(\'...\', Array) #9 vendor/knplabs/github-api/lib/Github/Api/AcceptHeaderTrait.php(19): Github\\Api\\AbstractApi->get(\'...\', Array, Array) #10 vendor/knplabs/github-api/lib/Github/Api/Repo.php(150): Github\\Api\\Repo->get(\'...\') #11 src/Cron/GithubUpdater.php(34): Github\\Api\\Repo->show(\'foo\', \'core\') #12 src/Cron/GithubUpdater.php(24): App\\Cron\\GithubUpdater->addRepositoryData(Array) #13 vendor/contao/core-bundle/src/Cron/CronJob.php(44): App\\Cron\\GithubUpdater->__invoke(\'cli\') #14 vendor/contao/core-bundle/src/Cron/Cron.php(197): Contao\\CoreBundle\\Cron\\CronJob->__invoke(\'cli\') #15 vendor/contao/core-bundle/src/Cron/Cron.php(182): Contao\\CoreBundle\\Cron\\Cron->executeCrons(Array, \'cli\', Object(Closure)) #16 vendor/contao/core-bundle/src/Cron/Cron.php(97): Contao\\CoreBundle\\Cron\\Cron->doRun(Array, \'cli\', false) #17 vendor/contao/core-bundle/src/Command/CronCommand.php(53): Contao\\CoreBundle\\Cron\\Cron->run(\'cli\', false) #18 vendor/symfony/console/Command/Command.php(326): Contao\\CoreBundle\\Command\\CronCommand->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #19 vendor/symfony/console/Application.php(1096): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #20 vendor/symfony/framework-bundle/Console/Application.php(126): Symfony\\Component\\Console\\Application->doRunCommand(Object(Contao\\CoreBundle\\Command\\CronCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #21 vendor/symfony/console/Application.php(324): Symfony\\Bundle\\FrameworkBundle\\Console\\Application->doRunCommand(Object(Contao\\CoreBundle\\Command\\CronCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #22 vendor/symfony/framework-bundle/Console/Application.php(80): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #23 vendor/symfony/console/Application.php(175): Symfony\\Bundle\\FrameworkBundle\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #24 vendor/contao/manager-bundle/bin/contao-console(40): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput)) #25 vendor/bin/contao-console(119): include(\'...\') #26 {main} [] []', '2024-08-20T00:00:05.476105+02:00', 'app', 'ERROR', 'Github\\Exception\\RuntimeException: Bad credentials in vendor/knplabs/github-api/lib/Github/HttpClient/Plugin/GithubExceptionThrower.php:137 Stack trace: #0 vendor/php-http/httplug/src/Promise/HttpFulfilledPromise.php(31): Github\\HttpClient\\Plugin\\GithubExceptionThrower->Github\\HttpClient\\Plugin\\{closure}(Object(Nyholm\\Psr7\\Response)) #1 vendor/knplabs/github-api/lib/Github/HttpClient/Plugin/GithubExceptionThrower.php(28): Http\\Client\\Promise\\HttpFulfilledPromise->then(Object(Closure)) #2 vendor/php-http/client-common/src/PluginChain.php(44): Github\\HttpClient\\Plugin\\GithubExceptionThrower->handleRequest(Object(Nyholm\\Psr7\\Request), Object(Closure), Object(Http\\Client\\Common\\PluginChain)) #3 vendor/php-http/client-common/src/PluginChain.php(59): Http\\Client\\Common\\PluginChain->Http\\Client\\Common\\{closure}(Object(Nyholm\\Psr7\\Request)) #4 vendor/php-http/client-common/src/PluginClient.php(87): Http\\Client\\Common\\PluginChain->__invoke(Object(Nyholm\\Psr7\\Request)) #5 vendor/php-http/client-common/src/HttpMethodsClient.php(148): Http\\Client\\Common\\PluginClient->sendRequest(Object(Nyholm\\Psr7\\Request)) #6 vendor/php-http/client-common/src/HttpMethodsClient.php(107): Http\\Client\\Common\\HttpMethodsClient->sendRequest(Object(Nyholm\\Psr7\\Request)) #7 vendor/php-http/client-common/src/HttpMethodsClient.php(55): Http\\Client\\Common\\HttpMethodsClient->send(\'GET\', \'...\', Array, NULL) #8 vendor/knplabs/github-api/lib/Github/Api/AbstractApi.php(92): Http\\Client\\Common\\HttpMethodsClient->get(\'...\', Array) #9 vendor/knplabs/github-api/lib/Github/Api/AcceptHeaderTrait.php(19): Github\\Api\\AbstractApi->get(\'...\', Array, Array) #10 vendor/knplabs/github-api/lib/Github/Api/Repo.php(150): Github\\Api\\Repo->get(\'...\') #11 src/Cron/GithubUpdater.php(34): Github\\Api\\Repo->show(\'foo\', \'core\') #12 src/Cron/GithubUpdater.php(24): App\\Cron\\GithubUpdater->addRepositoryData(Array) #13 vendor/contao/core-bundle/src/Cron/CronJob.php(44): App\\Cron\\GithubUpdater->__invoke(\'cli\') #14 vendor/contao/core-bundle/src/Cron/Cron.php(197): Contao\\CoreBundle\\Cron\\CronJob->__invoke(\'cli\') #15 vendor/contao/core-bundle/src/Cron/Cron.php(182): Contao\\CoreBundle\\Cron\\Cron->executeCrons(Array, \'cli\', Object(Closure)) #16 vendor/contao/core-bundle/src/Cron/Cron.php(97): Contao\\CoreBundle\\Cron\\Cron->doRun(Array, \'cli\', false) #17 vendor/contao/core-bundle/src/Command/CronCommand.php(53): Contao\\CoreBundle\\Cron\\Cron->run(\'cli\', false) #18 vendor/symfony/console/Command/Command.php(326): Contao\\CoreBundle\\Command\\CronCommand->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #19 vendor/symfony/console/Application.php(1096): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #20 vendor/symfony/framework-bundle/Console/Application.php(126): Symfony\\Component\\Console\\Application->doRunCommand(Object(Contao\\CoreBundle\\Command\\CronCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #21 vendor/symfony/console/Application.php(324): Symfony\\Bundle\\FrameworkBundle\\Console\\Application->doRunCommand(Object(Contao\\CoreBundle\\Command\\CronCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #22 vendor/symfony/framework-bundle/Console/Application.php(80): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #23 vendor/symfony/console/Application.php(175): Symfony\\Bundle\\FrameworkBundle\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) #24 vendor/contao/manager-bundle/bin/contao-console(40): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput)) #25 vendor/bin/contao-console(119): include(\'...\') #26 {main}', '[]', '[]']); (yield ['[2024-08-20T06:22:09.276738+02:00] php.WARNING: Warning: Undefined array key "MSC" {"exception":"[object] (ErrorException(code: 0): Warning: Undefined array key \\"MSC\\" at vendor/contao/newsletter-bundle/contao/modules/ModuleSubscribe.php:95)"} {"request_uri":"https://www.example.org/","request_method":"GET"}', '2024-08-20T06:22:09.276738+02:00', 'php', 'WARNING', 'Warning: Undefined array key "MSC"', '{"exception":"[object] (ErrorException(code: 0): Warning: Undefined array key \\"MSC\\" at vendor/contao/newsletter-bundle/contao/modules/ModuleSubscribe.php:95)"}', '{"request_uri":"https://www.example.org/","request_method":"GET"}']); (yield 'Insert tag in log message' => ['[2024-08-20T00:41:04.809596+02:00] contao.error.ERROR: Unknown insert tag {{foo::bar}} on page https://www.example.org/ [] {"request_uri":"https://www.example.org/","request_method":"GET","contao":{"Contao\\CoreBundle\\Monolog\\ContaoContext":"{\\"func\\":\\"Contao\\\\InsertTags::executeReplace\\",\\"action\\":\\"ERROR\\",\\"username\\":\\"N\\/A\\",\\"browser\\":\\"Mozilla\\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\\/537.36 (KHTML, like Gecko) Chrome\\/120.0.0.0 Safari\\/537.36\\",\\"uri\\":\\"https:\\/\\/www.example.org\\/\\",\\"pageId\\":32}"}}', '2024-08-20T00:41:04.809596+02:00', 'contao.error', 'ERROR', 'Unknown insert tag {{foo::bar}} on page https://www.example.org/', '[]', '{"request_uri":"https://www.example.org/","request_method":"GET","contao":{"Contao\\CoreBundle\\Monolog\\ContaoContext":"{\\"func\\":\\"Contao\\\\InsertTags::executeReplace\\",\\"action\\":\\"ERROR\\",\\"username\\":\\"N\\/A\\",\\"browser\\":\\"Mozilla\\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\\/537.36 (KHTML, like Gecko) Chrome\\/120.0.0.0 Safari\\/537.36\\",\\"uri\\":\\"https:\\/\\/www.example.org\\/\\",\\"pageId\\":32}"}}']); } } attributes->get('file'), self::ALLOWED_FILES, \true)) { return new ApiProblemResponse((new ApiProblem())->setStatus(Response::HTTP_FORBIDDEN)); } $file = $this->kernel->getProjectDir() . '/' . $request->attributes->get('file'); if ($request->isMethod('PUT')) { $this->filesystem->dumpFile($file, $request->getContent()); } elseif (!$this->filesystem->exists($file)) { return new Response('', Response::HTTP_NO_CONTENT); } return new Response(\file_get_contents($file)); } } security->isGranted('ROLE_ADMIN')) { $username = $this->security->getUser()?->getUserIdentifier(); $user = $this->config->getUser($username); return $this->getUserResponse([$user]); } return $this->getUserResponse($this->config->getUsers()); } /** * Adds a new user to the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users', methods: ['POST'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_ADMIN')] public function createUser(Request $request) : Response { $user = $this->createUserFromRequest($request); if ($this->config->hasUser($user->getUserIdentifier())) { throw new BadRequestHttpException(\sprintf('User "%s" already exists.', $user->getUserIdentifier())); } $this->config->addUser($user); return $this->getUserResponse($user, Response::HTTP_CREATED, \true); } /** * Returns user data from the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}', name: 'user_get', methods: ['GET'])] public function retrieveUser(string $username) : Response { $this->denyAccessUnlessUserOrAdmin($username); $user = $this->config->getUser($username); if (null === $user) { throw new NotFoundHttpException(\sprintf('User "%s" was not found.', $username)); } return $this->getUserResponse($user); } /** * Replaces user data in the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}', methods: ['PUT'])] public function replaceUser(string $username, Request $request) : Response { $this->denyAccessUnlessUserOrAdmin($username); $user = $this->createUserFromRequest($request); if (!$this->config->hasUser($user->getUserIdentifier())) { throw new NotFoundHttpException(\sprintf('User "%s" does not exist.', $user->getUserIdentifier())); } $this->config->replaceUser($user); return $this->getUserResponse($user, Response::HTTP_OK, \true); } /** * Deletes a user from the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}', methods: ['DELETE'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_ADMIN')] public function deleteUser(string $username) : Response { $user = $this->config->getUser($username); if (null === $user) { throw new NotFoundHttpException(\sprintf('User "%s" was not found.', $username)); } $this->config->deleteUser($username); return $this->getUserResponse($user); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/password', methods: ['PUT'])] public function setPassword(string $username, Request $request) : Response { $this->denyAccessUnlessUser($username); $user = $this->config->getUser($username); if (null === $user) { throw new NotFoundHttpException(\sprintf('User "%s" does not exist.', $username)); } if ($user->getPasskey()) { throw new ServiceUnavailableHttpException('Cannot change password of a user with a Passkey.'); } $currentPassword = $request->request->get('current_password'); $newPassword = $request->request->get('new_password'); if (!$currentPassword || !$newPassword) { throw new BadRequestHttpException('Invalid payload.'); } $isPasswordValid = $this->passwordHasherFactory->getPasswordHasher($user)->verify($user->getPassword(), $currentPassword); if (!$isPasswordValid) { throw new UnprocessableEntityHttpException('Current password is not valid.'); } $this->config->updateUser($username, ['password' => $newPassword]); return new JsonResponse(); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/totp', methods: ['GET'])] public function getTOTP(string $username) : Response { $this->denyAccessUnlessUser($username); $user = $this->config->getUser($username); if (null === $user) { throw new NotFoundHttpException(\sprintf('User "%s" does not exist.', $username)); } if ($user->getPasskey()) { throw new ServiceUnavailableHttpException('Cannot configure TOTP of a user with a Passkey.'); } if (null !== $user->getTotpSecret()) { throw new BadRequestException('TOTP already configured.'); } $totp = TOTP::generate(); $totp->setLabel($username); return new JsonResponse(['provisioning_uri' => $totp->getProvisioningUri()]); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/totp', methods: ['PUT'])] public function setupTotp(string $username, Request $request) : Response { $this->denyAccessUnlessUser($username); $user = $this->config->getUser($username); if (null === $user) { throw new NotFoundHttpException(\sprintf('User "%s" does not exist.', $username)); } if ($user->getPasskey()) { throw new ServiceUnavailableHttpException('Cannot configure TOTP of a user with a Passkey.'); } if (null !== $user->getTotpSecret()) { throw new AccessDeniedException('TOTP already configured.'); } try { $totp = Factory::loadFromProvisioningUri($request->request->get('provisioning_uri')); } catch (\Exception) { throw new BadRequestHttpException('Invalid provisioning_uri'); } if (!$totp instanceof TOTP) { throw new BadRequestHttpException('Invalid provisioning_uri'); } if (!$totp->verify($request->request->get('totp'))) { throw new UnprocessableEntityHttpException('Invalid TOTP'); } $this->config->updateUser($username, ['totp_secret' => $totp->getSecret()]); return new JsonResponse(null, Response::HTTP_CREATED); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/totp', methods: ['DELETE'])] public function deleteTotp(string $username, Request $request) : Response { $this->denyAccessUnlessUser($username); $user = $this->config->getUser($username); if (null === $user) { throw new NotFoundHttpException(\sprintf('User "%s" does not exist.', $username)); } if ($user->getPasskey()) { throw new ServiceUnavailableHttpException('Cannot configure TOTP of a user with a Passkey.'); } if (null === $user->getTotpSecret()) { throw new NotFoundHttpException('TOTP not configured.'); } try { $totp = TOTP::createFromSecret($user->getTotpSecret()); } catch (\Exception) { throw new \RuntimeException('TOTP error.'); } if (!$totp->verify($request->request->getString('totp'))) { throw new UnprocessableEntityHttpException('Invalid TOTP'); } $this->config->updateUser($username, ['totp_secret' => null]); return new JsonResponse(); } /** * Returns a list of tokens of a user in the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/tokens', methods: ['GET'])] public function listTokens(string $username) : Response { $this->denyAccessUnlessUserOrAdmin($username); $tokens = \array_filter($this->config->getTokens(), static fn($token): bool => ($token['username'] ?? null) === $username); return new JsonResponse($tokens); } /** * Adds a new token for a user to the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/tokens', methods: ['POST'])] public function createToken(string $username, Request $request) : Response { $this->denyAccessUnlessUserOrAdmin($username); if (!$this->config->hasUser($username)) { throw new BadRequestHttpException(\sprintf('User "%s" does not exists.', $username)); } $clientId = $request->request->get('client_id'); $scope = $request->request->get('scope'); $oneTimeToken = 'one-time' === $request->request->get('grant_type'); if (!$clientId || !$scope) { throw new BadRequestHttpException('Invalid payload for OAuth token.'); } $this->denyAccessUnlessGranted('ROLE_' . \strtoupper($scope)); $token = $this->config->createToken($username, $clientId, $scope, $oneTimeToken); if ($oneTimeToken) { $token['url'] = $request->getUriForPath('/#?token=' . $token['token']); } return new JsonResponse($token, Response::HTTP_CREATED); } /** * Returns token data of a user from the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/tokens/{id}', methods: ['GET'])] public function retrieveToken(string $username, string $id) : Response { $this->denyAccessUnlessUserOrAdmin($username); $payload = $this->config->getToken($id); if (null === $payload || $payload['username'] !== $username) { throw new NotFoundHttpException(\sprintf('Token with ID "%s" was not found.', $id)); } return new JsonResponse($payload); } /** * Deletes a token from the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/users/{username}/tokens/{id}', methods: ['DELETE'])] public function deleteToken(string $username, string $id) : Response { $this->denyAccessUnlessUserOrAdmin($username); $payload = $this->config->getToken($id); if (null === $payload || $payload['username'] !== $username) { throw new NotFoundHttpException(\sprintf('Token "%s" was not found.', $id)); } $this->config->deleteToken($id); return new JsonResponse($payload); } /** * Adds an invitation to the configuration file. */ #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/invitations', methods: ['POST'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_ADMIN')] public function inviteUser(Request $request) : Response { $token = $this->config->createInvitation($request->request->get('scope')); $token['url'] = $request->getUriForPath('/#?invitation=' . $token['token']); return new JsonResponse($token, Response::HTTP_CREATED); } /** * Creates a response for given user information. * * @param User|array $user */ private function getUserResponse(User|array $user, int $status = Response::HTTP_OK, bool $addLocation = \false) : Response { $response = new JsonResponse($this->convertToJson($user), $status); if ($addLocation && $user instanceof User) { $response->headers->set('Location', $this->urlGenerator->generate('user_get', ['username' => $user->getUserIdentifier()])); } return $response; } /** * Converts a user to JSON representation. * * @param array|User $user */ private function convertToJson(User|array $user) : array { if ($user instanceof User) { $json = ['username' => $user->getUserIdentifier(), 'scope' => $user->getScope(), 'passkey' => $user->getPasskey()]; if ($user->getPasskey()) { $json['passkey'] = \true; } else { $json['totp_enabled'] = (bool) $user->getTotpSecret(); } return $json; } foreach ($user as $k => $item) { $user[$k] = $this->convertToJson($item); } return $user; } /** * Creates and returns a new user from request data. * * @throws BadRequestHttpException */ private function createUserFromRequest(Request $request) : User { $username = $request->request->get('username', ''); $password = $request->request->get('password', ''); $scope = $request->request->get('scope'); if ('' === $username || \strlen($password) < 8) { throw new BadRequestHttpException('Username or password invalid.'); } if (!\in_array($scope, User::SCOPES, \true)) { throw new BadRequestHttpException('Only the following "scope" is required: ' . \implode(', ', User::SCOPES)); } return $this->config->createUser($username, $password, $scope); } private function denyAccessUnlessUser(string $username, string $message = 'Access Denied.') : void { if ($username !== $this->security->getUser()?->getUserIdentifier()) { throw new AccessDeniedException($message); } } private function denyAccessUnlessUserOrAdmin(string $username, string $message = 'Access Denied.') : void { if ($username !== $this->security->getUser()?->getUserIdentifier()) { $this->denyAccessUnlessGranted('ROLE_ADMIN', null, $message); } } private function denyAccessUnlessGranted(mixed $attribute, mixed $subject = null, string $message = 'Access Denied.') : void { if (!$this->security->isGranted($attribute, $subject)) { $exception = new AccessDeniedException($message); $exception->setAttributes([$attribute]); $exception->setSubject($subject); throw $exception; } } } \\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+.*)\\] (?[\\w-]+(?:\\.[\\w-]+)?)\\.(?\\w+): (?.+)(?: (?(?:\\[.*?\\]|\\{.*?\\})))(?: (?(?:\\[.*\\]|\\{.*\\})))\\s{0,2}$/'; public function __construct(private readonly ApiKernel $kernel, private readonly Filesystem $filesystem) { } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/logs', methods: ['GET'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_READ')] public function listFiles() : Response { if (!$this->filesystem->exists($this->kernel->getProjectDir() . '/var/logs')) { return new JsonResponse([]); } /** @var Finder $finder */ $finder = Finder::create()->depth(0)->files()->ignoreDotFiles(\true)->name('*.log')->sortByName(\true)->in($this->kernel->getProjectDir() . '/var/logs'); $files = []; foreach ($finder as $file) { $files[] = ['name' => $this->getFilenameWithoutExtension($file), 'mtime' => \DateTime::createFromFormat('U', (string) $file->getMTime())->format(\DateTime::ATOM), 'size' => $file->getSize(), 'lines' => $this->countLines(new \SplFileObject((string) $file))]; } // Reverse files order to sort by date descending return new JsonResponse(\array_reverse($files)); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/logs/{filename}', methods: ['GET'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_READ')] public function retrieveFile(string $filename, Request $request) : Response { $file = $this->getFile($filename); if ('json' === $request->getPreferredFormat()) { return $this->parseJson($file, $request); } $response = new BinaryFileResponse($file); $response->headers->set('Content-Type', 'text/plain'); return $response; } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/logs/{filename}', methods: ['DELETE'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_ADMIN')] public function deleteFile(string $filename) : Response { $file = $this->getFile($filename); $this->filesystem->remove($file->getPathname()); return new Response('', Response::HTTP_NO_CONTENT); } /** * Gets absolute path for filename and checks for security and if file exists. */ private function getFile(string $filename) : \SplFileObject { if (\str_contains($filename, '/')) { throw new BadRequestHttpException(\sprintf('"%s" is not a valid file name.', $filename)); } $path = $this->kernel->getProjectDir() . '/var/logs/' . $filename . '.log'; if (!\is_file($path)) { throw new NotFoundHttpException(\sprintf('Log file "%s" does not exist.', $filename)); } return new \SplFileObject($path); } private function parseJson(\SplFileObject $file, Request $request) : JsonResponse { $file->setFlags(\SplFileObject::DROP_NEW_LINE); $content = []; $skipLastLine = \false; $total = $this->countLines($file, $skipLastLine); $limit = $request->query->getInt('limit', $total); $offset = $request->query->getInt('offset'); $channels = $request->query->has('channels') ? \explode(',', $request->query->get('channel')) : null; $levels = $request->query->has('levels') ? \explode(',', $request->query->get('levels')) : null; if ($offset) { $file->seek($offset); } while (!$file->eof() && $limit > 0) { if ($skipLastLine && $file->key() === $total) { break; } if (null !== ($line = $this->parseJsonLine($file->fgets(), $channels, $levels))) { $content[] = $line; } --$limit; } return new JsonResponse(['name' => $this->getFilenameWithoutExtension($file), 'mtime' => \DateTime::createFromFormat('U', (string) $file->getMTime())->format(\DateTime::ATOM), 'size' => $file->getSize(), 'lines' => $total, 'content' => $content]); } private function parseJsonLine(string $line, array|null $channels = null, array|null $levels = null) : array|string|null { if (!\preg_match(self::MONOLOG_PATTERN, $line, $matches)) { return $line; } if ($channels && !\in_array($matches['channel'], $channels, \true)) { return null; } if ($levels && !\in_array($matches['level'], $levels, \true)) { return null; } $matches['context'] = \json_decode(\trim($matches['context']), \true); $matches['extra'] = \json_decode(\trim($matches['extra']), \true); return \array_intersect_key($matches, \array_flip(['datetime', 'channel', 'level', 'message', 'context', 'extra'])); } private function countLines(\SplFileObject $file, bool &$skipLastLine = \false) : int { $skipLastLine = \false; $file->seek(\PHP_INT_MAX); $lines = $file->key() + 1; $file->seek($file->key()); if (empty($file->current())) { $skipLastLine = \true; --$lines; } $file->rewind(); return $lines; } /** * We use the file name without extension as REST object name, because some * hosters block *.log files for security reasons. * * @param SplFileInfo|\SplFileObject $file */ private function getFilenameWithoutExtension($file) : string { return \pathinfo($file->getFilename(), \PATHINFO_FILENAME); } } config instanceof AuthConfig || !$request->request->has('token')) { throw new BadRequestHttpException('GitHub token could not be stored.'); } $this->config->setGithubToken($request->request->get('token')); return new JsonResponse($this->config->get('github-oauth')); } } getMethod()) { 'PUT' => $this->config->replace($request->request->all()), 'PATCH' => $this->config->add($request->request->all()), default => new JsonResponse($this->config->all()), }; return new JsonResponse($this->config->all()); } } getMethod()) { 'GET' => $this->getTask(), 'PUT' => $this->putTask($request), 'PATCH' => $this->patchTask($request), 'DELETE' => $this->deleteTask(), default => new Response('', Response::HTTP_METHOD_NOT_ALLOWED), }; } private function getTask() : Response { return $this->getResponse($this->taskManager->updateTask()); } private function putTask(Request $request) : Response { if ($this->taskManager->hasTask()) { throw new BadRequestHttpException('A task is already active'); } $name = $request->request->get('name'); $config = $request->request->all('config'); if (empty($name) || !\is_array($config)) { throw new BadRequestHttpException('Invalid task data'); } return $this->getResponse($this->taskManager->createTask($name, $config)); } private function patchTask(Request $request) : Response { if (!$this->taskManager->hasTask()) { throw new BadRequestHttpException('No active task found.'); } if (TaskStatus::STATUS_ABORTING === $request->request->get('status')) { return $this->getResponse($this->taskManager->abortTask()); } if (TaskStatus::STATUS_ACTIVE === $request->request->get('status')) { return $this->getResponse($this->taskManager->updateTask(\true)); } throw new BadRequestHttpException('Unsupported task status'); } private function deleteTask() : Response { if (!$this->taskManager->hasTask()) { return $this->getResponse(); } try { return $this->getResponse($this->taskManager->deleteTask()); } catch (\RuntimeException $e) { return new ApiProblemResponse((new ApiProblem($e->getMessage()))->setStatus(Response::HTTP_FORBIDDEN)); } } private function getResponse(TaskStatus|null $status = null) : Response { if (!$status instanceof TaskStatus) { return new Response('', Response::HTTP_NO_CONTENT); } $json = $status->jsonSerialize(); try { return new JsonResponse($json); } catch (\InvalidArgumentException) { $json['console'] = \utf8_encode((string) $json['console']); foreach ($json['operations'] as &$operation) { try { new JsonResponse($operation); } catch (\InvalidArgumentException) { $operation['console'] = \utf8_encode((string) $operation['console']); } } return new JsonResponse($json); } } } \PHP_VERSION, 'version_id' => \PHP_VERSION_ID, 'platform' => $serverInfo->getPlatform(), 'problem' => $this->runIntegrityChecks()]); } /** * Checks system integrity and returns problem if found. */ private function runIntegrityChecks() : array|null { $problem = $this->integrity->runWebChecks(); if ($problem instanceof ApiProblem) { return $problem->asArray(); } return null; } } getPhpExecutable()) { return new ApiProblemResponse((new ApiProblem('Missing hosting configuration.', '/api/server/config'))->setStatus(Response::HTTP_SERVICE_UNAVAILABLE)); } try { $contaoVersion = $this->getContaoVersion(); } catch (\RuntimeException $e) { if ($request->isMethod('POST')) { return new Response('', Response::HTTP_BAD_REQUEST); } if ($e instanceof ProcessFailedException) { return $this->createResponse(['supported' => \false, 'error' => $e->getMessage()], Response::HTTP_BAD_GATEWAY); } if ($e instanceof ProcessOutputException) { return $this->createResponse(['supported' => \false, 'error' => $e->getProcess()->getErrorOutput() ?: $e->getProcess()->getOutput()], Response::HTTP_BAD_GATEWAY); } $contaoVersion = null; } if (null === $contaoVersion) { $files = $this->getProjectFiles(); if ($request->isMethod('POST')) { return $this->createDirectories($request->request->get('directory'), $request->request->getBoolean('usePublicDir')); } return $this->createResponse(['conflicts' => $files]); } return $this->createResponse(['version' => $contaoVersion, 'cli' => ['commands' => (object) $this->contaoConsole->getCommandList()], 'api' => ['version' => $this->contaoApi->getVersion(), 'features' => $this->contaoApi->getFeatures(), 'commands' => $this->contaoApi->getCommands()], 'config' => (object) $this->contaoConsole->getConfig(), 'supported' => \version_compare($contaoVersion, '4.0.0', '>=') || \str_starts_with($contaoVersion, 'dev-')]); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/server/contao', methods: ['POST'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_INSTALL')] public function update(Request $request, ServerInfo $serverInfo) : Response { return $this->handle($request, $serverInfo); } private function createDirectories(string|null $directory, bool $usePublicDir) : Response { if (!ApiKernel::isPhar()) { return new Response('', Response::HTTP_SERVICE_UNAVAILABLE); } $currentRoot = $this->kernel->getProjectDir(); $targetRoot = $currentRoot; $publicDir = $currentRoot . '/' . ($usePublicDir ? 'public' : 'web'); if (null !== $directory) { if (\str_contains($directory, '..')) { return new Response('', Response::HTTP_BAD_REQUEST); } if ($this->filesystem->exists($currentRoot . '/' . $directory)) { return new ApiProblemResponse((new ApiProblem('Target directory exists'))->setStatus(Response::HTTP_FORBIDDEN)); } $targetRoot = $currentRoot . '/' . $directory; $publicDir = $targetRoot . '/' . ($usePublicDir ? 'public' : 'web'); $this->filesystem->mkdir($targetRoot); $this->filesystem->mirror($this->kernel->getConfigDir(), $targetRoot . '/contao-manager'); $this->filesystem->remove($this->kernel->getConfigDir()); } $this->filesystem->mkdir($publicDir); // Create response before moving Phar, otherwise the JsonResponse class // cannot be autoloaded $response = $this->createResponse(['project_dir' => $targetRoot, 'public_dir' => $usePublicDir ? 'public' : 'web', 'conflicts' => []], Response::HTTP_CREATED); $phar = \Phar::running(\false); $this->filesystem->rename($phar, $publicDir . '/' . \basename($phar)); if ($this->filesystem->exists(\dirname($phar) . '/.htaccess')) { $this->filesystem->rename(\dirname($phar) . '/.htaccess', $publicDir . '/.htaccess'); } if ([] === \array_diff(\scandir(\dirname($phar), \SCANDIR_SORT_NONE), ['.', '..'])) { $this->filesystem->remove(\dirname($phar)); } return $response; } /** * Gets a list of files in the project root directory, excluding what is allowed * to install Contao. */ private function getProjectFiles() : array { $content = \scandir($this->kernel->getProjectDir()); if (\false === $content) { return []; } return \array_values(\array_diff($content, [ '.', '..', '.env', '.env.local', '.git', '.idea', '.ddev', '.well-known', 'cgi-bin', 'contao-manager', 'plesk-stat', 'public', 'web', '.bash_profile', '.bash_logout', '.bashrc', '.DS_Store', '.ftpquota', '.htaccess', 'user.ini', \basename(\dirname(\Phar::running())), // Allow parent directory of the PHAR file (public dir) \basename(\Phar::running()), ])); } /** * Tries to detect the Contao 4/3/2 version by analyzing the filesystem. */ private function getContaoVersion() : string|null { if ($this->filesystem->exists($this->processFactory->getContaoConsolePath())) { return $this->contaoConsole->getVersion(); } // Required for Contao 2.11 \define('_ContaoManager\\TL_ROOT', $this->kernel->getProjectDir()); $files = [$this->kernel->getProjectDir() . '/system/constants.php', $this->kernel->getProjectDir() . '/system/config/constants.php']; // Test if the Phar was placed in the Contao 2/3 root if ('' !== ($phar = \Phar::running(\false))) { $files[] = \dirname($phar) . '/system/constants.php'; $files[] = \dirname($phar) . '/system/config/constants.php'; } $this->logger->info('Searching for Contao 2/3', ['files' => $files]); foreach ($files as $file) { if ($this->filesystem->exists($file)) { try { @(include $file); } catch (\Throwable) { // do nothing on error or exception } if (\defined('_ContaoManager\\VERSION') && \defined('_ContaoManager\\BUILD')) { /** @noinspection PhpUndefinedConstantInspection */ return VERSION . '.' . BUILD; } break; } } return null; } private function createResponse(array $data, int $status = Response::HTTP_OK) : JsonResponse { return new JsonResponse(\array_merge(['version' => null, 'cli' => ['commands' => []], 'api' => ['version' => 0, 'features' => [], 'commands' => []], 'config' => new \stdClass(), 'supported' => \false, 'conflicts' => [], 'project_dir' => $this->kernel->getProjectDir(), 'public_dir' => \basename($this->kernel->getPublicDir()), 'directory_separator' => \DIRECTORY_SEPARATOR], $data), $status); } } getPhpExecutable()) { return new ApiProblemResponse((new ApiProblem('Missing hosting configuration.', '/api/server/config'))->setStatus(Response::HTTP_SERVICE_UNAVAILABLE)); } $commands = $this->contaoConsole->getCommandList(); $features = $this->contaoApi->getFeatures(); if (!isset($commands['contao:migrate']['options'], $features['contao/manager-bundle']['dot-env']) || !\in_array('format', $commands['contao:migrate']['options'], \true) || !\in_array('dry-run', $commands['contao:migrate']['options'], \true) || !\in_array('hash', $commands['contao:migrate']['options'], \true) || !\in_array('DATABASE_URL', $features['contao/manager-bundle']['dot-env'], \true)) { return new ApiProblemResponse((new ApiProblem('Contao console does not support the necessary contao:migrate command/arguments or CLI API features.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } if ($request->isMethod('POST')) { $url = $request->request->get('url'); if (empty($url) || !\preg_match('{' . self::URL_PATTERN . '}i', $url)) { return new ApiProblemResponse((new ApiProblem('Invalid URL'))->setStatus(Response::HTTP_BAD_REQUEST)); } $this->contaoApi->runCommand(['dot-env:set', 'DATABASE_URL', $url]); } else { $url = $this->contaoApi->runCommand(['dot-env:get', 'DATABASE_URL']); } return new JsonResponse(['url' => $url, 'pattern' => self::URL_PATTERN, 'status' => $this->contaoConsole->checkDatabaseMigrations()]); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/server/database', methods: ['POST'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_INSTALL')] public function write(Request $request, ServerInfo $serverInfo) : Response { return $this->handle($request, $serverInfo); } } getPhpExecutable()) { return new ApiProblemResponse((new ApiProblem('Missing hosting configuration.', '/api/server/config'))->setStatus(Response::HTTP_SERVICE_UNAVAILABLE)); } $commands = $this->contaoConsole->getCommandList(); if (!isset($commands['contao:user:list']['options'], $commands['contao:user:create']['options']) || !\in_array('format', $commands['contao:user:list']['options'], \true) || !\in_array('column', $commands['contao:user:list']['options'], \true)) { return new ApiProblemResponse((new ApiProblem('Contao console does not support the necessary contao:user:list and/or contao:user:create commands/options.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } if ($request->isMethod('POST')) { if ($this->hasAdminUser()) { return new ApiProblemResponse((new ApiProblem('An admin user already exists.'))->setStatus(Response::HTTP_METHOD_NOT_ALLOWED)); } try { $this->contaoConsole->createBackendUser(['username' => $request->request->get('username'), 'name' => $request->request->get('name'), 'email' => $request->request->get('email'), 'language' => $request->getPreferredLanguage()], $request->request->get('password')); return $this->getUserResponse(Response::HTTP_CREATED); } catch (ProcessFailedException $exception) { $problem = new ApiProblem('Unable to create back end account.'); $problem->setStatus(Response::HTTP_INTERNAL_SERVER_ERROR); $problem['debug'] = $exception->getProcess()->getOutput() . $exception->getProcess()->getErrorOutput(); return new ApiProblemResponse($problem); } } return $this->getUserResponse(); } private function getUserResponse(int $status = Response::HTTP_OK) : JsonResponse { return new JsonResponse(['hasUser' => $this->hasAdminUser(\true)], $status); } private function hasAdminUser(bool $throw = \false) : bool { $users = $this->contaoConsole->getUsers($throw); foreach ($users as $user) { if ($user['admin']) { return \true; } } return \false; } } $opcacheEnabled, 'reset_token' => \md5(\Phar::running(\false))]; return new JsonResponse($status); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/server/opcache', methods: ['DELETE'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_UPDATE')] public function deleteOpcache() : Response { if (!\function_exists('opcache_reset')) { return new JsonResponse(null, Response::HTTP_NOT_IMPLEMENTED); } \opcache_reset(); return $this->getOpcache(); } } (string) $this->serverInfo->getPhpExecutable(), 'cloud' => $this->getCloudConfig()]); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/server/config', methods: ['PUT'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_INSTALL')] public function setConfig(Request $request) : Response { $phpCli = $request->request->get('php_cli'); if (null !== ($error = $this->validatePhpCli($phpCli))) { $problem = (new ApiProblem('Bad Request'))->setStatus(400); $problem->setDetail($error); return new ApiProblemResponse($problem); } $this->config->set('php_cli', $phpCli); if ($request->request->getBoolean('cloud', \true)) { $this->config->remove('disable_cloud'); } else { $this->config->set('disable_cloud', \true); } return $this->getConfig(); } private function validatePhpCli(string $phpCli) : string|null { try { $info = $this->serverInfo->getPhpExecutableFinder()->getServerInfo($phpCli); } catch (RuntimeException $e) { return $this->translator->trans('config.php_cli.error') . "\n\n" . $e->getMessage(); } if (null === $info) { return $this->translator->trans('config.php_cli.not_found'); } $vWeb = \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION; $vCli = \vsprintf('%s.%s', \explode('.', (string) $info['version'])); if (\version_compare($vWeb, $vCli, '<>')) { return $this->translator->trans('config.php_cli.incompatible', ['cli' => $vCli, 'web' => $vWeb]); } return null; } private function getCloudConfig() : array { $issues = $this->checkCloudIssues(); return ['enabled' => !$this->config->get('disable_cloud', \false), 'issues' => $issues]; } private function checkCloudIssues() : array { $json = new JsonFile($this->environment->getJsonFile()); if (!$json->exists()) { return []; } try { $data = $json->read(); } catch (\RuntimeException $e) { return [$e->getMessage()]; } $issues = []; if (isset($data['config']['platform'])) { $issues[] = $this->translator->trans('config.cloud.platform'); } if (isset($data['config']['cache-dir']) || isset($data['config']['cache-files-dir']) || isset($data['config']['cache-repo-dir']) || isset($data['config']['cache-vcs-dir']) || isset($data['config']['cache-files-ttl']) || isset($data['config']['cache-files-maxsize'])) { $issues[] = $this->translator->trans('config.cloud.cache'); } return \array_unique($issues); } } getPhpExecutable()) { return new ApiProblemResponse((new ApiProblem('Missing hosting configuration.', '/api/server/config'))->setStatus(Response::HTTP_SERVICE_UNAVAILABLE)); } $result = ['json' => ['found' => \false, 'valid' => \false, 'error' => null], 'lock' => ['found' => \false, 'fresh' => \false], 'vendor' => ['found' => \false]]; if ($this->filesystem->exists($this->environment->getJsonFile())) { $result['json']['found'] = \true; $result['json']['valid'] = \true; $result['vendor']['found'] = \is_dir($this->environment->getVendorDir()); if ($this->validateSchema($result)) { // If schema is valid but does not contain contao/manager-bundle, mark as "not // found" so the install screen will conflict with the file. try { $json = $this->environment->getComposerJson(); if (!isset($json['require']['contao/manager-bundle'])) { $result['json']['found'] = \false; $result['json']['valid'] = \false; } else { $this->validateLockFile($result); } } catch (\Exception $exception) { $result['json']['valid'] = \false; $result['json']['error'] = $this->translator->trans('boot.composer.invalid', ['exception' => $exception->getMessage()]); } } } return new JsonResponse($result); } private function validateSchema(array &$result) : bool { try { $schemaFile = __DIR__ . '/../../../vendor/composer/composer/res/composer-schema.json'; // Prepend with file:// only when not using a special schema already (e.g. in the phar) if (!\str_contains($schemaFile, '://')) { $schemaFile = 'file://' . $schemaFile; } $schema = (object) ['$ref' => $schemaFile]; $schema->required = []; $value = \json_decode(\file_get_contents($this->environment->getJsonFile()), \false); $validator = new Validator(); $validator->validate($value, $schema, Constraint::CHECK_MODE_EXCEPTIONS); return \true; } catch (ValidationException $exception) { $result['json']['valid'] = \false; $result['json']['error'] = $this->translator->trans('boot.composer.invalid', ['exception' => $exception->getMessage()]); return \false; } } private function validateLockFile(array &$result) : void { try { $locker = $this->environment->getComposer()->getLocker(); if ($locker->isLocked()) { $result['lock']['found'] = \true; if ($locker->isFresh()) { $result['lock']['fresh'] = \true; } } } catch (ParsingException $e) { $result['json']['valid'] = \false; $result['json']['error'] = $this->translator->trans('boot.composer.invalid', ['exception' => $e->getMessage() . ' ' . $e->getDetails()['text']]); } catch (\Exception $e) { $result['json']['valid'] = \false; $result['json']['error'] = $this->translator->trans('boot.composer.invalid', ['exception' => $e->getMessage()]); } } } getPhpExecutable()) { return new ApiProblemResponse((new ApiProblem('Missing hosting configuration.', '/api/server/config'))->setStatus(Response::HTTP_SERVICE_UNAVAILABLE)); } return new JsonResponse($this->runIntegrityChecks($processFactory)); } private function runIntegrityChecks(ConsoleProcessFactory $processFactory) : array { $process = $processFactory->createManagerConsoleProcess(['integrity-check', '--format=json']); $process->run(); $output = $process->getOutput(); $result = \json_decode($output, \true); if (!\is_array($result)) { return ['version' => \PHP_VERSION, 'version_id' => \PHP_VERSION_ID, 'problem' => ['title' => 'Received invalid JSON output from the command line', 'type' => 'https://php.net/json_decode', 'detail' => $output]]; } return $result; } } canUpdate()) { return new ApiProblemResponse((new ApiProblem('This version cannot be updated.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } try { $error = null; $supportsUpdate = $updater->supportsUpdate(); $latestVersion = $updater->getNewVersion(); } catch (\Throwable $throwable) { $error = $throwable->getMessage(); $supportsUpdate = \true; $latestVersion = $updater->getOldVersion(); } return new JsonResponse(['current_version' => $updater->getOldVersion(), 'latest_version' => $latestVersion, 'channel' => $updater->getChannel(), 'supported' => $supportsUpdate, 'error' => $error]); } } getMethod()) { case 'GET': return $this->getStatus(); case 'POST': if (LoginAuthenticator::isLocked($this->kernel->getConfigDir())) { return new ApiProblemResponse((new ApiProblem())->setStatus(Response::HTTP_FORBIDDEN)); } // Login should have been handled by the firewall return new Response('Bad Request', Response::HTTP_BAD_REQUEST); case 'DELETE': return $this->handleLogout($request); } return new Response(null, Response::HTTP_METHOD_NOT_ALLOWED); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/session/options', methods: ['GET', 'POST'])] public function getWebauthnOptions(Request $request) : Response { $username = $request->isMethod('POST') ? $request->request->get('username') : null; return new JsonResponse($this->webauthn->getCredentialOptions($request->getHost(), $username), json: \true); } /** * Returns the login status of the user. */ private function getStatus() : Response { if ($this->security->isGranted('ROLE_USER')) { $token = $this->security->getToken(); if (null !== $token && TokenAuthenticator::class === $token->getAttribute('authenticator') && null !== ($payload = $this->config->getToken($token->getAttribute('token_id')))) { return new JsonResponse($payload); } $user = $this->config->getUser($token->getUserIdentifier()); $scope = User::scopeFromRoles($token?->getRoleNames()); $json = ['username' => $token?->getUserIdentifier(), 'scope' => $scope, 'limited' => $scope !== User::scopeFromRoles($user?->getRoles())]; if ($user?->getPasskey()) { $json['passkey'] = \true; } else { $json['totp_enabled'] = (bool) $user?->getTotpSecret(); } return new JsonResponse($json); } if (LoginAuthenticator::isLocked($this->kernel->getConfigDir())) { return new ApiProblemResponse((new ApiProblem())->setStatus(Response::HTTP_FORBIDDEN)); } if (!$this->config->hasUsers()) { return new Response('', Response::HTTP_NO_CONTENT); } return new ApiProblemResponse((new ApiProblem())->setStatus(Response::HTTP_UNAUTHORIZED)); } /** * Logs the user out by removing cookies from the browser. */ private function handleLogout(Request $request) : Response { if (!$this->security->isGranted('ROLE_USER')) { return new ApiProblemResponse((new ApiProblem('User is not logged in'))->setStatus(Response::HTTP_UNAUTHORIZED)); } $response = new Response('', Response::HTTP_NO_CONTENT); $this->jwtManager->removeToken($request, $response); return $response; } } getComposer(); $this->localRepository = $composer->getRepositoryManager()->getLocalRepository(); $this->compositeRepository = new InstalledRepository([new RootPackageRepository($composer->getPackage()), $this->localRepository, new PlatformRepository([], $composer->getConfig()->get('platform') ?: [])]); } public function __invoke() : Response { $missing = []; foreach ($this->localRepository->getPackages() as $package) { if ($this->hasDependents([$package->getName()])) { continue; } $replaces = \array_keys($package->getReplaces()); if ([] !== $replaces && $this->hasDependents($replaces)) { continue; } $missing[] = $package->getName(); } if ([] === $missing) { return new Response('', Response::HTTP_NO_CONTENT); } return new JsonResponse($missing); } private function hasDependents(array $names) : bool { $dependents = $this->compositeRepository->getDependents($names, null, \false, \false); foreach ($dependents as $dependent) { /** @var Link $link */ [, $link] = $dependent; if ('requires' === $link->getDescription()) { return \true; } } return \false; } } validateUploadSupport(); $uploads = $this->config->all(); foreach ($uploads as $id => &$upload) { if (!$this->filesystem->exists($this->uploadPath($id))) { unset($uploads[$id]); $this->config->remove($id); continue; } $upload['filesize'] = \filesize($this->uploadPath($id)); if ($upload['error']) { $upload['error'] = $this->translator->trans('upload.error.' . $upload['error']); } elseif (!$upload['success']) { $upload['error'] = $this->translator->trans('upload.error.partial'); } } return new JsonResponse(\array_reverse($uploads)); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/packages/uploads', methods: ['POST'], defaults: ['form-data' => \true])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_INSTALL')] public function upload(Request $request) : JsonResponse { $this->validateUploadSupport(); // Must be a HTML5 upload if ($request->files->has('package')) { /** @var UploadedFile $file */ $file = $request->files->get('package'); $id = $this->createUpload($file->getClientOriginalName(), $file->getSize()); $file->move($this->environment->getUploadDir(), $id); return $this->finishUpload($id, $request->getPreferredLanguage()); } switch ($request->request->get('phase')) { case 'start': $id = $this->createUpload($request->request->get('name'), $request->request->getInt('size')); return new JsonResponse(['status' => 'success', 'data' => ['session_id' => $id, 'end_offset' => self::CHUNK_SIZE]], Response::HTTP_CREATED); case 'upload': $this->addChunk($request->request->get('session_id'), $request->request->getInt('start_offset'), $request->files->get('chunk')); return new JsonResponse(['status' => 'success']); case 'finish': $id = $request->request->get('session_id'); return $this->finishUpload($id, $request->getPreferredLanguage()); } throw new \RuntimeException(\sprintf('Invalid chunk phase "%s"', $request->request->get('phase'))); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/packages/uploads/{id}', methods: ['DELETE'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_INSTALL')] public function delete(string $id) : JsonResponse { $this->validateUploadSupport(); if (!$this->config->has($id)) { throw new NotFoundHttpException(\sprintf('Unknown file ID "%s"', $id)); } try { $this->filesystem->remove($this->uploadPath($id)); } catch (IOException) { // Ignore if file could not be deleted } $this->config->remove($id); return new JsonResponse(['status' => 'success']); } private function createUpload(string $name, int $size) : string { /** @noinspection PhpUnhandledExceptionInspection */ $id = \bin2hex(\random_bytes(8)); $this->filesystem->touch($this->uploadPath($id)); $this->config->set($id, ['id' => $id, 'name' => $name, 'size' => $size, 'success' => \false, 'error' => null, 'package' => null]); return $id; } private function addChunk(string $id, int $offset, UploadedFile $file) : void { if (!$this->config->has($id)) { throw new NotFoundHttpException(\sprintf('Unknown file ID "%s"', $id)); } $fp = \fopen($this->uploadPath($id), 'cb+'); \flock($fp, \LOCK_EX); \fseek($fp, $offset); \fwrite($fp, \file_get_contents($file->getPathname()), self::CHUNK_SIZE); \flock($fp, \LOCK_UN); \fclose($fp); } private function finishUpload(string $id, string|null $language = null) : JsonResponse { $uploadFile = $this->uploadPath($id); $config = $this->config->get($id); if (null === $config || !$this->filesystem->exists($uploadFile)) { throw new NotFoundHttpException(\sprintf('Unknown file ID "%s"', $id)); } $size = \filesize($uploadFile); if ($config['success'] || $config['error']) { throw new \RuntimeException('File has already be uploaded completely.'); } if ($size !== $config['size']) { throw new \RuntimeException(\sprintf('Incomplete upload ID "%s": %s instead of %s bytes', $id, $size, $config['size'])); } try { $json = Zip::getComposerJson($uploadFile); if (null === $json) { return $this->installError($id, 'file'); } } catch (\RuntimeException) { return $this->installError($id, 'file'); } try { $data = JsonFile::parseJson($json, $uploadFile . '#composer.json'); } catch (ParsingException $exception) { return $this->installError($id, 'json', $exception); } try { $schemaFile = __DIR__ . '/../../../vendor/composer/composer/res/composer-schema.json'; // Prepend with file:// only when not using a special schema already (e.g. in the phar) if (!\str_contains($schemaFile, '://')) { $schemaFile = 'file://' . $schemaFile; } $schema = (object) ['$ref' => $schemaFile]; $schema->required = ['name', 'version']; $value = \json_decode(\json_encode($data), \false); $validator = new Validator(); $validator->validate($value, $schema, \_ContaoManager\JsonSchema\Constraints\Constraint::CHECK_MODE_EXCEPTIONS); } catch (ValidationException $exception) { return $this->installError($id, 'schema', $exception); } [$vendor, $package] = \explode('/', (string) $data['name']); $config['success'] = \true; $config['hash'] = \sha1_file($uploadFile); $config['package'] = \array_merge($this->environment->mergeMetadata($data, $language), ['installation-source' => 'dist', 'dist' => ['shasum' => $config['hash'], 'type' => 'zip', 'url' => \sprintf('/contao-manager/packages/%s__%s__%s__%s.zip', $vendor, $package, (new VersionParser())->normalize($data['version']), \substr(\sha1_file($uploadFile), 0, 8))]]); $this->config->set($id, $config); return new JsonResponse(['status' => 'success', 'data' => $this->config->get($id)]); } private function uploadPath(string $id) : string { return $this->environment->getUploadDir() . '/' . $id; } private function installError(string $id, string $error, \Exception|null $e = null) : JsonResponse { $config = $this->config->get($id); $config['success'] = \false; $config['error'] = $error; if ($e instanceof \Exception) { $config['exception'] = $e->getMessage(); } $this->config->set($id, $config); return new JsonResponse($config); } private function validateUploadSupport() : void { if (!$this->filesystem->exists($this->environment->getJsonFile())) { return; } if (!\extension_loaded('zip')) { throw new ApiProblemException((new ApiProblem("The artifact repository requires PHP's zip extension"))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } $packages = $this->environment->getComposer()->getRepositoryManager()->getLocalRepository()->getPackages(); foreach ($packages as $package) { if ('contao/manager-plugin' === $package->getName()) { $require = new MultiConstraint([new Constraint('>=', '2.7'), new Constraint('=', 'dev-main')], \false); if ($require->matches(new Constraint('=', $package->getVersion()))) { return; } } } throw new ApiProblemException((new ApiProblem('Must install contao/manager-plugin 2.7 or later to support artifacts.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } } dump($this->environment->getComposer()->getPackage())); } } $this->environment->getComposerJson(), 'composerLock' => $this->environment->getComposerLock(), 'platform' => $this->environment->getPlatformPackages(), 'localPackages' => $this->environment->getLocalPackages()]); } #[\_ContaoManager\Symfony\Component\Routing\Attribute\Route(path: '/packages/cloud', methods: ['PUT'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_UPDATE')] public function writeAndInstall(Request $request) : Response { if ($this->taskManager->hasTask()) { throw new BadRequestHttpException('A task is already active'); } $backupCreated = \false; $lock = $request->request->all('composerLock'); if ([] === $lock) { return new Response('composerLock is missing', Response::HTTP_BAD_REQUEST); } try { $lockFile = new JsonFile($this->filesystem->tempnam(\sys_get_temp_dir(), \md5(\Phar::running()))); $lockFile->write($lock); $lockContent = $lockFile->read(); // Validates the JSON } catch (\Throwable $throwable) { $this->logger->error('Invalid composerLock for /api/packages/cloud.', ['composerLock' => $lock]); throw new BadRequestHttpException($throwable->getMessage(), $throwable); } try { if ($request->request->has('composerJson') && [] !== ($json = $request->request->all('composerJson'))) { $jsonFile = new JsonFile($this->filesystem->tempnam(\sys_get_temp_dir(), \md5(\Phar::running()))); $jsonFile->write($json); $jsonFile->validateSchema(JsonFile::LAX_SCHEMA); if (!$this->isGranted('ROLE_INSTALL') && $jsonFile->read() !== $this->environment->getComposerJsonFile()->read()) { throw $this->createAccessDeniedException('No permission to change the composer.json'); } if (!$this->environment->createBackup()) { $this->logger->error('Unable to create backup of composer files.', ['composerJson' => $json ?? null, 'composerLock' => $lock]); throw new HttpException(Response::HTTP_INTERNAL_SERVER_ERROR, 'Unable to create backup of composer files.'); } $backupCreated = \true; $this->environment->getComposerJsonFile()->write($jsonFile->read()); } } catch (\Throwable $throwable) { $this->logger->error('Invalid composerJson for /api/packages/cloud: ' . $throwable->getMessage(), ['composerJson' => $json ?? null, 'composerLock' => $lock]); if ($throwable instanceof HttpExceptionInterface) { throw $throwable; } throw new BadRequestHttpException($throwable->getMessage(), $throwable); } try { Validator::createFromComposer($this->environment->getComposer(\true))->validate($lockContent); } catch (\Throwable $throwable) { $this->logger->error('Invalid composerLock for /api/packages/cloud: ' . $throwable->getMessage(), ['composerJson' => $json ?? null, 'composerLock' => $lock]); if ($backupCreated) { $this->environment->restoreBackup(); } throw new BadRequestHttpException($throwable->getMessage(), $throwable); } // Only write after composer.json was validated $this->environment->getComposerLockFile()->write($lockContent); return new JsonResponse($this->taskManager->createTask('composer/install', [])); } } '.+'])] #[\_ContaoManager\Symfony\Component\Security\Http\Attribute\IsGranted('ROLE_READ')] class LocalPackagesController { private readonly InstalledRepositoryInterface $localRepository; private readonly InstalledRepository $compositeRepository; public function __construct(private readonly Environment $environment) { $composer = $this->environment->getComposer(); $this->localRepository = $composer->getRepositoryManager()->getLocalRepository(); $this->compositeRepository = new InstalledRepository([new RootPackageRepository($composer->getPackage()), $this->localRepository, new PlatformRepository([], $composer->getConfig()->get('platform') ?: [])]); } public function __invoke(Request $request, string|null $name = null) : Response { if (null !== $name) { return $this->getOnePackage($name, $request->getPreferredLanguage()); } $dumper = new ArrayDumper(); $packages = []; foreach ($this->localRepository->getPackages() as $package) { $packages[$package->getName()] = $this->environment->mergeMetadata($dumper->dump($package), $request->getPreferredLanguage()); $packages[$package->getName()]['dependents'] = $this->getDependents($package); } return new JsonResponse($packages); } private function getOnePackage(string $name, string|null $language = null) : Response { [$package] = \array_values($this->localRepository->findPackages($name)); if (!$package instanceof PackageInterface) { throw new NotFoundHttpException('Package "' . $name . '" is not installed'); } $dumper = new ArrayDumper(); $data = $this->environment->mergeMetadata($dumper->dump($package), $language); $data['dependents'] = $this->getDependents($package); return new JsonResponse($data); } private function getDependents(PackageInterface $package) : array { $dependents = $this->parseDependents([$package->getName()]); if ([] === $dependents && [] !== ($replaces = \array_keys($package->getReplaces()))) { return $this->parseDependents($replaces, \true); } return $dependents; } private function parseDependents(array $packageNames, bool $withReplaces = \false) : array { $links = []; $dependents = $this->compositeRepository->getDependents($packageNames, null, \false, \false); foreach ($dependents as $dependent) { /** @var Link $link */ [, $link] = $dependent; if (!$withReplaces && 'replaces' === $link->getDescription()) { continue; } $constraint = $link->getConstraint(); $links[] = ['description' => $link->getDescription(), 'source' => $link->getSource(), 'target' => $link->getTarget(), 'constraint' => $constraint->getPrettyString()]; } return $links; } } request->has('constraint')) { return new Response('Missing constraint in POST data.', Response::HTTP_BAD_REQUEST); } try { $versionParser = new VersionParser(); $versionParser->parseConstraints($request->request->get('constraint')); } catch (\Exception $exception) { return new JsonResponse(['valid' => \false, 'error' => $exception->getMessage()]); } return new JsonResponse(['valid' => \true, 'error' => null]); } } lockFile = $kernel->getProjectDir() . '/var/install_lock'; } public function __invoke(Request $request) : Response { try { $contaoVersion = $this->console->getVersion(); } catch (\RuntimeException) { $contaoVersion = null; } if (null === $contaoVersion || (new MultiConstraint([new Constraint('<', '4.4.9'), new Constraint('>', '4.13.9999')], \false))->matches(new Constraint('=', $contaoVersion))) { return new ApiProblemResponse((new ApiProblem('Contao does not support locking the install tool.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } return match ($request->getMethod()) { 'GET' => $this->getLockStatus(), 'PUT' => $this->lockInstallTool(), 'DELETE' => $this->unlockInstallTool(), default => new Response(null, Response::HTTP_METHOD_NOT_ALLOWED), }; } private function getLockStatus() : Response { return new JsonResponse(['locked' => $this->isLocked()]); } private function lockInstallTool() : Response { $this->filesystem->dumpFile($this->lockFile, '3'); return $this->getLockStatus(); } private function unlockInstallTool() : Response { $this->filesystem->remove($this->lockFile); return $this->getLockStatus(); } private function isLocked() : bool { return $this->filesystem->exists($this->lockFile) && @\file_get_contents($this->lockFile) >= 3; } } console->getCommandList(); if (!isset($commands['contao:migrate']['options']) || !\in_array('hash', $commands['contao:migrate']['options'], \true) || !\in_array('format', $commands['contao:migrate']['options'], \true) || !\in_array('dry-run', $commands['contao:migrate']['options'], \true)) { return new ApiProblemResponse((new ApiProblem('Contao does not support database migrations.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } switch ($request->getMethod()) { case 'GET': return $this->getStatus(); case 'PUT': if (null !== $this->getBackgroundProcess()) { throw new BadRequestHttpException('A migration is already active'); } $process = $this->createProcess($request->request->get('hash'), $request->request->get('type'), $request->request->getBoolean('withDeletes')); $process->setMeta(['skip_warnings' => $request->request->getBoolean('skipWarnings')]); $process->start(); return new Response('', Response::HTTP_CREATED); case 'DELETE': if (null === ($process = $this->getBackgroundProcess())) { return new Response(); } $process->delete(); return new Response(); } return new Response(null, Response::HTTP_METHOD_NOT_ALLOWED); } private function getStatus() : Response { $process = $this->getBackgroundProcess(); if (null === $process) { return new Response('', Response::HTTP_NO_CONTENT); } $skipWarnings = (bool) ($process->getMeta()['skip_warnings'] ?? \false); $output = \trim($process->getOutput()); if ('' !== $output) { $lines = \explode("\n", $output); while ($line = \array_shift($lines)) { $data = \json_decode($line, \true); $type = $data['type'] ?? null; if ('warning' === $type && $skipWarnings) { continue; } if (\in_array($type, ['error', 'problem', 'warning'], \true)) { \array_unshift($lines, $line); return $this->handleProblems($lines, $process); } if ('migration-pending' === $type && !empty($data['names'])) { return $this->handleMigrations($data, $lines, $process); } if ('schema-pending' === $type && !empty($data['commands'])) { return $this->handleSchema($data, $lines, $process); } } } return new JsonResponse(['type' => $this->getProcessType($process), 'status' => $this->getProcessStatus($process), 'operations' => [], 'hash' => null]); } private function createProcess(string|null $hash, string|null $type, bool $withDeletes) : ProcessController { $args = ['contao:migrate', '--no-interaction', '--format=ndjson', null === $hash ? '--dry-run' : '--hash=' . $hash]; switch ($type) { case 'migrations-only': $args[] = '--migrations-only'; break; case 'schema-only': $args[] = '--schema-only'; break; } if ($withDeletes && 'migrations-only' !== $type && null !== $hash) { $args[] = '--with-deletes'; } return $this->processFactory->createContaoConsoleBackgroundProcess($args, 'database-migration'); } private function getBackgroundProcess() : ProcessController|null { try { return $this->processFactory->restoreBackgroundProcess('database-migration'); } catch (\Exception) { return null; } } private function handleProblems(array $lines, ProcessController $process) : Response { $responseType = 'warning'; $operations = []; foreach ($lines as $line) { $data = \json_decode((string) $line, \true); $type = $data['type'] ?? null; if (!\in_array($type, ['error', 'problem', 'warning'], \true)) { continue; } if ('warning' !== $type) { $responseType = 'problem'; } if ('error' === $type && isset($data['message'], $data['file'], $data['line'], $data['trace'])) { $operations[] = ['status' => 'error', 'name' => \sprintf('Exception in file %s on line %s', \str_replace($this->kernel->getProjectDir() . '/', '', $data['file']), $data['line']), 'message' => $data['message'], 'trace' => \str_replace($this->kernel->getProjectDir() . '/', '', $data['trace'])]; } else { $message = \explode("\n", $data['message'] ?? '', 2) + ['', '']; $operations[] = ['status' => 'error', 'name' => $message[0], 'message' => $message[1]]; } } return new JsonResponse(['type' => $responseType, 'status' => $this->getProcessStatus($process), 'operations' => $operations]); } private function handleMigrations(array $pending, array $lines, ProcessController $process) : Response { $operations = []; foreach ($pending['names'] as $name) { $operations[] = ['name' => $name, 'status' => 'pending', 'message' => '']; } $c = 0; foreach ($lines as $line) { $data = \json_decode((string) $line, \true); if ('migration-result' === ($data['type'] ?? '')) { $operations[$c]['message'] = $data['message']; $operations[$c]['status'] = $data['isSuccessful'] ? TaskStatus::STATUS_COMPLETE : TaskStatus::STATUS_ERROR; ++$c; } } return new JsonResponse(['type' => $this->getProcessType($process, 'migrations'), 'status' => $this->getProcessStatus($process), 'operations' => \array_values($operations), 'hash' => $pending['hash']]); } private function handleSchema(array $pending, array $lines, ProcessController $process) : Response { $operations = []; foreach ($pending['commands'] as $name) { $operations[$name] = ['name' => $name, 'status' => !$process->isRunning() && !$process->isSuccessful() ? TaskStatus::STATUS_ERROR : 'pending', 'message' => '']; } foreach ($lines as $line) { $data = \json_decode((string) $line, \true); $type = $data['type'] ?? ''; $name = $data['command'] ?? ''; if ('schema-execute' === $type) { $operations[$name]['status'] = TaskStatus::STATUS_ACTIVE; continue; } if ('schema-result' === $type) { $operations[$name]['status'] = $data['isSuccessful'] ? TaskStatus::STATUS_COMPLETE : TaskStatus::STATUS_ERROR; $operations[$name]['message'] = $data['message'] ?? ''; } } return new JsonResponse(['type' => $this->getProcessType($process, 'schema'), 'status' => $this->getProcessStatus($process), 'operations' => \array_values($operations), 'hash' => $pending['hash']]); } private function getProcessStatus(ProcessController $process) : string { if (!$process->isStarted()) { $process->start(); return TaskStatus::STATUS_ACTIVE; } if ($process->isRunning()) { return TaskStatus::STATUS_ACTIVE; } if ($process->isSuccessful()) { if (\str_contains($process->getCommandLine(), '--dry-run')) { return 'pending'; } return TaskStatus::STATUS_COMPLETE; } return TaskStatus::STATUS_ERROR; } private function getProcessType(ProcessController $process, string $default = '') : string { if (\str_contains($process->getCommandLine(), '--schema-only')) { return 'schema-only'; } if (\str_contains($process->getCommandLine(), '--migrations-only')) { return 'migrations-only'; } return $default; } } getMethod()) { 'GET' => $this->getAccessKey(), 'PUT' => $this->setAccessKey($request), 'DELETE' => $this->removeAccessKey(), default => new Response(null, Response::HTTP_METHOD_NOT_ALLOWED), }; } /** * @throws ParsingException */ private function getAccessKey() : Response { if (!$this->isSupported('get')) { return new ApiProblemResponse((new ApiProblem('Contao does not support the access-key API.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } return new JsonResponse(['access-key' => $this->api->runCommand($this->getAccessKeyArguments('get'))]); } /** * @throws ParsingException */ private function setAccessKey(Request $request) : Response { if (!$this->isSupported('set')) { return new Response(null, Response::HTTP_NOT_IMPLEMENTED); } if (!$request->request->has('user') || !$request->request->has('password')) { return new Response(null, Response::HTTP_BAD_REQUEST); } $user = $request->request->get('user'); $password = $request->request->get('password'); $accessKey = \password_hash($user . ':' . $password, \PASSWORD_DEFAULT); $this->api->runCommand(\array_merge($this->getAccessKeyArguments('set'), [$accessKey])); return new JsonResponse(['access-key' => $accessKey]); } /** * @throws ParsingException */ private function removeAccessKey() : Response { if (!$this->isSupported('remove')) { return new Response(null, Response::HTTP_NOT_IMPLEMENTED); } $this->api->runCommand($this->getAccessKeyArguments('remove')); return new JsonResponse(['access-key' => '']); } private function getAccessKeyArguments(string $action) : array { if (1 === $this->api->getVersion()) { return ['access-key:' . $action]; } return ['dot-env:' . $action, 'APP_DEV_ACCESSKEY']; } /** * Returns whether access key command is supported. */ private function isSupported(string $action) : bool { return 1 === $this->api->getVersion() || $this->api->hasCommand('dot-env:' . $action) && \in_array('APP_DEV_ACCESSKEY', $this->api->getFeatures()['contao/manager-bundle']['dot-env'], \true); } } console->getCommandList(); if (!\array_key_exists('contao:backup:list', $commands) || !\array_key_exists('contao:backup:create', $commands) || !\array_key_exists('contao:backup:restore', $commands)) { return new ApiProblemResponse((new ApiProblem('Contao does not support backups.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } $arguments = ['contao:backup:list', '--format=json', '--no-interaction']; $process = $this->processFactory->createContaoConsoleProcess($arguments); $process->run(); $data = \json_decode(\trim($process->getOutput()), \true); if (!\is_array($data)) { throw new ProcessOutputException('Invalid response for listing backups.', $process); } return new JsonResponse($data); } } console->getCommandList(); } catch (\RuntimeException) { $commands = []; } $hasLexik = \array_key_exists('lexik:maintenance:lock', $commands) && \array_key_exists('lexik:maintenance:unlock', $commands); if (!$hasLexik && !\array_key_exists('contao:maintenance-mode', $commands)) { return new ApiProblemResponse((new ApiProblem('Contao does not support maintenance mode.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } return match ($request->getMethod()) { 'GET' => $this->getStatus($hasLexik), 'PUT' => $this->enable($hasLexik), 'DELETE' => $this->disable($hasLexik), default => new Response(null, Response::HTTP_METHOD_NOT_ALLOWED), }; } private function getStatus(bool $lexik) : Response { if ($lexik) { return new JsonResponse(['enabled' => $this->filesystem->exists($this->kernel->getProjectDir() . '/var/maintenance_lock')]); } return new JsonResponse($this->runContaoCommand()); } private function enable(bool $lexik) : Response { if ($lexik) { return new JsonResponse(['enabled' => $this->runLexikCommand('lock')]); } return new JsonResponse($this->runContaoCommand('enable')); } private function disable(bool $lexik) : Response { if ($lexik) { return new JsonResponse(['enabled' => !$this->runLexikCommand('unlock')]); } return new JsonResponse($this->runContaoCommand('disable')); } private function runContaoCommand(string|null $state = null) : array { $arguments = ['contao:maintenance']; if (null !== $state) { $arguments[] = $state; } $arguments[] = '--format=json'; $arguments[] = '--no-interaction'; $process = $this->processFactory->createContaoConsoleProcess($arguments); $process->run(); $data = \json_decode(\trim($process->getOutput()), \true); if (!\is_array($data)) { return ['enabled' => \false]; } return $data; } private function runLexikCommand(string $command) : bool { $process = $this->processFactory->createContaoConsoleProcess(['lexik:maintenance:' . $command, '--no-interaction']); $process->run(); return $process->isSuccessful(); } } isSupported()) { return new ApiProblemResponse((new ApiProblem('Contao does not support the jwt-token API.'))->setStatus(Response::HTTP_NOT_IMPLEMENTED)); } return match ($request->getMethod()) { 'GET' => $this->getJwtPayload($request), 'PUT' => $this->setJwtToken($request), 'DELETE' => $this->removeJwtToken(), default => new Response(null, Response::HTTP_METHOD_NOT_ALLOWED), }; } /** * @throws ParsingException */ private function getJwtPayload(Request $request) : Response { if (!$request->cookies->has(self::COOKIE_NAME)) { return new Response('', Response::HTTP_NO_CONTENT); } $payload = $this->api->runJsonCommand(['jwt-cookie:parse', $request->cookies->get(self::COOKIE_NAME)]); return new JsonResponse($payload); } /** * @throws ParsingException */ private function setJwtToken(Request $request) : Response { $arguments = ['jwt-cookie:generate']; if ($request->request->getBoolean('debug')) { $arguments[] = '--debug'; } $cookie = Cookie::fromString($this->api->runCommand($arguments)); $response = new JsonResponse(['debug' => $request->request->getBoolean('debug')]); $response->headers->setCookie($cookie); return $response; } private function removeJwtToken() : Response { $response = new Response('', Response::HTTP_NO_CONTENT); $response->headers->clearCookie(self::COOKIE_NAME); return $response; } private function isSupported() : bool { $features = $this->api->getFeatures(); return isset($features['contao/manager-bundle']['jwt-cookie']) && \in_array('debug', $features['contao/manager-bundle']['jwt-cookie'], \true); } } filesystem = new Filesystem(); $debug = 'dev' === $environment; ErrorHandler::register(); \error_reporting($debug ? \E_ALL : \E_ERROR | \E_PARSE | \E_CORE_ERROR | \E_COMPILE_ERROR); \ini_set('display_errors', $debug ? '1' : '0'); \ini_set('error_log', $this->getLogDir() . \DIRECTORY_SEPARATOR . 'error-' . \date('Y-m-d') . '.log'); parent::__construct($environment, $debug); $this->configureComposerEnvironment(); } public function isWebDir() : bool { $publicDir = $this->getPublicDir(); return 'web' === \dirname($publicDir) && $publicDir !== $this->getProjectDir(); } public function getRootDir() : string { return __DIR__; } public function getProjectDir() : string { if (null === $this->projectDir) { $this->findProjectDir(); } return $this->projectDir; } public function getPublicDir() : string { $this->getProjectDir(); return $this->publicDir; } public function getCacheDir() : string { $cacheDir = $this->debug ? $this->getConfigDir() . '/appcache' : __DIR__ . '/Resources/cache'; $this->ensureDirectoryExists($cacheDir); return $cacheDir; } public function getLogDir() : string { $logDir = $this->getConfigDir() . '/logs'; $this->ensureDirectoryExists($logDir); return $logDir; } /** * Gets the directory where to place manager files like config and logs. */ public function getConfigDir() : string { if (null !== $this->configDir) { return $this->configDir; } $this->configDir = $this->getProjectDir() . \DIRECTORY_SEPARATOR . 'contao-manager'; if (!self::isPhar()) { return $this->configDir; } // Try to find a config directory in the parent from previous version if (!$this->filesystem->exists($this->configDir)) { $parentDir = \dirname($this->getProjectDir()) . \DIRECTORY_SEPARATOR . 'contao-manager'; if ($this->filesystem->exists($parentDir . '/manager.json')) { $this->filesystem->mirror($parentDir, $this->configDir); } $this->ensureDirectoryExists($this->configDir); } // Make sure the config directory contains a .htaccess file if (!$this->filesystem->exists($this->configDir . \DIRECTORY_SEPARATOR . '.htaccess')) { $this->filesystem->dumpFile($this->configDir . \DIRECTORY_SEPARATOR . '.htaccess', <<<'CODE' Order deny,allow Deny from all Require all denied CODE ); } return $this->configDir; } public function getTranslator() : Translator { if ($this->container) { return $this->container->get(Translator::class); } // The kernel has not been bootet successfully, manually create a translator $requestStack = new RequestStack(); $requestStack->push(Request::createFromGlobals()); return new Translator($requestStack); } public function registerBundles() : array { return [new FrameworkBundle(), new SecurityBundle(), new MonologBundle()]; } public function registerContainerConfiguration(LoaderInterface $loader) : void { $loader->load(__DIR__ . '/Resources/config/config_' . $this->environment . '.yaml'); } /** * Loads the routes using framework.router config. We must use a loader method not * e.g. a routes.yaml because of dynamic path to the Phar. */ public function loadRoutes(LoaderInterface $loader) : RouteCollection { $resolver = $loader->getResolver()->resolve(__DIR__ . '/Controller', 'attribute'); $routes = $resolver->load(__DIR__ . '/Controller', 'attribute'); $routes->addPrefix('api'); return $routes; } public static function isPhar() : bool { return '' !== \Phar::running(\false); } /** * Configures the Composer environment variables to match the current setup. */ private function configureComposerEnvironment() : void { $root = $this->getProjectDir(); \putenv('COMPOSER=' . $root . \DIRECTORY_SEPARATOR . 'composer.json'); \putenv('COMPOSER_HOME=' . $this->getConfigDir()); \putenv('COMPOSER_HTACCESS_PROTECT=0'); \chdir($root); } /** * Finds the Contao installation directory depending on the Phar file or * development mode. */ private function findProjectDir() : void { // @see https://getcomposer.org/doc/03-cli.md#composer if (\false !== ($composer = \getenv('COMPOSER'))) { // We don't know the public dir when running on command line, but it shouldn't matter $this->projectDir = \dirname($composer); $this->publicDir = $this->projectDir; return; } // Not a phar file, use test directory in local development if (!self::isPhar()) { $this->projectDir = \dirname(__DIR__) . \DIRECTORY_SEPARATOR . 'test-dir'; $this->publicDir = $this->projectDir . '/web'; $this->ensureDirectoryExists($this->publicDir); return; } // Use the current working directory in CLI mode if (('cli' === \PHP_SAPI || !isset($_SERVER['REQUEST_URI'])) && !empty($_SERVER['PWD'])) { // We don't know the public dir when running on command line, but it shouldn't matter $this->projectDir = $_SERVER['PWD']; $this->publicDir = $_SERVER['PWD']; return; } $current = \getcwd(); if (!$current) { $current = \dirname(\Phar::running(\false)); } // Always use current folder if it is not named "web" or "public" if ('web' !== \basename($current) && 'public' !== \basename($current)) { $this->projectDir = $current; $this->publicDir = $current; return; } $contaoFiles = ['/vendor/contao/manager-bundle/bin/contao-console', '/system/constants.php', '/system/config/constants.php']; if ($this->debug) { $contaoFiles[] = '/vendor/contao/contao/manager-bundle/bin/contao-console'; } // Use current folder if it looks like Contao foreach ($contaoFiles as $file) { if ($this->filesystem->exists($current . $file)) { $this->projectDir = $current; $this->publicDir = $current; return; } } // Throw exception if parent folder looks like Contao but is not writeable if (!\is_writable(\dirname($current))) { $files = [\dirname($current) . '/vendor/contao/manager-bundle/bin/contao-console', \dirname($current) . '/system/constants.php', \dirname($current) . '/system/config/constants.php']; if ($this->debug) { $files[] = \dirname($current) . '/vendor/contao/contao/manager-bundle/bin/contao-console'; } foreach ($files as $file) { if ($this->filesystem->exists($file)) { $translator = $this->getTranslator(); $problem = (new ApiProblem($translator->trans('error.writable.root', ['path' => \dirname($current)]), 'https://php.net/is_writable'))->setDetail($translator->trans('error.writable.detail')); throw new ApiProblemException($problem); } } } $this->publicDir = $current; $this->projectDir = \dirname($current); } private function ensureDirectoryExists(string $directory) : void { try { $this->filesystem->mkdir($directory); } catch (IOException $exception) { $translator = $this->getTranslator(); $problem = new ApiProblem($translator->trans('error.writable.directory', ['path' => $exception->getPath()])); $problem->setDetail($translator->trans('error.writable.detail')); throw new ApiProblemException($problem, $exception); } } } phpExecutableFinder; } /** * Gets PHP executable by detecting known server paths. */ public function getPhpExecutable() : string|null { $paths = []; if ($php_cli = $this->managerConfig->get('php_cli')) { $paths[] = $php_cli; } foreach (self::PHP_BINARIES as $path) { $paths[] = $this->getPhpVersionPath($path); } $found = $this->phpExecutableFinder->find($paths); if ($php_cli && $found !== $php_cli) { $this->managerConfig->set('php_cli', $found); } return $found; } /** * Gets environment variables for the PHP command line process. */ public function getPhpEnv() : array { return ['PHP_PATH' => $this->getPhpExecutable()]; } /** * Returns the background process forker classes for the current server. * * @return array> */ public function getProcessForkers() : array { if (self::PLATFORM_WINDOWS === $this->getPlatform()) { return [WindowsStartForker::class, InlineForker::class]; } return [DisownForker::class, NohupForker::class, InlineForker::class]; } /** * Returns the server platform (Windows or UNIX). */ public function getPlatform() : string { return '\\' === \DIRECTORY_SEPARATOR ? self::PLATFORM_WINDOWS : self::PLATFORM_UNIX; } /** * Gets versionised path to PHP binary. */ private function getPhpVersionPath(string $path) : string { return \str_replace(['{major}', '{minor}', '{release}', '{extra}'], [\PHP_MAJOR_VERSION, \PHP_MINOR_VERSION, \PHP_RELEASE_VERSION, \PHP_EXTRA_VERSION], $path); } } getContent($url, $statusCode, [], $catch, $timeout); } /** * @return resource|false */ public function getStream(string $url, ?int &$statusCode = null, bool $catch = \false) { $context = $this->createStreamContext($url, 0); try { $stream = \fopen($url, 'r', \false, $context); $statusCode = $this->getLastStatusCode($http_response_header); } catch (\Throwable $throwable) { if ($catch) { return \false; } throw new RequestException($url, $this->getLastStatusCode($http_response_header ?? null), $throwable); } return $stream; } public function getJson(string $url, array $headers = [], ?int &$statusCode = null, bool $catch = \false) : string|null { $headers[] = 'Accept: application/json'; return $this->getContent($url, $statusCode, ['http' => ['header' => $headers]], $catch); } public function postJson(string $url, string $content, array $headers = [], ?int &$statusCode = null, bool $catch = \false) : string|null { $headers[] = 'Accept: application/json'; $headers[] = 'Content-Type: application/json'; $options = ['http' => ['method' => 'POST', 'header' => $headers, 'content' => $content]]; return $this->getContent($url, $statusCode, $options, $catch); } public function deleteJson(string $url, array $headers = [], ?int &$statusCode = null, bool $catch = \false) : string|null { $headers[] = 'Accept: application/json'; $options = ['http' => ['method' => 'DELETE', 'header' => $headers]]; return $this->getContent($url, $statusCode, $options, $catch); } private function getContent(string $url, ?int &$statusCode, array $options, bool $catch, int $timeout = self::DEFAULT_TIMEOUT) : string|null { $context = $this->createStreamContext($url, $timeout, $options); try { if (\false === ($content = \file_get_contents($url, \false, $context))) { throw new \RuntimeException(); } $statusCode = $this->getLastStatusCode($http_response_header); } catch (\Throwable $throwable) { if ($catch) { return null; } throw new RequestException($url, $this->getLastStatusCode($http_response_header ?? null), $throwable); } return $content; } /** * @return resource */ private function createStreamContext(string $url, int $timeout = self::DEFAULT_TIMEOUT, array $options = []) { $tlsDefaults = $this->getTlsDefaults($options); $options = \array_replace_recursive($tlsDefaults, $options); if ($timeout > 0) { $options['http']['timeout'] ??= $timeout; } $options['http']['ignore_errors'] ??= \true; if (isset($options['http']['header']) && !\is_array($options['http']['header'])) { $options['http']['header'] = [$options['http']['header']]; } $options['http']['header'][] = \sprintf('User-Agent: Contao Manager/%s (%s; %s; %s%s)', ApiKernel::VERSION_KEY === ApiKernel::MANAGER_VERSION ? 'source' : ApiKernel::MANAGER_VERSION, \function_exists('php_uname') ? \php_uname('s') : 'Unknown', \function_exists('php_uname') ? \php_uname('r') : 'Unknown', 'PHP ' . \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION . '.' . \PHP_RELEASE_VERSION, Platform::getEnv('CI') ? '; CI' : ''); return StreamContextFactory::getContext($url, $options); } /** * @see \Composer\Util\RemoteFilesystem::getTlsDefaults() */ private function getTlsDefaults(array $options) : array { $ciphers = \implode(':', ['ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-AES256-GCM-SHA384', 'DHE-RSA-AES128-GCM-SHA256', 'DHE-DSS-AES128-GCM-SHA256', 'kEDH+AESGCM', 'ECDHE-RSA-AES128-SHA256', 'ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-SHA', 'ECDHE-ECDSA-AES128-SHA', 'ECDHE-RSA-AES256-SHA384', 'ECDHE-ECDSA-AES256-SHA384', 'ECDHE-RSA-AES256-SHA', 'ECDHE-ECDSA-AES256-SHA', 'DHE-RSA-AES128-SHA256', 'DHE-RSA-AES128-SHA', 'DHE-DSS-AES128-SHA256', 'DHE-RSA-AES256-SHA256', 'DHE-DSS-AES256-SHA', 'DHE-RSA-AES256-SHA', 'AES128-GCM-SHA256', 'AES256-GCM-SHA384', 'AES128-SHA256', 'AES256-SHA256', 'AES128-SHA', 'AES256-SHA', 'AES', 'CAMELLIA', 'DES-CBC3-SHA', '!aNULL', '!eNULL', '!EXPORT', '!DES', '!RC4', '!MD5', '!PSK', '!aECDH', '!EDH-DSS-DES-CBC3-SHA', '!EDH-RSA-DES-CBC3-SHA', '!KRB5-DES-CBC3-SHA']); /** * CN_match and SNI_server_name are only known once a URL is passed. They will be * set in the getOptionsForUrl() method which receives a URL. * * cafile or capath can be overridden by passing in those options to constructor. */ $defaults = ['ssl' => ['ciphers' => $ciphers, 'verify_peer' => \true, 'verify_depth' => 7, 'SNI_enabled' => \true]]; if (isset($options['ssl'])) { $defaults['ssl'] = \array_replace_recursive($defaults['ssl'], $options['ssl']); } /* * Attempt to find a local cafile or throw an exception if none pre-set * The user may go download one if this occurs. */ if (!isset($defaults['ssl']['cafile']) && !isset($defaults['ssl']['capath'])) { $result = CaBundle::getSystemCaRootBundlePath($this->logger); if (\is_dir($result)) { $defaults['ssl']['capath'] = $result; } else { $defaults['ssl']['cafile'] = $result; } } /* * Disable TLS compression to prevent CRIME attacks where supported. */ $defaults['ssl']['disable_compression'] = \true; return $defaults; } private function getLastStatusCode(array|null $http_response_header) : int { if (!\is_array($http_response_header)) { return 500; } // Reverse the headers so we find the last HTTP status code if the request // was redirected See // http://php.net/manual/en/reserved.variables.httpresponseheader.php#122362 $http_response_header = \array_reverse($http_response_header); foreach ($http_response_header as $header) { if (\preg_match('{^HTTP/.+ (\\d{3}) }i', (string) $header, $matches)) { return (int) $matches[1]; } } return 500; } } checkForUpdate(); $requires = $this->managerConfig->get('latest_requires', []); $repository = new PlatformRepository(); foreach ($requires as $name => $constraint) { if (null === $repository->findPackage($name, $constraint)) { return \false; } } return \true; } /** * Returns whether this is a development build. */ public function isDev() : bool { // @phpstan-ignore-next-line return ApiKernel::VERSION_KEY === ApiKernel::MANAGER_VERSION || 'prod' !== $this->kernel->getEnvironment() || $this->kernel->isDebug(); } /** * Gets the release channel for the current version. */ public function getChannel() : string { return $this->isDev() ? 'dev' : 'stable'; } /** * Returns whether there is an update available. */ public function hasUpdate() : bool { return $this->getOldVersion() !== $this->getNewVersion(); } /** * Returns version of currently installed Phar. */ public function getOldVersion() : string { return ApiKernel::MANAGER_VERSION; } /** * Returns version of remotely available Phar. */ public function getNewVersion() : string|null { $this->checkForUpdate(); return $this->managerConfig->has('latest_version') ? (string) $this->managerConfig->get('latest_version') : null; } /** * Returns the requirements for the remotely available Phar. */ public function getNewRequires() : array { $this->checkForUpdate(); return $this->managerConfig->get('latest_requires', []); } /** * Updates the current Phar to the latest version available. * * @throws \Throwable */ public function update() : bool { if (!$this->hasUpdate() || !$this->canUpdate() || !$this->supportsUpdate()) { return \false; } $remote = $this->getRemoteInfo(); $phar = \Phar::running(\false); [$filename, $extension] = $this->splitFilename($phar); $backupFile = $this->kernel->getConfigDir() . '/' . $filename . '-old' . $extension; $tempFile = \dirname($phar) . '/' . $filename . '.temp'; $this->backup($phar, $backupFile); try { $this->download($tempFile); $this->validate($tempFile, $remote['sha1']); $this->install($tempFile, $phar); } catch (\Throwable $throwable) { $this->filesystem->remove($tempFile); throw $throwable; } // Check the update server after update. This might be necessary if an updated // version contains a new update URL, which will be the case one the PHP version // is no longer supported. $this->managerConfig->remove('last_update'); return \true; } /** * Loads latest information from the update server if the local cache has expired. */ private function checkForUpdate() : void { if ($this->checkedForUpdates) { return; } $lastUpdate = $this->managerConfig->get('last_update'); $latestVersion = $this->managerConfig->get('latest_version'); if (null !== $latestVersion && null !== $lastUpdate && \false !== ($lastUpdate = \strtotime((string) $lastUpdate)) && !$this->isDev() && $lastUpdate <= \time() && $lastUpdate > \strtotime('-1 hour')) { return; } $remote = $this->getRemoteInfo(); $this->checkedForUpdates = \true; $this->managerConfig->set('last_update', (new \DateTime())->format('c')); $this->managerConfig->set('latest_version', $remote['version']); $this->managerConfig->set('latest_requires', $remote['requires'] ?? []); } /** * Gets remote information about available updates. */ private function getRemoteInfo() : array { if (null === $this->remote) { $url = \sprintf(self::VERSION_URL, $this->getChannel()); $content = \trim((string) $this->request->get($url, $statusCode, \false, 0)); $data = \json_decode($content, \true); if (!isset($data['version'], $data['sha1']) || !\preg_match('@^\\d+\\.\\d+\\.\\d+(-[a-z0-9\\-]+)?$@', (string) $data['version']) || !\preg_match('%^[a-z0-9]{40}%', (string) $data['sha1'])) { throw new \RuntimeException('Version request returned incorrectly formatted response.'); } $this->remote = $data; } return $this->remote; } /** * Creates a backup of the current Phar to the given target. */ private function backup(string $current, string $target) : void { $this->filesystem->copy($current, $target, \true); } /** * Downloads the latest remote version to the given target. */ private function download(string $target) : void { $url = \sprintf(self::DOWNLOAD_URL, $this->getChannel()); $result = $this->request->getStream($url); if (null === $result) { throw new \RuntimeException(\sprintf('Request to URL failed: %s', $url)); } $this->filesystem->dumpFile($target, $result); } /** * Validates temporary file if it matches the given SHA1 hash. */ private function validate(string $tempFile, string $sha1) : void { $tmpVersion = \sha1_file($tempFile); if ($tmpVersion !== $sha1) { throw new \RuntimeException(\sprintf('Download file appears to be corrupted or outdated. The file received does not have the expected SHA-1 hash: %s.', $sha1)); } } /** * Installs the temporary Phar to the target location. */ private function install(string $tempFile, string $phar) : void { if (\defined('PHP_WINDOWS_VERSION_BUILD')) { $this->filesystem->copy($tempFile, $phar, \true); $this->filesystem->remove($tempFile); return; } $this->filesystem->rename($tempFile, $phar, \true); } /** * Gets filename and extension from current Phar file. */ private function splitFilename(string $phar) : array { $extension = '.phar.php'; $filename = \basename($phar, $extension); if ($filename === $phar) { $extension = '.phar'; $filename = \basename($phar, $extension); } return [$filename, $extension]; } } */ private readonly array $operations ) { } public function getTitle() : string { return $this->title; } public function getConsole() : string { $console = new ConsoleOutput(); foreach ($this->operations as $operation) { $console->add((string) $operation->getConsole()); } return (string) $console; } /** * @return array */ public function getOperations() : array { return $this->operations; } public function isCancellable() : bool { return $this->cancellable; } public function setCancellable(bool $stoppable) : self { $this->cancellable = $stoppable; return $this; } public function canAutoClose() : bool { return $this->autoClose; } public function setAutoClose(bool $autoClose) : self { $this->autoClose = $autoClose; return $this; } public function hasAudit() : bool { return $this->audit; } public function setAudit(bool $audit) : self { $this->audit = $audit; return $this; } public function getStatus() : string { foreach ($this->operations as $i => $operation) { if ($this->abort) { if ($operation->isRunning()) { return self::STATUS_ABORTING; } continue; } if ($operation->hasError()) { if ($operation->continueOnError()) { if (isset($this->operations[$i + 1]) && ($this->operations[$i + 1]->isRunning() || $this->operations[$i + 1]->isSuccessful())) { continue; } return self::STATUS_PAUSED; } return self::STATUS_ERROR; } if (!$operation->isStarted() || $operation->isRunning()) { return self::STATUS_ACTIVE; } } if ($this->abort) { return self::STATUS_STOPPED; } return self::STATUS_COMPLETE; } public function setAborted() : self { $this->abort = \true; return $this; } public function isActive() : bool { return self::STATUS_ACTIVE === $this->getStatus(); } public function isComplete() : bool { return self::STATUS_COMPLETE === $this->getStatus(); } public function isStopped() : bool { return self::STATUS_STOPPED === $this->getStatus(); } public function hasError() : bool { return self::STATUS_ERROR === $this->getStatus(); } public function jsonSerialize() : array { $operations = []; $sponsor = null; $isNext = !$this->abort; $hasError = \false; $canContinue = \false; foreach ($this->operations as $operation) { $status = $this->getOperationStatus($operation, $isNext); $operations[] = ['summary' => $operation->getSummary(), 'details' => $operation->getDetails(), 'console' => (string) $operation->getConsole(), 'status' => $hasError && !$canContinue ? self::STATUS_STOPPED : $status]; if ($operation instanceof SponsoredOperationInterface) { $sponsor = $operation->getSponsor(); } $isNext = $operation->isSuccessful(); $canContinue = $canContinue || !$hasError && $operation->hasError() && $operation->continueOnError(); $hasError = $hasError || $operation->hasError(); } return ['id' => $this->id, 'title' => $this->title, 'console' => $this->getConsole(), 'cancellable' => $this->cancellable, 'continuable' => $canContinue, 'autoclose' => $this->autoClose, 'audit' => $this->audit, 'status' => $this->getStatus(), 'operations' => $operations, 'sponsor' => $sponsor]; } private function getOperationStatus(TaskOperationInterface $operation, bool $isNext = \false) : string { return match (\true) { $operation->isRunning() => self::STATUS_ACTIVE, $operation->isSuccessful() => self::STATUS_COMPLETE, $operation->hasError() => self::STATUS_ERROR, $isNext || $operation->isStarted() => self::STATUS_ACTIVE, default => 'pending', }; } } setAutoClose(\true); } protected function getTitle() : string { return $this->translator->trans('task.dump_autoload.title'); } protected function buildOperations(TaskConfig $config) : array { return [new DumpAutoloadOperation($this->processFactory, $this->translator)]; } } setAutoClose(\true); } protected function getTitle() : string { return $this->translator->trans('task.clear_cache.title'); } protected function buildOperations(TaskConfig $config) : array { return [new ClearCacheOperation($this->processFactory)]; } } translator->trans('task.self_update.title'); } /** * @return array */ protected function buildOperations(TaskConfig $config) : array { return [new SelfUpdateOperation($this->updater, $config, $this->translator)]; } } buildOperations($config); foreach ($operations as $operation) { if (null !== $this->logger && $operation instanceof LoggerAwareInterface) { $operation->setLogger($this->logger); } } return new TaskStatus($config->getId(), $this->getTitle(), $operations); } public function update(TaskConfig $config, bool $continue = \false) : TaskStatus { if ($config->isCancelled()) { return $this->abort($config); } $status = $this->create($config); $operations = $status->getOperations(); foreach ($operations as $i => $operation) { if (!$operation->isStarted() || $operation->isRunning()) { if (null !== $this->logger) { $this->logger->info('Current operation: ' . $operation::class); } $operation->run(); if (null !== $this->logger && $operation->hasError()) { $this->logger->info('Failed operation: ' . $operation::class); } return $status; } if ($operation->isSuccessful()) { if (null !== $this->logger) { $this->logger->info('Completed operation: ' . $operation::class); } continue; } if ($operation->hasError() && $operation->continueOnError()) { if ($continue) { if (null !== $this->logger) { $this->logger->info('Continuing after failed operation: ' . $operation::class); } continue; } if (!isset($operations[$i + 1]) || $operations[$i + 1]->isRunning() || $operations[$i + 1]->isSuccessful()) { continue; } } return $status; } return $status; } public function abort(TaskConfig $config) : TaskStatus { $config->setCancelled(); $status = $this->create($config)->setAborted(); foreach ($status->getOperations() as $operation) { $operation->abort(); if ($operation->isRunning()) { if (null !== $this->logger) { $this->logger->info('Task operation is active, aborting', ['class' => $operation::class]); } break; } } return $status; } public function delete(TaskConfig $config) : bool { $status = $this->create($config); $operations = $status->getOperations(); foreach ($operations as $operation) { if ($operation->isRunning()) { if (null !== $this->logger) { $this->logger->info('Cannot delete active operation', ['class' => $operation::class]); } return \false; } } foreach ($operations as $operation) { if (null !== $this->logger) { $this->logger->info('Deleting operation', ['class' => $operation::class]); } $operation->delete(); } $config->delete(); return \true; } protected abstract function getTitle() : string; /** * @return array */ protected abstract function buildOperations(TaskConfig $config) : array; } translator->trans('task.setup_packages.title'); } protected function buildOperations(TaskConfig $config) : array { $upload = null; if ($uploadId = $config->getOption('upload')) { $upload = $config->getState('upload'); if (!$upload) { $upload = $this->uploads->get($uploadId); $config->setState('upload', $upload); } $operations = [new InstallUploadsOperation([$upload], $config, $this->environment, $this->translator, $this->filesystem), new CreateProjectOperation($config, $this->processFactory, $this->kernel, $this->environment, $upload['package']['name'], null, \true)]; } elseif ($package = $config->getOption('package')) { $operations = [new CreateProjectOperation($config, $this->processFactory, $this->kernel, $this->environment, $package, $config->getOption('version'))]; } else { $operations = [new CreateContaoOperation($config, $this->environment, $this->kernel, $this->filesystem)]; } if ($config->getOption('no-update')) { return $operations; } if ($this->environment->useCloudResolver()) { $operations[] = new CloudOperation($this->cloudResolver, new CloudChanges(), $config, $this->environment, $this->translator, $this->filesystem, $this->logger); } $operations[] = new InstallOperation($this->processFactory, $config, $this->environment, $this->translator, \false, !$config->isCancelled()); if ($upload) { $operations[] = new RemoveUploadsOperation([$upload], $this->uploads, $config, $this->environment, $this->translator, $this->filesystem); } return $operations; } } isComplete() && $config->getOption('dry_run', \false)) { $this->restoreState($config); } return $status; } protected function getTitle() : string { return $this->translator->trans('task.update_packages.title'); } protected function buildOperations(TaskConfig $config) : array { $changes = $this->getComposerDefinition($config); $toggleMaintenance = !$changes->getDryRun() && \array_key_exists('contao:maintenance-mode', $this->contaoConsole->getCommandList()); $operations = []; if (($required = $changes->getRequiredPackages()) && [] !== $required) { $operations[] = new RequireOperation($this->processFactory, $required); } if (($removed = $changes->getRemovedPackages()) && [] !== $removed) { $operations[] = new RemoveOperation($this->processFactory, $removed); } if ($this->environment->useCloudResolver()) { $operations[] = new CloudOperation($this->cloudResolver, $changes, $config, $this->environment, $this->translator, $this->filesystem, $this->logger); } else { $operations[] = new UpdateOperation($this->processFactory, $this->environment, $changes->getUpdates(), $changes->getDryRun()); } if ($toggleMaintenance) { $operations[] = new MaintenanceModeOperation($config, $this->processFactory, 'enable'); } $operations[] = new InstallOperation($this->processFactory, $config, $this->environment, $this->translator, $changes->getDryRun(), !$config->isCancelled()); if ($toggleMaintenance) { $operations[] = new MaintenanceModeOperation($config, $this->processFactory, 'disable'); } if ($config->getOption('uploads', \false) && \count($this->uploads)) { $uploads = \array_filter($this->uploads->all(), static fn($upload): bool => $upload['success'] && isset($upload['package']['name']) && ([] === $changes->getUpdates() || \in_array($upload['package']['name'], $changes->getUpdates(), \true))); \array_unshift($operations, new InstallUploadsOperation($uploads, $config, $this->environment, $this->translator, $this->filesystem)); if (!$config->getOption('dry_run', \false)) { $operations[] = new RemoveUploadsOperation($uploads, $this->uploads, $config, $this->environment, $this->translator, $this->filesystem); } } if ([] !== $removed) { $artifacts = \array_filter($this->environment->getArtifacts(), static function (string $file) use($removed) : bool { foreach ($removed as $packageName) { if (\str_starts_with($file, \str_replace('/', '__', $packageName))) { return \true; } } return \false; }); if ([] !== $artifacts) { $operations[] = new RemoveArtifactsOperation($artifacts, $config, $this->environment, $this->translator, $this->filesystem); } } return $operations; } protected function getComposerDefinition(TaskConfig $config) : CloudChanges { $updates = $config->getOption('update', []); $definition = new CloudChanges(); $definition->setUpdates($updates); $definition->setDryRun($config->getOption('dry_run', \false)); foreach ($config->getOption('require', []) as $name => $version) { $definition->requirePackage($name, $version); } foreach ($config->getOption('remove', []) as $name) { $definition->removePackage($name); } $this->addContaoConflictsRequirement($definition); $this->handleContaoRequirement($definition); // Update all packages if none are set if (empty($updates)) { $definition->setUpdates([]); } return $definition; } private function addContaoConflictsRequirement(CloudChanges $definition) : void { $rootRequires = $this->environment->getComposer()->getPackage()->getRequires(); if (isset($rootRequires['contao/conflicts']) && '*@dev' === $rootRequires['contao/conflicts']->getPrettyConstraint()) { if ([] !== $definition->getUpdates()) { $definition->addUpdate('contao/conflicts'); } return; } $definition->requirePackage('contao/conflicts', '*@dev'); } private function handleContaoRequirement(CloudChanges $definition) : void { foreach ($definition->getRequiredPackages() as $require) { $require = \explode('=', (string) $require, 2); $packageName = $require[0]; $version = $require[1] ?? null; // Automatically require core-bundle and installation-bundle if the // manager-bundle is not stable otherwise the dependency would not be resolved // because we don't set minimum-stability if ('contao/manager-bundle' === $packageName && null !== $version) { $rootRequires = $this->environment->getComposer()->getPackage()->getRequires(); $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($version); $isContao5 = $constraint->matches(new Constraint('>=', '5@dev')); // Patch composer.json to make sure we have a valid public-dir and install scripts if ($isContao5) { try { $jsonFile = $this->environment->getComposerJsonFile(); $json = $jsonFile->read(); if (!isset($json['extra']['public-dir'])) { $json['extra']['public-dir'] = \basename($this->kernel->getPublicDir()); } foreach (['post-install-cmd', 'post-update-cmd'] as $group) { if (isset($json['scripts'][$group]) && \is_array($json['scripts'][$group])) { foreach ($json['scripts'][$group] as $k => $script) { if ('Contao\\ManagerBundle\\Composer\\ScriptHandler::initializeApplication' === $script) { $json['scripts'][$group][$k] = '@php vendor/bin/contao-setup'; break; } } } elseif (isset($json['scripts'][$group]) && 'Contao\\ManagerBundle\\Composer\\ScriptHandler::initializeApplication' === $json['scripts'][$group]) { $json['scripts'][$group] = '@php vendor/bin/contao-setup'; } } $jsonFile->write($json); } catch (\Exception) { // Ignore } } if ('stable' !== VersionParser::parseStability($version)) { $definition->requirePackage('contao/core-bundle', $version); if (!$isContao5) { $definition->requirePackage('contao/installation-bundle', $version); } elseif (isset($rootRequires['contao/installation-bundle'])) { $definition->removePackage('contao/installation-bundle'); } } else { if (isset($rootRequires['contao/core-bundle'])) { $definition->removePackage('contao/core-bundle'); } if (isset($rootRequires['contao/installation-bundle'])) { $definition->removePackage('contao/installation-bundle'); } } return; } } // Automatically update the core-bundle and installation-bundle when updating Contao // (but only if they are actually installed, like not on the initial installation) foreach ($definition->getUpdates() as $packageName) { if ('contao/manager-bundle' === $packageName) { $localRepository = $this->environment->getComposer()->getRepositoryManager()->getLocalRepository(); if (!empty($localRepository->findPackages('contao/core-bundle'))) { $definition->addUpdate('contao/core-bundle'); } if (!empty($localRepository->findPackages('contao/installation-bundle'))) { $definition->addUpdate('contao/installation-bundle'); } } } } } translator->trans('task.install_packages.title'); } protected function buildOperations(TaskConfig $config) : array { $operations = []; $dryRun = (bool) $config->getOption('dry_run', \false); $supportsMaintenance = $config->getState('supports-maintenance'); if (null === $supportsMaintenance) { $supportsMaintenance = \array_key_exists('contao:maintenance-mode', $this->contaoConsole->getCommandList()); $config->setState('supports-maintenance', $supportsMaintenance); } if ($config->getOption('remove-vendor', \false)) { $operations[] = new RemoveVendorOperation($config, $this->environment, $this->filesystem); } if ($this->environment->useCloudResolver() && !$this->filesystem->exists($this->environment->getLockFile())) { $changes = new CloudChanges(); $changes->setDryRun($dryRun); $operations[] = new CloudOperation($this->cloudResolver, $changes, $config, $this->environment, $this->translator, $this->filesystem, $this->logger); } if ($supportsMaintenance) { $operations[] = new MaintenanceModeOperation($config, $this->processFactory, 'enable'); } $operations[] = new InstallOperation($this->processFactory, $config, $this->environment, $this->translator, $dryRun, !$config->isCancelled()); if ($supportsMaintenance) { $operations[] = new MaintenanceModeOperation($config, $this->processFactory, 'disable'); } return $operations; } } setAudit(!$config->getOption('dry_run', \false))->setCancellable(\true); } public function update(TaskConfig $config, bool $continue = \false) : TaskStatus { $this->createBackup($config); $status = parent::update($config, $continue); if ($status->hasError() || $status->isStopped()) { $this->restoreState($config); } return $status; } public function abort(TaskConfig $config) : TaskStatus { $status = parent::abort($config); if ($status->hasError() || $status->isStopped()) { $this->restoreState($config); } return $status; } /** * Creates a backup of the composer.json and composer.lock file and stores the * currently installed artifacts. */ protected function createBackup(TaskConfig $config) : void { if ($config->getState('backup-created', \false)) { return; } if (!$this->environment->createBackup()) { return; } $config->setState('backup-artifacts', $this->environment->getArtifacts()); $config->setState('backup-created', \true); } /** * Restores the backup files if a backup was created within this task. */ protected function restoreState(TaskConfig $config) : void { if ($config->getState('backup-created', \false) && !$config->getState('backup-restored', \false)) { if (!$this->environment->restoreBackup()) { return; } if (null !== ($previous = $config->getState('backup-artifacts'))) { foreach (\array_diff($this->environment->getArtifacts(), $previous) as $delete) { $this->filesystem->remove($this->environment->getArtifactDir() . '/' . $delete); } } $config->setState('backup-restored', \true); } } } setAutoClose(\true); } protected function getTitle() : string { return $this->translator->trans('task.backup_create.title'); } protected function buildOperations(TaskConfig $config) : array { return [new BackupCreateOperation($this->processFactory)]; } } translator->trans('task.backup_restore.title'); } protected function buildOperations(TaskConfig $config) : array { $file = $config->getOption('file'); $backup = $config->getOption('backup', \false); if (!$file) { throw new BadRequestException(); } $operations = [new BackupRestoreOperation($this->processFactory, $file)]; if ($backup) { \array_unshift($operations, new BackupCreateOperation($this->processFactory)); } return $operations; } } setAutoClose(\true); } protected function getTitle() : string { return $this->translator->trans('task.rebuild_cache.title'); } protected function buildOperations(TaskConfig $config) : array { $supportsMaintenance = $config->getState('supports-maintenance'); $environment = $config->getOption('environment', 'prod'); if (null === $supportsMaintenance) { $supportsMaintenance = \array_key_exists('contao:maintenance-mode', $this->contaoConsole->getCommandList()); $config->setState('supports-maintenance', $supportsMaintenance); } $operations = [new RemoveCacheOperation($environment, $this->kernel, $config, $this->filesystem), new CacheClearOperation($this->processFactory, $environment)]; if (\false !== $config->getOption('warmup', \true)) { $operations[] = new CacheWarmupOperation($this->processFactory, $environment); } else { // Remove cache directory again (contao/contao-manager#655) $operations[] = new RemoveCacheOperation($environment, $this->kernel, $config, $this->filesystem, 'remove-cache-again'); } if ($supportsMaintenance && 'dev' !== $environment) { \array_unshift($operations, new MaintenanceModeOperation($config, $this->processFactory, 'enable')); $operations[] = new MaintenanceModeOperation($config, $this->processFactory, 'disable'); } return $operations; } } 'tasks'])] class TaskManager implements LoggerAwareInterface { use LoggerAwareTrait; private string $configFile; private string $logFile; /** * @var array */ private array $tasks = []; /** * @param iterable $tasks */ public function __construct(iterable $tasks, private readonly ApiKernel $kernel, private readonly ConsoleProcessFactory $processFactory, private readonly AuthorizationCheckerInterface $authorizationChecker, private readonly Filesystem $filesystem) { $this->configFile = $this->kernel->getConfigDir() . \DIRECTORY_SEPARATOR . 'task.json'; $this->logFile = $this->kernel->getLogDir() . '/task-output.log'; foreach ($tasks as $task) { $this->tasks[$task->getName()] = $task; } } public function supportsTask(string $name) : bool { return isset($this->tasks[$name]); } public function hasTask() : bool { return $this->filesystem->exists($this->configFile); } public function createTask(string $name, array $options) : TaskStatus { if ($this->hasTask()) { throw new \RuntimeException('A task already exists.'); } $config = new TaskConfig($this->configFile, $this->filesystem, $this->kernel->getTranslator(), $name, $options); $config->save(); $task = $this->loadTask($config); $status = $task->create($config); foreach ($status->getOperations() as $operation) { foreach ((new \ReflectionClass($operation))->getAttributes(IsGranted::class) as $attribute) { /** @var IsGranted $isGranted */ $isGranted = $attribute->newInstance(); if (!$this->authorizationChecker->isGranted($isGranted->attribute, $isGranted->subject)) { $task->delete($config); if ($isGranted->statusCode) { throw new HttpException($isGranted->statusCode, $isGranted->message ?? '', null, [], $isGranted->exceptionCode ?? 0); } throw new AccessDeniedHttpException($isGranted->message ?? '', null, $isGranted->exceptionCode ?? 0); } } } if (null !== $this->logger) { $this->logger->info('Created new task', ['name' => $name, 'options' => $options, 'class' => $task::class]); } $this->processFactory->createManagerConsoleBackgroundProcess(['task:update', '--poll']); return $status; } public function updateTask(bool $continue = \false) : TaskStatus|null { $config = $this->getTaskConfig(); if (null === $config) { return null; } $task = $this->loadTask($config); if (null !== $this->logger) { $this->logger->info('Updating task status', ['name' => $task->getName(), 'class' => $task::class]); } $status = $task->update($config, $continue); if (null !== $this->logger && $status->isComplete()) { $this->logger->info('Task has been completed', ['name' => $task->getName(), 'class' => $task::class]); } return $status; } public function abortTask() : TaskStatus|null { $config = $this->getTaskConfig(); if (null === $config) { return null; } $task = $this->loadTask($config); if (null !== $this->logger) { $this->logger->info('Aborting task', ['name' => $task->getName(), 'class' => $task::class]); } return $task->abort($config); } public function deleteTask() : TaskStatus|null { $config = $this->getTaskConfig(); if (null === $config) { return null; } $task = $this->loadTask($config); if (null !== $this->logger) { $this->logger->info('Deleting task', ['name' => $task->getName(), 'class' => $task::class]); } $status = $config->isCancelled() ? $task->abort($config) : $task->create($config); if ($status->isActive() || !$task->delete($config)) { throw new \RuntimeException('Active task cannot be deleted'); } $this->saveConsoleOutput($status->getConsole()); return $status; } private function loadTask(TaskConfig $config) : TaskInterface { $name = $config->getName(); if (!isset($this->tasks[$name])) { throw new \InvalidArgumentException(\sprintf('Unable to get task "%s".', $name)); } $task = $this->tasks[$name]; if (!$task instanceof TaskInterface) { throw new \RuntimeException(\sprintf('"%s" is not an instance of "%s"', $task::class, TaskInterface::class)); } return $task; } private function getTaskConfig() : TaskConfig|null { if ($this->filesystem->exists($this->configFile)) { try { return new TaskConfig($this->configFile, $this->filesystem, $this->kernel->getTranslator()); } catch (\Exception) { $this->filesystem->remove($this->configFile); } } return null; } private function saveConsoleOutput(string $output) : void { $rotate = new Rotate($this->logFile); $rotate->keep(50); $rotate->run(); $this->filesystem->dumpFile($this->logFile, $output); } } 'tasks'])] interface TaskInterface { /** * Gets the task name. */ public function getName() : string; /** * Creates a task. */ public function create(TaskConfig $config) : TaskStatus; /** * Updates the task. */ public function update(TaskConfig $config, bool $continue = \false) : TaskStatus; /** * Cancels a task. */ public function abort(TaskConfig $config) : TaskStatus; /** * Deletes a task. */ public function delete(TaskConfig $config) : bool; } initialize(); if (null === $name && null === $options) { return; } $this->data = ['id' => Uuid::uuid4()->toString(), 'name' => $name, 'options' => $options, 'state' => [], 'cancelled' => \false]; } public function getId() : string { $this->initialize(); return $this->data['id'] ?? '--unknown--'; } public function getName() : string { $this->initialize(); return $this->data['name'] ?? '--unknown--'; } public function getOptions() : array { $this->initialize(); return $this->data['options'] ?? []; } public function getOption(string $name, array|bool|float|int|string|null $default = null) : array|bool|float|int|string|null { $this->initialize(); return \array_key_exists($name, $this->data['options']) ? $this->data['options'][$name] : $default; } public function getState(string $name, array|bool|float|int|string|null $default = null) : array|bool|float|int|string|null { $this->initialize(); return \array_key_exists($name, $this->data['state']) ? $this->data['state'][$name] : $default; } public function setState(string $name, array|bool|float|int|string|null $value) : void { $this->initialize(); $this->data['state'][$name] = $value; $this->save(); } public function clearState(string $name) : void { $this->initialize(); unset($this->data['state'][$name]); } public function isCancelled() : bool { $this->initialize(); return (bool) $this->data['cancelled']; } /** * Mark task as cancelled. */ public function setCancelled() : void { $this->initialize(); $this->data['cancelled'] = \true; $this->save(); } } addOption('format', null, InputOption::VALUE_REQUIRED, 'Use "text" or "json" to output the check results accordingly.', 'text'); } protected function execute(InputInterface $input, OutputInterface $output) : int { $problem = $this->integrity->runCliCheck(); $format = $input->getOption('format'); if ('json' === $format) { return $this->writeJson($output, $problem); } if ('text' !== $format) { throw new \InvalidArgumentException(\sprintf('Unknown output format "%s"', $format)); } if (null !== $problem) { $output->writeln('Running PHP ' . \PHP_VERSION); $output->writeln($problem->getTitle()); if ('' !== ($detail = $problem->getDetail())) { $output->writeln(''); $output->writeln($detail); } return Command::FAILURE; } $output->writeln('Running PHP ' . \PHP_VERSION . ', all checks successful.'); return Command::SUCCESS; } private function writeJson(OutputInterface $output, ApiProblem|null $problem = null) : int { $output->write(\json_encode(['version' => \PHP_VERSION, 'version_id' => \PHP_VERSION_ID, 'problem' => $problem?->asArray()], \JSON_UNESCAPED_SLASHES | \JSON_PRETTY_PRINT)); return null === $problem ? Command::SUCCESS : Command::FAILURE; } } updater->supportsUpdate()) { throw new \RuntimeException('Your server does not meet the requirements of the next Contao Manager version.'); } if (!$this->updater->canUpdate()) { throw new \RuntimeException('This build of Contao Manager cannot be automatically updated.'); } return $this->update($output); } protected function configure() : void { } private function update(OutputInterface $output) : int { $result = $this->updater->update(); if (\false === $result) { $output->writeln('Already up-to-date.'); } else { $output->writeln(\sprintf('Updated from version %s to version %s.', $this->updater->getOldVersion(), $this->updater->getNewVersion())); } return Command::SUCCESS; } } taskManager->hasTask()) { $output->writeln('No task is currently active.'); return Command::FAILURE; } $this->taskManager->abortTask(); return parent::execute($input, $output); } } addOption('poll', null, InputOption::VALUE_NONE, 'Poll for updates until the task is completed.')->addOption('interval', null, InputOption::VALUE_REQUIRED, 'Poll interval in seconds.', 1); } protected function execute(InputInterface $input, OutputInterface $output) : int { if (!$this->taskManager->hasTask()) { $output->writeln('No task is currently active.'); return Command::FAILURE; } $status = $this->taskManager->updateTask(); if (null === $status) { return Command::FAILURE; } if (!$output instanceof ConsoleOutput) { return Command::FAILURE; } $style = new SymfonyStyle($input, $output); $style->title($status->getTitle()); $sections = []; $progresses = []; $operations = $status->getOperations(); foreach ($operations as $i => $operation) { $section = $output->section(); $section->writeln(($operation->isRunning() ? ' > ' : ' - ') . $operation->getSummary()); $section->writeln(''); $sections[$i] = $section; } $this->updateOperations($status->getOperations(), $sections, $progresses); if ($input->getOption('poll')) { while ($status->isActive()) { \sleep((int) $input->getOption('interval')); $newStatus = $this->taskManager->updateTask(); if (null === $newStatus) { return Command::FAILURE; } if ($this->updateOperations($newStatus->getOperations(), $sections, $progresses)) { break; } } } match ($status->getStatus()) { TaskStatus::STATUS_COMPLETE => $style->success('Operations completed successfully'), TaskStatus::STATUS_ERROR => $style->error('Task terminated unexpectedly'), TaskStatus::STATUS_STOPPED => $style->warning('Task has been stopped'), default => Command::SUCCESS, }; return Command::SUCCESS; } /** * @param array $operations * @param array $sections * @param array $progresses */ private function updateOperations(array $operations, array $sections, array &$progresses) : bool { foreach ($operations as $i => $operation) { $section = $sections[$i]; $progress = $progresses[$i] ?? null; $this->updateOperation($operation, $section, $progress); if ($progress) { $progresses[$i] = $progress; } if (!$operation->isStarted() || $operation->isRunning()) { return \false; } } return \true; } private function updateOperation(TaskOperationInterface $operation, ConsoleSectionOutput $section, ProgressIndicator|null &$progress) : void { if (!$operation->isStarted()) { return; } $section->clear(); if ($operation->isRunning()) { if (null === $progress) { $progress = new ProgressIndicator($section); $progress->start($operation->getSummary()); } $progress->advance(); $section->writeln(' ' . $operation->getDetails()); $section->writeln(''); return; } if (null !== $progress) { $progress->finish($operation->getSummary()); $section->clear(); $progress = null; } $icon = ''; if ($operation->isSuccessful()) { $icon = \sprintf('%s', '\\' === \DIRECTORY_SEPARATOR ? 'OK' : "✔"); } elseif ($operation->hasError()) { $icon = \sprintf('%s', '\\' === \DIRECTORY_SEPARATOR ? 'ERROR' : "✘"); } $section->writeln(' ' . $icon . ' ' . $operation->getSummary()); $section->writeln(' ' . $operation->getDetails()); $section->writeln(''); } } addArgument('path', InputArgument::REQUIRED, 'Absolute path to the task config file.'); } protected function execute(InputInterface $input, OutputInterface $output) : int { \set_time_limit(0); \ignore_user_abort(\true); $process = new ProcessRunner($input->getArgument('path')); try { $process->run(); } catch (\Exception $exception) { $process->addOutput((string) $exception); $process->stop(); return Command::FAILURE; } return Command::SUCCESS; } } collectData(); $this->outputTable($input, $output, $data); return Command::SUCCESS; } private function outputTable(InputInterface $input, OutputInterface $output, array $data) : void { $io = new SymfonyStyle($input, $output); $osVersion = $data['server']['os_version'] ? ' (' . $data['server']['os_version'] . ')' : ''; $rows = [['Contao Manager'], new TableSeparator(), ['Version', $data['app']['version']], ['Environment', $data['app']['env']], ['Debug', $data['app']['debug'] ? 'true' : 'false'], ['Cache directory', $data['app']['cache_dir']], ['Contao directory', $data['app']['project_dir']], ['Data directory', $data['app']['config_dir']], new TableSeparator(), ['PHP'], new TableSeparator(), ['Version', $data['php']['version']], ['Architecture', $data['php']['arch'] . ' bits'], ['Server API', $data['php']['sapi']], ['Intl locale', $data['php']['locale']], ['Timezone', $data['php']['timezone']], ['Binary Path', $data['php']['binary'] ?: '-- NOT FOUND --'], new TableSeparator(), ['Server'], new TableSeparator(), ['Operating System', $data['server']['os_name'] . $osVersion]]; if (!empty($data['server']['arch'])) { $rows[] = ['Architecture', $data['server']['arch']]; } $rows[] = new TableSeparator(); $rows[] = ['Background Forkers']; $rows[] = new TableSeparator(); foreach ($data['forkers'] as $class => $supported) { $rows[] = [\substr(\strrchr((string) $class, '\\'), 1), $supported ? 'supported' : 'not supported']; } $io->table([], $rows); } private function collectData() : array { $version = $this->getManagerVersion(); $forkers = []; foreach ($this->serverInfo->getProcessForkers() as $class) { $forker = new $class([], $this->serverInfo->getPhpEnv()); $forkers[$class] = $forker->isSupported(); } $data = ['app' => ['version' => $version, 'env' => $this->kernel->getEnvironment(), 'debug' => $this->kernel->isDebug(), 'cache_dir' => $this->kernel->getCacheDir(), 'log_dir' => $this->kernel->getLogDir(), 'project_dir' => $this->kernel->getProjectDir(), 'config_dir' => $this->kernel->getConfigDir()], 'php' => ['version' => \PHP_VERSION, 'version_id' => \PHP_VERSION_ID, 'arch' => \PHP_INT_SIZE * 8, 'sapi' => \PHP_SAPI, 'locale' => \class_exists('Locale', \false) && \Locale::getDefault() ? \Locale::getDefault() : '', 'timezone' => \date_default_timezone_get(), 'binary' => $this->serverInfo->getPhpExecutable()], 'server' => ['os_name' => \php_uname('s'), 'os_version' => \php_uname('r'), 'arch' => \php_uname('m')], 'forkers' => $forkers]; if ($data['server']['os_name'] === $data['server']['os_version']) { $data['server']['os_version'] = ''; $data['server']['arch'] = ''; } return $data; } private function getManagerVersion() : string { $version = ApiKernel::MANAGER_VERSION; if (ApiKernel::VERSION_KEY === $version) { $git = new Process(['git', 'describe', '--tags', '--always']); try { $git->mustRun(); $version = \trim($git->getOutput()); } catch (ProcessFailedException) { return 'n/a'; } } return $version; } } taskManager->hasTask()) { $output->writeln('No task is currently active.'); return Command::FAILURE; } $status = $this->taskManager->deleteTask(); if (null === $status || $status->isActive()) { $output->writeln('Task could not be deleted.'); return Command::FAILURE; } return Command::SUCCESS; } } requestStack->getCurrentRequest())) { $locale = $request->getLocale(); if (5 === \strlen($locale)) { \array_unshift($locales, \substr($locale, 0, 2)); } \array_unshift($locales, $locale); } return $this->replaceParameters($this->findLabel($id, $locales), $params); } /** * Searches for label by ID in the given locales. */ private function findLabel(string $id, array $locales) : string { foreach ($locales as $locale) { $this->load($locale); if (isset($this->labels[$locale][$id]) && ('' !== $this->labels[$locale][$id] || 'en' === $locale)) { return $this->labels[$locale][$id]; } } return $id; } /** * Replaces parameters in label. */ private function replaceParameters(string $label, array $params) : string { if ([] === $params) { return $label; } $replace = []; foreach ($params as $k => $v) { $replace['{' . $k . '}'] = $v; } return \strtr($label, $replace); } /** * Loads labels from file for given locale if it exists. */ private function load(string $locale) : void { if (isset($this->labels[$locale])) { return; } $file = __DIR__ . '/../Resources/i18n/' . $locale . '.yml'; if (!\is_file($file)) { return; } $data = Yaml::parse(\file_get_contents($file)); if (empty($data[$locale]) || !\is_array($data[$locale])) { return; } $this->store($locale, $data[$locale]); } /** * Adds new labels to the label store by flattening array keys. */ private function store(string $locale, array $data, string $prefix = '') : void { foreach ($data as $k => $v) { if (\is_array($v)) { $this->store($locale, $v, $prefix . $k . '.'); } else { $this->labels[$locale][$prefix . $k] = $v; } } } } problem->getStatus(), $this->problem->getTitle(), $previous, $headers, $code); } /** * Gets the API problem. */ public function getApiProblem() : ApiProblem { return $this->problem; } } getExitCode(), $previous); $this->process = $process; } /** * Gets the process object. */ public function getProcess() : Process { return $this->process; } } user; } public function setUser(UserInterface $user) : void { $this->user = $user; } } filename), $code, $previous); $this->jsonError = \json_last_error(); $this->jsonErrorMsg = \json_last_error_msg(); } /** * Gets name of the JSON file. */ public function getFilename() : string { return $this->filename; } /** * Gets the invalid file content. */ public function getContent() : string { return $this->content; } /** * Gets the json_last_error. */ public function getJsonError() : int { return $this->jsonError; } /** * Gets the json_last_error_msg. */ public function getJsonErrorMessage() : string { return $this->jsonErrorMsg; } } url); if (null !== $this->statusCode) { $message .= 'with status code ' . $this->statusCode; } if (null !== $previous) { $message .= ' (' . $previous->getMessage() . ')'; } parent::__construct($message, $previous?->getCode() ?? 0, $previous); } public function getUrl() : string { return $this->url; } public function getStatusCode() : int { return $this->statusCode; } } trans('allow_url_fopen.title'), 'https://php.net/allow_url_fopen'); } } hasGraphicsLib()) { return null; } return (new ApiProblem($this->trans('graphics_lib.title'), 'https://php.net/gd'))->setDetail($this->trans('graphics_lib.detail')); } private function hasGraphicsLib() : bool { if (\function_exists('gd_info') && \version_compare(\constant('GD_VERSION'), '2.0.1', '>')) { return \true; } if (\class_exists('Imagick')) { return \true; } if (\class_exists('Gmagick')) { return \true; } return \false; } } find('unzip') || $finder->find('7z', null, ['C:\\Program Files\\7-Zip']) || !Platform::isWindows() && $finder->find('7zz')) { return null; } return new ApiProblem($this->trans('zip.title'), 'https://getcomposer.org/doc/articles/troubleshooting.md#zip-archives-are-not-unpacked-correctly-'); } } canWriteFileInDirectory($tempdir) || !$this->canWriteFileInDirectory($subdir, \true)) { return (new ApiProblem($this->trans('systempdir.title'), 'https://php.net/open_basedir'))->setDetail($this->trans('systempdir.detail')); } return null; } private function canWriteFileInDirectory(string $path, bool $createDirectory = \false) : bool { if ($createDirectory) { try { $this->filesystem->remove($path); } catch (IOException) { } try { $this->filesystem->mkdir($path); } catch (IOException) { } } $file = $path . '/' . \md5(__FILE__); try { $this->filesystem->touch($file); $result = \is_writable($file); } catch (IOException) { $result = \false; } try { $this->filesystem->remove($file); } catch (IOException) { } if ($createDirectory) { try { $this->filesystem->remove($path); } catch (IOException) { } } return $result; } } trans('process.title'), 'https://php.net/proc_open'))->setDetail($this->trans('process.detail')); } } canCreateSymlinks())) { return null; } return (new ApiProblem($this->trans('symlink.title'), 'https://php.net/symlink'))->setDetail($error); } private function canCreateSymlinks() : string|null { if (!\function_exists('symlink')) { return ''; } try { $tempname = $this->filesystem->tempnam(\sys_get_temp_dir(), ''); $this->filesystem->remove($tempname); $this->filesystem->symlink($this->kernel->getProjectDir(), $tempname); $this->filesystem->remove($tempname); } catch (\Exception $exception) { return $exception->getMessage(); } return null; } } '1', 'use_cookies' => '0']; if (\session_start($options)) { return null; } } catch (\Exception $exception) { $detail = $exception->getMessage(); } return (new ApiProblem($this->trans('session.title'), 'https://php.net/session_start'))->setDetail($detail); } } hasEnoughMemory()) { return null; } return (new ApiProblem($this->trans('memory_limit.title'), 'https://php.net/memory_limit'))->setDetail($this->trans('memory_limit.detail', ['limit' => \trim(\ini_get('memory_limit'))])); } private function hasEnoughMemory() : bool { $memoryLimit = \trim((string) \ini_get('memory_limit')); if ('-1' === $memoryLimit) { return \true; } /** @noinspection SubStrUsedAsArrayAccessInspection */ $unit = \strtolower(\substr($memoryLimit, -1, 1)); $memoryLimit = (int) $memoryLimit; switch ($unit) { case 'g': $memoryLimit *= 1024; // no break case 'm': $memoryLimit *= 1024; // no break (cumulative multiplier) case 'k': $memoryLimit *= 1024; } return $memoryLimit >= 1024 * 1024 * 256; } } checkExtension($extension))) { return $problem; } } return null; } private function checkExtension(string $extension) : ApiProblem|null { if (\extension_loaded($extension)) { return null; } return (new ApiProblem($this->trans($extension . '.title'), 'https://php.net/' . $extension))->setDetail($this->trans($extension . '.detail')); } } translator->trans('integrity.' . $id, $params); } } runChecks(self::$webChecks); } public function runCliCheck() : ApiProblem|null { return $this->runChecks(self::$cliChecks); } public static function getSubscribedServices() : array { return \array_unique(\array_merge(self::$cliChecks, self::$webChecks)); } private function runChecks(array $classes) : ApiProblem|null { foreach ($classes as $class) { /** @var IntegrityCheckInterface $check */ $check = $this->container->get($class); if (($problem = $check->run()) instanceof ApiProblem) { return $problem; } } return null; } } getApiInfo()['version']; } /** * Returns list of available API commands. */ public function getCommands() : array { return $this->getApiInfo()['commands']; } /** * Returns whether the given API command is available. */ public function hasCommand(string $name) : bool { return \in_array($name, $this->getApiInfo()['commands'], \true); } /** * Returns list of available API features. */ public function getFeatures() : array { return $this->getApiInfo()['features']; } public function runCommand(array|string $arguments) : string { $process = $this->processFactory->createContaoApiProcess((array) $arguments); $process->mustRun(); return $process->getOutput(); } /** * @throws ParsingException * @throws ProcessFailedException */ public function runJsonCommand(array|string $arguments) : array|null { $process = $this->processFactory->createContaoApiProcess((array) $arguments); $process->mustRun(); return $this->parseJson($process->getOutput()); } /** * Checks whether the Contao API binary exists. */ private function hasBinary() : bool { return $this->filesystem->exists($this->processFactory->getContaoApiPath()); } /** * Returns version, commands and features of the Contao API. */ private function getApiInfo() : array { if (null !== $this->apiInfo) { return $this->apiInfo; } $default = ['version' => 0, 'commands' => [], 'features' => []]; if (!$this->hasBinary()) { return $this->apiInfo = $default; } try { $process = $this->processFactory->createContaoApiProcess(['version']); $process->mustRun(); } catch (ExceptionInterface) { return $default; } $version = \trim($process->getOutput()); if (\preg_match('/^\\d+$/', $version)) { $default['version'] = (int) $version; return $this->apiInfo = $default; } try { return $this->apiInfo = $this->parseJson($version); } catch (ParsingException $exception) { $default['error'] = $exception->getMessage(); return $this->apiInfo = $default; } } /** * @throws ParsingException */ private function parseJson(string $output) : array|null { $data = \json_decode($output, \true); if (null === $data && \JSON_ERROR_NONE !== \json_last_error()) { $parser = new JsonParser(); $result = $parser->lint($output); if (null !== $result) { throw $result; } } return $data; } } */ private array $forkers = []; /** * @throws \InvalidArgumentException If the working directory does not exist */ public function __construct(array $config, string $workDir) { if (!isset($config['status'])) { $config['status'] = Process::STATUS_READY; } $this->config = $config; parent::__construct($this->config['id'], $workDir); } public function addForker(ForkerInterface $forker) : void { $this->forkers[] = $forker; } /** * Gets the task ID. */ public function getId() : string { return (string) $this->config['id']; } /** * Stores meta information about the process. */ public function setMeta(array $meta) : void { $this->config['meta'] = $meta; $this->saveConfig(\true); } /** * Gets meta information of the process. */ public function getMeta() : array|null { return $this->config['meta'] ?? null; } public function start() : void { if (Process::STATUS_STARTED === $this->config['status']) { return; } $forker = $this->getForker(); $this->saveConfig(\true); $this->config['status'] = Process::STATUS_STARTED; $forker->run($this->setFile); } public function getPid() : int|null { $this->updateStatus(); return isset($this->config['pid']) ? (int) $this->config['pid'] : null; } public function getExitCode() : int|null { $this->updateStatus(); return isset($this->config['exitcode']) ? (int) $this->config['exitcode'] : null; } public function getExitCodeText() : string { if (null === ($exitcode = $this->getExitCode())) { return ''; } return Process::$exitCodes[$exitcode] ?? 'Unknown error'; } public function isSuccessful() : bool { return 0 === $this->getExitCode(); } public function hasBeenSignaled() : bool { return isset($this->config['signaled']) && $this->config['signaled']; } public function getTermSignal() : int|null { return isset($this->config['termsig']) ? (int) $this->config['termsig'] : null; } public function hasBeenStopped() : bool { return isset($this->config['stopped']) && $this->config['stopped']; } public function getStopSignal() : int|null { return isset($this->config['stopsig']) ? (int) $this->config['stopsig'] : null; } public function isRunning() : bool { return Process::STATUS_STARTED === $this->getStatus(); } public function isStarted() : bool { return Process::STATUS_READY !== $this->getStatus(); } public function isTerminated() : bool { return Process::STATUS_TERMINATED === $this->getStatus(); } public function isTimedOut() : bool { return Process::STATUS_TERMINATED === $this->getStatus() && $this->config['timedout'] > 0; } public function getStatus() : string { $this->updateStatus(); return $this->config['status']; } public function stop() : void { $this->config['stop'] = \true; $this->saveConfig(); } public function delete() : void { if ($this->isRunning()) { throw new \LogicException('Cannot delete a running process.'); } $this->close(); } public function getCommandLine() : string { if (!\is_array($this->config['commandline'])) { return (string) $this->config['commandline']; } return \implode(' ', $this->config['commandline']); } public function setCommandLine(array $commandline) : void { $this->config['commandline'] = $commandline; $this->saveConfig(); } public function setWorkingDirectory(string $cwd) : void { $this->config['cwd'] = $cwd; $this->saveConfig(); } public function getOutput() : string { if (!\is_file($this->outputFile)) { return ''; } return \file_get_contents($this->outputFile); } public function setTimeout(int $timeout) : void { $this->config['timeout'] = $timeout; $this->saveConfig(); } public function setIdleTimeout(int $timeout) : void { $this->config['idleTimeout'] = $timeout; $this->saveConfig(); } public function getForker() : ForkerInterface { $class = $this->config['forker'] ?? null; foreach ($this->forkers as $forker) { if (null === $class ? $forker->isSupported() : $forker instanceof $class) { $this->config['forker'] = $forker::class; return $forker; } } throw new \RuntimeException('No forker found for your current platform.'); } public static function create(string $workDir, array $commandline, string|null $cwd = null, string|null $id = null) : self { return new self(['id' => $id ?: \md5(\uniqid('', \true)), 'commandline' => $commandline, 'cwd' => $cwd ?: \getcwd()], $workDir); } public static function restore(string $workDir, string $id) : self { $config = static::readConfig($workDir . '/' . $id . '.set.json'); if (\is_file($getFile = $workDir . '/' . $id . '.get.json')) { $config = \array_merge($config, static::readConfig($getFile)); } return new self($config, $workDir); } private function saveConfig(bool $always = \false) : void { if ($always || Process::STATUS_STARTED === $this->config['status']) { static::writeConfig($this->setFile, $this->config); } } private function updateStatus() : void { if (Process::STATUS_STARTED !== $this->config['status']) { return; } if (\is_file($this->getFile)) { $this->config = \array_merge($this->config, static::readConfig($this->getFile)); } } private function close() : void { $fs = new Filesystem(); $fs->remove($this->setFile); $fs->remove($this->getFile); $fs->remove($this->inputFile); $fs->remove($this->outputFile); } } command = $command; return $this; } public function getCommand() : array { return $this->command; } public function setTimeout(int $timeout) : ForkerInterface { $this->timeout = $timeout; return $this; } public function getTimeout() : int { return $this->timeout; } protected function startCommand(string $commandline) : Process { if (null !== $this->logger) { $this->logger->info('Starting "{commandline}" with {forker_class}', ['commandline' => $commandline, 'forker_class' => static::class]); } $process = Process::fromShellCommandline($commandline); $process->setTimeout(null); $process->setIdleTimeout(null); $process->start(null, $this->env ?: []); \usleep($this->timeout); if (null !== $this->logger && !$process->isStarted()) { $this->logger->error('Process did not start correctly', ['commandline' => $commandline, 'forker_class' => static::class, 'exit_code' => $process->getExitCode(), 'exit_text' => $process->getExitCodeText(), 'stopped' => $process->hasBeenStopped(), 'signaled' => $process->hasBeenSignaled(), 'stopsignal' => $process->getStopSignal(), 'termsignal' => $process->getTermSignal()]); } return $process; } /** * Escapes a string to be used as a shell argument. * * @see Process::escapeArgument() */ protected function escapeArgument(string|null $argument) : string { if ('' === $argument || null === $argument) { return '""'; } if ('\\' !== \DIRECTORY_SEPARATOR) { return "'" . \str_replace("'", "'\\''", $argument) . "'"; } if (\str_contains($argument, "\x00")) { $argument = \str_replace("\x00", '?', $argument); } if (!\preg_match('/[\\/()%!^"<>&|\\s]/', $argument)) { return $argument; } $argument = \preg_replace('/(\\\\+)$/', '$1$1', $argument); return '"' . \str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument) . '"'; } } /dev/null 2>&1 command)), $this->escapeArgument($configFile)); $this->startCommand($commandline); } public function isSupported() : bool { try { Process::fromShellCommandline("exec echo '' & disown")->mustRun(null, $this->env); } catch (ProcessFailedException) { return \false; } return \true; } } /dev/null &1 &', \implode(' ', \array_map([$this, 'escapeArgument'], $this->command)), $this->escapeArgument($configFile)); $this->startCommand($commandline); } public function isSupported() : bool { try { Process::fromShellCommandline('exec nohup ls')->mustRun(null, $this->env); } catch (ProcessFailedException) { return \false; } return \true; } } &1 >nul command)), $this->escapeArgument($configFile)); $this->startCommand($commandline); } public function isSupported() : bool { if ('\\' !== \DIRECTORY_SEPARATOR) { return \false; } try { Process::fromShellCommandline('start /b dir')->mustRun(null, $this->env); } catch (ProcessFailedException) { return \false; } return \true; } } command; $binary = \array_shift($arguments); $commandline = \sprintf('%s %s %s', \escapeshellcmd($binary), \implode(' ', \array_map([$this, 'escapeArgument'], $arguments)), $this->escapeArgument($configFile)); $process = $this->startCommand($commandline); $process->wait(); } public function isSupported() : bool { return \true; } } normalizeOutput(parent::getOutput()); } public function getErrorOutput() : string { return $this->normalizeOutput(parent::getErrorOutput()); } /** * Normalize encoding and try to fix PHP error level issues. */ private function normalizeOutput(string $output) : string { $output = $this->convertEncoding($output); return \implode("\n", \array_filter(\preg_split('/\\r\\n|\\r|\\n/', $output), static fn(string $line): bool => !\str_starts_with($line, 'PHP Warning:') && !\str_starts_with($line, 'Warning:') && !\str_starts_with($line, 'Deprecated:') && !\str_starts_with($line, 'Runtime Notice:') && !\str_starts_with($line, 'Failed loading '))); } private function convertEncoding(string $data) : string { if (\false !== @\json_encode($data)) { return $data; } if (\function_exists('mb_convert_encoding')) { $encoding = null; if (\function_exists('mb_detect_encoding')) { $encoding = \mb_detect_encoding($data, \mb_detect_order(), \true) ?: null; } return \mb_convert_encoding($data, 'UTF-8', $encoding); } if (\function_exists('utf8_encode')) { return \utf8_encode($data); } return $data; } } process = new Utf8Process($commandline, $cwd); $this->loadConfig($config); } public function __destruct() { $this->stop(0); } public function run(int $interval = 1) : int { $this->start(); return $this->wait($interval); } public function start() : void { if ($this->process->isStarted()) { return; } $handler = function ($signo = 15) { $this->signalHandler($signo); return null; }; \register_shutdown_function($handler); if (\function_exists('pcntl_signal')) { \pcntl_signal(\SIGHUP, $handler); \pcntl_signal(\SIGINT, $handler); \pcntl_signal(\SIGQUIT, $handler); \pcntl_signal(\SIGTERM, $handler); } if (\is_file($this->inputFile)) { $this->stdin = \fopen($this->inputFile, 'r'); $this->process->setInput($this->stdin); } $this->process->start(function ($type, $data) : void { $this->addOutput($data); }); $this->saveConfig(); } public function wait(int $interval) : int { do { \usleep($interval * 1000000); try { $this->process->checkTimeout(); $running = $this->process->isRunning(); } catch (ProcessTimedOutException $e) { $this->timeout = $e; $running = \false; } $config = $this->loadConfig(); if ($running && isset($config['stop']) && $config['stop']) { return $this->stop(); } $this->saveConfig(); } while ($running); $this->close(); return $this->process->getExitCode(); } public function stop(int $timeout = 10) : int { if (!$this->process->isRunning()) { return $this->process->getExitCode(); } $exitCode = $this->process->stop($timeout); $this->saveConfig(); $this->close(); return $exitCode; } public function addOutput(string $line) : void { if (!\is_resource($this->stdout)) { $this->stdout = \fopen($this->outputFile, 'w'); } \fwrite($this->stdout, $line); } private function close() : void { if (\is_resource($this->stdin)) { \fclose($this->stdin); } if (\is_resource($this->stdout)) { \fclose($this->stdout); } } private function signalHandler(int $signo) : void { $this->stop(15 === $signo ? 0 : 10); } private function loadConfig(array|null $config = null) : array { if (null === $config) { $config = static::readConfig($this->setFile); } $props = ['timeout' => 'setTimeout', 'idleTimeout' => 'setIdleTimeout']; foreach ($props as $key => $setter) { if (isset($config[$key])) { $this->process->{$setter}($config[$key]); } } return $config; } private function saveConfig() : void { $status = $this->process->getStatus(); $config = ['cwd' => $this->process->getWorkingDirectory(), 'timeout' => $this->process->getTimeout(), 'idleTimeout' => $this->process->getIdleTimeout(), 'pid' => $this->process->getPid(), 'status' => $status]; if (Process::STATUS_TERMINATED === $status) { $config['exitcode'] = $this->process->getExitCode(); $config['signaled'] = $this->process->hasBeenSignaled(); $config['termsig'] = $this->process->getTermSignal(); $config['stopped'] = $this->process->hasBeenStopped(); $config['stopsig'] = $this->process->getStopSignal(); $config['timedout'] = $this->timeoutCode(); } static::writeConfig($this->getFile, $config); } /** * Returns the timeout type. */ private function timeoutCode() : int { if ($this->timeout instanceof ProcessTimedOutException) { if ($this->timeout->isGeneralTimeout()) { return ProcessTimedOutException::TYPE_GENERAL; } if ($this->timeout->isIdleTimeout()) { return ProcessTimedOutException::TYPE_IDLE; } } return 0; } } setFile = $dir . '/' . $id . '.set.json'; $this->getFile = $dir . '/' . $id . '.get.json'; $this->inputFile = $dir . '/' . $id . '.in.log'; $this->outputFile = $dir . '/' . $id . '.out.log'; } /** * @throws InvalidJsonException */ protected static function readConfig(string $filename) : array { // Make sure new process files are found (see // https://github.com/contao/contao-manager/issues/438) \clearstatcache(); $content = @\file_get_contents($filename); if (\false === $content) { throw new \InvalidArgumentException(\sprintf('Config file "%s" is not readable or does not exist.', $filename)); } $config = \json_decode($content, \true); if (!\is_array($config)) { throw new InvalidJsonException($filename, $content); } return $config; } /** * @throws \RuntimeException */ protected static function writeConfig(string $filename, array $config) : void { try { (new Filesystem())->dumpFile($filename, \json_encode($config)); } catch (IOException $ioException) { throw new \RuntimeException(\sprintf('Unable to write config file to %s. ' . $ioException->getMessage(), $filename), 0, $ioException); } } } version) { return $this->version; } $this->getCommandList(\true); // @phpstan-ignore notIdentical.alwaysFalse if (null !== $this->version) { return $this->version; } $process = $this->processFactory->createContaoConsoleProcess(['contao:version']); $process->run(); $version = \trim($process->getOutput()); try { // Run parser to check whether a valid version was returned $parser = new VersionParser(); $parser->normalize($version); } catch (\UnexpectedValueException) { throw new ProcessOutputException('Console output is not a valid version string.', $process); } return $this->version = $version; } public function getCommandList(bool $throw = \false) : array { if (null !== $this->commands) { return $this->commands; } $process = $this->processFactory->createContaoConsoleProcess(['list', '--format=json']); $process->run(); // If the console does not work, we don't have any command support. if (!$process->isSuccessful() || !\is_array($data = \json_decode(\trim($process->getOutput()), \true))) { if ($throw) { throw new ProcessOutputException('Unable to retrieve console commands.', $process); } return $this->commands = []; } if ('Contao Managed Edition' === ($data['application']['name'] ?? '') && isset($data['application']['version'])) { try { // Run parser to check whether a valid version was returned $parser = new VersionParser(); $parser->normalize($data['application']['version']); $this->version = $data['application']['version']; } catch (\UnexpectedValueException) { // ignore version from command list } } return $this->commands = $this->normalizeCommands($data['commands'] ?? []); } public function getConfig() : array|null { if (null !== $this->config) { return $this->config; } $commands = $this->getCommandList(); if (!isset($commands['debug:config']['options']) || !\in_array('format', $commands['debug:config']['options'], \true)) { return $this->config = []; } $process = $this->processFactory->createContaoConsoleProcess(['debug:config', 'contao', '--format=json', '--resolve-env']); $process->run(); // If the console does not work, we don't have any command support. if (!$process->isSuccessful() || !\is_array($data = \json_decode(\trim($process->getOutput()), \true))) { return $this->config = []; } return $this->config = $data['contao'] ?? []; } public function checkDatabaseMigrations() : array|null { $commands = $this->getCommandList(); if (!isset($commands['contao:migrate']['options']) || !\in_array('format', $commands['contao:migrate']['options'], \true) || !\in_array('dry-run', $commands['contao:migrate']['options'], \true)) { return null; } $arguments = ['contao:migrate', '--format=ndjson', '--dry-run', '--no-interaction']; if (\in_array('no-backup', $commands['contao:migrate']['options'], \true)) { $arguments[] = '--no-backup'; } $process = $this->processFactory->createContaoConsoleProcess($arguments); $process->run(); $output = \trim($process->getOutput()); // Process could exit with error but still output JSON if (!$process->isSuccessful() && !\str_starts_with($output, '{')) { return ['type' => 'error', 'total' => 1, 'message' => $process->getOutput() . $process->getErrorOutput(), 'warnings' => 0]; } $warnings = 0; if ('' !== $output) { $lines = \explode("\n", $output); while ($line = \array_shift($lines)) { $data = \json_decode($line, \true); $type = $data['type'] ?? null; if ('warning' === $type) { ++$warnings; continue; } if ('error' === $type || 'problem' === $type) { return ['type' => $type, 'total' => 1, 'message' => $data['message'] ?? '', 'warnings' => $warnings]; } if ('migration-pending' === $type && !empty($data['names'])) { return ['type' => 'migration', 'total' => \count($data['names']), 'warnings' => $warnings]; } if ('schema-pending' === $type && !empty($data['commands'])) { return ['type' => 'schema', 'total' => \count($data['commands']), 'warnings' => $warnings]; } } } return ['type' => 'empty', 'total' => 0, 'warnings' => $warnings]; } public function getUsers(bool $throw = \false) : array|null { $commands = $this->getCommandList(); if (!isset($commands['contao:user:list']['options']) || !\in_array('format', $commands['contao:user:list']['options'], \true) || !\in_array('column', $commands['contao:user:list']['options'], \true)) { return null; } $arguments = ['contao:user:list', '--format=json', '--column=username', '--column=name', '--column=admin', '--column=dateAdded', '--column=lastLogin', '--no-interaction']; $process = $this->processFactory->createContaoConsoleProcess($arguments); $process->run(); if (!$process->isSuccessful()) { if ($throw) { throw new ProcessFailedException($process); } return null; } $data = \json_decode($process->getOutput(), \true); if (!\is_array($data)) { if ($throw) { throw new ProcessOutputException('Unable to list Contao users', $process); } return null; } return $data; } /** * @throws \RuntimeException * @throws ProcessFailedException */ public function createBackendUser(array $user, string $password, bool $admin = \true) : void { $commands = $this->getCommandList(); if (!isset($commands['contao:user:create']['options']) || $admin && !\in_array('admin', $commands['contao:user:create']['options'], \true) || [] !== \array_diff(\array_keys($user), $commands['contao:user:create']['options'])) { throw new \RuntimeException('Unsupported argument to the contao:user:create command.'); } $arguments = ['contao:user:create']; foreach ($user as $k => $v) { $arguments[] = '--' . $k . '=' . $v; } if ($admin) { $arguments[] = '--admin'; } if (Platform::isWindows()) { $arguments[] = '--password=' . $password; } $process = $this->processFactory->createContaoConsoleProcess($arguments); if (!Platform::isWindows()) { $process->setInput($password . \PHP_EOL . $password . \PHP_EOL); // Password and confirmation } $process->mustRun(); } private function normalizeCommands(array $commands) : array { $data = []; foreach ($commands as $command) { $data[$command['name']] = ['arguments' => \array_keys($command['definition']['arguments'] ?? []), 'options' => \array_keys($command['definition']['options'] ?? [])]; } return $data; } } findBestBinary($paths); } if ($bin = \constant('PHP_BINARY')) { if (\false !== ($suffix = \strrchr(\basename($bin), '-'))) { $php = \substr($bin, 0, -\strlen($suffix)); $paths[] = $php . '-cli'; $paths[] = $php; } $paths[] = $bin . '-cli'; $paths[] = $bin; $this->includePath($paths, \dirname($bin)); } if (\defined('PHP_BINDIR') && '' !== \PHP_BINDIR) { $this->includePath($paths, \PHP_BINDIR); } if ($php = \getenv('PHP_PATH')) { $paths[] = $php; } if ($php = \getenv('PHP_PEAR_PHP_BIN')) { $paths[] = $php; } $paths[] = '/usr/bin/php'; $paths = \array_merge($paths, $this->findExecutables()); $paths = \array_unique($paths); \ksort($paths); return $this->findBestBinary($paths); } public function getServerInfo(string $cli) : array|null { $phar = \Phar::running(\false); $arguments = [$cli, '-q']; $arguments[] = $phar ?: \dirname(__DIR__) . '/console'; $arguments[] = 'test'; try { $process = new Process($arguments); $process->mustRun(null, \array_map(static fn(): bool => \false, $_ENV)); $output = @\json_decode(\trim($process->getOutput()), \true); if (null === $output) { throw new RuntimeException('Unexpected output from "' . \implode(' ', $arguments) . '": ' . $process->getOutput()); } return $output; } catch (RuntimeException $exception) { // Do not log every attempt to find a PHP binary (exit code 127 = Command not found) if (127 === $process->getExitCode()) { return null; } $this->logger->error($exception->getMessage(), ['exception' => $exception]); throw $exception; } } /** * Finds PHP executables within open_basedir or PATH environment variable. */ private function findExecutables() : array { $results = []; if (\ini_get('open_basedir')) { $searchPath = \explode(\PATH_SEPARATOR, \ini_get('open_basedir')); $dirs = []; foreach ($searchPath as $path) { // Silencing against https://bugs.php.net/69240 if (@\is_dir($path)) { $dirs[] = $path; } elseif (@\is_executable($path) && \in_array(\basename($path), $this->names, \true)) { $results[] = $path; } } } else { $dirs = []; if ($path = \getenv('PATH') ?: \getenv('Path')) { $dirs = \explode(\PATH_SEPARATOR, $path); } if ('\\' === \DIRECTORY_SEPARATOR) { $dirs[] = 'C:\\xampp\\php\\'; } } $suffixes = ['']; if ('\\' === \DIRECTORY_SEPARATOR) { $pathExt = \getenv('PATHEXT'); $suffixes = \array_merge($suffixes, $pathExt ? \explode(\PATH_SEPARATOR, $pathExt) : ['.exe', '.bat', '.cmd', '.com']); } foreach ($this->names as $name) { foreach ($suffixes as $suffix) { foreach ($dirs as $dir) { if (@\is_file($file = $dir . \DIRECTORY_SEPARATOR . $name . $suffix) && ('\\' === \DIRECTORY_SEPARATOR || \is_executable($file))) { $results[] = $file; } } } } return $results; } private function findBestBinary(array $paths) : string|null { $fallbackPath = null; $fallbackSapi = null; if ($openBasedir = \ini_get('open_basedir')) { $openBasedir = \explode(\PATH_SEPARATOR, $openBasedir); } foreach ($paths as $path) { // we only test for is_executable if no open_basedir restrictions are set or the // target is within allowed paths. If the path is not within open_basedir we can // still execute the binary on the command line and check the version. if ((!$openBasedir || $this->isAllowed($path, $openBasedir)) && !\is_executable($path)) { continue; } try { $info = $this->getServerInfo($path); } catch (RuntimeException) { continue; } if (!\is_array($info)) { continue; } if ('cli' === $info['sapi'] && \version_compare(\PHP_VERSION, $info['version'], 'eq')) { return $path; } $vWeb = \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION; $vCli = \vsprintf('%s.%s', \explode('.', (string) $info['version'])); // Ignore binary if minor version does not match if (!\version_compare($vWeb, $vCli, 'eq')) { continue; } // Allow fallback to another patch version of the same PHP major/minor and prefer // a CLI SAPI over e.g. a CGI SAPI. if (null === $fallbackPath || 'cli' !== $fallbackSapi && 'cli' === $info['sapi']) { $fallbackPath = $path; $fallbackSapi = $info['sapi']; } } return $fallbackPath; } /** * Tests if the given path is within any of the given directories. */ private function isAllowed(string $path, array $dirs) : bool { foreach ($dirs as $dir) { if (\str_starts_with($path, (string) $dir)) { return \true; } } return \false; } /** * Adds the all binaries for given path to paths array. */ private function includePath(array &$paths, string $path) : void { foreach ($this->names as $name) { $paths[] = $path . \DIRECTORY_SEPARATOR . $name; } } } 'tasks'])] class ConsoleProcessFactory implements LoggerAwareInterface { use LoggerAwareTrait; public function __construct(private readonly ApiKernel $kernel, private readonly ServerInfo $serverInfo, private readonly Filesystem $filesystem) { } /** * Gets the path to manager console or Phar file. */ public function getManagerConsolePath() : string { if ('' !== ($phar = \Phar::running(\false))) { return $phar; } return $this->kernel->getRootDir() . '/console'; } /** * Gets the path to the Contao console. */ public function getContaoConsolePath() : string { $contaoPath = $this->kernel->getProjectDir() . '/vendor/contao/contao/manager-bundle/bin/contao-console'; if ($this->kernel->isDebug() && $this->filesystem->exists($contaoPath)) { return $contaoPath; } return $this->kernel->getProjectDir() . '/vendor/contao/manager-bundle/bin/contao-console'; } /** * Gets the path to the Contao API. */ public function getContaoApiPath() : string { $contaoPath = $this->kernel->getProjectDir() . '/vendor/contao/contao/manager-bundle/bin/contao-api'; if ($this->kernel->isDebug() && $this->filesystem->exists($contaoPath)) { return $contaoPath; } return $this->kernel->getProjectDir() . '/vendor/contao/manager-bundle/bin/contao-api'; } /** * Creates a foreground process for the Manager console. */ public function createManagerConsoleProcess(array $arguments) : Process { \array_unshift($arguments, $this->getManagerConsolePath()); return $this->createForegroundProcess($arguments); } /** * Creates a background process for the Manager console. */ public function createManagerConsoleBackgroundProcess(array $arguments, string|null $id = null) : ProcessController { \array_unshift($arguments, $this->getManagerConsolePath()); return $this->createBackgroundProcess($arguments, $id); } /** * Creates a foreground process for the Contao console. */ public function createContaoConsoleProcess(array $arguments) : Process { \array_unshift($arguments, $this->getContaoConsolePath()); return $this->createForegroundProcess($arguments); } /** * Creates a background process for the Contao console. */ public function createContaoConsoleBackgroundProcess(array $arguments, string|null $id = null) : ProcessController { \array_unshift($arguments, $this->getContaoConsolePath()); return $this->createBackgroundProcess($arguments, $id); } /** * Creates a foreground process for the Contao API. */ public function createContaoApiProcess(array $arguments) : Process { \array_unshift($arguments, $this->getContaoApiPath()); return $this->createForegroundProcess($arguments); } /** * Restores the ProcessController for given task ID. * * @throws ApiProblemException */ public function restoreBackgroundProcess(string $id) : ProcessController { try { $process = ProcessController::restore($this->kernel->getConfigDir(), $id); } catch (InvalidJsonException $exception) { $problem = (new ApiProblem($exception->getMessage()))->setDetail($exception->getJsonErrorMessage() . "\n\n" . $exception->getContent()); throw new ApiProblemException($problem, $exception); } $this->addForkers($process); return $process; } /** * Creates a foreground process. */ private function createForegroundProcess(array $arguments) : Process { return (new Utf8Process($this->addPhpRuntime($arguments), $this->kernel->getProjectDir(), $this->serverInfo->getPhpEnv()))->setTimeout(0); } /** * Creates a background process controller. */ private function createBackgroundProcess(array $arguments, string|null $id = null) : ProcessController { $process = ProcessController::create($this->kernel->getConfigDir(), $this->addPhpRuntime($arguments), $this->kernel->getProjectDir(), $id); $process->setTimeout(0); $this->addForkers($process); return $process; } /** * Adds forker instances to the process controller. */ private function addForkers(ProcessController $process) : void { $backgroundCommand = $this->addPhpRuntime([$this->getManagerConsolePath(), '--no-interaction', 'run']); foreach ($this->serverInfo->getProcessForkers() as $class) { $forker = new $class($backgroundCommand, $this->serverInfo->getPhpEnv(), $this->logger); $forker->setTimeout(5000); $process->addForker($forker); } } /** * Adds PHP runtime to console arguments. */ private function addPhpRuntime(array $arguments) : array { if (null === ($phpCli = $this->serverInfo->getPhpExecutable())) { return $arguments; } $defaultArgs = [$phpCli, '-q']; if ($this->filesystem->exists($this->kernel->getConfigDir() . '/php.ini')) { $defaultArgs[] = '-c'; $defaultArgs[] = $this->kernel->getConfigDir() . '/php.ini'; } $defaultArgs[] = '-dmax_execution_time=0'; $defaultArgs[] = '-dmemory_limit=-1'; $defaultArgs[] = '-ddisplay_errors=0'; $defaultArgs[] = '-ddisplay_startup_errors=0'; $defaultArgs[] = '-derror_reporting=0'; $defaultArgs[] = '-dallow_url_fopen=1'; $defaultArgs[] = '-ddisable_functions='; $defaultArgs[] = '-ddate.timezone=' . @\date_default_timezone_get(); return \array_merge($defaultArgs, $arguments); } } check(); unset($xdebug); if (\function_exists('ini_set')) { @\ini_set('display_errors', 1); @\ini_set('zlib.output_compression', 0); // Set user defined memory limit if ($memoryLimit = \getenv('COMPOSER_MEMORY_LIMIT')) { @\ini_set('memory_limit', $memoryLimit); } else { $memoryInBytes = static function ($value) { $unit = \strtolower(\substr($value, -1, 1)); $value = (int) $value; switch ($unit) { /** @noinspection PhpMissingBreakStatementInspection */ case 'g': $value *= 1024; // no break (cumulative multiplier) /** @noinspection PhpMissingBreakStatementInspection */ case 'm': $value *= 1024; // no break (cumulative multiplier) case 'k': $value *= 1024; } return $value; }; $memoryLimit = \trim(\ini_get('memory_limit')); // Increase memory_limit if it is lower than 1.5GB if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) { @\ini_set('memory_limit', '1536M'); } unset($memoryInBytes); } unset($memoryLimit); } // Workaround PHP bug on Windows where env vars containing Unicode chars are mangled in $_SERVER // see https://github.com/php/php-src/issues/7896 if (\PHP_VERSION_ID >= 70113 && (\PHP_VERSION_ID < 80016 || \PHP_VERSION_ID >= 80100 && \PHP_VERSION_ID < 80103) && Platform::isWindows()) { foreach ($_SERVER as $serverVar => $serverVal) { if (($serverVal = \getenv($serverVar)) !== \false) { $_SERVER[$serverVar] = $serverVal; } } } Platform::putEnv('COMPOSER_BINARY', \realpath($_SERVER['argv'][0])); // Always create kernel to initialize the application $kernel = new ApiKernel('prod' === 'prod' ? 'prod' : 'dev'); $input = new ArgvInput(); switch ($input->getFirstArgument()) { // This "test" command is only for the dev version, if the Phar is compiled this is done in the stub.php case 'test': die(\json_encode(['version' => \PHP_VERSION, 'version_id' => \PHP_VERSION_ID, 'sapi' => \PHP_SAPI])); case 'composer': $application = new ComposerApplication(); $argv = $_SERVER['argv']; \array_shift($argv); $input = new ArgvInput($argv); break; default: $application = new ApiApplication($kernel); } $application->run($input); inner->setDefaultLocale($event); } public function onKernelRequest(RequestEvent $event) : void { $this->inner->onKernelRequest($event); $request = $event->getRequest(); if ($locale = $request->getPreferredLanguage()) { $request->setLocale($locale); } } public function onKernelFinishRequest(FinishRequestEvent $event) : void { $this->inner->onKernelFinishRequest($event); } public static function getSubscribedEvents() : array { return BaseLocaleListener::getSubscribedEvents(); } } getRequest()->getAcceptableContentTypes(), \true)) { return; } Response::closeOutputBuffers(0, \false); $exception = $this->convertException($event->getThrowable()); $this->logException($exception); $response = ApiProblemResponse::createFromException($exception, $this->debug); $event->setResponse($response); } /** * Logs the exception if a logger is available. */ private function logException(\Throwable $exception) : void { $message = \sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', $exception::class, $exception->getMessage(), $exception->getFile(), $exception->getLine()); if (!$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500) { $this->logger->critical($message, ['exception' => $exception]); } else { $this->logger->error($message, ['exception' => $exception]); } } /** * Tries to convert known exceptions to a HttpException. */ private function convertException(\Throwable $exception) : \Throwable { return match (\true) { $exception instanceof AccessDeniedException, $exception instanceof AuthenticationException => new AccessDeniedHttpException($exception->getMessage(), $exception), default => $exception, }; } } isMainRequest() || $this->jwtManager->hasResponseToken($event->getResponse())) { return; } $token = $this->tokenStorage->getToken(); if (null !== $token && $token->hasAttribute('authenticator') && JwtAuthenticator::class === $token->getAttribute('authenticator') && $this->authorizationChecker->isGranted('ROLE_USER')) { $this->jwtManager->addToken($event->getRequest(), $event->getResponse(), $token); } else { $this->jwtManager->removeToken($event->getRequest(), $event->getResponse()); } } } getPassport(); if (!$passport->hasBadge(TotpBadge::class)) { return; } /** @var TotpBadge $badge */ $badge = $passport->getBadge(TotpBadge::class); $user = $passport->getUser(); if ($badge->isResolved() || !$user instanceof User) { return; } $badge->verify($user); } } getRequest(); $content = $request->getContent(); if ('' === $content && $request->attributes->get('form-data')) { return; } $data = []; if ('' !== $content) { if ('json' !== $request->getContentTypeFormat()) { throw new UnsupportedMediaTypeHttpException('Only JSON requests are supported.'); } $data = \json_decode($content, \true); if (!\is_array($data)) { throw new BadRequestHttpException('Invalid JSON data received.'); } } $request->request->replace($data); } } setTimeout(function() { window.location.reload(true) }, 5000)'; } die("Contao Manager was downgraded to the latest version supported by your PHP version.\n{$reload}"); } } /** * @see Composer\Util\StreamContextFactory */ class StreamContextFactory { /** * Creates a context supporting HTTP proxies * * @param string $url URL the context is to be used for * @param array $defaultOptions Options to merge with the default * @param array $defaultParams Parameters to specify on the context * @throws \RuntimeException if https proxy required and OpenSSL uninstalled * @return resource Default context */ public static function getContext($url, array $defaultOptions = array(), array $defaultParams = array()) { $options = array('http' => array( // specify defaults again to try and work better with curlwrappers enabled 'follow_location' => 1, 'max_redirects' => 20, )); // Handle HTTP_PROXY/http_proxy on CLI only for security reasons if ((\PHP_SAPI === 'cli' || \PHP_SAPI === 'phpdbg') && (!empty($_SERVER['HTTP_PROXY']) || !empty($_SERVER['http_proxy']))) { $proxy = \parse_url(!empty($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']); } // Prefer CGI_HTTP_PROXY if available if (!empty($_SERVER['CGI_HTTP_PROXY'])) { $proxy = \parse_url($_SERVER['CGI_HTTP_PROXY']); } // Override with HTTPS proxy if present and URL is https if (\preg_match('{^https://}i', $url) && (!empty($_SERVER['HTTPS_PROXY']) || !empty($_SERVER['https_proxy']))) { $proxy = \parse_url(!empty($_SERVER['https_proxy']) ? $_SERVER['https_proxy'] : $_SERVER['HTTPS_PROXY']); } // Remove proxy if URL matches no_proxy directive if ((!empty($_SERVER['NO_PROXY']) || !empty($_SERVER['no_proxy'])) && \parse_url($url, \PHP_URL_HOST)) { $pattern = new NoProxyPattern(!empty($_SERVER['no_proxy']) ? $_SERVER['no_proxy'] : $_SERVER['NO_PROXY']); if ($pattern->test($url)) { unset($proxy); } } if (!empty($proxy)) { $proxyURL = isset($proxy['scheme']) ? $proxy['scheme'] . '://' : ''; $proxyURL .= isset($proxy['host']) ? $proxy['host'] : ''; if (isset($proxy['port'])) { $proxyURL .= ":" . $proxy['port']; } elseif ('http://' === \substr($proxyURL, 0, 7)) { $proxyURL .= ":80"; } elseif ('https://' === \substr($proxyURL, 0, 8)) { $proxyURL .= ":443"; } // http(s):// is not supported in proxy $proxyURL = \str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyURL); if (0 === \strpos($proxyURL, 'ssl:') && !\extension_loaded('openssl')) { throw new \RuntimeException('You must enable the openssl extension to use a proxy over https'); } $options['http']['proxy'] = $proxyURL; // enabled request_fulluri unless it is explicitly disabled switch (\parse_url($url, \PHP_URL_SCHEME)) { case 'http': // default request_fulluri to true $reqFullUriEnv = \getenv('HTTP_PROXY_REQUEST_FULLURI'); if ($reqFullUriEnv === \false || $reqFullUriEnv === '' || \strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv) { $options['http']['request_fulluri'] = \true; } break; case 'https': // default request_fulluri to true $reqFullUriEnv = \getenv('HTTPS_PROXY_REQUEST_FULLURI'); if ($reqFullUriEnv === \false || $reqFullUriEnv === '' || \strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv) { $options['http']['request_fulluri'] = \true; } break; } // add SNI opts for https URLs if ('https' === \parse_url($url, \PHP_URL_SCHEME)) { $options['ssl']['SNI_enabled'] = \true; if (\PHP_VERSION_ID < 50600) { $options['ssl']['SNI_server_name'] = \parse_url($url, \PHP_URL_HOST); } } // handle proxy auth if present if (isset($proxy['user'])) { $auth = \rawurldecode($proxy['user']); if (isset($proxy['pass'])) { $auth .= ':' . \rawurldecode($proxy['pass']); } $auth = \base64_encode($auth); // Preserve headers if already set in default options if (isset($defaultOptions['http']['header'])) { if (\is_string($defaultOptions['http']['header'])) { $defaultOptions['http']['header'] = array($defaultOptions['http']['header']); } $defaultOptions['http']['header'][] = "Proxy-Authorization: Basic {$auth}"; } else { $options['http']['header'] = array("Proxy-Authorization: Basic {$auth}"); } } } $options = \array_replace_recursive($options, $defaultOptions); if (isset($options['http']['header'])) { $options['http']['header'] = self::fixHttpHeaderField($options['http']['header']); } if (\defined('_ContaoManager\\HHVM_VERSION')) { $phpVersion = 'HHVM ' . \_ContaoManager\HHVM_VERSION; } else { $phpVersion = 'PHP ' . \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION . '.' . \PHP_RELEASE_VERSION; } if (!isset($options['http']['header']) || \false === \stripos(\implode('', $options['http']['header']), 'user-agent')) { $options['http']['header'][] = \sprintf('User-Agent: Contao Manager/@package_version@ (%s; %s; %s%s)', \function_exists('php_uname') ? \php_uname('s') : 'Unknown', \function_exists('php_uname') ? \php_uname('r') : 'Unknown', $phpVersion, \getenv('CI') ? '; CI' : ''); } return \stream_context_create($options, $defaultParams); } /** * A bug in PHP prevents the headers from correctly being sent when a content-type header is present and * NOT at the end of the array * * This method fixes the array by moving the content-type header to the end * * @link https://bugs.php.net/bug.php?id=61548 * @param string|array $header * @return array */ private static function fixHttpHeaderField($header) { if (!\is_array($header)) { $header = \explode("\r\n", $header); } \uasort($header, function ($el) { return \stripos($el, 'content-type') === 0 ? 1 : -1; }); return $header; } } /** * @see Composer\Util\NoProxyPattern */ class NoProxyPattern { /** * @var string[] */ protected $rules = array(); /** * @param string $pattern no_proxy pattern */ public function __construct($pattern) { $this->rules = \preg_split("/[\\s,]+/", $pattern); } /** * Test a URL against the stored pattern. * * @param string $url * * @return bool true if the URL matches one of the rules. */ public function test($url) { $host = \parse_url($url, \PHP_URL_HOST); $port = \parse_url($url, \PHP_URL_PORT); if (empty($port)) { switch (\parse_url($url, \PHP_URL_SCHEME)) { case 'http': $port = 80; break; case 'https': $port = 443; break; } } foreach ($this->rules as $rule) { if ($rule === '*') { return \true; } list($ruleHost) = \explode(':', $rule); list($base) = \explode('/', $ruleHost); if (\filter_var($base, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { // ip or cidr match if (!isset($ip)) { $ip = \gethostbyname($host); } if (\strpos($ruleHost, '/') === \false) { $match = $ip === $ruleHost; } else { // gethostbyname() failed to resolve $host to an ip, so we assume // it must be proxied to let the proxy's DNS resolve it if ($ip === $host) { $match = \false; } else { // match resolved IP against the rule $match = self::inCIDRBlock($ruleHost, $ip); } } } else { // match end of domain $haystack = '.' . \trim($host, '.') . '.'; $needle = '.' . \trim($ruleHost, '.') . '.'; $match = \stripos(\strrev($haystack), \strrev($needle)) === 0; } // final port check if ($match && \strpos($rule, ':') !== \false) { list(, $rulePort) = \explode(':', $rule); if (!empty($rulePort) && $port != $rulePort) { $match = \false; } } if ($match) { return \true; } } return \false; } /** * Check an IP address against a CIDR * * http://framework.zend.com/svn/framework/extras/incubator/library/ZendX/Whois/Adapter/Cidr.php * * @param string $cidr IPv4 block in CIDR notation * @param string $ip IPv4 address * * @return bool */ private static function inCIDRBlock($cidr, $ip) { // Get the base and the bits from the CIDR list($base, $bits) = \explode('/', $cidr); // Now split it up into it's classes list($a, $b, $c, $d) = \explode('.', $base); // Now do some bit shifting/switching to convert to ints $i = ($a << 24) + ($b << 16) + ($c << 8) + $d; $mask = $bits == 0 ? 0 : ~0 << 32 - $bits; // Here's our lowest int $low = $i & $mask; // Here's our highest int $high = $i | ~$mask & 0xffffffff; // Now split the ip we're checking against up into classes list($a, $b, $c, $d) = \explode('.', $ip); // Now convert the ip we're checking against to an int $check = ($a << 24) + ($b << 16) + ($c << 8) + $d; // If the ip is within the range, including highest/lowest values, // then it's within the CIDR range return $check >= $low && $check <= $high; } } if (\PHP_VERSION_ID < 80100) { ContaoManagerDowngrade::run(); } { "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], "hash": "e5afe72073d9266712c8e1ddc1648513", "packages": [], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=5.3" }, "platform-dev": [] } Copyright (c) 2015 Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PHAR Utils ========== PHAR file format utilities, for when PHP phars you up. Installation ------------ `composer require seld/phar-utils` API --- ### `Seld\PharUtils\Timestamps` - `__construct($pharFile)` > Load a phar file in memory. - `updateTimestamps($timestamp = null)` > Updates each file's unix timestamps in the PHAR so the PHAR signature > can be produced in a reproducible manner. - `save($path, $signatureAlgo = '')` > Saves the updated phar file with an updated signature. > Algo must be one of `Phar::MD5`, `Phar::SHA1`, `Phar::SHA256` > or `Phar::SHA512` ### `Seld\PharUtils\Linter` - `Linter::lint($pharFile)` > Lints all php files inside a given phar with the current PHP version. Requirements ------------ PHP 5.3 and above License ------- PHAR Utils is licensed under the MIT License - see the LICENSE file for details { "name": "seld\/phar-utils", "description": "PHAR file format utilities, for when PHP phars you up", "type": "library", "keywords": [ "phar" ], "license": "MIT", "require": { "php": ">=5.3" }, "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be" } ], "autoload": { "psr-4": { "_ContaoManager\\Seld\\PharUtils\\": "src\/" } }, "extra": { "branch-alias": { "dev-master": "1.x-dev" } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\PharUtils; class Linter { /** * Lints all php files inside a given phar with the current PHP version * * @param string $path Phar file path * @param list $excludedPaths Paths which should be skipped by the linter */ public static function lint($path, array $excludedPaths = array()) { $php = \defined('PHP_BINARY') ? \PHP_BINARY : 'php'; if ($isWindows = \defined('PHP_WINDOWS_VERSION_BUILD')) { $tmpFile = @\tempnam(\sys_get_temp_dir(), ''); if (!$tmpFile || !\is_writable($tmpFile)) { throw new \RuntimeException('Unable to create temp file'); } $php = self::escapeWindowsPath($php); $tmpFile = self::escapeWindowsPath($tmpFile); // PHP 8 encloses the command in double-quotes if (\PHP_VERSION_ID >= 80000) { $format = '%s -l %s'; } else { $format = '"%s -l %s"'; } $command = \sprintf($format, $php, $tmpFile); } else { $command = "'" . $php . "' -l"; } $descriptorspec = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')); // path to phar + phar:// + trailing slash $baseLen = \strlen(\realpath($path)) + 7 + 1; foreach (new \RecursiveIteratorIterator(new \Phar($path)) as $file) { if ($file->isDir()) { continue; } if (\substr($file, -4) === '.php') { $filename = (string) $file; if (\in_array(\substr($filename, $baseLen), $excludedPaths, \true)) { continue; } if ($isWindows) { \file_put_contents($tmpFile, \file_get_contents($filename)); } $process = \proc_open($command, $descriptorspec, $pipes); if (\is_resource($process)) { if (!$isWindows) { \fwrite($pipes[0], \file_get_contents($filename)); } \fclose($pipes[0]); $stdout = \stream_get_contents($pipes[1]); \fclose($pipes[1]); $stderr = \stream_get_contents($pipes[2]); \fclose($pipes[2]); $exitCode = \proc_close($process); if ($exitCode !== 0) { if ($isWindows) { $stderr = \str_replace($tmpFile, $filename, $stderr); } throw new \UnexpectedValueException('Failed linting ' . $file . ': ' . $stderr); } } else { throw new \RuntimeException('Could not start linter process'); } } } if ($isWindows) { @\unlink($tmpFile); } } /** * Escapes a Windows file path * * @param string $path * @return string The escaped path */ private static function escapeWindowsPath($path) { // Quote if path contains spaces or brackets if (\strpbrk($path, " ()") !== \false) { $path = '"' . $path . '"'; } return $path; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\PharUtils; class Timestamps { private $contents; /** * @param string $file path to the phar file to use */ public function __construct($file) { $this->contents = \file_get_contents($file); } /** * Updates each file's unix timestamps in the PHAR * * The PHAR signature can then be produced in a reproducible manner. * * @param int|\DateTimeInterface|string $timestamp Date string or DateTime or unix timestamp to use */ public function updateTimestamps($timestamp = null) { if ($timestamp instanceof \DateTime || $timestamp instanceof \DateTimeInterface) { $timestamp = $timestamp->getTimestamp(); } elseif (\is_string($timestamp)) { $timestamp = \strtotime($timestamp); } elseif (!\is_int($timestamp)) { $timestamp = \strtotime('1984-12-24T00:00:00Z'); } // detect manifest offset / end of stub if (!\preg_match('{__HALT_COMPILER\\(\\);(?: +\\?>)?\\r?\\n}', $this->contents, $match, \PREG_OFFSET_CAPTURE)) { throw new \RuntimeException('Could not detect the stub\'s end in the phar'); } // set starting position and skip past manifest length $pos = $match[0][1] + \strlen($match[0][0]); $stubEnd = $pos + $this->readUint($pos, 4); $pos += 4; $numFiles = $this->readUint($pos, 4); $pos += 4; // skip API version (YOLO) $pos += 2; // skip PHAR flags $pos += 4; $aliasLength = $this->readUint($pos, 4); $pos += 4 + $aliasLength; $metadataLength = $this->readUint($pos, 4); $pos += 4 + $metadataLength; while ($pos < $stubEnd) { $filenameLength = $this->readUint($pos, 4); $pos += 4 + $filenameLength; // skip filesize $pos += 4; // update timestamp to a fixed value $timeStampBytes = \pack('L', $timestamp); $this->contents[$pos + 0] = $timeStampBytes[0]; $this->contents[$pos + 1] = $timeStampBytes[1]; $this->contents[$pos + 2] = $timeStampBytes[2]; $this->contents[$pos + 3] = $timeStampBytes[3]; // skip timestamp, compressed file size, crc32 checksum and file flags $pos += 4 * 4; $metadataLength = $this->readUint($pos, 4); $pos += 4 + $metadataLength; $numFiles--; } if ($numFiles !== 0) { throw new \LogicException('All files were not processed, something must have gone wrong'); } } /** * Saves the updated phar file, optionally with an updated signature. * * @param string $path * @param int $signatureAlgo One of Phar::MD5, Phar::SHA1, Phar::SHA256 or Phar::SHA512 * @return bool */ public function save($path, $signatureAlgo) { $pos = $this->determineSignatureBegin(); $algos = array(\Phar::MD5 => 'md5', \Phar::SHA1 => 'sha1', \Phar::SHA256 => 'sha256', \Phar::SHA512 => 'sha512'); if (!isset($algos[$signatureAlgo])) { throw new \UnexpectedValueException('Invalid hash algorithm given: ' . $signatureAlgo . ' expected one of Phar::MD5, Phar::SHA1, Phar::SHA256 or Phar::SHA512'); } $algo = $algos[$signatureAlgo]; // re-sign phar // signature $signature = \hash($algo, \substr($this->contents, 0, $pos), \true) . \pack('L', $signatureAlgo) . 'GBMB'; $this->contents = \substr($this->contents, 0, $pos) . $signature; return \file_put_contents($path, $this->contents); } private function readUint($pos, $bytes) { $res = \unpack('V', \substr($this->contents, $pos, $bytes)); return $res[1]; } /** * Determine the beginning of the signature. * * @return int */ private function determineSignatureBegin() { // detect signature position if (!\preg_match('{__HALT_COMPILER\\(\\);(?: +\\?>)?\\r?\\n}', $this->contents, $match, \PREG_OFFSET_CAPTURE)) { throw new \RuntimeException('Could not detect the stub\'s end in the phar'); } // set starting position and skip past manifest length $pos = $match[0][1] + \strlen($match[0][0]); $manifestEnd = $pos + 4 + $this->readUint($pos, 4); $pos += 4; $numFiles = $this->readUint($pos, 4); $pos += 4; // skip API version (YOLO) $pos += 2; // skip PHAR flags $pos += 4; $aliasLength = $this->readUint($pos, 4); $pos += 4 + $aliasLength; $metadataLength = $this->readUint($pos, 4); $pos += 4 + $metadataLength; $compressedSizes = 0; while ($numFiles > 0 && $pos < $manifestEnd - 24) { $filenameLength = $this->readUint($pos, 4); $pos += 4 + $filenameLength; // skip filesize and timestamp $pos += 2 * 4; $compressedSizes += $this->readUint($pos, 4); // skip compressed file size, crc32 checksum and file flags $pos += 3 * 4; $metadataLength = $this->readUint($pos, 4); $pos += 4 + $metadataLength; $numFiles--; } if ($numFiles !== 0) { throw new \LogicException('All files were not processed, something must have gone wrong'); } return $manifestEnd + $compressedSizes; } } Copyright (c) 2011 Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ function includeIfExists($file) { if (\file_exists($file)) { return include $file; } } if (!includeIfExists(__DIR__ . '/../vendor/autoload.php') && !includeIfExists(__DIR__ . '/../../../autoload.php')) { $msg = 'You must set up the project dependencies, run the following commands:' . \PHP_EOL . 'curl -sS https://getcomposer.org/installer | php' . \PHP_EOL . 'php composer.phar install' . \PHP_EOL; \fwrite(\STDERR, $msg); exit(1); } use _ContaoManager\Seld\JsonLint\JsonParser; $files = array(); $quiet = \false; if (isset($_SERVER['argc']) && $_SERVER['argc'] > 1) { for ($i = 1; $i < $_SERVER['argc']; $i++) { $arg = $_SERVER['argv'][$i]; if ($arg == '-q' || $arg == '--quiet') { $quiet = \true; } else { if ($arg == '-h' || $arg == '--help') { showUsage($_SERVER['argv'][0]); } else { $files[] = $arg; } } } } if (!empty($files)) { // file linting $exitCode = 0; foreach ($files as $file) { $result = lintFile($file, $quiet); if ($result === \false) { $exitCode = 1; } } exit($exitCode); } else { //stdin linting if ($contents = \file_get_contents('php://stdin')) { lint($contents, $quiet); } else { \fwrite(\STDERR, 'No file name or json input given' . \PHP_EOL); exit(1); } } // stdin lint function function lint($content, $quiet = \false) { $parser = new JsonParser(); if ($err = $parser->lint($content)) { \fwrite(\STDERR, $err->getMessage() . ' (stdin)' . \PHP_EOL); exit(1); } if (!$quiet) { echo 'Valid JSON (stdin)' . \PHP_EOL; exit(0); } } // file lint function function lintFile($file, $quiet = \false) { if (!\preg_match('{^https?://}i', $file)) { if (!\file_exists($file)) { \fwrite(\STDERR, 'File not found: ' . $file . \PHP_EOL); return \false; } if (!\is_readable($file)) { \fwrite(\STDERR, 'File not readable: ' . $file . \PHP_EOL); return \false; } } $content = \file_get_contents($file); $parser = new JsonParser(); if ($err = $parser->lint($content)) { \fwrite(\STDERR, $file . ': ' . $err->getMessage() . \PHP_EOL); return \false; } if (!$quiet) { echo 'Valid JSON (' . $file . ')' . \PHP_EOL; } return \true; } // usage text function function showUsage($programPath) { echo 'Usage: ' . $programPath . ' file [options]' . \PHP_EOL; echo \PHP_EOL; echo 'Options:' . \PHP_EOL; echo ' -q, --quiet Cause jsonlint to be quiet when no errors are found' . \PHP_EOL; echo ' -h, --help Show this message' . \PHP_EOL; exit(0); } You can find newer changelog entries in [GitHub releases](https://github.com/Seldaek/jsonlint/releases) ### 1.10.0 (2023-05-11) * Added ALLOW_COMMENTS flag to parse while allowing (and ignoring) inline `//` and multiline `/* */` comments in the JSON document (#81) ### 1.9.0 (2022-04-01) * Internal cleanups and type fixes ### 1.8.1 (2020-08-13) * Added type annotations ### 1.8.0 (2020-04-30) * Improved lexer performance * Added (tentative) support for PHP 8 * Fixed wording of error reporting for invalid strings when the error happened after the 20th character ### 1.7.2 (2019-10-24) * Fixed issue decoding some unicode escaped characters (for " and ') ### 1.7.1 (2018-01-24) * Fixed PHP 5.3 compatibility in bin/jsonlint ### 1.7.0 (2018-01-03) * Added ability to lint multiple files at once using the jsonlint binary ### 1.6.2 (2017-11-30) * No meaningful public changes ### 1.6.1 (2017-06-18) * Fixed parsing of `0` as invalid ### 1.6.0 (2017-03-06) * Added $flags arg to JsonParser::lint() to take the same flag as parse() did * Fixed backtracking performance issues on long strings with a lot of escaped characters ### 1.5.0 (2016-11-14) * Added support for PHP 7.1 (which converts `{"":""}` to an object property called `""` and not `"_empty_"` like 7.0 and below). ### 1.4.0 (2015-11-21) * Added a DuplicateKeyException allowing for more specific error detection and handling ### 1.3.1 (2015-01-04) * Fixed segfault when parsing large JSON strings ### 1.3.0 (2014-09-05) * Added parsing to an associative array via JsonParser::PARSE_TO_ASSOC * Fixed a warning when rendering parse errors on empty lines ### 1.2.0 (2014-07-20) * Added support for linting multiple files at once in bin/jsonlint * Added a -q/--quiet flag to suppress the output * Fixed error output being on STDOUT instead of STDERR * Fixed parameter parsing ### 1.1.2 (2013-11-04) * Fixed handling of Unicode BOMs to give a better failure hint ### 1.1.1 (2013-02-12) * Fixed handling of empty keys in objects in certain cases ### 1.1.0 (2012-12-13) * Added optional parsing of duplicate keys into key.2, key.3, etc via JsonParser::ALLOW_DUPLICATE_KEYS * Improved error reporting for common mistakes ### 1.0.1 (2012-04-03) * Added optional detection and error reporting for duplicate keys via JsonParser::DETECT_KEY_CONFLICTS * Added ability to pipe content through stdin into bin/jsonlint ### 1.0.0 (2012-03-12) * Initial release JSON Lint ========= [![Build Status](https://github.com/Seldaek/jsonlint/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/Seldaek/jsonlint/actions/workflows/continuous-integration.yml) Usage ----- ```php use Seld\JsonLint\JsonParser; $parser = new JsonParser(); // returns null if it's valid json, or a ParsingException object. $parser->lint($json); // Call getMessage() on the exception object to get // a well formatted error message error like this // Parse error on line 2: // ... "key": "value" "numbers": [1, 2, 3] // ----------------------^ // Expected one of: 'EOF', '}', ':', ',', ']' // Call getDetails() on the exception to get more info. // returns parsed json, like json_decode() does, but slower, throws // exceptions on failure. $parser->parse($json); ``` You can also pass additional flags to `JsonParser::lint/parse` that tweak the functionality: - `JsonParser::DETECT_KEY_CONFLICTS` throws an exception on duplicate keys. - `JsonParser::ALLOW_DUPLICATE_KEYS` collects duplicate keys. e.g. if you have two `foo` keys they will end up as `foo` and `foo.2`. - `JsonParser::PARSE_TO_ASSOC` parses to associative arrays instead of stdClass objects. - `JsonParser::ALLOW_COMMENTS` parses while allowing (and ignoring) inline `//` and multiline `/* */` comments in the JSON document. - `JsonParser::ALLOW_DUPLICATE_KEYS_TO_ARRAY` collects duplicate keys. e.g. if you have two `foo` keys the `foo` key will become an object (or array in assoc mode) with all `foo` values accessible as an array in `$result->foo->__duplicates__` (or `$result['foo']['__duplicates__']` in assoc mode). Example: ```php $parser = new JsonParser; try { $parser->parse(file_get_contents($jsonFile), JsonParser::DETECT_KEY_CONFLICTS); } catch (DuplicateKeyException $e) { $details = $e->getDetails(); echo 'Key '.$details['key'].' is a duplicate in '.$jsonFile.' at line '.$details['line']; } ``` > **Note:** This library is meant to parse JSON while providing good error messages on failure. There is no way it can be as fast as php native `json_decode()`. > > It is recommended to parse with `json_decode`, and when it fails parse again with seld/jsonlint to get a proper error message back to the user. See for example [how Composer uses this library](https://github.com/composer/composer/blob/56edd53046fd697d32b2fd2fbaf45af5d7951671/src/Composer/Json/JsonFile.php#L283-L318): Installation ------------ For a quick install with Composer use: ```bash composer require seld/jsonlint ``` JSON Lint can easily be used within another app if you have a [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloader, or it can be installed through [Composer](https://getcomposer.org/) for use as a CLI util. Once installed via Composer you can run the following command to lint a json file or URL: $ bin/jsonlint file.json Requirements ------------ - PHP 5.3+ - [optional] PHPUnit 3.5+ to execute the test suite (phpunit --version) Submitting bugs and feature requests ------------------------------------ Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/jsonlint/issues) Author ------ Jordi Boggiano - - License ------- JSON Lint is licensed under the MIT License - see the LICENSE file for details Acknowledgements ---------------- This library is a port of the JavaScript [jsonlint](https://github.com/zaach/jsonlint) library. { "name": "seld\/jsonlint", "description": "JSON Linter", "keywords": [ "json", "parser", "linter", "validator" ], "type": "library", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https:\/\/seld.be" } ], "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { "phpunit\/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13", "phpstan\/phpstan": "^1.11" }, "autoload": { "psr-4": { "_ContaoManager\\Seld\\JsonLint\\": "src\/Seld\/JsonLint\/" } }, "bin": [ "bin\/jsonlint" ], "scripts": { "test": "vendor\/bin\/phpunit", "phpstan": "vendor\/bin\/phpstan analyse" } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\JsonLint; class DuplicateKeyException extends ParsingException { /** * @var array{key: string, line: int} */ protected $details; /** * @param string $message * @param string $key * @phpstan-param array{line: int} $details */ public function __construct($message, $key, array $details) { $details['key'] = $key; parent::__construct($message, $details); } /** * @return string */ public function getKey() { return $this->details['key']; } /** * @phpstan-return array{key: string, line: int} */ public function getDetails() { return $this->details; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\JsonLint; class ParsingException extends \Exception { /** * @var array{text?: string, token?: string|int, line?: int, loc?: array{first_line: int, first_column: int, last_line: int, last_column: int}, expected?: string[]} */ protected $details; /** * @param string $message * @phpstan-param array{text?: string, token?: string|int, line?: int, loc?: array{first_line: int, first_column: int, last_line: int, last_column: int}, expected?: string[]} $details */ public function __construct($message, $details = array()) { $this->details = $details; parent::__construct($message); } /** * @phpstan-return array{text?: string, token?: string|int, line?: int, loc?: array{first_line: int, first_column: int, last_line: int, last_column: int}, expected?: string[]} */ public function getDetails() { return $this->details; } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\JsonLint; /** * Lexer class * * Ported from https://github.com/zaach/jsonlint */ class Lexer { /** @internal */ const EOF = 1; /** @internal */ const T_INVALID = -1; const T_SKIP_WHITESPACE = 0; const T_ERROR = 2; /** @internal */ const T_BREAK_LINE = 3; /** @internal */ const T_COMMENT = 30; /** @internal */ const T_OPEN_COMMENT = 31; /** @internal */ const T_CLOSE_COMMENT = 32; /** * @phpstan-var array, string> * @const */ private $rules = array(0 => '/\\G\\s*\\n\\r?/', 1 => '/\\G\\s+/', 2 => '/\\G-?([0-9]|[1-9][0-9]+)(\\.[0-9]+)?([eE][+-]?[0-9]+)?\\b/', 3 => '{\\G"(?>\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\\0-\\x1f\\\\"]++)*+"}', 4 => '/\\G\\{/', 5 => '/\\G\\}/', 6 => '/\\G\\[/', 7 => '/\\G\\]/', 8 => '/\\G,/', 9 => '/\\G:/', 10 => '/\\Gtrue\\b/', 11 => '/\\Gfalse\\b/', 12 => '/\\Gnull\\b/', 13 => '/\\G$/', 14 => '/\\G\\/\\//', 15 => '/\\G\\/\\*/', 16 => '/\\G\\*\\//', 17 => '/\\G./'); /** @var string */ private $input; /** @var bool */ private $more; /** @var bool */ private $done; /** @var 0|positive-int */ private $offset; /** @var int */ private $flags; /** @var string */ public $match; /** @var 0|positive-int */ public $yylineno; /** @var 0|positive-int */ public $yyleng; /** @var string */ public $yytext; /** @var array{first_line: 0|positive-int, first_column: 0|positive-int, last_line: 0|positive-int, last_column: 0|positive-int} */ public $yylloc; /** * @param int $flags */ public function __construct($flags = 0) { $this->flags = $flags; } /** * @return 0|1|4|6|8|10|11|14|17|18|21|22|23|24|30|-1 */ public function lex() { while (\true) { $symbol = $this->next(); switch ($symbol) { case self::T_SKIP_WHITESPACE: case self::T_BREAK_LINE: break; case self::T_COMMENT: case self::T_OPEN_COMMENT: if (!($this->flags & JsonParser::ALLOW_COMMENTS)) { $this->parseError('Lexical error on line ' . ($this->yylineno + 1) . ". Comments are not allowed.\n" . $this->showPosition()); } $this->skipUntil($symbol === self::T_COMMENT ? self::T_BREAK_LINE : self::T_CLOSE_COMMENT); if ($this->done) { // last symbol '/\G$/' before EOF return 14; } break; case self::T_CLOSE_COMMENT: $this->parseError('Lexical error on line ' . ($this->yylineno + 1) . ". Unexpected token.\n" . $this->showPosition()); default: return $symbol; } } } /** * @param string $input * @return $this */ public function setInput($input) { $this->input = $input; $this->more = \false; $this->done = \false; $this->offset = 0; $this->yylineno = $this->yyleng = 0; $this->yytext = $this->match = ''; $this->yylloc = array('first_line' => 1, 'first_column' => 0, 'last_line' => 1, 'last_column' => 0); return $this; } /** * @return string */ public function showPosition() { if ($this->yylineno === 0 && $this->offset === 1 && $this->match !== '{') { return $this->match . '...' . "\n^"; } $pre = \str_replace("\n", '', $this->getPastInput()); $c = \str_repeat('-', \max(0, \strlen($pre) - 1)); // new Array(pre.length + 1).join("-"); return $pre . \str_replace("\n", '', $this->getUpcomingInput()) . "\n" . $c . "^"; } /** * @return string */ public function getPastInput() { $pastLength = $this->offset - \strlen($this->match); return ($pastLength > 20 ? '...' : '') . \substr($this->input, \max(0, $pastLength - 20), \min(20, $pastLength)); } /** * @return string */ public function getUpcomingInput() { $next = $this->match; if (\strlen($next) < 20) { $next .= \substr($this->input, $this->offset, 20 - \strlen($next)); } return \substr($next, 0, 20) . (\strlen($next) > 20 ? '...' : ''); } /** * @return string */ public function getFullUpcomingInput() { $next = $this->match; if (\substr($next, 0, 1) === '"' && \substr_count($next, '"') === 1) { $len = \strlen($this->input); if ($len === $this->offset) { $strEnd = $len; } else { $strEnd = \min(\strpos($this->input, '"', $this->offset + 1) ?: $len, \strpos($this->input, "\n", $this->offset + 1) ?: $len); } $next .= \substr($this->input, $this->offset, $strEnd - $this->offset); } elseif (\strlen($next) < 20) { $next .= \substr($this->input, $this->offset, 20 - \strlen($next)); } return $next; } /** * @param string $str * @return never */ protected function parseError($str) { throw new ParsingException($str); } /** * @param int $token * @return void */ private function skipUntil($token) { $symbol = $this->next(); while ($symbol !== $token && \false === $this->done) { $symbol = $this->next(); } } /** * @return 0|1|3|4|6|8|10|11|14|17|18|21|22|23|24|30|31|32|-1 */ private function next() { if ($this->done) { return self::EOF; } if ($this->offset === \strlen($this->input)) { $this->done = \true; } $token = null; $match = null; $col = null; $lines = null; if (!$this->more) { $this->yytext = ''; $this->match = ''; } $rulesLen = \count($this->rules); for ($i = 0; $i < $rulesLen; $i++) { if (\preg_match($this->rules[$i], $this->input, $match, 0, $this->offset)) { $lines = \explode("\n", $match[0]); \array_shift($lines); $lineCount = \count($lines); $this->yylineno += $lineCount; $this->yylloc = array('first_line' => $this->yylloc['last_line'], 'last_line' => $this->yylineno + 1, 'first_column' => $this->yylloc['last_column'], 'last_column' => $lineCount > 0 ? \strlen($lines[$lineCount - 1]) : $this->yylloc['last_column'] + \strlen($match[0])); $this->yytext .= $match[0]; $this->match .= $match[0]; $this->yyleng = \strlen($this->yytext); $this->more = \false; $this->offset += \strlen($match[0]); return $this->performAction($i); } } if ($this->offset === \strlen($this->input)) { return self::EOF; } $this->parseError('Lexical error on line ' . ($this->yylineno + 1) . ". Unrecognized text.\n" . $this->showPosition()); } /** * @param int $rule * @return 0|3|4|6|8|10|11|14|17|18|21|22|23|24|30|31|32|-1 */ private function performAction($rule) { switch ($rule) { case 0: /* skip break line */ return self::T_BREAK_LINE; case 1: /* skip whitespace */ return self::T_SKIP_WHITESPACE; case 2: return 6; case 3: $this->yytext = \substr($this->yytext, 1, $this->yyleng - 2); return 4; case 4: return 17; case 5: return 18; case 6: return 23; case 7: return 24; case 8: return 22; case 9: return 21; case 10: return 10; case 11: return 11; case 12: return 8; case 13: return 14; case 14: return self::T_COMMENT; case 15: return self::T_OPEN_COMMENT; case 16: return self::T_CLOSE_COMMENT; case 17: return self::T_INVALID; default: throw new \LogicException('Unsupported rule ' . $rule); } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\JsonLint; class Undefined { } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\JsonLint; use stdClass; /** * Parser class * * Example: * * $parser = new JsonParser(); * // returns null if it's valid json, or an error object * $parser->lint($json); * // returns parsed json, like json_decode does, but slower, throws exceptions on failure. * $parser->parse($json); * * Ported from https://github.com/zaach/jsonlint */ class JsonParser { const DETECT_KEY_CONFLICTS = 1; const ALLOW_DUPLICATE_KEYS = 2; const PARSE_TO_ASSOC = 4; const ALLOW_COMMENTS = 8; const ALLOW_DUPLICATE_KEYS_TO_ARRAY = 16; /** @var Lexer */ private $lexer; /** * @var int * @phpstan-var int-mask-of */ private $flags; /** @var list */ private $stack; /** @var list|int|bool|float|string|null> */ private $vstack; // semantic value stack /** @var list */ private $lstack; // location stack /** * @phpstan-var array */ private $symbols = array('error' => 2, 'JSONString' => 3, 'STRING' => 4, 'JSONNumber' => 5, 'NUMBER' => 6, 'JSONNullLiteral' => 7, 'NULL' => 8, 'JSONBooleanLiteral' => 9, 'TRUE' => 10, 'FALSE' => 11, 'JSONText' => 12, 'JSONValue' => 13, 'EOF' => 14, 'JSONObject' => 15, 'JSONArray' => 16, '{' => 17, '}' => 18, 'JSONMemberList' => 19, 'JSONMember' => 20, ':' => 21, ',' => 22, '[' => 23, ']' => 24, 'JSONElementList' => 25, '$accept' => 0, '$end' => 1); /** * @phpstan-var array * @const */ private $terminals_ = array(2 => "error", 4 => "STRING", 6 => "NUMBER", 8 => "NULL", 10 => "TRUE", 11 => "FALSE", 14 => "EOF", 17 => "{", 18 => "}", 21 => ":", 22 => ",", 23 => "[", 24 => "]"); /** * @phpstan-var array, array{int, int}> * @const */ private $productions_ = array(1 => array(3, 1), 2 => array(5, 1), 3 => array(7, 1), 4 => array(9, 1), 5 => array(9, 1), 6 => array(12, 2), 7 => array(13, 1), 8 => array(13, 1), 9 => array(13, 1), 10 => array(13, 1), 11 => array(13, 1), 12 => array(13, 1), 13 => array(15, 2), 14 => array(15, 3), 15 => array(20, 3), 16 => array(19, 1), 17 => array(19, 3), 18 => array(16, 2), 19 => array(16, 3), 20 => array(25, 1), 21 => array(25, 3)); /** * @var array, array|int>> List of stateID=>symbolID=>actionIDs|actionID * @const */ private $table = array(0 => array(3 => 5, 4 => array(1, 12), 5 => 6, 6 => array(1, 13), 7 => 3, 8 => array(1, 9), 9 => 4, 10 => array(1, 10), 11 => array(1, 11), 12 => 1, 13 => 2, 15 => 7, 16 => 8, 17 => array(1, 14), 23 => array(1, 15)), 1 => array(1 => array(3)), 2 => array(14 => array(1, 16)), 3 => array(14 => array(2, 7), 18 => array(2, 7), 22 => array(2, 7), 24 => array(2, 7)), 4 => array(14 => array(2, 8), 18 => array(2, 8), 22 => array(2, 8), 24 => array(2, 8)), 5 => array(14 => array(2, 9), 18 => array(2, 9), 22 => array(2, 9), 24 => array(2, 9)), 6 => array(14 => array(2, 10), 18 => array(2, 10), 22 => array(2, 10), 24 => array(2, 10)), 7 => array(14 => array(2, 11), 18 => array(2, 11), 22 => array(2, 11), 24 => array(2, 11)), 8 => array(14 => array(2, 12), 18 => array(2, 12), 22 => array(2, 12), 24 => array(2, 12)), 9 => array(14 => array(2, 3), 18 => array(2, 3), 22 => array(2, 3), 24 => array(2, 3)), 10 => array(14 => array(2, 4), 18 => array(2, 4), 22 => array(2, 4), 24 => array(2, 4)), 11 => array(14 => array(2, 5), 18 => array(2, 5), 22 => array(2, 5), 24 => array(2, 5)), 12 => array(14 => array(2, 1), 18 => array(2, 1), 21 => array(2, 1), 22 => array(2, 1), 24 => array(2, 1)), 13 => array(14 => array(2, 2), 18 => array(2, 2), 22 => array(2, 2), 24 => array(2, 2)), 14 => array(3 => 20, 4 => array(1, 12), 18 => array(1, 17), 19 => 18, 20 => 19), 15 => array(3 => 5, 4 => array(1, 12), 5 => 6, 6 => array(1, 13), 7 => 3, 8 => array(1, 9), 9 => 4, 10 => array(1, 10), 11 => array(1, 11), 13 => 23, 15 => 7, 16 => 8, 17 => array(1, 14), 23 => array(1, 15), 24 => array(1, 21), 25 => 22), 16 => array(1 => array(2, 6)), 17 => array(14 => array(2, 13), 18 => array(2, 13), 22 => array(2, 13), 24 => array(2, 13)), 18 => array(18 => array(1, 24), 22 => array(1, 25)), 19 => array(18 => array(2, 16), 22 => array(2, 16)), 20 => array(21 => array(1, 26)), 21 => array(14 => array(2, 18), 18 => array(2, 18), 22 => array(2, 18), 24 => array(2, 18)), 22 => array(22 => array(1, 28), 24 => array(1, 27)), 23 => array(22 => array(2, 20), 24 => array(2, 20)), 24 => array(14 => array(2, 14), 18 => array(2, 14), 22 => array(2, 14), 24 => array(2, 14)), 25 => array(3 => 20, 4 => array(1, 12), 20 => 29), 26 => array(3 => 5, 4 => array(1, 12), 5 => 6, 6 => array(1, 13), 7 => 3, 8 => array(1, 9), 9 => 4, 10 => array(1, 10), 11 => array(1, 11), 13 => 30, 15 => 7, 16 => 8, 17 => array(1, 14), 23 => array(1, 15)), 27 => array(14 => array(2, 19), 18 => array(2, 19), 22 => array(2, 19), 24 => array(2, 19)), 28 => array(3 => 5, 4 => array(1, 12), 5 => 6, 6 => array(1, 13), 7 => 3, 8 => array(1, 9), 9 => 4, 10 => array(1, 10), 11 => array(1, 11), 13 => 31, 15 => 7, 16 => 8, 17 => array(1, 14), 23 => array(1, 15)), 29 => array(18 => array(2, 17), 22 => array(2, 17)), 30 => array(18 => array(2, 15), 22 => array(2, 15)), 31 => array(22 => array(2, 21), 24 => array(2, 21))); /** * @var array{16: array{2, 6}} * @const */ private $defaultActions = array(16 => array(2, 6)); /** * @param string $input JSON string * @param int $flags Bitmask of parse/lint options (see constants of this class) * @return null|ParsingException null if no error is found, a ParsingException containing all details otherwise * * @phpstan-param int-mask-of $flags */ public function lint($input, $flags = 0) { try { $this->parse($input, $flags); } catch (ParsingException $e) { return $e; } return null; } /** * @param string $input JSON string * @param int $flags Bitmask of parse/lint options (see constants of this class) * @return mixed * @throws ParsingException * * @phpstan-param int-mask-of $flags */ public function parse($input, $flags = 0) { if ($flags & self::ALLOW_DUPLICATE_KEYS_TO_ARRAY && $flags & self::ALLOW_DUPLICATE_KEYS) { throw new \InvalidArgumentException('Only one of ALLOW_DUPLICATE_KEYS and ALLOW_DUPLICATE_KEYS_TO_ARRAY can be used, you passed in both.'); } $this->failOnBOM($input); $this->flags = $flags; $this->stack = array(0); $this->vstack = array(null); $this->lstack = array(); $yytext = ''; $yylineno = 0; $yyleng = 0; /** @var int<0,3> */ $recovering = 0; $this->lexer = new Lexer($flags); $this->lexer->setInput($input); $yyloc = $this->lexer->yylloc; $this->lstack[] = $yyloc; $symbol = null; $preErrorSymbol = null; $action = null; $a = null; $r = null; $p = null; $len = null; $newState = null; $expected = null; /** @var string|null */ $errStr = null; while (\true) { // retrieve state number from top of stack $state = $this->stack[\count($this->stack) - 1]; // use default actions if available if (isset($this->defaultActions[$state])) { $action = $this->defaultActions[$state]; } else { if ($symbol === null) { $symbol = $this->lexer->lex(); } // read action for current state and first input /** @var array|false */ $action = isset($this->table[$state][$symbol]) ? $this->table[$state][$symbol] : \false; } // handle parse error if (!$action || !$action[0]) { \assert(isset($symbol)); if (!$recovering) { // Report error $expected = array(); foreach ($this->table[$state] as $p => $ignore) { if (isset($this->terminals_[$p]) && $p > 2) { $expected[] = "'" . $this->terminals_[$p] . "'"; } } $message = null; if (\in_array("'STRING'", $expected) && \in_array(\substr($this->lexer->match, 0, 1), array('"', "'"))) { $message = "Invalid string"; if ("'" === \substr($this->lexer->match, 0, 1)) { $message .= ", it appears you used single quotes instead of double quotes"; } elseif (\preg_match('{".+?(\\\\[^"bfnrt/\\\\u](...)?)}', $this->lexer->getFullUpcomingInput(), $match)) { $message .= ", it appears you have an unescaped backslash at: " . $match[1]; } elseif (\preg_match('{"(?:[^"]+|\\\\")*$}m', $this->lexer->getFullUpcomingInput())) { $message .= ", it appears you forgot to terminate a string, or attempted to write a multiline string which is invalid"; } } $errStr = 'Parse error on line ' . ($yylineno + 1) . ":\n"; $errStr .= $this->lexer->showPosition() . "\n"; if ($message) { $errStr .= $message; } else { $errStr .= \count($expected) > 1 ? "Expected one of: " : "Expected: "; $errStr .= \implode(', ', $expected); } if (',' === \substr(\trim($this->lexer->getPastInput()), -1)) { $errStr .= " - It appears you have an extra trailing comma"; } $this->parseError($errStr, array('text' => $this->lexer->match, 'token' => isset($this->terminals_[$symbol]) ? $this->terminals_[$symbol] : $symbol, 'line' => $this->lexer->yylineno, 'loc' => $yyloc, 'expected' => $expected)); } // just recovered from another error if ($recovering == 3) { if ($symbol === Lexer::EOF) { throw new ParsingException($errStr ?: 'Parsing halted.'); } // discard current lookahead and grab another $yyleng = $this->lexer->yyleng; $yytext = $this->lexer->yytext; $yylineno = $this->lexer->yylineno; $yyloc = $this->lexer->yylloc; $symbol = $this->lexer->lex(); } // try to recover from error while (\true) { // check for error recovery rule in this state if (\array_key_exists(Lexer::T_ERROR, $this->table[$state])) { break; } if ($state == 0) { throw new ParsingException($errStr ?: 'Parsing halted.'); } $this->popStack(1); $state = $this->stack[\count($this->stack) - 1]; } $preErrorSymbol = $symbol; // save the lookahead token $symbol = Lexer::T_ERROR; // insert generic error symbol as new lookahead $state = $this->stack[\count($this->stack) - 1]; /** @var array|false */ $action = isset($this->table[$state][Lexer::T_ERROR]) ? $this->table[$state][Lexer::T_ERROR] : \false; if ($action === \false) { throw new \LogicException('No table value found for ' . $state . ' => ' . Lexer::T_ERROR); } $recovering = 3; // allow 3 real symbols to be shifted before reporting a new error } // this shouldn't happen, unless resolve defaults are off if (\is_array($action[0]) && \count($action) > 1) { throw new ParsingException('Parse Error: multiple actions possible at state: ' . $state . ', token: ' . $symbol); } switch ($action[0]) { case 1: // shift \assert(isset($symbol)); $this->stack[] = $symbol; $this->vstack[] = $this->lexer->yytext; $this->lstack[] = $this->lexer->yylloc; $this->stack[] = $action[1]; // push state $symbol = null; if (!$preErrorSymbol) { // normal execution/no error $yyleng = $this->lexer->yyleng; $yytext = $this->lexer->yytext; $yylineno = $this->lexer->yylineno; $yyloc = $this->lexer->yylloc; if ($recovering > 0) { $recovering--; } } else { // error just occurred, resume old lookahead from before error $symbol = $preErrorSymbol; $preErrorSymbol = null; } break; case 2: // reduce $len = $this->productions_[$action[1]][1]; // perform semantic action $currentToken = $this->vstack[\count($this->vstack) - $len]; // default to $$ = $1 // default location, uses first token for firsts, last for lasts $position = array( // _$ = store 'first_line' => $this->lstack[\count($this->lstack) - ($len ?: 1)]['first_line'], 'last_line' => $this->lstack[\count($this->lstack) - 1]['last_line'], 'first_column' => $this->lstack[\count($this->lstack) - ($len ?: 1)]['first_column'], 'last_column' => $this->lstack[\count($this->lstack) - 1]['last_column'], ); list($newToken, $actionResult) = $this->performAction($currentToken, $yytext, $yyleng, $yylineno, $action[1]); if (!$actionResult instanceof Undefined) { return $actionResult; } if ($len) { $this->popStack($len); } $this->stack[] = $this->productions_[$action[1]][0]; // push nonterminal (reduce) $this->vstack[] = $newToken; $this->lstack[] = $position; /** @var int */ $newState = $this->table[$this->stack[\count($this->stack) - 2]][$this->stack[\count($this->stack) - 1]]; $this->stack[] = $newState; break; case 3: // accept return \true; } } } /** * @param string $str * @param array{text: string, token: string|int, line: int, loc: array{first_line: int, first_column: int, last_line: int, last_column: int}, expected: string[]}|null $hash * @return never */ protected function parseError($str, $hash = null) { throw new ParsingException($str, $hash ?: array()); } /** * @param stdClass|array|int|bool|float|string|null $currentToken * @param string $yytext * @param int $yyleng * @param int $yylineno * @param int $yystate * @return array{stdClass|array|int|bool|float|string|null, stdClass|array|int|bool|float|string|null|Undefined} */ private function performAction($currentToken, $yytext, $yyleng, $yylineno, $yystate) { $token = $currentToken; $len = \count($this->vstack) - 1; switch ($yystate) { case 1: $yytext = \preg_replace_callback('{(?:\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4})}', array($this, 'stringInterpolation'), $yytext); $token = $yytext; break; case 2: if (\strpos($yytext, 'e') !== \false || \strpos($yytext, 'E') !== \false) { $token = \floatval($yytext); } else { $token = \strpos($yytext, '.') === \false ? \intval($yytext) : \floatval($yytext); } break; case 3: $token = null; break; case 4: $token = \true; break; case 5: $token = \false; break; case 6: $token = $this->vstack[$len - 1]; return array($token, $token); case 13: if ($this->flags & self::PARSE_TO_ASSOC) { $token = array(); } else { $token = new stdClass(); } break; case 14: $token = $this->vstack[$len - 1]; break; case 15: $token = array($this->vstack[$len - 2], $this->vstack[$len]); break; case 16: \assert(\is_array($this->vstack[$len])); if (\PHP_VERSION_ID < 70100) { $property = $this->vstack[$len][0] === '' ? '_empty_' : $this->vstack[$len][0]; } else { $property = $this->vstack[$len][0]; } if ($this->flags & self::PARSE_TO_ASSOC) { $token = array(); $token[$property] = $this->vstack[$len][1]; } else { $token = new stdClass(); $token->{$property} = $this->vstack[$len][1]; } break; case 17: \assert(\is_array($this->vstack[$len])); if ($this->flags & self::PARSE_TO_ASSOC) { \assert(\is_array($this->vstack[$len - 2])); $token =& $this->vstack[$len - 2]; $key = $this->vstack[$len][0]; if ($this->flags & self::DETECT_KEY_CONFLICTS && isset($this->vstack[$len - 2][$key])) { $errStr = 'Parse error on line ' . ($yylineno + 1) . ":\n"; $errStr .= $this->lexer->showPosition() . "\n"; $errStr .= "Duplicate key: " . $this->vstack[$len][0]; throw new DuplicateKeyException($errStr, $this->vstack[$len][0], array('line' => $yylineno + 1)); } if ($this->flags & self::ALLOW_DUPLICATE_KEYS && isset($this->vstack[$len - 2][$key])) { $duplicateCount = 1; do { $duplicateKey = $key . '.' . $duplicateCount++; } while (isset($this->vstack[$len - 2][$duplicateKey])); $this->vstack[$len - 2][$duplicateKey] = $this->vstack[$len][1]; } elseif ($this->flags & self::ALLOW_DUPLICATE_KEYS_TO_ARRAY && isset($this->vstack[$len - 2][$key])) { if (!isset($this->vstack[$len - 2][$key]['__duplicates__']) || !\is_array($this->vstack[$len - 2][$key]['__duplicates__'])) { $this->vstack[$len - 2][$key] = array('__duplicates__' => array($this->vstack[$len - 2][$key])); } $this->vstack[$len - 2][$key]['__duplicates__'][] = $this->vstack[$len][1]; } else { $this->vstack[$len - 2][$key] = $this->vstack[$len][1]; } } else { \assert($this->vstack[$len - 2] instanceof stdClass); $token = $this->vstack[$len - 2]; if (\PHP_VERSION_ID < 70100) { $key = $this->vstack[$len][0] === '' ? '_empty_' : $this->vstack[$len][0]; } else { $key = $this->vstack[$len][0]; } if ($this->flags & self::DETECT_KEY_CONFLICTS && isset($this->vstack[$len - 2]->{$key})) { $errStr = 'Parse error on line ' . ($yylineno + 1) . ":\n"; $errStr .= $this->lexer->showPosition() . "\n"; $errStr .= "Duplicate key: " . $this->vstack[$len][0]; throw new DuplicateKeyException($errStr, $this->vstack[$len][0], array('line' => $yylineno + 1)); } if ($this->flags & self::ALLOW_DUPLICATE_KEYS && isset($this->vstack[$len - 2]->{$key})) { $duplicateCount = 1; do { $duplicateKey = $key . '.' . $duplicateCount++; } while (isset($this->vstack[$len - 2]->{$duplicateKey})); $this->vstack[$len - 2]->{$duplicateKey} = $this->vstack[$len][1]; } elseif ($this->flags & self::ALLOW_DUPLICATE_KEYS_TO_ARRAY && isset($this->vstack[$len - 2]->{$key})) { if (!isset($this->vstack[$len - 2]->{$key}->__duplicates__)) { $this->vstack[$len - 2]->{$key} = (object) array('__duplicates__' => array($this->vstack[$len - 2]->{$key})); } $this->vstack[$len - 2]->{$key}->__duplicates__[] = $this->vstack[$len][1]; } else { $this->vstack[$len - 2]->{$key} = $this->vstack[$len][1]; } } break; case 18: $token = array(); break; case 19: $token = $this->vstack[$len - 1]; break; case 20: $token = array($this->vstack[$len]); break; case 21: \assert(\is_array($this->vstack[$len - 2])); $this->vstack[$len - 2][] = $this->vstack[$len]; $token = $this->vstack[$len - 2]; break; } return array($token, new Undefined()); } /** * @param string $match * @return string */ private function stringInterpolation($match) { switch ($match[0]) { case '\\\\': return '\\'; case '\\"': return '"'; case '\\b': return \chr(8); case '\\f': return \chr(12); case '\\n': return "\n"; case '\\r': return "\r"; case '\\t': return "\t"; case '\\/': return "/"; default: return \html_entity_decode('&#x' . \ltrim(\substr($match[0], 2), '0') . ';', \ENT_QUOTES, 'UTF-8'); } } /** * @param int $n * @return void */ private function popStack($n) { $this->stack = \array_slice($this->stack, 0, -(2 * $n)); $this->vstack = \array_slice($this->vstack, 0, -$n); $this->lstack = \array_slice($this->lstack, 0, -$n); } /** * @param string $input * @return void */ private function failOnBOM($input) { // UTF-8 ByteOrderMark sequence $bom = ""; if (\substr($input, 0, 3) === $bom) { $this->parseError("BOM detected, make sure your input does not include a Unicode Byte-Order-Mark"); } } } Copyright (c) 2015 Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. { "name": "seld\/signal-handler", "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", "keywords": [ "unix", "posix", "signal", "sigint", "sigterm" ], "type": "library", "license": "MIT", "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http:\/\/seld.be" } ], "require": { "php": ">=7.2.0" }, "require-dev": { "phpunit\/phpunit": "^7.5.20 || ^8.5.23", "psr\/log": "^1 || ^2 || ^3", "phpstan\/phpstan": "^1", "phpstan\/phpstan-phpunit": "^1", "phpstan\/phpstan-strict-rules": "^1.3", "phpstan\/phpstan-deprecation-rules": "^1.0" }, "autoload": { "psr-4": { "_ContaoManager\\Seld\\Signal\\": "src\/" } }, "autoload-dev": { "psr-4": { "_ContaoManager\\Seld\\Signal\\": "tests\/" } }, "scripts": { "phpstan": "@php phpstan analyse", "test": "@php phpunit" }, "extra": { "branch-alias": { "dev-main": "2.x-dev" } } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace _ContaoManager\Seld\Signal; use _ContaoManager\Psr\Log\LoggerInterface; use Closure; use WeakReference; /** * SignalHandler and factory */ final class SignalHandler { /** * The SIGHUP signal is sent to a process when its controlling terminal is closed. It was originally designed to * notify the process of a serial line drop (a hangup). In modern systems, this signal usually means that the * controlling pseudo or virtual terminal has been closed. Many daemons will reload their configuration files and * reopen their logfiles instead of exiting when receiving this signal. nohup is a command to make a command ignore * the signal. */ public const SIGHUP = 'SIGHUP'; /** * The SIGINT signal is sent to a process by its controlling terminal when a user wishes to interrupt the process. * This is typically initiated by pressing Ctrl-C, but on some systems, the "delete" character or "break" key can be * used. * * On Windows this is used to denote a PHP_WINDOWS_EVENT_CTRL_C */ public const SIGINT = 'SIGINT'; /** * The SIGQUIT signal is sent to a process by its controlling terminal when the user requests that the process quit * and perform a core dump. */ public const SIGQUIT = 'SIGQUIT'; /** * The SIGILL signal is sent to a process when it attempts to execute an illegal, malformed, unknown, or privileged * instruction. */ public const SIGILL = 'SIGILL'; /** * The SIGTRAP signal is sent to a process when an exception (or trap) occurs: a condition that a debugger has * requested to be informed of — for example, when a particular function is executed, or when a particular variable * changes value. */ public const SIGTRAP = 'SIGTRAP'; /** * The SIGABRT signal is sent to a process to tell it to abort, i.e. to terminate. The signal is usually initiated * by the process itself when it calls abort function of the C Standard Library, but it can be sent to the process * from outside like any other signal. */ public const SIGABRT = 'SIGABRT'; public const SIGIOT = 'SIGIOT'; /** * The SIGBUS signal is sent to a process when it causes a bus error. The conditions that lead to the signal being * sent are, for example, incorrect memory access alignment or non-existent physical address. */ public const SIGBUS = 'SIGBUS'; public const SIGFPE = 'SIGFPE'; /** * The SIGKILL signal is sent to a process to cause it to terminate immediately (kill). In contrast to SIGTERM and * SIGINT, this signal cannot be caught or ignored, and the receiving process cannot perform any clean-up upon * receiving this signal. */ public const SIGKILL = 'SIGKILL'; /** * The SIGUSR1 signal is sent to a process to indicate user-defined conditions. */ public const SIGUSR1 = 'SIGUSR1'; /** * The SIGUSR1 signa2 is sent to a process to indicate user-defined conditions. */ public const SIGUSR2 = 'SIGUSR2'; /** * The SIGSEGV signal is sent to a process when it makes an invalid virtual memory reference, or segmentation fault, * i.e. when it performs a segmentation violation. */ public const SIGSEGV = 'SIGSEGV'; /** * The SIGPIPE signal is sent to a process when it attempts to write to a pipe without a process connected to the * other end. */ public const SIGPIPE = 'SIGPIPE'; /** * The SIGALRM, SIGVTALRM and SIGPROF signal is sent to a process when the time limit specified in a call to a * preceding alarm setting function (such as setitimer) elapses. SIGALRM is sent when real or clock time elapses. * SIGVTALRM is sent when CPU time used by the process elapses. SIGPROF is sent when CPU time used by the process * and by the system on behalf of the process elapses. */ public const SIGALRM = 'SIGALRM'; /** * The SIGTERM signal is sent to a process to request its termination. Unlike the SIGKILL signal, it can be caught * and interpreted or ignored by the process. This allows the process to perform nice termination releasing * resources and saving state if appropriate. SIGINT is nearly identical to SIGTERM. */ public const SIGTERM = 'SIGTERM'; public const SIGSTKFLT = 'SIGSTKFLT'; public const SIGCLD = 'SIGCLD'; /** * The SIGCHLD signal is sent to a process when a child process terminates, is interrupted, or resumes after being * interrupted. One common usage of the signal is to instruct the operating system to clean up the resources used by * a child process after its termination without an explicit call to the wait system call. */ public const SIGCHLD = 'SIGCHLD'; /** * The SIGCONT signal instructs the operating system to continue (restart) a process previously paused by the * SIGSTOP or SIGTSTP signal. One important use of this signal is in job control in the Unix shell. */ public const SIGCONT = 'SIGCONT'; /** * The SIGSTOP signal instructs the operating system to stop a process for later resumption. */ public const SIGSTOP = 'SIGSTOP'; /** * The SIGTSTP signal is sent to a process by its controlling terminal to request it to stop (terminal stop). It is * commonly initiated by the user pressing Ctrl+Z. Unlike SIGSTOP, the process can register a signal handler for or * ignore the signal. */ public const SIGTSTP = 'SIGTSTP'; /** * The SIGTTIN signal is sent to a process when it attempts to read in from the tty while in the background. * Typically, this signal is received only by processes under job control; daemons do not have controlling */ public const SIGTTIN = 'SIGTTIN'; /** * The SIGTTOU signal is sent to a process when it attempts to write out from the tty while in the background. * Typically, this signal is received only by processes under job control; daemons do not have controlling */ public const SIGTTOU = 'SIGTTOU'; /** * The SIGURG signal is sent to a process when a socket has urgent or out-of-band data available to read. */ public const SIGURG = 'SIGURG'; /** * The SIGXCPU signal is sent to a process when it has used up the CPU for a duration that exceeds a certain * predetermined user-settable value. The arrival of a SIGXCPU signal provides the receiving process a chance to * quickly save any intermediate results and to exit gracefully, before it is terminated by the operating system * using the SIGKILL signal. */ public const SIGXCPU = 'SIGXCPU'; /** * The SIGXFSZ signal is sent to a process when it grows a file larger than the maximum allowed size */ public const SIGXFSZ = 'SIGXFSZ'; /** * The SIGVTALRM signal is sent to a process when the time limit specified in a call to a preceding alarm setting * function (such as setitimer) elapses. SIGVTALRM is sent when CPU time used by the process elapses. */ public const SIGVTALRM = 'SIGVTALRM'; /** * The SIGPROF signal is sent to a process when the time limit specified in a call to a preceding alarm setting * function (such as setitimer) elapses. SIGPROF is sent when CPU time used by the process and by the system on * behalf of the process elapses. */ public const SIGPROF = 'SIGPROF'; /** * The SIGWINCH signal is sent to a process when its controlling terminal changes its size (a window change). */ public const SIGWINCH = 'SIGWINCH'; /** * The SIGPOLL signal is sent when an event occurred on an explicitly watched file descriptor.Using it effectively * leads to making asynchronous I/O requests since the kernel will poll the descriptor in place of the caller. It * provides an alternative to active polling. */ public const SIGPOLL = 'SIGPOLL'; public const SIGIO = 'SIGIO'; /** * The SIGPWR signal is sent to a process when the system experiences a power failure. */ public const SIGPWR = 'SIGPWR'; /** * The SIGSYS signal is sent to a process when it passes a bad argument to a system call. In practice, this kind of * signal is rarely encountered since applications rely on libraries (e.g. libc) to make the call for them. */ public const SIGSYS = 'SIGSYS'; public const SIGBABY = 'SIGBABY'; /** * CTRL+Break support, available on Windows only for PHP_WINDOWS_EVENT_CTRL_BREAK */ public const SIGBREAK = 'SIGBREAK'; private const ALL_SIGNALS = [self::SIGHUP, self::SIGINT, self::SIGQUIT, self::SIGILL, self::SIGTRAP, self::SIGABRT, self::SIGIOT, self::SIGBUS, self::SIGFPE, self::SIGKILL, self::SIGUSR1, self::SIGUSR2, self::SIGSEGV, self::SIGPIPE, self::SIGALRM, self::SIGTERM, self::SIGSTKFLT, self::SIGCLD, self::SIGCHLD, self::SIGCONT, self::SIGSTOP, self::SIGTSTP, self::SIGTTIN, self::SIGTTOU, self::SIGURG, self::SIGXCPU, self::SIGXFSZ, self::SIGVTALRM, self::SIGPROF, self::SIGWINCH, self::SIGPOLL, self::SIGIO, self::SIGPWR, self::SIGSYS, self::SIGBABY, self::SIGBREAK]; /** * @var self::SIG*|null */ private $triggered = null; /** * @var list * @readonly */ private $signals; /** * @var LoggerInterface|(callable(self::SIG* $name, SignalHandler $self): void)|null * @readonly */ private $loggerOrCallback; /** * @var array> */ private static $handlers = []; /** @var Closure|null */ private static $windowsHandler = null; /** * @param array $signals * @param LoggerInterface|(callable(self::SIG* $name, SignalHandler $self): void)|null $loggerOrCallback */ private function __construct(array $signals, $loggerOrCallback) { if (!\is_callable($loggerOrCallback) && !$loggerOrCallback instanceof LoggerInterface && $loggerOrCallback !== null) { throw new \InvalidArgumentException('$loggerOrCallback must be a ' . LoggerInterface::class . ' instance, a callable, or null, ' . (\is_object($loggerOrCallback) ? \get_class($loggerOrCallback) : \gettype($loggerOrCallback)) . ' received.'); } $this->signals = $signals; $this->loggerOrCallback = $loggerOrCallback; } /** * @param self::SIG* $signalName */ private function trigger(string $signalName) : void { $this->triggered = $signalName; if ($this->loggerOrCallback instanceof LoggerInterface) { $this->loggerOrCallback->info('Received ' . $signalName); } elseif ($this->loggerOrCallback !== null) { ($this->loggerOrCallback)($signalName, $this); } } /** * Fetches the triggered state of the handler * * @phpstan-impure */ public function isTriggered() : bool { return $this->triggered !== null; } /** * Exits the process while communicating that the handled signal was what killed the process * * This is different from doing exit(SIGINT), and is also different to a successful exit(0). * * This should only be used when you received a signal and then handled it to gracefully shutdown and are now ready to shutdown. * * ``` * $signal = SignalHandler::create([SignalHandler::SIGINT], function (string $signal, SignalHandler $handler) { * // do cleanup here.. * * $handler->exitWithLastSignal(); * }); * * // or... * * $signal = SignalHandler::create([SignalHandler::SIGINT]); * * while ($doingThings) { * if ($signal->isTriggered()) { * $signal->exitWithLastSignal(); * } * * // do more things * } * ``` * * @see https://www.cons.org/cracauer/sigint.html * @return never */ public function exitWithLastSignal() : void { $signal = $this->triggered ?? 'SIGINT'; $signal = \defined($signal) ? \constant($signal) : 2; if (\function_exists('posix_kill') && \function_exists('posix_getpid')) { \pcntl_signal($signal, \SIG_DFL); \posix_kill(\posix_getpid(), $signal); } // just in case posix_kill above could not run // not strictly correct but it's the best we can do here exit(128 + $signal); } /** * Resets the state to let a handler accept a signal again */ public function reset() : void { $this->triggered = null; } public function __destruct() { $this->unregister(); } /** * @param (string|int)[] $signals array of signal names (more portable, see SignalHandler::SIG*) or constants - defaults to [SIGINT, SIGTERM] * @param LoggerInterface|callable $loggerOrCallback A PSR-3 Logger or a callback($signal, $signalName) * @return self A handler on which you can call isTriggered to know if the signal was received, and reset() to forget * * @phpstan-param list $signals * @phpstan-param LoggerInterface|(callable(self::SIG* $name, SignalHandler $self): void) $loggerOrCallback */ public static function create(?array $signals = null, $loggerOrCallback = null) : self { if ($signals === null) { $signals = [self::SIGINT, self::SIGTERM]; } $signals = \array_map(function ($signal) { if (\is_int($signal)) { return self::getSignalName($signal); } elseif (!\in_array($signal, self::ALL_SIGNALS, \true)) { throw new \InvalidArgumentException('$signals must be an array of SIG* constants or self::SIG* constants, got ' . \var_export($signal, \true)); } return $signal; }, (array) $signals); $handler = new self($signals, $loggerOrCallback); if (\PHP_VERSION_ID >= 80000) { \array_unshift(self::$handlers, WeakReference::create($handler)); } else { \array_unshift(self::$handlers, $handler); } if (\function_exists('sapi_windows_set_ctrl_handler') && \PHP_SAPI === 'cli' && (\in_array(self::SIGINT, $signals, \true) || \in_array(self::SIGBREAK, $signals, \true))) { if (null === self::$windowsHandler) { self::$windowsHandler = Closure::fromCallable([self::class, 'handleWindowsSignal']); \sapi_windows_set_ctrl_handler(self::$windowsHandler); } } if (\function_exists('pcntl_signal') && \function_exists('pcntl_async_signals')) { \pcntl_async_signals(\true); self::registerPcntlHandler($signals); } return $handler; } /** * Clears the signal handler * * On PHP 8+ this is not necessary and it will happen automatically on __destruct, but PHP 7 does not * support weak references and thus there you need to manually do this. * * If another handler was registered previously to this one, it becomes active again */ public function unregister() : void { $signals = $this->signals; $index = \false; foreach (self::$handlers as $key => $handler) { if ($handler instanceof WeakReference && $handler->get() === $this || $handler === $this) { $index = $key; break; } } if ($index === \false) { // guard against double-unregistration when __destruct happens return; } unset(self::$handlers[$index]); if (self::$windowsHandler !== null && (\in_array(self::SIGINT, $signals, \true) || \in_array(self::SIGBREAK, $signals, \true))) { if (self::getHandlerFor(self::SIGINT) === null && self::getHandlerFor(self::SIGBREAK) === null) { \sapi_windows_set_ctrl_handler(self::$windowsHandler, \false); self::$windowsHandler = null; } } if (\function_exists('pcntl_signal')) { foreach ($signals as $signal) { // skip missing signals, for example OSX does not have all signals if (!\defined($signal)) { continue; } // keep listening to signals where we have a handler registered if (self::getHandlerFor($signal) !== null) { continue; } \pcntl_signal(\constant($signal), \SIG_DFL); } } } /** * Clears all signal handlers * * On PHP 8+ this should not be necessary as it will happen automatically on __destruct, but PHP 7 does not * support weak references and thus there you need to manually do this. * * This can be done to reset the global state, but ideally you should always call ->unregister() in a try/finally block to ensure it happens. */ public static function unregisterAll() : void { if (self::$windowsHandler !== null) { \sapi_windows_set_ctrl_handler(self::$windowsHandler, \false); self::$windowsHandler = null; } foreach (self::$handlers as $key => $handler) { if ($handler instanceof WeakReference) { $handler = $handler->get(); if ($handler === null) { unset(self::$handlers[$key]); continue; } } $handler->unregister(); } } /** * @param list $signals */ private static function registerPcntlHandler(array $signals) : void { static $callable; if ($callable === null) { $callable = Closure::fromCallable([self::class, 'handlePcntlSignal']); } foreach ($signals as $signal) { // skip missing signals, for example OSX does not have all signals if (!\defined($signal)) { continue; } \pcntl_signal(\constant($signal), $callable); } } private static function handleWindowsSignal(int $event) : void { if (\PHP_WINDOWS_EVENT_CTRL_C === $event) { self::callHandlerFor(self::SIGINT); } elseif (\PHP_WINDOWS_EVENT_CTRL_BREAK === $event) { self::callHandlerFor(self::SIGBREAK); } } private static function handlePcntlSignal(int $signal) : void { self::callHandlerFor(self::getSignalName($signal)); } /** * Calls the first handler from the top of the stack that can handle a given signal * * @param self::SIG* $signal */ private static function callHandlerFor(string $signal) : void { $handler = self::getHandlerFor($signal); if ($handler !== null) { $handler->trigger($signal); } } /** * Returns the first handler from the top of the stack that can handle a given signal * * @param self::SIG* $signal * @return self|null */ private static function getHandlerFor(string $signal) : ?self { foreach (self::$handlers as $key => $handler) { if ($handler instanceof WeakReference) { $handler = $handler->get(); if ($handler === null) { unset(self::$handlers[$key]); continue; } } if (\in_array($signal, $handler->signals, \true)) { return $handler; } } return null; } /** * @return self::SIG* */ private static function getSignalName(int $signo) : string { static $signals = null; if ($signals === null) { $signals = []; foreach (self::ALL_SIGNALS as $value) { if (\defined($value)) { $signals[\constant($value)] = $value; } } } if (isset($signals[$signo])) { return $signals[$signo]; } throw new \InvalidArgumentException('Unknown signal #' . $signo); } } PHPDoc Parser for PHPStan

Build Status Latest Stable Version License PHPStan Enabled

This library `phpstan/phpdoc-parser` represents PHPDocs with an AST (Abstract Syntax Tree). It supports parsing and modifying PHPDocs. For the complete list of supported PHPDoc features check out PHPStan documentation. PHPStan is the main (but not the only) user of this library. * [PHPDoc Basics](https://phpstan.org/writing-php-code/phpdocs-basics) (list of PHPDoc tags) * [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) (list of PHPDoc types) * [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/2.1.x/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc. This parser also supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.1.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). ## Installation ``` composer require phpstan/phpdoc-parser ``` ## Basic usage ```php tokenize('/** @param Lorem $a */')); $phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode $paramTags = $phpDocNode->getParamTagValues(); // ParamTagValueNode[] echo $paramTags[0]->parameterName; // '$a' echo $paramTags[0]->type; // IdentifierTypeNode - 'Lorem' ``` ### Format-preserving printer This component can be used to modify the AST and print it again as close as possible to the original. It's heavily inspired by format-preserving printer component in [nikic/PHP-Parser](https://github.com/nikic/PHP-Parser). ```php true, 'indexes' => true, 'comments' => true]); $lexer = new Lexer($config); $constExprParser = new ConstExprParser($config); $typeParser = new TypeParser($config, $constExprParser); $phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); $tokens = new TokenIterator($lexer->tokenize('/** @param Lorem $a */')); $phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode $cloningTraverser = new NodeTraverser([new CloningVisitor()]); /** @var PhpDocNode $newPhpDocNode */ [$newPhpDocNode] = $cloningTraverser->traverse([$phpDocNode]); // change something in $newPhpDocNode $newPhpDocNode->getParamTagValues()[0]->type = new IdentifierTypeNode('Ipsum'); // print changed PHPDoc $printer = new Printer(); $newPhpDoc = $printer->printFormatPreserving($newPhpDocNode, $phpDocNode, $tokens); echo $newPhpDoc; // '/** @param Ipsum $a */' ``` ## Code of Conduct This project adheres to a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code. ## Building Initially you need to run `composer install`, or `composer update` in case you aren't working in a folder which was built before. Afterwards you can either run the whole build including linting and coding standards using make or run only tests using make tests Upgrading from phpstan/phpdoc-parser 1.x to 2.0 ================================= ### PHP version requirements phpstan/phpdoc-parser now requires PHP 7.4 or newer to run. ### Changed constructors of parser classes Instead of different arrays and boolean values passed into class constructors during setup, parser classes now share a common ParserConfig object. Before: ```php use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\TypeParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; $usedAttributes = ['lines' => true, 'indexes' => true]; $lexer = new Lexer(); $constExprParser = new ConstExprParser(true, true, $usedAttributes); $typeParser = new TypeParser($constExprParser, true, $usedAttributes); $phpDocParser = new PhpDocParser($typeParser, $constExprParser, true, true, $usedAttributes); ``` After: ```php use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\PhpDocParser\ParserConfig; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\TypeParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; $config = new ParserConfig(usedAttributes: ['lines' => true, 'indexes' => true]); $lexer = new Lexer($config); $constExprParser = new ConstExprParser($config); $typeParser = new TypeParser($config, $constExprParser); $phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); ``` The point of ParserConfig is that over the course of phpstan/phpdoc-parser 2.x development series it's most likely going to gain new optional parameters akin to PHPStan's [bleeding edge](https://phpstan.org/blog/what-is-bleeding-edge). These parameters will allow opting in to new behaviour which will become the default in 3.0. With ParserConfig object, it's now going to be impossible to configure parser classes inconsistently. Which [happened to users](https://github.com/phpstan/phpdoc-parser/issues/251#issuecomment-2333927959) when they were separate boolean values. ### Support for parsing Doctrine annotations This parser now supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes representing Doctrine Annotations live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.0.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). ### Whitespace before description is required phpdoc-parser 1.x sometimes silently consumed invalid part of a PHPDoc type as description: ```php /** @return \Closure(...int, string): string */ ``` This became `IdentifierTypeNode` of `\Closure` and with `(...int, string): string` as description. (Valid callable syntax is: `\Closure(int ...$u, string): string`.) Another example: ```php /** @return array{foo: int}} */ ``` The extra `}` also became description. Both of these examples are now InvalidTagValueNode. If these parts are supposed to be PHPDoc descriptions, you need to put whitespace between the type and the description text: ```php /** @return \Closure (...int, string): string */ /** @return array{foo: int} } */ ``` ### Type aliases with invalid types are preserved In phpdoc-parser 1.x, invalid type alias syntax was represented as [`InvalidTagValueNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.InvalidTagValueNode.html), losing information about a type alias being present. ```php /** * @phpstan-type TypeAlias */ ``` This `@phpstan-type` is missing the actual type to alias. In phpdoc-parser 2.0 this is now represented as [`TypeAliasTagValueNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.TypeAliasTagValueNode.html) (instead of `InvalidTagValueNode`) with [`InvalidTypeNode`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.Type.InvalidTypeNode.html) in place of the type. ### Removal of QuoteAwareConstExprStringNode The class [QuoteAwareConstExprStringNode](https://phpstan.github.io/phpdoc-parser/1.23.x/PHPStan.PhpDocParser.Ast.ConstExpr.QuoteAwareConstExprStringNode.html) has been removed. Instead, [ConstExprStringNode](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.ConstExpr.ConstExprStringNode.html) gained information about the kind of quotes being used. ### Removed 2nd parameter of `ConstExprParser::parse()` (`$trimStrings`) `ConstExprStringNode::$value` now contains unescaped values without surrounding `''` or `""` quotes. Use `ConstExprStringNode::__toString()` or [`Printer`](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Printer.Printer.html) to get the escaped value along with surrounding quotes. ### Text between tags always belongs to description Multi-line descriptions between tags were previously represented as separate [PhpDocTextNode](https://phpstan.github.io/phpdoc-parser/2.0.x/PHPStan.PhpDocParser.Ast.PhpDoc.PhpDocTextNode.html): ```php /** * @param Foo $foo 1st multi world description * some text in the middle * @param Bar $bar 2nd multi world description */ ``` The line with `some text in the middle` in phpdoc-parser 2.0 is now part of the description of the first `@param` tag. ### `ArrayShapeNode` construction changes `ArrayShapeNode` constructor made private, added public static methods `createSealed()` and `createUnsealed()`. ### Minor BC breaks * Constructor parameter `$isEquality` in `AssertTag*ValueNode` made required * Constructor parameter `$templateTypes` in `MethodTagValueNode` made required * Constructor parameter `$isReference` in `ParamTagValueNode` made required * Constructor parameter `$isReference` in `TypelessParamTagValueNode` made required * Constructor parameter `$templateTypes` in `CallableTypeNode` made required * Constructor parameters `$expectedTokenValue` and `$currentTokenLine` in `ParserException` made required * `ArrayShapeItemNode` and `ObjectShapeItemNode` are not standalone TypeNode, just Node { "name": "phpstan\/phpdoc-parser", "description": "PHPDoc parser with support for nullable, intersection and generic types", "license": "MIT", "require": { "php": "^7.4 || ^8.0" }, "require-dev": { "doctrine\/annotations": "^2.0", "nikic\/php-parser": "^5.3.0", "php-parallel-lint\/php-parallel-lint": "^1.2", "phpstan\/extension-installer": "^1.0", "phpstan\/phpstan": "^2.0", "phpstan\/phpstan-phpunit": "^2.0", "phpstan\/phpstan-strict-rules": "^2.0", "phpunit\/phpunit": "^9.6", "symfony\/process": "^5.2" }, "config": { "platform": { "php": "7.4.6" }, "sort-packages": true, "allow-plugins": { "phpstan\/extension-installer": true } }, "autoload": { "psr-4": { "_ContaoManager\\PHPStan\\PhpDocParser\\": [ "src\/" ] } }, "autoload-dev": { "psr-4": { "_ContaoManager\\PHPStan\\PhpDocParser\\": [ "tests\/PHPStan" ] } }, "minimum-stability": "dev", "prefer-stable": true } '\'&\'', self::TOKEN_UNION => '\'|\'', self::TOKEN_INTERSECTION => '\'&\'', self::TOKEN_NULLABLE => '\'?\'', self::TOKEN_NEGATED => '\'!\'', self::TOKEN_OPEN_PARENTHESES => '\'(\'', self::TOKEN_CLOSE_PARENTHESES => '\')\'', self::TOKEN_OPEN_ANGLE_BRACKET => '\'<\'', self::TOKEN_CLOSE_ANGLE_BRACKET => '\'>\'', self::TOKEN_OPEN_SQUARE_BRACKET => '\'[\'', self::TOKEN_CLOSE_SQUARE_BRACKET => '\']\'', self::TOKEN_OPEN_CURLY_BRACKET => '\'{\'', self::TOKEN_CLOSE_CURLY_BRACKET => '\'}\'', self::TOKEN_COMMA => '\',\'', self::TOKEN_COMMENT => '\'//\'', self::TOKEN_COLON => '\':\'', self::TOKEN_VARIADIC => '\'...\'', self::TOKEN_DOUBLE_COLON => '\'::\'', self::TOKEN_DOUBLE_ARROW => '\'=>\'', self::TOKEN_ARROW => '\'->\'', self::TOKEN_EQUAL => '\'=\'', self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', self::TOKEN_DOCTRINE_TAG => 'TOKEN_DOCTRINE_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', self::TOKEN_DOCTRINE_ANNOTATION_STRING => 'TOKEN_DOCTRINE_ANNOTATION_STRING', self::TOKEN_IDENTIFIER => 'type', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'variable', self::TOKEN_HORIZONTAL_WS => 'TOKEN_HORIZONTAL_WS', self::TOKEN_OTHER => 'TOKEN_OTHER', self::TOKEN_END => 'TOKEN_END', self::TOKEN_WILDCARD => '*']; public const VALUE_OFFSET = 0; public const TYPE_OFFSET = 1; public const LINE_OFFSET = 2; private ParserConfig $config; // @phpstan-ignore property.onlyWritten private ?string $regexp = null; public function __construct(ParserConfig $config) { $this->config = $config; } /** * @return list */ public function tokenize(string $s) : array { if ($this->regexp === null) { $this->regexp = $this->generateRegexp(); } preg_match_all($this->regexp, $s, $matches, PREG_SET_ORDER); $tokens = []; $line = 1; foreach ($matches as $match) { $type = (int) $match['MARK']; $tokens[] = [$match[0], $type, $line]; if ($type !== self::TOKEN_PHPDOC_EOL) { continue; } $line++; } $tokens[] = ['', self::TOKEN_END, $line]; return $tokens; } private function generateRegexp() : string { $patterns = [ self::TOKEN_HORIZONTAL_WS => '[\\x09\\x20]++', self::TOKEN_IDENTIFIER => '(?:[\\\\]?+[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF-]*+)++', self::TOKEN_THIS_VARIABLE => '\\$this(?![0-9a-z_\\x80-\\xFF])', self::TOKEN_VARIABLE => '\\$[a-z_\\x80-\\xFF][0-9a-z_\\x80-\\xFF]*+', // '&' followed by TOKEN_VARIADIC, TOKEN_VARIABLE, TOKEN_EQUAL, TOKEN_EQUAL or TOKEN_CLOSE_PARENTHESES self::TOKEN_REFERENCE => '&(?=\\s*+(?:[.,=)]|(?:\\$(?!this(?![0-9a-z_\\x80-\\xFF])))))', self::TOKEN_UNION => '\\|', self::TOKEN_INTERSECTION => '&', self::TOKEN_NULLABLE => '\\?', self::TOKEN_NEGATED => '!', self::TOKEN_OPEN_PARENTHESES => '\\(', self::TOKEN_CLOSE_PARENTHESES => '\\)', self::TOKEN_OPEN_ANGLE_BRACKET => '<', self::TOKEN_CLOSE_ANGLE_BRACKET => '>', self::TOKEN_OPEN_SQUARE_BRACKET => '\\[', self::TOKEN_CLOSE_SQUARE_BRACKET => '\\]', self::TOKEN_OPEN_CURLY_BRACKET => '\\{', self::TOKEN_CLOSE_CURLY_BRACKET => '\\}', self::TOKEN_COMMA => ',', self::TOKEN_COMMENT => '\\/\\/[^\\r\\n]*(?=\\n|\\r|\\*/)', self::TOKEN_VARIADIC => '\\.\\.\\.', self::TOKEN_DOUBLE_COLON => '::', self::TOKEN_DOUBLE_ARROW => '=>', self::TOKEN_ARROW => '->', self::TOKEN_EQUAL => '=', self::TOKEN_COLON => ':', self::TOKEN_OPEN_PHPDOC => '/\\*\\*(?=\\s)\\x20?+', self::TOKEN_CLOSE_PHPDOC => '\\*/', self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+', self::TOKEN_DOCTRINE_TAG => '@[a-z_\\\\][a-z0-9_\\:\\\\]*[a-z_][a-z0-9_]*', self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?', self::TOKEN_FLOAT => '[+\\-]?(?:(?:[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+\\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+\\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]++(_[0-9]++)*e[+\\-]?[0-9]++(_[0-9]++)*))', self::TOKEN_INTEGER => '[+\\-]?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))', self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'', self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"', self::TOKEN_DOCTRINE_ANNOTATION_STRING => '"(?:""|[^"])*+"', self::TOKEN_WILDCARD => '\\*', // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL self::TOKEN_OTHER => '(?:(?!\\*/)[^\\s])++', ]; foreach ($patterns as $type => &$pattern) { $pattern = '(?:' . $pattern . ')(*MARK:' . $type . ')'; } return '~' . implode('|', $patterns) . '~Asi'; } } type = $type; $this->old = $old; $this->new = $new; } } isEqual = $isEqual; } /** * Calculate diff (edit script) from $old to $new. * * @param T[] $old Original array * @param T[] $new New array * * @return DiffElem[] Diff (edit script) */ public function diff(array $old, array $new) : array { [$trace, $x, $y] = $this->calculateTrace($old, $new); return $this->extractDiff($trace, $x, $y, $old, $new); } /** * Calculate diff, including "replace" operations. * * If a sequence of remove operations is followed by the same number of add operations, these * will be coalesced into replace operations. * * @param T[] $old Original array * @param T[] $new New array * * @return DiffElem[] Diff (edit script), including replace operations */ public function diffWithReplacements(array $old, array $new) : array { return $this->coalesceReplacements($this->diff($old, $new)); } /** * @param T[] $old * @param T[] $new * @return array{array>, int, int} */ private function calculateTrace(array $old, array $new) : array { $n = count($old); $m = count($new); $max = $n + $m; $v = [1 => 0]; $trace = []; for ($d = 0; $d <= $max; $d++) { $trace[] = $v; for ($k = -$d; $k <= $d; $k += 2) { if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { $x = $v[$k + 1]; } else { $x = $v[$k - 1] + 1; } $y = $x - $k; while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { $x++; $y++; } $v[$k] = $x; if ($x >= $n && $y >= $m) { return [$trace, $x, $y]; } } } throw new Exception('Should not happen'); } /** * @param array> $trace * @param T[] $old * @param T[] $new * @return DiffElem[] */ private function extractDiff(array $trace, int $x, int $y, array $old, array $new) : array { $result = []; for ($d = count($trace) - 1; $d >= 0; $d--) { $v = $trace[$d]; $k = $x - $y; if ($k === -$d || $k !== $d && $v[$k - 1] < $v[$k + 1]) { $prevK = $k + 1; } else { $prevK = $k - 1; } $prevX = $v[$prevK]; $prevY = $prevX - $prevK; while ($x > $prevX && $y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); $x--; $y--; } if ($d === 0) { break; } while ($x > $prevX) { $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); $x--; } while ($y > $prevY) { $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); $y--; } } return array_reverse($result); } /** * Coalesce equal-length sequences of remove+add into a replace operation. * * @param DiffElem[] $diff * @return DiffElem[] */ private function coalesceReplacements(array $diff) : array { $newDiff = []; $c = count($diff); for ($i = 0; $i < $c; $i++) { $diffType = $diff[$i]->type; if ($diffType !== DiffElem::TYPE_REMOVE) { $newDiff[] = $diff[$i]; continue; } $j = $i; while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { $j++; } $k = $j; while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { $k++; } if ($j - $i === $k - $j) { $len = $j - $i; for ($n = 0; $n < $len; $n++) { $newDiff[] = new DiffElem(DiffElem::TYPE_REPLACE, $diff[$i + $n]->old, $diff[$j + $n]->new); } } else { for (; $i < $k; $i++) { $newDiff[] = $diff[$i]; } } $i = $k - 1; } return $newDiff; } } */ private Differ $differ; /** * Map From "{$class}->{$subNode}" to string that should be inserted * between elements of this list subnode * * @var array */ private array $listInsertionMap = [PhpDocNode::class . '->children' => "\n * ", UnionTypeNode::class . '->types' => '|', IntersectionTypeNode::class . '->types' => '&', ArrayShapeNode::class . '->items' => ', ', ObjectShapeNode::class . '->items' => ', ', CallableTypeNode::class . '->parameters' => ', ', CallableTypeNode::class . '->templateTypes' => ', ', GenericTypeNode::class . '->genericTypes' => ', ', ConstExprArrayNode::class . '->items' => ', ', MethodTagValueNode::class . '->parameters' => ', ', DoctrineArray::class . '->items' => ', ', DoctrineAnnotation::class . '->arguments' => ', ']; /** * [$find, $extraLeft, $extraRight] * * @var array */ private array $emptyListInsertionMap = [CallableTypeNode::class . '->parameters' => ['(', '', ''], ArrayShapeNode::class . '->items' => ['{', '', ''], ObjectShapeNode::class . '->items' => ['{', '', ''], DoctrineArray::class . '->items' => ['{', '', ''], DoctrineAnnotation::class . '->arguments' => ['(', '', '']]; /** @var array>> */ private array $parenthesesMap = [CallableTypeNode::class . '->returnType' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class], ArrayTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, ConstTypeNode::class, NullableTypeNode::class], OffsetAccessTypeNode::class . '->type' => [CallableTypeNode::class, UnionTypeNode::class, IntersectionTypeNode::class, NullableTypeNode::class]]; /** @var array>> */ private array $parenthesesListMap = [IntersectionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class], UnionTypeNode::class . '->types' => [IntersectionTypeNode::class, UnionTypeNode::class, NullableTypeNode::class]]; public function printFormatPreserving(PhpDocNode $node, PhpDocNode $originalNode, TokenIterator $originalTokens) : string { $this->differ = new Differ(static function ($a, $b) { if ($a instanceof Node && $b instanceof Node) { return $a === $b->getAttribute(Attribute::ORIGINAL_NODE); } return \false; }); $tokenIndex = 0; $result = $this->printArrayFormatPreserving($node->children, $originalNode->children, $originalTokens, $tokenIndex, PhpDocNode::class, 'children'); if ($result !== null) { return $result . $originalTokens->getContentBetween($tokenIndex, $originalTokens->getTokenCount()); } return $this->print($node); } public function print(Node $node) : string { if ($node instanceof PhpDocNode) { return "/**\n *" . implode("\n *", array_map(function (PhpDocChildNode $child) : string { $s = $this->print($child); return $s === '' ? '' : ' ' . $s; }, $node->children)) . "\n */"; } if ($node instanceof PhpDocTextNode) { return $node->text; } if ($node instanceof PhpDocTagNode) { if ($node->value instanceof DoctrineTagValueNode) { return $this->print($node->value); } return trim(sprintf('%s %s', $node->name, $this->print($node->value))); } if ($node instanceof PhpDocTagValueNode) { return $this->printTagValue($node); } if ($node instanceof TypeNode) { return $this->printType($node); } if ($node instanceof ConstExprNode) { return $this->printConstExpr($node); } if ($node instanceof MethodTagValueParameterNode) { $type = $node->type !== null ? $this->print($node->type) . ' ' : ''; $isReference = $node->isReference ? '&' : ''; $isVariadic = $node->isVariadic ? '...' : ''; $default = $node->defaultValue !== null ? ' = ' . $this->print($node->defaultValue) : ''; return "{$type}{$isReference}{$isVariadic}{$node->parameterName}{$default}"; } if ($node instanceof CallableTypeParameterNode) { $type = $this->print($node->type) . ' '; $isReference = $node->isReference ? '&' : ''; $isVariadic = $node->isVariadic ? '...' : ''; $isOptional = $node->isOptional ? '=' : ''; return trim("{$type}{$isReference}{$isVariadic}{$node->parameterName}") . $isOptional; } if ($node instanceof ArrayShapeUnsealedTypeNode) { if ($node->keyType !== null) { return sprintf('<%s, %s>', $this->printType($node->keyType), $this->printType($node->valueType)); } return sprintf('<%s>', $this->printType($node->valueType)); } if ($node instanceof DoctrineAnnotation) { return (string) $node; } if ($node instanceof DoctrineArgument) { return (string) $node; } if ($node instanceof DoctrineArray) { return (string) $node; } if ($node instanceof DoctrineArrayItem) { return (string) $node; } if ($node instanceof ArrayShapeItemNode) { if ($node->keyName !== null) { return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); } return $this->printType($node->valueType); } if ($node instanceof ObjectShapeItemNode) { if ($node->keyName !== null) { return sprintf('%s%s: %s', $this->print($node->keyName), $node->optional ? '?' : '', $this->printType($node->valueType)); } return $this->printType($node->valueType); } throw new LogicException(sprintf('Unknown node type %s', get_class($node))); } private function printTagValue(PhpDocTagValueNode $node) : string { // only nodes that contain another node are handled here // the rest falls back on (string) $node if ($node instanceof AssertTagMethodValueNode) { $isNegated = $node->isNegated ? '!' : ''; $isEquality = $node->isEquality ? '=' : ''; $type = $this->printType($node->type); return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->method}() {$node->description}"); } if ($node instanceof AssertTagPropertyValueNode) { $isNegated = $node->isNegated ? '!' : ''; $isEquality = $node->isEquality ? '=' : ''; $type = $this->printType($node->type); return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->property} {$node->description}"); } if ($node instanceof AssertTagValueNode) { $isNegated = $node->isNegated ? '!' : ''; $isEquality = $node->isEquality ? '=' : ''; $type = $this->printType($node->type); return trim("{$isNegated}{$isEquality}{$type} {$node->parameter} {$node->description}"); } if ($node instanceof ExtendsTagValueNode || $node instanceof ImplementsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof MethodTagValueNode) { $static = $node->isStatic ? 'static ' : ''; $returnType = $node->returnType !== null ? $this->printType($node->returnType) . ' ' : ''; $parameters = implode(', ', array_map(fn(MethodTagValueParameterNode $parameter): string => $this->print($parameter), $node->parameters)); $description = $node->description !== '' ? " {$node->description}" : ''; $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(fn(TemplateTagValueNode $templateTag): string => $this->print($templateTag), $node->templateTypes)) . '>' : ''; return "{$static}{$returnType}{$node->methodName}{$templateTypes}({$parameters}){$description}"; } if ($node instanceof MixinTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof RequireExtendsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof RequireImplementsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof ParamOutTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->parameterName} {$node->description}"); } if ($node instanceof ParamTagValueNode) { $reference = $node->isReference ? '&' : ''; $variadic = $node->isVariadic ? '...' : ''; $type = $this->printType($node->type); return trim("{$type} {$reference}{$variadic}{$node->parameterName} {$node->description}"); } if ($node instanceof ParamImmediatelyInvokedCallableTagValueNode) { return trim("{$node->parameterName} {$node->description}"); } if ($node instanceof ParamLaterInvokedCallableTagValueNode) { return trim("{$node->parameterName} {$node->description}"); } if ($node instanceof ParamClosureThisTagValueNode) { return trim("{$node->type} {$node->parameterName} {$node->description}"); } if ($node instanceof PureUnlessCallableIsImpureTagValueNode) { return trim("{$node->parameterName} {$node->description}"); } if ($node instanceof PropertyTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->propertyName} {$node->description}"); } if ($node instanceof ReturnTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof SelfOutTagValueNode) { $type = $this->printType($node->type); return trim($type . ' ' . $node->description); } if ($node instanceof TemplateTagValueNode) { $upperBound = $node->bound !== null ? ' of ' . $this->printType($node->bound) : ''; $lowerBound = $node->lowerBound !== null ? ' super ' . $this->printType($node->lowerBound) : ''; $default = $node->default !== null ? ' = ' . $this->printType($node->default) : ''; return trim("{$node->name}{$upperBound}{$lowerBound}{$default} {$node->description}"); } if ($node instanceof ThrowsTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof TypeAliasImportTagValueNode) { return trim("{$node->importedAlias} from " . $this->printType($node->importedFrom) . ($node->importedAs !== null ? " as {$node->importedAs}" : '')); } if ($node instanceof TypeAliasTagValueNode) { $type = $this->printType($node->type); return trim("{$node->alias} {$type}"); } if ($node instanceof UsesTagValueNode) { $type = $this->printType($node->type); return trim("{$type} {$node->description}"); } if ($node instanceof VarTagValueNode) { $type = $this->printType($node->type); return trim("{$type} " . trim("{$node->variableName} {$node->description}")); } return (string) $node; } private function printType(TypeNode $node) : string { if ($node instanceof ArrayShapeNode) { $items = array_map(fn(ArrayShapeItemNode $item): string => $this->print($item), $node->items); if (!$node->sealed) { $items[] = '...' . ($node->unsealedType === null ? '' : $this->print($node->unsealedType)); } return $node->kind . '{' . implode(', ', $items) . '}'; } if ($node instanceof ArrayTypeNode) { return $this->printOffsetAccessType($node->type) . '[]'; } if ($node instanceof CallableTypeNode) { if ($node->returnType instanceof CallableTypeNode || $node->returnType instanceof UnionTypeNode || $node->returnType instanceof IntersectionTypeNode) { $returnType = $this->wrapInParentheses($node->returnType); } else { $returnType = $this->printType($node->returnType); } $template = $node->templateTypes !== [] ? '<' . implode(', ', array_map(fn(TemplateTagValueNode $templateNode): string => $this->print($templateNode), $node->templateTypes)) . '>' : ''; $parameters = implode(', ', array_map(fn(CallableTypeParameterNode $parameterNode): string => $this->print($parameterNode), $node->parameters)); return "{$node->identifier}{$template}({$parameters}): {$returnType}"; } if ($node instanceof ConditionalTypeForParameterNode) { return sprintf('(%s %s %s ? %s : %s)', $node->parameterName, $node->negated ? 'is not' : 'is', $this->printType($node->targetType), $this->printType($node->if), $this->printType($node->else)); } if ($node instanceof ConditionalTypeNode) { return sprintf('(%s %s %s ? %s : %s)', $this->printType($node->subjectType), $node->negated ? 'is not' : 'is', $this->printType($node->targetType), $this->printType($node->if), $this->printType($node->else)); } if ($node instanceof ConstTypeNode) { return $this->printConstExpr($node->constExpr); } if ($node instanceof GenericTypeNode) { $genericTypes = []; foreach ($node->genericTypes as $index => $type) { $variance = $node->variances[$index] ?? GenericTypeNode::VARIANCE_INVARIANT; if ($variance === GenericTypeNode::VARIANCE_INVARIANT) { $genericTypes[] = $this->printType($type); } elseif ($variance === GenericTypeNode::VARIANCE_BIVARIANT) { $genericTypes[] = '*'; } else { $genericTypes[] = sprintf('%s %s', $variance, $this->print($type)); } } return $node->type . '<' . implode(', ', $genericTypes) . '>'; } if ($node instanceof IdentifierTypeNode) { return $node->name; } if ($node instanceof IntersectionTypeNode || $node instanceof UnionTypeNode) { $items = []; foreach ($node->types as $type) { if ($type instanceof IntersectionTypeNode || $type instanceof UnionTypeNode || $type instanceof NullableTypeNode) { $items[] = $this->wrapInParentheses($type); continue; } $items[] = $this->printType($type); } return implode($node instanceof IntersectionTypeNode ? '&' : '|', $items); } if ($node instanceof InvalidTypeNode) { return (string) $node; } if ($node instanceof NullableTypeNode) { if ($node->type instanceof IntersectionTypeNode || $node->type instanceof UnionTypeNode) { return '?(' . $this->printType($node->type) . ')'; } return '?' . $this->printType($node->type); } if ($node instanceof ObjectShapeNode) { $items = array_map(fn(ObjectShapeItemNode $item): string => $this->print($item), $node->items); return 'object{' . implode(', ', $items) . '}'; } if ($node instanceof OffsetAccessTypeNode) { return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; } if ($node instanceof ThisTypeNode) { return (string) $node; } throw new LogicException(sprintf('Unknown node type %s', get_class($node))); } private function wrapInParentheses(TypeNode $node) : string { return '(' . $this->printType($node) . ')'; } private function printOffsetAccessType(TypeNode $type) : string { if ($type instanceof CallableTypeNode || $type instanceof UnionTypeNode || $type instanceof IntersectionTypeNode || $type instanceof NullableTypeNode) { return $this->wrapInParentheses($type); } return $this->printType($type); } private function printConstExpr(ConstExprNode $node) : string { // this is fine - ConstExprNode classes do not contain nodes that need smart printer logic return (string) $node; } /** * @param Node[] $nodes * @param Node[] $originalNodes */ private function printArrayFormatPreserving(array $nodes, array $originalNodes, TokenIterator $originalTokens, int &$tokenIndex, string $parentNodeClass, string $subNodeName) : ?string { $diff = $this->differ->diffWithReplacements($originalNodes, $nodes); $mapKey = $parentNodeClass . '->' . $subNodeName; $insertStr = $this->listInsertionMap[$mapKey] ?? null; $result = ''; $beforeFirstKeepOrReplace = \true; $delayedAdd = []; $insertNewline = \false; [$isMultiline, $beforeAsteriskIndent, $afterAsteriskIndent] = $this->isMultiline($tokenIndex, $originalNodes, $originalTokens); if ($insertStr === "\n * ") { $insertStr = sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } foreach ($diff as $i => $diffElem) { $diffType = $diffElem->type; $arrItem = $diffElem->new; $origArrayItem = $diffElem->old; if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { $beforeFirstKeepOrReplace = \false; if (!$arrItem instanceof Node || !$origArrayItem instanceof Node) { return null; } /** @var int $itemStartPos */ $itemStartPos = $origArrayItem->getAttribute(Attribute::START_INDEX); /** @var int $itemEndPos */ $itemEndPos = $origArrayItem->getAttribute(Attribute::END_INDEX); if ($itemStartPos < 0 || $itemEndPos < 0 || $itemStartPos < $tokenIndex) { throw new LogicException(); } $comments = $arrItem->getAttribute(Attribute::COMMENTS) ?? []; $origComments = $origArrayItem->getAttribute(Attribute::COMMENTS) ?? []; $commentStartPos = count($origComments) > 0 ? $origComments[0]->startIndex : $itemStartPos; assert($commentStartPos >= 0); $result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos); if (count($delayedAdd) > 0) { foreach ($delayedAdd as $delayedAddNode) { $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($delayedAddNode), $this->parenthesesListMap[$mapKey], \true); if ($parenthesesNeeded) { $result .= '('; } if ($insertNewline) { $delayedAddComments = $delayedAddNode->getAttribute(Attribute::COMMENTS) ?? []; if (count($delayedAddComments) > 0) { $result .= $this->printComments($delayedAddComments, $beforeAsteriskIndent, $afterAsteriskIndent); $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } } $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); if ($parenthesesNeeded) { $result .= ')'; } if ($insertNewline) { $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } else { $result .= $insertStr; } } $delayedAdd = []; } $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($arrItem), $this->parenthesesListMap[$mapKey], \true) && !in_array(get_class($origArrayItem), $this->parenthesesListMap[$mapKey], \true); $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($itemStartPos, $itemEndPos); if ($addParentheses) { $result .= '('; } if ($comments !== $origComments) { if (count($comments) > 0) { $result .= $this->printComments($comments, $beforeAsteriskIndent, $afterAsteriskIndent); $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } } $result .= $this->printNodeFormatPreserving($arrItem, $originalTokens); if ($addParentheses) { $result .= ')'; } $tokenIndex = $itemEndPos + 1; } elseif ($diffType === DiffElem::TYPE_ADD) { if ($insertStr === null) { return null; } if (!$arrItem instanceof Node) { return null; } if ($insertStr === ', ' && $isMultiline || count($arrItem->getAttribute(Attribute::COMMENTS) ?? []) > 0) { $insertStr = ','; $insertNewline = \true; } if ($beforeFirstKeepOrReplace) { // Will be inserted at the next "replace" or "keep" element $delayedAdd[] = $arrItem; continue; } /** @var int $itemEndPos */ $itemEndPos = $tokenIndex - 1; if ($insertNewline) { $comments = $arrItem->getAttribute(Attribute::COMMENTS) ?? []; $result .= $insertStr; if (count($comments) > 0) { $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); $result .= $this->printComments($comments, $beforeAsteriskIndent, $afterAsteriskIndent); } $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } else { $result .= $insertStr; } $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) && in_array(get_class($arrItem), $this->parenthesesListMap[$mapKey], \true); if ($parenthesesNeeded) { $result .= '('; } $result .= $this->printNodeFormatPreserving($arrItem, $originalTokens); if ($parenthesesNeeded) { $result .= ')'; } $tokenIndex = $itemEndPos + 1; } elseif ($diffType === DiffElem::TYPE_REMOVE) { if (!$origArrayItem instanceof Node) { return null; } /** @var int $itemStartPos */ $itemStartPos = $origArrayItem->getAttribute(Attribute::START_INDEX); /** @var int $itemEndPos */ $itemEndPos = $origArrayItem->getAttribute(Attribute::END_INDEX); if ($itemStartPos < 0 || $itemEndPos < 0) { throw new LogicException(); } if ($i === 0) { // If we're removing from the start, keep the tokens before the node and drop those after it, // instead of the other way around. $originalTokensArray = $originalTokens->getTokens(); for ($j = $tokenIndex; $j < $itemStartPos; $j++) { if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) { break; } $result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET]; } } $tokenIndex = $itemEndPos + 1; } } if (count($delayedAdd) > 0) { if (!isset($this->emptyListInsertionMap[$mapKey])) { return null; } [$findToken, $extraLeft, $extraRight] = $this->emptyListInsertionMap[$mapKey]; if ($findToken !== null) { $originalTokensArray = $originalTokens->getTokens(); for (; $tokenIndex < count($originalTokensArray); $tokenIndex++) { $result .= $originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET]; if ($originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET] !== $findToken) { continue; } $tokenIndex++; break; } } $first = \true; $result .= $extraLeft; foreach ($delayedAdd as $delayedAddNode) { if (!$first) { $result .= $insertStr; if ($insertNewline) { $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); } } $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); $first = \false; } $result .= $extraRight; } return $result; } /** * @param list $comments */ private function printComments(array $comments, string $beforeAsteriskIndent, string $afterAsteriskIndent) : string { $formattedComments = []; foreach ($comments as $comment) { $formattedComments[] = str_replace("\n", "\n" . $beforeAsteriskIndent . '*' . $afterAsteriskIndent, $comment->getReformattedText()); } return implode("\n{$beforeAsteriskIndent}*{$afterAsteriskIndent}", $formattedComments); } /** * @param array $nodes * @return array{bool, string, string} */ private function isMultiline(int $initialIndex, array $nodes, TokenIterator $originalTokens) : array { $isMultiline = count($nodes) > 1; $pos = $initialIndex; $allText = ''; /** @var Node|null $node */ foreach ($nodes as $node) { if (!$node instanceof Node) { continue; } $endPos = $node->getAttribute(Attribute::END_INDEX) + 1; $text = $originalTokens->getContentBetween($pos, $endPos); $allText .= $text; if (strpos($text, "\n") === \false) { // We require that a newline is present between *every* item. If the formatting // is inconsistent, with only some items having newlines, we don't consider it // as multiline $isMultiline = \false; } $pos = $endPos; } $c = preg_match_all('~\\n(?[\\x09\\x20]*)\\*(?\\x20*)~', $allText, $matches, PREG_SET_ORDER); if ($c === 0) { return [$isMultiline, ' ', ' ']; } $before = ''; $after = ''; foreach ($matches as $match) { if (strlen($match['before']) > strlen($before)) { $before = $match['before']; } if (strlen($match['after']) <= strlen($after)) { continue; } $after = $match['after']; } $before = strlen($before) === 0 ? ' ' : $before; $after = strlen($after) === 0 ? ' ' : $after; return [$isMultiline, $before, $after]; } private function printNodeFormatPreserving(Node $node, TokenIterator $originalTokens) : string { /** @var Node|null $originalNode */ $originalNode = $node->getAttribute(Attribute::ORIGINAL_NODE); if ($originalNode === null) { return $this->print($node); } $class = get_class($node); if ($class !== get_class($originalNode)) { throw new LogicException(); } $startPos = $originalNode->getAttribute(Attribute::START_INDEX); $endPos = $originalNode->getAttribute(Attribute::END_INDEX); if ($startPos < 0 || $endPos < 0) { throw new LogicException(); } $result = ''; $pos = $startPos; $subNodeNames = array_keys(get_object_vars($node)); foreach ($subNodeNames as $subNodeName) { $subNode = $node->{$subNodeName}; $origSubNode = $originalNode->{$subNodeName}; if (!$subNode instanceof Node && $subNode !== null || !$origSubNode instanceof Node && $origSubNode !== null) { if ($subNode === $origSubNode) { // Unchanged, can reuse old code continue; } if (is_array($subNode) && is_array($origSubNode)) { // Array subnode changed, we might be able to reconstruct it $listResult = $this->printArrayFormatPreserving($subNode, $origSubNode, $originalTokens, $pos, $class, $subNodeName); if ($listResult === null) { return $this->print($node); } $result .= $listResult; continue; } return $this->print($node); } if ($origSubNode === null) { if ($subNode === null) { // Both null, nothing to do continue; } return $this->print($node); } $subStartPos = $origSubNode->getAttribute(Attribute::START_INDEX); $subEndPos = $origSubNode->getAttribute(Attribute::END_INDEX); if ($subStartPos < 0 || $subEndPos < 0) { throw new LogicException(); } if ($subEndPos < $subStartPos) { return $this->print($node); } if ($subNode === null) { return $this->print($node); } $result .= $originalTokens->getContentBetween($pos, $subStartPos); $mapKey = get_class($node) . '->' . $subNodeName; $parenthesesNeeded = isset($this->parenthesesMap[$mapKey]) && in_array(get_class($subNode), $this->parenthesesMap[$mapKey], \true); if ($subNode->getAttribute(Attribute::ORIGINAL_NODE) !== null) { $parenthesesNeeded = $parenthesesNeeded && !in_array(get_class($subNode->getAttribute(Attribute::ORIGINAL_NODE)), $this->parenthesesMap[$mapKey], \true); } $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($subStartPos, $subEndPos); if ($addParentheses) { $result .= '('; } $result .= $this->printNodeFormatPreserving($subNode, $originalTokens); if ($addParentheses) { $result .= ')'; } $pos = $subEndPos + 1; } return $result . $originalTokens->getContentBetween($pos, $endPos + 1); } } currentTokenValue = $currentTokenValue; $this->currentTokenType = $currentTokenType; $this->currentOffset = $currentOffset; $this->expectedTokenType = $expectedTokenType; $this->expectedTokenValue = $expectedTokenValue; $this->currentTokenLine = $currentTokenLine; parent::__construct(sprintf('Unexpected token %s, expected %s%s at offset %d%s', $this->formatValue($currentTokenValue), Lexer::TOKEN_LABELS[$expectedTokenType], $expectedTokenValue !== null ? sprintf(' (%s)', $this->formatValue($expectedTokenValue)) : '', $currentOffset, $currentTokenLine === null ? '' : sprintf(' on line %d', $currentTokenLine))); } public function getCurrentTokenValue() : string { return $this->currentTokenValue; } public function getCurrentTokenType() : int { return $this->currentTokenType; } public function getCurrentOffset() : int { return $this->currentOffset; } public function getExpectedTokenType() : int { return $this->expectedTokenType; } public function getExpectedTokenValue() : ?string { return $this->expectedTokenValue; } public function getCurrentTokenLine() : ?int { return $this->currentTokenLine; } private function formatValue(string $value) : string { $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE); assert($json !== \false); return $json; } } config = $config; $this->typeParser = $typeParser; $this->constantExprParser = $constantExprParser; $this->doctrineConstantExprParser = $constantExprParser->toDoctrine(); } public function parse(TokenIterator $tokens) : Ast\PhpDoc\PhpDocNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PHPDOC); $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); $children = []; if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { $lastChild = $this->parseChild($tokens); $children[] = $lastChild; while (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode && ($lastChild->value instanceof Doctrine\DoctrineTagValueNode || $lastChild->value instanceof Ast\PhpDoc\GenericTagValueNode)) { $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { break; } $lastChild = $this->parseChild($tokens); $children[] = $lastChild; continue; } if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL)) { break; } if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { break; } $lastChild = $this->parseChild($tokens); $children[] = $lastChild; } } try { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PHPDOC); } catch (ParserException $e) { $name = ''; $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if (count($children) > 0) { $lastChild = $children[count($children) - 1]; if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode) { $name = $lastChild->name; $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); } } $tag = new Ast\PhpDoc\PhpDocTagNode($name, $this->enrichWithAttributes($tokens, new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e), $startLine, $startIndex)); $tokens->forwardToTheEnd(); $comments = $tokens->flushComments(); if ($comments !== []) { throw new LogicException('Comments should already be flushed'); } return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode([$this->enrichWithAttributes($tokens, $tag, $startLine, $startIndex)]), 1, 0); } $comments = $tokens->flushComments(); if ($comments !== []) { throw new LogicException('Comments should already be flushed'); } return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode($children), 1, 0); } /** @phpstan-impure */ private function parseChild(TokenIterator $tokens) : Ast\PhpDoc\PhpDocChildNode { if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes($tokens, $this->parseTag($tokens), $startLine, $startIndex); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_TAG)) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tag = $tokens->currentTokenValue(); $tokens->next(); $tagStartLine = $tokens->currentTokenLine(); $tagStartIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocTagNode($tag, $this->enrichWithAttributes($tokens, $this->parseDoctrineTagValue($tokens, $tag), $tagStartLine, $tagStartIndex)), $startLine, $startIndex); } $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $text = $this->parseText($tokens); return $this->enrichWithAttributes($tokens, $text, $startLine, $startIndex); } /** * @template T of Ast\Node * @param T $tag * @return T */ private function enrichWithAttributes(TokenIterator $tokens, Ast\Node $tag, int $startLine, int $startIndex) : Ast\Node { if ($this->config->useLinesAttributes) { $tag->setAttribute(Ast\Attribute::START_LINE, $startLine); $tag->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } if ($this->config->useIndexAttributes) { $tag->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $tag->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } return $tag; } private function parseText(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTextNode { $text = ''; $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; $savepoint = \false; // if the next token is EOL, everything below is skipped and empty string is returned while (\true) { $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); $text .= $tmpText; // stop if we're not at EOL - meaning it's the end of PHPDoc if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC)) { break; } if (!$savepoint) { $tokens->pushSavePoint(); $savepoint = \true; } elseif ($tmpText !== '') { $tokens->dropSavePoint(); $tokens->pushSavePoint(); } $tokens->pushSavePoint(); $tokens->next(); // if we're at EOL, check what's next // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { $tokens->rollback(); break; } // otherwise if the next is text, continue building the description string $tokens->dropSavePoint(); $text .= $tokens->getDetectedNewline() ?? "\n"; } if ($savepoint) { $tokens->rollback(); $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); } return new Ast\PhpDoc\PhpDocTextNode(trim($text, " \t")); } private function parseOptionalDescriptionAfterDoctrineTag(TokenIterator $tokens) : string { $text = ''; $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; $savepoint = \false; // if the next token is EOL, everything below is skipped and empty string is returned while (\true) { $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); $text .= $tmpText; // stop if we're not at EOL - meaning it's the end of PHPDoc if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC)) { if (!$tokens->isPrecededByHorizontalWhitespace()) { return trim($text . $this->parseText($tokens)->text, " \t"); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { $tokens->pushSavePoint(); $child = $this->parseChild($tokens); if ($child instanceof Ast\PhpDoc\PhpDocTagNode) { if ($child->value instanceof Ast\PhpDoc\GenericTagValueNode || $child->value instanceof Doctrine\DoctrineTagValueNode) { $tokens->rollback(); break; } if ($child->value instanceof Ast\PhpDoc\InvalidTagValueNode) { $tokens->rollback(); $tokens->pushSavePoint(); $tokens->next(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->rollback(); break; } $tokens->rollback(); return trim($text . $this->parseText($tokens)->text, " \t"); } } $tokens->rollback(); return trim($text . $this->parseText($tokens)->text, " \t"); } break; } if (!$savepoint) { $tokens->pushSavePoint(); $savepoint = \true; } elseif ($tmpText !== '') { $tokens->dropSavePoint(); $tokens->pushSavePoint(); } $tokens->pushSavePoint(); $tokens->next(); // if we're at EOL, check what's next // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { $tokens->rollback(); break; } // otherwise if the next is text, continue building the description string $tokens->dropSavePoint(); $text .= $tokens->getDetectedNewline() ?? "\n"; } if ($savepoint) { $tokens->rollback(); $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); } return trim($text, " \t"); } public function parseTag(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagNode { $tag = $tokens->currentTokenValue(); $tokens->next(); $value = $this->parseTagValue($tokens, $tag); return new Ast\PhpDoc\PhpDocTagNode($tag, $value); } public function parseTagValue(TokenIterator $tokens, string $tag) : Ast\PhpDoc\PhpDocTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); switch ($tag) { case '@param': case '@phpstan-param': case '@psalm-param': case '@phan-param': $tagValue = $this->parseParamTagValue($tokens); break; case '@param-immediately-invoked-callable': case '@phpstan-param-immediately-invoked-callable': $tagValue = $this->parseParamImmediatelyInvokedCallableTagValue($tokens); break; case '@param-later-invoked-callable': case '@phpstan-param-later-invoked-callable': $tagValue = $this->parseParamLaterInvokedCallableTagValue($tokens); break; case '@param-closure-this': case '@phpstan-param-closure-this': $tagValue = $this->parseParamClosureThisTagValue($tokens); break; case '@pure-unless-callable-is-impure': case '@phpstan-pure-unless-callable-is-impure': $tagValue = $this->parsePureUnlessCallableIsImpureTagValue($tokens); break; case '@var': case '@phpstan-var': case '@psalm-var': case '@phan-var': $tagValue = $this->parseVarTagValue($tokens); break; case '@return': case '@phpstan-return': case '@psalm-return': case '@phan-return': case '@phan-real-return': $tagValue = $this->parseReturnTagValue($tokens); break; case '@throws': case '@phpstan-throws': $tagValue = $this->parseThrowsTagValue($tokens); break; case '@mixin': case '@phan-mixin': $tagValue = $this->parseMixinTagValue($tokens); break; case '@psalm-require-extends': case '@phpstan-require-extends': $tagValue = $this->parseRequireExtendsTagValue($tokens); break; case '@psalm-require-implements': case '@phpstan-require-implements': $tagValue = $this->parseRequireImplementsTagValue($tokens); break; case '@deprecated': $tagValue = $this->parseDeprecatedTagValue($tokens); break; case '@property': case '@property-read': case '@property-write': case '@phpstan-property': case '@phpstan-property-read': case '@phpstan-property-write': case '@psalm-property': case '@psalm-property-read': case '@psalm-property-write': case '@phan-property': case '@phan-property-read': case '@phan-property-write': $tagValue = $this->parsePropertyTagValue($tokens); break; case '@method': case '@phpstan-method': case '@psalm-method': case '@phan-method': $tagValue = $this->parseMethodTagValue($tokens); break; case '@template': case '@phpstan-template': case '@psalm-template': case '@phan-template': case '@template-covariant': case '@phpstan-template-covariant': case '@psalm-template-covariant': case '@template-contravariant': case '@phpstan-template-contravariant': case '@psalm-template-contravariant': $tagValue = $this->typeParser->parseTemplateTagValue($tokens, fn($tokens) => $this->parseOptionalDescription($tokens, \true)); break; case '@extends': case '@phpstan-extends': case '@phan-extends': case '@phan-inherits': case '@template-extends': $tagValue = $this->parseExtendsTagValue('@extends', $tokens); break; case '@implements': case '@phpstan-implements': case '@template-implements': $tagValue = $this->parseExtendsTagValue('@implements', $tokens); break; case '@use': case '@phpstan-use': case '@template-use': $tagValue = $this->parseExtendsTagValue('@use', $tokens); break; case '@phpstan-type': case '@psalm-type': case '@phan-type': $tagValue = $this->parseTypeAliasTagValue($tokens); break; case '@phpstan-import-type': case '@psalm-import-type': $tagValue = $this->parseTypeAliasImportTagValue($tokens); break; case '@phpstan-assert': case '@phpstan-assert-if-true': case '@phpstan-assert-if-false': case '@psalm-assert': case '@psalm-assert-if-true': case '@psalm-assert-if-false': case '@phan-assert': case '@phan-assert-if-true': case '@phan-assert-if-false': $tagValue = $this->parseAssertTagValue($tokens); break; case '@phpstan-this-out': case '@phpstan-self-out': case '@psalm-this-out': case '@psalm-self-out': $tagValue = $this->parseSelfOutTagValue($tokens); break; case '@param-out': case '@phpstan-param-out': case '@psalm-param-out': $tagValue = $this->parseParamOutTagValue($tokens); break; default: if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tagValue = $this->parseDoctrineTagValue($tokens, $tag); } else { $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescriptionAfterDoctrineTag($tokens)); } break; } $tokens->dropSavePoint(); } catch (ParserException $e) { $tokens->rollback(); $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens, \false), $e); } return $this->enrichWithAttributes($tokens, $tagValue, $startLine, $startIndex); } private function parseDoctrineTagValue(TokenIterator $tokens, string $tag) : Ast\PhpDoc\PhpDocTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return new Doctrine\DoctrineTagValueNode($this->enrichWithAttributes($tokens, new Doctrine\DoctrineAnnotation($tag, $this->parseDoctrineArguments($tokens, \false)), $startLine, $startIndex), $this->parseOptionalDescriptionAfterDoctrineTag($tokens)); } /** * @return list */ private function parseDoctrineArguments(TokenIterator $tokens, bool $deep) : array { if (!$tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { return []; } if (!$deep) { $tokens->addEndOfLineToSkippedTokens(); } $arguments = []; try { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); do { if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { break; } $arguments[] = $this->parseDoctrineArgument($tokens); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); } finally { if (!$deep) { $tokens->removeEndOfLineFromSkippedTokens(); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); return $arguments; } private function parseDoctrineArgument(TokenIterator $tokens) : Doctrine\DoctrineArgument { if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex); } $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); $currentValue = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $key = $this->enrichWithAttributes($tokens, new IdentifierTypeNode($currentValue), $startLine, $startIndex); $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); $value = $this->parseDoctrineArgumentValue($tokens); $tokens->dropSavePoint(); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArgument($key, $value), $startLine, $startIndex); } catch (ParserException $e) { $tokens->rollback(); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex); } } /** * @return DoctrineValueType */ private function parseDoctrineArgumentValue(TokenIterator $tokens) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG)) { $name = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineAnnotation($name, $this->parseDoctrineArguments($tokens, \true)), $startLine, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET)) { $items = []; do { if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { break; } $items[] = $this->parseDoctrineArrayItem($tokens); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArray($items), $startLine, $startIndex); } $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $identifier = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); return $identifier; } $tokens->rollback(); // because of ConstFetchNode } else { $tokens->dropSavePoint(); // because of ConstFetchNode } $currentTokenValue = $tokens->currentTokenValue(); $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { $constExpr = $this->doctrineConstantExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } return $constExpr; } catch (LogicException $e) { throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } } private function parseDoctrineArrayItem(TokenIterator $tokens) : Doctrine\DoctrineArrayItem { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); $key = $this->parseDoctrineArrayKey($tokens); if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COLON)) { $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); // will throw exception } } $value = $this->parseDoctrineArgumentValue($tokens); $tokens->dropSavePoint(); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArrayItem($key, $value), $startLine, $startIndex); } catch (ParserException $e) { $tokens->rollback(); return $this->enrichWithAttributes($tokens, new Doctrine\DoctrineArrayItem(null, $this->parseDoctrineArgumentValue($tokens)), $startLine, $startIndex); } } /** * @return ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|ConstFetchNode */ private function parseDoctrineArrayKey(TokenIterator $tokens) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { $key = $this->doctrineConstantExprParser->parseDoctrineString($tokens->currentTokenValue(), $tokens); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $value = $tokens->currentTokenValue(); $tokens->next(); $key = $this->doctrineConstantExprParser->parseDoctrineString($value, $tokens); } else { $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $tokens->dropSavePoint(); throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); } if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); return $this->enrichWithAttributes($tokens, new IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); } $tokens->rollback(); $constExpr = $this->doctrineConstantExprParser->parse($tokens); if (!$constExpr instanceof Ast\ConstExpr\ConstFetchNode) { throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); } return $constExpr; } return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } /** * @return Ast\PhpDoc\ParamTagValueNode|Ast\PhpDoc\TypelessParamTagValueNode */ private function parseParamTagValue(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagValueNode { if ($tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE, Lexer::TOKEN_VARIADIC, Lexer::TOKEN_VARIABLE)) { $type = null; } else { $type = $this->typeParser->parse($tokens); } $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); if ($type !== null) { return new Ast\PhpDoc\ParamTagValueNode($type, $isVariadic, $parameterName, $description, $isReference); } return new Ast\PhpDoc\TypelessParamTagValueNode($isVariadic, $parameterName, $description, $isReference); } private function parseParamImmediatelyInvokedCallableTagValue(TokenIterator $tokens) : Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamImmediatelyInvokedCallableTagValueNode($parameterName, $description); } private function parseParamLaterInvokedCallableTagValue(TokenIterator $tokens) : Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamLaterInvokedCallableTagValueNode($parameterName, $description); } private function parseParamClosureThisTagValue(TokenIterator $tokens) : Ast\PhpDoc\ParamClosureThisTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamClosureThisTagValueNode($type, $parameterName, $description); } private function parsePureUnlessCallableIsImpureTagValue(TokenIterator $tokens) : Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode { $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\PureUnlessCallableIsImpureTagValueNode($parameterName, $description); } private function parseVarTagValue(TokenIterator $tokens) : Ast\PhpDoc\VarTagValueNode { $type = $this->typeParser->parse($tokens); $variableName = $this->parseOptionalVariableName($tokens); $description = $this->parseOptionalDescription($tokens, $variableName === ''); return new Ast\PhpDoc\VarTagValueNode($type, $variableName, $description); } private function parseReturnTagValue(TokenIterator $tokens) : Ast\PhpDoc\ReturnTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\ReturnTagValueNode($type, $description); } private function parseThrowsTagValue(TokenIterator $tokens) : Ast\PhpDoc\ThrowsTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\ThrowsTagValueNode($type, $description); } private function parseMixinTagValue(TokenIterator $tokens) : Ast\PhpDoc\MixinTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\MixinTagValueNode($type, $description); } private function parseRequireExtendsTagValue(TokenIterator $tokens) : Ast\PhpDoc\RequireExtendsTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\RequireExtendsTagValueNode($type, $description); } private function parseRequireImplementsTagValue(TokenIterator $tokens) : Ast\PhpDoc\RequireImplementsTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\RequireImplementsTagValueNode($type, $description); } private function parseDeprecatedTagValue(TokenIterator $tokens) : Ast\PhpDoc\DeprecatedTagValueNode { $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\DeprecatedTagValueNode($description); } private function parsePropertyTagValue(TokenIterator $tokens) : Ast\PhpDoc\PropertyTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\PropertyTagValueNode($type, $parameterName, $description); } private function parseMethodTagValue(TokenIterator $tokens) : Ast\PhpDoc\MethodTagValueNode { $staticKeywordOrReturnTypeOrMethodName = $this->typeParser->parse($tokens); if ($staticKeywordOrReturnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode && $staticKeywordOrReturnTypeOrMethodName->name === 'static') { $isStatic = \true; $returnTypeOrMethodName = $this->typeParser->parse($tokens); } else { $isStatic = \false; $returnTypeOrMethodName = $staticKeywordOrReturnTypeOrMethodName; } if ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $returnType = $returnTypeOrMethodName; $methodName = $tokens->currentTokenValue(); $tokens->next(); } elseif ($returnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode) { $returnType = $isStatic ? $staticKeywordOrReturnTypeOrMethodName : null; $methodName = $returnTypeOrMethodName->name; $isStatic = \false; } else { $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); // will throw exception exit; } $templateTypes = []; if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { do { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $templateTypes[] = $this->enrichWithAttributes($tokens, $this->typeParser->parseTemplateTagValue($tokens), $startLine, $startIndex); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); } $parameters = []; $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { $parameters[] = $this->parseMethodTagValueParameter($tokens); while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $parameters[] = $this->parseMethodTagValueParameter($tokens); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\MethodTagValueNode($isStatic, $returnType, $methodName, $parameters, $description, $templateTypes); } private function parseMethodTagValueParameter(TokenIterator $tokens) : Ast\PhpDoc\MethodTagValueParameterNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); switch ($tokens->currentTokenType()) { case Lexer::TOKEN_IDENTIFIER: case Lexer::TOKEN_OPEN_PARENTHESES: case Lexer::TOKEN_NULLABLE: $parameterType = $this->typeParser->parse($tokens); break; default: $parameterType = null; } $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); $parameterName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { $defaultValue = $this->constantExprParser->parse($tokens); } else { $defaultValue = null; } return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue), $startLine, $startIndex); } private function parseExtendsTagValue(string $tagName, TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $type = $this->typeParser->parseGeneric($tokens, $this->typeParser->enrichWithAttributes($tokens, $baseType, $startLine, $startIndex)); $description = $this->parseOptionalDescription($tokens, \true); switch ($tagName) { case '@extends': return new Ast\PhpDoc\ExtendsTagValueNode($type, $description); case '@implements': return new Ast\PhpDoc\ImplementsTagValueNode($type, $description); case '@use': return new Ast\PhpDoc\UsesTagValueNode($type, $description); } throw new ShouldNotHappenException(); } private function parseTypeAliasTagValue(TokenIterator $tokens) : Ast\PhpDoc\TypeAliasTagValueNode { $alias = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); // support phan-type/psalm-type syntax $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); try { $type = $this->typeParser->parse($tokens); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_PHPDOC_EOL, null, $tokens->currentTokenLine()); } } return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); } catch (ParserException $e) { $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex)); } } private function parseTypeAliasImportTagValue(TokenIterator $tokens) : Ast\PhpDoc\TypeAliasImportTagValueNode { $importedAlias = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'from'); $identifierStartLine = $tokens->currentTokenLine(); $identifierStartIndex = $tokens->currentTokenIndex(); $importedFrom = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $importedFromType = $this->enrichWithAttributes($tokens, new IdentifierTypeNode($importedFrom), $identifierStartLine, $identifierStartIndex); $importedAs = null; if ($tokens->tryConsumeTokenValue('as')) { $importedAs = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, $importedFromType, $importedAs); } /** * @return Ast\PhpDoc\AssertTagValueNode|Ast\PhpDoc\AssertTagPropertyValueNode|Ast\PhpDoc\AssertTagMethodValueNode */ private function parseAssertTagValue(TokenIterator $tokens) : Ast\PhpDoc\PhpDocTagValueNode { $isNegated = $tokens->tryConsumeTokenType(Lexer::TOKEN_NEGATED); $isEquality = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); $type = $this->typeParser->parse($tokens); $parameter = $this->parseAssertParameter($tokens); $description = $this->parseOptionalDescription($tokens, \false); if (array_key_exists('method', $parameter)) { return new Ast\PhpDoc\AssertTagMethodValueNode($type, $parameter['parameter'], $parameter['method'], $isNegated, $description, $isEquality); } elseif (array_key_exists('property', $parameter)) { return new Ast\PhpDoc\AssertTagPropertyValueNode($type, $parameter['parameter'], $parameter['property'], $isNegated, $description, $isEquality); } return new Ast\PhpDoc\AssertTagValueNode($type, $parameter['parameter'], $isNegated, $description, $isEquality); } /** * @return array{parameter: string}|array{parameter: string, property: string}|array{parameter: string, method: string} */ private function parseAssertParameter(TokenIterator $tokens) : array { if ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $parameter = '$this'; $tokens->next(); } else { $parameter = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_ARROW)) { $tokens->consumeTokenType(Lexer::TOKEN_ARROW); $propertyOrMethod = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); return ['parameter' => $parameter, 'method' => $propertyOrMethod]; } return ['parameter' => $parameter, 'property' => $propertyOrMethod]; } return ['parameter' => $parameter]; } private function parseSelfOutTagValue(TokenIterator $tokens) : Ast\PhpDoc\SelfOutTagValueNode { $type = $this->typeParser->parse($tokens); $description = $this->parseOptionalDescription($tokens, \true); return new Ast\PhpDoc\SelfOutTagValueNode($type, $description); } private function parseParamOutTagValue(TokenIterator $tokens) : Ast\PhpDoc\ParamOutTagValueNode { $type = $this->typeParser->parse($tokens); $parameterName = $this->parseRequiredVariableName($tokens); $description = $this->parseOptionalDescription($tokens, \false); return new Ast\PhpDoc\ParamOutTagValueNode($type, $parameterName, $description); } private function parseOptionalVariableName(TokenIterator $tokens) : string { if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { $parameterName = $tokens->currentTokenValue(); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $parameterName = '$this'; $tokens->next(); } else { $parameterName = ''; } return $parameterName; } private function parseRequiredVariableName(TokenIterator $tokens) : string { $parameterName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); return $parameterName; } /** * @param bool $limitStartToken true should be used when the description immediately follows a parsed type */ private function parseOptionalDescription(TokenIterator $tokens, bool $limitStartToken) : string { if ($limitStartToken) { foreach (self::DISALLOWED_DESCRIPTION_START_TOKENS as $disallowedStartToken) { if (!$tokens->isCurrentTokenType($disallowedStartToken)) { continue; } $tokens->consumeTokenType(Lexer::TOKEN_OTHER); // will throw exception } if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END) && !$tokens->isPrecededByHorizontalWhitespace()) { $tokens->consumeTokenType(Lexer::TOKEN_HORIZONTAL_WS); // will throw exception } } return $this->parseText($tokens)->text; } } config = $config; $this->parseDoctrineStrings = \false; } /** * @internal */ public function toDoctrine() : self { $self = new self($this->config); $self->parseDoctrineStrings = \true; return $self; } public function parse(TokenIterator $tokens) : Ast\ConstExpr\ConstExprNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_FLOAT)) { $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprFloatNode(str_replace('_', '', $value)), $startLine, $startIndex); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $value)), $startLine, $startIndex); } if ($this->parseDoctrineStrings && $tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($value)), $startLine, $startIndex); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { if ($this->parseDoctrineStrings) { if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_DOUBLE_QUOTED_STRING, null, $tokens->currentTokenLine()); } $value = $tokens->currentTokenValue(); $tokens->next(); return $this->enrichWithAttributes($tokens, $this->parseDoctrineString($value, $tokens), $startLine, $startIndex); } $value = StringUnescaper::unescapeString($tokens->currentTokenValue()); $type = $tokens->currentTokenType(); $tokens->next(); return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprStringNode($value, $type === Lexer::TOKEN_SINGLE_QUOTED_STRING ? Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED : Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED), $startLine, $startIndex); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $identifier = $tokens->currentTokenValue(); $tokens->next(); switch (strtolower($identifier)) { case 'true': return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprTrueNode(), $startLine, $startIndex); case 'false': return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprFalseNode(), $startLine, $startIndex); case 'null': return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprNullNode(), $startLine, $startIndex); case 'array': $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $classConstantName = ''; $lastType = null; while (\true) { if ($lastType !== Lexer::TOKEN_IDENTIFIER && $tokens->currentTokenType() === Lexer::TOKEN_IDENTIFIER) { $classConstantName .= $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $lastType = Lexer::TOKEN_IDENTIFIER; continue; } if ($lastType !== Lexer::TOKEN_WILDCARD && $tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { $classConstantName .= '*'; $lastType = Lexer::TOKEN_WILDCARD; if ($tokens->getSkippedHorizontalWhiteSpaceIfAny() !== '') { break; } continue; } if ($lastType === null) { // trigger parse error if nothing valid was consumed $tokens->consumeTokenType(Lexer::TOKEN_WILDCARD); } break; } return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName), $startLine, $startIndex); } return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstFetchNode('', $identifier), $startLine, $startIndex); } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET, $startIndex); } throw new ParserException($tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), Lexer::TOKEN_IDENTIFIER, null, $tokens->currentTokenLine()); } private function parseArray(TokenIterator $tokens, int $endToken, int $startIndex) : Ast\ConstExpr\ConstExprArrayNode { $items = []; $startLine = $tokens->currentTokenLine(); if (!$tokens->tryConsumeTokenType($endToken)) { do { $items[] = $this->parseArrayItem($tokens); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA) && !$tokens->isCurrentTokenType($endToken)); $tokens->consumeTokenType($endToken); } return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprArrayNode($items), $startLine, $startIndex); } /** * This method is supposed to be called with TokenIterator after reading TOKEN_DOUBLE_QUOTED_STRING and shifting * to the next token. */ public function parseDoctrineString(string $text, TokenIterator $tokens) : Ast\ConstExpr\DoctrineConstExprStringNode { // Because of how Lexer works, a valid Doctrine string // can consist of a sequence of TOKEN_DOUBLE_QUOTED_STRING and TOKEN_DOCTRINE_ANNOTATION_STRING while ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING, Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { $text .= $tokens->currentTokenValue(); $tokens->next(); } return new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($text)); } private function parseArrayItem(TokenIterator $tokens) : Ast\ConstExpr\ConstExprArrayItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $expr = $this->parse($tokens); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_ARROW)) { $key = $expr; $value = $this->parse($tokens); } else { $key = null; $value = $expr; } return $this->enrichWithAttributes($tokens, new Ast\ConstExpr\ConstExprArrayItemNode($key, $value), $startLine, $startIndex); } /** * @template T of Ast\ConstExpr\ConstExprNode * @param T $node * @return T */ private function enrichWithAttributes(TokenIterator $tokens, Ast\ConstExpr\ConstExprNode $node, int $startLine, int $startIndex) : Ast\ConstExpr\ConstExprNode { if ($this->config->useLinesAttributes) { $node->setAttribute(Ast\Attribute::START_LINE, $startLine); $node->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } if ($this->config->useIndexAttributes) { $node->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $node->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } return $node; } } '\\', 'n' => "\n", 'r' => "\r", 't' => "\t", 'f' => "\f", 'v' => "\v", 'e' => "\x1b"]; public static function unescapeString(string $string) : string { $quote = $string[0]; if ($quote === '\'') { return str_replace(['\\\\', '\\\''], ['\\', '\''], substr($string, 1, -1)); } return self::parseEscapeSequences(substr($string, 1, -1), '"'); } /** * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L90-L130 */ private static function parseEscapeSequences(string $str, string $quote) : string { $str = str_replace('\\' . $quote, $quote, $str); return preg_replace_callback('~\\\\([\\\\nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\\{([0-9a-fA-F]+)\\})~', static function ($matches) { $str = $matches[1]; if (isset(self::REPLACEMENTS[$str])) { return self::REPLACEMENTS[$str]; } if ($str[0] === 'x' || $str[0] === 'X') { return chr((int) hexdec(substr($str, 1))); } if ($str[0] === 'u') { if (!isset($matches[2])) { throw new ShouldNotHappenException(); } return self::codePointToUtf8((int) hexdec($matches[2])); } return chr((int) octdec($str)); }, $str); } /** * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L132-L154 */ private static function codePointToUtf8(int $num) : string { if ($num <= 0x7f) { return chr($num); } if ($num <= 0x7ff) { return chr(($num >> 6) + 0xc0) . chr(($num & 0x3f) + 0x80); } if ($num <= 0xffff) { return chr(($num >> 12) + 0xe0) . chr(($num >> 6 & 0x3f) + 0x80) . chr(($num & 0x3f) + 0x80); } if ($num <= 0x1fffff) { return chr(($num >> 18) + 0xf0) . chr(($num >> 12 & 0x3f) + 0x80) . chr(($num >> 6 & 0x3f) + 0x80) . chr(($num & 0x3f) + 0x80); } // Invalid UTF-8 codepoint escape sequence: Codepoint too large return "�"; } } config = $config; $this->constExprParser = $constExprParser; } /** @phpstan-impure */ public function parse(TokenIterator $tokens) : Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { $type = $this->parseNullable($tokens); } else { $type = $this->parseAtomic($tokens); $tokens->pushSavePoint(); $tokens->skipNewLineTokensAndConsumeComments(); try { $enrichedType = $this->enrichTypeOnUnionOrIntersection($tokens, $type); } catch (ParserException $parserException) { $enrichedType = null; } if ($enrichedType !== null) { $type = $enrichedType; $tokens->dropSavePoint(); } else { $tokens->rollback(); $type = $this->enrichTypeOnUnionOrIntersection($tokens, $type) ?? $type; } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } /** @phpstan-impure */ private function enrichTypeOnUnionOrIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type) : ?Ast\Type\TypeNode { if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { return $this->parseUnion($tokens, $type); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { return $this->parseIntersection($tokens, $type); } return null; } /** * @internal * @template T of Ast\Node * @param T $type * @return T */ public function enrichWithAttributes(TokenIterator $tokens, Ast\Node $type, int $startLine, int $startIndex) : Ast\Node { if ($this->config->useLinesAttributes) { $type->setAttribute(Ast\Attribute::START_LINE, $startLine); $type->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } $comments = $tokens->flushComments(); if ($this->config->useCommentsAttributes) { $type->setAttribute(Ast\Attribute::COMMENTS, $comments); } if ($this->config->useIndexAttributes) { $type->setAttribute(Ast\Attribute::START_INDEX, $startIndex); $type->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } return $type; } /** @phpstan-impure */ private function subParse(TokenIterator $tokens) : Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { $type = $this->parseNullable($tokens); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { $type = $this->parseConditionalForParameter($tokens, $tokens->currentTokenValue()); } else { $type = $this->parseAtomic($tokens); if ($tokens->isCurrentTokenValue('is')) { $type = $this->parseConditional($tokens, $type); } else { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { $type = $this->subParseUnion($tokens, $type); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { $type = $this->subParseIntersection($tokens, $type); } } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } /** @phpstan-impure */ private function parseAtomic(TokenIterator $tokens) : Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->skipNewLineTokensAndConsumeComments(); $type = $this->subParse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $type = $this->enrichWithAttributes($tokens, new Ast\Type\ThisTypeNode(), $startLine, $startIndex); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $type = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); // because of ConstFetchNode if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { $tokens->pushSavePoint(); $isHtml = $this->isHtml($tokens); $tokens->rollback(); if ($isHtml) { return $type; } $origType = $type; $type = $this->tryParseCallable($tokens, $type, \true); if ($type === $origType) { $type = $this->parseGeneric($tokens, $type); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } } } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $type = $this->tryParseCallable($tokens, $type, \false); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } elseif (in_array($type->name, [Ast\Type\ArrayShapeNode::KIND_ARRAY, Ast\Type\ArrayShapeNode::KIND_LIST, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST, 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { if ($type->name === 'object') { $type = $this->parseObjectShape($tokens); } else { $type = $this->parseArrayShape($tokens, $type, $type->name); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); } } return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } else { $tokens->rollback(); // because of ConstFetchNode } } else { $tokens->dropSavePoint(); // because of ConstFetchNode } $currentTokenValue = $tokens->currentTokenValue(); $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { $constExpr = $this->constExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } $type = $this->enrichWithAttributes($tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $type; } catch (LogicException $e) { throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } } /** @phpstan-impure */ private function parseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { $types[] = $this->parseAtomic($tokens); $tokens->pushSavePoint(); $tokens->skipNewLineTokensAndConsumeComments(); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_UNION)) { $tokens->rollback(); break; } $tokens->dropSavePoint(); } return new Ast\Type\UnionTypeNode($types); } /** @phpstan-impure */ private function subParseUnion(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_UNION)) { $tokens->skipNewLineTokensAndConsumeComments(); $types[] = $this->parseAtomic($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } return new Ast\Type\UnionTypeNode($types); } /** @phpstan-impure */ private function parseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { $types[] = $this->parseAtomic($tokens); $tokens->pushSavePoint(); $tokens->skipNewLineTokensAndConsumeComments(); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_INTERSECTION)) { $tokens->rollback(); break; } $tokens->dropSavePoint(); } return new Ast\Type\IntersectionTypeNode($types); } /** @phpstan-impure */ private function subParseIntersection(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode { $types = [$type]; while ($tokens->tryConsumeTokenType(Lexer::TOKEN_INTERSECTION)) { $tokens->skipNewLineTokensAndConsumeComments(); $types[] = $this->parseAtomic($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } return new Ast\Type\IntersectionTypeNode($types); } /** @phpstan-impure */ private function parseConditional(TokenIterator $tokens, Ast\Type\TypeNode $subjectType) : Ast\Type\TypeNode { $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $negated = \false; if ($tokens->isCurrentTokenValue('not')) { $negated = \true; $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } $targetType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->skipNewLineTokensAndConsumeComments(); $ifType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $tokens->skipNewLineTokensAndConsumeComments(); $elseType = $this->subParse($tokens); return new Ast\Type\ConditionalTypeNode($subjectType, $targetType, $ifType, $elseType, $negated); } /** @phpstan-impure */ private function parseConditionalForParameter(TokenIterator $tokens, string $parameterName) : Ast\Type\TypeNode { $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'is'); $negated = \false; if ($tokens->isCurrentTokenValue('not')) { $negated = \true; $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } $targetType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->skipNewLineTokensAndConsumeComments(); $ifType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $tokens->skipNewLineTokensAndConsumeComments(); $elseType = $this->subParse($tokens); return new Ast\Type\ConditionalTypeForParameterNode($parameterName, $targetType, $ifType, $elseType, $negated); } /** @phpstan-impure */ private function parseNullable(TokenIterator $tokens) : Ast\Type\TypeNode { $tokens->consumeTokenType(Lexer::TOKEN_NULLABLE); $type = $this->parseAtomic($tokens); return new Ast\Type\NullableTypeNode($type); } /** @phpstan-impure */ public function isHtml(TokenIterator $tokens) : bool { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { return \false; } $htmlTagName = $tokens->currentTokenValue(); $tokens->next(); if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { return \false; } $endTag = ''; $endTagSearchOffset = -strlen($endTag); while (!$tokens->isCurrentTokenType(Lexer::TOKEN_END)) { if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET) && strpos($tokens->currentTokenValue(), '/' . $htmlTagName . '>') !== \false || substr_compare($tokens->currentTokenValue(), $endTag, $endTagSearchOffset) === 0) { return \true; } $tokens->next(); } return \false; } /** @phpstan-impure */ public function parseGeneric(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $baseType) : Ast\Type\GenericTypeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $tokens->skipNewLineTokensAndConsumeComments(); $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); $genericTypes = []; $variances = []; $isFirst = \true; while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); // trailing comma case if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { break; } $isFirst = \false; [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $type; } /** * @phpstan-impure * @return array{Ast\Type\TypeNode, Ast\Type\GenericTypeNode::VARIANCE_*} */ public function parseGenericTypeArgument(TokenIterator $tokens) : array { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { return [$this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('mixed'), $startLine, $startIndex), Ast\Type\GenericTypeNode::VARIANCE_BIVARIANT]; } if ($tokens->tryConsumeTokenValue('contravariant')) { $variance = Ast\Type\GenericTypeNode::VARIANCE_CONTRAVARIANT; } elseif ($tokens->tryConsumeTokenValue('covariant')) { $variance = Ast\Type\GenericTypeNode::VARIANCE_COVARIANT; } else { $variance = Ast\Type\GenericTypeNode::VARIANCE_INVARIANT; } $type = $this->parse($tokens); return [$type, $variance]; } /** * @throws ParserException * @param ?callable(TokenIterator): string $parseDescription */ public function parseTemplateTagValue(TokenIterator $tokens, ?callable $parseDescription = null) : TemplateTagValueNode { $name = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); $upperBound = $lowerBound = null; if ($tokens->tryConsumeTokenValue('of') || $tokens->tryConsumeTokenValue('as')) { $upperBound = $this->parse($tokens); } if ($tokens->tryConsumeTokenValue('super')) { $lowerBound = $this->parse($tokens); } if ($tokens->tryConsumeTokenValue('=')) { $default = $this->parse($tokens); } else { $default = null; } if ($parseDescription !== null) { $description = $parseDescription($tokens); } else { $description = ''; } if ($name === '') { throw new LogicException('Template tag name cannot be empty.'); } return new Ast\PhpDoc\TemplateTagValueNode($name, $upperBound, $description, $default, $lowerBound); } /** @phpstan-impure */ private function parseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier, bool $hasTemplate) : Ast\Type\TypeNode { $templates = $hasTemplate ? $this->parseCallableTemplates($tokens) : []; $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); $tokens->skipNewLineTokensAndConsumeComments(); $parameters = []; if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { $parameters[] = $this->parseCallableParameter($tokens); $tokens->skipNewLineTokensAndConsumeComments(); while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { break; } $parameters[] = $this->parseCallableParameter($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $returnType = $this->enrichWithAttributes($tokens, $this->parseCallableReturnType($tokens), $startLine, $startIndex); return new Ast\Type\CallableTypeNode($identifier, $parameters, $returnType, $templates); } /** * @return Ast\PhpDoc\TemplateTagValueNode[] * * @phpstan-impure */ private function parseCallableTemplates(TokenIterator $tokens) : array { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $templates = []; $isFirst = \true; while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); // trailing comma case if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { break; } $isFirst = \false; $templates[] = $this->parseCallableTemplateArgument($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $templates; } private function parseCallableTemplateArgument(TokenIterator $tokens) : Ast\PhpDoc\TemplateTagValueNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); return $this->enrichWithAttributes($tokens, $this->parseTemplateTagValue($tokens), $startLine, $startIndex); } /** @phpstan-impure */ private function parseCallableParameter(TokenIterator $tokens) : Ast\Type\CallableTypeParameterNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $type = $this->parse($tokens); $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); if ($tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE)) { $parameterName = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); } else { $parameterName = ''; } $isOptional = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); return $this->enrichWithAttributes($tokens, new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional), $startLine, $startIndex); } /** @phpstan-impure */ private function parseCallableReturnType(TokenIterator $tokens) : Ast\Type\TypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { return $this->parseNullable($tokens); } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $type = $this->subParse($tokens); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $type; } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $type = new Ast\Type\ThisTypeNode(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); } return $type; } else { $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { $type = new Ast\Type\IdentifierTypeNode($currentTokenValue); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { $type = $this->parseGeneric($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); } } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); } elseif (in_array($type->name, [Ast\Type\ArrayShapeNode::KIND_ARRAY, Ast\Type\ArrayShapeNode::KIND_LIST, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_ARRAY, Ast\Type\ArrayShapeNode::KIND_NON_EMPTY_LIST, 'object'], \true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { if ($type->name === 'object') { $type = $this->parseObjectShape($tokens); } else { $type = $this->parseArrayShape($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex), $type->name); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex)); } } return $type; } else { $tokens->rollback(); // because of ConstFetchNode } } else { $tokens->dropSavePoint(); // because of ConstFetchNode } } $currentTokenValue = $tokens->currentTokenValue(); $currentTokenType = $tokens->currentTokenType(); $currentTokenOffset = $tokens->currentTokenOffset(); $currentTokenLine = $tokens->currentTokenLine(); try { $constExpr = $this->constExprParser->parse($tokens); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } $type = $this->enrichWithAttributes($tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } return $type; } catch (LogicException $e) { throw new ParserException($currentTokenValue, $currentTokenType, $currentTokenOffset, Lexer::TOKEN_IDENTIFIER, null, $currentTokenLine); } } /** @phpstan-impure */ private function tryParseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $identifier, bool $hasTemplate) : Ast\Type\TypeNode { try { $tokens->pushSavePoint(); $type = $this->parseCallable($tokens, $identifier, $hasTemplate); $tokens->dropSavePoint(); } catch (ParserException $e) { $tokens->rollback(); $type = $identifier; } return $type; } /** @phpstan-impure */ private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\TypeNode $type) : Ast\Type\TypeNode { $startLine = $type->getAttribute(Ast\Attribute::START_LINE); $startIndex = $type->getAttribute(Ast\Attribute::START_INDEX); try { while ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $tokens->pushSavePoint(); $canBeOffsetAccessType = !$tokens->isPrecededByHorizontalWhitespace(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET); if ($canBeOffsetAccessType && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET)) { $offset = $this->parse($tokens); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); $tokens->dropSavePoint(); $type = new Ast\Type\OffsetAccessTypeNode($type, $offset); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } } else { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); $tokens->dropSavePoint(); $type = new Ast\Type\ArrayTypeNode($type); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } } } } catch (ParserException $e) { $tokens->rollback(); } return $type; } /** * @phpstan-impure * @param Ast\Type\ArrayShapeNode::KIND_* $kind */ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type, string $kind) : Ast\Type\ArrayShapeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); $items = []; $sealed = \true; $unsealedType = null; $done = \false; do { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { return Ast\Type\ArrayShapeNode::createSealed($items, $kind); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC)) { $sealed = \false; $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { if ($kind === Ast\Type\ArrayShapeNode::KIND_ARRAY) { $unsealedType = $this->parseArrayShapeUnsealedType($tokens); } else { $unsealedType = $this->parseListShapeUnsealedType($tokens); } $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA); break; } $items[] = $this->parseArrayShapeItem($tokens); $tokens->skipNewLineTokensAndConsumeComments(); if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $done = \true; } if ($tokens->currentTokenType() !== Lexer::TOKEN_COMMENT) { continue; } $tokens->next(); } while (!$done); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); if ($sealed) { return Ast\Type\ArrayShapeNode::createSealed($items, $kind); } return Ast\Type\ArrayShapeNode::createUnsealed($items, $unsealedType, $kind); } /** @phpstan-impure */ private function parseArrayShapeItem(TokenIterator $tokens) : Ast\Type\ArrayShapeItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); // parse any comments above the item $tokens->skipNewLineTokensAndConsumeComments(); try { $tokens->pushSavePoint(); $key = $this->parseArrayShapeKey($tokens); $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $value = $this->parse($tokens); $tokens->dropSavePoint(); return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeItemNode($key, $optional, $value), $startLine, $startIndex); } catch (ParserException $e) { $tokens->rollback(); $value = $this->parse($tokens); return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeItemNode(null, \false, $value), $startLine, $startIndex); } } /** * @phpstan-impure * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode */ private function parseArrayShapeKey(TokenIterator $tokens) { $startIndex = $tokens->currentTokenIndex(); $startLine = $tokens->currentTokenLine(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED); $tokens->next(); } else { $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } /** * @phpstan-impure */ private function parseArrayShapeUnsealedType(TokenIterator $tokens) : Ast\Type\ArrayShapeUnsealedTypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $tokens->skipNewLineTokensAndConsumeComments(); $valueType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $keyType = null; if ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->skipNewLineTokensAndConsumeComments(); $keyType = $valueType; $valueType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeUnsealedTypeNode($valueType, $keyType), $startLine, $startIndex); } /** * @phpstan-impure */ private function parseListShapeUnsealedType(TokenIterator $tokens) : Ast\Type\ArrayShapeUnsealedTypeNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); $tokens->skipNewLineTokensAndConsumeComments(); $valueType = $this->parse($tokens); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $this->enrichWithAttributes($tokens, new Ast\Type\ArrayShapeUnsealedTypeNode($valueType, null), $startLine, $startIndex); } /** * @phpstan-impure */ private function parseObjectShape(TokenIterator $tokens) : Ast\Type\ObjectShapeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); $items = []; do { $tokens->skipNewLineTokensAndConsumeComments(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { return new Ast\Type\ObjectShapeNode($items); } $items[] = $this->parseObjectShapeItem($tokens); $tokens->skipNewLineTokensAndConsumeComments(); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->skipNewLineTokensAndConsumeComments(); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); return new Ast\Type\ObjectShapeNode($items); } /** @phpstan-impure */ private function parseObjectShapeItem(TokenIterator $tokens) : Ast\Type\ObjectShapeItemNode { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); $tokens->skipNewLineTokensAndConsumeComments(); $key = $this->parseObjectShapeKey($tokens); $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); $tokens->consumeTokenType(Lexer::TOKEN_COLON); $value = $this->parse($tokens); return $this->enrichWithAttributes($tokens, new Ast\Type\ObjectShapeItemNode($key, $optional, $value), $startLine, $startIndex); } /** * @phpstan-impure * @return Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode */ private function parseObjectShapeKey(TokenIterator $tokens) { $startLine = $tokens->currentTokenLine(); $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::SINGLE_QUOTED); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { $key = new Ast\ConstExpr\ConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\ConstExprStringNode::DOUBLE_QUOTED); $tokens->next(); } else { $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } } */ private array $tokens; private int $index; /** @var list */ private array $comments = []; /** @var list}> */ private array $savePoints = []; /** @var list */ private array $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; private ?string $newline = null; /** * @param list $tokens */ public function __construct(array $tokens, int $index = 0) { $this->tokens = $tokens; $this->index = $index; $this->skipIrrelevantTokens(); } /** * @return list */ public function getTokens() : array { return $this->tokens; } public function getContentBetween(int $startPos, int $endPos) : string { if ($startPos < 0 || $endPos > count($this->tokens)) { throw new LogicException(); } $content = ''; for ($i = $startPos; $i < $endPos; $i++) { $content .= $this->tokens[$i][Lexer::VALUE_OFFSET]; } return $content; } public function getTokenCount() : int { return count($this->tokens); } public function currentTokenValue() : string { return $this->tokens[$this->index][Lexer::VALUE_OFFSET]; } public function currentTokenType() : int { return $this->tokens[$this->index][Lexer::TYPE_OFFSET]; } public function currentTokenOffset() : int { $offset = 0; for ($i = 0; $i < $this->index; $i++) { $offset += strlen($this->tokens[$i][Lexer::VALUE_OFFSET]); } return $offset; } public function currentTokenLine() : int { return $this->tokens[$this->index][Lexer::LINE_OFFSET]; } public function currentTokenIndex() : int { return $this->index; } public function endIndexOfLastRelevantToken() : int { $endIndex = $this->currentTokenIndex(); $endIndex--; while (in_array($this->tokens[$endIndex][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, \true)) { if (!isset($this->tokens[$endIndex - 1])) { break; } $endIndex--; } return $endIndex; } public function isCurrentTokenValue(string $tokenValue) : bool { return $this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue; } public function isCurrentTokenType(int ...$tokenType) : bool { return in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, \true); } public function isPrecededByHorizontalWhitespace() : bool { return ($this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] ?? -1) === Lexer::TOKEN_HORIZONTAL_WS; } /** * @throws ParserException */ public function consumeTokenType(int $tokenType) : void { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { $this->throwError($tokenType); } if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { if ($this->newline === null) { $this->detectNewline(); } } $this->next(); } /** * @throws ParserException */ public function consumeTokenValue(int $tokenType, string $tokenValue) : void { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType || $this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { $this->throwError($tokenType, $tokenValue); } $this->next(); } /** @phpstan-impure */ public function tryConsumeTokenValue(string $tokenValue) : bool { if ($this->tokens[$this->index][Lexer::VALUE_OFFSET] !== $tokenValue) { return \false; } $this->next(); return \true; } /** * @return list */ public function flushComments() : array { $res = $this->comments; $this->comments = []; return $res; } /** @phpstan-impure */ public function tryConsumeTokenType(int $tokenType) : bool { if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== $tokenType) { return \false; } if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { if ($this->newline === null) { $this->detectNewline(); } } $this->next(); return \true; } /** * @deprecated Use skipNewLineTokensAndConsumeComments instead (when parsing a type) */ public function skipNewLineTokens() : void { if (!$this->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { return; } do { $foundNewLine = $this->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); } while ($foundNewLine === \true); } public function skipNewLineTokensAndConsumeComments() : void { if ($this->currentTokenType() === Lexer::TOKEN_COMMENT) { $this->comments[] = new Comment($this->currentTokenValue(), $this->currentTokenLine(), $this->currentTokenIndex()); $this->next(); } if (!$this->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { return; } do { $foundNewLine = $this->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); if ($this->currentTokenType() !== Lexer::TOKEN_COMMENT) { continue; } $this->comments[] = new Comment($this->currentTokenValue(), $this->currentTokenLine(), $this->currentTokenIndex()); $this->next(); } while ($foundNewLine === \true); } private function detectNewline() : void { $value = $this->currentTokenValue(); if (substr($value, 0, 2) === "\r\n") { $this->newline = "\r\n"; } elseif (substr($value, 0, 1) === "\n") { $this->newline = "\n"; } } public function getSkippedHorizontalWhiteSpaceIfAny() : string { if ($this->index > 0 && $this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { return $this->tokens[$this->index - 1][Lexer::VALUE_OFFSET]; } return ''; } /** @phpstan-impure */ public function joinUntil(int ...$tokenType) : string { $s = ''; while (!in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $tokenType, \true)) { $s .= $this->tokens[$this->index++][Lexer::VALUE_OFFSET]; } return $s; } public function next() : void { $this->index++; $this->skipIrrelevantTokens(); } private function skipIrrelevantTokens() : void { if (!isset($this->tokens[$this->index])) { return; } while (in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, \true)) { if (!isset($this->tokens[$this->index + 1])) { break; } $this->index++; } } public function addEndOfLineToSkippedTokens() : void { $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL]; } public function removeEndOfLineFromSkippedTokens() : void { $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; } /** @phpstan-impure */ public function forwardToTheEnd() : void { $lastToken = count($this->tokens) - 1; $this->index = $lastToken; } public function pushSavePoint() : void { $this->savePoints[] = [$this->index, $this->comments]; } public function dropSavePoint() : void { array_pop($this->savePoints); } public function rollback() : void { $savepoint = array_pop($this->savePoints); assert($savepoint !== null); [$this->index, $this->comments] = $savepoint; } /** * @throws ParserException */ private function throwError(int $expectedTokenType, ?string $expectedTokenValue = null) : void { throw new ParserException($this->currentTokenValue(), $this->currentTokenType(), $this->currentTokenOffset(), $expectedTokenType, $expectedTokenValue, $this->currentTokenLine()); } /** * Check whether the position is directly preceded by a certain token type. * * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped */ public function hasTokenImmediatelyBefore(int $pos, int $expectedTokenType) : bool { $tokens = $this->tokens; $pos--; for (; $pos >= 0; $pos--) { $token = $tokens[$pos]; $type = $token[Lexer::TYPE_OFFSET]; if ($type === $expectedTokenType) { return \true; } if (!in_array($type, [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL], \true)) { break; } } return \false; } /** * Check whether the position is directly followed by a certain token type. * * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped */ public function hasTokenImmediatelyAfter(int $pos, int $expectedTokenType) : bool { $tokens = $this->tokens; $pos++; for ($c = count($tokens); $pos < $c; $pos++) { $token = $tokens[$pos]; $type = $token[Lexer::TYPE_OFFSET]; if ($type === $expectedTokenType) { return \true; } if (!in_array($type, [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL], \true)) { break; } } return \false; } public function getDetectedNewline() : ?string { return $this->newline; } /** * Whether the given position is immediately surrounded by parenthesis. */ public function hasParentheses(int $startPos, int $endPos) : bool { return $this->hasTokenImmediatelyBefore($startPos, Lexer::TOKEN_OPEN_PARENTHESES) && $this->hasTokenImmediatelyAfter($endPos, Lexer::TOKEN_CLOSE_PARENTHESES); } } useLinesAttributes = $usedAttributes['lines'] ?? \false; $this->useIndexAttributes = $usedAttributes['indexes'] ?? \false; $this->useCommentsAttributes = $usedAttributes['comments'] ?? \false; } } parameterName = $parameterName; $this->description = $description; } public function __toString() : string { return trim("{$this->parameterName} {$this->description}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } name = $name; $this->bound = $bound; $this->lowerBound = $lowerBound; $this->default = $default; $this->description = $description; } public function __toString() : string { $upperBound = $this->bound !== null ? " of {$this->bound}" : ''; $lowerBound = $this->lowerBound !== null ? " super {$this->lowerBound}" : ''; $default = $this->default !== null ? " = {$this->default}" : ''; return trim("{$this->name}{$upperBound}{$lowerBound}{$default} {$this->description}"); } } type = $type; $this->parameter = $parameter; $this->isNegated = $isNegated; $this->isEquality = $isEquality; $this->description = $description; } public function __toString() : string { $isNegated = $this->isNegated ? '!' : ''; $isEquality = $this->isEquality ? '=' : ''; return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter} {$this->description}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } parameterName = $parameterName; $this->description = $description; } public function __toString() : string { return trim("{$this->parameterName} {$this->description}"); } } type = $type; $this->parameter = $parameter; $this->property = $property; $this->isNegated = $isNegated; $this->isEquality = $isEquality; $this->description = $description; } public function __toString() : string { $isNegated = $this->isNegated ? '!' : ''; $isEquality = $this->isEquality ? '=' : ''; return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->property} {$this->description}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } text = $text; } public function __toString() : string { return $this->text; } } children = $children; } /** * @return PhpDocTagNode[] */ public function getTags() : array { return array_filter($this->children, static fn(PhpDocChildNode $child): bool => $child instanceof PhpDocTagNode); } /** * @return PhpDocTagNode[] */ public function getTagsByName(string $tagName) : array { return array_filter($this->getTags(), static fn(PhpDocTagNode $tag): bool => $tag->name === $tagName); } /** * @return VarTagValueNode[] */ public function getVarTagValues(string $tagName = '@var') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof VarTagValueNode); } /** * @return ParamTagValueNode[] */ public function getParamTagValues(string $tagName = '@param') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ParamTagValueNode); } /** * @return TypelessParamTagValueNode[] */ public function getTypelessParamTagValues(string $tagName = '@param') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof TypelessParamTagValueNode); } /** * @return ParamImmediatelyInvokedCallableTagValueNode[] */ public function getParamImmediatelyInvokedCallableTagValues(string $tagName = '@param-immediately-invoked-callable') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ParamImmediatelyInvokedCallableTagValueNode); } /** * @return ParamLaterInvokedCallableTagValueNode[] */ public function getParamLaterInvokedCallableTagValues(string $tagName = '@param-later-invoked-callable') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ParamLaterInvokedCallableTagValueNode); } /** * @return ParamClosureThisTagValueNode[] */ public function getParamClosureThisTagValues(string $tagName = '@param-closure-this') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ParamClosureThisTagValueNode); } /** * @return PureUnlessCallableIsImpureTagValueNode[] */ public function getPureUnlessCallableIsImpureTagValues(string $tagName = '@pure-unless-callable-is-impure') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof PureUnlessCallableIsImpureTagValueNode); } /** * @return TemplateTagValueNode[] */ public function getTemplateTagValues(string $tagName = '@template') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof TemplateTagValueNode); } /** * @return ExtendsTagValueNode[] */ public function getExtendsTagValues(string $tagName = '@extends') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ExtendsTagValueNode); } /** * @return ImplementsTagValueNode[] */ public function getImplementsTagValues(string $tagName = '@implements') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ImplementsTagValueNode); } /** * @return UsesTagValueNode[] */ public function getUsesTagValues(string $tagName = '@use') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof UsesTagValueNode); } /** * @return ReturnTagValueNode[] */ public function getReturnTagValues(string $tagName = '@return') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ReturnTagValueNode); } /** * @return ThrowsTagValueNode[] */ public function getThrowsTagValues(string $tagName = '@throws') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ThrowsTagValueNode); } /** * @return MixinTagValueNode[] */ public function getMixinTagValues(string $tagName = '@mixin') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof MixinTagValueNode); } /** * @return RequireExtendsTagValueNode[] */ public function getRequireExtendsTagValues(string $tagName = '@phpstan-require-extends') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof RequireExtendsTagValueNode); } /** * @return RequireImplementsTagValueNode[] */ public function getRequireImplementsTagValues(string $tagName = '@phpstan-require-implements') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof RequireImplementsTagValueNode); } /** * @return DeprecatedTagValueNode[] */ public function getDeprecatedTagValues() : array { return array_filter(array_column($this->getTagsByName('@deprecated'), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof DeprecatedTagValueNode); } /** * @return PropertyTagValueNode[] */ public function getPropertyTagValues(string $tagName = '@property') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof PropertyTagValueNode); } /** * @return PropertyTagValueNode[] */ public function getPropertyReadTagValues(string $tagName = '@property-read') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof PropertyTagValueNode); } /** * @return PropertyTagValueNode[] */ public function getPropertyWriteTagValues(string $tagName = '@property-write') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof PropertyTagValueNode); } /** * @return MethodTagValueNode[] */ public function getMethodTagValues(string $tagName = '@method') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof MethodTagValueNode); } /** * @return TypeAliasTagValueNode[] */ public function getTypeAliasTagValues(string $tagName = '@phpstan-type') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof TypeAliasTagValueNode); } /** * @return TypeAliasImportTagValueNode[] */ public function getTypeAliasImportTagValues(string $tagName = '@phpstan-import-type') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof TypeAliasImportTagValueNode); } /** * @return AssertTagValueNode[] */ public function getAssertTagValues(string $tagName = '@phpstan-assert') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof AssertTagValueNode); } /** * @return AssertTagPropertyValueNode[] */ public function getAssertPropertyTagValues(string $tagName = '@phpstan-assert') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof AssertTagPropertyValueNode); } /** * @return AssertTagMethodValueNode[] */ public function getAssertMethodTagValues(string $tagName = '@phpstan-assert') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof AssertTagMethodValueNode); } /** * @return SelfOutTagValueNode[] */ public function getSelfOutTypeTagValues(string $tagName = '@phpstan-this-out') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof SelfOutTagValueNode); } /** * @return ParamOutTagValueNode[] */ public function getParamOutTypeTagValues(string $tagName = '@param-out') : array { return array_filter(array_column($this->getTagsByName($tagName), 'value'), static fn(PhpDocTagValueNode $value): bool => $value instanceof ParamOutTagValueNode); } public function __toString() : string { $children = array_map(static function (PhpDocChildNode $child) : string { $s = (string) $child; return $s === '' ? '' : ' ' . $s; }, $this->children); return "/**\n *" . implode("\n *", $children) . "\n */"; } } type = $type; $this->parameterName = $parameterName; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->parameterName} {$this->description}"); } } value = $value; } public function __toString() : string { return $this->value; } } alias = $alias; $this->type = $type; } public function __toString() : string { return trim("{$this->alias} {$this->type}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } type = $type; $this->isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->defaultValue = $defaultValue; } public function __toString() : string { $type = $this->type !== null ? "{$this->type} " : ''; $isReference = $this->isReference ? '&' : ''; $isVariadic = $this->isVariadic ? '...' : ''; $default = $this->defaultValue !== null ? " = {$this->defaultValue}" : ''; return "{$type}{$isReference}{$isVariadic}{$this->parameterName}{$default}"; } } key = $key; $this->value = $value; } public function __toString() : string { if ($this->key === null) { return (string) $this->value; } return $this->key . '=' . $this->value; } } */ public array $arguments; /** * @param list $arguments */ public function __construct(string $name, array $arguments) { $this->name = $name; $this->arguments = $arguments; } public function __toString() : string { $arguments = implode(', ', $this->arguments); return $this->name . '(' . $arguments . ')'; } } annotation = $annotation; $this->description = $description; } public function __toString() : string { return trim("{$this->annotation} {$this->description}"); } } key = $key; $this->value = $value; } public function __toString() : string { if ($this->key === null) { return (string) $this->value; } return $this->key . '=' . $this->value; } } */ public array $items; /** * @param list $items */ public function __construct(array $items) { $this->items = $items; } public function __toString() : string { $items = implode(', ', $this->items); return '{' . $items . '}'; } } value = $value; $this->exceptionArgs = [$exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine()]; } public function __get(string $name) : ?ParserException { if ($name !== 'exception') { trigger_error(sprintf('Undefined property: %s::$%s', self::class, $name), E_USER_WARNING); return null; } return new ParserException(...$this->exceptionArgs); } public function __toString() : string { return $this->value; } } type = $type; $this->variableName = $variableName; $this->description = $description; } public function __toString() : string { return trim("{$this->type} " . trim("{$this->variableName} {$this->description}")); } } name = $name; $this->value = $value; } public function __toString() : string { if ($this->value instanceof DoctrineTagValueNode) { return (string) $this->value; } return trim("{$this->name} {$this->value}"); } } type = $type; $this->parameterName = $parameterName; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->parameterName} {$this->description}"); } } isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->description = $description; } public function __toString() : string { $reference = $this->isReference ? '&' : ''; $variadic = $this->isVariadic ? '...' : ''; return trim("{$reference}{$variadic}{$this->parameterName} {$this->description}"); } } type = $type; $this->parameter = $parameter; $this->method = $method; $this->isNegated = $isNegated; $this->isEquality = $isEquality; $this->description = $description; } public function __toString() : string { $isNegated = $this->isNegated ? '!' : ''; $isEquality = $this->isEquality ? '=' : ''; return trim("{$isNegated}{$isEquality}{$this->type} {$this->parameter}->{$this->method}() {$this->description}"); } } importedAlias = $importedAlias; $this->importedFrom = $importedFrom; $this->importedAs = $importedAs; } public function __toString() : string { return trim("{$this->importedAlias} from {$this->importedFrom}" . ($this->importedAs !== null ? " as {$this->importedAs}" : '')); } } type = $type; $this->propertyName = $propertyName; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->propertyName} {$this->description}"); } } parameterName = $parameterName; $this->description = $description; } public function __toString() : string { return trim("{$this->parameterName} {$this->description}"); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } type = $type; $this->isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->description = $description; } public function __toString() : string { $reference = $this->isReference ? '&' : ''; $variadic = $this->isVariadic ? '...' : ''; return trim("{$this->type} {$reference}{$variadic}{$this->parameterName} {$this->description}"); } } isStatic = $isStatic; $this->returnType = $returnType; $this->methodName = $methodName; $this->parameters = $parameters; $this->description = $description; $this->templateTypes = $templateTypes; } public function __toString() : string { $static = $this->isStatic ? 'static ' : ''; $returnType = $this->returnType !== null ? "{$this->returnType} " : ''; $parameters = implode(', ', $this->parameters); $description = $this->description !== '' ? " {$this->description}" : ''; $templateTypes = count($this->templateTypes) > 0 ? '<' . implode(', ', $this->templateTypes) . '>' : ''; return "{$static}{$returnType}{$this->methodName}{$templateTypes}({$parameters}){$description}"; } } type = $type; $this->description = $description; } public function __toString() : string { return trim($this->type . ' ' . $this->description); } } description = $description; } public function __toString() : string { return trim($this->description); } } type = $type; $this->description = $description; } public function __toString() : string { return trim("{$this->type} {$this->description}"); } } className = $className; $this->name = $name; } public function __toString() : string { if ($this->className === '') { return $this->name; } return "{$this->className}::{$this->name}"; } } items = $items; } public function __toString() : string { return '[' . implode(', ', $this->items) . ']'; } } value = $value; $this->quoteType = $quoteType; } public function __toString() : string { if ($this->quoteType === self::SINGLE_QUOTED) { // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 return sprintf("'%s'", addcslashes($this->value, '\'\\')); } // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 return sprintf('"%s"', $this->escapeDoubleQuotedString()); } private function escapeDoubleQuotedString() : string { $quote = '"'; $escaped = addcslashes($this->value, "\n\r\t\f\v\$" . $quote . '\\'); // Escape control characters and non-UTF-8 characters. // Regex based on https://stackoverflow.com/a/11709412/385378. $regex = '/( [\\x00-\\x08\\x0E-\\x1F] # Control characters | [\\xC0-\\xC1] # Invalid UTF-8 Bytes | [\\xF5-\\xFF] # Invalid UTF-8 Bytes | \\xE0(?=[\\x80-\\x9F]) # Overlong encoding of prior code point | \\xF0(?=[\\x80-\\x8F]) # Overlong encoding of prior code point | [\\xC2-\\xDF](?![\\x80-\\xBF]) # Invalid UTF-8 Sequence Start | [\\xE0-\\xEF](?![\\x80-\\xBF]{2}) # Invalid UTF-8 Sequence Start | [\\xF0-\\xF4](?![\\x80-\\xBF]{3}) # Invalid UTF-8 Sequence Start | (?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF] # Invalid UTF-8 Sequence Middle | (?value = $value; } public function __toString() : string { return $this->value; } } key = $key; $this->value = $value; } public function __toString() : string { if ($this->key !== null) { return sprintf('%s => %s', $this->key, $this->value); } return (string) $this->value; } } value = $value; } public function __toString() : string { return self::escape($this->value); } public static function unescape(string $value) : string { // from https://github.com/doctrine/annotations/blob/a9ec7af212302a75d1f92fa65d3abfbd16245a2a/lib/Doctrine/Common/Annotations/DocLexer.php#L103-L107 return str_replace('""', '"', substr($value, 1, strlen($value) - 2)); } private static function escape(string $value) : string { // from https://github.com/phpstan/phpdoc-parser/issues/205#issuecomment-1662323656 return sprintf('"%s"', str_replace('"', '""', $value)); } } value = $value; } public function __toString() : string { return $this->value; } } $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * NodeTraverser::REMOVE_NODE * => $node is removed from the parent array * * NodeTraverser::DONT_TRAVERSE_CHILDREN * => Children of $node are not traversed. $node stays as-is * * NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN * => Further visitors for the current node are skipped, and its children are not * traversed. $node stays as-is. * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return Node|Node[]|NodeTraverser::*|null Replacement node (or special return value) */ public function enterNode(Node $node); /** * Called when leaving a node. * * Return value semantics: * * null * => $node stays as-is * * NodeTraverser::REMOVE_NODE * => $node is removed from the parent array * * NodeTraverser::STOP_TRAVERSAL * => Traversal is aborted. $node stays as-is * * array (of Nodes) * => The return value is merged into the parent array (at the position of the $node) * * otherwise * => $node is set to the return value * * @param Node $node Node * * @return Node|Node[]|NodeTraverser::REMOVE_NODE|NodeTraverser::STOP_TRAVERSAL|null Replacement node (or special return value) */ public function leaveNode(Node $node); /** * Called once after traversal. * * Return value semantics: * * null: $nodes stays as-is * * otherwise: $nodes is set to the return value * * @param Node[] $nodes Array of nodes * * @return Node[]|null Array of nodes */ public function afterTraverse(array $nodes) : ?array; } setAttribute(Attribute::ORIGINAL_NODE, $originalNode); return $node; } } types = $types; } public function __toString() : string { return '(' . implode(' | ', array_map(static function (TypeNode $type) : string { if ($type instanceof NullableTypeNode) { return '(' . $type . ')'; } return (string) $type; }, $this->types)) . ')'; } } types = $types; } public function __toString() : string { return '(' . implode(' & ', array_map(static function (TypeNode $type) : string { if ($type instanceof NullableTypeNode) { return '(' . $type . ')'; } return (string) $type; }, $this->types)) . ')'; } } name = $name; } public function __toString() : string { return $this->name; } } keyName = $keyName; $this->optional = $optional; $this->valueType = $valueType; } public function __toString() : string { if ($this->keyName !== null) { return sprintf('%s%s: %s', (string) $this->keyName, $this->optional ? '?' : '', (string) $this->valueType); } return (string) $this->valueType; } } constExpr = $constExpr; } public function __toString() : string { return $this->constExpr->__toString(); } } type = $type; $this->isReference = $isReference; $this->isVariadic = $isVariadic; $this->parameterName = $parameterName; $this->isOptional = $isOptional; } public function __toString() : string { $type = "{$this->type} "; $isReference = $this->isReference ? '&' : ''; $isVariadic = $this->isVariadic ? '...' : ''; $isOptional = $this->isOptional ? '=' : ''; return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $isOptional; } } identifier = $identifier; $this->parameters = $parameters; $this->returnType = $returnType; $this->templateTypes = $templateTypes; } public function __toString() : string { $returnType = $this->returnType; if ($returnType instanceof self) { $returnType = "({$returnType})"; } $template = $this->templateTypes !== [] ? '<' . implode(', ', $this->templateTypes) . '>' : ''; $parameters = implode(', ', $this->parameters); return "{$this->identifier}{$template}({$parameters}): {$returnType}"; } } keyName = $keyName; $this->optional = $optional; $this->valueType = $valueType; } public function __toString() : string { if ($this->keyName !== null) { return sprintf('%s%s: %s', (string) $this->keyName, $this->optional ? '?' : '', (string) $this->valueType); } return (string) $this->valueType; } } items = $items; } public function __toString() : string { $items = $this->items; return 'object{' . implode(', ', $items) . '}'; } } exceptionArgs = [$exception->getCurrentTokenValue(), $exception->getCurrentTokenType(), $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), $exception->getCurrentTokenLine()]; } public function getException() : ParserException { return new ParserException(...$this->exceptionArgs); } public function __toString() : string { return '*Invalid type*'; } } type = $type; $this->offset = $offset; } public function __toString() : string { if ($this->type instanceof CallableTypeNode || $this->type instanceof NullableTypeNode) { return '(' . $this->type . ')[' . $this->offset . ']'; } return $this->type . '[' . $this->offset . ']'; } } subjectType = $subjectType; $this->targetType = $targetType; $this->if = $if; $this->else = $else; $this->negated = $negated; } public function __toString() : string { return sprintf('(%s %s %s ? %s : %s)', $this->subjectType, $this->negated ? 'is not' : 'is', $this->targetType, $this->if, $this->else); } } valueType = $valueType; $this->keyType = $keyType; } public function __toString() : string { if ($this->keyType !== null) { return sprintf('<%s, %s>', $this->keyType, $this->valueType); } return sprintf('<%s>', $this->valueType); } } parameterName = $parameterName; $this->targetType = $targetType; $this->if = $if; $this->else = $else; $this->negated = $negated; } public function __toString() : string { return sprintf('(%s %s %s ? %s : %s)', $this->parameterName, $this->negated ? 'is not' : 'is', $this->targetType, $this->if, $this->else); } } type = $type; } public function __toString() : string { return '?' . $this->type; } } items = $items; $this->sealed = $sealed; $this->unsealedType = $unsealedType; $this->kind = $kind; } /** * @param ArrayShapeItemNode[] $items * @param self::KIND_* $kind */ public static function createSealed(array $items, string $kind = self::KIND_ARRAY) : self { return new self($items, \true, null, $kind); } /** * @param ArrayShapeItemNode[] $items * @param self::KIND_* $kind */ public static function createUnsealed(array $items, ?ArrayShapeUnsealedTypeNode $unsealedType, string $kind = self::KIND_ARRAY) : self { return new self($items, \false, $unsealedType, $kind); } public function __toString() : string { $items = $this->items; if (!$this->sealed) { $items[] = '...' . $this->unsealedType; } return $this->kind . '{' . implode(', ', $items) . '}'; } } type = $type; $this->genericTypes = $genericTypes; $this->variances = $variances; } public function __toString() : string { $genericTypes = []; foreach ($this->genericTypes as $index => $type) { $variance = $this->variances[$index] ?? self::VARIANCE_INVARIANT; if ($variance === self::VARIANCE_INVARIANT) { $genericTypes[] = (string) $type; } elseif ($variance === self::VARIANCE_BIVARIANT) { $genericTypes[] = '*'; } else { $genericTypes[] = sprintf('%s %s', $variance, $type); } } return $this->type . '<' . implode(', ', $genericTypes) . '>'; } } type = $type; } public function __toString() : string { if ($this->type instanceof CallableTypeNode || $this->type instanceof ConstTypeNode || $this->type instanceof NullableTypeNode) { return '(' . $this->type . ')[]'; } return $this->type . '[]'; } } text = $text; $this->startLine = $startLine; $this->startIndex = $startIndex; } public function getReformattedText() : string { return trim($this->text); } } */ private array $attributes = []; /** * @param mixed $value */ public function setAttribute(string $key, $value) : void { if ($value === null) { unset($this->attributes[$key]); return; } $this->attributes[$key] = $value; } public function hasAttribute(string $key) : bool { return array_key_exists($key, $this->attributes); } /** * @return mixed */ public function getAttribute(string $key) { if ($this->hasAttribute($key)) { return $this->attributes[$key]; } return null; } } Visitors */ private array $visitors = []; /** @var bool Whether traversal should be stopped */ private bool $stopTraversal; /** * @param list $visitors */ public function __construct(array $visitors) { $this->visitors = $visitors; } /** * Traverses an array of nodes using the registered visitors. * * @param Node[] $nodes Array of nodes * * @return Node[] Traversed array of nodes */ public function traverse(array $nodes) : array { $this->stopTraversal = \false; foreach ($this->visitors as $visitor) { $return = $visitor->beforeTraverse($nodes); if ($return === null) { continue; } $nodes = $return; } $nodes = $this->traverseArray($nodes); foreach ($this->visitors as $visitor) { $return = $visitor->afterTraverse($nodes); if ($return === null) { continue; } $nodes = $return; } return $nodes; } /** * Recursively traverse a node. * * @param Node $node Node to traverse. * * @return Node Result of traversal (may be original node or new one) */ private function traverseNode(Node $node) : Node { $subNodeNames = array_keys(get_object_vars($node)); foreach ($subNodeNames as $name) { $subNode =& $node->{$name}; if (is_array($subNode)) { $subNode = $this->traverseArray($subNode); if ($this->stopTraversal) { break; } } elseif ($subNode instanceof Node) { $traverseChildren = \true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if ($return === null) { continue; } if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { $traverseChildren = \false; } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { $traverseChildren = \false; $breakVisitorIndex = $visitorIndex; break; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = \true; break 2; } else { throw new LogicException('enterNode() returned invalid value of type ' . gettype($return)); } } if ($traverseChildren) { $subNode = $this->traverseNode($subNode); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($subNode); if ($return !== null) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); $subNode = $return; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = \true; break 2; } elseif (is_array($return)) { throw new LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array'); } else { throw new LogicException('leaveNode() returned invalid value of type ' . gettype($return)); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } } return $node; } /** * Recursively traverse array (usually of nodes). * * @param mixed[] $nodes Array to traverse * * @return mixed[] Result of traversal (may be original array or changed one) */ private function traverseArray(array $nodes) : array { $doNodes = []; foreach ($nodes as $i => &$node) { if ($node instanceof Node) { $traverseChildren = \true; $breakVisitorIndex = null; foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if ($return === null) { continue; } if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (is_array($return)) { $doNodes[] = [$i, $return]; continue 2; } elseif ($return === self::REMOVE_NODE) { $doNodes[] = [$i, []]; continue 2; } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { $traverseChildren = \false; } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { $traverseChildren = \false; $breakVisitorIndex = $visitorIndex; break; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = \true; break 2; } else { throw new LogicException('enterNode() returned invalid value of type ' . gettype($return)); } } if ($traverseChildren) { $node = $this->traverseNode($node); if ($this->stopTraversal) { break; } } foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($node); if ($return !== null) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); $node = $return; } elseif (is_array($return)) { $doNodes[] = [$i, $return]; break; } elseif ($return === self::REMOVE_NODE) { $doNodes[] = [$i, []]; break; } elseif ($return === self::STOP_TRAVERSAL) { $this->stopTraversal = \true; break 2; } else { throw new LogicException('leaveNode() returned invalid value of type ' . gettype($return)); } } if ($breakVisitorIndex === $visitorIndex) { break; } } } elseif (is_array($node)) { throw new LogicException('Invalid node structure: Contains nested arrays'); } } if (count($doNodes) > 0) { while ([$i, $replace] = array_pop($doNodes)) { array_splice($nodes, $i, 1, $replace); } } return $nodes; } private function ensureReplacementReasonable(Node $old, Node $new) : void { if ($old instanceof TypeNode && !$new instanceof TypeNode) { throw new LogicException(sprintf('Trying to replace TypeNode with %s', get_class($new))); } if ($old instanceof ConstExprNode && !$new instanceof ConstExprNode) { throw new LogicException(sprintf('Trying to replace ConstExprNode with %s', get_class($new))); } if ($old instanceof PhpDocChildNode && !$new instanceof PhpDocChildNode) { throw new LogicException(sprintf('Trying to replace PhpDocChildNode with %s', get_class($new))); } if ($old instanceof PhpDocTagValueNode && !$new instanceof PhpDocTagValueNode) { throw new LogicException(sprintf('Trying to replace PhpDocTagValueNode with %s', get_class($new))); } } } MIT License Copyright (c) 2017 Luís Cobucci Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "local>lcobucci/.github:renovate-config" ] } { "name": "lcobucci\/clock", "description": "Yet another clock abstraction", "license": "MIT", "type": "library", "authors": [ { "name": "Lu\u00eds Cobucci", "email": "lcobucci@gmail.com" } ], "require": { "php": "~8.1.0 || ~8.2.0", "psr\/clock": "^1.0" }, "require-dev": { "infection\/infection": "^0.26", "lcobucci\/coding-standard": "^9.0", "phpstan\/extension-installer": "^1.2", "phpstan\/phpstan": "^1.9.4", "phpstan\/phpstan-deprecation-rules": "^1.1.1", "phpstan\/phpstan-phpunit": "^1.3.2", "phpstan\/phpstan-strict-rules": "^1.4.4", "phpunit\/phpunit": "^9.5.27" }, "autoload": { "psr-4": { "_ContaoManager\\Lcobucci\\Clock\\": "src" } }, "autoload-dev": { "psr-4": { "_ContaoManager\\Lcobucci\\Clock\\": "test" } }, "config": { "preferred-install": "dist", "sort-packages": true, "allow-plugins": { "dealerdirect\/phpcodesniffer-composer-installer": true, "infection\/extension-installer": true, "phpstan\/extension-installer": true } }, "provide": { "psr\/clock-implementation": "1.0" } }now = $now; } public function now() : DateTimeImmutable { return $this->now; } } timezone); } } #!/usr/bin/env php realpath = \realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = \fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = \fread($this->handle, $count); if ($this->position === 0) { $data = \preg_replace('{^#!.*\\r?\\n}', '', $data); } $this->position += \strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { \fclose($this->handle); } public function stream_lock($operation) { return $operation ? \flock($this->handle, $operation) : \true; } public function stream_seek($offset, $whence) { if (0 === \fseek($this->handle, $offset, $whence)) { $this->position = \ftell($this->handle); return \true; } return \false; } public function stream_tell() { return $this->position; } public function stream_eof() { return \feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return \true; } public function url_stat($path, $flags) { $path = \substr($path, 17); if (\file_exists($path)) { return \stat($path); } return \false; } } } if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/symfony/yaml/Resources/bin/yaml-lint'; } } return include __DIR__ . '/..' . '/symfony/yaml/Resources/bin/yaml-lint'; #!/usr/bin/env php realpath = \realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = \fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = \fread($this->handle, $count); if ($this->position === 0) { $data = \preg_replace('{^#!.*\\r?\\n}', '', $data); } $this->position += \strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { \fclose($this->handle); } public function stream_lock($operation) { return $operation ? \flock($this->handle, $operation) : \true; } public function stream_seek($offset, $whence) { if (0 === \fseek($this->handle, $offset, $whence)) { $this->position = \ftell($this->handle); return \true; } return \false; } public function stream_tell() { return $this->position; } public function stream_eof() { return \feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return \true; } public function url_stat($path, $flags) { $path = \substr($path, 17); if (\file_exists($path)) { return \stat($path); } return \false; } } } if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/symfony/error-handler/Resources/bin/patch-type-declarations'; } } return include __DIR__ . '/..' . '/symfony/error-handler/Resources/bin/patch-type-declarations'; #!/usr/bin/env php realpath = \realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = \fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = \fread($this->handle, $count); if ($this->position === 0) { $data = \preg_replace('{^#!.*\\r?\\n}', '', $data); } $this->position += \strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { \fclose($this->handle); } public function stream_lock($operation) { return $operation ? \flock($this->handle, $operation) : \true; } public function stream_seek($offset, $whence) { if (0 === \fseek($this->handle, $offset, $whence)) { $this->position = \ftell($this->handle); return \true; } return \false; } public function stream_tell() { return $this->position; } public function stream_eof() { return \feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return \true; } public function url_stat($path, $flags) { $path = \substr($path, 17); if (\file_exists($path)) { return \stat($path); } return \false; } } } if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/justinrainbow/json-schema/bin/validate-json'; } } return include __DIR__ . '/..' . '/justinrainbow/json-schema/bin/validate-json'; #!/usr/bin/env php realpath = \realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = \fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = \fread($this->handle, $count); if ($this->position === 0) { $data = \preg_replace('{^#!.*\\r?\\n}', '', $data); } $this->position += \strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { \fclose($this->handle); } public function stream_lock($operation) { return $operation ? \flock($this->handle, $operation) : \true; } public function stream_seek($offset, $whence) { if (0 === \fseek($this->handle, $offset, $whence)) { $this->position = \ftell($this->handle); return \true; } return \false; } public function stream_tell() { return $this->position; } public function stream_eof() { return \feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return \true; } public function url_stat($path, $flags) { $path = \substr($path, 17); if (\file_exists($path)) { return \stat($path); } return \false; } } } if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/composer/composer/bin/composer'; } } return include __DIR__ . '/..' . '/composer/composer/bin/composer'; #!/usr/bin/env php realpath = \realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = \fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = \fread($this->handle, $count); if ($this->position === 0) { $data = \preg_replace('{^#!.*\\r?\\n}', '', $data); } $this->position += \strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { \fclose($this->handle); } public function stream_lock($operation) { return $operation ? \flock($this->handle, $operation) : \true; } public function stream_seek($offset, $whence) { if (0 === \fseek($this->handle, $offset, $whence)) { $this->position = \ftell($this->handle); return \true; } return \false; } public function stream_tell() { return $this->position; } public function stream_eof() { return \feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return \true; } public function url_stat($path, $flags) { $path = \substr($path, 17); if (\file_exists($path)) { return \stat($path); } return \false; } } } if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/symfony/var-dumper/Resources/bin/var-dump-server'; } } return include __DIR__ . '/..' . '/symfony/var-dumper/Resources/bin/var-dump-server'; #!/usr/bin/env php realpath = \realpath($opened_path) ?: $opened_path; $opened_path = $this->realpath; $this->handle = \fopen($this->realpath, $mode); $this->position = 0; return (bool) $this->handle; } public function stream_read($count) { $data = \fread($this->handle, $count); if ($this->position === 0) { $data = \preg_replace('{^#!.*\\r?\\n}', '', $data); } $this->position += \strlen($data); return $data; } public function stream_cast($castAs) { return $this->handle; } public function stream_close() { \fclose($this->handle); } public function stream_lock($operation) { return $operation ? \flock($this->handle, $operation) : \true; } public function stream_seek($offset, $whence) { if (0 === \fseek($this->handle, $offset, $whence)) { $this->position = \ftell($this->handle); return \true; } return \false; } public function stream_tell() { return $this->position; } public function stream_eof() { return \feof($this->handle); } public function stream_stat() { return array(); } public function stream_set_option($option, $arg1, $arg2) { return \true; } public function url_stat($path, $flags) { $path = \substr($path, 17); if (\file_exists($path)) { return \stat($path); } return \false; } } } if (\function_exists('stream_get_wrappers') && \in_array('phpvfscomposer', \stream_get_wrappers(), \true) || \function_exists('stream_wrapper_register') && \stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) { return include "phpvfscomposer://" . __DIR__ . '/..' . '/seld/jsonlint/bin/jsonlint'; } } return include __DIR__ . '/..' . '/seld/jsonlint/bin/jsonlint'; MIT License Copyright (c) 2018-2022 Spomky-Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. { "name": "web-auth\/webauthn-lib", "type": "library", "license": "MIT", "description": "FIDO2\/Webauthn Support For PHP", "keywords": [ "FIDO", "FIDO2", "webauthn" ], "homepage": "https:\/\/github.com\/web-auth", "authors": [ { "name": "Florent Morselli", "homepage": "https:\/\/github.com\/Spomky" }, { "name": "All contributors", "homepage": "https:\/\/github.com\/web-auth\/webauthn-library\/contributors" } ], "require": { "php": ">=8.1", "ext-json": "*", "ext-openssl": "*", "ext-mbstring": "*", "lcobucci\/clock": "^2.2|^3.0", "paragonie\/constant_time_encoding": "^2.6|^3.0", "psr\/clock": "^1.0", "psr\/event-dispatcher": "^1.0", "psr\/http-client": "^1.0", "psr\/http-factory": "^1.0", "psr\/log": "^1.0|^2.0|^3.0", "spomky-labs\/cbor-php": "^3.0", "spomky-labs\/pki-framework": "^1.0", "symfony\/uid": "^6.1|^7.0", "symfony\/deprecation-contracts": "^3.2", "web-auth\/cose-lib": "^4.2.3" }, "autoload": { "psr-4": { "_ContaoManager\\Webauthn\\": "src\/" } }, "extra": { "thanks": { "name": "web-auth\/webauthn-framework", "url": "https:\/\/github.com\/web-auth\/webauthn-framework" } }, "suggest": { "symfony\/serializer": "As of 4.5.x, the symfony\/serializer component will become mandatory for converting objects such as the Metadata Statement", "symfony\/property-access": "As of 4.5.x, the symfony\/serializer component will become mandatory for converting objects such as the Metadata Statement", "symfony\/property-info": "As of 4.5.x, the symfony\/serializer component will become mandatory for converting objects such as the Metadata Statement", "phpdocumentor\/reflection-docblock": "As of 4.5.x, the phpdocumentor\/reflection-docblock component will become mandatory for converting objects such as the Metadata Statement", "psr\/log-implementation": "Recommended to receive logs from the library", "symfony\/event-dispatcher": "Recommended to use dispatched events", "psr\/clock-implementation": "As of 4.5.x, the PSR Clock implementation will replace lcobucci\/clock", "web-token\/jwt-library": "Mandatory for fetching Metadata Statement from distant sources" } }length = \mb_strlen($data, '8bit'); $resource = fopen('php://memory', 'rb+'); fwrite($resource, $data); rewind($resource); $this->data = $resource; } public function read(int $length) : string { if ($length <= 0) { return ''; } $read = fread($this->data, $length); $bytesRead = \mb_strlen($read, '8bit'); \mb_strlen($read, '8bit') === $length || throw InvalidDataException::create(null, sprintf('Out of range. Expected: %d, read: %d.', $length, $bytesRead)); $this->totalRead += $bytesRead; return $read; } public function close() : void { fclose($this->data); } public function isEOF() : bool { return $this->totalRead === $this->length; } } getAttestedCredentialData()->credentialPublicKey; $credentialPublicKey !== null || throw AuthenticatorResponseVerificationException::create('No public key available.'); $algorithms = \array_map(fn($pubKeyCredParam) => $pubKeyCredParam->alg, $publicKeyCredentialOptions->pubKeyCredParams); if (count($algorithms) === 0) { $algorithms = [Algorithms::COSE_ALGORITHM_ES256, Algorithms::COSE_ALGORITHM_RS256]; } $coseKey = $this->getCoseKey($credentialPublicKey); in_array($coseKey->alg(), $algorithms, \true) || throw AuthenticatorResponseVerificationException::create(sprintf('Invalid algorithm. Expected one of %s but got %d', \implode(', ', $algorithms), $coseKey->alg())); } private function getCoseKey(string $credentialPublicKey) : Key { $isU2F = U2FPublicKey::isU2FKey($credentialPublicKey); if ($isU2F === \true) { $credentialPublicKey = U2FPublicKey::convertToCoseKey($credentialPublicKey); } $stream = new StringStream($credentialPublicKey); $credentialPublicKeyStream = Decoder::create()->decode($stream); $stream->isEOF() || throw AuthenticatorResponseVerificationException::create('Invalid key. Presence of extra bytes.'); $stream->close(); $credentialPublicKeyStream instanceof Normalizable || throw AuthenticatorResponseVerificationException::create('Invalid attestation object. Unexpected object.'); $normalizedData = $credentialPublicKeyStream->normalize(); is_array($normalizedData) || throw AuthenticatorResponseVerificationException::create('Invalid attestation object. Unexpected object.'); /** @var array $normalizedData */ return Key::create($normalizedData); } } userHandle; $responseUserHandle = $authenticatorResponse->userHandle; if ($userHandle !== null) { //If the user was identified before the authentication ceremony was initiated, $credentialUserHandle === $userHandle || throw InvalidUserHandleException::create(); if ($responseUserHandle !== null && $responseUserHandle !== '') { $credentialUserHandle === $responseUserHandle || throw InvalidUserHandleException::create(); } } else { $responseUserHandle !== '' && $credentialUserHandle === $responseUserHandle || throw InvalidUserHandleException::create(); } } } authenticatorData : $authenticatorResponse->attestationObject->authData; $authData->hasAttestedCredentialData() || throw AuthenticatorResponseVerificationException::create('There is no attested credential data.'); $authData->attestedCredentialData !== null || throw AuthenticatorResponseVerificationException::create('There is no attested credential data.'); } } steps as $step) { $step->process($publicKeyCredentialSource, $authenticatorResponse, $publicKeyCredentialOptions, $userHandle, $host); } } } userVerification : $publicKeyCredentialOptions->authenticatorSelection?->userVerification; if ($userVerification !== AuthenticatorSelectionCriteria::USER_VERIFICATION_REQUIREMENT_REQUIRED) { return; } $authData = $authenticatorResponse instanceof AuthenticatorAssertionResponse ? $authenticatorResponse->authenticatorData : $authenticatorResponse->attestationObject->authData; $authData->isUserVerified() || throw AuthenticatorResponseVerificationException::create('User authentication required.'); } } allowCredentials) === 0) { return; } foreach ($publicKeyCredentialOptions->allowCredentials as $allowedCredential) { if (\hash_equals($allowedCredential->id, $publicKeyCredentialSource->publicKeyCredentialId)) { return; } } throw AuthenticatorResponseVerificationException::create('The credential ID is not allowed.'); } } publicKeyCredentialId; \mb_strlen($credentialId) <= 1023 || throw new AuthenticatorResponseVerificationException('Credential ID too long.'); } } attestationObject; if ($attestationObject === null) { return; } $fmt = $attestationObject->attStmt->fmt; $this->attestationStatementSupportManager->has($fmt) || throw AuthenticatorResponseVerificationException::create('Unsupported attestation statement format.'); $attestationStatementSupport = $this->attestationStatementSupportManager->get($fmt); $clientDataJSONHash = \hash('sha256', $authenticatorResponse->clientDataJSON->rawData, \true); $attestationStatementSupport->isValid($clientDataJSONHash, $attestationObject->attStmt, $attestationObject->authData) || throw AuthenticatorResponseVerificationException::create('Invalid attestation statement.'); } } algorithmManager = $algorithmManager ?? Manager::create()->add(ES256::create(), RS256::create()); } public function process(PublicKeyCredentialSource $publicKeyCredentialSource, AuthenticatorAssertionResponse|AuthenticatorAttestationResponse $authenticatorResponse, PublicKeyCredentialRequestOptions|PublicKeyCredentialCreationOptions $publicKeyCredentialOptions, ?string $userHandle, string $host) : void { if (!$authenticatorResponse instanceof AuthenticatorAssertionResponse) { return; } $credentialPublicKey = $publicKeyCredentialSource->getAttestedCredentialData()->credentialPublicKey; $credentialPublicKey !== null || throw AuthenticatorResponseVerificationException::create('No public key available.'); $coseKey = $this->getCoseKey($credentialPublicKey); $getClientDataJSONHash = \hash('sha256', $authenticatorResponse->clientDataJSON->rawData, \true); $dataToVerify = $authenticatorResponse->authenticatorData->authData . $getClientDataJSONHash; $signature = $authenticatorResponse->signature; $algorithm = $this->algorithmManager->get($coseKey->alg()); $algorithm instanceof Signature || throw AuthenticatorResponseVerificationException::create('Invalid algorithm identifier. Should refer to a signature algorithm'); $signature = CoseSignatureFixer::fix($signature, $algorithm); $algorithm->verify($dataToVerify, $coseKey, $signature) || throw AuthenticatorResponseVerificationException::create('Invalid signature.'); } private function getCoseKey(string $credentialPublicKey) : Key { $isU2F = U2FPublicKey::isU2FKey($credentialPublicKey); if ($isU2F === \true) { $credentialPublicKey = U2FPublicKey::convertToCoseKey($credentialPublicKey); } $stream = new StringStream($credentialPublicKey); $credentialPublicKeyStream = Decoder::create()->decode($stream); $stream->isEOF() || throw AuthenticatorResponseVerificationException::create('Invalid key. Presence of extra bytes.'); $stream->close(); $credentialPublicKeyStream instanceof Normalizable || throw AuthenticatorResponseVerificationException::create('Invalid attestation object. Unexpected object.'); $normalizedData = $credentialPublicKeyStream->normalize(); is_array($normalizedData) || throw AuthenticatorResponseVerificationException::create('Invalid attestation object. Unexpected object.'); /** @var array $normalizedData */ return Key::create($normalizedData); } } host || throw AuthenticatorResponseVerificationException::create('The top origin does not correspond to the host.'); } } authenticatorData : $authenticatorResponse->attestationObject->authData; $C = $authenticatorResponse->clientDataJSON; $attestedCredentialData = $publicKeyCredentialSource->getAttestedCredentialData(); $credentialPublicKey = $attestedCredentialData->credentialPublicKey; $credentialPublicKey !== null || throw AuthenticatorResponseVerificationException::create('No public key available.'); $isU2F = U2FPublicKey::isU2FKey($credentialPublicKey); $rpId = $publicKeyCredentialOptions->rpId ?? $publicKeyCredentialOptions->rp->id ?? $host; $facetId = $this->getFacetId($rpId, $publicKeyCredentialOptions->extensions, $authData->extensions); $rpIdHash = \hash('sha256', $isU2F ? $C->origin : $facetId, \true); \hash_equals($rpIdHash, $authData->rpIdHash) || throw AuthenticatorResponseVerificationException::create('rpId hash mismatch.'); } private function getFacetId(string $rpId, AuthenticationExtensions $authenticationExtensionsClientInputs, null|AuthenticationExtensions $authenticationExtensionsClientOutputs) : string { if ($authenticationExtensionsClientOutputs === null || !$authenticationExtensionsClientInputs->has('appid') || !$authenticationExtensionsClientOutputs->has('appid')) { return $rpId; } $appId = $authenticationExtensionsClientInputs->get('appid')->value; $wasUsed = $authenticationExtensionsClientOutputs->get('appid')->value; if (!is_string($appId) || $wasUsed !== \true) { return $rpId; } return $appId; } } authenticatorData : $authenticatorResponse->attestationObject->authData; if ($authData->isBackupEligible()) { return; } $authData->isBackedUp() !== \true || throw AuthenticatorResponseVerificationException::create('Backup up bit is set but the backup is not eligible.'); } } authenticatorData : $authenticatorResponse->attestationObject->authData; $authData->isUserPresent() || throw AuthenticatorResponseVerificationException::create('User was not present'); } } clientDataCollectorManager = $clientDataCollectorManager ?? new ClientDataCollectorManager([new WebauthnAuthenticationCollector()]); } public function process(PublicKeyCredentialSource $publicKeyCredentialSource, AuthenticatorAssertionResponse|AuthenticatorAttestationResponse $authenticatorResponse, PublicKeyCredentialRequestOptions|PublicKeyCredentialCreationOptions $publicKeyCredentialOptions, ?string $userHandle, string $host) : void { $this->clientDataCollectorManager->collect($authenticatorResponse->clientDataJSON, $publicKeyCredentialOptions, $authenticatorResponse, $host); } } challenge !== '' || throw AuthenticatorResponseVerificationException::create('Invalid challenge.'); \hash_equals($publicKeyCredentialOptions->challenge, $authenticatorResponse->clientDataJSON->challenge) || throw AuthenticatorResponseVerificationException::create('Invalid challenge.'); } } authenticatorData : $authenticatorResponse->attestationObject->authData; $storedCounter = $publicKeyCredentialSource->counter; $responseCounter = $authData->signCount; if ($responseCounter !== 0 || $storedCounter !== 0) { $this->counterChecker->check($publicKeyCredentialSource, $responseCounter); } $publicKeyCredentialSource->counter = $responseCounter; } } clientDataJSON->topOrigin; if ($topOrigin === null) { return; } if ($authenticatorResponse->clientDataJSON->crossOrigin !== \true) { throw AuthenticatorResponseVerificationException::create('The response is not cross-origin.'); } if ($this->topOriginValidator === null) { (new HostTopOriginValidator($host))->validate($topOrigin); } else { $this->topOriginValidator->validate($topOrigin); } } } authenticatorData : $authenticatorResponse->attestationObject->authData; $C = $authenticatorResponse->clientDataJSON; $rpId = $publicKeyCredentialOptions->rpId ?? $publicKeyCredentialOptions->rp->id ?? $host; $facetId = $this->getFacetId($rpId, $publicKeyCredentialOptions->extensions, $authData->extensions); $parsedRelyingPartyId = \parse_url($C->origin); is_array($parsedRelyingPartyId) || throw AuthenticatorResponseVerificationException::create('Invalid origin'); if (!in_array($facetId, $this->securedRelyingPartyId, \true)) { $scheme = $parsedRelyingPartyId['scheme'] ?? ''; $scheme === 'https' || throw AuthenticatorResponseVerificationException::create('Invalid scheme. HTTPS required.'); } $clientDataRpId = $parsedRelyingPartyId['host'] ?? ''; $clientDataRpId !== '' || throw AuthenticatorResponseVerificationException::create('Invalid origin rpId.'); $rpIdLength = \mb_strlen($facetId); \mb_substr('.' . $clientDataRpId, -($rpIdLength + 1)) === '.' . $facetId || throw AuthenticatorResponseVerificationException::create('rpId mismatch.'); } private function getFacetId(string $rpId, AuthenticationExtensions $authenticationExtensionsClientInputs, null|AuthenticationExtensions $authenticationExtensionsClientOutputs) : string { if ($authenticationExtensionsClientOutputs === null || !$authenticationExtensionsClientInputs->has('appid') || !$authenticationExtensionsClientOutputs->has('appid')) { return $rpId; } $appId = $authenticationExtensionsClientInputs->get('appid')->value; $wasUsed = $authenticationExtensionsClientOutputs->get('appid')->value; if (!is_string($appId) || $wasUsed !== \true) { return $rpId; } return $appId; } } authenticatorData : $authenticatorResponse->attestationObject->authData; $extensionsClientOutputs = $authData->extensions; if ($extensionsClientOutputs !== null) { $this->extensionOutputCheckerHandler->check($publicKeyCredentialOptions->extensions, $extensionsClientOutputs); } } } logger = new NullLogger(); } public function enableMetadataStatementSupport(MetadataStatementRepository $metadataStatementRepository, StatusReportRepository $statusReportRepository, CertificateChainValidator $certificateChainValidator) : void { $this->metadataStatementRepository = $metadataStatementRepository; $this->statusReportRepository = $statusReportRepository; $this->certificateChainValidator = $certificateChainValidator; } public function enableCertificateChainValidator(CertificateChainValidator $certificateChainValidator) : void { $this->certificateChainValidator = $certificateChainValidator; } public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } public function process(PublicKeyCredentialSource $publicKeyCredentialSource, AuthenticatorAssertionResponse|AuthenticatorAttestationResponse $authenticatorResponse, PublicKeyCredentialRequestOptions|PublicKeyCredentialCreationOptions $publicKeyCredentialOptions, ?string $userHandle, string $host) : void { if (!$publicKeyCredentialOptions instanceof PublicKeyCredentialCreationOptions || !$authenticatorResponse instanceof AuthenticatorAttestationResponse) { return; } $attestationStatement = $authenticatorResponse->attestationObject->attStmt; $attestedCredentialData = $authenticatorResponse->attestationObject->authData->attestedCredentialData; $attestedCredentialData !== null || throw AuthenticatorResponseVerificationException::create('No attested credential data found'); $aaguid = $attestedCredentialData->aaguid->__toString(); if ($publicKeyCredentialOptions->attestation === null || $publicKeyCredentialOptions->attestation === PublicKeyCredentialCreationOptions::ATTESTATION_CONVEYANCE_PREFERENCE_NONE) { $this->logger->debug('No attestation is asked.'); if ($aaguid === '00000000-0000-0000-0000-000000000000' && in_array($attestationStatement->type, [AttestationStatement::TYPE_NONE, AttestationStatement::TYPE_SELF], \true)) { $this->logger->debug('The Attestation Statement is anonymous.'); $this->checkCertificateChain($attestationStatement, null); return; } return; } // If no Attestation Statement has been returned or if null AAGUID (=00000000-0000-0000-0000-000000000000) // => nothing to check if ($attestationStatement->type === AttestationStatement::TYPE_NONE) { $this->logger->debug('No attestation returned.'); //No attestation is returned. We shall ensure that the AAGUID is a null one. //if ($aaguid !== '00000000-0000-0000-0000-000000000000') { //$this->logger->debug('Anonymization required. AAGUID and Attestation Statement changed.', [ // 'aaguid' => $aaguid, // 'AttestationStatement' => $attestationStatement, //]); //$attestedCredentialData->aaguid = Uuid::fromString('00000000-0000-0000-0000-000000000000'); // return; //} return; } if ($aaguid === '00000000-0000-0000-0000-000000000000') { //No need to continue if the AAGUID is null. // This could be the case e.g. with AnonCA type return; } //The MDS Repository is mandatory here $this->metadataStatementRepository !== null || throw AuthenticatorResponseVerificationException::create('The Metadata Statement Repository is mandatory when requesting attestation objects.'); $metadataStatement = $this->metadataStatementRepository->findOneByAAGUID($aaguid); // At this point, the Metadata Statement is mandatory $metadataStatement !== null || throw AuthenticatorResponseVerificationException::create(sprintf('The Metadata Statement for the AAGUID "%s" is missing', $aaguid)); // We check the last status report $this->checkStatusReport($aaguid); // We check the certificate chain (if any) $this->checkCertificateChain($attestationStatement, $metadataStatement); // Check Attestation Type is allowed if (count($metadataStatement->attestationTypes) !== 0) { $type = $this->getAttestationType($attestationStatement); in_array($type, $metadataStatement->attestationTypes, \true) || throw AuthenticatorResponseVerificationException::create(sprintf('Invalid attestation statement. The attestation type "%s" is not allowed for this authenticator.', $type)); } } private function getAttestationType(AttestationStatement $attestationStatement) : string { return match ($attestationStatement->type) { AttestationStatement::TYPE_BASIC => MetadataStatement::ATTESTATION_BASIC_FULL, AttestationStatement::TYPE_SELF => MetadataStatement::ATTESTATION_BASIC_SURROGATE, AttestationStatement::TYPE_ATTCA => MetadataStatement::ATTESTATION_ATTCA, AttestationStatement::TYPE_ECDAA => MetadataStatement::ATTESTATION_ECDAA, AttestationStatement::TYPE_ANONCA => MetadataStatement::ATTESTATION_ANONCA, default => throw AuthenticatorResponseVerificationException::create('Invalid attestation type'), }; } private function checkStatusReport(string $aaguid) : void { $statusReports = $this->statusReportRepository === null ? [] : $this->statusReportRepository->findStatusReportsByAAGUID($aaguid); if (count($statusReports) !== 0) { $lastStatusReport = \end($statusReports); if ($lastStatusReport->isCompromised()) { throw AuthenticatorResponseVerificationException::create('The authenticator is compromised and cannot be used'); } } } private function checkCertificateChain(AttestationStatement $attestationStatement, ?MetadataStatement $metadataStatement) : void { $trustPath = $attestationStatement->trustPath; if (!$trustPath instanceof CertificateTrustPath) { return; } $authenticatorCertificates = $trustPath->certificates; if ($metadataStatement === null) { $this->certificateChainValidator?->check($authenticatorCertificates, []); return; } $trustedCertificates = CertificateToolbox::fixPEMStructures($metadataStatement->attestationRootCertificates); $this->certificateChainValidator?->check($authenticatorCertificates, $trustedCertificates); } } counterChecker = new ThrowExceptionIfInvalid(); $this->algorithmManager = Manager::create()->add(ES256::create(), RS256::create()); $this->attestationStatementSupportManager = new AttestationStatementSupportManager([new NoneAttestationStatementSupport()]); $this->extensionOutputCheckerHandler = new ExtensionOutputCheckerHandler(); } public function setCounterChecker(CounterChecker $counterChecker) : void { $this->counterChecker = $counterChecker; } /** * @param string[] $securedRelyingPartyId */ public function setSecuredRelyingPartyId(array $securedRelyingPartyId) : void { $this->securedRelyingPartyId = $securedRelyingPartyId; } public function setExtensionOutputCheckerHandler(ExtensionOutputCheckerHandler $extensionOutputCheckerHandler) : void { $this->extensionOutputCheckerHandler = $extensionOutputCheckerHandler; } public function setAttestationStatementSupportManager(AttestationStatementSupportManager $attestationStatementSupportManager) : void { $this->attestationStatementSupportManager = $attestationStatementSupportManager; } public function setAlgorithmManager(Manager $algorithmManager) : void { $this->algorithmManager = $algorithmManager; } public function enableMetadataStatementSupport(MetadataStatementRepository $metadataStatementRepository, StatusReportRepository $statusReportRepository, CertificateChainValidator $certificateChainValidator) : void { $this->metadataStatementRepository = $metadataStatementRepository; $this->statusReportRepository = $statusReportRepository; $this->certificateChainValidator = $certificateChainValidator; } public function enableCertificateChainValidator(CertificateChainValidator $certificateChainValidator) : void { $this->certificateChainValidator = $certificateChainValidator; } public function enableTopOriginValidator(TopOriginValidator $topOriginValidator) : void { $this->topOriginValidator = $topOriginValidator; } /** * @param null|string[] $securedRelyingPartyId */ public function creationCeremony(null|array $securedRelyingPartyId = null) : CeremonyStepManager { $metadataStatementChecker = new CheckMetadataStatement(); if ($this->certificateChainValidator !== null) { $metadataStatementChecker->enableCertificateChainValidator($this->certificateChainValidator); } if ($this->metadataStatementRepository !== null && $this->statusReportRepository !== null && $this->certificateChainValidator !== null) { $metadataStatementChecker->enableMetadataStatementSupport($this->metadataStatementRepository, $this->statusReportRepository, $this->certificateChainValidator); } /* @see https://www.w3.org/TR/webauthn-3/#sctn-registering-a-new-credential */ return new CeremonyStepManager([new CheckClientDataCollectorType(), new CheckChallenge(), new CheckOrigin($this->securedRelyingPartyId ?? $securedRelyingPartyId ?? []), new CheckTopOrigin($this->topOriginValidator), new CheckRelyingPartyIdIdHash(), new CheckUserWasPresent(), new CheckUserVerification(), new CheckBackupBitsAreConsistent(), new CheckAlgorithm(), new CheckExtensions($this->extensionOutputCheckerHandler), new CheckAttestationFormatIsKnownAndValid($this->attestationStatementSupportManager), new CheckHasAttestedCredentialData(), $metadataStatementChecker, new CheckCredentialId()]); } /** * @param null|string[] $securedRelyingPartyId */ public function requestCeremony(null|array $securedRelyingPartyId = null) : CeremonyStepManager { /* @see https://www.w3.org/TR/webauthn-3/#sctn-verifying-assertion */ return new CeremonyStepManager([new CheckAllowedCredentialList(), new CheckUserHandle(), new CheckClientDataCollectorType(), new CheckChallenge(), new CheckOrigin($this->securedRelyingPartyId ?? $securedRelyingPartyId ?? []), new CheckTopOrigin(null), new CheckRelyingPartyIdIdHash(), new CheckUserWasPresent(), new CheckUserVerification(), new CheckBackupBitsAreConsistent(), new CheckExtensions($this->extensionOutputCheckerHandler), new CheckSignature($this->algorithmManager), new CheckCounter($this->counterChecker)]); } } id = $id; } public static function create(string $name, string $id, string $displayName, ?string $icon = null) : self { return new self($name, $id, $displayName, $icon); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getId() : string { return $this->id; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getDisplayName() : string { return $this->displayName; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromString(string $data) : self { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); is_array($data) || throw InvalidDataException::create($data, 'Invalid data'); return self::createFromArray($data); } /** * @param mixed[] $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : self { array_key_exists('name', $json) || throw InvalidDataException::create($json, 'Invalid input. "name" is missing.'); array_key_exists('id', $json) || throw InvalidDataException::create($json, 'Invalid input. "id" is missing.'); array_key_exists('displayName', $json) || throw InvalidDataException::create($json, 'Invalid input. "displayName" is missing.'); $id = Base64::decode($json['id'], \true); return self::create($json['name'], $id, $json['displayName'], $json['icon'] ?? null); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $json = parent::jsonSerialize(); $json['id'] = Base64UrlSafe::encodeUnpadded($this->id); $json['displayName'] = $this->displayName; return $json; } } * @final */ class AuthenticationExtensions implements JsonSerializable, Countable, IteratorAggregate, ArrayAccess { /** * @var array * @readonly */ public array $extensions; /** * @param array $extensions */ public function __construct(array $extensions = []) { $list = []; foreach ($extensions as $key => $extension) { if ($extension instanceof AuthenticationExtension) { $list[$extension->name] = $extension; continue; } if (is_string($key)) { $list[$key] = AuthenticationExtension::create($key, $extension); continue; } throw new AuthenticationExtensionException('Invalid extension'); } $this->extensions = $list; } /** * @param array $extensions */ public static function create(array $extensions = []) : static { return new static($extensions); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function add(AuthenticationExtension ...$extensions) : static { foreach ($extensions as $extension) { $this->extensions[$extension->name] = $extension; } return $this; } /** * @param array $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : static { return static::create(\array_map(static fn(string $key, mixed $value): AuthenticationExtension => AuthenticationExtension::create($key, $value), \array_keys($json), $json)); } public function has(string $key) : bool { return array_key_exists($key, $this->extensions); } public function get(string $key) : AuthenticationExtension { $this->has($key) || throw AuthenticationExtensionException::create(sprintf('The extension with key "%s" is not available', $key)); return $this->extensions[$key]; } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return $this->extensions; } /** * @return Iterator */ public function getIterator() : Iterator { return new ArrayIterator($this->extensions); } public function count(int $mode = COUNT_NORMAL) : int { return count($this->extensions, $mode); } public function offsetExists(mixed $offset) : bool { return array_key_exists($offset, $this->extensions); } public function offsetGet(mixed $offset) : mixed { return $this->extensions[$offset]; } public function offsetSet(mixed $offset, mixed $value) : void { if ($value === null) { return; } if ($value instanceof AuthenticationExtension) { $this->extensions[$value->name] = $value; return; } if (is_string($offset)) { $this->extensions[$offset] = AuthenticationExtension::create($offset, $value); return; } throw new AuthenticationExtensionException('Invalid extension'); } public function offsetUnset(mixed $offset) : void { unset($this->extensions[$offset]); } } checkers[] = $checker; } public function check(AuthenticationExtensions $inputs, AuthenticationExtensions $outputs) : void { foreach ($this->checkers as $checker) { $checker->check($inputs, $outputs); } } } authenticationExtension; } } name; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function value() : mixed { return $this->value; } public function jsonSerialize() : mixed { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return $this->value; } } normalize(); return AuthenticationExtensionsClientOutputs::create(\array_map(fn(mixed $value, string $key) => AuthenticationExtension::create($key, $value), $data, \array_keys($data))); } } clock === null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$clock" will be required in 5.0.0. Please set a clock instance.'); } if (!\class_exists(RS256::class) || !\class_exists(JWKFactory::class)) { throw UnsupportedFeatureException::create('The algorithm RS256 is missing. Did you forget to install the package web-token/jwt-library?'); } $this->jwsSerializer = new CompactSerializer(); $this->initJwsVerifier(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create(null|ClockInterface $clock = null) : self { return new self($clock); } public function enableApiVerification(ClientInterface|HttpClientInterface $client, string $apiKey, ?RequestFactoryInterface $requestFactory = null) : self { $this->apiKey = $apiKey; $this->client = $client; $this->requestFactory = $requestFactory; if ($requestFactory !== null && !$client instanceof HttpClientInterface) { \trigger_deprecation('web-auth/metadata-service', '4.7.0', 'The parameter "$requestFactory" will be removed in 5.0.0. Please set it to null and set an Symfony\\Contracts\\HttpClient\\HttpClientInterface as "$client" argument.'); } return $this; } public function setMaxAge(int $maxAge) : self { $this->maxAge = $maxAge; return $this; } public function setLeeway(int $leeway) : self { $this->leeway = $leeway; return $this; } public function name() : string { return 'android-safetynet'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { array_key_exists('attStmt', $attestation) || throw AttestationStatementLoadingException::create($attestation); foreach (['ver', 'response'] as $key) { array_key_exists($key, $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, sprintf('The attestation statement value "%s" is missing.', $key)); $attestation['attStmt'][$key] !== '' || throw AttestationStatementLoadingException::create($attestation, sprintf('The attestation statement value "%s" is empty.', $key)); } $jws = $this->jwsSerializer->unserialize($attestation['attStmt']['response']); $jwsHeader = $jws->getSignature(0)->getProtectedHeader(); array_key_exists('x5c', $jwsHeader) || throw AttestationStatementLoadingException::create($attestation, 'The response in the attestation statement must contain a "x5c" header.'); (\is_countable($jwsHeader['x5c']) ? count($jwsHeader['x5c']) : 0) > 0 || throw AttestationStatementLoadingException::create($attestation, 'The "x5c" parameter in the attestation statement response must contain at least one certificate.'); $certificates = $this->convertCertificatesToPem($jwsHeader['x5c']); $attestation['attStmt']['jws'] = $jws; $attestationStatement = AttestationStatement::createBasic($this->name(), $attestation['attStmt'], CertificateTrustPath::create($certificates)); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $trustPath = $attestationStatement->trustPath; $trustPath instanceof CertificateTrustPath || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid trust path'); $certificates = $trustPath->certificates; $firstCertificate = \current($certificates); is_string($firstCertificate) || throw InvalidAttestationStatementException::create($attestationStatement, 'No certificate'); $parsedCertificate = \openssl_x509_parse($firstCertificate); is_array($parsedCertificate) || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid attestation object'); array_key_exists('subject', $parsedCertificate) || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid attestation object'); array_key_exists('CN', $parsedCertificate['subject']) || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid attestation object'); $parsedCertificate['subject']['CN'] === 'attest.android.com' || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid attestation object'); /** @var JWS $jws */ $jws = $attestationStatement->get('jws'); $payload = $jws->getPayload(); $this->validatePayload($payload, $clientDataJSONHash, $authenticatorData); //Check the signature $this->validateSignature($jws, $trustPath); //Check against Google service $this->validateUsingGoogleApi($attestationStatement); return \true; } private function validatePayload(?string $payload, string $clientDataJSONHash, AuthenticatorData $authenticatorData) : void { $payload !== null || throw AttestationStatementVerificationException::create('Invalid attestation object'); $payload = \json_decode($payload, \true, flags: JSON_THROW_ON_ERROR); array_key_exists('nonce', $payload) || throw AttestationStatementVerificationException::create('Invalid attestation object. "nonce" is missing.'); $payload['nonce'] === \base64_encode(\hash('sha256', $authenticatorData->authData . $clientDataJSONHash, \true)) || throw AttestationStatementVerificationException::create('Invalid attestation object. Invalid nonce'); array_key_exists('ctsProfileMatch', $payload) || throw AttestationStatementVerificationException::create('Invalid attestation object. "ctsProfileMatch" is missing.'); $payload['ctsProfileMatch'] || throw AttestationStatementVerificationException::create('Invalid attestation object. "ctsProfileMatch" value is false.'); array_key_exists('timestampMs', $payload) || throw AttestationStatementVerificationException::create('Invalid attestation object. Timestamp is missing.'); is_int($payload['timestampMs']) || throw AttestationStatementVerificationException::create('Invalid attestation object. Timestamp shall be an integer.'); $currentTime = ($this->clock?->now()->getTimestamp() ?? \time()) * 1000; $payload['timestampMs'] <= $currentTime + $this->leeway || throw AttestationStatementVerificationException::create(sprintf('Invalid attestation object. Issued in the future. Current time: %d. Response time: %d', $currentTime, $payload['timestampMs'])); $currentTime - $payload['timestampMs'] <= $this->maxAge || throw AttestationStatementVerificationException::create(sprintf('Invalid attestation object. Too old. Current time: %d. Response time: %d', $currentTime, $payload['timestampMs'])); } private function validateSignature(JWS $jws, CertificateTrustPath $trustPath) : void { $jwk = JWKFactory::createFromCertificate($trustPath->certificates[0]); $isValid = $this->jwsVerifier?->verifyWithKey($jws, $jwk, 0); $isValid === \true || throw AttestationStatementVerificationException::create('Invalid response signature'); } private function validateUsingGoogleApi(AttestationStatement $attestationStatement) : void { if ($this->client === null || $this->apiKey === null) { return; } $uri = sprintf('https://www.googleapis.com/androidcheck/v1/attestations/verify?key=%s', \urlencode($this->apiKey)); $requestBody = sprintf('{"signedAttestation":"%s"}', $attestationStatement->get('response')); if ($this->client instanceof HttpClientInterface) { $responseBody = $this->validateUsingGoogleApiWithSymfonyClient($requestBody, $uri); } else { $responseBody = $this->validateUsingGoogleApiWithPsrClient($requestBody, $uri); } $responseBodyJson = \json_decode($responseBody, \true, flags: JSON_THROW_ON_ERROR); array_key_exists('isValidSignature', $responseBodyJson) || throw AttestationStatementVerificationException::create('Invalid response.'); $responseBodyJson['isValidSignature'] === \true || throw AttestationStatementVerificationException::create('Invalid response.'); } private function getResponseBody(ResponseInterface $response) : string { $responseBody = ''; $response->getBody()->rewind(); do { $tmp = $response->getBody()->read(1024); if ($tmp === '') { break; } $responseBody .= $tmp; } while (\true); return $responseBody; } /** * @param string[] $certificates * * @return string[] */ private function convertCertificatesToPem(array $certificates) : array { foreach ($certificates as $k => $v) { $certificates[$k] = CertificateToolbox::fixPEMStructure($v); } return $certificates; } private function initJwsVerifier() : void { $algorithmClasses = [RS256::class, RS384::class, RS512::class, PS256::class, PS384::class, PS512::class, ES256::class, ES384::class, ES512::class, EdDSA::class]; /** @var AlgorithmInterface[] $algorithms */ $algorithms = []; foreach ($algorithmClasses as $algorithm) { if (\class_exists($algorithm)) { $algorithms[] = new $algorithm(); } } $algorithmManager = new AlgorithmManager($algorithms); $this->jwsVerifier = new JWSVerifier($algorithmManager); } private function validateUsingGoogleApiWithSymfonyClient(string $requestBody, string $uri) : string { $response = $this->client->request('POST', $uri, ['headers' => ['content-type' => 'application/json'], 'body' => $requestBody]); $response->getStatusCode() === 200 || throw AttestationStatementVerificationException::create('Request did not succeeded'); return $response->getContent(); } private function validateUsingGoogleApiWithPsrClient(string $requestBody, string $uri) : string { $request = $this->requestFactory->createRequest('POST', $uri); $request = $request->withHeader('content-type', 'application/json'); $request->getBody()->write($requestBody); $response = $this->client->sendRequest($request); $response->getStatusCode() === 200 || throw AttestationStatementVerificationException::create('Request did not succeeded'); return $this->getResponseBody($response); } } decoder = Decoder::create(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create() : self { return new self(); } public function name() : string { return 'fido-u2f'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { array_key_exists('attStmt', $attestation) || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); foreach (['sig', 'x5c'] as $key) { array_key_exists($key, $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, sprintf('The attestation statement value "%s" is missing.', $key)); } $certificates = $attestation['attStmt']['x5c']; is_array($certificates) || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "x5c" must be a list with one certificate.'); count($certificates) === 1 || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "x5c" must be a list with one certificate.'); \reset($certificates); $certificates = CertificateToolbox::convertAllDERToPEM($certificates); $this->checkCertificate($certificates[0]); $attestationStatement = AttestationStatement::createBasic($attestation['fmt'], $attestation['attStmt'], CertificateTrustPath::create($certificates)); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $authenticatorData->attestedCredentialData?->aaguid->__toString() === '00000000-0000-0000-0000-000000000000' || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid AAGUID for fido-u2f attestation statement. Shall be "00000000-0000-0000-0000-000000000000"'); $trustPath = $attestationStatement->trustPath; $trustPath instanceof CertificateTrustPath || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid trust path'); $dataToVerify = "\x00"; $dataToVerify .= $authenticatorData->rpIdHash; $dataToVerify .= $clientDataJSONHash; $dataToVerify .= $authenticatorData->attestedCredentialData->credentialId; $dataToVerify .= $this->extractPublicKey($authenticatorData->attestedCredentialData->credentialPublicKey); return openssl_verify($dataToVerify, $attestationStatement->get('sig'), $trustPath->certificates[0], OPENSSL_ALGO_SHA256) === 1; } private function extractPublicKey(?string $publicKey) : string { $publicKey !== null || throw AttestationStatementVerificationException::create('The attested credential data does not contain a valid public key.'); $publicKeyStream = new StringStream($publicKey); $coseKey = $this->decoder->decode($publicKeyStream); $publicKeyStream->isEOF() || throw AttestationStatementVerificationException::create('Invalid public key. Presence of extra bytes.'); $publicKeyStream->close(); $coseKey instanceof MapObject || throw AttestationStatementVerificationException::create('The attested credential data does not contain a valid public key.'); $coseKey = $coseKey->normalize(); $ec2Key = new Ec2Key($coseKey + [Ec2Key::TYPE => 2, Ec2Key::DATA_CURVE => Ec2Key::CURVE_P256]); return "\x04" . $ec2Key->x() . $ec2Key->y(); } private function checkCertificate(string $publicKey) : void { try { $resource = openssl_pkey_get_public($publicKey); $details = \openssl_pkey_get_details($resource); } catch (Throwable $throwable) { throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain', $throwable); } is_array($details) || throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain'); array_key_exists('ec', $details) || throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain'); array_key_exists('curve_name', $details['ec']) || throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain'); $details['ec']['curve_name'] === 'prime256v1' || throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain'); array_key_exists('curve_oid', $details['ec']) || throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain'); $details['ec']['curve_oid'] === '1.2.840.10045.3.1.7' || throw AttestationStatementVerificationException::create('Invalid certificate or certificate chain'); } } decoder = Decoder::create(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create() : self { return new self(); } public function name() : string { return 'apple'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { array_key_exists('attStmt', $attestation) || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); array_key_exists('x5c', $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "x5c" is missing.'); $certificates = $attestation['attStmt']['x5c']; (\is_countable($certificates) ? count($certificates) : 0) > 0 || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "x5c" must be a list with at least one certificate.'); $certificates = CertificateToolbox::convertAllDERToPEM($certificates); $attestationStatement = AttestationStatement::createAnonymizationCA($attestation['fmt'], $attestation['attStmt'], CertificateTrustPath::create($certificates)); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $trustPath = $attestationStatement->trustPath; $trustPath instanceof CertificateTrustPath || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid trust path'); $certificates = $trustPath->certificates; //Decode leaf attestation certificate $leaf = $certificates[0]; $this->checkCertificateAndGetPublicKey($leaf, $clientDataJSONHash, $authenticatorData); return \true; } private function checkCertificateAndGetPublicKey(string $certificate, string $clientDataHash, AuthenticatorData $authenticatorData) : void { $resource = openssl_pkey_get_public($certificate); $details = \openssl_pkey_get_details($resource); is_array($details) || throw AttestationStatementVerificationException::create('Unable to read the certificate'); //Check that authData publicKey matches the public key in the attestation certificate $attestedCredentialData = $authenticatorData->attestedCredentialData; $attestedCredentialData !== null || throw AttestationStatementVerificationException::create('No attested credential data found'); $publicKeyData = $attestedCredentialData->credentialPublicKey; $publicKeyData !== null || throw AttestationStatementVerificationException::create('No attested public key found'); $publicDataStream = new StringStream($publicKeyData); $coseKey = $this->decoder->decode($publicDataStream); $coseKey instanceof Normalizable || throw AttestationStatementVerificationException::create('Invalid attested public key found'); $publicDataStream->isEOF() || throw AttestationStatementVerificationException::create('Invalid public key data. Presence of extra bytes.'); $publicDataStream->close(); $publicKey = Key::createFromData($coseKey->normalize()); $publicKey instanceof Ec2Key || $publicKey instanceof RsaKey || throw AttestationStatementVerificationException::create('Unsupported key type'); //We check the attested key corresponds to the key in the certificate $publicKey->asPEM() === $details['key'] || throw AttestationStatementVerificationException::create('Invalid key'); /*---------------------------*/ $certDetails = \openssl_x509_parse($certificate); //Find Apple Extension with OID "1.2.840.113635.100.8.2" in certificate extensions is_array($certDetails) || throw AttestationStatementVerificationException::create('The certificate is not valid'); array_key_exists('extensions', $certDetails) || throw AttestationStatementVerificationException::create('The certificate has no extension'); is_array($certDetails['extensions']) || throw AttestationStatementVerificationException::create('The certificate has no extension'); array_key_exists('1.2.840.113635.100.8.2', $certDetails['extensions']) || throw AttestationStatementVerificationException::create('The certificate extension "1.2.840.113635.100.8.2" is missing'); $extension = $certDetails['extensions']['1.2.840.113635.100.8.2']; $nonceToHash = $authenticatorData->authData . $clientDataHash; $nonce = \hash('sha256', $nonceToHash); //'3024a1220420' corresponds to the Sequence+Explicitly Tagged Object + Octet Object '3024a1220420' . $nonce === \bin2hex((string) $extension) || throw AttestationStatementVerificationException::create('The client data hash is not valid'); } } dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create() : self { return new self(); } public function name() : string { return 'none'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { $format = $attestation['fmt'] ?? null; $attestationStatement = $attestation['attStmt'] ?? []; is_string($format) && $format !== '' || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); is_array($attestationStatement) && $attestationStatement === [] || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); $attestationStatement = AttestationStatement::createNone($format, $attestationStatement, EmptyTrustPath::create()); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { return count($attestationStatement->attStmt) === 0; } } $attestation */ public function load(array $attestation) : AttestationStatement; public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool; } logger = new NullLogger(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create(AttestationStatementSupportManager $attestationStatementSupportManager) : self { return new self($attestationStatementSupportManager); } public function load(string $data) : AttestationObject { try { $this->logger->info('Trying to load the data', ['data' => $data]); $decodedData = Base64::decode($data); $stream = new StringStream($decodedData); $parsed = Decoder::create()->decode($stream); $this->logger->info('Loading the Attestation Statement'); $parsed instanceof Normalizable || throw InvalidDataException::create($parsed, 'Invalid attestation object. Unexpected object.'); $attestationObject = $parsed->normalize(); $stream->isEOF() || throw InvalidDataException::create(null, 'Invalid attestation object. Presence of extra bytes.'); $stream->close(); is_array($attestationObject) || throw InvalidDataException::create($attestationObject, 'Invalid attestation object'); array_key_exists('authData', $attestationObject) || throw InvalidDataException::create($attestationObject, 'Invalid attestation object'); array_key_exists('fmt', $attestationObject) || throw InvalidDataException::create($attestationObject, 'Invalid attestation object'); array_key_exists('attStmt', $attestationObject) || throw InvalidDataException::create($attestationObject, 'Invalid attestation object'); $attestationStatementSupport = $this->attestationStatementSupportManager->get($attestationObject['fmt']); $attestationStatement = $attestationStatementSupport->load($attestationObject); $this->logger->info('Attestation Statement loaded'); $this->logger->debug('Attestation Statement loaded', ['attestationStatement' => $attestationStatement]); $authData = $attestationObject['authData']; $authDataLoader = AuthenticatorDataLoader::create(); $authenticatorData = $authDataLoader->load($authData); $attestationObject = AttestationObject::create($data, $attestationStatement, $authenticatorData); $this->logger->info('Attestation Object loaded'); $this->logger->debug('Attestation Object', ['ed' => $attestationObject]); $this->dispatcher->dispatch(AttestationObjectLoaded::create($attestationObject)); return $attestationObject; } catch (Throwable $throwable) { $this->logger->error('An error occurred', ['exception' => $throwable]); throw $throwable; } } public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } } decoder = Decoder::create(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create(Manager $algorithmManager) : self { return new self($algorithmManager); } public function name() : string { return 'packed'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { array_key_exists('sig', $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "sig" is missing.'); array_key_exists('alg', $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "alg" is missing.'); is_string($attestation['attStmt']['sig']) || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "sig" is missing.'); return match (\true) { array_key_exists('x5c', $attestation['attStmt']) => $this->loadBasicType($attestation), array_key_exists('ecdaaKeyId', $attestation['attStmt']) => $this->loadEcdaaType($attestation['attStmt']), default => $this->loadEmptyType($attestation), }; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $trustPath = $attestationStatement->trustPath; return match (\true) { $trustPath instanceof CertificateTrustPath => $this->processWithCertificate($clientDataJSONHash, $attestationStatement, $authenticatorData, $trustPath), $trustPath instanceof EcdaaKeyIdTrustPath => $this->processWithECDAA(), $trustPath instanceof EmptyTrustPath => $this->processWithSelfAttestation($clientDataJSONHash, $attestationStatement, $authenticatorData), default => throw InvalidAttestationStatementException::create($attestationStatement, 'Unsupported attestation statement'), }; } /** * @param mixed[] $attestation */ private function loadBasicType(array $attestation) : AttestationStatement { $certificates = $attestation['attStmt']['x5c']; is_array($certificates) || throw AttestationStatementVerificationException::create('The attestation statement value "x5c" must be a list with at least one certificate.'); count($certificates) > 0 || throw AttestationStatementVerificationException::create('The attestation statement value "x5c" must be a list with at least one certificate.'); $certificates = CertificateToolbox::convertAllDERToPEM($certificates); $attestationStatement = AttestationStatement::createBasic($attestation['fmt'], $attestation['attStmt'], CertificateTrustPath::create($certificates)); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } /** * @param array $attestation */ private function loadEcdaaType(array $attestation) : AttestationStatement { $ecdaaKeyId = $attestation['attStmt']['ecdaaKeyId']; is_string($ecdaaKeyId) || throw AttestationStatementVerificationException::create('The attestation statement value "ecdaaKeyId" is invalid.'); $attestationStatement = AttestationStatement::createEcdaa($attestation['fmt'], $attestation['attStmt'], new EcdaaKeyIdTrustPath($attestation['ecdaaKeyId'])); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } /** * @param mixed[] $attestation */ private function loadEmptyType(array $attestation) : AttestationStatement { $attestationStatement = AttestationStatement::createSelf($attestation['fmt'], $attestation['attStmt'], EmptyTrustPath::create()); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } private function checkCertificate(string $attestnCert, AuthenticatorData $authenticatorData) : void { $parsed = \openssl_x509_parse($attestnCert); is_array($parsed) || throw AttestationStatementVerificationException::create('Invalid certificate'); //Check version isset($parsed['version']) || throw AttestationStatementVerificationException::create('Invalid certificate version'); $parsed['version'] === 2 || throw AttestationStatementVerificationException::create('Invalid certificate version'); //Check subject field isset($parsed['name']) || throw AttestationStatementVerificationException::create('Invalid certificate name. The Subject Organization Unit must be "Authenticator Attestation"'); \str_contains((string) $parsed['name'], '/OU=Authenticator Attestation') || throw AttestationStatementVerificationException::create('Invalid certificate name. The Subject Organization Unit must be "Authenticator Attestation"'); //Check extensions isset($parsed['extensions']) || throw AttestationStatementVerificationException::create('Certificate extensions are missing'); is_array($parsed['extensions']) || throw AttestationStatementVerificationException::create('Certificate extensions are missing'); //Check certificate is not a CA cert isset($parsed['extensions']['basicConstraints']) || throw AttestationStatementVerificationException::create('The Basic Constraints extension must have the CA component set to false'); $parsed['extensions']['basicConstraints'] === 'CA:FALSE' || throw AttestationStatementVerificationException::create('The Basic Constraints extension must have the CA component set to false'); $attestedCredentialData = $authenticatorData->attestedCredentialData; $attestedCredentialData !== null || throw AttestationStatementVerificationException::create('No attested credential available'); // id-fido-gen-ce-aaguid OID check if (in_array('1.3.6.1.4.1.45724.1.1.4', $parsed['extensions'], \true)) { \hash_equals($attestedCredentialData->aaguid->toBinary(), $parsed['extensions']['1.3.6.1.4.1.45724.1.1.4']) || throw AttestationStatementVerificationException::create('The value of the "aaguid" does not match with the certificate'); } } private function processWithCertificate(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData, CertificateTrustPath $trustPath) : bool { $certificates = $trustPath->certificates; // Check leaf certificate $this->checkCertificate($certificates[0], $authenticatorData); // Get the COSE algorithm identifier and the corresponding OpenSSL one $coseAlgorithmIdentifier = (int) $attestationStatement->get('alg'); $opensslAlgorithmIdentifier = Algorithms::getOpensslAlgorithmFor($coseAlgorithmIdentifier); // Verification of the signature $signedData = $authenticatorData->authData . $clientDataJSONHash; $result = openssl_verify($signedData, $attestationStatement->get('sig'), $certificates[0], $opensslAlgorithmIdentifier); return $result === 1; } private function processWithECDAA() : never { throw UnsupportedFeatureException::create('ECDAA not supported'); } private function processWithSelfAttestation(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $attestedCredentialData = $authenticatorData->attestedCredentialData; $attestedCredentialData !== null || throw AttestationStatementVerificationException::create('No attested credential available'); $credentialPublicKey = $attestedCredentialData->credentialPublicKey; $credentialPublicKey !== null || throw AttestationStatementVerificationException::create('No credential public key available'); $publicKeyStream = new StringStream($credentialPublicKey); $publicKey = $this->decoder->decode($publicKeyStream); $publicKeyStream->isEOF() || throw AttestationStatementVerificationException::create('Invalid public key. Presence of extra bytes.'); $publicKeyStream->close(); $publicKey instanceof MapObject || throw AttestationStatementVerificationException::create('The attested credential data does not contain a valid public key.'); $publicKey = $publicKey->normalize(); $publicKey = new Key($publicKey); $publicKey->alg() === (int) $attestationStatement->get('alg') || throw AttestationStatementVerificationException::create('The algorithm of the attestation statement and the key are not identical.'); $dataToVerify = $authenticatorData->authData . $clientDataJSONHash; $algorithm = $this->algorithmManager->get((int) $attestationStatement->get('alg')); if (!$algorithm instanceof Signature) { throw InvalidDataException::create($algorithm, 'Invalid algorithm'); } $signature = CoseSignatureFixer::fix($attestationStatement->get('sig'), $algorithm); return $algorithm->verify($dataToVerify, $publicKey, $signature); } } rawAttestationObject; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttStmt() : AttestationStatement { return $this->attStmt; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setAttStmt(AttestationStatement $attStmt) : void { $this->attStmt = $attStmt; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAuthData() : AuthenticatorData { return $this->authData; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMetadataStatement() : ?MetadataStatement { return $this->metadataStatement; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setMetadataStatement(MetadataStatement $metadataStatement) : self { $this->metadataStatement = $metadataStatement; return $this; } } decoder = Decoder::create(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create() : self { return new self(); } public function name() : string { return 'android-key'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { array_key_exists('attStmt', $attestation) || throw AttestationStatementLoadingException::create($attestation); foreach (['sig', 'x5c', 'alg'] as $key) { array_key_exists($key, $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, sprintf('The attestation statement value "%s" is missing.', $key)); } $certificates = $attestation['attStmt']['x5c']; (\is_countable($certificates) ? count($certificates) : 0) > 0 || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "x5c" must be a list with at least one certificate.'); $certificates = CertificateToolbox::convertAllDERToPEM($certificates); $attestationStatement = AttestationStatement::createBasic($attestation['fmt'], $attestation['attStmt'], CertificateTrustPath::create($certificates)); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $trustPath = $attestationStatement->trustPath; $trustPath instanceof CertificateTrustPath || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid trust path. Shall contain certificates.'); $certificates = $trustPath->certificates; //Decode leaf attestation certificate $leaf = $certificates[0]; $this->checkCertificate($leaf, $clientDataJSONHash, $authenticatorData); $signedData = $authenticatorData->authData . $clientDataJSONHash; $alg = $attestationStatement->get('alg'); return openssl_verify($signedData, $attestationStatement->get('sig'), $leaf, Algorithms::getOpensslAlgorithmFor((int) $alg)) === 1; } private function checkCertificate(string $certificate, string $clientDataHash, AuthenticatorData $authenticatorData) : void { $resource = openssl_pkey_get_public($certificate); $details = \openssl_pkey_get_details($resource); is_array($details) || throw AttestationStatementVerificationException::create('Unable to read the certificate'); //Check that authData publicKey matches the public key in the attestation certificate $attestedCredentialData = $authenticatorData->attestedCredentialData; $attestedCredentialData !== null || throw AttestationStatementVerificationException::create('No attested credential data found'); $publicKeyData = $attestedCredentialData->credentialPublicKey; $publicKeyData !== null || throw AttestationStatementVerificationException::create('No attested public key found'); $publicDataStream = new StringStream($publicKeyData); $coseKey = $this->decoder->decode($publicDataStream); $coseKey instanceof Normalizable || throw AttestationStatementVerificationException::create('Invalid attested public key found'); $publicDataStream->isEOF() || throw AttestationStatementVerificationException::create('Invalid public key data. Presence of extra bytes.'); $publicDataStream->close(); $publicKey = Key::createFromData($coseKey->normalize()); $publicKey instanceof Ec2Key || $publicKey instanceof RsaKey || throw AttestationStatementVerificationException::create('Unsupported key type'); $publicKey->asPEM() === $details['key'] || throw AttestationStatementVerificationException::create('Invalid key'); /*---------------------------*/ $certDetails = \openssl_x509_parse($certificate); //Find Android KeyStore Extension with OID "1.3.6.1.4.1.11129.2.1.17" in certificate extensions is_array($certDetails) || throw AttestationStatementVerificationException::create('The certificate is not valid'); array_key_exists('extensions', $certDetails) || throw AttestationStatementVerificationException::create('The certificate has no extension'); is_array($certDetails['extensions']) || throw AttestationStatementVerificationException::create('The certificate has no extension'); array_key_exists('1.3.6.1.4.1.11129.2.1.17', $certDetails['extensions']) || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is missing'); $extension = $certDetails['extensions']['1.3.6.1.4.1.11129.2.1.17']; $extensionAsAsn1 = Sequence::fromDER($extension); $extensionAsAsn1->has(4); //Check that attestationChallenge is set to the clientDataHash. $extensionAsAsn1->has(4) || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $ext = $extensionAsAsn1->at(4)->asElement(); $ext instanceof OctetString || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $clientDataHash === $ext->string() || throw AttestationStatementVerificationException::create('The client data hash is not valid'); //Check that both teeEnforced and softwareEnforced structures don't contain allApplications(600) tag. $extensionAsAsn1->has(6) || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $softwareEnforcedFlags = $extensionAsAsn1->at(6)->asElement(); $softwareEnforcedFlags instanceof Sequence || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $this->checkAbsenceOfAllApplicationsTag($softwareEnforcedFlags); $extensionAsAsn1->has(7) || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $teeEnforcedFlags = $extensionAsAsn1->at(7)->asElement(); $teeEnforcedFlags instanceof Sequence || throw AttestationStatementVerificationException::create('The certificate extension "1.3.6.1.4.1.11129.2.1.17" is invalid'); $this->checkAbsenceOfAllApplicationsTag($teeEnforcedFlags); } private function checkAbsenceOfAllApplicationsTag(Sequence $sequence) : void { foreach ($sequence->elements() as $tag) { $tag->asElement() instanceof ExplicitTagging || throw AttestationStatementVerificationException::create('Invalid tag'); $tag->asElement()->tag() !== 600 || throw AttestationStatementVerificationException::create('Forbidden tag 600 found'); } } } add(new NoneAttestationStatementSupport()); foreach ($attestationStatementSupports as $attestationStatementSupport) { $this->add($attestationStatementSupport); } } /** * @param AttestationStatementSupport[] $attestationStatementSupports */ public static function create(array $attestationStatementSupports = []) : self { return new self($attestationStatementSupports); } public function add(AttestationStatementSupport $attestationStatementSupport) : void { $this->attestationStatementSupports[$attestationStatementSupport->name()] = $attestationStatementSupport; } public function has(string $name) : bool { return array_key_exists($name, $this->attestationStatementSupports); } public function get(string $name) : AttestationStatementSupport { $this->has($name) || throw InvalidDataException::create($name, sprintf('The attestation statement format "%s" is not supported.', $name)); return $this->attestationStatementSupports[$name]; } } clock = $clock; $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create(null|Clock|ClockInterface $clock = null) : self { return new self($clock); } public function name() : string { return 'tpm'; } /** * @param array $attestation */ public function load(array $attestation) : AttestationStatement { array_key_exists('attStmt', $attestation) || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); !array_key_exists('ecdaaKeyId', $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, 'ECDAA not supported'); foreach (['ver', 'ver', 'sig', 'alg', 'certInfo', 'pubArea'] as $key) { array_key_exists($key, $attestation['attStmt']) || throw AttestationStatementLoadingException::create($attestation, sprintf('The attestation statement value "%s" is missing.', $key)); } $attestation['attStmt']['ver'] === '2.0' || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); $certInfo = $this->checkCertInfo($attestation['attStmt']['certInfo']); \bin2hex((string) $certInfo['type']) === '8017' || throw AttestationStatementLoadingException::create($attestation, 'Invalid attestation object'); $pubArea = $this->checkPubArea($attestation['attStmt']['pubArea']); $pubAreaAttestedNameAlg = \mb_substr((string) $certInfo['attestedName'], 0, 2, '8bit'); $pubAreaHash = \hash($this->getTPMHash($pubAreaAttestedNameAlg), (string) $attestation['attStmt']['pubArea'], \true); $attestedName = $pubAreaAttestedNameAlg . $pubAreaHash; $attestedName === $certInfo['attestedName'] || throw AttestationStatementLoadingException::create($attestation, 'Invalid attested name'); $attestation['attStmt']['parsedCertInfo'] = $certInfo; $attestation['attStmt']['parsedPubArea'] = $pubArea; $certificates = CertificateToolbox::convertAllDERToPEM($attestation['attStmt']['x5c']); count($certificates) > 0 || throw AttestationStatementLoadingException::create($attestation, 'The attestation statement value "x5c" must be a list with at least one certificate.'); $attestationStatement = AttestationStatement::createAttCA($this->name(), $attestation['attStmt'], CertificateTrustPath::create($certificates)); $this->dispatcher->dispatch(AttestationStatementLoaded::create($attestationStatement)); return $attestationStatement; } public function isValid(string $clientDataJSONHash, AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $attToBeSigned = $authenticatorData->authData . $clientDataJSONHash; $attToBeSignedHash = \hash(Algorithms::getHashAlgorithmFor((int) $attestationStatement->get('alg')), $attToBeSigned, \true); $attestationStatement->get('parsedCertInfo')['extraData'] === $attToBeSignedHash || throw InvalidAttestationStatementException::create($attestationStatement, 'Invalid attestation hash'); $credentialPublicKey = $authenticatorData->attestedCredentialData?->credentialPublicKey; $credentialPublicKey !== null || throw InvalidAttestationStatementException::create($attestationStatement, 'Not credential public key available in the attested credential data'); $this->checkUniquePublicKey($attestationStatement->get('parsedPubArea')['unique'], $credentialPublicKey); return match (\true) { $attestationStatement->trustPath instanceof CertificateTrustPath => $this->processWithCertificate($attestationStatement, $authenticatorData), $attestationStatement->trustPath instanceof EcdaaKeyIdTrustPath => $this->processWithECDAA(), default => throw InvalidAttestationStatementException::create($attestationStatement, 'Unsupported attestation statement'), }; } private function checkUniquePublicKey(string $unique, string $cborPublicKey) : void { $cborDecoder = Decoder::create(); $publicKey = $cborDecoder->decode(new StringStream($cborPublicKey)); $publicKey instanceof MapObject || throw AttestationStatementVerificationException::create('Invalid public key'); $key = Key::create($publicKey->normalize()); switch ($key->type()) { case Key::TYPE_OKP: $uniqueFromKey = (new OkpKey($key->getData()))->x(); break; case Key::TYPE_EC2: $ec2Key = new Ec2Key($key->getData()); $uniqueFromKey = "\x04" . $ec2Key->x() . $ec2Key->y(); break; case Key::TYPE_RSA: $uniqueFromKey = (new RsaKey($key->getData()))->n(); break; default: throw AttestationStatementVerificationException::create('Invalid or unsupported key type.'); } $unique === $uniqueFromKey || throw AttestationStatementVerificationException::create('Invalid pubArea.unique value'); } /** * @return mixed[] */ private function checkCertInfo(string $data) : array { $certInfo = new StringStream($data); $magic = $certInfo->read(4); \bin2hex($magic) === 'ff544347' || throw AttestationStatementVerificationException::create('Invalid attestation object'); $type = $certInfo->read(2); $qualifiedSignerLength = unpack('n', $certInfo->read(2))[1]; $qualifiedSigner = $certInfo->read($qualifiedSignerLength); //Ignored $extraDataLength = unpack('n', $certInfo->read(2))[1]; $extraData = $certInfo->read($extraDataLength); $clockInfo = $certInfo->read(17); //Ignore $firmwareVersion = $certInfo->read(8); $attestedNameLength = unpack('n', $certInfo->read(2))[1]; $attestedName = $certInfo->read($attestedNameLength); $attestedQualifiedNameLength = unpack('n', $certInfo->read(2))[1]; $attestedQualifiedName = $certInfo->read($attestedQualifiedNameLength); //Ignore $certInfo->isEOF() || throw AttestationStatementVerificationException::create('Invalid certificate information. Presence of extra bytes.'); $certInfo->close(); return ['magic' => $magic, 'type' => $type, 'qualifiedSigner' => $qualifiedSigner, 'extraData' => $extraData, 'clockInfo' => $clockInfo, 'firmwareVersion' => $firmwareVersion, 'attestedName' => $attestedName, 'attestedQualifiedName' => $attestedQualifiedName]; } /** * @return mixed[] */ private function checkPubArea(string $data) : array { $pubArea = new StringStream($data); $type = $pubArea->read(2); $nameAlg = $pubArea->read(2); $objectAttributes = $pubArea->read(4); $authPolicyLength = unpack('n', $pubArea->read(2))[1]; $authPolicy = $pubArea->read($authPolicyLength); $parameters = $this->getParameters($type, $pubArea); $unique = $this->getUnique($type, $pubArea); $pubArea->isEOF() || throw AttestationStatementVerificationException::create('Invalid public area. Presence of extra bytes.'); $pubArea->close(); return ['type' => $type, 'nameAlg' => $nameAlg, 'objectAttributes' => $objectAttributes, 'authPolicy' => $authPolicy, 'parameters' => $parameters, 'unique' => $unique]; } /** * @return mixed[] */ private function getParameters(string $type, StringStream $stream) : array { return match (\bin2hex($type)) { '0001' => ['symmetric' => $stream->read(2), 'scheme' => $stream->read(2), 'keyBits' => unpack('n', $stream->read(2))[1], 'exponent' => $this->getExponent($stream->read(4))], '0023' => ['symmetric' => $stream->read(2), 'scheme' => $stream->read(2), 'curveId' => $stream->read(2), 'kdf' => $stream->read(2)], default => throw AttestationStatementVerificationException::create('Unsupported type'), }; } private function getUnique(string $type, StringStream $stream) : string { switch (\bin2hex($type)) { case '0001': $uniqueLength = unpack('n', $stream->read(2))[1]; return $stream->read($uniqueLength); case '0023': $xLen = unpack('n', $stream->read(2))[1]; $x = $stream->read($xLen); $yLen = unpack('n', $stream->read(2))[1]; $y = $stream->read($yLen); return "\x04" . $x . $y; default: throw AttestationStatementVerificationException::create('Unsupported type'); } } private function getExponent(string $exponent) : string { return \bin2hex($exponent) === '00000000' ? Base64UrlSafe::decodeNoPadding('AQAB') : $exponent; } private function getTPMHash(string $nameAlg) : string { return match (\bin2hex($nameAlg)) { '0004' => 'sha1', '000b' => 'sha256', '000c' => 'sha384', '000d' => 'sha512', default => throw AttestationStatementVerificationException::create('Unsupported hash algorithm'), }; } private function processWithCertificate(AttestationStatement $attestationStatement, AuthenticatorData $authenticatorData) : bool { $trustPath = $attestationStatement->trustPath; $trustPath instanceof CertificateTrustPath || throw AttestationStatementVerificationException::create('Invalid trust path'); $certificates = $trustPath->certificates; // Check certificate CA chain and returns the Attestation Certificate $this->checkCertificate($certificates[0], $authenticatorData); // Get the COSE algorithm identifier and the corresponding OpenSSL one $coseAlgorithmIdentifier = (int) $attestationStatement->get('alg'); $opensslAlgorithmIdentifier = Algorithms::getOpensslAlgorithmFor($coseAlgorithmIdentifier); $result = openssl_verify($attestationStatement->get('certInfo'), $attestationStatement->get('sig'), $certificates[0], $opensslAlgorithmIdentifier); return $result === 1; } private function checkCertificate(string $attestnCert, AuthenticatorData $authenticatorData) : void { $parsed = \openssl_x509_parse($attestnCert); is_array($parsed) || throw AttestationStatementVerificationException::create('Invalid certificate'); //Check version isset($parsed['version']) && $parsed['version'] === 2 || throw AttestationStatementVerificationException::create('Invalid certificate version'); //Check subject field is empty isset($parsed['subject']) || throw AttestationStatementVerificationException::create('Invalid certificate name. The Subject should be empty'); is_array($parsed['subject']) || throw AttestationStatementVerificationException::create('Invalid certificate name. The Subject should be empty'); count($parsed['subject']) === 0 || throw AttestationStatementVerificationException::create('Invalid certificate name. The Subject should be empty'); // Check period of validity array_key_exists('validFrom_time_t', $parsed) || throw AttestationStatementVerificationException::create('Invalid certificate start date.'); is_int($parsed['validFrom_time_t']) || throw AttestationStatementVerificationException::create('Invalid certificate start date.'); $startDate = (new DateTimeImmutable())->setTimestamp($parsed['validFrom_time_t']); $startDate < $this->clock->now() || throw AttestationStatementVerificationException::create('Invalid certificate start date.'); array_key_exists('validTo_time_t', $parsed) || throw AttestationStatementVerificationException::create('Invalid certificate end date.'); is_int($parsed['validTo_time_t']) || throw AttestationStatementVerificationException::create('Invalid certificate end date.'); $endDate = (new DateTimeImmutable())->setTimestamp($parsed['validTo_time_t']); $endDate > $this->clock->now() || throw AttestationStatementVerificationException::create('Invalid certificate end date.'); //Check extensions isset($parsed['extensions']) && is_array($parsed['extensions']) || throw AttestationStatementVerificationException::create('Certificate extensions are missing'); //Check subjectAltName isset($parsed['extensions']['subjectAltName']) || throw AttestationStatementVerificationException::create('The "subjectAltName" is missing'); //Check extendedKeyUsage isset($parsed['extensions']['extendedKeyUsage']) || throw AttestationStatementVerificationException::create('The "subjectAltName" is missing'); $parsed['extensions']['extendedKeyUsage'] === '2.23.133.8.3' || throw AttestationStatementVerificationException::create('The "extendedKeyUsage" is invalid'); // id-fido-gen-ce-aaguid OID check in_array('1.3.6.1.4.1.45724.1.1.4', $parsed['extensions'], \true) && !\hash_equals($authenticatorData->attestedCredentialData?->aaguid->toBinary() ?? '', $parsed['extensions']['1.3.6.1.4.1.45724.1.1.4']) && throw AttestationStatementVerificationException::create('The value of the "aaguid" does not match with the certificate'); } private function processWithECDAA() : never { throw UnsupportedFeatureException::create('ECDAA not supported'); } } $attStmt */ public function __construct(public readonly string $fmt, public readonly array $attStmt, public readonly string $type, public readonly TrustPath $trustPath) { } public static function create(string $fmt, array $attStmt, string $type, TrustPath $trustPath) : self { return new self($fmt, $attStmt, $type, $trustPath); } /** * @param array $attStmt */ public static function createNone(string $fmt, array $attStmt, TrustPath $trustPath) : self { return self::create($fmt, $attStmt, self::TYPE_NONE, $trustPath); } /** * @param array $attStmt */ public static function createBasic(string $fmt, array $attStmt, TrustPath $trustPath) : self { return self::create($fmt, $attStmt, self::TYPE_BASIC, $trustPath); } /** * @param array $attStmt */ public static function createSelf(string $fmt, array $attStmt, TrustPath $trustPath) : self { return self::create($fmt, $attStmt, self::TYPE_SELF, $trustPath); } /** * @param array $attStmt */ public static function createAttCA(string $fmt, array $attStmt, TrustPath $trustPath) : self { return self::create($fmt, $attStmt, self::TYPE_ATTCA, $trustPath); } /** * @param array $attStmt * * @deprecated since 4.2.0 and will be removed in 5.0.0. The ECDAA Trust Anchor does no longer exist in Webauthn specification. * @infection-ignore-all */ public static function createEcdaa(string $fmt, array $attStmt, TrustPath $trustPath) : self { return self::create($fmt, $attStmt, self::TYPE_ECDAA, $trustPath); } /** * @param array $attStmt */ public static function createAnonymizationCA(string $fmt, array $attStmt, TrustPath $trustPath) : self { return self::create($fmt, $attStmt, self::TYPE_ANONCA, $trustPath); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getFmt() : string { return $this->fmt; } /** * @return mixed[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttStmt() : array { return $this->attStmt; } public function has(string $key) : bool { return array_key_exists($key, $this->attStmt); } public function get(string $key) : mixed { $this->has($key) || throw InvalidDataException::create($this->attStmt, sprintf('The attestation statement has no key "%s".', $key)); return $this->attStmt[$key]; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTrustPath() : TrustPath { return $this->trustPath; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getType() : string { return $this->type; } /** * @param mixed[] $data * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { foreach (['fmt', 'attStmt', 'trustPath', 'type'] as $key) { array_key_exists($key, $data) || throw InvalidDataException::create($data, sprintf('The key "%s" is missing', $key)); } return self::create($data['fmt'], $data['attStmt'], $data['type'], TrustPathLoader::loadTrustPath($data['trustPath'])); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return ['fmt' => $this->fmt, 'attStmt' => $this->attStmt, 'trustPath' => $this->trustPath, 'type' => $this->type]; } } attestationObjectLoader === null && $this->serializer === null) { throw new InvalidArgumentException('You must provide an attestation object loader or a serializer'); } $this->logger = new NullLogger(); } public static function create(null|AttestationObjectLoader $attestationObjectLoader, null|SerializerInterface $serializer = null) : self { return new self($attestationObjectLoader, $serializer); } public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } /** * @param mixed[] $json * @infection-ignore-all */ public function loadArray(array $json) : PublicKeyCredential { $this->logger->info('Trying to load data from an array', ['data' => $json]); try { foreach (['id', 'rawId', 'type'] as $key) { array_key_exists($key, $json) || throw InvalidDataException::create($json, sprintf('The parameter "%s" is missing', $key)); is_string($json[$key]) || throw InvalidDataException::create($json, sprintf('The parameter "%s" shall be a string', $key)); } array_key_exists('response', $json) || throw InvalidDataException::create($json, 'The parameter "response" is missing'); is_array($json['response']) || throw InvalidDataException::create($json, 'The parameter "response" shall be an array'); $json['type'] === 'public-key' || throw InvalidDataException::create($json, sprintf('Unsupported type "%s"', $json['type'])); $id = Base64UrlSafe::decodeNoPadding($json['id']); $rawId = Base64::decode($json['rawId']); \hash_equals($id, $rawId) || throw InvalidDataException::create($json, 'Invalid ID'); $publicKeyCredential = PublicKeyCredential::create(null, $json['type'], $rawId, $this->createResponse($json['response'])); $this->logger->info('The data has been loaded'); $this->logger->debug('Public Key Credential', ['publicKeyCredential' => $publicKeyCredential]); return $publicKeyCredential; } catch (Throwable $throwable) { $this->logger->error('An error occurred', ['exception' => $throwable]); throw $throwable; } } public function load(string $data) : PublicKeyCredential { $this->logger->info('Trying to load data from a string', ['data' => $data]); try { if ($this->serializer !== null) { return $this->serializer->deserialize($data, PublicKeyCredential::class, 'json'); } $json = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return $this->loadArray($json); } catch (Throwable $throwable) { $this->logger->error('An error occurred', ['exception' => $throwable]); throw InvalidDataException::create($data, 'Unable to load the data', $throwable); } } /** * @param mixed[] $response */ private function createResponse(array $response) : AuthenticatorResponse { array_key_exists('clientDataJSON', $response) || throw InvalidDataException::create($response, 'Invalid data. The parameter "clientDataJSON" is missing'); is_string($response['clientDataJSON']) || throw InvalidDataException::create($response, 'Invalid data. The parameter "clientDataJSON" is invalid'); $userHandle = $response['userHandle'] ?? null; $userHandle === null || is_string($userHandle) || throw InvalidDataException::create($response, 'Invalid data. The parameter "userHandle" is invalid'); /** @var string[] $transports */ $transports = $response['transports'] ?? []; is_array($transports) || throw InvalidDataException::create($response, 'Invalid data. The parameter "transports" is invalid'); if ($this->serializer !== null) { return $this->serializer->deserialize($response, AuthenticatorResponse::class, 'json'); } switch (\true) { case array_key_exists('attestationObject', $response): $attestationObject = $this->attestationObjectLoader->load($response['attestationObject']); return AuthenticatorAttestationResponse::create(CollectedClientData::createFormJson($response['clientDataJSON']), $attestationObject, $transports); case array_key_exists('signature', $response): $authDataLoader = AuthenticatorDataLoader::create(); $authData = Base64UrlSafe::decodeNoPadding($response['authenticatorData'] ?? ''); $authenticatorData = $authDataLoader->load($authData); try { $signature = Base64::decode($response['signature']); } catch (Throwable $e) { throw InvalidDataException::create($response['signature'], 'The signature shall be Base64 Url Safe encoded', $e); } $userHandle = $response['userHandle'] ?? null; if ($userHandle !== '' && $userHandle !== null) { $userHandle = Base64::decode($userHandle); } return AuthenticatorAssertionResponse::create(CollectedClientData::createFormJson($response['clientDataJSON']), $authenticatorData, $signature, $userHandle); default: throw InvalidDataException::create($response, 'Unable to create the response object'); } } } cache === null) { return $this->generateCredentials($username); } $cacheKey = 'fake_credentials_' . \hash('xxh128', $username); $cacheItem = $this->cache->getItem($cacheKey); if ($cacheItem->isHit()) { return $cacheItem->get(); } $credentials = $this->generateCredentials($username); $cacheItem->set($credentials); $this->cache->save($cacheItem); return $credentials; } /** * @return PublicKeyCredentialDescriptor[] */ private function generateCredentials(string $username) : array { $transports = [PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_USB, PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_NFC, PublicKeyCredentialDescriptor::AUTHENTICATOR_TRANSPORT_BLE]; $credentials = []; for ($i = 0; $i < \random_int(1, 3); $i++) { $randomTransportKeys = \array_rand($transports, \random_int(1, count($transports))); if (is_int($randomTransportKeys)) { $randomTransportKeys = [$randomTransportKeys]; } $randomTransports = \array_values(\array_intersect_key($transports, \array_flip($randomTransportKeys))); $credentials[] = PublicKeyCredentialDescriptor::create(PublicKeyCredentialDescriptor::CREDENTIAL_TYPE_PUBLIC_KEY, \hash('sha256', \random_bytes(16) . $username), $randomTransports); } return $credentials; } } status = $status; $this->id = $id; } /** * @param mixed[] $json */ public static function createFormArray(array $json) : self { array_key_exists('status', $json) || throw InvalidDataException::create($json, 'The member "status" is required'); $status = $json['status']; in_array($status, self::getSupportedStatus(), \true) || throw InvalidDataException::create($json, sprintf('The member "status" is invalid. Supported values are: %s', \implode(', ', self::getSupportedStatus()))); $id = array_key_exists('id', $json) ? Base64UrlSafe::decodeNoPadding($json['id']) : null; return new self($status, $id); } public function getStatus() : string { return $this->status; } public function getId() : ?string { return $this->id; } /** * @return string[] */ private static function getSupportedStatus() : array { return [self::TOKEN_BINDING_STATUS_PRESENT, self::TOKEN_BINDING_STATUS_SUPPORTED, self::TOKEN_BINDING_STATUS_NOT_SUPPORTED]; } } getStatus() !== TokenBinding::TOKEN_BINDING_STATUS_PRESENT) { return; } $request->hasHeader('Sec-Token-Binding') || throw InvalidDataException::create($tokenBinding, 'The header parameter "Sec-Token-Binding" is missing.'); $tokenBindingIds = $request->getHeader('Sec-Token-Binding'); count($tokenBindingIds) === 1 || throw InvalidDataException::create($tokenBinding, 'The header parameter "Sec-Token-Binding" is invalid.'); $tokenBindingId = \reset($tokenBindingIds); $tokenBindingId === $tokenBinding->getId() || throw InvalidDataException::create($tokenBinding, 'The header parameter "Sec-Token-Binding" is invalid.'); } } getStatus() !== TokenBinding::TOKEN_BINDING_STATUS_PRESENT || throw InvalidDataException::create($tokenBinding, 'Token binding not supported.'); } } aaguid; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setAaguid(Uuid $aaguid) : void { $this->aaguid = $aaguid; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCredentialId() : string { return $this->credentialId; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCredentialPublicKey() : ?string { return $this->credentialPublicKey; } /** * @param mixed[] $json * @deprecated since 4.9.0 and will be removed in 5.0.0. Please use the serializer instead. */ public static function createFromArray(array $json) : self { array_key_exists('aaguid', $json) || throw InvalidDataException::create($json, 'Invalid input. "aaguid" is missing.'); $aaguid = $json['aaguid']; is_string($aaguid) || throw InvalidDataException::create($json, 'Invalid input. "aaguid" shall be a string of 36 characters'); \mb_strlen($aaguid, '8bit') === 36 || throw InvalidDataException::create($json, 'Invalid input. "aaguid" shall be a string of 36 characters'); $uuid = Uuid::fromString($aaguid); array_key_exists('credentialId', $json) || throw InvalidDataException::create($json, 'Invalid input. "credentialId" is missing.'); $credentialId = $json['credentialId']; is_string($credentialId) || throw InvalidDataException::create($json, 'Invalid input. "credentialId" shall be a string'); $credentialId = Base64::decode($credentialId, \true); $credentialPublicKey = null; if (isset($json['credentialPublicKey'])) { $credentialPublicKey = Base64::decode($json['credentialPublicKey'], \true); } return self::create($uuid, $credentialId, $credentialPublicKey); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $result = ['aaguid' => $this->aaguid->__toString(), 'credentialId' => \base64_encode($this->credentialId)]; if ($this->credentialPublicKey !== null) { $result['credentialPublicKey'] = \base64_encode($this->credentialPublicKey); } return $result; } } id = $id; $this->rawId = $rawId ?? Base64UrlSafe::decodeNoPadding($id); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getId() : string { return $this->id; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getType() : string { return $this->type; } } publicKeyCredentialSourceRepository !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.6.0', 'The parameter "$publicKeyCredentialSourceRepository" is deprecated since 4.6.0 and will be removed in 5.0.0. Please set "null" instead.'); } if ($this->tokenBindingHandler !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.3.0', 'The parameter "$tokenBindingHandler" is deprecated since 4.3.0 and will be removed in 5.0.0. Please set "null" instead.'); } if ($extensionOutputCheckerHandler !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$extensionOutputCheckerHandler" is deprecated since 4.8.0 and will be removed in 5.0.0. Please set "null" instead and inject a CheckExtensions object into the CeremonyStepManager.'); } $this->eventDispatcher = $eventDispatcher ?? new NullEventDispatcher(); if ($eventDispatcher !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', 'The parameter "$eventDispatcher" is deprecated since 4.5.0 will be removed in 5.0.0. Please use `setEventDispatcher` instead.'); } if ($this->ceremonyStepManager === null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$ceremonyStepManager" will mandatory in 5.0.0. Please set a CeremonyStepManager object instead and set null for $attestationStatementSupportManager and $extensionOutputCheckerHandler.'); } $this->logger = new NullLogger(); $this->ceremonyStepManagerFactory = new CeremonyStepManagerFactory(); if ($attestationStatementSupportManager !== null) { $this->ceremonyStepManagerFactory->setAttestationStatementSupportManager($attestationStatementSupportManager); \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$attestationStatementSupportManager" is deprecated since 4.8.0 will be removed in 5.0.0. Please set a CheckAttestationFormatIsKnownAndValid object into CeremonyStepManager object instead.'); } if ($extensionOutputCheckerHandler !== null) { $this->ceremonyStepManagerFactory->setExtensionOutputCheckerHandler($extensionOutputCheckerHandler); } } /** * @private Will become private in 5.0.0 */ public static function create(null|AttestationStatementSupportManager $attestationStatementSupportManager = null, null|PublicKeyCredentialSourceRepository $publicKeyCredentialSourceRepository = null, null|TokenBindingHandler $tokenBindingHandler = null, null|ExtensionOutputCheckerHandler $extensionOutputCheckerHandler = null, null|EventDispatcherInterface $eventDispatcher = null, null|CeremonyStepManager $ceremonyStepManager = null) : self { return new self($attestationStatementSupportManager, $publicKeyCredentialSourceRepository, $tokenBindingHandler, $extensionOutputCheckerHandler, $eventDispatcher, $ceremonyStepManager); } public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->eventDispatcher = $eventDispatcher; } /** * @deprecated since 4.8.0 and will be removed in 5.0.0. Please use the CheckMetadataStatement object from the CeremonyStepManager instead. */ public function setCertificateChainValidator(CertificateChainValidator $certificateChainValidator) : self { $this->ceremonyStepManagerFactory->enableCertificateChainValidator($certificateChainValidator); return $this; } /** * @deprecated since 4.8.0 and will be removed in 5.0.0. Please use the CheckMetadataStatement object from the CeremonyStepManager instead. */ public function enableMetadataStatementSupport(MetadataStatementRepository $metadataStatementRepository, StatusReportRepository $statusReportRepository, CertificateChainValidator $certificateChainValidator) : self { $this->ceremonyStepManagerFactory->enableMetadataStatementSupport($metadataStatementRepository, $statusReportRepository, $certificateChainValidator); return $this; } /** * @param string[] $securedRelyingPartyId * * @see https://www.w3.org/TR/webauthn/#registering-a-new-credential */ public function check(AuthenticatorAttestationResponse $authenticatorAttestationResponse, PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions, ServerRequestInterface|string $request, null|array $securedRelyingPartyId = null) : PublicKeyCredentialSource { if ($request instanceof ServerRequestInterface) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', sprintf('Passing a %s to the method `check` of the class "%s" is deprecated since 4.5.0 and will be removed in 5.0.0. Please inject the host as a string instead.', ServerRequestInterface::class, self::class)); } if ($securedRelyingPartyId !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', sprintf('Passing a list or secured relying party IDs to the method `check` of the class "%s" is deprecated since 4.8.0 and will be removed in 5.0.0. Please inject the list instead.', self::class)); } $host = is_string($request) ? $request : $request->getUri()->getHost(); try { $this->logger->info('Checking the authenticator attestation response', ['authenticatorAttestationResponse' => $authenticatorAttestationResponse, 'publicKeyCredentialCreationOptions' => $publicKeyCredentialCreationOptions, 'host' => $host]); if ($this->ceremonyStepManager === null) { $this->ceremonyStepManager = $this->ceremonyStepManagerFactory->creationCeremony($securedRelyingPartyId); } $publicKeyCredentialSource = $this->createPublicKeyCredentialSource($authenticatorAttestationResponse, $publicKeyCredentialCreationOptions); $this->ceremonyStepManager->process($publicKeyCredentialSource, $authenticatorAttestationResponse, $publicKeyCredentialCreationOptions, $publicKeyCredentialCreationOptions->user->id, $host); $publicKeyCredentialSource->counter = $authenticatorAttestationResponse->attestationObject->authData->signCount; $publicKeyCredentialSource->backupEligible = $authenticatorAttestationResponse->attestationObject->authData->isBackupEligible(); $publicKeyCredentialSource->backupStatus = $authenticatorAttestationResponse->attestationObject->authData->isBackedUp(); $publicKeyCredentialSource->uvInitialized = $authenticatorAttestationResponse->attestationObject->authData->isUserVerified(); $this->logger->info('The attestation is valid'); $this->logger->debug('Public Key Credential Source', ['publicKeyCredentialSource' => $publicKeyCredentialSource]); $this->eventDispatcher->dispatch($this->createAuthenticatorAttestationResponseValidationSucceededEvent($authenticatorAttestationResponse, $publicKeyCredentialCreationOptions, $host, $publicKeyCredentialSource)); return $publicKeyCredentialSource; } catch (Throwable $throwable) { $this->logger->error('An error occurred', ['exception' => $throwable]); $this->eventDispatcher->dispatch($this->createAuthenticatorAttestationResponseValidationFailedEvent($authenticatorAttestationResponse, $publicKeyCredentialCreationOptions, $host, $throwable)); throw $throwable; } } protected function createAuthenticatorAttestationResponseValidationSucceededEvent(AuthenticatorAttestationResponse $authenticatorAttestationResponse, PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions, ServerRequestInterface|string $host, PublicKeyCredentialSource $publicKeyCredentialSource) : AuthenticatorAttestationResponseValidationSucceededEvent { if ($host instanceof ServerRequestInterface) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', sprintf('Passing a %s to the method `createAuthenticatorAttestationResponseValidationSucceededEvent` of the class "%s" is deprecated since 4.5.0 and will be removed in 5.0.0. Please inject the host as a string instead.', ServerRequestInterface::class, self::class)); } return new AuthenticatorAttestationResponseValidationSucceededEvent($authenticatorAttestationResponse, $publicKeyCredentialCreationOptions, $host, $publicKeyCredentialSource); } protected function createAuthenticatorAttestationResponseValidationFailedEvent(AuthenticatorAttestationResponse $authenticatorAttestationResponse, PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions, ServerRequestInterface|string $host, Throwable $throwable) : AuthenticatorAttestationResponseValidationFailedEvent { if ($host instanceof ServerRequestInterface) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', sprintf('Passing a %s to the method `createAuthenticatorAttestationResponseValidationFailedEvent` of the class "%s" is deprecated since 4.5.0 and will be removed in 5.0.0. Please inject the host as a string instead.', ServerRequestInterface::class, self::class)); } return new AuthenticatorAttestationResponseValidationFailedEvent($authenticatorAttestationResponse, $publicKeyCredentialCreationOptions, $host, $throwable); } private function createPublicKeyCredentialSource(AuthenticatorAttestationResponse $authenticatorAttestationResponse, PublicKeyCredentialCreationOptions $publicKeyCredentialCreationOptions) : PublicKeyCredentialSource { $attestationObject = $authenticatorAttestationResponse->attestationObject; $attestedCredentialData = $attestationObject->authData->attestedCredentialData; $attestedCredentialData !== null || throw AuthenticatorResponseVerificationException::create('Not attested credential data'); $credentialId = $attestedCredentialData->credentialId; $credentialPublicKey = $attestedCredentialData->credentialPublicKey; $credentialPublicKey !== null || throw AuthenticatorResponseVerificationException::create('Not credential public key available in the attested credential data'); $userHandle = $publicKeyCredentialCreationOptions->user->id; $transports = $authenticatorAttestationResponse->transports; return PublicKeyCredentialSource::create($credentialId, PublicKeyCredentialDescriptor::CREDENTIAL_TYPE_PUBLIC_KEY, $transports, $attestationObject->attStmt->type, $attestationObject->attStmt->trustPath, $attestedCredentialData->aaguid, $credentialPublicKey, $userHandle, $attestationObject->authData->signCount); } } type; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAlg() : int { return $this->alg; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromString(string $data) : self { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @param mixed[] $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : self { array_key_exists('type', $json) || throw InvalidDataException::create($json, 'Invalid input. "type" is missing.'); array_key_exists('alg', $json) || throw InvalidDataException::create($json, 'Invalid input. "alg" is missing.'); return self::create($json['type'], $json['alg']); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return ['type' => $this->type, 'alg' => $this->alg]; } } type; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getId() : string { return $this->id; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTransports() : array { return $this->transports; } /** * @deprecated since 4.9.0 and will be removed in 5.0.0. Please use the serializer instead. */ public static function createFromString(string $data) : self { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @param mixed[] $json * @deprecated since 4.9.0 and will be removed in 5.0.0. Please use the serializer instead. */ public static function createFromArray(array $json) : self { array_key_exists('type', $json) || throw InvalidDataException::create($json, 'Invalid input. "type" is missing.'); array_key_exists('id', $json) || throw InvalidDataException::create($json, 'Invalid input. "id" is missing.'); $id = Base64UrlSafe::decodeNoPadding($json['id']); return self::create($json['type'], $id, $json['transports'] ?? []); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $json = ['type' => $this->type, 'id' => Base64UrlSafe::encodeUnpadded($this->id)]; if (count($this->transports) !== 0) { $json['transports'] = $this->transports; } return $json; } } id; } /** * @param mixed[] $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : self { array_key_exists('name', $json) || throw InvalidDataException::create($json, 'Invalid input. "name" is missing.'); return self::create($json['name'], $json['id'] ?? null, $json['icon'] ?? null); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $json = parent::jsonSerialize(); if ($this->id !== null) { $json['id'] = $this->id; } return $json; } } attestationObject; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all * * @return string[] */ public function getTransports() : array { return $this->transports; } } $extensions * @protected */ public function __construct(public readonly string $challenge, public null|int $timeout = null, null|array|AuthenticationExtensions $extensions = null) { $this->timeout === null || $this->timeout > 0 || throw new InvalidArgumentException('Invalid timeout'); if ($extensions === null) { $this->extensions = AuthenticationExtensionsClientInputs::create(); } elseif ($extensions instanceof AuthenticationExtensions) { $this->extensions = $extensions; } else { $this->extensions = AuthenticationExtensions::create($extensions); } } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setTimeout(?int $timeout) : static { $this->timeout = $timeout; return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function addExtension(AuthenticationExtension $extension) : static { $this->extensions[$extension->name] = $extension; return $this; } /** * @param AuthenticationExtension[] $extensions * @deprecated since 4.7.0. No replacement. Please use the {self::create} instead. * @infection-ignore-all */ public function addExtensions(array $extensions) : static { foreach ($extensions as $extension) { $this->extensions[$extension->name] = $extension; } return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setExtensions(AuthenticationExtensions $extensions) : static { $this->extensions = $extensions; return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getChallenge() : string { return $this->challenge; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTimeout() : ?int { return $this->timeout; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getExtensions() : AuthenticationExtensions { return $this->extensions; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static abstract function createFromString(string $data) : static; /** * @param mixed[] $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static abstract function createFromArray(array $json) : static; } authData; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRpIdHash() : string { return $this->rpIdHash; } public function isUserPresent() : bool { return 0 !== (ord($this->flags) & self::FLAG_UP); } public function isUserVerified() : bool { return 0 !== (ord($this->flags) & self::FLAG_UV); } public function isBackupEligible() : bool { return 0 !== (ord($this->flags) & self::FLAG_BE); } public function isBackedUp() : bool { return 0 !== (ord($this->flags) & self::FLAG_BS); } public function hasAttestedCredentialData() : bool { return 0 !== (ord($this->flags) & self::FLAG_AT); } public function hasExtensions() : bool { return 0 !== (ord($this->flags) & self::FLAG_ED); } public function getReservedForFutureUse1() : int { return ord($this->flags) & self::FLAG_RFU1; } public function getReservedForFutureUse2() : int { return ord($this->flags) & self::FLAG_RFU2; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getSignCount() : int { return $this->signCount; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestedCredentialData() : ?AttestedCredentialData { return $this->attestedCredentialData; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getExtensions() : ?AuthenticationExtensions { return $this->extensions !== null && $this->hasExtensions() ? $this->extensions : null; } } * @deprecated since 4.8.0 and will be removed in 5.0.0. * @infection-ignore-all */ class PublicKeyCredentialDescriptorCollection implements JsonSerializable, Countable, IteratorAggregate { /** * @var array * @readonly */ public array $publicKeyCredentialDescriptors; /** * @private * @param PublicKeyCredentialDescriptor[] $pkCredentialDescriptors */ public function __construct(array $pkCredentialDescriptors = []) { $this->publicKeyCredentialDescriptors = []; foreach ($pkCredentialDescriptors as $pkCredentialDescriptor) { $pkCredentialDescriptor instanceof PublicKeyCredentialDescriptor || throw new InvalidArgumentException('Expected only instances of ' . PublicKeyCredentialDescriptor::class); $this->publicKeyCredentialDescriptors[$pkCredentialDescriptor->id] = $pkCredentialDescriptor; } } /** * @param PublicKeyCredentialDescriptor[] $publicKeyCredentialDescriptors */ public static function create(array $publicKeyCredentialDescriptors) : self { return new self($publicKeyCredentialDescriptors); } /** * @infection-ignore-all */ public function add(PublicKeyCredentialDescriptor ...$publicKeyCredentialDescriptors) : void { foreach ($publicKeyCredentialDescriptors as $publicKeyCredentialDescriptor) { $this->publicKeyCredentialDescriptors[$publicKeyCredentialDescriptor->id] = $publicKeyCredentialDescriptor; } } /** * @infection-ignore-all */ public function has(string $id) : bool { return array_key_exists($id, $this->publicKeyCredentialDescriptors); } /** * @infection-ignore-all */ public function remove(string $id) : void { if (!array_key_exists($id, $this->publicKeyCredentialDescriptors)) { return; } unset($this->publicKeyCredentialDescriptors[$id]); } /** * @return Iterator */ public function getIterator() : Iterator { return new ArrayIterator($this->publicKeyCredentialDescriptors); } public function count(int $mode = COUNT_NORMAL) : int { return count($this->publicKeyCredentialDescriptors, $mode); } /** * @return array[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return $this->publicKeyCredentialDescriptors; } /** * @infection-ignore-all */ public static function createFromString(string $data) : self { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @param mixed[] $json * @infection-ignore-all */ public static function createFromArray(array $json) : self { return self::create(\array_map(static fn(array $item): PublicKeyCredentialDescriptor => PublicKeyCredentialDescriptor::createFromArray($item), $json)); } } clientDataJSON; } } publicKeyCredentialSourceRepository !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.6.0', 'The parameter "$publicKeyCredentialSourceRepository" is deprecated since 4.6.0 and will be removed in 5.0.0. Please set "null" instead.'); } if ($this->tokenBindingHandler !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.3.0', 'The parameter "$tokenBindingHandler" is deprecated since 4.3.0 and will be removed in 5.0.0. Please set "null" instead.'); } if ($extensionOutputCheckerHandler !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$extensionOutputCheckerHandler" is deprecated since 4.8.0 and will be removed in 5.0.0. Please set "null" instead and inject a CheckExtensions object into the CeremonyStepManager.'); } if ($algorithmManager !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$algorithmManager" is deprecated since 4.8.0 and will be removed in 5.0.0. Please set "null" instead and inject a CheckSignature object into the CeremonyStepManager.'); } $this->eventDispatcher = $eventDispatcher ?? new NullEventDispatcher(); if ($eventDispatcher !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', 'The parameter "$eventDispatcher" is deprecated since 4.5.0 will be removed in 5.0.0. Please use `setEventDispatcher` instead.'); } if ($this->ceremonyStepManager === null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$ceremonyStepManager" will mandatory in 5.0.0. Please set a CeremonyStepManager object instead and set null for $algorithmManager and $extensionOutputCheckerHandler.'); } $this->logger = new NullLogger(); $this->ceremonyStepManagerFactory = new CeremonyStepManagerFactory(); if ($extensionOutputCheckerHandler !== null) { $this->ceremonyStepManagerFactory->setExtensionOutputCheckerHandler($extensionOutputCheckerHandler); } if ($algorithmManager !== null) { $this->ceremonyStepManagerFactory->setAlgorithmManager($algorithmManager); } } public static function create(null|PublicKeyCredentialSourceRepository $publicKeyCredentialSourceRepository = null, null|TokenBindingHandler $tokenBindingHandler = null, null|ExtensionOutputCheckerHandler $extensionOutputCheckerHandler = null, null|Manager $algorithmManager = null, null|EventDispatcherInterface $eventDispatcher = null, null|CeremonyStepManager $ceremonyStepManager = null) : self { return new self($publicKeyCredentialSourceRepository, $tokenBindingHandler, $extensionOutputCheckerHandler, $algorithmManager, $eventDispatcher, $ceremonyStepManager); } /** * @param string[] $securedRelyingPartyId * * @see https://www.w3.org/TR/webauthn/#verifying-assertion */ public function check(string|PublicKeyCredentialSource $credentialId, AuthenticatorAssertionResponse $authenticatorAssertionResponse, PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions, ServerRequestInterface|string $request, ?string $userHandle, null|array $securedRelyingPartyId = null) : PublicKeyCredentialSource { if ($request instanceof ServerRequestInterface) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', sprintf('Passing a %s to the method `check` of the class "%s" is deprecated since 4.5.0 and will be removed in 5.0.0. Please inject the host as a string instead.', ServerRequestInterface::class, self::class)); } if (is_string($credentialId)) { \trigger_deprecation('web-auth/webauthn-lib', '4.6.0', sprintf('Passing a string as first to the method `check` of the class "%s" is deprecated since 4.6.0. Please inject a %s object instead.', self::class, PublicKeyCredentialSource::class)); } if ($securedRelyingPartyId !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', sprintf('Passing a list or secured relying party IDs to the method `check` of the class "%s" is deprecated since 4.8.0 and will be removed in 5.0.0. Please inject a CheckOrigin into the CeremonyStepManager instead.', self::class)); } if ($credentialId instanceof PublicKeyCredentialSource) { $publicKeyCredentialSource = $credentialId; } else { $this->publicKeyCredentialSourceRepository instanceof PublicKeyCredentialSourceRepository || throw AuthenticatorResponseVerificationException::create('Please pass the Public Key Credential Source to the method "check".'); $publicKeyCredentialSource = $this->publicKeyCredentialSourceRepository->findOneByCredentialId($credentialId); } $publicKeyCredentialSource !== null || throw AuthenticatorResponseVerificationException::create('The credential ID is invalid.'); $host = is_string($request) ? $request : $request->getUri()->getHost(); if ($this->ceremonyStepManager === null) { $this->ceremonyStepManager = $this->ceremonyStepManagerFactory->requestCeremony($securedRelyingPartyId); } try { $this->logger->info('Checking the authenticator assertion response', ['credentialId' => $credentialId, 'publicKeyCredentialSource' => $publicKeyCredentialSource, 'authenticatorAssertionResponse' => $authenticatorAssertionResponse, 'publicKeyCredentialRequestOptions' => $publicKeyCredentialRequestOptions, 'host' => $host, 'userHandle' => $userHandle]); $this->ceremonyStepManager->process($publicKeyCredentialSource, $authenticatorAssertionResponse, $publicKeyCredentialRequestOptions, $userHandle, $host); $publicKeyCredentialSource->counter = $authenticatorAssertionResponse->authenticatorData->signCount; //26.1. $publicKeyCredentialSource->backupEligible = $authenticatorAssertionResponse->authenticatorData->isBackupEligible(); //26.2. $publicKeyCredentialSource->backupStatus = $authenticatorAssertionResponse->authenticatorData->isBackedUp(); //26.2. if ($publicKeyCredentialSource->uvInitialized === \false) { $publicKeyCredentialSource->uvInitialized = $authenticatorAssertionResponse->authenticatorData->isUserVerified(); //26.3. } /* * 26.3. * OPTIONALLY, if response.attestationObject is present, update credentialRecord.attestationObject to the value of response.attestationObject and update credentialRecord.attestationClientDataJSON to the value of response.clientDataJSON. */ if (is_string($credentialId) && $this->publicKeyCredentialSourceRepository instanceof PublicKeyCredentialSourceRepository) { $this->publicKeyCredentialSourceRepository->saveCredentialSource($publicKeyCredentialSource); } //All good. We can continue. $this->logger->info('The assertion is valid'); $this->logger->debug('Public Key Credential Source', ['publicKeyCredentialSource' => $publicKeyCredentialSource]); $this->eventDispatcher->dispatch($this->createAuthenticatorAssertionResponseValidationSucceededEvent(null, $authenticatorAssertionResponse, $publicKeyCredentialRequestOptions, $host, $userHandle, $publicKeyCredentialSource)); // 27. return $publicKeyCredentialSource; } catch (AuthenticatorResponseVerificationException $throwable) { $this->logger->error('An error occurred', ['exception' => $throwable]); $this->eventDispatcher->dispatch($this->createAuthenticatorAssertionResponseValidationFailedEvent($publicKeyCredentialSource, $authenticatorAssertionResponse, $publicKeyCredentialRequestOptions, $host, $userHandle, $throwable)); throw $throwable; } } public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->eventDispatcher = $eventDispatcher; } /** * @deprecated since 4.8.0 and will be removed in 5.0.0. Please inject a CheckCounter object into a CeremonyStepManager instead. */ public function setCounterChecker(CounterChecker $counterChecker) : self { $this->ceremonyStepManagerFactory->setCounterChecker($counterChecker); return $this; } protected function createAuthenticatorAssertionResponseValidationSucceededEvent(null|string $credentialId, AuthenticatorAssertionResponse $authenticatorAssertionResponse, PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions, ServerRequestInterface|string $host, ?string $userHandle, PublicKeyCredentialSource $publicKeyCredentialSource) : AuthenticatorAssertionResponseValidationSucceededEvent { if ($host instanceof ServerRequestInterface) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', sprintf('Passing a %s to the method `createAuthenticatorAssertionResponseValidationSucceededEvent` of the class "%s" is deprecated since 4.5.0 and will be removed in 5.0.0. Please inject the host as a string instead.', ServerRequestInterface::class, self::class)); } return new AuthenticatorAssertionResponseValidationSucceededEvent($credentialId, $authenticatorAssertionResponse, $publicKeyCredentialRequestOptions, $host, $userHandle, $publicKeyCredentialSource); } protected function createAuthenticatorAssertionResponseValidationFailedEvent(string|PublicKeyCredentialSource $publicKeyCredentialSource, AuthenticatorAssertionResponse $authenticatorAssertionResponse, PublicKeyCredentialRequestOptions $publicKeyCredentialRequestOptions, ServerRequestInterface|string $host, ?string $userHandle, Throwable $throwable) : AuthenticatorAssertionResponseValidationFailedEvent { if ($host instanceof ServerRequestInterface) { \trigger_deprecation('web-auth/webauthn-lib', '4.5.0', sprintf('Passing a %s to the method `createAuthenticatorAssertionResponseValidationFailedEvent` of the class "%s" is deprecated since 4.5.0 and will be removed in 5.0.0. Please inject the host as a string instead.', ServerRequestInterface::class, self::class)); } return new AuthenticatorAssertionResponseValidationFailedEvent($publicKeyCredentialSource, $authenticatorAssertionResponse, $publicKeyCredentialRequestOptions, $host, $userHandle, $throwable); } } signature; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUserHandle() : ?string { return $this->userHandle; } } $extensions */ public function __construct(string $challenge, public null|string $rpId = null, public array $allowCredentials = [], public null|string $userVerification = null, null|int $timeout = null, null|array|AuthenticationExtensions $extensions = null) { in_array($userVerification, self::USER_VERIFICATION_REQUIREMENTS, \true) || throw InvalidDataException::create($userVerification, 'Invalid user verification requirement'); parent::__construct($challenge, $timeout, $extensions); } /** * @param PublicKeyCredentialDescriptor[] $allowCredentials * @param positive-int $timeout * @param null|AuthenticationExtensions|array $extensions */ public static function create(string $challenge, null|string $rpId = null, array $allowCredentials = [], null|string $userVerification = null, null|int $timeout = null, null|array|AuthenticationExtensions $extensions = null) : self { return new self($challenge, $rpId, $allowCredentials, $userVerification, $timeout, $extensions); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setRpId(?string $rpId) : self { $this->rpId = $rpId; return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function allowCredential(PublicKeyCredentialDescriptor $allowCredential) : self { $this->allowCredentials[] = $allowCredential; return $this; } /** * @deprecated since 4.7.0. No replacement. Please use the property directly. * @infection-ignore-all */ public function allowCredentials(PublicKeyCredentialDescriptor ...$allowCredentials) : self { foreach ($allowCredentials as $allowCredential) { $this->allowCredentials[] = $allowCredential; } return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setUserVerification(?string $userVerification) : self { if ($userVerification === null) { $this->rpId = null; return $this; } in_array($userVerification, [self::USER_VERIFICATION_REQUIREMENT_REQUIRED, self::USER_VERIFICATION_REQUIREMENT_PREFERRED, self::USER_VERIFICATION_REQUIREMENT_DISCOURAGED], \true) || throw InvalidDataException::create($userVerification, 'Invalid user verification requirement'); $this->userVerification = $userVerification; return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRpId() : ?string { return $this->rpId; } /** * @return PublicKeyCredentialDescriptor[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAllowCredentials() : array { return $this->allowCredentials; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUserVerification() : ?string { return $this->userVerification; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromString(string $data) : static { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @param mixed[] $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : static { array_key_exists('challenge', $json) || throw InvalidDataException::create($json, 'Invalid input. "challenge" is missing.'); $allowCredentials = []; $allowCredentialList = $json['allowCredentials'] ?? []; foreach ($allowCredentialList as $allowCredential) { $allowCredentials[] = PublicKeyCredentialDescriptor::createFromArray($allowCredential); } $challenge = Base64::decode($json['challenge']); $extensions = isset($json['extensions']) ? AuthenticationExtensionsClientInputs::createFromArray($json['extensions']) : AuthenticationExtensionsClientInputs::create(); return self::create($challenge, $json['rpId'] ?? null, $allowCredentials, $json['userVerification'] ?? null, $json['timeout'] ?? null, $extensions); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $json = ['challenge' => Base64UrlSafe::encodeUnpadded($this->challenge)]; if ($this->rpId !== null) { $json['rpId'] = $this->rpId; } if ($this->userVerification !== null) { $json['userVerification'] = $this->userVerification; } if (count($this->allowCredentials) !== 0) { $json['allowCredentials'] = $this->allowCredentials; } if ($this->extensions->count() !== 0) { $json['extensions'] = $this->extensions; } if ($this->timeout !== null) { $json['timeout'] = $this->timeout; } return $json; } } decoder = Decoder::create(); } public static function create() : self { return new self(); } public function load(string $authData) : AuthenticatorData { $authData = $this->fixIncorrectEdDSAKey($authData); $authDataStream = new StringStream($authData); $rp_id_hash = $authDataStream->read(32); $flags = $authDataStream->read(1); $signCount = $authDataStream->read(4); $signCount = \unpack('N', $signCount); $attestedCredentialData = null; if (0 !== (ord($flags) & AuthenticatorData::FLAG_AT)) { $aaguid = Uuid::fromBinary($authDataStream->read(16)); $credentialLength = $authDataStream->read(2); $credentialLength = \unpack('n', $credentialLength); $credentialId = $authDataStream->read($credentialLength[1]); $credentialPublicKey = $this->decoder->decode($authDataStream); $credentialPublicKey instanceof MapObject || throw InvalidDataException::create($authData, 'The data does not contain a valid credential public key.'); $attestedCredentialData = AttestedCredentialData::create($aaguid, $credentialId, (string) $credentialPublicKey); } $extension = null; if (0 !== (ord($flags) & AuthenticatorData::FLAG_ED)) { $extension = $this->decoder->decode($authDataStream); $extension = AuthenticationExtensionsClientOutputsLoader::load($extension); } $authDataStream->isEOF() || throw InvalidDataException::create($authData, 'Invalid authentication data. Presence of extra bytes.'); $authDataStream->close(); return AuthenticatorData::create($authData, $rp_id_hash, $flags, $signCount[1], $attestedCredentialData, $extension); } private function fixIncorrectEdDSAKey(string $data) : string { $needle = \hex2bin('a301634f4b500327206745643235353139'); $correct = \hex2bin('a401634f4b500327206745643235353139'); $position = \mb_strpos($data, $needle, 0, '8bit'); if ($position === \false) { return $data; } $begin = \mb_substr($data, 0, $position, '8bit'); $end = \mb_substr($data, $position, null, '8bit'); $end = \str_replace($needle, $correct, $end); $cbor = new StringStream($end); $badKey = $this->decoder->decode($cbor); $badKey instanceof MapObject && $cbor->isEOF() || throw InvalidDataException::create($end, 'Invalid authentication data. Presence of extra bytes.'); $badX = $badKey->get(-2); $badX instanceof ListObject || throw InvalidDataException::create($end, 'Invalid authentication data.'); $keyBytes = \array_reduce($badX->normalize(), static fn(string $carry, string $item): string => $carry . chr((int) $item), ''); $correctX = ByteStringObject::create($keyBytes); $correctKey = MapObject::create()->add(UnsignedIntegerObject::create(1), TextStringObject::create('OKP'))->add(UnsignedIntegerObject::create(3), NegativeIntegerObject::create(-8))->add(NegativeIntegerObject::create(-1), TextStringObject::create('Ed25519'))->add(NegativeIntegerObject::create(-2), $correctX); return $begin . $correctKey; } } EmptyTrustPath::class] => EmptyTrustPath::create(), array_key_exists('x5c', $data) && is_array($data['x5c']) => CertificateTrustPath::create($data['x5c']), array_key_exists('ecdaaKeyId', $data) && is_string($data['ecdaaKeyId']) => new EcdaaKeyIdTrustPath($data['ecdaaKeyId']), default => throw InvalidTrustPathException::create('Unsupported trust path'), }; } } ecdaaKeyId; } /** * @return string[] */ public function jsonSerialize() : array { return ['type' => self::class, 'ecdaaKeyId' => $this->ecdaaKeyId]; } public static function createFromArray(array $data) : static { array_key_exists('ecdaaKeyId', $data) || throw InvalidTrustPathException::create('The trust path type is invalid'); return new self($data['ecdaaKeyId']); } } $data * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : static; } self::class]; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : static { return self::create(); } } certificates; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : static { array_key_exists('x5c', $data) || throw InvalidTrustPathException::create('The trust path type is invalid'); $x5c = $data['x5c']; is_array($x5c) || throw InvalidTrustPathException::create('The trust path type is invalid. The parameter "x5c" shall contain strings.'); return self::create($x5c); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return ['type' => self::class, 'x5c' => $this->certificates]; } } name; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getIcon() : ?string { return $this->icon; } /** * @return mixed[] */ public function jsonSerialize() : array { $json = ['name' => $this->name]; if ($this->icon !== null) { $json['icon'] = $this->icon; } return $json; } } clientDataCollectors as $clientDataCollector) { if (in_array($collectedClientData->type, $clientDataCollector->supportedTypes(), \true)) { $clientDataCollector->verifyCollectedClientData($collectedClientData, $publicKeyCredentialOptions, $authenticatorResponse, $host); return; } } throw AuthenticatorResponseVerificationException::create('No client data collector found.'); } } type, $this->supportedTypes(), \true) || throw AuthenticatorResponseVerificationException::create(sprintf('The client data type is not "%s" supported.', \implode('", "', $this->supportedTypes()))); } } logger = $logger; } public function check(PublicKeyCredentialSource $publicKeyCredentialSource, int $currentCounter) : void { try { $currentCounter > $publicKeyCredentialSource->counter || throw CounterException::create($currentCounter, $publicKeyCredentialSource->counter, 'Invalid counter.'); } catch (CounterException $throwable) { $this->logger->error('The counter is invalid', ['current' => $currentCounter, 'new' => $publicKeyCredentialSource->counter]); throw $throwable; } } } extensions); } assert(is_array($data), 'The data should be an array.'); foreach ($data as $key => $value) { if (!is_string($key)) { continue; } $data[$key] = AuthenticationExtension::create($key, $value); } return AuthenticationExtensions::create($data); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return in_array($type, [AuthenticationExtensions::class, AuthenticationExtensionsClientOutputs::class, AuthenticationExtensionsClientInputs::class], \true); } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AuthenticationExtensions::class => \true, AuthenticationExtensionsClientInputs::class => \true, AuthenticationExtensionsClientOutputs::class => \true]; } /** * @return array */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof AuthenticationExtensions); $extensions = []; foreach ($data->extensions as $extension) { $extensions[$extension->name] = $extension->value; } return $extensions; } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof AuthenticationExtensions; } } attestationStatementSupportManager->get($data['fmt']); return $attestationStatementSupport->load($data); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === AttestationStatement::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AttestationStatement::class => \true]; } } */ public function getSupportedTypes(?string $format) : array { return [AuthenticationExtension::class => \true]; } /** * @return array */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof AuthenticationExtension); return $data->value; } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof AuthenticationExtension; } } new EcdaaKeyIdTrustPath($data), array_key_exists('x5c', $data) => CertificateTrustPath::create($data), $data === [], isset($data['type']) && $data['type'] === EmptyTrustPath::class => EmptyTrustPath::create(), default => throw new InvalidTrustPathException('Unsupported trust path type'), }; } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === TrustPath::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [TrustPath::class => \true]; } /** * @return array */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof TrustPath); return match (\true) { $data instanceof EcdaaKeyIdTrustPath => ['ecdaaKeyId' => $data->getEcdaaKeyId()], $data instanceof CertificateTrustPath => ['x5c' => $data->certificates], $data instanceof EmptyTrustPath => [], default => throw new InvalidTrustPathException('Unsupported trust path type'), }; } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof TrustPath; } } denormalizer->denormalize($data['response'], AuthenticatorResponse::class, $format, $context)); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === PublicKeyCredential::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [PublicKeyCredential::class => \true]; } } $package) { if (!\class_exists($class)) { throw new RuntimeException(sprintf('The class "%s" is required. Please install the package "%s" to use this feature.', $class, $package)); } } $denormalizers = [new ExtensionDescriptorDenormalizer(), new VerificationMethodANDCombinationsDenormalizer(), new AuthenticationExtensionNormalizer(), new PublicKeyCredentialDescriptorNormalizer(), new AttestedCredentialDataNormalizer(), new AttestationObjectDenormalizer(), new AttestationStatementDenormalizer($this->attestationStatementSupportManager), new AuthenticationExtensionsDenormalizer(), new AuthenticatorAssertionResponseDenormalizer(), new AuthenticatorAttestationResponseDenormalizer(), new AuthenticatorDataDenormalizer(), new AuthenticatorResponseDenormalizer(), new CollectedClientDataDenormalizer(), new PublicKeyCredentialDenormalizer(), new PublicKeyCredentialOptionsDenormalizer(), new PublicKeyCredentialSourceDenormalizer(), new PublicKeyCredentialUserEntityDenormalizer(), new TrustPathDenormalizer(), new UidNormalizer(), new ArrayDenormalizer(), new ObjectNormalizer(propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpDocExtractor(), new ReflectionExtractor()]))]; return new Serializer($denormalizers, [new JsonEncoder()]); } /** * @return array */ private static function getRequiredSerializerClasses() : array { return [UidNormalizer::class => self::PACKAGE_SYMFONY_SERIALIZER, ArrayDenormalizer::class => self::PACKAGE_SYMFONY_SERIALIZER, ObjectNormalizer::class => self::PACKAGE_SYMFONY_SERIALIZER, PropertyInfoExtractor::class => self::PACKAGE_SYMFONY_PROPERTY_INFO, PhpDocExtractor::class => self::PACKAGE_PHPDOCUMENTOR_REFLECTION_DOCBLOCK, ReflectionExtractor::class => self::PACKAGE_SYMFONY_PROPERTY_INFO, JsonEncoder::class => self::PACKAGE_SYMFONY_SERIALIZER, Serializer::class => self::PACKAGE_SYMFONY_SERIALIZER]; } } */ public function getSupportedTypes(?string $format) : array { return [CollectedClientData::class => \true]; } } */ public function getSupportedTypes(?string $format) : array { return [PublicKeyCredentialParameters::class => \true]; } } denormalizer->denormalize($data['clientDataJSON'], CollectedClientData::class, $format, $context); $attestationObject = $this->denormalizer->denormalize($data['attestationObject'], AttestationObject::class, $format, $context); return AuthenticatorAttestationResponse::create($clientDataJSON, $attestationObject, $data['transports'] ?? []); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === AuthenticatorAttestationResponse::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AuthenticatorAttestationResponse::class => \true]; } } */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof AttestedCredentialData); $result = ['aaguid' => $this->normalizer->normalize($data->aaguid, $format, $context), 'credentialId' => \base64_encode($data->credentialId)]; if ($data->credentialPublicKey !== null) { $result['credentialPublicKey'] = \base64_encode($data->credentialPublicKey); } return $result; } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof AttestedCredentialData; } public function getSupportedTypes(?string $format) : array { return [AttestedCredentialData::class => \true]; } } */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof PublicKeyCredentialDescriptor); $result = ['type' => $data->type, 'id' => Base64UrlSafe::encodeUnpadded($data->id)]; if (count($data->transports) !== 0) { $result['transports'] = $data->transports; } return $result; } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof PublicKeyCredentialDescriptor; } public function getSupportedTypes(?string $format) : array { return [PublicKeyCredentialDescriptor::class => \true]; } } decoder = Decoder::create(); } public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []) : mixed { $authData = $this->fixIncorrectEdDSAKey($data); $authDataStream = new StringStream($authData); $rp_id_hash = $authDataStream->read(32); $flags = $authDataStream->read(1); $signCount = $authDataStream->read(4); $signCount = \unpack('N', $signCount); $attestedCredentialData = null; if (0 !== (ord($flags) & AuthenticatorData::FLAG_AT)) { $aaguid = Uuid::fromBinary($authDataStream->read(16)); $credentialLength = $authDataStream->read(2); $credentialLength = \unpack('n', $credentialLength); $credentialId = $authDataStream->read($credentialLength[1]); $credentialPublicKey = $this->decoder->decode($authDataStream); $credentialPublicKey instanceof MapObject || throw InvalidDataException::create($authData, 'The data does not contain a valid credential public key.'); $attestedCredentialData = AttestedCredentialData::create($aaguid, $credentialId, (string) $credentialPublicKey); } $extension = null; if (0 !== (ord($flags) & AuthenticatorData::FLAG_ED)) { $extension = $this->decoder->decode($authDataStream); $extension = AuthenticationExtensionsClientOutputsLoader::load($extension); } $authDataStream->isEOF() || throw InvalidDataException::create($authData, 'Invalid authentication data. Presence of extra bytes.'); $authDataStream->close(); return AuthenticatorData::create($authData, $rp_id_hash, $flags, $signCount[1], $attestedCredentialData, $extension === null ? null : $this->denormalizer->denormalize($extension, AuthenticationExtensions::class, $format, $context)); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === AuthenticatorData::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AuthenticatorData::class => \true]; } private function fixIncorrectEdDSAKey(string $data) : string { $needle = \hex2bin('a301634f4b500327206745643235353139'); $correct = \hex2bin('a401634f4b500327206745643235353139'); $position = \mb_strpos($data, $needle, 0, '8bit'); if ($position === \false) { return $data; } $begin = \mb_substr($data, 0, $position, '8bit'); $end = \mb_substr($data, $position, null, '8bit'); $end = \str_replace($needle, $correct, $end); $cbor = new StringStream($end); $badKey = $this->decoder->decode($cbor); $badKey instanceof MapObject && $cbor->isEOF() || throw InvalidDataException::create($end, 'Invalid authentication data. Presence of extra bytes.'); $badX = $badKey->get(-2); $badX instanceof ListObject || throw InvalidDataException::create($end, 'Invalid authentication data.'); $keyBytes = \array_reduce($badX->normalize(), static fn(string $carry, string $item): string => $carry . chr((int) $item), ''); $correctX = ByteStringObject::create($keyBytes); $correctKey = MapObject::create()->add(UnsignedIntegerObject::create(1), TextStringObject::create('OKP'))->add(UnsignedIntegerObject::create(3), NegativeIntegerObject::create(-8))->add(NegativeIntegerObject::create(-1), TextStringObject::create('Ed25519'))->add(NegativeIntegerObject::create(-2), $correctX); return $begin . $correctKey; } } decode($stream); $parsed instanceof Normalizable || throw InvalidDataException::create($parsed, 'Invalid attestation object. Unexpected object.'); $attestationObject = $parsed->normalize(); $stream->isEOF() || throw InvalidDataException::create(null, 'Invalid attestation object. Presence of extra bytes.'); $stream->close(); $authData = $attestationObject['authData'] ?? throw InvalidDataException::create($attestationObject, 'Invalid attestation object. Missing "authData" field.'); return AttestationObject::create($data, $this->denormalizer->denormalize($attestationObject, AttestationStatement::class, $format, $context), $this->denormalizer->denormalize($authData, AuthenticatorData::class, $format, $context)); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === AttestationObject::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AttestationObject::class => \true]; } } denormalizer->denormalize($data['trustPath'], TrustPath::class, $format, $context), Uuid::fromString($data['aaguid']), $data['credentialPublicKey'], $data['userHandle'], $data['counter'], $data['otherUI'] ?? null, $data['backupEligible'] ?? null, $data['backupStatus'] ?? null, $data['uvInitialized'] ?? null); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === PublicKeyCredentialSource::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [PublicKeyCredentialSource::class => \true]; } /** * @return array */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof PublicKeyCredentialSource); $result = ['publicKeyCredentialId' => Base64UrlSafe::encodeUnpadded($data->publicKeyCredentialId), 'type' => $data->type, 'transports' => $data->transports, 'attestationType' => $data->attestationType, 'trustPath' => $this->normalizer->normalize($data->trustPath, $format, $context), 'aaguid' => $this->normalizer->normalize($data->aaguid, $format, $context), 'credentialPublicKey' => Base64UrlSafe::encodeUnpadded($data->credentialPublicKey), 'userHandle' => Base64UrlSafe::encodeUnpadded($data->userHandle), 'counter' => $data->counter, 'otherUI' => $data->otherUI, 'backupEligible' => $data->backupEligible, 'backupStatus' => $data->backupStatus, 'uvInitialized' => $data->uvInitialized]; return \array_filter($result, static fn($value): bool => $value !== null); } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof PublicKeyCredentialSource; } } */ public function getSupportedTypes(?string $format) : array { return [PublicKeyCredentialUserEntity::class => \true]; } /** * @return array */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof PublicKeyCredentialUserEntity); $normalized = ['id' => Base64UrlSafe::encodeUnpadded($data->id), 'name' => $data->name, 'displayName' => $data->displayName, 'icon' => $data->icon]; return \array_filter($normalized, fn($value) => $value !== null); } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof PublicKeyCredentialUserEntity; } } denormalizer->denormalize($data, $type, $format, $context); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { if ($context[self::ALREADY_CALLED] ?? \false) { return \false; } return $type === ExtensionDescriptor::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [ExtensionDescriptor::class => \false]; } } */ public function getSupportedTypes(?string $format) : array { return [VerificationMethodANDCombinations::class => \true]; } /** * @return array */ public function normalize(mixed $object, ?string $format = null, array $context = []) : array { assert($object instanceof VerificationMethodANDCombinations); return \array_map(fn($verificationMethod) => $this->normalizer->normalize($verificationMethod, $format, $context), $object->verificationMethods); } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof VerificationMethodANDCombinations; } } denormalizer->denormalize($data['clientDataJSON'], CollectedClientData::class, $format, $context), $this->denormalizer->denormalize($data['authenticatorData'], AuthenticatorData::class, $format, $context), $data['signature'], $userHandle ?? null, !isset($data['attestationObject']) ? null : $this->denormalizer->denormalize($data['attestationObject'], AttestationObject::class, $format, $context)); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === AuthenticatorAssertionResponse::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AuthenticatorAssertionResponse::class => \true]; } } AuthenticatorAttestationResponse::class, array_key_exists('signature', $data) => AuthenticatorAssertionResponse::class, default => throw InvalidDataException::create($data, 'Unable to create the response object'), }; return $this->denormalizer->denormalize($data, $realType, $format, $context); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return $type === AuthenticatorResponse::class; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [AuthenticatorResponse::class => \true]; } } $allowCredential) { $data[$key][$item]['id'] = Base64UrlSafe::decodeNoPadding($allowCredential['id']); } } } if ($type === PublicKeyCredentialCreationOptions::class) { return PublicKeyCredentialCreationOptions::create($this->denormalizer->denormalize($data['rp'], PublicKeyCredentialRpEntity::class, $format, $context), $this->denormalizer->denormalize($data['user'], PublicKeyCredentialUserEntity::class, $format, $context), $data['challenge'], !isset($data['pubKeyCredParams']) ? [] : $this->denormalizer->denormalize($data['pubKeyCredParams'], PublicKeyCredentialParameters::class . '[]', $format, $context), !isset($data['authenticatorSelection']) ? null : $this->denormalizer->denormalize($data['authenticatorSelection'], AuthenticatorSelectionCriteria::class, $format, $context), $data['attestation'] ?? null, !isset($data['excludeCredentials']) ? [] : $this->denormalizer->denormalize($data['excludeCredentials'], PublicKeyCredentialDescriptor::class . '[]', $format, $context), $data['timeout'] ?? null, !isset($data['extensions']) ? null : $this->denormalizer->denormalize($data['extensions'], AuthenticationExtensions::class, $format, $context)); } if ($type === PublicKeyCredentialRequestOptions::class) { return PublicKeyCredentialRequestOptions::create($data['challenge'], $data['rpId'] ?? null, !isset($data['allowCredentials']) ? [] : $this->denormalizer->denormalize($data['allowCredentials'], PublicKeyCredentialDescriptor::class . '[]', $format, $context), $data['userVerification'] ?? null, $data['timeout'] ?? null, !isset($data['extensions']) ? null : $this->denormalizer->denormalize($data['extensions'], AuthenticationExtensions::class, $format, $context)); } throw new BadMethodCallException('Unsupported type'); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []) : bool { return in_array($type, [PublicKeyCredentialCreationOptions::class, PublicKeyCredentialRequestOptions::class], \true); } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []) : bool { return $data instanceof PublicKeyCredentialCreationOptions || $data instanceof PublicKeyCredentialRequestOptions; } /** * @return array */ public function getSupportedTypes(?string $format) : array { return [PublicKeyCredentialCreationOptions::class => \true, PublicKeyCredentialRequestOptions::class => \true]; } /** * @return array */ public function normalize(mixed $data, ?string $format = null, array $context = []) : array { assert($data instanceof PublicKeyCredentialCreationOptions || $data instanceof PublicKeyCredentialRequestOptions); $json = ['challenge' => Base64UrlSafe::encodeUnpadded($data->challenge), 'timeout' => $data->timeout, 'extensions' => $data->extensions->count() === 0 ? null : $this->normalizer->normalize($data->extensions, $format, $context)]; if ($data instanceof PublicKeyCredentialCreationOptions) { $json = [...$json, 'rp' => $this->normalizer->normalize($data->rp, $format, $context), 'user' => $this->normalizer->normalize($data->user, $format, $context), 'pubKeyCredParams' => $this->normalizer->normalize($data->pubKeyCredParams, PublicKeyCredentialParameters::class . '[]', $context), 'authenticatorSelection' => $data->authenticatorSelection === null ? null : $this->normalizer->normalize($data->authenticatorSelection, $format, $context), 'attestation' => $data->attestation, 'excludeCredentials' => $this->normalizer->normalize($data->excludeCredentials, $format, $context)]; } if ($data instanceof PublicKeyCredentialRequestOptions) { $json = [...$json, 'rpId' => $data->rpId, 'allowCredentials' => $this->normalizer->normalize($data->allowCredentials, $format, $context), 'userVerification' => $data->userVerification]; } return \array_filter($json, static fn($value) => $value !== null && $value !== []); } } getPublicKeyCredentialDescriptor(), JSON_THROW_ON_ERROR); } public static function create(null|string $id, string $type, string $rawId, AuthenticatorResponse $response) : self { return new self($id, $type, $rawId, $response); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRawId() : string { return $this->rawId; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getResponse() : AuthenticatorResponse { return $this->response; } /** * @param string[] $transport */ public function getPublicKeyCredentialDescriptor(null|array $transport = null) : PublicKeyCredentialDescriptor { if ($transport !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.8.0', 'The parameter "$transport" is deprecated and will be removed in 5.0.0.'); @\trigger_error(sprintf('The $transport argument of %s() is deprecated since 4.8.0 and will be removed in 5.0.0.', __METHOD__), E_USER_DEPRECATED); } $transport ??= $this->response instanceof AuthenticatorAttestationResponse ? $this->response->transports : []; return PublicKeyCredentialDescriptor::create($this->type, $this->rawId, $transport); } } requestFactory->createRequest($method, $baseUri . $url); $body = $options['body'] ?? null; if ($body !== null) { $request = $request->withBody($this->streamFactory->createStream($body)); } foreach ($this->options as $name => $value) { $request = $request->withHeader($name, $value); } foreach ($options['headers'] ?? [] as $name => $value) { $request = $request->withHeader($name, $value); } $response = $this->client->sendRequest($request); return static::fromPsr17($response); } /** * @param ResponseInterface|iterable $responses */ public function stream(iterable|ResponseInterface $responses, ?float $timeout = null) : ResponseStreamInterface { throw new LogicException('Not implemented'); } public function withOptions(array $options) : static { $this->options = $options; return $this; } protected static function fromPsr17(Psr17ResponseInterface $response) : ResponseInterface { $headers = $response->getHeaders(); $content = $response->getBody()->getContents(); $status = $response->getStatusCode(); return new class($status, $headers, $content) implements ResponseInterface { /** * @param array $headers */ public function __construct(private readonly int $status, private readonly array $headers, private readonly string $content) { } public function getStatusCode() : int { return $this->status; } /** * @return array */ public function getHeaders(bool $throw = \true) : array { return $this->headers; } public function getContent(bool $throw = \true) : string { return $this->content; } /** * @return array */ public function toArray(bool $throw = \true) : array { $result = \json_decode($this->content, \true); if (!is_array($result) || \json_last_error() !== JSON_ERROR_NONE) { throw new JsonException('Failed to decode JSON response: ' . \json_last_error_msg()); } return $result; } public function cancel() : void { // noop } public function getInfo(?string $type = null) : mixed { return null; } }; } } self::fixPEMStructure($d, $type), $data); } public static function fixPEMStructure(string $data, string $type = 'CERTIFICATE') : string { if (\str_contains($data, self::PEM_HEADER)) { return \trim($data); } $pem = self::PEM_HEADER . $type . '-----' . PHP_EOL; $pem .= \chunk_split($data, 64, PHP_EOL); return $pem . (self::PEM_FOOTER . $type . '-----' . PHP_EOL); } /** * @deprecated since 4.7.0 and will be removed in 5.0.0. No replacement as not used internally. * @infection-ignore-all */ public static function convertPEMToDER(string $data) : string { if (!\str_contains($data, self::PEM_HEADER)) { return $data; } $data = preg_replace('/\\-{5}.*\\-{5}[\\r\\n]*/', '', $data); $data = preg_replace("/[\r\n]*/", '', (string) $data); return Base64::decode(\trim((string) $data), \true); } public static function convertDERToPEM(string $data, string $type = 'CERTIFICATE') : string { if (\str_contains($data, self::PEM_HEADER)) { return $data; } return self::fixPEMStructure(\base64_encode($data), $type); } /** * @param string[] $data * * @return string[] */ public static function convertAllDERToPEM(iterable $data, string $type = 'CERTIFICATE') : array { return \array_map(static fn($d): string => self::convertDERToPEM($d, $type), $data); } } clock = $clock; $this->dispatcher = new NullEventDispatcher(); } public static function create(HttpClientInterface $client, null|Clock|ClockInterface $clock = null, bool $allowFailures = \true) : self { return new self($client, null, $clock, $allowFailures); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } /** * @param string[] $untrustedCertificates * @param string[] $trustedCertificates */ public function check(array $untrustedCertificates, array $trustedCertificates) : void { foreach ($trustedCertificates as $trustedCertificate) { $this->dispatcher->dispatch(BeforeCertificateChainValidation::create($untrustedCertificates, $trustedCertificate)); try { if ($this->validateChain($untrustedCertificates, $trustedCertificate)) { $this->dispatcher->dispatch(CertificateChainValidationSucceeded::create($untrustedCertificates, $trustedCertificate)); return; } } catch (Throwable $exception) { $this->dispatcher->dispatch(CertificateChainValidationFailed::create($untrustedCertificates, $trustedCertificate)); throw $exception; } } throw CertificateChainException::create($untrustedCertificates, $trustedCertificates); } /** * @param string[] $untrustedCertificates */ private function validateChain(array $untrustedCertificates, string $trustedCertificate) : bool { $untrustedCertificates = \array_map(static fn(string $cert): Certificate => Certificate::fromPEM(PEM::fromString($cert)), \array_reverse($untrustedCertificates)); $trustedCertificate = Certificate::fromPEM(PEM::fromString($trustedCertificate)); // The trust path and the authenticator certificate are the same if (count($untrustedCertificates) === 1 && $untrustedCertificates[0]->toPEM()->string() === $trustedCertificate->toPEM()->string()) { return \true; } $uniqueCertificates = \array_map(static fn(Certificate $cert): string => $cert->toPEM()->string(), [...$untrustedCertificates, $trustedCertificate]); count(\array_unique($uniqueCertificates)) === count($uniqueCertificates) || throw CertificateChainException::create($untrustedCertificates, [$trustedCertificate], 'Invalid certificate chain with duplicated certificates.'); if (!$this->validateCertificates($trustedCertificate, ...$untrustedCertificates)) { return \false; } $certificates = [$trustedCertificate, ...$untrustedCertificates]; $numCerts = count($certificates); for ($i = 1; $i < $numCerts; $i++) { if ($this->isRevoked($certificates[$i])) { throw CertificateChainException::create($untrustedCertificates, [$trustedCertificate], 'Unable to validate the certificate chain. Revoked certificate found.'); } } return \true; } private function isRevoked(Certificate $subject) : bool { try { $csn = $subject->tbsCertificate()->serialNumber(); } catch (Throwable $e) { throw InvalidCertificateException::create($subject->toPEM()->string(), sprintf('Failed to parse certificate: %s', $e->getMessage()), $e); } try { $urls = $this->getCrlUrlList($subject); } catch (Throwable $e) { if ($this->allowFailures) { return \false; } throw InvalidCertificateException::create($subject->toPEM()->string(), 'Failed to get CRL distribution points: ' . $e->getMessage(), $e); } foreach ($urls as $url) { try { $revokedCertificates = $this->retrieveRevokedSerialNumbers($url); if (in_array($csn, $revokedCertificates, \true)) { return \true; } } catch (Throwable $e) { if ($this->allowFailures) { return \false; } throw CertificateRevocationListException::create($url, sprintf('Failed to retrieve the CRL:' . PHP_EOL . '%s', $e->getMessage()), $e); } } return \false; } private function validateCertificates(Certificate ...$certificates) : bool { try { $config = PathValidationConfig::create($this->clock->now(), self::MAX_VALIDATION_LENGTH); CertificationPath::create(...$certificates)->validate($config); return \true; } catch (Throwable) { return \false; } } /** * @return string[] */ private function retrieveRevokedSerialNumbers(string $url) : array { try { if ($this->client instanceof HttpClientInterface) { $crlData = $this->client->request('GET', $url)->getContent(); } else { $crlData = $this->sendPsrRequest($url); } $crl = UnspecifiedType::fromDER($crlData)->asSequence(); count($crl) === 3 || throw CertificateRevocationListException::create($url); $tbsCertList = $crl->at(0)->asSequence(); count($tbsCertList) >= 6 || throw CertificateRevocationListException::create($url); $list = $tbsCertList->at(5)->asSequence(); return \array_map(static function (UnspecifiedType $r) use($url) : string { $sequence = $r->asSequence(); count($sequence) >= 1 || throw CertificateRevocationListException::create($url); return $sequence->at(0)->asInteger()->number(); }, $list->elements()); } catch (Throwable $e) { throw CertificateRevocationListException::create($url, 'Failed to download the CRL', $e); } } /** * @return string[] */ private function getCrlUrlList(Certificate $subject) : array { try { $urls = []; $extensions = $subject->tbsCertificate()->extensions(); if ($extensions->hasCRLDistributionPoints()) { $crlDists = $extensions->crlDistributionPoints(); foreach ($crlDists->distributionPoints() as $dist) { $url = $dist->fullName()->names()->firstURI(); $scheme = parse_url($url, PHP_URL_SCHEME); if (!in_array($scheme, ['http', 'https'], \true)) { continue; } $urls[] = $url; } } return $urls; } catch (Throwable $e) { throw InvalidCertificateException::create($subject->toPEM()->string(), 'Failed to get CRL distribution points from certificate: ' . $e->getMessage(), $e); } } private function sendPsrRequest(string $url) : string { $request = $this->requestFactory->createRequest('GET', $url); $response = $this->client->sendRequest($request); if ($response->getStatusCode() !== 200) { throw CertificateRevocationListException::create($url, 'Failed to download the CRL'); } return $response->getBody()->getContents(); } } = 0 || throw MetadataStatementLoadingException::create('Invalid data. The parameter "tag" shall be a positive integer'); } } public static function create(string $id, ?int $tag = null, ?string $data = null, bool $failIfUnknown = \false) : self { return new self($id, $tag, $data, $failIfUnknown); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getId() : string { return $this->id; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTag() : ?int { return $this->tag; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getData() : ?string { return $this->data; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function isFailIfUnknown() : bool { return $this->failIfUnknown; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); array_key_exists('id', $data) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "id" is missing'); array_key_exists('fail_if_unknown', $data) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "fail_if_unknown" is missing'); return new self($data['id'], $data['tag'] ?? null, $data['data'] ?? null, $data['fail_if_unknown']); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $result = ['id' => $this->id, 'tag' => $this->tag, 'data' => $this->data, 'fail_if_unknown' => $this->failIfUnknown]; return self::filterNullValues($result); } } = 0 || throw MetadataStatementLoadingException::create('Invalid data. The value of "base" must be a positive integer'); $minLength >= 0 || throw MetadataStatementLoadingException::create('Invalid data. The value of "minLength" must be a positive integer'); parent::__construct($maxRetries, $blockSlowdown); } public static function create(int $base, int $minLength, ?int $maxRetries = null, ?int $blockSlowdown = null) : self { return new self($base, $minLength, $maxRetries, $blockSlowdown); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getBase() : int { return $this->base; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMinLength() : int { return $this->minLength; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { array_key_exists('base', $data) || throw MetadataStatementLoadingException::create('The parameter "base" is missing'); array_key_exists('minLength', $data) || throw MetadataStatementLoadingException::create('The parameter "minLength" is missing'); return self::create($data['base'], $data['minLength'], $data['maxRetries'] ?? null, $data['blockSlowdown'] ?? null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['base' => $this->base, 'minLength' => $this->minLength, 'maxRetries' => $this->maxRetries, 'blockSlowdown' => $this->blockSlowdown]; return self::filterNullValues($data); } } = 0 || throw MetadataStatementLoadingException::create('Invalid data. The value of "minComplexity" must be a positive integer'); parent::__construct($maxRetries, $blockSlowdown); } public static function create(int $minComplexity, ?int $maxRetries = null, ?int $blockSlowdown = null) : self { return new self($minComplexity, $maxRetries, $blockSlowdown); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMinComplexity() : int { return $this->minComplexity; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); array_key_exists('minComplexity', $data) || throw MetadataStatementLoadingException::create('The key "minComplexity" is missing'); foreach (['minComplexity', 'maxRetries', 'blockSlowdown'] as $key) { if (array_key_exists($key, $data)) { is_int($data[$key]) || throw MetadataStatementLoadingException::create(sprintf('Invalid data. The value of "%s" must be a positive integer', $key)); } } return self::create($data['minComplexity'], $data['maxRetries'] ?? null, $data['blockSlowdown'] ?? null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['minComplexity' => $this->minComplexity, 'maxRetries' => $this->maxRetries, 'blockSlowdown' => $this->blockSlowdown]; return self::filterNullValues($data); } } authenticatorGetInfo = $authenticatorGetInfo ?? AuthenticatorGetInfo::create($attestationTypes); } public static function create(string $description, int $authenticatorVersion, string $protocolFamily, int $schema, array $upv, array $authenticationAlgorithms, array $publicKeyAlgAndEncodings, array $attestationTypes, array $userVerificationDetails, array $matcherProtection, array $tcDisplay, array $attestationRootCertificates, array $alternativeDescriptions = [], ?string $legalHeader = null, ?string $aaid = null, ?string $aaguid = null, array $attestationCertificateKeyIdentifiers = [], array $keyProtection = [], ?bool $isKeyRestricted = null, ?bool $isFreshUserVerificationRequired = null, ?int $cryptoStrength = null, array $attachmentHint = [], ?string $tcDisplayContentType = null, array $tcDisplayPNGCharacteristics = [], array $ecdaaTrustAnchors = [], ?string $icon = null, array $supportedExtensions = [], ?AuthenticatorGetInfo $authenticatorGetInfo = null) : self { return new self($description, $authenticatorVersion, $protocolFamily, $schema, $upv, $authenticationAlgorithms, $publicKeyAlgAndEncodings, $attestationTypes, $userVerificationDetails, $matcherProtection, $tcDisplay, $attestationRootCertificates, AlternativeDescriptions::create($alternativeDescriptions), $legalHeader, $aaid, $aaguid, $attestationCertificateKeyIdentifiers, $keyProtection, $isKeyRestricted, $isFreshUserVerificationRequired, $cryptoStrength, $attachmentHint, $tcDisplayContentType, $tcDisplayPNGCharacteristics, $ecdaaTrustAnchors, $icon, $supportedExtensions, $authenticatorGetInfo); } /** * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromString(string $statement) : self { $data = \json_decode($statement, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getLegalHeader() : ?string { return $this->legalHeader; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAaid() : ?string { return $this->aaid; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAaguid() : ?string { return $this->aaguid; } public function isKeyRestricted() : ?bool { return $this->isKeyRestricted; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function isFreshUserVerificationRequired() : ?bool { return $this->isFreshUserVerificationRequired; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAuthenticatorGetInfo() : AuthenticatorGetInfo|null { return $this->authenticatorGetInfo; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestationCertificateKeyIdentifiers() : array { return $this->attestationCertificateKeyIdentifiers; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getDescription() : string { return $this->description; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAlternativeDescriptions() : null|AlternativeDescriptions { return $this->alternativeDescriptions; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAuthenticatorVersion() : int { return $this->authenticatorVersion; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getProtocolFamily() : string { return $this->protocolFamily; } /** * @return Version[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUpv() : array { return $this->upv; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getSchema() : ?int { return $this->schema; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAuthenticationAlgorithms() : array { return $this->authenticationAlgorithms; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getPublicKeyAlgAndEncodings() : array { return $this->publicKeyAlgAndEncodings; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestationTypes() : array { return $this->attestationTypes; } /** * @return VerificationMethodANDCombinations[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUserVerificationDetails() : array { return $this->userVerificationDetails; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getKeyProtection() : array { return $this->keyProtection; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMatcherProtection() : array { return $this->matcherProtection; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCryptoStrength() : ?int { return $this->cryptoStrength; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttachmentHint() : array { return $this->attachmentHint; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTcDisplay() : array { return $this->tcDisplay; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTcDisplayContentType() : ?string { return $this->tcDisplayContentType; } /** * @return DisplayPNGCharacteristicsDescriptor[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTcDisplayPNGCharacteristics() : array { return $this->tcDisplayPNGCharacteristics; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestationRootCertificates() : array { return $this->attestationRootCertificates; } /** * @return EcdaaTrustAnchor[] * * @deprecated since 4.2.0 and will be removed in 5.0.0. The ECDAA Trust Anchor does no longer exist in Webauthn specification. * @infection-ignore-all */ public function getEcdaaTrustAnchors() : array { return $this->ecdaaTrustAnchors; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getIcon() : ?string { return $this->icon; } /** * @return ExtensionDescriptor[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getSupportedExtensions() : array { return $this->supportedExtensions; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $requiredKeys = ['description', 'authenticatorVersion', 'protocolFamily', 'schema', 'upv', 'authenticationAlgorithms', 'publicKeyAlgAndEncodings', 'attestationTypes', 'userVerificationDetails', 'matcherProtection', 'tcDisplay', 'attestationRootCertificates']; foreach ($requiredKeys as $key) { array_key_exists($key, $data) || throw MetadataStatementLoadingException::create(sprintf('Invalid data. The key "%s" is missing', $key)); } $subObjects = ['authenticationAlgorithms', 'publicKeyAlgAndEncodings', 'attestationTypes', 'matcherProtection', 'tcDisplay', 'attestationRootCertificates']; foreach ($subObjects as $subObject) { is_array($data[$subObject]) || throw MetadataStatementLoadingException::create(sprintf('Invalid Metadata Statement. The parameter "%s" shall be a list of strings.', $subObject)); foreach ($data[$subObject] as $datum) { is_string($datum) || throw MetadataStatementLoadingException::create(sprintf('Invalid Metadata Statement. The parameter "%s" shall be a list of strings.', $subObject)); } } return self::create($data['description'], $data['authenticatorVersion'], $data['protocolFamily'], $data['schema'], \array_map(static function ($upv) : Version { is_array($upv) || throw MetadataStatementLoadingException::create('Invalid Metadata Statement. The parameter "upv" shall be a list of objects.'); return Version::createFromArray($upv); }, $data['upv']), $data['authenticationAlgorithms'], $data['publicKeyAlgAndEncodings'], $data['attestationTypes'], \array_map(static function ($userVerificationDetails) : VerificationMethodANDCombinations { is_array($userVerificationDetails) || throw MetadataStatementLoadingException::create('Invalid Metadata Statement. The parameter "userVerificationDetails" shall be a list of objects.'); return VerificationMethodANDCombinations::createFromArray($userVerificationDetails); }, $data['userVerificationDetails']), $data['matcherProtection'], $data['tcDisplay'], CertificateToolbox::fixPEMStructures($data['attestationRootCertificates']), $data['alternativeDescriptions'] ?? [], $data['legalHeader'] ?? null, $data['aaid'] ?? null, $data['aaguid'] ?? null, $data['attestationCertificateKeyIdentifiers'] ?? [], $data['keyProtection'] ?? [], $data['isKeyRestricted'] ?? null, $data['isFreshUserVerificationRequired'] ?? null, $data['cryptoStrength'] ?? null, $data['attachmentHint'] ?? [], $data['tcDisplayContentType'] ?? null, \array_map(static fn(array $data): DisplayPNGCharacteristicsDescriptor => DisplayPNGCharacteristicsDescriptor::createFromArray($data), $data['tcDisplayPNGCharacteristics'] ?? []), $data['ecdaaTrustAnchors'] ?? [], $data['icon'] ?? null, \array_map(static fn($supportedExtension): ExtensionDescriptor => ExtensionDescriptor::createFromArray($supportedExtension), $data['supportedExtensions'] ?? []), isset($data['authenticatorGetInfo']) ? AuthenticatorGetInfo::create($data['authenticatorGetInfo']) : null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['legalHeader' => $this->legalHeader, 'aaid' => $this->aaid, 'aaguid' => $this->aaguid, 'attestationCertificateKeyIdentifiers' => $this->attestationCertificateKeyIdentifiers, 'description' => $this->description, 'alternativeDescriptions' => $this->alternativeDescriptions, 'authenticatorVersion' => $this->authenticatorVersion, 'protocolFamily' => $this->protocolFamily, 'schema' => $this->schema, 'upv' => $this->upv, 'authenticationAlgorithms' => $this->authenticationAlgorithms, 'publicKeyAlgAndEncodings' => $this->publicKeyAlgAndEncodings, 'attestationTypes' => $this->attestationTypes, 'userVerificationDetails' => $this->userVerificationDetails, 'keyProtection' => $this->keyProtection, 'isKeyRestricted' => $this->isKeyRestricted, 'isFreshUserVerificationRequired' => $this->isFreshUserVerificationRequired, 'matcherProtection' => $this->matcherProtection, 'cryptoStrength' => $this->cryptoStrength, 'attachmentHint' => $this->attachmentHint, 'tcDisplay' => $this->tcDisplay, 'tcDisplayContentType' => $this->tcDisplayContentType, 'tcDisplayPNGCharacteristics' => $this->tcDisplayPNGCharacteristics, 'attestationRootCertificates' => CertificateToolbox::fixPEMStructures($this->attestationRootCertificates), 'ecdaaTrustAnchors' => $this->ecdaaTrustAnchors, 'icon' => $this->icon, 'authenticatorGetInfo' => $this->authenticatorGetInfo, 'supportedExtensions' => $this->supportedExtensions]; return self::filterNullValues($data); } } $info */ public function __construct(public array $info = []) { } /** * @param array $info */ public static function create(array $info = []) : self { return new self($info); } /** * @deprecated since 4.7.0. Please use the constructor directly. * @infection-ignore-all */ public function add(string|int $key, mixed $value) : self { $this->info[$key] = $value; return $this; } /** * @return string[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return $this->info; } } verificationMethods[] = $verificationMethodDescriptor; return $this; } /** * @return VerificationMethodDescriptor[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getVerificationMethods() : array { return $this->verificationMethods; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { return self::create(\array_map(static fn(array $datum): VerificationMethodDescriptor => VerificationMethodDescriptor::createFromArray($datum), $data)); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return $this->verificationMethods; } } certLevel; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getModality() : int|null { return $this->modality; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getEffectiveDate() : ?string { return $this->effectiveDate; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificationDescriptor() : ?string { return $this->certificationDescriptor; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificateNumber() : ?string { return $this->certificateNumber; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificationPolicyVersion() : ?string { return $this->certificationPolicyVersion; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificationRequirementsVersion() : ?string { return $this->certificationRequirementsVersion; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { return self::create($data['certLevel'] ?? null, $data['modality'] ?? null, $data['effectiveDate'] ?? null, $data['certificationDescriptor'] ?? null, $data['certificateNumber'] ?? null, $data['certificationPolicyVersion'] ?? null, $data['certificationRequirementsVersion'] ?? null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['certLevel' => $this->certLevel, 'modality' => $this->modality, 'effectiveDate' => $this->effectiveDate, 'certificationDescriptor' => $this->certificationDescriptor, 'certificateNumber' => $this->certificateNumber, 'certificationPolicyVersion' => $this->certificationPolicyVersion, 'certificationRequirementsVersion' => $this->certificationRequirementsVersion]; return \array_filter($data, static fn($var): bool => $var !== null); } } = 0 || throw MetadataStatementLoadingException::create('Invalid data. The value of "maxRetries" must be a positive integer'); $blockSlowdown >= 0 || throw MetadataStatementLoadingException::create('Invalid data. The value of "blockSlowdown" must be a positive integer'); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMaxRetries() : ?int { return $this->maxRetries; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getBlockSlowdown() : ?int { return $this->blockSlowdown; } } X; } public function getY() : string { return $this->Y; } public function getC() : string { return $this->c; } public function getSx() : string { return $this->sx; } public function getSy() : string { return $this->sy; } public function getG1Curve() : string { return $this->G1Curve; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); foreach (['X', 'Y', 'c', 'sx', 'sy', 'G1Curve'] as $key) { array_key_exists($key, $data) || throw MetadataStatementLoadingException::create(sprintf('Invalid data. The key "%s" is missing', $key)); } return new self(Base64UrlSafe::decode($data['X']), Base64UrlSafe::decode($data['Y']), Base64UrlSafe::decode($data['c']), Base64UrlSafe::decode($data['sx']), Base64UrlSafe::decode($data['sy']), $data['G1Curve']); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['X' => Base64UrlSafe::encodeUnpadded($this->X), 'Y' => Base64UrlSafe::encodeUnpadded($this->Y), 'c' => Base64UrlSafe::encodeUnpadded($this->c), 'sx' => Base64UrlSafe::encodeUnpadded($this->sx), 'sy' => Base64UrlSafe::encodeUnpadded($this->sy), 'G1Curve' => $this->G1Curve]; return self::filterNullValues($data); } } status, [AuthenticatorStatus::ATTESTATION_KEY_COMPROMISE, AuthenticatorStatus::USER_KEY_PHYSICAL_COMPROMISE, AuthenticatorStatus::USER_KEY_REMOTE_COMPROMISE, AuthenticatorStatus::USER_VERIFICATION_BYPASS, AuthenticatorStatus::REVOKED], \true); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getStatus() : string { return $this->status; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getEffectiveDate() : ?string { return $this->effectiveDate; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificate() : ?string { return $this->certificate; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUrl() : ?string { return $this->url; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificationDescriptor() : ?string { return $this->certificationDescriptor; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificateNumber() : ?string { return $this->certificateNumber; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificationPolicyVersion() : ?string { return $this->certificationPolicyVersion; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCertificationRequirementsVersion() : ?string { return $this->certificationRequirementsVersion; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); array_key_exists('status', $data) || throw MetadataStatementLoadingException::create('The key "status" is missing'); foreach (['effectiveDate', 'certificate', 'url', 'certificationDescriptor', 'certificateNumber', 'certificationPolicyVersion', 'certificationRequirementsVersion'] as $key) { if (isset($data[$key])) { $value = $data[$key]; $value === null || is_string($value) || throw MetadataStatementLoadingException::create(sprintf('The value of the key "%s" is invalid', $key)); } } return self::create($data['status'], $data['effectiveDate'] ?? null, $data['certificate'] ?? null, $data['url'] ?? null, $data['certificationDescriptor'] ?? null, $data['certificateNumber'] ?? null, $data['certificationPolicyVersion'] ?? null, $data['certificationRequirementsVersion'] ?? null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['status' => $this->status, 'effectiveDate' => $this->effectiveDate, 'certificate' => $this->certificate, 'url' => $this->url, 'certificationDescriptor' => $this->certificationDescriptor, 'certificateNumber' => $this->certificateNumber, 'certificationPolicyVersion' => $this->certificationPolicyVersion, 'certificationRequirementsVersion' => $this->certificationRequirementsVersion]; return self::filterNullValues($data); } } = 0 || throw MetadataStatementLoadingException::create('The parameter "userVerificationMethod" is invalid'); } public static function create(string $userVerificationMethod, ?CodeAccuracyDescriptor $caDesc = null, ?BiometricAccuracyDescriptor $baDesc = null, ?PatternAccuracyDescriptor $paDesc = null) : self { return new self($userVerificationMethod, $caDesc, $baDesc, $paDesc); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUserVerificationMethod() : string { return $this->userVerificationMethod; } public function userPresence() : bool { return $this->userVerificationMethod === self::USER_VERIFY_PRESENCE_INTERNAL; } public function fingerprint() : bool { return $this->userVerificationMethod === self::USER_VERIFY_FINGERPRINT_INTERNAL; } public function passcodeInternal() : bool { return $this->userVerificationMethod === self::USER_VERIFY_PASSCODE_INTERNAL; } public function voicePrint() : bool { return $this->userVerificationMethod === self::USER_VERIFY_VOICEPRINT_INTERNAL; } public function facePrint() : bool { return $this->userVerificationMethod === self::USER_VERIFY_FACEPRINT_INTERNAL; } public function location() : bool { return $this->userVerificationMethod === self::USER_VERIFY_LOCATION_INTERNAL; } public function eyePrint() : bool { return $this->userVerificationMethod === self::USER_VERIFY_EYEPRINT_INTERNAL; } public function patternInternal() : bool { return $this->userVerificationMethod === self::USER_VERIFY_PATTERN_INTERNAL; } public function handprint() : bool { return $this->userVerificationMethod === self::USER_VERIFY_HANDPRINT_INTERNAL; } public function passcodeExternal() : bool { return $this->userVerificationMethod === self::USER_VERIFY_PASSCODE_EXTERNAL; } public function patternExternal() : bool { return $this->userVerificationMethod === self::USER_VERIFY_PATTERN_EXTERNAL; } public function none() : bool { return $this->userVerificationMethod === self::USER_VERIFY_NONE; } public function all() : bool { return $this->userVerificationMethod === self::USER_VERIFY_ALL; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCaDesc() : ?CodeAccuracyDescriptor { return $this->caDesc; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getBaDesc() : ?BiometricAccuracyDescriptor { return $this->baDesc; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getPaDesc() : ?PatternAccuracyDescriptor { return $this->paDesc; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); if (isset($data['userVerification']) && !isset($data['userVerificationMethod'])) { $data['userVerificationMethod'] = $data['userVerification']; unset($data['userVerification']); } array_key_exists('userVerificationMethod', $data) || throw MetadataStatementLoadingException::create('The parameters "userVerificationMethod" is missing'); foreach (['caDesc', 'baDesc', 'paDesc'] as $key) { if (isset($data[$key])) { is_array($data[$key]) || throw MetadataStatementLoadingException::create(sprintf('Invalid parameter "%s"', $key)); } } $caDesc = isset($data['caDesc']) ? CodeAccuracyDescriptor::createFromArray($data['caDesc']) : null; $baDesc = isset($data['baDesc']) ? BiometricAccuracyDescriptor::createFromArray($data['baDesc']) : null; $paDesc = isset($data['paDesc']) ? PatternAccuracyDescriptor::createFromArray($data['paDesc']) : null; return self::create($data['userVerificationMethod'], $caDesc, $baDesc, $paDesc); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['userVerificationMethod' => $this->userVerificationMethod, 'caDesc' => $this->caDesc, 'baDesc' => $this->baDesc, 'paDesc' => $this->paDesc]; return self::filterNullValues($data); } } $descriptions */ public function __construct(public array $descriptions = []) { } /** * @param array $descriptions */ public static function create(array $descriptions = []) : self { return new self($descriptions); } /** * @return array * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function all() : array { return $this->descriptions; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function add(string $locale, string $description) : self { $this->descriptions[$locale] = $description; return $this; } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return $this->descriptions; } } selfAttestedFRR; } /** * @deprecated since 4.7.0. Please use the property directly. */ public function getSelfAttestedFAR() : ?float { return $this->selfAttestedFAR; } /** * @deprecated since 4.7.0. Please use the property directly. */ public function getMaxTemplates() : ?float { return $this->maxTemplates; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. */ public static function createFromArray(array $data) : self { return self::create($data['selfAttestedFRR'] ?? null, $data['selfAttestedFAR'] ?? null, $data['maxTemplates'] ?? null, $data['maxRetries'] ?? null, $data['blockSlowdown'] ?? null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['selfAttestedFRR' => $this->selfAttestedFRR, 'selfAttestedFAR' => $this->selfAttestedFAR, 'maxTemplates' => $this->maxTemplates, 'maxRetries' => $this->maxRetries, 'blockSlowdown' => $this->blockSlowdown]; return self::filterNullValues($data); } } = 0 || throw MetadataStatementLoadingException::create('Invalid argument "major"'); $minor >= 0 || throw MetadataStatementLoadingException::create('Invalid argument "minor"'); } public static function create(?int $major, ?int $minor) : self { return new self($major, $minor); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMajor() : ?int { return $this->major; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMinor() : ?int { return $this->minor; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); foreach (['major', 'minor'] as $key) { if (array_key_exists($key, $data)) { is_int($data[$key]) || throw MetadataStatementLoadingException::create(sprintf('Invalid value for key "%s"', $key)); } } return self::create($data['major'] ?? null, $data['minor'] ?? null); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['major' => $this->major, 'minor' => $this->minor]; return self::filterNullValues($data); } } = 0 && $r <= 255 || throw MetadataStatementLoadingException::create('The key "r" is invalid'); $g >= 0 && $g <= 255 || throw MetadataStatementLoadingException::create('The key "g" is invalid'); $b >= 0 && $b <= 255 || throw MetadataStatementLoadingException::create('The key "b" is invalid'); } public static function create(int $r, int $g, int $b) : self { return new self($r, $g, $b); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getR() : int { return $this->r; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getG() : int { return $this->g; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getB() : int { return $this->b; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { foreach (['r', 'g', 'b'] as $key) { array_key_exists($key, $data) || throw MetadataStatementLoadingException::create(sprintf('The key "%s" is missing', $key)); is_int($data[$key]) || throw MetadataStatementLoadingException::create(sprintf('The key "%s" is invalid', $key)); } return self::create($data['r'], $data['g'], $data['b']); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return ['r' => $this->r, 'g' => $this->g, 'b' => $this->b]; } } sk; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getDate() : ?string { return $this->date; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { array_key_exists('sk', $data) || throw MetadataStatementLoadingException::create('The key "sk" is missing'); is_string($data['sk']) || throw MetadataStatementLoadingException::create('The key "date" is invalid'); array_key_exists('date', $data) || throw MetadataStatementLoadingException::create('The key "date" is missing'); is_string($data['date']) || throw MetadataStatementLoadingException::create('The key "date" is invalid'); return self::create($data['sk'], $data['date']); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); return ['sk' => $this->sk, 'date' => $this->date]; } } = 0 || throw MetadataStatementLoadingException::create('Invalid width'); $height >= 0 || throw MetadataStatementLoadingException::create('Invalid height'); $bitDepth >= 0 && $bitDepth <= 254 || throw MetadataStatementLoadingException::create('Invalid bit depth'); $colorType >= 0 && $colorType <= 254 || throw MetadataStatementLoadingException::create('Invalid color type'); $compression >= 0 && $compression <= 254 || throw MetadataStatementLoadingException::create('Invalid compression'); $filter >= 0 && $filter <= 254 || throw MetadataStatementLoadingException::create('Invalid filter'); $interlace >= 0 && $interlace <= 254 || throw MetadataStatementLoadingException::create('Invalid interlace'); } /** * @param RgbPaletteEntry[] $plte */ public static function create(int $width, int $height, int $bitDepth, int $colorType, int $compression, int $filter, int $interlace, array $plte = []) : self { return new self($width, $height, $bitDepth, $colorType, $compression, $filter, $interlace, $plte); } /** * @deprecated since 4.7.0. Please use {self::create} directly. * @infection-ignore-all */ public function addPalettes(RgbPaletteEntry ...$rgbPaletteEntries) : self { foreach ($rgbPaletteEntries as $rgbPaletteEntry) { $this->plte[] = $rgbPaletteEntry; } return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getWidth() : int { return $this->width; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getHeight() : int { return $this->height; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getBitDepth() : int { return $this->bitDepth; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getColorType() : int { return $this->colorType; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCompression() : int { return $this->compression; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getFilter() : int { return $this->filter; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getInterlace() : int { return $this->interlace; } /** * @return RgbPaletteEntry[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getPaletteEntries() : array { return $this->plte; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); foreach (['width', 'compression', 'height', 'bitDepth', 'colorType', 'compression', 'filter', 'interlace'] as $key) { array_key_exists($key, $data) || throw MetadataStatementLoadingException::create(sprintf('Invalid data. The key "%s" is missing', $key)); } return self::create($data['width'], $data['height'], $data['bitDepth'], $data['colorType'], $data['compression'], $data['filter'], $data['interlace'], \array_map(static fn(array $item) => RgbPaletteEntry::createFromArray($item), $data['plte'] ?? [])); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['width' => $this->width, 'height' => $this->height, 'bitDepth' => $this->bitDepth, 'colorType' => $this->colorType, 'compression' => $this->compression, 'filter' => $this->filter, 'interlace' => $this->interlace, 'plte' => $this->plte]; return self::filterNullValues($data); } } $data * * @return array */ private static function filterNullValues(array $data) : array { return \array_filter($data, static fn($var): bool => $var !== null); } } create(); } } > */ private array $statusReports = []; private EventDispatcherInterface $dispatcher; private readonly ?SerializerInterface $serializer; /** * @param array $additionalHeaderParameters */ public function __construct(private readonly ?RequestFactoryInterface $requestFactory, private readonly ClientInterface|HttpClientInterface $httpClient, private readonly string $uri, private readonly array $additionalHeaderParameters = [], private readonly ?CertificateChainValidator $certificateChainValidator = null, private readonly ?string $rootCertificateUri = null, ?SerializerInterface $serializer = null) { if ($requestFactory !== null && !$httpClient instanceof HttpClientInterface) { \trigger_deprecation('web-auth/metadata-service', '4.7.0', 'The parameter "$requestFactory" will be removed in 5.0.0. Please set it to null and set an Symfony\\Contracts\\HttpClient\\HttpClientInterface as "$httpClient" argument.'); } $this->serializer = $serializer ?? (new WebauthnSerializerFactory(AttestationStatementSupportManager::create()))->create(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } /** * @param array $additionalHeaderParameters */ public static function create(?RequestFactoryInterface $requestFactory, ClientInterface|HttpClientInterface $httpClient, string $uri, array $additionalHeaderParameters = [], ?CertificateChainValidator $certificateChainValidator = null, ?string $rootCertificateUri = null, ?SerializerInterface $serializer = null) : self { return new self($requestFactory, $httpClient, $uri, $additionalHeaderParameters, $certificateChainValidator, $rootCertificateUri, $serializer); } /** * @return string[] */ public function list() : iterable { $this->loadData(); yield from \array_keys($this->statements); } public function has(string $aaguid) : bool { $this->loadData(); return array_key_exists($aaguid, $this->statements); } public function get(string $aaguid) : MetadataStatement { $this->loadData(); array_key_exists($aaguid, $this->statements) || throw MissingMetadataStatementException::create($aaguid); $mds = $this->statements[$aaguid]; $this->dispatcher->dispatch(MetadataStatementFound::create($mds)); return $mds; } /** * @return StatusReport[] */ public function getStatusReports(string $aaguid) : iterable { $this->loadData(); return $this->statusReports[$aaguid] ?? []; } private function loadData() : void { if ($this->loaded) { return; } $content = $this->fetch($this->uri, $this->additionalHeaderParameters); $jwtCertificates = []; try { $payload = $this->getJwsPayload($content, $jwtCertificates); $this->validateCertificates(...$jwtCertificates); if ($this->serializer !== null) { $blob = $this->serializer->deserialize($payload, MetadataBLOBPayload::class, 'json'); foreach ($blob->entries as $entry) { $mds = $entry->metadataStatement; if ($mds !== null && $entry->aaguid !== null) { $this->statements[$entry->aaguid] = $mds; $this->statusReports[$entry->aaguid] = $entry->statusReports; } } $this->loaded = \true; return; } $data = \json_decode($payload, \true, flags: JSON_THROW_ON_ERROR); foreach ($data['entries'] as $datum) { $entry = MetadataBLOBPayloadEntry::createFromArray($datum); $mds = $entry->metadataStatement; if ($mds !== null && $entry->aaguid !== null) { $this->statements[$entry->aaguid] = $mds; $this->statusReports[$entry->aaguid] = $entry->statusReports; } } } catch (Throwable) { // Nothing to do } $this->loaded = \true; } /** * @param array $headerParameters */ private function fetch(string $uri, array $headerParameters) : string { if ($this->httpClient instanceof HttpClientInterface) { $content = $this->sendSymfonyRequest($uri, $headerParameters); } else { $content = $this->sendPsrRequest($uri, $headerParameters); } $content !== '' || throw MetadataStatementLoadingException::create('Unable to contact the server. The response has no content'); return $content; } /** * @param string[] $rootCertificates */ private function getJwsPayload(string $token, array &$rootCertificates) : string { $jws = (new CompactSerializer())->unserialize($token); $jws->countSignatures() === 1 || throw MetadataStatementLoadingException::create('Invalid response from the metadata service. Only one signature shall be present.'); $signature = $jws->getSignature(0); $payload = $jws->getPayload(); $payload !== '' || throw MetadataStatementLoadingException::create('Invalid response from the metadata service. The token payload is empty.'); $header = $signature->getProtectedHeader(); array_key_exists('alg', $header) || throw MetadataStatementLoadingException::create('The "alg" parameter is missing.'); array_key_exists('x5c', $header) || throw MetadataStatementLoadingException::create('The "x5c" parameter is missing.'); is_array($header['x5c']) || throw MetadataStatementLoadingException::create('The "x5c" parameter should be an array.'); $key = JWKFactory::createFromX5C($header['x5c']); $rootCertificates = $header['x5c']; $verifier = new JWSVerifier(new AlgorithmManager([new ES256(), new RS256()])); $isValid = $verifier->verifyWithKey($jws, $key, 0); $isValid || throw MetadataStatementLoadingException::create('Invalid response from the metadata service. The token signature is invalid.'); $payload = $jws->getPayload(); $payload !== null || throw MetadataStatementLoadingException::create('Invalid response from the metadata service. The payload is missing.'); return $payload; } private function validateCertificates(string ...$untrustedCertificates) : void { if ($this->certificateChainValidator === null || $this->rootCertificateUri === null) { return; } $untrustedCertificates = CertificateToolbox::fixPEMStructures($untrustedCertificates); $rootCertificate = CertificateToolbox::convertDERToPEM($this->fetch($this->rootCertificateUri, [])); $this->certificateChainValidator->check($untrustedCertificates, [$rootCertificate]); } /** * @param array $headerParameters */ private function sendPsrRequest(string $uri, array $headerParameters) : string { $request = $this->requestFactory->createRequest('GET', $uri); foreach ($headerParameters as $k => $v) { $request = $request->withHeader($k, $v); } $response = $this->httpClient->sendRequest($request); $response->getStatusCode() === 200 || throw MetadataStatementLoadingException::create(sprintf('Unable to contact the server. Response code is %d', $response->getStatusCode())); $response->getBody()->rewind(); return $response->getBody()->getContents(); } /** * @param array $headerParameters */ private function sendSymfonyRequest(string $uri, array $headerParameters) : string { $response = $this->httpClient->request('GET', $uri, ['headers' => $headerParameters]); $response->getStatusCode() === 200 || throw MetadataStatementLoadingException::create(sprintf('Unable to contact the server. Response code is %d', $response->getStatusCode())); return $response->getContent(); } } dispatcher = new NullEventDispatcher(); $this->serializer = $serializer ?? (new WebauthnSerializerFactory(AttestationStatementSupportManager::create()))->create(); foreach ($statements as $statement) { $this->addStatement($statement); } } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public function list() : iterable { yield from \array_keys($this->statements); } public function has(string $aaguid) : bool { return array_key_exists($aaguid, $this->statements); } public function get(string $aaguid) : MetadataStatement { array_key_exists($aaguid, $this->statements) || throw MissingMetadataStatementException::create($aaguid); $mds = $this->statements[$aaguid]; $this->dispatcher->dispatch(MetadataStatementFound::create($mds)); return $mds; } private function addStatement(string $statement) : void { if ($this->serializer === null) { $mds = MetadataStatement::createFromString($statement); } else { $mds = $this->serializer->deserialize($statement, MetadataStatement::class, 'json'); } if ($mds->aaguid === null) { return; } $this->statements[$mds->aaguid] = $mds; } } addStatements(MetadataStatement::createFromString($statement)); } $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create(string ...$statements) : self { return new self(...$statements); } public function addStatements(MetadataStatement ...$statements) : self { foreach ($statements as $statement) { $aaguid = $statement->aaguid; if ($aaguid === null) { continue; } $this->statements[$aaguid] = $statement; } return $this; } public function list() : iterable { yield from \array_keys($this->statements); } public function has(string $aaguid) : bool { return array_key_exists($aaguid, $this->statements); } public function get(string $aaguid) : MetadataStatement { array_key_exists($aaguid, $this->statements) || throw MissingMetadataStatementException::create($aaguid); $mds = $this->statements[$aaguid]; $this->dispatcher->dispatch(MetadataStatementFound::create($mds)); return $mds; } } aaid; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAaguid() : ?string { return $this->aaguid; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestationCertificateKeyIdentifiers() : array { return $this->attestationCertificateKeyIdentifiers; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getMetadataStatement() : ?MetadataStatement { return $this->metadataStatement; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function addBiometricStatusReports(BiometricStatusReport ...$biometricStatusReports) : self { foreach ($biometricStatusReports as $biometricStatusReport) { $this->biometricStatusReports[] = $biometricStatusReport; } return $this; } /** * @return BiometricStatusReport[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getBiometricStatusReports() : array { return $this->biometricStatusReports; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function addStatusReports(StatusReport ...$statusReports) : self { foreach ($statusReports as $statusReport) { $this->statusReports[] = $statusReport; } return $this; } /** * @return StatusReport[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getStatusReports() : array { return $this->statusReports; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTimeOfLastStatusChange() : string { return $this->timeOfLastStatusChange; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRogueListURL() : string|null { return $this->rogueListURL; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRogueListHash() : string|null { return $this->rogueListHash; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); array_key_exists('timeOfLastStatusChange', $data) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "timeOfLastStatusChange" is missing'); array_key_exists('statusReports', $data) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "statusReports" is missing'); is_array($data['statusReports']) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "statusReports" shall be an array of StatusReport objects'); return new self($data['timeOfLastStatusChange'], \array_map(static fn(array $statusReport) => StatusReport::createFromArray($statusReport), $data['statusReports']), $data['aaid'] ?? null, $data['aaguid'] ?? null, $data['attestationCertificateKeyIdentifiers'] ?? [], isset($data['metadataStatement']) ? MetadataStatement::createFromArray($data['metadataStatement']) : null, $data['rogueListURL'] ?? null, $data['rogueListHash'] ?? null, \array_map(static fn(array $biometricStatusReport) => BiometricStatusReport::createFromArray($biometricStatusReport), $data['biometricStatusReports'] ?? [])); } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['aaid' => $this->aaid, 'aaguid' => $this->aaguid, 'attestationCertificateKeyIdentifiers' => $this->attestationCertificateKeyIdentifiers, 'statusReports' => $this->statusReports, 'timeOfLastStatusChange' => $this->timeOfLastStatusChange, 'rogueListURL' => $this->rogueListURL, 'rogueListHash' => $this->rogueListHash]; return self::filterNullValues($data); } } $additionalHeaderParameters */ public function __construct(private readonly ?RequestFactoryInterface $requestFactory, private readonly ClientInterface|HttpClientInterface $httpClient, private readonly string $uri, private readonly bool $isBase64Encoded = \false, private readonly array $additionalHeaderParameters = [], ?SerializerInterface $serializer = null) { if ($requestFactory !== null && !$httpClient instanceof HttpClientInterface) { \trigger_deprecation('web-auth/metadata-service', '4.7.0', 'The parameter "$requestFactory" will be removed in 5.0.0. Please set it to null and set an Symfony\\Contracts\\HttpClient\\HttpClientInterface as "$httpClient" argument.'); } $this->serializer = $serializer ?? (new WebauthnSerializerFactory(AttestationStatementSupportManager::create()))->create(); $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } /** * @param array $additionalHeaderParameters */ public static function create(?RequestFactoryInterface $requestFactory, ClientInterface|HttpClientInterface $httpClient, string $uri, bool $isBase64Encoded = \false, array $additionalHeaderParameters = [], ?SerializerInterface $serializer = null) : self { return new self($requestFactory, $httpClient, $uri, $isBase64Encoded, $additionalHeaderParameters, $serializer); } public function list() : iterable { $this->loadData(); $this->statement !== null || throw MetadataStatementLoadingException::create(); $aaguid = $this->statement->aaguid; if ($aaguid === null) { yield from []; } else { yield from [$aaguid]; } } public function has(string $aaguid) : bool { $this->loadData(); $this->statement !== null || throw MetadataStatementLoadingException::create(); return $aaguid === $this->statement->aaguid; } public function get(string $aaguid) : MetadataStatement { $this->loadData(); $this->statement !== null || throw MetadataStatementLoadingException::create(); if ($aaguid === $this->statement->aaguid) { $this->dispatcher->dispatch(MetadataStatementFound::create($this->statement)); return $this->statement; } throw MissingMetadataStatementException::create($aaguid); } private function loadData() : void { if ($this->statement !== null) { return; } $content = $this->fetch(); if ($this->isBase64Encoded) { $content = Base64::decode($content, \true); } if ($this->serializer !== null) { $this->statement = $this->serializer->deserialize($content, MetadataStatement::class, 'json'); return; } $this->statement = MetadataStatement::createFromString($content); } private function fetch() : string { if ($this->httpClient instanceof HttpClientInterface) { $content = $this->sendSymfonyRequest(); } else { $content = $this->sendPsrRequest(); } $content !== '' || throw MetadataStatementLoadingException::create('Unable to contact the server. The response has no content'); return $content; } private function sendPsrRequest() : string { $request = $this->requestFactory->createRequest('GET', $this->uri); foreach ($this->additionalHeaderParameters as $k => $v) { $request = $request->withHeader($k, $v); } $response = $this->httpClient->sendRequest($request); $response->getStatusCode() === 200 || throw MetadataStatementLoadingException::create(sprintf('Unable to contact the server. Response code is %d', $response->getStatusCode())); $response->getBody()->rewind(); return $response->getBody()->getContents(); } private function sendSymfonyRequest() : string { $response = $this->httpClient->request('GET', $this->uri, ['headers' => $this->additionalHeaderParameters]); $response->getStatusCode() === 200 || throw MetadataStatementLoadingException::create(sprintf('Unable to contact the server. Response code is %d', $response->getStatusCode())); return $response->getContent(); } } entries[] = $entry; return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getLegalHeader() : ?string { return $this->legalHeader; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getNo() : int { return $this->no; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getNextUpdate() : string { return $this->nextUpdate; } /** * @return MetadataBLOBPayloadEntry[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getEntries() : array { return $this->entries; } /** * @param array $data * @deprecated since 4.7.0. Please use the symfony/serializer for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $data = self::filterNullValues($data); foreach (['no', 'nextUpdate', 'entries'] as $key) { array_key_exists($key, $data) || throw MetadataStatementLoadingException::create(sprintf('Invalid data. The parameter "%s" is missing', $key)); } is_int($data['no']) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "no" shall be an integer'); is_string($data['nextUpdate']) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "nextUpdate" shall be a string'); is_array($data['entries']) || throw MetadataStatementLoadingException::create('Invalid data. The parameter "entries" shall be a n array of entries'); $object = new self($data['no'], $data['nextUpdate'], $data['legalHeader'] ?? null); foreach ($data['entries'] as $entry) { $object->entries[] = MetadataBLOBPayloadEntry::createFromArray($entry); } return $object; } /** * @return array */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $data = ['legalHeader' => $this->legalHeader, 'nextUpdate' => $this->nextUpdate, 'no' => $this->no, 'entries' => $this->entries]; return self::filterNullValues($data); } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRootCertificates() : array { return $this->rootCertificates; } /** * @param string[] $rootCertificates * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setRootCertificates(array $rootCertificates) : self { $this->rootCertificates = $rootCertificates; return $this; } } serializer = $serializer ?? (new WebauthnSerializerFactory(AttestationStatementSupportManager::create()))->create(); $this->dispatcher = new NullEventDispatcher(); } public static function create(string $filename, bool $isBase64Encoded = \false, ?SerializerInterface $serializer = null) : self { return new self($filename, $isBase64Encoded, $serializer); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public function list() : iterable { $this->loadData(); $this->statement !== null || throw MetadataStatementLoadingException::create(); $aaguid = $this->statement->aaguid; if ($aaguid === null) { yield from []; } else { yield from [$aaguid]; } } public function has(string $aaguid) : bool { $this->loadData(); $this->statement !== null || throw MetadataStatementLoadingException::create(); return $aaguid === $this->statement->aaguid; } public function get(string $aaguid) : MetadataStatement { $this->loadData(); $this->statement !== null || throw MetadataStatementLoadingException::create(); if ($aaguid === $this->statement->aaguid) { $this->dispatcher->dispatch(MetadataStatementFound::create($this->statement)); return $this->statement; } throw MissingMetadataStatementException::create($aaguid); } private function loadData() : void { if ($this->statement !== null) { return; } $content = file_get_contents($this->filename); if ($this->isBase64Encoded) { $content = Base64::decode($content, \true); } if ($this->serializer !== null) { $this->statement = $this->serializer->deserialize($content, MetadataStatement::class, 'json'); } else { $this->statement = MetadataStatement::createFromString($content); } } } addServices($service); } } public static function create(MetadataService ...$services) : self { return new self(...$services); } public function addServices(MetadataService ...$services) : self { foreach ($services as $service) { $this->services[] = $service; } return $this; } public function list() : iterable { foreach ($this->services as $service) { yield from $service->list(); } } public function has(string $aaguid) : bool { foreach ($this->services as $service) { if ($service->has($aaguid)) { return \true; } } return \false; } public function get(string $aaguid) : MetadataStatement { foreach ($this->services as $service) { if ($service->has($aaguid)) { return $service->get($aaguid); } } throw MissingMetadataStatementException::create($aaguid); } } serializer = $serializer ?? (new WebauthnSerializerFactory(AttestationStatementSupportManager::create()))->create(); $this->rootPath = \rtrim($rootPath, DIRECTORY_SEPARATOR); \is_dir($this->rootPath) || throw new InvalidArgumentException('The given parameter is not a valid folder.'); \is_readable($this->rootPath) || throw new InvalidArgumentException('The given parameter is not a valid folder.'); } public static function create(string $rootPath, ?SerializerInterface $serializer = null) : self { return new self($rootPath, $serializer); } public function list() : iterable { $files = \glob($this->rootPath . DIRECTORY_SEPARATOR . '*'); is_array($files) || throw MetadataStatementLoadingException::create('Unable to read files.'); foreach ($files as $file) { if (\is_dir($file) || !\is_readable($file)) { continue; } (yield \basename($file)); } } public function has(string $aaguid) : bool { $filename = $this->rootPath . DIRECTORY_SEPARATOR . $aaguid; return \is_file($filename) && \is_readable($filename); } public function get(string $aaguid) : MetadataStatement { $this->has($aaguid) || throw new InvalidArgumentException(sprintf('The MDS with the AAGUID "%s" does not exist.', $aaguid)); $filename = $this->rootPath . DIRECTORY_SEPARATOR . $aaguid; $data = \trim(file_get_contents($filename)); if ($this->serializer !== null) { $mds = $this->serializer->deserialize($data, MetadataStatement::class, 'json'); } else { $mds = MetadataStatement::createFromString($data); } $mds->aaguid !== null || throw MetadataStatementLoadingException::create('Invalid Metadata Statement.'); return $mds; } } addStatements($statement); } $this->dispatcher = new NullEventDispatcher(); } public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) : void { $this->dispatcher = $eventDispatcher; } public static function create(MetadataStatement ...$statements) : self { return new self(...$statements); } public function addStatements(MetadataStatement ...$statements) : self { foreach ($statements as $statement) { $aaguid = $statement->aaguid; if ($aaguid === null) { continue; } $this->statements[$aaguid] = $statement; } return $this; } public function list() : iterable { yield from \array_keys($this->statements); } public function has(string $aaguid) : bool { return array_key_exists($aaguid, $this->statements); } public function get(string $aaguid) : MetadataStatement { array_key_exists($aaguid, $this->statements) || throw MissingMetadataStatementException::create($aaguid); $mds = $this->statements[$aaguid]; $this->dispatcher->dispatch(MetadataStatementFound::create($mds)); return $mds; } } residentKey === null && $this->requireResidentKey === \true) { $this->residentKey = self::RESIDENT_KEY_REQUIREMENT_REQUIRED; } $this->requireResidentKey = $requireResidentKey ?? ($residentKey === null ? null : $residentKey === self::RESIDENT_KEY_REQUIREMENT_REQUIRED); } public static function create(?string $authenticatorAttachment = null, string $userVerification = self::USER_VERIFICATION_REQUIREMENT_PREFERRED, null|string $residentKey = self::RESIDENT_KEY_REQUIREMENT_NO_PREFERENCE, null|bool $requireResidentKey = null) : self { return new self($authenticatorAttachment, $userVerification, $residentKey, $requireResidentKey); } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setAuthenticatorAttachment(?string $authenticatorAttachment) : self { $this->authenticatorAttachment = $authenticatorAttachment; return $this; } /** * @deprecated since v4.1. Please use the {self::create} instead. * @infection-ignore-all */ public function setRequireResidentKey(bool $requireResidentKey) : self { $this->requireResidentKey = $requireResidentKey; if ($requireResidentKey === \true) { $this->residentKey = self::RESIDENT_KEY_REQUIREMENT_REQUIRED; } return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setUserVerification(string $userVerification) : self { $this->userVerification = $userVerification; return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setResidentKey(null|string $residentKey) : self { $this->residentKey = $residentKey; $this->requireResidentKey = $residentKey === self::RESIDENT_KEY_REQUIREMENT_REQUIRED; return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAuthenticatorAttachment() : ?string { return $this->authenticatorAttachment; } /** * @deprecated Will be removed in 5.0. Please use the property directly. * @infection-ignore-all */ public function isRequireResidentKey() : bool { return $this->requireResidentKey; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUserVerification() : string { return $this->userVerification; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getResidentKey() : null|string { return $this->residentKey; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromString(string $data) : self { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @param mixed[] $json * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : self { $authenticatorAttachment = $json['authenticatorAttachment'] ?? null; $requireResidentKey = $json['requireResidentKey'] ?? null; $userVerification = $json['userVerification'] ?? self::USER_VERIFICATION_REQUIREMENT_PREFERRED; $residentKey = $json['residentKey'] ?? null; $authenticatorAttachment === null || is_string($authenticatorAttachment) || throw InvalidDataException::create($json, 'Invalid "authenticatorAttachment" value'); $requireResidentKey === null || is_bool($requireResidentKey) || throw InvalidDataException::create($json, 'Invalid "requireResidentKey" value'); is_string($userVerification) || throw InvalidDataException::create($json, 'Invalid "userVerification" value'); $residentKey === null || is_string($residentKey) || throw InvalidDataException::create($json, 'Invalid "residentKey" value'); return self::create($authenticatorAttachment ?? null, $userVerification, $residentKey, $requireResidentKey); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $json = ['requireResidentKey' => $this->requireResidentKey, 'userVerification' => $this->userVerification, 'residentKey' => $this->residentKey, 'authenticatorAttachment' => $this->authenticatorAttachment]; foreach ($json as $key => $value) { if ($value === null) { unset($json[$key]); } } return $json; } } $untrustedCertificates * @param array $trustedCertificates */ public function __construct(public readonly array $untrustedCertificates, public readonly array $trustedCertificates, string $message, ?Throwable $previous = null) { parent::__construct($message, $previous); } /** * @param array $untrustedCertificates * @param array $trustedCertificates */ public static function create(array $untrustedCertificates, array $trustedCertificates, string $message = 'Unable to validate the certificate chain.', ?Throwable $previous = null) : self { return new self($untrustedCertificates, $trustedCertificates, $message, $previous); } } $attestation */ public function __construct(public readonly array $attestation, string $message, ?Throwable $previous = null) { parent::__construct($message, $previous); } /** * @param array $attestation */ public static function create(array $attestation, string $message = 'Invalid attestation object', ?Throwable $previous = null) : self { return new self($attestation, $message, $previous); } } __toString(); } } authenticatorAttestationResponse; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getPublicKeyCredentialCreationOptions() : PublicKeyCredentialCreationOptions { return $this->publicKeyCredentialCreationOptions; } /** * @deprecated since 4.5.0 and will be removed in 5.0.0. Please use the `host` property instead * @infection-ignore-all */ public function getRequest() : ServerRequestInterface|string { return $this->host; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getPublicKeyCredentialSource() : PublicKeyCredentialSource { return $this->publicKeyCredentialSource; } } credentialId !== null) { \trigger_deprecation('web-auth/webauthn-lib', '4.6.0', 'The argument "$credentialId" is deprecated since 4.6.0 and will be removed in 5.0.0. Please set null instead.'); } } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getCredentialId() : string { return $this->publicKeyCredentialSource->publicKeyCredentialId; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getAuthenticatorAssertionResponse() : AuthenticatorAssertionResponse { return $this->authenticatorAssertionResponse; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getPublicKeyCredentialRequestOptions() : PublicKeyCredentialRequestOptions { return $this->publicKeyCredentialRequestOptions; } /** * @deprecated since 4.5.0 and will be removed in 5.0.0. Please use the `host` property instead * @infection-ignore-all */ public function getRequest() : ServerRequestInterface|string { return $this->host; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getUserHandle() : ?string { return $this->userHandle; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getPublicKeyCredentialSource() : PublicKeyCredentialSource { return $this->publicKeyCredentialSource; } } credentialId instanceof PublicKeyCredentialSource) { \trigger_deprecation('web-auth/webauthn-lib', '4.6.0', 'Passing a string for the argument "$credentialId" is deprecated since 4.6.0. Please set the PublicKeyCredentialSource instead.'); } } /** * @deprecated since 4.7.0 and will be removed in 5.0.0. Please use the `getCredential()` method instead * @infection-ignore-all */ public function getCredentialId() : string { return $this->credentialId instanceof PublicKeyCredentialSource ? $this->credentialId->publicKeyCredentialId : $this->credentialId; } public function getCredential() : ?PublicKeyCredentialSource { return $this->credentialId instanceof PublicKeyCredentialSource ? $this->credentialId : null; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getAuthenticatorAssertionResponse() : AuthenticatorAssertionResponse { return $this->authenticatorAssertionResponse; } public function getPublicKeyCredentialRequestOptions() : PublicKeyCredentialRequestOptions { return $this->publicKeyCredentialRequestOptions; } /** * @deprecated since 4.5.0 and will be removed in 5.0.0. Please use the `host` property instead * @infection-ignore-all */ public function getRequest() : ServerRequestInterface|string { return $this->host; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getUserHandle() : ?string { return $this->userHandle; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getThrowable() : Throwable { return $this->throwable; } } authenticatorAttestationResponse; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getPublicKeyCredentialCreationOptions() : PublicKeyCredentialCreationOptions { return $this->publicKeyCredentialCreationOptions; } /** * @deprecated since 4.5.0 and will be removed in 5.0.0. Please use the `host` property instead * @infection-ignore-all */ public function getRequest() : ServerRequestInterface|string { return $this->host; } /** * @deprecated since 4.8.0. Will be removed in 5.0.0. Please use the property instead. */ public function getThrowable() : Throwable { return $this->throwable; } } |null $otherUI */ public function __construct(public string $publicKeyCredentialId, public string $type, public array $transports, public string $attestationType, public TrustPath $trustPath, public Uuid $aaguid, public string $credentialPublicKey, public string $userHandle, public int $counter, public ?array $otherUI = null, public ?bool $backupEligible = null, public ?bool $backupStatus = null, public ?bool $uvInitialized = null) { } /** * @param string[] $transports * @param array|null $otherUI */ public static function create(string $publicKeyCredentialId, string $type, array $transports, string $attestationType, TrustPath $trustPath, Uuid $aaguid, string $credentialPublicKey, string $userHandle, int $counter, ?array $otherUI = null, ?bool $backupEligible = null, ?bool $backupStatus = null, ?bool $uvInitialized = null) : self { return new self($publicKeyCredentialId, $type, $transports, $attestationType, $trustPath, $aaguid, $credentialPublicKey, $userHandle, $counter, $otherUI, $backupEligible, $backupStatus, $uvInitialized); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getPublicKeyCredentialId() : string { return $this->publicKeyCredentialId; } public function getPublicKeyCredentialDescriptor() : PublicKeyCredentialDescriptor { return PublicKeyCredentialDescriptor::create($this->type, $this->publicKeyCredentialId, $this->transports); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestationType() : string { return $this->attestationType; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTrustPath() : TrustPath { return $this->trustPath; } public function getAttestedCredentialData() : AttestedCredentialData { return AttestedCredentialData::create($this->aaguid, $this->publicKeyCredentialId, $this->credentialPublicKey); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getType() : string { return $this->type; } /** * @return string[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getTransports() : array { return $this->transports; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAaguid() : Uuid { return $this->aaguid; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCredentialPublicKey() : string { return $this->credentialPublicKey; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUserHandle() : string { return $this->userHandle; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCounter() : int { return $this->counter; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setCounter(int $counter) : void { $this->counter = $counter; } /** * @return array|null * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getOtherUI() : ?array { return $this->otherUI; } /** * @param array|null $otherUI * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function setOtherUI(?array $otherUI) : self { $this->otherUI = $otherUI; return $this; } /** * @param mixed[] $data * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $data) : self { $keys = \array_keys(\get_class_vars(self::class)); foreach ($keys as $key) { if (in_array($key, ['otherUI', 'backupEligible', 'backupStatus', 'uvInitialized'], \true)) { continue; } array_key_exists($key, $data) || throw InvalidDataException::create($data, sprintf('The parameter "%s" is missing', $key)); } \mb_strlen((string) $data['aaguid'], '8bit') === 36 || throw InvalidDataException::create($data, 'Invalid AAGUID'); $uuid = Uuid::fromString($data['aaguid']); try { return self::create(Base64UrlSafe::decodeNoPadding($data['publicKeyCredentialId']), $data['type'], $data['transports'], $data['attestationType'], TrustPathLoader::loadTrustPath($data['trustPath']), $uuid, Base64UrlSafe::decodeNoPadding($data['credentialPublicKey']), Base64UrlSafe::decodeNoPadding($data['userHandle']), $data['counter'], $data['otherUI'] ?? null, $data['backupEligible'] ?? null, $data['backupStatus'] ?? null); } catch (Throwable $throwable) { throw InvalidDataException::create($data, 'Unable to load the data', $throwable); } } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $result = ['publicKeyCredentialId' => Base64UrlSafe::encodeUnpadded($this->publicKeyCredentialId), 'type' => $this->type, 'transports' => $this->transports, 'attestationType' => $this->attestationType, 'trustPath' => $this->trustPath, 'aaguid' => $this->aaguid->__toString(), 'credentialPublicKey' => Base64UrlSafe::encodeUnpadded($this->credentialPublicKey), 'userHandle' => Base64UrlSafe::encodeUnpadded($this->userHandle), 'counter' => $this->counter, 'otherUI' => $this->otherUI, 'backupEligible' => $this->backupEligible, 'backupStatus' => $this->backupStatus, 'uvInitialized' => $this->uvInitialized]; return \array_filter($result, static fn($value): bool => $value !== null); } } pubKeyCredParams[] = $pubKeyCredParam; return $this; } /** * @deprecated since 4.7.0. No replacement. Please use the {self::create} instead. * @infection-ignore-all */ public function addPubKeyCredParams(PublicKeyCredentialParameters ...$pubKeyCredParams) : self { foreach ($pubKeyCredParams as $pubKeyCredParam) { $this->pubKeyCredParams[] = $pubKeyCredParam; } return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function excludeCredential(PublicKeyCredentialDescriptor $excludeCredential) : self { $this->excludeCredentials[] = $excludeCredential; return $this; } /** * @deprecated since 4.7.0. No replacement. Please use the {self::create} instead. * @infection-ignore-all */ public function excludeCredentials(PublicKeyCredentialDescriptor ...$excludeCredentials) : self { foreach ($excludeCredentials as $excludeCredential) { $this->excludeCredentials[] = $excludeCredential; } return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setAuthenticatorSelection(?AuthenticatorSelectionCriteria $authenticatorSelection) : self { $this->authenticatorSelection = $authenticatorSelection; return $this; } /** * @deprecated since 4.7.0. Please use the {self::create} instead. * @infection-ignore-all */ public function setAttestation(string $attestation) : self { in_array($attestation, self::ATTESTATION_CONVEYANCE_PREFERENCES, \true) || throw InvalidDataException::create($attestation, 'Invalid attestation conveyance mode'); $this->attestation = $attestation; return $this; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRp() : PublicKeyCredentialRpEntity { return $this->rp; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getUser() : PublicKeyCredentialUserEntity { return $this->user; } /** * @return PublicKeyCredentialParameters[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getPubKeyCredParams() : array { return $this->pubKeyCredParams; } /** * @return PublicKeyCredentialDescriptor[] * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getExcludeCredentials() : array { return $this->excludeCredentials; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAuthenticatorSelection() : ?AuthenticatorSelectionCriteria { return $this->authenticatorSelection; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getAttestation() : ?string { return $this->attestation; } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromString(string $data) : static { $data = \json_decode($data, \true, flags: JSON_THROW_ON_ERROR); return self::createFromArray($data); } /** * @deprecated since 4.8.0. Please use {Webauthn\Denormalizer\WebauthnSerializerFactory} for converting the object. * @infection-ignore-all */ public static function createFromArray(array $json) : static { array_key_exists('rp', $json) || throw InvalidDataException::create($json, 'Invalid input. "rp" is missing.'); array_key_exists('pubKeyCredParams', $json) || throw InvalidDataException::create($json, 'Invalid input. "pubKeyCredParams" is missing.'); is_array($json['pubKeyCredParams']) || throw InvalidDataException::create($json, 'Invalid input. "pubKeyCredParams" is not an array.'); array_key_exists('challenge', $json) || throw InvalidDataException::create($json, 'Invalid input. "challenge" is missing.'); array_key_exists('attestation', $json) || throw InvalidDataException::create($json, 'Invalid input. "attestation" is missing.'); array_key_exists('user', $json) || throw InvalidDataException::create($json, 'Invalid input. "user" is missing.'); $pubKeyCredParams = []; foreach ($json['pubKeyCredParams'] as $pubKeyCredParam) { if (!is_array($pubKeyCredParam)) { continue; } $pubKeyCredParams[] = PublicKeyCredentialParameters::createFromArray($pubKeyCredParam); } $excludeCredentials = []; if (isset($json['excludeCredentials'])) { foreach ($json['excludeCredentials'] as $excludeCredential) { $excludeCredentials[] = PublicKeyCredentialDescriptor::createFromArray($excludeCredential); } } $challenge = Base64::decode($json['challenge']); $authenticatorSelection = isset($json['authenticatorSelection']) ? AuthenticatorSelectionCriteria::createFromArray($json['authenticatorSelection']) : null; $extensions = isset($json['extensions']) ? AuthenticationExtensionsClientInputs::createFromArray($json['extensions']) : AuthenticationExtensionsClientInputs::create(); return self::create(PublicKeyCredentialRpEntity::createFromArray($json['rp']), PublicKeyCredentialUserEntity::createFromArray($json['user']), $challenge, $pubKeyCredParams, $authenticatorSelection, $json['attestation'] ?? null, $excludeCredentials, $json['timeout'] ?? null, $extensions); } /** * @return mixed[] */ public function jsonSerialize() : array { \trigger_deprecation('web-auth/webauthn-bundle', '4.9.0', 'The "%s" method is deprecated and will be removed in 5.0. Please use the serializer instead.', __METHOD__); $json = ['rp' => $this->rp, 'user' => $this->user, 'challenge' => Base64UrlSafe::encodeUnpadded($this->challenge), 'pubKeyCredParams' => $this->pubKeyCredParams]; if ($this->timeout !== null) { $json['timeout'] = $this->timeout; } if (count($this->excludeCredentials) !== 0) { $json['excludeCredentials'] = $this->excludeCredentials; } if ($this->authenticatorSelection !== null) { $json['authenticatorSelection'] = $this->authenticatorSelection; } if ($this->attestation !== null) { $json['attestation'] = $this->attestation; } if ($this->extensions->count() !== 0) { $json['extensions'] = $this->extensions; } return $json; } } type = $type; $challenge = $data['challenge'] ?? ''; is_string($challenge) || throw InvalidDataException::create($data, 'Invalid parameter "challenge". Shall be a string.'); $challenge = Base64UrlSafe::decodeNoPadding($challenge); $challenge !== '' || throw InvalidDataException::create($data, 'Invalid parameter "challenge". Shall not be empty.'); $this->challenge = $challenge; $origin = $data['origin'] ?? ''; is_string($origin) && $origin !== '' || throw InvalidDataException::create($data, 'Invalid parameter "origin". Shall be a non-empty string.'); $this->origin = $origin; $this->topOrigin = $data['topOrigin'] ?? null; $this->crossOrigin = $data['crossOrigin'] ?? \false; $tokenBinding = $data['tokenBinding'] ?? null; $tokenBinding === null || is_array($tokenBinding) || throw InvalidDataException::create($data, 'Invalid parameter "tokenBinding". Shall be an object or .'); $this->tokenBinding = $tokenBinding; $this->data = $data; } /** * @param mixed[] $data */ public static function create(string $rawData, array $data) : self { return new self($rawData, $data); } public static function createFormJson(string $data) : self { $rawData = Base64UrlSafe::decodeNoPadding($data); $json = \json_decode($rawData, \true, flags: JSON_THROW_ON_ERROR); is_array($json) || throw InvalidDataException::create($data, 'Invalid JSON data.'); return self::create($rawData, $json); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getType() : string { return $this->type; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getChallenge() : string { return $this->challenge; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getOrigin() : string { return $this->origin; } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getCrossOrigin() : bool { return $this->crossOrigin; } /** * @deprecated Since 4.3.0 and will be removed in 5.0.0 * @infection-ignore-all */ public function getTokenBinding() : ?TokenBinding { return $this->tokenBinding === null ? null : TokenBinding::createFormArray($this->tokenBinding); } /** * @deprecated since 4.7.0. Please use the property directly. * @infection-ignore-all */ public function getRawData() : string { return $this->rawData; } /** * @return string[] */ public function all() : array { return \array_keys($this->data); } public function has(string $key) : bool { return array_key_exists($key, $this->data); } public function get(string $key) : mixed { if (!$this->has($key)) { throw InvalidDataException::create($this->data, sprintf('The key "%s" is missing', $key)); } return $this->data[$key]; } } MIT License Copyright (c) 2018 Spomky-Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. COSE Support for PHP ==================== **CBOR Object Signing and Encryption (COSE) Support for PHP** is a **PHP library** that will help you to perform cypher operations using Cose Keys. ![Build Status](https://github.com/web-auth/cose-lib/workflows/Integrate/badge.svg) [![Latest Stable Version](https://poser.pugx.org/web-auth/cose-lib/v/stable.png)](https://packagist.org/packages/web-auth/cose-lib) [![Total Downloads](https://poser.pugx.org/web-auth/cose-lib/downloads.png)](https://packagist.org/packages/web-auth/cose-lib) [![Latest Unstable Version](https://poser.pugx.org/web-auth/cose-lib/v/unstable.png)](https://packagist.org/packages/web-auth/cose-lib) [![License](https://poser.pugx.org/web-auth/cose-lib/license.png)](https://packagist.org/packages/web-auth/cose-lib) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/web-auth/cose-lib/badge)](https://api.securityscorecards.dev/projects/github.com/web-auth/cose-lib) # Installation Install the library with Composer: `composer require web-auth/cose-lib`. # How to use *To be written* # Support I bring solutions to your problems and answer your questions. If you really love that project, and the work I have done or if you want I prioritize your issues, then you can help me out for a couple of :beers: or more! [Become a sponsor](https://github.com/sponsors/Spomky) Or [![Become a Patreon](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/FlorentMorselli) # Contributing Requests for new features, bug fixed and all other ideas to make this library useful are welcome. [Please follow these best practices](doc/Contributing.md). If you discover a security vulnerability within the project, please **don't use the bug tracker and don't publish it publicly**. Instead, all security issues must be sent to security [at] spomky-labs.com. # Licence This software is release under [MIT licence](LICENSE). { "name": "web-auth\/cose-lib", "type": "library", "license": "MIT", "description": "CBOR Object Signing and Encryption (COSE) For PHP", "keywords": [ "COSE", "RFC8152" ], "homepage": "https:\/\/github.com\/web-auth", "authors": [ { "name": "Florent Morselli", "homepage": "https:\/\/github.com\/Spomky" }, { "name": "All contributors", "homepage": "https:\/\/github.com\/web-auth\/cose\/contributors" } ], "require": { "php": ">=8.1", "ext-json": "*", "ext-openssl": "*", "brick\/math": "^0.9|^0.10|^0.11|^0.12", "spomky-labs\/pki-framework": "^1.0" }, "autoload": { "psr-4": { "_ContaoManager\\Cose\\": "src\/" } }, "require-dev": { "infection\/infection": "^0.29", "phpstan\/phpstan": "^1.7", "phpstan\/phpstan-deprecation-rules": "^1.0", "phpstan\/phpstan-phpunit": "^1.1", "phpstan\/phpstan-strict-rules": "^1.2", "phpunit\/phpunit": "^10.1|^11.0", "rector\/rector": "^1.0", "symplify\/easy-coding-standard": "^12.0", "symfony\/phpunit-bridge": "^6.4|^7.0", "ekino\/phpstan-banned-code": "^1.0", "php-parallel-lint\/php-parallel-lint": "^1.3", "qossmic\/deptrac": "^2.0", "phpstan\/extension-installer": "^1.3" }, "autoload-dev": { "psr-4": { "_ContaoManager\\Cose\\Tests\\": "tests\/" } }, "config": { "allow-plugins": { "infection\/extension-installer": true, "phpstan\/extension-installer": true } }, "suggest": { "ext-gmp": "For better performance, please install either GMP (recommended) or BCMath extension", "ext-bcmath": "For better performance, please install either GMP (recommended) or BCMath extension" } }# Security Policy ## Supported Versions | Version | Supported | | ------- |----------------------------------------| | 4.0.x | :white_check_mark: | | 3.3.x | :white_check_mark: (security fix only) | | < 3.3.x | :x: | ## Reporting a Vulnerability If you think you have found a security issue, DO NOT open an issue. You MUST submit email security AT spomky-labs.com length; } /** * Compute the HMAC. */ public function hash(string $text) : string { return \hash($this->hash, $text, \true); } public function name() : string { return $this->hash; } public function t() : string { return $this->t; } } */ private readonly array $data; /** * @param array $data */ public function __construct(array $data) { if (!array_key_exists(self::TYPE, $data)) { throw new InvalidArgumentException('Invalid key: the type is not defined'); } $this->data = $data; } /** * @param array $data */ public static function create(array $data) : self { return new self($data); } /** * @param array $data */ public static function createFromData(array $data) : self { if (!array_key_exists(self::TYPE, $data)) { throw new InvalidArgumentException('Invalid key: the type is not defined'); } return match ($data[self::TYPE]) { '1' => new OkpKey($data), '2' => new Ec2Key($data), '3' => new RsaKey($data), '4' => new SymmetricKey($data), default => self::create($data), }; } public function type() : int|string { return $this->data[self::TYPE]; } public function alg() : int { return (int) $this->get(self::ALG); } /** * @return array */ public function getData() : array { return $this->data; } public function has(int|string $key) : bool { return array_key_exists($key, $this->data); } public function get(int|string $key) : mixed { if (!array_key_exists($key, $this->data)) { throw new InvalidArgumentException(\sprintf('The key has no data at index %d', $key)); } return $this->data[$key]; } } $data */ public function __construct(array $data) { foreach ([self::TYPE] as $key) { if (\is_numeric($data[$key])) { $data[$key] = (int) $data[$key]; } } parent::__construct($data); if ($data[self::TYPE] !== self::TYPE_RSA && $data[self::TYPE] !== self::TYPE_NAME_RSA) { throw new InvalidArgumentException('Invalid RSA key. The key type does not correspond to a RSA key'); } if (!isset($data[self::DATA_N], $data[self::DATA_E])) { throw new InvalidArgumentException('Invalid RSA key. The modulus or the exponent is missing'); } } /** * @param array $data */ public static function create(array $data) : self { return new self($data); } public function n() : string { return $this->get(self::DATA_N); } public function e() : string { return $this->get(self::DATA_E); } public function d() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_D); } public function p() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_P); } public function q() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_Q); } public function dP() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_DP); } public function dQ() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_DQ); } public function QInv() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_QI); } /** * @return array */ public function other() : array { $this->checkKeyIsPrivate(); return $this->get(self::DATA_OTHER); } public function rI() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_RI); } public function dI() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_DI); } public function tI() : string { $this->checkKeyIsPrivate(); return $this->get(self::DATA_TI); } public function hasPrimes() : bool { return $this->has(self::DATA_P) && $this->has(self::DATA_Q); } /** * @return string[] */ public function primes() : array { return [$this->p(), $this->q()]; } public function hasExponents() : bool { return $this->has(self::DATA_DP) && $this->has(self::DATA_DQ); } /** * @return string[] */ public function exponents() : array { return [$this->dP(), $this->dQ()]; } public function hasCoefficient() : bool { return $this->has(self::DATA_QI); } public function isPublic() : bool { return !$this->isPrivate(); } public function isPrivate() : bool { return array_key_exists(self::DATA_D, $this->getData()); } public function asPem() : string { if ($this->isPrivate()) { $privateKey = RSAPrivateKey::create($this->binaryToBigInteger($this->n()), $this->binaryToBigInteger($this->e()), $this->binaryToBigInteger($this->d()), $this->binaryToBigInteger($this->p()), $this->binaryToBigInteger($this->q()), $this->binaryToBigInteger($this->dP()), $this->binaryToBigInteger($this->dQ()), $this->binaryToBigInteger($this->QInv())); return $privateKey->toPEM()->string(); } $publicKey = RSAPublicKey::create($this->binaryToBigInteger($this->n()), $this->binaryToBigInteger($this->e())); $rsaKey = PublicKeyInfo::fromPublicKey($publicKey); return $rsaKey->toPEM()->string(); } public function toPublic() : static { $toBeRemoved = [self::DATA_D, self::DATA_P, self::DATA_Q, self::DATA_DP, self::DATA_DQ, self::DATA_QI, self::DATA_OTHER, self::DATA_RI, self::DATA_DI, self::DATA_TI]; $data = $this->getData(); foreach ($data as $k => $v) { if (in_array($k, $toBeRemoved, \true)) { unset($data[$k]); } } return new static($data); } private function checkKeyIsPrivate() : void { if (!$this->isPrivate()) { throw new InvalidArgumentException('The key is not private.'); } } private function binaryToBigInteger(string $data) : string { $res = \unpack('H*', $data); $res = \current($res); return BigInteger::fromBase($res, 16)->toBase(10); } } $data */ public function __construct(array $data) { parent::__construct($data); if (!isset($data[self::TYPE]) || (int) $data[self::TYPE] !== self::TYPE_OCT) { throw new InvalidArgumentException('Invalid symmetric key. The key type does not correspond to a symmetric key'); } if (!isset($data[self::DATA_K])) { throw new InvalidArgumentException('Invalid symmetric key. The parameter "k" is missing'); } } /** * @param array $data */ public static function create(array $data) : self { return new self($data); } public function k() : string { return $this->get(self::DATA_K); } } '1.2.840.10045.3.1.7', // NIST P-256 / secp256r1 self::CURVE_P256K => '1.3.132.0.10', // NIST P-256K / secp256k1 self::CURVE_P384 => '1.3.132.0.34', // NIST P-384 / secp384r1 self::CURVE_P521 => '1.3.132.0.35', ]; private const CURVE_KEY_LENGTH = [self::CURVE_P256 => 32, self::CURVE_P256K => 32, self::CURVE_P384 => 48, self::CURVE_P521 => 66, self::CURVE_NAME_P256 => 32, self::CURVE_NAME_P256K => 32, self::CURVE_NAME_P384 => 48, self::CURVE_NAME_P521 => 66]; /** * @param array $data */ public function __construct(array $data) { foreach ([self::DATA_CURVE, self::TYPE] as $key) { if (\is_numeric($data[$key])) { $data[$key] = (int) $data[$key]; } } parent::__construct($data); if ($data[self::TYPE] !== self::TYPE_EC2 && $data[self::TYPE] !== self::TYPE_NAME_EC2) { throw new InvalidArgumentException('Invalid EC2 key. The key type does not correspond to an EC2 key'); } if (!isset($data[self::DATA_CURVE], $data[self::DATA_X], $data[self::DATA_Y])) { throw new InvalidArgumentException('Invalid EC2 key. The curve or the "x/y" coordinates are missing'); } if (strlen((string) $data[self::DATA_X]) !== self::CURVE_KEY_LENGTH[$data[self::DATA_CURVE]]) { throw new InvalidArgumentException('Invalid length for x coordinate'); } if (strlen((string) $data[self::DATA_Y]) !== self::CURVE_KEY_LENGTH[$data[self::DATA_CURVE]]) { throw new InvalidArgumentException('Invalid length for y coordinate'); } if (is_int($data[self::DATA_CURVE])) { if (!in_array($data[self::DATA_CURVE], self::SUPPORTED_CURVES_INT, \true)) { throw new InvalidArgumentException('The curve is not supported'); } } elseif (!in_array($data[self::DATA_CURVE], self::SUPPORTED_CURVES_NAMES, \true)) { throw new InvalidArgumentException('The curve is not supported'); } } /** * @param array $data */ public static function create(array $data) : self { return new self($data); } public function toPublic() : self { $data = $this->getData(); unset($data[self::DATA_D]); return new self($data); } public function x() : string { return $this->get(self::DATA_X); } public function y() : string { return $this->get(self::DATA_Y); } public function isPrivate() : bool { return array_key_exists(self::DATA_D, $this->getData()); } public function d() : string { if (!$this->isPrivate()) { throw new InvalidArgumentException('The key is not private.'); } return $this->get(self::DATA_D); } public function curve() : int|string { return $this->get(self::DATA_CURVE); } public function asPEM() : string { if ($this->isPrivate()) { $der = Sequence::create(Integer::create(1), OctetString::create($this->d()), ExplicitlyTaggedType::create(0, ObjectIdentifier::create($this->getCurveOid())), ExplicitlyTaggedType::create(1, BitString::create($this->getUncompressedCoordinates()))); return $this->pem('EC PRIVATE KEY', $der->toDER()); } $der = Sequence::create(Sequence::create(ObjectIdentifier::create('1.2.840.10045.2.1'), ObjectIdentifier::create($this->getCurveOid())), BitString::create($this->getUncompressedCoordinates())); return $this->pem('PUBLIC KEY', $der->toDER()); } public function getUncompressedCoordinates() : string { return "\x04" . $this->x() . $this->y(); } private function getCurveOid() : string { return self::NAMED_CURVE_OID[$this->curve()]; } private function pem(string $type, string $der) : string { return \sprintf("-----BEGIN %s-----\n", \strtoupper($type)) . \chunk_split(\base64_encode($der), 64, "\n") . \sprintf("-----END %s-----\n", \strtoupper($type)); } } $data */ public function __construct(array $data) { foreach ([self::DATA_CURVE, self::TYPE] as $key) { if (\is_numeric($data[$key])) { $data[$key] = (int) $data[$key]; } } parent::__construct($data); if ($data[self::TYPE] !== self::TYPE_OKP && $data[self::TYPE] !== self::TYPE_NAME_OKP) { throw new InvalidArgumentException('Invalid OKP key. The key type does not correspond to an OKP key'); } if (!isset($data[self::DATA_CURVE], $data[self::DATA_X])) { throw new InvalidArgumentException('Invalid EC2 key. The curve or the "x" coordinate is missing'); } if (\is_numeric($data[self::DATA_CURVE])) { if (!in_array((int) $data[self::DATA_CURVE], self::SUPPORTED_CURVES_INT, \true)) { throw new InvalidArgumentException('The curve is not supported'); } } elseif (!in_array($data[self::DATA_CURVE], self::SUPPORTED_CURVES_NAME, \true)) { throw new InvalidArgumentException('The curve is not supported'); } } /** * @param array $data */ public static function create(array $data) : self { return new self($data); } public function x() : string { return $this->get(self::DATA_X); } public function isPrivate() : bool { return array_key_exists(self::DATA_D, $this->getData()); } public function d() : string { if (!$this->isPrivate()) { throw new InvalidArgumentException('The key is not private.'); } return $this->get(self::DATA_D); } public function curve() : int|string { return $this->get(self::DATA_CURVE); } } */ private array $algorithms = []; public static function create() : self { return new self(); } public function add(string $alias, Algorithm $algorithm) : self { $this->algorithms[$alias] = $algorithm; return $this; } /** * @return string[] */ public function list() : iterable { yield from \array_keys($this->algorithms); } /** * @return Algorithm[] */ public function all() : iterable { yield from $this->algorithms; } public function generate(string ...$aliases) : Manager { $manager = Manager::create(); foreach ($aliases as $alias) { if (!array_key_exists($alias, $this->algorithms)) { throw new InvalidArgumentException(\sprintf('The algorithm with alias "%s" is not supported', $alias)); } $manager->add($this->algorithms[$alias]); } return $manager; } } handleKey($key); openssl_sign($data, $signature, $key->asPEM(), $this->getHashAlgorithm()); return ECSignature::fromAsn1($signature, $this->getSignaturePartLength()); } public function verify(string $data, Key $key, string $signature) : bool { $key = $this->handleKey($key); $publicKey = $key->toPublic(); $signature = ECSignature::toAsn1($signature, $this->getSignaturePartLength()); return openssl_verify($data, $signature, $publicKey->asPEM(), $this->getHashAlgorithm()) === 1; } protected abstract function getCurve() : int; protected abstract function getHashAlgorithm() : int; protected abstract function getSignaturePartLength() : int; private function handleKey(Key $key) : Ec2Key { $key = Ec2Key::create($key->getData()); if ($key->curve() !== $this->getCurve()) { throw new InvalidArgumentException('This key cannot be used with this algorithm'); } return $key; } } self::ASN1_MAX_SINGLE_BYTE ? self::ASN1_LENGTH_2BYTES : ''; return hex2bin(self::ASN1_SEQUENCE . $lengthPrefix . dechex($totalLength) . self::ASN1_INTEGER . dechex($lengthR) . $pointR . self::ASN1_INTEGER . dechex($lengthS) . $pointS); } public static function fromAsn1(string $signature, int $length) : string { $message = bin2hex($signature); $position = 0; if (self::readAsn1Content($message, $position, self::BYTE_SIZE) !== self::ASN1_SEQUENCE) { throw new InvalidArgumentException('Invalid data. Should start with a sequence.'); } // @phpstan-ignore-next-line if (self::readAsn1Content($message, $position, self::BYTE_SIZE) === self::ASN1_LENGTH_2BYTES) { $position += self::BYTE_SIZE; } $pointR = self::retrievePositiveInteger(self::readAsn1Integer($message, $position)); $pointS = self::retrievePositiveInteger(self::readAsn1Integer($message, $position)); return hex2bin(str_pad($pointR, $length, '0', STR_PAD_LEFT) . str_pad($pointS, $length, '0', STR_PAD_LEFT)); } private static function octetLength(string $data) : int { return \intdiv(strlen($data), self::BYTE_SIZE); } private static function preparePositiveInteger(string $data) : string { if (substr($data, 0, self::BYTE_SIZE) > self::ASN1_BIG_INTEGER_LIMIT) { return self::ASN1_NEGATIVE_INTEGER . $data; } while (\str_starts_with($data, self::ASN1_NEGATIVE_INTEGER) && substr($data, 2, self::BYTE_SIZE) <= self::ASN1_BIG_INTEGER_LIMIT) { $data = substr($data, 2, null); } return $data; } private static function readAsn1Content(string $message, int &$position, int $length) : string { $content = substr($message, $position, $length); $position += $length; return $content; } private static function readAsn1Integer(string $message, int &$position) : string { if (self::readAsn1Content($message, $position, self::BYTE_SIZE) !== self::ASN1_INTEGER) { throw new InvalidArgumentException('Invalid data. Should contain an integer.'); } $length = (int) hexdec(self::readAsn1Content($message, $position, self::BYTE_SIZE)); return self::readAsn1Content($message, $position, $length * self::BYTE_SIZE); } private static function retrievePositiveInteger(string $data) : string { while (\str_starts_with($data, self::ASN1_NEGATIVE_INTEGER) && substr($data, 2, self::BYTE_SIZE) > self::ASN1_BIG_INTEGER_LIMIT) { $data = substr($data, 2, null); } return $data; } } handleKey($key); if (!$key->isPrivate()) { throw new InvalidArgumentException('The key is not private.'); } try { openssl_sign($data, $signature, $key->asPem(), $this->getHashAlgorithm()); } catch (Throwable $e) { throw new InvalidArgumentException('Unable to sign the data', 0, $e); } return $signature; } public function verify(string $data, Key $key, string $signature) : bool { $key = $this->handleKey($key); return openssl_verify($data, $signature, $key->toPublic()->asPem(), $this->getHashAlgorithm()) === 1; } protected abstract function getHashAlgorithm() : int; private function handleKey(Key $key) : RsaKey { return RsaKey::create($key->getData()); } } handleKey($key); $modulusLength = strlen($key->n()); $em = $this->encodeEMSAPSS($data, 8 * $modulusLength - 1, $this->getHashAlgorithm()); $message = BigInteger::createFromBinaryString($em); $signature = $this->exponentiate($key, $message); return $this->convertIntegerToOctetString($signature, $modulusLength); } public function verify(string $data, Key $key, string $signature) : bool { $key = $this->handleKey($key); $modulusLength = strlen($key->n()); if (strlen($signature) !== $modulusLength) { throw new InvalidArgumentException('Invalid modulus length'); } $s2 = BigInteger::createFromBinaryString($signature); $m2 = $this->exponentiate($key, $s2); $em = $this->convertIntegerToOctetString($m2, $modulusLength); $modBits = 8 * $modulusLength; return $this->verifyEMSAPSS($data, $em, $modBits - 1, $this->getHashAlgorithm()); } /** * Exponentiate with or without Chinese Remainder Theorem. Operation with primes 'p' and 'q' is appox. 2x faster. */ public function exponentiate(RsaKey $key, BigInteger $c) : BigInteger { if ($c->compare(BigInteger::createFromDecimal(0)) < 0 || $c->compare(BigInteger::createFromBinaryString($key->n())) > 0) { throw new RuntimeException(); } if ($key->isPublic() || !$key->hasPrimes() || !$key->hasExponents() || !$key->hasCoefficient()) { return $c->modPow(BigInteger::createFromBinaryString($key->e()), BigInteger::createFromBinaryString($key->n())); } [$pS, $qS] = $key->primes(); [$dPS, $dQS] = $key->exponents(); $qInv = BigInteger::createFromBinaryString($key->QInv()); $p = BigInteger::createFromBinaryString($pS); $q = BigInteger::createFromBinaryString($qS); $dP = BigInteger::createFromBinaryString($dPS); $dQ = BigInteger::createFromBinaryString($dQS); $m1 = $c->modPow($dP, $p); $m2 = $c->modPow($dQ, $q); $h = $qInv->multiply($m1->subtract($m2)->add($p))->mod($p); return $m2->add($h->multiply($q)); } protected abstract function getHashAlgorithm() : Hash; private function handleKey(Key $key) : RsaKey { return RsaKey::create($key->getData()); } private function convertIntegerToOctetString(BigInteger $x, int $xLen) : string { $xB = $x->toBytes(); if (strlen($xB) > $xLen) { throw new RuntimeException('Unable to convert the integer'); } return str_pad($xB, $xLen, chr(0), STR_PAD_LEFT); } /** * MGF1. */ private function getMGF1(string $mgfSeed, int $maskLen, Hash $mgfHash) : string { $t = ''; $count = ceil($maskLen / $mgfHash->getLength()); for ($i = 0; $i < $count; ++$i) { $c = pack('N', $i); $t .= $mgfHash->hash($mgfSeed . $c); } return \substr($t, 0, $maskLen); } /** * EMSA-PSS-ENCODE. */ private function encodeEMSAPSS(string $message, int $modulusLength, Hash $hash) : string { $emLen = $modulusLength + 1 >> 3; $sLen = $hash->getLength(); $mHash = $hash->hash($message); if ($emLen <= $hash->getLength() + $sLen + 2) { throw new RuntimeException(); } $salt = random_bytes($sLen); $m2 = "\x00\x00\x00\x00\x00\x00\x00\x00" . $mHash . $salt; $h = $hash->hash($m2); $ps = str_repeat(chr(0), $emLen - $sLen - $hash->getLength() - 2); $db = $ps . chr(1) . $salt; $dbMask = $this->getMGF1($h, $emLen - $hash->getLength() - 1, $hash); $maskedDB = $db ^ $dbMask; $maskedDB[0] = ~chr(0xff << ($modulusLength & 7)) & $maskedDB[0]; return $maskedDB . $h . chr(0xbc); } /** * EMSA-PSS-VERIFY. */ private function verifyEMSAPSS(string $m, string $em, int $emBits, Hash $hash) : bool { $emLen = $emBits + 1 >> 3; $sLen = $hash->getLength(); $mHash = $hash->hash($m); if ($emLen < $hash->getLength() + $sLen + 2) { throw new InvalidArgumentException(); } if ($em[strlen($em) - 1] !== chr(0xbc)) { throw new InvalidArgumentException(); } $maskedDB = \substr($em, 0, -$hash->getLength() - 1); $h = \substr($em, -$hash->getLength() - 1, $hash->getLength()); $temp = chr(0xff << ($emBits & 7)); if ((~$maskedDB[0] & $temp) !== $temp) { throw new InvalidArgumentException(); } $dbMask = $this->getMGF1($h, $emLen - $hash->getLength() - 1, $hash); $db = $maskedDB ^ $dbMask; $db[0] = ~chr(0xff << ($emBits & 7)) & $db[0]; $temp = $emLen - $hash->getLength() - $sLen - 2; if (!\str_starts_with($db, str_repeat(chr(0), $temp))) { throw new InvalidArgumentException(); } if (ord($db[$temp]) !== 1) { throw new InvalidArgumentException(); } $salt = \substr($db, $temp + 1, null); // should be $sLen long $m2 = "\x00\x00\x00\x00\x00\x00\x00\x00" . $mHash . $salt; $h2 = $hash->hash($m2); return hash_equals($h, $h2); } } handleKey($key); if (!$key->isPrivate()) { throw new InvalidArgumentException('The key is not private.'); } $x = $key->x(); $d = $key->d(); $secret = $d . $x; return match ($key->curve()) { OkpKey::CURVE_ED25519 => sodium_crypto_sign_detached($data, $secret), OkpKey::CURVE_NAME_ED25519 => sodium_crypto_sign_detached($data, $secret), default => throw new InvalidArgumentException('Unsupported curve'), }; } public function verify(string $data, Key $key, string $signature) : bool { $key = $this->handleKey($key); if ($key->curve() !== OkpKey::CURVE_ED25519 && $key->curve() !== OkpKey::CURVE_NAME_ED25519) { throw new InvalidArgumentException('Unsupported curve'); } try { sodium_crypto_sign_verify_detached($signature, $data, $key->x()); } catch (Throwable) { return \false; } return \true; } public static function identifier() : int { return Algorithms::COSE_ALGORITHM_EDDSA; } private function handleKey(Key $key) : OkpKey { return OkpKey::create($key->getData()); } } checKey($key); $signature = \hash_hmac($this->getHashAlgorithm(), $data, (string) $key->get(SymmetricKey::DATA_K), \true); return \substr($signature, 0, \intdiv($this->getSignatureLength(), 8)); } public function verify(string $data, Key $key, string $signature) : bool { return \hash_equals($this->hash($data, $key), $signature); } protected abstract function getHashAlgorithm() : string; protected abstract function getSignatureLength() : int; private function checKey(Key $key) : void { if ($key->type() !== Key::TYPE_OCT && $key->type() !== Key::TYPE_NAME_OCT) { throw new InvalidArgumentException('Invalid key. Must be of type symmetric'); } if (!$key->has(SymmetricKey::DATA_K)) { throw new InvalidArgumentException('Invalid key. The value of the key is missing'); } } } */ private array $algorithms = []; public static function create() : self { return new self(); } public function add(Algorithm ...$algorithms) : self { foreach ($algorithms as $algorithm) { $identifier = $algorithm::identifier(); $this->algorithms[$identifier] = $algorithm; } return $this; } /** * @return iterable */ public function list() : iterable { yield from \array_keys($this->algorithms); } /** * @return iterable */ public function all() : iterable { yield from $this->algorithms; } public function has(int $identifier) : bool { return array_key_exists($identifier, $this->algorithms); } public function get(int $identifier) : Algorithm { if (!$this->has($identifier)) { throw new InvalidArgumentException('Unsupported algorithm'); } return $this->algorithms[$identifier]; } } value->isEqualTo(BrickBigInteger::zero())) { return ''; } $temp = $this->value->toBase(16); $temp = 0 !== (strlen($temp) & 1) ? '0' . $temp : $temp; $temp = hex2bin($temp); return \ltrim($temp, chr(0)); } /** * Adds two BigIntegers. */ public function add(self $y) : self { $value = $this->value->plus($y->value); return new self($value); } /** * Subtracts two BigIntegers. */ public function subtract(self $y) : self { $value = $this->value->minus($y->value); return new self($value); } /** * Multiplies two BigIntegers. */ public function multiply(self $x) : self { $value = $this->value->multipliedBy($x->value); return new self($value); } /** * Performs modular exponentiation. */ public function modPow(self $e, self $n) : self { $value = $this->value->modPow($e->value, $n->value); return new self($value); } /** * Performs modular exponentiation. */ public function mod(self $d) : self { $value = $this->value->mod($d->value); return new self($value); } /** * Compares two numbers. */ public function compare(self $y) : int { return $this->value->compareTo($y->value); } } OPENSSL_ALGO_SHA256, self::COSE_ALGORITHM_ES384 => OPENSSL_ALGO_SHA384, self::COSE_ALGORITHM_ES512 => OPENSSL_ALGO_SHA512, self::COSE_ALGORITHM_RS256 => OPENSSL_ALGO_SHA256, self::COSE_ALGORITHM_RS384 => OPENSSL_ALGO_SHA384, self::COSE_ALGORITHM_RS512 => OPENSSL_ALGO_SHA512, self::COSE_ALGORITHM_RS1 => OPENSSL_ALGO_SHA1]; public final const COSE_HASH_MAP = [self::COSE_ALGORITHM_ES256K => 'sha256', self::COSE_ALGORITHM_ES256 => 'sha256', self::COSE_ALGORITHM_ES384 => 'sha384', self::COSE_ALGORITHM_ES512 => 'sha512', self::COSE_ALGORITHM_RS256 => 'sha256', self::COSE_ALGORITHM_RS384 => 'sha384', self::COSE_ALGORITHM_RS512 => 'sha512', self::COSE_ALGORITHM_PS256 => 'sha256', self::COSE_ALGORITHM_PS384 => 'sha384', self::COSE_ALGORITHM_PS512 => 'sha512', self::COSE_ALGORITHM_RS1 => 'sha1']; public static function getOpensslAlgorithmFor(int $algorithmIdentifier) : int { if (!array_key_exists($algorithmIdentifier, self::COSE_ALGORITHM_MAP)) { throw new InvalidArgumentException('The specified algorithm identifier is not supported'); } return self::COSE_ALGORITHM_MAP[$algorithmIdentifier]; } public static function getHashAlgorithmFor(int $algorithmIdentifier) : string { if (!array_key_exists($algorithmIdentifier, self::COSE_HASH_MAP)) { throw new InvalidArgumentException('The specified algorithm identifier is not supported'); } return self::COSE_HASH_MAP[$algorithmIdentifier]; } } `Composer\XdebugHandler\XdebugHandler` [Unreleased]: https://github.com/composer/xdebug-handler/compare/3.0.5...HEAD [3.0.5]: https://github.com/composer/xdebug-handler/compare/3.0.4...3.0.5 [3.0.4]: https://github.com/composer/xdebug-handler/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/composer/xdebug-handler/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/composer/xdebug-handler/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/composer/xdebug-handler/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/composer/xdebug-handler/compare/2.0.3...3.0.0 [2.0.3]: https://github.com/composer/xdebug-handler/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/composer/xdebug-handler/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/composer/xdebug-handler/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/composer/xdebug-handler/compare/1.4.6...2.0.0 [1.4.6]: https://github.com/composer/xdebug-handler/compare/1.4.5...1.4.6 [1.4.5]: https://github.com/composer/xdebug-handler/compare/1.4.4...1.4.5 [1.4.4]: https://github.com/composer/xdebug-handler/compare/1.4.3...1.4.4 [1.4.3]: https://github.com/composer/xdebug-handler/compare/1.4.2...1.4.3 [1.4.2]: https://github.com/composer/xdebug-handler/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/composer/xdebug-handler/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/composer/xdebug-handler/compare/1.3.3...1.4.0 [1.3.3]: https://github.com/composer/xdebug-handler/compare/1.3.2...1.3.3 [1.3.2]: https://github.com/composer/xdebug-handler/compare/1.3.1...1.3.2 [1.3.1]: https://github.com/composer/xdebug-handler/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/composer/xdebug-handler/compare/1.2.1...1.3.0 [1.2.1]: https://github.com/composer/xdebug-handler/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/composer/xdebug-handler/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/composer/xdebug-handler/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/composer/xdebug-handler/compare/d66f0d15cb57...1.0.0 # composer/xdebug-handler [![packagist](https://img.shields.io/packagist/v/composer/xdebug-handler)](https://packagist.org/packages/composer/xdebug-handler) [![Continuous Integration](https://github.com/composer/xdebug-handler/actions/workflows/continuous-integration.yml/badge.svg?branch=main)](https://github.com/composer/xdebug-handler/actions?query=branch:main) ![license](https://img.shields.io/github/license/composer/xdebug-handler.svg) ![php](https://img.shields.io/packagist/php-v/composer/xdebug-handler?colorB=8892BF) Restart a CLI process without loading the Xdebug extension, unless `xdebug.mode=off`. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. ### Version 3 Removed support for legacy PHP versions and added type declarations. Long term support for version 2 (PHP 5.3.2 - 7.2.4) follows [Composer 2.2 LTS](https://blog.packagist.com/composer-2-2/) policy. ## Installation Install the latest version with: ```bash $ composer require composer/xdebug-handler ``` ## Requirements * PHP 7.2.5 minimum, although using the latest PHP version is highly recommended. ## Basic Usage ```php use Composer\XdebugHandler\XdebugHandler; $xdebug = new XdebugHandler('myapp'); $xdebug->check(); unset($xdebug); ``` The constructor takes a single parameter, `$envPrefix`, which is upper-cased and prepended to default base values to create two distinct environment variables. The above example enables the use of: - `MYAPP_ALLOW_XDEBUG=1` to override automatic restart and allow Xdebug - `MYAPP_ORIGINAL_INIS` to obtain ini file locations in a restarted process ## Advanced Usage * [How it works](#how-it-works) * [Limitations](#limitations) * [Helper methods](#helper-methods) * [Setter methods](#setter-methods) * [Process configuration](#process-configuration) * [Troubleshooting](#troubleshooting) * [Extending the library](#extending-the-library) * [Examples](#examples) ### How it works A temporary ini file is created from the loaded (and scanned) ini files, with any references to the Xdebug extension commented out. Current ini settings are merged, so that most ini settings made on the command-line or by the application are included (see [Limitations](#limitations)) * `MYAPP_ALLOW_XDEBUG` is set with internal data to flag and use in the restart. * The command-line and environment are [configured](#process-configuration) for the restart. * The application is restarted in a new process. * The restart settings are stored in the environment. * `MYAPP_ALLOW_XDEBUG` is unset. * The application runs and exits. * The main process exits with the exit code from the restarted process. See [Examples](#examples) for further information. #### Signal handling Asynchronous signal handling is automatically enabled if the pcntl extension is loaded. `SIGINT` is set to `SIG_IGN` in the parent process and restored to `SIG_DFL` in the restarted process (if no other handler has been set). From PHP 7.4 on Windows, `CTRL+C` and `CTRL+BREAK` handling is automatically enabled in the restarted process and ignored in the parent process. ### Limitations There are a few things to be aware of when running inside a restarted process. * Extensions set on the command-line will not be loaded. * Ini file locations will be reported as per the restart - see [getAllIniFiles()](#getallinifiles-array). * Php sub-processes may be loaded with Xdebug enabled - see [Process configuration](#process-configuration). ### Helper methods These static methods provide information from the current process, regardless of whether it has been restarted or not. #### _getAllIniFiles(): array_ Returns an array of the original ini file locations. Use this instead of calling `php_ini_loaded_file` and `php_ini_scanned_files`, which will report the wrong values in a restarted process. ```php use Composer\XdebugHandler\XdebugHandler; $files = XdebugHandler::getAllIniFiles(); # $files[0] always exists, it could be an empty string $loadedIni = array_shift($files); $scannedInis = $files; ``` These locations are also available in the `MYAPP_ORIGINAL_INIS` environment variable. This is a path-separated string comprising the location returned from `php_ini_loaded_file`, which could be empty, followed by locations parsed from calling `php_ini_scanned_files`. #### _getRestartSettings(): ?array_ Returns an array of settings that can be used with PHP [sub-processes](#sub-processes), or null if the process was not restarted. ```php use Composer\XdebugHandler\XdebugHandler; $settings = XdebugHandler::getRestartSettings(); /** * $settings: array (if the current process was restarted, * or called with the settings from a previous restart), or null * * 'tmpIni' => the temporary ini file used in the restart (string) * 'scannedInis' => if there were any scanned inis (bool) * 'scanDir' => the original PHP_INI_SCAN_DIR value (false|string) * 'phprc' => the original PHPRC value (false|string) * 'inis' => the original inis from getAllIniFiles (array) * 'skipped' => the skipped version from getSkippedVersion (string) */ ``` #### _getSkippedVersion(): string_ Returns the Xdebug version string that was skipped by the restart, or an empty string if there was no restart (or Xdebug is still loaded, perhaps by an extending class restarting for a reason other than removing Xdebug). ```php use Composer\XdebugHandler\XdebugHandler; $version = XdebugHandler::getSkippedVersion(); # $version: '3.1.1' (for example), or an empty string ``` #### _isXdebugActive(): bool_ Returns true if Xdebug is loaded and is running in an active mode (if it supports modes). Returns false if Xdebug is not loaded, or it is running with `xdebug.mode=off`. ### Setter methods These methods implement a fluent interface and must be called before the main `check()` method. #### _setLogger(LoggerInterface $logger): self_ Enables the output of status messages to an external PSR3 logger. All messages are reported with either `DEBUG` or `WARNING` log levels. For example (showing the level and message): ``` // No restart DEBUG Checking MYAPP_ALLOW_XDEBUG DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=off DEBUG No restart (APP_ALLOW_XDEBUG=0) Allowed by xdebug.mode // Restart overridden DEBUG Checking MYAPP_ALLOW_XDEBUG DEBUG The Xdebug extension is loaded (3.1.1) xdebug.mode=coverage,debug,develop DEBUG No restart (MYAPP_ALLOW_XDEBUG=1) // Failed restart DEBUG Checking MYAPP_ALLOW_XDEBUG DEBUG The Xdebug extension is loaded (3.1.0) WARNING No restart (Unable to create temp ini file at: ...) ``` Status messages can also be output with `XDEBUG_HANDLER_DEBUG`. See [Troubleshooting](#troubleshooting). #### _setMainScript(string $script): self_ Sets the location of the main script to run in the restart. This is only needed in more esoteric use-cases, or if the `argv[0]` location is inaccessible. The script name `--` is supported for standard input. #### _setPersistent(): self_ Configures the restart using [persistent settings](#persistent-settings), so that Xdebug is not loaded in any sub-process. Use this method if your application invokes one or more PHP sub-process and the Xdebug extension is not needed. This avoids the overhead of implementing specific [sub-process](#sub-processes) strategies. Alternatively, this method can be used to set up a default _Xdebug-free_ environment which can be changed if a sub-process requires Xdebug, then restored afterwards: ```php function SubProcessWithXdebug() { $phpConfig = new Composer\XdebugHandler\PhpConfig(); # Set the environment to the original configuration $phpConfig->useOriginal(); # run the process with Xdebug loaded ... # Restore Xdebug-free environment $phpConfig->usePersistent(); } ``` ### Process configuration The library offers two strategies to invoke a new PHP process without loading Xdebug, using either _standard_ or _persistent_ settings. Note that this is only important if the application calls a PHP sub-process. #### Standard settings Uses command-line options to remove Xdebug from the new process only. * The -n option is added to the command-line. This tells PHP not to scan for additional inis. * The temporary ini is added to the command-line with the -c option. >_If the new process calls a PHP sub-process, Xdebug will be loaded in that sub-process (unless it implements xdebug-handler, in which case there will be another restart)._ This is the default strategy used in the restart. #### Persistent settings Uses environment variables to remove Xdebug from the new process and persist these settings to any sub-process. * `PHP_INI_SCAN_DIR` is set to an empty string. This tells PHP not to scan for additional inis. * `PHPRC` is set to the temporary ini. >_If the new process calls a PHP sub-process, Xdebug will not be loaded in that sub-process._ This strategy can be used in the restart by calling [setPersistent()](#setpersistent-self). #### Sub-processes The `PhpConfig` helper class makes it easy to invoke a PHP sub-process (with or without Xdebug loaded), regardless of whether there has been a restart. Each of its methods returns an array of PHP options (to add to the command-line) and sets up the environment for the required strategy. The [getRestartSettings()](#getrestartsettings-array) method is used internally. * `useOriginal()` - Xdebug will be loaded in the new process. * `useStandard()` - Xdebug will **not** be loaded in the new process - see [standard settings](#standard-settings). * `userPersistent()` - Xdebug will **not** be loaded in the new process - see [persistent settings](#persistent-settings) If there was no restart, an empty options array is returned and the environment is not changed. ```php use Composer\XdebugHandler\PhpConfig; $config = new PhpConfig; $options = $config->useOriginal(); # $options: empty array # environment: PHPRC and PHP_INI_SCAN_DIR set to original values $options = $config->useStandard(); # $options: [-n, -c, tmpIni] # environment: PHPRC and PHP_INI_SCAN_DIR set to original values $options = $config->usePersistent(); # $options: empty array # environment: PHPRC=tmpIni, PHP_INI_SCAN_DIR='' ``` ### Troubleshooting The following environment settings can be used to troubleshoot unexpected behavior: * `XDEBUG_HANDLER_DEBUG=1` Outputs status messages to `STDERR`, if it is defined, irrespective of any PSR3 logger. Each message is prefixed `xdebug-handler[pid]`, where pid is the process identifier. * `XDEBUG_HANDLER_DEBUG=2` As above, but additionally saves the temporary ini file and reports its location in a status message. ### Extending the library The API is defined by classes and their accessible elements that are not annotated as @internal. The main class has two protected methods that can be overridden to provide additional functionality: #### _requiresRestart(bool $default): bool_ By default the process will restart if Xdebug is loaded and not running with `xdebug.mode=off`. Extending this method allows an application to decide, by returning a boolean (or equivalent) value. It is only called if `MYAPP_ALLOW_XDEBUG` is empty, so it will not be called in the restarted process (where this variable contains internal data), or if the restart has been overridden. Note that the [setMainScript()](#setmainscriptstring-script-self) and [setPersistent()](#setpersistent-self) setters can be used here, if required. #### _restart(array $command): void_ An application can extend this to modify the temporary ini file, its location given in the `tmpIni` property. New settings can be safely appended to the end of the data, which is `PHP_EOL` terminated. The `$command` parameter is an array of unescaped command-line arguments that will be used for the new process. Remember to finish with `parent::restart($command)`. #### Example This example demonstrates two ways to extend basic functionality: * To avoid the overhead of spinning up a new process, the restart is skipped if a simple help command is requested. * The application needs write-access to phar files, so it will force a restart if `phar.readonly` is set (regardless of whether Xdebug is loaded) and change this value in the temporary ini file. ```php use Composer\XdebugHandler\XdebugHandler; use MyApp\Command; class MyRestarter extends XdebugHandler { private $required; protected function requiresRestart(bool $default): bool { if (Command::isHelp()) { # No need to disable Xdebug for this return false; } $this->required = (bool) ini_get('phar.readonly'); return $this->required || $default; } protected function restart(array $command): void { if ($this->required) { # Add required ini setting to tmpIni $content = file_get_contents($this->tmpIni); $content .= 'phar.readonly=0'.PHP_EOL; file_put_contents($this->tmpIni, $content); } parent::restart($command); } } ``` ### Examples The `tests\App` directory contains command-line scripts that demonstrate the internal workings in a variety of scenarios. See [Functional Test Scripts](./tests/App/README.md). ## License composer/xdebug-handler is licensed under the MIT License, see the LICENSE file for details. { "name": "composer\/xdebug-handler", "description": "Restarts a process without Xdebug.", "type": "library", "license": "MIT", "keywords": [ "xdebug", "performance" ], "authors": [ { "name": "John Stevenson", "email": "john-stevenson@blueyonder.co.uk" } ], "support": { "irc": "ircs:\/\/irc.libera.chat:6697\/composer", "issues": "https:\/\/github.com\/composer\/xdebug-handler\/issues" }, "require": { "php": "^7.2.5 || ^8.0", "psr\/log": "^1 || ^2 || ^3", "composer\/pcre": "^1 || ^2 || ^3" }, "require-dev": { "phpstan\/phpstan": "^1.0", "phpstan\/phpstan-strict-rules": "^1.1", "phpunit\/phpunit": "^8.5 || ^9.6 || ^10.5" }, "autoload": { "psr-4": { "Composer\\XdebugHandler\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\XdebugHandler\\Tests\\": "tests" } }, "scripts": { "test": "@php vendor\/bin\/phpunit", "phpstan": "@php vendor\/bin\/phpstan analyse" } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\XdebugHandler; /** * @author John Stevenson * * @phpstan-type restartData array{tmpIni: string, scannedInis: bool, scanDir: false|string, phprc: false|string, inis: string[], skipped: string} */ class PhpConfig { /** * Use the original PHP configuration * * @return string[] Empty array of PHP cli options */ public function useOriginal() : array { $this->getDataAndReset(); return []; } /** * Use standard restart settings * * @return string[] PHP cli options */ public function useStandard() : array { $data = $this->getDataAndReset(); if ($data !== null) { return ['-n', '-c', $data['tmpIni']]; } return []; } /** * Use environment variables to persist settings * * @return string[] Empty array of PHP cli options */ public function usePersistent() : array { $data = $this->getDataAndReset(); if ($data !== null) { $this->updateEnv('PHPRC', $data['tmpIni']); $this->updateEnv('PHP_INI_SCAN_DIR', ''); } return []; } /** * Returns restart data if available and resets the environment * * @phpstan-return restartData|null */ private function getDataAndReset() : ?array { $data = \Composer\XdebugHandler\XdebugHandler::getRestartSettings(); if ($data !== null) { $this->updateEnv('PHPRC', $data['phprc']); $this->updateEnv('PHP_INI_SCAN_DIR', $data['scanDir']); } return $data; } /** * Updates a restart settings value in the environment * * @param string $name * @param string|false $value */ private function updateEnv(string $name, $value) : void { \Composer\XdebugHandler\Process::setEnv($name, \false !== $value ? $value : null); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace Composer\XdebugHandler; use _ContaoManager\Psr\Log\LoggerInterface; use _ContaoManager\Psr\Log\LogLevel; /** * @author John Stevenson * @internal */ class Status { const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; const CHECK = 'Check'; const ERROR = 'Error'; const INFO = 'Info'; const NORESTART = 'NoRestart'; const RESTART = 'Restart'; const RESTARTING = 'Restarting'; const RESTARTED = 'Restarted'; /** @var bool */ private $debug; /** @var string */ private $envAllowXdebug; /** @var string|null */ private $loaded; /** @var LoggerInterface|null */ private $logger; /** @var bool */ private $modeOff; /** @var float */ private $time; /** * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name * @param bool $debug Whether debug output is required */ public function __construct(string $envAllowXdebug, bool $debug) { $start = \getenv(self::ENV_RESTART); \Composer\XdebugHandler\Process::setEnv(self::ENV_RESTART); $this->time = \is_numeric($start) ? \round((\microtime(\true) - $start) * 1000) : 0; $this->envAllowXdebug = $envAllowXdebug; $this->debug = $debug && \defined('STDERR'); $this->modeOff = \false; } /** * Activates status message output to a PSR3 logger * * @return void */ public function setLogger(LoggerInterface $logger) : void { $this->logger = $logger; } /** * Calls a handler method to report a message * * @throws \InvalidArgumentException If $op is not known */ public function report(string $op, ?string $data) : void { if ($this->logger !== null || $this->debug) { $param = (string) $data; switch ($op) { case self::CHECK: $this->reportCheck($param); break; case self::ERROR: $this->reportError($param); break; case self::INFO: $this->reportInfo($param); break; case self::NORESTART: $this->reportNoRestart(); break; case self::RESTART: $this->reportRestart(); break; case self::RESTARTED: $this->reportRestarted(); break; case self::RESTARTING: $this->reportRestarting($param); break; default: throw new \InvalidArgumentException('Unknown op handler: ' . $op); } } } /** * Outputs a status message */ private function output(string $text, ?string $level = null) : void { if ($this->logger !== null) { $this->logger->log($level !== null ? $level : LogLevel::DEBUG, $text); } if ($this->debug) { \fwrite(\STDERR, \sprintf('xdebug-handler[%d] %s', \getmypid(), $text . \PHP_EOL)); } } /** * Checking status message */ private function reportCheck(string $loaded) : void { list($version, $mode) = \explode('|', $loaded); if ($version !== '') { $this->loaded = '(' . $version . ')' . ($mode !== '' ? ' xdebug.mode=' . $mode : ''); } $this->modeOff = $mode === 'off'; $this->output('Checking ' . $this->envAllowXdebug); } /** * Error status message */ private function reportError(string $error) : void { $this->output(\sprintf('No restart (%s)', $error), LogLevel::WARNING); } /** * Info status message */ private function reportInfo(string $info) : void { $this->output($info); } /** * No restart status message */ private function reportNoRestart() : void { $this->output($this->getLoadedMessage()); if ($this->loaded !== null) { $text = \sprintf('No restart (%s)', $this->getEnvAllow()); if (!(bool) \getenv($this->envAllowXdebug)) { $text .= ' Allowed by ' . ($this->modeOff ? 'xdebug.mode' : 'application'); } $this->output($text); } } /** * Restart status message */ private function reportRestart() : void { $this->output($this->getLoadedMessage()); \Composer\XdebugHandler\Process::setEnv(self::ENV_RESTART, (string) \microtime(\true)); } /** * Restarted status message */ private function reportRestarted() : void { $loaded = $this->getLoadedMessage(); $text = \sprintf('Restarted (%d ms). %s', $this->time, $loaded); $level = $this->loaded !== null ? LogLevel::WARNING : null; $this->output($text, $level); } /** * Restarting status message */ private function reportRestarting(string $command) : void { $text = \sprintf('Process restarting (%s)', $this->getEnvAllow()); $this->output($text); $text = 'Running: ' . $command; $this->output($text); } /** * Returns the _ALLOW_XDEBUG environment variable as name=value */ private function getEnvAllow() : string { return $this->envAllowXdebug . '=' . \getenv($this->envAllowXdebug); } /** * Returns the Xdebug status and version */ private function getLoadedMessage() : string { $loaded = $this->loaded !== null ? \sprintf('loaded %s', $this->loaded) : 'not loaded'; return 'The Xdebug extension is ' . $loaded; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace Composer\XdebugHandler; use Composer\Pcre\Preg; use _ContaoManager\Psr\Log\LoggerInterface; /** * @author John Stevenson * * @phpstan-import-type restartData from PhpConfig */ class XdebugHandler { const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; const SUFFIX_INIS = '_ORIGINAL_INIS'; const RESTART_ID = 'internal'; const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; const DEBUG = 'XDEBUG_HANDLER_DEBUG'; /** @var string|null */ protected $tmpIni; /** @var bool */ private static $inRestart; /** @var string */ private static $name; /** @var string|null */ private static $skipped; /** @var bool */ private static $xdebugActive; /** @var string|null */ private static $xdebugMode; /** @var string|null */ private static $xdebugVersion; /** @var bool */ private $cli; /** @var string|null */ private $debug; /** @var string */ private $envAllowXdebug; /** @var string */ private $envOriginalInis; /** @var bool */ private $persistent; /** @var string|null */ private $script; /** @var Status */ private $statusWriter; /** * Constructor * * The $envPrefix is used to create distinct environment variables. It is * uppercased and prepended to the default base values. For example 'myapp' * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. * * @param string $envPrefix Value used in environment variables * @throws \RuntimeException If the parameter is invalid */ public function __construct(string $envPrefix) { if ($envPrefix === '') { throw new \RuntimeException('Invalid constructor parameter'); } self::$name = \strtoupper($envPrefix); $this->envAllowXdebug = self::$name . self::SUFFIX_ALLOW; $this->envOriginalInis = self::$name . self::SUFFIX_INIS; self::setXdebugDetails(); self::$inRestart = \false; if ($this->cli = \PHP_SAPI === 'cli') { $this->debug = (string) \getenv(self::DEBUG); } $this->statusWriter = new \Composer\XdebugHandler\Status($this->envAllowXdebug, (bool) $this->debug); } /** * Activates status message output to a PSR3 logger */ public function setLogger(LoggerInterface $logger) : self { $this->statusWriter->setLogger($logger); return $this; } /** * Sets the main script location if it cannot be called from argv */ public function setMainScript(string $script) : self { $this->script = $script; return $this; } /** * Persist the settings to keep Xdebug out of sub-processes */ public function setPersistent() : self { $this->persistent = \true; return $this; } /** * Checks if Xdebug is loaded and the process needs to be restarted * * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG * environment variable to 1. This variable is used internally so that * the restarted process is created only once. */ public function check() : void { $this->notify(\Composer\XdebugHandler\Status::CHECK, self::$xdebugVersion . '|' . self::$xdebugMode); $envArgs = \explode('|', (string) \getenv($this->envAllowXdebug)); if (!(bool) $envArgs[0] && $this->requiresRestart(self::$xdebugActive)) { // Restart required $this->notify(\Composer\XdebugHandler\Status::RESTART); $command = $this->prepareRestart(); if ($command !== null) { $this->restart($command); } return; } if (self::RESTART_ID === $envArgs[0] && \count($envArgs) === 5) { // Restarted, so unset environment variable and use saved values $this->notify(\Composer\XdebugHandler\Status::RESTARTED); \Composer\XdebugHandler\Process::setEnv($this->envAllowXdebug); self::$inRestart = \true; if (self::$xdebugVersion === null) { // Skipped version is only set if Xdebug is not loaded self::$skipped = $envArgs[1]; } $this->tryEnableSignals(); // Put restart settings in the environment $this->setEnvRestartSettings($envArgs); return; } $this->notify(\Composer\XdebugHandler\Status::NORESTART); $settings = self::getRestartSettings(); if ($settings !== null) { // Called with existing settings, so sync our settings $this->syncSettings($settings); } } /** * Returns an array of php.ini locations with at least one entry * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be an empty string. * * @return non-empty-list */ public static function getAllIniFiles() : array { if (self::$name !== null) { $env = \getenv(self::$name . self::SUFFIX_INIS); if (\false !== $env) { return \explode(\PATH_SEPARATOR, $env); } } $paths = [(string) \php_ini_loaded_file()]; $scanned = \php_ini_scanned_files(); if ($scanned !== \false) { $paths = \array_merge($paths, \array_map('trim', \explode(',', $scanned))); } return $paths; } /** * Returns an array of restart settings or null * * Settings will be available if the current process was restarted, or * called with the settings from an existing restart. * * @phpstan-return restartData|null */ public static function getRestartSettings() : ?array { $envArgs = \explode('|', (string) \getenv(self::RESTART_SETTINGS)); if (\count($envArgs) !== 6 || !self::$inRestart && \php_ini_loaded_file() !== $envArgs[0]) { return null; } return ['tmpIni' => $envArgs[0], 'scannedInis' => (bool) $envArgs[1], 'scanDir' => '*' === $envArgs[2] ? \false : $envArgs[2], 'phprc' => '*' === $envArgs[3] ? \false : $envArgs[3], 'inis' => \explode(\PATH_SEPARATOR, $envArgs[4]), 'skipped' => $envArgs[5]]; } /** * Returns the Xdebug version that triggered a successful restart */ public static function getSkippedVersion() : string { return (string) self::$skipped; } /** * Returns whether Xdebug is loaded and active * * true: if Xdebug is loaded and is running in an active mode. * false: if Xdebug is not loaded, or it is running with xdebug.mode=off. */ public static function isXdebugActive() : bool { self::setXdebugDetails(); return self::$xdebugActive; } /** * Allows an extending class to decide if there should be a restart * * The default is to restart if Xdebug is loaded and its mode is not "off". */ protected function requiresRestart(bool $default) : bool { return $default; } /** * Allows an extending class to access the tmpIni * * @param non-empty-list $command */ protected function restart(array $command) : void { $this->doRestart($command); } /** * Executes the restarted command then deletes the tmp ini * * @param non-empty-list $command * @phpstan-return never */ private function doRestart(array $command) : void { if (\PHP_VERSION_ID >= 70400) { $cmd = $command; $displayCmd = \sprintf('[%s]', \implode(', ', $cmd)); } else { $cmd = \Composer\XdebugHandler\Process::escapeShellCommand($command); if (\defined('PHP_WINDOWS_VERSION_BUILD')) { // Outer quotes required on cmd string below PHP 8 $cmd = '"' . $cmd . '"'; } $displayCmd = $cmd; } $this->tryEnableSignals(); $this->notify(\Composer\XdebugHandler\Status::RESTARTING, $displayCmd); $process = \proc_open($cmd, [], $pipes); if (\is_resource($process)) { $exitCode = \proc_close($process); } if (!isset($exitCode)) { // Unlikely that php or the default shell cannot be invoked $this->notify(\Composer\XdebugHandler\Status::ERROR, 'Unable to restart process'); $exitCode = -1; } else { $this->notify(\Composer\XdebugHandler\Status::INFO, 'Restarted process exited ' . $exitCode); } if ($this->debug === '2') { $this->notify(\Composer\XdebugHandler\Status::INFO, 'Temp ini saved: ' . $this->tmpIni); } else { @\unlink((string) $this->tmpIni); } exit($exitCode); } /** * Returns the command line array if everything was written for the restart * * If any of the following fails (however unlikely) we must return false to * stop potential recursion: * - tmp ini file creation * - environment variable creation * * @return non-empty-list|null */ private function prepareRestart() : ?array { if (!$this->cli) { $this->notify(\Composer\XdebugHandler\Status::ERROR, 'Unsupported SAPI: ' . \PHP_SAPI); return null; } if (($argv = $this->checkServerArgv()) === null) { $this->notify(\Composer\XdebugHandler\Status::ERROR, '$_SERVER[argv] is not as expected'); return null; } if (!$this->checkConfiguration($info)) { $this->notify(\Composer\XdebugHandler\Status::ERROR, $info); return null; } $mainScript = (string) $this->script; if (!$this->checkMainScript($mainScript, $argv)) { $this->notify(\Composer\XdebugHandler\Status::ERROR, 'Unable to access main script: ' . $mainScript); return null; } $tmpDir = \sys_get_temp_dir(); $iniError = 'Unable to create temp ini file at: ' . $tmpDir; if (($tmpfile = @\tempnam($tmpDir, '')) === \false) { $this->notify(\Composer\XdebugHandler\Status::ERROR, $iniError); return null; } $error = null; $iniFiles = self::getAllIniFiles(); $scannedInis = \count($iniFiles) > 1; if (!$this->writeTmpIni($tmpfile, $iniFiles, $error)) { $this->notify(\Composer\XdebugHandler\Status::ERROR, $error ?? $iniError); @\unlink($tmpfile); return null; } if (!$this->setEnvironment($scannedInis, $iniFiles, $tmpfile)) { $this->notify(\Composer\XdebugHandler\Status::ERROR, 'Unable to set environment variables'); @\unlink($tmpfile); return null; } $this->tmpIni = $tmpfile; return $this->getCommand($argv, $tmpfile, $mainScript); } /** * Returns true if the tmp ini file was written * * @param non-empty-list $iniFiles All ini files used in the current process */ private function writeTmpIni(string $tmpFile, array $iniFiles, ?string &$error) : bool { // $iniFiles has at least one item and it may be empty if ($iniFiles[0] === '') { \array_shift($iniFiles); } $content = ''; $sectionRegex = '/^\\s*\\[(?:PATH|HOST)\\s*=/mi'; $xdebugRegex = '/^\\s*(zend_extension\\s*=.*xdebug.*)$/mi'; foreach ($iniFiles as $file) { // Check for inaccessible ini files if (($data = @\file_get_contents($file)) === \false) { $error = 'Unable to read ini: ' . $file; return \false; } // Check and remove directives after HOST and PATH sections if (Preg::isMatchWithOffsets($sectionRegex, $data, $matches)) { $data = \substr($data, 0, $matches[0][1]); } $content .= Preg::replace($xdebugRegex, ';$1', $data) . \PHP_EOL; } // Merge loaded settings into our ini content, if it is valid $config = \parse_ini_string($content); $loaded = \ini_get_all(null, \false); if (\false === $config || \false === $loaded) { $error = 'Unable to parse ini data'; return \false; } $content .= $this->mergeLoadedConfig($loaded, $config); // Work-around for https://bugs.php.net/bug.php?id=75932 $content .= 'opcache.enable_cli=0' . \PHP_EOL; return (bool) @\file_put_contents($tmpFile, $content); } /** * Returns the command line arguments for the restart * * @param non-empty-list $argv * @return non-empty-list */ private function getCommand(array $argv, string $tmpIni, string $mainScript) : array { $php = [\PHP_BINARY]; $args = \array_slice($argv, 1); if (!$this->persistent) { // Use command-line options \array_push($php, '-n', '-c', $tmpIni); } return \array_merge($php, [$mainScript], $args); } /** * Returns true if the restart environment variables were set * * No need to update $_SERVER since this is set in the restarted process. * * @param non-empty-list $iniFiles All ini files used in the current process */ private function setEnvironment(bool $scannedInis, array $iniFiles, string $tmpIni) : bool { $scanDir = \getenv('PHP_INI_SCAN_DIR'); $phprc = \getenv('PHPRC'); // Make original inis available to restarted process if (!\putenv($this->envOriginalInis . '=' . \implode(\PATH_SEPARATOR, $iniFiles))) { return \false; } if ($this->persistent) { // Use the environment to persist the settings if (!\putenv('PHP_INI_SCAN_DIR=') || !\putenv('PHPRC=' . $tmpIni)) { return \false; } } // Flag restarted process and save values for it to use $envArgs = [self::RESTART_ID, self::$xdebugVersion, (int) $scannedInis, \false === $scanDir ? '*' : $scanDir, \false === $phprc ? '*' : $phprc]; return \putenv($this->envAllowXdebug . '=' . \implode('|', $envArgs)); } /** * Logs status messages */ private function notify(string $op, ?string $data = null) : void { $this->statusWriter->report($op, $data); } /** * Returns default, changed and command-line ini settings * * @param mixed[] $loadedConfig All current ini settings * @param mixed[] $iniConfig Settings from user ini files * */ private function mergeLoadedConfig(array $loadedConfig, array $iniConfig) : string { $content = ''; foreach ($loadedConfig as $name => $value) { // Value will either be null, string or array (HHVM only) if (!\is_string($value) || \strpos($name, 'xdebug') === 0 || $name === 'apc.mmap_file_mask') { continue; } if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { // Double-quote escape each value $content .= $name . '="' . \addcslashes($value, '\\"') . '"' . \PHP_EOL; } } return $content; } /** * Returns true if the script name can be used * * @param non-empty-list $argv */ private function checkMainScript(string &$mainScript, array $argv) : bool { if ($mainScript !== '') { // Allow an application to set -- for standard input return \file_exists($mainScript) || '--' === $mainScript; } if (\file_exists($mainScript = $argv[0])) { return \true; } // Use a backtrace to resolve Phar and chdir issues. $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); $main = \end($trace); if ($main !== \false && isset($main['file'])) { return \file_exists($mainScript = $main['file']); } return \false; } /** * Adds restart settings to the environment * * @param non-empty-list $envArgs */ private function setEnvRestartSettings(array $envArgs) : void { $settings = [\php_ini_loaded_file(), $envArgs[2], $envArgs[3], $envArgs[4], \getenv($this->envOriginalInis), self::$skipped]; \Composer\XdebugHandler\Process::setEnv(self::RESTART_SETTINGS, \implode('|', $settings)); } /** * Syncs settings and the environment if called with existing settings * * @phpstan-param restartData $settings */ private function syncSettings(array $settings) : void { if (\false === \getenv($this->envOriginalInis)) { // Called by another app, so make original inis available \Composer\XdebugHandler\Process::setEnv($this->envOriginalInis, \implode(\PATH_SEPARATOR, $settings['inis'])); } self::$skipped = $settings['skipped']; $this->notify(\Composer\XdebugHandler\Status::INFO, 'Process called with existing restart settings'); } /** * Returns true if there are no known configuration issues */ private function checkConfiguration(?string &$info) : bool { if (!\function_exists('proc_open')) { $info = 'proc_open function is disabled'; return \false; } if (!\file_exists(\PHP_BINARY)) { $info = 'PHP_BINARY is not available'; return \false; } if (\extension_loaded('uopz') && !(bool) \ini_get('uopz.disable')) { // uopz works at opcode level and disables exit calls if (\function_exists('uopz_allow_exit')) { @\uopz_allow_exit(\true); } else { $info = 'uopz extension is not compatible'; return \false; } } // Check UNC paths when using cmd.exe if (\defined('PHP_WINDOWS_VERSION_BUILD') && \PHP_VERSION_ID < 70400) { $workingDir = \getcwd(); if ($workingDir === \false) { $info = 'unable to determine working directory'; return \false; } if (0 === \strpos($workingDir, '\\\\')) { $info = 'cmd.exe does not support UNC paths: ' . $workingDir; return \false; } } return \true; } /** * Enables async signals and control interrupts in the restarted process * * Available on Unix PHP 7.1+ with the pcntl extension and Windows PHP 7.4+. */ private function tryEnableSignals() : void { if (\function_exists('pcntl_async_signals') && \function_exists('pcntl_signal')) { \pcntl_async_signals(\true); $message = 'Async signals enabled'; if (!self::$inRestart) { // Restarting, so ignore SIGINT in parent \pcntl_signal(\SIGINT, \SIG_IGN); } elseif (\is_int(\pcntl_signal_get_handler(\SIGINT))) { // Restarted, no handler set so force default action \pcntl_signal(\SIGINT, \SIG_DFL); } } if (!self::$inRestart && \function_exists('sapi_windows_set_ctrl_handler')) { // Restarting, so set a handler to ignore CTRL events in the parent. // This ensures that CTRL+C events will be available in the child // process without having to enable them there, which is unreliable. \sapi_windows_set_ctrl_handler(function ($evt) { }); } } /** * Returns $_SERVER['argv'] if it is as expected * * @return non-empty-list|null */ private function checkServerArgv() : ?array { $result = []; if (isset($_SERVER['argv']) && \is_array($_SERVER['argv'])) { foreach ($_SERVER['argv'] as $value) { if (!\is_string($value)) { return null; } $result[] = $value; } } return \count($result) > 0 ? $result : null; } /** * Sets static properties $xdebugActive, $xdebugVersion and $xdebugMode */ private static function setXdebugDetails() : void { if (self::$xdebugActive !== null) { return; } self::$xdebugActive = \false; if (!\extension_loaded('xdebug')) { return; } $version = \phpversion('xdebug'); self::$xdebugVersion = $version !== \false ? $version : 'unknown'; if (\version_compare(self::$xdebugVersion, '3.1', '>=')) { $modes = \xdebug_info('mode'); self::$xdebugMode = \count($modes) === 0 ? 'off' : \implode(',', $modes); self::$xdebugActive = self::$xdebugMode !== 'off'; return; } // See if xdebug.mode is supported in this version $iniMode = \ini_get('xdebug.mode'); if ($iniMode === \false) { self::$xdebugActive = \true; return; } // Environment value wins but cannot be empty $envMode = (string) \getenv('XDEBUG_MODE'); if ($envMode !== '') { self::$xdebugMode = $envMode; } else { self::$xdebugMode = $iniMode !== '' ? $iniMode : 'off'; } // An empty comma-separated list is treated as mode 'off' if (Preg::isMatch('/^,+$/', \str_replace(' ', '', self::$xdebugMode))) { self::$xdebugMode = 'off'; } self::$xdebugActive = self::$xdebugMode !== 'off'; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ declare (strict_types=1); namespace Composer\XdebugHandler; use Composer\Pcre\Preg; /** * Process utility functions * * @author John Stevenson */ class Process { /** * Escapes a string to be used as a shell argument. * * From https://github.com/johnstevenson/winbox-args * MIT Licensed (c) John Stevenson * * @param string $arg The argument to be escaped * @param bool $meta Additionally escape cmd.exe meta characters * @param bool $module The argument is the module to invoke */ public static function escape(string $arg, bool $meta = \true, bool $module = \false) : string { if (!\defined('PHP_WINDOWS_VERSION_BUILD')) { return "'" . \str_replace("'", "'\\''", $arg) . "'"; } $quote = \strpbrk($arg, " \t") !== \false || $arg === ''; $arg = Preg::replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); $dquotes = (bool) $dquotes; if ($meta) { $meta = $dquotes || Preg::isMatch('/%[^%]+%/', $arg); if (!$meta) { $quote = $quote || \strpbrk($arg, '^&|<>()') !== \false; } elseif ($module && !$dquotes && $quote) { $meta = \false; } } if ($quote) { $arg = '"' . Preg::replace('/(\\\\*)$/', '$1$1', $arg) . '"'; } if ($meta) { $arg = Preg::replace('/(["^&|<>()%])/', '^$1', $arg); } return $arg; } /** * Escapes an array of arguments that make up a shell command * * @param string[] $args Argument list, with the module name first */ public static function escapeShellCommand(array $args) : string { $command = ''; $module = \array_shift($args); if ($module !== null) { $command = self::escape($module, \true, \true); foreach ($args as $arg) { $command .= ' ' . self::escape($arg); } } return $command; } /** * Makes putenv environment changes available in $_SERVER and $_ENV * * @param string $name * @param ?string $value A null value unsets the variable */ public static function setEnv(string $name, ?string $value = null) : bool { $unset = null === $value; if (!\putenv($unset ? $name : $name . '=' . $value)) { return \false; } if ($unset) { unset($_SERVER[$name]); } else { $_SERVER[$name] = $value; } // Update $_ENV if it is being used if (\false !== \stripos((string) \ini_get('variables_order'), 'E')) { if ($unset) { unset($_ENV[$name]); } else { $_ENV[$name] = $value; } } return \true; } } Copyright (C) 2022 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. composer/class-map-generator ============================ Utilities to generate class maps and scan PHP code. [![Continuous Integration](https://github.com/composer/class-map-generator/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/class-map-generator/actions) Installation ------------ Install the latest version with: ```bash composer require composer/class-map-generator ``` Requirements ------------ * PHP 7.2 is required. Basic usage ----------- If all you want is to scan a directory and extract a classmap with all classes/interfaces/traits/enums mapped to their paths, you can simply use: ```php use Composer\ClassMapGenerator\ClassMapGenerator; $map = ClassMapGenerator::createMap('path/to/scan'); foreach ($map as $symbol => $path) { // do your thing } ``` For more advanced usage, you can instantiate a generator object and call scanPaths one or more time then call getClassMap to get a ClassMap object containing the resulting map + eventual warnings. ```php use Composer\ClassMapGenerator\ClassMapGenerator; $generator = new ClassMapGenerator; $generator->scanPaths('path/to/scan'); $generator->scanPaths('path/to/scan2'); $classMap = $generator->getClassMap(); $classMap->sort(); // optionally sort classes alphabetically foreach ($classMap->getMap() as $symbol => $path) { // do your thing } foreach ($classMap->getAmbiguousClasses() as $symbol => $paths) { // warn user about ambiguous class resolution } ``` License ------- composer/class-map-generator is licensed under the MIT License, see the LICENSE file for details. { "name": "composer\/class-map-generator", "description": "Utilities to scan PHP code and generate class maps.", "type": "library", "license": "MIT", "keywords": [ "classmap" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https:\/\/seld.be" } ], "require": { "php": "^7.2 || ^8.0", "symfony\/finder": "^4.4 || ^5.3 || ^6 || ^7", "composer\/pcre": "^2.1 || ^3.1" }, "require-dev": { "phpunit\/phpunit": "^8", "phpstan\/phpstan": "^1.12 || ^2", "phpstan\/phpstan-deprecation-rules": "^1 || ^2", "phpstan\/phpstan-strict-rules": "^1.1 || ^2", "phpstan\/phpstan-phpunit": "^1 || ^2", "symfony\/filesystem": "^5.4 || ^6" }, "autoload": { "psr-4": { "Composer\\ClassMapGenerator\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\ClassMapGenerator\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "scripts": { "test": "@php phpunit", "phpstan": "@php phpstan analyse" } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /* * This file was initially based on a version from the Symfony package. * * (c) Fabien Potencier */ namespace Composer\ClassMapGenerator; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Finder\Finder; use Composer\IO\IOInterface; /** * ClassMapGenerator * * @author Gyula Sallai * @author Jordi Boggiano */ class ClassMapGenerator { /** * @var list */ private $extensions; /** * @var FileList|null */ private $scannedFiles = null; /** * @var ClassMap */ private $classMap; /** * @var non-empty-string */ private $streamWrappersRegex; /** * @param list $extensions File extensions to scan for classes in the given paths */ public function __construct(array $extensions = ['php', 'inc']) { $this->extensions = $extensions; $this->classMap = new \Composer\ClassMapGenerator\ClassMap(); $this->streamWrappersRegex = \sprintf('{^(?:%s)://}', \implode('|', \array_map('preg_quote', \stream_get_wrappers()))); } /** * When calling scanPaths repeatedly with paths that may overlap, calling this will ensure that the same class is never scanned twice * * You can provide your own FileList instance or use the default one if you pass no argument * * @return $this */ public function avoidDuplicateScans(?\Composer\ClassMapGenerator\FileList $scannedFiles = null) : self { $this->scannedFiles = $scannedFiles ?? new \Composer\ClassMapGenerator\FileList(); return $this; } /** * Iterate over all files in the given directory searching for classes * * @param string|\Traversable<\SplFileInfo>|array<\SplFileInfo> $path The path to search in or an array/traversable of SplFileInfo (e.g. symfony/finder instance) * @return array A class map array * * @throws \RuntimeException When the path is neither an existing file nor directory */ public static function createMap($path) : array { $generator = new self(); $generator->scanPaths($path); return $generator->getClassMap()->getMap(); } public function getClassMap() : \Composer\ClassMapGenerator\ClassMap { return $this->classMap; } /** * Iterate over all files in the given directory searching for classes * * @param string|\Traversable<\SplFileInfo>|array<\SplFileInfo> $path The path to search in or an array/traversable of SplFileInfo (e.g. symfony/finder instance) * @param non-empty-string|null $excluded Regex that matches file paths to be excluded from the classmap * @param 'classmap'|'psr-0'|'psr-4' $autoloadType Optional autoload standard to use mapping rules with the namespace instead of purely doing a classmap * @param string|null $namespace Optional namespace prefix to filter by, only for psr-0/psr-4 autoloading * @param array $excludedDirs Optional dirs to exclude from search relative to $path * * @throws \RuntimeException When the path is neither an existing file nor directory */ public function scanPaths($path, ?string $excluded = null, string $autoloadType = 'classmap', ?string $namespace = null, array $excludedDirs = []) : void { if (!\in_array($autoloadType, ['psr-0', 'psr-4', 'classmap'], \true)) { throw new \InvalidArgumentException('$autoloadType must be one of: "psr-0", "psr-4" or "classmap"'); } if ('classmap' !== $autoloadType) { if (!\is_string($path)) { throw new \InvalidArgumentException('$path must be a string when specifying a psr-0 or psr-4 autoload type'); } if (!\is_string($namespace)) { throw new \InvalidArgumentException('$namespace must be given (even if it is an empty string if you do not want to filter) when specifying a psr-0 or psr-4 autoload type'); } $basePath = $path; } if (\is_string($path)) { if (\is_file($path)) { $path = [new \SplFileInfo($path)]; } elseif (\is_dir($path) || \strpos($path, '*') !== \false) { $path = Finder::create()->files()->followLinks()->name('/\\.(?:' . \implode('|', \array_map('preg_quote', $this->extensions)) . ')$/')->in($path)->exclude($excludedDirs); } else { throw new \RuntimeException('Could not scan for classes inside "' . $path . '" which does not appear to be a file nor a folder'); } } $cwd = \realpath(self::getCwd()); foreach ($path as $file) { $filePath = $file->getPathname(); if (!\in_array(\pathinfo($filePath, \PATHINFO_EXTENSION), $this->extensions, \true)) { continue; } $isStreamWrapperPath = Preg::isMatch($this->streamWrappersRegex, $filePath); if (!self::isAbsolutePath($filePath) && !$isStreamWrapperPath) { $filePath = $cwd . '/' . $filePath; $filePath = self::normalizePath($filePath); } else { $filePath = Preg::replace('{(?getPathname()); } $realPath = $isStreamWrapperPath ? $filePath : \realpath($filePath); // fallback just in case but this really should not happen if (\false === $realPath) { throw new \RuntimeException('realpath of ' . $filePath . ' failed to resolve, got false'); } // if a list of scanned files is given, avoid scanning twice the same file to save cycles and avoid generating warnings // in case a PSR-0/4 declaration follows another more specific one, or a classmap declaration, which covered this file already if ($this->scannedFiles !== null && $this->scannedFiles->contains($realPath)) { continue; } // check the realpath of the file against the excluded paths as the path might be a symlink and the excluded path is realpath'd so symlink are resolved if (null !== $excluded && Preg::isMatch($excluded, \strtr($realPath, '\\', '/'))) { continue; } // check non-realpath of file for directories symlink in project dir if (null !== $excluded && Preg::isMatch($excluded, \strtr($filePath, '\\', '/'))) { continue; } $classes = \Composer\ClassMapGenerator\PhpFileParser::findClasses($filePath); if ('classmap' !== $autoloadType && isset($namespace)) { $classes = $this->filterByNamespace($classes, $filePath, $namespace, $autoloadType, $basePath); // if no valid class was found in the file then we do not mark it as scanned as it might still be matched by another rule later if (\count($classes) > 0 && $this->scannedFiles !== null) { $this->scannedFiles->add($realPath); } } elseif ($this->scannedFiles !== null) { // classmap autoload rules always collect all classes so for these we definitely do not want to scan again $this->scannedFiles->add($realPath); } foreach ($classes as $class) { if (!$this->classMap->hasClass($class)) { $this->classMap->addClass($class, $filePath); } elseif ($filePath !== $this->classMap->getClassPath($class)) { $this->classMap->addAmbiguousClass($class, $filePath); } } } } /** * Remove classes which could not have been loaded by namespace autoloaders * * @param array $classes found classes in given file * @param string $filePath current file * @param string $baseNamespace prefix of given autoload mapping * @param 'psr-0'|'psr-4' $namespaceType * @param string $basePath root directory of given autoload mapping * @return array valid classes * * @throws \InvalidArgumentException When namespaceType is neither psr-0 nor psr-4 */ private function filterByNamespace(array $classes, string $filePath, string $baseNamespace, string $namespaceType, string $basePath) : array { $validClasses = []; $rejectedClasses = []; $realSubPath = \substr($filePath, \strlen($basePath) + 1); $dotPosition = \strrpos($realSubPath, '.'); $realSubPath = \substr($realSubPath, 0, $dotPosition === \false ? \PHP_INT_MAX : $dotPosition); foreach ($classes as $class) { // transform class name to file path and validate if ('psr-0' === $namespaceType) { $namespaceLength = \strrpos($class, '\\'); if (\false !== $namespaceLength) { $namespace = \substr($class, 0, $namespaceLength + 1); $className = \substr($class, $namespaceLength + 1); $subPath = \str_replace('\\', \DIRECTORY_SEPARATOR, $namespace) . \str_replace('_', \DIRECTORY_SEPARATOR, $className); } else { $subPath = \str_replace('_', \DIRECTORY_SEPARATOR, $class); } } elseif ('psr-4' === $namespaceType) { $subNamespace = '' !== $baseNamespace ? \substr($class, \strlen($baseNamespace)) : $class; $subPath = \str_replace('\\', \DIRECTORY_SEPARATOR, $subNamespace); } else { throw new \InvalidArgumentException('$namespaceType must be "psr-0" or "psr-4"'); } if ($subPath === $realSubPath) { $validClasses[] = $class; } else { $rejectedClasses[] = $class; } } // warn only if no valid classes, else silently skip invalid if (\count($validClasses) === 0) { $cwd = \realpath(self::getCwd()); if ($cwd === \false) { $cwd = self::getCwd(); } $cwd = self::normalizePath($cwd); $shortPath = Preg::replace('{^' . \preg_quote($cwd) . '}', '.', self::normalizePath($filePath), 1); $shortBasePath = Preg::replace('{^' . \preg_quote($cwd) . '}', '.', self::normalizePath($basePath), 1); foreach ($rejectedClasses as $class) { $this->classMap->addPsrViolation("Class {$class} located in {$shortPath} does not comply with {$namespaceType} autoloading standard (rule: {$baseNamespace} => {$shortBasePath}). Skipping.", $class, $filePath); } return []; } return $validClasses; } /** * Checks if the given path is absolute * * @see Composer\Util\Filesystem::isAbsolutePath * * @param string $path * @return bool */ private static function isAbsolutePath(string $path) { return \strpos($path, '/') === 0 || \substr($path, 1, 1) === ':' || \strpos($path, '\\\\') === 0; } /** * Normalize a path. This replaces backslashes with slashes, removes ending * slash and collapses redundant separators and up-level references. * * @see Composer\Util\Filesystem::normalizePath * * @param string $path Path to the file or directory * @return string */ private static function normalizePath(string $path) { $parts = []; $path = \strtr($path, '\\', '/'); $prefix = ''; $absolute = ''; // extract windows UNC paths e.g. \\foo\bar if (\strpos($path, '//') === 0 && \strlen($path) > 2) { $absolute = '//'; $path = \substr($path, 2); } // extract a prefix being a protocol://, protocol:, protocol://drive: or simply drive: if (Preg::isMatchStrictGroups('{^( [0-9a-z]{2,}+: (?: // (?: [a-z]: )? )? | [a-z]: )}ix', $path, $match)) { $prefix = $match[1]; $path = \substr($path, \strlen($prefix)); } if (\strpos($path, '/') === 0) { $absolute = '/'; $path = \substr($path, 1); } $up = \false; foreach (\explode('/', $path) as $chunk) { if ('..' === $chunk && (\strlen($absolute) > 0 || $up)) { \array_pop($parts); $up = !(\count($parts) === 0 || '..' === \end($parts)); } elseif ('.' !== $chunk && '' !== $chunk) { $parts[] = $chunk; $up = '..' !== $chunk; } } // ensure c: is normalized to C: $prefix = Preg::replaceCallback('{(?:^|://)[a-z]:$}i', function (array $m) { return \strtoupper((string) $m[0]); }, $prefix); return $prefix . $absolute . \implode('/', $parts); } /** * @see Composer\Util\Platform::getCwd */ private static function getCwd() : string { $cwd = \getcwd(); if (\false === $cwd) { throw new \RuntimeException('Could not determine the current working directory'); } return $cwd; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\ClassMapGenerator; use Composer\Pcre\Preg; /** * @author Jordi Boggiano * @internal */ class PhpFileCleaner { /** @var array */ private static $typeConfig; /** @var non-empty-string */ private static $restPattern; /** * @readonly * @var string */ private $contents; /** * @readonly * @var int */ private $len; /** * @readonly * @var int */ private $maxMatches; /** @var int */ private $index = 0; /** * @param string[] $types */ public static function setTypeConfig(array $types) : void { foreach ($types as $type) { self::$typeConfig[$type[0]] = array('name' => $type, 'length' => \strlen($type), 'pattern' => '{.\\b(?])' . $type . '\\s++[a-zA-Z_\\x7f-\\xff:][a-zA-Z0-9_\\x7f-\\xff:\\-]*+}Ais'); } self::$restPattern = '{[^?"\'contents = $contents; $this->len = \strlen($this->contents); $this->maxMatches = $maxMatches; } public function clean() : string { $clean = ''; while ($this->index < $this->len) { $this->skipToPhp(); $clean .= 'index < $this->len) { $char = $this->contents[$this->index]; if ($char === '?' && $this->peek('>')) { $clean .= '?>'; $this->index += 2; continue 2; } if ($char === '"') { $this->skipString('"'); $clean .= 'null'; continue; } if ($char === "'") { $this->skipString("'"); $clean .= 'null'; continue; } if ($char === "<" && $this->peek('<') && $this->match('{<<<[ \\t]*+([\'"]?)([a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*+)\\1(?:\\r\\n|\\n|\\r)}A', $match)) { $this->index += \strlen($match[0]); $this->skipHeredoc($match[2]); $clean .= 'null'; continue; } if ($char === '/') { if ($this->peek('/')) { $this->skipToNewline(); continue; } if ($this->peek('*')) { $this->skipComment(); continue; } } if ($this->maxMatches === 1 && isset(self::$typeConfig[$char])) { $type = self::$typeConfig[$char]; if (\substr($this->contents, $this->index, $type['length']) === $type['name'] && Preg::isMatch($type['pattern'], $this->contents, $match, 0, $this->index - 1)) { $clean .= $match[0]; return $clean; } } $this->index += 1; if ($this->match(self::$restPattern, $match)) { $clean .= $char . $match[0]; $this->index += \strlen($match[0]); } else { $clean .= $char; } } } return $clean; } private function skipToPhp() : void { while ($this->index < $this->len) { if ($this->contents[$this->index] === '<' && $this->peek('?')) { $this->index += 2; break; } $this->index += 1; } } private function skipString(string $delimiter) : void { $this->index += 1; while ($this->index < $this->len) { if ($this->contents[$this->index] === '\\' && ($this->peek('\\') || $this->peek($delimiter))) { $this->index += 2; continue; } if ($this->contents[$this->index] === $delimiter) { $this->index += 1; break; } $this->index += 1; } } private function skipComment() : void { $this->index += 2; while ($this->index < $this->len) { if ($this->contents[$this->index] === '*' && $this->peek('/')) { $this->index += 2; break; } $this->index += 1; } } private function skipToNewline() : void { while ($this->index < $this->len) { if ($this->contents[$this->index] === "\r" || $this->contents[$this->index] === "\n") { return; } $this->index += 1; } } private function skipHeredoc(string $delimiter) : void { $firstDelimiterChar = $delimiter[0]; $delimiterLength = \strlen($delimiter); $delimiterPattern = '{' . \preg_quote($delimiter) . '(?![a-zA-Z0-9_\\x80-\\xff])}A'; while ($this->index < $this->len) { // check if we find the delimiter after some spaces/tabs switch ($this->contents[$this->index]) { case "\t": case " ": $this->index += 1; continue 2; case $firstDelimiterChar: if (\substr($this->contents, $this->index, $delimiterLength) === $delimiter && $this->match($delimiterPattern)) { $this->index += $delimiterLength; return; } break; } // skip the rest of the line while ($this->index < $this->len) { $this->skipToNewline(); // skip newlines while ($this->index < $this->len && ($this->contents[$this->index] === "\r" || $this->contents[$this->index] === "\n")) { $this->index += 1; } break; } } } private function peek(string $char) : bool { return $this->index + 1 < $this->len && $this->contents[$this->index + 1] === $char; } /** * @param non-empty-string $regex * @param null|array $match * @param-out array $match */ private function match(string $regex, ?array &$match = null) : bool { return Preg::isMatchStrictGroups($regex, $this->contents, $match, 0, $this->index); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\ClassMapGenerator; /** * Contains a list of files which were scanned to generate a classmap * * @author Jordi Boggiano */ class FileList { /** * @var array */ public $files = []; /** * @param non-empty-string $path */ public function add(string $path) : void { $this->files[$path] = \true; } /** * @param non-empty-string $path */ public function contains(string $path) : bool { return isset($this->files[$path]); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\ClassMapGenerator; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class PhpFileParser { /** * Extract the classes in the given file * * @param string $path The file to check * @throws \RuntimeException * @return list The found classes */ public static function findClasses(string $path) : array { $extraTypes = self::getExtraTypes(); if (!\function_exists('php_strip_whitespace')) { throw new \RuntimeException('Classmap generation relies on the php_strip_whitespace function, but it has been disabled by the disable_functions directive.'); } // Use @ here instead of Silencer to actively suppress 'unhelpful' output // @link https://github.com/composer/composer/pull/4886 $contents = @\php_strip_whitespace($path); if ('' === $contents) { if (!\file_exists($path)) { $message = 'File at "%s" does not exist, check your classmap definitions'; } elseif (!self::isReadable($path)) { $message = 'File at "%s" is not readable, check its permissions'; } elseif ('' === \trim((string) \file_get_contents($path))) { // The input file was really empty and thus contains no classes return array(); } else { $message = 'File at "%s" could not be parsed as PHP, it may be binary or corrupted'; } $error = \error_get_last(); if (isset($error['message'])) { $message .= \PHP_EOL . 'The following message may be helpful:' . \PHP_EOL . $error['message']; } throw new \RuntimeException(\sprintf($message, $path)); } // return early if there is no chance of matching anything in this file Preg::matchAllStrictGroups('{\\b(?:class|interface|trait' . $extraTypes . ')\\s}i', $contents, $matches); if (0 === \count($matches)) { return array(); } $p = new \Composer\ClassMapGenerator\PhpFileCleaner($contents, \count($matches[0])); $contents = $p->clean(); unset($p); Preg::matchAll('{ (?: \\b(?])(?Pclass|interface|trait' . $extraTypes . ') \\s++ (?P[a-zA-Z_\\x7f-\\xff:][a-zA-Z0-9_\\x7f-\\xff:\\-]*+) | \\b(?])(?Pnamespace) (?P\\s++[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*+(?:\\s*+\\\\\\s*+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*+)*+)? \\s*+ [\\{;] ) }ix', $contents, $matches); $classes = array(); $namespace = ''; for ($i = 0, $len = \count($matches['type']); $i < $len; $i++) { if (isset($matches['ns'][$i]) && $matches['ns'][$i] !== '') { $namespace = \str_replace(array(' ', "\t", "\r", "\n"), '', (string) $matches['nsname'][$i]) . '\\'; } else { $name = $matches['name'][$i]; \assert(\is_string($name)); // skip anon classes extending/implementing if ($name === 'extends' || $name === 'implements') { continue; } if ($name[0] === ':') { // This is an XHP class, https://github.com/facebook/xhp $name = 'xhp' . \substr(\str_replace(array('-', ':'), array('_', '__'), $name), 1); } elseif (\strtolower((string) $matches['type'][$i]) === 'enum') { // something like: // enum Foo: int { HERP = '123'; } // The regex above captures the colon, which isn't part of // the class name. // or: // enum Foo:int { HERP = '123'; } // The regex above captures the colon and type, which isn't part of // the class name. $colonPos = \strrpos($name, ':'); if (\false !== $colonPos) { $name = \substr($name, 0, $colonPos); } } /** @var class-string */ $className = \ltrim($namespace . $name, '\\'); $classes[] = $className; } } return $classes; } /** * @return string */ private static function getExtraTypes() : string { static $extraTypes = null; if (null === $extraTypes) { $extraTypes = ''; if (\PHP_VERSION_ID >= 80100 || \defined('_ContaoManager\\HHVM_VERSION') && \version_compare(HHVM_VERSION, '3.3', '>=')) { $extraTypes .= '|enum'; } $extraTypesArray = \array_filter(\explode('|', $extraTypes), function (string $type) { return $type !== ''; }); \Composer\ClassMapGenerator\PhpFileCleaner::setTypeConfig(\array_merge(['class', 'interface', 'trait'], $extraTypesArray)); } return $extraTypes; } /** * Cross-platform safe version of is_readable() * * This will also check for readability by reading the file as is_readable can not be trusted on network-mounts * and \\wsl$ paths. See https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 * * @see Composer\Util\Filesystem::isReadable * * @param string $path * @return bool */ private static function isReadable(string $path) { if (\is_readable($path)) { return \true; } if (\is_file($path)) { return \false !== @\file_get_contents($path, \false, null, 0, 1); } // assume false otherwise return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\ClassMapGenerator; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class ClassMap implements \Countable { /** * @var array */ public $map = []; /** * @var array> */ private $ambiguousClasses = []; /** * @var array> */ private $psrViolations = []; /** * Returns the class map, which is a list of paths indexed by class name * * @return array */ public function getMap() : array { return $this->map; } /** * Returns warning strings containing details about PSR-0/4 violations that were detected * * Violations are for ex a class which is in the wrong file/directory and thus should not be * found using psr-0/psr-4 autoloading but was found by the ClassMapGenerator as it scans all files. * * This is only happening when scanning paths using psr-0/psr-4 autoload type. Classmap type * always accepts every class as it finds it. * * @return string[] */ public function getPsrViolations() : array { if (\count($this->psrViolations) === 0) { return []; } return \array_map(static function (array $violation) : string { return $violation['warning']; }, \array_merge(...\array_values($this->psrViolations))); } /** * A map of class names to their list of ambiguous paths * * This occurs when the same class can be found in several files * * To get the path the class is being mapped to, call getClassPath * * By default, paths that contain test(s), fixture(s), example(s) or stub(s) are ignored * as those are typically not problematic when they're dummy classes in the tests folder. * If you want to get these back as well you can pass false to $duplicatesFilter. Or * you can pass your own pattern to exclude if you need to change the default. * * @param non-empty-string|false $duplicatesFilter * * @return array> */ public function getAmbiguousClasses($duplicatesFilter = '{/(test|fixture|example|stub)s?/}i') : array { if (\false === $duplicatesFilter) { return $this->ambiguousClasses; } if (\true === $duplicatesFilter) { throw new \InvalidArgumentException('$duplicatesFilter should be false or a string with a valid regex, got true.'); } $ambiguousClasses = []; foreach ($this->ambiguousClasses as $class => $paths) { $paths = \array_filter($paths, function ($path) use($duplicatesFilter) { return !Preg::isMatch($duplicatesFilter, \strtr($path, '\\', '/')); }); if (\count($paths) > 0) { $ambiguousClasses[$class] = \array_values($paths); } } return $ambiguousClasses; } /** * Sorts the class map alphabetically by class names */ public function sort() : void { \ksort($this->map); } /** * @param class-string $className * @param non-empty-string $path */ public function addClass(string $className, string $path) : void { unset($this->psrViolations[\strtr($path, '\\', '/')]); $this->map[$className] = $path; } /** * @param class-string $className * @return non-empty-string */ public function getClassPath(string $className) : string { if (!isset($this->map[$className])) { throw new \OutOfBoundsException('Class ' . $className . ' is not present in the map'); } return $this->map[$className]; } /** * @param class-string $className */ public function hasClass(string $className) : bool { return isset($this->map[$className]); } public function addPsrViolation(string $warning, string $className, string $path) : void { $path = \rtrim(\strtr($path, '\\', '/'), '/'); $this->psrViolations[$path][] = ['warning' => $warning, 'className' => $className]; } public function clearPsrViolationsByPath(string $pathPrefix) : void { $pathPrefix = \rtrim(\strtr($pathPrefix, '\\', '/'), '/'); foreach ($this->psrViolations as $path => $violations) { if ($path === $pathPrefix || 0 === \strpos($path, $pathPrefix . '/')) { unset($this->psrViolations[$path]); } } } /** * @param class-string $className * @param non-empty-string $path */ public function addAmbiguousClass(string $className, string $path) : void { $this->ambiguousClasses[$className][] = $path; } public function count() : int { return \count($this->map); } /** * Get the raw psr violations * * This is a map of filepath to an associative array of the warning string * and the offending class name. * @return array> */ public function getRawPsrViolations() : array { return $this->psrViolations; } } Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var \Closure(string):void */ private static $includeFile; /** @var string|null */ private $vendorDir; // PSR-4 /** * @var array> */ private $prefixLengthsPsr4 = array(); /** * @var array> */ private $prefixDirsPsr4 = array(); /** * @var list */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * List of PSR-0 prefixes * * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) * * @var array>> */ private $prefixesPsr0 = array(); /** * @var list */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var array */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var array */ private $missingClasses = array(); /** @var string|null */ private $apcuPrefix; /** * @var array */ private static $registeredLoaders = array(); /** * @param string|null $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; self::initializeIncludeClosure(); } /** * @return array> */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return list */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return list */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return array Array of classname => path */ public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param list|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param list|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param list|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param list|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { $includeFile = self::$includeFile; $includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders keyed by their corresponding vendor directories. * * @return array */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } /** * @return void */ private static function initializeIncludeClosure() { if (self::$includeFile !== null) { return; } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void */ self::$includeFile = \Closure::bind(static function($file) { include $file; }, null, null); } } # Composer-specific PHPStan extensions # # These can be reused by third party packages by including 'vendor/composer/composer/phpstan/rules.neon' # in your phpstan config services: - class: Composer\PHPStan\ConfigReturnTypeExtension tags: - phpstan.broker.dynamicMethodReturnTypeExtension - class: Composer\PHPStan\RuleReasonDataReturnTypeExtension tags: - phpstan.broker.dynamicMethodReturnTypeExtension { "$schema": "https://json-schema.org/draft-04/schema#", "title": "Composer Package", "type": "object", "properties": { "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix.", "pattern": "^[a-z0-9]([_.-]?[a-z0-9]+)*\/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$" }, "description": { "type": "string", "description": "Short package description." }, "license": { "type": ["string", "array"], "description": "License name. Or an array of license names." }, "type": { "description": "Package type, either 'library' for common packages, 'composer-plugin' for plugins, 'metapackage' for empty packages, or a custom type ([a-z0-9-]+) defined by whatever project this package applies to.", "type": "string", "pattern": "^[a-z0-9-]+$" }, "abandoned": { "type": ["boolean", "string"], "description": "Indicates whether this package has been abandoned, it can be boolean or a package name/URL pointing to a recommended alternative. Defaults to false." }, "version": { "type": "string", "description": "Package version, see https://getcomposer.org/doc/04-schema.md#version for more info on valid schemes.", "pattern": "^v?\\d+(\\.\\d+){0,3}|^dev-" }, "default-branch": { "type": ["boolean"], "description": "Internal use only, do not specify this in composer.json. Indicates whether this version is the default branch of the linked VCS repository. Defaults to false." }, "non-feature-branches": { "type": ["array"], "description": "A set of string or regex patterns for non-numeric branch names that will not be handled as feature branches.", "items": { "type": "string" } }, "keywords": { "type": "array", "items": { "type": "string", "description": "A tag/keyword that this package relates to." } }, "readme": { "type": "string", "description": "Relative path to the readme document." }, "time": { "type": "string", "description": "Package release date, in 'YYYY-MM-DD', 'YYYY-MM-DD HH:MM:SS' or 'YYYY-MM-DDTHH:MM:SSZ' format." }, "authors": { "$ref": "#/definitions/authors" }, "homepage": { "type": "string", "description": "Homepage URL for the project.", "format": "uri" }, "support": { "type": "object", "properties": { "email": { "type": "string", "description": "Email address for support.", "format": "email" }, "issues": { "type": "string", "description": "URL to the issue tracker.", "format": "uri" }, "forum": { "type": "string", "description": "URL to the forum.", "format": "uri" }, "wiki": { "type": "string", "description": "URL to the wiki.", "format": "uri" }, "irc": { "type": "string", "description": "IRC channel for support, as irc://server/channel.", "format": "uri" }, "chat": { "type": "string", "description": "URL to the support chat.", "format": "uri" }, "source": { "type": "string", "description": "URL to browse or download the sources.", "format": "uri" }, "docs": { "type": "string", "description": "URL to the documentation.", "format": "uri" }, "rss": { "type": "string", "description": "URL to the RSS feed.", "format": "uri" }, "security": { "type": "string", "description": "URL to the vulnerability disclosure policy (VDP).", "format": "uri" } } }, "funding": { "type": "array", "description": "A list of options to fund the development and maintenance of the package.", "items": { "type": "object", "properties": { "type": { "type": "string", "description": "Type of funding or platform through which funding is possible." }, "url": { "type": "string", "description": "URL to a website with details on funding and a way to fund the package.", "format": "uri" } } } }, "source": { "$ref": "#/definitions/source" }, "dist": { "$ref": "#/definitions/dist" }, "_comment": { "type": ["array", "string"], "description": "A key to store comments in" }, "require": { "type": "object", "description": "This is an object of package name (keys) and version constraints (values) that are required to run this package.", "additionalProperties": { "type": "string" } }, "require-dev": { "type": "object", "description": "This is an object of package name (keys) and version constraints (values) that this package requires for developing it (testing tools and such).", "additionalProperties": { "type": "string" } }, "replace": { "type": "object", "description": "This is an object of package name (keys) and version constraints (values) that can be replaced by this package.", "additionalProperties": { "type": "string" } }, "conflict": { "type": "object", "description": "This is an object of package name (keys) and version constraints (values) that conflict with this package.", "additionalProperties": { "type": "string" } }, "provide": { "type": "object", "description": "This is an object of package name (keys) and version constraints (values) that this package provides in addition to this package's name.", "additionalProperties": { "type": "string" } }, "suggest": { "type": "object", "description": "This is an object of package name (keys) and descriptions (values) that this package suggests work well with it (this will be suggested to the user during installation).", "additionalProperties": { "type": "string" } }, "repositories": { "type": ["object", "array"], "description": "A set of additional repositories where packages can be found.", "additionalProperties": { "anyOf": [ { "$ref": "#/definitions/repository" }, { "type": "boolean", "enum": [false] } ] }, "items": { "anyOf": [ { "$ref": "#/definitions/repository" }, { "type": "object", "additionalProperties": { "type": "boolean", "enum": [false] }, "minProperties": 1, "maxProperties": 1 } ] } }, "minimum-stability": { "type": ["string"], "description": "The minimum stability the packages must have to be install-able. Possible values are: dev, alpha, beta, RC, stable.", "enum": ["dev", "alpha", "beta", "rc", "RC", "stable"] }, "prefer-stable": { "type": ["boolean"], "description": "If set to true, stable packages will be preferred to dev packages when possible, even if the minimum-stability allows unstable packages." }, "autoload": { "$ref": "#/definitions/autoload" }, "autoload-dev": { "type": "object", "description": "Description of additional autoload rules for development purpose (eg. a test suite).", "properties": { "psr-0": { "type": "object", "description": "This is an object of namespaces (keys) and the directories they can be found into (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "psr-4": { "type": "object", "description": "This is an object of namespaces (keys) and the PSR-4 directories they can map to (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "classmap": { "type": "array", "description": "This is an array of paths that contain classes to be included in the class-map generation process." }, "files": { "type": "array", "description": "This is an array of files that are always required on every request." } } }, "target-dir": { "description": "DEPRECATED: Forces the package to be installed into the given subdirectory path. This is used for autoloading PSR-0 packages that do not contain their full path. Use forward slashes for cross-platform compatibility.", "type": "string" }, "include-path": { "type": ["array"], "description": "DEPRECATED: A list of directories which should get added to PHP's include path. This is only present to support legacy projects, and all new code should preferably use autoloading.", "items": { "type": "string" } }, "bin": { "type": ["string", "array"], "description": "A set of files, or a single file, that should be treated as binaries and symlinked into bin-dir (from config).", "items": { "type": "string" } }, "archive": { "type": ["object"], "description": "Options for creating package archives for distribution.", "properties": { "name": { "type": "string", "description": "A base name for archive." }, "exclude": { "type": "array", "description": "A list of patterns for paths to exclude or include if prefixed with an exclamation mark." } } }, "php-ext": { "type": "object", "description": "Settings for PHP extension packages.", "properties": { "extension-name": { "type": "string", "description": "If specified, this will be used as the name of the extension, where needed by tooling. If this is not specified, the extension name will be derived from the Composer package name (e.g. `vendor/name` would become `ext-name`). The extension name may be specified with or without the `ext-` prefix, and tools that use this must normalise this appropriately.", "example": "ext-xdebug" }, "priority": { "type": "integer", "description": "This is used to add a prefix to the INI file, e.g. `90-xdebug.ini` which affects the loading order. The priority is a number in the range 10-99 inclusive, with 10 being the highest priority (i.e. will be processed first), and 99 being the lowest priority (i.e. will be processed last). There are two digits so that the files sort correctly on any platform, whether the sorting is natural or not.", "minimum": 10, "maximum": 99, "example": 80, "default": 80 }, "support-zts": { "type": "boolean", "description": "Does this package support Zend Thread Safety", "example": false, "default": true }, "support-nts": { "type": "boolean", "description": "Does this package support non-Thread Safe mode", "example": false, "default": true }, "build-path": { "type": ["string", "null"], "description": "If specified, this is the subdirectory that will be used to build the extension instead of the root of the project.", "example": "my-extension-source", "default": null }, "download-url-method": { "type": "string", "description": "If specified, this technique will be used to override the URL that PIE uses to download the asset. The default, if not specified, is composer-default.", "enum": ["composer-default", "pre-packaged-source"], "example": "composer-default" }, "os-families": { "type": "array", "minItems": 1, "description": "An array of OS families to mark as compatible with the extension. Specifying this property will mean this package is not installable with PIE on any OS family not listed here. Must not be specified alongside os-families-exclude.", "items": { "type": "string", "enum": ["windows", "bsd", "darwin", "solaris", "linux", "unknown"], "description": "The name of the OS family to mark as compatible." } }, "os-families-exclude": { "type": "array", "minItems": 1, "description": "An array of OS families to mark as incompatible with the extension. Specifying this property will mean this package is installable on any OS family except those listed here. Must not be specified alongside os-families.", "items": { "type": "string", "enum": ["windows", "bsd", "darwin", "solaris", "linux", "unknown"], "description": "The name of the OS family to exclude." } }, "configure-options": { "type": "array", "description": "These configure options make up the flags that can be passed to ./configure when installing the extension.", "items": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string", "description": "The name of the flag, this would typically be prefixed with `--`, for example, the value 'the-flag' would be passed as `./configure --the-flag`.", "example": "without-xdebug-compression", "pattern": "^[a-zA-Z0-9][a-zA-Z0-9-_]*$" }, "needs-value": { "type": "boolean", "description": "If this is set to true, the flag needs a value (e.g. --with-somelib=), otherwise it is a flag without a value (e.g. --enable-some-feature).", "example": false, "default": false }, "description": { "type": "string", "description": "The description of what the flag does or means.", "example": "Disable compression through zlib" } } } } }, "allOf": [ { "not": { "required": ["os-families", "os-families-exclude"] } } ] }, "config": { "type": "object", "description": "Composer options.", "properties": { "platform": { "type": "object", "description": "This is an object of package name (keys) and version (values) that will be used to mock the platform packages on this machine, the version can be set to false to make it appear like the package is not present.", "additionalProperties": { "type": ["string", "boolean"] } }, "allow-plugins": { "type": ["object", "boolean"], "description": "This is an object of {\"pattern\": true|false} with packages which are allowed to be loaded as plugins, or true to allow all, false to allow none. Defaults to {} which prompts when an unknown plugin is added.", "additionalProperties": { "type": ["boolean"] } }, "process-timeout": { "type": "integer", "description": "The timeout in seconds for process executions, defaults to 300 (5mins)." }, "use-include-path": { "type": "boolean", "description": "If true, the Composer autoloader will also look for classes in the PHP include path." }, "use-parent-dir": { "type": ["string", "boolean"], "description": "When running Composer in a directory where there is no composer.json, if there is one present in a directory above Composer will by default ask you whether you want to use that directory's composer.json instead. One of: true (always use parent if needed), false (never ask or use it) or \"prompt\" (ask every time), defaults to prompt." }, "preferred-install": { "type": ["string", "object"], "description": "The install method Composer will prefer to use, defaults to auto and can be any of source, dist, auto, or an object of {\"pattern\": \"preference\"}.", "additionalProperties": { "type": ["string"] } }, "audit": { "type": "object", "description": "Security audit configuration options", "properties": { "ignore": { "anyOf": [ { "type": "object", "description": "A list of advisory ids, remote ids or CVE ids (keys) and the explanations (values) for why they're being ignored. The listed items are reported but let the audit command pass.", "additionalProperties": { "type": ["string", "string"] } }, { "type": "array", "description": "A set of advisory ids, remote ids or CVE ids that are reported but let the audit command pass.", "items": { "type": "string" } } ] }, "abandoned": { "enum": ["ignore", "report", "fail"], "description": "Whether abandoned packages should be ignored, reported as problems or cause an audit failure." } } }, "notify-on-install": { "type": "boolean", "description": "Composer allows repositories to define a notification URL, so that they get notified whenever a package from that repository is installed. This option allows you to disable that behaviour, defaults to true." }, "github-protocols": { "type": "array", "description": "A list of protocols to use for github.com clones, in priority order, defaults to [\"https\", \"ssh\", \"git\"].", "items": { "type": "string" } }, "github-oauth": { "type": "object", "description": "An object of domain name => github API oauth tokens, typically {\"github.com\":\"\"}.", "additionalProperties": { "type": "string" } }, "gitlab-oauth": { "type": "object", "description": "An object of domain name => gitlab API oauth tokens, typically {\"gitlab.com\":{\"expires-at\":\"\", \"refresh-token\":\"\", \"token\":\"\"}}.", "additionalProperties": { "type": ["string", "object"], "required": [ "token"], "properties": { "expires-at": { "type": "integer", "description": "The expiration date for this GitLab token" }, "refresh-token": { "type": "string", "description": "The refresh token used for GitLab authentication" }, "token": { "type": "string", "description": "The token used for GitLab authentication" } } } }, "gitlab-token": { "type": "object", "description": "An object of domain name => gitlab private tokens, typically {\"gitlab.com\":\"\"}, or an object with username and token keys.", "additionalProperties": { "type": ["string", "object"], "required": ["username", "token"], "properties": { "username": { "type": "string", "description": "The username used for GitLab authentication" }, "token": { "type": "string", "description": "The token used for GitLab authentication" } } } }, "gitlab-protocol": { "enum": ["git", "http", "https"], "description": "A protocol to force use of when creating a repository URL for the `source` value of the package metadata. One of `git` or `http`. By default, Composer will generate a git URL for private repositories and http one for public repos." }, "bearer": { "type": "object", "description": "An object of domain name => bearer authentication token, for example {\"example.com\":\"\"}.", "additionalProperties": { "type": "string" } }, "disable-tls": { "type": "boolean", "description": "Defaults to `false`. If set to true all HTTPS URLs will be tried with HTTP instead and no network level encryption is performed. Enabling this is a security risk and is NOT recommended. The better way is to enable the php_openssl extension in php.ini." }, "secure-http": { "type": "boolean", "description": "Defaults to `true`. If set to true only HTTPS URLs are allowed to be downloaded via Composer. If you really absolutely need HTTP access to something then you can disable it, but using \"Let's Encrypt\" to get a free SSL certificate is generally a better alternative." }, "secure-svn-domains": { "type": "array", "description": "A list of domains which should be trusted/marked as using a secure Subversion/SVN transport. By default svn:// protocol is seen as insecure and will throw. This is a better/safer alternative to disabling `secure-http` altogether.", "items": { "type": "string" } }, "cafile": { "type": "string", "description": "A way to set the path to the openssl CA file. In PHP 5.6+ you should rather set this via openssl.cafile in php.ini, although PHP 5.6+ should be able to detect your system CA file automatically." }, "capath": { "type": "string", "description": "If cafile is not specified or if the certificate is not found there, the directory pointed to by capath is searched for a suitable certificate. capath must be a correctly hashed certificate directory." }, "http-basic": { "type": "object", "description": "An object of domain name => {\"username\": \"...\", \"password\": \"...\"}.", "additionalProperties": { "type": "object", "required": ["username", "password"], "properties": { "username": { "type": "string", "description": "The username used for HTTP Basic authentication" }, "password": { "type": "string", "description": "The password used for HTTP Basic authentication" } } } }, "store-auths": { "type": ["string", "boolean"], "description": "What to do after prompting for authentication, one of: true (store), false (do not store) or \"prompt\" (ask every time), defaults to prompt." }, "vendor-dir": { "type": "string", "description": "The location where all packages are installed, defaults to \"vendor\"." }, "bin-dir": { "type": "string", "description": "The location where all binaries are linked, defaults to \"vendor/bin\"." }, "data-dir": { "type": "string", "description": "The location where old phar files are stored, defaults to \"$home\" except on XDG Base Directory compliant unixes." }, "cache-dir": { "type": "string", "description": "The location where all caches are located, defaults to \"~/.composer/cache\" on *nix and \"%LOCALAPPDATA%\\Composer\" on windows." }, "cache-files-dir": { "type": "string", "description": "The location where files (zip downloads) are cached, defaults to \"{$cache-dir}/files\"." }, "cache-repo-dir": { "type": "string", "description": "The location where repo (git/hg repo clones) are cached, defaults to \"{$cache-dir}/repo\"." }, "cache-vcs-dir": { "type": "string", "description": "The location where vcs infos (git clones, github api calls, etc. when reading vcs repos) are cached, defaults to \"{$cache-dir}/vcs\"." }, "cache-ttl": { "type": "integer", "description": "The default cache time-to-live, defaults to 15552000 (6 months)." }, "cache-files-ttl": { "type": "integer", "description": "The cache time-to-live for files, defaults to the value of cache-ttl." }, "cache-files-maxsize": { "type": ["string", "integer"], "description": "The cache max size for the files cache, defaults to \"300MiB\"." }, "cache-read-only": { "type": ["boolean"], "description": "Whether to use the Composer cache in read-only mode." }, "bin-compat": { "enum": ["auto", "full", "proxy", "symlink"], "description": "The compatibility of the binaries, defaults to \"auto\" (automatically guessed), can be \"full\" (compatible with both Windows and Unix-based systems) and \"proxy\" (only bash-style proxy)." }, "discard-changes": { "type": ["string", "boolean"], "description": "The default style of handling dirty updates, defaults to false and can be any of true, false or \"stash\"." }, "autoloader-suffix": { "type": "string", "description": "Optional string to be used as a suffix for the generated Composer autoloader. When null a random one will be generated." }, "optimize-autoloader": { "type": "boolean", "description": "Always optimize when dumping the autoloader." }, "prepend-autoloader": { "type": "boolean", "description": "If false, the composer autoloader will not be prepended to existing autoloaders, defaults to true." }, "classmap-authoritative": { "type": "boolean", "description": "If true, the composer autoloader will not scan the filesystem for classes that are not found in the class map, defaults to false." }, "apcu-autoloader": { "type": "boolean", "description": "If true, the Composer autoloader will check for APCu and use it to cache found/not-found classes when the extension is enabled, defaults to false." }, "github-domains": { "type": "array", "description": "A list of domains to use in github mode. This is used for GitHub Enterprise setups, defaults to [\"github.com\"].", "items": { "type": "string" } }, "github-expose-hostname": { "type": "boolean", "description": "Defaults to true. If set to false, the OAuth tokens created to access the github API will have a date instead of the machine hostname." }, "gitlab-domains": { "type": "array", "description": "A list of domains to use in gitlab mode. This is used for custom GitLab setups, defaults to [\"gitlab.com\"].", "items": { "type": "string" } }, "bitbucket-oauth": { "type": "object", "description": "An object of domain name => {\"consumer-key\": \"...\", \"consumer-secret\": \"...\"}.", "additionalProperties": { "type": "object", "required": ["consumer-key", "consumer-secret"], "properties": { "consumer-key": { "type": "string", "description": "The consumer-key used for OAuth authentication" }, "consumer-secret": { "type": "string", "description": "The consumer-secret used for OAuth authentication" }, "access-token": { "type": "string", "description": "The OAuth token retrieved from Bitbucket's API, this is written by Composer and you should not set it nor modify it." }, "access-token-expiration": { "type": "integer", "description": "The generated token's expiration timestamp, this is written by Composer and you should not set it nor modify it." } } } }, "use-github-api": { "type": "boolean", "description": "Defaults to true. If set to false, globally disables the use of the GitHub API for all GitHub repositories and clones the repository as it would for any other repository." }, "archive-format": { "type": "string", "description": "The default archiving format when not provided on cli, defaults to \"tar\"." }, "archive-dir": { "type": "string", "description": "The default archive path when not provided on cli, defaults to \".\"." }, "htaccess-protect": { "type": "boolean", "description": "Defaults to true. If set to false, Composer will not create .htaccess files in the composer home, cache, and data directories." }, "sort-packages": { "type": "boolean", "description": "Defaults to false. If set to true, Composer will sort packages when adding/updating a new dependency." }, "lock": { "type": "boolean", "description": "Defaults to true. If set to false, Composer will not create a composer.lock file." }, "platform-check": { "type": ["boolean", "string"], "description": "Defaults to \"php-only\" which checks only the PHP version. Setting to true will also check the presence of required PHP extensions. If set to false, Composer will not create and require a platform_check.php file as part of the autoloader bootstrap." }, "bump-after-update": { "type": ["string", "boolean"], "description": "Defaults to false and can be any of true, false, \"dev\"` or \"no-dev\"`. If set to true, Composer will run the bump command after running the update command. If set to \"dev\" or \"no-dev\" then only the corresponding dependencies will be bumped." }, "allow-missing-requirements": { "type": ["boolean"], "description": "Defaults to false. If set to true, Composer will allow install when lock file is not up to date with the latest changes in composer.json." } } }, "extra": { "type": ["object", "array"], "description": "Arbitrary extra data that can be used by plugins, for example, package of type composer-plugin may have a 'class' key defining an installer class name.", "additionalProperties": true }, "scripts": { "type": ["object"], "description": "Script listeners that will be executed before/after some events.", "properties": { "pre-install-cmd": { "type": ["array", "string"], "description": "Occurs before the install command is executed, contains one or more Class::method callables or shell commands." }, "post-install-cmd": { "type": ["array", "string"], "description": "Occurs after the install command is executed, contains one or more Class::method callables or shell commands." }, "pre-update-cmd": { "type": ["array", "string"], "description": "Occurs before the update command is executed, contains one or more Class::method callables or shell commands." }, "post-update-cmd": { "type": ["array", "string"], "description": "Occurs after the update command is executed, contains one or more Class::method callables or shell commands." }, "pre-status-cmd": { "type": ["array", "string"], "description": "Occurs before the status command is executed, contains one or more Class::method callables or shell commands." }, "post-status-cmd": { "type": ["array", "string"], "description": "Occurs after the status command is executed, contains one or more Class::method callables or shell commands." }, "pre-package-install": { "type": ["array", "string"], "description": "Occurs before a package is installed, contains one or more Class::method callables or shell commands." }, "post-package-install": { "type": ["array", "string"], "description": "Occurs after a package is installed, contains one or more Class::method callables or shell commands." }, "pre-package-update": { "type": ["array", "string"], "description": "Occurs before a package is updated, contains one or more Class::method callables or shell commands." }, "post-package-update": { "type": ["array", "string"], "description": "Occurs after a package is updated, contains one or more Class::method callables or shell commands." }, "pre-package-uninstall": { "type": ["array", "string"], "description": "Occurs before a package has been uninstalled, contains one or more Class::method callables or shell commands." }, "post-package-uninstall": { "type": ["array", "string"], "description": "Occurs after a package has been uninstalled, contains one or more Class::method callables or shell commands." }, "pre-autoload-dump": { "type": ["array", "string"], "description": "Occurs before the autoloader is dumped, contains one or more Class::method callables or shell commands." }, "post-autoload-dump": { "type": ["array", "string"], "description": "Occurs after the autoloader is dumped, contains one or more Class::method callables or shell commands." }, "post-root-package-install": { "type": ["array", "string"], "description": "Occurs after the root-package is installed, contains one or more Class::method callables or shell commands." }, "post-create-project-cmd": { "type": ["array", "string"], "description": "Occurs after the create-project command is executed, contains one or more Class::method callables or shell commands." } } }, "scripts-descriptions": { "type": ["object"], "description": "Descriptions for custom commands, shown in console help.", "additionalProperties": { "type": "string" } }, "scripts-aliases": { "type": ["object"], "description": "Aliases for custom commands.", "additionalProperties": { "type": "array" } } }, "definitions": { "authors": { "type": "array", "description": "List of authors that contributed to the package. This is typically the main maintainers, not the full list.", "items": { "type": "object", "additionalProperties": false, "required": [ "name"], "properties": { "name": { "type": "string", "description": "Full name of the author." }, "email": { "type": "string", "description": "Email address of the author.", "format": "email" }, "homepage": { "type": "string", "description": "Homepage URL for the author.", "format": "uri" }, "role": { "type": "string", "description": "Author's role in the project." } } } }, "autoload": { "type": "object", "description": "Description of how the package can be autoloaded.", "properties": { "psr-0": { "type": "object", "description": "This is an object of namespaces (keys) and the directories they can be found in (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "psr-4": { "type": "object", "description": "This is an object of namespaces (keys) and the PSR-4 directories they can map to (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "classmap": { "type": "array", "description": "This is an array of paths that contain classes to be included in the class-map generation process." }, "files": { "type": "array", "description": "This is an array of files that are always required on every request." }, "exclude-from-classmap": { "type": "array", "description": "This is an array of patterns to exclude from autoload classmap generation. (e.g. \"exclude-from-classmap\": [\"/test/\", \"/tests/\", \"/Tests/\"]" } } }, "repository": { "type": "object", "anyOf": [ { "$ref": "#/definitions/composer-repository" }, { "$ref": "#/definitions/vcs-repository" }, { "$ref": "#/definitions/path-repository" }, { "$ref": "#/definitions/artifact-repository" }, { "$ref": "#/definitions/pear-repository" }, { "$ref": "#/definitions/package-repository" } ] }, "composer-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["composer"] }, "url": { "type": "string" }, "canonical": { "type": "boolean" }, "only": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } }, "options": { "type": "object", "additionalProperties": true }, "allow_ssl_downgrade": { "type": "boolean" }, "force-lazy-providers": { "type": "boolean" } } }, "vcs-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["vcs", "github", "git", "gitlab", "bitbucket", "git-bitbucket", "hg", "fossil", "perforce", "svn"] }, "url": { "type": "string" }, "canonical": { "type": "boolean" }, "only": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } }, "no-api": { "type": "boolean" }, "secure-http": { "type": "boolean" }, "svn-cache-credentials": { "type": "boolean" }, "trunk-path": { "type": ["string", "boolean"] }, "branches-path": { "type": ["string", "boolean"] }, "tags-path": { "type": ["string", "boolean"] }, "package-path": { "type": "string" }, "depot": { "type": "string" }, "branch": { "type": "string" }, "unique_perforce_client_name": { "type": "string" }, "p4user": { "type": "string" }, "p4password": { "type": "string" } } }, "path-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["path"] }, "url": { "type": "string" }, "canonical": { "type": "boolean" }, "only": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } }, "options": { "type": "object", "properties": { "symlink": { "type": ["boolean", "null"] } }, "additionalProperties": true } } }, "artifact-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["artifact"] }, "url": { "type": "string" }, "canonical": { "type": "boolean" }, "only": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } } } }, "pear-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["pear"] }, "url": { "type": "string" }, "canonical": { "type": "boolean" }, "only": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } }, "vendor-alias": { "type": "string" } } }, "package-repository": { "type": "object", "required": ["type", "package"], "properties": { "type": { "type": "string", "enum": ["package"] }, "canonical": { "type": "boolean" }, "only": { "type": "array", "items": { "type": "string" } }, "exclude": { "type": "array", "items": { "type": "string" } }, "package": { "oneOf": [ { "$ref": "#/definitions/inline-package" }, { "type": "array", "items": { "$ref": "#/definitions/inline-package" } } ] } } }, "inline-package": { "type": "object", "required": ["name", "version"], "properties": { "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix." }, "type": { "type": "string" }, "target-dir": { "description": "DEPRECATED: Forces the package to be installed into the given subdirectory path. This is used for autoloading PSR-0 packages that do not contain their full path. Use forward slashes for cross-platform compatibility.", "type": "string" }, "description": { "type": "string" }, "keywords": { "type": "array", "items": { "type": "string" } }, "homepage": { "type": "string", "format": "uri" }, "version": { "type": "string" }, "time": { "type": "string" }, "license": { "type": [ "string", "array" ] }, "authors": { "$ref": "#/definitions/authors" }, "require": { "type": "object", "additionalProperties": { "type": "string" } }, "replace": { "type": "object", "additionalProperties": { "type": "string" } }, "conflict": { "type": "object", "additionalProperties": { "type": "string" } }, "provide": { "type": "object", "additionalProperties": { "type": "string" } }, "require-dev": { "type": "object", "additionalProperties": { "type": "string" } }, "suggest": { "type": "object", "additionalProperties": { "type": "string" } }, "extra": { "type": ["object", "array"], "additionalProperties": true }, "autoload": { "$ref": "#/definitions/autoload" }, "archive": { "type": ["object"], "properties": { "exclude": { "type": "array" } } }, "bin": { "type": ["string", "array"], "description": "A set of files, or a single file, that should be treated as binaries and symlinked into bin-dir (from config).", "items": { "type": "string" } }, "include-path": { "type": ["array"], "description": "DEPRECATED: A list of directories which should get added to PHP's include path. This is only present to support legacy projects, and all new code should preferably use autoloading.", "items": { "type": "string" } }, "source": { "$ref": "#/definitions/source" }, "dist": { "$ref": "#/definitions/dist" } }, "additionalProperties": true }, "source": { "type": "object", "required": ["type", "url", "reference"], "properties": { "type": { "type": "string" }, "url": { "type": "string" }, "reference": { "type": "string" }, "mirrors": { "type": "array" } } }, "dist": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string" }, "url": { "type": "string" }, "reference": { "type": "string" }, "shasum": { "type": "string" }, "mirrors": { "type": "array" } } } } } { "$schema": "https://json-schema.org/draft-04/schema#", "title": "Composer Lock File", "type": "object", "required": [ "content-hash", "packages", "packages-dev" ], "additionalProperties": true, "properties": { "_readme": { "type": "array", "items": { "type": "string" }, "description": "Informational text for humans reading the file" }, "content-hash": { "type": "string", "description": "Hash of all relevant properties of the composer.json that was used to create this lock file." }, "packages": { "type": "array", "description": "An array of packages that are required.", "items": { "$ref": "./composer-schema.json", "required": ["name", "version"] } }, "packages-dev": { "type": "array", "description": "An array of packages that are required in require-dev.", "items": { "$ref": "./composer-schema.json" } }, "aliases": { "type": "array", "description": "Inline aliases defined in the root package.", "items": { "type": "object", "required": [ "package", "version", "alias", "alias_normalized" ], "properties": { "package": { "type": "string" }, "version": { "type": "string" }, "alias": { "type": "string" }, "alias_normalized": { "type": "string" } } } }, "minimum-stability": { "type": "string", "description": "The minimum-stability used to generate this lock file." }, "stability-flags": { "type": "object", "description": "Root package stability flags changing the minimum-stability for specific packages.", "additionalProperties": { "type": "integer" } }, "prefer-stable": { "type": "boolean", "description": "Whether the --prefer-stable flag was used when building this lock file." }, "prefer-lowest": { "type": "boolean", "description": "Whether the --prefer-lowest flag was used when building this lock file." }, "platform": { "type": "object", "description": "Platform requirements of the root package.", "additionalProperties": { "type": "string" } }, "platform-dev": { "type": "object", "description": "Platform dev-requirements of the root package.", "additionalProperties": { "type": "string" } }, "platform-overrides": { "type": "object", "description": "Platform config overrides of the root package.", "additionalProperties": { "type": "string" } }, "plugin-api-version": { "type": "string", "description": "The composer-plugin-api version that was used to generate this lock file." } } } { "$schema": "https://json-schema.org/draft-04/schema#", "title": "Composer Package Repository", "type": "object", "oneOf": [ { "required": [ "packages" ] }, { "required": [ "providers" ] }, { "required": [ "provider-includes", "providers-url" ] }, { "required": [ "metadata-url" ] } ], "properties": { "packages": { "type": ["object", "array"], "description": "A hashmap of package names in the form of /.", "additionalProperties": { "$ref": "#/definitions/versions" } }, "metadata-url": { "type": "string", "description": "Endpoint to retrieve package metadata data from, in Composer v2 format, e.g. '/p2/%package%.json'." }, "available-packages": { "type": "array", "items": { "type": "string" }, "description": "If your repository only has a small number of packages, and you want to avoid serving many 404s, specify all the package names that your repository contains here." }, "available-package-patterns": { "type": "array", "items": { "type": "string" }, "description": "If your repository only has a small number of packages, and you want to avoid serving many 404s, specify package name patterns containing wildcards (*) that your repository contains here." }, "security-advisories": { "type": "array", "items": { "type": "object", "required": ["metadata", "api-url"], "properties": { "metadata": { "type": "boolean", "description": "Whether metadata files contain security advisory data or whether it should always be queried using the API URL." }, "api-url": { "type": "string", "description": "Endpoint to call to retrieve security advisories data." } } } }, "metadata-changes-url": { "type": "string", "description": "Endpoint to retrieve package metadata updates from. This should receive a timestamp since last call to be able to return new changes. e.g. '/metadata/changes.json'." }, "providers-api": { "type": "string", "description": "Endpoint to retrieve package names providing a given name from, e.g. '/providers/%package%.json'." }, "notify-batch": { "type": "string", "description": "Endpoint to call after multiple packages have been installed, e.g. '/downloads/'." }, "search": { "type": "string", "description": "Endpoint that provides search capabilities, e.g. '/search.json?q=%query%&type=%type%'." }, "list": { "type": "string", "description": "Endpoint that provides a full list of packages present in the repository. It should accept an optional `?filter=xx` query param, which can contain `*` as wildcards matching any substring. e.g. '/list.json'." }, "warnings": { "type": "array", "items": { "type": "object", "required": ["message", "versions"], "properties": { "message": { "type": "string", "description": "A message that will be output by Composer as a warning when this source is consulted." }, "versions": { "type": "string", "description": "A version constraint to limit to which Composer versions the warning should be shown." } } } }, "infos": { "type": "array", "items": { "type": "object", "required": ["message", "versions"], "properties": { "message": { "type": "string", "description": "A message that will be output by Composer as info when this source is consulted." }, "versions": { "type": "string", "description": "A version constraint to limit to which Composer versions the info should be shown." } } } }, "providers-url": { "type": "string", "description": "DEPRECATED: Endpoint to retrieve provider data from, e.g. '/p/%package%$%hash%.json'." }, "provider-includes": { "type": "object", "description": "DEPRECATED: A hashmap of provider listings.", "additionalProperties": { "$ref": "#/definitions/provider" } }, "providers": { "type": "object", "description": "DEPRECATED: A hashmap of package names in the form of /.", "additionalProperties": { "$ref": "#/definitions/provider" } }, "warning": { "type": "string", "description": "DEPRECATED: A message that will be output by Composer as a warning when this source is consulted." }, "warning-versions": { "type": "string", "description": "DEPRECATED: A version constraint to limit to which Composer versions the warning should be shown." }, "info": { "type": "string", "description": "DEPRECATED: A message that will be output by Composer as a info when this source is consulted." }, "info-versions": { "type": "string", "description": "DEPRECATED: A version constraint to limit to which Composer versions the info should be shown." } }, "definitions": { "versions": { "type": "object", "description": "A hashmap of versions and their metadata.", "additionalProperties": { "$ref": "#/definitions/version" } }, "version": { "type": "object", "oneOf": [ { "$ref": "#/definitions/package" }, { "$ref": "#/definitions/metapackage" } ] }, "package-base": { "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "version": { "type": "string" }, "version_normalized": { "type": "string", "description": "Normalized version, optional but can save computational time on client side." }, "autoload": { "type": "object" }, "require": { "type": "object" }, "replace": { "type": "object" }, "conflict": { "type": "object" }, "provide": { "type": "object" }, "time": { "type": "string" } }, "additionalProperties": true }, "package": { "allOf": [ { "$ref": "#/definitions/package-base" }, { "properties": { "dist": { "type": "object" }, "source": { "type": "object" } } }, { "oneOf": [ { "required": [ "name", "version", "source" ] }, { "required": [ "name", "version", "dist" ] } ] } ] }, "metapackage": { "allOf": [ { "$ref": "#/definitions/package-base" }, { "properties": { "type": { "type": "string", "enum": [ "metapackage" ] } }, "required": [ "name", "version", "type" ] } ] }, "provider": { "type": "object", "properties": { "sha256": { "type": "string", "description": "Hash value that can be used to validate the resource." } } } } } { "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "d6c1c91b79d7140594e249343184ce6f", "packages": [ { "name": "composer/ca-bundle", "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6", "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", "php": "^7.2 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^8 || ^9", "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\CaBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "keywords": [ "cabundle", "cacert", "certificate", "ssl", "tls" ], "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", "source": "https://github.com/composer/ca-bundle/tree/1.5.5" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2025-01-08T16:17:16+00:00" }, { "name": "composer/class-map-generator", "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", "shasum": "" }, "require": { "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.12 || ^2", "phpstan/phpstan-deprecation-rules": "^1 || ^2", "phpstan/phpstan-phpunit": "^1 || ^2", "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpunit/phpunit": "^8", "symfony/filesystem": "^5.4 || ^6" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\ClassMapGenerator\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https://seld.be" } ], "description": "Utilities to scan PHP code and generate class maps.", "keywords": [ "classmap" ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", "source": "https://github.com/composer/class-map-generator/tree/1.6.0" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2025-02-05T10:05:34+00:00" }, { "name": "composer/metadata-minifier", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/composer/metadata-minifier.git", "reference": "c549d23829536f0d0e984aaabbf02af91f443207" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", "reference": "c549d23829536f0d0e984aaabbf02af91f443207", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "composer/composer": "^2", "phpstan/phpstan": "^0.12.55", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\MetadataMinifier\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "Small utility library that handles metadata minification and expansion.", "keywords": [ "composer", "compression" ], "support": { "issues": "https://github.com/composer/metadata-minifier/issues", "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2021-04-07T13:37:33+00:00" }, { "name": "composer/pcre", "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", "reference": "ebb81df8f52b40172d14062ae96a06939d80a069" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/pcre/zipball/ebb81df8f52b40172d14062ae96a06939d80a069", "reference": "ebb81df8f52b40172d14062ae96a06939d80a069", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<1.11.10" }, "require-dev": { "phpstan/phpstan": "^1.12 || ^2", "phpstan/phpstan-strict-rules": "^1 || ^2", "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "phpstan": { "includes": [ "extension.neon" ] }, "branch-alias": { "dev-main": "2.x-dev" } }, "autoload": { "psr-4": { "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ "PCRE", "preg", "regex", "regular expression" ], "support": { "issues": "https://github.com/composer/pcre/issues", "source": "https://github.com/composer/pcre/tree/2.3.2" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2024-11-12T16:24:47+00:00" }, { "name": "composer/semver", "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.11", "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http://www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" }, { "name": "Rob Bast", "email": "rob.bast@gmail.com", "homepage": "http://robbast.nl" } ], "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ "semantic", "semver", "validation", "versioning" ], "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/spdx-licenses", "version": "1.5.8", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^0.12.55", "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\Spdx\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http://www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" }, { "name": "Rob Bast", "email": "rob.bast@gmail.com", "homepage": "http://robbast.nl" } ], "description": "SPDX licenses list and validation library.", "keywords": [ "license", "spdx", "validator" ], "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2023-11-20T07:44:33+00:00" }, { "name": "composer/xdebug-handler", "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { "composer/pcre": "^1 || ^2 || ^3", "php": "^7.2.5 || ^8.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { "phpstan/phpstan": "^1.0", "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { "psr-4": { "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "John Stevenson", "email": "john-stevenson@blueyonder.co.uk" } ], "description": "Restarts a process without Xdebug.", "keywords": [ "Xdebug", "performance" ], "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/xdebug-handler/issues", "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { "url": "https://packagist.com", "type": "custom" }, { "url": "https://github.com/composer", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], "time": "2024-05-06T16:37:16+00:00" }, { "name": "justinrainbow/json-schema", "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/jsonrainbow/json-schema.git", "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", "shasum": "" }, "require": { "php": ">=7.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", "json-schema/json-schema-test-suite": "1.2.0", "phpunit/phpunit": "^4.8.35" }, "bin": [ "bin/validate-json" ], "type": "library", "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bruno Prieto Reis", "email": "bruno.p.reis@gmail.com" }, { "name": "Justin Rainbow", "email": "justin.rainbow@gmail.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch" }, { "name": "Robert Schönthal", "email": "seroscho@googlemail.com" } ], "description": "A library to validate a json schema.", "homepage": "https://github.com/justinrainbow/json-schema", "keywords": [ "json", "schema" ], "support": { "issues": "https://github.com/jsonrainbow/json-schema/issues", "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" }, "time": "2024-07-06T21:00:26+00:00" }, { "name": "psr/container", "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { "php": ">=7.2.0" }, "type": "library", "autoload": { "psr-4": { "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", "homepage": "https://github.com/php-fig/container", "keywords": [ "PSR-11", "container", "container-interface", "container-interop", "psr" ], "support": { "issues": "https://github.com/php-fig/container/issues", "source": "https://github.com/php-fig/container/tree/1.1.1" }, "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/log", "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], "support": { "source": "https://github.com/php-fig/log/tree/1.1.4" }, "time": "2021-05-03T11:20:27+00:00" }, { "name": "react/promise", "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", "reference": "8a164643313c71354582dc850b42b33fa12a4b63" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", "reference": "8a164643313c71354582dc850b42b33fa12a4b63", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { "phpstan/phpstan": "1.10.39 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", "autoload": { "files": [ "src/functions_include.php" ], "psr-4": { "React\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jan Sorgalla", "email": "jsorgalla@gmail.com", "homepage": "https://sorgalla.com/" }, { "name": "Christian Lück", "email": "christian@clue.engineering", "homepage": "https://clue.engineering/" }, { "name": "Cees-Jan Kiewiet", "email": "reactphp@ceesjankiewiet.nl", "homepage": "https://wyrihaximus.net/" }, { "name": "Chris Boden", "email": "cboden@gmail.com", "homepage": "https://cboden.dev/" } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ "promise", "promises" ], "support": { "issues": "https://github.com/reactphp/promise/issues", "source": "https://github.com/reactphp/promise/tree/v3.2.0" }, "funding": [ { "url": "https://opencollective.com/reactphp", "type": "open_collective" } ], "time": "2024-05-24T10:39:05+00:00" }, { "name": "seld/jsonlint", "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", "shasum": "" }, "require": { "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { "phpstan/phpstan": "^1.11", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, "bin": [ "bin/jsonlint" ], "type": "library", "autoload": { "psr-4": { "Seld\\JsonLint\\": "src/Seld/JsonLint/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https://seld.be" } ], "description": "JSON Linter", "keywords": [ "json", "linter", "parser", "validator" ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" }, "funding": [ { "url": "https://github.com/Seldaek", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", "type": "tidelift" } ], "time": "2024-07-11T14:55:45+00:00" }, { "name": "seld/phar-utils", "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", "shasum": "" }, "require": { "php": ">=5.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Seld\\PharUtils\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be" } ], "description": "PHAR file format utilities, for when PHP phars you up", "keywords": [ "phar" ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" }, "time": "2022-08-31T10:31:18+00:00" }, { "name": "seld/signal-handler", "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/Seldaek/signal-handler.git", "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { "php": ">=7.2.0" }, "require-dev": { "phpstan/phpstan": "^1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.3", "phpunit/phpunit": "^7.5.20 || ^8.5.23", "psr/log": "^1 || ^2 || ^3" }, "type": "library", "extra": { "branch-alias": { "dev-main": "2.x-dev" } }, "autoload": { "psr-4": { "Seld\\Signal\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", "keywords": [ "posix", "sigint", "signal", "sigterm", "unix" ], "support": { "issues": "https://github.com/Seldaek/signal-handler/issues", "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, "time": "2023-09-03T09:24:00+00:00" }, { "name": "symfony/console", "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/console.git", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/event-dispatcher": "^4.4|^5.0|^6.0", "symfony/lock": "^4.4|^5.0|^6.0", "symfony/process": "^4.4|^5.0|^6.0", "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "keywords": [ "cli", "command-line", "console", "terminal" ], "support": { "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-11-06T11:30:55+00:00" }, { "name": "symfony/deprecation-contracts", "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { "php": ">=7.1" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "2.5-dev" } }, "autoload": { "files": [ "function.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/filesystem", "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, "require-dev": { "symfony/process": "^5.4|^6.4" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/filesystem/tree/v5.4.45" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-10-22T13:05:35+00:00" }, { "name": "symfony/finder", "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-28T13:32:08+00:00" }, { "name": "symfony/polyfill-ctype", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { "php": ">=7.2" }, "provide": { "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "ctype", "polyfill", "portable" ], "support": { "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "grapheme", "intl", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "intl", "normalizer", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { "php": ">=7.2" }, "provide": { "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php73\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ion Bazan", "email": "ion.bazan@gmail.com" }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php81", "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { "php": ">=7.2" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/polyfill", "name": "symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php81\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/process.git", "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/process/tree/v5.4.47" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-11-06T11:36:42+00:00" }, { "name": "symfony/service-contracts", "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1", "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" }, "type": "library", "extra": { "thanks": { "url": "https://github.com/symfony/contracts", "name": "symfony/contracts" }, "branch-alias": { "dev-main": "2.5-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ "abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards" ], "support": { "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/string", "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/string.git", "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "~1.15" }, "conflict": { "symfony/translation-contracts": ">=3.0" }, "require-dev": { "symfony/error-handler": "^4.4|^5.0|^6.0", "symfony/http-client": "^4.4|^5.0|^6.0", "symfony/translation-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { "files": [ "Resources/functions.php" ], "psr-4": { "Symfony\\Component\\String\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ "grapheme", "i18n", "string", "unicode", "utf-8", "utf8" ], "support": { "source": "https://github.com/symfony/string/tree/v5.4.47" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-11-10T20:33:58+00:00" } ], "packages-dev": [ { "name": "phpstan/phpstan", "version": "1.12.19", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", "reference": "c42ba9bab7a940ed00092ecb1c77bad98896d789" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c42ba9bab7a940ed00092ecb1c77bad98896d789", "reference": "c42ba9bab7a940ed00092ecb1c77bad98896d789", "shasum": "" }, "require": { "php": "^7.2|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" }, "bin": [ "phpstan", "phpstan.phar" ], "type": "library", "autoload": { "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ "dev", "static analysis" ], "support": { "docs": "https://phpstan.org/user-guide/getting-started", "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", "security": "https://github.com/phpstan/phpstan/security/policy", "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { "url": "https://github.com/ondrejmirtes", "type": "github" }, { "url": "https://github.com/phpstan", "type": "github" } ], "time": "2025-02-19T15:42:21+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82", "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", "phpstan/phpstan": "^1.12" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^9.5" }, "type": "phpstan-extension", "extra": { "phpstan": { "includes": [ "rules.neon" ] } }, "autoload": { "psr-4": { "PHPStan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1" }, "time": "2024-09-11T15:52:35+00:00" }, { "name": "phpstan/phpstan-phpunit", "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", "reference": "72a6721c9b64b3e4c9db55abbc38f790b318267e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/72a6721c9b64b3e4c9db55abbc38f790b318267e", "reference": "72a6721c9b64b3e4c9db55abbc38f790b318267e", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", "phpstan/phpstan": "^1.12" }, "conflict": { "phpunit/phpunit": "<7.0" }, "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-strict-rules": "^1.5.1", "phpunit/phpunit": "^9.5" }, "type": "phpstan-extension", "extra": { "phpstan": { "includes": [ "extension.neon", "rules.neon" ] } }, "autoload": { "psr-4": { "PHPStan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.2" }, "time": "2024-12-17T17:20:49+00:00" }, { "name": "phpstan/phpstan-strict-rules", "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", "reference": "b564ca479e7e735f750aaac4935af965572a7845" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b564ca479e7e735f750aaac4935af965572a7845", "reference": "b564ca479e7e735f750aaac4935af965572a7845", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", "phpstan/phpstan": "^1.12.4" }, "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^9.5" }, "type": "phpstan-extension", "extra": { "phpstan": { "includes": [ "rules.neon" ] } }, "autoload": { "psr-4": { "PHPStan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.2" }, "time": "2025-01-19T13:02:24+00:00" }, { "name": "phpstan/phpstan-symfony", "version": "1.4.13", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", "reference": "dd1aaa7f85f9916222a2ce7e4d21072fe03958f4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/dd1aaa7f85f9916222a2ce7e4d21072fe03958f4", "reference": "dd1aaa7f85f9916222a2ce7e4d21072fe03958f4", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.2 || ^8.0", "phpstan/phpstan": "^1.12" }, "conflict": { "symfony/framework-bundle": "<3.0" }, "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-phpunit": "^1.3.11", "phpstan/phpstan-strict-rules": "^1.5.1", "phpunit/phpunit": "^8.5.29 || ^9.5", "psr/container": "1.0 || 1.1.1", "symfony/config": "^5.4 || ^6.1", "symfony/console": "^5.4 || ^6.1", "symfony/dependency-injection": "^5.4 || ^6.1", "symfony/form": "^5.4 || ^6.1", "symfony/framework-bundle": "^5.4 || ^6.1", "symfony/http-foundation": "^5.4 || ^6.1", "symfony/messenger": "^5.4", "symfony/polyfill-php80": "^1.24", "symfony/serializer": "^5.4", "symfony/service-contracts": "^2.2.0" }, "type": "phpstan-extension", "extra": { "phpstan": { "includes": [ "extension.neon", "rules.neon" ] } }, "autoload": { "psr-4": { "PHPStan\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Lukáš Unger", "email": "looky.msc@gmail.com", "homepage": "https://lookyman.net" } ], "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.13" }, "time": "2025-01-04T13:55:31+00:00" }, { "name": "symfony/phpunit-bridge", "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/2bbde92ab25a0e2c88160857af7be9db5da0d145", "reference": "2bbde92ab25a0e2c88160857af7be9db5da0d145", "shasum": "" }, "require": { "php": ">=7.2.5" }, "conflict": { "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/error-handler": "^5.4|^6.4|^7.0", "symfony/polyfill-php81": "^1.27" }, "bin": [ "bin/simple-phpunit" ], "type": "symfony-bridge", "extra": { "thanks": { "url": "https://github.com/sebastianbergmann/phpunit", "name": "phpunit/phpunit" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ "/Tests/", "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/phpunit-bridge/tree/v7.2.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2024-11-13T16:15:23+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "^7.2.5 || ^8.0" }, "platform-dev": {}, "platform-overrides": { "php": "7.2.5" }, "plugin-api-version": "2.6.0" } Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #!/usr/bin/env php check(); unset($xdebug); if (\defined('_ContaoManager\\HHVM_VERSION') && \version_compare(\_ContaoManager\HHVM_VERSION, '4.0', '>=')) { echo 'HHVM 4.0 has dropped support for Composer, please use PHP instead. Aborting.' . \PHP_EOL; exit(1); } if (!\extension_loaded('iconv') && !\extension_loaded('mbstring')) { echo 'The iconv OR mbstring extension is required and both are missing.' . \PHP_EOL . 'Install either of them or recompile php without --disable-iconv.' . \PHP_EOL . 'Aborting.' . \PHP_EOL; exit(1); } if (\function_exists('ini_set')) { // check if error logging is on, but to an empty destination - for the CLI SAPI, that means stderr $logsToSapiDefault = '' === \ini_get('error_log') && (bool) \ini_get('log_errors'); // on the CLI SAPI, ensure errors are displayed on stderr, either via display_errors or via error_log if (\PHP_SAPI === 'cli') { @\ini_set('display_errors', $logsToSapiDefault ? '0' : 'stderr'); } // Set user defined memory limit if ($memoryLimit = \getenv('COMPOSER_MEMORY_LIMIT')) { @\ini_set('memory_limit', $memoryLimit); } else { $memoryInBytes = function ($value) { $unit = \strtolower(\substr($value, -1, 1)); $value = (int) $value; switch ($unit) { case 'g': $value *= 1024; // no break (cumulative multiplier) case 'm': $value *= 1024; // no break (cumulative multiplier) case 'k': $value *= 1024; } return $value; }; $memoryLimit = \trim(\ini_get('memory_limit')); // Increase memory_limit if it is lower than 1.5GB if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) { @\ini_set('memory_limit', '1536M'); } unset($memoryInBytes); } unset($memoryLimit); } // Workaround PHP bug on Windows where env vars containing Unicode chars are mangled in $_SERVER // see https://github.com/php/php-src/issues/7896 if (\PHP_VERSION_ID >= 70113 && (\PHP_VERSION_ID < 80016 || \PHP_VERSION_ID >= 80100 && \PHP_VERSION_ID < 80103) && Platform::isWindows()) { foreach ($_SERVER as $serverVar => $serverVal) { if (($serverVal = \getenv($serverVar)) !== \false) { $_SERVER[$serverVar] = $serverVal; } } } Platform::putEnv('COMPOSER_BINARY', \realpath($_SERVER['argv'][0])); ErrorHandler::register(); // run the command application $application = new Application(); $application->run(); #!/usr/bin/env php compile(); } catch (\Exception $e) { echo 'Failed to compile phar: [' . \get_class($e) . '] ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . \PHP_EOL; exit(1); } { "name": "composer\/composer", "type": "library", "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", "keywords": [ "package", "dependency", "autoload" ], "homepage": "https:\/\/getcomposer.org\/", "license": "MIT", "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "https:\/\/www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "https:\/\/seld.be" } ], "require": { "php": "^7.2.5 || ^8.0", "composer\/ca-bundle": "^1.5", "composer\/class-map-generator": "^1.4.0", "composer\/metadata-minifier": "^1.0", "composer\/semver": "^3.3", "composer\/spdx-licenses": "^1.5.7", "composer\/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow\/json-schema": "^5.3", "psr\/log": "^1.0 || ^2.0 || ^3.0", "seld\/jsonlint": "^1.4", "seld\/phar-utils": "^1.2", "symfony\/console": "^5.4.35 || ^6.3.12 || ^7.0.3", "symfony\/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", "symfony\/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", "symfony\/process": "^5.4.35 || ^6.3.12 || ^7.0.3", "react\/promise": "^2.11 || ^3.2", "composer\/pcre": "^2.2 || ^3.2", "symfony\/polyfill-php73": "^1.24", "symfony\/polyfill-php80": "^1.24", "symfony\/polyfill-php81": "^1.24", "seld\/signal-handler": "^2.0" }, "require-dev": { "symfony\/phpunit-bridge": "^6.4.3 || ^7.0.1", "phpstan\/phpstan": "^1.11.8", "phpstan\/phpstan-phpunit": "^1.4.0", "phpstan\/phpstan-deprecation-rules": "^1.2.0", "phpstan\/phpstan-strict-rules": "^1.6.0", "phpstan\/phpstan-symfony": "^1.4.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", "ext-zip": "Enabling the zip extension allows you to unzip archives", "ext-zlib": "Allow gzip compression of HTTP requests" }, "config": { "platform": { "php": "7.2.5" }, "platform-check": false }, "extra": { "branch-alias": { "dev-main": "2.8-dev" }, "phpstan": { "includes": [ "phpstan\/rules.neon" ] } }, "autoload": { "psr-4": { "Composer\\": "src\/Composer\/" } }, "autoload-dev": { "psr-4": { "Composer\\Test\\": "tests\/Composer\/Test\/" }, "exclude-from-classmap": [ "tests\/Composer\/Test\/Fixtures\/", "tests\/Composer\/Test\/Autoload\/Fixtures", "tests\/Composer\/Test\/Autoload\/MinimumVersionSupport", "tests\/Composer\/Test\/Plugin\/Fixtures" ] }, "bin": [ "bin\/composer" ], "scripts": { "compile": "@php -dphar.readonly=0 bin\/compile", "test": "@php simple-phpunit", "phpstan": "@php vendor\/bin\/phpstan analyse --configuration=phpstan\/config.neon" }, "scripts-descriptions": { "compile": "Compile composer.phar", "test": "Run all tests", "phpstan": "Runs PHPStan" }, "support": { "issues": "https:\/\/github.com\/composer\/composer\/issues", "irc": "ircs:\/\/irc.libera.chat:6697\/composer", "security": "https:\/\/github.com\/composer\/composer\/security\/policy" } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\PHPStan; use Composer\DependencyResolver\Rule; use Composer\Package\BasePackage; use Composer\Package\Link; use Composer\Semver\Constraint\ConstraintInterface; use _ContaoManager\PhpParser\Node\Expr\MethodCall; use _ContaoManager\PHPStan\Analyser\Scope; use _ContaoManager\PHPStan\Reflection\MethodReflection; use _ContaoManager\PHPStan\Type\Accessory\AccessoryNonEmptyStringType; use _ContaoManager\PHPStan\Type\Constant\ConstantArrayType; use _ContaoManager\PHPStan\Type\Constant\ConstantStringType; use _ContaoManager\PHPStan\Type\Constant\ConstantIntegerType; use _ContaoManager\PHPStan\Type\DynamicMethodReturnTypeExtension; use _ContaoManager\PHPStan\Type\IntegerType; use _ContaoManager\PHPStan\Type\StringType; use _ContaoManager\PHPStan\Type\Type; use _ContaoManager\PHPStan\Type\ObjectType; use _ContaoManager\PHPStan\Type\TypeCombinator; use _ContaoManager\PhpParser\Node\Identifier; final class RuleReasonDataReturnTypeExtension implements DynamicMethodReturnTypeExtension { public function getClass() : string { return Rule::class; } public function isMethodSupported(MethodReflection $methodReflection) : bool { return \strtolower($methodReflection->getName()) === 'getreasondata'; } public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope) : Type { $reasonType = $scope->getType(new MethodCall($methodCall->var, new Identifier('getReason'))); $types = [Rule::RULE_ROOT_REQUIRE => new ConstantArrayType([new ConstantStringType('packageName'), new ConstantStringType('constraint')], [new StringType(), new ObjectType(ConstraintInterface::class)]), Rule::RULE_FIXED => new ConstantArrayType([new ConstantStringType('package')], [new ObjectType(BasePackage::class)]), Rule::RULE_PACKAGE_CONFLICT => new ObjectType(Link::class), Rule::RULE_PACKAGE_REQUIRES => new ObjectType(Link::class), Rule::RULE_PACKAGE_SAME_NAME => TypeCombinator::intersect(new StringType(), new AccessoryNonEmptyStringType()), Rule::RULE_LEARNED => new IntegerType(), Rule::RULE_PACKAGE_ALIAS => new ObjectType(BasePackage::class), Rule::RULE_PACKAGE_INVERSE_ALIAS => new ObjectType(BasePackage::class)]; foreach ($types as $const => $type) { if ((new ConstantIntegerType($const))->isSuperTypeOf($reasonType)->yes()) { return $type; } } return TypeCombinator::union(...$types); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\PHPStan; use Composer\Config; use Composer\Json\JsonFile; use _ContaoManager\PhpParser\Node\Expr\MethodCall; use _ContaoManager\PHPStan\Analyser\Scope; use _ContaoManager\PHPStan\Reflection\MethodReflection; use _ContaoManager\PHPStan\Reflection\ParametersAcceptorSelector; use _ContaoManager\PHPStan\Type\ArrayType; use _ContaoManager\PHPStan\Type\BooleanType; use _ContaoManager\PHPStan\Type\Constant\ConstantArrayType; use _ContaoManager\PHPStan\Type\Constant\ConstantBooleanType; use _ContaoManager\PHPStan\Type\Constant\ConstantStringType; use _ContaoManager\PHPStan\Type\DynamicMethodReturnTypeExtension; use _ContaoManager\PHPStan\Type\IntegerRangeType; use _ContaoManager\PHPStan\Type\IntegerType; use _ContaoManager\PHPStan\Type\MixedType; use _ContaoManager\PHPStan\Type\StringType; use _ContaoManager\PHPStan\Type\Type; use _ContaoManager\PHPStan\Type\TypeCombinator; use _ContaoManager\PHPStan\Type\TypeUtils; use _ContaoManager\PHPStan\Type\UnionType; final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtension { /** @var array */ private $properties = []; public function __construct() { $schema = JsonFile::parseJson((string) \file_get_contents(JsonFile::COMPOSER_SCHEMA_PATH)); /** * @var string $prop */ foreach ($schema['properties']['config']['properties'] as $prop => $conf) { $type = $this->parseType($conf, $prop); $this->properties[$prop] = $type; } } public function getClass() : string { return Config::class; } public function isMethodSupported(MethodReflection $methodReflection) : bool { return \strtolower($methodReflection->getName()) === 'get'; } public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope) : ?Type { $args = $methodCall->getArgs(); if (\count($args) < 1) { return null; } $keyType = $scope->getType($args[0]->value); if (\method_exists($keyType, 'getConstantStrings')) { // @phpstan-ignore function.alreadyNarrowedType (- depending on PHPStan version, this method will always exist, or not.) $strings = $keyType->getConstantStrings(); } else { // for compat with old phpstan versions, we use a deprecated phpstan method. $strings = TypeUtils::getConstantStrings($keyType); // @phpstan-ignore staticMethod.deprecated (ignore deprecation) } if ($strings !== []) { $types = []; foreach ($strings as $string) { if (!isset($this->properties[$string->getValue()])) { return null; } $types[] = $this->properties[$string->getValue()]; } return TypeCombinator::union(...$types); } return null; } /** * @param array $def */ private function parseType(array $def, string $path) : Type { if (isset($def['type'])) { $types = []; foreach ((array) $def['type'] as $type) { switch ($type) { case 'integer': if (\in_array($path, ['process-timeout', 'cache-ttl', 'cache-files-ttl', 'cache-files-maxsize'], \true)) { $types[] = IntegerRangeType::createAllGreaterThanOrEqualTo(0); } else { $types[] = new IntegerType(); } break; case 'string': if ($path === 'cache-files-maxsize') { // passthru, skip as it is always converted to int } elseif ($path === 'discard-changes') { $types[] = new ConstantStringType('stash'); } elseif ($path === 'use-parent-dir') { $types[] = new ConstantStringType('prompt'); } elseif ($path === 'store-auths') { $types[] = new ConstantStringType('prompt'); } elseif ($path === 'platform-check') { $types[] = new ConstantStringType('php-only'); } elseif ($path === 'github-protocols') { $types[] = new UnionType([new ConstantStringType('git'), new ConstantStringType('https'), new ConstantStringType('ssh'), new ConstantStringType('http')]); } elseif (\str_starts_with($path, 'preferred-install')) { $types[] = new UnionType([new ConstantStringType('source'), new ConstantStringType('dist'), new ConstantStringType('auto')]); } else { $types[] = new StringType(); } break; case 'boolean': if ($path === 'platform.additionalProperties') { $types[] = new ConstantBooleanType(\false); } else { $types[] = new BooleanType(); } break; case 'object': $addlPropType = null; if (isset($def['additionalProperties'])) { $addlPropType = $this->parseType($def['additionalProperties'], $path . '.additionalProperties'); } if (isset($def['properties'])) { $keyNames = []; $valTypes = []; $optionalKeys = []; $propIndex = 0; foreach ($def['properties'] as $propName => $propdef) { $keyNames[] = new ConstantStringType($propName); $valType = $this->parseType($propdef, $path . '.' . $propName); if (!isset($def['required']) || !\in_array($propName, $def['required'], \true)) { $valType = TypeCombinator::addNull($valType); $optionalKeys[] = $propIndex; } $valTypes[] = $valType; $propIndex++; } if ($addlPropType !== null) { $types[] = new ArrayType(TypeCombinator::union(new StringType(), ...$keyNames), TypeCombinator::union($addlPropType, ...$valTypes)); } else { $types[] = new ConstantArrayType($keyNames, $valTypes, [0], $optionalKeys); } } else { $types[] = new ArrayType(new StringType(), $addlPropType ?? new MixedType()); } break; case 'array': if (isset($def['items'])) { $valType = $this->parseType($def['items'], $path . '.items'); } else { $valType = new MixedType(); } $types[] = new ArrayType(new IntegerType(), $valType); break; default: $types[] = new MixedType(); } } $type = TypeCombinator::union(...$types); } elseif (isset($def['enum'])) { $type = TypeCombinator::union(...\array_map(static function (string $value) : ConstantStringType { return new ConstantStringType($value); }, $def['enum'])); } else { $type = new MixedType(); } // allow-plugins defaults to null until July 1st 2022 for some BC hackery, but after that it is not nullable anymore if ($path === 'allow-plugins' && \time() < \strtotime('2022-07-01')) { $type = TypeCombinator::addNull($type); } // default null props if (\in_array($path, ['autoloader-suffix', 'gitlab-protocol'], \true)) { $type = TypeCombinator::addNull($type); } return $type; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Config\JsonConfigSource; use Composer\Json\JsonFile; use Composer\IO\IOInterface; use Composer\Package\Archiver; use Composer\Package\Version\VersionGuesser; use Composer\Package\RootPackageInterface; use Composer\Repository\FilesystemRepository; use Composer\Repository\RepositoryManager; use Composer\Repository\RepositoryFactory; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\HttpDownloader; use Composer\Util\Loop; use Composer\Util\Silencer; use Composer\Plugin\PluginEvents; use Composer\EventDispatcher\Event; use Phar; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatterStyle; use _ContaoManager\Symfony\Component\Console\Output\ConsoleOutput; use Composer\EventDispatcher\EventDispatcher; use Composer\Autoload\AutoloadGenerator; use Composer\Package\Version\VersionParser; use Composer\Downloader\TransportException; use Composer\Json\JsonValidationException; use Composer\Repository\InstalledRepositoryInterface; use UnexpectedValueException; use ZipArchive; /** * Creates a configured instance of composer. * * @author Ryan Weaver * @author Jordi Boggiano * @author Igor Wiedler * @author Nils Adermann */ class Factory { /** * @throws \RuntimeException */ protected static function getHomeDir() : string { $home = Platform::getEnv('COMPOSER_HOME'); if ($home) { return $home; } if (Platform::isWindows()) { if (!Platform::getEnv('APPDATA')) { throw new \RuntimeException('The APPDATA or COMPOSER_HOME environment variable must be set for composer to run correctly'); } return \rtrim(\strtr(Platform::getEnv('APPDATA'), '\\', '/'), '/') . '/Composer'; } $userDir = self::getUserDir(); $dirs = []; if (self::useXdg()) { // XDG Base Directory Specifications $xdgConfig = Platform::getEnv('XDG_CONFIG_HOME'); if (!$xdgConfig) { $xdgConfig = $userDir . '/.config'; } $dirs[] = $xdgConfig . '/composer'; } $dirs[] = $userDir . '/.composer'; // select first dir which exists of: $XDG_CONFIG_HOME/composer or ~/.composer foreach ($dirs as $dir) { if (Silencer::call('is_dir', $dir)) { return $dir; } } // if none exists, we default to first defined one (XDG one if system uses it, or ~/.composer otherwise) return $dirs[0]; } protected static function getCacheDir(string $home) : string { $cacheDir = Platform::getEnv('COMPOSER_CACHE_DIR'); if ($cacheDir) { return $cacheDir; } $homeEnv = Platform::getEnv('COMPOSER_HOME'); if ($homeEnv) { return $homeEnv . '/cache'; } if (Platform::isWindows()) { if ($cacheDir = Platform::getEnv('LOCALAPPDATA')) { $cacheDir .= '/Composer'; } else { $cacheDir = $home . '/cache'; } return \rtrim(\strtr($cacheDir, '\\', '/'), '/'); } $userDir = self::getUserDir(); if (\PHP_OS === 'Darwin') { // Migrate existing cache dir in old location if present if (\is_dir($home . '/cache') && !\is_dir($userDir . '/Library/Caches/composer')) { Silencer::call('rename', $home . '/cache', $userDir . '/Library/Caches/composer'); } return $userDir . '/Library/Caches/composer'; } if ($home === $userDir . '/.composer' && \is_dir($home . '/cache')) { return $home . '/cache'; } if (self::useXdg()) { $xdgCache = Platform::getEnv('XDG_CACHE_HOME') ?: $userDir . '/.cache'; return $xdgCache . '/composer'; } return $home . '/cache'; } protected static function getDataDir(string $home) : string { $homeEnv = Platform::getEnv('COMPOSER_HOME'); if ($homeEnv) { return $homeEnv; } if (Platform::isWindows()) { return \strtr($home, '\\', '/'); } $userDir = self::getUserDir(); if ($home !== $userDir . '/.composer' && self::useXdg()) { $xdgData = Platform::getEnv('XDG_DATA_HOME') ?: $userDir . '/.local/share'; return $xdgData . '/composer'; } return $home; } public static function createConfig(?IOInterface $io = null, ?string $cwd = null) : \Composer\Config { $cwd = $cwd ?? Platform::getCwd(\true); $config = new \Composer\Config(\true, $cwd); // determine and add main dirs to the config $home = self::getHomeDir(); $config->merge(['config' => ['home' => $home, 'cache-dir' => self::getCacheDir($home), 'data-dir' => self::getDataDir($home)]], \Composer\Config::SOURCE_DEFAULT); // load global config $file = new JsonFile($config->get('home') . '/config.json'); if ($file->exists()) { if ($io instanceof IOInterface) { $io->writeError('Loading config file ' . $file->getPath(), \true, IOInterface::DEBUG); } self::validateJsonSchema($io, $file); $config->merge($file->read(), $file->getPath()); } $config->setConfigSource(new JsonConfigSource($file)); $htaccessProtect = $config->get('htaccess-protect'); if ($htaccessProtect) { // Protect directory against web access. Since HOME could be // the www-data's user home and be web-accessible it is a // potential security risk $dirs = [$config->get('home'), $config->get('cache-dir'), $config->get('data-dir')]; foreach ($dirs as $dir) { if (!\file_exists($dir . '/.htaccess')) { if (!\is_dir($dir)) { Silencer::call('mkdir', $dir, 0777, \true); } Silencer::call('file_put_contents', $dir . '/.htaccess', 'Deny from all'); } } } // load global auth file $file = new JsonFile($config->get('home') . '/auth.json'); if ($file->exists()) { if ($io instanceof IOInterface) { $io->writeError('Loading config file ' . $file->getPath(), \true, IOInterface::DEBUG); } self::validateJsonSchema($io, $file, JsonFile::AUTH_SCHEMA); $config->merge(['config' => $file->read()], $file->getPath()); } $config->setAuthConfigSource(new JsonConfigSource($file, \true)); self::loadComposerAuthEnv($config, $io); return $config; } public static function getComposerFile() : string { $env = Platform::getEnv('COMPOSER'); if (\is_string($env)) { $env = \trim($env); if ('' !== $env) { if (\is_dir($env)) { throw new \RuntimeException('The COMPOSER environment variable is set to ' . $env . ' which is a directory, this variable should point to a composer.json or be left unset.'); } return $env; } } return './composer.json'; } public static function getLockFile(string $composerFile) : string { return "json" === \pathinfo($composerFile, \PATHINFO_EXTENSION) ? \substr($composerFile, 0, -4) . 'lock' : $composerFile . '.lock'; } /** * @return array{highlight: OutputFormatterStyle, warning: OutputFormatterStyle} */ public static function createAdditionalStyles() : array { return ['highlight' => new OutputFormatterStyle('red'), 'warning' => new OutputFormatterStyle('black', 'yellow')]; } public static function createOutput() : ConsoleOutput { $styles = self::createAdditionalStyles(); $formatter = new OutputFormatter(\false, $styles); return new ConsoleOutput(ConsoleOutput::VERBOSITY_NORMAL, null, $formatter); } /** * Creates a Composer instance * * @param IOInterface $io IO instance * @param array|string|null $localConfig either a configuration array or a filename to read from, if null it will * read from the default filename * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts Whether scripts should not be run * @param bool $fullLoad Whether to initialize everything or only main project stuff (used when loading the global composer) * @throws \InvalidArgumentException * @throws \UnexpectedValueException * @return Composer|PartialComposer Composer if $fullLoad is true, otherwise PartialComposer * @phpstan-return ($fullLoad is true ? Composer : PartialComposer) */ public function createComposer(IOInterface $io, $localConfig = null, $disablePlugins = \false, ?string $cwd = null, bool $fullLoad = \true, bool $disableScripts = \false) { // if a custom composer.json path is given, we change the default cwd to be that file's directory if (\is_string($localConfig) && \is_file($localConfig) && null === $cwd) { $cwd = \dirname($localConfig); } $cwd = $cwd ?? Platform::getCwd(\true); // load Composer configuration if (null === $localConfig) { $localConfig = static::getComposerFile(); } $localConfigSource = \Composer\Config::SOURCE_UNKNOWN; if (\is_string($localConfig)) { $composerFile = $localConfig; $file = new JsonFile($localConfig, null, $io); if (!$file->exists()) { if ($localConfig === './composer.json' || $localConfig === 'composer.json') { $message = 'Composer could not find a composer.json file in ' . $cwd; } else { $message = 'Composer could not find the config file: ' . $localConfig; } $instructions = $fullLoad ? 'To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage' : ''; throw new \InvalidArgumentException($message . \PHP_EOL . $instructions); } if (!Platform::isInputCompletionProcess()) { try { $file->validateSchema(JsonFile::LAX_SCHEMA); } catch (JsonValidationException $e) { $errors = ' - ' . \implode(\PHP_EOL . ' - ', $e->getErrors()); $message = $e->getMessage() . ':' . \PHP_EOL . $errors; throw new JsonValidationException($message); } } $localConfig = $file->read(); $localConfigSource = $file->getPath(); } // Load config and override with local config/auth config $config = static::createConfig($io, $cwd); $isGlobal = $localConfigSource !== \Composer\Config::SOURCE_UNKNOWN && \realpath($config->get('home')) === \realpath(\dirname($localConfigSource)); $config->merge($localConfig, $localConfigSource); if (isset($composerFile)) { $io->writeError('Loading config file ' . $composerFile . ' (' . \realpath($composerFile) . ')', \true, IOInterface::DEBUG); $config->setConfigSource(new JsonConfigSource(new JsonFile(\realpath($composerFile), null, $io))); $localAuthFile = new JsonFile(\dirname(\realpath($composerFile)) . '/auth.json', null, $io); if ($localAuthFile->exists()) { $io->writeError('Loading config file ' . $localAuthFile->getPath(), \true, IOInterface::DEBUG); self::validateJsonSchema($io, $localAuthFile, JsonFile::AUTH_SCHEMA); $config->merge(['config' => $localAuthFile->read()], $localAuthFile->getPath()); $config->setLocalAuthConfigSource(new JsonConfigSource($localAuthFile, \true)); } } // make sure we load the auth env again over the local auth.json + composer.json config self::loadComposerAuthEnv($config, $io); $vendorDir = $config->get('vendor-dir'); // initialize composer $composer = $fullLoad ? new \Composer\Composer() : new \Composer\PartialComposer(); $composer->setConfig($config); if ($isGlobal) { $composer->setGlobal(); } if ($fullLoad) { // load auth configs into the IO instance $io->loadConfiguration($config); // load existing Composer\InstalledVersions instance if available and scripts/plugins are allowed, as they might need it // we only load if the InstalledVersions class wasn't defined yet so that this is only loaded once if (\false === $disablePlugins && \false === $disableScripts && !\class_exists('Composer\\InstalledVersions', \false) && \file_exists($installedVersionsPath = $config->get('vendor-dir') . '/composer/installed.php')) { // force loading the class at this point so it is loaded from the composer phar and not from the vendor dir // as we cannot guarantee integrity of that file if (\class_exists('Composer\\InstalledVersions')) { FilesystemRepository::safelyLoadInstalledVersions($installedVersionsPath); } } } $httpDownloader = self::createHttpDownloader($io, $config); $process = new ProcessExecutor($io); $loop = new Loop($httpDownloader, $process); $composer->setLoop($loop); // initialize event dispatcher $dispatcher = new EventDispatcher($composer, $io, $process); $dispatcher->setRunScripts(!$disableScripts); $composer->setEventDispatcher($dispatcher); // initialize repository manager $rm = RepositoryFactory::manager($io, $config, $httpDownloader, $dispatcher, $process); $composer->setRepositoryManager($rm); // force-set the version of the global package if not defined as // guessing it adds no value and only takes time if (!$fullLoad && !isset($localConfig['version'])) { $localConfig['version'] = '1.0.0'; } // load package $parser = new VersionParser(); $guesser = new VersionGuesser($config, $process, $parser, $io); $loader = $this->loadRootPackage($rm, $config, $parser, $guesser, $io); $package = $loader->load($localConfig, 'Composer\\Package\\RootPackage', $cwd); $composer->setPackage($package); // load local repository $this->addLocalRepository($io, $rm, $vendorDir, $package, $process); // initialize installation manager $im = $this->createInstallationManager($loop, $io, $dispatcher); $composer->setInstallationManager($im); if ($composer instanceof \Composer\Composer) { // initialize download manager $dm = $this->createDownloadManager($io, $config, $httpDownloader, $process, $dispatcher); $composer->setDownloadManager($dm); // initialize autoload generator $generator = new AutoloadGenerator($dispatcher, $io); $composer->setAutoloadGenerator($generator); // initialize archive manager $am = $this->createArchiveManager($config, $dm, $loop); $composer->setArchiveManager($am); } // add installers to the manager (must happen after download manager is created since they read it out of $composer) $this->createDefaultInstallers($im, $composer, $io, $process); // init locker if possible if ($composer instanceof \Composer\Composer && isset($composerFile)) { $lockFile = self::getLockFile($composerFile); if (!$config->get('lock') && \file_exists($lockFile)) { $io->writeError('' . $lockFile . ' is present but ignored as the "lock" config option is disabled.'); } $locker = new \Composer\Package\Locker($io, new JsonFile($config->get('lock') ? $lockFile : Platform::getDevNull(), null, $io), $im, \file_get_contents($composerFile), $process); $composer->setLocker($locker); } elseif ($composer instanceof \Composer\Composer) { $locker = new \Composer\Package\Locker($io, new JsonFile(Platform::getDevNull(), null, $io), $im, JsonFile::encode($localConfig), $process); $composer->setLocker($locker); } if ($composer instanceof \Composer\Composer) { $globalComposer = null; if (!$composer->isGlobal()) { $globalComposer = $this->createGlobalComposer($io, $config, $disablePlugins, $disableScripts); } $pm = $this->createPluginManager($io, $composer, $globalComposer, $disablePlugins); $composer->setPluginManager($pm); if ($composer->isGlobal()) { $pm->setRunningInGlobalDir(\true); } $pm->loadInstalledPlugins(); } if ($fullLoad) { $initEvent = new Event(PluginEvents::INIT); $composer->getEventDispatcher()->dispatch($initEvent->getName(), $initEvent); // once everything is initialized we can // purge packages from local repos if they have been deleted on the filesystem $this->purgePackages($rm->getLocalRepository(), $im); } return $composer; } /** * @param bool $disablePlugins Whether plugins should not be loaded * @param bool $disableScripts Whether scripts should not be executed */ public static function createGlobal(IOInterface $io, bool $disablePlugins = \false, bool $disableScripts = \false) : ?\Composer\Composer { $factory = new static(); return $factory->createGlobalComposer($io, static::createConfig($io), $disablePlugins, $disableScripts, \true); } /** * @param Repository\RepositoryManager $rm */ protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, string $vendorDir, RootPackageInterface $rootPackage, ?ProcessExecutor $process = null) : void { $fs = null; if ($process) { $fs = new Filesystem($process); } $rm->setLocalRepository(new \Composer\Repository\InstalledFilesystemRepository(new JsonFile($vendorDir . '/composer/installed.json', null, $io), \true, $rootPackage, $fs)); } /** * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @return PartialComposer|Composer|null By default PartialComposer, but Composer if $fullLoad is set to true * @phpstan-return ($fullLoad is true ? Composer|null : PartialComposer|null) */ protected function createGlobalComposer(IOInterface $io, \Composer\Config $config, $disablePlugins, bool $disableScripts, bool $fullLoad = \false) : ?\Composer\PartialComposer { // make sure if disable plugins was 'local' it is now turned off $disablePlugins = $disablePlugins === 'global' || $disablePlugins === \true; $composer = null; try { $composer = $this->createComposer($io, $config->get('home') . '/composer.json', $disablePlugins, $config->get('home'), $fullLoad, $disableScripts); } catch (\Exception $e) { $io->writeError('Failed to initialize global composer: ' . $e->getMessage(), \true, IOInterface::DEBUG); } return $composer; } /** * @param IO\IOInterface $io * @param EventDispatcher $eventDispatcher */ public function createDownloadManager(IOInterface $io, \Composer\Config $config, HttpDownloader $httpDownloader, ProcessExecutor $process, ?EventDispatcher $eventDispatcher = null) : \Composer\Downloader\DownloadManager { $cache = null; if ($config->get('cache-files-ttl') > 0) { $cache = new \Composer\Cache($io, $config->get('cache-files-dir'), 'a-z0-9_./'); $cache->setReadOnly($config->get('cache-read-only')); } $fs = new Filesystem($process); $dm = new \Composer\Downloader\DownloadManager($io, \false, $fs); switch ($preferred = $config->get('preferred-install')) { case 'dist': $dm->setPreferDist(\true); break; case 'source': $dm->setPreferSource(\true); break; case 'auto': default: // noop break; } if (\is_array($preferred)) { $dm->setPreferences($preferred); } $dm->setDownloader('git', new \Composer\Downloader\GitDownloader($io, $config, $process, $fs)); $dm->setDownloader('svn', new \Composer\Downloader\SvnDownloader($io, $config, $process, $fs)); $dm->setDownloader('fossil', new \Composer\Downloader\FossilDownloader($io, $config, $process, $fs)); $dm->setDownloader('hg', new \Composer\Downloader\HgDownloader($io, $config, $process, $fs)); $dm->setDownloader('perforce', new \Composer\Downloader\PerforceDownloader($io, $config, $process, $fs)); $dm->setDownloader('zip', new \Composer\Downloader\ZipDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('rar', new \Composer\Downloader\RarDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('tar', new \Composer\Downloader\TarDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('gzip', new \Composer\Downloader\GzipDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('xz', new \Composer\Downloader\XzDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('phar', new \Composer\Downloader\PharDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('file', new \Composer\Downloader\FileDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); $dm->setDownloader('path', new \Composer\Downloader\PathDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $fs, $process)); return $dm; } /** * @param Config $config The configuration * @param Downloader\DownloadManager $dm Manager use to download sources * @return Archiver\ArchiveManager */ public function createArchiveManager(\Composer\Config $config, \Composer\Downloader\DownloadManager $dm, Loop $loop) { $am = new Archiver\ArchiveManager($dm, $loop); if (\class_exists(ZipArchive::class)) { $am->addArchiver(new Archiver\ZipArchiver()); } if (\class_exists(Phar::class)) { $am->addArchiver(new Archiver\PharArchiver()); } return $am; } /** * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins */ protected function createPluginManager(IOInterface $io, \Composer\Composer $composer, ?\Composer\PartialComposer $globalComposer = null, $disablePlugins = \false) : \Composer\Plugin\PluginManager { return new \Composer\Plugin\PluginManager($io, $composer, $globalComposer, $disablePlugins); } public function createInstallationManager(Loop $loop, IOInterface $io, ?EventDispatcher $eventDispatcher = null) : \Composer\Installer\InstallationManager { return new \Composer\Installer\InstallationManager($loop, $io, $eventDispatcher); } protected function createDefaultInstallers(\Composer\Installer\InstallationManager $im, \Composer\PartialComposer $composer, IOInterface $io, ?ProcessExecutor $process = null) : void { $fs = new Filesystem($process); $binaryInstaller = new \Composer\Installer\BinaryInstaller($io, \rtrim($composer->getConfig()->get('bin-dir'), '/'), $composer->getConfig()->get('bin-compat'), $fs, \rtrim($composer->getConfig()->get('vendor-dir'), '/')); $im->addInstaller(new \Composer\Installer\LibraryInstaller($io, $composer, null, $fs, $binaryInstaller)); $im->addInstaller(new \Composer\Installer\PluginInstaller($io, $composer, $fs, $binaryInstaller)); $im->addInstaller(new \Composer\Installer\MetapackageInstaller($io)); } /** * @param InstalledRepositoryInterface $repo repository to purge packages from * @param Installer\InstallationManager $im manager to check whether packages are still installed */ protected function purgePackages(InstalledRepositoryInterface $repo, \Composer\Installer\InstallationManager $im) : void { foreach ($repo->getPackages() as $package) { if (!$im->isPackageInstalled($repo, $package)) { $repo->removePackage($package); } } } protected function loadRootPackage(RepositoryManager $rm, \Composer\Config $config, VersionParser $parser, VersionGuesser $guesser, IOInterface $io) : \Composer\Package\Loader\RootPackageLoader { return new \Composer\Package\Loader\RootPackageLoader($rm, $config, $parser, $guesser, $io); } /** * @param IOInterface $io IO instance * @param mixed $config either a configuration array or a filename to read from, if null it will read from * the default filename * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts Whether scripts should not be run */ public static function create(IOInterface $io, $config = null, $disablePlugins = \false, bool $disableScripts = \false) : \Composer\Composer { $factory = new static(); // for BC reasons, if a config is passed in either as array or a path that is not the default composer.json path // we disable local plugins as they really should not be loaded from CWD // If you want to avoid this behavior, you should be calling createComposer directly with a $cwd arg set correctly // to the path where the composer.json being loaded resides if ($config !== null && $config !== self::getComposerFile() && $disablePlugins === \false) { $disablePlugins = 'local'; } return $factory->createComposer($io, $config, $disablePlugins, null, \true, $disableScripts); } /** * If you are calling this in a plugin, you probably should instead use $composer->getLoop()->getHttpDownloader() * * @param IOInterface $io IO instance * @param Config $config Config instance * @param mixed[] $options Array of options passed directly to HttpDownloader constructor */ public static function createHttpDownloader(IOInterface $io, \Composer\Config $config, array $options = []) : HttpDownloader { static $warned = \false; $disableTls = \false; // allow running the config command if disable-tls is in the arg list, even if openssl is missing, to allow disabling it via the config command if (isset($_SERVER['argv']) && \in_array('disable-tls', $_SERVER['argv']) && (\in_array('conf', $_SERVER['argv']) || \in_array('config', $_SERVER['argv']))) { $warned = \true; $disableTls = !\extension_loaded('openssl'); } elseif ($config->get('disable-tls') === \true) { if (!$warned) { $io->writeError('You are running Composer with SSL/TLS protection disabled.'); } $warned = \true; $disableTls = \true; } elseif (!\extension_loaded('openssl')) { throw new \Composer\Exception\NoSslException('The openssl extension is required for SSL/TLS protection but is not available. ' . 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); } $httpDownloaderOptions = []; if ($disableTls === \false) { if ('' !== $config->get('cafile')) { $httpDownloaderOptions['ssl']['cafile'] = $config->get('cafile'); } if ('' !== $config->get('capath')) { $httpDownloaderOptions['ssl']['capath'] = $config->get('capath'); } $httpDownloaderOptions = \array_replace_recursive($httpDownloaderOptions, $options); } try { $httpDownloader = new HttpDownloader($io, $config, $httpDownloaderOptions, $disableTls); } catch (TransportException $e) { if (\false !== \strpos($e->getMessage(), 'cafile')) { $io->write('Unable to locate a valid CA certificate file. You must set a valid \'cafile\' option.'); $io->write('A valid CA certificate file is required for SSL/TLS protection.'); $io->write('You can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); } throw $e; } return $httpDownloader; } private static function loadComposerAuthEnv(\Composer\Config $config, ?IOInterface $io) : void { $composerAuthEnv = Platform::getEnv('COMPOSER_AUTH'); if (\false === $composerAuthEnv || '' === $composerAuthEnv) { return; } $authData = \json_decode($composerAuthEnv); if (null === $authData) { throw new \UnexpectedValueException('COMPOSER_AUTH environment variable is malformed, should be a valid JSON object'); } if ($io instanceof IOInterface) { $io->writeError('Loading auth config from COMPOSER_AUTH', \true, IOInterface::DEBUG); } self::validateJsonSchema($io, $authData, JsonFile::AUTH_SCHEMA, 'COMPOSER_AUTH'); $authData = \json_decode($composerAuthEnv, \true); if (null !== $authData) { $config->merge(['config' => $authData], 'COMPOSER_AUTH'); } } private static function useXdg() : bool { foreach (\array_keys($_SERVER) as $key) { if (\strpos((string) $key, 'XDG_') === 0) { return \true; } } if (Silencer::call('is_dir', '/etc/xdg')) { return \true; } return \false; } /** * @throws \RuntimeException */ private static function getUserDir() : string { $home = Platform::getEnv('HOME'); if (!$home) { throw new \RuntimeException('The HOME or COMPOSER_HOME environment variable must be set for composer to run correctly'); } return \rtrim(\strtr($home, '\\', '/'), '/'); } /** * @param mixed $fileOrData * @param JsonFile::*_SCHEMA $schema */ private static function validateJsonSchema(?IOInterface $io, $fileOrData, int $schema = JsonFile::LAX_SCHEMA, ?string $source = null) : void { if (Platform::isInputCompletionProcess()) { return; } try { if ($fileOrData instanceof JsonFile) { $fileOrData->validateSchema($schema); } else { if (null === $source) { throw new \InvalidArgumentException('$source is required to be provided if $fileOrData is arbitrary data'); } JsonFile::validateJsonSchema($source, $fileOrData, $schema); } } catch (JsonValidationException $e) { $msg = $e->getMessage() . ', this may result in errors and should be resolved:' . \PHP_EOL . ' - ' . \implode(\PHP_EOL . ' - ', $e->getErrors()); if ($io instanceof IOInterface) { $io->writeError('' . $msg . ''); } else { throw new UnexpectedValueException($msg); } } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; use Composer\Package\BasePackage; use Composer\Semver\Constraint\ConstraintInterface; /** * Repository interface. * * @author Nils Adermann * @author Konstantin Kudryashov * @author Jordi Boggiano */ interface RepositoryInterface extends \Countable { public const SEARCH_FULLTEXT = 0; public const SEARCH_NAME = 1; public const SEARCH_VENDOR = 2; /** * Checks if specified package registered (installed). * * @param PackageInterface $package package instance * * @return bool */ public function hasPackage(PackageInterface $package); /** * Searches for the first match of a package by name and version. * * @param string $name package name * @param string|ConstraintInterface $constraint package version or version constraint to match against * * @return BasePackage|null */ public function findPackage(string $name, $constraint); /** * Searches for all packages matching a name and optionally a version. * * @param string $name package name * @param string|ConstraintInterface $constraint package version or version constraint to match against * * @return BasePackage[] */ public function findPackages(string $name, $constraint = null); /** * Returns list of registered packages. * * @return BasePackage[] */ public function getPackages(); /** * Returns list of registered packages with the supplied name * * - The packages returned are the packages found which match the constraints, acceptable stability and stability flags provided * - The namesFound returned are names which should be considered as canonically found in this repository, that should not be looked up in any further lower priority repositories * * @param ConstraintInterface[] $packageNameMap package names pointing to constraints * @param array $acceptableStabilities array of stability => BasePackage::STABILITY_* value * @param array $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @param array> $alreadyLoaded an array of package name => package version => package * * @return array * * @phpstan-param array, BasePackage::STABILITY_*> $acceptableStabilities * @phpstan-param array $packageNameMap * @phpstan-return array{namesFound: array, packages: array} */ public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []); /** * Searches the repository for packages containing the query * * @param string $query search query, for SEARCH_NAME and SEARCH_VENDOR regular expressions metacharacters are supported by implementations, and user input should be escaped through preg_quote by callers * @param int $mode a set of SEARCH_* constants to search on, implementations should do a best effort only, default is SEARCH_FULLTEXT * @param ?string $type The type of package to search for. Defaults to all types of packages * * @return array[] an array of array('name' => '...', 'description' => '...'|null, 'abandoned' => 'string'|true|unset) For SEARCH_VENDOR the name will be in "vendor" form * @phpstan-return list */ public function search(string $query, int $mode = 0, ?string $type = null); /** * Returns a list of packages providing a given package name * * Packages which have the same name as $packageName should not be returned, only those that have a "provide" on it. * * @param string $packageName package name which must be provided * * @return array[] an array with the provider name as key and value of array('name' => '...', 'description' => '...', 'type' => '...') * @phpstan-return array */ public function getProviders(string $packageName); /** * Returns a name representing this repository to the user * * This is best effort and definitely can not always be very precise * * @return string */ public function getRepoName(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Installed filesystem repository. * * @author Jordi Boggiano */ class InstalledFilesystemRepository extends \Composer\Repository\FilesystemRepository implements \Composer\Repository\InstalledRepositoryInterface { public function getRepoName() { return 'installed ' . parent::getRepoName(); } /** * @inheritDoc */ public function isFresh() { return !$this->file->exists(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Pcre\Preg; /** * Package repository. * * @author Jordi Boggiano */ class PackageRepository extends \Composer\Repository\ArrayRepository { /** @var mixed[] */ private $config; /** * Initializes filesystem repository. * * @param array{package: mixed[]} $config package definition */ public function __construct(array $config) { parent::__construct(); $this->config = $config['package']; // make sure we have an array of package definitions if (!\is_numeric(\key($this->config))) { $this->config = [$this->config]; } } /** * Initializes repository (reads file, or remote address). */ protected function initialize() : void { parent::initialize(); $loader = new ValidatingArrayLoader(new ArrayLoader(null, \true), \true); foreach ($this->config as $package) { try { $package = $loader->load($package); } catch (\Exception $e) { throw new \Composer\Repository\InvalidRepositoryException('A repository of type "package" contains an invalid package definition: ' . $e->getMessage() . "\n\nInvalid package definition:\n" . \json_encode($package)); } $this->addPackage($package); } } public function getRepoName() : string { return Preg::replace('{^array }', 'package ', parent::getRepoName()); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Lock array repository. * * Regular array repository, only uses a different type to identify the lock file as the source of info * * @author Nils Adermann */ class LockArrayRepository extends \Composer\Repository\ArrayRepository { use \Composer\Repository\CanonicalPackagesTrait; public function getRepoName() : string { return 'lock repo'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Composer; use Composer\Package\CompletePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\Link; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Pcre\Preg; use Composer\Platform\HhvmDetector; use Composer\Platform\Runtime; use Composer\Platform\Version; use Composer\Plugin\PluginInterface; use Composer\Semver\Constraint\Constraint; use Composer\Util\Silencer; use Composer\XdebugHandler\XdebugHandler; /** * @author Jordi Boggiano */ class PlatformRepository extends \Composer\Repository\ArrayRepository { /** * @deprecated use PlatformRepository::isPlatformPackage(string $name) instead * @private */ public const PLATFORM_PACKAGE_REGEX = '{^(?:php(?:-64bit|-ipv6|-zts|-debug)?|hhvm|(?:ext|lib)-[a-z0-9](?:[_.-]?[a-z0-9]+)*|composer(?:-(?:plugin|runtime)-api)?)$}iD'; /** * @var ?string */ private static $lastSeenPlatformPhp = null; /** * @var VersionParser */ private $versionParser; /** * Defines overrides so that the platform can be mocked * * Keyed by package name (lowercased) * * @var array */ private $overrides = []; /** * Stores which packages have been disabled and their actual version * * @var array */ private $disabledPackages = []; /** @var Runtime */ private $runtime; /** @var HhvmDetector */ private $hhvmDetector; /** * @param array $overrides */ public function __construct(array $packages = [], array $overrides = [], ?Runtime $runtime = null, ?HhvmDetector $hhvmDetector = null) { $this->runtime = $runtime ?: new Runtime(); $this->hhvmDetector = $hhvmDetector ?: new HhvmDetector(); foreach ($overrides as $name => $version) { if (!\is_string($version) && \false !== $version) { // @phpstan-ignore-line throw new \UnexpectedValueException('config.platform.' . $name . ' should be a string or false, but got ' . \gettype($version) . ' ' . \var_export($version, \true)); } if ($name === 'php' && $version === \false) { throw new \UnexpectedValueException('config.platform.' . $name . ' cannot be set to false as you cannot disable php entirely.'); } $this->overrides[\strtolower($name)] = ['name' => $name, 'version' => $version]; } parent::__construct($packages); } public function getRepoName() : string { return 'platform repo'; } public function isPlatformPackageDisabled(string $name) : bool { return isset($this->disabledPackages[$name]); } /** * @return array */ public function getDisabledPackages() : array { return $this->disabledPackages; } protected function initialize() : void { parent::initialize(); $libraries = []; $this->versionParser = new VersionParser(); // Add each of the override versions as options. // Later we might even replace the extensions instead. foreach ($this->overrides as $override) { // Check that it's a platform package. if (!self::isPlatformPackage($override['name'])) { throw new \InvalidArgumentException('Invalid platform package name in config.platform: ' . $override['name']); } if ($override['version'] !== \false) { $this->addOverriddenPackage($override); } } $prettyVersion = Composer::getVersion(); $version = $this->versionParser->normalize($prettyVersion); $composer = new CompletePackage('composer', $version, $prettyVersion); $composer->setDescription('Composer package'); $this->addPackage($composer); $prettyVersion = PluginInterface::PLUGIN_API_VERSION; $version = $this->versionParser->normalize($prettyVersion); $composerPluginApi = new CompletePackage('composer-plugin-api', $version, $prettyVersion); $composerPluginApi->setDescription('The Composer Plugin API'); $this->addPackage($composerPluginApi); $prettyVersion = Composer::RUNTIME_API_VERSION; $version = $this->versionParser->normalize($prettyVersion); $composerRuntimeApi = new CompletePackage('composer-runtime-api', $version, $prettyVersion); $composerRuntimeApi->setDescription('The Composer Runtime API'); $this->addPackage($composerRuntimeApi); try { $prettyVersion = $this->runtime->getConstant('PHP_VERSION'); $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = Preg::replace('#^([^~+-]+).*$#', '$1', $this->runtime->getConstant('PHP_VERSION')); $version = $this->versionParser->normalize($prettyVersion); } $php = new CompletePackage('php', $version, $prettyVersion); $php->setDescription('The PHP interpreter'); $this->addPackage($php); if ($this->runtime->getConstant('PHP_DEBUG')) { $phpdebug = new CompletePackage('php-debug', $version, $prettyVersion); $phpdebug->setDescription('The PHP interpreter, with debugging symbols'); $this->addPackage($phpdebug); } if ($this->runtime->hasConstant('PHP_ZTS') && $this->runtime->getConstant('PHP_ZTS')) { $phpzts = new CompletePackage('php-zts', $version, $prettyVersion); $phpzts->setDescription('The PHP interpreter, with Zend Thread Safety'); $this->addPackage($phpzts); } if ($this->runtime->getConstant('PHP_INT_SIZE') === 8) { $php64 = new CompletePackage('php-64bit', $version, $prettyVersion); $php64->setDescription('The PHP interpreter, 64bit'); $this->addPackage($php64); } // The AF_INET6 constant is only defined if ext-sockets is available but // IPv6 support might still be available. if ($this->runtime->hasConstant('AF_INET6') || Silencer::call([$this->runtime, 'invoke'], 'inet_pton', ['::']) !== \false) { $phpIpv6 = new CompletePackage('php-ipv6', $version, $prettyVersion); $phpIpv6->setDescription('The PHP interpreter, with IPv6 support'); $this->addPackage($phpIpv6); } $loadedExtensions = $this->runtime->getExtensions(); // Extensions scanning foreach ($loadedExtensions as $name) { if (\in_array($name, ['standard', 'Core'])) { continue; } $this->addExtension($name, $this->runtime->getExtensionVersion($name)); } // Check for Xdebug in a restarted process if (!\in_array('xdebug', $loadedExtensions, \true) && ($prettyVersion = XdebugHandler::getSkippedVersion())) { $this->addExtension('xdebug', $prettyVersion); } // Another quick loop, just for possible libraries // Doing it this way to know that functions or constants exist before // relying on them. foreach ($loadedExtensions as $name) { switch ($name) { case 'amqp': $info = $this->runtime->getExtensionInfo($name); // librabbitmq version => 0.9.0 if (Preg::isMatch('/^librabbitmq version => (?.+)$/im', $info, $librabbitmqMatches)) { $this->addLibrary($libraries, $name . '-librabbitmq', $librabbitmqMatches['version'], 'AMQP librabbitmq version'); } // AMQP protocol version => 0-9-1 if (Preg::isMatchStrictGroups('/^AMQP protocol version => (?.+)$/im', $info, $protocolMatches)) { $this->addLibrary($libraries, $name . '-protocol', \str_replace('-', '.', $protocolMatches['version']), 'AMQP protocol version'); } break; case 'bz2': $info = $this->runtime->getExtensionInfo($name); // BZip2 Version => 1.0.6, 6-Sept-2010 if (Preg::isMatch('/^BZip2 Version => (?.*),/im', $info, $matches)) { $this->addLibrary($libraries, $name, $matches['version']); } break; case 'curl': $curlVersion = $this->runtime->invoke('curl_version'); $this->addLibrary($libraries, $name, $curlVersion['version']); $info = $this->runtime->getExtensionInfo($name); // SSL Version => OpenSSL/1.0.1t if (Preg::isMatchStrictGroups('{^SSL Version => (?[^/]+)/(?.+)$}im', $info, $sslMatches)) { $library = \strtolower($sslMatches['library']); if ($library === 'openssl') { $parsedVersion = Version::parseOpenssl($sslMatches['version'], $isFips); $this->addLibrary($libraries, $name . '-openssl' . ($isFips ? '-fips' : ''), $parsedVersion, 'curl OpenSSL version (' . $parsedVersion . ')', [], $isFips ? ['curl-openssl'] : []); } else { if ($library === '(securetransport) openssl') { $shortlib = 'securetransport'; } else { $shortlib = $library; } $this->addLibrary($libraries, $name . '-' . $shortlib, $sslMatches['version'], 'curl ' . $library . ' version (' . $sslMatches['version'] . ')', ['curl-openssl']); } } // libSSH Version => libssh2/1.4.3 if (Preg::isMatchStrictGroups('{^libSSH Version => (?[^/]+)/(?.+?)(?:/.*)?$}im', $info, $sshMatches)) { $this->addLibrary($libraries, $name . '-' . \strtolower($sshMatches['library']), $sshMatches['version'], 'curl ' . $sshMatches['library'] . ' version'); } // ZLib Version => 1.2.8 if (Preg::isMatchStrictGroups('{^ZLib Version => (?.+)$}im', $info, $zlibMatches)) { $this->addLibrary($libraries, $name . '-zlib', $zlibMatches['version'], 'curl zlib version'); } break; case 'date': $info = $this->runtime->getExtensionInfo($name); // timelib version => 2018.03 if (Preg::isMatchStrictGroups('/^timelib version => (?.+)$/im', $info, $timelibMatches)) { $this->addLibrary($libraries, $name . '-timelib', $timelibMatches['version'], 'date timelib version'); } // Timezone Database => internal if (Preg::isMatchStrictGroups('/^Timezone Database => (?internal|external)$/im', $info, $zoneinfoSourceMatches)) { $external = $zoneinfoSourceMatches['source'] === 'external'; if (Preg::isMatchStrictGroups('/^"Olson" Timezone Database Version => (?.+?)(?:\\.system)?$/im', $info, $zoneinfoMatches)) { // If the timezonedb is provided by ext/timezonedb, register that version as a replacement if ($external && \in_array('timezonedb', $loadedExtensions, \true)) { $this->addLibrary($libraries, 'timezonedb-zoneinfo', $zoneinfoMatches['version'], 'zoneinfo ("Olson") database for date (replaced by timezonedb)', [$name . '-zoneinfo']); } else { $this->addLibrary($libraries, $name . '-zoneinfo', $zoneinfoMatches['version'], 'zoneinfo ("Olson") database for date'); } } } break; case 'fileinfo': $info = $this->runtime->getExtensionInfo($name); // libmagic => 537 if (Preg::isMatch('/^libmagic => (?.+)$/im', $info, $magicMatches)) { $this->addLibrary($libraries, $name . '-libmagic', $magicMatches['version'], 'fileinfo libmagic version'); } break; case 'gd': $this->addLibrary($libraries, $name, $this->runtime->getConstant('GD_VERSION')); $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatchStrictGroups('/^libJPEG Version => (?.+?)(?: compatible)?$/im', $info, $libjpegMatches)) { $this->addLibrary($libraries, $name . '-libjpeg', Version::parseLibjpeg($libjpegMatches['version']), 'libjpeg version for gd'); } if (Preg::isMatchStrictGroups('/^libPNG Version => (?.+)$/im', $info, $libpngMatches)) { $this->addLibrary($libraries, $name . '-libpng', $libpngMatches['version'], 'libpng version for gd'); } if (Preg::isMatchStrictGroups('/^FreeType Version => (?.+)$/im', $info, $freetypeMatches)) { $this->addLibrary($libraries, $name . '-freetype', $freetypeMatches['version'], 'freetype version for gd'); } if (Preg::isMatchStrictGroups('/^libXpm Version => (?\\d+)$/im', $info, $libxpmMatches)) { $this->addLibrary($libraries, $name . '-libxpm', Version::convertLibxpmVersionId((int) $libxpmMatches['versionId']), 'libxpm version for gd'); } break; case 'gmp': $this->addLibrary($libraries, $name, $this->runtime->getConstant('GMP_VERSION')); break; case 'iconv': $this->addLibrary($libraries, $name, $this->runtime->getConstant('ICONV_VERSION')); break; case 'intl': $info = $this->runtime->getExtensionInfo($name); $description = 'The ICU unicode and globalization support library'; // Truthy check is for testing only so we can make the condition fail if ($this->runtime->hasConstant('INTL_ICU_VERSION')) { $this->addLibrary($libraries, 'icu', $this->runtime->getConstant('INTL_ICU_VERSION'), $description); } elseif (Preg::isMatch('/^ICU version => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, 'icu', $matches['version'], $description); } // ICU TZData version => 2019c if (Preg::isMatchStrictGroups('/^ICU TZData version => (?.*)$/im', $info, $zoneinfoMatches) && null !== ($version = Version::parseZoneinfoVersion($zoneinfoMatches['version']))) { $this->addLibrary($libraries, 'icu-zoneinfo', $version, 'zoneinfo ("Olson") database for icu'); } // Add a separate version for the CLDR library version if ($this->runtime->hasClass('ResourceBundle')) { $resourceBundle = $this->runtime->invoke(['ResourceBundle', 'create'], ['root', 'ICUDATA', \false]); if ($resourceBundle !== null) { $this->addLibrary($libraries, 'icu-cldr', $resourceBundle->get('Version'), 'ICU CLDR project version'); } } if ($this->runtime->hasClass('IntlChar')) { $this->addLibrary($libraries, 'icu-unicode', \implode('.', \array_slice($this->runtime->invoke(['IntlChar', 'getUnicodeVersion']), 0, 3)), 'ICU unicode version'); } break; case 'imagick': // @phpstan-ignore staticMethod.dynamicCall (called like this for mockability) $imageMagickVersion = $this->runtime->construct('Imagick')->getVersion(); // 6.x: ImageMagick 6.2.9 08/24/06 Q16 http://www.imagemagick.org // 7.x: ImageMagick 7.0.8-34 Q16 x86_64 2019-03-23 https://imagemagick.org if (Preg::isMatch('/^ImageMagick (?[\\d.]+)(?:-(?\\d+))?/', $imageMagickVersion['versionString'], $matches)) { $version = $matches['version']; if (isset($matches['patch'])) { $version .= '.' . $matches['patch']; } $this->addLibrary($libraries, $name . '-imagemagick', $version, null, ['imagick']); } break; case 'ldap': $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatchStrictGroups('/^Vendor Version => (?\\d+)$/im', $info, $matches) && Preg::isMatchStrictGroups('/^Vendor Name => (?.+)$/im', $info, $vendorMatches)) { $this->addLibrary($libraries, $name . '-' . \strtolower($vendorMatches['vendor']), Version::convertOpenldapVersionId((int) $matches['versionId']), $vendorMatches['vendor'] . ' version of ldap'); } break; case 'libxml': // ext/dom, ext/simplexml, ext/xmlreader and ext/xmlwriter use the same libxml as the ext/libxml $libxmlProvides = \array_map(static function ($extension) : string { return $extension . '-libxml'; }, \array_intersect($loadedExtensions, ['dom', 'simplexml', 'xml', 'xmlreader', 'xmlwriter'])); $this->addLibrary($libraries, $name, $this->runtime->getConstant('LIBXML_DOTTED_VERSION'), 'libxml library version', [], $libxmlProvides); break; case 'mbstring': $info = $this->runtime->getExtensionInfo($name); // libmbfl version => 1.3.2 if (Preg::isMatch('/^libmbfl version => (?.+)$/im', $info, $libmbflMatches)) { $this->addLibrary($libraries, $name . '-libmbfl', $libmbflMatches['version'], 'mbstring libmbfl version'); } if ($this->runtime->hasConstant('MB_ONIGURUMA_VERSION')) { $this->addLibrary($libraries, $name . '-oniguruma', $this->runtime->getConstant('MB_ONIGURUMA_VERSION'), 'mbstring oniguruma version'); // Multibyte regex (oniguruma) version => 5.9.5 // oniguruma version => 6.9.0 } elseif (Preg::isMatch('/^(?:oniguruma|Multibyte regex \\(oniguruma\\)) version => (?.+)$/im', $info, $onigurumaMatches)) { $this->addLibrary($libraries, $name . '-oniguruma', $onigurumaMatches['version'], 'mbstring oniguruma version'); } break; case 'memcached': $info = $this->runtime->getExtensionInfo($name); // libmemcached version => 1.0.18 if (Preg::isMatch('/^libmemcached version => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, $name . '-libmemcached', $matches['version'], 'libmemcached version'); } break; case 'openssl': // OpenSSL 1.1.1g 21 Apr 2020 if (Preg::isMatchStrictGroups('{^(?:OpenSSL|LibreSSL)?\\s*(?\\S+)}i', $this->runtime->getConstant('OPENSSL_VERSION_TEXT'), $matches)) { $parsedVersion = Version::parseOpenssl($matches['version'], $isFips); $this->addLibrary($libraries, $name . ($isFips ? '-fips' : ''), $parsedVersion, $this->runtime->getConstant('OPENSSL_VERSION_TEXT'), [], $isFips ? [$name] : []); } break; case 'pcre': $this->addLibrary($libraries, $name, Preg::replace('{^(\\S+).*}', '$1', $this->runtime->getConstant('PCRE_VERSION'))); $info = $this->runtime->getExtensionInfo($name); // PCRE Unicode Version => 12.1.0 if (Preg::isMatchStrictGroups('/^PCRE Unicode Version => (?.+)$/im', $info, $pcreUnicodeMatches)) { $this->addLibrary($libraries, $name . '-unicode', $pcreUnicodeMatches['version'], 'PCRE Unicode version support'); } break; case 'mysqlnd': case 'pdo_mysql': $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatchStrictGroups('/^(?:Client API version|Version) => mysqlnd (?.+?) /mi', $info, $matches)) { $this->addLibrary($libraries, $name . '-mysqlnd', $matches['version'], 'mysqlnd library version for ' . $name); } break; case 'mongodb': $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatchStrictGroups('/^libmongoc bundled version => (?.+)$/im', $info, $libmongocMatches)) { $this->addLibrary($libraries, $name . '-libmongoc', $libmongocMatches['version'], 'libmongoc version of mongodb'); } if (Preg::isMatchStrictGroups('/^libbson bundled version => (?.+)$/im', $info, $libbsonMatches)) { $this->addLibrary($libraries, $name . '-libbson', $libbsonMatches['version'], 'libbson version of mongodb'); } break; case 'pgsql': if ($this->runtime->hasConstant('PGSQL_LIBPQ_VERSION')) { $this->addLibrary($libraries, 'pgsql-libpq', $this->runtime->getConstant('PGSQL_LIBPQ_VERSION'), 'libpq for pgsql'); break; } // intentional fall-through to next case... case 'pdo_pgsql': $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatch('/^PostgreSQL\\(libpq\\) Version => (?.*)$/im', $info, $matches)) { $this->addLibrary($libraries, $name . '-libpq', $matches['version'], 'libpq for ' . $name); } break; case 'pq': $info = $this->runtime->getExtensionInfo($name); // Used Library => Compiled => Linked // libpq => 14.3 (Ubuntu 14.3-1.pgdg22.04+1) => 15.0.2 if (Preg::isMatch('/^libpq => (?.+) => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, $name . '-libpq', $matches['linked'], 'libpq for ' . $name); } break; case 'rdkafka': if ($this->runtime->hasConstant('RD_KAFKA_VERSION')) { /** * Interpreted as hex \c MM.mm.rr.xx: * - MM = Major * - mm = minor * - rr = revision * - xx = pre-release id (0xff is the final release) * * pre-release ID in practice is always 0xff even for RCs etc, so we ignore it */ $libRdKafkaVersionInt = $this->runtime->getConstant('RD_KAFKA_VERSION'); $this->addLibrary($libraries, $name . '-librdkafka', \sprintf('%d.%d.%d', ($libRdKafkaVersionInt & 0xff000000) >> 24, ($libRdKafkaVersionInt & 0xff0000) >> 16, ($libRdKafkaVersionInt & 0xff00) >> 8), 'librdkafka for ' . $name); } break; case 'libsodium': case 'sodium': if ($this->runtime->hasConstant('SODIUM_LIBRARY_VERSION')) { $this->addLibrary($libraries, 'libsodium', $this->runtime->getConstant('SODIUM_LIBRARY_VERSION')); $this->addLibrary($libraries, 'libsodium', $this->runtime->getConstant('SODIUM_LIBRARY_VERSION')); } break; case 'sqlite3': case 'pdo_sqlite': $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatch('/^SQLite Library => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, $name . '-sqlite', $matches['version']); } break; case 'ssh2': $info = $this->runtime->getExtensionInfo($name); if (Preg::isMatch('/^libssh2 version => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, $name . '-libssh2', $matches['version']); } break; case 'xsl': $this->addLibrary($libraries, 'libxslt', $this->runtime->getConstant('LIBXSLT_DOTTED_VERSION'), null, ['xsl']); $info = $this->runtime->getExtensionInfo('xsl'); if (Preg::isMatch('/^libxslt compiled against libxml Version => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, 'libxslt-libxml', $matches['version'], 'libxml version libxslt is compiled against'); } break; case 'yaml': $info = $this->runtime->getExtensionInfo('yaml'); if (Preg::isMatch('/^LibYAML Version => (?.+)$/im', $info, $matches)) { $this->addLibrary($libraries, $name . '-libyaml', $matches['version'], 'libyaml version of yaml'); } break; case 'zip': if ($this->runtime->hasConstant('LIBZIP_VERSION', 'ZipArchive')) { $this->addLibrary($libraries, $name . '-libzip', $this->runtime->getConstant('LIBZIP_VERSION', 'ZipArchive'), null, ['zip']); } break; case 'zlib': if ($this->runtime->hasConstant('ZLIB_VERSION')) { $this->addLibrary($libraries, $name, $this->runtime->getConstant('ZLIB_VERSION')); // Linked Version => 1.2.8 } elseif (Preg::isMatch('/^Linked Version => (?.+)$/im', $this->runtime->getExtensionInfo($name), $matches)) { $this->addLibrary($libraries, $name, $matches['version']); } break; default: break; } } $hhvmVersion = $this->hhvmDetector->getVersion(); if ($hhvmVersion) { try { $prettyVersion = $hhvmVersion; $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = Preg::replace('#^([^~+-]+).*$#', '$1', $hhvmVersion); $version = $this->versionParser->normalize($prettyVersion); } $hhvm = new CompletePackage('hhvm', $version, $prettyVersion); $hhvm->setDescription('The HHVM Runtime (64bit)'); $this->addPackage($hhvm); } } /** * @inheritDoc */ public function addPackage(PackageInterface $package) : void { if (!$package instanceof CompletePackage) { throw new \UnexpectedValueException('Expected CompletePackage but got ' . \get_class($package)); } // Skip if overridden if (isset($this->overrides[$package->getName()])) { if ($this->overrides[$package->getName()]['version'] === \false) { $this->addDisabledPackage($package); return; } $overrider = $this->findPackage($package->getName(), '*'); if ($package->getVersion() === $overrider->getVersion()) { $actualText = 'same as actual'; } else { $actualText = 'actual: ' . $package->getPrettyVersion(); } if ($overrider instanceof CompletePackageInterface) { $overrider->setDescription($overrider->getDescription() . ', ' . $actualText); } return; } // Skip if PHP is overridden and we are adding a php-* package if (isset($this->overrides['php']) && 0 === \strpos($package->getName(), 'php-')) { $overrider = $this->addOverriddenPackage($this->overrides['php'], $package->getPrettyName()); if ($package->getVersion() === $overrider->getVersion()) { $actualText = 'same as actual'; } else { $actualText = 'actual: ' . $package->getPrettyVersion(); } $overrider->setDescription($overrider->getDescription() . ', ' . $actualText); return; } parent::addPackage($package); } /** * @param array{version: string, name: string} $override */ private function addOverriddenPackage(array $override, ?string $name = null) : CompletePackage { $version = $this->versionParser->normalize($override['version']); $package = new CompletePackage($name ?: $override['name'], $version, $override['version']); $package->setDescription('Package overridden via config.platform'); $package->setExtra(['config.platform' => \true]); parent::addPackage($package); if ($package->getName() === 'php') { self::$lastSeenPlatformPhp = \implode('.', \array_slice(\explode('.', $package->getVersion()), 0, 3)); } return $package; } private function addDisabledPackage(CompletePackage $package) : void { $package->setDescription($package->getDescription() . '. Package disabled via config.platform'); $package->setExtra(['config.platform' => \true]); $this->disabledPackages[$package->getName()] = $package; } /** * Parses the version and adds a new package to the repository */ private function addExtension(string $name, string $prettyVersion) : void { $extraDescription = null; try { $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $extraDescription = ' (actual version: ' . $prettyVersion . ')'; if (Preg::isMatchStrictGroups('{^(\\d+\\.\\d+\\.\\d+(?:\\.\\d+)?)}', $prettyVersion, $match)) { $prettyVersion = $match[1]; } else { $prettyVersion = '0'; } $version = $this->versionParser->normalize($prettyVersion); } $packageName = $this->buildPackageName($name); $ext = new CompletePackage($packageName, $version, $prettyVersion); $ext->setDescription('The ' . $name . ' PHP extension' . $extraDescription); $ext->setType('php-ext'); if ($name === 'uuid') { $ext->setReplaces(['lib-uuid' => new Link('ext-uuid', 'lib-uuid', new Constraint('=', $version), Link::TYPE_REPLACE, $ext->getPrettyVersion())]); } $this->addPackage($ext); } private function buildPackageName(string $name) : string { return 'ext-' . \str_replace(' ', '-', \strtolower($name)); } /** * @param array $libraries * @param array $replaces * @param array $provides */ private function addLibrary(array &$libraries, string $name, ?string $prettyVersion, ?string $description = null, array $replaces = [], array $provides = []) : void { if (null === $prettyVersion) { return; } try { $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { return; } // avoid adding the same lib twice even if two conflicting extensions provide the same lib // see https://github.com/composer/composer/issues/12082 if (isset($libraries['lib-' . $name])) { return; } $libraries['lib-' . $name] = \true; if ($description === null) { $description = 'The ' . $name . ' library'; } $lib = new CompletePackage('lib-' . $name, $version, $prettyVersion); $lib->setDescription($description); $replaceLinks = []; foreach ($replaces as $replace) { $replace = \strtolower($replace); $replaceLinks[$replace] = new Link('lib-' . $name, 'lib-' . $replace, new Constraint('=', $version), Link::TYPE_REPLACE, $lib->getPrettyVersion()); } $provideLinks = []; foreach ($provides as $provide) { $provide = \strtolower($provide); $provideLinks[$provide] = new Link('lib-' . $name, 'lib-' . $provide, new Constraint('=', $version), Link::TYPE_PROVIDE, $lib->getPrettyVersion()); } $lib->setReplaces($replaceLinks); $lib->setProvides($provideLinks); $this->addPackage($lib); } /** * Check if a package name is a platform package. */ public static function isPlatformPackage(string $name) : bool { static $cache = []; if (isset($cache[$name])) { return $cache[$name]; } return $cache[$name] = Preg::isMatch(\Composer\Repository\PlatformRepository::PLATFORM_PACKAGE_REGEX, $name); } /** * Returns the last seen config.platform.php version if defined * * This is a best effort attempt for internal purposes, retrieve the real * packages from a PlatformRepository instance if you need a version guaranteed to * be correct. * * @internal */ public static function getPlatformPhpVersion() : ?string { return self::$lastSeenPlatformPhp; } public function search(string $query, int $mode = 0, ?string $type = null) : array { // suppress vendor search as there are no vendors to match in platform packages if ($mode === self::SEARCH_VENDOR) { return []; } return parent::search($query, $mode, $type); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Pcre\Preg; use Composer\Util\HttpDownloader; use Composer\Util\ProcessExecutor; use Composer\Json\JsonFile; /** * @author Jordi Boggiano */ class RepositoryFactory { /** * @return array|mixed */ public static function configFromString(IOInterface $io, Config $config, string $repository, bool $allowFilesystem = \false) { if (0 === \strpos($repository, 'http')) { $repoConfig = ['type' => 'composer', 'url' => $repository]; } elseif ("json" === \pathinfo($repository, \PATHINFO_EXTENSION)) { $json = new JsonFile($repository, Factory::createHttpDownloader($io, $config)); $data = $json->read(); if (!empty($data['packages']) || !empty($data['includes']) || !empty($data['provider-includes'])) { $repoConfig = ['type' => 'composer', 'url' => 'file://' . \strtr(\realpath($repository), '\\', '/')]; } elseif ($allowFilesystem) { $repoConfig = ['type' => 'filesystem', 'json' => $json]; } else { throw new \InvalidArgumentException("Invalid repository URL ({$repository}) given. This file does not contain a valid composer repository."); } } elseif (\strpos($repository, '{') === 0) { // assume it is a json object that makes a repo config $repoConfig = JsonFile::parseJson($repository); } else { throw new \InvalidArgumentException("Invalid repository url ({$repository}) given. Has to be a .json file, an http url or a JSON object."); } return $repoConfig; } public static function fromString(IOInterface $io, Config $config, string $repository, bool $allowFilesystem = \false, ?\Composer\Repository\RepositoryManager $rm = null) : \Composer\Repository\RepositoryInterface { $repoConfig = static::configFromString($io, $config, $repository, $allowFilesystem); return static::createRepo($io, $config, $repoConfig, $rm); } /** * @param array $repoConfig */ public static function createRepo(IOInterface $io, Config $config, array $repoConfig, ?\Composer\Repository\RepositoryManager $rm = null) : \Composer\Repository\RepositoryInterface { if (!$rm) { @\trigger_error('Not passing a repository manager when calling createRepo is deprecated since Composer 2.3.6', \E_USER_DEPRECATED); $rm = static::manager($io, $config); } $repos = self::createRepos($rm, [$repoConfig]); return \reset($repos); } /** * @return RepositoryInterface[] */ public static function defaultRepos(?IOInterface $io = null, ?Config $config = null, ?\Composer\Repository\RepositoryManager $rm = null) : array { if (null === $rm) { @\trigger_error('Not passing a repository manager when calling defaultRepos is deprecated since Composer 2.3.6, use defaultReposWithDefaultManager() instead if you cannot get a manager.', \E_USER_DEPRECATED); } if (null === $config) { $config = Factory::createConfig($io); } if (null !== $io) { $io->loadConfiguration($config); } if (null === $rm) { if (null === $io) { throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager'); } $rm = static::manager($io, $config, Factory::createHttpDownloader($io, $config)); } return self::createRepos($rm, $config->getRepositories()); } /** * @param EventDispatcher $eventDispatcher * @param HttpDownloader $httpDownloader */ public static function manager(IOInterface $io, Config $config, ?HttpDownloader $httpDownloader = null, ?EventDispatcher $eventDispatcher = null, ?ProcessExecutor $process = null) : \Composer\Repository\RepositoryManager { if ($httpDownloader === null) { $httpDownloader = Factory::createHttpDownloader($io, $config); } if ($process === null) { $process = new ProcessExecutor($io); $process->enableAsync(); } $rm = new \Composer\Repository\RepositoryManager($io, $config, $httpDownloader, $eventDispatcher, $process); $rm->setRepositoryClass('composer', 'Composer\\Repository\\ComposerRepository'); $rm->setRepositoryClass('vcs', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('package', 'Composer\\Repository\\PackageRepository'); $rm->setRepositoryClass('pear', 'Composer\\Repository\\PearRepository'); $rm->setRepositoryClass('git', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('bitbucket', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('git-bitbucket', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('github', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('gitlab', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('svn', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('fossil', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('perforce', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('hg', 'Composer\\Repository\\VcsRepository'); $rm->setRepositoryClass('artifact', 'Composer\\Repository\\ArtifactRepository'); $rm->setRepositoryClass('path', 'Composer\\Repository\\PathRepository'); return $rm; } /** * @return RepositoryInterface[] */ public static function defaultReposWithDefaultManager(IOInterface $io) : array { $manager = \Composer\Repository\RepositoryFactory::manager($io, $config = Factory::createConfig($io)); $io->loadConfiguration($config); return \Composer\Repository\RepositoryFactory::defaultRepos($io, $config, $manager); } /** * @param array $repoConfigs * * @return RepositoryInterface[] */ private static function createRepos(\Composer\Repository\RepositoryManager $rm, array $repoConfigs) : array { $repos = []; foreach ($repoConfigs as $index => $repo) { if (\is_string($repo)) { throw new \UnexpectedValueException('"repositories" should be an array of repository definitions, only a single repository was given'); } if (!\is_array($repo)) { throw new \UnexpectedValueException('Repository "' . $index . '" (' . \json_encode($repo) . ') should be an array, ' . \gettype($repo) . ' given'); } if (!isset($repo['type'])) { throw new \UnexpectedValueException('Repository "' . $index . '" (' . \json_encode($repo) . ') must have a type defined'); } $name = self::generateRepositoryName($index, $repo, $repos); if ($repo['type'] === 'filesystem') { $repos[$name] = new \Composer\Repository\FilesystemRepository($repo['json']); } else { $repos[$name] = $rm->createRepository($repo['type'], $repo, (string) $index); } } return $repos; } /** * @param int|string $index * @param array{url?: string} $repo * @param array $existingRepos */ public static function generateRepositoryName($index, array $repo, array $existingRepos) : string { $name = \is_int($index) && isset($repo['url']) ? Preg::replace('{^https?://}i', '', $repo['url']) : (string) $index; while (isset($existingRepos[$name])) { $name .= '2'; } return $name; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Installable repository interface. * * Just used to tag installed repositories so the base classes can act differently on Alias packages * * @author Jordi Boggiano */ interface InstalledRepositoryInterface extends \Composer\Repository\WritableRepositoryInterface { /** * @return bool|null true if dev requirements were installed, false if --no-dev was used, null if yet unknown */ public function getDevMode(); /** * @return bool true if packages were never installed in this repository */ public function isFresh(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; use Composer\Installer\InstallationManager; /** * Writable repository interface. * * @author Konstantin Kudryashov */ interface WritableRepositoryInterface extends \Composer\Repository\RepositoryInterface { /** * Writes repository (f.e. to the disc). * * @param bool $devMode Whether dev requirements were included or not in this installation * @return void */ public function write(bool $devMode, InstallationManager $installationManager); /** * Adds package to the repository. * * @param PackageInterface $package package instance * @return void */ public function addPackage(PackageInterface $package); /** * Removes package from the repository. * * @param PackageInterface $package package instance * @return void */ public function removePackage(PackageInterface $package); /** * Get unique packages (at most one package of each name), with aliases resolved and removed. * * @return PackageInterface[] */ public function getCanonicalPackages(); /** * Forces a reload of all packages. * * @return void */ public function reload(); /** * @param string[] $devPackageNames * @return void */ public function setDevPackageNames(array $devPackageNames); /** * @return string[] Names of dependencies installed through require-dev */ public function getDevPackageNames(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; /** * @author Jordi Boggiano * * @see RepositorySet for ways to work with sets of repos */ class RepositoryUtils { /** * Find all of $packages which are required by $requirer, either directly or transitively * * Require-dev is ignored by default, you can enable the require-dev of the initial $requirer * packages by passing $includeRequireDev=true, but require-dev of transitive dependencies * are always ignored. * * @template T of PackageInterface * @param array $packages * @param list $bucket Do not pass this in, only used to avoid recursion with circular deps * @return list */ public static function filterRequiredPackages(array $packages, PackageInterface $requirer, bool $includeRequireDev = \false, array $bucket = []) : array { $requires = $requirer->getRequires(); if ($includeRequireDev) { $requires = \array_merge($requires, $requirer->getDevRequires()); } foreach ($packages as $candidate) { foreach ($candidate->getNames() as $name) { if (isset($requires[$name])) { if (!\in_array($candidate, $bucket, \true)) { $bucket[] = $candidate; $bucket = self::filterRequiredPackages($packages, $candidate, \false, $bucket); } break; } } } return $bucket; } /** * Unwraps CompositeRepository, InstalledRepository and optionally FilterRepository to get a flat array of pure repository instances * * @return RepositoryInterface[] */ public static function flattenRepositories(\Composer\Repository\RepositoryInterface $repo, bool $unwrapFilterRepos = \true) : array { // unwrap filter repos if ($unwrapFilterRepos && $repo instanceof \Composer\Repository\FilterRepository) { $repo = $repo->getRepository(); } if (!$repo instanceof \Composer\Repository\CompositeRepository) { return [$repo]; } $repos = []; foreach ($repo->getRepositories() as $r) { foreach (self::flattenRepositories($r, $unwrapFilterRepos) as $r2) { $repos[] = $r2; } } return $repos; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Thrown when a security problem, like a broken or missing signature * * @author Eric Daspet */ class RepositorySecurityException extends \Exception { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; /** * Composite repository. * * @author Beau Simensen */ class CompositeRepository implements \Composer\Repository\RepositoryInterface { /** * List of repositories * @var RepositoryInterface[] */ private $repositories; /** * Constructor * @param RepositoryInterface[] $repositories */ public function __construct(array $repositories) { $this->repositories = []; foreach ($repositories as $repo) { $this->addRepository($repo); } } public function getRepoName() : string { return 'composite repo (' . \implode(', ', \array_map(static function ($repo) : string { return $repo->getRepoName(); }, $this->repositories)) . ')'; } /** * Returns all the wrapped repositories * * @return RepositoryInterface[] */ public function getRepositories() : array { return $this->repositories; } /** * @inheritDoc */ public function hasPackage(PackageInterface $package) : bool { foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ if ($repository->hasPackage($package)) { return \true; } } return \false; } /** * @inheritDoc */ public function findPackage($name, $constraint) : ?BasePackage { foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $package = $repository->findPackage($name, $constraint); if (null !== $package) { return $package; } } return null; } /** * @inheritDoc */ public function findPackages($name, $constraint = null) : array { $packages = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $packages[] = $repository->findPackages($name, $constraint); } return $packages ? \array_merge(...$packages) : []; } /** * @inheritDoc */ public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) : array { $packages = []; $namesFound = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $result = $repository->loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); $packages[] = $result['packages']; $namesFound[] = $result['namesFound']; } return ['packages' => $packages ? \array_merge(...$packages) : [], 'namesFound' => $namesFound ? \array_unique(\array_merge(...$namesFound)) : []]; } /** * @inheritDoc */ public function search(string $query, int $mode = 0, ?string $type = null) : array { $matches = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $matches[] = $repository->search($query, $mode, $type); } return \count($matches) > 0 ? \array_merge(...$matches) : []; } /** * @inheritDoc */ public function getPackages() : array { $packages = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $packages[] = $repository->getPackages(); } return $packages ? \array_merge(...$packages) : []; } /** * @inheritDoc */ public function getProviders($packageName) : array { $results = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $results[] = $repository->getProviders($packageName); } return $results ? \array_merge(...$results) : []; } public function removePackage(PackageInterface $package) : void { foreach ($this->repositories as $repository) { if ($repository instanceof \Composer\Repository\WritableRepositoryInterface) { $repository->removePackage($package); } } } /** * @inheritDoc */ public function count() : int { $total = 0; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $total += $repository->count(); } return $total; } /** * Add a repository. */ public function addRepository(\Composer\Repository\RepositoryInterface $repository) : void { if ($repository instanceof self) { foreach ($repository->getRepositories() as $repo) { $this->addRepository($repo); } } else { $this->repositories[] = $repository; } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; use Composer\Package\PackageInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Version\StabilityFilter; use Composer\Pcre\Preg; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; /** * A repository implementation that simply stores packages in an array * * @author Nils Adermann */ class ArrayRepository implements \Composer\Repository\RepositoryInterface { /** @var ?array */ protected $packages = null; /** * @var ?array indexed by package unique name and used to cache hasPackage calls */ protected $packageMap = null; /** * @param array $packages */ public function __construct(array $packages = []) { foreach ($packages as $package) { $this->addPackage($package); } } public function getRepoName() { return 'array repo (defining ' . $this->count() . ' package' . ($this->count() > 1 ? 's' : '') . ')'; } /** * @inheritDoc */ public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) { $packages = $this->getPackages(); $result = []; $namesFound = []; foreach ($packages as $package) { if (\array_key_exists($package->getName(), $packageNameMap)) { if ((!$packageNameMap[$package->getName()] || $packageNameMap[$package->getName()]->matches(new Constraint('==', $package->getVersion()))) && StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, $package->getNames(), $package->getStability()) && !isset($alreadyLoaded[$package->getName()][$package->getVersion()])) { // add selected packages which match stability requirements $result[\spl_object_hash($package)] = $package; // add the aliased package for packages where the alias matches if ($package instanceof AliasPackage && !isset($result[\spl_object_hash($package->getAliasOf())])) { $result[\spl_object_hash($package->getAliasOf())] = $package->getAliasOf(); } } $namesFound[$package->getName()] = \true; } } // add aliases of packages that were selected, even if the aliases did not match foreach ($packages as $package) { if ($package instanceof AliasPackage) { if (isset($result[\spl_object_hash($package->getAliasOf())])) { $result[\spl_object_hash($package)] = $package; } } } return ['namesFound' => \array_keys($namesFound), 'packages' => $result]; } /** * @inheritDoc */ public function findPackage(string $name, $constraint) { $name = \strtolower($name); if (!$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } foreach ($this->getPackages() as $package) { if ($name === $package->getName()) { $pkgConstraint = new Constraint('==', $package->getVersion()); if ($constraint->matches($pkgConstraint)) { return $package; } } } return null; } /** * @inheritDoc */ public function findPackages(string $name, $constraint = null) { // normalize name $name = \strtolower($name); $packages = []; if (null !== $constraint && !$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } foreach ($this->getPackages() as $package) { if ($name === $package->getName()) { if (null === $constraint || $constraint->matches(new Constraint('==', $package->getVersion()))) { $packages[] = $package; } } } return $packages; } /** * @inheritDoc */ public function search(string $query, int $mode = 0, ?string $type = null) { if ($mode === self::SEARCH_FULLTEXT) { $regex = '{(?:' . \implode('|', Preg::split('{\\s+}', \preg_quote($query))) . ')}i'; } else { // vendor/name searches expect the caller to have preg_quoted the query $regex = '{(?:' . \implode('|', Preg::split('{\\s+}', $query)) . ')}i'; } $matches = []; foreach ($this->getPackages() as $package) { $name = $package->getName(); if ($mode === self::SEARCH_VENDOR) { [$name] = \explode('/', $name); } if (isset($matches[$name])) { continue; } if (null !== $type && $package->getType() !== $type) { continue; } if (Preg::isMatch($regex, $name) || $mode === self::SEARCH_FULLTEXT && $package instanceof CompletePackageInterface && Preg::isMatch($regex, \implode(' ', (array) $package->getKeywords()) . ' ' . $package->getDescription())) { if ($mode === self::SEARCH_VENDOR) { $matches[$name] = ['name' => $name, 'description' => null]; } else { $matches[$name] = ['name' => $package->getPrettyName(), 'description' => $package instanceof CompletePackageInterface ? $package->getDescription() : null]; if ($package instanceof CompletePackageInterface && $package->isAbandoned()) { $matches[$name]['abandoned'] = $package->getReplacementPackage() ?: \true; } } } } return \array_values($matches); } /** * @inheritDoc */ public function hasPackage(PackageInterface $package) { if ($this->packageMap === null) { $this->packageMap = []; foreach ($this->getPackages() as $repoPackage) { $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage; } } return isset($this->packageMap[$package->getUniqueName()]); } /** * Adds a new package to the repository * * @return void */ public function addPackage(PackageInterface $package) { if (!$package instanceof BasePackage) { throw new \InvalidArgumentException('Only subclasses of BasePackage are supported'); } if (null === $this->packages) { $this->initialize(); } $package->setRepository($this); $this->packages[] = $package; if ($package instanceof AliasPackage) { $aliasedPackage = $package->getAliasOf(); if (null === $aliasedPackage->getRepository()) { $this->addPackage($aliasedPackage); } } // invalidate package map cache $this->packageMap = null; } /** * @inheritDoc */ public function getProviders(string $packageName) { $result = []; foreach ($this->getPackages() as $candidate) { if (isset($result[$candidate->getName()])) { continue; } foreach ($candidate->getProvides() as $link) { if ($packageName === $link->getTarget()) { $result[$candidate->getName()] = ['name' => $candidate->getName(), 'description' => $candidate instanceof CompletePackageInterface ? $candidate->getDescription() : null, 'type' => $candidate->getType()]; continue 2; } } } return $result; } /** * @return AliasPackage|CompleteAliasPackage */ protected function createAliasPackage(BasePackage $package, string $alias, string $prettyAlias) { while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } if ($package instanceof CompletePackage) { return new CompleteAliasPackage($package, $alias, $prettyAlias); } return new AliasPackage($package, $alias, $prettyAlias); } /** * Removes package from repository. * * @param PackageInterface $package package instance * * @return void */ public function removePackage(PackageInterface $package) { $packageId = $package->getUniqueName(); foreach ($this->getPackages() as $key => $repoPackage) { if ($packageId === $repoPackage->getUniqueName()) { \array_splice($this->packages, $key, 1); // invalidate package map cache $this->packageMap = null; return; } } } /** * @inheritDoc */ public function getPackages() { if (null === $this->packages) { $this->initialize(); } if (null === $this->packages) { throw new \LogicException('initialize failed to initialize the packages array'); } return $this->packages; } /** * Returns the number of packages in this repository * * @return 0|positive-int Number of packages */ public function count() : int { if (null === $this->packages) { $this->initialize(); } return \count($this->packages); } /** * Initializes the packages array. Mostly meant as an extension point. * * @return void */ protected function initialize() { $this->packages = []; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Installer\InstallationManager; /** * Writable array repository. * * @author Jordi Boggiano */ class WritableArrayRepository extends \Composer\Repository\ArrayRepository implements \Composer\Repository\WritableRepositoryInterface { use \Composer\Repository\CanonicalPackagesTrait; /** * @var string[] */ protected $devPackageNames = []; /** @var bool|null */ private $devMode = null; /** * @return bool|null true if dev requirements were installed, false if --no-dev was used, null if yet unknown */ public function getDevMode() { return $this->devMode; } /** * @inheritDoc */ public function setDevPackageNames(array $devPackageNames) { $this->devPackageNames = $devPackageNames; } /** * @inheritDoc */ public function getDevPackageNames() { return $this->devPackageNames; } /** * @inheritDoc */ public function write(bool $devMode, InstallationManager $installationManager) { $this->devMode = $devMode; } /** * @inheritDoc */ public function reload() { $this->devMode = null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; use Composer\Repository\Vcs\VcsDriverInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Package\Loader\InvalidPackageException; use Composer\Package\Loader\LoaderInterface; use Composer\EventDispatcher\EventDispatcher; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\HttpDownloader; use Composer\Util\Url; use Composer\Semver\Constraint\Constraint; use Composer\IO\IOInterface; use Composer\Config; /** * @author Jordi Boggiano */ class VcsRepository extends \Composer\Repository\ArrayRepository implements \Composer\Repository\ConfigurableRepositoryInterface { /** @var string */ protected $url; /** @var ?string */ protected $packageName; /** @var bool */ protected $isVerbose; /** @var bool */ protected $isVeryVerbose; /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var VersionParser */ protected $versionParser; /** @var string */ protected $type; /** @var ?LoaderInterface */ protected $loader; /** @var array */ protected $repoConfig; /** @var HttpDownloader */ protected $httpDownloader; /** @var ProcessExecutor */ protected $processExecutor; /** @var bool */ protected $branchErrorOccurred = \false; /** @var array> */ private $drivers; /** @var ?VcsDriverInterface */ private $driver; /** @var ?VersionCacheInterface */ private $versionCache; /** @var list */ private $emptyReferences = []; /** @var array<'tags'|'branches', array> */ private $versionTransportExceptions = []; /** * @param array{url: string, type?: string}&array $repoConfig * @param array>|null $drivers */ public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $dispatcher = null, ?ProcessExecutor $process = null, ?array $drivers = null, ?\Composer\Repository\VersionCacheInterface $versionCache = null) { parent::__construct(); $this->drivers = $drivers ?: [ 'github' => 'Composer\\Repository\\Vcs\\GitHubDriver', 'gitlab' => 'Composer\\Repository\\Vcs\\GitLabDriver', 'bitbucket' => 'Composer\\Repository\\Vcs\\GitBitbucketDriver', 'git-bitbucket' => 'Composer\\Repository\\Vcs\\GitBitbucketDriver', 'git' => 'Composer\\Repository\\Vcs\\GitDriver', 'hg' => 'Composer\\Repository\\Vcs\\HgDriver', 'perforce' => 'Composer\\Repository\\Vcs\\PerforceDriver', 'fossil' => 'Composer\\Repository\\Vcs\\FossilDriver', // svn must be last because identifying a subversion server for sure is practically impossible 'svn' => 'Composer\\Repository\\Vcs\\SvnDriver', ]; $this->url = $repoConfig['url'] = Platform::expandPath($repoConfig['url']); $this->io = $io; $this->type = $repoConfig['type'] ?? 'vcs'; $this->isVerbose = $io->isVerbose(); $this->isVeryVerbose = $io->isVeryVerbose(); $this->config = $config; $this->repoConfig = $repoConfig; $this->versionCache = $versionCache; $this->httpDownloader = $httpDownloader; $this->processExecutor = $process ?? new ProcessExecutor($io); } public function getRepoName() { $driverClass = \get_class($this->getDriver()); $driverType = \array_search($driverClass, $this->drivers); if (!$driverType) { $driverType = $driverClass; } return 'vcs repo (' . $driverType . ' ' . Url::sanitize($this->url) . ')'; } public function getRepoConfig() { return $this->repoConfig; } public function setLoader(LoaderInterface $loader) : void { $this->loader = $loader; } public function getDriver() : ?VcsDriverInterface { if ($this->driver) { return $this->driver; } if (isset($this->drivers[$this->type])) { $class = $this->drivers[$this->type]; $this->driver = new $class($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->processExecutor); $this->driver->initialize(); return $this->driver; } foreach ($this->drivers as $driver) { if ($driver::supports($this->io, $this->config, $this->url)) { $this->driver = new $driver($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->processExecutor); $this->driver->initialize(); return $this->driver; } } foreach ($this->drivers as $driver) { if ($driver::supports($this->io, $this->config, $this->url, \true)) { $this->driver = new $driver($this->repoConfig, $this->io, $this->config, $this->httpDownloader, $this->processExecutor); $this->driver->initialize(); return $this->driver; } } return null; } public function hadInvalidBranches() : bool { return $this->branchErrorOccurred; } /** * @return list */ public function getEmptyReferences() : array { return $this->emptyReferences; } /** * @return array<'tags'|'branches', array> */ public function getVersionTransportExceptions() : array { return $this->versionTransportExceptions; } protected function initialize() { parent::initialize(); $isVerbose = $this->isVerbose; $isVeryVerbose = $this->isVeryVerbose; $driver = $this->getDriver(); if (!$driver) { throw new \InvalidArgumentException('No driver found to handle VCS repository ' . $this->url); } $this->versionParser = new VersionParser(); if (!$this->loader) { $this->loader = new ArrayLoader($this->versionParser); } $hasRootIdentifierComposerJson = \false; try { $hasRootIdentifierComposerJson = $driver->hasComposerFile($driver->getRootIdentifier()); if ($hasRootIdentifierComposerJson) { $data = $driver->getComposerInformation($driver->getRootIdentifier()); $this->packageName = !empty($data['name']) ? $data['name'] : null; } } catch (\Exception $e) { if ($e instanceof TransportException && $this->shouldRethrowTransportException($e)) { throw $e; } if ($isVeryVerbose) { $this->io->writeError('Skipped parsing ' . $driver->getRootIdentifier() . ', ' . $e->getMessage() . ''); } } foreach ($driver->getTags() as $tag => $identifier) { $tag = (string) $tag; $msg = 'Reading composer.json of ' . ($this->packageName ?: $this->url) . ' (' . $tag . ')'; // strip the release- prefix from tags if present $tag = \str_replace('release-', '', $tag); $cachedPackage = $this->getCachedPackageVersion($tag, $identifier, $isVerbose, $isVeryVerbose); if ($cachedPackage) { $this->addPackage($cachedPackage); continue; } if ($cachedPackage === \false) { $this->emptyReferences[] = $identifier; continue; } if (!($parsedTag = $this->validateTag($tag))) { if ($isVeryVerbose) { $this->io->writeError('Skipped tag ' . $tag . ', invalid tag name'); } continue; } if ($isVeryVerbose) { $this->io->writeError($msg); } elseif ($isVerbose) { $this->io->overwriteError($msg, \false); } try { $data = $driver->getComposerInformation($identifier); if (null === $data) { if ($isVeryVerbose) { $this->io->writeError('Skipped tag ' . $tag . ', no composer file'); } $this->emptyReferences[] = $identifier; continue; } // manually versioned package if (isset($data['version'])) { $data['version_normalized'] = $this->versionParser->normalize($data['version']); } else { // auto-versioned package, read value from tag $data['version'] = $tag; $data['version_normalized'] = $parsedTag; } // make sure tag packages have no -dev flag $data['version'] = Preg::replace('{[.-]?dev$}i', '', $data['version']); $data['version_normalized'] = Preg::replace('{(^dev-|[.-]?dev$)}i', '', $data['version_normalized']); // make sure tag do not contain the default-branch marker unset($data['default-branch']); // broken package, version doesn't match tag if ($data['version_normalized'] !== $parsedTag) { if ($isVeryVerbose) { if (Preg::isMatch('{(^dev-|[.-]?dev$)}i', $parsedTag)) { $this->io->writeError('Skipped tag ' . $tag . ', invalid tag name, tags can not use dev prefixes or suffixes'); } else { $this->io->writeError('Skipped tag ' . $tag . ', tag (' . $parsedTag . ') does not match version (' . $data['version_normalized'] . ') in composer.json'); } } continue; } $tagPackageName = $this->packageName ?: $data['name'] ?? ''; if ($existingPackage = $this->findPackage($tagPackageName, $data['version_normalized'])) { if ($isVeryVerbose) { $this->io->writeError('Skipped tag ' . $tag . ', it conflicts with an another tag (' . $existingPackage->getPrettyVersion() . ') as both resolve to ' . $data['version_normalized'] . ' internally'); } continue; } if ($isVeryVerbose) { $this->io->writeError('Importing tag ' . $tag . ' (' . $data['version_normalized'] . ')'); } $this->addPackage($this->loader->load($this->preProcess($driver, $data, $identifier))); } catch (\Exception $e) { if ($e instanceof TransportException) { $this->versionTransportExceptions['tags'][$tag] = $e; if ($e->getCode() === 404) { $this->emptyReferences[] = $identifier; } if ($this->shouldRethrowTransportException($e)) { throw $e; } } if ($isVeryVerbose) { $this->io->writeError('Skipped tag ' . $tag . ', ' . ($e instanceof TransportException ? 'no composer file was found (' . $e->getCode() . ' HTTP status code)' : $e->getMessage()) . ''); } continue; } } if (!$isVeryVerbose) { $this->io->overwriteError('', \false); } $branches = $driver->getBranches(); // make sure the root identifier branch gets loaded first if ($hasRootIdentifierComposerJson && isset($branches[$driver->getRootIdentifier()])) { $branches = [$driver->getRootIdentifier() => $branches[$driver->getRootIdentifier()]] + $branches; } foreach ($branches as $branch => $identifier) { $branch = (string) $branch; $msg = 'Reading composer.json of ' . ($this->packageName ?: $this->url) . ' (' . $branch . ')'; if ($isVeryVerbose) { $this->io->writeError($msg); } elseif ($isVerbose) { $this->io->overwriteError($msg, \false); } if (!($parsedBranch = $this->validateBranch($branch))) { if ($isVeryVerbose) { $this->io->writeError('Skipped branch ' . $branch . ', invalid name'); } continue; } // make sure branch packages have a dev flag if (\strpos($parsedBranch, 'dev-') === 0 || VersionParser::DEFAULT_BRANCH_ALIAS === $parsedBranch) { $version = 'dev-' . \str_replace('#', '+', $branch); $parsedBranch = \str_replace('#', '+', $parsedBranch); } else { $prefix = \strpos($branch, 'v') === 0 ? 'v' : ''; $version = $prefix . Preg::replace('{(\\.9{7})+}', '.x', $parsedBranch); } $cachedPackage = $this->getCachedPackageVersion($version, $identifier, $isVerbose, $isVeryVerbose, $driver->getRootIdentifier() === $branch); if ($cachedPackage) { $this->addPackage($cachedPackage); continue; } if ($cachedPackage === \false) { $this->emptyReferences[] = $identifier; continue; } try { $data = $driver->getComposerInformation($identifier); if (null === $data) { if ($isVeryVerbose) { $this->io->writeError('Skipped branch ' . $branch . ', no composer file'); } $this->emptyReferences[] = $identifier; continue; } // branches are always auto-versioned, read value from branch name $data['version'] = $version; $data['version_normalized'] = $parsedBranch; unset($data['default-branch']); if ($driver->getRootIdentifier() === $branch) { $data['default-branch'] = \true; } if ($isVeryVerbose) { $this->io->writeError('Importing branch ' . $branch . ' (' . $data['version'] . ')'); } $packageData = $this->preProcess($driver, $data, $identifier); $package = $this->loader->load($packageData); if ($this->loader instanceof ValidatingArrayLoader && \count($this->loader->getWarnings()) > 0) { throw new InvalidPackageException($this->loader->getErrors(), $this->loader->getWarnings(), $packageData); } $this->addPackage($package); } catch (TransportException $e) { $this->versionTransportExceptions['branches'][$branch] = $e; if ($e->getCode() === 404) { $this->emptyReferences[] = $identifier; } if ($this->shouldRethrowTransportException($e)) { throw $e; } if ($isVeryVerbose) { $this->io->writeError('Skipped branch ' . $branch . ', no composer file was found (' . $e->getCode() . ' HTTP status code)'); } continue; } catch (\Exception $e) { if (!$isVeryVerbose) { $this->io->writeError(''); } $this->branchErrorOccurred = \true; $this->io->writeError('Skipped branch ' . $branch . ', ' . $e->getMessage() . ''); $this->io->writeError(''); continue; } } $driver->cleanup(); if (!$isVeryVerbose) { $this->io->overwriteError('', \false); } if (!$this->getPackages()) { throw new \Composer\Repository\InvalidRepositoryException('No valid composer.json was found in any branch or tag of ' . $this->url . ', could not load a package from it.'); } } /** * @param array{name?: string, dist?: array{type: string, url: string, reference: string, shasum: string}, source?: array{type: string, url: string, reference: string}} $data * * @return array{name: string|null, dist: array{type: string, url: string, reference: string, shasum: string}|null, source: array{type: string, url: string, reference: string}} */ protected function preProcess(VcsDriverInterface $driver, array $data, string $identifier) : array { // keep the name of the main identifier for all packages // this ensures that a package can be renamed in one place and that all old tags // will still be installable using that new name without requiring re-tagging $dataPackageName = $data['name'] ?? null; $data['name'] = $this->packageName ?: $dataPackageName; if (!isset($data['dist'])) { $data['dist'] = $driver->getDist($identifier); } if (!isset($data['source'])) { $data['source'] = $driver->getSource($identifier); } // if custom dist info is provided but does not provide a reference, copy the source reference to it if (\is_array($data['dist']) && !isset($data['dist']['reference']) && isset($data['source']['reference'])) { $data['dist']['reference'] = $data['source']['reference']; } return $data; } /** * @return string|false */ private function validateBranch(string $branch) { try { $normalizedBranch = $this->versionParser->normalizeBranch($branch); // validate that the branch name has no weird characters conflicting with constraints $this->versionParser->parseConstraints($normalizedBranch); return $normalizedBranch; } catch (\Exception $e) { } return \false; } /** * @return string|false */ private function validateTag(string $version) { try { return $this->versionParser->normalize($version); } catch (\Exception $e) { } return \false; } /** * @return \Composer\Package\CompletePackage|\Composer\Package\CompleteAliasPackage|null|false null if no cache present, false if the absence of a version was cached */ private function getCachedPackageVersion(string $version, string $identifier, bool $isVerbose, bool $isVeryVerbose, bool $isDefaultBranch = \false) { if (!$this->versionCache) { return null; } $cachedPackage = $this->versionCache->getVersionPackage($version, $identifier); if ($cachedPackage === \false) { if ($isVeryVerbose) { $this->io->writeError('Skipped ' . $version . ', no composer file (cached from ref ' . $identifier . ')'); } return \false; } if ($cachedPackage) { $msg = 'Found cached composer.json of ' . ($this->packageName ?: $this->url) . ' (' . $version . ')'; if ($isVeryVerbose) { $this->io->writeError($msg); } elseif ($isVerbose) { $this->io->overwriteError($msg, \false); } unset($cachedPackage['default-branch']); if ($isDefaultBranch) { $cachedPackage['default-branch'] = \true; } if ($existingPackage = $this->findPackage($cachedPackage['name'], new Constraint('=', $cachedPackage['version_normalized']))) { if ($isVeryVerbose) { $this->io->writeError('Skipped cached version ' . $version . ', it conflicts with an another tag (' . $existingPackage->getPrettyVersion() . ') as both resolve to ' . $cachedPackage['version_normalized'] . ' internally'); } $cachedPackage = null; } } if ($cachedPackage) { return $this->loader->load($cachedPackage); } return null; } private function shouldRethrowTransportException(TransportException $e) : bool { return \in_array($e->getCode(), [401, 403, 429], \true) || $e->getCode() >= 500; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Advisory\PartialSecurityAdvisory; use Composer\Advisory\SecurityAdvisory; use Composer\Package\BasePackage; use Composer\Package\Loader\ArrayLoader; use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Package\CompletePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\Version\VersionParser; use Composer\Package\Version\StabilityFilter; use Composer\Json\JsonFile; use Composer\Cache; use Composer\Config; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Plugin\PostFileDownloadEvent; use Composer\Semver\CompilingMatcher; use Composer\Util\HttpDownloader; use Composer\Util\Loop; use Composer\Plugin\PluginEvents; use Composer\Plugin\PreFileDownloadEvent; use Composer\EventDispatcher\EventDispatcher; use Composer\Downloader\TransportException; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Util\Http\Response; use Composer\MetadataMinifier\MetadataMinifier; use Composer\Util\Url; use React\Promise\PromiseInterface; /** * @author Jordi Boggiano */ class ComposerRepository extends \Composer\Repository\ArrayRepository implements \Composer\Repository\ConfigurableRepositoryInterface, \Composer\Repository\AdvisoryProviderInterface { /** * @var mixed[] * @phpstan-var array{url: string, options?: mixed[], type?: 'composer', allow_ssl_downgrade?: bool} */ private $repoConfig; /** @var mixed[] */ private $options; /** @var non-empty-string */ private $url; /** @var non-empty-string */ private $baseUrl; /** @var IOInterface */ private $io; /** @var HttpDownloader */ private $httpDownloader; /** @var Loop */ private $loop; /** @var Cache */ protected $cache; /** @var ?non-empty-string */ protected $notifyUrl = null; /** @var ?non-empty-string */ protected $searchUrl = null; /** @var ?non-empty-string a URL containing %package% which can be queried to get providers of a given name */ protected $providersApiUrl = null; /** @var bool */ protected $hasProviders = \false; /** @var ?non-empty-string */ protected $providersUrl = null; /** @var ?non-empty-string */ protected $listUrl = null; /** @var bool Indicates whether a comprehensive list of packages this repository might provide is expressed in the repository root. **/ protected $hasAvailablePackageList = \false; /** @var ?array */ protected $availablePackages = null; /** @var ?array */ protected $availablePackagePatterns = null; /** @var ?non-empty-string */ protected $lazyProvidersUrl = null; /** @var ?array */ protected $providerListing; /** @var ArrayLoader */ protected $loader; /** @var bool */ private $allowSslDowngrade = \false; /** @var ?EventDispatcher */ private $eventDispatcher; /** @var ?array> */ private $sourceMirrors; /** @var ?list */ private $distMirrors; /** @var bool */ private $degradedMode = \false; /** @var mixed[]|true */ private $rootData; /** @var bool */ private $hasPartialPackages = \false; /** @var ?array */ private $partialPackagesByName = null; /** @var bool */ private $displayedWarningAboutNonMatchingPackageIndex = \false; /** @var array{metadata: bool, api-url: string|null}|null */ private $securityAdvisoryConfig = null; /** * @var array list of package names which are fresh and can be loaded from the cache directly in case loadPackage is called several times * useful for v2 metadata repositories with lazy providers * @phpstan-var array */ private $freshMetadataUrls = []; /** * @var array list of package names which returned a 404 and should not be re-fetched in case loadPackage is called several times * useful for v2 metadata repositories with lazy providers * @phpstan-var array */ private $packagesNotFoundCache = []; /** * @var VersionParser */ private $versionParser; /** * @param array $repoConfig * @phpstan-param array{url: non-empty-string, options?: mixed[], type?: 'composer', allow_ssl_downgrade?: bool} $repoConfig */ public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $eventDispatcher = null) { parent::__construct(); if (!Preg::isMatch('{^[\\w.]+\\??://}', $repoConfig['url'])) { if (($localFilePath = \realpath($repoConfig['url'])) !== \false) { // it is a local path, add file scheme $repoConfig['url'] = 'file://' . $localFilePath; } else { // otherwise, assume http as the default protocol $repoConfig['url'] = 'http://' . $repoConfig['url']; } } $repoConfig['url'] = \rtrim($repoConfig['url'], '/'); if ($repoConfig['url'] === '') { throw new \InvalidArgumentException('The repository url must not be an empty string'); } if (\str_starts_with($repoConfig['url'], 'https?')) { $repoConfig['url'] = (\extension_loaded('openssl') ? 'https' : 'http') . \substr($repoConfig['url'], 6); } $urlBits = \parse_url(\strtr($repoConfig['url'], '\\', '/')); if ($urlBits === \false || empty($urlBits['scheme'])) { throw new \UnexpectedValueException('Invalid url given for Composer repository: ' . $repoConfig['url']); } if (!isset($repoConfig['options'])) { $repoConfig['options'] = []; } if (isset($repoConfig['allow_ssl_downgrade']) && \true === $repoConfig['allow_ssl_downgrade']) { $this->allowSslDowngrade = \true; } $this->options = $repoConfig['options']; $this->url = $repoConfig['url']; // force url for packagist.org to repo.packagist.org if (Preg::isMatch('{^(?Phttps?)://packagist\\.org/?$}i', $this->url, $match)) { $this->url = $match['proto'] . '://repo.packagist.org'; } $baseUrl = \rtrim(Preg::replace('{(?:/[^/\\\\]+\\.json)?(?:[?#].*)?$}', '', $this->url), '/'); \assert($baseUrl !== ''); $this->baseUrl = $baseUrl; $this->io = $io; $this->cache = new Cache($io, $config->get('cache-repo-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($this->url)), 'a-z0-9.$~_'); $this->cache->setReadOnly($config->get('cache-read-only')); $this->versionParser = new VersionParser(); $this->loader = new ArrayLoader($this->versionParser); $this->httpDownloader = $httpDownloader; $this->eventDispatcher = $eventDispatcher; $this->repoConfig = $repoConfig; $this->loop = new Loop($this->httpDownloader); } public function getRepoName() { return 'composer repo (' . Url::sanitize($this->url) . ')'; } public function getRepoConfig() { return $this->repoConfig; } /** * @inheritDoc */ public function findPackage(string $name, $constraint) { // this call initializes loadRootServerFile which is needed for the rest below to work $hasProviders = $this->hasProviders(); $name = \strtolower($name); if (!$constraint instanceof ConstraintInterface) { $constraint = $this->versionParser->parseConstraints($constraint); } if ($this->lazyProvidersUrl) { if ($this->hasPartialPackages() && isset($this->partialPackagesByName[$name])) { return $this->filterPackages($this->whatProvides($name), $constraint, \true); } if ($this->hasAvailablePackageList && !$this->lazyProvidersRepoContains($name)) { return null; } $packages = $this->loadAsyncPackages([$name => $constraint]); if (\count($packages['packages']) > 0) { return \reset($packages['packages']); } return null; } if ($hasProviders) { foreach ($this->getProviderNames() as $providerName) { if ($name === $providerName) { return $this->filterPackages($this->whatProvides($providerName), $constraint, \true); } } return null; } return parent::findPackage($name, $constraint); } /** * @inheritDoc */ public function findPackages(string $name, $constraint = null) { // this call initializes loadRootServerFile which is needed for the rest below to work $hasProviders = $this->hasProviders(); $name = \strtolower($name); if (null !== $constraint && !$constraint instanceof ConstraintInterface) { $constraint = $this->versionParser->parseConstraints($constraint); } if ($this->lazyProvidersUrl) { if ($this->hasPartialPackages() && isset($this->partialPackagesByName[$name])) { return $this->filterPackages($this->whatProvides($name), $constraint); } if ($this->hasAvailablePackageList && !$this->lazyProvidersRepoContains($name)) { return []; } $result = $this->loadAsyncPackages([$name => $constraint]); return $result['packages']; } if ($hasProviders) { foreach ($this->getProviderNames() as $providerName) { if ($name === $providerName) { return $this->filterPackages($this->whatProvides($providerName), $constraint); } } return []; } return parent::findPackages($name, $constraint); } /** * @param array $packages * * @return BasePackage|array|null */ private function filterPackages(array $packages, ?ConstraintInterface $constraint = null, bool $returnFirstMatch = \false) { if (null === $constraint) { if ($returnFirstMatch) { return \reset($packages); } return $packages; } $filteredPackages = []; foreach ($packages as $package) { $pkgConstraint = new Constraint('==', $package->getVersion()); if ($constraint->matches($pkgConstraint)) { if ($returnFirstMatch) { return $package; } $filteredPackages[] = $package; } } if ($returnFirstMatch) { return null; } return $filteredPackages; } public function getPackages() { $hasProviders = $this->hasProviders(); if ($this->lazyProvidersUrl) { if (\is_array($this->availablePackages) && !$this->availablePackagePatterns) { $packageMap = []; foreach ($this->availablePackages as $name) { $packageMap[$name] = new MatchAllConstraint(); } $result = $this->loadAsyncPackages($packageMap); return \array_values($result['packages']); } if ($this->hasPartialPackages()) { if (!\is_array($this->partialPackagesByName)) { throw new \LogicException('hasPartialPackages failed to initialize $this->partialPackagesByName'); } return $this->createPackages($this->partialPackagesByName, 'packages.json inline packages'); } throw new \LogicException('Composer repositories that have lazy providers and no available-packages list can not load the complete list of packages, use getPackageNames instead.'); } if ($hasProviders) { throw new \LogicException('Composer repositories that have providers can not load the complete list of packages, use getPackageNames instead.'); } return parent::getPackages(); } /** * @param string|null $packageFilter Package pattern filter which can include "*" as a wildcard * * @return string[] */ public function getPackageNames(?string $packageFilter = null) { $hasProviders = $this->hasProviders(); $filterResults = static function (array $results) : array { return $results; }; if (null !== $packageFilter && '' !== $packageFilter) { $packageFilterRegex = BasePackage::packageNameToRegexp($packageFilter); $filterResults = static function (array $results) use($packageFilterRegex) : array { /** @var list $results */ return Preg::grep($packageFilterRegex, $results); }; } if ($this->lazyProvidersUrl) { if (\is_array($this->availablePackages)) { return $filterResults(\array_keys($this->availablePackages)); } if ($this->listUrl) { // no need to call $filterResults here as the $packageFilter is applied in the function itself return $this->loadPackageList($packageFilter); } if ($this->hasPartialPackages() && $this->partialPackagesByName !== null) { return $filterResults(\array_keys($this->partialPackagesByName)); } return []; } if ($hasProviders) { return $filterResults($this->getProviderNames()); } $names = []; foreach ($this->getPackages() as $package) { $names[] = $package->getPrettyName(); } return $filterResults($names); } /** * @return list */ private function getVendorNames() : array { $cacheKey = 'vendor-list.txt'; $cacheAge = $this->cache->getAge($cacheKey); if (\false !== $cacheAge && $cacheAge < 600 && ($cachedData = $this->cache->read($cacheKey)) !== \false) { $cachedData = \explode("\n", $cachedData); return $cachedData; } $names = $this->getPackageNames(); $uniques = []; foreach ($names as $name) { $uniques[\explode('/', $name, 2)[0]] = \true; } $vendors = \array_keys($uniques); if (!$this->cache->isReadOnly()) { $this->cache->write($cacheKey, \implode("\n", $vendors)); } return $vendors; } /** * @return list */ private function loadPackageList(?string $packageFilter = null) : array { if (null === $this->listUrl) { throw new \LogicException('Make sure to call loadRootServerFile before loadPackageList'); } $url = $this->listUrl; if (\is_string($packageFilter) && $packageFilter !== '') { $url .= '?filter=' . \urlencode($packageFilter); $result = $this->httpDownloader->get($url, $this->options)->decodeJson(); return $result['packageNames']; } $cacheKey = 'package-list.txt'; $cacheAge = $this->cache->getAge($cacheKey); if (\false !== $cacheAge && $cacheAge < 600 && ($cachedData = $this->cache->read($cacheKey)) !== \false) { $cachedData = \explode("\n", $cachedData); return $cachedData; } $result = $this->httpDownloader->get($url, $this->options)->decodeJson(); if (!$this->cache->isReadOnly()) { $this->cache->write($cacheKey, \implode("\n", $result['packageNames'])); } return $result['packageNames']; } public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) { // this call initializes loadRootServerFile which is needed for the rest below to work $hasProviders = $this->hasProviders(); if (!$hasProviders && !$this->hasPartialPackages() && null === $this->lazyProvidersUrl) { return parent::loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); } $packages = []; $namesFound = []; if ($hasProviders || $this->hasPartialPackages()) { foreach ($packageNameMap as $name => $constraint) { $matches = []; // if a repo has no providers but only partial packages and the partial packages are missing // then we don't want to call whatProvides as it would try to load from the providers and fail if (!$hasProviders && !isset($this->partialPackagesByName[$name])) { continue; } $candidates = $this->whatProvides($name, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); foreach ($candidates as $candidate) { if ($candidate->getName() !== $name) { throw new \LogicException('whatProvides should never return a package with a different name than the requested one'); } $namesFound[$name] = \true; if (!$constraint || $constraint->matches(new Constraint('==', $candidate->getVersion()))) { $matches[\spl_object_hash($candidate)] = $candidate; if ($candidate instanceof AliasPackage && !isset($matches[\spl_object_hash($candidate->getAliasOf())])) { $matches[\spl_object_hash($candidate->getAliasOf())] = $candidate->getAliasOf(); } } } // add aliases of matched packages even if they did not match the constraint foreach ($candidates as $candidate) { if ($candidate instanceof AliasPackage) { if (isset($matches[\spl_object_hash($candidate->getAliasOf())])) { $matches[\spl_object_hash($candidate)] = $candidate; } } } $packages = \array_merge($packages, $matches); unset($packageNameMap[$name]); } } if ($this->lazyProvidersUrl && \count($packageNameMap)) { if ($this->hasAvailablePackageList) { foreach ($packageNameMap as $name => $constraint) { if (!$this->lazyProvidersRepoContains(\strtolower($name))) { unset($packageNameMap[$name]); } } } $result = $this->loadAsyncPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); $packages = \array_merge($packages, $result['packages']); $namesFound = \array_merge($namesFound, $result['namesFound']); } return ['namesFound' => \array_keys($namesFound), 'packages' => $packages]; } /** * @inheritDoc */ public function search(string $query, int $mode = 0, ?string $type = null) { $this->loadRootServerFile(600); if ($this->searchUrl && $mode === self::SEARCH_FULLTEXT) { $url = \str_replace(['%query%', '%type%'], [\urlencode($query), $type], $this->searchUrl); $search = $this->httpDownloader->get($url, $this->options)->decodeJson(); if (empty($search['results'])) { return []; } $results = []; foreach ($search['results'] as $result) { // do not show virtual packages in results as they are not directly useful from a composer perspective if (!empty($result['virtual'])) { continue; } $results[] = $result; } return $results; } if ($mode === self::SEARCH_VENDOR) { $results = []; $regex = '{(?:' . \implode('|', Preg::split('{\\s+}', $query)) . ')}i'; $vendorNames = $this->getVendorNames(); foreach (Preg::grep($regex, $vendorNames) as $name) { $results[] = ['name' => $name, 'description' => '']; } return $results; } if ($this->hasProviders() || $this->lazyProvidersUrl) { // optimize search for "^foo/bar" where at least "^foo/" is present by loading this directly from the listUrl if present if (Preg::isMatchStrictGroups('{^\\^(?P(?P[a-z0-9_.-]+)/[a-z0-9_.-]*)\\*?$}i', $query, $match) && $this->listUrl !== null) { $url = $this->listUrl . '?vendor=' . \urlencode($match['vendor']) . '&filter=' . \urlencode($match['query'] . '*'); $result = $this->httpDownloader->get($url, $this->options)->decodeJson(); $results = []; foreach ($result['packageNames'] as $name) { $results[] = ['name' => $name, 'description' => '']; } return $results; } $results = []; $regex = '{(?:' . \implode('|', Preg::split('{\\s+}', $query)) . ')}i'; $packageNames = $this->getPackageNames(); foreach (Preg::grep($regex, $packageNames) as $name) { $results[] = ['name' => $name, 'description' => '']; } return $results; } return parent::search($query, $mode); } public function hasSecurityAdvisories() : bool { $this->loadRootServerFile(600); return $this->securityAdvisoryConfig !== null && ($this->securityAdvisoryConfig['metadata'] || $this->securityAdvisoryConfig['api-url'] !== null); } /** * @inheritDoc */ public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPartialAdvisories = \false) : array { $this->loadRootServerFile(600); if (null === $this->securityAdvisoryConfig) { return ['namesFound' => [], 'advisories' => []]; } $advisories = []; $namesFound = []; $apiUrl = $this->securityAdvisoryConfig['api-url']; // respect available-package-patterns / available-packages directives from the repo if ($this->hasAvailablePackageList) { foreach ($packageConstraintMap as $name => $constraint) { if (!$this->lazyProvidersRepoContains(\strtolower($name))) { unset($packageConstraintMap[$name]); } } } $parser = new VersionParser(); /** * @param array $data * @param string $name * @return ($allowPartialAdvisories is false ? SecurityAdvisory|null : PartialSecurityAdvisory|SecurityAdvisory|null) */ $create = function (array $data, string $name) use($parser, $allowPartialAdvisories, &$packageConstraintMap) : ?PartialSecurityAdvisory { $advisory = PartialSecurityAdvisory::create($name, $data, $parser); if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { throw new \RuntimeException('Advisory for ' . $name . ' could not be loaded as a full advisory from ' . $this->getRepoName() . \PHP_EOL . \var_export($data, \true)); } if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { return null; } return $advisory; }; if ($this->securityAdvisoryConfig['metadata'] && ($allowPartialAdvisories || $apiUrl === null)) { $promises = []; foreach ($packageConstraintMap as $name => $constraint) { $name = \strtolower($name); // skip platform packages, root package and composer-plugin-api if (\Composer\Repository\PlatformRepository::isPlatformPackage($name) || '__root__' === $name) { continue; } $promises[] = $this->startCachedAsyncDownload($name, $name)->then(static function (array $spec) use(&$advisories, &$namesFound, &$packageConstraintMap, $name, $create) : void { [$response] = $spec; if (!isset($response['security-advisories']) || !\is_array($response['security-advisories'])) { return; } $namesFound[$name] = \true; if (\count($response['security-advisories']) > 0) { $advisories[$name] = \array_filter(\array_map(static function ($data) use($name, $create) { return $create($data, $name); }, $response['security-advisories'])); } unset($packageConstraintMap[$name]); }); } $this->loop->wait($promises); } if ($apiUrl !== null && \count($packageConstraintMap) > 0) { $options = $this->options; $options['http']['method'] = 'POST'; if (isset($options['http']['header'])) { $options['http']['header'] = (array) $options['http']['header']; } $options['http']['header'][] = 'Content-type: application/x-www-form-urlencoded'; $options['http']['timeout'] = 10; $options['http']['content'] = \http_build_query(['packages' => \array_keys($packageConstraintMap)]); $response = $this->httpDownloader->get($apiUrl, $options); $warned = \false; /** @var string $name */ foreach ($response->decodeJson()['advisories'] as $name => $list) { if (!isset($packageConstraintMap[$name])) { if (!$warned) { $this->io->writeError('' . $this->getRepoName() . ' returned names which were not requested in response to the security-advisories API. ' . $name . ' was not requested but is present in the response. Requested names were: ' . \implode(', ', \array_keys($packageConstraintMap)) . ''); $warned = \true; } continue; } if (\count($list) > 0) { $advisories[$name] = \array_filter(\array_map(static function ($data) use($name, $create) { return $create($data, $name); }, $list)); } $namesFound[$name] = \true; } } return ['namesFound' => \array_keys($namesFound), 'advisories' => \array_filter($advisories)]; } public function getProviders(string $packageName) { $this->loadRootServerFile(); $result = []; if ($this->providersApiUrl) { try { $apiResult = $this->httpDownloader->get(\str_replace('%package%', $packageName, $this->providersApiUrl), $this->options)->decodeJson(); } catch (TransportException $e) { if ($e->getStatusCode() === 404) { return $result; } throw $e; } foreach ($apiResult['providers'] as $provider) { $result[$provider['name']] = $provider; } return $result; } if ($this->hasPartialPackages()) { if (!\is_array($this->partialPackagesByName)) { throw new \LogicException('hasPartialPackages failed to initialize $this->partialPackagesByName'); } foreach ($this->partialPackagesByName as $versions) { foreach ($versions as $candidate) { if (isset($result[$candidate['name']]) || !isset($candidate['provide'][$packageName])) { continue; } $result[$candidate['name']] = ['name' => $candidate['name'], 'description' => $candidate['description'] ?? '', 'type' => $candidate['type'] ?? '']; } } } if ($this->packages) { $result = \array_merge($result, parent::getProviders($packageName)); } return $result; } /** * @return string[] */ private function getProviderNames() : array { $this->loadRootServerFile(); if (null === $this->providerListing) { $data = $this->loadRootServerFile(); if (\is_array($data)) { $this->loadProviderListings($data); } } if ($this->lazyProvidersUrl) { // Can not determine list of provided packages for lazy repositories return []; } if (null !== $this->providersUrl && null !== $this->providerListing) { return \array_keys($this->providerListing); } return []; } protected function configurePackageTransportOptions(PackageInterface $package) : void { foreach ($package->getDistUrls() as $url) { if (\strpos($url, $this->baseUrl) === 0) { $package->setTransportOptions($this->options); return; } } } private function hasProviders() : bool { $this->loadRootServerFile(); return $this->hasProviders; } /** * @param string $name package name * @param array|null $acceptableStabilities * @phpstan-param array, BasePackage::STABILITY_*>|null $acceptableStabilities * @param array|null $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array|null $stabilityFlags * @param array> $alreadyLoaded * * @return array */ private function whatProvides(string $name, ?array $acceptableStabilities = null, ?array $stabilityFlags = null, array $alreadyLoaded = []) : array { $packagesSource = null; if (!$this->hasPartialPackages() || !isset($this->partialPackagesByName[$name])) { // skip platform packages, root package and composer-plugin-api if (\Composer\Repository\PlatformRepository::isPlatformPackage($name) || '__root__' === $name) { return []; } if (null === $this->providerListing) { $data = $this->loadRootServerFile(); if (\is_array($data)) { $this->loadProviderListings($data); } } $useLastModifiedCheck = \false; if ($this->lazyProvidersUrl && !isset($this->providerListing[$name])) { $hash = null; $url = \str_replace('%package%', $name, $this->lazyProvidersUrl); $cacheKey = 'provider-' . \strtr($name, '/', '$') . '.json'; $useLastModifiedCheck = \true; } elseif ($this->providersUrl) { // package does not exist in this repo if (!isset($this->providerListing[$name])) { return []; } $hash = $this->providerListing[$name]['sha256']; $url = \str_replace(['%package%', '%hash%'], [$name, $hash], $this->providersUrl); $cacheKey = 'provider-' . \strtr($name, '/', '$') . '.json'; } else { return []; } $packages = null; if (!$useLastModifiedCheck && $hash && $this->cache->sha256($cacheKey) === $hash) { $packages = \json_decode($this->cache->read($cacheKey), \true); $packagesSource = 'cached file (' . $cacheKey . ' originating from ' . Url::sanitize($url) . ')'; } elseif ($useLastModifiedCheck) { if ($contents = $this->cache->read($cacheKey)) { $contents = \json_decode($contents, \true); // we already loaded some packages from this file, so assume it is fresh and avoid fetching it again if (isset($alreadyLoaded[$name])) { $packages = $contents; $packagesSource = 'cached file (' . $cacheKey . ' originating from ' . Url::sanitize($url) . ')'; } elseif (isset($contents['last-modified'])) { $response = $this->fetchFileIfLastModified($url, $cacheKey, $contents['last-modified']); $packages = \true === $response ? $contents : $response; $packagesSource = \true === $response ? 'cached file (' . $cacheKey . ' originating from ' . Url::sanitize($url) . ')' : 'downloaded file (' . Url::sanitize($url) . ')'; } } } if (!$packages) { try { $packages = $this->fetchFile($url, $cacheKey, $hash, $useLastModifiedCheck); $packagesSource = 'downloaded file (' . Url::sanitize($url) . ')'; } catch (TransportException $e) { // 404s are acceptable for lazy provider repos if ($this->lazyProvidersUrl && \in_array($e->getStatusCode(), [404, 499], \true)) { $packages = ['packages' => []]; $packagesSource = 'not-found file (' . Url::sanitize($url) . ')'; if ($e->getStatusCode() === 499) { $this->io->error('' . $e->getMessage() . ''); } } else { throw $e; } } } $loadingPartialPackage = \false; } else { $packages = ['packages' => ['versions' => $this->partialPackagesByName[$name]]]; $packagesSource = 'root file (' . Url::sanitize($this->getPackagesJsonUrl()) . ')'; $loadingPartialPackage = \true; } $result = []; $versionsToLoad = []; foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { $normalizedName = \strtolower($version['name']); // only load the actual named package, not other packages that might find themselves in the same file if ($normalizedName !== $name) { continue; } if (!$loadingPartialPackage && $this->hasPartialPackages() && isset($this->partialPackagesByName[$normalizedName])) { continue; } if (!isset($versionsToLoad[$version['uid']])) { if (!isset($version['version_normalized'])) { $version['version_normalized'] = $this->versionParser->normalize($version['version']); } elseif ($version['version_normalized'] === VersionParser::DEFAULT_BRANCH_ALIAS) { // handling of existing repos which need to remain composer v1 compatible, in case the version_normalized contained VersionParser::DEFAULT_BRANCH_ALIAS, we renormalize it $version['version_normalized'] = $this->versionParser->normalize($version['version']); } // avoid loading packages which have already been loaded if (isset($alreadyLoaded[$name][$version['version_normalized']])) { continue; } if ($this->isVersionAcceptable(null, $normalizedName, $version, $acceptableStabilities, $stabilityFlags)) { $versionsToLoad[$version['uid']] = $version; } } } } // load acceptable packages in the providers $loadedPackages = $this->createPackages($versionsToLoad, $packagesSource); $uids = \array_keys($versionsToLoad); foreach ($loadedPackages as $index => $package) { $package->setRepository($this); $uid = $uids[$index]; if ($package instanceof AliasPackage) { $aliased = $package->getAliasOf(); $aliased->setRepository($this); $result[$uid] = $aliased; $result[$uid . '-alias'] = $package; } else { $result[$uid] = $package; } } return $result; } /** * @inheritDoc */ protected function initialize() { parent::initialize(); $repoData = $this->loadDataFromServer(); foreach ($this->createPackages($repoData, 'root file (' . Url::sanitize($this->getPackagesJsonUrl()) . ')') as $package) { $this->addPackage($package); } } /** * Adds a new package to the repository */ public function addPackage(PackageInterface $package) { parent::addPackage($package); $this->configurePackageTransportOptions($package); } /** * @param array $packageNames array of package name => ConstraintInterface|null - if a constraint is provided, only * packages matching it will be loaded * @param array|null $acceptableStabilities * @phpstan-param array, BasePackage::STABILITY_*>|null $acceptableStabilities * @param array|null $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array|null $stabilityFlags * @param array> $alreadyLoaded * * @return array{namesFound: array, packages: array} */ private function loadAsyncPackages(array $packageNames, ?array $acceptableStabilities = null, ?array $stabilityFlags = null, array $alreadyLoaded = []) : array { $this->loadRootServerFile(); $packages = []; $namesFound = []; $promises = []; if (null === $this->lazyProvidersUrl) { throw new \LogicException('loadAsyncPackages only supports v2 protocol composer repos with a metadata-url'); } // load ~dev versions of the packages as well if needed foreach ($packageNames as $name => $constraint) { if ($acceptableStabilities === null || $stabilityFlags === null || StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, [$name], 'dev')) { $packageNames[$name . '~dev'] = $constraint; } // if only dev stability is requested, we skip loading the non dev file if (isset($acceptableStabilities['dev']) && \count($acceptableStabilities) === 1 && \count($stabilityFlags) === 0) { unset($packageNames[$name]); } } foreach ($packageNames as $name => $constraint) { $name = \strtolower($name); $realName = Preg::replace('{~dev$}', '', $name); // skip platform packages, root package and composer-plugin-api if (\Composer\Repository\PlatformRepository::isPlatformPackage($realName) || '__root__' === $realName) { continue; } $promises[] = $this->startCachedAsyncDownload($name, $realName)->then(function (array $spec) use(&$packages, &$namesFound, $realName, $constraint, $acceptableStabilities, $stabilityFlags, $alreadyLoaded) : void { [$response, $packagesSource] = $spec; if (null === $response || !isset($response['packages'][$realName])) { return; } $versions = $response['packages'][$realName]; if (isset($response['minified']) && $response['minified'] === 'composer/2.0') { $versions = MetadataMinifier::expand($versions); } $namesFound[$realName] = \true; $versionsToLoad = []; foreach ($versions as $version) { if (!isset($version['version_normalized'])) { $version['version_normalized'] = $this->versionParser->normalize($version['version']); } elseif ($version['version_normalized'] === VersionParser::DEFAULT_BRANCH_ALIAS) { // handling of existing repos which need to remain composer v1 compatible, in case the version_normalized contained VersionParser::DEFAULT_BRANCH_ALIAS, we renormalize it $version['version_normalized'] = $this->versionParser->normalize($version['version']); } // avoid loading packages which have already been loaded if (isset($alreadyLoaded[$realName][$version['version_normalized']])) { continue; } if ($this->isVersionAcceptable($constraint, $realName, $version, $acceptableStabilities, $stabilityFlags)) { $versionsToLoad[] = $version; } } $loadedPackages = $this->createPackages($versionsToLoad, $packagesSource); foreach ($loadedPackages as $package) { $package->setRepository($this); $packages[\spl_object_hash($package)] = $package; if ($package instanceof AliasPackage && !isset($packages[\spl_object_hash($package->getAliasOf())])) { $package->getAliasOf()->setRepository($this); $packages[\spl_object_hash($package->getAliasOf())] = $package->getAliasOf(); } } }); } $this->loop->wait($promises); return ['namesFound' => $namesFound, 'packages' => $packages]; } /** * @phpstan-return PromiseInterface */ private function startCachedAsyncDownload(string $fileName, ?string $packageName = null) : PromiseInterface { if (null === $this->lazyProvidersUrl) { throw new \LogicException('startCachedAsyncDownload only supports v2 protocol composer repos with a metadata-url'); } $name = \strtolower($fileName); $packageName = $packageName ?? $name; $url = \str_replace('%package%', $name, $this->lazyProvidersUrl); $cacheKey = 'provider-' . \strtr($name, '/', '~') . '.json'; $lastModified = null; if ($contents = $this->cache->read($cacheKey)) { $contents = \json_decode($contents, \true); $lastModified = $contents['last-modified'] ?? null; } return $this->asyncFetchFile($url, $cacheKey, $lastModified)->then(static function ($response) use($url, $cacheKey, $contents, $packageName) : array { $packagesSource = 'downloaded file (' . Url::sanitize($url) . ')'; if (\true === $response) { $packagesSource = 'cached file (' . $cacheKey . ' originating from ' . Url::sanitize($url) . ')'; $response = $contents; } if (!isset($response['packages'][$packageName]) && !isset($response['security-advisories'])) { return [null, $packagesSource]; } return [$response, $packagesSource]; }); } /** * @param string $name package name (must be lowercased already) * @param array $versionData * @param array|null $acceptableStabilities * @phpstan-param array, BasePackage::STABILITY_*>|null $acceptableStabilities * @param array|null $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array|null $stabilityFlags */ private function isVersionAcceptable(?ConstraintInterface $constraint, string $name, array $versionData, ?array $acceptableStabilities = null, ?array $stabilityFlags = null) : bool { $versions = [$versionData['version_normalized']]; if ($alias = $this->loader->getBranchAlias($versionData)) { $versions[] = $alias; } foreach ($versions as $version) { if (null !== $acceptableStabilities && null !== $stabilityFlags && !StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, [$name], VersionParser::parseStability($version))) { continue; } if ($constraint && !CompilingMatcher::match($constraint, Constraint::OP_EQ, $version)) { continue; } return \true; } return \false; } private function getPackagesJsonUrl() : string { $jsonUrlParts = \parse_url(\strtr($this->url, '\\', '/')); if (isset($jsonUrlParts['path']) && \false !== \strpos($jsonUrlParts['path'], '.json')) { return $this->url; } return $this->url . '/packages.json'; } /** * @return array<'providers'|'provider-includes'|'packages'|'providers-url'|'notify-batch'|'search'|'mirrors'|'providers-lazy-url'|'metadata-url'|'available-packages'|'available-package-patterns', mixed>|true */ protected function loadRootServerFile(?int $rootMaxAge = null) { if (null !== $this->rootData) { return $this->rootData; } if (!\extension_loaded('openssl') && \strpos($this->url, 'https') === 0) { throw new \RuntimeException('You must enable the openssl extension in your php.ini to load information from ' . $this->url); } if ($cachedData = $this->cache->read('packages.json')) { $cachedData = \json_decode($cachedData, \true); if ($rootMaxAge !== null && ($age = $this->cache->getAge('packages.json')) !== \false && $age <= $rootMaxAge) { $data = $cachedData; } elseif (isset($cachedData['last-modified'])) { $response = $this->fetchFileIfLastModified($this->getPackagesJsonUrl(), 'packages.json', $cachedData['last-modified']); $data = \true === $response ? $cachedData : $response; } } if (!isset($data)) { $data = $this->fetchFile($this->getPackagesJsonUrl(), 'packages.json', null, \true); } if (!empty($data['notify-batch'])) { $this->notifyUrl = $this->canonicalizeUrl($data['notify-batch']); } elseif (!empty($data['notify'])) { $this->notifyUrl = $this->canonicalizeUrl($data['notify']); } if (!empty($data['search'])) { $this->searchUrl = $this->canonicalizeUrl($data['search']); } if (!empty($data['mirrors'])) { foreach ($data['mirrors'] as $mirror) { if (!empty($mirror['git-url'])) { $this->sourceMirrors['git'][] = ['url' => $mirror['git-url'], 'preferred' => !empty($mirror['preferred'])]; } if (!empty($mirror['hg-url'])) { $this->sourceMirrors['hg'][] = ['url' => $mirror['hg-url'], 'preferred' => !empty($mirror['preferred'])]; } if (!empty($mirror['dist-url'])) { $this->distMirrors[] = ['url' => $this->canonicalizeUrl($mirror['dist-url']), 'preferred' => !empty($mirror['preferred'])]; } } } if (!empty($data['providers-lazy-url'])) { $this->lazyProvidersUrl = $this->canonicalizeUrl($data['providers-lazy-url']); $this->hasProviders = \true; $this->hasPartialPackages = !empty($data['packages']) && \is_array($data['packages']); } // metadata-url indicates V2 repo protocol so it takes over from all the V1 types // V2 only has lazyProviders and possibly partial packages, but no ability to process anything else, // V2 also supports async loading if (!empty($data['metadata-url'])) { $this->lazyProvidersUrl = $this->canonicalizeUrl($data['metadata-url']); $this->providersUrl = null; $this->hasProviders = \false; $this->hasPartialPackages = !empty($data['packages']) && \is_array($data['packages']); $this->allowSslDowngrade = \false; // provides a list of package names that are available in this repo // this disables lazy-provider behavior in the sense that if a list is available we assume it is finite and won't search for other packages in that repo // while if no list is there lazyProvidersUrl is used when looking for any package name to see if the repo knows it if (!empty($data['available-packages'])) { $availPackages = \array_map('strtolower', $data['available-packages']); $this->availablePackages = \array_combine($availPackages, $availPackages); $this->hasAvailablePackageList = \true; } // Provides a list of package name patterns (using * wildcards to match any substring, e.g. "vendor/*") that are available in this repo // Disables lazy-provider behavior as with available-packages, but may allow much more compact expression of packages covered by this repository. // Over-specifying covered packages is safe, but may result in increased traffic to your repository. if (!empty($data['available-package-patterns'])) { $this->availablePackagePatterns = \array_map(static function ($pattern) : string { return BasePackage::packageNameToRegexp($pattern); }, $data['available-package-patterns']); $this->hasAvailablePackageList = \true; } // Remove legacy keys as most repos need to be compatible with Composer v1 // as well but we are not interested in the old format anymore at this point unset($data['providers-url'], $data['providers'], $data['providers-includes']); if (isset($data['security-advisories']) && \is_array($data['security-advisories'])) { $this->securityAdvisoryConfig = ['metadata' => $data['security-advisories']['metadata'] ?? \false, 'api-url' => isset($data['security-advisories']['api-url']) && \is_string($data['security-advisories']['api-url']) ? $this->canonicalizeUrl($data['security-advisories']['api-url']) : null]; if ($this->securityAdvisoryConfig['api-url'] === null && !$this->hasAvailablePackageList) { throw new \UnexpectedValueException('Invalid security advisory configuration on ' . $this->getRepoName() . ': If the repository does not provide a security-advisories.api-url then available-packages or available-package-patterns are required to be provided for performance reason.'); } } } if ($this->allowSslDowngrade) { $this->url = \str_replace('https://', 'http://', $this->url); $this->baseUrl = \str_replace('https://', 'http://', $this->baseUrl); } if (!empty($data['providers-url'])) { $this->providersUrl = $this->canonicalizeUrl($data['providers-url']); $this->hasProviders = \true; } if (!empty($data['list'])) { $this->listUrl = $this->canonicalizeUrl($data['list']); } if (!empty($data['providers']) || !empty($data['providers-includes'])) { $this->hasProviders = \true; } if (!empty($data['providers-api'])) { $this->providersApiUrl = $this->canonicalizeUrl($data['providers-api']); } return $this->rootData = $data; } /** * @param string $url * @return non-empty-string */ private function canonicalizeUrl(string $url) : string { if (\strlen($url) === 0) { throw new \InvalidArgumentException('Expected a string with a value and not an empty string'); } if (\str_starts_with($url, '/')) { if (Preg::isMatch('{^[^:]++://[^/]*+}', $this->url, $matches)) { return $matches[0] . $url; } return $this->url; } return $url; } /** * @return mixed[] */ private function loadDataFromServer() : array { $data = $this->loadRootServerFile(); if (\true === $data) { throw new \LogicException('loadRootServerFile should not return true during initialization'); } return $this->loadIncludes($data); } private function hasPartialPackages() : bool { if ($this->hasPartialPackages && null === $this->partialPackagesByName) { $this->initializePartialPackages(); } return $this->hasPartialPackages; } /** * @param array{providers?: mixed[], provider-includes?: mixed[]} $data */ private function loadProviderListings($data) : void { if (isset($data['providers'])) { if (!\is_array($this->providerListing)) { $this->providerListing = []; } $this->providerListing = \array_merge($this->providerListing, $data['providers']); } if ($this->providersUrl && isset($data['provider-includes'])) { $includes = $data['provider-includes']; foreach ($includes as $include => $metadata) { $url = $this->baseUrl . '/' . \str_replace('%hash%', $metadata['sha256'], $include); $cacheKey = \str_replace(['%hash%', '$'], '', $include); if ($this->cache->sha256($cacheKey) === $metadata['sha256']) { $includedData = \json_decode($this->cache->read($cacheKey), \true); } else { $includedData = $this->fetchFile($url, $cacheKey, $metadata['sha256']); } $this->loadProviderListings($includedData); } } } /** * @param mixed[] $data * * @return mixed[] */ private function loadIncludes(array $data) : array { $packages = []; // legacy repo handling if (!isset($data['packages']) && !isset($data['includes'])) { foreach ($data as $pkg) { if (isset($pkg['versions']) && \is_array($pkg['versions'])) { foreach ($pkg['versions'] as $metadata) { $packages[] = $metadata; } } } return $packages; } if (isset($data['packages'])) { foreach ($data['packages'] as $package => $versions) { $packageName = \strtolower((string) $package); foreach ($versions as $version => $metadata) { $packages[] = $metadata; if (!$this->displayedWarningAboutNonMatchingPackageIndex && $packageName !== \strtolower((string) ($metadata['name'] ?? ''))) { $this->displayedWarningAboutNonMatchingPackageIndex = \true; $this->io->writeError(\sprintf("Warning: the packages key '%s' doesn't match the name defined in the package metadata '%s' in repository %s", $package, $metadata['name'] ?? '', $this->baseUrl)); } } } } if (isset($data['includes'])) { foreach ($data['includes'] as $include => $metadata) { if (isset($metadata['sha1']) && $this->cache->sha1((string) $include) === $metadata['sha1']) { $includedData = \json_decode($this->cache->read((string) $include), \true); } else { $includedData = $this->fetchFile($include); } $packages = \array_merge($packages, $this->loadIncludes($includedData)); } } return $packages; } /** * @param mixed[] $packages * * @return list */ private function createPackages(array $packages, ?string $source = null) : array { if (!$packages) { return []; } try { foreach ($packages as &$data) { if (!isset($data['notification-url'])) { $data['notification-url'] = $this->notifyUrl; } } $packageInstances = $this->loader->loadPackages($packages); foreach ($packageInstances as $package) { if (isset($this->sourceMirrors[$package->getSourceType()])) { $package->setSourceMirrors($this->sourceMirrors[$package->getSourceType()]); } $package->setDistMirrors($this->distMirrors); $this->configurePackageTransportOptions($package); } return $packageInstances; } catch (\Exception $e) { throw new \RuntimeException('Could not load packages ' . ($packages[0]['name'] ?? \json_encode($packages)) . ' in ' . $this->getRepoName() . ($source ? ' from ' . $source : '') . ': [' . \get_class($e) . '] ' . $e->getMessage(), 0, $e); } } /** * @return array */ protected function fetchFile(string $filename, ?string $cacheKey = null, ?string $sha256 = null, bool $storeLastModifiedTime = \false) { if ('' === $filename) { throw new \InvalidArgumentException('$filename should not be an empty string'); } if (null === $cacheKey) { $cacheKey = $filename; $filename = $this->baseUrl . '/' . $filename; } // url-encode $ signs in URLs as bad proxies choke on them if (($pos = \strpos($filename, '$')) && Preg::isMatch('{^https?://}i', $filename)) { $filename = \substr($filename, 0, $pos) . '%24' . \substr($filename, $pos + 1); } $retries = 3; while ($retries--) { try { $options = $this->options; if ($this->eventDispatcher) { $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', ['repository' => $this]); $preFileDownloadEvent->setTransportOptions($this->options); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $filename = $preFileDownloadEvent->getProcessedUrl(); $options = $preFileDownloadEvent->getTransportOptions(); } $response = $this->httpDownloader->get($filename, $options); $json = (string) $response->getBody(); if ($sha256 && $sha256 !== \hash('sha256', $json)) { // undo downgrade before trying again if http seems to be hijacked or modifying content somehow if ($this->allowSslDowngrade) { $this->url = \str_replace('http://', 'https://', $this->url); $this->baseUrl = \str_replace('http://', 'https://', $this->baseUrl); $filename = \str_replace('http://', 'https://', $filename); } if ($retries > 0) { \usleep(100000); continue; } // TODO use scarier wording once we know for sure it doesn't do false positives anymore throw new \Composer\Repository\RepositorySecurityException('The contents of ' . $filename . ' do not match its signature. This could indicate a man-in-the-middle attack or e.g. antivirus software corrupting files. Try running composer again and report this if you think it is a mistake.'); } if ($this->eventDispatcher) { $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, $sha256, $filename, 'metadata', ['response' => $response, 'repository' => $this]); $this->eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } $data = $response->decodeJson(); HttpDownloader::outputWarnings($this->io, $this->url, $data); if ($cacheKey && !$this->cache->isReadOnly()) { if ($storeLastModifiedTime) { $lastModifiedDate = $response->getHeader('last-modified'); if ($lastModifiedDate) { $data['last-modified'] = $lastModifiedDate; $json = JsonFile::encode($data, 0); } } $this->cache->write($cacheKey, $json); } $response->collect(); break; } catch (\Exception $e) { if ($e instanceof \LogicException) { throw $e; } if ($e instanceof TransportException && $e->getStatusCode() === 404) { throw $e; } if ($e instanceof \Composer\Repository\RepositorySecurityException) { throw $e; } if ($cacheKey && ($contents = $this->cache->read($cacheKey))) { if (!$this->degradedMode) { $this->io->writeError('' . $this->url . ' could not be fully loaded (' . $e->getMessage() . '), package information was loaded from the local cache and may be out of date'); } $this->degradedMode = \true; $data = JsonFile::parseJson($contents, $this->cache->getRoot() . $cacheKey); break; } throw $e; } } if (!isset($data)) { throw new \LogicException("ComposerRepository: Undefined \$data. Please report at https://github.com/composer/composer/issues/new."); } return $data; } /** * @return array|true */ private function fetchFileIfLastModified(string $filename, string $cacheKey, string $lastModifiedTime) { if ('' === $filename) { throw new \InvalidArgumentException('$filename should not be an empty string'); } try { $options = $this->options; if ($this->eventDispatcher) { $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', ['repository' => $this]); $preFileDownloadEvent->setTransportOptions($this->options); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $filename = $preFileDownloadEvent->getProcessedUrl(); $options = $preFileDownloadEvent->getTransportOptions(); } if (isset($options['http']['header'])) { $options['http']['header'] = (array) $options['http']['header']; } $options['http']['header'][] = 'If-Modified-Since: ' . $lastModifiedTime; $response = $this->httpDownloader->get($filename, $options); $json = (string) $response->getBody(); if ($json === '' && $response->getStatusCode() === 304) { return \true; } if ($this->eventDispatcher) { $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, null, $filename, 'metadata', ['response' => $response, 'repository' => $this]); $this->eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } $data = $response->decodeJson(); HttpDownloader::outputWarnings($this->io, $this->url, $data); $lastModifiedDate = $response->getHeader('last-modified'); $response->collect(); if ($lastModifiedDate) { $data['last-modified'] = $lastModifiedDate; $json = JsonFile::encode($data, 0); } if (!$this->cache->isReadOnly()) { $this->cache->write($cacheKey, $json); } return $data; } catch (\Exception $e) { if ($e instanceof \LogicException) { throw $e; } if ($e instanceof TransportException && $e->getStatusCode() === 404) { throw $e; } if (!$this->degradedMode) { $this->io->writeError('' . $this->url . ' could not be fully loaded (' . $e->getMessage() . '), package information was loaded from the local cache and may be out of date'); } $this->degradedMode = \true; return \true; } } /** * @phpstan-return PromiseInterface|true> true if the response was a 304 and the cache is fresh, otherwise it returns the decoded json */ private function asyncFetchFile(string $filename, string $cacheKey, ?string $lastModifiedTime = null) : PromiseInterface { if ('' === $filename) { throw new \InvalidArgumentException('$filename should not be an empty string'); } if (isset($this->packagesNotFoundCache[$filename])) { return \React\Promise\resolve(['packages' => []]); } if (isset($this->freshMetadataUrls[$filename]) && $lastModifiedTime) { // make it look like we got a 304 response /** @var PromiseInterface $promise */ $promise = \React\Promise\resolve(\true); return $promise; } $httpDownloader = $this->httpDownloader; $options = $this->options; if ($this->eventDispatcher) { $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', ['repository' => $this]); $preFileDownloadEvent->setTransportOptions($this->options); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $filename = $preFileDownloadEvent->getProcessedUrl(); $options = $preFileDownloadEvent->getTransportOptions(); } if ($lastModifiedTime) { if (isset($options['http']['header'])) { $options['http']['header'] = (array) $options['http']['header']; } $options['http']['header'][] = 'If-Modified-Since: ' . $lastModifiedTime; } $io = $this->io; $url = $this->url; $cache = $this->cache; $degradedMode =& $this->degradedMode; $eventDispatcher = $this->eventDispatcher; /** * @return array|true true if the response was a 304 and the cache is fresh */ $accept = function ($response) use($io, $url, $filename, $cache, $cacheKey, $eventDispatcher) { // package not found is acceptable for a v2 protocol repository if ($response->getStatusCode() === 404) { $this->packagesNotFoundCache[$filename] = \true; return ['packages' => []]; } $json = (string) $response->getBody(); if ($json === '' && $response->getStatusCode() === 304) { $this->freshMetadataUrls[$filename] = \true; return \true; } if ($eventDispatcher) { $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, null, $filename, 'metadata', ['response' => $response, 'repository' => $this]); $eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } $data = $response->decodeJson(); HttpDownloader::outputWarnings($io, $url, $data); $lastModifiedDate = $response->getHeader('last-modified'); $response->collect(); if ($lastModifiedDate) { $data['last-modified'] = $lastModifiedDate; $json = JsonFile::encode($data, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE); } if (!$cache->isReadOnly()) { $cache->write($cacheKey, $json); } $this->freshMetadataUrls[$filename] = \true; return $data; }; $reject = function ($e) use($filename, $accept, $io, $url, &$degradedMode, $lastModifiedTime) { if ($e instanceof TransportException && $e->getStatusCode() === 404) { $this->packagesNotFoundCache[$filename] = \true; return \false; } if (!$degradedMode) { $io->writeError('' . $url . ' could not be fully loaded (' . $e->getMessage() . '), package information was loaded from the local cache and may be out of date'); } $degradedMode = \true; // if the file is in the cache, we fake a 304 Not Modified to allow the process to continue if ($lastModifiedTime) { return $accept(new Response(['url' => $url], 304, [], '')); } // special error code returned when network is being artificially disabled if ($e instanceof TransportException && $e->getStatusCode() === 499) { return $accept(new Response(['url' => $url], 404, [], '')); } throw $e; }; return $httpDownloader->add($filename, $options)->then($accept, $reject); } /** * This initializes the packages key of a partial packages.json that contain some packages inlined + a providers-lazy-url * * This should only be called once */ private function initializePartialPackages() : void { $rootData = $this->loadRootServerFile(); if ($rootData === \true) { return; } $this->partialPackagesByName = []; foreach ($rootData['packages'] as $package => $versions) { foreach ($versions as $version) { $versionPackageName = \strtolower((string) ($version['name'] ?? '')); $this->partialPackagesByName[$versionPackageName][] = $version; if (!$this->displayedWarningAboutNonMatchingPackageIndex && $versionPackageName !== \strtolower($package)) { $this->io->writeError(\sprintf("Warning: the packages key '%s' doesn't match the name defined in the package metadata '%s' in repository %s", $package, $version['name'] ?? '', $this->baseUrl)); $this->displayedWarningAboutNonMatchingPackageIndex = \true; } } } // wipe rootData as it is fully consumed at this point and this saves some memory $this->rootData = \true; } /** * Checks if the package name is present in this lazy providers repo * * @return bool true if the package name is present in availablePackages or matched by availablePackagePatterns */ protected function lazyProvidersRepoContains(string $name) { if (!$this->hasAvailablePackageList) { throw new \LogicException('lazyProvidersRepoContains should not be called unless hasAvailablePackageList is true'); } if (\is_array($this->availablePackages) && isset($this->availablePackages[$name])) { return \true; } if (\is_array($this->availablePackagePatterns)) { foreach ($this->availablePackagePatterns as $providerRegex) { if (Preg::isMatch($providerRegex, $name)) { return \true; } } } return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Builds list of package from PEAR channel. * * Packages read from channel are named as 'pear-{channelName}/{packageName}' * and has aliased as 'pear-{channelAlias}/{packageName}' * * @author Benjamin Eberlei * @author Jordi Boggiano * @deprecated * @private */ class PearRepository extends \Composer\Repository\ArrayRepository { public function __construct() { throw new \InvalidArgumentException('The PEAR repository has been removed from Composer 2.x'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\DependencyResolver\PoolOptimizer; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\PoolBuilder; use Composer\DependencyResolver\Request; use Composer\EventDispatcher\EventDispatcher; use Composer\Advisory\SecurityAdvisory; use Composer\Advisory\PartialSecurityAdvisory; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; use Composer\Package\PackageInterface; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Package\Version\StabilityFilter; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Semver\Constraint\MultiConstraint; /** * @author Nils Adermann * * @see RepositoryUtils for ways to work with single repos */ class RepositorySet { /** * Packages are returned even though their stability does not match the required stability */ public const ALLOW_UNACCEPTABLE_STABILITIES = 1; /** * Packages will be looked up in all repositories, even after they have been found in a higher prio one */ public const ALLOW_SHADOWED_REPOSITORIES = 2; /** * @var array[] * @phpstan-var array> */ private $rootAliases; /** * @var string[] * @phpstan-var array */ private $rootReferences; /** @var RepositoryInterface[] */ private $repositories = []; /** * @var int[] array of stability => BasePackage::STABILITY_* value * @phpstan-var array, BasePackage::STABILITY_*> */ private $acceptableStabilities; /** * @var int[] array of package name => BasePackage::STABILITY_* value * @phpstan-var array */ private $stabilityFlags; /** * @var ConstraintInterface[] * @phpstan-var array */ private $rootRequires; /** * @var array */ private $temporaryConstraints; /** @var bool */ private $locked = \false; /** @var bool */ private $allowInstalledRepositories = \false; /** * In most cases if you are looking to use this class as a way to find packages from repositories * passing minimumStability is all you need to worry about. The rest is for advanced pool creation including * aliases, pinned references and other special cases. * * @param key-of $minimumStability * @param int[] $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array $stabilityFlags * @param array[] $rootAliases * @phpstan-param list $rootAliases * @param string[] $rootReferences an array of package name => source reference * @phpstan-param array $rootReferences * @param ConstraintInterface[] $rootRequires an array of package name => constraint from the root package * @phpstan-param array $rootRequires * @param array $temporaryConstraints Runtime temporary constraints that will be used to filter packages */ public function __construct(string $minimumStability = 'stable', array $stabilityFlags = [], array $rootAliases = [], array $rootReferences = [], array $rootRequires = [], array $temporaryConstraints = []) { $this->rootAliases = self::getRootAliasesPerPackage($rootAliases); $this->rootReferences = $rootReferences; $this->acceptableStabilities = []; foreach (BasePackage::STABILITIES as $stability => $value) { if ($value <= BasePackage::STABILITIES[$minimumStability]) { $this->acceptableStabilities[$stability] = $value; } } $this->stabilityFlags = $stabilityFlags; $this->rootRequires = $rootRequires; foreach ($rootRequires as $name => $constraint) { if (\Composer\Repository\PlatformRepository::isPlatformPackage($name)) { unset($this->rootRequires[$name]); } } $this->temporaryConstraints = $temporaryConstraints; } public function allowInstalledRepositories(bool $allow = \true) : void { $this->allowInstalledRepositories = $allow; } /** * @return ConstraintInterface[] an array of package name => constraint from the root package, platform requirements excluded * @phpstan-return array */ public function getRootRequires() : array { return $this->rootRequires; } /** * @return array Runtime temporary constraints that will be used to filter packages */ public function getTemporaryConstraints() : array { return $this->temporaryConstraints; } /** * Adds a repository to this repository set * * The first repos added have a higher priority. As soon as a package is found in any * repository the search for that package ends, and following repos will not be consulted. * * @param RepositoryInterface $repo A package repository */ public function addRepository(\Composer\Repository\RepositoryInterface $repo) : void { if ($this->locked) { throw new \RuntimeException("Pool has already been created from this repository set, it cannot be modified anymore."); } if ($repo instanceof \Composer\Repository\CompositeRepository) { $repos = $repo->getRepositories(); } else { $repos = [$repo]; } foreach ($repos as $repo) { $this->repositories[] = $repo; } } /** * Find packages providing or matching a name and optionally meeting a constraint in all repositories * * Returned in the order of repositories, matching priority * * @param int $flags any of the ALLOW_* constants from this class to tweak what is returned * @return BasePackage[] */ public function findPackages(string $name, ?ConstraintInterface $constraint = null, int $flags = 0) : array { $ignoreStability = ($flags & self::ALLOW_UNACCEPTABLE_STABILITIES) !== 0; $loadFromAllRepos = ($flags & self::ALLOW_SHADOWED_REPOSITORIES) !== 0; $packages = []; if ($loadFromAllRepos) { foreach ($this->repositories as $repository) { $packages[] = $repository->findPackages($name, $constraint) ?: []; } } else { foreach ($this->repositories as $repository) { $result = $repository->loadPackages([$name => $constraint], $ignoreStability ? BasePackage::STABILITIES : $this->acceptableStabilities, $ignoreStability ? [] : $this->stabilityFlags); $packages[] = $result['packages']; foreach ($result['namesFound'] as $nameFound) { // avoid loading the same package again from other repositories once it has been found if ($name === $nameFound) { break 2; } } } } $candidates = $packages ? \array_merge(...$packages) : []; // when using loadPackages above (!$loadFromAllRepos) the repos already filter for stability so no need to do it again if ($ignoreStability || !$loadFromAllRepos) { return $candidates; } $result = []; foreach ($candidates as $candidate) { if ($this->isPackageAcceptable($candidate->getNames(), $candidate->getStability())) { $result[] = $candidate; } } return $result; } /** * @param string[] $packageNames * @return ($allowPartialAdvisories is true ? array> : array>) */ public function getSecurityAdvisories(array $packageNames, bool $allowPartialAdvisories = \false) : array { $map = []; foreach ($packageNames as $name) { $map[$name] = new MatchAllConstraint(); } return $this->getSecurityAdvisoriesForConstraints($map, $allowPartialAdvisories); } /** * @param PackageInterface[] $packages * @return ($allowPartialAdvisories is true ? array> : array>) */ public function getMatchingSecurityAdvisories(array $packages, bool $allowPartialAdvisories = \false) : array { $map = []; foreach ($packages as $package) { // ignore root alias versions as they are not actual package versions and should not matter when it comes to vulnerabilities if ($package instanceof AliasPackage && $package->isRootPackageAlias()) { continue; } if (isset($map[$package->getName()])) { $map[$package->getName()] = new MultiConstraint([new Constraint('=', $package->getVersion()), $map[$package->getName()]], \false); } else { $map[$package->getName()] = new Constraint('=', $package->getVersion()); } } return $this->getSecurityAdvisoriesForConstraints($map, $allowPartialAdvisories); } /** * @param array $packageConstraintMap * @return ($allowPartialAdvisories is true ? array> : array>) */ private function getSecurityAdvisoriesForConstraints(array $packageConstraintMap, bool $allowPartialAdvisories) : array { $repoAdvisories = []; foreach ($this->repositories as $repository) { if (!$repository instanceof \Composer\Repository\AdvisoryProviderInterface || !$repository->hasSecurityAdvisories()) { continue; } $repoAdvisories[] = $repository->getSecurityAdvisories($packageConstraintMap, $allowPartialAdvisories)['advisories']; } $advisories = \array_merge_recursive([], ...$repoAdvisories); \ksort($advisories); return $advisories; } /** * @return array[] an array with the provider name as key and value of array('name' => '...', 'description' => '...', 'type' => '...') * @phpstan-return array */ public function getProviders(string $packageName) : array { $providers = []; foreach ($this->repositories as $repository) { if ($repoProviders = $repository->getProviders($packageName)) { $providers = \array_merge($providers, $repoProviders); } } return $providers; } /** * Check for each given package name whether it would be accepted by this RepositorySet in the given $stability * * @param string[] $names * @param key-of $stability one of 'stable', 'RC', 'beta', 'alpha' or 'dev' */ public function isPackageAcceptable(array $names, string $stability) : bool { return StabilityFilter::isPackageAcceptable($this->acceptableStabilities, $this->stabilityFlags, $names, $stability); } /** * Create a pool for dependency resolution from the packages in this repository set. * * @param list $ignoredTypes Packages of those types are ignored * @param list|null $allowedTypes Only packages of those types are allowed if set to non-null */ public function createPool(Request $request, IOInterface $io, ?EventDispatcher $eventDispatcher = null, ?PoolOptimizer $poolOptimizer = null, array $ignoredTypes = [], ?array $allowedTypes = null) : Pool { $poolBuilder = new PoolBuilder($this->acceptableStabilities, $this->stabilityFlags, $this->rootAliases, $this->rootReferences, $io, $eventDispatcher, $poolOptimizer, $this->temporaryConstraints); $poolBuilder->setIgnoredTypes($ignoredTypes); $poolBuilder->setAllowedTypes($allowedTypes); foreach ($this->repositories as $repo) { if (($repo instanceof \Composer\Repository\InstalledRepositoryInterface || $repo instanceof \Composer\Repository\InstalledRepository) && !$this->allowInstalledRepositories) { throw new \LogicException('The pool can not accept packages from an installed repository'); } } $this->locked = \true; return $poolBuilder->buildPool($this->repositories, $request); } /** * Create a pool for dependency resolution from the packages in this repository set. */ public function createPoolWithAllPackages() : Pool { foreach ($this->repositories as $repo) { if (($repo instanceof \Composer\Repository\InstalledRepositoryInterface || $repo instanceof \Composer\Repository\InstalledRepository) && !$this->allowInstalledRepositories) { throw new \LogicException('The pool can not accept packages from an installed repository'); } } $this->locked = \true; $packages = []; foreach ($this->repositories as $repository) { foreach ($repository->getPackages() as $package) { $packages[] = $package; if (isset($this->rootAliases[$package->getName()][$package->getVersion()])) { $alias = $this->rootAliases[$package->getName()][$package->getVersion()]; while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } if ($package instanceof CompletePackage) { $aliasPackage = new CompleteAliasPackage($package, $alias['alias_normalized'], $alias['alias']); } else { $aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias']); } $aliasPackage->setRootPackageAlias(\true); $packages[] = $aliasPackage; } } } return new Pool($packages); } public function createPoolForPackage(string $packageName, ?\Composer\Repository\LockArrayRepository $lockedRepo = null) : Pool { // TODO unify this with above in some simpler version without "request"? return $this->createPoolForPackages([$packageName], $lockedRepo); } /** * @param string[] $packageNames */ public function createPoolForPackages(array $packageNames, ?\Composer\Repository\LockArrayRepository $lockedRepo = null) : Pool { $request = new Request($lockedRepo); $allowedPackages = []; foreach ($packageNames as $packageName) { if (\Composer\Repository\PlatformRepository::isPlatformPackage($packageName)) { throw new \LogicException('createPoolForPackage(s) can not be used for platform packages, as they are never loaded by the PoolBuilder which expects them to be fixed. Use createPoolWithAllPackages or pass in a proper request with the platform packages you need fixed in it.'); } $request->requireName($packageName); $allowedPackages[] = \strtolower($packageName); } if (\count($allowedPackages) > 0) { $request->restrictPackages($allowedPackages); } return $this->createPool($request, new NullIO()); } /** * @param array[] $aliases * @phpstan-param list $aliases * * @return array> */ private static function getRootAliasesPerPackage(array $aliases) : array { $normalizedAliases = []; foreach ($aliases as $alias) { $normalizedAliases[$alias['package']][$alias['version']] = ['alias' => $alias['alias'], 'alias_normalized' => $alias['alias_normalized']]; } return $normalizedAliases; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\LoaderInterface; use Composer\Util\Platform; use Composer\Util\Tar; use Composer\Util\Zip; /** * @author Serge Smertin */ class ArtifactRepository extends \Composer\Repository\ArrayRepository implements \Composer\Repository\ConfigurableRepositoryInterface { /** @var LoaderInterface */ protected $loader; /** @var string */ protected $lookup; /** @var array{url: string} */ protected $repoConfig; /** @var IOInterface */ private $io; /** * @param array{url: string} $repoConfig */ public function __construct(array $repoConfig, IOInterface $io) { parent::__construct(); if (!\extension_loaded('zip')) { throw new \RuntimeException('The artifact repository requires PHP\'s zip extension'); } $this->loader = new ArrayLoader(); $this->lookup = Platform::expandPath($repoConfig['url']); $this->io = $io; $this->repoConfig = $repoConfig; } public function getRepoName() { return 'artifact repo (' . $this->lookup . ')'; } public function getRepoConfig() { return $this->repoConfig; } protected function initialize() { parent::initialize(); $this->scanDirectory($this->lookup); } private function scanDirectory(string $path) : void { $io = $this->io; $directory = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS); $iterator = new \RecursiveIteratorIterator($directory); $regex = new \RegexIterator($iterator, '/^.+\\.(zip|tar|gz|tgz)$/i'); foreach ($regex as $file) { /* @var $file \SplFileInfo */ if (!$file->isFile()) { continue; } $package = $this->getComposerInformation($file); if (!$package) { $io->writeError("File {$file->getBasename()} doesn't seem to hold a package", \true, IOInterface::VERBOSE); continue; } $template = 'Found package %s (%s) in file %s'; $io->writeError(\sprintf($template, $package->getName(), $package->getPrettyVersion(), $file->getBasename()), \true, IOInterface::VERBOSE); $this->addPackage($package); } } /** * @return ?BasePackage */ private function getComposerInformation(\SplFileInfo $file) : ?BasePackage { $json = null; $fileType = null; $fileExtension = \pathinfo($file->getPathname(), \PATHINFO_EXTENSION); if (\in_array($fileExtension, ['gz', 'tar', 'tgz'], \true)) { $fileType = 'tar'; } elseif ($fileExtension === 'zip') { $fileType = 'zip'; } else { throw new \RuntimeException('Files with "' . $fileExtension . '" extensions aren\'t supported. Only ZIP and TAR/TAR.GZ/TGZ archives are supported.'); } try { if ($fileType === 'tar') { $json = Tar::getComposerJson($file->getPathname()); } else { $json = Zip::getComposerJson($file->getPathname()); } } catch (\Exception $exception) { $this->io->write('Failed loading package ' . $file->getPathname() . ': ' . $exception->getMessage(), \false, IOInterface::VERBOSE); } if (null === $json) { return null; } $package = JsonFile::parseJson($json, $file->getPathname() . '#composer.json'); $package['dist'] = ['type' => $fileType, 'url' => \strtr($file->getPathname(), '\\', '/'), 'shasum' => \hash_file('sha1', $file->getRealPath())]; try { $package = $this->loader->load($package); } catch (\UnexpectedValueException $e) { throw new \UnexpectedValueException('Failed loading package in ' . $file . ': ' . $e->getMessage(), 0, $e); } return $package; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\RootPackageInterface; /** * Root package repository. * * This is used for serving the RootPackage inside an in-memory InstalledRepository * * @author Jordi Boggiano */ class RootPackageRepository extends \Composer\Repository\ArrayRepository { public function __construct(RootPackageInterface $package) { parent::__construct([$package]); } public function getRepoName() : string { return 'root package repo'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\IO\IOInterface; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\PackageInterface; use Composer\Util\HttpDownloader; use Composer\Util\ProcessExecutor; /** * Repositories manager. * * @author Jordi Boggiano * @author Konstantin Kudryashov * @author François Pluchino */ class RepositoryManager { /** @var InstalledRepositoryInterface */ private $localRepository; /** @var list */ private $repositories = []; /** @var array> */ private $repositoryClasses = []; /** @var IOInterface */ private $io; /** @var Config */ private $config; /** @var HttpDownloader */ private $httpDownloader; /** @var ?EventDispatcher */ private $eventDispatcher; /** @var ProcessExecutor */ private $process; public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $eventDispatcher = null, ?ProcessExecutor $process = null) { $this->io = $io; $this->config = $config; $this->httpDownloader = $httpDownloader; $this->eventDispatcher = $eventDispatcher; $this->process = $process ?? new ProcessExecutor($io); } /** * Searches for a package by its name and version in managed repositories. * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against */ public function findPackage(string $name, $constraint) : ?PackageInterface { foreach ($this->repositories as $repository) { /** @var RepositoryInterface $repository */ if ($package = $repository->findPackage($name, $constraint)) { return $package; } } return null; } /** * Searches for all packages matching a name and optionally a version in managed repositories. * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against * * @return PackageInterface[] */ public function findPackages(string $name, $constraint) : array { $packages = []; foreach ($this->getRepositories() as $repository) { $packages = \array_merge($packages, $repository->findPackages($name, $constraint)); } return $packages; } /** * Adds repository * * @param RepositoryInterface $repository repository instance */ public function addRepository(\Composer\Repository\RepositoryInterface $repository) : void { $this->repositories[] = $repository; } /** * Adds a repository to the beginning of the chain * * This is useful when injecting additional repositories that should trump Packagist, e.g. from a plugin. * * @param RepositoryInterface $repository repository instance */ public function prependRepository(\Composer\Repository\RepositoryInterface $repository) : void { \array_unshift($this->repositories, $repository); } /** * Returns a new repository for a specific installation type. * * @param string $type repository type * @param array $config repository configuration * @param string $name repository name * @throws \InvalidArgumentException if repository for provided type is not registered */ public function createRepository(string $type, array $config, ?string $name = null) : \Composer\Repository\RepositoryInterface { if (!isset($this->repositoryClasses[$type])) { throw new \InvalidArgumentException('Repository type is not registered: ' . $type); } if (isset($config['packagist']) && \false === $config['packagist']) { $this->io->writeError('Repository "' . $name . '" (' . \json_encode($config) . ') has a packagist key which should be in its own repository definition'); } $class = $this->repositoryClasses[$type]; if (isset($config['only']) || isset($config['exclude']) || isset($config['canonical'])) { $filterConfig = $config; unset($config['only'], $config['exclude'], $config['canonical']); } $repository = new $class($config, $this->io, $this->config, $this->httpDownloader, $this->eventDispatcher, $this->process); if (isset($filterConfig)) { $repository = new \Composer\Repository\FilterRepository($repository, $filterConfig); } return $repository; } /** * Stores repository class for a specific installation type. * * @param string $type installation type * @param class-string $class class name of the repo implementation */ public function setRepositoryClass(string $type, $class) : void { $this->repositoryClasses[$type] = $class; } /** * Returns all repositories, except local one. * * @return RepositoryInterface[] */ public function getRepositories() : array { return $this->repositories; } /** * Sets local repository for the project. * * @param InstalledRepositoryInterface $repository repository instance */ public function setLocalRepository(\Composer\Repository\InstalledRepositoryInterface $repository) : void { $this->localRepository = $repository; } /** * Returns local repository for the project. */ public function getLocalRepository() : \Composer\Repository\InstalledRepositoryInterface { return $this->localRepository; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Downloader\TransportException; use Composer\Json\JsonFile; use Composer\Cache; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\GitHub; use Composer\Util\Http\Response; /** * @author Jordi Boggiano */ class GitHubDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var string */ protected $owner; /** @var string */ protected $repository; /** @var array Map of tag name to identifier */ protected $tags; /** @var array Map of branch name to identifier */ protected $branches; /** @var string */ protected $rootIdentifier; /** @var mixed[] */ protected $repoData; /** @var bool */ protected $hasIssues = \false; /** @var bool */ protected $isPrivate = \false; /** @var bool */ private $isArchived = \false; /** @var array|false|null */ private $fundingInfo; /** * Git Driver * * @var ?GitDriver */ protected $gitDriver = null; /** * @inheritDoc */ public function initialize() : void { if (!Preg::isMatch('#^(?:(?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/([^/]+?)(?:\\.git|/)?$#', $this->url, $match)) { throw new \InvalidArgumentException(\sprintf('The GitHub repository URL %s is invalid.', $this->url)); } $this->owner = $match[3]; $this->repository = $match[4]; $this->originUrl = \strtolower($match[1] ?? (string) $match[2]); if ($this->originUrl === 'www.github.com') { $this->originUrl = 'github.com'; } $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir') . '/' . $this->originUrl . '/' . $this->owner . '/' . $this->repository); $this->cache->setReadOnly($this->config->get('cache-read-only')); if ($this->config->get('use-github-api') === \false || isset($this->repoConfig['no-api']) && $this->repoConfig['no-api']) { $this->setupGitDriver($this->url); return; } $this->fetchRootIdentifier(); } public function getRepositoryUrl() : string { return 'https://' . $this->originUrl . '/' . $this->owner . '/' . $this->repository; } /** * @inheritDoc */ public function getRootIdentifier() : string { if ($this->gitDriver) { return $this->gitDriver->getRootIdentifier(); } return $this->rootIdentifier; } /** * @inheritDoc */ public function getUrl() : string { if ($this->gitDriver) { return $this->gitDriver->getUrl(); } return 'https://' . $this->originUrl . '/' . $this->owner . '/' . $this->repository . '.git'; } protected function getApiUrl() : string { if ('github.com' === $this->originUrl) { $apiUrl = 'api.github.com'; } else { $apiUrl = $this->originUrl . '/api/v3'; } return 'https://' . $apiUrl; } /** * @inheritDoc */ public function getSource(string $identifier) : array { if ($this->gitDriver) { return $this->gitDriver->getSource($identifier); } if ($this->isPrivate) { // Private GitHub repositories should be accessed using the // SSH version of the URL. $url = $this->generateSshUrl(); } else { $url = $this->getUrl(); } return ['type' => 'git', 'url' => $url, 'reference' => $identifier]; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { $url = $this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository . '/zipball/' . $identifier; return ['type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => '']; } /** * @inheritDoc */ public function getComposerInformation(string $identifier) : ?array { if ($this->gitDriver) { return $this->gitDriver->getComposerInformation($identifier); } if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && ($res = $this->cache->read($identifier))) { $composer = JsonFile::parseJson($res); } else { $composer = $this->getBaseComposerInformation($identifier); if ($this->shouldCache($identifier)) { $this->cache->write($identifier, \json_encode($composer)); } } if ($composer !== null) { // specials for github if (isset($composer['support']) && !\is_array($composer['support'])) { $composer['support'] = []; } if (!isset($composer['support']['source'])) { $label = (\array_search($identifier, $this->getTags()) ?: \array_search($identifier, $this->getBranches())) ?: $identifier; $composer['support']['source'] = \sprintf('https://%s/%s/%s/tree/%s', $this->originUrl, $this->owner, $this->repository, $label); } if (!isset($composer['support']['issues']) && $this->hasIssues) { $composer['support']['issues'] = \sprintf('https://%s/%s/%s/issues', $this->originUrl, $this->owner, $this->repository); } if (!isset($composer['abandoned']) && $this->isArchived) { $composer['abandoned'] = \true; } if (!isset($composer['funding']) && ($funding = $this->getFundingInfo())) { $composer['funding'] = $funding; } } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } /** * @return array|false */ private function getFundingInfo() { if (null !== $this->fundingInfo) { return $this->fundingInfo; } if ($this->originUrl !== 'github.com') { return $this->fundingInfo = \false; } foreach ([$this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository . '/contents/.github/FUNDING.yml', $this->getApiUrl() . '/repos/' . $this->owner . '/.github/contents/FUNDING.yml'] as $file) { try { $response = $this->httpDownloader->get($file, ['retry-auth-failure' => \false])->decodeJson(); } catch (TransportException $e) { continue; } if (empty($response['content']) || $response['encoding'] !== 'base64' || !($funding = \base64_decode($response['content']))) { continue; } break; } if (empty($funding)) { return $this->fundingInfo = \false; } $result = []; $key = null; foreach (Preg::split('{\\r?\\n}', $funding) as $line) { $line = \trim($line); if (Preg::isMatchStrictGroups('{^(\\w+)\\s*:\\s*(.+)$}', $line, $match)) { if ($match[2] === '[') { $key = $match[1]; continue; } if (Preg::isMatchStrictGroups('{^\\[(.*?)\\](?:\\s*#.*)?$}', $match[2], $match2)) { foreach (\array_map('trim', Preg::split('{[\'"]?\\s*,\\s*[\'"]?}', $match2[1])) as $item) { $result[] = ['type' => $match[1], 'url' => \trim($item, '"\' ')]; } } elseif (Preg::isMatchStrictGroups('{^([^#].*?)(?:\\s+#.*)?$}', $match[2], $match2)) { $result[] = ['type' => $match[1], 'url' => \trim($match2[1], '"\' ')]; } $key = null; } elseif (Preg::isMatchStrictGroups('{^(\\w+)\\s*:\\s*#\\s*$}', $line, $match)) { $key = $match[1]; } elseif ($key !== null && (Preg::isMatchStrictGroups('{^-\\s*(.+)(?:\\s+#.*)?$}', $line, $match) || Preg::isMatchStrictGroups('{^(.+),(?:\\s*#.*)?$}', $line, $match))) { $result[] = ['type' => $key, 'url' => \trim($match[1], '"\' ')]; } elseif ($key !== null && $line === ']') { $key = null; } } foreach ($result as $key => $item) { switch ($item['type']) { case 'community_bridge': $result[$key]['url'] = 'https://funding.communitybridge.org/projects/' . \basename($item['url']); break; case 'github': $result[$key]['url'] = 'https://github.com/' . \basename($item['url']); break; case 'issuehunt': $result[$key]['url'] = 'https://issuehunt.io/r/' . $item['url']; break; case 'ko_fi': $result[$key]['url'] = 'https://ko-fi.com/' . \basename($item['url']); break; case 'liberapay': $result[$key]['url'] = 'https://liberapay.com/' . \basename($item['url']); break; case 'open_collective': $result[$key]['url'] = 'https://opencollective.com/' . \basename($item['url']); break; case 'patreon': $result[$key]['url'] = 'https://www.patreon.com/' . \basename($item['url']); break; case 'tidelift': $result[$key]['url'] = 'https://tidelift.com/funding/github/' . $item['url']; break; case 'polar': $result[$key]['url'] = 'https://polar.sh/' . \basename($item['url']); break; case 'buy_me_a_coffee': $result[$key]['url'] = 'https://www.buymeacoffee.com/' . \basename($item['url']); break; case 'thanks_dev': $result[$key]['url'] = 'https://thanks.dev/' . $item['url']; break; case 'otechie': $result[$key]['url'] = 'https://otechie.com/' . \basename($item['url']); break; case 'custom': $bits = \parse_url($item['url']); if ($bits === \false) { unset($result[$key]); break; } if (!\array_key_exists('scheme', $bits) && !\array_key_exists('host', $bits)) { if (Preg::isMatch('{^[a-z0-9-]++\\.[a-z]{2,3}$}', $item['url'])) { $result[$key]['url'] = 'https://' . $item['url']; break; } $this->io->writeError('Funding URL ' . $item['url'] . ' not in a supported format.'); unset($result[$key]); break; } break; } } return $this->fundingInfo = $result; } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { if ($this->gitDriver) { return $this->gitDriver->getFileContent($file, $identifier); } $resource = $this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository . '/contents/' . $file . '?ref=' . \urlencode($identifier); $resource = $this->getContents($resource)->decodeJson(); // The GitHub contents API only returns files up to 1MB as base64 encoded files // larger files either need be fetched with a raw accept header or by using the git blob endpoint if ((!isset($resource['content']) || $resource['content'] === '') && $resource['encoding'] === 'none' && isset($resource['git_url'])) { $resource = $this->getContents($resource['git_url'])->decodeJson(); } if (!isset($resource['content']) || $resource['encoding'] !== 'base64' || \false === ($content = \base64_decode($resource['content']))) { throw new \RuntimeException('Could not retrieve ' . $file . ' for ' . $identifier); } return $content; } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { if ($this->gitDriver) { return $this->gitDriver->getChangeDate($identifier); } $resource = $this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository . '/commits/' . \urlencode($identifier); $commit = $this->getContents($resource)->decodeJson(); return new \DateTimeImmutable($commit['commit']['committer']['date']); } /** * @inheritDoc */ public function getTags() : array { if ($this->gitDriver) { return $this->gitDriver->getTags(); } if (null === $this->tags) { $tags = []; $resource = $this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository . '/tags?per_page=100'; do { $response = $this->getContents($resource); $tagsData = $response->decodeJson(); foreach ($tagsData as $tag) { $tags[$tag['name']] = $tag['commit']['sha']; } $resource = $this->getNextPage($response); } while ($resource); $this->tags = $tags; } return $this->tags; } /** * @inheritDoc */ public function getBranches() : array { if ($this->gitDriver) { return $this->gitDriver->getBranches(); } if (null === $this->branches) { $branches = []; $resource = $this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository . '/git/refs/heads?per_page=100'; do { $response = $this->getContents($resource); $branchData = $response->decodeJson(); foreach ($branchData as $branch) { $name = \substr($branch['ref'], 11); if ($name !== 'gh-pages') { $branches[$name] = $branch['object']['sha']; } } $resource = $this->getNextPage($response); } while ($resource); $this->branches = $branches; } return $this->branches; } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if (!Preg::isMatch('#^((?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/([^/]+?)(?:\\.git|/)?$#', $url, $matches)) { return \false; } $originUrl = $matches[2] ?? (string) $matches[3]; if (!\in_array(\strtolower(Preg::replace('{^www\\.}i', '', $originUrl)), $config->get('github-domains'))) { return \false; } if (!\extension_loaded('openssl')) { $io->writeError('Skipping GitHub driver for ' . $url . ' because the OpenSSL PHP extension is missing.', \true, IOInterface::VERBOSE); return \false; } return \true; } /** * Gives back the loaded /repos// result * * @return mixed[]|null */ public function getRepoData() : ?array { $this->fetchRootIdentifier(); return $this->repoData; } /** * Generate an SSH URL */ protected function generateSshUrl() : string { if (\false !== \strpos($this->originUrl, ':')) { return 'ssh://git@' . $this->originUrl . '/' . $this->owner . '/' . $this->repository . '.git'; } return 'git@' . $this->originUrl . ':' . $this->owner . '/' . $this->repository . '.git'; } /** * @inheritDoc */ protected function getContents(string $url, bool $fetchingRepoData = \false) : Response { try { return parent::getContents($url); } catch (TransportException $e) { $gitHubUtil = new GitHub($this->io, $this->config, $this->process, $this->httpDownloader); switch ($e->getCode()) { case 401: case 404: // try to authorize only if we are fetching the main /repos/foo/bar data, otherwise it must be a real 404 if (!$fetchingRepoData) { throw $e; } if ($gitHubUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive()) { $this->attemptCloneFallback(); return new Response(['url' => 'dummy'], 200, [], 'null'); } $scopesIssued = []; $scopesNeeded = []; if ($headers = $e->getHeaders()) { if ($scopes = Response::findHeaderValue($headers, 'X-OAuth-Scopes')) { $scopesIssued = \explode(' ', $scopes); } if ($scopes = Response::findHeaderValue($headers, 'X-Accepted-OAuth-Scopes')) { $scopesNeeded = \explode(' ', $scopes); } } $scopesFailed = \array_diff($scopesNeeded, $scopesIssued); // non-authenticated requests get no scopesNeeded, so ask for credentials // authenticated requests which failed some scopes should ask for new credentials too if (!$headers || !\count($scopesNeeded) || \count($scopesFailed)) { $gitHubUtil->authorizeOAuthInteractively($this->originUrl, 'Your GitHub credentials are required to fetch private repository metadata (' . $this->url . ')'); } return parent::getContents($url); case 403: if (!$this->io->hasAuthentication($this->originUrl) && $gitHubUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive() && $fetchingRepoData) { $this->attemptCloneFallback(); return new Response(['url' => 'dummy'], 200, [], 'null'); } $rateLimited = $gitHubUtil->isRateLimited((array) $e->getHeaders()); if (!$this->io->hasAuthentication($this->originUrl)) { if (!$this->io->isInteractive()) { $this->io->writeError('GitHub API limit exhausted. Failed to get metadata for the ' . $this->url . ' repository, try running in interactive mode so that you can enter your GitHub credentials to increase the API limit'); throw $e; } $gitHubUtil->authorizeOAuthInteractively($this->originUrl, 'API limit exhausted. Enter your GitHub credentials to get a larger API limit (' . $this->url . ')'); return parent::getContents($url); } if ($rateLimited) { $rateLimit = $gitHubUtil->getRateLimit($e->getHeaders()); $this->io->writeError(\sprintf('GitHub API limit (%d calls/hr) is exhausted. You are already authorized so you have to wait until %s before doing more requests', $rateLimit['limit'], $rateLimit['reset'])); } throw $e; default: throw $e; } } } /** * Fetch root identifier from GitHub * * @throws TransportException */ protected function fetchRootIdentifier() : void { if ($this->repoData) { return; } $repoDataUrl = $this->getApiUrl() . '/repos/' . $this->owner . '/' . $this->repository; try { $this->repoData = $this->getContents($repoDataUrl, \true)->decodeJson(); } catch (TransportException $e) { if ($e->getCode() === 499) { $this->attemptCloneFallback(); } else { throw $e; } } if (null === $this->repoData && null !== $this->gitDriver) { return; } $this->owner = $this->repoData['owner']['login']; $this->repository = $this->repoData['name']; $this->isPrivate = !empty($this->repoData['private']); if (isset($this->repoData['default_branch'])) { $this->rootIdentifier = $this->repoData['default_branch']; } elseif (isset($this->repoData['master_branch'])) { $this->rootIdentifier = $this->repoData['master_branch']; } else { $this->rootIdentifier = 'master'; } $this->hasIssues = !empty($this->repoData['has_issues']); $this->isArchived = !empty($this->repoData['archived']); } /** * @phpstan-impure * * @return true * @throws \RuntimeException */ protected function attemptCloneFallback() : bool { $this->isPrivate = \true; try { // If this repository may be private (hard to say for sure, // GitHub returns 404 for private repositories) and we // cannot ask for authentication credentials (because we // are not interactive) then we fallback to GitDriver. $this->setupGitDriver($this->generateSshUrl()); return \true; } catch (\RuntimeException $e) { $this->gitDriver = null; $this->io->writeError('Failed to clone the ' . $this->generateSshUrl() . ' repository, try running in interactive mode so that you can enter your GitHub credentials'); throw $e; } } protected function setupGitDriver(string $url) : void { $this->gitDriver = new \Composer\Repository\Vcs\GitDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $this->gitDriver->initialize(); } protected function getNextPage(Response $response) : ?string { $header = $response->getHeader('link'); if (!$header) { return null; } $links = \explode(',', $header); foreach ($links as $link) { if (Preg::isMatch('{<(.+?)>; *rel="next"}', $link, $match)) { return $match[1]; } } return null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Downloader\TransportException; use Composer\Config; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use Composer\Util\HttpDownloader; use Composer\Util\Filesystem; use Composer\Util\Http\Response; /** * A driver implementation for driver with authentication interaction. * * @author François Pluchino */ abstract class VcsDriver implements \Composer\Repository\Vcs\VcsDriverInterface { /** @var string */ protected $url; /** @var string */ protected $originUrl; /** @var array */ protected $repoConfig; /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var HttpDownloader */ protected $httpDownloader; /** @var array */ protected $infoCache = []; /** @var ?Cache */ protected $cache; /** * Constructor. * * @param array{url: string}&array $repoConfig The repository configuration * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking * @param ProcessExecutor $process Process instance, injectable for mocking */ public final function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, ProcessExecutor $process) { if (Filesystem::isLocalPath($repoConfig['url'])) { $repoConfig['url'] = Filesystem::getPlatformPath($repoConfig['url']); } $this->url = $repoConfig['url']; $this->originUrl = $repoConfig['url']; $this->repoConfig = $repoConfig; $this->io = $io; $this->config = $config; $this->httpDownloader = $httpDownloader; $this->process = $process; } /** * Returns whether or not the given $identifier should be cached or not. */ protected function shouldCache(string $identifier) : bool { return $this->cache && Preg::isMatch('{^[a-f0-9]{40}$}iD', $identifier); } /** * @inheritDoc */ public function getComposerInformation(string $identifier) : ?array { if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && ($res = $this->cache->read($identifier))) { return $this->infoCache[$identifier] = JsonFile::parseJson($res); } $composer = $this->getBaseComposerInformation($identifier); if ($this->shouldCache($identifier)) { $this->cache->write($identifier, JsonFile::encode($composer, 0)); } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } /** * @return array|null */ protected function getBaseComposerInformation(string $identifier) : ?array { $composerFileContent = $this->getFileContent('composer.json', $identifier); if (!$composerFileContent) { return null; } $composer = JsonFile::parseJson($composerFileContent, $identifier . ':composer.json'); if ([] === $composer || !\is_array($composer)) { return null; } if (empty($composer['time']) && null !== ($changeDate = $this->getChangeDate($identifier))) { $composer['time'] = $changeDate->format(\DATE_RFC3339); } return $composer; } /** * @inheritDoc */ public function hasComposerFile(string $identifier) : bool { try { return null !== $this->getComposerInformation($identifier); } catch (TransportException $e) { } return \false; } /** * Get the https or http protocol depending on SSL support. * * Call this only if you know that the server supports both. * * @return string The correct type of protocol */ protected function getScheme() : string { if (\extension_loaded('openssl')) { return 'https'; } return 'http'; } /** * Get the remote content. * * @param string $url The URL of content * * @throws TransportException */ protected function getContents(string $url) : Response { $options = $this->repoConfig['options'] ?? []; return $this->httpDownloader->get($url, $options); } /** * @inheritDoc */ public function cleanup() : void { } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Config; use Composer\Json\JsonFile; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\Util\Url; use Composer\Util\Svn as SvnUtil; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; /** * @author Jordi Boggiano * @author Till Klampaeckel */ class SvnDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var string */ protected $baseUrl; /** @var array Map of tag name to identifier */ protected $tags; /** @var array Map of branch name to identifier */ protected $branches; /** @var ?string */ protected $rootIdentifier; /** @var string|false */ protected $trunkPath = 'trunk'; /** @var string */ protected $branchesPath = 'branches'; /** @var string */ protected $tagsPath = 'tags'; /** @var string */ protected $packagePath = ''; /** @var bool */ protected $cacheCredentials = \true; /** * @var \Composer\Util\Svn */ private $util; /** * @inheritDoc */ public function initialize() : void { $this->url = $this->baseUrl = \rtrim(self::normalizeUrl($this->url), '/'); SvnUtil::cleanEnv(); if (isset($this->repoConfig['trunk-path'])) { $this->trunkPath = $this->repoConfig['trunk-path']; } if (isset($this->repoConfig['branches-path'])) { $this->branchesPath = $this->repoConfig['branches-path']; } if (isset($this->repoConfig['tags-path'])) { $this->tagsPath = $this->repoConfig['tags-path']; } if (\array_key_exists('svn-cache-credentials', $this->repoConfig)) { $this->cacheCredentials = (bool) $this->repoConfig['svn-cache-credentials']; } if (isset($this->repoConfig['package-path'])) { $this->packagePath = '/' . \trim($this->repoConfig['package-path'], '/'); } if (\false !== ($pos = \strrpos($this->url, '/' . $this->trunkPath))) { $this->baseUrl = \substr($this->url, 0, $pos); } $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($this->baseUrl))); $this->cache->setReadOnly($this->config->get('cache-read-only')); $this->getBranches(); $this->getTags(); } /** * @inheritDoc */ public function getRootIdentifier() : string { return $this->rootIdentifier ?: $this->trunkPath; } /** * @inheritDoc */ public function getUrl() : string { return $this->url; } /** * @inheritDoc */ public function getSource(string $identifier) : array { return ['type' => 'svn', 'url' => $this->baseUrl, 'reference' => $identifier]; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { return null; } /** * @inheritDoc */ protected function shouldCache(string $identifier) : bool { return $this->cache && Preg::isMatch('{@\\d+$}', $identifier); } /** * @inheritDoc */ public function getComposerInformation(string $identifier) : ?array { if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && ($res = $this->cache->read($identifier . '.json'))) { // old cache files had '' stored instead of null due to af3783b5f40bae32a23e353eaf0a00c9b8ce82e2, so we make sure here that we always return null or array // and fix outdated invalid cache files if ($res === '""') { $res = 'null'; $this->cache->write($identifier . '.json', \json_encode(null)); } return $this->infoCache[$identifier] = JsonFile::parseJson($res); } try { $composer = $this->getBaseComposerInformation($identifier); } catch (TransportException $e) { $message = $e->getMessage(); if (\stripos($message, 'path not found') === \false && \stripos($message, 'svn: warning: W160013') === \false) { throw $e; } // remember a not-existent composer.json $composer = null; } if ($this->shouldCache($identifier)) { $this->cache->write($identifier . '.json', \json_encode($composer)); } $this->infoCache[$identifier] = $composer; } // old cache files had '' stored instead of null due to af3783b5f40bae32a23e353eaf0a00c9b8ce82e2, so we make sure here that we always return null or array if (!\is_array($this->infoCache[$identifier])) { return null; } return $this->infoCache[$identifier]; } public function getFileContent(string $file, string $identifier) : ?string { $identifier = '/' . \trim($identifier, '/') . '/'; if (Preg::isMatch('{^(.+?)(@\\d+)?/$}', $identifier, $match) && $match[2] !== null) { $path = $match[1]; $rev = $match[2]; } else { $path = $identifier; $rev = ''; } try { $resource = $path . $file; $output = $this->execute(['svn', 'cat'], $this->baseUrl . $resource . $rev); if ('' === \trim($output)) { return null; } } catch (\RuntimeException $e) { throw new TransportException($e->getMessage()); } return $output; } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { $identifier = '/' . \trim($identifier, '/') . '/'; if (Preg::isMatch('{^(.+?)(@\\d+)?/$}', $identifier, $match) && null !== $match[2]) { $path = $match[1]; $rev = $match[2]; } else { $path = $identifier; $rev = ''; } $output = $this->execute(['svn', 'info'], $this->baseUrl . $path . $rev); foreach ($this->process->splitLines($output) as $line) { if ($line !== '' && Preg::isMatchStrictGroups('{^Last Changed Date: ([^(]+)}', $line, $match)) { return new \DateTimeImmutable($match[1], new \DateTimeZone('UTC')); } } return null; } /** * @inheritDoc */ public function getTags() : array { if (null === $this->tags) { $tags = []; if ($this->tagsPath !== \false) { $output = $this->execute(['svn', 'ls', '--verbose'], $this->baseUrl . '/' . $this->tagsPath); if ($output !== '') { $lastRev = 0; foreach ($this->process->splitLines($output) as $line) { $line = \trim($line); if ($line !== '' && Preg::isMatch('{^\\s*(\\S+).*?(\\S+)\\s*$}', $line, $match)) { if ($match[2] === './') { $lastRev = (int) $match[1]; } else { $tags[\rtrim($match[2], '/')] = $this->buildIdentifier('/' . $this->tagsPath . '/' . $match[2], \max($lastRev, (int) $match[1])); } } } } } $this->tags = $tags; } return $this->tags; } /** * @inheritDoc */ public function getBranches() : array { if (null === $this->branches) { $branches = []; if (\false === $this->trunkPath) { $trunkParent = $this->baseUrl . '/'; } else { $trunkParent = $this->baseUrl . '/' . $this->trunkPath; } $output = $this->execute(['svn', 'ls', '--verbose'], $trunkParent); if ($output !== '') { foreach ($this->process->splitLines($output) as $line) { $line = \trim($line); if ($line !== '' && Preg::isMatch('{^\\s*(\\S+).*?(\\S+)\\s*$}', $line, $match)) { if ($match[2] === './') { $branches['trunk'] = $this->buildIdentifier('/' . $this->trunkPath, (int) $match[1]); $this->rootIdentifier = $branches['trunk']; break; } } } } unset($output); if ($this->branchesPath !== \false) { $output = $this->execute(['svn', 'ls', '--verbose'], $this->baseUrl . '/' . $this->branchesPath); if ($output !== '') { $lastRev = 0; foreach ($this->process->splitLines(\trim($output)) as $line) { $line = \trim($line); if ($line !== '' && Preg::isMatch('{^\\s*(\\S+).*?(\\S+)\\s*$}', $line, $match)) { if ($match[2] === './') { $lastRev = (int) $match[1]; } else { $branches[\rtrim($match[2], '/')] = $this->buildIdentifier('/' . $this->branchesPath . '/' . $match[2], \max($lastRev, (int) $match[1])); } } } } } $this->branches = $branches; } return $this->branches; } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { $url = self::normalizeUrl($url); if (Preg::isMatch('#(^svn://|^svn\\+ssh://|svn\\.)#i', $url)) { return \true; } // proceed with deep check for local urls since they are fast to process if (!$deep && !Filesystem::isLocalPath($url)) { return \false; } $process = new ProcessExecutor($io); $exit = $process->execute(['svn', 'info', '--non-interactive', '--', $url], $ignoredOutput); if ($exit === 0) { // This is definitely a Subversion repository. return \true; } // Subversion client 1.7 and older if (\false !== \stripos($process->getErrorOutput(), 'authorization failed:')) { // This is likely a remote Subversion repository that requires // authentication. We will handle actual authentication later. return \true; } // Subversion client 1.8 and newer if (\false !== \stripos($process->getErrorOutput(), 'Authentication failed')) { // This is likely a remote Subversion or newer repository that requires // authentication. We will handle actual authentication later. return \true; } return \false; } /** * An absolute path (leading '/') is converted to a file:// url. */ protected static function normalizeUrl(string $url) : string { $fs = new Filesystem(); if ($fs->isAbsolutePath($url)) { return 'file://' . \strtr($url, '\\', '/'); } return $url; } /** * Execute an SVN command and try to fix up the process with credentials * if necessary. * * @param non-empty-list $command The svn command to run. * @param string $url The SVN URL. * @throws \RuntimeException */ protected function execute(array $command, string $url) : string { if (null === $this->util) { $this->util = new SvnUtil($this->baseUrl, $this->io, $this->config, $this->process); $this->util->setCacheCredentials($this->cacheCredentials); } try { return $this->util->execute($command, $url); } catch (\RuntimeException $e) { if (null === $this->util->binaryVersion()) { throw new \RuntimeException('Failed to load ' . $this->url . ', svn was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput()); } throw new \RuntimeException('Repository ' . $this->url . ' could not be processed, ' . $e->getMessage()); } } /** * Build the identifier respecting "package-path" config option * * @param string $baseDir The path to trunk/branch/tag * @param int $revision The revision mark to add to identifier */ protected function buildIdentifier(string $baseDir, int $revision) : string { return \rtrim($baseDir, '/') . $this->packagePath . '/@' . $revision; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Cache; use Composer\Pcre\Preg; use Composer\Util\Hg as HgUtils; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\IO\IOInterface; use Composer\Util\Url; /** * @author Per Bernhardt */ class HgDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var array Map of tag name to identifier */ protected $tags; /** @var array Map of branch name to identifier */ protected $branches; /** @var string */ protected $rootIdentifier; /** @var string */ protected $repoDir; /** * @inheritDoc */ public function initialize() : void { if (Filesystem::isLocalPath($this->url)) { $this->repoDir = $this->url; } else { if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('HgDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $cacheDir = $this->config->get('cache-vcs-dir'); $this->repoDir = $cacheDir . '/' . Preg::replace('{[^a-z0-9]}i', '-', Url::sanitize($this->url)) . '/'; $fs = new Filesystem(); $fs->ensureDirectoryExists($cacheDir); if (!\is_writable(\dirname($this->repoDir))) { throw new \RuntimeException('Can not clone ' . $this->url . ' to access package information. The "' . $cacheDir . '" directory is not writable by the current user.'); } // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($this->url, $this->io); $hgUtils = new HgUtils($this->io, $this->config, $this->process); // update the repo if it is a valid hg repository if (\is_dir($this->repoDir) && 0 === $this->process->execute(['hg', 'summary'], $output, $this->repoDir)) { if (0 !== $this->process->execute(['hg', 'pull'], $output, $this->repoDir)) { $this->io->writeError('Failed to update ' . $this->url . ', package information from this repository may be outdated (' . $this->process->getErrorOutput() . ')'); } } else { // clean up directory and do a fresh clone into it $fs->removeDirectory($this->repoDir); $repoDir = $this->repoDir; $command = static function ($url) use($repoDir) : array { return ['hg', 'clone', '--noupdate', '--', $url, $repoDir]; }; $hgUtils->runCommand($command, $this->url, null); } } $this->getTags(); $this->getBranches(); } /** * @inheritDoc */ public function getRootIdentifier() : string { if (null === $this->rootIdentifier) { $this->process->execute(['hg', 'tip', '--template', '{node}'], $output, $this->repoDir); $output = $this->process->splitLines($output); $this->rootIdentifier = $output[0]; } return $this->rootIdentifier; } /** * @inheritDoc */ public function getUrl() : string { return $this->url; } /** * @inheritDoc */ public function getSource(string $identifier) : array { return ['type' => 'hg', 'url' => $this->getUrl(), 'reference' => $identifier]; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { return null; } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { if (isset($identifier[0]) && $identifier[0] === '-') { throw new \RuntimeException('Invalid hg identifier detected. Identifier must not start with a -, given: ' . $identifier); } $resource = ['hg', 'cat', '-r', $identifier, '--', $file]; $this->process->execute($resource, $content, $this->repoDir); if (!\trim($content)) { return null; } return $content; } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { $this->process->execute(['hg', 'log', '--template', '{date|rfc3339date}', '-r', $identifier], $output, $this->repoDir); return new \DateTimeImmutable(\trim($output), new \DateTimeZone('UTC')); } /** * @inheritDoc */ public function getTags() : array { if (null === $this->tags) { $tags = []; $this->process->execute(['hg', 'tags'], $output, $this->repoDir); foreach ($this->process->splitLines($output) as $tag) { if ($tag && Preg::isMatchStrictGroups('(^([^\\s]+)\\s+\\d+:(.*)$)', $tag, $match)) { $tags[$match[1]] = $match[2]; } } unset($tags['tip']); $this->tags = $tags; } return $this->tags; } /** * @inheritDoc */ public function getBranches() : array { if (null === $this->branches) { $branches = []; $bookmarks = []; $this->process->execute(['hg', 'branches'], $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { if ($branch && Preg::isMatchStrictGroups('(^([^\\s]+)\\s+\\d+:([a-f0-9]+))', $branch, $match) && $match[1][0] !== '-') { $branches[$match[1]] = $match[2]; } } $this->process->execute(['hg', 'bookmarks'], $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { if ($branch && Preg::isMatchStrictGroups('(^(?:[\\s*]*)([^\\s]+)\\s+\\d+:(.*)$)', $branch, $match) && $match[1][0] !== '-') { $bookmarks[$match[1]] = $match[2]; } } // Branches will have preference over bookmarks $this->branches = \array_merge($bookmarks, $branches); } return $this->branches; } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if (Preg::isMatch('#(^(?:https?|ssh)://(?:[^@]+@)?bitbucket.org|https://(?:.*?)\\.kilnhg.com)#i', $url)) { return \true; } // local filesystem if (Filesystem::isLocalPath($url)) { $url = Filesystem::getPlatformPath($url); if (!\is_dir($url)) { return \false; } $process = new ProcessExecutor($io); // check whether there is a hg repo in that path if ($process->execute(['hg', 'summary'], $output, $url) === 0) { return \true; } } if (!$deep) { return \false; } $process = new ProcessExecutor($io); $exit = $process->execute(['hg', 'identify', '--', $url], $ignored); return $exit === 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Cache; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use Composer\Util\Perforce; use Composer\Util\Http\Response; /** * @author Matt Whittom */ class PerforceDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var string */ protected $depot; /** @var string */ protected $branch; /** @var ?Perforce */ protected $perforce = null; /** * @inheritDoc */ public function initialize() : void { $this->depot = $this->repoConfig['depot']; $this->branch = ''; if (!empty($this->repoConfig['branch'])) { $this->branch = $this->repoConfig['branch']; } $this->initPerforce($this->repoConfig); $this->perforce->p4Login(); $this->perforce->checkStream(); $this->perforce->writeP4ClientSpec(); $this->perforce->connectClient(); } /** * @param array $repoConfig */ private function initPerforce(array $repoConfig) : void { if (!empty($this->perforce)) { return; } if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('PerforceDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $repoDir = $this->config->get('cache-vcs-dir') . '/' . $this->depot; $this->perforce = Perforce::create($repoConfig, $this->getUrl(), $repoDir, $this->process, $this->io); } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { return $this->perforce->getFileContent($file, $identifier); } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { return null; } /** * @inheritDoc */ public function getRootIdentifier() : string { return $this->branch; } /** * @inheritDoc */ public function getBranches() : array { return $this->perforce->getBranches(); } /** * @inheritDoc */ public function getTags() : array { return $this->perforce->getTags(); } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { return null; } /** * @inheritDoc */ public function getSource(string $identifier) : array { return ['type' => 'perforce', 'url' => $this->repoConfig['url'], 'reference' => $identifier, 'p4user' => $this->perforce->getUser()]; } /** * @inheritDoc */ public function getUrl() : string { return $this->url; } /** * @inheritDoc */ public function hasComposerFile(string $identifier) : bool { $composerInfo = $this->perforce->getComposerInformation('//' . $this->depot . '/' . $identifier); return !empty($composerInfo); } /** * @inheritDoc */ public function getContents(string $url) : Response { throw new \BadMethodCallException('Not implemented/used in PerforceDriver'); } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if ($deep || Preg::isMatch('#\\b(perforce|p4)\\b#i', $url)) { return Perforce::checkServerExists($url, new ProcessExecutor($io)); } return \false; } /** * @inheritDoc */ public function cleanup() : void { $this->perforce->cleanupClientSpec(); $this->perforce = null; } public function getDepot() : string { return $this->depot; } public function getBranch() : string { return $this->branch; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\IO\IOInterface; use Composer\Cache; use Composer\Downloader\TransportException; use Composer\Json\JsonFile; use Composer\Pcre\Preg; use Composer\Util\Bitbucket; use Composer\Util\Http\Response; /** * @author Per Bernhardt */ class GitBitbucketDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var string */ protected $owner; /** @var string */ protected $repository; /** @var bool */ private $hasIssues = \false; /** @var ?string */ private $rootIdentifier; /** @var array Map of tag name to identifier */ private $tags; /** @var array Map of branch name to identifier */ private $branches; /** @var string */ private $branchesUrl = ''; /** @var string */ private $tagsUrl = ''; /** @var string */ private $homeUrl = ''; /** @var string */ private $website = ''; /** @var string */ private $cloneHttpsUrl = ''; /** @var array */ private $repoData; /** * @var ?VcsDriver */ protected $fallbackDriver = null; /** @var string|null if set either git or hg */ private $vcsType; /** * @inheritDoc */ public function initialize() : void { if (!Preg::isMatchStrictGroups('#^https?://bitbucket\\.org/([^/]+)/([^/]+?)(?:\\.git|/?)?$#i', $this->url, $match)) { throw new \InvalidArgumentException(\sprintf('The Bitbucket repository URL %s is invalid. It must be the HTTPS URL of a Bitbucket repository.', $this->url)); } $this->owner = $match[1]; $this->repository = $match[2]; $this->originUrl = 'bitbucket.org'; $this->cache = new Cache($this->io, \implode('/', [$this->config->get('cache-repo-dir'), $this->originUrl, $this->owner, $this->repository])); $this->cache->setReadOnly($this->config->get('cache-read-only')); } /** * @inheritDoc */ public function getUrl() : string { if ($this->fallbackDriver) { return $this->fallbackDriver->getUrl(); } return $this->cloneHttpsUrl; } /** * Attempts to fetch the repository data via the BitBucket API and * sets some parameters which are used in other methods * * @phpstan-impure */ protected function getRepoData() : bool { $resource = \sprintf('https://api.bitbucket.org/2.0/repositories/%s/%s?%s', $this->owner, $this->repository, \http_build_query(['fields' => '-project,-owner'], '', '&')); $repoData = $this->fetchWithOAuthCredentials($resource, \true)->decodeJson(); if ($this->fallbackDriver) { return \false; } $this->parseCloneUrls($repoData['links']['clone']); $this->hasIssues = !empty($repoData['has_issues']); $this->branchesUrl = $repoData['links']['branches']['href']; $this->tagsUrl = $repoData['links']['tags']['href']; $this->homeUrl = $repoData['links']['html']['href']; $this->website = $repoData['website']; $this->vcsType = $repoData['scm']; $this->repoData = $repoData; return \true; } /** * @inheritDoc */ public function getComposerInformation(string $identifier) : ?array { if ($this->fallbackDriver) { return $this->fallbackDriver->getComposerInformation($identifier); } if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && ($res = $this->cache->read($identifier))) { $composer = JsonFile::parseJson($res); } else { $composer = $this->getBaseComposerInformation($identifier); if ($this->shouldCache($identifier)) { $this->cache->write($identifier, \json_encode($composer)); } } if ($composer !== null) { // specials for bitbucket if (isset($composer['support']) && !\is_array($composer['support'])) { $composer['support'] = []; } if (!isset($composer['support']['source'])) { $label = (\array_search($identifier, $this->getTags()) ?: \array_search($identifier, $this->getBranches())) ?: $identifier; if (\array_key_exists($label, $tags = $this->getTags())) { $hash = $tags[$label]; } elseif (\array_key_exists($label, $branches = $this->getBranches())) { $hash = $branches[$label]; } if (!isset($hash)) { $composer['support']['source'] = \sprintf('https://%s/%s/%s/src', $this->originUrl, $this->owner, $this->repository); } else { $composer['support']['source'] = \sprintf('https://%s/%s/%s/src/%s/?at=%s', $this->originUrl, $this->owner, $this->repository, $hash, $label); } } if (!isset($composer['support']['issues']) && $this->hasIssues) { $composer['support']['issues'] = \sprintf('https://%s/%s/%s/issues', $this->originUrl, $this->owner, $this->repository); } if (!isset($composer['homepage'])) { $composer['homepage'] = empty($this->website) ? $this->homeUrl : $this->website; } } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { if ($this->fallbackDriver) { return $this->fallbackDriver->getFileContent($file, $identifier); } if (\strpos($identifier, '/') !== \false) { $branches = $this->getBranches(); if (isset($branches[$identifier])) { $identifier = $branches[$identifier]; } } $resource = \sprintf('https://api.bitbucket.org/2.0/repositories/%s/%s/src/%s/%s', $this->owner, $this->repository, $identifier, $file); return $this->fetchWithOAuthCredentials($resource)->getBody(); } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { if ($this->fallbackDriver) { return $this->fallbackDriver->getChangeDate($identifier); } if (\strpos($identifier, '/') !== \false) { $branches = $this->getBranches(); if (isset($branches[$identifier])) { $identifier = $branches[$identifier]; } } $resource = \sprintf('https://api.bitbucket.org/2.0/repositories/%s/%s/commit/%s?fields=date', $this->owner, $this->repository, $identifier); $commit = $this->fetchWithOAuthCredentials($resource)->decodeJson(); return new \DateTimeImmutable($commit['date']); } /** * @inheritDoc */ public function getSource(string $identifier) : array { if ($this->fallbackDriver) { return $this->fallbackDriver->getSource($identifier); } return ['type' => $this->vcsType, 'url' => $this->getUrl(), 'reference' => $identifier]; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { if ($this->fallbackDriver) { return $this->fallbackDriver->getDist($identifier); } $url = \sprintf('https://bitbucket.org/%s/%s/get/%s.zip', $this->owner, $this->repository, $identifier); return ['type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => '']; } /** * @inheritDoc */ public function getTags() : array { if ($this->fallbackDriver) { return $this->fallbackDriver->getTags(); } if (null === $this->tags) { $tags = []; $resource = \sprintf('%s?%s', $this->tagsUrl, \http_build_query(['pagelen' => 100, 'fields' => 'values.name,values.target.hash,next', 'sort' => '-target.date'], '', '&')); $hasNext = \true; while ($hasNext) { $tagsData = $this->fetchWithOAuthCredentials($resource)->decodeJson(); foreach ($tagsData['values'] as $data) { $tags[$data['name']] = $data['target']['hash']; } if (empty($tagsData['next'])) { $hasNext = \false; } else { $resource = $tagsData['next']; } } $this->tags = $tags; } return $this->tags; } /** * @inheritDoc */ public function getBranches() : array { if ($this->fallbackDriver) { return $this->fallbackDriver->getBranches(); } if (null === $this->branches) { $branches = []; $resource = \sprintf('%s?%s', $this->branchesUrl, \http_build_query(['pagelen' => 100, 'fields' => 'values.name,values.target.hash,values.heads,next', 'sort' => '-target.date'], '', '&')); $hasNext = \true; while ($hasNext) { $branchData = $this->fetchWithOAuthCredentials($resource)->decodeJson(); foreach ($branchData['values'] as $data) { $branches[$data['name']] = $data['target']['hash']; } if (empty($branchData['next'])) { $hasNext = \false; } else { $resource = $branchData['next']; } } $this->branches = $branches; } return $this->branches; } /** * Get the remote content. * * @param string $url The URL of content * * @return Response The result * * @phpstan-impure */ protected function fetchWithOAuthCredentials(string $url, bool $fetchingRepoData = \false) : Response { try { return parent::getContents($url); } catch (TransportException $e) { $bitbucketUtil = new Bitbucket($this->io, $this->config, $this->process, $this->httpDownloader); if (\in_array($e->getCode(), [403, 404], \true) || 401 === $e->getCode() && \strpos($e->getMessage(), 'Could not authenticate against') === 0) { if (!$this->io->hasAuthentication($this->originUrl) && $bitbucketUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive() && $fetchingRepoData) { $this->attemptCloneFallback(); return new Response(['url' => 'dummy'], 200, [], 'null'); } } throw $e; } } /** * Generate an SSH URL */ protected function generateSshUrl() : string { return 'git@' . $this->originUrl . ':' . $this->owner . '/' . $this->repository . '.git'; } /** * @phpstan-impure * * @return true * @throws \RuntimeException */ protected function attemptCloneFallback() : bool { try { $this->setupFallbackDriver($this->generateSshUrl()); return \true; } catch (\RuntimeException $e) { $this->fallbackDriver = null; $this->io->writeError('Failed to clone the ' . $this->generateSshUrl() . ' repository, try running in interactive mode' . ' so that you can enter your Bitbucket OAuth consumer credentials'); throw $e; } } protected function setupFallbackDriver(string $url) : void { $this->fallbackDriver = new \Composer\Repository\Vcs\GitDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $this->fallbackDriver->initialize(); } /** * @param array $cloneLinks */ protected function parseCloneUrls(array $cloneLinks) : void { foreach ($cloneLinks as $cloneLink) { if ($cloneLink['name'] === 'https') { // Format: https://(user@)bitbucket.org/{user}/{repo} // Strip username from URL (only present in clone URL's for private repositories) $this->cloneHttpsUrl = Preg::replace('/https:\\/\\/([^@]+@)?/', 'https://', $cloneLink['href']); } } } /** * @inheritDoc */ public function getRootIdentifier() : string { if ($this->fallbackDriver) { return $this->fallbackDriver->getRootIdentifier(); } if (null === $this->rootIdentifier) { if (!$this->getRepoData()) { if (!$this->fallbackDriver) { throw new \LogicException('A fallback driver should be setup if getRepoData returns false'); } return $this->fallbackDriver->getRootIdentifier(); } if ($this->vcsType !== 'git') { throw new \RuntimeException($this->url . ' does not appear to be a git repository, use ' . $this->cloneHttpsUrl . ' but remember that Bitbucket no longer supports the mercurial repositories. ' . 'https://bitbucket.org/blog/sunsetting-mercurial-support-in-bitbucket'); } $this->rootIdentifier = $this->repoData['mainbranch']['name'] ?? 'master'; } return $this->rootIdentifier; } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if (!Preg::isMatch('#^https?://bitbucket\\.org/([^/]+)/([^/]+?)(\\.git|/?)?$#i', $url)) { return \false; } if (!\extension_loaded('openssl')) { $io->writeError('Skipping Bitbucket git driver for ' . $url . ' because the OpenSSL PHP extension is missing.', \true, IOInterface::VERBOSE); return \false; } return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\Util\Url; use Composer\Util\Git as GitUtil; use Composer\IO\IOInterface; use Composer\Cache; use Composer\Config; /** * @author Jordi Boggiano */ class GitDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var array Map of tag name (can be turned to an int by php if it is a numeric name) to identifier */ protected $tags; /** @var array Map of branch name (can be turned to an int by php if it is a numeric name) to identifier */ protected $branches; /** @var string */ protected $rootIdentifier; /** @var string */ protected $repoDir; /** * @inheritDoc */ public function initialize() : void { if (Filesystem::isLocalPath($this->url)) { $this->url = Preg::replace('{[\\/]\\.git/?$}', '', $this->url); if (!\is_dir($this->url)) { throw new \RuntimeException('Failed to read package information from ' . $this->url . ' as the path does not exist'); } $this->repoDir = $this->url; $cacheUrl = \realpath($this->url); } else { if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('GitDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $this->repoDir = $this->config->get('cache-vcs-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($this->url)) . '/'; GitUtil::cleanEnv(); $fs = new Filesystem(); $fs->ensureDirectoryExists(\dirname($this->repoDir)); if (!\is_writable(\dirname($this->repoDir))) { throw new \RuntimeException('Can not clone ' . $this->url . ' to access package information. The "' . \dirname($this->repoDir) . '" directory is not writable by the current user.'); } if (Preg::isMatch('{^ssh://[^@]+@[^:]+:[^0-9]+}', $this->url)) { throw new \InvalidArgumentException('The source URL ' . $this->url . ' is invalid, ssh URLs should have a port number after ":".' . "\n" . 'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.'); } $gitUtil = new GitUtil($this->io, $this->config, $this->process, $fs); if (!$gitUtil->syncMirror($this->url, $this->repoDir)) { if (!\is_dir($this->repoDir)) { throw new \RuntimeException('Failed to clone ' . $this->url . ' to read package information from it'); } $this->io->writeError('Failed to update ' . $this->url . ', package information from this repository may be outdated'); } $cacheUrl = $this->url; } $this->getTags(); $this->getBranches(); $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($cacheUrl))); $this->cache->setReadOnly($this->config->get('cache-read-only')); } /** * @inheritDoc */ public function getRootIdentifier() : string { if (null === $this->rootIdentifier) { $this->rootIdentifier = 'master'; $gitUtil = new GitUtil($this->io, $this->config, $this->process, new Filesystem()); if (!Filesystem::isLocalPath($this->url)) { $defaultBranch = $gitUtil->getMirrorDefaultBranch($this->url, $this->repoDir, \false); if ($defaultBranch !== null) { return $this->rootIdentifier = $defaultBranch; } } // select currently checked out branch as default branch $this->process->execute(['git', 'branch', '--no-color'], $output, $this->repoDir); $branches = $this->process->splitLines($output); if (!\in_array('* master', $branches)) { foreach ($branches as $branch) { if ($branch && Preg::isMatchStrictGroups('{^\\* +(\\S+)}', $branch, $match)) { $this->rootIdentifier = $match[1]; break; } } } } return $this->rootIdentifier; } /** * @inheritDoc */ public function getUrl() : string { return $this->url; } /** * @inheritDoc */ public function getSource(string $identifier) : array { return ['type' => 'git', 'url' => $this->getUrl(), 'reference' => $identifier]; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { return null; } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { if (isset($identifier[0]) && $identifier[0] === '-') { throw new \RuntimeException('Invalid git identifier detected. Identifier must not start with a -, given: ' . $identifier); } $this->process->execute(['git', 'show', $identifier . ':' . $file], $content, $this->repoDir); if (\trim($content) === '') { return null; } return $content; } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { $this->process->execute(['git', '-c', 'log.showSignature=false', 'log', '-1', '--format=%at', $identifier], $output, $this->repoDir); return new \DateTimeImmutable('@' . \trim($output), new \DateTimeZone('UTC')); } /** * @inheritDoc */ public function getTags() : array { if (null === $this->tags) { $this->tags = []; $this->process->execute(['git', 'show-ref', '--tags', '--dereference'], $output, $this->repoDir); foreach ($this->process->splitLines($output) as $tag) { if ($tag !== '' && Preg::isMatch('{^([a-f0-9]{40}) refs/tags/(\\S+?)(\\^\\{\\})?$}', $tag, $match)) { $this->tags[$match[2]] = $match[1]; } } } return $this->tags; } /** * @inheritDoc */ public function getBranches() : array { if (null === $this->branches) { $branches = []; $this->process->execute(['git', 'branch', '--no-color', '--no-abbrev', '-v'], $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { if ($branch !== '' && !Preg::isMatch('{^ *[^/]+/HEAD }', $branch)) { if (Preg::isMatchStrictGroups('{^(?:\\* )? *(\\S+) *([a-f0-9]+)(?: .*)?$}', $branch, $match) && $match[1][0] !== '-') { $branches[$match[1]] = $match[2]; } } } $this->branches = $branches; } return $this->branches; } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if (Preg::isMatch('#(^git://|\\.git/?$|git(?:olite)?@|//git\\.|//github.com/)#i', $url)) { return \true; } // local filesystem if (Filesystem::isLocalPath($url)) { $url = Filesystem::getPlatformPath($url); if (!\is_dir($url)) { return \false; } $process = new ProcessExecutor($io); // check whether there is a git repo in that path if ($process->execute(['git', 'tag'], $output, $url) === 0) { return \true; } GitUtil::checkForRepoOwnershipError($process->getErrorOutput(), $url); } if (!$deep) { return \false; } $gitUtil = new GitUtil($io, $config, new ProcessExecutor($io), new Filesystem()); GitUtil::cleanEnv(); try { $gitUtil->runCommands([['git', 'ls-remote', '--heads', '--', '%url%']], $url, \sys_get_temp_dir()); } catch (\RuntimeException $e) { return \false; } return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Cache; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; use Composer\Util\HttpDownloader; use Composer\Util\GitLab; use Composer\Util\Http\Response; /** * Driver for GitLab API, use the Git driver for local checkouts. * * @author Henrik Bjørnskov * @author Jérôme Tamarelle */ class GitLabDriver extends \Composer\Repository\Vcs\VcsDriver { /** * @var string * @phpstan-var 'https'|'http' */ private $scheme; /** @var string */ private $namespace; /** @var string */ private $repository; /** * @var mixed[] Project data returned by GitLab API */ private $project = null; /** * @var array Keeps commits returned by GitLab API as commit id => info */ private $commits = []; /** @var array Map of tag name to identifier */ private $tags; /** @var array Map of branch name to identifier */ private $branches; /** * Git Driver * * @var ?GitDriver */ protected $gitDriver = null; /** * Protocol to force use of for repository URLs. * * @var string One of ssh, http */ protected $protocol; /** * Defaults to true unless we can make sure it is public * * @var bool defines whether the repo is private or not */ private $isPrivate = \true; /** * @var bool true if the origin has a port number or a path component in it */ private $hasNonstandardOrigin = \false; public const URL_REGEX = '#^(?:(?Phttps?)://(?P.+?)(?::(?P[0-9]+))?/|git@(?P[^:]+):)(?P.+)/(?P[^/]+?)(?:\\.git|/)?$#'; /** * Extracts information from the repository url. * * SSH urls use https by default. Set "secure-http": false on the repository config to use http instead. * * @inheritDoc */ public function initialize() : void { if (!Preg::isMatch(self::URL_REGEX, $this->url, $match)) { throw new \InvalidArgumentException(\sprintf('The GitLab repository URL %s is invalid. It must be the HTTP URL of a GitLab project.', $this->url)); } $guessedDomain = $match['domain'] ?? (string) $match['domain2']; $configuredDomains = $this->config->get('gitlab-domains'); $urlParts = \explode('/', $match['parts']); $this->scheme = \in_array($match['scheme'], ['https', 'http'], \true) ? $match['scheme'] : (isset($this->repoConfig['secure-http']) && $this->repoConfig['secure-http'] === \false ? 'http' : 'https'); $origin = self::determineOrigin($configuredDomains, $guessedDomain, $urlParts, $match['port']); if (\false === $origin) { throw new \LogicException('It should not be possible to create a gitlab driver with an unparsable origin URL (' . $this->url . ')'); } $this->originUrl = $origin; if (\is_string($protocol = $this->config->get('gitlab-protocol'))) { // https treated as a synonym for http. if (!\in_array($protocol, ['git', 'http', 'https'], \true)) { throw new \RuntimeException('gitlab-protocol must be one of git, http.'); } $this->protocol = $protocol === 'git' ? 'ssh' : 'http'; } if (\false !== \strpos($this->originUrl, ':') || \false !== \strpos($this->originUrl, '/')) { $this->hasNonstandardOrigin = \true; } $this->namespace = \implode('/', $urlParts); $this->repository = Preg::replace('#(\\.git)$#', '', $match['repo']); $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir') . '/' . $this->originUrl . '/' . $this->namespace . '/' . $this->repository); $this->cache->setReadOnly($this->config->get('cache-read-only')); $this->fetchProject(); } /** * Updates the HttpDownloader instance. * Mainly useful for tests. * * @internal */ public function setHttpDownloader(HttpDownloader $httpDownloader) : void { $this->httpDownloader = $httpDownloader; } /** * @inheritDoc */ public function getComposerInformation(string $identifier) : ?array { if ($this->gitDriver) { return $this->gitDriver->getComposerInformation($identifier); } if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && ($res = $this->cache->read($identifier))) { $composer = JsonFile::parseJson($res); } else { $composer = $this->getBaseComposerInformation($identifier); if ($this->shouldCache($identifier)) { $this->cache->write($identifier, \json_encode($composer)); } } if (null !== $composer) { // specials for gitlab (this data is only available if authentication is provided) if (isset($composer['support']) && !\is_array($composer['support'])) { $composer['support'] = []; } if (!isset($composer['support']['source']) && isset($this->project['web_url'])) { $label = (\array_search($identifier, $this->getTags(), \true) ?: \array_search($identifier, $this->getBranches(), \true)) ?: $identifier; $composer['support']['source'] = \sprintf('%s/-/tree/%s', $this->project['web_url'], $label); } if (!isset($composer['support']['issues']) && !empty($this->project['issues_enabled']) && isset($this->project['web_url'])) { $composer['support']['issues'] = \sprintf('%s/-/issues', $this->project['web_url']); } if (!isset($composer['abandoned']) && !empty($this->project['archived'])) { $composer['abandoned'] = \true; } } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { if ($this->gitDriver) { return $this->gitDriver->getFileContent($file, $identifier); } // Convert the root identifier to a cacheable commit id if (!Preg::isMatch('{[a-f0-9]{40}}i', $identifier)) { $branches = $this->getBranches(); if (isset($branches[$identifier])) { $identifier = $branches[$identifier]; } } $resource = $this->getApiUrl() . '/repository/files/' . $this->urlEncodeAll($file) . '/raw?ref=' . $identifier; try { $content = $this->getContents($resource)->getBody(); } catch (TransportException $e) { if ($e->getCode() !== 404) { throw $e; } return null; } return $content; } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { if ($this->gitDriver) { return $this->gitDriver->getChangeDate($identifier); } if (isset($this->commits[$identifier])) { return new \DateTimeImmutable($this->commits[$identifier]['committed_date']); } return null; } public function getRepositoryUrl() : string { if ($this->protocol) { return $this->project["{$this->protocol}_url_to_repo"]; } return $this->isPrivate ? $this->project['ssh_url_to_repo'] : $this->project['http_url_to_repo']; } /** * @inheritDoc */ public function getUrl() : string { if ($this->gitDriver) { return $this->gitDriver->getUrl(); } return $this->project['web_url']; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { $url = $this->getApiUrl() . '/repository/archive.zip?sha=' . $identifier; return ['type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => '']; } /** * @inheritDoc */ public function getSource(string $identifier) : array { if ($this->gitDriver) { return $this->gitDriver->getSource($identifier); } return ['type' => 'git', 'url' => $this->getRepositoryUrl(), 'reference' => $identifier]; } /** * @inheritDoc */ public function getRootIdentifier() : string { if ($this->gitDriver) { return $this->gitDriver->getRootIdentifier(); } return $this->project['default_branch']; } /** * @inheritDoc */ public function getBranches() : array { if ($this->gitDriver) { return $this->gitDriver->getBranches(); } if (null === $this->branches) { $this->branches = $this->getReferences('branches'); } return $this->branches; } /** * @inheritDoc */ public function getTags() : array { if ($this->gitDriver) { return $this->gitDriver->getTags(); } if (null === $this->tags) { $this->tags = $this->getReferences('tags'); } return $this->tags; } /** * @return string Base URL for GitLab API v3 */ public function getApiUrl() : string { return $this->scheme . '://' . $this->originUrl . '/api/v4/projects/' . $this->urlEncodeAll($this->namespace) . '%2F' . $this->urlEncodeAll($this->repository); } /** * Urlencode all non alphanumeric characters. rawurlencode() can not be used as it does not encode `.` */ private function urlEncodeAll(string $string) : string { $encoded = ''; for ($i = 0; isset($string[$i]); $i++) { $character = $string[$i]; if (!\ctype_alnum($character) && !\in_array($character, ['-', '_'], \true)) { $character = '%' . \sprintf('%02X', \ord($character)); } $encoded .= $character; } return $encoded; } /** * @return string[] where keys are named references like tags or branches and the value a sha */ protected function getReferences(string $type) : array { $perPage = 100; $resource = $this->getApiUrl() . '/repository/' . $type . '?per_page=' . $perPage; $references = []; do { $response = $this->getContents($resource); $data = $response->decodeJson(); foreach ($data as $datum) { $references[$datum['name']] = $datum['commit']['id']; // Keep the last commit date of a reference to avoid // unnecessary API call when retrieving the composer file. $this->commits[$datum['commit']['id']] = $datum['commit']; } if (\count($data) >= $perPage) { $resource = $this->getNextPage($response); } else { $resource = \false; } } while ($resource); return $references; } protected function fetchProject() : void { if (!\is_null($this->project)) { return; } // we need to fetch the default branch from the api $resource = $this->getApiUrl(); $this->project = $this->getContents($resource, \true)->decodeJson(); if (isset($this->project['visibility'])) { $this->isPrivate = $this->project['visibility'] !== 'public'; } else { // client is not authenticated, therefore repository has to be public $this->isPrivate = \false; } } /** * @phpstan-impure * * @return true * @throws \RuntimeException */ protected function attemptCloneFallback() : bool { if ($this->isPrivate === \false) { $url = $this->generatePublicUrl(); } else { $url = $this->generateSshUrl(); } try { // If this repository may be private and we // cannot ask for authentication credentials (because we // are not interactive) then we fallback to GitDriver. $this->setupGitDriver($url); return \true; } catch (\RuntimeException $e) { $this->gitDriver = null; $this->io->writeError('Failed to clone the ' . $url . ' repository, try running in interactive mode so that you can enter your credentials'); throw $e; } } /** * Generate an SSH URL */ protected function generateSshUrl() : string { if ($this->hasNonstandardOrigin) { return 'ssh://git@' . $this->originUrl . '/' . $this->namespace . '/' . $this->repository . '.git'; } return 'git@' . $this->originUrl . ':' . $this->namespace . '/' . $this->repository . '.git'; } protected function generatePublicUrl() : string { return $this->scheme . '://' . $this->originUrl . '/' . $this->namespace . '/' . $this->repository . '.git'; } protected function setupGitDriver(string $url) : void { $this->gitDriver = new \Composer\Repository\Vcs\GitDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $this->gitDriver->initialize(); } /** * @inheritDoc */ protected function getContents(string $url, bool $fetchingRepoData = \false) : Response { try { $response = parent::getContents($url); if ($fetchingRepoData) { $json = $response->decodeJson(); // Accessing the API with a token with Guest (10) access will return // more data than unauthenticated access but no default_branch data // accessing files via the API will then also fail if (!isset($json['default_branch']) && isset($json['permissions'])) { $this->isPrivate = $json['visibility'] !== 'public'; $moreThanGuestAccess = \false; // Check both access levels (e.g. project, group) // - value will be null if no access is set // - value will be array with key access_level if set foreach ($json['permissions'] as $permission) { if ($permission && $permission['access_level'] > 10) { $moreThanGuestAccess = \true; } } if (!$moreThanGuestAccess) { $this->io->writeError('GitLab token with Guest only access detected'); $this->attemptCloneFallback(); return new Response(['url' => 'dummy'], 200, [], 'null'); } } // force auth as the unauthenticated version of the API is broken if (!isset($json['default_branch'])) { // GitLab allows you to disable the repository inside a project to use a project only for issues and wiki if (isset($json['repository_access_level']) && $json['repository_access_level'] === 'disabled') { throw new TransportException('The GitLab repository is disabled in the project', 400); } if (!empty($json['id'])) { $this->isPrivate = \false; } throw new TransportException('GitLab API seems to not be authenticated as it did not return a default_branch', 401); } } return $response; } catch (TransportException $e) { $gitLabUtil = new GitLab($this->io, $this->config, $this->process, $this->httpDownloader); switch ($e->getCode()) { case 401: case 404: // try to authorize only if we are fetching the main /repos/foo/bar data, otherwise it must be a real 404 if (!$fetchingRepoData) { throw $e; } if ($gitLabUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if ($gitLabUtil->isOAuthExpired($this->originUrl) && $gitLabUtil->authorizeOAuthRefresh($this->scheme, $this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive()) { $this->attemptCloneFallback(); return new Response(['url' => 'dummy'], 200, [], 'null'); } $this->io->writeError('Failed to download ' . $this->namespace . '/' . $this->repository . ':' . $e->getMessage() . ''); $gitLabUtil->authorizeOAuthInteractively($this->scheme, $this->originUrl, 'Your credentials are required to fetch private repository metadata (' . $this->url . ')'); return parent::getContents($url); case 403: if (!$this->io->hasAuthentication($this->originUrl) && $gitLabUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive() && $fetchingRepoData) { $this->attemptCloneFallback(); return new Response(['url' => 'dummy'], 200, [], 'null'); } throw $e; default: throw $e; } } } /** * Uses the config `gitlab-domains` to see if the driver supports the url for the * repository given. * * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if (!Preg::isMatch(self::URL_REGEX, $url, $match)) { return \false; } $scheme = $match['scheme']; $guessedDomain = $match['domain'] ?? (string) $match['domain2']; $urlParts = \explode('/', $match['parts']); if (\false === self::determineOrigin($config->get('gitlab-domains'), $guessedDomain, $urlParts, $match['port'])) { return \false; } if ('https' === $scheme && !\extension_loaded('openssl')) { $io->writeError('Skipping GitLab driver for ' . $url . ' because the OpenSSL PHP extension is missing.', \true, IOInterface::VERBOSE); return \false; } return \true; } /** * Gives back the loaded /projects// result * * @return mixed[]|null */ public function getRepoData() : ?array { $this->fetchProject(); return $this->project; } protected function getNextPage(Response $response) : ?string { $header = $response->getHeader('link'); $links = \explode(',', $header); foreach ($links as $link) { if (Preg::isMatchStrictGroups('{<(.+?)>; *rel="next"}', $link, $match)) { return $match[1]; } } return null; } /** * @param array $configuredDomains * @param array $urlParts * @param string $portNumber * * @return string|false */ private static function determineOrigin(array $configuredDomains, string $guessedDomain, array &$urlParts, ?string $portNumber) { $guessedDomain = \strtolower($guessedDomain); if (\in_array($guessedDomain, $configuredDomains) || null !== $portNumber && \in_array($guessedDomain . ':' . $portNumber, $configuredDomains)) { if (null !== $portNumber) { return $guessedDomain . ':' . $portNumber; } return $guessedDomain; } if (null !== $portNumber) { $guessedDomain .= ':' . $portNumber; } while (null !== ($part = \array_shift($urlParts))) { $guessedDomain .= '/' . $part; if (\in_array($guessedDomain, $configuredDomains) || null !== $portNumber && \in_array(Preg::replace('{:\\d+}', '', $guessedDomain), $configuredDomains)) { return $guessedDomain; } } return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\IO\IOInterface; /** * @author Jordi Boggiano * @internal */ interface VcsDriverInterface { /** * Initializes the driver (git clone, svn checkout, fetch info etc) */ public function initialize() : void; /** * Return the composer.json file information * * @param string $identifier Any identifier to a specific branch/tag/commit * @return mixed[]|null Array containing all infos from the composer.json file, or null to denote that no file was present */ public function getComposerInformation(string $identifier) : ?array; /** * Return the content of $file or null if the file does not exist. */ public function getFileContent(string $file, string $identifier) : ?string; /** * Get the changedate for $identifier. */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable; /** * Return the root identifier (trunk, master, default/tip ..) * * @return string Identifier */ public function getRootIdentifier() : string; /** * Return list of branches in the repository * * @return array Branch names as keys, identifiers as values */ public function getBranches() : array; /** * Return list of tags in the repository * * @return array Tag names as keys, identifiers as values */ public function getTags() : array; /** * @param string $identifier Any identifier to a specific branch/tag/commit * * @return array{type: string, url: string, reference: string, shasum: string}|null */ public function getDist(string $identifier) : ?array; /** * @param string $identifier Any identifier to a specific branch/tag/commit * * @return array{type: string, url: string, reference: string} */ public function getSource(string $identifier) : array; /** * Return the URL of the repository */ public function getUrl() : string; /** * Return true if the repository has a composer file for a given identifier, * false otherwise. * * @param string $identifier Any identifier to a specific branch/tag/commit * @return bool Whether the repository has a composer file for a given identifier. */ public function hasComposerFile(string $identifier) : bool; /** * Performs any cleanup necessary as the driver is not longer needed */ public function cleanup() : void; /** * Checks if this driver can handle a given url * * @param IOInterface $io IO instance * @param Config $config current $config * @param string $url URL to validate/check * @param bool $deep unless true, only shallow checks (url matching typically) should be done */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Config; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\IO\IOInterface; /** * @author BohwaZ */ class FossilDriver extends \Composer\Repository\Vcs\VcsDriver { /** @var array Map of tag name to identifier */ protected $tags; /** @var array Map of branch name to identifier */ protected $branches; /** @var ?string */ protected $rootIdentifier = null; /** @var ?string */ protected $repoFile = null; /** @var string */ protected $checkoutDir; /** * @inheritDoc */ public function initialize() : void { // Make sure fossil is installed and reachable. $this->checkFossil(); // Ensure we are allowed to use this URL by config. $this->config->prohibitUrlByConfig($this->url, $this->io); // Only if url points to a locally accessible directory, assume it's the checkout directory. // Otherwise, it should be something fossil can clone from. if (Filesystem::isLocalPath($this->url) && \is_dir($this->url)) { $this->checkoutDir = $this->url; } else { if (!Cache::isUsable($this->config->get('cache-repo-dir')) || !Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('FossilDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $localName = Preg::replace('{[^a-z0-9]}i', '-', $this->url); $this->repoFile = $this->config->get('cache-repo-dir') . '/' . $localName . '.fossil'; $this->checkoutDir = $this->config->get('cache-vcs-dir') . '/' . $localName . '/'; $this->updateLocalRepo(); } $this->getTags(); $this->getBranches(); } /** * Check that fossil can be invoked via command line. */ protected function checkFossil() : void { if (0 !== $this->process->execute(['fossil', 'version'], $ignoredOutput)) { throw new \RuntimeException("fossil was not found, check that it is installed and in your PATH env.\n\n" . $this->process->getErrorOutput()); } } /** * Clone or update existing local fossil repository. */ protected function updateLocalRepo() : void { \assert($this->repoFile !== null); $fs = new Filesystem(); $fs->ensureDirectoryExists($this->checkoutDir); if (!\is_writable(\dirname($this->checkoutDir))) { throw new \RuntimeException('Can not clone ' . $this->url . ' to access package information. The "' . $this->checkoutDir . '" directory is not writable by the current user.'); } // update the repo if it is a valid fossil repository if (\is_file($this->repoFile) && \is_dir($this->checkoutDir) && 0 === $this->process->execute(['fossil', 'info'], $output, $this->checkoutDir)) { if (0 !== $this->process->execute(['fossil', 'pull'], $output, $this->checkoutDir)) { $this->io->writeError('Failed to update ' . $this->url . ', package information from this repository may be outdated (' . $this->process->getErrorOutput() . ')'); } } else { // clean up directory and do a fresh clone into it $fs->removeDirectory($this->checkoutDir); $fs->remove($this->repoFile); $fs->ensureDirectoryExists($this->checkoutDir); if (0 !== $this->process->execute(['fossil', 'clone', '--', $this->url, $this->repoFile], $output)) { $output = $this->process->getErrorOutput(); throw new \RuntimeException('Failed to clone ' . $this->url . ' to repository ' . $this->repoFile . "\n\n" . $output); } if (0 !== $this->process->execute(['fossil', 'open', '--nested', '--', $this->repoFile], $output, $this->checkoutDir)) { $output = $this->process->getErrorOutput(); throw new \RuntimeException('Failed to open repository ' . $this->repoFile . ' in ' . $this->checkoutDir . "\n\n" . $output); } } } /** * @inheritDoc */ public function getRootIdentifier() : string { if (null === $this->rootIdentifier) { $this->rootIdentifier = 'trunk'; } return $this->rootIdentifier; } /** * @inheritDoc */ public function getUrl() : string { return $this->url; } /** * @inheritDoc */ public function getSource(string $identifier) : array { return ['type' => 'fossil', 'url' => $this->getUrl(), 'reference' => $identifier]; } /** * @inheritDoc */ public function getDist(string $identifier) : ?array { return null; } /** * @inheritDoc */ public function getFileContent(string $file, string $identifier) : ?string { $this->process->execute(['fossil', 'cat', '-r', $identifier, '--', $file], $content, $this->checkoutDir); if ('' === \trim($content)) { return null; } return $content; } /** * @inheritDoc */ public function getChangeDate(string $identifier) : ?\DateTimeImmutable { $this->process->execute(['fossil', 'finfo', '-b', '-n', '1', 'composer.json'], $output, $this->checkoutDir); [, $date] = \explode(' ', \trim($output), 3); return new \DateTimeImmutable($date, new \DateTimeZone('UTC')); } /** * @inheritDoc */ public function getTags() : array { if (null === $this->tags) { $tags = []; $this->process->execute(['fossil', 'tag', 'list'], $output, $this->checkoutDir); foreach ($this->process->splitLines($output) as $tag) { $tags[$tag] = $tag; } $this->tags = $tags; } return $this->tags; } /** * @inheritDoc */ public function getBranches() : array { if (null === $this->branches) { $branches = []; $this->process->execute(['fossil', 'branch', 'list'], $output, $this->checkoutDir); foreach ($this->process->splitLines($output) as $branch) { $branch = \trim(Preg::replace('/^\\*/', '', \trim($branch))); $branches[$branch] = $branch; } $this->branches = $branches; } return $this->branches; } /** * @inheritDoc */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = \false) : bool { if (Preg::isMatch('#(^(?:https?|ssh)://(?:[^@]@)?(?:chiselapp\\.com|fossil\\.))#i', $url)) { return \true; } if (Preg::isMatch('!/fossil/|\\.fossil!', $url)) { return \true; } // local filesystem if (Filesystem::isLocalPath($url)) { $url = Filesystem::getPlatformPath($url); if (!\is_dir($url)) { return \false; } $process = new ProcessExecutor($io); // check whether there is a fossil repo in that path if ($process->execute(['fossil', 'info'], $output, $url) === 0) { return \true; } } return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Pcre\Preg; use Composer\Util\HttpDownloader; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\Util\Url; use Composer\Util\Git as GitUtil; /** * This repository allows installing local packages that are not necessarily under their own VCS. * * The local packages will be symlinked when possible, else they will be copied. * * @code * "require": { * "/": "*" * }, * "repositories": [ * { * "type": "path", * "url": "../../relative/path/to/package/" * }, * { * "type": "path", * "url": "/absolute/path/to/package/" * }, * { * "type": "path", * "url": "/absolute/path/to/several/packages/*" * }, * { * "type": "path", * "url": "../../relative/path/to/package/", * "options": { * "symlink": false * } * }, * { * "type": "path", * "url": "../../relative/path/to/package/", * "options": { * "reference": "none" * } * }, * ] * @endcode * * @author Samuel Roze * @author Johann Reinke */ class PathRepository extends \Composer\Repository\ArrayRepository implements \Composer\Repository\ConfigurableRepositoryInterface { /** * @var ArrayLoader */ private $loader; /** * @var VersionGuesser */ private $versionGuesser; /** * @var string */ private $url; /** * @var mixed[] * @phpstan-var array{url: string, options?: array{symlink?: bool, reference?: string, relative?: bool, versions?: array}} */ private $repoConfig; /** * @var ProcessExecutor */ private $process; /** * @var array{symlink?: bool, reference?: string, relative?: bool, versions?: array} */ private $options; /** * Initializes path repository. * * @param array{url?: string, options?: array{symlink?: bool, reference?: string, relative?: bool, versions?: array}} $repoConfig */ public function __construct(array $repoConfig, IOInterface $io, Config $config, ?HttpDownloader $httpDownloader = null, ?EventDispatcher $dispatcher = null, ?ProcessExecutor $process = null) { if (!isset($repoConfig['url'])) { throw new \RuntimeException('You must specify the `url` configuration for the path repository'); } $this->loader = new ArrayLoader(null, \true); $this->url = Platform::expandPath($repoConfig['url']); $this->process = $process ?? new ProcessExecutor($io); $this->versionGuesser = new VersionGuesser($config, $this->process, new VersionParser(), $io); $this->repoConfig = $repoConfig; $this->options = $repoConfig['options'] ?? []; if (!isset($this->options['relative'])) { $filesystem = new Filesystem(); $this->options['relative'] = !$filesystem->isAbsolutePath($this->url); } parent::__construct(); } public function getRepoName() : string { return 'path repo (' . Url::sanitize($this->repoConfig['url']) . ')'; } public function getRepoConfig() : array { return $this->repoConfig; } /** * Initializes path repository. * * This method will basically read the folder and add the found package. */ protected function initialize() : void { parent::initialize(); $urlMatches = $this->getUrlMatches(); if (empty($urlMatches)) { if (Preg::isMatch('{[*{}]}', $this->url)) { $url = $this->url; while (Preg::isMatch('{[*{}]}', $url)) { $url = \dirname($url); } // the parent directory before any wildcard exists, so we assume it is correctly configured but simply empty if (\is_dir($url)) { return; } } throw new \RuntimeException('The `url` supplied for the path (' . $this->url . ') repository does not exist'); } foreach ($urlMatches as $url) { $path = \realpath($url) . \DIRECTORY_SEPARATOR; $composerFilePath = $path . 'composer.json'; if (!\file_exists($composerFilePath)) { continue; } $json = \file_get_contents($composerFilePath); $package = JsonFile::parseJson($json, $composerFilePath); $package['dist'] = ['type' => 'path', 'url' => $url]; $reference = $this->options['reference'] ?? 'auto'; if ('none' === $reference) { $package['dist']['reference'] = null; } elseif ('config' === $reference || 'auto' === $reference) { $package['dist']['reference'] = \hash('sha1', $json . \serialize($this->options)); } // copy symlink/relative options to transport options $package['transport-options'] = \array_intersect_key($this->options, ['symlink' => \true, 'relative' => \true]); // use the version provided as option if available if (isset($package['name'], $this->options['versions'][$package['name']])) { $package['version'] = $this->options['versions'][$package['name']]; } // carry over the root package version if this path repo is in the same git repository as root package if (!isset($package['version']) && ($rootVersion = Platform::getEnv('COMPOSER_ROOT_VERSION'))) { if (0 === $this->process->execute(['git', 'rev-parse', 'HEAD'], $ref1, $path) && 0 === $this->process->execute(['git', 'rev-parse', 'HEAD'], $ref2) && $ref1 === $ref2) { $package['version'] = $this->versionGuesser->getRootVersionFromEnv(); } } $output = ''; if ('auto' === $reference && \is_dir($path . \DIRECTORY_SEPARATOR . '.git') && 0 === $this->process->execute(\array_merge(['git', 'log', '-n1', '--pretty=%H'], GitUtil::getNoShowSignatureFlags($this->process)), $output, $path)) { $package['dist']['reference'] = \trim($output); } if (!isset($package['version'])) { $versionData = $this->versionGuesser->guessVersion($package, $path); if (\is_array($versionData) && $versionData['pretty_version']) { // if there is a feature branch detected, we add a second packages with the feature branch version if (!empty($versionData['feature_pretty_version'])) { $package['version'] = $versionData['feature_pretty_version']; $this->addPackage($this->loader->load($package)); } $package['version'] = $versionData['pretty_version']; } else { $package['version'] = 'dev-main'; } } try { $this->addPackage($this->loader->load($package)); } catch (\Exception $e) { throw new \RuntimeException('Failed loading the package in ' . $composerFilePath, 0, $e); } } } /** * Get a list of all (possibly relative) path names matching given url (supports globbing). * * @return string[] */ private function getUrlMatches() : array { $flags = \GLOB_MARK | \GLOB_ONLYDIR; if (\defined('GLOB_BRACE')) { $flags |= \GLOB_BRACE; } elseif (\strpos($this->url, '{') !== \false || \strpos($this->url, '}') !== \false) { throw new \RuntimeException('The operating system does not support GLOB_BRACE which is required for the url ' . $this->url); } // Ensure environment-specific path separators are normalized to URL separators return \array_map(static function ($val) : string { return \rtrim(\str_replace(\DIRECTORY_SEPARATOR, '/', $val), '/'); }, \glob($this->url, $flags)); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; interface VersionCacheInterface { /** * @return mixed[]|null|false Package version data if found, false to indicate the identifier is known but has no package, null for an unknown identifier */ public function getVersionPackage(string $version, string $identifier); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; /** * Provides getCanonicalPackages() to various repository implementations * * @internal */ trait CanonicalPackagesTrait { /** * Get unique packages (at most one package of each name), with aliases resolved and removed. * * @return PackageInterface[] */ public function getCanonicalPackages() { $packages = $this->getPackages(); // get at most one package of each name, preferring non-aliased ones $packagesByName = []; foreach ($packages as $package) { if (!isset($packagesByName[$package->getName()]) || $packagesByName[$package->getName()] instanceof AliasPackage) { $packagesByName[$package->getName()] = $package; } } $canonicalPackages = []; // unfold aliased packages foreach ($packagesByName as $package) { while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $canonicalPackages[] = $package; } return $canonicalPackages; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; use Composer\Package\BasePackage; use Composer\Pcre\Preg; /** * Filters which packages are seen as canonical on this repo by loadPackages * * @author Jordi Boggiano */ class FilterRepository implements \Composer\Repository\RepositoryInterface, \Composer\Repository\AdvisoryProviderInterface { /** @var ?string */ private $only = null; /** @var ?non-empty-string */ private $exclude = null; /** @var bool */ private $canonical = \true; /** @var RepositoryInterface */ private $repo; /** * @param array{only?: array, exclude?: array, canonical?: bool} $options */ public function __construct(\Composer\Repository\RepositoryInterface $repo, array $options) { if (isset($options['only'])) { if (!\is_array($options['only'])) { throw new \InvalidArgumentException('"only" key for repository ' . $repo->getRepoName() . ' should be an array'); } $this->only = BasePackage::packageNamesToRegexp($options['only']); } if (isset($options['exclude'])) { if (!\is_array($options['exclude'])) { throw new \InvalidArgumentException('"exclude" key for repository ' . $repo->getRepoName() . ' should be an array'); } $this->exclude = BasePackage::packageNamesToRegexp($options['exclude']); } if ($this->exclude && $this->only) { throw new \InvalidArgumentException('Only one of "only" and "exclude" can be specified for repository ' . $repo->getRepoName()); } if (isset($options['canonical'])) { if (!\is_bool($options['canonical'])) { throw new \InvalidArgumentException('"canonical" key for repository ' . $repo->getRepoName() . ' should be a boolean'); } $this->canonical = $options['canonical']; } $this->repo = $repo; } public function getRepoName() : string { return $this->repo->getRepoName(); } /** * Returns the wrapped repositories */ public function getRepository() : \Composer\Repository\RepositoryInterface { return $this->repo; } /** * @inheritDoc */ public function hasPackage(PackageInterface $package) : bool { return $this->repo->hasPackage($package); } /** * @inheritDoc */ public function findPackage($name, $constraint) : ?BasePackage { if (!$this->isAllowed($name)) { return null; } return $this->repo->findPackage($name, $constraint); } /** * @inheritDoc */ public function findPackages($name, $constraint = null) : array { if (!$this->isAllowed($name)) { return []; } return $this->repo->findPackages($name, $constraint); } /** * @inheritDoc */ public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) : array { foreach ($packageNameMap as $name => $constraint) { if (!$this->isAllowed($name)) { unset($packageNameMap[$name]); } } if (!$packageNameMap) { return ['namesFound' => [], 'packages' => []]; } $result = $this->repo->loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); if (!$this->canonical) { $result['namesFound'] = []; } return $result; } /** * @inheritDoc */ public function search(string $query, int $mode = 0, ?string $type = null) : array { $result = []; foreach ($this->repo->search($query, $mode, $type) as $package) { if ($this->isAllowed($package['name'])) { $result[] = $package; } } return $result; } /** * @inheritDoc */ public function getPackages() : array { $result = []; foreach ($this->repo->getPackages() as $package) { if ($this->isAllowed($package->getName())) { $result[] = $package; } } return $result; } /** * @inheritDoc */ public function getProviders($packageName) : array { $result = []; foreach ($this->repo->getProviders($packageName) as $name => $provider) { if ($this->isAllowed($provider['name'])) { $result[$name] = $provider; } } return $result; } /** * @inheritDoc */ public function count() : int { if ($this->repo->count() > 0) { return \count($this->getPackages()); } return 0; } public function hasSecurityAdvisories() : bool { if (!$this->repo instanceof \Composer\Repository\AdvisoryProviderInterface) { return \false; } return $this->repo->hasSecurityAdvisories(); } /** * @inheritDoc */ public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPartialAdvisories = \false) : array { if (!$this->repo instanceof \Composer\Repository\AdvisoryProviderInterface) { return ['namesFound' => [], 'advisories' => []]; } foreach ($packageConstraintMap as $name => $constraint) { if (!$this->isAllowed($name)) { unset($packageConstraintMap[$name]); } } return $this->repo->getSecurityAdvisories($packageConstraintMap, $allowPartialAdvisories); } private function isAllowed(string $name) : bool { if (!$this->only && !$this->exclude) { return \true; } if ($this->only) { return Preg::isMatch($this->only, $name); } if ($this->exclude === null) { return \true; } return !Preg::isMatch($this->exclude, $name); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Package\RootPackageInterface; use Composer\Package\Link; /** * Installed repository is a composite of all installed repo types. * * The main use case is tagging a repo as an "installed" repository, and offering a way to get providers/replacers easily. * * Installed repos are LockArrayRepository, InstalledRepositoryInterface, RootPackageRepository and PlatformRepository * * @author Jordi Boggiano */ class InstalledRepository extends \Composer\Repository\CompositeRepository { /** * @param ConstraintInterface|string|null $constraint * * @return BasePackage[] */ public function findPackagesWithReplacersAndProviders(string $name, $constraint = null) : array { $name = \strtolower($name); if (null !== $constraint && !$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } $matches = []; foreach ($this->getRepositories() as $repo) { foreach ($repo->getPackages() as $candidate) { if ($name === $candidate->getName()) { if (null === $constraint || $constraint->matches(new Constraint('==', $candidate->getVersion()))) { $matches[] = $candidate; } continue; } foreach (\array_merge($candidate->getProvides(), $candidate->getReplaces()) as $link) { if ($name === $link->getTarget() && ($constraint === null || $constraint->matches($link->getConstraint()))) { $matches[] = $candidate; continue 2; } } } } return $matches; } /** * Returns a list of links causing the requested needle packages to be installed, as an associative array with the * dependent's name as key, and an array containing in order the PackageInterface and Link describing the relationship * as values. If recursive lookup was requested a third value is returned containing an identically formed array up * to the root package. That third value will be false in case a circular recursion was detected. * * @param string|string[] $needle The package name(s) to inspect. * @param ConstraintInterface|null $constraint Optional constraint to filter by. * @param bool $invert Whether to invert matches to discover reasons for the package *NOT* to be installed. * @param bool $recurse Whether to recursively expand the requirement tree up to the root package. * @param string[] $packagesFound Used internally when recurring * * @return array[] An associative array of arrays as described above. * @phpstan-return array|false}> */ public function getDependents($needle, ?ConstraintInterface $constraint = null, bool $invert = \false, bool $recurse = \true, ?array $packagesFound = null) : array { $needles = \array_map('strtolower', (array) $needle); $results = []; // initialize the array with the needles before any recursion occurs if (null === $packagesFound) { $packagesFound = $needles; } // locate root package for use below $rootPackage = null; foreach ($this->getPackages() as $package) { if ($package instanceof RootPackageInterface) { $rootPackage = $package; break; } } // Loop over all currently installed packages. foreach ($this->getPackages() as $package) { $links = $package->getRequires(); // each loop needs its own "tree" as we want to show the complete dependent set of every needle // without warning all the time about finding circular deps $packagesInTree = $packagesFound; // Replacements are considered valid reasons for a package to be installed during forward resolution if (!$invert) { $links += $package->getReplaces(); // On forward search, check if any replaced package was required and add the replaced // packages to the list of needles. Contrary to the cross-reference link check below, // replaced packages are the target of links. foreach ($package->getReplaces() as $link) { foreach ($needles as $needle) { if ($link->getSource() === $needle) { if ($constraint === null || $link->getConstraint()->matches($constraint) === \true) { // already displayed this node's dependencies, cutting short if (\in_array($link->getTarget(), $packagesInTree)) { $results[] = [$package, $link, \false]; continue; } $packagesInTree[] = $link->getTarget(); $dependents = $recurse ? $this->getDependents($link->getTarget(), null, \false, \true, $packagesInTree) : []; $results[] = [$package, $link, $dependents]; $needles[] = $link->getTarget(); } } } } unset($needle); } // Require-dev is only relevant for the root package if ($package instanceof RootPackageInterface) { $links += $package->getDevRequires(); } // Cross-reference all discovered links to the needles foreach ($links as $link) { foreach ($needles as $needle) { if ($link->getTarget() === $needle) { if ($constraint === null || $link->getConstraint()->matches($constraint) === !$invert) { // already displayed this node's dependencies, cutting short if (\in_array($link->getSource(), $packagesInTree)) { $results[] = [$package, $link, \false]; continue; } $packagesInTree[] = $link->getSource(); $dependents = $recurse ? $this->getDependents($link->getSource(), null, \false, \true, $packagesInTree) : []; $results[] = [$package, $link, $dependents]; } } } } // When inverting, we need to check for conflicts of the needles against installed packages if ($invert && \in_array($package->getName(), $needles, \true)) { foreach ($package->getConflicts() as $link) { foreach ($this->findPackages($link->getTarget()) as $pkg) { $version = new Constraint('=', $pkg->getVersion()); if ($link->getConstraint()->matches($version) === $invert) { $results[] = [$package, $link, \false]; } } } } // List conflicts against X as they may explain why the current version was selected, or explain why it is rejected if the conflict matched when inverting foreach ($package->getConflicts() as $link) { if (\in_array($link->getTarget(), $needles, \true)) { foreach ($this->findPackages($link->getTarget()) as $pkg) { $version = new Constraint('=', $pkg->getVersion()); if ($link->getConstraint()->matches($version) === $invert) { $results[] = [$package, $link, \false]; } } } } // When inverting, we need to check for conflicts of the needles' requirements against installed packages if ($invert && $constraint && \in_array($package->getName(), $needles, \true) && $constraint->matches(new Constraint('=', $package->getVersion()))) { foreach ($package->getRequires() as $link) { if (\Composer\Repository\PlatformRepository::isPlatformPackage($link->getTarget())) { if ($this->findPackage($link->getTarget(), $link->getConstraint())) { continue; } $platformPkg = $this->findPackage($link->getTarget(), '*'); $description = $platformPkg ? 'but ' . $platformPkg->getPrettyVersion() . ' is installed' : 'but it is missing'; $results[] = [$package, new Link($package->getName(), $link->getTarget(), new MatchAllConstraint(), Link::TYPE_REQUIRE, $link->getPrettyConstraint() . ' ' . $description), \false]; continue; } foreach ($this->getPackages() as $pkg) { if (!\in_array($link->getTarget(), $pkg->getNames())) { continue; } $version = new Constraint('=', $pkg->getVersion()); if ($link->getTarget() !== $pkg->getName()) { foreach (\array_merge($pkg->getReplaces(), $pkg->getProvides()) as $prov) { if ($link->getTarget() === $prov->getTarget()) { $version = $prov->getConstraint(); break; } } } if (!$link->getConstraint()->matches($version)) { // if we have a root package (we should but can not guarantee..) we show // the root requires as well to perhaps allow to find an issue there if ($rootPackage) { foreach (\array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()) as $rootReq) { if (\in_array($rootReq->getTarget(), $pkg->getNames()) && !$rootReq->getConstraint()->matches($link->getConstraint())) { $results[] = [$package, $link, \false]; $results[] = [$rootPackage, $rootReq, \false]; continue 3; } } $results[] = [$package, $link, \false]; $results[] = [$rootPackage, new Link($rootPackage->getName(), $link->getTarget(), new MatchAllConstraint(), Link::TYPE_DOES_NOT_REQUIRE, 'but ' . $pkg->getPrettyVersion() . ' is installed'), \false]; } else { // no root so let's just print whatever we found $results[] = [$package, $link, \false]; } } continue 2; } } } } \ksort($results); return $results; } public function getRepoName() : string { return 'installed repo (' . \implode(', ', \array_map(static function ($repo) : string { return $repo->getRepoName(); }, $this->getRepositories())) . ')'; } /** * @inheritDoc */ public function addRepository(\Composer\Repository\RepositoryInterface $repository) : void { if ($repository instanceof \Composer\Repository\LockArrayRepository || $repository instanceof \Composer\Repository\InstalledRepositoryInterface || $repository instanceof \Composer\Repository\RootPackageRepository || $repository instanceof \Composer\Repository\PlatformRepository) { parent::addRepository($repository); return; } throw new \LogicException('An InstalledRepository can not contain a repository of type ' . \get_class($repository) . ' (' . $repository->getRepoName() . ')'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Advisory\PartialSecurityAdvisory; use Composer\Advisory\SecurityAdvisory; /** * Repositories that allow fetching security advisory data * * @author Jordi Boggiano * @internal */ interface AdvisoryProviderInterface { public function hasSecurityAdvisories() : bool; /** * @param array $packageConstraintMap Map of package name to constraint (can be MatchAllConstraint to fetch all advisories) * @return ($allowPartialAdvisories is true ? array{namesFound: string[], advisories: array>} : array{namesFound: string[], advisories: array>}) */ public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPartialAdvisories = \false) : array; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; use Composer\Package\PackageInterface; use Composer\Package\RootAliasPackage; use Composer\Package\RootPackageInterface; use Composer\Package\AliasPackage; use Composer\Package\Dumper\ArrayDumper; use Composer\Installer\InstallationManager; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; /** * Filesystem repository. * * @author Konstantin Kudryashov * @author Jordi Boggiano */ class FilesystemRepository extends \Composer\Repository\WritableArrayRepository { /** @var JsonFile */ protected $file; /** @var bool */ private $dumpVersions; /** @var ?RootPackageInterface */ private $rootPackage; /** @var Filesystem */ private $filesystem; /** @var bool|null */ private $devMode = null; /** * Initializes filesystem repository. * * @param JsonFile $repositoryFile repository json file * @param ?RootPackageInterface $rootPackage Must be provided if $dumpVersions is true */ public function __construct(JsonFile $repositoryFile, bool $dumpVersions = \false, ?RootPackageInterface $rootPackage = null, ?Filesystem $filesystem = null) { parent::__construct(); $this->file = $repositoryFile; $this->dumpVersions = $dumpVersions; $this->rootPackage = $rootPackage; $this->filesystem = $filesystem ?: new Filesystem(); if ($dumpVersions && !$rootPackage) { throw new \InvalidArgumentException('Expected a root package instance if $dumpVersions is true'); } } /** * @return bool|null true if dev requirements were installed, false if --no-dev was used, null if yet unknown */ public function getDevMode() { return $this->devMode; } /** * Initializes repository (reads file, or remote address). */ protected function initialize() { parent::initialize(); if (!$this->file->exists()) { return; } try { $data = $this->file->read(); if (isset($data['packages'])) { $packages = $data['packages']; } else { $packages = $data; } if (isset($data['dev-package-names'])) { $this->setDevPackageNames($data['dev-package-names']); } if (isset($data['dev'])) { $this->devMode = $data['dev']; } if (!\is_array($packages)) { throw new \UnexpectedValueException('Could not parse package list from the repository'); } } catch (\Exception $e) { throw new \Composer\Repository\InvalidRepositoryException('Invalid repository data in ' . $this->file->getPath() . ', packages could not be loaded: [' . \get_class($e) . '] ' . $e->getMessage()); } $loader = new ArrayLoader(null, \true); foreach ($packages as $packageData) { $package = $loader->load($packageData); $this->addPackage($package); } } public function reload() { $this->packages = null; $this->initialize(); } /** * Writes writable repository. */ public function write(bool $devMode, InstallationManager $installationManager) { $data = ['packages' => [], 'dev' => $devMode, 'dev-package-names' => []]; $dumper = new ArrayDumper(); // make sure the directory is created so we can realpath it // as realpath() does some additional normalizations with network paths that normalizePath does not // and we need to find shortest path correctly $repoDir = \dirname($this->file->getPath()); $this->filesystem->ensureDirectoryExists($repoDir); $repoDir = $this->filesystem->normalizePath(\realpath($repoDir)); $installPaths = []; foreach ($this->getCanonicalPackages() as $package) { $pkgArray = $dumper->dump($package); $path = $installationManager->getInstallPath($package); $installPath = null; if ('' !== $path && null !== $path) { $normalizedPath = $this->filesystem->normalizePath($this->filesystem->isAbsolutePath($path) ? $path : Platform::getCwd() . '/' . $path); $installPath = $this->filesystem->findShortestPath($repoDir, $normalizedPath, \true); } $installPaths[$package->getName()] = $installPath; $pkgArray['install-path'] = $installPath; $data['packages'][] = $pkgArray; // only write to the files the names which are really installed, as we receive the full list // of dev package names before they get installed during composer install if (\in_array($package->getName(), $this->devPackageNames, \true)) { $data['dev-package-names'][] = $package->getName(); } } \sort($data['dev-package-names']); \usort($data['packages'], static function ($a, $b) : int { return \strcmp($a['name'], $b['name']); }); $this->file->write($data); if ($this->dumpVersions) { $versions = $this->generateInstalledVersions($installationManager, $installPaths, $devMode, $repoDir); $this->filesystem->filePutContentsIfModified($repoDir . '/installed.php', 'dumpToPhpCode($versions) . ';' . "\n"); $installedVersionsClass = \file_get_contents(__DIR__ . '/../InstalledVersions.php'); // this normally should not happen but during upgrades of Composer when it is installed in the project it is a possibility if ($installedVersionsClass !== \false) { $this->filesystem->filePutContentsIfModified($repoDir . '/InstalledVersions.php', $installedVersionsClass); \Composer\InstalledVersions::reload($versions); } } } /** * As we load the file from vendor dir during bootstrap, we need to make sure it contains only expected code before executing it * * @internal */ public static function safelyLoadInstalledVersions(string $path) : bool { $installedVersionsData = @\file_get_contents($path); $pattern = <<<'REGEX' {(?(DEFINE) (? -? \s*+ \d++ (?:\.\d++)? ) (? true | false | null ) (? (?&string) (?: \s*+ \. \s*+ (?&string))*+ ) (? (?: " (?:[^"\\$]*+ | \\ ["\\0] )* " | ' (?:[^'\\]*+ | \\ ['\\] )* ' ) ) (? array\( \s*+ (?: (?:(?&number)|(?&strings)) \s*+ => \s*+ (?: (?:__DIR__ \s*+ \. \s*+)? (?&strings) | (?&value) ) \s*+, \s*+ )*+ \s*+ \) ) (? (?: (?&number) | (?&boolean) | (?&strings) | (?&array) ) ) ) ^<\?php\s++return\s++(?&array)\s*+;$}ix REGEX; if (\is_string($installedVersionsData) && Preg::isMatch($pattern, \trim($installedVersionsData))) { \Composer\InstalledVersions::reload(eval('?>' . Preg::replace('{=>\\s*+__DIR__\\s*+\\.\\s*+([\'"])}', '=> ' . \var_export(\dirname($path), \true) . ' . $1', $installedVersionsData))); return \true; } return \false; } /** * @param array $array */ private function dumpToPhpCode(array $array = [], int $level = 0) : string { $lines = "array(\n"; $level++; foreach ($array as $key => $value) { $lines .= \str_repeat(' ', $level); $lines .= \is_int($key) ? $key . ' => ' : \var_export($key, \true) . ' => '; if (\is_array($value)) { if (!empty($value)) { $lines .= $this->dumpToPhpCode($value, $level); } else { $lines .= "array(),\n"; } } elseif ($key === 'install_path' && \is_string($value)) { if ($this->filesystem->isAbsolutePath($value)) { $lines .= \var_export($value, \true) . ",\n"; } else { $lines .= "__DIR__ . " . \var_export('/' . $value, \true) . ",\n"; } } elseif (\is_string($value)) { $lines .= \var_export($value, \true) . ",\n"; } elseif (\is_bool($value)) { $lines .= ($value ? 'true' : 'false') . ",\n"; } elseif (\is_null($value)) { $lines .= "null,\n"; } else { throw new \UnexpectedValueException('Unexpected type ' . \gettype($value)); } } $lines .= \str_repeat(' ', $level - 1) . ')' . ($level - 1 === 0 ? '' : ",\n"); return $lines; } /** * @param array $installPaths * * @return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ private function generateInstalledVersions(InstallationManager $installationManager, array $installPaths, bool $devMode, string $repoDir) : array { $devPackages = \array_flip($this->devPackageNames); $packages = $this->getPackages(); if (null === $this->rootPackage) { throw new \LogicException('It should not be possible to dump packages if no root package is given'); } $packages[] = $rootPackage = $this->rootPackage; while ($rootPackage instanceof RootAliasPackage) { $rootPackage = $rootPackage->getAliasOf(); $packages[] = $rootPackage; } $versions = ['root' => $this->dumpRootPackage($rootPackage, $installPaths, $devMode, $repoDir, $devPackages), 'versions' => []]; // add real installed packages foreach ($packages as $package) { if ($package instanceof AliasPackage) { continue; } $versions['versions'][$package->getName()] = $this->dumpInstalledPackage($package, $installPaths, $repoDir, $devPackages); } // add provided/replaced packages foreach ($packages as $package) { $isDevPackage = isset($devPackages[$package->getName()]); foreach ($package->getReplaces() as $replace) { // exclude platform replaces as when they are really there we can not check for their presence if (\Composer\Repository\PlatformRepository::isPlatformPackage($replace->getTarget())) { continue; } if (!isset($versions['versions'][$replace->getTarget()]['dev_requirement'])) { $versions['versions'][$replace->getTarget()]['dev_requirement'] = $isDevPackage; } elseif (!$isDevPackage) { $versions['versions'][$replace->getTarget()]['dev_requirement'] = \false; } $replaced = $replace->getPrettyConstraint(); if ($replaced === 'self.version') { $replaced = $package->getPrettyVersion(); } if (!isset($versions['versions'][$replace->getTarget()]['replaced']) || !\in_array($replaced, $versions['versions'][$replace->getTarget()]['replaced'], \true)) { $versions['versions'][$replace->getTarget()]['replaced'][] = $replaced; } } foreach ($package->getProvides() as $provide) { // exclude platform provides as when they are really there we can not check for their presence if (\Composer\Repository\PlatformRepository::isPlatformPackage($provide->getTarget())) { continue; } if (!isset($versions['versions'][$provide->getTarget()]['dev_requirement'])) { $versions['versions'][$provide->getTarget()]['dev_requirement'] = $isDevPackage; } elseif (!$isDevPackage) { $versions['versions'][$provide->getTarget()]['dev_requirement'] = \false; } $provided = $provide->getPrettyConstraint(); if ($provided === 'self.version') { $provided = $package->getPrettyVersion(); } if (!isset($versions['versions'][$provide->getTarget()]['provided']) || !\in_array($provided, $versions['versions'][$provide->getTarget()]['provided'], \true)) { $versions['versions'][$provide->getTarget()]['provided'][] = $provided; } } } // add aliases foreach ($packages as $package) { if (!$package instanceof AliasPackage) { continue; } $versions['versions'][$package->getName()]['aliases'][] = $package->getPrettyVersion(); if ($package instanceof RootPackageInterface) { $versions['root']['aliases'][] = $package->getPrettyVersion(); } } \ksort($versions['versions']); \ksort($versions); foreach ($versions['versions'] as $name => $version) { foreach (['aliases', 'replaced', 'provided'] as $key) { if (isset($versions['versions'][$name][$key])) { \sort($versions['versions'][$name][$key], \SORT_NATURAL); } } } return $versions; } /** * @param array $installPaths * @param array $devPackages * @return array{pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev_requirement: bool} */ private function dumpInstalledPackage(PackageInterface $package, array $installPaths, string $repoDir, array $devPackages) : array { $reference = null; if ($package->getInstallationSource()) { $reference = $package->getInstallationSource() === 'source' ? $package->getSourceReference() : $package->getDistReference(); } if (null === $reference) { $reference = ($package->getSourceReference() ?: $package->getDistReference()) ?: null; } if ($package instanceof RootPackageInterface) { $to = $this->filesystem->normalizePath(\realpath(Platform::getCwd())); $installPath = $this->filesystem->findShortestPath($repoDir, $to, \true); } else { $installPath = $installPaths[$package->getName()]; } $data = ['pretty_version' => $package->getPrettyVersion(), 'version' => $package->getVersion(), 'reference' => $reference, 'type' => $package->getType(), 'install_path' => $installPath, 'aliases' => [], 'dev_requirement' => isset($devPackages[$package->getName()])]; return $data; } /** * @param array $installPaths * @param array $devPackages * @return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ private function dumpRootPackage(RootPackageInterface $package, array $installPaths, bool $devMode, string $repoDir, array $devPackages) { $data = $this->dumpInstalledPackage($package, $installPaths, $repoDir, $devPackages); return ['name' => $package->getName(), 'pretty_version' => $data['pretty_version'], 'version' => $data['version'], 'reference' => $data['reference'], 'type' => $data['type'], 'install_path' => $data['install_path'], 'aliases' => $data['aliases'], 'dev' => $devMode]; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Installed array repository. * * This is used as an in-memory InstalledRepository mostly for testing purposes * * @author Jordi Boggiano */ class InstalledArrayRepository extends \Composer\Repository\WritableArrayRepository implements \Composer\Repository\InstalledRepositoryInterface { public function getRepoName() : string { return 'installed ' . parent::getRepoName(); } /** * @inheritDoc */ public function isFresh() : bool { // this is not a completely correct implementation but there is no way to // distinguish an empty repo and a newly created one given this is all in-memory return $this->count() === 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Configurable repository interface. * * @author Lukas Homza */ interface ConfigurableRepositoryInterface { /** * @return mixed[] */ public function getRepoConfig(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Exception thrown when a package repository is utterly broken * * @author Jordi Boggiano */ class InvalidRepositoryException extends \Exception { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; class PackageSorter { /** * Returns the most recent version of a set of packages * * This is ideally the default branch version, or failing that it will return the package with the highest version * * @template T of PackageInterface * @param array $packages * @return ($packages is non-empty-array ? T : T|null) */ public static function getMostCurrentVersion(array $packages) : ?PackageInterface { if (\count($packages) === 0) { return null; } $highest = \reset($packages); foreach ($packages as $candidate) { if ($candidate->isDefaultBranch()) { return $candidate; } if (\version_compare($highest->getVersion(), $candidate->getVersion(), '<')) { $highest = $candidate; } } return $highest; } /** * Sorts packages by name * * @template T of PackageInterface * @param array $packages * @return array */ public static function sortPackagesAlphabetically(array $packages) : array { \usort($packages, static function (PackageInterface $a, PackageInterface $b) { return $a->getName() <=> $b->getName(); }); return $packages; } /** * Sorts packages by dependency weight * * Packages of equal weight are sorted alphabetically * * @param PackageInterface[] $packages * @param array $weights Pre-set weights for some packages to give them more (negative number) or less (positive) weight offsets * @return PackageInterface[] sorted array */ public static function sortPackages(array $packages, array $weights = []) : array { $usageList = []; foreach ($packages as $package) { $links = $package->getRequires(); if ($package instanceof RootPackageInterface) { $links = \array_merge($links, $package->getDevRequires()); } foreach ($links as $link) { $target = $link->getTarget(); $usageList[$target][] = $package->getName(); } } $computing = []; $computed = []; $computeImportance = static function ($name) use(&$computeImportance, &$computing, &$computed, $usageList, $weights) { // reusing computed importance if (isset($computed[$name])) { return $computed[$name]; } // canceling circular dependency if (isset($computing[$name])) { return 0; } $computing[$name] = \true; $weight = $weights[$name] ?? 0; if (isset($usageList[$name])) { foreach ($usageList[$name] as $user) { $weight -= 1 - $computeImportance($user); } } unset($computing[$name]); $computed[$name] = $weight; return $weight; }; $weightedPackages = []; foreach ($packages as $index => $package) { $name = $package->getName(); $weight = $computeImportance($name); $weightedPackages[] = ['name' => $name, 'weight' => $weight, 'index' => $index]; } \usort($weightedPackages, static function (array $a, array $b) : int { if ($a['weight'] !== $b['weight']) { return $a['weight'] - $b['weight']; } return \strnatcasecmp($a['name'], $b['name']); }); $sortedPackages = []; foreach ($weightedPackages as $pkg) { $sortedPackages[] = $packages[$pkg['index']]; } return $sortedPackages; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Package\Loader\InvalidPackageException; use Composer\Json\JsonValidationException; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Pcre\Preg; use Composer\Spdx\SpdxLicenses; use _ContaoManager\Seld\JsonLint\DuplicateKeyException; use _ContaoManager\Seld\JsonLint\JsonParser; /** * Validates a composer configuration. * * @author Robert Schönthal * @author Jordi Boggiano */ class ConfigValidator { public const CHECK_VERSION = 1; /** @var IOInterface */ private $io; public function __construct(IOInterface $io) { $this->io = $io; } /** * Validates the config, and returns the result. * * @param string $file The path to the file * @param int $arrayLoaderValidationFlags Flags for ArrayLoader validation * @param int $flags Flags for validation * * @return array{list, list, list} a triple containing the errors, publishable errors, and warnings */ public function validate(string $file, int $arrayLoaderValidationFlags = ValidatingArrayLoader::CHECK_ALL, int $flags = self::CHECK_VERSION) : array { $errors = []; $publishErrors = []; $warnings = []; // validate json schema $laxValid = \false; $manifest = null; try { $json = new JsonFile($file, null, $this->io); $manifest = $json->read(); $json->validateSchema(JsonFile::LAX_SCHEMA); $laxValid = \true; $json->validateSchema(); } catch (JsonValidationException $e) { foreach ($e->getErrors() as $message) { if ($laxValid) { $publishErrors[] = $message; } else { $errors[] = $message; } } } catch (\Exception $e) { $errors[] = $e->getMessage(); return [$errors, $publishErrors, $warnings]; } if (\is_array($manifest)) { $jsonParser = new JsonParser(); try { $jsonParser->parse((string) \file_get_contents($file), JsonParser::DETECT_KEY_CONFLICTS); } catch (DuplicateKeyException $e) { $details = $e->getDetails(); $warnings[] = 'Key ' . $details['key'] . ' is a duplicate in ' . $file . ' at line ' . $details['line']; } } // validate actual data if (empty($manifest['license'])) { $warnings[] = 'No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.'; } else { $licenses = (array) $manifest['license']; // strip proprietary since it's not a valid SPDX identifier, but is accepted by composer foreach ($licenses as $key => $license) { if ('proprietary' === $license) { unset($licenses[$key]); } } $licenseValidator = new SpdxLicenses(); foreach ($licenses as $license) { $spdxLicense = $licenseValidator->getLicenseByIdentifier($license); if ($spdxLicense && $spdxLicense[3]) { if (Preg::isMatch('{^[AL]?GPL-[123](\\.[01])?\\+$}i', $license)) { $warnings[] = \sprintf('License "%s" is a deprecated SPDX license identifier, use "' . \str_replace('+', '', $license) . '-or-later" instead', $license); } elseif (Preg::isMatch('{^[AL]?GPL-[123](\\.[01])?$}i', $license)) { $warnings[] = \sprintf('License "%s" is a deprecated SPDX license identifier, use "' . $license . '-only" or "' . $license . '-or-later" instead', $license); } else { $warnings[] = \sprintf('License "%s" is a deprecated SPDX license identifier, see https://spdx.org/licenses/', $license); } } } } if ($flags & self::CHECK_VERSION && isset($manifest['version'])) { $warnings[] = 'The version field is present, it is recommended to leave it out if the package is published on Packagist.'; } if (!empty($manifest['name']) && Preg::isMatch('{[A-Z]}', $manifest['name'])) { $suggestName = Preg::replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '_ContaoManager\\1\\3-\\2\\4', $manifest['name']); $suggestName = \strtolower($suggestName); $publishErrors[] = \sprintf('Name "%s" does not match the best practice (e.g. lower-cased/with-dashes). We suggest using "%s" instead. As such you will not be able to submit it to Packagist.', $manifest['name'], $suggestName); } if (!empty($manifest['type']) && $manifest['type'] === 'composer-installer') { $warnings[] = "The package type 'composer-installer' is deprecated. Please distribute your custom installers as plugins from now on. See https://getcomposer.org/doc/articles/plugins.md for plugin documentation."; } // check for require-dev overrides if (isset($manifest['require'], $manifest['require-dev'])) { $requireOverrides = \array_intersect_key($manifest['require'], $manifest['require-dev']); if (!empty($requireOverrides)) { $plural = \count($requireOverrides) > 1 ? 'are' : 'is'; $warnings[] = \implode(', ', \array_keys($requireOverrides)) . " {$plural} required both in require and require-dev, this can lead to unexpected behavior"; } } // check for meaningless provide/replace satisfying requirements foreach (['provide', 'replace'] as $linkType) { if (isset($manifest[$linkType])) { foreach (['require', 'require-dev'] as $requireType) { if (isset($manifest[$requireType])) { foreach ($manifest[$linkType] as $provide => $constraint) { if (isset($manifest[$requireType][$provide])) { $warnings[] = 'The package ' . $provide . ' in ' . $requireType . ' is also listed in ' . $linkType . ' which satisfies the requirement. Remove it from ' . $linkType . ' if you wish to install it.'; } } } } } } // check for commit references $require = $manifest['require'] ?? []; $requireDev = $manifest['require-dev'] ?? []; $packages = \array_merge($require, $requireDev); foreach ($packages as $package => $version) { if (Preg::isMatch('/#/', $version)) { $warnings[] = \sprintf('The package "%s" is pointing to a commit-ref, this is bad practice and can cause unforeseen issues.', $package); } } // report scripts-descriptions for non-existent scripts $scriptsDescriptions = $manifest['scripts-descriptions'] ?? []; $scripts = $manifest['scripts'] ?? []; foreach ($scriptsDescriptions as $scriptName => $scriptDescription) { if (!\array_key_exists($scriptName, $scripts)) { $warnings[] = \sprintf('Description for non-existent script "%s" found in "scripts-descriptions"', $scriptName); } } // report scripts-aliases for non-existent scripts $scriptAliases = $manifest['scripts-aliases'] ?? []; foreach ($scriptAliases as $scriptName => $scriptAlias) { if (!\array_key_exists($scriptName, $scripts)) { $warnings[] = \sprintf('Aliases for non-existent script "%s" found in "scripts-aliases"', $scriptName); } } // check for empty psr-0/psr-4 namespace prefixes if (isset($manifest['autoload']['psr-0'][''])) { $warnings[] = "Defining autoload.psr-0 with an empty namespace prefix is a bad idea for performance"; } if (isset($manifest['autoload']['psr-4'][''])) { $warnings[] = "Defining autoload.psr-4 with an empty namespace prefix is a bad idea for performance"; } $loader = new ValidatingArrayLoader(new ArrayLoader(), \true, null, $arrayLoaderValidationFlags); try { if (!isset($manifest['version'])) { $manifest['version'] = '1.0.0'; } if (!isset($manifest['name'])) { $manifest['name'] = 'dummy/dummy'; } $loader->load($manifest); } catch (InvalidPackageException $e) { $errors = \array_merge($errors, $e->getErrors()); } $warnings = \array_merge($warnings, $loader->getWarnings()); return [$errors, $publishErrors, $warnings]; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class Git { /** @var string|false|null */ private static $version = \false; /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var Filesystem */ protected $filesystem; /** @var HttpDownloader */ protected $httpDownloader; public function __construct(IOInterface $io, Config $config, \Composer\Util\ProcessExecutor $process, \Composer\Util\Filesystem $fs) { $this->io = $io; $this->config = $config; $this->process = $process; $this->filesystem = $fs; } /** * @param IOInterface|null $io If present, a warning is output there instead of throwing, so pass this in only for cases where this is a soft failure */ public static function checkForRepoOwnershipError(string $output, string $path, ?IOInterface $io = null) : void { if (\str_contains($output, 'fatal: detected dubious ownership')) { $msg = 'The repository at "' . $path . '" does not have the correct ownership and git refuses to use it:' . \PHP_EOL . \PHP_EOL . $output; if ($io === null) { throw new \RuntimeException($msg); } $io->writeError('' . $msg . ''); } } public function setHttpDownloader(\Composer\Util\HttpDownloader $httpDownloader) : void { $this->httpDownloader = $httpDownloader; } /** * Runs a set of commands using the $url or a variation of it (with auth, ssh, ..) * * Commands should use %url% placeholders for the URL instead of inlining it to allow this function to do its job * %sanitizedUrl% is also automatically replaced by the url without user/pass * * As soon as a single command fails it will halt, so assume the commands are run as && in bash * * @param non-empty-array> $commands * @param mixed $commandOutput the output will be written into this var if passed by ref * if a callable is passed it will be used as output handler */ public function runCommands(array $commands, string $url, ?string $cwd, bool $initialClone = \false, &$commandOutput = null) : void { $callables = []; foreach ($commands as $cmd) { $callables[] = static function (string $url) use($cmd) : array { $map = ['%url%' => $url, '%sanitizedUrl%' => Preg::replace('{://([^@]+?):(.+?)@}', '://', $url)]; return \array_map(static function ($value) use($map) : string { return $map[$value] ?? $value; }, $cmd); }; } // @phpstan-ignore method.deprecated $this->runCommand($callables, $url, $cwd, $initialClone, $commandOutput); } /** * @param callable|array $commandCallable * @param mixed $commandOutput the output will be written into this var if passed by ref * if a callable is passed it will be used as output handler * @deprecated Use runCommands with placeholders instead of callbacks for simplicity */ public function runCommand($commandCallable, string $url, ?string $cwd, bool $initialClone = \false, &$commandOutput = null) : void { $commandCallables = \is_callable($commandCallable) ? [$commandCallable] : $commandCallable; $lastCommand = ''; // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); if ($initialClone) { $origCwd = $cwd; } $runCommands = function ($url) use($commandCallables, $cwd, &$commandOutput, &$lastCommand, $initialClone) { $collectOutputs = !\is_callable($commandOutput); $outputs = []; $status = 0; $counter = 0; foreach ($commandCallables as $callable) { $lastCommand = $callable($url); if ($collectOutputs) { $outputs[] = ''; $output =& $outputs[\count($outputs) - 1]; } else { $output =& $commandOutput; } $status = $this->process->execute($lastCommand, $output, $initialClone && $counter === 0 ? null : $cwd); if ($status !== 0) { break; } $counter++; } if ($collectOutputs) { $commandOutput = \implode('', $outputs); } return $status; }; if (Preg::isMatch('{^ssh://[^@]+@[^:]+:[^0-9]+}', $url)) { throw new \InvalidArgumentException('The source URL ' . $url . ' is invalid, ssh URLs should have a port number after ":".' . "\n" . 'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.'); } if (!$initialClone) { // capture username/password from URL if there is one and we have no auth configured yet $this->process->execute(['git', 'remote', '-v'], $output, $cwd); if (Preg::isMatchStrictGroups('{^(?:composer|origin)\\s+https?://(.+):(.+)@([^/]+)}im', $output, $match) && !$this->io->hasAuthentication($match[3])) { $this->io->setAuthentication($match[3], \rawurldecode($match[1]), \rawurldecode($match[2])); } } $protocols = $this->config->get('github-protocols'); // public github, autoswitch protocols // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups if (Preg::isMatchStrictGroups('{^(?:https?|git)://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)) { $messages = []; foreach ($protocols as $protocol) { if ('ssh' === $protocol) { $protoUrl = "git@" . $match[1] . ":" . $match[2]; } else { $protoUrl = $protocol . "://" . $match[1] . "/" . $match[2]; } if (0 === $runCommands($protoUrl)) { return; } $messages[] = '- ' . $protoUrl . "\n" . Preg::replace('#^#m', ' ', $this->process->getErrorOutput()); if ($initialClone && isset($origCwd)) { $this->filesystem->removeDirectory($origCwd); } } // failed to checkout, first check git accessibility if (!$this->io->hasAuthentication($match[1]) && !$this->io->isInteractive()) { $this->throwException('Failed to clone ' . $url . ' via ' . \implode(', ', $protocols) . ' protocols, aborting.' . "\n\n" . \implode("\n", $messages), $url); } } // if we have a private github url and the ssh protocol is disabled then we skip it and directly fallback to https $bypassSshForGitHub = Preg::isMatch('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\\.git$}i', $url) && !\in_array('ssh', $protocols, \true); $auth = null; $credentials = []; if ($bypassSshForGitHub || 0 !== $runCommands($url)) { $errorMsg = $this->process->getErrorOutput(); // private github repository without ssh key access, try https with auth // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups if (Preg::isMatchStrictGroups('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\\.git$}i', $url, $match) || Preg::isMatchStrictGroups('{^https?://' . self::getGitHubDomainsRegex($this->config) . '/(.*?)(?:\\.git)?$}i', $url, $match)) { if (!$this->io->hasAuthentication($match[1])) { $gitHubUtil = new \Composer\Util\GitHub($this->io, $this->config, $this->process); $message = 'Cloning failed using an ssh key for authentication, enter your GitHub credentials to access private repos'; if (!$gitHubUtil->authorizeOAuth($match[1]) && $this->io->isInteractive()) { $gitHubUtil->authorizeOAuthInteractively($match[1], $message); } } if ($this->io->hasAuthentication($match[1])) { $auth = $this->io->getAuthentication($match[1]); $authUrl = 'https://' . \rawurlencode($auth['username']) . ':' . \rawurlencode($auth['password']) . '@' . $match[1] . '/' . $match[2] . '.git'; if (0 === $runCommands($authUrl)) { return; } $credentials = [\rawurlencode($auth['username']), \rawurlencode($auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups } elseif (Preg::isMatchStrictGroups('{^(https?)://(bitbucket\\.org)/(.*?)(?:\\.git)?$}i', $url, $match) || Preg::isMatchStrictGroups('{^(git)@(bitbucket\\.org):(.+?\\.git)$}i', $url, $match)) { //bitbucket either through oauth or app password, with fallback to ssh. $bitbucketUtil = new \Composer\Util\Bitbucket($this->io, $this->config, $this->process, $this->httpDownloader); $domain = $match[2]; $repo_with_git_part = $match[3]; if (!\str_ends_with($repo_with_git_part, '.git')) { $repo_with_git_part .= '.git'; } if (!$this->io->hasAuthentication($domain)) { $message = 'Enter your Bitbucket credentials to access private repos'; if (!$bitbucketUtil->authorizeOAuth($domain) && $this->io->isInteractive()) { $bitbucketUtil->authorizeOAuthInteractively($match[1], $message); $accessToken = $bitbucketUtil->getToken(); $this->io->setAuthentication($domain, 'x-token-auth', $accessToken); } } // First we try to authenticate with whatever we have stored. // This will be successful if there is for example an app // password in there. if ($this->io->hasAuthentication($domain)) { $auth = $this->io->getAuthentication($domain); $authUrl = 'https://' . \rawurlencode($auth['username']) . ':' . \rawurlencode($auth['password']) . '@' . $domain . '/' . $repo_with_git_part; if (0 === $runCommands($authUrl)) { // Well if that succeeded on our first try, let's just // take the win. return; } //We already have an access_token from a previous request. if ($auth['username'] !== 'x-token-auth') { $accessToken = $bitbucketUtil->requestToken($domain, $auth['username'], $auth['password']); if (!empty($accessToken)) { $this->io->setAuthentication($domain, 'x-token-auth', $accessToken); } } } if ($this->io->hasAuthentication($domain)) { $auth = $this->io->getAuthentication($domain); $authUrl = 'https://' . \rawurlencode($auth['username']) . ':' . \rawurlencode($auth['password']) . '@' . $domain . '/' . $repo_with_git_part; if (0 === $runCommands($authUrl)) { return; } $credentials = [\rawurlencode($auth['username']), \rawurlencode($auth['password'])]; } //Falling back to ssh $sshUrl = 'git@bitbucket.org:' . $repo_with_git_part; $this->io->writeError(' No bitbucket authentication configured. Falling back to ssh.'); if (0 === $runCommands($sshUrl)) { return; } $errorMsg = $this->process->getErrorOutput(); } elseif (Preg::isMatchStrictGroups('{^(git)@' . self::getGitLabDomainsRegex($this->config) . ':(.+?\\.git)$}i', $url, $match) || Preg::isMatchStrictGroups('{^(https?)://' . self::getGitLabDomainsRegex($this->config) . '/(.*)}i', $url, $match)) { if ($match[1] === 'git') { $match[1] = 'https'; } if (!$this->io->hasAuthentication($match[2])) { $gitLabUtil = new \Composer\Util\GitLab($this->io, $this->config, $this->process); $message = 'Cloning failed, enter your GitLab credentials to access private repos'; if (!$gitLabUtil->authorizeOAuth($match[2]) && $this->io->isInteractive()) { $gitLabUtil->authorizeOAuthInteractively($match[1], $match[2], $message); } } if ($this->io->hasAuthentication($match[2])) { $auth = $this->io->getAuthentication($match[2]); if ($auth['password'] === 'private-token' || $auth['password'] === 'oauth2' || $auth['password'] === 'gitlab-ci-token') { $authUrl = $match[1] . '://' . \rawurlencode($auth['password']) . ':' . \rawurlencode((string) $auth['username']) . '@' . $match[2] . '/' . $match[3]; // swap username and password } else { $authUrl = $match[1] . '://' . \rawurlencode((string) $auth['username']) . ':' . \rawurlencode((string) $auth['password']) . '@' . $match[2] . '/' . $match[3]; } if (0 === $runCommands($authUrl)) { return; } $credentials = [\rawurlencode((string) $auth['username']), \rawurlencode((string) $auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } } elseif (null !== ($match = $this->getAuthenticationFailure($url))) { // private non-github/gitlab/bitbucket repo that failed to authenticate if (\str_contains($match[2], '@')) { [$authParts, $match[2]] = \explode('@', $match[2], 2); } $storeAuth = \false; if ($this->io->hasAuthentication($match[2])) { $auth = $this->io->getAuthentication($match[2]); } elseif ($this->io->isInteractive()) { $defaultUsername = null; if (isset($authParts) && $authParts !== '') { if (\str_contains($authParts, ':')) { [$defaultUsername] = \explode(':', $authParts, 2); } else { $defaultUsername = $authParts; } } $this->io->writeError(' Authentication required (' . $match[2] . '):'); $this->io->writeError('' . \trim($errorMsg) . '', \true, IOInterface::VERBOSE); $auth = ['username' => $this->io->ask(' Username: ', $defaultUsername), 'password' => $this->io->askAndHideAnswer(' Password: ')]; $storeAuth = $this->config->get('store-auths'); } if (null !== $auth) { $authUrl = $match[1] . \rawurlencode((string) $auth['username']) . ':' . \rawurlencode((string) $auth['password']) . '@' . $match[2] . $match[3]; if (0 === $runCommands($authUrl)) { $this->io->setAuthentication($match[2], $auth['username'], $auth['password']); $authHelper = new \Composer\Util\AuthHelper($this->io, $this->config); $authHelper->storeAuth($match[2], $storeAuth); return; } $credentials = [\rawurlencode((string) $auth['username']), \rawurlencode((string) $auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } } if ($initialClone && isset($origCwd)) { $this->filesystem->removeDirectory($origCwd); } $lastCommand = \implode(' ', $lastCommand); if (\count($credentials) > 0) { $lastCommand = $this->maskCredentials($lastCommand, $credentials); $errorMsg = $this->maskCredentials($errorMsg, $credentials); } $this->throwException('Failed to execute ' . $lastCommand . "\n\n" . $errorMsg, $url); } } public function syncMirror(string $url, string $dir) : bool { if ((bool) \Composer\Util\Platform::getEnv('COMPOSER_DISABLE_NETWORK') && \Composer\Util\Platform::getEnv('COMPOSER_DISABLE_NETWORK') !== 'prime') { $this->io->writeError('Aborting git mirror sync of ' . $url . ' as network is disabled'); return \false; } // update the repo if it is a valid git repository if (\is_dir($dir) && 0 === $this->process->execute(['git', 'rev-parse', '--git-dir'], $output, $dir) && \trim($output) === '.') { try { $commands = [['git', 'remote', 'set-url', 'origin', '--', '%url%'], ['git', 'remote', 'update', '--prune', 'origin'], ['git', 'remote', 'set-url', 'origin', '--', '%sanitizedUrl%'], ['git', 'gc', '--auto']]; $this->runCommands($commands, $url, $dir); } catch (\Exception $e) { $this->io->writeError('Sync mirror failed: ' . $e->getMessage() . '', \true, IOInterface::DEBUG); return \false; } return \true; } self::checkForRepoOwnershipError($this->process->getErrorOutput(), $dir); // clean up directory and do a fresh clone into it $this->filesystem->removeDirectory($dir); $this->runCommands([['git', 'clone', '--mirror', '--', '%url%', $dir]], $url, $dir, \true); return \true; } public function fetchRefOrSyncMirror(string $url, string $dir, string $ref, ?string $prettyVersion = null) : bool { if ($this->checkRefIsInMirror($dir, $ref)) { if (Preg::isMatch('{^[a-f0-9]{40}$}', $ref) && $prettyVersion !== null) { $branch = Preg::replace('{(?:^dev-|(?:\\.x)?-dev$)}i', '', $prettyVersion); $branches = null; $tags = null; if (0 === $this->process->execute(['git', 'branch'], $output, $dir)) { $branches = $output; } if (0 === $this->process->execute(['git', 'tag'], $output, $dir)) { $tags = $output; } // if the pretty version cannot be found as a branch (nor branch with 'v' in front of the branch as it may have been stripped when generating pretty name), // nor as a tag, then we sync the mirror as otherwise it will likely fail during install. // this can occur if a git tag gets created *after* the reference is already put into the cache, as the ref check above will then not sync the new tags // see https://github.com/composer/composer/discussions/11002 if (null !== $branches && !Preg::isMatch('{^[\\s*]*v?' . \preg_quote($branch) . '$}m', $branches) && null !== $tags && !Preg::isMatch('{^[\\s*]*' . \preg_quote($branch) . '$}m', $tags)) { $this->syncMirror($url, $dir); } } return \true; } if ($this->syncMirror($url, $dir)) { return $this->checkRefIsInMirror($dir, $ref); } return \false; } public static function getNoShowSignatureFlag(\Composer\Util\ProcessExecutor $process) : string { $gitVersion = self::getVersion($process); if ($gitVersion && \version_compare($gitVersion, '2.10.0-rc0', '>=')) { return ' --no-show-signature'; } return ''; } /** * @return list */ public static function getNoShowSignatureFlags(\Composer\Util\ProcessExecutor $process) : array { $flags = static::getNoShowSignatureFlag($process); if ('' === $flags) { return []; } return \explode(' ', \substr($flags, 1)); } private function checkRefIsInMirror(string $dir, string $ref) : bool { if (\is_dir($dir) && 0 === $this->process->execute(['git', 'rev-parse', '--git-dir'], $output, $dir) && \trim($output) === '.') { $exitCode = $this->process->execute(['git', 'rev-parse', '--quiet', '--verify', $ref . '^{commit}'], $ignoredOutput, $dir); if ($exitCode === 0) { return \true; } } self::checkForRepoOwnershipError($this->process->getErrorOutput(), $dir); return \false; } /** * @return array|null */ private function getAuthenticationFailure(string $url) : ?array { if (!Preg::isMatchStrictGroups('{^(https?://)([^/]+)(.*)$}i', $url, $match)) { return null; } $authFailures = ['fatal: Authentication failed', 'remote error: Invalid username or password.', 'error: 401 Unauthorized', 'fatal: unable to access', 'fatal: could not read Username']; $errorOutput = $this->process->getErrorOutput(); foreach ($authFailures as $authFailure) { if (\strpos($errorOutput, $authFailure) !== \false) { return $match; } } return null; } public function getMirrorDefaultBranch(string $url, string $dir, bool $isLocalPathRepository) : ?string { if ((bool) \Composer\Util\Platform::getEnv('COMPOSER_DISABLE_NETWORK')) { return null; } try { if ($isLocalPathRepository) { $this->process->execute(['git', 'remote', 'show', 'origin'], $output, $dir); } else { $commands = [['git', 'remote', 'set-url', 'origin', '--', '%url%'], ['git', 'remote', 'show', 'origin'], ['git', 'remote', 'set-url', 'origin', '--', '%sanitizedUrl%']]; $this->runCommands($commands, $url, $dir, \false, $output); } $lines = $this->process->splitLines($output); foreach ($lines as $line) { if (Preg::isMatch('{^\\s*HEAD branch:\\s(.+)\\s*$}m', $line, $matches)) { return $matches[1]; } } } catch (\Exception $e) { $this->io->writeError('Failed to fetch root identifier from remote: ' . $e->getMessage() . '', \true, IOInterface::DEBUG); } return null; } public static function cleanEnv() : void { // added in git 1.7.1, prevents prompting the user for username/password if (\Composer\Util\Platform::getEnv('GIT_ASKPASS') !== 'echo') { \Composer\Util\Platform::putEnv('GIT_ASKPASS', 'echo'); } // clean up rogue git env vars in case this is running in a git hook if (\Composer\Util\Platform::getEnv('GIT_DIR')) { \Composer\Util\Platform::clearEnv('GIT_DIR'); } if (\Composer\Util\Platform::getEnv('GIT_WORK_TREE')) { \Composer\Util\Platform::clearEnv('GIT_WORK_TREE'); } // Run processes with predictable LANGUAGE if (\Composer\Util\Platform::getEnv('LANGUAGE') !== 'C') { \Composer\Util\Platform::putEnv('LANGUAGE', 'C'); } // clean up env for OSX, see https://github.com/composer/composer/issues/2146#issuecomment-35478940 \Composer\Util\Platform::clearEnv('DYLD_LIBRARY_PATH'); } /** * @return non-empty-string */ public static function getGitHubDomainsRegex(Config $config) : string { return '(' . \implode('|', \array_map('preg_quote', $config->get('github-domains'))) . ')'; } /** * @return non-empty-string */ public static function getGitLabDomainsRegex(Config $config) : string { return '(' . \implode('|', \array_map('preg_quote', $config->get('gitlab-domains'))) . ')'; } /** * @param non-empty-string $message * * @return never */ private function throwException($message, string $url) : void { // git might delete a directory when it fails and php will not know \clearstatcache(); if (0 !== $this->process->execute(['git', '--version'], $ignoredOutput)) { throw new \RuntimeException(\Composer\Util\Url::sanitize('Failed to clone ' . $url . ', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); } throw new \RuntimeException(\Composer\Util\Url::sanitize($message)); } /** * Retrieves the current git version. * * @return string|null The git version number, if present. */ public static function getVersion(\Composer\Util\ProcessExecutor $process) : ?string { if (\false === self::$version) { self::$version = null; if (0 === $process->execute(['git', '--version'], $output) && Preg::isMatch('/^git version (\\d+(?:\\.\\d+)+)/m', $output, $matches)) { self::$version = $matches[1]; } } return self::$version; } /** * @param string[] $credentials */ private function maskCredentials(string $error, array $credentials) : string { $maskedCredentials = []; foreach ($credentials as $credential) { if (\in_array($credential, ['private-token', 'x-token-auth', 'oauth2', 'gitlab-ci-token', 'x-oauth-basic'])) { $maskedCredentials[] = $credential; } elseif (\strlen($credential) > 6) { $maskedCredentials[] = \substr($credential, 0, 3) . '...' . \substr($credential, -3); } elseif (\strlen($credential) > 3) { $maskedCredentials[] = \substr($credential, 0, 3) . '...'; } else { $maskedCredentials[] = 'XXX'; } } return \str_replace($credentials, $maskedCredentials, $error); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; use Composer\Pcre\Preg; /** * @author Till Klampaeckel * @author Jordi Boggiano */ class Svn { private const MAX_QTY_AUTH_TRIES = 5; /** * @var ?array{username: string, password: string} */ protected $credentials; /** * @var bool */ protected $hasAuth; /** * @var \Composer\IO\IOInterface */ protected $io; /** * @var string */ protected $url; /** * @var bool */ protected $cacheCredentials = \true; /** * @var ProcessExecutor */ protected $process; /** * @var int */ protected $qtyAuthTries = 0; /** * @var \Composer\Config */ protected $config; /** * @var string|null */ private static $version; /** * @param ProcessExecutor $process */ public function __construct(string $url, IOInterface $io, Config $config, ?\Composer\Util\ProcessExecutor $process = null) { $this->url = $url; $this->io = $io; $this->config = $config; $this->process = $process ?: new \Composer\Util\ProcessExecutor($io); } public static function cleanEnv() : void { // clean up env for OSX, see https://github.com/composer/composer/issues/2146#issuecomment-35478940 \Composer\Util\Platform::clearEnv('DYLD_LIBRARY_PATH'); } /** * Execute an SVN remote command and try to fix up the process with credentials * if necessary. * * @param non-empty-list $command SVN command to run * @param string $url SVN url * @param ?string $cwd Working directory * @param ?string $path Target for a checkout * @param bool $verbose Output all output to the user * * @throws \RuntimeException */ public function execute(array $command, string $url, ?string $cwd = null, ?string $path = null, bool $verbose = \false) : string { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); return $this->executeWithAuthRetry($command, $cwd, $url, $path, $verbose); } /** * Execute an SVN local command and try to fix up the process with credentials * if necessary. * * @param non-empty-list $command SVN command to run * @param string $path Path argument passed thru to the command * @param string $cwd Working directory * @param bool $verbose Output all output to the user * * @throws \RuntimeException */ public function executeLocal(array $command, string $path, ?string $cwd = null, bool $verbose = \false) : string { // A local command has no remote url return $this->executeWithAuthRetry($command, $cwd, '', $path, $verbose); } /** * @param non-empty-list $svnCommand */ private function executeWithAuthRetry(array $svnCommand, ?string $cwd, string $url, ?string $path, bool $verbose) : ?string { // Regenerate the command at each try, to use the newly user-provided credentials $command = $this->getCommand($svnCommand, $url, $path); $output = null; $io = $this->io; $handler = static function ($type, $buffer) use(&$output, $io, $verbose) { if ($type !== 'out') { return null; } if (\strpos($buffer, 'Redirecting to URL ') === 0) { return null; } $output .= $buffer; if ($verbose) { $io->writeError($buffer, \false); } }; $status = $this->process->execute($command, $handler, $cwd); if (0 === $status) { return $output; } $errorOutput = $this->process->getErrorOutput(); $fullOutput = \trim(\implode("\n", [$output, $errorOutput])); // the error is not auth-related if (\false === \stripos($fullOutput, 'Could not authenticate to server:') && \false === \stripos($fullOutput, 'authorization failed') && \false === \stripos($fullOutput, 'svn: E170001:') && \false === \stripos($fullOutput, 'svn: E215004:')) { throw new \RuntimeException($fullOutput); } if (!$this->hasAuth()) { $this->doAuthDance(); } // try to authenticate if maximum quantity of tries not reached if ($this->qtyAuthTries++ < self::MAX_QTY_AUTH_TRIES) { // restart the process return $this->executeWithAuthRetry($svnCommand, $cwd, $url, $path, $verbose); } throw new \RuntimeException('wrong credentials provided (' . $fullOutput . ')'); } public function setCacheCredentials(bool $cacheCredentials) : void { $this->cacheCredentials = $cacheCredentials; } /** * Repositories requests credentials, let's put them in. * * @throws \RuntimeException * @return \Composer\Util\Svn */ protected function doAuthDance() : \Composer\Util\Svn { // cannot ask for credentials in non interactive mode if (!$this->io->isInteractive()) { throw new \RuntimeException('can not ask for authentication in non interactive mode'); } $this->io->writeError("The Subversion server ({$this->url}) requested credentials:"); $this->hasAuth = \true; $this->credentials = ['username' => (string) $this->io->ask("Username: ", ''), 'password' => (string) $this->io->askAndHideAnswer("Password: ")]; $this->cacheCredentials = $this->io->askConfirmation("Should Subversion cache these credentials? (yes/no) "); return $this; } /** * A method to create the svn commands run. * * @param non-empty-list $cmd Usually 'svn ls' or something like that. * @param string $url Repo URL. * @param string $path Target for a checkout * * @return non-empty-list */ protected function getCommand(array $cmd, string $url, ?string $path = null) : array { $cmd = \array_merge($cmd, ['--non-interactive'], $this->getCredentialArgs(), ['--', $url]); if ($path !== null) { $cmd[] = $path; } return $cmd; } /** * Return the credential string for the svn command. * * Adds --no-auth-cache when credentials are present. * * @return list */ protected function getCredentialArgs() : array { if (!$this->hasAuth()) { return []; } return \array_merge($this->getAuthCacheArgs(), ['--username', $this->getUsername(), '--password', $this->getPassword()]); } /** * Get the password for the svn command. Can be empty. * * @throws \LogicException */ protected function getPassword() : string { if ($this->credentials === null) { throw new \LogicException("No svn auth detected."); } return $this->credentials['password']; } /** * Get the username for the svn command. * * @throws \LogicException */ protected function getUsername() : string { if ($this->credentials === null) { throw new \LogicException("No svn auth detected."); } return $this->credentials['username']; } /** * Detect Svn Auth. */ protected function hasAuth() : bool { if (null !== $this->hasAuth) { return $this->hasAuth; } if (\false === $this->createAuthFromConfig()) { $this->createAuthFromUrl(); } return (bool) $this->hasAuth; } /** * Return the no-auth-cache switch. * * @return list */ protected function getAuthCacheArgs() : array { return $this->cacheCredentials ? [] : ['--no-auth-cache']; } /** * Create the auth params from the configuration file. */ private function createAuthFromConfig() : bool { if (!$this->config->has('http-basic')) { return $this->hasAuth = \false; } $authConfig = $this->config->get('http-basic'); $host = \parse_url($this->url, \PHP_URL_HOST); if (isset($authConfig[$host])) { $this->credentials = ['username' => $authConfig[$host]['username'], 'password' => $authConfig[$host]['password']]; return $this->hasAuth = \true; } return $this->hasAuth = \false; } /** * Create the auth params from the url */ private function createAuthFromUrl() : bool { $uri = \parse_url($this->url); if (empty($uri['user'])) { return $this->hasAuth = \false; } $this->credentials = ['username' => $uri['user'], 'password' => !empty($uri['pass']) ? $uri['pass'] : '']; return $this->hasAuth = \true; } /** * Returns the version of the svn binary contained in PATH */ public function binaryVersion() : ?string { if (!self::$version) { if (0 === $this->process->execute(['svn', '--version'], $output)) { if (Preg::isMatch('{(\\d+(?:\\.\\d+)+)}', $output, $match)) { self::$version = $match[1]; } } } return self::$version; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Pcre\Preg; use stdClass; /** * Tests URLs against NO_PROXY patterns */ class NoProxyPattern { /** * @var string[] */ protected $hostNames = []; /** * @var (null|object)[] */ protected $rules = []; /** * @var bool */ protected $noproxy; /** * @param string $pattern NO_PROXY pattern */ public function __construct(string $pattern) { $this->hostNames = Preg::split('{[\\s,]+}', $pattern, -1, \PREG_SPLIT_NO_EMPTY); $this->noproxy = empty($this->hostNames) || '*' === $this->hostNames[0]; } /** * Returns true if a URL matches the NO_PROXY pattern */ public function test(string $url) : bool { if ($this->noproxy) { return \true; } if (!($urlData = $this->getUrlData($url))) { return \false; } foreach ($this->hostNames as $index => $hostName) { if ($this->match($index, $hostName, $urlData)) { return \true; } } return \false; } /** * Returns false is the url cannot be parsed, otherwise a data object * * @return bool|stdClass */ protected function getUrlData(string $url) { if (!($host = \parse_url($url, \PHP_URL_HOST))) { return \false; } $port = \parse_url($url, \PHP_URL_PORT); if (empty($port)) { switch (\parse_url($url, \PHP_URL_SCHEME)) { case 'http': $port = 80; break; case 'https': $port = 443; break; } } $hostName = $host . ($port ? ':' . $port : ''); [$host, $port, $err] = $this->splitHostPort($hostName); if ($err || !$this->ipCheckData($host, $ipdata)) { return \false; } return $this->makeData($host, $port, $ipdata); } /** * Returns true if the url is matched by a rule */ protected function match(int $index, string $hostName, stdClass $url) : bool { if (!($rule = $this->getRule($index, $hostName))) { // Data must have been misformatted return \false; } if ($rule->ipdata) { // Match ipdata first if (!$url->ipdata) { return \false; } if ($rule->ipdata->netmask) { return $this->matchRange($rule->ipdata, $url->ipdata); } $match = $rule->ipdata->ip === $url->ipdata->ip; } else { // Match host and port $haystack = \substr($url->name, -\strlen($rule->name)); $match = \stripos($haystack, $rule->name) === 0; } if ($match && $rule->port) { $match = $rule->port === $url->port; } return $match; } /** * Returns true if the target ip is in the network range */ protected function matchRange(stdClass $network, stdClass $target) : bool { $net = \unpack('C*', $network->ip); $mask = \unpack('C*', $network->netmask); $ip = \unpack('C*', $target->ip); if (\false === $net) { throw new \RuntimeException('Could not parse network IP ' . $network->ip); } if (\false === $mask) { throw new \RuntimeException('Could not parse netmask ' . $network->netmask); } if (\false === $ip) { throw new \RuntimeException('Could not parse target IP ' . $target->ip); } for ($i = 1; $i < 17; ++$i) { if (($net[$i] & $mask[$i]) !== ($ip[$i] & $mask[$i])) { return \false; } } return \true; } /** * Finds or creates rule data for a hostname * * @return null|stdClass Null if the hostname is invalid */ private function getRule(int $index, string $hostName) : ?stdClass { if (\array_key_exists($index, $this->rules)) { return $this->rules[$index]; } $this->rules[$index] = null; [$host, $port, $err] = $this->splitHostPort($hostName); if ($err || !$this->ipCheckData($host, $ipdata, \true)) { return null; } $this->rules[$index] = $this->makeData($host, $port, $ipdata); return $this->rules[$index]; } /** * Creates an object containing IP data if the host is an IP address * * @param null|stdClass $ipdata Set by method if IP address found * @param bool $allowPrefix Whether a CIDR prefix-length is expected * * @return bool False if the host contains invalid data */ private function ipCheckData(string $host, ?stdClass &$ipdata, bool $allowPrefix = \false) : bool { $ipdata = null; $netmask = null; $prefix = null; $modified = \false; // Check for a CIDR prefix-length if (\strpos($host, '/') !== \false) { [$host, $prefix] = \explode('/', $host); if (!$allowPrefix || !$this->validateInt($prefix, 0, 128)) { return \false; } $prefix = (int) $prefix; $modified = \true; } // See if this is an ip address if (!\filter_var($host, \FILTER_VALIDATE_IP)) { return !$modified; } [$ip, $size] = $this->ipGetAddr($host); if ($prefix !== null) { // Check for a valid prefix if ($prefix > $size * 8) { return \false; } [$ip, $netmask] = $this->ipGetNetwork($ip, $size, $prefix); } $ipdata = $this->makeIpData($ip, $size, $netmask); return \true; } /** * Returns an array of the IP in_addr and its byte size * * IPv4 addresses are always mapped to IPv6, which simplifies handling * and comparison. * * @return mixed[] in_addr, size */ private function ipGetAddr(string $host) : array { $ip = \inet_pton($host); $size = \strlen($ip); $mapped = $this->ipMapTo6($ip, $size); return [$mapped, $size]; } /** * Returns the binary network mask mapped to IPv6 * * @param int $prefix CIDR prefix-length * @param int $size Byte size of in_addr */ private function ipGetMask(int $prefix, int $size) : string { $mask = ''; if ($ones = \floor($prefix / 8)) { $mask = \str_repeat(\chr(255), (int) $ones); } if ($remainder = $prefix % 8) { $mask .= \chr(0xff ^ 0xff >> $remainder); } $mask = \str_pad($mask, $size, \chr(0)); return $this->ipMapTo6($mask, $size); } /** * Calculates and returns the network and mask * * @param string $rangeIp IP in_addr * @param int $size Byte size of in_addr * @param int $prefix CIDR prefix-length * * @return string[] network in_addr, binary mask */ private function ipGetNetwork(string $rangeIp, int $size, int $prefix) : array { $netmask = $this->ipGetMask($prefix, $size); // Get the network from the address and mask $mask = \unpack('C*', $netmask); $ip = \unpack('C*', $rangeIp); $net = ''; if (\false === $mask) { throw new \RuntimeException('Could not parse netmask ' . $netmask); } if (\false === $ip) { throw new \RuntimeException('Could not parse range IP ' . $rangeIp); } for ($i = 1; $i < 17; ++$i) { $net .= \chr($ip[$i] & $mask[$i]); } return [$net, $netmask]; } /** * Maps an IPv4 address to IPv6 * * @param string $binary in_addr * @param int $size Byte size of in_addr * * @return string Mapped or existing in_addr */ private function ipMapTo6(string $binary, int $size) : string { if ($size === 4) { $prefix = \str_repeat(\chr(0), 10) . \str_repeat(\chr(255), 2); $binary = $prefix . $binary; } return $binary; } /** * Creates a rule data object */ private function makeData(string $host, int $port, ?stdClass $ipdata) : stdClass { return (object) ['host' => $host, 'name' => '.' . \ltrim($host, '.'), 'port' => $port, 'ipdata' => $ipdata]; } /** * Creates an ip data object * * @param string $ip in_addr * @param int $size Byte size of in_addr * @param null|string $netmask Network mask */ private function makeIpData(string $ip, int $size, ?string $netmask) : stdClass { return (object) ['ip' => $ip, 'size' => $size, 'netmask' => $netmask]; } /** * Splits the hostname into host and port components * * @return mixed[] host, port, if there was error */ private function splitHostPort(string $hostName) : array { // host, port, err $error = ['', '', \true]; $port = 0; $ip6 = ''; // Check for square-bracket notation if ($hostName[0] === '[') { $index = \strpos($hostName, ']'); // The smallest ip6 address is :: if (\false === $index || $index < 3) { return $error; } $ip6 = \substr($hostName, 1, $index - 1); $hostName = \substr($hostName, $index + 1); if (\strpbrk($hostName, '[]') !== \false || \substr_count($hostName, ':') > 1) { return $error; } } if (\substr_count($hostName, ':') === 1) { $index = \strpos($hostName, ':'); $port = \substr($hostName, $index + 1); $hostName = \substr($hostName, 0, $index); if (!$this->validateInt($port, 1, 65535)) { return $error; } $port = (int) $port; } $host = $ip6 . $hostName; return [$host, $port, \false]; } /** * Wrapper around filter_var FILTER_VALIDATE_INT */ private function validateInt(string $int, int $min, int $max) : bool { $options = ['options' => ['min_range' => $min, 'max_range' => $max]]; return \false !== \filter_var($int, \FILTER_VALIDATE_INT, $options); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Pcre\Preg; /** * Composer mirror utilities * * @author Jordi Boggiano */ class ComposerMirror { /** * @param non-empty-string $mirrorUrl * @return non-empty-string */ public static function processUrl(string $mirrorUrl, string $packageName, string $version, ?string $reference, ?string $type, ?string $prettyVersion = null) : string { if ($reference) { $reference = Preg::isMatch('{^([a-f0-9]*|%reference%)$}', $reference) ? $reference : \hash('md5', $reference); } $version = \strpos($version, '/') === \false ? $version : \hash('md5', $version); $from = ['%package%', '%version%', '%reference%', '%type%']; $to = [$packageName, $version, $reference, $type]; if (null !== $prettyVersion) { $from[] = '%prettyVersion%'; $to[] = $prettyVersion; } $url = \str_replace($from, $to, $mirrorUrl); \assert($url !== ''); return $url; } /** * @param non-empty-string $mirrorUrl * @return string */ public static function processGitUrl(string $mirrorUrl, string $packageName, string $url, ?string $type) : string { if (Preg::isMatch('#^(?:(?:https?|git)://github\\.com/|git@github\\.com:)([^/]+)/(.+?)(?:\\.git)?$#', $url, $match)) { $url = 'gh-' . $match[1] . '/' . $match[2]; } elseif (Preg::isMatch('#^https://bitbucket\\.org/([^/]+)/(.+?)(?:\\.git)?/?$#', $url, $match)) { $url = 'bb-' . $match[1] . '/' . $match[2]; } else { $url = Preg::replace('{[^a-z0-9_.-]}i', '-', \trim($url, '/')); } return \str_replace(['%package%', '%normalizedUrl%', '%type%'], [$packageName, $url, $type], $mirrorUrl); } /** * @param non-empty-string $mirrorUrl * @return string */ public static function processHgUrl(string $mirrorUrl, string $packageName, string $url, string $type) : string { return self::processGitUrl($mirrorUrl, $packageName, $url, $type); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Package\CompletePackageInterface; use Composer\Package\PackageInterface; class PackageInfo { public static function getViewSourceUrl(PackageInterface $package) : ?string { if ($package instanceof CompletePackageInterface && isset($package->getSupport()['source']) && '' !== $package->getSupport()['source']) { return $package->getSupport()['source']; } return $package->getSourceUrl(); } public static function getViewSourceOrHomepageUrl(PackageInterface $package) : ?string { $url = self::getViewSourceUrl($package) ?? ($package instanceof CompletePackageInterface ? $package->getHomepage() : null); if ($url === '') { return null; } return $url; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class AuthHelper { /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var array Map of origins to message displayed */ private $displayedOriginAuthentications = []; /** @var array Map of URLs and whether they already retried with authentication from Bitbucket */ private $bitbucketRetry = []; public function __construct(IOInterface $io, Config $config) { $this->io = $io; $this->config = $config; } /** * @param 'prompt'|bool $storeAuth */ public function storeAuth(string $origin, $storeAuth) : void { $store = \false; $configSource = $this->config->getAuthConfigSource(); if ($storeAuth === \true) { $store = $configSource; } elseif ($storeAuth === 'prompt') { $answer = $this->io->askAndValidate('Do you want to store credentials for ' . $origin . ' in ' . $configSource->getName() . ' ? [Yn] ', static function ($value) : string { $input = \strtolower(\substr(\trim($value), 0, 1)); if (\in_array($input, ['y', 'n'])) { return $input; } throw new \RuntimeException('Please answer (y)es or (n)o'); }, null, 'y'); if ($answer === 'y') { $store = $configSource; } } if ($store) { $store->addConfigSetting('http-basic.' . $origin, $this->io->getAuthentication($origin)); } } /** * @param int $statusCode HTTP status code that triggered this call * @param string|null $reason a message/description explaining why this was called * @param string[] $headers * @param int $retryCount the amount of retries already done on this URL * @return array containing retry (bool) and storeAuth (string|bool) keys, if retry is true the request should be * retried, if storeAuth is true then on a successful retry the authentication should be persisted to auth.json * @phpstan-return array{retry: bool, storeAuth: 'prompt'|bool} */ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, ?string $reason = null, array $headers = [], int $retryCount = 0) : array { $storeAuth = \false; if (\in_array($origin, $this->config->get('github-domains'), \true)) { $gitHubUtil = new \Composer\Util\GitHub($this->io, $this->config, null); $message = "\n"; $rateLimited = $gitHubUtil->isRateLimited($headers); $requiresSso = $gitHubUtil->requiresSso($headers); if ($requiresSso) { $ssoUrl = $gitHubUtil->getSsoUrl($headers); $message = 'GitHub API token requires SSO authorization. Authorize this token at ' . $ssoUrl . "\n"; $this->io->writeError($message); if (!$this->io->isInteractive()) { throw new TransportException('Could not authenticate against ' . $origin, 403); } $this->io->ask('After authorizing your token, confirm that you would like to retry the request'); return ['retry' => \true, 'storeAuth' => $storeAuth]; } if ($rateLimited) { $rateLimit = $gitHubUtil->getRateLimit($headers); if ($this->io->hasAuthentication($origin)) { $message = 'Review your configured GitHub OAuth token or enter a new one to go over the API rate limit.'; } else { $message = 'Create a GitHub OAuth token to go over the API rate limit.'; } $message = \sprintf('GitHub API limit (%d calls/hr) is exhausted, could not fetch ' . $url . '. ' . $message . ' You can also wait until %s for the rate limit to reset.', $rateLimit['limit'], $rateLimit['reset']) . "\n"; } else { $message .= 'Could not fetch ' . $url . ', please '; if ($this->io->hasAuthentication($origin)) { $message .= 'review your configured GitHub OAuth token or enter a new one to access private repos'; } else { $message .= 'create a GitHub OAuth token to access private repos'; } } if (!$gitHubUtil->authorizeOAuth($origin) && (!$this->io->isInteractive() || !$gitHubUtil->authorizeOAuthInteractively($origin, $message))) { throw new TransportException('Could not authenticate against ' . $origin, 401); } } elseif (\in_array($origin, $this->config->get('gitlab-domains'), \true)) { $message = "\n" . 'Could not fetch ' . $url . ', enter your ' . $origin . ' credentials ' . ($statusCode === 401 ? 'to access private repos' : 'to go over the API rate limit'); $gitLabUtil = new \Composer\Util\GitLab($this->io, $this->config, null); $auth = null; if ($this->io->hasAuthentication($origin)) { $auth = $this->io->getAuthentication($origin); if (\in_array($auth['password'], ['gitlab-ci-token', 'private-token', 'oauth2'], \true)) { throw new TransportException("Invalid credentials for '" . $url . "', aborting.", $statusCode); } } if (!$gitLabUtil->authorizeOAuth($origin) && (!$this->io->isInteractive() || !$gitLabUtil->authorizeOAuthInteractively(\parse_url($url, \PHP_URL_SCHEME), $origin, $message))) { throw new TransportException('Could not authenticate against ' . $origin, 401); } if ($auth !== null && $this->io->hasAuthentication($origin)) { if ($auth === $this->io->getAuthentication($origin)) { throw new TransportException("Invalid credentials for '" . $url . "', aborting.", $statusCode); } } } elseif ($origin === 'bitbucket.org' || $origin === 'api.bitbucket.org') { $askForOAuthToken = \true; $origin = 'bitbucket.org'; if ($this->io->hasAuthentication($origin)) { $auth = $this->io->getAuthentication($origin); if ($auth['username'] !== 'x-token-auth') { $bitbucketUtil = new \Composer\Util\Bitbucket($this->io, $this->config); $accessToken = $bitbucketUtil->requestToken($origin, $auth['username'], $auth['password']); if (!empty($accessToken)) { $this->io->setAuthentication($origin, 'x-token-auth', $accessToken); $askForOAuthToken = \false; } } elseif (!isset($this->bitbucketRetry[$url])) { // when multiple requests fire at the same time, they will all fail and the first one resets the token to be correct above but then the others // reach the code path and without this fallback they would end up throwing below // see https://github.com/composer/composer/pull/11464 for more details $askForOAuthToken = \false; $this->bitbucketRetry[$url] = \true; } else { throw new TransportException('Could not authenticate against ' . $origin, 401); } } if ($askForOAuthToken) { $message = "\n" . 'Could not fetch ' . $url . ', please create a bitbucket OAuth token to ' . ($statusCode === 401 || $statusCode === 403 ? 'access private repos' : 'go over the API rate limit'); $bitBucketUtil = new \Composer\Util\Bitbucket($this->io, $this->config); if (!$bitBucketUtil->authorizeOAuth($origin) && (!$this->io->isInteractive() || !$bitBucketUtil->authorizeOAuthInteractively($origin, $message))) { throw new TransportException('Could not authenticate against ' . $origin, 401); } } } else { // 404s are only handled for github if ($statusCode === 404) { return ['retry' => \false, 'storeAuth' => \false]; } // fail if the console is not interactive if (!$this->io->isInteractive()) { if ($statusCode === 401) { $message = "The '" . $url . "' URL required authentication (HTTP 401).\nYou must be using the interactive console to authenticate"; } elseif ($statusCode === 403) { $message = "The '" . $url . "' URL could not be accessed (HTTP 403): " . $reason; } else { $message = "Unknown error code '" . $statusCode . "', reason: " . $reason; } throw new TransportException($message, $statusCode); } // fail if we already have auth if ($this->io->hasAuthentication($origin)) { // if two or more requests are started together for the same host, and the first // received authentication already, we let the others retry before failing them if ($retryCount === 0) { return ['retry' => \true, 'storeAuth' => \false]; } throw new TransportException("Invalid credentials (HTTP {$statusCode}) for '{$url}', aborting.", $statusCode); } $this->io->writeError(' Authentication required (' . $origin . '):'); $username = $this->io->ask(' Username: '); $password = $this->io->askAndHideAnswer(' Password: '); $this->io->setAuthentication($origin, $username, $password); $storeAuth = $this->config->get('store-auths'); } return ['retry' => \true, 'storeAuth' => $storeAuth]; } /** * @param string[] $headers * * @return string[] updated headers array */ public function addAuthenticationHeader(array $headers, string $origin, string $url) : array { if ($this->io->hasAuthentication($origin)) { $authenticationDisplayMessage = null; $auth = $this->io->getAuthentication($origin); if ($auth['password'] === 'bearer') { $headers[] = 'Authorization: Bearer ' . $auth['username']; } elseif ('github.com' === $origin && 'x-oauth-basic' === $auth['password']) { // only add the access_token if it is actually a github API URL if (Preg::isMatch('{^https?://api\\.github\\.com/}', $url)) { $headers[] = 'Authorization: token ' . $auth['username']; $authenticationDisplayMessage = 'Using GitHub token authentication'; } } elseif (\in_array($origin, $this->config->get('gitlab-domains'), \true) && \in_array($auth['password'], ['oauth2', 'private-token', 'gitlab-ci-token'], \true)) { if ($auth['password'] === 'oauth2') { $headers[] = 'Authorization: Bearer ' . $auth['username']; $authenticationDisplayMessage = 'Using GitLab OAuth token authentication'; } else { $headers[] = 'PRIVATE-TOKEN: ' . $auth['username']; $authenticationDisplayMessage = 'Using GitLab private token authentication'; } } elseif ('bitbucket.org' === $origin && $url !== \Composer\Util\Bitbucket::OAUTH2_ACCESS_TOKEN_URL && 'x-token-auth' === $auth['username']) { if (!$this->isPublicBitBucketDownload($url)) { $headers[] = 'Authorization: Bearer ' . $auth['password']; $authenticationDisplayMessage = 'Using Bitbucket OAuth token authentication'; } } else { $authStr = \base64_encode($auth['username'] . ':' . $auth['password']); $headers[] = 'Authorization: Basic ' . $authStr; $authenticationDisplayMessage = 'Using HTTP basic authentication with username "' . $auth['username'] . '"'; } if ($authenticationDisplayMessage && (!isset($this->displayedOriginAuthentications[$origin]) || $this->displayedOriginAuthentications[$origin] !== $authenticationDisplayMessage)) { $this->io->writeError($authenticationDisplayMessage, \true, IOInterface::DEBUG); $this->displayedOriginAuthentications[$origin] = $authenticationDisplayMessage; } } elseif (\in_array($origin, ['api.bitbucket.org', 'api.github.com'], \true)) { return $this->addAuthenticationHeader($headers, \str_replace('api.', '', $origin), $url); } return $headers; } /** * @link https://github.com/composer/composer/issues/5584 * * @param string $urlToBitBucketFile URL to a file at bitbucket.org. * * @return bool Whether the given URL is a public BitBucket download which requires no authentication. */ public function isPublicBitBucketDownload(string $urlToBitBucketFile) : bool { $domain = \parse_url($urlToBitBucketFile, \PHP_URL_HOST); if (\strpos($domain, 'bitbucket.org') === \false) { // Bitbucket downloads are hosted on amazonaws. // We do not need to authenticate there at all return \true; } $path = \parse_url($urlToBitBucketFile, \PHP_URL_PATH); // Path for a public download follows this pattern /{user}/{repo}/downloads/{whatever} // {@link https://blog.bitbucket.org/2009/04/12/new-feature-downloads/} $pathParts = \explode('/', $path); return \count($pathParts) >= 4 && $pathParts[3] === 'downloads'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * @author Andreas Schempp */ class Zip { /** * Gets content of the root composer.json inside a ZIP archive. */ public static function getComposerJson(string $pathToZip) : ?string { if (!\extension_loaded('zip')) { throw new \RuntimeException('The Zip Util requires PHP\'s zip extension'); } $zip = new \ZipArchive(); if ($zip->open($pathToZip) !== \true) { return null; } if (0 === $zip->numFiles) { $zip->close(); return null; } $foundFileIndex = self::locateFile($zip, 'composer.json'); $content = null; $configurationFileName = $zip->getNameIndex($foundFileIndex); $stream = $zip->getStream($configurationFileName); if (\false !== $stream) { $content = \stream_get_contents($stream); } $zip->close(); return $content; } /** * Find a file by name, returning the one that has the shortest path. * * @throws \RuntimeException */ private static function locateFile(\ZipArchive $zip, string $filename) : int { // return root composer.json if it is there and is a file if (\false !== ($index = $zip->locateName($filename)) && $zip->getFromIndex($index) !== \false) { return $index; } $topLevelPaths = []; for ($i = 0; $i < $zip->numFiles; $i++) { $name = $zip->getNameIndex($i); $dirname = \dirname($name); // ignore OSX specific resource fork folder if (\strpos($name, '__MACOSX') !== \false) { continue; } // handle archives with proper TOC if ($dirname === '.') { $topLevelPaths[$name] = \true; if (\count($topLevelPaths) > 1) { throw new \RuntimeException('Archive has more than one top level directories, and no composer.json was found on the top level, so it\'s an invalid archive. Top level paths found were: ' . \implode(',', \array_keys($topLevelPaths))); } continue; } // handle archives which do not have a TOC record for the directory itself if (\false === \strpos($dirname, '\\') && \false === \strpos($dirname, '/')) { $topLevelPaths[$dirname . '/'] = \true; if (\count($topLevelPaths) > 1) { throw new \RuntimeException('Archive has more than one top level directories, and no composer.json was found on the top level, so it\'s an invalid archive. Top level paths found were: ' . \implode(',', \array_keys($topLevelPaths))); } } } if ($topLevelPaths && \false !== ($index = $zip->locateName(\key($topLevelPaths) . $filename)) && $zip->getFromIndex($index) !== \false) { return $index; } throw new \RuntimeException('No composer.json found either at the top level or within the topmost directory'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * Temporarily suppress PHP error reporting, usually warnings and below. * * @author Niels Keurentjes */ class Silencer { /** * @var int[] Unpop stack */ private static $stack = []; /** * Suppresses given mask or errors. * * @param int|null $mask Error levels to suppress, default value NULL indicates all warnings and below. * @return int The old error reporting level. */ public static function suppress(?int $mask = null) : int { if (!isset($mask)) { $mask = \E_WARNING | \E_NOTICE | \E_USER_WARNING | \E_USER_NOTICE | \E_DEPRECATED | \E_USER_DEPRECATED; } $old = \error_reporting(); self::$stack[] = $old; \error_reporting($old & ~$mask); return $old; } /** * Restores a single state. */ public static function restore() : void { if (!empty(self::$stack)) { \error_reporting(\array_pop(self::$stack)); } } /** * Calls a specified function while silencing warnings and below. * * @param callable $callable Function to execute. * @param mixed $parameters Function to execute. * @throws \Exception Any exceptions from the callback are rethrown. * @return mixed Return value of the callback. */ public static function call(callable $callable, ...$parameters) { try { self::suppress(); $result = $callable(...$parameters); self::restore(); return $result; } catch (\Exception $e) { // Use a finally block for this when requirements are raised to PHP 5.5 self::restore(); throw $e; } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Pcre\Preg; use ErrorException; use React\Promise\PromiseInterface; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use _ContaoManager\Symfony\Component\Filesystem\Exception\IOException; use _ContaoManager\Symfony\Component\Finder\Finder; /** * @author Jordi Boggiano * @author Johannes M. Schmitt */ class Filesystem { /** @var ?ProcessExecutor */ private $processExecutor; public function __construct(?\Composer\Util\ProcessExecutor $executor = null) { $this->processExecutor = $executor; } /** * @return bool */ public function remove(string $file) { if (\is_dir($file)) { return $this->removeDirectory($file); } if (\file_exists($file)) { return $this->unlink($file); } return \false; } /** * Checks if a directory is empty * * @return bool */ public function isDirEmpty(string $dir) { $finder = Finder::create()->ignoreVCS(\false)->ignoreDotFiles(\false)->depth(0)->in($dir); return \count($finder) === 0; } /** * @return void */ public function emptyDirectory(string $dir, bool $ensureDirectoryExists = \true) { if (\is_link($dir) && \file_exists($dir)) { $this->unlink($dir); } if ($ensureDirectoryExists) { $this->ensureDirectoryExists($dir); } if (\is_dir($dir)) { $finder = Finder::create()->ignoreVCS(\false)->ignoreDotFiles(\false)->depth(0)->in($dir); foreach ($finder as $path) { $this->remove((string) $path); } } } /** * Recursively remove a directory * * Uses the process component if proc_open is enabled on the PHP * installation. * * @throws \RuntimeException * @return bool */ public function removeDirectory(string $directory) { $edgeCaseResult = $this->removeEdgeCases($directory); if ($edgeCaseResult !== null) { return $edgeCaseResult; } if (\Composer\Util\Platform::isWindows()) { $cmd = ['rmdir', '/S', '/Q', \Composer\Util\Platform::realpath($directory)]; } else { $cmd = ['rm', '-rf', $directory]; } $result = $this->getProcess()->execute($cmd, $output) === 0; // clear stat cache because external processes aren't tracked by the php stat cache \clearstatcache(); if ($result && !\is_dir($directory)) { return \true; } return $this->removeDirectoryPhp($directory); } /** * Recursively remove a directory asynchronously * * Uses the process component if proc_open is enabled on the PHP * installation. * * @throws \RuntimeException * @return PromiseInterface * @phpstan-return PromiseInterface */ public function removeDirectoryAsync(string $directory) { $edgeCaseResult = $this->removeEdgeCases($directory); if ($edgeCaseResult !== null) { return \React\Promise\resolve($edgeCaseResult); } if (\Composer\Util\Platform::isWindows()) { $cmd = ['rmdir', '/S', '/Q', \Composer\Util\Platform::realpath($directory)]; } else { $cmd = ['rm', '-rf', $directory]; } $promise = $this->getProcess()->executeAsync($cmd); return $promise->then(function ($process) use($directory) { // clear stat cache because external processes aren't tracked by the php stat cache \clearstatcache(); if ($process->isSuccessful()) { if (!\is_dir($directory)) { return \React\Promise\resolve(\true); } } return \React\Promise\resolve($this->removeDirectoryPhp($directory)); }); } /** * @return bool|null Returns null, when no edge case was hit. Otherwise a bool whether removal was successful */ private function removeEdgeCases(string $directory, bool $fallbackToPhp = \true) : ?bool { if ($this->isSymlinkedDirectory($directory)) { return $this->unlinkSymlinkedDirectory($directory); } if ($this->isJunction($directory)) { return $this->removeJunction($directory); } if (\is_link($directory)) { return \unlink($directory); } if (!\is_dir($directory) || !\file_exists($directory)) { return \true; } if (Preg::isMatch('{^(?:[a-z]:)?[/\\\\]+$}i', $directory)) { throw new \RuntimeException('Aborting an attempted deletion of ' . $directory . ', this was probably not intended, if it is a real use case please report it.'); } if (!\function_exists('proc_open') && $fallbackToPhp) { return $this->removeDirectoryPhp($directory); } return null; } /** * Recursively delete directory using PHP iterators. * * Uses a CHILD_FIRST RecursiveIteratorIterator to sort files * before directories, creating a single non-recursive loop * to delete files/directories in the correct order. * * @return bool */ public function removeDirectoryPhp(string $directory) { $edgeCaseResult = $this->removeEdgeCases($directory, \false); if ($edgeCaseResult !== null) { return $edgeCaseResult; } try { $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); } catch (\UnexpectedValueException $e) { // re-try once after clearing the stat cache if it failed as it // sometimes fails without apparent reason, see https://github.com/composer/composer/issues/4009 \clearstatcache(); \usleep(100000); if (!\is_dir($directory)) { return \true; } $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); } $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach ($ri as $file) { if ($file->isDir()) { $this->rmdir($file->getPathname()); } else { $this->unlink($file->getPathname()); } } // release locks on the directory, see https://github.com/composer/composer/issues/9945 unset($ri, $it, $file); return $this->rmdir($directory); } /** * @return void */ public function ensureDirectoryExists(string $directory) { if (!\is_dir($directory)) { if (\file_exists($directory)) { throw new \RuntimeException($directory . ' exists and is not a directory.'); } if (\is_link($directory) && !@$this->unlinkImplementation($directory)) { throw new \RuntimeException('Could not delete symbolic link ' . $directory . ': ' . (\error_get_last()['message'] ?? '')); } if (!@\mkdir($directory, 0777, \true)) { $e = new \RuntimeException($directory . ' does not exist and could not be created: ' . (\error_get_last()['message'] ?? '')); // in pathological cases with paths like path/to/broken-symlink/../foo is_dir will fail to detect path/to/foo // but normalizing the ../ away first makes it work so we attempt this just in case, and if it still fails we // report the initial error we had with the original path, and ignore the normalized path exception // see https://github.com/composer/composer/issues/11864 $normalized = $this->normalizePath($directory); if ($normalized !== $directory) { try { $this->ensureDirectoryExists($normalized); return; } catch (\Throwable $ignoredEx) { } } throw $e; } } } /** * Attempts to unlink a file and in case of failure retries after 350ms on windows * * @throws \RuntimeException * @return bool */ public function unlink(string $path) { $unlinked = @$this->unlinkImplementation($path); if (!$unlinked) { // retry after a bit on windows since it tends to be touchy with mass removals if (\Composer\Util\Platform::isWindows()) { \usleep(350000); $unlinked = @$this->unlinkImplementation($path); } if (!$unlinked) { $error = \error_get_last(); $message = 'Could not delete ' . $path . ': ' . ($error['message'] ?? ''); if (\Composer\Util\Platform::isWindows()) { $message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed"; } throw new \RuntimeException($message); } } return \true; } /** * Attempts to rmdir a file and in case of failure retries after 350ms on windows * * @throws \RuntimeException * @return bool */ public function rmdir(string $path) { $deleted = @\rmdir($path); if (!$deleted) { // retry after a bit on windows since it tends to be touchy with mass removals if (\Composer\Util\Platform::isWindows()) { \usleep(350000); $deleted = @\rmdir($path); } if (!$deleted) { $error = \error_get_last(); $message = 'Could not delete ' . $path . ': ' . ($error['message'] ?? ''); if (\Composer\Util\Platform::isWindows()) { $message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed"; } throw new \RuntimeException($message); } } return \true; } /** * Copy then delete is a non-atomic version of {@link rename}. * * Some systems can't rename and also don't have proc_open, * which requires this solution. * * @return void */ public function copyThenRemove(string $source, string $target) { $this->copy($source, $target); if (!\is_dir($source)) { $this->unlink($source); return; } $this->removeDirectoryPhp($source); } /** * Copies a file or directory from $source to $target. * * @return bool */ public function copy(string $source, string $target) { // refs https://github.com/composer/composer/issues/11864 $target = $this->normalizePath($target); if (!\is_dir($source)) { try { return \copy($source, $target); } catch (ErrorException $e) { // if copy fails we attempt to copy it manually as this can help bypass issues with VirtualBox shared folders // see https://github.com/composer/composer/issues/12057 if (\str_contains($e->getMessage(), 'Bad address')) { $sourceHandle = \fopen($source, 'r'); $targetHandle = \fopen($target, 'w'); if (\false === $sourceHandle || \false === $targetHandle) { throw $e; } while (!\feof($sourceHandle)) { if (\false === \fwrite($targetHandle, (string) \fread($sourceHandle, 1024 * 1024))) { throw $e; } } \fclose($sourceHandle); \fclose($targetHandle); return \true; } throw $e; } } $it = new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS); $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::SELF_FIRST); $this->ensureDirectoryExists($target); $result = \true; foreach ($ri as $file) { $targetPath = $target . \DIRECTORY_SEPARATOR . $ri->getSubPathname(); if ($file->isDir()) { $this->ensureDirectoryExists($targetPath); } else { $result = $result && \copy($file->getPathname(), $targetPath); } } return $result; } /** * @return void */ public function rename(string $source, string $target) { if (\true === @\rename($source, $target)) { return; } if (!\function_exists('proc_open')) { $this->copyThenRemove($source, $target); return; } if (\Composer\Util\Platform::isWindows()) { // Try to copy & delete - this is a workaround for random "Access denied" errors. $result = $this->getProcess()->execute(['xcopy', $source, $target, '/E', '/I', '/Q', '/Y'], $output); // clear stat cache because external processes aren't tracked by the php stat cache \clearstatcache(); if (0 === $result) { $this->remove($source); return; } } else { // We do not use PHP's "rename" function here since it does not support // the case where $source, and $target are located on different partitions. $result = $this->getProcess()->execute(['mv', $source, $target], $output); // clear stat cache because external processes aren't tracked by the php stat cache \clearstatcache(); if (0 === $result) { return; } } $this->copyThenRemove($source, $target); } /** * Returns the shortest path from $from to $to * * @param bool $directories if true, the source/target are considered to be directories * @param bool $preferRelative if true, relative paths will be preferred even if longer * @throws \InvalidArgumentException * @return string */ public function findShortestPath(string $from, string $to, bool $directories = \false, bool $preferRelative = \false) { if (!$this->isAbsolutePath($from) || !$this->isAbsolutePath($to)) { throw new \InvalidArgumentException(\sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to)); } $from = $this->normalizePath($from); $to = $this->normalizePath($to); if ($directories) { $from = \rtrim($from, '/') . '/dummy_file'; } if (\dirname($from) === \dirname($to)) { return './' . \basename($to); } $commonPath = $to; while (\strpos($from . '/', $commonPath . '/') !== 0 && '/' !== $commonPath && !Preg::isMatch('{^[A-Z]:/?$}i', $commonPath)) { $commonPath = \strtr(\dirname($commonPath), '\\', '/'); } // no commonality at all if (0 !== \strpos($from, $commonPath)) { return $to; } $commonPath = \rtrim($commonPath, '/') . '/'; $sourcePathDepth = \substr_count((string) \substr($from, \strlen($commonPath)), '/'); $commonPathCode = \str_repeat('../', $sourcePathDepth); // allow top level /foo & /bar dirs to be addressed relatively as this is common in Docker setups if (!$preferRelative && '/' === $commonPath && $sourcePathDepth > 1) { return $to; } $result = $commonPathCode . \substr($to, \strlen($commonPath)); if (\strlen($result) === 0) { return './'; } return $result; } /** * Returns PHP code that, when executed in $from, will return the path to $to * * @param bool $directories if true, the source/target are considered to be directories * @param bool $preferRelative if true, relative paths will be preferred even if longer * @throws \InvalidArgumentException * @return string */ public function findShortestPathCode(string $from, string $to, bool $directories = \false, bool $staticCode = \false, bool $preferRelative = \false) { if (!$this->isAbsolutePath($from) || !$this->isAbsolutePath($to)) { throw new \InvalidArgumentException(\sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to)); } $from = $this->normalizePath($from); $to = $this->normalizePath($to); if ($from === $to) { return $directories ? '__DIR__' : '__FILE__'; } $commonPath = $to; while (\strpos($from . '/', $commonPath . '/') !== 0 && '/' !== $commonPath && !Preg::isMatch('{^[A-Z]:/?$}i', $commonPath) && '.' !== $commonPath) { $commonPath = \strtr(\dirname($commonPath), '\\', '/'); } // no commonality at all if (0 !== \strpos($from, $commonPath) || '.' === $commonPath) { return \var_export($to, \true); } $commonPath = \rtrim($commonPath, '/') . '/'; if (\str_starts_with($to, $from . '/')) { return '__DIR__ . ' . \var_export((string) \substr($to, \strlen($from)), \true); } $sourcePathDepth = \substr_count((string) \substr($from, \strlen($commonPath)), '/') + (int) $directories; // allow top level /foo & /bar dirs to be addressed relatively as this is common in Docker setups if (!$preferRelative && '/' === $commonPath && $sourcePathDepth > 1) { return \var_export($to, \true); } if ($staticCode) { $commonPathCode = "__DIR__ . '" . \str_repeat('/..', $sourcePathDepth) . "'"; } else { $commonPathCode = \str_repeat('dirname(', $sourcePathDepth) . '__DIR__' . \str_repeat(')', $sourcePathDepth); } $relTarget = (string) \substr($to, \strlen($commonPath)); return $commonPathCode . (\strlen($relTarget) > 0 ? '.' . \var_export('/' . $relTarget, \true) : ''); } /** * Checks if the given path is absolute * * @return bool */ public function isAbsolutePath(string $path) { return \strpos($path, '/') === 0 || \substr($path, 1, 1) === ':' || \strpos($path, '\\\\') === 0; } /** * Returns size of a file or directory specified by path. If a directory is * given, its size will be computed recursively. * * @param string $path Path to the file or directory * @throws \RuntimeException * @return int */ public function size(string $path) { if (!\file_exists($path)) { throw new \RuntimeException("{$path} does not exist."); } if (\is_dir($path)) { return $this->directorySize($path); } return (int) \filesize($path); } /** * Normalize a path. This replaces backslashes with slashes, removes ending * slash and collapses redundant separators and up-level references. * * @param string $path Path to the file or directory * @return string */ public function normalizePath(string $path) { $parts = []; $path = \strtr($path, '\\', '/'); $prefix = ''; $absolute = ''; // extract windows UNC paths e.g. \\foo\bar if (\strpos($path, '//') === 0 && \strlen($path) > 2) { $absolute = '//'; $path = \substr($path, 2); } // extract a prefix being a protocol://, protocol:, protocol://drive: or simply drive: if (Preg::isMatchStrictGroups('{^( [0-9a-z]{2,}+: (?: // (?: [a-z]: )? )? | [a-z]: )}ix', $path, $match)) { $prefix = $match[1]; $path = \substr($path, \strlen($prefix)); } if (\strpos($path, '/') === 0) { $absolute = '/'; $path = \substr($path, 1); } $up = \false; foreach (\explode('/', $path) as $chunk) { if ('..' === $chunk && (\strlen($absolute) > 0 || $up)) { \array_pop($parts); $up = !(\count($parts) === 0 || '..' === \end($parts)); } elseif ('.' !== $chunk && '' !== $chunk) { $parts[] = $chunk; $up = '..' !== $chunk; } } // ensure c: is normalized to C: $prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', static function (array $m) { return \strtoupper($m[0]); }, $prefix); return $prefix . $absolute . \implode('/', $parts); } /** * Remove trailing slashes if present to avoid issues with symlinks * * And other possible unforeseen disasters, see https://github.com/composer/composer/pull/9422 * * @return string */ public static function trimTrailingSlash(string $path) { if (!Preg::isMatch('{^[/\\\\]+$}', $path)) { $path = \rtrim($path, '/\\'); } return $path; } /** * Return if the given path is local * * @return bool */ public static function isLocalPath(string $path) { // on windows, \\foo indicates network paths so we exclude those from local paths, however it is unsafe // on linux as file:////foo (which would be a network path \\foo on windows) will resolve to /foo which could be a local path if (\Composer\Util\Platform::isWindows()) { return Preg::isMatch('{^(file://(?!//)|/(?!/)|/?[a-z]:[\\\\/]|\\.\\.[\\\\/]|[a-z0-9_.-]+[\\\\/])}i', $path); } return Preg::isMatch('{^(file://|/|/?[a-z]:[\\\\/]|\\.\\.[\\\\/]|[a-z0-9_.-]+[\\\\/])}i', $path); } /** * @return string */ public static function getPlatformPath(string $path) { if (\Composer\Util\Platform::isWindows()) { $path = Preg::replace('{^(?:file:///([a-z]):?/)}i', 'file://$1:/', $path); } return Preg::replace('{^file://}i', '', $path); } /** * Cross-platform safe version of is_readable() * * This will also check for readability by reading the file as is_readable can not be trusted on network-mounts * and \\wsl$ paths. See https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 * * @return bool */ public static function isReadable(string $path) { if (\is_readable($path)) { return \true; } if (\is_file($path)) { return \false !== \Composer\Util\Silencer::call('file_get_contents', $path, \false, null, 0, 1); } if (\is_dir($path)) { return \false !== \Composer\Util\Silencer::call('opendir', $path); } // assume false otherwise return \false; } /** * @return int */ protected function directorySize(string $directory) { $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); $size = 0; foreach ($ri as $file) { if ($file->isFile()) { $size += $file->getSize(); } } return $size; } /** * @return ProcessExecutor */ protected function getProcess() { if (null === $this->processExecutor) { $this->processExecutor = new \Composer\Util\ProcessExecutor(); } return $this->processExecutor; } /** * delete symbolic link implementation (commonly known as "unlink()") * * symbolic links on windows which link to directories need rmdir instead of unlink */ private function unlinkImplementation(string $path) : bool { if (\Composer\Util\Platform::isWindows() && \is_dir($path) && \is_link($path)) { return \rmdir($path); } return \unlink($path); } /** * Creates a relative symlink from $link to $target * * @param string $target The path of the binary file to be symlinked * @param string $link The path where the symlink should be created * @return bool */ public function relativeSymlink(string $target, string $link) { if (!\function_exists('symlink')) { return \false; } $cwd = \Composer\Util\Platform::getCwd(); $relativePath = $this->findShortestPath($link, $target); \chdir(\dirname($link)); $result = @\symlink($relativePath, $link); \chdir($cwd); return $result; } /** * return true if that directory is a symlink. * * @return bool */ public function isSymlinkedDirectory(string $directory) { if (!\is_dir($directory)) { return \false; } $resolved = $this->resolveSymlinkedDirectorySymlink($directory); return \is_link($resolved); } private function unlinkSymlinkedDirectory(string $directory) : bool { $resolved = $this->resolveSymlinkedDirectorySymlink($directory); return $this->unlink($resolved); } /** * resolve pathname to symbolic link of a directory * * @param string $pathname directory path to resolve * * @return string resolved path to symbolic link or original pathname (unresolved) */ private function resolveSymlinkedDirectorySymlink(string $pathname) : string { if (!\is_dir($pathname)) { return $pathname; } $resolved = \rtrim($pathname, '/'); if (0 === \strlen($resolved)) { return $pathname; } return $resolved; } /** * Creates an NTFS junction. * * @return void */ public function junction(string $target, string $junction) { if (!\Composer\Util\Platform::isWindows()) { throw new \LogicException(\sprintf('Function %s is not available on non-Windows platform', __CLASS__)); } if (!\is_dir($target)) { throw new IOException(\sprintf('Cannot junction to "%s" as it is not a directory.', $target), 0, null, $target); } // Removing any previously junction to ensure clean execution. if (!\is_dir($junction) || $this->isJunction($junction)) { @\rmdir($junction); } $cmd = ['mklink', '/J', \str_replace('/', \DIRECTORY_SEPARATOR, $junction), \Composer\Util\Platform::realpath($target)]; if ($this->getProcess()->execute($cmd, $output) !== 0) { throw new IOException(\sprintf('Failed to create junction to "%s" at "%s".', $target, $junction), 0, null, $target); } \clearstatcache(\true, $junction); } /** * Returns whether the target directory is a Windows NTFS Junction. * * We test if the path is a directory and not an ordinary link, then check * that the mode value returned from lstat (which gives the status of the * link itself) is not a directory, by replicating the POSIX S_ISDIR test. * * This logic works because PHP does not set the mode value for a junction, * since there is no universal file type flag for it. Unfortunately an * uninitialized variable in PHP prior to 7.2.16 and 7.3.3 may cause a * random value to be returned. See https://bugs.php.net/bug.php?id=77552 * * If this random value passes the S_ISDIR test, then a junction will not be * detected and a recursive delete operation could lead to loss of data in * the target directory. Note that Windows rmdir can handle this situation * and will only delete the junction (from Windows 7 onwards). * * @param string $junction Path to check. * @return bool */ public function isJunction(string $junction) { if (!\Composer\Util\Platform::isWindows()) { return \false; } // Important to clear all caches first \clearstatcache(\true, $junction); if (!\is_dir($junction) || \is_link($junction)) { return \false; } $stat = \lstat($junction); // S_ISDIR test (S_IFDIR is 0x4000, S_IFMT is 0xF000 bitmask) return \is_array($stat) ? 0x4000 !== ($stat['mode'] & 0xf000) : \false; } /** * Removes a Windows NTFS junction. * * @return bool */ public function removeJunction(string $junction) { if (!\Composer\Util\Platform::isWindows()) { return \false; } $junction = \rtrim(\str_replace('/', \DIRECTORY_SEPARATOR, $junction), \DIRECTORY_SEPARATOR); if (!$this->isJunction($junction)) { throw new IOException(\sprintf('%s is not a junction and thus cannot be removed as one', $junction)); } return $this->rmdir($junction); } /** * @return int|false */ public function filePutContentsIfModified(string $path, string $content) { $currentContent = \Composer\Util\Silencer::call('file_get_contents', $path); if (\false === $currentContent || $currentContent !== $content) { return \file_put_contents($path, $content); } return 0; } /** * Copy file using stream_copy_to_stream to work around https://bugs.php.net/bug.php?id=6463 */ public function safeCopy(string $source, string $target) : void { if (!\file_exists($target) || !\file_exists($source) || !$this->filesAreEqual($source, $target)) { $sourceHandle = \fopen($source, 'r'); \assert($sourceHandle !== \false, 'Could not open "' . $source . '" for reading.'); $targetHandle = \fopen($target, 'w+'); \assert($targetHandle !== \false, 'Could not open "' . $target . '" for writing.'); \stream_copy_to_stream($sourceHandle, $targetHandle); \fclose($sourceHandle); \fclose($targetHandle); \touch($target, (int) \filemtime($source), (int) \fileatime($source)); } } /** * compare 2 files * https://stackoverflow.com/questions/3060125/can-i-use-file-get-contents-to-compare-two-files */ private function filesAreEqual(string $a, string $b) : bool { // Check if filesize is different if (\filesize($a) !== \filesize($b)) { return \false; } // Check if content is different $aHandle = \fopen($a, 'rb'); \assert($aHandle !== \false, 'Could not open "' . $a . '" for reading.'); $bHandle = \fopen($b, 'rb'); \assert($bHandle !== \false, 'Could not open "' . $b . '" for reading.'); $result = \true; while (!\feof($aHandle)) { if (\fread($aHandle, 8192) !== \fread($bHandle, 8192)) { $result = \false; break; } } \fclose($aHandle); \fclose($bHandle); return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * @author Wissem Riahi */ class Tar { public static function getComposerJson(string $pathToArchive) : ?string { $phar = new \PharData($pathToArchive); if (!$phar->valid()) { return null; } return self::extractComposerJsonFromFolder($phar); } /** * @throws \RuntimeException */ private static function extractComposerJsonFromFolder(\PharData $phar) : string { if (isset($phar['composer.json'])) { return $phar['composer.json']->getContent(); } $topLevelPaths = []; foreach ($phar as $folderFile) { $name = $folderFile->getBasename(); if ($folderFile->isDir()) { $topLevelPaths[$name] = \true; if (\count($topLevelPaths) > 1) { throw new \RuntimeException('Archive has more than one top level directories, and no composer.json was found on the top level, so it\'s an invalid archive. Top level paths found were: ' . \implode(',', \array_keys($topLevelPaths))); } } } $composerJsonPath = \key($topLevelPaths) . '/composer.json'; if (\count($topLevelPaths) > 0 && isset($phar[$composerJsonPath])) { return $phar[$composerJsonPath]->getContent(); } throw new \RuntimeException('No composer.json found either at the top level or within the topmost directory'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class GitHub { /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var HttpDownloader */ protected $httpDownloader; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking */ public function __construct(IOInterface $io, Config $config, ?\Composer\Util\ProcessExecutor $process = null, ?\Composer\Util\HttpDownloader $httpDownloader = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new \Composer\Util\ProcessExecutor($io); $this->httpDownloader = $httpDownloader ?: Factory::createHttpDownloader($this->io, $config); } /** * Attempts to authorize a GitHub domain via OAuth * * @param string $originUrl The host this GitHub instance is located at * @return bool true on success */ public function authorizeOAuth(string $originUrl) : bool { if (!\in_array($originUrl, $this->config->get('github-domains'))) { return \false; } // if available use token from git config if (0 === $this->process->execute(['git', 'config', 'github.accesstoken'], $output)) { $this->io->setAuthentication($originUrl, \trim($output), 'x-oauth-basic'); return \true; } return \false; } /** * Authorizes a GitHub domain interactively via OAuth * * @param string $originUrl The host this GitHub instance is located at * @param string $message The reason this authorization is required * @throws \RuntimeException * @throws TransportException|\Exception * @return bool true on success */ public function authorizeOAuthInteractively(string $originUrl, ?string $message = null) : bool { if ($message) { $this->io->writeError($message); } $note = 'Composer'; if ($this->config->get('github-expose-hostname') === \true && 0 === $this->process->execute(['hostname'], $output)) { $note .= ' on ' . \trim($output); } $note .= ' ' . \date('Y-m-d Hi'); $url = 'https://' . $originUrl . '/settings/tokens/new?scopes=&description=' . \str_replace('%20', '+', \rawurlencode($note)); $this->io->writeError('When working with _public_ GitHub repositories only, head here to retrieve a token:'); $this->io->writeError($url); $this->io->writeError('This token will have read-only permission for public information only.'); $localAuthConfig = $this->config->getLocalAuthConfigSource(); $url = 'https://' . $originUrl . '/settings/tokens/new?scopes=repo&description=' . \str_replace('%20', '+', \rawurlencode($note)); $this->io->writeError('When you need to access _private_ GitHub repositories as well, go to:'); $this->io->writeError($url); $this->io->writeError('Note that such tokens have broad read/write permissions on your behalf, even if not needed by Composer.'); $this->io->writeError(\sprintf('Tokens will be stored in plain text in "%s" for future use by Composer.', ($localAuthConfig !== null ? $localAuthConfig->getName() . ' OR ' : '') . $this->config->getAuthConfigSource()->getName())); $this->io->writeError('For additional information, check https://getcomposer.org/doc/articles/authentication-for-private-packages.md#github-oauth'); $storeInLocalAuthConfig = \false; if ($localAuthConfig !== null) { $storeInLocalAuthConfig = $this->io->askConfirmation('A local auth config source was found, do you want to store the token there?', \true); } $token = \trim((string) $this->io->askAndHideAnswer('Token (hidden): ')); if ($token === '') { $this->io->writeError('No token given, aborting.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth github-oauth.github.com "'); return \false; } $this->io->setAuthentication($originUrl, $token, 'x-oauth-basic'); try { $apiUrl = 'github.com' === $originUrl ? 'api.github.com/' : $originUrl . '/api/v3/'; $this->httpDownloader->get('https://' . $apiUrl, ['retry-auth-failure' => \false]); } catch (TransportException $e) { if (\in_array($e->getCode(), [403, 401])) { $this->io->writeError('Invalid token provided.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth github-oauth.github.com "'); return \false; } throw $e; } // store value in local/user config $authConfigSource = $storeInLocalAuthConfig && $localAuthConfig !== null ? $localAuthConfig : $this->config->getAuthConfigSource(); $this->config->getConfigSource()->removeConfigSetting('github-oauth.' . $originUrl); $authConfigSource->addConfigSetting('github-oauth.' . $originUrl, $token); $this->io->writeError('Token stored successfully.'); return \true; } /** * Extract rate limit from response. * * @param string[] $headers Headers from Composer\Downloader\TransportException. * * @return array{limit: int|'?', reset: string} */ public function getRateLimit(array $headers) : array { $rateLimit = ['limit' => '?', 'reset' => '?']; foreach ($headers as $header) { $header = \trim($header); if (\false === \stripos($header, 'x-ratelimit-')) { continue; } [$type, $value] = \explode(':', $header, 2); switch (\strtolower($type)) { case 'x-ratelimit-limit': $rateLimit['limit'] = (int) \trim($value); break; case 'x-ratelimit-reset': $rateLimit['reset'] = \date('Y-m-d H:i:s', (int) \trim($value)); break; } } return $rateLimit; } /** * Extract SSO URL from response. * * @param string[] $headers Headers from Composer\Downloader\TransportException. */ public function getSsoUrl(array $headers) : ?string { foreach ($headers as $header) { $header = \trim($header); if (\false === \stripos($header, 'x-github-sso: required')) { continue; } if (Preg::isMatch('{\\burl=(?P[^\\s;]+)}', $header, $match)) { return $match['url']; } } return null; } /** * Finds whether a request failed due to rate limiting * * @param string[] $headers Headers from Composer\Downloader\TransportException. */ public function isRateLimited(array $headers) : bool { foreach ($headers as $header) { if (Preg::isMatch('{^x-ratelimit-remaining: *0$}i', \trim($header))) { return \true; } } return \false; } /** * Finds whether a request failed due to lacking SSO authorization * * @see https://docs.github.com/en/rest/overview/other-authentication-methods#authenticating-for-saml-sso * * @param string[] $headers Headers from Composer\Downloader\TransportException. */ public function requiresSso(array $headers) : bool { foreach ($headers as $header) { if (Preg::isMatch('{^x-github-sso: required}i', \trim($header))) { return \true; } } return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; use Composer\Config; use Composer\Factory; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; /** * @author Roshan Gautam */ class GitLab { /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var HttpDownloader */ protected $httpDownloader; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking */ public function __construct(IOInterface $io, Config $config, ?\Composer\Util\ProcessExecutor $process = null, ?\Composer\Util\HttpDownloader $httpDownloader = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new \Composer\Util\ProcessExecutor($io); $this->httpDownloader = $httpDownloader ?: Factory::createHttpDownloader($this->io, $config); } /** * Attempts to authorize a GitLab domain via OAuth. * * @param string $originUrl The host this GitLab instance is located at * * @return bool true on success */ public function authorizeOAuth(string $originUrl) : bool { // before composer 1.9, origin URLs had no port number in them $bcOriginUrl = Preg::replace('{:\\d+}', '', $originUrl); if (!\in_array($originUrl, $this->config->get('gitlab-domains'), \true) && !\in_array($bcOriginUrl, $this->config->get('gitlab-domains'), \true)) { return \false; } // if available use token from git config if (0 === $this->process->execute(['git', 'config', 'gitlab.accesstoken'], $output)) { $this->io->setAuthentication($originUrl, \trim($output), 'oauth2'); return \true; } // if available use deploy token from git config if (0 === $this->process->execute(['git', 'config', 'gitlab.deploytoken.user'], $tokenUser) && 0 === $this->process->execute(['git', 'config', 'gitlab.deploytoken.token'], $tokenPassword)) { $this->io->setAuthentication($originUrl, \trim($tokenUser), \trim($tokenPassword)); return \true; } // if available use token from composer config $authTokens = $this->config->get('gitlab-token'); if (isset($authTokens[$originUrl])) { $token = $authTokens[$originUrl]; } if (isset($authTokens[$bcOriginUrl])) { $token = $authTokens[$bcOriginUrl]; } if (isset($token)) { $username = \is_array($token) ? $token["username"] : $token; $password = \is_array($token) ? $token["token"] : 'private-token'; // Composer expects the GitLab token to be stored as username and 'private-token' or 'gitlab-ci-token' to be stored as password // Detect cases where this is reversed and resolve automatically resolve it if (\in_array($username, ['private-token', 'gitlab-ci-token', 'oauth2'], \true)) { $this->io->setAuthentication($originUrl, $password, $username); } else { $this->io->setAuthentication($originUrl, $username, $password); } return \true; } return \false; } /** * Authorizes a GitLab domain interactively via OAuth. * * @param string $scheme Scheme used in the origin URL * @param string $originUrl The host this GitLab instance is located at * @param string $message The reason this authorization is required * * @throws \RuntimeException * @throws TransportException|\Exception * * @return bool true on success */ public function authorizeOAuthInteractively(string $scheme, string $originUrl, ?string $message = null) : bool { if ($message) { $this->io->writeError($message); } $localAuthConfig = $this->config->getLocalAuthConfigSource(); $personalAccessTokenLink = $scheme . '://' . $originUrl . '/-/user_settings/personal_access_tokens'; $revokeLink = $scheme . '://' . $originUrl . '/-/user_settings/applications'; $this->io->writeError(\sprintf('A token will be created and stored in "%s", your password will never be stored', ($localAuthConfig !== null ? $localAuthConfig->getName() . ' OR ' : '') . $this->config->getAuthConfigSource()->getName())); $this->io->writeError('To revoke access to this token you can visit:'); $this->io->writeError($revokeLink); $this->io->writeError('Alternatively you can setup an personal access token on:'); $this->io->writeError($personalAccessTokenLink); $this->io->writeError('and store it under "gitlab-token" see https://getcomposer.org/doc/articles/authentication-for-private-packages.md#gitlab-token for more details.'); $this->io->writeError('https://getcomposer.org/doc/articles/authentication-for-private-packages.md#gitlab-token'); $this->io->writeError('for more details.'); $storeInLocalAuthConfig = \false; if ($localAuthConfig !== null) { $storeInLocalAuthConfig = $this->io->askConfirmation('A local auth config source was found, do you want to store the token there?', \true); } $attemptCounter = 0; while ($attemptCounter++ < 5) { try { $response = $this->createToken($scheme, $originUrl); } catch (TransportException $e) { // 401 is bad credentials, // 403 is max login attempts exceeded if (\in_array($e->getCode(), [403, 401])) { if (401 === $e->getCode()) { $response = \json_decode($e->getResponse(), \true); if (isset($response['error']) && $response['error'] === 'invalid_grant') { $this->io->writeError('Bad credentials. If you have two factor authentication enabled you will have to manually create a personal access token'); } else { $this->io->writeError('Bad credentials.'); } } else { $this->io->writeError('Maximum number of login attempts exceeded. Please try again later.'); } $this->io->writeError('You can also manually create a personal access token enabling the "read_api" scope at:'); $this->io->writeError($personalAccessTokenLink); $this->io->writeError('Add it using "composer config --global --auth gitlab-token.' . $originUrl . ' "'); continue; } throw $e; } $this->io->setAuthentication($originUrl, $response['access_token'], 'oauth2'); $authConfigSource = $storeInLocalAuthConfig && $localAuthConfig !== null ? $localAuthConfig : $this->config->getAuthConfigSource(); // store value in user config in auth file if (isset($response['expires_in'])) { $authConfigSource->addConfigSetting('gitlab-oauth.' . $originUrl, ['expires-at' => \intval($response['created_at']) + \intval($response['expires_in']), 'refresh-token' => $response['refresh_token'], 'token' => $response['access_token']]); } else { $authConfigSource->addConfigSetting('gitlab-oauth.' . $originUrl, $response['access_token']); } return \true; } throw new \RuntimeException('Invalid GitLab credentials 5 times in a row, aborting.'); } /** * Authorizes a GitLab domain interactively via OAuth. * * @param string $scheme Scheme used in the origin URL * @param string $originUrl The host this GitLab instance is located at * * @throws \RuntimeException * @throws TransportException|\Exception * * @return bool true on success */ public function authorizeOAuthRefresh(string $scheme, string $originUrl) : bool { try { $response = $this->refreshToken($scheme, $originUrl); } catch (TransportException $e) { $this->io->writeError("Couldn't refresh access token: " . $e->getMessage()); return \false; } $this->io->setAuthentication($originUrl, $response['access_token'], 'oauth2'); // store value in user config in auth file $this->config->getAuthConfigSource()->addConfigSetting('gitlab-oauth.' . $originUrl, ['expires-at' => \intval($response['created_at']) + \intval($response['expires_in']), 'refresh-token' => $response['refresh_token'], 'token' => $response['access_token']]); return \true; } /** * @return array{access_token: non-empty-string, refresh_token: non-empty-string, token_type: non-empty-string, expires_in?: positive-int, created_at: positive-int} * * @see https://docs.gitlab.com/ee/api/oauth2.html#resource-owner-password-credentials-flow */ private function createToken(string $scheme, string $originUrl) : array { $username = $this->io->ask('Username: '); $password = $this->io->askAndHideAnswer('Password: '); $headers = ['Content-Type: application/x-www-form-urlencoded']; $apiUrl = $originUrl; $data = \http_build_query(['username' => $username, 'password' => $password, 'grant_type' => 'password'], '', '&'); $options = ['retry-auth-failure' => \false, 'http' => ['method' => 'POST', 'header' => $headers, 'content' => $data]]; $token = $this->httpDownloader->get($scheme . '://' . $apiUrl . '/oauth/token', $options)->decodeJson(); $this->io->writeError('Token successfully created'); return $token; } /** * Is the OAuth access token expired? * * @return bool true on expired token, false if token is fresh or expiration date is not set */ public function isOAuthExpired(string $originUrl) : bool { $authTokens = $this->config->get('gitlab-oauth'); if (isset($authTokens[$originUrl]['expires-at'])) { if ($authTokens[$originUrl]['expires-at'] < \time()) { return \true; } } return \false; } /** * @return array{access_token: non-empty-string, refresh_token: non-empty-string, token_type: non-empty-string, expires_in: positive-int, created_at: positive-int} * * @see https://docs.gitlab.com/ee/api/oauth2.html#resource-owner-password-credentials-flow */ private function refreshToken(string $scheme, string $originUrl) : array { $authTokens = $this->config->get('gitlab-oauth'); if (!isset($authTokens[$originUrl]['refresh-token'])) { throw new \RuntimeException('No GitLab refresh token present for ' . $originUrl . '.'); } $refreshToken = $authTokens[$originUrl]['refresh-token']; $headers = ['Content-Type: application/x-www-form-urlencoded']; $data = \http_build_query(['refresh_token' => $refreshToken, 'grant_type' => 'refresh_token'], '', '&'); $options = ['retry-auth-failure' => \false, 'http' => ['method' => 'POST', 'header' => $headers, 'content' => $data]]; $token = $this->httpDownloader->get($scheme . '://' . $originUrl . '/oauth/token', $options)->decodeJson(); $this->io->writeError('GitLab token successfully refreshed', \true, IOInterface::VERY_VERBOSE); $this->io->writeError('To revoke access to this token you can visit ' . $scheme . '://' . $originUrl . '/-/user_settings/applications', \true, IOInterface::VERY_VERBOSE); return $token; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\Downloader\TransportException; /** * @author Paul Wenke */ class Bitbucket { /** @var IOInterface */ private $io; /** @var Config */ private $config; /** @var ProcessExecutor */ private $process; /** @var HttpDownloader */ private $httpDownloader; /** @var array{access_token: string, expires_in?: int}|null */ private $token = null; /** @var int|null */ private $time; public const OAUTH2_ACCESS_TOKEN_URL = 'https://bitbucket.org/site/oauth2/access_token'; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking * @param int $time Timestamp, injectable for mocking */ public function __construct(IOInterface $io, Config $config, ?\Composer\Util\ProcessExecutor $process = null, ?\Composer\Util\HttpDownloader $httpDownloader = null, ?int $time = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new \Composer\Util\ProcessExecutor($io); $this->httpDownloader = $httpDownloader ?: Factory::createHttpDownloader($this->io, $config); $this->time = $time; } public function getToken() : string { if (!isset($this->token['access_token'])) { return ''; } return $this->token['access_token']; } /** * Attempts to authorize a Bitbucket domain via OAuth * * @param string $originUrl The host this Bitbucket instance is located at * @return bool true on success */ public function authorizeOAuth(string $originUrl) : bool { if ($originUrl !== 'bitbucket.org') { return \false; } // if available use token from git config if (0 === $this->process->execute(['git', 'config', 'bitbucket.accesstoken'], $output)) { $this->io->setAuthentication($originUrl, 'x-token-auth', \trim($output)); return \true; } return \false; } private function requestAccessToken() : bool { try { $response = $this->httpDownloader->get(self::OAUTH2_ACCESS_TOKEN_URL, ['retry-auth-failure' => \false, 'http' => ['method' => 'POST', 'content' => 'grant_type=client_credentials']]); $token = $response->decodeJson(); if (!isset($token['expires_in']) || !isset($token['access_token'])) { throw new \LogicException('Expected a token configured with expires_in and access_token present, got ' . \json_encode($token)); } $this->token = $token; } catch (TransportException $e) { if ($e->getCode() === 400) { $this->io->writeError('Invalid OAuth consumer provided.'); $this->io->writeError('This can have three reasons:'); $this->io->writeError('1. You are authenticating with a bitbucket username/password combination'); $this->io->writeError('2. You are using an OAuth consumer, but didn\'t configure a (dummy) callback url'); $this->io->writeError('3. You are using an OAuth consumer, but didn\'t configure it as private consumer'); return \false; } if (\in_array($e->getCode(), [403, 401])) { $this->io->writeError('Invalid OAuth consumer provided.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org "'); return \false; } throw $e; } return \true; } /** * Authorizes a Bitbucket domain interactively via OAuth * * @param string $originUrl The host this Bitbucket instance is located at * @param string $message The reason this authorization is required * @throws \RuntimeException * @throws TransportException|\Exception * @return bool true on success */ public function authorizeOAuthInteractively(string $originUrl, ?string $message = null) : bool { if ($message) { $this->io->writeError($message); } $localAuthConfig = $this->config->getLocalAuthConfigSource(); $url = 'https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/'; $this->io->writeError('Follow the instructions here:'); $this->io->writeError($url); $this->io->writeError(\sprintf('to create a consumer. It will be stored in "%s" for future use by Composer.', ($localAuthConfig !== null ? $localAuthConfig->getName() . ' OR ' : '') . $this->config->getAuthConfigSource()->getName())); $this->io->writeError('Ensure you enter a "Callback URL" (http://example.com is fine) or it will not be possible to create an Access Token (this callback url will not be used by composer)'); $storeInLocalAuthConfig = \false; if ($localAuthConfig !== null) { $storeInLocalAuthConfig = $this->io->askConfirmation('A local auth config source was found, do you want to store the token there?', \true); } $consumerKey = \trim((string) $this->io->askAndHideAnswer('Consumer Key (hidden): ')); if (!$consumerKey) { $this->io->writeError('No consumer key given, aborting.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org "'); return \false; } $consumerSecret = \trim((string) $this->io->askAndHideAnswer('Consumer Secret (hidden): ')); if (!$consumerSecret) { $this->io->writeError('No consumer secret given, aborting.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org "'); return \false; } $this->io->setAuthentication($originUrl, $consumerKey, $consumerSecret); if (!$this->requestAccessToken()) { return \false; } // store value in user config $authConfigSource = $storeInLocalAuthConfig && $localAuthConfig !== null ? $localAuthConfig : $this->config->getAuthConfigSource(); $this->storeInAuthConfig($authConfigSource, $originUrl, $consumerKey, $consumerSecret); // Remove conflicting basic auth credentials (if available) $this->config->getAuthConfigSource()->removeConfigSetting('http-basic.' . $originUrl); $this->io->writeError('Consumer stored successfully.'); return \true; } /** * Retrieves an access token from Bitbucket. */ public function requestToken(string $originUrl, string $consumerKey, string $consumerSecret) : string { if ($this->token !== null || $this->getTokenFromConfig($originUrl)) { return $this->token['access_token']; } $this->io->setAuthentication($originUrl, $consumerKey, $consumerSecret); if (!$this->requestAccessToken()) { return ''; } $this->storeInAuthConfig($this->config->getLocalAuthConfigSource() ?? $this->config->getAuthConfigSource(), $originUrl, $consumerKey, $consumerSecret); if (!isset($this->token['access_token'])) { throw new \LogicException('Failed to initialize token above'); } return $this->token['access_token']; } /** * Store the new/updated credentials to the configuration */ private function storeInAuthConfig(Config\ConfigSourceInterface $authConfigSource, string $originUrl, string $consumerKey, string $consumerSecret) : void { $this->config->getConfigSource()->removeConfigSetting('bitbucket-oauth.' . $originUrl); if (null === $this->token || !isset($this->token['expires_in'])) { throw new \LogicException('Expected a token configured with expires_in present, got ' . \json_encode($this->token)); } $time = null === $this->time ? \time() : $this->time; $consumer = ["consumer-key" => $consumerKey, "consumer-secret" => $consumerSecret, "access-token" => $this->token['access_token'], "access-token-expiration" => $time + $this->token['expires_in']]; $this->config->getAuthConfigSource()->addConfigSetting('bitbucket-oauth.' . $originUrl, $consumer); } /** * @phpstan-assert-if-true array{access_token: string} $this->token */ private function getTokenFromConfig(string $originUrl) : bool { $authConfig = $this->config->get('bitbucket-oauth'); if (!isset($authConfig[$originUrl]['access-token'], $authConfig[$originUrl]['access-token-expiration']) || \time() > $authConfig[$originUrl]['access-token-expiration']) { return \false; } $this->token = ['access_token' => $authConfig[$originUrl]['access-token']]; return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; use Composer\Util\Http\Response; use Composer\Util\Http\CurlDownloader; use Composer\Composer; use Composer\Package\Version\VersionParser; use Composer\Semver\Constraint\Constraint; use Composer\Exception\IrrecoverableDownloadException; use React\Promise\Promise; use React\Promise\PromiseInterface; /** * @author Jordi Boggiano * @phpstan-type Request array{url: non-empty-string, options: mixed[], copyTo: string|null} * @phpstan-type Job array{id: int, status: int, request: Request, sync: bool, origin: string, resolve?: callable, reject?: callable, curl_id?: int, response?: Response, exception?: \Throwable} */ class HttpDownloader { private const STATUS_QUEUED = 1; private const STATUS_STARTED = 2; private const STATUS_COMPLETED = 3; private const STATUS_FAILED = 4; private const STATUS_ABORTED = 5; /** @var IOInterface */ private $io; /** @var Config */ private $config; /** @var array */ private $jobs = []; /** @var mixed[] */ private $options = []; /** @var int */ private $runningJobs = 0; /** @var int */ private $maxJobs = 12; /** @var ?CurlDownloader */ private $curl; /** @var ?RemoteFilesystem */ private $rfs; /** @var int */ private $idGen = 0; /** @var bool */ private $disabled; /** @var bool */ private $allowAsync = \false; /** * @param IOInterface $io The IO instance * @param Config $config The config * @param mixed[] $options The options */ public function __construct(IOInterface $io, Config $config, array $options = [], bool $disableTls = \false) { $this->io = $io; $this->disabled = (bool) \Composer\Util\Platform::getEnv('COMPOSER_DISABLE_NETWORK'); // Setup TLS options // The cafile option can be set via config.json if ($disableTls === \false) { $this->options = \Composer\Util\StreamContextFactory::getTlsDefaults($options, $io); } // handle the other externally set options normally. $this->options = \array_replace_recursive($this->options, $options); $this->config = $config; if (self::isCurlEnabled()) { $this->curl = new CurlDownloader($io, $config, $options, $disableTls); } $this->rfs = new \Composer\Util\RemoteFilesystem($io, $config, $options, $disableTls); if (\is_numeric($maxJobs = \Composer\Util\Platform::getEnv('COMPOSER_MAX_PARALLEL_HTTP'))) { $this->maxJobs = \max(1, \min(50, (int) $maxJobs)); } } /** * Download a file synchronously * * @param string $url URL to download * @param mixed[] $options Stream context options e.g. https://www.php.net/manual/en/context.http.php * although not all options are supported when using the default curl downloader * @throws TransportException * @return Response */ public function get(string $url, array $options = []) { if ('' === $url) { throw new \InvalidArgumentException('$url must not be an empty string'); } [$job, $promise] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => null], \true); $promise->then(null, function (\Throwable $e) { // suppress error as it is rethrown to the caller by getResponse() a few lines below }); $this->wait($job['id']); $response = $this->getResponse($job['id']); return $response; } /** * Create an async download operation * * @param string $url URL to download * @param mixed[] $options Stream context options e.g. https://www.php.net/manual/en/context.http.php * although not all options are supported when using the default curl downloader * @throws TransportException * @return PromiseInterface * @phpstan-return PromiseInterface */ public function add(string $url, array $options = []) { if ('' === $url) { throw new \InvalidArgumentException('$url must not be an empty string'); } [, $promise] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => null]); return $promise; } /** * Copy a file synchronously * * @param string $url URL to download * @param string $to Path to copy to * @param mixed[] $options Stream context options e.g. https://www.php.net/manual/en/context.http.php * although not all options are supported when using the default curl downloader * @throws TransportException * @return Response */ public function copy(string $url, string $to, array $options = []) { if ('' === $url) { throw new \InvalidArgumentException('$url must not be an empty string'); } [$job] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => $to], \true); $this->wait($job['id']); return $this->getResponse($job['id']); } /** * Create an async copy operation * * @param string $url URL to download * @param string $to Path to copy to * @param mixed[] $options Stream context options e.g. https://www.php.net/manual/en/context.http.php * although not all options are supported when using the default curl downloader * @throws TransportException * @return PromiseInterface * @phpstan-return PromiseInterface */ public function addCopy(string $url, string $to, array $options = []) { if ('' === $url) { throw new \InvalidArgumentException('$url must not be an empty string'); } [, $promise] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => $to]); return $promise; } /** * Retrieve the options set in the constructor * * @return mixed[] Options */ public function getOptions() { return $this->options; } /** * Merges new options * * @param mixed[] $options * @return void */ public function setOptions(array $options) { $this->options = \array_replace_recursive($this->options, $options); } /** * @phpstan-param Request $request * @return array{Job, PromiseInterface} * @phpstan-return array{Job, PromiseInterface} */ private function addJob(array $request, bool $sync = \false) : array { $request['options'] = \array_replace_recursive($this->options, $request['options']); /** @var Job */ $job = ['id' => $this->idGen++, 'status' => self::STATUS_QUEUED, 'request' => $request, 'sync' => $sync, 'origin' => \Composer\Util\Url::getOrigin($this->config, $request['url'])]; if (!$sync && !$this->allowAsync) { throw new \LogicException('You must use the HttpDownloader instance which is part of a Composer\\Loop instance to be able to run async http requests'); } // capture username/password from URL if there is one if (Preg::isMatchStrictGroups('{^https?://([^:/]+):([^@/]+)@([^/]+)}i', $request['url'], $match)) { $this->io->setAuthentication($job['origin'], \rawurldecode($match[1]), \rawurldecode($match[2])); } $rfs = $this->rfs; if ($this->canUseCurl($job)) { $resolver = static function ($resolve, $reject) use(&$job) : void { $job['status'] = \Composer\Util\HttpDownloader::STATUS_QUEUED; $job['resolve'] = $resolve; $job['reject'] = $reject; }; } else { $resolver = static function ($resolve, $reject) use(&$job, $rfs) : void { // start job $url = $job['request']['url']; $options = $job['request']['options']; $job['status'] = \Composer\Util\HttpDownloader::STATUS_STARTED; if ($job['request']['copyTo']) { $rfs->copy($job['origin'], $url, $job['request']['copyTo'], \false, $options); $headers = $rfs->getLastHeaders(); $response = new \Composer\Util\Http\Response($job['request'], $rfs->findStatusCode($headers), $headers, $job['request']['copyTo'] . '~'); $resolve($response); } else { $body = $rfs->getContents($job['origin'], $url, \false, $options); $headers = $rfs->getLastHeaders(); $response = new \Composer\Util\Http\Response($job['request'], $rfs->findStatusCode($headers), $headers, $body); $resolve($response); } }; } $curl = $this->curl; $canceler = static function () use(&$job, $curl) : void { if ($job['status'] === \Composer\Util\HttpDownloader::STATUS_QUEUED) { $job['status'] = \Composer\Util\HttpDownloader::STATUS_ABORTED; } if ($job['status'] !== \Composer\Util\HttpDownloader::STATUS_STARTED) { return; } $job['status'] = \Composer\Util\HttpDownloader::STATUS_ABORTED; if (isset($job['curl_id'])) { $curl->abortRequest($job['curl_id']); } throw new IrrecoverableDownloadException('Download of ' . \Composer\Util\Url::sanitize($job['request']['url']) . ' canceled'); }; $promise = new Promise($resolver, $canceler); $promise = $promise->then(function ($response) use(&$job) { $job['status'] = \Composer\Util\HttpDownloader::STATUS_COMPLETED; $job['response'] = $response; $this->markJobDone(); return $response; }, function ($e) use(&$job) : void { $job['status'] = \Composer\Util\HttpDownloader::STATUS_FAILED; $job['exception'] = $e; $this->markJobDone(); throw $e; }); $this->jobs[$job['id']] =& $job; if ($this->runningJobs < $this->maxJobs) { $this->startJob($job['id']); } return [$job, $promise]; } private function startJob(int $id) : void { $job =& $this->jobs[$id]; if ($job['status'] !== self::STATUS_QUEUED) { return; } // start job $job['status'] = self::STATUS_STARTED; $this->runningJobs++; \assert(isset($job['resolve'])); \assert(isset($job['reject'])); $resolve = $job['resolve']; $reject = $job['reject']; $url = $job['request']['url']; $options = $job['request']['options']; $origin = $job['origin']; if ($this->disabled) { if (isset($job['request']['options']['http']['header']) && \false !== \stripos(\implode('', $job['request']['options']['http']['header']), 'if-modified-since')) { $resolve(new Response(['url' => $url], 304, [], '')); } else { $e = new TransportException('Network disabled, request canceled: ' . \Composer\Util\Url::sanitize($url), 499); $e->setStatusCode(499); $reject($e); } return; } try { if ($job['request']['copyTo']) { $job['curl_id'] = $this->curl->download($resolve, $reject, $origin, $url, $options, $job['request']['copyTo']); } else { $job['curl_id'] = $this->curl->download($resolve, $reject, $origin, $url, $options); } } catch (\Exception $exception) { $reject($exception); } } private function markJobDone() : void { $this->runningJobs--; } /** * Wait for current async download jobs to complete * * @param int|null $index For internal use only, the job id * * @return void */ public function wait(?int $index = null) { do { $jobCount = $this->countActiveJobs($index); } while ($jobCount); } /** * @internal */ public function enableAsync() : void { $this->allowAsync = \true; } /** * @internal * * @param int|null $index For internal use only, the job id * @return int number of active (queued or started) jobs */ public function countActiveJobs(?int $index = null) : int { if ($this->runningJobs < $this->maxJobs) { foreach ($this->jobs as $job) { if ($job['status'] === self::STATUS_QUEUED && $this->runningJobs < $this->maxJobs) { $this->startJob($job['id']); } } } if ($this->curl) { $this->curl->tick(); } if (null !== $index) { return $this->jobs[$index]['status'] < self::STATUS_COMPLETED ? 1 : 0; } $active = 0; foreach ($this->jobs as $job) { if ($job['status'] < self::STATUS_COMPLETED) { $active++; } elseif (!$job['sync']) { unset($this->jobs[$job['id']]); } } return $active; } /** * @param int $index Job id */ private function getResponse(int $index) : Response { if (!isset($this->jobs[$index])) { throw new \LogicException('Invalid request id'); } if ($this->jobs[$index]['status'] === self::STATUS_FAILED) { \assert(isset($this->jobs[$index]['exception'])); throw $this->jobs[$index]['exception']; } if (!isset($this->jobs[$index]['response'])) { throw new \LogicException('Response not available yet, call wait() first'); } $resp = $this->jobs[$index]['response']; unset($this->jobs[$index]); return $resp; } /** * @internal * * @param array{warning?: string, info?: string, warning-versions?: string, info-versions?: string, warnings?: array, infos?: array} $data */ public static function outputWarnings(IOInterface $io, string $url, $data) : void { $cleanMessage = static function ($msg) use($io) { if (!$io->isDecorated()) { $msg = Preg::replace('{' . \chr(27) . '\\[[;\\d]*m}u', '', $msg); } return $msg; }; // legacy warning/info keys foreach (['warning', 'info'] as $type) { if (empty($data[$type])) { continue; } if (!empty($data[$type . '-versions'])) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($data[$type . '-versions']); $composer = new Constraint('==', $versionParser->normalize(Composer::getVersion())); if (!$constraint->matches($composer)) { continue; } } $io->writeError('<' . $type . '>' . \ucfirst($type) . ' from ' . \Composer\Util\Url::sanitize($url) . ': ' . $cleanMessage($data[$type]) . ''); } // modern Composer 2.2+ format with support for multiple warning/info messages foreach (['warnings', 'infos'] as $key) { if (empty($data[$key])) { continue; } $versionParser = new VersionParser(); foreach ($data[$key] as $spec) { $type = \substr($key, 0, -1); $constraint = $versionParser->parseConstraints($spec['versions']); $composer = new Constraint('==', $versionParser->normalize(Composer::getVersion())); if (!$constraint->matches($composer)) { continue; } $io->writeError('<' . $type . '>' . \ucfirst($type) . ' from ' . \Composer\Util\Url::sanitize($url) . ': ' . $cleanMessage($spec['message']) . ''); } } } /** * @internal * * @return ?string[] */ public static function getExceptionHints(\Throwable $e) : ?array { if (!$e instanceof TransportException) { return null; } if (\false !== \strpos($e->getMessage(), 'Resolving timed out') || \false !== \strpos($e->getMessage(), 'Could not resolve host')) { \Composer\Util\Silencer::suppress(); $testConnectivity = \file_get_contents('https://8.8.8.8', \false, \stream_context_create(['ssl' => ['verify_peer' => \false], 'http' => ['follow_location' => \false, 'ignore_errors' => \true]])); \Composer\Util\Silencer::restore(); if (\false !== $testConnectivity) { return ['The following exception probably indicates you have misconfigured DNS resolver(s)']; } return ['The following exception probably indicates you are offline or have misconfigured DNS resolver(s)']; } return null; } /** * @param Job $job */ private function canUseCurl(array $job) : bool { if (!$this->curl) { return \false; } if (!Preg::isMatch('{^https?://}i', $job['request']['url'])) { return \false; } if (!empty($job['request']['options']['ssl']['allow_self_signed'])) { return \false; } return \true; } /** * @internal */ public static function isCurlEnabled() : bool { return \extension_loaded('curl') && \function_exists('curl_multi_exec') && \function_exists('curl_multi_init'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\XdebugHandler\XdebugHandler; /** * Provides ini file location functions that work with and without a restart. * When the process has restarted it uses a tmp ini and stores the original * ini locations in an environment variable. * * @author John Stevenson */ class IniHelper { /** * Returns an array of php.ini locations with at least one entry * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be empty. * * @return string[] */ public static function getAll() : array { return XdebugHandler::getAllIniFiles(); } /** * Describes the location of the loaded php.ini file(s) */ public static function getMessage() : string { $paths = self::getAll(); if (empty($paths[0])) { \array_shift($paths); } $ini = \array_shift($paths); if (empty($ini)) { return 'A php.ini file does not exist. You will have to create one.'; } if (!empty($paths)) { return 'Your command-line PHP is using multiple ini files. Run `php --ini` to show them.'; } return 'The php.ini used by your command-line PHP is: ' . $ini; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Pcre\Preg; /** * Platform helper for uniform platform-specific tests. * * @author Niels Keurentjes */ class Platform { /** @var ?bool */ private static $isVirtualBoxGuest = null; /** @var ?bool */ private static $isWindowsSubsystemForLinux = null; /** @var ?bool */ private static $isDocker = null; /** * getcwd() equivalent which always returns a string * * @throws \RuntimeException */ public static function getCwd(bool $allowEmpty = \false) : string { $cwd = \getcwd(); // fallback to realpath('') just in case this works but odds are it would break as well if we are in a case where getcwd fails if (\false === $cwd) { $cwd = \realpath(''); } // crappy state, assume '' and hopefully relative paths allow things to continue if (\false === $cwd) { if ($allowEmpty) { return ''; } throw new \RuntimeException('Could not determine the current working directory'); } return $cwd; } /** * Infallible realpath version that falls back on the given $path if realpath is not working */ public static function realpath(string $path) : string { $realPath = \realpath($path); if ($realPath === \false) { return $path; } return $realPath; } /** * getenv() equivalent but reads from the runtime global variables first * * @param non-empty-string $name * * @return string|false */ public static function getEnv(string $name) { if (\array_key_exists($name, $_SERVER)) { return (string) $_SERVER[$name]; } if (\array_key_exists($name, $_ENV)) { return (string) $_ENV[$name]; } return \getenv($name); } /** * putenv() equivalent but updates the runtime global variables too */ public static function putEnv(string $name, string $value) : void { \putenv($name . '=' . $value); $_SERVER[$name] = $_ENV[$name] = $value; } /** * putenv('X') equivalent but updates the runtime global variables too */ public static function clearEnv(string $name) : void { \putenv($name); unset($_SERVER[$name], $_ENV[$name]); } /** * Parses tildes and environment variables in paths. */ public static function expandPath(string $path) : string { if (Preg::isMatch('#^~[\\/]#', $path)) { return self::getUserDirectory() . \substr($path, 1); } return Preg::replaceCallback('#^(\\$|(?P%))(?P\\w++)(?(percent)%)(?P.*)#', static function ($matches) : string { // Treat HOME as an alias for USERPROFILE on Windows for legacy reasons if (\Composer\Util\Platform::isWindows() && $matches['var'] === 'HOME') { if ((bool) \Composer\Util\Platform::getEnv('HOME')) { return \Composer\Util\Platform::getEnv('HOME') . $matches['path']; } return \Composer\Util\Platform::getEnv('USERPROFILE') . $matches['path']; } return \Composer\Util\Platform::getEnv($matches['var']) . $matches['path']; }, $path); } /** * @throws \RuntimeException If the user home could not reliably be determined * @return string The formal user home as detected from environment parameters */ public static function getUserDirectory() : string { if (\false !== ($home = self::getEnv('HOME'))) { return $home; } if (self::isWindows() && \false !== ($home = self::getEnv('USERPROFILE'))) { return $home; } if (\function_exists('posix_getuid') && \function_exists('posix_getpwuid')) { $info = \posix_getpwuid(\posix_getuid()); if (\is_array($info)) { return $info['dir']; } } throw new \RuntimeException('Could not determine user directory'); } /** * @return bool Whether the host machine is running on the Windows Subsystem for Linux (WSL) */ public static function isWindowsSubsystemForLinux() : bool { if (null === self::$isWindowsSubsystemForLinux) { self::$isWindowsSubsystemForLinux = \false; // while WSL will be hosted within windows, WSL itself cannot be windows based itself. if (self::isWindows()) { return self::$isWindowsSubsystemForLinux = \false; } if (!(bool) \ini_get('open_basedir') && \is_readable('/proc/version') && \false !== \stripos((string) \Composer\Util\Silencer::call('file_get_contents', '/proc/version'), 'microsoft') && !self::isDocker()) { return self::$isWindowsSubsystemForLinux = \true; } } return self::$isWindowsSubsystemForLinux; } /** * @return bool Whether the host machine is running a Windows OS */ public static function isWindows() : bool { return \defined('PHP_WINDOWS_VERSION_BUILD'); } public static function isDocker() : bool { if (null !== self::$isDocker) { return self::$isDocker; } // cannot check so assume no if ((bool) \ini_get('open_basedir')) { return self::$isDocker = \false; } // .dockerenv and .containerenv are present in some cases but not reliably if (\file_exists('/.dockerenv') || \file_exists('/run/.containerenv') || \file_exists('/var/run/.containerenv')) { return self::$isDocker = \true; } // see https://www.baeldung.com/linux/is-process-running-inside-container $cgroups = [ '/proc/self/mountinfo', // cgroup v2 '/proc/1/cgroup', ]; foreach ($cgroups as $cgroup) { if (!\is_readable($cgroup)) { continue; } // suppress errors as some environments have these files as readable but system restrictions prevent the read from succeeding // see https://github.com/composer/composer/issues/12095 try { $data = @\file_get_contents($cgroup); } catch (\Throwable $e) { break; } if (!\is_string($data)) { continue; } // detect default mount points created by Docker/containerd if (\str_contains($data, '/var/lib/docker/') || \str_contains($data, '/io.containerd.snapshotter')) { return self::$isDocker = \true; } } return self::$isDocker = \false; } /** * @return int return a guaranteed binary length of the string, regardless of silly mbstring configs */ public static function strlen(string $str) : int { static $useMbString = null; if (null === $useMbString) { $useMbString = \function_exists('mb_strlen') && (bool) \ini_get('mbstring.func_overload'); } if ($useMbString) { return \mb_strlen($str, '8bit'); } return \strlen($str); } /** * @param ?resource $fd Open file descriptor or null to default to STDOUT */ public static function isTty($fd = null) : bool { if ($fd === null) { $fd = \defined('STDOUT') ? \STDOUT : \fopen('php://stdout', 'w'); if ($fd === \false) { return \false; } } // detect msysgit/mingw and assume this is a tty because detection // does not work correctly, see https://github.com/composer/composer/issues/9690 if (\in_array(\strtoupper((string) self::getEnv('MSYSTEM')), ['MINGW32', 'MINGW64'], \true)) { return \true; } // modern cross-platform function, includes the fstat // fallback so if it is present we trust it if (\function_exists('stream_isatty')) { return \stream_isatty($fd); } // only trusting this if it is positive, otherwise prefer fstat fallback if (\function_exists('posix_isatty') && \posix_isatty($fd)) { return \true; } $stat = @\fstat($fd); if ($stat === \false) { return \false; } // Check if formatted mode is S_IFCHR return 020000 === ($stat['mode'] & 0170000); } /** * @return bool Whether the current command is for bash completion */ public static function isInputCompletionProcess() : bool { return '_complete' === ($_SERVER['argv'][1] ?? null); } public static function workaroundFilesystemIssues() : void { if (self::isVirtualBoxGuest()) { \usleep(200000); } } /** * Attempts detection of VirtualBox guest VMs * * This works based on the process' user being "vagrant", the COMPOSER_RUNTIME_ENV env var being set to "virtualbox", or lsmod showing the virtualbox guest additions are loaded */ private static function isVirtualBoxGuest() : bool { if (null === self::$isVirtualBoxGuest) { self::$isVirtualBoxGuest = \false; if (self::isWindows()) { return self::$isVirtualBoxGuest; } if (\function_exists('posix_getpwuid') && \function_exists('posix_geteuid')) { $processUser = \posix_getpwuid(\posix_geteuid()); if (\is_array($processUser) && $processUser['name'] === 'vagrant') { return self::$isVirtualBoxGuest = \true; } } if (self::getEnv('COMPOSER_RUNTIME_ENV') === 'virtualbox') { return self::$isVirtualBoxGuest = \true; } if (\defined('PHP_OS_FAMILY') && \PHP_OS_FAMILY === 'Linux') { $process = new \Composer\Util\ProcessExecutor(); try { if (0 === $process->execute(['lsmod'], $output) && \str_contains($output, 'vboxguest')) { return self::$isVirtualBoxGuest = \true; } } catch (\Exception $e) { // noop } } } return self::$isVirtualBoxGuest; } /** * @return 'NUL'|'/dev/null' */ public static function getDevNull() : string { if (self::isWindows()) { return 'NUL'; } return '/dev/null'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Composer; use Composer\CaBundle\CaBundle; use Composer\Downloader\TransportException; use Composer\Repository\PlatformRepository; use Composer\Util\Http\ProxyManager; use _ContaoManager\Psr\Log\LoggerInterface; /** * Allows the creation of a basic context supporting http proxy * * @author Jordan Alliot * @author Markus Tacker */ final class StreamContextFactory { /** * Creates a context supporting HTTP proxies * * @param non-empty-string $url URL the context is to be used for * @phpstan-param array{http?: array{follow_location?: int, max_redirects?: int, header?: string|array}} $defaultOptions * @param mixed[] $defaultOptions Options to merge with the default * @param mixed[] $defaultParams Parameters to specify on the context * @throws \RuntimeException if https proxy required and OpenSSL uninstalled * @return resource Default context */ public static function getContext(string $url, array $defaultOptions = [], array $defaultParams = []) { $options = ['http' => [ // specify defaults again to try and work better with curlwrappers enabled 'follow_location' => 1, 'max_redirects' => 20, ]]; $options = \array_replace_recursive($options, self::initOptions($url, $defaultOptions)); unset($defaultOptions['http']['header']); $options = \array_replace_recursive($options, $defaultOptions); if (isset($options['http']['header'])) { $options['http']['header'] = self::fixHttpHeaderField($options['http']['header']); } return \stream_context_create($options, $defaultParams); } /** * @param non-empty-string $url * @param mixed[] $options * @param bool $forCurl When true, will not add proxy values as these are handled separately * @phpstan-return array{http: array{header: string[], proxy?: string, request_fulluri: bool}, ssl?: mixed[]} * @return array formatted as a stream context array */ public static function initOptions(string $url, array $options, bool $forCurl = \false) : array { // Make sure the headers are in an array form if (!isset($options['http']['header'])) { $options['http']['header'] = []; } if (\is_string($options['http']['header'])) { $options['http']['header'] = \explode("\r\n", $options['http']['header']); } // Add stream proxy options if there is a proxy if (!$forCurl) { $proxy = ProxyManager::getInstance()->getProxyForRequest($url); $proxyOptions = $proxy->getContextOptions(); if ($proxyOptions !== null) { $isHttpsRequest = 0 === \strpos($url, 'https://'); if ($proxy->isSecure()) { if (!\extension_loaded('openssl')) { throw new TransportException('You must enable the openssl extension to use a secure proxy.'); } if ($isHttpsRequest) { throw new TransportException('You must enable the curl extension to make https requests through a secure proxy.'); } } elseif ($isHttpsRequest && !\extension_loaded('openssl')) { throw new TransportException('You must enable the openssl extension to make https requests through a proxy.'); } // Header will be a Proxy-Authorization string or not set if (isset($proxyOptions['http']['header'])) { $options['http']['header'][] = $proxyOptions['http']['header']; unset($proxyOptions['http']['header']); } $options = \array_replace_recursive($options, $proxyOptions); } } if (\defined('_ContaoManager\\HHVM_VERSION')) { $phpVersion = 'HHVM ' . HHVM_VERSION; } else { $phpVersion = 'PHP ' . \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION . '.' . \PHP_RELEASE_VERSION; } if ($forCurl) { $curl = \curl_version(); $httpVersion = 'cURL ' . $curl['version']; } else { $httpVersion = 'streams'; } if (!isset($options['http']['header']) || \false === \stripos(\implode('', $options['http']['header']), 'user-agent')) { $platformPhpVersion = PlatformRepository::getPlatformPhpVersion(); $options['http']['header'][] = \sprintf('User-Agent: Composer/%s (%s; %s; %s; %s%s%s)', Composer::getVersion(), \function_exists('php_uname') ? \php_uname('s') : 'Unknown', \function_exists('php_uname') ? \php_uname('r') : 'Unknown', $phpVersion, $httpVersion, $platformPhpVersion ? '; Platform-PHP ' . $platformPhpVersion : '', \Composer\Util\Platform::getEnv('CI') ? '; CI' : ''); } return $options; } /** * @param mixed[] $options * * @return mixed[] */ public static function getTlsDefaults(array $options, ?LoggerInterface $logger = null) : array { $ciphers = \implode(':', ['ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-AES256-GCM-SHA384', 'DHE-RSA-AES128-GCM-SHA256', 'DHE-DSS-AES128-GCM-SHA256', 'kEDH+AESGCM', 'ECDHE-RSA-AES128-SHA256', 'ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-SHA', 'ECDHE-ECDSA-AES128-SHA', 'ECDHE-RSA-AES256-SHA384', 'ECDHE-ECDSA-AES256-SHA384', 'ECDHE-RSA-AES256-SHA', 'ECDHE-ECDSA-AES256-SHA', 'DHE-RSA-AES128-SHA256', 'DHE-RSA-AES128-SHA', 'DHE-DSS-AES128-SHA256', 'DHE-RSA-AES256-SHA256', 'DHE-DSS-AES256-SHA', 'DHE-RSA-AES256-SHA', 'AES128-GCM-SHA256', 'AES256-GCM-SHA384', 'AES128-SHA256', 'AES256-SHA256', 'AES128-SHA', 'AES256-SHA', 'AES', 'CAMELLIA', 'DES-CBC3-SHA', '!aNULL', '!eNULL', '!EXPORT', '!DES', '!RC4', '!MD5', '!PSK', '!aECDH', '!EDH-DSS-DES-CBC3-SHA', '!EDH-RSA-DES-CBC3-SHA', '!KRB5-DES-CBC3-SHA']); /** * CN_match and SNI_server_name are only known once a URL is passed. * They will be set in the getOptionsForUrl() method which receives a URL. * * cafile or capath can be overridden by passing in those options to constructor. */ $defaults = ['ssl' => ['ciphers' => $ciphers, 'verify_peer' => \true, 'verify_depth' => 7, 'SNI_enabled' => \true, 'capture_peer_cert' => \true]]; if (isset($options['ssl'])) { $defaults['ssl'] = \array_replace_recursive($defaults['ssl'], $options['ssl']); } /** * Attempt to find a local cafile or throw an exception if none pre-set * The user may go download one if this occurs. */ if (!isset($defaults['ssl']['cafile']) && !isset($defaults['ssl']['capath'])) { $result = CaBundle::getSystemCaRootBundlePath($logger); if (\is_dir($result)) { $defaults['ssl']['capath'] = $result; } else { $defaults['ssl']['cafile'] = $result; } } if (isset($defaults['ssl']['cafile']) && (!\Composer\Util\Filesystem::isReadable($defaults['ssl']['cafile']) || !CaBundle::validateCaFile($defaults['ssl']['cafile'], $logger))) { throw new TransportException('The configured cafile was not valid or could not be read.'); } if (isset($defaults['ssl']['capath']) && (!\is_dir($defaults['ssl']['capath']) || !\Composer\Util\Filesystem::isReadable($defaults['ssl']['capath']))) { throw new TransportException('The configured capath was not valid or could not be read.'); } /** * Disable TLS compression to prevent CRIME attacks where supported. */ $defaults['ssl']['disable_compression'] = \true; return $defaults; } /** * A bug in PHP prevents the headers from correctly being sent when a content-type header is present and * NOT at the end of the array * * This method fixes the array by moving the content-type header to the end * * @link https://bugs.php.net/bug.php?id=61548 * @param string|string[] $header * @return string[] */ private static function fixHttpHeaderField($header) : array { if (!\is_array($header)) { $header = \explode("\r\n", $header); } \uasort($header, static function ($el) : int { return \stripos($el, 'content-type') === 0 ? 1 : -1; }); return $header; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\CaBundle\CaBundle; use Composer\Pcre\Preg; /** * @author Chris Smith * @deprecated Use composer/ca-bundle and composer/composer 2.2 if you still need PHP 5 compatibility, this class will be removed in Composer 3.0 */ final class TlsHelper { /** * Match hostname against a certificate. * * @param mixed $certificate X.509 certificate * @param string $hostname Hostname in the URL * @param string $cn Set to the common name of the certificate iff match found */ public static function checkCertificateHost($certificate, string $hostname, ?string &$cn = null) : bool { $names = self::getCertificateNames($certificate); if (empty($names)) { return \false; } $combinedNames = \array_merge($names['san'], [$names['cn']]); $hostname = \strtolower($hostname); foreach ($combinedNames as $certName) { $matcher = self::certNameMatcher($certName); if ($matcher && $matcher($hostname)) { $cn = $names['cn']; return \true; } } return \false; } /** * Extract DNS names out of an X.509 certificate. * * @param mixed $certificate X.509 certificate * * @return array{cn: string, san: string[]}|null */ public static function getCertificateNames($certificate) : ?array { if (\is_array($certificate)) { $info = $certificate; } elseif (CaBundle::isOpensslParseSafe()) { $info = \openssl_x509_parse($certificate, \false); } if (!isset($info['subject']['commonName'])) { return null; } $commonName = \strtolower($info['subject']['commonName']); $subjectAltNames = []; if (isset($info['extensions']['subjectAltName'])) { $subjectAltNames = Preg::split('{\\s*,\\s*}', $info['extensions']['subjectAltName']); $subjectAltNames = \array_filter(\array_map(static function ($name) : ?string { if (0 === \strpos($name, 'DNS:')) { return \strtolower(\ltrim(\substr($name, 4))); } return null; }, $subjectAltNames), function (?string $san) { return $san !== null; }); $subjectAltNames = \array_values($subjectAltNames); } return ['cn' => $commonName, 'san' => $subjectAltNames]; } /** * Get the certificate pin. * * By Kevin McArthur of StormTide Digital Studios Inc. * @KevinSMcArthur / https://github.com/StormTide * * See https://tools.ietf.org/html/draft-ietf-websec-key-pinning-02 * * This method was adapted from Sslurp. * https://github.com/EvanDotPro/Sslurp * * (c) Evan Coury * * For the full copyright and license information, please see below: * * Copyright (c) 2013, Evan Coury * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ public static function getCertificateFingerprint(string $certificate) : string { $pubkey = \openssl_get_publickey($certificate); if ($pubkey === \false) { throw new \RuntimeException('Failed to retrieve the public key from certificate'); } $pubkeydetails = \openssl_pkey_get_details($pubkey); $pubkeypem = $pubkeydetails['key']; //Convert PEM to DER before SHA1'ing $start = '-----BEGIN PUBLIC KEY-----'; $end = '-----END PUBLIC KEY-----'; $pemtrim = \substr($pubkeypem, \strpos($pubkeypem, $start) + \strlen($start), (\strlen($pubkeypem) - \strpos($pubkeypem, $end)) * -1); $der = \base64_decode($pemtrim); return \hash('sha1', $der); } /** * Test if it is safe to use the PHP function openssl_x509_parse(). * * This checks if OpenSSL extensions is vulnerable to remote code execution * via the exploit documented as CVE-2013-6420. */ public static function isOpensslParseSafe() : bool { return CaBundle::isOpensslParseSafe(); } /** * Convert certificate name into matching function. * * @param string $certName CN/SAN */ private static function certNameMatcher(string $certName) : ?callable { $wildcards = \substr_count($certName, '*'); if (0 === $wildcards) { // Literal match. return static function ($hostname) use($certName) : bool { return $hostname === $certName; }; } if (1 === $wildcards) { $components = \explode('.', $certName); if (3 > \count($components)) { // Must have 3+ components return null; } $firstComponent = $components[0]; // Wildcard must be the last character. if ('*' !== $firstComponent[\strlen($firstComponent) - 1]) { return null; } $wildcardRegex = \preg_quote($certName); $wildcardRegex = \str_replace('\\*', '[a-z0-9-]+', $wildcardRegex); $wildcardRegex = "{^{$wildcardRegex}\$}"; return static function ($hostname) use($wildcardRegex) : bool { return Preg::isMatch($wildcardRegex, $hostname); }; } return null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class Url { /** * @param non-empty-string $url * @return non-empty-string the updated URL */ public static function updateDistReference(Config $config, string $url, string $ref) : string { $host = \parse_url($url, \PHP_URL_HOST); if ($host === 'api.github.com' || $host === 'github.com' || $host === 'www.github.com') { if (Preg::isMatch('{^https?://(?:www\\.)?github\\.com/([^/]+)/([^/]+)/(zip|tar)ball/(.+)$}i', $url, $match)) { // update legacy github archives to API calls with the proper reference $url = 'https://api.github.com/repos/' . $match[1] . '/' . $match[2] . '/' . $match[3] . 'ball/' . $ref; } elseif (Preg::isMatch('{^https?://(?:www\\.)?github\\.com/([^/]+)/([^/]+)/archive/.+\\.(zip|tar)(?:\\.gz)?$}i', $url, $match)) { // update current github web archives to API calls with the proper reference $url = 'https://api.github.com/repos/' . $match[1] . '/' . $match[2] . '/' . $match[3] . 'ball/' . $ref; } elseif (Preg::isMatch('{^https?://api\\.github\\.com/repos/([^/]+)/([^/]+)/(zip|tar)ball(?:/.+)?$}i', $url, $match)) { // update api archives to the proper reference $url = 'https://api.github.com/repos/' . $match[1] . '/' . $match[2] . '/' . $match[3] . 'ball/' . $ref; } } elseif ($host === 'bitbucket.org' || $host === 'www.bitbucket.org') { if (Preg::isMatch('{^https?://(?:www\\.)?bitbucket\\.org/([^/]+)/([^/]+)/get/(.+)\\.(zip|tar\\.gz|tar\\.bz2)$}i', $url, $match)) { // update Bitbucket archives to the proper reference $url = 'https://bitbucket.org/' . $match[1] . '/' . $match[2] . '/get/' . $ref . '.' . $match[4]; } } elseif ($host === 'gitlab.com' || $host === 'www.gitlab.com') { if (Preg::isMatch('{^https?://(?:www\\.)?gitlab\\.com/api/v[34]/projects/([^/]+)/repository/archive\\.(zip|tar\\.gz|tar\\.bz2|tar)\\?sha=.+$}i', $url, $match)) { // update Gitlab archives to the proper reference $url = 'https://gitlab.com/api/v4/projects/' . $match[1] . '/repository/archive.' . $match[2] . '?sha=' . $ref; } } elseif (\in_array($host, $config->get('github-domains'), \true)) { $url = Preg::replace('{(/repos/[^/]+/[^/]+/(zip|tar)ball)(?:/.+)?$}i', '$1/' . $ref, $url); } elseif (\in_array($host, $config->get('gitlab-domains'), \true)) { $url = Preg::replace('{(/api/v[34]/projects/[^/]+/repository/archive\\.(?:zip|tar\\.gz|tar\\.bz2|tar)\\?sha=).+$}i', '${1}' . $ref, $url); } \assert($url !== ''); return $url; } /** * @param non-empty-string $url * @return non-empty-string */ public static function getOrigin(Config $config, string $url) : string { if (0 === \strpos($url, 'file://')) { return $url; } $origin = (string) \parse_url($url, \PHP_URL_HOST); if ($port = \parse_url($url, \PHP_URL_PORT)) { $origin .= ':' . $port; } if (\str_ends_with($origin, '.github.com') && $origin !== 'codeload.github.com') { return 'github.com'; } if ($origin === 'repo.packagist.org') { return 'packagist.org'; } if ($origin === '') { $origin = $url; } // Gitlab can be installed in a non-root context (i.e. gitlab.com/foo). When downloading archives the originUrl // is the host without the path, so we look for the registered gitlab-domains matching the host here if (\false === \strpos($origin, '/') && !\in_array($origin, $config->get('gitlab-domains'), \true)) { foreach ($config->get('gitlab-domains') as $gitlabDomain) { if ($gitlabDomain !== '' && \str_starts_with($gitlabDomain, $origin)) { return $gitlabDomain; } } } return $origin; } public static function sanitize(string $url) : string { // GitHub repository rename result in redirect locations containing the access_token as GET parameter // e.g. https://api.github.com/repositories/9999999999?access_token=github_token $url = Preg::replace('{([&?]access_token=)[^&]+}', '$1***', $url); $url = Preg::replaceCallback('{^(?P[a-z0-9]+://)?(?P[^:/\\s@]+):(?P[^@\\s/]+)@}i', static function ($m) : string { // if the username looks like a long (12char+) hex string, or a modern github token (e.g. ghp_xxx) we obfuscate that if (Preg::isMatch('{^([a-f0-9]{12,}|gh[a-z]_[a-zA-Z0-9_]+|github_pat_[a-zA-Z0-9_]+)$}', $m['user'])) { return $m['prefix'] . '***:***@'; } return $m['prefix'] . $m['user'] . ':***@'; }, $url); return $url; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; use _ContaoManager\Symfony\Component\Process\Process; /** * @author Matt Whittom * * @phpstan-type RepoConfig array{unique_perforce_client_name?: string, depot?: string, branch?: string, p4user?: string, p4password?: string} */ class Perforce { /** @var string */ protected $path; /** @var ?string */ protected $p4Depot; /** @var ?string */ protected $p4Client; /** @var ?string */ protected $p4User; /** @var ?string */ protected $p4Password; /** @var string */ protected $p4Port; /** @var ?string */ protected $p4Stream; /** @var string */ protected $p4ClientSpec; /** @var ?string */ protected $p4DepotType; /** @var ?string */ protected $p4Branch; /** @var ProcessExecutor */ protected $process; /** @var string */ protected $uniquePerforceClientName; /** @var bool */ protected $windowsFlag; /** @var string */ protected $commandResult; /** @var IOInterface */ protected $io; /** @var ?Filesystem */ protected $filesystem; /** * @phpstan-param RepoConfig $repoConfig */ public function __construct($repoConfig, string $port, string $path, \Composer\Util\ProcessExecutor $process, bool $isWindows, IOInterface $io) { $this->windowsFlag = $isWindows; $this->p4Port = $port; $this->initializePath($path); $this->process = $process; $this->initialize($repoConfig); $this->io = $io; } /** * @phpstan-param RepoConfig $repoConfig */ public static function create($repoConfig, string $port, string $path, \Composer\Util\ProcessExecutor $process, IOInterface $io) : self { return new \Composer\Util\Perforce($repoConfig, $port, $path, $process, \Composer\Util\Platform::isWindows(), $io); } public static function checkServerExists(string $url, \Composer\Util\ProcessExecutor $processExecutor) : bool { return 0 === $processExecutor->execute(['p4', '-p', $url, 'info', '-s'], $ignoredOutput); } /** * @phpstan-param RepoConfig $repoConfig */ public function initialize($repoConfig) : void { $this->uniquePerforceClientName = $this->generateUniquePerforceClientName(); if (!$repoConfig) { return; } if (isset($repoConfig['unique_perforce_client_name'])) { $this->uniquePerforceClientName = $repoConfig['unique_perforce_client_name']; } if (isset($repoConfig['depot'])) { $this->p4Depot = $repoConfig['depot']; } if (isset($repoConfig['branch'])) { $this->p4Branch = $repoConfig['branch']; } if (isset($repoConfig['p4user'])) { $this->p4User = $repoConfig['p4user']; } else { $this->p4User = $this->getP4variable('P4USER'); } if (isset($repoConfig['p4password'])) { $this->p4Password = $repoConfig['p4password']; } } public function initializeDepotAndBranch(?string $depot, ?string $branch) : void { if (isset($depot)) { $this->p4Depot = $depot; } if (isset($branch)) { $this->p4Branch = $branch; } } /** * @return non-empty-string */ public function generateUniquePerforceClientName() : string { return \gethostname() . "_" . \time(); } public function cleanupClientSpec() : void { $client = $this->getClient(); $task = 'client -d ' . \Composer\Util\ProcessExecutor::escape($client); $useP4Client = \false; $command = $this->generateP4Command($task, $useP4Client); $this->executeCommand($command); $clientSpec = $this->getP4ClientSpec(); $fileSystem = $this->getFilesystem(); $fileSystem->remove($clientSpec); } /** * @param non-empty-string $command */ protected function executeCommand($command) : int { $this->commandResult = ''; return $this->process->execute($command, $this->commandResult); } public function getClient() : string { if (!isset($this->p4Client)) { $cleanStreamName = \str_replace(['//', '/', '@'], ['', '_', ''], $this->getStream()); $this->p4Client = 'composer_perforce_' . $this->uniquePerforceClientName . '_' . $cleanStreamName; } return $this->p4Client; } protected function getPath() : string { return $this->path; } public function initializePath(string $path) : void { $this->path = $path; $fs = $this->getFilesystem(); $fs->ensureDirectoryExists($path); } protected function getPort() : string { return $this->p4Port; } public function setStream(string $stream) : void { $this->p4Stream = $stream; $index = \strrpos($stream, '/'); //Stream format is //depot/stream, while non-streaming depot is //depot if ($index > 2) { $this->p4DepotType = 'stream'; } } public function isStream() : bool { return \is_string($this->p4DepotType) && \strcmp($this->p4DepotType, 'stream') === 0; } public function getStream() : string { if (!isset($this->p4Stream)) { if ($this->isStream()) { $this->p4Stream = '//' . $this->p4Depot . '/' . $this->p4Branch; } else { $this->p4Stream = '//' . $this->p4Depot; } } return $this->p4Stream; } public function getStreamWithoutLabel(string $stream) : string { $index = \strpos($stream, '@'); if ($index === \false) { return $stream; } return \substr($stream, 0, $index); } /** * @return non-empty-string */ public function getP4ClientSpec() : string { return $this->path . '/' . $this->getClient() . '.p4.spec'; } public function getUser() : ?string { return $this->p4User; } public function setUser(?string $user) : void { $this->p4User = $user; } public function queryP4User() : void { $this->getUser(); if (\strlen((string) $this->p4User) > 0) { return; } $this->p4User = $this->getP4variable('P4USER'); if (\strlen((string) $this->p4User) > 0) { return; } $this->p4User = $this->io->ask('Enter P4 User:'); if ($this->windowsFlag) { $command = $this->getP4Executable() . ' set P4USER=' . $this->p4User; } else { $command = 'export P4USER=' . $this->p4User; } $this->executeCommand($command); } /** * @return ?string */ protected function getP4variable(string $name) : ?string { if ($this->windowsFlag) { $command = $this->getP4Executable() . ' set'; $this->executeCommand($command); $result = \trim($this->commandResult); $resArray = \explode(\PHP_EOL, $result); foreach ($resArray as $line) { $fields = \explode('=', $line); if (\strcmp($name, $fields[0]) === 0) { $index = \strpos($fields[1], ' '); if ($index === \false) { $value = $fields[1]; } else { $value = \substr($fields[1], 0, $index); } $value = \trim($value); return $value; } } return null; } $command = 'echo $' . $name; $this->executeCommand($command); $result = \trim($this->commandResult); return $result; } public function queryP4Password() : ?string { if (isset($this->p4Password)) { return $this->p4Password; } $password = $this->getP4variable('P4PASSWD'); if (\strlen((string) $password) <= 0) { $password = $this->io->askAndHideAnswer('Enter password for Perforce user ' . $this->getUser() . ': '); } $this->p4Password = $password; return $password; } /** * @return non-empty-string */ public function generateP4Command(string $command, bool $useClient = \true) : string { $p4Command = $this->getP4Executable() . ' '; $p4Command .= '-u ' . $this->getUser() . ' '; if ($useClient) { $p4Command .= '-c ' . $this->getClient() . ' '; } $p4Command .= '-p ' . $this->getPort() . ' ' . $command; return $p4Command; } public function isLoggedIn() : bool { $command = $this->generateP4Command('login -s', \false); $exitCode = $this->executeCommand($command); if ($exitCode) { $errorOutput = $this->process->getErrorOutput(); $index = \strpos($errorOutput, $this->getUser()); if ($index === \false) { $index = \strpos($errorOutput, 'p4'); if ($index === \false) { return \false; } throw new \Exception('p4 command not found in path: ' . $errorOutput); } throw new \Exception('Invalid user name: ' . $this->getUser()); } return \true; } public function connectClient() : void { $p4CreateClientCommand = $this->generateP4Command('client -i < ' . \Composer\Util\ProcessExecutor::escape($this->getP4ClientSpec())); $this->executeCommand($p4CreateClientCommand); } public function syncCodeBase(?string $sourceReference) : void { $prevDir = \Composer\Util\Platform::getCwd(); \chdir($this->path); $p4SyncCommand = $this->generateP4Command('sync -f '); if (null !== $sourceReference) { $p4SyncCommand .= '@' . $sourceReference; } $this->executeCommand($p4SyncCommand); \chdir($prevDir); } /** * @param resource|false $spec */ public function writeClientSpecToFile($spec) : void { \fwrite($spec, 'Client: ' . $this->getClient() . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'Update: ' . \date('Y/m/d H:i:s') . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'Access: ' . \date('Y/m/d H:i:s') . \PHP_EOL); \fwrite($spec, 'Owner: ' . $this->getUser() . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'Description:' . \PHP_EOL); \fwrite($spec, ' Created by ' . $this->getUser() . ' from composer.' . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'Root: ' . $this->getPath() . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'Options: noallwrite noclobber nocompress unlocked modtime rmdir' . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'SubmitOptions: revertunchanged' . \PHP_EOL . \PHP_EOL); \fwrite($spec, 'LineEnd: local' . \PHP_EOL . \PHP_EOL); if ($this->isStream()) { \fwrite($spec, 'Stream:' . \PHP_EOL); \fwrite($spec, ' ' . $this->getStreamWithoutLabel($this->p4Stream) . \PHP_EOL); } else { \fwrite($spec, 'View: ' . $this->getStream() . '/... //' . $this->getClient() . '/... ' . \PHP_EOL); } } public function writeP4ClientSpec() : void { $clientSpec = $this->getP4ClientSpec(); $spec = \fopen($clientSpec, 'w'); try { $this->writeClientSpecToFile($spec); } catch (\Exception $e) { \fclose($spec); throw $e; } \fclose($spec); } /** * @param resource $pipe * @param mixed $name */ protected function read($pipe, $name) : void { if (\feof($pipe)) { return; } $line = \fgets($pipe); while ($line !== \false) { $line = \fgets($pipe); } } public function windowsLogin(?string $password) : int { $command = $this->generateP4Command(' login -a'); $process = Process::fromShellCommandline($command, null, null, $password); return $process->run(); } public function p4Login() : void { $this->queryP4User(); if (!$this->isLoggedIn()) { $password = $this->queryP4Password(); if ($this->windowsFlag) { $this->windowsLogin($password); } else { $command = 'echo ' . \Composer\Util\ProcessExecutor::escape($password) . ' | ' . $this->generateP4Command(' login -a', \false); $exitCode = $this->executeCommand($command); if ($exitCode) { throw new \Exception("Error logging in:" . $this->process->getErrorOutput()); } } } } /** * @return mixed[]|null */ public function getComposerInformation(string $identifier) : ?array { $composerFileContent = $this->getFileContent('composer.json', $identifier); if (!$composerFileContent) { return null; } return \json_decode($composerFileContent, \true); } public function getFileContent(string $file, string $identifier) : ?string { $path = $this->getFilePath($file, $identifier); $command = $this->generateP4Command(' print ' . \Composer\Util\ProcessExecutor::escape($path)); $this->executeCommand($command); $result = $this->commandResult; if (!\trim($result)) { return null; } return $result; } public function getFilePath(string $file, string $identifier) : ?string { $index = \strpos($identifier, '@'); if ($index === \false) { return $identifier . '/' . $file; } $path = \substr($identifier, 0, $index) . '/' . $file . \substr($identifier, $index); $command = $this->generateP4Command(' files ' . \Composer\Util\ProcessExecutor::escape($path), \false); $this->executeCommand($command); $result = $this->commandResult; $index2 = \strpos($result, 'no such file(s).'); if ($index2 === \false) { $index3 = \strpos($result, 'change'); if ($index3 !== \false) { $phrase = \trim(\substr($result, $index3)); $fields = \explode(' ', $phrase); return \substr($identifier, 0, $index) . '/' . $file . '@' . $fields[1]; } } return null; } /** * @return array{master: string} */ public function getBranches() : array { $possibleBranches = []; if (!$this->isStream()) { $possibleBranches[$this->p4Branch] = $this->getStream(); } else { $command = $this->generateP4Command('streams ' . \Composer\Util\ProcessExecutor::escape('//' . $this->p4Depot . '/...')); $this->executeCommand($command); $result = $this->commandResult; $resArray = \explode(\PHP_EOL, $result); foreach ($resArray as $line) { $resBits = \explode(' ', $line); if (\count($resBits) > 4) { $branch = Preg::replace('/[^A-Za-z0-9 ]/', '', $resBits[4]); $possibleBranches[$branch] = $resBits[1]; } } } $command = $this->generateP4Command('changes ' . \Composer\Util\ProcessExecutor::escape($this->getStream() . '/...'), \false); $this->executeCommand($command); $result = $this->commandResult; $resArray = \explode(\PHP_EOL, $result); $lastCommit = $resArray[0]; $lastCommitArr = \explode(' ', $lastCommit); $lastCommitNum = $lastCommitArr[1]; return ['master' => $possibleBranches[$this->p4Branch] . '@' . $lastCommitNum]; } /** * @return array */ public function getTags() : array { $command = $this->generateP4Command('labels'); $this->executeCommand($command); $result = $this->commandResult; $resArray = \explode(\PHP_EOL, $result); $tags = []; foreach ($resArray as $line) { if (\strpos($line, 'Label') !== \false) { $fields = \explode(' ', $line); $tags[$fields[1]] = $this->getStream() . '@' . $fields[1]; } } return $tags; } public function checkStream() : bool { $command = $this->generateP4Command('depots', \false); $this->executeCommand($command); $result = $this->commandResult; $resArray = \explode(\PHP_EOL, $result); foreach ($resArray as $line) { if (\strpos($line, 'Depot') !== \false) { $fields = \explode(' ', $line); if (\strcmp($this->p4Depot, $fields[1]) === 0) { $this->p4DepotType = $fields[3]; return $this->isStream(); } } } return \false; } /** * @return mixed|null */ protected function getChangeList(string $reference) : mixed { $index = \strpos($reference, '@'); if ($index === \false) { return null; } $label = \substr($reference, $index); $command = $this->generateP4Command(' changes -m1 ' . \Composer\Util\ProcessExecutor::escape($label)); $this->executeCommand($command); $changes = $this->commandResult; if (\strpos($changes, 'Change') !== 0) { return null; } $fields = \explode(' ', $changes); return $fields[1]; } /** * @return mixed|null */ public function getCommitLogs(string $fromReference, string $toReference) : mixed { $fromChangeList = $this->getChangeList($fromReference); if ($fromChangeList === null) { return null; } $toChangeList = $this->getChangeList($toReference); if ($toChangeList === null) { return null; } $index = \strpos($fromReference, '@'); $main = \substr($fromReference, 0, $index) . '/...'; $command = $this->generateP4Command('filelog ' . \Composer\Util\ProcessExecutor::escape($main . '@' . $fromChangeList . ',' . $toChangeList)); $this->executeCommand($command); return $this->commandResult; } public function getFilesystem() : \Composer\Util\Filesystem { if (null === $this->filesystem) { $this->filesystem = new \Composer\Util\Filesystem($this->process); } return $this->filesystem; } public function setFilesystem(\Composer\Util\Filesystem $fs) : void { $this->filesystem = $fs; } private function getP4Executable() : string { static $p4Executable; if ($p4Executable) { return $p4Executable; } $finder = new ExecutableFinder(); return $p4Executable = $finder->find('p4') ?? 'p4'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util\Http; use Composer\Downloader\TransportException; use Composer\Util\NoProxyPattern; /** * @internal * @author John Stevenson */ class ProxyManager { /** @var ?string */ private $error = null; /** @var ?ProxyItem */ private $httpProxy = null; /** @var ?ProxyItem */ private $httpsProxy = null; /** @var ?NoProxyPattern */ private $noProxyHandler = null; /** @var ?self */ private static $instance = null; private function __construct() { try { $this->getProxyData(); } catch (\RuntimeException $e) { $this->error = $e->getMessage(); } } public static function getInstance() : \Composer\Util\Http\ProxyManager { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } /** * Clears the persistent instance */ public static function reset() : void { self::$instance = null; } public function hasProxy() : bool { return $this->httpProxy !== null || $this->httpsProxy !== null; } /** * Returns a RequestProxy instance for the request url * * @param non-empty-string $requestUrl */ public function getProxyForRequest(string $requestUrl) : \Composer\Util\Http\RequestProxy { if ($this->error !== null) { throw new TransportException('Unable to use a proxy: ' . $this->error); } $scheme = (string) \parse_url($requestUrl, \PHP_URL_SCHEME); $proxy = $this->getProxyForScheme($scheme); if ($proxy === null) { return \Composer\Util\Http\RequestProxy::none(); } if ($this->noProxy($requestUrl)) { return \Composer\Util\Http\RequestProxy::noProxy(); } return $proxy->toRequestProxy($scheme); } /** * Returns a ProxyItem if one is set for the scheme, otherwise null */ private function getProxyForScheme(string $scheme) : ?\Composer\Util\Http\ProxyItem { if ($scheme === 'http') { return $this->httpProxy; } if ($scheme === 'https') { return $this->httpsProxy; } return null; } /** * Finds proxy values from the environment and sets class properties */ private function getProxyData() : void { // Handle http_proxy/HTTP_PROXY on CLI only for security reasons if (\PHP_SAPI === 'cli' || \PHP_SAPI === 'phpdbg') { [$env, $name] = $this->getProxyEnv('http_proxy'); if ($env !== null) { $this->httpProxy = new \Composer\Util\Http\ProxyItem($env, $name); } } // Handle cgi_http_proxy/CGI_HTTP_PROXY if needed if ($this->httpProxy === null) { [$env, $name] = $this->getProxyEnv('cgi_http_proxy'); if ($env !== null) { $this->httpProxy = new \Composer\Util\Http\ProxyItem($env, $name); } } // Handle https_proxy/HTTPS_PROXY [$env, $name] = $this->getProxyEnv('https_proxy'); if ($env !== null) { $this->httpsProxy = new \Composer\Util\Http\ProxyItem($env, $name); } // Handle no_proxy/NO_PROXY [$env, $name] = $this->getProxyEnv('no_proxy'); if ($env !== null) { $this->noProxyHandler = new NoProxyPattern($env); } } /** * Searches $_SERVER for case-sensitive values * * @return array{0: string|null, 1: string} value, name */ private function getProxyEnv(string $envName) : array { $names = [\strtolower($envName), \strtoupper($envName)]; foreach ($names as $name) { if (\is_string($_SERVER[$name] ?? null)) { if ($_SERVER[$name] !== '') { return [$_SERVER[$name], $name]; } } } return [null, '']; } /** * Returns true if a url matches no_proxy value */ private function noProxy(string $requestUrl) : bool { if ($this->noProxyHandler === null) { return \false; } return $this->noProxyHandler->test($requestUrl); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util\Http; use Composer\Json\JsonFile; use Composer\Pcre\Preg; use Composer\Util\HttpDownloader; /** * @phpstan-type Request array{url: non-empty-string, options?: mixed[], copyTo?: string|null} */ class Response { /** @var Request */ private $request; /** @var int */ private $code; /** @var list */ private $headers; /** @var ?string */ private $body; /** * @param Request $request * @param list $headers */ public function __construct(array $request, ?int $code, array $headers, ?string $body) { if (!isset($request['url'])) { throw new \LogicException('url key missing from request array'); } $this->request = $request; $this->code = (int) $code; $this->headers = $headers; $this->body = $body; } public function getStatusCode() : int { return $this->code; } public function getStatusMessage() : ?string { $value = null; foreach ($this->headers as $header) { if (Preg::isMatch('{^HTTP/\\S+ \\d+}i', $header)) { // In case of redirects, headers contain the headers of all responses // so we can not return directly and need to keep iterating $value = $header; } } return $value; } /** * @return string[] */ public function getHeaders() : array { return $this->headers; } /** * @return ?string */ public function getHeader(string $name) : ?string { return self::findHeaderValue($this->headers, $name); } /** * @return ?string */ public function getBody() : ?string { return $this->body; } /** * @return mixed */ public function decodeJson() { return JsonFile::parseJson($this->body, $this->request['url']); } /** * @phpstan-impure */ public function collect() : void { unset($this->request, $this->code, $this->headers, $this->body); } /** * @param string[] $headers array of returned headers like from getLastHeaders() * @param string $name header name (case insensitive) */ public static function findHeaderValue(array $headers, string $name) : ?string { $value = null; foreach ($headers as $header) { if (Preg::isMatch('{^' . \preg_quote($name) . ':\\s*(.+?)\\s*$}i', $header, $match)) { $value = $match[1]; } } return $value; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util\Http; use Composer\Downloader\TransportException; /** * @internal * @author John Stevenson * * @phpstan-type contextOptions array{http: array{proxy: string, header?: string, request_fulluri?: bool}} */ class RequestProxy { /** @var ?contextOptions */ private $contextOptions; /** @var ?non-empty-string */ private $status; /** @var ?non-empty-string */ private $url; /** @var ?non-empty-string */ private $auth; /** * @param ?non-empty-string $url The proxy url, without authorization * @param ?non-empty-string $auth Authorization for curl * @param ?contextOptions $contextOptions * @param ?non-empty-string $status */ public function __construct(?string $url, ?string $auth, ?array $contextOptions, ?string $status) { $this->url = $url; $this->auth = $auth; $this->contextOptions = $contextOptions; $this->status = $status; } public static function none() : \Composer\Util\Http\RequestProxy { return new self(null, null, null, null); } public static function noProxy() : \Composer\Util\Http\RequestProxy { return new self(null, null, null, 'excluded by no_proxy'); } /** * Returns the context options to use for this request, otherwise null * * @return ?contextOptions */ public function getContextOptions() : ?array { return $this->contextOptions; } /** * Returns an array of curl proxy options * * @param array $sslOptions * @return array */ public function getCurlOptions(array $sslOptions) : array { if ($this->isSecure() && !$this->supportsSecureProxy()) { throw new TransportException('Cannot use an HTTPS proxy. PHP >= 7.3 and cUrl >= 7.52.0 are required.'); } // Always set a proxy url, even an empty value, because it tells curl // to ignore proxy environment variables $options = [\CURLOPT_PROXY => (string) $this->url]; // If using a proxy, tell curl to ignore no_proxy environment variables if ($this->url !== null) { $options[\CURLOPT_NOPROXY] = ''; } // Set any authorization if ($this->auth !== null) { $options[\CURLOPT_PROXYAUTH] = \CURLAUTH_BASIC; $options[\CURLOPT_PROXYUSERPWD] = $this->auth; } if ($this->isSecure()) { if (isset($sslOptions['cafile'])) { $options[\CURLOPT_PROXY_CAINFO] = $sslOptions['cafile']; } if (isset($sslOptions['capath'])) { $options[\CURLOPT_PROXY_CAPATH] = $sslOptions['capath']; } } return $options; } /** * Returns proxy info associated with this request * * An empty return value means that the user has not set a proxy. * A non-empty value will either be the sanitized proxy url if a proxy is * required, or a message indicating that a no_proxy value has disabled the * proxy. * * @param ?string $format Output format specifier */ public function getStatus(?string $format = null) : string { if ($this->status === null) { return ''; } $format = $format ?? '%s'; if (\strpos($format, '%s') !== \false) { return \sprintf($format, $this->status); } throw new \InvalidArgumentException('String format specifier is missing'); } /** * Returns true if the request url has been excluded by a no_proxy value * * A false value can also mean that the user has not set a proxy. */ public function isExcludedByNoProxy() : bool { return $this->status !== null && $this->url === null; } /** * Returns true if this is a secure (HTTPS) proxy * * A false value means that this is either an HTTP proxy, or that a proxy * is not required for this request, or that the user has not set a proxy. */ public function isSecure() : bool { return 0 === \strpos((string) $this->url, 'https://'); } /** * Returns true if an HTTPS proxy can be used. * * This depends on PHP7.3+ for CURL_VERSION_HTTPS_PROXY * and curl including the feature (from version 7.52.0) */ public function supportsSecureProxy() : bool { if (\false === ($version = \curl_version()) || !\defined('CURL_VERSION_HTTPS_PROXY')) { return \false; } $features = $version['features']; return (bool) ($features & \CURL_VERSION_HTTPS_PROXY); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util\Http; use Composer\Config; use Composer\Downloader\MaxFileSizeExceededException; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; use Composer\Util\Platform; use Composer\Util\StreamContextFactory; use Composer\Util\AuthHelper; use Composer\Util\Url; use Composer\Util\HttpDownloader; use React\Promise\Promise; use _ContaoManager\Symfony\Component\HttpFoundation\IpUtils; /** * @internal * @author Jordi Boggiano * @author Nicolas Grekas * @phpstan-type Attributes array{retryAuthFailure: bool, redirects: int<0, max>, retries: int<0, max>, storeAuth: 'prompt'|bool, ipResolve: 4|6|null} * @phpstan-type Job array{url: non-empty-string, origin: string, attributes: Attributes, options: mixed[], progress: mixed[], curlHandle: \CurlHandle, filename: string|null, headerHandle: resource, bodyHandle: resource, resolve: callable, reject: callable, primaryIp: string} */ class CurlDownloader { /** * Known libcurl's broken versions when proxy is in use with HTTP/2 * multiplexing. * * @var list */ private const BAD_MULTIPLEXING_CURL_VERSIONS = ['7.87.0', '7.88.0', '7.88.1']; /** @var \CurlMultiHandle */ private $multiHandle; /** @var \CurlShareHandle */ private $shareHandle; /** @var Job[] */ private $jobs = []; /** @var IOInterface */ private $io; /** @var Config */ private $config; /** @var AuthHelper */ private $authHelper; /** @var float */ private $selectTimeout = 5.0; /** @var int */ private $maxRedirects = 20; /** @var int */ private $maxRetries = 3; /** @var array */ protected $multiErrors = [\CURLM_BAD_HANDLE => ['CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'], \CURLM_BAD_EASY_HANDLE => ['CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."], \CURLM_OUT_OF_MEMORY => ['CURLM_OUT_OF_MEMORY', 'You are doomed.'], \CURLM_INTERNAL_ERROR => ['CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!']]; /** @var mixed[] */ private static $options = ['http' => ['method' => \CURLOPT_CUSTOMREQUEST, 'content' => \CURLOPT_POSTFIELDS, 'header' => \CURLOPT_HTTPHEADER, 'timeout' => \CURLOPT_TIMEOUT], 'ssl' => ['cafile' => \CURLOPT_CAINFO, 'capath' => \CURLOPT_CAPATH, 'verify_peer' => \CURLOPT_SSL_VERIFYPEER, 'verify_peer_name' => \CURLOPT_SSL_VERIFYHOST, 'local_cert' => \CURLOPT_SSLCERT, 'local_pk' => \CURLOPT_SSLKEY, 'passphrase' => \CURLOPT_SSLKEYPASSWD]]; /** @var array */ private static $timeInfo = ['total_time' => \true, 'namelookup_time' => \true, 'connect_time' => \true, 'pretransfer_time' => \true, 'starttransfer_time' => \true, 'redirect_time' => \true]; /** * @param mixed[] $options */ public function __construct(IOInterface $io, Config $config, array $options = [], bool $disableTls = \false) { $this->io = $io; $this->config = $config; $this->multiHandle = $mh = \curl_multi_init(); if (\function_exists('curl_multi_setopt')) { if (\Composer\Util\Http\ProxyManager::getInstance()->hasProxy() && ($version = \curl_version()) !== \false && \in_array($version['version'], self::BAD_MULTIPLEXING_CURL_VERSIONS, \true)) { /** * Disable HTTP/2 multiplexing for some broken versions of libcurl. * * In certain versions of libcurl when proxy is in use with HTTP/2 * multiplexing, connections will continue stacking up. This was * fixed in libcurl 8.0.0 in curl/curl@821f6e2a89de8aec1c7da3c0f381b92b2b801efc */ \curl_multi_setopt( $mh, \CURLMOPT_PIPELINING, /* CURLPIPE_NOTHING */ 0 ); } else { \curl_multi_setopt($mh, \CURLMOPT_PIPELINING, \PHP_VERSION_ID >= 70400 ? 2 : 3); } if (\defined('CURLMOPT_MAX_HOST_CONNECTIONS') && !\defined('_ContaoManager\\HHVM_VERSION')) { \curl_multi_setopt($mh, \CURLMOPT_MAX_HOST_CONNECTIONS, 8); } } if (\function_exists('curl_share_init')) { $this->shareHandle = $sh = \curl_share_init(); \curl_share_setopt($sh, \CURLSHOPT_SHARE, \CURL_LOCK_DATA_COOKIE); \curl_share_setopt($sh, \CURLSHOPT_SHARE, \CURL_LOCK_DATA_DNS); \curl_share_setopt($sh, \CURLSHOPT_SHARE, \CURL_LOCK_DATA_SSL_SESSION); } $this->authHelper = new AuthHelper($io, $config); } /** * @param mixed[] $options * @param non-empty-string $url * * @return int internal job id */ public function download(callable $resolve, callable $reject, string $origin, string $url, array $options, ?string $copyTo = null) : int { $attributes = []; if (isset($options['retry-auth-failure'])) { $attributes['retryAuthFailure'] = $options['retry-auth-failure']; unset($options['retry-auth-failure']); } return $this->initDownload($resolve, $reject, $origin, $url, $options, $copyTo, $attributes); } /** * @param mixed[] $options * * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, retries?: int<0, max>, storeAuth?: 'prompt'|bool, ipResolve?: 4|6|null} $attributes * @param non-empty-string $url * * @return int internal job id */ private function initDownload(callable $resolve, callable $reject, string $origin, string $url, array $options, ?string $copyTo = null, array $attributes = []) : int { $attributes = \array_merge(['retryAuthFailure' => \true, 'redirects' => 0, 'retries' => 0, 'storeAuth' => \false, 'ipResolve' => null], $attributes); if ($attributes['ipResolve'] === null && Platform::getEnv('COMPOSER_IPRESOLVE') === '4') { $attributes['ipResolve'] = 4; } elseif ($attributes['ipResolve'] === null && Platform::getEnv('COMPOSER_IPRESOLVE') === '6') { $attributes['ipResolve'] = 6; } $originalOptions = $options; // check URL can be accessed (i.e. is not insecure), but allow insecure Packagist calls to $hashed providers as file integrity is verified with sha256 if (!Preg::isMatch('{^http://(repo\\.)?packagist\\.org/p/}', $url) || \false === \strpos($url, '$') && \false === \strpos($url, '%24')) { $this->config->prohibitUrlByConfig($url, $this->io, $options); } $curlHandle = \curl_init(); $headerHandle = \fopen('php://temp/maxmemory:32768', 'w+b'); if (\false === $headerHandle) { throw new \RuntimeException('Failed to open a temp stream to store curl headers'); } if ($copyTo !== null) { $bodyTarget = $copyTo . '~'; } else { $bodyTarget = 'php://temp/maxmemory:524288'; } $errorMessage = ''; \set_error_handler(static function (int $code, string $msg) use(&$errorMessage) : bool { if ($errorMessage) { $errorMessage .= "\n"; } $errorMessage .= Preg::replace('{^fopen\\(.*?\\): }', '', $msg); return \true; }); $bodyHandle = \fopen($bodyTarget, 'w+b'); \restore_error_handler(); if (\false === $bodyHandle) { throw new TransportException('The "' . $url . '" file could not be written to ' . ($copyTo ?? 'a temporary file') . ': ' . $errorMessage); } \curl_setopt($curlHandle, \CURLOPT_URL, $url); \curl_setopt($curlHandle, \CURLOPT_FOLLOWLOCATION, \false); \curl_setopt($curlHandle, \CURLOPT_CONNECTTIMEOUT, 10); \curl_setopt($curlHandle, \CURLOPT_TIMEOUT, \max((int) \ini_get("default_socket_timeout"), 300)); \curl_setopt($curlHandle, \CURLOPT_WRITEHEADER, $headerHandle); \curl_setopt($curlHandle, \CURLOPT_FILE, $bodyHandle); \curl_setopt($curlHandle, \CURLOPT_ENCODING, ""); // let cURL set the Accept-Encoding header to what it supports \curl_setopt($curlHandle, \CURLOPT_PROTOCOLS, \CURLPROTO_HTTP | \CURLPROTO_HTTPS); if ($attributes['ipResolve'] === 4) { \curl_setopt($curlHandle, \CURLOPT_IPRESOLVE, \CURL_IPRESOLVE_V4); } elseif ($attributes['ipResolve'] === 6) { \curl_setopt($curlHandle, \CURLOPT_IPRESOLVE, \CURL_IPRESOLVE_V6); } if (\function_exists('curl_share_init')) { \curl_setopt($curlHandle, \CURLOPT_SHARE, $this->shareHandle); } if (!isset($options['http']['header'])) { $options['http']['header'] = []; } $options['http']['header'] = \array_diff($options['http']['header'], ['Connection: close']); $options['http']['header'][] = 'Connection: keep-alive'; $version = \curl_version(); $features = $version['features']; if (0 === \strpos($url, 'https://') && \defined('CURL_VERSION_HTTP2') && \defined('CURL_HTTP_VERSION_2_0') && (\CURL_VERSION_HTTP2 & $features) !== 0) { \curl_setopt($curlHandle, \CURLOPT_HTTP_VERSION, \CURL_HTTP_VERSION_2_0); } // curl 8.7.0 - 8.7.1 has a bug whereas automatic accept-encoding header results in an error when reading the response // https://github.com/composer/composer/issues/11913 if (isset($version['version']) && \in_array($version['version'], ['8.7.0', '8.7.1'], \true) && \defined('CURL_VERSION_LIBZ') && (\CURL_VERSION_LIBZ & $features) !== 0) { \curl_setopt($curlHandle, \CURLOPT_ENCODING, "gzip"); } $options['http']['header'] = $this->authHelper->addAuthenticationHeader($options['http']['header'], $origin, $url); $options = StreamContextFactory::initOptions($url, $options, \true); foreach (self::$options as $type => $curlOptions) { foreach ($curlOptions as $name => $curlOption) { if (isset($options[$type][$name])) { if ($type === 'ssl' && $name === 'verify_peer_name') { \curl_setopt($curlHandle, $curlOption, $options[$type][$name] === \true ? 2 : $options[$type][$name]); } else { \curl_setopt($curlHandle, $curlOption, $options[$type][$name]); } } } } $proxy = \Composer\Util\Http\ProxyManager::getInstance()->getProxyForRequest($url); \curl_setopt_array($curlHandle, $proxy->getCurlOptions($options['ssl'] ?? [])); $progress = \array_diff_key(\curl_getinfo($curlHandle), self::$timeInfo); $this->jobs[(int) $curlHandle] = ['url' => $url, 'origin' => $origin, 'attributes' => $attributes, 'options' => $originalOptions, 'progress' => $progress, 'curlHandle' => $curlHandle, 'filename' => $copyTo, 'headerHandle' => $headerHandle, 'bodyHandle' => $bodyHandle, 'resolve' => $resolve, 'reject' => $reject, 'primaryIp' => '']; $usingProxy = $proxy->getStatus(' using proxy (%s)'); $ifModified = \false !== \stripos(\implode(',', $options['http']['header']), 'if-modified-since:') ? ' if modified' : ''; if ($attributes['redirects'] === 0 && $attributes['retries'] === 0) { $this->io->writeError('Downloading ' . Url::sanitize($url) . $usingProxy . $ifModified, \true, IOInterface::DEBUG); } $this->checkCurlResult(\curl_multi_add_handle($this->multiHandle, $curlHandle)); // TODO progress return (int) $curlHandle; } public function abortRequest(int $id) : void { if (isset($this->jobs[$id], $this->jobs[$id]['curlHandle'])) { $job = $this->jobs[$id]; \curl_multi_remove_handle($this->multiHandle, $job['curlHandle']); \curl_close($job['curlHandle']); if (\is_resource($job['headerHandle'])) { \fclose($job['headerHandle']); } if (\is_resource($job['bodyHandle'])) { \fclose($job['bodyHandle']); } if (null !== $job['filename']) { @\unlink($job['filename'] . '~'); } unset($this->jobs[$id]); } } public function tick() : void { static $timeoutWarning = \false; if (\count($this->jobs) === 0) { return; } $active = \true; $this->checkCurlResult(\curl_multi_exec($this->multiHandle, $active)); if (-1 === \curl_multi_select($this->multiHandle, $this->selectTimeout)) { // sleep in case select returns -1 as it can happen on old php versions or some platforms where curl does not manage to do the select \usleep(150); } while ($progress = \curl_multi_info_read($this->multiHandle)) { $curlHandle = $progress['handle']; $result = $progress['result']; $i = (int) $curlHandle; if (!isset($this->jobs[$i])) { continue; } $progress = \curl_getinfo($curlHandle); if (\false === $progress) { throw new \RuntimeException('Failed getting info from curl handle ' . $i . ' (' . $this->jobs[$i]['url'] . ')'); } $job = $this->jobs[$i]; unset($this->jobs[$i]); $error = \curl_error($curlHandle); $errno = \curl_errno($curlHandle); \curl_multi_remove_handle($this->multiHandle, $curlHandle); \curl_close($curlHandle); $headers = null; $statusCode = null; $response = null; try { // TODO progress if (\CURLE_OK !== $errno || $error || $result !== \CURLE_OK) { $errno = $errno ?: $result; if (!$error && \function_exists('curl_strerror')) { $error = \curl_strerror($errno); } $progress['error_code'] = $errno; if ((!isset($job['options']['http']['method']) || $job['options']['http']['method'] === 'GET') && (\in_array($errno, [7, 16, 92, 6], \true) || \in_array($errno, [56, 35], \true) && \str_contains((string) $error, 'Connection reset by peer')) && $job['attributes']['retries'] < $this->maxRetries) { $attributes = ['retries' => $job['attributes']['retries'] + 1]; if ($errno === 7 && !isset($job['attributes']['ipResolve'])) { // CURLE_COULDNT_CONNECT, retry forcing IPv4 if no IP stack was selected $attributes['ipResolve'] = 4; } $this->io->writeError('Retrying (' . ($job['attributes']['retries'] + 1) . ') ' . Url::sanitize($job['url']) . ' due to curl error ' . $errno, \true, IOInterface::DEBUG); $this->restartJobWithDelay($job, $job['url'], $attributes); continue; } // TODO: Remove this as soon as https://github.com/curl/curl/issues/10591 is resolved if ($errno === 55) { $this->io->writeError('Retrying (' . ($job['attributes']['retries'] + 1) . ') ' . Url::sanitize($job['url']) . ' due to curl error ' . $errno, \true, IOInterface::DEBUG); $this->restartJobWithDelay($job, $job['url'], ['retries' => $job['attributes']['retries'] + 1]); continue; } if ($errno === 28 && \PHP_VERSION_ID >= 70300 && $progress['namelookup_time'] === 0.0 && !$timeoutWarning) { $timeoutWarning = \true; $this->io->writeError('A connection timeout was encountered. If you intend to run Composer without connecting to the internet, run the command again prefixed with COMPOSER_DISABLE_NETWORK=1 to make Composer run in offline mode.'); } throw new TransportException('curl error ' . $errno . ' while downloading ' . Url::sanitize($progress['url']) . ': ' . $error); } $statusCode = $progress['http_code']; \rewind($job['headerHandle']); $headers = \explode("\r\n", \rtrim(\stream_get_contents($job['headerHandle']))); \fclose($job['headerHandle']); if ($statusCode === 0) { throw new \LogicException('Received unexpected http status code 0 without error for ' . Url::sanitize($progress['url']) . ': headers ' . \var_export($headers, \true) . ' curl info ' . \var_export($progress, \true)); } // prepare response object if (null !== $job['filename']) { $contents = $job['filename'] . '~'; if ($statusCode >= 300) { \rewind($job['bodyHandle']); $contents = \stream_get_contents($job['bodyHandle']); } $response = new \Composer\Util\Http\CurlResponse(['url' => $job['url']], $statusCode, $headers, $contents, $progress); $this->io->writeError('[' . $statusCode . '] ' . Url::sanitize($job['url']), \true, IOInterface::DEBUG); } else { $maxFileSize = $job['options']['max_file_size'] ?? null; \rewind($job['bodyHandle']); if ($maxFileSize !== null) { $contents = \stream_get_contents($job['bodyHandle'], $maxFileSize); // Gzipped responses with missing Content-Length header cannot be detected during the file download // because $progress['size_download'] refers to the gzipped size downloaded, not the actual file size if ($contents !== \false && Platform::strlen($contents) >= $maxFileSize) { throw new MaxFileSizeExceededException('Maximum allowed download size reached. Downloaded ' . Platform::strlen($contents) . ' of allowed ' . $maxFileSize . ' bytes'); } } else { $contents = \stream_get_contents($job['bodyHandle']); } $response = new \Composer\Util\Http\CurlResponse(['url' => $job['url']], $statusCode, $headers, $contents, $progress); $this->io->writeError('[' . $statusCode . '] ' . Url::sanitize($job['url']), \true, IOInterface::DEBUG); } \fclose($job['bodyHandle']); if ($response->getStatusCode() >= 300 && $response->getHeader('content-type') === 'application/json') { HttpDownloader::outputWarnings($this->io, $job['origin'], \json_decode($response->getBody(), \true)); } $result = $this->isAuthenticatedRetryNeeded($job, $response); if ($result['retry']) { $this->restartJob($job, $job['url'], ['storeAuth' => $result['storeAuth'], 'retries' => $job['attributes']['retries'] + 1]); continue; } // handle 3xx redirects, 304 Not Modified is excluded if ($statusCode >= 300 && $statusCode <= 399 && $statusCode !== 304 && $job['attributes']['redirects'] < $this->maxRedirects) { $location = $this->handleRedirect($job, $response); if ($location) { $this->restartJob($job, $location, ['redirects' => $job['attributes']['redirects'] + 1]); continue; } } // fail 4xx and 5xx responses and capture the response if ($statusCode >= 400 && $statusCode <= 599) { if ((!isset($job['options']['http']['method']) || $job['options']['http']['method'] === 'GET') && \in_array($statusCode, [423, 425, 500, 502, 503, 504, 507, 510], \true) && $job['attributes']['retries'] < $this->maxRetries) { $this->io->writeError('Retrying (' . ($job['attributes']['retries'] + 1) . ') ' . Url::sanitize($job['url']) . ' due to status code ' . $statusCode, \true, IOInterface::DEBUG); $this->restartJobWithDelay($job, $job['url'], ['retries' => $job['attributes']['retries'] + 1]); continue; } throw $this->failResponse($job, $response, $response->getStatusMessage()); } if ($job['attributes']['storeAuth'] !== \false) { $this->authHelper->storeAuth($job['origin'], $job['attributes']['storeAuth']); } // resolve promise if (null !== $job['filename']) { \rename($job['filename'] . '~', $job['filename']); $job['resolve']($response); } else { $job['resolve']($response); } } catch (\Exception $e) { if ($e instanceof TransportException) { if (null !== $headers) { $e->setHeaders($headers); $e->setStatusCode($statusCode); } if (null !== $response) { $e->setResponse($response->getBody()); } $e->setResponseInfo($progress); } $this->rejectJob($job, $e); } } foreach ($this->jobs as $i => $curlHandle) { $curlHandle = $this->jobs[$i]['curlHandle']; $progress = \array_diff_key(\curl_getinfo($curlHandle), self::$timeInfo); if ($this->jobs[$i]['progress'] !== $progress) { $this->jobs[$i]['progress'] = $progress; if (isset($this->jobs[$i]['options']['max_file_size'])) { // Compare max_file_size with the content-length header this value will be -1 until the header is parsed if ($this->jobs[$i]['options']['max_file_size'] < $progress['download_content_length']) { $this->rejectJob($this->jobs[$i], new MaxFileSizeExceededException('Maximum allowed download size reached. Content-length header indicates ' . $progress['download_content_length'] . ' bytes. Allowed ' . $this->jobs[$i]['options']['max_file_size'] . ' bytes')); } // Compare max_file_size with the download size in bytes if ($this->jobs[$i]['options']['max_file_size'] < $progress['size_download']) { $this->rejectJob($this->jobs[$i], new MaxFileSizeExceededException('Maximum allowed download size reached. Downloaded ' . $progress['size_download'] . ' of allowed ' . $this->jobs[$i]['options']['max_file_size'] . ' bytes')); } } if (isset($progress['primary_ip']) && $progress['primary_ip'] !== $this->jobs[$i]['primaryIp']) { if (isset($this->jobs[$i]['options']['prevent_ip_access_callable']) && \is_callable($this->jobs[$i]['options']['prevent_ip_access_callable']) && $this->jobs[$i]['options']['prevent_ip_access_callable']($progress['primary_ip'])) { $this->rejectJob($this->jobs[$i], new TransportException(\sprintf('IP "%s" is blocked for "%s".', $progress['primary_ip'], $progress['url']))); } $this->jobs[$i]['primaryIp'] = (string) $progress['primary_ip']; } // TODO progress } } } /** * @param Job $job */ private function handleRedirect(array $job, \Composer\Util\Http\Response $response) : string { if ($locationHeader = $response->getHeader('location')) { if (\parse_url($locationHeader, \PHP_URL_SCHEME)) { // Absolute URL; e.g. https://example.com/composer $targetUrl = $locationHeader; } elseif (\parse_url($locationHeader, \PHP_URL_HOST)) { // Scheme relative; e.g. //example.com/foo $targetUrl = \parse_url($job['url'], \PHP_URL_SCHEME) . ':' . $locationHeader; } elseif ('/' === $locationHeader[0]) { // Absolute path; e.g. /foo $urlHost = \parse_url($job['url'], \PHP_URL_HOST); // Replace path using hostname as an anchor. $targetUrl = Preg::replace('{^(.+(?://|@)' . \preg_quote($urlHost) . '(?::\\d+)?)(?:[/\\?].*)?$}', '\\1' . $locationHeader, $job['url']); } else { // Relative path; e.g. foo // This actually differs from PHP which seems to add duplicate slashes. $targetUrl = Preg::replace('{^(.+/)[^/?]*(?:\\?.*)?$}', '\\1' . $locationHeader, $job['url']); } } if (!empty($targetUrl)) { $this->io->writeError(\sprintf('Following redirect (%u) %s', $job['attributes']['redirects'] + 1, Url::sanitize($targetUrl)), \true, IOInterface::DEBUG); return $targetUrl; } throw new TransportException('The "' . $job['url'] . '" file could not be downloaded, got redirect without Location (' . $response->getStatusMessage() . ')'); } /** * @param Job $job * @return array{retry: bool, storeAuth: 'prompt'|bool} */ private function isAuthenticatedRetryNeeded(array $job, \Composer\Util\Http\Response $response) : array { if (\in_array($response->getStatusCode(), [401, 403]) && $job['attributes']['retryAuthFailure']) { $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], $response->getStatusCode(), $response->getStatusMessage(), $response->getHeaders(), $job['attributes']['retries']); if ($result['retry']) { return $result; } } $locationHeader = $response->getHeader('location'); $needsAuthRetry = \false; // check for bitbucket login page asking to authenticate if ($job['origin'] === 'bitbucket.org' && !$this->authHelper->isPublicBitBucketDownload($job['url']) && \substr($job['url'], -4) === '.zip' && (!$locationHeader || \substr($locationHeader, -4) !== '.zip') && Preg::isMatch('{^text/html\\b}i', $response->getHeader('content-type'))) { $needsAuthRetry = 'Bitbucket requires authentication and it was not provided'; } // check for gitlab 404 when downloading archives if ($response->getStatusCode() === 404 && \in_array($job['origin'], $this->config->get('gitlab-domains'), \true) && \false !== \strpos($job['url'], 'archive.zip')) { $needsAuthRetry = 'GitLab requires authentication and it was not provided'; } if ($needsAuthRetry) { if ($job['attributes']['retryAuthFailure']) { $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], 401, null, [], $job['attributes']['retries']); if ($result['retry']) { return $result; } } throw $this->failResponse($job, $response, $needsAuthRetry); } return ['retry' => \false, 'storeAuth' => \false]; } /** * @param Job $job * @param non-empty-string $url * * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, storeAuth?: 'prompt'|bool, retries?: int<1, max>, ipResolve?: 4|6} $attributes */ private function restartJob(array $job, string $url, array $attributes = []) : void { if (null !== $job['filename']) { @\unlink($job['filename'] . '~'); } $attributes = \array_merge($job['attributes'], $attributes); $origin = Url::getOrigin($this->config, $url); $this->initDownload($job['resolve'], $job['reject'], $origin, $url, $job['options'], $job['filename'], $attributes); } /** * @param Job $job * @param non-empty-string $url * * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, storeAuth?: 'prompt'|bool, retries: int<1, max>, ipResolve?: 4|6} $attributes */ private function restartJobWithDelay(array $job, string $url, array $attributes) : void { if ($attributes['retries'] >= 3) { \usleep(500000); // half a second delay for 3rd retry and beyond } elseif ($attributes['retries'] >= 2) { \usleep(100000); // 100ms delay for 2nd retry } // no sleep for the first retry $this->restartJob($job, $url, $attributes); } /** * @param Job $job */ private function failResponse(array $job, \Composer\Util\Http\Response $response, string $errorMessage) : TransportException { if (null !== $job['filename']) { @\unlink($job['filename'] . '~'); } $details = ''; if (\in_array(\strtolower((string) $response->getHeader('content-type')), ['application/json', 'application/json; charset=utf-8'], \true)) { $details = ':' . \PHP_EOL . \substr($response->getBody(), 0, 200) . (\strlen($response->getBody()) > 200 ? '...' : ''); } return new TransportException('The "' . $job['url'] . '" file could not be downloaded (' . $errorMessage . ')' . $details, $response->getStatusCode()); } /** * @param Job $job */ private function rejectJob(array $job, \Exception $e) : void { if (\is_resource($job['headerHandle'])) { \fclose($job['headerHandle']); } if (\is_resource($job['bodyHandle'])) { \fclose($job['bodyHandle']); } if (null !== $job['filename']) { @\unlink($job['filename'] . '~'); } $job['reject']($e); } private function checkCurlResult(int $code) : void { if ($code !== \CURLM_OK && $code !== \CURLM_CALL_MULTI_PERFORM) { throw new \RuntimeException(isset($this->multiErrors[$code]) ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}" : 'Unexpected cURL error: ' . $code); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util\Http; /** * @phpstan-type CurlInfo array{url: mixed, content_type: mixed, http_code: mixed, header_size: mixed, request_size: mixed, filetime: mixed, ssl_verify_result: mixed, redirect_count: mixed, total_time: mixed, namelookup_time: mixed, connect_time: mixed, pretransfer_time: mixed, size_upload: mixed, size_download: mixed, speed_download: mixed, speed_upload: mixed, download_content_length: mixed, upload_content_length: mixed, starttransfer_time: mixed, redirect_time: mixed, certinfo: mixed, primary_ip: mixed, primary_port: mixed, local_ip: mixed, local_port: mixed, redirect_url: mixed} */ class CurlResponse extends \Composer\Util\Http\Response { /** * @see https://www.php.net/curl_getinfo * @var array * @phpstan-var CurlInfo */ private $curlInfo; /** * @phpstan-param CurlInfo $curlInfo */ public function __construct(array $request, ?int $code, array $headers, ?string $body, array $curlInfo) { parent::__construct($request, $code, $headers, $body); $this->curlInfo = $curlInfo; } /** * @phpstan-return CurlInfo */ public function getCurlInfo() : array { return $this->curlInfo; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util\Http; /** * @internal * @author John Stevenson */ class ProxyItem { /** @var non-empty-string */ private $url; /** @var non-empty-string */ private $safeUrl; /** @var ?non-empty-string */ private $curlAuth; /** @var string */ private $optionsProxy; /** @var ?non-empty-string */ private $optionsAuth; /** * @param string $proxyUrl The value from the environment * @param string $envName The name of the environment variable * @throws \RuntimeException If the proxy url is invalid */ public function __construct(string $proxyUrl, string $envName) { $syntaxError = \sprintf('unsupported `%s` syntax', $envName); if (\strpbrk($proxyUrl, "\r\n\t") !== \false) { throw new \RuntimeException($syntaxError); } if (\false === ($proxy = \parse_url($proxyUrl))) { throw new \RuntimeException($syntaxError); } if (!isset($proxy['host'])) { throw new \RuntimeException('unable to find proxy host in ' . $envName); } $scheme = isset($proxy['scheme']) ? \strtolower($proxy['scheme']) . '://' : 'http://'; $safe = ''; if (isset($proxy['user'])) { $safe = '***'; $user = $proxy['user']; $auth = \rawurldecode($proxy['user']); if (isset($proxy['pass'])) { $safe .= ':***'; $user .= ':' . $proxy['pass']; $auth .= ':' . \rawurldecode($proxy['pass']); } $safe .= '@'; if (\strlen($user) > 0) { $this->curlAuth = $user; $this->optionsAuth = 'Proxy-Authorization: Basic ' . \base64_encode($auth); } } $host = $proxy['host']; $port = null; if (isset($proxy['port'])) { $port = $proxy['port']; } elseif ($scheme === 'http://') { $port = 80; } elseif ($scheme === 'https://') { $port = 443; } // We need a port because curl uses 1080 for http. Port 0 is reserved, // but is considered valid depending on the PHP or Curl version. if ($port === null) { throw new \RuntimeException('unable to find proxy port in ' . $envName); } if ($port === 0) { throw new \RuntimeException('port 0 is reserved in ' . $envName); } $this->url = \sprintf('%s%s:%d', $scheme, $host, $port); $this->safeUrl = \sprintf('%s%s%s:%d', $scheme, $safe, $host, $port); $scheme = \str_replace(['http://', 'https://'], ['tcp://', 'ssl://'], $scheme); $this->optionsProxy = \sprintf('%s%s:%d', $scheme, $host, $port); } /** * Returns a RequestProxy instance for the scheme of the request url * * @param string $scheme The scheme of the request url */ public function toRequestProxy(string $scheme) : \Composer\Util\Http\RequestProxy { $options = ['http' => ['proxy' => $this->optionsProxy]]; if ($this->optionsAuth !== null) { $options['http']['header'] = $this->optionsAuth; } if ($scheme === 'http') { $options['http']['request_fulluri'] = \true; } return new \Composer\Util\Http\RequestProxy($this->url, $this->curlAuth, $options, $this->safeUrl); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; @\trigger_error('Composer\\Util\\MetadataMinifier is deprecated, use Composer\\MetadataMinifier\\MetadataMinifier from composer/metadata-minifier instead.', \E_USER_DEPRECATED); /** * @deprecated Use Composer\MetadataMinifier\MetadataMinifier instead */ class MetadataMinifier extends \Composer\MetadataMinifier\MetadataMinifier { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use _ContaoManager\Seld\Signal\SignalHandler; use _ContaoManager\Symfony\Component\Process\Exception\ProcessSignaledException; use _ContaoManager\Symfony\Component\Process\Process; use _ContaoManager\Symfony\Component\Process\Exception\RuntimeException; use React\Promise\Promise; use React\Promise\PromiseInterface; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; /** * @author Robert Schönthal * @author Jordi Boggiano */ class ProcessExecutor { private const STATUS_QUEUED = 1; private const STATUS_STARTED = 2; private const STATUS_COMPLETED = 3; private const STATUS_FAILED = 4; private const STATUS_ABORTED = 5; private const BUILTIN_CMD_COMMANDS = ['assoc', 'break', 'call', 'cd', 'chdir', 'cls', 'color', 'copy', 'date', 'del', 'dir', 'echo', 'endlocal', 'erase', 'exit', 'for', 'ftype', 'goto', 'help', 'if', 'label', 'md', 'mkdir', 'mklink', 'move', 'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'rem', 'ren', 'rename', 'rmdir', 'set', 'setlocal', 'shift', 'start', 'time', 'title', 'type', 'ver', 'vol']; private const GIT_CMDS_NEED_GIT_DIR = [['show'], ['log'], ['branch'], ['remote', 'set-url']]; /** @var int */ protected static $timeout = 300; /** @var bool */ protected $captureOutput = \false; /** @var string */ protected $errorOutput = ''; /** @var ?IOInterface */ protected $io; /** * @phpstan-var array> */ private $jobs = []; /** @var int */ private $runningJobs = 0; /** @var int */ private $maxJobs = 10; /** @var int */ private $idGen = 0; /** @var bool */ private $allowAsync = \false; /** @var array */ private static $executables = []; public function __construct(?IOInterface $io = null) { $this->io = $io; } /** * runs a process on the commandline * * @param string|non-empty-list $command the command to execute * @param mixed $output the output will be written into this var if passed by ref * if a callable is passed it will be used as output handler * @param null|string $cwd the working directory * @return int statuscode */ public function execute($command, &$output = null, ?string $cwd = null) : int { if (\func_num_args() > 1) { return $this->doExecute($command, $cwd, \false, $output); } return $this->doExecute($command, $cwd, \false); } /** * runs a process on the commandline in TTY mode * * @param string|non-empty-list $command the command to execute * @param null|string $cwd the working directory * @return int statuscode */ public function executeTty($command, ?string $cwd = null) : int { if (\Composer\Util\Platform::isTty()) { return $this->doExecute($command, $cwd, \true); } return $this->doExecute($command, $cwd, \false); } /** * @param string|non-empty-list $command * @param array|null $env * @param mixed $output */ private function runProcess($command, ?string $cwd, ?array $env, bool $tty, &$output = null) : ?int { // On Windows, we don't rely on the OS to find the executable if possible to avoid lookups // in the current directory which could be untrusted. Instead we use the ExecutableFinder. if (\is_string($command)) { if (\Composer\Util\Platform::isWindows() && Preg::isMatch('{^([^:/\\\\]++) }', $command, $match)) { $command = \substr_replace($command, self::escape(self::getExecutable($match[1])), 0, \strlen($match[1])); } $process = Process::fromShellCommandline($command, $cwd, $env, null, static::getTimeout()); } else { if (\Composer\Util\Platform::isWindows() && \strlen($command[0]) === \strcspn($command[0], ':/\\')) { $command[0] = self::getExecutable($command[0]); } $process = new Process($command, $cwd, $env, null, static::getTimeout()); } if (!\Composer\Util\Platform::isWindows() && $tty) { try { $process->setTty(\true); } catch (RuntimeException $e) { // ignore TTY enabling errors } } $callback = \is_callable($output) ? $output : function (string $type, string $buffer) : void { $this->outputHandler($type, $buffer); }; $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal) { if ($this->io !== null) { $this->io->writeError('Received ' . $signal . ', aborting when child process is done', \true, IOInterface::DEBUG); } }); try { $process->run($callback); if ($this->captureOutput && !\is_callable($output)) { $output = $process->getOutput(); } $this->errorOutput = $process->getErrorOutput(); } catch (ProcessSignaledException $e) { if ($signalHandler->isTriggered()) { // exiting as we were signaled and the child process exited too due to the signal $signalHandler->exitWithLastSignal(); } } finally { $signalHandler->unregister(); } return $process->getExitCode(); } /** * @param string|non-empty-list $command * @param mixed $output */ private function doExecute($command, ?string $cwd, bool $tty, &$output = null) : int { $this->outputCommandRun($command, $cwd, \false); $this->captureOutput = \func_num_args() > 3; $this->errorOutput = ''; $env = null; $requiresGitDirEnv = $this->requiresGitDirEnv($command); if ($cwd !== null && $requiresGitDirEnv) { $isBareRepository = !\is_dir(\sprintf('%s/.git', \rtrim($cwd, '/'))); if ($isBareRepository) { $configValue = ''; $this->runProcess(['git', 'config', 'safe.bareRepository'], $cwd, ['GIT_DIR' => $cwd], $tty, $configValue); $configValue = \trim($configValue); if ($configValue === 'explicit') { $env = ['GIT_DIR' => $cwd]; } } } return $this->runProcess($command, $cwd, $env, $tty, $output); } /** * starts a process on the commandline in async mode * * @param string|list $command the command to execute * @param string $cwd the working directory * @phpstan-return PromiseInterface */ public function executeAsync($command, ?string $cwd = null) : PromiseInterface { if (!$this->allowAsync) { throw new \LogicException('You must use the ProcessExecutor instance which is part of a Composer\\Loop instance to be able to run async processes'); } $job = ['id' => $this->idGen++, 'status' => self::STATUS_QUEUED, 'command' => $command, 'cwd' => $cwd]; $resolver = static function ($resolve, $reject) use(&$job) : void { $job['status'] = \Composer\Util\ProcessExecutor::STATUS_QUEUED; $job['resolve'] = $resolve; $job['reject'] = $reject; }; $canceler = static function () use(&$job) : void { if ($job['status'] === \Composer\Util\ProcessExecutor::STATUS_QUEUED) { $job['status'] = \Composer\Util\ProcessExecutor::STATUS_ABORTED; } if ($job['status'] !== \Composer\Util\ProcessExecutor::STATUS_STARTED) { return; } $job['status'] = \Composer\Util\ProcessExecutor::STATUS_ABORTED; try { if (\defined('SIGINT')) { $job['process']->signal(\SIGINT); } } catch (\Exception $e) { // signal can throw in various conditions, but we don't care if it fails } $job['process']->stop(1); throw new \RuntimeException('Aborted process'); }; $promise = new Promise($resolver, $canceler); $promise = $promise->then(function () use(&$job) { if ($job['process']->isSuccessful()) { $job['status'] = \Composer\Util\ProcessExecutor::STATUS_COMPLETED; } else { $job['status'] = \Composer\Util\ProcessExecutor::STATUS_FAILED; } $this->markJobDone(); return $job['process']; }, function ($e) use(&$job) : void { $job['status'] = \Composer\Util\ProcessExecutor::STATUS_FAILED; $this->markJobDone(); throw $e; }); $this->jobs[$job['id']] =& $job; if ($this->runningJobs < $this->maxJobs) { $this->startJob($job['id']); } return $promise; } protected function outputHandler(string $type, string $buffer) : void { if ($this->captureOutput) { return; } if (null === $this->io) { echo $buffer; return; } if (Process::ERR === $type) { $this->io->writeErrorRaw($buffer, \false); } else { $this->io->writeRaw($buffer, \false); } } private function startJob(int $id) : void { $job =& $this->jobs[$id]; if ($job['status'] !== self::STATUS_QUEUED) { return; } // start job $job['status'] = self::STATUS_STARTED; $this->runningJobs++; $command = $job['command']; $cwd = $job['cwd']; $this->outputCommandRun($command, $cwd, \true); try { if (\is_string($command)) { $process = Process::fromShellCommandline($command, $cwd, null, null, static::getTimeout()); } else { $process = new Process($command, $cwd, null, null, static::getTimeout()); } } catch (\Throwable $e) { $job['reject']($e); return; } $job['process'] = $process; try { $process->start(); } catch (\Throwable $e) { $job['reject']($e); return; } } public function setMaxJobs(int $maxJobs) : void { $this->maxJobs = $maxJobs; } public function resetMaxJobs() : void { $this->maxJobs = 10; } /** * @param ?int $index job id */ public function wait($index = null) : void { while (\true) { if (0 === $this->countActiveJobs($index)) { return; } \usleep(1000); } } /** * @internal */ public function enableAsync() : void { $this->allowAsync = \true; } /** * @internal * * @param ?int $index job id * @return int number of active (queued or started) jobs */ public function countActiveJobs($index = null) : int { // tick foreach ($this->jobs as $job) { if ($job['status'] === self::STATUS_STARTED) { if (!$job['process']->isRunning()) { \call_user_func($job['resolve'], $job['process']); } $job['process']->checkTimeout(); } if ($this->runningJobs < $this->maxJobs) { if ($job['status'] === self::STATUS_QUEUED) { $this->startJob($job['id']); } } } if (null !== $index) { return $this->jobs[$index]['status'] < self::STATUS_COMPLETED ? 1 : 0; } $active = 0; foreach ($this->jobs as $job) { if ($job['status'] < self::STATUS_COMPLETED) { $active++; } else { unset($this->jobs[$job['id']]); } } return $active; } private function markJobDone() : void { $this->runningJobs--; } /** * @return string[] */ public function splitLines(?string $output) : array { $output = \trim((string) $output); return $output === '' ? [] : Preg::split('{\\r?\\n}', $output); } /** * Get any error output from the last command */ public function getErrorOutput() : string { return $this->errorOutput; } /** * @return int the timeout in seconds */ public static function getTimeout() : int { return static::$timeout; } /** * @param int $timeout the timeout in seconds */ public static function setTimeout(int $timeout) : void { static::$timeout = $timeout; } /** * Escapes a string to be used as a shell argument. * * @param string|false|null $argument The argument that will be escaped * * @return string The escaped argument */ public static function escape($argument) : string { return self::escapeArgument($argument); } /** * @param string|list $command */ private function outputCommandRun($command, ?string $cwd, bool $async) : void { if (null === $this->io || !$this->io->isDebug()) { return; } $commandString = \is_string($command) ? $command : \implode(' ', \array_map(self::class . '::escape', $command)); $safeCommand = Preg::replaceCallback('{://(?P[^:/\\s]+):(?P[^@\\s/]+)@}i', static function ($m) : string { // if the username looks like a long (12char+) hex string, or a modern github token (e.g. ghp_xxx) we obfuscate that if (Preg::isMatch('{^([a-f0-9]{12,}|gh[a-z]_[a-zA-Z0-9_]+)$}', $m['user'])) { return '://***:***@'; } if (Preg::isMatch('{^[a-f0-9]{12,}$}', $m['user'])) { return '://***:***@'; } return '://' . $m['user'] . ':***@'; }, $commandString); $safeCommand = Preg::replace("{--password (.*[^\\\\]\\') }", '--password \'***\' ', $safeCommand); $this->io->writeError('Executing' . ($async ? ' async' : '') . ' command (' . ($cwd ?: 'CWD') . '): ' . $safeCommand); } /** * Escapes a string to be used as a shell argument for Symfony Process. * * This method expects cmd.exe to be started with the /V:ON option, which * enables delayed environment variable expansion using ! as the delimiter. * If this is not the case, any escaped ^^!var^^! will be transformed to * ^!var^! and introduce two unintended carets. * * Modified from https://github.com/johnstevenson/winbox-args * MIT Licensed (c) John Stevenson * * @param string|false|null $argument */ private static function escapeArgument($argument) : string { if ('' === ($argument = (string) $argument)) { return \escapeshellarg($argument); } if (!\Composer\Util\Platform::isWindows()) { return "'" . \str_replace("'", "'\\''", $argument) . "'"; } // New lines break cmd.exe command parsing // and special chars like the fullwidth quote can be used to break out // of parameter encoding via "Best Fit" encoding conversion $argument = \strtr($argument, ["\n" => ' ', """ => '"', "ʺ" => '"', "ã€" => '"', "〞" => '"', "ÌŽ" => '"', ":" => ':', "Ö‰" => ':', "∶" => ':', "ï¼" => '/', "â„" => '/', "∕" => '/', "´" => '/']); // In addition to whitespace, commas need quoting to preserve paths $quote = \strpbrk($argument, " \t,") !== \false; $argument = Preg::replace('/(\\\\*)"/', '$1$1\\"', $argument, -1, $dquotes); $meta = $dquotes > 0 || Preg::isMatch('/%[^%]+%|![^!]+!/', $argument); if (!$meta && !$quote) { $quote = \strpbrk($argument, '^&|<>()') !== \false; } if ($quote) { $argument = '"' . Preg::replace('/(\\\\*)$/', '$1$1', $argument) . '"'; } if ($meta) { $argument = Preg::replace('/(["^&|<>()%])/', '^$1', $argument); $argument = Preg::replace('/(!)/', '^^$1', $argument); } return $argument; } /** * @param string[]|string $command */ public function requiresGitDirEnv($command) : bool { $cmd = !\is_array($command) ? \explode(' ', $command) : $command; if ($cmd[0] !== 'git') { return \false; } foreach (self::GIT_CMDS_NEED_GIT_DIR as $gitCmd) { if (\array_intersect($cmd, $gitCmd) === $gitCmd) { return \true; } } return \false; } /** * Resolves executable paths on Windows */ private static function getExecutable(string $name) : string { if (\in_array(\strtolower($name), self::BUILTIN_CMD_COMMANDS, \true)) { return $name; } if (!isset(self::$executables[$name])) { $path = (new ExecutableFinder())->find($name, $name); if ($path !== null) { self::$executables[$name] = $path; } } return self::$executables[$name] ?? $name; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; use Composer\Pcre\Preg; /** * @author Jonas Renaudot */ class Hg { /** @var string|false|null */ private static $version = \false; /** * @var \Composer\IO\IOInterface */ private $io; /** * @var \Composer\Config */ private $config; /** * @var \Composer\Util\ProcessExecutor */ private $process; public function __construct(IOInterface $io, Config $config, \Composer\Util\ProcessExecutor $process) { $this->io = $io; $this->config = $config; $this->process = $process; } public function runCommand(callable $commandCallable, string $url, ?string $cwd) : void { $this->config->prohibitUrlByConfig($url, $this->io); // Try as is $command = $commandCallable($url); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } // Try with the authentication information available if (Preg::isMatch('{^(?Pssh|https?)://(?:(?P[^:@]+)(?::(?P[^:@]+))?@)?(?P[^/]+)(?P/.*)?}mi', $url, $matches) && $this->io->hasAuthentication($matches['host'])) { if ($matches['proto'] === 'ssh') { $user = ''; if ($matches['user'] !== null) { $user = \rawurlencode($matches['user']) . '@'; } $authenticatedUrl = $matches['proto'] . '://' . $user . $matches['host'] . $matches['path']; } else { $auth = $this->io->getAuthentication($matches['host']); $authenticatedUrl = $matches['proto'] . '://' . \rawurlencode((string) $auth['username']) . ':' . \rawurlencode((string) $auth['password']) . '@' . $matches['host'] . $matches['path']; } $command = $commandCallable($authenticatedUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } $error = $this->process->getErrorOutput(); } else { $error = 'The given URL (' . $url . ') does not match the required format (ssh|http(s)://(username:password@)example.com/path-to-repository)'; } $this->throwException("Failed to clone {$url}, \n\n" . $error, $url); } /** * @param non-empty-string $message * * @return never */ private function throwException($message, string $url) : void { if (null === self::getVersion($this->process)) { throw new \RuntimeException(\Composer\Util\Url::sanitize('Failed to clone ' . $url . ', hg was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); } throw new \RuntimeException(\Composer\Util\Url::sanitize($message)); } /** * Retrieves the current hg version. * * @return string|null The hg version number, if present. */ public static function getVersion(\Composer\Util\ProcessExecutor $process) : ?string { if (\false === self::$version) { self::$version = null; if (0 === $process->execute(['hg', '--version'], $output) && Preg::isMatch('/^.+? (\\d+(?:\\.\\d+)+)(?:\\+.*?)?\\)?\\r?\\n/', $output, $matches)) { self::$version = $matches[1]; } } return self::$version; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\Downloader\MaxFileSizeExceededException; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; use Composer\Util\Http\Response; use Composer\Util\Http\ProxyManager; /** * @internal * @author François Pluchino * @author Jordi Boggiano * @author Nils Adermann */ class RemoteFilesystem { /** @var IOInterface */ private $io; /** @var Config */ private $config; /** @var string */ private $scheme; /** @var int */ private $bytesMax; /** @var string */ private $originUrl; /** @var non-empty-string */ private $fileUrl; /** @var ?string */ private $fileName; /** @var bool */ private $retry = \false; /** @var bool */ private $progress; /** @var ?int */ private $lastProgress; /** @var mixed[] */ private $options = []; /** @var bool */ private $disableTls = \false; /** @var list */ private $lastHeaders; /** @var bool */ private $storeAuth = \false; /** @var AuthHelper */ private $authHelper; /** @var bool */ private $degradedMode = \false; /** @var int */ private $redirects; /** @var int */ private $maxRedirects = 20; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The config * @param mixed[] $options The options * @param AuthHelper $authHelper */ public function __construct(IOInterface $io, Config $config, array $options = [], bool $disableTls = \false, ?\Composer\Util\AuthHelper $authHelper = null) { $this->io = $io; // Setup TLS options // The cafile option can be set via config.json if ($disableTls === \false) { $this->options = \Composer\Util\StreamContextFactory::getTlsDefaults($options, $io); } else { $this->disableTls = \true; } // handle the other externally set options normally. $this->options = \array_replace_recursive($this->options, $options); $this->config = $config; $this->authHelper = $authHelper ?? new \Composer\Util\AuthHelper($io, $config); } /** * Copy the remote file in local. * * @param string $originUrl The origin URL * @param non-empty-string $fileUrl The file URL * @param string $fileName the local filename * @param bool $progress Display the progression * @param mixed[] $options Additional context options * * @return bool true */ public function copy(string $originUrl, string $fileUrl, string $fileName, bool $progress = \true, array $options = []) { return $this->get($originUrl, $fileUrl, $options, $fileName, $progress); } /** * Get the content. * * @param string $originUrl The origin URL * @param non-empty-string $fileUrl The file URL * @param bool $progress Display the progression * @param mixed[] $options Additional context options * * @return bool|string The content */ public function getContents(string $originUrl, string $fileUrl, bool $progress = \true, array $options = []) { return $this->get($originUrl, $fileUrl, $options, null, $progress); } /** * Retrieve the options set in the constructor * * @return mixed[] Options */ public function getOptions() { return $this->options; } /** * Merges new options * * @param mixed[] $options * @return void */ public function setOptions(array $options) { $this->options = \array_replace_recursive($this->options, $options); } /** * Check is disable TLS. * * @return bool */ public function isTlsDisabled() { return $this->disableTls === \true; } /** * Returns the headers of the last request * * @return list */ public function getLastHeaders() { return $this->lastHeaders; } /** * @param string[] $headers array of returned headers like from getLastHeaders() * @return int|null */ public static function findStatusCode(array $headers) { $value = null; foreach ($headers as $header) { if (Preg::isMatch('{^HTTP/\\S+ (\\d+)}i', $header, $match)) { // In case of redirects, http_response_headers contains the headers of all responses // so we can not return directly and need to keep iterating $value = (int) $match[1]; } } return $value; } /** * @param string[] $headers array of returned headers like from getLastHeaders() * @return string|null */ public function findStatusMessage(array $headers) { $value = null; foreach ($headers as $header) { if (Preg::isMatch('{^HTTP/\\S+ \\d+}i', $header)) { // In case of redirects, http_response_headers contains the headers of all responses // so we can not return directly and need to keep iterating $value = $header; } } return $value; } /** * Get file content or copy action. * * @param string $originUrl The origin URL * @param non-empty-string $fileUrl The file URL * @param mixed[] $additionalOptions context options * @param string $fileName the local filename * @param bool $progress Display the progression * * @throws TransportException|\Exception * @throws TransportException When the file could not be downloaded * * @return bool|string */ protected function get(string $originUrl, string $fileUrl, array $additionalOptions = [], ?string $fileName = null, bool $progress = \true) { $this->scheme = \parse_url(\strtr($fileUrl, '\\', '/'), \PHP_URL_SCHEME); $this->bytesMax = 0; $this->originUrl = $originUrl; $this->fileUrl = $fileUrl; $this->fileName = $fileName; $this->progress = $progress; $this->lastProgress = null; $retryAuthFailure = \true; $this->lastHeaders = []; $this->redirects = 1; // The first request counts. $tempAdditionalOptions = $additionalOptions; if (isset($tempAdditionalOptions['retry-auth-failure'])) { $retryAuthFailure = (bool) $tempAdditionalOptions['retry-auth-failure']; unset($tempAdditionalOptions['retry-auth-failure']); } $isRedirect = \false; if (isset($tempAdditionalOptions['redirects'])) { $this->redirects = $tempAdditionalOptions['redirects']; $isRedirect = \true; unset($tempAdditionalOptions['redirects']); } $options = $this->getOptionsForUrl($originUrl, $tempAdditionalOptions); unset($tempAdditionalOptions); $origFileUrl = $fileUrl; if (isset($options['prevent_ip_access_callable'])) { throw new \RuntimeException("RemoteFilesystem doesn't support the 'prevent_ip_access_callable' config."); } if (isset($options['gitlab-token'])) { $fileUrl .= (\false === \strpos($fileUrl, '?') ? '?' : '&') . 'access_token=' . $options['gitlab-token']; unset($options['gitlab-token']); } if (isset($options['http'])) { $options['http']['ignore_errors'] = \true; } if ($this->degradedMode && \strpos($fileUrl, 'http://repo.packagist.org/') === 0) { // access packagist using the resolved IPv4 instead of the hostname to force IPv4 protocol $fileUrl = 'http://' . \gethostbyname('repo.packagist.org') . \substr($fileUrl, 20); $degradedPackagist = \true; } $maxFileSize = null; if (isset($options['max_file_size'])) { $maxFileSize = $options['max_file_size']; unset($options['max_file_size']); } $ctx = \Composer\Util\StreamContextFactory::getContext($fileUrl, $options, ['notification' => [$this, 'callbackGet']]); $proxy = ProxyManager::getInstance()->getProxyForRequest($fileUrl); $usingProxy = $proxy->getStatus(' using proxy (%s)'); $this->io->writeError((\strpos($origFileUrl, 'http') === 0 ? 'Downloading ' : 'Reading ') . \Composer\Util\Url::sanitize($origFileUrl) . $usingProxy, \true, IOInterface::DEBUG); unset($origFileUrl, $proxy, $usingProxy); // Check for secure HTTP, but allow insecure Packagist calls to $hashed providers as file integrity is verified with sha256 if ((!Preg::isMatch('{^http://(repo\\.)?packagist\\.org/p/}', $fileUrl) || \false === \strpos($fileUrl, '$') && \false === \strpos($fileUrl, '%24')) && empty($degradedPackagist)) { $this->config->prohibitUrlByConfig($fileUrl, $this->io); } if ($this->progress && !$isRedirect) { $this->io->writeError("Downloading (connecting...)", \false); } $errorMessage = ''; $errorCode = 0; $result = \false; \set_error_handler(static function ($code, $msg) use(&$errorMessage) : bool { if ($errorMessage) { $errorMessage .= "\n"; } $errorMessage .= Preg::replace('{^file_get_contents\\(.*?\\): }', '', $msg); return \true; }); $http_response_header = []; try { $result = $this->getRemoteContents($originUrl, $fileUrl, $ctx, $http_response_header, $maxFileSize); if (!empty($http_response_header[0])) { $statusCode = self::findStatusCode($http_response_header); if ($statusCode >= 300 && Response::findHeaderValue($http_response_header, 'content-type') === 'application/json') { \Composer\Util\HttpDownloader::outputWarnings($this->io, $originUrl, \json_decode($result, \true)); } if (\in_array($statusCode, [401, 403]) && $retryAuthFailure) { $this->promptAuthAndRetry($statusCode, $this->findStatusMessage($http_response_header), $http_response_header); } } $contentLength = !empty($http_response_header[0]) ? Response::findHeaderValue($http_response_header, 'content-length') : null; if ($contentLength && \Composer\Util\Platform::strlen($result) < $contentLength) { // alas, this is not possible via the stream callback because STREAM_NOTIFY_COMPLETED is documented, but not implemented anywhere in PHP $e = new TransportException('Content-Length mismatch, received ' . \Composer\Util\Platform::strlen($result) . ' bytes out of the expected ' . $contentLength); $e->setHeaders($http_response_header); $e->setStatusCode(self::findStatusCode($http_response_header)); try { $e->setResponse($this->decodeResult($result, $http_response_header)); } catch (\Exception $discarded) { $e->setResponse($this->normalizeResult($result)); } $this->io->writeError('Content-Length mismatch, received ' . \Composer\Util\Platform::strlen($result) . ' out of ' . $contentLength . ' bytes: (' . \base64_encode($result) . ')', \true, IOInterface::DEBUG); throw $e; } } catch (\Exception $e) { if ($e instanceof TransportException && !empty($http_response_header[0])) { $e->setHeaders($http_response_header); $e->setStatusCode(self::findStatusCode($http_response_header)); } if ($e instanceof TransportException && $result !== \false) { $e->setResponse($this->decodeResult($result, $http_response_header)); } $result = \false; } if ($errorMessage && !\filter_var(\ini_get('allow_url_fopen'), \FILTER_VALIDATE_BOOLEAN)) { $errorMessage = 'allow_url_fopen must be enabled in php.ini (' . $errorMessage . ')'; } \restore_error_handler(); if (isset($e) && !$this->retry) { if (!$this->degradedMode && \false !== \strpos($e->getMessage(), 'Operation timed out')) { $this->degradedMode = \true; $this->io->writeError(''); $this->io->writeError(['' . $e->getMessage() . '', 'Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info']); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } throw $e; } $statusCode = null; $contentType = null; $locationHeader = null; if (!empty($http_response_header[0])) { $statusCode = self::findStatusCode($http_response_header); $contentType = Response::findHeaderValue($http_response_header, 'content-type'); $locationHeader = Response::findHeaderValue($http_response_header, 'location'); } // check for bitbucket login page asking to authenticate if ($originUrl === 'bitbucket.org' && !$this->authHelper->isPublicBitBucketDownload($fileUrl) && \substr($fileUrl, -4) === '.zip' && (!$locationHeader || \substr(\parse_url($locationHeader, \PHP_URL_PATH), -4) !== '.zip') && $contentType && Preg::isMatch('{^text/html\\b}i', $contentType)) { $result = \false; if ($retryAuthFailure) { $this->promptAuthAndRetry(401); } } // check for gitlab 404 when downloading archives if ($statusCode === 404 && \in_array($originUrl, $this->config->get('gitlab-domains'), \true) && \false !== \strpos($fileUrl, 'archive.zip')) { $result = \false; if ($retryAuthFailure) { $this->promptAuthAndRetry(401); } } // handle 3xx redirects, 304 Not Modified is excluded $hasFollowedRedirect = \false; if ($statusCode >= 300 && $statusCode <= 399 && $statusCode !== 304 && $this->redirects < $this->maxRedirects) { $hasFollowedRedirect = \true; $result = $this->handleRedirect($http_response_header, $additionalOptions, $result); } // fail 4xx and 5xx responses and capture the response if ($statusCode && $statusCode >= 400 && $statusCode <= 599) { if (!$this->retry) { if ($this->progress && !$isRedirect) { $this->io->overwriteError("Downloading (failed)", \false); } $e = new TransportException('The "' . $this->fileUrl . '" file could not be downloaded (' . $http_response_header[0] . ')', $statusCode); $e->setHeaders($http_response_header); $e->setResponse($this->decodeResult($result, $http_response_header)); $e->setStatusCode($statusCode); throw $e; } $result = \false; } if ($this->progress && !$this->retry && !$isRedirect) { $this->io->overwriteError("Downloading (" . ($result === \false ? 'failed' : '100%') . ")", \false); } // decode gzip if ($result && \extension_loaded('zlib') && \strpos($fileUrl, 'http') === 0 && !$hasFollowedRedirect) { try { $result = $this->decodeResult($result, $http_response_header); } catch (\Exception $e) { if ($this->degradedMode) { throw $e; } $this->degradedMode = \true; $this->io->writeError(['', 'Failed to decode response: ' . $e->getMessage() . '', 'Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info']); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } } // handle copy command if download was successful if (\false !== $result && null !== $fileName && !$isRedirect) { if ('' === $result) { throw new TransportException('"' . $this->fileUrl . '" appears broken, and returned an empty 200 response'); } $errorMessage = ''; \set_error_handler(static function ($code, $msg) use(&$errorMessage) : bool { if ($errorMessage) { $errorMessage .= "\n"; } $errorMessage .= Preg::replace('{^file_put_contents\\(.*?\\): }', '', $msg); return \true; }); $result = (bool) \file_put_contents($fileName, $result); \restore_error_handler(); if (\false === $result) { throw new TransportException('The "' . $this->fileUrl . '" file could not be written to ' . $fileName . ': ' . $errorMessage); } } if ($this->retry) { $this->retry = \false; $result = $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); if ($this->storeAuth) { $this->authHelper->storeAuth($this->originUrl, $this->storeAuth); $this->storeAuth = \false; } return $result; } if (\false === $result) { $e = new TransportException('The "' . $this->fileUrl . '" file could not be downloaded: ' . $errorMessage, $errorCode); if (!empty($http_response_header[0])) { $e->setHeaders($http_response_header); } if (!$this->degradedMode && \false !== \strpos($e->getMessage(), 'Operation timed out')) { $this->degradedMode = \true; $this->io->writeError(''); $this->io->writeError(['' . $e->getMessage() . '', 'Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info']); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } throw $e; } if (!empty($http_response_header[0])) { $this->lastHeaders = $http_response_header; } return $result; } /** * Get contents of remote URL. * * @param string $originUrl The origin URL * @param string $fileUrl The file URL * @param resource $context The stream context * @param string[] $responseHeaders * @param int $maxFileSize The maximum allowed file size * * @return string|false The response contents or false on failure * * @param-out list $responseHeaders */ protected function getRemoteContents(string $originUrl, string $fileUrl, $context, ?array &$responseHeaders = null, ?int $maxFileSize = null) { $result = \false; try { $e = null; if ($maxFileSize !== null) { $result = \file_get_contents($fileUrl, \false, $context, 0, $maxFileSize); } else { // passing `null` to file_get_contents will convert `null` to `0` and return 0 bytes $result = \file_get_contents($fileUrl, \false, $context); } } catch (\Throwable $e) { } if ($result !== \false && $maxFileSize !== null && \Composer\Util\Platform::strlen($result) >= $maxFileSize) { throw new MaxFileSizeExceededException('Maximum allowed download size reached. Downloaded ' . \Composer\Util\Platform::strlen($result) . ' of allowed ' . $maxFileSize . ' bytes'); } // https://www.php.net/manual/en/reserved.variables.httpresponseheader.php if (\PHP_VERSION_ID >= 80400) { $responseHeaders = http_get_last_response_headers(); http_clear_last_response_headers(); } else { $responseHeaders = $http_response_header ?? []; } if (null !== $e) { throw $e; } return $result; } /** * Get notification action. * * @param int $notificationCode The notification code * @param int $severity The severity level * @param string $message The message * @param int $messageCode The message code * @param int $bytesTransferred The loaded size * @param int $bytesMax The total size * * @return void * * @throws TransportException */ protected function callbackGet(int $notificationCode, int $severity, ?string $message, int $messageCode, int $bytesTransferred, int $bytesMax) { switch ($notificationCode) { case \STREAM_NOTIFY_FAILURE: if (400 === $messageCode) { // This might happen if your host is secured by ssl client certificate authentication // but you do not send an appropriate certificate throw new TransportException("The '" . $this->fileUrl . "' URL could not be accessed: " . $message, $messageCode); } break; case \STREAM_NOTIFY_FILE_SIZE_IS: $this->bytesMax = $bytesMax; break; case \STREAM_NOTIFY_PROGRESS: if ($this->bytesMax > 0 && $this->progress) { $progression = \min(100, (int) \round($bytesTransferred / $this->bytesMax * 100)); if (0 === $progression % 5 && 100 !== $progression && $progression !== $this->lastProgress) { $this->lastProgress = $progression; $this->io->overwriteError("Downloading ({$progression}%)", \false); } } break; default: break; } } /** * @param positive-int $httpStatus * @param string[] $headers * * @return void */ protected function promptAuthAndRetry($httpStatus, ?string $reason = null, array $headers = []) { $result = $this->authHelper->promptAuthIfNeeded($this->fileUrl, $this->originUrl, $httpStatus, $reason, $headers, 1); $this->storeAuth = $result['storeAuth']; $this->retry = $result['retry']; if ($this->retry) { throw new TransportException('RETRY'); } } /** * @param mixed[] $additionalOptions * * @return mixed[] */ protected function getOptionsForUrl(string $originUrl, array $additionalOptions) { $tlsOptions = []; $headers = []; if (\extension_loaded('zlib')) { $headers[] = 'Accept-Encoding: gzip'; } $options = \array_replace_recursive($this->options, $tlsOptions, $additionalOptions); if (!$this->degradedMode) { // degraded mode disables HTTP/1.1 which causes issues with some bad // proxies/software due to the use of chunked encoding $options['http']['protocol_version'] = 1.1; $headers[] = 'Connection: close'; } $headers = $this->authHelper->addAuthenticationHeader($headers, $originUrl, $this->fileUrl); $options['http']['follow_location'] = 0; if (isset($options['http']['header']) && !\is_array($options['http']['header'])) { $options['http']['header'] = \explode("\r\n", \trim($options['http']['header'], "\r\n")); } foreach ($headers as $header) { $options['http']['header'][] = $header; } return $options; } /** * @param string[] $http_response_header * @param mixed[] $additionalOptions * @param string|false $result * * @return bool|string */ private function handleRedirect(array $http_response_header, array $additionalOptions, $result) { if ($locationHeader = Response::findHeaderValue($http_response_header, 'location')) { if (\parse_url($locationHeader, \PHP_URL_SCHEME)) { // Absolute URL; e.g. https://example.com/composer $targetUrl = $locationHeader; } elseif (\parse_url($locationHeader, \PHP_URL_HOST)) { // Scheme relative; e.g. //example.com/foo $targetUrl = $this->scheme . ':' . $locationHeader; } elseif ('/' === $locationHeader[0]) { // Absolute path; e.g. /foo $urlHost = \parse_url($this->fileUrl, \PHP_URL_HOST); // Replace path using hostname as an anchor. $targetUrl = Preg::replace('{^(.+(?://|@)' . \preg_quote($urlHost) . '(?::\\d+)?)(?:[/\\?].*)?$}', '\\1' . $locationHeader, $this->fileUrl); } else { // Relative path; e.g. foo // This actually differs from PHP which seems to add duplicate slashes. $targetUrl = Preg::replace('{^(.+/)[^/?]*(?:\\?.*)?$}', '\\1' . $locationHeader, $this->fileUrl); } } if (!empty($targetUrl)) { $this->redirects++; $this->io->writeError('', \true, IOInterface::DEBUG); $this->io->writeError(\sprintf('Following redirect (%u) %s', $this->redirects, \Composer\Util\Url::sanitize($targetUrl)), \true, IOInterface::DEBUG); $additionalOptions['redirects'] = $this->redirects; return $this->get(\parse_url($targetUrl, \PHP_URL_HOST), $targetUrl, $additionalOptions, $this->fileName, $this->progress); } if (!$this->retry) { $e = new TransportException('The "' . $this->fileUrl . '" file could not be downloaded, got redirect without Location (' . $http_response_header[0] . ')'); $e->setHeaders($http_response_header); $e->setResponse($this->decodeResult($result, $http_response_header)); throw $e; } return \false; } /** * @param string|false $result * @param string[] $http_response_header */ private function decodeResult($result, array $http_response_header) : ?string { // decode gzip if ($result && \extension_loaded('zlib')) { $contentEncoding = Response::findHeaderValue($http_response_header, 'content-encoding'); $decode = $contentEncoding && 'gzip' === \strtolower($contentEncoding); if ($decode) { $result = \zlib_decode($result); if ($result === \false) { throw new TransportException('Failed to decode zlib stream'); } } } return $this->normalizeResult($result); } /** * @param string|false $result */ private function normalizeResult($result) : ?string { if ($result === \false) { return null; } return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; /** * Convert PHP errors into exceptions * * @author Artem Lopata */ class ErrorHandler { /** @var ?IOInterface */ private static $io; /** * Error handler * * @param int $level Level of the error raised * @param string $message Error message * @param string $file Filename that the error was raised in * @param int $line Line number the error was raised at * * @static * @throws \ErrorException */ public static function handle(int $level, string $message, string $file, int $line) : bool { $isDeprecationNotice = $level === \E_DEPRECATED || $level === \E_USER_DEPRECATED; // error code is not included in error_reporting if (!$isDeprecationNotice && 0 === (\error_reporting() & $level)) { return \true; } if (\filter_var(\ini_get('xdebug.scream'), \FILTER_VALIDATE_BOOLEAN)) { $message .= "\n\nWarning: You have xdebug.scream enabled, the warning above may be" . "\na legitimately suppressed error that you were not supposed to see."; } if (!$isDeprecationNotice) { throw new \ErrorException($message, 0, $level, $file, $line); } if (self::$io !== null) { self::$io->writeError('Deprecation Notice: ' . $message . ' in ' . $file . ':' . $line . ''); if (self::$io->isVerbose()) { self::$io->writeError('Stack trace:'); self::$io->writeError(\array_filter(\array_map(static function ($a) : ?string { if (isset($a['line'], $a['file'])) { return ' ' . $a['file'] . ':' . $a['line'] . ''; } return null; }, \array_slice(\debug_backtrace(), 2)), function (?string $line) { return $line !== null; })); } } return \true; } /** * Register error handler. */ public static function register(?IOInterface $io = null) : void { \set_error_handler([__CLASS__, 'handle']); \error_reporting(\E_ALL); self::$io = $io; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Downloader\DownloaderInterface; use Composer\Downloader\DownloadManager; use Composer\Package\PackageInterface; use React\Promise\PromiseInterface; class SyncHelper { /** * Helps you download + install a single package in a synchronous way * * This executes all the required steps and waits for promises to complete * * @param Loop $loop Loop instance which you can get from $composer->getLoop() * @param DownloaderInterface|DownloadManager $downloader DownloadManager instance or Downloader instance you can get from $composer->getDownloadManager()->getDownloader('zip') for example * @param string $path The installation path for the package * @param PackageInterface $package The package to install * @param PackageInterface|null $prevPackage The previous package if this is an update and not an initial installation */ public static function downloadAndInstallPackageSync(\Composer\Util\Loop $loop, $downloader, string $path, PackageInterface $package, ?PackageInterface $prevPackage = null) : void { \assert($downloader instanceof DownloaderInterface || $downloader instanceof DownloadManager); $type = $prevPackage !== null ? 'update' : 'install'; try { self::await($loop, $downloader->download($package, $path, $prevPackage)); self::await($loop, $downloader->prepare($type, $package, $path, $prevPackage)); if ($type === 'update' && $prevPackage !== null) { self::await($loop, $downloader->update($package, $prevPackage, $path)); } else { self::await($loop, $downloader->install($package, $path)); } } catch (\Exception $e) { self::await($loop, $downloader->cleanup($type, $package, $path, $prevPackage)); throw $e; } self::await($loop, $downloader->cleanup($type, $package, $path, $prevPackage)); } /** * Waits for a promise to resolve * * @param Loop $loop Loop instance which you can get from $composer->getLoop() * @phpstan-param PromiseInterface|null $promise */ public static function await(\Composer\Util\Loop $loop, ?PromiseInterface $promise = null) : void { if ($promise !== null) { $loop->wait([$promise]); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use React\Promise\CancellablePromiseInterface; use _ContaoManager\Symfony\Component\Console\Helper\ProgressBar; use React\Promise\PromiseInterface; /** * @author Jordi Boggiano */ class Loop { /** @var HttpDownloader */ private $httpDownloader; /** @var ProcessExecutor|null */ private $processExecutor; /** @var array>> */ private $currentPromises = []; /** @var int */ private $waitIndex = 0; public function __construct(\Composer\Util\HttpDownloader $httpDownloader, ?\Composer\Util\ProcessExecutor $processExecutor = null) { $this->httpDownloader = $httpDownloader; $this->httpDownloader->enableAsync(); $this->processExecutor = $processExecutor; if ($this->processExecutor) { $this->processExecutor->enableAsync(); } } public function getHttpDownloader() : \Composer\Util\HttpDownloader { return $this->httpDownloader; } public function getProcessExecutor() : ?\Composer\Util\ProcessExecutor { return $this->processExecutor; } /** * @param array> $promises * @param ProgressBar|null $progress */ public function wait(array $promises, ?ProgressBar $progress = null) : void { $uncaught = null; \React\Promise\all($promises)->then(static function () : void { }, static function (\Throwable $e) use(&$uncaught) : void { $uncaught = $e; }); // keep track of every group of promises that is waited on, so abortJobs can // cancel them all, even if wait() was called within a wait() $waitIndex = $this->waitIndex++; $this->currentPromises[$waitIndex] = $promises; if ($progress) { $totalJobs = 0; $totalJobs += $this->httpDownloader->countActiveJobs(); if ($this->processExecutor) { $totalJobs += $this->processExecutor->countActiveJobs(); } $progress->start($totalJobs); } $lastUpdate = 0; while (\true) { $activeJobs = 0; $activeJobs += $this->httpDownloader->countActiveJobs(); if ($this->processExecutor) { $activeJobs += $this->processExecutor->countActiveJobs(); } if ($progress && \microtime(\true) - $lastUpdate > 0.1) { $lastUpdate = \microtime(\true); $progress->setProgress($progress->getMaxSteps() - $activeJobs); } if (!$activeJobs) { break; } } // as we skip progress updates if they are too quick, make sure we do one last one here at 100% if ($progress) { $progress->finish(); } unset($this->currentPromises[$waitIndex]); if (null !== $uncaught) { throw $uncaught; } } public function abortJobs() : void { foreach ($this->currentPromises as $promiseGroup) { foreach ($promiseGroup as $promise) { // to support react/promise 2.x we wrap the promise in a resolve() call for safety \React\Promise\resolve($promise)->cancel(); } } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Config; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; use Composer\Json\JsonValidationException; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Silencer; /** * JSON Configuration Source * * @author Jordi Boggiano * @author Beau Simensen */ class JsonConfigSource implements \Composer\Config\ConfigSourceInterface { /** * @var JsonFile */ private $file; /** * @var bool */ private $authConfig; /** * Constructor */ public function __construct(JsonFile $file, bool $authConfig = \false) { $this->file = $file; $this->authConfig = $authConfig; } /** * @inheritDoc */ public function getName() : string { return $this->file->getPath(); } /** * @inheritDoc */ public function addRepository(string $name, $config, bool $append = \true) : void { $this->manipulateJson('addRepository', static function (&$config, $repo, $repoConfig) use($append) : void { // if converting from an array format to hashmap format, and there is a {"packagist.org":false} repo, we have // to convert it to "packagist.org": false key on the hashmap otherwise it fails schema validation if (isset($config['repositories'])) { foreach ($config['repositories'] as $index => $val) { if ($index === $repo) { continue; } if (\is_numeric($index) && ($val === ['packagist' => \false] || $val === ['packagist.org' => \false])) { unset($config['repositories'][$index]); $config['repositories']['packagist.org'] = \false; break; } } } if ($append) { $config['repositories'][$repo] = $repoConfig; } else { $config['repositories'] = [$repo => $repoConfig] + $config['repositories']; } }, $name, $config, $append); } /** * @inheritDoc */ public function removeRepository(string $name) : void { $this->manipulateJson('removeRepository', static function (&$config, $repo) : void { unset($config['repositories'][$repo]); }, $name); } /** * @inheritDoc */ public function addConfigSetting(string $name, $value) : void { $authConfig = $this->authConfig; $this->manipulateJson('addConfigSetting', static function (&$config, $key, $val) use($authConfig) : void { if (Preg::isMatch('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\\.}', $key)) { [$key, $host] = \explode('.', $key, 2); if ($authConfig) { $config[$key][$host] = $val; } else { $config['config'][$key][$host] = $val; } } else { $config['config'][$key] = $val; } }, $name, $value); } /** * @inheritDoc */ public function removeConfigSetting(string $name) : void { $authConfig = $this->authConfig; $this->manipulateJson('removeConfigSetting', static function (&$config, $key) use($authConfig) : void { if (Preg::isMatch('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\\.}', $key)) { [$key, $host] = \explode('.', $key, 2); if ($authConfig) { unset($config[$key][$host]); } else { unset($config['config'][$key][$host]); } } else { unset($config['config'][$key]); } }, $name); } /** * @inheritDoc */ public function addProperty(string $name, $value) : void { $this->manipulateJson('addProperty', static function (&$config, $key, $val) : void { if (\strpos($key, 'extra.') === 0 || \strpos($key, 'scripts.') === 0) { $bits = \explode('.', $key); $last = \array_pop($bits); $arr =& $config[\reset($bits)]; foreach ($bits as $bit) { if (!isset($arr[$bit])) { $arr[$bit] = []; } $arr =& $arr[$bit]; } $arr[$last] = $val; } else { $config[$key] = $val; } }, $name, $value); } /** * @inheritDoc */ public function removeProperty(string $name) : void { $this->manipulateJson('removeProperty', static function (&$config, $key) : void { if (\strpos($key, 'extra.') === 0 || \strpos($key, 'scripts.') === 0 || \stripos($key, 'autoload.') === 0 || \stripos($key, 'autoload-dev.') === 0) { $bits = \explode('.', $key); $last = \array_pop($bits); $arr =& $config[\reset($bits)]; foreach ($bits as $bit) { if (!isset($arr[$bit])) { return; } $arr =& $arr[$bit]; } unset($arr[$last]); } else { unset($config[$key]); } }, $name); } /** * @inheritDoc */ public function addLink(string $type, string $name, string $value) : void { $this->manipulateJson('addLink', static function (&$config, $type, $name, $value) : void { $config[$type][$name] = $value; }, $type, $name, $value); } /** * @inheritDoc */ public function removeLink(string $type, string $name) : void { $this->manipulateJson('removeSubNode', static function (&$config, $type, $name) : void { unset($config[$type][$name]); }, $type, $name); $this->manipulateJson('removeMainKeyIfEmpty', static function (&$config, $type) : void { if (0 === \count($config[$type])) { unset($config[$type]); } }, $type); } /** * @param mixed ...$args */ private function manipulateJson(string $method, callable $fallback, ...$args) : void { if ($this->file->exists()) { if (!\is_writable($this->file->getPath())) { throw new \RuntimeException(\sprintf('The file "%s" is not writable.', $this->file->getPath())); } if (!Filesystem::isReadable($this->file->getPath())) { throw new \RuntimeException(\sprintf('The file "%s" is not readable.', $this->file->getPath())); } $contents = \file_get_contents($this->file->getPath()); } elseif ($this->authConfig) { $contents = "{\n}\n"; } else { $contents = "{\n \"config\": {\n }\n}\n"; } $manipulator = new JsonManipulator($contents); $newFile = !$this->file->exists(); // override manipulator method for auth config files if ($this->authConfig && $method === 'addConfigSetting') { $method = 'addSubNode'; [$mainNode, $name] = \explode('.', $args[0], 2); $args = [$mainNode, $name, $args[1]]; } elseif ($this->authConfig && $method === 'removeConfigSetting') { $method = 'removeSubNode'; [$mainNode, $name] = \explode('.', $args[0], 2); $args = [$mainNode, $name]; } // try to update cleanly if (\call_user_func_array([$manipulator, $method], $args)) { \file_put_contents($this->file->getPath(), $manipulator->getContents()); } else { // on failed clean update, call the fallback and rewrite the whole file $config = $this->file->read(); $this->arrayUnshiftRef($args, $config); $fallback(...$args); // avoid ending up with arrays for keys that should be objects foreach (['require', 'require-dev', 'conflict', 'provide', 'replace', 'suggest', 'config', 'autoload', 'autoload-dev', 'scripts', 'scripts-descriptions', 'scripts-aliases', 'support'] as $prop) { if (isset($config[$prop]) && $config[$prop] === []) { $config[$prop] = new \stdClass(); } } foreach (['psr-0', 'psr-4'] as $prop) { if (isset($config['autoload'][$prop]) && $config['autoload'][$prop] === []) { $config['autoload'][$prop] = new \stdClass(); } if (isset($config['autoload-dev'][$prop]) && $config['autoload-dev'][$prop] === []) { $config['autoload-dev'][$prop] = new \stdClass(); } } foreach (['platform', 'http-basic', 'bearer', 'gitlab-token', 'gitlab-oauth', 'github-oauth', 'preferred-install'] as $prop) { if (isset($config['config'][$prop]) && $config['config'][$prop] === []) { $config['config'][$prop] = new \stdClass(); } } $this->file->write($config); } try { $this->file->validateSchema(JsonFile::LAX_SCHEMA); } catch (JsonValidationException $e) { // restore contents to the original state \file_put_contents($this->file->getPath(), $contents); throw new \RuntimeException('Failed to update composer.json with a valid format, reverting to the original content. Please report an issue to us with details (command you run and a copy of your composer.json). ' . \PHP_EOL . \implode(\PHP_EOL, $e->getErrors()), 0, $e); } if ($newFile) { Silencer::call('chmod', $this->file->getPath(), 0600); } } /** * Prepend a reference to an element to the beginning of an array. * * @param mixed[] $array * @param mixed $value */ private function arrayUnshiftRef(array &$array, &$value) : int { $return = \array_unshift($array, ''); $array[0] =& $value; return $return; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Config; /** * Configuration Source Interface * * @author Jordi Boggiano * @author Beau Simensen */ interface ConfigSourceInterface { /** * Add a repository * * @param string $name Name * @param mixed[]|false $config Configuration * @param bool $append Whether the repo should be appended (true) or prepended (false) */ public function addRepository(string $name, $config, bool $append = \true) : void; /** * Remove a repository */ public function removeRepository(string $name) : void; /** * Add a config setting * * @param string $name Name * @param mixed $value Value */ public function addConfigSetting(string $name, $value) : void; /** * Remove a config setting */ public function removeConfigSetting(string $name) : void; /** * Add a property * * @param string $name Name * @param string|string[] $value Value */ public function addProperty(string $name, $value) : void; /** * Remove a property */ public function removeProperty(string $name) : void; /** * Add a package link * * @param string $type Type (require, require-dev, provide, suggest, replace, conflict) * @param string $name Name * @param string $value Value */ public function addLink(string $type, string $name, string $value) : void; /** * Remove a package link * * @param string $type Type (require, require-dev, provide, suggest, replace, conflict) * @param string $name Name */ public function removeLink(string $type, string $name) : void; /** * Gives a user-friendly name to this source (file path or so) */ public function getName() : string; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\SelfUpdate; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\HttpDownloader; use Composer\Config; /** * @author Jordi Boggiano */ class Versions { /** * @var string[] * @deprecated use Versions::CHANNELS */ public static $channels = self::CHANNELS; public const CHANNELS = ['stable', 'preview', 'snapshot', '1', '2', '2.2']; /** @var HttpDownloader */ private $httpDownloader; /** @var Config */ private $config; /** @var string */ private $channel; /** @var array>|null */ private $versionsData = null; public function __construct(Config $config, HttpDownloader $httpDownloader) { $this->httpDownloader = $httpDownloader; $this->config = $config; } public function getChannel() : string { if ($this->channel) { return $this->channel; } $channelFile = $this->config->get('home') . '/update-channel'; if (\file_exists($channelFile)) { $channel = \trim(\file_get_contents($channelFile)); if (\in_array($channel, ['stable', 'preview', 'snapshot', '2.2'], \true)) { return $this->channel = $channel; } } return $this->channel = 'stable'; } public function setChannel(string $channel, ?IOInterface $io = null) : void { if (!\in_array($channel, self::CHANNELS, \true)) { throw new \InvalidArgumentException('Invalid channel ' . $channel . ', must be one of: ' . \implode(', ', self::CHANNELS)); } $channelFile = $this->config->get('home') . '/update-channel'; $this->channel = $channel; // rewrite '2' and '1' channels to stable for future self-updates, but LTS ones like '2.2' remain pinned $storedChannel = Preg::isMatch('{^\\d+$}D', $channel) ? 'stable' : $channel; $previouslyStored = \file_exists($channelFile) ? \trim((string) \file_get_contents($channelFile)) : null; \file_put_contents($channelFile, $storedChannel . \PHP_EOL); if ($io !== null && $previouslyStored !== $storedChannel) { $io->writeError('Storing "' . $storedChannel . '" as default update channel for the next self-update run.'); } } /** * @return array{path: string, version: string, min-php: int, eol?: true} */ public function getLatest(?string $channel = null) : array { $versions = $this->getVersionsData(); foreach ($versions[$channel ?: $this->getChannel()] as $version) { if ($version['min-php'] <= \PHP_VERSION_ID) { return $version; } } throw new \UnexpectedValueException('There is no version of Composer available for your PHP version (' . \PHP_VERSION . ')'); } /** * @return array> */ private function getVersionsData() : array { if (null === $this->versionsData) { if ($this->config->get('disable-tls') === \true) { $protocol = 'http'; } else { $protocol = 'https'; } $this->versionsData = $this->httpDownloader->get($protocol . '://getcomposer.org/versions')->decodeJson(); } return $this->versionsData; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\SelfUpdate; use Composer\Pcre\Preg; /** * @author Jordi Boggiano */ class Keys { public static function fingerprint(string $path) : string { $hash = \strtoupper(\hash('sha256', Preg::replace('{\\s}', '', \file_get_contents($path)))); return \implode(' ', [ \substr($hash, 0, 8), \substr($hash, 8, 8), \substr($hash, 16, 8), \substr($hash, 24, 8), '', // Extra space \substr($hash, 32, 8), \substr($hash, 40, 8), \substr($hash, 48, 8), \substr($hash, 56, 8), ]); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\Silencer; use _ContaoManager\Symfony\Component\Finder\Finder; /** * Reads/writes to a filesystem cache * * @author Jordi Boggiano */ class Cache { /** @var bool|null */ private static $cacheCollected = null; /** @var IOInterface */ private $io; /** @var string */ private $root; /** @var ?bool */ private $enabled = null; /** @var string */ private $allowlist; /** @var Filesystem */ private $filesystem; /** @var bool */ private $readOnly; /** * @param string $cacheDir location of the cache * @param string $allowlist List of characters that are allowed in path names (used in a regex character class) * @param Filesystem $filesystem optional filesystem instance * @param bool $readOnly whether the cache is in readOnly mode */ public function __construct(IOInterface $io, string $cacheDir, string $allowlist = 'a-z0-9._', ?Filesystem $filesystem = null, bool $readOnly = \false) { $this->io = $io; $this->root = \rtrim($cacheDir, '/\\') . '/'; $this->allowlist = $allowlist; $this->filesystem = $filesystem ?: new Filesystem(); $this->readOnly = $readOnly; if (!self::isUsable($cacheDir)) { $this->enabled = \false; } } /** * @return void */ public function setReadOnly(bool $readOnly) { $this->readOnly = $readOnly; } /** * @return bool */ public function isReadOnly() { return $this->readOnly; } /** * @return bool */ public static function isUsable(string $path) { return !Preg::isMatch('{(^|[\\\\/])(\\$null|nul|NUL|/dev/null)([\\\\/]|$)}', $path); } /** * @return bool */ public function isEnabled() { if ($this->enabled === null) { $this->enabled = \true; if (!$this->readOnly && (!\is_dir($this->root) && !Silencer::call('mkdir', $this->root, 0777, \true) || !\is_writable($this->root))) { $this->io->writeError('Cannot create cache directory ' . $this->root . ', or directory is not writable. Proceeding without cache. See also cache-read-only config if your filesystem is read-only.'); $this->enabled = \false; } } return $this->enabled; } /** * @return string */ public function getRoot() { return $this->root; } /** * @return string|false */ public function read(string $file) { if ($this->isEnabled()) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); if (\file_exists($this->root . $file)) { $this->io->writeError('Reading ' . $this->root . $file . ' from cache', \true, IOInterface::DEBUG); return \file_get_contents($this->root . $file); } } return \false; } /** * @return bool */ public function write(string $file, string $contents) { $wasEnabled = $this->enabled === \true; if ($this->isEnabled() && !$this->readOnly) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); $this->io->writeError('Writing ' . $this->root . $file . ' into cache', \true, IOInterface::DEBUG); $tempFileName = $this->root . $file . \bin2hex(\random_bytes(5)) . '.tmp'; try { return \file_put_contents($tempFileName, $contents) !== \false && \rename($tempFileName, $this->root . $file); } catch (\ErrorException $e) { // If the write failed despite isEnabled checks passing earlier, rerun the isEnabled checks to // see if they are still current and recreate the cache dir if needed. Refs https://github.com/composer/composer/issues/11076 if ($wasEnabled) { \clearstatcache(); $this->enabled = null; return $this->write($file, $contents); } $this->io->writeError('Failed to write into cache: ' . $e->getMessage() . '', \true, IOInterface::DEBUG); if (Preg::isMatch('{^file_put_contents\\(\\): Only ([0-9]+) of ([0-9]+) bytes written}', $e->getMessage(), $m)) { // Remove partial file. \unlink($tempFileName); $message = \sprintf('Writing %1$s into cache failed after %2$u of %3$u bytes written, only %4$s bytes of free space available', $tempFileName, $m[1], $m[2], \function_exists('disk_free_space') ? @\disk_free_space(\dirname($tempFileName)) : 'unknown'); $this->io->writeError($message); return \false; } throw $e; } } return \false; } /** * Copy a file into the cache * * @return bool */ public function copyFrom(string $file, string $source) { if ($this->isEnabled() && !$this->readOnly) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); $this->filesystem->ensureDirectoryExists(\dirname($this->root . $file)); if (!\file_exists($source)) { $this->io->writeError('' . $source . ' does not exist, can not write into cache'); } elseif ($this->io->isDebug()) { $this->io->writeError('Writing ' . $this->root . $file . ' into cache from ' . $source); } return $this->filesystem->copy($source, $this->root . $file); } return \false; } /** * Copy a file out of the cache * * @return bool */ public function copyTo(string $file, string $target) { if ($this->isEnabled()) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); if (\file_exists($this->root . $file)) { try { \touch($this->root . $file, (int) \filemtime($this->root . $file), \time()); } catch (\ErrorException $e) { // fallback in case the above failed due to incorrect ownership // see https://github.com/composer/composer/issues/4070 Silencer::call('touch', $this->root . $file); } $this->io->writeError('Reading ' . $this->root . $file . ' from cache', \true, IOInterface::DEBUG); return $this->filesystem->copy($this->root . $file, $target); } } return \false; } /** * @return bool */ public function gcIsNecessary() { if (self::$cacheCollected) { return \false; } self::$cacheCollected = \true; if (Platform::getEnv('COMPOSER_TEST_SUITE')) { return \false; } if (Platform::isInputCompletionProcess()) { return \false; } return !\random_int(0, 50); } /** * @return bool */ public function remove(string $file) { if ($this->isEnabled() && !$this->readOnly) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); if (\file_exists($this->root . $file)) { return $this->filesystem->unlink($this->root . $file); } } return \false; } /** * @return bool */ public function clear() { if ($this->isEnabled() && !$this->readOnly) { $this->filesystem->emptyDirectory($this->root); return \true; } return \false; } /** * @return int|false * @phpstan-return int<0, max>|false */ public function getAge(string $file) { if ($this->isEnabled()) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); if (\file_exists($this->root . $file) && ($mtime = \filemtime($this->root . $file)) !== \false) { return \abs(\time() - $mtime); } } return \false; } /** * @return bool */ public function gc(int $ttl, int $maxSize) { if ($this->isEnabled() && !$this->readOnly) { $expire = new \DateTime(); $expire->modify('-' . $ttl . ' seconds'); $finder = $this->getFinder()->date('until ' . $expire->format('Y-m-d H:i:s')); foreach ($finder as $file) { $this->filesystem->unlink($file->getPathname()); } $totalSize = $this->filesystem->size($this->root); if ($totalSize > $maxSize) { $iterator = $this->getFinder()->sortByAccessedTime()->getIterator(); while ($totalSize > $maxSize && $iterator->valid()) { $filepath = $iterator->current()->getPathname(); $totalSize -= $this->filesystem->size($filepath); $this->filesystem->unlink($filepath); $iterator->next(); } } self::$cacheCollected = \true; return \true; } return \false; } public function gcVcsCache(int $ttl) : bool { if ($this->isEnabled()) { $expire = new \DateTime(); $expire->modify('-' . $ttl . ' seconds'); $finder = Finder::create()->in($this->root)->directories()->depth(0)->date('until ' . $expire->format('Y-m-d H:i:s')); foreach ($finder as $file) { $this->filesystem->removeDirectory($file->getPathname()); } self::$cacheCollected = \true; return \true; } return \false; } /** * @return string|false */ public function sha1(string $file) { if ($this->isEnabled()) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); if (\file_exists($this->root . $file)) { return \hash_file('sha1', $this->root . $file); } } return \false; } /** * @return string|false */ public function sha256(string $file) { if ($this->isEnabled()) { $file = Preg::replace('{[^' . $this->allowlist . ']}i', '-', $file); if (\file_exists($this->root . $file)) { return \hash_file('sha256', $this->root . $file); } } return \false; } /** * @return Finder */ protected function getFinder() { return Finder::create()->in($this->root)->files(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; /** * The base event class * * @author Nils Adermann */ class Event { /** * @var string This event's name */ protected $name; /** * @var string[] Arguments passed by the user, these will be forwarded to CLI script handlers */ protected $args; /** * @var mixed[] Flags usable in PHP script handlers */ protected $flags; /** * @var bool Whether the event should not be passed to more listeners */ private $propagationStopped = \false; /** * Constructor. * * @param string $name The event name * @param string[] $args Arguments passed by the user * @param mixed[] $flags Optional flags to pass data not as argument */ public function __construct(string $name, array $args = [], array $flags = []) { $this->name = $name; $this->args = $args; $this->flags = $flags; } /** * Returns the event's name. * * @return string The event name */ public function getName() : string { return $this->name; } /** * Returns the event's arguments. * * @return string[] The event arguments */ public function getArguments() : array { return $this->args; } /** * Returns the event's flags. * * @return mixed[] The event flags */ public function getFlags() : array { return $this->flags; } /** * Checks if stopPropagation has been called * * @return bool Whether propagation has been stopped */ public function isPropagationStopped() : bool { return $this->propagationStopped; } /** * Prevents the event from being passed to further listeners */ public function stopPropagation() : void { $this->propagationStopped = \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; /** * Thrown when a script running an external process exits with a non-0 status code * * @author Jordi Boggiano */ class ScriptExecutionException extends \RuntimeException { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; use Composer\DependencyResolver\Transaction; use Composer\Installer\InstallerEvent; use Composer\IO\BufferIO; use Composer\IO\ConsoleIO; use Composer\IO\IOInterface; use Composer\Composer; use Composer\PartialComposer; use Composer\Pcre\Preg; use Composer\Plugin\CommandEvent; use Composer\Plugin\PreCommandRunEvent; use Composer\Util\Platform; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\Repository\RepositoryInterface; use Composer\Script; use Composer\Installer\PackageEvent; use Composer\Installer\BinaryInstaller; use Composer\Util\ProcessExecutor; use Composer\Script\Event as ScriptEvent; use Composer\Autoload\ClassLoader; use _ContaoManager\Symfony\Component\Console\Application; use _ContaoManager\Symfony\Component\Console\Command\Command; use _ContaoManager\Symfony\Component\Console\Input\StringInput; use _ContaoManager\Symfony\Component\Console\Output\ConsoleOutput; use _ContaoManager\Symfony\Component\Process\PhpExecutableFinder; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; /** * The Event Dispatcher. * * Example in command: * $dispatcher = new EventDispatcher($this->requireComposer(), $this->getApplication()->getIO()); * // ... * $dispatcher->dispatch(ScriptEvents::POST_INSTALL_CMD); * // ... * * @author François Pluchino * @author Jordi Boggiano * @author Nils Adermann */ class EventDispatcher { /** @var PartialComposer */ protected $composer; /** @var IOInterface */ protected $io; /** @var ?ClassLoader */ protected $loader; /** @var ProcessExecutor */ protected $process; /** @var array>> */ protected $listeners = []; /** @var bool */ protected $runScripts = \true; /** @var list */ private $eventStack; /** @var list */ private $skipScripts; /** * Constructor. * * @param PartialComposer $composer The composer instance * @param IOInterface $io The IOInterface instance * @param ProcessExecutor $process */ public function __construct(PartialComposer $composer, IOInterface $io, ?ProcessExecutor $process = null) { $this->composer = $composer; $this->io = $io; $this->process = $process ?? new ProcessExecutor($io); $this->eventStack = []; $this->skipScripts = \array_values(\array_filter(\array_map('trim', \explode(',', (string) Platform::getEnv('COMPOSER_SKIP_SCRIPTS'))), function ($val) { return $val !== ''; })); } /** * Set whether script handlers are active or not * * @return $this */ public function setRunScripts(bool $runScripts = \true) : self { $this->runScripts = $runScripts; return $this; } /** * Dispatch an event * * @param string|null $eventName The event name, required if no $event is provided * @param Event $event An event instance, required if no $eventName is provided * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatch(?string $eventName, ?\Composer\EventDispatcher\Event $event = null) : int { if (null === $event) { if (null === $eventName) { throw new \InvalidArgumentException('If no $event is passed in to ' . __METHOD__ . ' you have to pass in an $eventName, got null.'); } $event = new \Composer\EventDispatcher\Event($eventName); } return $this->doDispatch($event); } /** * Dispatch a script event. * * @param string $eventName The constant in ScriptEvents * @param array $additionalArgs Arguments passed by the user * @param array $flags Optional flags to pass data not as argument * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatchScript(string $eventName, bool $devMode = \false, array $additionalArgs = [], array $flags = []) : int { \assert($this->composer instanceof Composer, new \LogicException('This should only be reached with a fully loaded Composer')); return $this->doDispatch(new Script\Event($eventName, $this->composer, $this->io, $devMode, $additionalArgs, $flags)); } /** * Dispatch a package event. * * @param string $eventName The constant in PackageEvents * @param bool $devMode Whether or not we are in dev mode * @param RepositoryInterface $localRepo The installed repository * @param OperationInterface[] $operations The list of operations * @param OperationInterface $operation The package being installed/updated/removed * * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatchPackageEvent(string $eventName, bool $devMode, RepositoryInterface $localRepo, array $operations, OperationInterface $operation) : int { \assert($this->composer instanceof Composer, new \LogicException('This should only be reached with a fully loaded Composer')); return $this->doDispatch(new PackageEvent($eventName, $this->composer, $this->io, $devMode, $localRepo, $operations, $operation)); } /** * Dispatch a installer event. * * @param string $eventName The constant in InstallerEvents * @param bool $devMode Whether or not we are in dev mode * @param bool $executeOperations True if operations will be executed, false in --dry-run * @param Transaction $transaction The transaction contains the list of operations * * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatchInstallerEvent(string $eventName, bool $devMode, bool $executeOperations, Transaction $transaction) : int { \assert($this->composer instanceof Composer, new \LogicException('This should only be reached with a fully loaded Composer')); return $this->doDispatch(new InstallerEvent($eventName, $this->composer, $this->io, $devMode, $executeOperations, $transaction)); } /** * Triggers the listeners of an event. * * @param Event $event The event object to pass to the event handlers/listeners. * @throws \RuntimeException|\Exception * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ protected function doDispatch(\Composer\EventDispatcher\Event $event) { if (Platform::getEnv('COMPOSER_DEBUG_EVENTS')) { $details = null; if ($event instanceof PackageEvent) { $details = (string) $event->getOperation(); } elseif ($event instanceof CommandEvent) { $details = $event->getCommandName(); } elseif ($event instanceof PreCommandRunEvent) { $details = $event->getCommand(); } $this->io->writeError('Dispatching ' . $event->getName() . '' . ($details ? ' (' . $details . ')' : '') . ' event'); } $listeners = $this->getListeners($event); $this->pushEvent($event); $autoloadersBefore = \spl_autoload_functions(); try { $returnMax = 0; foreach ($listeners as $callable) { $return = 0; $this->ensureBinDirIsInPath(); $additionalArgs = $event->getArguments(); if (\is_string($callable) && \str_contains($callable, '@no_additional_args')) { $callable = Preg::replace('{ ?@no_additional_args}', '', $callable); $additionalArgs = []; } $formattedEventNameWithArgs = $event->getName() . ($additionalArgs !== [] ? ' (' . \implode(', ', $additionalArgs) . ')' : ''); if (!\is_string($callable)) { if (!\is_callable($callable)) { $className = \is_object($callable[0]) ? \get_class($callable[0]) : $callable[0]; throw new \RuntimeException('Subscriber ' . $className . '::' . $callable[1] . ' for event ' . $event->getName() . ' is not callable, make sure the function is defined and public'); } if (\is_array($callable) && (\is_string($callable[0]) || \is_object($callable[0])) && \is_string($callable[1])) { $this->io->writeError(\sprintf('> %s: %s', $formattedEventNameWithArgs, (\is_object($callable[0]) ? \get_class($callable[0]) : $callable[0]) . '->' . $callable[1]), \true, IOInterface::VERBOSE); } $return = \false === $callable($event) ? 1 : 0; } elseif ($this->isComposerScript($callable)) { $this->io->writeError(\sprintf('> %s: %s', $formattedEventNameWithArgs, $callable), \true, IOInterface::VERBOSE); $script = \explode(' ', \substr($callable, 1)); $scriptName = $script[0]; unset($script[0]); $index = \array_search('@additional_args', $script, \true); if ($index !== \false) { $args = \array_splice($script, $index, 0, $additionalArgs); } else { $args = \array_merge($script, $additionalArgs); } $flags = $event->getFlags(); if (isset($flags['script-alias-input'])) { $argsString = \implode(' ', \array_map(static function ($arg) { return ProcessExecutor::escape($arg); }, $script)); $flags['script-alias-input'] = $argsString . ' ' . $flags['script-alias-input']; unset($argsString); } if (\strpos($callable, '@composer ') === 0) { $exec = $this->getPhpExecCommand() . ' ' . ProcessExecutor::escape(Platform::getEnv('COMPOSER_BINARY')) . ' ' . \implode(' ', $args); if (0 !== ($exitCode = $this->executeTty($exec))) { $this->io->writeError(\sprintf('Script %s handling the %s event returned with error code ' . $exitCode . '', $callable, $event->getName()), \true, IOInterface::QUIET); throw new \Composer\EventDispatcher\ScriptExecutionException('Error Output: ' . $this->process->getErrorOutput(), $exitCode); } } else { if (!$this->getListeners(new \Composer\EventDispatcher\Event($scriptName))) { $this->io->writeError(\sprintf('You made a reference to a non-existent script %s', $callable), \true, IOInterface::QUIET); } try { /** @var InstallerEvent $event */ $scriptEvent = new Script\Event($scriptName, $event->getComposer(), $event->getIO(), $event->isDevMode(), $args, $flags); $scriptEvent->setOriginatingEvent($event); $return = $this->dispatch($scriptName, $scriptEvent); } catch (\Composer\EventDispatcher\ScriptExecutionException $e) { $this->io->writeError(\sprintf('Script %s was called via %s', $callable, $event->getName()), \true, IOInterface::QUIET); throw $e; } } } elseif ($this->isPhpScript($callable)) { $className = \substr($callable, 0, \strpos($callable, '::')); $methodName = \substr($callable, \strpos($callable, '::') + 2); if (!\class_exists($className)) { $this->io->writeError('Class ' . $className . ' is not autoloadable, can not call ' . $event->getName() . ' script', \true, IOInterface::QUIET); continue; } if (!\is_callable($callable)) { $this->io->writeError('Method ' . $callable . ' is not callable, can not call ' . $event->getName() . ' script', \true, IOInterface::QUIET); continue; } try { $return = \false === $this->executeEventPhpScript($className, $methodName, $event) ? 1 : 0; } catch (\Exception $e) { $message = "Script %s handling the %s event terminated with an exception"; $this->io->writeError('' . \sprintf($message, $callable, $event->getName()) . '', \true, IOInterface::QUIET); throw $e; } } elseif ($this->isCommandClass($callable)) { $className = $callable; if (!\class_exists($className)) { $this->io->writeError('Class ' . $className . ' is not autoloadable, can not call ' . $event->getName() . ' script', \true, IOInterface::QUIET); continue; } if (!\is_a($className, Command::class, \true)) { $this->io->writeError('Class ' . $className . ' does not extend ' . Command::class . ', can not call ' . $event->getName() . ' script', \true, IOInterface::QUIET); continue; } if (\defined('Composer\\Script\\ScriptEvents::' . \str_replace('-', '_', \strtoupper($event->getName())))) { $this->io->writeError('You cannot bind ' . $event->getName() . ' to a Command class, use a non-reserved name', \true, IOInterface::QUIET); continue; } $app = new Application(); $app->setCatchExceptions(\false); if (\method_exists($app, 'setCatchErrors')) { $app->setCatchErrors(\false); } $app->setAutoExit(\false); $cmd = new $className($event->getName()); $app->add($cmd); $app->setDefaultCommand((string) $cmd->getName(), \true); try { $args = \implode(' ', \array_map(static function ($arg) { return ProcessExecutor::escape($arg); }, $additionalArgs)); // reusing the output from $this->io is mostly needed for tests, but generally speaking // it does not hurt to keep the same stream as the current Application if ($this->io instanceof ConsoleIO) { $reflProp = new \ReflectionProperty($this->io, 'output'); if (\PHP_VERSION_ID < 80100) { $reflProp->setAccessible(\true); } $output = $reflProp->getValue($this->io); } else { $output = new ConsoleOutput(); } $return = $app->run(new StringInput($event->getFlags()['script-alias-input'] ?? $args), $output); } catch (\Exception $e) { $message = "Script %s handling the %s event terminated with an exception"; $this->io->writeError('' . \sprintf($message, $callable, $event->getName()) . '', \true, IOInterface::QUIET); throw $e; } } else { $args = \implode(' ', \array_map(['Composer\\Util\\ProcessExecutor', 'escape'], $additionalArgs)); // @putenv does not receive arguments if (\strpos($callable, '@putenv ') === 0) { $exec = $callable; } else { if (\str_contains($callable, '@additional_args')) { $exec = \str_replace('@additional_args', $args, $callable); } else { $exec = $callable . ($args === '' ? '' : ' ' . $args); } } if ($this->io->isVerbose()) { $this->io->writeError(\sprintf('> %s: %s', $event->getName(), $exec)); } elseif ($event->getName() !== '__exec_command') { // do not output the command being run when using `composer exec` as it is fairly obvious the user is running it $this->io->writeError(\sprintf('> %s', $exec)); } $possibleLocalBinaries = $this->composer->getPackage()->getBinaries(); if (\count($possibleLocalBinaries) > 0) { foreach ($possibleLocalBinaries as $localExec) { if (Preg::isMatch('{\\b' . \preg_quote($callable) . '$}', $localExec)) { $caller = BinaryInstaller::determineBinaryCaller($localExec); $exec = Preg::replace('{^' . \preg_quote($callable) . '}', $caller . ' ' . $localExec, $exec); break; } } } if (\strpos($exec, '@putenv ') === 0) { if (\false === \strpos($exec, '=')) { Platform::clearEnv(\substr($exec, 8)); } else { [$var, $value] = \explode('=', \substr($exec, 8), 2); Platform::putEnv($var, $value); } continue; } if (\strpos($exec, '@php ') === 0) { $pathAndArgs = \substr($exec, 5); if (Platform::isWindows()) { $pathAndArgs = Preg::replaceCallback('{^\\S+}', static function ($path) { return \str_replace('/', '\\', $path[0]); }, $pathAndArgs); } // match somename (not in quote, and not a qualified path) and if it is not a valid path from CWD then try to find it // in $PATH. This allows support for `@php foo` where foo is a binary name found in PATH but not an actual relative path $matched = Preg::isMatchStrictGroups('{^[^\'"\\s/\\\\]+}', $pathAndArgs, $match); if ($matched && !\file_exists($match[0])) { $finder = new ExecutableFinder(); if ($pathToExec = $finder->find($match[0])) { if (Platform::isWindows()) { $execWithoutExt = Preg::replace('{\\.(exe|bat|cmd|com)$}i', '', $pathToExec); // prefer non-extension file if it exists when executing with PHP if (\file_exists($execWithoutExt)) { $pathToExec = $execWithoutExt; } unset($execWithoutExt); } $pathAndArgs = $pathToExec . \substr($pathAndArgs, \strlen($match[0])); } } $exec = $this->getPhpExecCommand() . ' ' . $pathAndArgs; } else { $finder = new PhpExecutableFinder(); $phpPath = $finder->find(\false); if ($phpPath) { Platform::putEnv('PHP_BINARY', $phpPath); } if (Platform::isWindows()) { $exec = Preg::replaceCallback('{^\\S+}', static function ($path) { return \str_replace('/', '\\', $path[0]); }, $exec); } } // if composer is being executed, make sure it runs the expected composer from current path // resolution, even if bin-dir contains composer too because the project requires composer/composer // see https://github.com/composer/composer/issues/8748 if (\strpos($exec, 'composer ') === 0) { $exec = $this->getPhpExecCommand() . ' ' . ProcessExecutor::escape(Platform::getEnv('COMPOSER_BINARY')) . \substr($exec, 8); } if (0 !== ($exitCode = $this->executeTty($exec))) { $this->io->writeError(\sprintf('Script %s handling the %s event returned with error code ' . $exitCode . '', $callable, $event->getName()), \true, IOInterface::QUIET); throw new \Composer\EventDispatcher\ScriptExecutionException('Error Output: ' . $this->process->getErrorOutput(), $exitCode); } } $returnMax = \max($returnMax, $return); if ($event->isPropagationStopped()) { break; } } } finally { $this->popEvent(); $knownIdentifiers = []; foreach ($autoloadersBefore as $key => $cb) { $knownIdentifiers[$this->getCallbackIdentifier($cb)] = ['key' => $key, 'callback' => $cb]; } foreach (\spl_autoload_functions() as $cb) { // once we get to the first known autoloader, we can leave any appended autoloader without problems if (isset($knownIdentifiers[$this->getCallbackIdentifier($cb)]) && $knownIdentifiers[$this->getCallbackIdentifier($cb)]['key'] === 0) { break; } // other newly appeared prepended autoloaders should be appended instead to ensure Composer loads its classes first if ($cb instanceof ClassLoader) { $cb->unregister(); $cb->register(\false); } else { \spl_autoload_unregister($cb); \spl_autoload_register($cb); } } } return $returnMax; } protected function executeTty(string $exec) : int { if ($this->io->isInteractive()) { return $this->process->executeTty($exec); } return $this->process->execute($exec); } protected function getPhpExecCommand() : string { $finder = new PhpExecutableFinder(); $phpPath = $finder->find(\false); if (!$phpPath) { throw new \RuntimeException('Failed to locate PHP binary to execute ' . $phpPath); } $phpArgs = $finder->findArguments(); $phpArgs = $phpArgs ? ' ' . \implode(' ', $phpArgs) : ''; $allowUrlFOpenFlag = ' -d allow_url_fopen=' . ProcessExecutor::escape(\ini_get('allow_url_fopen')); $disableFunctionsFlag = ' -d disable_functions=' . ProcessExecutor::escape(\ini_get('disable_functions')); $memoryLimitFlag = ' -d memory_limit=' . ProcessExecutor::escape(\ini_get('memory_limit')); return ProcessExecutor::escape($phpPath) . $phpArgs . $allowUrlFOpenFlag . $disableFunctionsFlag . $memoryLimitFlag; } /** * @param Event $event Event invoking the PHP callable * * @return mixed */ protected function executeEventPhpScript(string $className, string $methodName, \Composer\EventDispatcher\Event $event) { if ($this->io->isVerbose()) { $this->io->writeError(\sprintf('> %s: %s::%s', $event->getName(), $className, $methodName)); } else { $this->io->writeError(\sprintf('> %s::%s', $className, $methodName)); } return $className::$methodName($event); } /** * Add a listener for a particular event * * @param string $eventName The event name - typically a constant * @param callable|string $listener A callable expecting an event argument, or a command string to be executed (same as a composer.json "scripts" entry) * @param int $priority A higher value represents a higher priority */ public function addListener(string $eventName, $listener, int $priority = 0) : void { $this->listeners[$eventName][$priority][] = $listener; } /** * @param callable|object $listener A callable or an object instance for which all listeners should be removed */ public function removeListener($listener) : void { foreach ($this->listeners as $eventName => $priorities) { foreach ($priorities as $priority => $listeners) { foreach ($listeners as $index => $candidate) { if ($listener === $candidate || \is_array($candidate) && \is_object($listener) && $candidate[0] === $listener) { unset($this->listeners[$eventName][$priority][$index]); } } } } } /** * Adds object methods as listeners for the events in getSubscribedEvents * * @see EventSubscriberInterface */ public function addSubscriber(\Composer\EventDispatcher\EventSubscriberInterface $subscriber) : void { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { if (\is_string($params)) { $this->addListener($eventName, [$subscriber, $params]); } elseif (\is_string($params[0])) { $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0); } else { foreach ($params as $listener) { $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0); } } } } /** * Retrieves all listeners for a given event * * @return array All listeners: callables and scripts */ protected function getListeners(\Composer\EventDispatcher\Event $event) : array { $scriptListeners = $this->runScripts ? $this->getScriptListeners($event) : []; if (!isset($this->listeners[$event->getName()][0])) { $this->listeners[$event->getName()][0] = []; } \krsort($this->listeners[$event->getName()]); $listeners = $this->listeners; $listeners[$event->getName()][0] = \array_merge($listeners[$event->getName()][0], $scriptListeners); return \array_merge(...$listeners[$event->getName()]); } /** * Checks if an event has listeners registered */ public function hasEventListeners(\Composer\EventDispatcher\Event $event) : bool { $listeners = $this->getListeners($event); return \count($listeners) > 0; } /** * Finds all listeners defined as scripts in the package * * @param Event $event Event object * @return string[] Listeners */ protected function getScriptListeners(\Composer\EventDispatcher\Event $event) : array { $package = $this->composer->getPackage(); $scripts = $package->getScripts(); if (empty($scripts[$event->getName()])) { return []; } if (\in_array($event->getName(), $this->skipScripts, \true)) { $this->io->writeError('Skipped script listeners for ' . $event->getName() . ' because of COMPOSER_SKIP_SCRIPTS', \true, IOInterface::VERBOSE); return []; } \assert($this->composer instanceof Composer, new \LogicException('This should only be reached with a fully loaded Composer')); if ($this->loader) { $this->loader->unregister(); } $generator = $this->composer->getAutoloadGenerator(); if ($event instanceof ScriptEvent) { $generator->setDevMode($event->isDevMode()); } $packages = $this->composer->getRepositoryManager()->getLocalRepository()->getCanonicalPackages(); $packageMap = $generator->buildPackageMap($this->composer->getInstallationManager(), $package, $packages); $map = $generator->parseAutoloads($packageMap, $package); $this->loader = $generator->createLoader($map, $this->composer->getConfig()->get('vendor-dir')); $this->loader->register(\false); return $scripts[$event->getName()]; } /** * Checks if string given references a class path and method */ protected function isPhpScript(string $callable) : bool { return \false === \strpos($callable, ' ') && \false !== \strpos($callable, '::'); } /** * Checks if string given references a command class */ protected function isCommandClass(string $callable) : bool { return \str_contains($callable, '\\') && !\str_contains($callable, ' ') && \str_ends_with($callable, 'Command'); } /** * Checks if string given references a composer run-script */ protected function isComposerScript(string $callable) : bool { return \strpos($callable, '@') === 0 && \strpos($callable, '@php ') !== 0 && \strpos($callable, '@putenv ') !== 0; } /** * Push an event to the stack of active event * * @throws \RuntimeException */ protected function pushEvent(\Composer\EventDispatcher\Event $event) : int { $eventName = $event->getName(); if (\in_array($eventName, $this->eventStack)) { throw new \RuntimeException(\sprintf("Circular call to script handler '%s' detected", $eventName)); } return \array_push($this->eventStack, $eventName); } /** * Pops the active event from the stack */ protected function popEvent() : ?string { return \array_pop($this->eventStack); } private function ensureBinDirIsInPath() : void { $pathEnv = 'PATH'; // checking if only Path and not PATH is set then we probably need to update the Path env // on Windows getenv is case-insensitive so we cannot check it via Platform::getEnv and // we need to check in $_SERVER directly if (!isset($_SERVER[$pathEnv]) && isset($_SERVER['Path'])) { $pathEnv = 'Path'; } // add the bin dir to the PATH to make local binaries of deps usable in scripts $binDir = $this->composer->getConfig()->get('bin-dir'); if (\is_dir($binDir)) { $binDir = \realpath($binDir); $pathValue = (string) Platform::getEnv($pathEnv); if (!Preg::isMatch('{(^|' . \PATH_SEPARATOR . ')' . \preg_quote($binDir) . '($|' . \PATH_SEPARATOR . ')}', $pathValue)) { Platform::putEnv($pathEnv, $binDir . \PATH_SEPARATOR . $pathValue); } } } /** * @param callable $cb DO NOT MOVE TO TYPE HINT as private autoload callbacks are not technically callable */ private function getCallbackIdentifier($cb) : string { if (\is_string($cb)) { return 'fn:' . $cb; } if (\is_object($cb)) { return 'obj:' . \spl_object_hash($cb); } if (\is_array($cb)) { return 'array:' . (\is_string($cb[0]) ? $cb[0] : \get_class($cb[0]) . '#' . \spl_object_hash($cb[0])) . '::' . $cb[1]; } // not great but also do not want to break everything here return 'unsupported'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; /** * An EventSubscriber knows which events it is interested in. * * If an EventSubscriber is added to an EventDispatcher, the manager invokes * {@link getSubscribedEvents} and registers the subscriber as a listener for all * returned events. * * @author Guilherme Blanco * @author Jonathan Wage * @author Roman Borschel * @author Bernhard Schussek */ interface EventSubscriberInterface { /** * Returns an array of event names this subscriber wants to listen to. * * The array keys are event names and the value can be: * * * The method name to call (priority defaults to 0) * * An array composed of the method name to call and the priority * * An array of arrays composed of the method names to call and respective * priorities, or 0 if unset * * For instance: * * * array('eventName' => 'methodName') * * array('eventName' => array('methodName', $priority)) * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) * * @return array> The event names to listen to */ public static function getSubscribedEvents(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Package\RootPackageInterface; use Composer\Util\Loop; use Composer\Repository\RepositoryManager; use Composer\Installer\InstallationManager; use Composer\EventDispatcher\EventDispatcher; /** * @author Jordi Boggiano */ class PartialComposer { /** * @var bool */ private $global = \false; /** * @var RootPackageInterface */ private $package; /** * @var Loop */ private $loop; /** * @var Repository\RepositoryManager */ private $repositoryManager; /** * @var Installer\InstallationManager */ private $installationManager; /** * @var Config */ private $config; /** * @var EventDispatcher */ private $eventDispatcher; public function setPackage(RootPackageInterface $package) : void { $this->package = $package; } public function getPackage() : RootPackageInterface { return $this->package; } public function setConfig(\Composer\Config $config) : void { $this->config = $config; } public function getConfig() : \Composer\Config { return $this->config; } public function setLoop(Loop $loop) : void { $this->loop = $loop; } public function getLoop() : Loop { return $this->loop; } public function setRepositoryManager(RepositoryManager $manager) : void { $this->repositoryManager = $manager; } public function getRepositoryManager() : RepositoryManager { return $this->repositoryManager; } public function setInstallationManager(InstallationManager $manager) : void { $this->installationManager = $manager; } public function getInstallationManager() : InstallationManager { return $this->installationManager; } public function setEventDispatcher(EventDispatcher $eventDispatcher) : void { $this->eventDispatcher = $eventDispatcher; } public function getEventDispatcher() : EventDispatcher { return $this->eventDispatcher; } public function isGlobal() : bool { return $this->global; } public function setGlobal() : void { $this->global = \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Platform; class Runtime { /** * @param class-string $class */ public function hasConstant(string $constant, ?string $class = null) : bool { return \defined(\ltrim($class . '::' . $constant, ':')); } /** * @param class-string $class * * @return mixed */ public function getConstant(string $constant, ?string $class = null) { return \constant(\ltrim($class . '::' . $constant, ':')); } public function hasFunction(string $fn) : bool { return \function_exists($fn); } /** * @param mixed[] $arguments * * @return mixed */ public function invoke(callable $callable, array $arguments = []) { return $callable(...$arguments); } /** * @param class-string $class */ public function hasClass(string $class) : bool { return \class_exists($class, \false); } /** * @template T of object * @param mixed[] $arguments * * @phpstan-param class-string $class * @phpstan-return T * * @throws \ReflectionException */ public function construct(string $class, array $arguments = []) : object { if (empty($arguments)) { return new $class(); } $refl = new \ReflectionClass($class); return $refl->newInstanceArgs($arguments); } /** @return string[] */ public function getExtensions() : array { return \get_loaded_extensions(); } public function getExtensionVersion(string $extension) : string { $version = \phpversion($extension); if ($version === \false) { $version = '0'; } return $version; } /** * @throws \ReflectionException */ public function getExtensionInfo(string $extension) : string { $reflector = new \ReflectionExtension($extension); \ob_start(); $reflector->info(); return \ob_get_clean(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Platform; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; class HhvmDetector { /** @var string|false|null */ private static $hhvmVersion = null; /** @var ?ExecutableFinder */ private $executableFinder; /** @var ?ProcessExecutor */ private $processExecutor; public function __construct(?ExecutableFinder $executableFinder = null, ?ProcessExecutor $processExecutor = null) { $this->executableFinder = $executableFinder; $this->processExecutor = $processExecutor; } public function reset() : void { self::$hhvmVersion = null; } public function getVersion() : ?string { if (null !== self::$hhvmVersion) { return self::$hhvmVersion ?: null; } self::$hhvmVersion = \defined('_ContaoManager\\HHVM_VERSION') ? HHVM_VERSION : null; if (self::$hhvmVersion === null && !Platform::isWindows()) { self::$hhvmVersion = \false; $this->executableFinder = $this->executableFinder ?: new ExecutableFinder(); $hhvmPath = $this->executableFinder->find('hhvm'); if ($hhvmPath !== null) { $this->processExecutor = $this->processExecutor ?? new ProcessExecutor(); $exitCode = $this->processExecutor->execute([$hhvmPath, '--php', '-d', 'hhvm.jit=0', '-r', 'echo HHVM_VERSION;'], self::$hhvmVersion); if ($exitCode !== 0) { self::$hhvmVersion = \false; } } } return self::$hhvmVersion ?: null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Platform; use Composer\Pcre\Preg; /** * @author Lars Strojny */ class Version { /** * @param bool $isFips Set by the method * * @param-out bool $isFips */ public static function parseOpenssl(string $opensslVersion, ?bool &$isFips) : ?string { $isFips = \false; if (!Preg::isMatchStrictGroups('/^(?[0-9.]+)(?[a-z]{0,2})(?(?:-?(?:dev|pre|alpha|beta|rc|fips)[\\d]*)*)(?:-\\w+)?(?: \\(.+?\\))?$/', $opensslVersion, $matches)) { return null; } // OpenSSL 1 used 1.2.3a style versioning, 3+ uses semver $patch = ''; if (\version_compare($matches['version'], '3.0.0', '<')) { $patch = '.' . self::convertAlphaVersionToIntVersion($matches['patch']); } $isFips = \strpos($matches['suffix'], 'fips') !== \false; $suffix = \strtr('-' . \ltrim($matches['suffix'], '-'), ['-fips' => '', '-pre' => '-alpha']); return \rtrim($matches['version'] . $patch . $suffix, '-'); } public static function parseLibjpeg(string $libjpegVersion) : ?string { if (!Preg::isMatchStrictGroups('/^(?\\d+)(?[a-z]*)$/', $libjpegVersion, $matches)) { return null; } return $matches['major'] . '.' . self::convertAlphaVersionToIntVersion($matches['minor']); } public static function parseZoneinfoVersion(string $zoneinfoVersion) : ?string { if (!Preg::isMatchStrictGroups('/^(?\\d{4})(?[a-z]*)$/', $zoneinfoVersion, $matches)) { return null; } return $matches['year'] . '.' . self::convertAlphaVersionToIntVersion($matches['revision']); } /** * "" => 0, "a" => 1, "zg" => 33 */ private static function convertAlphaVersionToIntVersion(string $alpha) : int { return \strlen($alpha) * (-\ord('a') + 1) + \array_sum(\array_map('ord', \str_split($alpha))); } public static function convertLibxpmVersionId(int $versionId) : string { return self::convertVersionId($versionId, 100); } public static function convertOpenldapVersionId(int $versionId) : string { return self::convertVersionId($versionId, 100); } private static function convertVersionId(int $versionId, int $base) : string { return \sprintf('%d.%d.%d', $versionId / ($base * $base), (int) ($versionId / $base) % $base, $versionId % $base); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Console\Helper\QuestionHelper; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Console\Output\StreamOutput; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatterInterface; use _ContaoManager\Symfony\Component\Console\Input\StreamableInputInterface; use _ContaoManager\Symfony\Component\Console\Input\StringInput; use _ContaoManager\Symfony\Component\Console\Helper\HelperSet; /** * @author Jordi Boggiano */ class BufferIO extends \Composer\IO\ConsoleIO { public function __construct(string $input = '', int $verbosity = StreamOutput::VERBOSITY_NORMAL, ?OutputFormatterInterface $formatter = null) { $input = new StringInput($input); $input->setInteractive(\false); $stream = \fopen('php://memory', 'rw'); if ($stream === \false) { throw new \RuntimeException('Unable to open memory output stream'); } $output = new StreamOutput($stream, $verbosity, $formatter !== null ? $formatter->isDecorated() : \false, $formatter); parent::__construct($input, $output, new HelperSet([new QuestionHelper()])); } /** * @return string output */ public function getOutput() : string { \assert($this->output instanceof StreamOutput); \fseek($this->output->getStream(), 0); $output = (string) \stream_get_contents($this->output->getStream()); $output = Preg::replaceCallback("{(?<=^|\n|\x08)(.+?)(\x08+)}", static function ($matches) : string { $pre = \strip_tags($matches[1]); if (\strlen($pre) === \strlen($matches[2])) { return ''; } // TODO reverse parse the string, skipping span tags and \033\[([0-9;]+)m(.*?)\033\[0m style blobs return \rtrim($matches[1]) . "\n"; }, $output); return $output; } /** * @param string[] $inputs * * @see createStream */ public function setUserInputs(array $inputs) : void { if (!$this->input instanceof StreamableInputInterface) { throw new \RuntimeException('Setting the user inputs requires at least the version 3.2 of the symfony/console component.'); } $this->input->setStream($this->createStream($inputs)); $this->input->setInteractive(\true); } /** * @param string[] $inputs * * @return resource stream */ private function createStream(array $inputs) { $stream = \fopen('php://memory', 'r+'); if ($stream === \false) { throw new \RuntimeException('Unable to open memory output stream'); } foreach ($inputs as $input) { \fwrite($stream, $input . \PHP_EOL); } \rewind($stream); return $stream; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Question\StrictConfirmationQuestion; use _ContaoManager\Symfony\Component\Console\Helper\HelperSet; use _ContaoManager\Symfony\Component\Console\Helper\ProgressBar; use _ContaoManager\Symfony\Component\Console\Helper\Table; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\ConsoleOutputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Console\Question\ChoiceQuestion; use _ContaoManager\Symfony\Component\Console\Question\Question; /** * The Input/Output helper. * * @author François Pluchino * @author Jordi Boggiano */ class ConsoleIO extends \Composer\IO\BaseIO { /** @var InputInterface */ protected $input; /** @var OutputInterface */ protected $output; /** @var HelperSet */ protected $helperSet; /** @var string */ protected $lastMessage = ''; /** @var string */ protected $lastMessageErr = ''; /** @var float */ private $startTime; /** @var array */ private $verbosityMap; /** * Constructor. * * @param InputInterface $input The input instance * @param OutputInterface $output The output instance * @param HelperSet $helperSet The helperSet instance */ public function __construct(InputInterface $input, OutputInterface $output, HelperSet $helperSet) { $this->input = $input; $this->output = $output; $this->helperSet = $helperSet; $this->verbosityMap = [self::QUIET => OutputInterface::VERBOSITY_QUIET, self::NORMAL => OutputInterface::VERBOSITY_NORMAL, self::VERBOSE => OutputInterface::VERBOSITY_VERBOSE, self::VERY_VERBOSE => OutputInterface::VERBOSITY_VERY_VERBOSE, self::DEBUG => OutputInterface::VERBOSITY_DEBUG]; } /** * @return void */ public function enableDebugging(float $startTime) { $this->startTime = $startTime; } /** * @inheritDoc */ public function isInteractive() { return $this->input->isInteractive(); } /** * @inheritDoc */ public function isDecorated() { return $this->output->isDecorated(); } /** * @inheritDoc */ public function isVerbose() { return $this->output->isVerbose(); } /** * @inheritDoc */ public function isVeryVerbose() { return $this->output->isVeryVerbose(); } /** * @inheritDoc */ public function isDebug() { return $this->output->isDebug(); } /** * @inheritDoc */ public function write($messages, bool $newline = \true, int $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, \false, $verbosity); } /** * @inheritDoc */ public function writeError($messages, bool $newline = \true, int $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, \true, $verbosity); } /** * @inheritDoc */ public function writeRaw($messages, bool $newline = \true, int $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, \false, $verbosity, \true); } /** * @inheritDoc */ public function writeErrorRaw($messages, bool $newline = \true, int $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, \true, $verbosity, \true); } /** * @param string[]|string $messages */ private function doWrite($messages, bool $newline, bool $stderr, int $verbosity, bool $raw = \false) : void { $sfVerbosity = $this->verbosityMap[$verbosity]; if ($sfVerbosity > $this->output->getVerbosity()) { return; } if ($raw) { $sfVerbosity |= OutputInterface::OUTPUT_RAW; } if (null !== $this->startTime) { $memoryUsage = \memory_get_usage() / 1024 / 1024; $timeSpent = \microtime(\true) - $this->startTime; $messages = \array_map(static function ($message) use($memoryUsage, $timeSpent) : string { return \sprintf('[%.1fMiB/%.2fs] %s', $memoryUsage, $timeSpent, $message); }, (array) $messages); } if (\true === $stderr && $this->output instanceof ConsoleOutputInterface) { $this->output->getErrorOutput()->write($messages, $newline, $sfVerbosity); $this->lastMessageErr = \implode($newline ? "\n" : '', (array) $messages); return; } $this->output->write($messages, $newline, $sfVerbosity); $this->lastMessage = \implode($newline ? "\n" : '', (array) $messages); } /** * @inheritDoc */ public function overwrite($messages, bool $newline = \true, ?int $size = null, int $verbosity = self::NORMAL) { $this->doOverwrite($messages, $newline, $size, \false, $verbosity); } /** * @inheritDoc */ public function overwriteError($messages, bool $newline = \true, ?int $size = null, int $verbosity = self::NORMAL) { $this->doOverwrite($messages, $newline, $size, \true, $verbosity); } /** * @param string[]|string $messages */ private function doOverwrite($messages, bool $newline, ?int $size, bool $stderr, int $verbosity) : void { // messages can be an array, let's convert it to string anyway $messages = \implode($newline ? "\n" : '', (array) $messages); // since overwrite is supposed to overwrite last message... if (!isset($size)) { // removing possible formatting of lastMessage with strip_tags $size = \strlen(\strip_tags($stderr ? $this->lastMessageErr : $this->lastMessage)); } // ...let's fill its length with backspaces $this->doWrite(\str_repeat("\x08", $size), \false, $stderr, $verbosity); // write the new message $this->doWrite($messages, \false, $stderr, $verbosity); // In cmd.exe on Win8.1 (possibly 10?), the line can not be cleared, so we need to // track the length of previous output and fill it with spaces to make sure the line is cleared. // See https://github.com/composer/composer/pull/5836 for more details $fill = $size - \strlen(\strip_tags($messages)); if ($fill > 0) { // whitespace whatever has left $this->doWrite(\str_repeat(' ', $fill), \false, $stderr, $verbosity); // move the cursor back $this->doWrite(\str_repeat("\x08", $fill), \false, $stderr, $verbosity); } if ($newline) { $this->doWrite('', \true, $stderr, $verbosity); } if ($stderr) { $this->lastMessageErr = $messages; } else { $this->lastMessage = $messages; } } /** * @return ProgressBar */ public function getProgressBar(int $max = 0) { return new ProgressBar($this->getErrorOutput(), $max); } /** * @inheritDoc */ public function ask($question, $default = null) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new Question($question, $default); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * @inheritDoc */ public function askConfirmation($question, $default = \true) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new StrictConfirmationQuestion($question, $default); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * @inheritDoc */ public function askAndValidate($question, $validator, $attempts = null, $default = null) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new Question($question, $default); $question->setValidator($validator); $question->setMaxAttempts($attempts); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * @inheritDoc */ public function askAndHideAnswer($question) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new Question($question); $question->setHidden(\true); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * @inheritDoc */ public function select($question, $choices, $default, $attempts = \false, $errorMessage = 'Value "%s" is invalid', $multiselect = \false) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new ChoiceQuestion($question, $choices, $default); $question->setMaxAttempts($attempts ?: null); // IOInterface requires false, and Question requires null or int $question->setErrorMessage($errorMessage); $question->setMultiselect($multiselect); $result = $helper->ask($this->input, $this->getErrorOutput(), $question); $isAssoc = (bool) \count(\array_filter(\array_keys($choices), 'is_string')); if ($isAssoc) { return $result; } if (!\is_array($result)) { return (string) \array_search($result, $choices, \true); } $results = []; foreach ($choices as $index => $choice) { if (\in_array($choice, $result, \true)) { $results[] = (string) $index; } } return $results; } public function getTable() : Table { return new Table($this->output); } private function getErrorOutput() : OutputInterface { if ($this->output instanceof ConsoleOutputInterface) { return $this->output->getErrorOutput(); } return $this->output; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Config; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use Composer\Util\Silencer; use _ContaoManager\Psr\Log\LogLevel; abstract class BaseIO implements \Composer\IO\IOInterface { /** @var array */ protected $authentications = []; /** * @inheritDoc */ public function getAuthentications() { return $this->authentications; } /** * @return void */ public function resetAuthentications() { $this->authentications = []; } /** * @inheritDoc */ public function hasAuthentication($repositoryName) { return isset($this->authentications[$repositoryName]); } /** * @inheritDoc */ public function getAuthentication($repositoryName) { if (isset($this->authentications[$repositoryName])) { return $this->authentications[$repositoryName]; } return ['username' => null, 'password' => null]; } /** * @inheritDoc */ public function setAuthentication($repositoryName, $username, $password = null) { $this->authentications[$repositoryName] = ['username' => $username, 'password' => $password]; } /** * @inheritDoc */ public function writeRaw($messages, bool $newline = \true, int $verbosity = self::NORMAL) { $this->write($messages, $newline, $verbosity); } /** * @inheritDoc */ public function writeErrorRaw($messages, bool $newline = \true, int $verbosity = self::NORMAL) { $this->writeError($messages, $newline, $verbosity); } /** * Check for overwrite and set the authentication information for the repository. * * @param string $repositoryName The unique name of repository * @param string $username The username * @param string $password The password * * @return void */ protected function checkAndSetAuthentication(string $repositoryName, string $username, ?string $password = null) { if ($this->hasAuthentication($repositoryName)) { $auth = $this->getAuthentication($repositoryName); if ($auth['username'] === $username && $auth['password'] === $password) { return; } $this->writeError(\sprintf("Warning: You should avoid overwriting already defined auth settings for %s.", $repositoryName)); } $this->setAuthentication($repositoryName, $username, $password); } /** * @inheritDoc */ public function loadConfiguration(Config $config) { $bitbucketOauth = $config->get('bitbucket-oauth'); $githubOauth = $config->get('github-oauth'); $gitlabOauth = $config->get('gitlab-oauth'); $gitlabToken = $config->get('gitlab-token'); $httpBasic = $config->get('http-basic'); $bearerToken = $config->get('bearer'); // reload oauth tokens from config if available foreach ($bitbucketOauth as $domain => $cred) { $this->checkAndSetAuthentication($domain, $cred['consumer-key'], $cred['consumer-secret']); } foreach ($githubOauth as $domain => $token) { if ($domain !== 'github.com' && !\in_array($domain, $config->get('github-domains'), \true)) { $this->debug($domain . ' is not in the configured github-domains, adding it implicitly as authentication is configured for this domain'); $config->merge(['config' => ['github-domains' => \array_merge($config->get('github-domains'), [$domain])]], 'implicit-due-to-auth'); } // allowed chars for GH tokens are from https://github.blog/changelog/2021-03-04-authentication-token-format-updates/ // plus dots which were at some point used for GH app integration tokens if (!Preg::isMatch('{^[.A-Za-z0-9_]+$}', $token)) { throw new \UnexpectedValueException('Your github oauth token for ' . $domain . ' contains invalid characters: "' . $token . '"'); } $this->checkAndSetAuthentication($domain, $token, 'x-oauth-basic'); } foreach ($gitlabOauth as $domain => $token) { if ($domain !== 'gitlab.com' && !\in_array($domain, $config->get('gitlab-domains'), \true)) { $this->debug($domain . ' is not in the configured gitlab-domains, adding it implicitly as authentication is configured for this domain'); $config->merge(['config' => ['gitlab-domains' => \array_merge($config->get('gitlab-domains'), [$domain])]], 'implicit-due-to-auth'); } $token = \is_array($token) ? $token["token"] : $token; $this->checkAndSetAuthentication($domain, $token, 'oauth2'); } foreach ($gitlabToken as $domain => $token) { if ($domain !== 'gitlab.com' && !\in_array($domain, $config->get('gitlab-domains'), \true)) { $this->debug($domain . ' is not in the configured gitlab-domains, adding it implicitly as authentication is configured for this domain'); $config->merge(['config' => ['gitlab-domains' => \array_merge($config->get('gitlab-domains'), [$domain])]], 'implicit-due-to-auth'); } $username = \is_array($token) ? $token["username"] : $token; $password = \is_array($token) ? $token["token"] : 'private-token'; $this->checkAndSetAuthentication($domain, $username, $password); } // reload http basic credentials from config if available foreach ($httpBasic as $domain => $cred) { $this->checkAndSetAuthentication($domain, $cred['username'], $cred['password']); } foreach ($bearerToken as $domain => $token) { $this->checkAndSetAuthentication($domain, $token, 'bearer'); } // setup process timeout ProcessExecutor::setTimeout($config->get('process-timeout')); } /** * @param string|\Stringable $message */ public function emergency($message, array $context = []) : void { $this->log(LogLevel::EMERGENCY, $message, $context); } /** * @param string|\Stringable $message */ public function alert($message, array $context = []) : void { $this->log(LogLevel::ALERT, $message, $context); } /** * @param string|\Stringable $message */ public function critical($message, array $context = []) : void { $this->log(LogLevel::CRITICAL, $message, $context); } /** * @param string|\Stringable $message */ public function error($message, array $context = []) : void { $this->log(LogLevel::ERROR, $message, $context); } /** * @param string|\Stringable $message */ public function warning($message, array $context = []) : void { $this->log(LogLevel::WARNING, $message, $context); } /** * @param string|\Stringable $message */ public function notice($message, array $context = []) : void { $this->log(LogLevel::NOTICE, $message, $context); } /** * @param string|\Stringable $message */ public function info($message, array $context = []) : void { $this->log(LogLevel::INFO, $message, $context); } /** * @param string|\Stringable $message */ public function debug($message, array $context = []) : void { $this->log(LogLevel::DEBUG, $message, $context); } /** * @param mixed|LogLevel::* $level * @param string|\Stringable $message */ public function log($level, $message, array $context = []) : void { $message = (string) $message; if ($context !== []) { $json = Silencer::call('json_encode', $context, \JSON_INVALID_UTF8_IGNORE | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE); if ($json !== \false) { $message .= ' ' . $json; } } if (\in_array($level, [LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR])) { $this->writeError('' . $message . ''); } elseif ($level === LogLevel::WARNING) { $this->writeError('' . $message . ''); } elseif ($level === LogLevel::NOTICE) { $this->writeError('' . $message . '', \true, self::VERBOSE); } elseif ($level === LogLevel::INFO) { $this->writeError('' . $message . '', \true, self::VERY_VERBOSE); } else { $this->writeError($message, \true, self::DEBUG); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; /** * IOInterface that is not interactive and never writes the output * * @author Christophe Coevoet */ class NullIO extends \Composer\IO\BaseIO { /** * @inheritDoc */ public function isInteractive() : bool { return \false; } /** * @inheritDoc */ public function isVerbose() : bool { return \false; } /** * @inheritDoc */ public function isVeryVerbose() : bool { return \false; } /** * @inheritDoc */ public function isDebug() : bool { return \false; } /** * @inheritDoc */ public function isDecorated() : bool { return \false; } /** * @inheritDoc */ public function write($messages, bool $newline = \true, int $verbosity = self::NORMAL) : void { } /** * @inheritDoc */ public function writeError($messages, bool $newline = \true, int $verbosity = self::NORMAL) : void { } /** * @inheritDoc */ public function overwrite($messages, bool $newline = \true, ?int $size = null, int $verbosity = self::NORMAL) : void { } /** * @inheritDoc */ public function overwriteError($messages, bool $newline = \true, ?int $size = null, int $verbosity = self::NORMAL) : void { } /** * @inheritDoc */ public function ask($question, $default = null) { return $default; } /** * @inheritDoc */ public function askConfirmation($question, $default = \true) : bool { return $default; } /** * @inheritDoc */ public function askAndValidate($question, $validator, $attempts = null, $default = null) { return $default; } /** * @inheritDoc */ public function askAndHideAnswer($question) : ?string { return null; } /** * @inheritDoc */ public function select($question, $choices, $default, $attempts = \false, $errorMessage = 'Value "%s" is invalid', $multiselect = \false) { return $default; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Config; use _ContaoManager\Psr\Log\LoggerInterface; /** * The Input/Output helper interface. * * @author François Pluchino */ interface IOInterface extends LoggerInterface { public const QUIET = 1; public const NORMAL = 2; public const VERBOSE = 4; public const VERY_VERBOSE = 8; public const DEBUG = 16; /** * Is this input means interactive? * * @return bool */ public function isInteractive(); /** * Is this output verbose? * * @return bool */ public function isVerbose(); /** * Is the output very verbose? * * @return bool */ public function isVeryVerbose(); /** * Is the output in debug verbosity? * * @return bool */ public function isDebug(); /** * Is this output decorated? * * @return bool */ public function isDecorated(); /** * Writes a message to the output. * * @param string|string[] $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $verbosity Verbosity level from the VERBOSITY_* constants * * @return void */ public function write($messages, bool $newline = \true, int $verbosity = self::NORMAL); /** * Writes a message to the error output. * * @param string|string[] $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $verbosity Verbosity level from the VERBOSITY_* constants * * @return void */ public function writeError($messages, bool $newline = \true, int $verbosity = self::NORMAL); /** * Writes a message to the output, without formatting it. * * @param string|string[] $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $verbosity Verbosity level from the VERBOSITY_* constants * * @return void */ public function writeRaw($messages, bool $newline = \true, int $verbosity = self::NORMAL); /** * Writes a message to the error output, without formatting it. * * @param string|string[] $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $verbosity Verbosity level from the VERBOSITY_* constants * * @return void */ public function writeErrorRaw($messages, bool $newline = \true, int $verbosity = self::NORMAL); /** * Overwrites a previous message to the output. * * @param string|string[] $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $size The size of line * @param int $verbosity Verbosity level from the VERBOSITY_* constants * * @return void */ public function overwrite($messages, bool $newline = \true, ?int $size = null, int $verbosity = self::NORMAL); /** * Overwrites a previous message to the error output. * * @param string|string[] $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $size The size of line * @param int $verbosity Verbosity level from the VERBOSITY_* constants * * @return void */ public function overwriteError($messages, bool $newline = \true, ?int $size = null, int $verbosity = self::NORMAL); /** * Asks a question to the user. * * @param string $question The question to ask * @param string|bool|int|float|null $default The default answer if none is given by the user * * @throws \RuntimeException If there is no data to read in the input stream * @return mixed The user answer */ public function ask(string $question, $default = null); /** * Asks a confirmation to the user. * * The question will be asked until the user answers by nothing, yes, or no. * * @param string $question The question to ask * @param bool $default The default answer if the user enters nothing * * @return bool true if the user has confirmed, false otherwise */ public function askConfirmation(string $question, bool $default = \true); /** * Asks for a value and validates the response. * * The validator receives the data to validate. It must return the * validated data when the data is valid and throw an exception * otherwise. * * @param string $question The question to ask * @param callable $validator A PHP callback * @param null|int $attempts Max number of times to ask before giving up (default of null means infinite) * @param mixed $default The default answer if none is given by the user * * @throws \Exception When any of the validators return an error * @return mixed */ public function askAndValidate(string $question, callable $validator, ?int $attempts = null, $default = null); /** * Asks a question to the user and hide the answer. * * @param string $question The question to ask * * @return string|null The answer */ public function askAndHideAnswer(string $question); /** * Asks the user to select a value. * * @param string $question The question to ask * @param string[] $choices List of choices to pick from * @param bool|string $default The default answer if the user enters nothing * @param bool|int $attempts Max number of times to ask before giving up (false by default, which means infinite) * @param string $errorMessage Message which will be shown if invalid value from choice list would be picked * @param bool $multiselect Select more than one value separated by comma * * @throws \InvalidArgumentException * * @return int|string|list|bool The selected value or values (the key of the choices array) * @phpstan-return ($multiselect is true ? list : string|int|bool) */ public function select(string $question, array $choices, $default, $attempts = \false, string $errorMessage = 'Value "%s" is invalid', bool $multiselect = \false); /** * Get all authentication information entered. * * @return array The map of authentication data */ public function getAuthentications(); /** * Verify if the repository has a authentication information. * * @param string $repositoryName The unique name of repository * * @return bool */ public function hasAuthentication(string $repositoryName); /** * Get the username and password of repository. * * @param string $repositoryName The unique name of repository * * @return array{username: string|null, password: string|null} */ public function getAuthentication(string $repositoryName); /** * Set the authentication information for the repository. * * @param string $repositoryName The unique name of repository * @param string $username The username * @param null|string $password The password * * @return void */ public function setAuthentication(string $repositoryName, string $username, ?string $password = null); /** * Loads authentications from a config instance * * @return void */ public function loadConfiguration(Config $config); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; /** * The Plugin Events. * * @author Nils Adermann */ class PluginEvents { /** * The INIT event occurs after a Composer instance is done being initialized * * The event listener method receives a * Composer\EventDispatcher\Event instance. * * @var string */ public const INIT = 'init'; /** * The COMMAND event occurs as a command begins * * The event listener method receives a * Composer\Plugin\CommandEvent instance. * * @var string */ public const COMMAND = 'command'; /** * The PRE_FILE_DOWNLOAD event occurs before downloading a file * * The event listener method receives a * Composer\Plugin\PreFileDownloadEvent instance. * * @var string */ public const PRE_FILE_DOWNLOAD = 'pre-file-download'; /** * The POST_FILE_DOWNLOAD event occurs after downloading a package dist file * * The event listener method receives a * Composer\Plugin\PostFileDownloadEvent instance. * * @var string */ public const POST_FILE_DOWNLOAD = 'post-file-download'; /** * The PRE_COMMAND_RUN event occurs before a command is executed and lets you modify the input arguments/options * * The event listener method receives a * Composer\Plugin\PreCommandRunEvent instance. * * @var string */ public const PRE_COMMAND_RUN = 'pre-command-run'; /** * The PRE_POOL_CREATE event occurs before the Pool of packages is created, and lets * you filter the list of packages which is going to enter the Solver * * The event listener method receives a * Composer\Plugin\PrePoolCreateEvent instance. * * @var string */ public const PRE_POOL_CREATE = 'pre-pool-create'; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; /** * The pre command run event. * * @author Jordi Boggiano */ class PreCommandRunEvent extends Event { /** * @var InputInterface */ private $input; /** * @var string */ private $command; /** * Constructor. * * @param string $name The event name * @param string $command The command about to be executed */ public function __construct(string $name, InputInterface $input, string $command) { parent::__construct($name); $this->input = $input; $this->command = $command; } /** * Returns the console input */ public function getInput() : InputInterface { return $this->input; } /** * Returns the command about to be executed */ public function getCommand() : string { return $this->command; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin\Capability; /** * Commands Provider Interface * * This capability will receive an array with 'composer' and 'io' keys as * constructor argument. Those contain Composer\Composer and Composer\IO\IOInterface * instances. It also contains a 'plugin' key containing the plugin instance that * created the capability. * * @author Jérémy Derussé */ interface CommandProvider extends \Composer\Plugin\Capability\Capability { /** * Retrieves an array of commands * * @return \Composer\Command\BaseCommand[] */ public function getCommands(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin\Capability; /** * Marker interface for Plugin capabilities. * Every new Capability which is added to the Plugin API must implement this interface. * * @api */ interface Capability { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use UnexpectedValueException; class PluginBlockedException extends UnexpectedValueException { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * An event for all commands. * * @author Nils Adermann */ class CommandEvent extends Event { /** * @var string */ private $commandName; /** * @var InputInterface */ private $input; /** * @var OutputInterface */ private $output; /** * Constructor. * * @param string $name The event name * @param string $commandName The command name * @param mixed[] $args Arguments passed by the user * @param mixed[] $flags Optional flags to pass data not as argument */ public function __construct(string $name, string $commandName, InputInterface $input, OutputInterface $output, array $args = [], array $flags = []) { parent::__construct($name, $args, $flags); $this->commandName = $commandName; $this->input = $input; $this->output = $output; } /** * Returns the command input interface */ public function getInput() : InputInterface { return $this->input; } /** * Retrieves the command output interface */ public function getOutput() : OutputInterface { return $this->output; } /** * Retrieves the name of the command being run */ public function getCommandName() : string { return $this->commandName; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\Composer; use Composer\IO\IOInterface; /** * Plugin interface * * @author Nils Adermann */ interface PluginInterface { /** * Version number of the internal composer-plugin-api package * * This is used to denote the API version of Plugin specific * features, but is also bumped to a new major if Composer * includes a major break in internal APIs which are susceptible * to be used by plugins. * * @var string */ public const PLUGIN_API_VERSION = '2.6.0'; /** * Apply plugin modifications to Composer * * @return void */ public function activate(Composer $composer, IOInterface $io); /** * Remove any hooks from Composer * * This will be called when a plugin is deactivated before being * uninstalled, but also before it gets upgraded to a new version * so the old one can be deactivated and the new one activated. * * @return void */ public function deactivate(Composer $composer, IOInterface $io); /** * Prepare the plugin to be uninstalled * * This will be called after deactivate. * * @return void */ public function uninstall(Composer $composer, IOInterface $io); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\Installer\InstallerInterface; use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\Package\CompletePackage; use Composer\Package\Locker; use Composer\Package\Package; use Composer\Package\RootPackageInterface; use Composer\Package\Version\VersionParser; use Composer\PartialComposer; use Composer\Pcre\Preg; use Composer\Repository\RepositoryInterface; use Composer\Repository\InstalledRepository; use Composer\Repository\RepositoryUtils; use Composer\Repository\RootPackageRepository; use Composer\Package\PackageInterface; use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; use Composer\Plugin\Capability\Capability; use Composer\Util\PackageSorter; /** * Plugin manager * * @author Nils Adermann * @author Jordi Boggiano */ class PluginManager { /** @var Composer */ protected $composer; /** @var IOInterface */ protected $io; /** @var PartialComposer|null */ protected $globalComposer; /** @var VersionParser */ protected $versionParser; /** @var bool|'local'|'global' */ protected $disablePlugins = \false; /** @var array */ protected $plugins = []; /** @var array> */ protected $registeredPlugins = []; /** * @var array|null */ private $allowPluginRules; /** * @var array|null */ private $allowGlobalPluginRules; /** @var bool */ private $runningInGlobalDir = \false; /** @var int */ private static $classCounter = 0; /** * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins */ public function __construct(IOInterface $io, Composer $composer, ?PartialComposer $globalComposer = null, $disablePlugins = \false) { $this->io = $io; $this->composer = $composer; $this->globalComposer = $globalComposer; $this->versionParser = new VersionParser(); $this->disablePlugins = $disablePlugins; $this->allowPluginRules = $this->parseAllowedPlugins($composer->getConfig()->get('allow-plugins'), $composer->getLocker()); $this->allowGlobalPluginRules = $this->parseAllowedPlugins($globalComposer !== null ? $globalComposer->getConfig()->get('allow-plugins') : \false); } public function setRunningInGlobalDir(bool $runningInGlobalDir) : void { $this->runningInGlobalDir = $runningInGlobalDir; } /** * Loads all plugins from currently installed plugin packages */ public function loadInstalledPlugins() : void { if (!$this->arePluginsDisabled('local')) { $repo = $this->composer->getRepositoryManager()->getLocalRepository(); $this->loadRepository($repo, \false, $this->composer->getPackage()); } if ($this->globalComposer !== null && !$this->arePluginsDisabled('global')) { $this->loadRepository($this->globalComposer->getRepositoryManager()->getLocalRepository(), \true); } } /** * Deactivate all plugins from currently installed plugin packages */ public function deactivateInstalledPlugins() : void { if (!$this->arePluginsDisabled('local')) { $repo = $this->composer->getRepositoryManager()->getLocalRepository(); $this->deactivateRepository($repo, \false); } if ($this->globalComposer !== null && !$this->arePluginsDisabled('global')) { $this->deactivateRepository($this->globalComposer->getRepositoryManager()->getLocalRepository(), \true); } } /** * Gets all currently active plugin instances * * @return array plugins */ public function getPlugins() : array { return $this->plugins; } /** * Gets global composer or null when main composer is not fully loaded */ public function getGlobalComposer() : ?PartialComposer { return $this->globalComposer; } /** * Register a plugin package, activate it etc. * * If it's of type composer-installer it is registered as an installer * instead for BC * * @param bool $failOnMissingClasses By default this silently skips plugins that can not be found, but if set to true it fails with an exception * @param bool $isGlobalPlugin Set to true to denote plugins which are installed in the global Composer directory * * @throws \UnexpectedValueException */ public function registerPackage(PackageInterface $package, bool $failOnMissingClasses = \false, bool $isGlobalPlugin = \false) : void { if ($this->arePluginsDisabled($isGlobalPlugin ? 'global' : 'local')) { $this->io->writeError('The "' . $package->getName() . '" plugin was not loaded as plugins are disabled.'); return; } if ($package->getType() === 'composer-plugin') { $requiresComposer = null; foreach ($package->getRequires() as $link) { /** @var Link $link */ if ('composer-plugin-api' === $link->getTarget()) { $requiresComposer = $link->getConstraint(); break; } } if (!$requiresComposer) { throw new \RuntimeException("Plugin " . $package->getName() . " is missing a require statement for a version of the composer-plugin-api package."); } $currentPluginApiVersion = $this->getPluginApiVersion(); $currentPluginApiConstraint = new Constraint('==', $this->versionParser->normalize($currentPluginApiVersion)); if ($requiresComposer->getPrettyString() === $this->getPluginApiVersion()) { $this->io->writeError('The "' . $package->getName() . '" plugin requires composer-plugin-api ' . $this->getPluginApiVersion() . ', this *WILL* break in the future and it should be fixed ASAP (require ^' . $this->getPluginApiVersion() . ' instead for example).'); } elseif (!$requiresComposer->matches($currentPluginApiConstraint)) { $this->io->writeError('The "' . $package->getName() . '" plugin ' . ($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '') . 'was skipped because it requires a Plugin API version ("' . $requiresComposer->getPrettyString() . '") that does not match your Composer installation ("' . $currentPluginApiVersion . '"). You may need to run composer update with the "--no-plugins" option.'); return; } if ($package->getName() === 'symfony/flex' && Preg::isMatch('{^[0-9.]+$}', $package->getVersion()) && \version_compare($package->getVersion(), '1.9.8', '<')) { $this->io->writeError('The "' . $package->getName() . '" plugin ' . ($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '') . 'was skipped because it is not compatible with Composer 2+. Make sure to update it to version 1.9.8 or greater.'); return; } } if (!$this->isPluginAllowed($package->getName(), $isGlobalPlugin, \true === ($package->getExtra()['plugin-optional'] ?? \false))) { $this->io->writeError('Skipped loading "' . $package->getName() . '" ' . ($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '') . 'as it is not in config.allow-plugins', \true, IOInterface::DEBUG); return; } $oldInstallerPlugin = $package->getType() === 'composer-installer'; if (isset($this->registeredPlugins[$package->getName()])) { return; } $this->registeredPlugins[$package->getName()] = []; $extra = $package->getExtra(); if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing ' . $package->getPrettyName() . ', composer-plugin packages should have a class defined in their extra key to be usable.'); } $classes = \is_array($extra['class']) ? $extra['class'] : [$extra['class']]; $localRepo = $this->composer->getRepositoryManager()->getLocalRepository(); $globalRepo = $this->globalComposer !== null ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; $rootPackage = clone $this->composer->getPackage(); // clear files autoload rules from the root package as the root dependencies are not // necessarily all present yet when booting this runtime autoloader $rootPackageAutoloads = $rootPackage->getAutoload(); $rootPackageAutoloads['files'] = []; $rootPackage->setAutoload($rootPackageAutoloads); $rootPackageAutoloads = $rootPackage->getDevAutoload(); $rootPackageAutoloads['files'] = []; $rootPackage->setDevAutoload($rootPackageAutoloads); unset($rootPackageAutoloads); $rootPackageRepo = new RootPackageRepository($rootPackage); $installedRepo = new InstalledRepository([$localRepo, $rootPackageRepo]); if ($globalRepo) { $installedRepo->addRepository($globalRepo); } $autoloadPackages = [$package->getName() => $package]; $autoloadPackages = $this->collectDependencies($installedRepo, $autoloadPackages, $package); $generator = $this->composer->getAutoloadGenerator(); $autoloads = [[$rootPackage, '']]; foreach ($autoloadPackages as $autoloadPackage) { if ($autoloadPackage === $rootPackage) { continue; } $installPath = $this->getInstallPath($autoloadPackage, $globalRepo && $globalRepo->hasPackage($autoloadPackage)); if ($installPath === null) { continue; } $autoloads[] = [$autoloadPackage, $installPath]; } $map = $generator->parseAutoloads($autoloads, $rootPackage); $classLoader = $generator->createLoader($map, $this->composer->getConfig()->get('vendor-dir')); $classLoader->register(\false); foreach ($map['files'] as $fileIdentifier => $file) { // exclude laminas/laminas-zendframework-bridge:src/autoload.php as it breaks Composer in some conditions // see https://github.com/composer/composer/issues/10349 and https://github.com/composer/composer/issues/10401 // this hack can be removed once this deprecated package stop being installed if ($fileIdentifier === '7e9bd612cc444b3eed788ebbe46263a0') { continue; } \Composer\Autoload\composerRequire($fileIdentifier, $file); } foreach ($classes as $class) { if (\class_exists($class, \false)) { $class = \trim($class, '\\'); $path = $classLoader->findFile($class); $code = \file_get_contents($path); $separatorPos = \strrpos($class, '\\'); $className = $class; if ($separatorPos) { $className = \substr($class, $separatorPos + 1); } $code = Preg::replace('{^((?:(?:final|readonly)\\s+)*(?:\\s*))class\\s+(' . \preg_quote($className) . ')}mi', '$1class $2_composer_tmp' . self::$classCounter, $code, 1); $code = \strtr($code, ['__FILE__' => \var_export($path, \true), '__DIR__' => \var_export(\dirname($path), \true), '__CLASS__' => \var_export($class, \true)]); $code = Preg::replace('/^\\s*<\\?(php)?/i', '', $code, 1); eval($code); $class .= '_composer_tmp' . self::$classCounter; self::$classCounter++; } if ($oldInstallerPlugin) { if (!\is_a($class, 'Composer\\Installer\\InstallerInterface', \true)) { throw new \RuntimeException('Could not activate plugin "' . $package->getName() . '" as "' . $class . '" does not implement Composer\\Installer\\InstallerInterface'); } $this->io->writeError('Loading "' . $package->getName() . '" ' . ($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '') . 'which is a legacy composer-installer built for Composer 1.x, it is likely to cause issues as you are running Composer 2.x.'); $installer = new $class($this->io, $this->composer); $this->composer->getInstallationManager()->addInstaller($installer); $this->registeredPlugins[$package->getName()][] = $installer; } elseif (\class_exists($class)) { if (!\is_a($class, 'Composer\\Plugin\\PluginInterface', \true)) { throw new \RuntimeException('Could not activate plugin "' . $package->getName() . '" as "' . $class . '" does not implement Composer\\Plugin\\PluginInterface'); } $plugin = new $class(); $this->addPlugin($plugin, $isGlobalPlugin, $package); $this->registeredPlugins[$package->getName()][] = $plugin; } elseif ($failOnMissingClasses) { throw new \UnexpectedValueException('Plugin ' . $package->getName() . ' could not be initialized, class not found: ' . $class); } } } /** * Deactivates a plugin package * * If it's of type composer-installer it is unregistered from the installers * instead for BC * * @throws \UnexpectedValueException */ public function deactivatePackage(PackageInterface $package) : void { if (!isset($this->registeredPlugins[$package->getName()])) { return; } $plugins = $this->registeredPlugins[$package->getName()]; foreach ($plugins as $plugin) { if ($plugin instanceof InstallerInterface) { $this->composer->getInstallationManager()->removeInstaller($plugin); } else { $this->removePlugin($plugin); } } unset($this->registeredPlugins[$package->getName()]); } /** * Uninstall a plugin package * * If it's of type composer-installer it is unregistered from the installers * instead for BC * * @throws \UnexpectedValueException */ public function uninstallPackage(PackageInterface $package) : void { if (!isset($this->registeredPlugins[$package->getName()])) { return; } $plugins = $this->registeredPlugins[$package->getName()]; foreach ($plugins as $plugin) { if ($plugin instanceof InstallerInterface) { $this->composer->getInstallationManager()->removeInstaller($plugin); } else { $this->removePlugin($plugin); $this->uninstallPlugin($plugin); } } unset($this->registeredPlugins[$package->getName()]); } /** * Returns the version of the internal composer-plugin-api package. */ protected function getPluginApiVersion() : string { return \Composer\Plugin\PluginInterface::PLUGIN_API_VERSION; } /** * Adds a plugin, activates it and registers it with the event dispatcher * * Ideally plugin packages should be registered via registerPackage, but if you use Composer * programmatically and want to register a plugin class directly this is a valid way * to do it. * * @param PluginInterface $plugin plugin instance * @param ?PackageInterface $sourcePackage Package from which the plugin comes from */ public function addPlugin(\Composer\Plugin\PluginInterface $plugin, bool $isGlobalPlugin = \false, ?PackageInterface $sourcePackage = null) : void { if ($this->arePluginsDisabled($isGlobalPlugin ? 'global' : 'local')) { return; } if ($sourcePackage === null) { \trigger_error('Calling PluginManager::addPlugin without $sourcePackage is deprecated, if you are using this please get in touch with us to explain the use case', \E_USER_DEPRECATED); } elseif (!$this->isPluginAllowed($sourcePackage->getName(), $isGlobalPlugin, \true === ($sourcePackage->getExtra()['plugin-optional'] ?? \false))) { $this->io->writeError('Skipped loading "' . \get_class($plugin) . ' from ' . $sourcePackage->getName() . '" ' . ($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '') . ' as it is not in config.allow-plugins', \true, IOInterface::DEBUG); return; } $details = []; if ($sourcePackage) { $details[] = 'from ' . $sourcePackage->getName(); } if ($isGlobalPlugin || $this->runningInGlobalDir) { $details[] = 'installed globally'; } $this->io->writeError('Loading plugin ' . \get_class($plugin) . ($details ? ' (' . \implode(', ', $details) . ')' : ''), \true, IOInterface::DEBUG); $this->plugins[] = $plugin; $plugin->activate($this->composer, $this->io); if ($plugin instanceof EventSubscriberInterface) { $this->composer->getEventDispatcher()->addSubscriber($plugin); } } /** * Removes a plugin, deactivates it and removes any listener the plugin has set on the plugin instance * * Ideally plugin packages should be deactivated via deactivatePackage, but if you use Composer * programmatically and want to deregister a plugin class directly this is a valid way * to do it. * * @param PluginInterface $plugin plugin instance */ public function removePlugin(\Composer\Plugin\PluginInterface $plugin) : void { $index = \array_search($plugin, $this->plugins, \true); if ($index === \false) { return; } $this->io->writeError('Unloading plugin ' . \get_class($plugin), \true, IOInterface::DEBUG); unset($this->plugins[$index]); $plugin->deactivate($this->composer, $this->io); $this->composer->getEventDispatcher()->removeListener($plugin); } /** * Notifies a plugin it is being uninstalled and should clean up * * Ideally plugin packages should be uninstalled via uninstallPackage, but if you use Composer * programmatically and want to deregister a plugin class directly this is a valid way * to do it. * * @param PluginInterface $plugin plugin instance */ public function uninstallPlugin(\Composer\Plugin\PluginInterface $plugin) : void { $this->io->writeError('Uninstalling plugin ' . \get_class($plugin), \true, IOInterface::DEBUG); $plugin->uninstall($this->composer, $this->io); } /** * Load all plugins and installers from a repository * * If a plugin requires another plugin, the required one will be loaded first * * Note that plugins in the specified repository that rely on events that * have fired prior to loading will be missed. This means you likely want to * call this method as early as possible. * * @param RepositoryInterface $repo Repository to scan for plugins to install * * @phpstan-param ($isGlobalRepo is true ? null : RootPackageInterface) $rootPackage * * @throws \RuntimeException */ private function loadRepository(RepositoryInterface $repo, bool $isGlobalRepo, ?RootPackageInterface $rootPackage = null) : void { $packages = $repo->getPackages(); $weights = []; foreach ($packages as $package) { if ($package->getType() === 'composer-plugin') { $extra = $package->getExtra(); if ($package->getName() === 'composer/installers' || \true === ($extra['plugin-modifies-install-path'] ?? \false)) { $weights[$package->getName()] = -10000; } } } $sortedPackages = PackageSorter::sortPackages($packages, $weights); if (!$isGlobalRepo) { $requiredPackages = RepositoryUtils::filterRequiredPackages($packages, $rootPackage, \true); } foreach ($sortedPackages as $package) { if (!$package instanceof CompletePackage) { continue; } if (!\in_array($package->getType(), ['composer-plugin', 'composer-installer'], \true)) { continue; } if (!$isGlobalRepo && !\in_array($package, $requiredPackages, \true) && !$this->isPluginAllowed($package->getName(), \false, \true, \false)) { $this->io->writeError('The "' . $package->getName() . '" plugin was not loaded as it is not listed in allow-plugins and is not required by the root package anymore.'); continue; } if ('composer-plugin' === $package->getType()) { $this->registerPackage($package, \false, $isGlobalRepo); // Backward compatibility } elseif ('composer-installer' === $package->getType()) { $this->registerPackage($package, \false, $isGlobalRepo); } } } /** * Deactivate all plugins and installers from a repository * * If a plugin requires another plugin, the required one will be deactivated last * * @param RepositoryInterface $repo Repository to scan for plugins to install */ private function deactivateRepository(RepositoryInterface $repo, bool $isGlobalRepo) : void { $packages = $repo->getPackages(); $sortedPackages = \array_reverse(PackageSorter::sortPackages($packages)); foreach ($sortedPackages as $package) { if (!$package instanceof CompletePackage) { continue; } if ('composer-plugin' === $package->getType()) { $this->deactivatePackage($package); // Backward compatibility } elseif ('composer-installer' === $package->getType()) { $this->deactivatePackage($package); } } } /** * Recursively generates a map of package names to packages for all deps * * @param InstalledRepository $installedRepo Set of local repos * @param array $collected Current state of the map for recursion * @param PackageInterface $package The package to analyze * * @return array Map of package names to packages */ private function collectDependencies(InstalledRepository $installedRepo, array $collected, PackageInterface $package) : array { foreach ($package->getRequires() as $requireLink) { foreach ($installedRepo->findPackagesWithReplacersAndProviders($requireLink->getTarget()) as $requiredPackage) { if (!isset($collected[$requiredPackage->getName()])) { $collected[$requiredPackage->getName()] = $requiredPackage; $collected = $this->collectDependencies($installedRepo, $collected, $requiredPackage); } } } return $collected; } /** * Retrieves the path a package is installed to. * * @param bool $global Whether this is a global package * * @return string|null Install path */ private function getInstallPath(PackageInterface $package, bool $global = \false) : ?string { if (!$global) { return $this->composer->getInstallationManager()->getInstallPath($package); } \assert(null !== $this->globalComposer); return $this->globalComposer->getInstallationManager()->getInstallPath($package); } /** * @throws \RuntimeException On empty or non-string implementation class name value * @return null|string The fully qualified class of the implementation or null if Plugin is not of Capable type or does not provide it */ protected function getCapabilityImplementationClassName(\Composer\Plugin\PluginInterface $plugin, string $capability) : ?string { if (!$plugin instanceof \Composer\Plugin\Capable) { return null; } $capabilities = (array) $plugin->getCapabilities(); if (!empty($capabilities[$capability]) && \is_string($capabilities[$capability]) && \trim($capabilities[$capability])) { return \trim($capabilities[$capability]); } if (\array_key_exists($capability, $capabilities) && (empty($capabilities[$capability]) || !\is_string($capabilities[$capability]) || !\trim($capabilities[$capability]))) { throw new \UnexpectedValueException('Plugin ' . \get_class($plugin) . ' provided invalid capability class name(s), got ' . \var_export($capabilities[$capability], \true)); } return null; } /** * @template CapabilityClass of Capability * @param class-string $capabilityClassName The fully qualified name of the API interface which the plugin may provide * an implementation of. * @param array $ctorArgs Arguments passed to Capability's constructor. * Keeping it an array will allow future values to be passed w\o changing the signature. * @phpstan-param class-string $capabilityClassName * @phpstan-return null|CapabilityClass */ public function getPluginCapability(\Composer\Plugin\PluginInterface $plugin, $capabilityClassName, array $ctorArgs = []) : ?Capability { if ($capabilityClass = $this->getCapabilityImplementationClassName($plugin, $capabilityClassName)) { if (!\class_exists($capabilityClass)) { throw new \RuntimeException("Cannot instantiate Capability, as class {$capabilityClass} from plugin " . \get_class($plugin) . " does not exist."); } $ctorArgs['plugin'] = $plugin; $capabilityObj = new $capabilityClass($ctorArgs); // FIXME these could use is_a and do the check *before* instantiating once drop support for php<5.3.9 if (!$capabilityObj instanceof Capability || !$capabilityObj instanceof $capabilityClassName) { throw new \RuntimeException('Class ' . $capabilityClass . ' must implement both Composer\\Plugin\\Capability\\Capability and ' . $capabilityClassName . '.'); } return $capabilityObj; } return null; } /** * @template CapabilityClass of Capability * @param class-string $capabilityClassName The fully qualified name of the API interface which the plugin may provide * an implementation of. * @param array $ctorArgs Arguments passed to Capability's constructor. * Keeping it an array will allow future values to be passed w\o changing the signature. * @return CapabilityClass[] */ public function getPluginCapabilities($capabilityClassName, array $ctorArgs = []) : array { $capabilities = []; foreach ($this->getPlugins() as $plugin) { $capability = $this->getPluginCapability($plugin, $capabilityClassName, $ctorArgs); if (null !== $capability) { $capabilities[] = $capability; } } return $capabilities; } /** * @param array|bool $allowPluginsConfig * @return array|null */ private function parseAllowedPlugins($allowPluginsConfig, ?Locker $locker = null) : ?array { if ([] === $allowPluginsConfig && $locker !== null && $locker->isLocked() && \version_compare($locker->getPluginApi(), '2.2.0', '<')) { return null; } if (\true === $allowPluginsConfig) { return ['{}' => \true]; } if (\false === $allowPluginsConfig) { return ['{}' => \false]; } $rules = []; foreach ($allowPluginsConfig as $pattern => $allow) { $rules[BasePackage::packageNameToRegexp($pattern)] = $allow; } return $rules; } /** * @internal * * @param 'local'|'global' $type * @return bool */ public function arePluginsDisabled($type) { return $this->disablePlugins === \true || $this->disablePlugins === $type; } /** * @internal */ public function disablePlugins() : void { $this->disablePlugins = \true; } /** * @internal */ public function isPluginAllowed(string $package, bool $isGlobalPlugin, bool $optional = \false, bool $prompt = \true) : bool { if ($isGlobalPlugin) { $rules =& $this->allowGlobalPluginRules; } else { $rules =& $this->allowPluginRules; } // This is a BC mode for lock files created pre-Composer-2.2 where the expectation of // an allow-plugins config being present cannot be made. if ($rules === null) { if (!$this->io->isInteractive()) { $this->io->writeError('For additional security you should declare the allow-plugins config with a list of packages names that are allowed to run code. See https://getcomposer.org/allow-plugins'); $this->io->writeError('This warning will become an exception once you run composer update!'); $rules = ['{}' => \true]; // if no config is defined we allow all plugins for BC return \true; } // keep going and prompt the user $rules = []; } foreach ($rules as $pattern => $allow) { if (Preg::isMatch($pattern, $package)) { return $allow === \true; } } if ($package === 'composer/package-versions-deprecated') { return \false; } if ($this->io->isInteractive() && $prompt) { $composer = $isGlobalPlugin && $this->globalComposer !== null ? $this->globalComposer : $this->composer; $this->io->writeError('' . $package . ($isGlobalPlugin || $this->runningInGlobalDir ? ' (installed globally)' : '') . ' contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins'); $attempts = 0; while (\true) { // do not allow more than 5 prints of the help message, at some point assume the // input is not interactive and bail defaulting to a disabled plugin $default = '?'; if ($attempts > 5) { $this->io->writeError('Too many failed prompts, aborting.'); break; } switch ($answer = $this->io->ask('Do you trust "' . $package . '" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] ', $default)) { case 'y': case 'n': case 'd': $allow = $answer === 'y'; // persist answer in current rules to avoid prompting again if the package gets reloaded $rules[BasePackage::packageNameToRegexp($package)] = $allow; // persist answer in composer.json if it wasn't simply discarded if ($answer === 'y' || $answer === 'n') { $allowPlugins = $composer->getConfig()->get('allow-plugins'); if (\is_array($allowPlugins)) { $allowPlugins[$package] = $allow; if ($composer->getConfig()->get('sort-packages')) { \ksort($allowPlugins); } $composer->getConfig()->getConfigSource()->addConfigSetting('allow-plugins', $allowPlugins); $composer->getConfig()->merge(['config' => ['allow-plugins' => $allowPlugins]]); } } return $allow; case '?': default: $attempts++; $this->io->writeError(['y - add package to allow-plugins in composer.json and let it run immediately', 'n - add package (as disallowed) to allow-plugins in composer.json to suppress further prompts', 'd - discard this, do not change composer.json and do not allow the plugin to run', '? - print help']); break; } } } elseif ($optional) { return \false; } throw new \Composer\Plugin\PluginBlockedException($package . ($isGlobalPlugin || $this->runningInGlobalDir ? ' (installed globally)' : '') . ' contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe.' . \PHP_EOL . 'You can run "composer ' . ($isGlobalPlugin || $this->runningInGlobalDir ? 'global ' : '') . 'config --no-plugins allow-plugins.' . $package . ' [true|false]" to enable it (true) or disable it explicitly and suppress this exception (false)' . \PHP_EOL . 'See https://getcomposer.org/allow-plugins'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use Composer\Util\HttpDownloader; /** * The pre file download event. * * @author Nils Adermann */ class PreFileDownloadEvent extends Event { /** * @var HttpDownloader */ private $httpDownloader; /** * @var non-empty-string */ private $processedUrl; /** * @var string|null */ private $customCacheKey; /** * @var string */ private $type; /** * @var mixed */ private $context; /** * @var mixed[] */ private $transportOptions = []; /** * Constructor. * * @param string $name The event name * @param mixed $context * @param non-empty-string $processedUrl */ public function __construct(string $name, HttpDownloader $httpDownloader, string $processedUrl, string $type, $context = null) { parent::__construct($name); $this->httpDownloader = $httpDownloader; $this->processedUrl = $processedUrl; $this->type = $type; $this->context = $context; } public function getHttpDownloader() : HttpDownloader { return $this->httpDownloader; } /** * Retrieves the processed URL that will be downloaded. * * @return non-empty-string */ public function getProcessedUrl() : string { return $this->processedUrl; } /** * Sets the processed URL that will be downloaded. * * @param non-empty-string $processedUrl New processed URL */ public function setProcessedUrl(string $processedUrl) : void { $this->processedUrl = $processedUrl; } /** * Retrieves a custom package cache key for this download. */ public function getCustomCacheKey() : ?string { return $this->customCacheKey; } /** * Sets a custom package cache key for this download. * * @param string|null $customCacheKey New cache key */ public function setCustomCacheKey(?string $customCacheKey) : void { $this->customCacheKey = $customCacheKey; } /** * Returns the type of this download (package, metadata). */ public function getType() : string { return $this->type; } /** * Returns the context of this download, if any. * * If this download is of type package, the package object is returned. * If the type is metadata, an array{repository: RepositoryInterface} is returned. * * @return mixed */ public function getContext() { return $this->context; } /** * Returns transport options for the download. * * Only available for events with type metadata, for packages set the transport options on the package itself. * * @return mixed[] */ public function getTransportOptions() : array { return $this->transportOptions; } /** * Sets transport options for the download. * * Only available for events with type metadata, for packages set the transport options on the package itself. * * @param mixed[] $options */ public function setTransportOptions(array $options) : void { $this->transportOptions = $options; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use Composer\Package\PackageInterface; /** * The post file download event. * * @author Nils Adermann */ class PostFileDownloadEvent extends Event { /** * @var string */ private $fileName; /** * @var string|null */ private $checksum; /** * @var string */ private $url; /** * @var mixed */ private $context; /** * @var string */ private $type; /** * Constructor. * * @param string $name The event name * @param string|null $fileName The file name * @param string|null $checksum The checksum * @param string $url The processed url * @param string $type The type (package or metadata). * @param mixed $context Additional context for the download. */ public function __construct(string $name, ?string $fileName, ?string $checksum, string $url, string $type, $context = null) { /** @phpstan-ignore instanceof.alwaysFalse, booleanAnd.alwaysFalse */ if ($context === null && $type instanceof PackageInterface) { $context = $type; $type = 'package'; \trigger_error('PostFileDownloadEvent::__construct should receive a $type=package and the package object in $context since Composer 2.1.', \E_USER_DEPRECATED); } parent::__construct($name); $this->fileName = $fileName; $this->checksum = $checksum; $this->url = $url; $this->context = $context; $this->type = $type; } /** * Retrieves the target file name location. * * If this download is of type metadata, null is returned. */ public function getFileName() : ?string { return $this->fileName; } /** * Gets the checksum. */ public function getChecksum() : ?string { return $this->checksum; } /** * Gets the processed URL. */ public function getUrl() : string { return $this->url; } /** * Returns the context of this download, if any. * * If this download is of type package, the package object is returned. If * this download is of type metadata, an array{response: Response, repository: RepositoryInterface} is returned. * * @return mixed */ public function getContext() { return $this->context; } /** * Get the package. * * If this download is of type metadata, null is returned. * * @return \Composer\Package\PackageInterface|null The package. * @deprecated Use getContext instead */ public function getPackage() : ?PackageInterface { \trigger_error('PostFileDownloadEvent::getPackage is deprecated since Composer 2.1, use getContext instead.', \E_USER_DEPRECATED); $context = $this->getContext(); return $context instanceof PackageInterface ? $context : null; } /** * Returns the type of this download (package, metadata). */ public function getType() : string { return $this->type; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; /** * Plugins which need to expose various implementations * of the Composer Plugin Capabilities must have their * declared Plugin class implementing this interface. * * @api */ interface Capable { /** * Method by which a Plugin announces its API implementations, through an array * with a special structure. * * The key must be a string, representing a fully qualified class/interface name * which Composer Plugin API exposes. * The value must be a string as well, representing the fully qualified class name * of the implementing class. * * @tutorial * * return array( * 'Composer\Plugin\Capability\CommandProvider' => 'My\CommandProvider', * 'Composer\Plugin\Capability\Validator' => 'My\Validator', * ); * * @return string[] */ public function getCapabilities(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use Composer\Repository\RepositoryInterface; use Composer\DependencyResolver\Request; use Composer\Package\BasePackage; /** * The pre command run event. * * @author Jordi Boggiano */ class PrePoolCreateEvent extends Event { /** * @var RepositoryInterface[] */ private $repositories; /** * @var Request */ private $request; /** * @var int[] array of stability => BasePackage::STABILITY_* value * @phpstan-var array */ private $acceptableStabilities; /** * @var int[] array of package name => BasePackage::STABILITY_* value * @phpstan-var array */ private $stabilityFlags; /** * @var array[] of package => version => [alias, alias_normalized] * @phpstan-var array> */ private $rootAliases; /** * @var string[] * @phpstan-var array */ private $rootReferences; /** * @var BasePackage[] */ private $packages; /** * @var BasePackage[] */ private $unacceptableFixedPackages; /** * @param string $name The event name * @param RepositoryInterface[] $repositories * @param int[] $acceptableStabilities array of stability => BasePackage::STABILITY_* value * @param int[] $stabilityFlags array of package name => BasePackage::STABILITY_* value * @param array[] $rootAliases array of package => version => [alias, alias_normalized] * @param string[] $rootReferences * @param BasePackage[] $packages * @param BasePackage[] $unacceptableFixedPackages * * @phpstan-param array $acceptableStabilities * @phpstan-param array $stabilityFlags * @phpstan-param array> $rootAliases * @phpstan-param array $rootReferences */ public function __construct(string $name, array $repositories, Request $request, array $acceptableStabilities, array $stabilityFlags, array $rootAliases, array $rootReferences, array $packages, array $unacceptableFixedPackages) { parent::__construct($name); $this->repositories = $repositories; $this->request = $request; $this->acceptableStabilities = $acceptableStabilities; $this->stabilityFlags = $stabilityFlags; $this->rootAliases = $rootAliases; $this->rootReferences = $rootReferences; $this->packages = $packages; $this->unacceptableFixedPackages = $unacceptableFixedPackages; } /** * @return RepositoryInterface[] */ public function getRepositories() : array { return $this->repositories; } public function getRequest() : Request { return $this->request; } /** * @return int[] array of stability => BasePackage::STABILITY_* value * @phpstan-return array */ public function getAcceptableStabilities() : array { return $this->acceptableStabilities; } /** * @return int[] array of package name => BasePackage::STABILITY_* value * @phpstan-return array */ public function getStabilityFlags() : array { return $this->stabilityFlags; } /** * @return array[] of package => version => [alias, alias_normalized] * @phpstan-return array> */ public function getRootAliases() : array { return $this->rootAliases; } /** * @return string[] * @phpstan-return array */ public function getRootReferences() : array { return $this->rootReferences; } /** * @return BasePackage[] */ public function getPackages() : array { return $this->packages; } /** * @return BasePackage[] */ public function getUnacceptableFixedPackages() : array { return $this->unacceptableFixedPackages; } /** * @param BasePackage[] $packages */ public function setPackages(array $packages) : void { $this->packages = $packages; } /** * @param BasePackage[] $packages */ public function setUnacceptableFixedPackages(array $packages) : void { $this->unacceptableFixedPackages = $packages; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Util\IniHelper; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Package\PackageInterface; use RarArchive; /** * RAR archive downloader. * * Based on previous work by Jordi Boggiano ({@see ZipDownloader}). * * @author Derrick Nelson */ class RarDownloader extends \Composer\Downloader\ArchiveDownloader { protected function extract(PackageInterface $package, string $file, string $path) : PromiseInterface { $processError = null; // Try to use unrar on *nix if (!Platform::isWindows()) { $command = ['sh', '-c', 'unrar x -- "$0" "$1" >/dev/null && chmod -R u+w "$1"', $file, $path]; if (0 === $this->process->execute($command, $ignoredOutput)) { return \React\Promise\resolve(null); } $processError = 'Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput(); } if (!\class_exists('RarArchive')) { // php.ini path is added to the error message to help users find the correct file $iniMessage = IniHelper::getMessage(); $error = "Could not decompress the archive, enable the PHP rar extension or install unrar.\n" . $iniMessage . "\n" . $processError; if (!Platform::isWindows()) { $error = "Could not decompress the archive, enable the PHP rar extension.\n" . $iniMessage; } throw new \RuntimeException($error); } $rarArchive = RarArchive::open($file); if (\false === $rarArchive) { throw new \UnexpectedValueException('Could not open RAR archive: ' . $file); } $entries = $rarArchive->getEntries(); if (\false === $entries) { throw new \RuntimeException('Could not retrieve RAR archive entries'); } foreach ($entries as $entry) { if (\false === $entry->extract($path)) { throw new \RuntimeException('Could not extract entry'); } } $rarArchive->close(); return \React\Promise\resolve(null); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * VCS Capable Downloader interface. * * @author Steve Buzonas */ interface VcsCapableDownloaderInterface { /** * Gets the VCS Reference for the package at path * * @param PackageInterface $package package instance * @param string $path package directory * @return string|null reference or null */ public function getVcsReference(PackageInterface $package, string $path) : ?string; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Util\ProcessExecutor; use Composer\IO\IOInterface; use Composer\Util\Filesystem; use React\Promise\PromiseInterface; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; /** * @author Jordi Boggiano */ abstract class VcsDownloader implements \Composer\Downloader\DownloaderInterface, \Composer\Downloader\ChangeReportInterface, \Composer\Downloader\VcsCapableDownloaderInterface { /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var Filesystem */ protected $filesystem; /** @var array */ protected $hasCleanedChanges = []; public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?Filesystem $fs = null) { $this->io = $io; $this->config = $config; $this->process = $process ?? new ProcessExecutor($io); $this->filesystem = $fs ?? new Filesystem($this->process); } /** * @inheritDoc */ public function getInstallationSource() : string { return 'source'; } /** * @inheritDoc */ public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { if (!$package->getSourceReference()) { throw new \InvalidArgumentException('Package ' . $package->getPrettyName() . ' is missing reference information'); } $urls = $this->prepareUrls($package->getSourceUrls()); while ($url = \array_shift($urls)) { try { return $this->doDownload($package, $path, $url, $prevPackage); } catch (\Exception $e) { // rethrow phpunit exceptions to avoid hard to debug bug failures if ($e instanceof \_ContaoManager\PHPUnit\Framework\Exception) { throw $e; } if ($this->io->isDebug()) { $this->io->writeError('Failed: [' . \get_class($e) . '] ' . $e->getMessage()); } elseif (\count($urls)) { $this->io->writeError(' Failed, trying the next URL'); } if (!\count($urls)) { throw $e; } } } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { if ($type === 'update') { $this->cleanChanges($prevPackage, $path, \true); $this->hasCleanedChanges[$prevPackage->getUniqueName()] = \true; } elseif ($type === 'install') { $this->filesystem->emptyDirectory($path); } elseif ($type === 'uninstall') { $this->cleanChanges($package, $path, \false); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { if ($type === 'update' && isset($this->hasCleanedChanges[$prevPackage->getUniqueName()])) { $this->reapplyChanges($path); unset($this->hasCleanedChanges[$prevPackage->getUniqueName()]); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function install(PackageInterface $package, string $path) : PromiseInterface { if (!$package->getSourceReference()) { throw new \InvalidArgumentException('Package ' . $package->getPrettyName() . ' is missing reference information'); } $this->io->writeError(" - " . InstallOperation::format($package) . ': ', \false); $urls = $this->prepareUrls($package->getSourceUrls()); while ($url = \array_shift($urls)) { try { $this->doInstall($package, $path, $url); break; } catch (\Exception $e) { // rethrow phpunit exceptions to avoid hard to debug bug failures if ($e instanceof \_ContaoManager\PHPUnit\Framework\Exception) { throw $e; } if ($this->io->isDebug()) { $this->io->writeError('Failed: [' . \get_class($e) . '] ' . $e->getMessage()); } elseif (\count($urls)) { $this->io->writeError(' Failed, trying the next URL'); } if (!\count($urls)) { throw $e; } } } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function update(PackageInterface $initial, PackageInterface $target, string $path) : PromiseInterface { if (!$target->getSourceReference()) { throw new \InvalidArgumentException('Package ' . $target->getPrettyName() . ' is missing reference information'); } $this->io->writeError(" - " . UpdateOperation::format($initial, $target) . ': ', \false); $urls = $this->prepareUrls($target->getSourceUrls()); $exception = null; while ($url = \array_shift($urls)) { try { $this->doUpdate($initial, $target, $path, $url); $exception = null; break; } catch (\Exception $exception) { // rethrow phpunit exceptions to avoid hard to debug bug failures if ($exception instanceof \_ContaoManager\PHPUnit\Framework\Exception) { throw $exception; } if ($this->io->isDebug()) { $this->io->writeError('Failed: [' . \get_class($exception) . '] ' . $exception->getMessage()); } elseif (\count($urls)) { $this->io->writeError(' Failed, trying the next URL'); } } } // print the commit logs if in verbose mode and VCS metadata is present // because in case of missing metadata code would trigger another exception if (!$exception && $this->io->isVerbose() && $this->hasMetadataRepository($path)) { $message = 'Pulling in changes:'; $logs = $this->getCommitLogs($initial->getSourceReference(), $target->getSourceReference(), $path); if ('' === \trim($logs)) { $message = 'Rolling back changes:'; $logs = $this->getCommitLogs($target->getSourceReference(), $initial->getSourceReference(), $path); } if ('' !== \trim($logs)) { $logs = \implode("\n", \array_map(static function ($line) : string { return ' ' . $line; }, \explode("\n", $logs))); // escape angle brackets for proper output in the console $logs = \str_replace('<', '\\<', $logs); $this->io->writeError(' ' . $message); $this->io->writeError($logs); } } if (!$urls && $exception) { throw $exception; } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function remove(PackageInterface $package, string $path) : PromiseInterface { $this->io->writeError(" - " . UninstallOperation::format($package)); $promise = $this->filesystem->removeDirectoryAsync($path); return $promise->then(static function (bool $result) use($path) { if (!$result) { throw new \RuntimeException('Could not completely delete ' . $path . ', aborting.'); } }); } /** * @inheritDoc */ public function getVcsReference(PackageInterface $package, string $path) : ?string { $parser = new VersionParser(); $guesser = new VersionGuesser($this->config, $this->process, $parser, $this->io); $dumper = new ArrayDumper(); $packageConfig = $dumper->dump($package); if ($packageVersion = $guesser->guessVersion($packageConfig, $path)) { return $packageVersion['commit']; } return null; } /** * Prompt the user to check if changes should be stashed/removed or the operation aborted * * @param bool $update if true (update) the changes can be stashed and reapplied after an update, * if false (remove) the changes should be assumed to be lost if the operation is not aborted * * @throws \RuntimeException in case the operation must be aborted * @phpstan-return PromiseInterface */ protected function cleanChanges(PackageInterface $package, string $path, bool $update) : PromiseInterface { // the default implementation just fails if there are any changes, override in child classes to provide stash-ability if (null !== $this->getLocalChanges($package, $path)) { throw new \RuntimeException('Source directory ' . $path . ' has uncommitted changes.'); } return \React\Promise\resolve(null); } /** * Reapply previously stashes changes if applicable, only called after an update (regardless if successful or not) * * @throws \RuntimeException in case the operation must be aborted or the patch does not apply cleanly */ protected function reapplyChanges(string $path) : void { } /** * Downloads data needed to run an install/update later * * @param PackageInterface $package package instance * @param string $path download path * @param string $url package url * @param PackageInterface|null $prevPackage previous package (in case of an update) * @phpstan-return PromiseInterface */ protected abstract function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null) : PromiseInterface; /** * Downloads specific package into specific folder. * * @param PackageInterface $package package instance * @param string $path download path * @param string $url package url * @phpstan-return PromiseInterface */ protected abstract function doInstall(PackageInterface $package, string $path, string $url) : PromiseInterface; /** * Updates specific package in specific folder from initial to target version. * * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path * @param string $url package url * @phpstan-return PromiseInterface */ protected abstract function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url) : PromiseInterface; /** * Fetches the commit logs between two commits * * @param string $fromReference the source reference * @param string $toReference the target reference * @param string $path the package path */ protected abstract function getCommitLogs(string $fromReference, string $toReference, string $path) : string; /** * Checks if VCS metadata repository has been initialized * repository example: .git|.svn|.hg */ protected abstract function hasMetadataRepository(string $path) : bool; /** * @param string[] $urls * * @return string[] */ private function prepareUrls(array $urls) : array { foreach ($urls as $index => $url) { if (Filesystem::isLocalPath($url)) { // realpath() below will not understand // url that starts with "file://" $fileProtocol = 'file://'; $isFileProtocol = \false; if (0 === \strpos($url, $fileProtocol)) { $url = \substr($url, \strlen($fileProtocol)); $isFileProtocol = \true; } // realpath() below will not understand %20 spaces etc. if (\false !== \strpos($url, '%')) { $url = \rawurldecode($url); } $urls[$index] = \realpath($url); if ($isFileProtocol) { $urls[$index] = $fileProtocol . $urls[$index]; } } } return $urls; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; /** * Exception thrown when issues exist on local filesystem * * @author Javier Spagnoletti */ class FilesystemException extends \Exception { public function __construct(string $message = '', int $code = 0, ?\Exception $previous = null) { parent::__construct("Filesystem exception: \n" . $message, $code, $previous); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Exception\IrrecoverableDownloadException; use React\Promise\PromiseInterface; /** * Downloaders manager. * * @author Konstantin Kudryashov */ class DownloadManager { /** @var IOInterface */ private $io; /** @var bool */ private $preferDist = \false; /** @var bool */ private $preferSource; /** @var array */ private $packagePreferences = []; /** @var Filesystem */ private $filesystem; /** @var array */ private $downloaders = []; /** * Initializes download manager. * * @param IOInterface $io The Input Output Interface * @param bool $preferSource prefer downloading from source * @param Filesystem|null $filesystem custom Filesystem object */ public function __construct(IOInterface $io, bool $preferSource = \false, ?Filesystem $filesystem = null) { $this->io = $io; $this->preferSource = $preferSource; $this->filesystem = $filesystem ?: new Filesystem(); } /** * Makes downloader prefer source installation over the dist. * * @param bool $preferSource prefer downloading from source * @return DownloadManager */ public function setPreferSource(bool $preferSource) : self { $this->preferSource = $preferSource; return $this; } /** * Makes downloader prefer dist installation over the source. * * @param bool $preferDist prefer downloading from dist * @return DownloadManager */ public function setPreferDist(bool $preferDist) : self { $this->preferDist = $preferDist; return $this; } /** * Sets fine tuned preference settings for package level source/dist selection. * * @param array $preferences array of preferences by package patterns * * @return DownloadManager */ public function setPreferences(array $preferences) : self { $this->packagePreferences = $preferences; return $this; } /** * Sets installer downloader for a specific installation type. * * @param string $type installation type * @param DownloaderInterface $downloader downloader instance * @return DownloadManager */ public function setDownloader(string $type, \Composer\Downloader\DownloaderInterface $downloader) : self { $type = \strtolower($type); $this->downloaders[$type] = $downloader; return $this; } /** * Returns downloader for a specific installation type. * * @param string $type installation type * @throws \InvalidArgumentException if downloader for provided type is not registered */ public function getDownloader(string $type) : \Composer\Downloader\DownloaderInterface { $type = \strtolower($type); if (!isset($this->downloaders[$type])) { throw new \InvalidArgumentException(\sprintf('Unknown downloader type: %s. Available types: %s.', $type, \implode(', ', \array_keys($this->downloaders)))); } return $this->downloaders[$type]; } /** * Returns downloader for already installed package. * * @param PackageInterface $package package instance * @throws \InvalidArgumentException if package has no installation source specified * @throws \LogicException if specific downloader used to load package with * wrong type */ public function getDownloaderForPackage(PackageInterface $package) : ?\Composer\Downloader\DownloaderInterface { $installationSource = $package->getInstallationSource(); if ('metapackage' === $package->getType()) { return null; } if ('dist' === $installationSource) { $downloader = $this->getDownloader($package->getDistType()); } elseif ('source' === $installationSource) { $downloader = $this->getDownloader($package->getSourceType()); } else { throw new \InvalidArgumentException('Package ' . $package . ' does not have an installation source set'); } if ($installationSource !== $downloader->getInstallationSource()) { throw new \LogicException(\sprintf('Downloader "%s" is a %s type downloader and can not be used to download %s for package %s', \get_class($downloader), $downloader->getInstallationSource(), $installationSource, $package)); } return $downloader; } public function getDownloaderType(\Composer\Downloader\DownloaderInterface $downloader) : string { return \array_search($downloader, $this->downloaders); } /** * Downloads package into target dir. * * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates * @phpstan-return PromiseInterface * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException */ public function download(PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null) : PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $this->filesystem->ensureDirectoryExists(\dirname($targetDir)); $sources = $this->getAvailableSources($package, $prevPackage); $io = $this->io; $download = function ($retry = \false) use(&$sources, $io, $package, $targetDir, &$download, $prevPackage) { $source = \array_shift($sources); if ($retry) { $io->writeError(' Now trying to download from ' . $source . ''); } $package->setInstallationSource($source); $downloader = $this->getDownloaderForPackage($package); if (!$downloader) { return \React\Promise\resolve(null); } $handleError = static function ($e) use($sources, $source, $package, $io, $download) { if ($e instanceof \RuntimeException && !$e instanceof IrrecoverableDownloadException) { if (!$sources) { throw $e; } $io->writeError(' Failed to download ' . $package->getPrettyName() . ' from ' . $source . ': ' . $e->getMessage() . ''); return $download(\true); } throw $e; }; try { $result = $downloader->download($package, $targetDir, $prevPackage); } catch (\Exception $e) { return $handleError($e); } $res = $result->then(static function ($res) { return $res; }, $handleError); return $res; }; return $download(); } /** * Prepares an operation execution * * @param string $type one of install/update/uninstall * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates * @phpstan-return PromiseInterface */ public function prepare(string $type, PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null) : PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($package); if ($downloader) { return $downloader->prepare($type, $package, $targetDir, $prevPackage); } return \React\Promise\resolve(null); } /** * Installs package into target dir. * * @param PackageInterface $package package instance * @param string $targetDir target dir * @phpstan-return PromiseInterface * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException */ public function install(PackageInterface $package, string $targetDir) : PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($package); if ($downloader) { return $downloader->install($package, $targetDir); } return \React\Promise\resolve(null); } /** * Updates package from initial to target version. * * @param PackageInterface $initial initial package version * @param PackageInterface $target target package version * @param string $targetDir target dir * @phpstan-return PromiseInterface * * @throws \InvalidArgumentException if initial package is not installed */ public function update(PackageInterface $initial, PackageInterface $target, string $targetDir) : PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($target); $initialDownloader = $this->getDownloaderForPackage($initial); // no downloaders present means update from metapackage to metapackage, nothing to do if (!$initialDownloader && !$downloader) { return \React\Promise\resolve(null); } // if we have a downloader present before, but not after, the package became a metapackage and its files should be removed if (!$downloader) { return $initialDownloader->remove($initial, $targetDir); } $initialType = $this->getDownloaderType($initialDownloader); $targetType = $this->getDownloaderType($downloader); if ($initialType === $targetType) { try { return $downloader->update($initial, $target, $targetDir); } catch (\RuntimeException $e) { if (!$this->io->isInteractive()) { throw $e; } $this->io->writeError(' Update failed (' . $e->getMessage() . ')'); if (!$this->io->askConfirmation(' Would you like to try reinstalling the package instead [yes]? ')) { throw $e; } } } // if downloader type changed, or update failed and user asks for reinstall, // we wipe the dir and do a new install instead of updating it $promise = $initialDownloader->remove($initial, $targetDir); return $promise->then(function ($res) use($target, $targetDir) : PromiseInterface { return $this->install($target, $targetDir); }); } /** * Removes package from target dir. * * @param PackageInterface $package package instance * @param string $targetDir target dir * @phpstan-return PromiseInterface */ public function remove(PackageInterface $package, string $targetDir) : PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($package); if ($downloader) { return $downloader->remove($package, $targetDir); } return \React\Promise\resolve(null); } /** * Cleans up a failed operation * * @param string $type one of install/update/uninstall * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates * @phpstan-return PromiseInterface */ public function cleanup(string $type, PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null) : PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($package); if ($downloader) { return $downloader->cleanup($type, $package, $targetDir, $prevPackage); } return \React\Promise\resolve(null); } /** * Determines the install preference of a package * * @param PackageInterface $package package instance */ protected function resolvePackageInstallPreference(PackageInterface $package) : string { foreach ($this->packagePreferences as $pattern => $preference) { $pattern = '{^' . \str_replace('\\*', '.*', \preg_quote($pattern)) . '$}i'; if (Preg::isMatch($pattern, $package->getName())) { if ('dist' === $preference || !$package->isDev() && 'auto' === $preference) { return 'dist'; } return 'source'; } } return $package->isDev() ? 'source' : 'dist'; } /** * @return string[] * @phpstan-return array<'dist'|'source'>&non-empty-array */ private function getAvailableSources(PackageInterface $package, ?PackageInterface $prevPackage = null) : array { $sourceType = $package->getSourceType(); $distType = $package->getDistType(); // add source before dist by default $sources = []; if ($sourceType) { $sources[] = 'source'; } if ($distType) { $sources[] = 'dist'; } if (empty($sources)) { throw new \InvalidArgumentException('Package ' . $package . ' must have a source or dist specified'); } if ($prevPackage && \in_array($prevPackage->getInstallationSource(), $sources, \true) && !(!$prevPackage->isDev() && $prevPackage->getInstallationSource() === 'dist' && $package->isDev())) { $prevSource = $prevPackage->getInstallationSource(); \usort($sources, static function ($a, $b) use($prevSource) : int { return $a === $prevSource ? -1 : 1; }); return $sources; } // reverse sources in case dist is the preferred source for this package if (!$this->preferSource && ($this->preferDist || 'dist' === $this->resolvePackageInstallPreference($package))) { $sources = \array_reverse($sources); } return $sources; } /** * Downloaders expect a /path/to/dir without trailing slash * * If any Installer provides a path with a trailing slash, this can cause bugs so make sure we remove them */ private function normalizeTargetDir(string $dir) : string { if ($dir === '\\' || $dir === '/') { return $dir; } return \rtrim($dir, '\\/'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use React\Promise\PromiseInterface; /** * Downloader for tar files: tar, tar.gz or tar.bz2 * * @author Kirill chEbba Chebunin */ class TarDownloader extends \Composer\Downloader\ArchiveDownloader { /** * @inheritDoc */ protected function extract(PackageInterface $package, string $file, string $path) : PromiseInterface { // Can throw an UnexpectedValueException $archive = new \PharData($file); $archive->extractTo($path, null, \true); return \React\Promise\resolve(null); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Util\Platform; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use RuntimeException; /** * @author BohwaZ */ class FossilDownloader extends \Composer\Downloader\VcsDownloader { /** * @inheritDoc */ protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null) : PromiseInterface { return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doInstall(PackageInterface $package, string $path, string $url) : PromiseInterface { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); $repoFile = $path . '.fossil'; $realPath = Platform::realpath($path); $this->io->writeError("Cloning " . $package->getSourceReference()); $this->execute(['fossil', 'clone', '--', $url, $repoFile]); $this->execute(['fossil', 'open', '--nested', '--', $repoFile], $realPath); $this->execute(['fossil', 'update', '--', (string) $package->getSourceReference()], $realPath); return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url) : PromiseInterface { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); $this->io->writeError(" Updating to " . $target->getSourceReference()); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .fslckout file is missing from ' . $path . ', see https://getcomposer.org/commit-deps for more information'); } $realPath = Platform::realpath($path); $this->execute(['fossil', 'pull'], $realPath); $this->execute(['fossil', 'up', (string) $target->getSourceReference()], $realPath); return \React\Promise\resolve(null); } /** * @inheritDoc */ public function getLocalChanges(PackageInterface $package, string $path) : ?string { if (!$this->hasMetadataRepository($path)) { return null; } $this->process->execute(['fossil', 'changes'], $output, Platform::realpath($path)); $output = \trim($output); return \strlen($output) > 0 ? $output : null; } /** * @inheritDoc */ protected function getCommitLogs(string $fromReference, string $toReference, string $path) : string { $this->execute(['fossil', 'timeline', '-t', 'ci', '-W', '0', '-n', '0', 'before', $toReference], Platform::realpath($path), $output); $log = ''; $match = '/\\d\\d:\\d\\d:\\d\\d\\s+\\[' . $toReference . '\\]/'; foreach ($this->process->splitLines($output) as $line) { if (Preg::isMatch($match, $line)) { break; } $log .= $line; } return $log; } /** * @param non-empty-list $command * @throws \RuntimeException */ private function execute(array $command, ?string $cwd = null, ?string &$output = null) : void { if (0 !== $this->process->execute($command, $output, $cwd)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } } /** * @inheritDoc */ protected function hasMetadataRepository(string $path) : bool { return \is_file($path . '/.fslckout') || \is_file($path . '/_FOSSIL_'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; class MaxFileSizeExceededException extends \Composer\Downloader\TransportException { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use React\Promise\PromiseInterface; /** * Downloader interface. * * @author Konstantin Kudryashov * @author Jordi Boggiano */ interface DownloaderInterface { /** * Returns installation source (either source or dist). * * @return string "source" or "dist" */ public function getInstallationSource() : string; /** * This should do any network-related tasks to prepare for an upcoming install/update * * @param string $path download path * @phpstan-return PromiseInterface */ public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface; /** * Do anything that needs to be done between all downloads have been completed and the actual operation is executed * * All packages get first downloaded, then all together prepared, then all together installed/updated/uninstalled. Therefore * for error recovery it is important to avoid failing during install/update/uninstall as much as possible, and risky things or * user prompts should happen in the prepare step rather. In case of failure, cleanup() will be called so that changes can * be undone as much as possible. * * @param string $type one of install/update/uninstall * @param PackageInterface $package package instance * @param string $path download path * @param PackageInterface $prevPackage previous package instance in case of an update * @phpstan-return PromiseInterface */ public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface; /** * Installs specific package into specific folder. * * @param PackageInterface $package package instance * @param string $path download path * @phpstan-return PromiseInterface */ public function install(PackageInterface $package, string $path) : PromiseInterface; /** * Updates specific package in specific folder from initial to target version. * * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path * @phpstan-return PromiseInterface */ public function update(PackageInterface $initial, PackageInterface $target, string $path) : PromiseInterface; /** * Removes specific package from specific folder. * * @param PackageInterface $package package instance * @param string $path download path * @phpstan-return PromiseInterface */ public function remove(PackageInterface $package, string $path) : PromiseInterface; /** * Do anything to cleanup changes applied in the prepare or install/update/uninstall steps * * Note that cleanup will be called for all packages, either after install/update/uninstall is complete, * or if any package failed any operation. This is to give all installers a change to cleanup things * they did previously, so you need to keep track of changes applied in the installer/downloader themselves. * * @param string $type one of install/update/uninstall * @param PackageInterface $package package instance * @param string $path download path * @param PackageInterface $prevPackage previous package instance in case of an update * @phpstan-return PromiseInterface */ public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; use Composer\Util\ProcessExecutor; /** * Xz archive downloader. * * @author Pavel Puchkin * @author Pierre Rudloff */ class XzDownloader extends \Composer\Downloader\ArchiveDownloader { protected function extract(PackageInterface $package, string $file, string $path) : PromiseInterface { $command = ['tar', '-xJf', $file, '-C', $path]; if (0 === $this->process->execute($command, $ignoredOutput)) { return \React\Promise\resolve(null); } $processError = 'Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput(); throw new \RuntimeException($processError); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; use Composer\Util\ProcessExecutor; use Composer\Util\Hg as HgUtils; /** * @author Per Bernhardt */ class HgDownloader extends \Composer\Downloader\VcsDownloader { /** * @inheritDoc */ protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null) : PromiseInterface { if (null === HgUtils::getVersion($this->process)) { throw new \RuntimeException('hg was not found in your PATH, skipping source download'); } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doInstall(PackageInterface $package, string $path, string $url) : PromiseInterface { $hgUtils = new HgUtils($this->io, $this->config, $this->process); $cloneCommand = static function (string $url) use($path) : array { return ['hg', 'clone', '--', $url, $path]; }; $hgUtils->runCommand($cloneCommand, $url, $path); $command = ['hg', 'up', '--', (string) $package->getSourceReference()]; if (0 !== $this->process->execute($command, $ignoredOutput, \realpath($path))) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url) : PromiseInterface { $hgUtils = new HgUtils($this->io, $this->config, $this->process); $ref = $target->getSourceReference(); $this->io->writeError(" Updating to " . $target->getSourceReference()); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .hg directory is missing from ' . $path . ', see https://getcomposer.org/commit-deps for more information'); } $command = static function ($url) : array { return ['hg', 'pull', '--', $url]; }; $hgUtils->runCommand($command, $url, $path); $command = static function () use($ref) : array { return ['hg', 'up', '--', $ref]; }; $hgUtils->runCommand($command, $url, $path); return \React\Promise\resolve(null); } /** * @inheritDoc */ public function getLocalChanges(PackageInterface $package, string $path) : ?string { if (!\is_dir($path . '/.hg')) { return null; } $this->process->execute(['hg', 'st'], $output, \realpath($path)); $output = \trim($output); return \strlen($output) > 0 ? $output : null; } /** * @inheritDoc */ protected function getCommitLogs(string $fromReference, string $toReference, string $path) : string { $command = ['hg', 'log', '-r', $fromReference . ':' . $toReference, '--style', 'compact']; if (0 !== $this->process->execute($command, $output, \realpath($path))) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } return $output; } /** * @inheritDoc */ protected function hasMetadataRepository(string $path) : bool { return \is_dir($path . '/.hg'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Util\Svn as SvnUtil; use Composer\Repository\VcsRepository; use Composer\Util\ProcessExecutor; use React\Promise\PromiseInterface; /** * @author Ben Bieker * @author Till Klampaeckel */ class SvnDownloader extends \Composer\Downloader\VcsDownloader { /** @var bool */ protected $cacheCredentials = \true; /** * @inheritDoc */ protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null) : PromiseInterface { SvnUtil::cleanEnv(); $util = new SvnUtil($url, $this->io, $this->config, $this->process); if (null === $util->binaryVersion()) { throw new \RuntimeException('svn was not found in your PATH, skipping source download'); } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doInstall(PackageInterface $package, string $path, string $url) : PromiseInterface { SvnUtil::cleanEnv(); $ref = $package->getSourceReference(); $repo = $package->getRepository(); if ($repo instanceof VcsRepository) { $repoConfig = $repo->getRepoConfig(); if (\array_key_exists('svn-cache-credentials', $repoConfig)) { $this->cacheCredentials = (bool) $repoConfig['svn-cache-credentials']; } } $this->io->writeError(" Checking out " . $package->getSourceReference()); $this->execute($package, $url, ['svn', 'co'], \sprintf("%s/%s", $url, $ref), null, $path); return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url) : PromiseInterface { SvnUtil::cleanEnv(); $ref = $target->getSourceReference(); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .svn directory is missing from ' . $path . ', see https://getcomposer.org/commit-deps for more information'); } $util = new SvnUtil($url, $this->io, $this->config, $this->process); $flags = []; if (\version_compare($util->binaryVersion(), '1.7.0', '>=')) { $flags[] = '--ignore-ancestry'; } $this->io->writeError(" Checking out " . $ref); $this->execute($target, $url, \array_merge(['svn', 'switch'], $flags), \sprintf("%s/%s", $url, $ref), $path); return \React\Promise\resolve(null); } /** * @inheritDoc */ public function getLocalChanges(PackageInterface $package, string $path) : ?string { if (!$this->hasMetadataRepository($path)) { return null; } $this->process->execute(['svn', 'status', '--ignore-externals'], $output, $path); return Preg::isMatch('{^ *[^X ] +}m', $output) ? $output : null; } /** * Execute an SVN command and try to fix up the process with credentials * if necessary. * * @param string $baseUrl Base URL of the repository * @param non-empty-list $command SVN command to run * @param string $url SVN url * @param string $cwd Working directory * @param string $path Target for a checkout * @throws \RuntimeException */ protected function execute(PackageInterface $package, string $baseUrl, array $command, string $url, ?string $cwd = null, ?string $path = null) : string { $util = new SvnUtil($baseUrl, $this->io, $this->config, $this->process); $util->setCacheCredentials($this->cacheCredentials); try { return $util->execute($command, $url, $cwd, $path, $this->io->isVerbose()); } catch (\RuntimeException $e) { throw new \RuntimeException($package->getPrettyName() . ' could not be downloaded, ' . $e->getMessage()); } } /** * @inheritDoc */ protected function cleanChanges(PackageInterface $package, string $path, bool $update) : PromiseInterface { if (null === ($changes = $this->getLocalChanges($package, $path))) { return \React\Promise\resolve(null); } if (!$this->io->isInteractive()) { if (\true === $this->config->get('discard-changes')) { return $this->discardChanges($path); } return parent::cleanChanges($package, $path, $update); } $changes = \array_map(static function ($elem) : string { return ' ' . $elem; }, Preg::split('{\\s*\\r?\\n\\s*}', $changes)); $countChanges = \count($changes); $this->io->writeError(\sprintf(' ' . $package->getPrettyName() . ' has modified file%s:', $countChanges === 1 ? '' : 's')); $this->io->writeError(\array_slice($changes, 0, 10)); if ($countChanges > 10) { $remainingChanges = $countChanges - 10; $this->io->writeError(\sprintf(' ' . $remainingChanges . ' more file%s modified, choose "v" to view the full list', $remainingChanges === 1 ? '' : 's')); } while (\true) { switch ($this->io->ask(' Discard changes [y,n,v,?]? ', '?')) { case 'y': $this->discardChanges($path); break 2; case 'n': throw new \RuntimeException('Update aborted'); case 'v': $this->io->writeError($changes); break; case '?': default: $this->io->writeError([' y - discard changes and apply the ' . ($update ? 'update' : 'uninstall'), ' n - abort the ' . ($update ? 'update' : 'uninstall') . ' and let you manually clean things up', ' v - view modified files', ' ? - print help']); break; } } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function getCommitLogs(string $fromReference, string $toReference, string $path) : string { if (Preg::isMatch('{@(\\d+)$}', $fromReference) && Preg::isMatch('{@(\\d+)$}', $toReference)) { // retrieve the svn base url from the checkout folder $command = ['svn', 'info', '--non-interactive', '--xml', '--', $path]; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } $urlPattern = '#(.*)#'; if (Preg::isMatchStrictGroups($urlPattern, $output, $matches)) { $baseUrl = $matches[1]; } else { throw new \RuntimeException('Unable to determine svn url for path ' . $path); } // strip paths from references and only keep the actual revision $fromRevision = Preg::replace('{.*@(\\d+)$}', '$1', $fromReference); $toRevision = Preg::replace('{.*@(\\d+)$}', '$1', $toReference); $command = ['svn', 'log', '-r', $fromRevision . ':' . $toRevision, '--incremental']; $util = new SvnUtil($baseUrl, $this->io, $this->config, $this->process); $util->setCacheCredentials($this->cacheCredentials); try { return $util->executeLocal($command, $path, null, $this->io->isVerbose()); } catch (\RuntimeException $e) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $e->getMessage()); } } return "Could not retrieve changes between {$fromReference} and {$toReference} due to missing revision information"; } /** * @phpstan-return PromiseInterface */ protected function discardChanges(string $path) : PromiseInterface { if (0 !== $this->process->execute(['svn', 'revert', '-R', '.'], $output, $path)) { throw new \RuntimeException("Could not reset changes\n\n:" . $this->process->getErrorOutput()); } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function hasMetadataRepository(string $path) : bool { return \is_dir($path . '/.svn'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Cache; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Exception\IrrecoverableDownloadException; use Composer\Package\Comparer\Comparer; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; use Composer\Package\PackageInterface; use Composer\Plugin\PluginEvents; use Composer\Plugin\PostFileDownloadEvent; use Composer\Plugin\PreFileDownloadEvent; use Composer\EventDispatcher\EventDispatcher; use Composer\Util\Filesystem; use Composer\Util\Http\Response; use Composer\Util\Platform; use Composer\Util\Silencer; use Composer\Util\HttpDownloader; use Composer\Util\Url as UrlUtil; use Composer\Util\ProcessExecutor; use React\Promise\PromiseInterface; /** * Base downloader for files * * @author Kirill chEbba Chebunin * @author Jordi Boggiano * @author François Pluchino * @author Nils Adermann */ class FileDownloader implements \Composer\Downloader\DownloaderInterface, \Composer\Downloader\ChangeReportInterface { /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var HttpDownloader */ protected $httpDownloader; /** @var Filesystem */ protected $filesystem; /** @var ?Cache */ protected $cache; /** @var ?EventDispatcher */ protected $eventDispatcher; /** @var ProcessExecutor */ protected $process; /** * @var array * @private * @internal */ public static $downloadMetadata = []; /** * Collects response headers when running on GH Actions * * @see https://github.com/composer/composer/issues/11148 * @var array> * @private * @internal */ public static $responseHeaders = []; /** * @var array Map of package name to cache key */ private $lastCacheWrites = []; /** @var array Map of package name to list of paths */ private $additionalCleanupPaths = []; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The config * @param HttpDownloader $httpDownloader The remote filesystem * @param EventDispatcher $eventDispatcher The event dispatcher * @param Cache $cache Cache instance * @param Filesystem $filesystem The filesystem */ public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $eventDispatcher = null, ?Cache $cache = null, ?Filesystem $filesystem = null, ?ProcessExecutor $process = null) { $this->io = $io; $this->config = $config; $this->eventDispatcher = $eventDispatcher; $this->httpDownloader = $httpDownloader; $this->cache = $cache; $this->process = $process ?? new ProcessExecutor($io); $this->filesystem = $filesystem ?? new Filesystem($this->process); if ($this->cache !== null && $this->cache->gcIsNecessary()) { $this->io->writeError('Running cache garbage collection', \true, IOInterface::VERY_VERBOSE); $this->cache->gc($config->get('cache-files-ttl'), $config->get('cache-files-maxsize')); } } /** * @inheritDoc */ public function getInstallationSource() : string { return 'dist'; } /** * @inheritDoc */ public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = \true) : PromiseInterface { if (null === $package->getDistUrl()) { throw new \InvalidArgumentException('The given package is missing url information'); } $cacheKeyGenerator = static function (PackageInterface $package, $key) : string { $cacheKey = \hash('sha1', $key); return $package->getName() . '/' . $cacheKey . '.' . $package->getDistType(); }; $retries = 3; $distUrls = $package->getDistUrls(); /** @var array $urls */ $urls = []; foreach ($distUrls as $index => $url) { $processedUrl = $this->processUrl($package, $url); $urls[$index] = [ 'base' => $url, 'processed' => $processedUrl, // we use the complete download url here to avoid conflicting entries // from different packages, which would potentially allow a given package // in a third party repo to pre-populate the cache for the same package in // packagist for example. 'cacheKey' => $cacheKeyGenerator($package, $processedUrl), ]; } \assert(\count($urls) > 0); $fileName = $this->getFileName($package, $path); $this->filesystem->ensureDirectoryExists($path); $this->filesystem->ensureDirectoryExists(\dirname($fileName)); $accept = null; $reject = null; $download = function () use($output, $cacheKeyGenerator, $package, $fileName, &$urls, &$accept, &$reject) { $url = \reset($urls); $index = \key($urls); if ($this->eventDispatcher !== null) { $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $url['processed'], 'package', $package); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); if ($preFileDownloadEvent->getCustomCacheKey() !== null) { $url['cacheKey'] = $cacheKeyGenerator($package, $preFileDownloadEvent->getCustomCacheKey()); } elseif ($preFileDownloadEvent->getProcessedUrl() !== $url['processed']) { $url['cacheKey'] = $cacheKeyGenerator($package, $preFileDownloadEvent->getProcessedUrl()); } $url['processed'] = $preFileDownloadEvent->getProcessedUrl(); } $urls[$index] = $url; $checksum = $package->getDistSha1Checksum(); $cacheKey = $url['cacheKey']; // use from cache if it is present and has a valid checksum or we have no checksum to check against if ($this->cache !== null && ($checksum === null || $checksum === '' || $checksum === $this->cache->sha1($cacheKey)) && $this->cache->copyTo($cacheKey, $fileName)) { if ($output) { $this->io->writeError(" - Loading " . $package->getName() . " (" . $package->getFullPrettyVersion() . ") from cache", \true, IOInterface::VERY_VERBOSE); } // mark the file as having been written in cache even though it is only read from cache, so that if // the cache is corrupt the archive will be deleted and the next attempt will re-download it // see https://github.com/composer/composer/issues/10028 if (!$this->cache->isReadOnly()) { $this->lastCacheWrites[$package->getName()] = $cacheKey; } $result = \React\Promise\resolve($fileName); } else { if ($output) { $this->io->writeError(" - Downloading " . $package->getName() . " (" . $package->getFullPrettyVersion() . ")"); } $result = $this->httpDownloader->addCopy($url['processed'], $fileName, $package->getTransportOptions())->then($accept, $reject); } return $result->then(function ($result) use($fileName, $checksum, $url, $package) : string { // in case of retry, the first call's Promise chain finally calls this twice at the end, // once with $result being the returned $fileName from $accept, and then once for every // failed request with a null result, which can be skipped. if (null === $result) { return $fileName; } if (!\file_exists($fileName)) { throw new \UnexpectedValueException($url['base'] . ' could not be saved to ' . $fileName . ', make sure the' . ' directory is writable and you have internet connectivity'); } if ($checksum !== null && $checksum !== '' && \hash_file('sha1', $fileName) !== $checksum) { throw new \UnexpectedValueException('The checksum verification of the file failed (downloaded from ' . $url['base'] . ')'); } if ($this->eventDispatcher !== null) { $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, $fileName, $checksum, $url['processed'], 'package', $package); $this->eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } return $fileName; }); }; $accept = function (Response $response) use($package, $fileName, &$urls) : string { $url = \reset($urls); $cacheKey = $url['cacheKey']; $fileSize = @\filesize($fileName); if (\false === $fileSize) { $fileSize = $response->getHeader('Content-Length') ?? '?'; } \Composer\Downloader\FileDownloader::$downloadMetadata[$package->getName()] = $fileSize; if (Platform::getEnv('GITHUB_ACTIONS') !== \false && Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING') === \false) { \Composer\Downloader\FileDownloader::$responseHeaders[$package->getName()] = $response->getHeaders(); } if ($this->cache !== null && !$this->cache->isReadOnly()) { $this->lastCacheWrites[$package->getName()] = $cacheKey; $this->cache->copyFrom($cacheKey, $fileName); } $response->collect(); return $fileName; }; $reject = function ($e) use(&$urls, $download, $fileName, $package, &$retries) { // clean up if (\file_exists($fileName)) { $this->filesystem->unlink($fileName); } $this->clearLastCacheWrite($package); if ($e instanceof IrrecoverableDownloadException) { throw $e; } if ($e instanceof \Composer\Downloader\MaxFileSizeExceededException) { throw $e; } if ($e instanceof \Composer\Downloader\TransportException) { // if we got an http response with a proper code, then requesting again will probably not help, abort if (0 !== $e->getCode() && !\in_array($e->getCode(), [500, 502, 503, 504], \true)) { $retries = 0; } } // special error code returned when network is being artificially disabled if ($e instanceof \Composer\Downloader\TransportException && $e->getStatusCode() === 499) { $retries = 0; $urls = []; } if ($retries > 0) { \usleep(500000); $retries--; return $download(); } \array_shift($urls); if (\count($urls) > 0) { if ($this->io->isDebug()) { $this->io->writeError(' Failed downloading ' . $package->getName() . ': [' . \get_class($e) . '] ' . $e->getCode() . ': ' . $e->getMessage()); $this->io->writeError(' Trying the next URL for ' . $package->getName()); } else { $this->io->writeError(' Failed downloading ' . $package->getName() . ', trying the next URL (' . $e->getCode() . ': ' . $e->getMessage() . ')'); } $retries = 3; \usleep(100000); return $download(); } throw $e; }; return $download(); } /** * @inheritDoc */ public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { return \React\Promise\resolve(null); } /** * @inheritDoc */ public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { $fileName = $this->getFileName($package, $path); if (\file_exists($fileName)) { $this->filesystem->unlink($fileName); } $dirsToCleanUp = [$path, $this->config->get('vendor-dir') . '/' . \explode('/', $package->getPrettyName())[0], $this->config->get('vendor-dir') . '/composer/', $this->config->get('vendor-dir')]; if (isset($this->additionalCleanupPaths[$package->getName()])) { foreach ($this->additionalCleanupPaths[$package->getName()] as $pathToClean) { $this->filesystem->remove($pathToClean); } } foreach ($dirsToCleanUp as $dir) { if (\is_dir($dir) && $this->filesystem->isDirEmpty($dir) && \realpath($dir) !== Platform::getCwd()) { $this->filesystem->removeDirectoryPhp($dir); } } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function install(PackageInterface $package, string $path, bool $output = \true) : PromiseInterface { if ($output) { $this->io->writeError(" - " . InstallOperation::format($package)); } $vendorDir = $this->config->get('vendor-dir'); // clean up the target directory, unless it contains the vendor dir, as the vendor dir contains // the file to be installed. This is the case when installing with create-project in the current directory // but in that case we ensure the directory is empty already in ProjectInstaller so no need to empty it here. if (\false === \strpos($this->filesystem->normalizePath($vendorDir), $this->filesystem->normalizePath($path . \DIRECTORY_SEPARATOR))) { $this->filesystem->emptyDirectory($path); } $this->filesystem->ensureDirectoryExists($path); $this->filesystem->rename($this->getFileName($package, $path), $path . '/' . $this->getDistPath($package, \PATHINFO_BASENAME)); // Single files can not have a mode set like files in archives // so we make sure if the file is a binary that it is executable foreach ($package->getBinaries() as $bin) { if (\file_exists($path . '/' . $bin) && !\is_executable($path . '/' . $bin)) { Silencer::call('chmod', $path . '/' . $bin, 0777 & ~\umask()); } } return \React\Promise\resolve(null); } /** * @param PATHINFO_EXTENSION|PATHINFO_BASENAME $component */ protected function getDistPath(PackageInterface $package, int $component) : string { return \pathinfo((string) \parse_url(\strtr((string) $package->getDistUrl(), '\\', '/'), \PHP_URL_PATH), $component); } protected function clearLastCacheWrite(PackageInterface $package) : void { if ($this->cache !== null && isset($this->lastCacheWrites[$package->getName()])) { $this->cache->remove($this->lastCacheWrites[$package->getName()]); unset($this->lastCacheWrites[$package->getName()]); } } protected function addCleanupPath(PackageInterface $package, string $path) : void { $this->additionalCleanupPaths[$package->getName()][] = $path; } protected function removeCleanupPath(PackageInterface $package, string $path) : void { if (isset($this->additionalCleanupPaths[$package->getName()])) { $idx = \array_search($path, $this->additionalCleanupPaths[$package->getName()], \true); if (\false !== $idx) { unset($this->additionalCleanupPaths[$package->getName()][$idx]); } } } /** * @inheritDoc */ public function update(PackageInterface $initial, PackageInterface $target, string $path) : PromiseInterface { $this->io->writeError(" - " . UpdateOperation::format($initial, $target) . $this->getInstallOperationAppendix($target, $path)); $promise = $this->remove($initial, $path, \false); return $promise->then(function () use($target, $path) : PromiseInterface { return $this->install($target, $path, \false); }); } /** * @inheritDoc */ public function remove(PackageInterface $package, string $path, bool $output = \true) : PromiseInterface { if ($output) { $this->io->writeError(" - " . UninstallOperation::format($package)); } $promise = $this->filesystem->removeDirectoryAsync($path); return $promise->then(static function ($result) use($path) : void { if (!$result) { throw new \RuntimeException('Could not completely delete ' . $path . ', aborting.'); } }); } /** * Gets file name for specific package * * @param PackageInterface $package package instance * @param string $path download path * @return string file name */ protected function getFileName(PackageInterface $package, string $path) : string { $extension = $this->getDistPath($package, \PATHINFO_EXTENSION); if ($extension === '') { $extension = $package->getDistType(); } return \rtrim($this->config->get('vendor-dir') . '/composer/tmp-' . \hash('md5', $package . \spl_object_hash($package)) . '.' . $extension, '.'); } /** * Gets appendix message to add to the "- Upgrading x" string being output on update * * @param PackageInterface $package package instance * @param string $path download path */ protected function getInstallOperationAppendix(PackageInterface $package, string $path) : string { return ''; } /** * Process the download url * * @param PackageInterface $package package instance * @param non-empty-string $url download url * @throws \RuntimeException If any problem with the url * @return non-empty-string url */ protected function processUrl(PackageInterface $package, string $url) : string { if (!\extension_loaded('openssl') && 0 === \strpos($url, 'https:')) { throw new \RuntimeException('You must enable the openssl extension to download files via https'); } if ($package->getDistReference() !== null) { $url = UrlUtil::updateDistReference($this->config, $url, $package->getDistReference()); } return $url; } /** * @inheritDoc * @throws \RuntimeException */ public function getLocalChanges(PackageInterface $package, string $path) : ?string { $prevIO = $this->io; $this->io = new NullIO(); $this->io->loadConfiguration($this->config); $e = null; $output = ''; $targetDir = Filesystem::trimTrailingSlash($path); try { if (\is_dir($targetDir . '_compare')) { $this->filesystem->removeDirectory($targetDir . '_compare'); } $promise = $this->download($package, $targetDir . '_compare', null, \false); $promise->then(null, function ($ex) use(&$e) { $e = $ex; }); $this->httpDownloader->wait(); if ($e !== null) { throw $e; } $promise = $this->install($package, $targetDir . '_compare', \false); $promise->then(null, function ($ex) use(&$e) { $e = $ex; }); $this->process->wait(); if ($e !== null) { throw $e; } $comparer = new Comparer(); $comparer->setSource($targetDir . '_compare'); $comparer->setUpdate($targetDir); $comparer->doCompare(); $output = $comparer->getChangedAsString(\true); $this->filesystem->removeDirectory($targetDir . '_compare'); } catch (\Exception $e) { } $this->io = $prevIO; if ($e !== null) { if ($this->io->isDebug()) { throw $e; } return 'Failed to detect changes: [' . \get_class($e) . '] ' . $e->getMessage(); } $output = \trim($output); return \strlen($output) > 0 ? $output : null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * ChangeReport interface. * * @author Sascha Egerer */ interface ChangeReportInterface { /** * Checks for changes to the local copy * * @param PackageInterface $package package instance * @param string $path package directory * @return string|null changes or null */ public function getLocalChanges(PackageInterface $package, string $path) : ?string; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; /** * @author Jordi Boggiano */ class TransportException extends \RuntimeException { /** @var ?array */ protected $headers; /** @var ?string */ protected $response; /** @var ?int */ protected $statusCode; /** @var array */ protected $responseInfo = []; public function __construct(string $message = "", int $code = 400, ?\Throwable $previous = null) { parent::__construct($message, $code, $previous); } /** * @param array $headers */ public function setHeaders(array $headers) : void { $this->headers = $headers; } /** * @return ?array */ public function getHeaders() : ?array { return $this->headers; } public function setResponse(?string $response) : void { $this->response = $response; } /** * @return ?string */ public function getResponse() : ?string { return $this->response; } /** * @param ?int $statusCode */ public function setStatusCode($statusCode) : void { $this->statusCode = $statusCode; } /** * @return ?int */ public function getStatusCode() : ?int { return $this->statusCode; } /** * @return array */ public function getResponseInfo() : array { return $this->responseInfo; } /** * @param array $responseInfo */ public function setResponseInfo(array $responseInfo) : void { $this->responseInfo = $responseInfo; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Finder\Finder; use React\Promise\PromiseInterface; use Composer\DependencyResolver\Operation\InstallOperation; /** * Base downloader for archives * * @author Kirill chEbba Chebunin * @author Jordi Boggiano * @author François Pluchino */ abstract class ArchiveDownloader extends \Composer\Downloader\FileDownloader { /** * @var array */ protected $cleanupExecuted = []; public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { unset($this->cleanupExecuted[$package->getName()]); return parent::prepare($type, $package, $path, $prevPackage); } public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null) : PromiseInterface { $this->cleanupExecuted[$package->getName()] = \true; return parent::cleanup($type, $package, $path, $prevPackage); } /** * @inheritDoc * * @throws \RuntimeException * @throws \UnexpectedValueException */ public function install(PackageInterface $package, string $path, bool $output = \true) : PromiseInterface { if ($output) { $this->io->writeError(" - " . InstallOperation::format($package) . $this->getInstallOperationAppendix($package, $path)); } $vendorDir = $this->config->get('vendor-dir'); // clean up the target directory, unless it contains the vendor dir, as the vendor dir contains // the archive to be extracted. This is the case when installing with create-project in the current directory // but in that case we ensure the directory is empty already in ProjectInstaller so no need to empty it here. if (\false === \strpos($this->filesystem->normalizePath($vendorDir), $this->filesystem->normalizePath($path . \DIRECTORY_SEPARATOR))) { $this->filesystem->emptyDirectory($path); } do { $temporaryDir = $vendorDir . '/composer/' . \bin2hex(\random_bytes(4)); } while (\is_dir($temporaryDir)); $this->addCleanupPath($package, $temporaryDir); // avoid cleaning up $path if installing in "." for eg create-project as we can not // delete the directory we are currently in on windows if (!\is_dir($path) || \realpath($path) !== Platform::getCwd()) { $this->addCleanupPath($package, $path); } $this->filesystem->ensureDirectoryExists($temporaryDir); $fileName = $this->getFileName($package, $path); $filesystem = $this->filesystem; $cleanup = function () use($path, $filesystem, $temporaryDir, $package) { // remove cache if the file was corrupted $this->clearLastCacheWrite($package); // clean up $filesystem->removeDirectory($temporaryDir); if (\is_dir($path) && \realpath($path) !== Platform::getCwd()) { $filesystem->removeDirectory($path); } $this->removeCleanupPath($package, $temporaryDir); $realpath = \realpath($path); if ($realpath !== \false) { $this->removeCleanupPath($package, $realpath); } }; try { $promise = $this->extract($package, $fileName, $temporaryDir); } catch (\Exception $e) { $cleanup(); throw $e; } return $promise->then(function () use($package, $filesystem, $fileName, $temporaryDir, $path) : \React\Promise\PromiseInterface { if (\file_exists($fileName)) { $filesystem->unlink($fileName); } /** * Returns the folder content, excluding .DS_Store * * @param string $dir Directory * @return \SplFileInfo[] */ $getFolderContent = static function ($dir) : array { $finder = Finder::create()->ignoreVCS(\false)->ignoreDotFiles(\false)->notName('.DS_Store')->depth(0)->in($dir); return \iterator_to_array($finder); }; $renameRecursively = null; /** * Renames (and recursively merges if needed) a folder into another one * * For custom installers, where packages may share paths, and given Composer 2's parallelism, we need to make sure * that the source directory gets merged into the target one if the target exists. Otherwise rename() by default would * put the source into the target e.g. src/ => target/src/ (assuming target exists) instead of src/ => target/ * * @param string $from Directory * @param string $to Directory * @return void */ $renameRecursively = static function ($from, $to) use($filesystem, $getFolderContent, $package, &$renameRecursively) { $contentDir = $getFolderContent($from); // move files back out of the temp dir foreach ($contentDir as $file) { $file = (string) $file; if (\is_dir($to . '/' . \basename($file))) { if (!\is_dir($file)) { throw new \RuntimeException('Installing ' . $package . ' would lead to overwriting the ' . $to . '/' . \basename($file) . ' directory with a file from the package, invalid operation.'); } $renameRecursively($file, $to . '/' . \basename($file)); } else { $filesystem->rename($file, $to . '/' . \basename($file)); } } }; $renameAsOne = \false; if (!\file_exists($path)) { $renameAsOne = \true; } elseif ($filesystem->isDirEmpty($path)) { try { if ($filesystem->removeDirectoryPhp($path)) { $renameAsOne = \true; } } catch (\RuntimeException $e) { // ignore error, and simply do not renameAsOne } } $contentDir = $getFolderContent($temporaryDir); $singleDirAtTopLevel = 1 === \count($contentDir) && \is_dir((string) \reset($contentDir)); if ($renameAsOne) { // if the target $path is clear, we can rename the whole package in one go instead of looping over the contents if ($singleDirAtTopLevel) { $extractedDir = (string) \reset($contentDir); } else { $extractedDir = $temporaryDir; } $filesystem->rename($extractedDir, $path); } else { // only one dir in the archive, extract its contents out of it $from = $temporaryDir; if ($singleDirAtTopLevel) { $from = (string) \reset($contentDir); } $renameRecursively($from, $path); } $promise = $filesystem->removeDirectoryAsync($temporaryDir); return $promise->then(function () use($package, $path, $temporaryDir) { $this->removeCleanupPath($package, $temporaryDir); $this->removeCleanupPath($package, $path); }); }, static function ($e) use($cleanup) { $cleanup(); throw $e; }); } /** * @inheritDoc */ protected function getInstallOperationAppendix(PackageInterface $package, string $path) : string { return ': Extracting archive'; } /** * Extract file to directory * * @param string $file Extracted file * @param string $path Directory * @phpstan-return PromiseInterface * * @throws \UnexpectedValueException If can not extract downloaded file to path */ protected abstract function extract(PackageInterface $package, string $file, string $path) : PromiseInterface; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * DVCS Downloader interface. * * @author James Titcumb */ interface DvcsDownloaderInterface { /** * Checks for unpushed changes to a current branch * * @param PackageInterface $package package instance * @param string $path package directory * @return string|null changes or null */ public function getUnpushedChanges(PackageInterface $package, string $path) : ?string; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; /** * Downloader for phar files * * @author Kirill chEbba Chebunin */ class PharDownloader extends \Composer\Downloader\ArchiveDownloader { /** * @inheritDoc */ protected function extract(PackageInterface $package, string $file, string $path) : PromiseInterface { // Can throw an UnexpectedValueException $archive = new \Phar($file); $archive->extractTo($path, null, \true); /* TODO: handle openssl signed phars * https://github.com/composer/composer/pull/33#issuecomment-2250768 * https://github.com/koto/phar-util * http://blog.kotowicz.net/2010/08/hardening-php-how-to-securely-include.html */ return \React\Promise\resolve(null); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Package\Archiver\ArchivableFilesFinder; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Util\Platform; use Composer\Util\Filesystem; use _ContaoManager\Symfony\Component\Filesystem\Exception\IOException; use _ContaoManager\Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; /** * Download a package from a local path. * * @author Samuel Roze * @author Johann Reinke */ class PathDownloader extends \Composer\Downloader\FileDownloader implements \Composer\Downloader\VcsCapableDownloaderInterface { private const STRATEGY_SYMLINK = 10; private const STRATEGY_MIRROR = 20; /** * @inheritDoc */ public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = \true) : PromiseInterface { $path = Filesystem::trimTrailingSlash($path); $url = $package->getDistUrl(); if (null === $url) { throw new \RuntimeException('The package ' . $package->getPrettyName() . ' has no dist url configured, cannot download.'); } $realUrl = \realpath($url); if (\false === $realUrl || !\file_exists($realUrl) || !\is_dir($realUrl)) { throw new \RuntimeException(\sprintf('Source path "%s" is not found for package %s', $url, $package->getName())); } if (\realpath($path) === $realUrl) { return \React\Promise\resolve(null); } if (\strpos(\realpath($path) . \DIRECTORY_SEPARATOR, $realUrl . \DIRECTORY_SEPARATOR) === 0) { // IMPORTANT NOTICE: If you wish to change this, don't. You are wasting your time and ours. // // Please see https://github.com/composer/composer/pull/5974 and https://github.com/composer/composer/pull/6174 // for previous attempts that were shut down because they did not work well enough or introduced too many risks. throw new \RuntimeException(\sprintf('Package %s cannot install to "%s" inside its source at "%s"', $package->getName(), \realpath($path), $realUrl)); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function install(PackageInterface $package, string $path, bool $output = \true) : PromiseInterface { $path = Filesystem::trimTrailingSlash($path); $url = $package->getDistUrl(); if (null === $url) { throw new \RuntimeException('The package ' . $package->getPrettyName() . ' has no dist url configured, cannot install.'); } $realUrl = \realpath($url); if (\false === $realUrl) { throw new \RuntimeException('Failed to realpath ' . $url); } if (\realpath($path) === $realUrl) { if ($output) { $this->io->writeError(" - " . InstallOperation::format($package) . $this->getInstallOperationAppendix($package, $path)); } return \React\Promise\resolve(null); } // Get the transport options with default values $transportOptions = $package->getTransportOptions() + ['relative' => \true]; [$currentStrategy, $allowedStrategies] = $this->computeAllowedStrategies($transportOptions); $symfonyFilesystem = new SymfonyFilesystem(); $this->filesystem->removeDirectory($path); if ($output) { $this->io->writeError(" - " . InstallOperation::format($package) . ': ', \false); } $isFallback = \false; if (self::STRATEGY_SYMLINK === $currentStrategy) { try { if (Platform::isWindows()) { // Implement symlinks as NTFS junctions on Windows if ($output) { $this->io->writeError(\sprintf('Junctioning from %s', $url), \false); } $this->filesystem->junction($realUrl, $path); } else { $path = \rtrim($path, "/"); if ($output) { $this->io->writeError(\sprintf('Symlinking from %s', $url), \false); } if ($transportOptions['relative'] === \true) { $absolutePath = $path; if (!$this->filesystem->isAbsolutePath($absolutePath)) { $absolutePath = Platform::getCwd() . \DIRECTORY_SEPARATOR . $path; } $shortestPath = $this->filesystem->findShortestPath($absolutePath, $realUrl, \false, \true); $symfonyFilesystem->symlink($shortestPath . '/', $path); } else { $symfonyFilesystem->symlink($realUrl . '/', $path); } } } catch (IOException $e) { if (\in_array(self::STRATEGY_MIRROR, $allowedStrategies, \true)) { if ($output) { $this->io->writeError(''); $this->io->writeError(' Symlink failed, fallback to use mirroring!'); } $currentStrategy = self::STRATEGY_MIRROR; $isFallback = \true; } else { throw new \RuntimeException(\sprintf('Symlink from "%s" to "%s" failed!', $realUrl, $path)); } } } // Fallback if symlink failed or if symlink is not allowed for the package if (self::STRATEGY_MIRROR === $currentStrategy) { $realUrl = $this->filesystem->normalizePath($realUrl); if ($output) { $this->io->writeError(\sprintf('%sMirroring from %s', $isFallback ? ' ' : '', $url), \false); } $iterator = new ArchivableFilesFinder($realUrl, []); $symfonyFilesystem->mirror($realUrl, $path, $iterator); } if ($output) { $this->io->writeError(''); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function remove(PackageInterface $package, string $path, bool $output = \true) : PromiseInterface { $path = Filesystem::trimTrailingSlash($path); /** * realpath() may resolve Windows junctions to the source path, so we'll check for a junction first * to prevent a false positive when checking if the dist and install paths are the same. * See https://bugs.php.net/bug.php?id=77639 * * For junctions don't blindly rely on Filesystem::removeDirectory as it may be overzealous. If a process * inadvertently locks the file the removal will fail, but it would fall back to recursive delete which * is disastrous within a junction. So in that case we have no other real choice but to fail hard. */ if (Platform::isWindows() && $this->filesystem->isJunction($path)) { if ($output) { $this->io->writeError(" - " . UninstallOperation::format($package) . ", source is still present in {$path}"); } if (!$this->filesystem->removeJunction($path)) { $this->io->writeError(" Could not remove junction at " . $path . " - is another process locking it?"); throw new \RuntimeException('Could not reliably remove junction for package ' . $package->getName()); } return \React\Promise\resolve(null); } $url = $package->getDistUrl(); if (null === $url) { throw new \RuntimeException('The package ' . $package->getPrettyName() . ' has no dist url configured, cannot remove.'); } // ensure that the source path (dist url) is not the same as the install path, which // can happen when using custom installers, see https://github.com/composer/composer/pull/9116 // not using realpath here as we do not want to resolve the symlink to the original dist url // it points to $fs = new Filesystem(); $absPath = $fs->isAbsolutePath($path) ? $path : Platform::getCwd() . '/' . $path; $absDistUrl = $fs->isAbsolutePath($url) ? $url : Platform::getCwd() . '/' . $url; if ($fs->normalizePath($absPath) === $fs->normalizePath($absDistUrl)) { if ($output) { $this->io->writeError(" - " . UninstallOperation::format($package) . ", source is still present in {$path}"); } return \React\Promise\resolve(null); } return parent::remove($package, $path, $output); } /** * @inheritDoc */ public function getVcsReference(PackageInterface $package, string $path) : ?string { $path = Filesystem::trimTrailingSlash($path); $parser = new VersionParser(); $guesser = new VersionGuesser($this->config, $this->process, $parser, $this->io); $dumper = new ArrayDumper(); $packageConfig = $dumper->dump($package); $packageVersion = $guesser->guessVersion($packageConfig, $path); if ($packageVersion !== null) { return $packageVersion['commit']; } return null; } /** * @inheritDoc */ protected function getInstallOperationAppendix(PackageInterface $package, string $path) : string { $url = $package->getDistUrl(); if (null === $url) { throw new \RuntimeException('The package ' . $package->getPrettyName() . ' has no dist url configured, cannot install.'); } $realUrl = \realpath($url); if (\false === $realUrl) { throw new \RuntimeException('Failed to realpath ' . $url); } if (\realpath($path) === $realUrl) { return ': Source already present'; } [$currentStrategy] = $this->computeAllowedStrategies($package->getTransportOptions()); if ($currentStrategy === self::STRATEGY_SYMLINK) { if (Platform::isWindows()) { return ': Junctioning from ' . $package->getDistUrl(); } return ': Symlinking from ' . $package->getDistUrl(); } return ': Mirroring from ' . $package->getDistUrl(); } /** * @param mixed[] $transportOptions * * @phpstan-return array{self::STRATEGY_*, non-empty-list} */ private function computeAllowedStrategies(array $transportOptions) : array { // When symlink transport option is null, both symlink and mirror are allowed $currentStrategy = self::STRATEGY_SYMLINK; $allowedStrategies = [self::STRATEGY_SYMLINK, self::STRATEGY_MIRROR]; $mirrorPathRepos = Platform::getEnv('COMPOSER_MIRROR_PATH_REPOS'); if ((bool) $mirrorPathRepos) { $currentStrategy = self::STRATEGY_MIRROR; } $symlinkOption = $transportOptions['symlink'] ?? null; if (\true === $symlinkOption) { $currentStrategy = self::STRATEGY_SYMLINK; $allowedStrategies = [self::STRATEGY_SYMLINK]; } elseif (\false === $symlinkOption) { $currentStrategy = self::STRATEGY_MIRROR; $allowedStrategies = [self::STRATEGY_MIRROR]; } // Check we can use junctions safely if we are on Windows if (Platform::isWindows() && self::STRATEGY_SYMLINK === $currentStrategy && !$this->safeJunctions()) { if (!\in_array(self::STRATEGY_MIRROR, $allowedStrategies, \true)) { throw new \RuntimeException('You are on an old Windows / old PHP combo which does not allow Composer to use junctions/symlinks and this path repository has symlink:true in its options so copying is not allowed'); } $currentStrategy = self::STRATEGY_MIRROR; $allowedStrategies = [self::STRATEGY_MIRROR]; } // Check we can use symlink() otherwise if (!Platform::isWindows() && self::STRATEGY_SYMLINK === $currentStrategy && !\function_exists('symlink')) { if (!\in_array(self::STRATEGY_MIRROR, $allowedStrategies, \true)) { throw new \RuntimeException('Your PHP has the symlink() function disabled which does not allow Composer to use symlinks and this path repository has symlink:true in its options so copying is not allowed'); } $currentStrategy = self::STRATEGY_MIRROR; $allowedStrategies = [self::STRATEGY_MIRROR]; } return [$currentStrategy, $allowedStrategies]; } /** * Returns true if junctions can be created and safely used on Windows * * A PHP bug makes junction detection fragile, leading to possible data loss * when removing a package. See https://bugs.php.net/bug.php?id=77552 * * For safety we require a minimum version of Windows 7, so we can call the * system rmdir which will preserve target content if given a junction. * * The PHP bug was fixed in 7.2.16 and 7.3.3 (requires at least Windows 7). */ private function safeJunctions() : bool { // We need to call mklink, and rmdir on Windows 7 (version 6.1) return \function_exists('proc_open') && (\PHP_WINDOWS_VERSION_MAJOR > 6 || \PHP_WINDOWS_VERSION_MAJOR === 6 && \PHP_WINDOWS_VERSION_MINOR >= 1); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; use Composer\Repository\VcsRepository; use Composer\Util\Perforce; /** * @author Matt Whittom */ class PerforceDownloader extends \Composer\Downloader\VcsDownloader { /** @var Perforce|null */ protected $perforce; /** * @inheritDoc */ protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null) : PromiseInterface { return \React\Promise\resolve(null); } /** * @inheritDoc */ public function doInstall(PackageInterface $package, string $path, string $url) : PromiseInterface { $ref = $package->getSourceReference(); $label = $this->getLabelFromSourceReference((string) $ref); $this->io->writeError('Cloning ' . $ref); $this->initPerforce($package, $path, $url); $this->perforce->setStream($ref); $this->perforce->p4Login(); $this->perforce->writeP4ClientSpec(); $this->perforce->connectClient(); $this->perforce->syncCodeBase($label); $this->perforce->cleanupClientSpec(); return \React\Promise\resolve(null); } private function getLabelFromSourceReference(string $ref) : ?string { $pos = \strpos($ref, '@'); if (\false !== $pos) { return \substr($ref, $pos + 1); } return null; } public function initPerforce(PackageInterface $package, string $path, string $url) : void { if (!empty($this->perforce)) { $this->perforce->initializePath($path); return; } $repository = $package->getRepository(); $repoConfig = null; if ($repository instanceof VcsRepository) { $repoConfig = $this->getRepoConfig($repository); } $this->perforce = Perforce::create($repoConfig, $url, $path, $this->process, $this->io); } /** * @return array */ private function getRepoConfig(VcsRepository $repository) : array { return $repository->getRepoConfig(); } /** * @inheritDoc */ protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url) : PromiseInterface { return $this->doInstall($target, $path, $url); } /** * @inheritDoc */ public function getLocalChanges(PackageInterface $package, string $path) : ?string { $this->io->writeError('Perforce driver does not check for local changes before overriding'); return null; } /** * @inheritDoc */ protected function getCommitLogs(string $fromReference, string $toReference, string $path) : string { return $this->perforce->getCommitLogs($fromReference, $toReference); } public function setPerforce(Perforce $perforce) : void { $this->perforce = $perforce; } /** * @inheritDoc */ protected function hasMetadataRepository(string $path) : bool { return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Git as GitUtil; use Composer\Util\Url; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Cache; use React\Promise\PromiseInterface; /** * @author Jordi Boggiano */ class GitDownloader extends \Composer\Downloader\VcsDownloader implements \Composer\Downloader\DvcsDownloaderInterface { /** * @var bool[] * @phpstan-var array */ private $hasStashedChanges = []; /** * @var bool[] * @phpstan-var array */ private $hasDiscardedChanges = []; /** * @var GitUtil */ private $gitUtil; /** * @var array * @phpstan-var array> */ private $cachedPackages = []; public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?Filesystem $fs = null) { parent::__construct($io, $config, $process, $fs); $this->gitUtil = new GitUtil($this->io, $this->config, $this->process, $this->filesystem); } /** * @inheritDoc */ protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null) : PromiseInterface { // Do not create an extra local cache when repository is already local if (Filesystem::isLocalPath($url)) { return \React\Promise\resolve(null); } GitUtil::cleanEnv(); $cachePath = $this->config->get('cache-vcs-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($url)) . '/'; $gitVersion = GitUtil::getVersion($this->process); // --dissociate option is only available since git 2.3.0-rc0 if ($gitVersion && \version_compare($gitVersion, '2.3.0-rc0', '>=') && Cache::isUsable($cachePath)) { $this->io->writeError(" - Syncing " . $package->getName() . " (" . $package->getFullPrettyVersion() . ") into cache"); $this->io->writeError(\sprintf(' Cloning to cache at %s', $cachePath), \true, IOInterface::DEBUG); $ref = $package->getSourceReference(); if ($this->gitUtil->fetchRefOrSyncMirror($url, $cachePath, $ref, $package->getPrettyVersion()) && \is_dir($cachePath)) { $this->cachedPackages[$package->getId()][$ref] = \true; } } elseif (null === $gitVersion) { throw new \RuntimeException('git was not found in your PATH, skipping source download'); } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doInstall(PackageInterface $package, string $path, string $url) : PromiseInterface { GitUtil::cleanEnv(); $path = $this->normalizePath($path); $cachePath = $this->config->get('cache-vcs-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($url)) . '/'; $ref = $package->getSourceReference(); if (!empty($this->cachedPackages[$package->getId()][$ref])) { $msg = "Cloning " . $this->getShortHash($ref) . ' from cache'; $cloneFlags = ['--dissociate', '--reference', $cachePath]; $transportOptions = $package->getTransportOptions(); if (isset($transportOptions['git']['single_use_clone']) && $transportOptions['git']['single_use_clone']) { $cloneFlags = []; } $commands = [\array_merge(['git', 'clone', '--no-checkout', $cachePath, $path], $cloneFlags), ['git', 'remote', 'set-url', 'origin', '--', '%sanitizedUrl%'], ['git', 'remote', 'add', 'composer', '--', '%sanitizedUrl%']]; } else { $msg = "Cloning " . $this->getShortHash($ref); $commands = [\array_merge(['git', 'clone', '--no-checkout', '--', '%url%', $path]), ['git', 'remote', 'add', 'composer', '--', '%url%'], ['git', 'fetch', 'composer'], ['git', 'remote', 'set-url', 'origin', '--', '%sanitizedUrl%'], ['git', 'remote', 'set-url', 'composer', '--', '%sanitizedUrl%']]; if (Platform::getEnv('COMPOSER_DISABLE_NETWORK')) { throw new \RuntimeException('The required git reference for ' . $package->getName() . ' is not in cache and network is disabled, aborting'); } } $this->io->writeError($msg); $this->gitUtil->runCommands($commands, $url, $path, \true); $sourceUrl = $package->getSourceUrl(); if ($url !== $sourceUrl && $sourceUrl !== null) { $this->updateOriginUrl($path, $sourceUrl); } else { $this->setPushUrl($path, $url); } if ($newRef = $this->updateToCommit($package, $path, (string) $ref, $package->getPrettyVersion())) { if ($package->getDistReference() === $package->getSourceReference()) { $package->setDistReference($newRef); } $package->setSourceReference($newRef); } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url) : PromiseInterface { GitUtil::cleanEnv(); $path = $this->normalizePath($path); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .git directory is missing from ' . $path . ', see https://getcomposer.org/commit-deps for more information'); } $cachePath = $this->config->get('cache-vcs-dir') . '/' . Preg::replace('{[^a-z0-9.]}i', '-', Url::sanitize($url)) . '/'; $ref = $target->getSourceReference(); if (!empty($this->cachedPackages[$target->getId()][$ref])) { $msg = "Checking out " . $this->getShortHash($ref) . ' from cache'; $remoteUrl = $cachePath; } else { $msg = "Checking out " . $this->getShortHash($ref); $remoteUrl = '%url%'; if (Platform::getEnv('COMPOSER_DISABLE_NETWORK')) { throw new \RuntimeException('The required git reference for ' . $target->getName() . ' is not in cache and network is disabled, aborting'); } } $this->io->writeError($msg); if (0 !== $this->process->execute(['git', 'rev-parse', '--quiet', '--verify', $ref . '^{commit}'], $output, $path)) { $commands = [['git', 'remote', 'set-url', 'composer', '--', $remoteUrl], ['git', 'fetch', 'composer'], ['git', 'fetch', '--tags', 'composer']]; $this->gitUtil->runCommands($commands, $url, $path); } $command = ['git', 'remote', 'set-url', 'composer', '--', '%sanitizedUrl%']; $this->gitUtil->runCommands([$command], $url, $path); if ($newRef = $this->updateToCommit($target, $path, (string) $ref, $target->getPrettyVersion())) { if ($target->getDistReference() === $target->getSourceReference()) { $target->setDistReference($newRef); } $target->setSourceReference($newRef); } $updateOriginUrl = \false; if (0 === $this->process->execute(['git', 'remote', '-v'], $output, $path) && Preg::isMatch('{^origin\\s+(?P\\S+)}m', $output, $originMatch) && Preg::isMatch('{^composer\\s+(?P\\S+)}m', $output, $composerMatch)) { if ($originMatch['url'] === $composerMatch['url'] && $composerMatch['url'] !== $target->getSourceUrl()) { $updateOriginUrl = \true; } } if ($updateOriginUrl && $target->getSourceUrl() !== null) { $this->updateOriginUrl($path, $target->getSourceUrl()); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function getLocalChanges(PackageInterface $package, string $path) : ?string { GitUtil::cleanEnv(); if (!$this->hasMetadataRepository($path)) { return null; } $command = ['git', 'status', '--porcelain', '--untracked-files=no']; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } $output = \trim($output); return \strlen($output) > 0 ? $output : null; } public function getUnpushedChanges(PackageInterface $package, string $path) : ?string { GitUtil::cleanEnv(); $path = $this->normalizePath($path); if (!$this->hasMetadataRepository($path)) { return null; } $command = ['git', 'show-ref', '--head', '-d']; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } $refs = \trim($output); if (!Preg::isMatchStrictGroups('{^([a-f0-9]+) HEAD$}mi', $refs, $match)) { // could not match the HEAD for some reason return null; } $headRef = $match[1]; if (!Preg::isMatchAllStrictGroups('{^' . \preg_quote($headRef) . ' refs/heads/(.+)$}mi', $refs, $matches)) { // not on a branch, we are either on a not-modified tag or some sort of detached head, so skip this return null; } $candidateBranches = $matches[1]; // use the first match as branch name for now $branch = $candidateBranches[0]; $unpushedChanges = null; $branchNotFoundError = \false; // do two passes, as if we find anything we want to fetch and then re-try for ($i = 0; $i <= 1; $i++) { $remoteBranches = []; // try to find matching branch names in remote repos foreach ($candidateBranches as $candidate) { if (Preg::isMatchAllStrictGroups('{^[a-f0-9]+ refs/remotes/((?:[^/]+)/' . \preg_quote($candidate) . ')$}mi', $refs, $matches)) { foreach ($matches[1] as $match) { $branch = $candidate; $remoteBranches[] = $match; } break; } } // if it doesn't exist, then we assume it is an unpushed branch // this is bad as we have no reference point to do a diff so we just bail listing // the branch as being unpushed if (\count($remoteBranches) === 0) { $unpushedChanges = 'Branch ' . $branch . ' could not be found on any remote and appears to be unpushed'; $branchNotFoundError = \true; } else { // if first iteration found no remote branch but it has now found some, reset $unpushedChanges // so we get the real diff output no matter its length if ($branchNotFoundError) { $unpushedChanges = null; } foreach ($remoteBranches as $remoteBranch) { $command = ['git', 'diff', '--name-status', $remoteBranch . '...' . $branch, '--']; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } $output = \trim($output); // keep the shortest diff from all remote branches we compare against if ($unpushedChanges === null || \strlen($output) < \strlen($unpushedChanges)) { $unpushedChanges = $output; } } } // first pass and we found unpushed changes, fetch from all remotes to make sure we have up to date // remotes and then try again as outdated remotes can sometimes cause false-positives if ($unpushedChanges && $i === 0) { $this->process->execute(['git', 'fetch', '--all'], $output, $path); // update list of refs after fetching $command = ['git', 'show-ref', '--head', '-d']; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } $refs = \trim($output); } // abort after first pass if we didn't find anything if (!$unpushedChanges) { break; } } return $unpushedChanges; } /** * @inheritDoc */ protected function cleanChanges(PackageInterface $package, string $path, bool $update) : PromiseInterface { GitUtil::cleanEnv(); $path = $this->normalizePath($path); $unpushed = $this->getUnpushedChanges($package, $path); if ($unpushed && ($this->io->isInteractive() || $this->config->get('discard-changes') !== \true)) { throw new \RuntimeException('Source directory ' . $path . ' has unpushed changes on the current branch: ' . "\n" . $unpushed); } if (null === ($changes = $this->getLocalChanges($package, $path))) { return \React\Promise\resolve(null); } if (!$this->io->isInteractive()) { $discardChanges = $this->config->get('discard-changes'); if (\true === $discardChanges) { return $this->discardChanges($path); } if ('stash' === $discardChanges) { if (!$update) { return parent::cleanChanges($package, $path, $update); } return $this->stashChanges($path); } return parent::cleanChanges($package, $path, $update); } $changes = \array_map(static function ($elem) : string { return ' ' . $elem; }, Preg::split('{\\s*\\r?\\n\\s*}', $changes)); $this->io->writeError(' ' . $package->getPrettyName() . ' has modified files:'); $this->io->writeError(\array_slice($changes, 0, 10)); if (\count($changes) > 10) { $this->io->writeError(' ' . (\count($changes) - 10) . ' more files modified, choose "v" to view the full list'); } while (\true) { switch ($this->io->ask(' Discard changes [y,n,v,d,' . ($update ? 's,' : '') . '?]? ', '?')) { case 'y': $this->discardChanges($path); break 2; case 's': if (!$update) { goto help; } $this->stashChanges($path); break 2; case 'n': throw new \RuntimeException('Update aborted'); case 'v': $this->io->writeError($changes); break; case 'd': $this->viewDiff($path); break; case '?': default: help: $this->io->writeError([' y - discard changes and apply the ' . ($update ? 'update' : 'uninstall'), ' n - abort the ' . ($update ? 'update' : 'uninstall') . ' and let you manually clean things up', ' v - view modified files', ' d - view local modifications (diff)']); if ($update) { $this->io->writeError(' s - stash changes and try to reapply them after the update'); } $this->io->writeError(' ? - print help'); break; } } return \React\Promise\resolve(null); } /** * @inheritDoc */ protected function reapplyChanges(string $path) : void { $path = $this->normalizePath($path); if (!empty($this->hasStashedChanges[$path])) { unset($this->hasStashedChanges[$path]); $this->io->writeError(' Re-applying stashed changes'); if (0 !== $this->process->execute(['git', 'stash', 'pop'], $output, $path)) { throw new \RuntimeException("Failed to apply stashed changes:\n\n" . $this->process->getErrorOutput()); } } unset($this->hasDiscardedChanges[$path]); } /** * Updates the given path to the given commit ref * * @throws \RuntimeException * @return null|string if a string is returned, it is the commit reference that was checked out if the original could not be found */ protected function updateToCommit(PackageInterface $package, string $path, string $reference, string $prettyVersion) : ?string { $force = !empty($this->hasDiscardedChanges[$path]) || !empty($this->hasStashedChanges[$path]) ? ['-f'] : []; // This uses the "--" sequence to separate branch from file parameters. // // Otherwise git tries the branch name as well as file name. // If the non-existent branch is actually the name of a file, the file // is checked out. $branch = Preg::replace('{(?:^dev-|(?:\\.x)?-dev$)}i', '', $prettyVersion); /** * @var \Closure(non-empty-list): bool $execute * @phpstan-ignore varTag.nativeType */ $execute = function (array $command) use(&$output, $path) { /** @var non-empty-list $command */ $output = ''; return 0 === $this->process->execute($command, $output, $path); }; $branches = null; if ($execute(['git', 'branch', '-r'])) { $branches = $output; } // check whether non-commitish are branches or tags, and fetch branches with the remote name $gitRef = $reference; if (!Preg::isMatch('{^[a-f0-9]{40}$}', $reference) && null !== $branches && Preg::isMatch('{^\\s+composer/' . \preg_quote($reference) . '$}m', $branches)) { $command1 = \array_merge(['git', 'checkout'], $force, ['-B', $branch, 'composer/' . $reference, '--']); $command2 = ['git', 'reset', '--hard', 'composer/' . $reference, '--']; if ($execute($command1) && $execute($command2)) { return null; } } // try to checkout branch by name and then reset it so it's on the proper branch name if (Preg::isMatch('{^[a-f0-9]{40}$}', $reference)) { // add 'v' in front of the branch if it was stripped when generating the pretty name if (null !== $branches && !Preg::isMatch('{^\\s+composer/' . \preg_quote($branch) . '$}m', $branches) && Preg::isMatch('{^\\s+composer/v' . \preg_quote($branch) . '$}m', $branches)) { $branch = 'v' . $branch; } $command = ['git', 'checkout', $branch, '--']; $fallbackCommand = \array_merge(['git', 'checkout'], $force, ['-B', $branch, 'composer/' . $branch, '--']); $resetCommand = ['git', 'reset', '--hard', $reference, '--']; if (($execute($command) || $execute($fallbackCommand)) && $execute($resetCommand)) { return null; } } $command1 = \array_merge(['git', 'checkout'], $force, [$gitRef, '--']); $command2 = ['git', 'reset', '--hard', $gitRef, '--']; if ($execute($command1) && $execute($command2)) { return null; } $exceptionExtra = ''; // reference was not found (prints "fatal: reference is not a tree: $ref") if (\false !== \strpos($this->process->getErrorOutput(), $reference)) { $this->io->writeError(' ' . $reference . ' is gone (history was rewritten?)'); $exceptionExtra = "\nIt looks like the commit hash is not available in the repository, maybe " . ($package->isDev() ? 'the commit was removed from the branch' : 'the tag was recreated') . '? Run "composer update ' . $package->getPrettyName() . '" to resolve this.'; } $command = \implode(' ', $command1) . ' && ' . \implode(' ', $command2); throw new \RuntimeException(Url::sanitize('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput() . $exceptionExtra)); } protected function updateOriginUrl(string $path, string $url) : void { $this->process->execute(['git', 'remote', 'set-url', 'origin', '--', $url], $output, $path); $this->setPushUrl($path, $url); } protected function setPushUrl(string $path, string $url) : void { // set push url for github projects if (Preg::isMatch('{^(?:https?|git)://' . GitUtil::getGitHubDomainsRegex($this->config) . '/([^/]+)/([^/]+?)(?:\\.git)?$}', $url, $match)) { $protocols = $this->config->get('github-protocols'); $pushUrl = 'git@' . $match[1] . ':' . $match[2] . '/' . $match[3] . '.git'; if (!\in_array('ssh', $protocols, \true)) { $pushUrl = 'https://' . $match[1] . '/' . $match[2] . '/' . $match[3] . '.git'; } $cmd = ['git', 'remote', 'set-url', '--push', 'origin', '--', $pushUrl]; $this->process->execute($cmd, $ignoredOutput, $path); } } /** * @inheritDoc */ protected function getCommitLogs(string $fromReference, string $toReference, string $path) : string { $path = $this->normalizePath($path); $command = \array_merge(['git', 'log', $fromReference . '..' . $toReference, '--pretty=format:%h - %an: %s'], GitUtil::getNoShowSignatureFlags($this->process)); if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput()); } return $output; } /** * @phpstan-return PromiseInterface * @throws \RuntimeException */ protected function discardChanges(string $path) : PromiseInterface { $path = $this->normalizePath($path); if (0 !== $this->process->execute(['git', 'clean', '-df'], $output, $path)) { throw new \RuntimeException("Could not reset changes\n\n:" . $output); } if (0 !== $this->process->execute(['git', 'reset', '--hard'], $output, $path)) { throw new \RuntimeException("Could not reset changes\n\n:" . $output); } $this->hasDiscardedChanges[$path] = \true; return \React\Promise\resolve(null); } /** * @phpstan-return PromiseInterface * @throws \RuntimeException */ protected function stashChanges(string $path) : PromiseInterface { $path = $this->normalizePath($path); if (0 !== $this->process->execute(['git', 'stash', '--include-untracked'], $output, $path)) { throw new \RuntimeException("Could not stash changes\n\n:" . $output); } $this->hasStashedChanges[$path] = \true; return \React\Promise\resolve(null); } /** * @throws \RuntimeException */ protected function viewDiff(string $path) : void { $path = $this->normalizePath($path); if (0 !== $this->process->execute(['git', 'diff', 'HEAD'], $output, $path)) { throw new \RuntimeException("Could not view diff\n\n:" . $output); } $this->io->writeError($output); } protected function normalizePath(string $path) : string { if (Platform::isWindows() && \strlen($path) > 0) { $basePath = $path; $removed = []; while (!\is_dir($basePath) && $basePath !== '\\') { \array_unshift($removed, \basename($basePath)); $basePath = \dirname($basePath); } if ($basePath === '\\') { return $path; } $path = \rtrim(\realpath($basePath) . '/' . \implode('/', $removed), '/'); } return $path; } /** * @inheritDoc */ protected function hasMetadataRepository(string $path) : bool { $path = $this->normalizePath($path); return \is_dir($path . '/.git'); } protected function getShortHash(string $reference) : string { if (!$this->io->isVerbose() && Preg::isMatch('{^[0-9a-f]{40}$}', $reference)) { return \substr($reference, 0, 10); } return $reference; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Util\IniHelper; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; use _ContaoManager\Symfony\Component\Process\Process; use React\Promise\PromiseInterface; use ZipArchive; /** * @author Jordi Boggiano */ class ZipDownloader extends \Composer\Downloader\ArchiveDownloader { /** @var array> */ private static $unzipCommands; /** @var bool */ private static $hasZipArchive; /** @var bool */ private static $isWindows; /** @var ZipArchive|null */ private $zipArchiveObject; // @phpstan-ignore property.onlyRead (helper property that is set via reflection for testing purposes) /** * @inheritDoc */ public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = \true) : PromiseInterface { if (null === self::$unzipCommands) { self::$unzipCommands = []; $finder = new ExecutableFinder(); if (Platform::isWindows() && ($cmd = $finder->find('7z', null, ['C:\\Program Files\\7-Zip']))) { self::$unzipCommands[] = ['7z', $cmd, 'x', '-bb0', '-y', '%file%', '-o%path%']; } if ($cmd = $finder->find('unzip')) { self::$unzipCommands[] = ['unzip', $cmd, '-qq', '%file%', '-d', '%path%']; } if (!Platform::isWindows() && ($cmd = $finder->find('7z'))) { // 7z linux/macOS support is only used if unzip is not present self::$unzipCommands[] = ['7z', $cmd, 'x', '-bb0', '-y', '%file%', '-o%path%']; } if (!Platform::isWindows() && ($cmd = $finder->find('7zz'))) { // 7zz linux/macOS support is only used if unzip is not present self::$unzipCommands[] = ['7zz', $cmd, 'x', '-bb0', '-y', '%file%', '-o%path%']; } } $procOpenMissing = \false; if (!\function_exists('proc_open')) { self::$unzipCommands = []; $procOpenMissing = \true; } if (null === self::$hasZipArchive) { self::$hasZipArchive = \class_exists('ZipArchive'); } if (!self::$hasZipArchive && !self::$unzipCommands) { // php.ini path is added to the error message to help users find the correct file $iniMessage = IniHelper::getMessage(); if ($procOpenMissing) { $error = "The zip extension is missing and unzip/7z commands cannot be called as proc_open is disabled, skipping.\n" . $iniMessage; } else { $error = "The zip extension and unzip/7z commands are both missing, skipping.\n" . $iniMessage; } throw new \RuntimeException($error); } if (null === self::$isWindows) { self::$isWindows = Platform::isWindows(); if (!self::$isWindows && !self::$unzipCommands) { if ($procOpenMissing) { $this->io->writeError("proc_open is disabled so 'unzip' and '7z' commands cannot be used, zip files are being unpacked using the PHP zip extension."); $this->io->writeError("This may cause invalid reports of corrupted archives. Besides, any UNIX permissions (e.g. executable) defined in the archives will be lost."); $this->io->writeError("Enabling proc_open and installing 'unzip' or '7z' (21.01+) may remediate them."); } else { $this->io->writeError("As there is no 'unzip' nor '7z' command installed zip files are being unpacked using the PHP zip extension."); $this->io->writeError("This may cause invalid reports of corrupted archives. Besides, any UNIX permissions (e.g. executable) defined in the archives will be lost."); $this->io->writeError("Installing 'unzip' or '7z' (21.01+) may remediate them."); } } } return parent::download($package, $path, $prevPackage, $output); } /** * extract $file to $path with "unzip" command * * @param string $file File to extract * @param string $path Path where to extract file * @phpstan-return PromiseInterface */ private function extractWithSystemUnzip(PackageInterface $package, string $file, string $path) : PromiseInterface { static $warned7ZipLinux = \false; // Force Exception throwing if the other alternative extraction method is not available $isLastChance = !self::$hasZipArchive; if (0 === \count(self::$unzipCommands)) { // This was call as the favorite extract way, but is not available // We switch to the alternative return $this->extractWithZipArchive($package, $file, $path); } $commandSpec = \reset(self::$unzipCommands); $executable = $commandSpec[0]; $command = \array_slice($commandSpec, 1); $map = [ // normalize separators to backslashes to avoid problems with 7-zip on windows // see https://github.com/composer/composer/issues/10058 '%file%' => \strtr($file, '/', \DIRECTORY_SEPARATOR), '%path%' => \strtr($path, '/', \DIRECTORY_SEPARATOR), ]; $command = \array_map(static function ($value) use($map) { return \strtr($value, $map); }, $command); if (!$warned7ZipLinux && !Platform::isWindows() && \in_array($executable, ['7z', '7zz'], \true)) { $warned7ZipLinux = \true; if (0 === $this->process->execute([$commandSpec[1]], $output)) { if (Preg::isMatchStrictGroups('{^\\s*7-Zip(?: \\[64\\])? ([0-9.]+)}', $output, $match) && \version_compare($match[1], '21.01', '<')) { $this->io->writeError(' Unzipping using ' . $executable . ' ' . $match[1] . ' may result in incorrect file permissions. Install ' . $executable . ' 21.01+ or unzip to ensure you get correct permissions.'); } } } $io = $this->io; $tryFallback = function (\Throwable $processError) use($isLastChance, $io, $file, $path, $package, $executable) : \React\Promise\PromiseInterface { if ($isLastChance) { throw $processError; } if (\str_contains($processError->getMessage(), 'zip bomb')) { throw $processError; } if (!\is_file($file)) { $io->writeError(' ' . $processError->getMessage() . ''); $io->writeError(' This most likely is due to a custom installer plugin not handling the returned Promise from the downloader'); $io->writeError(' See https://github.com/composer/installers/commit/5006d0c28730ade233a8f42ec31ac68fb1c5c9bb for an example fix'); } else { $io->writeError(' ' . $processError->getMessage() . ''); $io->writeError(' The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems)'); $io->writeError(' Unzip with ' . $executable . ' command failed, falling back to ZipArchive class'); // additional debug data to try to figure out GH actions issues https://github.com/composer/composer/issues/11148 if (Platform::getEnv('GITHUB_ACTIONS') !== \false && Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING') === \false) { $io->writeError(' Additional debug info, please report to https://github.com/composer/composer/issues/11148 if you see this:'); $io->writeError('File size: ' . @\filesize($file)); $io->writeError('File SHA1: ' . \hash_file('sha1', $file)); $io->writeError('First 100 bytes (hex): ' . \bin2hex(\substr((string) \file_get_contents($file), 0, 100))); $io->writeError('Last 100 bytes (hex): ' . \bin2hex(\substr((string) \file_get_contents($file), -100))); if (\strlen((string) $package->getDistUrl()) > 0) { $io->writeError('Origin URL: ' . $this->processUrl($package, (string) $package->getDistUrl())); $io->writeError('Response Headers: ' . \json_encode(\Composer\Downloader\FileDownloader::$responseHeaders[$package->getName()] ?? [])); } } } return $this->extractWithZipArchive($package, $file, $path); }; try { $promise = $this->process->executeAsync($command); return $promise->then(function (Process $process) use($tryFallback, $command, $package, $file) { if (!$process->isSuccessful()) { if (isset($this->cleanupExecuted[$package->getName()])) { throw new \RuntimeException('Failed to extract ' . $package->getName() . ' as the installation was aborted by another package operation.'); } $output = $process->getErrorOutput(); $output = \str_replace(', ' . $file . '.zip or ' . $file . '.ZIP', '', $output); return $tryFallback(new \RuntimeException('Failed to extract ' . $package->getName() . ': (' . $process->getExitCode() . ') ' . \implode(' ', $command) . "\n\n" . $output)); } }); } catch (\Throwable $e) { return $tryFallback($e); } } /** * extract $file to $path with ZipArchive * * @param string $file File to extract * @param string $path Path where to extract file * @phpstan-return PromiseInterface */ private function extractWithZipArchive(PackageInterface $package, string $file, string $path) : PromiseInterface { $processError = null; $zipArchive = $this->zipArchiveObject ?: new ZipArchive(); try { if (!\file_exists($file) || ($filesize = \filesize($file)) === \false || $filesize === 0) { $retval = -1; } else { $retval = $zipArchive->open($file); } if (\true === $retval) { $totalSize = 0; $archiveSize = \filesize($file); $totalFiles = $zipArchive->count(); if ($totalFiles > 0) { for ($i = 0; $i < \min($totalFiles, 5); $i++) { $stat = $zipArchive->statIndex(\random_int(0, $totalFiles - 1)); if ($stat === \false) { continue; } $totalSize += $stat['size']; if ($stat['size'] > $stat['comp_size'] * 200) { throw new \RuntimeException('Invalid zip file with compression ratio >99% (possible zip bomb)'); } } if ($archiveSize !== \false && $totalSize > $archiveSize * 100 && $totalSize > 50 * 1024 * 1024) { throw new \RuntimeException('Invalid zip file with compression ratio >99% (possible zip bomb)'); } } $extractResult = $zipArchive->extractTo($path); if (\true === $extractResult) { $zipArchive->close(); return \React\Promise\resolve(null); } $processError = new \RuntimeException(\rtrim("There was an error extracting the ZIP file, it is either corrupted or using an invalid format.\n")); } else { $processError = new \UnexpectedValueException(\rtrim($this->getErrorMessage($retval, $file) . "\n"), $retval); } } catch (\ErrorException $e) { $processError = new \RuntimeException('The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems): ' . $e->getMessage(), 0, $e); } catch (\Throwable $e) { $processError = $e; } throw $processError; } /** * extract $file to $path * * @param string $file File to extract * @param string $path Path where to extract file */ protected function extract(PackageInterface $package, string $file, string $path) : PromiseInterface { return $this->extractWithSystemUnzip($package, $file, $path); } /** * Give a meaningful error message to the user. */ protected function getErrorMessage(int $retval, string $file) : string { switch ($retval) { case ZipArchive::ER_EXISTS: return \sprintf("File '%s' already exists.", $file); case ZipArchive::ER_INCONS: return \sprintf("Zip archive '%s' is inconsistent.", $file); case ZipArchive::ER_INVAL: return \sprintf("Invalid argument (%s)", $file); case ZipArchive::ER_MEMORY: return \sprintf("Malloc failure (%s)", $file); case ZipArchive::ER_NOENT: return \sprintf("No such zip file: '%s'", $file); case ZipArchive::ER_NOZIP: return \sprintf("'%s' is not a zip archive.", $file); case ZipArchive::ER_OPEN: return \sprintf("Can't open zip file: %s", $file); case ZipArchive::ER_READ: return \sprintf("Zip read error (%s)", $file); case ZipArchive::ER_SEEK: return \sprintf("Zip seek error (%s)", $file); case -1: return \sprintf("'%s' is a corrupted zip archive (0 bytes), try again.", $file); default: return \sprintf("'%s' is not a valid zip archive, got error code: %s", $file, $retval); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; /** * GZip archive downloader. * * @author Pavel Puchkin */ class GzipDownloader extends \Composer\Downloader\ArchiveDownloader { protected function extract(PackageInterface $package, string $file, string $path) : PromiseInterface { $filename = \pathinfo(\parse_url(\strtr((string) $package->getDistUrl(), '\\', '/'), \PHP_URL_PATH), \PATHINFO_FILENAME); $targetFilepath = $path . \DIRECTORY_SEPARATOR . $filename; // Try to use gunzip on *nix if (!Platform::isWindows()) { $command = ['sh', '-c', 'gzip -cd -- "$0" > "$1"', $file, $targetFilepath]; if (0 === $this->process->execute($command, $ignoredOutput)) { return \React\Promise\resolve(null); } if (\extension_loaded('zlib')) { // Fallback to using the PHP extension. $this->extractUsingExt($file, $targetFilepath); return \React\Promise\resolve(null); } $processError = 'Failed to execute ' . \implode(' ', $command) . "\n\n" . $this->process->getErrorOutput(); throw new \RuntimeException($processError); } // Windows version of PHP has built-in support of gzip functions $this->extractUsingExt($file, $targetFilepath); return \React\Promise\resolve(null); } private function extractUsingExt(string $file, string $targetFilepath) : void { $archiveFile = \gzopen($file, 'rb'); $targetFile = \fopen($targetFilepath, 'wb'); while ($string = \gzread($archiveFile, 4096)) { \fwrite($targetFile, $string, Platform::strlen($string)); } \gzclose($archiveFile); \fclose($targetFile); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Advisory\Auditor; use Composer\Config\ConfigSourceInterface; use Composer\Downloader\TransportException; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; /** * @author Jordi Boggiano */ class Config { public const SOURCE_DEFAULT = 'default'; public const SOURCE_COMMAND = 'command'; public const SOURCE_UNKNOWN = 'unknown'; public const RELATIVE_PATHS = 1; /** @var array */ public static $defaultConfig = [ 'process-timeout' => 300, 'use-include-path' => \false, 'allow-plugins' => [], 'use-parent-dir' => 'prompt', 'preferred-install' => 'dist', 'audit' => ['ignore' => [], 'abandoned' => Auditor::ABANDONED_FAIL], 'notify-on-install' => \true, 'github-protocols' => ['https', 'ssh', 'git'], 'gitlab-protocol' => null, 'vendor-dir' => 'vendor', 'bin-dir' => '{$vendor-dir}/bin', 'cache-dir' => '{$home}/cache', 'data-dir' => '{$home}', 'cache-files-dir' => '{$cache-dir}/files', 'cache-repo-dir' => '{$cache-dir}/repo', 'cache-vcs-dir' => '{$cache-dir}/vcs', 'cache-ttl' => 15552000, // 6 months 'cache-files-ttl' => null, // fallback to cache-ttl 'cache-files-maxsize' => '300MiB', 'cache-read-only' => \false, 'bin-compat' => 'auto', 'discard-changes' => \false, 'autoloader-suffix' => null, 'sort-packages' => \false, 'optimize-autoloader' => \false, 'classmap-authoritative' => \false, 'apcu-autoloader' => \false, 'prepend-autoloader' => \true, 'github-domains' => ['github.com'], 'bitbucket-expose-hostname' => \true, 'disable-tls' => \false, 'secure-http' => \true, 'secure-svn-domains' => [], 'cafile' => null, 'capath' => null, 'github-expose-hostname' => \true, 'gitlab-domains' => ['gitlab.com'], 'store-auths' => 'prompt', 'platform' => [], 'archive-format' => 'tar', 'archive-dir' => '.', 'htaccess-protect' => \true, 'use-github-api' => \true, 'lock' => \true, 'platform-check' => 'php-only', 'bitbucket-oauth' => [], 'github-oauth' => [], 'gitlab-oauth' => [], 'gitlab-token' => [], 'http-basic' => [], 'bearer' => [], 'bump-after-update' => \false, 'allow-missing-requirements' => \false, ]; /** @var array */ public static $defaultRepositories = ['packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org']]; /** @var array */ private $config; /** @var ?non-empty-string */ private $baseDir; /** @var array */ private $repositories; /** @var ConfigSourceInterface */ private $configSource; /** @var ConfigSourceInterface */ private $authConfigSource; /** @var ConfigSourceInterface|null */ private $localAuthConfigSource = null; /** @var bool */ private $useEnvironment; /** @var array */ private $warnedHosts = []; /** @var array */ private $sslVerifyWarnedHosts = []; /** @var array */ private $sourceOfConfigValue = []; /** * @param bool $useEnvironment Use COMPOSER_ environment variables to replace config settings * @param ?string $baseDir Optional base directory of the config */ public function __construct(bool $useEnvironment = \true, ?string $baseDir = null) { // load defaults $this->config = static::$defaultConfig; $this->repositories = static::$defaultRepositories; $this->useEnvironment = $useEnvironment; $this->baseDir = \is_string($baseDir) && '' !== $baseDir ? $baseDir : null; foreach ($this->config as $configKey => $configValue) { $this->setSourceOfConfigValue($configValue, $configKey, self::SOURCE_DEFAULT); } foreach ($this->repositories as $configKey => $configValue) { $this->setSourceOfConfigValue($configValue, 'repositories.' . $configKey, self::SOURCE_DEFAULT); } } /** * Changing this can break path resolution for relative config paths so do not call this without knowing what you are doing * * The $baseDir should be an absolute path and without trailing slash * * @param non-empty-string|null $baseDir */ public function setBaseDir(?string $baseDir) : void { $this->baseDir = $baseDir; } public function setConfigSource(ConfigSourceInterface $source) : void { $this->configSource = $source; } public function getConfigSource() : ConfigSourceInterface { return $this->configSource; } public function setAuthConfigSource(ConfigSourceInterface $source) : void { $this->authConfigSource = $source; } public function getAuthConfigSource() : ConfigSourceInterface { return $this->authConfigSource; } public function setLocalAuthConfigSource(ConfigSourceInterface $source) : void { $this->localAuthConfigSource = $source; } public function getLocalAuthConfigSource() : ?ConfigSourceInterface { return $this->localAuthConfigSource; } /** * Merges new config values with the existing ones (overriding) * * @param array{config?: array, repositories?: array} $config */ public function merge(array $config, string $source = self::SOURCE_UNKNOWN) : void { // override defaults with given config if (!empty($config['config']) && \is_array($config['config'])) { foreach ($config['config'] as $key => $val) { if (\in_array($key, ['bitbucket-oauth', 'github-oauth', 'gitlab-oauth', 'gitlab-token', 'http-basic', 'bearer'], \true) && isset($this->config[$key])) { $this->config[$key] = \array_merge($this->config[$key], $val); $this->setSourceOfConfigValue($val, $key, $source); } elseif (\in_array($key, ['allow-plugins'], \true) && isset($this->config[$key]) && \is_array($this->config[$key]) && \is_array($val)) { // merging $val first to get the local config on top of the global one, then appending the global config, // then merging local one again to make sure the values from local win over global ones for keys present in both $this->config[$key] = \array_merge($val, $this->config[$key], $val); $this->setSourceOfConfigValue($val, $key, $source); } elseif (\in_array($key, ['gitlab-domains', 'github-domains'], \true) && isset($this->config[$key])) { $this->config[$key] = \array_unique(\array_merge($this->config[$key], $val)); $this->setSourceOfConfigValue($val, $key, $source); } elseif ('preferred-install' === $key && isset($this->config[$key])) { if (\is_array($val) || \is_array($this->config[$key])) { if (\is_string($val)) { $val = ['*' => $val]; } if (\is_string($this->config[$key])) { $this->config[$key] = ['*' => $this->config[$key]]; $this->sourceOfConfigValue[$key . '*'] = $source; } $this->config[$key] = \array_merge($this->config[$key], $val); $this->setSourceOfConfigValue($val, $key, $source); // the full match pattern needs to be last if (isset($this->config[$key]['*'])) { $wildcard = $this->config[$key]['*']; unset($this->config[$key]['*']); $this->config[$key]['*'] = $wildcard; } } else { $this->config[$key] = $val; $this->setSourceOfConfigValue($val, $key, $source); } } elseif ('audit' === $key) { $currentIgnores = $this->config['audit']['ignore']; $this->config[$key] = \array_merge($this->config['audit'], $val); $this->setSourceOfConfigValue($val, $key, $source); $this->config['audit']['ignore'] = \array_merge($currentIgnores, $val['ignore'] ?? []); } else { $this->config[$key] = $val; $this->setSourceOfConfigValue($val, $key, $source); } } } if (!empty($config['repositories']) && \is_array($config['repositories'])) { $this->repositories = \array_reverse($this->repositories, \true); $newRepos = \array_reverse($config['repositories'], \true); foreach ($newRepos as $name => $repository) { // disable a repository by name if (\false === $repository) { $this->disableRepoByName((string) $name); continue; } // disable a repository with an anonymous {"name": false} repo if (\is_array($repository) && 1 === \count($repository) && \false === \current($repository)) { $this->disableRepoByName((string) \key($repository)); continue; } // auto-deactivate the default packagist.org repo if it gets redefined if (isset($repository['type'], $repository['url']) && $repository['type'] === 'composer' && Preg::isMatch('{^https?://(?:[a-z0-9-.]+\\.)?packagist.org(/|$)}', $repository['url'])) { $this->disableRepoByName('packagist.org'); } // store repo if (\is_int($name)) { $this->repositories[] = $repository; $this->setSourceOfConfigValue($repository, 'repositories.' . \array_search($repository, $this->repositories, \true), $source); } else { if ($name === 'packagist') { // BC support for default "packagist" named repo $this->repositories[$name . '.org'] = $repository; $this->setSourceOfConfigValue($repository, 'repositories.' . $name . '.org', $source); } else { $this->repositories[$name] = $repository; $this->setSourceOfConfigValue($repository, 'repositories.' . $name, $source); } } } $this->repositories = \array_reverse($this->repositories, \true); } } /** * @return array */ public function getRepositories() : array { return $this->repositories; } /** * Returns a setting * * @param int $flags Options (see class constants) * @throws \RuntimeException * * @return mixed */ public function get(string $key, int $flags = 0) { switch ($key) { // strings/paths with env var and {$refs} support case 'vendor-dir': case 'bin-dir': case 'process-timeout': case 'data-dir': case 'cache-dir': case 'cache-files-dir': case 'cache-repo-dir': case 'cache-vcs-dir': case 'cafile': case 'capath': // convert foo-bar to COMPOSER_FOO_BAR and check if it exists since it overrides the local config $env = 'COMPOSER_' . \strtoupper(\strtr($key, '-', '_')); $val = $this->getComposerEnv($env); if ($val !== \false) { $this->setSourceOfConfigValue($val, $key, $env); } if ($key === 'process-timeout') { return \max(0, \false !== $val ? (int) $val : $this->config[$key]); } $val = \rtrim((string) $this->process(\false !== $val ? $val : $this->config[$key], $flags), '/\\'); $val = Platform::expandPath($val); if (\substr($key, -4) !== '-dir') { return $val; } return ($flags & self::RELATIVE_PATHS) === self::RELATIVE_PATHS ? $val : $this->realpath($val); // booleans with env var support case 'cache-read-only': case 'htaccess-protect': // convert foo-bar to COMPOSER_FOO_BAR and check if it exists since it overrides the local config $env = 'COMPOSER_' . \strtoupper(\strtr($key, '-', '_')); $val = $this->getComposerEnv($env); if (\false === $val) { $val = $this->config[$key]; } else { $this->setSourceOfConfigValue($val, $key, $env); } return $val !== 'false' && (bool) $val; // booleans without env var support case 'disable-tls': case 'secure-http': case 'use-github-api': case 'lock': // special case for secure-http if ($key === 'secure-http' && $this->get('disable-tls') === \true) { return \false; } return $this->config[$key] !== 'false' && (bool) $this->config[$key]; // ints without env var support case 'cache-ttl': return \max(0, (int) $this->config[$key]); // numbers with kb/mb/gb support, without env var support case 'cache-files-maxsize': if (!Preg::isMatch('/^\\s*([0-9.]+)\\s*(?:([kmg])(?:i?b)?)?\\s*$/i', (string) $this->config[$key], $matches)) { throw new \RuntimeException("Could not parse the value of '{$key}': {$this->config[$key]}"); } $size = (float) $matches[1]; if (isset($matches[2])) { switch (\strtolower($matches[2])) { case 'g': $size *= 1024; // intentional fallthrough // no break case 'm': $size *= 1024; // intentional fallthrough // no break case 'k': $size *= 1024; break; } } return \max(0, (int) $size); // special cases below case 'cache-files-ttl': if (isset($this->config[$key])) { return \max(0, (int) $this->config[$key]); } return $this->get('cache-ttl'); case 'home': return \rtrim($this->process(Platform::expandPath($this->config[$key]), $flags), '/\\'); case 'bin-compat': $value = $this->getComposerEnv('COMPOSER_BIN_COMPAT') ?: $this->config[$key]; if (!\in_array($value, ['auto', 'full', 'proxy', 'symlink'])) { throw new \RuntimeException("Invalid value for 'bin-compat': {$value}. Expected auto, full or proxy"); } if ($value === 'symlink') { \trigger_error('config.bin-compat "symlink" is deprecated since Composer 2.2, use auto, full (for Windows compatibility) or proxy instead.', \E_USER_DEPRECATED); } return $value; case 'discard-changes': $env = $this->getComposerEnv('COMPOSER_DISCARD_CHANGES'); if ($env !== \false) { if (!\in_array($env, ['stash', 'true', 'false', '1', '0'], \true)) { throw new \RuntimeException("Invalid value for COMPOSER_DISCARD_CHANGES: {$env}. Expected 1, 0, true, false or stash"); } if ('stash' === $env) { return 'stash'; } // convert string value to bool return $env !== 'false' && (bool) $env; } if (!\in_array($this->config[$key], [\true, \false, 'stash'], \true)) { throw new \RuntimeException("Invalid value for 'discard-changes': {$this->config[$key]}. Expected true, false or stash"); } return $this->config[$key]; case 'github-protocols': $protos = $this->config['github-protocols']; if ($this->config['secure-http'] && \false !== ($index = \array_search('git', $protos))) { unset($protos[$index]); } if (\reset($protos) === 'http') { throw new \RuntimeException('The http protocol for github is not available anymore, update your config\'s github-protocols to use "https", "git" or "ssh"'); } return $protos; case 'autoloader-suffix': if ($this->config[$key] === '') { // we need to guarantee null or non-empty-string return null; } return $this->process($this->config[$key], $flags); case 'audit': $result = $this->config[$key]; $abandonedEnv = $this->getComposerEnv('COMPOSER_AUDIT_ABANDONED'); if (\false !== $abandonedEnv) { if (!\in_array($abandonedEnv, $validChoices = Auditor::ABANDONEDS, \true)) { throw new \RuntimeException("Invalid value for COMPOSER_AUDIT_ABANDONED: {$abandonedEnv}. Expected one of " . \implode(', ', Auditor::ABANDONEDS) . "."); } $result['abandoned'] = $abandonedEnv; } return $result; default: if (!isset($this->config[$key])) { return null; } return $this->process($this->config[$key], $flags); } } /** * @return array */ public function all(int $flags = 0) : array { $all = ['repositories' => $this->getRepositories()]; foreach (\array_keys($this->config) as $key) { $all['config'][$key] = $this->get($key, $flags); } return $all; } public function getSourceOfValue(string $key) : string { $this->get($key); return $this->sourceOfConfigValue[$key] ?? self::SOURCE_UNKNOWN; } /** * @param mixed $configValue */ private function setSourceOfConfigValue($configValue, string $path, string $source) : void { $this->sourceOfConfigValue[$path] = $source; if (\is_array($configValue)) { foreach ($configValue as $key => $value) { $this->setSourceOfConfigValue($value, $path . '.' . $key, $source); } } } /** * @return array */ public function raw() : array { return ['repositories' => $this->getRepositories(), 'config' => $this->config]; } /** * Checks whether a setting exists */ public function has(string $key) : bool { return \array_key_exists($key, $this->config); } /** * Replaces {$refs} inside a config string * * @param string|mixed $value a config string that can contain {$refs-to-other-config} * @param int $flags Options (see class constants) * * @return string|mixed */ private function process($value, int $flags) { if (!\is_string($value)) { return $value; } return Preg::replaceCallback('#\\{\\$(.+)\\}#', function ($match) use($flags) { return $this->get($match[1], $flags); }, $value); } /** * Turns relative paths in absolute paths without realpath() * * Since the dirs might not exist yet we can not call realpath or it will fail. */ private function realpath(string $path) : string { if (Preg::isMatch('{^(?:/|[a-z]:|[a-z0-9.]+://|\\\\\\\\)}i', $path)) { return $path; } return $this->baseDir !== null ? $this->baseDir . '/' . $path : $path; } /** * Reads the value of a Composer environment variable * * This should be used to read COMPOSER_ environment variables * that overload config values. * * @param non-empty-string $var * * @return string|false */ private function getComposerEnv(string $var) { if ($this->useEnvironment) { return Platform::getEnv($var); } return \false; } private function disableRepoByName(string $name) : void { if (isset($this->repositories[$name])) { unset($this->repositories[$name]); } elseif ($name === 'packagist') { // BC support for default "packagist" named repo unset($this->repositories['packagist.org']); } } /** * Validates that the passed URL is allowed to be used by current config, or throws an exception. * * @param IOInterface $io * @param mixed[] $repoOptions */ public function prohibitUrlByConfig(string $url, ?IOInterface $io = null, array $repoOptions = []) : void { // Return right away if the URL is malformed or custom (see issue #5173), but only for non-HTTP(S) URLs if (\false === \filter_var($url, \FILTER_VALIDATE_URL) && !Preg::isMatch('{^https?://}', $url)) { return; } // Extract scheme and throw exception on known insecure protocols $scheme = \parse_url($url, \PHP_URL_SCHEME); $hostname = \parse_url($url, \PHP_URL_HOST); if (\in_array($scheme, ['http', 'git', 'ftp', 'svn'])) { if ($this->get('secure-http')) { if ($scheme === 'svn') { if (\in_array($hostname, $this->get('secure-svn-domains'), \true)) { return; } throw new TransportException("Your configuration does not allow connections to {$url}. See https://getcomposer.org/doc/06-config.md#secure-svn-domains for details."); } throw new TransportException("Your configuration does not allow connections to {$url}. See https://getcomposer.org/doc/06-config.md#secure-http for details."); } if ($io !== null) { if (\is_string($hostname)) { if (!isset($this->warnedHosts[$hostname])) { $io->writeError("Warning: Accessing {$hostname} over {$scheme} which is an insecure protocol."); } $this->warnedHosts[$hostname] = \true; } } } if ($io !== null && \is_string($hostname) && !isset($this->sslVerifyWarnedHosts[$hostname])) { $warning = null; if (isset($repoOptions['ssl']['verify_peer']) && !(bool) $repoOptions['ssl']['verify_peer']) { $warning = 'verify_peer'; } if (isset($repoOptions['ssl']['verify_peer_name']) && !(bool) $repoOptions['ssl']['verify_peer_name']) { $warning = $warning === null ? 'verify_peer_name' : $warning . ' and verify_peer_name'; } if ($warning !== null) { $io->writeError("Warning: Accessing {$hostname} with {$warning} disabled."); $this->sslVerifyWarnedHosts[$hostname] = \true; } } } /** * Used by long-running custom scripts in composer.json * * "scripts": { * "watch": [ * "Composer\\Config::disableProcessTimeout", * "vendor/bin/long-running-script --watch" * ] * } */ public static function disableProcessTimeout() : void { // Override global timeout set earlier by environment or config ProcessExecutor::setTimeout(0); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Script; use Composer\Composer; use Composer\IO\IOInterface; use Composer\EventDispatcher\Event as BaseEvent; /** * The script event class * * @author François Pluchino * @author Nils Adermann */ class Event extends BaseEvent { /** * @var Composer The composer instance */ private $composer; /** * @var IOInterface The IO instance */ private $io; /** * @var bool Dev mode flag */ private $devMode; /** * @var BaseEvent|null */ private $originatingEvent; /** * Constructor. * * @param string $name The event name * @param Composer $composer The composer object * @param IOInterface $io The IOInterface object * @param bool $devMode Whether or not we are in dev mode * @param array $args Arguments passed by the user * @param mixed[] $flags Optional flags to pass data not as argument */ public function __construct(string $name, Composer $composer, IOInterface $io, bool $devMode = \false, array $args = [], array $flags = []) { parent::__construct($name, $args, $flags); $this->composer = $composer; $this->io = $io; $this->devMode = $devMode; } /** * Returns the composer instance. */ public function getComposer() : Composer { return $this->composer; } /** * Returns the IO instance. */ public function getIO() : IOInterface { return $this->io; } /** * Return the dev mode flag */ public function isDevMode() : bool { return $this->devMode; } /** * Set the originating event. * * @return ?BaseEvent */ public function getOriginatingEvent() : ?BaseEvent { return $this->originatingEvent; } /** * Set the originating event. * * @return $this */ public function setOriginatingEvent(BaseEvent $event) : self { $this->originatingEvent = $this->calculateOriginatingEvent($event); return $this; } /** * Returns the upper-most event in chain. */ private function calculateOriginatingEvent(BaseEvent $event) : BaseEvent { if ($event instanceof \Composer\Script\Event && $event->getOriginatingEvent()) { return $this->calculateOriginatingEvent($event->getOriginatingEvent()); } return $event; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Script; /** * The Script Events. * * @author François Pluchino * @author Jordi Boggiano */ class ScriptEvents { /** * The PRE_INSTALL_CMD event occurs before the install command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const PRE_INSTALL_CMD = 'pre-install-cmd'; /** * The POST_INSTALL_CMD event occurs after the install command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_INSTALL_CMD = 'post-install-cmd'; /** * The PRE_UPDATE_CMD event occurs before the update command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const PRE_UPDATE_CMD = 'pre-update-cmd'; /** * The POST_UPDATE_CMD event occurs after the update command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_UPDATE_CMD = 'post-update-cmd'; /** * The PRE_STATUS_CMD event occurs before the status command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const PRE_STATUS_CMD = 'pre-status-cmd'; /** * The POST_STATUS_CMD event occurs after the status command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_STATUS_CMD = 'post-status-cmd'; /** * The PRE_AUTOLOAD_DUMP event occurs before the autoload file is generated. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const PRE_AUTOLOAD_DUMP = 'pre-autoload-dump'; /** * The POST_AUTOLOAD_DUMP event occurs after the autoload file has been generated. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_AUTOLOAD_DUMP = 'post-autoload-dump'; /** * The POST_ROOT_PACKAGE_INSTALL event occurs after the root package has been installed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_ROOT_PACKAGE_INSTALL = 'post-root-package-install'; /** * The POST_CREATE_PROJECT event occurs after the create-project command has been executed. * Note: Event occurs after POST_INSTALL_CMD * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_CREATE_PROJECT_CMD = 'post-create-project-cmd'; /** * The PRE_ARCHIVE_CMD event occurs before the update command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const PRE_ARCHIVE_CMD = 'pre-archive-cmd'; /** * The POST_ARCHIVE_CMD event occurs after the status command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ public const POST_ARCHIVE_CMD = 'post-archive-cmd'; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Question; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Console\Exception\InvalidArgumentException; use _ContaoManager\Symfony\Component\Console\Question\Question; /** * Represents a yes/no question * Enforces strict responses rather than non-standard answers counting as default * Based on Symfony\Component\Console\Question\ConfirmationQuestion * * @author Theo Tonge */ class StrictConfirmationQuestion extends Question { /** @var non-empty-string */ private $trueAnswerRegex; /** @var non-empty-string */ private $falseAnswerRegex; /** * Constructor.s * * @param string $question The question to ask to the user * @param bool $default The default answer to return, true or false * @param non-empty-string $trueAnswerRegex A regex to match the "yes" answer * @param non-empty-string $falseAnswerRegex A regex to match the "no" answer */ public function __construct(string $question, bool $default = \true, string $trueAnswerRegex = '/^y(?:es)?$/i', string $falseAnswerRegex = '/^no?$/i') { parent::__construct($question, $default); $this->trueAnswerRegex = $trueAnswerRegex; $this->falseAnswerRegex = $falseAnswerRegex; $this->setNormalizer($this->getDefaultNormalizer()); $this->setValidator($this->getDefaultValidator()); } /** * Returns the default answer normalizer. */ private function getDefaultNormalizer() : callable { $default = $this->getDefault(); $trueRegex = $this->trueAnswerRegex; $falseRegex = $this->falseAnswerRegex; return static function ($answer) use($default, $trueRegex, $falseRegex) { if (\is_bool($answer)) { return $answer; } if (empty($answer) && !empty($default)) { return $default; } if (Preg::isMatch($trueRegex, $answer)) { return \true; } if (Preg::isMatch($falseRegex, $answer)) { return \false; } return null; }; } /** * Returns the default answer validator. */ private function getDefaultValidator() : callable { return static function ($answer) : bool { if (!\is_bool($answer)) { throw new InvalidArgumentException('Please answer yes, y, no, or n.'); } return $answer; }; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Package\Locker; use Composer\Pcre\Preg; use Composer\Plugin\PluginManager; use Composer\Downloader\DownloadManager; use Composer\Autoload\AutoloadGenerator; use Composer\Package\Archiver\ArchiveManager; /** * @author Jordi Boggiano * @author Konstantin Kudryashiv * @author Nils Adermann */ class Composer extends \Composer\PartialComposer { /* * Examples of the following constants in the various configurations they can be in * * You are probably better off using Composer::getVersion() though as that will always return something usable * * releases (phar): * const VERSION = '1.8.2'; * const BRANCH_ALIAS_VERSION = ''; * const RELEASE_DATE = '2019-01-29 15:00:53'; * const SOURCE_VERSION = ''; * * snapshot builds (phar): * const VERSION = 'd3873a05650e168251067d9648845c220c50e2d7'; * const BRANCH_ALIAS_VERSION = '1.9-dev'; * const RELEASE_DATE = '2019-02-20 07:43:56'; * const SOURCE_VERSION = ''; * * source (git clone): * const VERSION = '@package_version@'; * const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; * * @see getVersion() */ public const VERSION = '2.8.6'; public const BRANCH_ALIAS_VERSION = ''; public const RELEASE_DATE = '2025-02-25 13:03:50'; public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package * * This is used to version features available to projects at runtime * like the platform-check file, the Composer\InstalledVersions class * and possibly others in the future. * * @var string */ public const RUNTIME_API_VERSION = '2.2.2'; public static function getVersion() : string { // no replacement done, this must be a source checkout if (self::VERSION === '@package_version' . '@') { return self::SOURCE_VERSION; } // we have a branch alias and version is a commit id, this must be a snapshot build if (self::BRANCH_ALIAS_VERSION !== '' && Preg::isMatch('{^[a-f0-9]{40}$}', self::VERSION)) { return self::BRANCH_ALIAS_VERSION . '+' . self::VERSION; } return self::VERSION; } /** * @var Locker */ private $locker; /** * @var Downloader\DownloadManager */ private $downloadManager; /** * @var Plugin\PluginManager */ private $pluginManager; /** * @var Autoload\AutoloadGenerator */ private $autoloadGenerator; /** * @var ArchiveManager */ private $archiveManager; public function setLocker(Locker $locker) : void { $this->locker = $locker; } public function getLocker() : Locker { return $this->locker; } public function setDownloadManager(DownloadManager $manager) : void { $this->downloadManager = $manager; } public function getDownloadManager() : DownloadManager { return $this->downloadManager; } public function setArchiveManager(ArchiveManager $manager) : void { $this->archiveManager = $manager; } public function getArchiveManager() : ArchiveManager { return $this->archiveManager; } public function setPluginManager(PluginManager $manager) : void { $this->pluginManager = $manager; } public function getPluginManager() : PluginManager { return $this->pluginManager; } public function setAutoloadGenerator(AutoloadGenerator $autoloadGenerator) : void { $this->autoloadGenerator = $autoloadGenerator; } public function getAutoloadGenerator() : AutoloadGenerator { return $this->autoloadGenerator; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use Exception; /** * @author Jordi Boggiano */ class JsonValidationException extends Exception { /** * @var string[] */ protected $errors; /** * @param string[] $errors */ public function __construct(string $message, array $errors = [], ?Exception $previous = null) { $this->errors = $errors; parent::__construct((string) $message, 0, $previous); } /** * @return string[] */ public function getErrors() : array { return $this->errors; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use Composer\Pcre\Preg; /** * Formats json strings used for php < 5.4 because the json_encode doesn't * supports the flags JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE * in these versions * * @author Konstantin Kudryashiv * @author Jordi Boggiano * * @deprecated Use json_encode or JsonFile::encode() with modern JSON_* flags to configure formatting - this class will be removed in 3.0 */ class JsonFormatter { /** * This code is based on the function found at: * http://recursive-design.com/blog/2008/03/11/format-json-with-php/ * * Originally licensed under MIT by Dave Perrett * * @param bool $unescapeUnicode Un escape unicode * @param bool $unescapeSlashes Un escape slashes */ public static function format(string $json, bool $unescapeUnicode, bool $unescapeSlashes) : string { $result = ''; $pos = 0; $strLen = \strlen($json); $indentStr = ' '; $newLine = "\n"; $outOfQuotes = \true; $buffer = ''; $noescape = \true; for ($i = 0; $i < $strLen; $i++) { // Grab the next character in the string $char = \substr($json, $i, 1); // Are we inside a quoted string? if ('"' === $char && $noescape) { $outOfQuotes = !$outOfQuotes; } if (!$outOfQuotes) { $buffer .= $char; $noescape = '\\' === $char ? !$noescape : \true; continue; } if ('' !== $buffer) { if ($unescapeSlashes) { $buffer = \str_replace('\\/', '/', $buffer); } if ($unescapeUnicode && \function_exists('mb_convert_encoding')) { // https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha $buffer = Preg::replaceCallback('/(\\\\+)u([0-9a-f]{4})/i', static function ($match) : string { $l = \strlen($match[1]); if ($l % 2) { $code = \hexdec($match[2]); // 0xD800..0xDFFF denotes UTF-16 surrogate pair which won't be unescaped // see https://github.com/composer/composer/issues/7510 if (0xd800 <= $code && 0xdfff >= $code) { return $match[0]; } return \str_repeat('\\', $l - 1) . \mb_convert_encoding(\pack('H*', $match[2]), 'UTF-8', 'UCS-2BE'); } return $match[0]; }, $buffer); } $result .= $buffer . $char; $buffer = ''; continue; } if (':' === $char) { // Add a space after the : character $char .= ' '; } elseif ('}' === $char || ']' === $char) { $pos--; $prevChar = \substr($json, $i - 1, 1); if ('{' !== $prevChar && '[' !== $prevChar) { // If this character is the end of an element, // output a new line and indent the next line $result .= $newLine; $result .= \str_repeat($indentStr, $pos); } else { // Collapse empty {} and [] $result = \rtrim($result); } } $result .= $char; // If the last character was the beginning of an element, // output a new line and indent the next line if (',' === $char || '{' === $char || '[' === $char) { $result .= $newLine; if ('{' === $char || '[' === $char) { $pos++; } $result .= \str_repeat($indentStr, $pos); } } return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use _ContaoManager\JsonSchema\Validator; use _ContaoManager\Seld\JsonLint\JsonParser; use _ContaoManager\Seld\JsonLint\ParsingException; use Composer\Util\HttpDownloader; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; /** * Reads/writes json files. * * @author Konstantin Kudryashiv * @author Jordi Boggiano */ class JsonFile { public const LAX_SCHEMA = 1; public const STRICT_SCHEMA = 2; public const AUTH_SCHEMA = 3; public const LOCK_SCHEMA = 4; /** @deprecated Use \JSON_UNESCAPED_SLASHES */ public const JSON_UNESCAPED_SLASHES = 64; /** @deprecated Use \JSON_PRETTY_PRINT */ public const JSON_PRETTY_PRINT = 128; /** @deprecated Use \JSON_UNESCAPED_UNICODE */ public const JSON_UNESCAPED_UNICODE = 256; public const COMPOSER_SCHEMA_PATH = __DIR__ . '/../../../res/composer-schema.json'; public const LOCK_SCHEMA_PATH = __DIR__ . '/../../../res/composer-lock-schema.json'; public const INDENT_DEFAULT = ' '; /** @var string */ private $path; /** @var ?HttpDownloader */ private $httpDownloader; /** @var ?IOInterface */ private $io; /** @var string */ private $indent = self::INDENT_DEFAULT; /** * Initializes json file reader/parser. * * @param string $path path to a lockfile * @param ?HttpDownloader $httpDownloader required for loading http/https json files * @param ?IOInterface $io * @throws \InvalidArgumentException */ public function __construct(string $path, ?HttpDownloader $httpDownloader = null, ?IOInterface $io = null) { $this->path = $path; if (null === $httpDownloader && Preg::isMatch('{^https?://}i', $path)) { throw new \InvalidArgumentException('http urls require a HttpDownloader instance to be passed'); } $this->httpDownloader = $httpDownloader; $this->io = $io; } public function getPath() : string { return $this->path; } /** * Checks whether json file exists. */ public function exists() : bool { return \is_file($this->path); } /** * Reads json file. * * @throws ParsingException * @throws \RuntimeException * @return mixed */ public function read() { try { if ($this->httpDownloader) { $json = $this->httpDownloader->get($this->path)->getBody(); } else { if (!Filesystem::isReadable($this->path)) { throw new \RuntimeException('The file "' . $this->path . '" is not readable.'); } if ($this->io && $this->io->isDebug()) { $realpathInfo = ''; $realpath = \realpath($this->path); if (\false !== $realpath && $realpath !== $this->path) { $realpathInfo = ' (' . $realpath . ')'; } $this->io->writeError('Reading ' . $this->path . $realpathInfo); } $json = \file_get_contents($this->path); } } catch (TransportException $e) { throw new \RuntimeException($e->getMessage(), 0, $e); } catch (\Exception $e) { throw new \RuntimeException('Could not read ' . $this->path . "\n\n" . $e->getMessage()); } if ($json === \false) { throw new \RuntimeException('Could not read ' . $this->path); } $this->indent = self::detectIndenting($json); return static::parseJson($json, $this->path); } /** * Writes json file. * * @param mixed[] $hash writes hash into json file * @param int $options json_encode options * @throws \UnexpectedValueException|\Exception * @return void */ public function write(array $hash, int $options = \JSON_UNESCAPED_SLASHES | \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE) { if ($this->path === 'php://memory') { \file_put_contents($this->path, static::encode($hash, $options, $this->indent)); return; } $dir = \dirname($this->path); if (!\is_dir($dir)) { if (\file_exists($dir)) { throw new \UnexpectedValueException(\realpath($dir) . ' exists and is not a directory.'); } if (!@\mkdir($dir, 0777, \true)) { throw new \UnexpectedValueException($dir . ' does not exist and could not be created.'); } } $retries = 3; while ($retries--) { try { $this->filePutContentsIfModified($this->path, static::encode($hash, $options, $this->indent) . ($options & \JSON_PRETTY_PRINT ? "\n" : '')); break; } catch (\Exception $e) { if ($retries > 0) { \usleep(500000); continue; } throw $e; } } } /** * Modify file properties only if content modified * * @return int|false */ private function filePutContentsIfModified(string $path, string $content) { $currentContent = @\file_get_contents($path); if (\false === $currentContent || $currentContent !== $content) { return \file_put_contents($path, $content); } return 0; } /** * Validates the schema of the current json file according to composer-schema.json rules * * @param int $schema a JsonFile::*_SCHEMA constant * @param string|null $schemaFile a path to the schema file * @throws JsonValidationException * @throws ParsingException * @return true true on success * * @phpstan-param self::*_SCHEMA $schema */ public function validateSchema(int $schema = self::STRICT_SCHEMA, ?string $schemaFile = null) : bool { if (!Filesystem::isReadable($this->path)) { throw new \RuntimeException('The file "' . $this->path . '" is not readable.'); } $content = \file_get_contents($this->path); $data = \json_decode($content); if (null === $data && 'null' !== $content) { self::validateSyntax($content, $this->path); } return self::validateJsonSchema($this->path, $data, $schema, $schemaFile); } /** * Validates the schema of the current json file according to composer-schema.json rules * * @param mixed $data Decoded JSON data to validate * @param int $schema a JsonFile::*_SCHEMA constant * @param string|null $schemaFile a path to the schema file * @throws JsonValidationException * @return true true on success * * @phpstan-param self::*_SCHEMA $schema */ public static function validateJsonSchema(string $source, $data, int $schema, ?string $schemaFile = null) : bool { $isComposerSchemaFile = \false; if (null === $schemaFile) { if ($schema === self::LOCK_SCHEMA) { $schemaFile = self::LOCK_SCHEMA_PATH; } else { $isComposerSchemaFile = \true; $schemaFile = self::COMPOSER_SCHEMA_PATH; } } // Prepend with file:// only when not using a special schema already (e.g. in the phar) if (\false === \strpos($schemaFile, '://')) { $schemaFile = 'file://' . $schemaFile; } $schemaData = (object) ['$ref' => $schemaFile]; if ($schema === self::LAX_SCHEMA) { $schemaData->additionalProperties = \true; $schemaData->required = []; } elseif ($schema === self::STRICT_SCHEMA && $isComposerSchemaFile) { $schemaData->additionalProperties = \false; $schemaData->required = ['name', 'description']; } elseif ($schema === self::AUTH_SCHEMA && $isComposerSchemaFile) { $schemaData = (object) ['$ref' => $schemaFile . '#/properties/config', '$schema' => "https://json-schema.org/draft-04/schema#"]; } $validator = new Validator(); $validator->check($data, $schemaData); if (!$validator->isValid()) { $errors = []; foreach ((array) $validator->getErrors() as $error) { $errors[] = ($error['property'] ? $error['property'] . ' : ' : '') . $error['message']; } throw new \Composer\Json\JsonValidationException('"' . $source . '" does not match the expected JSON schema', $errors); } return \true; } /** * Encodes an array into (optionally pretty-printed) JSON * * @param mixed $data Data to encode into a formatted JSON string * @param int $options json_encode options (defaults to JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) * @param string $indent Indentation string * @return string Encoded json */ public static function encode($data, int $options = 448, string $indent = self::INDENT_DEFAULT) : string { $json = \json_encode($data, $options); if (\false === $json) { self::throwEncodeError(\json_last_error()); } if (($options & \JSON_PRETTY_PRINT) > 0 && $indent !== self::INDENT_DEFAULT) { // Pretty printing and not using default indentation return Preg::replaceCallback('#^ {4,}#m', static function ($match) use($indent) : string { return \str_repeat($indent, (int) (\strlen($match[0]) / 4)); }, $json); } return $json; } /** * Throws an exception according to a given code with a customized message * * @param int $code return code of json_last_error function * @throws \RuntimeException * @return never */ private static function throwEncodeError(int $code) : void { switch ($code) { case \JSON_ERROR_DEPTH: $msg = 'Maximum stack depth exceeded'; break; case \JSON_ERROR_STATE_MISMATCH: $msg = 'Underflow or the modes mismatch'; break; case \JSON_ERROR_CTRL_CHAR: $msg = 'Unexpected control character found'; break; case \JSON_ERROR_UTF8: $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: $msg = 'Unknown error'; } throw new \RuntimeException('JSON encoding failed: ' . $msg); } /** * Parses json string and returns hash. * * @param null|string $json json string * @param string $file the json file * * @throws ParsingException * @return mixed */ public static function parseJson(?string $json, ?string $file = null) { if (null === $json) { return null; } $data = \json_decode($json, \true); if (null === $data && \JSON_ERROR_NONE !== \json_last_error()) { self::validateSyntax($json, $file); } return $data; } /** * Validates the syntax of a JSON string * * @param string $file * @throws \UnexpectedValueException * @throws ParsingException * @return bool true on success */ protected static function validateSyntax(string $json, ?string $file = null) : bool { $parser = new JsonParser(); $result = $parser->lint($json); if (null === $result) { if (\defined('JSON_ERROR_UTF8') && \JSON_ERROR_UTF8 === \json_last_error()) { if ($file === null) { throw new \UnexpectedValueException('The input is not UTF-8, could not parse as JSON'); } else { throw new \UnexpectedValueException('"' . $file . '" is not UTF-8, could not parse as JSON'); } } return \true; } if ($file === null) { throw new ParsingException('The input does not contain valid JSON' . "\n" . $result->getMessage(), $result->getDetails()); } else { throw new ParsingException('"' . $file . '" does not contain valid JSON' . "\n" . $result->getMessage(), $result->getDetails()); } } public static function detectIndenting(?string $json) : string { if (Preg::isMatchStrictGroups('#^([ \\t]+)"#m', $json ?? '', $match)) { return $match[1]; } return self::INDENT_DEFAULT; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use Composer\Pcre\Preg; use Composer\Repository\PlatformRepository; /** * @author Jordi Boggiano */ class JsonManipulator { /** @var string */ private const DEFINES = '(?(DEFINE) (? -? (?= [1-9]|0(?!\\d) ) \\d++ (?:\\.\\d++)? (?:[eE] [+-]?+ \\d++)? ) (? true | false | null ) (? " (?:[^"\\\\]*+ | \\\\ ["\\\\bfnrt\\/] | \\\\ u [0-9A-Fa-f]{4} )* " ) (? \\[ (?: (?&json) \\s*+ (?: , (?&json) \\s*+ )*+ )?+ \\s*+ \\] ) (? \\s*+ (?&string) \\s*+ : (?&json) \\s*+ ) (? \\{ (?: (?&pair) (?: , (?&pair) )*+ )?+ \\s*+ \\} ) (? \\s*+ (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) ) )'; /** @var string */ private $contents; /** @var string */ private $newline; /** @var string */ private $indent; public function __construct(string $contents) { $contents = \trim($contents); if ($contents === '') { $contents = '{}'; } if (!Preg::isMatch('#^\\{(.*)\\}$#s', $contents)) { throw new \InvalidArgumentException('The json file must be an object ({})'); } $this->newline = \false !== \strpos($contents, "\r\n") ? "\r\n" : "\n"; $this->contents = $contents === '{}' ? '{' . $this->newline . '}' : $contents; $this->detectIndenting(); } public function getContents() : string { return $this->contents . $this->newline; } public function addLink(string $type, string $package, string $constraint, bool $sortPackages = \false) : bool { $decoded = \Composer\Json\JsonFile::parseJson($this->contents); // no link of that type yet if (!isset($decoded[$type])) { return $this->addMainKey($type, [$package => $constraint]); } $regex = '{' . self::DEFINES . '^(?P\\s*\\{\\s*(?:(?&string)\\s*:\\s*(?&json)\\s*,\\s*)*?)' . '(?P' . \preg_quote(\Composer\Json\JsonFile::encode($type)) . '\\s*:\\s*)(?P(?&json))(?P.*)}sx'; if (!Preg::isMatch($regex, $this->contents, $matches)) { return \false; } \assert(\is_string($matches['start'])); \assert(\is_string($matches['value'])); \assert(\is_string($matches['end'])); $links = $matches['value']; // try to find existing link $packageRegex = \str_replace('/', '\\\\?/', \preg_quote($package)); $regex = '{' . self::DEFINES . '"(?P' . $packageRegex . ')"(\\s*:\\s*)(?&string)}ix'; if (Preg::isMatch($regex, $links, $packageMatches)) { \assert(\is_string($packageMatches['package'])); // update existing link $existingPackage = $packageMatches['package']; $packageRegex = \str_replace('/', '\\\\?/', \preg_quote($existingPackage)); $links = Preg::replaceCallback('{' . self::DEFINES . '"' . $packageRegex . '"(?P\\s*:\\s*)(?&string)}ix', static function ($m) use($existingPackage, $constraint) : string { return \Composer\Json\JsonFile::encode(\str_replace('\\/', '/', $existingPackage)) . $m['separator'] . '"' . $constraint . '"'; }, $links); } else { if (Preg::isMatchStrictGroups('#^\\s*\\{\\s*\\S+.*?(\\s*\\}\\s*)$#s', $links, $match)) { // link missing but non empty links $links = Preg::replace( '{' . \preg_quote($match[1]) . '$}', // addcslashes is used to double up backslashes/$ since preg_replace resolves them as back references otherwise, see #1588 \addcslashes(',' . $this->newline . $this->indent . $this->indent . \Composer\Json\JsonFile::encode($package) . ': ' . \Composer\Json\JsonFile::encode($constraint) . $match[1], '\\$'), $links ); } else { // links empty $links = '{' . $this->newline . $this->indent . $this->indent . \Composer\Json\JsonFile::encode($package) . ': ' . \Composer\Json\JsonFile::encode($constraint) . $this->newline . $this->indent . '}'; } } if (\true === $sortPackages) { $requirements = \json_decode($links, \true); $this->sortPackages($requirements); $links = $this->format($requirements); } $this->contents = $matches['start'] . $matches['property'] . $links . $matches['end']; return \true; } /** * Sorts packages by importance (platform packages first, then PHP dependencies) and alphabetically. * * @link https://getcomposer.org/doc/02-libraries.md#platform-packages * * @param array $packages */ private function sortPackages(array &$packages = []) : void { $prefix = static function ($requirement) : string { if (PlatformRepository::isPlatformPackage($requirement)) { return Preg::replace(['/^php/', '/^hhvm/', '/^ext/', '/^lib/', '/^\\D/'], ['0-$0', '1-$0', '2-$0', '3-$0', '4-$0'], $requirement); } return '5-' . $requirement; }; \uksort($packages, static function ($a, $b) use($prefix) : int { return \strnatcmp($prefix($a), $prefix($b)); }); } /** * @param array|false $config */ public function addRepository(string $name, $config, bool $append = \true) : bool { return $this->addSubNode('repositories', $name, $config, $append); } public function removeRepository(string $name) : bool { return $this->removeSubNode('repositories', $name); } /** * @param mixed $value */ public function addConfigSetting(string $name, $value) : bool { return $this->addSubNode('config', $name, $value); } public function removeConfigSetting(string $name) : bool { return $this->removeSubNode('config', $name); } /** * @param mixed $value */ public function addProperty(string $name, $value) : bool { if (\strpos($name, 'suggest.') === 0) { return $this->addSubNode('suggest', \substr($name, 8), $value); } if (\strpos($name, 'extra.') === 0) { return $this->addSubNode('extra', \substr($name, 6), $value); } if (\strpos($name, 'scripts.') === 0) { return $this->addSubNode('scripts', \substr($name, 8), $value); } return $this->addMainKey($name, $value); } public function removeProperty(string $name) : bool { if (\strpos($name, 'suggest.') === 0) { return $this->removeSubNode('suggest', \substr($name, 8)); } if (\strpos($name, 'extra.') === 0) { return $this->removeSubNode('extra', \substr($name, 6)); } if (\strpos($name, 'scripts.') === 0) { return $this->removeSubNode('scripts', \substr($name, 8)); } if (\strpos($name, 'autoload.') === 0) { return $this->removeSubNode('autoload', \substr($name, 9)); } if (\strpos($name, 'autoload-dev.') === 0) { return $this->removeSubNode('autoload-dev', \substr($name, 13)); } return $this->removeMainKey($name); } /** * @param mixed $value */ public function addSubNode(string $mainNode, string $name, $value, bool $append = \true) : bool { $decoded = \Composer\Json\JsonFile::parseJson($this->contents); $subName = null; if (\in_array($mainNode, ['config', 'extra', 'scripts']) && \false !== \strpos($name, '.')) { [$name, $subName] = \explode('.', $name, 2); } // no main node yet if (!isset($decoded[$mainNode])) { if ($subName !== null) { $this->addMainKey($mainNode, [$name => [$subName => $value]]); } else { $this->addMainKey($mainNode, [$name => $value]); } return \true; } // main node content not match-able $nodeRegex = '{' . self::DEFINES . '^(?P \\s* \\{ \\s* (?: (?&string) \\s* : (?&json) \\s* , \\s* )*?' . \preg_quote(\Composer\Json\JsonFile::encode($mainNode)) . '\\s*:\\s*)(?P(?&object))(?P.*)}sx'; try { if (!Preg::isMatch($nodeRegex, $this->contents, $match)) { return \false; } } catch (\RuntimeException $e) { if ($e->getCode() === \PREG_BACKTRACK_LIMIT_ERROR) { return \false; } throw $e; } \assert(\is_string($match['start'])); \assert(\is_string($match['content'])); \assert(\is_string($match['end'])); $children = $match['content']; // invalid match due to un-regexable content, abort if (!@\json_decode($children)) { return \false; } // child exists $childRegex = '{' . self::DEFINES . '(?P"' . \preg_quote($name) . '"\\s*:\\s*)(?P(?&json))(?P,?)}x'; if (Preg::isMatch($childRegex, $children, $matches)) { $children = Preg::replaceCallback($childRegex, function ($matches) use($subName, $value) : string { if ($subName !== null && \is_string($matches['content'])) { $curVal = \json_decode($matches['content'], \true); if (!\is_array($curVal)) { $curVal = []; } $curVal[$subName] = $value; $value = $curVal; } return $matches['start'] . $this->format($value, 1) . $matches['end']; }, $children); } elseif (Preg::isMatch('#^\\{(?P\\s*?)(?P\\S+.*?)?(?P\\s*)\\}$#s', $children, $match)) { $whitespace = $match['trailingspace']; if (null !== $match['content']) { if ($subName !== null) { $value = [$subName => $value]; } // child missing but non empty children if ($append) { $children = Preg::replace('#' . $whitespace . '}$#', \addcslashes(',' . $this->newline . $this->indent . $this->indent . \Composer\Json\JsonFile::encode($name) . ': ' . $this->format($value, 1) . $whitespace . '}', '\\$'), $children); } else { $whitespace = $match['leadingspace']; $children = Preg::replace('#^{' . $whitespace . '#', \addcslashes('{' . $whitespace . \Composer\Json\JsonFile::encode($name) . ': ' . $this->format($value, 1) . ',' . $this->newline . $this->indent . $this->indent, '\\$'), $children); } } else { if ($subName !== null) { $value = [$subName => $value]; } // children present but empty $children = '{' . $this->newline . $this->indent . $this->indent . \Composer\Json\JsonFile::encode($name) . ': ' . $this->format($value, 1) . $whitespace . '}'; } } else { throw new \LogicException('Nothing matched above for: ' . $children); } $this->contents = Preg::replaceCallback($nodeRegex, static function ($m) use($children) : string { return $m['start'] . $children . $m['end']; }, $this->contents); return \true; } public function removeSubNode(string $mainNode, string $name) : bool { $decoded = \Composer\Json\JsonFile::parseJson($this->contents); // no node or empty node if (empty($decoded[$mainNode])) { return \true; } // no node content match-able $nodeRegex = '{' . self::DEFINES . '^(?P \\s* \\{ \\s* (?: (?&string) \\s* : (?&json) \\s* , \\s* )*?' . \preg_quote(\Composer\Json\JsonFile::encode($mainNode)) . '\\s*:\\s*)(?P(?&object))(?P.*)}sx'; try { if (!Preg::isMatch($nodeRegex, $this->contents, $match)) { return \false; } } catch (\RuntimeException $e) { if ($e->getCode() === \PREG_BACKTRACK_LIMIT_ERROR) { return \false; } throw $e; } \assert(\is_string($match['start'])); \assert(\is_string($match['content'])); \assert(\is_string($match['end'])); $children = $match['content']; // invalid match due to un-regexable content, abort if (!@\json_decode($children, \true)) { return \false; } $subName = null; if (\in_array($mainNode, ['config', 'extra', 'scripts']) && \false !== \strpos($name, '.')) { [$name, $subName] = \explode('.', $name, 2); } // no node to remove if (!isset($decoded[$mainNode][$name]) || $subName && !isset($decoded[$mainNode][$name][$subName])) { return \true; } // try and find a match for the subkey $keyRegex = \str_replace('/', '\\\\?/', \preg_quote($name)); if (Preg::isMatch('{"' . $keyRegex . '"\\s*:}i', $children)) { // find best match for the value of "name" if (Preg::isMatchAll('{' . self::DEFINES . '"' . $keyRegex . '"\\s*:\\s*(?:(?&json))}x', $children, $matches)) { $bestMatch = ''; foreach ($matches[0] as $match) { \assert(\is_string($match)); if (\strlen($bestMatch) < \strlen($match)) { $bestMatch = $match; } } $childrenClean = Preg::replace('{,\\s*' . \preg_quote($bestMatch) . '}i', '', $children, -1, $count); if (1 !== $count) { $childrenClean = Preg::replace('{' . \preg_quote($bestMatch) . '\\s*,?\\s*}i', '', $childrenClean, -1, $count); if (1 !== $count) { return \false; } } } } else { $childrenClean = $children; } if (!isset($childrenClean)) { throw new \InvalidArgumentException("JsonManipulator: \$childrenClean is not defined. Please report at https://github.com/composer/composer/issues/new."); } // no child data left, $name was the only key in unset($match); if (Preg::isMatch('#^\\{\\s*?(?P\\S+.*?)?(?P\\s*)\\}$#s', $childrenClean, $match)) { if (null === $match['content']) { $newline = $this->newline; $indent = $this->indent; $this->contents = Preg::replaceCallback($nodeRegex, static function ($matches) use($indent, $newline) : string { return $matches['start'] . '{' . $newline . $indent . '}' . $matches['end']; }, $this->contents); // we have a subname, so we restore the rest of $name if ($subName !== null) { $curVal = \json_decode($children, \true); unset($curVal[$name][$subName]); if ($curVal[$name] === []) { $curVal[$name] = new \ArrayObject(); } $this->addSubNode($mainNode, $name, $curVal[$name]); } return \true; } } $this->contents = Preg::replaceCallback($nodeRegex, function ($matches) use($name, $subName, $childrenClean) : string { \assert(\is_string($matches['content'])); if ($subName !== null) { $curVal = \json_decode($matches['content'], \true); unset($curVal[$name][$subName]); if ($curVal[$name] === []) { $curVal[$name] = new \ArrayObject(); } $childrenClean = $this->format($curVal, 0, \true); } return $matches['start'] . $childrenClean . $matches['end']; }, $this->contents); return \true; } /** * @param mixed $content */ public function addMainKey(string $key, $content) : bool { $decoded = \Composer\Json\JsonFile::parseJson($this->contents); $content = $this->format($content); // key exists already $regex = '{' . self::DEFINES . '^(?P\\s*\\{\\s*(?:(?&string)\\s*:\\s*(?&json)\\s*,\\s*)*?)' . '(?P' . \preg_quote(\Composer\Json\JsonFile::encode($key)) . '\\s*:\\s*(?&json))(?P.*)}sx'; if (isset($decoded[$key]) && Preg::isMatch($regex, $this->contents, $matches)) { // invalid match due to un-regexable content, abort if (!@\json_decode('{' . $matches['key'] . '}')) { return \false; } $this->contents = $matches['start'] . \Composer\Json\JsonFile::encode($key) . ': ' . $content . $matches['end']; return \true; } // append at the end of the file and keep whitespace if (Preg::isMatch('#[^{\\s](\\s*)\\}$#', $this->contents, $match)) { $this->contents = Preg::replace('#' . $match[1] . '\\}$#', \addcslashes(',' . $this->newline . $this->indent . \Composer\Json\JsonFile::encode($key) . ': ' . $content . $this->newline . '}', '\\$'), $this->contents); return \true; } // append at the end of the file $this->contents = Preg::replace('#\\}$#', \addcslashes($this->indent . \Composer\Json\JsonFile::encode($key) . ': ' . $content . $this->newline . '}', '\\$'), $this->contents); return \true; } public function removeMainKey(string $key) : bool { $decoded = \Composer\Json\JsonFile::parseJson($this->contents); if (!\array_key_exists($key, $decoded)) { return \true; } // key exists already $regex = '{' . self::DEFINES . '^(?P\\s*\\{\\s*(?:(?&string)\\s*:\\s*(?&json)\\s*,\\s*)*?)' . '(?P' . \preg_quote(\Composer\Json\JsonFile::encode($key)) . '\\s*:\\s*(?&json))\\s*,?\\s*(?P.*)}sx'; if (Preg::isMatch($regex, $this->contents, $matches)) { \assert(\is_string($matches['start'])); \assert(\is_string($matches['removal'])); \assert(\is_string($matches['end'])); // invalid match due to un-regexable content, abort if (!@\json_decode('{' . $matches['removal'] . '}')) { return \false; } // check that we are not leaving a dangling comma on the previous line if the last line was removed if (Preg::isMatchStrictGroups('#,\\s*$#', $matches['start']) && Preg::isMatch('#^\\}$#', $matches['end'])) { $matches['start'] = \rtrim(Preg::replace('#,(\\s*)$#', '$1', $matches['start']), $this->indent); } $this->contents = $matches['start'] . $matches['end']; if (Preg::isMatch('#^\\{\\s*\\}\\s*$#', $this->contents)) { $this->contents = "{\n}"; } return \true; } return \false; } public function removeMainKeyIfEmpty(string $key) : bool { $decoded = \Composer\Json\JsonFile::parseJson($this->contents); if (!\array_key_exists($key, $decoded)) { return \true; } if (\is_array($decoded[$key]) && \count($decoded[$key]) === 0) { return $this->removeMainKey($key); } return \true; } /** * @param mixed $data */ public function format($data, int $depth = 0, bool $wasObject = \false) : string { if ($data instanceof \stdClass || $data instanceof \ArrayObject) { $data = (array) $data; $wasObject = \true; } if (\is_array($data)) { if (\count($data) === 0) { return $wasObject ? '{' . $this->newline . \str_repeat($this->indent, $depth + 1) . '}' : '[]'; } if (\array_is_list($data)) { foreach ($data as $key => $val) { $data[$key] = $this->format($val, $depth + 1); } return '[' . \implode(', ', $data) . ']'; } $out = '{' . $this->newline; $elems = []; foreach ($data as $key => $val) { $elems[] = \str_repeat($this->indent, $depth + 2) . \Composer\Json\JsonFile::encode((string) $key) . ': ' . $this->format($val, $depth + 1); } return $out . \implode(',' . $this->newline, $elems) . $this->newline . \str_repeat($this->indent, $depth + 1) . '}'; } return \Composer\Json\JsonFile::encode($data); } protected function detectIndenting() : void { $this->indent = \Composer\Json\JsonFile::detectIndenting($this->contents); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` * * @final */ class InstalledVersions { /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; /** * @var bool */ private static $installedIsLocalDir; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = \array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return \array_keys(\array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = \true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false; } } return \false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (\array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (\array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (\array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['provided']); } return \implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ public static function getRawData() { @\trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (\substr(__DIR__, -8, 1) !== 'C') { self::$installed = (include __DIR__ . '/installed.php'); } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); // when using reload, we disable the duplicate protection to ensure that self::$installed data is // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, // so we have to assume it does not, and that may result in duplicate data being returned when listing // all installed packages for example self::$installedIsLocalDir = \false; } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = \method_exists('Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); $copiedLocalDir = \false; if (self::$canGetVendors) { $selfDir = \strtr(__DIR__, '\\', '/'); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { $vendorDir = \strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (\is_file($vendorDir . '/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = (require $vendorDir . '/composer/installed.php'); self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; if (self::$installed === null && $vendorDir . '/composer' === $selfDir) { self::$installed = $required; self::$installedIsLocalDir = \true; } } if (self::$installedIsLocalDir && $vendorDir . '/composer' === $selfDir) { $copiedLocalDir = \true; } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (\substr(__DIR__, -8, 1) !== 'C') { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = (require __DIR__ . '/installed.php'); self::$installed = $required; } else { self::$installed = array(); } } if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } return $installed; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; /** * Solver install operation. * * @author Konstantin Kudryashov */ class InstallOperation extends \Composer\DependencyResolver\Operation\SolverOperation implements \Composer\DependencyResolver\Operation\OperationInterface { protected const TYPE = 'install'; /** * @var PackageInterface */ protected $package; public function __construct(PackageInterface $package) { $this->package = $package; } /** * Returns package instance. */ public function getPackage() : PackageInterface { return $this->package; } /** * @inheritDoc */ public function show($lock) : string { return self::format($this->package, $lock); } public static function format(PackageInterface $package, bool $lock = \false) : string { return ($lock ? 'Locking ' : 'Installing ') . '' . $package->getPrettyName() . ' (' . $package->getFullPrettyVersion() . ')'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\AliasPackage; /** * Solver install operation. * * @author Nils Adermann */ class MarkAliasInstalledOperation extends \Composer\DependencyResolver\Operation\SolverOperation implements \Composer\DependencyResolver\Operation\OperationInterface { protected const TYPE = 'markAliasInstalled'; /** * @var AliasPackage */ protected $package; public function __construct(AliasPackage $package) { $this->package = $package; } /** * Returns package instance. */ public function getPackage() : AliasPackage { return $this->package; } /** * @inheritDoc */ public function show($lock) : string { return 'Marking ' . $this->package->getPrettyName() . ' (' . $this->package->getFullPrettyVersion() . ') as installed, alias of ' . $this->package->getAliasOf()->getPrettyName() . ' (' . $this->package->getAliasOf()->getFullPrettyVersion() . ')'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; /** * Solver operation interface. * * @author Konstantin Kudryashov */ interface OperationInterface { /** * Returns operation type. * * @return string */ public function getOperationType(); /** * Serializes the operation in a human readable format * * @param bool $lock Whether this is an operation on the lock file * @return string */ public function show(bool $lock); /** * Serializes the operation in a human readable format * * @return string */ public function __toString(); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; /** * Solver update operation. * * @author Konstantin Kudryashov */ class UpdateOperation extends \Composer\DependencyResolver\Operation\SolverOperation implements \Composer\DependencyResolver\Operation\OperationInterface { protected const TYPE = 'update'; /** * @var PackageInterface */ protected $initialPackage; /** * @var PackageInterface */ protected $targetPackage; /** * @param PackageInterface $initial initial package * @param PackageInterface $target target package (updated) */ public function __construct(PackageInterface $initial, PackageInterface $target) { $this->initialPackage = $initial; $this->targetPackage = $target; } /** * Returns initial package. */ public function getInitialPackage() : PackageInterface { return $this->initialPackage; } /** * Returns target package. */ public function getTargetPackage() : PackageInterface { return $this->targetPackage; } /** * @inheritDoc */ public function show($lock) : string { return self::format($this->initialPackage, $this->targetPackage, $lock); } public static function format(PackageInterface $initialPackage, PackageInterface $targetPackage, bool $lock = \false) : string { $fromVersion = $initialPackage->getFullPrettyVersion(); $toVersion = $targetPackage->getFullPrettyVersion(); if ($fromVersion === $toVersion && $initialPackage->getSourceReference() !== $targetPackage->getSourceReference()) { $fromVersion = $initialPackage->getFullPrettyVersion(\true, PackageInterface::DISPLAY_SOURCE_REF); $toVersion = $targetPackage->getFullPrettyVersion(\true, PackageInterface::DISPLAY_SOURCE_REF); } elseif ($fromVersion === $toVersion && $initialPackage->getDistReference() !== $targetPackage->getDistReference()) { $fromVersion = $initialPackage->getFullPrettyVersion(\true, PackageInterface::DISPLAY_DIST_REF); $toVersion = $targetPackage->getFullPrettyVersion(\true, PackageInterface::DISPLAY_DIST_REF); } $actionName = VersionParser::isUpgrade($initialPackage->getVersion(), $targetPackage->getVersion()) ? 'Upgrading' : 'Downgrading'; return $actionName . ' ' . $initialPackage->getPrettyName() . ' (' . $fromVersion . ' => ' . $toVersion . ')'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; /** * Abstract operation class. * * @author Aleksandr Bezpiatov */ abstract class SolverOperation implements \Composer\DependencyResolver\Operation\OperationInterface { /** * @abstract must be redefined by extending classes */ protected const TYPE = ''; /** * Returns operation type. */ public function getOperationType() : string { return static::TYPE; } /** * @inheritDoc */ public function __toString() { return $this->show(\false); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; /** * Solver uninstall operation. * * @author Konstantin Kudryashov */ class UninstallOperation extends \Composer\DependencyResolver\Operation\SolverOperation implements \Composer\DependencyResolver\Operation\OperationInterface { protected const TYPE = 'uninstall'; /** * @var PackageInterface */ protected $package; public function __construct(PackageInterface $package) { $this->package = $package; } /** * Returns package instance. */ public function getPackage() : PackageInterface { return $this->package; } /** * @inheritDoc */ public function show($lock) : string { return self::format($this->package, $lock); } public static function format(PackageInterface $package, bool $lock = \false) : string { return 'Removing ' . $package->getPrettyName() . ' (' . $package->getFullPrettyVersion() . ')'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\AliasPackage; /** * Solver install operation. * * @author Nils Adermann */ class MarkAliasUninstalledOperation extends \Composer\DependencyResolver\Operation\SolverOperation implements \Composer\DependencyResolver\Operation\OperationInterface { protected const TYPE = 'markAliasUninstalled'; /** * @var AliasPackage */ protected $package; public function __construct(AliasPackage $package) { $this->package = $package; } /** * Returns package instance. */ public function getPackage() : AliasPackage { return $this->package; } /** * @inheritDoc */ public function show($lock) : string { return 'Marking ' . $this->package->getPrettyName() . ' (' . $this->package->getFullPrettyVersion() . ') as uninstalled, alias of ' . $this->package->getAliasOf()->getPrettyName() . ' (' . $this->package->getAliasOf()->getFullPrettyVersion() . ')'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\AliasPackage; use Composer\Package\Link; use Composer\Package\PackageInterface; use Composer\Repository\PlatformRepository; use Composer\DependencyResolver\Operation\OperationInterface; /** * @author Nils Adermann * @internal */ class Transaction { /** * @var OperationInterface[] */ protected $operations; /** * Packages present at the beginning of the transaction * @var PackageInterface[] */ protected $presentPackages; /** * Package set resulting from this transaction * @var array */ protected $resultPackageMap; /** * @var array */ protected $resultPackagesByName = []; /** * @param PackageInterface[] $presentPackages * @param PackageInterface[] $resultPackages */ public function __construct(array $presentPackages, array $resultPackages) { $this->presentPackages = $presentPackages; $this->setResultPackageMaps($resultPackages); $this->operations = $this->calculateOperations(); } /** * @return OperationInterface[] */ public function getOperations() : array { return $this->operations; } /** * @param PackageInterface[] $resultPackages */ private function setResultPackageMaps(array $resultPackages) : void { $packageSort = static function (PackageInterface $a, PackageInterface $b) : int { // sort alias packages by the same name behind their non alias version if ($a->getName() === $b->getName()) { if ($a instanceof AliasPackage !== $b instanceof AliasPackage) { return $a instanceof AliasPackage ? -1 : 1; } // if names are the same, compare version, e.g. to sort aliases reliably, actual order does not matter return \strcmp($b->getVersion(), $a->getVersion()); } return \strcmp($b->getName(), $a->getName()); }; $this->resultPackageMap = []; foreach ($resultPackages as $package) { $this->resultPackageMap[\spl_object_hash($package)] = $package; foreach ($package->getNames() as $name) { $this->resultPackagesByName[$name][] = $package; } } \uasort($this->resultPackageMap, $packageSort); foreach ($this->resultPackagesByName as $name => $packages) { \uasort($this->resultPackagesByName[$name], $packageSort); } } /** * @return OperationInterface[] */ protected function calculateOperations() : array { $operations = []; $presentPackageMap = []; $removeMap = []; $presentAliasMap = []; $removeAliasMap = []; foreach ($this->presentPackages as $package) { if ($package instanceof AliasPackage) { $presentAliasMap[$package->getName() . '::' . $package->getVersion()] = $package; $removeAliasMap[$package->getName() . '::' . $package->getVersion()] = $package; } else { $presentPackageMap[$package->getName()] = $package; $removeMap[$package->getName()] = $package; } } $stack = $this->getRootPackages(); $visited = []; $processed = []; while (\count($stack) > 0) { $package = \array_pop($stack); if (isset($processed[\spl_object_hash($package)])) { continue; } if (!isset($visited[\spl_object_hash($package)])) { $visited[\spl_object_hash($package)] = \true; $stack[] = $package; if ($package instanceof AliasPackage) { $stack[] = $package->getAliasOf(); } else { foreach ($package->getRequires() as $link) { $possibleRequires = $this->getProvidersInResult($link); foreach ($possibleRequires as $require) { $stack[] = $require; } } } } elseif (!isset($processed[\spl_object_hash($package)])) { $processed[\spl_object_hash($package)] = \true; if ($package instanceof AliasPackage) { $aliasKey = $package->getName() . '::' . $package->getVersion(); if (isset($presentAliasMap[$aliasKey])) { unset($removeAliasMap[$aliasKey]); } else { $operations[] = new \Composer\DependencyResolver\Operation\MarkAliasInstalledOperation($package); } } else { if (isset($presentPackageMap[$package->getName()])) { $source = $presentPackageMap[$package->getName()]; // do we need to update? // TODO different for lock? if ($package->getVersion() !== $presentPackageMap[$package->getName()]->getVersion() || $package->getDistReference() !== $presentPackageMap[$package->getName()]->getDistReference() || $package->getSourceReference() !== $presentPackageMap[$package->getName()]->getSourceReference()) { $operations[] = new \Composer\DependencyResolver\Operation\UpdateOperation($source, $package); } unset($removeMap[$package->getName()]); } else { $operations[] = new \Composer\DependencyResolver\Operation\InstallOperation($package); unset($removeMap[$package->getName()]); } } } } foreach ($removeMap as $name => $package) { \array_unshift($operations, new \Composer\DependencyResolver\Operation\UninstallOperation($package)); } foreach ($removeAliasMap as $nameVersion => $package) { $operations[] = new \Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation($package); } $operations = $this->movePluginsToFront($operations); // TODO fix this: // we have to do this again here even though the above stack code did it because moving plugins moves them before uninstalls $operations = $this->moveUninstallsToFront($operations); // TODO skip updates which don't update? is this needed? we shouldn't schedule this update in the first place? /* if ('update' === $opType) { $targetPackage = $operation->getTargetPackage(); if ($targetPackage->isDev()) { $initialPackage = $operation->getInitialPackage(); if ($targetPackage->getVersion() === $initialPackage->getVersion() && (!$targetPackage->getSourceReference() || $targetPackage->getSourceReference() === $initialPackage->getSourceReference()) && (!$targetPackage->getDistReference() || $targetPackage->getDistReference() === $initialPackage->getDistReference()) ) { $this->io->writeError(' - Skipping update of ' . $targetPackage->getPrettyName() . ' to the same reference-locked version', true, IOInterface::DEBUG); $this->io->writeError('', true, IOInterface::DEBUG); continue; } } }*/ return $this->operations = $operations; } /** * Determine which packages in the result are not required by any other packages in it. * * These serve as a starting point to enumerate packages in a topological order despite potential cycles. * If there are packages with a cycle on the top level the package with the lowest name gets picked * * @return array */ protected function getRootPackages() : array { $roots = $this->resultPackageMap; foreach ($this->resultPackageMap as $packageHash => $package) { if (!isset($roots[$packageHash])) { continue; } foreach ($package->getRequires() as $link) { $possibleRequires = $this->getProvidersInResult($link); foreach ($possibleRequires as $require) { if ($require !== $package) { unset($roots[\spl_object_hash($require)]); } } } } return $roots; } /** * @return PackageInterface[] */ protected function getProvidersInResult(Link $link) : array { if (!isset($this->resultPackagesByName[$link->getTarget()])) { return []; } return $this->resultPackagesByName[$link->getTarget()]; } /** * Workaround: if your packages depend on plugins, we must be sure * that those are installed / updated first; else it would lead to packages * being installed multiple times in different folders, when running Composer * twice. * * While this does not fix the root-causes of https://github.com/composer/composer/issues/1147, * it at least fixes the symptoms and makes usage of composer possible (again) * in such scenarios. * * @param OperationInterface[] $operations * @return OperationInterface[] reordered operation list */ private function movePluginsToFront(array $operations) : array { $dlModifyingPluginsNoDeps = []; $dlModifyingPluginsWithDeps = []; $dlModifyingPluginRequires = []; $pluginsNoDeps = []; $pluginsWithDeps = []; $pluginRequires = []; foreach (\array_reverse($operations, \true) as $idx => $op) { if ($op instanceof \Composer\DependencyResolver\Operation\InstallOperation) { $package = $op->getPackage(); } elseif ($op instanceof \Composer\DependencyResolver\Operation\UpdateOperation) { $package = $op->getTargetPackage(); } else { continue; } $extra = $package->getExtra(); $isDownloadsModifyingPlugin = $package->getType() === 'composer-plugin' && isset($extra['plugin-modifies-downloads']) && $extra['plugin-modifies-downloads'] === \true; // is this a downloads modifying plugin or a dependency of one? if ($isDownloadsModifyingPlugin || \count(\array_intersect($package->getNames(), $dlModifyingPluginRequires)) > 0) { // get the package's requires, but filter out any platform requirements $requires = \array_filter(\array_keys($package->getRequires()), static function ($req) : bool { return !PlatformRepository::isPlatformPackage($req); }); // is this a plugin with no meaningful dependencies? if ($isDownloadsModifyingPlugin && 0 === \count($requires)) { // plugins with no dependencies go to the very front \array_unshift($dlModifyingPluginsNoDeps, $op); } else { // capture the requirements for this package so those packages will be moved up as well $dlModifyingPluginRequires = \array_merge($dlModifyingPluginRequires, $requires); // move the operation to the front \array_unshift($dlModifyingPluginsWithDeps, $op); } unset($operations[$idx]); continue; } // is this package a plugin? $isPlugin = $package->getType() === 'composer-plugin' || $package->getType() === 'composer-installer'; // is this a plugin or a dependency of a plugin? if ($isPlugin || \count(\array_intersect($package->getNames(), $pluginRequires)) > 0) { // get the package's requires, but filter out any platform requirements $requires = \array_filter(\array_keys($package->getRequires()), static function ($req) : bool { return !PlatformRepository::isPlatformPackage($req); }); // is this a plugin with no meaningful dependencies? if ($isPlugin && 0 === \count($requires)) { // plugins with no dependencies go to the very front \array_unshift($pluginsNoDeps, $op); } else { // capture the requirements for this package so those packages will be moved up as well $pluginRequires = \array_merge($pluginRequires, $requires); // move the operation to the front \array_unshift($pluginsWithDeps, $op); } unset($operations[$idx]); } } return \array_merge($dlModifyingPluginsNoDeps, $dlModifyingPluginsWithDeps, $pluginsNoDeps, $pluginsWithDeps, $operations); } /** * Removals of packages should be executed before installations in * case two packages resolve to the same path (due to custom installers) * * @param OperationInterface[] $operations * @return OperationInterface[] reordered operation list */ private function moveUninstallsToFront(array $operations) : array { $uninstOps = []; foreach ($operations as $idx => $op) { if ($op instanceof \Composer\DependencyResolver\Operation\UninstallOperation || $op instanceof \Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation) { $uninstOps[] = $op; unset($operations[$idx]); } } return \array_merge($uninstOps, $operations); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\PackageInterface; use Composer\Semver\Constraint\Constraint; /** * @author Nils Adermann */ interface PolicyInterface { /** * @phpstan-param Constraint::STR_OP_* $operator */ public function versionCompare(PackageInterface $a, PackageInterface $b, string $operator) : bool; /** * @param non-empty-list $literals * @return non-empty-list */ public function selectPreferredPackages(\Composer\DependencyResolver\Pool $pool, array $literals, ?string $requiredPackage = null) : array; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Repository\InstalledRepositoryInterface; use Composer\Repository\RepositoryInterface; /** * @author Nils Adermann * @internal */ class LocalRepoTransaction extends \Composer\DependencyResolver\Transaction { public function __construct(RepositoryInterface $lockedRepository, InstalledRepositoryInterface $localRepository) { parent::__construct($localRepository->getPackages(), $lockedRepository->getPackages()); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * The RuleWatchGraph efficiently propagates decisions to other rules * * All rules generated for solving a SAT problem should be inserted into the * graph. When a decision on a literal is made, the graph can be used to * propagate the decision to all other rules involving the literal, leading to * other trivial decisions resulting from unit clauses. * * @author Nils Adermann */ class RuleWatchGraph { /** @var array */ protected $watchChains = []; /** * Inserts a rule node into the appropriate chains within the graph * * The node is prepended to the watch chains for each of the two literals it * watches. * * Assertions are skipped because they only depend on a single package and * have no alternative literal that could be true, so there is no need to * watch changes in any literals. * * @param RuleWatchNode $node The rule node to be inserted into the graph */ public function insert(\Composer\DependencyResolver\RuleWatchNode $node) : void { if ($node->getRule()->isAssertion()) { return; } if (!$node->getRule() instanceof \Composer\DependencyResolver\MultiConflictRule) { foreach ([$node->watch1, $node->watch2] as $literal) { if (!isset($this->watchChains[$literal])) { $this->watchChains[$literal] = new \Composer\DependencyResolver\RuleWatchChain(); } $this->watchChains[$literal]->unshift($node); } } else { foreach ($node->getRule()->getLiterals() as $literal) { if (!isset($this->watchChains[$literal])) { $this->watchChains[$literal] = new \Composer\DependencyResolver\RuleWatchChain(); } $this->watchChains[$literal]->unshift($node); } } } /** * Propagates a decision on a literal to all rules watching the literal * * If a decision, e.g. +A has been made, then all rules containing -A, e.g. * (-A|+B|+C) now need to satisfy at least one of the other literals, so * that the rule as a whole becomes true, since with +A applied the rule * is now (false|+B|+C) so essentially (+B|+C). * * This means that all rules watching the literal -A need to be updated to * watch 2 other literals which can still be satisfied instead. So literals * that conflict with previously made decisions are not an option. * * Alternatively it can occur that a unit clause results: e.g. if in the * above example the rule was (-A|+B), then A turning true means that * B must now be decided true as well. * * @param int $decidedLiteral The literal which was decided (A in our example) * @param int $level The level at which the decision took place and at which * all resulting decisions should be made. * @param Decisions $decisions Used to check previous decisions and to * register decisions resulting from propagation * @return Rule|null If a conflict is found the conflicting rule is returned */ public function propagateLiteral(int $decidedLiteral, int $level, \Composer\DependencyResolver\Decisions $decisions) : ?\Composer\DependencyResolver\Rule { // we invert the decided literal here, example: // A was decided => (-A|B) now requires B to be true, so we look for // rules which are fulfilled by -A, rather than A. $literal = -$decidedLiteral; if (!isset($this->watchChains[$literal])) { return null; } $chain = $this->watchChains[$literal]; $chain->rewind(); while ($chain->valid()) { $node = $chain->current(); if (!$node->getRule() instanceof \Composer\DependencyResolver\MultiConflictRule) { $otherWatch = $node->getOtherWatch($literal); if (!$node->getRule()->isDisabled() && !$decisions->satisfy($otherWatch)) { $ruleLiterals = $node->getRule()->getLiterals(); $alternativeLiterals = \array_filter($ruleLiterals, static function ($ruleLiteral) use($literal, $otherWatch, $decisions) : bool { return $literal !== $ruleLiteral && $otherWatch !== $ruleLiteral && !$decisions->conflict($ruleLiteral); }); if (\count($alternativeLiterals) > 0) { \reset($alternativeLiterals); $this->moveWatch($literal, \current($alternativeLiterals), $node); continue; } if ($decisions->conflict($otherWatch)) { return $node->getRule(); } $decisions->decide($otherWatch, $level, $node->getRule()); } } else { foreach ($node->getRule()->getLiterals() as $otherLiteral) { if ($literal !== $otherLiteral && !$decisions->satisfy($otherLiteral)) { if ($decisions->conflict($otherLiteral)) { return $node->getRule(); } $decisions->decide($otherLiteral, $level, $node->getRule()); } } } $chain->next(); } return null; } /** * Moves a rule node from one watch chain to another * * The rule node's watched literals are updated accordingly. * * @param int $fromLiteral A literal the node used to watch * @param int $toLiteral A literal the node should watch now * @param RuleWatchNode $node The rule node to be moved */ protected function moveWatch(int $fromLiteral, int $toLiteral, \Composer\DependencyResolver\RuleWatchNode $node) : void { if (!isset($this->watchChains[$toLiteral])) { $this->watchChains[$toLiteral] = new \Composer\DependencyResolver\RuleWatchChain(); } $node->moveWatch($fromLiteral, $toLiteral); $this->watchChains[$fromLiteral]->remove(); $this->watchChains[$toLiteral]->unshift($node); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann */ class GenericRule extends \Composer\DependencyResolver\Rule { /** @var list */ protected $literals; /** * @param list $literals */ public function __construct(array $literals, $reason, $reasonData) { parent::__construct($reason, $reasonData); // sort all packages ascending by id \sort($literals); $this->literals = $literals; } /** * @return list */ public function getLiterals() : array { return $this->literals; } /** * @inheritDoc */ public function getHash() { $data = \unpack('ihash', (string) \hash(\PHP_VERSION_ID > 80100 ? 'xxh3' : 'sha1', \implode(',', $this->literals), \true)); if (\false === $data) { throw new \RuntimeException('Failed unpacking: ' . \implode(', ', $this->literals)); } return $data['hash']; } /** * Checks if this rule is equal to another one * * Ignores whether either of the rules is disabled. * * @param Rule $rule The rule to check against * @return bool Whether the rules are equal */ public function equals(\Composer\DependencyResolver\Rule $rule) : bool { return $this->literals === $rule->getLiterals(); } public function isAssertion() : bool { return 1 === \count($this->literals); } /** * Formats a rule as a string of the format (Literal1|Literal2|...) */ public function __toString() : string { $result = $this->isDisabled() ? 'disabled(' : '('; foreach ($this->literals as $i => $literal) { if ($i !== 0) { $result .= '|'; } $result .= $literal; } $result .= ')'; return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\Package; use Composer\Pcre\Preg; /** * @author Nils Adermann * @internal */ class LockTransaction extends \Composer\DependencyResolver\Transaction { /** * packages in current lock file, platform repo or otherwise present * * Indexed by spl_object_hash * * @var array */ protected $presentMap; /** * Packages which cannot be mapped, platform repo, root package, other fixed repos * * Indexed by package id * * @var array */ protected $unlockableMap; /** * @var array{dev: BasePackage[], non-dev: BasePackage[], all: BasePackage[]} */ protected $resultPackages; /** * @param array $presentMap * @param array $unlockableMap */ public function __construct(\Composer\DependencyResolver\Pool $pool, array $presentMap, array $unlockableMap, \Composer\DependencyResolver\Decisions $decisions) { $this->presentMap = $presentMap; $this->unlockableMap = $unlockableMap; $this->setResultPackages($pool, $decisions); parent::__construct($this->presentMap, $this->resultPackages['all']); } // TODO make this a bit prettier instead of the two text indexes? public function setResultPackages(\Composer\DependencyResolver\Pool $pool, \Composer\DependencyResolver\Decisions $decisions) : void { $this->resultPackages = ['all' => [], 'non-dev' => [], 'dev' => []]; foreach ($decisions as $i => $decision) { $literal = $decision[\Composer\DependencyResolver\Decisions::DECISION_LITERAL]; if ($literal > 0) { $package = $pool->literalToPackage($literal); $this->resultPackages['all'][] = $package; if (!isset($this->unlockableMap[$package->id])) { $this->resultPackages['non-dev'][] = $package; } } } } public function setNonDevPackages(\Composer\DependencyResolver\LockTransaction $extractionResult) : void { $packages = $extractionResult->getNewLockPackages(\false); $this->resultPackages['dev'] = $this->resultPackages['non-dev']; $this->resultPackages['non-dev'] = []; foreach ($packages as $package) { foreach ($this->resultPackages['dev'] as $i => $resultPackage) { // TODO this comparison is probably insufficient, aliases, what about modified versions? I guess they aren't possible? if ($package->getName() === $resultPackage->getName()) { $this->resultPackages['non-dev'][] = $resultPackage; unset($this->resultPackages['dev'][$i]); } } } } // TODO additionalFixedRepository needs to be looked at here as well? /** * @return BasePackage[] */ public function getNewLockPackages(bool $devMode, bool $updateMirrors = \false) : array { $packages = []; foreach ($this->resultPackages[$devMode ? 'dev' : 'non-dev'] as $package) { if ($package instanceof AliasPackage) { continue; } // if we're just updating mirrors we need to reset everything to the same as currently "present" packages' references to keep the lock file as-is if ($updateMirrors === \true && !\array_key_exists(\spl_object_hash($package), $this->presentMap)) { $package = $this->updateMirrorAndUrls($package); } $packages[] = $package; } return $packages; } /** * Try to return the original package from presentMap with updated URLs/mirrors * * If the type of source/dist changed, then we do not update those and keep them as they were */ private function updateMirrorAndUrls(BasePackage $package) : BasePackage { foreach ($this->presentMap as $presentPackage) { if ($package->getName() !== $presentPackage->getName()) { continue; } if ($package->getVersion() !== $presentPackage->getVersion()) { continue; } if ($presentPackage->getSourceReference() === null) { continue; } if ($presentPackage->getSourceType() !== $package->getSourceType()) { continue; } if ($presentPackage instanceof Package) { $presentPackage->setSourceUrl($package->getSourceUrl()); $presentPackage->setSourceMirrors($package->getSourceMirrors()); } // if the dist type changed, we only update the source url/mirrors if ($presentPackage->getDistType() !== $package->getDistType()) { return $presentPackage; } // update dist url if it is in a known format if ($package->getDistUrl() !== null && $presentPackage->getDistReference() !== null && Preg::isMatch('{^https?://(?:(?:www\\.)?bitbucket\\.org|(api\\.)?github\\.com|(?:www\\.)?gitlab\\.com)/}i', $package->getDistUrl())) { $presentPackage->setDistUrl(Preg::replace('{(?<=/|sha=)[a-f0-9]{40}(?=/|$)}i', $presentPackage->getDistReference(), $package->getDistUrl())); } $presentPackage->setDistMirrors($package->getDistMirrors()); return $presentPackage; } return $package; } /** * Checks which of the given aliases from composer.json are actually in use for the lock file * @param list $aliases * @return list */ public function getAliases(array $aliases) : array { $usedAliases = []; foreach ($this->resultPackages['all'] as $package) { if ($package instanceof AliasPackage) { foreach ($aliases as $index => $alias) { if ($alias['package'] === $package->getName()) { $usedAliases[] = $alias; unset($aliases[$index]); } } } } \usort($usedAliases, static function ($a, $b) : int { return \strcmp($a['package'], $b['package']); }); return $usedAliases; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\IO\IOInterface; use Composer\Package\BasePackage; /** * @author Nils Adermann */ class Solver { private const BRANCH_LITERALS = 0; private const BRANCH_LEVEL = 1; /** @var PolicyInterface */ protected $policy; /** @var Pool */ protected $pool; /** @var RuleSet */ protected $rules; /** @var RuleWatchGraph */ protected $watchGraph; /** @var Decisions */ protected $decisions; /** @var BasePackage[] */ protected $fixedMap; /** @var int */ protected $propagateIndex; /** @var array, int}> */ protected $branches = []; /** @var Problem[] */ protected $problems = []; /** @var array */ protected $learnedPool = []; /** @var array */ protected $learnedWhy = []; /** @var bool */ public $testFlagLearnedPositiveLiteral = \false; /** @var IOInterface */ protected $io; public function __construct(\Composer\DependencyResolver\PolicyInterface $policy, \Composer\DependencyResolver\Pool $pool, IOInterface $io) { $this->io = $io; $this->policy = $policy; $this->pool = $pool; } public function getRuleSetSize() : int { return \count($this->rules); } public function getPool() : \Composer\DependencyResolver\Pool { return $this->pool; } // aka solver_makeruledecisions private function makeAssertionRuleDecisions() : void { $decisionStart = \count($this->decisions) - 1; $rulesCount = \count($this->rules); for ($ruleIndex = 0; $ruleIndex < $rulesCount; $ruleIndex++) { $rule = $this->rules->ruleById[$ruleIndex]; if (!$rule->isAssertion() || $rule->isDisabled()) { continue; } $literals = $rule->getLiterals(); $literal = $literals[0]; if (!$this->decisions->decided($literal)) { $this->decisions->decide($literal, 1, $rule); continue; } if ($this->decisions->satisfy($literal)) { continue; } // found a conflict if (\Composer\DependencyResolver\RuleSet::TYPE_LEARNED === $rule->getType()) { $rule->disable(); continue; } $conflict = $this->decisions->decisionRule($literal); if (\Composer\DependencyResolver\RuleSet::TYPE_PACKAGE === $conflict->getType()) { $problem = new \Composer\DependencyResolver\Problem(); $problem->addRule($rule); $problem->addRule($conflict); $rule->disable(); $this->problems[] = $problem; continue; } // conflict with another root require/fixed package $problem = new \Composer\DependencyResolver\Problem(); $problem->addRule($rule); $problem->addRule($conflict); // push all of our rules (can only be root require/fixed package rules) // asserting this literal on the problem stack foreach ($this->rules->getIteratorFor(\Composer\DependencyResolver\RuleSet::TYPE_REQUEST) as $assertRule) { if ($assertRule->isDisabled() || !$assertRule->isAssertion()) { continue; } $assertRuleLiterals = $assertRule->getLiterals(); $assertRuleLiteral = $assertRuleLiterals[0]; if (\abs($literal) !== \abs($assertRuleLiteral)) { continue; } $problem->addRule($assertRule); $assertRule->disable(); } $this->problems[] = $problem; $this->decisions->resetToOffset($decisionStart); $ruleIndex = -1; } } protected function setupFixedMap(\Composer\DependencyResolver\Request $request) : void { $this->fixedMap = []; foreach ($request->getFixedPackages() as $package) { $this->fixedMap[$package->id] = $package; } } protected function checkForRootRequireProblems(\Composer\DependencyResolver\Request $request, PlatformRequirementFilterInterface $platformRequirementFilter) : void { foreach ($request->getRequires() as $packageName => $constraint) { if ($platformRequirementFilter->isIgnored($packageName)) { continue; } elseif ($platformRequirementFilter instanceof IgnoreListPlatformRequirementFilter) { $constraint = $platformRequirementFilter->filterConstraint($packageName, $constraint); } if (0 === \count($this->pool->whatProvides($packageName, $constraint))) { $problem = new \Composer\DependencyResolver\Problem(); $problem->addRule(new \Composer\DependencyResolver\GenericRule([], \Composer\DependencyResolver\Rule::RULE_ROOT_REQUIRE, ['packageName' => $packageName, 'constraint' => $constraint])); $this->problems[] = $problem; } } } public function solve(\Composer\DependencyResolver\Request $request, ?PlatformRequirementFilterInterface $platformRequirementFilter = null) : \Composer\DependencyResolver\LockTransaction { $platformRequirementFilter = $platformRequirementFilter ?? PlatformRequirementFilterFactory::ignoreNothing(); $this->setupFixedMap($request); $this->io->writeError('Generating rules', \true, IOInterface::DEBUG); $ruleSetGenerator = new \Composer\DependencyResolver\RuleSetGenerator($this->policy, $this->pool); $this->rules = $ruleSetGenerator->getRulesFor($request, $platformRequirementFilter); unset($ruleSetGenerator); $this->checkForRootRequireProblems($request, $platformRequirementFilter); $this->decisions = new \Composer\DependencyResolver\Decisions($this->pool); $this->watchGraph = new \Composer\DependencyResolver\RuleWatchGraph(); foreach ($this->rules as $rule) { $this->watchGraph->insert(new \Composer\DependencyResolver\RuleWatchNode($rule)); } /* make decisions based on root require/fix assertions */ $this->makeAssertionRuleDecisions(); $this->io->writeError('Resolving dependencies through SAT', \true, IOInterface::DEBUG); $before = \microtime(\true); $this->runSat(); $this->io->writeError('', \true, IOInterface::DEBUG); $this->io->writeError(\sprintf('Dependency resolution completed in %.3f seconds', \microtime(\true) - $before), \true, IOInterface::VERBOSE); if (\count($this->problems) > 0) { throw new \Composer\DependencyResolver\SolverProblemsException($this->problems, $this->learnedPool); } return new \Composer\DependencyResolver\LockTransaction($this->pool, $request->getPresentMap(), $request->getFixedPackagesMap(), $this->decisions); } /** * Makes a decision and propagates it to all rules. * * Evaluates each term affected by the decision (linked through watches) * If we find unit rules we make new decisions based on them * * @return Rule|null A rule on conflict, otherwise null. */ protected function propagate(int $level) : ?\Composer\DependencyResolver\Rule { while ($this->decisions->validOffset($this->propagateIndex)) { $decision = $this->decisions->atOffset($this->propagateIndex); $conflict = $this->watchGraph->propagateLiteral($decision[\Composer\DependencyResolver\Decisions::DECISION_LITERAL], $level, $this->decisions); $this->propagateIndex++; if ($conflict !== null) { return $conflict; } } return null; } /** * Reverts a decision at the given level. */ private function revert(int $level) : void { while (!$this->decisions->isEmpty()) { $literal = $this->decisions->lastLiteral(); if ($this->decisions->undecided($literal)) { break; } $decisionLevel = $this->decisions->decisionLevel($literal); if ($decisionLevel <= $level) { break; } $this->decisions->revertLast(); $this->propagateIndex = \count($this->decisions); } while (\count($this->branches) > 0 && $this->branches[\count($this->branches) - 1][self::BRANCH_LEVEL] >= $level) { \array_pop($this->branches); } } /** * setpropagatelearn * * add free decision (a positive literal) to decision queue * increase level and propagate decision * return if no conflict. * * in conflict case, analyze conflict rule, add resulting * rule to learnt rule set, make decision from learnt * rule (always unit) and re-propagate. * * returns the new solver level or 0 if unsolvable */ private function setPropagateLearn(int $level, int $literal, \Composer\DependencyResolver\Rule $rule) : int { $level++; $this->decisions->decide($literal, $level, $rule); while (\true) { $rule = $this->propagate($level); if (null === $rule) { break; } if ($level === 1) { $this->analyzeUnsolvable($rule); return 0; } // conflict [$learnLiteral, $newLevel, $newRule, $why] = $this->analyze($level, $rule); if ($newLevel <= 0 || $newLevel >= $level) { throw new \Composer\DependencyResolver\SolverBugException("Trying to revert to invalid level " . $newLevel . " from level " . $level . "."); } $level = $newLevel; $this->revert($level); $this->rules->add($newRule, \Composer\DependencyResolver\RuleSet::TYPE_LEARNED); $this->learnedWhy[\spl_object_hash($newRule)] = $why; $ruleNode = new \Composer\DependencyResolver\RuleWatchNode($newRule); $ruleNode->watch2OnHighest($this->decisions); $this->watchGraph->insert($ruleNode); $this->decisions->decide($learnLiteral, $level, $newRule); } return $level; } /** * @param non-empty-list $decisionQueue */ private function selectAndInstall(int $level, array $decisionQueue, \Composer\DependencyResolver\Rule $rule) : int { // choose best package to install from decisionQueue $literals = $this->policy->selectPreferredPackages($this->pool, $decisionQueue, $rule->getRequiredPackage()); $selectedLiteral = \array_shift($literals); // if there are multiple candidates, then branch if (\count($literals) > 0) { $this->branches[] = [$literals, $level]; } return $this->setPropagateLearn($level, $selectedLiteral, $rule); } /** * @return array{int, int, GenericRule, int} */ protected function analyze(int $level, \Composer\DependencyResolver\Rule $rule) : array { $analyzedRule = $rule; $ruleLevel = 1; $num = 0; $l1num = 0; $seen = []; $learnedLiteral = null; $otherLearnedLiterals = []; $decisionId = \count($this->decisions); $this->learnedPool[] = []; while (\true) { $this->learnedPool[\count($this->learnedPool) - 1][] = $rule; foreach ($rule->getLiterals() as $literal) { // multiconflictrule is really a bunch of rules in one, so some may not have finished propagating yet if ($rule instanceof \Composer\DependencyResolver\MultiConflictRule && !$this->decisions->decided($literal)) { continue; } // skip the one true literal if ($this->decisions->satisfy($literal)) { continue; } if (isset($seen[\abs($literal)])) { continue; } $seen[\abs($literal)] = \true; $l = $this->decisions->decisionLevel($literal); if (1 === $l) { $l1num++; } elseif ($level === $l) { $num++; } else { // not level1 or conflict level, add to new rule $otherLearnedLiterals[] = $literal; if ($l > $ruleLevel) { $ruleLevel = $l; } } } unset($literal); $l1retry = \true; while ($l1retry) { $l1retry = \false; if (0 === $num && 0 === --$l1num) { // all level 1 literals done break 2; } while (\true) { if ($decisionId <= 0) { throw new \Composer\DependencyResolver\SolverBugException("Reached invalid decision id {$decisionId} while looking through {$rule} for a literal present in the analyzed rule {$analyzedRule}."); } $decisionId--; $decision = $this->decisions->atOffset($decisionId); $literal = $decision[\Composer\DependencyResolver\Decisions::DECISION_LITERAL]; if (isset($seen[\abs($literal)])) { break; } } unset($seen[\abs($literal)]); if (0 !== $num && 0 === --$num) { if ($literal < 0) { $this->testFlagLearnedPositiveLiteral = \true; } $learnedLiteral = -$literal; if (0 === $l1num) { break 2; } foreach ($otherLearnedLiterals as $otherLiteral) { unset($seen[\abs($otherLiteral)]); } // only level 1 marks left $l1num++; $l1retry = \true; } else { $decision = $this->decisions->atOffset($decisionId); $rule = $decision[\Composer\DependencyResolver\Decisions::DECISION_REASON]; if ($rule instanceof \Composer\DependencyResolver\MultiConflictRule) { // there is only ever exactly one positive decision in a MultiConflictRule foreach ($rule->getLiterals() as $ruleLiteral) { if (!isset($seen[\abs($ruleLiteral)]) && $this->decisions->satisfy(-$ruleLiteral)) { $this->learnedPool[\count($this->learnedPool) - 1][] = $rule; $l = $this->decisions->decisionLevel($ruleLiteral); if (1 === $l) { $l1num++; } elseif ($level === $l) { $num++; } else { // not level1 or conflict level, add to new rule $otherLearnedLiterals[] = $ruleLiteral; if ($l > $ruleLevel) { $ruleLevel = $l; } } $seen[\abs($ruleLiteral)] = \true; break; } } $l1retry = \true; } } } $decision = $this->decisions->atOffset($decisionId); $rule = $decision[\Composer\DependencyResolver\Decisions::DECISION_REASON]; } $why = \count($this->learnedPool) - 1; if (null === $learnedLiteral) { throw new \Composer\DependencyResolver\SolverBugException("Did not find a learnable literal in analyzed rule {$analyzedRule}."); } \array_unshift($otherLearnedLiterals, $learnedLiteral); $newRule = new \Composer\DependencyResolver\GenericRule($otherLearnedLiterals, \Composer\DependencyResolver\Rule::RULE_LEARNED, $why); return [$learnedLiteral, $ruleLevel, $newRule, $why]; } /** * @param array $ruleSeen */ private function analyzeUnsolvableRule(\Composer\DependencyResolver\Problem $problem, \Composer\DependencyResolver\Rule $conflictRule, array &$ruleSeen) : void { $why = \spl_object_hash($conflictRule); $ruleSeen[$why] = \true; if ($conflictRule->getType() === \Composer\DependencyResolver\RuleSet::TYPE_LEARNED) { $learnedWhy = $this->learnedWhy[$why]; $problemRules = $this->learnedPool[$learnedWhy]; foreach ($problemRules as $problemRule) { if (!isset($ruleSeen[\spl_object_hash($problemRule)])) { $this->analyzeUnsolvableRule($problem, $problemRule, $ruleSeen); } } return; } if ($conflictRule->getType() === \Composer\DependencyResolver\RuleSet::TYPE_PACKAGE) { // package rules cannot be part of a problem return; } $problem->nextSection(); $problem->addRule($conflictRule); } private function analyzeUnsolvable(\Composer\DependencyResolver\Rule $conflictRule) : void { $problem = new \Composer\DependencyResolver\Problem(); $problem->addRule($conflictRule); $ruleSeen = []; $this->analyzeUnsolvableRule($problem, $conflictRule, $ruleSeen); $this->problems[] = $problem; $seen = []; $literals = $conflictRule->getLiterals(); foreach ($literals as $literal) { // skip the one true literal if ($this->decisions->satisfy($literal)) { continue; } $seen[\abs($literal)] = \true; } foreach ($this->decisions as $decision) { $decisionLiteral = $decision[\Composer\DependencyResolver\Decisions::DECISION_LITERAL]; // skip literals that are not in this rule if (!isset($seen[\abs($decisionLiteral)])) { continue; } $why = $decision[\Composer\DependencyResolver\Decisions::DECISION_REASON]; $problem->addRule($why); $this->analyzeUnsolvableRule($problem, $why, $ruleSeen); $literals = $why->getLiterals(); foreach ($literals as $literal) { // skip the one true literal if ($this->decisions->satisfy($literal)) { continue; } $seen[\abs($literal)] = \true; } } } private function runSat() : void { $this->propagateIndex = 0; /* * here's the main loop: * 1) propagate new decisions (only needed once) * 2) fulfill root requires/fixed packages * 3) fulfill all unresolved rules * 4) minimalize solution if we had choices * if we encounter a problem, we rewind to a safe level and restart * with step 1 */ $level = 1; $systemLevel = $level + 1; while (\true) { if (1 === $level) { $conflictRule = $this->propagate($level); if (null !== $conflictRule) { $this->analyzeUnsolvable($conflictRule); return; } } // handle root require/fixed package rules if ($level < $systemLevel) { $iterator = $this->rules->getIteratorFor(\Composer\DependencyResolver\RuleSet::TYPE_REQUEST); foreach ($iterator as $rule) { if ($rule->isEnabled()) { $decisionQueue = []; $noneSatisfied = \true; foreach ($rule->getLiterals() as $literal) { if ($this->decisions->satisfy($literal)) { $noneSatisfied = \false; break; } if ($literal > 0 && $this->decisions->undecided($literal)) { $decisionQueue[] = $literal; } } if ($noneSatisfied && \count($decisionQueue) > 0) { // if any of the options in the decision queue are fixed, only use those $prunedQueue = []; foreach ($decisionQueue as $literal) { if (isset($this->fixedMap[\abs($literal)])) { $prunedQueue[] = $literal; } } if (\count($prunedQueue) > 0) { $decisionQueue = $prunedQueue; } } if ($noneSatisfied && \count($decisionQueue) > 0) { $oLevel = $level; $level = $this->selectAndInstall($level, $decisionQueue, $rule); if (0 === $level) { return; } if ($level <= $oLevel) { break; } } } } $systemLevel = $level + 1; // root requires/fixed packages left $iterator->next(); if ($iterator->valid()) { continue; } } if ($level < $systemLevel) { $systemLevel = $level; } $rulesCount = \count($this->rules); $pass = 1; $this->io->writeError('Looking at all rules.', \true, IOInterface::DEBUG); for ($i = 0, $n = 0; $n < $rulesCount; $i++, $n++) { if ($i === $rulesCount) { if (1 === $pass) { $this->io->writeError("Something's changed, looking at all rules again (pass #{$pass})", \false, IOInterface::DEBUG); } else { $this->io->overwriteError("Something's changed, looking at all rules again (pass #{$pass})", \false, null, IOInterface::DEBUG); } $i = 0; $pass++; } $rule = $this->rules->ruleById[$i]; $literals = $rule->getLiterals(); if ($rule->isDisabled()) { continue; } $decisionQueue = []; // make sure that // * all negative literals are installed // * no positive literal is installed // i.e. the rule is not fulfilled and we // just need to decide on the positive literals // foreach ($literals as $literal) { if ($literal <= 0) { if (!$this->decisions->decidedInstall($literal)) { continue 2; // next rule } } else { if ($this->decisions->decidedInstall($literal)) { continue 2; // next rule } if ($this->decisions->undecided($literal)) { $decisionQueue[] = $literal; } } } // need to have at least 2 item to pick from if (\count($decisionQueue) < 2) { continue; } $level = $this->selectAndInstall($level, $decisionQueue, $rule); if (0 === $level) { return; } // something changed, so look at all rules again $rulesCount = \count($this->rules); $n = -1; } if ($level < $systemLevel) { continue; } // minimization step if (\count($this->branches) > 0) { $lastLiteral = null; $lastLevel = null; $lastBranchIndex = 0; $lastBranchOffset = 0; for ($i = \count($this->branches) - 1; $i >= 0; $i--) { [$literals, $l] = $this->branches[$i]; foreach ($literals as $offset => $literal) { if ($literal > 0 && $this->decisions->decisionLevel($literal) > $l + 1) { $lastLiteral = $literal; $lastBranchIndex = $i; $lastBranchOffset = $offset; $lastLevel = $l; } } } if ($lastLiteral !== null) { \assert($lastLevel !== null); unset($this->branches[$lastBranchIndex][self::BRANCH_LITERALS][$lastBranchOffset]); $level = $lastLevel; $this->revert($level); $why = $this->decisions->lastReason(); $level = $this->setPropagateLearn($level, $lastLiteral, $why); if ($level === 0) { return; } continue; } } break; } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\Link; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositorySet; use Composer\Package\Version\VersionParser; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; /** * @author Nils Adermann * @author Ruben Gonzalez * @phpstan-type ReasonData Link|BasePackage|string|int|array{packageName: string, constraint: ConstraintInterface}|array{package: BasePackage} */ abstract class Rule { // reason constants and // their reason data contents public const RULE_ROOT_REQUIRE = 2; // array{packageName: string, constraint: ConstraintInterface} public const RULE_FIXED = 3; // array{package: BasePackage} public const RULE_PACKAGE_CONFLICT = 6; // Link public const RULE_PACKAGE_REQUIRES = 7; // Link public const RULE_PACKAGE_SAME_NAME = 10; // string (package name) public const RULE_LEARNED = 12; // int (rule id) public const RULE_PACKAGE_ALIAS = 13; // BasePackage public const RULE_PACKAGE_INVERSE_ALIAS = 14; // BasePackage // bitfield defs private const BITFIELD_TYPE = 0; private const BITFIELD_REASON = 8; private const BITFIELD_DISABLED = 16; /** @var int */ protected $bitfield; /** @var Request */ protected $request; /** * @var Link|BasePackage|ConstraintInterface|string * @phpstan-var ReasonData */ protected $reasonData; /** * @param self::RULE_* $reason A RULE_* constant describing the reason for generating this rule * @param mixed $reasonData * * @phpstan-param ReasonData $reasonData */ public function __construct($reason, $reasonData) { $this->reasonData = $reasonData; $this->bitfield = 0 << self::BITFIELD_DISABLED | $reason << self::BITFIELD_REASON | 255 << self::BITFIELD_TYPE; } /** * @return list */ public abstract function getLiterals() : array; /** * @return int|string */ public abstract function getHash(); public abstract function __toString() : string; public abstract function equals(\Composer\DependencyResolver\Rule $rule) : bool; /** * @return self::RULE_* */ public function getReason() : int { return ($this->bitfield & 255 << self::BITFIELD_REASON) >> self::BITFIELD_REASON; } /** * @phpstan-return ReasonData */ public function getReasonData() { return $this->reasonData; } public function getRequiredPackage() : ?string { switch ($this->getReason()) { case self::RULE_ROOT_REQUIRE: return $this->getReasonData()['packageName']; case self::RULE_FIXED: return $this->getReasonData()['package']->getName(); case self::RULE_PACKAGE_REQUIRES: return $this->getReasonData()->getTarget(); } return null; } /** * @param RuleSet::TYPE_* $type */ public function setType($type) : void { $this->bitfield = $this->bitfield & ~(255 << self::BITFIELD_TYPE) | (255 & $type) << self::BITFIELD_TYPE; } public function getType() : int { return ($this->bitfield & 255 << self::BITFIELD_TYPE) >> self::BITFIELD_TYPE; } public function disable() : void { $this->bitfield = $this->bitfield & ~(255 << self::BITFIELD_DISABLED) | 1 << self::BITFIELD_DISABLED; } public function enable() : void { $this->bitfield &= ~(255 << self::BITFIELD_DISABLED); } public function isDisabled() : bool { return 0 !== ($this->bitfield & 255 << self::BITFIELD_DISABLED) >> self::BITFIELD_DISABLED; } public function isEnabled() : bool { return 0 === ($this->bitfield & 255 << self::BITFIELD_DISABLED) >> self::BITFIELD_DISABLED; } public abstract function isAssertion() : bool; public function isCausedByLock(RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : bool { if ($this->getReason() === self::RULE_PACKAGE_REQUIRES) { if (PlatformRepository::isPlatformPackage($this->getReasonData()->getTarget())) { return \false; } if ($request->getLockedRepository() !== null) { foreach ($request->getLockedRepository()->getPackages() as $package) { if ($package->getName() === $this->getReasonData()->getTarget()) { if ($pool->isUnacceptableFixedOrLockedPackage($package)) { return \true; } if (!$this->getReasonData()->getConstraint()->matches(new Constraint('=', $package->getVersion()))) { return \true; } // required package was locked but has been unlocked and still matches if (!$request->isLockedPackage($package)) { return \true; } break; } } } } if ($this->getReason() === self::RULE_ROOT_REQUIRE) { if (PlatformRepository::isPlatformPackage($this->getReasonData()['packageName'])) { return \false; } if ($request->getLockedRepository() !== null) { foreach ($request->getLockedRepository()->getPackages() as $package) { if ($package->getName() === $this->getReasonData()['packageName']) { if ($pool->isUnacceptableFixedOrLockedPackage($package)) { return \true; } if (!$this->getReasonData()['constraint']->matches(new Constraint('=', $package->getVersion()))) { return \true; } break; } } } } return \false; } /** * @internal */ public function getSourcePackage(\Composer\DependencyResolver\Pool $pool) : BasePackage { $literals = $this->getLiterals(); switch ($this->getReason()) { case self::RULE_PACKAGE_CONFLICT: $package1 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[0])); $package2 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[1])); $reasonData = $this->getReasonData(); // swap literals if they are not in the right order with package2 being the conflicter if ($reasonData->getSource() === $package1->getName()) { [$package2, $package1] = [$package1, $package2]; } return $package2; case self::RULE_PACKAGE_REQUIRES: $sourceLiteral = $literals[0]; $sourcePackage = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($sourceLiteral)); return $sourcePackage; default: throw new \LogicException('Not implemented'); } } /** * @param BasePackage[] $installedMap * @param array $learnedPool */ public function getPrettyString(RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []) : string { $literals = $this->getLiterals(); switch ($this->getReason()) { case self::RULE_ROOT_REQUIRE: $reasonData = $this->getReasonData(); $packageName = $reasonData['packageName']; $constraint = $reasonData['constraint']; $packages = $pool->whatProvides($packageName, $constraint); if (0 === \count($packages)) { return 'No package found to satisfy root composer.json require ' . $packageName . ' ' . $constraint->getPrettyString(); } $packagesNonAlias = \array_values(\array_filter($packages, static function ($p) : bool { return !$p instanceof AliasPackage; })); if (\count($packagesNonAlias) === 1) { $package = $packagesNonAlias[0]; if ($request->isLockedPackage($package)) { return $package->getPrettyName() . ' is locked to version ' . $package->getPrettyVersion() . " and an update of this package was not requested."; } } return 'Root composer.json requires ' . $packageName . ' ' . $constraint->getPrettyString() . ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $packages, $isVerbose, $constraint) . '.'; case self::RULE_FIXED: $package = $this->deduplicateDefaultBranchAlias($this->getReasonData()['package']); if ($request->isLockedPackage($package)) { return $package->getPrettyName() . ' is locked to version ' . $package->getPrettyVersion() . ' and an update of this package was not requested.'; } return $package->getPrettyName() . ' is present at version ' . $package->getPrettyVersion() . ' and cannot be modified by Composer'; case self::RULE_PACKAGE_CONFLICT: $package1 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[0])); $package2 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[1])); $conflictTarget = $package1->getPrettyString(); $reasonData = $this->getReasonData(); // swap literals if they are not in the right order with package2 being the conflicter if ($reasonData->getSource() === $package1->getName()) { [$package2, $package1] = [$package1, $package2]; $conflictTarget = $package1->getPrettyName() . ' ' . $reasonData->getPrettyConstraint(); } // if the conflict is not directly against the package but something it provides/replaces, // we try to find that link to display a better message if ($reasonData->getTarget() !== $package1->getName()) { $provideType = null; $provided = null; foreach ($package1->getProvides() as $provide) { if ($provide->getTarget() === $reasonData->getTarget()) { $provideType = 'provides'; $provided = $provide->getPrettyConstraint(); break; } } foreach ($package1->getReplaces() as $replace) { if ($replace->getTarget() === $reasonData->getTarget()) { $provideType = 'replaces'; $provided = $replace->getPrettyConstraint(); break; } } if (null !== $provideType) { $conflictTarget = $reasonData->getTarget() . ' ' . $reasonData->getPrettyConstraint() . ' (' . $package1->getPrettyString() . ' ' . $provideType . ' ' . $reasonData->getTarget() . ' ' . $provided . ')'; } } return $package2->getPrettyString() . ' conflicts with ' . $conflictTarget . '.'; case self::RULE_PACKAGE_REQUIRES: \assert(\count($literals) > 0); $sourceLiteral = \array_shift($literals); $sourcePackage = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($sourceLiteral)); $reasonData = $this->getReasonData(); $requires = []; foreach ($literals as $literal) { $requires[] = $pool->literalToPackage($literal); } $text = $reasonData->getPrettyString($sourcePackage); if (\count($requires) > 0) { $text .= ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $requires, $isVerbose, $reasonData->getConstraint()) . '.'; } else { $targetName = $reasonData->getTarget(); $reason = \Composer\DependencyResolver\Problem::getMissingPackageReason($repositorySet, $request, $pool, $isVerbose, $targetName, $reasonData->getConstraint()); return $text . ' -> ' . $reason[1]; } return $text; case self::RULE_PACKAGE_SAME_NAME: $packageNames = []; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); $packageNames[$package->getName()] = \true; } unset($literal); $replacedName = $this->getReasonData(); if (\count($packageNames) > 1) { if (!isset($packageNames[$replacedName])) { $reason = 'They ' . (\count($literals) === 2 ? 'both' : 'all') . ' replace ' . $replacedName . ' and thus cannot coexist.'; } else { $replacerNames = $packageNames; unset($replacerNames[$replacedName]); $replacerNames = \array_keys($replacerNames); if (\count($replacerNames) === 1) { $reason = $replacerNames[0] . ' replaces '; } else { $reason = '[' . \implode(', ', $replacerNames) . '] replace '; } $reason .= $replacedName . ' and thus cannot coexist with it.'; } $installedPackages = []; $removablePackages = []; foreach ($literals as $literal) { if (isset($installedMap[\abs($literal)])) { $installedPackages[] = $pool->literalToPackage($literal); } else { $removablePackages[] = $pool->literalToPackage($literal); } } if (\count($installedPackages) > 0 && \count($removablePackages) > 0) { return $this->formatPackagesUnique($pool, $removablePackages, $isVerbose, null, \true) . ' cannot be installed as that would require removing ' . $this->formatPackagesUnique($pool, $installedPackages, $isVerbose, null, \true) . '. ' . $reason; } return 'Only one of these can be installed: ' . $this->formatPackagesUnique($pool, $literals, $isVerbose, null, \true) . '. ' . $reason; } return 'You can only install one version of a package, so only one of these can be installed: ' . $this->formatPackagesUnique($pool, $literals, $isVerbose, null, \true) . '.'; case self::RULE_LEARNED: /** @TODO currently still generates way too much output to be helpful, and in some cases can even lead to endless recursion */ // if (isset($learnedPool[$this->getReasonData()])) { // echo $this->getReasonData()."\n"; // $learnedString = ', learned rules:' . Problem::formatDeduplicatedRules($learnedPool[$this->getReasonData()], ' ', $repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool); // } else { // $learnedString = ' (reasoning unavailable)'; // } $learnedString = ' (conflict analysis result)'; if (\count($literals) === 1) { $ruleText = $pool->literalToPrettyString($literals[0], $installedMap); } else { $groups = []; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if (isset($installedMap[$package->id])) { $group = $literal > 0 ? 'keep' : 'remove'; } else { $group = $literal > 0 ? 'install' : 'don\'t install'; } $groups[$group][] = $this->deduplicateDefaultBranchAlias($package); } $ruleTexts = []; foreach ($groups as $group => $packages) { $ruleTexts[] = $group . (\count($packages) > 1 ? ' one of' : '') . ' ' . $this->formatPackagesUnique($pool, $packages, $isVerbose); } $ruleText = \implode(' | ', $ruleTexts); } return 'Conclusion: ' . $ruleText . $learnedString; case self::RULE_PACKAGE_ALIAS: $aliasPackage = $pool->literalToPackage($literals[0]); // avoid returning content like "9999999-dev is an alias of dev-master" as it is useless if ($aliasPackage->getVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { return ''; } $package = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[1])); return $aliasPackage->getPrettyString() . ' is an alias of ' . $package->getPrettyString() . ' and thus requires it to be installed too.'; case self::RULE_PACKAGE_INVERSE_ALIAS: // inverse alias rules work the other way around than above $aliasPackage = $pool->literalToPackage($literals[1]); // avoid returning content like "9999999-dev is an alias of dev-master" as it is useless if ($aliasPackage->getVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { return ''; } $package = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[0])); return $aliasPackage->getPrettyString() . ' is an alias of ' . $package->getPrettyString() . ' and must be installed with it.'; default: $ruleText = ''; foreach ($literals as $i => $literal) { if ($i !== 0) { $ruleText .= '|'; } $ruleText .= $pool->literalToPrettyString($literal, $installedMap); } return '(' . $ruleText . ')'; } } /** * @param array $literalsOrPackages An array containing packages or literals */ protected function formatPackagesUnique(\Composer\DependencyResolver\Pool $pool, array $literalsOrPackages, bool $isVerbose, ?ConstraintInterface $constraint = null, bool $useRemovedVersionGroup = \false) : string { $packages = []; foreach ($literalsOrPackages as $package) { $packages[] = \is_object($package) ? $package : $pool->literalToPackage($package); } return \Composer\DependencyResolver\Problem::getPackageList($packages, $isVerbose, $pool, $constraint, $useRemovedVersionGroup); } private function deduplicateDefaultBranchAlias(BasePackage $package) : BasePackage { if ($package instanceof AliasPackage && $package->getPrettyVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { $package = $package->getAliasOf(); } return $package; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann * @phpstan-import-type ReasonData from Rule */ class Rule2Literals extends \Composer\DependencyResolver\Rule { /** @var int */ protected $literal1; /** @var int */ protected $literal2; /** * @param Rule::RULE_* $reason A RULE_* constant * @param mixed $reasonData * * @phpstan-param ReasonData $reasonData */ public function __construct(int $literal1, int $literal2, $reason, $reasonData) { parent::__construct($reason, $reasonData); if ($literal1 < $literal2) { $this->literal1 = $literal1; $this->literal2 = $literal2; } else { $this->literal1 = $literal2; $this->literal2 = $literal1; } } /** * @return non-empty-list */ public function getLiterals() : array { return [$this->literal1, $this->literal2]; } /** * @inheritDoc */ public function getHash() { return $this->literal1 . ',' . $this->literal2; } /** * Checks if this rule is equal to another one * * Ignores whether either of the rules is disabled. * * @param Rule $rule The rule to check against * @return bool Whether the rules are equal */ public function equals(\Composer\DependencyResolver\Rule $rule) : bool { // specialized fast-case if ($rule instanceof self) { if ($this->literal1 !== $rule->literal1) { return \false; } if ($this->literal2 !== $rule->literal2) { return \false; } return \true; } $literals = $rule->getLiterals(); if (2 !== \count($literals)) { return \false; } if ($this->literal1 !== $literals[0]) { return \false; } if ($this->literal2 !== $literals[1]) { return \false; } return \true; } /** @return false */ public function isAssertion() : bool { return \false; } /** * Formats a rule as a string of the format (Literal1|Literal2|...) */ public function __toString() : string { $result = $this->isDisabled() ? 'disabled(' : '('; $result .= $this->literal1 . '|' . $this->literal2 . ')'; return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Util\IniHelper; use Composer\Repository\RepositorySet; /** * @author Nils Adermann * * @method self::ERROR_DEPENDENCY_RESOLUTION_FAILED getCode() */ class SolverProblemsException extends \RuntimeException { public const ERROR_DEPENDENCY_RESOLUTION_FAILED = 2; /** @var Problem[] */ protected $problems; /** @var array */ protected $learnedPool; /** * @param Problem[] $problems * @param array $learnedPool */ public function __construct(array $problems, array $learnedPool) { $this->problems = $problems; $this->learnedPool = $learnedPool; parent::__construct('Failed resolving dependencies with ' . \count($problems) . ' problems, call getPrettyString to get formatted details', self::ERROR_DEPENDENCY_RESOLUTION_FAILED); } public function getPrettyString(RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool, bool $isVerbose, bool $isDevExtraction = \false) : string { $installedMap = $request->getPresentMap(\true); $missingExtensions = []; $isCausedByLock = \false; $problems = []; foreach ($this->problems as $problem) { $problems[] = $problem->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $this->learnedPool) . "\n"; $missingExtensions = \array_merge($missingExtensions, $this->getExtensionProblems($problem->getReasons())); $isCausedByLock = $isCausedByLock || $problem->isCausedByLock($repositorySet, $request, $pool); } $i = 1; $text = "\n"; foreach (\array_unique($problems) as $problem) { $text .= " Problem " . $i++ . $problem; } $hints = []; if (!$isDevExtraction && (\str_contains($text, 'could not be found') || \str_contains($text, 'no matching package found'))) { $hints[] = "Potential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see for more details.\n - It's a private package and you forgot to add a custom repository to find it\n\nRead for further common problems."; } if (\count($missingExtensions) > 0) { $hints[] = $this->createExtensionHint($missingExtensions); } if ($isCausedByLock && !$isDevExtraction && !$request->getUpdateAllowTransitiveRootDependencies()) { $hints[] = "Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions."; } if (\str_contains($text, 'found composer-plugin-api[2.0.0] but it does not match') && \str_contains($text, '- ocramius/package-versions')) { $hints[] = "ocramius/package-versions only provides support for Composer 2 in 1.8+, which requires PHP 7.4.\nIf you can not upgrade PHP you can require composer/package-versions-deprecated to resolve this with PHP 7.0+."; } if (!\class_exists('_ContaoManager\\PHPUnit\\Framework\\TestCase', \false)) { if (\str_contains($text, 'found composer-plugin-api[2.0.0] but it does not match')) { $hints[] = "You are using Composer 2, which some of your plugins seem to be incompatible with. Make sure you update your plugins or report a plugin-issue to ask them to support Composer 2."; } } if (\count($hints) > 0) { $text .= "\n" . \implode("\n\n", $hints); } return $text; } /** * @return Problem[] */ public function getProblems() : array { return $this->problems; } /** * @param string[] $missingExtensions */ private function createExtensionHint(array $missingExtensions) : string { $paths = IniHelper::getAll(); if ('' === $paths[0]) { if (\count($paths) === 1) { return ''; } \array_shift($paths); } $ignoreExtensionsArguments = \implode(" ", \array_map(static function ($extension) { return "--ignore-platform-req={$extension}"; }, \array_unique($missingExtensions))); $text = "To enable extensions, verify that they are enabled in your .ini files:\n - "; $text .= \implode("\n - ", $paths); $text .= "\nYou can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode."; $text .= "\nAlternatively, you can run Composer with `{$ignoreExtensionsArguments}` to temporarily ignore these required extensions."; return $text; } /** * @param Rule[][] $reasonSets * @return string[] */ private function getExtensionProblems(array $reasonSets) : array { $missingExtensions = []; foreach ($reasonSets as $reasonSet) { foreach ($reasonSet as $rule) { $required = $rule->getRequiredPackage(); if (null !== $required && 0 === \strpos($required, 'ext-')) { $missingExtensions[$required] = 1; } } } return \array_keys($missingExtensions); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann */ class SolverBugException extends \RuntimeException { public function __construct(string $message) { parent::__construct($message . "\nThis exception was most likely caused by a bug in Composer.\n" . "Please report the command you ran, the exact error you received, and your composer.json on https://github.com/composer/composer/issues - thank you!\n"); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Semver\CompilingMatcher; use Composer\Semver\Constraint\Constraint; /** * @author Nils Adermann * @author Jordi Boggiano */ class DefaultPolicy implements \Composer\DependencyResolver\PolicyInterface { /** @var bool */ private $preferStable; /** @var bool */ private $preferLowest; /** @var array|null */ private $preferredVersions; /** @var array>> */ private $preferredPackageResultCachePerPool; /** @var array> */ private $sortingCachePerPool; /** * @param array|null $preferredVersions Must be an array of package name => normalized version */ public function __construct(bool $preferStable = \false, bool $preferLowest = \false, ?array $preferredVersions = null) { $this->preferStable = $preferStable; $this->preferLowest = $preferLowest; $this->preferredVersions = $preferredVersions; } /** * @param string $operator One of Constraint::STR_OP_* * * @phpstan-param Constraint::STR_OP_* $operator */ public function versionCompare(PackageInterface $a, PackageInterface $b, string $operator) : bool { if ($this->preferStable && ($stabA = $a->getStability()) !== ($stabB = $b->getStability())) { return BasePackage::STABILITIES[$stabA] < BasePackage::STABILITIES[$stabB]; } // dev versions need to be compared as branches via matchSpecific's special treatment, the rest can be optimized with compiling matcher if ($a->isDev() && \str_starts_with($a->getVersion(), 'dev-') || $b->isDev() && \str_starts_with($b->getVersion(), 'dev-')) { $constraint = new Constraint($operator, $b->getVersion()); $version = new Constraint('==', $a->getVersion()); return $constraint->matchSpecific($version, \true); } return CompilingMatcher::match(new Constraint($operator, $b->getVersion()), Constraint::OP_EQ, $a->getVersion()); } /** * @param non-empty-list $literals * @return non-empty-list */ public function selectPreferredPackages(\Composer\DependencyResolver\Pool $pool, array $literals, ?string $requiredPackage = null) : array { \sort($literals); $resultCacheKey = \implode(',', $literals) . $requiredPackage; $poolId = \spl_object_id($pool); if (isset($this->preferredPackageResultCachePerPool[$poolId][$resultCacheKey])) { return $this->preferredPackageResultCachePerPool[$poolId][$resultCacheKey]; } $packages = $this->groupLiteralsByName($pool, $literals); foreach ($packages as &$nameLiterals) { \usort($nameLiterals, function ($a, $b) use($pool, $requiredPackage, $poolId) : int { $cacheKey = 'i' . $a . '.' . $b . $requiredPackage; // i prefix -> ignoreReplace = true if (isset($this->sortingCachePerPool[$poolId][$cacheKey])) { return $this->sortingCachePerPool[$poolId][$cacheKey]; } return $this->sortingCachePerPool[$poolId][$cacheKey] = $this->compareByPriority($pool, $pool->literalToPackage($a), $pool->literalToPackage($b), $requiredPackage, \true); }); } foreach ($packages as &$sortedLiterals) { $sortedLiterals = $this->pruneToBestVersion($pool, $sortedLiterals); $sortedLiterals = $this->pruneRemoteAliases($pool, $sortedLiterals); } $selected = \array_merge(...\array_values($packages)); // now sort the result across all packages to respect replaces across packages \usort($selected, function ($a, $b) use($pool, $requiredPackage, $poolId) : int { $cacheKey = $a . '.' . $b . $requiredPackage; // no i prefix -> ignoreReplace = false if (isset($this->sortingCachePerPool[$poolId][$cacheKey])) { return $this->sortingCachePerPool[$poolId][$cacheKey]; } return $this->sortingCachePerPool[$poolId][$cacheKey] = $this->compareByPriority($pool, $pool->literalToPackage($a), $pool->literalToPackage($b), $requiredPackage); }); return $this->preferredPackageResultCachePerPool[$poolId][$resultCacheKey] = $selected; } /** * @param non-empty-list $literals * @return non-empty-array> */ protected function groupLiteralsByName(\Composer\DependencyResolver\Pool $pool, array $literals) : array { $packages = []; foreach ($literals as $literal) { $packageName = $pool->literalToPackage($literal)->getName(); if (!isset($packages[$packageName])) { $packages[$packageName] = []; } $packages[$packageName][] = $literal; } return $packages; } /** * @protected */ public function compareByPriority(\Composer\DependencyResolver\Pool $pool, BasePackage $a, BasePackage $b, ?string $requiredPackage = null, bool $ignoreReplace = \false) : int { // prefer aliases to the original package if ($a->getName() === $b->getName()) { $aAliased = $a instanceof AliasPackage; $bAliased = $b instanceof AliasPackage; if ($aAliased && !$bAliased) { return -1; // use a } if (!$aAliased && $bAliased) { return 1; // use b } } if (!$ignoreReplace) { // return original, not replaced if ($this->replaces($a, $b)) { return 1; // use b } if ($this->replaces($b, $a)) { return -1; // use a } // for replacers not replacing each other, put a higher prio on replacing // packages with the same vendor as the required package if ($requiredPackage !== null && \false !== ($pos = \strpos($requiredPackage, '/'))) { $requiredVendor = \substr($requiredPackage, 0, $pos); $aIsSameVendor = \strpos($a->getName(), $requiredVendor) === 0; $bIsSameVendor = \strpos($b->getName(), $requiredVendor) === 0; if ($bIsSameVendor !== $aIsSameVendor) { return $aIsSameVendor ? -1 : 1; } } } // priority equal, sort by package id to make reproducible if ($a->id === $b->id) { return 0; } return $a->id < $b->id ? -1 : 1; } /** * Checks if source replaces a package with the same name as target. * * Replace constraints are ignored. This method should only be used for * prioritisation, not for actual constraint verification. */ protected function replaces(BasePackage $source, BasePackage $target) : bool { foreach ($source->getReplaces() as $link) { if ($link->getTarget() === $target->getName()) { return \true; } } return \false; } /** * @param list $literals * @return list */ protected function pruneToBestVersion(\Composer\DependencyResolver\Pool $pool, array $literals) : array { if ($this->preferredVersions !== null) { $name = $pool->literalToPackage($literals[0])->getName(); if (isset($this->preferredVersions[$name])) { $preferredVersion = $this->preferredVersions[$name]; $bestLiterals = []; foreach ($literals as $literal) { if ($pool->literalToPackage($literal)->getVersion() === $preferredVersion) { $bestLiterals[] = $literal; } } if (\count($bestLiterals) > 0) { return $bestLiterals; } } } $operator = $this->preferLowest ? '<' : '>'; $bestLiterals = [$literals[0]]; $bestPackage = $pool->literalToPackage($literals[0]); foreach ($literals as $i => $literal) { if (0 === $i) { continue; } $package = $pool->literalToPackage($literal); if ($this->versionCompare($package, $bestPackage, $operator)) { $bestPackage = $package; $bestLiterals = [$literal]; } elseif ($this->versionCompare($package, $bestPackage, '==')) { $bestLiterals[] = $literal; } } return $bestLiterals; } /** * Assumes that locally aliased (in root package requires) packages take priority over branch-alias ones * * If no package is a local alias, nothing happens * * @param list $literals * @return list */ protected function pruneRemoteAliases(\Composer\DependencyResolver\Pool $pool, array $literals) : array { $hasLocalAlias = \false; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if ($package instanceof AliasPackage && $package->isRootPackageAlias()) { $hasLocalAlias = \true; break; } } if (!$hasLocalAlias) { return $literals; } $selected = []; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if ($package instanceof AliasPackage && $package->isRootPackageAlias()) { $selected[] = $literal; } } return $selected; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * Wrapper around a Rule which keeps track of the two literals it watches * * Used by RuleWatchGraph to store rules in two RuleWatchChains. * * @author Nils Adermann */ class RuleWatchNode { /** @var int */ public $watch1; /** @var int */ public $watch2; /** @var Rule */ protected $rule; /** * Creates a new node watching the first and second literals of the rule. * * @param Rule $rule The rule to wrap */ public function __construct(\Composer\DependencyResolver\Rule $rule) { $this->rule = $rule; $literals = $rule->getLiterals(); $literalCount = \count($literals); $this->watch1 = $literalCount > 0 ? $literals[0] : 0; $this->watch2 = $literalCount > 1 ? $literals[1] : 0; } /** * Places the second watch on the rule's literal, decided at the highest level * * Useful for learned rules where the literal for the highest rule is most * likely to quickly lead to further decisions. * * @param Decisions $decisions The decisions made so far by the solver */ public function watch2OnHighest(\Composer\DependencyResolver\Decisions $decisions) : void { $literals = $this->rule->getLiterals(); // if there are only 2 elements, both are being watched anyway if (\count($literals) < 3 || $this->rule instanceof \Composer\DependencyResolver\MultiConflictRule) { return; } $watchLevel = 0; foreach ($literals as $literal) { $level = $decisions->decisionLevel($literal); if ($level > $watchLevel) { $this->watch2 = $literal; $watchLevel = $level; } } } /** * Returns the rule this node wraps */ public function getRule() : \Composer\DependencyResolver\Rule { return $this->rule; } /** * Given one watched literal, this method returns the other watched literal * * @param int $literal The watched literal that should not be returned * @return int A literal */ public function getOtherWatch(int $literal) : int { if ($this->watch1 === $literal) { return $this->watch2; } return $this->watch1; } /** * Moves a watch from one literal to another * * @param int $from The previously watched literal * @param int $to The literal to be watched now */ public function moveWatch(int $from, int $to) : void { if ($this->watch1 === $from) { $this->watch1 = $to; } else { $this->watch2 = $to; } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Repository\RepositorySet; /** * @author Nils Adermann * @implements \IteratorAggregate * @internal * @final */ class RuleSet implements \IteratorAggregate, \Countable { // highest priority => lowest number public const TYPE_PACKAGE = 0; public const TYPE_REQUEST = 1; public const TYPE_LEARNED = 4; /** * READ-ONLY: Lookup table for rule id to rule object * * @var array */ public $ruleById = []; const TYPES = [self::TYPE_PACKAGE => 'PACKAGE', self::TYPE_REQUEST => 'REQUEST', self::TYPE_LEARNED => 'LEARNED']; /** @var array */ protected $rules; /** @var 0|positive-int */ protected $nextRuleId = 0; /** @var array */ protected $rulesByHash = []; public function __construct() { foreach ($this->getTypes() as $type) { $this->rules[$type] = []; } } /** * @param self::TYPE_* $type */ public function add(\Composer\DependencyResolver\Rule $rule, $type) : void { if (!isset(self::TYPES[$type])) { throw new \OutOfBoundsException('Unknown rule type: ' . $type); } $hash = $rule->getHash(); // Do not add if rule already exists if (isset($this->rulesByHash[$hash])) { $potentialDuplicates = $this->rulesByHash[$hash]; if (\is_array($potentialDuplicates)) { foreach ($potentialDuplicates as $potentialDuplicate) { if ($rule->equals($potentialDuplicate)) { return; } } } else { if ($rule->equals($potentialDuplicates)) { return; } } } if (!isset($this->rules[$type])) { $this->rules[$type] = []; } $this->rules[$type][] = $rule; $this->ruleById[$this->nextRuleId] = $rule; $rule->setType($type); $this->nextRuleId++; if (!isset($this->rulesByHash[$hash])) { $this->rulesByHash[$hash] = $rule; } elseif (\is_array($this->rulesByHash[$hash])) { $this->rulesByHash[$hash][] = $rule; } else { $originalRule = $this->rulesByHash[$hash]; $this->rulesByHash[$hash] = [$originalRule, $rule]; } } public function count() : int { return $this->nextRuleId; } public function ruleById(int $id) : \Composer\DependencyResolver\Rule { return $this->ruleById[$id]; } /** @return array */ public function getRules() : array { return $this->rules; } public function getIterator() : \Composer\DependencyResolver\RuleSetIterator { return new \Composer\DependencyResolver\RuleSetIterator($this->getRules()); } /** * @param self::TYPE_*|array $types */ public function getIteratorFor($types) : \Composer\DependencyResolver\RuleSetIterator { if (!\is_array($types)) { $types = [$types]; } $allRules = $this->getRules(); /** @var array $rules */ $rules = []; foreach ($types as $type) { $rules[$type] = $allRules[$type]; } return new \Composer\DependencyResolver\RuleSetIterator($rules); } /** * @param array|self::TYPE_* $types */ public function getIteratorWithout($types) : \Composer\DependencyResolver\RuleSetIterator { if (!\is_array($types)) { $types = [$types]; } $rules = $this->getRules(); foreach ($types as $type) { unset($rules[$type]); } return new \Composer\DependencyResolver\RuleSetIterator($rules); } /** * @return array{self::TYPE_PACKAGE, self::TYPE_REQUEST, self::TYPE_LEARNED} */ public function getTypes() : array { $types = self::TYPES; return \array_keys($types); } public function getPrettyString(?RepositorySet $repositorySet = null, ?\Composer\DependencyResolver\Request $request = null, ?\Composer\DependencyResolver\Pool $pool = null, bool $isVerbose = \false) : string { $string = "\n"; foreach ($this->rules as $type => $rules) { $string .= \str_pad(self::TYPES[$type], 8, ' ') . ": "; foreach ($rules as $rule) { $string .= ($repositorySet !== null && $request !== null && $pool !== null ? $rule->getPrettyString($repositorySet, $request, $pool, $isVerbose) : $rule) . "\n"; } $string .= "\n\n"; } return $string; } public function __toString() : string { return $this->getPrettyString(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\BasePackage; use Composer\Package\Version\VersionParser; use Composer\Semver\CompilingMatcher; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; /** * A package pool contains all packages for dependency resolution * * @author Nils Adermann * @author Jordi Boggiano */ class Pool implements \Countable { /** @var BasePackage[] */ protected $packages = []; /** @var array */ protected $packageByName = []; /** @var VersionParser */ protected $versionParser; /** @var array> */ protected $providerCache = []; /** @var BasePackage[] */ protected $unacceptableFixedOrLockedPackages; /** @var array> Map of package name => normalized version => pretty version */ protected $removedVersions = []; /** @var array> Map of package object hash => removed normalized versions => removed pretty version */ protected $removedVersionsByPackage = []; /** * @param BasePackage[] $packages * @param BasePackage[] $unacceptableFixedOrLockedPackages * @param array> $removedVersions * @param array> $removedVersionsByPackage */ public function __construct(array $packages = [], array $unacceptableFixedOrLockedPackages = [], array $removedVersions = [], array $removedVersionsByPackage = []) { $this->versionParser = new VersionParser(); $this->setPackages($packages); $this->unacceptableFixedOrLockedPackages = $unacceptableFixedOrLockedPackages; $this->removedVersions = $removedVersions; $this->removedVersionsByPackage = $removedVersionsByPackage; } /** * @return array */ public function getRemovedVersions(string $name, ConstraintInterface $constraint) : array { if (!isset($this->removedVersions[$name])) { return []; } $result = []; foreach ($this->removedVersions[$name] as $version => $prettyVersion) { if ($constraint->matches(new Constraint('==', $version))) { $result[$version] = $prettyVersion; } } return $result; } /** * @return array */ public function getRemovedVersionsByPackage(string $objectHash) : array { if (!isset($this->removedVersionsByPackage[$objectHash])) { return []; } return $this->removedVersionsByPackage[$objectHash]; } /** * @param BasePackage[] $packages */ private function setPackages(array $packages) : void { $id = 1; foreach ($packages as $package) { $this->packages[] = $package; $package->id = $id++; foreach ($package->getNames() as $provided) { $this->packageByName[$provided][] = $package; } } } /** * @return BasePackage[] */ public function getPackages() : array { return $this->packages; } /** * Retrieves the package object for a given package id. */ public function packageById(int $id) : BasePackage { return $this->packages[$id - 1]; } /** * Returns how many packages have been loaded into the pool */ public function count() : int { return \count($this->packages); } /** * Searches all packages providing the given package name and match the constraint * * @param string $name The package name to be searched for * @param ?ConstraintInterface $constraint A constraint that all returned * packages must match or null to return all * @return BasePackage[] A set of packages */ public function whatProvides(string $name, ?ConstraintInterface $constraint = null) : array { $key = (string) $constraint; if (isset($this->providerCache[$name][$key])) { return $this->providerCache[$name][$key]; } return $this->providerCache[$name][$key] = $this->computeWhatProvides($name, $constraint); } /** * @param string $name The package name to be searched for * @param ?ConstraintInterface $constraint A constraint that all returned * packages must match or null to return all * @return BasePackage[] */ private function computeWhatProvides(string $name, ?ConstraintInterface $constraint = null) : array { if (!isset($this->packageByName[$name])) { return []; } $matches = []; foreach ($this->packageByName[$name] as $candidate) { if ($this->match($candidate, $name, $constraint)) { $matches[] = $candidate; } } return $matches; } public function literalToPackage(int $literal) : BasePackage { $packageId = \abs($literal); return $this->packageById($packageId); } /** * @param array $installedMap */ public function literalToPrettyString(int $literal, array $installedMap) : string { $package = $this->literalToPackage($literal); if (isset($installedMap[$package->id])) { $prefix = $literal > 0 ? 'keep' : 'remove'; } else { $prefix = $literal > 0 ? 'install' : 'don\'t install'; } return $prefix . ' ' . $package->getPrettyString(); } /** * Checks if the package matches the given constraint directly or through * provided or replaced packages * * @param string $name Name of the package to be matched */ public function match(BasePackage $candidate, string $name, ?ConstraintInterface $constraint = null) : bool { $candidateName = $candidate->getName(); $candidateVersion = $candidate->getVersion(); if ($candidateName === $name) { return $constraint === null || CompilingMatcher::match($constraint, Constraint::OP_EQ, $candidateVersion); } $provides = $candidate->getProvides(); $replaces = $candidate->getReplaces(); // aliases create multiple replaces/provides for one target so they can not use the shortcut below if (isset($replaces[0]) || isset($provides[0])) { foreach ($provides as $link) { if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) { return \true; } } foreach ($replaces as $link) { if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) { return \true; } } return \false; } if (isset($provides[$name]) && ($constraint === null || $constraint->matches($provides[$name]->getConstraint()))) { return \true; } if (isset($replaces[$name]) && ($constraint === null || $constraint->matches($replaces[$name]->getConstraint()))) { return \true; } return \false; } public function isUnacceptableFixedOrLockedPackage(BasePackage $package) : bool { return \in_array($package, $this->unacceptableFixedOrLockedPackages, \true); } /** * @return BasePackage[] */ public function getUnacceptableFixedOrLockedPackages() : array { return $this->unacceptableFixedOrLockedPackages; } public function __toString() : string { $str = "Pool:\n"; foreach ($this->packages as $package) { $str .= '- ' . \str_pad((string) $package->id, 6, ' ', \STR_PAD_LEFT) . ': ' . $package->getName() . "\n"; } return $str; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann * * MultiConflictRule([A, B, C]) acts as Rule([-A, -B]), Rule([-A, -C]), Rule([-B, -C]) */ class MultiConflictRule extends \Composer\DependencyResolver\Rule { /** @var non-empty-list */ protected $literals; /** * @param non-empty-list $literals */ public function __construct(array $literals, $reason, $reasonData) { parent::__construct($reason, $reasonData); if (\count($literals) < 3) { throw new \RuntimeException("multi conflict rule requires at least 3 literals"); } // sort all packages ascending by id \sort($literals); $this->literals = $literals; } /** * @return non-empty-list */ public function getLiterals() : array { return $this->literals; } /** * @inheritDoc */ public function getHash() { $data = \unpack('ihash', (string) \hash(\PHP_VERSION_ID > 80100 ? 'xxh3' : 'sha1', 'c:' . \implode(',', $this->literals), \true)); if (\false === $data) { throw new \RuntimeException('Failed unpacking: ' . \implode(', ', $this->literals)); } return $data['hash']; } /** * Checks if this rule is equal to another one * * Ignores whether either of the rules is disabled. * * @param Rule $rule The rule to check against * @return bool Whether the rules are equal */ public function equals(\Composer\DependencyResolver\Rule $rule) : bool { if ($rule instanceof \Composer\DependencyResolver\MultiConflictRule) { return $this->literals === $rule->getLiterals(); } return \false; } public function isAssertion() : bool { return \false; } /** * @return never * @throws \RuntimeException */ public function disable() : void { throw new \RuntimeException("Disabling multi conflict rules is not possible. Please contact composer at https://github.com/composer/composer to let us debug what lead to this situation."); } /** * Formats a rule as a string of the format (Literal1|Literal2|...) */ public function __toString() : string { // TODO multi conflict? $result = $this->isDisabled() ? 'disabled(multi(' : '(multi('; foreach ($this->literals as $i => $literal) { if ($i !== 0) { $result .= '|'; } $result .= $literal; } $result .= '))'; return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Repository\LockArrayRepository; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\MatchAllConstraint; /** * @author Nils Adermann */ class Request { /** * Identifies a partial update for listed packages only, all dependencies will remain at locked versions */ public const UPDATE_ONLY_LISTED = 0; /** * Identifies a partial update for listed packages and recursively all their dependencies, however dependencies * also directly required by the root composer.json and their dependencies will remain at the locked version. */ public const UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE = 1; /** * Identifies a partial update for listed packages and recursively all their dependencies, even dependencies * also directly required by the root composer.json will be updated. */ public const UPDATE_LISTED_WITH_TRANSITIVE_DEPS = 2; /** @var ?LockArrayRepository */ protected $lockedRepository; /** @var array */ protected $requires = []; /** @var array */ protected $fixedPackages = []; /** @var array */ protected $lockedPackages = []; /** @var array */ protected $fixedLockedPackages = []; /** @var array */ protected $updateAllowList = []; /** @var false|self::UPDATE_* */ protected $updateAllowTransitiveDependencies = \false; /** @var non-empty-list|null */ private $restrictedPackages = null; public function __construct(?LockArrayRepository $lockedRepository = null) { $this->lockedRepository = $lockedRepository; } public function requireName(string $packageName, ?ConstraintInterface $constraint = null) : void { $packageName = \strtolower($packageName); if ($constraint === null) { $constraint = new MatchAllConstraint(); } if (isset($this->requires[$packageName])) { throw new \LogicException('Overwriting requires seems like a bug (' . $packageName . ' ' . $this->requires[$packageName]->getPrettyString() . ' => ' . $constraint->getPrettyString() . ', check why it is happening, might be a root alias'); } $this->requires[$packageName] = $constraint; } /** * Mark a package as currently present and having to remain installed * * This is used for platform packages which cannot be modified by Composer. A rule enforcing their installation is * generated for dependency resolution. Partial updates with dependencies cannot in any way modify these packages. */ public function fixPackage(BasePackage $package) : void { $this->fixedPackages[\spl_object_hash($package)] = $package; } /** * Mark a package as locked to a specific version but removable * * This is used for lock file packages which need to be treated similar to fixed packages by the pool builder in * that by default they should really only have the currently present version loaded and no remote alternatives. * * However unlike fixed packages there will not be a special rule enforcing their installation for the solver, so * if nothing requires these packages they will be removed. Additionally in a partial update these packages can be * unlocked, meaning other versions can be installed if explicitly requested as part of the update. */ public function lockPackage(BasePackage $package) : void { $this->lockedPackages[\spl_object_hash($package)] = $package; } /** * Marks a locked package fixed. So it's treated irremovable like a platform package. * * This is necessary for the composer install step which verifies the lock file integrity and should not allow * removal of any packages. At the same time lock packages there cannot simply be marked fixed, as error reporting * would then report them as platform packages, so this still marks them as locked packages at the same time. */ public function fixLockedPackage(BasePackage $package) : void { $this->fixedPackages[\spl_object_hash($package)] = $package; $this->fixedLockedPackages[\spl_object_hash($package)] = $package; } public function unlockPackage(BasePackage $package) : void { unset($this->lockedPackages[\spl_object_hash($package)]); } /** * @param array $updateAllowList * @param false|self::UPDATE_* $updateAllowTransitiveDependencies */ public function setUpdateAllowList(array $updateAllowList, $updateAllowTransitiveDependencies) : void { $this->updateAllowList = $updateAllowList; $this->updateAllowTransitiveDependencies = $updateAllowTransitiveDependencies; } /** * @return array */ public function getUpdateAllowList() : array { return $this->updateAllowList; } public function getUpdateAllowTransitiveDependencies() : bool { return $this->updateAllowTransitiveDependencies !== self::UPDATE_ONLY_LISTED; } public function getUpdateAllowTransitiveRootDependencies() : bool { return $this->updateAllowTransitiveDependencies === self::UPDATE_LISTED_WITH_TRANSITIVE_DEPS; } /** * @return array */ public function getRequires() : array { return $this->requires; } /** * @return array */ public function getFixedPackages() : array { return $this->fixedPackages; } public function isFixedPackage(BasePackage $package) : bool { return isset($this->fixedPackages[\spl_object_hash($package)]); } /** * @return array */ public function getLockedPackages() : array { return $this->lockedPackages; } public function isLockedPackage(PackageInterface $package) : bool { return isset($this->lockedPackages[\spl_object_hash($package)]) || isset($this->fixedLockedPackages[\spl_object_hash($package)]); } /** * @return array */ public function getFixedOrLockedPackages() : array { return \array_merge($this->fixedPackages, $this->lockedPackages); } /** * @return ($packageIds is true ? array : array) * * @TODO look into removing the packageIds option, the only place true is used * is for the installed map in the solver problems. * Some locked packages may not be in the pool, * so they have a package->id of -1 */ public function getPresentMap(bool $packageIds = \false) : array { $presentMap = []; if ($this->lockedRepository !== null) { foreach ($this->lockedRepository->getPackages() as $package) { $presentMap[$packageIds ? $package->getId() : \spl_object_hash($package)] = $package; } } foreach ($this->fixedPackages as $package) { $presentMap[$packageIds ? $package->getId() : \spl_object_hash($package)] = $package; } return $presentMap; } /** * @return array */ public function getFixedPackagesMap() : array { $fixedPackagesMap = []; foreach ($this->fixedPackages as $package) { $fixedPackagesMap[$package->getId()] = $package; } return $fixedPackagesMap; } /** * @return ?LockArrayRepository */ public function getLockedRepository() : ?LockArrayRepository { return $this->lockedRepository; } /** * Restricts the pool builder from loading other packages than those listed here * * @param non-empty-list $names */ public function restrictPackages(array $names) : void { $this->restrictedPackages = $names; } /** * @return list */ public function getRestrictedPackages() : ?array { return $this->restrictedPackages; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\Version\VersionParser; use Composer\Semver\CompilingMatcher; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Intervals; /** * Optimizes a given pool * * @author Yanick Witschi */ class PoolOptimizer { /** * @var PolicyInterface */ private $policy; /** * @var array */ private $irremovablePackages = []; /** * @var array> */ private $requireConstraintsPerPackage = []; /** * @var array> */ private $conflictConstraintsPerPackage = []; /** * @var array */ private $packagesToRemove = []; /** * @var array */ private $aliasesPerPackage = []; /** * @var array> */ private $removedVersionsByPackage = []; public function __construct(\Composer\DependencyResolver\PolicyInterface $policy) { $this->policy = $policy; } public function optimize(\Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : \Composer\DependencyResolver\Pool { $this->prepare($request, $pool); $this->optimizeByIdenticalDependencies($request, $pool); $this->optimizeImpossiblePackagesAway($request, $pool); $optimizedPool = $this->applyRemovalsToPool($pool); // No need to run this recursively at the moment // because the current optimizations cannot provide // even more gains when ran again. Might change // in the future with additional optimizations. $this->irremovablePackages = []; $this->requireConstraintsPerPackage = []; $this->conflictConstraintsPerPackage = []; $this->packagesToRemove = []; $this->aliasesPerPackage = []; $this->removedVersionsByPackage = []; return $optimizedPool; } private function prepare(\Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : void { $irremovablePackageConstraintGroups = []; // Mark fixed or locked packages as irremovable foreach ($request->getFixedOrLockedPackages() as $package) { $irremovablePackageConstraintGroups[$package->getName()][] = new Constraint('==', $package->getVersion()); } // Extract requested package requirements foreach ($request->getRequires() as $require => $constraint) { $this->extractRequireConstraintsPerPackage($require, $constraint); } // First pass over all packages to extract information and mark package constraints irremovable foreach ($pool->getPackages() as $package) { // Extract package requirements foreach ($package->getRequires() as $link) { $this->extractRequireConstraintsPerPackage($link->getTarget(), $link->getConstraint()); } // Extract package conflicts foreach ($package->getConflicts() as $link) { $this->extractConflictConstraintsPerPackage($link->getTarget(), $link->getConstraint()); } // Keep track of alias packages for every package so if either the alias or aliased is kept // we keep the others as they are a unit of packages really if ($package instanceof AliasPackage) { $this->aliasesPerPackage[$package->getAliasOf()->id][] = $package; } } $irremovablePackageConstraints = []; foreach ($irremovablePackageConstraintGroups as $packageName => $constraints) { $irremovablePackageConstraints[$packageName] = 1 === \count($constraints) ? $constraints[0] : new MultiConstraint($constraints, \false); } unset($irremovablePackageConstraintGroups); // Mark the packages as irremovable based on the constraints foreach ($pool->getPackages() as $package) { if (!isset($irremovablePackageConstraints[$package->getName()])) { continue; } if (CompilingMatcher::match($irremovablePackageConstraints[$package->getName()], Constraint::OP_EQ, $package->getVersion())) { $this->markPackageIrremovable($package); } } } private function markPackageIrremovable(BasePackage $package) : void { $this->irremovablePackages[$package->id] = \true; if ($package instanceof AliasPackage) { // recursing here so aliasesPerPackage for the aliasOf can be checked // and all its aliases marked as irremovable as well $this->markPackageIrremovable($package->getAliasOf()); } if (isset($this->aliasesPerPackage[$package->id])) { foreach ($this->aliasesPerPackage[$package->id] as $aliasPackage) { $this->irremovablePackages[$aliasPackage->id] = \true; } } } /** * @return Pool Optimized pool */ private function applyRemovalsToPool(\Composer\DependencyResolver\Pool $pool) : \Composer\DependencyResolver\Pool { $packages = []; $removedVersions = []; foreach ($pool->getPackages() as $package) { if (!isset($this->packagesToRemove[$package->id])) { $packages[] = $package; } else { $removedVersions[$package->getName()][$package->getVersion()] = $package->getPrettyVersion(); } } $optimizedPool = new \Composer\DependencyResolver\Pool($packages, $pool->getUnacceptableFixedOrLockedPackages(), $removedVersions, $this->removedVersionsByPackage); return $optimizedPool; } private function optimizeByIdenticalDependencies(\Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : void { $identicalDefinitionsPerPackage = []; $packageIdenticalDefinitionLookup = []; foreach ($pool->getPackages() as $package) { // If that package was already marked irremovable, we can skip // the entire process for it if (isset($this->irremovablePackages[$package->id])) { continue; } $this->markPackageForRemoval($package->id); $dependencyHash = $this->calculateDependencyHash($package); foreach ($package->getNames(\false) as $packageName) { if (!isset($this->requireConstraintsPerPackage[$packageName])) { continue; } foreach ($this->requireConstraintsPerPackage[$packageName] as $requireConstraint) { $groupHashParts = []; if (CompilingMatcher::match($requireConstraint, Constraint::OP_EQ, $package->getVersion())) { $groupHashParts[] = 'require:' . (string) $requireConstraint; } if (\count($package->getReplaces()) > 0) { foreach ($package->getReplaces() as $link) { if (CompilingMatcher::match($link->getConstraint(), Constraint::OP_EQ, $package->getVersion())) { // Use the same hash part as the regular require hash because that's what the replacement does $groupHashParts[] = 'require:' . (string) $link->getConstraint(); } } } if (isset($this->conflictConstraintsPerPackage[$packageName])) { foreach ($this->conflictConstraintsPerPackage[$packageName] as $conflictConstraint) { if (CompilingMatcher::match($conflictConstraint, Constraint::OP_EQ, $package->getVersion())) { $groupHashParts[] = 'conflict:' . (string) $conflictConstraint; } } } if (0 === \count($groupHashParts)) { continue; } $groupHash = \implode('', $groupHashParts); $identicalDefinitionsPerPackage[$packageName][$groupHash][$dependencyHash][] = $package; $packageIdenticalDefinitionLookup[$package->id][$packageName] = ['groupHash' => $groupHash, 'dependencyHash' => $dependencyHash]; } } } foreach ($identicalDefinitionsPerPackage as $constraintGroups) { foreach ($constraintGroups as $constraintGroup) { foreach ($constraintGroup as $packages) { // Only one package in this constraint group has the same requirements, we're not allowed to remove that package if (1 === \count($packages)) { $this->keepPackage($packages[0], $identicalDefinitionsPerPackage, $packageIdenticalDefinitionLookup); continue; } // Otherwise we find out which one is the preferred package in this constraint group which is // then not allowed to be removed either $literals = []; foreach ($packages as $package) { $literals[] = $package->id; } foreach ($this->policy->selectPreferredPackages($pool, $literals) as $preferredLiteral) { $this->keepPackage($pool->literalToPackage($preferredLiteral), $identicalDefinitionsPerPackage, $packageIdenticalDefinitionLookup); } } } } } private function calculateDependencyHash(BasePackage $package) : string { $hash = ''; $hashRelevantLinks = ['requires' => $package->getRequires(), 'conflicts' => $package->getConflicts(), 'replaces' => $package->getReplaces(), 'provides' => $package->getProvides()]; foreach ($hashRelevantLinks as $key => $links) { if (0 === \count($links)) { continue; } // start new hash section $hash .= $key . ':'; $subhash = []; foreach ($links as $link) { // To get the best dependency hash matches we should use Intervals::compactConstraint() here. // However, the majority of projects are going to specify their constraints already pretty // much in the best variant possible. In other words, we'd be wasting time here and it would actually hurt // performance more than the additional few packages that could be filtered out would benefit the process. $subhash[$link->getTarget()] = (string) $link->getConstraint(); } // Sort for best result \ksort($subhash); foreach ($subhash as $target => $constraint) { $hash .= $target . '@' . $constraint; } } return $hash; } private function markPackageForRemoval(int $id) : void { // We are not allowed to remove packages if they have been marked as irremovable if (isset($this->irremovablePackages[$id])) { throw new \LogicException('Attempted removing a package which was previously marked irremovable'); } $this->packagesToRemove[$id] = \true; } /** * @param array>>> $identicalDefinitionsPerPackage * @param array> $packageIdenticalDefinitionLookup */ private function keepPackage(BasePackage $package, array $identicalDefinitionsPerPackage, array $packageIdenticalDefinitionLookup) : void { // Already marked to keep if (!isset($this->packagesToRemove[$package->id])) { return; } unset($this->packagesToRemove[$package->id]); if ($package instanceof AliasPackage) { // recursing here so aliasesPerPackage for the aliasOf can be checked // and all its aliases marked to be kept as well $this->keepPackage($package->getAliasOf(), $identicalDefinitionsPerPackage, $packageIdenticalDefinitionLookup); } // record all the versions of the package group so we can list them later in Problem output foreach ($package->getNames(\false) as $name) { if (isset($packageIdenticalDefinitionLookup[$package->id][$name])) { $packageGroupPointers = $packageIdenticalDefinitionLookup[$package->id][$name]; $packageGroup = $identicalDefinitionsPerPackage[$name][$packageGroupPointers['groupHash']][$packageGroupPointers['dependencyHash']]; foreach ($packageGroup as $pkg) { if ($pkg instanceof AliasPackage && $pkg->getPrettyVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { $pkg = $pkg->getAliasOf(); } $this->removedVersionsByPackage[\spl_object_hash($package)][$pkg->getVersion()] = $pkg->getPrettyVersion(); } } } if (isset($this->aliasesPerPackage[$package->id])) { foreach ($this->aliasesPerPackage[$package->id] as $aliasPackage) { unset($this->packagesToRemove[$aliasPackage->id]); // record all the versions of the package group so we can list them later in Problem output foreach ($aliasPackage->getNames(\false) as $name) { if (isset($packageIdenticalDefinitionLookup[$aliasPackage->id][$name])) { $packageGroupPointers = $packageIdenticalDefinitionLookup[$aliasPackage->id][$name]; $packageGroup = $identicalDefinitionsPerPackage[$name][$packageGroupPointers['groupHash']][$packageGroupPointers['dependencyHash']]; foreach ($packageGroup as $pkg) { if ($pkg instanceof AliasPackage && $pkg->getPrettyVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { $pkg = $pkg->getAliasOf(); } $this->removedVersionsByPackage[\spl_object_hash($aliasPackage)][$pkg->getVersion()] = $pkg->getPrettyVersion(); } } } } } } /** * Use the list of locked packages to constrain the loaded packages * This will reduce packages with significant numbers of historical versions to a smaller number * and reduce the resulting rule set that is generated */ private function optimizeImpossiblePackagesAway(\Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : void { if (\count($request->getLockedPackages()) === 0) { return; } $packageIndex = []; foreach ($pool->getPackages() as $package) { $id = $package->id; // Do not remove irremovable packages if (isset($this->irremovablePackages[$id])) { continue; } // Do not remove a package aliased by another package, nor aliases if (isset($this->aliasesPerPackage[$id]) || $package instanceof AliasPackage) { continue; } // Do not remove locked packages if ($request->isFixedPackage($package) || $request->isLockedPackage($package)) { continue; } $packageIndex[$package->getName()][$package->id] = $package; } foreach ($request->getLockedPackages() as $package) { // If this locked package is no longer required by root or anything in the pool, it may get uninstalled so do not apply its requirements // In a case where a requirement WERE to appear in the pool by a package that would not be used, it would've been unlocked and so not filtered still $isUnusedPackage = \true; foreach ($package->getNames(\false) as $packageName) { if (isset($this->requireConstraintsPerPackage[$packageName])) { $isUnusedPackage = \false; break; } } if ($isUnusedPackage) { continue; } foreach ($package->getRequires() as $link) { $require = $link->getTarget(); if (!isset($packageIndex[$require])) { continue; } $linkConstraint = $link->getConstraint(); foreach ($packageIndex[$require] as $id => $requiredPkg) { if (\false === CompilingMatcher::match($linkConstraint, Constraint::OP_EQ, $requiredPkg->getVersion())) { $this->markPackageForRemoval($id); unset($packageIndex[$require][$id]); } } } } } /** * Disjunctive require constraints need to be considered in their own group. E.g. "^2.14 || ^3.3" needs to generate * two require constraint groups in order for us to keep the best matching package for "^2.14" AND "^3.3" as otherwise, we'd * only keep either one which can cause trouble (e.g. when using --prefer-lowest). * * @return void */ private function extractRequireConstraintsPerPackage(string $package, ConstraintInterface $constraint) { foreach ($this->expandDisjunctiveMultiConstraints($constraint) as $expanded) { $this->requireConstraintsPerPackage[$package][(string) $expanded] = $expanded; } } /** * Disjunctive conflict constraints need to be considered in their own group. E.g. "^2.14 || ^3.3" needs to generate * two conflict constraint groups in order for us to keep the best matching package for "^2.14" AND "^3.3" as otherwise, we'd * only keep either one which can cause trouble (e.g. when using --prefer-lowest). * * @return void */ private function extractConflictConstraintsPerPackage(string $package, ConstraintInterface $constraint) { foreach ($this->expandDisjunctiveMultiConstraints($constraint) as $expanded) { $this->conflictConstraintsPerPackage[$package][(string) $expanded] = $expanded; } } /** * @return ConstraintInterface[] */ private function expandDisjunctiveMultiConstraints(ConstraintInterface $constraint) { $constraint = Intervals::compactConstraint($constraint); if ($constraint instanceof MultiConstraint && $constraint->isDisjunctive()) { // No need to call ourselves recursively here because Intervals::compactConstraint() ensures that there // are no nested disjunctive MultiConstraint instances possible return $constraint->getConstraints(); } // Regular constraints and conjunctive MultiConstraints return [$constraint]; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; /** * @author Nils Adermann * @phpstan-import-type ReasonData from Rule */ class RuleSetGenerator { /** @var PolicyInterface */ protected $policy; /** @var Pool */ protected $pool; /** @var RuleSet */ protected $rules; /** @var array */ protected $addedMap = []; /** @var array */ protected $addedPackagesByNames = []; public function __construct(\Composer\DependencyResolver\PolicyInterface $policy, \Composer\DependencyResolver\Pool $pool) { $this->policy = $policy; $this->pool = $pool; $this->rules = new \Composer\DependencyResolver\RuleSet(); } /** * Creates a new rule for the requirements of a package * * This rule is of the form (-A|B|C), where B and C are the providers of * one requirement of the package A. * * @param BasePackage $package The package with a requirement * @param BasePackage[] $providers The providers of the requirement * @param Rule::RULE_* $reason A RULE_* constant describing the reason for generating this rule * @param mixed $reasonData Any data, e.g. the requirement name, that goes with the reason * @return Rule|null The generated rule or null if tautological * * @phpstan-param ReasonData $reasonData */ protected function createRequireRule(BasePackage $package, array $providers, $reason, $reasonData) : ?\Composer\DependencyResolver\Rule { $literals = [-$package->id]; foreach ($providers as $provider) { // self fulfilling rule? if ($provider === $package) { return null; } $literals[] = $provider->id; } return new \Composer\DependencyResolver\GenericRule($literals, $reason, $reasonData); } /** * Creates a rule to install at least one of a set of packages * * The rule is (A|B|C) with A, B and C different packages. If the given * set of packages is empty an impossible rule is generated. * * @param non-empty-array $packages The set of packages to choose from * @param Rule::RULE_* $reason A RULE_* constant describing the reason for * generating this rule * @param mixed $reasonData Additional data like the root require or fix request info * @return Rule The generated rule * * @phpstan-param ReasonData $reasonData */ protected function createInstallOneOfRule(array $packages, $reason, $reasonData) : \Composer\DependencyResolver\Rule { $literals = []; foreach ($packages as $package) { $literals[] = $package->id; } return new \Composer\DependencyResolver\GenericRule($literals, $reason, $reasonData); } /** * Creates a rule for two conflicting packages * * The rule for conflicting packages A and B is (-A|-B). A is called the issuer * and B the provider. * * @param BasePackage $issuer The package declaring the conflict * @param BasePackage $provider The package causing the conflict * @param Rule::RULE_* $reason A RULE_* constant describing the reason for generating this rule * @param mixed $reasonData Any data, e.g. the package name, that goes with the reason * @return ?Rule The generated rule * * @phpstan-param ReasonData $reasonData */ protected function createRule2Literals(BasePackage $issuer, BasePackage $provider, $reason, $reasonData) : ?\Composer\DependencyResolver\Rule { // ignore self conflict if ($issuer === $provider) { return null; } return new \Composer\DependencyResolver\Rule2Literals(-$issuer->id, -$provider->id, $reason, $reasonData); } /** * @param non-empty-array $packages * @param Rule::RULE_* $reason A RULE_* constant * @param mixed $reasonData * * @phpstan-param ReasonData $reasonData */ protected function createMultiConflictRule(array $packages, $reason, $reasonData) : \Composer\DependencyResolver\Rule { $literals = []; foreach ($packages as $package) { $literals[] = -$package->id; } if (\count($literals) === 2) { return new \Composer\DependencyResolver\Rule2Literals($literals[0], $literals[1], $reason, $reasonData); } return new \Composer\DependencyResolver\MultiConflictRule($literals, $reason, $reasonData); } /** * Adds a rule unless it duplicates an existing one of any type * * To be able to directly pass in the result of one of the rule creation * methods null is allowed which will not insert a rule. * * @param RuleSet::TYPE_* $type A TYPE_* constant defining the rule type * @param Rule $newRule The rule about to be added */ private function addRule($type, ?\Composer\DependencyResolver\Rule $newRule = null) : void { if (null === $newRule) { return; } $this->rules->add($newRule, $type); } protected function addRulesForPackage(BasePackage $package, PlatformRequirementFilterInterface $platformRequirementFilter) : void { /** @var \SplQueue */ $workQueue = new \SplQueue(); $workQueue->enqueue($package); while (!$workQueue->isEmpty()) { $package = $workQueue->dequeue(); if (isset($this->addedMap[$package->id])) { continue; } $this->addedMap[$package->id] = $package; if (!$package instanceof AliasPackage) { foreach ($package->getNames(\false) as $name) { $this->addedPackagesByNames[$name][] = $package; } } else { $workQueue->enqueue($package->getAliasOf()); $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, [$package->getAliasOf()], \Composer\DependencyResolver\Rule::RULE_PACKAGE_ALIAS, $package)); // aliases must be installed with their main package, so create a rule the other way around as well $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_PACKAGE, $this->createRequireRule($package->getAliasOf(), [$package], \Composer\DependencyResolver\Rule::RULE_PACKAGE_INVERSE_ALIAS, $package->getAliasOf())); // if alias package has no self.version requires, its requirements do not // need to be added as the aliased package processing will take care of it if (!$package->hasSelfVersionRequires()) { continue; } } foreach ($package->getRequires() as $link) { $constraint = $link->getConstraint(); if ($platformRequirementFilter->isIgnored($link->getTarget())) { continue; } elseif ($platformRequirementFilter instanceof IgnoreListPlatformRequirementFilter) { $constraint = $platformRequirementFilter->filterConstraint($link->getTarget(), $constraint); } $possibleRequires = $this->pool->whatProvides($link->getTarget(), $constraint); $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, $possibleRequires, \Composer\DependencyResolver\Rule::RULE_PACKAGE_REQUIRES, $link)); foreach ($possibleRequires as $require) { $workQueue->enqueue($require); } } } } protected function addConflictRules(PlatformRequirementFilterInterface $platformRequirementFilter) : void { /** @var BasePackage $package */ foreach ($this->addedMap as $package) { foreach ($package->getConflicts() as $link) { // even if conflict ends up being with an alias, there would be at least one actual package by this name if (!isset($this->addedPackagesByNames[$link->getTarget()])) { continue; } $constraint = $link->getConstraint(); if ($platformRequirementFilter->isIgnored($link->getTarget())) { continue; } elseif ($platformRequirementFilter instanceof IgnoreListPlatformRequirementFilter) { $constraint = $platformRequirementFilter->filterConstraint($link->getTarget(), $constraint, \false); } $conflicts = $this->pool->whatProvides($link->getTarget(), $constraint); foreach ($conflicts as $conflict) { // define the conflict rule for regular packages, for alias packages it's only needed if the name // matches the conflict exactly, otherwise the name match is by provide/replace which means the // package which this is an alias of will conflict anyway, so no need to create additional rules if (!$conflict instanceof AliasPackage || $conflict->getName() === $link->getTarget()) { $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $conflict, \Composer\DependencyResolver\Rule::RULE_PACKAGE_CONFLICT, $link)); } } } } foreach ($this->addedPackagesByNames as $name => $packages) { if (\count($packages) > 1) { $reason = \Composer\DependencyResolver\Rule::RULE_PACKAGE_SAME_NAME; $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_PACKAGE, $this->createMultiConflictRule($packages, $reason, $name)); } } } protected function addRulesForRequest(\Composer\DependencyResolver\Request $request, PlatformRequirementFilterInterface $platformRequirementFilter) : void { foreach ($request->getFixedPackages() as $package) { if ($package->id === -1) { // fixed package was not added to the pool as it did not pass the stability requirements, this is fine if ($this->pool->isUnacceptableFixedOrLockedPackage($package)) { continue; } // otherwise, looks like a bug throw new \LogicException("Fixed package " . $package->getPrettyString() . " was not added to solver pool."); } $this->addRulesForPackage($package, $platformRequirementFilter); $rule = $this->createInstallOneOfRule([$package], \Composer\DependencyResolver\Rule::RULE_FIXED, ['package' => $package]); $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_REQUEST, $rule); } foreach ($request->getRequires() as $packageName => $constraint) { if ($platformRequirementFilter->isIgnored($packageName)) { continue; } elseif ($platformRequirementFilter instanceof IgnoreListPlatformRequirementFilter) { $constraint = $platformRequirementFilter->filterConstraint($packageName, $constraint); } $packages = $this->pool->whatProvides($packageName, $constraint); if (\count($packages) > 0) { foreach ($packages as $package) { $this->addRulesForPackage($package, $platformRequirementFilter); } $rule = $this->createInstallOneOfRule($packages, \Composer\DependencyResolver\Rule::RULE_ROOT_REQUIRE, ['packageName' => $packageName, 'constraint' => $constraint]); $this->addRule(\Composer\DependencyResolver\RuleSet::TYPE_REQUEST, $rule); } } } protected function addRulesForRootAliases(PlatformRequirementFilterInterface $platformRequirementFilter) : void { foreach ($this->pool->getPackages() as $package) { // ensure that rules for root alias packages and aliases of packages which were loaded are also loaded // even if the alias itself isn't required, otherwise a package could be installed without its alias which // leads to unexpected behavior if (!isset($this->addedMap[$package->id]) && $package instanceof AliasPackage && ($package->isRootPackageAlias() || isset($this->addedMap[$package->getAliasOf()->id]))) { $this->addRulesForPackage($package, $platformRequirementFilter); } } } public function getRulesFor(\Composer\DependencyResolver\Request $request, ?PlatformRequirementFilterInterface $platformRequirementFilter = null) : \Composer\DependencyResolver\RuleSet { $platformRequirementFilter = $platformRequirementFilter ?? PlatformRequirementFilterFactory::ignoreNothing(); $this->addRulesForRequest($request, $platformRequirementFilter); $this->addRulesForRootAliases($platformRequirementFilter); $this->addConflictRules($platformRequirementFilter); // Remove references to packages $this->addedMap = $this->addedPackagesByNames = []; $rules = $this->rules; $this->rules = new \Composer\DependencyResolver\RuleSet(); return $rules; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * Stores decisions on installing, removing or keeping packages * * @author Nils Adermann * @implements \Iterator */ class Decisions implements \Iterator, \Countable { public const DECISION_LITERAL = 0; public const DECISION_REASON = 1; /** @var Pool */ protected $pool; /** @var array */ protected $decisionMap; /** * @var array */ protected $decisionQueue = []; public function __construct(\Composer\DependencyResolver\Pool $pool) { $this->pool = $pool; $this->decisionMap = []; } public function decide(int $literal, int $level, \Composer\DependencyResolver\Rule $why) : void { $this->addDecision($literal, $level); $this->decisionQueue[] = [self::DECISION_LITERAL => $literal, self::DECISION_REASON => $why]; } public function satisfy(int $literal) : bool { $packageId = \abs($literal); return $literal > 0 && isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0 || $literal < 0 && isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] < 0; } public function conflict(int $literal) : bool { $packageId = \abs($literal); return isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0 && $literal < 0 || isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] < 0 && $literal > 0; } public function decided(int $literalOrPackageId) : bool { return ($this->decisionMap[\abs($literalOrPackageId)] ?? 0) !== 0; } public function undecided(int $literalOrPackageId) : bool { return ($this->decisionMap[\abs($literalOrPackageId)] ?? 0) === 0; } public function decidedInstall(int $literalOrPackageId) : bool { $packageId = \abs($literalOrPackageId); return isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0; } public function decisionLevel(int $literalOrPackageId) : int { $packageId = \abs($literalOrPackageId); if (isset($this->decisionMap[$packageId])) { return \abs($this->decisionMap[$packageId]); } return 0; } public function decisionRule(int $literalOrPackageId) : \Composer\DependencyResolver\Rule { $packageId = \abs($literalOrPackageId); foreach ($this->decisionQueue as $decision) { if ($packageId === \abs($decision[self::DECISION_LITERAL])) { return $decision[self::DECISION_REASON]; } } throw new \LogicException('Did not find a decision rule using ' . $literalOrPackageId); } /** * @return array{0: int, 1: Rule} a literal and decision reason */ public function atOffset(int $queueOffset) : array { return $this->decisionQueue[$queueOffset]; } public function validOffset(int $queueOffset) : bool { return $queueOffset >= 0 && $queueOffset < \count($this->decisionQueue); } public function lastReason() : \Composer\DependencyResolver\Rule { return $this->decisionQueue[\count($this->decisionQueue) - 1][self::DECISION_REASON]; } public function lastLiteral() : int { return $this->decisionQueue[\count($this->decisionQueue) - 1][self::DECISION_LITERAL]; } public function reset() : void { while ($decision = \array_pop($this->decisionQueue)) { $this->decisionMap[\abs($decision[self::DECISION_LITERAL])] = 0; } } /** * @param int<-1, max> $offset */ public function resetToOffset(int $offset) : void { while (\count($this->decisionQueue) > $offset + 1) { $decision = \array_pop($this->decisionQueue); $this->decisionMap[\abs($decision[self::DECISION_LITERAL])] = 0; } } public function revertLast() : void { $this->decisionMap[\abs($this->lastLiteral())] = 0; \array_pop($this->decisionQueue); } public function count() : int { return \count($this->decisionQueue); } public function rewind() : void { \end($this->decisionQueue); } /** * @return array{0: int, 1: Rule}|false */ #[\ReturnTypeWillChange] public function current() { return \current($this->decisionQueue); } public function key() : ?int { return \key($this->decisionQueue); } public function next() : void { \prev($this->decisionQueue); } public function valid() : bool { return \false !== \current($this->decisionQueue); } public function isEmpty() : bool { return \count($this->decisionQueue) === 0; } protected function addDecision(int $literal, int $level) : void { $packageId = \abs($literal); $previousDecision = $this->decisionMap[$packageId] ?? 0; if ($previousDecision !== 0) { $literalString = $this->pool->literalToPrettyString($literal, []); $package = $this->pool->literalToPackage($literal); throw new \Composer\DependencyResolver\SolverBugException("Trying to decide {$literalString} on level {$level}, even though {$package} was previously decided as " . $previousDecision . "."); } if ($literal > 0) { $this->decisionMap[$packageId] = $level; } else { $this->decisionMap[$packageId] = -$level; } } public function toString(?\Composer\DependencyResolver\Pool $pool = null) : string { $decisionMap = $this->decisionMap; \ksort($decisionMap); $str = '['; foreach ($decisionMap as $packageId => $level) { $str .= ($pool !== null ? $pool->literalToPackage($packageId) : $packageId) . ':' . $level . ','; } $str .= ']'; return $str; } public function __toString() : string { return $this->toString(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\EventDispatcher\EventDispatcher; use Composer\IO\IOInterface; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; use Composer\Package\PackageInterface; use Composer\Package\Version\StabilityFilter; use Composer\Pcre\Preg; use Composer\Plugin\PluginEvents; use Composer\Plugin\PrePoolCreateEvent; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RootPackageRepository; use Composer\Semver\CompilingMatcher; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Intervals; /** * @author Nils Adermann */ class PoolBuilder { /** * @var int[] * @phpstan-var array, BasePackage::STABILITY_*> */ private $acceptableStabilities; /** * @var int[] * @phpstan-var array */ private $stabilityFlags; /** * @var array[] * @phpstan-var array> */ private $rootAliases; /** * @var string[] * @phpstan-var array */ private $rootReferences; /** * @var array */ private $temporaryConstraints; /** * @var ?EventDispatcher */ private $eventDispatcher; /** * @var PoolOptimizer|null */ private $poolOptimizer; /** * @var IOInterface */ private $io; /** * @var array[] * @phpstan-var array */ private $aliasMap = []; /** * @var ConstraintInterface[] * @phpstan-var array */ private $packagesToLoad = []; /** * @var ConstraintInterface[] * @phpstan-var array */ private $loadedPackages = []; /** * @var array[] * @phpstan-var array>> */ private $loadedPerRepo = []; /** * @var array */ private $packages = []; /** * @var BasePackage[] */ private $unacceptableFixedOrLockedPackages = []; /** @var array */ private $updateAllowList = []; /** @var array> */ private $skippedLoad = []; /** @var list */ private $ignoredTypes = []; /** @var list|null */ private $allowedTypes = null; /** * If provided, only these package names are loaded * * This is a special-use functionality of the Request class to optimize the pool creation process * when only a minimal subset of packages is needed and we do not need their dependencies. * * @var array|null */ private $restrictedPackagesList = null; /** * Keeps a list of dependencies which are locked but were auto-unlocked as they are path repositories * * This half-unlocked state means the package itself will update but the UPDATE_LISTED_WITH_TRANSITIVE_DEPS* * flags will not apply until the package really gets unlocked in some other way than being a path repo * * @var array */ private $pathRepoUnlocked = []; /** * Keeps a list of dependencies which are root requirements, and as such * have already their maximum required range loaded and can not be * extended by markPackageNameForLoading * * Packages get cleared from this list if they get unlocked as in that case * we need to actually load them * * @var array */ private $maxExtendedReqs = []; /** * @var array * @phpstan-var array */ private $updateAllowWarned = []; /** @var int */ private $indexCounter = 0; /** * @param int[] $acceptableStabilities array of stability => BasePackage::STABILITY_* value * @phpstan-param array, BasePackage::STABILITY_*> $acceptableStabilities * @param int[] $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array $stabilityFlags * @param array[] $rootAliases * @phpstan-param array> $rootAliases * @param string[] $rootReferences an array of package name => source reference * @phpstan-param array $rootReferences * @param array $temporaryConstraints Runtime temporary constraints that will be used to filter packages */ public function __construct(array $acceptableStabilities, array $stabilityFlags, array $rootAliases, array $rootReferences, IOInterface $io, ?EventDispatcher $eventDispatcher = null, ?\Composer\DependencyResolver\PoolOptimizer $poolOptimizer = null, array $temporaryConstraints = []) { $this->acceptableStabilities = $acceptableStabilities; $this->stabilityFlags = $stabilityFlags; $this->rootAliases = $rootAliases; $this->rootReferences = $rootReferences; $this->eventDispatcher = $eventDispatcher; $this->poolOptimizer = $poolOptimizer; $this->io = $io; $this->temporaryConstraints = $temporaryConstraints; } /** * Packages of those types are ignored * * @param list $types */ public function setIgnoredTypes(array $types) : void { $this->ignoredTypes = $types; } /** * Only packages of those types are allowed if set to non-null * * @param list|null $types */ public function setAllowedTypes(?array $types) : void { $this->allowedTypes = $types; } /** * @param RepositoryInterface[] $repositories */ public function buildPool(array $repositories, \Composer\DependencyResolver\Request $request) : \Composer\DependencyResolver\Pool { $this->restrictedPackagesList = $request->getRestrictedPackages() !== null ? \array_flip($request->getRestrictedPackages()) : null; if (\count($request->getUpdateAllowList()) > 0) { $this->updateAllowList = $request->getUpdateAllowList(); $this->warnAboutNonMatchingUpdateAllowList($request); if (null === $request->getLockedRepository()) { throw new \LogicException('No lock repo present and yet a partial update was requested.'); } foreach ($request->getLockedRepository()->getPackages() as $lockedPackage) { if (!$this->isUpdateAllowed($lockedPackage)) { // remember which packages we skipped loading remote content for in this partial update $this->skippedLoad[$lockedPackage->getName()][] = $lockedPackage; foreach ($lockedPackage->getReplaces() as $link) { $this->skippedLoad[$link->getTarget()][] = $lockedPackage; } // Path repo packages are never loaded from lock, to force them to always remain in sync // unless symlinking is disabled in which case we probably should rather treat them like // regular packages. We mark them specially so they can be reloaded fully including update propagation // if they do get unlocked, but by default they are unlocked without update propagation. if ($lockedPackage->getDistType() === 'path') { $transportOptions = $lockedPackage->getTransportOptions(); if (!isset($transportOptions['symlink']) || $transportOptions['symlink'] !== \false) { $this->pathRepoUnlocked[$lockedPackage->getName()] = \true; continue; } } $request->lockPackage($lockedPackage); } } } foreach ($request->getFixedOrLockedPackages() as $package) { // using MatchAllConstraint here because fixed packages do not need to retrigger // loading any packages $this->loadedPackages[$package->getName()] = new MatchAllConstraint(); // replace means conflict, so if a fixed package replaces a name, no need to load that one, packages would conflict anyways foreach ($package->getReplaces() as $link) { $this->loadedPackages[$link->getTarget()] = new MatchAllConstraint(); } // TODO in how far can we do the above for conflicts? It's more tricky cause conflicts can be limited to // specific versions while replace is a conflict with all versions of the name if ($package->getRepository() instanceof RootPackageRepository || $package->getRepository() instanceof PlatformRepository || StabilityFilter::isPackageAcceptable($this->acceptableStabilities, $this->stabilityFlags, $package->getNames(), $package->getStability())) { $this->loadPackage($request, $repositories, $package, \false); } else { $this->unacceptableFixedOrLockedPackages[] = $package; } } foreach ($request->getRequires() as $packageName => $constraint) { // fixed and locked packages have already been added, so if a root require needs one of them, no need to do anything if (isset($this->loadedPackages[$packageName])) { continue; } $this->packagesToLoad[$packageName] = $constraint; $this->maxExtendedReqs[$packageName] = \true; } // clean up packagesToLoad for anything we manually marked loaded above foreach ($this->packagesToLoad as $name => $constraint) { if (isset($this->loadedPackages[$name])) { unset($this->packagesToLoad[$name]); } } while (\count($this->packagesToLoad) > 0) { $this->loadPackagesMarkedForLoading($request, $repositories); } if (\count($this->temporaryConstraints) > 0) { foreach ($this->packages as $i => $package) { // we check all alias related packages at once, so no need to check individual aliases if (!isset($this->temporaryConstraints[$package->getName()]) || $package instanceof AliasPackage) { continue; } $constraint = $this->temporaryConstraints[$package->getName()]; $packageAndAliases = [$i => $package]; if (isset($this->aliasMap[\spl_object_hash($package)])) { $packageAndAliases += $this->aliasMap[\spl_object_hash($package)]; } $found = \false; foreach ($packageAndAliases as $packageOrAlias) { if (CompilingMatcher::match($constraint, Constraint::OP_EQ, $packageOrAlias->getVersion())) { $found = \true; } } if (!$found) { foreach ($packageAndAliases as $index => $packageOrAlias) { unset($this->packages[$index]); } } } } if ($this->eventDispatcher !== null) { $prePoolCreateEvent = new PrePoolCreateEvent(PluginEvents::PRE_POOL_CREATE, $repositories, $request, $this->acceptableStabilities, $this->stabilityFlags, $this->rootAliases, $this->rootReferences, $this->packages, $this->unacceptableFixedOrLockedPackages); $this->eventDispatcher->dispatch($prePoolCreateEvent->getName(), $prePoolCreateEvent); $this->packages = $prePoolCreateEvent->getPackages(); $this->unacceptableFixedOrLockedPackages = $prePoolCreateEvent->getUnacceptableFixedPackages(); } $pool = new \Composer\DependencyResolver\Pool($this->packages, $this->unacceptableFixedOrLockedPackages); $this->aliasMap = []; $this->packagesToLoad = []; $this->loadedPackages = []; $this->loadedPerRepo = []; $this->packages = []; $this->unacceptableFixedOrLockedPackages = []; $this->maxExtendedReqs = []; $this->skippedLoad = []; $this->indexCounter = 0; $this->io->debug('Built pool.'); $pool = $this->runOptimizer($request, $pool); Intervals::clear(); return $pool; } private function markPackageNameForLoading(\Composer\DependencyResolver\Request $request, string $name, ConstraintInterface $constraint) : void { // Skip platform requires at this stage if (PlatformRepository::isPlatformPackage($name)) { return; } // Root require (which was not unlocked) already loaded the maximum range so no // need to check anything here if (isset($this->maxExtendedReqs[$name])) { return; } // Root requires can not be overruled by dependencies so there is no point in // extending the loaded constraint for those. // This is triggered when loading a root require which was locked but got unlocked, then // we make sure that we load at most the intervals covered by the root constraint. $rootRequires = $request->getRequires(); if (isset($rootRequires[$name]) && !Intervals::isSubsetOf($constraint, $rootRequires[$name])) { $constraint = $rootRequires[$name]; } // Not yet loaded or already marked for a reload, set the constraint to be loaded if (!isset($this->loadedPackages[$name])) { // Maybe it was already marked before but not loaded yet. In that case // we have to extend the constraint (we don't check if they are identical because // MultiConstraint::create() will optimize anyway) if (isset($this->packagesToLoad[$name])) { // Already marked for loading and this does not expand the constraint to be loaded, nothing to do if (Intervals::isSubsetOf($constraint, $this->packagesToLoad[$name])) { return; } // extend the constraint to be loaded $constraint = Intervals::compactConstraint(MultiConstraint::create([$this->packagesToLoad[$name], $constraint], \false)); } $this->packagesToLoad[$name] = $constraint; return; } // No need to load this package with this constraint because it is // a subset of the constraint with which we have already loaded packages if (Intervals::isSubsetOf($constraint, $this->loadedPackages[$name])) { return; } // We have already loaded that package but not in the constraint that's // required. We extend the constraint and mark that package as not being loaded // yet so we get the required package versions $this->packagesToLoad[$name] = Intervals::compactConstraint(MultiConstraint::create([$this->loadedPackages[$name], $constraint], \false)); unset($this->loadedPackages[$name]); } /** * @param RepositoryInterface[] $repositories */ private function loadPackagesMarkedForLoading(\Composer\DependencyResolver\Request $request, array $repositories) : void { foreach ($this->packagesToLoad as $name => $constraint) { if ($this->restrictedPackagesList !== null && !isset($this->restrictedPackagesList[$name])) { unset($this->packagesToLoad[$name]); continue; } $this->loadedPackages[$name] = $constraint; } $packageBatch = $this->packagesToLoad; $this->packagesToLoad = []; foreach ($repositories as $repoIndex => $repository) { if (0 === \count($packageBatch)) { break; } // these repos have their packages fixed or locked if they need to be loaded so we // never need to load anything else from them if ($repository instanceof PlatformRepository || $repository === $request->getLockedRepository()) { continue; } $result = $repository->loadPackages($packageBatch, $this->acceptableStabilities, $this->stabilityFlags, $this->loadedPerRepo[$repoIndex] ?? []); foreach ($result['namesFound'] as $name) { // avoid loading the same package again from other repositories once it has been found unset($packageBatch[$name]); } foreach ($result['packages'] as $package) { $this->loadedPerRepo[$repoIndex][$package->getName()][$package->getVersion()] = $package; if (\in_array($package->getType(), $this->ignoredTypes, \true) || $this->allowedTypes !== null && !\in_array($package->getType(), $this->allowedTypes, \true)) { continue; } $this->loadPackage($request, $repositories, $package, !isset($this->pathRepoUnlocked[$package->getName()])); } } } /** * @param RepositoryInterface[] $repositories */ private function loadPackage(\Composer\DependencyResolver\Request $request, array $repositories, BasePackage $package, bool $propagateUpdate) : void { $index = $this->indexCounter++; $this->packages[$index] = $package; if ($package instanceof AliasPackage) { $this->aliasMap[\spl_object_hash($package->getAliasOf())][$index] = $package; } $name = $package->getName(); // we're simply setting the root references on all versions for a name here and rely on the solver to pick the // right version. It'd be more work to figure out which versions and which aliases of those versions this may // apply to if (isset($this->rootReferences[$name])) { // do not modify the references on already locked or fixed packages if (!$request->isLockedPackage($package) && !$request->isFixedPackage($package)) { $package->setSourceDistReferences($this->rootReferences[$name]); } } // if propagateUpdate is false we are loading a fixed or locked package, root aliases do not apply as they are // manually loaded as separate packages in this case // // packages in pathRepoUnlocked however need to also load root aliases, they have propagateUpdate set to // false because their deps should not be unlocked, but that is irrelevant for root aliases if (($propagateUpdate || isset($this->pathRepoUnlocked[$package->getName()])) && isset($this->rootAliases[$name][$package->getVersion()])) { $alias = $this->rootAliases[$name][$package->getVersion()]; if ($package instanceof AliasPackage) { $basePackage = $package->getAliasOf(); } else { $basePackage = $package; } if ($basePackage instanceof CompletePackage) { $aliasPackage = new CompleteAliasPackage($basePackage, $alias['alias_normalized'], $alias['alias']); } else { $aliasPackage = new AliasPackage($basePackage, $alias['alias_normalized'], $alias['alias']); } $aliasPackage->setRootPackageAlias(\true); $newIndex = $this->indexCounter++; $this->packages[$newIndex] = $aliasPackage; $this->aliasMap[\spl_object_hash($aliasPackage->getAliasOf())][$newIndex] = $aliasPackage; } foreach ($package->getRequires() as $link) { $require = $link->getTarget(); $linkConstraint = $link->getConstraint(); // if the required package is loaded as a locked package only and hasn't had its deps analyzed if (isset($this->skippedLoad[$require])) { // if we're doing a full update or this is a partial update with transitive deps and we're currently // looking at a package which needs to be updated we need to unlock the package we now know is a // dependency of another package which we are trying to update, and then attempt to load it again if ($propagateUpdate && $request->getUpdateAllowTransitiveDependencies()) { $skippedRootRequires = $this->getSkippedRootRequires($request, $require); if ($request->getUpdateAllowTransitiveRootDependencies() || 0 === \count($skippedRootRequires)) { $this->unlockPackage($request, $repositories, $require); $this->markPackageNameForLoading($request, $require, $linkConstraint); } else { foreach ($skippedRootRequires as $rootRequire) { if (!isset($this->updateAllowWarned[$rootRequire])) { $this->updateAllowWarned[$rootRequire] = \true; $this->io->writeError('Dependency ' . $rootRequire . ' is also a root requirement. Package has not been listed as an update argument, so keeping locked at old version. Use --with-all-dependencies (-W) to include root dependencies.'); } } } } elseif (isset($this->pathRepoUnlocked[$require]) && !isset($this->loadedPackages[$require])) { // if doing a partial update and a package depends on a path-repo-unlocked package which is not referenced by the root, we need to ensure it gets loaded as it was not loaded by the request's root requirements // and would not be loaded above if update propagation is not allowed (which happens if the requirer is itself a path-repo-unlocked package) or if transitive deps are not allowed to be unlocked $this->markPackageNameForLoading($request, $require, $linkConstraint); } } else { $this->markPackageNameForLoading($request, $require, $linkConstraint); } } // if we're doing a partial update with deps we also need to unlock packages which are being replaced in case // they are currently locked and thus prevent this updateable package from being installable/updateable if ($propagateUpdate && $request->getUpdateAllowTransitiveDependencies()) { foreach ($package->getReplaces() as $link) { $replace = $link->getTarget(); if (isset($this->loadedPackages[$replace], $this->skippedLoad[$replace])) { $skippedRootRequires = $this->getSkippedRootRequires($request, $replace); if ($request->getUpdateAllowTransitiveRootDependencies() || 0 === \count($skippedRootRequires)) { $this->unlockPackage($request, $repositories, $replace); // the replaced package only needs to be loaded if something else requires it $this->markPackageNameForLoadingIfRequired($request, $replace); } else { foreach ($skippedRootRequires as $rootRequire) { if (!isset($this->updateAllowWarned[$rootRequire])) { $this->updateAllowWarned[$rootRequire] = \true; $this->io->writeError('Dependency ' . $rootRequire . ' is also a root requirement. Package has not been listed as an update argument, so keeping locked at old version. Use --with-all-dependencies (-W) to include root dependencies.'); } } } } } } } /** * Checks if a particular name is required directly in the request * * @param string $name packageName */ private function isRootRequire(\Composer\DependencyResolver\Request $request, string $name) : bool { $rootRequires = $request->getRequires(); return isset($rootRequires[$name]); } /** * @return string[] */ private function getSkippedRootRequires(\Composer\DependencyResolver\Request $request, string $name) : array { if (!isset($this->skippedLoad[$name])) { return []; } $rootRequires = $request->getRequires(); $matches = []; if (isset($rootRequires[$name])) { return \array_map(static function (PackageInterface $package) use($name) : string { if ($name !== $package->getName()) { return $package->getName() . ' (via replace of ' . $name . ')'; } return $package->getName(); }, $this->skippedLoad[$name]); } foreach ($this->skippedLoad[$name] as $packageOrReplacer) { if (isset($rootRequires[$packageOrReplacer->getName()])) { $matches[] = $packageOrReplacer->getName(); } foreach ($packageOrReplacer->getReplaces() as $link) { if (isset($rootRequires[$link->getTarget()])) { if ($name !== $packageOrReplacer->getName()) { $matches[] = $packageOrReplacer->getName() . ' (via replace of ' . $name . ')'; } else { $matches[] = $packageOrReplacer->getName(); } break; } } } return $matches; } /** * Checks whether the update allow list allows this package in the lock file to be updated */ private function isUpdateAllowed(BasePackage $package) : bool { foreach ($this->updateAllowList as $pattern) { $patternRegexp = BasePackage::packageNameToRegexp($pattern); if (Preg::isMatch($patternRegexp, $package->getName())) { return \true; } } return \false; } private function warnAboutNonMatchingUpdateAllowList(\Composer\DependencyResolver\Request $request) : void { if (null === $request->getLockedRepository()) { throw new \LogicException('No lock repo present and yet a partial update was requested.'); } foreach ($this->updateAllowList as $pattern) { $matchedPlatformPackage = \false; $patternRegexp = BasePackage::packageNameToRegexp($pattern); // update pattern matches a locked package? => all good foreach ($request->getLockedRepository()->getPackages() as $package) { if (Preg::isMatch($patternRegexp, $package->getName())) { continue 2; } } // update pattern matches a root require? => all good, probably a new package foreach ($request->getRequires() as $packageName => $constraint) { if (Preg::isMatch($patternRegexp, $packageName)) { if (PlatformRepository::isPlatformPackage($packageName)) { $matchedPlatformPackage = \true; continue; } continue 2; } } if ($matchedPlatformPackage) { $this->io->writeError('Pattern "' . $pattern . '" listed for update matches platform packages, but these cannot be updated by Composer.'); } elseif (\strpos($pattern, '*') !== \false) { $this->io->writeError('Pattern "' . $pattern . '" listed for update does not match any locked packages.'); } else { $this->io->writeError('Package "' . $pattern . '" listed for update is not locked.'); } } } /** * Reverts the decision to use a locked package if a partial update with transitive dependencies * found that this package actually needs to be updated * * @param RepositoryInterface[] $repositories */ private function unlockPackage(\Composer\DependencyResolver\Request $request, array $repositories, string $name) : void { foreach ($this->skippedLoad[$name] as $packageOrReplacer) { // if we unfixed a replaced package name, we also need to unfix the replacer itself // as long as it was not unfixed yet if ($packageOrReplacer->getName() !== $name && isset($this->skippedLoad[$packageOrReplacer->getName()])) { $replacerName = $packageOrReplacer->getName(); if ($request->getUpdateAllowTransitiveRootDependencies() || !$this->isRootRequire($request, $name) && !$this->isRootRequire($request, $replacerName)) { $this->unlockPackage($request, $repositories, $replacerName); if ($this->isRootRequire($request, $replacerName)) { $this->markPackageNameForLoading($request, $replacerName, new MatchAllConstraint()); } else { foreach ($this->packages as $loadedPackage) { $requires = $loadedPackage->getRequires(); if (isset($requires[$replacerName])) { $this->markPackageNameForLoading($request, $replacerName, $requires[$replacerName]->getConstraint()); } } } } } } if (isset($this->pathRepoUnlocked[$name])) { foreach ($this->packages as $index => $package) { if ($package->getName() === $name) { $this->removeLoadedPackage($request, $repositories, $package, $index); } } } unset($this->skippedLoad[$name], $this->loadedPackages[$name], $this->maxExtendedReqs[$name], $this->pathRepoUnlocked[$name]); // remove locked package by this name which was already initialized foreach ($request->getLockedPackages() as $lockedPackage) { if (!$lockedPackage instanceof AliasPackage && $lockedPackage->getName() === $name) { if (\false !== ($index = \array_search($lockedPackage, $this->packages, \true))) { $request->unlockPackage($lockedPackage); $this->removeLoadedPackage($request, $repositories, $lockedPackage, $index); // make sure that any requirements for this package by other locked or fixed packages are now // also loaded, as they were previously ignored because the locked (now unlocked) package already // satisfied their requirements // and if this package is replacing another that is required by a locked or fixed package, ensure // that we load that replaced package in case an update to this package removes the replacement foreach ($request->getFixedOrLockedPackages() as $fixedOrLockedPackage) { if ($fixedOrLockedPackage === $lockedPackage) { continue; } if (isset($this->skippedLoad[$fixedOrLockedPackage->getName()])) { $requires = $fixedOrLockedPackage->getRequires(); if (isset($requires[$lockedPackage->getName()])) { $this->markPackageNameForLoading($request, $lockedPackage->getName(), $requires[$lockedPackage->getName()]->getConstraint()); } foreach ($lockedPackage->getReplaces() as $replace) { if (isset($requires[$replace->getTarget()], $this->skippedLoad[$replace->getTarget()])) { $this->unlockPackage($request, $repositories, $replace->getTarget()); // this package is in $requires so no need to call markPackageNameForLoadingIfRequired $this->markPackageNameForLoading($request, $replace->getTarget(), $replace->getConstraint()); } } } } } } } } private function markPackageNameForLoadingIfRequired(\Composer\DependencyResolver\Request $request, string $name) : void { if ($this->isRootRequire($request, $name)) { $this->markPackageNameForLoading($request, $name, $request->getRequires()[$name]); } foreach ($this->packages as $package) { foreach ($package->getRequires() as $link) { if ($name === $link->getTarget()) { $this->markPackageNameForLoading($request, $link->getTarget(), $link->getConstraint()); } } } } /** * @param RepositoryInterface[] $repositories */ private function removeLoadedPackage(\Composer\DependencyResolver\Request $request, array $repositories, BasePackage $package, int $index) : void { $repoIndex = \array_search($package->getRepository(), $repositories, \true); unset($this->loadedPerRepo[$repoIndex][$package->getName()][$package->getVersion()]); unset($this->packages[$index]); if (isset($this->aliasMap[\spl_object_hash($package)])) { foreach ($this->aliasMap[\spl_object_hash($package)] as $aliasIndex => $aliasPackage) { unset($this->loadedPerRepo[$repoIndex][$aliasPackage->getName()][$aliasPackage->getVersion()]); unset($this->packages[$aliasIndex]); } unset($this->aliasMap[\spl_object_hash($package)]); } } private function runOptimizer(\Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : \Composer\DependencyResolver\Pool { if (null === $this->poolOptimizer) { return $pool; } $this->io->debug('Running pool optimizer.'); $before = \microtime(\true); $total = \count($pool->getPackages()); $pool = $this->poolOptimizer->optimize($request, $pool); $filtered = $total - \count($pool->getPackages()); if (0 === $filtered) { return $pool; } $this->io->write(\sprintf('Pool optimizer completed in %.3f seconds', \microtime(\true) - $before), \true, IOInterface::VERY_VERBOSE); $this->io->write(\sprintf('Found %s package versions referenced in your dependency graph. %s (%d%%) were optimized away.', \number_format($total), \number_format($filtered), \round(100 / $total * $filtered)), \true, IOInterface::VERY_VERBOSE); return $pool; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\CompletePackageInterface; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\Link; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; use Composer\Pcre\Preg; use Composer\Repository\RepositorySet; use Composer\Repository\LockArrayRepository; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Package\Version\VersionParser; use Composer\Repository\PlatformRepository; use Composer\Semver\Constraint\MultiConstraint; /** * Represents a problem detected while solving dependencies * * @author Nils Adermann */ class Problem { /** * A map containing the id of each rule part of this problem as a key * @var array */ protected $reasonSeen; /** * A set of reasons for the problem, each is a rule or a root require and a rule * @var array> */ protected $reasons = []; /** @var int */ protected $section = 0; /** * Add a rule as a reason * * @param Rule $rule A rule which is a reason for this problem */ public function addRule(\Composer\DependencyResolver\Rule $rule) : void { $this->addReason(\spl_object_hash($rule), $rule); } /** * Retrieve all reasons for this problem * * @return array> The problem's reasons */ public function getReasons() : array { return $this->reasons; } /** * A human readable textual representation of the problem's reasons * * @param array $installedMap A map of all present packages * @param array $learnedPool */ public function getPrettyString(RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []) : string { // TODO doesn't this entirely defeat the purpose of the problem sections? what's the point of sections? $reasons = \array_merge(...\array_reverse($this->reasons)); if (\count($reasons) === 1) { \reset($reasons); $rule = \current($reasons); if ($rule->getReason() !== \Composer\DependencyResolver\Rule::RULE_ROOT_REQUIRE) { throw new \LogicException("Single reason problems must contain a root require rule."); } $reasonData = $rule->getReasonData(); $packageName = $reasonData['packageName']; $constraint = $reasonData['constraint']; $packages = $pool->whatProvides($packageName, $constraint); if (\count($packages) === 0) { return "\n " . \implode(self::getMissingPackageReason($repositorySet, $request, $pool, $isVerbose, $packageName, $constraint)); } } \usort($reasons, function (\Composer\DependencyResolver\Rule $rule1, \Composer\DependencyResolver\Rule $rule2) use($pool) { $rule1Prio = $this->getRulePriority($rule1); $rule2Prio = $this->getRulePriority($rule2); if ($rule1Prio !== $rule2Prio) { return $rule2Prio - $rule1Prio; } return $this->getSortableString($pool, $rule1) <=> $this->getSortableString($pool, $rule2); }); return self::formatDeduplicatedRules($reasons, ' ', $repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool); } private function getSortableString(\Composer\DependencyResolver\Pool $pool, \Composer\DependencyResolver\Rule $rule) : string { switch ($rule->getReason()) { case \Composer\DependencyResolver\Rule::RULE_ROOT_REQUIRE: return $rule->getReasonData()['packageName']; case \Composer\DependencyResolver\Rule::RULE_FIXED: return (string) $rule->getReasonData()['package']; case \Composer\DependencyResolver\Rule::RULE_PACKAGE_CONFLICT: case \Composer\DependencyResolver\Rule::RULE_PACKAGE_REQUIRES: return $rule->getSourcePackage($pool) . '//' . $rule->getReasonData()->getPrettyString($rule->getSourcePackage($pool)); case \Composer\DependencyResolver\Rule::RULE_PACKAGE_SAME_NAME: case \Composer\DependencyResolver\Rule::RULE_PACKAGE_ALIAS: case \Composer\DependencyResolver\Rule::RULE_PACKAGE_INVERSE_ALIAS: return (string) $rule->getReasonData(); case \Composer\DependencyResolver\Rule::RULE_LEARNED: return \implode('-', $rule->getLiterals()); } throw new \LogicException('Unknown rule type: ' . $rule->getReason()); } private function getRulePriority(\Composer\DependencyResolver\Rule $rule) : int { switch ($rule->getReason()) { case \Composer\DependencyResolver\Rule::RULE_FIXED: return 3; case \Composer\DependencyResolver\Rule::RULE_ROOT_REQUIRE: return 2; case \Composer\DependencyResolver\Rule::RULE_PACKAGE_CONFLICT: case \Composer\DependencyResolver\Rule::RULE_PACKAGE_REQUIRES: return 1; case \Composer\DependencyResolver\Rule::RULE_PACKAGE_SAME_NAME: case \Composer\DependencyResolver\Rule::RULE_LEARNED: case \Composer\DependencyResolver\Rule::RULE_PACKAGE_ALIAS: case \Composer\DependencyResolver\Rule::RULE_PACKAGE_INVERSE_ALIAS: return 0; } throw new \LogicException('Unknown rule type: ' . $rule->getReason()); } /** * @param Rule[] $rules * @param array $installedMap A map of all present packages * @param array $learnedPool * @internal */ public static function formatDeduplicatedRules(array $rules, string $indent, RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []) : string { $messages = []; $templates = []; $parser = new VersionParser(); $deduplicatableRuleTypes = [\Composer\DependencyResolver\Rule::RULE_PACKAGE_REQUIRES, \Composer\DependencyResolver\Rule::RULE_PACKAGE_CONFLICT]; foreach ($rules as $rule) { $message = $rule->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool); if (\in_array($rule->getReason(), $deduplicatableRuleTypes, \true) && Preg::isMatchStrictGroups('{^(?P\\S+) (?P\\S+) (?Prequires|conflicts)}', $message, $m)) { $message = \str_replace('%', '%%', $message); $template = Preg::replace('{^\\S+ \\S+ }', '%s%s ', $message); $messages[] = $template; $templates[$template][$m[1]][$parser->normalize($m[2])] = $m[2]; $sourcePackage = $rule->getSourcePackage($pool); foreach ($pool->getRemovedVersionsByPackage(\spl_object_hash($sourcePackage)) as $version => $prettyVersion) { $templates[$template][$m[1]][$version] = $prettyVersion; } } elseif ($message !== '') { $messages[] = $message; } } $result = []; foreach (\array_unique($messages) as $message) { if (isset($templates[$message])) { foreach ($templates[$message] as $package => $versions) { \uksort($versions, 'version_compare'); if (!$isVerbose) { $versions = self::condenseVersionList($versions, 1); } if (\count($versions) > 1) { // remove the s from requires/conflicts to correct grammar $message = Preg::replace('{^(%s%s (?:require|conflict))s}', '$1', $message); $result[] = \sprintf($message, $package, '[' . \implode(', ', $versions) . ']'); } else { $result[] = \sprintf($message, $package, ' ' . \reset($versions)); } } } else { $result[] = $message; } } return "\n{$indent}- " . \implode("\n{$indent}- ", $result); } public function isCausedByLock(RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool) : bool { foreach ($this->reasons as $sectionRules) { foreach ($sectionRules as $rule) { if ($rule->isCausedByLock($repositorySet, $request, $pool)) { return \true; } } } return \false; } /** * Store a reason descriptor but ignore duplicates * * @param string $id A canonical identifier for the reason * @param Rule $reason The reason descriptor */ protected function addReason(string $id, \Composer\DependencyResolver\Rule $reason) : void { // TODO: if a rule is part of a problem description in two sections, isn't this going to remove a message // that is important to understand the issue? if (!isset($this->reasonSeen[$id])) { $this->reasonSeen[$id] = \true; $this->reasons[$this->section][] = $reason; } } public function nextSection() : void { $this->section++; } /** * @internal * @return array{0: string, 1: string} */ public static function getMissingPackageReason(RepositorySet $repositorySet, \Composer\DependencyResolver\Request $request, \Composer\DependencyResolver\Pool $pool, bool $isVerbose, string $packageName, ?ConstraintInterface $constraint = null) : array { if (PlatformRepository::isPlatformPackage($packageName)) { // handle php/php-*/hhvm if (0 === \stripos($packageName, 'php') || $packageName === 'hhvm') { $version = self::getPlatformPackageVersion($pool, $packageName, \phpversion()); $msg = "- Root composer.json requires " . $packageName . self::constraintToText($constraint) . ' but '; if (\defined('_ContaoManager\\HHVM_VERSION') || $packageName === 'hhvm' && \count($pool->whatProvides($packageName)) > 0) { return [$msg, 'your HHVM version does not satisfy that requirement.']; } if ($packageName === 'hhvm') { return [$msg, 'HHVM was not detected on this machine, make sure it is in your PATH.']; } if (null === $version) { return [$msg, 'the ' . $packageName . ' package is disabled by your platform config. Enable it again with "composer config platform.' . $packageName . ' --unset".']; } return [$msg, 'your ' . $packageName . ' version (' . $version . ') does not satisfy that requirement.']; } // handle php extensions if (0 === \stripos($packageName, 'ext-')) { if (\false !== \strpos($packageName, ' ')) { return ['- ', "PHP extension " . $packageName . ' should be required as ' . \str_replace(' ', '-', $packageName) . '.']; } $ext = \substr($packageName, 4); $msg = "- Root composer.json requires PHP extension " . $packageName . self::constraintToText($constraint) . ' but '; $version = self::getPlatformPackageVersion($pool, $packageName, \phpversion($ext) === \false ? '0' : \phpversion($ext)); if (null === $version) { $providersStr = self::getProvidersList($repositorySet, $packageName, 5); if ($providersStr !== null) { $providersStr = "\n\n Alternatively you can require one of these packages that provide the extension (or parts of it):\n" . " Keep in mind that the suggestions are automated and may not be valid or safe to use\n{$providersStr}"; } if (\extension_loaded($ext)) { return [$msg, 'the ' . $packageName . ' package is disabled by your platform config. Enable it again with "composer config platform.' . $packageName . ' --unset".' . $providersStr]; } return [$msg, 'it is missing from your system. Install or enable PHP\'s ' . $ext . ' extension.' . $providersStr]; } return [$msg, 'it has the wrong version installed (' . $version . ').']; } // handle linked libs if (0 === \stripos($packageName, 'lib-')) { if (\strtolower($packageName) === 'lib-icu') { $error = \extension_loaded('intl') ? 'it has the wrong version installed, try upgrading the intl extension.' : 'it is missing from your system, make sure the intl extension is loaded.'; return ["- Root composer.json requires linked library " . $packageName . self::constraintToText($constraint) . ' but ', $error]; } $providersStr = self::getProvidersList($repositorySet, $packageName, 5); if ($providersStr !== null) { $providersStr = "\n\n Alternatively you can require one of these packages that provide the library (or parts of it):\n" . " Keep in mind that the suggestions are automated and may not be valid or safe to use\n{$providersStr}"; } return ["- Root composer.json requires linked library " . $packageName . self::constraintToText($constraint) . ' but ', 'it has the wrong version installed or is missing from your system, make sure to load the extension providing it.' . $providersStr]; } } $lockedPackage = null; foreach ($request->getLockedPackages() as $package) { if ($package->getName() === $packageName) { $lockedPackage = $package; if ($pool->isUnacceptableFixedOrLockedPackage($package)) { return ["- ", $package->getPrettyName() . ' is fixed to ' . $package->getPrettyVersion() . ' (lock file version) by a partial update but that version is rejected by your minimum-stability. Make sure you list it as an argument for the update command.']; } break; } } if ($constraint instanceof Constraint && $constraint->getOperator() === Constraint::STR_OP_EQ && Preg::isMatch('{^dev-.*#.*}', $constraint->getPrettyString())) { $newConstraint = Preg::replace('{ +as +([^,\\s|]+)$}', '', $constraint->getPrettyString()); $packages = $repositorySet->findPackages($packageName, new MultiConstraint([new Constraint(Constraint::STR_OP_EQ, $newConstraint), new Constraint(Constraint::STR_OP_EQ, \str_replace('#', '+', $newConstraint))], \false)); if (\count($packages) > 0) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . '. The # character in branch names is replaced by a + character. Make sure to require it as "' . \str_replace('#', '+', $constraint->getPrettyString()) . '".']; } } // first check if the actual requested package is found in normal conditions // if so it must mean it is rejected by another constraint than the one given here $packages = $repositorySet->findPackages($packageName, $constraint); if (\count($packages) > 0) { $rootReqs = $repositorySet->getRootRequires(); if (isset($rootReqs[$packageName])) { $filtered = \array_filter($packages, static function ($p) use($rootReqs, $packageName) : bool { return $rootReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); }); if (0 === \count($filtered)) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' but ' . (self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts') . ' with your root composer.json require (' . $rootReqs[$packageName]->getPrettyString() . ').']; } } $tempReqs = $repositorySet->getTemporaryConstraints(); if (isset($tempReqs[$packageName])) { $filtered = \array_filter($packages, static function ($p) use($tempReqs, $packageName) : bool { return $tempReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); }); if (0 === \count($filtered)) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' but ' . (self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts') . ' with your temporary update constraint (' . $packageName . ':' . $tempReqs[$packageName]->getPrettyString() . ').']; } } if ($lockedPackage !== null) { $fixedConstraint = new Constraint('==', $lockedPackage->getVersion()); $filtered = \array_filter($packages, static function ($p) use($fixedConstraint) : bool { return $fixedConstraint->matches(new Constraint('==', $p->getVersion())); }); if (0 === \count($filtered)) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' but the package is fixed to ' . $lockedPackage->getPrettyVersion() . ' (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.']; } } $nonLockedPackages = \array_filter($packages, static function ($p) : bool { return !$p->getRepository() instanceof LockArrayRepository; }); if (0 === \count($nonLockedPackages)) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' in the lock file but not in remote repositories, make sure you avoid updating this package to keep the one from the lock file.']; } return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' but these were not loaded, likely because ' . (self::hasMultipleNames($packages) ? 'they conflict' : 'it conflicts') . ' with another require.']; } // check if the package is found when bypassing stability checks $packages = $repositorySet->findPackages($packageName, $constraint, RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES); if (\count($packages) > 0) { // we must first verify if a valid package would be found in a lower priority repository $allReposPackages = $repositorySet->findPackages($packageName, $constraint, RepositorySet::ALLOW_SHADOWED_REPOSITORIES); if (\count($allReposPackages) > 0) { return self::computeCheckForLowerPrioRepo($pool, $isVerbose, $packageName, $packages, $allReposPackages, 'minimum-stability', $constraint); } return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' but ' . (self::hasMultipleNames($packages) ? 'these do' : 'it does') . ' not match your minimum-stability.']; } // check if the package is found when bypassing the constraint and stability checks $packages = $repositorySet->findPackages($packageName, null, RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES); if (\count($packages) > 0) { // we must first verify if a valid package would be found in a lower priority repository $allReposPackages = $repositorySet->findPackages($packageName, $constraint, RepositorySet::ALLOW_SHADOWED_REPOSITORIES); if (\count($allReposPackages) > 0) { return self::computeCheckForLowerPrioRepo($pool, $isVerbose, $packageName, $packages, $allReposPackages, 'constraint', $constraint); } $suffix = ''; if ($constraint instanceof Constraint && $constraint->getVersion() === 'dev-master') { foreach ($packages as $candidate) { if (\in_array($candidate->getVersion(), ['dev-default', 'dev-main'], \true)) { $suffix = ' Perhaps dev-master was renamed to ' . $candidate->getPrettyVersion() . '?'; break; } } } // check if the root package is a name match and hint the dependencies on root troubleshooting article $allReposPackages = $packages; $topPackage = \reset($allReposPackages); if ($topPackage instanceof RootPackageInterface) { $suffix = ' See https://getcomposer.org/dep-on-root for details and assistance.'; } return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($packages, $isVerbose, $pool, $constraint) . ' but ' . (self::hasMultipleNames($packages) ? 'these do' : 'it does') . ' not match the constraint.' . $suffix]; } if (!Preg::isMatch('{^[A-Za-z0-9_./-]+$}', $packageName)) { $illegalChars = Preg::replace('{[A-Za-z0-9_./-]+}', '', $packageName); return ["- Root composer.json requires {$packageName}, it ", 'could not be found, it looks like its name is invalid, "' . $illegalChars . '" is not allowed in package names.']; } $providersStr = self::getProvidersList($repositorySet, $packageName, 15); if ($providersStr !== null) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ", it ", "could not be found in any version, but the following packages provide it:\n" . $providersStr . " Consider requiring one of these to satisfy the {$packageName} requirement."]; } return ["- Root composer.json requires {$packageName}, it ", "could not be found in any version, there may be a typo in the package name."]; } /** * @internal * @param PackageInterface[] $packages */ public static function getPackageList(array $packages, bool $isVerbose, ?\Composer\DependencyResolver\Pool $pool = null, ?ConstraintInterface $constraint = null, bool $useRemovedVersionGroup = \false) : string { $prepared = []; $hasDefaultBranch = []; foreach ($packages as $package) { $prepared[$package->getName()]['name'] = $package->getPrettyName(); $prepared[$package->getName()]['versions'][$package->getVersion()] = $package->getPrettyVersion() . ($package instanceof AliasPackage ? ' (alias of ' . $package->getAliasOf()->getPrettyVersion() . ')' : ''); if ($pool !== null && $constraint !== null) { foreach ($pool->getRemovedVersions($package->getName(), $constraint) as $version => $prettyVersion) { $prepared[$package->getName()]['versions'][$version] = $prettyVersion; } } if ($pool !== null && $useRemovedVersionGroup) { foreach ($pool->getRemovedVersionsByPackage(\spl_object_hash($package)) as $version => $prettyVersion) { $prepared[$package->getName()]['versions'][$version] = $prettyVersion; } } if ($package->isDefaultBranch()) { $hasDefaultBranch[$package->getName()] = \true; } } $preparedStrings = []; foreach ($prepared as $name => $package) { // remove the implicit default branch alias to avoid cruft in the display if (isset($package['versions'][VersionParser::DEFAULT_BRANCH_ALIAS], $hasDefaultBranch[$name])) { unset($package['versions'][VersionParser::DEFAULT_BRANCH_ALIAS]); } \uksort($package['versions'], 'version_compare'); if (!$isVerbose) { $package['versions'] = self::condenseVersionList($package['versions'], 4); } $preparedStrings[] = $package['name'] . '[' . \implode(', ', $package['versions']) . ']'; } return \implode(', ', $preparedStrings); } /** * @param string $version the effective runtime version of the platform package * @return ?string a version string or null if it appears the package was artificially disabled */ private static function getPlatformPackageVersion(\Composer\DependencyResolver\Pool $pool, string $packageName, string $version) : ?string { $available = $pool->whatProvides($packageName); if (\count($available) > 0) { $selected = null; foreach ($available as $pkg) { if ($pkg->getRepository() instanceof PlatformRepository) { $selected = $pkg; break; } } if ($selected === null) { $selected = \reset($available); } // must be a package providing/replacing and not a real platform package if ($selected->getName() !== $packageName) { /** @var Link $link */ foreach (\array_merge(\array_values($selected->getProvides()), \array_values($selected->getReplaces())) as $link) { if ($link->getTarget() === $packageName) { return $link->getPrettyConstraint() . ' ' . \substr($link->getDescription(), 0, -1) . 'd by ' . $selected->getPrettyString(); } } } $version = $selected->getPrettyVersion(); $extra = $selected->getExtra(); if ($selected instanceof CompletePackageInterface && isset($extra['config.platform']) && $extra['config.platform'] === \true) { $version .= '; ' . \str_replace('Package ', '', (string) $selected->getDescription()); } } else { return null; } return $version; } /** * @param array $versions an array of pretty versions, with normalized versions as keys * @return list a list of pretty versions and '...' where versions were removed */ private static function condenseVersionList(array $versions, int $max, int $maxDev = 16) : array { if (\count($versions) <= $max) { return \array_values($versions); } $filtered = []; $byMajor = []; foreach ($versions as $version => $pretty) { if (0 === \stripos((string) $version, 'dev-')) { $byMajor['dev'][] = $pretty; } else { $byMajor[Preg::replace('{^(\\d+)\\..*}', '$1', (string) $version)][] = $pretty; } } foreach ($byMajor as $majorVersion => $versionsForMajor) { $maxVersions = $majorVersion === 'dev' ? $maxDev : $max; if (\count($versionsForMajor) > $maxVersions) { // output only 1st and last versions $filtered[] = $versionsForMajor[0]; $filtered[] = '...'; $filtered[] = $versionsForMajor[\count($versionsForMajor) - 1]; } else { $filtered = \array_merge($filtered, $versionsForMajor); } } return $filtered; } /** * @param PackageInterface[] $packages */ private static function hasMultipleNames(array $packages) : bool { $name = null; foreach ($packages as $package) { if ($name === null || $name === $package->getName()) { $name = $package->getName(); } else { return \true; } } return \false; } /** * @param non-empty-array $higherRepoPackages * @param non-empty-array $allReposPackages * @return array{0: string, 1: string} */ private static function computeCheckForLowerPrioRepo(\Composer\DependencyResolver\Pool $pool, bool $isVerbose, string $packageName, array $higherRepoPackages, array $allReposPackages, string $reason, ?ConstraintInterface $constraint = null) : array { $nextRepoPackages = []; $nextRepo = null; foreach ($allReposPackages as $package) { if ($nextRepo === null || $nextRepo === $package->getRepository()) { $nextRepoPackages[] = $package; $nextRepo = $package->getRepository(); } else { break; } } \assert(null !== $nextRepo); if (\count($higherRepoPackages) > 0) { $topPackage = \reset($higherRepoPackages); if ($topPackage instanceof RootPackageInterface) { return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', it is ', 'satisfiable by ' . self::getPackageList($nextRepoPackages, $isVerbose, $pool, $constraint) . ' from ' . $nextRepo->getRepoName() . ' but ' . $topPackage->getPrettyName() . ' ' . $topPackage->getPrettyVersion() . ' is the root package and cannot be modified. See https://getcomposer.org/dep-on-root for details and assistance.']; } } if ($nextRepo instanceof LockArrayRepository) { $singular = \count($higherRepoPackages) === 1; $suggestion = 'Make sure you either fix the ' . $reason . ' or avoid updating this package to keep the one present in the lock file (' . self::getPackageList($nextRepoPackages, $isVerbose, $pool, $constraint) . ').'; // symlinked path repos cannot be locked so do not suggest keeping it locked if ($nextRepoPackages[0]->getDistType() === 'path') { $transportOptions = $nextRepoPackages[0]->getTransportOptions(); if (!isset($transportOptions['symlink']) || $transportOptions['symlink'] !== \false) { $suggestion = 'Make sure you fix the ' . $reason . ' as packages installed from symlinked path repos are updated even in partial updates and the one from the lock file can thus not be used.'; } } return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($higherRepoPackages, $isVerbose, $pool, $constraint) . ' but ' . ($singular ? 'it does' : 'these do') . ' not match your ' . $reason . ' and ' . ($singular ? 'is' : 'are') . ' therefore not installable. ' . $suggestion]; } return ["- Root composer.json requires {$packageName}" . self::constraintToText($constraint) . ', it is ', 'satisfiable by ' . self::getPackageList($nextRepoPackages, $isVerbose, $pool, $constraint) . ' from ' . $nextRepo->getRepoName() . ' but ' . self::getPackageList($higherRepoPackages, $isVerbose, $pool, $constraint) . ' from ' . \reset($higherRepoPackages)->getRepository()->getRepoName() . ' has higher repository priority. The packages from the higher priority repository do not match your ' . $reason . ' and are therefore not installable. That repository is canonical so the lower priority repo\'s packages are not installable. See https://getcomposer.org/repoprio for details and assistance.']; } /** * Turns a constraint into text usable in a sentence describing a request */ protected static function constraintToText(?ConstraintInterface $constraint = null) : string { if ($constraint instanceof Constraint && $constraint->getOperator() === Constraint::STR_OP_EQ && !\str_starts_with($constraint->getVersion(), 'dev-')) { if (!Preg::isMatch('{^\\d+(?:\\.\\d+)*$}', $constraint->getPrettyString())) { return ' ' . $constraint->getPrettyString() . ' (exact version match)'; } $versions = [$constraint->getPrettyString()]; for ($i = 3 - \substr_count($versions[0], '.'); $i > 0; $i--) { $versions[] = \end($versions) . '.0'; } return ' ' . $constraint->getPrettyString() . ' (exact version match: ' . (\count($versions) > 1 ? \implode(', ', \array_slice($versions, 0, -1)) . ' or ' . \end($versions) : $versions[0]) . ')'; } return $constraint !== null ? ' ' . $constraint->getPrettyString() : ''; } private static function getProvidersList(RepositorySet $repositorySet, string $packageName, int $maxProviders) : ?string { $providers = $repositorySet->getProviders($packageName); if (\count($providers) > 0) { $providersStr = \implode(\array_map(static function ($p) : string { $description = $p['description'] !== '' && $p['description'] !== null ? ' ' . \substr($p['description'], 0, 100) : ''; return ' - ' . $p['name'] . $description . "\n"; }, \count($providers) > $maxProviders + 1 ? \array_slice($providers, 0, $maxProviders) : $providers)); if (\count($providers) > $maxProviders + 1) { $providersStr .= ' ... and ' . (\count($providers) - $maxProviders) . ' more.' . "\n"; } return $providersStr; } return null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann * @implements \Iterator */ class RuleSetIterator implements \Iterator { /** @var array */ protected $rules; /** @var array */ protected $types; /** @var int */ protected $currentOffset; /** @var RuleSet::TYPE_*|-1 */ protected $currentType; /** @var int */ protected $currentTypeOffset; /** * @param array $rules */ public function __construct(array $rules) { $this->rules = $rules; $this->types = \array_keys($rules); \sort($this->types); $this->rewind(); } public function current() : \Composer\DependencyResolver\Rule { return $this->rules[$this->currentType][$this->currentOffset]; } /** * @return RuleSet::TYPE_*|-1 */ public function key() : int { return $this->currentType; } public function next() : void { $this->currentOffset++; if (!isset($this->rules[$this->currentType])) { return; } if ($this->currentOffset >= \count($this->rules[$this->currentType])) { $this->currentOffset = 0; do { $this->currentTypeOffset++; if (!isset($this->types[$this->currentTypeOffset])) { $this->currentType = -1; break; } $this->currentType = $this->types[$this->currentTypeOffset]; } while (0 === \count($this->rules[$this->currentType])); } } public function rewind() : void { $this->currentOffset = 0; $this->currentTypeOffset = -1; $this->currentType = -1; do { $this->currentTypeOffset++; if (!isset($this->types[$this->currentTypeOffset])) { $this->currentType = -1; break; } $this->currentType = $this->types[$this->currentTypeOffset]; } while (0 === \count($this->rules[$this->currentType])); } public function valid() : bool { return isset($this->rules[$this->currentType], $this->rules[$this->currentType][$this->currentOffset]); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * An extension of SplDoublyLinkedList with seek and removal of current element * * SplDoublyLinkedList only allows deleting a particular offset and has no * method to set the internal iterator to a particular offset. * * @author Nils Adermann * @extends \SplDoublyLinkedList */ class RuleWatchChain extends \SplDoublyLinkedList { /** * Moves the internal iterator to the specified offset * * @param int $offset The offset to seek to. */ public function seek(int $offset) : void { $this->rewind(); for ($i = 0; $i < $offset; $i++, $this->next()) { } } /** * Removes the current element from the list * * As SplDoublyLinkedList only allows deleting a particular offset and * incorrectly sets the internal iterator if you delete the current value * this method sets the internal iterator back to the following element * using the seek method. */ public function remove() : void { $offset = $this->key(); $this->offsetUnset($offset); $this->seek($offset); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; use Composer\ClassMapGenerator\ClassMap; use Composer\ClassMapGenerator\ClassMapGenerator; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\Installer\InstallationManager; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; use Composer\Pcre\Preg; use Composer\Repository\InstalledRepositoryInterface; use Composer\Semver\Constraint\Bound; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Script\ScriptEvents; use Composer\Util\PackageSorter; use Composer\Json\JsonFile; use Composer\Package\Locker; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; /** * @author Igor Wiedler * @author Jordi Boggiano */ class AutoloadGenerator { /** * @var EventDispatcher */ private $eventDispatcher; /** * @var IOInterface */ private $io; /** * @var ?bool */ private $devMode = null; /** * @var bool */ private $classMapAuthoritative = \false; /** * @var bool */ private $apcu = \false; /** * @var string|null */ private $apcuPrefix; /** * @var bool */ private $dryRun = \false; /** * @var bool */ private $runScripts = \false; /** * @var PlatformRequirementFilterInterface */ private $platformRequirementFilter; public function __construct(EventDispatcher $eventDispatcher, ?IOInterface $io = null) { $this->eventDispatcher = $eventDispatcher; $this->io = $io ?? new NullIO(); $this->platformRequirementFilter = PlatformRequirementFilterFactory::ignoreNothing(); } /** * @return void */ public function setDevMode(bool $devMode = \true) { $this->devMode = $devMode; } /** * Whether generated autoloader considers the class map authoritative. * * @return void */ public function setClassMapAuthoritative(bool $classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Whether generated autoloader considers APCu caching. * * @return void */ public function setApcu(bool $apcu, ?string $apcuPrefix = null) { $this->apcu = $apcu; $this->apcuPrefix = $apcuPrefix; } /** * Whether to run scripts or not * * @return void */ public function setRunScripts(bool $runScripts = \true) { $this->runScripts = $runScripts; } /** * Whether to run in drymode or not */ public function setDryRun(bool $dryRun = \true) : void { $this->dryRun = $dryRun; } /** * Whether platform requirements should be ignored. * * If this is set to true, the platform check file will not be generated * If this is set to false, the platform check file will be generated with all requirements * If this is set to string[], those packages will be ignored from the platform check file * * @param bool|string[] $ignorePlatformReqs * @return void * * @deprecated use setPlatformRequirementFilter instead */ public function setIgnorePlatformRequirements($ignorePlatformReqs) { \trigger_error('AutoloadGenerator::setIgnorePlatformRequirements is deprecated since Composer 2.2, use setPlatformRequirementFilter instead.', \E_USER_DEPRECATED); $this->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)); } /** * @return void */ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface $platformRequirementFilter) { $this->platformRequirementFilter = $platformRequirementFilter; } /** * @return ClassMap * @throws \Seld\JsonLint\ParsingException * @throws \RuntimeException */ public function dump(Config $config, InstalledRepositoryInterface $localRepo, RootPackageInterface $rootPackage, InstallationManager $installationManager, string $targetDir, bool $scanPsrPackages = \false, ?string $suffix = null, ?Locker $locker = null, bool $strictAmbiguous = \false) { if ($this->classMapAuthoritative) { // Force scanPsrPackages when classmap is authoritative $scanPsrPackages = \true; } // auto-set devMode based on whether dev dependencies are installed or not if (null === $this->devMode) { // we assume no-dev mode if no vendor dir is present or it is too old to contain dev information $this->devMode = \false; $installedJson = new JsonFile($config->get('vendor-dir') . '/composer/installed.json'); if ($installedJson->exists()) { $installedJson = $installedJson->read(); if (isset($installedJson['dev'])) { $this->devMode = $installedJson['dev']; } } } if ($this->runScripts) { // set COMPOSER_DEV_MODE in case not set yet so it is available in the dump-autoload event listeners if (!isset($_SERVER['COMPOSER_DEV_MODE'])) { Platform::putEnv('COMPOSER_DEV_MODE', $this->devMode ? '1' : '0'); } $this->eventDispatcher->dispatchScript(ScriptEvents::PRE_AUTOLOAD_DUMP, $this->devMode, [], ['optimize' => $scanPsrPackages]); } $classMapGenerator = new ClassMapGenerator(['php', 'inc', 'hh']); $classMapGenerator->avoidDuplicateScans(); $filesystem = new Filesystem(); $filesystem->ensureDirectoryExists($config->get('vendor-dir')); // Do not remove double realpath() calls. // Fixes failing Windows realpath() implementation. // See https://bugs.php.net/bug.php?id=72738 $basePath = $filesystem->normalizePath(\realpath(\realpath(Platform::getCwd()))); $vendorPath = $filesystem->normalizePath(\realpath(\realpath($config->get('vendor-dir')))); $useGlobalIncludePath = $config->get('use-include-path'); $prependAutoloader = $config->get('prepend-autoloader') === \false ? 'false' : 'true'; $targetDir = $vendorPath . '/' . $targetDir; $filesystem->ensureDirectoryExists($targetDir); $vendorPathCode = $filesystem->findShortestPathCode(\realpath($targetDir), $vendorPath, \true); $vendorPathToTargetDirCode = $filesystem->findShortestPathCode($vendorPath, \realpath($targetDir), \true); $appBaseDirCode = $filesystem->findShortestPathCode($vendorPath, $basePath, \true); $appBaseDirCode = \str_replace('__DIR__', '$vendorDir', $appBaseDirCode); $namespacesFile = <<getDevPackageNames(); $packageMap = $this->buildPackageMap($installationManager, $rootPackage, $localRepo->getCanonicalPackages()); if ($this->devMode) { // if dev mode is enabled, then we do not filter any dev packages out so disable this entirely $filteredDevPackages = \false; } else { // if the list of dev package names is available we use that straight, otherwise pass true which means use legacy algo to figure them out $filteredDevPackages = $devPackageNames ?: \true; } $autoloads = $this->parseAutoloads($packageMap, $rootPackage, $filteredDevPackages); // Process the 'psr-0' base directories. foreach ($autoloads['psr-0'] as $namespace => $paths) { $exportedPaths = []; foreach ($paths as $path) { $exportedPaths[] = $this->getPathCode($filesystem, $basePath, $vendorPath, $path); } $exportedPrefix = \var_export($namespace, \true); $namespacesFile .= " {$exportedPrefix} => "; $namespacesFile .= "array(" . \implode(', ', $exportedPaths) . "),\n"; } $namespacesFile .= ");\n"; // Process the 'psr-4' base directories. foreach ($autoloads['psr-4'] as $namespace => $paths) { $exportedPaths = []; foreach ($paths as $path) { $exportedPaths[] = $this->getPathCode($filesystem, $basePath, $vendorPath, $path); } $exportedPrefix = \var_export($namespace, \true); $psr4File .= " {$exportedPrefix} => "; $psr4File .= "array(" . \implode(', ', $exportedPaths) . "),\n"; } $psr4File .= ");\n"; // add custom psr-0 autoloading if the root package has a target dir $targetDirLoader = null; $mainAutoload = $rootPackage->getAutoload(); if ($rootPackage->getTargetDir() && !empty($mainAutoload['psr-0'])) { $levels = \substr_count($filesystem->normalizePath($rootPackage->getTargetDir()), '/') + 1; $prefixes = \implode(', ', \array_map(static function ($prefix) : string { return \var_export($prefix, \true); }, \array_keys($mainAutoload['psr-0']))); $baseDirFromTargetDirCode = $filesystem->findShortestPathCode($targetDir, $basePath, \true); $targetDirLoader = <<scanPaths($dir, $this->buildExclusionRegex($dir, $excluded)); } if ($scanPsrPackages) { $namespacesToScan = []; // Scan the PSR-0/4 directories for class files, and add them to the class map foreach (['psr-4', 'psr-0'] as $psrType) { foreach ($autoloads[$psrType] as $namespace => $paths) { $namespacesToScan[$namespace][] = ['paths' => $paths, 'type' => $psrType]; } } \krsort($namespacesToScan); foreach ($namespacesToScan as $namespace => $groups) { foreach ($groups as $group) { foreach ($group['paths'] as $dir) { $dir = $filesystem->normalizePath($filesystem->isAbsolutePath($dir) ? $dir : $basePath . '/' . $dir); if (!\is_dir($dir)) { continue; } // if the vendor dir is contained within a psr-0/psr-4 dir being scanned we exclude it if (\str_contains($vendorPath, $dir . '/')) { $exclusionRegex = $this->buildExclusionRegex($dir, \array_merge($excluded, [$vendorPath . '/'])); } else { $exclusionRegex = $this->buildExclusionRegex($dir, $excluded); } $classMapGenerator->scanPaths($dir, $exclusionRegex, $group['type'], $namespace); } } } } $classMap = $classMapGenerator->getClassMap(); if ($strictAmbiguous) { $ambiguousClasses = $classMap->getAmbiguousClasses(\false); } else { $ambiguousClasses = $classMap->getAmbiguousClasses(); } foreach ($ambiguousClasses as $className => $ambiguousPaths) { if (\count($ambiguousPaths) > 1) { $this->io->writeError('Warning: Ambiguous class resolution, "' . $className . '"' . ' was found ' . (\count($ambiguousPaths) + 1) . 'x: in "' . $classMap->getClassPath($className) . '" and "' . \implode('", "', $ambiguousPaths) . '", the first will be used.'); } else { $this->io->writeError('Warning: Ambiguous class resolution, "' . $className . '"' . ' was found in both "' . $classMap->getClassPath($className) . '" and "' . \implode('", "', $ambiguousPaths) . '", the first will be used.'); } } if (\count($ambiguousClasses) > 0) { $this->io->writeError('To resolve ambiguity in classes not under your control you can ignore them by path using exclude-files-from-classmap'); } // output PSR violations which are not coming from the vendor dir $classMap->clearPsrViolationsByPath($vendorPath); foreach ($classMap->getPsrViolations() as $msg) { $this->io->writeError("{$msg}"); } $classMap->addClass('Composer\\InstalledVersions', $vendorPath . '/composer/InstalledVersions.php'); $classMap->sort(); $classmapFile = <<getMap() as $className => $path) { $pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path) . ",\n"; $classmapFile .= ' ' . \var_export($className, \true) . ' => ' . $pathCode; } $classmapFile .= ");\n"; if ('' === $suffix) { $suffix = null; } if (null === $suffix) { $suffix = $config->get('autoloader-suffix'); // carry over existing autoload.php's suffix if possible and none is configured if (null === $suffix && Filesystem::isReadable($vendorPath . '/autoload.php')) { $content = (string) \file_get_contents($vendorPath . '/autoload.php'); if (Preg::isMatch('{ComposerAutoloaderInit([^:\\s]+)::}', $content, $match)) { $suffix = $match[1]; } } if (null === $suffix) { $suffix = $locker !== null && $locker->isLocked() ? $locker->getLockData()['content-hash'] : \bin2hex(\random_bytes(16)); } } if ($this->dryRun) { return $classMap; } $filesystem->filePutContentsIfModified($targetDir . '/autoload_namespaces.php', $namespacesFile); $filesystem->filePutContentsIfModified($targetDir . '/autoload_psr4.php', $psr4File); $filesystem->filePutContentsIfModified($targetDir . '/autoload_classmap.php', $classmapFile); $includePathFilePath = $targetDir . '/include_paths.php'; if ($includePathFileContents = $this->getIncludePathsFile($packageMap, $filesystem, $basePath, $vendorPath, $vendorPathCode, $appBaseDirCode)) { $filesystem->filePutContentsIfModified($includePathFilePath, $includePathFileContents); } elseif (\file_exists($includePathFilePath)) { \unlink($includePathFilePath); } $includeFilesFilePath = $targetDir . '/autoload_files.php'; if ($includeFilesFileContents = $this->getIncludeFilesFile($autoloads['files'], $filesystem, $basePath, $vendorPath, $vendorPathCode, $appBaseDirCode)) { $filesystem->filePutContentsIfModified($includeFilesFilePath, $includeFilesFileContents); } elseif (\file_exists($includeFilesFilePath)) { \unlink($includeFilesFilePath); } $filesystem->filePutContentsIfModified($targetDir . '/autoload_static.php', $this->getStaticFile($suffix, $targetDir, $vendorPath, $basePath)); $checkPlatform = $config->get('platform-check') !== \false && !$this->platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter; $platformCheckContent = null; if ($checkPlatform) { $platformCheckContent = $this->getPlatformCheck($packageMap, $config->get('platform-check'), $devPackageNames); if (null === $platformCheckContent) { $checkPlatform = \false; } } if ($checkPlatform) { $filesystem->filePutContentsIfModified($targetDir . '/platform_check.php', $platformCheckContent); } elseif (\file_exists($targetDir . '/platform_check.php')) { \unlink($targetDir . '/platform_check.php'); } $filesystem->filePutContentsIfModified($vendorPath . '/autoload.php', $this->getAutoloadFile($vendorPathToTargetDirCode, $suffix)); $filesystem->filePutContentsIfModified($targetDir . '/autoload_real.php', $this->getAutoloadRealFile(\true, (bool) $includePathFileContents, $targetDirLoader, (bool) $includeFilesFileContents, $vendorPathCode, $appBaseDirCode, $suffix, $useGlobalIncludePath, $prependAutoloader, $checkPlatform)); $filesystem->safeCopy(__DIR__ . '/ClassLoader.php', $targetDir . '/ClassLoader.php'); $filesystem->safeCopy(__DIR__ . '/../../../LICENSE', $targetDir . '/LICENSE'); if ($this->runScripts) { $this->eventDispatcher->dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP, $this->devMode, [], ['optimize' => $scanPsrPackages]); } return $classMap; } /** * @param array $excluded * @return non-empty-string|null */ private function buildExclusionRegex(string $dir, array $excluded) : ?string { if ([] === $excluded) { return null; } // filter excluded patterns here to only use those matching $dir // exclude-from-classmap patterns are all realpath'd so we can only filter them if $dir exists so that realpath($dir) will work // if $dir does not exist, it should anyway not find anything there so no trouble if (\file_exists($dir)) { // transform $dir in the same way that exclude-from-classmap patterns are transformed so we can match them against each other $dirMatch = \preg_quote(\strtr(\realpath($dir), '\\', '/')); foreach ($excluded as $index => $pattern) { // extract the constant string prefix of the pattern here, until we reach a non-escaped regex special character $pattern = Preg::replace('{^(([^.+*?\\[^\\]$(){}=!<>|:\\\\#-]+|\\\\[.+*?\\[^\\]$(){}=!<>|:#-])*).*}', '$1', $pattern); // if the pattern is not a subset or superset of $dir, it is unrelated and we skip it if (0 !== \strpos($pattern, $dirMatch) && 0 !== \strpos($dirMatch, $pattern)) { unset($excluded[$index]); } } } return \count($excluded) > 0 ? '{(' . \implode('|', $excluded) . ')}' : null; } /** * @param PackageInterface[] $packages * @return non-empty-array */ public function buildPackageMap(InstallationManager $installationManager, PackageInterface $rootPackage, array $packages) { // build package => install path map $packageMap = [[$rootPackage, '']]; foreach ($packages as $package) { if ($package instanceof AliasPackage) { continue; } $this->validatePackage($package); $packageMap[] = [$package, $installationManager->getInstallPath($package)]; } return $packageMap; } /** * @return void * @throws \InvalidArgumentException Throws an exception, if the package has illegal settings. */ protected function validatePackage(PackageInterface $package) { $autoload = $package->getAutoload(); if (!empty($autoload['psr-4']) && null !== $package->getTargetDir()) { $name = $package->getName(); $package->getTargetDir(); throw new \InvalidArgumentException("PSR-4 autoloading is incompatible with the target-dir property, remove the target-dir in package '{$name}'."); } if (!empty($autoload['psr-4'])) { foreach ($autoload['psr-4'] as $namespace => $dirs) { if ($namespace !== '' && '\\' !== \substr($namespace, -1)) { throw new \InvalidArgumentException("psr-4 namespaces must end with a namespace separator, '{$namespace}' does not, use '{$namespace}\\'."); } } } } /** * Compiles an ordered list of namespace => path mappings * * @param non-empty-array $packageMap array of array(package, installDir-relative-to-composer.json or null for metapackages) * @param RootPackageInterface $rootPackage root package instance * @param bool|string[] $filteredDevPackages If an array, the list of packages that must be removed. If bool, whether to filter out require-dev packages * @return array * @phpstan-return array{ * 'psr-0': array>, * 'psr-4': array>, * 'classmap': array, * 'files': array, * 'exclude-from-classmap': array, * } */ public function parseAutoloads(array $packageMap, PackageInterface $rootPackage, $filteredDevPackages = \false) { $rootPackageMap = \array_shift($packageMap); if (\is_array($filteredDevPackages)) { $packageMap = \array_filter($packageMap, static function ($item) use($filteredDevPackages) : bool { return !\in_array($item[0]->getName(), $filteredDevPackages, \true); }); } elseif ($filteredDevPackages) { $packageMap = $this->filterPackageMap($packageMap, $rootPackage); } $sortedPackageMap = $this->sortPackageMap($packageMap); $sortedPackageMap[] = $rootPackageMap; $reverseSortedMap = \array_reverse($sortedPackageMap); // reverse-sorted means root first, then dependents, then their dependents, etc. // which makes sense to allow root to override classmap or psr-0/4 entries with higher precedence rules $psr0 = $this->parseAutoloadsType($reverseSortedMap, 'psr-0', $rootPackage); $psr4 = $this->parseAutoloadsType($reverseSortedMap, 'psr-4', $rootPackage); $classmap = $this->parseAutoloadsType($reverseSortedMap, 'classmap', $rootPackage); // sorted (i.e. dependents first) for files to ensure that dependencies are loaded/available once a file is included $files = $this->parseAutoloadsType($sortedPackageMap, 'files', $rootPackage); // using sorted here but it does not really matter as all are excluded equally $exclude = $this->parseAutoloadsType($sortedPackageMap, 'exclude-from-classmap', $rootPackage); \krsort($psr0); \krsort($psr4); return ['psr-0' => $psr0, 'psr-4' => $psr4, 'classmap' => $classmap, 'files' => $files, 'exclude-from-classmap' => $exclude]; } /** * Registers an autoloader based on an autoload-map returned by parseAutoloads * * @param array $autoloads see parseAutoloads return value * @return ClassLoader */ public function createLoader(array $autoloads, ?string $vendorDir = null) { $loader = new \Composer\Autoload\ClassLoader($vendorDir); if (isset($autoloads['psr-0'])) { foreach ($autoloads['psr-0'] as $namespace => $path) { $loader->add($namespace, $path); } } if (isset($autoloads['psr-4'])) { foreach ($autoloads['psr-4'] as $namespace => $path) { $loader->addPsr4($namespace, $path); } } if (isset($autoloads['classmap'])) { $excluded = []; if (!empty($autoloads['exclude-from-classmap'])) { $excluded = $autoloads['exclude-from-classmap']; } $classMapGenerator = new ClassMapGenerator(['php', 'inc', 'hh']); $classMapGenerator->avoidDuplicateScans(); foreach ($autoloads['classmap'] as $dir) { try { $classMapGenerator->scanPaths($dir, $this->buildExclusionRegex($dir, $excluded)); } catch (\RuntimeException $e) { $this->io->writeError('' . $e->getMessage() . ''); } } $loader->addClassMap($classMapGenerator->getClassMap()->getMap()); } return $loader; } /** * @param array $packageMap * @return ?string */ protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem, string $basePath, string $vendorPath, string $vendorPathCode, string $appBaseDirCode) { $includePaths = []; foreach ($packageMap as $item) { [$package, $installPath] = $item; // packages that are not installed cannot autoload anything if (null === $installPath) { continue; } if (null !== $package->getTargetDir() && \strlen($package->getTargetDir()) > 0) { $installPath = \substr($installPath, 0, -\strlen('/' . $package->getTargetDir())); } foreach ($package->getIncludePaths() as $includePath) { $includePath = \trim($includePath, '/'); $includePaths[] = $installPath === '' ? $includePath : $installPath . '/' . $includePath; } } if (\count($includePaths) === 0) { return null; } $includePathsCode = ''; foreach ($includePaths as $path) { $includePathsCode .= " " . $this->getPathCode($filesystem, $basePath, $vendorPath, $path) . ",\n"; } return << $files * @return ?string */ protected function getIncludeFilesFile(array $files, Filesystem $filesystem, string $basePath, string $vendorPath, string $vendorPathCode, string $appBaseDirCode) { // Get the path to each file, and make sure these paths are unique. $files = \array_map(function (string $functionFile) use($filesystem, $basePath, $vendorPath) : string { return $this->getPathCode($filesystem, $basePath, $vendorPath, $functionFile); }, $files); $uniqueFiles = \array_unique($files); if (\count($uniqueFiles) < \count($files)) { $this->io->writeError('The following "files" autoload rules are included multiple times, this may cause issues and should be resolved:'); foreach (\array_unique(\array_diff_assoc($files, $uniqueFiles)) as $duplicateFile) { $this->io->writeError(' - ' . $duplicateFile . ''); } } unset($uniqueFiles); $filesCode = ''; foreach ($files as $fileIdentifier => $functionFile) { $filesCode .= ' ' . \var_export($fileIdentifier, \true) . ' => ' . $functionFile . ",\n"; } if (!$filesCode) { return null; } return <<isAbsolutePath($path)) { $path = $basePath . '/' . $path; } $path = $filesystem->normalizePath($path); $baseDir = ''; if (\strpos($path . '/', $vendorPath . '/') === 0) { $path = (string) \substr($path, \strlen($vendorPath)); $baseDir = '$vendorDir . '; } else { $path = $filesystem->normalizePath($filesystem->findShortestPath($basePath, $path, \true)); if (!$filesystem->isAbsolutePath($path)) { $baseDir = '$baseDir . '; $path = '/' . $path; } } if (\strpos($path, '.phar') !== \false) { $baseDir = "'phar://' . " . $baseDir; } return $baseDir . \var_export($path, \true); } /** * @param array $packageMap * @param bool|'php-only' $checkPlatform * @param string[] $devPackageNames * @return ?string */ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $devPackageNames) { $lowestPhpVersion = Bound::zero(); $requiredPhp64bit = \false; $requiredExtensions = []; $extensionProviders = []; foreach ($packageMap as $item) { $package = $item[0]; foreach (\array_merge($package->getReplaces(), $package->getProvides()) as $link) { if (Preg::isMatch('{^ext-(.+)$}iD', $link->getTarget(), $match)) { $extensionProviders[$match[1]][] = $link->getConstraint(); } } } foreach ($packageMap as $item) { $package = $item[0]; // skip dev dependencies platform requirements as platform-check really should only be a production safeguard if (\in_array($package->getName(), $devPackageNames, \true)) { continue; } foreach ($package->getRequires() as $link) { if ($this->platformRequirementFilter->isIgnored($link->getTarget())) { continue; } if (\in_array($link->getTarget(), ['php', 'php-64bit'], \true)) { $constraint = $link->getConstraint(); if ($constraint->getLowerBound()->compareTo($lowestPhpVersion, '>')) { $lowestPhpVersion = $constraint->getLowerBound(); } } if ('php-64bit' === $link->getTarget()) { $requiredPhp64bit = \true; } if ($checkPlatform === \true && Preg::isMatch('{^ext-(.+)$}iD', $link->getTarget(), $match)) { // skip extension checks if they have a valid provider/replacer if (isset($extensionProviders[$match[1]])) { foreach ($extensionProviders[$match[1]] as $provided) { if ($provided->matches($link->getConstraint())) { continue 2; } } } if ($match[1] === 'zend-opcache') { $match[1] = 'zend opcache'; } $extension = \var_export($match[1], \true); if ($match[1] === 'pcntl' || $match[1] === 'readline') { $requiredExtensions[$extension] = "PHP_SAPI !== 'cli' || extension_loaded({$extension}) || \$missingExtensions[] = {$extension};\n"; } else { $requiredExtensions[$extension] = "extension_loaded({$extension}) || \$missingExtensions[] = {$extension};\n"; } } } } \ksort($requiredExtensions); $formatToPhpVersionId = static function (Bound $bound) : int { if ($bound->isZero()) { return 0; } if ($bound->isPositiveInfinity()) { return 99999; } $version = \str_replace('-', '.', $bound->getVersion()); $chunks = \array_map('intval', \explode('.', $version)); return $chunks[0] * 10000 + $chunks[1] * 100 + $chunks[2]; }; $formatToHumanReadable = static function (Bound $bound) { if ($bound->isZero()) { return 0; } if ($bound->isPositiveInfinity()) { return 99999; } $version = \str_replace('-', '.', $bound->getVersion()); $chunks = \explode('.', $version); $chunks = \array_slice($chunks, 0, 3); return \implode('.', $chunks); }; $requiredPhp = ''; $requiredPhpError = ''; if (!$lowestPhpVersion->isZero()) { $operator = $lowestPhpVersion->isInclusive() ? '>=' : '>'; $requiredPhp = 'PHP_VERSION_ID ' . $operator . ' ' . $formatToPhpVersionId($lowestPhpVersion); $requiredPhpError = '"' . $operator . ' ' . $formatToHumanReadable($lowestPhpVersion) . '"'; } if ($requiredPhp) { $requiredPhp = <<classMapAuthoritative) { $file .= <<<'CLASSMAPAUTHORITATIVE' $loader->setClassMapAuthoritative(true); CLASSMAPAUTHORITATIVE; } if ($this->apcu) { $apcuPrefix = \var_export($this->apcuPrefix !== null ? $this->apcuPrefix : \bin2hex(\random_bytes(10)), \true); $file .= <<setApcuPrefix({$apcuPrefix}); APCU; } if ($useGlobalIncludePath) { $file .= <<<'INCLUDEPATH' $loader->setUseIncludePath(true); INCLUDEPATH; } if ($targetDirLoader) { $file .= <<register({$prependAutoloader}); REGISTER_LOADER; if ($useIncludeFiles) { $file .= << \$file) { \$requireFile(\$fileIdentifier, \$file); } INCLUDE_FILES; } $file .= << $path) { $loader->set($namespace, $path); } $map = (require $targetDir . '/autoload_psr4.php'); foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } /** * @var string $vendorDir * @var string $baseDir */ $classMap = (require $targetDir . '/autoload_classmap.php'); if ($classMap) { $loader->addClassMap($classMap); } $filesystem = new Filesystem(); $vendorPathCode = ' => ' . $filesystem->findShortestPathCode(\realpath($targetDir), $vendorPath, \true, \true) . " . '/"; $vendorPharPathCode = ' => \'phar://\' . ' . $filesystem->findShortestPathCode(\realpath($targetDir), $vendorPath, \true, \true) . " . '/"; $appBaseDirCode = ' => ' . $filesystem->findShortestPathCode(\realpath($targetDir), $basePath, \true, \true) . " . '/"; $appBaseDirPharCode = ' => \'phar://\' . ' . $filesystem->findShortestPathCode(\realpath($targetDir), $basePath, \true, \true) . " . '/"; $absoluteVendorPathCode = ' => ' . \substr(\var_export(\rtrim($vendorDir, '\\/') . '/', \true), 0, -1); $absoluteVendorPharPathCode = ' => ' . \substr(\var_export(\rtrim('phar://' . $vendorDir, '\\/') . '/', \true), 0, -1); $absoluteAppBaseDirCode = ' => ' . \substr(\var_export(\rtrim($baseDir, '\\/') . '/', \true), 0, -1); $absoluteAppBaseDirPharCode = ' => ' . \substr(\var_export(\rtrim('phar://' . $baseDir, '\\/') . '/', \true), 0, -1); $initializer = ''; $prefix = "\x00Composer\\Autoload\\ClassLoader\x00"; $prefixLen = \strlen($prefix); if (\file_exists($targetDir . '/autoload_files.php')) { $maps = ['files' => require $targetDir . '/autoload_files.php']; } else { $maps = []; } foreach ((array) $loader as $prop => $value) { if (!\is_array($value) || \count($value) === 0 || !\str_starts_with($prop, $prefix)) { continue; } $maps[\substr($prop, $prefixLen)] = $value; } foreach ($maps as $prop => $value) { $value = \strtr(\var_export($value, \true), [$absoluteVendorPathCode => $vendorPathCode, $absoluteVendorPharPathCode => $vendorPharPathCode, $absoluteAppBaseDirCode => $appBaseDirCode, $absoluteAppBaseDirPharCode => $appBaseDirPharCode]); $value = \ltrim(Preg::replace('/^ */m', ' $0$0', $value)); $file .= \sprintf(" public static \$%s = %s;\n\n", $prop, $value); if ('files' !== $prop) { $initializer .= " \$loader->{$prop} = ComposerStaticInit{$suffix}::\${$prop};\n"; } } return $file . << $packageMap * @param string $type one of: 'psr-0'|'psr-4'|'classmap'|'files' * @return array|array>|array */ protected function parseAutoloadsType(array $packageMap, string $type, RootPackageInterface $rootPackage) { $autoloads = []; foreach ($packageMap as $item) { [$package, $installPath] = $item; // packages that are not installed cannot autoload anything if (null === $installPath) { continue; } $autoload = $package->getAutoload(); if ($this->devMode && $package === $rootPackage) { $autoload = \array_merge_recursive($autoload, $package->getDevAutoload()); } // skip misconfigured packages if (!isset($autoload[$type]) || !\is_array($autoload[$type])) { continue; } if (null !== $package->getTargetDir() && $package !== $rootPackage) { $installPath = \substr($installPath, 0, -\strlen('/' . $package->getTargetDir())); } foreach ($autoload[$type] as $namespace => $paths) { if (\in_array($type, ['psr-4', 'psr-0'], \true)) { // normalize namespaces to ensure "\" becomes "" and others do not have leading separators as they are not needed $namespace = \ltrim($namespace, '\\'); } foreach ((array) $paths as $path) { if (($type === 'files' || $type === 'classmap' || $type === 'exclude-from-classmap') && $package->getTargetDir() && !Filesystem::isReadable($installPath . '/' . $path)) { // remove target-dir from file paths of the root package if ($package === $rootPackage) { $targetDir = \str_replace('\\', '[\\\\/]', \preg_quote(\str_replace(['/', '\\'], '', $package->getTargetDir()))); $path = \ltrim(Preg::replace('{^' . $targetDir . '}', '', \ltrim($path, '\\/')), '\\/'); } else { // add target-dir from file paths that don't have it $path = $package->getTargetDir() . '/' . $path; } } if ($type === 'exclude-from-classmap') { // first escape user input $path = Preg::replace('{/+}', '/', \preg_quote(\trim(\strtr($path, '\\', '/'), '/'))); // add support for wildcards * and ** $path = \strtr($path, ['\\*\\*' => '.+?', '\\*' => '[^/]+?']); // add support for up-level relative paths $updir = null; $path = Preg::replaceCallback('{^((?:(?:\\\\\\.){1,2}+/)+)}', static function ($matches) use(&$updir) : string { // undo preg_quote for the matched string $updir = \str_replace('\\.', '.', $matches[1]); return ''; }, $path); if (empty($installPath)) { $installPath = \strtr(Platform::getCwd(), '\\', '/'); } $resolvedPath = \realpath($installPath . '/' . $updir); if (\false === $resolvedPath) { continue; } $autoloads[] = \preg_quote(\strtr($resolvedPath, '\\', '/')) . '/' . $path . '($|/)'; continue; } $relativePath = empty($installPath) ? empty($path) ? '.' : $path : $installPath . '/' . $path; if ($type === 'files') { $autoloads[$this->getFileIdentifier($package, $path)] = $relativePath; continue; } if ($type === 'classmap') { $autoloads[] = $relativePath; continue; } $autoloads[$namespace][] = $relativePath; } } } return $autoloads; } /** * @return string */ protected function getFileIdentifier(PackageInterface $package, string $path) { // TODO composer v3 change this to sha1 or xxh3? Possibly not worth the potential breakage though return \hash('md5', $package->getName() . ':' . $path); } /** * Filters out dev-dependencies * * @param array $packageMap * @return array */ protected function filterPackageMap(array $packageMap, RootPackageInterface $rootPackage) { $packages = []; $include = []; $replacedBy = []; foreach ($packageMap as $item) { $package = $item[0]; $name = $package->getName(); $packages[$name] = $package; foreach ($package->getReplaces() as $replace) { $replacedBy[$replace->getTarget()] = $name; } } $add = static function (PackageInterface $package) use(&$add, $packages, &$include, $replacedBy) : void { foreach ($package->getRequires() as $link) { $target = $link->getTarget(); if (isset($replacedBy[$target])) { $target = $replacedBy[$target]; } if (!isset($include[$target])) { $include[$target] = \true; if (isset($packages[$target])) { $add($packages[$target]); } } } }; $add($rootPackage); return \array_filter($packageMap, static function ($item) use($include) : bool { $package = $item[0]; foreach ($package->getNames() as $name) { if (isset($include[$name])) { return \true; } } return \false; }); } /** * Sorts packages by dependency weight * * Packages of equal weight are sorted alphabetically * * @param array $packageMap * @return array */ protected function sortPackageMap(array $packageMap) { $packages = []; $paths = []; foreach ($packageMap as $item) { [$package, $path] = $item; $name = $package->getName(); $packages[$name] = $package; $paths[$name] = $path; } $sortedPackages = PackageSorter::sortPackages($packages); $sortedPackageMap = []; foreach ($sortedPackages as $package) { $name = $package->getName(); $sortedPackageMap[] = [$packages[$name], $paths[$name]]; } return $sortedPackageMap; } } function composerRequire(string $fileIdentifier, string $file) : void { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = \true; require $file; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var \Closure(string):void */ private static $includeFile; /** @var string|null */ private $vendorDir; // PSR-4 /** * @var array> */ private $prefixLengthsPsr4 = array(); /** * @var array> */ private $prefixDirsPsr4 = array(); /** * @var list */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * List of PSR-0 prefixes * * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) * * @var array>> */ private $prefixesPsr0 = array(); /** * @var list */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = \false; /** * @var array */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = \false; /** * @var array */ private $missingClasses = array(); /** @var string|null */ private $apcuPrefix; /** * @var array */ private static $registeredLoaders = array(); /** * @param string|null $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; self::initializeIncludeClosure(); } /** * @return array> */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return \call_user_func_array('array_merge', \array_values($this->prefixesPsr0)); } return array(); } /** * @return array> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return list */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return list */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return array Array of classname => path */ public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = \array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param list|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = \false) { $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = \array_merge($paths, $this->fallbackDirsPsr0); } else { $this->fallbackDirsPsr0 = \array_merge($this->fallbackDirsPsr0, $paths); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = \array_merge($paths, $this->prefixesPsr0[$first][$prefix]); } else { $this->prefixesPsr0[$first][$prefix] = \array_merge($this->prefixesPsr0[$first][$prefix], $paths); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param list|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = \false) { $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = \array_merge($paths, $this->fallbackDirsPsr4); } else { $this->fallbackDirsPsr4 = \array_merge($this->fallbackDirsPsr4, $paths); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = \strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = \array_merge($paths, $this->prefixDirsPsr4[$prefix]); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = \array_merge($this->prefixDirsPsr4[$prefix], $paths); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param list|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param list|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = \strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = \function_exists('apcu_fetch') && \filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = \false) { \spl_autoload_register(array($this, 'loadClass'), \true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { \spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { $includeFile = self::$includeFile; $includeFile($file); return \true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return \false; } if (null !== $this->apcuPrefix) { $file = \apcu_fetch($this->apcuPrefix . $class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (\false === $file && \defined('_ContaoManager\\HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { \apcu_add($this->apcuPrefix . $class, $file); } if (\false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = \true; } return $file; } /** * Returns the currently registered loaders keyed by their corresponding vendor directories. * * @return array */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = \strtr($class, '\\', \DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (\false !== ($lastPos = \strrpos($subPath, '\\'))) { $subPath = \substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = \DIRECTORY_SEPARATOR . \substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (\file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (\file_exists($file = $dir . \DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (\false !== ($pos = \strrpos($class, '\\'))) { // namespaced class name $logicalPathPsr0 = \substr($logicalPathPsr4, 0, $pos + 1) . \strtr(\substr($logicalPathPsr4, $pos + 1), '_', \DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = \strtr($class, '_', \DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === \strpos($class, $prefix)) { foreach ($dirs as $dir) { if (\file_exists($file = $dir . \DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (\file_exists($file = $dir . \DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && ($file = \stream_resolve_include_path($logicalPathPsr0))) { return $file; } return \false; } /** * @return void */ private static function initializeIncludeClosure() { if (self::$includeFile !== null) { return; } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void */ self::$includeFile = \Closure::bind(static function ($file) { include $file; }, null, null); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /* * This file is copied from the Symfony package. * * (c) Fabien Potencier */ namespace Composer\Autoload; use Composer\ClassMapGenerator\FileList; use Composer\IO\IOInterface; /** * ClassMapGenerator * * @author Gyula Sallai * @author Jordi Boggiano * * @deprecated Since Composer 2.4.0 use the composer/class-map-generator package instead */ class ClassMapGenerator { /** * Generate a class map file * * @param \Traversable|array $dirs Directories or a single path to search in * @param string $file The name of the class map file */ public static function dump(iterable $dirs, string $file) : void { $maps = []; foreach ($dirs as $dir) { $maps = \array_merge($maps, static::createMap($dir)); } \file_put_contents($file, \sprintf('|string|array<\SplFileInfo> $path The path to search in or an iterator * @param non-empty-string|null $excluded Regex that matches file paths to be excluded from the classmap * @param ?IOInterface $io IO object * @param null|string $namespace Optional namespace prefix to filter by * @param null|'psr-0'|'psr-4'|'classmap' $autoloadType psr-0|psr-4 Optional autoload standard to use mapping rules * @param array $scannedFiles * @return array A class map array * @throws \RuntimeException When the path is neither an existing file nor directory */ public static function createMap($path, ?string $excluded = null, ?IOInterface $io = null, ?string $namespace = null, ?string $autoloadType = null, array &$scannedFiles = []) : array { $generator = new \Composer\ClassMapGenerator\ClassMapGenerator(['php', 'inc', 'hh']); $fileList = new FileList(); $fileList->files = $scannedFiles; $generator->avoidDuplicateScans($fileList); $generator->scanPaths($path, $excluded, $autoloadType ?? 'classmap', $namespace); $classMap = $generator->getClassMap(); $scannedFiles = $fileList->files; if ($io !== null) { foreach ($classMap->getPsrViolations() as $msg) { $io->writeError("{$msg}"); } foreach ($classMap->getAmbiguousClasses() as $class => $paths) { if (\count($paths) > 1) { $io->writeError('Warning: Ambiguous class resolution, "' . $class . '"' . ' was found ' . (\count($paths) + 1) . 'x: in "' . $classMap->getClassPath($class) . '" and "' . \implode('", "', $paths) . '", the first will be used.'); } else { $io->writeError('Warning: Ambiguous class resolution, "' . $class . '"' . ' was found in both "' . $classMap->getClassPath($class) . '" and "' . \implode('", "', $paths) . '", the first will be used.'); } } } return $classMap->getMap(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Repository\PlatformRepository; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Installer\SuggestedPackagesReporter; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; class SuggestsCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; protected function configure() : void { $this->setName('suggests')->setDescription('Shows package suggestions')->setDefinition([new InputOption('by-package', null, InputOption::VALUE_NONE, 'Groups output by suggesting package (default)'), new InputOption('by-suggestion', null, InputOption::VALUE_NONE, 'Groups output by suggested package'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show suggestions from all dependencies, including transitive ones'), new InputOption('list', null, InputOption::VALUE_NONE, 'Show only list of suggested package names'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Exclude suggestions from require-dev packages'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that you want to list suggestions from.', null, $this->suggestInstalledPackage())])->setHelp(<<%command.name% command shows a sorted list of suggested packages. Read more at https://getcomposer.org/doc/03-cli.md#suggests EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); $installedRepos = [new RootPackageRepository(clone $composer->getPackage())]; $locker = $composer->getLocker(); if ($locker->isLocked()) { $installedRepos[] = new PlatformRepository([], $locker->getPlatformOverrides()); $installedRepos[] = $locker->getLockedRepository(!$input->getOption('no-dev')); } else { $installedRepos[] = new PlatformRepository([], $composer->getConfig()->get('platform')); $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); } $installedRepo = new InstalledRepository($installedRepos); $reporter = new SuggestedPackagesReporter($this->getIO()); $filter = $input->getArgument('packages'); $packages = $installedRepo->getPackages(); $packages[] = $composer->getPackage(); foreach ($packages as $package) { if (!empty($filter) && !\in_array($package->getName(), $filter)) { continue; } $reporter->addSuggestionsFromPackage($package); } // Determine output mode, default is by-package $mode = SuggestedPackagesReporter::MODE_BY_PACKAGE; // if by-suggestion is given we override the default if ($input->getOption('by-suggestion')) { $mode = SuggestedPackagesReporter::MODE_BY_SUGGESTION; } // unless by-package is also present then we enable both if ($input->getOption('by-package')) { $mode |= SuggestedPackagesReporter::MODE_BY_PACKAGE; } // list is exclusive and overrides everything else if ($input->getOption('list')) { $mode = SuggestedPackagesReporter::MODE_LIST; } $reporter->output($mode, $installedRepo, empty($filter) && !$input->getOption('all') ? $composer->getPackage() : null); return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\Json\JsonFile; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; /** * @author Robert Schönthal */ class SearchCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('search')->setDescription('Searches for packages')->setDefinition([new InputOption('only-name', 'N', InputOption::VALUE_NONE, 'Search only in package names'), new InputOption('only-vendor', 'O', InputOption::VALUE_NONE, 'Search only for vendor / organization names, returns only "vendor" as result'), new InputOption('type', 't', InputOption::VALUE_REQUIRED, 'Search for a specific package type'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputArgument('tokens', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'tokens to search for')])->setHelp(<<php composer.phar search symfony composer Read more at https://getcomposer.org/doc/03-cli.md#search EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { // init repos $platformRepo = new PlatformRepository(); $io = $this->getIO(); $format = $input->getOption('format'); if (!\in_array($format, ['text', 'json'])) { $io->writeError(\sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; } if (!($composer = $this->tryComposer())) { $composer = $this->createComposerInstance($input, $this->getIO(), []); } $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $installedRepo = new CompositeRepository([$localRepo, $platformRepo]); $repos = new CompositeRepository(\array_merge([$installedRepo], $composer->getRepositoryManager()->getRepositories())); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'search', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $mode = RepositoryInterface::SEARCH_FULLTEXT; if ($input->getOption('only-name') === \true) { if ($input->getOption('only-vendor') === \true) { throw new \InvalidArgumentException('--only-name and --only-vendor cannot be used together'); } $mode = RepositoryInterface::SEARCH_NAME; } elseif ($input->getOption('only-vendor') === \true) { $mode = RepositoryInterface::SEARCH_VENDOR; } $type = $input->getOption('type'); $query = \implode(' ', $input->getArgument('tokens')); if ($mode !== RepositoryInterface::SEARCH_FULLTEXT) { $query = \preg_quote($query); } $results = $repos->search($query, $mode, $type); if (\count($results) > 0 && $format === 'text') { $width = $this->getTerminalWidth(); $nameLength = 0; foreach ($results as $result) { $nameLength = \max(\strlen($result['name']), $nameLength); } $nameLength += 1; foreach ($results as $result) { $description = $result['description'] ?? ''; $warning = !empty($result['abandoned']) ? '! Abandoned ! ' : ''; $remaining = $width - $nameLength - \strlen($warning) - 2; if (\strlen($description) > $remaining) { $description = \substr($description, 0, $remaining - 3) . '...'; } $link = $result['url'] ?? null; if ($link !== null) { $io->write('' . $result['name'] . '' . \str_repeat(' ', $nameLength - \strlen($result['name'])) . $warning . $description); } else { $io->write(\str_pad($result['name'], $nameLength, ' ') . $warning . $description); } } } elseif ($format === 'json') { $io->write(JsonFile::encode($results)); } return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\IO\IOInterface; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\Locker; use Composer\Package\Version\VersionBumper; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Factory; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; use Composer\Repository\PlatformRepository; use Composer\Util\Silencer; /** * @author Jordi Boggiano */ final class BumpCommand extends \Composer\Command\BaseCommand { private const ERROR_GENERIC = 1; private const ERROR_LOCK_OUTDATED = 2; use \Composer\Command\CompletionTrait; protected function configure() : void { $this->setName('bump')->setDescription('Increases the lower limit of your composer.json requirements to the currently installed versions')->setDefinition([new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name(s) to restrict which packages are bumped.', null, $this->suggestRootRequirement()), new InputOption('dev-only', 'D', InputOption::VALUE_NONE, 'Only bump requirements in "require-dev".'), new InputOption('no-dev-only', 'R', InputOption::VALUE_NONE, 'Only bump requirements in "require".'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the packages to bump, but will not execute anything.')])->setHelp(<<bump command increases the lower limit of your composer.json requirements to the currently installed versions. This helps to ensure your dependencies do not accidentally get downgraded due to some other conflict, and can slightly improve dependency resolution performance as it limits the amount of package versions Composer has to look at. Running this blindly on libraries is **NOT** recommended as it will narrow down your allowed dependencies, which may cause dependency hell for your users. Running it with --dev-only on libraries may be fine however as dev requirements are local to the library and do not affect consumers of the package. EOT ); } /** * @throws \Seld\JsonLint\ParsingException */ protected function execute(InputInterface $input, OutputInterface $output) : int { return $this->doBump($this->getIO(), $input->getOption('dev-only'), $input->getOption('no-dev-only'), $input->getOption('dry-run'), $input->getArgument('packages')); } /** * @param string[] $packagesFilter * @throws \Seld\JsonLint\ParsingException */ public function doBump(IOInterface $io, bool $devOnly, bool $noDevOnly, bool $dryRun, array $packagesFilter) : int { /** @readonly */ $composerJsonPath = Factory::getComposerFile(); if (!Filesystem::isReadable($composerJsonPath)) { $io->writeError('' . $composerJsonPath . ' is not readable.'); return self::ERROR_GENERIC; } $composerJson = new JsonFile($composerJsonPath); $contents = \file_get_contents($composerJson->getPath()); if (\false === $contents) { $io->writeError('' . $composerJsonPath . ' is not readable.'); return self::ERROR_GENERIC; } // check for writability by writing to the file as is_writable can not be trusted on network-mounts // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 if (!\is_writable($composerJsonPath) && \false === Silencer::call('file_put_contents', $composerJsonPath, $contents)) { $io->writeError('' . $composerJsonPath . ' is not writable.'); return self::ERROR_GENERIC; } unset($contents); $composer = $this->requireComposer(); if ($composer->getLocker()->isLocked()) { if (!$composer->getLocker()->isFresh()) { $io->writeError('The lock file is not up to date with the latest changes in composer.json. Run the appropriate `update` to fix that before you use the `bump` command.'); return self::ERROR_LOCK_OUTDATED; } $repo = $composer->getLocker()->getLockedRepository(\true); } else { $repo = $composer->getRepositoryManager()->getLocalRepository(); } if ($composer->getPackage()->getType() !== 'project' && !$devOnly) { $io->writeError('Warning: Bumping dependency constraints is not recommended for libraries as it will narrow down your dependencies and may cause problems for your users.'); $contents = $composerJson->read(); if (!isset($contents['type'])) { $io->writeError('If your package is not a library, you can explicitly specify the "type" by using "composer config type project".'); $io->writeError('Alternatively you can use --dev-only to only bump dependencies within "require-dev".'); } unset($contents); } $bumper = new VersionBumper(); $tasks = []; if (!$devOnly) { $tasks['require'] = $composer->getPackage()->getRequires(); } if (!$noDevOnly) { $tasks['require-dev'] = $composer->getPackage()->getDevRequires(); } if (\count($packagesFilter) > 0) { // support proxied args from the update command that contain constraints together with the package names $packagesFilter = \array_map(function ($constraint) { return Preg::replace('{[:= ].+}', '', $constraint); }, $packagesFilter); $pattern = BasePackage::packageNamesToRegexp(\array_unique(\array_map('strtolower', $packagesFilter))); foreach ($tasks as $key => $reqs) { foreach ($reqs as $pkgName => $link) { if (!Preg::isMatch($pattern, $pkgName)) { unset($tasks[$key][$pkgName]); } } } } $updates = []; foreach ($tasks as $key => $reqs) { foreach ($reqs as $pkgName => $link) { if (PlatformRepository::isPlatformPackage($pkgName)) { continue; } $currentConstraint = $link->getPrettyConstraint(); $package = $repo->findPackage($pkgName, '*'); // name must be provided or replaced if (null === $package) { continue; } while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $bumped = $bumper->bumpRequirement($link->getConstraint(), $package); if ($bumped === $currentConstraint) { continue; } $updates[$key][$pkgName] = $bumped; } } if (!$dryRun && !$this->updateFileCleanly($composerJson, $updates)) { $composerDefinition = $composerJson->read(); foreach ($updates as $key => $packages) { foreach ($packages as $package => $version) { $composerDefinition[$key][$package] = $version; } } $composerJson->write($composerDefinition); } $changeCount = \array_sum(\array_map('count', $updates)); if ($changeCount > 0) { if ($dryRun) { $io->write('' . $composerJsonPath . ' would be updated with:'); foreach ($updates as $requireType => $packages) { foreach ($packages as $package => $version) { $io->write(\sprintf(' - %s.%s: %s', $requireType, $package, $version)); } } } else { $io->write('' . $composerJsonPath . ' has been updated (' . $changeCount . ' changes).'); } } else { $io->write('No requirements to update in ' . $composerJsonPath . '.'); } if (!$dryRun && $composer->getLocker()->isLocked() && $composer->getConfig()->get('lock') && $changeCount > 0) { $composer->getLocker()->updateHash($composerJson); } if ($dryRun && $changeCount > 0) { return self::ERROR_GENERIC; } return 0; } /** * @param array<'require'|'require-dev', array> $updates */ private function updateFileCleanly(JsonFile $json, array $updates) : bool { $contents = \file_get_contents($json->getPath()); if (\false === $contents) { throw new \RuntimeException('Unable to read ' . $json->getPath() . ' contents.'); } $manipulator = new JsonManipulator($contents); foreach ($updates as $key => $packages) { foreach ($packages as $package => $version) { if (!$manipulator->addLink($key, $package, $version)) { return \false; } } } if (\false === \file_put_contents($json->getPath(), $manipulator->getContents())) { throw new \RuntimeException('Unable to write new ' . $json->getPath() . ' contents.'); } return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\Composer; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; use Composer\Pcre\Preg; use Composer\Repository\CompositeRepository; use Composer\Repository\RepositoryFactory; use Composer\Repository\RepositorySet; use Composer\Script\ScriptEvents; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\Filesystem; use Composer\Util\Loop; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * Creates an archive of a package for distribution. * * @author Nils Adermann */ class ArchiveCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; private const FORMATS = ['tar', 'tar.gz', 'tar.bz2', 'zip']; protected function configure() : void { $this->setName('archive')->setDescription('Creates an archive of this composer package')->setDefinition([new InputArgument('package', InputArgument::OPTIONAL, 'The package to archive instead of the current project', null, $this->suggestAvailablePackage()), new InputArgument('version', InputArgument::OPTIONAL, 'A version constraint to find the package to archive'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the resulting archive: tar, tar.gz, tar.bz2 or zip (default tar)', null, self::FORMATS), new InputOption('dir', null, InputOption::VALUE_REQUIRED, 'Write the archive to this directory'), new InputOption('file', null, InputOption::VALUE_REQUIRED, 'Write the archive with the given file name.' . ' Note that the format will be appended.'), new InputOption('ignore-filters', null, InputOption::VALUE_NONE, 'Ignore filters when saving package')])->setHelp(<<archive command creates an archive of the specified format containing the files and directories of the Composer project or the specified package in the specified version and writes it to the specified directory. php composer.phar archive [--format=zip] [--dir=/foo] [--file=filename] [package [version]] Read more at https://getcomposer.org/doc/03-cli.md#archive EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->tryComposer(); $config = null; if ($composer) { $config = $composer->getConfig(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'archive', $input, $output); $eventDispatcher = $composer->getEventDispatcher(); $eventDispatcher->dispatch($commandEvent->getName(), $commandEvent); $eventDispatcher->dispatchScript(ScriptEvents::PRE_ARCHIVE_CMD); } if (!$config) { $config = Factory::createConfig(); } $format = $input->getOption('format') ?? $config->get('archive-format'); $dir = $input->getOption('dir') ?? $config->get('archive-dir'); $returnCode = $this->archive($this->getIO(), $config, $input->getArgument('package'), $input->getArgument('version'), $format, $dir, $input->getOption('file'), $input->getOption('ignore-filters'), $composer); if (0 === $returnCode && $composer) { $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_ARCHIVE_CMD); } return $returnCode; } /** * @throws \Exception */ protected function archive(IOInterface $io, Config $config, ?string $packageName, ?string $version, string $format, string $dest, ?string $fileName, bool $ignoreFilters, ?Composer $composer) : int { if ($composer) { $archiveManager = $composer->getArchiveManager(); } else { $factory = new Factory(); $process = new ProcessExecutor(); $httpDownloader = Factory::createHttpDownloader($io, $config); $downloadManager = $factory->createDownloadManager($io, $config, $httpDownloader, $process); $archiveManager = $factory->createArchiveManager($config, $downloadManager, new Loop($httpDownloader, $process)); } if ($packageName) { $package = $this->selectPackage($io, $packageName, $version); if (!$package) { return 1; } } else { $package = $this->requireComposer()->getPackage(); } $io->writeError('Creating the archive into "' . $dest . '".'); $packagePath = $archiveManager->archive($package, $format, $dest, $fileName, $ignoreFilters); $fs = new Filesystem(); $shortPath = $fs->findShortestPath(Platform::getCwd(), $packagePath, \true); $io->writeError('Created: ', \false); $io->write(\strlen($shortPath) < \strlen($packagePath) ? $shortPath : $packagePath); return 0; } /** * @return (BasePackage&CompletePackageInterface)|false */ protected function selectPackage(IOInterface $io, string $packageName, ?string $version = null) { $io->writeError('Searching for the specified package.'); if ($composer = $this->tryComposer()) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $repo = new CompositeRepository(\array_merge([$localRepo], $composer->getRepositoryManager()->getRepositories())); $minStability = $composer->getPackage()->getMinimumStability(); } else { $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $io->writeError('No composer.json found in the current directory, searching packages from ' . \implode(', ', \array_keys($defaultRepos))); $repo = new CompositeRepository($defaultRepos); $minStability = 'stable'; } if ($version !== null && Preg::isMatchStrictGroups('{@(stable|RC|beta|alpha|dev)$}i', $version, $match)) { $minStability = VersionParser::normalizeStability($match[1]); $version = (string) \substr($version, 0, -\strlen($match[0])); } $repoSet = new RepositorySet($minStability); $repoSet->addRepository($repo); $parser = new VersionParser(); $constraint = $version !== null ? $parser->parseConstraints($version) : null; $packages = $repoSet->findPackages(\strtolower($packageName), $constraint); if (\count($packages) > 1) { $versionSelector = new VersionSelector($repoSet); $package = $versionSelector->findBestCandidate(\strtolower($packageName), $version, $minStability); if ($package === \false) { $package = \reset($packages); } $io->writeError('Found multiple matches, selected ' . $package->getPrettyString() . '.'); $io->writeError('Alternatives were ' . \implode(', ', \array_map(static function ($p) : string { return $p->getPrettyString(); }, $packages)) . '.'); $io->writeError('Please use a more specific constraint to pick a different package.'); } elseif (\count($packages) === 1) { $package = \reset($packages); $io->writeError('Found an exact match ' . $package->getPrettyString() . '.'); } else { $io->writeError('Could not find a package matching ' . $packageName . '.'); return \false; } if (!$package instanceof CompletePackageInterface) { throw new \LogicException('Expected a CompletePackageInterface instance but found ' . \get_class($package)); } if (!$package instanceof BasePackage) { throw new \LogicException('Expected a BasePackage instance but found ' . \get_class($package)); } return $package; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Repository\RepositorySet; use Composer\Repository\RepositoryUtils; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepository; use Composer\Advisory\Auditor; use Composer\Console\Input\InputOption; class AuditCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('audit')->setDescription('Checks for security vulnerability advisories for installed packages')->setDefinition([new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables auditing of require-dev packages.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_TABLE, Auditor::FORMATS), new InputOption('locked', null, InputOption::VALUE_NONE, 'Audit based on the lock file instead of the installed packages.'), new InputOption('abandoned', null, InputOption::VALUE_REQUIRED, 'Behavior on abandoned packages. Must be "ignore", "report", or "fail".', null, Auditor::ABANDONEDS), new InputOption('ignore-severity', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Ignore advisories of a certain severity level.', [], ['low', 'medium', 'high', 'critical'])])->setHelp(<<audit command checks for security vulnerability advisories for installed packages. If you do not want to include dev dependencies in the audit you can omit them with --no-dev Read more at https://getcomposer.org/doc/03-cli.md#audit EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); $packages = $this->getPackages($composer, $input); if (\count($packages) === 0) { $this->getIO()->writeError('No packages - skipping audit.'); return 0; } $auditor = new Auditor(); $repoSet = new RepositorySet(); foreach ($composer->getRepositoryManager()->getRepositories() as $repo) { $repoSet->addRepository($repo); } $auditConfig = $composer->getConfig()->get('audit'); $abandoned = $input->getOption('abandoned'); if ($abandoned !== null && !\in_array($abandoned, Auditor::ABANDONEDS, \true)) { throw new \InvalidArgumentException('--audit must be one of ' . \implode(', ', Auditor::ABANDONEDS) . '.'); } $abandoned = $abandoned ?? $auditConfig['abandoned'] ?? Auditor::ABANDONED_FAIL; $ignoreSeverities = $input->getOption('ignore-severity') ?? []; return \min(255, $auditor->audit($this->getIO(), $repoSet, $packages, $this->getAuditFormat($input, 'format'), \false, $auditConfig['ignore'] ?? [], $abandoned, $ignoreSeverities)); } /** * @return PackageInterface[] */ private function getPackages(Composer $composer, InputInterface $input) : array { if ($input->getOption('locked')) { if (!$composer->getLocker()->isLocked()) { throw new \UnexpectedValueException('Valid composer.json and composer.lock files are required to run this command with --locked'); } $locker = $composer->getLocker(); return $locker->getLockedRepository(!$input->getOption('no-dev'))->getPackages(); } $rootPkg = $composer->getPackage(); $installedRepo = new InstalledRepository([$composer->getRepositoryManager()->getLocalRepository()]); if ($input->getOption('no-dev')) { return RepositoryUtils::filterRequiredPackages($installedRepo->getPackages(), $rootPkg); } return $installedRepo->getPackages(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; use Composer\Util\ConfigValidator; use Composer\Util\Filesystem; use _ContaoManager\Symfony\Component\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * ValidateCommand * * @author Robert Schönthal * @author Jordi Boggiano */ class ValidateCommand extends \Composer\Command\BaseCommand { /** * configure */ protected function configure() : void { $this->setName('validate')->setDescription('Validates a composer.json and composer.lock')->setDefinition([new InputOption('no-check-all', null, InputOption::VALUE_NONE, 'Do not validate requires for overly strict/loose constraints'), new InputOption('check-lock', null, InputOption::VALUE_NONE, 'Check if lock file is up to date (even when config.lock is false)'), new InputOption('no-check-lock', null, InputOption::VALUE_NONE, 'Do not check if lock file is up to date'), new InputOption('no-check-publish', null, InputOption::VALUE_NONE, 'Do not check for publish errors'), new InputOption('no-check-version', null, InputOption::VALUE_NONE, 'Do not report a warning if the version field is present'), new InputOption('with-dependencies', 'A', InputOption::VALUE_NONE, 'Also validate the composer.json of all installed dependencies'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code for warnings as well as errors'), new InputArgument('file', InputArgument::OPTIONAL, 'path to composer.json file')])->setHelp(<<getArgument('file') ?? Factory::getComposerFile(); $io = $this->getIO(); if (!\file_exists($file)) { $io->writeError('' . $file . ' not found.'); return 3; } if (!Filesystem::isReadable($file)) { $io->writeError('' . $file . ' is not readable.'); return 3; } $validator = new ConfigValidator($io); $checkAll = $input->getOption('no-check-all') ? 0 : ValidatingArrayLoader::CHECK_ALL; $checkPublish = !$input->getOption('no-check-publish'); $checkLock = !$input->getOption('no-check-lock'); $checkVersion = $input->getOption('no-check-version') ? 0 : ConfigValidator::CHECK_VERSION; $isStrict = $input->getOption('strict'); [$errors, $publishErrors, $warnings] = $validator->validate($file, $checkAll, $checkVersion); $lockErrors = []; $composer = $this->createComposerInstance($input, $io, $file); // config.lock = false ~= implicit --no-check-lock; --check-lock overrides $checkLock = $checkLock && $composer->getConfig()->get('lock') || $input->getOption('check-lock'); $locker = $composer->getLocker(); if ($locker->isLocked() && !$locker->isFresh()) { $lockErrors[] = '- The lock file is not up to date with the latest changes in composer.json, it is recommended that you run `composer update` or `composer update `.'; } if ($locker->isLocked()) { $lockErrors = \array_merge($lockErrors, $locker->getMissingRequirementInfo($composer->getPackage(), \true)); } $this->outputResult($io, $file, $errors, $warnings, $checkPublish, $publishErrors, $checkLock, $lockErrors, \true); // $errors include publish and lock errors when exists $exitCode = \count($errors) > 0 ? 2 : ($isStrict && \count($warnings) > 0 ? 1 : 0); if ($input->getOption('with-dependencies')) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); foreach ($localRepo->getPackages() as $package) { $path = $composer->getInstallationManager()->getInstallPath($package); if (null === $path) { continue; } $file = $path . '/composer.json'; if (\is_dir($path) && \file_exists($file)) { [$errors, $publishErrors, $warnings] = $validator->validate($file, $checkAll, $checkVersion); $this->outputResult($io, $package->getPrettyName(), $errors, $warnings, $checkPublish, $publishErrors); // $errors include publish errors when exists $depCode = \count($errors) > 0 ? 2 : ($isStrict && \count($warnings) > 0 ? 1 : 0); $exitCode = \max($depCode, $exitCode); } } } $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'validate', $input, $output); $eventCode = $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); return \max($eventCode, $exitCode); } /** * @param string[] $errors * @param string[] $warnings * @param string[] $publishErrors * @param string[] $lockErrors */ private function outputResult(IOInterface $io, string $name, array &$errors, array &$warnings, bool $checkPublish = \false, array $publishErrors = [], bool $checkLock = \false, array $lockErrors = [], bool $printSchemaUrl = \false) : void { $doPrintSchemaUrl = \false; if (\count($errors) > 0) { $io->writeError('' . $name . ' is invalid, the following errors/warnings were found:'); } elseif (\count($publishErrors) > 0 && $checkPublish) { $io->writeError('' . $name . ' is valid for simple usage with Composer but has'); $io->writeError('strict errors that make it unable to be published as a package'); $doPrintSchemaUrl = $printSchemaUrl; } elseif (\count($warnings) > 0) { $io->writeError('' . $name . ' is valid, but with a few warnings'); $doPrintSchemaUrl = $printSchemaUrl; } elseif (\count($lockErrors) > 0) { $io->write('' . $name . ' is valid but your composer.lock has some ' . ($checkLock ? 'errors' : 'warnings') . ''); } else { $io->write('' . $name . ' is valid'); } if ($doPrintSchemaUrl) { $io->writeError('See https://getcomposer.org/doc/04-schema.md for details on the schema'); } if (\count($errors) > 0) { $errors = \array_map(static function ($err) : string { return '- ' . $err; }, $errors); \array_unshift($errors, '# General errors'); } if (\count($warnings) > 0) { $warnings = \array_map(static function ($err) : string { return '- ' . $err; }, $warnings); \array_unshift($warnings, '# General warnings'); } // Avoid setting the exit code to 1 in case --strict and --no-check-publish/--no-check-lock are combined $extraWarnings = []; // If checking publish errors, display them as errors, otherwise just show them as warnings if (\count($publishErrors) > 0 && $checkPublish) { $publishErrors = \array_map(static function ($err) : string { return '- ' . $err; }, $publishErrors); \array_unshift($publishErrors, '# Publish errors'); $errors = \array_merge($errors, $publishErrors); } // If checking lock errors, display them as errors, otherwise just show them as warnings if (\count($lockErrors) > 0) { if ($checkLock) { \array_unshift($lockErrors, '# Lock file errors'); $errors = \array_merge($errors, $lockErrors); } else { \array_unshift($lockErrors, '# Lock file warnings'); $extraWarnings = \array_merge($extraWarnings, $lockErrors); } } $messages = ['error' => $errors, 'warning' => \array_merge($warnings, $extraWarnings)]; foreach ($messages as $style => $msgs) { foreach ($msgs as $msg) { if (\strpos($msg, '#') === 0) { $io->writeError('<' . $style . '>' . $msg . ''); } else { $io->writeError($msg); } } } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Json\JsonFile; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; use Composer\Pcre\Preg; use Composer\Repository\CompositeRepository; use Composer\Semver\Constraint\MatchAllConstraint; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Nicolas Grekas * @author Jordi Boggiano */ class FundCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('fund')->setDescription('Discover how to help fund the maintenance of your dependencies')->setDefinition([new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['text', 'json'])]); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); $repo = $composer->getRepositoryManager()->getLocalRepository(); $remoteRepos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $fundings = []; $packagesToLoad = []; foreach ($repo->getPackages() as $package) { if ($package instanceof AliasPackage) { continue; } $packagesToLoad[$package->getName()] = new MatchAllConstraint(); } // load all packages dev versions in parallel $result = $remoteRepos->loadPackages($packagesToLoad, ['dev' => BasePackage::STABILITY_DEV], []); // collect funding data from default branches foreach ($result['packages'] as $package) { if (!$package instanceof AliasPackage && $package instanceof CompletePackageInterface && $package->isDefaultBranch() && $package->getFunding() && isset($packagesToLoad[$package->getName()])) { $fundings = $this->insertFundingData($fundings, $package); unset($packagesToLoad[$package->getName()]); } } // collect funding from installed packages if none was found in the default branch above foreach ($repo->getPackages() as $package) { if ($package instanceof AliasPackage || !isset($packagesToLoad[$package->getName()])) { continue; } if ($package instanceof CompletePackageInterface && $package->getFunding()) { $fundings = $this->insertFundingData($fundings, $package); } } \ksort($fundings); $io = $this->getIO(); $format = $input->getOption('format'); if (!\in_array($format, ['text', 'json'])) { $io->writeError(\sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; } if ($fundings && $format === 'text') { $prev = null; $io->write('The following packages were found in your dependencies which publish funding information:'); foreach ($fundings as $vendor => $links) { $io->write(''); $io->write(\sprintf("%s", $vendor)); foreach ($links as $url => $packages) { $line = \sprintf(' %s', \implode(', ', $packages)); if ($prev !== $line) { $io->write($line); $prev = $line; } $io->write(\sprintf(' %s', OutputFormatter::escape($url), $url)); } } $io->write(""); $io->write("Please consider following these links and sponsoring the work of package authors!"); $io->write("Thank you!"); } elseif ($format === 'json') { $io->write(JsonFile::encode($fundings)); } else { $io->write("No funding links were found in your package dependencies. This doesn't mean they don't need your support!"); } return 0; } /** * @param mixed[] $fundings * @return mixed[] */ private function insertFundingData(array $fundings, CompletePackageInterface $package) : array { foreach ($package->getFunding() as $fundingOption) { [$vendor, $packageName] = \explode('/', $package->getPrettyName()); // ignore malformed funding entries if (empty($fundingOption['url'])) { continue; } $url = $fundingOption['url']; if (!empty($fundingOption['type']) && $fundingOption['type'] === 'github' && Preg::isMatch('{^https://github.com/([^/]+)$}', $url, $match)) { $url = 'https://github.com/sponsors/' . $match[1]; } $fundings[$vendor][$url][] = $packageName; } return $fundings; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; use Composer\Pcre\Preg; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Repository\RepositorySet; use Composer\Semver\Constraint\Constraint; use Composer\Util\Filesystem; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @internal */ trait PackageDiscoveryTrait { /** @var ?CompositeRepository */ private $repos; /** @var RepositorySet[] */ private $repositorySets; protected function getRepos() : CompositeRepository { if (null === $this->repos) { $this->repos = new CompositeRepository(\array_merge([new PlatformRepository()], RepositoryFactory::defaultReposWithDefaultManager($this->getIO()))); } return $this->repos; } /** * @param key-of|null $minimumStability */ private function getRepositorySet(InputInterface $input, ?string $minimumStability = null) : RepositorySet { $key = $minimumStability ?? 'default'; if (!isset($this->repositorySets[$key])) { $this->repositorySets[$key] = $repositorySet = new RepositorySet($minimumStability ?? $this->getMinimumStability($input)); $repositorySet->addRepository($this->getRepos()); } return $this->repositorySets[$key]; } /** * @return key-of */ private function getMinimumStability(InputInterface $input) : string { if ($input->hasOption('stability')) { // @phpstan-ignore-line as InitCommand does have this option but not all classes using this trait do return VersionParser::normalizeStability($input->getOption('stability') ?? 'stable'); } // @phpstan-ignore-next-line as RequireCommand does not have the option above so this code is reachable there $file = Factory::getComposerFile(); if (\is_file($file) && Filesystem::isReadable($file) && \is_array($composer = \json_decode((string) \file_get_contents($file), \true))) { if (isset($composer['minimum-stability'])) { return VersionParser::normalizeStability($composer['minimum-stability']); } } return 'stable'; } /** * @param array $requires * * @return array * @throws \Exception */ protected final function determineRequirements(InputInterface $input, OutputInterface $output, array $requires = [], ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $useBestVersionConstraint = \true, bool $fixed = \false) : array { if (\count($requires) > 0) { $requires = $this->normalizeRequirements($requires); $result = []; $io = $this->getIO(); foreach ($requires as $requirement) { if (isset($requirement['version']) && Preg::isMatch('{^\\d+(\\.\\d+)?$}', $requirement['version'])) { $io->writeError('The "' . $requirement['version'] . '" constraint for "' . $requirement['name'] . '" appears too strict and will likely not match what you want. See https://getcomposer.org/constraints'); } if (!isset($requirement['version'])) { // determine the best version automatically [$name, $version] = $this->findBestVersionAndNameForPackage($this->getIO(), $input, $requirement['name'], $platformRepo, $preferredStability, $fixed); // replace package name from packagist.org $requirement['name'] = $name; if ($useBestVersionConstraint) { $requirement['version'] = $version; $io->writeError(\sprintf('Using version %s for %s', $requirement['version'], $requirement['name'])); } else { $requirement['version'] = 'guess'; } } $result[] = $requirement['name'] . ' ' . $requirement['version']; } return $result; } $versionParser = new VersionParser(); // Collect existing packages $composer = $this->tryComposer(); $installedRepo = null; if (null !== $composer) { $installedRepo = $composer->getRepositoryManager()->getLocalRepository(); } $existingPackages = []; if (null !== $installedRepo) { foreach ($installedRepo->getPackages() as $package) { $existingPackages[] = $package->getName(); } } unset($composer, $installedRepo); $io = $this->getIO(); while (null !== ($package = $io->ask('Search for a package: '))) { $matches = $this->getRepos()->search($package); if (\count($matches) > 0) { // Remove existing packages from search results. foreach ($matches as $position => $foundPackage) { if (\in_array($foundPackage['name'], $existingPackages, \true)) { unset($matches[$position]); } } $matches = \array_values($matches); $exactMatch = \false; foreach ($matches as $match) { if ($match['name'] === $package) { $exactMatch = \true; break; } } // no match, prompt which to pick if (!$exactMatch) { $providers = $this->getRepos()->getProviders($package); if (\count($providers) > 0) { \array_unshift($matches, ['name' => $package, 'description' => '']); } $choices = []; foreach ($matches as $position => $foundPackage) { $abandoned = ''; if (isset($foundPackage['abandoned'])) { if (\is_string($foundPackage['abandoned'])) { $replacement = \sprintf('Use %s instead', $foundPackage['abandoned']); } else { $replacement = 'No replacement was suggested'; } $abandoned = \sprintf('Abandoned. %s.', $replacement); } $choices[] = \sprintf(' %5s %s %s', "[{$position}]", $foundPackage['name'], $abandoned); } $io->writeError(['', \sprintf('Found %s packages matching %s', \count($matches), $package), '']); $io->writeError($choices); $io->writeError(''); $validator = static function (string $selection) use($matches, $versionParser) { if ('' === $selection) { return \false; } if (\is_numeric($selection) && isset($matches[(int) $selection])) { $package = $matches[(int) $selection]; return $package['name']; } if (Preg::isMatch('{^\\s*(?P[\\S/]+)(?:\\s+(?P\\S+))?\\s*$}', $selection, $packageMatches)) { if (isset($packageMatches['version'])) { // parsing `acme/example ~2.3` // validate version constraint $versionParser->parseConstraints($packageMatches['version']); return $packageMatches['name'] . ' ' . $packageMatches['version']; } // parsing `acme/example` return $packageMatches['name']; } throw new \Exception('Not a valid selection'); }; $package = $io->askAndValidate('Enter package # to add, or the complete package name if it is not listed: ', $validator, 3, ''); } // no constraint yet, determine the best version automatically if (\false !== $package && \false === \strpos($package, ' ')) { $validator = static function (string $input) { $input = \trim($input); return \strlen($input) > 0 ? $input : \false; }; $constraint = $io->askAndValidate('Enter the version constraint to require (or leave blank to use the latest version): ', $validator, 3, ''); if (\false === $constraint) { [, $constraint] = $this->findBestVersionAndNameForPackage($this->getIO(), $input, $package, $platformRepo, $preferredStability); $io->writeError(\sprintf('Using version %s for %s', $constraint, $package)); } $package .= ' ' . $constraint; } if (\false !== $package) { $requires[] = $package; $existingPackages[] = \explode(' ', $package)[0]; } } } return $requires; } /** * Given a package name, this determines the best version to use in the require key. * * This returns a version with the ~ operator prefixed when possible. * * @throws \InvalidArgumentException * @return array{string, string} name version */ private function findBestVersionAndNameForPackage(IOInterface $io, InputInterface $input, string $name, ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $fixed = \false) : array { // handle ignore-platform-reqs flag if present if ($input->hasOption('ignore-platform-reqs') && $input->hasOption('ignore-platform-req')) { $platformRequirementFilter = $this->getPlatformRequirementFilter($input); } else { $platformRequirementFilter = PlatformRequirementFilterFactory::ignoreNothing(); } // find the latest version allowed in this repo set $repoSet = $this->getRepositorySet($input); $versionSelector = new VersionSelector($repoSet, $platformRepo); $effectiveMinimumStability = $this->getMinimumStability($input); $package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter, 0, $this->getIO()); if (\false === $package) { // platform packages can not be found in the pool in versions other than the local platform's has // so if platform reqs are ignored we just take the user's word for it if ($platformRequirementFilter->isIgnored($name)) { return [$name, '*']; } // Check if it is a virtual package provided by others $providers = $repoSet->getProviders($name); if (\count($providers) > 0) { $constraint = '*'; if ($input->isInteractive()) { $constraint = $this->getIO()->askAndValidate('Package "' . $name . '" does not exist but is provided by ' . \count($providers) . ' packages. Which version constraint would you like to use? [*] ', static function ($value) { $parser = new VersionParser(); $parser->parseConstraints($value); return $value; }, 3, '*'); } return [$name, $constraint]; } // Check whether the package requirements were the problem if (!$platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter && \false !== ($candidate = $versionSelector->findBestCandidate($name, null, $preferredStability, PlatformRequirementFilterFactory::ignoreAll()))) { throw new \InvalidArgumentException(\sprintf('Package %s has requirements incompatible with your PHP version, PHP extensions and Composer version' . $this->getPlatformExceptionDetails($candidate, $platformRepo), $name)); } // Check whether the minimum stability was the problem but the package exists if (\false !== ($package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter, RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES))) { // we must first verify if a valid package would be found in a lower priority repository if (\false !== ($allReposPackage = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter, RepositorySet::ALLOW_SHADOWED_REPOSITORIES))) { throw new \InvalidArgumentException('Package ' . $name . ' exists in ' . $allReposPackage->getRepository()->getRepoName() . ' and ' . $package->getRepository()->getRepoName() . ' which has a higher repository priority. The packages from the higher priority repository do not match your minimum-stability and are therefore not installable. That repository is canonical so the lower priority repo\'s packages are not installable. See https://getcomposer.org/repoprio for details and assistance.'); } throw new \InvalidArgumentException(\sprintf('Could not find a version of package %s matching your minimum-stability (%s). Require it with an explicit version constraint allowing its desired stability.', $name, $effectiveMinimumStability)); } // Check whether the PHP version was the problem for all versions if (!$platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter && \false !== ($candidate = $versionSelector->findBestCandidate($name, null, $preferredStability, PlatformRequirementFilterFactory::ignoreAll(), RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES))) { $additional = ''; if (\false === $versionSelector->findBestCandidate($name, null, $preferredStability, PlatformRequirementFilterFactory::ignoreAll())) { $additional = \PHP_EOL . \PHP_EOL . 'Additionally, the package was only found with a stability of "' . $candidate->getStability() . '" while your minimum stability is "' . $effectiveMinimumStability . '".'; } throw new \InvalidArgumentException(\sprintf('Could not find package %s in any version matching your PHP version, PHP extensions and Composer version' . $this->getPlatformExceptionDetails($candidate, $platformRepo) . '%s', $name, $additional)); } // Check for similar names/typos $similar = $this->findSimilar($name); if (\count($similar) > 0) { if (\in_array($name, $similar, \true)) { throw new \InvalidArgumentException(\sprintf("Could not find package %s. It was however found via repository search, which indicates a consistency issue with the repository.", $name)); } if ($input->isInteractive()) { $result = $io->select("Could not find package {$name}.\nPick one of these or leave empty to abort:", $similar, \false, 1); if ($result !== \false) { return $this->findBestVersionAndNameForPackage($io, $input, $similar[$result], $platformRepo, $preferredStability, $fixed); } } throw new \InvalidArgumentException(\sprintf("Could not find package %s.\n\nDid you mean " . (\count($similar) > 1 ? 'one of these' : 'this') . "?\n %s", $name, \implode("\n ", $similar))); } throw new \InvalidArgumentException(\sprintf('Could not find a matching version of package %s. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (%s).', $name, $effectiveMinimumStability)); } return [$package->getPrettyName(), $fixed ? $package->getPrettyVersion() : $versionSelector->findRecommendedRequireVersion($package)]; } /** * @return array */ private function findSimilar(string $package) : array { try { if (null === $this->repos) { throw new \LogicException('findSimilar was called before $this->repos was initialized'); } $results = $this->repos->search($package); } catch (\Throwable $e) { if ($e instanceof \LogicException) { throw $e; } // ignore search errors return []; } $similarPackages = []; $installedRepo = $this->requireComposer()->getRepositoryManager()->getLocalRepository(); foreach ($results as $result) { if (null !== $installedRepo->findPackage($result['name'], '*')) { // Ignore installed package continue; } $similarPackages[$result['name']] = \levenshtein($package, $result['name']); } \asort($similarPackages); return \array_keys(\array_slice($similarPackages, 0, 5)); } private function getPlatformExceptionDetails(PackageInterface $candidate, ?PlatformRepository $platformRepo = null) : string { $details = []; if (null === $platformRepo) { return ''; } foreach ($candidate->getRequires() as $link) { if (!PlatformRepository::isPlatformPackage($link->getTarget())) { continue; } $platformPkg = $platformRepo->findPackage($link->getTarget(), '*'); if (null === $platformPkg) { if ($platformRepo->isPlatformPackageDisabled($link->getTarget())) { $details[] = $candidate->getPrettyName() . ' ' . $candidate->getPrettyVersion() . ' requires ' . $link->getTarget() . ' ' . $link->getPrettyConstraint() . ' but it is disabled by your platform config. Enable it again with "composer config platform.' . $link->getTarget() . ' --unset".'; } else { $details[] = $candidate->getPrettyName() . ' ' . $candidate->getPrettyVersion() . ' requires ' . $link->getTarget() . ' ' . $link->getPrettyConstraint() . ' but it is not present.'; } continue; } if (!$link->getConstraint()->matches(new Constraint('==', $platformPkg->getVersion()))) { $platformPkgVersion = $platformPkg->getPrettyVersion(); $platformExtra = $platformPkg->getExtra(); if (isset($platformExtra['config.platform']) && $platformPkg instanceof CompletePackageInterface) { $platformPkgVersion .= ' (' . $platformPkg->getDescription() . ')'; } $details[] = $candidate->getPrettyName() . ' ' . $candidate->getPrettyVersion() . ' requires ' . $link->getTarget() . ' ' . $link->getPrettyConstraint() . ' which does not match your installed version ' . $platformPkgVersion . '.'; } } if (\count($details) === 0) { return ''; } return ':' . \PHP_EOL . ' - ' . \implode(\PHP_EOL . ' - ', $details); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class ScriptAliasCommand extends \Composer\Command\BaseCommand { /** @var string */ private $script; /** @var string */ private $description; /** @var string[] */ private $aliases; /** * @param string[] $aliases */ public function __construct(string $script, ?string $description, array $aliases = []) { $this->script = $script; $this->description = $description ?? 'Runs the ' . $script . ' script as defined in composer.json'; $this->aliases = $aliases; foreach ($this->aliases as $alias) { if (!\is_string($alias)) { throw new \InvalidArgumentException('"scripts-aliases" element array values should contain only strings'); } } $this->ignoreValidationErrors(); parent::__construct(); } protected function configure() : void { $this->setName($this->script)->setDescription($this->description)->setAliases($this->aliases)->setDefinition([new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, '')])->setHelp(<<run-script command runs scripts defined in composer.json: php composer.phar run-script post-update-cmd Read more at https://getcomposer.org/doc/03-cli.md#run-script-run EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); $args = $input->getArguments(); // TODO remove for Symfony 6+ as it is then in the interface if (!\method_exists($input, '__toString')) { // @phpstan-ignore-line throw new \LogicException('Expected an Input instance that is stringable, got ' . \get_class($input)); } return $composer->getEventDispatcher()->dispatchScript($this->script, $input->getOption('dev') || !$input->getOption('no-dev'), $args['args'], ['script-alias-input' => Preg::replace('{^\\S+ ?}', '', $input->__toString(), 1)]); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Config; use Composer\Factory; use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\Installer; use Composer\Installer\ProjectInstaller; use Composer\Installer\SuggestedPackagesReporter; use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\Package\Version\VersionSelector; use Composer\Package\AliasPackage; use Composer\Pcre\Preg; use Composer\Plugin\PluginBlockedException; use Composer\Repository\RepositoryFactory; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\RepositorySet; use Composer\Script\ScriptEvents; use Composer\Util\Silencer; use Composer\Console\Input\InputArgument; use _ContaoManager\Seld\Signal\SignalHandler; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Finder\Finder; use Composer\Json\JsonFile; use Composer\Config\JsonConfigSource; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Package\Version\VersionParser; use Composer\Advisory\Auditor; /** * Install a package as new project into new directory. * * @author Benjamin Eberlei * @author Jordi Boggiano * @author Tobias Munk * @author Nils Adermann */ class CreateProjectCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; /** * @var SuggestedPackagesReporter */ protected $suggestedPackagesReporter; protected function configure() : void { $this->setName('create-project')->setDescription('Creates new project from a package into given directory')->setDefinition([new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed', null, $this->suggestAvailablePackage()), new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'), new InputArgument('version', InputArgument::OPTIONAL, 'Version, will default to latest'), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum-stability allowed (unless a version is specified).'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories to look the package up, either by URL or using JSON arrays'), new InputOption('repository-url', null, InputOption::VALUE_REQUIRED, 'DEPRECATED: Use --repository instead.'), new InputOption('add-repository', null, InputOption::VALUE_NONE, 'Add the custom repository in the composer.json. If a lock file is present it will be deleted and an update will be run instead of install.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'DEPRECATED: Use no-plugins instead.'), new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Whether to prevent execution of all defined scripts in the root package.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-secure-http', null, InputOption::VALUE_NONE, 'Disable the secure-http config option temporarily while installing the root package. Use at your own risk. Using this flag is a bad idea.'), new InputOption('keep-vcs', null, InputOption::VALUE_NONE, 'Whether to prevent deleting the vcs folder.'), new InputOption('remove-vcs', null, InputOption::VALUE_NONE, 'Whether to force deletion of the vcs folder without prompting.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Whether to skip installation of the package dependencies.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Whether to skip auditing of the installed package dependencies (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json" or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('ask', null, InputOption::VALUE_NONE, 'Whether to ask for project directory.')])->setHelp(<<create-project command creates a new project from a given package into a new directory. If executed without params and in a directory with a composer.json file it installs the packages for the current project. You can use this command to bootstrap new projects or setup a clean version-controlled installation for developers of your project. php composer.phar create-project vendor/project target-directory [version] You can also specify the version with the package name using = or : as separator. php composer.phar create-project vendor/project:version target-directory To install unstable packages, either specify the version you want, or use the --stability=dev (where dev can be one of RC, beta, alpha or dev). To setup a developer workable version you should create the project using the source controlled code by appending the '--prefer-source' flag. To install a package from another repository than the default one you can pass the '--repository=https://myrepository.org' flag. Read more at https://getcomposer.org/doc/03-cli.md#create-project EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $config = Factory::createConfig(); $io = $this->getIO(); [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input, \true); if ($input->getOption('dev')) { $io->writeError('You are using the deprecated option "dev". Dev packages are installed by default now.'); } if ($input->getOption('no-custom-installers')) { $io->writeError('You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.'); $input->setOption('no-plugins', \true); } if ($input->isInteractive() && $input->getOption('ask')) { $package = $input->getArgument('package'); if (null === $package) { throw new \RuntimeException('Not enough arguments (missing: "package").'); } $parts = \explode("/", \strtolower($package), 2); $input->setArgument('directory', $io->ask('New project directory [' . \array_pop($parts) . ']: ')); } return $this->installProject($io, $config, $input, $input->getArgument('package'), $input->getArgument('directory'), $input->getArgument('version'), $input->getOption('stability'), $preferSource, $preferDist, !$input->getOption('no-dev'), \count($input->getOption('repository')) > 0 ? $input->getOption('repository') : $input->getOption('repository-url'), $input->getOption('no-plugins'), $input->getOption('no-scripts'), $input->getOption('no-progress'), $input->getOption('no-install'), $this->getPlatformRequirementFilter($input), !$input->getOption('no-secure-http'), $input->getOption('add-repository')); } /** * @param string|array|null $repositories * * @throws \Exception */ public function installProject(IOInterface $io, Config $config, InputInterface $input, ?string $packageName = null, ?string $directory = null, ?string $packageVersion = null, ?string $stability = 'stable', bool $preferSource = \false, bool $preferDist = \false, bool $installDevPackages = \false, $repositories = null, bool $disablePlugins = \false, bool $disableScripts = \false, bool $noProgress = \false, bool $noInstall = \false, ?PlatformRequirementFilterInterface $platformRequirementFilter = null, bool $secureHttp = \true, bool $addRepository = \false) : int { $oldCwd = Platform::getCwd(); if ($repositories !== null && !\is_array($repositories)) { $repositories = (array) $repositories; } $platformRequirementFilter = $platformRequirementFilter ?? PlatformRequirementFilterFactory::ignoreNothing(); // we need to manually load the configuration to pass the auth credentials to the io interface! $io->loadConfiguration($config); $this->suggestedPackagesReporter = new SuggestedPackagesReporter($io); if ($packageName !== null) { $installedFromVcs = $this->installRootPackage($input, $io, $config, $packageName, $platformRequirementFilter, $directory, $packageVersion, $stability, $preferSource, $preferDist, $installDevPackages, $repositories, $disablePlugins, $disableScripts, $noProgress, $secureHttp); } else { $installedFromVcs = \false; } if ($repositories !== null && $addRepository && \is_file('composer.lock')) { \unlink('composer.lock'); } $composer = $this->createComposerInstance($input, $io, null, $disablePlugins, $disableScripts); // add the repository to the composer.json and use it for the install run later if ($repositories !== null && $addRepository) { foreach ($repositories as $index => $repo) { $repoConfig = RepositoryFactory::configFromString($io, $composer->getConfig(), $repo, \true); $composerJsonRepositoriesConfig = $composer->getConfig()->getRepositories(); $name = RepositoryFactory::generateRepositoryName($index, $repoConfig, $composerJsonRepositoriesConfig); $configSource = new JsonConfigSource(new JsonFile('composer.json')); if (isset($repoConfig['packagist']) && $repoConfig === ['packagist' => \false] || isset($repoConfig['packagist.org']) && $repoConfig === ['packagist.org' => \false]) { $configSource->addRepository('packagist.org', \false); } else { $configSource->addRepository($name, $repoConfig, \false); } $composer = $this->createComposerInstance($input, $io, null, $disablePlugins); } } $process = $composer->getLoop()->getProcessExecutor(); $fs = new Filesystem($process); // dispatch event $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_ROOT_PACKAGE_INSTALL, $installDevPackages); // use the new config including the newly installed project $config = $composer->getConfig(); [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); // install dependencies of the created project if ($noInstall === \false) { $composer->getInstallationManager()->setOutputProgress(!$noProgress); $installer = Installer::create($io, $composer); $installer->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode($installDevPackages)->setPlatformRequirementFilter($platformRequirementFilter)->setSuggestedPackagesReporter($this->suggestedPackagesReporter)->setOptimizeAutoloader($config->get('optimize-autoloader'))->setClassMapAuthoritative($config->get('classmap-authoritative'))->setApcuAutoloader($config->get('apcu-autoloader'))->setAudit(!$input->getOption('no-audit'))->setAuditFormat($this->getAuditFormat($input)); if (!$composer->getLocker()->isLocked()) { $installer->setUpdate(\true); } if ($disablePlugins) { $installer->disablePlugins(); } try { $status = $installer->run(); if (0 !== $status) { return $status; } } catch (PluginBlockedException $e) { $io->writeError('Hint: To allow running the config command recommended below before dependencies are installed, run create-project with --no-install.'); $io->writeError('You can then cd into ' . \getcwd() . ', configure allow-plugins, and finally run a composer install to complete the process.'); throw $e; } } $hasVcs = $installedFromVcs; if (!$input->getOption('keep-vcs') && $installedFromVcs && ($input->getOption('remove-vcs') || !$io->isInteractive() || $io->askConfirmation('Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]? '))) { $finder = new Finder(); $finder->depth(0)->directories()->in(Platform::getCwd())->ignoreVCS(\false)->ignoreDotFiles(\false); foreach (['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg', '.fslckout', '_FOSSIL_'] as $vcsName) { $finder->name($vcsName); } try { $dirs = \iterator_to_array($finder); unset($finder); foreach ($dirs as $dir) { if (!$fs->removeDirectory((string) $dir)) { throw new \RuntimeException('Could not remove ' . $dir); } } } catch (\Exception $e) { $io->writeError('An error occurred while removing the VCS metadata: ' . $e->getMessage() . ''); } $hasVcs = \false; } // rewriting self.version dependencies with explicit version numbers if the package's vcs metadata is gone if (!$hasVcs) { $package = $composer->getPackage(); $configSource = new JsonConfigSource(new JsonFile('composer.json')); foreach (BasePackage::$supportedLinkTypes as $type => $meta) { foreach ($package->{'get' . $meta['method']}() as $link) { if ($link->getPrettyConstraint() === 'self.version') { $configSource->addLink($type, $link->getTarget(), $package->getPrettyVersion()); } } } } // dispatch event $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, $installDevPackages); \chdir($oldCwd); return 0; } /** * @param array|null $repositories * * @throws \Exception */ protected function installRootPackage(InputInterface $input, IOInterface $io, Config $config, string $packageName, PlatformRequirementFilterInterface $platformRequirementFilter, ?string $directory = null, ?string $packageVersion = null, ?string $stability = 'stable', bool $preferSource = \false, bool $preferDist = \false, bool $installDevPackages = \false, ?array $repositories = null, bool $disablePlugins = \false, bool $disableScripts = \false, bool $noProgress = \false, bool $secureHttp = \true) : bool { $parser = new VersionParser(); $requirements = $parser->parseNameVersionPairs([$packageName]); $name = \strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; } // if no directory was specified, use the 2nd part of the package name if (null === $directory) { $parts = \explode("/", $name, 2); $directory = Platform::getCwd() . \DIRECTORY_SEPARATOR . \array_pop($parts); } $directory = \rtrim($directory, '/\\'); $process = new ProcessExecutor($io); $fs = new Filesystem($process); if (!$fs->isAbsolutePath($directory)) { $directory = Platform::getCwd() . \DIRECTORY_SEPARATOR . $directory; } if ('' === $directory) { throw new \UnexpectedValueException('Got an empty target directory, something went wrong'); } // set the base dir to ensure $config->all() below resolves the correct absolute paths to vendor-dir etc $config->setBaseDir($directory); if (!$secureHttp) { $config->merge(['config' => ['secure-http' => \false]], Config::SOURCE_COMMAND); } $io->writeError('Creating a "' . $packageName . '" project at "' . $fs->findShortestPath(Platform::getCwd(), $directory, \true) . '"'); if (\file_exists($directory)) { if (!\is_dir($directory)) { throw new \InvalidArgumentException('Cannot create project directory at "' . $directory . '", it exists as a file.'); } if (!$fs->isDirEmpty($directory)) { throw new \InvalidArgumentException('Project directory "' . $directory . '" is not empty.'); } } if (null === $stability) { if (null === $packageVersion) { $stability = 'stable'; } elseif (Preg::isMatchStrictGroups('{^[^,\\s]*?@(' . \implode('|', \array_keys(BasePackage::STABILITIES)) . ')$}i', $packageVersion, $match)) { $stability = $match[1]; } else { $stability = VersionParser::parseStability($packageVersion); } } $stability = VersionParser::normalizeStability($stability); if (!isset(BasePackage::STABILITIES[$stability])) { throw new \InvalidArgumentException('Invalid stability provided (' . $stability . '), must be one of: ' . \implode(', ', \array_keys(BasePackage::STABILITIES))); } $composer = $this->createComposerInstance($input, $io, $config->all(), $disablePlugins, $disableScripts); $config = $composer->getConfig(); // set the base dir here again on the new config instance, as otherwise in case the vendor dir is defined in an env var for example it would still override the value set above by $config->all() $config->setBaseDir($directory); $rm = $composer->getRepositoryManager(); $repositorySet = new RepositorySet($stability); if (null === $repositories) { $repositorySet->addRepository(new CompositeRepository(RepositoryFactory::defaultRepos($io, $config, $rm))); } else { foreach ($repositories as $repo) { $repoConfig = RepositoryFactory::configFromString($io, $config, $repo, \true); if (isset($repoConfig['packagist']) && $repoConfig === ['packagist' => \false] || isset($repoConfig['packagist.org']) && $repoConfig === ['packagist.org' => \false]) { continue; } // disable symlinking for the root package by default as that most likely makes no sense if (($repoConfig['type'] ?? null) === 'path' && !isset($repoConfig['options']['symlink'])) { $repoConfig['options']['symlink'] = \false; } $repositorySet->addRepository(RepositoryFactory::createRepo($io, $config, $repoConfig, $rm)); } } $platformOverrides = $config->get('platform'); $platformRepo = new PlatformRepository([], $platformOverrides); // find the latest version if there are multiple $versionSelector = new VersionSelector($repositorySet, $platformRepo); $package = $versionSelector->findBestCandidate($name, $packageVersion, $stability, $platformRequirementFilter, 0, $io); if (!$package) { $errorMessage = "Could not find package {$name} with " . ($packageVersion ? "version {$packageVersion}" : "stability {$stability}"); if (!$platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter && $versionSelector->findBestCandidate($name, $packageVersion, $stability, PlatformRequirementFilterFactory::ignoreAll())) { throw new \InvalidArgumentException($errorMessage . ' in a version installable using your PHP version, PHP extensions and Composer version.'); } throw new \InvalidArgumentException($errorMessage . '.'); } // handler Ctrl+C aborts gracefully @\mkdir($directory, 0777, \true); if (\false !== ($realDir = \realpath($directory))) { $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) use($realDir) { $this->getIO()->writeError('Received ' . $signal . ', aborting', \true, IOInterface::DEBUG); $fs = new Filesystem(); $fs->removeDirectory($realDir); $handler->exitWithLastSignal(); }); } // avoid displaying 9999999-dev as version if default-branch was selected if ($package instanceof AliasPackage && $package->getPrettyVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { $package = $package->getAliasOf(); } $io->writeError('Installing ' . $package->getName() . ' (' . $package->getFullPrettyVersion(\false) . ')'); if ($disablePlugins) { $io->writeError('Plugins have been disabled.'); } if ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $dm = $composer->getDownloadManager(); $dm->setPreferSource($preferSource)->setPreferDist($preferDist); $projectInstaller = new ProjectInstaller($directory, $dm, $fs); $im = $composer->getInstallationManager(); $im->setOutputProgress(!$noProgress); $im->addInstaller($projectInstaller); $im->execute(new InstalledArrayRepository(), [new InstallOperation($package)]); $im->notifyInstalls($io); // collect suggestions $this->suggestedPackagesReporter->addSuggestionsFromPackage($package); $installedFromVcs = 'source' === $package->getInstallationSource(); $io->writeError('Created project in ' . $directory . ''); \chdir($directory); // ensure that the env var being set does not interfere with create-project // as it is probably not meant to be used here, so we do not use it if a composer.json can be found // in the project if (\file_exists($directory . '/composer.json') && Platform::getEnv('COMPOSER') !== \false) { Platform::clearEnv('COMPOSER'); } Platform::putEnv('COMPOSER_ROOT_VERSION', $package->getPrettyVersion()); // once the root project is fully initialized, we do not need to wipe everything on user abort anymore even if it happens during deps install if (isset($signalHandler)) { $signalHandler->unregister(); } return $installedFromVcs; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Config; use Composer\Console\Application; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; use Composer\Factory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Plugin\PreCommandRunEvent; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginEvents; use Composer\Advisory\Auditor; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; use _ContaoManager\Symfony\Component\Console\Completion\CompletionSuggestions; use _ContaoManager\Symfony\Component\Console\Helper\Table; use _ContaoManager\Symfony\Component\Console\Helper\TableSeparator; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Console\Command\Command; use _ContaoManager\Symfony\Component\Console\Terminal; /** * Base class for Composer commands * * @author Ryan Weaver * @author Konstantin Kudryashov */ abstract class BaseCommand extends Command { /** * @var Composer|null */ private $composer; /** * @var IOInterface */ private $io; /** * Gets the application instance for this command. */ public function getApplication() : Application { $application = parent::getApplication(); if (!$application instanceof Application) { throw new \RuntimeException('Composer commands can only work with an ' . Application::class . ' instance set'); } return $application; } /** * @param bool $required Should be set to false, or use `requireComposer` instead * @param bool|null $disablePlugins If null, reads --no-plugins as default * @param bool|null $disableScripts If null, reads --no-scripts as default * @throws \RuntimeException * @return Composer|null * @deprecated since Composer 2.3.0 use requireComposer or tryComposer depending on whether you have $required set to true or false */ public function getComposer(bool $required = \true, ?bool $disablePlugins = null, ?bool $disableScripts = null) { if ($required) { return $this->requireComposer($disablePlugins, $disableScripts); } return $this->tryComposer($disablePlugins, $disableScripts); } /** * Retrieves the default Composer\Composer instance or throws * * Use this instead of getComposer if you absolutely need an instance * * @param bool|null $disablePlugins If null, reads --no-plugins as default * @param bool|null $disableScripts If null, reads --no-scripts as default * @throws \RuntimeException */ public function requireComposer(?bool $disablePlugins = null, ?bool $disableScripts = null) : Composer { if (null === $this->composer) { $application = parent::getApplication(); if ($application instanceof Application) { $this->composer = $application->getComposer(\true, $disablePlugins, $disableScripts); \assert($this->composer instanceof Composer); } else { throw new \RuntimeException('Could not create a Composer\\Composer instance, you must inject ' . 'one if this command is not used with a Composer\\Console\\Application instance'); } } return $this->composer; } /** * Retrieves the default Composer\Composer instance or null * * Use this instead of getComposer(false) * * @param bool|null $disablePlugins If null, reads --no-plugins as default * @param bool|null $disableScripts If null, reads --no-scripts as default */ public function tryComposer(?bool $disablePlugins = null, ?bool $disableScripts = null) : ?Composer { if (null === $this->composer) { $application = parent::getApplication(); if ($application instanceof Application) { $this->composer = $application->getComposer(\false, $disablePlugins, $disableScripts); } } return $this->composer; } /** * @return void */ public function setComposer(Composer $composer) { $this->composer = $composer; } /** * Removes the cached composer instance * * @return void */ public function resetComposer() { $this->composer = null; $this->getApplication()->resetComposer(); } /** * Whether or not this command is meant to call another command. * * This is mainly needed to avoid duplicated warnings messages. * * @return bool */ public function isProxyCommand() { return \false; } /** * @return IOInterface */ public function getIO() { if (null === $this->io) { $application = parent::getApplication(); if ($application instanceof Application) { $this->io = $application->getIO(); } else { $this->io = new NullIO(); } } return $this->io; } /** * @return void */ public function setIO(IOInterface $io) { $this->io = $io; } /** * @inheritdoc * * Backport suggested values definition from symfony/console 6.1+ * * TODO drop when PHP 8.1 / symfony 6.1+ can be required */ public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { $definition = $this->getDefinition(); $name = (string) $input->getCompletionName(); if (CompletionInput::TYPE_OPTION_VALUE === $input->getCompletionType() && $definition->hasOption($name) && ($option = $definition->getOption($name)) instanceof InputOption) { $option->complete($input, $suggestions); } elseif (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && $definition->hasArgument($name) && ($argument = $definition->getArgument($name)) instanceof InputArgument) { $argument->complete($input, $suggestions); } else { parent::complete($input, $suggestions); } } /** * @inheritDoc * * @return void */ protected function initialize(InputInterface $input, OutputInterface $output) { // initialize a plugin-enabled Composer instance, either local or global $disablePlugins = $input->hasParameterOption('--no-plugins'); $disableScripts = $input->hasParameterOption('--no-scripts'); $application = parent::getApplication(); if ($application instanceof Application && $application->getDisablePluginsByDefault()) { $disablePlugins = \true; } if ($application instanceof Application && $application->getDisableScriptsByDefault()) { $disableScripts = \true; } if ($this instanceof \Composer\Command\SelfUpdateCommand) { $disablePlugins = \true; $disableScripts = \true; } $composer = $this->tryComposer($disablePlugins, $disableScripts); $io = $this->getIO(); if (null === $composer) { $composer = Factory::createGlobal($this->getIO(), $disablePlugins, $disableScripts); } if ($composer) { $preCommandRunEvent = new PreCommandRunEvent(PluginEvents::PRE_COMMAND_RUN, $input, $this->getName()); $composer->getEventDispatcher()->dispatch($preCommandRunEvent->getName(), $preCommandRunEvent); } if (\true === $input->hasParameterOption(['--no-ansi']) && $input->hasOption('no-progress')) { $input->setOption('no-progress', \true); } $envOptions = ['COMPOSER_NO_AUDIT' => ['no-audit'], 'COMPOSER_NO_DEV' => ['no-dev', 'update-no-dev'], 'COMPOSER_PREFER_STABLE' => ['prefer-stable'], 'COMPOSER_PREFER_LOWEST' => ['prefer-lowest'], 'COMPOSER_MINIMAL_CHANGES' => ['minimal-changes'], 'COMPOSER_WITH_DEPENDENCIES' => ['with-dependencies'], 'COMPOSER_WITH_ALL_DEPENDENCIES' => ['with-all-dependencies']]; foreach ($envOptions as $envName => $optionNames) { foreach ($optionNames as $optionName) { if (\true === $input->hasOption($optionName)) { if (\false === $input->getOption($optionName) && (bool) Platform::getEnv($envName)) { $input->setOption($optionName, \true); } } } } if (\true === $input->hasOption('ignore-platform-reqs')) { if (!$input->getOption('ignore-platform-reqs') && (bool) Platform::getEnv('COMPOSER_IGNORE_PLATFORM_REQS')) { $input->setOption('ignore-platform-reqs', \true); $io->writeError('COMPOSER_IGNORE_PLATFORM_REQS is set. You may experience unexpected errors.'); } } if (\true === $input->hasOption('ignore-platform-req') && (!$input->hasOption('ignore-platform-reqs') || !$input->getOption('ignore-platform-reqs'))) { $ignorePlatformReqEnv = Platform::getEnv('COMPOSER_IGNORE_PLATFORM_REQ'); if (0 === \count($input->getOption('ignore-platform-req')) && \is_string($ignorePlatformReqEnv) && '' !== $ignorePlatformReqEnv) { $input->setOption('ignore-platform-req', \explode(',', $ignorePlatformReqEnv)); $io->writeError('COMPOSER_IGNORE_PLATFORM_REQ is set to ignore ' . $ignorePlatformReqEnv . '. You may experience unexpected errors.'); } } parent::initialize($input, $output); } /** * Calls {@see Factory::create()} with the given arguments, taking into account flags and default states for disabling scripts and plugins * * @param mixed $config either a configuration array or a filename to read from, if null it will read from * the default filename * @return Composer */ protected function createComposerInstance(InputInterface $input, IOInterface $io, $config = null, ?bool $disablePlugins = null, ?bool $disableScripts = null) : Composer { $disablePlugins = $disablePlugins === \true || $input->hasParameterOption('--no-plugins'); $disableScripts = $disableScripts === \true || $input->hasParameterOption('--no-scripts'); $application = parent::getApplication(); if ($application instanceof Application && $application->getDisablePluginsByDefault()) { $disablePlugins = \true; } if ($application instanceof Application && $application->getDisableScriptsByDefault()) { $disableScripts = \true; } return Factory::create($io, $config, $disablePlugins, $disableScripts); } /** * Returns preferSource and preferDist values based on the configuration. * * @return bool[] An array composed of the preferSource and preferDist values */ protected function getPreferredInstallOptions(Config $config, InputInterface $input, bool $keepVcsRequiresPreferSource = \false) { $preferSource = \false; $preferDist = \false; switch ($config->get('preferred-install')) { case 'source': $preferSource = \true; break; case 'dist': $preferDist = \true; break; case 'auto': default: // noop break; } if (!$input->hasOption('prefer-dist') || !$input->hasOption('prefer-source')) { return [$preferSource, $preferDist]; } if ($input->hasOption('prefer-install') && \is_string($input->getOption('prefer-install'))) { if ($input->getOption('prefer-source')) { throw new \InvalidArgumentException('--prefer-source can not be used together with --prefer-install'); } if ($input->getOption('prefer-dist')) { throw new \InvalidArgumentException('--prefer-dist can not be used together with --prefer-install'); } switch ($input->getOption('prefer-install')) { case 'dist': $input->setOption('prefer-dist', \true); break; case 'source': $input->setOption('prefer-source', \true); break; case 'auto': $preferDist = \false; $preferSource = \false; break; default: throw new \UnexpectedValueException('--prefer-install accepts one of "dist", "source" or "auto", got ' . $input->getOption('prefer-install')); } } if ($input->getOption('prefer-source') || $input->getOption('prefer-dist') || $keepVcsRequiresPreferSource && $input->hasOption('keep-vcs') && $input->getOption('keep-vcs')) { $preferSource = $input->getOption('prefer-source') || $keepVcsRequiresPreferSource && $input->hasOption('keep-vcs') && $input->getOption('keep-vcs'); $preferDist = $input->getOption('prefer-dist'); } return [$preferSource, $preferDist]; } protected function getPlatformRequirementFilter(InputInterface $input) : PlatformRequirementFilterInterface { if (!$input->hasOption('ignore-platform-reqs') || !$input->hasOption('ignore-platform-req')) { throw new \LogicException('Calling getPlatformRequirementFilter from a command which does not define the --ignore-platform-req[s] flags is not permitted.'); } if (\true === $input->getOption('ignore-platform-reqs')) { return PlatformRequirementFilterFactory::ignoreAll(); } $ignores = $input->getOption('ignore-platform-req'); if (\count($ignores) > 0) { return PlatformRequirementFilterFactory::fromBoolOrList($ignores); } return PlatformRequirementFilterFactory::ignoreNothing(); } /** * @param array $requirements * * @return array */ protected function formatRequirements(array $requirements) { $requires = []; $requirements = $this->normalizeRequirements($requirements); foreach ($requirements as $requirement) { if (!isset($requirement['version'])) { throw new \UnexpectedValueException('Option ' . $requirement['name'] . ' is missing a version constraint, use e.g. ' . $requirement['name'] . ':^1.0'); } $requires[$requirement['name']] = $requirement['version']; } return $requires; } /** * @param array $requirements * * @return list */ protected function normalizeRequirements(array $requirements) { $parser = new VersionParser(); return $parser->parseNameVersionPairs($requirements); } /** * @param array $table * * @return void */ protected function renderTable(array $table, OutputInterface $output) { $renderer = new Table($output); $renderer->setStyle('compact'); $renderer->setRows($table)->render(); } /** * @return int */ protected function getTerminalWidth() { $terminal = new Terminal(); $width = $terminal->getWidth(); if (Platform::isWindows()) { $width--; } else { $width = \max(80, $width); } return $width; } /** * @internal * @param 'format'|'audit-format' $optName * @return Auditor::FORMAT_* */ protected function getAuditFormat(InputInterface $input, string $optName = 'audit-format') : string { if (!$input->hasOption($optName)) { throw new \LogicException('This should not be called on a Command which has no ' . $optName . ' option defined.'); } $val = $input->getOption($optName); if (!\in_array($val, Auditor::FORMATS, \true)) { throw new \InvalidArgumentException('--' . $optName . ' must be one of ' . \implode(', ', Auditor::FORMATS) . '.'); } return $val; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Input\ArrayInput; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class OutdatedCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; protected function configure() : void { $this->setName('outdated')->setDescription('Shows a list of installed packages that have updates available, including their latest version')->setDefinition([new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage(\false)), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated (this is the default, but present here for compat with `show`'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show all installed packages with their latest versions'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Shows updates for packages from the lock file, regardless of what is currently in vendor dir'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('major-only', 'M', InputOption::VALUE_NONE, 'Show only packages that have major SemVer-compatible updates.'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates.'), new InputOption('patch-only', 'p', InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates.'), new InputOption('sort-by-age', 'A', InputOption::VALUE_NONE, 'Displays the installed version\'s age, and sorts packages oldest first.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Can contain wildcards (*). Use it if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage(\false)), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option')])->setHelp(<<green (=): Dependency is in the latest version and is up to date. - yellow (~): Dependency has a new version available that includes backwards compatibility breaks according to semver, so upgrade when you can but it may involve work. - red (!): Dependency has a new version that is semver-compatible and you should upgrade it. Read more at https://getcomposer.org/doc/03-cli.md#outdated EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $args = ['command' => 'show', '--latest' => \true]; if ($input->getOption('no-interaction')) { $args['--no-interaction'] = \true; } if ($input->getOption('no-plugins')) { $args['--no-plugins'] = \true; } if ($input->getOption('no-scripts')) { $args['--no-scripts'] = \true; } if ($input->getOption('no-cache')) { $args['--no-cache'] = \true; } if (!$input->getOption('all')) { $args['--outdated'] = \true; } if ($input->getOption('direct')) { $args['--direct'] = \true; } if (null !== $input->getArgument('package')) { $args['package'] = $input->getArgument('package'); } if ($input->getOption('strict')) { $args['--strict'] = \true; } if ($input->getOption('major-only')) { $args['--major-only'] = \true; } if ($input->getOption('minor-only')) { $args['--minor-only'] = \true; } if ($input->getOption('patch-only')) { $args['--patch-only'] = \true; } if ($input->getOption('locked')) { $args['--locked'] = \true; } if ($input->getOption('no-dev')) { $args['--no-dev'] = \true; } if ($input->getOption('sort-by-age')) { $args['--sort-by-age'] = \true; } $args['--ignore-platform-req'] = $input->getOption('ignore-platform-req'); if ($input->getOption('ignore-platform-reqs')) { $args['--ignore-platform-reqs'] = \true; } $args['--format'] = $input->getOption('format'); $args['--ignore'] = $input->getOption('ignore'); $input = new ArrayInput($args); return $this->getApplication()->run($input, $output); } /** * @inheritDoc */ public function isProxyCommand() : bool { return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\AliasPackage; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class DumpAutoloadCommand extends \Composer\Command\BaseCommand { /** * @return void */ protected function configure() { $this->setName('dump-autoload')->setAliases(['dumpautoload'])->setDescription('Dumps the autoloader')->setDefinition([new InputOption('optimize', 'o', InputOption::VALUE_NONE, 'Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize`.'), new InputOption('apcu', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables autoload-dev rules. Composer will by default infer this automatically according to the last install or update --no-dev state.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables autoload-dev rules. Composer will by default infer this automatically according to the last install or update --no-dev state.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('strict-psr', null, InputOption::VALUE_NONE, 'Return a failed status code (1) if PSR-4 or PSR-0 mapping errors are present. Requires --optimize to work.'), new InputOption('strict-ambiguous', null, InputOption::VALUE_NONE, 'Return a failed status code (2) if the same class is found in multiple files. Requires --optimize to work.')])->setHelp(<<php composer.phar dump-autoload Read more at https://getcomposer.org/doc/03-cli.md#dump-autoload-dumpautoload EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'dump-autoload', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $installationManager = $composer->getInstallationManager(); $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $package = $composer->getPackage(); $config = $composer->getConfig(); $missingDependencies = \false; foreach ($localRepo->getCanonicalPackages() as $localPkg) { $installPath = $installationManager->getInstallPath($localPkg); if ($installPath !== null && \file_exists($installPath) === \false) { $missingDependencies = \true; $this->getIO()->write('Not all dependencies are installed. Make sure to run a "composer install" to install missing dependencies'); break; } } $optimize = $input->getOption('optimize') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcuPrefix = $input->getOption('apcu-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu') || $config->get('apcu-autoloader'); if ($input->getOption('strict-psr') && !$optimize && !$authoritative) { throw new \InvalidArgumentException('--strict-psr mode only works with optimized autoloader, use --optimize or --classmap-authoritative if you want a strict return value.'); } if ($input->getOption('strict-ambiguous') && !$optimize && !$authoritative) { throw new \InvalidArgumentException('--strict-ambiguous mode only works with optimized autoloader, use --optimize or --classmap-authoritative if you want a strict return value.'); } if ($authoritative) { $this->getIO()->write('Generating optimized autoload files (authoritative)'); } elseif ($optimize) { $this->getIO()->write('Generating optimized autoload files'); } else { $this->getIO()->write('Generating autoload files'); } $generator = $composer->getAutoloadGenerator(); if ($input->getOption('dry-run')) { $generator->setDryRun(\true); } if ($input->getOption('no-dev')) { $generator->setDevMode(\false); } if ($input->getOption('dev')) { if ($input->getOption('no-dev')) { throw new \InvalidArgumentException('You can not use both --no-dev and --dev as they conflict with each other.'); } $generator->setDevMode(\true); } $generator->setClassMapAuthoritative($authoritative); $generator->setRunScripts(\true); $generator->setApcu($apcu, $apcuPrefix); $generator->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)); $classMap = $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize, null, $composer->getLocker(), $input->getOption('strict-ambiguous')); $numberOfClasses = \count($classMap); if ($authoritative) { $this->getIO()->write('Generated optimized autoload files (authoritative) containing ' . $numberOfClasses . ' classes'); } elseif ($optimize) { $this->getIO()->write('Generated optimized autoload files containing ' . $numberOfClasses . ' classes'); } else { $this->getIO()->write('Generated autoload files'); } if ($missingDependencies || $input->getOption('strict-psr') && \count($classMap->getPsrViolations()) > 0) { return 1; } if ($input->getOption('strict-ambiguous') && \count($classMap->getAmbiguousClasses(\false)) > 0) { return 2; } return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\CompletePackageInterface; use Composer\Repository\RepositoryInterface; use Composer\Repository\RootPackageRepository; use Composer\Repository\RepositoryFactory; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Robert Schönthal */ class HomeCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; /** * @inheritDoc */ protected function configure() : void { $this->setName('browse')->setAliases(['home'])->setDescription('Opens the package\'s repository URL or homepage in your browser')->setDefinition([new InputArgument('packages', InputArgument::IS_ARRAY, 'Package(s) to browse to.', null, $this->suggestInstalledPackage()), new InputOption('homepage', 'H', InputOption::VALUE_NONE, 'Open the homepage instead of the repository URL.'), new InputOption('show', 's', InputOption::VALUE_NONE, 'Only show the homepage or repository URL.')])->setHelp(<<initializeRepos(); $io = $this->getIO(); $return = 0; $packages = $input->getArgument('packages'); if (\count($packages) === 0) { $io->writeError('No package specified, opening homepage for the root package'); $packages = [$this->requireComposer()->getPackage()->getName()]; } foreach ($packages as $packageName) { $handled = \false; $packageExists = \false; foreach ($repos as $repo) { foreach ($repo->findPackages($packageName) as $package) { $packageExists = \true; if ($package instanceof CompletePackageInterface && $this->handlePackage($package, $input->getOption('homepage'), $input->getOption('show'))) { $handled = \true; break 2; } } } if (!$packageExists) { $return = 1; $io->writeError('Package ' . $packageName . ' not found'); } if (!$handled) { $return = 1; $io->writeError('' . ($input->getOption('homepage') ? 'Invalid or missing homepage' : 'Invalid or missing repository URL') . ' for ' . $packageName . ''); } } return $return; } private function handlePackage(CompletePackageInterface $package, bool $showHomepage, bool $showOnly) : bool { $support = $package->getSupport(); $url = $support['source'] ?? $package->getSourceUrl(); if (!$url || $showHomepage) { $url = $package->getHomepage(); } if (!$url || !\filter_var($url, \FILTER_VALIDATE_URL)) { return \false; } if ($showOnly) { $this->getIO()->write(\sprintf('%s', $url)); } else { $this->openBrowser($url); } return \true; } /** * opens a url in your system default browser */ private function openBrowser(string $url) : void { $process = new ProcessExecutor($this->getIO()); if (Platform::isWindows()) { $process->execute(['start', '"web"', 'explorer', $url], $output); return; } $linux = $process->execute(['which', 'xdg-open'], $output); $osx = $process->execute(['which', 'open'], $output); if (0 === $linux) { $process->execute(['xdg-open', $url], $output); } elseif (0 === $osx) { $process->execute(['open', $url], $output); } else { $this->getIO()->writeError('No suitable browser opening command found, open yourself: ' . $url); } } /** * Initializes repositories * * Returns an array of repos in order they should be checked in * * @return RepositoryInterface[] */ private function initializeRepos() : array { $composer = $this->tryComposer(); if ($composer) { return \array_merge( [new RootPackageRepository(clone $composer->getPackage())], // root package [$composer->getRepositoryManager()->getLocalRepository()], // installed packages $composer->getRepositoryManager()->getRepositories() ); } return RepositoryFactory::defaultReposWithDefaultManager($this->getIO()); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; use Composer\DependencyResolver\Transaction; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Pcre\Preg; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Script\ScriptEvents; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class ReinstallCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; protected function configure() : void { $this->setName('reinstall')->setDescription('Uninstalls and reinstalls the given package names')->setDefinition([new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('type', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Filter packages to reinstall by type(s)', null, $this->suggestInstalledPackageTypes(\false)), new InputArgument('packages', InputArgument::IS_ARRAY, 'List of package names to reinstall, can include a wildcard (*) to match any substring.', null, $this->suggestInstalledPackage(\false))])->setHelp(<<reinstall command looks up installed packages by name, uninstalls them and reinstalls them. This lets you do a clean install of a package if you messed with its files, or if you wish to change the installation type using --prefer-install. php composer.phar reinstall acme/foo "acme/bar-*" Read more at https://getcomposer.org/doc/03-cli.md#reinstall EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $io = $this->getIO(); $composer = $this->requireComposer(); $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $packagesToReinstall = []; $packageNamesToReinstall = []; if (\count($input->getOption('type')) > 0) { if (\count($input->getArgument('packages')) > 0) { throw new \InvalidArgumentException('You cannot specify package names and filter by type at the same time.'); } foreach ($localRepo->getCanonicalPackages() as $package) { if (\in_array($package->getType(), $input->getOption('type'), \true)) { $packagesToReinstall[] = $package; $packageNamesToReinstall[] = $package->getName(); } } } else { if (\count($input->getArgument('packages')) === 0) { throw new \InvalidArgumentException('You must pass one or more package names to be reinstalled.'); } foreach ($input->getArgument('packages') as $pattern) { $patternRegexp = BasePackage::packageNameToRegexp($pattern); $matched = \false; foreach ($localRepo->getCanonicalPackages() as $package) { if (Preg::isMatch($patternRegexp, $package->getName())) { $matched = \true; $packagesToReinstall[] = $package; $packageNamesToReinstall[] = $package->getName(); } } if (!$matched) { $io->writeError('Pattern "' . $pattern . '" does not match any currently installed packages.'); } } } if (0 === \count($packagesToReinstall)) { $io->writeError('Found no packages to reinstall, aborting.'); return 1; } $uninstallOperations = []; foreach ($packagesToReinstall as $package) { $uninstallOperations[] = new UninstallOperation($package); } // make sure we have a list of install operations ordered by dependency/plugins $presentPackages = $localRepo->getPackages(); $resultPackages = $presentPackages; foreach ($presentPackages as $index => $package) { if (\in_array($package->getName(), $packageNamesToReinstall, \true)) { unset($presentPackages[$index]); } } $transaction = new Transaction($presentPackages, $resultPackages); $installOperations = $transaction->getOperations(); // reverse-sort the uninstalls based on the install order $installOrder = []; foreach ($installOperations as $index => $op) { if ($op instanceof InstallOperation && !$op->getPackage() instanceof AliasPackage) { $installOrder[$op->getPackage()->getName()] = $index; } } \usort($uninstallOperations, static function ($a, $b) use($installOrder) : int { return $installOrder[$b->getPackage()->getName()] - $installOrder[$a->getPackage()->getName()]; }); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'reinstall', $input, $output); $eventDispatcher = $composer->getEventDispatcher(); $eventDispatcher->dispatch($commandEvent->getName(), $commandEvent); $config = $composer->getConfig(); [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); $installationManager = $composer->getInstallationManager(); $downloadManager = $composer->getDownloadManager(); $package = $composer->getPackage(); $installationManager->setOutputProgress(!$input->getOption('no-progress')); if ($input->getOption('no-plugins')) { $installationManager->disablePlugins(); } $downloadManager->setPreferSource($preferSource); $downloadManager->setPreferDist($preferDist); $devMode = $localRepo->getDevMode() !== null ? $localRepo->getDevMode() : \true; Platform::putEnv('COMPOSER_DEV_MODE', $devMode ? '1' : '0'); $eventDispatcher->dispatchScript(ScriptEvents::PRE_INSTALL_CMD, $devMode); $installationManager->execute($localRepo, $uninstallOperations, $devMode); $installationManager->execute($localRepo, $installOperations, $devMode); if (!$input->getOption('no-autoloader')) { $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcuPrefix = $input->getOption('apcu-autoloader-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu-autoloader') || $config->get('apcu-autoloader'); $generator = $composer->getAutoloadGenerator(); $generator->setClassMapAuthoritative($authoritative); $generator->setApcu($apcu, $apcuPrefix); $generator->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)); $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize, null, $composer->getLocker()); } $eventDispatcher->dispatchScript(ScriptEvents::POST_INSTALL_CMD, $devMode); return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Config\JsonConfigSource; use Composer\DependencyResolver\Request; use Composer\Installer; use Composer\Pcre\Preg; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Json\JsonFile; use Composer\Factory; use _ContaoManager\Symfony\Component\Console\Exception\InvalidArgumentException; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Package\BasePackage; use Composer\Advisory\Auditor; /** * @author Pierre du Plessis * @author Jordi Boggiano */ class RemoveCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; /** * @return void */ protected function configure() { $this->setName('remove')->setAliases(['rm', 'uninstall'])->setDescription('Removes a package from the require or require-dev')->setDefinition([new InputArgument('packages', InputArgument::IS_ARRAY, 'Packages that should be removed.', null, $this->suggestRootRequirement()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated with explicit dependencies (can also be set via the COMPOSER_WITH_DEPENDENCIES=1 env var). (Deprecated, is now default behavior)'), new InputOption('update-with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements (can also be set via the COMPOSER_WITH_ALL_DEPENDENCIES=1 env var).'), new InputOption('with-all-dependencies', null, InputOption::VALUE_NONE, 'Alias for --update-with-all-dependencies'), new InputOption('no-update-with-dependencies', null, InputOption::VALUE_NONE, 'Does not allow inherited dependencies to be updated with explicit dependencies.'), new InputOption('minimal-changes', 'm', InputOption::VALUE_NONE, 'During an update with -w/-W, only perform absolutely necessary changes to transitive dependencies (can also be set via the COMPOSER_MINIMAL_CHANGES=1 env var).'), new InputOption('unused', null, InputOption::VALUE_NONE, 'Remove all packages which are locked but not required by any other package.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader')])->setHelp(<<remove command removes a package from the current list of installed packages php composer.phar remove Read more at https://getcomposer.org/doc/03-cli.md#remove-rm EOT ); } /** * @throws \Seld\JsonLint\ParsingException */ protected function execute(InputInterface $input, OutputInterface $output) : int { if ($input->getArgument('packages') === [] && !$input->getOption('unused')) { throw new InvalidArgumentException('Not enough arguments (missing: "packages").'); } $packages = $input->getArgument('packages'); $packages = \array_map('strtolower', $packages); if ($input->getOption('unused')) { $composer = $this->requireComposer(); $locker = $composer->getLocker(); if (!$locker->isLocked()) { throw new \UnexpectedValueException('A valid composer.lock file is required to run this command with --unused'); } $lockedPackages = $locker->getLockedRepository()->getPackages(); $required = []; foreach (\array_merge($composer->getPackage()->getRequires(), $composer->getPackage()->getDevRequires()) as $link) { $required[$link->getTarget()] = \true; } do { $found = \false; foreach ($lockedPackages as $index => $package) { foreach ($package->getNames() as $name) { if (isset($required[$name])) { foreach ($package->getRequires() as $link) { $required[$link->getTarget()] = \true; } $found = \true; unset($lockedPackages[$index]); break; } } } } while ($found); $unused = []; foreach ($lockedPackages as $package) { $unused[] = $package->getName(); } $packages = \array_merge($packages, $unused); if (\count($packages) === 0) { $this->getIO()->writeError('No unused packages to remove'); return 0; } } $file = Factory::getComposerFile(); $jsonFile = new JsonFile($file); /** @var array{require?: array, require-dev?: array} $composer */ $composer = $jsonFile->read(); $composerBackup = \file_get_contents($jsonFile->getPath()); $json = new JsonConfigSource($jsonFile); $type = $input->getOption('dev') ? 'require-dev' : 'require'; $altType = !$input->getOption('dev') ? 'require-dev' : 'require'; $io = $this->getIO(); if ($input->getOption('update-with-dependencies')) { $io->writeError('You are using the deprecated option "update-with-dependencies". This is now default behaviour. The --no-update-with-dependencies option can be used to remove a package without its dependencies.'); } // make sure name checks are done case insensitively foreach (['require', 'require-dev'] as $linkType) { if (isset($composer[$linkType])) { foreach ($composer[$linkType] as $name => $version) { $composer[$linkType][\strtolower($name)] = $name; } } } $dryRun = $input->getOption('dry-run'); $toRemove = []; foreach ($packages as $package) { if (isset($composer[$type][$package])) { if ($dryRun) { $toRemove[$type][] = $composer[$type][$package]; } else { $json->removeLink($type, $composer[$type][$package]); } } elseif (isset($composer[$altType][$package])) { $io->writeError('' . $composer[$altType][$package] . ' could not be found in ' . $type . ' but it is present in ' . $altType . ''); if ($io->isInteractive()) { if ($io->askConfirmation('Do you want to remove it from ' . $altType . ' [yes]? ')) { if ($dryRun) { $toRemove[$altType][] = $composer[$altType][$package]; } else { $json->removeLink($altType, $composer[$altType][$package]); } } } } elseif (isset($composer[$type]) && \count($matches = Preg::grep(BasePackage::packageNameToRegexp($package), \array_keys($composer[$type]))) > 0) { foreach ($matches as $matchedPackage) { if ($dryRun) { $toRemove[$type][] = $matchedPackage; } else { $json->removeLink($type, $matchedPackage); } } } elseif (isset($composer[$altType]) && \count($matches = Preg::grep(BasePackage::packageNameToRegexp($package), \array_keys($composer[$altType]))) > 0) { foreach ($matches as $matchedPackage) { $io->writeError('' . $matchedPackage . ' could not be found in ' . $type . ' but it is present in ' . $altType . ''); if ($io->isInteractive()) { if ($io->askConfirmation('Do you want to remove it from ' . $altType . ' [yes]? ')) { if ($dryRun) { $toRemove[$altType][] = $matchedPackage; } else { $json->removeLink($altType, $matchedPackage); } } } } } else { $io->writeError('' . $package . ' is not required in your composer.json and has not been removed'); } } $io->writeError('' . $file . ' has been updated'); if ($input->getOption('no-update')) { return 0; } if ($composer = $this->tryComposer()) { $composer->getPluginManager()->deactivateInstalledPlugins(); } // Update packages $this->resetComposer(); $composer = $this->requireComposer(); if ($dryRun) { $rootPackage = $composer->getPackage(); $links = ['require' => $rootPackage->getRequires(), 'require-dev' => $rootPackage->getDevRequires()]; foreach ($toRemove as $type => $names) { foreach ($names as $name) { unset($links[$type][$name]); } } $rootPackage->setRequires($links['require']); $rootPackage->setDevRequires($links['require-dev']); } $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'remove', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $allowPlugins = $composer->getConfig()->get('allow-plugins'); $removedPlugins = \is_array($allowPlugins) ? \array_intersect(\array_keys($allowPlugins), $packages) : []; if (!$dryRun && \is_array($allowPlugins) && \count($removedPlugins) > 0) { if (\count($allowPlugins) === \count($removedPlugins)) { $json->removeConfigSetting('allow-plugins'); } else { foreach ($removedPlugins as $plugin) { $json->removeConfigSetting('allow-plugins.' . $plugin); } } } $composer->getInstallationManager()->setOutputProgress(!$input->getOption('no-progress')); $install = Installer::create($io, $composer); $updateDevMode = !$input->getOption('update-no-dev'); $optimize = $input->getOption('optimize-autoloader') || $composer->getConfig()->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $composer->getConfig()->get('classmap-authoritative'); $apcuPrefix = $input->getOption('apcu-autoloader-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu-autoloader') || $composer->getConfig()->get('apcu-autoloader'); $updateAllowTransitiveDependencies = Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE; $flags = ''; if ($input->getOption('update-with-all-dependencies') || $input->getOption('with-all-dependencies')) { $updateAllowTransitiveDependencies = Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS; $flags .= ' --with-all-dependencies'; } elseif ($input->getOption('no-update-with-dependencies')) { $updateAllowTransitiveDependencies = Request::UPDATE_ONLY_LISTED; $flags .= ' --with-dependencies'; } $io->writeError('Running composer update ' . \implode(' ', $packages) . $flags . ''); $install->setVerbose($input->getOption('verbose'))->setDevMode($updateDevMode)->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setApcuAutoloader($apcu, $apcuPrefix)->setUpdate(\true)->setInstall(!$input->getOption('no-install'))->setUpdateAllowTransitiveDependencies($updateAllowTransitiveDependencies)->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input))->setDryRun($dryRun)->setAudit(!$input->getOption('no-audit'))->setAuditFormat($this->getAuditFormat($input))->setMinimalUpdate($input->getOption('minimal-changes')); // if no lock is present, we do not do a partial update as // this is not supported by the Installer if ($composer->getLocker()->isLocked()) { $install->setUpdateAllowList($packages); } $status = $install->run(); if ($status !== 0) { $io->writeError("\n" . 'Removal failed, reverting ' . $file . ' to its original content.'); \file_put_contents($jsonFile->getPath(), $composerBackup); } if (!$dryRun) { foreach ($packages as $package) { if ($composer->getRepositoryManager()->getLocalRepository()->findPackages($package)) { $io->writeError('Removal failed, ' . $package . ' is still present, it may be required by another package. See `composer why ' . $package . '`.'); return 2; } } } return $status; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\DependencyResolver\DefaultPolicy; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\Link; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; use Composer\Pcre\Preg; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\ArrayRepository; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\ComposerRepository; use Composer\Repository\CompositeRepository; use Composer\Repository\FilterRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Repository\InstalledRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositorySet; use Composer\Repository\RepositoryUtils; use Composer\Repository\RootPackageRepository; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Semver; use Composer\Spdx\SpdxLicenses; use Composer\Util\PackageInfo; use DateTimeInterface; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatterStyle; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Robert Schönthal * @author Jordi Boggiano * @author Jérémy Romey * @author Mihai Plasoianu * * @phpstan-import-type AutoloadRules from PackageInterface * @phpstan-type JsonStructure array|AutoloadRules> */ class ShowCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; /** @var VersionParser */ protected $versionParser; /** @var string[] */ protected $colors; /** @var ?RepositorySet */ private $repositorySet; /** * @return void */ protected function configure() { $this->setName('show')->setAliases(['info'])->setDescription('Shows information about packages')->setDefinition([new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestPackageBasedOnMode()), new InputArgument('version', InputArgument::OPTIONAL, 'Version or version constraint to inspect'), new InputOption('all', null, InputOption::VALUE_NONE, 'List all packages'), new InputOption('locked', null, InputOption::VALUE_NONE, 'List all locked packages'), new InputOption('installed', 'i', InputOption::VALUE_NONE, 'List installed packages only (enabled by default, only present for BC).'), new InputOption('platform', 'p', InputOption::VALUE_NONE, 'List platform packages only'), new InputOption('available', 'a', InputOption::VALUE_NONE, 'List available packages only'), new InputOption('self', 's', InputOption::VALUE_NONE, 'Show the root package information'), new InputOption('name-only', 'N', InputOption::VALUE_NONE, 'List package names only'), new InputOption('path', 'P', InputOption::VALUE_NONE, 'Show package paths'), new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'), new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Can contain wildcards (*). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage(\false)), new InputOption('major-only', 'M', InputOption::VALUE_NONE, 'Show only packages that have major SemVer-compatible updates. Use with the --latest or --outdated option.'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --latest or --outdated option.'), new InputOption('patch-only', null, InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --latest or --outdated option.'), new InputOption('sort-by-age', 'A', InputOption::VALUE_NONE, 'Displays the installed version\'s age, and sorts packages oldest first. Use with the --latest or --outdated option.'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option')])->setHelp(<<getOption('available') || $input->getOption('all')) { return $this->suggestAvailablePackageInclPlatform()($input); } if ($input->getOption('platform')) { return $this->suggestPlatformPackage()($input); } return $this->suggestInstalledPackage(\false)($input); }; } protected function execute(InputInterface $input, OutputInterface $output) : int { $this->versionParser = new VersionParser(); if ($input->getOption('tree')) { $this->initStyles($output); } $composer = $this->tryComposer(); $io = $this->getIO(); if ($input->getOption('installed') && !$input->getOption('self')) { $io->writeError('You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.'); } if ($input->getOption('outdated')) { $input->setOption('latest', \true); } elseif (\count($input->getOption('ignore')) > 0) { $io->writeError('You are using the option "ignore" for action other than "outdated", it will be ignored.'); } if ($input->getOption('direct') && ($input->getOption('all') || $input->getOption('available') || $input->getOption('platform'))) { $io->writeError('The --direct (-D) option is not usable in combination with --all, --platform (-p) or --available (-a)'); return 1; } if ($input->getOption('tree') && ($input->getOption('all') || $input->getOption('available'))) { $io->writeError('The --tree (-t) option is not usable in combination with --all or --available (-a)'); return 1; } if (\count(\array_filter([$input->getOption('patch-only'), $input->getOption('minor-only'), $input->getOption('major-only')])) > 1) { $io->writeError('Only one of --major-only, --minor-only or --patch-only can be used at once'); return 1; } if ($input->getOption('tree') && $input->getOption('latest')) { $io->writeError('The --tree (-t) option is not usable in combination with --latest (-l)'); return 1; } if ($input->getOption('tree') && $input->getOption('path')) { $io->writeError('The --tree (-t) option is not usable in combination with --path (-P)'); return 1; } $format = $input->getOption('format'); if (!\in_array($format, ['text', 'json'])) { $io->writeError(\sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; } $platformReqFilter = $this->getPlatformRequirementFilter($input); // init repos $platformOverrides = []; if ($composer) { $platformOverrides = $composer->getConfig()->get('platform'); } $platformRepo = new PlatformRepository([], $platformOverrides); $lockedRepo = null; if ($input->getOption('self') && !$input->getOption('installed') && !$input->getOption('locked')) { $package = clone $this->requireComposer()->getPackage(); if ($input->getOption('name-only')) { $io->write($package->getName()); return 0; } if ($input->getArgument('package')) { throw new \InvalidArgumentException('You cannot use --self together with a package name'); } $repos = $installedRepo = new InstalledRepository([new RootPackageRepository($package)]); } elseif ($input->getOption('platform')) { $repos = $installedRepo = new InstalledRepository([$platformRepo]); } elseif ($input->getOption('available')) { $installedRepo = new InstalledRepository([$platformRepo]); if ($composer) { $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $installedRepo->addRepository($composer->getRepositoryManager()->getLocalRepository()); } else { $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $repos = new CompositeRepository($defaultRepos); $io->writeError('No composer.json found in the current directory, showing available packages from ' . \implode(', ', \array_keys($defaultRepos))); } } elseif ($input->getOption('all') && $composer) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $locker = $composer->getLocker(); if ($locker->isLocked()) { $lockedRepo = $locker->getLockedRepository(\true); $installedRepo = new InstalledRepository([$lockedRepo, $localRepo, $platformRepo]); } else { $installedRepo = new InstalledRepository([$localRepo, $platformRepo]); } $repos = new CompositeRepository(\array_merge([new FilterRepository($installedRepo, ['canonical' => \false])], $composer->getRepositoryManager()->getRepositories())); } elseif ($input->getOption('all')) { $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $io->writeError('No composer.json found in the current directory, showing available packages from ' . \implode(', ', \array_keys($defaultRepos))); $installedRepo = new InstalledRepository([$platformRepo]); $repos = new CompositeRepository(\array_merge([$installedRepo], $defaultRepos)); } elseif ($input->getOption('locked')) { if (!$composer || !$composer->getLocker()->isLocked()) { throw new \UnexpectedValueException('A valid composer.json and composer.lock files is required to run this command with --locked'); } $locker = $composer->getLocker(); $lockedRepo = $locker->getLockedRepository(!$input->getOption('no-dev')); if ($input->getOption('self')) { $lockedRepo->addPackage(clone $composer->getPackage()); } $repos = $installedRepo = new InstalledRepository([$lockedRepo]); } else { // --installed / default case if (!$composer) { $composer = $this->requireComposer(); } $rootPkg = $composer->getPackage(); $rootRepo = new InstalledArrayRepository(); if ($input->getOption('self')) { $rootRepo = new RootPackageRepository(clone $rootPkg); } if ($input->getOption('no-dev')) { $packages = RepositoryUtils::filterRequiredPackages($composer->getRepositoryManager()->getLocalRepository()->getPackages(), $rootPkg); $repos = $installedRepo = new InstalledRepository([$rootRepo, new InstalledArrayRepository(\array_map(static function ($pkg) : PackageInterface { return clone $pkg; }, $packages))]); } else { $repos = $installedRepo = new InstalledRepository([$rootRepo, $composer->getRepositoryManager()->getLocalRepository()]); } if (!$installedRepo->getPackages()) { $hasNonPlatformReqs = static function (array $reqs) : bool { return (bool) \array_filter(\array_keys($reqs), function (string $name) { return !PlatformRepository::isPlatformPackage($name); }); }; if ($hasNonPlatformReqs($rootPkg->getRequires()) || $hasNonPlatformReqs($rootPkg->getDevRequires())) { $io->writeError('No dependencies installed. Try running composer install or update.'); } } } if ($composer) { $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'show', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); } if ($input->getOption('latest') && null === $composer) { $io->writeError('No composer.json found in the current directory, disabling "latest" option'); $input->setOption('latest', \false); } $packageFilter = $input->getArgument('package'); // show single package or single version if (isset($package)) { $versions = [$package->getPrettyVersion() => $package->getVersion()]; } elseif (null !== $packageFilter && !\str_contains($packageFilter, '*')) { [$package, $versions] = $this->getPackage($installedRepo, $repos, $packageFilter, $input->getArgument('version')); if (isset($package) && $input->getOption('direct')) { if (!\in_array($package->getName(), $this->getRootRequires(), \true)) { throw new \InvalidArgumentException('Package "' . $package->getName() . '" is installed but not a direct dependent of the root package.'); } } if (!isset($package)) { $options = $input->getOptions(); $hint = ''; if ($input->getOption('locked')) { $hint .= ' in lock file'; } if (isset($options['working-dir'])) { $hint .= ' in ' . $options['working-dir'] . '/composer.json'; } if (PlatformRepository::isPlatformPackage($packageFilter) && !$input->getOption('platform')) { $hint .= ', try using --platform (-p) to show platform packages'; } if (!$input->getOption('all') && !$input->getOption('available')) { $hint .= ', try using --available (-a) to show all available packages'; } throw new \InvalidArgumentException('Package "' . $packageFilter . '" not found' . $hint . '.'); } } if (isset($package)) { \assert(isset($versions)); $exitCode = 0; if ($input->getOption('tree')) { $arrayTree = $this->generatePackageTree($package, $installedRepo, $repos); if ('json' === $format) { $io->write(JsonFile::encode(['installed' => [$arrayTree]])); } else { $this->displayPackageTree([$arrayTree]); } return $exitCode; } $latestPackage = null; if ($input->getOption('latest')) { $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $input->getOption('major-only'), $input->getOption('minor-only'), $input->getOption('patch-only'), $platformReqFilter); } if ($input->getOption('outdated') && $input->getOption('strict') && null !== $latestPackage && $latestPackage->getFullPrettyVersion() !== $package->getFullPrettyVersion() && (!$latestPackage instanceof CompletePackageInterface || !$latestPackage->isAbandoned())) { $exitCode = 1; } if ($input->getOption('path')) { $io->write($package->getName(), \false); $path = $composer->getInstallationManager()->getInstallPath($package); if (\is_string($path)) { $io->write(' ' . \strtok(\realpath($path), "\r\n")); } else { $io->write(' null'); } return $exitCode; } if ('json' === $format) { $this->printPackageInfoAsJson($package, $versions, $installedRepo, $latestPackage ?: null); } else { $this->printPackageInfo($package, $versions, $installedRepo, $latestPackage ?: null); } return $exitCode; } // show tree view if requested if ($input->getOption('tree')) { $rootRequires = $this->getRootRequires(); $packages = $installedRepo->getPackages(); \usort($packages, static function (BasePackage $a, BasePackage $b) : int { return \strcmp((string) $a, (string) $b); }); $arrayTree = []; foreach ($packages as $package) { if (\in_array($package->getName(), $rootRequires, \true)) { $arrayTree[] = $this->generatePackageTree($package, $installedRepo, $repos); } } if ('json' === $format) { $io->write(JsonFile::encode(['installed' => $arrayTree])); } else { $this->displayPackageTree($arrayTree); } return 0; } // list packages /** @var array> $packages */ $packages = []; $packageFilterRegex = null; if (null !== $packageFilter) { $packageFilterRegex = '{^' . \str_replace('\\*', '.*?', \preg_quote($packageFilter)) . '$}i'; } $packageListFilter = null; if ($input->getOption('direct')) { $packageListFilter = $this->getRootRequires(); } if ($input->getOption('path') && null === $composer) { $io->writeError('No composer.json found in the current directory, disabling "path" option'); $input->setOption('path', \false); } foreach (RepositoryUtils::flattenRepositories($repos) as $repo) { if ($repo === $platformRepo) { $type = 'platform'; } elseif ($lockedRepo !== null && $repo === $lockedRepo) { $type = 'locked'; } elseif ($repo === $installedRepo || \in_array($repo, $installedRepo->getRepositories(), \true)) { $type = 'installed'; } else { $type = 'available'; } if ($repo instanceof ComposerRepository) { foreach ($repo->getPackageNames($packageFilter) as $name) { $packages[$type][$name] = $name; } } else { foreach ($repo->getPackages() as $package) { if (!isset($packages[$type][$package->getName()]) || !\is_object($packages[$type][$package->getName()]) || \version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<')) { while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } if (!$packageFilterRegex || Preg::isMatch($packageFilterRegex, $package->getName())) { if (null === $packageListFilter || \in_array($package->getName(), $packageListFilter, \true)) { $packages[$type][$package->getName()] = $package; } } } } if ($repo === $platformRepo) { foreach ($platformRepo->getDisabledPackages() as $name => $package) { $packages[$type][$name] = $package; } } } } $showAllTypes = $input->getOption('all'); $showLatest = $input->getOption('latest'); $showMajorOnly = $input->getOption('major-only'); $showMinorOnly = $input->getOption('minor-only'); $showPatchOnly = $input->getOption('patch-only'); $ignoredPackagesRegex = BasePackage::packageNamesToRegexp(\array_map('strtolower', $input->getOption('ignore'))); $indent = $showAllTypes ? ' ' : ''; /** @var PackageInterface[] $latestPackages */ $latestPackages = []; $exitCode = 0; $viewData = []; $viewMetaData = []; $writeVersion = \false; $writeDescription = \false; foreach (['platform' => \true, 'locked' => \true, 'available' => \false, 'installed' => \true] as $type => $showVersion) { if (isset($packages[$type])) { \ksort($packages[$type]); $nameLength = $versionLength = $latestLength = $releaseDateLength = 0; if ($showLatest && $showVersion) { foreach ($packages[$type] as $package) { if (\is_object($package) && !Preg::isMatch($ignoredPackagesRegex, $package->getPrettyName())) { $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $showMajorOnly, $showMinorOnly, $showPatchOnly, $platformReqFilter); if ($latestPackage === null) { continue; } $latestPackages[$package->getPrettyName()] = $latestPackage; } } } $writePath = !$input->getOption('name-only') && $input->getOption('path'); $writeVersion = !$input->getOption('name-only') && !$input->getOption('path') && $showVersion; $writeLatest = $writeVersion && $showLatest; $writeDescription = !$input->getOption('name-only') && !$input->getOption('path'); $writeReleaseDate = $writeLatest && ($input->getOption('sort-by-age') || $format === 'json'); $hasOutdatedPackages = \false; if ($input->getOption('sort-by-age')) { \usort($packages[$type], function ($a, $b) { if (\is_object($a) && \is_object($b)) { return $a->getReleaseDate() <=> $b->getReleaseDate(); } return 0; }); } $viewData[$type] = []; foreach ($packages[$type] as $package) { $packageViewData = []; if (\is_object($package)) { $latestPackage = null; if ($showLatest && isset($latestPackages[$package->getPrettyName()])) { $latestPackage = $latestPackages[$package->getPrettyName()]; } // Determine if Composer is checking outdated dependencies and if current package should trigger non-default exit code $packageIsUpToDate = $latestPackage && $latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && (!$latestPackage instanceof CompletePackageInterface || !$latestPackage->isAbandoned()); // When using --major-only, and no bigger version than current major is found then it is considered up to date $packageIsUpToDate = $packageIsUpToDate || $latestPackage === null && $showMajorOnly; $packageIsIgnored = Preg::isMatch($ignoredPackagesRegex, $package->getPrettyName()); if ($input->getOption('outdated') && ($packageIsUpToDate || $packageIsIgnored)) { continue; } if ($input->getOption('outdated') || $input->getOption('strict')) { $hasOutdatedPackages = \true; } $packageViewData['name'] = $package->getPrettyName(); $packageViewData['direct-dependency'] = \in_array($package->getName(), $this->getRootRequires(), \true); if ($format !== 'json' || \true !== $input->getOption('name-only')) { $packageViewData['homepage'] = $package instanceof CompletePackageInterface ? $package->getHomepage() : null; $packageViewData['source'] = PackageInfo::getViewSourceUrl($package); } $nameLength = \max($nameLength, \strlen($packageViewData['name'])); if ($writeVersion) { $packageViewData['version'] = $package->getFullPrettyVersion(); if ($format === 'text') { $packageViewData['version'] = \ltrim($packageViewData['version'], 'v'); } $versionLength = \max($versionLength, \strlen($packageViewData['version'])); } if ($writeReleaseDate) { if ($package->getReleaseDate() !== null) { $packageViewData['release-age'] = \str_replace(' ago', ' old', $this->getRelativeTime($package->getReleaseDate())); if (!\str_contains($packageViewData['release-age'], ' old')) { $packageViewData['release-age'] = 'from ' . $packageViewData['release-age']; } $releaseDateLength = \max($releaseDateLength, \strlen($packageViewData['release-age'])); $packageViewData['release-date'] = $package->getReleaseDate()->format(DateTimeInterface::ATOM); } else { $packageViewData['release-age'] = ''; $packageViewData['release-date'] = ''; } } if ($writeLatest && $latestPackage) { $packageViewData['latest'] = $latestPackage->getFullPrettyVersion(); if ($format === 'text') { $packageViewData['latest'] = \ltrim($packageViewData['latest'], 'v'); } $packageViewData['latest-status'] = $this->getUpdateStatus($latestPackage, $package); $latestLength = \max($latestLength, \strlen($packageViewData['latest'])); if ($latestPackage->getReleaseDate() !== null) { $packageViewData['latest-release-date'] = $latestPackage->getReleaseDate()->format(DateTimeInterface::ATOM); } else { $packageViewData['latest-release-date'] = ''; } } elseif ($writeLatest) { $packageViewData['latest'] = '[none matched]'; $packageViewData['latest-status'] = 'up-to-date'; $latestLength = \max($latestLength, \strlen($packageViewData['latest'])); } if ($writeDescription && $package instanceof CompletePackageInterface) { $packageViewData['description'] = $package->getDescription(); } if ($writePath) { $path = $composer->getInstallationManager()->getInstallPath($package); if (\is_string($path)) { $packageViewData['path'] = \strtok(\realpath($path), "\r\n"); } else { $packageViewData['path'] = null; } } $packageIsAbandoned = \false; if ($latestPackage instanceof CompletePackageInterface && $latestPackage->isAbandoned()) { $replacementPackageName = $latestPackage->getReplacementPackage(); $replacement = $replacementPackageName !== null ? 'Use ' . $latestPackage->getReplacementPackage() . ' instead' : 'No replacement was suggested'; $packageWarning = \sprintf('Package %s is abandoned, you should avoid using it. %s.', $package->getPrettyName(), $replacement); $packageViewData['warning'] = $packageWarning; $packageIsAbandoned = $replacementPackageName ?? \true; } $packageViewData['abandoned'] = $packageIsAbandoned; } else { $packageViewData['name'] = $package; $nameLength = \max($nameLength, \strlen($package)); } $viewData[$type][] = $packageViewData; } $viewMetaData[$type] = ['nameLength' => $nameLength, 'versionLength' => $versionLength, 'latestLength' => $latestLength, 'releaseDateLength' => $releaseDateLength, 'writeLatest' => $writeLatest, 'writeReleaseDate' => $writeReleaseDate]; if ($input->getOption('strict') && $hasOutdatedPackages) { $exitCode = 1; break; } } } if ('json' === $format) { $io->write(JsonFile::encode($viewData)); } else { if ($input->getOption('latest') && \array_filter($viewData)) { if (!$io->isDecorated()) { $io->writeError('Legend:'); $io->writeError('! patch or minor release available - update recommended'); $io->writeError('~ major release available - update possible'); if (!$input->getOption('outdated')) { $io->writeError('= up to date version'); } } else { $io->writeError('Color legend:'); $io->writeError('- patch or minor release available - update recommended'); $io->writeError('- major release available - update possible'); if (!$input->getOption('outdated')) { $io->writeError('- up to date version'); } } } $width = $this->getTerminalWidth(); foreach ($viewData as $type => $packages) { $nameLength = $viewMetaData[$type]['nameLength']; $versionLength = $viewMetaData[$type]['versionLength']; $latestLength = $viewMetaData[$type]['latestLength']; $releaseDateLength = $viewMetaData[$type]['releaseDateLength']; $writeLatest = $viewMetaData[$type]['writeLatest']; $writeReleaseDate = $viewMetaData[$type]['writeReleaseDate']; $versionFits = $nameLength + $versionLength + 3 <= $width; $latestFits = $nameLength + $versionLength + $latestLength + 3 <= $width; $releaseDateFits = $nameLength + $versionLength + $latestLength + $releaseDateLength + 3 <= $width; $descriptionFits = $nameLength + $versionLength + $latestLength + $releaseDateLength + 24 <= $width; if ($latestFits && !$io->isDecorated()) { $latestLength += 2; } if ($showAllTypes) { if ('available' === $type) { $io->write('' . $type . ':'); } else { $io->write('' . $type . ':'); } } if ($writeLatest && !$input->getOption('direct')) { $directDeps = []; $transitiveDeps = []; foreach ($packages as $pkg) { if ($pkg['direct-dependency'] ?? \false) { $directDeps[] = $pkg; } else { $transitiveDeps[] = $pkg; } } $io->writeError(''); $io->writeError('Direct dependencies required in composer.json:'); if (\count($directDeps) > 0) { $this->printPackages($io, $directDeps, $indent, $writeVersion && $versionFits, $latestFits, $writeDescription && $descriptionFits, $width, $versionLength, $nameLength, $latestLength, $writeReleaseDate && $releaseDateFits, $releaseDateLength); } else { $io->writeError('Everything up to date'); } $io->writeError(''); $io->writeError('Transitive dependencies not required in composer.json:'); if (\count($transitiveDeps) > 0) { $this->printPackages($io, $transitiveDeps, $indent, $writeVersion && $versionFits, $latestFits, $writeDescription && $descriptionFits, $width, $versionLength, $nameLength, $latestLength, $writeReleaseDate && $releaseDateFits, $releaseDateLength); } else { $io->writeError('Everything up to date'); } } else { if ($writeLatest && \count($packages) === 0) { $io->writeError('All your direct dependencies are up to date'); } else { $this->printPackages($io, $packages, $indent, $writeVersion && $versionFits, $writeLatest && $latestFits, $writeDescription && $descriptionFits, $width, $versionLength, $nameLength, $latestLength, $writeReleaseDate && $releaseDateFits, $releaseDateLength); } } if ($showAllTypes) { $io->write(''); } } } return $exitCode; } /** * @param array $packages */ private function printPackages(IOInterface $io, array $packages, string $indent, bool $writeVersion, bool $writeLatest, bool $writeDescription, int $width, int $versionLength, int $nameLength, int $latestLength, bool $writeReleaseDate, int $releaseDateLength) : void { $padName = $writeVersion || $writeLatest || $writeReleaseDate || $writeDescription; $padVersion = $writeLatest || $writeReleaseDate || $writeDescription; $padLatest = $writeDescription || $writeReleaseDate; $padReleaseDate = $writeDescription; foreach ($packages as $package) { $link = $package['source'] ?? $package['homepage'] ?? ''; if ($link !== '') { $io->write($indent . '' . $package['name'] . '' . \str_repeat(' ', $padName ? $nameLength - \strlen($package['name']) : 0), \false); } else { $io->write($indent . \str_pad($package['name'], $padName ? $nameLength : 0, ' '), \false); } if (isset($package['version']) && $writeVersion) { $io->write(' ' . \str_pad($package['version'], $padVersion ? $versionLength : 0, ' '), \false); } if (isset($package['latest']) && isset($package['latest-status']) && $writeLatest) { $latestVersion = $package['latest']; $updateStatus = $package['latest-status']; $style = $this->updateStatusToVersionStyle($updateStatus); if (!$io->isDecorated()) { $latestVersion = \str_replace(['up-to-date', 'semver-safe-update', 'update-possible'], ['=', '!', '~'], $updateStatus) . ' ' . $latestVersion; } $io->write(' <' . $style . '>' . \str_pad($latestVersion, $padLatest ? $latestLength : 0, ' ') . '', \false); if ($writeReleaseDate && isset($package['release-age'])) { $io->write(' ' . \str_pad($package['release-age'], $padReleaseDate ? $releaseDateLength : 0, ' '), \false); } } if (isset($package['description']) && $writeDescription) { $description = \strtok($package['description'], "\r\n"); $remaining = $width - $nameLength - $versionLength - $releaseDateLength - 4; if ($writeLatest) { $remaining -= $latestLength; } if (\strlen($description) > $remaining) { $description = \substr($description, 0, $remaining - 3) . '...'; } $io->write(' ' . $description, \false); } if (\array_key_exists('path', $package)) { $io->write(' ' . (\is_string($package['path']) ? $package['path'] : 'null'), \false); } $io->write(''); if (isset($package['warning'])) { $io->write('' . $package['warning'] . ''); } } } /** * @return string[] */ protected function getRootRequires() : array { $composer = $this->tryComposer(); if ($composer === null) { return []; } $rootPackage = $composer->getPackage(); return \array_map('strtolower', \array_keys(\array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()))); } /** * @return array|string|string[] */ protected function getVersionStyle(PackageInterface $latestPackage, PackageInterface $package) { return $this->updateStatusToVersionStyle($this->getUpdateStatus($latestPackage, $package)); } /** * finds a package by name and version if provided * * @param ConstraintInterface|string $version * @throws \InvalidArgumentException * @return array{CompletePackageInterface|null, array} */ protected function getPackage(InstalledRepository $installedRepo, RepositoryInterface $repos, string $name, $version = null) : array { $name = \strtolower($name); $constraint = \is_string($version) ? $this->versionParser->parseConstraints($version) : $version; $policy = new DefaultPolicy(); $repositorySet = new RepositorySet('dev'); $repositorySet->allowInstalledRepositories(); $repositorySet->addRepository($repos); $matchedPackage = null; $versions = []; if (PlatformRepository::isPlatformPackage($name)) { $pool = $repositorySet->createPoolWithAllPackages(); } else { $pool = $repositorySet->createPoolForPackage($name); } $matches = $pool->whatProvides($name, $constraint); $literals = []; foreach ($matches as $package) { // avoid showing the 9999999-dev alias if the default branch has no branch-alias set if ($package instanceof AliasPackage && $package->getVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { $package = $package->getAliasOf(); } // select an exact match if it is in the installed repo and no specific version was required if (null === $version && $installedRepo->hasPackage($package)) { $matchedPackage = $package; } $versions[$package->getPrettyVersion()] = $package->getVersion(); $literals[] = $package->getId(); } // select preferred package according to policy rules if (null === $matchedPackage && \count($literals) > 0) { $preferred = $policy->selectPreferredPackages($pool, $literals); $matchedPackage = $pool->literalToPackage($preferred[0]); } if ($matchedPackage !== null && !$matchedPackage instanceof CompletePackageInterface) { throw new \LogicException('ShowCommand::getPackage can only work with CompletePackageInterface, but got ' . \get_class($matchedPackage)); } return [$matchedPackage, $versions]; } /** * Prints package info. * * @param array $versions */ protected function printPackageInfo(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, ?PackageInterface $latestPackage = null) : void { $io = $this->getIO(); $this->printMeta($package, $versions, $installedRepo, $latestPackage ?: null); $this->printLinks($package, Link::TYPE_REQUIRE); $this->printLinks($package, Link::TYPE_DEV_REQUIRE, 'requires (dev)'); if ($package->getSuggests()) { $io->write("\nsuggests"); foreach ($package->getSuggests() as $suggested => $reason) { $io->write($suggested . ' ' . $reason . ''); } } $this->printLinks($package, Link::TYPE_PROVIDE); $this->printLinks($package, Link::TYPE_CONFLICT); $this->printLinks($package, Link::TYPE_REPLACE); } /** * Prints package metadata. * * @param array $versions */ protected function printMeta(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, ?PackageInterface $latestPackage = null) : void { $isInstalledPackage = !PlatformRepository::isPlatformPackage($package->getName()) && $installedRepo->hasPackage($package); $io = $this->getIO(); $io->write('name : ' . $package->getPrettyName()); $io->write('descrip. : ' . $package->getDescription()); $io->write('keywords : ' . \implode(', ', $package->getKeywords() ?: [])); $this->printVersions($package, $versions, $installedRepo); if ($isInstalledPackage && $package->getReleaseDate() !== null) { $io->write('released : ' . $package->getReleaseDate()->format('Y-m-d') . ', ' . $this->getRelativeTime($package->getReleaseDate())); } if ($latestPackage) { $style = $this->getVersionStyle($latestPackage, $package); $releasedTime = $latestPackage->getReleaseDate() === null ? '' : ' released ' . $latestPackage->getReleaseDate()->format('Y-m-d') . ', ' . $this->getRelativeTime($latestPackage->getReleaseDate()); $io->write('latest : <' . $style . '>' . $latestPackage->getPrettyVersion() . '' . $releasedTime); } else { $latestPackage = $package; } $io->write('type : ' . $package->getType()); $this->printLicenses($package); $io->write('homepage : ' . $package->getHomepage()); $io->write('source : ' . \sprintf('[%s] %s %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference())); $io->write('dist : ' . \sprintf('[%s] %s %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference())); if ($isInstalledPackage) { $path = $this->requireComposer()->getInstallationManager()->getInstallPath($package); if (\is_string($path)) { $io->write('path : ' . \realpath($path)); } else { $io->write('path : null'); } } $io->write('names : ' . \implode(', ', $package->getNames())); if ($latestPackage instanceof CompletePackageInterface && $latestPackage->isAbandoned()) { $replacement = $latestPackage->getReplacementPackage() !== null ? ' The author suggests using the ' . $latestPackage->getReplacementPackage() . ' package instead.' : null; $io->writeError(\sprintf('Attention: This package is abandoned and no longer maintained.%s', $replacement)); } if ($package->getSupport()) { $io->write("\nsupport"); foreach ($package->getSupport() as $type => $value) { $io->write('' . $type . ' : ' . $value); } } if (\count($package->getAutoload()) > 0) { $io->write("\nautoload"); $autoloadConfig = $package->getAutoload(); foreach ($autoloadConfig as $type => $autoloads) { $io->write('' . $type . ''); if ($type === 'psr-0' || $type === 'psr-4') { foreach ($autoloads as $name => $path) { $io->write(($name ?: '*') . ' => ' . (\is_array($path) ? \implode(', ', $path) : ($path ?: '.'))); } } elseif ($type === 'classmap') { $io->write(\implode(', ', $autoloadConfig[$type])); } } if ($package->getIncludePaths()) { $io->write('include-path'); $io->write(\implode(', ', $package->getIncludePaths())); } } } /** * Prints all available versions of this package and highlights the installed one if any. * * @param array $versions */ protected function printVersions(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo) : void { $versions = \array_keys($versions); $versions = Semver::rsort($versions); // highlight installed version if ($installedPackages = $installedRepo->findPackages($package->getName())) { foreach ($installedPackages as $installedPackage) { $installedVersion = $installedPackage->getPrettyVersion(); $key = \array_search($installedVersion, $versions); if (\false !== $key) { $versions[$key] = '* ' . $installedVersion . ''; } } } $versions = \implode(', ', $versions); $this->getIO()->write('versions : ' . $versions); } /** * print link objects * * @param string $title */ protected function printLinks(CompletePackageInterface $package, string $linkType, ?string $title = null) : void { $title = $title ?: $linkType; $io = $this->getIO(); if ($links = $package->{'get' . \ucfirst($linkType)}()) { $io->write("\n" . $title . ""); foreach ($links as $link) { $io->write($link->getTarget() . ' ' . $link->getPrettyConstraint() . ''); } } } /** * Prints the licenses of a package with metadata */ protected function printLicenses(CompletePackageInterface $package) : void { $spdxLicenses = new SpdxLicenses(); $licenses = $package->getLicense(); $io = $this->getIO(); foreach ($licenses as $licenseId) { $license = $spdxLicenses->getLicenseByIdentifier($licenseId); // keys: 0 fullname, 1 osi, 2 url if (!$license) { $out = $licenseId; } else { // is license OSI approved? if ($license[1] === \true) { $out = \sprintf('%s (%s) (OSI approved) %s', $license[0], $licenseId, $license[2]); } else { $out = \sprintf('%s (%s) %s', $license[0], $licenseId, $license[2]); } } $io->write('license : ' . $out); } } /** * Prints package info in JSON format. * * @param array $versions */ protected function printPackageInfoAsJson(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, ?PackageInterface $latestPackage = null) : void { $json = ['name' => $package->getPrettyName(), 'description' => $package->getDescription(), 'keywords' => $package->getKeywords() ?: [], 'type' => $package->getType(), 'homepage' => $package->getHomepage(), 'names' => $package->getNames()]; $json = $this->appendVersions($json, $versions); $json = $this->appendLicenses($json, $package); if ($latestPackage) { $json['latest'] = $latestPackage->getPrettyVersion(); } else { $latestPackage = $package; } if (null !== $package->getSourceType()) { $json['source'] = ['type' => $package->getSourceType(), 'url' => $package->getSourceUrl(), 'reference' => $package->getSourceReference()]; } if (null !== $package->getDistType()) { $json['dist'] = ['type' => $package->getDistType(), 'url' => $package->getDistUrl(), 'reference' => $package->getDistReference()]; } if (!PlatformRepository::isPlatformPackage($package->getName()) && $installedRepo->hasPackage($package)) { $path = $this->requireComposer()->getInstallationManager()->getInstallPath($package); if (\is_string($path)) { $path = \realpath($path); if ($path !== \false) { $json['path'] = $path; } } else { $json['path'] = null; } if ($package->getReleaseDate() !== null) { $json['released'] = $package->getReleaseDate()->format(\DATE_ATOM); } } if ($latestPackage instanceof CompletePackageInterface && $latestPackage->isAbandoned()) { $json['replacement'] = $latestPackage->getReplacementPackage(); } if ($package->getSuggests()) { $json['suggests'] = $package->getSuggests(); } if ($package->getSupport()) { $json['support'] = $package->getSupport(); } $json = $this->appendAutoload($json, $package); if ($package->getIncludePaths()) { $json['include_path'] = $package->getIncludePaths(); } $json = $this->appendLinks($json, $package); $this->getIO()->write(JsonFile::encode($json)); } /** * @param JsonStructure $json * @param array $versions * @return JsonStructure */ private function appendVersions(array $json, array $versions) : array { \uasort($versions, 'version_compare'); $versions = \array_keys(\array_reverse($versions)); $json['versions'] = $versions; return $json; } /** * @param JsonStructure $json * @return JsonStructure */ private function appendLicenses(array $json, CompletePackageInterface $package) : array { if ($licenses = $package->getLicense()) { $spdxLicenses = new SpdxLicenses(); $json['licenses'] = \array_map(static function ($licenseId) use($spdxLicenses) { $license = $spdxLicenses->getLicenseByIdentifier($licenseId); // keys: 0 fullname, 1 osi, 2 url if (!$license) { return $licenseId; } return ['name' => $license[0], 'osi' => $licenseId, 'url' => $license[2]]; }, $licenses); } return $json; } /** * @param JsonStructure $json * @return JsonStructure */ private function appendAutoload(array $json, CompletePackageInterface $package) : array { if (\count($package->getAutoload()) > 0) { $autoload = []; foreach ($package->getAutoload() as $type => $autoloads) { if ($type === 'psr-0' || $type === 'psr-4') { $psr = []; foreach ($autoloads as $name => $path) { if (!$path) { $path = '.'; } $psr[$name ?: '*'] = $path; } $autoload[$type] = $psr; } elseif ($type === 'classmap') { $autoload['classmap'] = $autoloads; } } $json['autoload'] = $autoload; } return $json; } /** * @param JsonStructure $json * @return JsonStructure */ private function appendLinks(array $json, CompletePackageInterface $package) : array { foreach (Link::$TYPES as $linkType) { $json = $this->appendLink($json, $package, $linkType); } return $json; } /** * @param JsonStructure $json * @return JsonStructure */ private function appendLink(array $json, CompletePackageInterface $package, string $linkType) : array { $links = $package->{'get' . \ucfirst($linkType)}(); if ($links) { $json[$linkType] = []; foreach ($links as $link) { $json[$linkType][$link->getTarget()] = $link->getPrettyConstraint(); } } return $json; } /** * Init styles for tree */ protected function initStyles(OutputInterface $output) : void { $this->colors = ['green', 'yellow', 'cyan', 'magenta', 'blue']; foreach ($this->colors as $color) { $style = new OutputFormatterStyle($color); $output->getFormatter()->setStyle($color, $style); } } /** * Display the tree * * @param array> $arrayTree */ protected function displayPackageTree(array $arrayTree) : void { $io = $this->getIO(); foreach ($arrayTree as $package) { $io->write(\sprintf('%s', $package['name']), \false); $io->write(' ' . $package['version'], \false); if (isset($package['description'])) { $io->write(' ' . \strtok($package['description'], "\r\n")); } else { // output newline $io->write(''); } if (isset($package['requires'])) { $requires = $package['requires']; $treeBar = '├'; $j = 0; $total = \count($requires); foreach ($requires as $require) { $requireName = $require['name']; $j++; if ($j === $total) { $treeBar = 'â””'; } $level = 1; $color = $this->colors[$level]; $info = \sprintf('%s──<%s>%s %s', $treeBar, $color, $requireName, $color, $require['version']); $this->writeTreeLine($info); $treeBar = \str_replace('â””', ' ', $treeBar); $packagesInTree = [$package['name'], $requireName]; $this->displayTree($require, $packagesInTree, $treeBar, $level + 1); } } } } /** * Generate the package tree * * @return array>|string|null> */ protected function generatePackageTree(PackageInterface $package, InstalledRepository $installedRepo, RepositoryInterface $remoteRepos) : array { $requires = $package->getRequires(); \ksort($requires); $children = []; foreach ($requires as $requireName => $require) { $packagesInTree = [$package->getName(), $requireName]; $treeChildDesc = ['name' => $requireName, 'version' => $require->getPrettyConstraint()]; $deepChildren = $this->addTree($requireName, $require, $installedRepo, $remoteRepos, $packagesInTree); if ($deepChildren) { $treeChildDesc['requires'] = $deepChildren; } $children[] = $treeChildDesc; } $tree = ['name' => $package->getPrettyName(), 'version' => $package->getPrettyVersion(), 'description' => $package instanceof CompletePackageInterface ? $package->getDescription() : '']; if ($children) { $tree['requires'] = $children; } return $tree; } /** * Display a package tree * * @param array>|string|null>|string $package * @param array $packagesInTree */ protected function displayTree($package, array $packagesInTree, string $previousTreeBar = '├', int $level = 1) : void { $previousTreeBar = \str_replace('├', '│', $previousTreeBar); if (\is_array($package) && isset($package['requires'])) { $requires = $package['requires']; $treeBar = $previousTreeBar . ' ├'; $i = 0; $total = \count($requires); foreach ($requires as $require) { $currentTree = $packagesInTree; $i++; if ($i === $total) { $treeBar = $previousTreeBar . ' â””'; } $colorIdent = $level % \count($this->colors); $color = $this->colors[$colorIdent]; \assert(\is_string($require['name'])); \assert(\is_string($require['version'])); $circularWarn = \in_array($require['name'], $currentTree, \true) ? '(circular dependency aborted here)' : ''; $info = \rtrim(\sprintf('%s──<%s>%s %s %s', $treeBar, $color, $require['name'], $color, $require['version'], $circularWarn)); $this->writeTreeLine($info); $treeBar = \str_replace('â””', ' ', $treeBar); $currentTree[] = $require['name']; $this->displayTree($require, $currentTree, $treeBar, $level + 1); } } } /** * Display a package tree * * @param string[] $packagesInTree * @return array>|string>> */ protected function addTree(string $name, Link $link, InstalledRepository $installedRepo, RepositoryInterface $remoteRepos, array $packagesInTree) : array { $children = []; [$package] = $this->getPackage($installedRepo, $remoteRepos, $name, $link->getPrettyConstraint() === 'self.version' ? $link->getConstraint() : $link->getPrettyConstraint()); if (\is_object($package)) { $requires = $package->getRequires(); \ksort($requires); foreach ($requires as $requireName => $require) { $currentTree = $packagesInTree; $treeChildDesc = ['name' => $requireName, 'version' => $require->getPrettyConstraint()]; if (!\in_array($requireName, $currentTree, \true)) { $currentTree[] = $requireName; $deepChildren = $this->addTree($requireName, $require, $installedRepo, $remoteRepos, $currentTree); if ($deepChildren) { $treeChildDesc['requires'] = $deepChildren; } } $children[] = $treeChildDesc; } } return $children; } private function updateStatusToVersionStyle(string $updateStatus) : string { // 'up-to-date' is printed green // 'semver-safe-update' is printed red // 'update-possible' is printed yellow return \str_replace(['up-to-date', 'semver-safe-update', 'update-possible'], ['info', 'highlight', 'comment'], $updateStatus); } private function getUpdateStatus(PackageInterface $latestPackage, PackageInterface $package) : string { if ($latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion()) { return 'up-to-date'; } $constraint = $package->getVersion(); if (0 !== \strpos($constraint, 'dev-')) { $constraint = '^' . $constraint; } if ($latestPackage->getVersion() && Semver::satisfies($latestPackage->getVersion(), $constraint)) { // it needs an immediate semver-compliant upgrade return 'semver-safe-update'; } // it needs an upgrade but has potential BC breaks so is not urgent return 'update-possible'; } private function writeTreeLine(string $line) : void { $io = $this->getIO(); if (!$io->isDecorated()) { $line = \str_replace(['â””', '├', '──', '│'], ['`-', '|-', '-', '|'], $line); } $io->write($line); } /** * Given a package, this finds the latest package matching it */ private function findLatestPackage(PackageInterface $package, Composer $composer, PlatformRepository $platformRepo, bool $majorOnly, bool $minorOnly, bool $patchOnly, PlatformRequirementFilterInterface $platformReqFilter) : ?PackageInterface { // find the latest version allowed in this repo set $name = $package->getName(); $versionSelector = new VersionSelector($this->getRepositorySet($composer), $platformRepo); $stability = $composer->getPackage()->getMinimumStability(); $flags = $composer->getPackage()->getStabilityFlags(); if (isset($flags[$name])) { $stability = \array_search($flags[$name], BasePackage::STABILITIES, \true); } $bestStability = $stability; if ($composer->getPackage()->getPreferStable()) { $bestStability = $package->getStability(); } $targetVersion = null; if (0 === \strpos($package->getVersion(), 'dev-')) { $targetVersion = $package->getVersion(); // dev-x branches are considered to be on the latest major version always, do not look up for a new commit as that is deemed a minor upgrade (albeit risky) if ($majorOnly) { return null; } } if ($targetVersion === null) { if ($majorOnly && Preg::isMatch('{^(?P(?:0\\.)+)?(?P\\d+)\\.}', $package->getVersion(), $match)) { $targetVersion = '>=' . $match['zero_major'] . ((int) $match['first_meaningful'] + 1) . ',<9999999-dev'; } if ($minorOnly) { $targetVersion = '^' . $package->getVersion(); } if ($patchOnly) { $trimmedVersion = Preg::replace('{(\\.0)+$}D', '', $package->getVersion()); $partsNeeded = \substr($trimmedVersion, 0, 1) === '0' ? 4 : 3; while (\substr_count($trimmedVersion, '.') + 1 < $partsNeeded) { $trimmedVersion .= '.0'; } $targetVersion = '~' . $trimmedVersion; } } if ($this->getIO()->isVerbose()) { $showWarnings = \true; } else { $showWarnings = static function (PackageInterface $candidate) use($package) : bool { if (\str_starts_with($candidate->getVersion(), 'dev-') || \str_starts_with($package->getVersion(), 'dev-')) { return \false; } return \version_compare($candidate->getVersion(), $package->getVersion(), '<='); }; } $candidate = $versionSelector->findBestCandidate($name, $targetVersion, $bestStability, $platformReqFilter, 0, $this->getIO(), $showWarnings); while ($candidate instanceof AliasPackage) { $candidate = $candidate->getAliasOf(); } return $candidate !== \false ? $candidate : null; } private function getRepositorySet(Composer $composer) : RepositorySet { if (!$this->repositorySet) { $this->repositorySet = new RepositorySet($composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags()); $this->repositorySet->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories())); } return $this->repositorySet; } private function getRelativeTime(\DateTimeInterface $releaseDate) : string { if ($releaseDate->format('Ymd') === \date('Ymd')) { return 'today'; } $diff = $releaseDate->diff(new \DateTimeImmutable()); if ($diff->days < 7) { return 'this week'; } if ($diff->days < 14) { return 'last week'; } if ($diff->m < 1 && $diff->days < 31) { return \floor($diff->days / 7) . ' weeks ago'; } if ($diff->y < 1) { return $diff->m . ' month' . ($diff->m > 1 ? 's' : '') . ' ago'; } return $diff->y . ' year' . ($diff->y > 1 ? 's' : '') . ' ago'; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Installer; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Advisory\Auditor; use Composer\Util\HttpDownloader; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano * @author Ryan Weaver * @author Konstantin Kudryashov * @author Nils Adermann */ class InstallCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; /** * @return void */ protected function configure() { $this->setName('install')->setAliases(['i'])->setDescription('Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json')->setDefinition([new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('download-only', null, InputOption::VALUE_NONE, 'Download only, do not install packages.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'DEPRECATED: Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Do not use, only defined here to catch misuse of the install command.'), new InputOption('audit', null, InputOption::VALUE_NONE, 'Run an audit after installation is complete.'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.')])->setHelp(<<install command reads the composer.lock file from the current directory, processes it, and downloads and installs all the libraries and dependencies outlined in that file. If the file does not exist it will look for composer.json and do the same. php composer.phar install Read more at https://getcomposer.org/doc/03-cli.md#install-i EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $io = $this->getIO(); if ($input->getOption('dev')) { $io->writeError('You are using the deprecated option "--dev". It has no effect and will break in Composer 3.'); } if ($input->getOption('no-suggest')) { $io->writeError('You are using the deprecated option "--no-suggest". It has no effect and will break in Composer 3.'); } $args = $input->getArgument('packages'); if (\count($args) > 0) { $io->writeError('Invalid argument ' . \implode(' ', $args) . '. Use "composer require ' . \implode(' ', $args) . '" instead to add packages to your composer.json.'); return 1; } if ($input->getOption('no-install')) { $io->writeError('Invalid option "--no-install". Use "composer update --no-install" instead if you are trying to update the composer.lock file.'); return 1; } $composer = $this->requireComposer(); if (!$composer->getLocker()->isLocked() && !HttpDownloader::isCurlEnabled()) { $io->writeError('Composer is operating significantly slower than normal because you do not have the PHP curl extension enabled.'); } $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $config = $composer->getConfig(); [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcuPrefix = $input->getOption('apcu-autoloader-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu-autoloader') || $config->get('apcu-autoloader'); $composer->getInstallationManager()->setOutputProgress(!$input->getOption('no-progress')); $install->setDryRun($input->getOption('dry-run'))->setDownloadOnly($input->getOption('download-only'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$input->getOption('no-dev'))->setDumpAutoloader(!$input->getOption('no-autoloader'))->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setApcuAutoloader($apcu, $apcuPrefix)->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input))->setAudit($input->getOption('audit'))->setErrorOnAudit($input->getOption('audit'))->setAuditFormat($this->getAuditFormat($input)); if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\Json\JsonFile; use Composer\Json\JsonValidationException; use Composer\Package\BasePackage; use Composer\Package\Package; use Composer\Pcre\Preg; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Spdx\SpdxLicenses; use Composer\Util\Filesystem; use Composer\Util\Silencer; use _ContaoManager\Symfony\Component\Console\Input\ArrayInput; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Util\ProcessExecutor; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; use _ContaoManager\Symfony\Component\Process\Process; use _ContaoManager\Symfony\Component\Console\Helper\FormatterHelper; /** * @author Justin Rainbow * @author Jordi Boggiano */ class InitCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; use \Composer\Command\PackageDiscoveryTrait; /** @var array */ private $gitConfig; /** * @inheritDoc * * @return void */ protected function configure() { $this->setName('init')->setDescription('Creates a basic composer.json file in current directory')->setDefinition([new InputOption('name', null, InputOption::VALUE_REQUIRED, 'Name of the package'), new InputOption('description', null, InputOption::VALUE_REQUIRED, 'Description of package'), new InputOption('author', null, InputOption::VALUE_REQUIRED, 'Author name of package'), new InputOption('type', null, InputOption::VALUE_REQUIRED, 'Type of package (e.g. library, project, metapackage, composer-plugin)'), new InputOption('homepage', null, InputOption::VALUE_REQUIRED, 'Homepage of package'), new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('require-dev', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require for development with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum stability (empty or one of: ' . \implode(', ', \array_keys(BasePackage::STABILITIES)) . ')'), new InputOption('license', 'l', InputOption::VALUE_REQUIRED, 'License of package'), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories, either by URL or using JSON arrays'), new InputOption('autoload', 'a', InputOption::VALUE_REQUIRED, 'Add PSR-4 autoload mapping. Maps your package\'s namespace to the provided directory. (Expects a relative path, e.g. src/)')])->setHelp(<<init command creates a basic composer.json file in the current directory. php composer.phar init Read more at https://getcomposer.org/doc/03-cli.md#init EOT ); } /** * @throws \Seld\JsonLint\ParsingException */ protected function execute(InputInterface $input, OutputInterface $output) : int { $io = $this->getIO(); $allowlist = ['name', 'description', 'author', 'type', 'homepage', 'require', 'require-dev', 'stability', 'license', 'autoload']; $options = \array_filter(\array_intersect_key($input->getOptions(), \array_flip($allowlist)), function ($val) { return $val !== null && $val !== []; }); if (isset($options['name']) && !Preg::isMatch('{^[a-z0-9]([_.-]?[a-z0-9]+)*\\/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$}D', $options['name'])) { throw new \InvalidArgumentException('The package name ' . $options['name'] . ' is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+'); } if (isset($options['author'])) { $options['authors'] = $this->formatAuthors($options['author']); unset($options['author']); } $repositories = $input->getOption('repository'); if (\count($repositories) > 0) { $config = Factory::createConfig($io); foreach ($repositories as $repo) { $options['repositories'][] = RepositoryFactory::configFromString($io, $config, $repo, \true); } } if (isset($options['stability'])) { $options['minimum-stability'] = $options['stability']; unset($options['stability']); } $options['require'] = isset($options['require']) ? $this->formatRequirements($options['require']) : new \stdClass(); if ([] === $options['require']) { $options['require'] = new \stdClass(); } if (isset($options['require-dev'])) { $options['require-dev'] = $this->formatRequirements($options['require-dev']); if ([] === $options['require-dev']) { $options['require-dev'] = new \stdClass(); } } // --autoload - create autoload object $autoloadPath = null; if (isset($options['autoload'])) { $autoloadPath = $options['autoload']; $namespace = $this->namespaceFromPackageName((string) $input->getOption('name')); $options['autoload'] = (object) ['psr-4' => [$namespace . '\\' => $autoloadPath]]; } $file = new JsonFile(Factory::getComposerFile()); $json = JsonFile::encode($options); if ($input->isInteractive()) { $io->writeError(['', $json, '']); if (!$io->askConfirmation('Do you confirm generation [yes]? ')) { $io->writeError('Command aborted'); return 1; } } else { if (\json_encode($options) === '{"require":{}}') { throw new \RuntimeException('You have to run this command in interactive mode, or specify at least some data using --name, --require, etc.'); } $io->writeError('Writing ' . $file->getPath()); } $file->write($options); try { $file->validateSchema(JsonFile::LAX_SCHEMA); } catch (JsonValidationException $e) { $io->writeError('Schema validation error, aborting'); $errors = ' - ' . \implode(\PHP_EOL . ' - ', $e->getErrors()); $io->writeError($e->getMessage() . ':' . \PHP_EOL . $errors); Silencer::call('unlink', $file->getPath()); return 1; } // --autoload - Create src folder if ($autoloadPath) { $filesystem = new Filesystem(); $filesystem->ensureDirectoryExists($autoloadPath); // dump-autoload only for projects without added dependencies. if (!$this->hasDependencies($options)) { $this->runDumpAutoloadCommand($output); } } if ($input->isInteractive() && \is_dir('.git')) { $ignoreFile = \realpath('.gitignore'); if (\false === $ignoreFile) { $ignoreFile = \realpath('.') . '/.gitignore'; } if (!$this->hasVendorIgnore($ignoreFile)) { $question = 'Would you like the vendor directory added to your .gitignore [yes]? '; if ($io->askConfirmation($question)) { $this->addVendorIgnore($ignoreFile); } } } $question = 'Would you like to install dependencies now [yes]? '; if ($input->isInteractive() && $this->hasDependencies($options) && $io->askConfirmation($question)) { $this->updateDependencies($output); } // --autoload - Show post-install configuration info if ($autoloadPath) { $namespace = $this->namespaceFromPackageName((string) $input->getOption('name')); $io->writeError('PSR-4 autoloading configured. Use "namespace ' . $namespace . ';" in ' . $autoloadPath); $io->writeError('Include the Composer autoloader with: require \'vendor/autoload.php\';'); } return 0; } /** * @inheritDoc * * @return void */ protected function interact(InputInterface $input, OutputInterface $output) { $git = $this->getGitConfig(); $io = $this->getIO(); /** @var FormatterHelper $formatter */ $formatter = $this->getHelperSet()->get('formatter'); // initialize repos if configured $repositories = $input->getOption('repository'); if (\count($repositories) > 0) { $config = Factory::createConfig($io); $io->loadConfiguration($config); $repoManager = RepositoryFactory::manager($io, $config); $repos = [new PlatformRepository()]; $createDefaultPackagistRepo = \true; foreach ($repositories as $repo) { $repoConfig = RepositoryFactory::configFromString($io, $config, $repo, \true); if (isset($repoConfig['packagist']) && $repoConfig === ['packagist' => \false] || isset($repoConfig['packagist.org']) && $repoConfig === ['packagist.org' => \false]) { $createDefaultPackagistRepo = \false; continue; } $repos[] = RepositoryFactory::createRepo($io, $config, $repoConfig, $repoManager); } if ($createDefaultPackagistRepo) { $repos[] = RepositoryFactory::createRepo($io, $config, ['type' => 'composer', 'url' => 'https://repo.packagist.org'], $repoManager); } $this->repos = new CompositeRepository($repos); unset($repos, $config, $repositories); } $io->writeError(['', $formatter->formatBlock('Welcome to the Composer config generator', 'bg=blue;fg=white', \true), '']); // namespace $io->writeError(['', 'This command will guide you through creating your composer.json config.', '']); $cwd = \realpath("."); $name = $input->getOption('name'); if (null === $name) { $name = \basename($cwd); $name = $this->sanitizePackageNameComponent($name); $vendor = $name; if (!empty($_SERVER['COMPOSER_DEFAULT_VENDOR'])) { $vendor = $_SERVER['COMPOSER_DEFAULT_VENDOR']; } elseif (isset($git['github.user'])) { $vendor = $git['github.user']; } elseif (!empty($_SERVER['USERNAME'])) { $vendor = $_SERVER['USERNAME']; } elseif (!empty($_SERVER['USER'])) { $vendor = $_SERVER['USER']; } elseif (\get_current_user()) { $vendor = \get_current_user(); } $vendor = $this->sanitizePackageNameComponent($vendor); $name = $vendor . '/' . $name; } $name = $io->askAndValidate('Package name (/) [' . $name . ']: ', static function ($value) use($name) { if (null === $value) { return $name; } if (!Preg::isMatch('{^[a-z0-9]([_.-]?[a-z0-9]+)*\\/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$}D', $value)) { throw new \InvalidArgumentException('The package name ' . $value . ' is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+'); } return $value; }, null, $name); $input->setOption('name', $name); $description = $input->getOption('description') ?: null; $description = $io->ask('Description [' . $description . ']: ', $description); $input->setOption('description', $description); if (null === ($author = $input->getOption('author'))) { if (!empty($_SERVER['COMPOSER_DEFAULT_AUTHOR'])) { $author_name = $_SERVER['COMPOSER_DEFAULT_AUTHOR']; } elseif (isset($git['user.name'])) { $author_name = $git['user.name']; } if (!empty($_SERVER['COMPOSER_DEFAULT_EMAIL'])) { $author_email = $_SERVER['COMPOSER_DEFAULT_EMAIL']; } elseif (isset($git['user.email'])) { $author_email = $git['user.email']; } if (isset($author_name, $author_email)) { $author = \sprintf('%s <%s>', $author_name, $author_email); } } $author = $io->askAndValidate('Author [' . (\is_string($author) ? '' . $author . ', ' : '') . 'n to skip]: ', function ($value) use($author) { if ($value === 'n' || $value === 'no') { return; } $value = $value ?: $author; $author = $this->parseAuthorString($value ?? ''); if ($author['email'] === null) { return $author['name']; } return \sprintf('%s <%s>', $author['name'], $author['email']); }, null, $author); $input->setOption('author', $author); $minimumStability = $input->getOption('stability') ?: null; $minimumStability = $io->askAndValidate('Minimum Stability [' . $minimumStability . ']: ', static function ($value) use($minimumStability) { if (null === $value) { return $minimumStability; } if (!isset(BasePackage::STABILITIES[$value])) { throw new \InvalidArgumentException('Invalid minimum stability "' . $value . '". Must be empty or one of: ' . \implode(', ', \array_keys(BasePackage::STABILITIES))); } return $value; }, null, $minimumStability); $input->setOption('stability', $minimumStability); $type = $input->getOption('type'); $type = $io->ask('Package Type (e.g. library, project, metapackage, composer-plugin) [' . $type . ']: ', $type); if ($type === '' || $type === \false) { $type = null; } $input->setOption('type', $type); if (null === ($license = $input->getOption('license'))) { if (!empty($_SERVER['COMPOSER_DEFAULT_LICENSE'])) { $license = $_SERVER['COMPOSER_DEFAULT_LICENSE']; } } $license = $io->ask('License [' . $license . ']: ', $license); $spdx = new SpdxLicenses(); if (null !== $license && !$spdx->validate($license) && $license !== 'proprietary') { throw new \InvalidArgumentException('Invalid license provided: ' . $license . '. Only SPDX license identifiers (https://spdx.org/licenses/) or "proprietary" are accepted.'); } $input->setOption('license', $license); $io->writeError(['', 'Define your dependencies.', '']); // prepare to resolve dependencies $repos = $this->getRepos(); $preferredStability = $minimumStability ?: 'stable'; $platformRepo = null; if ($repos instanceof CompositeRepository) { foreach ($repos->getRepositories() as $candidateRepo) { if ($candidateRepo instanceof PlatformRepository) { $platformRepo = $candidateRepo; break; } } } $question = 'Would you like to define your dependencies (require) interactively [yes]? '; $require = $input->getOption('require'); $requirements = []; if (\count($require) > 0 || $io->askConfirmation($question)) { $requirements = $this->determineRequirements($input, $output, $require, $platformRepo, $preferredStability); } $input->setOption('require', $requirements); $question = 'Would you like to define your dev dependencies (require-dev) interactively [yes]? '; $requireDev = $input->getOption('require-dev'); $devRequirements = []; if (\count($requireDev) > 0 || $io->askConfirmation($question)) { $devRequirements = $this->determineRequirements($input, $output, $requireDev, $platformRepo, $preferredStability); } $input->setOption('require-dev', $devRequirements); // --autoload - input and validation $autoload = $input->getOption('autoload') ?: 'src/'; $namespace = $this->namespaceFromPackageName((string) $input->getOption('name')); $autoload = $io->askAndValidate('Add PSR-4 autoload mapping? Maps namespace "' . $namespace . '" to the entered relative path. [' . $autoload . ', n to skip]: ', static function ($value) use($autoload) { if (null === $value) { return $autoload; } if ($value === 'n' || $value === 'no') { return; } $value = $value ?: $autoload; if (!Preg::isMatch('{^[^/][A-Za-z0-9\\-_/]+/$}', $value)) { throw new \InvalidArgumentException(\sprintf('The src folder name "%s" is invalid. Please add a relative path with tailing forward slash. [A-Za-z0-9_-/]+/', $value)); } return $value; }, null, $autoload); $input->setOption('autoload', $autoload); } /** * @return array{name: string, email: string|null} */ private function parseAuthorString(string $author) : array { if (Preg::isMatch('/^(?P[- .,\\p{L}\\p{N}\\p{Mn}\'’"()]+)(?:\\s+<(?P.+?)>)?$/u', $author, $match)) { if (null !== $match['email'] && !$this->isValidEmail($match['email'])) { throw new \InvalidArgumentException('Invalid email "' . $match['email'] . '"'); } return ['name' => \trim($match['name']), 'email' => $match['email']]; } throw new \InvalidArgumentException('Invalid author string. Must be in the formats: ' . 'Jane Doe or John Smith '); } /** * @return array */ protected function formatAuthors(string $author) : array { $author = $this->parseAuthorString($author); if (null === $author['email']) { unset($author['email']); } return [$author]; } /** * Extract namespace from package's vendor name. * * new_projects.acme-extra/package-name becomes "NewProjectsAcmeExtra\PackageName" */ public function namespaceFromPackageName(string $packageName) : ?string { if (!$packageName || \strpos($packageName, '/') === \false) { return null; } $namespace = \array_map(static function ($part) : string { $part = Preg::replace('/[^a-z0-9]/i', ' ', $part); $part = \ucwords($part); return \str_replace(' ', '', $part); }, \explode('/', $packageName)); return \implode('\\', $namespace); } /** * @return array */ protected function getGitConfig() : array { if (null !== $this->gitConfig) { return $this->gitConfig; } $process = new ProcessExecutor($this->getIO()); if (0 === $process->execute(['git', 'config', '-l'], $output)) { $this->gitConfig = []; Preg::matchAllStrictGroups('{^([^=]+)=(.*)$}m', $output, $matches); foreach ($matches[1] as $key => $match) { $this->gitConfig[$match] = $matches[2][$key]; } return $this->gitConfig; } return $this->gitConfig = []; } /** * Checks the local .gitignore file for the Composer vendor directory. * * Tested patterns include: * "/$vendor" * "$vendor" * "$vendor/" * "/$vendor/" * "/$vendor/*" * "$vendor/*" */ protected function hasVendorIgnore(string $ignoreFile, string $vendor = 'vendor') : bool { if (!\file_exists($ignoreFile)) { return \false; } $pattern = \sprintf('{^/?%s(/\\*?)?$}', \preg_quote($vendor)); $lines = \file($ignoreFile, \FILE_IGNORE_NEW_LINES); foreach ($lines as $line) { if (Preg::isMatch($pattern, $line)) { return \true; } } return \false; } protected function addVendorIgnore(string $ignoreFile, string $vendor = '/vendor/') : void { $contents = ""; if (\file_exists($ignoreFile)) { $contents = \file_get_contents($ignoreFile); if (\strpos($contents, "\n") !== 0) { $contents .= "\n"; } } \file_put_contents($ignoreFile, $contents . $vendor . "\n"); } protected function isValidEmail(string $email) : bool { // assume it's valid if we can't validate it if (!\function_exists('filter_var')) { return \true; } return \false !== \filter_var($email, \FILTER_VALIDATE_EMAIL); } private function updateDependencies(OutputInterface $output) : void { try { $updateCommand = $this->getApplication()->find('update'); $this->getApplication()->resetComposer(); $updateCommand->run(new ArrayInput([]), $output); } catch (\Exception $e) { $this->getIO()->writeError('Could not update dependencies. Run `composer update` to see more information.'); } } private function runDumpAutoloadCommand(OutputInterface $output) : void { try { $command = $this->getApplication()->find('dump-autoload'); $this->getApplication()->resetComposer(); $command->run(new ArrayInput([]), $output); } catch (\Exception $e) { $this->getIO()->writeError('Could not run dump-autoload.'); } } /** * @param array> $options */ private function hasDependencies(array $options) : bool { $requires = (array) $options['require']; $devRequires = isset($options['require-dev']) ? (array) $options['require-dev'] : []; return !empty($requires) || !empty($devRequires); } private function sanitizePackageNameComponent(string $name) : string { $name = Preg::replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '_ContaoManager\\1\\3-\\2\\4', $name); $name = \strtolower($name); $name = Preg::replace('{^[_.-]+|[_.-]+$|[^a-z0-9_.-]}u', '', $name); $name = Preg::replace('{([_.-]){2,}}u', '$1', $name); return $name; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Script\Event as ScriptEvent; use Composer\Script\ScriptEvents; use Composer\Util\ProcessExecutor; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Fabien Potencier */ class RunScriptCommand extends \Composer\Command\BaseCommand { /** * @var string[] Array with command events */ protected $scriptEvents = [ScriptEvents::PRE_INSTALL_CMD, ScriptEvents::POST_INSTALL_CMD, ScriptEvents::PRE_UPDATE_CMD, ScriptEvents::POST_UPDATE_CMD, ScriptEvents::PRE_STATUS_CMD, ScriptEvents::POST_STATUS_CMD, ScriptEvents::POST_ROOT_PACKAGE_INSTALL, ScriptEvents::POST_CREATE_PROJECT_CMD, ScriptEvents::PRE_ARCHIVE_CMD, ScriptEvents::POST_ARCHIVE_CMD, ScriptEvents::PRE_AUTOLOAD_DUMP, ScriptEvents::POST_AUTOLOAD_DUMP]; protected function configure() : void { $this->setName('run-script')->setAliases(['run'])->setDescription('Runs the scripts defined in composer.json')->setDefinition([new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.', null, function () { return \array_map(static function ($script) { return $script['name']; }, $this->getScripts()); }), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), new InputOption('timeout', null, InputOption::VALUE_REQUIRED, 'Sets script timeout in seconds, or 0 for never.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'), new InputOption('list', 'l', InputOption::VALUE_NONE, 'List scripts.')])->setHelp(<<run-script command runs scripts defined in composer.json: php composer.phar run-script post-update-cmd Read more at https://getcomposer.org/doc/03-cli.md#run-script-run EOT ); } protected function interact(InputInterface $input, OutputInterface $output) : void { $scripts = $this->getScripts(); if (\count($scripts) === 0) { return; } if ($input->getArgument('script') !== null || $input->getOption('list')) { return; } $options = []; foreach ($scripts as $script) { $options[$script['name']] = $script['description']; } $io = $this->getIO(); $script = $io->select('Script to run: ', $options, '', 1, 'Invalid script name "%s"'); $input->setArgument('script', $script); } protected function execute(InputInterface $input, OutputInterface $output) : int { if ($input->getOption('list')) { return $this->listScripts($output); } $script = $input->getArgument('script'); if ($script === null) { throw new \RuntimeException('Missing required argument "script"'); } if (!\in_array($script, $this->scriptEvents)) { if (\defined('Composer\\Script\\ScriptEvents::' . \str_replace('-', '_', \strtoupper($script)))) { throw new \InvalidArgumentException(\sprintf('Script "%s" cannot be run with this command', $script)); } } $composer = $this->requireComposer(); $devMode = $input->getOption('dev') || !$input->getOption('no-dev'); $event = new ScriptEvent($script, $composer, $this->getIO(), $devMode); $hasListeners = $composer->getEventDispatcher()->hasEventListeners($event); if (!$hasListeners) { throw new \InvalidArgumentException(\sprintf('Script "%s" is not defined in this package', $script)); } $args = $input->getArgument('args'); if (null !== ($timeout = $input->getOption('timeout'))) { if (!\ctype_digit($timeout)) { throw new \RuntimeException('Timeout value must be numeric and positive if defined, or 0 for forever'); } // Override global timeout set before in Composer by environment or config ProcessExecutor::setTimeout((int) $timeout); } Platform::putEnv('COMPOSER_DEV_MODE', $devMode ? '1' : '0'); return $composer->getEventDispatcher()->dispatchScript($script, $devMode, $args); } protected function listScripts(OutputInterface $output) : int { $scripts = $this->getScripts(); if (\count($scripts) === 0) { return 0; } $io = $this->getIO(); $io->writeError('scripts:'); $table = []; foreach ($scripts as $script) { $table[] = [' ' . $script['name'], $script['description']]; } $this->renderTable($table, $output); return 0; } /** * @return list */ private function getScripts() : array { $scripts = $this->requireComposer()->getPackage()->getScripts(); if (\count($scripts) === 0) { return []; } $result = []; foreach ($scripts as $name => $script) { $description = ''; try { $cmd = $this->getApplication()->find($name); if ($cmd instanceof \Composer\Command\ScriptAliasCommand) { $description = $cmd->getDescription(); } } catch (\_ContaoManager\Symfony\Component\Console\Exception\CommandNotFoundException $e) { // ignore scripts that have no command associated, like native Composer script listeners } $result[] = ['name' => $name, 'description' => $description]; } return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Advisory\Auditor; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\Silencer; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; use _ContaoManager\Symfony\Component\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Config; use Composer\Config\JsonConfigSource; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Semver\VersionParser; use Composer\Package\BasePackage; /** * @author Joshua Estes * @author Jordi Boggiano */ class ConfigCommand extends \Composer\Command\BaseCommand { /** * List of additional configurable package-properties * * @var string[] */ protected const CONFIGURABLE_PACKAGE_PROPERTIES = ['name', 'type', 'description', 'homepage', 'version', 'minimum-stability', 'prefer-stable', 'keywords', 'license', 'repositories', 'suggest', 'extra']; /** * @var Config */ protected $config; /** * @var JsonFile */ protected $configFile; /** * @var JsonConfigSource */ protected $configSource; /** * @var JsonFile */ protected $authConfigFile; /** * @var JsonConfigSource */ protected $authConfigSource; protected function configure() : void { $this->setName('config')->setDescription('Sets config options')->setDefinition([new InputOption('global', 'g', InputOption::VALUE_NONE, 'Apply command to the global config file'), new InputOption('editor', 'e', InputOption::VALUE_NONE, 'Open editor'), new InputOption('auth', 'a', InputOption::VALUE_NONE, 'Affect auth config file (only used for --editor)'), new InputOption('unset', null, InputOption::VALUE_NONE, 'Unset the given setting-key'), new InputOption('list', 'l', InputOption::VALUE_NONE, 'List configuration settings'), new InputOption('file', 'f', InputOption::VALUE_REQUIRED, 'If you want to choose a different composer.json or config.json'), new InputOption('absolute', null, InputOption::VALUE_NONE, 'Returns absolute paths when fetching *-dir config values instead of relative'), new InputOption('json', 'j', InputOption::VALUE_NONE, 'JSON decode the setting value, to be used with extra.* keys'), new InputOption('merge', 'm', InputOption::VALUE_NONE, 'Merge the setting value with the current value, to be used with extra.* keys in combination with --json'), new InputOption('append', null, InputOption::VALUE_NONE, 'When adding a repository, append it (lowest priority) to the existing ones instead of prepending it (highest priority)'), new InputOption('source', null, InputOption::VALUE_NONE, 'Display where the config value is loaded from'), new InputArgument('setting-key', null, 'Setting key', null, $this->suggestSettingKeys()), new InputArgument('setting-value', InputArgument::IS_ARRAY, 'Setting value')])->setHelp(<<%command.full_name% bin-dir bin/ To read a config setting: %command.full_name% bin-dir Outputs: bin To edit the global config.json file: %command.full_name% --global To add a repository: %command.full_name% repositories.foo vcs https://bar.com To remove a repository (repo is a short alias for repositories): %command.full_name% --unset repo.foo To disable packagist: %command.full_name% repo.packagist false You can alter repositories in the global config.json file by passing in the --global option. To add or edit suggested packages you can use: %command.full_name% suggest.package reason for the suggestion To add or edit extra properties you can use: %command.full_name% extra.property value Or to add a complex value you can use json with: %command.full_name% extra.property --json '{"foo":true, "bar": []}' To edit the file in an external editor: %command.full_name% --editor To choose your editor you can set the "EDITOR" env variable. To get a list of configuration values in the file: %command.full_name% --list You can always pass more than one option. As an example, if you want to edit the global config.json file. %command.full_name% --editor --global Read more at https://getcomposer.org/doc/03-cli.md#config EOT ); } /** * @throws \Exception */ protected function initialize(InputInterface $input, OutputInterface $output) : void { parent::initialize($input, $output); if ($input->getOption('global') && null !== $input->getOption('file')) { throw new \RuntimeException('--file and --global can not be combined'); } $io = $this->getIO(); $this->config = Factory::createConfig($io); $configFile = $this->getComposerConfigFile($input, $this->config); // Create global composer.json if this was invoked using `composer global config` if (($configFile === 'composer.json' || $configFile === './composer.json') && !\file_exists($configFile) && \realpath(Platform::getCwd()) === \realpath($this->config->get('home'))) { \file_put_contents($configFile, "{\n}\n"); } $this->configFile = new JsonFile($configFile, null, $io); $this->configSource = new JsonConfigSource($this->configFile); $authConfigFile = $this->getAuthConfigFile($input, $this->config); $this->authConfigFile = new JsonFile($authConfigFile, null, $io); $this->authConfigSource = new JsonConfigSource($this->authConfigFile, \true); // Initialize the global file if it's not there, ignoring any warnings or notices if ($input->getOption('global') && !$this->configFile->exists()) { \touch($this->configFile->getPath()); $this->configFile->write(['config' => new \ArrayObject()]); Silencer::call('chmod', $this->configFile->getPath(), 0600); } if ($input->getOption('global') && !$this->authConfigFile->exists()) { \touch($this->authConfigFile->getPath()); $this->authConfigFile->write(['bitbucket-oauth' => new \ArrayObject(), 'github-oauth' => new \ArrayObject(), 'gitlab-oauth' => new \ArrayObject(), 'gitlab-token' => new \ArrayObject(), 'http-basic' => new \ArrayObject(), 'bearer' => new \ArrayObject()]); Silencer::call('chmod', $this->authConfigFile->getPath(), 0600); } if (!$this->configFile->exists()) { throw new \RuntimeException(\sprintf('File "%s" cannot be found in the current directory', $configFile)); } } /** * @throws \Seld\JsonLint\ParsingException */ protected function execute(InputInterface $input, OutputInterface $output) : int { // Open file in editor if (\true === $input->getOption('editor')) { $editor = Platform::getEnv('EDITOR'); if (\false === $editor || '' === $editor) { if (Platform::isWindows()) { $editor = 'notepad'; } else { foreach (['editor', 'vim', 'vi', 'nano', 'pico', 'ed'] as $candidate) { if (\exec('which ' . $candidate)) { $editor = $candidate; break; } } } } else { $editor = \escapeshellcmd($editor); } $file = $input->getOption('auth') ? $this->authConfigFile->getPath() : $this->configFile->getPath(); \system($editor . ' ' . $file . (Platform::isWindows() ? '' : ' > `tty`')); return 0; } if (\false === $input->getOption('global')) { $this->config->merge($this->configFile->read(), $this->configFile->getPath()); $this->config->merge(['config' => $this->authConfigFile->exists() ? $this->authConfigFile->read() : []], $this->authConfigFile->getPath()); } $this->getIO()->loadConfiguration($this->config); // List the configuration of the file settings if (\true === $input->getOption('list')) { $this->listConfiguration($this->config->all(), $this->config->raw(), $output, null, $input->getOption('source')); return 0; } $settingKey = $input->getArgument('setting-key'); if (!\is_string($settingKey)) { return 0; } // If the user enters in a config variable, parse it and save to file if ([] !== $input->getArgument('setting-value') && $input->getOption('unset')) { throw new \RuntimeException('You can not combine a setting value with --unset'); } // show the value if no value is provided if ([] === $input->getArgument('setting-value') && !$input->getOption('unset')) { $properties = self::CONFIGURABLE_PACKAGE_PROPERTIES; $propertiesDefaults = ['type' => 'library', 'description' => '', 'homepage' => '', 'minimum-stability' => 'stable', 'prefer-stable' => \false, 'keywords' => [], 'license' => [], 'suggest' => [], 'extra' => []]; $rawData = $this->configFile->read(); $data = $this->config->all(); $source = $this->config->getSourceOfValue($settingKey); if (Preg::isMatch('/^repos?(?:itories)?(?:\\.(.+))?/', $settingKey, $matches)) { if (!isset($matches[1])) { $value = $data['repositories'] ?? []; } else { if (!isset($data['repositories'][$matches[1]])) { throw new \InvalidArgumentException('There is no ' . $matches[1] . ' repository defined'); } $value = $data['repositories'][$matches[1]]; } } elseif (\strpos($settingKey, '.')) { $bits = \explode('.', $settingKey); if ($bits[0] === 'extra' || $bits[0] === 'suggest') { $data = $rawData; } else { $data = $data['config']; } $match = \false; foreach ($bits as $bit) { $key = isset($key) ? $key . '.' . $bit : $bit; $match = \false; if (isset($data[$key])) { $match = \true; $data = $data[$key]; unset($key); } } if (!$match) { throw new \RuntimeException($settingKey . ' is not defined.'); } $value = $data; } elseif (isset($data['config'][$settingKey])) { $value = $this->config->get($settingKey, $input->getOption('absolute') ? 0 : Config::RELATIVE_PATHS); // ensure we get {} output for properties which are objects if ($value === []) { $schema = JsonFile::parseJson((string) \file_get_contents(JsonFile::COMPOSER_SCHEMA_PATH)); if (isset($schema['properties']['config']['properties'][$settingKey]['type']) && \in_array('object', (array) $schema['properties']['config']['properties'][$settingKey]['type'], \true)) { $value = new \stdClass(); } } } elseif (isset($rawData[$settingKey]) && \in_array($settingKey, $properties, \true)) { $value = $rawData[$settingKey]; $source = $this->configFile->getPath(); } elseif (isset($propertiesDefaults[$settingKey])) { $value = $propertiesDefaults[$settingKey]; $source = 'defaults'; } else { throw new \RuntimeException($settingKey . ' is not defined'); } if (\is_array($value) || \is_object($value) || \is_bool($value)) { $value = JsonFile::encode($value, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE); } $sourceOfConfigValue = ''; if ($input->getOption('source')) { $sourceOfConfigValue = ' (' . $source . ')'; } $this->getIO()->write($value . $sourceOfConfigValue, \true, IOInterface::QUIET); return 0; } $values = $input->getArgument('setting-value'); // what the user is trying to add/change $booleanValidator = static function ($val) : bool { return \in_array($val, ['true', 'false', '1', '0'], \true); }; $booleanNormalizer = static function ($val) : bool { return $val !== 'false' && (bool) $val; }; // handle config values $uniqueConfigValues = ['process-timeout' => ['is_numeric', 'intval'], 'use-include-path' => [$booleanValidator, $booleanNormalizer], 'use-github-api' => [$booleanValidator, $booleanNormalizer], 'preferred-install' => [static function ($val) : bool { return \in_array($val, ['auto', 'source', 'dist'], \true); }, static function ($val) { return $val; }], 'gitlab-protocol' => [static function ($val) : bool { return \in_array($val, ['git', 'http', 'https'], \true); }, static function ($val) { return $val; }], 'store-auths' => [static function ($val) : bool { return \in_array($val, ['true', 'false', 'prompt'], \true); }, static function ($val) { if ('prompt' === $val) { return 'prompt'; } return $val !== 'false' && (bool) $val; }], 'notify-on-install' => [$booleanValidator, $booleanNormalizer], 'vendor-dir' => ['is_string', static function ($val) { return $val; }], 'bin-dir' => ['is_string', static function ($val) { return $val; }], 'archive-dir' => ['is_string', static function ($val) { return $val; }], 'archive-format' => ['is_string', static function ($val) { return $val; }], 'data-dir' => ['is_string', static function ($val) { return $val; }], 'cache-dir' => ['is_string', static function ($val) { return $val; }], 'cache-files-dir' => ['is_string', static function ($val) { return $val; }], 'cache-repo-dir' => ['is_string', static function ($val) { return $val; }], 'cache-vcs-dir' => ['is_string', static function ($val) { return $val; }], 'cache-ttl' => ['is_numeric', 'intval'], 'cache-files-ttl' => ['is_numeric', 'intval'], 'cache-files-maxsize' => [static function ($val) : bool { return Preg::isMatch('/^\\s*([0-9.]+)\\s*(?:([kmg])(?:i?b)?)?\\s*$/i', $val); }, static function ($val) { return $val; }], 'bin-compat' => [static function ($val) : bool { return \in_array($val, ['auto', 'full', 'proxy', 'symlink']); }, static function ($val) { return $val; }], 'discard-changes' => [static function ($val) : bool { return \in_array($val, ['stash', 'true', 'false', '1', '0'], \true); }, static function ($val) { if ('stash' === $val) { return 'stash'; } return $val !== 'false' && (bool) $val; }], 'autoloader-suffix' => ['is_string', static function ($val) { return $val === 'null' ? null : $val; }], 'sort-packages' => [$booleanValidator, $booleanNormalizer], 'optimize-autoloader' => [$booleanValidator, $booleanNormalizer], 'classmap-authoritative' => [$booleanValidator, $booleanNormalizer], 'apcu-autoloader' => [$booleanValidator, $booleanNormalizer], 'prepend-autoloader' => [$booleanValidator, $booleanNormalizer], 'disable-tls' => [$booleanValidator, $booleanNormalizer], 'secure-http' => [$booleanValidator, $booleanNormalizer], 'bump-after-update' => [static function ($val) : bool { return \in_array($val, ['dev', 'no-dev', 'true', 'false', '1', '0'], \true); }, static function ($val) { if ('dev' === $val || 'no-dev' === $val) { return $val; } return $val !== 'false' && (bool) $val; }], 'cafile' => [static function ($val) : bool { return \file_exists($val) && Filesystem::isReadable($val); }, static function ($val) { return $val === 'null' ? null : $val; }], 'capath' => [static function ($val) : bool { return \is_dir($val) && Filesystem::isReadable($val); }, static function ($val) { return $val === 'null' ? null : $val; }], 'github-expose-hostname' => [$booleanValidator, $booleanNormalizer], 'htaccess-protect' => [$booleanValidator, $booleanNormalizer], 'lock' => [$booleanValidator, $booleanNormalizer], 'allow-plugins' => [$booleanValidator, $booleanNormalizer], 'platform-check' => [static function ($val) : bool { return \in_array($val, ['php-only', 'true', 'false', '1', '0'], \true); }, static function ($val) { if ('php-only' === $val) { return 'php-only'; } return $val !== 'false' && (bool) $val; }], 'use-parent-dir' => [static function ($val) : bool { return \in_array($val, ['true', 'false', 'prompt'], \true); }, static function ($val) { if ('prompt' === $val) { return 'prompt'; } return $val !== 'false' && (bool) $val; }], 'audit.abandoned' => [static function ($val) : bool { return \in_array($val, [Auditor::ABANDONED_IGNORE, Auditor::ABANDONED_REPORT, Auditor::ABANDONED_FAIL], \true); }, static function ($val) { return $val; }]]; $multiConfigValues = ['github-protocols' => [static function ($vals) { if (!\is_array($vals)) { return 'array expected'; } foreach ($vals as $val) { if (!\in_array($val, ['git', 'https', 'ssh'])) { return 'valid protocols include: git, https, ssh'; } } return \true; }, static function ($vals) { return $vals; }], 'github-domains' => [static function ($vals) { if (!\is_array($vals)) { return 'array expected'; } return \true; }, static function ($vals) { return $vals; }], 'gitlab-domains' => [static function ($vals) { if (!\is_array($vals)) { return 'array expected'; } return \true; }, static function ($vals) { return $vals; }], 'audit.ignore' => [static function ($vals) { if (!\is_array($vals)) { return 'array expected'; } return \true; }, static function ($vals) { return $vals; }]]; // allow unsetting audit config entirely if ($input->getOption('unset') && $settingKey === 'audit') { $this->configSource->removeConfigSetting($settingKey); return 0; } if ($input->getOption('unset') && (isset($uniqueConfigValues[$settingKey]) || isset($multiConfigValues[$settingKey]))) { if ($settingKey === 'disable-tls' && $this->config->get('disable-tls')) { $this->getIO()->writeError('You are now running Composer with SSL/TLS protection enabled.'); } $this->configSource->removeConfigSetting($settingKey); return 0; } if (isset($uniqueConfigValues[$settingKey])) { $this->handleSingleValue($settingKey, $uniqueConfigValues[$settingKey], $values, 'addConfigSetting'); return 0; } if (isset($multiConfigValues[$settingKey])) { $this->handleMultiValue($settingKey, $multiConfigValues[$settingKey], $values, 'addConfigSetting'); return 0; } // handle preferred-install per-package config if (Preg::isMatch('/^preferred-install\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } [$validator] = $uniqueConfigValues['preferred-install']; if (!$validator($values[0])) { throw new \RuntimeException('Invalid value for ' . $settingKey . '. Should be one of: auto, source, or dist'); } $this->configSource->addConfigSetting($settingKey, $values[0]); return 0; } // handle allow-plugins config setting elements true or false to add/remove if (Preg::isMatch('{^allow-plugins\\.([a-zA-Z0-9/*-]+)}', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } if (\true !== $booleanValidator($values[0])) { throw new \RuntimeException(\sprintf('"%s" is an invalid value', $values[0])); } $normalizedValue = $booleanNormalizer($values[0]); $this->configSource->addConfigSetting($settingKey, $normalizedValue); return 0; } // handle properties $uniqueProps = ['name' => ['is_string', static function ($val) { return $val; }], 'type' => ['is_string', static function ($val) { return $val; }], 'description' => ['is_string', static function ($val) { return $val; }], 'homepage' => ['is_string', static function ($val) { return $val; }], 'version' => ['is_string', static function ($val) { return $val; }], 'minimum-stability' => [static function ($val) : bool { return isset(BasePackage::STABILITIES[VersionParser::normalizeStability($val)]); }, static function ($val) : string { return VersionParser::normalizeStability($val); }], 'prefer-stable' => [$booleanValidator, $booleanNormalizer]]; $multiProps = ['keywords' => [static function ($vals) { if (!\is_array($vals)) { return 'array expected'; } return \true; }, static function ($vals) { return $vals; }], 'license' => [static function ($vals) { if (!\is_array($vals)) { return 'array expected'; } return \true; }, static function ($vals) { return $vals; }]]; if ($input->getOption('global') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]) || \strpos($settingKey, 'extra.') === 0)) { throw new \InvalidArgumentException('The ' . $settingKey . ' property can not be set in the global config.json file. Use `composer global config` to apply changes to the global composer.json'); } if ($input->getOption('unset') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]))) { $this->configSource->removeProperty($settingKey); return 0; } if (isset($uniqueProps[$settingKey])) { $this->handleSingleValue($settingKey, $uniqueProps[$settingKey], $values, 'addProperty'); return 0; } if (isset($multiProps[$settingKey])) { $this->handleMultiValue($settingKey, $multiProps[$settingKey], $values, 'addProperty'); return 0; } // handle repositories if (Preg::isMatchStrictGroups('/^repos?(?:itories)?\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeRepository($matches[1]); return 0; } if (2 === \count($values)) { $this->configSource->addRepository($matches[1], ['type' => $values[0], 'url' => $values[1]], $input->getOption('append')); return 0; } if (1 === \count($values)) { $value = \strtolower($values[0]); if (\true === $booleanValidator($value)) { if (\false === $booleanNormalizer($value)) { $this->configSource->addRepository($matches[1], \false, $input->getOption('append')); return 0; } } else { $value = JsonFile::parseJson($values[0]); $this->configSource->addRepository($matches[1], $value, $input->getOption('append')); return 0; } } throw new \RuntimeException('You must pass the type and a url. Example: php composer.phar config repositories.foo vcs https://bar.com'); } // handle extra if (Preg::isMatch('/^extra\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } $value = $values[0]; if ($input->getOption('json')) { $value = JsonFile::parseJson($value); if ($input->getOption('merge')) { $currentValue = $this->configFile->read(); $bits = \explode('.', $settingKey); foreach ($bits as $bit) { $currentValue = $currentValue[$bit] ?? null; } if (\is_array($currentValue) && \is_array($value)) { if (\array_is_list($currentValue) && \array_is_list($value)) { $value = \array_merge($currentValue, $value); } else { $value = $value + $currentValue; } } } } $this->configSource->addProperty($settingKey, $value); return 0; } // handle suggest if (Preg::isMatch('/^suggest\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } $this->configSource->addProperty($settingKey, \implode(' ', $values)); return 0; } // handle unsetting extra/suggest if (\in_array($settingKey, ['suggest', 'extra'], \true) && $input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } // handle platform if (Preg::isMatch('/^platform\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } $this->configSource->addConfigSetting($settingKey, $values[0] === 'false' ? \false : $values[0]); return 0; } // handle unsetting platform if ($settingKey === 'platform' && $input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } // handle auth if (Preg::isMatch('/^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|http-basic|bearer)\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->authConfigSource->removeConfigSetting($matches[1] . '.' . $matches[2]); $this->configSource->removeConfigSetting($matches[1] . '.' . $matches[2]); return 0; } if ($matches[1] === 'bitbucket-oauth') { if (2 !== \count($values)) { throw new \RuntimeException('Expected two arguments (consumer-key, consumer-secret), got ' . \count($values)); } $this->configSource->removeConfigSetting($matches[1] . '.' . $matches[2]); $this->authConfigSource->addConfigSetting($matches[1] . '.' . $matches[2], ['consumer-key' => $values[0], 'consumer-secret' => $values[1]]); } elseif ($matches[1] === 'gitlab-token' && 2 === \count($values)) { $this->configSource->removeConfigSetting($matches[1] . '.' . $matches[2]); $this->authConfigSource->addConfigSetting($matches[1] . '.' . $matches[2], ['username' => $values[0], 'token' => $values[1]]); } elseif (\in_array($matches[1], ['github-oauth', 'gitlab-oauth', 'gitlab-token', 'bearer'], \true)) { if (1 !== \count($values)) { throw new \RuntimeException('Too many arguments, expected only one token'); } $this->configSource->removeConfigSetting($matches[1] . '.' . $matches[2]); $this->authConfigSource->addConfigSetting($matches[1] . '.' . $matches[2], $values[0]); } elseif ($matches[1] === 'http-basic') { if (2 !== \count($values)) { throw new \RuntimeException('Expected two arguments (username, password), got ' . \count($values)); } $this->configSource->removeConfigSetting($matches[1] . '.' . $matches[2]); $this->authConfigSource->addConfigSetting($matches[1] . '.' . $matches[2], ['username' => $values[0], 'password' => $values[1]]); } return 0; } // handle script if (Preg::isMatch('/^scripts\\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } $this->configSource->addProperty($settingKey, \count($values) > 1 ? $values : $values[0]); return 0; } // handle unsetting other top level properties if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } throw new \InvalidArgumentException('Setting ' . $settingKey . ' does not exist or is not supported by this command'); } /** * @param array{callable, callable} $callbacks Validator and normalizer callbacks * @param array $values */ protected function handleSingleValue(string $key, array $callbacks, array $values, string $method) : void { [$validator, $normalizer] = $callbacks; if (1 !== \count($values)) { throw new \RuntimeException('You can only pass one value. Example: php composer.phar config process-timeout 300'); } if (\true !== ($validation = $validator($values[0]))) { throw new \RuntimeException(\sprintf('"%s" is an invalid value' . ($validation ? ' (' . $validation . ')' : ''), $values[0])); } $normalizedValue = $normalizer($values[0]); if ($key === 'disable-tls') { if (!$normalizedValue && $this->config->get('disable-tls')) { $this->getIO()->writeError('You are now running Composer with SSL/TLS protection enabled.'); } elseif ($normalizedValue && !$this->config->get('disable-tls')) { $this->getIO()->writeError('You are now running Composer with SSL/TLS protection disabled.'); } } \call_user_func([$this->configSource, $method], $key, $normalizedValue); } /** * @param array{callable, callable} $callbacks Validator and normalizer callbacks * @param array $values */ protected function handleMultiValue(string $key, array $callbacks, array $values, string $method) : void { [$validator, $normalizer] = $callbacks; if (\true !== ($validation = $validator($values))) { throw new \RuntimeException(\sprintf('%s is an invalid value' . ($validation ? ' (' . $validation . ')' : ''), \json_encode($values))); } \call_user_func([$this->configSource, $method], $key, $normalizer($values)); } /** * Display the contents of the file in a pretty formatted way * * @param array $contents * @param array $rawContents */ protected function listConfiguration(array $contents, array $rawContents, OutputInterface $output, ?string $k = null, bool $showSource = \false) : void { $origK = $k; $io = $this->getIO(); foreach ($contents as $key => $value) { if ($k === null && !\in_array($key, ['config', 'repositories'])) { continue; } $rawVal = $rawContents[$key] ?? null; if (\is_array($value) && (!\is_numeric(\key($value)) || $key === 'repositories' && null === $k)) { $k .= Preg::replace('{^config\\.}', '', $key . '.'); $this->listConfiguration($value, $rawVal, $output, $k, $showSource); $k = $origK; continue; } if (\is_array($value)) { $value = \array_map(static function ($val) { return \is_array($val) ? \json_encode($val) : $val; }, $value); $value = '[' . \implode(', ', $value) . ']'; } if (\is_bool($value)) { $value = \var_export($value, \true); } $source = ''; if ($showSource) { $source = ' (' . $this->config->getSourceOfValue($k . $key) . ')'; } if (null !== $k && 0 === \strpos($k, 'repositories')) { $link = 'https://getcomposer.org/doc/05-repositories.md'; } else { $id = Preg::replace('{\\..*$}', '', $k === '' || $k === null ? (string) $key : $k); $id = Preg::replace('{[^a-z0-9]}i', '-', \strtolower(\trim($id))); $id = Preg::replace('{-+}', '-', $id); $link = 'https://getcomposer.org/doc/06-config.md#' . $id; } if (\is_string($rawVal) && $rawVal !== $value) { $io->write('[' . $k . $key . '] ' . $rawVal . ' (' . $value . ')' . $source, \true, IOInterface::QUIET); } else { $io->write('[' . $k . $key . '] ' . $value . '' . $source, \true, IOInterface::QUIET); } } } /** * Get the local composer.json, global config.json, or the file passed by the user */ private function getComposerConfigFile(InputInterface $input, Config $config) : string { return $input->getOption('global') ? $config->get('home') . '/config.json' : ($input->getOption('file') ?: Factory::getComposerFile()); } /** * Get the local auth.json or global auth.json, or if the user passed in a file to use, * the corresponding auth.json */ private function getAuthConfigFile(InputInterface $input, Config $config) : string { return $input->getOption('global') ? $config->get('home') . '/auth.json' : \dirname($this->getComposerConfigFile($input, $config)) . '/auth.json'; } /** * Suggest setting-keys, while taking given options in account. */ private function suggestSettingKeys() : \Closure { return function (CompletionInput $input) : array { if ($input->getOption('list') || $input->getOption('editor') || $input->getOption('auth')) { return []; } // initialize configuration $config = Factory::createConfig(); // load configuration $configFile = new JsonFile($this->getComposerConfigFile($input, $config)); if ($configFile->exists()) { $config->merge($configFile->read(), $configFile->getPath()); } // load auth-configuration $authConfigFile = new JsonFile($this->getAuthConfigFile($input, $config)); if ($authConfigFile->exists()) { $config->merge(['config' => $authConfigFile->read()], $authConfigFile->getPath()); } // collect all configuration setting-keys $rawConfig = $config->raw(); $keys = \array_merge($this->flattenSettingKeys($rawConfig['config']), $this->flattenSettingKeys($rawConfig['repositories'], 'repositories.')); // if unsetting … if ($input->getOption('unset')) { // … keep only the currently customized setting-keys … $sources = [$configFile->getPath(), $authConfigFile->getPath()]; $keys = \array_filter($keys, static function (string $key) use($config, $sources) : bool { return \in_array($config->getSourceOfValue($key), $sources, \true); }); // … else if showing or setting a value … } else { // … add all configurable package-properties, no matter if it exist $keys = \array_merge($keys, self::CONFIGURABLE_PACKAGE_PROPERTIES); // it would be nice to distinguish between showing and setting // a value, but that makes the implementation much more complex // and partially impossible because symfony's implementation // does not complete arguments followed by other arguments } // add all existing configurable package-properties if ($configFile->exists()) { $properties = \array_filter($configFile->read(), static function (string $key) : bool { return \in_array($key, self::CONFIGURABLE_PACKAGE_PROPERTIES, \true); }, \ARRAY_FILTER_USE_KEY); $keys = \array_merge($keys, $this->flattenSettingKeys($properties)); } // filter settings-keys by completion value $completionValue = $input->getCompletionValue(); if ($completionValue !== '') { $keys = \array_filter($keys, static function (string $key) use($completionValue) : bool { return \str_starts_with($key, $completionValue); }); } \sort($keys); return \array_unique($keys); }; } /** * build a flat list of dot-separated setting-keys from given config * * @param array $config * @return string[] */ private function flattenSettingKeys(array $config, string $prefix = '') : array { $keys = []; foreach ($config as $key => $value) { $keys[] = [$prefix . $key]; // array-lists must not be added to completion // sub-keys of repository-keys must not be added to completion if (\is_array($value) && !\array_is_list($value) && $prefix !== 'repositories.') { $keys[] = $this->flattenSettingKeys($value, $prefix . $key . '.'); } } return \array_merge(...$keys); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Console\Input\InputOption; use Composer\Json\JsonFile; use Composer\Package\CompletePackageInterface; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\RepositoryUtils; use Composer\Util\PackageInfo; use Composer\Util\PackageSorter; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Helper\Table; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Console\Style\SymfonyStyle; /** * @author Benoît Merlet */ class LicensesCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('licenses')->setDescription('Shows information about licenses of dependencies')->setDefinition([new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text, json or summary', 'text', ['text', 'json', 'summary']), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.')])->setHelp(<<requireComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'licenses', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $root = $composer->getPackage(); $repo = $composer->getRepositoryManager()->getLocalRepository(); if ($input->getOption('no-dev')) { $packages = RepositoryUtils::filterRequiredPackages($repo->getPackages(), $root); } else { $packages = $repo->getPackages(); } $packages = PackageSorter::sortPackagesAlphabetically($packages); $io = $this->getIO(); switch ($format = $input->getOption('format')) { case 'text': $io->write('Name: ' . $root->getPrettyName() . ''); $io->write('Version: ' . $root->getFullPrettyVersion() . ''); $io->write('Licenses: ' . (\implode(', ', $root->getLicense()) ?: 'none') . ''); $io->write('Dependencies:'); $io->write(''); $table = new Table($output); $table->setStyle('compact'); $table->setHeaders(['Name', 'Version', 'Licenses']); foreach ($packages as $package) { $link = PackageInfo::getViewSourceOrHomepageUrl($package); if ($link !== null) { $name = '' . $package->getPrettyName() . ''; } else { $name = $package->getPrettyName(); } $table->addRow([$name, $package->getFullPrettyVersion(), \implode(', ', $package instanceof CompletePackageInterface ? $package->getLicense() : []) ?: 'none']); } $table->render(); break; case 'json': $dependencies = []; foreach ($packages as $package) { $dependencies[$package->getPrettyName()] = ['version' => $package->getFullPrettyVersion(), 'license' => $package instanceof CompletePackageInterface ? $package->getLicense() : []]; } $io->write(JsonFile::encode(['name' => $root->getPrettyName(), 'version' => $root->getFullPrettyVersion(), 'license' => $root->getLicense(), 'dependencies' => $dependencies])); break; case 'summary': $usedLicenses = []; foreach ($packages as $package) { $licenses = $package instanceof CompletePackageInterface ? $package->getLicense() : []; if (\count($licenses) === 0) { $licenses[] = 'none'; } foreach ($licenses as $licenseName) { if (!isset($usedLicenses[$licenseName])) { $usedLicenses[$licenseName] = 0; } $usedLicenses[$licenseName]++; } } // Sort licenses so that the most used license will appear first \arsort($usedLicenses, \SORT_NUMERIC); $rows = []; foreach ($usedLicenses as $usedLicense => $numberOfDependencies) { $rows[] = [$usedLicense, $numberOfDependencies]; } $symfonyIo = new SymfonyStyle($input, $output); $symfonyIo->table(['License', 'Number of dependencies'], $rows); break; default: throw new \RuntimeException(\sprintf('Unsupported format "%s". See help for supported formats.', $format)); } return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\DependencyResolver\Request; use Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\Package\Loader\RootPackageLoader; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionSelector; use Composer\Pcre\Preg; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Package\Version\VersionParser; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositorySet; use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Intervals; use Composer\Util\HttpDownloader; use Composer\Advisory\Auditor; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Console\Helper\Table; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano * @author Nils Adermann */ class UpdateCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; /** * @return void */ protected function configure() { $this->setName('update')->setAliases(['u', 'upgrade'])->setDescription('Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file')->setDefinition([new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.', null, $this->suggestInstalledPackage(\false)), new InputOption('with', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('dev', null, InputOption::VALUE_NONE, 'DEPRECATED: Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Overwrites the lock file hash to suppress warning about the lock file being out of date without updating package versions. Package metadata like mirrors and URLs are updated if they changed.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('with-dependencies', 'w', InputOption::VALUE_NONE, 'Update also dependencies of packages in the argument list, except those which are root requirements (can also be set via the COMPOSER_WITH_DEPENDENCIES=1 env var).'), new InputOption('with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Update also dependencies of packages in the argument list, including those which are root requirements (can also be set via the COMPOSER_WITH_ALL_DEPENDENCIES=1 env var).'), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies (can also be set via the COMPOSER_PREFER_STABLE=1 env var).'), new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies (can also be set via the COMPOSER_PREFER_LOWEST=1 env var).'), new InputOption('minimal-changes', 'm', InputOption::VALUE_NONE, 'During a partial update with -w/-W, only perform absolutely necessary changes to transitive dependencies (can also be set via the COMPOSER_MINIMAL_CHANGES=1 env var).'), new InputOption('patch-only', null, InputOption::VALUE_NONE, 'Only allow patch version updates for currently installed dependencies.'), new InputOption('interactive', 'i', InputOption::VALUE_NONE, 'Interactive interface with autocompletion to select the packages to update.'), new InputOption('root-reqs', null, InputOption::VALUE_NONE, 'Restricts the update to your first degree dependencies.'), new InputOption('bump-after-update', null, InputOption::VALUE_OPTIONAL, 'Runs bump after performing the update.', \false, ['dev', 'no-dev', 'all'])])->setHelp(<<update command reads the composer.json file from the current directory, processes it, and updates, removes or installs all the dependencies. php composer.phar update To limit the update operation to a few packages, you can list the package(s) you want to update as such: php composer.phar update vendor/package1 foo/mypackage [...] You may also use an asterisk (*) pattern to limit the update operation to package(s) from a specific vendor: php composer.phar update vendor/package1 foo/* [...] To run an update with more restrictive constraints you can use: php composer.phar update --with vendor/package:1.0.* To run a partial update with more restrictive constraints you can use the shorthand: php composer.phar update vendor/package:1.0.* To select packages names interactively with auto-completion use -i. Read more at https://getcomposer.org/doc/03-cli.md#update-u-upgrade EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $io = $this->getIO(); if ($input->getOption('dev')) { $io->writeError('You are using the deprecated option "--dev". It has no effect and will break in Composer 3.'); } if ($input->getOption('no-suggest')) { $io->writeError('You are using the deprecated option "--no-suggest". It has no effect and will break in Composer 3.'); } $composer = $this->requireComposer(); if (!HttpDownloader::isCurlEnabled()) { $io->writeError('Composer is operating significantly slower than normal because you do not have the PHP curl extension enabled.'); } $packages = $input->getArgument('packages'); $reqs = $this->formatRequirements($input->getOption('with')); // extract --with shorthands from the allowlist if (\count($packages) > 0) { $allowlistPackagesWithRequirements = \array_filter($packages, static function ($pkg) : bool { return Preg::isMatch('{\\S+[ =:]\\S+}', $pkg); }); foreach ($this->formatRequirements($allowlistPackagesWithRequirements) as $package => $constraint) { $reqs[$package] = $constraint; } // replace the foo/bar:req by foo/bar in the allowlist foreach ($allowlistPackagesWithRequirements as $package) { $packageName = Preg::replace('{^([^ =:]+)[ =:].*$}', '$1', $package); $index = \array_search($package, $packages); $packages[$index] = $packageName; } } $rootPackage = $composer->getPackage(); $rootPackage->setReferences(RootPackageLoader::extractReferences($reqs, $rootPackage->getReferences())); $rootPackage->setStabilityFlags(RootPackageLoader::extractStabilityFlags($reqs, $rootPackage->getMinimumStability(), $rootPackage->getStabilityFlags())); $parser = new VersionParser(); $temporaryConstraints = []; $rootRequirements = \array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()); foreach ($reqs as $package => $constraint) { $package = \strtolower($package); $parsedConstraint = $parser->parseConstraints($constraint); $temporaryConstraints[$package] = $parsedConstraint; if (isset($rootRequirements[$package]) && !Intervals::haveIntersections($parsedConstraint, $rootRequirements[$package]->getConstraint())) { $io->writeError('The temporary constraint "' . $constraint . '" for "' . $package . '" must be a subset of the constraint in your composer.json (' . $rootRequirements[$package]->getPrettyConstraint() . ')'); $io->write('Run `composer require ' . $package . '` or `composer require ' . $package . ':' . $constraint . '` instead to replace the constraint'); return self::FAILURE; } } if ($input->getOption('patch-only')) { if (!$composer->getLocker()->isLocked()) { throw new \InvalidArgumentException('patch-only can only be used with a lock file present'); } foreach ($composer->getLocker()->getLockedRepository(\true)->getCanonicalPackages() as $package) { if ($package->isDev()) { continue; } if (!Preg::isMatch('{^(\\d+\\.\\d+\\.\\d+)}', $package->getVersion(), $match)) { continue; } $constraint = $parser->parseConstraints('~' . $match[1]); if (isset($temporaryConstraints[$package->getName()])) { $temporaryConstraints[$package->getName()] = MultiConstraint::create([$temporaryConstraints[$package->getName()], $constraint], \true); } else { $temporaryConstraints[$package->getName()] = $constraint; } } } if ($input->getOption('interactive')) { $packages = $this->getPackagesInteractively($io, $input, $output, $composer, $packages); } if ($input->getOption('root-reqs')) { $requires = \array_keys($rootPackage->getRequires()); if (!$input->getOption('no-dev')) { $requires = \array_merge($requires, \array_keys($rootPackage->getDevRequires())); } if (!empty($packages)) { $packages = \array_intersect($packages, $requires); } else { $packages = $requires; } } // the arguments lock/nothing/mirrors are not package names but trigger a mirror update instead // they are further mutually exclusive with listing actual package names $filteredPackages = \array_filter($packages, static function ($package) : bool { return !\in_array($package, ['lock', 'nothing', 'mirrors'], \true); }); $updateMirrors = $input->getOption('lock') || \count($filteredPackages) !== \count($packages); $packages = $filteredPackages; if ($updateMirrors && !empty($packages)) { $io->writeError('You cannot simultaneously update only a selection of packages and regenerate the lock file metadata.'); return -1; } $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'update', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $composer->getInstallationManager()->setOutputProgress(!$input->getOption('no-progress')); $install = Installer::create($io, $composer); $config = $composer->getConfig(); [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcuPrefix = $input->getOption('apcu-autoloader-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu-autoloader') || $config->get('apcu-autoloader'); $updateAllowTransitiveDependencies = Request::UPDATE_ONLY_LISTED; if ($input->getOption('with-all-dependencies')) { $updateAllowTransitiveDependencies = Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS; } elseif ($input->getOption('with-dependencies')) { $updateAllowTransitiveDependencies = Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE; } $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$input->getOption('no-dev'))->setDumpAutoloader(!$input->getOption('no-autoloader'))->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setApcuAutoloader($apcu, $apcuPrefix)->setUpdate(\true)->setInstall(!$input->getOption('no-install'))->setUpdateMirrors($updateMirrors)->setUpdateAllowList($packages)->setUpdateAllowTransitiveDependencies($updateAllowTransitiveDependencies)->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input))->setPreferStable($input->getOption('prefer-stable'))->setPreferLowest($input->getOption('prefer-lowest'))->setTemporaryConstraints($temporaryConstraints)->setAudit(!$input->getOption('no-audit'))->setAuditFormat($this->getAuditFormat($input))->setMinimalUpdate($input->getOption('minimal-changes')); if ($input->getOption('no-plugins')) { $install->disablePlugins(); } $result = $install->run(); if ($result === 0) { $bumpAfterUpdate = $input->getOption('bump-after-update'); if (\false === $bumpAfterUpdate) { $bumpAfterUpdate = $composer->getConfig()->get('bump-after-update'); } if (\false !== $bumpAfterUpdate) { $io->writeError('Bumping dependencies'); $bumpCommand = new \Composer\Command\BumpCommand(); $bumpCommand->setComposer($composer); $result = $bumpCommand->doBump($io, $bumpAfterUpdate === 'dev', $bumpAfterUpdate === 'no-dev', $input->getOption('dry-run'), $input->getArgument('packages')); } } return $result; } /** * @param array $packages * @return array */ private function getPackagesInteractively(IOInterface $io, InputInterface $input, OutputInterface $output, Composer $composer, array $packages) : array { if (!$input->isInteractive()) { throw new \InvalidArgumentException('--interactive cannot be used in non-interactive terminals.'); } $platformReqFilter = $this->getPlatformRequirementFilter($input); $stabilityFlags = $composer->getPackage()->getStabilityFlags(); $requires = \array_merge($composer->getPackage()->getRequires(), $composer->getPackage()->getDevRequires()); $filter = \count($packages) > 0 ? BasePackage::packageNamesToRegexp($packages) : null; $io->writeError('Loading packages that can be updated...'); $autocompleterValues = []; $installedPackages = $composer->getLocker()->isLocked() ? $composer->getLocker()->getLockedRepository(\true)->getPackages() : $composer->getRepositoryManager()->getLocalRepository()->getPackages(); $versionSelector = $this->createVersionSelector($composer); foreach ($installedPackages as $package) { if ($filter !== null && !Preg::isMatch($filter, $package->getName())) { continue; } $currentVersion = $package->getPrettyVersion(); $constraint = isset($requires[$package->getName()]) ? $requires[$package->getName()]->getPrettyConstraint() : null; $stability = isset($stabilityFlags[$package->getName()]) ? (string) \array_search($stabilityFlags[$package->getName()], BasePackage::STABILITIES, \true) : $composer->getPackage()->getMinimumStability(); $latestVersion = $versionSelector->findBestCandidate($package->getName(), $constraint, $stability, $platformReqFilter); if ($latestVersion !== \false && ($package->getVersion() !== $latestVersion->getVersion() || $latestVersion->isDev())) { $autocompleterValues[$package->getName()] = '' . $currentVersion . ' => ' . $latestVersion->getPrettyVersion() . ''; } } if (0 === \count($installedPackages)) { foreach ($requires as $req => $constraint) { if (PlatformRepository::isPlatformPackage($req)) { continue; } $autocompleterValues[$req] = ''; } } if (0 === \count($autocompleterValues)) { throw new \RuntimeException('Could not find any package with new versions available'); } $packages = $io->select('Select packages: (Select more than one value separated by comma) ', $autocompleterValues, \false, 1, 'No package named "%s" is installed.', \true); $table = new Table($output); $table->setHeaders(['Selected packages']); foreach ($packages as $package) { $table->addRow([$package]); } $table->render(); if ($io->askConfirmation(\sprintf('Would you like to continue and update the above package%s [yes]? ', 1 === \count($packages) ? '' : 's'))) { return $packages; } throw new \RuntimeException('Installation aborted.'); } private function createVersionSelector(Composer $composer) : VersionSelector { $repositorySet = new RepositorySet(); $repositorySet->addRepository(new CompositeRepository(\array_filter($composer->getRepositoryManager()->getRepositories(), function (RepositoryInterface $repository) { return !$repository instanceof PlatformRepository; }))); return new VersionSelector($repositorySet); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Downloader\ChangeReportInterface; use Composer\Downloader\DvcsDownloaderInterface; use Composer\Downloader\VcsCapableDownloaderInterface; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Script\ScriptEvents; use Composer\Util\ProcessExecutor; /** * @author Tiago Ribeiro * @author Rui Marinho */ class StatusCommand extends \Composer\Command\BaseCommand { private const EXIT_CODE_ERRORS = 1; private const EXIT_CODE_UNPUSHED_CHANGES = 2; private const EXIT_CODE_VERSION_CHANGES = 4; /** * @throws \Symfony\Component\Console\Exception\InvalidArgumentException */ protected function configure() : void { $this->setName('status')->setDescription('Shows a list of locally modified packages')->setDefinition([new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Show modified files for each directory that contains changes.')])->setHelp(<<requireComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'status', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); // Dispatch pre-status-command $composer->getEventDispatcher()->dispatchScript(ScriptEvents::PRE_STATUS_CMD, \true); $exitCode = $this->doExecute($input); // Dispatch post-status-command $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_STATUS_CMD, \true); return $exitCode; } private function doExecute(InputInterface $input) : int { // init repos $composer = $this->requireComposer(); $installedRepo = $composer->getRepositoryManager()->getLocalRepository(); $dm = $composer->getDownloadManager(); $im = $composer->getInstallationManager(); $errors = []; $io = $this->getIO(); $unpushedChanges = []; $vcsVersionChanges = []; $parser = new VersionParser(); $guesser = new VersionGuesser($composer->getConfig(), $composer->getLoop()->getProcessExecutor() ?? new ProcessExecutor($io), $parser, $io); $dumper = new ArrayDumper(); // list packages foreach ($installedRepo->getCanonicalPackages() as $package) { $downloader = $dm->getDownloaderForPackage($package); $targetDir = $im->getInstallPath($package); if ($targetDir === null) { continue; } if ($downloader instanceof ChangeReportInterface) { if (\is_link($targetDir)) { $errors[$targetDir] = $targetDir . ' is a symbolic link.'; } if (null !== ($changes = $downloader->getLocalChanges($package, $targetDir))) { $errors[$targetDir] = $changes; } } if ($downloader instanceof VcsCapableDownloaderInterface) { if ($downloader->getVcsReference($package, $targetDir)) { switch ($package->getInstallationSource()) { case 'source': $previousRef = $package->getSourceReference(); break; case 'dist': $previousRef = $package->getDistReference(); break; default: $previousRef = null; } $currentVersion = $guesser->guessVersion($dumper->dump($package), $targetDir); if ($previousRef && $currentVersion && $currentVersion['commit'] !== $previousRef && $currentVersion['pretty_version'] !== $previousRef) { $vcsVersionChanges[$targetDir] = ['previous' => ['version' => $package->getPrettyVersion(), 'ref' => $previousRef], 'current' => ['version' => $currentVersion['pretty_version'], 'ref' => $currentVersion['commit']]]; } } } if ($downloader instanceof DvcsDownloaderInterface) { if ($unpushed = $downloader->getUnpushedChanges($package, $targetDir)) { $unpushedChanges[$targetDir] = $unpushed; } } } // output errors/warnings if (!$errors && !$unpushedChanges && !$vcsVersionChanges) { $io->writeError('No local changes'); return 0; } if ($errors) { $io->writeError('You have changes in the following dependencies:'); foreach ($errors as $path => $changes) { if ($input->getOption('verbose')) { $indentedChanges = \implode("\n", \array_map(static function ($line) : string { return ' ' . \ltrim($line); }, \explode("\n", $changes))); $io->write('' . $path . ':'); $io->write($indentedChanges); } else { $io->write($path); } } } if ($unpushedChanges) { $io->writeError('You have unpushed changes on the current branch in the following dependencies:'); foreach ($unpushedChanges as $path => $changes) { if ($input->getOption('verbose')) { $indentedChanges = \implode("\n", \array_map(static function ($line) : string { return ' ' . \ltrim($line); }, \explode("\n", $changes))); $io->write('' . $path . ':'); $io->write($indentedChanges); } else { $io->write($path); } } } if ($vcsVersionChanges) { $io->writeError('You have version variations in the following dependencies:'); foreach ($vcsVersionChanges as $path => $changes) { if ($input->getOption('verbose')) { // If we don't can't find a version, use the ref instead. $currentVersion = $changes['current']['version'] ?: $changes['current']['ref']; $previousVersion = $changes['previous']['version'] ?: $changes['previous']['ref']; if ($io->isVeryVerbose()) { // Output the ref regardless of whether or not it's being used as the version $currentVersion .= \sprintf(' (%s)', $changes['current']['ref']); $previousVersion .= \sprintf(' (%s)', $changes['previous']['ref']); } $io->write('' . $path . ':'); $io->write(\sprintf(' From %s to %s', $previousVersion, $currentVersion)); } else { $io->write($path); } } } if (($errors || $unpushedChanges || $vcsVersionChanges) && !$input->getOption('verbose')) { $io->writeError('Use --verbose (-v) to see a list of files'); } return ($errors ? self::EXIT_CODE_ERRORS : 0) + ($unpushedChanges ? self::EXIT_CODE_UNPUSHED_CHANGES : 0) + ($vcsVersionChanges ? self::EXIT_CODE_VERSION_CHANGES : 0); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\Link; use Composer\Package\Package; use Composer\Package\PackageInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\RootPackage; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\CompositeRepository; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Semver\Constraint\Bound; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatterStyle; use Composer\Package\Version\VersionParser; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Util\PackageInfo; /** * Base implementation for commands mapping dependency relationships. * * @author Niels Keurentjes */ abstract class BaseDependencyCommand extends \Composer\Command\BaseCommand { protected const ARGUMENT_PACKAGE = 'package'; protected const ARGUMENT_CONSTRAINT = 'version'; protected const OPTION_RECURSIVE = 'recursive'; protected const OPTION_TREE = 'tree'; /** @var string[] */ protected $colors; /** * Execute the command. * * @param bool $inverted Whether to invert matching process (why-not vs why behaviour) * @return int Exit code of the operation. */ protected function doExecute(InputInterface $input, OutputInterface $output, bool $inverted = \false) : int { // Emit command event on startup $composer = $this->requireComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, $this->getName(), $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $repos = []; $repos[] = new RootPackageRepository(clone $composer->getPackage()); if ($input->getOption('locked')) { $locker = $composer->getLocker(); if (!$locker->isLocked()) { throw new \UnexpectedValueException('A valid composer.lock file is required to run this command with --locked'); } $repos[] = $locker->getLockedRepository(\true); $repos[] = new PlatformRepository([], $locker->getPlatformOverrides()); } else { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $rootPkg = $composer->getPackage(); if (\count($localRepo->getPackages()) === 0 && (\count($rootPkg->getRequires()) > 0 || \count($rootPkg->getDevRequires()) > 0)) { $output->writeln('No dependencies installed. Try running composer install or update, or use --locked.'); return 1; } $repos[] = $localRepo; $platformOverrides = $composer->getConfig()->get('platform') ?: []; $repos[] = new PlatformRepository([], $platformOverrides); } $installedRepo = new InstalledRepository($repos); // Parse package name and constraint $needle = $input->getArgument(self::ARGUMENT_PACKAGE); $textConstraint = $input->hasArgument(self::ARGUMENT_CONSTRAINT) ? $input->getArgument(self::ARGUMENT_CONSTRAINT) : '*'; // Find packages that are or provide the requested package first $packages = $installedRepo->findPackagesWithReplacersAndProviders($needle); if (empty($packages)) { throw new \InvalidArgumentException(\sprintf('Could not find package "%s" in your project', $needle)); } // If the version we ask for is not installed then we need to locate it in remote repos and add it. // This is needed for why-not to resolve conflicts from an uninstalled version against installed packages. $matchedPackage = $installedRepo->findPackage($needle, $textConstraint); if (!$matchedPackage) { $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO(), $composer->getConfig(), $composer->getRepositoryManager())); if ($match = $defaultRepos->findPackage($needle, $textConstraint)) { $installedRepo->addRepository(new InstalledArrayRepository([clone $match])); } elseif (PlatformRepository::isPlatformPackage($needle)) { $parser = new VersionParser(); $constraint = $parser->parseConstraints($textConstraint); if ($constraint->getLowerBound() !== Bound::zero()) { $tempPlatformPkg = new Package($needle, $constraint->getLowerBound()->getVersion(), $constraint->getLowerBound()->getVersion()); $installedRepo->addRepository(new InstalledArrayRepository([$tempPlatformPkg])); } } else { $this->getIO()->writeError('Package "' . $needle . '" could not be found with constraint "' . $textConstraint . '", results below will most likely be incomplete.'); } } elseif (PlatformRepository::isPlatformPackage($needle)) { $extraNotice = ''; if (($matchedPackage->getExtra()['config.platform'] ?? \false) === \true) { $extraNotice = ' (version provided by config.platform)'; } $this->getIO()->writeError('Package "' . $needle . ' ' . $textConstraint . '" found in version "' . $matchedPackage->getPrettyVersion() . '"' . $extraNotice . '.'); } elseif ($inverted) { $this->getIO()->write('Package "' . $needle . '" ' . $matchedPackage->getPrettyVersion() . ' is already installed! To find out why, run `composer why ' . $needle . '`'); return 0; } // Include replaced packages for inverted lookups as they are then the actual starting point to consider $needles = [$needle]; if ($inverted) { foreach ($packages as $package) { $needles = \array_merge($needles, \array_map(static function (Link $link) : string { return $link->getTarget(); }, $package->getReplaces())); } } // Parse constraint if one was supplied if ('*' !== $textConstraint) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($textConstraint); } else { $constraint = null; } // Parse rendering options $renderTree = $input->getOption(self::OPTION_TREE); $recursive = $renderTree || $input->getOption(self::OPTION_RECURSIVE); $return = $inverted ? 1 : 0; // Resolve dependencies $results = $installedRepo->getDependents($needles, $constraint, $inverted, $recursive); if (empty($results)) { $extra = null !== $constraint ? \sprintf(' in versions %smatching %s', $inverted ? 'not ' : '', $textConstraint) : ''; $this->getIO()->writeError(\sprintf('There is no installed package depending on "%s"%s', $needle, $extra)); $return = $inverted ? 0 : 1; } elseif ($renderTree) { $this->initStyles($output); $root = $packages[0]; $this->getIO()->write(\sprintf('%s %s %s', $root->getPrettyName(), $root->getPrettyVersion(), $root instanceof CompletePackageInterface ? $root->getDescription() : '')); $this->printTree($results); } else { $this->printTable($output, $results); } if ($inverted && $input->hasArgument(self::ARGUMENT_CONSTRAINT) && !PlatformRepository::isPlatformPackage($needle)) { $composerCommand = 'update'; foreach ($composer->getPackage()->getRequires() as $rootRequirement) { if ($rootRequirement->getTarget() === $needle) { $composerCommand = 'require'; break; } } foreach ($composer->getPackage()->getDevRequires() as $rootRequirement) { if ($rootRequirement->getTarget() === $needle) { $composerCommand = 'require --dev'; break; } } $this->getIO()->writeError('Not finding what you were looking for? Try calling `composer ' . $composerCommand . ' "' . $needle . ':' . $textConstraint . '" --dry-run` to get another view on the problem.'); } return $return; } /** * Assembles and prints a bottom-up table of the dependencies. * * @param array{PackageInterface, Link, array|false}[] $results */ protected function printTable(OutputInterface $output, array $results) : void { $table = []; $doubles = []; do { $queue = []; $rows = []; foreach ($results as $result) { /** * @var PackageInterface $package * @var Link $link */ [$package, $link, $children] = $result; $unique = (string) $link; if (isset($doubles[$unique])) { continue; } $doubles[$unique] = \true; $version = $package->getPrettyVersion() === RootPackage::DEFAULT_PRETTY_VERSION ? '-' : $package->getPrettyVersion(); $packageUrl = PackageInfo::getViewSourceOrHomepageUrl($package); $nameWithLink = $packageUrl !== null ? '' . $package->getPrettyName() . '' : $package->getPrettyName(); $rows[] = [$nameWithLink, $version, $link->getDescription(), \sprintf('%s (%s)', $link->getTarget(), $link->getPrettyConstraint())]; if (\is_array($children)) { $queue = \array_merge($queue, $children); } } $results = $queue; $table = \array_merge($rows, $table); } while (\count($results) > 0); $this->renderTable($table, $output); } /** * Init styles for tree */ protected function initStyles(OutputInterface $output) : void { $this->colors = ['green', 'yellow', 'cyan', 'magenta', 'blue']; foreach ($this->colors as $color) { $style = new OutputFormatterStyle($color); $output->getFormatter()->setStyle($color, $style); } } /** * Recursively prints a tree of the selected results. * * @param array{PackageInterface, Link, array|false}[] $results Results to be printed at this level. * @param string $prefix Prefix of the current tree level. * @param int $level Current level of recursion. */ protected function printTree(array $results, string $prefix = '', int $level = 1) : void { $count = \count($results); $idx = 0; foreach ($results as $result) { [$package, $link, $children] = $result; $color = $this->colors[$level % \count($this->colors)]; $prevColor = $this->colors[($level - 1) % \count($this->colors)]; $isLast = ++$idx === $count; $versionText = $package->getPrettyVersion() === RootPackage::DEFAULT_PRETTY_VERSION ? '' : $package->getPrettyVersion(); $packageUrl = PackageInfo::getViewSourceOrHomepageUrl($package); $nameWithLink = $packageUrl !== null ? '' . $package->getPrettyName() . '' : $package->getPrettyName(); $packageText = \rtrim(\sprintf('<%s>%s %s', $color, $nameWithLink, $versionText)); $linkText = \sprintf('%s <%s>%s %s', $link->getDescription(), $prevColor, $link->getTarget(), $link->getPrettyConstraint()); $circularWarn = $children === \false ? '(circular dependency aborted here)' : ''; $this->writeTreeLine(\rtrim(\sprintf("%s%s%s (%s) %s", $prefix, $isLast ? '└──' : '├──', $packageText, $linkText, $circularWarn))); if (\is_array($children)) { $this->printTree($children, $prefix . ($isLast ? ' ' : '│ '), $level + 1); } } } private function writeTreeLine(string $line) : void { $io = $this->getIO(); if (!$io->isDecorated()) { $line = \str_replace(['└', '├', '──', '│'], ['`-', '|-', '-', '|'], $line); } $io->write($line); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; /** * @author Niels Keurentjes */ class DependsCommand extends \Composer\Command\BaseDependencyCommand { use \Composer\Command\CompletionTrait; /** * Configure command metadata. */ protected function configure() : void { $this->setName('depends')->setAliases(['why'])->setDescription('Shows which packages cause the given package to be installed')->setDefinition([new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(\true, \true)), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Read dependency information from composer.lock')])->setHelp(<<php composer.phar depends composer/composer Read more at https://getcomposer.org/doc/03-cli.md#depends-why EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { return parent::doExecute($input, $output); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; /** * @author Niels Keurentjes */ class ProhibitsCommand extends \Composer\Command\BaseDependencyCommand { use \Composer\Command\CompletionTrait; /** * Configure command metadata. */ protected function configure() : void { $this->setName('prohibits')->setAliases(['why-not'])->setDescription('Shows which packages prevent the given package from being installed')->setDefinition([new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestAvailablePackage()), new InputArgument(self::ARGUMENT_CONSTRAINT, InputArgument::REQUIRED, 'Version constraint, which version you expected to be installed'), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Read dependency information from composer.lock')])->setHelp(<<php composer.phar prohibits composer/composer Read more at https://getcomposer.org/doc/03-cli.md#prohibits-why-not EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { return parent::doExecute($input, $output, \true); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\PlatformRepository; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Json\JsonFile; class CheckPlatformReqsCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('check-platform-reqs')->setDescription('Check that platform requirements are satisfied')->setDefinition([new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables checking of require-dev packages requirements.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Checks requirements only from the lock file, not from installed packages.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text'])])->setHelp(<<php composer.phar check-platform-reqs EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); $requires = []; $removePackages = []; if ($input->getOption('lock')) { $this->getIO()->writeError('Checking ' . ($input->getOption('no-dev') ? 'non-dev ' : '') . 'platform requirements using the lock file'); $installedRepo = $composer->getLocker()->getLockedRepository(!$input->getOption('no-dev')); } else { $installedRepo = $composer->getRepositoryManager()->getLocalRepository(); // fallback to lockfile if installed repo is empty if (!$installedRepo->getPackages()) { $this->getIO()->writeError('No vendor dir present, checking ' . ($input->getOption('no-dev') ? 'non-dev ' : '') . 'platform requirements from the lock file'); $installedRepo = $composer->getLocker()->getLockedRepository(!$input->getOption('no-dev')); } else { if ($input->getOption('no-dev')) { $removePackages = $installedRepo->getDevPackageNames(); } $this->getIO()->writeError('Checking ' . ($input->getOption('no-dev') ? 'non-dev ' : '') . 'platform requirements for packages in the vendor dir'); } } if (!$input->getOption('no-dev')) { foreach ($composer->getPackage()->getDevRequires() as $require => $link) { $requires[$require] = [$link]; } } $installedRepo = new InstalledRepository([$installedRepo, new RootPackageRepository(clone $composer->getPackage())]); foreach ($installedRepo->getPackages() as $package) { if (\in_array($package->getName(), $removePackages, \true)) { continue; } foreach ($package->getRequires() as $require => $link) { $requires[$require][] = $link; } } \ksort($requires); $installedRepo->addRepository(new PlatformRepository([], [])); $results = []; $exitCode = 0; /** * @var Link[] $links */ foreach ($requires as $require => $links) { if (PlatformRepository::isPlatformPackage($require)) { $candidates = $installedRepo->findPackagesWithReplacersAndProviders($require); if ($candidates) { $reqResults = []; foreach ($candidates as $candidate) { $candidateConstraint = null; if ($candidate->getName() === $require) { $candidateConstraint = new Constraint('=', $candidate->getVersion()); $candidateConstraint->setPrettyString($candidate->getPrettyVersion()); } else { foreach (\array_merge($candidate->getProvides(), $candidate->getReplaces()) as $link) { if ($link->getTarget() === $require) { $candidateConstraint = $link->getConstraint(); break; } } } // safety check for phpstan, but it should not be possible to get a candidate out of findPackagesWithReplacersAndProviders without a constraint matching $require if (!$candidateConstraint) { continue; } foreach ($links as $link) { if (!$link->getConstraint()->matches($candidateConstraint)) { $reqResults[] = [$candidate->getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), $link, 'failed', $candidate->getName() === $require ? '' : 'provided by ' . $candidate->getPrettyName() . '']; // skip to next candidate continue 2; } } $results[] = [$candidate->getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), null, 'success', $candidate->getName() === $require ? '' : 'provided by ' . $candidate->getPrettyName() . '']; // candidate matched, skip to next requirement continue 2; } // show the first error from every failed candidate $results = \array_merge($results, $reqResults); $exitCode = \max($exitCode, 1); continue; } $results[] = [$require, 'n/a', $links[0], 'missing', '']; $exitCode = \max($exitCode, 2); } } $this->printTable($output, $results, $input->getOption('format')); return $exitCode; } /** * @param mixed[] $results */ protected function printTable(OutputInterface $output, array $results, string $format) : void { $rows = []; foreach ($results as $result) { /** * @var Link|null $link */ [$platformPackage, $version, $link, $status, $provider] = $result; if ('json' === $format) { $rows[] = ["name" => $platformPackage, "version" => $version, "status" => \strip_tags($status), "failed_requirement" => $link instanceof Link ? ['source' => $link->getSource(), 'type' => $link->getDescription(), 'target' => $link->getTarget(), 'constraint' => $link->getPrettyConstraint()] : null, "provider" => $provider === '' ? null : \strip_tags($provider)]; } else { $rows[] = [$platformPackage, $version, $link, $link ? \sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', \rtrim($status . ' ' . $provider)]; } } if ('json' === $format) { $this->getIO()->write(JsonFile::encode($rows)); } else { $this->renderTable($rows, $output); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Factory; use Composer\Config; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\SelfUpdate\Keys; use Composer\SelfUpdate\Versions; use Composer\IO\IOInterface; use Composer\Downloader\FilesystemException; use Composer\Downloader\TransportException; use Phar; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Finder\Finder; /** * @author Igor Wiedler * @author Kevin Ran * @author Jordi Boggiano */ class SelfUpdateCommand extends \Composer\Command\BaseCommand { private const HOMEPAGE = 'getcomposer.org'; private const OLD_INSTALL_EXT = '-old.phar'; protected function configure() : void { $this->setName('self-update')->setAliases(['selfupdate'])->setDescription('Updates composer.phar to the latest version')->setDefinition([new InputOption('rollback', 'r', InputOption::VALUE_NONE, 'Revert to an older installation of composer'), new InputOption('clean-backups', null, InputOption::VALUE_NONE, 'Delete old backups during an update. This makes the current version of composer the only backup available after the update'), new InputArgument('version', InputArgument::OPTIONAL, 'The version to update to'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('update-keys', null, InputOption::VALUE_NONE, 'Prompt user for a key update'), new InputOption('stable', null, InputOption::VALUE_NONE, 'Force an update to the stable channel'), new InputOption('preview', null, InputOption::VALUE_NONE, 'Force an update to the preview channel'), new InputOption('snapshot', null, InputOption::VALUE_NONE, 'Force an update to the snapshot channel'), new InputOption('1', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 1.x versions'), new InputOption('2', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 2.x versions'), new InputOption('2.2', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 2.2.x LTS versions'), new InputOption('set-channel-only', null, InputOption::VALUE_NONE, 'Only store the channel as the default one and then exit')])->setHelp(<<self-update command checks getcomposer.org for newer versions of composer and if found, installs the latest. php composer.phar self-update Read more at https://getcomposer.org/doc/03-cli.md#self-update-selfupdate EOT ); } /** * @throws FilesystemException */ protected function execute(InputInterface $input, OutputInterface $output) : int { if ($_SERVER['argv'][0] === 'Standard input code') { return 1; } // trigger autoloading of a few classes which may be needed when verifying/swapping the phar file // to ensure we do not try to load them from the new phar, see https://github.com/composer/composer/issues/10252 \class_exists('Composer\\Util\\Platform'); \class_exists('Composer\\Downloader\\FilesystemException'); $config = Factory::createConfig(); if ($config->get('disable-tls') === \true) { $baseUrl = 'http://' . self::HOMEPAGE; } else { $baseUrl = 'https://' . self::HOMEPAGE; } $io = $this->getIO(); $httpDownloader = Factory::createHttpDownloader($io, $config); $versionsUtil = new Versions($config, $httpDownloader); // switch channel if requested $requestedChannel = null; foreach (Versions::CHANNELS as $channel) { if ($input->getOption($channel)) { $requestedChannel = $channel; $versionsUtil->setChannel($channel, $io); break; } } if ($input->getOption('set-channel-only')) { return 0; } $cacheDir = $config->get('cache-dir'); $rollbackDir = $config->get('data-dir'); $home = $config->get('home'); $localFilename = Phar::running(\false); if ('' === $localFilename) { throw new \RuntimeException('Could not determine the location of the composer.phar file as it appears you are not running this code from a phar archive.'); } if ($input->getOption('update-keys')) { $this->fetchKeys($io, $config); return 0; } // ensure composer.phar location is accessible if (!\file_exists($localFilename)) { throw new FilesystemException('Composer update failed: the "' . $localFilename . '" is not accessible'); } // check if current dir is writable and if not try the cache dir from settings $tmpDir = \is_writable(\dirname($localFilename)) ? \dirname($localFilename) : $cacheDir; // check for permissions in local filesystem before start connection process if (!\is_writable($tmpDir)) { throw new FilesystemException('Composer update failed: the "' . $tmpDir . '" directory used to download the temp file could not be written'); } // check if composer is running as the same user that owns the directory root, only if POSIX is defined and callable if (\function_exists('posix_getpwuid') && \function_exists('posix_geteuid')) { $composerUser = \posix_getpwuid(\posix_geteuid()); $homeDirOwnerId = \fileowner($home); if (\is_array($composerUser) && $homeDirOwnerId !== \false) { $homeOwner = \posix_getpwuid($homeDirOwnerId); if (\is_array($homeOwner) && $composerUser['name'] !== $homeOwner['name']) { $io->writeError('You are running Composer as "' . $composerUser['name'] . '", while "' . $home . '" is owned by "' . $homeOwner['name'] . '"'); } } } if ($input->getOption('rollback')) { return $this->rollback($output, $rollbackDir, $localFilename); } if ($input->getArgument('command') === 'self' && $input->getArgument('version') === 'update') { $input->setArgument('version', null); } $latest = $versionsUtil->getLatest(); $latestStable = $versionsUtil->getLatest('stable'); try { $latestPreview = $versionsUtil->getLatest('preview'); } catch (\UnexpectedValueException $e) { $latestPreview = $latestStable; } $latestVersion = $latest['version']; $updateVersion = $input->getArgument('version') ?? $latestVersion; $currentMajorVersion = Preg::replace('{^(\\d+).*}', '$1', Composer::getVersion()); $updateMajorVersion = Preg::replace('{^(\\d+).*}', '$1', $updateVersion); $previewMajorVersion = Preg::replace('{^(\\d+).*}', '$1', $latestPreview['version']); if ($versionsUtil->getChannel() === 'stable' && null === $input->getArgument('version')) { // if requesting stable channel and no specific version, avoid automatically upgrading to the next major // simply output a warning that the next major stable is available and let users upgrade to it manually if ($currentMajorVersion < $updateMajorVersion) { $skippedVersion = $updateVersion; $versionsUtil->setChannel($currentMajorVersion); $latest = $versionsUtil->getLatest(); $latestStable = $versionsUtil->getLatest('stable'); $latestVersion = $latest['version']; $updateVersion = $latestVersion; $io->writeError('A new stable major version of Composer is available (' . $skippedVersion . '), run "composer self-update --' . $updateMajorVersion . '" to update to it. See also https://getcomposer.org/' . $updateMajorVersion . ''); } elseif ($currentMajorVersion < $previewMajorVersion) { // promote next major version if available in preview $io->writeError('A preview release of the next major version of Composer is available (' . $latestPreview['version'] . '), run "composer self-update --preview" to give it a try. See also https://github.com/composer/composer/releases for changelogs.'); } } $effectiveChannel = $requestedChannel === null ? $versionsUtil->getChannel() : $requestedChannel; if (\is_numeric($effectiveChannel) && \strpos($latestStable['version'], $effectiveChannel) !== 0) { $io->writeError('Warning: You forced the install of ' . $latestVersion . ' via --' . $effectiveChannel . ', but ' . $latestStable['version'] . ' is the latest stable version. Updating to it via composer self-update --stable is recommended.'); } if (isset($latest['eol'])) { $io->writeError('Warning: Version ' . $latestVersion . ' is EOL / End of Life. ' . $latestStable['version'] . ' is the latest stable version. Updating to it via composer self-update --stable is recommended.'); } if (Preg::isMatch('{^[0-9a-f]{40}$}', $updateVersion) && $updateVersion !== $latestVersion) { $io->writeError('You can not update to a specific SHA-1 as those phars are not available for download'); return 1; } $channelString = $versionsUtil->getChannel(); if (\is_numeric($channelString)) { $channelString .= '.x'; } if (Composer::VERSION === $updateVersion) { $io->writeError(\sprintf('You are already using the latest available Composer version %s (%s channel).', $updateVersion, $channelString)); // remove all backups except for the most recent, if any if ($input->getOption('clean-backups')) { $this->cleanBackups($rollbackDir, $this->getLastBackupVersion($rollbackDir)); } return 0; } $tempFilename = $tmpDir . '/' . \basename($localFilename, '.phar') . '-temp' . \random_int(0, 10000000) . '.phar'; $backupFile = \sprintf('%s/%s-%s%s', $rollbackDir, \strtr(Composer::RELEASE_DATE, ' :', '_-'), Preg::replace('{^([0-9a-f]{7})[0-9a-f]{33}$}', '$1', Composer::VERSION), self::OLD_INSTALL_EXT); $updatingToTag = !Preg::isMatch('{^[0-9a-f]{40}$}', $updateVersion); $io->write(\sprintf("Upgrading to version %s (%s channel).", $updateVersion, $channelString)); $remoteFilename = $baseUrl . ($updatingToTag ? "/download/{$updateVersion}/composer.phar" : '/composer.phar'); try { $signature = $httpDownloader->get($remoteFilename . '.sig')->getBody(); } catch (TransportException $e) { if ($e->getStatusCode() === 404) { throw new \InvalidArgumentException('Version "' . $updateVersion . '" could not be found.', 0, $e); } throw $e; } $io->writeError(' ', \false); $httpDownloader->copy($remoteFilename, $tempFilename); $io->writeError(''); if (!\file_exists($tempFilename) || null === $signature || '' === $signature) { $io->writeError('The download of the new composer version failed for an unexpected reason'); return 1; } // verify phar signature if (!\extension_loaded('openssl') && $config->get('disable-tls')) { $io->writeError('Skipping phar signature verification as you have disabled OpenSSL via config.disable-tls'); } else { if (!\extension_loaded('openssl')) { throw new \RuntimeException('The openssl extension is required for phar signatures to be verified but it is not available. ' . 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); } $sigFile = 'file://' . $home . '/' . ($updatingToTag ? 'keys.tags.pub' : 'keys.dev.pub'); if (!\file_exists($sigFile)) { \file_put_contents($home . '/keys.dev.pub', <<getOption('clean-backups')) { $this->cleanBackups($rollbackDir); } if (!$this->setLocalPhar($localFilename, $tempFilename, $backupFile)) { @\unlink($tempFilename); return 1; } if (\file_exists($backupFile)) { $io->writeError(\sprintf('Use composer self-update --rollback to return to version %s', Composer::VERSION)); } else { $io->writeError('A backup of the current version could not be written to ' . $backupFile . ', no rollback possible'); } return 0; } /** * @throws \Exception */ protected function fetchKeys(IOInterface $io, Config $config) : void { if (!$io->isInteractive()) { throw new \RuntimeException('Public keys can not be fetched in non-interactive mode, please run Composer interactively'); } $io->write('Open https://composer.github.io/pubkeys.html to find the latest keys'); $validator = static function ($value) : string { $value = (string) $value; if (!Preg::isMatch('{^-----BEGIN PUBLIC KEY-----$}', \trim($value))) { throw new \UnexpectedValueException('Invalid input'); } return \trim($value) . "\n"; }; $devKey = ''; while (!Preg::isMatch('{(-----BEGIN PUBLIC KEY-----.+?-----END PUBLIC KEY-----)}s', $devKey, $match)) { $devKey = $io->askAndValidate('Enter Dev / Snapshot Public Key (including lines with -----): ', $validator); while ($line = $io->ask('', '')) { $devKey .= \trim($line) . "\n"; if (\trim($line) === '-----END PUBLIC KEY-----') { break; } } } \file_put_contents($keyPath = $config->get('home') . '/keys.dev.pub', $match[0]); $io->write('Stored key with fingerprint: ' . Keys::fingerprint($keyPath)); $tagsKey = ''; while (!Preg::isMatch('{(-----BEGIN PUBLIC KEY-----.+?-----END PUBLIC KEY-----)}s', $tagsKey, $match)) { $tagsKey = $io->askAndValidate('Enter Tags Public Key (including lines with -----): ', $validator); while ($line = $io->ask('', '')) { $tagsKey .= \trim($line) . "\n"; if (\trim($line) === '-----END PUBLIC KEY-----') { break; } } } \file_put_contents($keyPath = $config->get('home') . '/keys.tags.pub', $match[0]); $io->write('Stored key with fingerprint: ' . Keys::fingerprint($keyPath)); $io->write('Public keys stored in ' . $config->get('home')); } /** * @throws FilesystemException */ protected function rollback(OutputInterface $output, string $rollbackDir, string $localFilename) : int { $rollbackVersion = $this->getLastBackupVersion($rollbackDir); if (null === $rollbackVersion) { throw new \UnexpectedValueException('Composer rollback failed: no installation to roll back to in "' . $rollbackDir . '"'); } $oldFile = $rollbackDir . '/' . $rollbackVersion . self::OLD_INSTALL_EXT; if (!\is_file($oldFile)) { throw new FilesystemException('Composer rollback failed: "' . $oldFile . '" could not be found'); } if (!Filesystem::isReadable($oldFile)) { throw new FilesystemException('Composer rollback failed: "' . $oldFile . '" could not be read'); } $io = $this->getIO(); $io->writeError(\sprintf("Rolling back to version %s.", $rollbackVersion)); if (!$this->setLocalPhar($localFilename, $oldFile)) { return 1; } return 0; } /** * Checks if the downloaded/rollback phar is valid then moves it * * @param string $localFilename The composer.phar location * @param string $newFilename The downloaded or backup phar * @param string $backupTarget The filename to use for the backup * @throws FilesystemException If the file cannot be moved * @return bool Whether the phar is valid and has been moved */ protected function setLocalPhar(string $localFilename, string $newFilename, ?string $backupTarget = null) : bool { $io = $this->getIO(); $perms = @\fileperms($localFilename); if ($perms !== \false) { @\chmod($newFilename, $perms); } // check phar validity if (!$this->validatePhar($newFilename, $error)) { $io->writeError('The ' . ($backupTarget !== null ? 'update' : 'backup') . ' file is corrupted (' . $error . ')'); if ($backupTarget !== null) { $io->writeError('Please re-run the self-update command to try again.'); } return \false; } // copy current file into backups dir if ($backupTarget !== null) { @\copy($localFilename, $backupTarget); } try { if (Platform::isWindows()) { // use copy to apply permissions from the destination directory // as rename uses source permissions and may block other users \copy($newFilename, $localFilename); @\unlink($newFilename); } else { \rename($newFilename, $localFilename); } return \true; } catch (\Exception $e) { // see if we can run this operation as an Admin on Windows if (!\is_writable(\dirname($localFilename)) && $io->isInteractive() && $this->isWindowsNonAdminUser()) { return $this->tryAsWindowsAdmin($localFilename, $newFilename); } @\unlink($newFilename); $action = 'Composer ' . ($backupTarget !== null ? 'update' : 'rollback'); throw new FilesystemException($action . ' failed: "' . $localFilename . '" could not be written.' . \PHP_EOL . $e->getMessage()); } } protected function cleanBackups(string $rollbackDir, ?string $except = null) : void { $finder = $this->getOldInstallationFinder($rollbackDir); $io = $this->getIO(); $fs = new Filesystem(); foreach ($finder as $file) { if ($file->getBasename(self::OLD_INSTALL_EXT) === $except) { continue; } $file = (string) $file; $io->writeError('Removing: ' . $file . ''); $fs->remove($file); } } protected function getLastBackupVersion(string $rollbackDir) : ?string { $finder = $this->getOldInstallationFinder($rollbackDir); $finder->sortByName(); $files = \iterator_to_array($finder); if (\count($files) > 0) { return \end($files)->getBasename(self::OLD_INSTALL_EXT); } return null; } protected function getOldInstallationFinder(string $rollbackDir) : Finder { return Finder::create()->depth(0)->files()->name('*' . self::OLD_INSTALL_EXT)->in($rollbackDir); } /** * Validates the downloaded/backup phar file * * @param string $pharFile The downloaded or backup phar * @param null|string $error Set by method on failure * * Code taken from getcomposer.org/installer. Any changes should be made * there and replicated here * * @throws \Exception * @return bool If the operation succeeded */ protected function validatePhar(string $pharFile, ?string &$error) : bool { if ((bool) \ini_get('phar.readonly')) { return \true; } try { // Test the phar validity $phar = new \Phar($pharFile); // Free the variable to unlock the file unset($phar); $result = \true; } catch (\Exception $e) { if (!$e instanceof \UnexpectedValueException && !$e instanceof \PharException) { throw $e; } $error = $e->getMessage(); $result = \false; } return $result; } /** * Returns true if this is a non-admin Windows user account */ protected function isWindowsNonAdminUser() : bool { if (!Platform::isWindows()) { return \false; } // fltmc.exe manages filter drivers and errors without admin privileges \exec('fltmc.exe filters', $output, $exitCode); return $exitCode !== 0; } /** * Invokes a UAC prompt to update composer.phar as an admin * * Uses a .vbs script to elevate and run the cmd.exe copy command. * * @param string $localFilename The composer.phar location * @param string $newFilename The downloaded or backup phar * @return bool Whether composer.phar has been updated */ protected function tryAsWindowsAdmin(string $localFilename, string $newFilename) : bool { $io = $this->getIO(); $io->writeError('Unable to write "' . $localFilename . '". Access is denied.'); $helpMessage = 'Please run the self-update command as an Administrator.'; $question = 'Complete this operation with Administrator privileges [Y,n]? '; if (!$io->askConfirmation($question, \true)) { $io->writeError('Operation cancelled. ' . $helpMessage . ''); return \false; } $tmpFile = \tempnam(\sys_get_temp_dir(), ''); if (\false === $tmpFile) { $io->writeError('Operation failed.' . $helpMessage . ''); return \false; } $script = $tmpFile . '.vbs'; \rename($tmpFile, $script); $checksum = \hash_file('sha256', $newFilename); // cmd's internal copy is fussy about backslashes $source = \str_replace('/', '\\', $newFilename); $destination = \str_replace('/', '\\', $localFilename); $vbs = <<writeError('Operation succeeded.'); @\unlink($newFilename); } else { $io->writeError('Operation failed.' . $helpMessage . ''); } return $result; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\DependencyResolver\Request; use Composer\Package\AliasPackage; use Composer\Package\CompletePackageInterface; use Composer\Package\Loader\RootPackageLoader; use Composer\Package\Locker; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionBumper; use Composer\Package\Version\VersionSelector; use Composer\Pcre\Preg; use Composer\Repository\RepositorySet; use Composer\Util\Filesystem; use Composer\Util\PackageSorter; use _ContaoManager\Seld\Signal\SignalHandler; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Factory; use Composer\Installer; use Composer\Installer\InstallerEvents; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; use Composer\Package\Version\VersionParser; use Composer\Package\Loader\ArrayLoader; use Composer\Package\BasePackage; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\IO\IOInterface; use Composer\Advisory\Auditor; use Composer\Util\Silencer; /** * @author Jérémy Romey * @author Jordi Boggiano */ class RequireCommand extends \Composer\Command\BaseCommand { use \Composer\Command\CompletionTrait; use \Composer\Command\PackageDiscoveryTrait; /** @var bool */ private $newlyCreated; /** @var bool */ private $firstRequire; /** @var JsonFile */ private $json; /** @var string */ private $file; /** @var string */ private $composerBackup; /** @var string file name */ private $lock; /** @var ?string contents before modification if the lock file exists */ private $lockBackup; /** @var bool */ private $dependencyResolutionCompleted = \false; /** * @return void */ protected function configure() { $this->setName('require')->setAliases(['r'])->setDescription('Adds required packages to your composer.json and installs them')->setDefinition([new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Add requirement to require-dev.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('fixed', null, InputOption::VALUE_NONE, 'Write fixed version to the composer.json.'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated, except those that are root requirements (can also be set via the COMPOSER_WITH_DEPENDENCIES=1 env var).'), new InputOption('update-with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements (can also be set via the COMPOSER_WITH_ALL_DEPENDENCIES=1 env var).'), new InputOption('with-dependencies', null, InputOption::VALUE_NONE, 'Alias for --update-with-dependencies'), new InputOption('with-all-dependencies', null, InputOption::VALUE_NONE, 'Alias for --update-with-all-dependencies'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies (can also be set via the COMPOSER_PREFER_STABLE=1 env var).'), new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies (can also be set via the COMPOSER_PREFER_LOWEST=1 env var).'), new InputOption('minimal-changes', 'm', InputOption::VALUE_NONE, 'During an update with -w/-W, only perform absolutely necessary changes to transitive dependencies (can also be set via the COMPOSER_MINIMAL_CHANGES=1 env var).'), new InputOption('sort-packages', null, InputOption::VALUE_NONE, 'Sorts packages when adding/updating a new dependency'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader')])->setHelp(<<file = Factory::getComposerFile(); $io = $this->getIO(); if ($input->getOption('no-suggest')) { $io->writeError('You are using the deprecated option "--no-suggest". It has no effect and will break in Composer 3.'); } $this->newlyCreated = !\file_exists($this->file); if ($this->newlyCreated && !\file_put_contents($this->file, "{\n}\n")) { $io->writeError('' . $this->file . ' could not be created.'); return 1; } if (!Filesystem::isReadable($this->file)) { $io->writeError('' . $this->file . ' is not readable.'); return 1; } if (\filesize($this->file) === 0) { \file_put_contents($this->file, "{\n}\n"); } $this->json = new JsonFile($this->file); $this->lock = Factory::getLockFile($this->file); $this->composerBackup = \file_get_contents($this->json->getPath()); $this->lockBackup = \file_exists($this->lock) ? \file_get_contents($this->lock) : null; $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) { $this->getIO()->writeError('Received ' . $signal . ', aborting', \true, IOInterface::DEBUG); $this->revertComposerFile(); $handler->exitWithLastSignal(); }); // check for writability by writing to the file as is_writable can not be trusted on network-mounts // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 if (!\is_writable($this->file) && \false === Silencer::call('file_put_contents', $this->file, $this->composerBackup)) { $io->writeError('' . $this->file . ' is not writable.'); return 1; } if ($input->getOption('fixed') === \true) { $config = $this->json->read(); $packageType = empty($config['type']) ? 'library' : $config['type']; /** * @see https://github.com/composer/composer/pull/8313#issuecomment-532637955 */ if ($packageType !== 'project' && !$input->getOption('dev')) { $io->writeError('The "--fixed" option is only allowed for packages with a "project" type or for dev dependencies to prevent possible misuses.'); if (!isset($config['type'])) { $io->writeError('If your package is not a library, you can explicitly specify the "type" by using "composer config type project".'); } return 1; } } $composer = $this->requireComposer(); $repos = $composer->getRepositoryManager()->getRepositories(); $platformOverrides = $composer->getConfig()->get('platform'); // initialize $this->repos as it is used by the PackageDiscoveryTrait $this->repos = new CompositeRepository(\array_merge([$platformRepo = new PlatformRepository([], $platformOverrides)], $repos)); if ($composer->getPackage()->getPreferStable()) { $preferredStability = 'stable'; } else { $preferredStability = $composer->getPackage()->getMinimumStability(); } try { $requirements = $this->determineRequirements( $input, $output, $input->getArgument('packages'), $platformRepo, $preferredStability, $input->getOption('no-update'), // if there is no update, we need to use the best possible version constraint directly as we cannot rely on the solver to guess the best constraint $input->getOption('fixed') ); } catch (\Exception $e) { if ($this->newlyCreated) { $this->revertComposerFile(); throw new \RuntimeException('No composer.json present in the current directory (' . $this->file . '), this may be the cause of the following exception.', 0, $e); } throw $e; } $requirements = $this->formatRequirements($requirements); if (!$input->getOption('dev') && $io->isInteractive() && !$composer->isGlobal()) { $devPackages = []; $devTags = ['dev', 'testing', 'static analysis']; $currentRequiresByKey = $this->getPackagesByRequireKey(); foreach ($requirements as $name => $version) { // skip packages which are already in the composer.json as those have already been decided if (isset($currentRequiresByKey[$name])) { continue; } $pkg = PackageSorter::getMostCurrentVersion($this->getRepos()->findPackages($name)); if ($pkg instanceof CompletePackageInterface) { $pkgDevTags = \array_intersect($devTags, \array_map('strtolower', $pkg->getKeywords())); if (\count($pkgDevTags) > 0) { $devPackages[] = $pkgDevTags; } } } if (\count($devPackages) === \count($requirements)) { $plural = \count($requirements) > 1 ? 's' : ''; $plural2 = \count($requirements) > 1 ? 'are' : 'is'; $plural3 = \count($requirements) > 1 ? 'they are' : 'it is'; $pkgDevTags = \array_unique(\array_merge(...$devPackages)); $io->warning('The package' . $plural . ' you required ' . $plural2 . ' recommended to be placed in require-dev (because ' . $plural3 . ' tagged as "' . \implode('", "', $pkgDevTags) . '") but you did not use --dev.'); if ($io->askConfirmation('Do you want to re-run the command with --dev? [yes]? ')) { $input->setOption('dev', \true); } } unset($devPackages, $pkgDevTags); } $requireKey = $input->getOption('dev') ? 'require-dev' : 'require'; $removeKey = $input->getOption('dev') ? 'require' : 'require-dev'; // check which requirements need the version guessed $requirementsToGuess = []; foreach ($requirements as $package => $constraint) { if ($constraint === 'guess') { $requirements[$package] = '*'; $requirementsToGuess[] = $package; } } // validate requirements format $versionParser = new VersionParser(); foreach ($requirements as $package => $constraint) { if (\strtolower($package) === $composer->getPackage()->getName()) { $io->writeError(\sprintf('Root package \'%s\' cannot require itself in its composer.json', $package)); return 1; } if ($constraint === 'self.version') { continue; } $versionParser->parseConstraints($constraint); } $inconsistentRequireKeys = $this->getInconsistentRequireKeys($requirements, $requireKey); if (\count($inconsistentRequireKeys) > 0) { foreach ($inconsistentRequireKeys as $package) { $io->warning(\sprintf('%s is currently present in the %s key and you ran the command %s the --dev flag, which will move it to the %s key.', $package, $removeKey, $input->getOption('dev') ? 'with' : 'without', $requireKey)); } if ($io->isInteractive()) { if (!$io->askConfirmation(\sprintf('Do you want to move %s? [no]? ', \count($inconsistentRequireKeys) > 1 ? 'these requirements' : 'this requirement'), \false)) { if (!$io->askConfirmation(\sprintf('Do you want to re-run the command %s --dev? [yes]? ', $input->getOption('dev') ? 'without' : 'with'), \true)) { return 0; } $input->setOption('dev', \true); [$requireKey, $removeKey] = [$removeKey, $requireKey]; } } } $sortPackages = $input->getOption('sort-packages') || $composer->getConfig()->get('sort-packages'); $this->firstRequire = $this->newlyCreated; if (!$this->firstRequire) { $composerDefinition = $this->json->read(); if (\count($composerDefinition['require'] ?? []) === 0 && \count($composerDefinition['require-dev'] ?? []) === 0) { $this->firstRequire = \true; } } if (!$input->getOption('dry-run')) { $this->updateFile($this->json, $requirements, $requireKey, $removeKey, $sortPackages); } $io->writeError('' . $this->file . ' has been ' . ($this->newlyCreated ? 'created' : 'updated') . ''); if ($input->getOption('no-update')) { return 0; } $composer->getPluginManager()->deactivateInstalledPlugins(); try { $result = $this->doUpdate($input, $output, $io, $requirements, $requireKey, $removeKey); if ($result === 0 && \count($requirementsToGuess) > 0) { $result = $this->updateRequirementsAfterResolution($requirementsToGuess, $requireKey, $removeKey, $sortPackages, $input->getOption('dry-run'), $input->getOption('fixed')); } return $result; } catch (\Exception $e) { if (!$this->dependencyResolutionCompleted) { $this->revertComposerFile(); } throw $e; } finally { if ($input->getOption('dry-run') && $this->newlyCreated) { @\unlink($this->json->getPath()); } $signalHandler->unregister(); } } /** * @param array $newRequirements * @return string[] */ private function getInconsistentRequireKeys(array $newRequirements, string $requireKey) : array { $requireKeys = $this->getPackagesByRequireKey(); $inconsistentRequirements = []; foreach ($requireKeys as $package => $packageRequireKey) { if (!isset($newRequirements[$package])) { continue; } if ($requireKey !== $packageRequireKey) { $inconsistentRequirements[] = $package; } } return $inconsistentRequirements; } /** * @return array */ private function getPackagesByRequireKey() : array { $composerDefinition = $this->json->read(); $require = []; $requireDev = []; if (isset($composerDefinition['require'])) { $require = $composerDefinition['require']; } if (isset($composerDefinition['require-dev'])) { $requireDev = $composerDefinition['require-dev']; } return \array_merge(\array_fill_keys(\array_keys($require), 'require'), \array_fill_keys(\array_keys($requireDev), 'require-dev')); } /** * @param array $requirements * @param 'require'|'require-dev' $requireKey * @param 'require'|'require-dev' $removeKey * @throws \Exception */ private function doUpdate(InputInterface $input, OutputInterface $output, IOInterface $io, array $requirements, string $requireKey, string $removeKey) : int { // Update packages $this->resetComposer(); $composer = $this->requireComposer(); $this->dependencyResolutionCompleted = \false; $composer->getEventDispatcher()->addListener(InstallerEvents::PRE_OPERATIONS_EXEC, function () : void { $this->dependencyResolutionCompleted = \true; }, 10000); if ($input->getOption('dry-run')) { $rootPackage = $composer->getPackage(); $links = ['require' => $rootPackage->getRequires(), 'require-dev' => $rootPackage->getDevRequires()]; $loader = new ArrayLoader(); $newLinks = $loader->parseLinks($rootPackage->getName(), $rootPackage->getPrettyVersion(), BasePackage::$supportedLinkTypes[$requireKey]['method'], $requirements); $links[$requireKey] = \array_merge($links[$requireKey], $newLinks); foreach ($requirements as $package => $constraint) { unset($links[$removeKey][$package]); } $rootPackage->setRequires($links['require']); $rootPackage->setDevRequires($links['require-dev']); // extract stability flags & references as they weren't present when loading the unmodified composer.json $references = $rootPackage->getReferences(); $references = RootPackageLoader::extractReferences($requirements, $references); $rootPackage->setReferences($references); $stabilityFlags = $rootPackage->getStabilityFlags(); $stabilityFlags = RootPackageLoader::extractStabilityFlags($requirements, $rootPackage->getMinimumStability(), $stabilityFlags); $rootPackage->setStabilityFlags($stabilityFlags); unset($stabilityFlags, $references); } $updateDevMode = !$input->getOption('update-no-dev'); $optimize = $input->getOption('optimize-autoloader') || $composer->getConfig()->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $composer->getConfig()->get('classmap-authoritative'); $apcuPrefix = $input->getOption('apcu-autoloader-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu-autoloader') || $composer->getConfig()->get('apcu-autoloader'); $updateAllowTransitiveDependencies = Request::UPDATE_ONLY_LISTED; $flags = ''; if ($input->getOption('update-with-all-dependencies') || $input->getOption('with-all-dependencies')) { $updateAllowTransitiveDependencies = Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS; $flags .= ' --with-all-dependencies'; } elseif ($input->getOption('update-with-dependencies') || $input->getOption('with-dependencies')) { $updateAllowTransitiveDependencies = Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE; $flags .= ' --with-dependencies'; } $io->writeError('Running composer update ' . \implode(' ', \array_keys($requirements)) . $flags . ''); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'require', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $composer->getInstallationManager()->setOutputProgress(!$input->getOption('no-progress')); $install = Installer::create($io, $composer); [$preferSource, $preferDist] = $this->getPreferredInstallOptions($composer->getConfig(), $input); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode($updateDevMode)->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setApcuAutoloader($apcu, $apcuPrefix)->setUpdate(\true)->setInstall(!$input->getOption('no-install'))->setUpdateAllowTransitiveDependencies($updateAllowTransitiveDependencies)->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input))->setPreferStable($input->getOption('prefer-stable'))->setPreferLowest($input->getOption('prefer-lowest'))->setAudit(!$input->getOption('no-audit'))->setAuditFormat($this->getAuditFormat($input))->setMinimalUpdate($input->getOption('minimal-changes')); // if no lock is present, or the file is brand new, we do not do a // partial update as this is not supported by the Installer if (!$this->firstRequire && $composer->getLocker()->isLocked()) { $install->setUpdateAllowList(\array_keys($requirements)); } $status = $install->run(); if ($status !== 0 && $status !== Installer::ERROR_AUDIT_FAILED) { if ($status === Installer::ERROR_DEPENDENCY_RESOLUTION_FAILED) { foreach ($this->normalizeRequirements($input->getArgument('packages')) as $req) { if (!isset($req['version'])) { $io->writeError('You can also try re-running composer require with an explicit version constraint, e.g. "composer require ' . $req['name'] . ':*" to figure out if any version is installable, or "composer require ' . $req['name'] . ':^2.1" if you know which you need.'); break; } } } $this->revertComposerFile(); } return $status; } /** * @param list $requirementsToUpdate */ private function updateRequirementsAfterResolution(array $requirementsToUpdate, string $requireKey, string $removeKey, bool $sortPackages, bool $dryRun, bool $fixed) : int { $composer = $this->requireComposer(); $locker = $composer->getLocker(); $requirements = []; $versionSelector = new VersionSelector(new RepositorySet()); $repo = $locker->isLocked() ? $composer->getLocker()->getLockedRepository(\true) : $composer->getRepositoryManager()->getLocalRepository(); foreach ($requirementsToUpdate as $packageName) { $package = $repo->findPackage($packageName, '*'); while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } if (!$package instanceof PackageInterface) { continue; } if ($fixed) { $requirements[$packageName] = $package->getPrettyVersion(); } else { $requirements[$packageName] = $versionSelector->findRecommendedRequireVersion($package); } $this->getIO()->writeError(\sprintf('Using version %s for %s', $requirements[$packageName], $packageName)); if (Preg::isMatch('{^dev-(?!main$|master$|trunk$|latest$)}', $requirements[$packageName])) { $this->getIO()->warning('Version ' . $requirements[$packageName] . ' looks like it may be a feature branch which is unlikely to keep working in the long run and may be in an unstable state'); if ($this->getIO()->isInteractive() && !$this->getIO()->askConfirmation('Are you sure you want to use this constraint (Y) or would you rather abort (n) the whole operation [Y,n]? ')) { $this->revertComposerFile(); return 1; } } } if (!$dryRun) { $this->updateFile($this->json, $requirements, $requireKey, $removeKey, $sortPackages); if ($locker->isLocked() && $composer->getConfig()->get('lock')) { $stabilityFlags = RootPackageLoader::extractStabilityFlags($requirements, $composer->getPackage()->getMinimumStability(), []); $locker->updateHash($this->json, function (array $lockData) use($stabilityFlags) { foreach ($stabilityFlags as $packageName => $flag) { $lockData['stability-flags'][$packageName] = $flag; } return $lockData; }); } } return 0; } /** * @param array $new */ private function updateFile(JsonFile $json, array $new, string $requireKey, string $removeKey, bool $sortPackages) : void { if ($this->updateFileCleanly($json, $new, $requireKey, $removeKey, $sortPackages)) { return; } $composerDefinition = $this->json->read(); foreach ($new as $package => $version) { $composerDefinition[$requireKey][$package] = $version; unset($composerDefinition[$removeKey][$package]); if (isset($composerDefinition[$removeKey]) && \count($composerDefinition[$removeKey]) === 0) { unset($composerDefinition[$removeKey]); } } $this->json->write($composerDefinition); } /** * @param array $new */ private function updateFileCleanly(JsonFile $json, array $new, string $requireKey, string $removeKey, bool $sortPackages) : bool { $contents = \file_get_contents($json->getPath()); $manipulator = new JsonManipulator($contents); foreach ($new as $package => $constraint) { if (!$manipulator->addLink($requireKey, $package, $constraint, $sortPackages)) { return \false; } if (!$manipulator->removeSubNode($removeKey, $package)) { return \false; } } $manipulator->removeMainKeyIfEmpty($removeKey); \file_put_contents($json->getPath(), $manipulator->getContents()); return \true; } protected function interact(InputInterface $input, OutputInterface $output) : void { } private function revertComposerFile() : void { $io = $this->getIO(); if ($this->newlyCreated) { $io->writeError("\n" . 'Installation failed, deleting ' . $this->file . '.'); \unlink($this->json->getPath()); if (\file_exists($this->lock)) { \unlink($this->lock); } } else { $msg = ' to its '; if ($this->lockBackup) { $msg = ' and ' . $this->lock . ' to their '; } $io->writeError("\n" . 'Installation failed, reverting ' . $this->file . $msg . 'original content.'); \file_put_contents($this->json->getPath(), $this->composerBackup); if ($this->lockBackup) { \file_put_contents($this->lock, $this->lockBackup); } } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Repository\CompositeRepository; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RootPackageRepository; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; /** * Adds completion to arguments and options. * * @internal */ trait CompletionTrait { /** * @see BaseCommand::requireComposer() */ public abstract function requireComposer(?bool $disablePlugins = null, ?bool $disableScripts = null) : Composer; /** * Suggestion values for "prefer-install" option * * @return list */ private function suggestPreferInstall() : array { return ['dist', 'source', 'auto']; } /** * Suggest package names from root requirements. */ private function suggestRootRequirement() : \Closure { return function (CompletionInput $input) : array { $composer = $this->requireComposer(); return \array_merge(\array_keys($composer->getPackage()->getRequires()), \array_keys($composer->getPackage()->getDevRequires())); }; } /** * Suggest package names from installed. */ private function suggestInstalledPackage(bool $includeRootPackage = \true, bool $includePlatformPackages = \false) : \Closure { return function (CompletionInput $input) use($includeRootPackage, $includePlatformPackages) : array { $composer = $this->requireComposer(); $installedRepos = []; if ($includeRootPackage) { $installedRepos[] = new RootPackageRepository(clone $composer->getPackage()); } $locker = $composer->getLocker(); if ($locker->isLocked()) { $installedRepos[] = $locker->getLockedRepository(\true); } else { $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); } $platformHint = []; if ($includePlatformPackages) { if ($locker->isLocked()) { $platformRepo = new PlatformRepository([], $locker->getPlatformOverrides()); } else { $platformRepo = new PlatformRepository([], $composer->getConfig()->get('platform')); } if ($input->getCompletionValue() === '') { // to reduce noise, when no text is yet entered we list only two entries for ext- and lib- prefixes $hintsToFind = ['ext-' => 0, 'lib-' => 0, 'php' => 99, 'composer' => 99]; foreach ($platformRepo->getPackages() as $pkg) { foreach ($hintsToFind as $hintPrefix => $hintCount) { if (\str_starts_with($pkg->getName(), $hintPrefix)) { if ($hintCount === 0 || $hintCount >= 99) { $platformHint[] = $pkg->getName(); $hintsToFind[$hintPrefix]++; } elseif ($hintCount === 1) { unset($hintsToFind[$hintPrefix]); $platformHint[] = \substr($pkg->getName(), 0, \max(\strlen($pkg->getName()) - 3, \strlen($hintPrefix) + 1)) . '...'; } continue 2; } } } } else { $installedRepos[] = $platformRepo; } } $installedRepo = new InstalledRepository($installedRepos); return \array_merge(\array_map(static function (PackageInterface $package) { return $package->getName(); }, $installedRepo->getPackages()), $platformHint); }; } /** * Suggest package names from installed. */ private function suggestInstalledPackageTypes(bool $includeRootPackage = \true) : \Closure { return function (CompletionInput $input) use($includeRootPackage) : array { $composer = $this->requireComposer(); $installedRepos = []; if ($includeRootPackage) { $installedRepos[] = new RootPackageRepository(clone $composer->getPackage()); } $locker = $composer->getLocker(); if ($locker->isLocked()) { $installedRepos[] = $locker->getLockedRepository(\true); } else { $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); } $installedRepo = new InstalledRepository($installedRepos); return \array_values(\array_unique(\array_map(static function (PackageInterface $package) { return $package->getType(); }, $installedRepo->getPackages()))); }; } /** * Suggest package names available on all configured repositories. */ private function suggestAvailablePackage(int $max = 99) : \Closure { return function (CompletionInput $input) use($max) : array { if ($max < 1) { return []; } $composer = $this->requireComposer(); $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $results = []; $showVendors = \false; if (!\str_contains($input->getCompletionValue(), '/')) { $results = $repos->search('^' . \preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_VENDOR); $showVendors = \true; } // if we get a single vendor, we expand it into its contents already if (\count($results) <= 1) { $results = $repos->search('^' . \preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); $showVendors = \false; } $results = \array_column($results, 'name'); if ($showVendors) { $results = \array_map(static function (string $name) : string { return $name . '/'; }, $results); // sort shorter results first to avoid auto-expanding the completion to a longer string than needed \usort($results, static function (string $a, string $b) { $lenA = \strlen($a); $lenB = \strlen($b); if ($lenA === $lenB) { return $a <=> $b; } return $lenA - $lenB; }); $pinned = []; // ensure if the input is an exact match that it is always in the result set $completionInput = $input->getCompletionValue() . '/'; if (\false !== ($exactIndex = \array_search($completionInput, $results, \true))) { $pinned[] = $completionInput; \array_splice($results, $exactIndex, 1); } return \array_merge($pinned, \array_slice($results, 0, $max - \count($pinned))); } return \array_slice($results, 0, $max); }; } /** * Suggest package names available on all configured repositories or * platform packages from the ones available on the currently-running PHP */ private function suggestAvailablePackageInclPlatform() : \Closure { return function (CompletionInput $input) : array { if (Preg::isMatch('{^(ext|lib|php)(-|$)|^com}', $input->getCompletionValue())) { $matches = $this->suggestPlatformPackage()($input); } else { $matches = []; } return \array_merge($matches, $this->suggestAvailablePackage(99 - \count($matches))($input)); }; } /** * Suggest platform packages from the ones available on the currently-running PHP */ private function suggestPlatformPackage() : \Closure { return function (CompletionInput $input) : array { $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform')); $pattern = BasePackage::packageNameToRegexp($input->getCompletionValue() . '*'); return \array_filter(\array_map(static function (PackageInterface $package) { return $package->getName(); }, $repos->getPackages()), static function (string $name) use($pattern) : bool { return Preg::isMatch($pattern, $name); }); }; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Cache; use Composer\Factory; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author David Neilsen */ class ClearCacheCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('clear-cache')->setAliases(['clearcache', 'cc'])->setDescription('Clears composer\'s internal package cache')->setDefinition([new InputOption('gc', null, InputOption::VALUE_NONE, 'Only run garbage collection, not a full cache clear')])->setHelp(<<clear-cache deletes all cached packages from composer's cache directory. Read more at https://getcomposer.org/doc/03-cli.md#clear-cache-clearcache-cc EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->tryComposer(); if ($composer !== null) { $config = $composer->getConfig(); } else { $config = Factory::createConfig(); } $io = $this->getIO(); $cachePaths = ['cache-vcs-dir' => $config->get('cache-vcs-dir'), 'cache-repo-dir' => $config->get('cache-repo-dir'), 'cache-files-dir' => $config->get('cache-files-dir'), 'cache-dir' => $config->get('cache-dir')]; foreach ($cachePaths as $key => $cachePath) { // only individual dirs get garbage collected if ($key === 'cache-dir' && $input->getOption('gc')) { continue; } $cachePath = \realpath($cachePath); if (!$cachePath) { $io->writeError("Cache directory does not exist ({$key}): {$cachePath}"); continue; } $cache = new Cache($io, $cachePath); $cache->setReadOnly($config->get('cache-read-only')); if (!$cache->isEnabled()) { $io->writeError("Cache is not enabled ({$key}): {$cachePath}"); continue; } if ($input->getOption('gc')) { $io->writeError("Garbage-collecting cache ({$key}): {$cachePath}"); if ($key === 'cache-files-dir') { $cache->gc($config->get('cache-files-ttl'), $config->get('cache-files-maxsize')); } elseif ($key === 'cache-repo-dir') { $cache->gc($config->get('cache-ttl'), 1024 * 1024 * 1024); } elseif ($key === 'cache-vcs-dir') { $cache->gcVcsCache($config->get('cache-ttl')); } } else { $io->writeError("Clearing cache ({$key}): {$cachePath}"); $cache->clear(); } } if ($input->getOption('gc')) { $io->writeError('All caches garbage-collected.'); } else { $io->writeError('All caches cleared.'); } return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Advisory\Auditor; use Composer\Composer; use Composer\Factory; use Composer\Config; use Composer\Downloader\TransportException; use Composer\IO\BufferIO; use Composer\Json\JsonFile; use Composer\Json\JsonValidationException; use Composer\Package\Locker; use Composer\Package\RootPackage; use Composer\Package\Version\VersionParser; use Composer\Pcre\Preg; use Composer\Repository\ComposerRepository; use Composer\Repository\FilesystemRepository; use Composer\Repository\PlatformRepository; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\RepositorySet; use Composer\Repository\RootPackageRepository; use Composer\Util\ConfigValidator; use Composer\Util\Git; use Composer\Util\IniHelper; use Composer\Util\ProcessExecutor; use Composer\Util\HttpDownloader; use Composer\Util\StreamContextFactory; use Composer\Util\Platform; use Composer\SelfUpdate\Keys; use Composer\SelfUpdate\Versions; use Composer\IO\NullIO; use Composer\Package\CompletePackageInterface; use Composer\XdebugHandler\XdebugHandler; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Symfony\Component\Process\ExecutableFinder; use Composer\Util\Http\ProxyManager; use Composer\Util\Http\RequestProxy; /** * @author Jordi Boggiano */ class DiagnoseCommand extends \Composer\Command\BaseCommand { /** @var HttpDownloader */ protected $httpDownloader; /** @var ProcessExecutor */ protected $process; /** @var int */ protected $exitCode = 0; protected function configure() : void { $this->setName('diagnose')->setDescription('Diagnoses the system to identify common errors')->setHelp(<<diagnose command checks common errors to help debugging problems. The process exit code will be 1 in case of warnings and 2 for errors. Read more at https://getcomposer.org/doc/03-cli.md#diagnose EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->tryComposer(); $io = $this->getIO(); if ($composer) { $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'diagnose', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $io->write('Checking composer.json: ', \false); $this->outputResult($this->checkComposerSchema()); if ($composer->getLocker()->isLocked()) { $io->write('Checking composer.lock: ', \false); $this->outputResult($this->checkComposerLockSchema($composer->getLocker())); } $this->process = $composer->getLoop()->getProcessExecutor() ?? new ProcessExecutor($io); } else { $this->process = new ProcessExecutor($io); } if ($composer) { $config = $composer->getConfig(); } else { $config = Factory::createConfig(); } $config->merge(['config' => ['secure-http' => \false]], Config::SOURCE_COMMAND); $config->prohibitUrlByConfig('http://repo.packagist.org', new NullIO()); $this->httpDownloader = Factory::createHttpDownloader($io, $config); $io->write('Checking platform settings: ', \false); $this->outputResult($this->checkPlatform()); $io->write('Checking git settings: ', \false); $this->outputResult($this->checkGit()); $io->write('Checking http connectivity to packagist: ', \false); $this->outputResult($this->checkHttp('http', $config)); $io->write('Checking https connectivity to packagist: ', \false); $this->outputResult($this->checkHttp('https', $config)); foreach ($config->getRepositories() as $repo) { if (($repo['type'] ?? null) === 'composer' && isset($repo['url'])) { $composerRepo = new ComposerRepository($repo, $this->getIO(), $config, $this->httpDownloader); $reflMethod = new \ReflectionMethod($composerRepo, 'getPackagesJsonUrl'); if (\PHP_VERSION_ID < 80100) { $reflMethod->setAccessible(\true); } $url = $reflMethod->invoke($composerRepo); if (!\str_starts_with($url, 'http')) { continue; } if (\str_starts_with($url, 'https://repo.packagist.org')) { continue; } $io->write('Checking connectivity to ' . $repo['url'] . ': ', \false); $this->outputResult($this->checkComposerRepo($url, $config)); } } $proxyManager = ProxyManager::getInstance(); $protos = $config->get('disable-tls') === \true ? ['http'] : ['http', 'https']; try { foreach ($protos as $proto) { $proxy = $proxyManager->getProxyForRequest($proto . '://repo.packagist.org'); if ($proxy->getStatus() !== '') { $type = $proxy->isSecure() ? 'HTTPS' : 'HTTP'; $io->write('Checking ' . $type . ' proxy with ' . $proto . ': ', \false); $this->outputResult($this->checkHttpProxy($proxy, $proto)); } } } catch (TransportException $e) { $io->write('Checking HTTP proxy: ', \false); $status = $this->checkConnectivityAndComposerNetworkHttpEnablement(); $this->outputResult(\is_string($status) ? $status : $e); } if (\count($oauth = $config->get('github-oauth')) > 0) { foreach ($oauth as $domain => $token) { $io->write('Checking ' . $domain . ' oauth access: ', \false); $this->outputResult($this->checkGithubOauth($domain, $token)); } } else { $io->write('Checking github.com rate limit: ', \false); try { $rate = $this->getGithubRateLimit('github.com'); if (!\is_array($rate)) { $this->outputResult($rate); } elseif (10 > $rate['remaining']) { $io->write('WARNING'); $io->write(\sprintf('GitHub has a rate limit on their API. ' . 'You currently have %u ' . 'out of %u requests left.' . \PHP_EOL . 'See https://developer.github.com/v3/#rate-limiting and also' . \PHP_EOL . ' https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens', $rate['remaining'], $rate['limit'])); } else { $this->outputResult(\true); } } catch (\Exception $e) { if ($e instanceof TransportException && $e->getCode() === 401) { $this->outputResult('The oauth token for github.com seems invalid, run "composer config --global --unset github-oauth.github.com" to remove it'); } else { $this->outputResult($e); } } } $io->write('Checking disk free space: ', \false); $this->outputResult($this->checkDiskSpace($config)); if (\strpos(__FILE__, 'phar:') === 0) { $io->write('Checking pubkeys: ', \false); $this->outputResult($this->checkPubKeys($config)); $io->write('Checking Composer version: ', \false); $this->outputResult($this->checkVersion($config)); } $io->write('Checking Composer and its dependencies for vulnerabilities: ', \false); $this->outputResult($this->checkComposerAudit($config)); $io->write(\sprintf('Composer version: %s', Composer::getVersion())); $platformOverrides = $config->get('platform') ?: []; $platformRepo = new PlatformRepository([], $platformOverrides); $phpPkg = $platformRepo->findPackage('php', '*'); $phpVersion = $phpPkg->getPrettyVersion(); if ($phpPkg instanceof CompletePackageInterface && \str_contains((string) $phpPkg->getDescription(), 'overridden')) { $phpVersion .= ' - ' . $phpPkg->getDescription(); } $io->write(\sprintf('PHP version: %s', $phpVersion)); if (\defined('PHP_BINARY')) { $io->write(\sprintf('PHP binary path: %s', \PHP_BINARY)); } $io->write('OpenSSL version: ' . (\defined('OPENSSL_VERSION_TEXT') ? '' . \OPENSSL_VERSION_TEXT . '' : 'missing')); $io->write('curl version: ' . $this->getCurlVersion()); $finder = new ExecutableFinder(); $hasSystemUnzip = (bool) $finder->find('unzip'); $bin7zip = ''; if ($hasSystem7zip = (bool) $finder->find('7z', null, ['C:\\Program Files\\7-Zip'])) { $bin7zip = '7z'; } if (!Platform::isWindows() && !$hasSystem7zip && ($hasSystem7zip = (bool) $finder->find('7zz'))) { $bin7zip = '7zz'; } $io->write('zip: ' . (\extension_loaded('zip') ? 'extension present' : 'extension not loaded') . ', ' . ($hasSystemUnzip ? 'unzip present' : 'unzip not available') . ', ' . ($hasSystem7zip ? '7-Zip present (' . $bin7zip . ')' : '7-Zip not available') . (($hasSystem7zip || $hasSystemUnzip) && !\function_exists('proc_open') ? ', proc_open is disabled or not present, unzip/7-z will not be usable' : '')); return $this->exitCode; } /** * @return string|true */ private function checkComposerSchema() { $validator = new ConfigValidator($this->getIO()); [$errors, , $warnings] = $validator->validate(Factory::getComposerFile()); if ($errors || $warnings) { $messages = ['error' => $errors, 'warning' => $warnings]; $output = ''; foreach ($messages as $style => $msgs) { foreach ($msgs as $msg) { $output .= '<' . $style . '>' . $msg . '' . \PHP_EOL; } } return \rtrim($output); } return \true; } /** * @return string|true */ private function checkComposerLockSchema(Locker $locker) { $json = $locker->getJsonFile(); try { $json->validateSchema(JsonFile::LOCK_SCHEMA); } catch (JsonValidationException $e) { $output = ''; foreach ($e->getErrors() as $error) { $output .= '' . $error . '' . \PHP_EOL; } return \trim($output); } return \true; } private function checkGit() : string { if (!\function_exists('proc_open')) { return 'proc_open is not available, git cannot be used'; } $this->process->execute(['git', 'config', 'color.ui'], $output); if (\strtolower(\trim($output)) === 'always') { return 'Your git color.ui setting is set to always, this is known to create issues. Use "git config --global color.ui true" to set it correctly.'; } $gitVersion = Git::getVersion($this->process); if (null === $gitVersion) { return 'No git process found'; } if (\version_compare('2.24.0', $gitVersion, '>')) { return 'Your git version (' . $gitVersion . ') is too old and possibly will cause issues. Please upgrade to git 2.24 or above'; } return 'OK git version ' . $gitVersion . ''; } /** * @return string|string[]|true */ private function checkHttp(string $proto, Config $config) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } $result = []; if ($proto === 'https' && $config->get('disable-tls') === \true) { $tlsWarning = 'Composer is configured to disable SSL/TLS protection. This will leave remote HTTPS requests vulnerable to Man-In-The-Middle attacks.'; } try { $this->httpDownloader->get($proto . '://repo.packagist.org/packages.json'); } catch (TransportException $e) { $hints = HttpDownloader::getExceptionHints($e); if (null !== $hints && \count($hints) > 0) { foreach ($hints as $hint) { $result[] = $hint; } } $result[] = '[' . \get_class($e) . '] ' . $e->getMessage() . ''; } if (isset($tlsWarning)) { $result[] = $tlsWarning; } if (\count($result) > 0) { return $result; } return \true; } /** * @return string|string[]|true */ private function checkComposerRepo(string $url, Config $config) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } $result = []; if (\str_starts_with($url, 'https://') && $config->get('disable-tls') === \true) { $tlsWarning = 'Composer is configured to disable SSL/TLS protection. This will leave remote HTTPS requests vulnerable to Man-In-The-Middle attacks.'; } try { $this->httpDownloader->get($url); } catch (TransportException $e) { $hints = HttpDownloader::getExceptionHints($e); if (null !== $hints && \count($hints) > 0) { foreach ($hints as $hint) { $result[] = $hint; } } $result[] = '[' . \get_class($e) . '] ' . $e->getMessage() . ''; } if (isset($tlsWarning)) { $result[] = $tlsWarning; } if (\count($result) > 0) { return $result; } return \true; } /** * @return string|\Exception */ private function checkHttpProxy(RequestProxy $proxy, string $protocol) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } try { $proxyStatus = $proxy->getStatus(); if ($proxy->isExcludedByNoProxy()) { return 'SKIP Because repo.packagist.org is ' . $proxyStatus . ''; } $json = $this->httpDownloader->get($protocol . '://repo.packagist.org/packages.json')->decodeJson(); if (isset($json['provider-includes'])) { $hash = \reset($json['provider-includes']); $hash = $hash['sha256']; $path = \str_replace('%hash%', $hash, \key($json['provider-includes'])); $provider = $this->httpDownloader->get($protocol . '://repo.packagist.org/' . $path)->getBody(); if (\hash('sha256', $provider) !== $hash) { return 'It seems that your proxy (' . $proxyStatus . ') is modifying ' . $protocol . ' traffic on the fly'; } } return 'OK ' . $proxyStatus . ''; } catch (\Exception $e) { return $e; } } /** * @return string|\Exception */ private function checkGithubOauth(string $domain, string $token) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } $this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic'); try { $url = $domain === 'github.com' ? 'https://api.' . $domain . '/' : 'https://' . $domain . '/api/v3/'; $response = $this->httpDownloader->get($url, ['retry-auth-failure' => \false]); $expiration = $response->getHeader('github-authentication-token-expiration'); if ($expiration === null) { return 'OK does not expire'; } return 'OK expires on ' . $expiration . ''; } catch (\Exception $e) { if ($e instanceof TransportException && $e->getCode() === 401) { return 'The oauth token for ' . $domain . ' seems invalid, run "composer config --global --unset github-oauth.' . $domain . '" to remove it'; } return $e; } } /** * @param string $token * @throws TransportException * @return mixed|string */ private function getGithubRateLimit(string $domain, ?string $token = null) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } if ($token) { $this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic'); } $url = $domain === 'github.com' ? 'https://api.' . $domain . '/rate_limit' : 'https://' . $domain . '/api/rate_limit'; $data = $this->httpDownloader->get($url, ['retry-auth-failure' => \false])->decodeJson(); return $data['resources']['core']; } /** * @return string|true */ private function checkDiskSpace(Config $config) { if (!\function_exists('disk_free_space')) { return \true; } $minSpaceFree = 1024 * 1024; if (($df = @\disk_free_space($dir = $config->get('home'))) !== \false && $df < $minSpaceFree || ($df = @\disk_free_space($dir = $config->get('vendor-dir'))) !== \false && $df < $minSpaceFree) { return 'The disk hosting ' . $dir . ' is full'; } return \true; } /** * @return string[]|true */ private function checkPubKeys(Config $config) { $home = $config->get('home'); $errors = []; $io = $this->getIO(); if (\file_exists($home . '/keys.tags.pub') && \file_exists($home . '/keys.dev.pub')) { $io->write(''); } if (\file_exists($home . '/keys.tags.pub')) { $io->write('Tags Public Key Fingerprint: ' . Keys::fingerprint($home . '/keys.tags.pub')); } else { $errors[] = 'Missing pubkey for tags verification'; } if (\file_exists($home . '/keys.dev.pub')) { $io->write('Dev Public Key Fingerprint: ' . Keys::fingerprint($home . '/keys.dev.pub')); } else { $errors[] = 'Missing pubkey for dev verification'; } if ($errors) { $errors[] = 'Run composer self-update --update-keys to set them up'; } return $errors ?: \true; } /** * @return string|\Exception|true */ private function checkVersion(Config $config) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } $versionsUtil = new Versions($config, $this->httpDownloader); try { $latest = $versionsUtil->getLatest(); } catch (\Exception $e) { return $e; } if (Composer::VERSION !== $latest['version'] && Composer::VERSION !== '@package_version@') { return 'You are not running the latest ' . $versionsUtil->getChannel() . ' version, run `composer self-update` to update (' . Composer::VERSION . ' => ' . $latest['version'] . ')'; } return \true; } /** * @return string|true */ private function checkComposerAudit(Config $config) { $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } $auditor = new Auditor(); $repoSet = new RepositorySet(); $installedJson = new JsonFile(__DIR__ . '/../../../vendor/composer/installed.json'); if (!$installedJson->exists()) { return 'Could not find Composer\'s installed.json, this must be a non-standard Composer installation.'; } $localRepo = new FilesystemRepository($installedJson); $version = Composer::getVersion(); $packages = $localRepo->getCanonicalPackages(); if ($version !== '@package_version@') { $versionParser = new VersionParser(); $normalizedVersion = $versionParser->normalize($version); $rootPkg = new RootPackage('composer/composer', $normalizedVersion, $version); $packages[] = $rootPkg; } $repoSet->addRepository(new ComposerRepository(['type' => 'composer', 'url' => 'https://packagist.org'], new NullIO(), $config, $this->httpDownloader)); try { $io = new BufferIO(); $result = $auditor->audit($io, $repoSet, $packages, Auditor::FORMAT_TABLE, \true, [], Auditor::ABANDONED_IGNORE); } catch (\Throwable $e) { return 'Failed performing audit: ' . $e->getMessage() . ''; } if ($result > 0) { return 'Audit found some issues:' . \PHP_EOL . $io->getOutput(); } return \true; } private function getCurlVersion() : string { if (\extension_loaded('curl')) { if (!HttpDownloader::isCurlEnabled()) { return 'disabled via disable_functions, using php streams fallback, which reduces performance'; } $version = \curl_version(); return '' . $version['version'] . ' ' . 'libz ' . (!empty($version['libz_version']) ? $version['libz_version'] : 'missing') . ' ' . 'ssl ' . ($version['ssl_version'] ?? 'missing') . ''; } return 'missing, using php streams fallback, which reduces performance'; } /** * @param bool|string|string[]|\Exception $result */ private function outputResult($result) : void { $io = $this->getIO(); if (\true === $result) { $io->write('OK'); return; } $hadError = \false; $hadWarning = \false; if ($result instanceof \Exception) { $result = '[' . \get_class($result) . '] ' . $result->getMessage() . ''; } if (!$result) { // falsey results should be considered as an error, even if there is nothing to output $hadError = \true; } else { if (!\is_array($result)) { $result = [$result]; } foreach ($result as $message) { if (\false !== \strpos($message, '')) { $hadError = \true; } elseif (\false !== \strpos($message, '')) { $hadWarning = \true; } } } if ($hadError) { $io->write('FAIL'); $this->exitCode = \max($this->exitCode, 2); } elseif ($hadWarning) { $io->write('WARNING'); $this->exitCode = \max($this->exitCode, 1); } if ($result) { foreach ($result as $message) { $io->write(\trim($message)); } } } /** * @return string|true */ private function checkPlatform() { $output = ''; $out = static function ($msg, $style) use(&$output) : void { $output .= '<' . $style . '>' . $msg . '' . \PHP_EOL; }; // code below taken from getcomposer.org/installer, any changes should be made there and replicated here $errors = []; $warnings = []; $displayIniMessage = \false; $iniMessage = \PHP_EOL . \PHP_EOL . IniHelper::getMessage(); $iniMessage .= \PHP_EOL . 'If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.'; if (!\function_exists('json_decode')) { $errors['json'] = \true; } if (!\extension_loaded('Phar')) { $errors['phar'] = \true; } if (!\extension_loaded('filter')) { $errors['filter'] = \true; } if (!\extension_loaded('hash')) { $errors['hash'] = \true; } if (!\extension_loaded('iconv') && !\extension_loaded('mbstring')) { $errors['iconv_mbstring'] = \true; } if (!\filter_var(\ini_get('allow_url_fopen'), \FILTER_VALIDATE_BOOLEAN)) { $errors['allow_url_fopen'] = \true; } if (\extension_loaded('ionCube Loader') && ioncube_loader_iversion() < 40009) { $errors['ioncube'] = ioncube_loader_version(); } if (\PHP_VERSION_ID < 70205) { $errors['php'] = \PHP_VERSION; } if (!\extension_loaded('openssl')) { $errors['openssl'] = \true; } if (\extension_loaded('openssl') && \OPENSSL_VERSION_NUMBER < 0x1000100f) { $warnings['openssl_version'] = \true; } if (!\defined('_ContaoManager\\HHVM_VERSION') && !\extension_loaded('apcu') && \filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { $warnings['apc_cli'] = \true; } if (!\extension_loaded('zlib')) { $warnings['zlib'] = \true; } \ob_start(); \phpinfo(\INFO_GENERAL); $phpinfo = \ob_get_clean(); if (\is_string($phpinfo) && Preg::isMatchStrictGroups('{Configure Command(?: *| *=> *)(.*?)(?:|$)}m', $phpinfo, $match)) { $configure = $match[1]; if (\str_contains($configure, '--enable-sigchild')) { $warnings['sigchild'] = \true; } if (\str_contains($configure, '--with-curlwrappers')) { $warnings['curlwrappers'] = \true; } } if (\filter_var(\ini_get('xdebug.profiler_enabled'), \FILTER_VALIDATE_BOOLEAN)) { $warnings['xdebug_profile'] = \true; } elseif (XdebugHandler::isXdebugActive()) { $warnings['xdebug_loaded'] = \true; } if (\defined('PHP_WINDOWS_VERSION_BUILD') && (\version_compare(\PHP_VERSION, '7.2.23', '<') || \version_compare(\PHP_VERSION, '7.3.0', '>=') && \version_compare(\PHP_VERSION, '7.3.10', '<'))) { $warnings['onedrive'] = \PHP_VERSION; } if (\extension_loaded('uopz') && !(\filter_var(\ini_get('uopz.disable'), \FILTER_VALIDATE_BOOLEAN) || \filter_var(\ini_get('uopz.exit'), \FILTER_VALIDATE_BOOLEAN))) { $warnings['uopz'] = \true; } if (!empty($errors)) { foreach ($errors as $error => $current) { switch ($error) { case 'json': $text = \PHP_EOL . "The json extension is missing." . \PHP_EOL; $text .= "Install it or recompile php without --disable-json"; break; case 'phar': $text = \PHP_EOL . "The phar extension is missing." . \PHP_EOL; $text .= "Install it or recompile php without --disable-phar"; break; case 'filter': $text = \PHP_EOL . "The filter extension is missing." . \PHP_EOL; $text .= "Install it or recompile php without --disable-filter"; break; case 'hash': $text = \PHP_EOL . "The hash extension is missing." . \PHP_EOL; $text .= "Install it or recompile php without --disable-hash"; break; case 'iconv_mbstring': $text = \PHP_EOL . "The iconv OR mbstring extension is required and both are missing." . \PHP_EOL; $text .= "Install either of them or recompile php without --disable-iconv"; break; case 'php': $text = \PHP_EOL . "Your PHP ({$current}) is too old, you must upgrade to PHP 7.2.5 or higher."; break; case 'allow_url_fopen': $text = \PHP_EOL . "The allow_url_fopen setting is incorrect." . \PHP_EOL; $text .= "Add the following to the end of your `php.ini`:" . \PHP_EOL; $text .= " allow_url_fopen = On"; $displayIniMessage = \true; break; case 'ioncube': $text = \PHP_EOL . "Your ionCube Loader extension ({$current}) is incompatible with Phar files." . \PHP_EOL; $text .= "Upgrade to ionCube 4.0.9 or higher or remove this line (path may be different) from your `php.ini` to disable it:" . \PHP_EOL; $text .= " zend_extension = /usr/lib/php5/20090626+lfs/ioncube_loader_lin_5.3.so"; $displayIniMessage = \true; break; case 'openssl': $text = \PHP_EOL . "The openssl extension is missing, which means that secure HTTPS transfers are impossible." . \PHP_EOL; $text .= "If possible you should enable it or recompile php with --with-openssl"; break; default: throw new \InvalidArgumentException(\sprintf("DiagnoseCommand: Unknown error type \"%s\". Please report at https://github.com/composer/composer/issues/new.", $error)); } $out($text, 'error'); } $output .= \PHP_EOL; } if (!empty($warnings)) { foreach ($warnings as $warning => $current) { switch ($warning) { case 'apc_cli': $text = "The apc.enable_cli setting is incorrect." . \PHP_EOL; $text .= "Add the following to the end of your `php.ini`:" . \PHP_EOL; $text .= " apc.enable_cli = Off"; $displayIniMessage = \true; break; case 'zlib': $text = 'The zlib extension is not loaded, this can slow down Composer a lot.' . \PHP_EOL; $text .= 'If possible, enable it or recompile php with --with-zlib' . \PHP_EOL; $displayIniMessage = \true; break; case 'sigchild': $text = "PHP was compiled with --enable-sigchild which can cause issues on some platforms." . \PHP_EOL; $text .= "Recompile it without this flag if possible, see also:" . \PHP_EOL; $text .= " https://bugs.php.net/bug.php?id=22999"; break; case 'curlwrappers': $text = "PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub." . \PHP_EOL; $text .= " Recompile it without this flag if possible"; break; case 'openssl_version': // Attempt to parse version number out, fallback to whole string value. $opensslVersion = \strstr(\trim(\strstr(\OPENSSL_VERSION_TEXT, ' ')), ' ', \true); $opensslVersion = $opensslVersion ?: \OPENSSL_VERSION_TEXT; $text = "The OpenSSL library ({$opensslVersion}) used by PHP does not support TLSv1.2 or TLSv1.1." . \PHP_EOL; $text .= "If possible you should upgrade OpenSSL to version 1.0.1 or above."; break; case 'xdebug_loaded': $text = "The xdebug extension is loaded, this can slow down Composer a little." . \PHP_EOL; $text .= " Disabling it when using Composer is recommended."; break; case 'xdebug_profile': $text = "The xdebug.profiler_enabled setting is enabled, this can slow down Composer a lot." . \PHP_EOL; $text .= "Add the following to the end of your `php.ini` to disable it:" . \PHP_EOL; $text .= " xdebug.profiler_enabled = 0"; $displayIniMessage = \true; break; case 'onedrive': $text = "The Windows OneDrive folder is not supported on PHP versions below 7.2.23 and 7.3.10." . \PHP_EOL; $text .= "Upgrade your PHP ({$current}) to use this location with Composer." . \PHP_EOL; break; case 'uopz': $text = "The uopz extension ignores exit calls and may not work with all Composer commands." . \PHP_EOL; $text .= "Disabling it when using Composer is recommended."; break; default: throw new \InvalidArgumentException(\sprintf("DiagnoseCommand: Unknown warning type \"%s\". Please report at https://github.com/composer/composer/issues/new.", $warning)); } $out($text, 'comment'); } } if ($displayIniMessage) { $out($iniMessage, 'comment'); } if (\in_array(Platform::getEnv('COMPOSER_IPRESOLVE'), ['4', '6'], \true)) { $warnings['ipresolve'] = \true; $out('The COMPOSER_IPRESOLVE env var is set to ' . Platform::getEnv('COMPOSER_IPRESOLVE') . ' which may result in network failures below.', 'comment'); } return \count($warnings) === 0 && \count($errors) === 0 ? \true : $output; } /** * Check if allow_url_fopen is ON * * @return string|true */ private function checkConnectivity() { if (!\ini_get('allow_url_fopen')) { return 'SKIP Because allow_url_fopen is missing.'; } return \true; } /** * @return string|true */ private function checkConnectivityAndComposerNetworkHttpEnablement() { $result = $this->checkConnectivity(); if ($result !== \true) { return $result; } $result = $this->checkComposerNetworkHttpEnablement(); if ($result !== \true) { return $result; } return \true; } /** * Check if Composer network is enabled for HTTP/S * * @return string|true */ private function checkComposerNetworkHttpEnablement() { if ((bool) Platform::getEnv('COMPOSER_DISABLE_NETWORK')) { return 'SKIP Network is disabled by COMPOSER_DISABLE_NETWORK.'; } return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; use _ContaoManager\Symfony\Component\Console\Command\Command; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; use _ContaoManager\Symfony\Component\Console\Completion\CompletionSuggestions; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use _ContaoManager\Symfony\Component\Console\Input\StringInput; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class GlobalCommand extends \Composer\Command\BaseCommand { public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { $application = $this->getApplication(); if ($input->mustSuggestArgumentValuesFor('command-name')) { $suggestions->suggestValues(\array_values(\array_filter(\array_map(static function (Command $command) { return $command->isHidden() ? null : $command->getName(); }, $application->all()), function (?string $cmd) { return $cmd !== null; }))); return; } if ($application->has($commandName = $input->getArgument('command-name'))) { $input = $this->prepareSubcommandInput($input, \true); $input = CompletionInput::fromString($input->__toString(), 2); $command = $application->find($commandName); $command->mergeApplicationDefinition(); $input->bind($command->getDefinition()); $command->complete($input, $suggestions); } } protected function configure() : void { $this->setName('global')->setDescription('Allows running commands in the global composer dir ($COMPOSER_HOME)')->setDefinition([new InputArgument('command-name', InputArgument::REQUIRED, ''), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, '')])->setHelp(<<\\AppData\\Roaming\\Composer on Windows and /home//.composer on unix systems. If your system uses freedesktop.org standards, then it will first check XDG_CONFIG_HOME or default to /home//.config/composer Note: This path may vary depending on customizations to bin-dir in composer.json or the environmental variable COMPOSER_BIN_DIR. Read more at https://getcomposer.org/doc/03-cli.md#global EOT ); } /** * @throws \Symfony\Component\Console\Exception\ExceptionInterface */ public function run(InputInterface $input, OutputInterface $output) : int { // TODO remove for Symfony 6+ as it is then in the interface if (!\method_exists($input, '__toString')) { // @phpstan-ignore-line throw new \LogicException('Expected an Input instance that is stringable, got ' . \get_class($input)); } // extract real command name $tokens = Preg::split('{\\s+}', $input->__toString()); $args = []; foreach ($tokens as $token) { if ($token && $token[0] !== '-') { $args[] = $token; if (\count($args) >= 2) { break; } } } // show help for this command if no command was found if (\count($args) < 2) { return parent::run($input, $output); } $input = $this->prepareSubcommandInput($input); return $this->getApplication()->run($input, $output); } private function prepareSubcommandInput(InputInterface $input, bool $quiet = \false) : StringInput { // TODO remove for Symfony 6+ as it is then in the interface if (!\method_exists($input, '__toString')) { // @phpstan-ignore-line throw new \LogicException('Expected an Input instance that is stringable, got ' . \get_class($input)); } // The COMPOSER env var should not apply to the global execution scope if (Platform::getEnv('COMPOSER')) { Platform::clearEnv('COMPOSER'); } // change to global dir $config = Factory::createConfig(); $home = $config->get('home'); if (!\is_dir($home)) { $fs = new Filesystem(); $fs->ensureDirectoryExists($home); if (!\is_dir($home)) { throw new \RuntimeException('Could not create home directory'); } } try { \chdir($home); } catch (\Exception $e) { throw new \RuntimeException('Could not switch to home directory "' . $home . '"', 0, $e); } if (!$quiet) { $this->getIO()->writeError('Changed current directory to ' . $home . ''); } // create new input without "global" command prefix $input = new StringInput(Preg::replace('{\\bg(?:l(?:o(?:b(?:a(?:l)?)?)?)?)?\\b}', '', $input->__toString(), 1)); $this->getApplication()->resetComposer(); return $input; } /** * @inheritDoc */ public function isProxyCommand() : bool { return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano */ class AboutCommand extends \Composer\Command\BaseCommand { protected function configure() : void { $this->setName('about')->setDescription('Shows a short information about Composer')->setHelp(<<php composer.phar about EOT ); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composerVersion = Composer::getVersion(); $this->getIO()->write(<<Composer - Dependency Manager for PHP - version {$composerVersion} Composer is a dependency manager tracking local dependencies of your projects and libraries. See https://getcomposer.org/ for more information. EOT ); return 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use Composer\Console\Input\InputArgument; /** * @author Davey Shafik */ class ExecCommand extends \Composer\Command\BaseCommand { /** * @return void */ protected function configure() { $this->setName('exec')->setDescription('Executes a vendored binary/script')->setDefinition([new InputOption('list', 'l', InputOption::VALUE_NONE), new InputArgument('binary', InputArgument::OPTIONAL, 'The binary to run, e.g. phpunit', null, function () { return $this->getBinaries(\false); }), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Arguments to pass to the binary. Use -- to separate from composer arguments')])->setHelp(<<getBinaries(\false); if (\count($binaries) === 0) { return; } if ($input->getArgument('binary') !== null || $input->getOption('list')) { return; } $io = $this->getIO(); /** @var int $binary */ $binary = $io->select('Binary to run: ', $binaries, '', 1, 'Invalid binary name "%s"'); $input->setArgument('binary', $binaries[$binary]); } protected function execute(InputInterface $input, OutputInterface $output) : int { $composer = $this->requireComposer(); if ($input->getOption('list') || null === $input->getArgument('binary')) { $bins = $this->getBinaries(\true); if ([] === $bins) { $binDir = $composer->getConfig()->get('bin-dir'); throw new \RuntimeException("No binaries found in composer.json or in bin-dir ({$binDir})"); } $this->getIO()->write(<<Available binaries: EOT ); foreach ($bins as $bin) { $this->getIO()->write(<<- {$bin} EOT ); } return 0; } $binary = $input->getArgument('binary'); $dispatcher = $composer->getEventDispatcher(); $dispatcher->addListener('__exec_command', $binary); // If the CWD was modified, we restore it to what it was initially, as it was // most likely modified by the global command, and we want exec to run in the local working directory // not the global one if (\getcwd() !== $this->getApplication()->getInitialWorkingDirectory() && $this->getApplication()->getInitialWorkingDirectory() !== \false) { try { \chdir($this->getApplication()->getInitialWorkingDirectory()); } catch (\Exception $e) { throw new \RuntimeException('Could not switch back to working directory "' . $this->getApplication()->getInitialWorkingDirectory() . '"', 0, $e); } } return $dispatcher->dispatchScript('__exec_command', \true, $input->getArgument('args')); } /** * @return list */ private function getBinaries(bool $forDisplay) : array { $composer = $this->requireComposer(); $binDir = $composer->getConfig()->get('bin-dir'); $bins = \glob($binDir . '/*'); $localBins = $composer->getPackage()->getBinaries(); if ($forDisplay) { $localBins = \array_map(static function ($e) { return "{$e} (local)"; }, $localBins); } $binaries = []; foreach (\array_merge($bins, $localBins) as $bin) { // skip .bat copies if (isset($previousBin) && $bin === $previousBin . '.bat') { continue; } $previousBin = $bin; $binaries[] = \basename($bin); } return $binaries; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\AutoloadGenerator; use Composer\Console\GithubActionError; use Composer\DependencyResolver\DefaultPolicy; use Composer\DependencyResolver\LocalRepoTransaction; use Composer\DependencyResolver\LockTransaction; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; use Composer\DependencyResolver\PoolOptimizer; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Request; use Composer\DependencyResolver\Solver; use Composer\DependencyResolver\SolverProblemsException; use Composer\DependencyResolver\PolicyInterface; use Composer\Downloader\DownloadManager; use Composer\Downloader\TransportException; use Composer\EventDispatcher\EventDispatcher; use Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\Installer\InstallationManager; use Composer\Installer\InstallerEvents; use Composer\Installer\SuggestedPackagesReporter; use Composer\IO\IOInterface; use Composer\Package\AliasPackage; use Composer\Package\RootAliasPackage; use Composer\Package\BasePackage; use Composer\Package\CompletePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\Link; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Version\VersionParser; use Composer\Package\Package; use Composer\Repository\ArrayRepository; use Composer\Repository\RepositorySet; use Composer\Repository\CompositeRepository; use Composer\Semver\Constraint\Constraint; use Composer\Package\Locker; use Composer\Package\RootPackageInterface; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\InstalledRepositoryInterface; use Composer\Repository\InstalledRepository; use Composer\Repository\RootPackageRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositoryManager; use Composer\Repository\LockArrayRepository; use Composer\Script\ScriptEvents; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Advisory\Auditor; use Composer\Util\Platform; /** * @author Jordi Boggiano * @author Beau Simensen * @author Konstantin Kudryashov * @author Nils Adermann */ class Installer { public const ERROR_NONE = 0; // no error/success state public const ERROR_GENERIC_FAILURE = 1; public const ERROR_NO_LOCK_FILE_FOR_PARTIAL_UPDATE = 3; public const ERROR_LOCK_FILE_INVALID = 4; // used/declared in SolverProblemsException, carried over here for completeness public const ERROR_DEPENDENCY_RESOLUTION_FAILED = 2; public const ERROR_AUDIT_FAILED = 5; // technically exceptions are thrown with various status codes >400, but the process exit code is normalized to 100 public const ERROR_TRANSPORT_EXCEPTION = 100; /** * @var IOInterface */ protected $io; /** * @var Config */ protected $config; /** * @var RootPackageInterface&BasePackage */ protected $package; // TODO can we get rid of the below and just use the package itself? /** * @var RootPackageInterface&BasePackage */ protected $fixedRootPackage; /** * @var DownloadManager */ protected $downloadManager; /** * @var RepositoryManager */ protected $repositoryManager; /** * @var Locker */ protected $locker; /** * @var InstallationManager */ protected $installationManager; /** * @var EventDispatcher */ protected $eventDispatcher; /** * @var AutoloadGenerator */ protected $autoloadGenerator; /** @var bool */ protected $preferSource = \false; /** @var bool */ protected $preferDist = \false; /** @var bool */ protected $optimizeAutoloader = \false; /** @var bool */ protected $classMapAuthoritative = \false; /** @var bool */ protected $apcuAutoloader = \false; /** @var string|null */ protected $apcuAutoloaderPrefix = null; /** @var bool */ protected $devMode = \false; /** @var bool */ protected $dryRun = \false; /** @var bool */ protected $downloadOnly = \false; /** @var bool */ protected $verbose = \false; /** @var bool */ protected $update = \false; /** @var bool */ protected $install = \true; /** @var bool */ protected $dumpAutoloader = \true; /** @var bool */ protected $runScripts = \true; /** @var bool */ protected $preferStable = \false; /** @var bool */ protected $preferLowest = \false; /** @var bool */ protected $minimalUpdate = \false; /** @var bool */ protected $writeLock; /** @var bool */ protected $executeOperations = \true; /** @var bool */ protected $audit = \true; /** @var bool */ protected $errorOnAudit = \false; /** @var Auditor::FORMAT_* */ protected $auditFormat = Auditor::FORMAT_SUMMARY; /** @var list */ private $ignoredTypes = ['php-ext', 'php-ext-zend']; /** @var list|null */ private $allowedTypes = null; /** @var bool */ protected $updateMirrors = \false; /** * Array of package names/globs flagged for update * * @var non-empty-list|null */ protected $updateAllowList = null; /** @var Request::UPDATE_* */ protected $updateAllowTransitiveDependencies = Request::UPDATE_ONLY_LISTED; /** * @var SuggestedPackagesReporter */ protected $suggestedPackagesReporter; /** * @var PlatformRequirementFilterInterface */ protected $platformRequirementFilter; /** * @var ?RepositoryInterface */ protected $additionalFixedRepository; /** @var array */ protected $temporaryConstraints = []; /** * Constructor * * @param RootPackageInterface&BasePackage $package */ public function __construct(IOInterface $io, \Composer\Config $config, RootPackageInterface $package, DownloadManager $downloadManager, RepositoryManager $repositoryManager, Locker $locker, InstallationManager $installationManager, EventDispatcher $eventDispatcher, AutoloadGenerator $autoloadGenerator) { $this->io = $io; $this->config = $config; $this->package = $package; $this->downloadManager = $downloadManager; $this->repositoryManager = $repositoryManager; $this->locker = $locker; $this->installationManager = $installationManager; $this->eventDispatcher = $eventDispatcher; $this->autoloadGenerator = $autoloadGenerator; $this->suggestedPackagesReporter = new SuggestedPackagesReporter($this->io); $this->platformRequirementFilter = PlatformRequirementFilterFactory::ignoreNothing(); $this->writeLock = $config->get('lock'); } /** * Run installation (or update) * * @throws \Exception * @return int 0 on success or a positive error code on failure * @phpstan-return self::ERROR_* */ public function run() : int { // Disable GC to save CPU cycles, as the dependency solver can create hundreds of thousands // of PHP objects, the GC can spend quite some time walking the tree of references looking // for stuff to collect while there is nothing to collect. This slows things down dramatically // and turning it off results in much better performance. Do not try this at home however. \gc_collect_cycles(); \gc_disable(); if ($this->updateAllowList !== null && $this->updateMirrors) { throw new \RuntimeException("The installer options updateMirrors and updateAllowList are mutually exclusive."); } $isFreshInstall = $this->repositoryManager->getLocalRepository()->isFresh(); // Force update if there is no lock file present if (!$this->update && !$this->locker->isLocked()) { $this->io->writeError('No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.'); $this->update = \true; } if ($this->dryRun) { $this->verbose = \true; $this->runScripts = \false; $this->executeOperations = \false; $this->writeLock = \false; $this->dumpAutoloader = \false; $this->mockLocalRepositories($this->repositoryManager); } if ($this->downloadOnly) { $this->dumpAutoloader = \false; } if ($this->update && !$this->install) { $this->dumpAutoloader = \false; } if ($this->runScripts) { Platform::putEnv('COMPOSER_DEV_MODE', $this->devMode ? '1' : '0'); // dispatch pre event // should we treat this more strictly as running an update and then running an install, triggering events multiple times? $eventName = $this->update ? ScriptEvents::PRE_UPDATE_CMD : ScriptEvents::PRE_INSTALL_CMD; $this->eventDispatcher->dispatchScript($eventName, $this->devMode); } $this->downloadManager->setPreferSource($this->preferSource); $this->downloadManager->setPreferDist($this->preferDist); $localRepo = $this->repositoryManager->getLocalRepository(); try { if ($this->update) { $res = $this->doUpdate($localRepo, $this->install); } else { $res = $this->doInstall($localRepo); } if ($res !== 0) { return $res; } } catch (\Exception $e) { if ($this->executeOperations && $this->install && $this->config->get('notify-on-install')) { $this->installationManager->notifyInstalls($this->io); } throw $e; } if ($this->executeOperations && $this->install && $this->config->get('notify-on-install')) { $this->installationManager->notifyInstalls($this->io); } if ($this->update) { $installedRepo = new InstalledRepository([$this->locker->getLockedRepository($this->devMode), $this->createPlatformRepo(\false), new RootPackageRepository(clone $this->package)]); if ($isFreshInstall) { $this->suggestedPackagesReporter->addSuggestionsFromPackage($this->package); } $this->suggestedPackagesReporter->outputMinimalistic($installedRepo); } // Find abandoned packages and warn user $lockedRepository = $this->locker->getLockedRepository(\true); foreach ($lockedRepository->getPackages() as $package) { if (!$package instanceof CompletePackage || !$package->isAbandoned()) { continue; } $replacement = \is_string($package->getReplacementPackage()) ? 'Use ' . $package->getReplacementPackage() . ' instead' : 'No replacement was suggested'; $this->io->writeError(\sprintf("Package %s is abandoned, you should avoid using it. %s.", $package->getPrettyName(), $replacement)); } if ($this->dumpAutoloader) { // write autoloader if ($this->optimizeAutoloader) { $this->io->writeError('Generating optimized autoload files'); } else { $this->io->writeError('Generating autoload files'); } $this->autoloadGenerator->setClassMapAuthoritative($this->classMapAuthoritative); $this->autoloadGenerator->setApcu($this->apcuAutoloader, $this->apcuAutoloaderPrefix); $this->autoloadGenerator->setRunScripts($this->runScripts); $this->autoloadGenerator->setPlatformRequirementFilter($this->platformRequirementFilter); $this->autoloadGenerator->dump($this->config, $localRepo, $this->package, $this->installationManager, 'composer', $this->optimizeAutoloader, null, $this->locker); } if ($this->install && $this->executeOperations) { // force binaries re-generation in case they are missing foreach ($localRepo->getPackages() as $package) { $this->installationManager->ensureBinariesPresence($package); } } $fundEnv = Platform::getEnv('COMPOSER_FUND'); $showFunding = \true; if (\is_numeric($fundEnv)) { $showFunding = \intval($fundEnv) !== 0; } if ($showFunding) { $fundingCount = 0; foreach ($localRepo->getPackages() as $package) { if ($package instanceof CompletePackageInterface && !$package instanceof AliasPackage && $package->getFunding()) { $fundingCount++; } } if ($fundingCount > 0) { $this->io->writeError([\sprintf("%d package%s you are using %s looking for funding.", $fundingCount, 1 === $fundingCount ? '' : 's', 1 === $fundingCount ? 'is' : 'are'), 'Use the `composer fund` command to find out more!']); } } if ($this->runScripts) { // dispatch post event $eventName = $this->update ? ScriptEvents::POST_UPDATE_CMD : ScriptEvents::POST_INSTALL_CMD; $this->eventDispatcher->dispatchScript($eventName, $this->devMode); } // re-enable GC except on HHVM which triggers a warning here if (!\defined('_ContaoManager\\HHVM_VERSION')) { \gc_enable(); } if ($this->audit) { if ($this->update && !$this->install) { $packages = $lockedRepository->getCanonicalPackages(); $target = 'locked'; } else { $packages = $localRepo->getCanonicalPackages(); $target = 'installed'; } if (\count($packages) > 0) { try { $auditor = new Auditor(); $repoSet = new RepositorySet(); foreach ($this->repositoryManager->getRepositories() as $repo) { $repoSet->addRepository($repo); } $auditConfig = $this->config->get('audit'); return $auditor->audit($this->io, $repoSet, $packages, $this->auditFormat, \true, $auditConfig['ignore'] ?? [], $auditConfig['abandoned'] ?? Auditor::ABANDONED_FAIL) > 0 && $this->errorOnAudit ? self::ERROR_AUDIT_FAILED : 0; } catch (TransportException $e) { $this->io->error('Failed to audit ' . $target . ' packages.'); if ($this->io->isVerbose()) { $this->io->error('[' . \get_class($e) . '] ' . $e->getMessage()); } } } else { $this->io->writeError('No ' . $target . ' packages - skipping audit.'); } } return 0; } /** * @phpstan-return self::ERROR_* */ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doInstall) : int { $platformRepo = $this->createPlatformRepo(\true); $aliases = $this->getRootAliases(\true); $lockedRepository = null; try { if ($this->locker->isLocked()) { $lockedRepository = $this->locker->getLockedRepository(\true); } } catch (\_ContaoManager\Seld\JsonLint\ParsingException $e) { if ($this->updateAllowList !== null || $this->updateMirrors) { // in case we are doing a partial update or updating mirrors, the lock file is needed so we error throw $e; } // otherwise, ignoring parse errors as the lock file will be regenerated from scratch when // doing a full update } if (($this->updateAllowList !== null || $this->updateMirrors) && !$lockedRepository) { $this->io->writeError('Cannot update ' . ($this->updateMirrors ? 'lock file information' : 'only a partial set of packages') . ' without a lock file present. Run `composer update` to generate a lock file.', \true, IOInterface::QUIET); return self::ERROR_NO_LOCK_FILE_FOR_PARTIAL_UPDATE; } $this->io->writeError('Loading composer repositories with package information'); // creating repository set $policy = $this->createPolicy(\true, $lockedRepository); $repositorySet = $this->createRepositorySet(\true, $platformRepo, $aliases); $repositories = $this->repositoryManager->getRepositories(); foreach ($repositories as $repository) { $repositorySet->addRepository($repository); } if ($lockedRepository) { $repositorySet->addRepository($lockedRepository); } $request = $this->createRequest($this->fixedRootPackage, $platformRepo, $lockedRepository); $this->requirePackagesForUpdate($request, $lockedRepository, \true); // pass the allow list into the request, so the pool builder can apply it if ($this->updateAllowList !== null) { $request->setUpdateAllowList($this->updateAllowList, $this->updateAllowTransitiveDependencies); } $pool = $repositorySet->createPool($request, $this->io, $this->eventDispatcher, $this->createPoolOptimizer($policy), $this->ignoredTypes, $this->allowedTypes); $this->io->writeError('Updating dependencies'); // solve dependencies $solver = new Solver($policy, $pool, $this->io); try { $lockTransaction = $solver->solve($request, $this->platformRequirementFilter); $ruleSetSize = $solver->getRuleSetSize(); $solver = null; } catch (SolverProblemsException $e) { $err = 'Your requirements could not be resolved to an installable set of packages.'; $prettyProblem = $e->getPrettyString($repositorySet, $request, $pool, $this->io->isVerbose()); $this->io->writeError('' . $err . '', \true, IOInterface::QUIET); $this->io->writeError($prettyProblem); if (!$this->devMode) { $this->io->writeError('Running update with --no-dev does not mean require-dev is ignored, it just means the packages will not be installed. If dev requirements are blocking the update you have to resolve those problems.', \true, IOInterface::QUIET); } $ghe = new GithubActionError($this->io); $ghe->emit($err . "\n" . $prettyProblem); return \max(self::ERROR_GENERIC_FAILURE, $e->getCode()); } $this->io->writeError("Analyzed " . \count($pool) . " packages to resolve dependencies", \true, IOInterface::VERBOSE); $this->io->writeError("Analyzed " . $ruleSetSize . " rules to resolve dependencies", \true, IOInterface::VERBOSE); $pool = null; if (!$lockTransaction->getOperations()) { $this->io->writeError('Nothing to modify in lock file'); } $exitCode = $this->extractDevPackages($lockTransaction, $platformRepo, $aliases, $policy, $lockedRepository); if ($exitCode !== 0) { return $exitCode; } \Composer\Semver\CompilingMatcher::clear(); // write lock $platformReqs = $this->extractPlatformRequirements($this->package->getRequires()); $platformDevReqs = $this->extractPlatformRequirements($this->package->getDevRequires()); $installsUpdates = $uninstalls = []; if ($lockTransaction->getOperations()) { $installNames = $updateNames = $uninstallNames = []; foreach ($lockTransaction->getOperations() as $operation) { if ($operation instanceof InstallOperation) { $installsUpdates[] = $operation; $installNames[] = $operation->getPackage()->getPrettyName() . ':' . $operation->getPackage()->getFullPrettyVersion(); } elseif ($operation instanceof UpdateOperation) { // when mirrors/metadata from a package gets updated we do not want to list it as an // update in the output as it is only an internal lock file metadata update if ($this->updateMirrors && $operation->getInitialPackage()->getName() === $operation->getTargetPackage()->getName() && $operation->getInitialPackage()->getVersion() === $operation->getTargetPackage()->getVersion()) { continue; } $installsUpdates[] = $operation; $updateNames[] = $operation->getTargetPackage()->getPrettyName() . ':' . $operation->getTargetPackage()->getFullPrettyVersion(); } elseif ($operation instanceof UninstallOperation) { $uninstalls[] = $operation; $uninstallNames[] = $operation->getPackage()->getPrettyName(); } } if ($this->config->get('lock')) { $this->io->writeError(\sprintf("Lock file operations: %d install%s, %d update%s, %d removal%s", \count($installNames), 1 === \count($installNames) ? '' : 's', \count($updateNames), 1 === \count($updateNames) ? '' : 's', \count($uninstalls), 1 === \count($uninstalls) ? '' : 's')); if ($installNames) { $this->io->writeError("Installs: " . \implode(', ', $installNames), \true, IOInterface::VERBOSE); } if ($updateNames) { $this->io->writeError("Updates: " . \implode(', ', $updateNames), \true, IOInterface::VERBOSE); } if ($uninstalls) { $this->io->writeError("Removals: " . \implode(', ', $uninstallNames), \true, IOInterface::VERBOSE); } } } $sortByName = static function ($a, $b) : int { if ($a instanceof UpdateOperation) { $a = $a->getTargetPackage()->getName(); } else { $a = $a->getPackage()->getName(); } if ($b instanceof UpdateOperation) { $b = $b->getTargetPackage()->getName(); } else { $b = $b->getPackage()->getName(); } return \strcmp($a, $b); }; \usort($uninstalls, $sortByName); \usort($installsUpdates, $sortByName); foreach (\array_merge($uninstalls, $installsUpdates) as $operation) { // collect suggestions if ($operation instanceof InstallOperation) { $this->suggestedPackagesReporter->addSuggestionsFromPackage($operation->getPackage()); } // output op if lock file is enabled, but alias op only in debug verbosity if ($this->config->get('lock') && (\false === \strpos($operation->getOperationType(), 'Alias') || $this->io->isDebug())) { $sourceRepo = ''; if ($this->io->isVeryVerbose() && \false === \strpos($operation->getOperationType(), 'Alias')) { $operationPkg = $operation instanceof UpdateOperation ? $operation->getTargetPackage() : $operation->getPackage(); if ($operationPkg->getRepository() !== null) { $sourceRepo = ' from ' . $operationPkg->getRepository()->getRepoName(); } } $this->io->writeError(' - ' . $operation->show(\true) . $sourceRepo); } } $updatedLock = $this->locker->setLockData($lockTransaction->getNewLockPackages(\false, $this->updateMirrors), $lockTransaction->getNewLockPackages(\true, $this->updateMirrors), $platformReqs, $platformDevReqs, $lockTransaction->getAliases($aliases), $this->package->getMinimumStability(), $this->package->getStabilityFlags(), $this->preferStable || $this->package->getPreferStable(), $this->preferLowest, $this->config->get('platform') ?: [], $this->writeLock && $this->executeOperations); if ($updatedLock && $this->writeLock && $this->executeOperations) { $this->io->writeError('Writing lock file'); } if ($doInstall) { // TODO ensure lock is used from locker as-is, since it may not have been written to disk in case of executeOperations == false return $this->doInstall($localRepo, \true); } return 0; } /** * Run the solver a second time on top of the existing update result with only the current result set in the pool * and see what packages would get removed if we only had the non-dev packages in the solver request * * @param array> $aliases * * @phpstan-param list $aliases * @phpstan-return self::ERROR_* */ protected function extractDevPackages(LockTransaction $lockTransaction, PlatformRepository $platformRepo, array $aliases, PolicyInterface $policy, ?LockArrayRepository $lockedRepository = null) : int { if (!$this->package->getDevRequires()) { return 0; } $resultRepo = new ArrayRepository([]); $loader = new ArrayLoader(null, \true); $dumper = new ArrayDumper(); foreach ($lockTransaction->getNewLockPackages(\false) as $pkg) { $resultRepo->addPackage($loader->load($dumper->dump($pkg))); } $repositorySet = $this->createRepositorySet(\true, $platformRepo, $aliases); $repositorySet->addRepository($resultRepo); $request = $this->createRequest($this->fixedRootPackage, $platformRepo); $this->requirePackagesForUpdate($request, $lockedRepository, \false); $pool = $repositorySet->createPoolWithAllPackages(); $solver = new Solver($policy, $pool, $this->io); try { $nonDevLockTransaction = $solver->solve($request, $this->platformRequirementFilter); $solver = null; } catch (SolverProblemsException $e) { $err = 'Unable to find a compatible set of packages based on your non-dev requirements alone.'; $prettyProblem = $e->getPrettyString($repositorySet, $request, $pool, $this->io->isVerbose(), \true); $this->io->writeError('' . $err . '', \true, IOInterface::QUIET); $this->io->writeError('Your requirements can be resolved successfully when require-dev packages are present.'); $this->io->writeError('You may need to move packages from require-dev or some of their dependencies to require.'); $this->io->writeError($prettyProblem); $ghe = new GithubActionError($this->io); $ghe->emit($err . "\n" . $prettyProblem); return $e->getCode(); } $lockTransaction->setNonDevPackages($nonDevLockTransaction); return 0; } /** * @param bool $alreadySolved Whether the function is called as part of an update command or independently * @return int exit code * @phpstan-return self::ERROR_* */ protected function doInstall(InstalledRepositoryInterface $localRepo, bool $alreadySolved = \false) : int { if ($this->config->get('lock')) { $this->io->writeError('Installing dependencies from lock file' . ($this->devMode ? ' (including require-dev)' : '') . ''); } $lockedRepository = $this->locker->getLockedRepository($this->devMode); // verify that the lock file works with the current platform repository // we can skip this part if we're doing this as the second step after an update if (!$alreadySolved) { $this->io->writeError('Verifying lock file contents can be installed on current platform.'); $platformRepo = $this->createPlatformRepo(\false); // creating repository set $policy = $this->createPolicy(\false); // use aliases from lock file only, so empty root aliases here $repositorySet = $this->createRepositorySet(\false, $platformRepo, [], $lockedRepository); $repositorySet->addRepository($lockedRepository); // creating requirements request $request = $this->createRequest($this->fixedRootPackage, $platformRepo, $lockedRepository); if (!$this->locker->isFresh()) { $this->io->writeError('Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update `.', \true, IOInterface::QUIET); } $missingRequirementInfo = $this->locker->getMissingRequirementInfo($this->package, $this->devMode); if ($missingRequirementInfo !== []) { $this->io->writeError($missingRequirementInfo); if (!$this->config->get('allow-missing-requirements')) { return self::ERROR_LOCK_FILE_INVALID; } } foreach ($lockedRepository->getPackages() as $package) { $request->fixLockedPackage($package); } $rootRequires = $this->package->getRequires(); if ($this->devMode) { $rootRequires = \array_merge($rootRequires, $this->package->getDevRequires()); } foreach ($rootRequires as $link) { if (PlatformRepository::isPlatformPackage($link->getTarget())) { $request->requireName($link->getTarget(), $link->getConstraint()); } } foreach ($this->locker->getPlatformRequirements($this->devMode) as $link) { if (!isset($rootRequires[$link->getTarget()])) { $request->requireName($link->getTarget(), $link->getConstraint()); } } unset($rootRequires, $link); $pool = $repositorySet->createPool($request, $this->io, $this->eventDispatcher, null, $this->ignoredTypes, $this->allowedTypes); // solve dependencies $solver = new Solver($policy, $pool, $this->io); try { $lockTransaction = $solver->solve($request, $this->platformRequirementFilter); $solver = null; // installing the locked packages on this platform resulted in lock modifying operations, there wasn't a conflict, but the lock file as-is seems to not work on this system if (0 !== \count($lockTransaction->getOperations())) { $this->io->writeError('Your lock file cannot be installed on this system without changes. Please run composer update.', \true, IOInterface::QUIET); return self::ERROR_LOCK_FILE_INVALID; } } catch (SolverProblemsException $e) { $err = 'Your lock file does not contain a compatible set of packages. Please run composer update.'; $prettyProblem = $e->getPrettyString($repositorySet, $request, $pool, $this->io->isVerbose()); $this->io->writeError('' . $err . '', \true, IOInterface::QUIET); $this->io->writeError($prettyProblem); $ghe = new GithubActionError($this->io); $ghe->emit($err . "\n" . $prettyProblem); return \max(self::ERROR_GENERIC_FAILURE, $e->getCode()); } } // TODO in how far do we need to do anything here to ensure dev packages being updated to latest in lock without version change are treated correctly? $localRepoTransaction = new LocalRepoTransaction($lockedRepository, $localRepo); $this->eventDispatcher->dispatchInstallerEvent(InstallerEvents::PRE_OPERATIONS_EXEC, $this->devMode, $this->executeOperations, $localRepoTransaction); $installs = $updates = $uninstalls = []; foreach ($localRepoTransaction->getOperations() as $operation) { if ($operation instanceof InstallOperation) { $installs[] = $operation->getPackage()->getPrettyName() . ':' . $operation->getPackage()->getFullPrettyVersion(); } elseif ($operation instanceof UpdateOperation) { $updates[] = $operation->getTargetPackage()->getPrettyName() . ':' . $operation->getTargetPackage()->getFullPrettyVersion(); } elseif ($operation instanceof UninstallOperation) { $uninstalls[] = $operation->getPackage()->getPrettyName(); } } if ($installs === [] && $updates === [] && $uninstalls === []) { $this->io->writeError('Nothing to install, update or remove'); } else { $this->io->writeError(\sprintf("Package operations: %d install%s, %d update%s, %d removal%s", \count($installs), 1 === \count($installs) ? '' : 's', \count($updates), 1 === \count($updates) ? '' : 's', \count($uninstalls), 1 === \count($uninstalls) ? '' : 's')); if ($installs) { $this->io->writeError("Installs: " . \implode(', ', $installs), \true, IOInterface::VERBOSE); } if ($updates) { $this->io->writeError("Updates: " . \implode(', ', $updates), \true, IOInterface::VERBOSE); } if ($uninstalls) { $this->io->writeError("Removals: " . \implode(', ', $uninstalls), \true, IOInterface::VERBOSE); } } if ($this->executeOperations) { $localRepo->setDevPackageNames($this->locker->getDevPackageNames()); $this->installationManager->execute($localRepo, $localRepoTransaction->getOperations(), $this->devMode, $this->runScripts, $this->downloadOnly); // see https://github.com/composer/composer/issues/2764 if (\count($localRepoTransaction->getOperations()) > 0) { $vendorDir = $this->config->get('vendor-dir'); if (\is_dir($vendorDir)) { // suppress errors as this fails sometimes on OSX for no apparent reason // see https://github.com/composer/composer/issues/4070#issuecomment-129792748 @\touch($vendorDir); } } } else { foreach ($localRepoTransaction->getOperations() as $operation) { // output op, but alias op only in debug verbosity if (\false === \strpos($operation->getOperationType(), 'Alias') || $this->io->isDebug()) { $this->io->writeError(' - ' . $operation->show(\false)); } } } return 0; } protected function createPlatformRepo(bool $forUpdate) : PlatformRepository { if ($forUpdate) { $platformOverrides = $this->config->get('platform') ?: []; } else { $platformOverrides = $this->locker->getPlatformOverrides(); } return new PlatformRepository([], $platformOverrides); } /** * @param array> $rootAliases * * @phpstan-param list $rootAliases */ private function createRepositorySet(bool $forUpdate, PlatformRepository $platformRepo, array $rootAliases = [], ?RepositoryInterface $lockedRepository = null) : RepositorySet { if ($forUpdate) { $minimumStability = $this->package->getMinimumStability(); $stabilityFlags = $this->package->getStabilityFlags(); $requires = \array_merge($this->package->getRequires(), $this->package->getDevRequires()); } else { $minimumStability = $this->locker->getMinimumStability(); $stabilityFlags = $this->locker->getStabilityFlags(); $requires = []; foreach ($lockedRepository->getPackages() as $package) { $constraint = new Constraint('=', $package->getVersion()); $constraint->setPrettyString($package->getPrettyVersion()); $requires[$package->getName()] = $constraint; } } $rootRequires = []; foreach ($requires as $req => $constraint) { if ($constraint instanceof Link) { $constraint = $constraint->getConstraint(); } // skip platform requirements from the root package to avoid filtering out existing platform packages if ($this->platformRequirementFilter->isIgnored($req)) { continue; } elseif ($this->platformRequirementFilter instanceof IgnoreListPlatformRequirementFilter) { $constraint = $this->platformRequirementFilter->filterConstraint($req, $constraint); } $rootRequires[$req] = $constraint; } $this->fixedRootPackage = clone $this->package; $this->fixedRootPackage->setRequires([]); $this->fixedRootPackage->setDevRequires([]); $stabilityFlags[$this->package->getName()] = BasePackage::STABILITIES[VersionParser::parseStability($this->package->getVersion())]; $repositorySet = new RepositorySet($minimumStability, $stabilityFlags, $rootAliases, $this->package->getReferences(), $rootRequires, $this->temporaryConstraints); $repositorySet->addRepository(new RootPackageRepository($this->fixedRootPackage)); $repositorySet->addRepository($platformRepo); if ($this->additionalFixedRepository) { // allow using installed repos if needed to avoid warnings about installed repositories being used in the RepositorySet // see https://github.com/composer/composer/pull/9574 $additionalFixedRepositories = $this->additionalFixedRepository; if ($additionalFixedRepositories instanceof CompositeRepository) { $additionalFixedRepositories = $additionalFixedRepositories->getRepositories(); } else { $additionalFixedRepositories = [$additionalFixedRepositories]; } foreach ($additionalFixedRepositories as $additionalFixedRepository) { if ($additionalFixedRepository instanceof InstalledRepository || $additionalFixedRepository instanceof InstalledRepositoryInterface) { $repositorySet->allowInstalledRepositories(); break; } } $repositorySet->addRepository($this->additionalFixedRepository); } return $repositorySet; } private function createPolicy(bool $forUpdate, ?LockArrayRepository $lockedRepo = null) : DefaultPolicy { $preferStable = null; $preferLowest = null; if (!$forUpdate) { $preferStable = $this->locker->getPreferStable(); $preferLowest = $this->locker->getPreferLowest(); } // old lock file without prefer stable/lowest will return null // so in this case we use the composer.json info if (null === $preferStable) { $preferStable = $this->preferStable || $this->package->getPreferStable(); } if (null === $preferLowest) { $preferLowest = $this->preferLowest; } $preferredVersions = null; if ($forUpdate && $this->minimalUpdate && $this->updateAllowList !== null && $lockedRepo !== null) { $preferredVersions = []; foreach ($lockedRepo->getPackages() as $pkg) { if ($pkg instanceof AliasPackage || \in_array($pkg->getName(), $this->updateAllowList, \true)) { continue; } $preferredVersions[$pkg->getName()] = $pkg->getVersion(); } } return new DefaultPolicy($preferStable, $preferLowest, $preferredVersions); } /** * @param RootPackageInterface&BasePackage $rootPackage */ private function createRequest(RootPackageInterface $rootPackage, PlatformRepository $platformRepo, ?LockArrayRepository $lockedRepository = null) : Request { $request = new Request($lockedRepository); $request->fixPackage($rootPackage); if ($rootPackage instanceof RootAliasPackage) { $request->fixPackage($rootPackage->getAliasOf()); } $fixedPackages = $platformRepo->getPackages(); if ($this->additionalFixedRepository) { $fixedPackages = \array_merge($fixedPackages, $this->additionalFixedRepository->getPackages()); } // fix the version of all platform packages + additionally installed packages // to prevent the solver trying to remove or update those // TODO why not replaces? $provided = $rootPackage->getProvides(); foreach ($fixedPackages as $package) { // skip platform packages that are provided by the root package if ($package->getRepository() !== $platformRepo || !isset($provided[$package->getName()]) || !$provided[$package->getName()]->getConstraint()->matches(new Constraint('=', $package->getVersion()))) { $request->fixPackage($package); } } return $request; } private function requirePackagesForUpdate(Request $request, ?LockArrayRepository $lockedRepository = null, bool $includeDevRequires = \true) : void { // if we're updating mirrors we want to keep exactly the same versions installed which are in the lock file, but we want current remote metadata if ($this->updateMirrors) { $excludedPackages = []; if (!$includeDevRequires) { $excludedPackages = \array_flip($this->locker->getDevPackageNames()); } foreach ($lockedRepository->getPackages() as $lockedPackage) { // exclude alias packages here as for root aliases, both alias and aliased are // present in the lock repo and we only want to require the aliased version if (!$lockedPackage instanceof AliasPackage && !isset($excludedPackages[$lockedPackage->getName()])) { $request->requireName($lockedPackage->getName(), new Constraint('==', $lockedPackage->getVersion())); } } } else { $links = $this->package->getRequires(); if ($includeDevRequires) { $links = \array_merge($links, $this->package->getDevRequires()); } foreach ($links as $link) { $request->requireName($link->getTarget(), $link->getConstraint()); } } } /** * @return array> * * @phpstan-return list */ private function getRootAliases(bool $forUpdate) : array { if ($forUpdate) { $aliases = $this->package->getAliases(); } else { $aliases = $this->locker->getAliases(); } return $aliases; } /** * @param Link[] $links * * @return array */ private function extractPlatformRequirements(array $links) : array { $platformReqs = []; foreach ($links as $link) { if (PlatformRepository::isPlatformPackage($link->getTarget())) { $platformReqs[$link->getTarget()] = $link->getPrettyConstraint(); } } return $platformReqs; } /** * Replace local repositories with InstalledArrayRepository instances * * This is to prevent any accidental modification of the existing repos on disk */ private function mockLocalRepositories(RepositoryManager $rm) : void { $packages = []; foreach ($rm->getLocalRepository()->getPackages() as $package) { $packages[(string) $package] = clone $package; } foreach ($packages as $key => $package) { if ($package instanceof AliasPackage) { $alias = (string) $package->getAliasOf(); $className = \get_class($package); $packages[$key] = new $className($packages[$alias], $package->getVersion(), $package->getPrettyVersion()); } } $rm->setLocalRepository(new InstalledArrayRepository($packages)); } private function createPoolOptimizer(PolicyInterface $policy) : ?PoolOptimizer { // Not the best architectural decision here, would need to be able // to configure from the outside of Installer but this is only // a debugging tool and should never be required in any other use case if ('0' === Platform::getEnv('COMPOSER_POOL_OPTIMIZER')) { $this->io->write('Pool Optimizer was disabled for debugging purposes.', \true, IOInterface::DEBUG); return null; } return new PoolOptimizer($policy); } /** * Create Installer * * @return Installer */ public static function create(IOInterface $io, \Composer\Composer $composer) : self { return new static($io, $composer->getConfig(), $composer->getPackage(), $composer->getDownloadManager(), $composer->getRepositoryManager(), $composer->getLocker(), $composer->getInstallationManager(), $composer->getEventDispatcher(), $composer->getAutoloadGenerator()); } /** * Packages of those types are ignored, by default php-ext and php-ext-zend are ignored * * @param list $types * @return $this */ public function setIgnoredTypes(array $types) : self { $this->ignoredTypes = $types; return $this; } /** * Only packages of those types are allowed if set to non-null * * @param list|null $types * @return $this */ public function setAllowedTypes(?array $types) : self { $this->allowedTypes = $types; return $this; } /** * @return $this */ public function setAdditionalFixedRepository(RepositoryInterface $additionalFixedRepository) : self { $this->additionalFixedRepository = $additionalFixedRepository; return $this; } /** * @param array $constraints * @return Installer */ public function setTemporaryConstraints(array $constraints) : self { $this->temporaryConstraints = $constraints; return $this; } /** * Whether to run in drymode or not * * @return Installer */ public function setDryRun(bool $dryRun = \true) : self { $this->dryRun = $dryRun; return $this; } /** * Checks, if this is a dry run (simulation mode). */ public function isDryRun() : bool { return $this->dryRun; } /** * Whether to download only or not. * * @return Installer */ public function setDownloadOnly(bool $downloadOnly = \true) : self { $this->downloadOnly = $downloadOnly; return $this; } /** * prefer source installation * * @return Installer */ public function setPreferSource(bool $preferSource = \true) : self { $this->preferSource = $preferSource; return $this; } /** * prefer dist installation * * @return Installer */ public function setPreferDist(bool $preferDist = \true) : self { $this->preferDist = $preferDist; return $this; } /** * Whether or not generated autoloader are optimized * * @return Installer */ public function setOptimizeAutoloader(bool $optimizeAutoloader) : self { $this->optimizeAutoloader = $optimizeAutoloader; if (!$this->optimizeAutoloader) { // Force classMapAuthoritative off when not optimizing the // autoloader $this->setClassMapAuthoritative(\false); } return $this; } /** * Whether or not generated autoloader considers the class map * authoritative. * * @return Installer */ public function setClassMapAuthoritative(bool $classMapAuthoritative) : self { $this->classMapAuthoritative = $classMapAuthoritative; if ($this->classMapAuthoritative) { // Force optimizeAutoloader when classmap is authoritative $this->setOptimizeAutoloader(\true); } return $this; } /** * Whether or not generated autoloader considers APCu caching. * * @return Installer */ public function setApcuAutoloader(bool $apcuAutoloader, ?string $apcuAutoloaderPrefix = null) : self { $this->apcuAutoloader = $apcuAutoloader; $this->apcuAutoloaderPrefix = $apcuAutoloaderPrefix; return $this; } /** * update packages * * @return Installer */ public function setUpdate(bool $update) : self { $this->update = $update; return $this; } /** * Allows disabling the install step after an update * * @return Installer */ public function setInstall(bool $install) : self { $this->install = $install; return $this; } /** * enables dev packages * * @return Installer */ public function setDevMode(bool $devMode = \true) : self { $this->devMode = $devMode; return $this; } /** * set whether to run autoloader or not * * This is disabled implicitly when enabling dryRun * * @return Installer */ public function setDumpAutoloader(bool $dumpAutoloader = \true) : self { $this->dumpAutoloader = $dumpAutoloader; return $this; } /** * set whether to run scripts or not * * This is disabled implicitly when enabling dryRun * * @return Installer * @deprecated Use setRunScripts(false) on the EventDispatcher instance being injected instead */ public function setRunScripts(bool $runScripts = \true) : self { $this->runScripts = $runScripts; return $this; } /** * set the config instance * * @return Installer */ public function setConfig(\Composer\Config $config) : self { $this->config = $config; return $this; } /** * run in verbose mode * * @return Installer */ public function setVerbose(bool $verbose = \true) : self { $this->verbose = $verbose; return $this; } /** * Checks, if running in verbose mode. */ public function isVerbose() : bool { return $this->verbose; } /** * set ignore Platform Package requirements * * If this is set to true, all platform requirements are ignored * If this is set to false, no platform requirements are ignored * If this is set to string[], those packages will be ignored * * @param bool|string[] $ignorePlatformReqs * * @return Installer * * @deprecated use setPlatformRequirementFilter instead */ public function setIgnorePlatformRequirements($ignorePlatformReqs) : self { \trigger_error('Installer::setIgnorePlatformRequirements is deprecated since Composer 2.2, use setPlatformRequirementFilter instead.', \E_USER_DEPRECATED); return $this->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)); } /** * @return Installer */ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface $platformRequirementFilter) : self { $this->platformRequirementFilter = $platformRequirementFilter; return $this; } /** * Update the lock file to the exact same versions and references but use current remote metadata like URLs and mirror info * * @return Installer */ public function setUpdateMirrors(bool $updateMirrors) : self { $this->updateMirrors = $updateMirrors; return $this; } /** * restrict the update operation to a few packages, all other packages * that are already installed will be kept at their current version * * @param string[] $packages * * @return Installer */ public function setUpdateAllowList(array $packages) : self { if (\count($packages) === 0) { $this->updateAllowList = null; } else { $this->updateAllowList = \array_values(\array_unique(\array_map('strtolower', $packages))); } return $this; } /** * Should dependencies of packages marked for update be updated? * * Depending on the chosen constant this will either only update the directly named packages, all transitive * dependencies which are not root requirement or all transitive dependencies including root requirements * * @param int $updateAllowTransitiveDependencies One of the UPDATE_ constants on the Request class * @return Installer */ public function setUpdateAllowTransitiveDependencies(int $updateAllowTransitiveDependencies) : self { if (!\in_array($updateAllowTransitiveDependencies, [Request::UPDATE_ONLY_LISTED, Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE, Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS], \true)) { throw new \RuntimeException("Invalid value for updateAllowTransitiveDependencies supplied"); } $this->updateAllowTransitiveDependencies = $updateAllowTransitiveDependencies; return $this; } /** * Should packages be preferred in a stable version when updating? * * @return Installer */ public function setPreferStable(bool $preferStable = \true) : self { $this->preferStable = $preferStable; return $this; } /** * Should packages be preferred in a lowest version when updating? * * @return Installer */ public function setPreferLowest(bool $preferLowest = \true) : self { $this->preferLowest = $preferLowest; return $this; } /** * Only relevant for partial updates (with setUpdateAllowList), if this is enabled currently locked versions will be preferred for packages which are not in the allowlist * * This reduces the update to * * @return Installer */ public function setMinimalUpdate(bool $minimalUpdate = \true) : self { $this->minimalUpdate = $minimalUpdate; return $this; } /** * Should the lock file be updated when updating? * * This is disabled implicitly when enabling dryRun * * @return Installer */ public function setWriteLock(bool $writeLock = \true) : self { $this->writeLock = $writeLock; return $this; } /** * Should the operations (package install, update and removal) be executed on disk? * * This is disabled implicitly when enabling dryRun * * @return Installer */ public function setExecuteOperations(bool $executeOperations = \true) : self { $this->executeOperations = $executeOperations; return $this; } /** * Should an audit be run after installation is complete? * * @return Installer */ public function setAudit(bool $audit) : self { $this->audit = $audit; return $this; } /** * Should exit with status code 5 on audit error * * @param bool $errorOnAudit * @return Installer */ public function setErrorOnAudit(bool $errorOnAudit) : self { $this->errorOnAudit = $errorOnAudit; return $this; } /** * What format should be used for audit output? * * @param Auditor::FORMAT_* $auditFormat * @return Installer */ public function setAuditFormat(string $auditFormat) : self { $this->auditFormat = $auditFormat; return $this; } /** * Disables plugins. * * Call this if you want to ensure that third-party code never gets * executed. The default is to automatically install, and execute * custom third-party installers. * * @return Installer */ public function disablePlugins() : self { $this->installationManager->disablePlugins(); return $this; } /** * @return Installer */ public function setSuggestedPackagesReporter(SuggestedPackagesReporter $suggestedPackagesReporter) : self { $this->suggestedPackagesReporter = $suggestedPackagesReporter; return $this; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Filter\PlatformRequirementFilter; interface PlatformRequirementFilterInterface { public function isIgnored(string $req) : bool; public function isUpperBoundIgnored(string $req) : bool; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Filter\PlatformRequirementFilter; use Composer\Repository\PlatformRepository; final class IgnoreAllPlatformRequirementFilter implements \Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface { public function isIgnored(string $req) : bool { return PlatformRepository::isPlatformPackage($req); } public function isUpperBoundIgnored(string $req) : bool { return $this->isIgnored($req); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Filter\PlatformRequirementFilter; use Composer\Package\BasePackage; use Composer\Pcre\Preg; use Composer\Repository\PlatformRepository; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Interval; use Composer\Semver\Intervals; final class IgnoreListPlatformRequirementFilter implements \Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface { /** * @var non-empty-string */ private $ignoreRegex; /** * @var non-empty-string */ private $ignoreUpperBoundRegex; /** * @param string[] $reqList */ public function __construct(array $reqList) { $ignoreAll = $ignoreUpperBound = []; foreach ($reqList as $req) { if (\substr($req, -1) === '+') { $ignoreUpperBound[] = \substr($req, 0, -1); } else { $ignoreAll[] = $req; } } $this->ignoreRegex = BasePackage::packageNamesToRegexp($ignoreAll); $this->ignoreUpperBoundRegex = BasePackage::packageNamesToRegexp($ignoreUpperBound); } public function isIgnored(string $req) : bool { if (!PlatformRepository::isPlatformPackage($req)) { return \false; } return Preg::isMatch($this->ignoreRegex, $req); } public function isUpperBoundIgnored(string $req) : bool { if (!PlatformRepository::isPlatformPackage($req)) { return \false; } return $this->isIgnored($req) || Preg::isMatch($this->ignoreUpperBoundRegex, $req); } /** * @param bool $allowUpperBoundOverride For conflicts we do not want the upper bound to be skipped */ public function filterConstraint(string $req, ConstraintInterface $constraint, bool $allowUpperBoundOverride = \true) : ConstraintInterface { if (!PlatformRepository::isPlatformPackage($req)) { return $constraint; } if (!$allowUpperBoundOverride || !Preg::isMatch($this->ignoreUpperBoundRegex, $req)) { return $constraint; } if (Preg::isMatch($this->ignoreRegex, $req)) { return new MatchAllConstraint(); } $intervals = Intervals::get($constraint); $last = \end($intervals['numeric']); if ($last !== \false && (string) $last->getEnd() !== (string) Interval::untilPositiveInfinity()) { $constraint = new MultiConstraint([$constraint, new Constraint('>=', $last->getEnd()->getVersion())], \false); } return $constraint; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Filter\PlatformRequirementFilter; final class IgnoreNothingPlatformRequirementFilter implements \Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface { /** * @return false */ public function isIgnored(string $req) : bool { return \false; } /** * @return false */ public function isUpperBoundIgnored(string $req) : bool { return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Filter\PlatformRequirementFilter; final class PlatformRequirementFilterFactory { /** * @param mixed $boolOrList */ public static function fromBoolOrList($boolOrList) : \Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface { if (\is_bool($boolOrList)) { return $boolOrList ? self::ignoreAll() : self::ignoreNothing(); } if (\is_array($boolOrList)) { return new \Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter($boolOrList); } throw new \InvalidArgumentException(\sprintf('PlatformRequirementFilter: Unknown $boolOrList parameter %s. Please report at https://github.com/composer/composer/issues/new.', \gettype($boolOrList))); } public static function ignoreAll() : \Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface { return new \Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter(); } public static function ignoreNothing() : \Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface { return new \Composer\Filter\PlatformRequirementFilter\IgnoreNothingPlatformRequirementFilter(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; /** * Package Events. * * @author Jordi Boggiano */ class PackageEvents { /** * The PRE_PACKAGE_INSTALL event occurs before a package is installed. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ public const PRE_PACKAGE_INSTALL = 'pre-package-install'; /** * The POST_PACKAGE_INSTALL event occurs after a package is installed. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ public const POST_PACKAGE_INSTALL = 'post-package-install'; /** * The PRE_PACKAGE_UPDATE event occurs before a package is updated. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ public const PRE_PACKAGE_UPDATE = 'pre-package-update'; /** * The POST_PACKAGE_UPDATE event occurs after a package is updated. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ public const POST_PACKAGE_UPDATE = 'post-package-update'; /** * The PRE_PACKAGE_UNINSTALL event occurs before a package has been uninstalled. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ public const PRE_PACKAGE_UNINSTALL = 'pre-package-uninstall'; /** * The POST_PACKAGE_UNINSTALL event occurs after a package has been uninstalled. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ public const POST_PACKAGE_UNINSTALL = 'post-package-uninstall'; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Silencer; /** * Utility to handle installation of package "bin"/binaries * * @author Jordi Boggiano * @author Konstantin Kudryashov * @author Helmut Hummel */ class BinaryInstaller { /** @var string */ protected $binDir; /** @var string */ protected $binCompat; /** @var IOInterface */ protected $io; /** @var Filesystem */ protected $filesystem; /** @var string|null */ private $vendorDir; /** * @param Filesystem $filesystem */ public function __construct(IOInterface $io, string $binDir, string $binCompat, ?Filesystem $filesystem = null, ?string $vendorDir = null) { $this->binDir = $binDir; $this->binCompat = $binCompat; $this->io = $io; $this->filesystem = $filesystem ?: new Filesystem(); $this->vendorDir = $vendorDir; } public function installBinaries(PackageInterface $package, string $installPath, bool $warnOnOverwrite = \true) : void { $binaries = $this->getBinaries($package); if (!$binaries) { return; } Platform::workaroundFilesystemIssues(); foreach ($binaries as $bin) { $binPath = $installPath . '/' . $bin; if (!\file_exists($binPath)) { $this->io->writeError(' Skipped installation of bin ' . $bin . ' for package ' . $package->getName() . ': file not found in package'); continue; } if (\is_dir($binPath)) { $this->io->writeError(' Skipped installation of bin ' . $bin . ' for package ' . $package->getName() . ': found a directory at that path'); continue; } if (!$this->filesystem->isAbsolutePath($binPath)) { // in case a custom installer returned a relative path for the // $package, we can now safely turn it into a absolute path (as we // already checked the binary's existence). The following helpers // will require absolute paths to work properly. $binPath = \realpath($binPath); } $this->initializeBinDir(); $link = $this->binDir . '/' . \basename($bin); if (\file_exists($link)) { if (!\is_link($link)) { if ($warnOnOverwrite) { $this->io->writeError(' Skipped installation of bin ' . $bin . ' for package ' . $package->getName() . ': name conflicts with an existing file'); } continue; } if (\realpath($link) === \realpath($binPath)) { // It is a linked binary from a previous installation, which can be replaced with a proxy file $this->filesystem->unlink($link); } } $binCompat = $this->binCompat; if ($binCompat === "auto" && (Platform::isWindows() || Platform::isWindowsSubsystemForLinux())) { $binCompat = 'full'; } if ($binCompat === "full") { $this->installFullBinaries($binPath, $link, $bin, $package); } else { $this->installUnixyProxyBinaries($binPath, $link); } Silencer::call('chmod', $binPath, 0777 & ~\umask()); } } public function removeBinaries(PackageInterface $package) : void { $this->initializeBinDir(); $binaries = $this->getBinaries($package); if (!$binaries) { return; } foreach ($binaries as $bin) { $link = $this->binDir . '/' . \basename($bin); if (\is_link($link) || \file_exists($link)) { // still checking for symlinks here for legacy support $this->filesystem->unlink($link); } if (\is_file($link . '.bat')) { $this->filesystem->unlink($link . '.bat'); } } // attempt removing the bin dir in case it is left empty if (\is_dir($this->binDir) && $this->filesystem->isDirEmpty($this->binDir)) { Silencer::call('rmdir', $this->binDir); } } public static function determineBinaryCaller(string $bin) : string { if ('.bat' === \substr($bin, -4) || '.exe' === \substr($bin, -4)) { return 'call'; } $handle = \fopen($bin, 'r'); $line = \fgets($handle); \fclose($handle); if (Preg::isMatchStrictGroups('{^#!/(?:usr/bin/env )?(?:[^/]+/)*(.+)$}m', (string) $line, $match)) { return \trim($match[1]); } return 'php'; } /** * @return string[] */ protected function getBinaries(PackageInterface $package) : array { return $package->getBinaries(); } protected function installFullBinaries(string $binPath, string $link, string $bin, PackageInterface $package) : void { // add unixy support for cygwin and similar environments if ('.bat' !== \substr($binPath, -4)) { $this->installUnixyProxyBinaries($binPath, $link); $link .= '.bat'; if (\file_exists($link)) { $this->io->writeError(' Skipped installation of bin ' . $bin . '.bat proxy for package ' . $package->getName() . ': a .bat proxy was already installed'); } } if (!\file_exists($link)) { \file_put_contents($link, $this->generateWindowsProxyCode($binPath, $link)); Silencer::call('chmod', $link, 0777 & ~\umask()); } } protected function installUnixyProxyBinaries(string $binPath, string $link) : void { \file_put_contents($link, $this->generateUnixyProxyCode($binPath, $link)); Silencer::call('chmod', $link, 0777 & ~\umask()); } protected function initializeBinDir() : void { $this->filesystem->ensureDirectoryExists($this->binDir); $this->binDir = \realpath($this->binDir); } protected function generateWindowsProxyCode(string $bin, string $link) : string { $binPath = $this->filesystem->findShortestPath($link, $bin); $caller = self::determineBinaryCaller($bin); // if the target is a php file, we run the unixy proxy file // to ensure that _composer_autoload_path gets defined, instead // of running the binary directly if ($caller === 'php') { return "@ECHO OFF\r\n" . "setlocal DISABLEDELAYEDEXPANSION\r\n" . "SET BIN_TARGET=%~dp0/" . \trim(ProcessExecutor::escape(\basename($link, '.bat')), '"\'') . "\r\n" . "SET COMPOSER_RUNTIME_BIN_DIR=%~dp0\r\n" . "{$caller} \"%BIN_TARGET%\" %*\r\n"; } return "@ECHO OFF\r\n" . "setlocal DISABLEDELAYEDEXPANSION\r\n" . "SET BIN_TARGET=%~dp0/" . \trim(ProcessExecutor::escape($binPath), '"\'') . "\r\n" . "SET COMPOSER_RUNTIME_BIN_DIR=%~dp0\r\n" . "{$caller} \"%BIN_TARGET%\" %*\r\n"; } protected function generateUnixyProxyCode(string $bin, string $link) : string { $binPath = $this->filesystem->findShortestPath($link, $bin); $binDir = ProcessExecutor::escape(\dirname($binPath)); $binFile = \basename($binPath); $binContents = (string) \file_get_contents($bin, \false, null, 0, 500); // For php files, we generate a PHP proxy instead of a shell one, // which allows calling the proxy with a custom php process if (Preg::isMatch('{^(#!.*\\r?\\n)?[\\r\\n\\t ]*<\\?php}', $binContents, $match)) { // carry over the existing shebang if present, otherwise add our own $proxyCode = $match[1] === null ? '#!/usr/bin/env php' : \trim($match[1]); $binPathExported = $this->filesystem->findShortestPathCode($link, $bin, \false, \true); $streamProxyCode = $streamHint = ''; $globalsCode = '$GLOBALS[\'_composer_bin_dir\'] = __DIR__;' . "\n"; $phpunitHack1 = $phpunitHack2 = ''; // Don't expose autoload path when vendor dir was not set in custom installers if ($this->vendorDir !== null) { // ensure comparisons work accurately if the CWD is a symlink, as $link is realpath'd already $vendorDirReal = \realpath($this->vendorDir); if ($vendorDirReal === \false) { $vendorDirReal = $this->vendorDir; } $globalsCode .= '$GLOBALS[\'_composer_autoload_path\'] = ' . $this->filesystem->findShortestPathCode($link, $vendorDirReal . '/autoload.php', \false, \true) . ";\n"; } // Add workaround for PHPUnit process isolation if ($this->filesystem->normalizePath($bin) === $this->filesystem->normalizePath($this->vendorDir . '/phpunit/phpunit/phpunit')) { // workaround issue on PHPUnit 6.5+ running on PHP 8+ $globalsCode .= '$GLOBALS[\'__PHPUNIT_ISOLATION_EXCLUDE_LIST\'] = $GLOBALS[\'__PHPUNIT_ISOLATION_BLACKLIST\'] = array(realpath(' . $binPathExported . '));' . "\n"; // workaround issue on all PHPUnit versions running on PHP <8 $phpunitHack1 = "'phpvfscomposer://'."; $phpunitHack2 = ' $data = str_replace(\'__DIR__\', var_export(dirname($this->realpath), true), $data); $data = str_replace(\'__FILE__\', var_export($this->realpath, true), $data);'; } if (\trim($match[0]) !== 'realpath = realpath(\$opened_path) ?: \$opened_path; \$opened_path = {$phpunitHack1}\$this->realpath; \$this->handle = fopen(\$this->realpath, \$mode); \$this->position = 0; return (bool) \$this->handle; } public function stream_read(\$count) { \$data = fread(\$this->handle, \$count); if (\$this->position === 0) { \$data = preg_replace('{^#!.*\\r?\\n}', '', \$data); }{$phpunitHack2} \$this->position += strlen(\$data); return \$data; } public function stream_cast(\$castAs) { return \$this->handle; } public function stream_close() { fclose(\$this->handle); } public function stream_lock(\$operation) { return \$operation ? flock(\$this->handle, \$operation) : true; } public function stream_seek(\$offset, \$whence) { if (0 === fseek(\$this->handle, \$offset, \$whence)) { \$this->position = ftell(\$this->handle); return true; } return false; } public function stream_tell() { return \$this->position; } public function stream_eof() { return feof(\$this->handle); } public function stream_stat() { return array(); } public function stream_set_option(\$option, \$arg1, \$arg2) { return true; } public function url_stat(\$path, \$flags) { \$path = substr(\$path, 17); if (file_exists(\$path)) { return stat(\$path); } return false; } } } if ( (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\\BinProxyWrapper')) ) { return include("phpvfscomposer://" . {$binPathExported}); } } STREAMPROXY; } return $proxyCode . "\n" . << /dev/null) if [ -z "\$self" ]; then self="\$selfArg" fi dir=\$(cd "\${self%[/\\\\]*}" > /dev/null; cd {$binDir} && pwd) if [ -d /proc/cygdrive ]; then case \$(which php) in \$(readlink -n /proc/cygdrive)/*) # We are in Cygwin using Windows php, so the path must be translated dir=\$(cygpath -m "\$dir"); ;; esac fi export COMPOSER_RUNTIME_BIN_DIR="\$(cd "\${self%[/\\\\]*}" > /dev/null; pwd)" # If bash is sourcing this file, we have to source the target as well bashSource="\$BASH_SOURCE" if [ -n "\$bashSource" ]; then if [ "\$bashSource" != "\$0" ]; then source "\${dir}/{$binFile}" "\$@" return fi fi exec "\${dir}/{$binFile}" "\$@" PROXY; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\IO\IOInterface; use Composer\PartialComposer; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; use Composer\Plugin\PluginManager; use Composer\Util\Filesystem; use Composer\Util\Platform; use React\Promise\PromiseInterface; /** * Installer for plugin packages * * @author Jordi Boggiano * @author Nils Adermann */ class PluginInstaller extends \Composer\Installer\LibraryInstaller { public function __construct(IOInterface $io, PartialComposer $composer, ?Filesystem $fs = null, ?\Composer\Installer\BinaryInstaller $binaryInstaller = null) { parent::__construct($io, $composer, 'composer-plugin', $fs, $binaryInstaller); } /** * @inheritDoc */ public function supports(string $packageType) { return $packageType === 'composer-plugin' || $packageType === 'composer-installer'; } public function disablePlugins() : void { $this->getPluginManager()->disablePlugins(); } /** * @inheritDoc */ public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { // fail install process early if it is going to fail due to a plugin not being allowed if (($type === 'install' || $type === 'update') && !$this->getPluginManager()->arePluginsDisabled('local')) { $this->getPluginManager()->isPluginAllowed($package->getName(), \false, \true === ($package->getExtra()['plugin-optional'] ?? \false)); } return parent::prepare($type, $package, $prevPackage); } /** * @inheritDoc */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { $extra = $package->getExtra(); if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing ' . $package->getPrettyName() . ', composer-plugin packages should have a class defined in their extra key to be usable.'); } return parent::download($package, $prevPackage); } /** * @inheritDoc */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $promise = parent::install($repo, $package); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } return $promise->then(function () use($package, $repo) : void { try { Platform::workaroundFilesystemIssues(); $this->getPluginManager()->registerPackage($package, \true); } catch (\Exception $e) { $this->rollbackInstall($e, $repo, $package); } }); } /** * @inheritDoc */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { $promise = parent::update($repo, $initial, $target); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } return $promise->then(function () use($initial, $target, $repo) : void { try { Platform::workaroundFilesystemIssues(); $this->getPluginManager()->deactivatePackage($initial); $this->getPluginManager()->registerPackage($target, \true); } catch (\Exception $e) { $this->rollbackInstall($e, $repo, $target); } }); } public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { $this->getPluginManager()->uninstallPackage($package); return parent::uninstall($repo, $package); } private function rollbackInstall(\Exception $e, InstalledRepositoryInterface $repo, PackageInterface $package) : void { $this->io->writeError('Plugin initialization failed (' . $e->getMessage() . '), uninstalling plugin'); parent::uninstall($repo, $package); throw $e; } protected function getPluginManager() : PluginManager { \assert($this->composer instanceof Composer, new \LogicException(self::class . ' should be initialized with a fully loaded Composer instance.')); $pluginManager = $this->composer->getPluginManager(); return $pluginManager; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Package\PackageInterface; /** * Interface for the package installation manager that handle binary installation. * * @author Jordi Boggiano */ interface BinaryPresenceInterface { /** * Make sure binaries are installed for a given package. * * @param PackageInterface $package package instance * * @return void */ public function ensureBinariesPresence(PackageInterface $package); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; class InstallerEvents { /** * The PRE_OPERATIONS_EXEC event occurs before the lock file gets * installed and operations are executed. * * The event listener method receives an Composer\Installer\InstallerEvent instance. * * @var string */ public const PRE_OPERATIONS_EXEC = 'pre-operations-exec'; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\IO\IOInterface; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\Repository\RepositoryInterface; use Composer\EventDispatcher\Event; /** * The Package Event. * * @author Jordi Boggiano */ class PackageEvent extends Event { /** * @var Composer */ private $composer; /** * @var IOInterface */ private $io; /** * @var bool */ private $devMode; /** * @var RepositoryInterface */ private $localRepo; /** * @var OperationInterface[] */ private $operations; /** * @var OperationInterface The operation instance which is being executed */ private $operation; /** * Constructor. * * @param OperationInterface[] $operations */ public function __construct(string $eventName, Composer $composer, IOInterface $io, bool $devMode, RepositoryInterface $localRepo, array $operations, OperationInterface $operation) { parent::__construct($eventName); $this->composer = $composer; $this->io = $io; $this->devMode = $devMode; $this->localRepo = $localRepo; $this->operations = $operations; $this->operation = $operation; } public function getComposer() : Composer { return $this->composer; } public function getIO() : IOInterface { return $this->io; } public function isDevMode() : bool { return $this->devMode; } public function getLocalRepo() : RepositoryInterface { return $this->localRepo; } /** * @return OperationInterface[] */ public function getOperations() : array { return $this->operations; } /** * Returns the package instance. */ public function getOperation() : OperationInterface { return $this->operation; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\DependencyResolver\Transaction; use Composer\EventDispatcher\Event; use Composer\IO\IOInterface; class InstallerEvent extends Event { /** * @var Composer */ private $composer; /** * @var IOInterface */ private $io; /** * @var bool */ private $devMode; /** * @var bool */ private $executeOperations; /** * @var Transaction */ private $transaction; /** * Constructor. */ public function __construct(string $eventName, Composer $composer, IOInterface $io, bool $devMode, bool $executeOperations, Transaction $transaction) { parent::__construct($eventName); $this->composer = $composer; $this->io = $io; $this->devMode = $devMode; $this->executeOperations = $executeOperations; $this->transaction = $transaction; } public function getComposer() : Composer { return $this->composer; } public function getIO() : IOInterface { return $this->io; } public function isDevMode() : bool { return $this->devMode; } public function isExecutingOperations() : bool { return $this->executeOperations; } public function getTransaction() : ?Transaction { return $this->transaction; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\IO\IOInterface; use Composer\PartialComposer; use Composer\Pcre\Preg; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Composer\Util\Silencer; use Composer\Util\Platform; use React\Promise\PromiseInterface; use Composer\Downloader\DownloadManager; /** * Package installation manager. * * @author Jordi Boggiano * @author Konstantin Kudryashov */ class LibraryInstaller implements \Composer\Installer\InstallerInterface, \Composer\Installer\BinaryPresenceInterface { /** @var PartialComposer */ protected $composer; /** @var string */ protected $vendorDir; /** @var DownloadManager|null */ protected $downloadManager; /** @var IOInterface */ protected $io; /** @var string */ protected $type; /** @var Filesystem */ protected $filesystem; /** @var BinaryInstaller */ protected $binaryInstaller; /** * Initializes library installer. * * @param Filesystem $filesystem * @param BinaryInstaller $binaryInstaller */ public function __construct(IOInterface $io, PartialComposer $composer, ?string $type = 'library', ?Filesystem $filesystem = null, ?\Composer\Installer\BinaryInstaller $binaryInstaller = null) { $this->composer = $composer; $this->downloadManager = $composer instanceof Composer ? $composer->getDownloadManager() : null; $this->io = $io; $this->type = $type; $this->filesystem = $filesystem ?: new Filesystem(); $this->vendorDir = \rtrim($composer->getConfig()->get('vendor-dir'), '/'); $this->binaryInstaller = $binaryInstaller ?: new \Composer\Installer\BinaryInstaller($this->io, \rtrim($composer->getConfig()->get('bin-dir'), '/'), $composer->getConfig()->get('bin-compat'), $this->filesystem, $this->vendorDir); } /** * @inheritDoc */ public function supports(string $packageType) { return $packageType === $this->type || null === $this->type; } /** * @inheritDoc */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { return \false; } $installPath = $this->getInstallPath($package); if (Filesystem::isReadable($installPath)) { return \true; } if (Platform::isWindows() && $this->filesystem->isJunction($installPath)) { return \true; } if (\is_link($installPath)) { if (\realpath($installPath) === \false) { return \false; } return \true; } return \false; } /** * @inheritDoc */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); return $this->getDownloadManager()->download($package, $downloadPath, $prevPackage); } /** * @inheritDoc */ public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); return $this->getDownloadManager()->prepare($type, $package, $downloadPath, $prevPackage); } /** * @inheritDoc */ public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); return $this->getDownloadManager()->cleanup($type, $package, $downloadPath, $prevPackage); } /** * @inheritDoc */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); // remove the binaries if it appears the package files are missing if (!Filesystem::isReadable($downloadPath) && $repo->hasPackage($package)) { $this->binaryInstaller->removeBinaries($package); } $promise = $this->installCode($package); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } $binaryInstaller = $this->binaryInstaller; $installPath = $this->getInstallPath($package); return $promise->then(static function () use($binaryInstaller, $installPath, $package, $repo) : void { $binaryInstaller->installBinaries($package, $installPath); if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); } }); } /** * @inheritDoc */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { if (!$repo->hasPackage($initial)) { throw new \InvalidArgumentException('Package is not installed: ' . $initial); } $this->initializeVendorDir(); $this->binaryInstaller->removeBinaries($initial); $promise = $this->updateCode($initial, $target); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } $binaryInstaller = $this->binaryInstaller; $installPath = $this->getInstallPath($target); return $promise->then(static function () use($binaryInstaller, $installPath, $target, $initial, $repo) : void { $binaryInstaller->installBinaries($target, $installPath); $repo->removePackage($initial); if (!$repo->hasPackage($target)) { $repo->addPackage(clone $target); } }); } /** * @inheritDoc */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { throw new \InvalidArgumentException('Package is not installed: ' . $package); } $promise = $this->removeCode($package); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } $binaryInstaller = $this->binaryInstaller; $downloadPath = $this->getPackageBasePath($package); $filesystem = $this->filesystem; return $promise->then(static function () use($binaryInstaller, $filesystem, $downloadPath, $package, $repo) : void { $binaryInstaller->removeBinaries($package); $repo->removePackage($package); if (\strpos($package->getName(), '/')) { $packageVendorDir = \dirname($downloadPath); if (\is_dir($packageVendorDir) && $filesystem->isDirEmpty($packageVendorDir)) { Silencer::call('rmdir', $packageVendorDir); } } }); } /** * @inheritDoc * * @return string */ public function getInstallPath(PackageInterface $package) { $this->initializeVendorDir(); $basePath = ($this->vendorDir ? $this->vendorDir . '/' : '') . $package->getPrettyName(); $targetDir = $package->getTargetDir(); return $basePath . ($targetDir ? '/' . $targetDir : ''); } /** * Make sure binaries are installed for a given package. * * @param PackageInterface $package Package instance */ public function ensureBinariesPresence(PackageInterface $package) { $this->binaryInstaller->installBinaries($package, $this->getInstallPath($package), \false); } /** * Returns the base path of the package without target-dir path * * It is used for BC as getInstallPath tends to be overridden by * installer plugins but not getPackageBasePath * * @return string */ protected function getPackageBasePath(PackageInterface $package) { $installPath = $this->getInstallPath($package); $targetDir = $package->getTargetDir(); if ($targetDir) { return Preg::replace('{/*' . \str_replace('/', '/+', \preg_quote($targetDir)) . '/?$}', '', $installPath); } return $installPath; } /** * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ protected function installCode(PackageInterface $package) { $downloadPath = $this->getInstallPath($package); return $this->getDownloadManager()->install($package, $downloadPath); } /** * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ protected function updateCode(PackageInterface $initial, PackageInterface $target) { $initialDownloadPath = $this->getInstallPath($initial); $targetDownloadPath = $this->getInstallPath($target); if ($targetDownloadPath !== $initialDownloadPath) { // if the target and initial dirs intersect, we force a remove + install // to avoid the rename wiping the target dir as part of the initial dir cleanup if (\strpos($initialDownloadPath, $targetDownloadPath) === 0 || \strpos($targetDownloadPath, $initialDownloadPath) === 0) { $promise = $this->removeCode($initial); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } return $promise->then(function () use($target) : PromiseInterface { $promise = $this->installCode($target); if ($promise instanceof PromiseInterface) { return $promise; } return \React\Promise\resolve(null); }); } $this->filesystem->rename($initialDownloadPath, $targetDownloadPath); } return $this->getDownloadManager()->update($initial, $target, $targetDownloadPath); } /** * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ protected function removeCode(PackageInterface $package) { $downloadPath = $this->getPackageBasePath($package); return $this->getDownloadManager()->remove($package, $downloadPath); } /** * @return void */ protected function initializeVendorDir() { $this->filesystem->ensureDirectoryExists($this->vendorDir); $this->vendorDir = \realpath($this->vendorDir); } protected function getDownloadManager() : DownloadManager { \assert($this->downloadManager instanceof DownloadManager, new \LogicException(self::class . ' should be initialized with a fully loaded Composer instance to be able to install/... packages')); return $this->downloadManager; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepositoryInterface; use InvalidArgumentException; use React\Promise\PromiseInterface; /** * Interface for the package installation manager. * * @author Konstantin Kudryashov * @author Jordi Boggiano */ interface InstallerInterface { /** * Decides if the installer supports the given type * * @return bool */ public function supports(string $packageType); /** * Checks that provided package is installed. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * * @return bool */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package); /** * Downloads the files needed to later install the given package. * * @param PackageInterface $package package instance * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Do anything that needs to be done between all downloads have been completed and the actual operation is executed * * All packages get first downloaded, then all together prepared, then all together installed/updated/uninstalled. Therefore * for error recovery it is important to avoid failing during install/update/uninstall as much as possible, and risky things or * user prompts should happen in the prepare step rather. In case of failure, cleanup() will be called so that changes can * be undone as much as possible. * * @param string $type one of install/update/uninstall * @param PackageInterface $package package instance * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ public function prepare(string $type, PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Installs specific package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package); /** * Updates specific package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $initial already installed package version * @param PackageInterface $target updated version * @throws InvalidArgumentException if $initial package is not installed * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target); /** * Uninstalls specific package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package); /** * Do anything to cleanup changes applied in the prepare or install/update/uninstall steps * * Note that cleanup will be called for all packages regardless if they failed an operation or not, to give * all installers a change to cleanup things they did previously, so you need to keep track of changes * applied in the installer/downloader themselves. * * @param string $type one of install/update/uninstall * @param PackageInterface $package package instance * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null * @phpstan-return PromiseInterface|null */ public function cleanup(string $type, PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Returns the absolute installation path of a package. * * @return string|null absolute path to install to, which MUST not end with a slash, or null if the package does not have anything installed on disk */ public function getInstallPath(PackageInterface $package); } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; use Composer\IO\IOInterface; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; /** * Metapackage installation manager. * * @author Martin Hasoň */ class MetapackageInstaller implements \Composer\Installer\InstallerInterface { /** @var IOInterface */ private $io; public function __construct(IOInterface $io) { $this->io = $io; } /** * @inheritDoc */ public function supports(string $packageType) { return $packageType === 'metapackage'; } /** * @inheritDoc */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { return $repo->hasPackage($package); } /** * @inheritDoc */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { // noop return \React\Promise\resolve(null); } /** * @inheritDoc */ public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { // noop return \React\Promise\resolve(null); } /** * @inheritDoc */ public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { // noop return \React\Promise\resolve(null); } /** * @inheritDoc */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $this->io->writeError(" - " . InstallOperation::format($package)); $repo->addPackage(clone $package); return \React\Promise\resolve(null); } /** * @inheritDoc */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { if (!$repo->hasPackage($initial)) { throw new \InvalidArgumentException('Package is not installed: ' . $initial); } $this->io->writeError(" - " . UpdateOperation::format($initial, $target)); $repo->removePackage($initial); $repo->addPackage(clone $target); return \React\Promise\resolve(null); } /** * @inheritDoc */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { throw new \InvalidArgumentException('Package is not installed: ' . $package); } $this->io->writeError(" - " . UninstallOperation::format($package)); $repo->removePackage($package); return \React\Promise\resolve(null); } /** * @inheritDoc * * @return null */ public function getInstallPath(PackageInterface $package) { return null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use React\Promise\PromiseInterface; use Composer\Package\PackageInterface; use Composer\Downloader\DownloadManager; use Composer\Repository\InstalledRepositoryInterface; use Composer\Util\Filesystem; /** * Project Installer is used to install a single package into a directory as * root project. * * @author Benjamin Eberlei */ class ProjectInstaller implements \Composer\Installer\InstallerInterface { /** @var string */ private $installPath; /** @var DownloadManager */ private $downloadManager; /** @var Filesystem */ private $filesystem; public function __construct(string $installPath, DownloadManager $dm, Filesystem $fs) { $this->installPath = \rtrim(\strtr($installPath, '\\', '/'), '/') . '/'; $this->downloadManager = $dm; $this->filesystem = $fs; } /** * Decides if the installer supports the given type */ public function supports(string $packageType) : bool { return \true; } /** * @inheritDoc */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) : bool { return \false; } /** * @inheritDoc */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) : ?PromiseInterface { $installPath = $this->installPath; if (\file_exists($installPath) && !$this->filesystem->isDirEmpty($installPath)) { throw new \InvalidArgumentException("Project directory {$installPath} is not empty."); } if (!\is_dir($installPath)) { \mkdir($installPath, 0777, \true); } return $this->downloadManager->download($package, $installPath, $prevPackage); } /** * @inheritDoc */ public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) : ?PromiseInterface { return $this->downloadManager->prepare($type, $package, $this->installPath, $prevPackage); } /** * @inheritDoc */ public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) : ?PromiseInterface { return $this->downloadManager->cleanup($type, $package, $this->installPath, $prevPackage); } /** * @inheritDoc */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) : ?PromiseInterface { return $this->downloadManager->install($package, $this->installPath); } /** * @inheritDoc */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) : ?PromiseInterface { throw new \InvalidArgumentException("not supported"); } /** * @inheritDoc */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) : ?PromiseInterface { throw new \InvalidArgumentException("not supported"); } /** * Returns the installation path of a package * * @return string configured install path */ public function getInstallPath(PackageInterface $package) : string { return $this->installPath; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Pcre\Preg; use Composer\Repository\InstalledRepository; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; /** * Add suggested packages from different places to output them in the end. * * @author Haralan Dobrev */ class SuggestedPackagesReporter { public const MODE_LIST = 1; public const MODE_BY_PACKAGE = 2; public const MODE_BY_SUGGESTION = 4; /** * @var array */ protected $suggestedPackages = []; /** * @var IOInterface */ private $io; public function __construct(IOInterface $io) { $this->io = $io; } /** * @return array Suggested packages with source, target and reason keys. */ public function getPackages() : array { return $this->suggestedPackages; } /** * Add suggested packages to be listed after install * * Could be used to add suggested packages both from the installer * or from CreateProjectCommand. * * @param string $source Source package which made the suggestion * @param string $target Target package to be suggested * @param string $reason Reason the target package to be suggested */ public function addPackage(string $source, string $target, string $reason) : \Composer\Installer\SuggestedPackagesReporter { $this->suggestedPackages[] = ['source' => $source, 'target' => $target, 'reason' => $reason]; return $this; } /** * Add all suggestions from a package. */ public function addSuggestionsFromPackage(PackageInterface $package) : \Composer\Installer\SuggestedPackagesReporter { $source = $package->getPrettyName(); foreach ($package->getSuggests() as $target => $reason) { $this->addPackage($source, $target, $reason); } return $this; } /** * Output suggested packages. * * Do not list the ones already installed if installed repository provided. * * @param int $mode One of the MODE_* constants from this class * @param InstalledRepository|null $installedRepo If passed in, suggested packages which are installed already will be skipped * @param PackageInterface|null $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package, or from the package itself, will be shown */ public function output(int $mode, ?InstalledRepository $installedRepo = null, ?PackageInterface $onlyDependentsOf = null) : void { $suggestedPackages = $this->getFilteredSuggestions($installedRepo, $onlyDependentsOf); $suggesters = []; $suggested = []; foreach ($suggestedPackages as $suggestion) { $suggesters[$suggestion['source']][$suggestion['target']] = $suggestion['reason']; $suggested[$suggestion['target']][$suggestion['source']] = $suggestion['reason']; } \ksort($suggesters); \ksort($suggested); // Simple mode if ($mode & self::MODE_LIST) { foreach (\array_keys($suggested) as $name) { $this->io->write(\sprintf('%s', $name)); } return; } // Grouped by package if ($mode & self::MODE_BY_PACKAGE) { foreach ($suggesters as $suggester => $suggestions) { $this->io->write(\sprintf('%s suggests:', $suggester)); foreach ($suggestions as $suggestion => $reason) { $this->io->write(\sprintf(' - %s' . ($reason ? ': %s' : ''), $suggestion, $this->escapeOutput($reason))); } $this->io->write(''); } } // Grouped by suggestion if ($mode & self::MODE_BY_SUGGESTION) { // Improve readability in full mode if ($mode & self::MODE_BY_PACKAGE) { $this->io->write(\str_repeat('-', 78)); } foreach ($suggested as $suggestion => $suggesters) { $this->io->write(\sprintf('%s is suggested by:', $suggestion)); foreach ($suggesters as $suggester => $reason) { $this->io->write(\sprintf(' - %s' . ($reason ? ': %s' : ''), $suggester, $this->escapeOutput($reason))); } $this->io->write(''); } } if ($onlyDependentsOf) { $allSuggestedPackages = $this->getFilteredSuggestions($installedRepo); $diff = \count($allSuggestedPackages) - \count($suggestedPackages); if ($diff) { $this->io->write('' . $diff . ' additional suggestions by transitive dependencies can be shown with --all'); } } } /** * Output number of new suggested packages and a hint to use suggest command. * * @param InstalledRepository|null $installedRepo If passed in, suggested packages which are installed already will be skipped * @param PackageInterface|null $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package, or from the package itself, will be shown */ public function outputMinimalistic(?InstalledRepository $installedRepo = null, ?PackageInterface $onlyDependentsOf = null) : void { $suggestedPackages = $this->getFilteredSuggestions($installedRepo, $onlyDependentsOf); if ($suggestedPackages) { $this->io->writeError('' . \count($suggestedPackages) . ' package suggestions were added by new dependencies, use `composer suggest` to see details.'); } } /** * @param InstalledRepository|null $installedRepo If passed in, suggested packages which are installed already will be skipped * @param PackageInterface|null $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package, or from the package itself, will be shown * @return mixed[] */ private function getFilteredSuggestions(?InstalledRepository $installedRepo = null, ?PackageInterface $onlyDependentsOf = null) : array { $suggestedPackages = $this->getPackages(); $installedNames = []; if (null !== $installedRepo && !empty($suggestedPackages)) { foreach ($installedRepo->getPackages() as $package) { $installedNames = \array_merge($installedNames, $package->getNames()); } } $sourceFilter = []; if ($onlyDependentsOf) { $sourceFilter = \array_map(static function ($link) : string { return $link->getTarget(); }, \array_merge($onlyDependentsOf->getRequires(), $onlyDependentsOf->getDevRequires())); $sourceFilter[] = $onlyDependentsOf->getName(); } $suggestions = []; foreach ($suggestedPackages as $suggestion) { if (\in_array($suggestion['target'], $installedNames) || $sourceFilter && !\in_array($suggestion['source'], $sourceFilter)) { continue; } $suggestions[] = $suggestion; } return $suggestions; } private function escapeOutput(string $string) : string { return OutputFormatter::escape($this->removeControlCharacters($string)); } private function removeControlCharacters(string $string) : string { return Preg::replace('/[[:cntrl:]]/', '', \str_replace("\n", ' ', $string)); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\IO\ConsoleIO; use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Repository\InstalledRepositoryInterface; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\UninstallOperation; use Composer\DependencyResolver\Operation\MarkAliasInstalledOperation; use Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation; use Composer\Downloader\FileDownloader; use Composer\EventDispatcher\EventDispatcher; use Composer\Util\Loop; use Composer\Util\Platform; use React\Promise\PromiseInterface; use _ContaoManager\Seld\Signal\SignalHandler; /** * Package operation manager. * * @author Konstantin Kudryashov * @author Jordi Boggiano * @author Nils Adermann */ class InstallationManager { /** @var list */ private $installers = []; /** @var array */ private $cache = []; /** @var array> */ private $notifiablePackages = []; /** @var Loop */ private $loop; /** @var IOInterface */ private $io; /** @var ?EventDispatcher */ private $eventDispatcher; /** @var bool */ private $outputProgress; public function __construct(Loop $loop, IOInterface $io, ?EventDispatcher $eventDispatcher = null) { $this->loop = $loop; $this->io = $io; $this->eventDispatcher = $eventDispatcher; } public function reset() : void { $this->notifiablePackages = []; FileDownloader::$downloadMetadata = []; } /** * Adds installer * * @param InstallerInterface $installer installer instance */ public function addInstaller(\Composer\Installer\InstallerInterface $installer) : void { \array_unshift($this->installers, $installer); $this->cache = []; } /** * Removes installer * * @param InstallerInterface $installer installer instance */ public function removeInstaller(\Composer\Installer\InstallerInterface $installer) : void { if (\false !== ($key = \array_search($installer, $this->installers, \true))) { \array_splice($this->installers, $key, 1); $this->cache = []; } } /** * Disables plugins. * * We prevent any plugins from being instantiated by * disabling the PluginManager. This ensures that no third-party * code is ever executed. */ public function disablePlugins() : void { foreach ($this->installers as $i => $installer) { if (!$installer instanceof \Composer\Installer\PluginInstaller) { continue; } $installer->disablePlugins(); } } /** * Returns installer for a specific package type. * * @param string $type package type * * @throws \InvalidArgumentException if installer for provided type is not registered */ public function getInstaller(string $type) : \Composer\Installer\InstallerInterface { $type = \strtolower($type); if (isset($this->cache[$type])) { return $this->cache[$type]; } foreach ($this->installers as $installer) { if ($installer->supports($type)) { return $this->cache[$type] = $installer; } } throw new \InvalidArgumentException('Unknown installer type: ' . $type); } /** * Checks whether provided package is installed in one of the registered installers. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance */ public function isPackageInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) : bool { if ($package instanceof AliasPackage) { return $repo->hasPackage($package) && $this->isPackageInstalled($repo, $package->getAliasOf()); } return $this->getInstaller($package->getType())->isInstalled($repo, $package); } /** * Install binary for the given package. * If the installer associated to this package doesn't handle that function, it'll do nothing. * * @param PackageInterface $package Package instance */ public function ensureBinariesPresence(PackageInterface $package) : void { try { $installer = $this->getInstaller($package->getType()); } catch (\InvalidArgumentException $e) { // no installer found for the current package type (@see `getInstaller()`) return; } // if the given installer support installing binaries if ($installer instanceof \Composer\Installer\BinaryPresenceInterface) { $installer->ensureBinariesPresence($package); } } /** * Executes solver operation. * * @param InstalledRepositoryInterface $repo repository in which to add/remove/update packages * @param OperationInterface[] $operations operations to execute * @param bool $devMode whether the install is being run in dev mode * @param bool $runScripts whether to dispatch script events * @param bool $downloadOnly whether to only download packages */ public function execute(InstalledRepositoryInterface $repo, array $operations, bool $devMode = \true, bool $runScripts = \true, bool $downloadOnly = \false) : void { /** @var array> $cleanupPromises */ $cleanupPromises = []; $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) use(&$cleanupPromises) { $this->io->writeError('Received ' . $signal . ', aborting', \true, IOInterface::DEBUG); $this->runCleanup($cleanupPromises); $handler->exitWithLastSignal(); }); try { // execute operations in batches to make sure download-modifying-plugins are installed // before the other packages get downloaded $batches = []; $batch = []; foreach ($operations as $index => $operation) { if ($operation instanceof UpdateOperation || $operation instanceof InstallOperation) { $package = $operation instanceof UpdateOperation ? $operation->getTargetPackage() : $operation->getPackage(); if ($package->getType() === 'composer-plugin') { $extra = $package->getExtra(); if (isset($extra['plugin-modifies-downloads']) && $extra['plugin-modifies-downloads'] === \true) { if (\count($batch) > 0) { $batches[] = $batch; } $batches[] = [$index => $operation]; $batch = []; continue; } } } $batch[$index] = $operation; } if (\count($batch) > 0) { $batches[] = $batch; } foreach ($batches as $batchToExecute) { $this->downloadAndExecuteBatch($repo, $batchToExecute, $cleanupPromises, $devMode, $runScripts, $downloadOnly, $operations); } } catch (\Exception $e) { $this->runCleanup($cleanupPromises); throw $e; } finally { $signalHandler->unregister(); } if ($downloadOnly) { return; } // do a last write so that we write the repository even if nothing changed // as that can trigger an update of some files like InstalledVersions.php if // running a new composer version $repo->write($devMode, $this); } /** * @param OperationInterface[] $operations List of operations to execute in this batch * @param OperationInterface[] $allOperations Complete list of operations to be executed in the install job, used for event listeners * @phpstan-param array> $cleanupPromises */ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, array $operations, array &$cleanupPromises, bool $devMode, bool $runScripts, bool $downloadOnly, array $allOperations) : void { $promises = []; foreach ($operations as $index => $operation) { $opType = $operation->getOperationType(); // ignoring alias ops as they don't need to execute anything at this stage if (!\in_array($opType, ['update', 'install', 'uninstall'], \true)) { continue; } if ($opType === 'update') { /** @var UpdateOperation $operation */ $package = $operation->getTargetPackage(); $initialPackage = $operation->getInitialPackage(); } else { /** @var InstallOperation|MarkAliasInstalledOperation|MarkAliasUninstalledOperation|UninstallOperation $operation */ $package = $operation->getPackage(); $initialPackage = null; } $installer = $this->getInstaller($package->getType()); $cleanupPromises[$index] = static function () use($opType, $installer, $package, $initialPackage) : ?PromiseInterface { // avoid calling cleanup if the download was not even initialized for a package // as without installation source configured nothing will work if (null === $package->getInstallationSource()) { return \React\Promise\resolve(null); } return $installer->cleanup($opType, $package, $initialPackage); }; if ($opType !== 'uninstall') { $promise = $installer->download($package, $initialPackage); if (null !== $promise) { $promises[] = $promise; } } } // execute all downloads first if (\count($promises) > 0) { $this->waitOnPromises($promises); } if ($downloadOnly) { $this->runCleanup($cleanupPromises); return; } // execute operations in batches to make sure every plugin is installed in the // right order and activated before the packages depending on it are installed $batches = []; $batch = []; foreach ($operations as $index => $operation) { if ($operation instanceof InstallOperation || $operation instanceof UpdateOperation) { $package = $operation instanceof UpdateOperation ? $operation->getTargetPackage() : $operation->getPackage(); if ($package->getType() === 'composer-plugin' || $package->getType() === 'composer-installer') { if (\count($batch) > 0) { $batches[] = $batch; } $batches[] = [$index => $operation]; $batch = []; continue; } } $batch[$index] = $operation; } if (\count($batch) > 0) { $batches[] = $batch; } foreach ($batches as $batchToExecute) { $this->executeBatch($repo, $batchToExecute, $cleanupPromises, $devMode, $runScripts, $allOperations); } } /** * @param OperationInterface[] $operations List of operations to execute in this batch * @param OperationInterface[] $allOperations Complete list of operations to be executed in the install job, used for event listeners * @phpstan-param array> $cleanupPromises */ private function executeBatch(InstalledRepositoryInterface $repo, array $operations, array $cleanupPromises, bool $devMode, bool $runScripts, array $allOperations) : void { $promises = []; $postExecCallbacks = []; foreach ($operations as $index => $operation) { $opType = $operation->getOperationType(); // ignoring alias ops as they don't need to execute anything if (!\in_array($opType, ['update', 'install', 'uninstall'], \true)) { // output alias ops in debug verbosity as they have no output otherwise if ($this->io->isDebug()) { $this->io->writeError(' - ' . $operation->show(\false)); } $this->{$opType}($repo, $operation); continue; } if ($opType === 'update') { /** @var UpdateOperation $operation */ $package = $operation->getTargetPackage(); $initialPackage = $operation->getInitialPackage(); } else { /** @var InstallOperation|MarkAliasInstalledOperation|MarkAliasUninstalledOperation|UninstallOperation $operation */ $package = $operation->getPackage(); $initialPackage = null; } $installer = $this->getInstaller($package->getType()); $eventName = ['install' => \Composer\Installer\PackageEvents::PRE_PACKAGE_INSTALL, 'update' => \Composer\Installer\PackageEvents::PRE_PACKAGE_UPDATE, 'uninstall' => \Composer\Installer\PackageEvents::PRE_PACKAGE_UNINSTALL][$opType]; if ($runScripts && $this->eventDispatcher !== null) { $this->eventDispatcher->dispatchPackageEvent($eventName, $devMode, $repo, $allOperations, $operation); } $dispatcher = $this->eventDispatcher; $io = $this->io; $promise = $installer->prepare($opType, $package, $initialPackage); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } $promise = $promise->then(function () use($opType, $repo, $operation) { return $this->{$opType}($repo, $operation); })->then($cleanupPromises[$index])->then(function () use($devMode, $repo) : void { $repo->write($devMode, $this); }, static function ($e) use($opType, $package, $io) : void { $io->writeError(' ' . \ucfirst($opType) . ' of ' . $package->getPrettyName() . ' failed'); throw $e; }); $eventName = ['install' => \Composer\Installer\PackageEvents::POST_PACKAGE_INSTALL, 'update' => \Composer\Installer\PackageEvents::POST_PACKAGE_UPDATE, 'uninstall' => \Composer\Installer\PackageEvents::POST_PACKAGE_UNINSTALL][$opType]; if ($runScripts && $dispatcher !== null) { $postExecCallbacks[] = static function () use($dispatcher, $eventName, $devMode, $repo, $allOperations, $operation) : void { $dispatcher->dispatchPackageEvent($eventName, $devMode, $repo, $allOperations, $operation); }; } $promises[] = $promise; } // execute all prepare => installs/updates/removes => cleanup steps if (\count($promises) > 0) { $this->waitOnPromises($promises); } Platform::workaroundFilesystemIssues(); foreach ($postExecCallbacks as $cb) { $cb(); } } /** * @param array> $promises */ private function waitOnPromises(array $promises) : void { $progress = null; if ($this->outputProgress && $this->io instanceof ConsoleIO && !(bool) Platform::getEnv('CI') && !$this->io->isDebug() && \count($promises) > 1) { $progress = $this->io->getProgressBar(); } $this->loop->wait($promises, $progress); if ($progress !== null) { $progress->clear(); // ProgressBar in non-decorated output does not output a final line-break and clear() does nothing if (!$this->io->isDecorated()) { $this->io->writeError(''); } } } /** * Executes download operation. * * @phpstan-return PromiseInterface|null */ public function download(PackageInterface $package) : ?PromiseInterface { $installer = $this->getInstaller($package->getType()); $promise = $installer->cleanup("install", $package); return $promise; } /** * Executes install operation. * * @param InstalledRepositoryInterface $repo repository in which to check * @param InstallOperation $operation operation instance * @phpstan-return PromiseInterface|null */ public function install(InstalledRepositoryInterface $repo, InstallOperation $operation) : ?PromiseInterface { $package = $operation->getPackage(); $installer = $this->getInstaller($package->getType()); $promise = $installer->install($repo, $package); $this->markForNotification($package); return $promise; } /** * Executes update operation. * * @param InstalledRepositoryInterface $repo repository in which to check * @param UpdateOperation $operation operation instance * @phpstan-return PromiseInterface|null */ public function update(InstalledRepositoryInterface $repo, UpdateOperation $operation) : ?PromiseInterface { $initial = $operation->getInitialPackage(); $target = $operation->getTargetPackage(); $initialType = $initial->getType(); $targetType = $target->getType(); if ($initialType === $targetType) { $installer = $this->getInstaller($initialType); $promise = $installer->update($repo, $initial, $target); $this->markForNotification($target); } else { $promise = $this->getInstaller($initialType)->uninstall($repo, $initial); if (!$promise instanceof PromiseInterface) { $promise = \React\Promise\resolve(null); } $installer = $this->getInstaller($targetType); $promise = $promise->then(static function () use($installer, $repo, $target) : PromiseInterface { $promise = $installer->install($repo, $target); if ($promise instanceof PromiseInterface) { return $promise; } return \React\Promise\resolve(null); }); } return $promise; } /** * Uninstalls package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param UninstallOperation $operation operation instance * @phpstan-return PromiseInterface|null */ public function uninstall(InstalledRepositoryInterface $repo, UninstallOperation $operation) : ?PromiseInterface { $package = $operation->getPackage(); $installer = $this->getInstaller($package->getType()); return $installer->uninstall($repo, $package); } /** * Executes markAliasInstalled operation. * * @param InstalledRepositoryInterface $repo repository in which to check * @param MarkAliasInstalledOperation $operation operation instance */ public function markAliasInstalled(InstalledRepositoryInterface $repo, MarkAliasInstalledOperation $operation) : void { $package = $operation->getPackage(); if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); } } /** * Executes markAlias operation. * * @param InstalledRepositoryInterface $repo repository in which to check * @param MarkAliasUninstalledOperation $operation operation instance */ public function markAliasUninstalled(InstalledRepositoryInterface $repo, MarkAliasUninstalledOperation $operation) : void { $package = $operation->getPackage(); $repo->removePackage($package); } /** * Returns the installation path of a package * * @return string|null absolute path to install to, which does not end with a slash, or null if the package does not have anything installed on disk */ public function getInstallPath(PackageInterface $package) : ?string { $installer = $this->getInstaller($package->getType()); return $installer->getInstallPath($package); } public function setOutputProgress(bool $outputProgress) : void { $this->outputProgress = $outputProgress; } public function notifyInstalls(IOInterface $io) : void { $promises = []; try { foreach ($this->notifiablePackages as $repoUrl => $packages) { // non-batch API, deprecated if (\str_contains($repoUrl, '%package%')) { foreach ($packages as $package) { $url = \str_replace('%package%', $package->getPrettyName(), $repoUrl); $params = ['version' => $package->getPrettyVersion(), 'version_normalized' => $package->getVersion()]; $opts = ['retry-auth-failure' => \false, 'http' => ['method' => 'POST', 'header' => ['Content-type: application/x-www-form-urlencoded'], 'content' => \http_build_query($params, '', '&'), 'timeout' => 3]]; $promises[] = $this->loop->getHttpDownloader()->add($url, $opts); } continue; } $postData = ['downloads' => []]; foreach ($packages as $package) { $packageNotification = ['name' => $package->getPrettyName(), 'version' => $package->getVersion()]; if (\strpos($repoUrl, 'packagist.org/') !== \false) { if (isset(FileDownloader::$downloadMetadata[$package->getName()])) { $packageNotification['downloaded'] = FileDownloader::$downloadMetadata[$package->getName()]; } else { $packageNotification['downloaded'] = \false; } } $postData['downloads'][] = $packageNotification; } $opts = ['retry-auth-failure' => \false, 'http' => ['method' => 'POST', 'header' => ['Content-Type: application/json'], 'content' => \json_encode($postData), 'timeout' => 6]]; $promises[] = $this->loop->getHttpDownloader()->add($repoUrl, $opts); } $this->loop->wait($promises); } catch (\Exception $e) { } $this->reset(); } private function markForNotification(PackageInterface $package) : void { if ($package->getNotificationUrl() !== null) { $this->notifiablePackages[$package->getNotificationUrl()][$package->getName()] = $package; } } /** * @return void * @phpstan-param array> $cleanupPromises */ private function runCleanup(array $cleanupPromises) : void { $promises = []; $this->loop->abortJobs(); foreach ($cleanupPromises as $cleanup) { $promises[] = new \React\Promise\Promise(static function ($resolve) use($cleanup) : void { $promise = $cleanup(); if (!$promise instanceof PromiseInterface) { $resolve(null); } else { $promise->then(static function () use($resolve) : void { $resolve(null); }); } }); } if (\count($promises) > 0) { $this->loop->wait($promises); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; /** * Does not install anything but marks packages installed in the repo * * Useful for dry runs * * @author Jordi Boggiano */ class NoopInstaller implements \Composer\Installer\InstallerInterface { /** * @inheritDoc */ public function supports(string $packageType) { return \true; } /** * @inheritDoc */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { return $repo->hasPackage($package); } /** * @inheritDoc */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { return \React\Promise\resolve(null); } /** * @inheritDoc */ public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { return \React\Promise\resolve(null); } /** * @inheritDoc */ public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { return \React\Promise\resolve(null); } /** * @inheritDoc */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { if (!$repo->hasPackage($initial)) { throw new \InvalidArgumentException('Package is not installed: ' . $initial); } $repo->removePackage($initial); if (!$repo->hasPackage($target)) { $repo->addPackage(clone $target); } return \React\Promise\resolve(null); } /** * @inheritDoc */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { throw new \InvalidArgumentException('Package is not installed: ' . $package); } $repo->removePackage($package); return \React\Promise\resolve(null); } /** * @inheritDoc */ public function getInstallPath(PackageInterface $package) { $targetDir = $package->getTargetDir(); return $package->getPrettyName() . ($targetDir ? '/' . $targetDir : ''); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Advisory; use Composer\Semver\Constraint\ConstraintInterface; use DateTimeImmutable; class SecurityAdvisory extends \Composer\Advisory\PartialSecurityAdvisory { /** * @var string * @readonly */ public $title; /** * @var string|null * @readonly */ public $cve; /** * @var string|null * @readonly */ public $link; /** * @var DateTimeImmutable * @readonly */ public $reportedAt; /** * @var non-empty-array * @readonly */ public $sources; /** * @var string|null * @readonly */ public $severity; /** * @param non-empty-array $sources */ public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null, ?string $severity = null) { parent::__construct($packageName, $advisoryId, $affectedVersions); $this->title = $title; $this->sources = $sources; $this->reportedAt = $reportedAt; $this->cve = $cve; $this->link = $link; $this->severity = $severity; } /** * @internal */ public function toIgnoredAdvisory(?string $ignoreReason) : \Composer\Advisory\IgnoredSecurityAdvisory { return new \Composer\Advisory\IgnoredSecurityAdvisory($this->packageName, $this->advisoryId, $this->affectedVersions, $this->title, $this->sources, $this->reportedAt, $this->cve, $this->link, $ignoreReason, $this->severity); } /** * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { $data = parent::jsonSerialize(); $data['reportedAt'] = $data['reportedAt']->format(\DATE_RFC3339); return $data; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Advisory; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\VersionParser; use JsonSerializable; class PartialSecurityAdvisory implements JsonSerializable { /** * @var string * @readonly */ public $advisoryId; /** * @var string * @readonly */ public $packageName; /** * @var ConstraintInterface * @readonly */ public $affectedVersions; /** * @param array $data * @return SecurityAdvisory|PartialSecurityAdvisory */ public static function create(string $packageName, array $data, VersionParser $parser) : self { $constraint = $parser->parseConstraints($data['affectedVersions']); if (isset($data['title'], $data['sources'], $data['reportedAt'])) { return new \Composer\Advisory\SecurityAdvisory($packageName, $data['advisoryId'], $constraint, $data['title'], $data['sources'], new \DateTimeImmutable($data['reportedAt'], new \DateTimeZone('UTC')), $data['cve'] ?? null, $data['link'] ?? null, $data['severity'] ?? null); } return new self($packageName, $data['advisoryId'], $constraint); } public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions) { $this->advisoryId = $advisoryId; $this->packageName = $packageName; $this->affectedVersions = $affectedVersions; } /** * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { $data = (array) $this; $data['affectedVersions'] = $data['affectedVersions']->getPrettyString(); return $data; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Advisory; use Composer\IO\ConsoleIO; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\CompletePackageInterface; use Composer\Package\PackageInterface; use Composer\Repository\RepositorySet; use Composer\Util\PackageInfo; use InvalidArgumentException; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; /** * @internal */ class Auditor { public const FORMAT_TABLE = 'table'; public const FORMAT_PLAIN = 'plain'; public const FORMAT_JSON = 'json'; public const FORMAT_SUMMARY = 'summary'; public const FORMATS = [self::FORMAT_TABLE, self::FORMAT_PLAIN, self::FORMAT_JSON, self::FORMAT_SUMMARY]; public const ABANDONED_IGNORE = 'ignore'; public const ABANDONED_REPORT = 'report'; public const ABANDONED_FAIL = 'fail'; /** @internal */ public const ABANDONEDS = [self::ABANDONED_IGNORE, self::ABANDONED_REPORT, self::ABANDONED_FAIL]; /** Values to determine the audit result. */ public const STATUS_OK = 0; public const STATUS_VULNERABLE = 1; public const STATUS_ABANDONED = 2; /** * @param PackageInterface[] $packages * @param self::FORMAT_* $format The format that will be used to output audit results. * @param bool $warningOnly If true, outputs a warning. If false, outputs an error. * @param string[] $ignoreList List of advisory IDs, remote IDs or CVE IDs that reported but not listed as vulnerabilities. * @param self::ABANDONED_* $abandoned * @param array $ignoredSeverities List of ignored severity levels * * @return int-mask A bitmask of STATUS_* constants or 0 on success * @throws InvalidArgumentException If no packages are passed in */ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages, string $format, bool $warningOnly = \true, array $ignoreList = [], string $abandoned = self::ABANDONED_FAIL, array $ignoredSeverities = []) : int { $allAdvisories = $repoSet->getMatchingSecurityAdvisories($packages, $format === self::FORMAT_SUMMARY); // we need the CVE & remote IDs set to filter ignores correctly so if we have any matches using the optimized codepath above // and ignores are set then we need to query again the full data to make sure it can be filtered if (\count($allAdvisories) > 0 && $ignoreList !== [] && $format === self::FORMAT_SUMMARY) { $allAdvisories = $repoSet->getMatchingSecurityAdvisories($packages, \false); } ['advisories' => $advisories, 'ignoredAdvisories' => $ignoredAdvisories] = $this->processAdvisories($allAdvisories, $ignoreList, $ignoredSeverities); $abandonedCount = 0; $affectedPackagesCount = \count($advisories); if ($abandoned === self::ABANDONED_IGNORE) { $abandonedPackages = []; } else { $abandonedPackages = $this->filterAbandonedPackages($packages); if ($abandoned === self::ABANDONED_FAIL) { $abandonedCount = \count($abandonedPackages); } } $auditBitmask = $this->calculateBitmask(0 < $affectedPackagesCount, 0 < $abandonedCount); if (self::FORMAT_JSON === $format) { $json = ['advisories' => $advisories]; if ($ignoredAdvisories !== []) { $json['ignored-advisories'] = $ignoredAdvisories; } $json['abandoned'] = \array_reduce($abandonedPackages, static function (array $carry, CompletePackageInterface $package) : array { $carry[$package->getPrettyName()] = $package->getReplacementPackage(); return $carry; }, []); $io->write(JsonFile::encode($json)); return $auditBitmask; } $errorOrWarn = $warningOnly ? 'warning' : 'error'; if ($affectedPackagesCount > 0 || \count($ignoredAdvisories) > 0) { $passes = [[$ignoredAdvisories, "Found %d ignored security vulnerability advisor%s affecting %d package%s%s"], [$advisories, "<{$errorOrWarn}>Found %d security vulnerability advisor%s affecting %d package%s%s"]]; foreach ($passes as [$advisoriesToOutput, $message]) { [$pkgCount, $totalAdvisoryCount] = $this->countAdvisories($advisoriesToOutput); if ($pkgCount > 0) { $plurality = $totalAdvisoryCount === 1 ? 'y' : 'ies'; $pkgPlurality = $pkgCount === 1 ? '' : 's'; $punctuation = $format === 'summary' ? '.' : ':'; $io->writeError(\sprintf($message, $totalAdvisoryCount, $plurality, $pkgCount, $pkgPlurality, $punctuation)); $this->outputAdvisories($io, $advisoriesToOutput, $format); } } if ($format === self::FORMAT_SUMMARY) { $io->writeError('Run "composer audit" for a full list of advisories.'); } } else { $io->writeError('No security vulnerability advisories found.'); } if (\count($abandonedPackages) > 0 && $format !== self::FORMAT_SUMMARY) { $this->outputAbandonedPackages($io, $abandonedPackages, $format); } return $auditBitmask; } /** * @param array $packages * @return array */ private function filterAbandonedPackages(array $packages) : array { return \array_filter($packages, static function (PackageInterface $pkg) : bool { return $pkg instanceof CompletePackageInterface && $pkg->isAbandoned(); }); } /** * @phpstan-param array> $allAdvisories * @param array|array $ignoreList List of advisory IDs, remote IDs or CVE IDs that reported but not listed as vulnerabilities. * @param array $ignoredSeverities List of ignored severity levels * @phpstan-return array{advisories: array>, ignoredAdvisories: array>} */ private function processAdvisories(array $allAdvisories, array $ignoreList, array $ignoredSeverities) : array { if ($ignoreList === [] && $ignoredSeverities === []) { return ['advisories' => $allAdvisories, 'ignoredAdvisories' => []]; } if (\count($ignoreList) > 0 && !\array_is_list($ignoreList)) { $ignoredIds = \array_keys($ignoreList); } else { $ignoredIds = $ignoreList; } $advisories = []; $ignored = []; $ignoreReason = null; foreach ($allAdvisories as $package => $pkgAdvisories) { foreach ($pkgAdvisories as $advisory) { $isActive = \true; if (\in_array($advisory->advisoryId, $ignoredIds, \true)) { $isActive = \false; $ignoreReason = $ignoreList[$advisory->advisoryId] ?? null; } if ($advisory instanceof \Composer\Advisory\SecurityAdvisory) { if (\in_array($advisory->severity, $ignoredSeverities, \true)) { $isActive = \false; $ignoreReason = "Ignored via --ignore-severity={$advisory->severity}"; } if (\in_array($advisory->cve, $ignoredIds, \true)) { $isActive = \false; $ignoreReason = $ignoreList[$advisory->cve] ?? null; } foreach ($advisory->sources as $source) { if (\in_array($source['remoteId'], $ignoredIds, \true)) { $isActive = \false; $ignoreReason = $ignoreList[$source['remoteId']] ?? null; break; } } } if ($isActive) { $advisories[$package][] = $advisory; continue; } // Partial security advisories only used in summary mode // and in that case we do not need to cast the object. if ($advisory instanceof \Composer\Advisory\SecurityAdvisory) { $advisory = $advisory->toIgnoredAdvisory($ignoreReason); } $ignored[$package][] = $advisory; } } return ['advisories' => $advisories, 'ignoredAdvisories' => $ignored]; } /** * @param array> $advisories * @return array{int, int} Count of affected packages and total count of advisories */ private function countAdvisories(array $advisories) : array { $count = 0; foreach ($advisories as $packageAdvisories) { $count += \count($packageAdvisories); } return [\count($advisories), $count]; } /** * @param array> $advisories * @param self::FORMAT_* $format The format that will be used to output audit results. */ private function outputAdvisories(IOInterface $io, array $advisories, string $format) : void { switch ($format) { case self::FORMAT_TABLE: if (!$io instanceof ConsoleIO) { throw new InvalidArgumentException('Cannot use table format with ' . \get_class($io)); } $this->outputAdvisoriesTable($io, $advisories); return; case self::FORMAT_PLAIN: $this->outputAdvisoriesPlain($io, $advisories); return; case self::FORMAT_SUMMARY: return; default: throw new InvalidArgumentException('Invalid format "' . $format . '".'); } } /** * @param array> $advisories */ private function outputAdvisoriesTable(ConsoleIO $io, array $advisories) : void { foreach ($advisories as $packageAdvisories) { foreach ($packageAdvisories as $advisory) { $headers = ['Package', 'Severity', 'CVE', 'Title', 'URL', 'Affected versions', 'Reported at']; $row = [$advisory->packageName, $this->getSeverity($advisory), $this->getCVE($advisory), $advisory->title, $this->getURL($advisory), $advisory->affectedVersions->getPrettyString(), $advisory->reportedAt->format(\DATE_ATOM)]; if ($advisory->cve === null) { $headers[] = 'Advisory ID'; $row[] = $advisory->advisoryId; } if ($advisory instanceof \Composer\Advisory\IgnoredSecurityAdvisory) { $headers[] = 'Ignore reason'; $row[] = $advisory->ignoreReason ?? 'None specified'; } $io->getTable()->setHorizontal()->setHeaders($headers)->addRow($row)->setColumnWidth(1, 80)->setColumnMaxWidth(1, 80)->render(); } } } /** * @param array> $advisories */ private function outputAdvisoriesPlain(IOInterface $io, array $advisories) : void { $error = []; $firstAdvisory = \true; foreach ($advisories as $packageAdvisories) { foreach ($packageAdvisories as $advisory) { if (!$firstAdvisory) { $error[] = '--------'; } $error[] = "Package: " . $advisory->packageName; $error[] = "Severity: " . $this->getSeverity($advisory); $error[] = "CVE: " . $this->getCVE($advisory); if ($advisory->cve === null) { $error[] = "Advisory ID: " . $advisory->advisoryId; } $error[] = "Title: " . OutputFormatter::escape($advisory->title); $error[] = "URL: " . $this->getURL($advisory); $error[] = "Affected versions: " . OutputFormatter::escape($advisory->affectedVersions->getPrettyString()); $error[] = "Reported at: " . $advisory->reportedAt->format(\DATE_ATOM); if ($advisory instanceof \Composer\Advisory\IgnoredSecurityAdvisory) { $error[] = "Ignore reason: " . ($advisory->ignoreReason ?? 'None specified'); } $firstAdvisory = \false; } } $io->writeError($error); } /** * @param array $packages * @param self::FORMAT_PLAIN|self::FORMAT_TABLE $format */ private function outputAbandonedPackages(IOInterface $io, array $packages, string $format) : void { $io->writeError(\sprintf('Found %d abandoned package%s:', \count($packages), \count($packages) > 1 ? 's' : '')); if ($format === self::FORMAT_PLAIN) { foreach ($packages as $pkg) { $replacement = $pkg->getReplacementPackage() !== null ? 'Use ' . $pkg->getReplacementPackage() . ' instead' : 'No replacement was suggested'; $io->writeError(\sprintf('%s is abandoned. %s.', $this->getPackageNameWithLink($pkg), $replacement)); } return; } if (!$io instanceof ConsoleIO) { throw new InvalidArgumentException('Cannot use table format with ' . \get_class($io)); } $table = $io->getTable()->setHeaders(['Abandoned Package', 'Suggested Replacement'])->setColumnWidth(1, 80)->setColumnMaxWidth(1, 80); foreach ($packages as $pkg) { $replacement = $pkg->getReplacementPackage() !== null ? $pkg->getReplacementPackage() : 'none'; $table->addRow([$this->getPackageNameWithLink($pkg), $replacement]); } $table->render(); } private function getPackageNameWithLink(PackageInterface $package) : string { $packageUrl = PackageInfo::getViewSourceOrHomepageUrl($package); return $packageUrl !== null ? '' . $package->getPrettyName() . '' : $package->getPrettyName(); } private function getSeverity(\Composer\Advisory\SecurityAdvisory $advisory) : string { if ($advisory->severity === null) { return ''; } return $advisory->severity; } private function getCVE(\Composer\Advisory\SecurityAdvisory $advisory) : string { if ($advisory->cve === null) { return 'NO CVE'; } return '' . $advisory->cve . ''; } private function getURL(\Composer\Advisory\SecurityAdvisory $advisory) : string { if ($advisory->link === null) { return ''; } return 'link) . '>' . OutputFormatter::escape($advisory->link) . ''; } /** * @return int-mask */ private function calculateBitmask(bool $hasVulnerablePackages, bool $hasAbandonedPackages) : int { $bitmask = self::STATUS_OK; if ($hasVulnerablePackages) { $bitmask |= self::STATUS_VULNERABLE; } if ($hasAbandonedPackages) { $bitmask |= self::STATUS_ABANDONED; } return $bitmask; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Advisory; use Composer\Semver\Constraint\ConstraintInterface; use DateTimeImmutable; class IgnoredSecurityAdvisory extends \Composer\Advisory\SecurityAdvisory { /** * @var string|null * @readonly */ public $ignoreReason; /** * @param non-empty-array $sources */ public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null, ?string $ignoreReason = null, ?string $severity = null) { parent::__construct($packageName, $advisoryId, $affectedVersions, $title, $sources, $reportedAt, $cve, $link, $severity); $this->ignoreReason = $ignoreReason; } /** * @return mixed */ #[\ReturnTypeWillChange] public function jsonSerialize() { $data = parent::jsonSerialize(); if ($this->ignoreReason === NULL) { unset($data['ignoreReason']); } return $data; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Exception; /** * @author Jordi Boggiano */ class IrrecoverableDownloadException extends \RuntimeException { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Exception; /** * Specific exception for Composer\Util\HttpDownloader creation. * * @author Jordi Boggiano */ class NoSslException extends \RuntimeException { } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Json\JsonFile; use Composer\CaBundle\CaBundle; use Composer\Pcre\Preg; use Composer\Util\ProcessExecutor; use _ContaoManager\Symfony\Component\Finder\Finder; use _ContaoManager\Symfony\Component\Process\Process; use _ContaoManager\Seld\PharUtils\Timestamps; use _ContaoManager\Seld\PharUtils\Linter; /** * The Compiler class compiles composer into a phar * * @author Fabien Potencier * @author Jordi Boggiano */ class Compiler { /** @var string */ private $version; /** @var string */ private $branchAliasVersion = ''; /** @var \DateTime */ private $versionDate; /** * Compiles composer into a single phar file * * @param string $pharFile The full path to the file to create * * @throws \RuntimeException */ public function compile(string $pharFile = 'composer.phar') : void { if (\file_exists($pharFile)) { \unlink($pharFile); } $process = new ProcessExecutor(); if (0 !== $process->execute(['git', 'log', '--pretty=%H', '-n1', 'HEAD'], $output, \dirname(\dirname(__DIR__)))) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } $this->version = \trim($output); if (0 !== $process->execute(['git', 'log', '-n1', '--pretty=%ci', 'HEAD'], $output, \dirname(\dirname(__DIR__)))) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } $this->versionDate = new \DateTime(\trim($output)); $this->versionDate->setTimezone(new \DateTimeZone('UTC')); if (0 === $process->execute(['git', 'describe', '--tags', '--exact-match', 'HEAD'], $output, \dirname(\dirname(__DIR__)))) { $this->version = \trim($output); } else { // get branch-alias defined in composer.json for dev-main (if any) $localConfig = __DIR__ . '/../../composer.json'; $file = new JsonFile($localConfig); $localConfig = $file->read(); if (isset($localConfig['extra']['branch-alias']['dev-main'])) { $this->branchAliasVersion = $localConfig['extra']['branch-alias']['dev-main']; } } if ('' === $this->version) { throw new \UnexpectedValueException('Version detection failed'); } $phar = new \Phar($pharFile, 0, 'composer.phar'); $phar->setSignatureAlgorithm(\Phar::SHA512); $phar->startBuffering(); $finderSort = static function ($a, $b) : int { return \strcmp(\strtr($a->getRealPath(), '\\', '/'), \strtr($b->getRealPath(), '\\', '/')); }; // Add Composer sources $finder = new Finder(); $finder->files()->ignoreVCS(\true)->name('*.php')->notName('Compiler.php')->notName('ClassLoader.php')->notName('InstalledVersions.php')->in(__DIR__ . '/..')->sort($finderSort); foreach ($finder as $file) { $this->addFile($phar, $file); } // Add runtime utilities separately to make sure they retains the docblocks as these will get copied into projects $this->addFile($phar, new \SplFileInfo(__DIR__ . '/Autoload/ClassLoader.php'), \false); $this->addFile($phar, new \SplFileInfo(__DIR__ . '/InstalledVersions.php'), \false); // Add Composer resources $finder = new Finder(); $finder->files()->in(__DIR__ . '/../../res')->sort($finderSort); foreach ($finder as $file) { $this->addFile($phar, $file, \false); } // Add vendor files $finder = new Finder(); $finder->files()->ignoreVCS(\true)->notPath('/\\/(composer\\.(json|lock)|[A-Z]+\\.md(?:own)?|\\.gitignore|appveyor.yml|phpunit\\.xml\\.dist|phpstan\\.neon\\.dist|phpstan-config\\.neon|phpstan-baseline\\.neon)$/')->notPath('/bin\\/(jsonlint|validate-json|simple-phpunit|phpstan|phpstan\\.phar)(\\.bat)?$/')->notPath('justinrainbow/json-schema/demo/')->notPath('justinrainbow/json-schema/dist/')->notPath('composer/pcre/extension.neon')->notPath('composer/LICENSE')->exclude('Tests')->exclude('tests')->exclude('docs')->in(__DIR__ . '/../../vendor/')->sort($finderSort); $extraFiles = []; foreach ([__DIR__ . '/../../vendor/composer/installed.json', __DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-exceptions.json', __DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-licenses.json', CaBundle::getBundledCaBundlePath(), __DIR__ . '/../../vendor/symfony/console/Resources/bin/hiddeninput.exe', __DIR__ . '/../../vendor/symfony/console/Resources/completion.bash'] as $file) { $extraFiles[$file] = \realpath($file); if (!\file_exists($file)) { throw new \RuntimeException('Extra file listed is missing from the filesystem: ' . $file); } } $unexpectedFiles = []; foreach ($finder as $file) { if (\false !== ($index = \array_search($file->getRealPath(), $extraFiles, \true))) { unset($extraFiles[$index]); } elseif (!Preg::isMatch('{(^LICENSE$|\\.php$)}', $file->getFilename())) { $unexpectedFiles[] = (string) $file; } if (Preg::isMatch('{\\.php[\\d.]*$}', $file->getFilename())) { $this->addFile($phar, $file); } else { $this->addFile($phar, $file, \false); } } if (\count($extraFiles) > 0) { throw new \RuntimeException('These files were expected but not added to the phar, they might be excluded or gone from the source package:' . \PHP_EOL . \var_export($extraFiles, \true)); } if (\count($unexpectedFiles) > 0) { throw new \RuntimeException('These files were unexpectedly added to the phar, make sure they are excluded or listed in $extraFiles:' . \PHP_EOL . \var_export($unexpectedFiles, \true)); } // Add bin/composer $this->addComposerBin($phar); // Stubs $phar->setStub($this->getStub()); $phar->stopBuffering(); // disabled for interoperability with systems without gzip ext // $phar->compressFiles(\Phar::GZ); $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../../LICENSE'), \false); unset($phar); // re-sign the phar with reproducible timestamp / signature $util = new Timestamps($pharFile); $util->updateTimestamps($this->versionDate); $util->save($pharFile, \Phar::SHA512); Linter::lint($pharFile, ['vendor/symfony/console/Attribute/AsCommand.php', 'vendor/symfony/polyfill-intl-grapheme/bootstrap80.php', 'vendor/symfony/polyfill-intl-normalizer/bootstrap80.php', 'vendor/symfony/polyfill-mbstring/bootstrap80.php', 'vendor/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'vendor/symfony/service-contracts/Attribute/SubscribedService.php']); } private function getRelativeFilePath(\SplFileInfo $file) : string { $realPath = $file->getRealPath(); $pathPrefix = \dirname(__DIR__, 2) . \DIRECTORY_SEPARATOR; $pos = \strpos($realPath, $pathPrefix); $relativePath = $pos !== \false ? \substr_replace($realPath, '', $pos, \strlen($pathPrefix)) : $realPath; return \strtr($relativePath, '\\', '/'); } private function addFile(\Phar $phar, \SplFileInfo $file, bool $strip = \true) : void { $path = $this->getRelativeFilePath($file); $content = \file_get_contents((string) $file); if ($strip) { $content = $this->stripWhitespace($content); } elseif ('LICENSE' === $file->getFilename()) { $content = "\n" . $content . "\n"; } if ($path === 'src/Composer/Composer.php') { $content = \strtr($content, ['@package_version@' => $this->version, '@package_branch_alias_version@' => $this->branchAliasVersion, '@release_date@' => $this->versionDate->format('Y-m-d H:i:s')]); $content = Preg::replace('{SOURCE_VERSION = \'[^\']+\';}', 'SOURCE_VERSION = \'\';', $content); } $phar->addFromString($path, $content); } private function addComposerBin(\Phar $phar) : void { $content = \file_get_contents(__DIR__ . '/../../bin/composer'); $content = Preg::replace('{^#!/usr/bin/env php\\s*}', '', $content); $phar->addFromString('bin/composer', $content); } /** * Removes whitespace from a PHP source string while preserving line numbers. * * @param string $source A PHP string * @return string The PHP string with the whitespace removed */ private function stripWhitespace(string $source) : string { if (!\function_exists('token_get_all')) { return $source; } $output = ''; foreach (\token_get_all($source) as $token) { if (\is_string($token)) { $output .= $token; } elseif (\in_array($token[0], [\T_COMMENT, \T_DOC_COMMENT])) { $output .= \str_repeat("\n", \substr_count($token[1], "\n")); } elseif (\T_WHITESPACE === $token[0]) { // reduce wide spaces $whitespace = Preg::replace('{[ \\t]+}', ' ', $token[1]); // normalize newlines to \n $whitespace = Preg::replace('{(?:\\r\\n|\\r|\\n)}', "\n", $whitespace); // trim leading spaces $whitespace = Preg::replace('{\\n +}', "\n", $whitespace); $output .= $whitespace; } else { $output .= $token[1]; } } return $output; } private function getStub() : string { $stub = <<<'EOF' #!/usr/bin/env php * Jordi Boggiano * * For the full copyright and license information, please view * the license that is located at the bottom of this file. */ // Avoid APC causing random fatal errors per https://github.com/composer/composer/issues/264 if (extension_loaded('apc') && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN) && filter_var(ini_get('apc.cache_by_default'), FILTER_VALIDATE_BOOLEAN)) { if (version_compare(phpversion('apc'), '3.0.12', '>=')) { ini_set('apc.cache_by_default', 0); } else { fwrite(STDERR, 'Warning: APC <= 3.0.12 may cause fatal errors when running composer commands.'.PHP_EOL); fwrite(STDERR, 'Update APC, or set apc.enable_cli or apc.cache_by_default to 0 in your php.ini.'.PHP_EOL); } } if (!class_exists('Phar')) { echo 'PHP\'s phar extension is missing. Composer requires it to run. Enable the extension or recompile php without --disable-phar then try again.' . PHP_EOL; exit(1); } Phar::mapPhar('composer.phar'); EOF; // add warning once the phar is older than 60 days if (Preg::isMatch('{^[a-f0-9]+$}', $this->version)) { $warningTime = (int) $this->versionDate->format('U') + 60 * 86400; $stub .= "define('COMPOSER_DEV_WARNING_TIME', {$warningTime});\n"; } return $stub . <<<'EOF' require 'phar://composer.phar/bin/composer'; __HALT_COMPILER(); EOF; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Package\Version\VersionParser; use Composer\Pcre\Preg; use Composer\Util\ComposerMirror; /** * Core package definitions that are needed to resolve dependencies and install packages * * @author Nils Adermann * * @phpstan-import-type AutoloadRules from PackageInterface * @phpstan-import-type DevAutoloadRules from PackageInterface * @phpstan-import-type PhpExtConfig from PackageInterface */ class Package extends \Composer\Package\BasePackage { /** @var string */ protected $type; /** @var ?string */ protected $targetDir; /** @var 'source'|'dist'|null */ protected $installationSource; /** @var ?string */ protected $sourceType; /** @var ?string */ protected $sourceUrl; /** @var ?string */ protected $sourceReference; /** @var ?list */ protected $sourceMirrors; /** @var ?non-empty-string */ protected $distType; /** @var ?non-empty-string */ protected $distUrl; /** @var ?string */ protected $distReference; /** @var ?string */ protected $distSha1Checksum; /** @var ?list */ protected $distMirrors; /** @var string */ protected $version; /** @var string */ protected $prettyVersion; /** @var ?\DateTimeInterface */ protected $releaseDate; /** @var mixed[] */ protected $extra = []; /** @var string[] */ protected $binaries = []; /** @var bool */ protected $dev; /** * @var string * @phpstan-var 'stable'|'RC'|'beta'|'alpha'|'dev' */ protected $stability; /** @var ?string */ protected $notificationUrl; /** @var array */ protected $requires = []; /** @var array */ protected $conflicts = []; /** @var array */ protected $provides = []; /** @var array */ protected $replaces = []; /** @var array */ protected $devRequires = []; /** @var array */ protected $suggests = []; /** * @var array * @phpstan-var AutoloadRules */ protected $autoload = []; /** * @var array * @phpstan-var DevAutoloadRules */ protected $devAutoload = []; /** @var string[] */ protected $includePaths = []; /** @var bool */ protected $isDefaultBranch = \false; /** @var mixed[] */ protected $transportOptions = []; /** * @var array|null * @phpstan-var PhpExtConfig|null */ protected $phpExt = null; /** * Creates a new in memory package. * * @param string $name The package's name * @param string $version The package's version * @param string $prettyVersion The package's non-normalized version */ public function __construct(string $name, string $version, string $prettyVersion) { parent::__construct($name); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; } /** * @inheritDoc */ public function isDev() : bool { return $this->dev; } public function setType(string $type) : void { $this->type = $type; } /** * @inheritDoc */ public function getType() : string { return $this->type ?: 'library'; } /** * @inheritDoc */ public function getStability() : string { return $this->stability; } public function setTargetDir(?string $targetDir) : void { $this->targetDir = $targetDir; } /** * @inheritDoc */ public function getTargetDir() : ?string { if (null === $this->targetDir) { return null; } return \ltrim(Preg::replace('{ (?:^|[\\\\/]+) \\.\\.? (?:[\\\\/]+|$) (?:\\.\\.? (?:[\\\\/]+|$) )*}x', '/', $this->targetDir), '/'); } /** * @param mixed[] $extra */ public function setExtra(array $extra) : void { $this->extra = $extra; } /** * @inheritDoc */ public function getExtra() : array { return $this->extra; } /** * @param string[] $binaries */ public function setBinaries(array $binaries) : void { $this->binaries = $binaries; } /** * @inheritDoc */ public function getBinaries() : array { return $this->binaries; } /** * @inheritDoc */ public function setInstallationSource(?string $type) : void { $this->installationSource = $type; } /** * @inheritDoc */ public function getInstallationSource() : ?string { return $this->installationSource; } public function setSourceType(?string $type) : void { $this->sourceType = $type; } /** * @inheritDoc */ public function getSourceType() : ?string { return $this->sourceType; } public function setSourceUrl(?string $url) : void { $this->sourceUrl = $url; } /** * @inheritDoc */ public function getSourceUrl() : ?string { return $this->sourceUrl; } public function setSourceReference(?string $reference) : void { $this->sourceReference = $reference; } /** * @inheritDoc */ public function getSourceReference() : ?string { return $this->sourceReference; } public function setSourceMirrors(?array $mirrors) : void { $this->sourceMirrors = $mirrors; } /** * @inheritDoc */ public function getSourceMirrors() : ?array { return $this->sourceMirrors; } /** * @inheritDoc */ public function getSourceUrls() : array { return $this->getUrls($this->sourceUrl, $this->sourceMirrors, $this->sourceReference, $this->sourceType, 'source'); } /** * @param string $type */ public function setDistType(?string $type) : void { $this->distType = $type === '' ? null : $type; } /** * @inheritDoc */ public function getDistType() : ?string { return $this->distType; } /** * @param string|null $url */ public function setDistUrl(?string $url) : void { $this->distUrl = $url === '' ? null : $url; } /** * @inheritDoc */ public function getDistUrl() : ?string { return $this->distUrl; } /** * @param string $reference */ public function setDistReference(?string $reference) : void { $this->distReference = $reference; } /** * @inheritDoc */ public function getDistReference() : ?string { return $this->distReference; } /** * @param string $sha1checksum */ public function setDistSha1Checksum(?string $sha1checksum) : void { $this->distSha1Checksum = $sha1checksum; } /** * @inheritDoc */ public function getDistSha1Checksum() : ?string { return $this->distSha1Checksum; } public function setDistMirrors(?array $mirrors) : void { $this->distMirrors = $mirrors; } /** * @inheritDoc */ public function getDistMirrors() : ?array { return $this->distMirrors; } /** * @inheritDoc */ public function getDistUrls() : array { return $this->getUrls($this->distUrl, $this->distMirrors, $this->distReference, $this->distType, 'dist'); } /** * @inheritDoc */ public function getTransportOptions() : array { return $this->transportOptions; } /** * @inheritDoc */ public function setTransportOptions(array $options) : void { $this->transportOptions = $options; } /** * @inheritDoc */ public function getVersion() : string { return $this->version; } /** * @inheritDoc */ public function getPrettyVersion() : string { return $this->prettyVersion; } public function setReleaseDate(?\DateTimeInterface $releaseDate) : void { $this->releaseDate = $releaseDate; } /** * @inheritDoc */ public function getReleaseDate() : ?\DateTimeInterface { return $this->releaseDate; } /** * Set the required packages * * @param array $requires A set of package links */ public function setRequires(array $requires) : void { if (isset($requires[0])) { // @phpstan-ignore-line $requires = $this->convertLinksToMap($requires, 'setRequires'); } $this->requires = $requires; } /** * @inheritDoc */ public function getRequires() : array { return $this->requires; } /** * Set the conflicting packages * * @param array $conflicts A set of package links */ public function setConflicts(array $conflicts) : void { if (isset($conflicts[0])) { // @phpstan-ignore-line $conflicts = $this->convertLinksToMap($conflicts, 'setConflicts'); } $this->conflicts = $conflicts; } /** * @inheritDoc * @return array */ public function getConflicts() : array { return $this->conflicts; } /** * Set the provided virtual packages * * @param array $provides A set of package links */ public function setProvides(array $provides) : void { if (isset($provides[0])) { // @phpstan-ignore-line $provides = $this->convertLinksToMap($provides, 'setProvides'); } $this->provides = $provides; } /** * @inheritDoc * @return array */ public function getProvides() : array { return $this->provides; } /** * Set the packages this one replaces * * @param array $replaces A set of package links */ public function setReplaces(array $replaces) : void { if (isset($replaces[0])) { // @phpstan-ignore-line $replaces = $this->convertLinksToMap($replaces, 'setReplaces'); } $this->replaces = $replaces; } /** * @inheritDoc * @return array */ public function getReplaces() : array { return $this->replaces; } /** * Set the recommended packages * * @param array $devRequires A set of package links */ public function setDevRequires(array $devRequires) : void { if (isset($devRequires[0])) { // @phpstan-ignore-line $devRequires = $this->convertLinksToMap($devRequires, 'setDevRequires'); } $this->devRequires = $devRequires; } /** * @inheritDoc */ public function getDevRequires() : array { return $this->devRequires; } /** * Set the suggested packages * * @param array $suggests A set of package names/comments */ public function setSuggests(array $suggests) : void { $this->suggests = $suggests; } /** * @inheritDoc */ public function getSuggests() : array { return $this->suggests; } /** * Set the autoload mapping * * @param array $autoload Mapping of autoloading rules * * @phpstan-param AutoloadRules $autoload */ public function setAutoload(array $autoload) : void { $this->autoload = $autoload; } /** * @inheritDoc */ public function getAutoload() : array { return $this->autoload; } /** * Set the dev autoload mapping * * @param array $devAutoload Mapping of dev autoloading rules * * @phpstan-param DevAutoloadRules $devAutoload */ public function setDevAutoload(array $devAutoload) : void { $this->devAutoload = $devAutoload; } /** * @inheritDoc */ public function getDevAutoload() : array { return $this->devAutoload; } /** * Sets the list of paths added to PHP's include path. * * @param string[] $includePaths List of directories. */ public function setIncludePaths(array $includePaths) : void { $this->includePaths = $includePaths; } /** * @inheritDoc */ public function getIncludePaths() : array { return $this->includePaths; } /** * Sets the settings for php extension packages * * @param array|null $phpExt * * @phpstan-param PhpExtConfig|null $phpExt */ public function setPhpExt(?array $phpExt) : void { $this->phpExt = $phpExt; } /** * @inheritDoc */ public function getPhpExt() : ?array { return $this->phpExt; } /** * Sets the notification URL */ public function setNotificationUrl(string $notificationUrl) : void { $this->notificationUrl = $notificationUrl; } /** * @inheritDoc */ public function getNotificationUrl() : ?string { return $this->notificationUrl; } public function setIsDefaultBranch(bool $defaultBranch) : void { $this->isDefaultBranch = $defaultBranch; } /** * @inheritDoc */ public function isDefaultBranch() : bool { return $this->isDefaultBranch; } /** * @inheritDoc */ public function setSourceDistReferences(string $reference) : void { $this->setSourceReference($reference); // only bitbucket, github and gitlab have auto generated dist URLs that easily allow replacing the reference in the dist URL // TODO generalize this a bit for self-managed/on-prem versions? Some kind of replace token in dist urls which allow this? if ($this->getDistUrl() !== null && Preg::isMatch('{^https?://(?:(?:www\\.)?bitbucket\\.org|(api\\.)?github\\.com|(?:www\\.)?gitlab\\.com)/}i', $this->getDistUrl())) { $this->setDistReference($reference); $this->setDistUrl(Preg::replace('{(?<=/|sha=)[a-f0-9]{40}(?=/|$)}i', $reference, $this->getDistUrl())); } elseif ($this->getDistReference()) { // update the dist reference if there was one, but if none was provided ignore it $this->setDistReference($reference); } } /** * Replaces current version and pretty version with passed values. * It also sets stability. * * @param string $version The package's normalized version * @param string $prettyVersion The package's non-normalized version */ public function replaceVersion(string $version, string $prettyVersion) : void { $this->version = $version; $this->prettyVersion = $prettyVersion; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; } /** * @param mixed[]|null $mirrors * * @return list * * @phpstan-param list|null $mirrors */ protected function getUrls(?string $url, ?array $mirrors, ?string $ref, ?string $type, string $urlType) : array { if (!$url) { return []; } if ($urlType === 'dist' && \false !== \strpos($url, '%')) { $url = ComposerMirror::processUrl($url, $this->name, $this->version, $ref, $type, $this->prettyVersion); } $urls = [$url]; if ($mirrors) { foreach ($mirrors as $mirror) { if ($urlType === 'dist') { $mirrorUrl = ComposerMirror::processUrl($mirror['url'], $this->name, $this->version, $ref, $type, $this->prettyVersion); } elseif ($urlType === 'source' && $type === 'git') { $mirrorUrl = ComposerMirror::processGitUrl($mirror['url'], $this->name, $url, $type); } elseif ($urlType === 'source' && $type === 'hg') { $mirrorUrl = ComposerMirror::processHgUrl($mirror['url'], $this->name, $url, $type); } else { continue; } if (!\in_array($mirrorUrl, $urls)) { $func = $mirror['preferred'] ? 'array_unshift' : 'array_push'; $func($urls, $mirrorUrl); } } } return $urls; } /** * @param array $links * @return array */ private function convertLinksToMap(array $links, string $source) : array { \trigger_error('Package::' . $source . ' must be called with a map of lowercased package name => Link object, got a indexed array, this is deprecated and you should fix your usage.'); $newLinks = []; foreach ($links as $link) { $newLinks[$link->getTarget()] = $link; } return $newLinks; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Semver\Constraint\ConstraintInterface; /** * Represents a link between two packages, represented by their names * * @author Nils Adermann */ class Link { public const TYPE_REQUIRE = 'requires'; public const TYPE_DEV_REQUIRE = 'devRequires'; public const TYPE_PROVIDE = 'provides'; public const TYPE_CONFLICT = 'conflicts'; public const TYPE_REPLACE = 'replaces'; /** * Special type * @internal */ public const TYPE_DOES_NOT_REQUIRE = 'does not require'; private const TYPE_UNKNOWN = 'relates to'; /** * Will be converted into a constant once the min PHP version allows this * * @internal * @var string[] * @phpstan-var array */ public static $TYPES = [self::TYPE_REQUIRE, self::TYPE_DEV_REQUIRE, self::TYPE_PROVIDE, self::TYPE_CONFLICT, self::TYPE_REPLACE]; /** * @var string */ protected $source; /** * @var string */ protected $target; /** * @var ConstraintInterface */ protected $constraint; /** * @var string * @phpstan-var string $description */ protected $description; /** * @var ?string */ protected $prettyConstraint; /** * Creates a new package link. * * @param ConstraintInterface $constraint Constraint applying to the target of this link * @param self::TYPE_* $description Used to create a descriptive string representation */ public function __construct(string $source, string $target, ConstraintInterface $constraint, $description = self::TYPE_UNKNOWN, ?string $prettyConstraint = null) { $this->source = \strtolower($source); $this->target = \strtolower($target); $this->constraint = $constraint; $this->description = self::TYPE_DEV_REQUIRE === $description ? 'requires (for development)' : $description; $this->prettyConstraint = $prettyConstraint; } public function getDescription() : string { return $this->description; } public function getSource() : string { return $this->source; } public function getTarget() : string { return $this->target; } public function getConstraint() : ConstraintInterface { return $this->constraint; } /** * @throws \UnexpectedValueException If no pretty constraint was provided */ public function getPrettyConstraint() : string { if (null === $this->prettyConstraint) { throw new \UnexpectedValueException(\sprintf('Link %s has been misconfigured and had no prettyConstraint given.', $this)); } return $this->prettyConstraint; } public function __toString() : string { return $this->source . ' ' . $this->description . ' ' . $this->target . ' (' . $this->constraint . ')'; } public function getPrettyString(\Composer\Package\PackageInterface $sourcePackage) : string { return $sourcePackage->getPrettyString() . ' ' . $this->description . ' ' . $this->target . ' ' . $this->constraint->getPrettyString(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * Defines package metadata that is not necessarily needed for solving and installing packages * * PackageInterface & derivatives are considered internal, you may use them in type hints but extending/implementing them is not recommended and not supported. Things may change without notice. * * @author Nils Adermann */ interface CompletePackageInterface extends \Composer\Package\PackageInterface { /** * Returns the scripts of this package * * @return array Map of script name to array of handlers */ public function getScripts() : array; /** * @param array $scripts */ public function setScripts(array $scripts) : void; /** * Returns an array of repositories * * @return mixed[] Repositories */ public function getRepositories() : array; /** * Set the repositories * * @param mixed[] $repositories */ public function setRepositories(array $repositories) : void; /** * Returns the package license, e.g. MIT, BSD, GPL * * @return string[] The package licenses */ public function getLicense() : array; /** * Set the license * * @param string[] $license */ public function setLicense(array $license) : void; /** * Returns an array of keywords relating to the package * * @return string[] */ public function getKeywords() : array; /** * Set the keywords * * @param string[] $keywords */ public function setKeywords(array $keywords) : void; /** * Returns the package description * * @return ?string */ public function getDescription() : ?string; /** * Set the description */ public function setDescription(string $description) : void; /** * Returns the package homepage * * @return ?string */ public function getHomepage() : ?string; /** * Set the homepage */ public function setHomepage(string $homepage) : void; /** * Returns an array of authors of the package * * Each item can contain name/homepage/email keys * * @return array */ public function getAuthors() : array; /** * Set the authors * * @param array $authors */ public function setAuthors(array $authors) : void; /** * Returns the support information * * @return array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string, security?: string} */ public function getSupport() : array; /** * Set the support information * * @param array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string, security?: string} $support */ public function setSupport(array $support) : void; /** * Returns an array of funding options for the package * * Each item will contain type and url keys * * @return array */ public function getFunding() : array; /** * Set the funding * * @param array $funding */ public function setFunding(array $funding) : void; /** * Returns if the package is abandoned or not */ public function isAbandoned() : bool; /** * If the package is abandoned and has a suggested replacement, this method returns it */ public function getReplacementPackage() : ?string; /** * @param bool|string $abandoned */ public function setAbandoned($abandoned) : void; /** * Returns default base filename for archive * * @return ?string */ public function getArchiveName() : ?string; /** * Sets default base filename for archive */ public function setArchiveName(string $name) : void; /** * Returns a list of patterns to exclude from package archives * * @return string[] */ public function getArchiveExcludes() : array; /** * Sets a list of patterns to be excluded from archives * * @param string[] $excludes */ public function setArchiveExcludes(array $excludes) : void; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Downloader\DownloadManager; use Composer\Package\RootPackageInterface; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Loop; use Composer\Util\SyncHelper; use Composer\Json\JsonFile; use Composer\Package\CompletePackageInterface; /** * @author Matthieu Moquet * @author Till Klampaeckel */ class ArchiveManager { /** @var DownloadManager */ protected $downloadManager; /** @var Loop */ protected $loop; /** * @var ArchiverInterface[] */ protected $archivers = []; /** * @var bool */ protected $overwriteFiles = \true; /** * @param DownloadManager $downloadManager A manager used to download package sources */ public function __construct(DownloadManager $downloadManager, Loop $loop) { $this->downloadManager = $downloadManager; $this->loop = $loop; } public function addArchiver(\Composer\Package\Archiver\ArchiverInterface $archiver) : void { $this->archivers[] = $archiver; } /** * Set whether existing archives should be overwritten * * @param bool $overwriteFiles New setting * * @return $this */ public function setOverwriteFiles(bool $overwriteFiles) : self { $this->overwriteFiles = $overwriteFiles; return $this; } /** * @return array * @internal */ public function getPackageFilenameParts(CompletePackageInterface $package) : array { $baseName = $package->getArchiveName(); if (null === $baseName) { $baseName = Preg::replace('#[^a-z0-9-_]#i', '-', $package->getName()); } $parts = ['base' => $baseName]; $distReference = $package->getDistReference(); if (null !== $distReference && Preg::isMatch('{^[a-f0-9]{40}$}', $distReference)) { $parts['dist_reference'] = $distReference; $parts['dist_type'] = $package->getDistType(); } else { $parts['version'] = $package->getPrettyVersion(); $parts['dist_reference'] = $distReference; } $sourceReference = $package->getSourceReference(); if (null !== $sourceReference) { $parts['source_reference'] = \substr(\hash('sha1', $sourceReference), 0, 6); } $parts = \array_filter($parts, function (?string $part) { return $part !== null; }); foreach ($parts as $key => $part) { $parts[$key] = \str_replace('/', '-', $part); } return $parts; } /** * @param array $parts * * @return string * @internal */ public function getPackageFilenameFromParts(array $parts) : string { return \implode('-', $parts); } /** * Generate a distinct filename for a particular version of a package. * * @param CompletePackageInterface $package The package to get a name for * * @return string A filename without an extension */ public function getPackageFilename(CompletePackageInterface $package) : string { return $this->getPackageFilenameFromParts($this->getPackageFilenameParts($package)); } /** * Create an archive of the specified package. * * @param CompletePackageInterface $package The package to archive * @param string $format The format of the archive (zip, tar, ...) * @param string $targetDir The directory where to build the archive * @param string|null $fileName The relative file name to use for the archive, or null to generate * the package name. Note that the format will be appended to this name * @param bool $ignoreFilters Ignore filters when looking for files in the package * @throws \InvalidArgumentException * @throws \RuntimeException * @return string The path of the created archive */ public function archive(CompletePackageInterface $package, string $format, string $targetDir, ?string $fileName = null, bool $ignoreFilters = \false) : string { if (empty($format)) { throw new \InvalidArgumentException('Format must be specified'); } // Search for the most appropriate archiver $usableArchiver = null; foreach ($this->archivers as $archiver) { if ($archiver->supports($format, $package->getSourceType())) { $usableArchiver = $archiver; break; } } // Checks the format/source type are supported before downloading the package if (null === $usableArchiver) { throw new \RuntimeException(\sprintf('No archiver found to support %s format', $format)); } $filesystem = new Filesystem(); if ($package instanceof RootPackageInterface) { $sourcePath = \realpath('.'); } else { // Directory used to download the sources $sourcePath = \sys_get_temp_dir() . '/composer_archive' . \bin2hex(\random_bytes(5)); $filesystem->ensureDirectoryExists($sourcePath); try { // Download sources $promise = $this->downloadManager->download($package, $sourcePath); SyncHelper::await($this->loop, $promise); $promise = $this->downloadManager->install($package, $sourcePath); SyncHelper::await($this->loop, $promise); } catch (\Exception $e) { $filesystem->removeDirectory($sourcePath); throw $e; } // Check exclude from downloaded composer.json if (\file_exists($composerJsonPath = $sourcePath . '/composer.json')) { $jsonFile = new JsonFile($composerJsonPath); $jsonData = $jsonFile->read(); if (!empty($jsonData['archive']['name'])) { $package->setArchiveName($jsonData['archive']['name']); } if (!empty($jsonData['archive']['exclude'])) { $package->setArchiveExcludes($jsonData['archive']['exclude']); } } } $supportedFormats = $this->getSupportedFormats(); $packageNameParts = null === $fileName ? $this->getPackageFilenameParts($package) : ['base' => $fileName]; $packageName = $this->getPackageFilenameFromParts($packageNameParts); $excludePatterns = $this->buildExcludePatterns($packageNameParts, $supportedFormats); // Archive filename $filesystem->ensureDirectoryExists($targetDir); $target = \realpath($targetDir) . '/' . $packageName . '.' . $format; $filesystem->ensureDirectoryExists(\dirname($target)); if (!$this->overwriteFiles && \file_exists($target)) { return $target; } // Create the archive $tempTarget = \sys_get_temp_dir() . '/composer_archive' . \bin2hex(\random_bytes(5)) . '.' . $format; $filesystem->ensureDirectoryExists(\dirname($tempTarget)); $archivePath = $usableArchiver->archive($sourcePath, $tempTarget, $format, \array_merge($excludePatterns, $package->getArchiveExcludes()), $ignoreFilters); $filesystem->rename($archivePath, $target); // cleanup temporary download if (!$package instanceof RootPackageInterface) { $filesystem->removeDirectory($sourcePath); } $filesystem->remove($tempTarget); return $target; } /** * @param string[] $parts * @param string[] $formats * * @return string[] */ private function buildExcludePatterns(array $parts, array $formats) : array { $base = $parts['base']; if (\count($parts) > 1) { $base .= '-*'; } $patterns = []; foreach ($formats as $format) { $patterns[] = "{$base}.{$format}"; } return $patterns; } /** * @return string[] */ private function getSupportedFormats() : array { // The problem is that the \Composer\Package\Archiver\ArchiverInterface // doesn't provide method to get the supported formats. // Supported formats are also hard-coded into the description of the // --format option. // See \Composer\Command\ArchiveCommand::configure(). $formats = []; foreach ($this->archivers as $archiver) { $items = []; switch (\get_class($archiver)) { case \Composer\Package\Archiver\ZipArchiver::class: $items = ['zip']; break; case \Composer\Package\Archiver\PharArchiver::class: $items = ['zip', 'tar', 'tar.gz', 'tar.bz2']; break; } $formats = \array_merge($formats, $items); } return \array_unique($formats); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use FilesystemIterator; use FilterIterator; use Iterator; use _ContaoManager\Symfony\Component\Finder\Finder; use _ContaoManager\Symfony\Component\Finder\SplFileInfo; /** * A Symfony Finder wrapper which locates files that should go into archives * * Handles .gitignore, .gitattributes and .hgignore files as well as composer's * own exclude rules from composer.json * * @author Nils Adermann * @phpstan-extends FilterIterator> */ class ArchivableFilesFinder extends FilterIterator { /** * @var Finder */ protected $finder; /** * Initializes the internal Symfony Finder with appropriate filters * * @param string $sources Path to source files to be archived * @param string[] $excludes Composer's own exclude rules from composer.json * @param bool $ignoreFilters Ignore filters when looking for files */ public function __construct(string $sources, array $excludes, bool $ignoreFilters = \false) { $fs = new Filesystem(); $sourcesRealPath = \realpath($sources); if ($sourcesRealPath === \false) { throw new \RuntimeException('Could not realpath() the source directory "' . $sources . '"'); } $sources = $fs->normalizePath($sourcesRealPath); if ($ignoreFilters) { $filters = []; } else { $filters = [new \Composer\Package\Archiver\GitExcludeFilter($sources), new \Composer\Package\Archiver\ComposerExcludeFilter($sources, $excludes)]; } $this->finder = new Finder(); $filter = static function (\SplFileInfo $file) use($sources, $filters, $fs) : bool { $realpath = $file->getRealPath(); if ($realpath === \false) { return \false; } if ($file->isLink() && \strpos($realpath, $sources) !== 0) { return \false; } $relativePath = Preg::replace('#^' . \preg_quote($sources, '#') . '#', '', $fs->normalizePath($realpath)); $exclude = \false; foreach ($filters as $filter) { $exclude = $filter->filter($relativePath, $exclude); } return !$exclude; }; $this->finder->in($sources)->filter($filter)->ignoreVCS(\true)->ignoreDotFiles(\false)->sortByName(); parent::__construct($this->finder->getIterator()); } public function accept() : bool { /** @var SplFileInfo $current */ $current = $this->getInnerIterator()->current(); if (!$current->isDir()) { return \true; } $iterator = new FilesystemIterator((string) $current, FilesystemIterator::SKIP_DOTS); return !$iterator->valid(); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * @author Till Klampaeckel * @author Nils Adermann * @author Matthieu Moquet */ class PharArchiver implements \Composer\Package\Archiver\ArchiverInterface { /** @var array */ protected static $formats = ['zip' => \Phar::ZIP, 'tar' => \Phar::TAR, 'tar.gz' => \Phar::TAR, 'tar.bz2' => \Phar::TAR]; /** @var array */ protected static $compressFormats = ['tar.gz' => \Phar::GZ, 'tar.bz2' => \Phar::BZ2]; /** * @inheritDoc */ public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = \false) : string { $sources = \realpath($sources); // Phar would otherwise load the file which we don't want if (\file_exists($target)) { \unlink($target); } try { $filename = \substr($target, 0, \strrpos($target, $format) - 1); // Check if compress format if (isset(static::$compressFormats[$format])) { // Current compress format supported base on tar $target = $filename . '.tar'; } $phar = new \PharData($target, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_FILEINFO, '', static::$formats[$format]); $files = new \Composer\Package\Archiver\ArchivableFilesFinder($sources, $excludes, $ignoreFilters); $filesOnly = new \Composer\Package\Archiver\ArchivableFilesFilter($files); $phar->buildFromIterator($filesOnly, $sources); $filesOnly->addEmptyDir($phar, $sources); if (isset(static::$compressFormats[$format])) { // Check can be compressed? if (!$phar->canCompress(static::$compressFormats[$format])) { throw new \RuntimeException(\sprintf('Can not compress to %s format', $format)); } // Delete old tar \unlink($target); // Compress the new tar $phar->compress(static::$compressFormats[$format]); // Make the correct filename $target = $filename . '.' . $format; } return $target; } catch (\UnexpectedValueException $e) { $message = \sprintf("Could not create archive '%s' from '%s': %s", $target, $sources, $e->getMessage()); throw new \RuntimeException($message, $e->getCode(), $e); } } /** * @inheritDoc */ public function supports(string $format, ?string $sourceType) : bool { return isset(static::$formats[$format]); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Finder; /** * @author Nils Adermann */ abstract class BaseExcludeFilter { /** * @var string */ protected $sourcePath; /** * @var array array of [$pattern, $negate, $stripLeadingSlash] arrays */ protected $excludePatterns; /** * @param string $sourcePath Directory containing sources to be filtered */ public function __construct(string $sourcePath) { $this->sourcePath = $sourcePath; $this->excludePatterns = []; } /** * Checks the given path against all exclude patterns in this filter * * Negated patterns overwrite exclude decisions of previous filters. * * @param string $relativePath The file's path relative to the sourcePath * @param bool $exclude Whether a previous filter wants to exclude this file * * @return bool Whether the file should be excluded */ public function filter(string $relativePath, bool $exclude) : bool { foreach ($this->excludePatterns as $patternData) { [$pattern, $negate, $stripLeadingSlash] = $patternData; if ($stripLeadingSlash) { $path = \substr($relativePath, 1); } else { $path = $relativePath; } try { if (Preg::isMatch($pattern, $path)) { $exclude = !$negate; } } catch (\RuntimeException $e) { // suppressed } } return $exclude; } /** * Processes a file containing exclude rules of different formats per line * * @param string[] $lines A set of lines to be parsed * @param callable $lineParser The parser to be used on each line * * @return array Exclude patterns to be used in filter() */ protected function parseLines(array $lines, callable $lineParser) : array { return \array_filter(\array_map(static function ($line) use($lineParser) { $line = \trim($line); if (!$line || 0 === \strpos($line, '#')) { return null; } return $lineParser($line); }, $lines), static function ($pattern) : bool { return $pattern !== null; }); } /** * Generates a set of exclude patterns for filter() from gitignore rules * * @param string[] $rules A list of exclude rules in gitignore syntax * * @return array Exclude patterns */ protected function generatePatterns(array $rules) : array { $patterns = []; foreach ($rules as $rule) { $patterns[] = $this->generatePattern($rule); } return $patterns; } /** * Generates an exclude pattern for filter() from a gitignore rule * * @param string $rule An exclude rule in gitignore syntax * * @return array{0: non-empty-string, 1: bool, 2: bool} An exclude pattern */ protected function generatePattern(string $rule) : array { $negate = \false; $pattern = ''; if ($rule !== '' && $rule[0] === '!') { $negate = \true; $rule = \ltrim($rule, '!'); } $firstSlashPosition = \strpos($rule, '/'); if (0 === $firstSlashPosition) { $pattern = '^/'; } elseif (\false === $firstSlashPosition || \strlen($rule) - 1 === $firstSlashPosition) { $pattern = '/'; } $rule = \trim($rule, '/'); // remove delimiters as well as caret (^) and dollar sign ($) from the regex $rule = \substr(Finder\Glob::toRegex($rule), 2, -2); return ['{' . $pattern . $rule . '(?=$|/)}', $negate, \false]; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use FilterIterator; use Iterator; use PharData; use SplFileInfo; /** * @phpstan-extends FilterIterator> */ class ArchivableFilesFilter extends FilterIterator { /** @var string[] */ private $dirs = []; /** * @return bool true if the current element is acceptable, otherwise false. */ public function accept() : bool { $file = $this->getInnerIterator()->current(); if ($file->isDir()) { $this->dirs[] = (string) $file; return \false; } return \true; } public function addEmptyDir(PharData $phar, string $sources) : void { foreach ($this->dirs as $filepath) { $localname = \str_replace($sources . "/", '', $filepath); $phar->addEmptyDir($localname); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Pcre\Preg; /** * An exclude filter that processes gitattributes * * It respects export-ignore git attributes * * @author Nils Adermann */ class GitExcludeFilter extends \Composer\Package\Archiver\BaseExcludeFilter { /** * Parses .gitattributes if it exists */ public function __construct(string $sourcePath) { parent::__construct($sourcePath); if (\file_exists($sourcePath . '/.gitattributes')) { $this->excludePatterns = \array_merge($this->excludePatterns, $this->parseLines(\file($sourcePath . '/.gitattributes'), [$this, 'parseGitAttributesLine'])); } } /** * Callback parser which finds export-ignore rules in git attribute lines * * @param string $line A line from .gitattributes * * @return array{0: string, 1: bool, 2: bool}|null An exclude pattern for filter() */ public function parseGitAttributesLine(string $line) : ?array { $parts = Preg::split('#\\s+#', $line); if (\count($parts) === 2 && $parts[1] === 'export-ignore') { return $this->generatePattern($parts[0]); } if (\count($parts) === 2 && $parts[1] === '-export-ignore') { return $this->generatePattern('!' . $parts[0]); } return null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * An exclude filter which processes composer's own exclude rules * * @author Nils Adermann */ class ComposerExcludeFilter extends \Composer\Package\Archiver\BaseExcludeFilter { /** * @param string $sourcePath Directory containing sources to be filtered * @param string[] $excludeRules An array of exclude rules from composer.json */ public function __construct(string $sourcePath, array $excludeRules) { parent::__construct($sourcePath); $this->excludePatterns = $this->generatePatterns($excludeRules); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * @author Till Klampaeckel * @author Matthieu Moquet * @author Nils Adermann */ interface ArchiverInterface { /** * Create an archive from the sources. * * @param string $sources The sources directory * @param string $target The target file * @param string $format The format used for archive * @param string[] $excludes A list of patterns for files to exclude * @param bool $ignoreFilters Whether to ignore filters when looking for files * * @return string The path to the written archive file */ public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = \false) : string; /** * Format supported by the archiver. * * @param string $format The archive format * @param ?string $sourceType The source type (git, svn, hg, etc.) * * @return bool true if the format is supported by the archiver */ public function supports(string $format, ?string $sourceType) : bool; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Util\Filesystem; use Composer\Util\Platform; use ZipArchive; /** * @author Jan Prieser */ class ZipArchiver implements \Composer\Package\Archiver\ArchiverInterface { /** @var array */ protected static $formats = ['zip' => \true]; /** * @inheritDoc */ public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = \false) : string { $fs = new Filesystem(); $sourcesRealpath = \realpath($sources); if (\false !== $sourcesRealpath) { $sources = $sourcesRealpath; } unset($sourcesRealpath); $sources = $fs->normalizePath($sources); $zip = new ZipArchive(); $res = $zip->open($target, ZipArchive::CREATE); if ($res === \true) { $files = new \Composer\Package\Archiver\ArchivableFilesFinder($sources, $excludes, $ignoreFilters); foreach ($files as $file) { /** @var \Symfony\Component\Finder\SplFileInfo $file */ $filepath = $file->getPathname(); $relativePath = $file->getRelativePathname(); if (Platform::isWindows()) { $relativePath = \strtr($relativePath, '\\', '/'); } if ($file->isDir()) { $zip->addEmptyDir($relativePath); } else { $zip->addFile($filepath, $relativePath); } /** * setExternalAttributesName() is only available with libzip 0.11.2 or above */ if (\method_exists($zip, 'setExternalAttributesName')) { $perms = \fileperms($filepath); /** * Ensure to preserve the permission umasks for the filepath in the archive. */ $zip->setExternalAttributesName($relativePath, ZipArchive::OPSYS_UNIX, $perms << 16); } } if ($zip->close()) { return $target; } } $message = \sprintf("Could not create archive '%s' from '%s': %s", $target, $sources, $zip->getStatusString()); throw new \RuntimeException($message); } /** * @inheritDoc */ public function supports(string $format, ?string $sourceType) : bool { return isset(static::$formats[$format]) && $this->compressionAvailable(); } private function compressionAvailable() : bool { return \class_exists('ZipArchive'); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * @author Jordi Boggiano */ class CompleteAliasPackage extends \Composer\Package\AliasPackage implements \Composer\Package\CompletePackageInterface { /** @var CompletePackage */ protected $aliasOf; /** * All descendants' constructors should call this parent constructor * * @param CompletePackage $aliasOf The package this package is an alias of * @param string $version The version the alias must report * @param string $prettyVersion The alias's non-normalized version */ public function __construct(\Composer\Package\CompletePackage $aliasOf, string $version, string $prettyVersion) { parent::__construct($aliasOf, $version, $prettyVersion); } /** * @return CompletePackage */ public function getAliasOf() { return $this->aliasOf; } public function getScripts() : array { return $this->aliasOf->getScripts(); } public function setScripts(array $scripts) : void { $this->aliasOf->setScripts($scripts); } public function getRepositories() : array { return $this->aliasOf->getRepositories(); } public function setRepositories(array $repositories) : void { $this->aliasOf->setRepositories($repositories); } public function getLicense() : array { return $this->aliasOf->getLicense(); } public function setLicense(array $license) : void { $this->aliasOf->setLicense($license); } public function getKeywords() : array { return $this->aliasOf->getKeywords(); } public function setKeywords(array $keywords) : void { $this->aliasOf->setKeywords($keywords); } public function getDescription() : ?string { return $this->aliasOf->getDescription(); } public function setDescription(?string $description) : void { $this->aliasOf->setDescription($description); } public function getHomepage() : ?string { return $this->aliasOf->getHomepage(); } public function setHomepage(?string $homepage) : void { $this->aliasOf->setHomepage($homepage); } public function getAuthors() : array { return $this->aliasOf->getAuthors(); } public function setAuthors(array $authors) : void { $this->aliasOf->setAuthors($authors); } public function getSupport() : array { return $this->aliasOf->getSupport(); } public function setSupport(array $support) : void { $this->aliasOf->setSupport($support); } public function getFunding() : array { return $this->aliasOf->getFunding(); } public function setFunding(array $funding) : void { $this->aliasOf->setFunding($funding); } public function isAbandoned() : bool { return $this->aliasOf->isAbandoned(); } public function getReplacementPackage() : ?string { return $this->aliasOf->getReplacementPackage(); } public function setAbandoned($abandoned) : void { $this->aliasOf->setAbandoned($abandoned); } public function getArchiveName() : ?string { return $this->aliasOf->getArchiveName(); } public function setArchiveName(?string $name) : void { $this->aliasOf->setArchiveName($name); } public function getArchiveExcludes() : array { return $this->aliasOf->getArchiveExcludes(); } public function setArchiveExcludes(array $excludes) : void { $this->aliasOf->setArchiveExcludes($excludes); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Semver\Constraint\Constraint; use Composer\Package\Version\VersionParser; /** * @author Jordi Boggiano */ class AliasPackage extends \Composer\Package\BasePackage { /** @var string */ protected $version; /** @var string */ protected $prettyVersion; /** @var bool */ protected $dev; /** @var bool */ protected $rootPackageAlias = \false; /** * @var string * @phpstan-var 'stable'|'RC'|'beta'|'alpha'|'dev' */ protected $stability; /** @var bool */ protected $hasSelfVersionRequires = \false; /** @var BasePackage */ protected $aliasOf; /** @var Link[] */ protected $requires; /** @var Link[] */ protected $devRequires; /** @var Link[] */ protected $conflicts; /** @var Link[] */ protected $provides; /** @var Link[] */ protected $replaces; /** * All descendants' constructors should call this parent constructor * * @param BasePackage $aliasOf The package this package is an alias of * @param string $version The version the alias must report * @param string $prettyVersion The alias's non-normalized version */ public function __construct(\Composer\Package\BasePackage $aliasOf, string $version, string $prettyVersion) { parent::__construct($aliasOf->getName()); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->aliasOf = $aliasOf; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; foreach (\Composer\Package\Link::$TYPES as $type) { $links = $aliasOf->{'get' . \ucfirst($type)}(); $this->{$type} = $this->replaceSelfVersionDependencies($links, $type); } } /** * @return BasePackage */ public function getAliasOf() { return $this->aliasOf; } /** * @inheritDoc */ public function getVersion() : string { return $this->version; } /** * @inheritDoc */ public function getStability() : string { return $this->stability; } /** * @inheritDoc */ public function getPrettyVersion() : string { return $this->prettyVersion; } /** * @inheritDoc */ public function isDev() : bool { return $this->dev; } /** * @inheritDoc */ public function getRequires() : array { return $this->requires; } /** * @inheritDoc * @return array */ public function getConflicts() : array { return $this->conflicts; } /** * @inheritDoc * @return array */ public function getProvides() : array { return $this->provides; } /** * @inheritDoc * @return array */ public function getReplaces() : array { return $this->replaces; } /** * @inheritDoc */ public function getDevRequires() : array { return $this->devRequires; } /** * Stores whether this is an alias created by an aliasing in the requirements of the root package or not * * Use by the policy for sorting manually aliased packages first, see #576 */ public function setRootPackageAlias(bool $value) : void { $this->rootPackageAlias = $value; } /** * @see setRootPackageAlias */ public function isRootPackageAlias() : bool { return $this->rootPackageAlias; } /** * @param Link[] $links * @param Link::TYPE_* $linkType * * @return Link[] */ protected function replaceSelfVersionDependencies(array $links, $linkType) : array { // for self.version requirements, we use the original package's branch name instead, to avoid leaking the magic dev-master-alias to users $prettyVersion = $this->prettyVersion; if ($prettyVersion === VersionParser::DEFAULT_BRANCH_ALIAS) { $prettyVersion = $this->aliasOf->getPrettyVersion(); } if (\in_array($linkType, [\Composer\Package\Link::TYPE_CONFLICT, \Composer\Package\Link::TYPE_PROVIDE, \Composer\Package\Link::TYPE_REPLACE], \true)) { $newLinks = []; foreach ($links as $link) { // link is self.version, but must be replacing also the replaced version if ('self.version' === $link->getPrettyConstraint()) { $newLinks[] = new \Composer\Package\Link($link->getSource(), $link->getTarget(), $constraint = new Constraint('=', $this->version), $linkType, $prettyVersion); $constraint->setPrettyString($prettyVersion); } } $links = \array_merge($links, $newLinks); } else { foreach ($links as $index => $link) { if ('self.version' === $link->getPrettyConstraint()) { if ($linkType === \Composer\Package\Link::TYPE_REQUIRE) { $this->hasSelfVersionRequires = \true; } $links[$index] = new \Composer\Package\Link($link->getSource(), $link->getTarget(), $constraint = new Constraint('=', $this->version), $linkType, $prettyVersion); $constraint->setPrettyString($prettyVersion); } } } return $links; } public function hasSelfVersionRequires() : bool { return $this->hasSelfVersionRequires; } public function __toString() : string { return parent::__toString() . ' (' . ($this->rootPackageAlias ? 'root ' : '') . 'alias of ' . $this->aliasOf->getVersion() . ')'; } /*************************************** * Wrappers around the aliased package * ***************************************/ public function getType() : string { return $this->aliasOf->getType(); } public function getTargetDir() : ?string { return $this->aliasOf->getTargetDir(); } public function getExtra() : array { return $this->aliasOf->getExtra(); } public function setInstallationSource(?string $type) : void { $this->aliasOf->setInstallationSource($type); } public function getInstallationSource() : ?string { return $this->aliasOf->getInstallationSource(); } public function getSourceType() : ?string { return $this->aliasOf->getSourceType(); } public function getSourceUrl() : ?string { return $this->aliasOf->getSourceUrl(); } public function getSourceUrls() : array { return $this->aliasOf->getSourceUrls(); } public function getSourceReference() : ?string { return $this->aliasOf->getSourceReference(); } public function setSourceReference(?string $reference) : void { $this->aliasOf->setSourceReference($reference); } public function setSourceMirrors(?array $mirrors) : void { $this->aliasOf->setSourceMirrors($mirrors); } public function getSourceMirrors() : ?array { return $this->aliasOf->getSourceMirrors(); } public function getDistType() : ?string { return $this->aliasOf->getDistType(); } public function getDistUrl() : ?string { return $this->aliasOf->getDistUrl(); } public function getDistUrls() : array { return $this->aliasOf->getDistUrls(); } public function getDistReference() : ?string { return $this->aliasOf->getDistReference(); } public function setDistReference(?string $reference) : void { $this->aliasOf->setDistReference($reference); } public function getDistSha1Checksum() : ?string { return $this->aliasOf->getDistSha1Checksum(); } public function setTransportOptions(array $options) : void { $this->aliasOf->setTransportOptions($options); } public function getTransportOptions() : array { return $this->aliasOf->getTransportOptions(); } public function setDistMirrors(?array $mirrors) : void { $this->aliasOf->setDistMirrors($mirrors); } public function getDistMirrors() : ?array { return $this->aliasOf->getDistMirrors(); } public function getAutoload() : array { return $this->aliasOf->getAutoload(); } public function getDevAutoload() : array { return $this->aliasOf->getDevAutoload(); } public function getIncludePaths() : array { return $this->aliasOf->getIncludePaths(); } public function getPhpExt() : ?array { return $this->aliasOf->getPhpExt(); } public function getReleaseDate() : ?\DateTimeInterface { return $this->aliasOf->getReleaseDate(); } public function getBinaries() : array { return $this->aliasOf->getBinaries(); } public function getSuggests() : array { return $this->aliasOf->getSuggests(); } public function getNotificationUrl() : ?string { return $this->aliasOf->getNotificationUrl(); } public function isDefaultBranch() : bool { return $this->aliasOf->isDefaultBranch(); } public function setDistUrl(?string $url) : void { $this->aliasOf->setDistUrl($url); } public function setDistType(?string $type) : void { $this->aliasOf->setDistType($type); } public function setSourceDistReferences(string $reference) : void { $this->aliasOf->setSourceDistReferences($reference); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Json\JsonFile; use Composer\Installer\InstallationManager; use Composer\Pcre\Preg; use Composer\Repository\InstalledRepository; use Composer\Repository\LockArrayRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RootPackageRepository; use Composer\Util\ProcessExecutor; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginInterface; use Composer\Util\Git as GitUtil; use Composer\IO\IOInterface; use _ContaoManager\Seld\JsonLint\ParsingException; /** * Reads/writes project lockfile (composer.lock). * * @author Konstantin Kudryashiv * @author Jordi Boggiano */ class Locker { /** @var JsonFile */ private $lockFile; /** @var InstallationManager */ private $installationManager; /** @var string */ private $hash; /** @var string */ private $contentHash; /** @var ArrayLoader */ private $loader; /** @var ArrayDumper */ private $dumper; /** @var ProcessExecutor */ private $process; /** @var mixed[]|null */ private $lockDataCache = null; /** @var bool */ private $virtualFileWritten = \false; /** * Initializes packages locker. * * @param JsonFile $lockFile lockfile loader * @param InstallationManager $installationManager installation manager instance * @param string $composerFileContents The contents of the composer file */ public function __construct(IOInterface $io, JsonFile $lockFile, InstallationManager $installationManager, string $composerFileContents, ?ProcessExecutor $process = null) { $this->lockFile = $lockFile; $this->installationManager = $installationManager; $this->hash = \hash('md5', $composerFileContents); $this->contentHash = self::getContentHash($composerFileContents); $this->loader = new ArrayLoader(null, \true); $this->dumper = new ArrayDumper(); $this->process = $process ?? new ProcessExecutor($io); } /** * @internal */ public function getJsonFile() : JsonFile { return $this->lockFile; } /** * Returns the md5 hash of the sorted content of the composer file. * * @param string $composerFileContents The contents of the composer file. */ public static function getContentHash(string $composerFileContents) : string { $content = JsonFile::parseJson($composerFileContents, 'composer.json'); $relevantKeys = ['name', 'version', 'require', 'require-dev', 'conflict', 'replace', 'provide', 'minimum-stability', 'prefer-stable', 'repositories', 'extra']; $relevantContent = []; foreach (\array_intersect($relevantKeys, \array_keys($content)) as $key) { $relevantContent[$key] = $content[$key]; } if (isset($content['config']['platform'])) { $relevantContent['config']['platform'] = $content['config']['platform']; } \ksort($relevantContent); return \hash('md5', JsonFile::encode($relevantContent, 0)); } /** * Checks whether locker has been locked (lockfile found). */ public function isLocked() : bool { if (!$this->virtualFileWritten && !$this->lockFile->exists()) { return \false; } $data = $this->getLockData(); return isset($data['packages']); } /** * Checks whether the lock file is still up to date with the current hash */ public function isFresh() : bool { $lock = $this->lockFile->read(); if (!empty($lock['content-hash'])) { // There is a content hash key, use that instead of the file hash return $this->contentHash === $lock['content-hash']; } // BC support for old lock files without content-hash if (!empty($lock['hash'])) { return $this->hash === $lock['hash']; } // should not be reached unless the lock file is corrupted, so assume it's out of date return \false; } /** * Searches and returns an array of locked packages, retrieved from registered repositories. * * @param bool $withDevReqs true to retrieve the locked dev packages * @throws \RuntimeException */ public function getLockedRepository(bool $withDevReqs = \false) : LockArrayRepository { $lockData = $this->getLockData(); $packages = new LockArrayRepository(); $lockedPackages = $lockData['packages']; if ($withDevReqs) { if (isset($lockData['packages-dev'])) { $lockedPackages = \array_merge($lockedPackages, $lockData['packages-dev']); } else { throw new \RuntimeException('The lock file does not contain require-dev information, run install with the --no-dev option or delete it and run composer update to generate a new lock file.'); } } if (empty($lockedPackages)) { return $packages; } if (isset($lockedPackages[0]['name'])) { $packageByName = []; foreach ($lockedPackages as $info) { $package = $this->loader->load($info); $packages->addPackage($package); $packageByName[$package->getName()] = $package; if ($package instanceof \Composer\Package\AliasPackage) { $packageByName[$package->getAliasOf()->getName()] = $package->getAliasOf(); } } if (isset($lockData['aliases'])) { foreach ($lockData['aliases'] as $alias) { if (isset($packageByName[$alias['package']])) { $aliasPkg = new \Composer\Package\CompleteAliasPackage($packageByName[$alias['package']], $alias['alias_normalized'], $alias['alias']); $aliasPkg->setRootPackageAlias(\true); $packages->addPackage($aliasPkg); } } } return $packages; } throw new \RuntimeException('Your composer.lock is invalid. Run "composer update" to generate a new one.'); } /** * @return string[] Names of dependencies installed through require-dev */ public function getDevPackageNames() : array { $names = []; $lockData = $this->getLockData(); if (isset($lockData['packages-dev'])) { foreach ($lockData['packages-dev'] as $package) { $names[] = \strtolower($package['name']); } } return $names; } /** * Returns the platform requirements stored in the lock file * * @param bool $withDevReqs if true, the platform requirements from the require-dev block are also returned * @return \Composer\Package\Link[] */ public function getPlatformRequirements(bool $withDevReqs = \false) : array { $lockData = $this->getLockData(); $requirements = []; if (!empty($lockData['platform'])) { $requirements = $this->loader->parseLinks('__root__', '1.0.0', \Composer\Package\Link::TYPE_REQUIRE, $lockData['platform'] ?? []); } if ($withDevReqs && !empty($lockData['platform-dev'])) { $devRequirements = $this->loader->parseLinks('__root__', '1.0.0', \Composer\Package\Link::TYPE_REQUIRE, $lockData['platform-dev'] ?? []); $requirements = \array_merge($requirements, $devRequirements); } return $requirements; } /** * @return key-of */ public function getMinimumStability() : string { $lockData = $this->getLockData(); return $lockData['minimum-stability'] ?? 'stable'; } /** * @return array */ public function getStabilityFlags() : array { $lockData = $this->getLockData(); return $lockData['stability-flags'] ?? []; } public function getPreferStable() : ?bool { $lockData = $this->getLockData(); // return null if not set to allow caller logic to choose the // right behavior since old lock files have no prefer-stable return $lockData['prefer-stable'] ?? null; } public function getPreferLowest() : ?bool { $lockData = $this->getLockData(); // return null if not set to allow caller logic to choose the // right behavior since old lock files have no prefer-lowest return $lockData['prefer-lowest'] ?? null; } /** * @return array */ public function getPlatformOverrides() : array { $lockData = $this->getLockData(); return $lockData['platform-overrides'] ?? []; } /** * @return string[][] * * @phpstan-return list */ public function getAliases() : array { $lockData = $this->getLockData(); return $lockData['aliases'] ?? []; } /** * @return string */ public function getPluginApi() { $lockData = $this->getLockData(); return $lockData['plugin-api-version'] ?? '1.1.0'; } /** * @return array */ public function getLockData() : array { if (null !== $this->lockDataCache) { return $this->lockDataCache; } if (!$this->lockFile->exists()) { throw new \LogicException('No lockfile found. Unable to read locked packages'); } return $this->lockDataCache = $this->lockFile->read(); } /** * Locks provided data into lockfile. * * @param PackageInterface[] $packages array of packages * @param PackageInterface[]|null $devPackages array of dev packages or null if installed without --dev * @param array $platformReqs array of package name => constraint for required platform packages * @param array $platformDevReqs array of package name => constraint for dev-required platform packages * @param string[][] $aliases array of aliases * @param array $stabilityFlags * @param array $platformOverrides * @param bool $write Whether to actually write data to disk, useful in tests and for --dry-run * * @phpstan-param list $aliases */ public function setLockData(array $packages, ?array $devPackages, array $platformReqs, array $platformDevReqs, array $aliases, string $minimumStability, array $stabilityFlags, bool $preferStable, bool $preferLowest, array $platformOverrides, bool $write = \true) : bool { // keep old default branch names normalized to DEFAULT_BRANCH_ALIAS for BC as that is how Composer 1 outputs the lock file // when loading the lock file the version is anyway ignored in Composer 2, so it has no adverse effect $aliases = \array_map(static function ($alias) : array { if (\in_array($alias['version'], ['dev-master', 'dev-trunk', 'dev-default'], \true)) { $alias['version'] = VersionParser::DEFAULT_BRANCH_ALIAS; } return $alias; }, $aliases); $lock = ['_readme' => ['This file locks the dependencies of your project to a known state', 'Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies', 'This file is @gener' . 'ated automatically'], 'content-hash' => $this->contentHash, 'packages' => $this->lockPackages($packages), 'packages-dev' => null, 'aliases' => $aliases, 'minimum-stability' => $minimumStability, 'stability-flags' => $stabilityFlags, 'prefer-stable' => $preferStable, 'prefer-lowest' => $preferLowest]; if (null !== $devPackages) { $lock['packages-dev'] = $this->lockPackages($devPackages); } $lock['platform'] = $platformReqs; $lock['platform-dev'] = $platformDevReqs; if (\count($platformOverrides) > 0) { $lock['platform-overrides'] = $platformOverrides; } $lock['plugin-api-version'] = PluginInterface::PLUGIN_API_VERSION; $lock = $this->fixupJsonDataType($lock); try { $isLocked = $this->isLocked(); } catch (ParsingException $e) { $isLocked = \false; } if (!$isLocked || $lock !== $this->getLockData()) { if ($write) { $this->lockFile->write($lock); $this->lockDataCache = null; $this->virtualFileWritten = \false; } else { $this->virtualFileWritten = \true; $this->lockDataCache = JsonFile::parseJson(JsonFile::encode($lock)); } return \true; } return \false; } /** * Updates the lock file's hash in-place from a given composer.json's JsonFile * * This does not reload or require any packages, and retains the filemtime of the lock file. * * Use this only to update the lock file hash after updating a composer.json in ways that are guaranteed NOT to impact the dependency resolution. * * This is a risky method, use carefully. * * @param (callable(array): array)|null $dataProcessor Receives the lock data and can process it before it gets written to disk */ public function updateHash(JsonFile $composerJson, ?callable $dataProcessor = null) : void { $contents = \file_get_contents($composerJson->getPath()); if (\false === $contents) { throw new \RuntimeException('Unable to read ' . $composerJson->getPath() . ' contents to update the lock file hash.'); } $lockMtime = \filemtime($this->lockFile->getPath()); $lockData = $this->lockFile->read(); $lockData['content-hash'] = \Composer\Package\Locker::getContentHash($contents); if ($dataProcessor !== null) { $lockData = $dataProcessor($lockData); } $this->lockFile->write($this->fixupJsonDataType($lockData)); $this->lockDataCache = null; $this->virtualFileWritten = \false; if (\is_int($lockMtime)) { @\touch($this->lockFile->getPath(), $lockMtime); } } /** * Ensures correct data types and ordering for the JSON lock format * * @param array $lockData * @return array */ private function fixupJsonDataType(array $lockData) : array { foreach (['stability-flags', 'platform', 'platform-dev'] as $key) { if (isset($lockData[$key]) && \is_array($lockData[$key]) && \count($lockData[$key]) === 0) { $lockData[$key] = new \stdClass(); } } if (\is_array($lockData['stability-flags'])) { \ksort($lockData['stability-flags']); } return $lockData; } /** * @param PackageInterface[] $packages * * @return mixed[][] * * @phpstan-return list> */ private function lockPackages(array $packages) : array { $locked = []; foreach ($packages as $package) { if ($package instanceof \Composer\Package\AliasPackage) { continue; } $name = $package->getPrettyName(); $version = $package->getPrettyVersion(); if (!$name || !$version) { throw new \LogicException(\sprintf('Package "%s" has no version or name and can not be locked', $package)); } $spec = $this->dumper->dump($package); unset($spec['version_normalized']); // always move time to the end of the package definition $time = $spec['time'] ?? null; unset($spec['time']); if ($package->isDev() && $package->getInstallationSource() === 'source') { // use the exact commit time of the current reference if it's a dev package $time = $this->getPackageTime($package) ?: $time; } if (null !== $time) { $spec['time'] = $time; } unset($spec['installation-source']); $locked[] = $spec; } \usort($locked, static function ($a, $b) { $comparison = \strcmp($a['name'], $b['name']); if (0 !== $comparison) { return $comparison; } // If it is the same package, compare the versions to make the order deterministic return \strcmp($a['version'], $b['version']); }); return $locked; } /** * Returns the packages's datetime for its source reference. * * @param PackageInterface $package The package to scan. * @return string|null The formatted datetime or null if none was found. */ private function getPackageTime(\Composer\Package\PackageInterface $package) : ?string { if (!\function_exists('proc_open')) { return null; } $path = $this->installationManager->getInstallPath($package); if ($path === null) { return null; } $path = \realpath($path); $sourceType = $package->getSourceType(); $datetime = null; if ($path && \in_array($sourceType, ['git', 'hg'])) { $sourceRef = $package->getSourceReference() ?: $package->getDistReference(); switch ($sourceType) { case 'git': GitUtil::cleanEnv(); $command = \array_merge(['git', 'log', '-n1', '--pretty=%ct', (string) $sourceRef], GitUtil::getNoShowSignatureFlags($this->process)); if (0 === $this->process->execute($command, $output, $path) && Preg::isMatch('{^\\s*\\d+\\s*$}', $output)) { $datetime = new \DateTime('@' . \trim($output), new \DateTimeZone('UTC')); } break; case 'hg': if (0 === $this->process->execute(['hg', 'log', '--template', '{date|hgdate}', '-r', (string) $sourceRef], $output, $path) && Preg::isMatch('{^\\s*(\\d+)\\s*}', $output, $match)) { $datetime = new \DateTime('@' . $match[1], new \DateTimeZone('UTC')); } break; } } return $datetime ? $datetime->format(\DATE_RFC3339) : null; } /** * @return array */ public function getMissingRequirementInfo(\Composer\Package\RootPackageInterface $package, bool $includeDev) : array { $missingRequirementInfo = []; $missingRequirements = \false; $sets = [['repo' => $this->getLockedRepository(\false), 'method' => 'getRequires', 'description' => 'Required']]; if ($includeDev === \true) { $sets[] = ['repo' => $this->getLockedRepository(\true), 'method' => 'getDevRequires', 'description' => 'Required (in require-dev)']; } $rootRepo = new RootPackageRepository(clone $package); foreach ($sets as $set) { $installedRepo = new InstalledRepository([$set['repo'], $rootRepo]); foreach (\call_user_func([$package, $set['method']]) as $link) { if (PlatformRepository::isPlatformPackage($link->getTarget())) { continue; } if ($link->getPrettyConstraint() === 'self.version') { continue; } if ($installedRepo->findPackagesWithReplacersAndProviders($link->getTarget(), $link->getConstraint()) === []) { $results = $installedRepo->findPackagesWithReplacersAndProviders($link->getTarget()); if ($results !== []) { $provider = \reset($results); $description = $provider->getPrettyVersion(); if ($provider->getName() !== $link->getTarget()) { foreach (['getReplaces' => 'replaced as %s by %s', 'getProvides' => 'provided as %s by %s'] as $method => $text) { foreach (\call_user_func([$provider, $method]) as $providerLink) { if ($providerLink->getTarget() === $link->getTarget()) { $description = \sprintf($text, $providerLink->getPrettyConstraint(), $provider->getPrettyName() . ' ' . $provider->getPrettyVersion()); break 2; } } } } $missingRequirementInfo[] = '- ' . $set['description'] . ' package "' . $link->getTarget() . '" is in the lock file as "' . $description . '" but that does not satisfy your constraint "' . $link->getPrettyConstraint() . '".'; } else { $missingRequirementInfo[] = '- ' . $set['description'] . ' package "' . $link->getTarget() . '" is not present in the lock file.'; } $missingRequirements = \true; } } } if ($missingRequirements) { $missingRequirementInfo[] = 'This usually happens when composer files are incorrectly merged or the composer.json file is manually edited.'; $missingRequirementInfo[] = 'Read more about correctly resolving merge conflicts https://getcomposer.org/doc/articles/resolving-merge-conflicts.md'; $missingRequirementInfo[] = 'and prefer using the "require" command over editing the composer.json file directly https://getcomposer.org/doc/03-cli.md#require-r'; } return $missingRequirementInfo; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Repository\RepositoryInterface; /** * Defines the essential information a package has that is used during solving/installation * * PackageInterface & derivatives are considered internal, you may use them in type hints but extending/implementing them is not recommended and not supported. Things may change without notice. * * @author Jordi Boggiano * * @phpstan-type AutoloadRules array{psr-0?: array, psr-4?: array, classmap?: list, files?: list, exclude-from-classmap?: list} * @phpstan-type DevAutoloadRules array{psr-0?: array, psr-4?: array, classmap?: list, files?: list} * @phpstan-type PhpExtConfig array{extension-name?: string, priority?: int, support-zts?: bool, support-nts?: bool, build-path?: string|null, download-url-method?: string, os-families?: non-empty-list, os-families-exclude?: non-empty-list, configure-options?: list} */ interface PackageInterface { public const DISPLAY_SOURCE_REF_IF_DEV = 0; public const DISPLAY_SOURCE_REF = 1; public const DISPLAY_DIST_REF = 2; /** * Returns the package's name without version info, thus not a unique identifier * * @return string package name */ public function getName() : string; /** * Returns the package's pretty (i.e. with proper case) name * * @return string package name */ public function getPrettyName() : string; /** * Returns a set of names that could refer to this package * * No version or release type information should be included in any of the * names. Provided or replaced package names need to be returned as well. * * @param bool $provides Whether provided names should be included * * @return string[] An array of strings referring to this package */ public function getNames(bool $provides = \true) : array; /** * Allows the solver to set an id for this package to refer to it. */ public function setId(int $id) : void; /** * Retrieves the package's id set through setId * * @return int The previously set package id */ public function getId() : int; /** * Returns whether the package is a development virtual package or a concrete one */ public function isDev() : bool; /** * Returns the package type, e.g. library * * @return string The package type */ public function getType() : string; /** * Returns the package targetDir property * * @return ?string The package targetDir */ public function getTargetDir() : ?string; /** * Returns the package extra data * * @return mixed[] The package extra data */ public function getExtra() : array; /** * Sets source from which this package was installed (source/dist). * * @param ?string $type source/dist * @phpstan-param 'source'|'dist'|null $type */ public function setInstallationSource(?string $type) : void; /** * Returns source from which this package was installed (source/dist). * * @return ?string source/dist * @phpstan-return 'source'|'dist'|null */ public function getInstallationSource() : ?string; /** * Returns the repository type of this package, e.g. git, svn * * @return ?string The repository type */ public function getSourceType() : ?string; /** * Returns the repository url of this package, e.g. git://github.com/naderman/composer.git * * @return ?string The repository url */ public function getSourceUrl() : ?string; /** * Returns the repository urls of this package including mirrors, e.g. git://github.com/naderman/composer.git * * @return list */ public function getSourceUrls() : array; /** * Returns the repository reference of this package, e.g. master, 1.0.0 or a commit hash for git * * @return ?string The repository reference */ public function getSourceReference() : ?string; /** * Returns the source mirrors of this package * * @return ?list */ public function getSourceMirrors() : ?array; /** * @param null|list $mirrors */ public function setSourceMirrors(?array $mirrors) : void; /** * Returns the type of the distribution archive of this version, e.g. zip, tarball * * @return ?string The repository type */ public function getDistType() : ?string; /** * Returns the url of the distribution archive of this version * * @return ?non-empty-string */ public function getDistUrl() : ?string; /** * Returns the urls of the distribution archive of this version, including mirrors * * @return non-empty-string[] */ public function getDistUrls() : array; /** * Returns the reference of the distribution archive of this version, e.g. master, 1.0.0 or a commit hash for git * * @return ?string */ public function getDistReference() : ?string; /** * Returns the sha1 checksum for the distribution archive of this version * * Can be an empty string which should be treated as null * * @return ?string */ public function getDistSha1Checksum() : ?string; /** * Returns the dist mirrors of this package * * @return ?list */ public function getDistMirrors() : ?array; /** * @param null|list $mirrors */ public function setDistMirrors(?array $mirrors) : void; /** * Returns the version of this package * * @return string version */ public function getVersion() : string; /** * Returns the pretty (i.e. non-normalized) version string of this package * * @return string version */ public function getPrettyVersion() : string; /** * Returns the pretty version string plus a git or hg commit hash of this package * * @see getPrettyVersion * * @param bool $truncate If the source reference is a sha1 hash, truncate it * @param int $displayMode One of the DISPLAY_ constants on this interface determining display of references * @return string version * * @phpstan-param self::DISPLAY_SOURCE_REF_IF_DEV|self::DISPLAY_SOURCE_REF|self::DISPLAY_DIST_REF $displayMode */ public function getFullPrettyVersion(bool $truncate = \true, int $displayMode = self::DISPLAY_SOURCE_REF_IF_DEV) : string; /** * Returns the release date of the package * * @return ?\DateTimeInterface */ public function getReleaseDate() : ?\DateTimeInterface; /** * Returns the stability of this package: one of (dev, alpha, beta, RC, stable) * * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' */ public function getStability() : string; /** * Returns a set of links to packages which need to be installed before * this package can be installed * * @return array A map of package links defining required packages, indexed by the require package's name */ public function getRequires() : array; /** * Returns a set of links to packages which must not be installed at the * same time as this package * * @return Link[] An array of package links defining conflicting packages */ public function getConflicts() : array; /** * Returns a set of links to virtual packages that are provided through * this package * * @return Link[] An array of package links defining provided packages */ public function getProvides() : array; /** * Returns a set of links to packages which can alternatively be * satisfied by installing this package * * @return Link[] An array of package links defining replaced packages */ public function getReplaces() : array; /** * Returns a set of links to packages which are required to develop * this package. These are installed if in dev mode. * * @return array A map of package links defining packages required for development, indexed by the require package's name */ public function getDevRequires() : array; /** * Returns a set of package names and reasons why they are useful in * combination with this package. * * @return array An array of package suggestions with descriptions * @phpstan-return array */ public function getSuggests() : array; /** * Returns an associative array of autoloading rules * * {"": {""}} * * Type is either "psr-4", "psr-0", "classmap" or "files". Namespaces are mapped to * directories for autoloading using the type specified. * * @return array Mapping of autoloading rules * @phpstan-return AutoloadRules */ public function getAutoload() : array; /** * Returns an associative array of dev autoloading rules * * {"": {""}} * * Type is either "psr-4", "psr-0", "classmap" or "files". Namespaces are mapped to * directories for autoloading using the type specified. * * @return array Mapping of dev autoloading rules * @phpstan-return DevAutoloadRules */ public function getDevAutoload() : array; /** * Returns a list of directories which should get added to PHP's * include path. * * @return string[] */ public function getIncludePaths() : array; /** * Returns the settings for php extension packages * * @return array|null * * @phpstan-return PhpExtConfig|null */ public function getPhpExt() : ?array; /** * Stores a reference to the repository that owns the package */ public function setRepository(RepositoryInterface $repository) : void; /** * Returns a reference to the repository that owns the package * * @return ?RepositoryInterface */ public function getRepository() : ?RepositoryInterface; /** * Returns the package binaries * * @return string[] */ public function getBinaries() : array; /** * Returns package unique name, constructed from name and version. */ public function getUniqueName() : string; /** * Returns the package notification url * * @return ?string */ public function getNotificationUrl() : ?string; /** * Converts the package into a readable and unique string */ public function __toString() : string; /** * Converts the package into a pretty readable string */ public function getPrettyString() : string; public function isDefaultBranch() : bool; /** * Returns a list of options to download package dist files * * @return mixed[] */ public function getTransportOptions() : array; /** * Configures the list of options to download package dist files * * @param mixed[] $options */ public function setTransportOptions(array $options) : void; public function setSourceReference(?string $reference) : void; public function setDistUrl(?string $url) : void; public function setDistType(?string $type) : void; public function setDistReference(?string $reference) : void; /** * Set dist and source references and update dist URL for ones that contain a reference */ public function setSourceDistReferences(string $reference) : void; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Package\PackageInterface; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; use Composer\Pcre\Preg; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Intervals; use Composer\Util\Platform; /** * @author Jordi Boggiano * @internal */ class VersionBumper { /** * Given a constraint, this returns a new constraint with * the lower bound bumped to match the given package's version. * * For example: * * ^1.0 + 1.2.1 -> ^1.2.1 * * ^1.2 + 1.2.0 -> ^1.2 * * ^1.2.0 + 1.3.0 -> ^1.3.0 * * ^1.2 || ^2.3 + 1.3.0 -> ^1.3 || ^2.3 * * ^1.2 || ^2.3 + 2.4.0 -> ^1.2 || ^2.4 * * ^3@dev + 3.2.99999-dev -> ^3.2@dev * * ~2 + 2.0-beta.1 -> ~2 * * ~2.0.0 + 2.0.3 -> ~2.0.3 * * ~2.0 + 2.0.3 -> ^2.0.3 * * dev-master + dev-master -> dev-master * * * + 1.2.3 -> >=1.2.3 */ public function bumpRequirement(ConstraintInterface $constraint, PackageInterface $package) : string { $parser = new \Composer\Package\Version\VersionParser(); $prettyConstraint = $constraint->getPrettyString(); if (\str_starts_with($constraint->getPrettyString(), 'dev-')) { return $prettyConstraint; } $version = $package->getVersion(); if (\str_starts_with($package->getVersion(), 'dev-')) { $loader = new ArrayLoader($parser); $dumper = new ArrayDumper(); $extra = $loader->getBranchAlias($dumper->dump($package)); // dev packages without branch alias cannot be processed if (null === $extra || $extra === \Composer\Package\Version\VersionParser::DEFAULT_BRANCH_ALIAS) { return $prettyConstraint; } $version = $extra; } $intervals = Intervals::get($constraint); // complex constraints with branch names are not bumped if (\count($intervals['branches']['names']) > 0) { return $prettyConstraint; } $major = Preg::replace('{^(\\d+).*}', '$1', $version); $versionWithoutSuffix = Preg::replace('{(?:\\.(?:0|9999999))+(-dev)?$}', '', $version); $newPrettyConstraint = '^' . $versionWithoutSuffix; // not a simple stable version, abort if (!Preg::isMatch('{^\\^\\d+(\\.\\d+)*$}', $newPrettyConstraint)) { return $prettyConstraint; } $pattern = '{ (?<=,|\\ |\\||^) # leading separator (?P \\^v?' . $major . '(?:\\.\\d+)* # e.g. ^2.anything | ~v?' . $major . '(?:\\.\\d+){1,3} # e.g. ~2.2 or ~2.2.2 or ~2.2.2.2 | v?' . $major . '(?:\\.[*x])+ # e.g. 2.* or 2.*.* or 2.x.x.x etc | >=v?\\d(?:\\.\\d+)* # e.g. >=2 or >=1.2 etc | \\* # full wildcard ) (?=,|$|\\ |\\||@) # trailing separator }x'; if (Preg::isMatchAllWithOffsets($pattern, $prettyConstraint, $matches)) { $modified = $prettyConstraint; foreach (\array_reverse($matches['constraint']) as $match) { \assert(\is_string($match[0])); $suffix = ''; if (\substr_count($match[0], '.') === 2 && \substr_count($versionWithoutSuffix, '.') === 1) { $suffix = '.0'; } if (\str_starts_with($match[0], '~') && \substr_count($match[0], '.') !== 1) { // take as many version bits from the current version as we have in the constraint to bump it without making it more specific $versionBits = \explode('.', $versionWithoutSuffix); $versionBits = \array_pad($versionBits, \substr_count($match[0], '.') + 1, '0'); $replacement = '~' . \implode('.', \array_slice($versionBits, 0, \substr_count($match[0], '.') + 1)); } elseif ($match[0] === '*' || \str_starts_with($match[0], '>=')) { $replacement = '>=' . $versionWithoutSuffix . $suffix; } else { $replacement = $newPrettyConstraint . $suffix; } $modified = \substr_replace($modified, $replacement, $match[1], Platform::strlen($match[0])); } // if it is strictly equal to the previous one then no need to change anything $newConstraint = $parser->parseConstraints($modified); if (Intervals::isSubsetOf($newConstraint, $constraint) && Intervals::isSubsetOf($constraint, $newConstraint)) { return $prettyConstraint; } return $modified; } return $prettyConstraint; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Package\BasePackage; /** * @author Jordi Boggiano */ class StabilityFilter { /** * Checks if any of the provided package names in the given stability match the configured acceptable stability and flags * * @param int[] $acceptableStabilities array of stability => BasePackage::STABILITY_* value * @phpstan-param array, BasePackage::STABILITY_*> $acceptableStabilities * @param int[] $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array $stabilityFlags * @param string[] $names The package name(s) to check for stability flags * @param key-of $stability one of 'stable', 'RC', 'beta', 'alpha' or 'dev' * @return bool true if any package name is acceptable */ public static function isPackageAcceptable(array $acceptableStabilities, array $stabilityFlags, array $names, string $stability) : bool { foreach ($names as $name) { // allow if package matches the package-specific stability flag if (isset($stabilityFlags[$name])) { if (BasePackage::STABILITIES[$stability] <= $stabilityFlags[$name]) { return \true; } } elseif (isset($acceptableStabilities[$stability])) { // allow if package matches the global stability requirement and has no exception return \true; } } return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Config; use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Repository\Vcs\HgDriver; use Composer\IO\NullIO; use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Util\Git as GitUtil; use Composer\Util\HttpDownloader; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Svn as SvnUtil; use React\Promise\CancellablePromiseInterface; use _ContaoManager\Symfony\Component\Process\Process; /** * Try to guess the current version number based on different VCS configuration. * * @author Jordi Boggiano * @author Samuel Roze * * @phpstan-type Version array{version: string, commit: string|null, pretty_version: string|null}|array{version: string, commit: string|null, pretty_version: string|null, feature_version: string|null, feature_pretty_version: string|null} */ class VersionGuesser { /** * @var Config */ private $config; /** * @var ProcessExecutor */ private $process; /** * @var SemverVersionParser */ private $versionParser; /** * @var IOInterface|null */ private $io; public function __construct(Config $config, ProcessExecutor $process, SemverVersionParser $versionParser, ?IOInterface $io = null) { $this->config = $config; $this->process = $process; $this->versionParser = $versionParser; $this->io = $io; } /** * @param array $packageConfig * @param string $path Path to guess into * * @phpstan-return Version|null */ public function guessVersion(array $packageConfig, string $path) : ?array { if (!\function_exists('proc_open')) { return null; } // bypass version guessing in bash completions as it takes time to create // new processes and the root version is usually not that important if (Platform::isInputCompletionProcess()) { return null; } $versionData = $this->guessGitVersion($packageConfig, $path); if (null !== $versionData['version']) { return $this->postprocess($versionData); } $versionData = $this->guessHgVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); } $versionData = $this->guessFossilVersion($path); if (null !== $versionData['version']) { return $this->postprocess($versionData); } $versionData = $this->guessSvnVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); } return null; } /** * @phpstan-param Version $versionData * * @phpstan-return Version */ private function postprocess(array $versionData) : array { if (!empty($versionData['feature_version']) && $versionData['feature_version'] === $versionData['version'] && $versionData['feature_pretty_version'] === $versionData['pretty_version']) { unset($versionData['feature_version'], $versionData['feature_pretty_version']); } if ('-dev' === \substr($versionData['version'], -4) && Preg::isMatch('{\\.9{7}}', $versionData['version'])) { $versionData['pretty_version'] = Preg::replace('{(\\.9{7})+}', '.x', $versionData['version']); } if (!empty($versionData['feature_version']) && '-dev' === \substr($versionData['feature_version'], -4) && Preg::isMatch('{\\.9{7}}', $versionData['feature_version'])) { $versionData['feature_pretty_version'] = Preg::replace('{(\\.9{7})+}', '.x', $versionData['feature_version']); } return $versionData; } /** * @param array $packageConfig * * @return array{version: string|null, commit: string|null, pretty_version: string|null, feature_version?: string|null, feature_pretty_version?: string|null} */ private function guessGitVersion(array $packageConfig, string $path) : array { GitUtil::cleanEnv(); $commit = null; $version = null; $prettyVersion = null; $featureVersion = null; $featurePrettyVersion = null; $isDetached = \false; // try to fetch current version from git branch if (0 === $this->process->execute(['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], $output, $path)) { $branches = []; $isFeatureBranch = \false; // find current branch and collect all branch names foreach ($this->process->splitLines($output) as $branch) { if ($branch && Preg::isMatchStrictGroups('{^(?:\\* ) *(\\(no branch\\)|\\(detached from \\S+\\)|\\(HEAD detached at \\S+\\)|\\S+) *([a-f0-9]+) .*$}', $branch, $match)) { if ($match[1] === '(no branch)' || \strpos($match[1], '(detached ') === 0 || \strpos($match[1], '(HEAD detached at') === 0) { $version = 'dev-' . $match[2]; $prettyVersion = $version; $isFeatureBranch = \true; $isDetached = \true; } else { $version = $this->versionParser->normalizeBranch($match[1]); $prettyVersion = 'dev-' . $match[1]; $isFeatureBranch = $this->isFeatureBranch($packageConfig, $match[1]); } $commit = $match[2]; } if ($branch && !Preg::isMatchStrictGroups('{^ *.+/HEAD }', $branch)) { if (Preg::isMatchStrictGroups('{^(?:\\* )? *((?:remotes/(?:origin|upstream)/)?[^\\s/]+) *([a-f0-9]+) .*$}', $branch, $match)) { $branches[] = $match[1]; } } } if ($isFeatureBranch) { $featureVersion = $version; $featurePrettyVersion = $prettyVersion; // try to find the best (nearest) version branch to assume this feature's version $result = $this->guessFeatureVersion($packageConfig, $version, $branches, ['git', 'rev-list', '%candidate%..%branch%'], $path); $version = $result['version']; $prettyVersion = $result['pretty_version']; } } GitUtil::checkForRepoOwnershipError($this->process->getErrorOutput(), $path, $this->io); if (!$version || $isDetached) { $result = $this->versionFromGitTags($path); if ($result) { $version = $result['version']; $prettyVersion = $result['pretty_version']; $featureVersion = null; $featurePrettyVersion = null; } } if (null === $commit) { $command = \array_merge(['git', 'log', '--pretty=%H', '-n1', 'HEAD'], GitUtil::getNoShowSignatureFlags($this->process)); if (0 === $this->process->execute($command, $output, $path)) { $commit = \trim($output) ?: null; } } if ($featureVersion) { return ['version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion, 'feature_version' => $featureVersion, 'feature_pretty_version' => $featurePrettyVersion]; } return ['version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion]; } /** * @return array{version: string, pretty_version: string}|null */ private function versionFromGitTags(string $path) : ?array { // try to fetch current version from git tags if (0 === $this->process->execute(['git', 'describe', '--exact-match', '--tags'], $output, $path)) { try { $version = $this->versionParser->normalize(\trim($output)); return ['version' => $version, 'pretty_version' => \trim($output)]; } catch (\Exception $e) { } } return null; } /** * @param array $packageConfig * * @return array{version: string|null, commit: ''|null, pretty_version: string|null, feature_version?: string|null, feature_pretty_version?: string|null}|null */ private function guessHgVersion(array $packageConfig, string $path) : ?array { // try to fetch current version from hg branch if (0 === $this->process->execute(['hg', 'branch'], $output, $path)) { $branch = \trim($output); $version = $this->versionParser->normalizeBranch($branch); $isFeatureBranch = 0 === \strpos($version, 'dev-'); if (\Composer\Package\Version\VersionParser::DEFAULT_BRANCH_ALIAS === $version) { return ['version' => $version, 'commit' => null, 'pretty_version' => 'dev-' . $branch]; } if (!$isFeatureBranch) { return ['version' => $version, 'commit' => null, 'pretty_version' => $version]; } // re-use the HgDriver to fetch branches (this properly includes bookmarks) $io = new NullIO(); $driver = new HgDriver(['url' => $path], $io, $this->config, new HttpDownloader($io, $this->config), $this->process); $branches = \array_map('strval', \array_keys($driver->getBranches())); // try to find the best (nearest) version branch to assume this feature's version $result = $this->guessFeatureVersion($packageConfig, $version, $branches, ['hg', 'log', '-r', 'not ancestors(\'%candidate%\') and ancestors(\'%branch%\')', '--template', '"{node}\\n"'], $path); $result['commit'] = ''; $result['feature_version'] = $version; $result['feature_pretty_version'] = $version; return $result; } return null; } /** * @param array $packageConfig * @param list $branches * @param list $scmCmdline * * @return array{version: string|null, pretty_version: string|null} */ private function guessFeatureVersion(array $packageConfig, ?string $version, array $branches, array $scmCmdline, string $path) : array { $prettyVersion = $version; // ignore feature branches if they have no branch-alias or self.version is used // and find the branch they came from to use as a version instead if (!isset($packageConfig['extra']['branch-alias'][$version]) || \strpos(\json_encode($packageConfig), '"self.version"')) { $branch = Preg::replace('{^dev-}', '', $version); $length = \PHP_INT_MAX; // return directly, if branch is configured to be non-feature branch if (!$this->isFeatureBranch($packageConfig, $branch)) { return ['version' => $version, 'pretty_version' => $prettyVersion]; } // sort local branches first then remote ones // and sort numeric branches below named ones, to make sure if the branch has the same distance from main and 1.10 and 1.9 for example, 1.9 is picked // and sort using natural sort so that 1.10 will appear before 1.9 \usort($branches, static function ($a, $b) : int { $aRemote = 0 === \strpos($a, 'remotes/'); $bRemote = 0 === \strpos($b, 'remotes/'); if ($aRemote !== $bRemote) { return $aRemote ? 1 : -1; } return \strnatcasecmp($b, $a); }); $promises = []; $this->process->setMaxJobs(30); try { $lastIndex = -1; foreach ($branches as $index => $candidate) { $candidateVersion = Preg::replace('{^remotes/\\S+/}', '', $candidate); // do not compare against itself or other feature branches if ($candidate === $branch || $this->isFeatureBranch($packageConfig, $candidateVersion)) { continue; } $cmdLine = \array_map(static function (string $component) use($candidate, $branch) { return \str_replace(['%candidate%', '%branch%'], [$candidate, $branch], $component); }, $scmCmdline); $promises[] = $this->process->executeAsync($cmdLine, $path)->then(function (Process $process) use(&$lastIndex, $index, &$length, &$version, &$prettyVersion, $candidateVersion, &$promises) : void { if (!$process->isSuccessful()) { return; } $output = $process->getOutput(); // overwrite existing if we have a shorter diff, or we have an equal diff and an index that comes later in the array (i.e. older version) // as newer versions typically have more commits, if the feature branch is based on a newer branch it should have a longer diff to the old version // but if it doesn't and they have equal diffs, then it probably is based on the old version if (\strlen($output) < $length || \strlen($output) === $length && $lastIndex < $index) { $lastIndex = $index; $length = \strlen($output); $version = $this->versionParser->normalizeBranch($candidateVersion); $prettyVersion = 'dev-' . $candidateVersion; if ($length === 0) { foreach ($promises as $promise) { // to support react/promise 2.x we wrap the promise in a resolve() call for safety \React\Promise\resolve($promise)->cancel(); } } } }); } $this->process->wait(); } finally { $this->process->resetMaxJobs(); } } return ['version' => $version, 'pretty_version' => $prettyVersion]; } /** * @param array $packageConfig */ private function isFeatureBranch(array $packageConfig, ?string $branchName) : bool { $nonFeatureBranches = ''; if (!empty($packageConfig['non-feature-branches'])) { $nonFeatureBranches = \implode('|', $packageConfig['non-feature-branches']); } return !Preg::isMatch('{^(' . $nonFeatureBranches . '|master|main|latest|next|current|support|tip|trunk|default|develop|\\d+\\..+)$}', $branchName, $match); } /** * @return array{version: string|null, commit: '', pretty_version: string|null} */ private function guessFossilVersion(string $path) : array { $version = null; $prettyVersion = null; // try to fetch current version from fossil if (0 === $this->process->execute(['fossil', 'branch', 'list'], $output, $path)) { $branch = \trim($output); $version = $this->versionParser->normalizeBranch($branch); $prettyVersion = 'dev-' . $branch; } // try to fetch current version from fossil tags if (0 === $this->process->execute(['fossil', 'tag', 'list'], $output, $path)) { try { $version = $this->versionParser->normalize(\trim($output)); $prettyVersion = \trim($output); } catch (\Exception $e) { } } return ['version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion]; } /** * @param array $packageConfig * * @return array{version: string, commit: '', pretty_version: string}|null */ private function guessSvnVersion(array $packageConfig, string $path) : ?array { SvnUtil::cleanEnv(); // try to fetch current version from svn if (0 === $this->process->execute(['svn', 'info', '--xml'], $output, $path)) { $trunkPath = isset($packageConfig['trunk-path']) ? \preg_quote($packageConfig['trunk-path'], '#') : 'trunk'; $branchesPath = isset($packageConfig['branches-path']) ? \preg_quote($packageConfig['branches-path'], '#') : 'branches'; $tagsPath = isset($packageConfig['tags-path']) ? \preg_quote($packageConfig['tags-path'], '#') : 'tags'; $urlPattern = '#.*/(' . $trunkPath . '|(' . $branchesPath . '|' . $tagsPath . ')/(.*))#'; if (Preg::isMatch($urlPattern, $output, $matches)) { if (isset($matches[2], $matches[3]) && ($branchesPath === $matches[2] || $tagsPath === $matches[2])) { // we are in a branches path $version = $this->versionParser->normalizeBranch($matches[3]); $prettyVersion = 'dev-' . $matches[3]; return ['version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion]; } \assert(\is_string($matches[1])); $prettyVersion = \trim($matches[1]); if ($prettyVersion === 'trunk') { $version = 'dev-trunk'; } else { $version = $this->versionParser->normalize($prettyVersion); } return ['version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion]; } } return null; } public function getRootVersionFromEnv() : string { $version = Platform::getEnv('COMPOSER_ROOT_VERSION'); if (!\is_string($version) || $version === '') { throw new \RuntimeException('COMPOSER_ROOT_VERSION not set or empty'); } if (Preg::isMatch('{^(\\d+(?:\\.\\d+)*)-dev$}i', $version, $match)) { $version = $match[1] . '.x-dev'; } return $version; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Composer; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; use Composer\Pcre\Preg; use Composer\Repository\RepositorySet; use Composer\Repository\PlatformRepository; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; /** * Selects the best possible version for a package * * @author Ryan Weaver * @author Jordi Boggiano */ class VersionSelector { /** @var RepositorySet */ private $repositorySet; /** @var array */ private $platformConstraints = []; /** @var VersionParser */ private $parser; /** * @param PlatformRepository $platformRepo If passed in, the versions found will be filtered against their requirements to eliminate any not matching the current platform packages */ public function __construct(RepositorySet $repositorySet, ?PlatformRepository $platformRepo = null) { $this->repositorySet = $repositorySet; if ($platformRepo) { foreach ($platformRepo->getPackages() as $package) { $this->platformConstraints[$package->getName()][] = new Constraint('==', $package->getVersion()); } } } /** * Given a package name and optional version, returns the latest PackageInterface * that matches. * * @param string $targetPackageVersion * @param PlatformRequirementFilterInterface|bool|string[] $platformRequirementFilter * @param IOInterface|null $io If passed, warnings will be output there in case versions cannot be selected due to platform requirements * @param callable(PackageInterface):bool|bool $showWarnings * @return PackageInterface|false */ public function findBestCandidate(string $packageName, ?string $targetPackageVersion = null, string $preferredStability = 'stable', $platformRequirementFilter = null, int $repoSetFlags = 0, ?IOInterface $io = null, $showWarnings = \true) { if (!isset(BasePackage::STABILITIES[$preferredStability])) { // If you get this, maybe you are still relying on the Composer 1.x signature where the 3rd arg was the php version throw new \UnexpectedValueException('Expected a valid stability name as 3rd argument, got ' . $preferredStability); } if (null === $platformRequirementFilter) { $platformRequirementFilter = PlatformRequirementFilterFactory::ignoreNothing(); } elseif (!$platformRequirementFilter instanceof PlatformRequirementFilterInterface) { \trigger_error('VersionSelector::findBestCandidate with ignored platform reqs as bool|array is deprecated since Composer 2.2, use an instance of PlatformRequirementFilterInterface instead.', \E_USER_DEPRECATED); $platformRequirementFilter = PlatformRequirementFilterFactory::fromBoolOrList($platformRequirementFilter); } $constraint = $targetPackageVersion ? $this->getParser()->parseConstraints($targetPackageVersion) : null; $candidates = $this->repositorySet->findPackages(\strtolower($packageName), $constraint, $repoSetFlags); $minPriority = BasePackage::STABILITIES[$preferredStability]; \usort($candidates, static function (PackageInterface $a, PackageInterface $b) use($minPriority) { $aPriority = $a->getStabilityPriority(); $bPriority = $b->getStabilityPriority(); // A is less stable than our preferred stability, // and B is more stable than A, select B if ($minPriority < $aPriority && $bPriority < $aPriority) { return 1; } // A is less stable than our preferred stability, // and B is less stable than A, select A if ($minPriority < $aPriority && $aPriority < $bPriority) { return -1; } // A is more stable than our preferred stability, // and B is less stable than preferred stability, select A if ($minPriority >= $aPriority && $minPriority < $bPriority) { return -1; } // select highest version of the two return \version_compare($b->getVersion(), $a->getVersion()); }); if (\count($this->platformConstraints) > 0 && !$platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter) { /** @var array $alreadyWarnedNames */ $alreadyWarnedNames = []; /** @var array $alreadySeenNames */ $alreadySeenNames = []; foreach ($candidates as $pkg) { $reqs = $pkg->getRequires(); $skip = \false; foreach ($reqs as $name => $link) { if (!PlatformRepository::isPlatformPackage($name) || $platformRequirementFilter->isIgnored($name)) { continue; } if (isset($this->platformConstraints[$name])) { foreach ($this->platformConstraints[$name] as $providedConstraint) { if ($link->getConstraint()->matches($providedConstraint)) { // constraint satisfied, go to next require continue 2; } if ($platformRequirementFilter instanceof IgnoreListPlatformRequirementFilter && $platformRequirementFilter->isUpperBoundIgnored($name)) { $filteredConstraint = $platformRequirementFilter->filterConstraint($name, $link->getConstraint()); if ($filteredConstraint->matches($providedConstraint)) { // constraint satisfied with the upper bound ignored, go to next require continue 2; } } } // constraint not satisfied $reason = 'is not satisfied by your platform'; } else { // Package requires a platform package that is unknown on current platform. // It means that current platform cannot validate this constraint and so package is not installable. $reason = 'is missing from your platform'; } $isLatestVersion = !isset($alreadySeenNames[$pkg->getName()]); $alreadySeenNames[$pkg->getName()] = \true; if ($io !== null && ($showWarnings === \true || \is_callable($showWarnings) && $showWarnings($pkg))) { $isFirstWarning = !isset($alreadyWarnedNames[$pkg->getName() . '/' . $link->getTarget()]); $alreadyWarnedNames[$pkg->getName() . '/' . $link->getTarget()] = \true; $latest = $isLatestVersion ? "'s latest version" : ''; $io->writeError('Cannot use ' . $pkg->getPrettyName() . $latest . ' ' . $pkg->getPrettyVersion() . ' as it ' . $link->getDescription() . ' ' . $link->getTarget() . ' ' . $link->getPrettyConstraint() . ' which ' . $reason . '.', \true, $isFirstWarning ? IOInterface::NORMAL : IOInterface::VERBOSE); } // skip candidate $skip = \true; } if ($skip) { continue; } $package = $pkg; break; } } else { $package = \count($candidates) > 0 ? $candidates[0] : null; } if (!isset($package)) { return \false; } // if we end up with 9999999-dev as selected package, make sure we use the original version instead of the alias if ($package instanceof AliasPackage && $package->getVersion() === \Composer\Package\Version\VersionParser::DEFAULT_BRANCH_ALIAS) { $package = $package->getAliasOf(); } return $package; } /** * Given a concrete version, this returns a ^ constraint (when possible) * that should be used, for example, in composer.json. * * For example: * * 1.2.1 -> ^1.2 * * 1.2.1.2 -> ^1.2 * * 1.2 -> ^1.2 * * v3.2.1 -> ^3.2 * * 2.0-beta.1 -> ^2.0@beta * * dev-master -> ^2.1@dev (dev version with alias) * * dev-master -> dev-master (dev versions are untouched) */ public function findRecommendedRequireVersion(PackageInterface $package) : string { // Extensions which are versioned in sync with PHP should rather be required as "*" to simplify // the requires and have only one required version to change when bumping the php requirement if (0 === \strpos($package->getName(), 'ext-')) { $phpVersion = \PHP_MAJOR_VERSION . '.' . \PHP_MINOR_VERSION . '.' . \PHP_RELEASE_VERSION; $extVersion = \implode('.', \array_slice(\explode('.', $package->getVersion()), 0, 3)); if ($phpVersion === $extVersion) { return '*'; } } $version = $package->getVersion(); if (!$package->isDev()) { return $this->transformVersion($version, $package->getPrettyVersion(), $package->getStability()); } $loader = new ArrayLoader($this->getParser()); $dumper = new ArrayDumper(); $extra = $loader->getBranchAlias($dumper->dump($package)); if ($extra && $extra !== \Composer\Package\Version\VersionParser::DEFAULT_BRANCH_ALIAS) { $extra = Preg::replace('{^(\\d+\\.\\d+\\.\\d+)(\\.9999999)-dev$}', '$1.0', $extra, -1, $count); if ($count > 0) { $extra = \str_replace('.9999999', '.0', $extra); return $this->transformVersion($extra, $extra, 'dev'); } } return $package->getPrettyVersion(); } private function transformVersion(string $version, string $prettyVersion, string $stability) : string { // attempt to transform 2.1.1 to 2.1 // this allows you to upgrade through minor versions $semanticVersionParts = \explode('.', $version); // check to see if we have a semver-looking version if (\count($semanticVersionParts) === 4 && Preg::isMatch('{^\\d+\\D?}', $semanticVersionParts[3])) { // remove the last parts (i.e. the patch version number and any extra) if ($semanticVersionParts[0] === '0') { unset($semanticVersionParts[3]); } else { unset($semanticVersionParts[2], $semanticVersionParts[3]); } $version = \implode('.', $semanticVersionParts); } else { return $prettyVersion; } // append stability flag if not default if ($stability !== 'stable') { $version .= '@' . $stability; } // 2.1 -> ^2.1 return '^' . $version; } private function getParser() : \Composer\Package\Version\VersionParser { if ($this->parser === null) { $this->parser = new \Composer\Package\Version\VersionParser(); } return $this->parser; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Pcre\Preg; use Composer\Repository\PlatformRepository; use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Semver\Semver; use Composer\Semver\Constraint\ConstraintInterface; class VersionParser extends SemverVersionParser { public const DEFAULT_BRANCH_ALIAS = '9999999-dev'; /** @var array Constraint parsing cache */ private static $constraints = []; /** * @inheritDoc */ public function parseConstraints($constraints) : ConstraintInterface { if (!isset(self::$constraints[$constraints])) { self::$constraints[$constraints] = parent::parseConstraints($constraints); } return self::$constraints[$constraints]; } /** * Parses an array of strings representing package/version pairs. * * The parsing results in an array of arrays, each of which * contain a 'name' key with value and optionally a 'version' key with value. * * @param string[] $pairs a set of package/version pairs separated by ":", "=" or " " * * @return list */ public function parseNameVersionPairs(array $pairs) : array { $pairs = \array_values($pairs); $result = []; for ($i = 0, $count = \count($pairs); $i < $count; $i++) { $pair = Preg::replace('{^([^=: ]+)[=: ](.*)$}', '$1 $2', \trim($pairs[$i])); if (\false === \strpos($pair, ' ') && isset($pairs[$i + 1]) && \false === \strpos($pairs[$i + 1], '/') && !Preg::isMatch('{(?<=[a-z0-9_/-])\\*|\\*(?=[a-z0-9_/-])}i', $pairs[$i + 1]) && !PlatformRepository::isPlatformPackage($pairs[$i + 1])) { $pair .= ' ' . $pairs[$i + 1]; $i++; } if (\strpos($pair, ' ')) { [$name, $version] = \explode(' ', $pair, 2); $result[] = ['name' => $name, 'version' => $version]; } else { $result[] = ['name' => $pair]; } } return $result; } public static function isUpgrade(string $normalizedFrom, string $normalizedTo) : bool { if ($normalizedFrom === $normalizedTo) { return \true; } if (\in_array($normalizedFrom, ['dev-master', 'dev-trunk', 'dev-default'], \true)) { $normalizedFrom = \Composer\Package\Version\VersionParser::DEFAULT_BRANCH_ALIAS; } if (\in_array($normalizedTo, ['dev-master', 'dev-trunk', 'dev-default'], \true)) { $normalizedTo = \Composer\Package\Version\VersionParser::DEFAULT_BRANCH_ALIAS; } if (\strpos($normalizedFrom, 'dev-') === 0 || \strpos($normalizedTo, 'dev-') === 0) { return \true; } $sorted = Semver::sort([$normalizedTo, $normalizedFrom]); return $sorted[0] === $normalizedFrom; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package\BasePackage; use Composer\Pcre\Preg; use Composer\Semver\Constraint\Constraint; use Composer\Package\Version\VersionParser; use Composer\Repository\PlatformRepository; use Composer\Semver\Constraint\MatchNoneConstraint; use Composer\Semver\Intervals; use Composer\Spdx\SpdxLicenses; /** * @author Jordi Boggiano */ class ValidatingArrayLoader implements \Composer\Package\Loader\LoaderInterface { public const CHECK_ALL = 3; public const CHECK_UNBOUND_CONSTRAINTS = 1; public const CHECK_STRICT_CONSTRAINTS = 2; /** @var LoaderInterface */ private $loader; /** @var VersionParser */ private $versionParser; /** @var list */ private $errors; /** @var list */ private $warnings; /** @var mixed[] */ private $config; /** @var int One or more of self::CHECK_* constants */ private $flags; /** * @param true $strictName */ public function __construct(\Composer\Package\Loader\LoaderInterface $loader, bool $strictName = \true, ?VersionParser $parser = null, int $flags = 0) { $this->loader = $loader; $this->versionParser = $parser ?? new VersionParser(); $this->flags = $flags; if ($strictName !== \true) { // @phpstan-ignore-line \trigger_error('$strictName must be set to true in ValidatingArrayLoader\'s constructor as of 2.2, and it will be removed in 3.0', \E_USER_DEPRECATED); } } /** * @inheritDoc */ public function load(array $config, string $class = 'Composer\\Package\\CompletePackage') : BasePackage { $this->errors = []; $this->warnings = []; $this->config = $config; $this->validateString('name', \true); if (isset($config['name']) && null !== ($err = self::hasPackageNamingError($config['name']))) { $this->errors[] = 'name : ' . $err; } if (isset($this->config['version'])) { if (!\is_scalar($this->config['version'])) { $this->validateString('version'); } else { if (!\is_string($this->config['version'])) { $this->config['version'] = (string) $this->config['version']; } try { $this->versionParser->normalize($this->config['version']); } catch (\Exception $e) { $this->errors[] = 'version : invalid value (' . $this->config['version'] . '): ' . $e->getMessage(); unset($this->config['version']); } } } if (isset($this->config['config']['platform'])) { foreach ((array) $this->config['config']['platform'] as $key => $platform) { if (\false === $platform) { continue; } if (!\is_string($platform)) { $this->errors[] = 'config.platform.' . $key . ' : invalid value (' . \gettype($platform) . ' ' . \var_export($platform, \true) . '): expected string or false'; continue; } try { $this->versionParser->normalize($platform); } catch (\Exception $e) { $this->errors[] = 'config.platform.' . $key . ' : invalid value (' . $platform . '): ' . $e->getMessage(); } } } $this->validateRegex('type', '[A-Za-z0-9-]+'); $this->validateString('target-dir'); $this->validateArray('extra'); if (isset($this->config['bin'])) { if (\is_string($this->config['bin'])) { $this->validateString('bin'); } else { $this->validateFlatArray('bin'); } } $this->validateArray('scripts'); // TODO validate event names & listener syntax $this->validateString('description'); $this->validateUrl('homepage'); $this->validateFlatArray('keywords', '[\\p{N}\\p{L} ._-]+'); $releaseDate = null; $this->validateString('time'); if (isset($this->config['time'])) { try { $releaseDate = new \DateTime($this->config['time'], new \DateTimeZone('UTC')); } catch (\Exception $e) { $this->errors[] = 'time : invalid value (' . $this->config['time'] . '): ' . $e->getMessage(); unset($this->config['time']); } } if (isset($this->config['license'])) { // validate main data types if (\is_array($this->config['license']) || \is_string($this->config['license'])) { $licenses = (array) $this->config['license']; foreach ($licenses as $index => $license) { if (!\is_string($license)) { $this->warnings[] = \sprintf('License %s should be a string.', \json_encode($license)); unset($licenses[$index]); } } // check for license validity on newly updated branches/tags if (null === $releaseDate || $releaseDate->getTimestamp() >= \strtotime('-8days')) { $licenseValidator = new SpdxLicenses(); foreach ($licenses as $license) { // replace proprietary by MIT for validation purposes since it's not a valid SPDX identifier, but is accepted by composer if ('proprietary' === $license) { continue; } $licenseToValidate = \str_replace('proprietary', 'MIT', $license); if (!$licenseValidator->validate($licenseToValidate)) { if ($licenseValidator->validate(\trim($licenseToValidate))) { $this->warnings[] = \sprintf('License %s must not contain extra spaces, make sure to trim it.', \json_encode($license)); } else { $this->warnings[] = \sprintf('License %s is not a valid SPDX license identifier, see https://spdx.org/licenses/ if you use an open license.' . \PHP_EOL . 'If the software is closed-source, you may use "proprietary" as license.', \json_encode($license)); } } } } $this->config['license'] = \array_values($licenses); } else { $this->warnings[] = \sprintf('License must be a string or array of strings, got %s.', \json_encode($this->config['license'])); unset($this->config['license']); } } if ($this->validateArray('authors')) { foreach ($this->config['authors'] as $key => $author) { if (!\is_array($author)) { $this->errors[] = 'authors.' . $key . ' : should be an array, ' . \gettype($author) . ' given'; unset($this->config['authors'][$key]); continue; } foreach (['homepage', 'email', 'name', 'role'] as $authorData) { if (isset($author[$authorData]) && !\is_string($author[$authorData])) { $this->errors[] = 'authors.' . $key . '.' . $authorData . ' : invalid value, must be a string'; unset($this->config['authors'][$key][$authorData]); } } if (isset($author['homepage']) && !$this->filterUrl($author['homepage'])) { $this->warnings[] = 'authors.' . $key . '.homepage : invalid value (' . $author['homepage'] . '), must be an http/https URL'; unset($this->config['authors'][$key]['homepage']); } if (isset($author['email']) && \false === \filter_var($author['email'], \FILTER_VALIDATE_EMAIL)) { $this->warnings[] = 'authors.' . $key . '.email : invalid value (' . $author['email'] . '), must be a valid email address'; unset($this->config['authors'][$key]['email']); } if (\count($this->config['authors'][$key]) === 0) { unset($this->config['authors'][$key]); } } if (\count($this->config['authors']) === 0) { unset($this->config['authors']); } } if ($this->validateArray('support') && !empty($this->config['support'])) { foreach (['issues', 'forum', 'wiki', 'source', 'email', 'irc', 'docs', 'rss', 'chat', 'security'] as $key) { if (isset($this->config['support'][$key]) && !\is_string($this->config['support'][$key])) { $this->errors[] = 'support.' . $key . ' : invalid value, must be a string'; unset($this->config['support'][$key]); } } if (isset($this->config['support']['email']) && !\filter_var($this->config['support']['email'], \FILTER_VALIDATE_EMAIL)) { $this->warnings[] = 'support.email : invalid value (' . $this->config['support']['email'] . '), must be a valid email address'; unset($this->config['support']['email']); } if (isset($this->config['support']['irc']) && !$this->filterUrl($this->config['support']['irc'], ['irc', 'ircs'])) { $this->warnings[] = 'support.irc : invalid value (' . $this->config['support']['irc'] . '), must be a irc:/// or ircs:// URL'; unset($this->config['support']['irc']); } foreach (['issues', 'forum', 'wiki', 'source', 'docs', 'chat', 'security'] as $key) { if (isset($this->config['support'][$key]) && !$this->filterUrl($this->config['support'][$key])) { $this->warnings[] = 'support.' . $key . ' : invalid value (' . $this->config['support'][$key] . '), must be an http/https URL'; unset($this->config['support'][$key]); } } if (empty($this->config['support'])) { unset($this->config['support']); } } if ($this->validateArray('funding') && !empty($this->config['funding'])) { foreach ($this->config['funding'] as $key => $fundingOption) { if (!\is_array($fundingOption)) { $this->errors[] = 'funding.' . $key . ' : should be an array, ' . \gettype($fundingOption) . ' given'; unset($this->config['funding'][$key]); continue; } foreach (['type', 'url'] as $fundingData) { if (isset($fundingOption[$fundingData]) && !\is_string($fundingOption[$fundingData])) { $this->errors[] = 'funding.' . $key . '.' . $fundingData . ' : invalid value, must be a string'; unset($this->config['funding'][$key][$fundingData]); } } if (isset($fundingOption['url']) && !$this->filterUrl($fundingOption['url'])) { $this->warnings[] = 'funding.' . $key . '.url : invalid value (' . $fundingOption['url'] . '), must be an http/https URL'; unset($this->config['funding'][$key]['url']); } if (empty($this->config['funding'][$key])) { unset($this->config['funding'][$key]); } } if (empty($this->config['funding'])) { unset($this->config['funding']); } } $this->validateArray('php-ext'); if (isset($this->config['php-ext']) && !\in_array($this->config['type'] ?? '', ['php-ext', 'php-ext-zend'], \true)) { $this->errors[] = 'php-ext can only be set by packages of type "php-ext" or "php-ext-zend" which must be C extensions'; unset($this->config['php-ext']); } $unboundConstraint = new Constraint('=', '10000000-dev'); foreach (\array_keys(BasePackage::$supportedLinkTypes) as $linkType) { if ($this->validateArray($linkType) && isset($this->config[$linkType])) { foreach ($this->config[$linkType] as $package => $constraint) { $package = (string) $package; if (isset($this->config['name']) && 0 === \strcasecmp($package, $this->config['name'])) { $this->errors[] = $linkType . '.' . $package . ' : a package cannot set a ' . $linkType . ' on itself'; unset($this->config[$linkType][$package]); continue; } if ($err = self::hasPackageNamingError($package, \true)) { $this->warnings[] = $linkType . '.' . $err; } elseif (!Preg::isMatch('{^[A-Za-z0-9_./-]+$}', $package)) { $this->errors[] = $linkType . '.' . $package . ' : invalid key, package names must be strings containing only [A-Za-z0-9_./-]'; } if (!\is_string($constraint)) { $this->errors[] = $linkType . '.' . $package . ' : invalid value, must be a string containing a version constraint'; unset($this->config[$linkType][$package]); } elseif ('self.version' !== $constraint) { try { $linkConstraint = $this->versionParser->parseConstraints($constraint); } catch (\Exception $e) { $this->errors[] = $linkType . '.' . $package . ' : invalid version constraint (' . $e->getMessage() . ')'; unset($this->config[$linkType][$package]); continue; } // check requires for unbound constraints on non-platform packages if ($this->flags & self::CHECK_UNBOUND_CONSTRAINTS && 'require' === $linkType && $linkConstraint->matches($unboundConstraint) && !PlatformRepository::isPlatformPackage($package)) { $this->warnings[] = $linkType . '.' . $package . ' : unbound version constraints (' . $constraint . ') should be avoided'; } elseif ($this->flags & self::CHECK_STRICT_CONSTRAINTS && 'require' === $linkType && $linkConstraint instanceof Constraint && \in_array($linkConstraint->getOperator(), ['==', '='], \true) && (new Constraint('>=', '1.0.0.0-dev'))->matches($linkConstraint)) { $this->warnings[] = $linkType . '.' . $package . ' : exact version constraints (' . $constraint . ') should be avoided if the package follows semantic versioning'; } $compacted = Intervals::compactConstraint($linkConstraint); if ($compacted instanceof MatchNoneConstraint) { $this->warnings[] = $linkType . '.' . $package . ' : this version constraint cannot possibly match anything (' . $constraint . ')'; } } if ($linkType === 'conflict' && isset($this->config['replace']) && ($keys = \array_intersect_key($this->config['replace'], $this->config['conflict']))) { $this->errors[] = $linkType . '.' . $package . ' : you cannot conflict with a package that is also replaced, as replace already creates an implicit conflict rule'; unset($this->config[$linkType][$package]); } } } } if ($this->validateArray('suggest') && isset($this->config['suggest'])) { foreach ($this->config['suggest'] as $package => $description) { if (!\is_string($description)) { $this->errors[] = 'suggest.' . $package . ' : invalid value, must be a string describing why the package is suggested'; unset($this->config['suggest'][$package]); } } } if ($this->validateString('minimum-stability') && isset($this->config['minimum-stability'])) { if (!isset(BasePackage::STABILITIES[\strtolower($this->config['minimum-stability'])]) && $this->config['minimum-stability'] !== 'RC') { $this->errors[] = 'minimum-stability : invalid value (' . $this->config['minimum-stability'] . '), must be one of ' . \implode(', ', \array_keys(BasePackage::STABILITIES)); unset($this->config['minimum-stability']); } } if ($this->validateArray('autoload') && isset($this->config['autoload'])) { $types = ['psr-0', 'psr-4', 'classmap', 'files', 'exclude-from-classmap']; foreach ($this->config['autoload'] as $type => $typeConfig) { if (!\in_array($type, $types)) { $this->errors[] = 'autoload : invalid value (' . $type . '), must be one of ' . \implode(', ', $types); unset($this->config['autoload'][$type]); } if ($type === 'psr-4') { foreach ($typeConfig as $namespace => $dirs) { if ($namespace !== '' && '\\' !== \substr((string) $namespace, -1)) { $this->errors[] = 'autoload.psr-4 : invalid value (' . $namespace . '), namespaces must end with a namespace separator, should be ' . $namespace . '\\\\'; } } } } } if (isset($this->config['autoload']['psr-4']) && isset($this->config['target-dir'])) { $this->errors[] = 'target-dir : this can not be used together with the autoload.psr-4 setting, remove target-dir to upgrade to psr-4'; // Unset the psr-4 setting, since unsetting target-dir might // interfere with other settings. unset($this->config['autoload']['psr-4']); } foreach (['source', 'dist'] as $srcType) { if ($this->validateArray($srcType) && !empty($this->config[$srcType])) { if (!isset($this->config[$srcType]['type'])) { $this->errors[] = $srcType . '.type : must be present'; } if (!isset($this->config[$srcType]['url'])) { $this->errors[] = $srcType . '.url : must be present'; } if ($srcType === 'source' && !isset($this->config[$srcType]['reference'])) { $this->errors[] = $srcType . '.reference : must be present'; } if (isset($this->config[$srcType]['type']) && !\is_string($this->config[$srcType]['type'])) { $this->errors[] = $srcType . '.type : should be a string, ' . \gettype($this->config[$srcType]['type']) . ' given'; } if (isset($this->config[$srcType]['url']) && !\is_string($this->config[$srcType]['url'])) { $this->errors[] = $srcType . '.url : should be a string, ' . \gettype($this->config[$srcType]['url']) . ' given'; } if (isset($this->config[$srcType]['reference']) && !\is_string($this->config[$srcType]['reference']) && !\is_int($this->config[$srcType]['reference'])) { $this->errors[] = $srcType . '.reference : should be a string or int, ' . \gettype($this->config[$srcType]['reference']) . ' given'; } if (isset($this->config[$srcType]['reference']) && Preg::isMatch('{^\\s*-}', (string) $this->config[$srcType]['reference'])) { $this->errors[] = $srcType . '.reference : must not start with a "-", "' . $this->config[$srcType]['reference'] . '" given'; } if (isset($this->config[$srcType]['url']) && Preg::isMatch('{^\\s*-}', (string) $this->config[$srcType]['url'])) { $this->errors[] = $srcType . '.url : must not start with a "-", "' . $this->config[$srcType]['url'] . '" given'; } } } // TODO validate repositories // TODO validate package repositories' packages using this recursively $this->validateFlatArray('include-path'); $this->validateArray('transport-options'); // branch alias validation if (isset($this->config['extra']['branch-alias'])) { if (!\is_array($this->config['extra']['branch-alias'])) { $this->errors[] = 'extra.branch-alias : must be an array of versions => aliases'; } else { foreach ($this->config['extra']['branch-alias'] as $sourceBranch => $targetBranch) { if (!\is_string($targetBranch)) { $this->warnings[] = 'extra.branch-alias.' . $sourceBranch . ' : the target branch (' . \json_encode($targetBranch) . ') must be a string, "' . \gettype($targetBranch) . '" received.'; unset($this->config['extra']['branch-alias'][$sourceBranch]); continue; } // ensure it is an alias to a -dev package if ('-dev' !== \substr($targetBranch, -4)) { $this->warnings[] = 'extra.branch-alias.' . $sourceBranch . ' : the target branch (' . $targetBranch . ') must end in -dev'; unset($this->config['extra']['branch-alias'][$sourceBranch]); continue; } // normalize without -dev and ensure it's a numeric branch that is parseable $validatedTargetBranch = $this->versionParser->normalizeBranch(\substr($targetBranch, 0, -4)); if ('-dev' !== \substr($validatedTargetBranch, -4)) { $this->warnings[] = 'extra.branch-alias.' . $sourceBranch . ' : the target branch (' . $targetBranch . ') must be a parseable number like 2.0-dev'; unset($this->config['extra']['branch-alias'][$sourceBranch]); continue; } // If using numeric aliases ensure the alias is a valid subversion if (($sourcePrefix = $this->versionParser->parseNumericAliasPrefix($sourceBranch)) && ($targetPrefix = $this->versionParser->parseNumericAliasPrefix($targetBranch)) && \stripos($targetPrefix, $sourcePrefix) !== 0) { $this->warnings[] = 'extra.branch-alias.' . $sourceBranch . ' : the target branch (' . $targetBranch . ') is not a valid numeric alias for this version'; unset($this->config['extra']['branch-alias'][$sourceBranch]); } } } } if ($this->errors) { throw new \Composer\Package\Loader\InvalidPackageException($this->errors, $this->warnings, $config); } $package = $this->loader->load($this->config, $class); $this->config = []; return $package; } /** * @return list */ public function getWarnings() : array { return $this->warnings; } /** * @return list */ public function getErrors() : array { return $this->errors; } public static function hasPackageNamingError(string $name, bool $isLink = \false) : ?string { if (PlatformRepository::isPlatformPackage($name)) { return null; } if (!Preg::isMatch('{^[a-z0-9](?:[_.-]?[a-z0-9]++)*+/[a-z0-9](?:(?:[_.]|-{1,2})?[a-z0-9]++)*+$}iD', $name)) { return $name . ' is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match "^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$".'; } $reservedNames = ['nul', 'con', 'prn', 'aux', 'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7', 'com8', 'com9', 'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9']; $bits = \explode('/', \strtolower($name)); if (\in_array($bits[0], $reservedNames, \true) || \in_array($bits[1], $reservedNames, \true)) { return $name . ' is reserved, package and vendor names can not match any of: ' . \implode(', ', $reservedNames) . '.'; } if (Preg::isMatch('{\\.json$}', $name)) { return $name . ' is invalid, package names can not end in .json, consider renaming it or perhaps using a -json suffix instead.'; } if (Preg::isMatch('{[A-Z]}', $name)) { if ($isLink) { return $name . ' is invalid, it should not contain uppercase characters. Please use ' . \strtolower($name) . ' instead.'; } $suggestName = Preg::replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '1\\3-\\2\\4', $name); $suggestName = \strtolower($suggestName); return $name . ' is invalid, it should not contain uppercase characters. We suggest using ' . $suggestName . ' instead.'; } return null; } /** * @phpstan-param non-empty-string $property * @phpstan-param non-empty-string $regex */ private function validateRegex(string $property, string $regex, bool $mandatory = \false) : bool { if (!$this->validateString($property, $mandatory)) { return \false; } if (!Preg::isMatch('{^' . $regex . '$}u', $this->config[$property])) { $message = $property . ' : invalid value (' . $this->config[$property] . '), must match ' . $regex; if ($mandatory) { $this->errors[] = $message; } else { $this->warnings[] = $message; } unset($this->config[$property]); return \false; } return \true; } /** * @phpstan-param non-empty-string $property */ private function validateString(string $property, bool $mandatory = \false) : bool { if (isset($this->config[$property]) && !\is_string($this->config[$property])) { $this->errors[] = $property . ' : should be a string, ' . \gettype($this->config[$property]) . ' given'; unset($this->config[$property]); return \false; } if (!isset($this->config[$property]) || \trim($this->config[$property]) === '') { if ($mandatory) { $this->errors[] = $property . ' : must be present'; } unset($this->config[$property]); return \false; } return \true; } /** * @phpstan-param non-empty-string $property */ private function validateArray(string $property, bool $mandatory = \false) : bool { if (isset($this->config[$property]) && !\is_array($this->config[$property])) { $this->errors[] = $property . ' : should be an array, ' . \gettype($this->config[$property]) . ' given'; unset($this->config[$property]); return \false; } if (!isset($this->config[$property]) || !\count($this->config[$property])) { if ($mandatory) { $this->errors[] = $property . ' : must be present and contain at least one element'; } unset($this->config[$property]); return \false; } return \true; } /** * @phpstan-param non-empty-string $property * @phpstan-param non-empty-string|null $regex */ private function validateFlatArray(string $property, ?string $regex = null, bool $mandatory = \false) : bool { if (!$this->validateArray($property, $mandatory)) { return \false; } $pass = \true; foreach ($this->config[$property] as $key => $value) { if (!\is_string($value) && !\is_numeric($value)) { $this->errors[] = $property . '.' . $key . ' : must be a string or int, ' . \gettype($value) . ' given'; unset($this->config[$property][$key]); $pass = \false; continue; } if ($regex && !Preg::isMatch('{^' . $regex . '$}u', (string) $value)) { $this->warnings[] = $property . '.' . $key . ' : invalid value (' . $value . '), must match ' . $regex; unset($this->config[$property][$key]); $pass = \false; } } return $pass; } /** * @phpstan-param non-empty-string $property */ private function validateUrl(string $property, bool $mandatory = \false) : bool { if (!$this->validateString($property, $mandatory)) { return \false; } if (!$this->filterUrl($this->config[$property])) { $this->warnings[] = $property . ' : invalid value (' . $this->config[$property] . '), must be an http/https URL'; unset($this->config[$property]); return \false; } return \true; } /** * @param mixed $value * @param string[] $schemes */ private function filterUrl($value, array $schemes = ['http', 'https']) : bool { if ($value === '') { return \true; } $bits = \parse_url($value); if (empty($bits['scheme']) || empty($bits['host'])) { return \false; } if (!\in_array($bits['scheme'], $schemes, \true)) { return \false; } return \true; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; /** * @author Jordi Boggiano */ class InvalidPackageException extends \Exception { /** @var list */ private $errors; /** @var list */ private $warnings; /** @var mixed[] package config */ private $data; /** * @param list $errors * @param list $warnings * @param mixed[] $data */ public function __construct(array $errors, array $warnings, array $data) { $this->errors = $errors; $this->warnings = $warnings; $this->data = $data; parent::__construct("Invalid package information: \n" . \implode("\n", \array_merge($errors, $warnings))); } /** * @return mixed[] */ public function getData() : array { return $this->data; } /** * @return list */ public function getErrors() : array { return $this->errors; } /** * @return list */ public function getWarnings() : array { return $this->warnings; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package\BasePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; use Composer\Package\RootPackage; use Composer\Package\PackageInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\Link; use Composer\Package\RootAliasPackage; use Composer\Package\Version\VersionParser; use Composer\Pcre\Preg; /** * @author Konstantin Kudryashiv * @author Jordi Boggiano */ class ArrayLoader implements \Composer\Package\Loader\LoaderInterface { /** @var VersionParser */ protected $versionParser; /** @var bool */ protected $loadOptions; public function __construct(?VersionParser $parser = null, bool $loadOptions = \false) { if (!$parser) { $parser = new VersionParser(); } $this->versionParser = $parser; $this->loadOptions = $loadOptions; } /** * @inheritDoc */ public function load(array $config, string $class = 'Composer\\Package\\CompletePackage') : BasePackage { if ($class !== 'Composer\\Package\\CompletePackage' && $class !== 'Composer\\Package\\RootPackage') { \trigger_error('The $class arg is deprecated, please reach out to Composer maintainers ASAP if you still need this.', \E_USER_DEPRECATED); } $package = $this->createObject($config, $class); foreach (BasePackage::$supportedLinkTypes as $type => $opts) { if (!isset($config[$type]) || !\is_array($config[$type])) { continue; } $method = 'set' . \ucfirst($opts['method']); $package->{$method}($this->parseLinks($package->getName(), $package->getPrettyVersion(), $opts['method'], $config[$type])); } $package = $this->configureObject($package, $config); return $package; } /** * @param array> $versions * * @return list */ public function loadPackages(array $versions) : array { $packages = []; $linkCache = []; foreach ($versions as $version) { $package = $this->createObject($version, 'Composer\\Package\\CompletePackage'); $this->configureCachedLinks($linkCache, $package, $version); $package = $this->configureObject($package, $version); $packages[] = $package; } return $packages; } /** * @template PackageClass of CompletePackage * * @param mixed[] $config package data * @param string $class FQCN to be instantiated * * @return CompletePackage|RootPackage * * @phpstan-param class-string $class */ private function createObject(array $config, string $class) : CompletePackage { if (!isset($config['name'])) { throw new \UnexpectedValueException('Unknown package has no name defined (' . \json_encode($config) . ').'); } if (!isset($config['version']) || !\is_scalar($config['version'])) { throw new \UnexpectedValueException('Package ' . $config['name'] . ' has no version defined.'); } if (!\is_string($config['version'])) { $config['version'] = (string) $config['version']; } // handle already normalized versions if (isset($config['version_normalized']) && \is_string($config['version_normalized'])) { $version = $config['version_normalized']; // handling of existing repos which need to remain composer v1 compatible, in case the version_normalized contained VersionParser::DEFAULT_BRANCH_ALIAS, we renormalize it if ($version === VersionParser::DEFAULT_BRANCH_ALIAS) { $version = $this->versionParser->normalize($config['version']); } } else { $version = $this->versionParser->normalize($config['version']); } return new $class($config['name'], $version, $config['version']); } /** * @param CompletePackage $package * @param mixed[] $config package data * * @return RootPackage|RootAliasPackage|CompletePackage|CompleteAliasPackage */ private function configureObject(PackageInterface $package, array $config) : BasePackage { if (!$package instanceof CompletePackage) { throw new \LogicException('ArrayLoader expects instances of the Composer\\Package\\CompletePackage class to function correctly'); } $package->setType(isset($config['type']) ? \strtolower($config['type']) : 'library'); if (isset($config['target-dir'])) { $package->setTargetDir($config['target-dir']); } if (isset($config['extra']) && \is_array($config['extra'])) { $package->setExtra($config['extra']); } if (isset($config['bin'])) { if (!\is_array($config['bin'])) { $config['bin'] = [$config['bin']]; } foreach ($config['bin'] as $key => $bin) { $config['bin'][$key] = \ltrim($bin, '/'); } $package->setBinaries($config['bin']); } if (isset($config['installation-source'])) { $package->setInstallationSource($config['installation-source']); } if (isset($config['default-branch']) && $config['default-branch'] === \true) { $package->setIsDefaultBranch(\true); } if (isset($config['source'])) { if (!isset($config['source']['type'], $config['source']['url'], $config['source']['reference'])) { throw new \UnexpectedValueException(\sprintf("Package %s's source key should be specified as {\"type\": ..., \"url\": ..., \"reference\": ...},\n%s given.", $config['name'], \json_encode($config['source']))); } $package->setSourceType($config['source']['type']); $package->setSourceUrl($config['source']['url']); $package->setSourceReference(isset($config['source']['reference']) ? (string) $config['source']['reference'] : null); if (isset($config['source']['mirrors'])) { $package->setSourceMirrors($config['source']['mirrors']); } } if (isset($config['dist'])) { if (!isset($config['dist']['type'], $config['dist']['url'])) { throw new \UnexpectedValueException(\sprintf("Package %s's dist key should be specified as " . "{\"type\": ..., \"url\": ..., \"reference\": ..., \"shasum\": ...},\n%s given.", $config['name'], \json_encode($config['dist']))); } $package->setDistType($config['dist']['type']); $package->setDistUrl($config['dist']['url']); $package->setDistReference(isset($config['dist']['reference']) ? (string) $config['dist']['reference'] : null); $package->setDistSha1Checksum($config['dist']['shasum'] ?? null); if (isset($config['dist']['mirrors'])) { $package->setDistMirrors($config['dist']['mirrors']); } } if (isset($config['suggest']) && \is_array($config['suggest'])) { foreach ($config['suggest'] as $target => $reason) { if ('self.version' === \trim($reason)) { $config['suggest'][$target] = $package->getPrettyVersion(); } } $package->setSuggests($config['suggest']); } if (isset($config['autoload'])) { $package->setAutoload($config['autoload']); } if (isset($config['autoload-dev'])) { $package->setDevAutoload($config['autoload-dev']); } if (isset($config['include-path'])) { $package->setIncludePaths($config['include-path']); } if (isset($config['php-ext'])) { $package->setPhpExt($config['php-ext']); } if (!empty($config['time'])) { $time = Preg::isMatch('/^\\d++$/D', $config['time']) ? '@' . $config['time'] : $config['time']; try { $date = new \DateTime($time, new \DateTimeZone('UTC')); $package->setReleaseDate($date); } catch (\Exception $e) { } } if (!empty($config['notification-url'])) { $package->setNotificationUrl($config['notification-url']); } if ($package instanceof CompletePackageInterface) { if (!empty($config['archive']['name'])) { $package->setArchiveName($config['archive']['name']); } if (!empty($config['archive']['exclude'])) { $package->setArchiveExcludes($config['archive']['exclude']); } if (isset($config['scripts']) && \is_array($config['scripts'])) { foreach ($config['scripts'] as $event => $listeners) { $config['scripts'][$event] = (array) $listeners; } foreach (['composer', 'php', 'putenv'] as $reserved) { if (isset($config['scripts'][$reserved])) { \trigger_error('The `' . $reserved . '` script name is reserved for internal use, please avoid defining it', \E_USER_DEPRECATED); } } $package->setScripts($config['scripts']); } if (!empty($config['description']) && \is_string($config['description'])) { $package->setDescription($config['description']); } if (!empty($config['homepage']) && \is_string($config['homepage'])) { $package->setHomepage($config['homepage']); } if (!empty($config['keywords']) && \is_array($config['keywords'])) { $package->setKeywords(\array_map('strval', $config['keywords'])); } if (!empty($config['license'])) { $package->setLicense(\is_array($config['license']) ? $config['license'] : [$config['license']]); } if (!empty($config['authors']) && \is_array($config['authors'])) { $package->setAuthors($config['authors']); } if (isset($config['support']) && \is_array($config['support'])) { $package->setSupport($config['support']); } if (!empty($config['funding']) && \is_array($config['funding'])) { $package->setFunding($config['funding']); } if (isset($config['abandoned'])) { $package->setAbandoned($config['abandoned']); } } if ($this->loadOptions && isset($config['transport-options'])) { $package->setTransportOptions($config['transport-options']); } if ($aliasNormalized = $this->getBranchAlias($config)) { $prettyAlias = Preg::replace('{(\\.9{7})+}', '.x', $aliasNormalized); if ($package instanceof RootPackage) { return new RootAliasPackage($package, $aliasNormalized, $prettyAlias); } return new CompleteAliasPackage($package, $aliasNormalized, $prettyAlias); } return $package; } /** * @param array>>> $linkCache * @param mixed[] $config */ private function configureCachedLinks(array &$linkCache, PackageInterface $package, array $config) : void { $name = $package->getName(); $prettyVersion = $package->getPrettyVersion(); foreach (BasePackage::$supportedLinkTypes as $type => $opts) { if (isset($config[$type])) { $method = 'set' . \ucfirst($opts['method']); $links = []; foreach ($config[$type] as $prettyTarget => $constraint) { $target = \strtolower($prettyTarget); // recursive links are not supported if ($target === $name) { continue; } if ($constraint === 'self.version') { $links[$target] = $this->createLink($name, $prettyVersion, $opts['method'], $target, $constraint); } else { if (!isset($linkCache[$name][$type][$target][$constraint])) { $linkCache[$name][$type][$target][$constraint] = [$target, $this->createLink($name, $prettyVersion, $opts['method'], $target, $constraint)]; } [$target, $link] = $linkCache[$name][$type][$target][$constraint]; $links[$target] = $link; } } $package->{$method}($links); } } } /** * @param string $source source package name * @param string $sourceVersion source package version (pretty version ideally) * @param string $description link description (e.g. requires, replaces, ..) * @param array $links array of package name => constraint mappings * * @return Link[] * * @phpstan-param Link::TYPE_* $description */ public function parseLinks(string $source, string $sourceVersion, string $description, array $links) : array { $res = []; foreach ($links as $target => $constraint) { if (!\is_string($constraint)) { continue; } $target = \strtolower((string) $target); $res[$target] = $this->createLink($source, $sourceVersion, $description, $target, $constraint); } return $res; } /** * @param string $source source package name * @param string $sourceVersion source package version (pretty version ideally) * @param Link::TYPE_* $description link description (e.g. requires, replaces, ..) * @param string $target target package name * @param string $prettyConstraint constraint string */ private function createLink(string $source, string $sourceVersion, string $description, string $target, string $prettyConstraint) : Link { if (!\is_string($prettyConstraint)) { throw new \UnexpectedValueException('Link constraint in ' . $source . ' ' . $description . ' > ' . $target . ' should be a string, got ' . \gettype($prettyConstraint) . ' (' . \var_export($prettyConstraint, \true) . ')'); } if ('self.version' === $prettyConstraint) { $parsedConstraint = $this->versionParser->parseConstraints($sourceVersion); } else { $parsedConstraint = $this->versionParser->parseConstraints($prettyConstraint); } return new Link($source, $target, $parsedConstraint, $description, $prettyConstraint); } /** * Retrieves a branch alias (dev-master => 1.0.x-dev for example) if it exists * * @param mixed[] $config the entire package config * * @return string|null normalized version of the branch alias or null if there is none */ public function getBranchAlias(array $config) : ?string { if (!isset($config['version']) || !\is_scalar($config['version'])) { throw new \UnexpectedValueException('no/invalid version defined'); } if (!\is_string($config['version'])) { $config['version'] = (string) $config['version']; } if (\strpos($config['version'], 'dev-') !== 0 && '-dev' !== \substr($config['version'], -4)) { return null; } if (isset($config['extra']['branch-alias']) && \is_array($config['extra']['branch-alias'])) { foreach ($config['extra']['branch-alias'] as $sourceBranch => $targetBranch) { $sourceBranch = (string) $sourceBranch; // ensure it is an alias to a -dev package if ('-dev' !== \substr($targetBranch, -4)) { continue; } // normalize without -dev and ensure it's a numeric branch that is parseable if ($targetBranch === VersionParser::DEFAULT_BRANCH_ALIAS) { $validatedTargetBranch = VersionParser::DEFAULT_BRANCH_ALIAS; } else { $validatedTargetBranch = $this->versionParser->normalizeBranch(\substr($targetBranch, 0, -4)); } if ('-dev' !== \substr($validatedTargetBranch, -4)) { continue; } // ensure that it is the current branch aliasing itself if (\strtolower($config['version']) !== \strtolower($sourceBranch)) { continue; } // If using numeric aliases ensure the alias is a valid subversion if (($sourcePrefix = $this->versionParser->parseNumericAliasPrefix($sourceBranch)) && ($targetPrefix = $this->versionParser->parseNumericAliasPrefix($targetBranch)) && \stripos($targetPrefix, $sourcePrefix) !== 0) { continue; } return $validatedTargetBranch; } } if (isset($config['default-branch']) && $config['default-branch'] === \true && \false === $this->versionParser->parseNumericAliasPrefix(Preg::replace('{^v}', '', $config['version']))) { return VersionParser::DEFAULT_BRANCH_ALIAS; } return null; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package\CompletePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\RootAliasPackage; use Composer\Package\RootPackage; use Composer\Package\BasePackage; /** * Defines a loader that takes an array to create package instances * * @author Jordi Boggiano */ interface LoaderInterface { /** * Converts a package from an array to a real instance * * @param mixed[] $config package data * @param string $class FQCN to be instantiated * * @return CompletePackage|CompleteAliasPackage|RootPackage|RootAliasPackage * * @phpstan-param class-string $class */ public function load(array $config, string $class = 'Composer\\Package\\CompletePackage') : BasePackage; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package\BasePackage; use Composer\Config; use Composer\IO\IOInterface; use Composer\Package\RootAliasPackage; use Composer\Pcre\Preg; use Composer\Repository\RepositoryFactory; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Package\RootPackage; use Composer\Repository\RepositoryManager; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; /** * ArrayLoader built for the sole purpose of loading the root package * * Sets additional defaults and loads repositories * * @author Jordi Boggiano */ class RootPackageLoader extends \Composer\Package\Loader\ArrayLoader { /** * @var RepositoryManager */ private $manager; /** * @var Config */ private $config; /** * @var VersionGuesser */ private $versionGuesser; /** * @var IOInterface|null */ private $io; public function __construct(RepositoryManager $manager, Config $config, ?VersionParser $parser = null, ?VersionGuesser $versionGuesser = null, ?IOInterface $io = null) { parent::__construct($parser); $this->manager = $manager; $this->config = $config; if (null === $versionGuesser) { $processExecutor = new ProcessExecutor($io); $processExecutor->enableAsync(); $versionGuesser = new VersionGuesser($config, $processExecutor, $this->versionParser); } $this->versionGuesser = $versionGuesser; $this->io = $io; } /** * @inheritDoc * * @return RootPackage|RootAliasPackage * * @phpstan-param class-string $class */ public function load(array $config, string $class = 'Composer\\Package\\RootPackage', ?string $cwd = null) : BasePackage { if ($class !== 'Composer\\Package\\RootPackage') { \trigger_error('The $class arg is deprecated, please reach out to Composer maintainers ASAP if you still need this.', \E_USER_DEPRECATED); } if (!isset($config['name'])) { $config['name'] = '__root__'; } elseif ($err = \Composer\Package\Loader\ValidatingArrayLoader::hasPackageNamingError($config['name'])) { throw new \RuntimeException('Your package name ' . $err); } $autoVersioned = \false; if (!isset($config['version'])) { $commit = null; // override with env var if available if (Platform::getEnv('COMPOSER_ROOT_VERSION')) { $config['version'] = $this->versionGuesser->getRootVersionFromEnv(); } else { $versionData = $this->versionGuesser->guessVersion($config, $cwd ?? Platform::getCwd(\true)); if ($versionData) { $config['version'] = $versionData['pretty_version']; $config['version_normalized'] = $versionData['version']; $commit = $versionData['commit']; } } if (!isset($config['version'])) { if ($this->io !== null && $config['name'] !== '__root__' && 'project' !== ($config['type'] ?? '')) { $this->io->warning(\sprintf("Composer could not detect the root package (%s) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version", $config['name'])); } $config['version'] = '1.0.0'; $autoVersioned = \true; } if ($commit) { $config['source'] = ['type' => '', 'url' => '', 'reference' => $commit]; $config['dist'] = ['type' => '', 'url' => '', 'reference' => $commit]; } } /** @var RootPackage|RootAliasPackage $package */ $package = parent::load($config, $class); if ($package instanceof RootAliasPackage) { $realPackage = $package->getAliasOf(); } else { $realPackage = $package; } if (!$realPackage instanceof RootPackage) { throw new \LogicException('Expecting a Composer\\Package\\RootPackage at this point'); } if ($autoVersioned) { $realPackage->replaceVersion($realPackage->getVersion(), RootPackage::DEFAULT_PRETTY_VERSION); } if (isset($config['minimum-stability'])) { $realPackage->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability'])); } $aliases = []; $stabilityFlags = []; $references = []; foreach (['require', 'require-dev'] as $linkType) { if (isset($config[$linkType])) { $linkInfo = BasePackage::$supportedLinkTypes[$linkType]; $method = 'get' . \ucfirst($linkInfo['method']); $links = []; foreach ($realPackage->{$method}() as $link) { $links[$link->getTarget()] = $link->getConstraint()->getPrettyString(); } $aliases = $this->extractAliases($links, $aliases); $stabilityFlags = self::extractStabilityFlags($links, $realPackage->getMinimumStability(), $stabilityFlags); $references = self::extractReferences($links, $references); if (isset($links[$config['name']])) { throw new \RuntimeException(\sprintf('Root package \'%s\' cannot require itself in its composer.json' . \PHP_EOL . 'Did you accidentally name your root package after an external package?', $config['name'])); } } } foreach (\array_keys(BasePackage::$supportedLinkTypes) as $linkType) { if (isset($config[$linkType])) { foreach ($config[$linkType] as $linkName => $constraint) { if ($err = \Composer\Package\Loader\ValidatingArrayLoader::hasPackageNamingError($linkName, \true)) { throw new \RuntimeException($linkType . '.' . $err); } } } } $realPackage->setAliases($aliases); $realPackage->setStabilityFlags($stabilityFlags); $realPackage->setReferences($references); if (isset($config['prefer-stable'])) { $realPackage->setPreferStable((bool) $config['prefer-stable']); } if (isset($config['config'])) { $realPackage->setConfig($config['config']); } $repos = RepositoryFactory::defaultRepos(null, $this->config, $this->manager); foreach ($repos as $repo) { $this->manager->addRepository($repo); } $realPackage->setRepositories($this->config->getRepositories()); return $package; } /** * @param array $requires * @param list $aliases * * @return list */ private function extractAliases(array $requires, array $aliases) : array { foreach ($requires as $reqName => $reqVersion) { if (Preg::isMatchStrictGroups('{(?:^|\\| *|, *)([^,\\s#|]+)(?:#[^ ]+)? +as +([^,\\s|]+)(?:$| *\\|| *,)}', $reqVersion, $match)) { $aliases[] = ['package' => \strtolower($reqName), 'version' => $this->versionParser->normalize($match[1], $reqVersion), 'alias' => $match[2], 'alias_normalized' => $this->versionParser->normalize($match[2], $reqVersion)]; } elseif (\strpos($reqVersion, ' as ') !== \false) { throw new \UnexpectedValueException('Invalid alias definition in "' . $reqName . '": "' . $reqVersion . '". Aliases should be in the form "exact-version as other-exact-version".'); } } return $aliases; } /** * @internal * * @param array $requires * @param array $stabilityFlags * @param key-of $minimumStability * * @return array * * @phpstan-param array $stabilityFlags * @phpstan-return array */ public static function extractStabilityFlags(array $requires, string $minimumStability, array $stabilityFlags) : array { $stabilities = BasePackage::STABILITIES; $minimumStability = $stabilities[$minimumStability]; foreach ($requires as $reqName => $reqVersion) { $constraints = []; // extract all sub-constraints in case it is an OR/AND multi-constraint $orSplit = Preg::split('{\\s*\\|\\|?\\s*}', \trim($reqVersion)); foreach ($orSplit as $orConstraint) { $andSplit = Preg::split('{(?< ,]) *(? $stability) { continue; } $stabilityFlags[$name] = $stability; $matched = \true; } } if ($matched) { continue; } foreach ($constraints as $constraint) { // infer flags for requirements that have an explicit -dev or -beta version specified but only // for those that are more unstable than the minimumStability or existing flags $reqVersion = Preg::replace('{^([^,\\s@]+) as .+$}', '$1', $constraint); if (Preg::isMatch('{^[^,\\s@]+$}', $reqVersion) && 'stable' !== ($stabilityName = VersionParser::parseStability($reqVersion))) { $name = \strtolower($reqName); $stability = $stabilities[$stabilityName]; if (isset($stabilityFlags[$name]) && $stabilityFlags[$name] > $stability || $minimumStability > $stability) { continue; } $stabilityFlags[$name] = $stability; } } } return $stabilityFlags; } /** * @internal * * @param array $requires * @param array $references * * @return array */ public static function extractReferences(array $requires, array $references) : array { foreach ($requires as $reqName => $reqVersion) { $reqVersion = Preg::replace('{^([^,\\s@]+) as .+$}', '$1', $reqVersion); if (Preg::isMatchStrictGroups('{^[^,\\s@]+?#([a-f0-9]+)$}', $reqVersion, $match) && 'dev' === VersionParser::parseStability($reqVersion)) { $name = \strtolower($reqName); $references[$name] = $match[1]; } } return $references; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\CompletePackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\RootPackage; use Composer\Package\RootAliasPackage; /** * @author Konstantin Kudryashiv */ class JsonLoader { /** @var LoaderInterface */ private $loader; public function __construct(\Composer\Package\Loader\LoaderInterface $loader) { $this->loader = $loader; } /** * @param string|JsonFile $json A filename, json string or JsonFile instance to load the package from * @return CompletePackage|CompleteAliasPackage|RootPackage|RootAliasPackage */ public function load($json) : BasePackage { if ($json instanceof JsonFile) { $config = $json->read(); } elseif (\file_exists($json)) { $config = JsonFile::parseJson(\file_get_contents($json), $json); } elseif (\is_string($json)) { $config = JsonFile::parseJson($json); } else { throw new \InvalidArgumentException(\sprintf("JsonLoader: Unknown \$json parameter %s. Please report at https://github.com/composer/composer/issues/new.", \gettype($json))); } return $this->loader->load($config); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Repository\RepositoryInterface; use Composer\Repository\PlatformRepository; /** * Base class for packages providing name storage and default match implementation * * @author Nils Adermann */ abstract class BasePackage implements \Composer\Package\PackageInterface { /** * @phpstan-var array * @internal */ public static $supportedLinkTypes = ['require' => ['description' => 'requires', 'method' => \Composer\Package\Link::TYPE_REQUIRE], 'conflict' => ['description' => 'conflicts', 'method' => \Composer\Package\Link::TYPE_CONFLICT], 'provide' => ['description' => 'provides', 'method' => \Composer\Package\Link::TYPE_PROVIDE], 'replace' => ['description' => 'replaces', 'method' => \Composer\Package\Link::TYPE_REPLACE], 'require-dev' => ['description' => 'requires (for development)', 'method' => \Composer\Package\Link::TYPE_DEV_REQUIRE]]; public const STABILITY_STABLE = 0; public const STABILITY_RC = 5; public const STABILITY_BETA = 10; public const STABILITY_ALPHA = 15; public const STABILITY_DEV = 20; public const STABILITIES = ['stable' => self::STABILITY_STABLE, 'RC' => self::STABILITY_RC, 'beta' => self::STABILITY_BETA, 'alpha' => self::STABILITY_ALPHA, 'dev' => self::STABILITY_DEV]; /** * @deprecated * @readonly * @var array, self::STABILITY_*> * @phpstan-ignore property.readOnlyByPhpDocDefaultValue */ public static $stabilities = self::STABILITIES; /** * READ-ONLY: The package id, public for fast access in dependency solver * @var int * @internal */ public $id; /** @var string */ protected $name; /** @var string */ protected $prettyName; /** @var ?RepositoryInterface */ protected $repository = null; /** * All descendants' constructors should call this parent constructor * * @param string $name The package's name */ public function __construct(string $name) { $this->prettyName = $name; $this->name = \strtolower($name); $this->id = -1; } /** * @inheritDoc */ public function getName() : string { return $this->name; } /** * @inheritDoc */ public function getPrettyName() : string { return $this->prettyName; } /** * @inheritDoc */ public function getNames($provides = \true) : array { $names = [$this->getName() => \true]; if ($provides) { foreach ($this->getProvides() as $link) { $names[$link->getTarget()] = \true; } } foreach ($this->getReplaces() as $link) { $names[$link->getTarget()] = \true; } return \array_keys($names); } /** * @inheritDoc */ public function setId(int $id) : void { $this->id = $id; } /** * @inheritDoc */ public function getId() : int { return $this->id; } /** * @inheritDoc */ public function setRepository(RepositoryInterface $repository) : void { if ($this->repository && $repository !== $this->repository) { throw new \LogicException(\sprintf('Package "%s" cannot be added to repository "%s" as it is already in repository "%s".', $this->getPrettyName(), $repository->getRepoName(), $this->repository->getRepoName())); } $this->repository = $repository; } /** * @inheritDoc */ public function getRepository() : ?RepositoryInterface { return $this->repository; } /** * checks if this package is a platform package */ public function isPlatform() : bool { return $this->getRepository() instanceof PlatformRepository; } /** * Returns package unique name, constructed from name, version and release type. */ public function getUniqueName() : string { return $this->getName() . '-' . $this->getVersion(); } public function equals(\Composer\Package\PackageInterface $package) : bool { $self = $this; if ($this instanceof \Composer\Package\AliasPackage) { $self = $this->getAliasOf(); } if ($package instanceof \Composer\Package\AliasPackage) { $package = $package->getAliasOf(); } return $package === $self; } /** * Converts the package into a readable and unique string */ public function __toString() : string { return $this->getUniqueName(); } public function getPrettyString() : string { return $this->getPrettyName() . ' ' . $this->getPrettyVersion(); } /** * @inheritDoc */ public function getFullPrettyVersion(bool $truncate = \true, int $displayMode = \Composer\Package\PackageInterface::DISPLAY_SOURCE_REF_IF_DEV) : string { if ($displayMode === \Composer\Package\PackageInterface::DISPLAY_SOURCE_REF_IF_DEV && (!$this->isDev() || !\in_array($this->getSourceType(), ['hg', 'git']))) { return $this->getPrettyVersion(); } switch ($displayMode) { case \Composer\Package\PackageInterface::DISPLAY_SOURCE_REF_IF_DEV: case \Composer\Package\PackageInterface::DISPLAY_SOURCE_REF: $reference = $this->getSourceReference(); break; case \Composer\Package\PackageInterface::DISPLAY_DIST_REF: $reference = $this->getDistReference(); break; default: throw new \UnexpectedValueException('Display mode ' . $displayMode . ' is not supported'); } if (null === $reference) { return $this->getPrettyVersion(); } // if source reference is a sha1 hash -- truncate if ($truncate && \strlen($reference) === 40 && $this->getSourceType() !== 'svn') { return $this->getPrettyVersion() . ' ' . \substr($reference, 0, 7); } return $this->getPrettyVersion() . ' ' . $reference; } /** * @phpstan-return self::STABILITY_* */ public function getStabilityPriority() : int { return self::STABILITIES[$this->getStability()]; } public function __clone() { $this->repository = null; $this->id = -1; } /** * Build a regexp from a package name, expanding * globs as required * * @param non-empty-string $wrap Wrap the cleaned string by the given string * @return non-empty-string */ public static function packageNameToRegexp(string $allowPattern, string $wrap = '{^%s$}i') : string { $cleanedAllowPattern = \str_replace('\\*', '.*', \preg_quote($allowPattern)); return \sprintf($wrap, $cleanedAllowPattern); } /** * Build a regexp from package names, expanding * globs as required * * @param string[] $packageNames * @param non-empty-string $wrap * @return non-empty-string */ public static function packageNamesToRegexp(array $packageNames, string $wrap = '{^(?:%s)$}iD') : string { $packageNames = \array_map(static function ($packageName) : string { return \Composer\Package\BasePackage::packageNameToRegexp($packageName, '%s'); }, $packageNames); return \sprintf($wrap, \implode('|', $packageNames)); } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Comparer; use Composer\Util\Platform; /** * class Comparer * * @author Hector Prats */ class Comparer { /** @var string Source directory */ private $source; /** @var string Target directory */ private $update; /** @var array{changed?: string[], removed?: string[], added?: string[]} */ private $changed; public function setSource(string $source) : void { $this->source = $source; } public function setUpdate(string $update) : void { $this->update = $update; } /** * @return array{changed?: string[], removed?: string[], added?: string[]}|false false if no change */ public function getChanged(bool $explicated = \false) { $changed = $this->changed; if (!\count($changed)) { return \false; } if ($explicated) { foreach ($changed as $sectionKey => $itemSection) { foreach ($itemSection as $itemKey => $item) { $changed[$sectionKey][$itemKey] = $item . ' (' . $sectionKey . ')'; } } } return $changed; } /** * @return string empty string if no changes */ public function getChangedAsString(bool $toString = \false, bool $explicated = \false) : string { $changed = $this->getChanged($explicated); if (\false === $changed) { return ''; } $strings = []; foreach ($changed as $sectionKey => $itemSection) { foreach ($itemSection as $itemKey => $item) { $strings[] = $item . "\r\n"; } } return \trim(\implode("\r\n", $strings)); } public function doCompare() : void { $source = []; $destination = []; $this->changed = []; $currentDirectory = Platform::getCwd(); \chdir($this->source); $source = $this->doTree('.', $source); if (!\is_array($source)) { return; } \chdir($currentDirectory); \chdir($this->update); $destination = $this->doTree('.', $destination); if (!\is_array($destination)) { exit; } \chdir($currentDirectory); foreach ($source as $dir => $value) { foreach ($value as $file => $hash) { if (isset($destination[$dir][$file])) { if ($hash !== $destination[$dir][$file]) { $this->changed['changed'][] = $dir . '/' . $file; } } else { $this->changed['removed'][] = $dir . '/' . $file; } } } foreach ($destination as $dir => $value) { foreach ($value as $file => $hash) { if (!isset($source[$dir][$file])) { $this->changed['added'][] = $dir . '/' . $file; } } } } /** * @param mixed[] $array * * @return array>|false */ private function doTree(string $dir, array &$array) { if ($dh = \opendir($dir)) { while ($file = \readdir($dh)) { if ($file !== '.' && $file !== '..') { if (\is_link($dir . '/' . $file)) { $array[$dir][$file] = \readlink($dir . '/' . $file); } elseif (\is_dir($dir . '/' . $file)) { if (!\count($array)) { $array[0] = 'Temp'; } if (!$this->doTree($dir . '/' . $file, $array)) { return \false; } } elseif (\is_file($dir . '/' . $file) && \filesize($dir . '/' . $file)) { $array[$dir][$file] = \hash_file(\PHP_VERSION_ID > 80100 ? 'xxh3' : 'sha1', $dir . '/' . $file); } } } if (\count($array) > 1 && isset($array['0'])) { unset($array['0']); } return $array; } return \false; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * @author Jordi Boggiano */ class RootAliasPackage extends \Composer\Package\CompleteAliasPackage implements \Composer\Package\RootPackageInterface { /** @var RootPackage */ protected $aliasOf; /** * All descendants' constructors should call this parent constructor * * @param RootPackage $aliasOf The package this package is an alias of * @param string $version The version the alias must report * @param string $prettyVersion The alias's non-normalized version */ public function __construct(\Composer\Package\RootPackage $aliasOf, string $version, string $prettyVersion) { parent::__construct($aliasOf, $version, $prettyVersion); } /** * @return RootPackage */ public function getAliasOf() { return $this->aliasOf; } /** * @inheritDoc */ public function getAliases() : array { return $this->aliasOf->getAliases(); } /** * @inheritDoc */ public function getMinimumStability() : string { return $this->aliasOf->getMinimumStability(); } /** * @inheritDoc */ public function getStabilityFlags() : array { return $this->aliasOf->getStabilityFlags(); } /** * @inheritDoc */ public function getReferences() : array { return $this->aliasOf->getReferences(); } /** * @inheritDoc */ public function getPreferStable() : bool { return $this->aliasOf->getPreferStable(); } /** * @inheritDoc */ public function getConfig() : array { return $this->aliasOf->getConfig(); } /** * @inheritDoc */ public function setRequires(array $requires) : void { $this->requires = $this->replaceSelfVersionDependencies($requires, \Composer\Package\Link::TYPE_REQUIRE); $this->aliasOf->setRequires($requires); } /** * @inheritDoc */ public function setDevRequires(array $devRequires) : void { $this->devRequires = $this->replaceSelfVersionDependencies($devRequires, \Composer\Package\Link::TYPE_DEV_REQUIRE); $this->aliasOf->setDevRequires($devRequires); } /** * @inheritDoc */ public function setConflicts(array $conflicts) : void { $this->conflicts = $this->replaceSelfVersionDependencies($conflicts, \Composer\Package\Link::TYPE_CONFLICT); $this->aliasOf->setConflicts($conflicts); } /** * @inheritDoc */ public function setProvides(array $provides) : void { $this->provides = $this->replaceSelfVersionDependencies($provides, \Composer\Package\Link::TYPE_PROVIDE); $this->aliasOf->setProvides($provides); } /** * @inheritDoc */ public function setReplaces(array $replaces) : void { $this->replaces = $this->replaceSelfVersionDependencies($replaces, \Composer\Package\Link::TYPE_REPLACE); $this->aliasOf->setReplaces($replaces); } /** * @inheritDoc */ public function setAutoload(array $autoload) : void { $this->aliasOf->setAutoload($autoload); } /** * @inheritDoc */ public function setDevAutoload(array $devAutoload) : void { $this->aliasOf->setDevAutoload($devAutoload); } /** * @inheritDoc */ public function setStabilityFlags(array $stabilityFlags) : void { $this->aliasOf->setStabilityFlags($stabilityFlags); } /** * @inheritDoc */ public function setMinimumStability(string $minimumStability) : void { $this->aliasOf->setMinimumStability($minimumStability); } /** * @inheritDoc */ public function setPreferStable(bool $preferStable) : void { $this->aliasOf->setPreferStable($preferStable); } /** * @inheritDoc */ public function setConfig(array $config) : void { $this->aliasOf->setConfig($config); } /** * @inheritDoc */ public function setReferences(array $references) : void { $this->aliasOf->setReferences($references); } /** * @inheritDoc */ public function setAliases(array $aliases) : void { $this->aliasOf->setAliases($aliases); } /** * @inheritDoc */ public function setSuggests(array $suggests) : void { $this->aliasOf->setSuggests($suggests); } /** * @inheritDoc */ public function setExtra(array $extra) : void { $this->aliasOf->setExtra($extra); } public function __clone() { parent::__clone(); $this->aliasOf = clone $this->aliasOf; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * Package containing additional metadata that is not used by the solver * * @author Nils Adermann */ class CompletePackage extends \Composer\Package\Package implements \Composer\Package\CompletePackageInterface { /** @var mixed[] */ protected $repositories = []; /** @var string[] */ protected $license = []; /** @var string[] */ protected $keywords = []; /** @var array */ protected $authors = []; /** @var ?string */ protected $description = null; /** @var ?string */ protected $homepage = null; /** @var array Map of script name to array of handlers */ protected $scripts = []; /** @var array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string, security?: string} */ protected $support = []; /** @var array */ protected $funding = []; /** @var bool|string */ protected $abandoned = \false; /** @var ?string */ protected $archiveName = null; /** @var string[] */ protected $archiveExcludes = []; /** * @inheritDoc */ public function setScripts(array $scripts) : void { $this->scripts = $scripts; } /** * @inheritDoc */ public function getScripts() : array { return $this->scripts; } /** * @inheritDoc */ public function setRepositories(array $repositories) : void { $this->repositories = $repositories; } /** * @inheritDoc */ public function getRepositories() : array { return $this->repositories; } /** * @inheritDoc */ public function setLicense(array $license) : void { $this->license = $license; } /** * @inheritDoc */ public function getLicense() : array { return $this->license; } /** * @inheritDoc */ public function setKeywords(array $keywords) : void { $this->keywords = $keywords; } /** * @inheritDoc */ public function getKeywords() : array { return $this->keywords; } /** * @inheritDoc */ public function setAuthors(array $authors) : void { $this->authors = $authors; } /** * @inheritDoc */ public function getAuthors() : array { return $this->authors; } /** * @inheritDoc */ public function setDescription(?string $description) : void { $this->description = $description; } /** * @inheritDoc */ public function getDescription() : ?string { return $this->description; } /** * @inheritDoc */ public function setHomepage(?string $homepage) : void { $this->homepage = $homepage; } /** * @inheritDoc */ public function getHomepage() : ?string { return $this->homepage; } /** * @inheritDoc */ public function setSupport(array $support) : void { $this->support = $support; } /** * @inheritDoc */ public function getSupport() : array { return $this->support; } /** * @inheritDoc */ public function setFunding(array $funding) : void { $this->funding = $funding; } /** * @inheritDoc */ public function getFunding() : array { return $this->funding; } /** * @inheritDoc */ public function isAbandoned() : bool { return (bool) $this->abandoned; } /** * @inheritDoc */ public function setAbandoned($abandoned) : void { $this->abandoned = $abandoned; } /** * @inheritDoc */ public function getReplacementPackage() : ?string { return \is_string($this->abandoned) ? $this->abandoned : null; } /** * @inheritDoc */ public function setArchiveName(?string $name) : void { $this->archiveName = $name; } /** * @inheritDoc */ public function getArchiveName() : ?string { return $this->archiveName; } /** * @inheritDoc */ public function setArchiveExcludes(array $excludes) : void { $this->archiveExcludes = $excludes; } /** * @inheritDoc */ public function getArchiveExcludes() : array { return $this->archiveExcludes; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * Defines additional fields that are only needed for the root package * * PackageInterface & derivatives are considered internal, you may use them in type hints but extending/implementing them is not recommended and not supported. Things may change without notice. * * @author Jordi Boggiano * * @phpstan-import-type AutoloadRules from PackageInterface * @phpstan-import-type DevAutoloadRules from PackageInterface */ interface RootPackageInterface extends \Composer\Package\CompletePackageInterface { /** * Returns a set of package names and their aliases * * @return list */ public function getAliases() : array; /** * Returns the minimum stability of the package * * @return key-of */ public function getMinimumStability() : string; /** * Returns the stability flags to apply to dependencies * * array('foo/bar' => 'dev') * * @return array */ public function getStabilityFlags() : array; /** * Returns a set of package names and source references that must be enforced on them * * array('foo/bar' => 'abcd1234') * * @return array */ public function getReferences() : array; /** * Returns true if the root package prefers picking stable packages over unstable ones */ public function getPreferStable() : bool; /** * Returns the root package's configuration * * @return mixed[] */ public function getConfig() : array; /** * Set the required packages * * @param Link[] $requires A set of package links */ public function setRequires(array $requires) : void; /** * Set the recommended packages * * @param Link[] $devRequires A set of package links */ public function setDevRequires(array $devRequires) : void; /** * Set the conflicting packages * * @param Link[] $conflicts A set of package links */ public function setConflicts(array $conflicts) : void; /** * Set the provided virtual packages * * @param Link[] $provides A set of package links */ public function setProvides(array $provides) : void; /** * Set the packages this one replaces * * @param Link[] $replaces A set of package links */ public function setReplaces(array $replaces) : void; /** * Set the autoload mapping * * @param array $autoload Mapping of autoloading rules * @phpstan-param AutoloadRules $autoload */ public function setAutoload(array $autoload) : void; /** * Set the dev autoload mapping * * @param array $devAutoload Mapping of dev autoloading rules * @phpstan-param DevAutoloadRules $devAutoload */ public function setDevAutoload(array $devAutoload) : void; /** * Set the stabilityFlags * * @phpstan-param array $stabilityFlags */ public function setStabilityFlags(array $stabilityFlags) : void; /** * Set the minimumStability * * @phpstan-param key-of $minimumStability */ public function setMinimumStability(string $minimumStability) : void; /** * Set the preferStable */ public function setPreferStable(bool $preferStable) : void; /** * Set the config * * @param mixed[] $config */ public function setConfig(array $config) : void; /** * Set the references * * @param array $references */ public function setReferences(array $references) : void; /** * Set the aliases * * @param list $aliases */ public function setAliases(array $aliases) : void; /** * Set the suggested packages * * @param array $suggests A set of package names/comments */ public function setSuggests(array $suggests) : void; /** * @param mixed[] $extra */ public function setExtra(array $extra) : void; } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * The root package represents the project's composer.json and contains additional metadata * * @author Jordi Boggiano */ class RootPackage extends \Composer\Package\CompletePackage implements \Composer\Package\RootPackageInterface { public const DEFAULT_PRETTY_VERSION = '1.0.0+no-version-set'; /** @var key-of */ protected $minimumStability = 'stable'; /** @var bool */ protected $preferStable = \false; /** @var array Map of package name to stability constant */ protected $stabilityFlags = []; /** @var mixed[] */ protected $config = []; /** @var array Map of package name to reference/commit hash */ protected $references = []; /** @var list */ protected $aliases = []; /** * @inheritDoc */ public function setMinimumStability(string $minimumStability) : void { $this->minimumStability = $minimumStability; } /** * @inheritDoc */ public function getMinimumStability() : string { return $this->minimumStability; } /** * @inheritDoc */ public function setStabilityFlags(array $stabilityFlags) : void { $this->stabilityFlags = $stabilityFlags; } /** * @inheritDoc */ public function getStabilityFlags() : array { return $this->stabilityFlags; } /** * @inheritDoc */ public function setPreferStable(bool $preferStable) : void { $this->preferStable = $preferStable; } /** * @inheritDoc */ public function getPreferStable() : bool { return $this->preferStable; } /** * @inheritDoc */ public function setConfig(array $config) : void { $this->config = $config; } /** * @inheritDoc */ public function getConfig() : array { return $this->config; } /** * @inheritDoc */ public function setReferences(array $references) : void { $this->references = $references; } /** * @inheritDoc */ public function getReferences() : array { return $this->references; } /** * @inheritDoc */ public function setAliases(array $aliases) : void { $this->aliases = $aliases; } /** * @inheritDoc */ public function getAliases() : array { return $this->aliases; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Dumper; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\RootPackageInterface; /** * @author Konstantin Kudryashiv * @author Jordi Boggiano */ class ArrayDumper { /** * @return array */ public function dump(PackageInterface $package) : array { $keys = ['binaries' => 'bin', 'type', 'extra', 'installationSource' => 'installation-source', 'autoload', 'devAutoload' => 'autoload-dev', 'notificationUrl' => 'notification-url', 'includePaths' => 'include-path', 'phpExt' => 'php-ext']; $data = []; $data['name'] = $package->getPrettyName(); $data['version'] = $package->getPrettyVersion(); $data['version_normalized'] = $package->getVersion(); if ($package->getTargetDir() !== null) { $data['target-dir'] = $package->getTargetDir(); } if ($package->getSourceType() !== null) { $data['source']['type'] = $package->getSourceType(); $data['source']['url'] = $package->getSourceUrl(); if (null !== ($value = $package->getSourceReference())) { $data['source']['reference'] = $value; } if ($mirrors = $package->getSourceMirrors()) { $data['source']['mirrors'] = $mirrors; } } if ($package->getDistType() !== null) { $data['dist']['type'] = $package->getDistType(); $data['dist']['url'] = $package->getDistUrl(); if (null !== ($value = $package->getDistReference())) { $data['dist']['reference'] = $value; } if (null !== ($value = $package->getDistSha1Checksum())) { $data['dist']['shasum'] = $value; } if ($mirrors = $package->getDistMirrors()) { $data['dist']['mirrors'] = $mirrors; } } foreach (BasePackage::$supportedLinkTypes as $type => $opts) { $links = $package->{'get' . \ucfirst($opts['method'])}(); if (\count($links) === 0) { continue; } foreach ($links as $link) { $data[$type][$link->getTarget()] = $link->getPrettyConstraint(); } \ksort($data[$type]); } $packages = $package->getSuggests(); if (\count($packages) > 0) { \ksort($packages); $data['suggest'] = $packages; } if ($package->getReleaseDate() instanceof \DateTimeInterface) { $data['time'] = $package->getReleaseDate()->format(\DATE_RFC3339); } if ($package->isDefaultBranch()) { $data['default-branch'] = \true; } $data = $this->dumpValues($package, $keys, $data); if ($package instanceof CompletePackageInterface) { if ($package->getArchiveName()) { $data['archive']['name'] = $package->getArchiveName(); } if ($package->getArchiveExcludes()) { $data['archive']['exclude'] = $package->getArchiveExcludes(); } $keys = ['scripts', 'license', 'authors', 'description', 'homepage', 'keywords', 'repositories', 'support', 'funding']; $data = $this->dumpValues($package, $keys, $data); if (isset($data['keywords']) && \is_array($data['keywords'])) { \sort($data['keywords']); } if ($package->isAbandoned()) { $data['abandoned'] = $package->getReplacementPackage() ?: \true; } } if ($package instanceof RootPackageInterface) { $minimumStability = $package->getMinimumStability(); if ($minimumStability !== '') { $data['minimum-stability'] = $minimumStability; } } if (\count($package->getTransportOptions()) > 0) { $data['transport-options'] = $package->getTransportOptions(); } return $data; } /** * @param array $keys * @param array $data * * @return array */ private function dumpValues(PackageInterface $package, array $keys, array $data) : array { foreach ($keys as $method => $key) { if (\is_numeric($method)) { $method = $key; } $getter = 'get' . \ucfirst($method); $value = $package->{$getter}(); if (null !== $value && !(\is_array($value) && 0 === \count($value))) { $data[$key] = $value; } } return $data; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console; use Composer\Installer; use Composer\IO\NullIO; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\Silencer; use LogicException; use RuntimeException; use _ContaoManager\Symfony\Component\Console\Application as BaseApplication; use _ContaoManager\Symfony\Component\Console\Exception\CommandNotFoundException; use _ContaoManager\Symfony\Component\Console\Exception\ExceptionInterface; use _ContaoManager\Symfony\Component\Console\Helper\HelperSet; use _ContaoManager\Symfony\Component\Console\Helper\QuestionHelper; use _ContaoManager\Symfony\Component\Console\Input\InputDefinition; use _ContaoManager\Symfony\Component\Console\Input\InputInterface; use _ContaoManager\Symfony\Component\Console\Input\InputOption; use _ContaoManager\Symfony\Component\Console\Output\ConsoleOutputInterface; use _ContaoManager\Symfony\Component\Console\Output\OutputInterface; use _ContaoManager\Seld\JsonLint\ParsingException; use Composer\Command; use Composer\Composer; use Composer\Factory; use Composer\Downloader\TransportException; use Composer\IO\IOInterface; use Composer\IO\ConsoleIO; use Composer\Json\JsonValidationException; use Composer\Util\ErrorHandler; use Composer\Util\HttpDownloader; use Composer\EventDispatcher\ScriptExecutionException; use Composer\Exception\NoSslException; use Composer\XdebugHandler\XdebugHandler; use _ContaoManager\Symfony\Component\Process\Exception\ProcessTimedOutException; /** * The console application that handles the commands * * @author Ryan Weaver * @author Jordi Boggiano * @author François Pluchino */ class Application extends BaseApplication { /** * @var ?Composer */ protected $composer; /** * @var IOInterface */ protected $io; /** @var string */ private static $logo = ' ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \\/ __ `__ \\/ __ \\/ __ \\/ ___/ _ \\/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \\____/\\____/_/ /_/ /_/ .___/\\____/____/\\___/_/ /_/ '; /** @var bool */ private $hasPluginCommands = \false; /** @var bool */ private $disablePluginsByDefault = \false; /** @var bool */ private $disableScriptsByDefault = \false; /** * @var string|false Store the initial working directory at startup time */ private $initialWorkingDirectory; public function __construct(string $name = 'Composer', string $version = '') { if (\method_exists($this, 'setCatchErrors')) { $this->setCatchErrors(\true); } static $shutdownRegistered = \false; if ($version === '') { $version = Composer::getVersion(); } if (\function_exists('ini_set') && \extension_loaded('xdebug')) { \ini_set('xdebug.show_exception_trace', '0'); \ini_set('xdebug.scream', '0'); } if (\function_exists('date_default_timezone_set') && \function_exists('date_default_timezone_get')) { \date_default_timezone_set(Silencer::call('date_default_timezone_get')); } $this->io = new NullIO(); if (!$shutdownRegistered) { $shutdownRegistered = \true; \register_shutdown_function(static function () : void { $lastError = \error_get_last(); if ($lastError && $lastError['message'] && (\strpos($lastError['message'], 'Allowed memory') !== \false || \strpos($lastError['message'], 'exceeded memory') !== \false)) { echo "\n" . 'Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.'; } }); } $this->initialWorkingDirectory = \getcwd(); parent::__construct($name, $version); } public function __destruct() { } public function run(?InputInterface $input = null, ?OutputInterface $output = null) : int { if (null === $output) { $output = Factory::createOutput(); } return parent::run($input, $output); } public function doRun(InputInterface $input, OutputInterface $output) : int { $this->disablePluginsByDefault = $input->hasParameterOption('--no-plugins'); $this->disableScriptsByDefault = $input->hasParameterOption('--no-scripts'); static $stdin = null; if (null === $stdin) { $stdin = \defined('STDIN') ? \STDIN : \fopen('php://stdin', 'r'); } if (Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING') !== '1' && (Platform::getEnv('COMPOSER_NO_INTERACTION') || $stdin === \false || !Platform::isTty($stdin))) { $input->setInteractive(\false); } $io = $this->io = new ConsoleIO($input, $output, new HelperSet([new QuestionHelper()])); // Register error handler again to pass it the IO instance ErrorHandler::register($io); if ($input->hasParameterOption('--no-cache')) { $io->writeError('Disabling cache usage', \true, IOInterface::DEBUG); Platform::putEnv('COMPOSER_CACHE_DIR', Platform::isWindows() ? 'nul' : '/dev/null'); } // switch working dir $newWorkDir = $this->getNewWorkingDir($input); if (null !== $newWorkDir) { $oldWorkingDir = Platform::getCwd(\true); \chdir($newWorkDir); $this->initialWorkingDirectory = $newWorkDir; $cwd = Platform::getCwd(\true); $io->writeError('Changed CWD to ' . ($cwd !== '' ? $cwd : $newWorkDir), \true, IOInterface::DEBUG); } // determine command name to be executed without including plugin commands $commandName = ''; if ($name = $this->getCommandNameBeforeBinding($input)) { try { $commandName = $this->find($name)->getName(); } catch (CommandNotFoundException $e) { // we'll check command validity again later after plugins are loaded $commandName = \false; } catch (\InvalidArgumentException $e) { } } // prompt user for dir change if no composer.json is present in current dir if (null === $newWorkDir && !\in_array($commandName, ['', 'list', 'init', 'about', 'help', 'diagnose', 'self-update', 'global', 'create-project', 'outdated'], \true) && !\file_exists(Factory::getComposerFile()) && ($useParentDirIfNoJsonAvailable = $this->getUseParentDirConfigValue()) !== \false && ($commandName !== 'config' || $input->hasParameterOption('--file', \true) === \false && $input->hasParameterOption('-f', \true) === \false) && $input->hasParameterOption('--help', \true) === \false && $input->hasParameterOption('-h', \true) === \false) { $dir = \dirname(Platform::getCwd(\true)); $home = \realpath((Platform::getEnv('HOME') ?: Platform::getEnv('USERPROFILE')) ?: '/'); // abort when we reach the home dir or top of the filesystem while (\dirname($dir) !== $dir && $dir !== $home) { if (\file_exists($dir . '/' . Factory::getComposerFile())) { if ($useParentDirIfNoJsonAvailable !== \true && !$io->isInteractive()) { $io->writeError('No composer.json in current directory, to use the one at ' . $dir . ' run interactively or set config.use-parent-dir to true'); break; } if ($useParentDirIfNoJsonAvailable === \true || $io->askConfirmation('No composer.json in current directory, do you want to use the one at ' . $dir . '? [Y,n]? ')) { if ($useParentDirIfNoJsonAvailable === \true) { $io->writeError('No composer.json in current directory, changing working directory to ' . $dir . ''); } else { $io->writeError('Always want to use the parent dir? Use "composer config --global use-parent-dir true" to change the default.'); } $oldWorkingDir = Platform::getCwd(\true); \chdir($dir); } break; } $dir = \dirname($dir); } unset($dir, $home); } $needsSudoCheck = !Platform::isWindows() && \function_exists('exec') && !Platform::getEnv('COMPOSER_ALLOW_SUPERUSER') && !Platform::isDocker(); $isNonAllowedRoot = \false; // Clobber sudo credentials if COMPOSER_ALLOW_SUPERUSER is not set before loading plugins if ($needsSudoCheck) { $isNonAllowedRoot = $this->isRunningAsRoot(); if ($isNonAllowedRoot) { if ($uid = (int) Platform::getEnv('SUDO_UID')) { // Silently clobber any sudo credentials on the invoking user to avoid privilege escalations later on // ref. https://github.com/composer/composer/issues/5119 Silencer::call('exec', "sudo -u \\#{$uid} sudo -K > /dev/null 2>&1"); } } // Silently clobber any remaining sudo leases on the current user as well to avoid privilege escalations Silencer::call('exec', 'sudo -K > /dev/null 2>&1'); } // avoid loading plugins/initializing the Composer instance earlier than necessary if no plugin command is needed // if showing the version, we never need plugin commands $mayNeedPluginCommand = \false === $input->hasParameterOption(['--version', '-V']) && (\false === $commandName || \in_array($commandName, ['', 'list', 'help'], \true) || $commandName === '_complete' && !$isNonAllowedRoot); if ($mayNeedPluginCommand && !$this->disablePluginsByDefault && !$this->hasPluginCommands) { // at this point plugins are needed, so if we are running as root and it is not allowed we need to prompt // if interactive, and abort otherwise if ($isNonAllowedRoot) { $io->writeError('Do not run Composer as root/super user! See https://getcomposer.org/root for details'); if ($io->isInteractive() && $io->askConfirmation('Continue as root/super user [yes]? ')) { // avoid a second prompt later $isNonAllowedRoot = \false; } else { $io->writeError('Aborting as no plugin should be loaded if running as super user is not explicitly allowed'); return 1; } } try { foreach ($this->getPluginCommands() as $command) { if ($this->has($command->getName())) { $io->writeError('Plugin command ' . $command->getName() . ' (' . \get_class($command) . ') would override a Composer command and has been skipped'); } else { $this->add($command); } } } catch (NoSslException $e) { // suppress these as they are not relevant at this point } catch (ParsingException $e) { $details = $e->getDetails(); $file = \realpath(Factory::getComposerFile()); $line = null; if ($details && isset($details['line'])) { $line = $details['line']; } $ghe = new \Composer\Console\GithubActionError($this->io); $ghe->emit($e->getMessage(), $file, $line); throw $e; } $this->hasPluginCommands = \true; } if (!$this->disablePluginsByDefault && $isNonAllowedRoot && !$io->isInteractive()) { $io->writeError('Composer plugins have been disabled for safety in this non-interactive session.'); $io->writeError('Set COMPOSER_ALLOW_SUPERUSER=1 if you want to allow plugins to run as root/super user.'); $this->disablePluginsByDefault = \true; } // determine command name to be executed incl plugin commands, and check if it's a proxy command $isProxyCommand = \false; if ($name = $this->getCommandNameBeforeBinding($input)) { try { $command = $this->find($name); $commandName = $command->getName(); $isProxyCommand = $command instanceof Command\BaseCommand && $command->isProxyCommand(); } catch (\InvalidArgumentException $e) { } } if (!$isProxyCommand) { $io->writeError(\sprintf('Running %s (%s) with %s on %s', Composer::getVersion(), Composer::RELEASE_DATE, \defined('_ContaoManager\\HHVM_VERSION') ? 'HHVM ' . HHVM_VERSION : 'PHP ' . \PHP_VERSION, \function_exists('php_uname') ? \php_uname('s') . ' / ' . \php_uname('r') : 'Unknown OS'), \true, IOInterface::DEBUG); if (\PHP_VERSION_ID < 70205) { $io->writeError('Composer supports PHP 7.2.5 and above, you will most likely encounter problems with your PHP ' . \PHP_VERSION . '. Upgrading is strongly recommended but you can use Composer 2.2.x LTS as a fallback.'); } if (XdebugHandler::isXdebugActive() && !Platform::getEnv('COMPOSER_DISABLE_XDEBUG_WARN')) { $io->writeError('Composer is operating slower than normal because you have Xdebug enabled. See https://getcomposer.org/xdebug'); } if (\defined('COMPOSER_DEV_WARNING_TIME') && $commandName !== 'self-update' && $commandName !== 'selfupdate' && \time() > \COMPOSER_DEV_WARNING_TIME) { $io->writeError(\sprintf('Warning: This development build of Composer is over 60 days old. It is recommended to update it by running "%s self-update" to get the latest version.', $_SERVER['PHP_SELF'])); } if ($isNonAllowedRoot) { if ($commandName !== 'self-update' && $commandName !== 'selfupdate' && $commandName !== '_complete') { $io->writeError('Do not run Composer as root/super user! See https://getcomposer.org/root for details'); if ($io->isInteractive()) { if (!$io->askConfirmation('Continue as root/super user [yes]? ')) { return 1; } } } } // Check system temp folder for usability as it can cause weird runtime issues otherwise Silencer::call(static function () use($io) : void { $pid = \function_exists('getmypid') ? \getmypid() . '-' : ''; $tempfile = \sys_get_temp_dir() . '/temp-' . $pid . \bin2hex(\random_bytes(5)); if (!(\file_put_contents($tempfile, __FILE__) && \file_get_contents($tempfile) === __FILE__ && \unlink($tempfile) && !\file_exists($tempfile))) { $io->writeError(\sprintf('PHP temp directory (%s) does not exist or is not writable to Composer. Set sys_temp_dir in your php.ini', \sys_get_temp_dir())); } }); // add non-standard scripts as own commands $file = Factory::getComposerFile(); if (\is_file($file) && Filesystem::isReadable($file) && \is_array($composer = \json_decode(\file_get_contents($file), \true))) { if (isset($composer['scripts']) && \is_array($composer['scripts'])) { foreach ($composer['scripts'] as $script => $dummy) { if (!\defined('Composer\\Script\\ScriptEvents::' . \str_replace('-', '_', \strtoupper($script)))) { if ($this->has($script)) { $io->writeError('A script named ' . $script . ' would override a Composer command and has been skipped'); } else { $description = null; if (isset($composer['scripts-descriptions'][$script])) { $description = $composer['scripts-descriptions'][$script]; } $aliases = $composer['scripts-aliases'][$script] ?? []; $this->add(new Command\ScriptAliasCommand($script, $description, $aliases)); } } } } } } try { if ($input->hasParameterOption('--profile')) { $startTime = \microtime(\true); $this->io->enableDebugging($startTime); } $result = parent::doRun($input, $output); if (\true === $input->hasParameterOption(['--version', '-V'], \true)) { $io->writeError(\sprintf('PHP version %s (%s)', \PHP_VERSION, \PHP_BINARY)); $io->writeError('Run the "diagnose" command to get more detailed diagnostics output.'); } // chdir back to $oldWorkingDir if set if (isset($oldWorkingDir) && '' !== $oldWorkingDir) { Silencer::call('chdir', $oldWorkingDir); } if (isset($startTime)) { $io->writeError('Memory usage: ' . \round(\memory_get_usage() / 1024 / 1024, 2) . 'MiB (peak: ' . \round(\memory_get_peak_usage() / 1024 / 1024, 2) . 'MiB), time: ' . \round(\microtime(\true) - $startTime, 2) . 's'); } return $result; } catch (ScriptExecutionException $e) { if ($this->getDisablePluginsByDefault() && $this->isRunningAsRoot() && !$this->io->isInteractive()) { $io->writeError('Plugins have been disabled automatically as you are running as root, this may be the cause of the script failure.', \true, IOInterface::QUIET); $io->writeError('See also https://getcomposer.org/root', \true, IOInterface::QUIET); } return $e->getCode(); } catch (\Throwable $e) { $ghe = new \Composer\Console\GithubActionError($this->io); $ghe->emit($e->getMessage()); $this->hintCommonErrors($e, $output); // symfony/console <6.4 does not handle \Error subtypes so we have to renderThrowable ourselves // instead of rethrowing those for consumption by the parent class // can be removed when Composer supports PHP 8.1+ if (!\method_exists($this, 'setCatchErrors') && !$e instanceof \Exception) { if ($output instanceof ConsoleOutputInterface) { $this->renderThrowable($e, $output->getErrorOutput()); } else { $this->renderThrowable($e, $output); } return \max(1, $e->getCode()); } // override TransportException's code for the purpose of parent::run() using it as process exit code // as http error codes are all beyond the 255 range of permitted exit codes if ($e instanceof TransportException) { $reflProp = new \ReflectionProperty($e, 'code'); $reflProp->setAccessible(\true); $reflProp->setValue($e, Installer::ERROR_TRANSPORT_EXCEPTION); } throw $e; } finally { \restore_error_handler(); } } /** * @throws \RuntimeException * @return ?string */ private function getNewWorkingDir(InputInterface $input) : ?string { /** @var string|null $workingDir */ $workingDir = $input->getParameterOption(['--working-dir', '-d'], null, \true); if (null !== $workingDir && !\is_dir($workingDir)) { throw new \RuntimeException('Invalid working directory specified, ' . $workingDir . ' does not exist.'); } return $workingDir; } private function hintCommonErrors(\Throwable $exception, OutputInterface $output) : void { $io = $this->getIO(); if ((\get_class($exception) === LogicException::class || $exception instanceof \Error) && $output->getVerbosity() < OutputInterface::VERBOSITY_VERBOSE) { $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); } Silencer::suppress(); try { $composer = $this->getComposer(\false, \true); if (null !== $composer && \function_exists('disk_free_space')) { $config = $composer->getConfig(); $minSpaceFree = 100 * 1024 * 1024; if (($df = \disk_free_space($dir = $config->get('home'))) !== \false && $df < $minSpaceFree || ($df = \disk_free_space($dir = $config->get('vendor-dir'))) !== \false && $df < $minSpaceFree || ($df = \disk_free_space($dir = \sys_get_temp_dir())) !== \false && $df < $minSpaceFree) { $io->writeError('The disk hosting ' . $dir . ' has less than 100MiB of free space, this may be the cause of the following exception', \true, IOInterface::QUIET); } } } catch (\Exception $e) { } Silencer::restore(); if ($exception instanceof TransportException && \str_contains($exception->getMessage(), 'Unable to use a proxy')) { $io->writeError('The following exception indicates your proxy is misconfigured', \true, IOInterface::QUIET); $io->writeError('Check https://getcomposer.org/doc/faqs/how-to-use-composer-behind-a-proxy.md for details', \true, IOInterface::QUIET); } if (Platform::isWindows() && $exception instanceof TransportException && \str_contains($exception->getMessage(), 'unable to get local issuer certificate')) { $avastDetect = \glob('C:\\Program Files\\Avast*'); if (\is_array($avastDetect) && \count($avastDetect) !== 0) { $io->writeError('The following exception indicates a possible issue with the Avast Firewall', \true, IOInterface::QUIET); $io->writeError('Check https://getcomposer.org/local-issuer for details', \true, IOInterface::QUIET); } } if (Platform::isWindows() && \false !== \strpos($exception->getMessage(), 'The system cannot find the path specified')) { $io->writeError('The following exception may be caused by a stale entry in your cmd.exe AutoRun', \true, IOInterface::QUIET); $io->writeError('Check https://getcomposer.org/doc/articles/troubleshooting.md#-the-system-cannot-find-the-path-specified-windows- for details', \true, IOInterface::QUIET); } if (\false !== \strpos($exception->getMessage(), 'fork failed - Cannot allocate memory')) { $io->writeError('The following exception is caused by a lack of memory or swap, or not having swap configured', \true, IOInterface::QUIET); $io->writeError('Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details', \true, IOInterface::QUIET); } if ($exception instanceof ProcessTimedOutException) { $io->writeError('The following exception is caused by a process timeout', \true, IOInterface::QUIET); $io->writeError('Check https://getcomposer.org/doc/06-config.md#process-timeout for details', \true, IOInterface::QUIET); } if ($this->getDisablePluginsByDefault() && $this->isRunningAsRoot() && !$this->io->isInteractive()) { $io->writeError('Plugins have been disabled automatically as you are running as root, this may be the cause of the following exception. See also https://getcomposer.org/root', \true, IOInterface::QUIET); } elseif ($exception instanceof CommandNotFoundException && $this->getDisablePluginsByDefault()) { $io->writeError('Plugins have been disabled, which may be why some commands are missing, unless you made a typo', \true, IOInterface::QUIET); } $hints = HttpDownloader::getExceptionHints($exception); if (null !== $hints && \count($hints) > 0) { foreach ($hints as $hint) { $io->writeError($hint, \true, IOInterface::QUIET); } } } /** * @throws JsonValidationException * @throws \InvalidArgumentException * @return ?Composer If $required is true then the return value is guaranteed */ public function getComposer(bool $required = \true, ?bool $disablePlugins = null, ?bool $disableScripts = null) : ?Composer { if (null === $disablePlugins) { $disablePlugins = $this->disablePluginsByDefault; } if (null === $disableScripts) { $disableScripts = $this->disableScriptsByDefault; } if (null === $this->composer) { try { $this->composer = Factory::create(Platform::isInputCompletionProcess() ? new NullIO() : $this->io, null, $disablePlugins, $disableScripts); } catch (\InvalidArgumentException $e) { if ($required) { $this->io->writeError($e->getMessage()); if ($this->areExceptionsCaught()) { exit(1); } throw $e; } } catch (JsonValidationException $e) { if ($required) { throw $e; } } catch (RuntimeException $e) { if ($required) { throw $e; } } } return $this->composer; } /** * Removes the cached composer instance */ public function resetComposer() : void { $this->composer = null; if (\method_exists($this->getIO(), 'resetAuthentications')) { $this->getIO()->resetAuthentications(); } } public function getIO() : IOInterface { return $this->io; } public function getHelp() : string { return self::$logo . parent::getHelp(); } /** * Initializes all the composer commands. * @return \Symfony\Component\Console\Command\Command[] */ protected function getDefaultCommands() : array { $commands = \array_merge(parent::getDefaultCommands(), [new Command\AboutCommand(), new Command\ConfigCommand(), new Command\DependsCommand(), new Command\ProhibitsCommand(), new Command\InitCommand(), new Command\InstallCommand(), new Command\CreateProjectCommand(), new Command\UpdateCommand(), new Command\SearchCommand(), new Command\ValidateCommand(), new Command\AuditCommand(), new Command\ShowCommand(), new Command\SuggestsCommand(), new Command\RequireCommand(), new Command\DumpAutoloadCommand(), new Command\StatusCommand(), new Command\ArchiveCommand(), new Command\DiagnoseCommand(), new Command\RunScriptCommand(), new Command\LicensesCommand(), new Command\GlobalCommand(), new Command\ClearCacheCommand(), new Command\RemoveCommand(), new Command\HomeCommand(), new Command\ExecCommand(), new Command\OutdatedCommand(), new Command\CheckPlatformReqsCommand(), new Command\FundCommand(), new Command\ReinstallCommand(), new Command\BumpCommand()]); if (\strpos(__FILE__, 'phar:') === 0 || '1' === Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING')) { $commands[] = new Command\SelfUpdateCommand(); } return $commands; } /** * This ensures we can find the correct command name even if a global input option is present before it * * e.g. "composer -d foo bar" should detect bar as the command name, and not foo */ private function getCommandNameBeforeBinding(InputInterface $input) : ?string { $input = clone $input; try { // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument. $input->bind($this->getDefinition()); } catch (ExceptionInterface $e) { // Errors must be ignored, full binding/validation happens later when the command is known. } return $input->getFirstArgument(); } public function getLongVersion() : string { $branchAliasString = ''; if (Composer::BRANCH_ALIAS_VERSION && Composer::BRANCH_ALIAS_VERSION !== '@package_branch_alias_version' . '@') { $branchAliasString = \sprintf(' (%s)', Composer::BRANCH_ALIAS_VERSION); } return \sprintf('%s version %s%s %s', $this->getName(), $this->getVersion(), $branchAliasString, Composer::RELEASE_DATE); } protected function getDefaultInputDefinition() : InputDefinition { $definition = parent::getDefaultInputDefinition(); $definition->addOption(new InputOption('--profile', null, InputOption::VALUE_NONE, 'Display timing and memory usage information')); $definition->addOption(new InputOption('--no-plugins', null, InputOption::VALUE_NONE, 'Whether to disable plugins.')); $definition->addOption(new InputOption('--no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.')); $definition->addOption(new InputOption('--working-dir', '-d', InputOption::VALUE_REQUIRED, 'If specified, use the given directory as working directory.')); $definition->addOption(new InputOption('--no-cache', null, InputOption::VALUE_NONE, 'Prevent use of the cache')); return $definition; } /** * @return Command\BaseCommand[] */ private function getPluginCommands() : array { $commands = []; $composer = $this->getComposer(\false, \false); if (null === $composer) { $composer = Factory::createGlobal($this->io, $this->disablePluginsByDefault, $this->disableScriptsByDefault); } if (null !== $composer) { $pm = $composer->getPluginManager(); foreach ($pm->getPluginCapabilities('Composer\\Plugin\\Capability\\CommandProvider', ['composer' => $composer, 'io' => $this->io]) as $capability) { $newCommands = $capability->getCommands(); if (!\is_array($newCommands)) { throw new \UnexpectedValueException('Plugin capability ' . \get_class($capability) . ' failed to return an array from getCommands'); } foreach ($newCommands as $command) { if (!$command instanceof Command\BaseCommand) { throw new \UnexpectedValueException('Plugin capability ' . \get_class($capability) . ' returned an invalid value, we expected an array of Composer\\Command\\BaseCommand objects'); } } $commands = \array_merge($commands, $newCommands); } } return $commands; } /** * Get the working directory at startup time * * @return string|false */ public function getInitialWorkingDirectory() { return $this->initialWorkingDirectory; } public function getDisablePluginsByDefault() : bool { return $this->disablePluginsByDefault; } public function getDisableScriptsByDefault() : bool { return $this->disableScriptsByDefault; } /** * @return 'prompt'|bool */ private function getUseParentDirConfigValue() { $config = Factory::createConfig($this->io); return $config->get('use-parent-dir'); } private function isRunningAsRoot() : bool { return \function_exists('posix_getuid') && \posix_getuid() === 0; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console; use Composer\IO\IOInterface; use Composer\Util\Platform; final class GithubActionError { /** * @var IOInterface */ protected $io; public function __construct(IOInterface $io) { $this->io = $io; } public function emit(string $message, ?string $file = null, ?int $line = null) : void { if (Platform::getEnv('GITHUB_ACTIONS') && !Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING')) { $message = $this->escapeData($message); if ($file && $line) { $file = $this->escapeProperty($file); $this->io->write("::error file=" . $file . ",line=" . $line . "::" . $message); } elseif ($file) { $file = $this->escapeProperty($file); $this->io->write("::error file=" . $file . "::" . $message); } else { $this->io->write("::error ::" . $message); } } } private function escapeData(string $data) : string { // see https://github.com/actions/toolkit/blob/4f7fb6513a355689f69f0849edeb369a4dc81729/packages/core/src/command.ts#L80-L85 $data = \str_replace("%", '%25', $data); $data = \str_replace("\r", '%0D', $data); $data = \str_replace("\n", '%0A', $data); return $data; } private function escapeProperty(string $property) : string { // see https://github.com/actions/toolkit/blob/4f7fb6513a355689f69f0849edeb369a4dc81729/packages/core/src/command.ts#L87-L94 $property = \str_replace("%", '%25', $property); $property = \str_replace("\r", '%0D', $property); $property = \str_replace("\n", '%0A', $property); $property = \str_replace(":", '%3A', $property); $property = \str_replace(",", '%2C', $property); return $property; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console\Input; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; use _ContaoManager\Symfony\Component\Console\Completion\CompletionSuggestions; use _ContaoManager\Symfony\Component\Console\Completion\Suggestion; use _ContaoManager\Symfony\Component\Console\Exception\InvalidArgumentException; use _ContaoManager\Symfony\Component\Console\Exception\LogicException; use _ContaoManager\Symfony\Component\Console\Input\InputArgument as BaseInputArgument; /** * Backport suggested values definition from symfony/console 6.1+ * * @author Jérôme Tamarelle * * @internal * * TODO symfony/console:6.1 drop when PHP 8.1 / symfony 6.1+ can be required */ class InputArgument extends BaseInputArgument { /** * @var list|\Closure(CompletionInput,CompletionSuggestions):list */ private $suggestedValues; /** * @param string $name The argument name * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL * @param string $description A description text * @param string|bool|int|float|string[]|null $default The default value (for self::OPTIONAL mode only) * @param list|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion * * @throws InvalidArgumentException When argument mode is not valid */ public function __construct(string $name, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) { parent::__construct($name, $mode, $description, $default); $this->suggestedValues = $suggestedValues; } /** * Adds suggestions to $suggestions for the current completion input. * * @see Command::complete() */ public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { $values = $this->suggestedValues; if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { // @phpstan-ignore function.impossibleType throw new LogicException(\sprintf('Closure for option "%s" must return an array. Got "%s".', $this->getName(), \get_debug_type($values))); } if ([] !== $values) { $suggestions->suggestValues($values); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console\Input; use _ContaoManager\Symfony\Component\Console\Completion\CompletionInput; use _ContaoManager\Symfony\Component\Console\Completion\CompletionSuggestions; use _ContaoManager\Symfony\Component\Console\Completion\Suggestion; use _ContaoManager\Symfony\Component\Console\Exception\InvalidArgumentException; use _ContaoManager\Symfony\Component\Console\Exception\LogicException; use _ContaoManager\Symfony\Component\Console\Input\InputOption as BaseInputOption; /** * Backport suggested values definition from symfony/console 6.1+ * * @author Jérôme Tamarelle * * @internal * * TODO symfony/console:6.1 drop when PHP 8.1 / symfony 6.1+ can be required */ class InputOption extends BaseInputOption { /** * @var list|\Closure(CompletionInput,CompletionSuggestions):list */ private $suggestedValues; /** * @param string|string[]|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts * @param int|null $mode The option mode: One of the VALUE_* constants * @param string|bool|int|float|string[]|null $default The default value (must be null for self::VALUE_NONE) * @param list|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completionnull for self::VALUE_NONE) * * @throws InvalidArgumentException If option mode is invalid or incompatible */ public function __construct(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) { parent::__construct($name, $shortcut, $mode, $description, $default); $this->suggestedValues = $suggestedValues; if ([] !== $suggestedValues && !$this->acceptValue()) { throw new LogicException('Cannot set suggested values if the option does not accept a value.'); } } /** * Adds suggestions to $suggestions for the current completion input. * * @see Command::complete() */ public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void { $values = $this->suggestedValues; if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { // @phpstan-ignore function.impossibleType throw new LogicException(\sprintf('Closure for argument "%s" must return an array. Got "%s".', $this->getName(), \get_debug_type($values))); } if ([] !== $values) { $suggestions->suggestValues($values); } } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console; use Closure; use Composer\Pcre\Preg; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatter; use _ContaoManager\Symfony\Component\Console\Formatter\OutputFormatterStyle; /** * @author Jordi Boggiano */ class HtmlOutputFormatter extends OutputFormatter { /** @var array */ private static $availableForegroundColors = [30 => 'black', 31 => 'red', 32 => 'green', 33 => 'yellow', 34 => 'blue', 35 => 'magenta', 36 => 'cyan', 37 => 'white']; /** @var array */ private static $availableBackgroundColors = [40 => 'black', 41 => 'red', 42 => 'green', 43 => 'yellow', 44 => 'blue', 45 => 'magenta', 46 => 'cyan', 47 => 'white']; /** @var array */ private static $availableOptions = [1 => 'bold', 4 => 'underscore']; /** * @param array $styles Array of "name => FormatterStyle" instances */ public function __construct(array $styles = []) { parent::__construct(\true, $styles); } public function format(?string $message) : ?string { $formatted = parent::format($message); if ($formatted === null) { return null; } $clearEscapeCodes = '(?:39|49|0|22|24|25|27|28)'; return Preg::replaceCallback("{\x1b\\[([0-9;]+)m(.*?)\x1b\\[(?:" . $clearEscapeCodes . ";)*?" . $clearEscapeCodes . "m}s", Closure::fromCallable([$this, 'formatHtml']), $formatted); } /** * @param array $matches */ private function formatHtml(array $matches) : string { \assert(\is_string($matches[1])); $out = '' . $matches[2] . ''; } } * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Composer\Autoload\ClassLoader; function includeIfExists(string $file) : ?ClassLoader { return \file_exists($file) ? include $file : null; } if (!($loader = includeIfExists(__DIR__ . '/../vendor/autoload.php')) && !($loader = includeIfExists(__DIR__ . '/../../../autoload.php'))) { echo 'You must set up the project dependencies using `composer install`' . \PHP_EOL . 'See https://getcomposer.org/download/ for instructions on installing Composer' . \PHP_EOL; exit(1); } return $loader; ## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Tue May 20 03:12:02 2025 GMT ## ## Find updated versions here: https://curl.se/docs/caextract.html ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/release/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. ## SHA256: 8944ec6b572b577daee4fc681a425881f841ec2660e4cb5f0eee727f84620697 ## Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== -----END CERTIFICATE----- UCA Extended Validation Root ============================ -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR 59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH 0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS 3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb +7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr dhh2n1ax -----END CERTIFICATE----- Certigna Root CA ================ -----BEGIN CERTIFICATE----- MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= -----END CERTIFICATE----- emSign Root CA - G1 =================== -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx iN66zB+Afko= -----END CERTIFICATE----- emSign ECC Root CA - G3 ======================= -----BEGIN CERTIFICATE----- MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj -----END CERTIFICATE----- emSign Root CA - C1 =================== -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= -----END CERTIFICATE----- emSign ECC Root CA - C3 ======================= -----BEGIN CERTIFICATE----- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== -----END CERTIFICATE----- Hongkong Post Root CA 3 ======================= -----BEGIN CERTIFICATE----- MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq dBb9HxEGmpv0 -----END CERTIFICATE----- Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= -----END CERTIFICATE----- Microsoft RSA Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E -----END CERTIFICATE----- e-Szigno Root CA 2017 ===================== -----BEGIN CERTIFICATE----- MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO svxyqltZ+efcMQ== -----END CERTIFICATE----- certSIGN Root CA G2 =================== -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- Trustwave Global Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm +9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla 4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O 856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu 3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP 29FpHOTKyeC2nOnOcXHebD8WpHk= -----END CERTIFICATE----- Trustwave Global ECC P256 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj 43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt 0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 -----END CERTIFICATE----- Trustwave Global ECC P384 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr /TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== -----END CERTIFICATE----- NAVER Global Root Certification Authority ========================================= -----BEGIN CERTIFICATE----- MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW +j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK 21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg kpzNNIaRkPpkUZ3+/uul9XXeifdy -----END CERTIFICATE----- AC RAIZ FNMT-RCM SERVIDORES SEGUROS =================================== -----BEGIN CERTIFICATE----- MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= -----END CERTIFICATE----- GlobalSign Root R46 =================== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje 2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 QEUxeCp6 -----END CERTIFICATE----- GlobalSign Root E46 =================== -----BEGIN CERTIFICATE----- MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- GLOBALTRUST 2020 ================ -----BEGIN CERTIFICATE----- MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw 4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS 8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== -----END CERTIFICATE----- ANF Secure Server Root CA ========================= -----BEGIN CERTIFICATE----- MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j 7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe 8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM 5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb 5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= -----END CERTIFICATE----- Certum EC-384 CA ================ -----BEGIN CERTIFICATE----- MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= -----END CERTIFICATE----- Certum Trusted Root CA ====================== -----BEGIN CERTIFICATE----- MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA 4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj 6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb -----END CERTIFICATE----- TunTrust Root CA ================ -----BEGIN CERTIFICATE----- MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz 2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI 04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl 0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= -----END CERTIFICATE----- HARICA TLS RSA Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K 5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR 0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= -----END CERTIFICATE----- HARICA TLS ECC Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW 0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL 4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH 9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE ZycPvEJdvSRUDewdcAZfpLz6IHxV -----END CERTIFICATE----- vTrus ECC Root CA ================= -----BEGIN CERTIFICATE----- MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL YgmRWAD5Tfs0aNoJrSEGGJTO -----END CERTIFICATE----- vTrus Root CA ============= -----BEGIN CERTIFICATE----- MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu /9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu 1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO 9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H l3s= -----END CERTIFICATE----- ISRG Root X2 ============ -----BEGIN CERTIFICATE----- MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn -----END CERTIFICATE----- HiPKI Root CA - G1 ================== -----BEGIN CERTIFICATE----- MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj 1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF 8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi 7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv 5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm -----END CERTIFICATE----- GTS Root R1 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk 9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ 7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 gm3c -----END CERTIFICATE----- GTS Root R2 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS +LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel /FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M 7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW HYbL -----END CERTIFICATE----- GTS Root R3 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout 736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV 11RZt+cRLInUue4X -----END CERTIFICATE----- GTS Root R4 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh 4rsUecrNIdSUtUlD -----END CERTIFICATE----- Telia Root CA v2 ================ -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q 9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW 5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ 8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= -----END CERTIFICATE----- D-TRUST BR Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 -----END CERTIFICATE----- D-TRUST EV Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW -----END CERTIFICATE----- DigiCert TLS ECC P384 Root G5 ============================= -----BEGIN CERTIFICATE----- MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB /wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== -----END CERTIFICATE----- DigiCert TLS RSA4096 Root G5 ============================ -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh 47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP bEtoL8pU9ozaMv7Da4M/OMZ+ -----END CERTIFICATE----- Certainly Root R1 ================= -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O 5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl 8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d 8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= -----END CERTIFICATE----- Certainly Root E1 ================= -----BEGIN CERTIFICATE----- MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- Security Communication ECC RootCA1 ================================== -----BEGIN CERTIFICATE----- MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo 5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e N9k= -----END CERTIFICATE----- BJCA Global Root CA1 ==================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW 4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx 4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps 3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= -----END CERTIFICATE----- BJCA Global Root CA2 ==================== -----BEGIN CERTIFICATE----- MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK /eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI 1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== -----END CERTIFICATE----- Sectigo Public Server Authentication Root E46 ============================================= -----BEGIN CERTIFICATE----- MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U SAGKcw== -----END CERTIFICATE----- Sectigo Public Server Authentication Root R46 ============================================= -----BEGIN CERTIFICATE----- MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k 1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW 6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M 0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI 84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL -----END CERTIFICATE----- SSL.com TLS RSA Root CA 2022 ============================ -----BEGIN CERTIFICATE----- MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u 9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y 7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk 8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk 7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= -----END CERTIFICATE----- SSL.com TLS ECC Root CA 2022 ============================ -----BEGIN CERTIFICATE----- MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w 7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 Zn6g6g== -----END CERTIFICATE----- Atos TrustedRoot Root CA ECC TLS 2021 ===================================== -----BEGIN CERTIFICATE----- MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY a3cpetskz2VAv9LcjBHo9H1/IISpQuQo -----END CERTIFICATE----- Atos TrustedRoot Root CA RSA TLS 2021 ===================================== -----BEGIN CERTIFICATE----- MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt 0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS 4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj 1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W HYMfRsCbvUOZ58SWLs5fyQ== -----END CERTIFICATE----- TrustAsia Global Root CA G3 =========================== -----BEGIN CERTIFICATE----- MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm 9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj 7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys +TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli 2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH -----END CERTIFICATE----- TrustAsia Global Root CA G4 =========================== -----BEGIN CERTIFICATE----- MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== -----END CERTIFICATE----- CommScope Public Trust ECC Root-01 ================================== -----BEGIN CERTIFICATE----- MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot 6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= -----END CERTIFICATE----- CommScope Public Trust ECC Root-02 ================================== -----BEGIN CERTIFICATE----- MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== -----END CERTIFICATE----- CommScope Public Trust RSA Root-01 ================================== -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH +VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM 3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc 1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM 6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw -----END CERTIFICATE----- CommScope Public Trust RSA Root-02 ================================== -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx 7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF 1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN lM47ni3niAIi9G7oyOzWPPO5std3eqx7 -----END CERTIFICATE----- Telekom Security TLS ECC Root 2020 ================================== -----BEGIN CERTIFICATE----- MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU ga/sf+Rn27iQ7t0l -----END CERTIFICATE----- Telekom Security TLS RSA Root 2023 ================================== -----BEGIN CERTIFICATE----- MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9 FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+ sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy /SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4 mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8 wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0 o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A= -----END CERTIFICATE----- FIRMAPROFESIONAL CA ROOT-A WEB ============================== -----BEGIN CERTIFICATE----- MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4 MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2 WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6 iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB /wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ pYXFuXqUPoeovQA= -----END CERTIFICATE----- TWCA CYBER Root CA ================== -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK /c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF 2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83 QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq /p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X -----END CERTIFICATE----- SecureSign Root CA12 ==================== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3 emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== -----END CERTIFICATE----- SecureSign Root CA14 ==================== -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh 1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb 1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa /d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0 dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/ OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S -----END CERTIFICATE----- SecureSign Root CA15 ==================== -----BEGIN CERTIFICATE----- MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1 cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB 2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= -----END CERTIFICATE----- D-TRUST BR Root CA 2 2023 ========================= -----BEGIN CERTIFICATE----- MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0Eg MiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUwOTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTAT BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCT cfKri3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNEgXtRr90z sWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8k12b9py0i4a6Ibn08OhZ WiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCTRphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6 ++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LUL QyReS2tNZ9/WtT5PeB+UcSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIv x9gvdhFP/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bSuREV MweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+0bpwHJwh5Q8xaRfX /Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4NDfTisl01gLmB1IRpkQLLddCNxbU9 CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUZ5Dw1t61GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tIFoE9c+CeJyrr d6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67nriv6uvw8l5VAk1/DLQOj7aRv U9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTRVFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4 nj8+AybmTNudX0KEPUUDAxxZiMrcLmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdij YQ6qgYF/6FKC0ULn4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff /vtDhQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsGkoHU6XCP pz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46ls/pdu4D58JDUjxqgejB WoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aSEcr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/ 5usWDiJFAbzdNpQ0qTUmiteXue4Icr80knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jt n/mtd+ArY0+ew+43u3gJhJ65bvspmZDogNOfJA== -----END CERTIFICATE----- D-TRUST EV Root CA 2 2023 ========================= -----BEGIN CERTIFICATE----- MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0Eg MiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUwOTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTAT BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1 sJkKF8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE7CUXFId/ MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFeEMbsh2aJgWi6zCudR3Mf vc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6lHPTGGkKSv/BAQP/eX+1SH977ugpbzZM lWGG2Pmic4ruri+W7mjNPU0oQvlFKzIbRlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3 YG14C8qKXO0elg6DpkiVjTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq910 7PncjLgcjmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZxTnXo nMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ARZZaBhDM7DS3LAa QzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nkhbDhezGdpn9yo7nELC7MmVcOIQxF AZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knFNXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUqvyREBuHkV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14QvBukEdHjqOS Mo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4pZt+UPJ26oUFKidBK7GB0aL2 QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xD UmPBEcrCRbH0O1P1aa4846XerOhUt7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V 4U/M5d40VxDJI3IXcI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuo dNv8ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT2vFp4LJi TZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs7dpn1mKmS00PaaLJvOwi S5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNPgofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/ HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAstNl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L +KIkBI3Y4WNeApI02phhXBxvWHZks/wCuPWdCg== -----END CERTIFICATE----- Copyright (C) 2016 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. composer/ca-bundle ================== Small utility library that lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. Installation ------------ Install the latest version with: ```bash $ composer require composer/ca-bundle ``` Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. Basic usage ----------- ### `Composer\CaBundle\CaBundle` - `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback - `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file - `CaBundle::validateCaFile($filename)`: Validates a CA file using openssl_x509_parse only if it is safe to use - `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse() - `CaBundle::reset()`: Resets the static caches #### To use with curl ```php $curl = curl_init("https://example.org/"); $caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); if (is_dir($caPathOrFile)) { curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile); } else { curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile); } $result = curl_exec($curl); ``` #### To use with php streams ```php $opts = array( 'http' => array( 'method' => "GET" ) ); $caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); if (is_dir($caPathOrFile)) { $opts['ssl']['capath'] = $caPathOrFile; } else { $opts['ssl']['cafile'] = $caPathOrFile; } $context = stream_context_create($opts); $result = file_get_contents('https://example.com', false, $context); ``` #### To use with Guzzle ```php $client = new \GuzzleHttp\Client([ \GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath() ]); ``` License ------- composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details. { "name": "composer\/ca-bundle", "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "type": "library", "license": "MIT", "keywords": [ "cabundle", "cacert", "certificate", "ssl", "tls" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http:\/\/seld.be" } ], "support": { "irc": "irc:\/\/irc.freenode.org\/composer", "issues": "https:\/\/github.com\/composer\/ca-bundle\/issues" }, "require": { "ext-openssl": "*", "ext-pcre": "*", "php": "^7.2 || ^8.0" }, "require-dev": { "phpunit\/phpunit": "^8 || ^9", "phpstan\/phpstan": "^1.10", "psr\/log": "^1.0 || ^2.0 || ^3.0", "symfony\/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "autoload": { "psr-4": { "Composer\\CaBundle\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\CaBundle\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "scripts": { "test": "@php phpunit", "phpstan": "@php phpstan analyse" } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\CaBundle; use _ContaoManager\Psr\Log\LoggerInterface; use _ContaoManager\Symfony\Component\Process\PhpProcess; /** * @author Chris Smith * @author Jordi Boggiano */ class CaBundle { /** @var string|null */ private static $caPath; /** @var array */ private static $caFileValidity = array(); /** * Returns the system CA bundle path, or a path to the bundled one * * This method was adapted from Sslurp. * https://github.com/EvanDotPro/Sslurp * * (c) Evan Coury * * For the full copyright and license information, please see below: * * Copyright (c) 2013, Evan Coury * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @param LoggerInterface $logger optional logger for information about which CA files were loaded * @return string path to a CA bundle file or directory */ public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null) { if (self::$caPath !== null) { return self::$caPath; } $caBundlePaths = array(); // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE'); // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR'); $caBundlePaths[] = \ini_get('openssl.cafile'); $caBundlePaths[] = \ini_get('openssl.capath'); $otherLocations = array( '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) '/usr/ssl/certs/ca-bundle.crt', // Cygwin '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? '/etc/ssl/cert.pem', // OpenBSD '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package '/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package '/etc/pki/tls/certs', '/etc/ssl/certs', ); $caBundlePaths = \array_merge($caBundlePaths, $otherLocations); foreach ($caBundlePaths as $caBundle) { if ($caBundle && self::caFileUsable($caBundle, $logger)) { return self::$caPath = $caBundle; } if ($caBundle && self::caDirUsable($caBundle, $logger)) { return self::$caPath = $caBundle; } } return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort } /** * Returns the path to the bundled CA file * * In case you don't want to trust the user or the system, you can use this directly * * @return string path to a CA bundle file */ public static function getBundledCaBundlePath() { $caBundleFile = __DIR__ . '/../res/cacert.pem'; // cURL does not understand 'phar://' paths // see https://github.com/composer/ca-bundle/issues/10 if (0 === \strpos($caBundleFile, 'phar://')) { $tempCaBundleFile = \tempnam(\sys_get_temp_dir(), 'openssl-ca-bundle-'); if (\false === $tempCaBundleFile) { throw new \RuntimeException('Could not create a temporary file to store the bundled CA file'); } \file_put_contents($tempCaBundleFile, \file_get_contents($caBundleFile)); \register_shutdown_function(function () use($tempCaBundleFile) { @\unlink($tempCaBundleFile); }); $caBundleFile = $tempCaBundleFile; } return $caBundleFile; } /** * Validates a CA file using opensl_x509_parse only if it is safe to use * * @param string $filename * @param LoggerInterface $logger optional logger for information about which CA files were loaded * * @return bool */ public static function validateCaFile($filename, ?LoggerInterface $logger = null) { static $warned = \false; if (isset(self::$caFileValidity[$filename])) { return self::$caFileValidity[$filename]; } $contents = \file_get_contents($filename); if (\is_string($contents) && \strlen($contents) > 0) { $contents = \preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents); if (null === $contents) { // regex extraction failed $isValid = \false; } else { $isValid = (bool) \openssl_x509_parse($contents); } } else { $isValid = \false; } if ($logger) { $logger->debug('Checked CA file ' . \realpath($filename) . ': ' . ($isValid ? 'valid' : 'invalid')); } return self::$caFileValidity[$filename] = $isValid; } /** * Test if it is safe to use the PHP function openssl_x509_parse(). * * This checks if OpenSSL extensions is vulnerable to remote code execution * via the exploit documented as CVE-2013-6420. * * @return bool */ public static function isOpensslParseSafe() { return \true; } /** * Resets the static caches * @return void */ public static function reset() { self::$caFileValidity = array(); self::$caPath = null; } /** * @param string $name * @return string|false */ private static function getEnvVariable($name) { if (isset($_SERVER[$name])) { return (string) $_SERVER[$name]; } if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== \false && $value !== null) { return (string) $value; } return \false; } /** * @param string|false $certFile * @param LoggerInterface|null $logger * @return bool */ private static function caFileUsable($certFile, ?LoggerInterface $logger = null) { return $certFile && self::isFile($certFile, $logger) && self::isReadable($certFile, $logger) && self::validateCaFile($certFile, $logger); } /** * @param string|false $certDir * @param LoggerInterface|null $logger * @return bool */ private static function caDirUsable($certDir, ?LoggerInterface $logger = null) { return $certDir && self::isDir($certDir, $logger) && self::isReadable($certDir, $logger) && self::glob($certDir . '/*', $logger); } /** * @param string $certFile * @param LoggerInterface|null $logger * @return bool */ private static function isFile($certFile, ?LoggerInterface $logger = null) { $isFile = @\is_file($certFile); if (!$isFile && $logger) { $logger->debug(\sprintf('Checked CA file %s does not exist or it is not a file.', $certFile)); } return $isFile; } /** * @param string $certDir * @param LoggerInterface|null $logger * @return bool */ private static function isDir($certDir, ?LoggerInterface $logger = null) { $isDir = @\is_dir($certDir); if (!$isDir && $logger) { $logger->debug(\sprintf('Checked directory %s does not exist or it is not a directory.', $certDir)); } return $isDir; } /** * @param string $certFileOrDir * @param LoggerInterface|null $logger * @return bool */ private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null) { $isReadable = @\is_readable($certFileOrDir); if (!$isReadable && $logger) { $logger->debug(\sprintf('Checked file or directory %s is not readable.', $certFileOrDir)); } return $isReadable; } /** * @param string $pattern * @param LoggerInterface|null $logger * @return bool */ private static function glob($pattern, ?LoggerInterface $logger = null) { $certs = \glob($pattern); if ($certs === \false) { if ($logger) { $logger->debug(\sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern)); } return \false; } if (\count($certs) === 0) { if ($logger) { $logger->debug(\sprintf("No CA files found for pattern: %s", $pattern)); } return \false; } return \true; } } array($vendorDir . '/studio24/rotate/src'), '_ContaoManager\\phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), '_ContaoManager\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), '_ContaoManager\\Webauthn\\' => array($vendorDir . '/web-auth/webauthn-lib/src'), '_ContaoManager\\Terminal42\\ComposerLockValidator\\' => array($vendorDir . '/terminal42/composer-lock-validator/src'), '_ContaoManager\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'), '_ContaoManager\\Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'), '_ContaoManager\\Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), '_ContaoManager\\Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'), '_ContaoManager\\Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), '_ContaoManager\\Symfony\\Component\\Uid\\' => array($vendorDir . '/symfony/uid'), '_ContaoManager\\Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), '_ContaoManager\\Symfony\\Component\\Serializer\\' => array($vendorDir . '/symfony/serializer'), '_ContaoManager\\Symfony\\Component\\Security\\Http\\' => array($vendorDir . '/symfony/security-http'), '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\' => array($vendorDir . '/symfony/security-csrf'), '_ContaoManager\\Symfony\\Component\\Security\\Core\\' => array($vendorDir . '/symfony/security-core'), '_ContaoManager\\Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'), '_ContaoManager\\Symfony\\Component\\PropertyInfo\\' => array($vendorDir . '/symfony/property-info'), '_ContaoManager\\Symfony\\Component\\PropertyAccess\\' => array($vendorDir . '/symfony/property-access'), '_ContaoManager\\Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), '_ContaoManager\\Symfony\\Component\\PasswordHasher\\' => array($vendorDir . '/symfony/password-hasher'), '_ContaoManager\\Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'), '_ContaoManager\\Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'), '_ContaoManager\\Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), '_ContaoManager\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), '_ContaoManager\\Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), '_ContaoManager\\Symfony\\Component\\ErrorHandler\\' => array($vendorDir . '/symfony/error-handler'), '_ContaoManager\\Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'), '_ContaoManager\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), '_ContaoManager\\Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'), '_ContaoManager\\Symfony\\Component\\Clock\\' => array($vendorDir . '/symfony/clock'), '_ContaoManager\\Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'), '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\' => array($vendorDir . '/symfony/security-bundle'), '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\' => array($vendorDir . '/symfony/monolog-bundle'), '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'), '_ContaoManager\\Symfony\\Bridge\\Monolog\\' => array($vendorDir . '/symfony/monolog-bridge'), '_ContaoManager\\SpomkyLabs\\Pki\\' => array($vendorDir . '/spomky-labs/pki-framework/src'), '_ContaoManager\\Seld\\Signal\\' => array($vendorDir . '/seld/signal-handler/src'), '_ContaoManager\\Seld\\PharUtils\\' => array($vendorDir . '/seld/phar-utils/src'), '_ContaoManager\\Seld\\JsonLint\\' => array($vendorDir . '/seld/jsonlint/src/Seld/JsonLint'), '_ContaoManager\\Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'), '_ContaoManager\\Ramsey\\Collection\\' => array($vendorDir . '/ramsey/collection/src'), '_ContaoManager\\Psr\\Log\\' => array($vendorDir . '/psr/log/src'), '_ContaoManager\\Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), '_ContaoManager\\Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), '_ContaoManager\\Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), '_ContaoManager\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), '_ContaoManager\\Psr\\Clock\\' => array($vendorDir . '/psr/clock/src'), '_ContaoManager\\Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), '_ContaoManager\\ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'), '_ContaoManager\\PHPStan\\PhpDocParser\\' => array($vendorDir . '/phpstan/phpdoc-parser/src'), '_ContaoManager\\OTPHP\\' => array($vendorDir . '/spomky-labs/otphp/src'), '_ContaoManager\\Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), '_ContaoManager\\Lcobucci\\Clock\\' => array($vendorDir . '/lcobucci/clock/src'), '_ContaoManager\\JsonSchema\\' => array($vendorDir . '/justinrainbow/json-schema/src/JsonSchema'), '_ContaoManager\\Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), '_ContaoManager\\Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/src'), '_ContaoManager\\Crell\\ApiProblem\\' => array($vendorDir . '/crell/api-problem/src'), '_ContaoManager\\Cose\\' => array($vendorDir . '/web-auth/cose-lib/src'), '_ContaoManager\\Contao\\ManagerApi\\' => array($baseDir . '/api'), '_ContaoManager\\CBOR\\' => array($vendorDir . '/spomky-labs/cbor-php/src'), '_ContaoManager\\Brick\\Math\\' => array($vendorDir . '/brick/math/src'), 'Symfony\\Polyfill\\Uuid\\' => array($vendorDir . '/symfony/polyfill-uuid'), 'Symfony\\Polyfill\\Php83\\' => array($vendorDir . '/symfony/polyfill-php83'), 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), 'Composer\\Spdx\\' => array($vendorDir . '/composer/spdx-licenses/src'), 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), 'Composer\\Pcre\\' => array($vendorDir . '/composer/pcre/src'), 'Composer\\MetadataMinifier\\' => array($vendorDir . '/composer/metadata-minifier/src'), 'Composer\\ClassMapGenerator\\' => array($vendorDir . '/composer/class-map-generator/src'), 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'), 'Composer\\' => array($vendorDir . '/composer/composer/src/Composer'), ); $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'CURLStringFile' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\Advisory\\Auditor' => $vendorDir . '/composer/composer/src/Composer/Advisory/Auditor.php', 'Composer\\Advisory\\IgnoredSecurityAdvisory' => $vendorDir . '/composer/composer/src/Composer/Advisory/IgnoredSecurityAdvisory.php', 'Composer\\Advisory\\PartialSecurityAdvisory' => $vendorDir . '/composer/composer/src/Composer/Advisory/PartialSecurityAdvisory.php', 'Composer\\Advisory\\SecurityAdvisory' => $vendorDir . '/composer/composer/src/Composer/Advisory/SecurityAdvisory.php', 'Composer\\Autoload\\AutoloadGenerator' => $vendorDir . '/composer/composer/src/Composer/Autoload/AutoloadGenerator.php', 'Composer\\Autoload\\ClassLoader' => $vendorDir . '/composer/composer/src/Composer/Autoload/ClassLoader.php', 'Composer\\Autoload\\ClassMapGenerator' => $vendorDir . '/composer/composer/src/Composer/Autoload/ClassMapGenerator.php', 'Composer\\CaBundle\\CaBundle' => $vendorDir . '/composer/ca-bundle/src/CaBundle.php', 'Composer\\Cache' => $vendorDir . '/composer/composer/src/Composer/Cache.php', 'Composer\\ClassMapGenerator\\ClassMap' => $vendorDir . '/composer/class-map-generator/src/ClassMap.php', 'Composer\\ClassMapGenerator\\ClassMapGenerator' => $vendorDir . '/composer/class-map-generator/src/ClassMapGenerator.php', 'Composer\\ClassMapGenerator\\FileList' => $vendorDir . '/composer/class-map-generator/src/FileList.php', 'Composer\\ClassMapGenerator\\PhpFileCleaner' => $vendorDir . '/composer/class-map-generator/src/PhpFileCleaner.php', 'Composer\\ClassMapGenerator\\PhpFileParser' => $vendorDir . '/composer/class-map-generator/src/PhpFileParser.php', 'Composer\\Command\\AboutCommand' => $vendorDir . '/composer/composer/src/Composer/Command/AboutCommand.php', 'Composer\\Command\\ArchiveCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ArchiveCommand.php', 'Composer\\Command\\AuditCommand' => $vendorDir . '/composer/composer/src/Composer/Command/AuditCommand.php', 'Composer\\Command\\BaseCommand' => $vendorDir . '/composer/composer/src/Composer/Command/BaseCommand.php', 'Composer\\Command\\BaseDependencyCommand' => $vendorDir . '/composer/composer/src/Composer/Command/BaseDependencyCommand.php', 'Composer\\Command\\BumpCommand' => $vendorDir . '/composer/composer/src/Composer/Command/BumpCommand.php', 'Composer\\Command\\CheckPlatformReqsCommand' => $vendorDir . '/composer/composer/src/Composer/Command/CheckPlatformReqsCommand.php', 'Composer\\Command\\ClearCacheCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ClearCacheCommand.php', 'Composer\\Command\\CompletionTrait' => $vendorDir . '/composer/composer/src/Composer/Command/CompletionTrait.php', 'Composer\\Command\\ConfigCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ConfigCommand.php', 'Composer\\Command\\CreateProjectCommand' => $vendorDir . '/composer/composer/src/Composer/Command/CreateProjectCommand.php', 'Composer\\Command\\DependsCommand' => $vendorDir . '/composer/composer/src/Composer/Command/DependsCommand.php', 'Composer\\Command\\DiagnoseCommand' => $vendorDir . '/composer/composer/src/Composer/Command/DiagnoseCommand.php', 'Composer\\Command\\DumpAutoloadCommand' => $vendorDir . '/composer/composer/src/Composer/Command/DumpAutoloadCommand.php', 'Composer\\Command\\ExecCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ExecCommand.php', 'Composer\\Command\\FundCommand' => $vendorDir . '/composer/composer/src/Composer/Command/FundCommand.php', 'Composer\\Command\\GlobalCommand' => $vendorDir . '/composer/composer/src/Composer/Command/GlobalCommand.php', 'Composer\\Command\\HomeCommand' => $vendorDir . '/composer/composer/src/Composer/Command/HomeCommand.php', 'Composer\\Command\\InitCommand' => $vendorDir . '/composer/composer/src/Composer/Command/InitCommand.php', 'Composer\\Command\\InstallCommand' => $vendorDir . '/composer/composer/src/Composer/Command/InstallCommand.php', 'Composer\\Command\\LicensesCommand' => $vendorDir . '/composer/composer/src/Composer/Command/LicensesCommand.php', 'Composer\\Command\\OutdatedCommand' => $vendorDir . '/composer/composer/src/Composer/Command/OutdatedCommand.php', 'Composer\\Command\\PackageDiscoveryTrait' => $vendorDir . '/composer/composer/src/Composer/Command/PackageDiscoveryTrait.php', 'Composer\\Command\\ProhibitsCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ProhibitsCommand.php', 'Composer\\Command\\ReinstallCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ReinstallCommand.php', 'Composer\\Command\\RemoveCommand' => $vendorDir . '/composer/composer/src/Composer/Command/RemoveCommand.php', 'Composer\\Command\\RequireCommand' => $vendorDir . '/composer/composer/src/Composer/Command/RequireCommand.php', 'Composer\\Command\\RunScriptCommand' => $vendorDir . '/composer/composer/src/Composer/Command/RunScriptCommand.php', 'Composer\\Command\\ScriptAliasCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ScriptAliasCommand.php', 'Composer\\Command\\SearchCommand' => $vendorDir . '/composer/composer/src/Composer/Command/SearchCommand.php', 'Composer\\Command\\SelfUpdateCommand' => $vendorDir . '/composer/composer/src/Composer/Command/SelfUpdateCommand.php', 'Composer\\Command\\ShowCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ShowCommand.php', 'Composer\\Command\\StatusCommand' => $vendorDir . '/composer/composer/src/Composer/Command/StatusCommand.php', 'Composer\\Command\\SuggestsCommand' => $vendorDir . '/composer/composer/src/Composer/Command/SuggestsCommand.php', 'Composer\\Command\\UpdateCommand' => $vendorDir . '/composer/composer/src/Composer/Command/UpdateCommand.php', 'Composer\\Command\\ValidateCommand' => $vendorDir . '/composer/composer/src/Composer/Command/ValidateCommand.php', 'Composer\\Compiler' => $vendorDir . '/composer/composer/src/Composer/Compiler.php', 'Composer\\Composer' => $vendorDir . '/composer/composer/src/Composer/Composer.php', 'Composer\\Config' => $vendorDir . '/composer/composer/src/Composer/Config.php', 'Composer\\Config\\ConfigSourceInterface' => $vendorDir . '/composer/composer/src/Composer/Config/ConfigSourceInterface.php', 'Composer\\Config\\JsonConfigSource' => $vendorDir . '/composer/composer/src/Composer/Config/JsonConfigSource.php', 'Composer\\Console\\Application' => $vendorDir . '/composer/composer/src/Composer/Console/Application.php', 'Composer\\Console\\GithubActionError' => $vendorDir . '/composer/composer/src/Composer/Console/GithubActionError.php', 'Composer\\Console\\HtmlOutputFormatter' => $vendorDir . '/composer/composer/src/Composer/Console/HtmlOutputFormatter.php', 'Composer\\Console\\Input\\InputArgument' => $vendorDir . '/composer/composer/src/Composer/Console/Input/InputArgument.php', 'Composer\\Console\\Input\\InputOption' => $vendorDir . '/composer/composer/src/Composer/Console/Input/InputOption.php', 'Composer\\DependencyResolver\\Decisions' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Decisions.php', 'Composer\\DependencyResolver\\DefaultPolicy' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/DefaultPolicy.php', 'Composer\\DependencyResolver\\GenericRule' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/GenericRule.php', 'Composer\\DependencyResolver\\LocalRepoTransaction' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/LocalRepoTransaction.php', 'Composer\\DependencyResolver\\LockTransaction' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/LockTransaction.php', 'Composer\\DependencyResolver\\MultiConflictRule' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/MultiConflictRule.php', 'Composer\\DependencyResolver\\Operation\\InstallOperation' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/InstallOperation.php', 'Composer\\DependencyResolver\\Operation\\MarkAliasInstalledOperation' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php', 'Composer\\DependencyResolver\\Operation\\MarkAliasUninstalledOperation' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php', 'Composer\\DependencyResolver\\Operation\\OperationInterface' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/OperationInterface.php', 'Composer\\DependencyResolver\\Operation\\SolverOperation' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/SolverOperation.php', 'Composer\\DependencyResolver\\Operation\\UninstallOperation' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/UninstallOperation.php', 'Composer\\DependencyResolver\\Operation\\UpdateOperation' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Operation/UpdateOperation.php', 'Composer\\DependencyResolver\\PolicyInterface' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/PolicyInterface.php', 'Composer\\DependencyResolver\\Pool' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Pool.php', 'Composer\\DependencyResolver\\PoolBuilder' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php', 'Composer\\DependencyResolver\\PoolOptimizer' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/PoolOptimizer.php', 'Composer\\DependencyResolver\\Problem' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Problem.php', 'Composer\\DependencyResolver\\Request' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Request.php', 'Composer\\DependencyResolver\\Rule' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Rule.php', 'Composer\\DependencyResolver\\Rule2Literals' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Rule2Literals.php', 'Composer\\DependencyResolver\\RuleSet' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/RuleSet.php', 'Composer\\DependencyResolver\\RuleSetGenerator' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/RuleSetGenerator.php', 'Composer\\DependencyResolver\\RuleSetIterator' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/RuleSetIterator.php', 'Composer\\DependencyResolver\\RuleWatchChain' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/RuleWatchChain.php', 'Composer\\DependencyResolver\\RuleWatchGraph' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/RuleWatchGraph.php', 'Composer\\DependencyResolver\\RuleWatchNode' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/RuleWatchNode.php', 'Composer\\DependencyResolver\\Solver' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Solver.php', 'Composer\\DependencyResolver\\SolverBugException' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/SolverBugException.php', 'Composer\\DependencyResolver\\SolverProblemsException' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/SolverProblemsException.php', 'Composer\\DependencyResolver\\Transaction' => $vendorDir . '/composer/composer/src/Composer/DependencyResolver/Transaction.php', 'Composer\\Downloader\\ArchiveDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/ArchiveDownloader.php', 'Composer\\Downloader\\ChangeReportInterface' => $vendorDir . '/composer/composer/src/Composer/Downloader/ChangeReportInterface.php', 'Composer\\Downloader\\DownloadManager' => $vendorDir . '/composer/composer/src/Composer/Downloader/DownloadManager.php', 'Composer\\Downloader\\DownloaderInterface' => $vendorDir . '/composer/composer/src/Composer/Downloader/DownloaderInterface.php', 'Composer\\Downloader\\DvcsDownloaderInterface' => $vendorDir . '/composer/composer/src/Composer/Downloader/DvcsDownloaderInterface.php', 'Composer\\Downloader\\FileDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/FileDownloader.php', 'Composer\\Downloader\\FilesystemException' => $vendorDir . '/composer/composer/src/Composer/Downloader/FilesystemException.php', 'Composer\\Downloader\\FossilDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/FossilDownloader.php', 'Composer\\Downloader\\GitDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/GitDownloader.php', 'Composer\\Downloader\\GzipDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/GzipDownloader.php', 'Composer\\Downloader\\HgDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/HgDownloader.php', 'Composer\\Downloader\\MaxFileSizeExceededException' => $vendorDir . '/composer/composer/src/Composer/Downloader/MaxFileSizeExceededException.php', 'Composer\\Downloader\\PathDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/PathDownloader.php', 'Composer\\Downloader\\PerforceDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/PerforceDownloader.php', 'Composer\\Downloader\\PharDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/PharDownloader.php', 'Composer\\Downloader\\RarDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/RarDownloader.php', 'Composer\\Downloader\\SvnDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/SvnDownloader.php', 'Composer\\Downloader\\TarDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/TarDownloader.php', 'Composer\\Downloader\\TransportException' => $vendorDir . '/composer/composer/src/Composer/Downloader/TransportException.php', 'Composer\\Downloader\\VcsCapableDownloaderInterface' => $vendorDir . '/composer/composer/src/Composer/Downloader/VcsCapableDownloaderInterface.php', 'Composer\\Downloader\\VcsDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/VcsDownloader.php', 'Composer\\Downloader\\XzDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/XzDownloader.php', 'Composer\\Downloader\\ZipDownloader' => $vendorDir . '/composer/composer/src/Composer/Downloader/ZipDownloader.php', 'Composer\\EventDispatcher\\Event' => $vendorDir . '/composer/composer/src/Composer/EventDispatcher/Event.php', 'Composer\\EventDispatcher\\EventDispatcher' => $vendorDir . '/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php', 'Composer\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/composer/composer/src/Composer/EventDispatcher/EventSubscriberInterface.php', 'Composer\\EventDispatcher\\ScriptExecutionException' => $vendorDir . '/composer/composer/src/Composer/EventDispatcher/ScriptExecutionException.php', 'Composer\\Exception\\IrrecoverableDownloadException' => $vendorDir . '/composer/composer/src/Composer/Exception/IrrecoverableDownloadException.php', 'Composer\\Exception\\NoSslException' => $vendorDir . '/composer/composer/src/Composer/Exception/NoSslException.php', 'Composer\\Factory' => $vendorDir . '/composer/composer/src/Composer/Factory.php', 'Composer\\Filter\\PlatformRequirementFilter\\IgnoreAllPlatformRequirementFilter' => $vendorDir . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.php', 'Composer\\Filter\\PlatformRequirementFilter\\IgnoreListPlatformRequirementFilter' => $vendorDir . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php', 'Composer\\Filter\\PlatformRequirementFilter\\IgnoreNothingPlatformRequirementFilter' => $vendorDir . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.php', 'Composer\\Filter\\PlatformRequirementFilter\\PlatformRequirementFilterFactory' => $vendorDir . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.php', 'Composer\\Filter\\PlatformRequirementFilter\\PlatformRequirementFilterInterface' => $vendorDir . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.php', 'Composer\\IO\\BaseIO' => $vendorDir . '/composer/composer/src/Composer/IO/BaseIO.php', 'Composer\\IO\\BufferIO' => $vendorDir . '/composer/composer/src/Composer/IO/BufferIO.php', 'Composer\\IO\\ConsoleIO' => $vendorDir . '/composer/composer/src/Composer/IO/ConsoleIO.php', 'Composer\\IO\\IOInterface' => $vendorDir . '/composer/composer/src/Composer/IO/IOInterface.php', 'Composer\\IO\\NullIO' => $vendorDir . '/composer/composer/src/Composer/IO/NullIO.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Composer\\Installer' => $vendorDir . '/composer/composer/src/Composer/Installer.php', 'Composer\\Installer\\BinaryInstaller' => $vendorDir . '/composer/composer/src/Composer/Installer/BinaryInstaller.php', 'Composer\\Installer\\BinaryPresenceInterface' => $vendorDir . '/composer/composer/src/Composer/Installer/BinaryPresenceInterface.php', 'Composer\\Installer\\InstallationManager' => $vendorDir . '/composer/composer/src/Composer/Installer/InstallationManager.php', 'Composer\\Installer\\InstallerEvent' => $vendorDir . '/composer/composer/src/Composer/Installer/InstallerEvent.php', 'Composer\\Installer\\InstallerEvents' => $vendorDir . '/composer/composer/src/Composer/Installer/InstallerEvents.php', 'Composer\\Installer\\InstallerInterface' => $vendorDir . '/composer/composer/src/Composer/Installer/InstallerInterface.php', 'Composer\\Installer\\LibraryInstaller' => $vendorDir . '/composer/composer/src/Composer/Installer/LibraryInstaller.php', 'Composer\\Installer\\MetapackageInstaller' => $vendorDir . '/composer/composer/src/Composer/Installer/MetapackageInstaller.php', 'Composer\\Installer\\NoopInstaller' => $vendorDir . '/composer/composer/src/Composer/Installer/NoopInstaller.php', 'Composer\\Installer\\PackageEvent' => $vendorDir . '/composer/composer/src/Composer/Installer/PackageEvent.php', 'Composer\\Installer\\PackageEvents' => $vendorDir . '/composer/composer/src/Composer/Installer/PackageEvents.php', 'Composer\\Installer\\PluginInstaller' => $vendorDir . '/composer/composer/src/Composer/Installer/PluginInstaller.php', 'Composer\\Installer\\ProjectInstaller' => $vendorDir . '/composer/composer/src/Composer/Installer/ProjectInstaller.php', 'Composer\\Installer\\SuggestedPackagesReporter' => $vendorDir . '/composer/composer/src/Composer/Installer/SuggestedPackagesReporter.php', 'Composer\\Json\\JsonFile' => $vendorDir . '/composer/composer/src/Composer/Json/JsonFile.php', 'Composer\\Json\\JsonFormatter' => $vendorDir . '/composer/composer/src/Composer/Json/JsonFormatter.php', 'Composer\\Json\\JsonManipulator' => $vendorDir . '/composer/composer/src/Composer/Json/JsonManipulator.php', 'Composer\\Json\\JsonValidationException' => $vendorDir . '/composer/composer/src/Composer/Json/JsonValidationException.php', 'Composer\\MetadataMinifier\\MetadataMinifier' => $vendorDir . '/composer/metadata-minifier/src/MetadataMinifier.php', 'Composer\\PHPStan\\ConfigReturnTypeExtension' => $vendorDir . '/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.php', 'Composer\\PHPStan\\RuleReasonDataReturnTypeExtension' => $vendorDir . '/composer/composer/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php', 'Composer\\Package\\AliasPackage' => $vendorDir . '/composer/composer/src/Composer/Package/AliasPackage.php', 'Composer\\Package\\Archiver\\ArchivableFilesFilter' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/ArchivableFilesFilter.php', 'Composer\\Package\\Archiver\\ArchivableFilesFinder' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/ArchivableFilesFinder.php', 'Composer\\Package\\Archiver\\ArchiveManager' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/ArchiveManager.php', 'Composer\\Package\\Archiver\\ArchiverInterface' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/ArchiverInterface.php', 'Composer\\Package\\Archiver\\BaseExcludeFilter' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/BaseExcludeFilter.php', 'Composer\\Package\\Archiver\\ComposerExcludeFilter' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/ComposerExcludeFilter.php', 'Composer\\Package\\Archiver\\GitExcludeFilter' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/GitExcludeFilter.php', 'Composer\\Package\\Archiver\\PharArchiver' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/PharArchiver.php', 'Composer\\Package\\Archiver\\ZipArchiver' => $vendorDir . '/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php', 'Composer\\Package\\BasePackage' => $vendorDir . '/composer/composer/src/Composer/Package/BasePackage.php', 'Composer\\Package\\Comparer\\Comparer' => $vendorDir . '/composer/composer/src/Composer/Package/Comparer/Comparer.php', 'Composer\\Package\\CompleteAliasPackage' => $vendorDir . '/composer/composer/src/Composer/Package/CompleteAliasPackage.php', 'Composer\\Package\\CompletePackage' => $vendorDir . '/composer/composer/src/Composer/Package/CompletePackage.php', 'Composer\\Package\\CompletePackageInterface' => $vendorDir . '/composer/composer/src/Composer/Package/CompletePackageInterface.php', 'Composer\\Package\\Dumper\\ArrayDumper' => $vendorDir . '/composer/composer/src/Composer/Package/Dumper/ArrayDumper.php', 'Composer\\Package\\Link' => $vendorDir . '/composer/composer/src/Composer/Package/Link.php', 'Composer\\Package\\Loader\\ArrayLoader' => $vendorDir . '/composer/composer/src/Composer/Package/Loader/ArrayLoader.php', 'Composer\\Package\\Loader\\InvalidPackageException' => $vendorDir . '/composer/composer/src/Composer/Package/Loader/InvalidPackageException.php', 'Composer\\Package\\Loader\\JsonLoader' => $vendorDir . '/composer/composer/src/Composer/Package/Loader/JsonLoader.php', 'Composer\\Package\\Loader\\LoaderInterface' => $vendorDir . '/composer/composer/src/Composer/Package/Loader/LoaderInterface.php', 'Composer\\Package\\Loader\\RootPackageLoader' => $vendorDir . '/composer/composer/src/Composer/Package/Loader/RootPackageLoader.php', 'Composer\\Package\\Loader\\ValidatingArrayLoader' => $vendorDir . '/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php', 'Composer\\Package\\Locker' => $vendorDir . '/composer/composer/src/Composer/Package/Locker.php', 'Composer\\Package\\Package' => $vendorDir . '/composer/composer/src/Composer/Package/Package.php', 'Composer\\Package\\PackageInterface' => $vendorDir . '/composer/composer/src/Composer/Package/PackageInterface.php', 'Composer\\Package\\RootAliasPackage' => $vendorDir . '/composer/composer/src/Composer/Package/RootAliasPackage.php', 'Composer\\Package\\RootPackage' => $vendorDir . '/composer/composer/src/Composer/Package/RootPackage.php', 'Composer\\Package\\RootPackageInterface' => $vendorDir . '/composer/composer/src/Composer/Package/RootPackageInterface.php', 'Composer\\Package\\Version\\StabilityFilter' => $vendorDir . '/composer/composer/src/Composer/Package/Version/StabilityFilter.php', 'Composer\\Package\\Version\\VersionBumper' => $vendorDir . '/composer/composer/src/Composer/Package/Version/VersionBumper.php', 'Composer\\Package\\Version\\VersionGuesser' => $vendorDir . '/composer/composer/src/Composer/Package/Version/VersionGuesser.php', 'Composer\\Package\\Version\\VersionParser' => $vendorDir . '/composer/composer/src/Composer/Package/Version/VersionParser.php', 'Composer\\Package\\Version\\VersionSelector' => $vendorDir . '/composer/composer/src/Composer/Package/Version/VersionSelector.php', 'Composer\\PartialComposer' => $vendorDir . '/composer/composer/src/Composer/PartialComposer.php', 'Composer\\Pcre\\MatchAllResult' => $vendorDir . '/composer/pcre/src/MatchAllResult.php', 'Composer\\Pcre\\MatchAllStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchAllStrictGroupsResult.php', 'Composer\\Pcre\\MatchAllWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchAllWithOffsetsResult.php', 'Composer\\Pcre\\MatchResult' => $vendorDir . '/composer/pcre/src/MatchResult.php', 'Composer\\Pcre\\MatchStrictGroupsResult' => $vendorDir . '/composer/pcre/src/MatchStrictGroupsResult.php', 'Composer\\Pcre\\MatchWithOffsetsResult' => $vendorDir . '/composer/pcre/src/MatchWithOffsetsResult.php', 'Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => $vendorDir . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', 'Composer\\Pcre\\PHPStan\\PregMatchFlags' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchFlags.php', 'Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', 'Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', 'Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => $vendorDir . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', 'Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => $vendorDir . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', 'Composer\\Pcre\\PcreException' => $vendorDir . '/composer/pcre/src/PcreException.php', 'Composer\\Pcre\\Preg' => $vendorDir . '/composer/pcre/src/Preg.php', 'Composer\\Pcre\\Regex' => $vendorDir . '/composer/pcre/src/Regex.php', 'Composer\\Pcre\\ReplaceResult' => $vendorDir . '/composer/pcre/src/ReplaceResult.php', 'Composer\\Pcre\\UnexpectedNullMatchException' => $vendorDir . '/composer/pcre/src/UnexpectedNullMatchException.php', 'Composer\\Platform\\HhvmDetector' => $vendorDir . '/composer/composer/src/Composer/Platform/HhvmDetector.php', 'Composer\\Platform\\Runtime' => $vendorDir . '/composer/composer/src/Composer/Platform/Runtime.php', 'Composer\\Platform\\Version' => $vendorDir . '/composer/composer/src/Composer/Platform/Version.php', 'Composer\\Plugin\\Capability\\Capability' => $vendorDir . '/composer/composer/src/Composer/Plugin/Capability/Capability.php', 'Composer\\Plugin\\Capability\\CommandProvider' => $vendorDir . '/composer/composer/src/Composer/Plugin/Capability/CommandProvider.php', 'Composer\\Plugin\\Capable' => $vendorDir . '/composer/composer/src/Composer/Plugin/Capable.php', 'Composer\\Plugin\\CommandEvent' => $vendorDir . '/composer/composer/src/Composer/Plugin/CommandEvent.php', 'Composer\\Plugin\\PluginBlockedException' => $vendorDir . '/composer/composer/src/Composer/Plugin/PluginBlockedException.php', 'Composer\\Plugin\\PluginEvents' => $vendorDir . '/composer/composer/src/Composer/Plugin/PluginEvents.php', 'Composer\\Plugin\\PluginInterface' => $vendorDir . '/composer/composer/src/Composer/Plugin/PluginInterface.php', 'Composer\\Plugin\\PluginManager' => $vendorDir . '/composer/composer/src/Composer/Plugin/PluginManager.php', 'Composer\\Plugin\\PostFileDownloadEvent' => $vendorDir . '/composer/composer/src/Composer/Plugin/PostFileDownloadEvent.php', 'Composer\\Plugin\\PreCommandRunEvent' => $vendorDir . '/composer/composer/src/Composer/Plugin/PreCommandRunEvent.php', 'Composer\\Plugin\\PreFileDownloadEvent' => $vendorDir . '/composer/composer/src/Composer/Plugin/PreFileDownloadEvent.php', 'Composer\\Plugin\\PrePoolCreateEvent' => $vendorDir . '/composer/composer/src/Composer/Plugin/PrePoolCreateEvent.php', 'Composer\\Question\\StrictConfirmationQuestion' => $vendorDir . '/composer/composer/src/Composer/Question/StrictConfirmationQuestion.php', 'Composer\\Repository\\AdvisoryProviderInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/AdvisoryProviderInterface.php', 'Composer\\Repository\\ArrayRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/ArrayRepository.php', 'Composer\\Repository\\ArtifactRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/ArtifactRepository.php', 'Composer\\Repository\\CanonicalPackagesTrait' => $vendorDir . '/composer/composer/src/Composer/Repository/CanonicalPackagesTrait.php', 'Composer\\Repository\\ComposerRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/ComposerRepository.php', 'Composer\\Repository\\CompositeRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/CompositeRepository.php', 'Composer\\Repository\\ConfigurableRepositoryInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/ConfigurableRepositoryInterface.php', 'Composer\\Repository\\FilesystemRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/FilesystemRepository.php', 'Composer\\Repository\\FilterRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/FilterRepository.php', 'Composer\\Repository\\InstalledArrayRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/InstalledArrayRepository.php', 'Composer\\Repository\\InstalledFilesystemRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/InstalledFilesystemRepository.php', 'Composer\\Repository\\InstalledRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/InstalledRepository.php', 'Composer\\Repository\\InstalledRepositoryInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/InstalledRepositoryInterface.php', 'Composer\\Repository\\InvalidRepositoryException' => $vendorDir . '/composer/composer/src/Composer/Repository/InvalidRepositoryException.php', 'Composer\\Repository\\LockArrayRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/LockArrayRepository.php', 'Composer\\Repository\\PackageRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/PackageRepository.php', 'Composer\\Repository\\PathRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/PathRepository.php', 'Composer\\Repository\\PearRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/PearRepository.php', 'Composer\\Repository\\PlatformRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/PlatformRepository.php', 'Composer\\Repository\\RepositoryFactory' => $vendorDir . '/composer/composer/src/Composer/Repository/RepositoryFactory.php', 'Composer\\Repository\\RepositoryInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/RepositoryInterface.php', 'Composer\\Repository\\RepositoryManager' => $vendorDir . '/composer/composer/src/Composer/Repository/RepositoryManager.php', 'Composer\\Repository\\RepositorySecurityException' => $vendorDir . '/composer/composer/src/Composer/Repository/RepositorySecurityException.php', 'Composer\\Repository\\RepositorySet' => $vendorDir . '/composer/composer/src/Composer/Repository/RepositorySet.php', 'Composer\\Repository\\RepositoryUtils' => $vendorDir . '/composer/composer/src/Composer/Repository/RepositoryUtils.php', 'Composer\\Repository\\RootPackageRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/RootPackageRepository.php', 'Composer\\Repository\\VcsRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/VcsRepository.php', 'Composer\\Repository\\Vcs\\FossilDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/FossilDriver.php', 'Composer\\Repository\\Vcs\\GitBitbucketDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php', 'Composer\\Repository\\Vcs\\GitDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/GitDriver.php', 'Composer\\Repository\\Vcs\\GitHubDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php', 'Composer\\Repository\\Vcs\\GitLabDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/GitLabDriver.php', 'Composer\\Repository\\Vcs\\HgDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/HgDriver.php', 'Composer\\Repository\\Vcs\\PerforceDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/PerforceDriver.php', 'Composer\\Repository\\Vcs\\SvnDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php', 'Composer\\Repository\\Vcs\\VcsDriver' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/VcsDriver.php', 'Composer\\Repository\\Vcs\\VcsDriverInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/Vcs/VcsDriverInterface.php', 'Composer\\Repository\\VersionCacheInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/VersionCacheInterface.php', 'Composer\\Repository\\WritableArrayRepository' => $vendorDir . '/composer/composer/src/Composer/Repository/WritableArrayRepository.php', 'Composer\\Repository\\WritableRepositoryInterface' => $vendorDir . '/composer/composer/src/Composer/Repository/WritableRepositoryInterface.php', 'Composer\\Script\\Event' => $vendorDir . '/composer/composer/src/Composer/Script/Event.php', 'Composer\\Script\\ScriptEvents' => $vendorDir . '/composer/composer/src/Composer/Script/ScriptEvents.php', 'Composer\\SelfUpdate\\Keys' => $vendorDir . '/composer/composer/src/Composer/SelfUpdate/Keys.php', 'Composer\\SelfUpdate\\Versions' => $vendorDir . '/composer/composer/src/Composer/SelfUpdate/Versions.php', 'Composer\\Semver\\Comparator' => $vendorDir . '/composer/semver/src/Comparator.php', 'Composer\\Semver\\CompilingMatcher' => $vendorDir . '/composer/semver/src/CompilingMatcher.php', 'Composer\\Semver\\Constraint\\Bound' => $vendorDir . '/composer/semver/src/Constraint/Bound.php', 'Composer\\Semver\\Constraint\\Constraint' => $vendorDir . '/composer/semver/src/Constraint/Constraint.php', 'Composer\\Semver\\Constraint\\ConstraintInterface' => $vendorDir . '/composer/semver/src/Constraint/ConstraintInterface.php', 'Composer\\Semver\\Constraint\\MatchAllConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchAllConstraint.php', 'Composer\\Semver\\Constraint\\MatchNoneConstraint' => $vendorDir . '/composer/semver/src/Constraint/MatchNoneConstraint.php', 'Composer\\Semver\\Constraint\\MultiConstraint' => $vendorDir . '/composer/semver/src/Constraint/MultiConstraint.php', 'Composer\\Semver\\Interval' => $vendorDir . '/composer/semver/src/Interval.php', 'Composer\\Semver\\Intervals' => $vendorDir . '/composer/semver/src/Intervals.php', 'Composer\\Semver\\Semver' => $vendorDir . '/composer/semver/src/Semver.php', 'Composer\\Semver\\VersionParser' => $vendorDir . '/composer/semver/src/VersionParser.php', 'Composer\\Spdx\\SpdxLicenses' => $vendorDir . '/composer/spdx-licenses/src/SpdxLicenses.php', 'Composer\\Util\\AuthHelper' => $vendorDir . '/composer/composer/src/Composer/Util/AuthHelper.php', 'Composer\\Util\\Bitbucket' => $vendorDir . '/composer/composer/src/Composer/Util/Bitbucket.php', 'Composer\\Util\\ComposerMirror' => $vendorDir . '/composer/composer/src/Composer/Util/ComposerMirror.php', 'Composer\\Util\\ConfigValidator' => $vendorDir . '/composer/composer/src/Composer/Util/ConfigValidator.php', 'Composer\\Util\\ErrorHandler' => $vendorDir . '/composer/composer/src/Composer/Util/ErrorHandler.php', 'Composer\\Util\\Filesystem' => $vendorDir . '/composer/composer/src/Composer/Util/Filesystem.php', 'Composer\\Util\\Git' => $vendorDir . '/composer/composer/src/Composer/Util/Git.php', 'Composer\\Util\\GitHub' => $vendorDir . '/composer/composer/src/Composer/Util/GitHub.php', 'Composer\\Util\\GitLab' => $vendorDir . '/composer/composer/src/Composer/Util/GitLab.php', 'Composer\\Util\\Hg' => $vendorDir . '/composer/composer/src/Composer/Util/Hg.php', 'Composer\\Util\\HttpDownloader' => $vendorDir . '/composer/composer/src/Composer/Util/HttpDownloader.php', 'Composer\\Util\\Http\\CurlDownloader' => $vendorDir . '/composer/composer/src/Composer/Util/Http/CurlDownloader.php', 'Composer\\Util\\Http\\CurlResponse' => $vendorDir . '/composer/composer/src/Composer/Util/Http/CurlResponse.php', 'Composer\\Util\\Http\\ProxyItem' => $vendorDir . '/composer/composer/src/Composer/Util/Http/ProxyItem.php', 'Composer\\Util\\Http\\ProxyManager' => $vendorDir . '/composer/composer/src/Composer/Util/Http/ProxyManager.php', 'Composer\\Util\\Http\\RequestProxy' => $vendorDir . '/composer/composer/src/Composer/Util/Http/RequestProxy.php', 'Composer\\Util\\Http\\Response' => $vendorDir . '/composer/composer/src/Composer/Util/Http/Response.php', 'Composer\\Util\\IniHelper' => $vendorDir . '/composer/composer/src/Composer/Util/IniHelper.php', 'Composer\\Util\\Loop' => $vendorDir . '/composer/composer/src/Composer/Util/Loop.php', 'Composer\\Util\\MetadataMinifier' => $vendorDir . '/composer/composer/src/Composer/Util/MetadataMinifier.php', 'Composer\\Util\\NoProxyPattern' => $vendorDir . '/composer/composer/src/Composer/Util/NoProxyPattern.php', 'Composer\\Util\\PackageInfo' => $vendorDir . '/composer/composer/src/Composer/Util/PackageInfo.php', 'Composer\\Util\\PackageSorter' => $vendorDir . '/composer/composer/src/Composer/Util/PackageSorter.php', 'Composer\\Util\\Perforce' => $vendorDir . '/composer/composer/src/Composer/Util/Perforce.php', 'Composer\\Util\\Platform' => $vendorDir . '/composer/composer/src/Composer/Util/Platform.php', 'Composer\\Util\\ProcessExecutor' => $vendorDir . '/composer/composer/src/Composer/Util/ProcessExecutor.php', 'Composer\\Util\\RemoteFilesystem' => $vendorDir . '/composer/composer/src/Composer/Util/RemoteFilesystem.php', 'Composer\\Util\\Silencer' => $vendorDir . '/composer/composer/src/Composer/Util/Silencer.php', 'Composer\\Util\\StreamContextFactory' => $vendorDir . '/composer/composer/src/Composer/Util/StreamContextFactory.php', 'Composer\\Util\\Svn' => $vendorDir . '/composer/composer/src/Composer/Util/Svn.php', 'Composer\\Util\\SyncHelper' => $vendorDir . '/composer/composer/src/Composer/Util/SyncHelper.php', 'Composer\\Util\\Tar' => $vendorDir . '/composer/composer/src/Composer/Util/Tar.php', 'Composer\\Util\\TlsHelper' => $vendorDir . '/composer/composer/src/Composer/Util/TlsHelper.php', 'Composer\\Util\\Url' => $vendorDir . '/composer/composer/src/Composer/Util/Url.php', 'Composer\\Util\\Zip' => $vendorDir . '/composer/composer/src/Composer/Util/Zip.php', 'Composer\\XdebugHandler\\PhpConfig' => $vendorDir . '/composer/xdebug-handler/src/PhpConfig.php', 'Composer\\XdebugHandler\\Process' => $vendorDir . '/composer/xdebug-handler/src/Process.php', 'Composer\\XdebugHandler\\Status' => $vendorDir . '/composer/xdebug-handler/src/Status.php', 'Composer\\XdebugHandler\\XdebugHandler' => $vendorDir . '/composer/xdebug-handler/src/XdebugHandler.php', 'DateError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateError.php', 'DateException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateException.php', 'DateInvalidOperationException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', 'DateInvalidTimeZoneException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php', 'DateMalformedIntervalStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php', 'DateMalformedPeriodStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php', 'DateMalformedStringException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php', 'DateObjectError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php', 'DateRangeError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Override' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/Override.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'React\\Promise\\Deferred' => $vendorDir . '/react/promise/src/Deferred.php', 'React\\Promise\\Exception\\CompositeException' => $vendorDir . '/react/promise/src/Exception/CompositeException.php', 'React\\Promise\\Exception\\LengthException' => $vendorDir . '/react/promise/src/Exception/LengthException.php', 'React\\Promise\\Internal\\CancellationQueue' => $vendorDir . '/react/promise/src/Internal/CancellationQueue.php', 'React\\Promise\\Internal\\FulfilledPromise' => $vendorDir . '/react/promise/src/Internal/FulfilledPromise.php', 'React\\Promise\\Internal\\RejectedPromise' => $vendorDir . '/react/promise/src/Internal/RejectedPromise.php', 'React\\Promise\\Promise' => $vendorDir . '/react/promise/src/Promise.php', 'React\\Promise\\PromiseInterface' => $vendorDir . '/react/promise/src/PromiseInterface.php', 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'SQLite3Exception' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php', 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', 'Symfony\\Polyfill\\Php81\\Php81' => $vendorDir . '/symfony/polyfill-php81/Php81.php', 'Symfony\\Polyfill\\Php83\\Php83' => $vendorDir . '/symfony/polyfill-php83/Php83.php', 'Symfony\\Polyfill\\Uuid\\Uuid' => $vendorDir . '/symfony/polyfill-uuid/Uuid.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', '_ContaoManager\\Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php', '_ContaoManager\\Brick\\Math\\BigInteger' => $vendorDir . '/brick/math/src/BigInteger.php', '_ContaoManager\\Brick\\Math\\BigNumber' => $vendorDir . '/brick/math/src/BigNumber.php', '_ContaoManager\\Brick\\Math\\BigRational' => $vendorDir . '/brick/math/src/BigRational.php', '_ContaoManager\\Brick\\Math\\Exception\\DivisionByZeroException' => $vendorDir . '/brick/math/src/Exception/DivisionByZeroException.php', '_ContaoManager\\Brick\\Math\\Exception\\IntegerOverflowException' => $vendorDir . '/brick/math/src/Exception/IntegerOverflowException.php', '_ContaoManager\\Brick\\Math\\Exception\\MathException' => $vendorDir . '/brick/math/src/Exception/MathException.php', '_ContaoManager\\Brick\\Math\\Exception\\NegativeNumberException' => $vendorDir . '/brick/math/src/Exception/NegativeNumberException.php', '_ContaoManager\\Brick\\Math\\Exception\\NumberFormatException' => $vendorDir . '/brick/math/src/Exception/NumberFormatException.php', '_ContaoManager\\Brick\\Math\\Exception\\RoundingNecessaryException' => $vendorDir . '/brick/math/src/Exception/RoundingNecessaryException.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator' => $vendorDir . '/brick/math/src/Internal/Calculator.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/BcMathCalculator.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator\\GmpCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/GmpCalculator.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator\\NativeCalculator' => $vendorDir . '/brick/math/src/Internal/Calculator/NativeCalculator.php', '_ContaoManager\\Brick\\Math\\RoundingMode' => $vendorDir . '/brick/math/src/RoundingMode.php', '_ContaoManager\\CBOR\\AbstractCBORObject' => $vendorDir . '/spomky-labs/cbor-php/src/AbstractCBORObject.php', '_ContaoManager\\CBOR\\ByteStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/ByteStringObject.php', '_ContaoManager\\CBOR\\CBORObject' => $vendorDir . '/spomky-labs/cbor-php/src/CBORObject.php', '_ContaoManager\\CBOR\\Decoder' => $vendorDir . '/spomky-labs/cbor-php/src/Decoder.php', '_ContaoManager\\CBOR\\DecoderInterface' => $vendorDir . '/spomky-labs/cbor-php/src/DecoderInterface.php', '_ContaoManager\\CBOR\\IndefiniteLengthByteStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthByteStringObject.php', '_ContaoManager\\CBOR\\IndefiniteLengthListObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php', '_ContaoManager\\CBOR\\IndefiniteLengthMapObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php', '_ContaoManager\\CBOR\\IndefiniteLengthTextStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php', '_ContaoManager\\CBOR\\LengthCalculator' => $vendorDir . '/spomky-labs/cbor-php/src/LengthCalculator.php', '_ContaoManager\\CBOR\\ListObject' => $vendorDir . '/spomky-labs/cbor-php/src/ListObject.php', '_ContaoManager\\CBOR\\MapItem' => $vendorDir . '/spomky-labs/cbor-php/src/MapItem.php', '_ContaoManager\\CBOR\\MapObject' => $vendorDir . '/spomky-labs/cbor-php/src/MapObject.php', '_ContaoManager\\CBOR\\NegativeIntegerObject' => $vendorDir . '/spomky-labs/cbor-php/src/NegativeIntegerObject.php', '_ContaoManager\\CBOR\\Normalizable' => $vendorDir . '/spomky-labs/cbor-php/src/Normalizable.php', '_ContaoManager\\CBOR\\OtherObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject.php', '_ContaoManager\\CBOR\\OtherObject\\BreakObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/BreakObject.php', '_ContaoManager\\CBOR\\OtherObject\\DoublePrecisionFloatObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/DoublePrecisionFloatObject.php', '_ContaoManager\\CBOR\\OtherObject\\FalseObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/FalseObject.php', '_ContaoManager\\CBOR\\OtherObject\\GenericObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/GenericObject.php', '_ContaoManager\\CBOR\\OtherObject\\HalfPrecisionFloatObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php', '_ContaoManager\\CBOR\\OtherObject\\NullObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/NullObject.php', '_ContaoManager\\CBOR\\OtherObject\\OtherObjectInterface' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectInterface.php', '_ContaoManager\\CBOR\\OtherObject\\OtherObjectManager' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php', '_ContaoManager\\CBOR\\OtherObject\\OtherObjectManagerInterface' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php', '_ContaoManager\\CBOR\\OtherObject\\SimpleObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/SimpleObject.php', '_ContaoManager\\CBOR\\OtherObject\\SinglePrecisionFloatObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php', '_ContaoManager\\CBOR\\OtherObject\\TrueObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/TrueObject.php', '_ContaoManager\\CBOR\\OtherObject\\UndefinedObject' => $vendorDir . '/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php', '_ContaoManager\\CBOR\\Stream' => $vendorDir . '/spomky-labs/cbor-php/src/Stream.php', '_ContaoManager\\CBOR\\StringStream' => $vendorDir . '/spomky-labs/cbor-php/src/StringStream.php', '_ContaoManager\\CBOR\\Tag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag.php', '_ContaoManager\\CBOR\\Tag\\Base16EncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php', '_ContaoManager\\CBOR\\Tag\\Base64EncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php', '_ContaoManager\\CBOR\\Tag\\Base64Tag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64Tag.php', '_ContaoManager\\CBOR\\Tag\\Base64UrlEncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php', '_ContaoManager\\CBOR\\Tag\\Base64UrlTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php', '_ContaoManager\\CBOR\\Tag\\BigFloatTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/BigFloatTag.php', '_ContaoManager\\CBOR\\Tag\\CBOREncodingTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php', '_ContaoManager\\CBOR\\Tag\\CBORTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/CBORTag.php', '_ContaoManager\\CBOR\\Tag\\DatetimeTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/DatetimeTag.php', '_ContaoManager\\CBOR\\Tag\\DecimalFractionTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php', '_ContaoManager\\CBOR\\Tag\\GenericTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/GenericTag.php', '_ContaoManager\\CBOR\\Tag\\MimeTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/MimeTag.php', '_ContaoManager\\CBOR\\Tag\\NegativeBigIntegerTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php', '_ContaoManager\\CBOR\\Tag\\TagInterface' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TagInterface.php', '_ContaoManager\\CBOR\\Tag\\TagManager' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TagManager.php', '_ContaoManager\\CBOR\\Tag\\TagManagerInterface' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php', '_ContaoManager\\CBOR\\Tag\\TimestampTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/TimestampTag.php', '_ContaoManager\\CBOR\\Tag\\UnsignedBigIntegerTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php', '_ContaoManager\\CBOR\\Tag\\UriTag' => $vendorDir . '/spomky-labs/cbor-php/src/Tag/UriTag.php', '_ContaoManager\\CBOR\\TextStringObject' => $vendorDir . '/spomky-labs/cbor-php/src/TextStringObject.php', '_ContaoManager\\CBOR\\UnsignedIntegerObject' => $vendorDir . '/spomky-labs/cbor-php/src/UnsignedIntegerObject.php', '_ContaoManager\\CBOR\\Utils' => $vendorDir . '/spomky-labs/cbor-php/src/Utils.php', '_ContaoManager\\Contao\\ManagerApi\\ApiApplication' => $baseDir . '/api/ApiApplication.php', '_ContaoManager\\Contao\\ManagerApi\\ApiKernel' => $baseDir . '/api/ApiKernel.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand' => $baseDir . '/api/Command/AboutCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => $baseDir . '/api/Command/IntegrityCheckCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => $baseDir . '/api/Command/ProcessRunnerCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand' => $baseDir . '/api/Command/TaskAbortCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand' => $baseDir . '/api/Command/TaskDeleteCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand' => $baseDir . '/api/Command/TaskUpdateCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand' => $baseDir . '/api/Command/UpdateCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudChanges' => $baseDir . '/api/Composer/CloudChanges.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudException' => $baseDir . '/api/Composer/CloudException.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudJob' => $baseDir . '/api/Composer/CloudJob.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver' => $baseDir . '/api/Composer/CloudResolver.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment' => $baseDir . '/api/Composer/Environment.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\AbstractConfig' => $baseDir . '/api/Config/AbstractConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\AuthConfig' => $baseDir . '/api/Config/AuthConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig' => $baseDir . '/api/Config/ComposerConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig' => $baseDir . '/api/Config/ManagerConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\PartialConfig' => $baseDir . '/api/Config/PartialConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig' => $baseDir . '/api/Config/UploadsConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig' => $baseDir . '/api/Config/UserConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AbstractConfigController' => $baseDir . '/api/Controller/Config/AbstractConfigController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController' => $baseDir . '/api/Controller/Config/AuthController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController' => $baseDir . '/api/Controller/Config/ComposerController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController' => $baseDir . '/api/Controller/Config/ManagerController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController' => $baseDir . '/api/Controller/ConstraintController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController' => $baseDir . '/api/Controller/Contao/AccessKeyController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController' => $baseDir . '/api/Controller/Contao/BackupController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController' => $baseDir . '/api/Controller/Contao/DatabaseMigrationController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController' => $baseDir . '/api/Controller/Contao/InstallToolLockController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController' => $baseDir . '/api/Controller/Contao/JwtCookieController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController' => $baseDir . '/api/Controller/Contao/MaintenanceModeController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController' => $baseDir . '/api/Controller/FileController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController' => $baseDir . '/api/Controller/LogController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController' => $baseDir . '/api/Controller/Packages/CloudController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController' => $baseDir . '/api/Controller/Packages/LocalPackagesController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController' => $baseDir . '/api/Controller/Packages/MissingPackagesController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController' => $baseDir . '/api/Controller/Packages/RootPackageController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController' => $baseDir . '/api/Controller/Packages/UploadPackagesController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController' => $baseDir . '/api/Controller/Server/AdminUserController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController' => $baseDir . '/api/Controller/Server/ComposerController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController' => $baseDir . '/api/Controller/Server/ConfigController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController' => $baseDir . '/api/Controller/Server/ContaoController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController' => $baseDir . '/api/Controller/Server/DatabaseController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController' => $baseDir . '/api/Controller/Server/OpcacheController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController' => $baseDir . '/api/Controller/Server/PhpCliController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController' => $baseDir . '/api/Controller/Server/PhpWebController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController' => $baseDir . '/api/Controller/Server/PhpinfoController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController' => $baseDir . '/api/Controller/Server/SelfUpdateController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController' => $baseDir . '/api/Controller/SessionController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController' => $baseDir . '/api/Controller/TaskController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController' => $baseDir . '/api/Controller/UserController.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener' => $baseDir . '/api/EventListener/CheckTotpListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener' => $baseDir . '/api/EventListener/ExceptionListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\JsonRequestListener' => $baseDir . '/api/EventListener/JsonRequestListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener' => $baseDir . '/api/EventListener/LocaleListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener' => $baseDir . '/api/EventListener/SecurityListener.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\ApiProblemException' => $baseDir . '/api/Exception/ApiProblemException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\InvalidJsonException' => $baseDir . '/api/Exception/InvalidJsonException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\InvalidTotpException' => $baseDir . '/api/Exception/InvalidTotpException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\ProcessOutputException' => $baseDir . '/api/Exception/ProcessOutputException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\RequestException' => $baseDir . '/api/Exception/RequestException.php', '_ContaoManager\\Contao\\ManagerApi\\HttpKernel\\ApiProblemResponse' => $baseDir . '/api/HttpKernel/ApiProblemResponse.php', '_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator' => $baseDir . '/api/I18n/Translator.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AbstractIntegrityCheck' => $baseDir . '/api/IntegrityCheck/AbstractIntegrityCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck' => $baseDir . '/api/IntegrityCheck/AllowUrlFopenCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck' => $baseDir . '/api/IntegrityCheck/GraphicsLibCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory' => $baseDir . '/api/IntegrityCheck/IntegrityCheckFactory.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckInterface' => $baseDir . '/api/IntegrityCheck/IntegrityCheckInterface.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck' => $baseDir . '/api/IntegrityCheck/MemoryLimitCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck' => $baseDir . '/api/IntegrityCheck/PhpExtensionsCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck' => $baseDir . '/api/IntegrityCheck/ProcessCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck' => $baseDir . '/api/IntegrityCheck/SessionCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck' => $baseDir . '/api/IntegrityCheck/SymlinkCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck' => $baseDir . '/api/IntegrityCheck/SysTempDirCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ZipCheck' => $baseDir . '/api/IntegrityCheck/ZipCheck.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\AbstractProcess' => $baseDir . '/api/Process/AbstractProcess.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory' => $baseDir . '/api/Process/ConsoleProcessFactory.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi' => $baseDir . '/api/Process/ContaoApi.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole' => $baseDir . '/api/Process/ContaoConsole.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\AbstractForker' => $baseDir . '/api/Process/Forker/AbstractForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\DisownForker' => $baseDir . '/api/Process/Forker/DisownForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\ForkerInterface' => $baseDir . '/api/Process/Forker/ForkerInterface.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\InlineForker' => $baseDir . '/api/Process/Forker/InlineForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\NohupForker' => $baseDir . '/api/Process/Forker/NohupForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\WindowsStartForker' => $baseDir . '/api/Process/Forker/WindowsStartForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\PhpExecutableFinder' => $baseDir . '/api/Process/PhpExecutableFinder.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ProcessController' => $baseDir . '/api/Process/ProcessController.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ProcessRunner' => $baseDir . '/api/Process/ProcessRunner.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Utf8Process' => $baseDir . '/api/Process/Utf8Process.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\AbstractBrowserAuthenticator' => $baseDir . '/api/Security/AbstractBrowserAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator' => $baseDir . '/api/Security/JwtAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager' => $baseDir . '/api/Security/JwtManager.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator' => $baseDir . '/api/Security/LoginAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator' => $baseDir . '/api/Security/PasswordlessAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator' => $baseDir . '/api/Security/TokenAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\TotpBadge' => $baseDir . '/api/Security/TotpBadge.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\User' => $baseDir . '/api/Security/User.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider' => $baseDir . '/api/Security/UserProvider.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => $baseDir . '/api/Security/WebauthnAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\System\\Request' => $baseDir . '/api/System/Request.php', '_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate' => $baseDir . '/api/System/SelfUpdate.php', '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo' => $baseDir . '/api/System/ServerInfo.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\AbstractInlineOperation' => $baseDir . '/api/TaskOperation/AbstractInlineOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\AbstractProcessOperation' => $baseDir . '/api/TaskOperation/AbstractProcessOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\ClearCacheOperation' => $baseDir . '/api/TaskOperation/Composer/ClearCacheOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\CloudOperation' => $baseDir . '/api/TaskOperation/Composer/CloudOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\CreateProjectOperation' => $baseDir . '/api/TaskOperation/Composer/CreateProjectOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\DumpAutoloadOperation' => $baseDir . '/api/TaskOperation/Composer/DumpAutoloadOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\InstallOperation' => $baseDir . '/api/TaskOperation/Composer/InstallOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\RemoveOperation' => $baseDir . '/api/TaskOperation/Composer/RemoveOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\RequireOperation' => $baseDir . '/api/TaskOperation/Composer/RequireOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\UpdateOperation' => $baseDir . '/api/TaskOperation/Composer/UpdateOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\ConsoleOutput' => $baseDir . '/api/TaskOperation/ConsoleOutput.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\BackupCreateOperation' => $baseDir . '/api/TaskOperation/Contao/BackupCreateOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\BackupRestoreOperation' => $baseDir . '/api/TaskOperation/Contao/BackupRestoreOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CacheClearOperation' => $baseDir . '/api/TaskOperation/Contao/CacheClearOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CacheWarmupOperation' => $baseDir . '/api/TaskOperation/Contao/CacheWarmupOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CreateContaoOperation' => $baseDir . '/api/TaskOperation/Contao/CreateContaoOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\MaintenanceModeOperation' => $baseDir . '/api/TaskOperation/Contao/MaintenanceModeOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\InstallUploadsOperation' => $baseDir . '/api/TaskOperation/Filesystem/InstallUploadsOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveArtifactsOperation' => $baseDir . '/api/TaskOperation/Filesystem/RemoveArtifactsOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveCacheOperation' => $baseDir . '/api/TaskOperation/Filesystem/RemoveCacheOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveUploadsOperation' => $baseDir . '/api/TaskOperation/Filesystem/RemoveUploadsOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveVendorOperation' => $baseDir . '/api/TaskOperation/Filesystem/RemoveVendorOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Manager\\SelfUpdateOperation' => $baseDir . '/api/TaskOperation/Manager/SelfUpdateOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\SponsoredOperationInterface' => $baseDir . '/api/TaskOperation/SponsoredOperationInterface.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\TaskOperationInterface' => $baseDir . '/api/TaskOperation/TaskOperationInterface.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\AbstractTask' => $baseDir . '/api/Task/AbstractTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask' => $baseDir . '/api/Task/Composer/ClearCacheTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask' => $baseDir . '/api/Task/Composer/DumpAutoloadTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask' => $baseDir . '/api/Task/Contao/BackupCreateTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask' => $baseDir . '/api/Task/Contao/BackupRestoreTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask' => $baseDir . '/api/Task/Contao/RebuildCacheTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask' => $baseDir . '/api/Task/Manager/SelfUpdateTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\AbstractPackagesTask' => $baseDir . '/api/Task/Packages/AbstractPackagesTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\InstallTask' => $baseDir . '/api/Task/Packages/InstallTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\SetupTask' => $baseDir . '/api/Task/Packages/SetupTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\UpdateTask' => $baseDir . '/api/Task/Packages/UpdateTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskConfig' => $baseDir . '/api/Task/TaskConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskInterface' => $baseDir . '/api/Task/TaskInterface.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager' => $baseDir . '/api/Task/TaskManager.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskStatus' => $baseDir . '/api/Task/TaskStatus.php', '_ContaoManager\\Contao\\ManagerApi\\Tests\\Composer\\CloudJobTest' => $baseDir . '/api/Tests/Composer/CloudJobTest.php', '_ContaoManager\\Contao\\ManagerApi\\Tests\\Controller\\LogPatternTest' => $baseDir . '/api/Tests/Controller/LogPatternTest.php', '_ContaoManager\\Cose\\Algorithm\\Algorithm' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Algorithm.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS256.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS256Truncated64' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS256Truncated64.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS384.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/HS512.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\Hmac' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/Hmac.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\Mac' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Mac/Mac.php', '_ContaoManager\\Cose\\Algorithm\\Manager' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Manager.php', '_ContaoManager\\Cose\\Algorithm\\ManagerFactory' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/ManagerFactory.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ECDSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECDSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ECSignature' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECSignature.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES256K' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256K.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES384.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\Ed25519' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed25519.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\Ed256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\Ed512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\EdDSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/EdDSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PS256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PS384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS384.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PS512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PSSRSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PSSRSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS1' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS1.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS256' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS384' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS384.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS512' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RSA' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\Signature' => $vendorDir . '/web-auth/cose-lib/src/Algorithm/Signature/Signature.php', '_ContaoManager\\Cose\\Algorithms' => $vendorDir . '/web-auth/cose-lib/src/Algorithms.php', '_ContaoManager\\Cose\\BigInteger' => $vendorDir . '/web-auth/cose-lib/src/BigInteger.php', '_ContaoManager\\Cose\\Hash' => $vendorDir . '/web-auth/cose-lib/src/Hash.php', '_ContaoManager\\Cose\\Key\\Ec2Key' => $vendorDir . '/web-auth/cose-lib/src/Key/Ec2Key.php', '_ContaoManager\\Cose\\Key\\Key' => $vendorDir . '/web-auth/cose-lib/src/Key/Key.php', '_ContaoManager\\Cose\\Key\\OkpKey' => $vendorDir . '/web-auth/cose-lib/src/Key/OkpKey.php', '_ContaoManager\\Cose\\Key\\RsaKey' => $vendorDir . '/web-auth/cose-lib/src/Key/RsaKey.php', '_ContaoManager\\Cose\\Key\\SymmetricKey' => $vendorDir . '/web-auth/cose-lib/src/Key/SymmetricKey.php', '_ContaoManager\\Crell\\ApiProblem\\ApiProblem' => $vendorDir . '/crell/api-problem/src/ApiProblem.php', '_ContaoManager\\Crell\\ApiProblem\\HttpConverter' => $vendorDir . '/crell/api-problem/src/HttpConverter.php', '_ContaoManager\\Crell\\ApiProblem\\JsonEncodeException' => $vendorDir . '/crell/api-problem/src/JsonEncodeException.php', '_ContaoManager\\Crell\\ApiProblem\\JsonException' => $vendorDir . '/crell/api-problem/src/JsonException.php', '_ContaoManager\\Crell\\ApiProblem\\JsonParseException' => $vendorDir . '/crell/api-problem/src/JsonParseException.php', '_ContaoManager\\Doctrine\\Deprecations\\Deprecation' => $vendorDir . '/doctrine/deprecations/src/Deprecation.php', '_ContaoManager\\Doctrine\\Deprecations\\PHPUnit\\VerifyDeprecations' => $vendorDir . '/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php', '_ContaoManager\\Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php', '_ContaoManager\\Firebase\\JWT\\CachedKeySet' => $vendorDir . '/firebase/php-jwt/src/CachedKeySet.php', '_ContaoManager\\Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php', '_ContaoManager\\Firebase\\JWT\\JWK' => $vendorDir . '/firebase/php-jwt/src/JWK.php', '_ContaoManager\\Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php', '_ContaoManager\\Firebase\\JWT\\JWTExceptionWithPayloadInterface' => $vendorDir . '/firebase/php-jwt/src/JWTExceptionWithPayloadInterface.php', '_ContaoManager\\Firebase\\JWT\\Key' => $vendorDir . '/firebase/php-jwt/src/Key.php', '_ContaoManager\\Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php', '_ContaoManager\\JsonSchema\\Constraints\\BaseConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\CollectionConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\Constraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php', '_ContaoManager\\JsonSchema\\Constraints\\ConstraintInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php', '_ContaoManager\\JsonSchema\\Constraints\\EnumConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\Factory' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php', '_ContaoManager\\JsonSchema\\Constraints\\FormatConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\NumberConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\ObjectConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\SchemaConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\StringConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeCheck\\LooseTypeCheck' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeCheck\\StrictTypeCheck' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeCheck\\TypeCheckInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\UndefinedConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php', '_ContaoManager\\JsonSchema\\Entity\\JsonPointer' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php', '_ContaoManager\\JsonSchema\\Exception\\ExceptionInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidArgumentException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidConfigException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidConfigException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidSchemaException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidSchemaMediaTypeException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaMediaTypeException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidSourceUriException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSourceUriException.php', '_ContaoManager\\JsonSchema\\Exception\\JsonDecodingException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/JsonDecodingException.php', '_ContaoManager\\JsonSchema\\Exception\\ResourceNotFoundException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/ResourceNotFoundException.php', '_ContaoManager\\JsonSchema\\Exception\\RuntimeException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/RuntimeException.php', '_ContaoManager\\JsonSchema\\Exception\\UnresolvableJsonPointerException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/UnresolvableJsonPointerException.php', '_ContaoManager\\JsonSchema\\Exception\\UriResolverException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php', '_ContaoManager\\JsonSchema\\Exception\\ValidationException' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Exception/ValidationException.php', '_ContaoManager\\JsonSchema\\Iterator\\ObjectIterator' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Iterator/ObjectIterator.php', '_ContaoManager\\JsonSchema\\Rfc3339' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php', '_ContaoManager\\JsonSchema\\SchemaStorage' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorage.php', '_ContaoManager\\JsonSchema\\SchemaStorageInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php', '_ContaoManager\\JsonSchema\\UriResolverInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php', '_ContaoManager\\JsonSchema\\UriRetrieverInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/UriRetrieverInterface.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\AbstractRetriever' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\Curl' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\FileGetContents' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\PredefinedArray' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\UriRetrieverInterface' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php', '_ContaoManager\\JsonSchema\\Uri\\UriResolver' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php', '_ContaoManager\\JsonSchema\\Uri\\UriRetriever' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php', '_ContaoManager\\JsonSchema\\Validator' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Validator.php', '_ContaoManager\\Lcobucci\\Clock\\Clock' => $vendorDir . '/lcobucci/clock/src/Clock.php', '_ContaoManager\\Lcobucci\\Clock\\FrozenClock' => $vendorDir . '/lcobucci/clock/src/FrozenClock.php', '_ContaoManager\\Lcobucci\\Clock\\SystemClock' => $vendorDir . '/lcobucci/clock/src/SystemClock.php', '_ContaoManager\\Monolog\\Attribute\\AsMonologProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php', '_ContaoManager\\Monolog\\Attribute\\WithMonologChannel' => $vendorDir . '/monolog/monolog/src/Monolog/Attribute/WithMonologChannel.php', '_ContaoManager\\Monolog\\DateTimeImmutable' => $vendorDir . '/monolog/monolog/src/Monolog/DateTimeImmutable.php', '_ContaoManager\\Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php', '_ContaoManager\\Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', '_ContaoManager\\Monolog\\Formatter\\ElasticaFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php', '_ContaoManager\\Monolog\\Formatter\\ElasticsearchFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php', '_ContaoManager\\Monolog\\Formatter\\FlowdockFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php', '_ContaoManager\\Monolog\\Formatter\\FluentdFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php', '_ContaoManager\\Monolog\\Formatter\\FormatterInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', '_ContaoManager\\Monolog\\Formatter\\GelfMessageFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php', '_ContaoManager\\Monolog\\Formatter\\GoogleCloudLoggingFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php', '_ContaoManager\\Monolog\\Formatter\\HtmlFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php', '_ContaoManager\\Monolog\\Formatter\\JsonFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LineFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LogglyFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LogmaticFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LogstashFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php', '_ContaoManager\\Monolog\\Formatter\\MongoDBFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php', '_ContaoManager\\Monolog\\Formatter\\NormalizerFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', '_ContaoManager\\Monolog\\Formatter\\ScalarFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php', '_ContaoManager\\Monolog\\Formatter\\SyslogFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/SyslogFormatter.php', '_ContaoManager\\Monolog\\Formatter\\WildfireFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php', '_ContaoManager\\Monolog\\Handler\\AbstractHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', '_ContaoManager\\Monolog\\Handler\\AbstractProcessingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', '_ContaoManager\\Monolog\\Handler\\AbstractSyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php', '_ContaoManager\\Monolog\\Handler\\AmqpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php', '_ContaoManager\\Monolog\\Handler\\BrowserConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php', '_ContaoManager\\Monolog\\Handler\\BufferHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php', '_ContaoManager\\Monolog\\Handler\\ChromePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php', '_ContaoManager\\Monolog\\Handler\\CouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php', '_ContaoManager\\Monolog\\Handler\\CubeHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php', '_ContaoManager\\Monolog\\Handler\\Curl\\Util' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php', '_ContaoManager\\Monolog\\Handler\\DeduplicationHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php', '_ContaoManager\\Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', '_ContaoManager\\Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', '_ContaoManager\\Monolog\\Handler\\ElasticaHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', '_ContaoManager\\Monolog\\Handler\\ElasticsearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', '_ContaoManager\\Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', '_ContaoManager\\Monolog\\Handler\\FallbackGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', '_ContaoManager\\Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossedHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php', '_ContaoManager\\Monolog\\Handler\\FirePHPHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php', '_ContaoManager\\Monolog\\Handler\\FleepHookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php', '_ContaoManager\\Monolog\\Handler\\FlowdockHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php', '_ContaoManager\\Monolog\\Handler\\FormattableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php', '_ContaoManager\\Monolog\\Handler\\FormattableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php', '_ContaoManager\\Monolog\\Handler\\GelfHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php', '_ContaoManager\\Monolog\\Handler\\GroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php', '_ContaoManager\\Monolog\\Handler\\Handler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Handler.php', '_ContaoManager\\Monolog\\Handler\\HandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', '_ContaoManager\\Monolog\\Handler\\HandlerWrapper' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php', '_ContaoManager\\Monolog\\Handler\\IFTTTHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php', '_ContaoManager\\Monolog\\Handler\\InsightOpsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php', '_ContaoManager\\Monolog\\Handler\\LogEntriesHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php', '_ContaoManager\\Monolog\\Handler\\LogglyHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php', '_ContaoManager\\Monolog\\Handler\\LogmaticHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php', '_ContaoManager\\Monolog\\Handler\\MailHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MailHandler.php', '_ContaoManager\\Monolog\\Handler\\MandrillHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php', '_ContaoManager\\Monolog\\Handler\\MissingExtensionException' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php', '_ContaoManager\\Monolog\\Handler\\MongoDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php', '_ContaoManager\\Monolog\\Handler\\NativeMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php', '_ContaoManager\\Monolog\\Handler\\NewRelicHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php', '_ContaoManager\\Monolog\\Handler\\NoopHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NoopHandler.php', '_ContaoManager\\Monolog\\Handler\\NullHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/NullHandler.php', '_ContaoManager\\Monolog\\Handler\\OverflowHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/OverflowHandler.php', '_ContaoManager\\Monolog\\Handler\\PHPConsoleHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php', '_ContaoManager\\Monolog\\Handler\\ProcessHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessHandler.php', '_ContaoManager\\Monolog\\Handler\\ProcessableHandlerInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php', '_ContaoManager\\Monolog\\Handler\\ProcessableHandlerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php', '_ContaoManager\\Monolog\\Handler\\PsrHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php', '_ContaoManager\\Monolog\\Handler\\PushoverHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php', '_ContaoManager\\Monolog\\Handler\\RedisHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php', '_ContaoManager\\Monolog\\Handler\\RedisPubSubHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php', '_ContaoManager\\Monolog\\Handler\\RollbarHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php', '_ContaoManager\\Monolog\\Handler\\RotatingFileHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php', '_ContaoManager\\Monolog\\Handler\\SamplingHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php', '_ContaoManager\\Monolog\\Handler\\SendGridHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SendGridHandler.php', '_ContaoManager\\Monolog\\Handler\\SlackHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php', '_ContaoManager\\Monolog\\Handler\\SlackWebhookHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php', '_ContaoManager\\Monolog\\Handler\\Slack\\SlackRecord' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php', '_ContaoManager\\Monolog\\Handler\\SocketHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php', '_ContaoManager\\Monolog\\Handler\\SqsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php', '_ContaoManager\\Monolog\\Handler\\StreamHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', '_ContaoManager\\Monolog\\Handler\\SymfonyMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php', '_ContaoManager\\Monolog\\Handler\\SyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', '_ContaoManager\\Monolog\\Handler\\SyslogUdpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', '_ContaoManager\\Monolog\\Handler\\SyslogUdp\\UdpSocket' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', '_ContaoManager\\Monolog\\Handler\\TelegramBotHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php', '_ContaoManager\\Monolog\\Handler\\TestHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/TestHandler.php', '_ContaoManager\\Monolog\\Handler\\WebRequestRecognizerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php', '_ContaoManager\\Monolog\\Handler\\WhatFailureGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', '_ContaoManager\\Monolog\\Handler\\ZendMonitorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', '_ContaoManager\\Monolog\\JsonSerializableDateTimeImmutable' => $vendorDir . '/monolog/monolog/src/Monolog/JsonSerializableDateTimeImmutable.php', '_ContaoManager\\Monolog\\Level' => $vendorDir . '/monolog/monolog/src/Monolog/Level.php', '_ContaoManager\\Monolog\\LogRecord' => $vendorDir . '/monolog/monolog/src/Monolog/LogRecord.php', '_ContaoManager\\Monolog\\Logger' => $vendorDir . '/monolog/monolog/src/Monolog/Logger.php', '_ContaoManager\\Monolog\\Processor\\ClosureContextProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ClosureContextProcessor.php', '_ContaoManager\\Monolog\\Processor\\GitProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', '_ContaoManager\\Monolog\\Processor\\HostnameProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php', '_ContaoManager\\Monolog\\Processor\\IntrospectionProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', '_ContaoManager\\Monolog\\Processor\\LoadAverageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/LoadAverageProcessor.php', '_ContaoManager\\Monolog\\Processor\\MemoryPeakUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php', '_ContaoManager\\Monolog\\Processor\\MemoryProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', '_ContaoManager\\Monolog\\Processor\\MemoryUsageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', '_ContaoManager\\Monolog\\Processor\\MercurialProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php', '_ContaoManager\\Monolog\\Processor\\ProcessIdProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php', '_ContaoManager\\Monolog\\Processor\\ProcessorInterface' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', '_ContaoManager\\Monolog\\Processor\\PsrLogMessageProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php', '_ContaoManager\\Monolog\\Processor\\TagProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php', '_ContaoManager\\Monolog\\Processor\\UidProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php', '_ContaoManager\\Monolog\\Processor\\WebProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php', '_ContaoManager\\Monolog\\Registry' => $vendorDir . '/monolog/monolog/src/Monolog/Registry.php', '_ContaoManager\\Monolog\\ResettableInterface' => $vendorDir . '/monolog/monolog/src/Monolog/ResettableInterface.php', '_ContaoManager\\Monolog\\SignalHandler' => $vendorDir . '/monolog/monolog/src/Monolog/SignalHandler.php', '_ContaoManager\\Monolog\\Test\\MonologTestCase' => $vendorDir . '/monolog/monolog/src/Monolog/Test/MonologTestCase.php', '_ContaoManager\\Monolog\\Test\\TestCase' => $vendorDir . '/monolog/monolog/src/Monolog/Test/TestCase.php', '_ContaoManager\\Monolog\\Utils' => $vendorDir . '/monolog/monolog/src/Monolog/Utils.php', '_ContaoManager\\OTPHP\\Factory' => $vendorDir . '/spomky-labs/otphp/src/Factory.php', '_ContaoManager\\OTPHP\\FactoryInterface' => $vendorDir . '/spomky-labs/otphp/src/FactoryInterface.php', '_ContaoManager\\OTPHP\\HOTP' => $vendorDir . '/spomky-labs/otphp/src/HOTP.php', '_ContaoManager\\OTPHP\\HOTPInterface' => $vendorDir . '/spomky-labs/otphp/src/HOTPInterface.php', '_ContaoManager\\OTPHP\\InternalClock' => $vendorDir . '/spomky-labs/otphp/src/InternalClock.php', '_ContaoManager\\OTPHP\\OTP' => $vendorDir . '/spomky-labs/otphp/src/OTP.php', '_ContaoManager\\OTPHP\\OTPInterface' => $vendorDir . '/spomky-labs/otphp/src/OTPInterface.php', '_ContaoManager\\OTPHP\\ParameterTrait' => $vendorDir . '/spomky-labs/otphp/src/ParameterTrait.php', '_ContaoManager\\OTPHP\\TOTP' => $vendorDir . '/spomky-labs/otphp/src/TOTP.php', '_ContaoManager\\OTPHP\\TOTPInterface' => $vendorDir . '/spomky-labs/otphp/src/TOTPInterface.php', '_ContaoManager\\OTPHP\\Url' => $vendorDir . '/spomky-labs/otphp/src/Url.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Attribute' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Comment' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Comment.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Node' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Node.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor\\CloningVisitor' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagMethodValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagPropertyValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineAnnotation' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArgument' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArray' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArrayItem' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ExtendsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ImplementsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MixinTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamClosureThisTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamImmediatelyInvokedCallableTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamLaterInvokedCallableTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamOutTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PureUnlessCallableIsImpureTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireExtendsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireImplementsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\SelfOutTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasImportTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypelessParamTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\UsesTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeUnsealedTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeForParameterNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\InvalidTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeItemNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => $vendorDir . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Lexer\\Lexer' => $vendorDir . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', '_ContaoManager\\PHPStan\\PhpDocParser\\ParserConfig' => $vendorDir . '/phpstan/phpdoc-parser/src/ParserConfig.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\ParserException' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\StringUnescaper' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\TokenIterator' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\TypeParser' => $vendorDir . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Printer\\DiffElem' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/DiffElem.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Printer\\Differ' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/Differ.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Printer\\Printer' => $vendorDir . '/phpstan/phpdoc-parser/src/Printer/Printer.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base32' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base32Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32Hex.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64DotSlash' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64DotSlash.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64DotSlashOrdered' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64UrlSafe' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64UrlSafe.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Binary' => $vendorDir . '/paragonie/constant_time_encoding/src/Binary.php', '_ContaoManager\\ParagonIE\\ConstantTime\\EncoderInterface' => $vendorDir . '/paragonie/constant_time_encoding/src/EncoderInterface.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Encoding' => $vendorDir . '/paragonie/constant_time_encoding/src/Encoding.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Hex.php', '_ContaoManager\\ParagonIE\\ConstantTime\\RFC4648' => $vendorDir . '/paragonie/constant_time_encoding/src/RFC4648.php', '_ContaoManager\\Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php', '_ContaoManager\\Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php', '_ContaoManager\\Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php', '_ContaoManager\\Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php', '_ContaoManager\\Psr\\Clock\\ClockInterface' => $vendorDir . '/psr/clock/src/ClockInterface.php', '_ContaoManager\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', '_ContaoManager\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', '_ContaoManager\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', '_ContaoManager\\Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php', '_ContaoManager\\Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php', '_ContaoManager\\Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php', '_ContaoManager\\Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php', '_ContaoManager\\Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php', '_ContaoManager\\Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php', '_ContaoManager\\Psr\\Http\\Client\\RequestExceptionInterface' => $vendorDir . '/psr/http-client/src/RequestExceptionInterface.php', '_ContaoManager\\Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', '_ContaoManager\\Psr\\Http\\Message\\RequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/RequestFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ResponseFactoryInterface' => $vendorDir . '/psr/http-factory/src/ResponseFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ServerRequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/ServerRequestFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', '_ContaoManager\\Psr\\Http\\Message\\StreamFactoryInterface' => $vendorDir . '/psr/http-factory/src/StreamFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UploadedFileFactoryInterface' => $vendorDir . '/psr/http-factory/src/UploadedFileFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', '_ContaoManager\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', '_ContaoManager\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', '_ContaoManager\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', '_ContaoManager\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', '_ContaoManager\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', '_ContaoManager\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', '_ContaoManager\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', '_ContaoManager\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', '_ContaoManager\\Ramsey\\Collection\\AbstractArray' => $vendorDir . '/ramsey/collection/src/AbstractArray.php', '_ContaoManager\\Ramsey\\Collection\\AbstractCollection' => $vendorDir . '/ramsey/collection/src/AbstractCollection.php', '_ContaoManager\\Ramsey\\Collection\\AbstractSet' => $vendorDir . '/ramsey/collection/src/AbstractSet.php', '_ContaoManager\\Ramsey\\Collection\\ArrayInterface' => $vendorDir . '/ramsey/collection/src/ArrayInterface.php', '_ContaoManager\\Ramsey\\Collection\\Collection' => $vendorDir . '/ramsey/collection/src/Collection.php', '_ContaoManager\\Ramsey\\Collection\\CollectionInterface' => $vendorDir . '/ramsey/collection/src/CollectionInterface.php', '_ContaoManager\\Ramsey\\Collection\\DoubleEndedQueue' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueue.php', '_ContaoManager\\Ramsey\\Collection\\DoubleEndedQueueInterface' => $vendorDir . '/ramsey/collection/src/DoubleEndedQueueInterface.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\CollectionException' => $vendorDir . '/ramsey/collection/src/Exception/CollectionException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\CollectionMismatchException' => $vendorDir . '/ramsey/collection/src/Exception/CollectionMismatchException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/collection/src/Exception/InvalidArgumentException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\InvalidPropertyOrMethod' => $vendorDir . '/ramsey/collection/src/Exception/InvalidPropertyOrMethod.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\NoSuchElementException' => $vendorDir . '/ramsey/collection/src/Exception/NoSuchElementException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\OutOfBoundsException' => $vendorDir . '/ramsey/collection/src/Exception/OutOfBoundsException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/collection/src/Exception/UnsupportedOperationException.php', '_ContaoManager\\Ramsey\\Collection\\GenericArray' => $vendorDir . '/ramsey/collection/src/GenericArray.php', '_ContaoManager\\Ramsey\\Collection\\Map\\AbstractMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\AbstractTypedMap' => $vendorDir . '/ramsey/collection/src/Map/AbstractTypedMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\AssociativeArrayMap' => $vendorDir . '/ramsey/collection/src/Map/AssociativeArrayMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\MapInterface' => $vendorDir . '/ramsey/collection/src/Map/MapInterface.php', '_ContaoManager\\Ramsey\\Collection\\Map\\NamedParameterMap' => $vendorDir . '/ramsey/collection/src/Map/NamedParameterMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\TypedMap' => $vendorDir . '/ramsey/collection/src/Map/TypedMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\TypedMapInterface' => $vendorDir . '/ramsey/collection/src/Map/TypedMapInterface.php', '_ContaoManager\\Ramsey\\Collection\\Queue' => $vendorDir . '/ramsey/collection/src/Queue.php', '_ContaoManager\\Ramsey\\Collection\\QueueInterface' => $vendorDir . '/ramsey/collection/src/QueueInterface.php', '_ContaoManager\\Ramsey\\Collection\\Set' => $vendorDir . '/ramsey/collection/src/Set.php', '_ContaoManager\\Ramsey\\Collection\\Sort' => $vendorDir . '/ramsey/collection/src/Sort.php', '_ContaoManager\\Ramsey\\Collection\\Tool\\TypeTrait' => $vendorDir . '/ramsey/collection/src/Tool/TypeTrait.php', '_ContaoManager\\Ramsey\\Collection\\Tool\\ValueExtractorTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueExtractorTrait.php', '_ContaoManager\\Ramsey\\Collection\\Tool\\ValueToStringTrait' => $vendorDir . '/ramsey/collection/src/Tool/ValueToStringTrait.php', '_ContaoManager\\Ramsey\\Uuid\\BinaryUtils' => $vendorDir . '/ramsey/uuid/src/BinaryUtils.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\BuilderCollection' => $vendorDir . '/ramsey/uuid/src/Builder/BuilderCollection.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\FallbackBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/FallbackBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => $vendorDir . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\CodecInterface' => $vendorDir . '/ramsey/uuid/src/Codec/CodecInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\GuidStringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/GuidStringCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => $vendorDir . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\StringCodec' => $vendorDir . '/ramsey/uuid/src/Codec/StringCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => $vendorDir . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\NumberConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/NumberConverterInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\TimeConverterInterface' => $vendorDir . '/ramsey/uuid/src/Converter/TimeConverterInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\UnixTimeConverter' => $vendorDir . '/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\DegradedUuid' => $vendorDir . '/ramsey/uuid/src/DegradedUuid.php', '_ContaoManager\\Ramsey\\Uuid\\DeprecatedUuidInterface' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidInterface.php', '_ContaoManager\\Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => $vendorDir . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => $vendorDir . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\DateTimeException' => $vendorDir . '/ramsey/uuid/src/Exception/DateTimeException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\DceSecurityException' => $vendorDir . '/ramsey/uuid/src/Exception/DceSecurityException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\InvalidArgumentException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidArgumentException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\InvalidBytesException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidBytesException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => $vendorDir . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\NameException' => $vendorDir . '/ramsey/uuid/src/Exception/NameException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\NodeException' => $vendorDir . '/ramsey/uuid/src/Exception/NodeException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\RandomSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/RandomSourceException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\TimeSourceException' => $vendorDir . '/ramsey/uuid/src/Exception/TimeSourceException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => $vendorDir . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => $vendorDir . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\UuidExceptionInterface' => $vendorDir . '/ramsey/uuid/src/Exception/UuidExceptionInterface.php', '_ContaoManager\\Ramsey\\Uuid\\FeatureSet' => $vendorDir . '/ramsey/uuid/src/FeatureSet.php', '_ContaoManager\\Ramsey\\Uuid\\Fields\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Fields/FieldsInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => $vendorDir . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\CombGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/CombGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomLibAdapter' => $vendorDir . '/ramsey/uuid/src/Generator/RandomLibAdapter.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => $vendorDir . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\UnixTimeGenerator' => $vendorDir . '/ramsey/uuid/src/Generator/UnixTimeGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Guid\\Fields' => $vendorDir . '/ramsey/uuid/src/Guid/Fields.php', '_ContaoManager\\Ramsey\\Uuid\\Guid\\Guid' => $vendorDir . '/ramsey/uuid/src/Guid/Guid.php', '_ContaoManager\\Ramsey\\Uuid\\Guid\\GuidBuilder' => $vendorDir . '/ramsey/uuid/src/Guid/GuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Lazy\\LazyUuidFromString' => $vendorDir . '/ramsey/uuid/src/Lazy/LazyUuidFromString.php', '_ContaoManager\\Ramsey\\Uuid\\Math\\BrickMathCalculator' => $vendorDir . '/ramsey/uuid/src/Math/BrickMathCalculator.php', '_ContaoManager\\Ramsey\\Uuid\\Math\\CalculatorInterface' => $vendorDir . '/ramsey/uuid/src/Math/CalculatorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Math\\RoundingMode' => $vendorDir . '/ramsey/uuid/src/Math/RoundingMode.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\Fields' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Fields.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\Uuid' => $vendorDir . '/ramsey/uuid/src/Nonstandard/Uuid.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Nonstandard/UuidV6.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\NodeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/NodeProviderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => $vendorDir . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\TimeProviderInterface' => $vendorDir . '/ramsey/uuid/src/Provider/TimeProviderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => $vendorDir . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\Fields' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Fields.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\MaxTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/MaxTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\MaxUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/MaxUuid.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\NilTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\NilUuid' => $vendorDir . '/ramsey/uuid/src/Rfc4122/NilUuid.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\TimeTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/TimeTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV1' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV1.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV2' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV2.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV3' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV3.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV4' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV4.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV5' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV5.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV6' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV6.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV7' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV7.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV8' => $vendorDir . '/ramsey/uuid/src/Rfc4122/UuidV8.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\Validator' => $vendorDir . '/ramsey/uuid/src/Rfc4122/Validator.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\VariantTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VariantTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\VersionTrait' => $vendorDir . '/ramsey/uuid/src/Rfc4122/VersionTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Decimal' => $vendorDir . '/ramsey/uuid/src/Type/Decimal.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Hexadecimal' => $vendorDir . '/ramsey/uuid/src/Type/Hexadecimal.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Integer' => $vendorDir . '/ramsey/uuid/src/Type/Integer.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\NumberInterface' => $vendorDir . '/ramsey/uuid/src/Type/NumberInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Time' => $vendorDir . '/ramsey/uuid/src/Type/Time.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\TypeInterface' => $vendorDir . '/ramsey/uuid/src/Type/TypeInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Uuid' => $vendorDir . '/ramsey/uuid/src/Uuid.php', '_ContaoManager\\Ramsey\\Uuid\\UuidFactory' => $vendorDir . '/ramsey/uuid/src/UuidFactory.php', '_ContaoManager\\Ramsey\\Uuid\\UuidFactoryInterface' => $vendorDir . '/ramsey/uuid/src/UuidFactoryInterface.php', '_ContaoManager\\Ramsey\\Uuid\\UuidInterface' => $vendorDir . '/ramsey/uuid/src/UuidInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Validator\\GenericValidator' => $vendorDir . '/ramsey/uuid/src/Validator/GenericValidator.php', '_ContaoManager\\Ramsey\\Uuid\\Validator\\ValidatorInterface' => $vendorDir . '/ramsey/uuid/src/Validator/ValidatorInterface.php', '_ContaoManager\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', '_ContaoManager\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', '_ContaoManager\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', '_ContaoManager\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', '_ContaoManager\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', '_ContaoManager\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', '_ContaoManager\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', '_ContaoManager\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', '_ContaoManager\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', '_ContaoManager\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', '_ContaoManager\\Seld\\JsonLint\\DuplicateKeyException' => $vendorDir . '/seld/jsonlint/src/Seld/JsonLint/DuplicateKeyException.php', '_ContaoManager\\Seld\\JsonLint\\JsonParser' => $vendorDir . '/seld/jsonlint/src/Seld/JsonLint/JsonParser.php', '_ContaoManager\\Seld\\JsonLint\\Lexer' => $vendorDir . '/seld/jsonlint/src/Seld/JsonLint/Lexer.php', '_ContaoManager\\Seld\\JsonLint\\ParsingException' => $vendorDir . '/seld/jsonlint/src/Seld/JsonLint/ParsingException.php', '_ContaoManager\\Seld\\JsonLint\\Undefined' => $vendorDir . '/seld/jsonlint/src/Seld/JsonLint/Undefined.php', '_ContaoManager\\Seld\\PharUtils\\Linter' => $vendorDir . '/seld/phar-utils/src/Linter.php', '_ContaoManager\\Seld\\PharUtils\\Timestamps' => $vendorDir . '/seld/phar-utils/src/Timestamps.php', '_ContaoManager\\Seld\\Signal\\SignalHandler' => $vendorDir . '/seld/signal-handler/src/SignalHandler.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Component\\Identifier' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Component/Identifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Component\\Length' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Component/Length.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\DERData' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/DERData.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Element' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Element.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Exception\\DecodeException' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Exception/DecodeException.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Feature\\ElementBase' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Feature/ElementBase.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Feature\\Encodable' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Feature/Encodable.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Feature\\Stringable' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Feature/Stringable.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\BaseString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/BaseString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\BaseTime' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/BaseTime.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Constructed\\ConstructedString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Constructed/ConstructedString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Constructed\\Sequence' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Constructed/Sequence.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Constructed\\Set' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Constructed/Set.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\PrimitiveString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/PrimitiveString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\PrimitiveType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/PrimitiveType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\BMPString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/BMPString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\BitString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/BitString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Boolean' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Boolean.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\CharacterString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/CharacterString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\EOC' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/EOC.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Enumerated' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Enumerated.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\GeneralString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GeneralString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\GeneralizedTime' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GeneralizedTime.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\GraphicString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GraphicString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\IA5String' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/IA5String.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Integer' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Integer.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\NullType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/NullType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Number' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Number.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\NumericString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/NumericString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\ObjectDescriptor' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/ObjectDescriptor.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\ObjectIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/ObjectIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\OctetString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/OctetString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\PrintableString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/PrintableString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Real' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Real.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\RelativeOID' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/RelativeOID.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\T61String' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/T61String.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\UTCTime' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UTCTime.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\UTF8String' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UTF8String.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\UniversalString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UniversalString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\VideotexString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/VideotexString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\VisibleString' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/VisibleString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\StringType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/StringType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Structure' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Structure.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\TaggedType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/TaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ApplicationType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ApplicationType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ContextSpecificType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ContextSpecificType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\DERTaggedType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/DERTaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ExplicitTagging' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ExplicitTagging.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ExplicitlyTaggedType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ExplicitlyTaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ImplicitTagging' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ImplicitTagging.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ImplicitlyTaggedType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ImplicitlyTaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\PrivateType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/PrivateType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\TaggedTypeWrap' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/TaggedTypeWrap.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\TimeType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/TimeType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\UniversalClass' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/UniversalClass.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\UnspecifiedType' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Type/UnspecifiedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Util\\BigInt' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Util/BigInt.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Util\\Flags' => $vendorDir . '/spomky-labs/pki-framework/src/ASN1/Util/Flags.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoBridge\\Crypto' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoBridge/Crypto.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoBridge\\Crypto\\OpenSSLCrypto' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoBridge/Crypto/OpenSSLCrypto.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoEncoding\\PEM' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoEncoding/PEM.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoEncoding\\PEMBundle' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoEncoding/PEMBundle.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\AlgorithmIdentifierFactory' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifierFactory.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\AlgorithmIdentifierProvider' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifierProvider.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\ECPublicKeyAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/ECPublicKeyAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\Ed25519AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/Ed25519AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\Ed448AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/Ed448AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RFC8410EdAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RFC8410EdAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RFC8410XAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RFC8410XAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RSAPSSSSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RSAPSSSSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\X25519AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/X25519AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\X448AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/X448AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AES128CBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES128CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AES192CBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES192CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AES256CBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES256CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AESCBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AESCBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\BlockCipherAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/BlockCipherAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\CipherAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/CipherAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\DESCBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/DESCBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\DESEDE3CBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/DESEDE3CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\RC2CBCAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/RC2CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\AlgorithmIdentifierType' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/AlgorithmIdentifierType.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\AsymmetricCryptoAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/AsymmetricCryptoAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\EncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/EncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\HashAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/HashAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\PRFAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/PRFAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\SignatureAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/SignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\GenericAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/GenericAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA1AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA1AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA224AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA224AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA256AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA256AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA384AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA384AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA512AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA512AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\MD5AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/MD5AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\RFC4231HMACAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/RFC4231HMACAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA1AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA1AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA224AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA224AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA256AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA256AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA2AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA2AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA384AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA384AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA512AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA512AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA1AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA1AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA224AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA224AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA256AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA256AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA384AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA384AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA512AlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA512AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECSignatureAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECSignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\MD2WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD2WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\MD4WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD4WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\MD5WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD5WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\RFC3279RSASignatureAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RFC3279RSASignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\RFC4055RSASignatureAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RFC4055RSASignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\RSASignatureAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RSASignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA1WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA1WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA224WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA224WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA256WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA256WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA384WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA384WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA512WithRSAEncryptionAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA512WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\SpecificAlgorithmIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/SpecificAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\Attribute\\OneAsymmetricKeyAttributes' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/Attribute/OneAsymmetricKeyAttributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\EC\\ECConversion' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECConversion.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\EC\\ECPrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECPrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\EC\\ECPublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECPublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\OneAsymmetricKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/OneAsymmetricKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PrivateKeyInfo' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PrivateKeyInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PublicKeyInfo' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PublicKeyInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Curve25519PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Curve25519PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Curve25519PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Curve25519PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Ed25519PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Ed25519PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Ed25519PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Ed25519PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\X25519PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/X25519PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\X25519PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/X25519PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\Ed448PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/Ed448PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\Ed448PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/Ed448PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\X448PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/X448PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\X448PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/X448PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\RFC8410PrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/RFC8410PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\RFC8410PublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/RFC8410PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RSA\\RSAPrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSAPrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RSA\\RSAPublicKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSAPublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RSA\\RSASSAPSSPrivateKey' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSASSAPSSPrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\ECSignature' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/ECSignature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\Ed25519Signature' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/Ed25519Signature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\Ed448Signature' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/Ed448Signature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\GenericSignature' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/GenericSignature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\RSASignature' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/RSASignature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\Signature' => $vendorDir . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/Signature.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Attribute' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/Attribute.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeType' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeType.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeTypeAndValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeTypeAndValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\AttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/AttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\CommonNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/CommonNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\CountryNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/CountryNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\DescriptionValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/DescriptionValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\Feature\\DirectoryString' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/Feature/DirectoryString.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\Feature\\PrintableStringValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/Feature/PrintableStringValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\GivenNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/GivenNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\LocalityNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/LocalityNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\NameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/NameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\OrganizationNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/OrganizationNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\OrganizationalUnitNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/OrganizationalUnitNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\PseudonymValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/PseudonymValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\SerialNumberValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/SerialNumberValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\StateOrProvinceNameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/StateOrProvinceNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\SurnameValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/SurnameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\TitleValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/TitleValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\UnknownAttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/UnknownAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Collection\\AttributeCollection' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/Collection/AttributeCollection.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Collection\\SequenceOfAttributes' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/Collection/SequenceOfAttributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Collection\\SetOfAttributes' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/Collection/SetOfAttributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Name' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/Name.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\RDN' => $vendorDir . '/spomky-labs/pki-framework/src/X501/ASN1/RDN.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\DN\\DNParser' => $vendorDir . '/spomky-labs/pki-framework/src/X501/DN/DNParser.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\BinaryMatch' => $vendorDir . '/spomky-labs/pki-framework/src/X501/MatchingRule/BinaryMatch.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\CaseExactMatch' => $vendorDir . '/spomky-labs/pki-framework/src/X501/MatchingRule/CaseExactMatch.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\CaseIgnoreMatch' => $vendorDir . '/spomky-labs/pki-framework/src/X501/MatchingRule/CaseIgnoreMatch.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\MatchingRule' => $vendorDir . '/spomky-labs/pki-framework/src/X501/MatchingRule/MatchingRule.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\StringPrepMatchingRule' => $vendorDir . '/spomky-labs/pki-framework/src/X501/MatchingRule/StringPrepMatchingRule.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\CheckBidiStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/CheckBidiStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\InsignificantNonSubstringSpaceStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/InsignificantNonSubstringSpaceStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\MapStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/MapStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\NormalizeStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/NormalizeStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\PrepareStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/PrepareStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\ProhibitStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/ProhibitStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\StringPreparer' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/StringPreparer.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\TranscodeStep' => $vendorDir . '/spomky-labs/pki-framework/src/X501/StringPrep/TranscodeStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttCertIssuer' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttCertIssuer.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttCertValidityPeriod' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttCertValidityPeriod.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttributeCertificate' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttributeCertificate.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttributeCertificateInfo' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttributeCertificateInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\AccessIdentityAttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/AccessIdentityAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\AuthenticationInfoAttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/AuthenticationInfoAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\ChargingIdentityAttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/ChargingIdentityAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\GroupAttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/GroupAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\IetfAttrSyntax' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/IetfAttrSyntax.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\IetfAttrValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/IetfAttrValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\RoleAttributeValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/RoleAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\SvceAuthInfo' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/SvceAuthInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attributes' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Holder' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Holder.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\IssuerSerial' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/IssuerSerial.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\ObjectDigestInfo' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/ObjectDigestInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\V2Form' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/V2Form.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Validation\\ACValidationConfig' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/ACValidationConfig.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Validation\\ACValidator' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/ACValidator.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Validation\\Exception\\ACValidationException' => $vendorDir . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/Exception/ACValidationException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Certificate' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Certificate.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\CertificateBundle' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/CertificateBundle.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\CertificateChain' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/CertificateChain.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AAControlsExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AAControlsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AccessDescription\\AccessDescription' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/AccessDescription.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AccessDescription\\AuthorityAccessDescription' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/AuthorityAccessDescription.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AccessDescription\\SubjectAccessDescription' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/SubjectAccessDescription.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AuthorityInformationAccessExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AuthorityInformationAccessExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AuthorityKeyIdentifierExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AuthorityKeyIdentifierExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\BasicConstraintsExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/BasicConstraintsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CRLDistributionPointsExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CRLDistributionPointsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePoliciesExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePoliciesExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\CPSQualifier' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/CPSQualifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\DisplayText' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/DisplayText.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\NoticeReference' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/NoticeReference.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\PolicyInformation' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/PolicyInformation.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\PolicyQualifierInfo' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/PolicyQualifierInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\UserNoticeQualifier' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/UserNoticeQualifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\DistributionPoint' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/DistributionPoint.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\DistributionPointName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/DistributionPointName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\FullName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/FullName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\ReasonFlags' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/ReasonFlags.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\RelativeName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/RelativeName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\ExtendedKeyUsageExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/ExtendedKeyUsageExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Extension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Extension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\FreshestCRLExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/FreshestCRLExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\InhibitAnyPolicyExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/InhibitAnyPolicyExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\IssuerAlternativeNameExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/IssuerAlternativeNameExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\KeyUsageExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/KeyUsageExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NameConstraintsExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraintsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NameConstraints\\GeneralSubtree' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraints/GeneralSubtree.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NameConstraints\\GeneralSubtrees' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraints/GeneralSubtrees.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NoRevocationAvailableExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NoRevocationAvailableExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\PolicyConstraintsExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyConstraintsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\PolicyMappingsExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyMappingsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\PolicyMappings\\PolicyMapping' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyMappings/PolicyMapping.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectAlternativeNameExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectAlternativeNameExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectDirectoryAttributesExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectDirectoryAttributesExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectInformationAccessExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectInformationAccessExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectKeyIdentifierExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectKeyIdentifierExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\TargetInformationExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/TargetInformationExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\Target' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/Target.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\TargetGroup' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/TargetGroup.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\TargetName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/TargetName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\Targets' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/Targets.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\UnknownExtension' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/UnknownExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extensions' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Extensions.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\TBSCertificate' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/TBSCertificate.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Time' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Time.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\UniqueIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/UniqueIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Validity' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Certificate/Validity.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\CertificationPath' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/CertificationPath.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Exception\\PathBuildingException' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/Exception/PathBuildingException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Exception\\PathValidationException' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/Exception/PathValidationException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathBuilding\\CertificationPathBuilder' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathBuilding/CertificationPathBuilder.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\PathValidationConfig' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidationConfig.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\PathValidationResult' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidationResult.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\PathValidator' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidator.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\ValidatorState' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/ValidatorState.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Policy\\PolicyNode' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/Policy/PolicyNode.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Policy\\PolicyTree' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationPath/Policy/PolicyTree.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\Attribute\\ExtensionRequestValue' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationRequest/Attribute/ExtensionRequestValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\Attributes' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationRequest/Attributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\CertificationRequest' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationRequest/CertificationRequest.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\CertificationRequestInfo' => $vendorDir . '/spomky-labs/pki-framework/src/X509/CertificationRequest/CertificationRequestInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Exception\\X509ValidationException' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Exception/X509ValidationException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Feature\\DateTimeHelper' => $vendorDir . '/spomky-labs/pki-framework/src/X509/Feature/DateTimeHelper.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\DNSName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/DNSName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\DirectoryName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/DirectoryName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\EDIPartyName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/EDIPartyName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\GeneralName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/GeneralName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\GeneralNames' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/GeneralNames.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\IPAddress' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/IPAddress.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\IPv4Address' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/IPv4Address.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\IPv6Address' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/IPv6Address.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\OtherName' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/OtherName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\RFC822Name' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/RFC822Name.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\RegisteredID' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/RegisteredID.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\UniformResourceIdentifier' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/UniformResourceIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\X400Address' => $vendorDir . '/spomky-labs/pki-framework/src/X509/GeneralName/X400Address.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Command\\ServerLogCommand' => $vendorDir . '/symfony/monolog-bridge/Command/ServerLogCommand.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Formatter\\CompatibilityFormatter' => $vendorDir . '/symfony/monolog-bridge/Formatter/CompatibilityFormatter.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Formatter\\ConsoleFormatter' => $vendorDir . '/symfony/monolog-bridge/Formatter/ConsoleFormatter.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Formatter\\VarDumperFormatter' => $vendorDir . '/symfony/monolog-bridge/Formatter/VarDumperFormatter.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ChromePhpHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/ChromePhpHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\CompatibilityHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/CompatibilityHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\CompatibilityProcessingHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/CompatibilityProcessingHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ConsoleHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/ConsoleHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ElasticsearchLogstashHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/ElasticsearchLogstashHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\FingersCrossed\\HttpCodeActivationStrategy' => $vendorDir . '/symfony/monolog-bridge/Handler/FingersCrossed/HttpCodeActivationStrategy.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\FingersCrossed\\NotFoundActivationStrategy' => $vendorDir . '/symfony/monolog-bridge/Handler/FingersCrossed/NotFoundActivationStrategy.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\FirePHPHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/FirePHPHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\MailerHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/MailerHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\NotifierHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/NotifierHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ServerLogHandler' => $vendorDir . '/symfony/monolog-bridge/Handler/ServerLogHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Logger' => $vendorDir . '/symfony/monolog-bridge/Logger.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\AbstractTokenProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/AbstractTokenProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\CompatibilityProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/CompatibilityProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\ConsoleCommandProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/ConsoleCommandProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\DebugProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/DebugProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\RouteProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/RouteProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\SwitchUserTokenProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/SwitchUserTokenProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\TokenProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/TokenProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\WebProcessor' => $vendorDir . '/symfony/monolog-bridge/Processor/WebProcessor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\CachePoolClearerCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ConfigBuilderCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\RouterCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\SerializerCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TranslationsCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ValidatorCacheWarmer' => $vendorDir . '/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand' => $vendorDir . '/symfony/framework-bundle/Command/AboutCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AbstractConfigCommand' => $vendorDir . '/symfony/framework-bundle/Command/AbstractConfigCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand' => $vendorDir . '/symfony/framework-bundle/Command/AssetsInstallCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\BuildDebugContainerTrait' => $vendorDir . '/symfony/framework-bundle/Command/BuildDebugContainerTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand' => $vendorDir . '/symfony/framework-bundle/Command/CacheClearCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolClearCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolDeleteCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolInvalidateTagsCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolInvalidateTagsCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolListCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand' => $vendorDir . '/symfony/framework-bundle/Command/CachePoolPruneCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand' => $vendorDir . '/symfony/framework-bundle/Command/CacheWarmupCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/ConfigDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand' => $vendorDir . '/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/ContainerLintCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand' => $vendorDir . '/symfony/framework-bundle/Command/DebugAutowiringCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/RouterDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand' => $vendorDir . '/symfony/framework-bundle/Command/RouterMatchCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsListCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsRemoveCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand' => $vendorDir . '/symfony/framework-bundle/Command/SecretsSetCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationDebugCommand' => $vendorDir . '/symfony/framework-bundle/Command/TranslationDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationUpdateCommand' => $vendorDir . '/symfony/framework-bundle/Command/TranslationUpdateCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\WorkflowDumpCommand' => $vendorDir . '/symfony/framework-bundle/Command/WorkflowDumpCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\XliffLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/XliffLintCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\YamlLintCommand' => $vendorDir . '/symfony/framework-bundle/Command/YamlLintCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Application' => $vendorDir . '/symfony/framework-bundle/Console/Application.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/Descriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/framework-bundle/Console/Helper/DescriptorHelper.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController' => $vendorDir . '/symfony/framework-bundle/Controller/AbstractController.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver' => $vendorDir . '/symfony/framework-bundle/Controller/ControllerResolver.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => $vendorDir . '/symfony/framework-bundle/Controller/RedirectController.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => $vendorDir . '/symfony/framework-bundle/Controller/TemplateController.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DataCollector\\AbstractDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/AbstractDataCollector.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/framework-bundle/DataCollector/RouterDataCollector.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DataCollector\\TemplateAwareDataCollectorInterface' => $vendorDir . '/symfony/framework-bundle/DataCollector/TemplateAwareDataCollectorInterface.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddAnnotationsCachedReaderPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddDebugLogProcessorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AssetsContextPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/AssetsContextPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ContainerBuilderDebugDumpPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\DataCollectorTranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\EnableLoggerDebugModePass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/EnableLoggerDebugModePass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ErrorLoggerCompilerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ErrorLoggerCompilerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\LoggingTranslatorPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ProfilerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\RemoveUnusedSessionMarshallingHandlerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/RemoveUnusedSessionMarshallingHandlerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerRealRefPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerWeakRefPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslationUpdateCommandPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\UnusedTagsPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\WorkflowGuardListenerPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/Configuration.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\FrameworkExtension' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\VirtualRequestStackPass' => $vendorDir . '/symfony/framework-bundle/DependencyInjection/VirtualRequestStackPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\EventListener\\ConsoleProfilerListener' => $vendorDir . '/symfony/framework-bundle/EventListener/ConsoleProfilerListener.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber' => $vendorDir . '/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle' => $vendorDir . '/symfony/framework-bundle/FrameworkBundle.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache' => $vendorDir . '/symfony/framework-bundle/HttpCache/HttpCache.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\KernelBrowser' => $vendorDir . '/symfony/framework-bundle/KernelBrowser.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait' => $vendorDir . '/symfony/framework-bundle/Kernel/MicroKernelTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\AnnotatedRouteControllerLoader' => $vendorDir . '/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\AttributeRouteControllerLoader' => $vendorDir . '/symfony/framework-bundle/Routing/AttributeRouteControllerLoader.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\Attribute\\AsRoutingConditionService' => $vendorDir . '/symfony/framework-bundle/Routing/Attribute/AsRoutingConditionService.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader' => $vendorDir . '/symfony/framework-bundle/Routing/DelegatingLoader.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher' => $vendorDir . '/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\RouteLoaderInterface' => $vendorDir . '/symfony/framework-bundle/Routing/RouteLoaderInterface.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\Router' => $vendorDir . '/symfony/framework-bundle/Routing/Router.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\AbstractVault' => $vendorDir . '/symfony/framework-bundle/Secrets/AbstractVault.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\DotenvVault' => $vendorDir . '/symfony/framework-bundle/Secrets/DotenvVault.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault' => $vendorDir . '/symfony/framework-bundle/Secrets/SodiumVault.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\BrowserKitAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\DomCrawlerAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\HttpClientAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/HttpClientAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase' => $vendorDir . '/symfony/framework-bundle/Test/KernelTestCase.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\MailerAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/MailerAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\NotificationAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/NotificationAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\TestBrowserToken' => $vendorDir . '/symfony/framework-bundle/Test/TestBrowserToken.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\TestContainer' => $vendorDir . '/symfony/framework-bundle/Test/TestContainer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestAssertionsTrait' => $vendorDir . '/symfony/framework-bundle/Test/WebTestAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase' => $vendorDir . '/symfony/framework-bundle/Test/WebTestCase.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator' => $vendorDir . '/symfony/framework-bundle/Translation/Translator.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\AddProcessorsPass' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/Compiler/AddProcessorsPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\AddSwiftMailerTransportPass' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/Compiler/AddSwiftMailerTransportPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\DebugHandlerPass' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/Compiler/DebugHandlerPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\FixEmptyLoggerPass' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/Compiler/FixEmptyLoggerPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\LoggerChannelPass' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/Compiler/LoggerChannelPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/Configuration.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\MonologExtension' => $vendorDir . '/symfony/monolog-bundle/DependencyInjection/MonologExtension.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\MonologBundle' => $vendorDir . '/symfony/monolog-bundle/MonologBundle.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\SwiftMailer\\MessageFactory' => $vendorDir . '/symfony/monolog-bundle/SwiftMailer/MessageFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\CacheWarmer\\ExpressionCacheWarmer' => $vendorDir . '/symfony/security-bundle/CacheWarmer/ExpressionCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Command\\DebugFirewallCommand' => $vendorDir . '/symfony/security-bundle/Command/DebugFirewallCommand.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DataCollector\\SecurityDataCollector' => $vendorDir . '/symfony/security-bundle/DataCollector/SecurityDataCollector.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableFirewallListener' => $vendorDir . '/symfony/security-bundle/Debug/TraceableFirewallListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableListenerTrait' => $vendorDir . '/symfony/security-bundle/Debug/TraceableListenerTrait.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\WrappedLazyListener' => $vendorDir . '/symfony/security-bundle/Debug/WrappedLazyListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\WrappedListener' => $vendorDir . '/symfony/security-bundle/Debug/WrappedListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\AddSecurityVotersPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/AddSecurityVotersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\AddSessionDomainConstraintPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/AddSessionDomainConstraintPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\CleanRememberMeVerifierPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/CleanRememberMeVerifierPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\MakeFirewallsEventDispatcherTraceablePass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/MakeFirewallsEventDispatcherTraceablePass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterCsrfFeaturesPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterCsrfFeaturesPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterEntryPointPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterEntryPointPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterGlobalSecurityEventListenersPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterGlobalSecurityEventListenersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterLdapLocatorPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterLdapLocatorPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterTokenUsageTrackingPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterTokenUsageTrackingPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\ReplaceDecoratedRememberMeHandlerPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/ReplaceDecoratedRememberMeHandlerPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\SortFirewallListenersPass' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Compiler/SortFirewallListenersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\MainConfiguration' => $vendorDir . '/symfony/security-bundle/DependencyInjection/MainConfiguration.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\SecurityExtension' => $vendorDir . '/symfony/security-bundle/DependencyInjection/SecurityExtension.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\OidcTokenHandlerFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/OidcTokenHandlerFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\OidcUserInfoTokenHandlerFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/OidcUserInfoTokenHandlerFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\ServiceTokenHandlerFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/ServiceTokenHandlerFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\TokenHandlerFactoryInterface' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/TokenHandlerFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\AbstractFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/AbstractFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\AccessTokenFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/AccessTokenFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\AuthenticatorFactoryInterface' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/AuthenticatorFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\CustomAuthenticatorFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/CustomAuthenticatorFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\FirewallListenerFactoryInterface' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/FirewallListenerFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\FormLoginFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/FormLoginFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\FormLoginLdapFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/FormLoginLdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\HttpBasicFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/HttpBasicFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\HttpBasicLdapFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/HttpBasicLdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\JsonLoginFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/JsonLoginFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\JsonLoginLdapFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/JsonLoginLdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\LdapFactoryTrait' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/LdapFactoryTrait.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\LoginLinkFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/LoginLinkFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\LoginThrottlingFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/LoginThrottlingFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\RememberMeFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/RememberMeFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\RemoteUserFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/RemoteUserFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\SignatureAlgorithmFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/SignatureAlgorithmFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\StatelessAuthenticatorFactoryInterface' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/StatelessAuthenticatorFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\X509Factory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/Factory/X509Factory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\UserProvider\\InMemoryFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/UserProvider/InMemoryFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\UserProvider\\LdapFactory' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/UserProvider/LdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\UserProvider\\UserProviderFactoryInterface' => $vendorDir . '/symfony/security-bundle/DependencyInjection/Security/UserProvider/UserProviderFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\FirewallListener' => $vendorDir . '/symfony/security-bundle/EventListener/FirewallListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\VoteListener' => $vendorDir . '/symfony/security-bundle/EventListener/VoteListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\LoginLink\\FirewallAwareLoginLinkHandler' => $vendorDir . '/symfony/security-bundle/LoginLink/FirewallAwareLoginLinkHandler.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\RememberMe\\DecoratedRememberMeHandler' => $vendorDir . '/symfony/security-bundle/RememberMe/DecoratedRememberMeHandler.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\RememberMe\\FirewallAwareRememberMeHandler' => $vendorDir . '/symfony/security-bundle/RememberMe/FirewallAwareRememberMeHandler.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Routing\\LogoutRouteLoader' => $vendorDir . '/symfony/security-bundle/Routing/LogoutRouteLoader.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security' => $vendorDir . '/symfony/security-bundle/Security.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\SecurityBundle' => $vendorDir . '/symfony/security-bundle/SecurityBundle.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallAwareTrait' => $vendorDir . '/symfony/security-bundle/Security/FirewallAwareTrait.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallConfig' => $vendorDir . '/symfony/security-bundle/Security/FirewallConfig.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallContext' => $vendorDir . '/symfony/security-bundle/Security/FirewallContext.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallMap' => $vendorDir . '/symfony/security-bundle/Security/FirewallMap.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\LazyFirewallContext' => $vendorDir . '/symfony/security-bundle/Security/LazyFirewallContext.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\UserAuthenticator' => $vendorDir . '/symfony/security-bundle/Security/UserAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => $vendorDir . '/symfony/cache/Adapter/ApcuAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/ArrayAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => $vendorDir . '/symfony/cache/Adapter/ChainAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => $vendorDir . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => $vendorDir . '/symfony/cache/Adapter/DoctrineDbalAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => $vendorDir . '/symfony/cache/Adapter/MemcachedAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\NullAdapter' => $vendorDir . '/symfony/cache/Adapter/NullAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => $vendorDir . '/symfony/cache/Adapter/ParameterNormalizer.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => $vendorDir . '/symfony/cache/Adapter/PdoAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpArrayAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => $vendorDir . '/symfony/cache/Adapter/PhpFilesAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => $vendorDir . '/symfony/cache/Adapter/ProxyAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => $vendorDir . '/symfony/cache/Adapter/Psr16Adapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/RedisTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php', '_ContaoManager\\Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => $vendorDir . '/symfony/cache/DependencyInjection/CacheCollectorPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => $vendorDir . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\Exception\\CacheException' => $vendorDir . '/symfony/cache/Exception/CacheException.php', '_ContaoManager\\Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/cache/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Cache\\Exception\\LogicException' => $vendorDir . '/symfony/cache/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Cache\\LockRegistry' => $vendorDir . '/symfony/cache/LockRegistry.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DefaultMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => $vendorDir . '/symfony/cache/Marshaller/DeflateMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => $vendorDir . '/symfony/cache/Marshaller/MarshallerInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => $vendorDir . '/symfony/cache/Marshaller/SodiumMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => $vendorDir . '/symfony/cache/Marshaller/TagAwareMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php', '_ContaoManager\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationHandler.php', '_ContaoManager\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => $vendorDir . '/symfony/cache/Messenger/EarlyExpirationMessage.php', '_ContaoManager\\Symfony\\Component\\Cache\\PruneableInterface' => $vendorDir . '/symfony/cache/PruneableInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Psr16Cache' => $vendorDir . '/symfony/cache/Psr16Cache.php', '_ContaoManager\\Symfony\\Component\\Cache\\ResettableInterface' => $vendorDir . '/symfony/cache/ResettableInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => $vendorDir . '/symfony/cache/Traits/AbstractAdapterTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\ContractsTrait' => $vendorDir . '/symfony/cache/Traits/ContractsTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemCommonTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => $vendorDir . '/symfony/cache/Traits/FilesystemTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\ProxyTrait' => $vendorDir . '/symfony/cache/Traits/ProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Redis5Proxy' => $vendorDir . '/symfony/cache/Traits/Redis5Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Redis6Proxy' => $vendorDir . '/symfony/cache/Traits/Redis6Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Redis6ProxyTrait' => $vendorDir . '/symfony/cache/Traits/Redis6ProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisCluster5Proxy' => $vendorDir . '/symfony/cache/Traits/RedisCluster5Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisCluster6Proxy' => $vendorDir . '/symfony/cache/Traits/RedisCluster6Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisCluster6ProxyTrait' => $vendorDir . '/symfony/cache/Traits/RedisCluster6ProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterNodeProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => $vendorDir . '/symfony/cache/Traits/RedisClusterProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisProxy' => $vendorDir . '/symfony/cache/Traits/RedisProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisTrait' => $vendorDir . '/symfony/cache/Traits/RedisTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RelayProxy' => $vendorDir . '/symfony/cache/Traits/RelayProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RelayProxyTrait' => $vendorDir . '/symfony/cache/Traits/RelayProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\CopyTrait' => $vendorDir . '/symfony/cache/Traits/Relay/CopyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\GeosearchTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GeosearchTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\GetrangeTrait' => $vendorDir . '/symfony/cache/Traits/Relay/GetrangeTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\HsetTrait' => $vendorDir . '/symfony/cache/Traits/Relay/HsetTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\MoveTrait' => $vendorDir . '/symfony/cache/Traits/Relay/MoveTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\NullableReturnTrait' => $vendorDir . '/symfony/cache/Traits/Relay/NullableReturnTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\PfcountTrait' => $vendorDir . '/symfony/cache/Traits/Relay/PfcountTrait.php', '_ContaoManager\\Symfony\\Component\\Clock\\Clock' => $vendorDir . '/symfony/clock/Clock.php', '_ContaoManager\\Symfony\\Component\\Clock\\ClockAwareTrait' => $vendorDir . '/symfony/clock/ClockAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Clock\\ClockInterface' => $vendorDir . '/symfony/clock/ClockInterface.php', '_ContaoManager\\Symfony\\Component\\Clock\\DatePoint' => $vendorDir . '/symfony/clock/DatePoint.php', '_ContaoManager\\Symfony\\Component\\Clock\\MockClock' => $vendorDir . '/symfony/clock/MockClock.php', '_ContaoManager\\Symfony\\Component\\Clock\\MonotonicClock' => $vendorDir . '/symfony/clock/MonotonicClock.php', '_ContaoManager\\Symfony\\Component\\Clock\\NativeClock' => $vendorDir . '/symfony/clock/NativeClock.php', '_ContaoManager\\Symfony\\Component\\Clock\\Test\\ClockSensitiveTrait' => $vendorDir . '/symfony/clock/Test/ClockSensitiveTrait.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ClassBuilder' => $vendorDir . '/symfony/config/Builder/ClassBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGenerator.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ConfigBuilderGeneratorInterface' => $vendorDir . '/symfony/config/Builder/ConfigBuilderGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ConfigBuilderInterface' => $vendorDir . '/symfony/config/Builder/ConfigBuilderInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\Method' => $vendorDir . '/symfony/config/Builder/Method.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\Property' => $vendorDir . '/symfony/config/Builder/Property.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCache' => $vendorDir . '/symfony/config/ConfigCache.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCacheFactory' => $vendorDir . '/symfony/config/ConfigCacheFactory.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => $vendorDir . '/symfony/config/ConfigCacheFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCacheInterface' => $vendorDir . '/symfony/config/ConfigCacheInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ArrayNode' => $vendorDir . '/symfony/config/Definition/ArrayNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\BaseNode' => $vendorDir . '/symfony/config/Definition/BaseNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\BooleanNode' => $vendorDir . '/symfony/config/Definition/BooleanNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => $vendorDir . '/symfony/config/Definition/Builder/BuilderAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/EnumNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ExprBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/FloatNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/MergeBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NodeBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => $vendorDir . '/symfony/config/Definition/Builder/NodeParentInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/NormalizationBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/NumericNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => $vendorDir . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => $vendorDir . '/symfony/config/Definition/Builder/TreeBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => $vendorDir . '/symfony/config/Definition/Builder/ValidationBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => $vendorDir . '/symfony/config/Definition/Builder/VariableNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ConfigurableInterface' => $vendorDir . '/symfony/config/Definition/ConfigurableInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Configuration' => $vendorDir . '/symfony/config/Definition/Configuration.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => $vendorDir . '/symfony/config/Definition/ConfigurationInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Configurator\\DefinitionConfigurator' => $vendorDir . '/symfony/config/Definition/Configurator/DefinitionConfigurator.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => $vendorDir . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\EnumNode' => $vendorDir . '/symfony/config/Definition/EnumNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => $vendorDir . '/symfony/config/Definition/Exception/DuplicateKeyException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\Exception' => $vendorDir . '/symfony/config/Definition/Exception/Exception.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => $vendorDir . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidConfigurationException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidDefinitionException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => $vendorDir . '/symfony/config/Definition/Exception/InvalidTypeException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => $vendorDir . '/symfony/config/Definition/Exception/UnsetKeyException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\FloatNode' => $vendorDir . '/symfony/config/Definition/FloatNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\IntegerNode' => $vendorDir . '/symfony/config/Definition/IntegerNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Loader\\DefinitionFileLoader' => $vendorDir . '/symfony/config/Definition/Loader/DefinitionFileLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\NodeInterface' => $vendorDir . '/symfony/config/Definition/NodeInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\NumericNode' => $vendorDir . '/symfony/config/Definition/NumericNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Processor' => $vendorDir . '/symfony/config/Definition/Processor.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => $vendorDir . '/symfony/config/Definition/PrototypeNodeInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => $vendorDir . '/symfony/config/Definition/PrototypedArrayNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ScalarNode' => $vendorDir . '/symfony/config/Definition/ScalarNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\VariableNode' => $vendorDir . '/symfony/config/Definition/VariableNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => $vendorDir . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => $vendorDir . '/symfony/config/Exception/FileLocatorFileNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Config\\Exception\\LoaderLoadException' => $vendorDir . '/symfony/config/Exception/LoaderLoadException.php', '_ContaoManager\\Symfony\\Component\\Config\\FileLocator' => $vendorDir . '/symfony/config/FileLocator.php', '_ContaoManager\\Symfony\\Component\\Config\\FileLocatorInterface' => $vendorDir . '/symfony/config/FileLocatorInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\DelegatingLoader' => $vendorDir . '/symfony/config/Loader/DelegatingLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\DirectoryAwareLoaderInterface' => $vendorDir . '/symfony/config/Loader/DirectoryAwareLoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\FileLoader' => $vendorDir . '/symfony/config/Loader/FileLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/config/Loader/GlobFileLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\Loader' => $vendorDir . '/symfony/config/Loader/Loader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderInterface' => $vendorDir . '/symfony/config/Loader/LoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderResolver' => $vendorDir . '/symfony/config/Loader/LoaderResolver.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => $vendorDir . '/symfony/config/Loader/LoaderResolverInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\ParamConfigurator' => $vendorDir . '/symfony/config/Loader/ParamConfigurator.php', '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerConfigCache' => $vendorDir . '/symfony/config/ResourceCheckerConfigCache.php', '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => $vendorDir . '/symfony/config/ResourceCheckerConfigCacheFactory.php', '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerInterface' => $vendorDir . '/symfony/config/ResourceCheckerInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ClassExistenceResource' => $vendorDir . '/symfony/config/Resource/ClassExistenceResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ComposerResource' => $vendorDir . '/symfony/config/Resource/ComposerResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\DirectoryResource' => $vendorDir . '/symfony/config/Resource/DirectoryResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\FileExistenceResource' => $vendorDir . '/symfony/config/Resource/FileExistenceResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Resource/FileResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\GlobResource' => $vendorDir . '/symfony/config/Resource/GlobResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => $vendorDir . '/symfony/config/Resource/ReflectionClassResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Resource/ResourceInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceChecker.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Util\\Exception\\InvalidXmlException' => $vendorDir . '/symfony/config/Util/Exception/InvalidXmlException.php', '_ContaoManager\\Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => $vendorDir . '/symfony/config/Util/Exception/XmlParsingException.php', '_ContaoManager\\Symfony\\Component\\Config\\Util\\XmlUtils' => $vendorDir . '/symfony/config/Util/XmlUtils.php', '_ContaoManager\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', '_ContaoManager\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', '_ContaoManager\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', '_ContaoManager\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', '_ContaoManager\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', '_ContaoManager\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', '_ContaoManager\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', '_ContaoManager\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php', '_ContaoManager\\Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php', '_ContaoManager\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', '_ContaoManager\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php', '_ContaoManager\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php', '_ContaoManager\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', '_ContaoManager\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', '_ContaoManager\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', '_ContaoManager\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php', '_ContaoManager\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', '_ContaoManager\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', '_ContaoManager\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Alias' => $vendorDir . '/symfony/dependency-injection/Alias.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\AbstractArgument' => $vendorDir . '/symfony/dependency-injection/Argument/AbstractArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => $vendorDir . '/symfony/dependency-injection/Argument/ArgumentInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => $vendorDir . '/symfony/dependency-injection/Argument/BoundArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/IteratorArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\LazyClosure' => $vendorDir . '/symfony/dependency-injection/Argument/LazyClosure.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => $vendorDir . '/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => $vendorDir . '/symfony/dependency-injection/Argument/RewindableGenerator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceClosureArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/ServiceLocatorArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => $vendorDir . '/symfony/dependency-injection/Argument/TaggedIteratorArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AsAlias' => $vendorDir . '/symfony/dependency-injection/Attribute/AsAlias.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AsDecorator' => $vendorDir . '/symfony/dependency-injection/Attribute/AsDecorator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AsTaggedItem' => $vendorDir . '/symfony/dependency-injection/Attribute/AsTaggedItem.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Autoconfigure' => $vendorDir . '/symfony/dependency-injection/Attribute/Autoconfigure.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutoconfigureTag' => $vendorDir . '/symfony/dependency-injection/Attribute/AutoconfigureTag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Autowire' => $vendorDir . '/symfony/dependency-injection/Attribute/Autowire.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireCallable' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireCallable.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireDecorated.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireIterator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireServiceClosure' => $vendorDir . '/symfony/dependency-injection/Attribute/AutowireServiceClosure.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Exclude' => $vendorDir . '/symfony/dependency-injection/Attribute/Exclude.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated' => $vendorDir . '/symfony/dependency-injection/Attribute/MapDecorated.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator' => $vendorDir . '/symfony/dependency-injection/Attribute/TaggedIterator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator' => $vendorDir . '/symfony/dependency-injection/Attribute/TaggedLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Target' => $vendorDir . '/symfony/dependency-injection/Attribute/Target.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\When' => $vendorDir . '/symfony/dependency-injection/Attribute/When.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ChildDefinition' => $vendorDir . '/symfony/dependency-injection/ChildDefinition.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AbstractRecursivePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AliasDeprecatedPublicServicesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AttributeAutoconfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowireAsDecoratorPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireAsDecoratorPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowirePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredMethodsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredPropertiesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckArgumentsValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckTypeDeclarationsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => $vendorDir . '/symfony/dependency-injection/Compiler/Compiler.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => $vendorDir . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => $vendorDir . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\DefinitionErrorExceptionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => $vendorDir . '/symfony/dependency-injection/Compiler/PassConfig.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => $vendorDir . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterAutoconfigureAttributesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterEnvVarProcessorsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterReverseContainerPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterServiceSubscribersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemoveBuildParametersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveBuildParametersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveBindingsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveBindingsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveChildDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveClassPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveClassPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDecoratorStackPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveEnvPlaceholdersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveFactoryClassPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveHotPathPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveHotPathPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInstanceofConditionalsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNamedArgumentsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNoPreloadPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveServiceSubscribersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveTaggedIteratorArgumentPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceLocatorTagPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => $vendorDir . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ValidateEnvPlaceholdersPass' => $vendorDir . '/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResource' => $vendorDir . '/symfony/dependency-injection/Config/ContainerParametersResource.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResourceChecker' => $vendorDir . '/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Container' => $vendorDir . '/symfony/dependency-injection/Container.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => $vendorDir . '/symfony/dependency-injection/ContainerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => $vendorDir . '/symfony/dependency-injection/ContainerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerBuilder' => $vendorDir . '/symfony/dependency-injection/ContainerBuilder.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => $vendorDir . '/symfony/dependency-injection/ContainerInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Definition' => $vendorDir . '/symfony/dependency-injection/Definition.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => $vendorDir . '/symfony/dependency-injection/Dumper/Dumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/Dumper/DumperInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/GraphvizDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/PhpDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\Preloader' => $vendorDir . '/symfony/dependency-injection/Dumper/Preloader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/XmlDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => $vendorDir . '/symfony/dependency-injection/Dumper/YamlDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => $vendorDir . '/symfony/dependency-injection/EnvVarLoaderInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => $vendorDir . '/symfony/dependency-injection/EnvVarProcessor.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => $vendorDir . '/symfony/dependency-injection/EnvVarProcessorInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => $vendorDir . '/symfony/dependency-injection/Exception/AutowiringFailedException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/dependency-injection/Exception/BadMethodCallException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/EnvNotFoundException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => $vendorDir . '/symfony/dependency-injection/Exception/EnvParameterException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/dependency-injection/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => $vendorDir . '/symfony/dependency-injection/Exception/InvalidParameterTypeException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => $vendorDir . '/symfony/dependency-injection/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/dependency-injection/Exception/OutOfBoundsException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/ParameterNotFoundException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => $vendorDir . '/symfony/dependency-injection/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => $vendorDir . '/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => $vendorDir . '/symfony/dependency-injection/Exception/ServiceNotFoundException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => $vendorDir . '/symfony/dependency-injection/ExpressionLanguage.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => $vendorDir . '/symfony/dependency-injection/ExpressionLanguageProvider.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\AbstractExtension' => $vendorDir . '/symfony/dependency-injection/Extension/AbstractExtension.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ConfigurableExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ConfigurableExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\Extension' => $vendorDir . '/symfony/dependency-injection/Extension/Extension.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/ExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ExtensionTrait' => $vendorDir . '/symfony/dependency-injection/Extension/ExtensionTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\PrependExtensionInterface' => $vendorDir . '/symfony/dependency-injection/Extension/PrependExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\LazyServiceInstantiator' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/LazyServiceInstantiator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\RealServiceInstantiator' => $vendorDir . '/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\DumperInterface' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\LazyServiceDumper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/LazyServiceDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\NullDumper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\ProxyHelper' => $vendorDir . '/symfony/dependency-injection/LazyProxy/ProxyHelper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\ClosureLoader' => $vendorDir . '/symfony/dependency-injection/Loader/ClosureLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AliasConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ClosureReferenceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ContainerConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\DefaultsConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\EnvConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\FromCallableConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/FromCallableConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InlineServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InstanceofConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ParametersConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\PrototypeConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ReferenceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServiceConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServicesConfigurator' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AbstractTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ArgumentTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutoconfigureTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutowireTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\BindTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\CallTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ClassTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConfiguratorTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConstructorTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ConstructorTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DecorateTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DeprecateTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FactoryTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FileTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FromCallableTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/FromCallableTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\LazyTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ParentTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PropertyTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PublicTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ShareTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\SyntheticTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\TagTrait' => $vendorDir . '/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/dependency-injection/Loader/DirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\FileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/FileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/GlobFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/IniFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/PhpFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/XmlFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/YamlFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Parameter' => $vendorDir . '/symfony/dependency-injection/Parameter.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ContainerBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => $vendorDir . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Reference' => $vendorDir . '/symfony/dependency-injection/Reference.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ReverseContainer' => $vendorDir . '/symfony/dependency-injection/ReverseContainer.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ServiceLocator' => $vendorDir . '/symfony/dependency-injection/ServiceLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => $vendorDir . '/symfony/dependency-injection/TaggedContainerInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\TypedReference' => $vendorDir . '/symfony/dependency-injection/TypedReference.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Variable' => $vendorDir . '/symfony/dependency-injection/Variable.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\BufferingLogger' => $vendorDir . '/symfony/error-handler/BufferingLogger.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Debug' => $vendorDir . '/symfony/error-handler/Debug.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\DebugClassLoader' => $vendorDir . '/symfony/error-handler/DebugClassLoader.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => $vendorDir . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorHandler' => $vendorDir . '/symfony/error-handler/ErrorHandler.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => $vendorDir . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter' => $vendorDir . '/symfony/error-handler/ErrorRenderer/FileLinkFormatter.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => $vendorDir . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => $vendorDir . '/symfony/error-handler/Error/ClassNotFoundError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\FatalError' => $vendorDir . '/symfony/error-handler/Error/FatalError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => $vendorDir . '/symfony/error-handler/Error/OutOfMemoryError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => $vendorDir . '/symfony/error-handler/Error/UndefinedFunctionError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => $vendorDir . '/symfony/error-handler/Error/UndefinedMethodError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => $vendorDir . '/symfony/error-handler/Exception/FlattenException.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => $vendorDir . '/symfony/error-handler/Exception/SilencedErrorContext.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Internal\\TentativeTypes' => $vendorDir . '/symfony/error-handler/Internal/TentativeTypes.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ThrowableUtils' => $vendorDir . '/symfony/error-handler/ThrowableUtils.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => $vendorDir . '/symfony/event-dispatcher/Attribute/AsEventListener.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/EventDispatcherInterface.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/EventSubscriberInterface.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/GenericEvent.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', '_ContaoManager\\Symfony\\Component\\Finder\\Comparator\\Comparator' => $vendorDir . '/symfony/finder/Comparator/Comparator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => $vendorDir . '/symfony/finder/Comparator/DateComparator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => $vendorDir . '/symfony/finder/Comparator/NumberComparator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/finder/Exception/AccessDeniedException.php', '_ContaoManager\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => $vendorDir . '/symfony/finder/Exception/DirectoryNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Finder\\Finder' => $vendorDir . '/symfony/finder/Finder.php', '_ContaoManager\\Symfony\\Component\\Finder\\Gitignore' => $vendorDir . '/symfony/finder/Gitignore.php', '_ContaoManager\\Symfony\\Component\\Finder\\Glob' => $vendorDir . '/symfony/finder/Glob.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => $vendorDir . '/symfony/finder/Iterator/CustomFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DateRangeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => $vendorDir . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FileTypeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilecontentFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => $vendorDir . '/symfony/finder/Iterator/FilenameFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => $vendorDir . '/symfony/finder/Iterator/LazyIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => $vendorDir . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => $vendorDir . '/symfony/finder/Iterator/PathFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => $vendorDir . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => $vendorDir . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => $vendorDir . '/symfony/finder/Iterator/SortableIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => $vendorDir . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\SplFileInfo' => $vendorDir . '/symfony/finder/SplFileInfo.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\AcceptHeader' => $vendorDir . '/symfony/http-foundation/AcceptHeader.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => $vendorDir . '/symfony/http-foundation/AcceptHeaderItem.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => $vendorDir . '/symfony/http-foundation/BinaryFileResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ChainRequestMatcher' => $vendorDir . '/symfony/http-foundation/ChainRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Cookie' => $vendorDir . '/symfony/http-foundation/Cookie.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => $vendorDir . '/symfony/http-foundation/Exception/BadRequestException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => $vendorDir . '/symfony/http-foundation/Exception/ConflictingHeadersException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => $vendorDir . '/symfony/http-foundation/Exception/JsonException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => $vendorDir . '/symfony/http-foundation/Exception/RequestExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException' => $vendorDir . '/symfony/http-foundation/Exception/SessionNotFoundException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => $vendorDir . '/symfony/http-foundation/Exception/SuspiciousOperationException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\UnexpectedValueException' => $vendorDir . '/symfony/http-foundation/Exception/UnexpectedValueException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/ExpressionRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/http-foundation/File/Exception/AccessDeniedException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/ExtensionFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/http-foundation/File/Exception/FileNotFoundException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/FormSizeFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/IniSizeFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => $vendorDir . '/symfony/http-foundation/File/Exception/PartialFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => $vendorDir . '/symfony/http-foundation/File/Exception/UploadException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\File' => $vendorDir . '/symfony/http-foundation/File/File.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Stream' => $vendorDir . '/symfony/http-foundation/File/Stream.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => $vendorDir . '/symfony/http-foundation/File/UploadedFile.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\HeaderUtils' => $vendorDir . '/symfony/http-foundation/HeaderUtils.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\InputBag' => $vendorDir . '/symfony/http-foundation/InputBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\IpUtils' => $vendorDir . '/symfony/http-foundation/IpUtils.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\JsonResponse' => $vendorDir . '/symfony/http-foundation/JsonResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => $vendorDir . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RateLimiter\\PeekableRequestRateLimiterInterface' => $vendorDir . '/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => $vendorDir . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RedirectResponse' => $vendorDir . '/symfony/http-foundation/RedirectResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => $vendorDir . '/symfony/http-foundation/RequestMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\AttributesRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\HostRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\IpsRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\IsJsonRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\MethodRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\PathRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\PortRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\SchemeRequestMatcher' => $vendorDir . '/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestStack' => $vendorDir . '/symfony/http-foundation/RequestStack.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Response' => $vendorDir . '/symfony/http-foundation/Response.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => $vendorDir . '/symfony/http-foundation/ResponseHeaderBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/ServerBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\FlashBagAwareSessionInterface' => $vendorDir . '/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => $vendorDir . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Session' => $vendorDir . '/symfony/http-foundation/Session/Session.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionBagInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => $vendorDir . '/symfony/http-foundation/Session/SessionBagProxy.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionFactory' => $vendorDir . '/symfony/http-foundation/Session/SessionFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionFactoryInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => $vendorDir . '/symfony/http-foundation/Session/SessionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => $vendorDir . '/symfony/http-foundation/Session/SessionUtils.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => $vendorDir . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => $vendorDir . '/symfony/http-foundation/Session/Storage/MetadataBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorageFactory' => $vendorDir . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => $vendorDir . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\StreamedJsonResponse' => $vendorDir . '/symfony/http-foundation/StreamedJsonResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseFormatSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderLocationSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsUnprocessable' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\UriSigner' => $vendorDir . '/symfony/http-foundation/UriSigner.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\UrlHelper' => $vendorDir . '/symfony/http-foundation/UrlHelper.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\AsController' => $vendorDir . '/symfony/http-kernel/Attribute/AsController.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\AsTargetedValueResolver' => $vendorDir . '/symfony/http-kernel/Attribute/AsTargetedValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\Cache' => $vendorDir . '/symfony/http-kernel/Attribute/Cache.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapDateTime' => $vendorDir . '/symfony/http-kernel/Attribute/MapDateTime.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapQueryParameter' => $vendorDir . '/symfony/http-kernel/Attribute/MapQueryParameter.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapQueryString' => $vendorDir . '/symfony/http-kernel/Attribute/MapQueryString.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapRequestPayload' => $vendorDir . '/symfony/http-kernel/Attribute/MapRequestPayload.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\ValueResolver' => $vendorDir . '/symfony/http-kernel/Attribute/ValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\WithHttpStatus' => $vendorDir . '/symfony/http-kernel/Attribute/WithHttpStatus.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\WithLogLevel' => $vendorDir . '/symfony/http-kernel/Attribute/WithLogLevel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\AbstractBundle' => $vendorDir . '/symfony/http-kernel/Bundle/AbstractBundle.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => $vendorDir . '/symfony/http-kernel/Bundle/Bundle.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\BundleExtension' => $vendorDir . '/symfony/http-kernel/Bundle/BundleExtension.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => $vendorDir . '/symfony/http-kernel/Bundle/BundleInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => $vendorDir . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer' => $vendorDir . '/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => $vendorDir . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Config\\FileLocator' => $vendorDir . '/symfony/http-kernel/Config/FileLocator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactoryInterface' => $vendorDir . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/BackedEnumValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/QueryParameterValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/UidValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ContainerControllerResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => $vendorDir . '/symfony/http-kernel/Controller/ControllerReference.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ControllerResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => $vendorDir . '/symfony/http-kernel/Controller/ErrorController.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => $vendorDir . '/symfony/http-kernel/Controller/TraceableControllerResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface' => $vendorDir . '/symfony/http-kernel/Controller/ValueResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/DumpDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/EventDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => $vendorDir . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RequestDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/RouterDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => $vendorDir . '/symfony/http-kernel/DataCollector/TimeDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\ErrorHandlerConfigurator' => $vendorDir . '/symfony/http-kernel/Debug/ErrorHandlerConfigurator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => $vendorDir . '/symfony/http-kernel/Debug/FileLinkFormatter.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\VirtualRequestStack' => $vendorDir . '/symfony/http-kernel/Debug/VirtualRequestStack.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => $vendorDir . '/symfony/http-kernel/DependencyInjection/Extension.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/LoggerPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => $vendorDir . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/AbstractSessionListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => $vendorDir . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener' => $vendorDir . '/symfony/http-kernel/EventListener/CacheAttributeListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => $vendorDir . '/symfony/http-kernel/EventListener/DebugHandlersListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => $vendorDir . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => $vendorDir . '/symfony/http-kernel/EventListener/DumpListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => $vendorDir . '/symfony/http-kernel/EventListener/ErrorListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => $vendorDir . '/symfony/http-kernel/EventListener/FragmentListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleAwareListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => $vendorDir . '/symfony/http-kernel/EventListener/LocaleListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => $vendorDir . '/symfony/http-kernel/EventListener/ProfilerListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/ResponseListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => $vendorDir . '/symfony/http-kernel/EventListener/RouterListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => $vendorDir . '/symfony/http-kernel/EventListener/SessionListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => $vendorDir . '/symfony/http-kernel/EventListener/StreamedResponseListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => $vendorDir . '/symfony/http-kernel/EventListener/SurrogateListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => $vendorDir . '/symfony/http-kernel/EventListener/ValidateRequestListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => $vendorDir . '/symfony/http-kernel/Event/ControllerEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => $vendorDir . '/symfony/http-kernel/Event/ExceptionEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => $vendorDir . '/symfony/http-kernel/Event/FinishRequestEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => $vendorDir . '/symfony/http-kernel/Event/KernelEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => $vendorDir . '/symfony/http-kernel/Event/RequestEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => $vendorDir . '/symfony/http-kernel/Event/ResponseEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => $vendorDir . '/symfony/http-kernel/Event/TerminateEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => $vendorDir . '/symfony/http-kernel/Event/ViewEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => $vendorDir . '/symfony/http-kernel/Exception/BadRequestHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ConflictHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => $vendorDir . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => $vendorDir . '/symfony/http-kernel/Exception/GoneHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\HttpException' => $vendorDir . '/symfony/http-kernel/Exception/HttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => $vendorDir . '/symfony/http-kernel/Exception/HttpExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\InvalidMetadataException' => $vendorDir . '/symfony/http-kernel/Exception/InvalidMetadataException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\LockedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/LockedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => $vendorDir . '/symfony/http-kernel/Exception/NotFoundHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => $vendorDir . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ResolverNotFoundException' => $vendorDir . '/symfony/http-kernel/Exception/ResolverNotFoundException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => $vendorDir . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => $vendorDir . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => $vendorDir . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => $vendorDir . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentHandler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGenerator' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentUriGenerator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => $vendorDir . '/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => $vendorDir . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\AbstractSurrogate' => $vendorDir . '/symfony/http-kernel/HttpCache/AbstractSurrogate.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => $vendorDir . '/symfony/http-kernel/HttpCache/Esi.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => $vendorDir . '/symfony/http-kernel/HttpCache/HttpCache.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => $vendorDir . '/symfony/http-kernel/HttpCache/Ssi.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\Store' => $vendorDir . '/symfony/http-kernel/HttpCache/Store.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/StoreInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => $vendorDir . '/symfony/http-kernel/HttpCache/SubRequestHandler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => $vendorDir . '/symfony/http-kernel/HttpCache/SurrogateInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpClientKernel' => $vendorDir . '/symfony/http-kernel/HttpClientKernel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/HttpKernel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => $vendorDir . '/symfony/http-kernel/HttpKernelBrowser.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/HttpKernelInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Kernel' => $vendorDir . '/symfony/http-kernel/Kernel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\KernelEvents' => $vendorDir . '/symfony/http-kernel/KernelEvents.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\KernelInterface' => $vendorDir . '/symfony/http-kernel/KernelInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Log\\DebugLoggerConfigurator' => $vendorDir . '/symfony/http-kernel/Log/DebugLoggerConfigurator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => $vendorDir . '/symfony/http-kernel/Log/DebugLoggerInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Log\\Logger' => $vendorDir . '/symfony/http-kernel/Log/Logger.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => $vendorDir . '/symfony/http-kernel/Profiler/FileProfilerStorage.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\Profile' => $vendorDir . '/symfony/http-kernel/Profiler/Profile.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => $vendorDir . '/symfony/http-kernel/Profiler/Profiler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => $vendorDir . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\RebootableInterface' => $vendorDir . '/symfony/http-kernel/RebootableInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/TerminableInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\UriSigner' => $vendorDir . '/symfony/http-kernel/UriSigner.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Command\\UserPasswordHashCommand' => $vendorDir . '/symfony/password-hasher/Command/UserPasswordHashCommand.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/password-hasher/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Exception\\InvalidPasswordException' => $vendorDir . '/symfony/password-hasher/Exception/InvalidPasswordException.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Exception\\LogicException' => $vendorDir . '/symfony/password-hasher/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\CheckPasswordLengthTrait' => $vendorDir . '/symfony/password-hasher/Hasher/CheckPasswordLengthTrait.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\MessageDigestPasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/MessageDigestPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\MigratingPasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/MigratingPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\NativePasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/NativePasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherAwareInterface' => $vendorDir . '/symfony/password-hasher/Hasher/PasswordHasherAwareInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactory' => $vendorDir . '/symfony/password-hasher/Hasher/PasswordHasherFactory.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactoryInterface' => $vendorDir . '/symfony/password-hasher/Hasher/PasswordHasherFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\Pbkdf2PasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/Pbkdf2PasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PlaintextPasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/PlaintextPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\SodiumPasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/SodiumPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasher' => $vendorDir . '/symfony/password-hasher/Hasher/UserPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasherInterface' => $vendorDir . '/symfony/password-hasher/Hasher/UserPasswordHasherInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\LegacyPasswordHasherInterface' => $vendorDir . '/symfony/password-hasher/LegacyPasswordHasherInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\PasswordHasherInterface' => $vendorDir . '/symfony/password-hasher/PasswordHasherInterface.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/process/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/process/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\LogicException' => $vendorDir . '/symfony/process/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => $vendorDir . '/symfony/process/Exception/ProcessFailedException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => $vendorDir . '/symfony/process/Exception/ProcessSignaledException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => $vendorDir . '/symfony/process/Exception/ProcessTimedOutException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => $vendorDir . '/symfony/process/Exception/RunProcessFailedException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\RuntimeException' => $vendorDir . '/symfony/process/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Process\\ExecutableFinder' => $vendorDir . '/symfony/process/ExecutableFinder.php', '_ContaoManager\\Symfony\\Component\\Process\\InputStream' => $vendorDir . '/symfony/process/InputStream.php', '_ContaoManager\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => $vendorDir . '/symfony/process/Messenger/RunProcessContext.php', '_ContaoManager\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => $vendorDir . '/symfony/process/Messenger/RunProcessMessage.php', '_ContaoManager\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => $vendorDir . '/symfony/process/Messenger/RunProcessMessageHandler.php', '_ContaoManager\\Symfony\\Component\\Process\\PhpExecutableFinder' => $vendorDir . '/symfony/process/PhpExecutableFinder.php', '_ContaoManager\\Symfony\\Component\\Process\\PhpProcess' => $vendorDir . '/symfony/process/PhpProcess.php', '_ContaoManager\\Symfony\\Component\\Process\\PhpSubprocess' => $vendorDir . '/symfony/process/PhpSubprocess.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => $vendorDir . '/symfony/process/Pipes/AbstractPipes.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => $vendorDir . '/symfony/process/Pipes/PipesInterface.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => $vendorDir . '/symfony/process/Pipes/UnixPipes.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => $vendorDir . '/symfony/process/Pipes/WindowsPipes.php', '_ContaoManager\\Symfony\\Component\\Process\\Process' => $vendorDir . '/symfony/process/Process.php', '_ContaoManager\\Symfony\\Component\\Process\\ProcessUtils' => $vendorDir . '/symfony/process/ProcessUtils.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => $vendorDir . '/symfony/property-access/Exception/AccessException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/property-access/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/property-access/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\InvalidPropertyPathException' => $vendorDir . '/symfony/property-access/Exception/InvalidPropertyPathException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\NoSuchIndexException' => $vendorDir . '/symfony/property-access/Exception/NoSuchIndexException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\NoSuchPropertyException' => $vendorDir . '/symfony/property-access/Exception/NoSuchPropertyException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => $vendorDir . '/symfony/property-access/Exception/OutOfBoundsException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => $vendorDir . '/symfony/property-access/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => $vendorDir . '/symfony/property-access/Exception/UnexpectedTypeException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\UninitializedPropertyException' => $vendorDir . '/symfony/property-access/Exception/UninitializedPropertyException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccess' => $vendorDir . '/symfony/property-access/PropertyAccess.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessor' => $vendorDir . '/symfony/property-access/PropertyAccessor.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => $vendorDir . '/symfony/property-access/PropertyAccessorBuilder.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessorInterface' => $vendorDir . '/symfony/property-access/PropertyAccessorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPath' => $vendorDir . '/symfony/property-access/PropertyPath.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathBuilder' => $vendorDir . '/symfony/property-access/PropertyPathBuilder.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => $vendorDir . '/symfony/property-access/PropertyPathInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => $vendorDir . '/symfony/property-access/PropertyPathIterator.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => $vendorDir . '/symfony/property-access/PropertyPathIteratorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => $vendorDir . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => $vendorDir . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorExtractor' => $vendorDir . '/symfony/property-info/Extractor/ConstructorExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\PhpDocExtractor' => $vendorDir . '/symfony/property-info/Extractor/PhpDocExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\PhpStanExtractor' => $vendorDir . '/symfony/property-info/Extractor/PhpStanExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ReflectionExtractor' => $vendorDir . '/symfony/property-info/Extractor/ReflectionExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\SerializerExtractor' => $vendorDir . '/symfony/property-info/Extractor/SerializerExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PhpStan\\NameScope' => $vendorDir . '/symfony/property-info/PhpStan/NameScope.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PhpStan\\NameScopeFactory' => $vendorDir . '/symfony/property-info/PhpStan/NameScopeFactory.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyAccessExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyDescriptionExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyDescriptionExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoCacheExtractor' => $vendorDir . '/symfony/property-info/PropertyInfoCacheExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoExtractor' => $vendorDir . '/symfony/property-info/PropertyInfoExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyInfoExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInitializableExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyInitializableExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyListExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyReadInfo' => $vendorDir . '/symfony/property-info/PropertyReadInfo.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyReadInfoExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyReadInfoExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyTypeExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyWriteInfo' => $vendorDir . '/symfony/property-info/PropertyWriteInfo.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyWriteInfoExtractorInterface' => $vendorDir . '/symfony/property-info/PropertyWriteInfoExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Type' => $vendorDir . '/symfony/property-info/Type.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Util\\PhpDocTypeHelper' => $vendorDir . '/symfony/property-info/Util/PhpDocTypeHelper.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Util\\PhpStanTypeHelper' => $vendorDir . '/symfony/property-info/Util/PhpStanTypeHelper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Alias' => $vendorDir . '/symfony/routing/Alias.php', '_ContaoManager\\Symfony\\Component\\Routing\\Annotation\\Route' => $vendorDir . '/symfony/routing/Annotation/Route.php', '_ContaoManager\\Symfony\\Component\\Routing\\Attribute\\Route' => $vendorDir . '/symfony/routing/Attribute/Route.php', '_ContaoManager\\Symfony\\Component\\Routing\\CompiledRoute' => $vendorDir . '/symfony/routing/CompiledRoute.php', '_ContaoManager\\Symfony\\Component\\Routing\\DependencyInjection\\AddExpressionLanguageProvidersPass' => $vendorDir . '/symfony/routing/DependencyInjection/AddExpressionLanguageProvidersPass.php', '_ContaoManager\\Symfony\\Component\\Routing\\DependencyInjection\\RoutingResolverPass' => $vendorDir . '/symfony/routing/DependencyInjection/RoutingResolverPass.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/routing/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/routing/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => $vendorDir . '/symfony/routing/Exception/InvalidParameterException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => $vendorDir . '/symfony/routing/Exception/MethodNotAllowedException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => $vendorDir . '/symfony/routing/Exception/MissingMandatoryParametersException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\NoConfigurationException' => $vendorDir . '/symfony/routing/Exception/NoConfigurationException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => $vendorDir . '/symfony/routing/Exception/ResourceNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\RouteCircularReferenceException' => $vendorDir . '/symfony/routing/Exception/RouteCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => $vendorDir . '/symfony/routing/Exception/RouteNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\RuntimeException' => $vendorDir . '/symfony/routing/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator' => $vendorDir . '/symfony/routing/Generator/CompiledUrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => $vendorDir . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => $vendorDir . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\UrlGenerator' => $vendorDir . '/symfony/routing/Generator/UrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => $vendorDir . '/symfony/routing/Generator/UrlGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationClassLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationDirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => $vendorDir . '/symfony/routing/Loader/AnnotationFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeClassLoader' => $vendorDir . '/symfony/routing/Loader/AttributeClassLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeDirectoryLoader' => $vendorDir . '/symfony/routing/Loader/AttributeDirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeFileLoader' => $vendorDir . '/symfony/routing/Loader/AttributeFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ClosureLoader' => $vendorDir . '/symfony/routing/Loader/ClosureLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\AliasConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/AliasConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\CollectionConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/CollectionConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\ImportConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/ImportConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\RouteConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/RouteConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator' => $vendorDir . '/symfony/routing/Loader/Configurator/RoutingConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\AddTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/AddTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\HostTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/HostTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\LocalizedRouteTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\PrefixTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\RouteTrait' => $vendorDir . '/symfony/routing/Loader/Configurator/Traits/RouteTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ContainerLoader' => $vendorDir . '/symfony/routing/Loader/ContainerLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => $vendorDir . '/symfony/routing/Loader/DirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/routing/Loader/GlobFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ObjectLoader' => $vendorDir . '/symfony/routing/Loader/ObjectLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/routing/Loader/PhpFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Psr4DirectoryLoader' => $vendorDir . '/symfony/routing/Loader/Psr4DirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/routing/Loader/XmlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/routing/Loader/YamlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\CompiledUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/CompiledUrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait' => $vendorDir . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => $vendorDir . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\ExpressionLanguageProvider' => $vendorDir . '/symfony/routing/Matcher/ExpressionLanguageProvider.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/RequestMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\TraceableUrlMatcher' => $vendorDir . '/symfony/routing/Matcher/TraceableUrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\UrlMatcher' => $vendorDir . '/symfony/routing/Matcher/UrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => $vendorDir . '/symfony/routing/Matcher/UrlMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\RequestContext' => $vendorDir . '/symfony/routing/RequestContext.php', '_ContaoManager\\Symfony\\Component\\Routing\\RequestContextAwareInterface' => $vendorDir . '/symfony/routing/RequestContextAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Requirement\\EnumRequirement' => $vendorDir . '/symfony/routing/Requirement/EnumRequirement.php', '_ContaoManager\\Symfony\\Component\\Routing\\Requirement\\Requirement' => $vendorDir . '/symfony/routing/Requirement/Requirement.php', '_ContaoManager\\Symfony\\Component\\Routing\\Route' => $vendorDir . '/symfony/routing/Route.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouteCollection' => $vendorDir . '/symfony/routing/RouteCollection.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouteCompiler' => $vendorDir . '/symfony/routing/RouteCompiler.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouteCompilerInterface' => $vendorDir . '/symfony/routing/RouteCompilerInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Router' => $vendorDir . '/symfony/routing/Router.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouterInterface' => $vendorDir . '/symfony/routing/RouterInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\AuthenticationEvents' => $vendorDir . '/symfony/security-core/AuthenticationEvents.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolver' => $vendorDir . '/symfony/security-core/Authentication/AuthenticationTrustResolver.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolverInterface' => $vendorDir . '/symfony/security-core/Authentication/AuthenticationTrustResolverInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\CacheTokenVerifier' => $vendorDir . '/symfony/security-core/Authentication/RememberMe/CacheTokenVerifier.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\InMemoryTokenProvider' => $vendorDir . '/symfony/security-core/Authentication/RememberMe/InMemoryTokenProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentToken' => $vendorDir . '/symfony/security-core/Authentication/RememberMe/PersistentToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentTokenInterface' => $vendorDir . '/symfony/security-core/Authentication/RememberMe/PersistentTokenInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\TokenProviderInterface' => $vendorDir . '/symfony/security-core/Authentication/RememberMe/TokenProviderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\TokenVerifierInterface' => $vendorDir . '/symfony/security-core/Authentication/RememberMe/TokenVerifierInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\AbstractToken' => $vendorDir . '/symfony/security-core/Authentication/Token/AbstractToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\NullToken' => $vendorDir . '/symfony/security-core/Authentication/Token/NullToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken' => $vendorDir . '/symfony/security-core/Authentication/Token/PreAuthenticatedToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken' => $vendorDir . '/symfony/security-core/Authentication/Token/RememberMeToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorage' => $vendorDir . '/symfony/security-core/Authentication/Token/Storage/TokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface' => $vendorDir . '/symfony/security-core/Authentication/Token/Storage/TokenStorageInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\UsageTrackingTokenStorage' => $vendorDir . '/symfony/security-core/Authentication/Token/Storage/UsageTrackingTokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\SwitchUserToken' => $vendorDir . '/symfony/security-core/Authentication/Token/SwitchUserToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\TokenInterface' => $vendorDir . '/symfony/security-core/Authentication/Token/TokenInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken' => $vendorDir . '/symfony/security-core/Authentication/Token/UsernamePasswordToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManager' => $vendorDir . '/symfony/security-core/Authorization/AccessDecisionManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManagerInterface' => $vendorDir . '/symfony/security-core/Authorization/AccessDecisionManagerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationChecker' => $vendorDir . '/symfony/security-core/Authorization/AuthorizationChecker.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationCheckerInterface' => $vendorDir . '/symfony/security-core/Authorization/AuthorizationCheckerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\ExpressionLanguage' => $vendorDir . '/symfony/security-core/Authorization/ExpressionLanguage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\ExpressionLanguageProvider' => $vendorDir . '/symfony/security-core/Authorization/ExpressionLanguageProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\AccessDecisionStrategyInterface' => $vendorDir . '/symfony/security-core/Authorization/Strategy/AccessDecisionStrategyInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\AffirmativeStrategy' => $vendorDir . '/symfony/security-core/Authorization/Strategy/AffirmativeStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\ConsensusStrategy' => $vendorDir . '/symfony/security-core/Authorization/Strategy/ConsensusStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\PriorityStrategy' => $vendorDir . '/symfony/security-core/Authorization/Strategy/PriorityStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\UnanimousStrategy' => $vendorDir . '/symfony/security-core/Authorization/Strategy/UnanimousStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\TraceableAccessDecisionManager' => $vendorDir . '/symfony/security-core/Authorization/TraceableAccessDecisionManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter' => $vendorDir . '/symfony/security-core/Authorization/Voter/AuthenticatedVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\CacheableVoterInterface' => $vendorDir . '/symfony/security-core/Authorization/Voter/CacheableVoterInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\ExpressionVoter' => $vendorDir . '/symfony/security-core/Authorization/Voter/ExpressionVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\RoleHierarchyVoter' => $vendorDir . '/symfony/security-core/Authorization/Voter/RoleHierarchyVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\RoleVoter' => $vendorDir . '/symfony/security-core/Authorization/Voter/RoleVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\TraceableVoter' => $vendorDir . '/symfony/security-core/Authorization/Voter/TraceableVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\Voter' => $vendorDir . '/symfony/security-core/Authorization/Voter/Voter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface' => $vendorDir . '/symfony/security-core/Authorization/Voter/VoterInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\AuthenticationEvent' => $vendorDir . '/symfony/security-core/Event/AuthenticationEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\AuthenticationSuccessEvent' => $vendorDir . '/symfony/security-core/Event/AuthenticationSuccessEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\VoteEvent' => $vendorDir . '/symfony/security-core/Event/VoteEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AccessDeniedException' => $vendorDir . '/symfony/security-core/Exception/AccessDeniedException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AccountExpiredException' => $vendorDir . '/symfony/security-core/Exception/AccountExpiredException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AccountStatusException' => $vendorDir . '/symfony/security-core/Exception/AccountStatusException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException' => $vendorDir . '/symfony/security-core/Exception/AuthenticationCredentialsNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException' => $vendorDir . '/symfony/security-core/Exception/AuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationExpiredException' => $vendorDir . '/symfony/security-core/Exception/AuthenticationExpiredException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationServiceException' => $vendorDir . '/symfony/security-core/Exception/AuthenticationServiceException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException' => $vendorDir . '/symfony/security-core/Exception/BadCredentialsException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CookieTheftException' => $vendorDir . '/symfony/security-core/Exception/CookieTheftException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CredentialsExpiredException' => $vendorDir . '/symfony/security-core/Exception/CredentialsExpiredException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CustomUserMessageAccountStatusException' => $vendorDir . '/symfony/security-core/Exception/CustomUserMessageAccountStatusException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CustomUserMessageAuthenticationException' => $vendorDir . '/symfony/security-core/Exception/CustomUserMessageAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\DisabledException' => $vendorDir . '/symfony/security-core/Exception/DisabledException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/security-core/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\InsufficientAuthenticationException' => $vendorDir . '/symfony/security-core/Exception/InsufficientAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/security-core/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\InvalidCsrfTokenException' => $vendorDir . '/symfony/security-core/Exception/InvalidCsrfTokenException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LazyResponseException' => $vendorDir . '/symfony/security-core/Exception/LazyResponseException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LockedException' => $vendorDir . '/symfony/security-core/Exception/LockedException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LogicException' => $vendorDir . '/symfony/security-core/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LogoutException' => $vendorDir . '/symfony/security-core/Exception/LogoutException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\ProviderNotFoundException' => $vendorDir . '/symfony/security-core/Exception/ProviderNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\RuntimeException' => $vendorDir . '/symfony/security-core/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\SessionUnavailableException' => $vendorDir . '/symfony/security-core/Exception/SessionUnavailableException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\TokenNotFoundException' => $vendorDir . '/symfony/security-core/Exception/TokenNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\TooManyLoginAttemptsAuthenticationException' => $vendorDir . '/symfony/security-core/Exception/TooManyLoginAttemptsAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\UnsupportedUserException' => $vendorDir . '/symfony/security-core/Exception/UnsupportedUserException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\UserNotFoundException' => $vendorDir . '/symfony/security-core/Exception/UserNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\Role' => $vendorDir . '/symfony/security-core/Role/Role.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\RoleHierarchy' => $vendorDir . '/symfony/security-core/Role/RoleHierarchy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\RoleHierarchyInterface' => $vendorDir . '/symfony/security-core/Role/RoleHierarchyInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\SwitchUserRole' => $vendorDir . '/symfony/security-core/Role/SwitchUserRole.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Security' => $vendorDir . '/symfony/security-core/Security.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\Exception\\ExpiredSignatureException' => $vendorDir . '/symfony/security-core/Signature/Exception/ExpiredSignatureException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\Exception\\InvalidSignatureException' => $vendorDir . '/symfony/security-core/Signature/Exception/InvalidSignatureException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\ExpiredSignatureStorage' => $vendorDir . '/symfony/security-core/Signature/ExpiredSignatureStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\SignatureHasher' => $vendorDir . '/symfony/security-core/Signature/SignatureHasher.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Test\\AccessDecisionStrategyTestCase' => $vendorDir . '/symfony/security-core/Test/AccessDecisionStrategyTestCase.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\AttributesBasedUserProviderInterface' => $vendorDir . '/symfony/security-core/User/AttributesBasedUserProviderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\ChainUserChecker' => $vendorDir . '/symfony/security-core/User/ChainUserChecker.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\ChainUserProvider' => $vendorDir . '/symfony/security-core/User/ChainUserProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\EquatableInterface' => $vendorDir . '/symfony/security-core/User/EquatableInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUser' => $vendorDir . '/symfony/security-core/User/InMemoryUser.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUserChecker' => $vendorDir . '/symfony/security-core/User/InMemoryUserChecker.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUserProvider' => $vendorDir . '/symfony/security-core/User/InMemoryUserProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\LegacyPasswordAuthenticatedUserInterface' => $vendorDir . '/symfony/security-core/User/LegacyPasswordAuthenticatedUserInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\MissingUserProvider' => $vendorDir . '/symfony/security-core/User/MissingUserProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\OidcUser' => $vendorDir . '/symfony/security-core/User/OidcUser.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\PasswordAuthenticatedUserInterface' => $vendorDir . '/symfony/security-core/User/PasswordAuthenticatedUserInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\PasswordUpgraderInterface' => $vendorDir . '/symfony/security-core/User/PasswordUpgraderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface' => $vendorDir . '/symfony/security-core/User/UserCheckerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserInterface' => $vendorDir . '/symfony/security-core/User/UserInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserProviderInterface' => $vendorDir . '/symfony/security-core/User/UserProviderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Validator\\Constraints\\UserPassword' => $vendorDir . '/symfony/security-core/Validator/Constraints/UserPassword.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Validator\\Constraints\\UserPasswordValidator' => $vendorDir . '/symfony/security-core/Validator/Constraints/UserPasswordValidator.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\CsrfToken' => $vendorDir . '/symfony/security-csrf/CsrfToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\CsrfTokenManager' => $vendorDir . '/symfony/security-csrf/CsrfTokenManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\CsrfTokenManagerInterface' => $vendorDir . '/symfony/security-csrf/CsrfTokenManagerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\Exception\\TokenNotFoundException' => $vendorDir . '/symfony/security-csrf/Exception/TokenNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenGenerator\\TokenGeneratorInterface' => $vendorDir . '/symfony/security-csrf/TokenGenerator/TokenGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenGenerator\\UriSafeTokenGenerator' => $vendorDir . '/symfony/security-csrf/TokenGenerator/UriSafeTokenGenerator.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\ClearableTokenStorageInterface' => $vendorDir . '/symfony/security-csrf/TokenStorage/ClearableTokenStorageInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\NativeSessionTokenStorage' => $vendorDir . '/symfony/security-csrf/TokenStorage/NativeSessionTokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\SessionTokenStorage' => $vendorDir . '/symfony/security-csrf/TokenStorage/SessionTokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\TokenStorageInterface' => $vendorDir . '/symfony/security-csrf/TokenStorage/TokenStorageInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessMap' => $vendorDir . '/symfony/security-http/AccessMap.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessMapInterface' => $vendorDir . '/symfony/security-http/AccessMapInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\AccessTokenExtractorInterface' => $vendorDir . '/symfony/security-http/AccessToken/AccessTokenExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\AccessTokenHandlerInterface' => $vendorDir . '/symfony/security-http/AccessToken/AccessTokenHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\ChainAccessTokenExtractor' => $vendorDir . '/symfony/security-http/AccessToken/ChainAccessTokenExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\FormEncodedBodyExtractor' => $vendorDir . '/symfony/security-http/AccessToken/FormEncodedBodyExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\HeaderAccessTokenExtractor' => $vendorDir . '/symfony/security-http/AccessToken/HeaderAccessTokenExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\Exception\\InvalidSignatureException' => $vendorDir . '/symfony/security-http/AccessToken/Oidc/Exception/InvalidSignatureException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\Exception\\MissingClaimException' => $vendorDir . '/symfony/security-http/AccessToken/Oidc/Exception/MissingClaimException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\OidcTokenHandler' => $vendorDir . '/symfony/security-http/AccessToken/Oidc/OidcTokenHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\OidcTrait' => $vendorDir . '/symfony/security-http/AccessToken/Oidc/OidcTrait.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\OidcUserInfoTokenHandler' => $vendorDir . '/symfony/security-http/AccessToken/Oidc/OidcUserInfoTokenHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\QueryAccessTokenExtractor' => $vendorDir . '/symfony/security-http/AccessToken/QueryAccessTokenExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Attribute\\CurrentUser' => $vendorDir . '/symfony/security-http/Attribute/CurrentUser.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Attribute\\IsGranted' => $vendorDir . '/symfony/security-http/Attribute/IsGranted.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationFailureHandlerInterface' => $vendorDir . '/symfony/security-http/Authentication/AuthenticationFailureHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationSuccessHandlerInterface' => $vendorDir . '/symfony/security-http/Authentication/AuthenticationSuccessHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationUtils' => $vendorDir . '/symfony/security-http/Authentication/AuthenticationUtils.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticatorManager' => $vendorDir . '/symfony/security-http/Authentication/AuthenticatorManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticatorManagerInterface' => $vendorDir . '/symfony/security-http/Authentication/AuthenticatorManagerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\CustomAuthenticationFailureHandler' => $vendorDir . '/symfony/security-http/Authentication/CustomAuthenticationFailureHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\CustomAuthenticationSuccessHandler' => $vendorDir . '/symfony/security-http/Authentication/CustomAuthenticationSuccessHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationFailureHandler' => $vendorDir . '/symfony/security-http/Authentication/DefaultAuthenticationFailureHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationSuccessHandler' => $vendorDir . '/symfony/security-http/Authentication/DefaultAuthenticationSuccessHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\UserAuthenticatorInterface' => $vendorDir . '/symfony/security-http/Authentication/UserAuthenticatorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AbstractAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/AbstractAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AbstractLoginFormAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/AbstractLoginFormAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AbstractPreAuthenticatedAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/AbstractPreAuthenticatedAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AccessTokenAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/AccessTokenAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AuthenticatorInterface' => $vendorDir . '/symfony/security-http/Authenticator/AuthenticatorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Debug\\TraceableAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/Debug/TraceableAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Debug\\TraceableAuthenticatorManagerListener' => $vendorDir . '/symfony/security-http/Authenticator/Debug/TraceableAuthenticatorManagerListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\FallbackUserLoader' => $vendorDir . '/symfony/security-http/Authenticator/FallbackUserLoader.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\FormLoginAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/FormLoginAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\HttpBasicAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/HttpBasicAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\InteractiveAuthenticatorInterface' => $vendorDir . '/symfony/security-http/Authenticator/InteractiveAuthenticatorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\JsonLoginAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/JsonLoginAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\LoginLinkAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/LoginLinkAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\BadgeInterface' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Badge/BadgeInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\CsrfTokenBadge' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Badge/CsrfTokenBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\PasswordUpgradeBadge' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Badge/PasswordUpgradeBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\PreAuthenticatedUserBadge' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Badge/PreAuthenticatedUserBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\RememberMeBadge' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Badge/RememberMeBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\UserBadge' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Badge/UserBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Credentials\\CredentialsInterface' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Credentials/CredentialsInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Credentials\\CustomCredentials' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Credentials/CustomCredentials.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Credentials\\PasswordCredentials' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Credentials/PasswordCredentials.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Passport' => $vendorDir . '/symfony/security-http/Authenticator/Passport/Passport.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\SelfValidatingPassport' => $vendorDir . '/symfony/security-http/Authenticator/Passport/SelfValidatingPassport.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\RememberMeAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/RememberMeAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\RemoteUserAuthenticator' => $vendorDir . '/symfony/security-http/Authenticator/RemoteUserAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Token\\PostAuthenticationToken' => $vendorDir . '/symfony/security-http/Authenticator/Token/PostAuthenticationToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\X509Authenticator' => $vendorDir . '/symfony/security-http/Authenticator/X509Authenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authorization\\AccessDeniedHandlerInterface' => $vendorDir . '/symfony/security-http/Authorization/AccessDeniedHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver' => $vendorDir . '/symfony/security-http/Controller/SecurityTokenValueResolver.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver' => $vendorDir . '/symfony/security-http/Controller/UserValueResolver.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EntryPoint\\AuthenticationEntryPointInterface' => $vendorDir . '/symfony/security-http/EntryPoint/AuthenticationEntryPointInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EntryPoint\\Exception\\NotAnEntryPointException' => $vendorDir . '/symfony/security-http/EntryPoint/Exception/NotAnEntryPointException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckCredentialsListener' => $vendorDir . '/symfony/security-http/EventListener/CheckCredentialsListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckRememberMeConditionsListener' => $vendorDir . '/symfony/security-http/EventListener/CheckRememberMeConditionsListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\ClearSiteDataLogoutListener' => $vendorDir . '/symfony/security-http/EventListener/ClearSiteDataLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CookieClearingLogoutListener' => $vendorDir . '/symfony/security-http/EventListener/CookieClearingLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CsrfProtectionListener' => $vendorDir . '/symfony/security-http/EventListener/CsrfProtectionListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CsrfTokenClearingLogoutListener' => $vendorDir . '/symfony/security-http/EventListener/CsrfTokenClearingLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\DefaultLogoutListener' => $vendorDir . '/symfony/security-http/EventListener/DefaultLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\IsGrantedAttributeListener' => $vendorDir . '/symfony/security-http/EventListener/IsGrantedAttributeListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\LoginThrottlingListener' => $vendorDir . '/symfony/security-http/EventListener/LoginThrottlingListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\PasswordMigratingListener' => $vendorDir . '/symfony/security-http/EventListener/PasswordMigratingListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\RememberMeListener' => $vendorDir . '/symfony/security-http/EventListener/RememberMeListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\SessionLogoutListener' => $vendorDir . '/symfony/security-http/EventListener/SessionLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\SessionStrategyListener' => $vendorDir . '/symfony/security-http/EventListener/SessionStrategyListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserCheckerListener' => $vendorDir . '/symfony/security-http/EventListener/UserCheckerListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserProviderListener' => $vendorDir . '/symfony/security-http/EventListener/UserProviderListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\AuthenticationTokenCreatedEvent' => $vendorDir . '/symfony/security-http/Event/AuthenticationTokenCreatedEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent' => $vendorDir . '/symfony/security-http/Event/CheckPassportEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\InteractiveLoginEvent' => $vendorDir . '/symfony/security-http/Event/InteractiveLoginEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LazyResponseEvent' => $vendorDir . '/symfony/security-http/Event/LazyResponseEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LoginFailureEvent' => $vendorDir . '/symfony/security-http/Event/LoginFailureEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LoginSuccessEvent' => $vendorDir . '/symfony/security-http/Event/LoginSuccessEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LogoutEvent' => $vendorDir . '/symfony/security-http/Event/LogoutEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\SwitchUserEvent' => $vendorDir . '/symfony/security-http/Event/SwitchUserEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\TokenDeauthenticatedEvent' => $vendorDir . '/symfony/security-http/Event/TokenDeauthenticatedEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall' => $vendorDir . '/symfony/security-http/Firewall.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\FirewallMap' => $vendorDir . '/symfony/security-http/FirewallMap.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\FirewallMapInterface' => $vendorDir . '/symfony/security-http/FirewallMapInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AbstractListener' => $vendorDir . '/symfony/security-http/Firewall/AbstractListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AccessListener' => $vendorDir . '/symfony/security-http/Firewall/AccessListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AuthenticatorManagerListener' => $vendorDir . '/symfony/security-http/Firewall/AuthenticatorManagerListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ChannelListener' => $vendorDir . '/symfony/security-http/Firewall/ChannelListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ContextListener' => $vendorDir . '/symfony/security-http/Firewall/ContextListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ExceptionListener' => $vendorDir . '/symfony/security-http/Firewall/ExceptionListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\FirewallListenerInterface' => $vendorDir . '/symfony/security-http/Firewall/FirewallListenerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\LogoutListener' => $vendorDir . '/symfony/security-http/Firewall/LogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\SwitchUserListener' => $vendorDir . '/symfony/security-http/Firewall/SwitchUserListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\HttpUtils' => $vendorDir . '/symfony/security-http/HttpUtils.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Impersonate\\ImpersonateUrlGenerator' => $vendorDir . '/symfony/security-http/Impersonate/ImpersonateUrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\ExpiredLoginLinkException' => $vendorDir . '/symfony/security-http/LoginLink/Exception/ExpiredLoginLinkException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\InvalidLoginLinkAuthenticationException' => $vendorDir . '/symfony/security-http/LoginLink/Exception/InvalidLoginLinkAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\InvalidLoginLinkException' => $vendorDir . '/symfony/security-http/LoginLink/Exception/InvalidLoginLinkException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\InvalidLoginLinkExceptionInterface' => $vendorDir . '/symfony/security-http/LoginLink/Exception/InvalidLoginLinkExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkDetails' => $vendorDir . '/symfony/security-http/LoginLink/LoginLinkDetails.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkHandler' => $vendorDir . '/symfony/security-http/LoginLink/LoginLinkHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkHandlerInterface' => $vendorDir . '/symfony/security-http/LoginLink/LoginLinkHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkNotification' => $vendorDir . '/symfony/security-http/LoginLink/LoginLinkNotification.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Logout\\LogoutUrlGenerator' => $vendorDir . '/symfony/security-http/Logout/LogoutUrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\ParameterBagUtils' => $vendorDir . '/symfony/security-http/ParameterBagUtils.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RateLimiter\\DefaultLoginRateLimiter' => $vendorDir . '/symfony/security-http/RateLimiter/DefaultLoginRateLimiter.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\AbstractRememberMeHandler' => $vendorDir . '/symfony/security-http/RememberMe/AbstractRememberMeHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\PersistentRememberMeHandler' => $vendorDir . '/symfony/security-http/RememberMe/PersistentRememberMeHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\RememberMeDetails' => $vendorDir . '/symfony/security-http/RememberMe/RememberMeDetails.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\RememberMeHandlerInterface' => $vendorDir . '/symfony/security-http/RememberMe/RememberMeHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\ResponseListener' => $vendorDir . '/symfony/security-http/RememberMe/ResponseListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\SignatureRememberMeHandler' => $vendorDir . '/symfony/security-http/RememberMe/SignatureRememberMeHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\SecurityEvents' => $vendorDir . '/symfony/security-http/SecurityEvents.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\SecurityRequestAttributes' => $vendorDir . '/symfony/security-http/SecurityRequestAttributes.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Session\\SessionAuthenticationStrategy' => $vendorDir . '/symfony/security-http/Session/SessionAuthenticationStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Session\\SessionAuthenticationStrategyInterface' => $vendorDir . '/symfony/security-http/Session/SessionAuthenticationStrategyInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Util\\TargetPathTrait' => $vendorDir . '/symfony/security-http/Util/TargetPathTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\Context' => $vendorDir . '/symfony/serializer/Annotation/Context.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\DiscriminatorMap' => $vendorDir . '/symfony/serializer/Annotation/DiscriminatorMap.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\Groups' => $vendorDir . '/symfony/serializer/Annotation/Groups.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\Ignore' => $vendorDir . '/symfony/serializer/Annotation/Ignore.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\MaxDepth' => $vendorDir . '/symfony/serializer/Annotation/MaxDepth.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\SerializedName' => $vendorDir . '/symfony/serializer/Annotation/SerializedName.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\SerializedPath' => $vendorDir . '/symfony/serializer/Annotation/SerializedPath.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\Context' => $vendorDir . '/symfony/serializer/Attribute/Context.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\DiscriminatorMap' => $vendorDir . '/symfony/serializer/Attribute/DiscriminatorMap.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\Groups' => $vendorDir . '/symfony/serializer/Attribute/Groups.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\Ignore' => $vendorDir . '/symfony/serializer/Attribute/Ignore.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\MaxDepth' => $vendorDir . '/symfony/serializer/Attribute/MaxDepth.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\SerializedName' => $vendorDir . '/symfony/serializer/Attribute/SerializedName.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\SerializedPath' => $vendorDir . '/symfony/serializer/Attribute/SerializedPath.php', '_ContaoManager\\Symfony\\Component\\Serializer\\CacheWarmer\\CompiledClassMetadataCacheWarmer' => $vendorDir . '/symfony/serializer/CacheWarmer/CompiledClassMetadataCacheWarmer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Command\\DebugCommand' => $vendorDir . '/symfony/serializer/Command/DebugCommand.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\ContextBuilderInterface' => $vendorDir . '/symfony/serializer/Context/ContextBuilderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\ContextBuilderTrait' => $vendorDir . '/symfony/serializer/Context/ContextBuilderTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\CsvEncoderContextBuilder' => $vendorDir . '/symfony/serializer/Context/Encoder/CsvEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\JsonEncoderContextBuilder' => $vendorDir . '/symfony/serializer/Context/Encoder/JsonEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\XmlEncoderContextBuilder' => $vendorDir . '/symfony/serializer/Context/Encoder/XmlEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\YamlEncoderContextBuilder' => $vendorDir . '/symfony/serializer/Context/Encoder/YamlEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/AbstractNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractObjectNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/AbstractObjectNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\BackedEnumNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/BackedEnumNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\ConstraintViolationListNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/ConstraintViolationListNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\DateIntervalNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/DateIntervalNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\DateTimeNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/DateTimeNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\FormErrorNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/FormErrorNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\GetSetMethodNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/GetSetMethodNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\JsonSerializableNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/JsonSerializableNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\ObjectNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/ObjectNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\ProblemNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/ProblemNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\PropertyNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/PropertyNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\UidNormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/UidNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\UnwrappingDenormalizerContextBuilder' => $vendorDir . '/symfony/serializer/Context/Normalizer/UnwrappingDenormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\SerializerContextBuilder' => $vendorDir . '/symfony/serializer/Context/SerializerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\DataCollector\\SerializerDataCollector' => $vendorDir . '/symfony/serializer/DataCollector/SerializerDataCollector.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Debug\\TraceableEncoder' => $vendorDir . '/symfony/serializer/Debug/TraceableEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Debug\\TraceableNormalizer' => $vendorDir . '/symfony/serializer/Debug/TraceableNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Debug\\TraceableSerializer' => $vendorDir . '/symfony/serializer/Debug/TraceableSerializer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\DependencyInjection\\SerializerPass' => $vendorDir . '/symfony/serializer/DependencyInjection/SerializerPass.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ChainDecoder' => $vendorDir . '/symfony/serializer/Encoder/ChainDecoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ChainEncoder' => $vendorDir . '/symfony/serializer/Encoder/ChainEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ContextAwareDecoderInterface' => $vendorDir . '/symfony/serializer/Encoder/ContextAwareDecoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ContextAwareEncoderInterface' => $vendorDir . '/symfony/serializer/Encoder/ContextAwareEncoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\CsvEncoder' => $vendorDir . '/symfony/serializer/Encoder/CsvEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\DecoderInterface' => $vendorDir . '/symfony/serializer/Encoder/DecoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\EncoderInterface' => $vendorDir . '/symfony/serializer/Encoder/EncoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonDecode' => $vendorDir . '/symfony/serializer/Encoder/JsonDecode.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonEncode' => $vendorDir . '/symfony/serializer/Encoder/JsonEncode.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonEncoder' => $vendorDir . '/symfony/serializer/Encoder/JsonEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\NormalizationAwareInterface' => $vendorDir . '/symfony/serializer/Encoder/NormalizationAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\XmlEncoder' => $vendorDir . '/symfony/serializer/Encoder/XmlEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\YamlEncoder' => $vendorDir . '/symfony/serializer/Encoder/YamlEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\BadMethodCallException' => $vendorDir . '/symfony/serializer/Exception/BadMethodCallException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\CircularReferenceException' => $vendorDir . '/symfony/serializer/Exception/CircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/serializer/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\ExtraAttributesException' => $vendorDir . '/symfony/serializer/Exception/ExtraAttributesException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/serializer/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\LogicException' => $vendorDir . '/symfony/serializer/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\MappingException' => $vendorDir . '/symfony/serializer/Exception/MappingException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\MissingConstructorArgumentsException' => $vendorDir . '/symfony/serializer/Exception/MissingConstructorArgumentsException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\NotEncodableValueException' => $vendorDir . '/symfony/serializer/Exception/NotEncodableValueException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\NotNormalizableValueException' => $vendorDir . '/symfony/serializer/Exception/NotNormalizableValueException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\PartialDenormalizationException' => $vendorDir . '/symfony/serializer/Exception/PartialDenormalizationException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\RuntimeException' => $vendorDir . '/symfony/serializer/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\UnexpectedValueException' => $vendorDir . '/symfony/serializer/Exception/UnexpectedValueException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\UnsupportedException' => $vendorDir . '/symfony/serializer/Exception/UnsupportedException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\UnsupportedFormatException' => $vendorDir . '/symfony/serializer/Exception/UnsupportedFormatException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Extractor\\ObjectPropertyListExtractor' => $vendorDir . '/symfony/serializer/Extractor/ObjectPropertyListExtractor.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Extractor\\ObjectPropertyListExtractorInterface' => $vendorDir . '/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\AttributeMetadata' => $vendorDir . '/symfony/serializer/Mapping/AttributeMetadata.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\AttributeMetadataInterface' => $vendorDir . '/symfony/serializer/Mapping/AttributeMetadataInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorFromClassMetadata' => $vendorDir . '/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorMapping' => $vendorDir . '/symfony/serializer/Mapping/ClassDiscriminatorMapping.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorResolverInterface' => $vendorDir . '/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassMetadata' => $vendorDir . '/symfony/serializer/Mapping/ClassMetadata.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassMetadataInterface' => $vendorDir . '/symfony/serializer/Mapping/ClassMetadataInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\CacheClassMetadataFactory' => $vendorDir . '/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactory' => $vendorDir . '/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactoryCompiler' => $vendorDir . '/symfony/serializer/Mapping/Factory/ClassMetadataFactoryCompiler.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactoryInterface' => $vendorDir . '/symfony/serializer/Mapping/Factory/ClassMetadataFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassResolverTrait' => $vendorDir . '/symfony/serializer/Mapping/Factory/ClassResolverTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\CompiledClassMetadataFactory' => $vendorDir . '/symfony/serializer/Mapping/Factory/CompiledClassMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\AnnotationLoader' => $vendorDir . '/symfony/serializer/Mapping/Loader/AnnotationLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\AttributeLoader' => $vendorDir . '/symfony/serializer/Mapping/Loader/AttributeLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\FileLoader' => $vendorDir . '/symfony/serializer/Mapping/Loader/FileLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\LoaderChain' => $vendorDir . '/symfony/serializer/Mapping/Loader/LoaderChain.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\LoaderInterface' => $vendorDir . '/symfony/serializer/Mapping/Loader/LoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/serializer/Mapping/Loader/XmlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/serializer/Mapping/Loader/YamlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\AdvancedNameConverterInterface' => $vendorDir . '/symfony/serializer/NameConverter/AdvancedNameConverterInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\CamelCaseToSnakeCaseNameConverter' => $vendorDir . '/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\MetadataAwareNameConverter' => $vendorDir . '/symfony/serializer/NameConverter/MetadataAwareNameConverter.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\NameConverterInterface' => $vendorDir . '/symfony/serializer/NameConverter/NameConverterInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/AbstractNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/AbstractObjectNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ArrayDenormalizer' => $vendorDir . '/symfony/serializer/Normalizer/ArrayDenormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\BackedEnumNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/BackedEnumNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\CacheableSupportsMethodInterface' => $vendorDir . '/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ConstraintViolationListNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ContextAwareDenormalizerInterface' => $vendorDir . '/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ContextAwareNormalizerInterface' => $vendorDir . '/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\CustomNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/CustomNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DataUriNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/DataUriNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateIntervalNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/DateIntervalNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateTimeNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/DateTimeNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateTimeZoneNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizableInterface' => $vendorDir . '/symfony/serializer/Normalizer/DenormalizableInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerAwareInterface' => $vendorDir . '/symfony/serializer/Normalizer/DenormalizerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerAwareTrait' => $vendorDir . '/symfony/serializer/Normalizer/DenormalizerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface' => $vendorDir . '/symfony/serializer/Normalizer/DenormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\FormErrorNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/FormErrorNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\GetSetMethodNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/GetSetMethodNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\JsonSerializableNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/JsonSerializableNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\MimeMessageNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/MimeMessageNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizableInterface' => $vendorDir . '/symfony/serializer/Normalizer/NormalizableInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerAwareInterface' => $vendorDir . '/symfony/serializer/Normalizer/NormalizerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerAwareTrait' => $vendorDir . '/symfony/serializer/Normalizer/NormalizerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface' => $vendorDir . '/symfony/serializer/Normalizer/NormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/ObjectNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ObjectToPopulateTrait' => $vendorDir . '/symfony/serializer/Normalizer/ObjectToPopulateTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ProblemNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/ProblemNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\PropertyNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/PropertyNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\TranslatableNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/TranslatableNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\UidNormalizer' => $vendorDir . '/symfony/serializer/Normalizer/UidNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\UnwrappingDenormalizer' => $vendorDir . '/symfony/serializer/Normalizer/UnwrappingDenormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Serializer' => $vendorDir . '/symfony/serializer/Serializer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerAwareInterface' => $vendorDir . '/symfony/serializer/SerializerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerAwareTrait' => $vendorDir . '/symfony/serializer/SerializerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerInterface' => $vendorDir . '/symfony/serializer/SerializerInterface.php', '_ContaoManager\\Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php', '_ContaoManager\\Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php', '_ContaoManager\\Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php', '_ContaoManager\\Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php', '_ContaoManager\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php', '_ContaoManager\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php', '_ContaoManager\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php', '_ContaoManager\\Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php', '_ContaoManager\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php', '_ContaoManager\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php', '_ContaoManager\\Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php', '_ContaoManager\\Symfony\\Component\\Uid\\AbstractUid' => $vendorDir . '/symfony/uid/AbstractUid.php', '_ContaoManager\\Symfony\\Component\\Uid\\BinaryUtil' => $vendorDir . '/symfony/uid/BinaryUtil.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\GenerateUlidCommand' => $vendorDir . '/symfony/uid/Command/GenerateUlidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\GenerateUuidCommand' => $vendorDir . '/symfony/uid/Command/GenerateUuidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\InspectUlidCommand' => $vendorDir . '/symfony/uid/Command/InspectUlidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\InspectUuidCommand' => $vendorDir . '/symfony/uid/Command/InspectUuidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\NameBasedUuidFactory' => $vendorDir . '/symfony/uid/Factory/NameBasedUuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\RandomBasedUuidFactory' => $vendorDir . '/symfony/uid/Factory/RandomBasedUuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\TimeBasedUuidFactory' => $vendorDir . '/symfony/uid/Factory/TimeBasedUuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\UlidFactory' => $vendorDir . '/symfony/uid/Factory/UlidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\UuidFactory' => $vendorDir . '/symfony/uid/Factory/UuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\MaxUlid' => $vendorDir . '/symfony/uid/MaxUlid.php', '_ContaoManager\\Symfony\\Component\\Uid\\MaxUuid' => $vendorDir . '/symfony/uid/MaxUuid.php', '_ContaoManager\\Symfony\\Component\\Uid\\NilUlid' => $vendorDir . '/symfony/uid/NilUlid.php', '_ContaoManager\\Symfony\\Component\\Uid\\NilUuid' => $vendorDir . '/symfony/uid/NilUuid.php', '_ContaoManager\\Symfony\\Component\\Uid\\TimeBasedUidInterface' => $vendorDir . '/symfony/uid/TimeBasedUidInterface.php', '_ContaoManager\\Symfony\\Component\\Uid\\Ulid' => $vendorDir . '/symfony/uid/Ulid.php', '_ContaoManager\\Symfony\\Component\\Uid\\Uuid' => $vendorDir . '/symfony/uid/Uuid.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV1' => $vendorDir . '/symfony/uid/UuidV1.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV3' => $vendorDir . '/symfony/uid/UuidV3.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV4' => $vendorDir . '/symfony/uid/UuidV4.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV5' => $vendorDir . '/symfony/uid/UuidV5.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV6' => $vendorDir . '/symfony/uid/UuidV6.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV7' => $vendorDir . '/symfony/uid/UuidV7.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV8' => $vendorDir . '/symfony/uid/UuidV8.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => $vendorDir . '/symfony/var-dumper/Caster/AmqpCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => $vendorDir . '/symfony/var-dumper/Caster/ArgsStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\Caster' => $vendorDir . '/symfony/var-dumper/Caster/Caster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ClassStub' => $vendorDir . '/symfony/var-dumper/Caster/ClassStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ConstStub' => $vendorDir . '/symfony/var-dumper/Caster/ConstStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => $vendorDir . '/symfony/var-dumper/Caster/CutArrayStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\CutStub' => $vendorDir . '/symfony/var-dumper/Caster/CutStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => $vendorDir . '/symfony/var-dumper/Caster/DOMCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DateCaster' => $vendorDir . '/symfony/var-dumper/Caster/DateCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => $vendorDir . '/symfony/var-dumper/Caster/DoctrineCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DsCaster' => $vendorDir . '/symfony/var-dumper/Caster/DsCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => $vendorDir . '/symfony/var-dumper/Caster/DsPairStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\EnumStub' => $vendorDir . '/symfony/var-dumper/Caster/EnumStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ExceptionCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\FFICaster' => $vendorDir . '/symfony/var-dumper/Caster/FFICaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\FiberCaster' => $vendorDir . '/symfony/var-dumper/Caster/FiberCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\FrameStub' => $vendorDir . '/symfony/var-dumper/Caster/FrameStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => $vendorDir . '/symfony/var-dumper/Caster/GmpCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => $vendorDir . '/symfony/var-dumper/Caster/ImagineCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ImgStub' => $vendorDir . '/symfony/var-dumper/Caster/ImgStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => $vendorDir . '/symfony/var-dumper/Caster/IntlCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\LinkStub' => $vendorDir . '/symfony/var-dumper/Caster/LinkStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => $vendorDir . '/symfony/var-dumper/Caster/MemcachedCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\MysqliCaster' => $vendorDir . '/symfony/var-dumper/Caster/MysqliCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => $vendorDir . '/symfony/var-dumper/Caster/PdoCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => $vendorDir . '/symfony/var-dumper/Caster/PgSqlCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => $vendorDir . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => $vendorDir . '/symfony/var-dumper/Caster/RdKafkaCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => $vendorDir . '/symfony/var-dumper/Caster/RedisCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => $vendorDir . '/symfony/var-dumper/Caster/ReflectionCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/ResourceCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ScalarStub' => $vendorDir . '/symfony/var-dumper/Caster/ScalarStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\SplCaster' => $vendorDir . '/symfony/var-dumper/Caster/SplCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\StubCaster' => $vendorDir . '/symfony/var-dumper/Caster/StubCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => $vendorDir . '/symfony/var-dumper/Caster/SymfonyCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\TraceStub' => $vendorDir . '/symfony/var-dumper/Caster/TraceStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\UninitializedStub' => $vendorDir . '/symfony/var-dumper/Caster/UninitializedStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => $vendorDir . '/symfony/var-dumper/Caster/UuidCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlReaderCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => $vendorDir . '/symfony/var-dumper/Caster/XmlResourceCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => $vendorDir . '/symfony/var-dumper/Cloner/AbstractCloner.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => $vendorDir . '/symfony/var-dumper/Cloner/ClonerInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Cursor' => $vendorDir . '/symfony/var-dumper/Cloner/Cursor.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Data' => $vendorDir . '/symfony/var-dumper/Cloner/Data.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => $vendorDir . '/symfony/var-dumper/Cloner/DumperInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Internal\\NoDefault' => $vendorDir . '/symfony/var-dumper/Cloner/Internal/NoDefault.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Stub' => $vendorDir . '/symfony/var-dumper/Cloner/Stub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => $vendorDir . '/symfony/var-dumper/Cloner/VarCloner.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => $vendorDir . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => $vendorDir . '/symfony/var-dumper/Command/ServerDumpCommand.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => $vendorDir . '/symfony/var-dumper/Dumper/AbstractDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => $vendorDir . '/symfony/var-dumper/Dumper/CliDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => $vendorDir . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ContextualizedDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => $vendorDir . '/symfony/var-dumper/Dumper/DataDumperInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => $vendorDir . '/symfony/var-dumper/Dumper/HtmlDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => $vendorDir . '/symfony/var-dumper/Dumper/ServerDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => $vendorDir . '/symfony/var-dumper/Exception/ThrowingCasterException.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Server\\Connection' => $vendorDir . '/symfony/var-dumper/Server/Connection.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Server\\DumpServer' => $vendorDir . '/symfony/var-dumper/Server/DumpServer.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => $vendorDir . '/symfony/var-dumper/Test/VarDumperTestTrait.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\VarDumper' => $vendorDir . '/symfony/var-dumper/VarDumper.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => $vendorDir . '/symfony/var-exporter/Exception/ClassNotFoundException.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/var-exporter/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\LogicException' => $vendorDir . '/symfony/var-exporter/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => $vendorDir . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Hydrator' => $vendorDir . '/symfony/var-exporter/Hydrator.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Instantiator' => $vendorDir . '/symfony/var-exporter/Instantiator.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Exporter' => $vendorDir . '/symfony/var-exporter/Internal/Exporter.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Hydrator' => $vendorDir . '/symfony/var-exporter/Internal/Hydrator.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectRegistry.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectState.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait' => $vendorDir . '/symfony/var-exporter/Internal/LazyObjectTrait.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Reference' => $vendorDir . '/symfony/var-exporter/Internal/Reference.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\LazyGhostTrait' => $vendorDir . '/symfony/var-exporter/LazyGhostTrait.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\LazyObjectInterface' => $vendorDir . '/symfony/var-exporter/LazyObjectInterface.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\LazyProxyTrait' => $vendorDir . '/symfony/var-exporter/LazyProxyTrait.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\ProxyHelper' => $vendorDir . '/symfony/var-exporter/ProxyHelper.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\ItemInterface' => $vendorDir . '/symfony/cache-contracts/ItemInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\NamespacedPoolInterface' => $vendorDir . '/symfony/cache-contracts/NamespacedPoolInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => $vendorDir . '/symfony/cache-contracts/TagAwareCacheInterface.php', '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher-contracts/Event.php', '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', '_ContaoManager\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => $vendorDir . '/symfony/service-contracts/ServiceCollectionInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', '_ContaoManager\\Terminal42\\ComposerLockValidator\\ValidationException' => $vendorDir . '/terminal42/composer-lock-validator/src/ValidationException.php', '_ContaoManager\\Terminal42\\ComposerLockValidator\\Validator' => $vendorDir . '/terminal42/composer-lock-validator/src/Validator.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AndroidKeyAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidKeyAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AndroidSafetyNetAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidSafetyNetAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AppleAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AppleAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationObject' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObject.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationObjectLoader' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObjectLoader.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatement' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatement.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatementSupportManager' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupportManager.php', '_ContaoManager\\Webauthn\\AttestationStatement\\FidoU2FAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/FidoU2FAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\NoneAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/NoneAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\PackedAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/PackedAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\TPMAttestationStatementSupport' => $vendorDir . '/web-auth/webauthn-lib/src/AttestationStatement/TPMAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestedCredentialData' => $vendorDir . '/web-auth/webauthn-lib/src/AttestedCredentialData.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtension' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtension.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensions' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensions.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientInputs' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientInputs.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputs' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputs.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputsLoader' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputsLoader.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\ExtensionOutputChecker' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputChecker.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\ExtensionOutputCheckerHandler' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputCheckerHandler.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\ExtensionOutputError' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputError.php', '_ContaoManager\\Webauthn\\AuthenticatorAssertionResponse' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponse.php', '_ContaoManager\\Webauthn\\AuthenticatorAssertionResponseValidator' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponseValidator.php', '_ContaoManager\\Webauthn\\AuthenticatorAttestationResponse' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponse.php', '_ContaoManager\\Webauthn\\AuthenticatorAttestationResponseValidator' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponseValidator.php', '_ContaoManager\\Webauthn\\AuthenticatorData' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorData.php', '_ContaoManager\\Webauthn\\AuthenticatorDataLoader' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorDataLoader.php', '_ContaoManager\\Webauthn\\AuthenticatorResponse' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorResponse.php', '_ContaoManager\\Webauthn\\AuthenticatorSelectionCriteria' => $vendorDir . '/web-auth/webauthn-lib/src/AuthenticatorSelectionCriteria.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStep' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStep.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStepManager' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStepManager.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStepManagerFactory' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStepManagerFactory.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckAlgorithm' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckAlgorithm.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckAllowedCredentialList' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckAllowedCredentialList.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckAttestationFormatIsKnownAndValid' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckAttestationFormatIsKnownAndValid.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckBackupBitsAreConsistent' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckBackupBitsAreConsistent.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckChallenge' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckChallenge.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckClientDataCollectorType' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckClientDataCollectorType.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckCounter' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckCounter.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckCredentialId' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckCredentialId.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckExtensions' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckExtensions.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckHasAttestedCredentialData' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckHasAttestedCredentialData.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckMetadataStatement' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckMetadataStatement.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckOrigin' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckOrigin.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckRelyingPartyIdIdHash' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckRelyingPartyIdIdHash.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckSignature' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckSignature.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckTopOrigin' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckTopOrigin.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckUserHandle' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckUserHandle.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckUserVerification' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckUserVerification.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckUserWasPresent' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/CheckUserWasPresent.php', '_ContaoManager\\Webauthn\\CeremonyStep\\HostTopOriginValidator' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/HostTopOriginValidator.php', '_ContaoManager\\Webauthn\\CeremonyStep\\TopOriginValidator' => $vendorDir . '/web-auth/webauthn-lib/src/CeremonyStep/TopOriginValidator.php', '_ContaoManager\\Webauthn\\CertificateChainChecker\\CertificateChainChecker' => $vendorDir . '/web-auth/webauthn-lib/src/CertificateChainChecker/CertificateChainChecker.php', '_ContaoManager\\Webauthn\\CertificateChainChecker\\PhpCertificateChainChecker' => $vendorDir . '/web-auth/webauthn-lib/src/CertificateChainChecker/PhpCertificateChainChecker.php', '_ContaoManager\\Webauthn\\CertificateToolbox' => $vendorDir . '/web-auth/webauthn-lib/src/CertificateToolbox.php', '_ContaoManager\\Webauthn\\ClientDataCollector\\ClientDataCollector' => $vendorDir . '/web-auth/webauthn-lib/src/ClientDataCollector/ClientDataCollector.php', '_ContaoManager\\Webauthn\\ClientDataCollector\\ClientDataCollectorManager' => $vendorDir . '/web-auth/webauthn-lib/src/ClientDataCollector/ClientDataCollectorManager.php', '_ContaoManager\\Webauthn\\ClientDataCollector\\WebauthnAuthenticationCollector' => $vendorDir . '/web-auth/webauthn-lib/src/ClientDataCollector/WebauthnAuthenticationCollector.php', '_ContaoManager\\Webauthn\\CollectedClientData' => $vendorDir . '/web-auth/webauthn-lib/src/CollectedClientData.php', '_ContaoManager\\Webauthn\\Counter\\CounterChecker' => $vendorDir . '/web-auth/webauthn-lib/src/Counter/CounterChecker.php', '_ContaoManager\\Webauthn\\Counter\\ThrowExceptionIfInvalid' => $vendorDir . '/web-auth/webauthn-lib/src/Counter/ThrowExceptionIfInvalid.php', '_ContaoManager\\Webauthn\\Credential' => $vendorDir . '/web-auth/webauthn-lib/src/Credential.php', '_ContaoManager\\Webauthn\\Denormalizer\\AttestationObjectDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AttestationObjectDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AttestationStatementDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AttestationStatementDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AttestedCredentialDataNormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AttestedCredentialDataNormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticationExtensionNormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticationExtensionNormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticationExtensionsDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticationExtensionsDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorAssertionResponseDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorAssertionResponseDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorAttestationResponseDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorAttestationResponseDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorDataDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorDataDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorResponseDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorResponseDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\CollectedClientDataDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/CollectedClientDataDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\ExtensionDescriptorDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/ExtensionDescriptorDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialDescriptorNormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialDescriptorNormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialOptionsDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialOptionsDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialParametersDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialParametersDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialSourceDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialSourceDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialUserEntityDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialUserEntityDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\TrustPathDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/TrustPathDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\VerificationMethodANDCombinationsDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/VerificationMethodANDCombinationsDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\WebauthnSerializerFactory' => $vendorDir . '/web-auth/webauthn-lib/src/Denormalizer/WebauthnSerializerFactory.php', '_ContaoManager\\Webauthn\\Event\\AttestationObjectLoaded' => $vendorDir . '/web-auth/webauthn-lib/src/Event/AttestationObjectLoaded.php', '_ContaoManager\\Webauthn\\Event\\AttestationStatementLoaded' => $vendorDir . '/web-auth/webauthn-lib/src/Event/AttestationStatementLoaded.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAssertionResponseValidationFailedEvent' => $vendorDir . '/web-auth/webauthn-lib/src/Event/AuthenticatorAssertionResponseValidationFailedEvent.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAssertionResponseValidationSucceededEvent' => $vendorDir . '/web-auth/webauthn-lib/src/Event/AuthenticatorAssertionResponseValidationSucceededEvent.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAttestationResponseValidationFailedEvent' => $vendorDir . '/web-auth/webauthn-lib/src/Event/AuthenticatorAttestationResponseValidationFailedEvent.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAttestationResponseValidationSucceededEvent' => $vendorDir . '/web-auth/webauthn-lib/src/Event/AuthenticatorAttestationResponseValidationSucceededEvent.php', '_ContaoManager\\Webauthn\\Event\\BeforeCertificateChainValidation' => $vendorDir . '/web-auth/webauthn-lib/src/Event/BeforeCertificateChainValidation.php', '_ContaoManager\\Webauthn\\Event\\CanDispatchEvents' => $vendorDir . '/web-auth/webauthn-lib/src/Event/CanDispatchEvents.php', '_ContaoManager\\Webauthn\\Event\\CertificateChainValidationFailed' => $vendorDir . '/web-auth/webauthn-lib/src/Event/CertificateChainValidationFailed.php', '_ContaoManager\\Webauthn\\Event\\CertificateChainValidationSucceeded' => $vendorDir . '/web-auth/webauthn-lib/src/Event/CertificateChainValidationSucceeded.php', '_ContaoManager\\Webauthn\\Event\\MetadataStatementFound' => $vendorDir . '/web-auth/webauthn-lib/src/Event/MetadataStatementFound.php', '_ContaoManager\\Webauthn\\Event\\NullEventDispatcher' => $vendorDir . '/web-auth/webauthn-lib/src/Event/NullEventDispatcher.php', '_ContaoManager\\Webauthn\\Event\\WebauthnEvent' => $vendorDir . '/web-auth/webauthn-lib/src/Event/WebauthnEvent.php', '_ContaoManager\\Webauthn\\Exception\\AttestationStatementException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/AttestationStatementException.php', '_ContaoManager\\Webauthn\\Exception\\AttestationStatementLoadingException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/AttestationStatementLoadingException.php', '_ContaoManager\\Webauthn\\Exception\\AttestationStatementVerificationException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/AttestationStatementVerificationException.php', '_ContaoManager\\Webauthn\\Exception\\AuthenticationExtensionException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/AuthenticationExtensionException.php', '_ContaoManager\\Webauthn\\Exception\\AuthenticatorResponseVerificationException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/AuthenticatorResponseVerificationException.php', '_ContaoManager\\Webauthn\\Exception\\CertificateChainException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/CertificateChainException.php', '_ContaoManager\\Webauthn\\Exception\\CertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/CertificateException.php', '_ContaoManager\\Webauthn\\Exception\\CertificateRevocationListException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/CertificateRevocationListException.php', '_ContaoManager\\Webauthn\\Exception\\CounterException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/CounterException.php', '_ContaoManager\\Webauthn\\Exception\\ExpiredCertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/ExpiredCertificateException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidAttestationStatementException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/InvalidAttestationStatementException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidCertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/InvalidCertificateException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidDataException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/InvalidDataException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidTrustPathException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/InvalidTrustPathException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidUserHandleException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/InvalidUserHandleException.php', '_ContaoManager\\Webauthn\\Exception\\MetadataServiceException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/MetadataServiceException.php', '_ContaoManager\\Webauthn\\Exception\\MetadataStatementException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/MetadataStatementException.php', '_ContaoManager\\Webauthn\\Exception\\MetadataStatementLoadingException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/MetadataStatementLoadingException.php', '_ContaoManager\\Webauthn\\Exception\\MissingMetadataStatementException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/MissingMetadataStatementException.php', '_ContaoManager\\Webauthn\\Exception\\RevokedCertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/RevokedCertificateException.php', '_ContaoManager\\Webauthn\\Exception\\UnsupportedFeatureException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/UnsupportedFeatureException.php', '_ContaoManager\\Webauthn\\Exception\\WebauthnException' => $vendorDir . '/web-auth/webauthn-lib/src/Exception/WebauthnException.php', '_ContaoManager\\Webauthn\\FakeCredentialGenerator' => $vendorDir . '/web-auth/webauthn-lib/src/FakeCredentialGenerator.php', '_ContaoManager\\Webauthn\\MetadataService\\CanLogData' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/CanLogData.php', '_ContaoManager\\Webauthn\\MetadataService\\CertificateChain\\CertificateChainValidator' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/CertificateChain/CertificateChainValidator.php', '_ContaoManager\\Webauthn\\MetadataService\\CertificateChain\\CertificateToolbox' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/CertificateChain/CertificateToolbox.php', '_ContaoManager\\Webauthn\\MetadataService\\CertificateChain\\PhpCertificateChainValidator' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/CertificateChain/PhpCertificateChainValidator.php', '_ContaoManager\\Webauthn\\MetadataService\\Denormalizer\\ExtensionDescriptorDenormalizer' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Denormalizer/ExtensionDescriptorDenormalizer.php', '_ContaoManager\\Webauthn\\MetadataService\\Denormalizer\\MetadataStatementSerializerFactory' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Denormalizer/MetadataStatementSerializerFactory.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\BeforeCertificateChainValidation' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/BeforeCertificateChainValidation.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\CanDispatchEvents' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/CanDispatchEvents.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\CertificateChainValidationFailed' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/CertificateChainValidationFailed.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\CertificateChainValidationSucceeded' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/CertificateChainValidationSucceeded.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\MetadataStatementFound' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/MetadataStatementFound.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\NullEventDispatcher' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/NullEventDispatcher.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\WebauthnEvent' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Event/WebauthnEvent.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\CertificateChainException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateChainException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\CertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\CertificateRevocationListException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateRevocationListException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\ExpiredCertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/ExpiredCertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\InvalidCertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/InvalidCertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MetadataServiceException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataServiceException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MetadataStatementException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataStatementException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MetadataStatementLoadingException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataStatementLoadingException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MissingMetadataStatementException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/MissingMetadataStatementException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\RevokedCertificateException' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Exception/RevokedCertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\MetadataStatementRepository' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/MetadataStatementRepository.php', '_ContaoManager\\Webauthn\\MetadataService\\Psr18HttpClient' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Psr18HttpClient.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\ChainedMetadataServices' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/ChainedMetadataServices.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\DistantResourceMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/DistantResourceMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\FidoAllianceCompliantMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/FidoAllianceCompliantMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\FolderResourceMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/FolderResourceMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\InMemoryMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/InMemoryMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\JsonMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/JsonMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\LocalResourceMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/LocalResourceMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\MetadataBLOBPayload' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/MetadataBLOBPayload.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\MetadataBLOBPayloadEntry' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/MetadataBLOBPayloadEntry.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\MetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/MetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\StringMetadataService' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Service/StringMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AbstractDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/AbstractDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AlternativeDescriptions' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/AlternativeDescriptions.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AuthenticatorGetInfo' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/AuthenticatorGetInfo.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AuthenticatorStatus' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/AuthenticatorStatus.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\BiometricAccuracyDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/BiometricAccuracyDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\BiometricStatusReport' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/BiometricStatusReport.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\CodeAccuracyDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/CodeAccuracyDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\DisplayPNGCharacteristicsDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/DisplayPNGCharacteristicsDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\EcdaaTrustAnchor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/EcdaaTrustAnchor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\ExtensionDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/ExtensionDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\MetadataStatement' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/MetadataStatement.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\PatternAccuracyDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/PatternAccuracyDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\RgbPaletteEntry' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/RgbPaletteEntry.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\RogueListEntry' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/RogueListEntry.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\StatusReport' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/StatusReport.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\VerificationMethodANDCombinations' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/VerificationMethodANDCombinations.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\VerificationMethodDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/VerificationMethodDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\Version' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/Statement/Version.php', '_ContaoManager\\Webauthn\\MetadataService\\StatusReportRepository' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/StatusReportRepository.php', '_ContaoManager\\Webauthn\\MetadataService\\ValueFilter' => $vendorDir . '/web-auth/webauthn-lib/src/MetadataService/ValueFilter.php', '_ContaoManager\\Webauthn\\PublicKeyCredential' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredential.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialCreationOptions' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialCreationOptions.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialDescriptor' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptor.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialDescriptorCollection' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptorCollection.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialEntity' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialEntity.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialLoader' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialLoader.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialOptions' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialOptions.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialParameters' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialParameters.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialRequestOptions' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialRequestOptions.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialRpEntity' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialRpEntity.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialSource' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialSource.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialSourceRepository' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialSourceRepository.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialUserEntity' => $vendorDir . '/web-auth/webauthn-lib/src/PublicKeyCredentialUserEntity.php', '_ContaoManager\\Webauthn\\SimpleFakeCredentialGenerator' => $vendorDir . '/web-auth/webauthn-lib/src/SimpleFakeCredentialGenerator.php', '_ContaoManager\\Webauthn\\StringStream' => $vendorDir . '/web-auth/webauthn-lib/src/StringStream.php', '_ContaoManager\\Webauthn\\TokenBinding\\IgnoreTokenBindingHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/IgnoreTokenBindingHandler.php', '_ContaoManager\\Webauthn\\TokenBinding\\SecTokenBindingHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/SecTokenBindingHandler.php', '_ContaoManager\\Webauthn\\TokenBinding\\TokenBinding' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/TokenBinding.php', '_ContaoManager\\Webauthn\\TokenBinding\\TokenBindingHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingHandler.php', '_ContaoManager\\Webauthn\\TokenBinding\\TokenBindingNotSupportedHandler' => $vendorDir . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingNotSupportedHandler.php', '_ContaoManager\\Webauthn\\TrustPath\\CertificateTrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/CertificateTrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\EcdaaKeyIdTrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/EcdaaKeyIdTrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\EmptyTrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/EmptyTrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\TrustPath' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/TrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\TrustPathLoader' => $vendorDir . '/web-auth/webauthn-lib/src/TrustPath/TrustPathLoader.php', '_ContaoManager\\Webauthn\\U2FPublicKey' => $vendorDir . '/web-auth/webauthn-lib/src/U2FPublicKey.php', '_ContaoManager\\Webauthn\\Util\\Base64' => $vendorDir . '/web-auth/webauthn-lib/src/Util/Base64.php', '_ContaoManager\\Webauthn\\Util\\CoseSignatureFixer' => $vendorDir . '/web-auth/webauthn-lib/src/Util/CoseSignatureFixer.php', '_ContaoManager\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', '_ContaoManager\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', '_ContaoManager\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlockFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlockFactoryInterface' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Description' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Serializer' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\TagFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Extends_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Extends_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\AbstractPHPStanFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ExtendsFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ExtendsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\Factory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Factory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ImplementsFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ImplementsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\MethodFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/MethodFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\MethodParameterFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/MethodParameterFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PHPStanFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PHPStanFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ParamFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ParamFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PropertyFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PropertyFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PropertyReadFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PropertyReadFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PropertyWriteFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PropertyWriteFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ReturnFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ReturnFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\TemplateExtendsFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/TemplateExtendsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\TemplateFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/TemplateFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\TemplateImplementsFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/TemplateImplementsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\VarFactory' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/VarFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Implements_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Implements_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\MethodParameter' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/MethodParameter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Mixin' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Mixin.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Template' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Template.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TemplateCovariant' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TemplateCovariant.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TemplateExtends' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TemplateExtends.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TemplateImplements' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TemplateImplements.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => $vendorDir . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', '_ContaoManager\\phpDocumentor\\Reflection\\Element' => $vendorDir . '/phpdocumentor/reflection-common/src/Element.php', '_ContaoManager\\phpDocumentor\\Reflection\\Exception\\PcreException' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', '_ContaoManager\\phpDocumentor\\Reflection\\File' => $vendorDir . '/phpdocumentor/reflection-common/src/File.php', '_ContaoManager\\phpDocumentor\\Reflection\\Fqsen' => $vendorDir . '/phpdocumentor/reflection-common/src/Fqsen.php', '_ContaoManager\\phpDocumentor\\Reflection\\FqsenResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/FqsenResolver.php', '_ContaoManager\\phpDocumentor\\Reflection\\Location' => $vendorDir . '/phpdocumentor/reflection-common/src/Location.php', '_ContaoManager\\phpDocumentor\\Reflection\\Project' => $vendorDir . '/phpdocumentor/reflection-common/src/Project.php', '_ContaoManager\\phpDocumentor\\Reflection\\ProjectFactory' => $vendorDir . '/phpdocumentor/reflection-common/src/ProjectFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoType' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoType.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShape' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShapeItem' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ConstExpression' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\FloatValue' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerValue' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ListShape' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ListShape.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ListShapeItem' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ListShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyArray' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyArray.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyList' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ObjectShape' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ObjectShape.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ObjectShapeItem' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ObjectShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ShapeItem' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/ShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\StringValue' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => $vendorDir . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Type' => $vendorDir . '/phpdocumentor/type-resolver/src/Type.php', '_ContaoManager\\phpDocumentor\\Reflection\\TypeResolver' => $vendorDir . '/phpdocumentor/type-resolver/src/TypeResolver.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\AbstractList' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\AggregatedType' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\ArrayKey' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Array_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Array_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Boolean' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Boolean.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\CallableParameter' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/CallableParameter.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Callable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Callable_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\ClassString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ClassString.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Collection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Collection.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Compound' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Compound.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Context' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Context.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\ContextFactory' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Expression' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Expression.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Float_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Float_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Integer' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Integer.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\InterfaceString' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Intersection' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Intersection.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Iterable_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Mixed_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Never_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Never_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Null_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Null_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Nullable' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Nullable.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Object_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Object_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Parent_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Parent_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Resource_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Resource_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Scalar' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Scalar.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Self_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Self_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Static_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Static_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\String_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/String_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\This' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/This.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Void_' => $vendorDir . '/phpdocumentor/type-resolver/src/Types/Void_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Utils' => $vendorDir . '/phpdocumentor/reflection-docblock/src/Utils.php', '_ContaoManager\\studio24\\Rotate\\Delete' => $vendorDir . '/studio24/rotate/src/Delete.php', '_ContaoManager\\studio24\\Rotate\\DirectoryIterator' => $vendorDir . '/studio24/rotate/src/DirectoryIterator.php', '_ContaoManager\\studio24\\Rotate\\FilenameFormat' => $vendorDir . '/studio24/rotate/src/FilenameFormat.php', '_ContaoManager\\studio24\\Rotate\\FilenameFormatException' => $vendorDir . '/studio24/rotate/src/FilenameFormatException.php', '_ContaoManager\\studio24\\Rotate\\Rotate' => $vendorDir . '/studio24/rotate/src/Rotate.php', '_ContaoManager\\studio24\\Rotate\\RotateAbstract' => $vendorDir . '/studio24/rotate/src/RotateAbstract.php', '_ContaoManager\\studio24\\Rotate\\RotateException' => $vendorDir . '/studio24/rotate/src/RotateException.php', '_ContaoManager\\©' => $vendorDir . '/symfony/cache/Traits/ValueWrapper.php', ); = 80100)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php', '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', '09f6b20656683369174dd6fa83b7e5fb' => __DIR__ . '/..' . '/symfony/polyfill-uuid/bootstrap.php', '2203a247e6fda86070a5e4e07aed533a' => __DIR__ . '/..' . '/symfony/clock/Resources/now.php', 'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php', ); public static $prefixLengthsPsr4 = array ( '_' => array ( '_ContaoManager\\studio24\\Rotate\\' => 31, '_ContaoManager\\phpDocumentor\\Reflection\\' => 40, '_ContaoManager\\Webmozart\\Assert\\' => 32, '_ContaoManager\\Webauthn\\' => 24, '_ContaoManager\\Terminal42\\ComposerLockValidator\\' => 48, '_ContaoManager\\Symfony\\Contracts\\Service\\' => 41, '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\' => 49, '_ContaoManager\\Symfony\\Contracts\\Cache\\' => 39, '_ContaoManager\\Symfony\\Component\\Yaml\\' => 38, '_ContaoManager\\Symfony\\Component\\VarExporter\\' => 45, '_ContaoManager\\Symfony\\Component\\VarDumper\\' => 43, '_ContaoManager\\Symfony\\Component\\Uid\\' => 37, '_ContaoManager\\Symfony\\Component\\String\\' => 40, '_ContaoManager\\Symfony\\Component\\Serializer\\' => 44, '_ContaoManager\\Symfony\\Component\\Security\\Http\\' => 47, '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\' => 47, '_ContaoManager\\Symfony\\Component\\Security\\Core\\' => 47, '_ContaoManager\\Symfony\\Component\\Routing\\' => 41, '_ContaoManager\\Symfony\\Component\\PropertyInfo\\' => 46, '_ContaoManager\\Symfony\\Component\\PropertyAccess\\' => 48, '_ContaoManager\\Symfony\\Component\\Process\\' => 41, '_ContaoManager\\Symfony\\Component\\PasswordHasher\\' => 48, '_ContaoManager\\Symfony\\Component\\HttpKernel\\' => 44, '_ContaoManager\\Symfony\\Component\\HttpFoundation\\' => 48, '_ContaoManager\\Symfony\\Component\\Finder\\' => 40, '_ContaoManager\\Symfony\\Component\\Filesystem\\' => 44, '_ContaoManager\\Symfony\\Component\\EventDispatcher\\' => 49, '_ContaoManager\\Symfony\\Component\\ErrorHandler\\' => 46, '_ContaoManager\\Symfony\\Component\\DependencyInjection\\' => 53, '_ContaoManager\\Symfony\\Component\\Console\\' => 41, '_ContaoManager\\Symfony\\Component\\Config\\' => 40, '_ContaoManager\\Symfony\\Component\\Clock\\' => 39, '_ContaoManager\\Symfony\\Component\\Cache\\' => 39, '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\' => 45, '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\' => 44, '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\' => 46, '_ContaoManager\\Symfony\\Bridge\\Monolog\\' => 38, '_ContaoManager\\SpomkyLabs\\Pki\\' => 30, '_ContaoManager\\Seld\\Signal\\' => 27, '_ContaoManager\\Seld\\PharUtils\\' => 30, '_ContaoManager\\Seld\\JsonLint\\' => 29, '_ContaoManager\\Ramsey\\Uuid\\' => 27, '_ContaoManager\\Ramsey\\Collection\\' => 33, '_ContaoManager\\Psr\\Log\\' => 23, '_ContaoManager\\Psr\\Http\\Message\\' => 32, '_ContaoManager\\Psr\\Http\\Client\\' => 31, '_ContaoManager\\Psr\\EventDispatcher\\' => 35, '_ContaoManager\\Psr\\Container\\' => 29, '_ContaoManager\\Psr\\Clock\\' => 25, '_ContaoManager\\Psr\\Cache\\' => 25, '_ContaoManager\\ParagonIE\\ConstantTime\\' => 38, '_ContaoManager\\PHPStan\\PhpDocParser\\' => 36, '_ContaoManager\\OTPHP\\' => 21, '_ContaoManager\\Monolog\\' => 23, '_ContaoManager\\Lcobucci\\Clock\\' => 30, '_ContaoManager\\JsonSchema\\' => 26, '_ContaoManager\\Firebase\\JWT\\' => 28, '_ContaoManager\\Doctrine\\Deprecations\\' => 37, '_ContaoManager\\Crell\\ApiProblem\\' => 32, '_ContaoManager\\Cose\\' => 20, '_ContaoManager\\Contao\\ManagerApi\\' => 33, '_ContaoManager\\CBOR\\' => 20, '_ContaoManager\\Brick\\Math\\' => 26, ), 'S' => array ( 'Symfony\\Polyfill\\Uuid\\' => 22, 'Symfony\\Polyfill\\Php83\\' => 23, 'Symfony\\Polyfill\\Php81\\' => 23, 'Symfony\\Polyfill\\Php80\\' => 23, 'Symfony\\Polyfill\\Php73\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, 'Symfony\\Polyfill\\Ctype\\' => 23, ), 'R' => array ( 'React\\Promise\\' => 14, ), 'C' => array ( 'Composer\\XdebugHandler\\' => 23, 'Composer\\Spdx\\' => 14, 'Composer\\Semver\\' => 16, 'Composer\\Pcre\\' => 14, 'Composer\\MetadataMinifier\\' => 26, 'Composer\\ClassMapGenerator\\' => 27, 'Composer\\CaBundle\\' => 18, 'Composer\\' => 9, ), ); public static $prefixDirsPsr4 = array ( '_ContaoManager\\studio24\\Rotate\\' => array ( 0 => __DIR__ . '/..' . '/studio24/rotate/src', ), '_ContaoManager\\phpDocumentor\\Reflection\\' => array ( 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', 1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', 2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', ), '_ContaoManager\\Webmozart\\Assert\\' => array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), '_ContaoManager\\Webauthn\\' => array ( 0 => __DIR__ . '/..' . '/web-auth/webauthn-lib/src', ), '_ContaoManager\\Terminal42\\ComposerLockValidator\\' => array ( 0 => __DIR__ . '/..' . '/terminal42/composer-lock-validator/src', ), '_ContaoManager\\Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', ), '_ContaoManager\\Symfony\\Contracts\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache-contracts', ), '_ContaoManager\\Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), '_ContaoManager\\Symfony\\Component\\VarExporter\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', ), '_ContaoManager\\Symfony\\Component\\VarDumper\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-dumper', ), '_ContaoManager\\Symfony\\Component\\Uid\\' => array ( 0 => __DIR__ . '/..' . '/symfony/uid', ), '_ContaoManager\\Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), '_ContaoManager\\Symfony\\Component\\Serializer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/serializer', ), '_ContaoManager\\Symfony\\Component\\Security\\Http\\' => array ( 0 => __DIR__ . '/..' . '/symfony/security-http', ), '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\' => array ( 0 => __DIR__ . '/..' . '/symfony/security-csrf', ), '_ContaoManager\\Symfony\\Component\\Security\\Core\\' => array ( 0 => __DIR__ . '/..' . '/symfony/security-core', ), '_ContaoManager\\Symfony\\Component\\Routing\\' => array ( 0 => __DIR__ . '/..' . '/symfony/routing', ), '_ContaoManager\\Symfony\\Component\\PropertyInfo\\' => array ( 0 => __DIR__ . '/..' . '/symfony/property-info', ), '_ContaoManager\\Symfony\\Component\\PropertyAccess\\' => array ( 0 => __DIR__ . '/..' . '/symfony/property-access', ), '_ContaoManager\\Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), '_ContaoManager\\Symfony\\Component\\PasswordHasher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/password-hasher', ), '_ContaoManager\\Symfony\\Component\\HttpKernel\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-kernel', ), '_ContaoManager\\Symfony\\Component\\HttpFoundation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), '_ContaoManager\\Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), '_ContaoManager\\Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), '_ContaoManager\\Symfony\\Component\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', ), '_ContaoManager\\Symfony\\Component\\ErrorHandler\\' => array ( 0 => __DIR__ . '/..' . '/symfony/error-handler', ), '_ContaoManager\\Symfony\\Component\\DependencyInjection\\' => array ( 0 => __DIR__ . '/..' . '/symfony/dependency-injection', ), '_ContaoManager\\Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), '_ContaoManager\\Symfony\\Component\\Config\\' => array ( 0 => __DIR__ . '/..' . '/symfony/config', ), '_ContaoManager\\Symfony\\Component\\Clock\\' => array ( 0 => __DIR__ . '/..' . '/symfony/clock', ), '_ContaoManager\\Symfony\\Component\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache', ), '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/security-bundle', ), '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/monolog-bundle', ), '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/framework-bundle', ), '_ContaoManager\\Symfony\\Bridge\\Monolog\\' => array ( 0 => __DIR__ . '/..' . '/symfony/monolog-bridge', ), '_ContaoManager\\SpomkyLabs\\Pki\\' => array ( 0 => __DIR__ . '/..' . '/spomky-labs/pki-framework/src', ), '_ContaoManager\\Seld\\Signal\\' => array ( 0 => __DIR__ . '/..' . '/seld/signal-handler/src', ), '_ContaoManager\\Seld\\PharUtils\\' => array ( 0 => __DIR__ . '/..' . '/seld/phar-utils/src', ), '_ContaoManager\\Seld\\JsonLint\\' => array ( 0 => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint', ), '_ContaoManager\\Ramsey\\Uuid\\' => array ( 0 => __DIR__ . '/..' . '/ramsey/uuid/src', ), '_ContaoManager\\Ramsey\\Collection\\' => array ( 0 => __DIR__ . '/..' . '/ramsey/collection/src', ), '_ContaoManager\\Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), '_ContaoManager\\Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src', ), '_ContaoManager\\Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), '_ContaoManager\\Psr\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', ), '_ContaoManager\\Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), '_ContaoManager\\Psr\\Clock\\' => array ( 0 => __DIR__ . '/..' . '/psr/clock/src', ), '_ContaoManager\\Psr\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/psr/cache/src', ), '_ContaoManager\\ParagonIE\\ConstantTime\\' => array ( 0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src', ), '_ContaoManager\\PHPStan\\PhpDocParser\\' => array ( 0 => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src', ), '_ContaoManager\\OTPHP\\' => array ( 0 => __DIR__ . '/..' . '/spomky-labs/otphp/src', ), '_ContaoManager\\Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), '_ContaoManager\\Lcobucci\\Clock\\' => array ( 0 => __DIR__ . '/..' . '/lcobucci/clock/src', ), '_ContaoManager\\JsonSchema\\' => array ( 0 => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema', ), '_ContaoManager\\Firebase\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), '_ContaoManager\\Doctrine\\Deprecations\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/deprecations/src', ), '_ContaoManager\\Crell\\ApiProblem\\' => array ( 0 => __DIR__ . '/..' . '/crell/api-problem/src', ), '_ContaoManager\\Cose\\' => array ( 0 => __DIR__ . '/..' . '/web-auth/cose-lib/src', ), '_ContaoManager\\Contao\\ManagerApi\\' => array ( 0 => __DIR__ . '/../..' . '/api', ), '_ContaoManager\\CBOR\\' => array ( 0 => __DIR__ . '/..' . '/spomky-labs/cbor-php/src', ), '_ContaoManager\\Brick\\Math\\' => array ( 0 => __DIR__ . '/..' . '/brick/math/src', ), 'Symfony\\Polyfill\\Uuid\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-uuid', ), 'Symfony\\Polyfill\\Php83\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php83', ), 'Symfony\\Polyfill\\Php81\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php81', ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), 'Symfony\\Polyfill\\Php73\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', ), 'Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), 'React\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/react/promise/src', ), 'Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', ), 'Composer\\Spdx\\' => array ( 0 => __DIR__ . '/..' . '/composer/spdx-licenses/src', ), 'Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), 'Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), 'Composer\\MetadataMinifier\\' => array ( 0 => __DIR__ . '/..' . '/composer/metadata-minifier/src', ), 'Composer\\ClassMapGenerator\\' => array ( 0 => __DIR__ . '/..' . '/composer/class-map-generator/src', ), 'Composer\\CaBundle\\' => array ( 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', ), 'Composer\\' => array ( 0 => __DIR__ . '/..' . '/composer/composer/src/Composer', ), ); public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'CURLStringFile' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\Advisory\\Auditor' => __DIR__ . '/..' . '/composer/composer/src/Composer/Advisory/Auditor.php', 'Composer\\Advisory\\IgnoredSecurityAdvisory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Advisory/IgnoredSecurityAdvisory.php', 'Composer\\Advisory\\PartialSecurityAdvisory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Advisory/PartialSecurityAdvisory.php', 'Composer\\Advisory\\SecurityAdvisory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Advisory/SecurityAdvisory.php', 'Composer\\Autoload\\AutoloadGenerator' => __DIR__ . '/..' . '/composer/composer/src/Composer/Autoload/AutoloadGenerator.php', 'Composer\\Autoload\\ClassLoader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Autoload/ClassLoader.php', 'Composer\\Autoload\\ClassMapGenerator' => __DIR__ . '/..' . '/composer/composer/src/Composer/Autoload/ClassMapGenerator.php', 'Composer\\CaBundle\\CaBundle' => __DIR__ . '/..' . '/composer/ca-bundle/src/CaBundle.php', 'Composer\\Cache' => __DIR__ . '/..' . '/composer/composer/src/Composer/Cache.php', 'Composer\\ClassMapGenerator\\ClassMap' => __DIR__ . '/..' . '/composer/class-map-generator/src/ClassMap.php', 'Composer\\ClassMapGenerator\\ClassMapGenerator' => __DIR__ . '/..' . '/composer/class-map-generator/src/ClassMapGenerator.php', 'Composer\\ClassMapGenerator\\FileList' => __DIR__ . '/..' . '/composer/class-map-generator/src/FileList.php', 'Composer\\ClassMapGenerator\\PhpFileCleaner' => __DIR__ . '/..' . '/composer/class-map-generator/src/PhpFileCleaner.php', 'Composer\\ClassMapGenerator\\PhpFileParser' => __DIR__ . '/..' . '/composer/class-map-generator/src/PhpFileParser.php', 'Composer\\Command\\AboutCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/AboutCommand.php', 'Composer\\Command\\ArchiveCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ArchiveCommand.php', 'Composer\\Command\\AuditCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/AuditCommand.php', 'Composer\\Command\\BaseCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/BaseCommand.php', 'Composer\\Command\\BaseDependencyCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/BaseDependencyCommand.php', 'Composer\\Command\\BumpCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/BumpCommand.php', 'Composer\\Command\\CheckPlatformReqsCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/CheckPlatformReqsCommand.php', 'Composer\\Command\\ClearCacheCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ClearCacheCommand.php', 'Composer\\Command\\CompletionTrait' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/CompletionTrait.php', 'Composer\\Command\\ConfigCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ConfigCommand.php', 'Composer\\Command\\CreateProjectCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/CreateProjectCommand.php', 'Composer\\Command\\DependsCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/DependsCommand.php', 'Composer\\Command\\DiagnoseCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/DiagnoseCommand.php', 'Composer\\Command\\DumpAutoloadCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/DumpAutoloadCommand.php', 'Composer\\Command\\ExecCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ExecCommand.php', 'Composer\\Command\\FundCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/FundCommand.php', 'Composer\\Command\\GlobalCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/GlobalCommand.php', 'Composer\\Command\\HomeCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/HomeCommand.php', 'Composer\\Command\\InitCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/InitCommand.php', 'Composer\\Command\\InstallCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/InstallCommand.php', 'Composer\\Command\\LicensesCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/LicensesCommand.php', 'Composer\\Command\\OutdatedCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/OutdatedCommand.php', 'Composer\\Command\\PackageDiscoveryTrait' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/PackageDiscoveryTrait.php', 'Composer\\Command\\ProhibitsCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ProhibitsCommand.php', 'Composer\\Command\\ReinstallCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ReinstallCommand.php', 'Composer\\Command\\RemoveCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/RemoveCommand.php', 'Composer\\Command\\RequireCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/RequireCommand.php', 'Composer\\Command\\RunScriptCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/RunScriptCommand.php', 'Composer\\Command\\ScriptAliasCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ScriptAliasCommand.php', 'Composer\\Command\\SearchCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/SearchCommand.php', 'Composer\\Command\\SelfUpdateCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/SelfUpdateCommand.php', 'Composer\\Command\\ShowCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ShowCommand.php', 'Composer\\Command\\StatusCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/StatusCommand.php', 'Composer\\Command\\SuggestsCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/SuggestsCommand.php', 'Composer\\Command\\UpdateCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/UpdateCommand.php', 'Composer\\Command\\ValidateCommand' => __DIR__ . '/..' . '/composer/composer/src/Composer/Command/ValidateCommand.php', 'Composer\\Compiler' => __DIR__ . '/..' . '/composer/composer/src/Composer/Compiler.php', 'Composer\\Composer' => __DIR__ . '/..' . '/composer/composer/src/Composer/Composer.php', 'Composer\\Config' => __DIR__ . '/..' . '/composer/composer/src/Composer/Config.php', 'Composer\\Config\\ConfigSourceInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Config/ConfigSourceInterface.php', 'Composer\\Config\\JsonConfigSource' => __DIR__ . '/..' . '/composer/composer/src/Composer/Config/JsonConfigSource.php', 'Composer\\Console\\Application' => __DIR__ . '/..' . '/composer/composer/src/Composer/Console/Application.php', 'Composer\\Console\\GithubActionError' => __DIR__ . '/..' . '/composer/composer/src/Composer/Console/GithubActionError.php', 'Composer\\Console\\HtmlOutputFormatter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Console/HtmlOutputFormatter.php', 'Composer\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/composer/composer/src/Composer/Console/Input/InputArgument.php', 'Composer\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/composer/composer/src/Composer/Console/Input/InputOption.php', 'Composer\\DependencyResolver\\Decisions' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Decisions.php', 'Composer\\DependencyResolver\\DefaultPolicy' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/DefaultPolicy.php', 'Composer\\DependencyResolver\\GenericRule' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/GenericRule.php', 'Composer\\DependencyResolver\\LocalRepoTransaction' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/LocalRepoTransaction.php', 'Composer\\DependencyResolver\\LockTransaction' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/LockTransaction.php', 'Composer\\DependencyResolver\\MultiConflictRule' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/MultiConflictRule.php', 'Composer\\DependencyResolver\\Operation\\InstallOperation' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/InstallOperation.php', 'Composer\\DependencyResolver\\Operation\\MarkAliasInstalledOperation' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php', 'Composer\\DependencyResolver\\Operation\\MarkAliasUninstalledOperation' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php', 'Composer\\DependencyResolver\\Operation\\OperationInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/OperationInterface.php', 'Composer\\DependencyResolver\\Operation\\SolverOperation' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/SolverOperation.php', 'Composer\\DependencyResolver\\Operation\\UninstallOperation' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/UninstallOperation.php', 'Composer\\DependencyResolver\\Operation\\UpdateOperation' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Operation/UpdateOperation.php', 'Composer\\DependencyResolver\\PolicyInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/PolicyInterface.php', 'Composer\\DependencyResolver\\Pool' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Pool.php', 'Composer\\DependencyResolver\\PoolBuilder' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php', 'Composer\\DependencyResolver\\PoolOptimizer' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/PoolOptimizer.php', 'Composer\\DependencyResolver\\Problem' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Problem.php', 'Composer\\DependencyResolver\\Request' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Request.php', 'Composer\\DependencyResolver\\Rule' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Rule.php', 'Composer\\DependencyResolver\\Rule2Literals' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Rule2Literals.php', 'Composer\\DependencyResolver\\RuleSet' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/RuleSet.php', 'Composer\\DependencyResolver\\RuleSetGenerator' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/RuleSetGenerator.php', 'Composer\\DependencyResolver\\RuleSetIterator' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/RuleSetIterator.php', 'Composer\\DependencyResolver\\RuleWatchChain' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/RuleWatchChain.php', 'Composer\\DependencyResolver\\RuleWatchGraph' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/RuleWatchGraph.php', 'Composer\\DependencyResolver\\RuleWatchNode' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/RuleWatchNode.php', 'Composer\\DependencyResolver\\Solver' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Solver.php', 'Composer\\DependencyResolver\\SolverBugException' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/SolverBugException.php', 'Composer\\DependencyResolver\\SolverProblemsException' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/SolverProblemsException.php', 'Composer\\DependencyResolver\\Transaction' => __DIR__ . '/..' . '/composer/composer/src/Composer/DependencyResolver/Transaction.php', 'Composer\\Downloader\\ArchiveDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/ArchiveDownloader.php', 'Composer\\Downloader\\ChangeReportInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/ChangeReportInterface.php', 'Composer\\Downloader\\DownloadManager' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/DownloadManager.php', 'Composer\\Downloader\\DownloaderInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/DownloaderInterface.php', 'Composer\\Downloader\\DvcsDownloaderInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/DvcsDownloaderInterface.php', 'Composer\\Downloader\\FileDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/FileDownloader.php', 'Composer\\Downloader\\FilesystemException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/FilesystemException.php', 'Composer\\Downloader\\FossilDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/FossilDownloader.php', 'Composer\\Downloader\\GitDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/GitDownloader.php', 'Composer\\Downloader\\GzipDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/GzipDownloader.php', 'Composer\\Downloader\\HgDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/HgDownloader.php', 'Composer\\Downloader\\MaxFileSizeExceededException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/MaxFileSizeExceededException.php', 'Composer\\Downloader\\PathDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/PathDownloader.php', 'Composer\\Downloader\\PerforceDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/PerforceDownloader.php', 'Composer\\Downloader\\PharDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/PharDownloader.php', 'Composer\\Downloader\\RarDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/RarDownloader.php', 'Composer\\Downloader\\SvnDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/SvnDownloader.php', 'Composer\\Downloader\\TarDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/TarDownloader.php', 'Composer\\Downloader\\TransportException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/TransportException.php', 'Composer\\Downloader\\VcsCapableDownloaderInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/VcsCapableDownloaderInterface.php', 'Composer\\Downloader\\VcsDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/VcsDownloader.php', 'Composer\\Downloader\\XzDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/XzDownloader.php', 'Composer\\Downloader\\ZipDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Downloader/ZipDownloader.php', 'Composer\\EventDispatcher\\Event' => __DIR__ . '/..' . '/composer/composer/src/Composer/EventDispatcher/Event.php', 'Composer\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php', 'Composer\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/EventDispatcher/EventSubscriberInterface.php', 'Composer\\EventDispatcher\\ScriptExecutionException' => __DIR__ . '/..' . '/composer/composer/src/Composer/EventDispatcher/ScriptExecutionException.php', 'Composer\\Exception\\IrrecoverableDownloadException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Exception/IrrecoverableDownloadException.php', 'Composer\\Exception\\NoSslException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Exception/NoSslException.php', 'Composer\\Factory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Factory.php', 'Composer\\Filter\\PlatformRequirementFilter\\IgnoreAllPlatformRequirementFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.php', 'Composer\\Filter\\PlatformRequirementFilter\\IgnoreListPlatformRequirementFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php', 'Composer\\Filter\\PlatformRequirementFilter\\IgnoreNothingPlatformRequirementFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.php', 'Composer\\Filter\\PlatformRequirementFilter\\PlatformRequirementFilterFactory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.php', 'Composer\\Filter\\PlatformRequirementFilter\\PlatformRequirementFilterInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.php', 'Composer\\IO\\BaseIO' => __DIR__ . '/..' . '/composer/composer/src/Composer/IO/BaseIO.php', 'Composer\\IO\\BufferIO' => __DIR__ . '/..' . '/composer/composer/src/Composer/IO/BufferIO.php', 'Composer\\IO\\ConsoleIO' => __DIR__ . '/..' . '/composer/composer/src/Composer/IO/ConsoleIO.php', 'Composer\\IO\\IOInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/IO/IOInterface.php', 'Composer\\IO\\NullIO' => __DIR__ . '/..' . '/composer/composer/src/Composer/IO/NullIO.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Composer\\Installer' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer.php', 'Composer\\Installer\\BinaryInstaller' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/BinaryInstaller.php', 'Composer\\Installer\\BinaryPresenceInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/BinaryPresenceInterface.php', 'Composer\\Installer\\InstallationManager' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/InstallationManager.php', 'Composer\\Installer\\InstallerEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/InstallerEvent.php', 'Composer\\Installer\\InstallerEvents' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/InstallerEvents.php', 'Composer\\Installer\\InstallerInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/InstallerInterface.php', 'Composer\\Installer\\LibraryInstaller' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/LibraryInstaller.php', 'Composer\\Installer\\MetapackageInstaller' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/MetapackageInstaller.php', 'Composer\\Installer\\NoopInstaller' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/NoopInstaller.php', 'Composer\\Installer\\PackageEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/PackageEvent.php', 'Composer\\Installer\\PackageEvents' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/PackageEvents.php', 'Composer\\Installer\\PluginInstaller' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/PluginInstaller.php', 'Composer\\Installer\\ProjectInstaller' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/ProjectInstaller.php', 'Composer\\Installer\\SuggestedPackagesReporter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Installer/SuggestedPackagesReporter.php', 'Composer\\Json\\JsonFile' => __DIR__ . '/..' . '/composer/composer/src/Composer/Json/JsonFile.php', 'Composer\\Json\\JsonFormatter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Json/JsonFormatter.php', 'Composer\\Json\\JsonManipulator' => __DIR__ . '/..' . '/composer/composer/src/Composer/Json/JsonManipulator.php', 'Composer\\Json\\JsonValidationException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Json/JsonValidationException.php', 'Composer\\MetadataMinifier\\MetadataMinifier' => __DIR__ . '/..' . '/composer/metadata-minifier/src/MetadataMinifier.php', 'Composer\\PHPStan\\ConfigReturnTypeExtension' => __DIR__ . '/..' . '/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.php', 'Composer\\PHPStan\\RuleReasonDataReturnTypeExtension' => __DIR__ . '/..' . '/composer/composer/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php', 'Composer\\Package\\AliasPackage' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/AliasPackage.php', 'Composer\\Package\\Archiver\\ArchivableFilesFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/ArchivableFilesFilter.php', 'Composer\\Package\\Archiver\\ArchivableFilesFinder' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/ArchivableFilesFinder.php', 'Composer\\Package\\Archiver\\ArchiveManager' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/ArchiveManager.php', 'Composer\\Package\\Archiver\\ArchiverInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/ArchiverInterface.php', 'Composer\\Package\\Archiver\\BaseExcludeFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/BaseExcludeFilter.php', 'Composer\\Package\\Archiver\\ComposerExcludeFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/ComposerExcludeFilter.php', 'Composer\\Package\\Archiver\\GitExcludeFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/GitExcludeFilter.php', 'Composer\\Package\\Archiver\\PharArchiver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/PharArchiver.php', 'Composer\\Package\\Archiver\\ZipArchiver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php', 'Composer\\Package\\BasePackage' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/BasePackage.php', 'Composer\\Package\\Comparer\\Comparer' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Comparer/Comparer.php', 'Composer\\Package\\CompleteAliasPackage' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/CompleteAliasPackage.php', 'Composer\\Package\\CompletePackage' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/CompletePackage.php', 'Composer\\Package\\CompletePackageInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/CompletePackageInterface.php', 'Composer\\Package\\Dumper\\ArrayDumper' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Dumper/ArrayDumper.php', 'Composer\\Package\\Link' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Link.php', 'Composer\\Package\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Loader/ArrayLoader.php', 'Composer\\Package\\Loader\\InvalidPackageException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Loader/InvalidPackageException.php', 'Composer\\Package\\Loader\\JsonLoader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Loader/JsonLoader.php', 'Composer\\Package\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Loader/LoaderInterface.php', 'Composer\\Package\\Loader\\RootPackageLoader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Loader/RootPackageLoader.php', 'Composer\\Package\\Loader\\ValidatingArrayLoader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php', 'Composer\\Package\\Locker' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Locker.php', 'Composer\\Package\\Package' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Package.php', 'Composer\\Package\\PackageInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/PackageInterface.php', 'Composer\\Package\\RootAliasPackage' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/RootAliasPackage.php', 'Composer\\Package\\RootPackage' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/RootPackage.php', 'Composer\\Package\\RootPackageInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/RootPackageInterface.php', 'Composer\\Package\\Version\\StabilityFilter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Version/StabilityFilter.php', 'Composer\\Package\\Version\\VersionBumper' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Version/VersionBumper.php', 'Composer\\Package\\Version\\VersionGuesser' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Version/VersionGuesser.php', 'Composer\\Package\\Version\\VersionParser' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Version/VersionParser.php', 'Composer\\Package\\Version\\VersionSelector' => __DIR__ . '/..' . '/composer/composer/src/Composer/Package/Version/VersionSelector.php', 'Composer\\PartialComposer' => __DIR__ . '/..' . '/composer/composer/src/Composer/PartialComposer.php', 'Composer\\Pcre\\MatchAllResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllResult.php', 'Composer\\Pcre\\MatchAllStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllStrictGroupsResult.php', 'Composer\\Pcre\\MatchAllWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchAllWithOffsetsResult.php', 'Composer\\Pcre\\MatchResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchResult.php', 'Composer\\Pcre\\MatchStrictGroupsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchStrictGroupsResult.php', 'Composer\\Pcre\\MatchWithOffsetsResult' => __DIR__ . '/..' . '/composer/pcre/src/MatchWithOffsetsResult.php', 'Composer\\Pcre\\PHPStan\\InvalidRegexPatternRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/InvalidRegexPatternRule.php', 'Composer\\Pcre\\PHPStan\\PregMatchFlags' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchFlags.php', 'Composer\\Pcre\\PHPStan\\PregMatchParameterOutTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchParameterOutTypeExtension.php', 'Composer\\Pcre\\PHPStan\\PregMatchTypeSpecifyingExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregMatchTypeSpecifyingExtension.php', 'Composer\\Pcre\\PHPStan\\PregReplaceCallbackClosureTypeExtension' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/PregReplaceCallbackClosureTypeExtension.php', 'Composer\\Pcre\\PHPStan\\UnsafeStrictGroupsCallRule' => __DIR__ . '/..' . '/composer/pcre/src/PHPStan/UnsafeStrictGroupsCallRule.php', 'Composer\\Pcre\\PcreException' => __DIR__ . '/..' . '/composer/pcre/src/PcreException.php', 'Composer\\Pcre\\Preg' => __DIR__ . '/..' . '/composer/pcre/src/Preg.php', 'Composer\\Pcre\\Regex' => __DIR__ . '/..' . '/composer/pcre/src/Regex.php', 'Composer\\Pcre\\ReplaceResult' => __DIR__ . '/..' . '/composer/pcre/src/ReplaceResult.php', 'Composer\\Pcre\\UnexpectedNullMatchException' => __DIR__ . '/..' . '/composer/pcre/src/UnexpectedNullMatchException.php', 'Composer\\Platform\\HhvmDetector' => __DIR__ . '/..' . '/composer/composer/src/Composer/Platform/HhvmDetector.php', 'Composer\\Platform\\Runtime' => __DIR__ . '/..' . '/composer/composer/src/Composer/Platform/Runtime.php', 'Composer\\Platform\\Version' => __DIR__ . '/..' . '/composer/composer/src/Composer/Platform/Version.php', 'Composer\\Plugin\\Capability\\Capability' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/Capability/Capability.php', 'Composer\\Plugin\\Capability\\CommandProvider' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/Capability/CommandProvider.php', 'Composer\\Plugin\\Capable' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/Capable.php', 'Composer\\Plugin\\CommandEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/CommandEvent.php', 'Composer\\Plugin\\PluginBlockedException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PluginBlockedException.php', 'Composer\\Plugin\\PluginEvents' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PluginEvents.php', 'Composer\\Plugin\\PluginInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PluginInterface.php', 'Composer\\Plugin\\PluginManager' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PluginManager.php', 'Composer\\Plugin\\PostFileDownloadEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PostFileDownloadEvent.php', 'Composer\\Plugin\\PreCommandRunEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PreCommandRunEvent.php', 'Composer\\Plugin\\PreFileDownloadEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PreFileDownloadEvent.php', 'Composer\\Plugin\\PrePoolCreateEvent' => __DIR__ . '/..' . '/composer/composer/src/Composer/Plugin/PrePoolCreateEvent.php', 'Composer\\Question\\StrictConfirmationQuestion' => __DIR__ . '/..' . '/composer/composer/src/Composer/Question/StrictConfirmationQuestion.php', 'Composer\\Repository\\AdvisoryProviderInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/AdvisoryProviderInterface.php', 'Composer\\Repository\\ArrayRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/ArrayRepository.php', 'Composer\\Repository\\ArtifactRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/ArtifactRepository.php', 'Composer\\Repository\\CanonicalPackagesTrait' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/CanonicalPackagesTrait.php', 'Composer\\Repository\\ComposerRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/ComposerRepository.php', 'Composer\\Repository\\CompositeRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/CompositeRepository.php', 'Composer\\Repository\\ConfigurableRepositoryInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/ConfigurableRepositoryInterface.php', 'Composer\\Repository\\FilesystemRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/FilesystemRepository.php', 'Composer\\Repository\\FilterRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/FilterRepository.php', 'Composer\\Repository\\InstalledArrayRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/InstalledArrayRepository.php', 'Composer\\Repository\\InstalledFilesystemRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/InstalledFilesystemRepository.php', 'Composer\\Repository\\InstalledRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/InstalledRepository.php', 'Composer\\Repository\\InstalledRepositoryInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/InstalledRepositoryInterface.php', 'Composer\\Repository\\InvalidRepositoryException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/InvalidRepositoryException.php', 'Composer\\Repository\\LockArrayRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/LockArrayRepository.php', 'Composer\\Repository\\PackageRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/PackageRepository.php', 'Composer\\Repository\\PathRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/PathRepository.php', 'Composer\\Repository\\PearRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/PearRepository.php', 'Composer\\Repository\\PlatformRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/PlatformRepository.php', 'Composer\\Repository\\RepositoryFactory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RepositoryFactory.php', 'Composer\\Repository\\RepositoryInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RepositoryInterface.php', 'Composer\\Repository\\RepositoryManager' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RepositoryManager.php', 'Composer\\Repository\\RepositorySecurityException' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RepositorySecurityException.php', 'Composer\\Repository\\RepositorySet' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RepositorySet.php', 'Composer\\Repository\\RepositoryUtils' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RepositoryUtils.php', 'Composer\\Repository\\RootPackageRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/RootPackageRepository.php', 'Composer\\Repository\\VcsRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/VcsRepository.php', 'Composer\\Repository\\Vcs\\FossilDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/FossilDriver.php', 'Composer\\Repository\\Vcs\\GitBitbucketDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php', 'Composer\\Repository\\Vcs\\GitDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/GitDriver.php', 'Composer\\Repository\\Vcs\\GitHubDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php', 'Composer\\Repository\\Vcs\\GitLabDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/GitLabDriver.php', 'Composer\\Repository\\Vcs\\HgDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/HgDriver.php', 'Composer\\Repository\\Vcs\\PerforceDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/PerforceDriver.php', 'Composer\\Repository\\Vcs\\SvnDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php', 'Composer\\Repository\\Vcs\\VcsDriver' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/VcsDriver.php', 'Composer\\Repository\\Vcs\\VcsDriverInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/Vcs/VcsDriverInterface.php', 'Composer\\Repository\\VersionCacheInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/VersionCacheInterface.php', 'Composer\\Repository\\WritableArrayRepository' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/WritableArrayRepository.php', 'Composer\\Repository\\WritableRepositoryInterface' => __DIR__ . '/..' . '/composer/composer/src/Composer/Repository/WritableRepositoryInterface.php', 'Composer\\Script\\Event' => __DIR__ . '/..' . '/composer/composer/src/Composer/Script/Event.php', 'Composer\\Script\\ScriptEvents' => __DIR__ . '/..' . '/composer/composer/src/Composer/Script/ScriptEvents.php', 'Composer\\SelfUpdate\\Keys' => __DIR__ . '/..' . '/composer/composer/src/Composer/SelfUpdate/Keys.php', 'Composer\\SelfUpdate\\Versions' => __DIR__ . '/..' . '/composer/composer/src/Composer/SelfUpdate/Versions.php', 'Composer\\Semver\\Comparator' => __DIR__ . '/..' . '/composer/semver/src/Comparator.php', 'Composer\\Semver\\CompilingMatcher' => __DIR__ . '/..' . '/composer/semver/src/CompilingMatcher.php', 'Composer\\Semver\\Constraint\\Bound' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Bound.php', 'Composer\\Semver\\Constraint\\Constraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/Constraint.php', 'Composer\\Semver\\Constraint\\ConstraintInterface' => __DIR__ . '/..' . '/composer/semver/src/Constraint/ConstraintInterface.php', 'Composer\\Semver\\Constraint\\MatchAllConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchAllConstraint.php', 'Composer\\Semver\\Constraint\\MatchNoneConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MatchNoneConstraint.php', 'Composer\\Semver\\Constraint\\MultiConstraint' => __DIR__ . '/..' . '/composer/semver/src/Constraint/MultiConstraint.php', 'Composer\\Semver\\Interval' => __DIR__ . '/..' . '/composer/semver/src/Interval.php', 'Composer\\Semver\\Intervals' => __DIR__ . '/..' . '/composer/semver/src/Intervals.php', 'Composer\\Semver\\Semver' => __DIR__ . '/..' . '/composer/semver/src/Semver.php', 'Composer\\Semver\\VersionParser' => __DIR__ . '/..' . '/composer/semver/src/VersionParser.php', 'Composer\\Spdx\\SpdxLicenses' => __DIR__ . '/..' . '/composer/spdx-licenses/src/SpdxLicenses.php', 'Composer\\Util\\AuthHelper' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/AuthHelper.php', 'Composer\\Util\\Bitbucket' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Bitbucket.php', 'Composer\\Util\\ComposerMirror' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/ComposerMirror.php', 'Composer\\Util\\ConfigValidator' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/ConfigValidator.php', 'Composer\\Util\\ErrorHandler' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/ErrorHandler.php', 'Composer\\Util\\Filesystem' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Filesystem.php', 'Composer\\Util\\Git' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Git.php', 'Composer\\Util\\GitHub' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/GitHub.php', 'Composer\\Util\\GitLab' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/GitLab.php', 'Composer\\Util\\Hg' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Hg.php', 'Composer\\Util\\HttpDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/HttpDownloader.php', 'Composer\\Util\\Http\\CurlDownloader' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Http/CurlDownloader.php', 'Composer\\Util\\Http\\CurlResponse' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Http/CurlResponse.php', 'Composer\\Util\\Http\\ProxyItem' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Http/ProxyItem.php', 'Composer\\Util\\Http\\ProxyManager' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Http/ProxyManager.php', 'Composer\\Util\\Http\\RequestProxy' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Http/RequestProxy.php', 'Composer\\Util\\Http\\Response' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Http/Response.php', 'Composer\\Util\\IniHelper' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/IniHelper.php', 'Composer\\Util\\Loop' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Loop.php', 'Composer\\Util\\MetadataMinifier' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/MetadataMinifier.php', 'Composer\\Util\\NoProxyPattern' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/NoProxyPattern.php', 'Composer\\Util\\PackageInfo' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/PackageInfo.php', 'Composer\\Util\\PackageSorter' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/PackageSorter.php', 'Composer\\Util\\Perforce' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Perforce.php', 'Composer\\Util\\Platform' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Platform.php', 'Composer\\Util\\ProcessExecutor' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/ProcessExecutor.php', 'Composer\\Util\\RemoteFilesystem' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/RemoteFilesystem.php', 'Composer\\Util\\Silencer' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Silencer.php', 'Composer\\Util\\StreamContextFactory' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/StreamContextFactory.php', 'Composer\\Util\\Svn' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Svn.php', 'Composer\\Util\\SyncHelper' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/SyncHelper.php', 'Composer\\Util\\Tar' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Tar.php', 'Composer\\Util\\TlsHelper' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/TlsHelper.php', 'Composer\\Util\\Url' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Url.php', 'Composer\\Util\\Zip' => __DIR__ . '/..' . '/composer/composer/src/Composer/Util/Zip.php', 'Composer\\XdebugHandler\\PhpConfig' => __DIR__ . '/..' . '/composer/xdebug-handler/src/PhpConfig.php', 'Composer\\XdebugHandler\\Process' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Process.php', 'Composer\\XdebugHandler\\Status' => __DIR__ . '/..' . '/composer/xdebug-handler/src/Status.php', 'Composer\\XdebugHandler\\XdebugHandler' => __DIR__ . '/..' . '/composer/xdebug-handler/src/XdebugHandler.php', 'DateError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateError.php', 'DateException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateException.php', 'DateInvalidOperationException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', 'DateInvalidTimeZoneException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php', 'DateMalformedIntervalStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php', 'DateMalformedPeriodStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php', 'DateMalformedStringException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php', 'DateObjectError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateObjectError.php', 'DateRangeError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Override' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/Override.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', 'React\\Promise\\Deferred' => __DIR__ . '/..' . '/react/promise/src/Deferred.php', 'React\\Promise\\Exception\\CompositeException' => __DIR__ . '/..' . '/react/promise/src/Exception/CompositeException.php', 'React\\Promise\\Exception\\LengthException' => __DIR__ . '/..' . '/react/promise/src/Exception/LengthException.php', 'React\\Promise\\Internal\\CancellationQueue' => __DIR__ . '/..' . '/react/promise/src/Internal/CancellationQueue.php', 'React\\Promise\\Internal\\FulfilledPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/FulfilledPromise.php', 'React\\Promise\\Internal\\RejectedPromise' => __DIR__ . '/..' . '/react/promise/src/Internal/RejectedPromise.php', 'React\\Promise\\Promise' => __DIR__ . '/..' . '/react/promise/src/Promise.php', 'React\\Promise\\PromiseInterface' => __DIR__ . '/..' . '/react/promise/src/PromiseInterface.php', 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'SQLite3Exception' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php', 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', 'Symfony\\Polyfill\\Php81\\Php81' => __DIR__ . '/..' . '/symfony/polyfill-php81/Php81.php', 'Symfony\\Polyfill\\Php83\\Php83' => __DIR__ . '/..' . '/symfony/polyfill-php83/Php83.php', 'Symfony\\Polyfill\\Uuid\\Uuid' => __DIR__ . '/..' . '/symfony/polyfill-uuid/Uuid.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', '_ContaoManager\\Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php', '_ContaoManager\\Brick\\Math\\BigInteger' => __DIR__ . '/..' . '/brick/math/src/BigInteger.php', '_ContaoManager\\Brick\\Math\\BigNumber' => __DIR__ . '/..' . '/brick/math/src/BigNumber.php', '_ContaoManager\\Brick\\Math\\BigRational' => __DIR__ . '/..' . '/brick/math/src/BigRational.php', '_ContaoManager\\Brick\\Math\\Exception\\DivisionByZeroException' => __DIR__ . '/..' . '/brick/math/src/Exception/DivisionByZeroException.php', '_ContaoManager\\Brick\\Math\\Exception\\IntegerOverflowException' => __DIR__ . '/..' . '/brick/math/src/Exception/IntegerOverflowException.php', '_ContaoManager\\Brick\\Math\\Exception\\MathException' => __DIR__ . '/..' . '/brick/math/src/Exception/MathException.php', '_ContaoManager\\Brick\\Math\\Exception\\NegativeNumberException' => __DIR__ . '/..' . '/brick/math/src/Exception/NegativeNumberException.php', '_ContaoManager\\Brick\\Math\\Exception\\NumberFormatException' => __DIR__ . '/..' . '/brick/math/src/Exception/NumberFormatException.php', '_ContaoManager\\Brick\\Math\\Exception\\RoundingNecessaryException' => __DIR__ . '/..' . '/brick/math/src/Exception/RoundingNecessaryException.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator\\BcMathCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/BcMathCalculator.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator\\GmpCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/GmpCalculator.php', '_ContaoManager\\Brick\\Math\\Internal\\Calculator\\NativeCalculator' => __DIR__ . '/..' . '/brick/math/src/Internal/Calculator/NativeCalculator.php', '_ContaoManager\\Brick\\Math\\RoundingMode' => __DIR__ . '/..' . '/brick/math/src/RoundingMode.php', '_ContaoManager\\CBOR\\AbstractCBORObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/AbstractCBORObject.php', '_ContaoManager\\CBOR\\ByteStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/ByteStringObject.php', '_ContaoManager\\CBOR\\CBORObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/CBORObject.php', '_ContaoManager\\CBOR\\Decoder' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Decoder.php', '_ContaoManager\\CBOR\\DecoderInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/DecoderInterface.php', '_ContaoManager\\CBOR\\IndefiniteLengthByteStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthByteStringObject.php', '_ContaoManager\\CBOR\\IndefiniteLengthListObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthListObject.php', '_ContaoManager\\CBOR\\IndefiniteLengthMapObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthMapObject.php', '_ContaoManager\\CBOR\\IndefiniteLengthTextStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/IndefiniteLengthTextStringObject.php', '_ContaoManager\\CBOR\\LengthCalculator' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/LengthCalculator.php', '_ContaoManager\\CBOR\\ListObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/ListObject.php', '_ContaoManager\\CBOR\\MapItem' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/MapItem.php', '_ContaoManager\\CBOR\\MapObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/MapObject.php', '_ContaoManager\\CBOR\\NegativeIntegerObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/NegativeIntegerObject.php', '_ContaoManager\\CBOR\\Normalizable' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Normalizable.php', '_ContaoManager\\CBOR\\OtherObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject.php', '_ContaoManager\\CBOR\\OtherObject\\BreakObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/BreakObject.php', '_ContaoManager\\CBOR\\OtherObject\\DoublePrecisionFloatObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/DoublePrecisionFloatObject.php', '_ContaoManager\\CBOR\\OtherObject\\FalseObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/FalseObject.php', '_ContaoManager\\CBOR\\OtherObject\\GenericObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/GenericObject.php', '_ContaoManager\\CBOR\\OtherObject\\HalfPrecisionFloatObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/HalfPrecisionFloatObject.php', '_ContaoManager\\CBOR\\OtherObject\\NullObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/NullObject.php', '_ContaoManager\\CBOR\\OtherObject\\OtherObjectInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectInterface.php', '_ContaoManager\\CBOR\\OtherObject\\OtherObjectManager' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManager.php', '_ContaoManager\\CBOR\\OtherObject\\OtherObjectManagerInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/OtherObjectManagerInterface.php', '_ContaoManager\\CBOR\\OtherObject\\SimpleObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/SimpleObject.php', '_ContaoManager\\CBOR\\OtherObject\\SinglePrecisionFloatObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/SinglePrecisionFloatObject.php', '_ContaoManager\\CBOR\\OtherObject\\TrueObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/TrueObject.php', '_ContaoManager\\CBOR\\OtherObject\\UndefinedObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/OtherObject/UndefinedObject.php', '_ContaoManager\\CBOR\\Stream' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Stream.php', '_ContaoManager\\CBOR\\StringStream' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/StringStream.php', '_ContaoManager\\CBOR\\Tag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag.php', '_ContaoManager\\CBOR\\Tag\\Base16EncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base16EncodingTag.php', '_ContaoManager\\CBOR\\Tag\\Base64EncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64EncodingTag.php', '_ContaoManager\\CBOR\\Tag\\Base64Tag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64Tag.php', '_ContaoManager\\CBOR\\Tag\\Base64UrlEncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64UrlEncodingTag.php', '_ContaoManager\\CBOR\\Tag\\Base64UrlTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/Base64UrlTag.php', '_ContaoManager\\CBOR\\Tag\\BigFloatTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/BigFloatTag.php', '_ContaoManager\\CBOR\\Tag\\CBOREncodingTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/CBOREncodingTag.php', '_ContaoManager\\CBOR\\Tag\\CBORTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/CBORTag.php', '_ContaoManager\\CBOR\\Tag\\DatetimeTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/DatetimeTag.php', '_ContaoManager\\CBOR\\Tag\\DecimalFractionTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php', '_ContaoManager\\CBOR\\Tag\\GenericTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/GenericTag.php', '_ContaoManager\\CBOR\\Tag\\MimeTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/MimeTag.php', '_ContaoManager\\CBOR\\Tag\\NegativeBigIntegerTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/NegativeBigIntegerTag.php', '_ContaoManager\\CBOR\\Tag\\TagInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TagInterface.php', '_ContaoManager\\CBOR\\Tag\\TagManager' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TagManager.php', '_ContaoManager\\CBOR\\Tag\\TagManagerInterface' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TagManagerInterface.php', '_ContaoManager\\CBOR\\Tag\\TimestampTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/TimestampTag.php', '_ContaoManager\\CBOR\\Tag\\UnsignedBigIntegerTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/UnsignedBigIntegerTag.php', '_ContaoManager\\CBOR\\Tag\\UriTag' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Tag/UriTag.php', '_ContaoManager\\CBOR\\TextStringObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/TextStringObject.php', '_ContaoManager\\CBOR\\UnsignedIntegerObject' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/UnsignedIntegerObject.php', '_ContaoManager\\CBOR\\Utils' => __DIR__ . '/..' . '/spomky-labs/cbor-php/src/Utils.php', '_ContaoManager\\Contao\\ManagerApi\\ApiApplication' => __DIR__ . '/../..' . '/api/ApiApplication.php', '_ContaoManager\\Contao\\ManagerApi\\ApiKernel' => __DIR__ . '/../..' . '/api/ApiKernel.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\AboutCommand' => __DIR__ . '/../..' . '/api/Command/AboutCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\IntegrityCheckCommand' => __DIR__ . '/../..' . '/api/Command/IntegrityCheckCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\ProcessRunnerCommand' => __DIR__ . '/../..' . '/api/Command/ProcessRunnerCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskAbortCommand' => __DIR__ . '/../..' . '/api/Command/TaskAbortCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskDeleteCommand' => __DIR__ . '/../..' . '/api/Command/TaskDeleteCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\TaskUpdateCommand' => __DIR__ . '/../..' . '/api/Command/TaskUpdateCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Command\\UpdateCommand' => __DIR__ . '/../..' . '/api/Command/UpdateCommand.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudChanges' => __DIR__ . '/../..' . '/api/Composer/CloudChanges.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudException' => __DIR__ . '/../..' . '/api/Composer/CloudException.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudJob' => __DIR__ . '/../..' . '/api/Composer/CloudJob.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\CloudResolver' => __DIR__ . '/../..' . '/api/Composer/CloudResolver.php', '_ContaoManager\\Contao\\ManagerApi\\Composer\\Environment' => __DIR__ . '/../..' . '/api/Composer/Environment.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\AbstractConfig' => __DIR__ . '/../..' . '/api/Config/AbstractConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\AuthConfig' => __DIR__ . '/../..' . '/api/Config/AuthConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\ComposerConfig' => __DIR__ . '/../..' . '/api/Config/ComposerConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\ManagerConfig' => __DIR__ . '/../..' . '/api/Config/ManagerConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\PartialConfig' => __DIR__ . '/../..' . '/api/Config/PartialConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\UploadsConfig' => __DIR__ . '/../..' . '/api/Config/UploadsConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Config\\UserConfig' => __DIR__ . '/../..' . '/api/Config/UserConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AbstractConfigController' => __DIR__ . '/../..' . '/api/Controller/Config/AbstractConfigController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\AuthController' => __DIR__ . '/../..' . '/api/Controller/Config/AuthController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ComposerController' => __DIR__ . '/../..' . '/api/Controller/Config/ComposerController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Config\\ManagerController' => __DIR__ . '/../..' . '/api/Controller/Config/ManagerController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\ConstraintController' => __DIR__ . '/../..' . '/api/Controller/ConstraintController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\AccessKeyController' => __DIR__ . '/../..' . '/api/Controller/Contao/AccessKeyController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\BackupController' => __DIR__ . '/../..' . '/api/Controller/Contao/BackupController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\DatabaseMigrationController' => __DIR__ . '/../..' . '/api/Controller/Contao/DatabaseMigrationController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\InstallToolLockController' => __DIR__ . '/../..' . '/api/Controller/Contao/InstallToolLockController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\JwtCookieController' => __DIR__ . '/../..' . '/api/Controller/Contao/JwtCookieController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Contao\\MaintenanceModeController' => __DIR__ . '/../..' . '/api/Controller/Contao/MaintenanceModeController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\FileController' => __DIR__ . '/../..' . '/api/Controller/FileController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\LogController' => __DIR__ . '/../..' . '/api/Controller/LogController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\CloudController' => __DIR__ . '/../..' . '/api/Controller/Packages/CloudController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\LocalPackagesController' => __DIR__ . '/../..' . '/api/Controller/Packages/LocalPackagesController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\MissingPackagesController' => __DIR__ . '/../..' . '/api/Controller/Packages/MissingPackagesController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\RootPackageController' => __DIR__ . '/../..' . '/api/Controller/Packages/RootPackageController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Packages\\UploadPackagesController' => __DIR__ . '/../..' . '/api/Controller/Packages/UploadPackagesController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\AdminUserController' => __DIR__ . '/../..' . '/api/Controller/Server/AdminUserController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ComposerController' => __DIR__ . '/../..' . '/api/Controller/Server/ComposerController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ConfigController' => __DIR__ . '/../..' . '/api/Controller/Server/ConfigController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\ContaoController' => __DIR__ . '/../..' . '/api/Controller/Server/ContaoController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\DatabaseController' => __DIR__ . '/../..' . '/api/Controller/Server/DatabaseController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\OpcacheController' => __DIR__ . '/../..' . '/api/Controller/Server/OpcacheController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpCliController' => __DIR__ . '/../..' . '/api/Controller/Server/PhpCliController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpWebController' => __DIR__ . '/../..' . '/api/Controller/Server/PhpWebController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\PhpinfoController' => __DIR__ . '/../..' . '/api/Controller/Server/PhpinfoController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\Server\\SelfUpdateController' => __DIR__ . '/../..' . '/api/Controller/Server/SelfUpdateController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\SessionController' => __DIR__ . '/../..' . '/api/Controller/SessionController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\TaskController' => __DIR__ . '/../..' . '/api/Controller/TaskController.php', '_ContaoManager\\Contao\\ManagerApi\\Controller\\UserController' => __DIR__ . '/../..' . '/api/Controller/UserController.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\CheckTotpListener' => __DIR__ . '/../..' . '/api/EventListener/CheckTotpListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\ExceptionListener' => __DIR__ . '/../..' . '/api/EventListener/ExceptionListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\JsonRequestListener' => __DIR__ . '/../..' . '/api/EventListener/JsonRequestListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\LocaleListener' => __DIR__ . '/../..' . '/api/EventListener/LocaleListener.php', '_ContaoManager\\Contao\\ManagerApi\\EventListener\\SecurityListener' => __DIR__ . '/../..' . '/api/EventListener/SecurityListener.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\ApiProblemException' => __DIR__ . '/../..' . '/api/Exception/ApiProblemException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\InvalidJsonException' => __DIR__ . '/../..' . '/api/Exception/InvalidJsonException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\InvalidTotpException' => __DIR__ . '/../..' . '/api/Exception/InvalidTotpException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\ProcessOutputException' => __DIR__ . '/../..' . '/api/Exception/ProcessOutputException.php', '_ContaoManager\\Contao\\ManagerApi\\Exception\\RequestException' => __DIR__ . '/../..' . '/api/Exception/RequestException.php', '_ContaoManager\\Contao\\ManagerApi\\HttpKernel\\ApiProblemResponse' => __DIR__ . '/../..' . '/api/HttpKernel/ApiProblemResponse.php', '_ContaoManager\\Contao\\ManagerApi\\I18n\\Translator' => __DIR__ . '/../..' . '/api/I18n/Translator.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AbstractIntegrityCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/AbstractIntegrityCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\AllowUrlFopenCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/AllowUrlFopenCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\GraphicsLibCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/GraphicsLibCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckFactory' => __DIR__ . '/../..' . '/api/IntegrityCheck/IntegrityCheckFactory.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\IntegrityCheckInterface' => __DIR__ . '/../..' . '/api/IntegrityCheck/IntegrityCheckInterface.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\MemoryLimitCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/MemoryLimitCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\PhpExtensionsCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/PhpExtensionsCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ProcessCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/ProcessCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SessionCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/SessionCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SymlinkCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/SymlinkCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\SysTempDirCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/SysTempDirCheck.php', '_ContaoManager\\Contao\\ManagerApi\\IntegrityCheck\\ZipCheck' => __DIR__ . '/../..' . '/api/IntegrityCheck/ZipCheck.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\AbstractProcess' => __DIR__ . '/../..' . '/api/Process/AbstractProcess.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ConsoleProcessFactory' => __DIR__ . '/../..' . '/api/Process/ConsoleProcessFactory.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoApi' => __DIR__ . '/../..' . '/api/Process/ContaoApi.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ContaoConsole' => __DIR__ . '/../..' . '/api/Process/ContaoConsole.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\AbstractForker' => __DIR__ . '/../..' . '/api/Process/Forker/AbstractForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\DisownForker' => __DIR__ . '/../..' . '/api/Process/Forker/DisownForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\ForkerInterface' => __DIR__ . '/../..' . '/api/Process/Forker/ForkerInterface.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\InlineForker' => __DIR__ . '/../..' . '/api/Process/Forker/InlineForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\NohupForker' => __DIR__ . '/../..' . '/api/Process/Forker/NohupForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Forker\\WindowsStartForker' => __DIR__ . '/../..' . '/api/Process/Forker/WindowsStartForker.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\PhpExecutableFinder' => __DIR__ . '/../..' . '/api/Process/PhpExecutableFinder.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ProcessController' => __DIR__ . '/../..' . '/api/Process/ProcessController.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\ProcessRunner' => __DIR__ . '/../..' . '/api/Process/ProcessRunner.php', '_ContaoManager\\Contao\\ManagerApi\\Process\\Utf8Process' => __DIR__ . '/../..' . '/api/Process/Utf8Process.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\AbstractBrowserAuthenticator' => __DIR__ . '/../..' . '/api/Security/AbstractBrowserAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtAuthenticator' => __DIR__ . '/../..' . '/api/Security/JwtAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\JwtManager' => __DIR__ . '/../..' . '/api/Security/JwtManager.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\LoginAuthenticator' => __DIR__ . '/../..' . '/api/Security/LoginAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\PasswordlessAuthenticator' => __DIR__ . '/../..' . '/api/Security/PasswordlessAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\TokenAuthenticator' => __DIR__ . '/../..' . '/api/Security/TokenAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\TotpBadge' => __DIR__ . '/../..' . '/api/Security/TotpBadge.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\User' => __DIR__ . '/../..' . '/api/Security/User.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\UserProvider' => __DIR__ . '/../..' . '/api/Security/UserProvider.php', '_ContaoManager\\Contao\\ManagerApi\\Security\\WebauthnAuthenticator' => __DIR__ . '/../..' . '/api/Security/WebauthnAuthenticator.php', '_ContaoManager\\Contao\\ManagerApi\\System\\Request' => __DIR__ . '/../..' . '/api/System/Request.php', '_ContaoManager\\Contao\\ManagerApi\\System\\SelfUpdate' => __DIR__ . '/../..' . '/api/System/SelfUpdate.php', '_ContaoManager\\Contao\\ManagerApi\\System\\ServerInfo' => __DIR__ . '/../..' . '/api/System/ServerInfo.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\AbstractInlineOperation' => __DIR__ . '/../..' . '/api/TaskOperation/AbstractInlineOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\AbstractProcessOperation' => __DIR__ . '/../..' . '/api/TaskOperation/AbstractProcessOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\ClearCacheOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/ClearCacheOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\CloudOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/CloudOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\CreateProjectOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/CreateProjectOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\DumpAutoloadOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/DumpAutoloadOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\InstallOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/InstallOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\RemoveOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/RemoveOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\RequireOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/RequireOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Composer\\UpdateOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Composer/UpdateOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\ConsoleOutput' => __DIR__ . '/../..' . '/api/TaskOperation/ConsoleOutput.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\BackupCreateOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Contao/BackupCreateOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\BackupRestoreOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Contao/BackupRestoreOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CacheClearOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Contao/CacheClearOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CacheWarmupOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Contao/CacheWarmupOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\CreateContaoOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Contao/CreateContaoOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Contao\\MaintenanceModeOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Contao/MaintenanceModeOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\InstallUploadsOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Filesystem/InstallUploadsOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveArtifactsOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Filesystem/RemoveArtifactsOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveCacheOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Filesystem/RemoveCacheOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveUploadsOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Filesystem/RemoveUploadsOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Filesystem\\RemoveVendorOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Filesystem/RemoveVendorOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\Manager\\SelfUpdateOperation' => __DIR__ . '/../..' . '/api/TaskOperation/Manager/SelfUpdateOperation.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\SponsoredOperationInterface' => __DIR__ . '/../..' . '/api/TaskOperation/SponsoredOperationInterface.php', '_ContaoManager\\Contao\\ManagerApi\\TaskOperation\\TaskOperationInterface' => __DIR__ . '/../..' . '/api/TaskOperation/TaskOperationInterface.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\AbstractTask' => __DIR__ . '/../..' . '/api/Task/AbstractTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\ClearCacheTask' => __DIR__ . '/../..' . '/api/Task/Composer/ClearCacheTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Composer\\DumpAutoloadTask' => __DIR__ . '/../..' . '/api/Task/Composer/DumpAutoloadTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupCreateTask' => __DIR__ . '/../..' . '/api/Task/Contao/BackupCreateTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\BackupRestoreTask' => __DIR__ . '/../..' . '/api/Task/Contao/BackupRestoreTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Contao\\RebuildCacheTask' => __DIR__ . '/../..' . '/api/Task/Contao/RebuildCacheTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Manager\\SelfUpdateTask' => __DIR__ . '/../..' . '/api/Task/Manager/SelfUpdateTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\AbstractPackagesTask' => __DIR__ . '/../..' . '/api/Task/Packages/AbstractPackagesTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\InstallTask' => __DIR__ . '/../..' . '/api/Task/Packages/InstallTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\SetupTask' => __DIR__ . '/../..' . '/api/Task/Packages/SetupTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\Packages\\UpdateTask' => __DIR__ . '/../..' . '/api/Task/Packages/UpdateTask.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskConfig' => __DIR__ . '/../..' . '/api/Task/TaskConfig.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskInterface' => __DIR__ . '/../..' . '/api/Task/TaskInterface.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskManager' => __DIR__ . '/../..' . '/api/Task/TaskManager.php', '_ContaoManager\\Contao\\ManagerApi\\Task\\TaskStatus' => __DIR__ . '/../..' . '/api/Task/TaskStatus.php', '_ContaoManager\\Contao\\ManagerApi\\Tests\\Composer\\CloudJobTest' => __DIR__ . '/../..' . '/api/Tests/Composer/CloudJobTest.php', '_ContaoManager\\Contao\\ManagerApi\\Tests\\Controller\\LogPatternTest' => __DIR__ . '/../..' . '/api/Tests/Controller/LogPatternTest.php', '_ContaoManager\\Cose\\Algorithm\\Algorithm' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Algorithm.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS256.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS256Truncated64' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS256Truncated64.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS384.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\HS512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/HS512.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\Hmac' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/Hmac.php', '_ContaoManager\\Cose\\Algorithm\\Mac\\Mac' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Mac/Mac.php', '_ContaoManager\\Cose\\Algorithm\\Manager' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Manager.php', '_ContaoManager\\Cose\\Algorithm\\ManagerFactory' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/ManagerFactory.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ECDSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECDSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ECSignature' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ECSignature.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES256K' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES256K.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES384.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\ECDSA\\ES512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/ECDSA/ES512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\Ed25519' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed25519.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\Ed256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\Ed512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/Ed512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\EdDSA\\EdDSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/EdDSA/EdDSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PS256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PS384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS384.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PS512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PS512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\PSSRSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/PSSRSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS1' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS1.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS256' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS256.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS384' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS384.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RS512' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RS512.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\RSA\\RSA' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/RSA/RSA.php', '_ContaoManager\\Cose\\Algorithm\\Signature\\Signature' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithm/Signature/Signature.php', '_ContaoManager\\Cose\\Algorithms' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Algorithms.php', '_ContaoManager\\Cose\\BigInteger' => __DIR__ . '/..' . '/web-auth/cose-lib/src/BigInteger.php', '_ContaoManager\\Cose\\Hash' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Hash.php', '_ContaoManager\\Cose\\Key\\Ec2Key' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/Ec2Key.php', '_ContaoManager\\Cose\\Key\\Key' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/Key.php', '_ContaoManager\\Cose\\Key\\OkpKey' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/OkpKey.php', '_ContaoManager\\Cose\\Key\\RsaKey' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/RsaKey.php', '_ContaoManager\\Cose\\Key\\SymmetricKey' => __DIR__ . '/..' . '/web-auth/cose-lib/src/Key/SymmetricKey.php', '_ContaoManager\\Crell\\ApiProblem\\ApiProblem' => __DIR__ . '/..' . '/crell/api-problem/src/ApiProblem.php', '_ContaoManager\\Crell\\ApiProblem\\HttpConverter' => __DIR__ . '/..' . '/crell/api-problem/src/HttpConverter.php', '_ContaoManager\\Crell\\ApiProblem\\JsonEncodeException' => __DIR__ . '/..' . '/crell/api-problem/src/JsonEncodeException.php', '_ContaoManager\\Crell\\ApiProblem\\JsonException' => __DIR__ . '/..' . '/crell/api-problem/src/JsonException.php', '_ContaoManager\\Crell\\ApiProblem\\JsonParseException' => __DIR__ . '/..' . '/crell/api-problem/src/JsonParseException.php', '_ContaoManager\\Doctrine\\Deprecations\\Deprecation' => __DIR__ . '/..' . '/doctrine/deprecations/src/Deprecation.php', '_ContaoManager\\Doctrine\\Deprecations\\PHPUnit\\VerifyDeprecations' => __DIR__ . '/..' . '/doctrine/deprecations/src/PHPUnit/VerifyDeprecations.php', '_ContaoManager\\Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php', '_ContaoManager\\Firebase\\JWT\\CachedKeySet' => __DIR__ . '/..' . '/firebase/php-jwt/src/CachedKeySet.php', '_ContaoManager\\Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php', '_ContaoManager\\Firebase\\JWT\\JWK' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWK.php', '_ContaoManager\\Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php', '_ContaoManager\\Firebase\\JWT\\JWTExceptionWithPayloadInterface' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWTExceptionWithPayloadInterface.php', '_ContaoManager\\Firebase\\JWT\\Key' => __DIR__ . '/..' . '/firebase/php-jwt/src/Key.php', '_ContaoManager\\Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php', '_ContaoManager\\JsonSchema\\Constraints\\BaseConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\CollectionConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\Constraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php', '_ContaoManager\\JsonSchema\\Constraints\\ConstraintInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php', '_ContaoManager\\JsonSchema\\Constraints\\EnumConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\Factory' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php', '_ContaoManager\\JsonSchema\\Constraints\\FormatConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\NumberConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\ObjectConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\SchemaConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\StringConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeCheck\\LooseTypeCheck' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/LooseTypeCheck.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeCheck\\StrictTypeCheck' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/StrictTypeCheck.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeCheck\\TypeCheckInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeCheck/TypeCheckInterface.php', '_ContaoManager\\JsonSchema\\Constraints\\TypeConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php', '_ContaoManager\\JsonSchema\\Constraints\\UndefinedConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php', '_ContaoManager\\JsonSchema\\Entity\\JsonPointer' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Entity/JsonPointer.php', '_ContaoManager\\JsonSchema\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/ExceptionInterface.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidConfigException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidConfigException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidSchemaException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidSchemaMediaTypeException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaMediaTypeException.php', '_ContaoManager\\JsonSchema\\Exception\\InvalidSourceUriException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSourceUriException.php', '_ContaoManager\\JsonSchema\\Exception\\JsonDecodingException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/JsonDecodingException.php', '_ContaoManager\\JsonSchema\\Exception\\ResourceNotFoundException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/ResourceNotFoundException.php', '_ContaoManager\\JsonSchema\\Exception\\RuntimeException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/RuntimeException.php', '_ContaoManager\\JsonSchema\\Exception\\UnresolvableJsonPointerException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/UnresolvableJsonPointerException.php', '_ContaoManager\\JsonSchema\\Exception\\UriResolverException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php', '_ContaoManager\\JsonSchema\\Exception\\ValidationException' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Exception/ValidationException.php', '_ContaoManager\\JsonSchema\\Iterator\\ObjectIterator' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Iterator/ObjectIterator.php', '_ContaoManager\\JsonSchema\\Rfc3339' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Rfc3339.php', '_ContaoManager\\JsonSchema\\SchemaStorage' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorage.php', '_ContaoManager\\JsonSchema\\SchemaStorageInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/SchemaStorageInterface.php', '_ContaoManager\\JsonSchema\\UriResolverInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/UriResolverInterface.php', '_ContaoManager\\JsonSchema\\UriRetrieverInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/UriRetrieverInterface.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\AbstractRetriever' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\Curl' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\FileGetContents' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\PredefinedArray' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php', '_ContaoManager\\JsonSchema\\Uri\\Retrievers\\UriRetrieverInterface' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php', '_ContaoManager\\JsonSchema\\Uri\\UriResolver' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php', '_ContaoManager\\JsonSchema\\Uri\\UriRetriever' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php', '_ContaoManager\\JsonSchema\\Validator' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Validator.php', '_ContaoManager\\Lcobucci\\Clock\\Clock' => __DIR__ . '/..' . '/lcobucci/clock/src/Clock.php', '_ContaoManager\\Lcobucci\\Clock\\FrozenClock' => __DIR__ . '/..' . '/lcobucci/clock/src/FrozenClock.php', '_ContaoManager\\Lcobucci\\Clock\\SystemClock' => __DIR__ . '/..' . '/lcobucci/clock/src/SystemClock.php', '_ContaoManager\\Monolog\\Attribute\\AsMonologProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php', '_ContaoManager\\Monolog\\Attribute\\WithMonologChannel' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Attribute/WithMonologChannel.php', '_ContaoManager\\Monolog\\DateTimeImmutable' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/DateTimeImmutable.php', '_ContaoManager\\Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php', '_ContaoManager\\Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', '_ContaoManager\\Monolog\\Formatter\\ElasticaFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php', '_ContaoManager\\Monolog\\Formatter\\ElasticsearchFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php', '_ContaoManager\\Monolog\\Formatter\\FlowdockFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php', '_ContaoManager\\Monolog\\Formatter\\FluentdFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php', '_ContaoManager\\Monolog\\Formatter\\FormatterInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php', '_ContaoManager\\Monolog\\Formatter\\GelfMessageFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php', '_ContaoManager\\Monolog\\Formatter\\GoogleCloudLoggingFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php', '_ContaoManager\\Monolog\\Formatter\\HtmlFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php', '_ContaoManager\\Monolog\\Formatter\\JsonFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LineFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LineFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LogglyFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LogmaticFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php', '_ContaoManager\\Monolog\\Formatter\\LogstashFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php', '_ContaoManager\\Monolog\\Formatter\\MongoDBFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php', '_ContaoManager\\Monolog\\Formatter\\NormalizerFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php', '_ContaoManager\\Monolog\\Formatter\\ScalarFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php', '_ContaoManager\\Monolog\\Formatter\\SyslogFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/SyslogFormatter.php', '_ContaoManager\\Monolog\\Formatter\\WildfireFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php', '_ContaoManager\\Monolog\\Handler\\AbstractHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractHandler.php', '_ContaoManager\\Monolog\\Handler\\AbstractProcessingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php', '_ContaoManager\\Monolog\\Handler\\AbstractSyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php', '_ContaoManager\\Monolog\\Handler\\AmqpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/AmqpHandler.php', '_ContaoManager\\Monolog\\Handler\\BrowserConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php', '_ContaoManager\\Monolog\\Handler\\BufferHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/BufferHandler.php', '_ContaoManager\\Monolog\\Handler\\ChromePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php', '_ContaoManager\\Monolog\\Handler\\CouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php', '_ContaoManager\\Monolog\\Handler\\CubeHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/CubeHandler.php', '_ContaoManager\\Monolog\\Handler\\Curl\\Util' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Curl/Util.php', '_ContaoManager\\Monolog\\Handler\\DeduplicationHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php', '_ContaoManager\\Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', '_ContaoManager\\Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', '_ContaoManager\\Monolog\\Handler\\ElasticaHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', '_ContaoManager\\Monolog\\Handler\\ElasticsearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', '_ContaoManager\\Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', '_ContaoManager\\Monolog\\Handler\\FallbackGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', '_ContaoManager\\Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossedHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ChannelLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php', '_ContaoManager\\Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php', '_ContaoManager\\Monolog\\Handler\\FirePHPHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php', '_ContaoManager\\Monolog\\Handler\\FleepHookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php', '_ContaoManager\\Monolog\\Handler\\FlowdockHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php', '_ContaoManager\\Monolog\\Handler\\FormattableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php', '_ContaoManager\\Monolog\\Handler\\FormattableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php', '_ContaoManager\\Monolog\\Handler\\GelfHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GelfHandler.php', '_ContaoManager\\Monolog\\Handler\\GroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/GroupHandler.php', '_ContaoManager\\Monolog\\Handler\\Handler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Handler.php', '_ContaoManager\\Monolog\\Handler\\HandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerInterface.php', '_ContaoManager\\Monolog\\Handler\\HandlerWrapper' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php', '_ContaoManager\\Monolog\\Handler\\IFTTTHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php', '_ContaoManager\\Monolog\\Handler\\InsightOpsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php', '_ContaoManager\\Monolog\\Handler\\LogEntriesHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php', '_ContaoManager\\Monolog\\Handler\\LogglyHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogglyHandler.php', '_ContaoManager\\Monolog\\Handler\\LogmaticHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php', '_ContaoManager\\Monolog\\Handler\\MailHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MailHandler.php', '_ContaoManager\\Monolog\\Handler\\MandrillHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MandrillHandler.php', '_ContaoManager\\Monolog\\Handler\\MissingExtensionException' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php', '_ContaoManager\\Monolog\\Handler\\MongoDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php', '_ContaoManager\\Monolog\\Handler\\NativeMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php', '_ContaoManager\\Monolog\\Handler\\NewRelicHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php', '_ContaoManager\\Monolog\\Handler\\NoopHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NoopHandler.php', '_ContaoManager\\Monolog\\Handler\\NullHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/NullHandler.php', '_ContaoManager\\Monolog\\Handler\\OverflowHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/OverflowHandler.php', '_ContaoManager\\Monolog\\Handler\\PHPConsoleHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php', '_ContaoManager\\Monolog\\Handler\\ProcessHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessHandler.php', '_ContaoManager\\Monolog\\Handler\\ProcessableHandlerInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php', '_ContaoManager\\Monolog\\Handler\\ProcessableHandlerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php', '_ContaoManager\\Monolog\\Handler\\PsrHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PsrHandler.php', '_ContaoManager\\Monolog\\Handler\\PushoverHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/PushoverHandler.php', '_ContaoManager\\Monolog\\Handler\\RedisHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisHandler.php', '_ContaoManager\\Monolog\\Handler\\RedisPubSubHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php', '_ContaoManager\\Monolog\\Handler\\RollbarHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RollbarHandler.php', '_ContaoManager\\Monolog\\Handler\\RotatingFileHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php', '_ContaoManager\\Monolog\\Handler\\SamplingHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SamplingHandler.php', '_ContaoManager\\Monolog\\Handler\\SendGridHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SendGridHandler.php', '_ContaoManager\\Monolog\\Handler\\SlackHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackHandler.php', '_ContaoManager\\Monolog\\Handler\\SlackWebhookHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php', '_ContaoManager\\Monolog\\Handler\\Slack\\SlackRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php', '_ContaoManager\\Monolog\\Handler\\SocketHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SocketHandler.php', '_ContaoManager\\Monolog\\Handler\\SqsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php', '_ContaoManager\\Monolog\\Handler\\StreamHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', '_ContaoManager\\Monolog\\Handler\\SymfonyMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php', '_ContaoManager\\Monolog\\Handler\\SyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', '_ContaoManager\\Monolog\\Handler\\SyslogUdpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', '_ContaoManager\\Monolog\\Handler\\SyslogUdp\\UdpSocket' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', '_ContaoManager\\Monolog\\Handler\\TelegramBotHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php', '_ContaoManager\\Monolog\\Handler\\TestHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/TestHandler.php', '_ContaoManager\\Monolog\\Handler\\WebRequestRecognizerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php', '_ContaoManager\\Monolog\\Handler\\WhatFailureGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', '_ContaoManager\\Monolog\\Handler\\ZendMonitorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', '_ContaoManager\\Monolog\\JsonSerializableDateTimeImmutable' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/JsonSerializableDateTimeImmutable.php', '_ContaoManager\\Monolog\\Level' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Level.php', '_ContaoManager\\Monolog\\LogRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/LogRecord.php', '_ContaoManager\\Monolog\\Logger' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Logger.php', '_ContaoManager\\Monolog\\Processor\\ClosureContextProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ClosureContextProcessor.php', '_ContaoManager\\Monolog\\Processor\\GitProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', '_ContaoManager\\Monolog\\Processor\\HostnameProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php', '_ContaoManager\\Monolog\\Processor\\IntrospectionProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php', '_ContaoManager\\Monolog\\Processor\\LoadAverageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/LoadAverageProcessor.php', '_ContaoManager\\Monolog\\Processor\\MemoryPeakUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php', '_ContaoManager\\Monolog\\Processor\\MemoryProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php', '_ContaoManager\\Monolog\\Processor\\MemoryUsageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php', '_ContaoManager\\Monolog\\Processor\\MercurialProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php', '_ContaoManager\\Monolog\\Processor\\ProcessIdProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php', '_ContaoManager\\Monolog\\Processor\\ProcessorInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php', '_ContaoManager\\Monolog\\Processor\\PsrLogMessageProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php', '_ContaoManager\\Monolog\\Processor\\TagProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/TagProcessor.php', '_ContaoManager\\Monolog\\Processor\\UidProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/UidProcessor.php', '_ContaoManager\\Monolog\\Processor\\WebProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/WebProcessor.php', '_ContaoManager\\Monolog\\Registry' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Registry.php', '_ContaoManager\\Monolog\\ResettableInterface' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ResettableInterface.php', '_ContaoManager\\Monolog\\SignalHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/SignalHandler.php', '_ContaoManager\\Monolog\\Test\\MonologTestCase' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Test/MonologTestCase.php', '_ContaoManager\\Monolog\\Test\\TestCase' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Test/TestCase.php', '_ContaoManager\\Monolog\\Utils' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Utils.php', '_ContaoManager\\OTPHP\\Factory' => __DIR__ . '/..' . '/spomky-labs/otphp/src/Factory.php', '_ContaoManager\\OTPHP\\FactoryInterface' => __DIR__ . '/..' . '/spomky-labs/otphp/src/FactoryInterface.php', '_ContaoManager\\OTPHP\\HOTP' => __DIR__ . '/..' . '/spomky-labs/otphp/src/HOTP.php', '_ContaoManager\\OTPHP\\HOTPInterface' => __DIR__ . '/..' . '/spomky-labs/otphp/src/HOTPInterface.php', '_ContaoManager\\OTPHP\\InternalClock' => __DIR__ . '/..' . '/spomky-labs/otphp/src/InternalClock.php', '_ContaoManager\\OTPHP\\OTP' => __DIR__ . '/..' . '/spomky-labs/otphp/src/OTP.php', '_ContaoManager\\OTPHP\\OTPInterface' => __DIR__ . '/..' . '/spomky-labs/otphp/src/OTPInterface.php', '_ContaoManager\\OTPHP\\ParameterTrait' => __DIR__ . '/..' . '/spomky-labs/otphp/src/ParameterTrait.php', '_ContaoManager\\OTPHP\\TOTP' => __DIR__ . '/..' . '/spomky-labs/otphp/src/TOTP.php', '_ContaoManager\\OTPHP\\TOTPInterface' => __DIR__ . '/..' . '/spomky-labs/otphp/src/TOTPInterface.php', '_ContaoManager\\OTPHP\\Url' => __DIR__ . '/..' . '/spomky-labs/otphp/src/Url.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\AbstractNodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Attribute' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Attribute.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Comment' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Comment.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayItemNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprArrayNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprArrayNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFalseNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFalseNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprFloatNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprFloatNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprIntegerNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprIntegerNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprNullNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprNullNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprStringNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstExprTrueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstExprTrueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\ConstFetchNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/ConstFetchNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\ConstExpr\\DoctrineConstExprStringNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/ConstExpr/DoctrineConstExprStringNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Node' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Node.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeAttributes' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeAttributes.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeTraverser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\NodeVisitor\\CloningVisitor' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagMethodValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagMethodValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagPropertyValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagPropertyValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\AssertTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/AssertTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\DeprecatedTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/DeprecatedTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineAnnotation' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArgument' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArray' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineArrayItem' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\Doctrine\\DoctrineTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ExtendsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ExtendsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\GenericTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/GenericTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ImplementsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ImplementsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\InvalidTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MethodTagValueParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueParameterNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\MixinTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/MixinTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamClosureThisTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamClosureThisTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamImmediatelyInvokedCallableTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamImmediatelyInvokedCallableTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamLaterInvokedCallableTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamLaterInvokedCallableTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamOutTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamOutTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ParamTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocChildNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocChildNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocTextNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTextNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PropertyTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PropertyTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PureUnlessCallableIsImpureTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/PureUnlessCallableIsImpureTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireExtendsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireExtendsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\RequireImplementsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/RequireImplementsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ReturnTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ReturnTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\SelfOutTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/SelfOutTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TemplateTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TemplateTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\ThrowsTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/ThrowsTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasImportTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasImportTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypeAliasTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypeAliasTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\TypelessParamTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/TypelessParamTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\UsesTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/UsesTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\PhpDoc\\VarTagValueNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/PhpDoc/VarTagValueNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeItemNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayShapeUnsealedTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeUnsealedTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ArrayTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\CallableTypeParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeForParameterNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeForParameterNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ConditionalTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConditionalTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ConstTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\GenericTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IdentifierTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\IntersectionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\InvalidTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\NullableTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/NullableTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeItemNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ObjectShapeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\OffsetAccessTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\ThisTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/ThisTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/TypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Ast\\Type\\UnionTypeNode' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Lexer\\Lexer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Lexer/Lexer.php', '_ContaoManager\\PHPStan\\PhpDocParser\\ParserConfig' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/ParserConfig.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\ConstExprParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\ParserException' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/ParserException.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\PhpDocParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\StringUnescaper' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\TokenIterator' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TokenIterator.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Parser\\TypeParser' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Parser/TypeParser.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Printer\\DiffElem' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/DiffElem.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Printer\\Differ' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/Differ.php', '_ContaoManager\\PHPStan\\PhpDocParser\\Printer\\Printer' => __DIR__ . '/..' . '/phpstan/phpdoc-parser/src/Printer/Printer.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base32' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base32Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32Hex.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64DotSlash' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64DotSlash.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64DotSlashOrdered' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Base64UrlSafe' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64UrlSafe.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Binary' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Binary.php', '_ContaoManager\\ParagonIE\\ConstantTime\\EncoderInterface' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/EncoderInterface.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Encoding' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Encoding.php', '_ContaoManager\\ParagonIE\\ConstantTime\\Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Hex.php', '_ContaoManager\\ParagonIE\\ConstantTime\\RFC4648' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/RFC4648.php', '_ContaoManager\\Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php', '_ContaoManager\\Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php', '_ContaoManager\\Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php', '_ContaoManager\\Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php', '_ContaoManager\\Psr\\Clock\\ClockInterface' => __DIR__ . '/..' . '/psr/clock/src/ClockInterface.php', '_ContaoManager\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', '_ContaoManager\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', '_ContaoManager\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', '_ContaoManager\\Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php', '_ContaoManager\\Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php', '_ContaoManager\\Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php', '_ContaoManager\\Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php', '_ContaoManager\\Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php', '_ContaoManager\\Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php', '_ContaoManager\\Psr\\Http\\Client\\RequestExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/RequestExceptionInterface.php', '_ContaoManager\\Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', '_ContaoManager\\Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/RequestFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ResponseFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ServerRequestFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', '_ContaoManager\\Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/StreamFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UploadedFileFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php', '_ContaoManager\\Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', '_ContaoManager\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', '_ContaoManager\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', '_ContaoManager\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', '_ContaoManager\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', '_ContaoManager\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', '_ContaoManager\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', '_ContaoManager\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', '_ContaoManager\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', '_ContaoManager\\Ramsey\\Collection\\AbstractArray' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractArray.php', '_ContaoManager\\Ramsey\\Collection\\AbstractCollection' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractCollection.php', '_ContaoManager\\Ramsey\\Collection\\AbstractSet' => __DIR__ . '/..' . '/ramsey/collection/src/AbstractSet.php', '_ContaoManager\\Ramsey\\Collection\\ArrayInterface' => __DIR__ . '/..' . '/ramsey/collection/src/ArrayInterface.php', '_ContaoManager\\Ramsey\\Collection\\Collection' => __DIR__ . '/..' . '/ramsey/collection/src/Collection.php', '_ContaoManager\\Ramsey\\Collection\\CollectionInterface' => __DIR__ . '/..' . '/ramsey/collection/src/CollectionInterface.php', '_ContaoManager\\Ramsey\\Collection\\DoubleEndedQueue' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueue.php', '_ContaoManager\\Ramsey\\Collection\\DoubleEndedQueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/DoubleEndedQueueInterface.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\CollectionException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/CollectionException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\CollectionMismatchException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/CollectionMismatchException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidArgumentException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\InvalidPropertyOrMethod' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/InvalidPropertyOrMethod.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\NoSuchElementException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/NoSuchElementException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/OutOfBoundsException.php', '_ContaoManager\\Ramsey\\Collection\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/collection/src/Exception/UnsupportedOperationException.php', '_ContaoManager\\Ramsey\\Collection\\GenericArray' => __DIR__ . '/..' . '/ramsey/collection/src/GenericArray.php', '_ContaoManager\\Ramsey\\Collection\\Map\\AbstractMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\AbstractTypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AbstractTypedMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\AssociativeArrayMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/AssociativeArrayMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\MapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/MapInterface.php', '_ContaoManager\\Ramsey\\Collection\\Map\\NamedParameterMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/NamedParameterMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\TypedMap' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMap.php', '_ContaoManager\\Ramsey\\Collection\\Map\\TypedMapInterface' => __DIR__ . '/..' . '/ramsey/collection/src/Map/TypedMapInterface.php', '_ContaoManager\\Ramsey\\Collection\\Queue' => __DIR__ . '/..' . '/ramsey/collection/src/Queue.php', '_ContaoManager\\Ramsey\\Collection\\QueueInterface' => __DIR__ . '/..' . '/ramsey/collection/src/QueueInterface.php', '_ContaoManager\\Ramsey\\Collection\\Set' => __DIR__ . '/..' . '/ramsey/collection/src/Set.php', '_ContaoManager\\Ramsey\\Collection\\Sort' => __DIR__ . '/..' . '/ramsey/collection/src/Sort.php', '_ContaoManager\\Ramsey\\Collection\\Tool\\TypeTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/TypeTrait.php', '_ContaoManager\\Ramsey\\Collection\\Tool\\ValueExtractorTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueExtractorTrait.php', '_ContaoManager\\Ramsey\\Collection\\Tool\\ValueToStringTrait' => __DIR__ . '/..' . '/ramsey/collection/src/Tool/ValueToStringTrait.php', '_ContaoManager\\Ramsey\\Uuid\\BinaryUtils' => __DIR__ . '/..' . '/ramsey/uuid/src/BinaryUtils.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\BuilderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/BuilderCollection.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\FallbackBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/FallbackBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Builder\\UuidBuilderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/UuidBuilderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\CodecInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/CodecInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\GuidStringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/GuidStringCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\OrderedTimeCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/OrderedTimeCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\StringCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/StringCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\TimestampFirstCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampFirstCombCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Codec\\TimestampLastCombCodec' => __DIR__ . '/..' . '/ramsey/uuid/src/Codec/TimestampLastCombCodec.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\NumberConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/NumberConverterInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Number\\BigNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/BigNumberConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Number\\DegradedNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/DegradedNumberConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Number\\GenericNumberConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Number/GenericNumberConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\TimeConverterInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/TimeConverterInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\BigNumberTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/BigNumberTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\DegradedTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/DegradedTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\GenericTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/GenericTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\PhpTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/PhpTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\Converter\\Time\\UnixTimeConverter' => __DIR__ . '/..' . '/ramsey/uuid/src/Converter/Time/UnixTimeConverter.php', '_ContaoManager\\Ramsey\\Uuid\\DegradedUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/DegradedUuid.php', '_ContaoManager\\Ramsey\\Uuid\\DeprecatedUuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidInterface.php', '_ContaoManager\\Ramsey\\Uuid\\DeprecatedUuidMethodsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/DeprecatedUuidMethodsTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\BuilderNotFoundException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/BuilderNotFoundException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\DateTimeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DateTimeException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\DceSecurityException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/DceSecurityException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidArgumentException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\InvalidBytesException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidBytesException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\InvalidUuidStringException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/InvalidUuidStringException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\NameException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NameException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\NodeException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/NodeException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\RandomSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/RandomSourceException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\TimeSourceException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/TimeSourceException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\UnableToBuildUuidException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnableToBuildUuidException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UnsupportedOperationException.php', '_ContaoManager\\Ramsey\\Uuid\\Exception\\UuidExceptionInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Exception/UuidExceptionInterface.php', '_ContaoManager\\Ramsey\\Uuid\\FeatureSet' => __DIR__ . '/..' . '/ramsey/uuid/src/FeatureSet.php', '_ContaoManager\\Ramsey\\Uuid\\Fields\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/FieldsInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Fields\\SerializableFieldsTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Fields/SerializableFieldsTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\CombGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/CombGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DceSecurityGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DceSecurityGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DceSecurityGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DefaultNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultNameGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\DefaultTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/DefaultTimeGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\NameGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorFactory.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\NameGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/NameGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\PeclUuidNameGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidNameGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\PeclUuidRandomGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidRandomGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\PeclUuidTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/PeclUuidTimeGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomBytesGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomBytesGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorFactory.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\RandomLibAdapter' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/RandomLibAdapter.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\TimeGeneratorFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorFactory.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\TimeGeneratorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/TimeGeneratorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Generator\\UnixTimeGenerator' => __DIR__ . '/..' . '/ramsey/uuid/src/Generator/UnixTimeGenerator.php', '_ContaoManager\\Ramsey\\Uuid\\Guid\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Fields.php', '_ContaoManager\\Ramsey\\Uuid\\Guid\\Guid' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/Guid.php', '_ContaoManager\\Ramsey\\Uuid\\Guid\\GuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Guid/GuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Lazy\\LazyUuidFromString' => __DIR__ . '/..' . '/ramsey/uuid/src/Lazy/LazyUuidFromString.php', '_ContaoManager\\Ramsey\\Uuid\\Math\\BrickMathCalculator' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/BrickMathCalculator.php', '_ContaoManager\\Ramsey\\Uuid\\Math\\CalculatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/CalculatorInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Math\\RoundingMode' => __DIR__ . '/..' . '/ramsey/uuid/src/Math/RoundingMode.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Fields.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/Uuid.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Nonstandard\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Nonstandard/UuidV6.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\DceSecurityProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/DceSecurityProviderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Dce\\SystemDceSecurityProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Dce/SystemDceSecurityProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\NodeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/NodeProviderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\FallbackNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/FallbackNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\NodeProviderCollection' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/NodeProviderCollection.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\RandomNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/RandomNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\StaticNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/StaticNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Node\\SystemNodeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\TimeProviderInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/TimeProviderInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Time\\FixedTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/FixedTimeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Provider\\Time\\SystemTimeProvider' => __DIR__ . '/..' . '/ramsey/uuid/src/Provider/Time/SystemTimeProvider.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\Fields' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Fields.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\FieldsInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/FieldsInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\MaxTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/MaxTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\MaxUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/MaxUuid.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\NilTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\NilUuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/NilUuid.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\TimeTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/TimeTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidBuilder.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV1' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV1.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV2' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV2.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV3' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV3.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV4' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV4.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV5' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV5.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV6' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV6.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV7' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV7.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\UuidV8' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/UuidV8.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\Validator' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/Validator.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\VariantTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VariantTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Rfc4122\\VersionTrait' => __DIR__ . '/..' . '/ramsey/uuid/src/Rfc4122/VersionTrait.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Decimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Decimal.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Hexadecimal' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Hexadecimal.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Integer' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Integer.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\NumberInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/NumberInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\Time' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/Time.php', '_ContaoManager\\Ramsey\\Uuid\\Type\\TypeInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Type/TypeInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Uuid' => __DIR__ . '/..' . '/ramsey/uuid/src/Uuid.php', '_ContaoManager\\Ramsey\\Uuid\\UuidFactory' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactory.php', '_ContaoManager\\Ramsey\\Uuid\\UuidFactoryInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidFactoryInterface.php', '_ContaoManager\\Ramsey\\Uuid\\UuidInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/UuidInterface.php', '_ContaoManager\\Ramsey\\Uuid\\Validator\\GenericValidator' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/GenericValidator.php', '_ContaoManager\\Ramsey\\Uuid\\Validator\\ValidatorInterface' => __DIR__ . '/..' . '/ramsey/uuid/src/Validator/ValidatorInterface.php', '_ContaoManager\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', '_ContaoManager\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', '_ContaoManager\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', '_ContaoManager\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', '_ContaoManager\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', '_ContaoManager\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', '_ContaoManager\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', '_ContaoManager\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', '_ContaoManager\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', '_ContaoManager\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', '_ContaoManager\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', '_ContaoManager\\Seld\\JsonLint\\DuplicateKeyException' => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint/DuplicateKeyException.php', '_ContaoManager\\Seld\\JsonLint\\JsonParser' => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint/JsonParser.php', '_ContaoManager\\Seld\\JsonLint\\Lexer' => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint/Lexer.php', '_ContaoManager\\Seld\\JsonLint\\ParsingException' => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint/ParsingException.php', '_ContaoManager\\Seld\\JsonLint\\Undefined' => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint/Undefined.php', '_ContaoManager\\Seld\\PharUtils\\Linter' => __DIR__ . '/..' . '/seld/phar-utils/src/Linter.php', '_ContaoManager\\Seld\\PharUtils\\Timestamps' => __DIR__ . '/..' . '/seld/phar-utils/src/Timestamps.php', '_ContaoManager\\Seld\\Signal\\SignalHandler' => __DIR__ . '/..' . '/seld/signal-handler/src/SignalHandler.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Component\\Identifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Component/Identifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Component\\Length' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Component/Length.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\DERData' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/DERData.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Element' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Element.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Exception\\DecodeException' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Exception/DecodeException.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Feature\\ElementBase' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Feature/ElementBase.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Feature\\Encodable' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Feature/Encodable.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Feature\\Stringable' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Feature/Stringable.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\BaseString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/BaseString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\BaseTime' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/BaseTime.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Constructed\\ConstructedString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Constructed/ConstructedString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Constructed\\Sequence' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Constructed/Sequence.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Constructed\\Set' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Constructed/Set.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\PrimitiveString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/PrimitiveString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\PrimitiveType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/PrimitiveType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\BMPString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/BMPString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\BitString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/BitString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Boolean' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Boolean.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\CharacterString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/CharacterString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\EOC' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/EOC.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Enumerated' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Enumerated.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\GeneralString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GeneralString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\GeneralizedTime' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GeneralizedTime.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\GraphicString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/GraphicString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\IA5String' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/IA5String.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Integer' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Integer.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\NullType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/NullType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Number' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Number.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\NumericString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/NumericString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\ObjectDescriptor' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/ObjectDescriptor.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\ObjectIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/ObjectIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\OctetString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/OctetString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\PrintableString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/PrintableString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\Real' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/Real.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\RelativeOID' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/RelativeOID.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\T61String' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/T61String.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\UTCTime' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UTCTime.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\UTF8String' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UTF8String.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\UniversalString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/UniversalString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\VideotexString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/VideotexString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Primitive\\VisibleString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Primitive/VisibleString.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\StringType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/StringType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Structure' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Structure.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\TaggedType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/TaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ApplicationType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ApplicationType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ContextSpecificType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ContextSpecificType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\DERTaggedType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/DERTaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ExplicitTagging' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ExplicitTagging.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ExplicitlyTaggedType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ExplicitlyTaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ImplicitTagging' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ImplicitTagging.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\ImplicitlyTaggedType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/ImplicitlyTaggedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\PrivateType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/PrivateType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\Tagged\\TaggedTypeWrap' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/Tagged/TaggedTypeWrap.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\TimeType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/TimeType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\UniversalClass' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/UniversalClass.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Type\\UnspecifiedType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Type/UnspecifiedType.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Util\\BigInt' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Util/BigInt.php', '_ContaoManager\\SpomkyLabs\\Pki\\ASN1\\Util\\Flags' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/ASN1/Util/Flags.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoBridge\\Crypto' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoBridge/Crypto.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoBridge\\Crypto\\OpenSSLCrypto' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoBridge/Crypto/OpenSSLCrypto.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoEncoding\\PEM' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoEncoding/PEM.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoEncoding\\PEMBundle' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoEncoding/PEMBundle.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\AlgorithmIdentifierFactory' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifierFactory.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\AlgorithmIdentifierProvider' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/AlgorithmIdentifierProvider.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\ECPublicKeyAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/ECPublicKeyAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\Ed25519AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/Ed25519AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\Ed448AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/Ed448AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RFC8410EdAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RFC8410EdAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RFC8410XAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RFC8410XAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\RSAPSSSSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/RSAPSSSSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\X25519AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/X25519AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Asymmetric\\X448AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Asymmetric/X448AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AES128CBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES128CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AES192CBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES192CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AES256CBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AES256CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\AESCBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/AESCBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\BlockCipherAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/BlockCipherAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\CipherAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/CipherAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\DESCBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/DESCBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\DESEDE3CBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/DESEDE3CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Cipher\\RC2CBCAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Cipher/RC2CBCAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\AlgorithmIdentifierType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/AlgorithmIdentifierType.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\AsymmetricCryptoAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/AsymmetricCryptoAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\EncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/EncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\HashAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/HashAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\PRFAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/PRFAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Feature\\SignatureAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Feature/SignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\GenericAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/GenericAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA1AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA1AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA224AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA224AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA256AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA256AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA384AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA384AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\HMACWithSHA512AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/HMACWithSHA512AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\MD5AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/MD5AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\RFC4231HMACAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/RFC4231HMACAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA1AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA1AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA224AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA224AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA256AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA256AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA2AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA2AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA384AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA384AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Hash\\SHA512AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Hash/SHA512AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA1AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA1AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA224AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA224AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA256AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA256AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA384AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA384AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECDSAWithSHA512AlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECDSAWithSHA512AlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\ECSignatureAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/ECSignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\MD2WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD2WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\MD4WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD4WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\MD5WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/MD5WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\RFC3279RSASignatureAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RFC3279RSASignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\RFC4055RSASignatureAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RFC4055RSASignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\RSASignatureAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/RSASignatureAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA1WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA1WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA224WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA224WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA256WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA256WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA384WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA384WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\Signature\\SHA512WithRSAEncryptionAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/Signature/SHA512WithRSAEncryptionAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\AlgorithmIdentifier\\SpecificAlgorithmIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/AlgorithmIdentifier/SpecificAlgorithmIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\Attribute\\OneAsymmetricKeyAttributes' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/Attribute/OneAsymmetricKeyAttributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\EC\\ECConversion' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECConversion.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\EC\\ECPrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECPrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\EC\\ECPublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/EC/ECPublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\OneAsymmetricKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/OneAsymmetricKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PrivateKeyInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PrivateKeyInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\PublicKeyInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/PublicKeyInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Curve25519PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Curve25519PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Curve25519PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Curve25519PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Ed25519PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Ed25519PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\Ed25519PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/Ed25519PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\X25519PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/X25519PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve25519\\X25519PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve25519/X25519PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\Ed448PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/Ed448PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\Ed448PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/Ed448PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\X448PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/X448PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\Curve448\\X448PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/Curve448/X448PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\RFC8410PrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/RFC8410PrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RFC8410\\RFC8410PublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RFC8410/RFC8410PublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RSA\\RSAPrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSAPrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RSA\\RSAPublicKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSAPublicKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Asymmetric\\RSA\\RSASSAPSSPrivateKey' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Asymmetric/RSA/RSASSAPSSPrivateKey.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\ECSignature' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/ECSignature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\Ed25519Signature' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/Ed25519Signature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\Ed448Signature' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/Ed448Signature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\GenericSignature' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/GenericSignature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\RSASignature' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/RSASignature.php', '_ContaoManager\\SpomkyLabs\\Pki\\CryptoTypes\\Signature\\Signature' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/CryptoTypes/Signature/Signature.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Attribute' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/Attribute.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeType' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeType.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeTypeAndValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeTypeAndValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\AttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/AttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\CommonNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/CommonNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\CountryNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/CountryNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\DescriptionValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/DescriptionValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\Feature\\DirectoryString' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/Feature/DirectoryString.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\Feature\\PrintableStringValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/Feature/PrintableStringValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\GivenNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/GivenNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\LocalityNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/LocalityNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\NameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/NameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\OrganizationNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/OrganizationNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\OrganizationalUnitNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/OrganizationalUnitNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\PseudonymValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/PseudonymValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\SerialNumberValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/SerialNumberValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\StateOrProvinceNameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/StateOrProvinceNameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\SurnameValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/SurnameValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\TitleValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/TitleValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\AttributeValue\\UnknownAttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/AttributeValue/UnknownAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Collection\\AttributeCollection' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/Collection/AttributeCollection.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Collection\\SequenceOfAttributes' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/Collection/SequenceOfAttributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Collection\\SetOfAttributes' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/Collection/SetOfAttributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\Name' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/Name.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\ASN1\\RDN' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/ASN1/RDN.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\DN\\DNParser' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/DN/DNParser.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\BinaryMatch' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/MatchingRule/BinaryMatch.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\CaseExactMatch' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/MatchingRule/CaseExactMatch.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\CaseIgnoreMatch' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/MatchingRule/CaseIgnoreMatch.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\MatchingRule' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/MatchingRule/MatchingRule.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\MatchingRule\\StringPrepMatchingRule' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/MatchingRule/StringPrepMatchingRule.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\CheckBidiStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/CheckBidiStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\InsignificantNonSubstringSpaceStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/InsignificantNonSubstringSpaceStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\MapStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/MapStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\NormalizeStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/NormalizeStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\PrepareStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/PrepareStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\ProhibitStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/ProhibitStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\StringPreparer' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/StringPreparer.php', '_ContaoManager\\SpomkyLabs\\Pki\\X501\\StringPrep\\TranscodeStep' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X501/StringPrep/TranscodeStep.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttCertIssuer' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttCertIssuer.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttCertValidityPeriod' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttCertValidityPeriod.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttributeCertificate' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttributeCertificate.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\AttributeCertificateInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/AttributeCertificateInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\AccessIdentityAttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/AccessIdentityAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\AuthenticationInfoAttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/AuthenticationInfoAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\ChargingIdentityAttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/ChargingIdentityAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\GroupAttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/GroupAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\IetfAttrSyntax' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/IetfAttrSyntax.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\IetfAttrValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/IetfAttrValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\RoleAttributeValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/RoleAttributeValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attribute\\SvceAuthInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attribute/SvceAuthInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Attributes' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Attributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Holder' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Holder.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\IssuerSerial' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/IssuerSerial.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\ObjectDigestInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/ObjectDigestInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\V2Form' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/V2Form.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Validation\\ACValidationConfig' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/ACValidationConfig.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Validation\\ACValidator' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/ACValidator.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\AttributeCertificate\\Validation\\Exception\\ACValidationException' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/AttributeCertificate/Validation/Exception/ACValidationException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Certificate' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Certificate.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\CertificateBundle' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/CertificateBundle.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\CertificateChain' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/CertificateChain.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AAControlsExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AAControlsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AccessDescription\\AccessDescription' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/AccessDescription.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AccessDescription\\AuthorityAccessDescription' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/AuthorityAccessDescription.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AccessDescription\\SubjectAccessDescription' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AccessDescription/SubjectAccessDescription.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AuthorityInformationAccessExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AuthorityInformationAccessExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\AuthorityKeyIdentifierExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/AuthorityKeyIdentifierExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\BasicConstraintsExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/BasicConstraintsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CRLDistributionPointsExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CRLDistributionPointsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePoliciesExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePoliciesExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\CPSQualifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/CPSQualifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\DisplayText' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/DisplayText.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\NoticeReference' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/NoticeReference.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\PolicyInformation' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/PolicyInformation.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\PolicyQualifierInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/PolicyQualifierInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\CertificatePolicy\\UserNoticeQualifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/CertificatePolicy/UserNoticeQualifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\DistributionPoint' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/DistributionPoint.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\DistributionPointName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/DistributionPointName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\FullName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/FullName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\ReasonFlags' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/ReasonFlags.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\DistributionPoint\\RelativeName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/DistributionPoint/RelativeName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\ExtendedKeyUsageExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/ExtendedKeyUsageExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Extension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Extension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\FreshestCRLExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/FreshestCRLExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\InhibitAnyPolicyExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/InhibitAnyPolicyExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\IssuerAlternativeNameExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/IssuerAlternativeNameExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\KeyUsageExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/KeyUsageExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NameConstraintsExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraintsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NameConstraints\\GeneralSubtree' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraints/GeneralSubtree.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NameConstraints\\GeneralSubtrees' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NameConstraints/GeneralSubtrees.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\NoRevocationAvailableExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/NoRevocationAvailableExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\PolicyConstraintsExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyConstraintsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\PolicyMappingsExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyMappingsExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\PolicyMappings\\PolicyMapping' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/PolicyMappings/PolicyMapping.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectAlternativeNameExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectAlternativeNameExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectDirectoryAttributesExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectDirectoryAttributesExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectInformationAccessExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectInformationAccessExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\SubjectKeyIdentifierExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/SubjectKeyIdentifierExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\TargetInformationExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/TargetInformationExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\Target' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/Target.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\TargetGroup' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/TargetGroup.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\TargetName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/TargetName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\Target\\Targets' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/Target/Targets.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extension\\UnknownExtension' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extension/UnknownExtension.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Extensions' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Extensions.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\TBSCertificate' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/TBSCertificate.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Time' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Time.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\UniqueIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/UniqueIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Certificate\\Validity' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Certificate/Validity.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\CertificationPath' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/CertificationPath.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Exception\\PathBuildingException' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/Exception/PathBuildingException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Exception\\PathValidationException' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/Exception/PathValidationException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathBuilding\\CertificationPathBuilder' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathBuilding/CertificationPathBuilder.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\PathValidationConfig' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidationConfig.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\PathValidationResult' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidationResult.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\PathValidator' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/PathValidator.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\PathValidation\\ValidatorState' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/PathValidation/ValidatorState.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Policy\\PolicyNode' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/Policy/PolicyNode.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationPath\\Policy\\PolicyTree' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationPath/Policy/PolicyTree.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\Attribute\\ExtensionRequestValue' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationRequest/Attribute/ExtensionRequestValue.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\Attributes' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationRequest/Attributes.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\CertificationRequest' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationRequest/CertificationRequest.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\CertificationRequest\\CertificationRequestInfo' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/CertificationRequest/CertificationRequestInfo.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Exception\\X509ValidationException' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Exception/X509ValidationException.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\Feature\\DateTimeHelper' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/Feature/DateTimeHelper.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\DNSName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/DNSName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\DirectoryName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/DirectoryName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\EDIPartyName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/EDIPartyName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\GeneralName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/GeneralName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\GeneralNames' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/GeneralNames.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\IPAddress' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/IPAddress.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\IPv4Address' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/IPv4Address.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\IPv6Address' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/IPv6Address.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\OtherName' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/OtherName.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\RFC822Name' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/RFC822Name.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\RegisteredID' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/RegisteredID.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\UniformResourceIdentifier' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/UniformResourceIdentifier.php', '_ContaoManager\\SpomkyLabs\\Pki\\X509\\GeneralName\\X400Address' => __DIR__ . '/..' . '/spomky-labs/pki-framework/src/X509/GeneralName/X400Address.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Command\\ServerLogCommand' => __DIR__ . '/..' . '/symfony/monolog-bridge/Command/ServerLogCommand.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Formatter\\CompatibilityFormatter' => __DIR__ . '/..' . '/symfony/monolog-bridge/Formatter/CompatibilityFormatter.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Formatter\\ConsoleFormatter' => __DIR__ . '/..' . '/symfony/monolog-bridge/Formatter/ConsoleFormatter.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Formatter\\VarDumperFormatter' => __DIR__ . '/..' . '/symfony/monolog-bridge/Formatter/VarDumperFormatter.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ChromePhpHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/ChromePhpHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\CompatibilityHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/CompatibilityHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\CompatibilityProcessingHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/CompatibilityProcessingHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ConsoleHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/ConsoleHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ElasticsearchLogstashHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/ElasticsearchLogstashHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\FingersCrossed\\HttpCodeActivationStrategy' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/FingersCrossed/HttpCodeActivationStrategy.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\FingersCrossed\\NotFoundActivationStrategy' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/FingersCrossed/NotFoundActivationStrategy.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\FirePHPHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/FirePHPHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\MailerHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/MailerHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\NotifierHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/NotifierHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Handler\\ServerLogHandler' => __DIR__ . '/..' . '/symfony/monolog-bridge/Handler/ServerLogHandler.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Logger' => __DIR__ . '/..' . '/symfony/monolog-bridge/Logger.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\AbstractTokenProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/AbstractTokenProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\CompatibilityProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/CompatibilityProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\ConsoleCommandProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/ConsoleCommandProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\DebugProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/DebugProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\RouteProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/RouteProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\SwitchUserTokenProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/SwitchUserTokenProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\TokenProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/TokenProcessor.php', '_ContaoManager\\Symfony\\Bridge\\Monolog\\Processor\\WebProcessor' => __DIR__ . '/..' . '/symfony/monolog-bridge/Processor/WebProcessor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AbstractPhpFileCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\AnnotationsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/AnnotationsCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\CachePoolClearerCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/CachePoolClearerCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ConfigBuilderCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/ConfigBuilderCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\RouterCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/RouterCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\SerializerCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/SerializerCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\TranslationsCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/TranslationsCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\CacheWarmer\\ValidatorCacheWarmer' => __DIR__ . '/..' . '/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AboutCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AboutCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AbstractConfigCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AbstractConfigCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\AssetsInstallCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/AssetsInstallCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\BuildDebugContainerTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/BuildDebugContainerTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CacheClearCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CacheClearCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolClearCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolClearCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolDeleteCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolDeleteCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolInvalidateTagsCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolInvalidateTagsCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolListCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolListCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CachePoolPruneCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CachePoolPruneCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\CacheWarmupCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/CacheWarmupCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ConfigDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ConfigDumpReferenceCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ConfigDumpReferenceCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\ContainerLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/ContainerLintCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\DebugAutowiringCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/DebugAutowiringCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\EventDispatcherDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/EventDispatcherDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\RouterDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/RouterDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\RouterMatchCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/RouterMatchCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsDecryptToLocalCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsDecryptToLocalCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsEncryptFromLocalCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsEncryptFromLocalCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsGenerateKeysCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsGenerateKeysCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsListCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsListCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsRemoveCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsRemoveCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\SecretsSetCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/SecretsSetCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationDebugCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/TranslationDebugCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\TranslationUpdateCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/TranslationUpdateCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\WorkflowDumpCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/WorkflowDumpCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/XliffLintCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Command\\YamlLintCommand' => __DIR__ . '/..' . '/symfony/framework-bundle/Command/YamlLintCommand.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Application' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Application.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/Descriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/JsonDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/MarkdownDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/TextDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Descriptor/XmlDescriptor.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/framework-bundle/Console/Helper/DescriptorHelper.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/AbstractController.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/ControllerResolver.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/RedirectController.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Controller\\TemplateController' => __DIR__ . '/..' . '/symfony/framework-bundle/Controller/TemplateController.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DataCollector\\AbstractDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/AbstractDataCollector.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/RouterDataCollector.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DataCollector\\TemplateAwareDataCollectorInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/DataCollector/TemplateAwareDataCollectorInterface.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddAnnotationsCachedReaderPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddAnnotationsCachedReaderPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddDebugLogProcessorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddDebugLogProcessorPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\AssetsContextPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/AssetsContextPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ContainerBuilderDebugDumpPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ContainerBuilderDebugDumpPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\DataCollectorTranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/DataCollectorTranslatorPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\EnableLoggerDebugModePass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/EnableLoggerDebugModePass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ErrorLoggerCompilerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ErrorLoggerCompilerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\LoggingTranslatorPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/LoggingTranslatorPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\ProfilerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/ProfilerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\RemoveUnusedSessionMarshallingHandlerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/RemoveUnusedSessionMarshallingHandlerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerRealRefPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TestServiceContainerWeakRefPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerWeakRefPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\TranslationUpdateCommandPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\UnusedTagsPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/UnusedTagsPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Compiler\\WorkflowGuardListenerPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Compiler/WorkflowGuardListenerPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/Configuration.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\FrameworkExtension' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\DependencyInjection\\VirtualRequestStackPass' => __DIR__ . '/..' . '/symfony/framework-bundle/DependencyInjection/VirtualRequestStackPass.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\EventListener\\ConsoleProfilerListener' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/ConsoleProfilerListener.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\EventListener\\SuggestMissingPackageSubscriber' => __DIR__ . '/..' . '/symfony/framework-bundle/EventListener/SuggestMissingPackageSubscriber.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle' => __DIR__ . '/..' . '/symfony/framework-bundle/FrameworkBundle.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache' => __DIR__ . '/..' . '/symfony/framework-bundle/HttpCache/HttpCache.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\KernelBrowser' => __DIR__ . '/..' . '/symfony/framework-bundle/KernelBrowser.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Kernel\\MicroKernelTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Kernel/MicroKernelTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\AnnotatedRouteControllerLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/AnnotatedRouteControllerLoader.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\AttributeRouteControllerLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/AttributeRouteControllerLoader.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\Attribute\\AsRoutingConditionService' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/Attribute/AsRoutingConditionService.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/DelegatingLoader.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableCompiledUrlMatcher' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RedirectableCompiledUrlMatcher.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\RouteLoaderInterface' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/RouteLoaderInterface.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Routing\\Router' => __DIR__ . '/..' . '/symfony/framework-bundle/Routing/Router.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\AbstractVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/AbstractVault.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\DotenvVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/DotenvVault.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Secrets\\SodiumVault' => __DIR__ . '/..' . '/symfony/framework-bundle/Secrets/SodiumVault.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\BrowserKitAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\DomCrawlerAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/DomCrawlerAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\HttpClientAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/HttpClientAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\KernelTestCase' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/KernelTestCase.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\MailerAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/MailerAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\NotificationAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/NotificationAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\TestBrowserToken' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/TestBrowserToken.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\TestContainer' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/TestContainer.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestAssertionsTrait' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/WebTestAssertionsTrait.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Test\\WebTestCase' => __DIR__ . '/..' . '/symfony/framework-bundle/Test/WebTestCase.php', '_ContaoManager\\Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/framework-bundle/Translation/Translator.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\AddProcessorsPass' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/Compiler/AddProcessorsPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\AddSwiftMailerTransportPass' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/Compiler/AddSwiftMailerTransportPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\DebugHandlerPass' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/Compiler/DebugHandlerPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\FixEmptyLoggerPass' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/Compiler/FixEmptyLoggerPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Compiler\\LoggerChannelPass' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/Compiler/LoggerChannelPass.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/Configuration.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\DependencyInjection\\MonologExtension' => __DIR__ . '/..' . '/symfony/monolog-bundle/DependencyInjection/MonologExtension.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\MonologBundle' => __DIR__ . '/..' . '/symfony/monolog-bundle/MonologBundle.php', '_ContaoManager\\Symfony\\Bundle\\MonologBundle\\SwiftMailer\\MessageFactory' => __DIR__ . '/..' . '/symfony/monolog-bundle/SwiftMailer/MessageFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\CacheWarmer\\ExpressionCacheWarmer' => __DIR__ . '/..' . '/symfony/security-bundle/CacheWarmer/ExpressionCacheWarmer.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Command\\DebugFirewallCommand' => __DIR__ . '/..' . '/symfony/security-bundle/Command/DebugFirewallCommand.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DataCollector\\SecurityDataCollector' => __DIR__ . '/..' . '/symfony/security-bundle/DataCollector/SecurityDataCollector.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableFirewallListener' => __DIR__ . '/..' . '/symfony/security-bundle/Debug/TraceableFirewallListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\TraceableListenerTrait' => __DIR__ . '/..' . '/symfony/security-bundle/Debug/TraceableListenerTrait.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\WrappedLazyListener' => __DIR__ . '/..' . '/symfony/security-bundle/Debug/WrappedLazyListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/security-bundle/Debug/WrappedListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\AddExpressionLanguageProvidersPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/AddExpressionLanguageProvidersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\AddSecurityVotersPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/AddSecurityVotersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\AddSessionDomainConstraintPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/AddSessionDomainConstraintPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\CleanRememberMeVerifierPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/CleanRememberMeVerifierPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\MakeFirewallsEventDispatcherTraceablePass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/MakeFirewallsEventDispatcherTraceablePass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterCsrfFeaturesPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterCsrfFeaturesPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterEntryPointPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterEntryPointPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterGlobalSecurityEventListenersPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterGlobalSecurityEventListenersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterLdapLocatorPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterLdapLocatorPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\RegisterTokenUsageTrackingPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/RegisterTokenUsageTrackingPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\ReplaceDecoratedRememberMeHandlerPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/ReplaceDecoratedRememberMeHandlerPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Compiler\\SortFirewallListenersPass' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Compiler/SortFirewallListenersPass.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\MainConfiguration' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/MainConfiguration.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\SecurityExtension' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/SecurityExtension.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\OidcTokenHandlerFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/OidcTokenHandlerFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\OidcUserInfoTokenHandlerFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/OidcUserInfoTokenHandlerFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\ServiceTokenHandlerFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/ServiceTokenHandlerFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\AccessToken\\TokenHandlerFactoryInterface' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/AccessToken/TokenHandlerFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\AbstractFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/AbstractFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\AccessTokenFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/AccessTokenFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\AuthenticatorFactoryInterface' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/AuthenticatorFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\CustomAuthenticatorFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/CustomAuthenticatorFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\FirewallListenerFactoryInterface' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/FirewallListenerFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\FormLoginFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/FormLoginFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\FormLoginLdapFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/FormLoginLdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\HttpBasicFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/HttpBasicFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\HttpBasicLdapFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/HttpBasicLdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\JsonLoginFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/JsonLoginFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\JsonLoginLdapFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/JsonLoginLdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\LdapFactoryTrait' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/LdapFactoryTrait.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\LoginLinkFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/LoginLinkFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\LoginThrottlingFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/LoginThrottlingFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\RememberMeFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/RememberMeFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\RemoteUserFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/RemoteUserFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\SignatureAlgorithmFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/SignatureAlgorithmFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\StatelessAuthenticatorFactoryInterface' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/StatelessAuthenticatorFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\Factory\\X509Factory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/Factory/X509Factory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\UserProvider\\InMemoryFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/UserProvider/InMemoryFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\UserProvider\\LdapFactory' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/UserProvider/LdapFactory.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\DependencyInjection\\Security\\UserProvider\\UserProviderFactoryInterface' => __DIR__ . '/..' . '/symfony/security-bundle/DependencyInjection/Security/UserProvider/UserProviderFactoryInterface.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\FirewallListener' => __DIR__ . '/..' . '/symfony/security-bundle/EventListener/FirewallListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\EventListener\\VoteListener' => __DIR__ . '/..' . '/symfony/security-bundle/EventListener/VoteListener.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\LoginLink\\FirewallAwareLoginLinkHandler' => __DIR__ . '/..' . '/symfony/security-bundle/LoginLink/FirewallAwareLoginLinkHandler.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\RememberMe\\DecoratedRememberMeHandler' => __DIR__ . '/..' . '/symfony/security-bundle/RememberMe/DecoratedRememberMeHandler.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\RememberMe\\FirewallAwareRememberMeHandler' => __DIR__ . '/..' . '/symfony/security-bundle/RememberMe/FirewallAwareRememberMeHandler.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Routing\\LogoutRouteLoader' => __DIR__ . '/..' . '/symfony/security-bundle/Routing/LogoutRouteLoader.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security' => __DIR__ . '/..' . '/symfony/security-bundle/Security.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\SecurityBundle' => __DIR__ . '/..' . '/symfony/security-bundle/SecurityBundle.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallAwareTrait' => __DIR__ . '/..' . '/symfony/security-bundle/Security/FirewallAwareTrait.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallConfig' => __DIR__ . '/..' . '/symfony/security-bundle/Security/FirewallConfig.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallContext' => __DIR__ . '/..' . '/symfony/security-bundle/Security/FirewallContext.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\FirewallMap' => __DIR__ . '/..' . '/symfony/security-bundle/Security/FirewallMap.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\LazyFirewallContext' => __DIR__ . '/..' . '/symfony/security-bundle/Security/LazyFirewallContext.php', '_ContaoManager\\Symfony\\Bundle\\SecurityBundle\\Security\\UserAuthenticator' => __DIR__ . '/..' . '/symfony/security-bundle/Security/UserAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ApcuAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ApcuAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ArrayAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ChainAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ChainAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\CouchbaseBucketAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseBucketAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\CouchbaseCollectionAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/CouchbaseCollectionAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\DoctrineDbalAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/DoctrineDbalAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\FilesystemTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/FilesystemTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\MemcachedAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/MemcachedAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/NullAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ParameterNormalizer' => __DIR__ . '/..' . '/symfony/cache/Adapter/ParameterNormalizer.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PdoAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PdoAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PhpArrayAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpArrayAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\PhpFilesAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/PhpFilesAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\ProxyAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/ProxyAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\Psr16Adapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/Psr16Adapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\RedisAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\RedisTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/RedisTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php', '_ContaoManager\\Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php', '_ContaoManager\\Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CacheCollectorPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CacheCollectorPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolClearerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolClearerPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\DependencyInjection\\CachePoolPrunerPass' => __DIR__ . '/..' . '/symfony/cache/DependencyInjection/CachePoolPrunerPass.php', '_ContaoManager\\Symfony\\Component\\Cache\\Exception\\CacheException' => __DIR__ . '/..' . '/symfony/cache/Exception/CacheException.php', '_ContaoManager\\Symfony\\Component\\Cache\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/cache/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Cache\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/cache/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Cache\\LockRegistry' => __DIR__ . '/..' . '/symfony/cache/LockRegistry.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\DefaultMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DefaultMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\DeflateMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/DeflateMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\MarshallerInterface' => __DIR__ . '/..' . '/symfony/cache/Marshaller/MarshallerInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\SodiumMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/SodiumMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Marshaller\\TagAwareMarshaller' => __DIR__ . '/..' . '/symfony/cache/Marshaller/TagAwareMarshaller.php', '_ContaoManager\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationDispatcher' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationDispatcher.php', '_ContaoManager\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationHandler' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationHandler.php', '_ContaoManager\\Symfony\\Component\\Cache\\Messenger\\EarlyExpirationMessage' => __DIR__ . '/..' . '/symfony/cache/Messenger/EarlyExpirationMessage.php', '_ContaoManager\\Symfony\\Component\\Cache\\PruneableInterface' => __DIR__ . '/..' . '/symfony/cache/PruneableInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Psr16Cache' => __DIR__ . '/..' . '/symfony/cache/Psr16Cache.php', '_ContaoManager\\Symfony\\Component\\Cache\\ResettableInterface' => __DIR__ . '/..' . '/symfony/cache/ResettableInterface.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\AbstractAdapterTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractAdapterTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\ContractsTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ContractsTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\FilesystemCommonTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemCommonTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\FilesystemTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/FilesystemTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Redis5Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/Redis5Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Redis6Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/Redis6Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Redis6ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Redis6ProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisCluster5Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisCluster5Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisCluster6Proxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisCluster6Proxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisCluster6ProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisCluster6ProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisClusterNodeProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterNodeProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisClusterProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisClusterProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RedisTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RedisTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RelayProxy' => __DIR__ . '/..' . '/symfony/cache/Traits/RelayProxy.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\RelayProxyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/RelayProxyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\CopyTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/CopyTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\GeosearchTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GeosearchTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\GetrangeTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/GetrangeTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\HsetTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/HsetTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\MoveTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/MoveTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\NullableReturnTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/NullableReturnTrait.php', '_ContaoManager\\Symfony\\Component\\Cache\\Traits\\Relay\\PfcountTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/Relay/PfcountTrait.php', '_ContaoManager\\Symfony\\Component\\Clock\\Clock' => __DIR__ . '/..' . '/symfony/clock/Clock.php', '_ContaoManager\\Symfony\\Component\\Clock\\ClockAwareTrait' => __DIR__ . '/..' . '/symfony/clock/ClockAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Clock\\ClockInterface' => __DIR__ . '/..' . '/symfony/clock/ClockInterface.php', '_ContaoManager\\Symfony\\Component\\Clock\\DatePoint' => __DIR__ . '/..' . '/symfony/clock/DatePoint.php', '_ContaoManager\\Symfony\\Component\\Clock\\MockClock' => __DIR__ . '/..' . '/symfony/clock/MockClock.php', '_ContaoManager\\Symfony\\Component\\Clock\\MonotonicClock' => __DIR__ . '/..' . '/symfony/clock/MonotonicClock.php', '_ContaoManager\\Symfony\\Component\\Clock\\NativeClock' => __DIR__ . '/..' . '/symfony/clock/NativeClock.php', '_ContaoManager\\Symfony\\Component\\Clock\\Test\\ClockSensitiveTrait' => __DIR__ . '/..' . '/symfony/clock/Test/ClockSensitiveTrait.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ClassBuilder' => __DIR__ . '/..' . '/symfony/config/Builder/ClassBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ConfigBuilderGenerator' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderGenerator.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ConfigBuilderGeneratorInterface' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\ConfigBuilderInterface' => __DIR__ . '/..' . '/symfony/config/Builder/ConfigBuilderInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\Method' => __DIR__ . '/..' . '/symfony/config/Builder/Method.php', '_ContaoManager\\Symfony\\Component\\Config\\Builder\\Property' => __DIR__ . '/..' . '/symfony/config/Builder/Property.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCache' => __DIR__ . '/..' . '/symfony/config/ConfigCache.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactory.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCacheFactoryInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\ConfigCacheInterface' => __DIR__ . '/..' . '/symfony/config/ConfigCacheInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/ArrayNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\BaseNode' => __DIR__ . '/..' . '/symfony/config/Definition/BaseNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\BooleanNode' => __DIR__ . '/..' . '/symfony/config/Definition/BooleanNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ArrayNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\BooleanNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BooleanNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\BuilderAwareInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/BuilderAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\EnumNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/EnumNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ExprBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ExprBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\FloatNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/FloatNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\IntegerNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/IntegerNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\MergeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/MergeBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NodeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NodeParentInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NodeParentInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NormalizationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NormalizationBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\NumericNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/NumericNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ParentNodeDefinitionInterface' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ParentNodeDefinitionInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ScalarNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ScalarNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/TreeBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\ValidationBuilder' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/ValidationBuilder.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Builder\\VariableNodeDefinition' => __DIR__ . '/..' . '/symfony/config/Definition/Builder/VariableNodeDefinition.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ConfigurableInterface' => __DIR__ . '/..' . '/symfony/config/Definition/ConfigurableInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Configuration' => __DIR__ . '/..' . '/symfony/config/Definition/Configuration.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ConfigurationInterface' => __DIR__ . '/..' . '/symfony/config/Definition/ConfigurationInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Configurator\\DefinitionConfigurator' => __DIR__ . '/..' . '/symfony/config/Definition/Configurator/DefinitionConfigurator.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Dumper\\XmlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/XmlReferenceDumper.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Dumper\\YamlReferenceDumper' => __DIR__ . '/..' . '/symfony/config/Definition/Dumper/YamlReferenceDumper.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\EnumNode' => __DIR__ . '/..' . '/symfony/config/Definition/EnumNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\DuplicateKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/DuplicateKeyException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\Exception' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/Exception.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\ForbiddenOverwriteException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/ForbiddenOverwriteException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\InvalidConfigurationException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidConfigurationException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\InvalidDefinitionException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidDefinitionException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\InvalidTypeException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/InvalidTypeException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Exception\\UnsetKeyException' => __DIR__ . '/..' . '/symfony/config/Definition/Exception/UnsetKeyException.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\FloatNode' => __DIR__ . '/..' . '/symfony/config/Definition/FloatNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\IntegerNode' => __DIR__ . '/..' . '/symfony/config/Definition/IntegerNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Loader\\DefinitionFileLoader' => __DIR__ . '/..' . '/symfony/config/Definition/Loader/DefinitionFileLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\NodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/NodeInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\NumericNode' => __DIR__ . '/..' . '/symfony/config/Definition/NumericNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\Processor' => __DIR__ . '/..' . '/symfony/config/Definition/Processor.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\PrototypeNodeInterface' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypeNodeInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\PrototypedArrayNode' => __DIR__ . '/..' . '/symfony/config/Definition/PrototypedArrayNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\ScalarNode' => __DIR__ . '/..' . '/symfony/config/Definition/ScalarNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Definition\\VariableNode' => __DIR__ . '/..' . '/symfony/config/Definition/VariableNode.php', '_ContaoManager\\Symfony\\Component\\Config\\Exception\\FileLoaderImportCircularReferenceException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLoaderImportCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\Config\\Exception\\FileLocatorFileNotFoundException' => __DIR__ . '/..' . '/symfony/config/Exception/FileLocatorFileNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Config\\Exception\\LoaderLoadException' => __DIR__ . '/..' . '/symfony/config/Exception/LoaderLoadException.php', '_ContaoManager\\Symfony\\Component\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/config/FileLocator.php', '_ContaoManager\\Symfony\\Component\\Config\\FileLocatorInterface' => __DIR__ . '/..' . '/symfony/config/FileLocatorInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\DelegatingLoader' => __DIR__ . '/..' . '/symfony/config/Loader/DelegatingLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\DirectoryAwareLoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/DirectoryAwareLoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/FileLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/config/Loader/GlobFileLoader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\Loader' => __DIR__ . '/..' . '/symfony/config/Loader/Loader.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderResolver' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolver.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\LoaderResolverInterface' => __DIR__ . '/..' . '/symfony/config/Loader/LoaderResolverInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Loader\\ParamConfigurator' => __DIR__ . '/..' . '/symfony/config/Loader/ParamConfigurator.php', '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerConfigCache' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCache.php', '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerConfigCacheFactory' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerConfigCacheFactory.php', '_ContaoManager\\Symfony\\Component\\Config\\ResourceCheckerInterface' => __DIR__ . '/..' . '/symfony/config/ResourceCheckerInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ClassExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/ClassExistenceResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ComposerResource' => __DIR__ . '/..' . '/symfony/config/Resource/ComposerResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\DirectoryResource' => __DIR__ . '/..' . '/symfony/config/Resource/DirectoryResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\FileExistenceResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileExistenceResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\FileResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\GlobResource' => __DIR__ . '/..' . '/symfony/config/Resource/GlobResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => __DIR__ . '/..' . '/symfony/config/Resource/ReflectionClassResource.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\ResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/ResourceInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceChecker.php', '_ContaoManager\\Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceInterface.php', '_ContaoManager\\Symfony\\Component\\Config\\Util\\Exception\\InvalidXmlException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/InvalidXmlException.php', '_ContaoManager\\Symfony\\Component\\Config\\Util\\Exception\\XmlParsingException' => __DIR__ . '/..' . '/symfony/config/Util/Exception/XmlParsingException.php', '_ContaoManager\\Symfony\\Component\\Config\\Util\\XmlUtils' => __DIR__ . '/..' . '/symfony/config/Util/XmlUtils.php', '_ContaoManager\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', '_ContaoManager\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', '_ContaoManager\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', '_ContaoManager\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', '_ContaoManager\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', '_ContaoManager\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', '_ContaoManager\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', '_ContaoManager\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php', '_ContaoManager\\Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php', '_ContaoManager\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', '_ContaoManager\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php', '_ContaoManager\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', '_ContaoManager\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', '_ContaoManager\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', '_ContaoManager\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', '_ContaoManager\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php', '_ContaoManager\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php', '_ContaoManager\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', '_ContaoManager\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', '_ContaoManager\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', '_ContaoManager\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', '_ContaoManager\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php', '_ContaoManager\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', '_ContaoManager\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', '_ContaoManager\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', '_ContaoManager\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', '_ContaoManager\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', '_ContaoManager\\Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Alias' => __DIR__ . '/..' . '/symfony/dependency-injection/Alias.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\AbstractArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/AbstractArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ArgumentInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ArgumentInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\BoundArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/BoundArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\IteratorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/IteratorArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\LazyClosure' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/LazyClosure.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ReferenceSetArgumentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ReferenceSetArgumentTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/RewindableGenerator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceClosureArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceClosureArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\ServiceLocatorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/ServiceLocatorArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Argument\\TaggedIteratorArgument' => __DIR__ . '/..' . '/symfony/dependency-injection/Argument/TaggedIteratorArgument.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AsAlias' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsAlias.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AsDecorator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsDecorator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AsTaggedItem' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AsTaggedItem.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Autoconfigure' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Autoconfigure.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutoconfigureTag' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutoconfigureTag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Autowire' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Autowire.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireCallable' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireCallable.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireDecorated' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireDecorated.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireIterator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireIterator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\AutowireServiceClosure' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/AutowireServiceClosure.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Exclude' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Exclude.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\MapDecorated' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/MapDecorated.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/TaggedIterator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\TaggedLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/TaggedLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\Target' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/Target.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Attribute\\When' => __DIR__ . '/..' . '/symfony/dependency-injection/Attribute/When.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ChildDefinition' => __DIR__ . '/..' . '/symfony/dependency-injection/ChildDefinition.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AbstractRecursivePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AbstractRecursivePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AliasDeprecatedPublicServicesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AliasDeprecatedPublicServicesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AnalyzeServiceReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AttributeAutoconfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AttributeAutoconfigurationPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutoAliasServicePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutoAliasServicePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowireAsDecoratorPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireAsDecoratorPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowirePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowirePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredMethodsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\AutowireRequiredPropertiesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckArgumentsValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckCircularReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckDefinitionValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckExceptionOnInvalidReferenceBehaviorPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckReferenceValidityPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CheckTypeDeclarationsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\Compiler' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/Compiler.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/CompilerPassInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\DecoratorServicePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/DecoratorServicePass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\DefinitionErrorExceptionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ExtensionCompilerPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PassConfig.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterAutoconfigureAttributesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterAutoconfigureAttributesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterEnvVarProcessorsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterReverseContainerPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RegisterServiceSubscribersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemoveAbstractDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemoveBuildParametersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveBuildParametersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemovePrivateAliasesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\RemoveUnusedDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ReplaceAliasByActualDefinitionPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveBindingsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveBindingsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveChildDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveClassPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveClassPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveDecoratorStackPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveDecoratorStackPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveEnvPlaceholdersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveFactoryClassPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveHotPathPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveHotPathPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInstanceofConditionalsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveInvalidReferencesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNamedArgumentsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveNoPreloadPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveNoPreloadPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveParameterPlaceHoldersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveReferencesToAliasesPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveServiceSubscribersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ResolveTaggedIteratorArgumentPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceLocatorTagPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraph' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphEdge' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ServiceReferenceGraphNode' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Compiler\\ValidateEnvPlaceholdersPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResource' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/ContainerParametersResource.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Config\\ContainerParametersResourceChecker' => __DIR__ . '/..' . '/symfony/dependency-injection/Config/ContainerParametersResourceChecker.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Container' => __DIR__ . '/..' . '/symfony/dependency-injection/Container.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerAwareInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerAwareTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerBuilder' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerBuilder.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ContainerInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Definition' => __DIR__ . '/..' . '/symfony/dependency-injection/Definition.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\Dumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/Dumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/DumperInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\GraphvizDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/GraphvizDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\PhpDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/PhpDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\Preloader' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/Preloader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\XmlDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/XmlDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Dumper\\YamlDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/Dumper/YamlDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarLoaderInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarLoaderInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarProcessor' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarProcessor.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\EnvVarProcessorInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/EnvVarProcessorInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\AutowiringFailedException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/AutowiringFailedException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/BadMethodCallException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/EnvNotFoundException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\EnvParameterException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/EnvParameterException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\InvalidParameterTypeException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/InvalidParameterTypeException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/OutOfBoundsException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterCircularReferenceException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ParameterCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ParameterNotFoundException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ParameterNotFoundException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceCircularReferenceException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ServiceCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException' => __DIR__ . '/..' . '/symfony/dependency-injection/Exception/ServiceNotFoundException.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ExpressionLanguage' => __DIR__ . '/..' . '/symfony/dependency-injection/ExpressionLanguage.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/dependency-injection/ExpressionLanguageProvider.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/AbstractExtension.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ConfigurableExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ConfigurableExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ConfigurationExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ConfigurationExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\Extension' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/Extension.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\ExtensionTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/ExtensionTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Extension\\PrependExtensionInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/Extension/PrependExtensionInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\InstantiatorInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/Instantiator/InstantiatorInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\LazyServiceInstantiator' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/Instantiator/LazyServiceInstantiator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\Instantiator\\RealServiceInstantiator' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/Instantiator/RealServiceInstantiator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/PhpDumper/DumperInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\LazyServiceDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/PhpDumper/LazyServiceDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\PhpDumper\\NullDumper' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/PhpDumper/NullDumper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\LazyProxy\\ProxyHelper' => __DIR__ . '/..' . '/symfony/dependency-injection/LazyProxy/ProxyHelper.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\ClosureLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/ClosureLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AbstractConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AbstractServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AbstractServiceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\AliasConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/AliasConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ClosureReferenceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ClosureReferenceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ContainerConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\DefaultsConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/DefaultsConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\EnvConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/EnvConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\FromCallableConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/FromCallableConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InlineServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/InlineServiceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\InstanceofConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/InstanceofConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ParametersConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ParametersConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\PrototypeConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/PrototypeConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ReferenceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ReferenceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServiceConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ServiceConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServicesConfigurator' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/ServicesConfigurator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AbstractTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/AbstractTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ArgumentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ArgumentTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutoconfigureTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/AutoconfigureTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\AutowireTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/AutowireTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\BindTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/BindTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\CallTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/CallTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ClassTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ClassTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConfiguratorTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ConfiguratorTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ConstructorTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ConstructorTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DecorateTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/DecorateTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\DeprecateTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/DeprecateTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FactoryTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/FactoryTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FileTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/FileTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\FromCallableTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/FromCallableTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\LazyTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/LazyTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ParentTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ParentTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PropertyTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/PropertyTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\PublicTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/PublicTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\ShareTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/ShareTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\SyntheticTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/SyntheticTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\Traits\\TagTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/Configurator/Traits/TagTrait.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\DirectoryLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/DirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/FileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/GlobFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/IniFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/PhpFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/XmlFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/YamlFileLoader.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Parameter' => __DIR__ . '/..' . '/symfony/dependency-injection/Parameter.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ContainerBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ContainerBagInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\EnvPlaceholderParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/EnvPlaceholderParameterBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\FrozenParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/FrozenParameterBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ParameterBag.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/ParameterBag/ParameterBagInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Reference' => __DIR__ . '/..' . '/symfony/dependency-injection/Reference.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ReverseContainer' => __DIR__ . '/..' . '/symfony/dependency-injection/ReverseContainer.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\ServiceLocator' => __DIR__ . '/..' . '/symfony/dependency-injection/ServiceLocator.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\TaggedContainerInterface' => __DIR__ . '/..' . '/symfony/dependency-injection/TaggedContainerInterface.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\TypedReference' => __DIR__ . '/..' . '/symfony/dependency-injection/TypedReference.php', '_ContaoManager\\Symfony\\Component\\DependencyInjection\\Variable' => __DIR__ . '/..' . '/symfony/dependency-injection/Variable.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\BufferingLogger' => __DIR__ . '/..' . '/symfony/error-handler/BufferingLogger.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Debug' => __DIR__ . '/..' . '/symfony/error-handler/Debug.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\DebugClassLoader' => __DIR__ . '/..' . '/symfony/error-handler/DebugClassLoader.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ClassNotFoundErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ClassNotFoundErrorEnhancer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\ErrorEnhancerInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/ErrorEnhancerInterface.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedFunctionErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedFunctionErrorEnhancer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorEnhancer\\UndefinedMethodErrorEnhancer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorEnhancer/UndefinedMethodErrorEnhancer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorHandler' => __DIR__ . '/..' . '/symfony/error-handler/ErrorHandler.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\CliErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/CliErrorRenderer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\ErrorRendererInterface' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/ErrorRendererInterface.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\FileLinkFormatter' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/FileLinkFormatter.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\HtmlErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/HtmlErrorRenderer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ErrorRenderer\\SerializerErrorRenderer' => __DIR__ . '/..' . '/symfony/error-handler/ErrorRenderer/SerializerErrorRenderer.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError' => __DIR__ . '/..' . '/symfony/error-handler/Error/ClassNotFoundError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\FatalError' => __DIR__ . '/..' . '/symfony/error-handler/Error/FatalError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\OutOfMemoryError' => __DIR__ . '/..' . '/symfony/error-handler/Error/OutOfMemoryError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\UndefinedFunctionError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedFunctionError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Error\\UndefinedMethodError' => __DIR__ . '/..' . '/symfony/error-handler/Error/UndefinedMethodError.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Exception\\FlattenException' => __DIR__ . '/..' . '/symfony/error-handler/Exception/FlattenException.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Exception\\SilencedErrorContext' => __DIR__ . '/..' . '/symfony/error-handler/Exception/SilencedErrorContext.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\Internal\\TentativeTypes' => __DIR__ . '/..' . '/symfony/error-handler/Internal/TentativeTypes.php', '_ContaoManager\\Symfony\\Component\\ErrorHandler\\ThrowableUtils' => __DIR__ . '/..' . '/symfony/error-handler/ThrowableUtils.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\Attribute\\AsEventListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Attribute/AsEventListener.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\AddEventAliasesPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/AddEventAliasesPass.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcherInterface.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventSubscriberInterface.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\GenericEvent' => __DIR__ . '/..' . '/symfony/event-dispatcher/GenericEvent.php', '_ContaoManager\\Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/ImmutableEventDispatcher.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', '_ContaoManager\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', '_ContaoManager\\Symfony\\Component\\Finder\\Comparator\\Comparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/Comparator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Comparator\\DateComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/DateComparator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Comparator\\NumberComparator' => __DIR__ . '/..' . '/symfony/finder/Comparator/NumberComparator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/finder/Exception/AccessDeniedException.php', '_ContaoManager\\Symfony\\Component\\Finder\\Exception\\DirectoryNotFoundException' => __DIR__ . '/..' . '/symfony/finder/Exception/DirectoryNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Finder\\Finder' => __DIR__ . '/..' . '/symfony/finder/Finder.php', '_ContaoManager\\Symfony\\Component\\Finder\\Gitignore' => __DIR__ . '/..' . '/symfony/finder/Gitignore.php', '_ContaoManager\\Symfony\\Component\\Finder\\Glob' => __DIR__ . '/..' . '/symfony/finder/Glob.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\CustomFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/CustomFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\DateRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DateRangeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\DepthRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/DepthRangeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\ExcludeDirectoryFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\FileTypeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FileTypeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\FilecontentFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilecontentFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\FilenameFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/FilenameFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\LazyIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/LazyIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\MultiplePcreFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/MultiplePcreFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\PathFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/PathFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\RecursiveDirectoryIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/RecursiveDirectoryIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\SizeRangeFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SizeRangeFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\SortableIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/SortableIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\Iterator\\VcsIgnoredFilterIterator' => __DIR__ . '/..' . '/symfony/finder/Iterator/VcsIgnoredFilterIterator.php', '_ContaoManager\\Symfony\\Component\\Finder\\SplFileInfo' => __DIR__ . '/..' . '/symfony/finder/SplFileInfo.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\AcceptHeader' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeader.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\AcceptHeaderItem' => __DIR__ . '/..' . '/symfony/http-foundation/AcceptHeaderItem.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\BinaryFileResponse' => __DIR__ . '/..' . '/symfony/http-foundation/BinaryFileResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ChainRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/ChainRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Cookie' => __DIR__ . '/..' . '/symfony/http-foundation/Cookie.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\BadRequestException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/BadRequestException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\ConflictingHeadersException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/ConflictingHeadersException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\JsonException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/JsonException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\RequestExceptionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/RequestExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\SessionNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SessionNotFoundException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\SuspiciousOperationException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/SuspiciousOperationException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/symfony/http-foundation/Exception/UnexpectedValueException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ExpressionRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/ExpressionRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\FileBag' => __DIR__ . '/..' . '/symfony/http-foundation/FileBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/AccessDeniedException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\CannotWriteFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/CannotWriteFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\ExtensionFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/ExtensionFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\FileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FileNotFoundException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\FormSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/FormSizeFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\IniSizeFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/IniSizeFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\NoFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\NoTmpDirFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/NoTmpDirFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\PartialFileException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/PartialFileException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UnexpectedTypeException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Exception\\UploadException' => __DIR__ . '/..' . '/symfony/http-foundation/File/Exception/UploadException.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\File' => __DIR__ . '/..' . '/symfony/http-foundation/File/File.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\Stream' => __DIR__ . '/..' . '/symfony/http-foundation/File/Stream.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\File\\UploadedFile' => __DIR__ . '/..' . '/symfony/http-foundation/File/UploadedFile.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\HeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\HeaderUtils' => __DIR__ . '/..' . '/symfony/http-foundation/HeaderUtils.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\InputBag' => __DIR__ . '/..' . '/symfony/http-foundation/InputBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\IpUtils' => __DIR__ . '/..' . '/symfony/http-foundation/IpUtils.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\JsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/JsonResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ParameterBag' => __DIR__ . '/..' . '/symfony/http-foundation/ParameterBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RateLimiter\\AbstractRequestRateLimiter' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RateLimiter\\PeekableRequestRateLimiterInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/PeekableRequestRateLimiterInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RateLimiter\\RequestRateLimiterInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RedirectResponse' => __DIR__ . '/..' . '/symfony/http-foundation/RedirectResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Request' => __DIR__ . '/..' . '/symfony/http-foundation/Request.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\AttributesRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/AttributesRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\ExpressionRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/ExpressionRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\HostRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/HostRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\IpsRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/IpsRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\IsJsonRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/IsJsonRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\MethodRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/MethodRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\PathRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/PathRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\PortRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/PortRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestMatcher\\SchemeRequestMatcher' => __DIR__ . '/..' . '/symfony/http-foundation/RequestMatcher/SchemeRequestMatcher.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\RequestStack' => __DIR__ . '/..' . '/symfony/http-foundation/RequestStack.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Response' => __DIR__ . '/..' . '/symfony/http-foundation/Response.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ResponseHeaderBag' => __DIR__ . '/..' . '/symfony/http-foundation/ResponseHeaderBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\ServerBag' => __DIR__ . '/..' . '/symfony/http-foundation/ServerBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Attribute\\AttributeBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\FlashBagAwareSessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/FlashBagAwareSessionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Flash\\AutoExpireFlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Flash/FlashBagInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Session' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Session.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionBagInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionBagProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionBagProxy.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionFactoryInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\SessionUtils' => __DIR__ . '/..' . '/symfony/http-foundation/Session/SessionUtils.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\AbstractSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\IdentityMarshaller' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MarshallingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MemcachedSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MigratingSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\MongoDbSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NullSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\PdoSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\RedisSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\SessionHandlerFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\StrictSessionHandler' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MetadataBag' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MetadataBag.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockArraySessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\MockFileSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorageFactory' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageFactoryInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\StreamedJsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedJsonResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\StreamedResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedResponse.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseFormatSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderLocationSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsUnprocessable' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\UriSigner' => __DIR__ . '/..' . '/symfony/http-foundation/UriSigner.php', '_ContaoManager\\Symfony\\Component\\HttpFoundation\\UrlHelper' => __DIR__ . '/..' . '/symfony/http-foundation/UrlHelper.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\AsController' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/AsController.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\AsTargetedValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/AsTargetedValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\Cache' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/Cache.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapDateTime' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapDateTime.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapQueryParameter' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapQueryParameter.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapQueryString' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapQueryString.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\MapRequestPayload' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/MapRequestPayload.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\ValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/ValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\WithHttpStatus' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/WithHttpStatus.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Attribute\\WithLogLevel' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/WithLogLevel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\AbstractBundle' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/AbstractBundle.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\Bundle' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/Bundle.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\BundleExtension' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/BundleExtension.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Bundle/BundleInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\CacheClearerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/CacheClearerInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\ChainCacheClearer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/ChainCacheClearer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheClearer\\Psr6CacheClearer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheClearer/Psr6CacheClearer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmer' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerAggregate' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\CacheWarmerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/CacheWarmerInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\CacheWarmer\\WarmableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/CacheWarmer/WarmableInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Config\\FileLocator' => __DIR__ . '/..' . '/symfony/http-kernel/Config/FileLocator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadata' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadata.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactory' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\ControllerMetadata\\ArgumentMetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/http-kernel/ControllerMetadata/ArgumentMetadataFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\BackedEnumValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/BackedEnumValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DateTimeValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\DefaultValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/DefaultValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\NotTaggedControllerValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/NotTaggedControllerValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\QueryParameterValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/QueryParameterValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestAttributeValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestAttributeValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestPayloadValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\RequestValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/RequestValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\ServiceValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/ServiceValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\SessionValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/SessionValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\TraceableValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/TraceableValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\UidValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/UidValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver\\VariadicValueResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentResolver/VariadicValueResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ArgumentValueResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ContainerControllerResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ControllerReference' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerReference.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ControllerResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ErrorController' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ErrorController.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\TraceableArgumentResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableArgumentResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\TraceableControllerResolver' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/TraceableControllerResolver.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Controller\\ValueResolverInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Controller/ValueResolverInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\AjaxDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/AjaxDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\ConfigDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/ConfigDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\DataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\DataCollectorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DataCollectorInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\DumpDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/DumpDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\EventDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/EventDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\ExceptionDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/ExceptionDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\LateDataCollectorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/LateDataCollectorInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\LoggerDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/LoggerDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\MemoryDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/MemoryDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RequestDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\RouterDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/RouterDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DataCollector\\TimeDataCollector' => __DIR__ . '/..' . '/symfony/http-kernel/DataCollector/TimeDataCollector.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\ErrorHandlerConfigurator' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/ErrorHandlerConfigurator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\FileLinkFormatter' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/FileLinkFormatter.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/TraceableEventDispatcher.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Debug\\VirtualRequestStack' => __DIR__ . '/..' . '/symfony/http-kernel/Debug/VirtualRequestStack.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\AddAnnotatedClassesToCachePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/AddAnnotatedClassesToCachePass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ConfigurableExtension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ConfigurableExtension.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ControllerArgumentValueResolverPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ControllerArgumentValueResolverPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\Extension' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/Extension.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\FragmentRendererPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/FragmentRendererPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\LazyLoadingFragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\LoggerPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/LoggerPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/MergeExtensionConfigurationPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\RegisterLocaleAwareServicesPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RegisterLocaleAwareServicesPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\RemoveEmptyControllerArgumentLocatorsPass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/RemoveEmptyControllerArgumentLocatorsPass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ResettableServicePass' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ResettableServicePass.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\DependencyInjection\\ServicesResetter' => __DIR__ . '/..' . '/symfony/http-kernel/DependencyInjection/ServicesResetter.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\AbstractSessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AbstractSessionListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\AddRequestFormatsListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/AddRequestFormatsListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\CacheAttributeListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/CacheAttributeListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DebugHandlersListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DebugHandlersListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DisallowRobotsIndexingListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DisallowRobotsIndexingListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\DumpListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/DumpListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ErrorListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\FragmentListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/FragmentListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\LocaleAwareListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleAwareListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\LocaleListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/LocaleListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ProfilerListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ProfilerListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ResponseListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\RouterListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/RouterListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\SessionListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SessionListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\StreamedResponseListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/StreamedResponseListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\SurrogateListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/SurrogateListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\EventListener\\ValidateRequestListener' => __DIR__ . '/..' . '/symfony/http-kernel/EventListener/ValidateRequestListener.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ControllerArgumentsEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerArgumentsEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ControllerEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ControllerEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ExceptionEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ExceptionEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\FinishRequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/FinishRequestEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\KernelEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/KernelEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\RequestEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/RequestEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ResponseEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ResponseEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\TerminateEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/TerminateEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Event\\ViewEvent' => __DIR__ . '/..' . '/symfony/http-kernel/Event/ViewEvent.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/AccessDeniedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/BadRequestHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ConflictHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ConflictHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ControllerDoesNotReturnResponseException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ControllerDoesNotReturnResponseException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\GoneHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/GoneHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\HttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\HttpExceptionInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/HttpExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\InvalidMetadataException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/InvalidMetadataException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\LengthRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/LengthRequiredHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\LockedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/LockedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/MethodNotAllowedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\NotAcceptableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotAcceptableHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/NotFoundHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\PreconditionFailedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/PreconditionFailedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\PreconditionRequiredHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/PreconditionRequiredHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ResolverNotFoundException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ResolverNotFoundException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\ServiceUnavailableHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/ServiceUnavailableHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\TooManyRequestsHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/TooManyRequestsHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnauthorizedHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnexpectedSessionUsageException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnexpectedSessionUsageException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnprocessableEntityHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnprocessableEntityHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Exception\\UnsupportedMediaTypeHttpException' => __DIR__ . '/..' . '/symfony/http-kernel/Exception/UnsupportedMediaTypeHttpException.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\AbstractSurrogateFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/AbstractSurrogateFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\EsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/EsiFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentHandler' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentHandler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentRendererInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentRendererInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGenerator' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentUriGenerator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\FragmentUriGeneratorInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/FragmentUriGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\HIncludeFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/HIncludeFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\InlineFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/InlineFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\RoutableFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/RoutableFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Fragment\\SsiFragmentRenderer' => __DIR__ . '/..' . '/symfony/http-kernel/Fragment/SsiFragmentRenderer.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\AbstractSurrogate' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/AbstractSurrogate.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\Esi' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Esi.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\HttpCache' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/HttpCache.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategy' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/ResponseCacheStrategy.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\ResponseCacheStrategyInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/ResponseCacheStrategyInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\Ssi' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Ssi.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\Store' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/Store.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/StoreInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\SubRequestHandler' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SubRequestHandler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpCache\\SurrogateInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpCache/SurrogateInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpClientKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpClientKernel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernel' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernelBrowser' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelBrowser.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\HttpKernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/HttpKernelInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Kernel' => __DIR__ . '/..' . '/symfony/http-kernel/Kernel.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\KernelEvents' => __DIR__ . '/..' . '/symfony/http-kernel/KernelEvents.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\KernelInterface' => __DIR__ . '/..' . '/symfony/http-kernel/KernelInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Log\\DebugLoggerConfigurator' => __DIR__ . '/..' . '/symfony/http-kernel/Log/DebugLoggerConfigurator.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Log\\DebugLoggerInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Log/DebugLoggerInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Log\\Logger' => __DIR__ . '/..' . '/symfony/http-kernel/Log/Logger.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\FileProfilerStorage' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/FileProfilerStorage.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\Profile' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/Profile.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\Profiler' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/Profiler.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\Profiler\\ProfilerStorageInterface' => __DIR__ . '/..' . '/symfony/http-kernel/Profiler/ProfilerStorageInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\RebootableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/RebootableInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\TerminableInterface' => __DIR__ . '/..' . '/symfony/http-kernel/TerminableInterface.php', '_ContaoManager\\Symfony\\Component\\HttpKernel\\UriSigner' => __DIR__ . '/..' . '/symfony/http-kernel/UriSigner.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Command\\UserPasswordHashCommand' => __DIR__ . '/..' . '/symfony/password-hasher/Command/UserPasswordHashCommand.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/password-hasher/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Exception\\InvalidPasswordException' => __DIR__ . '/..' . '/symfony/password-hasher/Exception/InvalidPasswordException.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/password-hasher/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\CheckPasswordLengthTrait' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/CheckPasswordLengthTrait.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\MessageDigestPasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/MessageDigestPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\MigratingPasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/MigratingPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\NativePasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/NativePasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherAwareInterface' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/PasswordHasherAwareInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactory' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/PasswordHasherFactory.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PasswordHasherFactoryInterface' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/PasswordHasherFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\Pbkdf2PasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/Pbkdf2PasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\PlaintextPasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/PlaintextPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\SodiumPasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/SodiumPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasher' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/UserPasswordHasher.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasherInterface' => __DIR__ . '/..' . '/symfony/password-hasher/Hasher/UserPasswordHasherInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\LegacyPasswordHasherInterface' => __DIR__ . '/..' . '/symfony/password-hasher/LegacyPasswordHasherInterface.php', '_ContaoManager\\Symfony\\Component\\PasswordHasher\\PasswordHasherInterface' => __DIR__ . '/..' . '/symfony/password-hasher/PasswordHasherInterface.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/process/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/process/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/process/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessFailedException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ProcessSignaledException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessSignaledException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\ProcessTimedOutException' => __DIR__ . '/..' . '/symfony/process/Exception/ProcessTimedOutException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\RunProcessFailedException' => __DIR__ . '/..' . '/symfony/process/Exception/RunProcessFailedException.php', '_ContaoManager\\Symfony\\Component\\Process\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/process/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Process\\ExecutableFinder' => __DIR__ . '/..' . '/symfony/process/ExecutableFinder.php', '_ContaoManager\\Symfony\\Component\\Process\\InputStream' => __DIR__ . '/..' . '/symfony/process/InputStream.php', '_ContaoManager\\Symfony\\Component\\Process\\Messenger\\RunProcessContext' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessContext.php', '_ContaoManager\\Symfony\\Component\\Process\\Messenger\\RunProcessMessage' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessage.php', '_ContaoManager\\Symfony\\Component\\Process\\Messenger\\RunProcessMessageHandler' => __DIR__ . '/..' . '/symfony/process/Messenger/RunProcessMessageHandler.php', '_ContaoManager\\Symfony\\Component\\Process\\PhpExecutableFinder' => __DIR__ . '/..' . '/symfony/process/PhpExecutableFinder.php', '_ContaoManager\\Symfony\\Component\\Process\\PhpProcess' => __DIR__ . '/..' . '/symfony/process/PhpProcess.php', '_ContaoManager\\Symfony\\Component\\Process\\PhpSubprocess' => __DIR__ . '/..' . '/symfony/process/PhpSubprocess.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\AbstractPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/AbstractPipes.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\PipesInterface' => __DIR__ . '/..' . '/symfony/process/Pipes/PipesInterface.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\UnixPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/UnixPipes.php', '_ContaoManager\\Symfony\\Component\\Process\\Pipes\\WindowsPipes' => __DIR__ . '/..' . '/symfony/process/Pipes/WindowsPipes.php', '_ContaoManager\\Symfony\\Component\\Process\\Process' => __DIR__ . '/..' . '/symfony/process/Process.php', '_ContaoManager\\Symfony\\Component\\Process\\ProcessUtils' => __DIR__ . '/..' . '/symfony/process/ProcessUtils.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\AccessException' => __DIR__ . '/..' . '/symfony/property-access/Exception/AccessException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/property-access/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/property-access/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\InvalidPropertyPathException' => __DIR__ . '/..' . '/symfony/property-access/Exception/InvalidPropertyPathException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\NoSuchIndexException' => __DIR__ . '/..' . '/symfony/property-access/Exception/NoSuchIndexException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\NoSuchPropertyException' => __DIR__ . '/..' . '/symfony/property-access/Exception/NoSuchPropertyException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/symfony/property-access/Exception/OutOfBoundsException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\UnexpectedTypeException' => __DIR__ . '/..' . '/symfony/property-access/Exception/UnexpectedTypeException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\Exception\\UninitializedPropertyException' => __DIR__ . '/..' . '/symfony/property-access/Exception/UninitializedPropertyException.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccess' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccess.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessor' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessor.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessorBuilder' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessorBuilder.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyAccessorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyAccessorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPath' => __DIR__ . '/..' . '/symfony/property-access/PropertyPath.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathBuilder' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathBuilder.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathIterator' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIterator.php', '_ContaoManager\\Symfony\\Component\\PropertyAccess\\PropertyPathIteratorInterface' => __DIR__ . '/..' . '/symfony/property-access/PropertyPathIteratorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoConstructorPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoConstructorPass.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\DependencyInjection\\PropertyInfoPass' => __DIR__ . '/..' . '/symfony/property-info/DependencyInjection/PropertyInfoPass.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorArgumentTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorArgumentTypeExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ConstructorExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ConstructorExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\PhpDocExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/PhpDocExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\PhpStanExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/PhpStanExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\ReflectionExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/ReflectionExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Extractor\\SerializerExtractor' => __DIR__ . '/..' . '/symfony/property-info/Extractor/SerializerExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PhpStan\\NameScope' => __DIR__ . '/..' . '/symfony/property-info/PhpStan/NameScope.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PhpStan\\NameScopeFactory' => __DIR__ . '/..' . '/symfony/property-info/PhpStan/NameScopeFactory.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyAccessExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyAccessExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyDescriptionExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyDescriptionExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoCacheExtractor' => __DIR__ . '/..' . '/symfony/property-info/PropertyInfoCacheExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoExtractor' => __DIR__ . '/..' . '/symfony/property-info/PropertyInfoExtractor.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInfoExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyInfoExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyInitializableExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyInitializableExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyListExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyListExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyReadInfo' => __DIR__ . '/..' . '/symfony/property-info/PropertyReadInfo.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyReadInfoExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyReadInfoExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyTypeExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyTypeExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyWriteInfo' => __DIR__ . '/..' . '/symfony/property-info/PropertyWriteInfo.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\PropertyWriteInfoExtractorInterface' => __DIR__ . '/..' . '/symfony/property-info/PropertyWriteInfoExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Type' => __DIR__ . '/..' . '/symfony/property-info/Type.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Util\\PhpDocTypeHelper' => __DIR__ . '/..' . '/symfony/property-info/Util/PhpDocTypeHelper.php', '_ContaoManager\\Symfony\\Component\\PropertyInfo\\Util\\PhpStanTypeHelper' => __DIR__ . '/..' . '/symfony/property-info/Util/PhpStanTypeHelper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Alias' => __DIR__ . '/..' . '/symfony/routing/Alias.php', '_ContaoManager\\Symfony\\Component\\Routing\\Annotation\\Route' => __DIR__ . '/..' . '/symfony/routing/Annotation/Route.php', '_ContaoManager\\Symfony\\Component\\Routing\\Attribute\\Route' => __DIR__ . '/..' . '/symfony/routing/Attribute/Route.php', '_ContaoManager\\Symfony\\Component\\Routing\\CompiledRoute' => __DIR__ . '/..' . '/symfony/routing/CompiledRoute.php', '_ContaoManager\\Symfony\\Component\\Routing\\DependencyInjection\\AddExpressionLanguageProvidersPass' => __DIR__ . '/..' . '/symfony/routing/DependencyInjection/AddExpressionLanguageProvidersPass.php', '_ContaoManager\\Symfony\\Component\\Routing\\DependencyInjection\\RoutingResolverPass' => __DIR__ . '/..' . '/symfony/routing/DependencyInjection/RoutingResolverPass.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/routing/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/routing/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\InvalidParameterException' => __DIR__ . '/..' . '/symfony/routing/Exception/InvalidParameterException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\MethodNotAllowedException' => __DIR__ . '/..' . '/symfony/routing/Exception/MethodNotAllowedException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\MissingMandatoryParametersException' => __DIR__ . '/..' . '/symfony/routing/Exception/MissingMandatoryParametersException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\NoConfigurationException' => __DIR__ . '/..' . '/symfony/routing/Exception/NoConfigurationException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' => __DIR__ . '/..' . '/symfony/routing/Exception/ResourceNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\RouteCircularReferenceException' => __DIR__ . '/..' . '/symfony/routing/Exception/RouteCircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\RouteNotFoundException' => __DIR__ . '/..' . '/symfony/routing/Exception/RouteNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/routing/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\CompiledUrlGenerator' => __DIR__ . '/..' . '/symfony/routing/Generator/CompiledUrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\ConfigurableRequirementsInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/ConfigurableRequirementsInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\CompiledUrlGeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumper' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/GeneratorDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\Dumper\\GeneratorDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/Dumper/GeneratorDumperInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\UrlGenerator' => __DIR__ . '/..' . '/symfony/routing/Generator/UrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface' => __DIR__ . '/..' . '/symfony/routing/Generator/UrlGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AnnotationClassLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationClassLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AnnotationDirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationDirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AnnotationFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AnnotationFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeClassLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AttributeClassLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeDirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AttributeDirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\AttributeFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/AttributeFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ClosureLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ClosureLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\AliasConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/AliasConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\CollectionConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/CollectionConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\ImportConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/ImportConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\RouteConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/RouteConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/RoutingConfigurator.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\AddTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/AddTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\HostTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/HostTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\LocalizedRouteTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/LocalizedRouteTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\PrefixTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/PrefixTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Configurator\\Traits\\RouteTrait' => __DIR__ . '/..' . '/symfony/routing/Loader/Configurator/Traits/RouteTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ContainerLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ContainerLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\DirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/DirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/GlobFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\ObjectLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ObjectLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/PhpFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\Psr4DirectoryLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/Psr4DirectoryLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/XmlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/YamlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\CompiledUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/CompiledUrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\CompiledUrlMatcherTrait' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumper' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumper.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\MatcherDumperInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/MatcherDumperInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\Dumper\\StaticPrefixCollection' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/StaticPrefixCollection.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/routing/Matcher/ExpressionLanguageProvider.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RedirectableUrlMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\RequestMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/RequestMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\TraceableUrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/TraceableUrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\UrlMatcher' => __DIR__ . '/..' . '/symfony/routing/Matcher/UrlMatcher.php', '_ContaoManager\\Symfony\\Component\\Routing\\Matcher\\UrlMatcherInterface' => __DIR__ . '/..' . '/symfony/routing/Matcher/UrlMatcherInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\RequestContext' => __DIR__ . '/..' . '/symfony/routing/RequestContext.php', '_ContaoManager\\Symfony\\Component\\Routing\\RequestContextAwareInterface' => __DIR__ . '/..' . '/symfony/routing/RequestContextAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Requirement\\EnumRequirement' => __DIR__ . '/..' . '/symfony/routing/Requirement/EnumRequirement.php', '_ContaoManager\\Symfony\\Component\\Routing\\Requirement\\Requirement' => __DIR__ . '/..' . '/symfony/routing/Requirement/Requirement.php', '_ContaoManager\\Symfony\\Component\\Routing\\Route' => __DIR__ . '/..' . '/symfony/routing/Route.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouteCollection' => __DIR__ . '/..' . '/symfony/routing/RouteCollection.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouteCompiler' => __DIR__ . '/..' . '/symfony/routing/RouteCompiler.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouteCompilerInterface' => __DIR__ . '/..' . '/symfony/routing/RouteCompilerInterface.php', '_ContaoManager\\Symfony\\Component\\Routing\\Router' => __DIR__ . '/..' . '/symfony/routing/Router.php', '_ContaoManager\\Symfony\\Component\\Routing\\RouterInterface' => __DIR__ . '/..' . '/symfony/routing/RouterInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\AuthenticationEvents' => __DIR__ . '/..' . '/symfony/security-core/AuthenticationEvents.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolver' => __DIR__ . '/..' . '/symfony/security-core/Authentication/AuthenticationTrustResolver.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\AuthenticationTrustResolverInterface' => __DIR__ . '/..' . '/symfony/security-core/Authentication/AuthenticationTrustResolverInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\CacheTokenVerifier' => __DIR__ . '/..' . '/symfony/security-core/Authentication/RememberMe/CacheTokenVerifier.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\InMemoryTokenProvider' => __DIR__ . '/..' . '/symfony/security-core/Authentication/RememberMe/InMemoryTokenProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/RememberMe/PersistentToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\PersistentTokenInterface' => __DIR__ . '/..' . '/symfony/security-core/Authentication/RememberMe/PersistentTokenInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\TokenProviderInterface' => __DIR__ . '/..' . '/symfony/security-core/Authentication/RememberMe/TokenProviderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\RememberMe\\TokenVerifierInterface' => __DIR__ . '/..' . '/symfony/security-core/Authentication/RememberMe/TokenVerifierInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\AbstractToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/AbstractToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\NullToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/NullToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/PreAuthenticatedToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/RememberMeToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorage' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/Storage/TokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\TokenStorageInterface' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/Storage/TokenStorageInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\Storage\\UsageTrackingTokenStorage' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/Storage/UsageTrackingTokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\SwitchUserToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/SwitchUserToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\TokenInterface' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/TokenInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken' => __DIR__ . '/..' . '/symfony/security-core/Authentication/Token/UsernamePasswordToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManager' => __DIR__ . '/..' . '/symfony/security-core/Authorization/AccessDecisionManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AccessDecisionManagerInterface' => __DIR__ . '/..' . '/symfony/security-core/Authorization/AccessDecisionManagerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationChecker' => __DIR__ . '/..' . '/symfony/security-core/Authorization/AuthorizationChecker.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\AuthorizationCheckerInterface' => __DIR__ . '/..' . '/symfony/security-core/Authorization/AuthorizationCheckerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\ExpressionLanguage' => __DIR__ . '/..' . '/symfony/security-core/Authorization/ExpressionLanguage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\ExpressionLanguageProvider' => __DIR__ . '/..' . '/symfony/security-core/Authorization/ExpressionLanguageProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\AccessDecisionStrategyInterface' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Strategy/AccessDecisionStrategyInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\AffirmativeStrategy' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Strategy/AffirmativeStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\ConsensusStrategy' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Strategy/ConsensusStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\PriorityStrategy' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Strategy/PriorityStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Strategy\\UnanimousStrategy' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Strategy/UnanimousStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\TraceableAccessDecisionManager' => __DIR__ . '/..' . '/symfony/security-core/Authorization/TraceableAccessDecisionManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\AuthenticatedVoter' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/AuthenticatedVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\CacheableVoterInterface' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/CacheableVoterInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\ExpressionVoter' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/ExpressionVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\RoleHierarchyVoter' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/RoleHierarchyVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\RoleVoter' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/RoleVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\TraceableVoter' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/TraceableVoter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\Voter' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/Voter.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface' => __DIR__ . '/..' . '/symfony/security-core/Authorization/Voter/VoterInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\AuthenticationEvent' => __DIR__ . '/..' . '/symfony/security-core/Event/AuthenticationEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\AuthenticationSuccessEvent' => __DIR__ . '/..' . '/symfony/security-core/Event/AuthenticationSuccessEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Event\\VoteEvent' => __DIR__ . '/..' . '/symfony/security-core/Event/VoteEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AccessDeniedException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AccountExpiredException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AccountExpiredException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AccountStatusException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AccountStatusException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AuthenticationCredentialsNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationExpiredException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AuthenticationExpiredException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\AuthenticationServiceException' => __DIR__ . '/..' . '/symfony/security-core/Exception/AuthenticationServiceException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException' => __DIR__ . '/..' . '/symfony/security-core/Exception/BadCredentialsException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CookieTheftException' => __DIR__ . '/..' . '/symfony/security-core/Exception/CookieTheftException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CredentialsExpiredException' => __DIR__ . '/..' . '/symfony/security-core/Exception/CredentialsExpiredException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CustomUserMessageAccountStatusException' => __DIR__ . '/..' . '/symfony/security-core/Exception/CustomUserMessageAccountStatusException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\CustomUserMessageAuthenticationException' => __DIR__ . '/..' . '/symfony/security-core/Exception/CustomUserMessageAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\DisabledException' => __DIR__ . '/..' . '/symfony/security-core/Exception/DisabledException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/security-core/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\InsufficientAuthenticationException' => __DIR__ . '/..' . '/symfony/security-core/Exception/InsufficientAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/security-core/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\InvalidCsrfTokenException' => __DIR__ . '/..' . '/symfony/security-core/Exception/InvalidCsrfTokenException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LazyResponseException' => __DIR__ . '/..' . '/symfony/security-core/Exception/LazyResponseException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LockedException' => __DIR__ . '/..' . '/symfony/security-core/Exception/LockedException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/security-core/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\LogoutException' => __DIR__ . '/..' . '/symfony/security-core/Exception/LogoutException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\ProviderNotFoundException' => __DIR__ . '/..' . '/symfony/security-core/Exception/ProviderNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/security-core/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\SessionUnavailableException' => __DIR__ . '/..' . '/symfony/security-core/Exception/SessionUnavailableException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\TokenNotFoundException' => __DIR__ . '/..' . '/symfony/security-core/Exception/TokenNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\TooManyLoginAttemptsAuthenticationException' => __DIR__ . '/..' . '/symfony/security-core/Exception/TooManyLoginAttemptsAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\UnsupportedUserException' => __DIR__ . '/..' . '/symfony/security-core/Exception/UnsupportedUserException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Exception\\UserNotFoundException' => __DIR__ . '/..' . '/symfony/security-core/Exception/UserNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\Role' => __DIR__ . '/..' . '/symfony/security-core/Role/Role.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\RoleHierarchy' => __DIR__ . '/..' . '/symfony/security-core/Role/RoleHierarchy.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\RoleHierarchyInterface' => __DIR__ . '/..' . '/symfony/security-core/Role/RoleHierarchyInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Role\\SwitchUserRole' => __DIR__ . '/..' . '/symfony/security-core/Role/SwitchUserRole.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Security' => __DIR__ . '/..' . '/symfony/security-core/Security.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\Exception\\ExpiredSignatureException' => __DIR__ . '/..' . '/symfony/security-core/Signature/Exception/ExpiredSignatureException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\Exception\\InvalidSignatureException' => __DIR__ . '/..' . '/symfony/security-core/Signature/Exception/InvalidSignatureException.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\ExpiredSignatureStorage' => __DIR__ . '/..' . '/symfony/security-core/Signature/ExpiredSignatureStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Signature\\SignatureHasher' => __DIR__ . '/..' . '/symfony/security-core/Signature/SignatureHasher.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Test\\AccessDecisionStrategyTestCase' => __DIR__ . '/..' . '/symfony/security-core/Test/AccessDecisionStrategyTestCase.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\AttributesBasedUserProviderInterface' => __DIR__ . '/..' . '/symfony/security-core/User/AttributesBasedUserProviderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\ChainUserChecker' => __DIR__ . '/..' . '/symfony/security-core/User/ChainUserChecker.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\ChainUserProvider' => __DIR__ . '/..' . '/symfony/security-core/User/ChainUserProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\EquatableInterface' => __DIR__ . '/..' . '/symfony/security-core/User/EquatableInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUser' => __DIR__ . '/..' . '/symfony/security-core/User/InMemoryUser.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUserChecker' => __DIR__ . '/..' . '/symfony/security-core/User/InMemoryUserChecker.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\InMemoryUserProvider' => __DIR__ . '/..' . '/symfony/security-core/User/InMemoryUserProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\LegacyPasswordAuthenticatedUserInterface' => __DIR__ . '/..' . '/symfony/security-core/User/LegacyPasswordAuthenticatedUserInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\MissingUserProvider' => __DIR__ . '/..' . '/symfony/security-core/User/MissingUserProvider.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\OidcUser' => __DIR__ . '/..' . '/symfony/security-core/User/OidcUser.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\PasswordAuthenticatedUserInterface' => __DIR__ . '/..' . '/symfony/security-core/User/PasswordAuthenticatedUserInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\PasswordUpgraderInterface' => __DIR__ . '/..' . '/symfony/security-core/User/PasswordUpgraderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface' => __DIR__ . '/..' . '/symfony/security-core/User/UserCheckerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserInterface' => __DIR__ . '/..' . '/symfony/security-core/User/UserInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\User\\UserProviderInterface' => __DIR__ . '/..' . '/symfony/security-core/User/UserProviderInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Validator\\Constraints\\UserPassword' => __DIR__ . '/..' . '/symfony/security-core/Validator/Constraints/UserPassword.php', '_ContaoManager\\Symfony\\Component\\Security\\Core\\Validator\\Constraints\\UserPasswordValidator' => __DIR__ . '/..' . '/symfony/security-core/Validator/Constraints/UserPasswordValidator.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\CsrfToken' => __DIR__ . '/..' . '/symfony/security-csrf/CsrfToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\CsrfTokenManager' => __DIR__ . '/..' . '/symfony/security-csrf/CsrfTokenManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\CsrfTokenManagerInterface' => __DIR__ . '/..' . '/symfony/security-csrf/CsrfTokenManagerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\Exception\\TokenNotFoundException' => __DIR__ . '/..' . '/symfony/security-csrf/Exception/TokenNotFoundException.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenGenerator\\TokenGeneratorInterface' => __DIR__ . '/..' . '/symfony/security-csrf/TokenGenerator/TokenGeneratorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenGenerator\\UriSafeTokenGenerator' => __DIR__ . '/..' . '/symfony/security-csrf/TokenGenerator/UriSafeTokenGenerator.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\ClearableTokenStorageInterface' => __DIR__ . '/..' . '/symfony/security-csrf/TokenStorage/ClearableTokenStorageInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\NativeSessionTokenStorage' => __DIR__ . '/..' . '/symfony/security-csrf/TokenStorage/NativeSessionTokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\SessionTokenStorage' => __DIR__ . '/..' . '/symfony/security-csrf/TokenStorage/SessionTokenStorage.php', '_ContaoManager\\Symfony\\Component\\Security\\Csrf\\TokenStorage\\TokenStorageInterface' => __DIR__ . '/..' . '/symfony/security-csrf/TokenStorage/TokenStorageInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessMap' => __DIR__ . '/..' . '/symfony/security-http/AccessMap.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessMapInterface' => __DIR__ . '/..' . '/symfony/security-http/AccessMapInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\AccessTokenExtractorInterface' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/AccessTokenExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\AccessTokenHandlerInterface' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/AccessTokenHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\ChainAccessTokenExtractor' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/ChainAccessTokenExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\FormEncodedBodyExtractor' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/FormEncodedBodyExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\HeaderAccessTokenExtractor' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/HeaderAccessTokenExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\Exception\\InvalidSignatureException' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/Oidc/Exception/InvalidSignatureException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\Exception\\MissingClaimException' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/Oidc/Exception/MissingClaimException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\OidcTokenHandler' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/Oidc/OidcTokenHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\OidcTrait' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/Oidc/OidcTrait.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\Oidc\\OidcUserInfoTokenHandler' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/Oidc/OidcUserInfoTokenHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\AccessToken\\QueryAccessTokenExtractor' => __DIR__ . '/..' . '/symfony/security-http/AccessToken/QueryAccessTokenExtractor.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Attribute\\CurrentUser' => __DIR__ . '/..' . '/symfony/security-http/Attribute/CurrentUser.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Attribute\\IsGranted' => __DIR__ . '/..' . '/symfony/security-http/Attribute/IsGranted.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationFailureHandlerInterface' => __DIR__ . '/..' . '/symfony/security-http/Authentication/AuthenticationFailureHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationSuccessHandlerInterface' => __DIR__ . '/..' . '/symfony/security-http/Authentication/AuthenticationSuccessHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticationUtils' => __DIR__ . '/..' . '/symfony/security-http/Authentication/AuthenticationUtils.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticatorManager' => __DIR__ . '/..' . '/symfony/security-http/Authentication/AuthenticatorManager.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\AuthenticatorManagerInterface' => __DIR__ . '/..' . '/symfony/security-http/Authentication/AuthenticatorManagerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\CustomAuthenticationFailureHandler' => __DIR__ . '/..' . '/symfony/security-http/Authentication/CustomAuthenticationFailureHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\CustomAuthenticationSuccessHandler' => __DIR__ . '/..' . '/symfony/security-http/Authentication/CustomAuthenticationSuccessHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationFailureHandler' => __DIR__ . '/..' . '/symfony/security-http/Authentication/DefaultAuthenticationFailureHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\DefaultAuthenticationSuccessHandler' => __DIR__ . '/..' . '/symfony/security-http/Authentication/DefaultAuthenticationSuccessHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authentication\\UserAuthenticatorInterface' => __DIR__ . '/..' . '/symfony/security-http/Authentication/UserAuthenticatorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AbstractAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/AbstractAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AbstractLoginFormAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/AbstractLoginFormAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AbstractPreAuthenticatedAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/AbstractPreAuthenticatedAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AccessTokenAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/AccessTokenAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\AuthenticatorInterface' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/AuthenticatorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Debug\\TraceableAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Debug/TraceableAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Debug\\TraceableAuthenticatorManagerListener' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Debug/TraceableAuthenticatorManagerListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\FallbackUserLoader' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/FallbackUserLoader.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\FormLoginAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/FormLoginAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\HttpBasicAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/HttpBasicAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\InteractiveAuthenticatorInterface' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/InteractiveAuthenticatorInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\JsonLoginAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/JsonLoginAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\LoginLinkAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/LoginLinkAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\BadgeInterface' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Badge/BadgeInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\CsrfTokenBadge' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Badge/CsrfTokenBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\PasswordUpgradeBadge' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Badge/PasswordUpgradeBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\PreAuthenticatedUserBadge' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Badge/PreAuthenticatedUserBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\RememberMeBadge' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Badge/RememberMeBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Badge\\UserBadge' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Badge/UserBadge.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Credentials\\CredentialsInterface' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Credentials/CredentialsInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Credentials\\CustomCredentials' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Credentials/CustomCredentials.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Credentials\\PasswordCredentials' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Credentials/PasswordCredentials.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\Passport' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/Passport.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Passport\\SelfValidatingPassport' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Passport/SelfValidatingPassport.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\RememberMeAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/RememberMeAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\RemoteUserAuthenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/RemoteUserAuthenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\Token\\PostAuthenticationToken' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/Token/PostAuthenticationToken.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authenticator\\X509Authenticator' => __DIR__ . '/..' . '/symfony/security-http/Authenticator/X509Authenticator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Authorization\\AccessDeniedHandlerInterface' => __DIR__ . '/..' . '/symfony/security-http/Authorization/AccessDeniedHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\SecurityTokenValueResolver' => __DIR__ . '/..' . '/symfony/security-http/Controller/SecurityTokenValueResolver.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Controller\\UserValueResolver' => __DIR__ . '/..' . '/symfony/security-http/Controller/UserValueResolver.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EntryPoint\\AuthenticationEntryPointInterface' => __DIR__ . '/..' . '/symfony/security-http/EntryPoint/AuthenticationEntryPointInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EntryPoint\\Exception\\NotAnEntryPointException' => __DIR__ . '/..' . '/symfony/security-http/EntryPoint/Exception/NotAnEntryPointException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckCredentialsListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/CheckCredentialsListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CheckRememberMeConditionsListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/CheckRememberMeConditionsListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\ClearSiteDataLogoutListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/ClearSiteDataLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CookieClearingLogoutListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/CookieClearingLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CsrfProtectionListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/CsrfProtectionListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\CsrfTokenClearingLogoutListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/CsrfTokenClearingLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\DefaultLogoutListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/DefaultLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\IsGrantedAttributeListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/IsGrantedAttributeListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\LoginThrottlingListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/LoginThrottlingListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\PasswordMigratingListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/PasswordMigratingListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\RememberMeListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/RememberMeListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\SessionLogoutListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/SessionLogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\SessionStrategyListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/SessionStrategyListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserCheckerListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/UserCheckerListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\EventListener\\UserProviderListener' => __DIR__ . '/..' . '/symfony/security-http/EventListener/UserProviderListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\AuthenticationTokenCreatedEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/AuthenticationTokenCreatedEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\CheckPassportEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/CheckPassportEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\InteractiveLoginEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/InteractiveLoginEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LazyResponseEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/LazyResponseEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LoginFailureEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/LoginFailureEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LoginSuccessEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/LoginSuccessEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\LogoutEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/LogoutEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\SwitchUserEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/SwitchUserEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Event\\TokenDeauthenticatedEvent' => __DIR__ . '/..' . '/symfony/security-http/Event/TokenDeauthenticatedEvent.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall' => __DIR__ . '/..' . '/symfony/security-http/Firewall.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\FirewallMap' => __DIR__ . '/..' . '/symfony/security-http/FirewallMap.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\FirewallMapInterface' => __DIR__ . '/..' . '/symfony/security-http/FirewallMapInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AbstractListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/AbstractListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AccessListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/AccessListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\AuthenticatorManagerListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/AuthenticatorManagerListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ChannelListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/ChannelListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ContextListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/ContextListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\ExceptionListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/ExceptionListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\FirewallListenerInterface' => __DIR__ . '/..' . '/symfony/security-http/Firewall/FirewallListenerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\LogoutListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/LogoutListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Firewall\\SwitchUserListener' => __DIR__ . '/..' . '/symfony/security-http/Firewall/SwitchUserListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\HttpUtils' => __DIR__ . '/..' . '/symfony/security-http/HttpUtils.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Impersonate\\ImpersonateUrlGenerator' => __DIR__ . '/..' . '/symfony/security-http/Impersonate/ImpersonateUrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\ExpiredLoginLinkException' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/Exception/ExpiredLoginLinkException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\InvalidLoginLinkAuthenticationException' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/Exception/InvalidLoginLinkAuthenticationException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\InvalidLoginLinkException' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/Exception/InvalidLoginLinkException.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\Exception\\InvalidLoginLinkExceptionInterface' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/Exception/InvalidLoginLinkExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkDetails' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/LoginLinkDetails.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkHandler' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/LoginLinkHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkHandlerInterface' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/LoginLinkHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\LoginLink\\LoginLinkNotification' => __DIR__ . '/..' . '/symfony/security-http/LoginLink/LoginLinkNotification.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Logout\\LogoutUrlGenerator' => __DIR__ . '/..' . '/symfony/security-http/Logout/LogoutUrlGenerator.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\ParameterBagUtils' => __DIR__ . '/..' . '/symfony/security-http/ParameterBagUtils.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RateLimiter\\DefaultLoginRateLimiter' => __DIR__ . '/..' . '/symfony/security-http/RateLimiter/DefaultLoginRateLimiter.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\AbstractRememberMeHandler' => __DIR__ . '/..' . '/symfony/security-http/RememberMe/AbstractRememberMeHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\PersistentRememberMeHandler' => __DIR__ . '/..' . '/symfony/security-http/RememberMe/PersistentRememberMeHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\RememberMeDetails' => __DIR__ . '/..' . '/symfony/security-http/RememberMe/RememberMeDetails.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\RememberMeHandlerInterface' => __DIR__ . '/..' . '/symfony/security-http/RememberMe/RememberMeHandlerInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\ResponseListener' => __DIR__ . '/..' . '/symfony/security-http/RememberMe/ResponseListener.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\RememberMe\\SignatureRememberMeHandler' => __DIR__ . '/..' . '/symfony/security-http/RememberMe/SignatureRememberMeHandler.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\SecurityEvents' => __DIR__ . '/..' . '/symfony/security-http/SecurityEvents.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\SecurityRequestAttributes' => __DIR__ . '/..' . '/symfony/security-http/SecurityRequestAttributes.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Session\\SessionAuthenticationStrategy' => __DIR__ . '/..' . '/symfony/security-http/Session/SessionAuthenticationStrategy.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Session\\SessionAuthenticationStrategyInterface' => __DIR__ . '/..' . '/symfony/security-http/Session/SessionAuthenticationStrategyInterface.php', '_ContaoManager\\Symfony\\Component\\Security\\Http\\Util\\TargetPathTrait' => __DIR__ . '/..' . '/symfony/security-http/Util/TargetPathTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\Context' => __DIR__ . '/..' . '/symfony/serializer/Annotation/Context.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\DiscriminatorMap' => __DIR__ . '/..' . '/symfony/serializer/Annotation/DiscriminatorMap.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\Groups' => __DIR__ . '/..' . '/symfony/serializer/Annotation/Groups.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\Ignore' => __DIR__ . '/..' . '/symfony/serializer/Annotation/Ignore.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\MaxDepth' => __DIR__ . '/..' . '/symfony/serializer/Annotation/MaxDepth.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\SerializedName' => __DIR__ . '/..' . '/symfony/serializer/Annotation/SerializedName.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Annotation\\SerializedPath' => __DIR__ . '/..' . '/symfony/serializer/Annotation/SerializedPath.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\Context' => __DIR__ . '/..' . '/symfony/serializer/Attribute/Context.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\DiscriminatorMap' => __DIR__ . '/..' . '/symfony/serializer/Attribute/DiscriminatorMap.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\Groups' => __DIR__ . '/..' . '/symfony/serializer/Attribute/Groups.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\Ignore' => __DIR__ . '/..' . '/symfony/serializer/Attribute/Ignore.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\MaxDepth' => __DIR__ . '/..' . '/symfony/serializer/Attribute/MaxDepth.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\SerializedName' => __DIR__ . '/..' . '/symfony/serializer/Attribute/SerializedName.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Attribute\\SerializedPath' => __DIR__ . '/..' . '/symfony/serializer/Attribute/SerializedPath.php', '_ContaoManager\\Symfony\\Component\\Serializer\\CacheWarmer\\CompiledClassMetadataCacheWarmer' => __DIR__ . '/..' . '/symfony/serializer/CacheWarmer/CompiledClassMetadataCacheWarmer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Command\\DebugCommand' => __DIR__ . '/..' . '/symfony/serializer/Command/DebugCommand.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\ContextBuilderInterface' => __DIR__ . '/..' . '/symfony/serializer/Context/ContextBuilderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\ContextBuilderTrait' => __DIR__ . '/..' . '/symfony/serializer/Context/ContextBuilderTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\CsvEncoderContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Encoder/CsvEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\JsonEncoderContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Encoder/JsonEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\XmlEncoderContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Encoder/XmlEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Encoder\\YamlEncoderContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Encoder/YamlEncoderContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/AbstractNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\AbstractObjectNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/AbstractObjectNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\BackedEnumNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/BackedEnumNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\ConstraintViolationListNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/ConstraintViolationListNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\DateIntervalNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/DateIntervalNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\DateTimeNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/DateTimeNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\FormErrorNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/FormErrorNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\GetSetMethodNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/GetSetMethodNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\JsonSerializableNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/JsonSerializableNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\ObjectNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/ObjectNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\ProblemNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/ProblemNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\PropertyNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/PropertyNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\UidNormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/UidNormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\Normalizer\\UnwrappingDenormalizerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/Normalizer/UnwrappingDenormalizerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Context\\SerializerContextBuilder' => __DIR__ . '/..' . '/symfony/serializer/Context/SerializerContextBuilder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\DataCollector\\SerializerDataCollector' => __DIR__ . '/..' . '/symfony/serializer/DataCollector/SerializerDataCollector.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Debug\\TraceableEncoder' => __DIR__ . '/..' . '/symfony/serializer/Debug/TraceableEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Debug\\TraceableNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Debug/TraceableNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Debug\\TraceableSerializer' => __DIR__ . '/..' . '/symfony/serializer/Debug/TraceableSerializer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\DependencyInjection\\SerializerPass' => __DIR__ . '/..' . '/symfony/serializer/DependencyInjection/SerializerPass.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ChainDecoder' => __DIR__ . '/..' . '/symfony/serializer/Encoder/ChainDecoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ChainEncoder' => __DIR__ . '/..' . '/symfony/serializer/Encoder/ChainEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ContextAwareDecoderInterface' => __DIR__ . '/..' . '/symfony/serializer/Encoder/ContextAwareDecoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\ContextAwareEncoderInterface' => __DIR__ . '/..' . '/symfony/serializer/Encoder/ContextAwareEncoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\CsvEncoder' => __DIR__ . '/..' . '/symfony/serializer/Encoder/CsvEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\DecoderInterface' => __DIR__ . '/..' . '/symfony/serializer/Encoder/DecoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\EncoderInterface' => __DIR__ . '/..' . '/symfony/serializer/Encoder/EncoderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonDecode' => __DIR__ . '/..' . '/symfony/serializer/Encoder/JsonDecode.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonEncode' => __DIR__ . '/..' . '/symfony/serializer/Encoder/JsonEncode.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\JsonEncoder' => __DIR__ . '/..' . '/symfony/serializer/Encoder/JsonEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\NormalizationAwareInterface' => __DIR__ . '/..' . '/symfony/serializer/Encoder/NormalizationAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\XmlEncoder' => __DIR__ . '/..' . '/symfony/serializer/Encoder/XmlEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Encoder\\YamlEncoder' => __DIR__ . '/..' . '/symfony/serializer/Encoder/YamlEncoder.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\BadMethodCallException' => __DIR__ . '/..' . '/symfony/serializer/Exception/BadMethodCallException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\CircularReferenceException' => __DIR__ . '/..' . '/symfony/serializer/Exception/CircularReferenceException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/serializer/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\ExtraAttributesException' => __DIR__ . '/..' . '/symfony/serializer/Exception/ExtraAttributesException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/serializer/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/serializer/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\MappingException' => __DIR__ . '/..' . '/symfony/serializer/Exception/MappingException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\MissingConstructorArgumentsException' => __DIR__ . '/..' . '/symfony/serializer/Exception/MissingConstructorArgumentsException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\NotEncodableValueException' => __DIR__ . '/..' . '/symfony/serializer/Exception/NotEncodableValueException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\NotNormalizableValueException' => __DIR__ . '/..' . '/symfony/serializer/Exception/NotNormalizableValueException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\PartialDenormalizationException' => __DIR__ . '/..' . '/symfony/serializer/Exception/PartialDenormalizationException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/serializer/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/symfony/serializer/Exception/UnexpectedValueException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\UnsupportedException' => __DIR__ . '/..' . '/symfony/serializer/Exception/UnsupportedException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Exception\\UnsupportedFormatException' => __DIR__ . '/..' . '/symfony/serializer/Exception/UnsupportedFormatException.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Extractor\\ObjectPropertyListExtractor' => __DIR__ . '/..' . '/symfony/serializer/Extractor/ObjectPropertyListExtractor.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Extractor\\ObjectPropertyListExtractorInterface' => __DIR__ . '/..' . '/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\AttributeMetadata' => __DIR__ . '/..' . '/symfony/serializer/Mapping/AttributeMetadata.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\AttributeMetadataInterface' => __DIR__ . '/..' . '/symfony/serializer/Mapping/AttributeMetadataInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorFromClassMetadata' => __DIR__ . '/..' . '/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorMapping' => __DIR__ . '/..' . '/symfony/serializer/Mapping/ClassDiscriminatorMapping.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassDiscriminatorResolverInterface' => __DIR__ . '/..' . '/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassMetadata' => __DIR__ . '/..' . '/symfony/serializer/Mapping/ClassMetadata.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\ClassMetadataInterface' => __DIR__ . '/..' . '/symfony/serializer/Mapping/ClassMetadataInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\CacheClassMetadataFactory' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactory' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactoryCompiler' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Factory/ClassMetadataFactoryCompiler.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassMetadataFactoryInterface' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Factory/ClassMetadataFactoryInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\ClassResolverTrait' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Factory/ClassResolverTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Factory\\CompiledClassMetadataFactory' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Factory/CompiledClassMetadataFactory.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\AnnotationLoader' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/AnnotationLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\AttributeLoader' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/AttributeLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/FileLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\LoaderChain' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/LoaderChain.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/LoaderInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/XmlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Mapping\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/serializer/Mapping/Loader/YamlFileLoader.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\AdvancedNameConverterInterface' => __DIR__ . '/..' . '/symfony/serializer/NameConverter/AdvancedNameConverterInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\CamelCaseToSnakeCaseNameConverter' => __DIR__ . '/..' . '/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\MetadataAwareNameConverter' => __DIR__ . '/..' . '/symfony/serializer/NameConverter/MetadataAwareNameConverter.php', '_ContaoManager\\Symfony\\Component\\Serializer\\NameConverter\\NameConverterInterface' => __DIR__ . '/..' . '/symfony/serializer/NameConverter/NameConverterInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\AbstractNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/AbstractNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/AbstractObjectNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ArrayDenormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ArrayDenormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\BackedEnumNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/BackedEnumNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\CacheableSupportsMethodInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ConstraintViolationListNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ContextAwareDenormalizerInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ContextAwareNormalizerInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\CustomNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/CustomNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DataUriNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DataUriNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateIntervalNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DateIntervalNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateTimeNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DateTimeNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DateTimeZoneNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizableInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DenormalizableInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerAwareInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DenormalizerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerAwareTrait' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DenormalizerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\DenormalizerInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/DenormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\FormErrorNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/FormErrorNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\GetSetMethodNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/GetSetMethodNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\JsonSerializableNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/JsonSerializableNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\MimeMessageNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/MimeMessageNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizableInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/NormalizableInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerAwareInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/NormalizerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerAwareTrait' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/NormalizerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/NormalizerInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ObjectNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ObjectNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ObjectToPopulateTrait' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ObjectToPopulateTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\ProblemNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/ProblemNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\PropertyNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/PropertyNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\TranslatableNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/TranslatableNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\UidNormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/UidNormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Normalizer\\UnwrappingDenormalizer' => __DIR__ . '/..' . '/symfony/serializer/Normalizer/UnwrappingDenormalizer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\Serializer' => __DIR__ . '/..' . '/symfony/serializer/Serializer.php', '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerAwareInterface' => __DIR__ . '/..' . '/symfony/serializer/SerializerAwareInterface.php', '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerAwareTrait' => __DIR__ . '/..' . '/symfony/serializer/SerializerAwareTrait.php', '_ContaoManager\\Symfony\\Component\\Serializer\\SerializerInterface' => __DIR__ . '/..' . '/symfony/serializer/SerializerInterface.php', '_ContaoManager\\Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php', '_ContaoManager\\Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php', '_ContaoManager\\Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php', '_ContaoManager\\Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php', '_ContaoManager\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php', '_ContaoManager\\Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php', '_ContaoManager\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php', '_ContaoManager\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php', '_ContaoManager\\Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php', '_ContaoManager\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php', '_ContaoManager\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php', '_ContaoManager\\Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php', '_ContaoManager\\Symfony\\Component\\Uid\\AbstractUid' => __DIR__ . '/..' . '/symfony/uid/AbstractUid.php', '_ContaoManager\\Symfony\\Component\\Uid\\BinaryUtil' => __DIR__ . '/..' . '/symfony/uid/BinaryUtil.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\GenerateUlidCommand' => __DIR__ . '/..' . '/symfony/uid/Command/GenerateUlidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\GenerateUuidCommand' => __DIR__ . '/..' . '/symfony/uid/Command/GenerateUuidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\InspectUlidCommand' => __DIR__ . '/..' . '/symfony/uid/Command/InspectUlidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Command\\InspectUuidCommand' => __DIR__ . '/..' . '/symfony/uid/Command/InspectUuidCommand.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\NameBasedUuidFactory' => __DIR__ . '/..' . '/symfony/uid/Factory/NameBasedUuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\RandomBasedUuidFactory' => __DIR__ . '/..' . '/symfony/uid/Factory/RandomBasedUuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\TimeBasedUuidFactory' => __DIR__ . '/..' . '/symfony/uid/Factory/TimeBasedUuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\UlidFactory' => __DIR__ . '/..' . '/symfony/uid/Factory/UlidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\Factory\\UuidFactory' => __DIR__ . '/..' . '/symfony/uid/Factory/UuidFactory.php', '_ContaoManager\\Symfony\\Component\\Uid\\MaxUlid' => __DIR__ . '/..' . '/symfony/uid/MaxUlid.php', '_ContaoManager\\Symfony\\Component\\Uid\\MaxUuid' => __DIR__ . '/..' . '/symfony/uid/MaxUuid.php', '_ContaoManager\\Symfony\\Component\\Uid\\NilUlid' => __DIR__ . '/..' . '/symfony/uid/NilUlid.php', '_ContaoManager\\Symfony\\Component\\Uid\\NilUuid' => __DIR__ . '/..' . '/symfony/uid/NilUuid.php', '_ContaoManager\\Symfony\\Component\\Uid\\TimeBasedUidInterface' => __DIR__ . '/..' . '/symfony/uid/TimeBasedUidInterface.php', '_ContaoManager\\Symfony\\Component\\Uid\\Ulid' => __DIR__ . '/..' . '/symfony/uid/Ulid.php', '_ContaoManager\\Symfony\\Component\\Uid\\Uuid' => __DIR__ . '/..' . '/symfony/uid/Uuid.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV1' => __DIR__ . '/..' . '/symfony/uid/UuidV1.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV3' => __DIR__ . '/..' . '/symfony/uid/UuidV3.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV4' => __DIR__ . '/..' . '/symfony/uid/UuidV4.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV5' => __DIR__ . '/..' . '/symfony/uid/UuidV5.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV6' => __DIR__ . '/..' . '/symfony/uid/UuidV6.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV7' => __DIR__ . '/..' . '/symfony/uid/UuidV7.php', '_ContaoManager\\Symfony\\Component\\Uid\\UuidV8' => __DIR__ . '/..' . '/symfony/uid/UuidV8.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\AmqpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/AmqpCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ArgsStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ArgsStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\Caster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/Caster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ClassStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ClassStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ConstStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ConstStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\CutArrayStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutArrayStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\CutStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/CutStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DOMCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DOMCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DateCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DateCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DoctrineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DoctrineCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DsCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\DsPairStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/DsPairStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\EnumStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/EnumStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ExceptionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ExceptionCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\FFICaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FFICaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\FiberCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FiberCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\FrameStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/FrameStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\GmpCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/GmpCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ImagineCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImagineCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ImgStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ImgStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\IntlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/IntlCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\LinkStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/LinkStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\MemcachedCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MemcachedCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\MysqliCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/MysqliCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\PdoCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PdoCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\PgSqlCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/PgSqlCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ProxyManagerCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ProxyManagerCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\RdKafkaCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RdKafkaCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\RedisCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/RedisCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ReflectionCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ReflectionCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ResourceCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\ScalarStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/ScalarStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\SplCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SplCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\StubCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/StubCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\SymfonyCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/SymfonyCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\TraceStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/TraceStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\UninitializedStub' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UninitializedStub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\UuidCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/UuidCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\XmlReaderCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlReaderCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Caster\\XmlResourceCaster' => __DIR__ . '/..' . '/symfony/var-dumper/Caster/XmlResourceCaster.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\AbstractCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/AbstractCloner.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\ClonerInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/ClonerInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Cursor' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Cursor.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Data' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Data.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\DumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/DumperInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Internal\\NoDefault' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Internal/NoDefault.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\Stub' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/Stub.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Cloner\\VarCloner' => __DIR__ . '/..' . '/symfony/var-dumper/Cloner/VarCloner.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\Descriptor\\CliDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/CliDescriptor.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\Descriptor\\DumpDescriptorInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\Descriptor\\HtmlDescriptor' => __DIR__ . '/..' . '/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Command\\ServerDumpCommand' => __DIR__ . '/..' . '/symfony/var-dumper/Command/ServerDumpCommand.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\AbstractDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/AbstractDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\CliDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/CliDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\CliContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\ContextProviderInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\RequestContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextProvider\\SourceContextProvider' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ContextualizedDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ContextualizedDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\DataDumperInterface' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/DataDumperInterface.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/HtmlDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Dumper\\ServerDumper' => __DIR__ . '/..' . '/symfony/var-dumper/Dumper/ServerDumper.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Exception\\ThrowingCasterException' => __DIR__ . '/..' . '/symfony/var-dumper/Exception/ThrowingCasterException.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Server\\Connection' => __DIR__ . '/..' . '/symfony/var-dumper/Server/Connection.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Server\\DumpServer' => __DIR__ . '/..' . '/symfony/var-dumper/Server/DumpServer.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\Test\\VarDumperTestTrait' => __DIR__ . '/..' . '/symfony/var-dumper/Test/VarDumperTestTrait.php', '_ContaoManager\\Symfony\\Component\\VarDumper\\VarDumper' => __DIR__ . '/..' . '/symfony/var-dumper/VarDumper.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\ClassNotFoundException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ClassNotFoundException.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/LogicException.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Exception\\NotInstantiableTypeException' => __DIR__ . '/..' . '/symfony/var-exporter/Exception/NotInstantiableTypeException.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Hydrator.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Instantiator' => __DIR__ . '/..' . '/symfony/var-exporter/Instantiator.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Exporter' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Exporter.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Hydrator' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Hydrator.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectRegistry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectRegistry.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectState' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectState.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\LazyObjectTrait' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/LazyObjectTrait.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Reference' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Reference.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\LazyGhostTrait' => __DIR__ . '/..' . '/symfony/var-exporter/LazyGhostTrait.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\LazyObjectInterface' => __DIR__ . '/..' . '/symfony/var-exporter/LazyObjectInterface.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\LazyProxyTrait' => __DIR__ . '/..' . '/symfony/var-exporter/LazyProxyTrait.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\ProxyHelper' => __DIR__ . '/..' . '/symfony/var-exporter/ProxyHelper.php', '_ContaoManager\\Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', '_ContaoManager\\Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\ItemInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/ItemInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\NamespacedPoolInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/NamespacedPoolInterface.php', '_ContaoManager\\Symfony\\Contracts\\Cache\\TagAwareCacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/TagAwareCacheInterface.php', '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/Event.php', '_ContaoManager\\Symfony\\Contracts\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts/EventDispatcherInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', '_ContaoManager\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceCollectionInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceCollectionInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceMethodsSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceMethodsSubscriberTrait.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', '_ContaoManager\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', '_ContaoManager\\Terminal42\\ComposerLockValidator\\ValidationException' => __DIR__ . '/..' . '/terminal42/composer-lock-validator/src/ValidationException.php', '_ContaoManager\\Terminal42\\ComposerLockValidator\\Validator' => __DIR__ . '/..' . '/terminal42/composer-lock-validator/src/Validator.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AndroidKeyAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidKeyAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AndroidSafetyNetAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AndroidSafetyNetAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AppleAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AppleAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationObject' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObject.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationObjectLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationObjectLoader.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatement' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatement.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\AttestationStatementSupportManager' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/AttestationStatementSupportManager.php', '_ContaoManager\\Webauthn\\AttestationStatement\\FidoU2FAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/FidoU2FAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\NoneAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/NoneAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\PackedAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/PackedAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestationStatement\\TPMAttestationStatementSupport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestationStatement/TPMAttestationStatementSupport.php', '_ContaoManager\\Webauthn\\AttestedCredentialData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AttestedCredentialData.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtension' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtension.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensions.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientInputs' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientInputs.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputs' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputs.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\AuthenticationExtensionsClientOutputsLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/AuthenticationExtensionsClientOutputsLoader.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\ExtensionOutputChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputChecker.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\ExtensionOutputCheckerHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputCheckerHandler.php', '_ContaoManager\\Webauthn\\AuthenticationExtensions\\ExtensionOutputError' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticationExtensions/ExtensionOutputError.php', '_ContaoManager\\Webauthn\\AuthenticatorAssertionResponse' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponse.php', '_ContaoManager\\Webauthn\\AuthenticatorAssertionResponseValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAssertionResponseValidator.php', '_ContaoManager\\Webauthn\\AuthenticatorAttestationResponse' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponse.php', '_ContaoManager\\Webauthn\\AuthenticatorAttestationResponseValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorAttestationResponseValidator.php', '_ContaoManager\\Webauthn\\AuthenticatorData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorData.php', '_ContaoManager\\Webauthn\\AuthenticatorDataLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorDataLoader.php', '_ContaoManager\\Webauthn\\AuthenticatorResponse' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorResponse.php', '_ContaoManager\\Webauthn\\AuthenticatorSelectionCriteria' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/AuthenticatorSelectionCriteria.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStep' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStep.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStepManager' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStepManager.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CeremonyStepManagerFactory' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CeremonyStepManagerFactory.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckAlgorithm' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckAlgorithm.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckAllowedCredentialList' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckAllowedCredentialList.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckAttestationFormatIsKnownAndValid' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckAttestationFormatIsKnownAndValid.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckBackupBitsAreConsistent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckBackupBitsAreConsistent.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckChallenge' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckChallenge.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckClientDataCollectorType' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckClientDataCollectorType.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckCounter' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckCounter.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckCredentialId' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckCredentialId.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckExtensions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckExtensions.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckHasAttestedCredentialData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckHasAttestedCredentialData.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckMetadataStatement' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckMetadataStatement.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckOrigin' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckOrigin.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckRelyingPartyIdIdHash' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckRelyingPartyIdIdHash.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckSignature' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckSignature.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckTopOrigin' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckTopOrigin.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckUserHandle' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckUserHandle.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckUserVerification' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckUserVerification.php', '_ContaoManager\\Webauthn\\CeremonyStep\\CheckUserWasPresent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/CheckUserWasPresent.php', '_ContaoManager\\Webauthn\\CeremonyStep\\HostTopOriginValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/HostTopOriginValidator.php', '_ContaoManager\\Webauthn\\CeremonyStep\\TopOriginValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CeremonyStep/TopOriginValidator.php', '_ContaoManager\\Webauthn\\CertificateChainChecker\\CertificateChainChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CertificateChainChecker/CertificateChainChecker.php', '_ContaoManager\\Webauthn\\CertificateChainChecker\\PhpCertificateChainChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CertificateChainChecker/PhpCertificateChainChecker.php', '_ContaoManager\\Webauthn\\CertificateToolbox' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CertificateToolbox.php', '_ContaoManager\\Webauthn\\ClientDataCollector\\ClientDataCollector' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/ClientDataCollector/ClientDataCollector.php', '_ContaoManager\\Webauthn\\ClientDataCollector\\ClientDataCollectorManager' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/ClientDataCollector/ClientDataCollectorManager.php', '_ContaoManager\\Webauthn\\ClientDataCollector\\WebauthnAuthenticationCollector' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/ClientDataCollector/WebauthnAuthenticationCollector.php', '_ContaoManager\\Webauthn\\CollectedClientData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/CollectedClientData.php', '_ContaoManager\\Webauthn\\Counter\\CounterChecker' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Counter/CounterChecker.php', '_ContaoManager\\Webauthn\\Counter\\ThrowExceptionIfInvalid' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Counter/ThrowExceptionIfInvalid.php', '_ContaoManager\\Webauthn\\Credential' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Credential.php', '_ContaoManager\\Webauthn\\Denormalizer\\AttestationObjectDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AttestationObjectDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AttestationStatementDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AttestationStatementDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AttestedCredentialDataNormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AttestedCredentialDataNormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticationExtensionNormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticationExtensionNormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticationExtensionsDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticationExtensionsDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorAssertionResponseDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorAssertionResponseDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorAttestationResponseDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorAttestationResponseDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorDataDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorDataDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\AuthenticatorResponseDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/AuthenticatorResponseDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\CollectedClientDataDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/CollectedClientDataDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\ExtensionDescriptorDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/ExtensionDescriptorDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialDescriptorNormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialDescriptorNormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialOptionsDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialOptionsDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialParametersDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialParametersDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialSourceDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialSourceDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\PublicKeyCredentialUserEntityDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/PublicKeyCredentialUserEntityDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\TrustPathDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/TrustPathDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\VerificationMethodANDCombinationsDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/VerificationMethodANDCombinationsDenormalizer.php', '_ContaoManager\\Webauthn\\Denormalizer\\WebauthnSerializerFactory' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Denormalizer/WebauthnSerializerFactory.php', '_ContaoManager\\Webauthn\\Event\\AttestationObjectLoaded' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/AttestationObjectLoaded.php', '_ContaoManager\\Webauthn\\Event\\AttestationStatementLoaded' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/AttestationStatementLoaded.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAssertionResponseValidationFailedEvent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/AuthenticatorAssertionResponseValidationFailedEvent.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAssertionResponseValidationSucceededEvent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/AuthenticatorAssertionResponseValidationSucceededEvent.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAttestationResponseValidationFailedEvent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/AuthenticatorAttestationResponseValidationFailedEvent.php', '_ContaoManager\\Webauthn\\Event\\AuthenticatorAttestationResponseValidationSucceededEvent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/AuthenticatorAttestationResponseValidationSucceededEvent.php', '_ContaoManager\\Webauthn\\Event\\BeforeCertificateChainValidation' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/BeforeCertificateChainValidation.php', '_ContaoManager\\Webauthn\\Event\\CanDispatchEvents' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/CanDispatchEvents.php', '_ContaoManager\\Webauthn\\Event\\CertificateChainValidationFailed' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/CertificateChainValidationFailed.php', '_ContaoManager\\Webauthn\\Event\\CertificateChainValidationSucceeded' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/CertificateChainValidationSucceeded.php', '_ContaoManager\\Webauthn\\Event\\MetadataStatementFound' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/MetadataStatementFound.php', '_ContaoManager\\Webauthn\\Event\\NullEventDispatcher' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/NullEventDispatcher.php', '_ContaoManager\\Webauthn\\Event\\WebauthnEvent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Event/WebauthnEvent.php', '_ContaoManager\\Webauthn\\Exception\\AttestationStatementException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/AttestationStatementException.php', '_ContaoManager\\Webauthn\\Exception\\AttestationStatementLoadingException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/AttestationStatementLoadingException.php', '_ContaoManager\\Webauthn\\Exception\\AttestationStatementVerificationException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/AttestationStatementVerificationException.php', '_ContaoManager\\Webauthn\\Exception\\AuthenticationExtensionException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/AuthenticationExtensionException.php', '_ContaoManager\\Webauthn\\Exception\\AuthenticatorResponseVerificationException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/AuthenticatorResponseVerificationException.php', '_ContaoManager\\Webauthn\\Exception\\CertificateChainException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/CertificateChainException.php', '_ContaoManager\\Webauthn\\Exception\\CertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/CertificateException.php', '_ContaoManager\\Webauthn\\Exception\\CertificateRevocationListException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/CertificateRevocationListException.php', '_ContaoManager\\Webauthn\\Exception\\CounterException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/CounterException.php', '_ContaoManager\\Webauthn\\Exception\\ExpiredCertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/ExpiredCertificateException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidAttestationStatementException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/InvalidAttestationStatementException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidCertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/InvalidCertificateException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidDataException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/InvalidDataException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidTrustPathException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/InvalidTrustPathException.php', '_ContaoManager\\Webauthn\\Exception\\InvalidUserHandleException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/InvalidUserHandleException.php', '_ContaoManager\\Webauthn\\Exception\\MetadataServiceException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/MetadataServiceException.php', '_ContaoManager\\Webauthn\\Exception\\MetadataStatementException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/MetadataStatementException.php', '_ContaoManager\\Webauthn\\Exception\\MetadataStatementLoadingException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/MetadataStatementLoadingException.php', '_ContaoManager\\Webauthn\\Exception\\MissingMetadataStatementException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/MissingMetadataStatementException.php', '_ContaoManager\\Webauthn\\Exception\\RevokedCertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/RevokedCertificateException.php', '_ContaoManager\\Webauthn\\Exception\\UnsupportedFeatureException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/UnsupportedFeatureException.php', '_ContaoManager\\Webauthn\\Exception\\WebauthnException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Exception/WebauthnException.php', '_ContaoManager\\Webauthn\\FakeCredentialGenerator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/FakeCredentialGenerator.php', '_ContaoManager\\Webauthn\\MetadataService\\CanLogData' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/CanLogData.php', '_ContaoManager\\Webauthn\\MetadataService\\CertificateChain\\CertificateChainValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/CertificateChain/CertificateChainValidator.php', '_ContaoManager\\Webauthn\\MetadataService\\CertificateChain\\CertificateToolbox' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/CertificateChain/CertificateToolbox.php', '_ContaoManager\\Webauthn\\MetadataService\\CertificateChain\\PhpCertificateChainValidator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/CertificateChain/PhpCertificateChainValidator.php', '_ContaoManager\\Webauthn\\MetadataService\\Denormalizer\\ExtensionDescriptorDenormalizer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Denormalizer/ExtensionDescriptorDenormalizer.php', '_ContaoManager\\Webauthn\\MetadataService\\Denormalizer\\MetadataStatementSerializerFactory' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Denormalizer/MetadataStatementSerializerFactory.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\BeforeCertificateChainValidation' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/BeforeCertificateChainValidation.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\CanDispatchEvents' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/CanDispatchEvents.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\CertificateChainValidationFailed' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/CertificateChainValidationFailed.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\CertificateChainValidationSucceeded' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/CertificateChainValidationSucceeded.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\MetadataStatementFound' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/MetadataStatementFound.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\NullEventDispatcher' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/NullEventDispatcher.php', '_ContaoManager\\Webauthn\\MetadataService\\Event\\WebauthnEvent' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Event/WebauthnEvent.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\CertificateChainException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateChainException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\CertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\CertificateRevocationListException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/CertificateRevocationListException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\ExpiredCertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/ExpiredCertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\InvalidCertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/InvalidCertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MetadataServiceException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataServiceException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MetadataStatementException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataStatementException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MetadataStatementLoadingException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/MetadataStatementLoadingException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\MissingMetadataStatementException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/MissingMetadataStatementException.php', '_ContaoManager\\Webauthn\\MetadataService\\Exception\\RevokedCertificateException' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Exception/RevokedCertificateException.php', '_ContaoManager\\Webauthn\\MetadataService\\MetadataStatementRepository' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/MetadataStatementRepository.php', '_ContaoManager\\Webauthn\\MetadataService\\Psr18HttpClient' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Psr18HttpClient.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\ChainedMetadataServices' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/ChainedMetadataServices.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\DistantResourceMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/DistantResourceMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\FidoAllianceCompliantMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/FidoAllianceCompliantMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\FolderResourceMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/FolderResourceMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\InMemoryMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/InMemoryMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\JsonMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/JsonMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\LocalResourceMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/LocalResourceMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\MetadataBLOBPayload' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/MetadataBLOBPayload.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\MetadataBLOBPayloadEntry' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/MetadataBLOBPayloadEntry.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\MetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/MetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Service\\StringMetadataService' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Service/StringMetadataService.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AbstractDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/AbstractDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AlternativeDescriptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/AlternativeDescriptions.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AuthenticatorGetInfo' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/AuthenticatorGetInfo.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\AuthenticatorStatus' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/AuthenticatorStatus.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\BiometricAccuracyDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/BiometricAccuracyDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\BiometricStatusReport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/BiometricStatusReport.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\CodeAccuracyDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/CodeAccuracyDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\DisplayPNGCharacteristicsDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/DisplayPNGCharacteristicsDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\EcdaaTrustAnchor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/EcdaaTrustAnchor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\ExtensionDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/ExtensionDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\MetadataStatement' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/MetadataStatement.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\PatternAccuracyDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/PatternAccuracyDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\RgbPaletteEntry' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/RgbPaletteEntry.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\RogueListEntry' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/RogueListEntry.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\StatusReport' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/StatusReport.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\VerificationMethodANDCombinations' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/VerificationMethodANDCombinations.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\VerificationMethodDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/VerificationMethodDescriptor.php', '_ContaoManager\\Webauthn\\MetadataService\\Statement\\Version' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/Statement/Version.php', '_ContaoManager\\Webauthn\\MetadataService\\StatusReportRepository' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/StatusReportRepository.php', '_ContaoManager\\Webauthn\\MetadataService\\ValueFilter' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/MetadataService/ValueFilter.php', '_ContaoManager\\Webauthn\\PublicKeyCredential' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredential.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialCreationOptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialCreationOptions.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialDescriptor' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptor.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialDescriptorCollection' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialDescriptorCollection.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialEntity' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialEntity.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialLoader.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialOptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialOptions.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialParameters' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialParameters.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialRequestOptions' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialRequestOptions.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialRpEntity' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialRpEntity.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialSource' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialSource.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialSourceRepository' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialSourceRepository.php', '_ContaoManager\\Webauthn\\PublicKeyCredentialUserEntity' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/PublicKeyCredentialUserEntity.php', '_ContaoManager\\Webauthn\\SimpleFakeCredentialGenerator' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/SimpleFakeCredentialGenerator.php', '_ContaoManager\\Webauthn\\StringStream' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/StringStream.php', '_ContaoManager\\Webauthn\\TokenBinding\\IgnoreTokenBindingHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/IgnoreTokenBindingHandler.php', '_ContaoManager\\Webauthn\\TokenBinding\\SecTokenBindingHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/SecTokenBindingHandler.php', '_ContaoManager\\Webauthn\\TokenBinding\\TokenBinding' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/TokenBinding.php', '_ContaoManager\\Webauthn\\TokenBinding\\TokenBindingHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingHandler.php', '_ContaoManager\\Webauthn\\TokenBinding\\TokenBindingNotSupportedHandler' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TokenBinding/TokenBindingNotSupportedHandler.php', '_ContaoManager\\Webauthn\\TrustPath\\CertificateTrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/CertificateTrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\EcdaaKeyIdTrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/EcdaaKeyIdTrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\EmptyTrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/EmptyTrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\TrustPath' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/TrustPath.php', '_ContaoManager\\Webauthn\\TrustPath\\TrustPathLoader' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/TrustPath/TrustPathLoader.php', '_ContaoManager\\Webauthn\\U2FPublicKey' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/U2FPublicKey.php', '_ContaoManager\\Webauthn\\Util\\Base64' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Util/Base64.php', '_ContaoManager\\Webauthn\\Util\\CoseSignatureFixer' => __DIR__ . '/..' . '/web-auth/webauthn-lib/src/Util/CoseSignatureFixer.php', '_ContaoManager\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', '_ContaoManager\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', '_ContaoManager\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlockFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlockFactoryInterface' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Description' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Description.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\DescriptionFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\ExampleFinder' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Serializer' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\StandardTagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\TagFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Author' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\BaseTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Covers' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Deprecated' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Example' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Extends_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Extends_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\AbstractPHPStanFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/AbstractPHPStanFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ExtendsFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ExtendsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\Factory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Factory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ImplementsFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ImplementsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\MethodFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/MethodFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\MethodParameterFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/MethodParameterFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PHPStanFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PHPStanFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ParamFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ParamFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PropertyFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PropertyFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PropertyReadFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PropertyReadFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\PropertyWriteFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/PropertyWriteFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\ReturnFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/ReturnFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\StaticMethod' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\TemplateExtendsFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/TemplateExtendsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\TemplateFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/TemplateFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\TemplateImplementsFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/TemplateImplementsFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Factory\\VarFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/VarFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\AlignFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Formatter\\PassthroughFormatter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Generic' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Implements_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Implements_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\InvalidTag' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Link' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Method' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\MethodParameter' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/MethodParameter.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Mixin' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Mixin.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Param' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Property' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyRead' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\PropertyWrite' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Reference' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Reference\\Url' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Return_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\See' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Since' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Source' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TagWithType' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Template' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Template.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TemplateCovariant' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TemplateCovariant.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TemplateExtends' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TemplateExtends.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\TemplateImplements' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TemplateImplements.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Throws' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Uses' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Var_' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php', '_ContaoManager\\phpDocumentor\\Reflection\\DocBlock\\Tags\\Version' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php', '_ContaoManager\\phpDocumentor\\Reflection\\Element' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Element.php', '_ContaoManager\\phpDocumentor\\Reflection\\Exception\\PcreException' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Exception/PcreException.php', '_ContaoManager\\phpDocumentor\\Reflection\\File' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/File.php', '_ContaoManager\\phpDocumentor\\Reflection\\Fqsen' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Fqsen.php', '_ContaoManager\\phpDocumentor\\Reflection\\FqsenResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/FqsenResolver.php', '_ContaoManager\\phpDocumentor\\Reflection\\Location' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Location.php', '_ContaoManager\\phpDocumentor\\Reflection\\Project' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/Project.php', '_ContaoManager\\phpDocumentor\\Reflection\\ProjectFactory' => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src/ProjectFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoType.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShape' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShape.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ArrayShapeItem' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ArrayShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\CallableString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/CallableString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ConstExpression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ConstExpression.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\False_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/False_.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\FloatValue' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/FloatValue.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\HtmlEscapedString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/HtmlEscapedString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerRange' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerRange.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\IntegerValue' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/IntegerValue.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ListShape' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ListShape.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ListShapeItem' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ListShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\List_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/List_.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\LiteralString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LiteralString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\LowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/LowercaseString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NegativeInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NegativeInteger.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyArray' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyArray.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyList.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyLowercaseString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyLowercaseString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NonEmptyString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NonEmptyString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\NumericString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/NumericString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\Numeric_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/Numeric_.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ObjectShape' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ObjectShape.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ObjectShapeItem' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ObjectShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\PositiveInteger' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/PositiveInteger.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\ShapeItem' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/ShapeItem.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\StringValue' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/StringValue.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\TraitString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/TraitString.php', '_ContaoManager\\phpDocumentor\\Reflection\\PseudoTypes\\True_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/PseudoTypes/True_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Type' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Type.php', '_ContaoManager\\phpDocumentor\\Reflection\\TypeResolver' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/TypeResolver.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\AbstractList' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AbstractList.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\AggregatedType' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/AggregatedType.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\ArrayKey' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ArrayKey.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Array_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Array_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Boolean' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Boolean.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\CallableParameter' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/CallableParameter.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Callable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Callable_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\ClassString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ClassString.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Collection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Collection.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Compound' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Compound.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Context' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Context.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\ContextFactory' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/ContextFactory.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Expression' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Expression.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Float_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Float_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Integer' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Integer.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\InterfaceString' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/InterfaceString.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Intersection' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Intersection.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Iterable_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Iterable_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Mixed_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Mixed_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Never_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Never_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Null_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Null_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Nullable' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Nullable.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Object_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Object_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Parent_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Parent_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Resource_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Resource_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Scalar' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Scalar.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Self_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Self_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Static_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Static_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\String_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/String_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\This' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/This.php', '_ContaoManager\\phpDocumentor\\Reflection\\Types\\Void_' => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src/Types/Void_.php', '_ContaoManager\\phpDocumentor\\Reflection\\Utils' => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src/Utils.php', '_ContaoManager\\studio24\\Rotate\\Delete' => __DIR__ . '/..' . '/studio24/rotate/src/Delete.php', '_ContaoManager\\studio24\\Rotate\\DirectoryIterator' => __DIR__ . '/..' . '/studio24/rotate/src/DirectoryIterator.php', '_ContaoManager\\studio24\\Rotate\\FilenameFormat' => __DIR__ . '/..' . '/studio24/rotate/src/FilenameFormat.php', '_ContaoManager\\studio24\\Rotate\\FilenameFormatException' => __DIR__ . '/..' . '/studio24/rotate/src/FilenameFormatException.php', '_ContaoManager\\studio24\\Rotate\\Rotate' => __DIR__ . '/..' . '/studio24/rotate/src/Rotate.php', '_ContaoManager\\studio24\\Rotate\\RotateAbstract' => __DIR__ . '/..' . '/studio24/rotate/src/RotateAbstract.php', '_ContaoManager\\studio24\\Rotate\\RotateException' => __DIR__ . '/..' . '/studio24/rotate/src/RotateException.php', '_ContaoManager\\©' => __DIR__ . '/..' . '/symfony/cache/Traits/ValueWrapper.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit2600b56a1d0f337df799cc653368424c::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit2600b56a1d0f337df799cc653368424c::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit2600b56a1d0f337df799cc653368424c::$classMap; }, null, ClassLoader::class); } } setClassMapAuthoritative(true); $loader->register(true); $filesToLoad = \Composer\Autoload\ComposerStaticInit2600b56a1d0f337df799cc653368424c::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; require $file; } }, null, null); foreach ($filesToLoad as $fileIdentifier => $file) { $requireFile($fileIdentifier, $file); } return $loader; } } Copyright (C) 2015 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # Change Log All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ### [3.4.3] 2024-09-19 * Fixed some type annotations ### [3.4.2] 2024-07-12 * Fixed PHP 5.3 syntax error ### [3.4.1] 2024-07-12 * Fixed normalizeStability's return type to enforce valid stabilities ### [3.4.0] 2023-08-31 * Support larger major version numbers (#149) ### [3.3.2] 2022-04-01 * Fixed handling of non-string values (#134) ### [3.3.1] 2022-03-16 * Fixed possible cache key clash in the CompilingMatcher memoization (#132) ### [3.3.0] 2022-03-15 * Improved performance of CompilingMatcher by memoizing more (#131) * Added CompilingMatcher::clear to clear all memoization caches ### [3.2.9] 2022-02-04 * Revert #129 (Fixed MultiConstraint with MatchAllConstraint) which caused regressions ### [3.2.8] 2022-02-04 * Updates to latest phpstan / CI by @Seldaek in https://github.com/composer/semver/pull/130 * Fixed MultiConstraint with MatchAllConstraint by @Toflar in https://github.com/composer/semver/pull/129 ### [3.2.7] 2022-01-04 * Fixed: typo in type definition of Intervals class causing issues with Psalm scanning vendors ### [3.2.6] 2021-10-25 * Fixed: type improvements to parseStability ### [3.2.5] 2021-05-24 * Fixed: issue comparing disjunctive MultiConstraints to conjunctive ones (#127) * Fixed: added complete type information using phpstan annotations ### [3.2.4] 2020-11-13 * Fixed: code clean-up ### [3.2.3] 2020-11-12 * Fixed: constraints in the form of `X || Y, >=Y.1` and other such complex constructs were in some cases being optimized into a more restrictive constraint ### [3.2.2] 2020-10-14 * Fixed: internal code cleanups ### [3.2.1] 2020-09-27 * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases * Fixed: normalization of beta0 and such which was dropping the 0 ### [3.2.0] 2020-09-09 * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience ### [3.1.0] 2020-09-08 * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 3.0.1 * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package ### [3.0.1] 2020-09-08 * Fixed: handling of some invalid -dev versions which were seen as valid ### [3.0.0] 2020-05-26 * Break: Renamed `EmptyConstraint`, replace it with `MatchAllConstraint` * Break: Unlikely to affect anyone but strictly speaking a breaking change, `*.*` and such variants will not match all `dev-*` versions anymore, only `*` does * Break: ConstraintInterface is now considered internal/private and not meant to be implemented by third parties anymore * Added `Intervals` class to check if a constraint is a subsets of another one, and allow compacting complex MultiConstraints into simpler ones * Added `CompilingMatcher` class to speed up constraint matching against simple Constraint instances * Added `MatchAllConstraint` and `MatchNoneConstraint` which match everything and nothing * Added more advanced optimization of contiguous constraints inside MultiConstraint * Added tentative support for PHP 8 * Fixed ConstraintInterface::matches to be commutative in all cases ### [2.0.0] 2020-04-21 * Break: `dev-master`, `dev-trunk` and `dev-default` now normalize to `dev-master`, `dev-trunk` and `dev-default` instead of `9999999-dev` in 1.x * Break: Removed the deprecated `AbstractConstraint` * Added `getUpperBound` and `getLowerBound` to ConstraintInterface. They return `Composer\Semver\Constraint\Bound` instances * Added `MultiConstraint::create` to create the most-optimal form of ConstraintInterface from an array of constraint strings ### [1.7.2] 2020-12-03 * Fixed: Allow installing on php 8 ### [1.7.1] 2020-09-27 * Fixed: accidental validation of broken constraints combining ^/~ and wildcards, and -dev suffix allowing weird cases * Fixed: normalization of beta0 and such which was dropping the 0 ### [1.7.0] 2020-09-09 * Added: support for `x || @dev`, not very useful but seen in the wild and failed to validate with 1.5.2/1.6.0 * Added: support for `foobar-dev` being equal to `dev-foobar`, dev-foobar is the official way to write it but we need to support the other for BC and convenience ### [1.6.0] 2020-09-08 * Added: support for constraints like `^2.x-dev` and `~2.x-dev`, not very useful but seen in the wild and failed to validate with 1.5.2 * Fixed: invalid aliases will no longer throw, unless explicitly validated by Composer in the root package ### [1.5.2] 2020-09-08 * Fixed: handling of some invalid -dev versions which were seen as valid * Fixed: some doctypes ### [1.5.1] 2020-01-13 * Fixed: Parsing of aliased version was not validating the alias to be a valid version ### [1.5.0] 2019-03-19 * Added: some support for date versions (e.g. 201903) in `~` operator * Fixed: support for stabilities in `~` operator was inconsistent ### [1.4.2] 2016-08-30 * Fixed: collapsing of complex constraints lead to buggy constraints ### [1.4.1] 2016-06-02 * Changed: branch-like requirements no longer strip build metadata - [composer/semver#38](https://github.com/composer/semver/pull/38). ### [1.4.0] 2016-03-30 * Added: getters on MultiConstraint - [composer/semver#35](https://github.com/composer/semver/pull/35). ### [1.3.0] 2016-02-25 * Fixed: stability parsing - [composer/composer#1234](https://github.com/composer/composer/issues/4889). * Changed: collapse contiguous constraints when possible. ### [1.2.0] 2015-11-10 * Changed: allow multiple numerical identifiers in 'pre-release' version part. * Changed: add more 'v' prefix support. ### [1.1.0] 2015-11-03 * Changed: dropped redundant `test` namespace. * Changed: minor adjustment in datetime parsing normalization. * Changed: `ConstraintInterface` relaxed, setPrettyString is not required anymore. * Changed: `AbstractConstraint` marked deprecated, will be removed in 2.0. * Changed: `Constraint` is now extensible. ### [1.0.0] 2015-09-21 * Break: `VersionConstraint` renamed to `Constraint`. * Break: `SpecificConstraint` renamed to `AbstractConstraint`. * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`. * Break: `VersionParser::parseNameVersionPairs` was removed. * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now. * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now. * Changed: Fixed namespace(s) of test files. * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`. * Changed: `Constraint` now throws `InvalidArgumentException`. ### [0.1.0] 2015-07-23 * Added: `Composer\Semver\Comparator`, various methods to compare versions. * Added: various documents such as README.md, LICENSE, etc. * Added: configuration files for Git, Travis, php-cs-fixer, phpunit. * Break: the following namespaces were renamed: - Namespace: `Composer\Package\Version` -> `Composer\Semver` - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint` - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver` - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` * Changed: code style using php-cs-fixer. [3.4.3]: https://github.com/composer/semver/compare/3.4.2...3.4.3 [3.4.2]: https://github.com/composer/semver/compare/3.4.1...3.4.2 [3.4.1]: https://github.com/composer/semver/compare/3.4.0...3.4.1 [3.4.0]: https://github.com/composer/semver/compare/3.3.2...3.4.0 [3.3.2]: https://github.com/composer/semver/compare/3.3.1...3.3.2 [3.3.1]: https://github.com/composer/semver/compare/3.3.0...3.3.1 [3.3.0]: https://github.com/composer/semver/compare/3.2.9...3.3.0 [3.2.9]: https://github.com/composer/semver/compare/3.2.8...3.2.9 [3.2.8]: https://github.com/composer/semver/compare/3.2.7...3.2.8 [3.2.7]: https://github.com/composer/semver/compare/3.2.6...3.2.7 [3.2.6]: https://github.com/composer/semver/compare/3.2.5...3.2.6 [3.2.5]: https://github.com/composer/semver/compare/3.2.4...3.2.5 [3.2.4]: https://github.com/composer/semver/compare/3.2.3...3.2.4 [3.2.3]: https://github.com/composer/semver/compare/3.2.2...3.2.3 [3.2.2]: https://github.com/composer/semver/compare/3.2.1...3.2.2 [3.2.1]: https://github.com/composer/semver/compare/3.2.0...3.2.1 [3.2.0]: https://github.com/composer/semver/compare/3.1.0...3.2.0 [3.1.0]: https://github.com/composer/semver/compare/3.0.1...3.1.0 [3.0.1]: https://github.com/composer/semver/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/composer/semver/compare/2.0.0...3.0.0 [2.0.0]: https://github.com/composer/semver/compare/1.5.1...2.0.0 [1.7.2]: https://github.com/composer/semver/compare/1.7.1...1.7.2 [1.7.1]: https://github.com/composer/semver/compare/1.7.0...1.7.1 [1.7.0]: https://github.com/composer/semver/compare/1.6.0...1.7.0 [1.6.0]: https://github.com/composer/semver/compare/1.5.2...1.6.0 [1.5.2]: https://github.com/composer/semver/compare/1.5.1...1.5.2 [1.5.1]: https://github.com/composer/semver/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/composer/semver/compare/1.4.2...1.5.0 [1.4.2]: https://github.com/composer/semver/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/composer/semver/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/composer/semver/compare/1.3.0...1.4.0 [1.3.0]: https://github.com/composer/semver/compare/1.2.0...1.3.0 [1.2.0]: https://github.com/composer/semver/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/composer/semver/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/composer/semver/compare/0.1.0...1.0.0 [0.1.0]: https://github.com/composer/semver/compare/5e0b9a4da...0.1.0 composer/semver =============== Semver (Semantic Versioning) library that offers utilities, version constraint parsing and validation. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. [![Continuous Integration](https://github.com/composer/semver/actions/workflows/continuous-integration.yml/badge.svg?branch=main)](https://github.com/composer/semver/actions/workflows/continuous-integration.yml) [![PHP Lint](https://github.com/composer/semver/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/composer/semver/actions/workflows/lint.yml) [![PHPStan](https://github.com/composer/semver/actions/workflows/phpstan.yml/badge.svg?branch=main)](https://github.com/composer/semver/actions/workflows/phpstan.yml) Installation ------------ Install the latest version with: ```bash composer require composer/semver ``` Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. Version Comparison ------------------ For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md) article in the documentation section of the [getcomposer.org](https://getcomposer.org) website. Basic usage ----------- ### Comparator The [`Composer\Semver\Comparator`](https://github.com/composer/semver/blob/main/src/Comparator.php) class provides the following methods for comparing versions: * greaterThan($v1, $v2) * greaterThanOrEqualTo($v1, $v2) * lessThan($v1, $v2) * lessThanOrEqualTo($v1, $v2) * equalTo($v1, $v2) * notEqualTo($v1, $v2) Each function takes two version strings as arguments and returns a boolean. For example: ```php use Composer\Semver\Comparator; Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0 ``` ### Semver The [`Composer\Semver\Semver`](https://github.com/composer/semver/blob/main/src/Semver.php) class provides the following methods: * satisfies($version, $constraints) * satisfiedBy(array $versions, $constraint) * sort($versions) * rsort($versions) ### Intervals The [`Composer\Semver\Intervals`](https://github.com/composer/semver/blob/main/src/Intervals.php) static class provides a few utilities to work with complex constraints or read version intervals from a constraint: ```php use Composer\Semver\Intervals; // Checks whether $candidate is a subset of $constraint Intervals::isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint); // Checks whether $a and $b have any intersection, equivalent to $a->matches($b) Intervals::haveIntersections(ConstraintInterface $a, ConstraintInterface $b); // Optimizes a complex multi constraint by merging all intervals down to the smallest // possible multi constraint. The drawbacks are this is not very fast, and the resulting // multi constraint will have no human readable prettyConstraint configured on it Intervals::compactConstraint(ConstraintInterface $constraint); // Creates an array of numeric intervals and branch constraints representing a given constraint Intervals::get(ConstraintInterface $constraint); // Clears the memoization cache when you are done processing constraints Intervals::clear() ``` See the class docblocks for more details. License ------- composer/semver is licensed under the MIT License, see the LICENSE file for details. { "name": "composer\/semver", "description": "Semver library that offers utilities, version constraint parsing and validation.", "type": "library", "license": "MIT", "keywords": [ "semver", "semantic", "versioning", "validation" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http:\/\/www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http:\/\/seld.be" }, { "name": "Rob Bast", "email": "rob.bast@gmail.com", "homepage": "http:\/\/robbast.nl" } ], "support": { "irc": "ircs:\/\/irc.libera.chat:6697\/composer", "issues": "https:\/\/github.com\/composer\/semver\/issues" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "symfony\/phpunit-bridge": "^3 || ^7", "phpstan\/phpstan": "^1.11" }, "autoload": { "psr-4": { "Composer\\Semver\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\Semver\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "3.x-dev" } }, "scripts": { "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor\/bin\/simple-phpunit", "phpstan": "@php vendor\/bin\/phpstan analyse" } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; /** * Helper class to evaluate constraint by compiling and reusing the code to evaluate */ class CompilingMatcher { /** * @var array * @phpstan-var array */ private static $compiledCheckerCache = array(); /** * @var array * @phpstan-var array */ private static $resultCache = array(); /** @var bool */ private static $enabled; /** * @phpstan-var array */ private static $transOpInt = array(Constraint::OP_EQ => Constraint::STR_OP_EQ, Constraint::OP_LT => Constraint::STR_OP_LT, Constraint::OP_LE => Constraint::STR_OP_LE, Constraint::OP_GT => Constraint::STR_OP_GT, Constraint::OP_GE => Constraint::STR_OP_GE, Constraint::OP_NE => Constraint::STR_OP_NE); /** * Clears the memoization cache once you are done * * @return void */ public static function clear() { self::$resultCache = array(); self::$compiledCheckerCache = array(); } /** * Evaluates the expression: $constraint match $operator $version * * @param ConstraintInterface $constraint * @param int $operator * @phpstan-param Constraint::OP_* $operator * @param string $version * * @return bool */ public static function match(ConstraintInterface $constraint, $operator, $version) { $resultCacheKey = $operator . $constraint . ';' . $version; if (isset(self::$resultCache[$resultCacheKey])) { return self::$resultCache[$resultCacheKey]; } if (self::$enabled === null) { self::$enabled = !\in_array('eval', \explode(',', (string) \ini_get('disable_functions')), \true); } if (!self::$enabled) { return self::$resultCache[$resultCacheKey] = $constraint->matches(new Constraint(self::$transOpInt[$operator], $version)); } $cacheKey = $operator . $constraint; if (!isset(self::$compiledCheckerCache[$cacheKey])) { $code = $constraint->compile($operator); self::$compiledCheckerCache[$cacheKey] = $function = eval('return function($v, $b){return ' . $code . ';};'); } else { $function = self::$compiledCheckerCache[$cacheKey]; } return self::$resultCache[$resultCacheKey] = $function($version, \strpos($version, 'dev-') === 0); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; class Interval { /** @var Constraint */ private $start; /** @var Constraint */ private $end; public function __construct(Constraint $start, Constraint $end) { $this->start = $start; $this->end = $end; } /** * @return Constraint */ public function getStart() { return $this->start; } /** * @return Constraint */ public function getEnd() { return $this->end; } /** * @return Constraint */ public static function fromZero() { static $zero; if (null === $zero) { $zero = new Constraint('>=', '0.0.0.0-dev'); } return $zero; } /** * @return Constraint */ public static function untilPositiveInfinity() { static $positiveInfinity; if (null === $positiveInfinity) { $positiveInfinity = new Constraint('<', \PHP_INT_MAX . '.0.0.0'); } return $positiveInfinity; } /** * @return self */ public static function any() { return new self(self::fromZero(), self::untilPositiveInfinity()); } /** * @return array{'names': string[], 'exclude': bool} */ public static function anyDev() { // any == exclude nothing return array('names' => array(), 'exclude' => \true); } /** * @return array{'names': string[], 'exclude': bool} */ public static function noDev() { // nothing == no names included return array('names' => array(), 'exclude' => \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; class Comparator { /** * Evaluates the expression: $version1 > $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThan($version1, $version2) { return self::compare($version1, '>', $version2); } /** * Evaluates the expression: $version1 >= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThanOrEqualTo($version1, $version2) { return self::compare($version1, '>=', $version2); } /** * Evaluates the expression: $version1 < $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThan($version1, $version2) { return self::compare($version1, '<', $version2); } /** * Evaluates the expression: $version1 <= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThanOrEqualTo($version1, $version2) { return self::compare($version1, '<=', $version2); } /** * Evaluates the expression: $version1 == $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function equalTo($version1, $version2) { return self::compare($version1, '==', $version2); } /** * Evaluates the expression: $version1 != $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function notEqualTo($version1, $version2) { return self::compare($version1, '!=', $version2); } /** * Evaluates the expression: $version1 $operator $version2. * * @param string $version1 * @param string $operator * @param string $version2 * * @return bool * * @phpstan-param Constraint::STR_OP_* $operator */ public static function compare($version1, $operator, $version2) { $constraint = new Constraint($operator, $version2); return $constraint->matchSpecific(new Constraint('==', $version1), \true); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Semver\Constraint\MatchNoneConstraint; use Composer\Semver\Constraint\MultiConstraint; /** * Helper class generating intervals from constraints * * This contains utilities for: * * - compacting an existing constraint which can be used to combine several into one * by creating a MultiConstraint out of the many constraints you have. * * - checking whether one subset is a subset of another. * * Note: You should call clear to free memoization memory usage when you are done using this class */ class Intervals { /** * @phpstan-var array */ private static $intervalsCache = array(); /** * @phpstan-var array */ private static $opSortOrder = array('>=' => -3, '<' => -2, '>' => 2, '<=' => 3); /** * Clears the memoization cache once you are done * * @return void */ public static function clear() { self::$intervalsCache = array(); } /** * Checks whether $candidate is a subset of $constraint * * @return bool */ public static function isSubsetOf(ConstraintInterface $candidate, ConstraintInterface $constraint) { if ($constraint instanceof MatchAllConstraint) { return \true; } if ($candidate instanceof MatchNoneConstraint || $constraint instanceof MatchNoneConstraint) { return \false; } $intersectionIntervals = self::get(new MultiConstraint(array($candidate, $constraint), \true)); $candidateIntervals = self::get($candidate); if (\count($intersectionIntervals['numeric']) !== \count($candidateIntervals['numeric'])) { return \false; } foreach ($intersectionIntervals['numeric'] as $index => $interval) { if (!isset($candidateIntervals['numeric'][$index])) { return \false; } if ((string) $candidateIntervals['numeric'][$index]->getStart() !== (string) $interval->getStart()) { return \false; } if ((string) $candidateIntervals['numeric'][$index]->getEnd() !== (string) $interval->getEnd()) { return \false; } } if ($intersectionIntervals['branches']['exclude'] !== $candidateIntervals['branches']['exclude']) { return \false; } if (\count($intersectionIntervals['branches']['names']) !== \count($candidateIntervals['branches']['names'])) { return \false; } foreach ($intersectionIntervals['branches']['names'] as $index => $name) { if ($name !== $candidateIntervals['branches']['names'][$index]) { return \false; } } return \true; } /** * Checks whether $a and $b have any intersection, equivalent to $a->matches($b) * * @return bool */ public static function haveIntersections(ConstraintInterface $a, ConstraintInterface $b) { if ($a instanceof MatchAllConstraint || $b instanceof MatchAllConstraint) { return \true; } if ($a instanceof MatchNoneConstraint || $b instanceof MatchNoneConstraint) { return \false; } $intersectionIntervals = self::generateIntervals(new MultiConstraint(array($a, $b), \true), \true); return \count($intersectionIntervals['numeric']) > 0 || $intersectionIntervals['branches']['exclude'] || \count($intersectionIntervals['branches']['names']) > 0; } /** * Attempts to optimize a MultiConstraint * * When merging MultiConstraints together they can get very large, this will * compact it by looking at the real intervals covered by all the constraints * and then creates a new constraint containing only the smallest amount of rules * to match the same intervals. * * @return ConstraintInterface */ public static function compactConstraint(ConstraintInterface $constraint) { if (!$constraint instanceof MultiConstraint) { return $constraint; } $intervals = self::generateIntervals($constraint); $constraints = array(); $hasNumericMatchAll = \false; if (\count($intervals['numeric']) === 1 && (string) $intervals['numeric'][0]->getStart() === (string) \Composer\Semver\Interval::fromZero() && (string) $intervals['numeric'][0]->getEnd() === (string) \Composer\Semver\Interval::untilPositiveInfinity()) { $constraints[] = $intervals['numeric'][0]->getStart(); $hasNumericMatchAll = \true; } else { $unEqualConstraints = array(); for ($i = 0, $count = \count($intervals['numeric']); $i < $count; $i++) { $interval = $intervals['numeric'][$i]; // if current interval ends with < N and next interval begins with > N we can swap this out for != N // but this needs to happen as a conjunctive expression together with the start of the current interval // and end of next interval, so [>=M, N, [>=M, !=N, getEnd()->getOperator() === '<' && $i + 1 < $count) { $nextInterval = $intervals['numeric'][$i + 1]; if ($interval->getEnd()->getVersion() === $nextInterval->getStart()->getVersion() && $nextInterval->getStart()->getOperator() === '>') { // only add a start if we didn't already do so, can be skipped if we're looking at second // interval in [>=M, N, P, =M, !=N] already and we only want to add !=P right now if (\count($unEqualConstraints) === 0 && (string) $interval->getStart() !== (string) \Composer\Semver\Interval::fromZero()) { $unEqualConstraints[] = $interval->getStart(); } $unEqualConstraints[] = new Constraint('!=', $interval->getEnd()->getVersion()); continue; } } if (\count($unEqualConstraints) > 0) { // this is where the end of the following interval of a != constraint is added as explained above if ((string) $interval->getEnd() !== (string) \Composer\Semver\Interval::untilPositiveInfinity()) { $unEqualConstraints[] = $interval->getEnd(); } // count is 1 if entire constraint is just one != expression if (\count($unEqualConstraints) > 1) { $constraints[] = new MultiConstraint($unEqualConstraints, \true); } else { $constraints[] = $unEqualConstraints[0]; } $unEqualConstraints = array(); continue; } // convert back >= x - <= x intervals to == x if ($interval->getStart()->getVersion() === $interval->getEnd()->getVersion() && $interval->getStart()->getOperator() === '>=' && $interval->getEnd()->getOperator() === '<=') { $constraints[] = new Constraint('==', $interval->getStart()->getVersion()); continue; } if ((string) $interval->getStart() === (string) \Composer\Semver\Interval::fromZero()) { $constraints[] = $interval->getEnd(); } elseif ((string) $interval->getEnd() === (string) \Composer\Semver\Interval::untilPositiveInfinity()) { $constraints[] = $interval->getStart(); } else { $constraints[] = new MultiConstraint(array($interval->getStart(), $interval->getEnd()), \true); } } } $devConstraints = array(); if (0 === \count($intervals['branches']['names'])) { if ($intervals['branches']['exclude']) { if ($hasNumericMatchAll) { return new MatchAllConstraint(); } // otherwise constraint should contain a != operator and already cover this } } else { foreach ($intervals['branches']['names'] as $branchName) { if ($intervals['branches']['exclude']) { $devConstraints[] = new Constraint('!=', $branchName); } else { $devConstraints[] = new Constraint('==', $branchName); } } // excluded branches, e.g. != dev-foo are conjunctive with the interval, so // > 2.0 != dev-foo must return a conjunctive constraint if ($intervals['branches']['exclude']) { if (\count($constraints) > 1) { return new MultiConstraint(\array_merge(array(new MultiConstraint($constraints, \false)), $devConstraints), \true); } if (\count($constraints) === 1 && (string) $constraints[0] === (string) \Composer\Semver\Interval::fromZero()) { if (\count($devConstraints) > 1) { return new MultiConstraint($devConstraints, \true); } return $devConstraints[0]; } return new MultiConstraint(\array_merge($constraints, $devConstraints), \true); } // otherwise devConstraints contains a list of == operators for branches which are disjunctive with the // rest of the constraint $constraints = \array_merge($constraints, $devConstraints); } if (\count($constraints) > 1) { return new MultiConstraint($constraints, \false); } if (\count($constraints) === 1) { return $constraints[0]; } return new MatchNoneConstraint(); } /** * Creates an array of numeric intervals and branch constraints representing a given constraint * * if the returned numeric array is empty it means the constraint matches nothing in the numeric range (0 - +inf) * if the returned branches array is empty it means no dev-* versions are matched * if a constraint matches all possible dev-* versions, branches will contain Interval::anyDev() * * @return array * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ public static function get(ConstraintInterface $constraint) { $key = (string) $constraint; if (!isset(self::$intervalsCache[$key])) { self::$intervalsCache[$key] = self::generateIntervals($constraint); } return self::$intervalsCache[$key]; } /** * @param bool $stopOnFirstValidInterval * * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ private static function generateIntervals(ConstraintInterface $constraint, $stopOnFirstValidInterval = \false) { if ($constraint instanceof MatchAllConstraint) { return array('numeric' => array(new \Composer\Semver\Interval(\Composer\Semver\Interval::fromZero(), \Composer\Semver\Interval::untilPositiveInfinity())), 'branches' => \Composer\Semver\Interval::anyDev()); } if ($constraint instanceof MatchNoneConstraint) { return array('numeric' => array(), 'branches' => array('names' => array(), 'exclude' => \false)); } if ($constraint instanceof Constraint) { return self::generateSingleConstraintIntervals($constraint); } if (!$constraint instanceof MultiConstraint) { throw new \UnexpectedValueException('The constraint passed in should be an MatchAllConstraint, Constraint or MultiConstraint instance, got ' . \get_class($constraint) . '.'); } $constraints = $constraint->getConstraints(); $numericGroups = array(); $constraintBranches = array(); foreach ($constraints as $c) { $res = self::get($c); $numericGroups[] = $res['numeric']; $constraintBranches[] = $res['branches']; } if ($constraint->isDisjunctive()) { $branches = \Composer\Semver\Interval::noDev(); foreach ($constraintBranches as $b) { if ($b['exclude']) { if ($branches['exclude']) { // disjunctive constraint, so only exclude what's excluded in all constraints // !=a,!=b || !=b,!=c => !=b $branches['names'] = \array_intersect($branches['names'], $b['names']); } else { // disjunctive constraint so exclude all names which are not explicitly included in the alternative // (==b || ==c) || !=a,!=b => !=a $branches['exclude'] = \true; $branches['names'] = \array_diff($b['names'], $branches['names']); } } else { if ($branches['exclude']) { // disjunctive constraint so exclude all names which are not explicitly included in the alternative // !=a,!=b || (==b || ==c) => !=a $branches['names'] = \array_diff($branches['names'], $b['names']); } else { // disjunctive constraint, so just add all the other branches // (==a || ==b) || ==c => ==a || ==b || ==c $branches['names'] = \array_merge($branches['names'], $b['names']); } } } } else { $branches = \Composer\Semver\Interval::anyDev(); foreach ($constraintBranches as $b) { if ($b['exclude']) { if ($branches['exclude']) { // conjunctive, so just add all branch names to be excluded // !=a && !=b => !=a,!=b $branches['names'] = \array_merge($branches['names'], $b['names']); } else { // conjunctive, so only keep included names which are not excluded // (==a||==c) && !=a,!=b => ==c $branches['names'] = \array_diff($branches['names'], $b['names']); } } else { if ($branches['exclude']) { // conjunctive, so only keep included names which are not excluded // !=a,!=b && (==a||==c) => ==c $branches['names'] = \array_diff($b['names'], $branches['names']); $branches['exclude'] = \false; } else { // conjunctive, so only keep names that are included in both // (==a||==b) && (==a||==c) => ==a $branches['names'] = \array_intersect($branches['names'], $b['names']); } } } } $branches['names'] = \array_unique($branches['names']); if (\count($numericGroups) === 1) { return array('numeric' => $numericGroups[0], 'branches' => $branches); } $borders = array(); foreach ($numericGroups as $group) { foreach ($group as $interval) { $borders[] = array('version' => $interval->getStart()->getVersion(), 'operator' => $interval->getStart()->getOperator(), 'side' => 'start'); $borders[] = array('version' => $interval->getEnd()->getVersion(), 'operator' => $interval->getEnd()->getOperator(), 'side' => 'end'); } } $opSortOrder = self::$opSortOrder; \usort($borders, function ($a, $b) use($opSortOrder) { $order = \version_compare($a['version'], $b['version']); if ($order === 0) { return $opSortOrder[$a['operator']] - $opSortOrder[$b['operator']]; } return $order; }); $activeIntervals = 0; $intervals = array(); $index = 0; $activationThreshold = $constraint->isConjunctive() ? \count($numericGroups) : 1; $start = null; foreach ($borders as $border) { if ($border['side'] === 'start') { $activeIntervals++; } else { $activeIntervals--; } if (!$start && $activeIntervals >= $activationThreshold) { $start = new Constraint($border['operator'], $border['version']); } elseif ($start && $activeIntervals < $activationThreshold) { // filter out invalid intervals like > x - <= x, or >= x - < x if (\version_compare($start->getVersion(), $border['version'], '=') && ($start->getOperator() === '>' && $border['operator'] === '<=' || $start->getOperator() === '>=' && $border['operator'] === '<')) { unset($intervals[$index]); } else { $intervals[$index] = new \Composer\Semver\Interval($start, new Constraint($border['operator'], $border['version'])); $index++; if ($stopOnFirstValidInterval) { break; } } $start = null; } } return array('numeric' => $intervals, 'branches' => $branches); } /** * @phpstan-return array{'numeric': Interval[], 'branches': array{'names': string[], 'exclude': bool}} */ private static function generateSingleConstraintIntervals(Constraint $constraint) { $op = $constraint->getOperator(); // handle branch constraints first if (\strpos($constraint->getVersion(), 'dev-') === 0) { $intervals = array(); $branches = array('names' => array(), 'exclude' => \false); // != dev-foo means any numeric version may match, we treat >/< like != they are not really defined for branches if ($op === '!=') { $intervals[] = new \Composer\Semver\Interval(\Composer\Semver\Interval::fromZero(), \Composer\Semver\Interval::untilPositiveInfinity()); $branches = array('names' => array($constraint->getVersion()), 'exclude' => \true); } elseif ($op === '==') { $branches['names'][] = $constraint->getVersion(); } return array('numeric' => $intervals, 'branches' => $branches); } if ($op[0] === '>') { // > & >= return array('numeric' => array(new \Composer\Semver\Interval($constraint, \Composer\Semver\Interval::untilPositiveInfinity())), 'branches' => \Composer\Semver\Interval::noDev()); } if ($op[0] === '<') { // < & <= return array('numeric' => array(new \Composer\Semver\Interval(\Composer\Semver\Interval::fromZero(), $constraint)), 'branches' => \Composer\Semver\Interval::noDev()); } if ($op === '!=') { // convert !=x to intervals of 0 - x - +inf + dev* return array('numeric' => array(new \Composer\Semver\Interval(\Composer\Semver\Interval::fromZero(), new Constraint('<', $constraint->getVersion())), new \Composer\Semver\Interval(new Constraint('>', $constraint->getVersion()), \Composer\Semver\Interval::untilPositiveInfinity())), 'branches' => \Composer\Semver\Interval::anyDev()); } // convert ==x to an interval of >=x - <=x return array('numeric' => array(new \Composer\Semver\Interval(new Constraint('>=', $constraint->getVersion()), new Constraint('<=', $constraint->getVersion()))), 'branches' => \Composer\Semver\Interval::noDev()); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; class Semver { const SORT_ASC = 1; const SORT_DESC = -1; /** @var VersionParser */ private static $versionParser; /** * Determine if given version satisfies given constraints. * * @param string $version * @param string $constraints * * @return bool */ public static function satisfies($version, $constraints) { if (null === self::$versionParser) { self::$versionParser = new \Composer\Semver\VersionParser(); } $versionParser = self::$versionParser; $provider = new Constraint('==', $versionParser->normalize($version)); $parsedConstraints = $versionParser->parseConstraints($constraints); return $parsedConstraints->matches($provider); } /** * Return all versions that satisfy given constraints. * * @param string[] $versions * @param string $constraints * * @return string[] */ public static function satisfiedBy(array $versions, $constraints) { $versions = \array_filter($versions, function ($version) use($constraints) { return \Composer\Semver\Semver::satisfies($version, $constraints); }); return \array_values($versions); } /** * Sort given array of versions. * * @param string[] $versions * * @return string[] */ public static function sort(array $versions) { return self::usort($versions, self::SORT_ASC); } /** * Sort given array of versions in reverse. * * @param string[] $versions * * @return string[] */ public static function rsort(array $versions) { return self::usort($versions, self::SORT_DESC); } /** * @param string[] $versions * @param int $direction * * @return string[] */ private static function usort(array $versions, $direction) { if (null === self::$versionParser) { self::$versionParser = new \Composer\Semver\VersionParser(); } $versionParser = self::$versionParser; $normalized = array(); // Normalize outside of usort() scope for minor performance increase. // Creates an array of arrays: [[normalized, key], ...] foreach ($versions as $key => $version) { $normalizedVersion = $versionParser->normalize($version); $normalizedVersion = $versionParser->normalizeDefaultBranch($normalizedVersion); $normalized[] = array($normalizedVersion, $key); } \usort($normalized, function (array $left, array $right) use($direction) { if ($left[0] === $right[0]) { return 0; } if (\Composer\Semver\Comparator::lessThan($left[0], $right[0])) { return -$direction; } return $direction; }); // Recreate input array, using the original indexes which are now in sorted order. $sorted = array(); foreach ($normalized as $item) { $sorted[] = $versions[$item[1]]; } return $sorted; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\MatchAllConstraint; use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Constraint\Constraint; /** * Version parser. * * @author Jordi Boggiano */ class VersionParser { /** * Regex to match pre-release data (sort of). * * Due to backwards compatibility: * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. * - Numerical-only pre-release identifiers are not supported, see tests. * * |--------------| * [major].[minor].[patch] -[pre-release] +[build-metadata] * * @var string */ private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\\d+)*+)?)?([.-]?dev)?'; /** @var string */ private static $stabilitiesRegex = 'stable|RC|beta|alpha|dev'; /** * Returns the stability of a version. * * @param string $version * * @return string * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' */ public static function parseStability($version) { $version = (string) \preg_replace('{#.+$}', '', (string) $version); if (\strpos($version, 'dev-') === 0 || '-dev' === \substr($version, -4)) { return 'dev'; } \preg_match('{' . self::$modifierRegex . '(?:\\+.*)?$}i', \strtolower($version), $match); if (!empty($match[3])) { return 'dev'; } if (!empty($match[1])) { if ('beta' === $match[1] || 'b' === $match[1]) { return 'beta'; } if ('alpha' === $match[1] || 'a' === $match[1]) { return 'alpha'; } if ('rc' === $match[1]) { return 'RC'; } } return 'stable'; } /** * @param string $stability * * @return string * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' */ public static function normalizeStability($stability) { $stability = \strtolower((string) $stability); if (!\in_array($stability, array('stable', 'rc', 'beta', 'alpha', 'dev'), \true)) { throw new \InvalidArgumentException('Invalid stability string "' . $stability . '", expected one of stable, RC, beta, alpha or dev'); } return $stability === 'rc' ? 'RC' : $stability; } /** * Normalizes a version string to be able to perform comparisons on it. * * @param string $version * @param ?string $fullVersion optional complete version string to give more context * * @throws \UnexpectedValueException * * @return string */ public function normalize($version, $fullVersion = null) { $version = \trim((string) $version); $origVersion = $version; if (null === $fullVersion) { $fullVersion = $version; } // strip off aliasing if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $version, $match)) { $version = $match[1]; } // strip off stability flag if (\preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) { $version = \substr($version, 0, \strlen($version) - \strlen($match[0])); } // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints if (\in_array($version, array('master', 'trunk', 'default'), \true)) { $version = 'dev-' . $version; } // if requirement is branch-like, use full name if (\stripos($version, 'dev-') === 0) { return 'dev-' . \substr($version, 4); } // strip off build metadata if (\preg_match('{^([^,\\s+]++)\\+[^\\s]++$}', $version, $match)) { $version = $match[1]; } // match classical versioning if (\preg_match('{^v?(\\d{1,5}+)(\\.\\d++)?(\\.\\d++)?(\\.\\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0'); $index = 5; // match date(time) based versioning } elseif (\preg_match('{^v?(\\d{4}(?:[.:-]?\\d{2}){1,6}(?:[.:-]?\\d{1,3}){0,2})' . self::$modifierRegex . '$}i', $version, $matches)) { $version = (string) \preg_replace('{\\D}', '.', $matches[1]); $index = 2; } // add version modifiers if a version was matched if (isset($index)) { if (!empty($matches[$index])) { if ('stable' === $matches[$index]) { return $version; } $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? \ltrim($matches[$index + 1], '.-') : ''); } if (!empty($matches[$index + 2])) { $version .= '-dev'; } return $version; } // match dev branches if (\preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { try { $normalized = $this->normalizeBranch($match[1]); // a branch ending with -dev is only valid if it is numeric // if it gets prefixed with dev- it means the branch name should // have had a dev- prefix already when passed to normalize if (\strpos($normalized, 'dev-') === \false) { return $normalized; } } catch (\Exception $e) { } } $extraMessage = ''; if (\preg_match('{ +as +' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))?$}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; } elseif (\preg_match('{^' . \preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))? +as +}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; } throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage); } /** * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. * * @param string $branch Branch name (e.g. 2.1.x-dev) * * @return string|false Numeric prefix if present (e.g. 2.1.) or false */ public function parseNumericAliasPrefix($branch) { if (\preg_match('{^(?P(\\d++\\.)*\\d++)(?:\\.x)?-dev$}i', (string) $branch, $matches)) { return $matches['version'] . '.'; } return \false; } /** * Normalizes a branch name to be able to perform comparisons on it. * * @param string $name * * @return string */ public function normalizeBranch($name) { $name = \trim((string) $name); if (\preg_match('{^v?(\\d++)(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?(\\.(?:\\d++|[xX*]))?$}i', $name, $matches)) { $version = ''; for ($i = 1; $i < 5; ++$i) { $version .= isset($matches[$i]) ? \str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; } return \str_replace('x', '9999999', $version) . '-dev'; } return 'dev-' . $name; } /** * Normalizes a default branch name (i.e. master on git) to 9999999-dev. * * @param string $name * * @return string * * @deprecated No need to use this anymore in theory, Composer 2 does not normalize any branch names to 9999999-dev anymore */ public function normalizeDefaultBranch($name) { if ($name === 'dev-master' || $name === 'dev-default' || $name === 'dev-trunk') { return '9999999-dev'; } return (string) $name; } /** * Parses a constraint string into MultiConstraint and/or Constraint objects. * * @param string $constraints * * @return ConstraintInterface */ public function parseConstraints($constraints) { $prettyConstraint = (string) $constraints; $orConstraints = \preg_split('{\\s*\\|\\|?\\s*}', \trim((string) $constraints)); if (\false === $orConstraints) { throw new \RuntimeException('Failed to preg_split string: ' . $constraints); } $orGroups = array(); foreach ($orConstraints as $orConstraint) { $andConstraints = \preg_split('{(?< ,]) *(? 1) { $constraintObjects = array(); foreach ($andConstraints as $andConstraint) { foreach ($this->parseConstraint($andConstraint) as $parsedAndConstraint) { $constraintObjects[] = $parsedAndConstraint; } } } else { $constraintObjects = $this->parseConstraint($andConstraints[0]); } if (1 === \count($constraintObjects)) { $constraint = $constraintObjects[0]; } else { $constraint = new MultiConstraint($constraintObjects); } $orGroups[] = $constraint; } $parsedConstraint = MultiConstraint::create($orGroups, \false); $parsedConstraint->setPrettyString($prettyConstraint); return $parsedConstraint; } /** * @param string $constraint * * @throws \UnexpectedValueException * * @return array * * @phpstan-return non-empty-array */ private function parseConstraint($constraint) { // strip off aliasing if (\preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $constraint, $match)) { $constraint = $match[1]; } // strip @stability flags, and keep it for later use if (\preg_match('{^([^,\\s]*?)@(' . self::$stabilitiesRegex . ')$}i', $constraint, $match)) { $constraint = '' !== $match[1] ? $match[1] : '*'; if ($match[2] !== 'stable') { $stabilityModifier = $match[2]; } } // get rid of #refs as those are used by composer only if (\preg_match('{^(dev-[^,\\s@]+?|[^,\\s@]+?\\.x-dev)#.+$}i', $constraint, $match)) { $constraint = $match[1]; } if (\preg_match('{^(v)?[xX*](\\.[xX*])*$}i', $constraint, $match)) { if (!empty($match[1]) || !empty($match[2])) { return array(new Constraint('>=', '0.0.0.0-dev')); } return array(new MatchAllConstraint()); } $versionRegex = 'v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.(\\d++))?(?:' . self::$modifierRegex . '|\\.([xX*][.-]?dev))(?:\\+[^\\s]+)?'; // Tilde Range // // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous // version, to ensure that unstable instances of the current version are allowed. However, if a stability // suffix is added to the constraint, then a >= match on the current version is used instead. if (\preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { if (\strpos($constraint, '~>') === 0) { throw new \UnexpectedValueException('Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator'); } // Work out which position in the version we are operating at if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { $position = 4; } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } // when matching 2.x-dev or 3.0.x-dev we have to shift the second or third number, despite no second/third number matching above if (!empty($matches[8])) { $position++; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highPosition = \max(1, $position - 1); $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } // Caret Range // // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for // versions 0.X >=0.1.0, and no updates for versions 0.0.X if (\preg_match('{^\\^' . $versionRegex . '($)}i', $constraint, $matches)) { // Work out which position in the version we are operating at if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { $position = 1; } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { $position = 2; } else { $position = 3; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7]) && empty($matches[8])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(\substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array($lowerBound, $upperBound); } // X Range // // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. // A partial version range is treated as an X-Range, so the special character is in fact optional. if (\preg_match('{^v?(\\d++)(?:\\.(\\d++))?(?:\\.(\\d++))?(?:\\.[xX*])++$}', $constraint, $matches)) { if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; if ($lowVersion === '0.0.0.0-dev') { return array(new Constraint('<', $highVersion)); } return array(new Constraint('>=', $lowVersion), new Constraint('<', $highVersion)); } // Hyphen Range // // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but // nothing that would be greater than the provided tuple parts. if (\preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) { // Calculate the stability suffix $lowStabilitySuffix = ''; if (empty($matches[6]) && empty($matches[8]) && empty($matches[9])) { $lowStabilitySuffix = '-dev'; } $lowVersion = $this->normalize($matches['from']); $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); $empty = function ($x) { return $x === 0 || $x === '0' ? \false : empty($x); }; if (!$empty($matches[12]) && !$empty($matches[13]) || !empty($matches[15]) || !empty($matches[17]) || !empty($matches[18])) { $highVersion = $this->normalize($matches['to']); $upperBound = new Constraint('<=', $highVersion); } else { $highMatch = array('', $matches[11], $matches[12], $matches[13], $matches[14]); // validate to version $this->normalize($matches['to']); $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[12]) ? 1 : 2, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); } return array($lowerBound, $upperBound); } // Basic Comparators if (\preg_match('{^(<>|!=|>=?|<=?|==?)?\\s*(.*)}', $constraint, $matches)) { try { try { $version = $this->normalize($matches[2]); } catch (\UnexpectedValueException $e) { // recover from an invalid constraint like foobar-dev which should be dev-foobar // except if the constraint uses a known operator, in which case it must be a parse error if (\substr($matches[2], -4) === '-dev' && \preg_match('{^[0-9a-zA-Z-./]+$}', $matches[2])) { $version = $this->normalize('dev-' . \substr($matches[2], 0, -4)); } else { throw $e; } } $op = $matches[1] ?: '='; if ($op !== '==' && $op !== '=' && !empty($stabilityModifier) && self::parseStability($version) === 'stable') { $version .= '-' . $stabilityModifier; } elseif ('<' === $op || '>=' === $op) { if (!\preg_match('/-' . self::$modifierRegex . '$/', \strtolower($matches[2]))) { if (\strpos($matches[2], 'dev-') !== 0) { $version .= '-dev'; } } } return array(new Constraint($matches[1] ?: '=', $version)); } catch (\Exception $e) { } } $message = 'Could not parse version constraint ' . $constraint; if (isset($e)) { $message .= ': ' . $e->getMessage(); } throw new \UnexpectedValueException($message); } /** * Increment, decrement, or simply pad a version number. * * Support function for {@link parseConstraint()} * * @param array $matches Array with version parts in array indexes 1,2,3,4 * @param int $position 1,2,3,4 - which segment of the version to increment/decrement * @param int $increment * @param string $pad The string to pad version parts after $position * * @return string|null The new version * * @phpstan-param string[] $matches */ private function manipulateVersionString(array $matches, $position, $increment = 0, $pad = '0') { for ($i = 4; $i > 0; --$i) { if ($i > $position) { $matches[$i] = $pad; } elseif ($i === $position && $increment) { $matches[$i] += $increment; // If $matches[$i] was 0, carry the decrement if ($matches[$i] < 0) { $matches[$i] = $pad; --$position; // Return null on a carry overflow if ($i === 1) { return null; } } } } return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; } /** * Expand shorthand stability string to long version. * * @param string $stability * * @return string */ private function expandStability($stability) { $stability = \strtolower($stability); switch ($stability) { case 'a': return 'alpha'; case 'b': return 'beta'; case 'p': case 'pl': return 'patch'; case 'rc': return 'RC'; default: return $stability; } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * DO NOT IMPLEMENT this interface. It is only meant for usage as a type hint * in libraries relying on composer/semver but creating your own constraint class * that implements this interface is not a supported use case and will cause the * composer/semver components to return unexpected results. */ interface ConstraintInterface { /** * Checks whether the given constraint intersects in any way with this constraint * * @param ConstraintInterface $provider * * @return bool */ public function matches(\Composer\Semver\Constraint\ConstraintInterface $provider); /** * Provides a compiled version of the constraint for the given operator * The compiled version must be a PHP expression. * Executor of compile version must provide 2 variables: * - $v = the string version to compare with * - $b = whether or not the version is a non-comparable branch (starts with "dev-") * * @see Constraint::OP_* for the list of available operators. * @example return '!$b && version_compare($v, '1.0', '>')'; * * @param int $otherOperator one Constraint::OP_* * * @return string * * @phpstan-param Constraint::OP_* $otherOperator */ public function compile($otherOperator); /** * @return Bound */ public function getUpperBound(); /** * @return Bound */ public function getLowerBound(); /** * @return string */ public function getPrettyString(); /** * @param string|null $prettyString * * @return void */ public function setPrettyString($prettyString); /** * @return string */ public function __toString(); } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Defines a conjunctive or disjunctive set of constraints. */ class MultiConstraint implements \Composer\Semver\Constraint\ConstraintInterface { /** * @var ConstraintInterface[] * @phpstan-var non-empty-array */ protected $constraints; /** @var string|null */ protected $prettyString; /** @var string|null */ protected $string; /** @var bool */ protected $conjunctive; /** @var Bound|null */ protected $lowerBound; /** @var Bound|null */ protected $upperBound; /** * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @throws \InvalidArgumentException If less than 2 constraints are passed */ public function __construct(array $constraints, $conjunctive = \true) { if (\count($constraints) < 2) { throw new \InvalidArgumentException('Must provide at least two constraints for a MultiConstraint. Use ' . 'the regular Constraint class for one constraint only or MatchAllConstraint for none. You may use ' . 'MultiConstraint::create() which optimizes and handles those cases automatically.'); } $this->constraints = $constraints; $this->conjunctive = $conjunctive; } /** * @return ConstraintInterface[] */ public function getConstraints() { return $this->constraints; } /** * @return bool */ public function isConjunctive() { return $this->conjunctive; } /** * @return bool */ public function isDisjunctive() { return !$this->conjunctive; } /** * {@inheritDoc} */ public function compile($otherOperator) { $parts = array(); foreach ($this->constraints as $constraint) { $code = $constraint->compile($otherOperator); if ($code === 'true') { if (!$this->conjunctive) { return 'true'; } } elseif ($code === 'false') { if ($this->conjunctive) { return 'false'; } } else { $parts[] = '(' . $code . ')'; } } if (!$parts) { return $this->conjunctive ? 'true' : 'false'; } return $this->conjunctive ? \implode('&&', $parts) : \implode('||', $parts); } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(\Composer\Semver\Constraint\ConstraintInterface $provider) { if (\false === $this->conjunctive) { foreach ($this->constraints as $constraint) { if ($provider->matches($constraint)) { return \true; } } return \false; } // when matching a conjunctive and a disjunctive multi constraint we have to iterate over the disjunctive one // otherwise we'd return true if different parts of the disjunctive constraint match the conjunctive one // which would lead to incorrect results, e.g. [>1 and <2] would match [<1 or >2] although they do not intersect if ($provider instanceof \Composer\Semver\Constraint\MultiConstraint && $provider->isDisjunctive()) { return $provider->matches($this); } foreach ($this->constraints as $constraint) { if (!$provider->matches($constraint)) { return \false; } } return \true; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { if ($this->string !== null) { return $this->string; } $constraints = array(); foreach ($this->constraints as $constraint) { $constraints[] = (string) $constraint; } return $this->string = '[' . \implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; } /** * {@inheritDoc} */ public function getLowerBound() { $this->extractBounds(); if (null === $this->lowerBound) { throw new \LogicException('extractBounds should have populated the lowerBound property'); } return $this->lowerBound; } /** * {@inheritDoc} */ public function getUpperBound() { $this->extractBounds(); if (null === $this->upperBound) { throw new \LogicException('extractBounds should have populated the upperBound property'); } return $this->upperBound; } /** * Tries to optimize the constraints as much as possible, meaning * reducing/collapsing congruent constraints etc. * Does not necessarily return a MultiConstraint instance if * things can be reduced to a simple constraint * * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @return ConstraintInterface */ public static function create(array $constraints, $conjunctive = \true) { if (0 === \count($constraints)) { return new \Composer\Semver\Constraint\MatchAllConstraint(); } if (1 === \count($constraints)) { return $constraints[0]; } $optimized = self::optimizeConstraints($constraints, $conjunctive); if ($optimized !== null) { list($constraints, $conjunctive) = $optimized; if (\count($constraints) === 1) { return $constraints[0]; } } return new self($constraints, $conjunctive); } /** * @param ConstraintInterface[] $constraints * @param bool $conjunctive * @return ?array * * @phpstan-return array{0: list, 1: bool}|null */ private static function optimizeConstraints(array $constraints, $conjunctive) { // parse the two OR groups and if they are contiguous we collapse // them into one constraint // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] if (!$conjunctive) { $left = $constraints[0]; $mergedConstraints = array(); $optimized = \false; for ($i = 1, $l = \count($constraints); $i < $l; $i++) { $right = $constraints[$i]; if ($left instanceof self && $left->conjunctive && $right instanceof self && $right->conjunctive && \count($left->constraints) === 2 && \count($right->constraints) === 2 && ($left0 = (string) $left->constraints[0]) && $left0[0] === '>' && $left0[1] === '=' && ($left1 = (string) $left->constraints[1]) && $left1[0] === '<' && ($right0 = (string) $right->constraints[0]) && $right0[0] === '>' && $right0[1] === '=' && ($right1 = (string) $right->constraints[1]) && $right1[0] === '<' && \substr($left1, 2) === \substr($right0, 3)) { $optimized = \true; $left = new \Composer\Semver\Constraint\MultiConstraint(array($left->constraints[0], $right->constraints[1]), \true); } else { $mergedConstraints[] = $left; $left = $right; } } if ($optimized) { $mergedConstraints[] = $left; return array($mergedConstraints, \false); } } // TODO: Here's the place to put more optimizations return null; } /** * @return void */ private function extractBounds() { if (null !== $this->lowerBound) { return; } foreach ($this->constraints as $constraint) { if (null === $this->lowerBound || null === $this->upperBound) { $this->lowerBound = $constraint->getLowerBound(); $this->upperBound = $constraint->getUpperBound(); continue; } if ($constraint->getLowerBound()->compareTo($this->lowerBound, $this->isConjunctive() ? '>' : '<')) { $this->lowerBound = $constraint->getLowerBound(); } if ($constraint->getUpperBound()->compareTo($this->upperBound, $this->isConjunctive() ? '<' : '>')) { $this->upperBound = $constraint->getUpperBound(); } } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Defines a constraint. */ class Constraint implements \Composer\Semver\Constraint\ConstraintInterface { /* operator integer values */ const OP_EQ = 0; const OP_LT = 1; const OP_LE = 2; const OP_GT = 3; const OP_GE = 4; const OP_NE = 5; /* operator string values */ const STR_OP_EQ = '=='; const STR_OP_EQ_ALT = '='; const STR_OP_LT = '<'; const STR_OP_LE = '<='; const STR_OP_GT = '>'; const STR_OP_GE = '>='; const STR_OP_NE = '!='; const STR_OP_NE_ALT = '<>'; /** * Operator to integer translation table. * * @var array * @phpstan-var array */ private static $transOpStr = array('=' => self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE); /** * Integer to operator translation table. * * @var array * @phpstan-var array */ private static $transOpInt = array(self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!='); /** * @var int * @phpstan-var self::OP_* */ protected $operator; /** @var string */ protected $version; /** @var string|null */ protected $prettyString; /** @var Bound */ protected $lowerBound; /** @var Bound */ protected $upperBound; /** * Sets operator and version to compare with. * * @param string $operator * @param string $version * * @throws \InvalidArgumentException if invalid operator is given. * * @phpstan-param self::STR_OP_* $operator */ public function __construct($operator, $version) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $this->operator = self::$transOpStr[$operator]; $this->version = $version; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return string * * @phpstan-return self::STR_OP_* */ public function getOperator() { return self::$transOpInt[$this->operator]; } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(\Composer\Semver\Constraint\ConstraintInterface $provider) { if ($provider instanceof self) { return $this->matchSpecific($provider); } // turn matching around to find a match return $provider->matches($this); } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } /** * Get all supported comparison operators. * * @return array * * @phpstan-return list */ public static function getSupportedOperators() { return \array_keys(self::$transOpStr); } /** * @param string $operator * @return int * * @phpstan-param self::STR_OP_* $operator * @phpstan-return self::OP_* */ public static function getOperatorConstant($operator) { return self::$transOpStr[$operator]; } /** * @param string $a * @param string $b * @param string $operator * @param bool $compareBranches * * @throws \InvalidArgumentException if invalid operator is given. * * @return bool * * @phpstan-param self::STR_OP_* $operator */ public function versionCompare($a, $b, $operator, $compareBranches = \false) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(\sprintf('Invalid operator "%s" given, expected one of: %s', $operator, \implode(', ', self::getSupportedOperators()))); } $aIsBranch = \strpos($a, 'dev-') === 0; $bIsBranch = \strpos($b, 'dev-') === 0; if ($operator === '!=' && ($aIsBranch || $bIsBranch)) { return $a !== $b; } if ($aIsBranch && $bIsBranch) { return $operator === '==' && $a === $b; } // when branches are not comparable, we make sure dev branches never match anything if (!$compareBranches && ($aIsBranch || $bIsBranch)) { return \false; } return \version_compare($a, $b, $operator); } /** * {@inheritDoc} */ public function compile($otherOperator) { if (\strpos($this->version, 'dev-') === 0) { if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b && $v === %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } return 'false'; } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('!$b || $v !== %s', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } return 'false'; } if (self::OP_EQ === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('\\version_compare($v, %s, \'==\')', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return \sprintf('$b || \\version_compare($v, %s, \'!=\')', \var_export($this->version, \true)); } return \sprintf('!$b && \\version_compare(%s, $v, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$otherOperator]); } if (self::OP_NE === $this->operator) { if (self::OP_EQ === $otherOperator) { return \sprintf('$b || (!$b && \\version_compare($v, %s, \'!=\'))', \var_export($this->version, \true)); } if (self::OP_NE === $otherOperator) { return 'true'; } return '!$b'; } if (self::OP_LT === $this->operator || self::OP_LE === $this->operator) { if (self::OP_LT === $otherOperator || self::OP_LE === $otherOperator) { return '!$b'; } } else { // $this->operator must be self::OP_GT || self::OP_GE here if (self::OP_GT === $otherOperator || self::OP_GE === $otherOperator) { return '!$b'; } } if (self::OP_NE === $otherOperator) { return 'true'; } $codeComparison = \sprintf('\\version_compare($v, %s, \'%s\')', \var_export($this->version, \true), self::$transOpInt[$this->operator]); if ($this->operator === self::OP_LE) { if ($otherOperator === self::OP_GT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } elseif ($this->operator === self::OP_GE) { if ($otherOperator === self::OP_LT) { return \sprintf('!$b && \\version_compare($v, %s, \'!=\') && ', \var_export($this->version, \true)) . $codeComparison; } } return \sprintf('!$b && %s', $codeComparison); } /** * @param Constraint $provider * @param bool $compareBranches * * @return bool */ public function matchSpecific(\Composer\Semver\Constraint\Constraint $provider, $compareBranches = \false) { $noEqualOp = \str_replace('=', '', self::$transOpInt[$this->operator]); $providerNoEqualOp = \str_replace('=', '', self::$transOpInt[$provider->operator]); $isEqualOp = self::OP_EQ === $this->operator; $isNonEqualOp = self::OP_NE === $this->operator; $isProviderEqualOp = self::OP_EQ === $provider->operator; $isProviderNonEqualOp = self::OP_NE === $provider->operator; // '!=' operator is match when other operator is not '==' operator or version is not match // these kinds of comparisons always have a solution if ($isNonEqualOp || $isProviderNonEqualOp) { if ($isNonEqualOp && !$isProviderNonEqualOp && !$isProviderEqualOp && \strpos($provider->version, 'dev-') === 0) { return \false; } if ($isProviderNonEqualOp && !$isNonEqualOp && !$isEqualOp && \strpos($this->version, 'dev-') === 0) { return \false; } if (!$isEqualOp && !$isProviderEqualOp) { return \true; } return $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); } // an example for the condition is <= 2.0 & < 1.0 // these kinds of comparisons always have a solution if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { return !(\strpos($this->version, 'dev-') === 0 || \strpos($provider->version, 'dev-') === 0); } $version1 = $isEqualOp ? $this->version : $provider->version; $version2 = $isEqualOp ? $provider->version : $this->version; $operator = $isEqualOp ? $provider->operator : $this->operator; if ($this->versionCompare($version1, $version2, self::$transOpInt[$operator], $compareBranches)) { // special case, e.g. require >= 1.0 and provide < 1.0 // 1.0 >= 1.0 but 1.0 is outside of the provided interval return !(self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp && \version_compare($provider->version, $this->version, '==')); } return \false; } /** * @return string */ public function __toString() { return self::$transOpInt[$this->operator] . ' ' . $this->version; } /** * {@inheritDoc} */ public function getLowerBound() { $this->extractBounds(); return $this->lowerBound; } /** * {@inheritDoc} */ public function getUpperBound() { $this->extractBounds(); return $this->upperBound; } /** * @return void */ private function extractBounds() { if (null !== $this->lowerBound) { return; } // Branches if (\strpos($this->version, 'dev-') === 0) { $this->lowerBound = \Composer\Semver\Constraint\Bound::zero(); $this->upperBound = \Composer\Semver\Constraint\Bound::positiveInfinity(); return; } switch ($this->operator) { case self::OP_EQ: $this->lowerBound = new \Composer\Semver\Constraint\Bound($this->version, \true); $this->upperBound = new \Composer\Semver\Constraint\Bound($this->version, \true); break; case self::OP_LT: $this->lowerBound = \Composer\Semver\Constraint\Bound::zero(); $this->upperBound = new \Composer\Semver\Constraint\Bound($this->version, \false); break; case self::OP_LE: $this->lowerBound = \Composer\Semver\Constraint\Bound::zero(); $this->upperBound = new \Composer\Semver\Constraint\Bound($this->version, \true); break; case self::OP_GT: $this->lowerBound = new \Composer\Semver\Constraint\Bound($this->version, \false); $this->upperBound = \Composer\Semver\Constraint\Bound::positiveInfinity(); break; case self::OP_GE: $this->lowerBound = new \Composer\Semver\Constraint\Bound($this->version, \true); $this->upperBound = \Composer\Semver\Constraint\Bound::positiveInfinity(); break; case self::OP_NE: $this->lowerBound = \Composer\Semver\Constraint\Bound::zero(); $this->upperBound = \Composer\Semver\Constraint\Bound::positiveInfinity(); break; } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Defines the absence of a constraint. * * This constraint matches everything. */ class MatchAllConstraint implements \Composer\Semver\Constraint\ConstraintInterface { /** @var string|null */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(\Composer\Semver\Constraint\ConstraintInterface $provider) { return \true; } /** * {@inheritDoc} */ public function compile($otherOperator) { return 'true'; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { return '*'; } /** * {@inheritDoc} */ public function getUpperBound() { return \Composer\Semver\Constraint\Bound::positiveInfinity(); } /** * {@inheritDoc} */ public function getLowerBound() { return \Composer\Semver\Constraint\Bound::zero(); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Blackhole of constraints, nothing escapes it */ class MatchNoneConstraint implements \Composer\Semver\Constraint\ConstraintInterface { /** @var string|null */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(\Composer\Semver\Constraint\ConstraintInterface $provider) { return \false; } /** * {@inheritDoc} */ public function compile($otherOperator) { return 'false'; } /** * {@inheritDoc} */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * {@inheritDoc} */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * {@inheritDoc} */ public function __toString() { return '[]'; } /** * {@inheritDoc} */ public function getUpperBound() { return new \Composer\Semver\Constraint\Bound('0.0.0.0-dev', \false); } /** * {@inheritDoc} */ public function getLowerBound() { return new \Composer\Semver\Constraint\Bound('0.0.0.0-dev', \false); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; class Bound { /** * @var string */ private $version; /** * @var bool */ private $isInclusive; /** * @param string $version * @param bool $isInclusive */ public function __construct($version, $isInclusive) { $this->version = $version; $this->isInclusive = $isInclusive; } /** * @return string */ public function getVersion() { return $this->version; } /** * @return bool */ public function isInclusive() { return $this->isInclusive; } /** * @return bool */ public function isZero() { return $this->getVersion() === '0.0.0.0-dev' && $this->isInclusive(); } /** * @return bool */ public function isPositiveInfinity() { return $this->getVersion() === \PHP_INT_MAX . '.0.0.0' && !$this->isInclusive(); } /** * Compares a bound to another with a given operator. * * @param Bound $other * @param string $operator * * @return bool */ public function compareTo(\Composer\Semver\Constraint\Bound $other, $operator) { if (!\in_array($operator, array('<', '>'), \true)) { throw new \InvalidArgumentException('Does not support any other operator other than > or <.'); } // If they are the same it doesn't matter if ($this == $other) { return \false; } $compareResult = \version_compare($this->getVersion(), $other->getVersion()); // Not the same version means we don't need to check if the bounds are inclusive or not if (0 !== $compareResult) { return ('>' === $operator ? 1 : -1) === $compareResult; } // Question we're answering here is "am I higher than $other?" return '>' === $operator ? $other->isInclusive() : !$other->isInclusive(); } public function __toString() { return \sprintf('%s [%s]', $this->getVersion(), $this->isInclusive() ? 'inclusive' : 'exclusive'); } /** * @return self */ public static function zero() { return new \Composer\Semver\Constraint\Bound('0.0.0.0-dev', \true); } /** * @return self */ public static function positiveInfinity() { return new \Composer\Semver\Constraint\Bound(\PHP_INT_MAX . '.0.0.0', \false); } } $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php', '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', 'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', '09f6b20656683369174dd6fa83b7e5fb' => $vendorDir . '/symfony/polyfill-uuid/bootstrap.php', '2203a247e6fda86070a5e4e07aed533a' => $vendorDir . '/symfony/clock/Resources/now.php', 'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php', ); * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` * * @final */ class InstalledVersions { /** * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to * @internal */ private static $selfDir = null; /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; /** * @var bool */ private static $installedIsLocalDir; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = \array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return \array_keys(\array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = \true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false; } } return \false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (\array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (\array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (\array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = \array_merge($ranges, $installed['versions'][$packageName]['provided']); } return \implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ public static function getRawData() { @\trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (\substr(__DIR__, -8, 1) !== 'C') { self::$installed = (include __DIR__ . '/installed.php'); } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); // when using reload, we disable the duplicate protection to ensure that self::$installed data is // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, // so we have to assume it does not, and that may result in duplicate data being returned when listing // all installed packages for example self::$installedIsLocalDir = \false; } /** * @return string */ private static function getSelfDir() { if (self::$selfDir === null) { self::$selfDir = \strtr(__DIR__, '\\', '/'); } return self::$selfDir; } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = \method_exists('Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); $copiedLocalDir = \false; if (self::$canGetVendors) { $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { $vendorDir = \strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (\is_file($vendorDir . '/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = (require $vendorDir . '/composer/installed.php'); self::$installedByVendor[$vendorDir] = $required; $installed[] = $required; if (self::$installed === null && $vendorDir . '/composer' === $selfDir) { self::$installed = $required; self::$installedIsLocalDir = \true; } } if (self::$installedIsLocalDir && $vendorDir . '/composer' === $selfDir) { $copiedLocalDir = \true; } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (\substr(__DIR__, -8, 1) !== 'C') { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = (require __DIR__ . '/installed.php'); self::$installed = $required; } else { self::$installed = array(); } } if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } return $installed; } } array('name' => 'contao/contao-manager', 'pretty_version' => '1.10.3', 'version' => '1.10.3.0', 'reference' => '1e745bf77d95fcdffbbfc94ace7f1a8327be5890', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('brick/math' => array('pretty_version' => '0.12.3', 'version' => '0.12.3.0', 'reference' => '866551da34e9a618e64a819ee1e01c20d8a588ba', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), 'dev_requirement' => \false), 'composer/ca-bundle' => array('pretty_version' => '1.5.7', 'version' => '1.5.7.0', 'reference' => 'd665d22c417056996c59019579f1967dfe5c1e82', 'type' => 'library', 'install_path' => __DIR__ . '/./ca-bundle', 'aliases' => array(), 'dev_requirement' => \false), 'composer/class-map-generator' => array('pretty_version' => '1.6.1', 'version' => '1.6.1.0', 'reference' => '134b705ddb0025d397d8318a75825fe3c9d1da34', 'type' => 'library', 'install_path' => __DIR__ . '/./class-map-generator', 'aliases' => array(), 'dev_requirement' => \false), 'composer/composer' => array('pretty_version' => '2.8.6', 'version' => '2.8.6.0', 'reference' => '937c775a644bd7d2c3dfbb352747488463a6e673', 'type' => 'library', 'install_path' => __DIR__ . '/./composer', 'aliases' => array(), 'dev_requirement' => \false), 'composer/metadata-minifier' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'c549d23829536f0d0e984aaabbf02af91f443207', 'type' => 'library', 'install_path' => __DIR__ . '/./metadata-minifier', 'aliases' => array(), 'dev_requirement' => \false), 'composer/pcre' => array('pretty_version' => '3.3.2', 'version' => '3.3.2.0', 'reference' => 'b2bed4734f0cc156ee1fe9c0da2550420d99a21e', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.3', 'version' => '3.4.3.0', 'reference' => '4313d26ada5e0c4edfbd1dc481a92ff7bff91f12', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/spdx-licenses' => array('pretty_version' => '1.5.9', 'version' => '1.5.9.0', 'reference' => 'edf364cefe8c43501e21e88110aac10b284c3c9f', 'type' => 'library', 'install_path' => __DIR__ . '/./spdx-licenses', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.5', 'version' => '3.0.5.0', 'reference' => '6c1925561632e83d60a44492e0b344cf48ab85ef', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'contao/contao-manager' => array('pretty_version' => '1.10.3', 'version' => '1.10.3.0', 'reference' => '1e745bf77d95fcdffbbfc94ace7f1a8327be5890', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'crell/api-problem' => array('pretty_version' => '3.7.0', 'version' => '3.7.0.0', 'reference' => 'b41d66dc1d403b2d406699e2e05bb2b48efe3b7f', 'type' => 'library', 'install_path' => __DIR__ . '/../crell/api-problem', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/deprecations' => array('pretty_version' => '1.1.5', 'version' => '1.1.5.0', 'reference' => '459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/deprecations', 'aliases' => array(), 'dev_requirement' => \false), 'firebase/php-jwt' => array('pretty_version' => 'v6.11.1', 'version' => '6.11.1.0', 'reference' => 'd1e91ecf8c598d073d0995afa8cd5c75c6e19e66', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), 'dev_requirement' => \false), 'justinrainbow/json-schema' => array('pretty_version' => '5.3.0', 'version' => '5.3.0.0', 'reference' => 'feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8', 'type' => 'library', 'install_path' => __DIR__ . '/../justinrainbow/json-schema', 'aliases' => array(), 'dev_requirement' => \false), 'lcobucci/clock' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '039ef98c6b57b101d10bd11d8fdfda12cbd996dc', 'type' => 'library', 'install_path' => __DIR__ . '/../lcobucci/clock', 'aliases' => array(), 'dev_requirement' => \false), 'monolog/monolog' => array('pretty_version' => '3.9.0', 'version' => '3.9.0.0', 'reference' => '10d85740180ecba7896c87e06a166e0c95a0e3b6', 'type' => 'library', 'install_path' => __DIR__ . '/../monolog/monolog', 'aliases' => array(), 'dev_requirement' => \false), 'paragonie/constant_time_encoding' => array('pretty_version' => 'v3.0.0', 'version' => '3.0.0.0', 'reference' => 'df1e7fde177501eee2037dd159cf04f5f301a512', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-common' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-docblock' => array('pretty_version' => '5.6.2', 'version' => '5.6.2.0', 'reference' => '92dde6a5919e34835c506ac8c523ef095a95ed62', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/type-resolver' => array('pretty_version' => '1.10.0', 'version' => '1.10.0.0', 'reference' => '679e3ce485b99e84c775d28e2e96fade9a7fb50a', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '2.1.0', 'version' => '2.1.0.0', 'reference' => '9b30d6fd026b2c132b3985ce6b23bec09ab3aa68', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'psr/cache' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/cache', 'aliases' => array(), 'dev_requirement' => \false), 'psr/cache-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '2.0|3.0')), 'psr/clock' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/clock', 'aliases' => array(), 'dev_requirement' => \false), 'psr/clock-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/container' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => \false), 'psr/container-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.1|2.0')), 'psr/event-dispatcher' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/event-dispatcher', 'aliases' => array(), 'dev_requirement' => \false), 'psr/event-dispatcher-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-client' => array('pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-factory' => array('pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-message' => array('pretty_version' => '2.0', 'version' => '2.0.0.0', 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'dev_requirement' => \false), 'psr/log' => array('pretty_version' => '3.0.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'psr/log-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0|3.0', 1 => '3.0.0')), 'psr/simple-cache-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0|3.0')), 'ramsey/collection' => array('pretty_version' => '2.1.1', 'version' => '2.1.1.0', 'reference' => '344572933ad0181accbf4ba763e85a0306a8c5e2', 'type' => 'library', 'install_path' => __DIR__ . '/../ramsey/collection', 'aliases' => array(), 'dev_requirement' => \false), 'ramsey/uuid' => array('pretty_version' => '4.8.1', 'version' => '4.8.1.0', 'reference' => 'fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28', 'type' => 'library', 'install_path' => __DIR__ . '/../ramsey/uuid', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v3.2.0', 'version' => '3.2.0.0', 'reference' => '8a164643313c71354582dc850b42b33fa12a4b63', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'rhumsaa/uuid' => array('dev_requirement' => \false, 'replaced' => array(0 => '4.8.1')), 'sebastian/diff' => array('pretty_version' => '5.1.1', 'version' => '5.1.1.0', 'reference' => 'c41e007b4b62af48218231d6c2275e4c9b975b2e', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'seld/jsonlint' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '1748aaf847fc731cfad7725aec413ee46f0cc3a2', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/jsonlint', 'aliases' => array(), 'dev_requirement' => \false), 'seld/phar-utils' => array('pretty_version' => '1.2.1', 'version' => '1.2.1.0', 'reference' => 'ea2f4014f163c1be4c601b9b7bd6af81ba8d701c', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/phar-utils', 'aliases' => array(), 'dev_requirement' => \false), 'seld/signal-handler' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => '04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/signal-handler', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/cbor-php' => array('pretty_version' => '3.1.0', 'version' => '3.1.0.0', 'reference' => '499d9bff0a6d59c4f1b813cc617fc3fd56d6dca4', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/cbor-php', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/otphp' => array('pretty_version' => '11.3.0', 'version' => '11.3.0.0', 'reference' => '2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/otphp', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/pki-framework' => array('pretty_version' => '1.2.3', 'version' => '1.2.3.0', 'reference' => '5ff1dcc21e961b60149a80e77f744fc047800b31', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/pki-framework', 'aliases' => array(), 'dev_requirement' => \false), 'studio24/rotate' => array('pretty_version' => 'v1.0.1', 'version' => '1.0.1.0', 'reference' => '9d99d364bcf619bd9dd48f09ccf292f077c492e8', 'type' => 'library', 'install_path' => __DIR__ . '/../studio24/rotate', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/cache' => array('pretty_version' => 'v6.4.21', 'version' => '6.4.21.0', 'reference' => 'd1abcf763a7414f2e572f676f22da7a06c8cd9ee', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/cache-contracts' => array('pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', 'reference' => '5d68a57d66910405e5c0b63d6f0af941e66fc868', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/cache-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.1|2.0|3.0')), 'symfony/clock' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => 'b2bf55c4dd115003309eafa87ee7df9ed3dde81b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/clock', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/config' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => 'af5917a3b1571f54689e56677a3f06440d2fe4c7', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/config', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '7d29659bc3c9d8e9a34e2c3414ef9e9e003e6cf3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/dependency-injection' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '8cb11f833d1f5bfbb2df97dfc23c92b4d42c18d9', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/dependency-injection', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', 'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/error-handler' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => 'ce765a2d28b3cce61de1fb916e207767a73171d1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/error-handler', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/event-dispatcher' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/event-dispatcher-contracts' => array('pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', 'reference' => '59eb412e93815df44f05f342958efa9f46b1e586', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/event-dispatcher-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '2.0|3.0')), 'symfony/filesystem' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '4856c9cf585d5a0313d8d35afd681a526f038dd3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.4.17', 'version' => '6.4.17.0', 'reference' => '1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/framework-bundle' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => 'b1de19b2083484d0ce945977f6c6484e9e493a2e', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/framework-bundle', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/http-foundation' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '6b7c97fe1ddac8df3cc9ba6410c8abc683e148ae', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-foundation', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/http-kernel' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '15c105b839a7cfa1bc0989c091bfb6477f23b673', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-kernel', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/monolog-bridge' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '9d14621e59f22c2b6d030d92d37ffe5ae1e60452', 'type' => 'symfony-bridge', 'install_path' => __DIR__ . '/../symfony/monolog-bridge', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/monolog-bundle' => array('pretty_version' => 'v3.10.0', 'version' => '3.10.0.0', 'reference' => '414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/monolog-bundle', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/password-hasher' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => 'e97a1b31f60b8bdfc1fdedab4398538da9441d47', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/password-hasher', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-grapheme' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => 'b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-normalizer' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php73' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '0f68c03565dcaaf25a890667542e8bd75fe7e5bb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php80' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php81' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-php83' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '2fb86d65e2d424369ad2905e83b236a8805ba491', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php83', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-uuid' => array('pretty_version' => 'v1.32.0', 'version' => '1.32.0.0', 'reference' => '21533be36c24be3f4b1669c4725c7d1d2bab4ae2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-uuid', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.4.20', 'version' => '6.4.20.0', 'reference' => 'e2a61c16af36c9a07e5c9906498b73e091949a20', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/property-access' => array('pretty_version' => 'v6.4.18', 'version' => '6.4.18.0', 'reference' => '80e0378f2f058b60d87dedc3c760caec882e992c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-access', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/property-info' => array('pretty_version' => 'v6.4.18', 'version' => '6.4.18.0', 'reference' => '94d18e5cc11a37fd92856d38b61d9cdf72536a1e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-info', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/routing' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '1f5234e8457164a3a0038a4c0a4ba27876a9c670', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/routing', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/security-bundle' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '671ab5339a1e53923bfb8069bf984a47a412f612', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/security-bundle', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/security-core' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '110483f4e0106cf4bb63ed0479f6a5d09ab24a9e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/security-core', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/security-csrf' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => 'c34421b7d34efbaef5d611ab2e646a0ec464ffe3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/security-csrf', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/security-http' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => '786c8eeee44b07419264ede2a795e8f490113dc2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/security-http', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/serializer' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => 'b836df93e9ea07d1d3ada58a679ef205d54b64d1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/serializer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', 'reference' => 'f021b05a130d35510bd6b25fe9053c2a8a15d5d4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.1|2.0|3.0')), 'symfony/string' => array('pretty_version' => 'v6.4.21', 'version' => '6.4.21.0', 'reference' => '73e2c6966a5aef1d4892873ed5322245295370c6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/uid' => array('pretty_version' => 'v6.4.13', 'version' => '6.4.13.0', 'reference' => '18eb207f0436a993fffbdd811b5b8fa35fa5e007', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/uid', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/var-dumper' => array('pretty_version' => 'v6.4.21', 'version' => '6.4.21.0', 'reference' => '22560f80c0c5cd58cc0bcaf73455ffd81eb380d5', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-dumper', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/var-exporter' => array('pretty_version' => 'v6.4.22', 'version' => '6.4.22.0', 'reference' => 'f28cf841f5654955c9f88ceaf4b9dc29571988a9', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/yaml' => array('pretty_version' => 'v6.4.21', 'version' => '6.4.21.0', 'reference' => 'f01987f45676778b474468aa266fe2eda1f2bc7e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \false), 'terminal42/composer-lock-validator' => array('pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => '9f209e27d580900fbe5036fa47d8405fc8a91e89', 'type' => 'library', 'install_path' => __DIR__ . '/../terminal42/composer-lock-validator', 'aliases' => array(), 'dev_requirement' => \false), 'web-auth/cose-lib' => array('pretty_version' => '4.4.0', 'version' => '4.4.0.0', 'reference' => '2166016e48e0214f4f63320a7758a9386d14c92a', 'type' => 'library', 'install_path' => __DIR__ . '/../web-auth/cose-lib', 'aliases' => array(), 'dev_requirement' => \false), 'web-auth/webauthn-lib' => array('pretty_version' => '4.9.2', 'version' => '4.9.2.0', 'reference' => '008b25171c27cf4813420d0de31cc059bcc71f1a', 'type' => 'library', 'install_path' => __DIR__ . '/../web-auth/webauthn-lib', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); Copyright (C) 2021 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. composer/pcre ============= PCRE wrapping library that offers type-safe `preg_*` replacements. This library gives you a way to ensure `preg_*` functions do not fail silently, returning unexpected `null`s that may not be handled. As of 3.0 this library enforces [`PREG_UNMATCHED_AS_NULL`](#preg_unmatched_as_null) usage for all matching and replaceCallback functions, [read more below](#preg_unmatched_as_null) to understand the implications. It thus makes it easier to work with static analysis tools like PHPStan or Psalm as it simplifies and reduces the possible return values from all the `preg_*` functions which are quite packed with edge cases. As of v2.2.0 / v3.2.0 the library also comes with a [PHPStan extension](#phpstan-extension) for parsing regular expressions and giving you even better output types. This library is a thin wrapper around `preg_*` functions with [some limitations](#restrictions--limitations). If you are looking for a richer API to handle regular expressions have a look at [rawr/t-regx](https://packagist.org/packages/rawr/t-regx) instead. [![Continuous Integration](https://github.com/composer/pcre/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/pcre/actions) Installation ------------ Install the latest version with: ```bash $ composer require composer/pcre ``` Requirements ------------ * PHP 7.4.0 is required for 3.x versions * PHP 7.2.0 is required for 2.x versions * PHP 5.3.2 is required for 1.x versions Basic usage ----------- Instead of: ```php if (preg_match('{fo+}', $string, $matches)) { ... } if (preg_match('{fo+}', $string, $matches, PREG_OFFSET_CAPTURE)) { ... } if (preg_match_all('{fo+}', $string, $matches)) { ... } $newString = preg_replace('{fo+}', 'bar', $string); $newString = preg_replace_callback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string); $newString = preg_replace_callback_array(['{fo+}' => fn ($match) => strtoupper($match[0])], $string); $filtered = preg_grep('{[a-z]}', $elements); $array = preg_split('{[a-z]+}', $string); ``` You can now call these on the `Preg` class: ```php use Composer\Pcre\Preg; if (Preg::match('{fo+}', $string, $matches)) { ... } if (Preg::matchWithOffsets('{fo+}', $string, $matches)) { ... } if (Preg::matchAll('{fo+}', $string, $matches)) { ... } $newString = Preg::replace('{fo+}', 'bar', $string); $newString = Preg::replaceCallback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string); $newString = Preg::replaceCallbackArray(['{fo+}' => fn ($match) => strtoupper($match[0])], $string); $filtered = Preg::grep('{[a-z]}', $elements); $array = Preg::split('{[a-z]+}', $string); ``` The main difference is if anything fails to match/replace/.., it will throw a `Composer\Pcre\PcreException` instead of returning `null` (or false in some cases), so you can now use the return values safely relying on the fact that they can only be strings (for replace), ints (for match) or arrays (for grep/split). Additionally the `Preg` class provides match methods that return `bool` rather than `int`, for stricter type safety when the number of pattern matches is not useful: ```php use Composer\Pcre\Preg; if (Preg::isMatch('{fo+}', $string, $matches)) // bool if (Preg::isMatchAll('{fo+}', $string, $matches)) // bool ``` Finally the `Preg` class provides a few `*StrictGroups` method variants that ensure match groups are always present and thus non-nullable, making it easier to write type-safe code: ```php use Composer\Pcre\Preg; // $matches is guaranteed to be an array of strings, if a subpattern does not match and produces a null it will throw if (Preg::matchStrictGroups('{fo+}', $string, $matches)) if (Preg::matchAllStrictGroups('{fo+}', $string, $matches)) ``` **Note:** This is generally safe to use as long as you do not have optional subpatterns (i.e. `(something)?` or `(something)*` or branches with a `|` that result in some groups not being matched at all). A subpattern that can match an empty string like `(.*)` is **not** optional, it will be present as an empty string in the matches. A non-matching subpattern, even if optional like `(?:foo)?` will anyway not be present in matches so it is also not a problem to use these with `*StrictGroups` methods. If you would prefer a slightly more verbose usage, replacing by-ref arguments by result objects, you can use the `Regex` class: ```php use Composer\Pcre\Regex; // this is useful when you are just interested in knowing if something matched // as it returns a bool instead of int(1/0) for match $bool = Regex::isMatch('{fo+}', $string); $result = Regex::match('{fo+}', $string); if ($result->matched) { something($result->matches); } $result = Regex::matchWithOffsets('{fo+}', $string); if ($result->matched) { something($result->matches); } $result = Regex::matchAll('{fo+}', $string); if ($result->matched && $result->count > 3) { something($result->matches); } $newString = Regex::replace('{fo+}', 'bar', $string)->result; $newString = Regex::replaceCallback('{fo+}', function ($match) { return strtoupper($match[0]); }, $string)->result; $newString = Regex::replaceCallbackArray(['{fo+}' => fn ($match) => strtoupper($match[0])], $string)->result; ``` Note that `preg_grep` and `preg_split` are only callable via the `Preg` class as they do not have complex return types warranting a specific result object. See the [MatchResult](src/MatchResult.php), [MatchWithOffsetsResult](src/MatchWithOffsetsResult.php), [MatchAllResult](src/MatchAllResult.php), [MatchAllWithOffsetsResult](src/MatchAllWithOffsetsResult.php), and [ReplaceResult](src/ReplaceResult.php) class sources for more details. Restrictions / Limitations -------------------------- Due to type safety requirements a few restrictions are in place. - matching using `PREG_OFFSET_CAPTURE` is made available via `matchWithOffsets` and `matchAllWithOffsets`. You cannot pass the flag to `match`/`matchAll`. - `Preg::split` will also reject `PREG_SPLIT_OFFSET_CAPTURE` and you should use `splitWithOffsets` instead. - `matchAll` rejects `PREG_SET_ORDER` as it also changes the shape of the returned matches. There is no alternative provided as you can fairly easily code around it. - `preg_filter` is not supported as it has a rather crazy API, most likely you should rather use `Preg::grep` in combination with some loop and `Preg::replace`. - `replace`, `replaceCallback` and `replaceCallbackArray` do not support an array `$subject`, only simple strings. - As of 2.0, the library always uses `PREG_UNMATCHED_AS_NULL` for matching, which offers [much saner/more predictable results](#preg_unmatched_as_null). As of 3.0 the flag is also set for `replaceCallback` and `replaceCallbackArray`. #### PREG_UNMATCHED_AS_NULL As of 2.0, this library always uses PREG_UNMATCHED_AS_NULL for all `match*` and `isMatch*` functions. As of 3.0 it is also done for `replaceCallback` and `replaceCallbackArray`. This means your matches will always contain all matching groups, either as null if unmatched or as string if it matched. The advantages in clarity and predictability are clearer if you compare the two outputs of running this with and without PREG_UNMATCHED_AS_NULL in $flags: ```php preg_match('/(a)(b)*(c)(d)*/', 'ac', $matches, $flags); ``` | no flag | PREG_UNMATCHED_AS_NULL | | --- | --- | | array (size=4) | array (size=5) | | 0 => string 'ac' (length=2) | 0 => string 'ac' (length=2) | | 1 => string 'a' (length=1) | 1 => string 'a' (length=1) | | 2 => string '' (length=0) | 2 => null | | 3 => string 'c' (length=1) | 3 => string 'c' (length=1) | | | 4 => null | | group 2 (any unmatched group preceding one that matched) is set to `''`. You cannot tell if it matched an empty string or did not match at all | group 2 is `null` when unmatched and a string if it matched, easy to check for | | group 4 (any optional group without a matching one following) is missing altogether. So you have to check with `isset()`, but really you want `isset($m[4]) && $m[4] !== ''` for safety unless you are very careful to check that a non-optional group follows it | group 4 is always set, and null in this case as there was no match, easy to check for with `$m[4] !== null` | PHPStan Extension ----------------- To use the PHPStan extension if you do not use `phpstan/extension-installer` you can include `vendor/composer/pcre/extension.neon` in your PHPStan config. The extension provides much better type information for $matches as well as regex validation where possible. License ------- composer/pcre is licensed under the MIT License, see the LICENSE file for details. # composer/pcre PHPStan extensions # # These can be reused by third party packages by including 'vendor/composer/pcre/extension.neon' # in your phpstan config services: - class: Composer\Pcre\PHPStan\PregMatchParameterOutTypeExtension tags: - phpstan.staticMethodParameterOutTypeExtension - class: Composer\Pcre\PHPStan\PregMatchTypeSpecifyingExtension tags: - phpstan.typeSpecifier.staticMethodTypeSpecifyingExtension - class: Composer\Pcre\PHPStan\PregReplaceCallbackClosureTypeExtension tags: - phpstan.staticMethodParameterClosureTypeExtension rules: - Composer\Pcre\PHPStan\UnsafeStrictGroupsCallRule - Composer\Pcre\PHPStan\InvalidRegexPatternRule { "name": "composer\/pcre", "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "type": "library", "license": "MIT", "keywords": [ "pcre", "regex", "preg", "regular expression" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http:\/\/seld.be" } ], "require": { "php": "^7.4 || ^8.0" }, "require-dev": { "phpunit\/phpunit": "^8 || ^9", "phpstan\/phpstan": "^1.12 || ^2", "phpstan\/phpstan-strict-rules": "^1 || ^2" }, "conflict": { "phpstan\/phpstan": "<1.11.10" }, "autoload": { "psr-4": { "Composer\\Pcre\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\Pcre\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "3.x-dev" }, "phpstan": { "includes": [ "extension.neon" ] } }, "scripts": { "test": "@php vendor\/bin\/phpunit", "phpstan": "@php phpstan analyse" } }regexShapeMatcher = $regexShapeMatcher; } public function setTypeSpecifier(TypeSpecifier $typeSpecifier) : void { $this->typeSpecifier = $typeSpecifier; } public function getClass() : string { return Preg::class; } public function isStaticMethodSupported(MethodReflection $methodReflection, StaticCall $node, TypeSpecifierContext $context) : bool { return \in_array($methodReflection->getName(), ['match', 'isMatch', 'matchStrictGroups', 'isMatchStrictGroups', 'matchAll', 'isMatchAll', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true) && !$context->null(); } public function specifyTypes(MethodReflection $methodReflection, StaticCall $node, Scope $scope, TypeSpecifierContext $context) : SpecifiedTypes { $args = $node->getArgs(); $patternArg = $args[0] ?? null; $matchesArg = $args[2] ?? null; $flagsArg = $args[3] ?? null; if ($patternArg === null || $matchesArg === null) { return new SpecifiedTypes(); } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); if ($flagsType === null) { return new SpecifiedTypes(); } if (\stripos($methodReflection->getName(), 'matchAll') !== \false) { $matchedType = $this->regexShapeMatcher->matchAllExpr($patternArg->value, $flagsType, TrinaryLogic::createFromBoolean($context->true()), $scope); } else { $matchedType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createFromBoolean($context->true()), $scope); } if ($matchedType === null) { return new SpecifiedTypes(); } if (\in_array($methodReflection->getName(), ['matchStrictGroups', 'isMatchStrictGroups', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true)) { $matchedType = \Composer\Pcre\PHPStan\PregMatchFlags::removeNullFromMatches($matchedType); } $overwrite = \false; if ($context->false()) { $overwrite = \true; $context = $context->negate(); } // @phpstan-ignore function.alreadyNarrowedType if (\method_exists('_ContaoManager\\PHPStan\\Analyser\\SpecifiedTypes', 'setRootExpr')) { $typeSpecifier = $this->typeSpecifier->create($matchesArg->value, $matchedType, $context, $scope)->setRootExpr($node); return $overwrite ? $typeSpecifier->setAlwaysOverwriteTypes() : $typeSpecifier; } // @phpstan-ignore arguments.count return $this->typeSpecifier->create( $matchesArg->value, $matchedType, $context, // @phpstan-ignore argument.type $overwrite, $scope, $node ); } } regexShapeMatcher = $regexShapeMatcher; } public function isStaticMethodSupported(MethodReflection $methodReflection, ParameterReflection $parameter) : bool { return \in_array($methodReflection->getDeclaringClass()->getName(), [Preg::class, Regex::class], \true) && \in_array($methodReflection->getName(), ['replaceCallback', 'replaceCallbackStrictGroups'], \true) && $parameter->getName() === 'replacement'; } public function getTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, ParameterReflection $parameter, Scope $scope) : ?Type { $args = $methodCall->getArgs(); $patternArg = $args[0] ?? null; $flagsArg = $args[5] ?? null; if ($patternArg === null) { return null; } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); $matchesType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createYes(), $scope); if ($matchesType === null) { return null; } if ($methodReflection->getName() === 'replaceCallbackStrictGroups' && \count($matchesType->getConstantArrays()) === 1) { $matchesType = $matchesType->getConstantArrays()[0]; $matchesType = new ConstantArrayType($matchesType->getKeyTypes(), \array_map(static function (Type $valueType) : Type { if (\count($valueType->getConstantArrays()) === 1) { $valueTypeArray = $valueType->getConstantArrays()[0]; return new ConstantArrayType($valueTypeArray->getKeyTypes(), \array_map(static function (Type $valueType) : Type { return TypeCombinator::removeNull($valueType); }, $valueTypeArray->getValueTypes()), $valueTypeArray->getNextAutoIndexes(), [], $valueTypeArray->isList()); } return TypeCombinator::removeNull($valueType); }, $matchesType->getValueTypes()), $matchesType->getNextAutoIndexes(), [], $matchesType->isList()); } return new ClosureType([new NativeParameterReflection($parameter->getName(), $parameter->isOptional(), $matchesType, $parameter->passedByReference(), $parameter->isVariadic(), $parameter->getDefaultValue())], new StringType()); } } regexShapeMatcher = $regexShapeMatcher; } public function isStaticMethodSupported(MethodReflection $methodReflection, ParameterReflection $parameter) : bool { return $methodReflection->getDeclaringClass()->getName() === Preg::class && \in_array($methodReflection->getName(), ['match', 'isMatch', 'matchStrictGroups', 'isMatchStrictGroups', 'matchAll', 'isMatchAll', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true) && $parameter->getName() === 'matches'; } public function getParameterOutTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, ParameterReflection $parameter, Scope $scope) : ?Type { $args = $methodCall->getArgs(); $patternArg = $args[0] ?? null; $matchesArg = $args[2] ?? null; $flagsArg = $args[3] ?? null; if ($patternArg === null || $matchesArg === null) { return null; } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); if ($flagsType === null) { return null; } if (\stripos($methodReflection->getName(), 'matchAll') !== \false) { return $this->regexShapeMatcher->matchAllExpr($patternArg->value, $flagsType, TrinaryLogic::createMaybe(), $scope); } return $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createMaybe(), $scope); } } */ class InvalidRegexPatternRule implements Rule { public function getNodeType() : string { return StaticCall::class; } public function processNode(Node $node, Scope $scope) : array { $patterns = $this->extractPatterns($node, $scope); $errors = []; foreach ($patterns as $pattern) { $errorMessage = $this->validatePattern($pattern); if ($errorMessage === null) { continue; } $errors[] = RuleErrorBuilder::message(sprintf('Regex pattern is invalid: %s', $errorMessage))->identifier('regexp.pattern')->build(); } return $errors; } /** * @return string[] */ private function extractPatterns(StaticCall $node, Scope $scope) : array { if (!$node->class instanceof FullyQualified) { return []; } $isRegex = $node->class->toString() === Regex::class; $isPreg = $node->class->toString() === Preg::class; if (!$isRegex && !$isPreg) { return []; } if (!$node->name instanceof Node\Identifier || !Preg::isMatch('{^(match|isMatch|grep|replace|split)}', $node->name->name)) { return []; } $functionName = $node->name->name; if (!isset($node->getArgs()[0])) { return []; } $patternNode = $node->getArgs()[0]->value; $patternType = $scope->getType($patternNode); $patternStrings = []; foreach ($patternType->getConstantStrings() as $constantStringType) { if ($functionName === 'replaceCallbackArray') { continue; } $patternStrings[] = $constantStringType->getValue(); } foreach ($patternType->getConstantArrays() as $constantArrayType) { if (in_array($functionName, ['replace', 'replaceCallback'], \true)) { foreach ($constantArrayType->getValueTypes() as $arrayKeyType) { foreach ($arrayKeyType->getConstantStrings() as $constantString) { $patternStrings[] = $constantString->getValue(); } } } if ($functionName !== 'replaceCallbackArray') { continue; } foreach ($constantArrayType->getKeyTypes() as $arrayKeyType) { foreach ($arrayKeyType->getConstantStrings() as $constantString) { $patternStrings[] = $constantString->getValue(); } } } return $patternStrings; } private function validatePattern(string $pattern) : ?string { try { $msg = null; $prev = \set_error_handler(function (int $severity, string $message, string $file) use(&$msg) : bool { $msg = \preg_replace("#^preg_match(_all)?\\(.*?\\): #", '', $message); return \true; }); if ($pattern === '') { return 'Empty string is not a valid regular expression'; } Preg::match($pattern, ''); if ($msg !== null) { return $msg; } } catch (PcreException $e) { if ($e->getCode() === \PREG_INTERNAL_ERROR && $msg !== null) { return $msg; } return \preg_replace('{.*? failed executing ".*": }', '', $e->getMessage()); } finally { \restore_error_handler(); } return null; } } getType($flagsArg->value); $constantScalars = $flagsType->getConstantScalarValues(); if ($constantScalars === []) { return null; } $internalFlagsTypes = []; foreach ($flagsType->getConstantScalarValues() as $constantScalarValue) { if (!\is_int($constantScalarValue)) { return null; } $internalFlagsTypes[] = new ConstantIntegerType($constantScalarValue | \PREG_UNMATCHED_AS_NULL); } return TypeCombinator::union(...$internalFlagsTypes); } public static function removeNullFromMatches(Type $matchesType) : Type { return TypeTraverser::map($matchesType, static function (Type $type, callable $traverse) : Type { if ($type instanceof UnionType || $type instanceof IntersectionType) { return $traverse($type); } if ($type instanceof ConstantArrayType) { return new ConstantArrayType($type->getKeyTypes(), \array_map(static function (Type $valueType) use($traverse) : Type { return $traverse($valueType); }, $type->getValueTypes()), $type->getNextAutoIndexes(), [], $type->isList()); } if ($type instanceof ArrayType) { return new ArrayType($type->getKeyType(), $traverse($type->getItemType())); } return TypeCombinator::removeNull($type); }); } } */ final class UnsafeStrictGroupsCallRule implements Rule { /** * @var RegexArrayShapeMatcher */ private $regexShapeMatcher; public function __construct(RegexArrayShapeMatcher $regexShapeMatcher) { $this->regexShapeMatcher = $regexShapeMatcher; } public function getNodeType() : string { return StaticCall::class; } public function processNode(Node $node, Scope $scope) : array { if (!$node->class instanceof FullyQualified) { return []; } $isRegex = $node->class->toString() === Regex::class; $isPreg = $node->class->toString() === Preg::class; if (!$isRegex && !$isPreg) { return []; } if (!$node->name instanceof Node\Identifier || !\in_array($node->name->name, ['matchStrictGroups', 'isMatchStrictGroups', 'matchAllStrictGroups', 'isMatchAllStrictGroups'], \true)) { return []; } $args = $node->getArgs(); if (!isset($args[0])) { return []; } $patternArg = $args[0] ?? null; if ($isPreg) { if (!isset($args[2])) { // no matches set, skip as the matches won't be used anyway return []; } $flagsArg = $args[3] ?? null; } else { $flagsArg = $args[2] ?? null; } if ($patternArg === null) { return []; } $flagsType = \Composer\Pcre\PHPStan\PregMatchFlags::getType($flagsArg, $scope); if ($flagsType === null) { return []; } $matchedType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createYes(), $scope); if ($matchedType === null) { return [RuleErrorBuilder::message(sprintf('The %s call is potentially unsafe as $matches\' type could not be inferred.', $node->name->name))->identifier('composerPcre.maybeUnsafeStrictGroups')->build()]; } if (\count($matchedType->getConstantArrays()) === 1) { $matchedType = $matchedType->getConstantArrays()[0]; $nullableGroups = []; foreach ($matchedType->getValueTypes() as $index => $type) { if (TypeCombinator::containsNull($type)) { $nullableGroups[] = $matchedType->getKeyTypes()[$index]->getValue(); } } if (\count($nullableGroups) > 0) { return [RuleErrorBuilder::message(sprintf('The %s call is unsafe as match group%s "%s" %s optional and may be null.', $node->name->name, \count($nullableGroups) > 1 ? 's' : '', \implode('", "', $nullableGroups), \count($nullableGroups) > 1 ? 'are' : 'is'))->identifier('composerPcre.unsafeStrictGroups')->build()]; } } return []; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class MatchResult { /** * An array of match group => string matched * * @readonly * @var array */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; class Regex { /** * @param non-empty-string $pattern */ public static function isMatch(string $pattern, string $subject, int $offset = 0) : bool { return (bool) \Composer\Pcre\Preg::match($pattern, $subject, $matches, 0, $offset); } /** * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported */ public static function match(string $pattern, string $subject, int $flags = 0, int $offset = 0) : \Composer\Pcre\MatchResult { self::checkOffsetCapture($flags, 'matchWithOffsets'); $count = \Composer\Pcre\Preg::match($pattern, $subject, $matches, $flags, $offset); return new \Composer\Pcre\MatchResult($count, $matches); } /** * Variant of `match()` which returns non-null matches (or throws) * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException */ public static function matchStrictGroups(string $pattern, string $subject, int $flags = 0, int $offset = 0) : \Composer\Pcre\MatchStrictGroupsResult { // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups $count = \Composer\Pcre\Preg::matchStrictGroups($pattern, $subject, $matches, $flags, $offset); return new \Composer\Pcre\MatchStrictGroupsResult($count, $matches); } /** * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported */ public static function matchWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0) : \Composer\Pcre\MatchWithOffsetsResult { $count = \Composer\Pcre\Preg::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); return new \Composer\Pcre\MatchWithOffsetsResult($count, $matches); } /** * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported */ public static function matchAll(string $pattern, string $subject, int $flags = 0, int $offset = 0) : \Composer\Pcre\MatchAllResult { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $count = \Composer\Pcre\Preg::matchAll($pattern, $subject, $matches, $flags, $offset); return new \Composer\Pcre\MatchAllResult($count, $matches); } /** * Variant of `matchAll()` which returns non-null matches (or throws) * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException */ public static function matchAllStrictGroups(string $pattern, string $subject, int $flags = 0, int $offset = 0) : \Composer\Pcre\MatchAllStrictGroupsResult { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); // @phpstan-ignore composerPcre.maybeUnsafeStrictGroups $count = \Composer\Pcre\Preg::matchAllStrictGroups($pattern, $subject, $matches, $flags, $offset); return new \Composer\Pcre\MatchAllStrictGroupsResult($count, $matches); } /** * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported */ public static function matchAllWithOffsets(string $pattern, string $subject, int $flags = 0, int $offset = 0) : \Composer\Pcre\MatchAllWithOffsetsResult { self::checkSetOrder($flags); $count = \Composer\Pcre\Preg::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); return new \Composer\Pcre\MatchAllWithOffsetsResult($count, $matches); } /** * @param string|string[] $pattern * @param string|string[] $replacement * @param string $subject */ public static function replace($pattern, $replacement, $subject, int $limit = -1) : \Composer\Pcre\ReplaceResult { $result = \Composer\Pcre\Preg::replace($pattern, $replacement, $subject, $limit, $count); return new \Composer\Pcre\ReplaceResult($count, $result); } /** * @param string|string[] $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0) : \Composer\Pcre\ReplaceResult { $result = \Composer\Pcre\Preg::replaceCallback($pattern, $replacement, $subject, $limit, $count, $flags); return new \Composer\Pcre\ReplaceResult($count, $result); } /** * Variant of `replaceCallback()` which outputs non-null matches (or throws) * * @param string $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallbackStrictGroups($pattern, callable $replacement, $subject, int $limit = -1, int $flags = 0) : \Composer\Pcre\ReplaceResult { $result = \Composer\Pcre\Preg::replaceCallbackStrictGroups($pattern, $replacement, $subject, $limit, $count, $flags); return new \Composer\Pcre\ReplaceResult($count, $result); } /** * @param ($flags is PREG_OFFSET_CAPTURE ? (array}>): string>) : array): string>) $pattern * @param string $subject * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set */ public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, int $flags = 0) : \Composer\Pcre\ReplaceResult { $result = \Composer\Pcre\Preg::replaceCallbackArray($pattern, $subject, $limit, $count, $flags); return new \Composer\Pcre\ReplaceResult($count, $result); } private static function checkOffsetCapture(int $flags, string $useFunctionName) : void { if (($flags & \PREG_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the return type, use ' . $useFunctionName . '() instead'); } } private static function checkSetOrder(int $flags) : void { if (($flags & \PREG_SET_ORDER) !== 0) { throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the return type'); } } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class MatchAllWithOffsetsResult { /** * An array of match group => list of matches, every match being a pair of string matched + offset in bytes (or -1 if no match) * * @readonly * @var array> * @phpstan-var array}>> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches * @phpstan-param array}>> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class MatchWithOffsetsResult { /** * An array of match group => pair of string matched + offset in bytes (or -1 if no match) * * @readonly * @var array * @phpstan-var array}> */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches * @phpstan-param array}> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class MatchAllStrictGroupsResult { /** * An array of match group => list of matched strings * * @readonly * @var array> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; class UnexpectedNullMatchException extends \Composer\Pcre\PcreException { public static function fromFunction($function, $pattern) { throw new \LogicException('fromFunction should not be called on ' . self::class . ', use ' . \Composer\Pcre\PcreException::class); } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class MatchStrictGroupsResult { /** * An array of match group => string matched * * @readonly * @var array */ public $matches; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class MatchAllResult { /** * An array of match group => list of matched strings * * @readonly * @var array> */ public $matches; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count * @param array> $matches */ public function __construct(int $count, array $matches) { $this->matches = $matches; $this->matched = (bool) $count; $this->count = $count; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; final class ReplaceResult { /** * @readonly * @var string */ public $result; /** * @readonly * @var 0|positive-int */ public $count; /** * @readonly * @var bool */ public $matched; /** * @param 0|positive-int $count */ public function __construct(int $count, string $result) { $this->count = $count; $this->matched = (bool) $count; $this->result = $result; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; class Preg { /** @internal */ public const ARRAY_MSG = '$subject as an array is not supported. You can use \'foreach\' instead.'; /** @internal */ public const INVALID_TYPE_MSG = '$subject must be a string, %s given.'; /** * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|1 * * @param-out array $matches */ public static function match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { self::checkOffsetCapture($flags, 'matchWithOffsets'); $result = \preg_match($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset); if ($result === \false) { throw \Composer\Pcre\PcreException::fromFunction('preg_match', $pattern); } return $result; } /** * Variant of `match()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|1 * @throws UnexpectedNullMatchException * * @param-out array $matches */ public static function matchStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { $result = self::match($pattern, $subject, $matchesInternal, $flags, $offset); $matches = self::enforceNonNullMatches($pattern, $matchesInternal, 'match'); return $result; } /** * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_OFFSET_CAPTURE are always set, no other flags are supported * @return 0|1 * * @param-out array}> $matches */ public static function matchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { $result = \preg_match($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL | \PREG_OFFSET_CAPTURE, $offset); if ($result === \false) { throw \Composer\Pcre\PcreException::fromFunction('preg_match', $pattern); } return $result; } /** * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|positive-int * * @param-out array> $matches */ public static function matchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { self::checkOffsetCapture($flags, 'matchAllWithOffsets'); self::checkSetOrder($flags); $result = \preg_match_all($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset); if (!\is_int($result)) { // PHP < 8 may return null, 8+ returns int|false throw \Composer\Pcre\PcreException::fromFunction('preg_match_all', $pattern); } return $result; } /** * Variant of `match()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @return 0|positive-int * @throws UnexpectedNullMatchException * * @param-out array> $matches */ public static function matchAllStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int { $result = self::matchAll($pattern, $subject, $matchesInternal, $flags, $offset); $matches = self::enforceNonNullMatchAll($pattern, $matchesInternal, 'matchAll'); return $result; } /** * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported * @return 0|positive-int * * @param-out array}>> $matches */ public static function matchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { self::checkSetOrder($flags); $result = \preg_match_all($pattern, $subject, $matches, $flags | \PREG_UNMATCHED_AS_NULL | \PREG_OFFSET_CAPTURE, $offset); if (!\is_int($result)) { // PHP < 8 may return null, 8+ returns int|false throw \Composer\Pcre\PcreException::fromFunction('preg_match_all', $pattern); } return $result; } /** * @param string|string[] $pattern * @param string|string[] $replacement * @param string $subject * @param int $count Set by method * * @param-out int<0, max> $count */ public static function replace($pattern, $replacement, $subject, int $limit = -1, ?int &$count = null) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace($pattern, $replacement, $subject, $limit, $count); if ($result === null) { throw \Composer\Pcre\PcreException::fromFunction('preg_replace', $pattern); } return $result; } /** * @param string|string[] $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallback($pattern, callable $replacement, $subject, int $limit = -1, ?int &$count = null, int $flags = 0) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace_callback($pattern, $replacement, $subject, $limit, $count, $flags | \PREG_UNMATCHED_AS_NULL); if ($result === null) { throw \Composer\Pcre\PcreException::fromFunction('preg_replace_callback', $pattern); } return $result; } /** * Variant of `replaceCallback()` which outputs non-null matches (or throws) * * @param string $pattern * @param ($flags is PREG_OFFSET_CAPTURE ? (callable(array}>): string) : callable(array): string) $replacement * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallbackStrictGroups(string $pattern, callable $replacement, $subject, int $limit = -1, ?int &$count = null, int $flags = 0) : string { return self::replaceCallback($pattern, function (array $matches) use($pattern, $replacement) { return $replacement(self::enforceNonNullMatches($pattern, $matches, 'replaceCallback')); }, $subject, $limit, $count, $flags); } /** * @param ($flags is PREG_OFFSET_CAPTURE ? (array}>): string>) : array): string>) $pattern * @param string $subject * @param int $count Set by method * @param int-mask $flags PREG_OFFSET_CAPTURE is supported, PREG_UNMATCHED_AS_NULL is always set * * @param-out int<0, max> $count */ public static function replaceCallbackArray(array $pattern, $subject, int $limit = -1, ?int &$count = null, int $flags = 0) : string { if (!\is_scalar($subject)) { if (\is_array($subject)) { throw new \InvalidArgumentException(static::ARRAY_MSG); } throw new \TypeError(\sprintf(static::INVALID_TYPE_MSG, \gettype($subject))); } $result = \preg_replace_callback_array($pattern, $subject, $limit, $count, $flags | \PREG_UNMATCHED_AS_NULL); if ($result === null) { $pattern = \array_keys($pattern); throw \Composer\Pcre\PcreException::fromFunction('preg_replace_callback_array', $pattern); } return $result; } /** * @param int-mask $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE * @return list */ public static function split(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { if (($flags & \PREG_SPLIT_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_SPLIT_OFFSET_CAPTURE is not supported as it changes the type of $matches, use splitWithOffsets() instead'); } $result = \preg_split($pattern, $subject, $limit, $flags); if ($result === \false) { throw \Composer\Pcre\PcreException::fromFunction('preg_split', $pattern); } return $result; } /** * @param int-mask $flags PREG_SPLIT_NO_EMPTY or PREG_SPLIT_DELIM_CAPTURE, PREG_SPLIT_OFFSET_CAPTURE is always set * @return list * @phpstan-return list}> */ public static function splitWithOffsets(string $pattern, string $subject, int $limit = -1, int $flags = 0) : array { $result = \preg_split($pattern, $subject, $limit, $flags | \PREG_SPLIT_OFFSET_CAPTURE); if ($result === \false) { throw \Composer\Pcre\PcreException::fromFunction('preg_split', $pattern); } return $result; } /** * @template T of string|\Stringable * @param string $pattern * @param array $array * @param int-mask $flags PREG_GREP_INVERT * @return array */ public static function grep(string $pattern, array $array, int $flags = 0) : array { $result = \preg_grep($pattern, $array, $flags); if ($result === \false) { throw \Composer\Pcre\PcreException::fromFunction('preg_grep', $pattern); } return $result; } /** * Variant of match() which returns a bool instead of int * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array $matches */ public static function isMatch(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) static::match($pattern, $subject, $matches, $flags, $offset); } /** * Variant of `isMatch()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * @throws UnexpectedNullMatchException * * @param-out array $matches */ public static function isMatchStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) self::matchStrictGroups($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchAll() which returns a bool instead of int * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array> $matches */ public static function isMatchAll(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchAll($pattern, $subject, $matches, $flags, $offset); } /** * Variant of `isMatchAll()` which outputs non-null matches (or throws) * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array> $matches */ public static function isMatchAllStrictGroups(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : bool { return (bool) self::matchAllStrictGroups($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchWithOffsets() which returns a bool instead of int * * Runs preg_match with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array}> $matches */ public static function isMatchWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchWithOffsets($pattern, $subject, $matches, $flags, $offset); } /** * Variant of matchAllWithOffsets() which returns a bool instead of int * * Runs preg_match_all with PREG_OFFSET_CAPTURE * * @param non-empty-string $pattern * @param array $matches Set by method * @param int-mask $flags PREG_UNMATCHED_AS_NULL is always set, no other flags are supported * * @param-out array}>> $matches */ public static function isMatchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : bool { return (bool) static::matchAllWithOffsets($pattern, $subject, $matches, $flags, $offset); } private static function checkOffsetCapture(int $flags, string $useFunctionName) : void { if (($flags & \PREG_OFFSET_CAPTURE) !== 0) { throw new \InvalidArgumentException('PREG_OFFSET_CAPTURE is not supported as it changes the type of $matches, use ' . $useFunctionName . '() instead'); } } private static function checkSetOrder(int $flags) : void { if (($flags & \PREG_SET_ORDER) !== 0) { throw new \InvalidArgumentException('PREG_SET_ORDER is not supported as it changes the type of $matches'); } } /** * @param array $matches * @return array * @throws UnexpectedNullMatchException */ private static function enforceNonNullMatches(string $pattern, array $matches, string $variantMethod) { foreach ($matches as $group => $match) { if (\is_string($match) || \is_array($match) && \is_string($match[0])) { continue; } throw new \Composer\Pcre\UnexpectedNullMatchException('Pattern "' . $pattern . '" had an unexpected unmatched group "' . $group . '", make sure the pattern always matches or use ' . $variantMethod . '() instead.'); } /** @var array */ return $matches; } /** * @param array> $matches * @return array> * @throws UnexpectedNullMatchException */ private static function enforceNonNullMatchAll(string $pattern, array $matches, string $variantMethod) { foreach ($matches as $group => $groupMatches) { foreach ($groupMatches as $match) { if (null === $match) { throw new \Composer\Pcre\UnexpectedNullMatchException('Pattern "' . $pattern . '" had an unexpected unmatched group "' . $group . '", make sure the pattern always matches or use ' . $variantMethod . '() instead.'); } } } /** @var array> */ return $matches; } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Pcre; class PcreException extends \RuntimeException { /** * @param string $function * @param string|string[] $pattern * @return self */ public static function fromFunction($function, $pattern) { $code = \preg_last_error(); if (\is_array($pattern)) { $pattern = \implode(', ', $pattern); } return new \Composer\Pcre\PcreException($function . '(): failed executing "' . $pattern . '": ' . self::pcreLastErrorMessage($code), $code); } /** * @param int $code * @return string */ private static function pcreLastErrorMessage($code) { if (\function_exists('preg_last_error_msg')) { return \preg_last_error_msg(); } $constants = \get_defined_constants(\true); if (!isset($constants['pcre']) || !\is_array($constants['pcre'])) { return 'UNDEFINED_ERROR'; } foreach ($constants['pcre'] as $const => $val) { if ($val === $code && \substr($const, -6) === '_ERROR') { return $const; } } return 'UNDEFINED_ERROR'; } } Copyright (C) 2021 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. composer/metadata-minifier ========================== Small utility library that handles metadata minification and expansion. This is used by [Composer](https://github.com/composer/composer)'s 2.x repository metadata protocol. Installation ------------ Install the latest version with: ```bash $ composer require composer/metadata-minifier ``` Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. Basic usage ----------- ### `Composer\MetadataMinifier\MetadataMinifier` - `MetadataMinifier::expand()`: Expands an array of minified versions back to their original format - `MetadataMinifier::minify()`: Minifies an array of versions into a set of version diffs License ------- composer/metadata-minifier is licensed under the MIT License, see the LICENSE file for details. parameters: level: 8 paths: - src - tests { "name": "composer\/metadata-minifier", "description": "Small utility library that handles metadata minification and expansion.", "type": "library", "license": "MIT", "keywords": [ "compression", "composer" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http:\/\/seld.be" } ], "support": { "issues": "https:\/\/github.com\/composer\/metadata-minifier\/issues" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "symfony\/phpunit-bridge": "^4.2 || ^5", "phpstan\/phpstan": "^0.12.55", "composer\/composer": "^2" }, "autoload": { "psr-4": { "Composer\\MetadataMinifier\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\Test\\MetadataMinifier\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "scripts": { "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor\/bin\/simple-phpunit", "phpstan": "vendor\/bin\/phpstan analyse" } } * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\MetadataMinifier; class MetadataMinifier { /** * Expands an array of minified versions back to their original format * * @param array[] $versions A list of minified version arrays * @return array[] A list of version arrays */ public static function expand(array $versions) { $expanded = array(); $expandedVersion = null; foreach ($versions as $versionData) { if (!$expandedVersion) { $expandedVersion = $versionData; $expanded[] = $expandedVersion; continue; } // add any changes from the previous version to the expanded one foreach ($versionData as $key => $val) { if ($val === '__unset') { unset($expandedVersion[$key]); } else { $expandedVersion[$key] = $val; } } $expanded[] = $expandedVersion; } return $expanded; } /** * Minifies an array of versions into a set of version diffs * * @param array[] $versions A list of version arrays * @return array[] A list of versions minified with each array only containing the differences to the previous one */ public static function minify(array $versions) { $minifiedVersions = array(); $lastKnownVersionData = null; foreach ($versions as $version) { if (!$lastKnownVersionData) { $lastKnownVersionData = $version; $minifiedVersions[] = $version; continue; } $minifiedVersion = array(); // add any changes from the previous version foreach ($version as $key => $val) { if (!isset($lastKnownVersionData[$key]) || $lastKnownVersionData[$key] !== $val) { $minifiedVersion[$key] = $val; $lastKnownVersionData[$key] = $val; } } // store any deletions from the previous version for keys missing in current one foreach ($lastKnownVersionData as $key => $val) { if (!isset($version[$key])) { $minifiedVersion[$key] = "__unset"; unset($lastKnownVersionData[$key]); } } $minifiedVersions[] = $minifiedVersion; } return $minifiedVersions; } } { "389-exception": [ "389 Directory Server Exception" ], "Asterisk-exception": [ "Asterisk exception" ], "Asterisk-linking-protocols-exception": [ "Asterisk linking protocols exception" ], "Autoconf-exception-2.0": [ "Autoconf exception 2.0" ], "Autoconf-exception-3.0": [ "Autoconf exception 3.0" ], "Autoconf-exception-generic": [ "Autoconf generic exception" ], "Autoconf-exception-generic-3.0": [ "Autoconf generic exception for GPL-3.0" ], "Autoconf-exception-macro": [ "Autoconf macro exception" ], "Bison-exception-1.24": [ "Bison exception 1.24" ], "Bison-exception-2.2": [ "Bison exception 2.2" ], "Bootloader-exception": [ "Bootloader Distribution Exception" ], "CGAL-linking-exception": [ "CGAL Linking Exception" ], "Classpath-exception-2.0": [ "Classpath exception 2.0" ], "CLISP-exception-2.0": [ "CLISP exception 2.0" ], "cryptsetup-OpenSSL-exception": [ "cryptsetup OpenSSL exception" ], "Digia-Qt-LGPL-exception-1.1": [ "Digia Qt LGPL Exception version 1.1" ], "DigiRule-FOSS-exception": [ "DigiRule FOSS License Exception" ], "eCos-exception-2.0": [ "eCos exception 2.0" ], "erlang-otp-linking-exception": [ "Erlang/OTP Linking Exception" ], "Fawkes-Runtime-exception": [ "Fawkes Runtime Exception" ], "FLTK-exception": [ "FLTK exception" ], "fmt-exception": [ "fmt exception" ], "Font-exception-2.0": [ "Font exception 2.0" ], "freertos-exception-2.0": [ "FreeRTOS Exception 2.0" ], "GCC-exception-2.0": [ "GCC Runtime Library exception 2.0" ], "GCC-exception-2.0-note": [ "GCC Runtime Library exception 2.0 - note variant" ], "GCC-exception-3.1": [ "GCC Runtime Library exception 3.1" ], "Gmsh-exception": [ "Gmsh exception" ], "GNAT-exception": [ "GNAT exception" ], "GNOME-examples-exception": [ "GNOME examples exception" ], "GNU-compiler-exception": [ "GNU Compiler Exception" ], "gnu-javamail-exception": [ "GNU JavaMail exception" ], "GPL-3.0-389-ds-base-exception": [ "GPL-3.0 389 DS Base Exception" ], "GPL-3.0-interface-exception": [ "GPL-3.0 Interface Exception" ], "GPL-3.0-linking-exception": [ "GPL-3.0 Linking Exception" ], "GPL-3.0-linking-source-exception": [ "GPL-3.0 Linking Exception (with Corresponding Source)" ], "GPL-CC-1.0": [ "GPL Cooperation Commitment 1.0" ], "GStreamer-exception-2005": [ "GStreamer Exception (2005)" ], "GStreamer-exception-2008": [ "GStreamer Exception (2008)" ], "harbour-exception": [ "harbour exception" ], "i2p-gpl-java-exception": [ "i2p GPL+Java Exception" ], "Independent-modules-exception": [ "Independent Module Linking exception" ], "KiCad-libraries-exception": [ "KiCad Libraries Exception" ], "LGPL-3.0-linking-exception": [ "LGPL-3.0 Linking Exception" ], "libpri-OpenH323-exception": [ "libpri OpenH323 exception" ], "Libtool-exception": [ "Libtool Exception" ], "Linux-syscall-note": [ "Linux Syscall Note" ], "LLGPL": [ "LLGPL Preamble" ], "LLVM-exception": [ "LLVM Exception" ], "LZMA-exception": [ "LZMA exception" ], "mif-exception": [ "Macros and Inline Functions Exception" ], "mxml-exception": [ "mxml Exception" ], "Nokia-Qt-exception-1.1": [ "Nokia Qt LGPL exception 1.1" ], "OCaml-LGPL-linking-exception": [ "OCaml LGPL Linking Exception" ], "OCCT-exception-1.0": [ "Open CASCADE Exception 1.0" ], "OpenJDK-assembly-exception-1.0": [ "OpenJDK Assembly exception 1.0" ], "openvpn-openssl-exception": [ "OpenVPN OpenSSL Exception" ], "PCRE2-exception": [ "PCRE2 exception" ], "polyparse-exception": [ "Polyparse Exception" ], "PS-or-PDF-font-exception-20170817": [ "PS/PDF font exception (2017-08-17)" ], "QPL-1.0-INRIA-2004-exception": [ "INRIA QPL 1.0 2004 variant exception" ], "Qt-GPL-exception-1.0": [ "Qt GPL exception 1.0" ], "Qt-LGPL-exception-1.1": [ "Qt LGPL exception 1.1" ], "Qwt-exception-1.0": [ "Qwt exception 1.0" ], "romic-exception": [ "Romic Exception" ], "RRDtool-FLOSS-exception-2.0": [ "RRDtool FLOSS exception 2.0" ], "SANE-exception": [ "SANE Exception" ], "SHL-2.0": [ "Solderpad Hardware License v2.0" ], "SHL-2.1": [ "Solderpad Hardware License v2.1" ], "stunnel-exception": [ "stunnel Exception" ], "SWI-exception": [ "SWI exception" ], "Swift-exception": [ "Swift Exception" ], "Texinfo-exception": [ "Texinfo exception" ], "u-boot-exception-2.0": [ "U-Boot exception 2.0" ], "UBDL-exception": [ "Unmodified Binary Distribution exception" ], "Universal-FOSS-exception-1.0": [ "Universal FOSS Exception, Version 1.0" ], "vsftpd-openssl-exception": [ "vsftpd OpenSSL exception" ], "WxWindows-exception-3.1": [ "WxWindows Library Exception 3.1" ], "x11vnc-openssl-exception": [ "x11vnc OpenSSL Exception" ] }{ "0BSD": [ "BSD Zero Clause License", true, false ], "3D-Slicer-1.0": [ "3D Slicer License v1.0", false, false ], "AAL": [ "Attribution Assurance License", true, false ], "Abstyles": [ "Abstyles License", false, false ], "AdaCore-doc": [ "AdaCore Doc License", false, false ], "Adobe-2006": [ "Adobe Systems Incorporated Source Code License Agreement", false, false ], "Adobe-Display-PostScript": [ "Adobe Display PostScript License", false, false ], "Adobe-Glyph": [ "Adobe Glyph List License", false, false ], "Adobe-Utopia": [ "Adobe Utopia Font License", false, false ], "ADSL": [ "Amazon Digital Services License", false, false ], "AFL-1.1": [ "Academic Free License v1.1", true, false ], "AFL-1.2": [ "Academic Free License v1.2", true, false ], "AFL-2.0": [ "Academic Free License v2.0", true, false ], "AFL-2.1": [ "Academic Free License v2.1", true, false ], "AFL-3.0": [ "Academic Free License v3.0", true, false ], "Afmparse": [ "Afmparse License", false, false ], "AGPL-1.0": [ "Affero General Public License v1.0", false, true ], "AGPL-1.0-only": [ "Affero General Public License v1.0 only", false, false ], "AGPL-1.0-or-later": [ "Affero General Public License v1.0 or later", false, false ], "AGPL-3.0": [ "GNU Affero General Public License v3.0", true, true ], "AGPL-3.0-only": [ "GNU Affero General Public License v3.0 only", true, false ], "AGPL-3.0-or-later": [ "GNU Affero General Public License v3.0 or later", true, false ], "Aladdin": [ "Aladdin Free Public License", false, false ], "AMD-newlib": [ "AMD newlib License", false, false ], "AMDPLPA": [ "AMD's plpa_map.c License", false, false ], "AML": [ "Apple MIT License", false, false ], "AML-glslang": [ "AML glslang variant License", false, false ], "AMPAS": [ "Academy of Motion Picture Arts and Sciences BSD", false, false ], "ANTLR-PD": [ "ANTLR Software Rights Notice", false, false ], "ANTLR-PD-fallback": [ "ANTLR Software Rights Notice with license fallback", false, false ], "any-OSI": [ "Any OSI License", false, false ], "any-OSI-perl-modules": [ "Any OSI License - Perl Modules", false, false ], "Apache-1.0": [ "Apache License 1.0", false, false ], "Apache-1.1": [ "Apache License 1.1", true, false ], "Apache-2.0": [ "Apache License 2.0", true, false ], "APAFML": [ "Adobe Postscript AFM License", false, false ], "APL-1.0": [ "Adaptive Public License 1.0", true, false ], "App-s2p": [ "App::s2p License", false, false ], "APSL-1.0": [ "Apple Public Source License 1.0", true, false ], "APSL-1.1": [ "Apple Public Source License 1.1", true, false ], "APSL-1.2": [ "Apple Public Source License 1.2", true, false ], "APSL-2.0": [ "Apple Public Source License 2.0", true, false ], "Arphic-1999": [ "Arphic Public License", false, false ], "Artistic-1.0": [ "Artistic License 1.0", true, false ], "Artistic-1.0-cl8": [ "Artistic License 1.0 w/clause 8", true, false ], "Artistic-1.0-Perl": [ "Artistic License 1.0 (Perl)", true, false ], "Artistic-2.0": [ "Artistic License 2.0", true, false ], "Artistic-dist": [ "Artistic License 1.0 (dist)", false, false ], "ASWF-Digital-Assets-1.0": [ "ASWF Digital Assets License version 1.0", false, false ], "ASWF-Digital-Assets-1.1": [ "ASWF Digital Assets License 1.1", false, false ], "Baekmuk": [ "Baekmuk License", false, false ], "Bahyph": [ "Bahyph License", false, false ], "Barr": [ "Barr License", false, false ], "bcrypt-Solar-Designer": [ "bcrypt Solar Designer License", false, false ], "Beerware": [ "Beerware License", false, false ], "Bitstream-Charter": [ "Bitstream Charter Font License", false, false ], "Bitstream-Vera": [ "Bitstream Vera Font License", false, false ], "BitTorrent-1.0": [ "BitTorrent Open Source License v1.0", false, false ], "BitTorrent-1.1": [ "BitTorrent Open Source License v1.1", false, false ], "blessing": [ "SQLite Blessing", false, false ], "BlueOak-1.0.0": [ "Blue Oak Model License 1.0.0", true, false ], "Boehm-GC": [ "Boehm-Demers-Weiser GC License", false, false ], "Boehm-GC-without-fee": [ "Boehm-Demers-Weiser GC License (without fee)", false, false ], "Borceux": [ "Borceux license", false, false ], "Brian-Gladman-2-Clause": [ "Brian Gladman 2-Clause License", false, false ], "Brian-Gladman-3-Clause": [ "Brian Gladman 3-Clause License", false, false ], "BSD-1-Clause": [ "BSD 1-Clause License", true, false ], "BSD-2-Clause": [ "BSD 2-Clause \"Simplified\" License", true, false ], "BSD-2-Clause-Darwin": [ "BSD 2-Clause - Ian Darwin variant", false, false ], "BSD-2-Clause-first-lines": [ "BSD 2-Clause - first lines requirement", false, false ], "BSD-2-Clause-FreeBSD": [ "BSD 2-Clause FreeBSD License", false, true ], "BSD-2-Clause-NetBSD": [ "BSD 2-Clause NetBSD License", false, true ], "BSD-2-Clause-Patent": [ "BSD-2-Clause Plus Patent License", true, false ], "BSD-2-Clause-pkgconf-disclaimer": [ "BSD 2-Clause pkgconf disclaimer variant", false, false ], "BSD-2-Clause-Views": [ "BSD 2-Clause with views sentence", false, false ], "BSD-3-Clause": [ "BSD 3-Clause \"New\" or \"Revised\" License", true, false ], "BSD-3-Clause-acpica": [ "BSD 3-Clause acpica variant", false, false ], "BSD-3-Clause-Attribution": [ "BSD with attribution", false, false ], "BSD-3-Clause-Clear": [ "BSD 3-Clause Clear License", false, false ], "BSD-3-Clause-flex": [ "BSD 3-Clause Flex variant", false, false ], "BSD-3-Clause-HP": [ "Hewlett-Packard BSD variant license", false, false ], "BSD-3-Clause-LBNL": [ "Lawrence Berkeley National Labs BSD variant license", true, false ], "BSD-3-Clause-Modification": [ "BSD 3-Clause Modification", false, false ], "BSD-3-Clause-No-Military-License": [ "BSD 3-Clause No Military License", false, false ], "BSD-3-Clause-No-Nuclear-License": [ "BSD 3-Clause No Nuclear License", false, false ], "BSD-3-Clause-No-Nuclear-License-2014": [ "BSD 3-Clause No Nuclear License 2014", false, false ], "BSD-3-Clause-No-Nuclear-Warranty": [ "BSD 3-Clause No Nuclear Warranty", false, false ], "BSD-3-Clause-Open-MPI": [ "BSD 3-Clause Open MPI variant", false, false ], "BSD-3-Clause-Sun": [ "BSD 3-Clause Sun Microsystems", false, false ], "BSD-4-Clause": [ "BSD 4-Clause \"Original\" or \"Old\" License", false, false ], "BSD-4-Clause-Shortened": [ "BSD 4 Clause Shortened", false, false ], "BSD-4-Clause-UC": [ "BSD-4-Clause (University of California-Specific)", false, false ], "BSD-4.3RENO": [ "BSD 4.3 RENO License", false, false ], "BSD-4.3TAHOE": [ "BSD 4.3 TAHOE License", false, false ], "BSD-Advertising-Acknowledgement": [ "BSD Advertising Acknowledgement License", false, false ], "BSD-Attribution-HPND-disclaimer": [ "BSD with Attribution and HPND disclaimer", false, false ], "BSD-Inferno-Nettverk": [ "BSD-Inferno-Nettverk", false, false ], "BSD-Protection": [ "BSD Protection License", false, false ], "BSD-Source-beginning-file": [ "BSD Source Code Attribution - beginning of file variant", false, false ], "BSD-Source-Code": [ "BSD Source Code Attribution", false, false ], "BSD-Systemics": [ "Systemics BSD variant license", false, false ], "BSD-Systemics-W3Works": [ "Systemics W3Works BSD variant license", false, false ], "BSL-1.0": [ "Boost Software License 1.0", true, false ], "BUSL-1.1": [ "Business Source License 1.1", false, false ], "bzip2-1.0.5": [ "bzip2 and libbzip2 License v1.0.5", false, true ], "bzip2-1.0.6": [ "bzip2 and libbzip2 License v1.0.6", false, false ], "C-UDA-1.0": [ "Computational Use of Data Agreement v1.0", false, false ], "CAL-1.0": [ "Cryptographic Autonomy License 1.0", true, false ], "CAL-1.0-Combined-Work-Exception": [ "Cryptographic Autonomy License 1.0 (Combined Work Exception)", true, false ], "Caldera": [ "Caldera License", false, false ], "Caldera-no-preamble": [ "Caldera License (without preamble)", false, false ], "Catharon": [ "Catharon License", false, false ], "CATOSL-1.1": [ "Computer Associates Trusted Open Source License 1.1", true, false ], "CC-BY-1.0": [ "Creative Commons Attribution 1.0 Generic", false, false ], "CC-BY-2.0": [ "Creative Commons Attribution 2.0 Generic", false, false ], "CC-BY-2.5": [ "Creative Commons Attribution 2.5 Generic", false, false ], "CC-BY-2.5-AU": [ "Creative Commons Attribution 2.5 Australia", false, false ], "CC-BY-3.0": [ "Creative Commons Attribution 3.0 Unported", false, false ], "CC-BY-3.0-AT": [ "Creative Commons Attribution 3.0 Austria", false, false ], "CC-BY-3.0-AU": [ "Creative Commons Attribution 3.0 Australia", false, false ], "CC-BY-3.0-DE": [ "Creative Commons Attribution 3.0 Germany", false, false ], "CC-BY-3.0-IGO": [ "Creative Commons Attribution 3.0 IGO", false, false ], "CC-BY-3.0-NL": [ "Creative Commons Attribution 3.0 Netherlands", false, false ], "CC-BY-3.0-US": [ "Creative Commons Attribution 3.0 United States", false, false ], "CC-BY-4.0": [ "Creative Commons Attribution 4.0 International", false, false ], "CC-BY-NC-1.0": [ "Creative Commons Attribution Non Commercial 1.0 Generic", false, false ], "CC-BY-NC-2.0": [ "Creative Commons Attribution Non Commercial 2.0 Generic", false, false ], "CC-BY-NC-2.5": [ "Creative Commons Attribution Non Commercial 2.5 Generic", false, false ], "CC-BY-NC-3.0": [ "Creative Commons Attribution Non Commercial 3.0 Unported", false, false ], "CC-BY-NC-3.0-DE": [ "Creative Commons Attribution Non Commercial 3.0 Germany", false, false ], "CC-BY-NC-4.0": [ "Creative Commons Attribution Non Commercial 4.0 International", false, false ], "CC-BY-NC-ND-1.0": [ "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", false, false ], "CC-BY-NC-ND-2.0": [ "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", false, false ], "CC-BY-NC-ND-2.5": [ "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", false, false ], "CC-BY-NC-ND-3.0": [ "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", false, false ], "CC-BY-NC-ND-3.0-DE": [ "Creative Commons Attribution Non Commercial No Derivatives 3.0 Germany", false, false ], "CC-BY-NC-ND-3.0-IGO": [ "Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO", false, false ], "CC-BY-NC-ND-4.0": [ "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", false, false ], "CC-BY-NC-SA-1.0": [ "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", false, false ], "CC-BY-NC-SA-2.0": [ "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", false, false ], "CC-BY-NC-SA-2.0-DE": [ "Creative Commons Attribution Non Commercial Share Alike 2.0 Germany", false, false ], "CC-BY-NC-SA-2.0-FR": [ "Creative Commons Attribution-NonCommercial-ShareAlike 2.0 France", false, false ], "CC-BY-NC-SA-2.0-UK": [ "Creative Commons Attribution Non Commercial Share Alike 2.0 England and Wales", false, false ], "CC-BY-NC-SA-2.5": [ "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", false, false ], "CC-BY-NC-SA-3.0": [ "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", false, false ], "CC-BY-NC-SA-3.0-DE": [ "Creative Commons Attribution Non Commercial Share Alike 3.0 Germany", false, false ], "CC-BY-NC-SA-3.0-IGO": [ "Creative Commons Attribution Non Commercial Share Alike 3.0 IGO", false, false ], "CC-BY-NC-SA-4.0": [ "Creative Commons Attribution Non Commercial Share Alike 4.0 International", false, false ], "CC-BY-ND-1.0": [ "Creative Commons Attribution No Derivatives 1.0 Generic", false, false ], "CC-BY-ND-2.0": [ "Creative Commons Attribution No Derivatives 2.0 Generic", false, false ], "CC-BY-ND-2.5": [ "Creative Commons Attribution No Derivatives 2.5 Generic", false, false ], "CC-BY-ND-3.0": [ "Creative Commons Attribution No Derivatives 3.0 Unported", false, false ], "CC-BY-ND-3.0-DE": [ "Creative Commons Attribution No Derivatives 3.0 Germany", false, false ], "CC-BY-ND-4.0": [ "Creative Commons Attribution No Derivatives 4.0 International", false, false ], "CC-BY-SA-1.0": [ "Creative Commons Attribution Share Alike 1.0 Generic", false, false ], "CC-BY-SA-2.0": [ "Creative Commons Attribution Share Alike 2.0 Generic", false, false ], "CC-BY-SA-2.0-UK": [ "Creative Commons Attribution Share Alike 2.0 England and Wales", false, false ], "CC-BY-SA-2.1-JP": [ "Creative Commons Attribution Share Alike 2.1 Japan", false, false ], "CC-BY-SA-2.5": [ "Creative Commons Attribution Share Alike 2.5 Generic", false, false ], "CC-BY-SA-3.0": [ "Creative Commons Attribution Share Alike 3.0 Unported", false, false ], "CC-BY-SA-3.0-AT": [ "Creative Commons Attribution Share Alike 3.0 Austria", false, false ], "CC-BY-SA-3.0-DE": [ "Creative Commons Attribution Share Alike 3.0 Germany", false, false ], "CC-BY-SA-3.0-IGO": [ "Creative Commons Attribution-ShareAlike 3.0 IGO", false, false ], "CC-BY-SA-4.0": [ "Creative Commons Attribution Share Alike 4.0 International", false, false ], "CC-PDDC": [ "Creative Commons Public Domain Dedication and Certification", false, false ], "CC-PDM-1.0": [ "Creative Commons Public Domain Mark 1.0 Universal", false, false ], "CC-SA-1.0": [ "Creative Commons Share Alike 1.0 Generic", false, false ], "CC0-1.0": [ "Creative Commons Zero v1.0 Universal", false, false ], "CDDL-1.0": [ "Common Development and Distribution License 1.0", true, false ], "CDDL-1.1": [ "Common Development and Distribution License 1.1", false, false ], "CDL-1.0": [ "Common Documentation License 1.0", false, false ], "CDLA-Permissive-1.0": [ "Community Data License Agreement Permissive 1.0", false, false ], "CDLA-Permissive-2.0": [ "Community Data License Agreement Permissive 2.0", false, false ], "CDLA-Sharing-1.0": [ "Community Data License Agreement Sharing 1.0", false, false ], "CECILL-1.0": [ "CeCILL Free Software License Agreement v1.0", false, false ], "CECILL-1.1": [ "CeCILL Free Software License Agreement v1.1", false, false ], "CECILL-2.0": [ "CeCILL Free Software License Agreement v2.0", false, false ], "CECILL-2.1": [ "CeCILL Free Software License Agreement v2.1", true, false ], "CECILL-B": [ "CeCILL-B Free Software License Agreement", false, false ], "CECILL-C": [ "CeCILL-C Free Software License Agreement", false, false ], "CERN-OHL-1.1": [ "CERN Open Hardware Licence v1.1", false, false ], "CERN-OHL-1.2": [ "CERN Open Hardware Licence v1.2", false, false ], "CERN-OHL-P-2.0": [ "CERN Open Hardware Licence Version 2 - Permissive", true, false ], "CERN-OHL-S-2.0": [ "CERN Open Hardware Licence Version 2 - Strongly Reciprocal", true, false ], "CERN-OHL-W-2.0": [ "CERN Open Hardware Licence Version 2 - Weakly Reciprocal", true, false ], "CFITSIO": [ "CFITSIO License", false, false ], "check-cvs": [ "check-cvs License", false, false ], "checkmk": [ "Checkmk License", false, false ], "ClArtistic": [ "Clarified Artistic License", false, false ], "Clips": [ "Clips License", false, false ], "CMU-Mach": [ "CMU Mach License", false, false ], "CMU-Mach-nodoc": [ "CMU Mach - no notices-in-documentation variant", false, false ], "CNRI-Jython": [ "CNRI Jython License", false, false ], "CNRI-Python": [ "CNRI Python License", true, false ], "CNRI-Python-GPL-Compatible": [ "CNRI Python Open Source GPL Compatible License Agreement", false, false ], "COIL-1.0": [ "Copyfree Open Innovation License", false, false ], "Community-Spec-1.0": [ "Community Specification License 1.0", false, false ], "Condor-1.1": [ "Condor Public License v1.1", false, false ], "copyleft-next-0.3.0": [ "copyleft-next 0.3.0", false, false ], "copyleft-next-0.3.1": [ "copyleft-next 0.3.1", false, false ], "Cornell-Lossless-JPEG": [ "Cornell Lossless JPEG License", false, false ], "CPAL-1.0": [ "Common Public Attribution License 1.0", true, false ], "CPL-1.0": [ "Common Public License 1.0", true, false ], "CPOL-1.02": [ "Code Project Open License 1.02", false, false ], "Cronyx": [ "Cronyx License", false, false ], "Crossword": [ "Crossword License", false, false ], "CryptoSwift": [ "CryptoSwift License", false, false ], "CrystalStacker": [ "CrystalStacker License", false, false ], "CUA-OPL-1.0": [ "CUA Office Public License v1.0", true, false ], "Cube": [ "Cube License", false, false ], "curl": [ "curl License", false, false ], "cve-tou": [ "Common Vulnerability Enumeration ToU License", false, false ], "D-FSL-1.0": [ "Deutsche Freie Software Lizenz", false, false ], "DEC-3-Clause": [ "DEC 3-Clause License", false, false ], "diffmark": [ "diffmark license", false, false ], "DL-DE-BY-2.0": [ "Data licence Germany \u2013 attribution \u2013 version 2.0", false, false ], "DL-DE-ZERO-2.0": [ "Data licence Germany \u2013 zero \u2013 version 2.0", false, false ], "DOC": [ "DOC License", false, false ], "DocBook-DTD": [ "DocBook DTD License", false, false ], "DocBook-Schema": [ "DocBook Schema License", false, false ], "DocBook-Stylesheet": [ "DocBook Stylesheet License", false, false ], "DocBook-XML": [ "DocBook XML License", false, false ], "Dotseqn": [ "Dotseqn License", false, false ], "DRL-1.0": [ "Detection Rule License 1.0", false, false ], "DRL-1.1": [ "Detection Rule License 1.1", false, false ], "DSDP": [ "DSDP License", false, false ], "dtoa": [ "David M. Gay dtoa License", false, false ], "dvipdfm": [ "dvipdfm License", false, false ], "ECL-1.0": [ "Educational Community License v1.0", true, false ], "ECL-2.0": [ "Educational Community License v2.0", true, false ], "eCos-2.0": [ "eCos license version 2.0", false, true ], "EFL-1.0": [ "Eiffel Forum License v1.0", true, false ], "EFL-2.0": [ "Eiffel Forum License v2.0", true, false ], "eGenix": [ "eGenix.com Public License 1.1.0", false, false ], "Elastic-2.0": [ "Elastic License 2.0", false, false ], "Entessa": [ "Entessa Public License v1.0", true, false ], "EPICS": [ "EPICS Open License", false, false ], "EPL-1.0": [ "Eclipse Public License 1.0", true, false ], "EPL-2.0": [ "Eclipse Public License 2.0", true, false ], "ErlPL-1.1": [ "Erlang Public License v1.1", false, false ], "etalab-2.0": [ "Etalab Open License 2.0", false, false ], "EUDatagrid": [ "EU DataGrid Software License", true, false ], "EUPL-1.0": [ "European Union Public License 1.0", false, false ], "EUPL-1.1": [ "European Union Public License 1.1", true, false ], "EUPL-1.2": [ "European Union Public License 1.2", true, false ], "Eurosym": [ "Eurosym License", false, false ], "Fair": [ "Fair License", true, false ], "FBM": [ "Fuzzy Bitmap License", false, false ], "FDK-AAC": [ "Fraunhofer FDK AAC Codec Library", false, false ], "Ferguson-Twofish": [ "Ferguson Twofish License", false, false ], "Frameworx-1.0": [ "Frameworx Open License 1.0", true, false ], "FreeBSD-DOC": [ "FreeBSD Documentation License", false, false ], "FreeImage": [ "FreeImage Public License v1.0", false, false ], "FSFAP": [ "FSF All Permissive License", false, false ], "FSFAP-no-warranty-disclaimer": [ "FSF All Permissive License (without Warranty)", false, false ], "FSFUL": [ "FSF Unlimited License", false, false ], "FSFULLR": [ "FSF Unlimited License (with License Retention)", false, false ], "FSFULLRWD": [ "FSF Unlimited License (With License Retention and Warranty Disclaimer)", false, false ], "FSL-1.1-ALv2": [ "Functional Source License, Version 1.1, ALv2 Future License", false, false ], "FSL-1.1-MIT": [ "Functional Source License, Version 1.1, MIT Future License", false, false ], "FTL": [ "Freetype Project License", false, false ], "Furuseth": [ "Furuseth License", false, false ], "fwlw": [ "fwlw License", false, false ], "Game-Programming-Gems": [ "Game Programming Gems License", false, false ], "GCR-docs": [ "Gnome GCR Documentation License", false, false ], "GD": [ "GD License", false, false ], "generic-xts": [ "Generic XTS License", false, false ], "GFDL-1.1": [ "GNU Free Documentation License v1.1", false, true ], "GFDL-1.1-invariants-only": [ "GNU Free Documentation License v1.1 only - invariants", false, false ], "GFDL-1.1-invariants-or-later": [ "GNU Free Documentation License v1.1 or later - invariants", false, false ], "GFDL-1.1-no-invariants-only": [ "GNU Free Documentation License v1.1 only - no invariants", false, false ], "GFDL-1.1-no-invariants-or-later": [ "GNU Free Documentation License v1.1 or later - no invariants", false, false ], "GFDL-1.1-only": [ "GNU Free Documentation License v1.1 only", false, false ], "GFDL-1.1-or-later": [ "GNU Free Documentation License v1.1 or later", false, false ], "GFDL-1.2": [ "GNU Free Documentation License v1.2", false, true ], "GFDL-1.2-invariants-only": [ "GNU Free Documentation License v1.2 only - invariants", false, false ], "GFDL-1.2-invariants-or-later": [ "GNU Free Documentation License v1.2 or later - invariants", false, false ], "GFDL-1.2-no-invariants-only": [ "GNU Free Documentation License v1.2 only - no invariants", false, false ], "GFDL-1.2-no-invariants-or-later": [ "GNU Free Documentation License v1.2 or later - no invariants", false, false ], "GFDL-1.2-only": [ "GNU Free Documentation License v1.2 only", false, false ], "GFDL-1.2-or-later": [ "GNU Free Documentation License v1.2 or later", false, false ], "GFDL-1.3": [ "GNU Free Documentation License v1.3", false, true ], "GFDL-1.3-invariants-only": [ "GNU Free Documentation License v1.3 only - invariants", false, false ], "GFDL-1.3-invariants-or-later": [ "GNU Free Documentation License v1.3 or later - invariants", false, false ], "GFDL-1.3-no-invariants-only": [ "GNU Free Documentation License v1.3 only - no invariants", false, false ], "GFDL-1.3-no-invariants-or-later": [ "GNU Free Documentation License v1.3 or later - no invariants", false, false ], "GFDL-1.3-only": [ "GNU Free Documentation License v1.3 only", false, false ], "GFDL-1.3-or-later": [ "GNU Free Documentation License v1.3 or later", false, false ], "Giftware": [ "Giftware License", false, false ], "GL2PS": [ "GL2PS License", false, false ], "Glide": [ "3dfx Glide License", false, false ], "Glulxe": [ "Glulxe License", false, false ], "GLWTPL": [ "Good Luck With That Public License", false, false ], "gnuplot": [ "gnuplot License", false, false ], "GPL-1.0": [ "GNU General Public License v1.0 only", false, true ], "GPL-1.0+": [ "GNU General Public License v1.0 or later", false, true ], "GPL-1.0-only": [ "GNU General Public License v1.0 only", false, false ], "GPL-1.0-or-later": [ "GNU General Public License v1.0 or later", false, false ], "GPL-2.0": [ "GNU General Public License v2.0 only", true, true ], "GPL-2.0+": [ "GNU General Public License v2.0 or later", true, true ], "GPL-2.0-only": [ "GNU General Public License v2.0 only", true, false ], "GPL-2.0-or-later": [ "GNU General Public License v2.0 or later", true, false ], "GPL-2.0-with-autoconf-exception": [ "GNU General Public License v2.0 w/Autoconf exception", false, true ], "GPL-2.0-with-bison-exception": [ "GNU General Public License v2.0 w/Bison exception", false, true ], "GPL-2.0-with-classpath-exception": [ "GNU General Public License v2.0 w/Classpath exception", false, true ], "GPL-2.0-with-font-exception": [ "GNU General Public License v2.0 w/Font exception", false, true ], "GPL-2.0-with-GCC-exception": [ "GNU General Public License v2.0 w/GCC Runtime Library exception", false, true ], "GPL-3.0": [ "GNU General Public License v3.0 only", true, true ], "GPL-3.0+": [ "GNU General Public License v3.0 or later", true, true ], "GPL-3.0-only": [ "GNU General Public License v3.0 only", true, false ], "GPL-3.0-or-later": [ "GNU General Public License v3.0 or later", true, false ], "GPL-3.0-with-autoconf-exception": [ "GNU General Public License v3.0 w/Autoconf exception", false, true ], "GPL-3.0-with-GCC-exception": [ "GNU General Public License v3.0 w/GCC Runtime Library exception", true, true ], "Graphics-Gems": [ "Graphics Gems License", false, false ], "gSOAP-1.3b": [ "gSOAP Public License v1.3b", false, false ], "gtkbook": [ "gtkbook License", false, false ], "Gutmann": [ "Gutmann License", false, false ], "HaskellReport": [ "Haskell Language Report License", false, false ], "hdparm": [ "hdparm License", false, false ], "HIDAPI": [ "HIDAPI License", false, false ], "Hippocratic-2.1": [ "Hippocratic License 2.1", false, false ], "HP-1986": [ "Hewlett-Packard 1986 License", false, false ], "HP-1989": [ "Hewlett-Packard 1989 License", false, false ], "HPND": [ "Historical Permission Notice and Disclaimer", true, false ], "HPND-DEC": [ "Historical Permission Notice and Disclaimer - DEC variant", false, false ], "HPND-doc": [ "Historical Permission Notice and Disclaimer - documentation variant", false, false ], "HPND-doc-sell": [ "Historical Permission Notice and Disclaimer - documentation sell variant", false, false ], "HPND-export-US": [ "HPND with US Government export control warning", false, false ], "HPND-export-US-acknowledgement": [ "HPND with US Government export control warning and acknowledgment", false, false ], "HPND-export-US-modify": [ "HPND with US Government export control warning and modification rqmt", false, false ], "HPND-export2-US": [ "HPND with US Government export control and 2 disclaimers", false, false ], "HPND-Fenneberg-Livingston": [ "Historical Permission Notice and Disclaimer - Fenneberg-Livingston variant", false, false ], "HPND-INRIA-IMAG": [ "Historical Permission Notice and Disclaimer - INRIA-IMAG variant", false, false ], "HPND-Intel": [ "Historical Permission Notice and Disclaimer - Intel variant", false, false ], "HPND-Kevlin-Henney": [ "Historical Permission Notice and Disclaimer - Kevlin Henney variant", false, false ], "HPND-Markus-Kuhn": [ "Historical Permission Notice and Disclaimer - Markus Kuhn variant", false, false ], "HPND-merchantability-variant": [ "Historical Permission Notice and Disclaimer - merchantability variant", false, false ], "HPND-MIT-disclaimer": [ "Historical Permission Notice and Disclaimer with MIT disclaimer", false, false ], "HPND-Netrek": [ "Historical Permission Notice and Disclaimer - Netrek variant", false, false ], "HPND-Pbmplus": [ "Historical Permission Notice and Disclaimer - Pbmplus variant", false, false ], "HPND-sell-MIT-disclaimer-xserver": [ "Historical Permission Notice and Disclaimer - sell xserver variant with MIT disclaimer", false, false ], "HPND-sell-regexpr": [ "Historical Permission Notice and Disclaimer - sell regexpr variant", false, false ], "HPND-sell-variant": [ "Historical Permission Notice and Disclaimer - sell variant", false, false ], "HPND-sell-variant-MIT-disclaimer": [ "HPND sell variant with MIT disclaimer", false, false ], "HPND-sell-variant-MIT-disclaimer-rev": [ "HPND sell variant with MIT disclaimer - reverse", false, false ], "HPND-UC": [ "Historical Permission Notice and Disclaimer - University of California variant", false, false ], "HPND-UC-export-US": [ "Historical Permission Notice and Disclaimer - University of California, US export warning", false, false ], "HTMLTIDY": [ "HTML Tidy License", false, false ], "IBM-pibs": [ "IBM PowerPC Initialization and Boot Software", false, false ], "ICU": [ "ICU License", true, false ], "IEC-Code-Components-EULA": [ "IEC Code Components End-user licence agreement", false, false ], "IJG": [ "Independent JPEG Group License", false, false ], "IJG-short": [ "Independent JPEG Group License - short", false, false ], "ImageMagick": [ "ImageMagick License", false, false ], "iMatix": [ "iMatix Standard Function Library Agreement", false, false ], "Imlib2": [ "Imlib2 License", false, false ], "Info-ZIP": [ "Info-ZIP License", false, false ], "Inner-Net-2.0": [ "Inner Net License v2.0", false, false ], "InnoSetup": [ "Inno Setup License", false, false ], "Intel": [ "Intel Open Source License", true, false ], "Intel-ACPI": [ "Intel ACPI Software License Agreement", false, false ], "Interbase-1.0": [ "Interbase Public License v1.0", false, false ], "IPA": [ "IPA Font License", true, false ], "IPL-1.0": [ "IBM Public License v1.0", true, false ], "ISC": [ "ISC License", true, false ], "ISC-Veillard": [ "ISC Veillard variant", false, false ], "Jam": [ "Jam License", true, false ], "JasPer-2.0": [ "JasPer License", false, false ], "jove": [ "Jove License", false, false ], "JPL-image": [ "JPL Image Use Policy", false, false ], "JPNIC": [ "Japan Network Information Center License", false, false ], "JSON": [ "JSON License", false, false ], "Kastrup": [ "Kastrup License", false, false ], "Kazlib": [ "Kazlib License", false, false ], "Knuth-CTAN": [ "Knuth CTAN License", false, false ], "LAL-1.2": [ "Licence Art Libre 1.2", false, false ], "LAL-1.3": [ "Licence Art Libre 1.3", false, false ], "Latex2e": [ "Latex2e License", false, false ], "Latex2e-translated-notice": [ "Latex2e with translated notice permission", false, false ], "Leptonica": [ "Leptonica License", false, false ], "LGPL-2.0": [ "GNU Library General Public License v2 only", true, true ], "LGPL-2.0+": [ "GNU Library General Public License v2 or later", true, true ], "LGPL-2.0-only": [ "GNU Library General Public License v2 only", true, false ], "LGPL-2.0-or-later": [ "GNU Library General Public License v2 or later", true, false ], "LGPL-2.1": [ "GNU Lesser General Public License v2.1 only", true, true ], "LGPL-2.1+": [ "GNU Lesser General Public License v2.1 or later", true, true ], "LGPL-2.1-only": [ "GNU Lesser General Public License v2.1 only", true, false ], "LGPL-2.1-or-later": [ "GNU Lesser General Public License v2.1 or later", true, false ], "LGPL-3.0": [ "GNU Lesser General Public License v3.0 only", true, true ], "LGPL-3.0+": [ "GNU Lesser General Public License v3.0 or later", true, true ], "LGPL-3.0-only": [ "GNU Lesser General Public License v3.0 only", true, false ], "LGPL-3.0-or-later": [ "GNU Lesser General Public License v3.0 or later", true, false ], "LGPLLR": [ "Lesser General Public License For Linguistic Resources", false, false ], "Libpng": [ "libpng License", false, false ], "libpng-2.0": [ "PNG Reference Library version 2", false, false ], "libselinux-1.0": [ "libselinux public domain notice", false, false ], "libtiff": [ "libtiff License", false, false ], "libutil-David-Nugent": [ "libutil David Nugent License", false, false ], "LiLiQ-P-1.1": [ "Licence Libre du Qu\u00e9bec \u2013 Permissive version 1.1", true, false ], "LiLiQ-R-1.1": [ "Licence Libre du Qu\u00e9bec \u2013 R\u00e9ciprocit\u00e9 version 1.1", true, false ], "LiLiQ-Rplus-1.1": [ "Licence Libre du Qu\u00e9bec \u2013 R\u00e9ciprocit\u00e9 forte version 1.1", true, false ], "Linux-man-pages-1-para": [ "Linux man-pages - 1 paragraph", false, false ], "Linux-man-pages-copyleft": [ "Linux man-pages Copyleft", false, false ], "Linux-man-pages-copyleft-2-para": [ "Linux man-pages Copyleft - 2 paragraphs", false, false ], "Linux-man-pages-copyleft-var": [ "Linux man-pages Copyleft Variant", false, false ], "Linux-OpenIB": [ "Linux Kernel Variant of OpenIB.org license", false, false ], "LOOP": [ "Common Lisp LOOP License", false, false ], "LPD-document": [ "LPD Documentation License", false, false ], "LPL-1.0": [ "Lucent Public License Version 1.0", true, false ], "LPL-1.02": [ "Lucent Public License v1.02", true, false ], "LPPL-1.0": [ "LaTeX Project Public License v1.0", false, false ], "LPPL-1.1": [ "LaTeX Project Public License v1.1", false, false ], "LPPL-1.2": [ "LaTeX Project Public License v1.2", false, false ], "LPPL-1.3a": [ "LaTeX Project Public License v1.3a", false, false ], "LPPL-1.3c": [ "LaTeX Project Public License v1.3c", true, false ], "lsof": [ "lsof License", false, false ], "Lucida-Bitmap-Fonts": [ "Lucida Bitmap Fonts License", false, false ], "LZMA-SDK-9.11-to-9.20": [ "LZMA SDK License (versions 9.11 to 9.20)", false, false ], "LZMA-SDK-9.22": [ "LZMA SDK License (versions 9.22 and beyond)", false, false ], "Mackerras-3-Clause": [ "Mackerras 3-Clause License", false, false ], "Mackerras-3-Clause-acknowledgment": [ "Mackerras 3-Clause - acknowledgment variant", false, false ], "magaz": [ "magaz License", false, false ], "mailprio": [ "mailprio License", false, false ], "MakeIndex": [ "MakeIndex License", false, false ], "man2html": [ "man2html License", false, false ], "Martin-Birgmeier": [ "Martin Birgmeier License", false, false ], "McPhee-slideshow": [ "McPhee Slideshow License", false, false ], "metamail": [ "metamail License", false, false ], "Minpack": [ "Minpack License", false, false ], "MIPS": [ "MIPS License", false, false ], "MirOS": [ "The MirOS Licence", true, false ], "MIT": [ "MIT License", true, false ], "MIT-0": [ "MIT No Attribution", true, false ], "MIT-advertising": [ "Enlightenment License (e16)", false, false ], "MIT-Click": [ "MIT Click License", false, false ], "MIT-CMU": [ "CMU License", false, false ], "MIT-enna": [ "enna License", false, false ], "MIT-feh": [ "feh License", false, false ], "MIT-Festival": [ "MIT Festival Variant", false, false ], "MIT-Khronos-old": [ "MIT Khronos - old variant", false, false ], "MIT-Modern-Variant": [ "MIT License Modern Variant", true, false ], "MIT-open-group": [ "MIT Open Group variant", false, false ], "MIT-testregex": [ "MIT testregex Variant", false, false ], "MIT-Wu": [ "MIT Tom Wu Variant", false, false ], "MITNFA": [ "MIT +no-false-attribs license", false, false ], "MMIXware": [ "MMIXware License", false, false ], "Motosoto": [ "Motosoto License", true, false ], "MPEG-SSG": [ "MPEG Software Simulation", false, false ], "mpi-permissive": [ "mpi Permissive License", false, false ], "mpich2": [ "mpich2 License", false, false ], "MPL-1.0": [ "Mozilla Public License 1.0", true, false ], "MPL-1.1": [ "Mozilla Public License 1.1", true, false ], "MPL-2.0": [ "Mozilla Public License 2.0", true, false ], "MPL-2.0-no-copyleft-exception": [ "Mozilla Public License 2.0 (no copyleft exception)", true, false ], "mplus": [ "mplus Font License", false, false ], "MS-LPL": [ "Microsoft Limited Public License", false, false ], "MS-PL": [ "Microsoft Public License", true, false ], "MS-RL": [ "Microsoft Reciprocal License", true, false ], "MTLL": [ "Matrix Template Library License", false, false ], "MulanPSL-1.0": [ "Mulan Permissive Software License, Version 1", false, false ], "MulanPSL-2.0": [ "Mulan Permissive Software License, Version 2", true, false ], "Multics": [ "Multics License", true, false ], "Mup": [ "Mup License", false, false ], "NAIST-2003": [ "Nara Institute of Science and Technology License (2003)", false, false ], "NASA-1.3": [ "NASA Open Source Agreement 1.3", true, false ], "Naumen": [ "Naumen Public License", true, false ], "NBPL-1.0": [ "Net Boolean Public License v1", false, false ], "NCBI-PD": [ "NCBI Public Domain Notice", false, false ], "NCGL-UK-2.0": [ "Non-Commercial Government Licence", false, false ], "NCL": [ "NCL Source Code License", false, false ], "NCSA": [ "University of Illinois/NCSA Open Source License", true, false ], "Net-SNMP": [ "Net-SNMP License", false, true ], "NetCDF": [ "NetCDF license", false, false ], "Newsletr": [ "Newsletr License", false, false ], "NGPL": [ "Nethack General Public License", true, false ], "NICTA-1.0": [ "NICTA Public Software License, Version 1.0", false, false ], "NIST-PD": [ "NIST Public Domain Notice", false, false ], "NIST-PD-fallback": [ "NIST Public Domain Notice with license fallback", false, false ], "NIST-Software": [ "NIST Software License", false, false ], "NLOD-1.0": [ "Norwegian Licence for Open Government Data (NLOD) 1.0", false, false ], "NLOD-2.0": [ "Norwegian Licence for Open Government Data (NLOD) 2.0", false, false ], "NLPL": [ "No Limit Public License", false, false ], "Nokia": [ "Nokia Open Source License", true, false ], "NOSL": [ "Netizen Open Source License", false, false ], "Noweb": [ "Noweb License", false, false ], "NPL-1.0": [ "Netscape Public License v1.0", false, false ], "NPL-1.1": [ "Netscape Public License v1.1", false, false ], "NPOSL-3.0": [ "Non-Profit Open Software License 3.0", true, false ], "NRL": [ "NRL License", false, false ], "NTIA-PD": [ "NTIA Public Domain Notice", false, false ], "NTP": [ "NTP License", true, false ], "NTP-0": [ "NTP No Attribution", false, false ], "Nunit": [ "Nunit License", false, true ], "O-UDA-1.0": [ "Open Use of Data Agreement v1.0", false, false ], "OAR": [ "OAR License", false, false ], "OCCT-PL": [ "Open CASCADE Technology Public License", false, false ], "OCLC-2.0": [ "OCLC Research Public License 2.0", true, false ], "ODbL-1.0": [ "Open Data Commons Open Database License v1.0", false, false ], "ODC-By-1.0": [ "Open Data Commons Attribution License v1.0", false, false ], "OFFIS": [ "OFFIS License", false, false ], "OFL-1.0": [ "SIL Open Font License 1.0", false, false ], "OFL-1.0-no-RFN": [ "SIL Open Font License 1.0 with no Reserved Font Name", false, false ], "OFL-1.0-RFN": [ "SIL Open Font License 1.0 with Reserved Font Name", false, false ], "OFL-1.1": [ "SIL Open Font License 1.1", true, false ], "OFL-1.1-no-RFN": [ "SIL Open Font License 1.1 with no Reserved Font Name", true, false ], "OFL-1.1-RFN": [ "SIL Open Font License 1.1 with Reserved Font Name", true, false ], "OGC-1.0": [ "OGC Software License, Version 1.0", false, false ], "OGDL-Taiwan-1.0": [ "Taiwan Open Government Data License, version 1.0", false, false ], "OGL-Canada-2.0": [ "Open Government Licence - Canada", false, false ], "OGL-UK-1.0": [ "Open Government Licence v1.0", false, false ], "OGL-UK-2.0": [ "Open Government Licence v2.0", false, false ], "OGL-UK-3.0": [ "Open Government Licence v3.0", false, false ], "OGTSL": [ "Open Group Test Suite License", true, false ], "OLDAP-1.1": [ "Open LDAP Public License v1.1", false, false ], "OLDAP-1.2": [ "Open LDAP Public License v1.2", false, false ], "OLDAP-1.3": [ "Open LDAP Public License v1.3", false, false ], "OLDAP-1.4": [ "Open LDAP Public License v1.4", false, false ], "OLDAP-2.0": [ "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", false, false ], "OLDAP-2.0.1": [ "Open LDAP Public License v2.0.1", false, false ], "OLDAP-2.1": [ "Open LDAP Public License v2.1", false, false ], "OLDAP-2.2": [ "Open LDAP Public License v2.2", false, false ], "OLDAP-2.2.1": [ "Open LDAP Public License v2.2.1", false, false ], "OLDAP-2.2.2": [ "Open LDAP Public License 2.2.2", false, false ], "OLDAP-2.3": [ "Open LDAP Public License v2.3", false, false ], "OLDAP-2.4": [ "Open LDAP Public License v2.4", false, false ], "OLDAP-2.5": [ "Open LDAP Public License v2.5", false, false ], "OLDAP-2.6": [ "Open LDAP Public License v2.6", false, false ], "OLDAP-2.7": [ "Open LDAP Public License v2.7", false, false ], "OLDAP-2.8": [ "Open LDAP Public License v2.8", true, false ], "OLFL-1.3": [ "Open Logistics Foundation License Version 1.3", true, false ], "OML": [ "Open Market License", false, false ], "OpenPBS-2.3": [ "OpenPBS v2.3 Software License", false, false ], "OpenSSL": [ "OpenSSL License", false, false ], "OpenSSL-standalone": [ "OpenSSL License - standalone", false, false ], "OpenVision": [ "OpenVision License", false, false ], "OPL-1.0": [ "Open Public License v1.0", false, false ], "OPL-UK-3.0": [ "United Kingdom Open Parliament Licence v3.0", false, false ], "OPUBL-1.0": [ "Open Publication License v1.0", false, false ], "OSET-PL-2.1": [ "OSET Public License version 2.1", true, false ], "OSL-1.0": [ "Open Software License 1.0", true, false ], "OSL-1.1": [ "Open Software License 1.1", false, false ], "OSL-2.0": [ "Open Software License 2.0", true, false ], "OSL-2.1": [ "Open Software License 2.1", true, false ], "OSL-3.0": [ "Open Software License 3.0", true, false ], "PADL": [ "PADL License", false, false ], "Parity-6.0.0": [ "The Parity Public License 6.0.0", false, false ], "Parity-7.0.0": [ "The Parity Public License 7.0.0", false, false ], "PDDL-1.0": [ "Open Data Commons Public Domain Dedication & License 1.0", false, false ], "PHP-3.0": [ "PHP License v3.0", true, false ], "PHP-3.01": [ "PHP License v3.01", true, false ], "Pixar": [ "Pixar License", false, false ], "pkgconf": [ "pkgconf License", false, false ], "Plexus": [ "Plexus Classworlds License", false, false ], "pnmstitch": [ "pnmstitch License", false, false ], "PolyForm-Noncommercial-1.0.0": [ "PolyForm Noncommercial License 1.0.0", false, false ], "PolyForm-Small-Business-1.0.0": [ "PolyForm Small Business License 1.0.0", false, false ], "PostgreSQL": [ "PostgreSQL License", true, false ], "PPL": [ "Peer Production License", false, false ], "PSF-2.0": [ "Python Software Foundation License 2.0", false, false ], "psfrag": [ "psfrag License", false, false ], "psutils": [ "psutils License", false, false ], "Python-2.0": [ "Python License 2.0", true, false ], "Python-2.0.1": [ "Python License 2.0.1", false, false ], "python-ldap": [ "Python ldap License", false, false ], "Qhull": [ "Qhull License", false, false ], "QPL-1.0": [ "Q Public License 1.0", true, false ], "QPL-1.0-INRIA-2004": [ "Q Public License 1.0 - INRIA 2004 variant", false, false ], "radvd": [ "radvd License", false, false ], "Rdisc": [ "Rdisc License", false, false ], "RHeCos-1.1": [ "Red Hat eCos Public License v1.1", false, false ], "RPL-1.1": [ "Reciprocal Public License 1.1", true, false ], "RPL-1.5": [ "Reciprocal Public License 1.5", true, false ], "RPSL-1.0": [ "RealNetworks Public Source License v1.0", true, false ], "RSA-MD": [ "RSA Message-Digest License", false, false ], "RSCPL": [ "Ricoh Source Code Public License", true, false ], "Ruby": [ "Ruby License", false, false ], "Ruby-pty": [ "Ruby pty extension license", false, false ], "SAX-PD": [ "Sax Public Domain Notice", false, false ], "SAX-PD-2.0": [ "Sax Public Domain Notice 2.0", false, false ], "Saxpath": [ "Saxpath License", false, false ], "SCEA": [ "SCEA Shared Source License", false, false ], "SchemeReport": [ "Scheme Language Report License", false, false ], "Sendmail": [ "Sendmail License", false, false ], "Sendmail-8.23": [ "Sendmail License 8.23", false, false ], "Sendmail-Open-Source-1.1": [ "Sendmail Open Source License v1.1", false, false ], "SGI-B-1.0": [ "SGI Free Software License B v1.0", false, false ], "SGI-B-1.1": [ "SGI Free Software License B v1.1", false, false ], "SGI-B-2.0": [ "SGI Free Software License B v2.0", false, false ], "SGI-OpenGL": [ "SGI OpenGL License", false, false ], "SGP4": [ "SGP4 Permission Notice", false, false ], "SHL-0.5": [ "Solderpad Hardware License v0.5", false, false ], "SHL-0.51": [ "Solderpad Hardware License, Version 0.51", false, false ], "SimPL-2.0": [ "Simple Public License 2.0", true, false ], "SISSL": [ "Sun Industry Standards Source License v1.1", true, false ], "SISSL-1.2": [ "Sun Industry Standards Source License v1.2", false, false ], "SL": [ "SL License", false, false ], "Sleepycat": [ "Sleepycat License", true, false ], "SMAIL-GPL": [ "SMAIL General Public License", false, false ], "SMLNJ": [ "Standard ML of New Jersey License", false, false ], "SMPPL": [ "Secure Messaging Protocol Public License", false, false ], "SNIA": [ "SNIA Public License 1.1", false, false ], "snprintf": [ "snprintf License", false, false ], "SOFA": [ "SOFA Software License", false, false ], "softSurfer": [ "softSurfer License", false, false ], "Soundex": [ "Soundex License", false, false ], "Spencer-86": [ "Spencer License 86", false, false ], "Spencer-94": [ "Spencer License 94", false, false ], "Spencer-99": [ "Spencer License 99", false, false ], "SPL-1.0": [ "Sun Public License v1.0", true, false ], "ssh-keyscan": [ "ssh-keyscan License", false, false ], "SSH-OpenSSH": [ "SSH OpenSSH license", false, false ], "SSH-short": [ "SSH short notice", false, false ], "SSLeay-standalone": [ "SSLeay License - standalone", false, false ], "SSPL-1.0": [ "Server Side Public License, v 1", false, false ], "StandardML-NJ": [ "Standard ML of New Jersey License", false, true ], "SugarCRM-1.1.3": [ "SugarCRM Public License v1.1.3", false, false ], "Sun-PPP": [ "Sun PPP License", false, false ], "Sun-PPP-2000": [ "Sun PPP License (2000)", false, false ], "SunPro": [ "SunPro License", false, false ], "SWL": [ "Scheme Widget Library (SWL) Software License Agreement", false, false ], "swrule": [ "swrule License", false, false ], "Symlinks": [ "Symlinks License", false, false ], "TAPR-OHL-1.0": [ "TAPR Open Hardware License v1.0", false, false ], "TCL": [ "TCL/TK License", false, false ], "TCP-wrappers": [ "TCP Wrappers License", false, false ], "TermReadKey": [ "TermReadKey License", false, false ], "TGPPL-1.0": [ "Transitive Grace Period Public Licence 1.0", false, false ], "ThirdEye": [ "ThirdEye License", false, false ], "threeparttable": [ "threeparttable License", false, false ], "TMate": [ "TMate Open Source License", false, false ], "TORQUE-1.1": [ "TORQUE v2.5+ Software License v1.1", false, false ], "TOSL": [ "Trusster Open Source License", false, false ], "TPDL": [ "Time::ParseDate License", false, false ], "TPL-1.0": [ "THOR Public License 1.0", false, false ], "TrustedQSL": [ "TrustedQSL License", false, false ], "TTWL": [ "Text-Tabs+Wrap License", false, false ], "TTYP0": [ "TTYP0 License", false, false ], "TU-Berlin-1.0": [ "Technische Universitaet Berlin License 1.0", false, false ], "TU-Berlin-2.0": [ "Technische Universitaet Berlin License 2.0", false, false ], "Ubuntu-font-1.0": [ "Ubuntu Font Licence v1.0", false, false ], "UCAR": [ "UCAR License", false, false ], "UCL-1.0": [ "Upstream Compatibility License v1.0", true, false ], "ulem": [ "ulem License", false, false ], "UMich-Merit": [ "Michigan/Merit Networks License", false, false ], "Unicode-3.0": [ "Unicode License v3", true, false ], "Unicode-DFS-2015": [ "Unicode License Agreement - Data Files and Software (2015)", false, false ], "Unicode-DFS-2016": [ "Unicode License Agreement - Data Files and Software (2016)", true, false ], "Unicode-TOU": [ "Unicode Terms of Use", false, false ], "UnixCrypt": [ "UnixCrypt License", false, false ], "Unlicense": [ "The Unlicense", true, false ], "Unlicense-libtelnet": [ "Unlicense - libtelnet variant", false, false ], "Unlicense-libwhirlpool": [ "Unlicense - libwhirlpool variant", false, false ], "UPL-1.0": [ "Universal Permissive License v1.0", true, false ], "URT-RLE": [ "Utah Raster Toolkit Run Length Encoded License", false, false ], "Vim": [ "Vim License", false, false ], "VOSTROM": [ "VOSTROM Public License for Open Source", false, false ], "VSL-1.0": [ "Vovida Software License v1.0", true, false ], "W3C": [ "W3C Software Notice and License (2002-12-31)", true, false ], "W3C-19980720": [ "W3C Software Notice and License (1998-07-20)", false, false ], "W3C-20150513": [ "W3C Software Notice and Document License (2015-05-13)", true, false ], "w3m": [ "w3m License", false, false ], "Watcom-1.0": [ "Sybase Open Watcom Public License 1.0", true, false ], "Widget-Workshop": [ "Widget Workshop License", false, false ], "Wsuipa": [ "Wsuipa License", false, false ], "WTFPL": [ "Do What The F*ck You Want To Public License", false, false ], "wwl": [ "WWL License", false, false ], "wxWindows": [ "wxWindows Library License", true, true ], "X11": [ "X11 License", false, false ], "X11-distribute-modifications-variant": [ "X11 License Distribution Modification Variant", false, false ], "X11-swapped": [ "X11 swapped final paragraphs", false, false ], "Xdebug-1.03": [ "Xdebug License v 1.03", false, false ], "Xerox": [ "Xerox License", false, false ], "Xfig": [ "Xfig License", false, false ], "XFree86-1.1": [ "XFree86 License 1.1", false, false ], "xinetd": [ "xinetd License", false, false ], "xkeyboard-config-Zinoviev": [ "xkeyboard-config Zinoviev License", false, false ], "xlock": [ "xlock License", false, false ], "Xnet": [ "X.Net License", true, false ], "xpp": [ "XPP License", false, false ], "XSkat": [ "XSkat License", false, false ], "xzoom": [ "xzoom License", false, false ], "YPL-1.0": [ "Yahoo! Public License v1.0", false, false ], "YPL-1.1": [ "Yahoo! Public License v1.1", false, false ], "Zed": [ "Zed License", false, false ], "Zeeff": [ "Zeeff License", false, false ], "Zend-2.0": [ "Zend License v2.0", false, false ], "Zimbra-1.3": [ "Zimbra Public License v1.3", false, false ], "Zimbra-1.4": [ "Zimbra Public License v1.4", false, false ], "Zlib": [ "zlib License", true, false ], "zlib-acknowledgement": [ "zlib/libpng License with Acknowledgement", false, false ], "ZPL-1.1": [ "Zope Public License 1.1", false, false ], "ZPL-2.0": [ "Zope Public License 2.0", true, false ], "ZPL-2.1": [ "Zope Public License 2.1", true, false ] }Copyright (C) 2015 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. composer/spdx-licenses ====================== SPDX (Software Package Data Exchange) licenses list and validation library. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. [![Continuous Integration](https://github.com/composer/spdx-licenses/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/spdx-licenses/actions) Installation ------------ Install the latest version with: ```bash $ composer require composer/spdx-licenses ``` Basic Usage ----------- ```php getLicenseByIdentifier('MIT'); // get a license exception by identifier $licenses->getExceptionByIdentifier('Autoconf-exception-3.0'); // get a license identifier by name $licenses->getIdentifierByName('MIT License'); // check if a license is OSI approved by identifier $licenses->isOsiApprovedByIdentifier('MIT'); // check if a license identifier is deprecated $licenses->isDeprecatedByIdentifier('MIT'); // check if input is a valid SPDX license expression $licenses->validate($input); ``` > Read the [specifications](https://spdx.org/specifications) > to find out more about valid license expressions. Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. License ------- composer/spdx-licenses is licensed under the MIT License, see the LICENSE file for details. Source ------ License information is curated by [SPDX](https://spdx.org/). The data is pulled from the [License List Data](https://github.com/spdx/license-list-data) repository. * [Licenses](https://spdx.org/licenses/index.html) * [License Exceptions](https://spdx.org/licenses/exceptions-index.html) { "name": "composer\/spdx-licenses", "description": "SPDX licenses list and validation library.", "type": "library", "license": "MIT", "keywords": [ "spdx", "license", "validator" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http:\/\/www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http:\/\/seld.be" }, { "name": "Rob Bast", "email": "rob.bast@gmail.com", "homepage": "http:\/\/robbast.nl" } ], "support": { "irc": "ircs:\/\/irc.libera.chat:6697\/composer", "issues": "https:\/\/github.com\/composer\/spdx-licenses\/issues" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "symfony\/phpunit-bridge": "^3 || ^7", "phpstan\/phpstan": "^1.11" }, "autoload": { "psr-4": { "Composer\\Spdx\\": "src" } }, "autoload-dev": { "psr-4": { "Composer\\Spdx\\": "tests" } }, "extra": { "branch-alias": { "dev-main": "1.x-dev" } }, "scripts": { "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor\/bin\/simple-phpunit", "phpstan": "vendor\/bin\/phpstan analyse", "sync-licenses": "bin\/update-spdx-licenses" } } * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Spdx; class SpdxLicenses { /** @var string */ const LICENSES_FILE = 'spdx-licenses.json'; /** @var string */ const EXCEPTIONS_FILE = 'spdx-exceptions.json'; /** * Contains all the licenses. * * The array is indexed by license identifiers, which contain * a numerically indexed array with license details. * * [ lowercased license identifier => * [ 0 => identifier (string), 1 => full name (string), 2 => osi certified (bool), 3 => deprecated (bool) ] * , ... * ] * * @var array */ private $licenses; /** * @var string */ private $licensesExpression; /** * Contains all the license exceptions. * * The array is indexed by license exception identifiers, which contain * a numerically indexed array with license exception details. * * [ lowercased exception identifier => * [ 0 => exception identifier (string), 1 => full name (string) ] * , ... * ] * * @var array */ private $exceptions; /** * @var string */ private $exceptionsExpression; public function __construct() { $this->loadLicenses(); $this->loadExceptions(); } /** * Returns license metadata by license identifier. * * This function adds a link to the full license text to the license metadata. * The array returned is in the form of: * * [ 0 => full name (string), 1 => osi certified, 2 => link to license text (string), 3 => deprecation status (bool) ] * * @param string $identifier * * @return array{0: string, 1: bool, 2: string, 3: bool}|null */ public function getLicenseByIdentifier($identifier) { $key = \strtolower($identifier); if (!isset($this->licenses[$key])) { return null; } list($identifier, $name, $isOsiApproved, $isDeprecatedLicenseId) = $this->licenses[$key]; return array($name, $isOsiApproved, 'https://spdx.org/licenses/' . $identifier . '.html#licenseText', $isDeprecatedLicenseId); } /** * Returns all licenses information, keyed by the lowercased license identifier. * * @return array{0: string, 1: string, 2: bool, 3: bool}[] Each item is [ 0 => identifier (string), 1 => full name (string), 2 => osi certified (bool), 3 => deprecated (bool) ] */ public function getLicenses() { return $this->licenses; } /** * Returns license exception metadata by license exception identifier. * * This function adds a link to the full license exception text to the license exception metadata. * The array returned is in the form of: * * [ 0 => full name (string), 1 => link to license text (string) ] * * @param string $identifier * * @return array{0: string, 1: string}|null */ public function getExceptionByIdentifier($identifier) { $key = \strtolower($identifier); if (!isset($this->exceptions[$key])) { return null; } list($identifier, $name) = $this->exceptions[$key]; return array($name, 'https://spdx.org/licenses/' . $identifier . '.html#licenseExceptionText'); } /** * Returns the short identifier of a license (or license exception) by full name. * * @param string $name * * @return string|null */ public function getIdentifierByName($name) { foreach ($this->licenses as $licenseData) { if ($licenseData[1] === $name) { return $licenseData[0]; } } foreach ($this->exceptions as $licenseData) { if ($licenseData[1] === $name) { return $licenseData[0]; } } return null; } /** * Returns the OSI Approved status for a license by identifier. * * @param string $identifier * * @return bool */ public function isOsiApprovedByIdentifier($identifier) { return $this->licenses[\strtolower($identifier)][2]; } /** * Returns the deprecation status for a license by identifier. * * @param string $identifier * * @return bool */ public function isDeprecatedByIdentifier($identifier) { return $this->licenses[\strtolower($identifier)][3]; } /** * @param string[]|string $license * * @throws \InvalidArgumentException * * @return bool */ public function validate($license) { if (\is_array($license)) { $count = \count($license); if ($count !== \count(\array_filter($license, 'is_string'))) { throw new \InvalidArgumentException('Array of strings expected.'); } $license = $count > 1 ? '(' . \implode(' OR ', $license) . ')' : (string) \reset($license); } if (!\is_string($license)) { throw new \InvalidArgumentException(\sprintf('Array or String expected, %s given.', \gettype($license))); } return $this->isValidLicenseString($license); } /** * @return string */ public static function getResourcesDir() { return \dirname(__DIR__) . '/res'; } /** * @return void */ private function loadLicenses() { if (null !== $this->licenses) { return; } $json = \file_get_contents(self::getResourcesDir() . '/' . self::LICENSES_FILE); if (\false === $json) { throw new \RuntimeException('Missing license file in ' . self::getResourcesDir() . '/' . self::LICENSES_FILE); } $this->licenses = array(); foreach (\json_decode($json, \true) as $identifier => $license) { $this->licenses[\strtolower($identifier)] = array($identifier, $license[0], $license[1], $license[2]); } } /** * @return void */ private function loadExceptions() { if (null !== $this->exceptions) { return; } $json = \file_get_contents(self::getResourcesDir() . '/' . self::EXCEPTIONS_FILE); if (\false === $json) { throw new \RuntimeException('Missing exceptions file in ' . self::getResourcesDir() . '/' . self::EXCEPTIONS_FILE); } $this->exceptions = array(); foreach (\json_decode($json, \true) as $identifier => $exception) { $this->exceptions[\strtolower($identifier)] = array($identifier, $exception[0]); } } /** * @return string */ private function getLicensesExpression() { if (null === $this->licensesExpression) { $licenses = \array_map('preg_quote', \array_keys($this->licenses)); \rsort($licenses); $licenses = \implode('|', $licenses); $this->licensesExpression = $licenses; } return $this->licensesExpression; } /** * @return string */ private function getExceptionsExpression() { if (null === $this->exceptionsExpression) { $exceptions = \array_map('preg_quote', \array_keys($this->exceptions)); \rsort($exceptions); $exceptions = \implode('|', $exceptions); $this->exceptionsExpression = $exceptions; } return $this->exceptionsExpression; } /** * @param string $license * * @throws \RuntimeException * * @return bool */ private function isValidLicenseString($license) { if (isset($this->licenses[\strtolower($license)])) { return \true; } $licenses = $this->getLicensesExpression(); $exceptions = $this->getExceptionsExpression(); $regex = <<[\\pL\\pN.-]{1,}) # license-id: taken from list (?{$licenses}) # license-exception-id: taken from list (?{$exceptions}) # license-ref: [DocumentRef-1*(idstring):]LicenseRef-1*(idstring) (?(?:DocumentRef-(?&idstring):)?LicenseRef-(?&idstring)) # simple-expresssion: license-id / license-id+ / license-ref (?(?&licenseid)\\+? | (?&licenseid) | (?&licenseref)) # compound-expression: 1*( # simple-expression / # simple-expression WITH license-exception-id / # compound-expression AND compound-expression / # compound-expression OR compound-expression # ) / ( compound-expression ) ) (? (?&simple_expression) ( \\s+ WITH \\s+ (?&licenseexceptionid))? | \\( \\s* (?&compound_expression) \\s* \\) ) (? (?&compound_head) (?: \\s+ (?:AND|OR) \\s+ (?&compound_expression))? ) # license-expression: 1*1(simple-expression / compound-expression) (?(?&compound_expression) | (?&simple_expression)) ) # end of define ^(NONE | NOASSERTION | (?&license_expression))\$ }xi REGEX; $match = \preg_match($regex, $license); if (0 === $match) { return \false; } if (\false === $match) { throw new \RuntimeException('Regex failed to compile/run.'); } return \true; } } The MIT License (MIT) Copyright (c) 2015 phpDocumentor Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) [![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) [![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) [![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) [![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) [![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) ReflectionCommon ================ { "name": "phpdocumentor\/reflection-common", "keywords": [ "phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN" ], "homepage": "http:\/\/www.phpdoc.org", "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "license": "MIT", "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "require": { "php": "^7.2 || ^8.0" }, "autoload": { "psr-4": { "_ContaoManager\\phpDocumentor\\Reflection\\": "src\/" } }, "require-dev": {}, "extra": { "branch-alias": { "dev-2.x": "2.x-dev" } } }fqsen = $fqsen; if (isset($matches[2])) { $this->name = $matches[2]; } else { $matches = explode('\\', $fqsen); $name = end($matches); assert(is_string($name)); $this->name = trim($name, '()'); } } /** * converts this class to string. */ public function __toString() : string { return $this->fqsen; } /** * Returns the name of the element without path. */ public function getName() : string { return $this->name; } } lineNumber = $lineNumber; $this->columnNumber = $columnNumber; } /** * Returns the line number that is covered by this location. */ public function getLineNumber() : int { return $this->lineNumber; } /** * Returns the column number (character position on a line) for this location object. */ public function getColumnNumber() : int { return $this->columnNumber; } } The MIT License (MIT) Copyright (c) 2010 Mike van Riel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Type Resolver build/docs latest src/ api php template template-extends template-implements extends implements phpDocumentor docs guides